[linbox] 03/05: Imported Upstream version 1.4.1
Doug Torrance
dtorrance-guest at moszumanska.debian.org
Tue Jul 19 19:14:13 UTC 2016
This is an automated email from the git hooks/post-receive script.
dtorrance-guest pushed a commit to branch master
in repository linbox.
commit 2937572400565a72833a796852ebabf0471000c7
Author: Doug Torrance <dtorrance at piedmont.edu>
Date: Mon Jul 18 10:06:41 2016 -0400
Imported Upstream version 1.4.1
---
.gitignore | 82 +
AUTHORS | 1 +
CHANGED-INTERFACES | 75 +
ChangeLog | 22 +-
HACKING | 4 +
INSTALL | 370 -
Makefile.am | 36 +-
Makefile.in | 983 -
NEWS | 6 +-
README | 12 +-
RELEASE-INSTRUCTIONS | 28 +
TODO | 60 +-
aclocal.m4 | 998 -
auto-install.sh | 34 +-
autogen.sh | 200 +
benchmarks/BenchmarkFile.h | 107 +
benchmarks/BenchmarkFile.inl | 198 +
benchmarks/CSValue.h | 153 +
benchmarks/Makefile.am | 84 +-
benchmarks/Makefile.in | 650 -
benchmarks/README | 95 +
benchmarks/benchmark-crafixed.C | 384 -
benchmarks/benchmark-example.C | 368 +
benchmarks/benchmark-fgemm.C | 955 -
benchmarks/benchmark-ftrXm.C | 823 -
benchmarks/benchmark-metadata.C | 43 +
benchmarks/benchmark-metadata.h | 520 +
benchmarks/benchmark-order-basis.C | 395 +
benchmarks/benchmark-utils.C | 354 +
benchmarks/benchmark-utils.h | 307 +
benchmarks/benchmark.C | 1597 +
benchmarks/benchmark.doxy | 2 +-
benchmarks/benchmark.h | 1338 +-
benchmarks/benchmark.inl | 182 +
benchmarks/block-coppersmith-benchmark.C | 93 +
benchmarks/data/Makefile.am | 24 +
benchmarks/gen-blocks.C | 184 +
benchmarks/invariant-factors-benchmark.C | 183 +
benchmarks/matrix/Makefile.am | 22 +
benchmarks/matrix/bibd_12_5_66x792.sms | 7922 ++
benchmarks/matrix/bibd_12_5_66x792.sms.gz | Bin 0 -> 19387 bytes
benchmarks/matrix/bibd_13_6_78x1716.sms | 25742 +++++
benchmarks/matrix/bibd_13_6_78x1716.sms.gz | Bin 0 -> 64275 bytes
benchmarks/matrix/bibd_14_7_91x3432.sms | 72074 ++++++++++++
benchmarks/matrix/bibd_14_7_91x3432.sms.gz | Bin 0 -> 176023 bytes
benchmarks/omp-benchmark.C | 320 +
benchmarks/optimizer.h | 85 +
benchmarks/perfpublisher.sh | 169 +
build-aux/config.guess | 1545 -
build-aux/config.sub | 1791 -
build-aux/install-sh | 527 -
build-aux/ltmain.sh | 9655 --
build-aux/missing | 331 -
config.h.in | 173 -
configure | 21334 ----
configure.ac | 261 +-
doc/Makefile.am | 4 +-
doc/Makefile.in | 611 -
doc/install-1.0.html | 164 +
doc/install-dev.html | 6 +-
doc/mainpage.doxy | 18 +-
doc/organization/Linbox.draft | 60 +
doc/organization/Makefile.am | 24 +
doc/tex/Makefile.am | 38 +
doc/tutorial.doxy | 22 +-
doc/tutorial.html | 207 -
doc/versionning.doxy | 141 +
examples/Makefile.am | 61 +-
examples/Makefile.in | 948 -
examples/Readme | 1 +
examples/athadet.C | 107 +
examples/bench-fft.C | 249 +
examples/bench-matpoly-mult.C | 495 +
examples/bigmat.C | 68 +
examples/blackbox/Makefile.am | 44 +
examples/blackbox/ex-mat0.C | 91 +
examples/blackbox/example.C | 166 +
examples/blackbox/load-det.C | 98 +
examples/blackbox/load-minpoly.C | 117 +
examples/blackbox/load-symmetrize.C | 103 +
examples/blackbox/mat.txt | 9 +
examples/blackbox/mat2.txt | 6 +
examples/blackbox/random-rank.C | 108 +
examples/blackbox/smith.C | 576 +
examples/charpoly.C | 61 +-
examples/checksolve.C | 22 +-
examples/data/Makefile.am | 23 +
examples/data/mat.txt | 8 +
examples/data/mat2.txt | 6 +
examples/data/test.matrix | 28 +
examples/data/wikivote | 103691 ++++++++++++++++++
examples/det.C | 19 +-
examples/dot-product.C | 20 +-
examples/doubledet.C | 22 +-
examples/echelon.C | 29 +-
examples/fields/Makefile.am | 6 +-
examples/fields/Makefile.in | 584 -
examples/fields/ex-fields-archetype.C | 4 +-
examples/fields/ex-fields.C | 6 +-
examples/fields/modular-int.C | 6 +-
examples/find-invariant-factors.C | 79 +
examples/gf3-invariant-factors.C | 122 +
examples/graph-charpoly.C | 26 +-
examples/grid_reduce.C | 451 +
examples/iliopoulos2.C | 137 +
examples/integer-mul.C | 71 +
examples/invariant-factors.C | 137 +
examples/makefile.mpi | 66 +
examples/map-sparse-test.C | 55 +
examples/map-sparse.h | 200 +
examples/map-sparse.inl | 594 +
examples/minpoly.C | 30 +-
examples/mpidet.C | 101 +
examples/nullspacebasis.C | 68 +
examples/nullspacebasis_rank.C | 91 +
examples/omp_block_rank.C | 574 +
examples/omp_smithvalence.C | 236 +
examples/poly-smith.C | 141 +
examples/power_rank.C | 117 +
examples/poweroftwo_ranks.C | 110 +
examples/qchar.C | 548 +
examples/rank.C | 91 +-
examples/rr.C | 99 +
examples/samplebb.C | 277 +
examples/smith.C | 149 +-
examples/smithvalence.C | 31 +-
examples/smithvalence.h | 202 +-
examples/solve.C | 137 +-
examples/solver/Makefile.am | 38 +
examples/solver/t-rdisolve.C | 529 +
examples/sparseelimdet.C | 49 +-
examples/sparseelimrank.C | 48 +-
examples/test.sh | 32 +
examples/valence.C | 26 +-
incremente-versions | 115 +
interfaces/Makefile.in | 665 -
interfaces/driver/Makefile.am | 6 +-
interfaces/driver/Makefile.in | 730 -
interfaces/driver/compile-readme.txt | 4 +
interfaces/driver/lb-blackbox-data.h | 5 +-
interfaces/driver/lb-blackbox-functor.h | 2 +-
interfaces/driver/lb-blackbox-type.h | 2 +-
interfaces/driver/lb-blackbox.C | 2 +-
interfaces/driver/lb-charpoly.C | 8 +-
interfaces/driver/lb-det.C | 2 +-
interfaces/driver/lb-domain-data.h | 2 +-
interfaces/driver/lb-domain-functor.h | 2 +-
interfaces/driver/lb-domain-type.h | 46 +-
interfaces/driver/lb-solve.C | 234 +
interfaces/driver/lb-vector-data.h | 4 +-
interfaces/driver/lb-vector-functor.h | 2 +-
interfaces/driver/lb-vector.C | 2 +-
interfaces/kaapi/Makefile.in | 574 -
interfaces/kaapi/communicate.h | 10 +-
interfaces/maple-old/Makefile.am | 37 +
interfaces/maple-old/Makefile.in.1 | 232 +
interfaces/maple-old/Makefile.in.2 | 372 +
interfaces/maple-old/README | 75 +
interfaces/maple-old/demonstration.mws | 291 +
interfaces/maple-old/lbffpack.mpl | 165 +
interfaces/maple-old/lbmaple-ffpack.C | 444 +
interfaces/maple-old/lbmaple.C | 1441 +
interfaces/maple-old/lbmaple.mpl.head | 11 +
interfaces/maple-old/lbmaple.mpl.tail | 377 +
interfaces/maple/Makefile.am | 4 +-
interfaces/maple/Makefile.in | 665 -
interfaces/maple/lb-maple-path.pl | 4 +
interfaces/maple/lb-maple-path.sh | 7 +
interfaces/maple/lb-maple-utilities.h | 2 +-
interfaces/maple/lb-maple.mpl.bak | 320 +
interfaces/maple/linbox-demonstration-good.mw | 2248 +
interfaces/maple/linbox-demonstration.mw | 2248 +
interfaces/sage/Makefile.am | 11 +-
interfaces/sage/Makefile.in | 657 -
interfaces/sage/linbox-sage.C | 136 +-
interfaces/sage/linbox-sage.h | 4 +-
linbox-config.in | 15 +-
linbox.pc.in | 14 +
linbox/Makefile.am | 44 +-
linbox/Makefile.in | 825 -
linbox/algorithms/Makefile.am | 249 +-
linbox/algorithms/Makefile.in | 880 -
linbox/algorithms/alt-blackbox-block-container.h | 104 +
linbox/algorithms/bbcharpoly.h | 148 +-
linbox/algorithms/bbsolve.h | 14 +-
linbox/algorithms/blackbox-block-container-base.h | 91 +-
linbox/algorithms/blackbox-block-container.h | 24 +-
linbox/algorithms/blackbox-container-base.h | 37 +-
linbox/algorithms/blackbox-container-symmetric.h | 2 +-
linbox/algorithms/blackbox-container.h | 25 +-
linbox/algorithms/blas-domain-multimod.h | 94 -
linbox/algorithms/blas-domain.h | 827 -
linbox/algorithms/blas-domain.inl | 1507 -
linbox/algorithms/block-coppersmith-domain.h | 875 +
linbox/algorithms/block-lanczos.h | 10 +-
linbox/algorithms/block-lanczos.inl | 68 +-
linbox/algorithms/block-massey-domain.h | 425 +-
linbox/algorithms/block-wiedemann.h | 107 +-
linbox/algorithms/bm-seq.h | 716 -
linbox/algorithms/charpoly-rational.h | 76 +-
linbox/algorithms/cia.h | 41 +-
.../algorithms/classic-rational-reconstruction.h | 13 +-
linbox/algorithms/coppersmith-invariant-factors.h | 193 +
linbox/algorithms/coppersmith.h | 479 +
linbox/algorithms/cra-domain-omp.h | 12 +-
linbox/algorithms/cra-domain-seq.h | 55 +-
linbox/algorithms/cra-domain.h | 9 +-
linbox/algorithms/cra-early-multip.h | 81 +-
linbox/algorithms/cra-early-single.h | 8 +-
linbox/algorithms/cra-full-multip-fixed.h | 16 +-
linbox/algorithms/cra-full-multip.h | 311 +-
linbox/algorithms/cra-givrnsfixed.h | 68 +-
linbox/algorithms/cra-mpi.h | 4 +-
linbox/algorithms/cra.doxy | 2 +-
linbox/algorithms/dense-container.h | 16 +-
linbox/algorithms/dense-nullspace.h | 72 +-
linbox/algorithms/dense-nullspace.inl | 760 +-
linbox/algorithms/density.h | 85 +
linbox/algorithms/det-rational.h | 43 +-
linbox/algorithms/diophantine-solver.C | 4 +-
linbox/algorithms/diophantine-solver.h | 11 +-
linbox/algorithms/diophantine-solver.inl | 7 +-
linbox/algorithms/double-det.h | 34 +-
linbox/algorithms/dyadic-to-rational.h | 51 +-
linbox/algorithms/echelon-form.h | 45 +-
linbox/algorithms/eliminator.h | 7 +-
linbox/algorithms/eliminator.inl | 46 +-
linbox/algorithms/fast-rational-reconstruction.h | 65 +-
linbox/algorithms/gauss.h | 53 +-
linbox/algorithms/gauss/Makefile.in | 585 -
linbox/algorithms/gauss/gauss-elim-gf2.inl | 65 +-
linbox/algorithms/gauss/gauss-elim.inl | 203 +-
linbox/algorithms/gauss/gauss-gf2.inl | 107 +-
linbox/algorithms/gauss/gauss-nullspace.inl | 34 +-
linbox/algorithms/gauss/gauss-pivot-gf2.inl | 32 +-
linbox/algorithms/gauss/gauss-pivot.inl | 49 +-
linbox/algorithms/gauss/gauss-solve-gf2.inl | 23 +-
linbox/algorithms/gauss/gauss-solve.inl | 34 +-
linbox/algorithms/gauss/gauss.inl | 1410 +-
linbox/algorithms/hybrid-det.h | 172 +-
linbox/algorithms/iml.doxy | 29 +
linbox/algorithms/invariant-factors.h | 271 +
linbox/algorithms/la-block-lanczos.h | 27 +-
linbox/algorithms/la-block-lanczos.inl | 52 +-
linbox/algorithms/lanczos.h | 7 +-
linbox/algorithms/lanczos.inl | 46 +-
linbox/algorithms/last-invariant-factor.h | 94 +-
linbox/algorithms/lattice.doxy | 2 +-
linbox/algorithms/lattice.h | 15 +-
linbox/algorithms/lattice.inl | 13 +-
linbox/algorithms/lifting-container.h | 347 +-
linbox/algorithms/linbox-tags.h | 95 -
linbox/algorithms/massey-domain.h | 148 +-
linbox/algorithms/matpoly-mult.h | 508 +-
linbox/algorithms/matrix-blas3/Makefile.am | 4 +-
linbox/algorithms/matrix-blas3/Makefile.in | 579 -
linbox/algorithms/matrix-blas3/blas3.doxy | 2 +-
linbox/algorithms/matrix-blas3/mul-cra.inl | 191 +
linbox/algorithms/matrix-blas3/mul-flint.inl | 116 +
linbox/algorithms/matrix-blas3/mul-naive.inl | 49 +-
linbox/algorithms/matrix-blas3/mul-toomcook.inl | 509 +-
linbox/algorithms/matrix-blas3/mul.h | 68 +-
linbox/algorithms/matrix-hom.h | 322 +-
linbox/algorithms/matrix-inverse.h | 13 +-
linbox/algorithms/matrix-rank.h | 15 +-
linbox/algorithms/mg-block-lanczos.h | 28 +-
linbox/algorithms/mg-block-lanczos.inl | 148 +-
linbox/algorithms/minpoly-integer.h | 47 +-
linbox/algorithms/minpoly-rational.h | 81 +-
linbox/algorithms/one-invariant-factor.h | 6 +-
linbox/algorithms/opencl-environ.h | 375 +
linbox/algorithms/opencl-kernels/Makefile.am | 34 +
linbox/algorithms/opencl-kernels/file-list.txt | 40 +
.../kernel-axmy-modulus-dp-unroll.cl | 95 +
.../opencl-kernels/kernel-axmy-modulus-dp.cl | 68 +
.../kernel-axmy-modulus-sp-unroll.cl | 94 +
.../opencl-kernels/kernel-axmy-modulus-sp.cl | 67 +
.../kernel-axmy-partial-1024-dp-unroll.cl | 93 +
.../opencl-kernels/kernel-axmy-partial-1024-dp.cl | 79 +
.../kernel-axmy-partial-1024-sp-unroll.cl | 92 +
.../opencl-kernels/kernel-axmy-partial-1024-sp.cl | 78 +
.../kernel-axmy-partial-16-sp-unroll.cl | 79 +
.../opencl-kernels/kernel-axmy-partial-16-sp.cl | 66 +
.../kernel-axmy-partial-32-dp-unroll.cl | 93 +
.../opencl-kernels/kernel-axmy-partial-32-dp.cl | 79 +
.../kernel-axmy-partial-32-sp-unroll.cl | 92 +
.../opencl-kernels/kernel-axmy-partial-32-sp.cl | 78 +
.../kernel-axmy-partial-8-dp-unroll.cl | 82 +
.../opencl-kernels/kernel-axmy-partial-8-dp.cl | 71 +
.../kernel-axpy-modulus-dp-unroll.cl | 95 +
.../opencl-kernels/kernel-axpy-modulus-dp.cl | 68 +
.../kernel-axpy-modulus-sp-unroll.cl | 94 +
.../opencl-kernels/kernel-axpy-modulus-sp.cl | 67 +
.../kernel-axpy-partial-1024-dp-unroll.cl | 93 +
.../opencl-kernels/kernel-axpy-partial-1024-dp.cl | 79 +
.../kernel-axpy-partial-1024-sp-unroll.cl | 92 +
.../opencl-kernels/kernel-axpy-partial-1024-sp.cl | 78 +
.../kernel-axpy-partial-16-sp-unroll.cl | 79 +
.../opencl-kernels/kernel-axpy-partial-16-sp.cl | 66 +
.../kernel-axpy-partial-32-dp-unroll.cl | 93 +
.../opencl-kernels/kernel-axpy-partial-32-dp.cl | 79 +
.../kernel-axpy-partial-32-sp-unroll.cl | 92 +
.../opencl-kernels/kernel-axpy-partial-32-sp.cl | 78 +
.../kernel-axpy-partial-8-dp-unroll.cl | 82 +
.../opencl-kernels/kernel-axpy-partial-8-dp.cl | 71 +
.../kernel-maxpy-modulus-dp-unroll.cl | 95 +
.../opencl-kernels/kernel-maxpy-modulus-dp.cl | 68 +
.../kernel-maxpy-modulus-sp-unroll.cl | 94 +
.../opencl-kernels/kernel-maxpy-modulus-sp.cl | 67 +
.../kernel-maxpy-partial-1024-dp-unroll.cl | 93 +
.../opencl-kernels/kernel-maxpy-partial-1024-dp.cl | 79 +
.../kernel-maxpy-partial-1024-sp-unroll.cl | 92 +
.../opencl-kernels/kernel-maxpy-partial-1024-sp.cl | 78 +
.../kernel-maxpy-partial-16-sp-unroll.cl | 79 +
.../opencl-kernels/kernel-maxpy-partial-16-sp.cl | 66 +
.../kernel-maxpy-partial-32-dp-unroll.cl | 93 +
.../opencl-kernels/kernel-maxpy-partial-32-dp.cl | 79 +
.../kernel-maxpy-partial-32-sp-unroll.cl | 92 +
.../opencl-kernels/kernel-maxpy-partial-32-sp.cl | 78 +
.../kernel-maxpy-partial-8-dp-unroll.cl | 82 +
.../opencl-kernels/kernel-maxpy-partial-8-dp.cl | 71 +
.../opencl-kernels/kernel-modulus-dp-unroll.cl | 89 +
.../algorithms/opencl-kernels/kernel-modulus-dp.cl | 62 +
.../opencl-kernels/kernel-modulus-sp-unroll.cl | 88 +
.../algorithms/opencl-kernels/kernel-modulus-sp.cl | 61 +
.../kernel-muladd-modulus-dp-unroll.cl | 109 +
.../opencl-kernels/kernel-muladd-modulus-dp.cl | 82 +
.../kernel-muladd-modulus-sp-unroll.cl | 108 +
.../opencl-kernels/kernel-muladd-modulus-sp.cl | 81 +
.../kernel-muladd-partial-1024-dp-unroll.cl | 107 +
.../kernel-muladd-partial-1024-dp.cl | 93 +
.../kernel-muladd-partial-1024-sp-unroll.cl | 106 +
.../kernel-muladd-partial-1024-sp.cl | 92 +
.../kernel-muladd-partial-16-sp-unroll.cl | 96 +
.../opencl-kernels/kernel-muladd-partial-16-sp.cl | 83 +
.../kernel-muladd-partial-32-dp-unroll.cl | 107 +
.../opencl-kernels/kernel-muladd-partial-32-dp.cl | 93 +
.../kernel-muladd-partial-32-sp-unroll.cl | 106 +
.../opencl-kernels/kernel-muladd-partial-32-sp.cl | 92 +
.../kernel-muladd-partial-8-dp-unroll.cl | 96 +
.../opencl-kernels/kernel-muladd-partial-8-dp.cl | 86 +
linbox/algorithms/opencl-kernels/kernel-parser.py | 177 +
.../kernel-partial-1024-dp-unroll.cl | 87 +
.../opencl-kernels/kernel-partial-1024-dp.cl | 73 +
.../kernel-partial-1024-sp-unroll.cl | 86 +
.../opencl-kernels/kernel-partial-1024-sp.cl | 72 +
.../opencl-kernels/kernel-partial-16-sp-unroll.cl | 74 +
.../opencl-kernels/kernel-partial-16-sp.cl | 61 +
.../opencl-kernels/kernel-partial-32-dp-unroll.cl | 87 +
.../opencl-kernels/kernel-partial-32-dp.cl | 73 +
.../opencl-kernels/kernel-partial-32-sp-unroll.cl | 86 +
.../opencl-kernels/kernel-partial-32-sp.cl | 72 +
.../opencl-kernels/kernel-partial-8-dp-unroll.cl | 77 +
.../opencl-kernels/kernel-partial-8-dp.cl | 67 +
.../opencl-kernels/opencl-domain-kernels.inl | 2276 +
linbox/algorithms/opencl-resource-controller.h | 533 +
linbox/algorithms/poly-det.h | 195 +
linbox/algorithms/poly-interpolation.h | 174 +
linbox/algorithms/polynomial-matrix/Makefile.am | 39 +
.../polynomial-matrix/matpoly-add-domain.h | 91 +
.../matpoly-mult-fft-multiprecision.inl | 668 +
.../matpoly-mult-fft-wordsize-fast.inl | 314 +
.../matpoly-mult-fft-wordsize-three-primes.inl | 291 +
.../matpoly-mult-fft-wordsize.inl | 127 +
.../polynomial-matrix/matpoly-mult-fft.h | 120 +
.../polynomial-matrix/matpoly-mult-kara.h | 364 +
.../polynomial-matrix/matpoly-mult-naive.h | 143 +
linbox/algorithms/polynomial-matrix/order-basis.h | 641 +
.../polynomial-fft-transform-simd.inl | 817 +
.../polynomial-matrix/polynomial-fft-transform.h | 331 +
.../polynomial-matrix/polynomial-fft-transform.inl | 238 +
.../polynomial-matrix/polynomial-matrix-domain.h | 218 +
linbox/algorithms/polynomial-matrix/simd.h | 273 +
linbox/algorithms/rational-cra-early-multip.h | 77 +-
linbox/algorithms/rational-cra-early-single.h | 9 +-
linbox/algorithms/rational-cra-full-multip.h | 73 +-
linbox/algorithms/rational-cra.h | 26 +-
linbox/algorithms/rational-cra2.h | 211 +-
linbox/algorithms/rational-reconstruction-base.h | 26 +-
linbox/algorithms/rational-reconstruction.h | 332 +-
linbox/algorithms/rational-solver-adaptive.h | 18 +-
linbox/algorithms/rational-solver-sn.h | 50 +-
linbox/algorithms/rational-solver-sn.inl | 58 +-
linbox/algorithms/rational-solver.h | 20 +-
linbox/algorithms/rational-solver.inl | 242 +-
linbox/algorithms/rational-solver2.h | 59 +-
linbox/algorithms/rns.h | 6 +-
linbox/algorithms/rns.inl | 4 +-
linbox/algorithms/short-vector.h | 14 +-
linbox/algorithms/sigma-basis.h | 273 +-
linbox/algorithms/signature.h | 111 +-
linbox/algorithms/smith-form-adaptive.h | 31 +-
linbox/algorithms/smith-form-adaptive.inl | 216 +-
linbox/algorithms/smith-form-binary.h | 42 +-
linbox/algorithms/smith-form-iliopoulos.h | 76 +-
linbox/algorithms/smith-form-iliopoulos2.h | 468 +
linbox/algorithms/smith-form-kannan-bachem.h | 358 +
linbox/algorithms/smith-form-local.h | 15 +-
linbox/algorithms/smith-form-local2.inl | 21 +-
linbox/algorithms/smith-form-sparseelim-local.h | 203 +-
.../algorithms/smith-form-sparseelim-poweroftwo.h | 371 +-
linbox/algorithms/smith-form-textbook.h | 268 +
linbox/algorithms/toeplitz-det.h | 19 +-
linbox/algorithms/triangular-solve-gf2.h | 20 +-
linbox/algorithms/triangular-solve.h | 19 +-
linbox/algorithms/varprec-cra-early-multip.h | 156 +-
linbox/algorithms/varprec-cra-early-single.h | 35 +-
linbox/algorithms/vector-fraction.h | 63 +-
linbox/algorithms/whisart_trace.h | 139 +-
linbox/algorithms/wiedemann.h | 60 +-
linbox/algorithms/wiedemann.inl | 65 +-
linbox/blackbox/Makefile.am | 43 +-
linbox/blackbox/Makefile.in | 650 -
linbox/blackbox/apply.h | 134 +-
linbox/blackbox/bb.h | 85 +
linbox/blackbox/blackbox.doxy | 21 +-
linbox/blackbox/blackbox.h | 69 +
linbox/blackbox/blackbox_parallel.h | 274 +
linbox/blackbox/blackbox_thread.h | 405 +
linbox/blackbox/block-hankel-inverse.h | 101 +-
linbox/blackbox/block-hankel.h | 134 +-
linbox/blackbox/block-toeplitz.h | 6 +-
linbox/blackbox/butterfly.h | 478 +-
linbox/blackbox/butterfly.inl | 845 +
linbox/blackbox/companion.h | 70 +-
linbox/blackbox/compose.h | 49 +-
linbox/blackbox/csf.h | 491 +
linbox/blackbox/csf.inl | 215 +
linbox/blackbox/dense-zero-one.h | 405 +
linbox/blackbox/diagonal-gf2.h | 10 +-
linbox/blackbox/diagonal.h | 380 +-
linbox/blackbox/direct-sum.h | 39 +-
linbox/blackbox/fibb-product.h | 418 +
linbox/blackbox/fibb.h | 111 +
linbox/blackbox/frobenius.h | 18 +-
linbox/blackbox/hilbert.h | 54 +-
linbox/blackbox/inverse.h | 32 +-
linbox/blackbox/jit-matrix.h | 132 +-
linbox/blackbox/lambda-sparse.h | 11 +-
linbox/blackbox/matrix-blackbox.h | 14 +-
linbox/blackbox/moore-penrose.h | 6 +-
linbox/blackbox/ntl-hankel.h | 35 +-
linbox/blackbox/ntl-hankel.inl | 70 +-
linbox/blackbox/ntl-sylvester.h | 12 +-
linbox/blackbox/ntl-sylvester.inl | 107 +-
linbox/blackbox/pascal.h | 278 +
linbox/blackbox/permutation.h | 413 +-
linbox/blackbox/polynomial.h | 8 +-
linbox/blackbox/quad-matrix.h | 73 +-
linbox/blackbox/random-matrix.h | 31 +-
linbox/blackbox/rational-matrix-factory.h | 51 +-
linbox/blackbox/scalar-matrix.h | 185 +-
linbox/blackbox/scompose.h | 5 +-
linbox/blackbox/sparse.h | 443 -
linbox/blackbox/sparse.inl | 77 -
linbox/blackbox/sparse1.h | 463 -
linbox/blackbox/squarize.h | 12 +-
linbox/blackbox/submatrix.h | 60 +-
linbox/blackbox/subrowmatrix.h | 219 +
linbox/blackbox/sum.h | 19 +-
linbox/blackbox/toeplitz.h | 159 +-
linbox/blackbox/toeplitz.inl | 207 +-
linbox/blackbox/transpose.h | 27 +-
linbox/blackbox/triangular-fibb.h | 322 +
linbox/blackbox/triplesbb.h | 348 -
linbox/blackbox/zero-one.h | 45 +-
linbox/blackbox/zero-one.inl | 84 +-
linbox/blackbox/zo-gf2.h | 10 +-
linbox/blackbox/zo-gf2.inl | 37 +-
linbox/blackbox/zo.h | 42 +-
linbox/blackbox/zo.inl | 18 +-
linbox/blackbox/zoi.inl | 244 +
linbox/element/Makefile.in | 582 -
linbox/element/abstract.h | 3 +-
linbox/element/envelope.h | 3 +-
linbox/field/Givaro/Makefile.am | 42 -
linbox/field/Givaro/Makefile.in | 591 -
linbox/field/Givaro/givaro-extension.h | 321 -
linbox/field/Givaro/givaro-field-gf2.h | 218 -
linbox/field/Givaro/givaro-field.h | 200 -
linbox/field/Givaro/givaro-gfq.h | 283 -
linbox/field/Givaro/givaro-montg.h | 207 -
linbox/field/Givaro/givaro-rational.h | 229 -
linbox/field/Givaro/givaro-zpz.h | 518 -
linbox/field/Givaro/givaro-zpz.inl | 288 -
linbox/field/Makefile.am | 48 +-
linbox/field/Makefile.in | 782 -
linbox/field/Modular/Makefile.am | 44 -
linbox/field/Modular/Makefile.in | 592 -
linbox/field/Modular/modular-balanced-double.h | 342 -
linbox/field/Modular/modular-balanced-float.h | 336 -
linbox/field/Modular/modular-balanced-int32.h | 336 -
linbox/field/Modular/modular-balanced-int64.h | 345 -
linbox/field/Modular/modular-byte.h | 773 -
linbox/field/Modular/modular-crooked-double.h | 616 -
linbox/field/Modular/modular-double.h | 381 -
linbox/field/Modular/modular-float.h | 335 -
linbox/field/Modular/modular-int32.h | 526 -
linbox/field/Modular/modular-int64.h | 505 -
linbox/field/Modular/modular-short.h | 794 -
linbox/field/Modular/modular-unsigned.h | 1102 -
linbox/field/Modular/modular.inl | 771 -
linbox/field/NTL/Makefile.am | 46 -
linbox/field/NTL/Makefile.in | 592 -
linbox/field/NTL/ntl-GF2E.h | 242 -
linbox/field/NTL/ntl-RR.h | 334 -
linbox/field/NTL/ntl-ZZ.h | 771 -
linbox/field/NTL/ntl-ZZ_p.h | 500 -
linbox/field/NTL/ntl-ZZ_pE.h | 419 -
linbox/field/NTL/ntl-ZZ_pX.h | 341 -
linbox/field/NTL/ntl-lzz_p.h | 348 -
linbox/field/NTL/ntl-lzz_pE.h | 268 -
linbox/field/NTL/ntl-lzz_pX.h | 329 -
linbox/field/PID-double.h | 347 -
linbox/field/PID-integer.h | 576 -
linbox/field/PID-ntl-zz_p.h | 93 -
linbox/field/PIR-modular-int32.h | 700 -
linbox/field/PIR-ntl-ZZ_p.h | 905 -
linbox/field/abstract.h | 17 +-
linbox/field/archetype.h | 81 +-
linbox/field/block-ring.h | 622 -
linbox/field/envelope.h | 17 +-
linbox/field/field-interface.h | 2 +-
linbox/field/field-traits.h | 44 +-
linbox/field/gf2.h | 74 +-
linbox/field/givaro.h | 48 -
linbox/field/gmp-rational.h | 51 +-
linbox/field/hom.h | 352 +-
linbox/field/image-field.h | 86 +
linbox/field/integers.doxy | 5 +-
linbox/field/lidia-gfq.h | 776 -
linbox/field/lidia.doxy | 29 -
linbox/field/lidia.h | 42 -
linbox/field/local2_32.h | 337 -
linbox/field/modular-balanced.h | 52 -
linbox/field/modular.doxy | 33 -
linbox/field/modular.h | 842 -
linbox/field/multimod-field.h | 63 +-
linbox/field/ntl.doxy | 30 -
linbox/field/ntl.h | 59 -
linbox/field/param-fuzzy.h | 24 +-
linbox/field/rebind.h | 2 +-
linbox/field/unparametric.h | 337 -
linbox/integer.h | 199 +-
linbox/iterators/Makefile.am | 26 +
linbox/iterators/blackbox-symmetric-iterator.h | 91 +
linbox/iterators/blackbox-symmetrize-iterator.h | 84 +
linbox/linbox-config.h | 346 +-
linbox/linbox-tags.h | 139 +
linbox/matrix/Makefile.am | 62 +-
linbox/matrix/Makefile.in | 605 -
linbox/matrix/abnormal-helpers.h | 171 +
linbox/matrix/abnormal-matrix.h | 107 +
linbox/matrix/blas-matrix-multimod.h | 218 -
linbox/matrix/blas-matrix.h | 1210 -
linbox/matrix/blas-matrix.inl | 1742 -
linbox/matrix/blas-submatrix.inl | 1085 -
linbox/matrix/blas-triangularmatrix.inl | 144 -
linbox/matrix/dense-matrix.doxy | 32 +
linbox/matrix/dense-matrix.h | 190 +
linbox/matrix/dense-rows-matrix.h | 264 -
linbox/matrix/densematrix/Makefile.am | 34 +
linbox/matrix/densematrix/blas-matrix-multimod.h | 217 +
linbox/matrix/densematrix/blas-matrix.h | 1254 +
linbox/matrix/densematrix/blas-matrix.inl | 1548 +
linbox/matrix/densematrix/blas-submatrix.inl | 1239 +
linbox/matrix/densematrix/blas-transposed-matrix.h | 106 +
.../matrix/densematrix/blas-triangularmatrix.inl | 145 +
linbox/matrix/factorized-matrix.h | 58 +-
linbox/matrix/factorized-matrix.inl | 726 +-
linbox/matrix/grid.h | 612 +
linbox/matrix/matrix-category.h | 69 +-
linbox/matrix/matrix-domain.doxy | 32 +
linbox/matrix/matrix-domain.h | 1183 +-
linbox/matrix/matrix-domain.inl | 1183 -
linbox/matrix/matrix-iterators.doxy | 45 +
linbox/matrix/matrix-traits.h | 92 +
linbox/matrix/matrix.doxy | 71 +-
linbox/matrix/matrixdomain/Makefile.am | 51 +
linbox/matrix/matrixdomain/apply-domain.h | 462 +
linbox/matrix/matrixdomain/blas-matrix-domain.h | 980 +
linbox/matrix/matrixdomain/blas-matrix-domain.inl | 2101 +
.../matrix/{ => matrixdomain}/matrix-domain-gf2.h | 0
linbox/matrix/matrixdomain/matrix-domain.h | 1245 +
linbox/matrix/matrixdomain/matrix-domain.inl | 1200 +
linbox/matrix/matrixdomain/opencl-domain-factory.h | 750 +
.../matrix/matrixdomain/opencl-domain-memory.inl | 333 +
linbox/matrix/matrixdomain/opencl-domain-util.inl | 898 +
linbox/matrix/matrixdomain/opencl-domain.h | 995 +
linbox/matrix/matrixdomain/opencl-domain.inl | 2459 +
linbox/matrix/matrixdomain/plain-domain.h | 240 +
linbox/matrix/permutation-matrix.doxy | 32 +
linbox/matrix/permutation-matrix.h | 4 +-
linbox/matrix/permutation-matrix.inl | 4 +-
linbox/matrix/plain-matrix.h | 203 +
linbox/matrix/polynomial-matrix.h | 687 +
linbox/matrix/random-matrix.h | 22 +-
linbox/matrix/random-matrix.inl | 92 +-
linbox/matrix/sliced3.doxy | 32 +
linbox/matrix/sliced3.h | 44 +
linbox/matrix/sliced3/Makefile.am | 30 +
linbox/matrix/sliced3/dense-matrix.h | 524 +
linbox/matrix/sliced3/dense-sliced.h | 691 +
linbox/matrix/sliced3/dense-sliced.inl | 391 +
linbox/matrix/sliced3/sliced-domain.h | 165 +
linbox/matrix/sliced3/sliced-stepper.h | 63 +
linbox/matrix/sliced3/submat-iterator.h | 125 +
.../SlicedPolynomialMatrix.h | 197 +
.../SlicedPolynomialMatrix.inl | 376 +
.../SlicedPolynomialMatrixAddSub.h | 53 +
.../SlicedPolynomialMatrixAddSub.inl | 75 +
.../SlicedPolynomialMatrixMulKaratsuba.h | 26 +
.../SlicedPolynomialMatrixMulKaratsuba.inl | 258 +
.../SlicedPolynomialMatrixMulToomCook.h | 29 +
.../SlicedPolynomialMatrixMulToomCook.inl | 188 +
linbox/matrix/slicedpolynomialmatrix/conversion.h | 55 +
.../matrix/slicedpolynomialmatrix/conversion.inl | 114 +
linbox/matrix/sparse-formats.h | 98 +
linbox/matrix/sparse-matrix.doxy | 32 +
linbox/matrix/sparse-matrix.h | 287 +
linbox/matrix/sparse.h | 1724 -
linbox/matrix/sparse.inl | 983 -
linbox/matrix/sparsematrix/Makefile.am | 59 +
linbox/matrix/sparsematrix/read-write-sparse.h | 158 +
linbox/matrix/sparsematrix/read-write-sparse.inl | 604 +
.../sparsematrix/sparse-associative-vector.h | 672 +
.../sparsematrix/sparse-associative-vector.inl | 139 +
.../sparsematrix/sparse-coo-implicit-matrix.h | 977 +
linbox/matrix/sparsematrix/sparse-coo-matrix.h | 1282 +
linbox/matrix/sparsematrix/sparse-csr-matrix.h | 1615 +
linbox/matrix/sparsematrix/sparse-domain.h | 70 +
linbox/matrix/sparsematrix/sparse-ell-matrix.h | 1489 +
linbox/matrix/sparsematrix/sparse-ellr-matrix.h | 1542 +
linbox/matrix/sparsematrix/sparse-generic.h | 538 +
linbox/matrix/sparsematrix/sparse-generic.inl | 100 +
linbox/matrix/sparsematrix/sparse-hyb-matrix.h | 923 +
linbox/matrix/sparsematrix/sparse-map-map-matrix.h | 216 +
.../matrix/sparsematrix/sparse-map-map-matrix.inl | 672 +
.../matrix/sparsematrix/sparse-parallel-vector.h | 735 +
.../matrix/sparsematrix/sparse-parallel-vector.inl | 359 +
.../matrix/sparsematrix/sparse-sequence-vector.h | 713 +
.../matrix/sparsematrix/sparse-sequence-vector.inl | 179 +
linbox/matrix/sparsematrix/sparse-tpl-matrix-omp.h | 415 +
.../matrix/sparsematrix/sparse-tpl-matrix-omp.inl | 614 +
linbox/matrix/sparsematrix/sparse-tpl-matrix.h | 241 +
linbox/matrix/sparsematrix/sparse-tpl-matrix.inl | 253 +
linbox/matrix/sparsematrix/triples-coord.h | 200 +
linbox/matrix/transpose-matrix.h | 14 +-
linbox/randiter/Makefile.am | 38 +-
linbox/randiter/Makefile.in | 672 -
linbox/randiter/abstract.h | 2 +-
linbox/randiter/archetype.h | 2 +-
linbox/randiter/envelope.h | 6 +-
linbox/randiter/generic.h | 179 +
linbox/randiter/gf2.h | 4 +-
linbox/randiter/givaro-poly.h | 75 +
linbox/randiter/gmp-rational.h | 24 +-
linbox/randiter/mersenne-twister.h | 14 +-
linbox/randiter/modular-balanced.h | 32 +-
linbox/randiter/modular-crooked.h | 3 +-
linbox/randiter/modular.h | 393 -
linbox/randiter/multimod-randomprime.h | 30 +-
linbox/randiter/nonzero.h | 117 -
linbox/randiter/{ntl-ZZ.h => ntl-zz.h} | 0
linbox/randiter/param-fuzzy.h | 14 +-
linbox/randiter/random-fftprime.h | 170 +-
linbox/randiter/random-integer.h | 205 -
linbox/randiter/random-prime.h | 106 +-
linbox/randiter/unparametric.h | 207 -
linbox/ring/Makefile.am | 28 +-
linbox/ring/Makefile.in | 586 -
linbox/ring/gcd32.h | 196 +
linbox/ring/gcd64.h | 356 +
linbox/ring/givaro-poly-mod-poly.h | 41 +
linbox/ring/givaro-poly.h | 348 +
linbox/ring/givaro-polynomial.h | 131 +-
linbox/ring/local-pir-modular.h | 174 +
linbox/ring/local2_32.h | 262 +
linbox/ring/modular.h | 156 +
linbox/ring/modular/Makefile.am | 43 +
linbox/ring/modular/modular-balanced-double.h | 237 +
linbox/ring/modular/modular-balanced-float.h | 232 +
linbox/ring/modular/modular-balanced-int32.h | 265 +
linbox/ring/modular/modular-balanced-int64.h | 271 +
linbox/ring/modular/modular-byte.h | 388 +
linbox/ring/modular/modular-double.h | 242 +
linbox/ring/modular/modular-float.h | 214 +
linbox/ring/modular/modular-int32.h | 428 +
linbox/ring/modular/modular-int64.h | 445 +
linbox/ring/modular/modular-short.h | 386 +
linbox/ring/modular/modular-unsigned.h | 686 +
linbox/ring/modular/modular-unsigned.inl | 828 +
linbox/ring/ntl.doxy | 30 +
linbox/ring/ntl.h | 60 +
linbox/ring/ntl/Makefile.am | 47 +
linbox/ring/ntl/ntl-gf2e.h | 247 +
linbox/ring/ntl/ntl-lzz_p.h | 379 +
linbox/ring/ntl/ntl-lzz_pe.h | 313 +
linbox/ring/ntl/ntl-lzz_pex.h | 447 +
linbox/ring/ntl/ntl-lzz_px.h | 442 +
linbox/ring/ntl/ntl-rr.h | 356 +
linbox/ring/ntl/ntl-zz.h | 782 +
linbox/ring/ntl/ntl-zz_p.h | 525 +
linbox/ring/ntl/ntl-zz_pe.h | 434 +
linbox/ring/ntl/ntl-zz_px.h | 354 +
linbox/ring/pid-ntl-zz_p.h | 92 +
linbox/ring/pir-modular-int32.h | 713 +
linbox/ring/pir-ntl-zz_p.h | 913 +
linbox/ring/poweroftwomodular.h | 16 +-
linbox/ring/ring.doxy | 31 +-
linbox/solutions/Makefile.am | 35 +-
linbox/solutions/Makefile.in | 599 -
linbox/solutions/charpoly.h | 111 +-
linbox/solutions/det.h | 62 +-
linbox/solutions/getentry.h | 129 +-
linbox/solutions/getentry.inl | 127 +
linbox/solutions/is-positive-definite.h | 15 +-
linbox/solutions/is-positive-semidefinite.h | 8 +-
linbox/solutions/methods.h | 68 +-
linbox/solutions/minpoly.h | 21 +-
linbox/solutions/nullspace.h | 2 +-
linbox/solutions/rank.h | 643 +-
linbox/solutions/rank.inl | 652 +
linbox/solutions/smith-form.h | 29 +-
linbox/solutions/solution-tags.h | 56 +
linbox/solutions/solve.h | 190 +-
linbox/solutions/trace.h | 72 +-
linbox/solutions/trace.inl | 83 +
linbox/solutions/valence.h | 69 +-
linbox/switch/Makefile.am | 27 -
linbox/switch/Makefile.in | 576 -
linbox/switch/boolean.h | 195 -
linbox/switch/cekstv-gf2.h | 142 -
linbox/switch/cekstv.h | 200 -
linbox/util/Makefile.am | 42 +-
linbox/util/Makefile.in | 800 -
linbox/util/args-parser.h | 41 +
linbox/util/commentator.h | 78 +-
linbox/util/commentator.inl | 111 +-
linbox/util/debug.C | 4 +-
linbox/util/debug.h | 26 +-
linbox/util/error.C | 3 +-
linbox/util/error.h | 5 +-
linbox/util/field-axpy.h | 64 +-
linbox/util/formats/Makefile.in | 579 -
linbox/util/formats/maple.h | 24 +-
linbox/util/formats/matrix-market.h | 27 +-
linbox/util/formats/matrix-stream-readers.h | 15 +-
linbox/util/formats/sms.h | 13 +-
linbox/util/formats/sparse-row.h | 2 +-
linbox/util/iml_wrapper.h | 4 +-
linbox/util/matrix-stream.h | 21 +-
linbox/util/matrix-stream.inl | 32 +-
linbox/util/prime-stream.h | 12 +-
linbox/util/timer.h | 18 +-
linbox/util/write-mm.h | 111 +
linbox/vector/Makefile.am | 3 +
linbox/vector/Makefile.in | 592 -
linbox/vector/bit-vector.h | 44 +-
linbox/vector/bit-vector.inl | 56 +-
linbox/vector/blas-vector.h | 992 +
linbox/vector/blas-vector.inl | 47 +
linbox/vector/reverse.h | 12 +-
.../SlicedPolynomialMatrixVectorMulKaratsuba.h | 27 +
.../SlicedPolynomialMatrixVectorMulKaratsuba.inl | 245 +
.../SlicedPolynomialVector.h | 173 +
.../SlicedPolynomialVector.inl | 329 +
.../SlicedPolynomialVectorAddSub.h | 53 +
.../SlicedPolynomialVectorAddSub.inl | 75 +
linbox/vector/stream-gf2.h | 17 +-
linbox/vector/stream.h | 201 +-
linbox/vector/subiterator.h | 178 +-
linbox/vector/subvector.h | 37 +-
linbox/vector/vector-domain-gf2.h | 27 +-
linbox/vector/vector-domain.h | 138 +-
linbox/vector/vector-domain.inl | 548 +-
linbox/vector/vector-traits.h | 27 +-
linbox/vector/vector.h | 58 +
macros/Makefile.am | 4 +-
macros/Makefile.in | 490 -
macros/ax_cxx_compile_stdcxx_11.m4 | 133 +
macros/debug.m4 | 70 +-
macros/expat-check.m4 | 4 +-
macros/fflas-ffpack-check.m4 | 40 +-
macros/flint-check.m4 | 147 +
macros/fplll-check.m4 | 13 +-
macros/givaro-check.m4 | 144 -
macros/gmp-check.m4 | 175 -
macros/iml-check.m4 | 4 +-
macros/lapack-check.m4 | 8 +-
macros/libtool.m4 | 7995 --
macros/lidia-check.m4 | 4 +-
macros/linbox-benchmark.m4 | 8 +-
macros/ltoptions.m4 | 384 -
macros/ltsugar.m4 | 123 -
macros/ltversion.m4 | 23 -
macros/lt~obsolete.m4 | 98 -
macros/m4ri-check.m4 | 4 +-
macros/m4rie-check.m4 | 4 +-
macros/mpfr-check.m4 | 4 +-
macros/ntl-check.m4 | 4 +-
macros/ocl-check.m4 | 95 +
macros/omp-check.m4 | 77 +
macros/saclib-check.m4 | 3 +-
macros/sage-check.m4 | 6 +-
macros/tinyxml2-check.m4 | 46 +
template.h | 131 +
tests/.gitignore | 64 +
tests/Makefile.am | 921 +-
tests/Makefile.in | 2599 -
tests/benchmark-fields.C | 88 +-
tests/checker.C | 569 +-
tests/data/Makefile.am | 4 +-
tests/data/Makefile.in | 475 -
tests/data/matrix-market-coordinate.matrix | 1 +
tests/data/test.matrix | 10 -
tests/matrix/Makefile.in | 474 -
tests/matrix/invhilb.h | 6 +-
tests/matrix/minmax.h | 6 +-
tests/matrix/randomans.h | 17 +-
tests/matrix/randommat.h | 6 +-
tests/perfpublisher.sh | 158 +
tests/test-PID-integer.C | 91 -
tests/test-bitonic-sort.C | 9 +-
tests/test-blackbox-block-container.C | 172 +-
tests/test-blackbox.h | 247 +-
tests/test-blas-domain.C | 771 +-
tests/test-blas-matrix.C | 356 +
tests/test-block-ring.C | 12 +-
tests/test-block-wiedemann.C | 190 +
tests/test-bmseq.C | 233 -
tests/test-butterfly.C | 106 +-
tests/test-charpoly.C | 154 +-
tests/test-commentator.C | 10 +-
tests/test-common.C | 93 -
tests/test-common.h | 99 +-
tests/test-common.inl | 93 +
tests/test-companion.C | 35 +-
tests/test-cra.C | 35 +-
tests/test-cradomain.C | 132 +-
tests/test-dense-zero-one.C | 75 +-
tests/test-dense.C | 120 +-
tests/test-det.C | 118 +-
tests/test-diagonal.C | 86 +-
tests/test-dif.C | 30 +-
tests/test-direct-sum.C | 24 +-
tests/test-dyadic-to-rational.C | 43 +-
tests/test-echelon-form.C | 70 +-
tests/test-ffpack.C | 332 +-
tests/test-fibb.C | 313 +
tests/test-field.h | 501 +-
tests/test-frobenius.C | 22 +-
tests/test-ftrmm.C | 113 +-
tests/test-generic.h | 11 +-
tests/test-getentry.C | 64 +-
tests/test-gf2.C | 263 +-
tests/test-givaro-fields.C | 180 -
tests/test-givaro-zpz.C | 190 +
tests/test-givaro-zpzuns.C | 150 +
tests/test-givaropoly.C | 96 +
tests/test-gmp-rational.C | 18 +-
tests/test-hilbert.C | 11 +-
tests/test-hom.C | 8 +-
tests/test-image-field.C | 117 +
tests/test-inverse.C | 63 +-
tests/test-isposdef.C | 57 +-
tests/test-ispossemidef.C | 49 +-
tests/test-la-block-lanczos.C | 36 +-
tests/test-last-invariant-factor.C | 49 +-
tests/test-lidia-gfq.C | 93 -
tests/test-matrix-domain.C | 155 +-
tests/test-matrix-domain.h | 191 +
tests/test-matrix-stream.C | 9 +-
tests/test-matrix-utils.h | 322 +
tests/test-mg-block-lanczos.C | 33 +-
tests/test-minpoly.C | 252 +-
tests/test-modular-balanced-double.C | 63 +-
tests/test-modular-balanced-float.C | 61 +-
tests/test-modular-balanced-int.C | 139 +-
tests/test-modular-byte.C | 40 +-
tests/test-modular-double.C | 72 +-
tests/test-modular-float.C | 77 +-
tests/test-modular-int.C | 116 +-
tests/test-modular-short.C | 44 +-
tests/test-modular.C | 65 +-
tests/test-moore-penrose.C | 52 +-
tests/test-ntl-RR.C | 98 -
tests/test-ntl-ZZ_p.C | 118 -
tests/test-ntl-hankel.C | 43 +-
tests/test-ntl-lzz_p.C | 14 +-
tests/test-ntl-lzz_pe.C | 94 +
tests/test-ntl-lzz_pex.C | 90 +
tests/test-ntl-lzz_px.C | 90 +
tests/test-ntl-rr.C | 96 +
tests/test-ntl-sylvester.C | 38 +-
tests/test-ntl-toeplitz.C | 32 +-
tests/test-ntl-zz_p.C | 118 +
tests/test-nullspace.C | 323 +-
tests/test-opencl-domain.C | 891 +
tests/test-optimization.C | 7 +-
tests/test-order-basis.C | 157 +
tests/test-param-fuzzy.C | 18 +-
tests/test-permutation.C | 137 +
tests/test-plain-domain.C | 1632 +
tests/test-poly-det.C | 117 +
tests/test-qlup.C | 250 +-
tests/test-quad-matrix.C | 139 +
tests/test-randiter-nonzero.C | 29 +-
tests/test-random-matrix.C | 44 +
tests/test-rank-Int.C | 76 +
tests/test-rank-md.C | 83 +
tests/test-rank-u32.C | 80 +
tests/test-rank.C | 345 -
tests/test-rank.h | 384 +
tests/test-rat-charpoly.C | 21 +-
tests/test-rat-minpoly.C | 27 +-
tests/test-rat-solve.C | 41 +-
tests/test-rational-matrix-factory.C | 16 +-
tests/test-rational-reconstruction-base.C | 119 +-
tests/test-rational-solver-adaptive.C | 74 +-
tests/test-rational-solver.C | 218 +-
tests/test-regression.C | 125 +
tests/test-scalar-matrix.C | 12 +-
tests/test-smith-form-adaptive.C | 49 +-
tests/test-smith-form-binary.C | 85 +-
tests/test-smith-form-iliopoulos.C | 341 +-
tests/test-smith-form-kannan-bachem.C | 74 +
tests/test-smith-form-local.C | 177 +-
tests/test-smith-form.C | 78 +-
tests/test-solve-nonsingular.C | 84 +-
tests/test-solve.C | 125 +-
tests/test-sparse-map-map.C | 261 +
tests/test-sparse.C | 665 +-
tests/test-subiterator.C | 61 +-
tests/test-submatrix.C | 62 +-
tests/test-subvector.C | 494 +-
tests/test-sum.C | 68 +-
tests/test-toeplitz-det.C | 24 +-
tests/test-toom-cook.C | 413 +-
tests/test-trace.C | 85 +-
tests/test-transpose.C | 224 +
tests/test-triplesbb-omp.C | 414 +
tests/test-triplesbb.C | 160 +-
tests/test-tutorial.C | 64 +
tests/test-unparametric-field.C | 98 -
tests/test-vector-domain.C | 56 +-
tests/test-vector-domain.h | 73 +-
tests/test-zero-one.C | 22 +-
tests/test-zo.C | 137 -
tests/test_leak.sh | 61 +
tests/tests.doxy | 4 +-
951 files changed, 334397 insertions(+), 123871 deletions(-)
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..673faa8
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,82 @@
+**/Makefile
+**/Makefile.in
+**/*.log
+**/*.trs
+**/*.o
+**/*.la
+**/*.lo
+**/.libs
+
+tests/test-blas-matrix
+tests/test-charpoly
+tests/test-commentator
+tests/test-cra
+tests/test-det
+tests/test-frobenius
+tests/test-rank-Int
+tests/test-rank-md
+tests/test-rank-u32
+tests/test-rational-solver
+tests/test-rational-solver-adaptive
+tests/test-smith-form-binary
+tests/test-solve
+tests/test-regression
+tests/test-block-wiedemann
+tests/test-cradomain
+tests/test-dyadic-to-rational
+tests/test-givaro-zpz
+tests/test-givaro-zpzuns
+tests/test-isposdef
+tests/test-ispossemidef
+tests/test-modular-balanced-double
+tests/test-modular-balanced-int
+tests/test-moore-penrose
+tests/test-rational-reconstruction-base
+tests/test-smith-form-kannan-bachem
+tests/test-solve-nonsingular
+
+INSTALL
+_configs.sed
+aclocal.m4
+autogen.status
+autom4te.cache/
+build-aux/
+config.h
+config.h.in
+config.log
+config.status
+configure
+doc/Doxyfile
+doc/DoxyfileDev
+examples/charpoly
+examples/checksolve
+examples/det
+examples/dot-product
+examples/doubledet
+examples/echelon
+examples/graph-charpoly
+examples/grid_reduce
+examples/minpoly
+examples/omp_smithvalence
+examples/poweroftwo_ranks
+examples/rank
+examples/smith
+examples/smithvalence
+examples/solve
+examples/sparseelimdet
+examples/sparseelimrank
+examples/valence
+examples/benchmatpolymult
+examples/benchfft
+examples/polysmith
+benchmarks/benchmark-example
+libtool
+linbox-config
+linbox/config.h
+macros/libtool.m4
+macros/ltoptions.m4
+macros/ltsugar.m4
+macros/ltversion.m4
+macros/lt~obsolete.m4
+stamp-h1
+linbox.pc
diff --git a/AUTHORS b/AUTHORS
index b2cbf48..d259730 100644
--- a/AUTHORS
+++ b/AUTHORS
@@ -1,5 +1,6 @@
The Linbox team:
+Brice Boyer <brice.boyer at gmail.com>
Jean-Guillaume Dumas <Jean-Guillaume.Dumas at imag.fr>
Mark Giesbrecht <mwg at csd.uwo.ca>
Pascal Giorgi <Pascal.Giorgi at lirmm.fr>
diff --git a/CHANGED-INTERFACES b/CHANGED-INTERFACES
new file mode 100644
index 0000000..dc362d8
--- /dev/null
+++ b/CHANGED-INTERFACES
@@ -0,0 +1,75 @@
+Author: Hovinen (early 2002), edits by Saunders (2003Jan)
+
+Class names:
+
+ In general: Most class names now follow the Java/Smalltalk
+ MyClass style. Abbreviations have been removed in most cases.
+
+ Field::randIter -> Field::RandIter
+
+ sparsemat* -> SparseMatrix*
+
+ diagonal -> Diagonal
+ hilbert -> Hilbert
+ etc.
+
+ There are two notable exceptions: The wrapper of GMP long
+ integers is "integer", and field elements are represented by
+ "element".
+
+ ParamGivaro::Modular was first renamed LargeModular, since it works
+ over a modulus of arbitrary size. Corresponding SmallGivaro::Modular
+ (word size modulus) and TinyGivaro::Modular (half-word size modulus)
+ were planned. All of this has become Givaro::Modular<element>, for
+ basic element types of the various sizes, including unsigned
+ and floating types. For example Givaro::Modular<uint32>.
+
+Class methods:
+
+ In general: I have standardized everything on the Java
+ studlycaps style, e.g. MyClass::myMethod
+
+ The names Blackbox_archetype::applyin and
+ Blackbox_archetype::applyTransposein have been changed to
+ BlackboxArchetype::applyIn and
+ BlackboxArchetype::applyTransposeIn, respectively.
+
+Header files:
+
+ All header files that previously used '_' to separate words
+ use '-' now as '-' is easier to type. More generally the
+ header file named first-second-third.h can be expected to
+ contain a declaration of class FirstSecondThird.
+
+ The archetype header files have been moved into directories
+ containing objects of those archetypes and are all now named
+ "archetype.h", "abstract.h", and "envelope.h".
+
+ Header files are now installed into a tree matching that of
+ the source code as opposed to a single, flat directory. So,
+ for example, one now includes LinBox/blackbox/archetype.h as
+ opposed to LinBox/blackbox-archetype.h
+
+Miscellanae:
+
+ In the random iterator interface, the operator () has been
+ replaced by a function random accepting a single argument --
+ an element type into which the random element should be
+ placed. This eliminates the potential for memory leaks.
+
+ The blackbox container class now requires that a field be
+ passed, as it no longer retrieves the field from the black
+ box.
+
+ Some terms composed of more than one word are considered to be
+ compound words and do not have internal capitalization, e.g. Blackbox
+ (vs. BlackBox) and minpoly (vs. minPoly).
+
+Frozen design:
+
+ These files are frozen and require team consensus for changes.
+
+ field-archetype.h
+ blackbox-archetype.h
+ element-archetype.h
+ randiter-archetype.h
diff --git a/ChangeLog b/ChangeLog
index fb15abe..f6d60cc 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,4 +1,16 @@
-2011-03-10 bboyer
+2016-02-24 cpernet v1.4.1
+ * update the build system (add pkgconfig file, and a more consistent way
+ of dealing with dependencies)
+ * fix all remaining issues for the integration in SageMath
+
+2016-02-24 cpernet
+ * move almost all finite fields to givaro
+ * cleanup dead code
+ * many bug fixes
+ * change in some parts of the API
+ * improved order basis computations
+
+2011-03-10 briceboyer
* Implement DublinBox Mother model for dense matrices (BlasM* own, BlasS* share)
* Change BlasSubmatrix private members (and add one to make Iterators faster)
* Change <> includes to "" so I have no surprise when the compiler looks them in a non expected place
@@ -6,7 +18,7 @@
* RawIterators are renamed to Iterators (impossible to pronounce, easy to misspell)
* add functions to blas-domain and blas-matrix
-2011-24-09 bboyer
+2011-24-09 briceboyer
* replace DenseMatrix(Base) by Blas(Matrix/Blackbox)
* put these classes (and DenseSubmatrix) in a Protected namespace (users will be warned...)
* update Blas(Mat/Bb) interface
@@ -20,7 +32,7 @@
* M4RI checks
* Ekopath (pathscale) checks
-2011-05-11 bboyer
+2011-05-11 briceboyer
linbox-1.2.0 released:
* Many many bug fixes, many memleaks, much code beautify.
* Licence/copyright added to (hopefully) every file.
@@ -1420,9 +1432,9 @@ end newBB branch notes
* linbox/blackbox/zero-one.inl: "" ZeroOne class
* linbox/field/gf2.h: "" GF2 class
* linbox/field/gf2.inl:
- * linbox/field/givaro-gfq.h: "" GivaroGfq class
+ * linbox/field/givaro-gfq.h: "" Givaro::GFq class
* linbox/field/givaro-zpz.h:
- * linbox/field/givaro-zpz.inl: "" GivaroZpz class
+ * linbox/field/givaro-zpz.inl: "" Givaro::Modular class
* linbox/field/gmp-rational.h: "" GMPRationalField class
* linbox/field/lidia-gfq.h: "" LidiaGfq class
* linbox/field/modular.h: "" Modular class
diff --git a/HACKING b/HACKING
new file mode 100644
index 0000000..1f3c364
--- /dev/null
+++ b/HACKING
@@ -0,0 +1,4 @@
+Please go to http://www.linalg.org/developer.html (or ./doc/install-dev.html)
+
+==================
+The Linbox Team
diff --git a/INSTALL b/INSTALL
deleted file mode 100644
index a1e89e1..0000000
--- a/INSTALL
+++ /dev/null
@@ -1,370 +0,0 @@
-Installation Instructions
-*************************
-
-Copyright (C) 1994-1996, 1999-2002, 2004-2011 Free Software Foundation,
-Inc.
-
- Copying and distribution of this file, with or without modification,
-are permitted in any medium without royalty provided the copyright
-notice and this notice are preserved. This file is offered as-is,
-without warranty of any kind.
-
-Basic Installation
-==================
-
- Briefly, the shell commands `./configure; make; make install' should
-configure, build, and install this package. The following
-more-detailed instructions are generic; see the `README' file for
-instructions specific to this package. Some packages provide this
-`INSTALL' file but do not implement all of the features documented
-below. The lack of an optional feature in a given package is not
-necessarily a bug. More recommendations for GNU packages can be found
-in *note Makefile Conventions: (standards)Makefile Conventions.
-
- The `configure' shell script attempts to guess correct values for
-various system-dependent variables used during compilation. It uses
-those values to create a `Makefile' in each directory of the package.
-It may also create one or more `.h' files containing system-dependent
-definitions. Finally, it creates a shell script `config.status' that
-you can run in the future to recreate the current configuration, and a
-file `config.log' containing compiler output (useful mainly for
-debugging `configure').
-
- It can also use an optional file (typically called `config.cache'
-and enabled with `--cache-file=config.cache' or simply `-C') that saves
-the results of its tests to speed up reconfiguring. Caching is
-disabled by default to prevent problems with accidental use of stale
-cache files.
-
- If you need to do unusual things to compile the package, please try
-to figure out how `configure' could check whether to do them, and mail
-diffs or instructions to the address given in the `README' so they can
-be considered for the next release. If you are using the cache, and at
-some point `config.cache' contains results you don't want to keep, you
-may remove or edit it.
-
- The file `configure.ac' (or `configure.in') is used to create
-`configure' by a program called `autoconf'. You need `configure.ac' if
-you want to change it or regenerate `configure' using a newer version
-of `autoconf'.
-
- The simplest way to compile this package is:
-
- 1. `cd' to the directory containing the package's source code and type
- `./configure' to configure the package for your system.
-
- Running `configure' might take a while. While running, it prints
- some messages telling which features it is checking for.
-
- 2. Type `make' to compile the package.
-
- 3. Optionally, type `make check' to run any self-tests that come with
- the package, generally using the just-built uninstalled binaries.
-
- 4. Type `make install' to install the programs and any data files and
- documentation. When installing into a prefix owned by root, it is
- recommended that the package be configured and built as a regular
- user, and only the `make install' phase executed with root
- privileges.
-
- 5. Optionally, type `make installcheck' to repeat any self-tests, but
- this time using the binaries in their final installed location.
- This target does not install anything. Running this target as a
- regular user, particularly if the prior `make install' required
- root privileges, verifies that the installation completed
- correctly.
-
- 6. You can remove the program binaries and object files from the
- source code directory by typing `make clean'. To also remove the
- files that `configure' created (so you can compile the package for
- a different kind of computer), type `make distclean'. There is
- also a `make maintainer-clean' target, but that is intended mainly
- for the package's developers. If you use it, you may have to get
- all sorts of other programs in order to regenerate files that came
- with the distribution.
-
- 7. Often, you can also type `make uninstall' to remove the installed
- files again. In practice, not all packages have tested that
- uninstallation works correctly, even though it is required by the
- GNU Coding Standards.
-
- 8. Some packages, particularly those that use Automake, provide `make
- distcheck', which can by used by developers to test that all other
- targets like `make install' and `make uninstall' work correctly.
- This target is generally not run by end users.
-
-Compilers and Options
-=====================
-
- Some systems require unusual options for compilation or linking that
-the `configure' script does not know about. Run `./configure --help'
-for details on some of the pertinent environment variables.
-
- You can give `configure' initial values for configuration parameters
-by setting variables in the command line or in the environment. Here
-is an example:
-
- ./configure CC=c99 CFLAGS=-g LIBS=-lposix
-
- *Note Defining Variables::, for more details.
-
-Compiling For Multiple Architectures
-====================================
-
- You can compile the package for more than one kind of computer at the
-same time, by placing the object files for each architecture in their
-own directory. To do this, you can use GNU `make'. `cd' to the
-directory where you want the object files and executables to go and run
-the `configure' script. `configure' automatically checks for the
-source code in the directory that `configure' is in and in `..'. This
-is known as a "VPATH" build.
-
- With a non-GNU `make', it is safer to compile the package for one
-architecture at a time in the source code directory. After you have
-installed the package for one architecture, use `make distclean' before
-reconfiguring for another architecture.
-
- On MacOS X 10.5 and later systems, you can create libraries and
-executables that work on multiple system types--known as "fat" or
-"universal" binaries--by specifying multiple `-arch' options to the
-compiler but only a single `-arch' option to the preprocessor. Like
-this:
-
- ./configure CC="gcc -arch i386 -arch x86_64 -arch ppc -arch ppc64" \
- CXX="g++ -arch i386 -arch x86_64 -arch ppc -arch ppc64" \
- CPP="gcc -E" CXXCPP="g++ -E"
-
- This is not guaranteed to produce working output in all cases, you
-may have to build one architecture at a time and combine the results
-using the `lipo' tool if you have problems.
-
-Installation Names
-==================
-
- By default, `make install' installs the package's commands under
-`/usr/local/bin', include files under `/usr/local/include', etc. You
-can specify an installation prefix other than `/usr/local' by giving
-`configure' the option `--prefix=PREFIX', where PREFIX must be an
-absolute file name.
-
- You can specify separate installation prefixes for
-architecture-specific files and architecture-independent files. If you
-pass the option `--exec-prefix=PREFIX' to `configure', the package uses
-PREFIX as the prefix for installing programs and libraries.
-Documentation and other data files still use the regular prefix.
-
- In addition, if you use an unusual directory layout you can give
-options like `--bindir=DIR' to specify different values for particular
-kinds of files. Run `configure --help' for a list of the directories
-you can set and what kinds of files go in them. In general, the
-default for these options is expressed in terms of `${prefix}', so that
-specifying just `--prefix' will affect all of the other directory
-specifications that were not explicitly provided.
-
- The most portable way to affect installation locations is to pass the
-correct locations to `configure'; however, many packages provide one or
-both of the following shortcuts of passing variable assignments to the
-`make install' command line to change installation locations without
-having to reconfigure or recompile.
-
- The first method involves providing an override variable for each
-affected directory. For example, `make install
-prefix=/alternate/directory' will choose an alternate location for all
-directory configuration variables that were expressed in terms of
-`${prefix}'. Any directories that were specified during `configure',
-but not in terms of `${prefix}', must each be overridden at install
-time for the entire installation to be relocated. The approach of
-makefile variable overrides for each directory variable is required by
-the GNU Coding Standards, and ideally causes no recompilation.
-However, some platforms have known limitations with the semantics of
-shared libraries that end up requiring recompilation when using this
-method, particularly noticeable in packages that use GNU Libtool.
-
- The second method involves providing the `DESTDIR' variable. For
-example, `make install DESTDIR=/alternate/directory' will prepend
-`/alternate/directory' before all installation names. The approach of
-`DESTDIR' overrides is not required by the GNU Coding Standards, and
-does not work on platforms that have drive letters. On the other hand,
-it does better at avoiding recompilation issues, and works well even
-when some directory options were not specified in terms of `${prefix}'
-at `configure' time.
-
-Optional Features
-=================
-
- If the package supports it, you can cause programs to be installed
-with an extra prefix or suffix on their names by giving `configure' the
-option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'.
-
- Some packages pay attention to `--enable-FEATURE' options to
-`configure', where FEATURE indicates an optional part of the package.
-They may also pay attention to `--with-PACKAGE' options, where PACKAGE
-is something like `gnu-as' or `x' (for the X Window System). The
-`README' should mention any `--enable-' and `--with-' options that the
-package recognizes.
-
- For packages that use the X Window System, `configure' can usually
-find the X include and library files automatically, but if it doesn't,
-you can use the `configure' options `--x-includes=DIR' and
-`--x-libraries=DIR' to specify their locations.
-
- Some packages offer the ability to configure how verbose the
-execution of `make' will be. For these packages, running `./configure
---enable-silent-rules' sets the default to minimal output, which can be
-overridden with `make V=1'; while running `./configure
---disable-silent-rules' sets the default to verbose, which can be
-overridden with `make V=0'.
-
-Particular systems
-==================
-
- On HP-UX, the default C compiler is not ANSI C compatible. If GNU
-CC is not installed, it is recommended to use the following options in
-order to use an ANSI C compiler:
-
- ./configure CC="cc -Ae -D_XOPEN_SOURCE=500"
-
-and if that doesn't work, install pre-built binaries of GCC for HP-UX.
-
- HP-UX `make' updates targets which have the same time stamps as
-their prerequisites, which makes it generally unusable when shipped
-generated files such as `configure' are involved. Use GNU `make'
-instead.
-
- On OSF/1 a.k.a. Tru64, some versions of the default C compiler cannot
-parse its `<wchar.h>' header file. The option `-nodtk' can be used as
-a workaround. If GNU CC is not installed, it is therefore recommended
-to try
-
- ./configure CC="cc"
-
-and if that doesn't work, try
-
- ./configure CC="cc -nodtk"
-
- On Solaris, don't put `/usr/ucb' early in your `PATH'. This
-directory contains several dysfunctional programs; working variants of
-these programs are available in `/usr/bin'. So, if you need `/usr/ucb'
-in your `PATH', put it _after_ `/usr/bin'.
-
- On Haiku, software installed for all users goes in `/boot/common',
-not `/usr/local'. It is recommended to use the following options:
-
- ./configure --prefix=/boot/common
-
-Specifying the System Type
-==========================
-
- There may be some features `configure' cannot figure out
-automatically, but needs to determine by the type of machine the package
-will run on. Usually, assuming the package is built to be run on the
-_same_ architectures, `configure' can figure that out, but if it prints
-a message saying it cannot guess the machine type, give it the
-`--build=TYPE' option. TYPE can either be a short name for the system
-type, such as `sun4', or a canonical name which has the form:
-
- CPU-COMPANY-SYSTEM
-
-where SYSTEM can have one of these forms:
-
- OS
- KERNEL-OS
-
- See the file `config.sub' for the possible values of each field. If
-`config.sub' isn't included in this package, then this package doesn't
-need to know the machine type.
-
- If you are _building_ compiler tools for cross-compiling, you should
-use the option `--target=TYPE' to select the type of system they will
-produce code for.
-
- If you want to _use_ a cross compiler, that generates code for a
-platform different from the build platform, you should specify the
-"host" platform (i.e., that on which the generated programs will
-eventually be run) with `--host=TYPE'.
-
-Sharing Defaults
-================
-
- If you want to set default values for `configure' scripts to share,
-you can create a site shell script called `config.site' that gives
-default values for variables like `CC', `cache_file', and `prefix'.
-`configure' looks for `PREFIX/share/config.site' if it exists, then
-`PREFIX/etc/config.site' if it exists. Or, you can set the
-`CONFIG_SITE' environment variable to the location of the site script.
-A warning: not all `configure' scripts look for a site script.
-
-Defining Variables
-==================
-
- Variables not defined in a site shell script can be set in the
-environment passed to `configure'. However, some packages may run
-configure again during the build, and the customized values of these
-variables may be lost. In order to avoid this problem, you should set
-them in the `configure' command line, using `VAR=value'. For example:
-
- ./configure CC=/usr/local2/bin/gcc
-
-causes the specified `gcc' to be used as the C compiler (unless it is
-overridden in the site shell script).
-
-Unfortunately, this technique does not work for `CONFIG_SHELL' due to
-an Autoconf bug. Until the bug is fixed you can use this workaround:
-
- CONFIG_SHELL=/bin/bash /bin/bash ./configure CONFIG_SHELL=/bin/bash
-
-`configure' Invocation
-======================
-
- `configure' recognizes the following options to control how it
-operates.
-
-`--help'
-`-h'
- Print a summary of all of the options to `configure', and exit.
-
-`--help=short'
-`--help=recursive'
- Print a summary of the options unique to this package's
- `configure', and exit. The `short' variant lists options used
- only in the top level, while the `recursive' variant lists options
- also present in any nested packages.
-
-`--version'
-`-V'
- Print the version of Autoconf used to generate the `configure'
- script, and exit.
-
-`--cache-file=FILE'
- Enable the cache: use and save the results of the tests in FILE,
- traditionally `config.cache'. FILE defaults to `/dev/null' to
- disable caching.
-
-`--config-cache'
-`-C'
- Alias for `--cache-file=config.cache'.
-
-`--quiet'
-`--silent'
-`-q'
- Do not print messages saying which checks are being made. To
- suppress all normal output, redirect it to `/dev/null' (any error
- messages will still be shown).
-
-`--srcdir=DIR'
- Look for the package's source code in directory DIR. Usually
- `configure' can determine that directory automatically.
-
-`--prefix=DIR'
- Use DIR as the installation prefix. *note Installation Names::
- for more details, including other options available for fine-tuning
- the installation locations.
-
-`--no-create'
-`-n'
- Run the configure checks, but stop before creating any output
- files.
-
-`configure' also accepts some other, not widely useful, options. Run
-`configure --help' for more details.
-
diff --git a/Makefile.am b/Makefile.am
index b0641e7..4d4e4d6 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -23,8 +23,12 @@
ACLOCAL_AMFLAGS = -I macros
-SUBDIRS=linbox macros tests interfaces doc examples benchmarks
+SUBDIRS=linbox benchmarks macros tests interfaces doc examples
+pkgconfigdir = $(libdir)/pkgconfig
+pkgconfig_DATA = linbox.pc
+
+# include_HEADERS=linbox-config.h
# I intend to pare down the target "check" so as to be a smaller check used
# at installation time with a focus on confirming that dependencies on
# other packages and compilation environment are in order. In contrast, the
@@ -33,7 +37,8 @@ SUBDIRS=linbox macros tests interfaces doc examples benchmarks
# Fullcheck provides a full check for regression testing purposes.
fullcheck:
- (${MAKE} ; cd tests; ${MAKE} fullcheck)
+ (${MAKE} ; cd tests; ${MAKE} fullcheck )
+ ${MAKE} examples
docs:doc/linbox-html/index.html
@@ -46,11 +51,19 @@ doc/linbox-dev-html/pages.html:
(cd doc; ${MAKE} docs_dev)
examples:
- ( ${MAKE} ; cd examples; ${MAKE} examples)
+ (${MAKE} install; cd examples; ${MAKE} examples; ./test.sh)
benchmarks:
(cd benchmarks; ${MAKE} benchmarks)
+perfpublisher: benchmarks/perfpublisher tests/perfpublisher
+
+benchmarks/perfpublisher:
+ (cd benchmarks; ${MAKE} perfpublisher)
+
+tests/perfpublisher:
+ (cd tests; ${MAKE} perfpublisher)
+
.PHONY:examples benchmarks
bin_SCRIPTS=linbox-config
@@ -64,14 +77,19 @@ uninstall-hook:
"$(mandir)/man1" \
"$(mandir)" \
"$(includedir)/linbox/algorithms/gauss" \
+ "$(includedir)/linbox/algorithms/IML" \
+ "$(includedir)/linbox/algorithms/matrix-blas3" \
"$(includedir)/linbox/algorithms" \
"$(includedir)/linbox/blackbox" \
"$(includedir)/linbox/element" \
- "$(includedir)/linbox/field/Givaro" \
- "$(includedir)/linbox/field/Modular" \
- "$(includedir)/linbox/field/NTL" \
+ "$(includedir)/linbox/ring/modular" \
+ "$(includedir)/linbox/ring/ntl" \
"$(includedir)/linbox/field/" \
"$(includedir)/linbox/kaapi" \
+ "$(includedir)/linbox/matrix/sparsematrix" \
+ "$(includedir)/linbox/matrix/densedatrix" \
+ "$(includedir)/linbox/matrix/matrixdomain" \
+ "$(includedir)/linbox/matrix/sliced3" \
"$(includedir)/linbox/matrix" \
"$(includedir)/linbox/randiter" \
"$(includedir)/linbox/ring" \
@@ -84,7 +102,11 @@ uninstall-hook:
"$(datarootdir)/" \
"$(includedir)" ) || true
-VERSION=1.3.2
+git:
+ git commit -a; git pull; git push
+
+
+VERSION=1.4.1
EXTRA_DIST=auto-install.sh
#incremente-versions
diff --git a/Makefile.in b/Makefile.in
deleted file mode 100644
index 0839154..0000000
--- a/Makefile.in
+++ /dev/null
@@ -1,983 +0,0 @@
-# Makefile.in generated by automake 1.11.5 from Makefile.am.
-# @configure_input@
-
-# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software
-# Foundation, Inc.
-# This Makefile.in is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
-# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
-# PARTICULAR PURPOSE.
-
- at SET_MAKE@
-
-# Copyright (c) 2010 the LinBox group
-#
-# ========LICENCE========
-# This file is part of the library LinBox.
-#
-# LinBox is free software: you can redistribute it and/or modify
-# it under the terms of the GNU Lesser General Public
-# License as published by the Free Software Foundation; either
-# version 2.1 of the License, or (at your option) any later version.
-#
-# This library 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
-# Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public
-# License along with this library; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
-# ========LICENCE========
-#/
-
-VPATH = @srcdir@
-am__make_dryrun = \
- { \
- am__dry=no; \
- case $$MAKEFLAGS in \
- *\\[\ \ ]*) \
- echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \
- | grep '^AM OK$$' >/dev/null || am__dry=yes;; \
- *) \
- for am__flg in $$MAKEFLAGS; do \
- case $$am__flg in \
- *=*|--*) ;; \
- *n*) am__dry=yes; break;; \
- esac; \
- done;; \
- esac; \
- test $$am__dry = yes; \
- }
-pkgdatadir = $(datadir)/@PACKAGE@
-pkgincludedir = $(includedir)/@PACKAGE@
-pkglibdir = $(libdir)/@PACKAGE@
-pkglibexecdir = $(libexecdir)/@PACKAGE@
-am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
-install_sh_DATA = $(install_sh) -c -m 644
-install_sh_PROGRAM = $(install_sh) -c
-install_sh_SCRIPT = $(install_sh) -c
-INSTALL_HEADER = $(INSTALL_DATA)
-transform = $(program_transform_name)
-NORMAL_INSTALL = :
-PRE_INSTALL = :
-POST_INSTALL = :
-NORMAL_UNINSTALL = :
-PRE_UNINSTALL = :
-POST_UNINSTALL = :
-build_triplet = @build@
-host_triplet = @host@
-subdir = .
-DIST_COMMON = README $(am__configure_deps) $(srcdir)/Makefile.am \
- $(srcdir)/Makefile.in $(srcdir)/config.h.in \
- $(srcdir)/linbox-config.in $(top_srcdir)/configure AUTHORS \
- COPYING COPYING.LESSER ChangeLog INSTALL NEWS TODO \
- build-aux/config.guess build-aux/config.sub \
- build-aux/install-sh build-aux/ltmain.sh build-aux/missing
-ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-am__aclocal_m4_deps = $(top_srcdir)/macros/aclocal-include.m4 \
- $(top_srcdir)/macros/config-header.m4 \
- $(top_srcdir)/macros/debug.m4 \
- $(top_srcdir)/macros/expat-check.m4 \
- $(top_srcdir)/macros/fflas-ffpack-check.m4 \
- $(top_srcdir)/macros/fplll-check.m4 \
- $(top_srcdir)/macros/givaro-check.m4 \
- $(top_srcdir)/macros/gmp-check.m4 \
- $(top_srcdir)/macros/iml-check.m4 \
- $(top_srcdir)/macros/lapack-check.m4 \
- $(top_srcdir)/macros/libtool.m4 \
- $(top_srcdir)/macros/lidia-check.m4 \
- $(top_srcdir)/macros/linbox-benchmark.m4 \
- $(top_srcdir)/macros/linbox-doc.m4 \
- $(top_srcdir)/macros/linbox-misc.m4 \
- $(top_srcdir)/macros/linbox-opt.m4 \
- $(top_srcdir)/macros/ltoptions.m4 \
- $(top_srcdir)/macros/ltsugar.m4 \
- $(top_srcdir)/macros/ltversion.m4 \
- $(top_srcdir)/macros/lt~obsolete.m4 \
- $(top_srcdir)/macros/m4ri-check.m4 \
- $(top_srcdir)/macros/m4rie-check.m4 \
- $(top_srcdir)/macros/maple-check.m4 \
- $(top_srcdir)/macros/mpfr-check.m4 \
- $(top_srcdir)/macros/ntl-check.m4 \
- $(top_srcdir)/macros/saclib-check.m4 \
- $(top_srcdir)/macros/sage-check.m4 $(top_srcdir)/configure.ac
-am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
- $(ACLOCAL_M4)
-am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \
- configure.lineno config.status.lineno
-mkinstalldirs = $(install_sh) -d
-CONFIG_HEADER = config.h
-CONFIG_CLEAN_FILES = linbox-config
-CONFIG_CLEAN_VPATH_FILES =
-am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
-am__vpath_adj = case $$p in \
- $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
- *) f=$$p;; \
- esac;
-am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
-am__install_max = 40
-am__nobase_strip_setup = \
- srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
-am__nobase_strip = \
- for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
-am__nobase_list = $(am__nobase_strip_setup); \
- for p in $$list; do echo "$$p $$p"; done | \
- sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
- $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
- if (++n[$$2] == $(am__install_max)) \
- { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
- END { for (dir in files) print dir, files[dir] }'
-am__base_list = \
- sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
- sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
-am__uninstall_files_from_dir = { \
- test -z "$$files" \
- || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \
- || { echo " ( cd '$$dir' && rm -f" $$files ")"; \
- $(am__cd) "$$dir" && rm -f $$files; }; \
- }
-am__installdirs = "$(DESTDIR)$(bindir)"
-SCRIPTS = $(bin_SCRIPTS)
-depcomp =
-am__depfiles_maybe =
-SOURCES =
-DIST_SOURCES =
-RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \
- html-recursive info-recursive install-data-recursive \
- install-dvi-recursive install-exec-recursive \
- install-html-recursive install-info-recursive \
- install-pdf-recursive install-ps-recursive install-recursive \
- installcheck-recursive installdirs-recursive pdf-recursive \
- ps-recursive uninstall-recursive
-am__can_run_installinfo = \
- case $$AM_UPDATE_INFO_DIR in \
- n|no|NO) false;; \
- *) (install-info --version) >/dev/null 2>&1;; \
- esac
-RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \
- distclean-recursive maintainer-clean-recursive
-AM_RECURSIVE_TARGETS = $(RECURSIVE_TARGETS:-recursive=) \
- $(RECURSIVE_CLEAN_TARGETS:-recursive=) tags TAGS ctags CTAGS \
- distdir dist dist-all distcheck
-ETAGS = etags
-CTAGS = ctags
-DIST_SUBDIRS = $(SUBDIRS)
-DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
-distdir = $(PACKAGE)-$(VERSION)
-top_distdir = $(distdir)
-am__remove_distdir = \
- if test -d "$(distdir)"; then \
- find "$(distdir)" -type d ! -perm -200 -exec chmod u+w {} ';' \
- && rm -rf "$(distdir)" \
- || { sleep 5 && rm -rf "$(distdir)"; }; \
- else :; fi
-am__relativize = \
- dir0=`pwd`; \
- sed_first='s,^\([^/]*\)/.*$$,\1,'; \
- sed_rest='s,^[^/]*/*,,'; \
- sed_last='s,^.*/\([^/]*\)$$,\1,'; \
- sed_butlast='s,/*[^/]*$$,,'; \
- while test -n "$$dir1"; do \
- first=`echo "$$dir1" | sed -e "$$sed_first"`; \
- if test "$$first" != "."; then \
- if test "$$first" = ".."; then \
- dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \
- dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \
- else \
- first2=`echo "$$dir2" | sed -e "$$sed_first"`; \
- if test "$$first2" = "$$first"; then \
- dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \
- else \
- dir2="../$$dir2"; \
- fi; \
- dir0="$$dir0"/"$$first"; \
- fi; \
- fi; \
- dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \
- done; \
- reldir="$$dir2"
-DIST_ARCHIVES = $(distdir).tar.gz
-GZIP_ENV = --best
-distuninstallcheck_listfiles = find . -type f -print
-am__distuninstallcheck_listfiles = $(distuninstallcheck_listfiles) \
- | sed 's|^\./|$(prefix)/|' | grep -v '$(infodir)/dir$$'
-distcleancheck_listfiles = find . -type f -print
-ACLOCAL = @ACLOCAL@
-AMTAR = @AMTAR@
-AR = @AR@
-AUTOCONF = @AUTOCONF@
-AUTOHEADER = @AUTOHEADER@
-AUTOMAKE = @AUTOMAKE@
-AWK = @AWK@
-BLAS_CFLAGS = @BLAS_CFLAGS@
-BLAS_LIBS = @BLAS_LIBS@
-CC = @CC@
-CCNAM = @CCNAM@
-CFLAGS = @CFLAGS@
-CPPFLAGS = @CPPFLAGS@
-CXX = @CXX@
-CXXCPP = @CXXCPP@
-CXXFLAGS = @CXXFLAGS@
-CYGPATH_W = @CYGPATH_W@
-DBG = @DBG@
-DEBUG_CFLAGS = @DEBUG_CFLAGS@
-DEFAULT_CFLAGS = @DEFAULT_CFLAGS@
-DEFS = @DEFS@
-DLLTOOL = @DLLTOOL@
-DSYMUTIL = @DSYMUTIL@
-DUMPBIN = @DUMPBIN@
-ECHO_C = @ECHO_C@
-ECHO_N = @ECHO_N@
-ECHO_T = @ECHO_T@
-EGREP = @EGREP@
-EXEEXT = @EXEEXT@
-EXPAT_CFLAGS = @EXPAT_CFLAGS@
-EXPAT_LIBS = @EXPAT_LIBS@
-FFLAS_FFPACK_CFLAGS = @FFLAS_FFPACK_CFLAGS@
-FFLAS_FFPACK_LIBS = @FFLAS_FFPACK_LIBS@
-FFLAS_FFPACK_LOC = @FFLAS_FFPACK_LOC@
-FGREP = @FGREP@
-FPLLL_CFLAGS = @FPLLL_CFLAGS@
-FPLLL_LIBS = @FPLLL_LIBS@
-GIVARO_CFLAGS = @GIVARO_CFLAGS@
-GIVARO_LIBS = @GIVARO_LIBS@
-GMP_CFLAGS = @GMP_CFLAGS@
-GMP_LIBS = @GMP_LIBS@
-GMP_VERSION = @GMP_VERSION@
-GREP = @GREP@
-IML_CFLAGS = @IML_CFLAGS@
-IML_LIBS = @IML_LIBS@
-INSTALL = @INSTALL@
-INSTALL_DATA = @INSTALL_DATA@
-INSTALL_PROGRAM = @INSTALL_PROGRAM@
-INSTALL_SCRIPT = @INSTALL_SCRIPT@
-INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
-LD = @LD@
-LDFLAGS = @LDFLAGS@
-LIBOBJS = @LIBOBJS@
-LIBS = @LIBS@
-LIBTOOL = @LIBTOOL@
-LIDIA_CFLAGS = @LIDIA_CFLAGS@
-LIDIA_LIBS = @LIDIA_LIBS@
-LINBOX_BENCH_PATH = @LINBOX_BENCH_PATH@
-LINBOX_DOC_PATH = @LINBOX_DOC_PATH@
-LIPO = @LIPO@
-LN_S = @LN_S@
-LTLIBOBJS = @LTLIBOBJS@
-M4RIE_CFLAGS = @M4RIE_CFLAGS@
-M4RIE_LIBS = @M4RIE_LIBS@
-M4RI_CFLAGS = @M4RI_CFLAGS@
-M4RI_LIBS = @M4RI_LIBS@
-MAINT = @MAINT@
-MAKEINFO = @MAKEINFO@
-MANIFEST_TOOL = @MANIFEST_TOOL@
-MAPLE_CFLAGS = @MAPLE_CFLAGS@
-MAPLE_HOME = @MAPLE_HOME@
-MAPLE_LIBS = @MAPLE_LIBS@
-MAPLE_VERSION = @MAPLE_VERSION@
-MKDIR_P = @MKDIR_P@
-MPFR_CFLAGS = @MPFR_CFLAGS@
-MPFR_LIBS = @MPFR_LIBS@
-NM = @NM@
-NMEDIT = @NMEDIT@
-NTL_CFLAGS = @NTL_CFLAGS@
-NTL_LIBS = @NTL_LIBS@
-OBJDUMP = @OBJDUMP@
-OBJEXT = @OBJEXT@
-OTOOL = @OTOOL@
-OTOOL64 = @OTOOL64@
-PACKAGE = @PACKAGE@
-PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
-PACKAGE_NAME = @PACKAGE_NAME@
-PACKAGE_STRING = @PACKAGE_STRING@
-PACKAGE_TARNAME = @PACKAGE_TARNAME@
-PACKAGE_URL = @PACKAGE_URL@
-PACKAGE_VERSION = @PACKAGE_VERSION@
-PATH_SEPARATOR = @PATH_SEPARATOR@
-PROF = @PROF@
-RANLIB = @RANLIB@
-RM = @RM@
-SACLIB_CFLAGS = @SACLIB_CFLAGS@
-SACLIB_LIBS = @SACLIB_LIBS@
-SED = @SED@
-SET_MAKE = @SET_MAKE@
-SHELL = @SHELL@
-STRIP = @STRIP@
-TESTS_CFLAGS = @TESTS_CFLAGS@
-VERSION = 1.3.2
-WARN = @WARN@
-abs_builddir = @abs_builddir@
-abs_srcdir = @abs_srcdir@
-abs_top_builddir = @abs_top_builddir@
-abs_top_srcdir = @abs_top_srcdir@
-ac_ct_AR = @ac_ct_AR@
-ac_ct_CC = @ac_ct_CC@
-ac_ct_CXX = @ac_ct_CXX@
-ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
-am__leading_dot = @am__leading_dot@
-am__tar = @am__tar@
-am__untar = @am__untar@
-bindir = @bindir@
-build = @build@
-build_alias = @build_alias@
-build_cpu = @build_cpu@
-build_os = @build_os@
-build_vendor = @build_vendor@
-builddir = @builddir@
-datadir = @datadir@
-datarootdir = @datarootdir@
-docdir = @docdir@
-dvidir = @dvidir@
-exec_prefix = @exec_prefix@
-host = @host@
-host_alias = @host_alias@
-host_cpu = @host_cpu@
-host_os = @host_os@
-host_vendor = @host_vendor@
-htmldir = @htmldir@
-includedir = @includedir@
-infodir = @infodir@
-install_sh = @install_sh@
-libdir = @libdir@
-libexecdir = @libexecdir@
-localedir = @localedir@
-localstatedir = @localstatedir@
-mandir = @mandir@
-mkdir_p = @mkdir_p@
-oldincludedir = @oldincludedir@
-pdfdir = @pdfdir@
-prefix = @prefix@
-program_transform_name = @program_transform_name@
-psdir = @psdir@
-sbindir = @sbindir@
-sharedstatedir = @sharedstatedir@
-srcdir = @srcdir@
-sysconfdir = @sysconfdir@
-target_alias = @target_alias@
-top_build_prefix = @top_build_prefix@
-top_builddir = @top_builddir@
-top_srcdir = @top_srcdir@
-ACLOCAL_AMFLAGS = -I macros
-SUBDIRS = linbox macros tests interfaces doc examples benchmarks
-bin_SCRIPTS = linbox-config
-EXTRA_DIST = auto-install.sh
-all: config.h
- $(MAKE) $(AM_MAKEFLAGS) all-recursive
-
-.SUFFIXES:
-am--refresh: Makefile
- @:
-$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps)
- @for dep in $?; do \
- case '$(am__configure_deps)' in \
- *$$dep*) \
- echo ' cd $(srcdir) && $(AUTOMAKE) --gnu --ignore-deps'; \
- $(am__cd) $(srcdir) && $(AUTOMAKE) --gnu --ignore-deps \
- && exit 0; \
- exit 1;; \
- esac; \
- done; \
- echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu --ignore-deps Makefile'; \
- $(am__cd) $(top_srcdir) && \
- $(AUTOMAKE) --gnu --ignore-deps Makefile
-.PRECIOUS: Makefile
-Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
- @case '$?' in \
- *config.status*) \
- echo ' $(SHELL) ./config.status'; \
- $(SHELL) ./config.status;; \
- *) \
- echo ' cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe)'; \
- cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe);; \
- esac;
-
-$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
- $(SHELL) ./config.status --recheck
-
-$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
- $(am__cd) $(srcdir) && $(AUTOCONF)
-$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
- $(am__cd) $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS)
-$(am__aclocal_m4_deps):
-
-config.h: stamp-h1
- @if test ! -f $@; then rm -f stamp-h1; else :; fi
- @if test ! -f $@; then $(MAKE) $(AM_MAKEFLAGS) stamp-h1; else :; fi
-
-stamp-h1: $(srcdir)/config.h.in $(top_builddir)/config.status
- @rm -f stamp-h1
- cd $(top_builddir) && $(SHELL) ./config.status config.h
-$(srcdir)/config.h.in: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
- ($(am__cd) $(top_srcdir) && $(AUTOHEADER))
- rm -f stamp-h1
- touch $@
-
-distclean-hdr:
- -rm -f config.h stamp-h1
-linbox-config: $(top_builddir)/config.status $(srcdir)/linbox-config.in
- cd $(top_builddir) && $(SHELL) ./config.status $@
-install-binSCRIPTS: $(bin_SCRIPTS)
- @$(NORMAL_INSTALL)
- @list='$(bin_SCRIPTS)'; test -n "$(bindir)" || list=; \
- if test -n "$$list"; then \
- echo " $(MKDIR_P) '$(DESTDIR)$(bindir)'"; \
- $(MKDIR_P) "$(DESTDIR)$(bindir)" || exit 1; \
- fi; \
- for p in $$list; do \
- if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
- if test -f "$$d$$p"; then echo "$$d$$p"; echo "$$p"; else :; fi; \
- done | \
- sed -e 'p;s,.*/,,;n' \
- -e 'h;s|.*|.|' \
- -e 'p;x;s,.*/,,;$(transform)' | sed 'N;N;N;s,\n, ,g' | \
- $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1; } \
- { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \
- if ($$2 == $$4) { files[d] = files[d] " " $$1; \
- if (++n[d] == $(am__install_max)) { \
- print "f", d, files[d]; n[d] = 0; files[d] = "" } } \
- else { print "f", d "/" $$4, $$1 } } \
- END { for (d in files) print "f", d, files[d] }' | \
- while read type dir files; do \
- if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \
- test -z "$$files" || { \
- echo " $(INSTALL_SCRIPT) $$files '$(DESTDIR)$(bindir)$$dir'"; \
- $(INSTALL_SCRIPT) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \
- } \
- ; done
-
-uninstall-binSCRIPTS:
- @$(NORMAL_UNINSTALL)
- @list='$(bin_SCRIPTS)'; test -n "$(bindir)" || exit 0; \
- files=`for p in $$list; do echo "$$p"; done | \
- sed -e 's,.*/,,;$(transform)'`; \
- dir='$(DESTDIR)$(bindir)'; $(am__uninstall_files_from_dir)
-
-mostlyclean-libtool:
- -rm -f *.lo
-
-clean-libtool:
- -rm -rf .libs _libs
-
-distclean-libtool:
- -rm -f libtool config.lt
-
-# This directory's subdirectories are mostly independent; you can cd
-# into them and run `make' without going through this Makefile.
-# To change the values of `make' variables: instead of editing Makefiles,
-# (1) if the variable is set in `config.status', edit `config.status'
-# (which will cause the Makefiles to be regenerated when you run `make');
-# (2) otherwise, pass the desired values on the `make' command line.
-$(RECURSIVE_TARGETS):
- @fail= failcom='exit 1'; \
- for f in x $$MAKEFLAGS; do \
- case $$f in \
- *=* | --[!k]*);; \
- *k*) failcom='fail=yes';; \
- esac; \
- done; \
- dot_seen=no; \
- target=`echo $@ | sed s/-recursive//`; \
- list='$(SUBDIRS)'; for subdir in $$list; do \
- echo "Making $$target in $$subdir"; \
- if test "$$subdir" = "."; then \
- dot_seen=yes; \
- local_target="$$target-am"; \
- else \
- local_target="$$target"; \
- fi; \
- ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
- || eval $$failcom; \
- done; \
- if test "$$dot_seen" = "no"; then \
- $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \
- fi; test -z "$$fail"
-
-$(RECURSIVE_CLEAN_TARGETS):
- @fail= failcom='exit 1'; \
- for f in x $$MAKEFLAGS; do \
- case $$f in \
- *=* | --[!k]*);; \
- *k*) failcom='fail=yes';; \
- esac; \
- done; \
- dot_seen=no; \
- case "$@" in \
- distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \
- *) list='$(SUBDIRS)' ;; \
- esac; \
- rev=''; for subdir in $$list; do \
- if test "$$subdir" = "."; then :; else \
- rev="$$subdir $$rev"; \
- fi; \
- done; \
- rev="$$rev ."; \
- target=`echo $@ | sed s/-recursive//`; \
- for subdir in $$rev; do \
- echo "Making $$target in $$subdir"; \
- if test "$$subdir" = "."; then \
- local_target="$$target-am"; \
- else \
- local_target="$$target"; \
- fi; \
- ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
- || eval $$failcom; \
- done && test -z "$$fail"
-tags-recursive:
- list='$(SUBDIRS)'; for subdir in $$list; do \
- test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \
- done
-ctags-recursive:
- list='$(SUBDIRS)'; for subdir in $$list; do \
- test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \
- done
-
-ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
- list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
- unique=`for i in $$list; do \
- if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
- done | \
- $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
- END { if (nonempty) { for (i in files) print i; }; }'`; \
- mkid -fID $$unique
-tags: TAGS
-
-TAGS: tags-recursive $(HEADERS) $(SOURCES) config.h.in $(TAGS_DEPENDENCIES) \
- $(TAGS_FILES) $(LISP)
- set x; \
- here=`pwd`; \
- if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \
- include_option=--etags-include; \
- empty_fix=.; \
- else \
- include_option=--include; \
- empty_fix=; \
- fi; \
- list='$(SUBDIRS)'; for subdir in $$list; do \
- if test "$$subdir" = .; then :; else \
- test ! -f $$subdir/TAGS || \
- set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \
- fi; \
- done; \
- list='$(SOURCES) $(HEADERS) config.h.in $(LISP) $(TAGS_FILES)'; \
- unique=`for i in $$list; do \
- if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
- done | \
- $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
- END { if (nonempty) { for (i in files) print i; }; }'`; \
- shift; \
- if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
- test -n "$$unique" || unique=$$empty_fix; \
- if test $$# -gt 0; then \
- $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
- "$$@" $$unique; \
- else \
- $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
- $$unique; \
- fi; \
- fi
-ctags: CTAGS
-CTAGS: ctags-recursive $(HEADERS) $(SOURCES) config.h.in $(TAGS_DEPENDENCIES) \
- $(TAGS_FILES) $(LISP)
- list='$(SOURCES) $(HEADERS) config.h.in $(LISP) $(TAGS_FILES)'; \
- unique=`for i in $$list; do \
- if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
- done | \
- $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
- END { if (nonempty) { for (i in files) print i; }; }'`; \
- test -z "$(CTAGS_ARGS)$$unique" \
- || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
- $$unique
-
-GTAGS:
- here=`$(am__cd) $(top_builddir) && pwd` \
- && $(am__cd) $(top_srcdir) \
- && gtags -i $(GTAGS_ARGS) "$$here"
-
-distclean-tags:
- -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
-
-distdir: $(DISTFILES)
- $(am__remove_distdir)
- test -d "$(distdir)" || mkdir "$(distdir)"
- @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
- topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
- list='$(DISTFILES)'; \
- dist_files=`for file in $$list; do echo $$file; done | \
- sed -e "s|^$$srcdirstrip/||;t" \
- -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
- case $$dist_files in \
- */*) $(MKDIR_P) `echo "$$dist_files" | \
- sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
- sort -u` ;; \
- esac; \
- for file in $$dist_files; do \
- if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
- if test -d $$d/$$file; then \
- dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
- if test -d "$(distdir)/$$file"; then \
- find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
- fi; \
- if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
- cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
- find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
- fi; \
- cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
- else \
- test -f "$(distdir)/$$file" \
- || cp -p $$d/$$file "$(distdir)/$$file" \
- || exit 1; \
- fi; \
- done
- @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \
- if test "$$subdir" = .; then :; else \
- $(am__make_dryrun) \
- || test -d "$(distdir)/$$subdir" \
- || $(MKDIR_P) "$(distdir)/$$subdir" \
- || exit 1; \
- dir1=$$subdir; dir2="$(distdir)/$$subdir"; \
- $(am__relativize); \
- new_distdir=$$reldir; \
- dir1=$$subdir; dir2="$(top_distdir)"; \
- $(am__relativize); \
- new_top_distdir=$$reldir; \
- echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \
- echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \
- ($(am__cd) $$subdir && \
- $(MAKE) $(AM_MAKEFLAGS) \
- top_distdir="$$new_top_distdir" \
- distdir="$$new_distdir" \
- am__remove_distdir=: \
- am__skip_length_check=: \
- am__skip_mode_fix=: \
- distdir) \
- || exit 1; \
- fi; \
- done
- -test -n "$(am__skip_mode_fix)" \
- || find "$(distdir)" -type d ! -perm -755 \
- -exec chmod u+rwx,go+rx {} \; -o \
- ! -type d ! -perm -444 -links 1 -exec chmod a+r {} \; -o \
- ! -type d ! -perm -400 -exec chmod a+r {} \; -o \
- ! -type d ! -perm -444 -exec $(install_sh) -c -m a+r {} {} \; \
- || chmod -R a+r "$(distdir)"
-dist-gzip: distdir
- tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz
- $(am__remove_distdir)
-
-dist-bzip2: distdir
- tardir=$(distdir) && $(am__tar) | BZIP2=$${BZIP2--9} bzip2 -c >$(distdir).tar.bz2
- $(am__remove_distdir)
-
-dist-lzip: distdir
- tardir=$(distdir) && $(am__tar) | lzip -c $${LZIP_OPT--9} >$(distdir).tar.lz
- $(am__remove_distdir)
-
-dist-lzma: distdir
- tardir=$(distdir) && $(am__tar) | lzma -9 -c >$(distdir).tar.lzma
- $(am__remove_distdir)
-
-dist-xz: distdir
- tardir=$(distdir) && $(am__tar) | XZ_OPT=$${XZ_OPT--e} xz -c >$(distdir).tar.xz
- $(am__remove_distdir)
-
-dist-tarZ: distdir
- tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z
- $(am__remove_distdir)
-
-dist-shar: distdir
- shar $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).shar.gz
- $(am__remove_distdir)
-
-dist-zip: distdir
- -rm -f $(distdir).zip
- zip -rq $(distdir).zip $(distdir)
- $(am__remove_distdir)
-
-dist dist-all: distdir
- tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz
- $(am__remove_distdir)
-
-# This target untars the dist file and tries a VPATH configuration. Then
-# it guarantees that the distribution is self-contained by making another
-# tarfile.
-distcheck: dist
- case '$(DIST_ARCHIVES)' in \
- *.tar.gz*) \
- GZIP=$(GZIP_ENV) gzip -dc $(distdir).tar.gz | $(am__untar) ;;\
- *.tar.bz2*) \
- bzip2 -dc $(distdir).tar.bz2 | $(am__untar) ;;\
- *.tar.lzma*) \
- lzma -dc $(distdir).tar.lzma | $(am__untar) ;;\
- *.tar.lz*) \
- lzip -dc $(distdir).tar.lz | $(am__untar) ;;\
- *.tar.xz*) \
- xz -dc $(distdir).tar.xz | $(am__untar) ;;\
- *.tar.Z*) \
- uncompress -c $(distdir).tar.Z | $(am__untar) ;;\
- *.shar.gz*) \
- GZIP=$(GZIP_ENV) gzip -dc $(distdir).shar.gz | unshar ;;\
- *.zip*) \
- unzip $(distdir).zip ;;\
- esac
- chmod -R a-w $(distdir); chmod a+w $(distdir)
- mkdir $(distdir)/_build
- mkdir $(distdir)/_inst
- chmod a-w $(distdir)
- test -d $(distdir)/_build || exit 0; \
- dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \
- && dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \
- && am__cwd=`pwd` \
- && $(am__cd) $(distdir)/_build \
- && ../configure --srcdir=.. --prefix="$$dc_install_base" \
- $(AM_DISTCHECK_CONFIGURE_FLAGS) \
- $(DISTCHECK_CONFIGURE_FLAGS) \
- && $(MAKE) $(AM_MAKEFLAGS) \
- && $(MAKE) $(AM_MAKEFLAGS) dvi \
- && $(MAKE) $(AM_MAKEFLAGS) check \
- && $(MAKE) $(AM_MAKEFLAGS) install \
- && $(MAKE) $(AM_MAKEFLAGS) installcheck \
- && $(MAKE) $(AM_MAKEFLAGS) uninstall \
- && $(MAKE) $(AM_MAKEFLAGS) distuninstallcheck_dir="$$dc_install_base" \
- distuninstallcheck \
- && chmod -R a-w "$$dc_install_base" \
- && ({ \
- (cd ../.. && umask 077 && mkdir "$$dc_destdir") \
- && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" install \
- && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" uninstall \
- && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" \
- distuninstallcheck_dir="$$dc_destdir" distuninstallcheck; \
- } || { rm -rf "$$dc_destdir"; exit 1; }) \
- && rm -rf "$$dc_destdir" \
- && $(MAKE) $(AM_MAKEFLAGS) dist \
- && rm -rf $(DIST_ARCHIVES) \
- && $(MAKE) $(AM_MAKEFLAGS) distcleancheck \
- && cd "$$am__cwd" \
- || exit 1
- $(am__remove_distdir)
- @(echo "$(distdir) archives ready for distribution: "; \
- list='$(DIST_ARCHIVES)'; for i in $$list; do echo $$i; done) | \
- sed -e 1h -e 1s/./=/g -e 1p -e 1x -e '$$p' -e '$$x'
-distuninstallcheck:
- @test -n '$(distuninstallcheck_dir)' || { \
- echo 'ERROR: trying to run $@ with an empty' \
- '$$(distuninstallcheck_dir)' >&2; \
- exit 1; \
- }; \
- $(am__cd) '$(distuninstallcheck_dir)' || { \
- echo 'ERROR: cannot chdir into $(distuninstallcheck_dir)' >&2; \
- exit 1; \
- }; \
- test `$(am__distuninstallcheck_listfiles) | wc -l` -eq 0 \
- || { echo "ERROR: files left after uninstall:" ; \
- if test -n "$(DESTDIR)"; then \
- echo " (check DESTDIR support)"; \
- fi ; \
- $(distuninstallcheck_listfiles) ; \
- exit 1; } >&2
-distcleancheck: distclean
- @if test '$(srcdir)' = . ; then \
- echo "ERROR: distcleancheck can only run from a VPATH build" ; \
- exit 1 ; \
- fi
- @test `$(distcleancheck_listfiles) | wc -l` -eq 0 \
- || { echo "ERROR: files left in build directory after distclean:" ; \
- $(distcleancheck_listfiles) ; \
- exit 1; } >&2
-check-am: all-am
-check: check-recursive
-all-am: Makefile $(SCRIPTS) config.h
-installdirs: installdirs-recursive
-installdirs-am:
- for dir in "$(DESTDIR)$(bindir)"; do \
- test -z "$$dir" || $(MKDIR_P) "$$dir"; \
- done
-install: install-recursive
-install-exec: install-exec-recursive
-install-data: install-data-recursive
-uninstall: uninstall-recursive
-
-install-am: all-am
- @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
-
-installcheck: installcheck-recursive
-install-strip:
- if test -z '$(STRIP)'; then \
- $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
- install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
- install; \
- else \
- $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
- install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
- "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
- fi
-mostlyclean-generic:
-
-clean-generic:
-
-distclean-generic:
- -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
- -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
-
-maintainer-clean-generic:
- @echo "This command is intended for maintainers to use"
- @echo "it deletes files that may require special tools to rebuild."
-clean: clean-recursive
-
-clean-am: clean-generic clean-libtool mostlyclean-am
-
-distclean: distclean-recursive
- -rm -f $(am__CONFIG_DISTCLEAN_FILES)
- -rm -f Makefile
-distclean-am: clean-am distclean-generic distclean-hdr \
- distclean-libtool distclean-tags
-
-dvi: dvi-recursive
-
-dvi-am:
-
-html: html-recursive
-
-html-am:
-
-info: info-recursive
-
-info-am:
-
-install-data-am:
-
-install-dvi: install-dvi-recursive
-
-install-dvi-am:
-
-install-exec-am: install-binSCRIPTS
-
-install-html: install-html-recursive
-
-install-html-am:
-
-install-info: install-info-recursive
-
-install-info-am:
-
-install-man:
-
-install-pdf: install-pdf-recursive
-
-install-pdf-am:
-
-install-ps: install-ps-recursive
-
-install-ps-am:
-
-installcheck-am:
-
-maintainer-clean: maintainer-clean-recursive
- -rm -f $(am__CONFIG_DISTCLEAN_FILES)
- -rm -rf $(top_srcdir)/autom4te.cache
- -rm -f Makefile
-maintainer-clean-am: distclean-am maintainer-clean-generic
-
-mostlyclean: mostlyclean-recursive
-
-mostlyclean-am: mostlyclean-generic mostlyclean-libtool
-
-pdf: pdf-recursive
-
-pdf-am:
-
-ps: ps-recursive
-
-ps-am:
-
-uninstall-am: uninstall-binSCRIPTS
- @$(NORMAL_INSTALL)
- $(MAKE) $(AM_MAKEFLAGS) uninstall-hook
-.MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) all \
- ctags-recursive install-am install-strip tags-recursive \
- uninstall-am
-
-.PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \
- all all-am am--refresh check check-am clean clean-generic \
- clean-libtool ctags ctags-recursive dist dist-all dist-bzip2 \
- dist-gzip dist-lzip dist-lzma dist-shar dist-tarZ dist-xz \
- dist-zip distcheck distclean distclean-generic distclean-hdr \
- distclean-libtool distclean-tags distcleancheck distdir \
- distuninstallcheck dvi dvi-am html html-am info info-am \
- install install-am install-binSCRIPTS install-data \
- install-data-am install-dvi install-dvi-am install-exec \
- install-exec-am install-html install-html-am install-info \
- install-info-am install-man install-pdf install-pdf-am \
- install-ps install-ps-am install-strip installcheck \
- installcheck-am installdirs installdirs-am maintainer-clean \
- maintainer-clean-generic mostlyclean mostlyclean-generic \
- mostlyclean-libtool pdf pdf-am ps ps-am tags tags-recursive \
- uninstall uninstall-am uninstall-binSCRIPTS uninstall-hook
-
-
-# I intend to pare down the target "check" so as to be a smaller check used
-# at installation time with a focus on confirming that dependencies on
-# other packages and compilation environment are in order. In contrast, the
-# target "fullcheck" should become as exhaustive as possible to serve
-# developers for regression testing. -bds 2011Feb ...also benchmarks will be.
-
-# Fullcheck provides a full check for regression testing purposes.
-fullcheck:
- (${MAKE} ; cd tests; ${MAKE} fullcheck)
-
-docs:doc/linbox-html/index.html
-
-doc/linbox-html/index.html:
- (cd doc; ${MAKE} docs)
-
-docs_dev:doc/linbox-dev-html/pages.html
-
-doc/linbox-dev-html/pages.html:
- (cd doc; ${MAKE} docs_dev)
-
-examples:
- ( ${MAKE} ; cd examples; ${MAKE} examples)
-
-benchmarks:
- (cd benchmarks; ${MAKE} benchmarks)
-
-.PHONY:examples benchmarks
-
-bundled:
- sh auto-install.sh
-
-uninstall-hook:
- (test -d "$(includedir)/linbox" && rmdir "$(bindir)" \
- "$(libdir)" \
- "$(mandir)/man1" \
- "$(mandir)" \
- "$(includedir)/linbox/algorithms/gauss" \
- "$(includedir)/linbox/algorithms" \
- "$(includedir)/linbox/blackbox" \
- "$(includedir)/linbox/element" \
- "$(includedir)/linbox/field/Givaro" \
- "$(includedir)/linbox/field/Modular" \
- "$(includedir)/linbox/field/NTL" \
- "$(includedir)/linbox/field/" \
- "$(includedir)/linbox/kaapi" \
- "$(includedir)/linbox/matrix" \
- "$(includedir)/linbox/randiter" \
- "$(includedir)/linbox/ring" \
- "$(includedir)/linbox/solutions" \
- "$(includedir)/linbox/switch" \
- "$(includedir)/linbox/util/formats" \
- "$(includedir)/linbox/util" \
- "$(includedir)/linbox/vector" \
- "$(includedir)/linbox" \
- "$(datarootdir)/" \
- "$(includedir)" ) || true
-#incremente-versions
-
-# Tell versions [3.59,3.63) of GNU make to not export all variables.
-# Otherwise a system limit (for SysV at least) may be exceeded.
-.NOEXPORT:
diff --git a/NEWS b/NEWS
index 5ab6628..14285d7 100644
--- a/NEWS
+++ b/NEWS
@@ -13,13 +13,13 @@ Version 0.1.1, 27 August 2002
- Size checking at build time and definition of data types
int8, int16, int32, int64 and unsigned variants, guaranteed
to be of their respective lengths. Specializations of
- Modular have been updated to use these types
- - Performance tweaks to Modular<uint32> specialization of dot
+ Givaro::Modular have been updated to use these types
+ - Performance tweaks to Givaro::Modular<uint32> specialization of dot
product
- New test suites for the commentator and butterfly
preconditioner
- Numerous commentator bugfixes and output tweaks
- - Removed inefficiency in the Modular random iterator
+ - Removed inefficiency in the Givaro::Modular random iterator
- Reorganization and simplification of modular, vector domain,
and sparse matrix tests
- Enhancements and fixes in the build system
diff --git a/README b/README
index ec17613..b2b4705 100644
--- a/README
+++ b/README
@@ -2,19 +2,21 @@
PURPOSE:
-The Linbox library provides functionalities for exact linear algebra.
+The Linbox library provides functionality for exact linear algebra.
See doc/mainpage.doxy for more info.
INSTALLATION:
-See doc/install*html for particulars.
+See doc/install-dev.html for installation from the git lastest version.
+See doc/install-dist.html for installation from a release tarball.
See INSTALL for generic installation information.
-AVAILABILITY: from linalg.org
+AVAILABILITY: from linalg.org and from github.com/linbox-team
-REQUIREMENTS: GMP, ATLAS (or other cblas, lapack), NTL, Givaro
+REQUIREMENTS: GMP, ATLAS (or other cblas, lapack), Givaro, fflas-ffpack
+OPTIONAL Dependencies: NTL, IML, FLINT, M4RI, M4RIE
See doc/install*html for details.
This library requires the GNU C++ compiler (gcc-4.3 or newer) or any
@@ -27,6 +29,6 @@ The linbox website is http://linalg.org
Corrections, suggestions and comments to :
linbox-use at googlegroups.com
-Last update : 2009 September
+Last update : 2015 July
diff --git a/RELEASE-INSTRUCTIONS b/RELEASE-INSTRUCTIONS
new file mode 100644
index 0000000..c2815f6
--- /dev/null
+++ b/RELEASE-INSTRUCTIONS
@@ -0,0 +1,28 @@
+Instructions for making a LinBox release:
+
+1. Run 'svn up ' to make sure you are fully up to date and on the
+ HEAD branch [1]
+2. Update the version number in Makefile.am next to 'VERSION = ', and in configure.in:3
+3. Run 'make distcheck' on your local copy of LinBox. If there are any
+ problems, fix them and commit the fixes to CVS. Usually problems
+ will be things like header files that are not being installed, but
+ should be. Make sure 'make distcheck' runs once without having any
+ errors before moving onto the next step. Also, record all of the
+ changes you make in ChangeLog.
+4. Add a ChangeLog entry for Makefile.am with the text 'New version
+ <version>' where <version> is the version you are releasing.
+5. Make sure everything in your local copy of LinBox is committed. In
+ particular, either commit or eliminate anything from step 1 that
+ was marked modified.
+6. Run 'make dist' (or 'make distcheck') so that the last ChangeLog
+ entry is included in your tarball.
+7. Copy the tarball produced in step 6 to the web server.
+8. Update the LinBox web site with information on the new release --
+ mention it in news.html and update the latest version information
+ in index.html and download.html
+
+[1] Of course, this assumes that you want to release from the head
+ branch. If HEAD represents the development version and you
+ actually want to release from a stable branch, you should use
+ cvs up -dP -r linbox-<version>
+ where <version> is the version identifier in the stable branch
\ No newline at end of file
diff --git a/TODO b/TODO
index ce7456b..621e742 100644
--- a/TODO
+++ b/TODO
@@ -4,7 +4,6 @@ file docs of examples fixed
file docs of */archetype.h removed
eliminate */archetype.doxy's ?
eliminate randiter/randiters.doxy's ?
-resolve modular-balance-int32 vs modular-int32 wierdness (same ifndef, can't coexist?).
------- older below -----------
- Test suite for random iterators
- Test suite for vector stream
@@ -24,3 +23,62 @@ Before meeting:
----
- NoCblasErrorChecks on release version ?
+
+--------------------------------------------
+History
+1) g++-4 compatibility
+---> OK, JGD 21.12.2006
+
+2) full BLAS compatibility with documentations (at least examples of use with ATLAS, GOTO, MAC BLAS)
+---> Goto BLAS checked, Pascal.
+---> MAC blas ?
+---> lapack ?
+---> 2b) wrappers for clapack_dgetrf et clapack_dgetri
+ 4 possible solutions:
+ a) remove hybrid rational solver
+ b) keep it but it works only with ATLAS (thus correct test-smith-form using #ifdef LINBOX_HAVE_ATLAS)
+ c) Add a --with-lapack option which must find dgetrf AND dgetri in a classical lapack (we thus provide clapack_dgetri and clapack_dgetrf
+ within config-blas.h) or which finds clapack_dgetri AND clapack_dgetrf (e.g. in ATLAS).
+ d) For this to work directly with Goto: we provide dgetri using dgetrf and dtrtri and dtrsm of Goto.
+---> OK, JGD 13.01.2007
+---> there remains to implement a dgetri for GotoBLAS in order to enable Zhendong's numerical solver
+
+3) gmp++ must be totally independent of Linbox and Givaro, add in LinBox and Givaro files to handle differences
+---> OK, JGD 21.12.2006
+
+4) Install documentation with simple examples
+
+5) Data in linbox examples
+
+5b) One example for each solution
+
+6) move complicated and large coded solutions to algorithms directory
+
+7) add #else, at least, throwing LinboxError exception to every #ifdef __LINBOX_HAVE_???
+
+8) read/write matrices and vectors efficiently in a coherent manner for formats
+
+9) document matrices and vectors formats (links to web tutorial, provide data examples)
+
+10) uniformly distributed random integers ! (in checks)
+---> OK
+
+11) add irreducibility test in added constructor of Givaro GFq
+
+12) Maple interface and LinBox drivers
+---> OK, 18.01.2007, Pascal.
+
+13) check valence solutions
+
+14) check generic LU ?
+14b) Uniformize different eliminations (generic LU, sparse elim, dense etc.)
+
+15) check blackbox rank when using extension fields
+
+NEW CODE (Algorithms, Solutions, Checks must be provided plus exceptions for non-handled cases)
+16) sigma base, polynomial matrix multiplication, sparse rational solver, block Hankel/Toeplitz blackbox
+16b) Parallel rank
+17) Smith form
+
+18) hybrid determinant
+---> OK, Anna 10.01.2007
diff --git a/aclocal.m4 b/aclocal.m4
deleted file mode 100644
index 77af140..0000000
--- a/aclocal.m4
+++ /dev/null
@@ -1,998 +0,0 @@
-# generated automatically by aclocal 1.11.5 -*- Autoconf -*-
-
-# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
-# 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software Foundation,
-# Inc.
-# This file is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
-# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
-# PARTICULAR PURPOSE.
-
-m4_ifndef([AC_AUTOCONF_VERSION],
- [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl
-m4_if(m4_defn([AC_AUTOCONF_VERSION]), [2.69],,
-[m4_warning([this file was generated for autoconf 2.69.
-You have another version of autoconf. It may work, but is not guaranteed to.
-If you have problems, you may need to regenerate the build system entirely.
-To do so, use the procedure documented by the package, typically `autoreconf'.])])
-
-# Copyright (C) 2002, 2003, 2005, 2006, 2007, 2008, 2011 Free Software
-# Foundation, Inc.
-#
-# This file is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# serial 1
-
-# AM_AUTOMAKE_VERSION(VERSION)
-# ----------------------------
-# Automake X.Y traces this macro to ensure aclocal.m4 has been
-# generated from the m4 files accompanying Automake X.Y.
-# (This private macro should not be called outside this file.)
-AC_DEFUN([AM_AUTOMAKE_VERSION],
-[am__api_version='1.11'
-dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to
-dnl require some minimum version. Point them to the right macro.
-m4_if([$1], [1.11.5], [],
- [AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl
-])
-
-# _AM_AUTOCONF_VERSION(VERSION)
-# -----------------------------
-# aclocal traces this macro to find the Autoconf version.
-# This is a private macro too. Using m4_define simplifies
-# the logic in aclocal, which can simply ignore this definition.
-m4_define([_AM_AUTOCONF_VERSION], [])
-
-# AM_SET_CURRENT_AUTOMAKE_VERSION
-# -------------------------------
-# Call AM_AUTOMAKE_VERSION and AM_AUTOMAKE_VERSION so they can be traced.
-# This function is AC_REQUIREd by AM_INIT_AUTOMAKE.
-AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION],
-[AM_AUTOMAKE_VERSION([1.11.5])dnl
-m4_ifndef([AC_AUTOCONF_VERSION],
- [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl
-_AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))])
-
-# AM_AUX_DIR_EXPAND -*- Autoconf -*-
-
-# Copyright (C) 2001, 2003, 2005, 2011 Free Software Foundation, Inc.
-#
-# This file is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# serial 1
-
-# For projects using AC_CONFIG_AUX_DIR([foo]), Autoconf sets
-# $ac_aux_dir to `$srcdir/foo'. In other projects, it is set to
-# `$srcdir', `$srcdir/..', or `$srcdir/../..'.
-#
-# Of course, Automake must honor this variable whenever it calls a
-# tool from the auxiliary directory. The problem is that $srcdir (and
-# therefore $ac_aux_dir as well) can be either absolute or relative,
-# depending on how configure is run. This is pretty annoying, since
-# it makes $ac_aux_dir quite unusable in subdirectories: in the top
-# source directory, any form will work fine, but in subdirectories a
-# relative path needs to be adjusted first.
-#
-# $ac_aux_dir/missing
-# fails when called from a subdirectory if $ac_aux_dir is relative
-# $top_srcdir/$ac_aux_dir/missing
-# fails if $ac_aux_dir is absolute,
-# fails when called from a subdirectory in a VPATH build with
-# a relative $ac_aux_dir
-#
-# The reason of the latter failure is that $top_srcdir and $ac_aux_dir
-# are both prefixed by $srcdir. In an in-source build this is usually
-# harmless because $srcdir is `.', but things will broke when you
-# start a VPATH build or use an absolute $srcdir.
-#
-# So we could use something similar to $top_srcdir/$ac_aux_dir/missing,
-# iff we strip the leading $srcdir from $ac_aux_dir. That would be:
-# am_aux_dir='\$(top_srcdir)/'`expr "$ac_aux_dir" : "$srcdir//*\(.*\)"`
-# and then we would define $MISSING as
-# MISSING="\${SHELL} $am_aux_dir/missing"
-# This will work as long as MISSING is not called from configure, because
-# unfortunately $(top_srcdir) has no meaning in configure.
-# However there are other variables, like CC, which are often used in
-# configure, and could therefore not use this "fixed" $ac_aux_dir.
-#
-# Another solution, used here, is to always expand $ac_aux_dir to an
-# absolute PATH. The drawback is that using absolute paths prevent a
-# configured tree to be moved without reconfiguration.
-
-AC_DEFUN([AM_AUX_DIR_EXPAND],
-[dnl Rely on autoconf to set up CDPATH properly.
-AC_PREREQ([2.50])dnl
-# expand $ac_aux_dir to an absolute path
-am_aux_dir=`cd $ac_aux_dir && pwd`
-])
-
-# AM_CONDITIONAL -*- Autoconf -*-
-
-# Copyright (C) 1997, 2000, 2001, 2003, 2004, 2005, 2006, 2008
-# Free Software Foundation, Inc.
-#
-# This file is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# serial 9
-
-# AM_CONDITIONAL(NAME, SHELL-CONDITION)
-# -------------------------------------
-# Define a conditional.
-AC_DEFUN([AM_CONDITIONAL],
-[AC_PREREQ(2.52)dnl
- ifelse([$1], [TRUE], [AC_FATAL([$0: invalid condition: $1])],
- [$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl
-AC_SUBST([$1_TRUE])dnl
-AC_SUBST([$1_FALSE])dnl
-_AM_SUBST_NOTMAKE([$1_TRUE])dnl
-_AM_SUBST_NOTMAKE([$1_FALSE])dnl
-m4_define([_AM_COND_VALUE_$1], [$2])dnl
-if $2; then
- $1_TRUE=
- $1_FALSE='#'
-else
- $1_TRUE='#'
- $1_FALSE=
-fi
-AC_CONFIG_COMMANDS_PRE(
-[if test -z "${$1_TRUE}" && test -z "${$1_FALSE}"; then
- AC_MSG_ERROR([[conditional "$1" was never defined.
-Usually this means the macro was only invoked conditionally.]])
-fi])])
-
-# Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2009,
-# 2010, 2011 Free Software Foundation, Inc.
-#
-# This file is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# serial 12
-
-# There are a few dirty hacks below to avoid letting `AC_PROG_CC' be
-# written in clear, in which case automake, when reading aclocal.m4,
-# will think it sees a *use*, and therefore will trigger all it's
-# C support machinery. Also note that it means that autoscan, seeing
-# CC etc. in the Makefile, will ask for an AC_PROG_CC use...
-
-
-# _AM_DEPENDENCIES(NAME)
-# ----------------------
-# See how the compiler implements dependency checking.
-# NAME is "CC", "CXX", "GCJ", or "OBJC".
-# We try a few techniques and use that to set a single cache variable.
-#
-# We don't AC_REQUIRE the corresponding AC_PROG_CC since the latter was
-# modified to invoke _AM_DEPENDENCIES(CC); we would have a circular
-# dependency, and given that the user is not expected to run this macro,
-# just rely on AC_PROG_CC.
-AC_DEFUN([_AM_DEPENDENCIES],
-[AC_REQUIRE([AM_SET_DEPDIR])dnl
-AC_REQUIRE([AM_OUTPUT_DEPENDENCY_COMMANDS])dnl
-AC_REQUIRE([AM_MAKE_INCLUDE])dnl
-AC_REQUIRE([AM_DEP_TRACK])dnl
-
-ifelse([$1], CC, [depcc="$CC" am_compiler_list=],
- [$1], CXX, [depcc="$CXX" am_compiler_list=],
- [$1], OBJC, [depcc="$OBJC" am_compiler_list='gcc3 gcc'],
- [$1], UPC, [depcc="$UPC" am_compiler_list=],
- [$1], GCJ, [depcc="$GCJ" am_compiler_list='gcc3 gcc'],
- [depcc="$$1" am_compiler_list=])
-
-AC_CACHE_CHECK([dependency style of $depcc],
- [am_cv_$1_dependencies_compiler_type],
-[if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then
- # We make a subdir and do the tests there. Otherwise we can end up
- # making bogus files that we don't know about and never remove. For
- # instance it was reported that on HP-UX the gcc test will end up
- # making a dummy file named `D' -- because `-MD' means `put the output
- # in D'.
- rm -rf conftest.dir
- mkdir conftest.dir
- # Copy depcomp to subdir because otherwise we won't find it if we're
- # using a relative directory.
- cp "$am_depcomp" conftest.dir
- cd conftest.dir
- # We will build objects and dependencies in a subdirectory because
- # it helps to detect inapplicable dependency modes. For instance
- # both Tru64's cc and ICC support -MD to output dependencies as a
- # side effect of compilation, but ICC will put the dependencies in
- # the current directory while Tru64 will put them in the object
- # directory.
- mkdir sub
-
- am_cv_$1_dependencies_compiler_type=none
- if test "$am_compiler_list" = ""; then
- am_compiler_list=`sed -n ['s/^#*\([a-zA-Z0-9]*\))$/\1/p'] < ./depcomp`
- fi
- am__universal=false
- m4_case([$1], [CC],
- [case " $depcc " in #(
- *\ -arch\ *\ -arch\ *) am__universal=true ;;
- esac],
- [CXX],
- [case " $depcc " in #(
- *\ -arch\ *\ -arch\ *) am__universal=true ;;
- esac])
-
- for depmode in $am_compiler_list; do
- # Setup a source with many dependencies, because some compilers
- # like to wrap large dependency lists on column 80 (with \), and
- # we should not choose a depcomp mode which is confused by this.
- #
- # We need to recreate these files for each test, as the compiler may
- # overwrite some of them when testing with obscure command lines.
- # This happens at least with the AIX C compiler.
- : > sub/conftest.c
- for i in 1 2 3 4 5 6; do
- echo '#include "conftst'$i'.h"' >> sub/conftest.c
- # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with
- # Solaris 8's {/usr,}/bin/sh.
- touch sub/conftst$i.h
- done
- echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf
-
- # We check with `-c' and `-o' for the sake of the "dashmstdout"
- # mode. It turns out that the SunPro C++ compiler does not properly
- # handle `-M -o', and we need to detect this. Also, some Intel
- # versions had trouble with output in subdirs
- am__obj=sub/conftest.${OBJEXT-o}
- am__minus_obj="-o $am__obj"
- case $depmode in
- gcc)
- # This depmode causes a compiler race in universal mode.
- test "$am__universal" = false || continue
- ;;
- nosideeffect)
- # after this tag, mechanisms are not by side-effect, so they'll
- # only be used when explicitly requested
- if test "x$enable_dependency_tracking" = xyes; then
- continue
- else
- break
- fi
- ;;
- msvc7 | msvc7msys | msvisualcpp | msvcmsys)
- # This compiler won't grok `-c -o', but also, the minuso test has
- # not run yet. These depmodes are late enough in the game, and
- # so weak that their functioning should not be impacted.
- am__obj=conftest.${OBJEXT-o}
- am__minus_obj=
- ;;
- none) break ;;
- esac
- if depmode=$depmode \
- source=sub/conftest.c object=$am__obj \
- depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \
- $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \
- >/dev/null 2>conftest.err &&
- grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 &&
- grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 &&
- grep $am__obj sub/conftest.Po > /dev/null 2>&1 &&
- ${MAKE-make} -s -f confmf > /dev/null 2>&1; then
- # icc doesn't choke on unknown options, it will just issue warnings
- # or remarks (even with -Werror). So we grep stderr for any message
- # that says an option was ignored or not supported.
- # When given -MP, icc 7.0 and 7.1 complain thusly:
- # icc: Command line warning: ignoring option '-M'; no argument required
- # The diagnosis changed in icc 8.0:
- # icc: Command line remark: option '-MP' not supported
- if (grep 'ignoring option' conftest.err ||
- grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else
- am_cv_$1_dependencies_compiler_type=$depmode
- break
- fi
- fi
- done
-
- cd ..
- rm -rf conftest.dir
-else
- am_cv_$1_dependencies_compiler_type=none
-fi
-])
-AC_SUBST([$1DEPMODE], [depmode=$am_cv_$1_dependencies_compiler_type])
-AM_CONDITIONAL([am__fastdep$1], [
- test "x$enable_dependency_tracking" != xno \
- && test "$am_cv_$1_dependencies_compiler_type" = gcc3])
-])
-
-
-# AM_SET_DEPDIR
-# -------------
-# Choose a directory name for dependency files.
-# This macro is AC_REQUIREd in _AM_DEPENDENCIES
-AC_DEFUN([AM_SET_DEPDIR],
-[AC_REQUIRE([AM_SET_LEADING_DOT])dnl
-AC_SUBST([DEPDIR], ["${am__leading_dot}deps"])dnl
-])
-
-
-# AM_DEP_TRACK
-# ------------
-AC_DEFUN([AM_DEP_TRACK],
-[AC_ARG_ENABLE(dependency-tracking,
-[ --disable-dependency-tracking speeds up one-time build
- --enable-dependency-tracking do not reject slow dependency extractors])
-if test "x$enable_dependency_tracking" != xno; then
- am_depcomp="$ac_aux_dir/depcomp"
- AMDEPBACKSLASH='\'
- am__nodep='_no'
-fi
-AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno])
-AC_SUBST([AMDEPBACKSLASH])dnl
-_AM_SUBST_NOTMAKE([AMDEPBACKSLASH])dnl
-AC_SUBST([am__nodep])dnl
-_AM_SUBST_NOTMAKE([am__nodep])dnl
-])
-
-# Generate code to set up dependency tracking. -*- Autoconf -*-
-
-# Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2008
-# Free Software Foundation, Inc.
-#
-# This file is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-#serial 5
-
-# _AM_OUTPUT_DEPENDENCY_COMMANDS
-# ------------------------------
-AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS],
-[{
- # Autoconf 2.62 quotes --file arguments for eval, but not when files
- # are listed without --file. Let's play safe and only enable the eval
- # if we detect the quoting.
- case $CONFIG_FILES in
- *\'*) eval set x "$CONFIG_FILES" ;;
- *) set x $CONFIG_FILES ;;
- esac
- shift
- for mf
- do
- # Strip MF so we end up with the name of the file.
- mf=`echo "$mf" | sed -e 's/:.*$//'`
- # Check whether this is an Automake generated Makefile or not.
- # We used to match only the files named `Makefile.in', but
- # some people rename them; so instead we look at the file content.
- # Grep'ing the first line is not enough: some people post-process
- # each Makefile.in and add a new line on top of each file to say so.
- # Grep'ing the whole file is not good either: AIX grep has a line
- # limit of 2048, but all sed's we know have understand at least 4000.
- if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then
- dirpart=`AS_DIRNAME("$mf")`
- else
- continue
- fi
- # Extract the definition of DEPDIR, am__include, and am__quote
- # from the Makefile without running `make'.
- DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"`
- test -z "$DEPDIR" && continue
- am__include=`sed -n 's/^am__include = //p' < "$mf"`
- test -z "am__include" && continue
- am__quote=`sed -n 's/^am__quote = //p' < "$mf"`
- # When using ansi2knr, U may be empty or an underscore; expand it
- U=`sed -n 's/^U = //p' < "$mf"`
- # Find all dependency output files, they are included files with
- # $(DEPDIR) in their names. We invoke sed twice because it is the
- # simplest approach to changing $(DEPDIR) to its actual value in the
- # expansion.
- for file in `sed -n "
- s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \
- sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do
- # Make sure the directory exists.
- test -f "$dirpart/$file" && continue
- fdir=`AS_DIRNAME(["$file"])`
- AS_MKDIR_P([$dirpart/$fdir])
- # echo "creating $dirpart/$file"
- echo '# dummy' > "$dirpart/$file"
- done
- done
-}
-])# _AM_OUTPUT_DEPENDENCY_COMMANDS
-
-
-# AM_OUTPUT_DEPENDENCY_COMMANDS
-# -----------------------------
-# This macro should only be invoked once -- use via AC_REQUIRE.
-#
-# This code is only required when automatic dependency tracking
-# is enabled. FIXME. This creates each `.P' file that we will
-# need in order to bootstrap the dependency handling code.
-AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS],
-[AC_CONFIG_COMMANDS([depfiles],
- [test x"$AMDEP_TRUE" != x"" || _AM_OUTPUT_DEPENDENCY_COMMANDS],
- [AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"])
-])
-
-# Copyright (C) 1996, 1997, 2000, 2001, 2003, 2005
-# Free Software Foundation, Inc.
-#
-# This file is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# serial 8
-
-# AM_CONFIG_HEADER is obsolete. It has been replaced by AC_CONFIG_HEADERS.
-AU_DEFUN([AM_CONFIG_HEADER], [AC_CONFIG_HEADERS($@)])
-
-# Do all the work for Automake. -*- Autoconf -*-
-
-# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
-# 2005, 2006, 2008, 2009 Free Software Foundation, Inc.
-#
-# This file is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# serial 16
-
-# This macro actually does too much. Some checks are only needed if
-# your package does certain things. But this isn't really a big deal.
-
-# AM_INIT_AUTOMAKE(PACKAGE, VERSION, [NO-DEFINE])
-# AM_INIT_AUTOMAKE([OPTIONS])
-# -----------------------------------------------
-# The call with PACKAGE and VERSION arguments is the old style
-# call (pre autoconf-2.50), which is being phased out. PACKAGE
-# and VERSION should now be passed to AC_INIT and removed from
-# the call to AM_INIT_AUTOMAKE.
-# We support both call styles for the transition. After
-# the next Automake release, Autoconf can make the AC_INIT
-# arguments mandatory, and then we can depend on a new Autoconf
-# release and drop the old call support.
-AC_DEFUN([AM_INIT_AUTOMAKE],
-[AC_PREREQ([2.62])dnl
-dnl Autoconf wants to disallow AM_ names. We explicitly allow
-dnl the ones we care about.
-m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl
-AC_REQUIRE([AM_SET_CURRENT_AUTOMAKE_VERSION])dnl
-AC_REQUIRE([AC_PROG_INSTALL])dnl
-if test "`cd $srcdir && pwd`" != "`pwd`"; then
- # Use -I$(srcdir) only when $(srcdir) != ., so that make's output
- # is not polluted with repeated "-I."
- AC_SUBST([am__isrc], [' -I$(srcdir)'])_AM_SUBST_NOTMAKE([am__isrc])dnl
- # test to see if srcdir already configured
- if test -f $srcdir/config.status; then
- AC_MSG_ERROR([source directory already configured; run "make distclean" there first])
- fi
-fi
-
-# test whether we have cygpath
-if test -z "$CYGPATH_W"; then
- if (cygpath --version) >/dev/null 2>/dev/null; then
- CYGPATH_W='cygpath -w'
- else
- CYGPATH_W=echo
- fi
-fi
-AC_SUBST([CYGPATH_W])
-
-# Define the identity of the package.
-dnl Distinguish between old-style and new-style calls.
-m4_ifval([$2],
-[m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl
- AC_SUBST([PACKAGE], [$1])dnl
- AC_SUBST([VERSION], [$2])],
-[_AM_SET_OPTIONS([$1])dnl
-dnl Diagnose old-style AC_INIT with new-style AM_AUTOMAKE_INIT.
-m4_if(m4_ifdef([AC_PACKAGE_NAME], 1)m4_ifdef([AC_PACKAGE_VERSION], 1), 11,,
- [m4_fatal([AC_INIT should be called with package and version arguments])])dnl
- AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl
- AC_SUBST([VERSION], ['AC_PACKAGE_VERSION'])])dnl
-
-_AM_IF_OPTION([no-define],,
-[AC_DEFINE_UNQUOTED(PACKAGE, "$PACKAGE", [Name of package])
- AC_DEFINE_UNQUOTED(VERSION, "$VERSION", [Version number of package])])dnl
-
-# Some tools Automake needs.
-AC_REQUIRE([AM_SANITY_CHECK])dnl
-AC_REQUIRE([AC_ARG_PROGRAM])dnl
-AM_MISSING_PROG(ACLOCAL, aclocal-${am__api_version})
-AM_MISSING_PROG(AUTOCONF, autoconf)
-AM_MISSING_PROG(AUTOMAKE, automake-${am__api_version})
-AM_MISSING_PROG(AUTOHEADER, autoheader)
-AM_MISSING_PROG(MAKEINFO, makeinfo)
-AC_REQUIRE([AM_PROG_INSTALL_SH])dnl
-AC_REQUIRE([AM_PROG_INSTALL_STRIP])dnl
-AC_REQUIRE([AM_PROG_MKDIR_P])dnl
-# We need awk for the "check" target. The system "awk" is bad on
-# some platforms.
-AC_REQUIRE([AC_PROG_AWK])dnl
-AC_REQUIRE([AC_PROG_MAKE_SET])dnl
-AC_REQUIRE([AM_SET_LEADING_DOT])dnl
-_AM_IF_OPTION([tar-ustar], [_AM_PROG_TAR([ustar])],
- [_AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])],
- [_AM_PROG_TAR([v7])])])
-_AM_IF_OPTION([no-dependencies],,
-[AC_PROVIDE_IFELSE([AC_PROG_CC],
- [_AM_DEPENDENCIES(CC)],
- [define([AC_PROG_CC],
- defn([AC_PROG_CC])[_AM_DEPENDENCIES(CC)])])dnl
-AC_PROVIDE_IFELSE([AC_PROG_CXX],
- [_AM_DEPENDENCIES(CXX)],
- [define([AC_PROG_CXX],
- defn([AC_PROG_CXX])[_AM_DEPENDENCIES(CXX)])])dnl
-AC_PROVIDE_IFELSE([AC_PROG_OBJC],
- [_AM_DEPENDENCIES(OBJC)],
- [define([AC_PROG_OBJC],
- defn([AC_PROG_OBJC])[_AM_DEPENDENCIES(OBJC)])])dnl
-])
-_AM_IF_OPTION([silent-rules], [AC_REQUIRE([AM_SILENT_RULES])])dnl
-dnl The `parallel-tests' driver may need to know about EXEEXT, so add the
-dnl `am__EXEEXT' conditional if _AM_COMPILER_EXEEXT was seen. This macro
-dnl is hooked onto _AC_COMPILER_EXEEXT early, see below.
-AC_CONFIG_COMMANDS_PRE(dnl
-[m4_provide_if([_AM_COMPILER_EXEEXT],
- [AM_CONDITIONAL([am__EXEEXT], [test -n "$EXEEXT"])])])dnl
-])
-
-dnl Hook into `_AC_COMPILER_EXEEXT' early to learn its expansion. Do not
-dnl add the conditional right here, as _AC_COMPILER_EXEEXT may be further
-dnl mangled by Autoconf and run in a shell conditional statement.
-m4_define([_AC_COMPILER_EXEEXT],
-m4_defn([_AC_COMPILER_EXEEXT])[m4_provide([_AM_COMPILER_EXEEXT])])
-
-
-# When config.status generates a header, we must update the stamp-h file.
-# This file resides in the same directory as the config header
-# that is generated. The stamp files are numbered to have different names.
-
-# Autoconf calls _AC_AM_CONFIG_HEADER_HOOK (when defined) in the
-# loop where config.status creates the headers, so we can generate
-# our stamp files there.
-AC_DEFUN([_AC_AM_CONFIG_HEADER_HOOK],
-[# Compute $1's index in $config_headers.
-_am_arg=$1
-_am_stamp_count=1
-for _am_header in $config_headers :; do
- case $_am_header in
- $_am_arg | $_am_arg:* )
- break ;;
- * )
- _am_stamp_count=`expr $_am_stamp_count + 1` ;;
- esac
-done
-echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_count])
-
-# Copyright (C) 2001, 2003, 2005, 2008, 2011 Free Software Foundation,
-# Inc.
-#
-# This file is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# serial 1
-
-# AM_PROG_INSTALL_SH
-# ------------------
-# Define $install_sh.
-AC_DEFUN([AM_PROG_INSTALL_SH],
-[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl
-if test x"${install_sh}" != xset; then
- case $am_aux_dir in
- *\ * | *\ *)
- install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;;
- *)
- install_sh="\${SHELL} $am_aux_dir/install-sh"
- esac
-fi
-AC_SUBST(install_sh)])
-
-# Copyright (C) 2003, 2005 Free Software Foundation, Inc.
-#
-# This file is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# serial 2
-
-# Check whether the underlying file-system supports filenames
-# with a leading dot. For instance MS-DOS doesn't.
-AC_DEFUN([AM_SET_LEADING_DOT],
-[rm -rf .tst 2>/dev/null
-mkdir .tst 2>/dev/null
-if test -d .tst; then
- am__leading_dot=.
-else
- am__leading_dot=_
-fi
-rmdir .tst 2>/dev/null
-AC_SUBST([am__leading_dot])])
-
-# Add --enable-maintainer-mode option to configure. -*- Autoconf -*-
-# From Jim Meyering
-
-# Copyright (C) 1996, 1998, 2000, 2001, 2002, 2003, 2004, 2005, 2008,
-# 2011 Free Software Foundation, Inc.
-#
-# This file is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# serial 5
-
-# AM_MAINTAINER_MODE([DEFAULT-MODE])
-# ----------------------------------
-# Control maintainer-specific portions of Makefiles.
-# Default is to disable them, unless `enable' is passed literally.
-# For symmetry, `disable' may be passed as well. Anyway, the user
-# can override the default with the --enable/--disable switch.
-AC_DEFUN([AM_MAINTAINER_MODE],
-[m4_case(m4_default([$1], [disable]),
- [enable], [m4_define([am_maintainer_other], [disable])],
- [disable], [m4_define([am_maintainer_other], [enable])],
- [m4_define([am_maintainer_other], [enable])
- m4_warn([syntax], [unexpected argument to AM@&t at _MAINTAINER_MODE: $1])])
-AC_MSG_CHECKING([whether to enable maintainer-specific portions of Makefiles])
- dnl maintainer-mode's default is 'disable' unless 'enable' is passed
- AC_ARG_ENABLE([maintainer-mode],
-[ --][am_maintainer_other][-maintainer-mode am_maintainer_other make rules and dependencies not useful
- (and sometimes confusing) to the casual installer],
- [USE_MAINTAINER_MODE=$enableval],
- [USE_MAINTAINER_MODE=]m4_if(am_maintainer_other, [enable], [no], [yes]))
- AC_MSG_RESULT([$USE_MAINTAINER_MODE])
- AM_CONDITIONAL([MAINTAINER_MODE], [test $USE_MAINTAINER_MODE = yes])
- MAINT=$MAINTAINER_MODE_TRUE
- AC_SUBST([MAINT])dnl
-]
-)
-
-AU_DEFUN([jm_MAINTAINER_MODE], [AM_MAINTAINER_MODE])
-
-# Fake the existence of programs that GNU maintainers use. -*- Autoconf -*-
-
-# Copyright (C) 1997, 1999, 2000, 2001, 2003, 2004, 2005, 2008
-# Free Software Foundation, Inc.
-#
-# This file is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# serial 6
-
-# AM_MISSING_PROG(NAME, PROGRAM)
-# ------------------------------
-AC_DEFUN([AM_MISSING_PROG],
-[AC_REQUIRE([AM_MISSING_HAS_RUN])
-$1=${$1-"${am_missing_run}$2"}
-AC_SUBST($1)])
-
-
-# AM_MISSING_HAS_RUN
-# ------------------
-# Define MISSING if not defined so far and test if it supports --run.
-# If it does, set am_missing_run to use it, otherwise, to nothing.
-AC_DEFUN([AM_MISSING_HAS_RUN],
-[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl
-AC_REQUIRE_AUX_FILE([missing])dnl
-if test x"${MISSING+set}" != xset; then
- case $am_aux_dir in
- *\ * | *\ *)
- MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;;
- *)
- MISSING="\${SHELL} $am_aux_dir/missing" ;;
- esac
-fi
-# Use eval to expand $SHELL
-if eval "$MISSING --run true"; then
- am_missing_run="$MISSING --run "
-else
- am_missing_run=
- AC_MSG_WARN([`missing' script is too old or missing])
-fi
-])
-
-# Copyright (C) 2003, 2004, 2005, 2006, 2011 Free Software Foundation,
-# Inc.
-#
-# This file is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# serial 1
-
-# AM_PROG_MKDIR_P
-# ---------------
-# Check for `mkdir -p'.
-AC_DEFUN([AM_PROG_MKDIR_P],
-[AC_PREREQ([2.60])dnl
-AC_REQUIRE([AC_PROG_MKDIR_P])dnl
-dnl Automake 1.8 to 1.9.6 used to define mkdir_p. We now use MKDIR_P,
-dnl while keeping a definition of mkdir_p for backward compatibility.
-dnl @MKDIR_P@ is magic: AC_OUTPUT adjusts its value for each Makefile.
-dnl However we cannot define mkdir_p as $(MKDIR_P) for the sake of
-dnl Makefile.ins that do not define MKDIR_P, so we do our own
-dnl adjustment using top_builddir (which is defined more often than
-dnl MKDIR_P).
-AC_SUBST([mkdir_p], ["$MKDIR_P"])dnl
-case $mkdir_p in
- [[\\/$]]* | ?:[[\\/]]*) ;;
- */*) mkdir_p="\$(top_builddir)/$mkdir_p" ;;
-esac
-])
-
-# Helper functions for option handling. -*- Autoconf -*-
-
-# Copyright (C) 2001, 2002, 2003, 2005, 2008, 2010 Free Software
-# Foundation, Inc.
-#
-# This file is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# serial 5
-
-# _AM_MANGLE_OPTION(NAME)
-# -----------------------
-AC_DEFUN([_AM_MANGLE_OPTION],
-[[_AM_OPTION_]m4_bpatsubst($1, [[^a-zA-Z0-9_]], [_])])
-
-# _AM_SET_OPTION(NAME)
-# --------------------
-# Set option NAME. Presently that only means defining a flag for this option.
-AC_DEFUN([_AM_SET_OPTION],
-[m4_define(_AM_MANGLE_OPTION([$1]), 1)])
-
-# _AM_SET_OPTIONS(OPTIONS)
-# ------------------------
-# OPTIONS is a space-separated list of Automake options.
-AC_DEFUN([_AM_SET_OPTIONS],
-[m4_foreach_w([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])])
-
-# _AM_IF_OPTION(OPTION, IF-SET, [IF-NOT-SET])
-# -------------------------------------------
-# Execute IF-SET if OPTION is set, IF-NOT-SET otherwise.
-AC_DEFUN([_AM_IF_OPTION],
-[m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])])
-
-# Check to make sure that the build environment is sane. -*- Autoconf -*-
-
-# Copyright (C) 1996, 1997, 2000, 2001, 2003, 2005, 2008
-# Free Software Foundation, Inc.
-#
-# This file is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# serial 5
-
-# AM_SANITY_CHECK
-# ---------------
-AC_DEFUN([AM_SANITY_CHECK],
-[AC_MSG_CHECKING([whether build environment is sane])
-# Just in case
-sleep 1
-echo timestamp > conftest.file
-# Reject unsafe characters in $srcdir or the absolute working directory
-# name. Accept space and tab only in the latter.
-am_lf='
-'
-case `pwd` in
- *[[\\\"\#\$\&\'\`$am_lf]]*)
- AC_MSG_ERROR([unsafe absolute working directory name]);;
-esac
-case $srcdir in
- *[[\\\"\#\$\&\'\`$am_lf\ \ ]]*)
- AC_MSG_ERROR([unsafe srcdir value: `$srcdir']);;
-esac
-
-# Do `set' in a subshell so we don't clobber the current shell's
-# arguments. Must try -L first in case configure is actually a
-# symlink; some systems play weird games with the mod time of symlinks
-# (eg FreeBSD returns the mod time of the symlink's containing
-# directory).
-if (
- set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null`
- if test "$[*]" = "X"; then
- # -L didn't work.
- set X `ls -t "$srcdir/configure" conftest.file`
- fi
- rm -f conftest.file
- if test "$[*]" != "X $srcdir/configure conftest.file" \
- && test "$[*]" != "X conftest.file $srcdir/configure"; then
-
- # If neither matched, then we have a broken ls. This can happen
- # if, for instance, CONFIG_SHELL is bash and it inherits a
- # broken ls alias from the environment. This has actually
- # happened. Such a system could not be considered "sane".
- AC_MSG_ERROR([ls -t appears to fail. Make sure there is not a broken
-alias in your environment])
- fi
-
- test "$[2]" = conftest.file
- )
-then
- # Ok.
- :
-else
- AC_MSG_ERROR([newly created file is older than distributed files!
-Check your system clock])
-fi
-AC_MSG_RESULT(yes)])
-
-# Copyright (C) 2001, 2003, 2005, 2011 Free Software Foundation, Inc.
-#
-# This file is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# serial 1
-
-# AM_PROG_INSTALL_STRIP
-# ---------------------
-# One issue with vendor `install' (even GNU) is that you can't
-# specify the program used to strip binaries. This is especially
-# annoying in cross-compiling environments, where the build's strip
-# is unlikely to handle the host's binaries.
-# Fortunately install-sh will honor a STRIPPROG variable, so we
-# always use install-sh in `make install-strip', and initialize
-# STRIPPROG with the value of the STRIP variable (set by the user).
-AC_DEFUN([AM_PROG_INSTALL_STRIP],
-[AC_REQUIRE([AM_PROG_INSTALL_SH])dnl
-# Installed binaries are usually stripped using `strip' when the user
-# run `make install-strip'. However `strip' might not be the right
-# tool to use in cross-compilation environments, therefore Automake
-# will honor the `STRIP' environment variable to overrule this program.
-dnl Don't test for $cross_compiling = yes, because it might be `maybe'.
-if test "$cross_compiling" != no; then
- AC_CHECK_TOOL([STRIP], [strip], :)
-fi
-INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s"
-AC_SUBST([INSTALL_STRIP_PROGRAM])])
-
-# Copyright (C) 2006, 2008, 2010 Free Software Foundation, Inc.
-#
-# This file is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# serial 3
-
-# _AM_SUBST_NOTMAKE(VARIABLE)
-# ---------------------------
-# Prevent Automake from outputting VARIABLE = @VARIABLE@ in Makefile.in.
-# This macro is traced by Automake.
-AC_DEFUN([_AM_SUBST_NOTMAKE])
-
-# AM_SUBST_NOTMAKE(VARIABLE)
-# --------------------------
-# Public sister of _AM_SUBST_NOTMAKE.
-AC_DEFUN([AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE($@)])
-
-# Check how to create a tarball. -*- Autoconf -*-
-
-# Copyright (C) 2004, 2005, 2012 Free Software Foundation, Inc.
-#
-# This file is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# serial 2
-
-# _AM_PROG_TAR(FORMAT)
-# --------------------
-# Check how to create a tarball in format FORMAT.
-# FORMAT should be one of `v7', `ustar', or `pax'.
-#
-# Substitute a variable $(am__tar) that is a command
-# writing to stdout a FORMAT-tarball containing the directory
-# $tardir.
-# tardir=directory && $(am__tar) > result.tar
-#
-# Substitute a variable $(am__untar) that extract such
-# a tarball read from stdin.
-# $(am__untar) < result.tar
-AC_DEFUN([_AM_PROG_TAR],
-[# Always define AMTAR for backward compatibility. Yes, it's still used
-# in the wild :-( We should find a proper way to deprecate it ...
-AC_SUBST([AMTAR], ['$${TAR-tar}'])
-m4_if([$1], [v7],
- [am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -'],
- [m4_case([$1], [ustar],, [pax],,
- [m4_fatal([Unknown tar format])])
-AC_MSG_CHECKING([how to create a $1 tar archive])
-# Loop over all known methods to create a tar archive until one works.
-_am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none'
-_am_tools=${am_cv_prog_tar_$1-$_am_tools}
-# Do not fold the above two line into one, because Tru64 sh and
-# Solaris sh will not grok spaces in the rhs of `-'.
-for _am_tool in $_am_tools
-do
- case $_am_tool in
- gnutar)
- for _am_tar in tar gnutar gtar;
- do
- AM_RUN_LOG([$_am_tar --version]) && break
- done
- am__tar="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$$tardir"'
- am__tar_="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$tardir"'
- am__untar="$_am_tar -xf -"
- ;;
- plaintar)
- # Must skip GNU tar: if it does not support --format= it doesn't create
- # ustar tarball either.
- (tar --version) >/dev/null 2>&1 && continue
- am__tar='tar chf - "$$tardir"'
- am__tar_='tar chf - "$tardir"'
- am__untar='tar xf -'
- ;;
- pax)
- am__tar='pax -L -x $1 -w "$$tardir"'
- am__tar_='pax -L -x $1 -w "$tardir"'
- am__untar='pax -r'
- ;;
- cpio)
- am__tar='find "$$tardir" -print | cpio -o -H $1 -L'
- am__tar_='find "$tardir" -print | cpio -o -H $1 -L'
- am__untar='cpio -i -H $1 -d'
- ;;
- none)
- am__tar=false
- am__tar_=false
- am__untar=false
- ;;
- esac
-
- # If the value was cached, stop now. We just wanted to have am__tar
- # and am__untar set.
- test -n "${am_cv_prog_tar_$1}" && break
-
- # tar/untar a dummy directory, and stop if the command works
- rm -rf conftest.dir
- mkdir conftest.dir
- echo GrepMe > conftest.dir/file
- AM_RUN_LOG([tardir=conftest.dir && eval $am__tar_ >conftest.tar])
- rm -rf conftest.dir
- if test -s conftest.tar; then
- AM_RUN_LOG([$am__untar <conftest.tar])
- grep GrepMe conftest.dir/file >/dev/null 2>&1 && break
- fi
-done
-rm -rf conftest.dir
-
-AC_CACHE_VAL([am_cv_prog_tar_$1], [am_cv_prog_tar_$1=$_am_tool])
-AC_MSG_RESULT([$am_cv_prog_tar_$1])])
-AC_SUBST([am__tar])
-AC_SUBST([am__untar])
-]) # _AM_PROG_TAR
-
-m4_include([macros/aclocal-include.m4])
-m4_include([macros/config-header.m4])
-m4_include([macros/debug.m4])
-m4_include([macros/expat-check.m4])
-m4_include([macros/fflas-ffpack-check.m4])
-m4_include([macros/fplll-check.m4])
-m4_include([macros/givaro-check.m4])
-m4_include([macros/gmp-check.m4])
-m4_include([macros/iml-check.m4])
-m4_include([macros/lapack-check.m4])
-m4_include([macros/libtool.m4])
-m4_include([macros/lidia-check.m4])
-m4_include([macros/linbox-benchmark.m4])
-m4_include([macros/linbox-doc.m4])
-m4_include([macros/linbox-misc.m4])
-m4_include([macros/linbox-opt.m4])
-m4_include([macros/ltoptions.m4])
-m4_include([macros/ltsugar.m4])
-m4_include([macros/ltversion.m4])
-m4_include([macros/lt~obsolete.m4])
-m4_include([macros/m4ri-check.m4])
-m4_include([macros/m4rie-check.m4])
-m4_include([macros/maple-check.m4])
-m4_include([macros/mpfr-check.m4])
-m4_include([macros/ntl-check.m4])
-m4_include([macros/saclib-check.m4])
-m4_include([macros/sage-check.m4])
diff --git a/auto-install.sh b/auto-install.sh
index 032a7d6..695c825 100755
--- a/auto-install.sh
+++ b/auto-install.sh
@@ -1,7 +1,7 @@
#!/bin/bash -
# Copyright(c) 2011 LinBox
-# Written by BB <bboyer at imag.fr>
+# Written by Brice Boyer (briceboyer) <boyer.brice at gmail.com>
# see COPYING for more details.
@@ -13,12 +13,20 @@
# TODO : rpath instead of LD_LIBRARY_PATH ?
STABLE_FFLAS=1.6.0
-STABLE_GIVARO=3.7.0
-GIV_TAR=207
-GIV_MD5=208
+STABLE_GIVARO=3.7.2
+GIV_TAR=370
+GIV_MD5=371
+
+
+function decompress {
+#tar xf $1
+gunzip -c $1 | tar xf -
+}
+
+
#switches
-STABLE_VAR="true"
+STABLE_VAR="false"
DEBUG=""
DEBUG_VAR=""
WARNINGS=""
@@ -27,7 +35,7 @@ OPTIM="--enable-optimization"
OPTIM_VAR=""
CHECK_VAR=""
#options
-PREFIX_LOC="/tmp"
+PREFIX_LOC="/usr/local"
PREFIX_VAR=""
PREFIX="--prefix=$PREFIX_LOC"
BLAS=""
@@ -77,7 +85,7 @@ help() {
echo
echo " * usage :"
echo
- echo " --stable=[yes,no] : install latest stable versions or latest svn versions."
+ echo " --stable=[yes,no] : install latest stable versions or latest git versions."
echo " Default : yes, even if switch ommitted. No argument means yes"
echo " --prefix=MY/PATH : install all libraries under MY/PATH."
@@ -355,7 +363,7 @@ fi
cool
####################
-# fectch sources #
+# fetch sources #
####################
cd build ;
@@ -384,7 +392,7 @@ if [ "$STABLE_VAR" = "true" ]; then
fi
else
OK=0 ;
- svn co svn://scm.forge.imag.fr/var/lib/gforge/chroot/scmrepos/svn/givaro/trunk 2>&1 >/dev/null && OK=1
+ git clone https://github.com/linbox-team/givaro.git 2>&1 >/dev/null && OK=1
[ "$OK" = "1" ] && cool || die
fi
@@ -412,7 +420,7 @@ if [ "$STABLE_VAR" = "true" ]; then
fi
else
OK=0 ;
- svn co svn://linalg.org/fflas-ffpack 2>&1 >/dev/null && OK=1
+ git clone https://github.com/linbox-team/fflas-ffpack.git 2>&1 >/dev/null && OK=1
[ "$OK" = "1" ] && cool || die
fi
@@ -426,7 +434,7 @@ fi
OK=0
if [ "$STABLE_VAR" = "true" ]; then
echo -en "${BEG}extracting Givaro..."| tee -a ../auto-install.log
- tar xzf givaro-$STABLE_GIVARO.tar.gz && OK=1
+ decompress givaro-$STABLE_GIVARO.tar.gz && OK=1
[ "$OK" = "1" ] && cool || die
fi
@@ -435,7 +443,7 @@ fi
OK=0
if [ "$STABLE_VAR" = "true" ]; then
echo -en "${BEG}extracting Fflas-Ffpack..."| tee -a ../auto-install.log
- tar xzf fflas-ffpack-$STABLE_FFLAS.tar.gz && OK=1
+ decompress fflas-ffpack-$STABLE_FFLAS.tar.gz && OK=1
[ "$OK" = "1" ] && cool || die
fi
@@ -448,7 +456,7 @@ fi
if [ "$STABLE_VAR" = "true" ]; then
cd givaro-$STABLE_GIVARO || die
else
- cd trunk/ || die
+ cd givaro/ || die
fi
if [ -f Makefile ] ; then
diff --git a/autogen.sh b/autogen.sh
new file mode 100755
index 0000000..f0f6cb4
--- /dev/null
+++ b/autogen.sh
@@ -0,0 +1,200 @@
+#!/bin/sh
+# Copyright (c) LinBox
+#
+# ========LICENCE========
+# This file is part of the library LinBox.
+#
+# LinBox is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+#
+# This library 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
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+# ========LICENCE========
+#/
+
+# Run this to generate all the initial makefiles, etc.
+
+# Recover command line, with double-quotes
+CMDLINE=""
+for arg in "$@"
+do
+ WHO="`echo $arg | cut -d'=' -f1`"
+ WHAT="`echo $arg | cut -s -d'=' -f2`"
+ if test "x$WHAT" = "x"; then
+ CMDLINE="$CMDLINE $WHO"
+ else
+ CMDLINE="$CMDLINE $WHO=\"$WHAT\""
+ fi
+done
+
+echo "$0 $CMDLINE" > autogen.status
+chmod +x autogen.status
+
+# Starts configuring
+srcdir=`dirname $0`
+test -z "$srcdir" && srcdir=.
+
+PKG_NAME="LinBox Library"
+
+(test -f $srcdir/configure.ac \
+ && test -f $srcdir/linbox/linbox.doxy) || {
+ echo -n "**Error**: Directory "\`$srcdir\'" does not look like the"
+ echo " top-level "\`$PKG_NAME\'" directory"
+ exit 1
+}
+
+ORIGDIR=`pwd`
+cd $srcdir
+PROJECT=linbox
+TEST_TYPE=-f
+
+DIE=0
+
+# Defaults
+LIBTOOL=libtool
+LIBTOOLIZE=libtoolize
+
+# Fix OSx problem with GNU libtool
+(uname -a|grep -v Darwin) < /dev/null > /dev/null 2>&1 ||
+{
+echo "....Adding fix for OSX"
+LIBTOOL=glibtool
+LIBTOOLIZE=glibtoolize
+}
+
+
+(autoconf --version) < /dev/null > /dev/null 2>&1 || {
+ echo
+ echo "You must have autoconf installed to compile $PROJECT."
+ echo "Download the appropriate package for your distribution,"
+ echo "or get the source tarball at ftp://ftp.gnu.org/pub/gnu/"
+ DIE=1
+}
+
+(automake --version) < /dev/null > /dev/null 2>&1 || {
+ echo
+ echo "You must have automake installed to compile $PROJECT."
+ echo "Download the appropriate package for your distribution,"
+ echo "or get the source tarball at ftp://ftp.gnu.org/pub/gnu/"
+ DIE=1
+}
+
+(automake --version) < /dev/null > /dev/null 2>&1 || {
+ echo
+ echo "You must have automake installed to compile $PROJECT."
+ echo "Get ftp://sourceware.cygnus.com/pub/automake/automake-1.4.tar.gz"
+ echo "(or a newer version if it is available)"
+ DIE=1
+}
+
+(grep "^AC_PROG_LIBTOOL" configure.ac >/dev/null) && {
+ ($LIBTOOLIZE --version) < /dev/null > /dev/null 2>&1 || {
+ echo
+ echo "**Error**: You must have \`libtoolize' installed to compile $PROJECT."
+ echo "Download the appropriate package for your distribution,"
+ echo "or get the source tarball at ftp://ftp.gnu.org/pub/gnu/"
+ DIE=1
+ }
+}
+
+grep "^AM_GNU_GETTEXT" configure.ac >/dev/null && {
+ grep "sed.*POTFILES" $srcdir/configure.ac >/dev/null || \
+ (gettext --version) < /dev/null > /dev/null 2>&1 || {
+ echo
+ echo "**Error**: You must have \`gettext' installed to compile $PROJECT."
+ echo "Download the appropriate package for your distribution,"
+ echo "or get the source tarball at ftp://ftp.gnu.org/pub/gnu/"
+ DIE=1
+ }
+}
+
+if test "$DIE" -eq 1; then
+ exit 1
+fi
+
+
+if test -z "$*"; then
+ echo "I am going to run ./configure with no arguments - if you wish "
+ echo "to pass any to it, please specify them on the $0 command line."
+fi
+
+case $CC in
+ *xlc | *xlc\ * | *lcc | *lcc\ *) am_opt=--include-deps;;
+esac
+
+for coin in `find . -name configure.ac -print`
+do
+ dr=`dirname $coin`
+ if test -f $dr/NO-AUTO-GEN; then
+ echo skipping $dr -- flagged as no auto-gen
+ else
+ echo processing $dr
+ macrodirs=`sed -n -e 's,AM_ACLOCAL_INCLUDE(\(.*\)),\1,gp' < $coin`
+ ( cd $dr
+ aclocalinclude="$ACLOCAL_FLAGS"
+ for k in $macrodirs; do
+ if test -d $k; then
+ aclocalinclude="$aclocalinclude -I $k"
+ ##else
+ ## echo "**Warning**: No such directory \`$k'. Ignored."
+ fi
+ done
+ if grep "^AM_GNU_GETTEXT" configure.ac >/dev/null; then
+ if grep "sed.*POTFILES" configure.ac >/dev/null; then
+ : do nothing -- we still have an old unmodified configure.ac
+ else
+ echo "Creating $dr/aclocal.m4 ..."
+ test -r $dr/aclocal.m4 || touch $dr/aclocal.m4
+ echo "Running gettextize... Ignore non-fatal messages."
+ echo "no" | gettextize --force --copy
+ echo "Making $dr/aclocal.m4 writable ..."
+ test -r $dr/aclocal.m4 && chmod u+w $dr/aclocal.m4
+ fi
+ fi
+ if grep "^AM_GNOME_GETTEXT" configure.ac >/dev/null; then
+ echo "Creating $dr/aclocal.m4 ..."
+ test -r $dr/aclocal.m4 || touch $dr/aclocal.m4
+ echo "Running gettextize... Ignore non-fatal messages."
+ echo "no" | gettextize --force --copy
+ echo "Making $dr/aclocal.m4 writable ..."
+ test -r $dr/aclocal.m4 && chmod u+w $dr/aclocal.m4
+ fi
+ if grep "^AC_PROG_LIBTOOL" configure.ac >/dev/null; then
+ echo "Running libtoolize..."
+ $LIBTOOLIZE --force --copy
+ fi
+ echo "Running aclocal $aclocalinclude ..."
+ aclocal $aclocalinclude
+ if grep "^AC_CONFIG_HEADERS" configure.ac >/dev/null; then
+ echo "Running autoheader..."
+ autoheader
+ fi
+ echo "Running automake --gnu $am_opt ..."
+ automake -c --add-missing --gnu $am_opt
+ echo "Running autoconf ..."
+ autoconf
+ )
+ fi
+done
+
+conf_flags="--enable-maintainer-mode"
+#--enable-iso-c
+
+cd "$ORIGDIR"
+
+if test x$NOCONFIGURE = x; then
+ echo Running $srcdir/configure $conf_flags "$@" ...
+ $srcdir/configure $conf_flags "$@" \
+ && echo "Now type \`make install' to compile $PROJECT" || exit 1
+else
+ echo Skipping configure process.
+fi
+
diff --git a/benchmarks/BenchmarkFile.h b/benchmarks/BenchmarkFile.h
new file mode 100644
index 0000000..9d2dd98
--- /dev/null
+++ b/benchmarks/BenchmarkFile.h
@@ -0,0 +1,107 @@
+/* Copyright (C) 2013 LinBox
+ * Written by AJS <stachnik at udel.edu>
+ *
+ *
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ * ========LICENCE========
+ */
+
+/*! @file benchmarks/BenchmarkFile.h
+ * @ingroup benchmarks
+ * @brief
+ */
+
+#ifndef __LINBOX_BENCHMARKFILE_H
+#define __LINBOX_BENCHMARKFILE_H
+
+#include <stdlib.h>
+#include <fstream>
+#include <map>
+#include <vector>
+
+namespace LinBox
+{
+
+class BenchmarkFile {
+public:
+ typedef std::map<std::string,CSValue*>::iterator MetadataIterator;
+
+ BenchmarkFile() : numFields_(0) {}
+
+ ~BenchmarkFile();
+
+ void write(std::ostream& out);
+
+ void addMetadata(const std::string& key,const CSValue& val);
+
+ MetadataIterator metadataBegin();
+
+ void addDataField(const std::string& fieldName,const CSValue& val);
+
+ void setType(const std::string& fieldName, const std::string& type);
+
+ void pushBackTest();
+
+ static CSDate getDateStamp();
+
+ static std::string getDateFormat();
+
+protected:
+ typedef std::vector<CSValue*> TestLine;
+ typedef std::map<std::string,CSValue*> MetadataMap;
+ typedef std::map<std::string,int> FieldPosMap;
+ typedef std::map<std::string,std::string> TypeMap;
+
+ void printMetadata(std::ostream& out);
+
+ void printFieldTitles(std::ostream& out);
+
+ void printContents(std::ostream& out);
+
+ void printCommaVector(std::ostream& out,const std::vector<CSValue*>& vec);
+
+ void freeTestLine(TestLine& line);
+
+
+ MetadataMap metadata_;
+
+ TypeMap typeMap_;
+
+ int numFields_;
+
+ FieldPosMap fields_;
+
+ TestLine curTest_;
+
+ std::vector<TestLine> allTests_;
+};
+
+}
+
+#include "BenchmarkFile.inl"
+
+#endif // __LINBOX_BENCHMARKFILE_H
+
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/benchmarks/BenchmarkFile.inl b/benchmarks/BenchmarkFile.inl
new file mode 100644
index 0000000..c36b788
--- /dev/null
+++ b/benchmarks/BenchmarkFile.inl
@@ -0,0 +1,198 @@
+/* Copyright (C) 2013 LinBox
+ * Written by AJS <stachnik at udel.edu>
+ *
+ *
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ * ========LICENCE========
+ */
+
+/*! @file benchmarks/BenchmarkFile.inl
+ * @ingroup benchmarks
+ * @brief
+ */
+
+#ifndef __LINBOX_BENCHMARKFILE_INL
+#define __LINBOX_BENCHMARKFILE_INL
+
+#include "linbox/util/debug.h"
+
+#include <stdlib.h>
+#include <fstream>
+#include <map>
+
+namespace LinBox
+{
+
+void BenchmarkFile::printCommaVector(std::ostream& out,const std::vector<CSValue*>& vec)
+{
+ bool first=true;
+ for (int i=0;i<vec.size();++i) {
+ if (!first) {
+ out << ", ";
+ } else {
+ first=false;
+ }
+ if (vec[i] == NULL) {
+ out << "-";
+ } else {
+ vec[i]->print(out);
+ }
+ }
+ out << std::endl;
+}
+
+void BenchmarkFile::printMetadata(std::ostream& out)
+{
+ typedef MetadataMap::iterator MapIT;
+
+ for (MapIT it=metadata_.begin();it!=metadata_.end();++it) {
+ out << it->first << ", ";
+ it->second->print(out);
+ out << std::endl;
+ }
+
+ typedef TypeMap::iterator TypeMapIT;
+
+ if (!(typeMap_.empty())) {
+ out << "types";
+ for (TypeMapIT it=typeMap_.begin();it!=typeMap_.end();++it) {
+ out << ", (" << it->first << "," << it->second << ")";
+ }
+ out << std::endl;
+ }
+ out << "end, metadata" << std::endl << std::endl;
+}
+
+void BenchmarkFile::printFieldTitles(std::ostream& out)
+{
+ std::vector<CSValue*> fieldVec(numFields_);
+
+ typedef FieldPosMap::iterator MapIT;
+
+ for (MapIT it=fields_.begin();it!=fields_.end();++it) {
+ fieldVec[it->second]=new CSString(it->first);
+ }
+
+ printCommaVector(out,fieldVec);
+
+ for (int i=0;i<fieldVec.size();++i) {delete fieldVec[i];}
+
+}
+
+void BenchmarkFile::printContents(std::ostream& out)
+{
+ for (int i=0;i<allTests_.size();++i) {
+ printCommaVector(out,allTests_[i]);
+ }
+}
+
+void BenchmarkFile::write(std::ostream& out)
+{
+ printMetadata(out);
+ printFieldTitles(out);
+ printContents(out);
+}
+
+void BenchmarkFile::freeTestLine(TestLine& line)
+{
+ for (int i=0;i<line.size();++i) {
+ delete line[i];
+ }
+}
+
+BenchmarkFile::~BenchmarkFile() {
+ for (int i=0;i<allTests_.size();++i) {
+ freeTestLine(allTests_[i]);
+ }
+
+ freeTestLine(curTest_);
+
+ typedef MetadataMap::iterator MapIT;
+ for (MapIT it=metadata_.begin();it!=metadata_.end();++it) {
+ delete it->second;
+ }
+}
+
+BenchmarkFile::MetadataIterator BenchmarkFile::metadataBegin()
+{
+ return metadata_.begin();
+}
+
+void BenchmarkFile::addMetadata(const std::string& key,const CSValue& val)
+{
+ metadata_.insert(std::pair<std::string,CSValue*>(key,val.clone()));
+}
+
+
+void BenchmarkFile::setType(const std::string& fieldName, const std::string& type)
+{
+ typeMap_[fieldName]=type;
+}
+
+void BenchmarkFile::addDataField(const std::string& fieldName,const CSValue& val)
+{
+ typedef FieldPosMap::iterator FieldPosMapIT;
+
+ int fieldPos;
+
+ FieldPosMapIT it = fields_.find(fieldName);
+ if (it==fields_.end()) {
+ fields_.insert(std::pair<std::string,int>(fieldName,numFields_));
+ fieldPos=numFields_;
+ ++numFields_;
+ curTest_.resize(numFields_);
+ } else {
+ fieldPos=it->second;
+ }
+
+ curTest_[fieldPos]=val.clone();
+}
+
+void BenchmarkFile::pushBackTest()
+{
+ allTests_.push_back(curTest_);
+ curTest_.clear();
+ curTest_.resize(numFields_);
+}
+
+CSDate BenchmarkFile::getDateStamp()
+{
+ time_t rawTime;
+ struct tm *timeInfo;
+ srand ((unsigned)time (&rawTime));
+ timeInfo=localtime(&rawTime);
+ return CSDate(*timeInfo);
+}
+
+std::string BenchmarkFile::getDateFormat()
+{
+ return "%a %m/%d %H/%M/%S %Y";
+}
+
+
+}
+#endif // __LINBOX_BENCHMARKFILE_INL
+
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/benchmarks/CSValue.h b/benchmarks/CSValue.h
new file mode 100644
index 0000000..eb50818
--- /dev/null
+++ b/benchmarks/CSValue.h
@@ -0,0 +1,153 @@
+/* Copyright (C) 2013 LinBox
+ * Written by AJS <stachnik at udel.edu>
+ *
+ *
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ * ========LICENCE========
+ */
+
+/*! @file benchmarks/CSValue.h
+ * @ingroup benchmarks
+ * @brief
+ */
+
+#ifndef __LINBOX_CSVALUE_H
+#define __LINBOX_CSVALUE_H
+
+#include <stdlib.h>
+#include <iostream>
+#include <fstream>
+#include <string>
+#include <time.h>
+
+namespace LinBox
+{
+
+class CSValue {
+public:
+ virtual ~CSValue() {}
+
+ virtual void print(std::ostream& out) const =0;
+
+ virtual CSValue* clone() const =0;
+
+ virtual int type() const =0;
+};
+
+#define CSV_STRING_TYPE 1
+#define CSV_INT_TYPE 2
+#define CSV_DOUBLE_TYPE 3
+#define CSV_DATE_TYPE 4
+
+std::ostream& operator<< (std::ostream& out, const CSValue& v)
+{
+ v.print(out);
+ return out;
+}
+
+class CSString : public CSValue {
+public:
+
+ CSString() {}
+
+ CSString(const std::string& e) : elt_(e) {}
+
+ std::string getVal() const {return elt_;}
+
+ void print(std::ostream& out) const {out << elt_;}
+
+ CSValue* clone() const {return new CSString(elt_);}
+
+ int type() const {return CSV_STRING_TYPE;}
+
+protected:
+ std::string elt_;
+};
+
+class CSInt : public CSValue {
+public:
+
+ CSInt() : elt_(0) {}
+
+ CSInt(const int e) : elt_(e) {}
+
+ int getVal() const {return elt_;}
+
+ void print(std::ostream& out) const {out << elt_;}
+
+ CSValue* clone() const {return new CSInt(elt_);}
+
+ int type() const {return CSV_INT_TYPE;}
+
+protected:
+ int elt_;
+};
+
+class CSDouble : public CSValue {
+public:
+
+ CSDouble() : elt_(0.0) {}
+
+ CSDouble(const double e) : elt_(e) {}
+
+ double getVal() const {return elt_;}
+
+ void print(std::ostream& out) const {out << elt_;}
+
+ CSValue* clone() const {return new CSDouble(elt_);}
+
+ int type() const {return CSV_DOUBLE_TYPE;}
+
+protected:
+ double elt_;
+};
+
+class CSDate : public CSValue {
+public:
+
+ CSDate() {}
+
+ CSDate(const struct tm& time) : elt_(time) {}
+
+ struct tm getVal() const {return elt_;}
+
+ void print(std::ostream& out) const {
+ std::string timeStr(asctime(&elt_));
+ timeStr.erase(timeStr.size()-1);
+ out << timeStr;
+ }
+
+ CSValue* clone() const {return new CSDate(elt_);}
+
+ int type() const {return CSV_DATE_TYPE;}
+
+protected:
+ struct tm elt_;
+};
+
+}
+#endif // __LINBOX_CSVALUE_H
+
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/benchmarks/Makefile.am b/benchmarks/Makefile.am
index 7041141..cd0ac76 100644
--- a/benchmarks/Makefile.am
+++ b/benchmarks/Makefile.am
@@ -1,5 +1,5 @@
# Copyright (c) 2011 the LinBox group
-# Brice Boyer <bboyer at imag.fr>
+# Brice Boyer (briceboyer) <boyer.brice at gmail.com>
# ========LICENCE========
# This file is part of the library LinBox.
#
@@ -17,37 +17,57 @@
# License along with this library; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
# ========LICENCE========
+#/
+SUBDIRS=data matrix
+DEFCPPFLAGS = @DEFAULT_CFLAGS@ -DDISABLE_COMMENTATOR -DLinBoxSrcOnly
+AM_CPPFLAGS = -I$(top_srcdir) -I$(top_srcdir)/linbox $(DEFCPPFLAGS) $(DEPS_CFLAGS)
+LDADD = $(DEPS_LIBS) $(LDFLAGS)
+LDADD += $(top_builddir)/linbox/liblinbox.la
+pkgincludesubdir=$(pkgincludedir)/benchmarks
+noinst_LTLIBRARIES=libbenchmarks.la
+libbenchmarks_la_SOURCES= benchmark.C
+libbenchmarks_la_LDFLAGS=$(LDFLAGS) $(DEPS_LIBS)
+libbenchmarks_la_LIBADD=$(top_builddir)/linbox/liblinbox.la
+#libbenchmarks_la_LIBADD+=$(top_builddir)/linbox/util/.libs/libutil.la
-AM_CPPFLAGS=-I$(top_srcdir) -I$(top_srcdir)/linbox
+# AM_CPPFLAGS = -I$(top_srcdir) -I$(top_srcdir)/linbox
+# AM_CPPFLAGS += $(NTL_CFLAGS) $(IML_CFLAGS) $(PARFLAGS)
+# AM_CXXFLAGS = @DEFAULT_CFLAGS@ -DDISABLE_COMMENTATOR -DLinBoxSrcOnly
+# LDADD = $(NTL_LIBS) $(MPFR_LIBS) $(FPLLL_LIBS) $(LDFLAGS) $(IML_LIBS) $(XML_LIBS) $(PARLIBS)
+# AM_LDFLAGS=-static $(LDFLAGS)
+ AM_LDFLAGS = .libs/libbenchmarks.la
+# AM_LDFLAGS = .libs/benchmark.o
-# SAFER_FLAGS=-g -Wall -Wextra -Wno-unused-parameter
-AM_CXXFLAGS= @DEFAULT_CFLAGS@ -DLinBoxSrcOnly
-AM_CPPFLAGS+= $(GMP_CFLAGS) $(NTL_CFLAGS) $(GIVARO_CFLAGS) $(LIDIA_CFLAGS) $(FFLAS_FFPACK_CFLAGS)
-LDADD= $(NTL_LIBS) $(GIVARO_LIBS) $(LIDIA_LIBS) $(BLAS_LIBS) $(GMP_LIBS)
-AM_LDFLAGS=-static $(LDFLAGS)
+PERFPUBLISHERFILE=benchmarks-report.xml
+
BENCH_BASIC= \
- benchmark-fgemm \
- benchmark-crafixed \
- benchmark-ftrXm
-TODO=
+ benchmark-example\
+ benchmark-order-basis
+
+FAILS= \
+ benchmark-ftrXm \
+ benchmark-ftrXm \
+ benchmark-crafixed
+
+TODO= \
benchmark-matmul \
benchmark-spmv \
benchmark-fields
# BENCH_ALGOS= \
-TODO=
+TODO= \
benchmark-solve \
benchmark-rank \
benchmark-det \
benchmark-nullspace
# BENCH_FORMS= \
-TODO=
+TODO= \
benchmark-lu
benchmark-echelon \
benchmark-hermite \
@@ -55,18 +75,34 @@ TODO=
EXTRA_PROGRAMS= $(BENCH_BASIC)
-EXTRA_DIST= benchmark.h benchmark.doxy
+pkginclude_HEADERS = \
+ optimizer.h \
+ benchmark-utils.h \
+ benchmark-utils.C \
+ benchmark-metadata.h \
+ benchmark-metadata.C \
+ benchmark.h \
+ benchmark.C \
+ benchmark.inl
+
+EXTRA_DIST= \
+ benchmark.doxy
+
+CLEANFILES= $(EXTRA_PROGRAMS) $(PERFPUBLISHERFILE)
benchmarks: ${EXTRA_PROGRAMS}
### BASE BENCHMARK ###
-benchmark_fgemm_SOURCES = benchmark-fgemm.C
-benchmark_ftrXm_SOURCES = benchmark-ftrXm.C
+# benchmark_fgemm_SOURCES = benchmark-fgemm.C
+
+# benchmark_ftrXm_SOURCES = benchmark-ftrXm.C
+
+# benchmark_crafixed_SOURCES = benchmark-crafixed.C
+
+benchmark_example_SOURCES = benchmark-example.C
+benchmark_order_basis_SOURCES = benchmark-order-basis.C
-benchmark_crafixed_SOURCES = benchmark-crafixed.C
-benchmark_crafixed_CPPFLAGS = $(IML_CFLAGS) $(AM_CPPFLAGS)
-benchmark_crafixed_LDADD = $(IML_LIBS) $(LDADD)
# benchmark_matmul_SOURCES = benchmark-matmul.C
# benchmark_spmv_SOURCES = benchmark-spmv.C
# benchmark_fields_SOURCES = benchmark-fields.C
@@ -84,14 +120,20 @@ benchmark_crafixed_LDADD = $(IML_LIBS) $(LDADD)
# benchmark_hermite_SOURCES = benchmark-hermite.C
# benchmark_smith_SOURCES = benchmark-smith.C
+cleanup :
+ (cd data ; make cleanup)
LINBOX=@prefix@
LINBOX_BIN=@bindir@
+# Perfpublisher script interaction - AB 2014/12/11
+perfpublisher:
+ +./perfpublisher.sh "$(PERFPUBLISHERFILE)" "$(EXTRA_PROGRAMS)" "$(CXX)"
+
# for compilation of new benchmarks
%:%.C
- $(CXX) $(AM_CXXFLAGS) $(CXXFLAGS) $(OPTFLAGS) ${INCLUDES} $(AM_CPPFLAGS) $*.C -o $@ $(LDFLAGS) $(LDADD) $(LOADLIBES) $(top_srcdir)/linbox/.libs/liblinbox.a
+ $(CXX) $(AM_CXXFLAGS) $(CXXFLAGS) $(OPTFLAGS) ${INCLUDES} $(AM_CPPFLAGS) $*.C -o $@ $(LDFLAGS) $(LDADD)
%:%.cpp
- $(CXX) $(AM_CXXFLAGS) $(CXXFLAGS) $(OPTFLAGS) ${INCLUDES} $(AM_CPPFLAGS) $*.cpp -o $@ $(LDFLAGS) $(LDADD) $(LOADLIBES) $(top_srcdir)/linbox/.libs/liblinbox.a
+ $(CXX) $(AM_CXXFLAGS) $(CXXFLAGS) $(OPTFLAGS) ${INCLUDES} $(AM_CPPFLAGS) $*.cpp -o $@ $(LDFLAGS) $(LDADD)
diff --git a/benchmarks/Makefile.in b/benchmarks/Makefile.in
deleted file mode 100644
index 74e6752..0000000
--- a/benchmarks/Makefile.in
+++ /dev/null
@@ -1,650 +0,0 @@
-# Makefile.in generated by automake 1.11.5 from Makefile.am.
-# @configure_input@
-
-# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software
-# Foundation, Inc.
-# This Makefile.in is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
-# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
-# PARTICULAR PURPOSE.
-
- at SET_MAKE@
-
-# Copyright (c) 2011 the LinBox group
-# Brice Boyer <bboyer at imag.fr>
-# ========LICENCE========
-# This file is part of the library LinBox.
-#
-# LinBox is free software: you can redistribute it and/or modify
-# it under the terms of the GNU Lesser General Public
-# License as published by the Free Software Foundation; either
-# version 2.1 of the License, or (at your option) any later version.
-#
-# This library 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
-# Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public
-# License along with this library; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
-# ========LICENCE========
-VPATH = @srcdir@
-am__make_dryrun = \
- { \
- am__dry=no; \
- case $$MAKEFLAGS in \
- *\\[\ \ ]*) \
- echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \
- | grep '^AM OK$$' >/dev/null || am__dry=yes;; \
- *) \
- for am__flg in $$MAKEFLAGS; do \
- case $$am__flg in \
- *=*|--*) ;; \
- *n*) am__dry=yes; break;; \
- esac; \
- done;; \
- esac; \
- test $$am__dry = yes; \
- }
-pkgdatadir = $(datadir)/@PACKAGE@
-pkgincludedir = $(includedir)/@PACKAGE@
-pkglibdir = $(libdir)/@PACKAGE@
-pkglibexecdir = $(libexecdir)/@PACKAGE@
-am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
-install_sh_DATA = $(install_sh) -c -m 644
-install_sh_PROGRAM = $(install_sh) -c
-install_sh_SCRIPT = $(install_sh) -c
-INSTALL_HEADER = $(INSTALL_DATA)
-transform = $(program_transform_name)
-NORMAL_INSTALL = :
-PRE_INSTALL = :
-POST_INSTALL = :
-NORMAL_UNINSTALL = :
-PRE_UNINSTALL = :
-POST_UNINSTALL = :
-build_triplet = @build@
-host_triplet = @host@
-EXTRA_PROGRAMS = $(am__EXEEXT_1)
-subdir = benchmarks
-DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in
-ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-am__aclocal_m4_deps = $(top_srcdir)/macros/aclocal-include.m4 \
- $(top_srcdir)/macros/config-header.m4 \
- $(top_srcdir)/macros/debug.m4 \
- $(top_srcdir)/macros/expat-check.m4 \
- $(top_srcdir)/macros/fflas-ffpack-check.m4 \
- $(top_srcdir)/macros/fplll-check.m4 \
- $(top_srcdir)/macros/givaro-check.m4 \
- $(top_srcdir)/macros/gmp-check.m4 \
- $(top_srcdir)/macros/iml-check.m4 \
- $(top_srcdir)/macros/lapack-check.m4 \
- $(top_srcdir)/macros/libtool.m4 \
- $(top_srcdir)/macros/lidia-check.m4 \
- $(top_srcdir)/macros/linbox-benchmark.m4 \
- $(top_srcdir)/macros/linbox-doc.m4 \
- $(top_srcdir)/macros/linbox-misc.m4 \
- $(top_srcdir)/macros/linbox-opt.m4 \
- $(top_srcdir)/macros/ltoptions.m4 \
- $(top_srcdir)/macros/ltsugar.m4 \
- $(top_srcdir)/macros/ltversion.m4 \
- $(top_srcdir)/macros/lt~obsolete.m4 \
- $(top_srcdir)/macros/m4ri-check.m4 \
- $(top_srcdir)/macros/m4rie-check.m4 \
- $(top_srcdir)/macros/maple-check.m4 \
- $(top_srcdir)/macros/mpfr-check.m4 \
- $(top_srcdir)/macros/ntl-check.m4 \
- $(top_srcdir)/macros/saclib-check.m4 \
- $(top_srcdir)/macros/sage-check.m4 $(top_srcdir)/configure.ac
-am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
- $(ACLOCAL_M4)
-mkinstalldirs = $(install_sh) -d
-CONFIG_HEADER = $(top_builddir)/config.h
-CONFIG_CLEAN_FILES =
-CONFIG_CLEAN_VPATH_FILES =
-am__EXEEXT_1 = benchmark-fgemm$(EXEEXT) benchmark-crafixed$(EXEEXT) \
- benchmark-ftrXm$(EXEEXT)
-am_benchmark_crafixed_OBJECTS = \
- benchmark_crafixed-benchmark-crafixed.$(OBJEXT)
-benchmark_crafixed_OBJECTS = $(am_benchmark_crafixed_OBJECTS)
-am__DEPENDENCIES_1 =
-am__DEPENDENCIES_2 = $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1)
-benchmark_crafixed_DEPENDENCIES = $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_2)
-am_benchmark_fgemm_OBJECTS = benchmark-fgemm.$(OBJEXT)
-benchmark_fgemm_OBJECTS = $(am_benchmark_fgemm_OBJECTS)
-benchmark_fgemm_LDADD = $(LDADD)
-benchmark_fgemm_DEPENDENCIES = $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1)
-am_benchmark_ftrXm_OBJECTS = benchmark-ftrXm.$(OBJEXT)
-benchmark_ftrXm_OBJECTS = $(am_benchmark_ftrXm_OBJECTS)
-benchmark_ftrXm_LDADD = $(LDADD)
-benchmark_ftrXm_DEPENDENCIES = $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1)
-DEFAULT_INCLUDES = -I. at am__isrc@ -I$(top_builddir)
-depcomp =
-am__depfiles_maybe =
-CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
- $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
-LTCXXCOMPILE = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
- --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
- $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
-CXXLD = $(CXX)
-CXXLINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
- --mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \
- $(LDFLAGS) -o $@
-SOURCES = $(benchmark_crafixed_SOURCES) $(benchmark_fgemm_SOURCES) \
- $(benchmark_ftrXm_SOURCES)
-DIST_SOURCES = $(benchmark_crafixed_SOURCES) \
- $(benchmark_fgemm_SOURCES) $(benchmark_ftrXm_SOURCES)
-am__can_run_installinfo = \
- case $$AM_UPDATE_INFO_DIR in \
- n|no|NO) false;; \
- *) (install-info --version) >/dev/null 2>&1;; \
- esac
-ETAGS = etags
-CTAGS = ctags
-DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
-ACLOCAL = @ACLOCAL@
-AMTAR = @AMTAR@
-AR = @AR@
-AUTOCONF = @AUTOCONF@
-AUTOHEADER = @AUTOHEADER@
-AUTOMAKE = @AUTOMAKE@
-AWK = @AWK@
-BLAS_CFLAGS = @BLAS_CFLAGS@
-BLAS_LIBS = @BLAS_LIBS@
-CC = @CC@
-CCNAM = @CCNAM@
-CFLAGS = @CFLAGS@
-CPPFLAGS = @CPPFLAGS@
-CXX = @CXX@
-CXXCPP = @CXXCPP@
-CXXFLAGS = @CXXFLAGS@
-CYGPATH_W = @CYGPATH_W@
-DBG = @DBG@
-DEBUG_CFLAGS = @DEBUG_CFLAGS@
-DEFAULT_CFLAGS = @DEFAULT_CFLAGS@
-DEFS = @DEFS@
-DLLTOOL = @DLLTOOL@
-DSYMUTIL = @DSYMUTIL@
-DUMPBIN = @DUMPBIN@
-ECHO_C = @ECHO_C@
-ECHO_N = @ECHO_N@
-ECHO_T = @ECHO_T@
-EGREP = @EGREP@
-EXEEXT = @EXEEXT@
-EXPAT_CFLAGS = @EXPAT_CFLAGS@
-EXPAT_LIBS = @EXPAT_LIBS@
-FFLAS_FFPACK_CFLAGS = @FFLAS_FFPACK_CFLAGS@
-FFLAS_FFPACK_LIBS = @FFLAS_FFPACK_LIBS@
-FFLAS_FFPACK_LOC = @FFLAS_FFPACK_LOC@
-FGREP = @FGREP@
-FPLLL_CFLAGS = @FPLLL_CFLAGS@
-FPLLL_LIBS = @FPLLL_LIBS@
-GIVARO_CFLAGS = @GIVARO_CFLAGS@
-GIVARO_LIBS = @GIVARO_LIBS@
-GMP_CFLAGS = @GMP_CFLAGS@
-GMP_LIBS = @GMP_LIBS@
-GMP_VERSION = @GMP_VERSION@
-GREP = @GREP@
-IML_CFLAGS = @IML_CFLAGS@
-IML_LIBS = @IML_LIBS@
-INSTALL = @INSTALL@
-INSTALL_DATA = @INSTALL_DATA@
-INSTALL_PROGRAM = @INSTALL_PROGRAM@
-INSTALL_SCRIPT = @INSTALL_SCRIPT@
-INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
-LD = @LD@
-LDFLAGS = @LDFLAGS@
-LIBOBJS = @LIBOBJS@
-LIBS = @LIBS@
-LIBTOOL = @LIBTOOL@
-LIDIA_CFLAGS = @LIDIA_CFLAGS@
-LIDIA_LIBS = @LIDIA_LIBS@
-LINBOX_BENCH_PATH = @LINBOX_BENCH_PATH@
-LINBOX_DOC_PATH = @LINBOX_DOC_PATH@
-LIPO = @LIPO@
-LN_S = @LN_S@
-LTLIBOBJS = @LTLIBOBJS@
-M4RIE_CFLAGS = @M4RIE_CFLAGS@
-M4RIE_LIBS = @M4RIE_LIBS@
-M4RI_CFLAGS = @M4RI_CFLAGS@
-M4RI_LIBS = @M4RI_LIBS@
-MAINT = @MAINT@
-MAKEINFO = @MAKEINFO@
-MANIFEST_TOOL = @MANIFEST_TOOL@
-MAPLE_CFLAGS = @MAPLE_CFLAGS@
-MAPLE_HOME = @MAPLE_HOME@
-MAPLE_LIBS = @MAPLE_LIBS@
-MAPLE_VERSION = @MAPLE_VERSION@
-MKDIR_P = @MKDIR_P@
-MPFR_CFLAGS = @MPFR_CFLAGS@
-MPFR_LIBS = @MPFR_LIBS@
-NM = @NM@
-NMEDIT = @NMEDIT@
-NTL_CFLAGS = @NTL_CFLAGS@
-NTL_LIBS = @NTL_LIBS@
-OBJDUMP = @OBJDUMP@
-OBJEXT = @OBJEXT@
-OTOOL = @OTOOL@
-OTOOL64 = @OTOOL64@
-PACKAGE = @PACKAGE@
-PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
-PACKAGE_NAME = @PACKAGE_NAME@
-PACKAGE_STRING = @PACKAGE_STRING@
-PACKAGE_TARNAME = @PACKAGE_TARNAME@
-PACKAGE_URL = @PACKAGE_URL@
-PACKAGE_VERSION = @PACKAGE_VERSION@
-PATH_SEPARATOR = @PATH_SEPARATOR@
-PROF = @PROF@
-RANLIB = @RANLIB@
-RM = @RM@
-SACLIB_CFLAGS = @SACLIB_CFLAGS@
-SACLIB_LIBS = @SACLIB_LIBS@
-SED = @SED@
-SET_MAKE = @SET_MAKE@
-SHELL = @SHELL@
-STRIP = @STRIP@
-TESTS_CFLAGS = @TESTS_CFLAGS@
-VERSION = @VERSION@
-WARN = @WARN@
-abs_builddir = @abs_builddir@
-abs_srcdir = @abs_srcdir@
-abs_top_builddir = @abs_top_builddir@
-abs_top_srcdir = @abs_top_srcdir@
-ac_ct_AR = @ac_ct_AR@
-ac_ct_CC = @ac_ct_CC@
-ac_ct_CXX = @ac_ct_CXX@
-ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
-am__leading_dot = @am__leading_dot@
-am__tar = @am__tar@
-am__untar = @am__untar@
-bindir = @bindir@
-build = @build@
-build_alias = @build_alias@
-build_cpu = @build_cpu@
-build_os = @build_os@
-build_vendor = @build_vendor@
-builddir = @builddir@
-datadir = @datadir@
-datarootdir = @datarootdir@
-docdir = @docdir@
-dvidir = @dvidir@
-exec_prefix = @exec_prefix@
-host = @host@
-host_alias = @host_alias@
-host_cpu = @host_cpu@
-host_os = @host_os@
-host_vendor = @host_vendor@
-htmldir = @htmldir@
-includedir = @includedir@
-infodir = @infodir@
-install_sh = @install_sh@
-libdir = @libdir@
-libexecdir = @libexecdir@
-localedir = @localedir@
-localstatedir = @localstatedir@
-mandir = @mandir@
-mkdir_p = @mkdir_p@
-oldincludedir = @oldincludedir@
-pdfdir = @pdfdir@
-prefix = @prefix@
-program_transform_name = @program_transform_name@
-psdir = @psdir@
-sbindir = @sbindir@
-sharedstatedir = @sharedstatedir@
-srcdir = @srcdir@
-sysconfdir = @sysconfdir@
-target_alias = @target_alias@
-top_build_prefix = @top_build_prefix@
-top_builddir = @top_builddir@
-top_srcdir = @top_srcdir@
-AM_CPPFLAGS = -I$(top_srcdir) -I$(top_srcdir)/linbox $(GMP_CFLAGS) \
- $(NTL_CFLAGS) $(GIVARO_CFLAGS) $(LIDIA_CFLAGS) \
- $(FFLAS_FFPACK_CFLAGS)
-
-# SAFER_FLAGS=-g -Wall -Wextra -Wno-unused-parameter
-AM_CXXFLAGS = @DEFAULT_CFLAGS@ -DLinBoxSrcOnly
-LDADD = $(NTL_LIBS) $(GIVARO_LIBS) $(LIDIA_LIBS) $(BLAS_LIBS) $(GMP_LIBS)
-AM_LDFLAGS = -static $(LDFLAGS)
-BENCH_BASIC = \
- benchmark-fgemm \
- benchmark-crafixed \
- benchmark-ftrXm
-
-TODO =
-EXTRA_DIST = benchmark.h benchmark.doxy
-
-### BASE BENCHMARK ###
-benchmark_fgemm_SOURCES = benchmark-fgemm.C
-benchmark_ftrXm_SOURCES = benchmark-ftrXm.C
-benchmark_crafixed_SOURCES = benchmark-crafixed.C
-benchmark_crafixed_CPPFLAGS = $(IML_CFLAGS) $(AM_CPPFLAGS)
-benchmark_crafixed_LDADD = $(IML_LIBS) $(LDADD)
-# benchmark_matmul_SOURCES = benchmark-matmul.C
-# benchmark_spmv_SOURCES = benchmark-spmv.C
-# benchmark_fields_SOURCES = benchmark-fields.C
-
-### BENCHMARK ALGOS and SOLUTIONS ###
-# benchmark_solve_SOURCES = benchmark-solve.C
-# benchmark_rank_SOURCES = benchmark-rank.C
-# benchmark_det_SOURCES = benchmark-det.C
-# benchmark_nullspace_SOURCES = benchmark-nullspace.C
-
-### BENCHMARK MATRIX FACTORISATIONS ###
-# benchmark_lu_SOURCES = benchmark-lu.C
-# benchmark_echelon_SOURCES = benchmark-echelon.C
-# benchmark_hermite_SOURCES = benchmark-hermite.C
-# benchmark_smith_SOURCES = benchmark-smith.C
-LINBOX = @prefix@
-LINBOX_BIN = @bindir@
-all: all-am
-
-.SUFFIXES:
-.SUFFIXES: .C .lo .o .obj
-$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps)
- @for dep in $?; do \
- case '$(am__configure_deps)' in \
- *$$dep*) \
- ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
- && { if test -f $@; then exit 0; else break; fi; }; \
- exit 1;; \
- esac; \
- done; \
- echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu --ignore-deps benchmarks/Makefile'; \
- $(am__cd) $(top_srcdir) && \
- $(AUTOMAKE) --gnu --ignore-deps benchmarks/Makefile
-.PRECIOUS: Makefile
-Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
- @case '$?' in \
- *config.status*) \
- cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
- *) \
- echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
- cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
- esac;
-
-$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
- cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-
-$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
- cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
- cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-$(am__aclocal_m4_deps):
-benchmark-crafixed$(EXEEXT): $(benchmark_crafixed_OBJECTS) $(benchmark_crafixed_DEPENDENCIES) $(EXTRA_benchmark_crafixed_DEPENDENCIES)
- @rm -f benchmark-crafixed$(EXEEXT)
- $(CXXLINK) $(benchmark_crafixed_OBJECTS) $(benchmark_crafixed_LDADD) $(LIBS)
-benchmark-fgemm$(EXEEXT): $(benchmark_fgemm_OBJECTS) $(benchmark_fgemm_DEPENDENCIES) $(EXTRA_benchmark_fgemm_DEPENDENCIES)
- @rm -f benchmark-fgemm$(EXEEXT)
- $(CXXLINK) $(benchmark_fgemm_OBJECTS) $(benchmark_fgemm_LDADD) $(LIBS)
-benchmark-ftrXm$(EXEEXT): $(benchmark_ftrXm_OBJECTS) $(benchmark_ftrXm_DEPENDENCIES) $(EXTRA_benchmark_ftrXm_DEPENDENCIES)
- @rm -f benchmark-ftrXm$(EXEEXT)
- $(CXXLINK) $(benchmark_ftrXm_OBJECTS) $(benchmark_ftrXm_LDADD) $(LIBS)
-
-mostlyclean-compile:
- -rm -f *.$(OBJEXT)
-
-distclean-compile:
- -rm -f *.tab.c
-
-.C.o:
- $(CXXCOMPILE) -c -o $@ $<
-
-.C.obj:
- $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
-
-.C.lo:
- $(LTCXXCOMPILE) -c -o $@ $<
-
-benchmark_crafixed-benchmark-crafixed.o: benchmark-crafixed.C
- $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(benchmark_crafixed_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o benchmark_crafixed-benchmark-crafixed.o `test -f 'benchmark-crafixed.C' || echo '$(srcdir)/'`benchmark-crafixed.C
-
-benchmark_crafixed-benchmark-crafixed.obj: benchmark-crafixed.C
- $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(benchmark_crafixed_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o benchmark_crafixed-benchmark-crafixed.obj `if test -f 'benchmark-crafixed.C'; then $(CYGPATH_W) 'benchmark-crafixed.C'; else $(CYGPATH_W) '$(srcdir)/benchmark-crafixed.C'; fi`
-
-mostlyclean-libtool:
- -rm -f *.lo
-
-clean-libtool:
- -rm -rf .libs _libs
-
-ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
- list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
- unique=`for i in $$list; do \
- if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
- done | \
- $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
- END { if (nonempty) { for (i in files) print i; }; }'`; \
- mkid -fID $$unique
-tags: TAGS
-
-TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
- $(TAGS_FILES) $(LISP)
- set x; \
- here=`pwd`; \
- list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
- unique=`for i in $$list; do \
- if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
- done | \
- $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
- END { if (nonempty) { for (i in files) print i; }; }'`; \
- shift; \
- if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
- test -n "$$unique" || unique=$$empty_fix; \
- if test $$# -gt 0; then \
- $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
- "$$@" $$unique; \
- else \
- $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
- $$unique; \
- fi; \
- fi
-ctags: CTAGS
-CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
- $(TAGS_FILES) $(LISP)
- list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
- unique=`for i in $$list; do \
- if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
- done | \
- $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
- END { if (nonempty) { for (i in files) print i; }; }'`; \
- test -z "$(CTAGS_ARGS)$$unique" \
- || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
- $$unique
-
-GTAGS:
- here=`$(am__cd) $(top_builddir) && pwd` \
- && $(am__cd) $(top_srcdir) \
- && gtags -i $(GTAGS_ARGS) "$$here"
-
-distclean-tags:
- -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
-
-distdir: $(DISTFILES)
- @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
- topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
- list='$(DISTFILES)'; \
- dist_files=`for file in $$list; do echo $$file; done | \
- sed -e "s|^$$srcdirstrip/||;t" \
- -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
- case $$dist_files in \
- */*) $(MKDIR_P) `echo "$$dist_files" | \
- sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
- sort -u` ;; \
- esac; \
- for file in $$dist_files; do \
- if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
- if test -d $$d/$$file; then \
- dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
- if test -d "$(distdir)/$$file"; then \
- find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
- fi; \
- if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
- cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
- find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
- fi; \
- cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
- else \
- test -f "$(distdir)/$$file" \
- || cp -p $$d/$$file "$(distdir)/$$file" \
- || exit 1; \
- fi; \
- done
-check-am: all-am
-check: check-am
-all-am: Makefile
-installdirs:
-install: install-am
-install-exec: install-exec-am
-install-data: install-data-am
-uninstall: uninstall-am
-
-install-am: all-am
- @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
-
-installcheck: installcheck-am
-install-strip:
- if test -z '$(STRIP)'; then \
- $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
- install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
- install; \
- else \
- $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
- install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
- "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
- fi
-mostlyclean-generic:
-
-clean-generic:
-
-distclean-generic:
- -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
- -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
-
-maintainer-clean-generic:
- @echo "This command is intended for maintainers to use"
- @echo "it deletes files that may require special tools to rebuild."
-clean: clean-am
-
-clean-am: clean-generic clean-libtool mostlyclean-am
-
-distclean: distclean-am
- -rm -f Makefile
-distclean-am: clean-am distclean-compile distclean-generic \
- distclean-tags
-
-dvi: dvi-am
-
-dvi-am:
-
-html: html-am
-
-html-am:
-
-info: info-am
-
-info-am:
-
-install-data-am:
-
-install-dvi: install-dvi-am
-
-install-dvi-am:
-
-install-exec-am:
-
-install-html: install-html-am
-
-install-html-am:
-
-install-info: install-info-am
-
-install-info-am:
-
-install-man:
-
-install-pdf: install-pdf-am
-
-install-pdf-am:
-
-install-ps: install-ps-am
-
-install-ps-am:
-
-installcheck-am:
-
-maintainer-clean: maintainer-clean-am
- -rm -f Makefile
-maintainer-clean-am: distclean-am maintainer-clean-generic
-
-mostlyclean: mostlyclean-am
-
-mostlyclean-am: mostlyclean-compile mostlyclean-generic \
- mostlyclean-libtool
-
-pdf: pdf-am
-
-pdf-am:
-
-ps: ps-am
-
-ps-am:
-
-uninstall-am:
-
-.MAKE: install-am install-strip
-
-.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \
- clean-libtool ctags distclean distclean-compile \
- distclean-generic distclean-libtool distclean-tags distdir dvi \
- dvi-am html html-am info info-am install install-am \
- install-data install-data-am install-dvi install-dvi-am \
- install-exec install-exec-am install-html install-html-am \
- install-info install-info-am install-man install-pdf \
- install-pdf-am install-ps install-ps-am install-strip \
- installcheck installcheck-am installdirs maintainer-clean \
- maintainer-clean-generic mostlyclean mostlyclean-compile \
- mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
- tags uninstall uninstall-am
-
- benchmark-matmul \
- benchmark-spmv \
- benchmark-fields
-
-# BENCH_ALGOS= \
-#TODO=
- benchmark-solve \
- benchmark-rank \
- benchmark-det \
- benchmark-nullspace
-
-# BENCH_FORMS= \
-#TODO=
- benchmark-lu
- benchmark-echelon \
- benchmark-hermite \
- benchmark-smith
-
-benchmarks: ${EXTRA_PROGRAMS}
-
-# for compilation of new benchmarks
-%:%.C
- $(CXX) $(AM_CXXFLAGS) $(CXXFLAGS) $(OPTFLAGS) ${INCLUDES} $(AM_CPPFLAGS) $*.C -o $@ $(LDFLAGS) $(LDADD) $(LOADLIBES) $(top_srcdir)/linbox/.libs/liblinbox.a
-
-%:%.cpp
- $(CXX) $(AM_CXXFLAGS) $(CXXFLAGS) $(OPTFLAGS) ${INCLUDES} $(AM_CPPFLAGS) $*.cpp -o $@ $(LDFLAGS) $(LDADD) $(LOADLIBES) $(top_srcdir)/linbox/.libs/liblinbox.a
-
-# Tell versions [3.59,3.63) of GNU make to not export all variables.
-# Otherwise a system limit (for SysV at least) may be exceeded.
-.NOEXPORT:
diff --git a/benchmarks/README b/benchmarks/README
new file mode 100644
index 0000000..48b336f
--- /dev/null
+++ b/benchmarks/README
@@ -0,0 +1,95 @@
+These notes stem from a discussion by Johnson, Harrison, Yuhasz, Youse, Stachnik
+, Saunders at UDel June 2013.
+
+It is proposed that experiment data files be csv files containing a metadata sec
+tion followed by a measurement section. The idea is that (1) each experimental run will make such a file (or add to such a file) and (2) each plot and table generation can then be done from such files as input.
+
+The metadata is a series of key-value pairs ending in one whose key is "end"
+This is followed by a line containing a list of keys (column labels) and then some number of lines recording experiments. These are lists of values corresponding to the column labels.
+The value "-" denotes "missing" or "undefined".
+When value v in a "k,v" pair is another keyword, it means that k's value is the same as the other keyword's.
+Blank lines are ignored.
+C++ comment conventions are followed (use of "//" and "/* ... */").
+This is for "commented out" text and should not be confused with values of the keyword "comment".
+
+Metadata reveals key values that are held constant in the experiments.
+The column labels are the keys whose values will vary from experiment to experiment.i
+Experiment data lines record the key values for the column labels of a given experiment.
+
+For example:
+------------------
+comment, exploration of foo parallel and blocked variants
+problem, foo
+date, 2013June21
+author, joe linboxer\, bds
+rowdim, 10000
+//coldim, rowdim
+coldim, 20000
+blockcoldim, blockrowdim
+matrix class, randomMat
+field, Givaro::Modular<double>(101)
+flops formula, (n*nnz)/time
+comment, no parsing guidance is offered yet for mflops formula
+end, metadata
+time, nnz, blockrowdim, threads, algorithm, comment
+0.001, 10000, 26, 1, block-coppersmith, blockdim is about 2lg(dim)
+1.1e-5, 10000, 100, 48, block-coppersmith-omp, blockdim is sqrt(dim)
+1.1e-5, 100000, -, 1, matrix-build, -
+...
+------------------
+
+For consistency and particularly for generating reports on data from multiple data files, the following key name conventions should be followed. Other key names should be used only when one of these does not fit.
+
+-----
+// algorithm properties
+problem - the algorithmic task being measured (eg. solveNonsingular).
+algorithm - a specific implementation of a method to solve the problem
+(eg. solve(Method::Wiedemann) or solve-omp).
+time - the runtime for the experiment task
+flops - the nominal operation count for the task. The flops formula should be made clear in the metadata.
+blockrowdim - row blocking used
+blockcoldim - col blocking used
+...
+
+// domain of computation properties
+field - arithmetic domain class used (when it is a field) (eg. Givaro::Modular<int>).
+ring - arithmetic domain class used (eg. PID_integer).
+matrix domain - arithmetic domain used (ring or field extended by matrix ops)
+(eg. BlasMatrixDomain).
+modulus - characteristic of the field or ring (eg. 200000000000003).
+exponent - exponent of the modulus.
+...
+
+// environment-of-computation properties
+date - the date of the experiment(s) (eg. 2013June22).
+author - name or list of names of the person(s) running the experiments.
+computer - computer description (cores, mem, cache, speeds, etc.).
+threads - number of threads used.
+...
+
+// matrix properties (when problem has a key matrix as data)
+matrix class - blackbox template or class (eg. SparseMatrix or BlasMatrix or MatrixDomain::Submatrix).
+matrix constructor - eg. randomMat.
+// Properties of the constructed instance (depends on matrix class and constructor
+rowdim -
+coldim -
+nnz -
+rank - Pesumably one knows from context whether this is a parameter or computed result.
+det - Pesumably one knows from context whether this is a parameter or computed result.
+...
+-----
+
+Further remarks.
+
+Other shared keywords can be added...
+
+Some keywords, whose values are strings, should have a standardized list of possible values...
+
+For convenience we could have a file of some keyword constants.
+For example, some keywords which are machine names
+with corresponding value a description,
+eg., "hmrg, Dell Poweredge 2650 2-Xeon (3.2GHz)".
+Then a data file's metadata can include "computer, hmrg" for short.
+@ can be the "value of" operator, as in "computer, @hmrg", wherein the value expands to the value of hmrg.
+
+The experiment lines (below metadata and column labels) should be readable by gnuplot (this is a constraint on number and string representations).
diff --git a/benchmarks/benchmark-crafixed.C b/benchmarks/benchmark-crafixed.C
deleted file mode 100644
index b964b06..0000000
--- a/benchmarks/benchmark-crafixed.C
+++ /dev/null
@@ -1,384 +0,0 @@
-
-/* Copyright (C) 2011 LinBox
- * Written by BB <brice.boyer at imag.fr>
- *
- *
- *
- * ========LICENCE========
- * This file is part of the library LinBox.
- *
- * LinBox is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- * ========LICENCE========
- */
-
-/*! @file benchmarks/benchmark-crafixed.C
- * @ingroup benchmarks
- * @brief Benchmarking fixed CRA routines.
- * Here we make benchmarks for CRT (Chinese Remaindering Theorem/Algorithm) in
- * the following case. Let \f$\mathbf{v}\f$ be a vector of size \f$n\f$ and
- * whose entries have at most \f$l\f$ bits (signed or unsigned). Suppose that
- * we only know \f$\mathbf{v} \mod p_i\f$ for many primes \f$p_i\f$. We try
- * and reconstruct \f$\mathbf{v}\f$ from these residues.
- *
- * We benchmark for one vector or \f$m\f$ repetitions on different vectors.
- *
- * We use the implementations in LinBox, Givaro, IML and NTL (if the latter two
- * are available).
- *
- * @warning this is not a benchmark for one integer to reconstruct or a for BlasMatrix.
- */
-
-#include "benchmarks/benchmark.h"
-#include "linbox/util/debug.h"
-#include "linbox/field/modular.h"
-#include "linbox/field/modular-balanced.h"
-#include "linbox/matrix/random-matrix.h"
-#include "linbox/algorithms/blas-domain.h"
-#include "linbox/algorithms/rns.h"
-
-#include "linbox/algorithms/cra-domain.h"
-#include "linbox/algorithms/cra-early-multip.h"
-#include "linbox/integer.h"
-
-#ifdef __LINBOX_HAVE_IML
-#include "linbox/util/iml_wrapper.h"
-#endif
-
-#define _LB_LOG2 0.69314718055994530941
-
-using Givaro::Timer ;
-using LinBox::integer;
-
-// typedef std::vector<LinBox::integer> Ivect ;
-// typedef std::vector<double> Fvect ;
-
-struct ReductVect {
- std::vector<integer> & _v ;
-
- ReductVect(std::vector<integer> &v) :
- _v(v)
- { } ;
-
- template<typename Field>
- std::vector<typename Field::Element> &
- operator()(std::vector<typename Field::Element> & r, const Field & F) const
- {
- typedef typename Field::Element Element;
- typedef std::vector<Element> Fvect;
- typedef typename Fvect::iterator Iter;
-
- //! @todo LinBox hom or magic here ?
- std::vector<integer>::iterator j = _v.begin();
-
- for (Iter i = r.begin() ; i != r.end() ; ++i,++j) {
- F.init(*i,*j);
- }
- return r ;
- }
-
-};
-
-struct ReductVectIterator ;
-namespace LinBox
-{
- template<class Element> struct CRATemporaryVectorTrait<ReductVectIterator ,Element> {
- typedef typename std::vector<double>::iterator Type_t;
- };
-}
-
-struct ReductVectIterator {
- std::vector<integer> & _v ;
- mutable std::vector<double> _r ;
-
- ReductVectIterator(std::vector<integer> &v) :
- _v(v)
- {
- _r.resize(v.size());
- } ;
-
- template<typename Iterator, typename Field>
- Iterator &
- operator()(Iterator & r, const Field & F) const
- {
- typedef typename Field::Element Element;
- typedef std::vector<Element> Fvect;
- typedef typename Fvect::iterator Iter;
-
- //! @todo LinBox hom or magic here ?
- std::vector<integer>::iterator j = _v.begin();
- for (std::vector<double>::iterator i = _r.begin() ; i != _r.end() ; ++i,++j) {
- F.init(*i,*j);
- }
- return r= _r.begin() ;
- }
-
-
-};
-
-template<class Field>
-struct ReductPoint {
- integer & _v ;
- typedef typename Field::Element Element;
- ReductPoint(integer &v) :
- _v(v)
- {} ;
- Element & operator()(Element & r, const Field & F)
- {
- F.init(r,_v);
- return r ;
- }
-};
-
-
-
-/*! Bench CRA.
- * @param n size of vector to reconstruct (>1)
- * @param m number of vectors to reconstruct
- * @param l size of the integers
- * @tparam Unsigned use >=0 random integers or not.
- * @param Data collects timings
- */
-template<bool Unsigned>
-int bench_cra(index_t n, index_t m, index_t l
- , LinBox::PlotData<index_t> & Data)
-{
-
- Timer tim, chrono ;
- typedef std::vector<LinBox::integer> Ivect ;
- { /* LinBox CRA */
- tim.clear();
- typedef LinBox::Modular<double> ModularField ;
- typedef LinBox::FullMultipFixedCRA< ModularField > CRAbase ;
- unsigned int PrimeSize = 22;
- double logV = l*_LB_LOG2 ;
- if (!Unsigned) logV += _LB_LOG2 ;
- std::cout << "size to reconstruct : " << logV << std::endl;
- LinBox::RandomPrimeIterator genprime( PrimeSize );
- for (size_t i = 0 ; i < (size_t) m ; ++i) { // repeat m times
- // create the vector to reconstruct
- Ivect V(n),R(n) ;
- for (Ivect::iterator it = V.begin() ; it != V.end() ; ++it) {
- integer::random_lessthan<Unsigned>(*it,l) ;
- }
-#ifdef _LB_DEBUG
- for (Ivect::iterator it = V.begin() ; it != V.end() ; ++it) {
- if (naturallog(*it) > logV) {
- std::cout << *it << " too big (" << naturallog(*it) << ")" << std::endl;
- }
- }
-#endif
-
- LinBox::ChineseRemainder< CRAbase > cra( std::pair<size_t,double>(n, logV) );
- ReductVectIterator iteration(V);
- chrono.clear(); chrono.start();
- Ivect::iterator Rit = R.begin();
- cra(Rit, iteration, genprime);
- chrono.stop();
- tim += chrono ;
- if (!std::equal(R.begin(),R.end(),V.begin())) {
- std::cerr << "*** LinBox CRA failed " << (Unsigned?"positive":"general") << " ***" << std::endl;
- std::cerr << R << std::endl << "expecting " << std::endl << V << std::endl;
- }
- // else
- // std::cerr << "ok" << std::endl;
- }
- std::cout << "LinBox CRA :" << tim << std::endl;
- }
-
- { /* LinBox Early CRA */
- tim.clear();
- typedef LinBox::Modular<double> ModularField ;
- typedef LinBox::EarlyMultipCRA< ModularField > CRAbase ;
- unsigned int PrimeSize = 22;
- LinBox::RandomPrimeIterator genprime( PrimeSize );
- for (size_t i = 0 ; i < (size_t) m ; ++i) { // repeat m times
- // create the vector to reconstruct
- Ivect V(n),R(n) ;
- for (Ivect::iterator it = V.begin() ; it != V.end() ; ++it) {
- integer::random_lessthan<Unsigned>(*it,l) ;
- }
-
- LinBox::ChineseRemainder< CRAbase > cra (4);
- ReductVect iteration(V);
- chrono.clear(); chrono.start();
- // Ivect::iterator Rit = R.begin();
- cra(R, iteration, genprime);
- chrono.stop();
- tim += chrono ;
- if (!std::equal(R.begin(),R.end(),V.begin())) {
- std::cerr << "*** LinBox early CRA failed " << (Unsigned?"positive":"general") << " ***" << std::endl;
- std::cerr << R << std::endl << "expecting " << std::endl << V << std::endl;
- }
- // else
- // std::cerr << "ok" << std::endl;
- }
- std::cout << "LinBox early CRA :" << tim << std::endl;
- }
-
- { /* do givaro crt */
- // Init RNS
- typedef LinBox::Modular<double> ModularField ;
- tim.clear();
- LinBox::RNS<Unsigned> rns(l) ;
- chrono.clear() ; chrono.start() ;
- rns.initCRA();
- chrono.stop();
- tim += chrono;
- for (size_t i = 0 ; i < (size_t) m ; ++i) { // repeat m times
- Ivect V(n),R(n) ;
- for (Ivect::iterator it = V.begin() ; it != V.end() ; ++it) {
- integer::random_lessthan<Unsigned>(*it,l) ;
- }
- ReductVect iteration(V);
- chrono.clear(); chrono.start();
- rns.cra(R,iteration);
- chrono.stop();
- tim += chrono ;
- if (!std::equal(R.begin(),R.end(),V.begin())) {
- std::cerr << "*** Givaro CRT failed " << (Unsigned?"positive":"general") << "***" << std::endl;
- std::cerr << R << std::endl << "expecting " << std::endl << V << std::endl;
- }
- // else
- // std::cerr << "ok" << std::endl;
-
- }
- std::cout << "GivCRT :" << tim << std::endl;
- }
-
- { /* do givaro fixed */
- // Init RNS
- typedef LinBox::Modular<double> ModularField ;
- tim.clear();
- LinBox::RNSfixed<Unsigned> rns(l) ;
- chrono.clear() ; chrono.start() ;
- rns.initCRA();
- chrono.stop();
- tim += chrono;
- for (size_t i = 0 ; i < (size_t) m ; ++i) { // repeat m times
- Ivect V(n),R(n) ;
- for (Ivect::iterator it = V.begin() ; it != V.end() ; ++it) {
- integer::random_lessthan<Unsigned>(*it,l) ;
- }
- ReductVect iteration(V);
- chrono.clear(); chrono.start();
- rns.cra(R,iteration);
- chrono.stop();
- tim += chrono ;
- if (!std::equal(R.begin(),R.end(),V.begin())) {
- std::cerr << "*** givaro fixed failed " << (Unsigned?"positive":"general") << "***" << std::endl;
- std::cerr << R << std::endl << "expecting " << std::endl << V << std::endl;
- }
- // else
- // std::cerr << "ok" << std::endl;
-
- }
- std::cout << "Giv CRT Fixed :" << tim << std::endl;
- }
-
-#if 1 /* IML */
-#ifdef __LINBOX_HAVE_IML
- { /* do iml cra */
- typedef LinBox::Modular<double> ModularField ;
- tim.clear();
-
- /* Init RNS */
- chrono.clear() ; chrono.start() ;
- long basislen = 0 ;
- IML::Double primesize;
- integer product ;
- primesize = pow(2,22);
- product = pow((integer)2,l);
- // mpz_init(maxi); mpz_init(mp_maxInter);
- // comment les trouver ?
-
- IML::FiniteField ** RNS = IML::findRNS(primesize,product.get_mpz(),&basislen);
- IML::FiniteField * liftbasis = RNS[0] ; // findLiftbasisSmall(n, maxi, &basislen);
- IML::FiniteField * cmbasis = RNS[1] ; // combBasis(basislen,basis);
- mpz_t mp_prod ;
- IML::FiniteField * bdcoeffs = NULL ;
- IML::Double * Vp = IML_XMALLOC(IML::Double,n*basislen);
- if (!Unsigned) {
- mpz_init(mp_prod);
- IML::basisProd(basislen,liftbasis,mp_prod);
- bdcoeffs = IML::repBound(basislen, liftbasis, cmbasis) ;
- }
- chrono.stop();
- tim += chrono;
-
- /* loop m times */
- for (size_t i = 0 ; i < (size_t) m ; ++i) { // repeat m times
- /* init result */
- Ivect V(n),R(n) ;
- for (Ivect::iterator it = V.begin() ; it != V.end() ; ++it) {
- integer::random_lessthan<Unsigned>(*it,l) ;
- }
- ReductVect iteration(V);
- for (size_t j = 0 ; j < (size_t)basislen ; ++j) {
- std::vector<double> G ;
- iteration(G,ModularField((integer)liftbasis[j]));
- for (size_t k = 0 ; k < (size_t)n ; ++k)
- Vp[j+k*basislen] = G[k] ;
- }
-
- /* CRA */
-
- // fooooooooooooooor
- if (!Unsigned) {
- for (size_t j = 0 ; j < (size_t)n ; ++j)
- IML::ChineseRemainderPos(basislen, liftbasis, cmbasis, Vp+j, R[j].get_mpz());
- }
- else {
- for (size_t j = 0 ; j < (size_t)n ; ++j)
- IML::ChineseRemainder(basislen, mp_prod, liftbasis, cmbasis, bdcoeffs, Vp+j, R[j].get_mpz()) ;
-
- }
- IML_XFREE(cmbasis);
- IML_XFREE(liftbasis);
- if (!Unsigned) {
- mpz_clear(mp_prod);
- IML_XFREE(bdcoeffs);
- }
- /* END */
- }
- }
-#endif // __LINBOX_HAVE_IML
-#endif
-
- /* do ntl cra */
- // Init primes
- for (size_t i = 0 ; i < (size_t) m ; ++i) { // repeat m times
- }
- return EXIT_SUCCESS ;
-}
-
-int main(int ac, char** av)
-{
- static index_t m = 10 ;
- static index_t l = 200 ;
- static index_t n = 10 ;
- LinBox::PlotData<index_t> Data(n,m);
- bench_cra<true>(n,m,l,Data);
- bench_cra<false>(n,m,l,Data);
- return EXIT_SUCCESS ;
-}
-
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
-// Local Variables:
-// mode: C++
-// tab-width: 8
-// indent-tabs-mode: nil
-// c-basic-offset: 8
-// End:
-
diff --git a/benchmarks/benchmark-example.C b/benchmarks/benchmark-example.C
new file mode 100644
index 0000000..ea3d578
--- /dev/null
+++ b/benchmarks/benchmark-example.C
@@ -0,0 +1,368 @@
+/* Copyright (C) 2011 LinBox
+ * Written by Brice Boyer (briceboyer) <boyer.brice at gmail.com>
+ *
+ *
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ * ========LICENCE========
+ */
+
+/*! @file benchmarks/benchmark-example.C
+ * @ingroup benchmarks
+ * @brief Benchmarking example
+ * @example benchmark
+ */
+
+#include "benchmarks/benchmark.h"
+#include "linbox/util/error.h"
+#include "fflas-ffpack/fflas-ffpack.h"
+#include "linbox/ring/modular.h"
+#include "linbox/matrix/random-matrix.h"
+#include "linbox/matrix/dense-matrix.h"
+#include "linbox/matrix/matrix-domain.h"
+#include "linbox/matrix/sparse-matrix.h"
+#include "linbox/solutions/rank.h"
+
+#include <givaro/modular-balanced.h>
+
+
+using namespace LinBox ;
+using Givaro::Timer;
+
+/* compute MegaFLOPS for mat mul (2 m n k) */
+double mm_mflops(size_t m, size_t n, size_t k)
+{
+ return 2*(double)m/100*(double)n/100*(double)k/100 ;
+}
+
+/* Benchmark on a field */
+
+/*! @internal
+ * @brief launches the benchmarks for the square case.
+ * @param F field
+ * @param min min size to bench
+ * @param max max size to bench
+ * @param step step between two sizes
+ * @param Data where data is stored
+ * @param series_nb index of the current series of measures.
+ */
+template<class Field>
+void launch_bench_square(Field & F // const problem
+ , size_t min, size_t max, size_t step // no negative step
+ , PlotData & Data
+ )
+{
+ linbox_check(step);
+ linbox_check(min <= max);
+
+ std::ostringstream nam ;
+ F.write(nam);
+ // Data.setCurrentSeriesName(nam.str());
+
+ Data.newSeries(nam.str());
+ Chrono<Timer> TW ;
+
+ typedef typename Field::RandIter Randiter ;
+ Randiter R(F) ;
+ BlasMatrixDomain<Field> BMD(F) ;
+ RandomDenseMatrix<Randiter,Field> RandMat(F,R);
+
+ for ( size_t i = min ; i < max ; i += step ) {
+
+ showAdvanceLinear(i,min,max);
+ size_t ii = i ;
+ BlasMatrix<Field> A (F,ii,ii);
+ BlasMatrix<Field> B (F,ii,ii);
+ BlasMatrix<Field> C (F,ii,ii);
+
+ size_t j = 0 ; // number of repets.
+
+ RandMat.random(A);
+ RandMat.random(B);
+ RandMat.random(C);
+ TW.clear() ;
+ while( Data.keepon(j,TW.time(),false) ) {
+ TW.start() ;
+ BMD.mul(C,A,B) ; // C = AB
+ TW.stop();
+ ++j ;
+ }
+ double mflops = computeMFLOPS(TW.times(),mm_mflops(i,i,i));
+
+ Data.setCurrentSeriesEntry(i,mflops,(double)i,TW.time()); // could be i*i*i
+
+ }
+
+ Data.finishSeries();
+}
+
+/* Collects Benchmarks */
+
+
+/*! @brief Benchmark square fgemm Y=AX for several fields.
+ * @param min min size
+ * @param max max size
+ * @param step step of the size between 2 benchmarks
+ * @param charac characteristic of the field.
+ */
+void bench_square( size_t min, size_t max, size_t step, int charac )
+{
+
+ size_t nb = 1 ;// une col de plus (la première)
+ typedef Givaro::Modular<double> Field0 ; ++nb ;
+ typedef Givaro::Modular<float> Field1 ; ++nb ;
+ // typedef Givaro::Modular<int32_t> Field2 ; ++nb ;
+ // typedef Givaro::ModularBalanced<double> Field3 ; ++nb ;
+ // typedef Givaro::ModularBalanced<float> Field4 ; ++nb ;
+ // typedef Givaro::ModularBalanced<int32_t> Field5 ; ++nb ;
+ // GivaroZpZ
+
+ ///// DATA HARVEST ////
+
+ PlotData Data;
+ showProgression Show(nb) ;
+
+ Field0 F0(charac) ;
+ // launch_bench_square<Field0>(F0,100,1500,300,Data);
+ launch_bench_square<Field0>(F0,min,max,step,Data);
+ Show.FinishIter();
+
+ if (charac < 2048) {
+ Field1 F1(charac) ;
+ // launch_bench_square(F1,200,1500,200,Data);
+ launch_bench_square(F1,min,max,step,Data);
+ Show.FinishIter();
+ }
+ else {
+ Show.SkipIter();
+ }
+
+
+
+#if 0
+ Field2 F2(charac) ;
+ launch_bench_square(F2,min,max,step,Data);
+ Show.FinishIter();
+
+ Field3 F3(charac) ;
+ launch_bench_square(F3,min,max,step,Data);
+ Show.FinishIter();
+
+ if (charac < 2048) {
+ Field4 F4(charac) ;
+ launch_bench_square(F4,min,max,step,Data);
+ Show.FinishIter();
+ }
+ else {
+ Show.SkipIter();
+ }
+
+ Field5 F5(charac) ;
+ launch_bench_square(F5,min,max,step,Data);
+ Show.FinishIter();
+#endif
+
+ ///// PLOT STYLE ////
+ LinBox::PlotStyle Style;
+
+ Style.setTerm(LinBox::PlotStyle::Term::eps);
+ Style.setTitle("BlasMatrixDomain mul","Mflops","dimensions");
+
+ Style.setPlotType(LinBox::PlotStyle::Plot::graph);
+ Style.setLineType(LinBox::PlotStyle::Line::linespoints);
+
+
+ LinBox::PlotGraph Graph(Data,Style);
+ Graph.setOutFilename("bmdmul_square");
+
+ // Graph.plot();
+
+ Graph.print(Tag::Printer::gnuplot);
+
+ Graph.print(Tag::Printer::tex);
+ Graph.print(Tag::Printer::csv);
+
+ return ;
+
+}
+
+template<class Field>
+void launch_bench_rank(const Field &F, const std::string & name
+ , PlotData & Data
+ )
+{
+
+ SparseMatrix<Field> Mat(F);
+ std::ifstream mat1 (name);
+ Mat.read(mat1);
+
+ MatrixMetaData mmd (Mat,name);
+
+ // Data.newSeries(name);
+ Chrono<Timer> TW ;
+
+ showAdvanceLinear(1,1,2);
+
+ TW.clear() ;
+ size_t j = 0 ;
+ while( Data.keepon(j,TW.time()) ) {
+ TW.start() ;
+ unsigned long d ;
+ LinBox::rank(d,Mat,Method::Blackbox());
+ TW.stop();
+ ++j ;
+ }
+
+ // double mflops = computeMFLOPS(TW.times(),mm_mflops(i,i,i));
+
+ Data.setSeriesEntry("Rank (Blackbox)",name,TW.time(),(double)Mat.size(),TW.time());
+ Data.addCurrentEntryMetaData(mmd);
+ // Data.addCurrentSeriesMetaData(mmd);
+ // Data.addMetaData(mmd);
+
+
+ showAdvanceLinear(2,1,2);
+
+ TW.clear() ;
+ j = 0 ;
+ while( Data.keepon(j,TW.time()) ) {
+ TW.start() ;
+ unsigned long d ;
+ LinBox::rank(d,Mat,Method::SparseElimination());
+ TW.stop();
+ ++j ;
+ }
+
+ Data.selectSeries("Rank (SparseElimination)");
+ Data.setCurrentSeriesEntry(name,TW.time(),(double)Mat.size(),TW.time());
+ Data.addCurrentEntryMetaData(mmd);
+
+}
+
+void bench_rank(int carac)
+{
+ typedef Givaro::Modular<double> Field0 ;
+ Field0 F(carac);
+ int nb = 1;
+
+ //! @bug no gz reader ?
+
+ std::string m1 = "matrix/bibd_12_5_66x792.sms" ; ++nb;
+ std::string m2 = "matrix/bibd_13_6_78x1716.sms" ; ++nb;
+ std::string m3 = "matrix/bibd_14_7_91x3432.sms" ; ++nb;
+
+ PlotData Data;
+ showProgression Show((size_t)nb) ;
+
+ launch_bench_rank(F,m1,Data);
+ Show.FinishIter();
+
+ launch_bench_rank(F,m2,Data);
+ Show.FinishIter();
+
+ launch_bench_rank(F,m3,Data);
+ Show.FinishIter();
+
+ ///// PLOT STYLE ////
+ LinBox::PlotStyle Style;
+ Style.setTerm(LinBox::PlotStyle::Term::eps);
+ Style.setTitle("Rank algorithms","seconds","matrices");
+ Style.setXtics(LinBox::PlotStyle::Options::oblique);
+
+ /* default
+ Style.setPlotType(LinBox::PlotStyle::Plot::histo);
+ Style.setLineType(LinBox::PlotStyle::Line::histogram);
+ */
+
+
+ LinBox::PlotGraph Graph(Data,Style);
+ Graph.setOutFilename("rank_comparison");
+
+ // Graph.plot();
+
+ Graph.print(Tag::Printer::gnuplot);
+
+ // change style
+ Graph.refStyle().setTerm(LinBox::PlotStyle::Term::png);
+ Graph.print(Tag::Printer::gnuplot);
+
+ Graph.print(Tag::Printer::xml);
+ Graph.print(Tag::Printer::html);
+
+ return;
+}
+
+/* main */
+
+int main( int ac, char ** av)
+{
+ /* Argument parsing/setting */
+
+ static size_t min = 100; /* min size */
+ static size_t max = 1500; /* max size (not included) */
+ static size_t step = 300; /* step between 2 sizes */
+ // static std::list<int> lst ; /* what bench to start ? */
+ // lst.push_front(1);// ={1,2} vivement le nouveau std...
+ // lst.push_front(2);
+
+ static Argument as[] = {
+ { 'm', "-m min" , "Set minimal size of matrix to test." , TYPE_INT , &min },
+ { 'M', "-M Max" , "Set maximal size." , TYPE_INT , &max },
+ { 's', "-s step", "Sets the gap between two matrix sizes.", TYPE_INT , &step },
+ // { 'l', "-l list", "Only launches a subset of available benchmarks\n - 1: compare to raw blas\n - 2:various square sizes\n - 3:various shapes\n - 4: various parameters (a,b)\n - 5 : various transp. combinations", TYPE_INTLIST, &lst },
+ END_OF_ARGUMENTS
+ };
+
+ parseArguments (ac, av, as);
+
+ if (min >= max) {
+ throw LinBoxError("min value should be smaller than max...");
+ }
+ if (min + step >= max) {
+ std::cout << "Warning : your x axis has only one point. You should have a smaller step." << std::endl;
+ }
+
+ /* square for various fields */
+#if 1
+ {
+ std::cout << " *** Lines plot *** " << std::endl;
+ std::cout << "Benchmark square matrix multiplication via BMD.mul()" << std::endl;
+ bench_square(min,max,step,13);
+ }
+#endif
+
+ /* different sparse matrix */
+
+ {
+ std::cout << " *** Bar plot *** " << std::endl;
+ std::cout << "Benchmark different matrices on different rank algorithms" << std::endl;
+ bench_rank(13);
+ }
+
+
+
+ return EXIT_SUCCESS ;
+}
+
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/benchmarks/benchmark-fgemm.C b/benchmarks/benchmark-fgemm.C
deleted file mode 100644
index e110c1f..0000000
--- a/benchmarks/benchmark-fgemm.C
+++ /dev/null
@@ -1,955 +0,0 @@
-
-/* Copyright (C) 2011 LinBox
- * Written by BB <brice.boyer at imag.fr>
- *
- *
- *
- * ========LICENCE========
- * This file is part of the library LinBox.
- *
- * LinBox is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- * ========LICENCE========
- */
-
-/*! @file benchmarks/benchmark-fgemm.C
- * @ingroup benchmarks
- * @brief Benchmarking dense matrix multiplication on finite fields.
- * This file benchmarks the FFLAS::fgemm implementation for various fields,
- * shape and parameters. Actually, we use the wrapper member \c mul of LinBox::BlasMatrixDomain.
- * @todo make graphs look better (legends, units,...)
- */
-
-#include "benchmarks/benchmark.h"
-#include "linbox/util/error.h"
-#include "fflas-ffpack/fflas-ffpack.h"
-#include "linbox/field/modular.h"
-#include "linbox/field/modular-balanced.h"
-#include "linbox/matrix/random-matrix.h"
-#include "linbox/matrix/blas-matrix.h"
-#include "linbox/algorithms/blas-domain.h"
-
-#include <iomanip> // setprecision
-
-/* ********************** */
-/* Outils */
-/* ********************** */
-
-using Givaro::Timer;
-
-/*! @brief Watches a timer and a number and repet and signals if over.
- *
- * We want at least 2 repetions but not more than maxtime spent on timing.
- *
- * @param repet number of previous repetitions. Should be 0 on the first time
- * \c whatchon is called.
- * @param tim timer to watch
- * @param maxtime maximum time (in seconds) until \c keepon tells stop.
- * @return \c true if we conditions are not met to stop, \c false otherwise.
- * @pre \c tim was clear at the beginning and never started.
- *
- */
-bool keepon(index_t & repet, const Timer & tim, double maxtime=0.2)
-{
- if (repet<2 || tim.usertime() < maxtime) {
- ++repet ;
- return true;
- }
- return false ;
-}
-
-bool keepon(index_t & repet, const double & tim, double maxtime=0.2)
-{
- if (repet<2 || tim < maxtime) {
- ++repet ;
- return true;
- }
- return false ;
-}
-
-
-/*! @brief Watches a timer and a number and repet and signals if over.
- *
- * We want at least 2 repetions but not more than maxtime spent on timing.
- *
- * @param repet number of previous repetitions. Should be 0 on the first time \c whatchon is called.
- * @param tim timer to watch
- * @param maxtime maximum time (in seconds) until \c watchon tells stop.
- * @return \c true if we conditions are not met to stop, \c false otherwise.
- * @pre \c tim should have been started previously !
- *
- */
-bool whatchon(index_t & repet, /* const */Timer & tim, double maxtime=0.5)
-{
- if (repet<2 || tim.userElapsedTime() < maxtime) {
- ++repet ;
- return true;
- }
- return false ;
-}
-
-void showAdvanceLinear(int curr, int min, int max)
-{
- std::cout << std::setprecision(4) << "\033[2K" << "\033[30D" << min <<std::flush;
- std::cout << '<' << curr << '<' << max << " (" << std::flush;
- std::cout << double(curr-min)/double(max-min)*100 << "%)" << std::flush;
-}
-void showFinish(int curr, int all)
-{
- std::cout << "\033[2K" << "\033[30D" << "finished : " << curr << std::flush;
- std::cout << '/' << all-1 << std::flush << std::endl;
-}
-void showSkip(int curr, int all)
-{
- std::cout << "\033[2K" << "\033[30D" << "skipped : " << curr << std::flush;
- std::cout << '/' << all-1 << std::flush << std::endl;
-}
-
-
-double fgemm_mflops(int m, int n, int k)
-{
- return 2*(double)m/100*(double)n/100*(double)k/100 ;
-}
-
-double compute_mflops(const Timer & t, const double mflo, const int rpt = 1)
-{
- linbox_check(rpt);
- return (double) ((mflo*rpt)/t.usertime());
-}
-
-double compute_mflops(const double & t, const double mflo, const int rpt = 1)
-{
- linbox_check(rpt);
- return (double) ((mflo*rpt)/t);
-}
-
-/*! @internal
- * @brief launches the benchmarks for the square case.
- * @param F field
- * @param min min size to bench
- * @param max max size to bench
- * @param step step between two sizes
- * @param Data where data is stored
- * @param series_nb index of the current series.
- */
-template<class Field>
-void launch_bench_square(Field & F // const problem
- , index_t min, index_t max, int step
- , LinBox::PlotData<index_t> & Data
- , index_t series_nb)
-{
- index_t l = 0 ;
- Timer fgemm_sq_tim ;
- Timer chrono ;
- double mflops ;
- typedef typename Field::Element Element;
- typedef typename Field::RandIter Randiter ;
- Randiter R(F) ;
- LinBox::BlasMatrixDomain<Field> BMD(F) ;
- LinBox::RandomDenseMatrix<Randiter,Field> RandMat(F,R);
- // index_t repet = 3 ;
- for ( index_t i = min ; i < max ; i += step , ++l ) {
- showAdvanceLinear(i,min,max);
- int ii = i ; // sinon, le constructeur le plus proche serait (_Matrix,_Field)... n'impnawak...
- LinBox::BlasMatrix<Field> A (F,ii,ii);
- LinBox::BlasMatrix<Field> B (F,ii,ii);
- LinBox::BlasMatrix<Field> C (F,ii,ii);
- if (!series_nb)
- Data.setAbsciName(l,i); // only write abscissa for serie 0
- index_t j = 0 ; // number of repets.
-
- RandMat.random(A);
- RandMat.random(B);
- RandMat.random(C);
- fgemm_sq_tim.clear() ;
- while( keepon(j, fgemm_sq_tim) ) {
- chrono.clear() ; chrono.start() ;
- BMD.mul(C,A,B) ; // C = AB
- chrono.stop();
- fgemm_sq_tim += chrono ;
- }
- if (!j){
- std::cout << "multiplication did not happen" << std::endl;
- }
-#ifdef _LB_DEBUG
- else {
- std::cout << i << ',' << j << std::endl;
- }
-#endif
- mflops = compute_mflops(fgemm_sq_tim,fgemm_mflops(i,i,i),j);
- Data.setEntry(series_nb,l,mflops);
-
- }
- std::ostringstream nam ;
- nam << '\"' ;
- F.write(nam);
- nam << '\"' ;
- Data.setSerieName(series_nb,nam.str());
-
-}
-
-/*! @internal
- * @brief launches the benchmarks for the square case directly BLAS.
- * @param min min size to bench
- * @param max max size to bench
- * @param step step between two sizes
- * @param Data where data is stored
- * @param series_nb index of the current series.
- */
-template<class Field>
-void launch_bench_blas(Field & F
- , index_t min, index_t max, int step
- , LinBox::PlotData<index_t> & Data
- , index_t series_nb
- )
-{
- // typedef LinBox::Modular<T> Field ;
- // Field F((int)charact);
- index_t l = 0 ;
- Timer fgemm_blas_tim ;
- Timer chrono ;
- double mflops ;
- typedef typename Field::Element Element ;
- typedef typename Field::RandIter Randiter;
- Randiter R(F) ;
- // LinBox::BlasMatrixDomain<Field> BMD(F) ;
- // LinBox::RandomDenseMatrix<Randiter,Field> RandMat(F,R);
- // index_t repet = 3 ;
- index_t mm = max * max ;
- Element * A = new Element[mm] ;
- Element * B = new Element[mm] ;
- Element * C = new Element[mm] ;
- // typedef typename LinBox::UnparametricField<T> FloatingDomain ;
- // FloatingDomain G ;
-
- for ( index_t i = min ; i < max ; i += step , ++l ) {
- showAdvanceLinear(i,min,max);
-
- int ii = i ; // sinon, le constructeur le plus proche serait (_Matrix,_Field)... n'impnawak...
- index_t mimi = (index_t) ii*ii ;
- if (!series_nb)
- Data.setAbsciName(l,i); // only write abscissa for serie 0
-
- for (index_t j = 0 ; j < mimi ; ++j) R.random(A[j]);
- for (index_t j = 0 ; j < mimi ; ++j) R.random(B[j]);
- for (index_t j = 0 ; j < mimi ; ++j) R.random(C[j]);
-
- index_t j = 0 ;
- fgemm_blas_tim.clear() ;
- // double fgemm_blas_tim = 0 ;
- while(keepon(j,fgemm_blas_tim)) {
- chrono.clear(); chrono.start() ;
- FFLAS::fgemm((typename Field::Father_t)F,FFLAS::FflasNoTrans,FFLAS::FflasNoTrans,
- ii,ii,ii,
- F.one,
- A,ii,B,ii,
- F.zero,
- C,ii) ;
- chrono.stop() ;
- fgemm_blas_tim += chrono ;
- }
- mflops = compute_mflops(fgemm_blas_tim,fgemm_mflops(i,i,i),j);
-// #ifndef NDEBUG
- if (i >=950 && i <= 1050 ) {
- std::cerr << std::endl<< typeid(Field).name() << ' ' << i << ':' << mflops << std::endl;
- std::cerr << fgemm_blas_tim << std::endl;
- }
-// #endif
-
- Data.setEntry(series_nb,l,mflops);
- }
-
- delete[] A ;
- delete[] B ;
- delete[] C ;
- std::ostringstream nam ;
- nam << '\"' ;
- F.write(nam);
- nam << '\"' ;
- Data.setSerieName(series_nb,nam.str());
-
-}
-
-/*! @internal
- * @brief launches the benchmarks for the square case.
- * C= AB
- * @param F field
- * @param m rows in A
- * @param k cols in A
- * @param n cols in C
- * @param Data where data is stored
- * @param point_nb point to be computed
- */
-template<class Field>
-void launch_bench_rectangular(Field & F // const problem
- , int m, int k, int n
- , LinBox::PlotData<std::string> & Data
- , index_t point_nb)
-{
- Timer fgemm_rect_tim ;
- Timer chrono ; chrono.clear();
- double mflops ;
- typedef typename Field::Element Element;
- typedef typename Field::RandIter Randiter ;
- Randiter R(F) ;
- LinBox::BlasMatrixDomain<Field> BMD(F) ;
- LinBox::RandomDenseMatrix<Randiter,Field> RandMat(F,R);
- // index_t repet = 3 ;
- LinBox::BlasMatrix<Field> A (F,m,k);
- LinBox::BlasMatrix<Field> B (F,k,n);
- LinBox::BlasMatrix<Field> C (F,m,n);
- index_t j = 0 ;
- fgemm_rect_tim.clear() ;
- while (keepon(j,fgemm_rect_tim)) {
- RandMat.random(A);
- RandMat.random(B);
- RandMat.random(C);
- chrono.clear() ; chrono.start() ;
- BMD.mul(C,A,B) ; // C = AB
- chrono.stop();
- fgemm_rect_tim += chrono ;
- }
- if (!j) {
- std::cout << "multiplication did not happen" << std::endl;
- }
-#ifdef _LB_DEBUG
- else {
- std::cout << point_nb << std::endl;
- }
-#endif
- mflops = compute_mflops(fgemm_rect_tim,fgemm_mflops(m,k,n),j);
- Data.setEntry(0,point_nb,mflops);
- std::ostringstream nam ;
- nam << "\"(" << m << ',' << k << ',' << n << ")\"" ;
- Data.setAbsciName(point_nb,nam.str());
-}
-
-/*! @internal
- * @brief launches the benchmarks for various parameters of a, b.
- * D = aAB+bC and C = aAB+bC ("in place" versions)
- * Are tested the following couples \c (a,b) (where \c p is invertible in \p F. This has
- * to be true when \c a=p.) :
- * - b=0 and a=1,-1,p ;
- * - a=1 and b=1,-1,p ;
- * - a=-1 and id. ;
- * - a=p and id. ;
- * .
- * We call xA = ^tA if tA is true, A otherwise.
- * @param F field
- * @param m rows in xA
- * @param k cols in xA and rows in xB
- * @param n cols in xB
- * @param alpha alpha (not zero)
- * @param beta beta
- * @tparam tA is A transposed ?
- * @tparam tB is B transposed ?
- * @param Data where data is stored
- * @param point_nb point to be computed
- * @param inplace in place or not (ie C is overwritten or not ? default = \c false.
- */
-template<class Field, bool tA, bool tB>
-void launch_bench_scalar(Field & F // const problem
- , int m, int k, int n
- , const typename Field::Element & alpha, const typename Field::Element & beta
- , LinBox::PlotData<std::string> & Data
- , index_t point_nb
- , bool inplace = false)
-{
- Timer fgemm_scal_tim ;
- Timer chrono ;
- fgemm_scal_tim.clear();
- double mflops ;
- typedef typename Field::Element Element;
- typedef typename Field::RandIter Randiter ;
- typedef typename LinBox::BlasMatrix<Field > Matrix ;
- typedef typename LinBox::TransposedBlasMatrix<Matrix > TransposedMatrix ;
- Randiter R(F) ;
- LinBox::BlasMatrixDomain<Field> BMD(F) ;
- LinBox::RandomDenseMatrix<Randiter,Field> RandMat(F,R);
- // index_t repet = 3 ;
- int mm = tA?k:m ;
- int kk = tA?m:k ;
- int nn = tB?k:n ;
- Matrix A (F,mm,kk);
- Matrix B (F,kk,nn);
- Matrix C (F,m,n);
- Matrix D (F,m,n);
- TransposedMatrix At(A);
- TransposedMatrix Bt(B);
- // LinBox::BlasMatrix<Field > A (mm,kk);
- // LinBox::BlasMatrix<Field > B (kk,nn);
- // LinBox::BlasMatrix<Field > C (m,n);
- // LinBox::BlasMatrix<Field > D (m,n);
-
-
- // LinBox::TransposedBlasMatrix<LinBox::BlasMatrix<Field > > At(A);
- // LinBox::TransposedBlasMatrix<LinBox::BlasMatrix<Field > > Bt(B);
-
- index_t j = 0 ;
- while (keepon(j,fgemm_scal_tim)) {
- RandMat.random(A);
- RandMat.random(B);
- RandMat.random(C);
-
- chrono.clear() ; chrono.start();
-
- if (inplace) {
- if (tA) {
- if (tB) {
- BMD.muladdin(beta,C,alpha,At,Bt) ; // C = alphaAB+beta C
- }
- else{
- BMD.muladdin(beta,C,alpha,At,B) ;
- }
- }
- else {
- if (tB) {
- BMD.muladdin(beta,C,alpha,A,Bt) ;
- }
- else{
- BMD.muladdin(beta,C,alpha,A,B) ;
- }
-
- }
- }
- else {
- if (tA) {
- if (tB) {
- BMD.muladd(D,beta,C,alpha,At,Bt) ; // D = alphaAB+beta C
- }
- else{
- BMD.muladd(D,beta,C,alpha,At,B) ;
- }
- }
- else {
- if (tB) {
- BMD.muladd(D,beta,C,alpha,A,Bt) ;
- }
- else{
- BMD.muladd(D,beta,C,alpha,A,B) ;
- }
-
- }
- }
-
- chrono.stop() ; fgemm_scal_tim += chrono ;
- }
- if (!j) {
- std::cout << "multiplication did not happen" << std::endl;
- }
-#ifdef _LB_DEBUG
- else {
- std::cout << point_nb << std::endl;
- }
-#endif
- mflops = compute_mflops(fgemm_scal_tim,fgemm_mflops(m,k,n),j);
- Data.setEntry(0,point_nb,mflops);
- std::ostringstream nam ;
- nam << "\"(" << m << ',' << k << ',' << n << ") ";
- nam << (inplace?"C":"D") << "=" << alpha << " " ;
- nam << (tA?"t":"")<< "A." << (tB?"t":"")<< "B+" << beta << " C\"" ;
- Data.setAbsciName(point_nb,nam.str());
-}
-
-
-/* ********************** */
-/* Tests */
-/* ********************** */
-
-/*! Benchmark fgemm Y=AX for several sizes of sqare matrices.
- * @param min min size
- * @param max max size
- * @param step step of the size between 2 benchmarks
- * @param charac characteristic of the field.
- */
-void bench_blas( index_t min, index_t max, int step, int charac )
-{
- int nb = 1 ;// une col de plus (la première)
- typedef LinBox::Modular<double> Field0 ; ++nb ;
- typedef LinBox::Modular<float> Field1 ; ++nb ;
- typedef LinBox::Modular<int32_t> Field2 ; ++nb ;
- typedef LinBox::ModularBalanced<double> Field3 ; ++nb ;
- typedef LinBox::ModularBalanced<float> Field4 ; ++nb ;
- typedef LinBox::ModularBalanced<int32_t> Field5 ; ++nb ;
- typedef LinBox::UnparametricField<double>Field6 ; ++nb ;
- typedef LinBox::UnparametricField<float> Field7 ; ++nb ;
-
- int nb_pts = (int) std::ceil((double)(max-min)/(double)step) ;
- LinBox::PlotData<index_t> Data(nb_pts,nb);
- int it = 0 ;
-
- Field0 F0(charac) ;
- launch_bench_blas(F0,min,max,step,Data,it++);
- showFinish(it,nb);
- if (charac < 2048) {
- Field1 F1(charac) ;
- launch_bench_blas(F1,min,max,step,Data,it++);
- showFinish(it,nb);
- }
- else {
- showSkip(it,nb);
- }
- Field2 F2(charac) ;
- launch_bench_blas(F2,min,max,step,Data,it++);
- showFinish(it,nb);
- Field3 F3(charac) ;
- launch_bench_blas(F3,min,max,step,Data,it++);
- showFinish(it,nb);
- if (charac < 2048) {
- Field4 F4(charac) ;
- launch_bench_blas(F4,min,max,step,Data,it++);
- showFinish(it,nb);
- }
- else {
- showSkip(it,nb);
- }
- Field5 F5(charac) ;
- launch_bench_blas(F5,min,max,step,Data,it++);
- showFinish(it,nb);
- Field6 F6(charac) ;
- launch_bench_blas(F6,min,max,step,Data,it++);
- showFinish(it,nb);
- if (charac < 2048) {
- Field7 F7((float)charac) ;
- launch_bench_blas(F7,min,max,step,Data,it++);
- showFinish(it,nb);
- }
- else {
- showSkip(it,nb);
- }
-
- linbox_check(it <= nb);
-
-
- LinBox::PlotStyle Style;
- // Style.setTerm(LinBox::PlotStyle::pdf);
- // Style.setTerm(LinBox::PlotStyle::png);
- // Style.setTerm(LinBox::PlotStyle::svg);
- Style.setTerm(LinBox::PlotStyle::Term::eps);
- Style.setTitle("FFLAS::fgemm","Mflops","dimensions");
- // Style.setType(LinBox::PlotStyle::histogram);
- // Style.setStyle("set style histogram cluster gap 1");
- // Style.addStyle("set style fill solid border -1");
- // Style.addStyle("set boxwidth 0.9");
-
- Style.setPlotType(LinBox::PlotStyle::Plot::graph);
- Style.setLineType(LinBox::PlotStyle::Line::linespoints);
- Style.setUsingSeries(std::pair<index_t,index_t>(2,nb));
-
- LinBox::PlotGraph<index_t> Graph(Data,Style);
- Graph.setOutFilename("fgemm_blas");
-
- // Graph.plot();
-
- Graph.print_gnuplot();
-
- Graph.print_latex();
-
- return ;
-
-}
-
-/*! @brief Benchmark square fgemm Y=AX for several fields.
- * @param min min size
- * @param max max size
- * @param step step of the size between 2 benchmarks
- * @param charac characteristic of the field.
- */
-void bench_square( index_t min, index_t max, int step, int charac )
-{
-
- int nb = 1 ;// une col de plus (la première)
- typedef LinBox::Modular<double> Field0 ; ++nb ;
- typedef LinBox::Modular<float> Field1 ; ++nb ;
- typedef LinBox::Modular<int32_t> Field2 ; ++nb ;
- typedef LinBox::ModularBalanced<double> Field3 ; ++nb ;
- typedef LinBox::ModularBalanced<float> Field4 ; ++nb ;
- typedef LinBox::ModularBalanced<int32_t> Field5 ; ++nb ;
- // GivaroZpZ
-
- int nb_pts = (int) std::ceil((double)(max-min)/(double)step) ;
- LinBox::PlotData<index_t> Data(nb_pts,nb);
- int it = 0 ;
-
- Field0 F0(charac) ;
- launch_bench_square(F0,min,max,step,Data,it++);
- showFinish(it,nb);
- if (charac < 2048) {
- Field1 F1(charac) ;
- launch_bench_square(F1,min,max,step,Data,it++);
- showFinish(it,nb);
- }
- else {
- showSkip(it,nb);
- }
- Field2 F2(charac) ;
- launch_bench_square(F2,min,max,step,Data,it++);
- showFinish(it,nb);
- Field3 F3(charac) ;
- launch_bench_square(F3,min,max,step,Data,it++);
- showFinish(it,nb);
- if (charac < 2048) {
- Field4 F4(charac) ;
- launch_bench_square(F4,min,max,step,Data,it++);
- showFinish(it,nb);
- }
- else {
- showSkip(it,nb);
- }
- Field5 F5(charac) ;
- launch_bench_square(F5,min,max,step,Data,it++);
- showFinish(it,nb);
- linbox_check(it <= nb);
-
- LinBox::PlotStyle Style;
- // Style.setTerm(LinBox::PlotStyle::Term::pdf);
- // Style.setTerm(LinBox::PlotStyle::Term::png);
- // Style.setTerm(LinBox::PlotStyle::Term::svg);
- Style.setTerm(LinBox::PlotStyle::Term::eps);
- Style.setTitle("BlasMatrixDomain mul","Mflops","dimensions");
-
- Style.setPlotType(LinBox::PlotStyle::Plot::graph);
- Style.setLineType(LinBox::PlotStyle::Line::linespoints);
- Style.setUsingSeries(std::pair<index_t,index_t>(2,nb));
-
- LinBox::PlotGraph<index_t> Graph(Data,Style);
- Graph.setOutFilename("bmdmul_square");
-
- // Graph.plot();
-
- Graph.print_gnuplot();
-
- Graph.print_latex();
-
- return ;
-
-}
-
-/*! @brief Benchmark fgemm Y=AX for several shapes.
- * Let n=k^2.
- * we test the following shapes :
- * - (l,nk,nk), (nk,l,nk), (nk,nk,l) : like vector-product
- * - (kl,nk,n), (nk,kl,n),(nk,n,kl) : one small rectangular matrix
- * - (kl,n,nk), (n,kl,nk),(n,nk,kl) : same
- * - (nl,n,n),(n,nl,n),(n,n,nl) : square (or close to)
- * .
- * @param k parameter.
- * @param charac characteristic of the field.
- * @param l small parameter (ie close to 1)
- */
-void bench_rectangular( index_t k, int charac, index_t l = 2 )
-{
- int n = k*k ;
- int nk = n*k ;
- int kl = k*l ;
- int nl = n*l ;
- typedef LinBox::Modular<double> Field ;
- Field F(charac) ;
-
- index_t it = 0 ; index_t nb = 12 ;
- LinBox::PlotData<std::string> Data(nb,1);
- Data.setSerieName(0,"mflops");
- launch_bench_rectangular(F,l,nk,nk,Data,it++);
- launch_bench_rectangular(F,nk,l,nk,Data,it++);
- launch_bench_rectangular(F,nk,nk,l,Data,it++);
-
- launch_bench_rectangular(F,kl,nk,n,Data,it++);
- launch_bench_rectangular(F,nk,kl,n,Data,it++);
- launch_bench_rectangular(F,nk,n,kl,Data,it++);
-
- launch_bench_rectangular(F,n,nk,kl,Data,it++);
- launch_bench_rectangular(F,nk,n,kl,Data,it++);
- launch_bench_rectangular(F,nk,kl,n,Data,it++);
-
- launch_bench_rectangular(F,nl,n,n,Data,it++);
- launch_bench_rectangular(F,n,nl,n,Data,it++);
- launch_bench_rectangular(F,n,n,nl,Data,it++);
- //!@todo resize if it>nb !!
-
- linbox_check(it==nb);
-
- LinBox::PlotStyle Style;
- Style.setTerm(LinBox::PlotStyle::Term::eps);
- Style.setTitle("fgemm","x","y");
- Style.setPlotType(LinBox::PlotStyle::Plot::histo);
- Style.setXtics(LinBox::PlotStyle::Options::oblique);// make long legends oblique.
- Style.addPlotType("set style histogram cluster gap 1");
- Style.addPlotType("set style fill solid border -1");
- Style.addPlotType("set boxwidth 0.9");
-
-
- // Style.setType(LinBox::PlotStyle::lines);
- Style.setUsingSeries(2);
-
- LinBox::PlotGraph<std::string> Graph(Data,Style);
- Graph.setOutFilename("fgemm_rect");
-
- // Graph.plot();
-
- Graph.print_gnuplot();
-
- Graph.print_latex();
-
- return ;
-
-}
-
-/*! @brief Benchmark fgemm \f$D\gets\alpha A B+\beta C\f$ for general \f$\alpha,\beta\f$.
- * @param k parameter.
- * @param charac characteristic of the field.
- * @param inplace "inplace" matmul (ie. C=D is overwritten)
- */
-void bench_scalar( index_t k, int charac, bool inplace )
-{
- typedef LinBox::Modular<double> Field ;
- typedef Field::Element Element;
- typedef Field::RandIter Randiter ;
- Field F(charac) ;
-
- index_t it = 0 ; index_t nb = 12 ;
- LinBox::PlotData<std::string> Data(nb,1);
- Data.setSerieName(0,"fgemm");
-
- Element one, zero, mOne, alpha, beta ;
- F.init(one,1);
- F.init(mOne,-1);
- F.init(zero,0);
-
-
- Randiter R(F) ;
- linbox_check(charac >=5) ;
-
- do { R.random(alpha) ; } // non trivial alpha
- while (F.areEqual(alpha,one) || F.areEqual(alpha,mOne) || F.areEqual(alpha,zero)) ;
-
- do { R.random(beta) ; }// non trivial beta
- while (F.areEqual(beta,one) || F.areEqual(beta,mOne) || F.areEqual(beta,zero)) ;
-
-
- // D = AB + beta C
- launch_bench_scalar<Field,0,0>(F,k,k,k,one,zero,Data,it++,inplace);
- launch_bench_scalar<Field,0,0>(F,k,k,k,one,mOne,Data,it++,inplace);
- launch_bench_scalar<Field,0,0>(F,k,k,k,one,one ,Data,it++,inplace);
- launch_bench_scalar<Field,0,0>(F,k,k,k,one,beta,Data,it++,inplace);
-
- // D = -AB + beta C
- launch_bench_scalar<Field,0,0>(F,k,k,k,mOne,zero,Data,it++,inplace);
- launch_bench_scalar<Field,0,0>(F,k,k,k,mOne,mOne,Data,it++,inplace);
- launch_bench_scalar<Field,0,0>(F,k,k,k,mOne,one ,Data,it++,inplace);
- launch_bench_scalar<Field,0,0>(F,k,k,k,mOne,beta,Data,it++,inplace);
-
- // D = alpha AB + beta C
- launch_bench_scalar<Field,0,0>(F,k,k,k,alpha,zero,Data,it++,inplace);
- launch_bench_scalar<Field,0,0>(F,k,k,k,alpha,mOne,Data,it++,inplace);
- launch_bench_scalar<Field,0,0>(F,k,k,k,alpha,one ,Data,it++,inplace);
- launch_bench_scalar<Field,0,0>(F,k,k,k,alpha,beta,Data,it++,inplace);
-
-
- linbox_check(it==nb);
-
- LinBox::PlotStyle Style;
- Style.setTerm(LinBox::PlotStyle::Term::eps);
- Style.setTitle("fgemm","x","y");
- Style.setPlotType(LinBox::PlotStyle::Plot::histo);
- Style.setXtics(LinBox::PlotStyle::Options::oblique);// make long legends oblique.
- Style.addPlotType("set style histogram cluster gap 1");
- Style.addPlotType("set style fill solid border -1");
- Style.addPlotType("set boxwidth 0.9");
-
- // Style.setType(LinBox::PlotStyle::lines);
- Style.setUsingSeries(2);
-
- LinBox::PlotGraph<std::string> Graph(Data,Style);
- Graph.setOutFilename("fgemm_scal");
-
- // Graph.plot();
-
- Graph.print_gnuplot();
-
- Graph.print_latex();
-
- return ;
-
-}
-
-/*! @brief Benchmark fgemm \f$D\gets\alpha A^x B^y+\beta C\f$ for \f$x,y=1,\top\f$ (transpose or not).
- * @param k parameter.
- * @param charac characteristic of the field.
- * @param inplace "inplace" matmul (ie. C=D is overwritten)
- */
-void bench_transpose( index_t k, int charac, bool inplace )
-{
- typedef LinBox::Modular<double> Field ;
- typedef Field::Element Element;
- typedef Field::RandIter Randiter ;
- Field F(charac) ;
-
- index_t it = 0 ; index_t nb = 8 ;
- LinBox::PlotData<std::string> Data(nb,1);
- Data.setSerieName(0,"fgemm");
-
- Element one, zero, mOne, alpha, beta ;
- F.init(one,1);
- F.init(mOne,-1);
- F.init(zero,0);
-
-
- Randiter R(F) ;
- linbox_check(charac >=5) ;
-
- do { R.random(alpha) ; } // non trivial alpha
- while (F.areEqual(alpha,one) || F.areEqual(alpha,mOne) || F.areEqual(alpha,zero)) ;
-
- do { R.random(beta) ; }// non trivial beta
- while (F.areEqual(beta,one) || F.areEqual(beta,mOne) || F.areEqual(beta,zero)) ;
-
-
- // D = A^xB^y
- launch_bench_scalar<Field,0,0>(F,k,k,k,one,zero,Data,it++,inplace);
- launch_bench_scalar<Field,1,0>(F,k,k,k,one,zero,Data,it++,inplace);
- launch_bench_scalar<Field,0,1>(F,k,k,k,one,zero,Data,it++,inplace);
- launch_bench_scalar<Field,1,1>(F,k,k,k,one,zero,Data,it++,inplace);
-
- // D = alpha A^xB^y + beta C
- launch_bench_scalar<Field,0,0>(F,k,k,k,alpha,beta,Data,it++,inplace);
- launch_bench_scalar<Field,1,0>(F,k,k,k,alpha,beta,Data,it++,inplace);
- launch_bench_scalar<Field,0,1>(F,k,k,k,alpha,beta,Data,it++,inplace);
- launch_bench_scalar<Field,1,1>(F,k,k,k,alpha,beta,Data,it++,inplace);
-
-
- linbox_check(it==nb);
-
- LinBox::PlotStyle Style;
- Style.setTerm(LinBox::PlotStyle::Term::eps);
- Style.setTitle("fgemm","x","y");
- Style.setPlotType(LinBox::PlotStyle::Plot::histo);
- Style.setXtics(LinBox::PlotStyle::Options::oblique);// make long legends oblique.
- Style.addPlotType("set style histogram cluster gap 1");
- Style.addPlotType("set style fill solid border -1");
- Style.addPlotType("set boxwidth 0.9");
-
- // Style.setType(LinBox::PlotStyle::lines);
- Style.setUsingSeries(2);
-
- LinBox::PlotGraph<std::string> Graph(Data,Style);
- Graph.setOutFilename("fgemm_trans");
-
- // Graph.plot();
-
- Graph.print_gnuplot();
-
- Graph.print_latex();
-
- return ;
-
-}
-
-
-/* Benchmark fgemm Y = a AX + b Y for various (a,b) couples */
-
-/* main */
-
-int main( int ac, char ** av)
-{
- /* Argument parsing/setting */
-
- static index_t min = 100; /* min size */
- static index_t max = 1500; /* max size (not included) */
- static index_t step = 100; /* step between 2 sizes */
- static std::list<int> lst ; /* what bench to start ? */
- lst.push_front(1);// ={1,2} vivement le nouveau std...
- lst.push_front(2);
-
- static Argument as[] = {
- { 'm', "-m min" , "Set minimal size of matrix to test." , TYPE_INT , &min },
- { 'M', "-M Max" , "Set maximal size." , TYPE_INT , &max },
- { 's', "-s step", "Sets the gap between two matrix sizes.", TYPE_INT , &step },
- { 'l', "-l list", "Only launches a subset of available benchmarks\n - 1: compare to raw blas\n - 2:various square sizes\n - 3:various shapes\n - 4: various parameters (a,b)\n - 5 : various transp. combinations", TYPE_INTLIST, &lst },
- END_OF_ARGUMENTS
- };
-
- LinBox::parseArguments (ac, av, as);
-
- if (min >= max) {
- throw LinBox::LinBoxError("min value should be smaller than max...");
- }
- if (min + step >= max) {
- std::cout << "Warning : your x axis has only one point. You should have a smaller step." << std::endl;
- }
-
- //! @todo use commentator.
- lst.unique();
- lst.sort();
- if (lst.empty()) {
- std::cerr << "Warning, you are not benchmarking anything. Please check the -l value." << std::endl;
- }
- std::list<int>::iterator it = lst.begin();
-
- /* against pure blas routine */
- if (*it == 1) {
- std::cout << "bench 1 : blas" << std::endl;
- bench_blas(min,max,step,13);
- bench_blas(min,max,step,2011);
- bench_blas(min,max,step,65537);
- if (++it == lst.end()) return EXIT_SUCCESS ;
- }
-
- /* square for various fields */
- if (*it == 2) {
- std::cout << "bench 2 : square" << std::endl;
- bench_square(min,max,step,13);
- bench_square(min,max,step,2011);
- bench_square(min,max,step,65537);
- if (++it == lst.end()) return EXIT_SUCCESS ;
- }
-
- /* various shapes. */
- if (*it == 3) {
- std::cout << "bench 3 : shapes" << std::endl;
- int cube = (int) std::pow(max,double(1/3.));
- bench_rectangular(cube,2011);
- if (++it == lst.end()) return EXIT_SUCCESS ;
- }
-
- /* various parameters */
- if (*it == 4) {
- std::cout << "bench 4 : scalars" << std::endl;
- bench_scalar(max,65537,false);
- bench_scalar(max,65537,true);
- if (++it == lst.end()) return EXIT_SUCCESS ;
- }
-
- /* various tranpositions */
- if (*it == 5) {
- std::cout << "bench 2 : transp" << std::endl;
- bench_transpose(max,65537,true);
- bench_transpose(max,65537,true);
- if (++it != lst.end()) {
- std::cerr << "*** error *** your list contains (at least) one unknown element : " << *it << '!' << std::endl;
- }
- }
- else {
- std::cerr << "*** error *** your list contains (at least) one unknown element : " << *it << '!' << std::endl;
- }
- return EXIT_SUCCESS ;
-}
-
-// Local Variables:
-// mode: C++
-// tab-width: 8
-// indent-tabs-mode: nil
-// c-basic-offset: 8
-// End:
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
-
diff --git a/benchmarks/benchmark-ftrXm.C b/benchmarks/benchmark-ftrXm.C
deleted file mode 100644
index 99726cf..0000000
--- a/benchmarks/benchmark-ftrXm.C
+++ /dev/null
@@ -1,823 +0,0 @@
-
-/* Copyright (C) 2011 LinBox
- * Written by BB <brice.boyer at imag.fr>
- *
- *
- *
- * ========LICENCE========
- * This file is part of the library LinBox.
- *
- * LinBox is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- * ========LICENCE========
- */
-
-/*! @file benchmarks/benchmark-ftrXm.C
- * @ingroup benchmarks
- * @brief Benchmarking triangular matrix multiplication on finite fields.
- * This file benchmarks the FFLAS::ftrmm, FFLAS::ftrsm implementation for various fields,
- * shape and parameters. Actually, we use the wrapper member \c mul of LinBox::BlasMatrixDomain.
- * @todo ftrmm has an 'alpha' but mul/mulin in BMd don't... That could be useful for \f$\alpha=-1\f$...
- * @todo benchmark ftrsm too here.
- */
-
-#include "benchmarks/benchmark.h"
-#include "linbox/util/error.h"
-#include "linbox/field/modular.h"
-#include "linbox/field/modular-balanced.h"
-#include "fflas-ffpack/ffpack/ffpack.h"
-#include "fflas-ffpack/fflas/fflas.h"
-#include "linbox/matrix/random-matrix.h"
-#include "linbox/matrix/blas-matrix.h"
-#include "linbox/algorithms/blas-domain.h"
-
-#define _LB_LEFT true
-#define _LB_RITE false
-
-#define _LB_TRANS false
-#define _LB_NOTRS true
-
-#define _LB_UNIT true
-#define _LB_DIAG false
-
-#define _LB_TSUP true
-#define _LB_TLOW false
-
-using LinBox::Timer ;
-
-/* ********************** */
-/* Outils */
-/* ********************** */
-
-/*! @brief Watches a timer and a number and repet and signals if over.
- *
- * We want at least 2 repetions but not more than maxtime spent on timing.
- *
- * @param repet number of previous repetitions. Should be 0 on the first time
- * \c whatchon is called.
- * @param tim timer to watch
- * @param maxtime maximum time (in seconds) until \c watchon tells stop.
- * @return \c true if we conditions are not met to stop, \c false otherwise.
- * @pre \c tim was clear at the beginning and never started.
- *
- */
-bool keepon(index_t & repet, Timer & tim, double maxtime=0.5)
-{
- if (repet<2 || tim.usertime() < maxtime) {
- ++repet ;
- return true;
- }
- return false ;
-}
-
-/*! @brief Watches a timer and a number and repet and signals if over.
- *
- * We want at least 2 repetions but not more than maxtime spent on timing.
- *
- * @param repet number of previous repetitions. Should be 0 on the first time \c whatchon is called.
- * @param tim timer to watch
- * @param maxtime maximum time (in seconds) until \c watchon tells stop.
- * @return \c true if we conditions are not met to stop, \c false otherwise.
- * @pre \c tim should have been started previously !
- *
- */
-bool whatchon(index_t & repet, Timer & tim, double maxtime=0.5)
-{
- if (repet<2 || tim.userElapsedTime() < maxtime) {
- ++repet ;
- return true;
- }
- return false ;
-}
-
-
-double ftrmm_mflops(index_t m, index_t n, index_t k)
-{
- return (double)m*(double)n/1e6*(double)k ;
-}
-
-double compute_mflops(const Timer & t, const double mflo, const int rpt = 1)
-{
- linbox_check(rpt);
- return (double) ((mflo*rpt)/t.usertime());
-}
-
-/*! @internal
- * @brief launches the benchmarks for the square case.
- * @param F field
- * @param min min size to bench
- * @param max max size to bench
- * @param step step between two sizes
- * @param Data where data is stored
- * @param series_nb index of the current series.
- */
-template<class Field, bool LeftSide, bool UnitDiag, bool TriSup>
-void launch_bench_square(Field & F // const problem
- , index_t min, index_t max, int step
- , LinBox::PlotData<index_t> & Data
- , index_t series_nb)
-{
- index_t l = 0 ;
- Timer fgemm_sq_tim ;
- Timer chrono ;
- double mflops ;
- typedef typename Field::Element Element;
- typedef typename Field::RandIter Randiter ;
- Randiter R(F) ;
- LinBox::NonzeroRandIter<Field> Rn(F,R);
- LinBox::BlasMatrixDomain<Field> BMD(F) ;
- LinBox::RandomDenseMatrix<Randiter,Field> RandMat(F,R);
- // index_t repet = 3 ;
- for ( index_t i = min ; i < max ; i += step , ++l ) {
- int ii = i ; // sinon, le constructeur le plus proche serait (_Matrix,_Field)... n'impnawak...
- LinBox::TriangularBlasMatrix<Element> A (ii,ii,
- (TriSup?LinBox::LinBoxTag::Upper:LinBox::LinBoxTag::Lower),
- (UnitDiag?LinBox::LinBoxTag::Unit:LinBox::LinBoxTag::NonUnit));
- LinBox::BlasMatrix<Element> B (ii,ii);
- if (!series_nb)
- Data.setAbsciName(l,i); // only write abscissa for serie 0
- index_t j = 0 ; // number of repets.
- fgemm_sq_tim.clear() ;
- while( keepon(j,fgemm_sq_tim) ) {
- RandMat.random(A);
- for (size_t k=0 ; k<(size_t)ii ; ++k) Rn.random(A.refEntry(k,k)) ;
- RandMat.random(B);
- chrono.clear() ; chrono.start() ;
- if(LeftSide)
- BMD.mulin_right(A,B) ; // B <- AB
- else
- BMD.mulin_left(B,A) ; // B <- BA
- chrono.stop();
- fgemm_sq_tim += chrono ;
- }
- if (!j){
- std::cout << "multiplication did not happen" << std::endl;
- }
-#ifdef _LB_DEBUG
- else {
- std::cout << i << ',' << j << std::endl;
- }
-#endif
- mflops = compute_mflops(fgemm_sq_tim,ftrmm_mflops(i,i,i),j);
- Data.setEntry(series_nb,l,mflops);
- }
- std::string nam = "\"";
- if (TriSup)
- nam += "upper " ;
- else
- nam += "lower " ;
- if (LeftSide)
- nam += "left " ;
- else
- nam += "right " ;
- if (UnitDiag)
- nam += "non-" ;
- nam += "unit\"" ;
-
- Data.setSerieName(series_nb,nam);
-
-}
-
-/*! @internal
- * @brief launches the benchmarks for the square case directly BLAS.
- * @param min min size to bench
- * @param max max size to bench
- * @param step step between two sizes
- * @param Data where data is stored
- * @param series_nb index of the current series.
- */
-template<class T>
-void launch_bench_blas(index_t min, index_t max, int step
- , LinBox::PlotData<index_t> & Data
- , index_t series_nb
- , index_t charact)
-{
- typedef LinBox::Modular<T> Field ;
- Field F((int)charact);
- index_t l = 0 ;
- Timer ftrmm_blas_tim ;
- Timer chrono ;
- double mflops ;
- typedef typename Field::Element Element ;
- typedef typename Field::RandIter Randiter;
- Randiter R(F) ;
- // LinBox::BlasMatrixDomain<Field> BMD(F) ;
- // LinBox::RandomDenseMatrix<Randiter,Field> RandMat(F,R);
- // index_t repet = 3 ;
- index_t mm = max * max ;
- Element * A = new Element[mm] ;
- Element * B = new Element[mm] ;
- Element * C = new Element[mm] ;
- typedef typename LinBox::UnparametricField<T> FloatingDomain ;
- FloatingDomain G ;
-
- for ( index_t i = min ; i < max ; i += step , ++l ) {
- int ii = i ; // sinon, le constructeur le plus proche serait (_Matrix,_Field)... n'impnawak...
- index_t mimi = (index_t) ii*ii ;
- index_t j = 0 ;
- ftrmm_blas_tim.clear() ;
- while(keepon(j,ftrmm_blas_tim)) {
- for (index_t j = 0 ; j < mimi ; ++j) R.random(A[j]);
- for (index_t j = 0 ; j < mimi ; ++j) R.random(B[j]);
- for (index_t j = 0 ; j < mimi ; ++j) R.random(C[j]);
- chrono.clear(); chrono.start() ;
- FFLAS::ftrmm(G,FFLAS::FflasLeft,FFLAS::FflasUpper,
- FFLAS::FflasNoTrans,
- FFLAS::FflasUnit,
- ii,ii,
- 1.,
- A,ii, B,ii) ;
- chrono.stop() ;
- ftrmm_blas_tim += chrono ;
- }
- mflops = compute_mflops(ftrmm_blas_tim,ftrmm_mflops(i,i,i),j);
- Data.setEntry(series_nb,l,mflops);
- }
-
- delete[] A ;
- delete[] B ;
- delete[] C ;
- std::ostringstream nam ;
- nam << '\"' ;
- G.write(nam);
- nam << '\"' ;
- Data.setSerieName(series_nb,nam.str());
-
-}
-
-
-/*! @internal
- * @brief launches the benchmarks for the square case.
- * C= AB
- * @param F field
- * @param m rows in A
- * @param n cols in A
- * @param Data where data is stored
- * @param point_nb point to be computed
- */
-template<class Field, bool LeftSide, bool UnitDiag, bool TriSup>
-void launch_bench_rectangular(Field & F // const problem
- , index_t m, index_t n
- , LinBox::PlotData<std::string> & Data
- , index_t point_nb)
-{
- Timer ftrmm_rect_tim ;
- Timer chrono ; chrono.clear();
- double mflops ;
- typedef typename Field::Element Element;
- typedef typename Field::RandIter Randiter ;
- typedef typename LinBox::TriangularBlasMatrix<Element> TriangularMatrix ;
- typedef typename LinBox::BlasMatrix<Element > Matrix ;
-
- Randiter R(F) ;
- LinBox::BlasMatrixDomain<Field> BMD(F) ;
- LinBox::RandomDenseMatrix<Randiter,Field> RandMat(F,R);
-
- index_t k = (LeftSide?m:n);
-
- TriangularMatrix A (k,k,
- (TriSup?LinBox::LinBoxTag::Upper:LinBox::LinBoxTag::Lower),
- (UnitDiag?LinBox::LinBoxTag::Unit:LinBox::LinBoxTag::NonUnit));
- Matrix B ((int)m,(int)n);
-
- index_t j = 0 ;
- ftrmm_rect_tim.clear() ;
- while (keepon(j,ftrmm_rect_tim)) {
- RandMat.random(A);
- RandMat.random(B);
- chrono.clear() ; chrono.start() ;
-
- if(LeftSide)
- BMD.mulin_right(A,B) ; // B <- AB
- else
- BMD.mulin_left(B,A) ; // B <- BA
-
- chrono.stop();
- ftrmm_rect_tim += chrono ;
- }
- if (!j) {
- std::cout << "multiplication did not happen" << std::endl;
- }
-#ifdef _LB_DEBUG
- else {
- std::cout << point_nb << std::endl;
- }
-#endif
- mflops = compute_mflops(ftrmm_rect_tim,ftrmm_mflops(m,k,n),(int)j);
- Data.setEntry(0,point_nb,mflops);
- std::ostringstream nam ;
- if (LeftSide)
- nam << "\"(" << k << ':' << m << ',' << n << ")" ;
- else
- nam << "\"(" << m << ',' << n << ':' << k << ")" ;
- nam << " (" << (UnitDiag?"":"non") << "unit) on ";
- F.write(nam);
- nam << '\"' ;
-
-
- Data.setAbsciName(point_nb,nam.str());
- return ;
-}
-
-/*! @internal
- * @brief launches the benchmarks for various parameters of a, b.
- * B = aAB or B=aBA with A triangular.
- * @todo We test various parameters \f$alpha\f$.
- * We test A being transposed or not.
- * @param F field
- * @param m rows in B
- * @param n cols in B
- * @param alpha alpha (not zero)
- * @param Data where data is stored
- * @param point_nb point to be computed
- */
-template<class Field, bool LeftSide, bool UnitDiag, bool TriSup, bool tA>
-void launch_bench_scalar(Field & F // const problem
- , int m, int n
- , const typename Field::Element & alpha //!@warning not used yet.
- , LinBox::PlotData<std::string> & Data
- , index_t point_nb)
-{
- Timer ftrmm_scal_tim ;
- Timer chrono ;
- ftrmm_scal_tim.clear();
- double mflops ;
- typedef typename Field::Element Element;
- typedef typename Field::RandIter Randiter ;
- typedef typename LinBox::BlasMatrix<Element > Matrix ;
- typedef typename LinBox::TriangularBlasMatrix<Element> TriangularMatrix ;
- typedef typename LinBox::TransposedBlasMatrix<TriangularMatrix > TransposedTriangular ;
-
-
- Randiter R(F) ;
- LinBox::BlasMatrixDomain<Field> BMD(F) ;
- LinBox::RandomDenseMatrix<Randiter,Field> RandMat(F,R);
-
- index_t k = (LeftSide?m:n);
-
- TriangularMatrix A (k,k,
- (TriSup?LinBox::LinBoxTag::Upper:LinBox::LinBoxTag::Lower),
- (UnitDiag?LinBox::LinBoxTag::Unit:LinBox::LinBoxTag::NonUnit));
- TransposedTriangular At(A);
- Matrix B (m,n);
-
- index_t j = 0 ;
- while (keepon(j,ftrmm_scal_tim)) {
- RandMat.random(A);
- RandMat.random(B);
-
- chrono.clear() ; chrono.start();
-
- if (tA) {
- if(LeftSide)
- BMD.mulin_right(At,B) ; // B <- AB
- else
- BMD.mulin_left(B,At) ; // B <- BA
- }
- else {
- if(LeftSide)
- BMD.mulin_right(A,B) ; // B <- AB
- else
- BMD.mulin_left(B,A) ; // B <- BA
- }
-
-
- chrono.stop() ; ftrmm_scal_tim += chrono ;
- }
- if (!j) {
- std::cout << "multiplication did not happen" << std::endl;
- }
-#ifdef _LB_DEBUG
- else {
- std::cout << point_nb << std::endl;
- }
-#endif
- mflops = compute_mflops(ftrmm_scal_tim,ftrmm_mflops(m,k,n),(int)j);
- Data.setEntry(0,point_nb,mflops);
- std::ostringstream nam ;
- nam << "\"(" << m << 'x' << n << ") ";
- nam << "B=" << alpha << " " ;
- if (LeftSide)
- nam << (tA?"t":"")<< "A.B" ;
- else
- nam << "B." << (tA?"t":"")<< "A" ;
- nam << " (" << (UnitDiag?"":"non") << "unit) on ";
- F.write(nam);
- nam << '\"' ;
-
- Data.setAbsciName(point_nb,nam.str());
-}
-
-/* ********************** */
-/* Tests */
-/* ********************** */
-
-/*! @brief Benchmark square ftrmm for differenct parameters.
- * @param min min size
- * @param max max size
- * @param step step of the size between 2 benchmarks
- * @param charac characteristic of the field.
- */
-void bench_square( index_t min, index_t max, int step, int charac )
-{
-
- int nb = 9 ;// une col de plus (la première)
- typedef LinBox::Modular<double> Field ; ++nb ;
-
- int nb_pts = (int) std::ceil((double)(max-min)/(double)step) ;
- LinBox::PlotData<index_t> Data(nb_pts,nb);
- LinBox::PlotStyle Style;
- int it = 0 ;
- Field F(charac) ;
- std::cout << "0.." << std::flush;
- /* _LB_LEFT,_LB_UNIT,_LB_TSUP */
- launch_bench_square<Field,true,true,true>(F,min,max,step,Data,it++);
- std::cout << "1.." << std::flush;
- launch_bench_square<Field,true,true,false>(F,min,max,step,Data,it++);
- std::cout << "2.." << std::flush;
- launch_bench_square<Field,true,false,true>(F,min,max,step,Data,it++);
- std::cout << "3.." << std::flush;
- launch_bench_square<Field,true,false,false>(F,min,max,step,Data,it++);
- std::cout << "4.." << std::flush;
- launch_bench_square<Field,false,true,true>(F,min,max,step,Data,it++);
- std::cout << "5.." << std::flush;
- launch_bench_square<Field,false,true,false>(F,min,max,step,Data,it++);
- std::cout << "6.." << std::flush;
- launch_bench_square<Field,false,false,true>(F,min,max,step,Data,it++);
- std::cout << "7.." << std::flush;
- launch_bench_square<Field,false,false,false>(F,min,max,step,Data,it++);
- std::cout << "9!!" << std::endl;
-
-
-
- linbox_check(it <= nb);
-
- Style.setTerm(LinBox::PlotStyle::Term::eps);
- Style.setTitle("ftrmm","x","y");
-
- Style.setPlotType(LinBox::PlotStyle::Plot::graph);
- Style.setLineType(LinBox::PlotStyle::Line::linespoints);
- Style.setUsingSeries(std::pair<index_t,index_t>(2,nb));
-
- LinBox::PlotGraph<index_t> Graph(Data,Style);
- Graph.setOutFilename("ftrmm_square");
-
- // Graph.plot();
-
- Graph.print_gnuplot();
-
- Graph.print_latex();
-
- return ;
-
-}
-
-/*! @brief Benchmark square ftrmm for several fields.
- * @param min min size
- * @param max max size
- * @param step step of the size between 2 benchmarks
- */
-void bench_fields( index_t min, index_t max, int step )
-{
-
- int nb = 1 ;// une col de plus (la première)
- typedef LinBox::Modular<float> Field0 ; ++nb ;
- typedef LinBox::Modular<double> Field1 ; ++nb ;
- typedef LinBox::ModularBalanced<float> Field2 ; ++nb ;
- typedef LinBox::ModularBalanced<double> Field3 ; ++nb ;
-
- Field0 F0(2011);
- Field1 F1(65537);
- Field2 F2(2011);
- Field3 F3(65537);
-
- int nb_pts = (int) std::ceil((double)(max-min)/(double)step) ;
- LinBox::PlotData<index_t> Data(nb_pts,nb);
- LinBox::PlotStyle Style;
- int it = 0 ;
- std::cout << "0.." << std::flush;
- /* _LB_LEFT,_LB_UNIT,_LB_TSUP */
- launch_bench_square<Field0,true,true,true>(F0,min,max,step,Data,it++);
- std::cout << "1.." << std::flush;
- launch_bench_square<Field1,true,true,true>(F1,min,max,step,Data,it++);
- std::cout << "2.." << std::flush;
- launch_bench_square<Field2,true,true,true>(F2,min,max,step,Data,it++);
- std::cout << "3.." << std::flush;
- launch_bench_square<Field3,true,true,true>(F3,min,max,step,Data,it++);
- std::cout << "4!!" << std::endl;
-
-
-
- linbox_check(it <= nb);
-
- Style.setTerm(LinBox::PlotStyle::Term::eps);
- Style.setTitle("ftrmm for various fields","x","y");
-
- Style.setPlotType(LinBox::PlotStyle::Plot::graph);
- Style.setLineType(LinBox::PlotStyle::Line::linespoints);
- Style.setUsingSeries(std::pair<index_t,index_t>(2,nb));
-
- LinBox::PlotGraph<index_t> Graph(Data,Style);
- Graph.setOutFilename("ftrmm_fields");
-
- // Graph.plot();
-
- Graph.print_gnuplot();
-
- Graph.print_latex();
-
- return ;
-
-}
-
-
-/*! Benchmark fgemm Y=AX for several sizes of sqare matrices.
- * @param min min size
- * @param max max size
- * @param step step of the size between 2 benchmarks
- */
-void bench_blas( index_t min, index_t max, int step )
-{
- //!@todo compare to cblas_dgemm instead.
- typedef LinBox::Modular<double> DoubleField ;
- typedef LinBox::Modular<float> FloatField ;
-
- int nb_pts = (int) std::ceil((double)(max-min)/(double)step) ;
- int it = 0 ; int nb = 5 ;
- LinBox::PlotData<index_t> Data(nb_pts,nb);
- FloatField F0(13) ;
- /* _LB_LEFT,_LB_UNIT,_LB_TSUP */
- launch_bench_square<FloatField,true,true,true>(F0,min,max,step,Data,it++);
- launch_bench_blas<float>(min,max,step,Data,it++,13);
-
- DoubleField F1(65537) ;
- /* _LB_LEFT,_LB_UNIT,_LB_TSUP */
- launch_bench_square<DoubleField,true,true,true>(F1,min,max,step,Data,it++);
- launch_bench_blas<double>(min,max,step,Data,it++,65537);
-
- linbox_check(it+1==nb);
-
-
- LinBox::PlotStyle Style;
- Style.setTerm(LinBox::PlotStyle::Term::eps);
- Style.setTitle("ftrmm","x","y");
-
- Style.setPlotType(LinBox::PlotStyle::Plot::graph);
- Style.setLineType(LinBox::PlotStyle::Line::linespoints);
- Style.setUsingSeries(std::pair<index_t,index_t>(2,nb));
-
- LinBox::PlotGraph<index_t> Graph(Data,Style);
- Graph.setOutFilename("ftrmm_blas");
-
- // Graph.plot();
-
- Graph.print_gnuplot();
-
- Graph.print_latex();
-
- return ;
-
-}
-
-
-/*! @brief Benchmark fgemm Y=AX for several shapes.
- * we test the following shapes :
- * - (2k,2k):2k, 2k:(2k,2k)
- * - (k,2k):2k, 2k:(2k,k)
- * - (4k,2k):2k , 2k:(2k,4k)
- * .
- * @param k parameter.
- * @param charac characteristic of the field.
- */
-void bench_rectangular( index_t k, int charac )
-{
- typedef LinBox::Modular<double> Field ;
- Field F(charac) ;
-
- index_t it = 0 ; index_t nb = 6 ;
- LinBox::PlotData<std::string> Data(nb,1);
- Data.setSerieName(0,"mflops");
-
- launch_bench_rectangular<Field,_LB_LEFT,_LB_UNIT,_LB_TSUP>(F,2*k,2*k,Data,it++);
- launch_bench_rectangular<Field,_LB_RITE,_LB_UNIT,_LB_TSUP>(F,2*k,2*k,Data,it++);
-
- launch_bench_rectangular<Field,_LB_LEFT,_LB_UNIT,_LB_TSUP>(F,2*k,k,Data,it++);
- launch_bench_rectangular<Field,_LB_RITE,_LB_UNIT,_LB_TSUP>(F,k,2*k,Data,it++);
-
- launch_bench_rectangular<Field,_LB_LEFT,_LB_UNIT,_LB_TSUP>(F,2*k,4*k,Data,it++);
- launch_bench_rectangular<Field,_LB_RITE,_LB_UNIT,_LB_TSUP>(F,4*k,2*k,Data,it++);
-
- //!@todo resize if it>nb !!
-
- linbox_check(it==nb);
-
- LinBox::PlotStyle Style;
- Style.setTerm(LinBox::PlotStyle::Term::eps);
- Style.setTitle("ftrmm","x","y");
- Style.setPlotType(LinBox::PlotStyle::Plot::histo);
- Style.setXtics(LinBox::PlotStyle::Options::oblique);// make long legends oblique.
- Style.addPlotType("set style histogram cluster gap 1");
- Style.addPlotType("set style fill solid border -1");
- Style.addPlotType("set boxwidth 0.9");
- //! @todo make long legends oblique.
-
- // Style.setType(LinBox::PlotStyle::lines);
- Style.setUsingSeries(2);
-
- LinBox::PlotGraph<std::string> Graph(Data,Style);
- Graph.setOutFilename("ftrmm_rect");
-
- // Graph.plot();
-
- Graph.print_gnuplot();
-
- Graph.print_latex();
-
- return ;
-
-}
-
-/*! @brief Benchmark ftrmm with transpose or alpha parameters on.
- * @param k parameter.
- * @param charac characteristic of the field.
- */
-void bench_transpose( index_t k, int charac)
-{
- typedef LinBox::Modular<double> Field ;
- typedef Field::Element Element;
- typedef Field::RandIter Randiter ;
- Field F(charac) ;
-
- index_t it = 0 ; index_t nb = 2 ;
- LinBox::PlotData<std::string> Data(nb,1);
- Data.setSerieName(0,"fgemm");
-
- Element one, zero, mOne, alpha, beta ;
- F.init(one,1);
- F.init(mOne,-1);
- F.init(zero,0);
-
-
- Randiter R(F) ;
- linbox_check(charac >=5) ;
-
- do { R.random(alpha) ; } // non trivial alpha
- while (F.areEqual(alpha,one) || F.areEqual(alpha,mOne) || F.areEqual(alpha,zero)) ;
-
- do { R.random(beta) ; }// non trivial beta
- while (F.areEqual(beta,one) || F.areEqual(beta,mOne) || F.areEqual(beta,zero)) ;
-
-
- // D = A^xB^y
- launch_bench_scalar<Field,true,true,true,true>(F,k,k,one,Data,it++);
- launch_bench_scalar<Field,true,true,true,false>(F,k,k,one,Data,it++);
-
- linbox_check(it==nb);
-
- LinBox::PlotStyle Style;
- Style.setTerm(LinBox::PlotStyle::Term::eps);
- Style.setTitle("fgemm","x","y");
- Style.setPlotType(LinBox::PlotStyle::Plot::histo);
- Style.setXtics(LinBox::PlotStyle::Options::oblique);// make long legends oblique.
- Style.addPlotType("set style histogram cluster gap 1");
- Style.addPlotType("set style fill solid border -1");
- Style.addPlotType("set boxwidth 0.9");
-
- // Style.setType(LinBox::PlotStyle::lines);
- Style.setUsingSeries(2);
-
- LinBox::PlotGraph<std::string> Graph(Data,Style);
- Graph.setOutFilename("fgemm_trans");
-
- // Graph.plot();
-
- Graph.print_gnuplot();
-
- Graph.print_latex();
-
- return ;
-
-}
-
-/* main */
-
-int main( int ac, char ** av)
-{
- /* Argument parsing/setting */
-
- static index_t min = 100; /* min size */
- static index_t max = 2000; /* max size (not included) */
- static index_t step = 200; /* step between 2 sizes */
- static std::list<int> lst ; /* what bench to start ? */
- lst.push_front(1);// ={1,2} vivement le nouveau std...
- lst.push_front(2);
-
- static Argument as[] = {
- { 'm', "-m min" , "Set minimal size of matrix to test." , TYPE_INT , &min },
- { 'M', "-M Max" , "Set maximal size." , TYPE_INT , &max },
- { 's', "-s step", "Sets the gap between two matrix sizes.", TYPE_INT , &step },
- { 'l', "-l list", "Only launches a subset of available benchmarks\n - 1: compare to raw blas\n - 2:various square sizes\n - 3:various shapes\n - 4: various parameters (a,b)\n - 5 : various transp. combinations", TYPE_INTLIST, &lst },
- END_OF_ARGUMENTS
- };
-
- parseArguments (ac, av, as);
-
- if (min >= max) {
- throw LinBox::LinBoxError("min value should be smaller than max...");
- }
- if (min + step >= max) {
- std::cout << "Warning : your x axis has only one point. You should have a smaller step." << std::endl;
- }
-
- //! @todo use commentator.
- lst.unique();
- lst.sort();
-
- bench_square(min,max,step,2011);
- bench_fields(min,max,step);
- bench_blas(min,max,step);
- bench_rectangular(max/2,2011);
- bench_transpose(max,2011);
-
-#if 0 /* to be uncommented */
- if (lst.empty()) {
- std::cerr << "Warning, you are not benchmarking anything. Please check the -l value." << std::endl;
- }
- std::list<int>::iterator it = lst.begin();
-
- /* against pure blas routine */
- if (*it == 1) {
- std::cout << "bench 1 : blas" << std::endl;
- bench_blas(min,max,step);
- if (++it == lst.end()) return EXIT_SUCCESS ;
- }
-
- /* square for various fields */
- if (*it == 2) {
- std::cout << "bench 2 : square" << std::endl;
- bench_square(min,max,step,13);
- bench_square(min,max,step,2011);
- bench_square(min,max,step,65537);
- if (++it == lst.end()) return EXIT_SUCCESS ;
- }
-
- /* various shapes. */
- if (*it == 3) {
- std::cout << "bench 3 : shapes" << std::endl;
- int cube = (int) std::pow(max,double(1/3.));
- bench_rectangular(cube,2011);
- if (++it == lst.end()) return EXIT_SUCCESS ;
- }
-
- /* various parameters */
- if (*it == 4) {
- std::cout << "bench 4 : scalars" << std::endl;
- bench_scalar(max,65537,false);
- bench_scalar(max,65537,true);
- if (++it == lst.end()) return EXIT_SUCCESS ;
- }
-
- /* various tranpositions */
- if (*it == 5) {
- std::cout << "bench 2 : transp" << std::endl;
- bench_transpose(max,65537,true);
- bench_transpose(max,65537,true);
- if (++it != lst.end()) {
- std::cerr << "*** error *** your list contains (at least) one unknown element : " << *it << '!' << std::endl;
- }
- }
- else {
- std::cerr << "*** error *** your list contains (at least) one unknown element : " << *it << '!' << std::endl;
- }
-#endif
- return EXIT_SUCCESS ;
-}
-
-#undef _LB_RITE
-#undef _LB_LEFT
-#undef _LB_TSUP
-#undef _LB_TLOW
-#undef _LB_UNIT
-#undef _LB_DIAG
-#undef _LB_TRANS
-#undef _LB_NOTRS
-
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
-// Local Variables:
-// mode: C++
-// tab-width: 8
-// indent-tabs-mode: nil
-// c-basic-offset: 8
-// End:
-
diff --git a/benchmarks/benchmark-metadata.C b/benchmarks/benchmark-metadata.C
new file mode 100644
index 0000000..6fe5d5e
--- /dev/null
+++ b/benchmarks/benchmark-metadata.C
@@ -0,0 +1,43 @@
+/* Copyright (C) 2013 LinBox
+ * Written by Brice Boyer (briceboyer) <boyer.brice at gmail.com>
+ *
+ *
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ * ========LICENCE========
+ */
+
+/*! @file benchmarks/benchmark-metadata.C
+ * @ingroup benchmarks
+ * @brief metadata
+ */
+
+#ifndef __LINBOX_benchmarks_benchmark_metadata_C
+#define __LINBOX_benchmarks_benchmark_metadata_C
+
+
+
+#endif // __LINBOX_benchmarks_benchmark_metadata_C
+
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/benchmarks/benchmark-metadata.h b/benchmarks/benchmark-metadata.h
new file mode 100644
index 0000000..26919fc
--- /dev/null
+++ b/benchmarks/benchmark-metadata.h
@@ -0,0 +1,520 @@
+/* Copyright (C) 2013 LinBox
+ * Written by Brice Boyer (briceboyer) <boyer.brice at gmail.com>
+ *
+ *
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ * ========LICENCE========
+ */
+
+/*! @file benchmarks/benchmark-metadata.h
+ * @ingroup benchmarks
+ * @brief metadata
+ */
+
+#ifndef __LINBOX_benchmarks_benchmark_metadata_H
+#define __LINBOX_benchmarks_benchmark_metadata_H
+
+#include "benchmark-utils.h"
+
+//
+// Metadata
+//
+
+
+namespace LinBox {
+
+ class MetaData ;
+
+ //! This is the general metadata class
+ class MetaData {
+ private :
+ svector_t name ; //! key/name of the metadata. for instance <matrix id="matrix1"/>
+ std::string _hash ; //! unique id (used to save space)
+ svector_t keys ; //! keys
+ svector_t vals ; //! values
+ std::vector<MetaData *> metadata ; //! child metadata array
+
+ private :
+
+ //! @internal recursively free memory
+ void clean ()
+ {
+ if (this != NULL) {
+ for (size_t i = 0 ; i < metadata.size() ; ++i) {
+ metadata[i]->clean();
+ delete metadata[i] ;
+ metadata[i] = NULL ;
+ }
+ }
+ return;
+ }
+
+
+ //! @internal copy all, including metadata children
+ void deep_copy(const MetaData * md)
+ {
+ name = md->getIds();
+ _hash = md->getHash();
+ keys = md->getKeys();
+ vals = md->getVals();
+ size_t md_size = md->getMetaDataSize();
+ if (md_size) {
+ metadata.resize(md_size,NULL);
+ for (size_t i = 0 ; i <md_size ; ++i) {
+ metadata[i] = new MetaData ;
+ metadata[i]->deep_copy(md->getMetaData(i));
+ }
+ }
+
+ return;
+ }
+
+ //! @internal adds some metadata child
+ void push_back(const MetaData * md)
+ {
+ size_t md_size = getMetaDataSize();
+ metadata.resize(md_size+1,NULL);
+ metadata[md_size] = new MetaData ;
+ metadata[md_size]->deep_copy(md);
+ }
+
+ protected :
+
+ const std::string & getName() const
+ {
+ return name[1] ;
+ }
+
+
+ void setHash(const std::string & myhash)
+ {
+ _hash = myhash ;
+ }
+
+ const svector_t & getIds() const
+ {
+ return name ;
+ }
+
+ const svector_t & getKeys() const
+ {
+ return keys ;
+ }
+
+ const svector_t & getVals() const
+ {
+ return vals ;
+ }
+
+ size_t getMetaDataSize() const
+ {
+ return metadata.size();
+ }
+
+ const MetaData * getMetaData(const size_t & i) const
+ {
+ return metadata[i];
+ }
+
+
+ std::string hasher(const std::string & data)
+ {
+#ifdef HAVE_CXX11
+ std::hash<std::string> my_hasher ;
+ size_t the_hash = my_hasher(data);
+#else
+ std::locale loc;
+ const std::collate<char>& coll = std::use_facet<std::collate<char> >(loc); // const member ?
+ size_t the_hash = coll.hash(data.data(),data.data()+data.length());
+
+#endif
+ return toString(the_hash);
+ }
+
+ public:
+
+ MetaData() :
+ name(2)
+ , _hash("")
+ , keys(0)
+ , vals(0)
+ , metadata(0)
+ {
+ name[0] = "unknown" ;
+ name[1] = name[0] + '_' + randomAlNum(8) ;
+ }
+
+ ~MetaData()
+ {
+ clean();
+ }
+
+ MetaData(const MetaData * md)
+ {
+ deep_copy(md);
+ }
+
+ MetaData(const MetaData & md)
+ {
+ deep_copy(&md);
+ }
+
+ template<class T>
+ void changeValue(const std::string & keyword, T& value)
+ {
+ size_t i ;
+ bool ok = findKeyword(i, keys.begin(), keys.end(), keyword);
+ if ( !ok )
+ // throw LinBoxError("undefined keyword",keyword);
+ throw LinBoxError("undefined keyword");
+
+ vals[i] = toString(value);
+
+ return;
+ }
+
+ const std::string & getValue(const std::string & keyword)
+ {
+ size_t i ;
+ bool ok = findKeyword(i, keys.begin(), keys.end(), keyword);
+ if ( !ok )
+ // throw LinBoxError("undefined keyword",keyword);
+ throw LinBoxError("undefined keyword");
+
+ return vals[i] ;
+ }
+
+ void addValue(const std::string & nom, const std::string & val = "N/A")
+ {
+ keys.push_back(nom);
+ vals.push_back(val);
+ linbox_check(keys.size() == vals.size());
+ return;
+ }
+
+ template <class T>
+ void addValue(const std::string & nom, const T & val )
+ {
+ keys.push_back(nom);
+ vals.push_back(toString(val));
+ linbox_check(keys.size() == vals.size());
+ return;
+ }
+
+ void addMetaData( const MetaData * md)
+ {
+ push_back(md);
+ }
+
+ void setIds (const std::string & key)
+ {
+ name[0] = key ;
+ name[1] = key + "_" + randomAlNum(8) ;
+
+ return;
+ }
+
+#ifdef __LINBOX_HAVE_TINYXML2
+ void writeMetaData(tinyxml2::XMLElement ** data, tinyxml2::XMLDocument & doc) const
+ {
+ //! @warning only one name allowed. Todo : matrix1, matrix2,...
+ using namespace tinyxml2;
+ *data = doc.NewElement( getIds()[0].c_str() );
+ linbox_check(*data);
+ (*data)->SetAttribute("id",getIds()[1].c_str());
+#ifndef NDEBUG
+ (*data)->SetAttribute("hash",getHash().c_str());
+#endif
+
+ for (size_t i = 0 ; i < keys.size() ; ++i ) {
+ (*data)->SetAttribute(keys[i].c_str(),vals[i].c_str());
+ }
+
+ for (size_t i = 0 ; i < getMetaDataSize() ; ++i ) {
+ XMLElement * child = NULL ;
+ getMetaData(i)->writeMetaData(&child,doc);
+ (*data)->InsertEndChild( child );
+ }
+
+ return ;
+ }
+#endif
+
+ // should not be too public
+ std::string getLocalString() const
+ {
+ std::string res = name[0] + ',' ;
+ for (size_t i = 0 ; i < keys.size() ; ++i)
+ res += keys[i] + '=' + vals[i] + ';';
+ return res ;
+ }
+
+ const std::string & getHash() const
+ {
+ return _hash ;
+ }
+
+
+ }; // MetaData
+
+} // LinBox
+
+//
+// MetaData specialized
+//
+
+#ifdef HAVE_CXX11
+#include <unordered_map>
+#endif
+
+namespace LinBox {
+
+ // class RepresentationMetaData ;
+ class MatrixMetaData ;
+ // class VectorMetaData ;
+ class StorageMetaData ;
+ class GeneratorMetaData ;
+ class FieldMetaData ;
+ // class SolutionMetaData ;
+ class AlgorithmMetaData ;
+ class EnvrironmentMetaData ;
+ class BenchmarkMetaData ;
+
+ //! Field metadata
+ class FieldMetaData : public MetaData {
+ private :
+
+ public :
+ FieldMetaData()
+ {
+ setIds("field");
+ addValue("name");
+ addValue("characteristic");
+
+ hash();
+ }
+ // a general field/ring has no exponent.
+
+ template<class Field>
+ FieldMetaData( const Field & F)
+ {
+#if 0
+ F.getMetaData(this); // this would also print representation
+ also det(A, some_mehtod(), Meta) would do a dry run and print in Meta.
+#endif
+ setIds("field");
+
+ std::ostringstream a ;
+ F.write(a);
+ addValue("name",a.str());
+ addValue("characteristic", F.characteristic());
+
+ hash();
+ }
+
+ void hash()
+ {
+ std::string data = getLocalString() ;
+ linbox_check(getMetaDataSize() == 0);
+
+ setHash(hasher(data));
+ }
+
+ }; // FieldMetaData
+
+ //! Matrix metadata
+ // what if MetaData changes something in MatrixMetaData and does not update hash ?
+ class MatrixMetaData : public MetaData {
+ void initMetadata()
+ {
+ addValue("rowdim");
+ addValue("coldim");
+ addValue("nbnz");
+ addValue("name");
+
+ FieldMetaData FMD;
+ addMetaData(&FMD);
+ }
+ public:
+ MatrixMetaData()
+ {
+ setIds("matrix");
+ initMetadata() ;
+
+ hash();
+ }
+
+ template<class Matrix>
+ MatrixMetaData(Matrix & M, const std::string nom = "N/A" )
+ {
+ setIds("matrix");
+ // M.getMetaData(this);
+ addValue("rowdim",M.rowdim());
+ addValue("coldim",M.coldim());
+ addValue("nbnz",M.size());
+ addValue("name",nom);
+
+ FieldMetaData FMD(M.field());
+ addMetaData(&FMD);
+
+ hash();
+ }
+
+ void hash()
+ {
+ std::string data = getLocalString() ;
+ if (getMetaDataSize() == 1) { // first the field. (@todo search for fields, then search for random generator.)
+ data += getMetaData(0)->getLocalString();
+ }
+ setHash(hasher(data));
+ }
+
+ } ; // MatrixMetaData
+
+ //! Environment metadata;
+ class EnvironmentMetaData : public MetaData {
+ void initMetadata()
+ {
+ // Machine
+ // compiler
+ }
+ public :
+ EnvironmentMetaData()
+ {
+ }
+ }; // EnvironmentMetaData
+
+ //! Benchmark metadata;
+ class BenchmarkMetaData : public MetaData {
+ void initMetadata()
+ {
+ // problem
+ // machine
+ }
+ public :
+ BenchmarkMetaData()
+ {
+ }
+ }; // BenchmarkMetaData
+
+ //! Algorithm metadata;
+ class AlgorithmMetaData : public MetaData {
+ void initMetadata()
+ {
+ // name
+ // method
+ }
+ public :
+ AlgorithmMetaData()
+ {
+ }
+ }; // AlgorithmMetaData
+
+ //! Generator metadata;
+ class GeneratorMetaData : public MetaData {
+ void initMetadata()
+ {
+ }
+ public :
+ GeneratorMetaData()
+ {
+ }
+ }; // GeneratorMetaData
+
+ //! Storage metadata;
+ class StorageMetaData : public MetaData {
+ void initMetadata()
+ {
+ }
+ public :
+ StorageMetaData()
+ {
+ }
+ }; // StorageMetaData
+
+} // LinBox
+
+//
+// typedefs
+//
+
+namespace LinBox {
+ typedef std::vector<MetaData> mvector_t ;
+} // LinBox
+
+//
+// Metadata Container
+//
+
+namespace LinBox {
+
+ struct MetaDataSeries {
+ mvector_t MetaDataVec ; // vector of metadatas
+ // svector_t PointsIDs ; // vector of points ids
+ smatrix_t MetaDataIDs ; // MetaDataIDs[i] is the list of indexes in PointIDs, corresponding to the points associated with metadatas MetaDataVec[i]. Could use some std::map as well.
+
+ public:
+ MetaDataSeries() :
+ MetaDataVec(0)
+ , MetaDataIDs(0)
+ {};
+ // bool exists(size_t & j, const MetaData & m);
+ // uses hashes to search for metadata.
+ void push_back(const std::string & pointID, const MetaData & pointMD)
+ {
+
+ // size_t j = MetaDataVec.size();
+ // re-hash here ?
+ std::string hsh = pointMD.getHash();
+ size_t i ;
+ bool found = false ;
+ for (i = 0 ; i < MetaDataVec.size() ; ++i)
+ if (hsh == MetaDataVec[i].getHash()) {
+ found = true ;
+ break;
+ }
+ linbox_check((!found) && (i == MetaDataVec.size()));
+
+ if (! found) {
+ MetaDataVec.push_back(pointMD);
+ svector_t used_by(0) ;
+ used_by.push_back(pointID);
+ MetaDataIDs.push_back(used_by) ;
+ }
+ else {
+ MetaDataIDs[i].push_back(pointID);
+ }
+ }
+ };
+
+} // LinBox
+
+#ifdef LinBoxSrcOnly
+#include "benchmarks/benchmark-metadata.C"
+#endif
+
+#endif // __LINBOX_benchmarks_benchmark_metadata_H
+
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/benchmarks/benchmark-order-basis.C b/benchmarks/benchmark-order-basis.C
new file mode 100755
index 0000000..5b68e77
--- /dev/null
+++ b/benchmarks/benchmark-order-basis.C
@@ -0,0 +1,395 @@
+/* -*- mode: C++; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
+#include <iostream>
+#include <iomanip>
+size_t getPeakRSS( );
+size_t getCurrentRSS( );
+//#define MEMINFO std::right<<std::setw(20)<<" ----> Max Mem: "<<getPeakRSS()/1000000.<<"Mo"
+#define MB(x) ((x)/(double)(1<<20))
+//#define MB(x) ((x)>>20)
+#define MEMINFO std::right<<std::setw(20)<<" ----> Mem: "<<MB(getCurrentRSS())<<" Mo (Max: "<<MB(getPeakRSS())<<" Mo)"
+#include "linbox/matrix/polynomial-matrix.h"
+#include "linbox/randiter/random-fftprime.h"
+#include "linbox/randiter/random-prime.h"
+#include "linbox/ring/modular.h"
+#include "linbox/algorithms/polynomial-matrix/polynomial-matrix-domain.h"
+#include "linbox/algorithms/polynomial-matrix/order-basis.h"
+#include "linbox/algorithms/block-coppersmith-domain.h"
+
+/* MEMORY INFO */
+#if defined(__unix__) || defined(__unix) || defined(unix) || (defined(__APPLE__) && defined(__MACH__))
+#include <unistd.h>
+#include <sys/types.h>
+#include <sys/param.h>
+#if defined(BSD)
+#include <sys/sysctl.h>
+#endif
+#else
+#error "Unable to define getMemorySize( ) for an unknown OS."
+#endif
+
+#if defined(_WIN32)
+#include <windows.h>
+#include <psapi.h>
+
+#elif defined(__unix__) || defined(__unix) || defined(unix) || (defined(__APPLE__) && defined(__MACH__))
+#include <unistd.h>
+#include <sys/resource.h>
+
+#if defined(__APPLE__) && defined(__MACH__)
+#include <mach/mach.h>
+
+#elif (defined(_AIX) || defined(__TOS__AIX__)) || (defined(__sun__) || defined(__sun) || defined(sun) && (defined(__SVR4) || defined(__svr4__)))
+#include <fcntl.h>
+#include <procfs.h>
+
+#elif defined(__linux__) || defined(__linux) || defined(linux) || defined(__gnu_linux__)
+#include <stdio.h>
+
+#endif
+
+#else
+#error "Cannot define getPeakRSS( ) or getCurrentRSS( ) for an unknown OS."
+#endif
+/* END MEMORY INFO */
+
+size_t getPeakRSS( )
+{
+#if defined(_WIN32)
+ /* Windows -------------------------------------------------- */
+ PROCESS_MEMORY_COUNTERS info;
+ GetProcessMemoryInfo( GetCurrentProcess( ), &info, sizeof(info) );
+ return (size_t)info.PeakWorkingSetSize;
+
+#elif (defined(_AIX) || defined(__TOS__AIX__)) || (defined(__sun__) || defined(__sun) || defined(sun) && (defined(__SVR4) || defined(__svr4__)))
+ /* AIX and Solaris ------------------------------------------ */
+ struct psinfo psinfo;
+ int fd = -1;
+ if ( (fd = open( "/proc/self/psinfo", O_RDONLY )) == -1 )
+ return (size_t)0L; /* Can't open? */
+ if ( read( fd, &psinfo, sizeof(psinfo) ) != sizeof(psinfo) )
+ {
+ close( fd );
+ return (size_t)0L; /* Can't read? */
+ }
+ close( fd );
+ return (size_t)(psinfo.pr_rssize * 1024L);
+
+#elif defined(__unix__) || defined(__unix) || defined(unix) || (defined(__APPLE__) && defined(__MACH__))
+ /* BSD, Linux, and OSX -------------------------------------- */
+ struct rusage rusage;
+ getrusage( RUSAGE_SELF, &rusage );
+#if defined(__APPLE__) && defined(__MACH__)
+ return (size_t)rusage.ru_maxrss;
+#else
+ return (size_t)(rusage.ru_maxrss * 1024L);
+#endif
+
+#else
+ /* Unknown OS ----------------------------------------------- */
+ return (size_t)0L; /* Unsupported. */
+#endif
+}
+/**
+ * Returns the current resident set size (physical memory use) measured
+ * in bytes, or zero if the value cannot be determined on this OS.
+ */
+size_t getCurrentRSS( )
+{
+#if defined(_WIN32)
+ /* Windows -------------------------------------------------- */
+ PROCESS_MEMORY_COUNTERS info;
+ GetProcessMemoryInfo( GetCurrentProcess( ), &info, sizeof(info) );
+ return (size_t)info.WorkingSetSize;
+
+#elif defined(__APPLE__) && defined(__MACH__)
+ /* OSX ------------------------------------------------------ */
+ struct mach_task_basic_info info;
+ mach_msg_type_number_t infoCount = MACH_TASK_BASIC_INFO_COUNT;
+ if ( task_info( mach_task_self( ), MACH_TASK_BASIC_INFO,
+ (task_info_t)&info, &infoCount ) != KERN_SUCCESS )
+ return (size_t)0L; /* Can't access? */
+ return (size_t)info.resident_size;
+
+#elif defined(__linux__) || defined(__linux) || defined(linux) || defined(__gnu_linux__)
+ /* Linux ---------------------------------------------------- */
+ long rss = 0L;
+ FILE* fp = NULL;
+ if ( (fp = fopen( "/proc/self/statm", "r" )) == NULL )
+ return (size_t)0L; /* Can't open? */
+ if ( fscanf( fp, "%*s%ld", &rss ) != 1 )
+ {
+ fclose( fp );
+ return (size_t)0L; /* Can't read? */
+ }
+ fclose( fp );
+ return (size_t)rss * (size_t)sysconf( _SC_PAGESIZE);
+
+#else
+ /* AIX, BSD, Solaris, and Unknown OS ------------------------ */
+ return (size_t)0L; /* Unsupported. */
+#endif
+}
+
+/**
+ * Returns the size of physical memory (RAM) in bytes.
+ */
+size_t getMemorySize( )
+{
+#if defined(_WIN32) && (defined(__CYGWIN__) || defined(__CYGWIN32__))
+ /* Cygwin under Windows. ------------------------------------ */
+ /* New 64-bit MEMORYSTATUSEX isn't available. Use old 32.bit */
+ MEMORYSTATUS status;
+ status.dwLength = sizeof(status);
+ GlobalMemoryStatus( &status );
+ return (size_t)status.dwTotalPhys;
+
+#elif defined(_WIN32)
+ /* Windows. ------------------------------------------------- */
+ /* Use new 64-bit MEMORYSTATUSEX, not old 32-bit MEMORYSTATUS */
+ MEMORYSTATUSEX status;
+ status.dwLength = sizeof(status);
+ GlobalMemoryStatusEx( &status );
+ return (size_t)status.ullTotalPhys;
+
+#elif defined(__unix__) || defined(__unix) || defined(unix) || (defined(__APPLE__) && defined(__MACH__))
+ /* UNIX variants. ------------------------------------------- */
+ /* Prefer sysctl() over sysconf() except sysctl() HW_REALMEM and HW_PHYSMEM */
+
+#if defined(CTL_HW) && (defined(HW_MEMSIZE) || defined(HW_PHYSMEM64))
+ int mib[2];
+ mib[0] = CTL_HW;
+#if defined(HW_MEMSIZE)
+ mib[1] = HW_MEMSIZE; /* OSX. --------------------- */
+#elif defined(HW_PHYSMEM64)
+ mib[1] = HW_PHYSMEM64; /* NetBSD, OpenBSD. --------- */
+#endif
+ int64_t size = 0; /* 64-bit */
+ size_t len = sizeof( size );
+ if ( sysctl( mib, 2, &size, &len, NULL, 0 ) == 0 )
+ return (size_t)size;
+ return 0L; /* Failed? */
+
+#elif defined(_SC_AIX_REALMEM)
+ /* AIX. ----------------------------------------------------- */
+ return (size_t)sysconf( _SC_AIX_REALMEM ) * (size_t)1024L;
+
+#elif defined(_SC_PHYS_PAGES) && defined(_SC_PAGESIZE)
+ /* FreeBSD, Linux, OpenBSD, and Solaris. -------------------- */
+ return (size_t)sysconf( _SC_PHYS_PAGES ) *
+ (size_t)sysconf( _SC_PAGESIZE );
+
+#elif defined(_SC_PHYS_PAGES) && defined(_SC_PAGE_SIZE)
+ /* Legacy. -------------------------------------------------- */
+ return (size_t)sysconf( _SC_PHYS_PAGES ) *
+ (size_t)sysconf( _SC_PAGE_SIZE );
+
+#elif defined(CTL_HW) && (defined(HW_PHYSMEM) || defined(HW_REALMEM))
+ /* DragonFly BSD, FreeBSD, NetBSD, OpenBSD, and OSX. -------- */
+ int mib[2];
+ mib[0] = CTL_HW;
+#if defined(HW_REALMEM)
+ mib[1] = HW_REALMEM; /* FreeBSD. ----------------- */
+#elif defined(HW_PYSMEM)
+ mib[1] = HW_PHYSMEM; /* Others. ------------------ */
+#endif
+ unsigned int size = 0; /* 32-bit */
+ size_t len = sizeof( size );
+ if ( sysctl( mib, 2, &size, &len, NULL, 0 ) == 0 )
+ return (size_t)size;
+ return 0L; /* Failed? */
+#endif /* sysctl and sysconf variants */
+
+#else
+ return 0L; /* Unknown OS. */
+#endif
+}
+
+using namespace LinBox;
+using namespace std;
+
+template<typename Field, typename Mat>
+string check_sigma(const Field& F, const Mat& sigma, Mat& serie, size_t ord){
+ Mat T(F,sigma.rowdim(),serie.coldim(),sigma.size()+serie.size()-1);
+ PolynomialMatrixMulDomain<Field> PMD(F);
+ PMD.mul(T,sigma,serie);
+ MatrixDomain<Field> MD(F);
+ size_t i=0;
+ string msg(".....");
+ bool nul_sigma=true;
+ while(i<ord && MD.isZero(T[i])){
+ if (!MD.isZero(sigma[i])) nul_sigma=false;
+ i++;
+ }
+ if (i<ord){
+ cout<<"error at degree="<<i<<endl;
+ T[i].write(std::cout, Tag::FileFormat::Plain);
+ cout<<"***"<<endl;
+ cout<<serie<<endl;
+ cout<<sigma<<endl;
+ }
+
+
+ if (i==ord && !nul_sigma)
+ msg+="done";
+ else
+ msg+="error";
+ return msg;
+}
+
+template<typename MatPol>
+bool operator==(const MatPol& A, const MatPol& B){
+ MatrixDomain<typename MatPol::Field> MD(A.field());
+ if (A.size()!=B.size()|| A.rowdim()!= B.rowdim() || A.coldim()!=B.coldim()){
+ cout<<A.size()<<"("<<A.rowdim()<<"x"<<A.coldim()<<") <> "
+ <<B.size()<<"("<<B.rowdim()<<"x"<<B.coldim()<<") <> "<<endl;
+ return false;
+ }
+ size_t i=0;
+ while (i<A.size() && MD.areEqual(A[i],B[i]))
+ i++;
+
+ if (i<A.size() && A.rowdim()<10 && A.coldim()<10){
+ cout<<"first:"<<endl<<A<<endl;
+ cout<<"second:"<<endl<<B<<endl;
+ }
+
+ return i==A.size();
+}
+
+
+template<typename Field, typename RandIter>
+void bench_sigma(const Field& F, RandIter& Gen, size_t m, size_t n, size_t d, string target) {
+ //typedef typename Field::Element Element;
+ //typedef PolynomialMatrix<PMType::matfirst,PMStorage::plain,Field> MatrixP;
+ typedef PolynomialMatrix<PMType::polfirst,PMStorage::plain,Field> MatrixP;
+
+ integer p;
+ F.characteristic(p);
+ size_t memp=length(p)+(p.bitsize()>=26?8:0);
+ size_t data_in=3*m*n*d*memp;
+ size_t data_out=2*m*m*(d+1)*memp;
+ size_t data_comp= 2*m*m*d*(length(uint64_t(m*d)*p*p)+(p.bitsize()>26?8:0));
+ std::cout<<"**************************"<<std::endl;
+ std::cout<<"mem(p) : "<<memp<<std::endl;
+ std::cout<<"mem(p) : "<<sizeof(p)<<std::endl;
+ std::cout<<"Projected Memory : "<< MB(data_in+data_out+data_comp)<<"Mo"<<std::endl;
+ std::cout<<"Available memory : "<<MB(getMemorySize())<<std::endl;
+ std::cout<<"**************************"<<std::endl;
+ std::cout<<"**************************"<<std::endl<<std::endl<<std::endl;
+ std::cout<<"[begin ] : "<<MEMINFO<<std::endl;
+
+
+ MatrixP Serie(F, m, n, d);
+ std::cout<<"[initial sequence] : "<<MB(m*n*d*memp)<<"Mo"<<MEMINFO<<std::endl;
+ std::cout<<"--> " <<MB(Serie.realmeminfo())<<std::endl;
+ std::cout<<"--> " <<MB(Serie.meminfo())<<" "<<std::endl;
+ // set the Serie at random
+ for (size_t k=0;k<d;++k)
+ for (size_t i=0;i<m;++i)
+ for (size_t j=0;j<n;++j)
+ Gen.random(Serie.ref(i,j,k));
+ std::cout<<"[initial sequence] : "<<MB(m*n*d*memp)<<"Mo"<<MEMINFO<<std::endl;
+
+ MatrixP Sigma2(F, m, m, d+1);
+ std::cout<<"[output sigma ] : "<<MB(m*m*(d+1)*memp)<<"Mo"<<MEMINFO<<std::endl;
+ std::cout<<"--> " <<MB(Sigma2.meminfo())<<std::endl;
+ std::cout<<"--> " <<MB(Sigma2.realmeminfo())<<std::endl;
+
+ // define the shift
+ vector<size_t> shift(m,0);
+
+ OrderBasis<Field> SB(F);
+ Timer chrono;
+#ifdef BENCH_MBASIS
+ if (target=="ALL"){
+ MatrixP Sigma1(F, m, m, d+1);
+ vector<size_t> shift2(m,0);
+ chrono.start();
+ SB.M_Basis(Sigma1, Serie, d, shift2);
+ chrono.stop();
+ std::cout << "M-Basis : " <<chrono.usertime()<<" s"<<std::endl;
+ }
+#endif
+ chrono.clear();
+ chrono.start();
+ SB.PM_Basis(Sigma2, Serie, d, shift);
+ chrono.stop();
+ std::cout << "PM-Basis : " <<chrono.usertime()<<" s"<<std::endl;
+ chrono.clear();
+
+ // MatrixP Sigma3(F, m, m, d+1);
+ //vector<size_t> shift3(m,0);
+ // chrono.start();
+ // SB.oPM_Basis(Sigma3, Serie, d, shift3);
+ // chrono.stop();
+ // std::cout << "PM-Basis iter : " <<chrono.usertime()<<" s"<<std::endl;
+ std::cout<<endl;
+ std::cout<<"[end] : "<<MEMINFO<<std::endl;
+}
+
+int main(int argc, char** argv){
+
+ // std::cout<<"Real memory usage: "<<MEMINFO<<std::endl;
+ // const size_t N=32<<20;
+ // double * T= new double[N];
+ // std::cout<<"allocating :"<<((N*sizeof(double))>>20)<<"Mo"<<std::endl;
+ // T[0]=1;
+ // for (size_t i=1;i<N;i++)
+ // T[i]=T[i-1];
+ // std::cout<<"Real memory usage: "<<MEMINFO<<std::endl;
+ // delete[] T;
+ // std::cout<<"Real memory usage: "<<MEMINFO<<std::endl;
+
+
+ static size_t m = 64; // matrix dimension
+ static size_t n = 32; // matrix dimension
+ static size_t b = 20; // entries bitsize
+ static size_t d = 32; // matrix degree
+ static long seed = time(NULL);
+ static string target="BEST";
+
+ static Argument args[] = {
+ { 'm', "-m M", "Set row dimension of matrix series to M.", TYPE_INT, &m },
+ { 'n', "-n N", "Set column dimension of matrix series to N.", TYPE_INT, &n },
+ { 'd', "-d D", "Set degree of matrix series to D.", TYPE_INT, &d },
+ { 'b', "-b B", "Set bitsize of the matrix entries", TYPE_INT, &b },
+ { 's', "-s s", "Set the random seed to a specific value", TYPE_INT, &seed},
+ { 't', "-t T", "Set the targeted benchmark {ALL, BEST}.", TYPE_STR , &target },
+ END_OF_ARGUMENTS
+ };
+
+ parseArguments (argc, argv, args);
+
+ typedef Givaro::Modular<double> SmallField;
+ typedef Givaro::Modular<Givaro::Integer> LargeField;
+
+ size_t logd=integer((uint64_t)d).bitsize();
+
+ std::cout<<"### matrix series is of size "<<m<<" x "<<n<<" of degree "<<d<<std::endl;
+ if (b < 26){
+ if (logd>b-4){
+ std::cout<<"degree is to large for field bitsize: "<<b<<std::endl;
+ exit(0);
+ }
+ RandomFFTPrime Rd(1<<b,seed);
+ integer p = Rd.randomPrime(logd+1);
+ std::cout<<"# starting sigma basis computation over Fp[x] with p="<<p<<endl;;
+ SmallField F(p);
+ typename SmallField::RandIter G(F,0,seed);
+ bench_sigma(F,G,m,n,d,target);
+ }
+ else {
+ RandomPrimeIterator Rd(b,seed);
+ integer p = Rd.randomPrime();
+ std::cout<<"# starting sigma basis computation over Fp[x] with p="<<p<<endl;;
+ LargeField F(p);
+ typename LargeField::RandIter G(F,0,seed);
+
+
+ bench_sigma(F,G,m,n,d,target);
+ }
+
+
+ return 0;
+}
+
diff --git a/benchmarks/benchmark-utils.C b/benchmarks/benchmark-utils.C
new file mode 100644
index 0000000..beae238
--- /dev/null
+++ b/benchmarks/benchmark-utils.C
@@ -0,0 +1,354 @@
+/* Copyright (C) 2013 LinBox
+ * Written by Brice Boyer (briceboyer) <boyer.brice at gmail.com>
+ *
+ *
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ * ========LICENCE========
+ */
+
+/*!@internal
+ * @file benchmarks/benchmark-utils.C
+ * @ingroup benchmarks
+ * @brief utils
+ */
+
+#ifndef __LINBOX_benchmarks_benchmark_utils_C
+#define __LINBOX_benchmarks_benchmark_utils_C
+
+#include "linbox/linbox-config.h"
+#include "benchmark-utils.h"
+
+//
+// Terminal progression
+//
+
+namespace LinBox {
+
+ void showAdvanceLinear(size_t curr, size_t min, size_t max)
+ {
+ std::cout << std::setprecision(4) << "\033[2K" << "\033[30D" << min <<std::flush;
+ std::cout << '<' << curr << '<' << max << " (" << std::flush;
+ std::cout << double(curr-min)/double(max-min)*100 << "%)" << std::flush;
+ }
+
+ void showFinish(size_t curr, size_t all)
+ {
+ std::cout << "\033[2K" << "\033[30D" << "finished : " << curr << std::flush;
+ std::cout << '/' << all-1 << std::flush << std::endl;
+ }
+
+ void showSkip(size_t curr, size_t all)
+ {
+ std::cout << "\033[2K" << "\033[30D" << "skipped : " << curr << std::flush;
+ std::cout << '/' << all-1 << std::flush << std::endl;
+ }
+
+ showProgression::showProgression (size_t tot) :
+ _cur_(0)
+ ,_tot_(tot)
+ {}
+
+ //! show an inter has finished
+ void showProgression::FinishIter()
+ {
+ ++_cur_ ;
+ showFinish(_cur_,_tot_);
+ }
+
+ //! show an inter has been skipped.
+ void showProgression::SkipIter()
+ {
+ ++_cur_ ;
+ showSkip(_cur_,_tot_);
+ }
+
+
+} // LinBox
+
+//
+// MFLOPS helper
+//
+
+namespace LinBox {
+
+ double computeMFLOPS(const double & tim, const double mflo, const size_t rpt)
+ {
+ linbox_check(rpt);
+ // linbox_check(tim != 0.);
+ if (tim == 0.) return NAN ;
+ return (double) ((mflo*(double)rpt)/tim);
+ }
+
+ dvector_t &
+ insertTime(dvector_t & tim3, const double & tps)
+ {
+ linbox_check(tim3.size() == 3);
+ if (tim3[0] > tps) {
+ tim3[2] = tim3[1] ;
+ tim3[1] = tim3[0] ;
+ tim3[0] = tps ;
+ }
+ else if (tim3[1] > tps) {
+ tim3[2] = tim3[1] ;
+ tim3[1] = tps ;
+ }
+ else if (tim3[2] > tps) {
+ tim3[2] = tps ;
+ }
+ return tim3 ;
+ }
+
+ double computeMFLOPS(const dvector_t & tim, const double mflo, Tag::TimeSelect ts )
+ {
+ linbox_check(tim.size());
+ switch (ts) {
+ case (Tag::TimeSelect::average) :
+ {
+ double tps = 0 ;
+ for (size_t i = 0 ; i < tim.size() ; ++i)
+ tps += tim[i] ;
+ return computeMFLOPS(tps,mflo,(size_t)tim.size());
+ }
+ case (Tag::TimeSelect::bestThree) :
+ {
+ if (tim.size() <4)
+ return computeMFLOPS(tim,mflo,Tag::TimeSelect::average);
+
+ dvector_t tps (3);
+ double t1,t2 ;
+ if (tim[0]<tim[1]) {
+ t1 = tim[0];
+ t2 = tim[1];
+ }
+ else {
+ t1 = tim[1];
+ t2 = tim[0];
+ }
+ if (tim[3] < t1) {
+ tps[0] = tim[3] ;
+ tps[1] = t1 ;
+ tps[2] = t2 ;
+ }
+ else if (tim[2] < t1) {
+ tps[0] = t1 ;
+ tps[1] = tim[3] ;
+ tps[2] = t2 ;
+ }
+ else {
+ tps[0] = t1 ;
+ tps[1] = t2;
+ tps[2] = tim[3] ;
+ }
+
+ for (size_t i = 3 ; i < tim.size() ; ++i)
+ insertTime(tps,tim[i]);
+
+ return computeMFLOPS(tim,mflo,Tag::TimeSelect::average);
+
+ }
+ case (Tag::TimeSelect::bestOne) :
+ {
+ double t1 = tim[0] ;
+ for (size_t i = 1 ; i < tim.size() ; ++i)
+ if (tim[i] < t1)
+ t1 = tim[i] ;
+ return computeMFLOPS(t1,mflo,1);
+
+ }
+ case (Tag::TimeSelect::median) :
+ {
+ if (tim.size() == 1)
+ return computeMFLOPS(tim[0],mflo,1) ;
+
+ dvector_t tps (tim);
+ std::sort(tps.begin(),tps.end());
+ size_t mid = (size_t)tps.size()/2 ;
+ double t1 ;
+ if (isOdd((uint64_t)tps.size()))
+ t1 = tps[mid] ;
+ else
+ t1 = (tps[mid-1]+tps[mid])/2;
+ return computeMFLOPS(t1,mflo,1);
+ }
+ case (Tag::TimeSelect::medmean) :
+ {
+ if (tim.size() < 3)
+ return computeMFLOPS(tim,mflo,Tag::TimeSelect::median); ;
+
+ size_t q1 = (size_t)((double)tim.size()/(double)4) ;
+ size_t q3 = (size_t)tim.size()-q1 ;
+ dvector_t tps (tim);
+ std::sort(tps.begin(),tps.end());
+ dvector_t tps2 (tim.begin()+q1,tim.begin()+q3);
+ return computeMFLOPS(tps2,mflo,Tag::TimeSelect::average);
+ }
+
+ default :
+ {
+ throw("not among tags");
+ }
+
+ } // switch(ts)
+ }
+
+}
+
+//
+// String processing
+//
+
+namespace LinBox {
+
+ bool isDigit (const std::string & s)
+ {
+ std::istringstream ss(s);
+ double d = 0.0;
+ ss >> d ; // try to read.
+ ss >> std::ws; // suppress whitespace
+
+ return (!ss.fail() && ss.eof()) ;
+ }
+
+ bool fortifiedString(const std::string & s)
+ {
+ if (isDigit(s))
+ return true ;
+ linbox_check(!s.empty());
+ return s.front() == '\"' && s.back() == '\"' ;
+ }
+
+ std::string unfortifyString(const std::string &s)
+ {
+ std::string t = s ;
+ if (fortifiedString(s)) {
+ t.erase(t.begin());
+ t.pop_back();
+ }
+ return t;
+ }
+
+ std::string fortifyString(const std::string & s)
+ {
+ if (fortifiedString(s))
+ return s ;
+ string r = "\"" ;
+ return r + s + "\"";
+ }
+
+ char randomAlNum()
+ {
+ int c = rand()%62 ;
+ c += 48 ; // c entre 48 et 109
+ if (c < 58) {
+ return (char) c;
+ }
+ else {
+ c += 7 ;
+ if (c < 91) {
+ return (char)c ;
+ }
+ else {
+ c += 6 ;
+ return (char)c;
+ }
+ }
+
+ }
+
+
+ std::string randomAlNum(const size_t & m)
+ {
+ std::string r = "" ;
+ for (size_t i = 0 ; i < m ; ++i)
+ r += randomAlNum();
+ return r ;
+ }
+
+}// LinBox
+
+//
+// Machine information
+//
+
+namespace LinBox {
+
+ //! get ISO time and date
+ std::string getDateTime(const std::string & sep)
+ {
+ std::time_t rawtime;
+ std::tm* timeinfo;
+ char buffer [80];
+
+ std::time(&rawtime);
+ timeinfo = std::gmtime(&rawtime);
+
+ std::string fmt ;
+ std::string date = "%Y-%m-%d" ;
+ std::string time = "%H:%M:%S" ;
+ std::string tz = "GMT" ;
+
+ fmt = date + sep + time + sep + tz ;
+
+ std::strftime(buffer,80,fmt.c_str(),timeinfo);
+
+ std::string mytime(buffer);
+
+ return mytime;
+ }
+
+ //! get some machine information (not cpu yet)
+ smatrix_t getMachineInformation()
+ {
+ smatrix_t Machine(2);
+ Machine[0].resize(5);
+ Machine[1].resize(5);
+ struct utsname unameData;
+ uname(&unameData);
+ Machine[0][0] = "sysname";
+ Machine[1][0] = unameData.sysname;
+ Machine[0][1] = "nodename";
+ Machine[1][1] = unameData.nodename;
+ Machine[0][2] = "release";
+ Machine[1][2] = unameData.release;
+ Machine[0][3] = "version";
+ Machine[1][3] = unameData.version;
+ Machine[0][4] = "machine";
+ Machine[1][4] = unameData.machine;
+ // Machine[0][5] = "RAM (kb)";
+ // system("cat /proc/meminfo | grep MemTotal | awk '{print $2}'");
+ // Machine[0][6] = "CPU name";
+ // system("/proc/cpuinfo | grep 'model name' | awk '{$1=$2=$3=""; print $0}'");
+ // Machine[0][7] = "CPU nb";
+ // system("/proc/cpuinfo | grep 'model name' | wc -l");
+ // Machine[0][8] = "CPU Ghz";
+ // cpuid ?
+ return Machine ;
+ }
+
+}
+
+#endif // __LINBOX_benchmarks_benchmark_utils_C
+
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/benchmarks/benchmark-utils.h b/benchmarks/benchmark-utils.h
new file mode 100644
index 0000000..c43db9c
--- /dev/null
+++ b/benchmarks/benchmark-utils.h
@@ -0,0 +1,307 @@
+/* Copyright (C) 2013 LinBox
+ * Written by Brice Boyer (briceboyer) <boyer.brice at gmail.com>
+ *
+ *
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ * ========LICENCE========
+ */
+
+/*! @file benchmarks/benchmark-utils.h
+ * @ingroup benchmarks
+ * @brief utils
+ */
+
+#ifndef __LINBOX_benchmarks_benchmark_utils_H
+#define __LINBOX_benchmarks_benchmark_utils_H
+
+
+/* ********************** */
+/* Tags */
+/* ********************** */
+
+// Tags (cf linbox/linbox-tags.h )
+namespace LinBox { namespace Tag {
+
+ //! selection of best times in a series.
+#if HAVE_CXX11
+ enum struct TimeSelect : int32_t
+#else
+ enum TimeSelect
+#endif
+ {
+ average = 1, //!< select the average
+ bestThree = 2, //!< select the average among the three best (supposes order is <)
+ bestOne = 3, //!< select the best one (supposes order is <)
+ median = 4, //!< median
+ medmean = 5 //!< interquartile mean (remove 25% extremes and average the rest)
+ };
+
+ //! selection of printers
+#if HAVE_CXX11
+ enum struct Printer : int32_t
+#else
+ enum Printer
+#endif
+ {
+ dat = 1, //!< print data raw (format chosen by implementation)
+ tex = 2, //!< print latex useable
+ xml = 3, //!< print using xml syntax
+ gnuplot = 4, //!< print using gnuplot
+ csv = 5, //!< coma separated values
+ html = 6 //!< coma separated values
+ };
+
+ } // Tag
+} // LinBox
+
+/* ********************** */
+/* Outils */
+/* ********************** */
+
+//
+// typedefs data formats
+//
+
+namespace LinBox {
+
+ //! vector of double
+ typedef std::vector<double> dvector_t;
+ typedef std::vector<std::string> svector_t;
+
+ //! matrix of double
+ typedef std::vector<dvector_t> dmatrix_t;
+ typedef std::vector<svector_t> smatrix_t;
+
+} // LinBox
+
+//
+// String processing
+//
+
+namespace LinBox {
+
+ /** Check if a string is actually a double.
+ * @param s string to check
+ * @return true/false
+ */
+ bool isDigit (const std::string & s);
+
+ /** Tells is a string has double quotes around.
+ * @param s string to test
+ * @return true if s[0] == s[last] == '"'
+ */
+ bool fortifiedString(const std::string & s);
+
+ /** removes the surrounding quotes.
+ * @param s removes quotes around if necessary
+ * @return s without surrounding double quotes if necessary
+ */
+ std::string unfortifyString(const std::string &s);
+
+ /** adds surrounding quotes.
+ * @param s add quotes around if necessary
+ * @return s with surrounding double quotes if necessary
+ */
+ std::string fortifyString(const std::string & s);
+
+ /** Converts anything to a string
+ * @param nam to be put in a string.
+ */
+ template<class T>
+ std::string toString(T & nam)
+ {
+ std::ostringstream nam_ss ;
+ nam_ss << nam ;
+ return nam_ss.str();
+ }
+
+ //! finds keyword betwen begin and end, return true if found and i is the index where it is (possibly correspondig to end)
+ bool findKeyword(size_t & i, const svector_t::const_iterator & begin, const svector_t::const_iterator & end, const std::string & keyword)
+ {
+ svector_t::const_iterator it ;
+ it = std::find(begin, end, keyword);
+ i = (size_t)std::distance(begin, it);
+ return (it != end) ;
+
+ }
+
+ /*! @internal
+ * @brief random <code>:alnum:</code> \c char.
+ * [[:alnum:]] characters are in range
+ * - num : 48-57
+ * - AL : 67-90
+ * - al : 97-122
+ * .
+ * @return a random alphabetic or numeric char.
+ */
+ char randomAlNum() ;
+
+ /*! @internal
+ * @brief random <code>:alnum:</code> \c string.
+ * @param m size of string
+ * [[:alnum:]] characters are in range
+ * - num : 48-57
+ * - AL : 67-90
+ * - al : 97-122
+ * .
+ * @return a random alphabetic or numeric char.
+ */
+ std::string randomAlNum(const size_t & m) ;
+}// LinBox
+
+//
+// Machine info
+//
+
+namespace LinBox {
+
+ /*! get ISO time and date
+ * year-time YYYY-MM-DD 'sep' HH:MM:SS 'sep' (GMT)
+ * @param sep separation between
+ */
+ std::string getDateTime( const std::string & sep = " ");
+
+ //! get some machine information (not cpu yet)
+ smatrix_t getMachineInformation();
+
+} // LinBox
+
+//
+// advancement printing on terminal
+//
+
+namespace LinBox {
+
+ /*! show the advancement (on the terminal)
+ * suppose linear advancement
+ * @param curr current iteration
+ * @param min starting iteration
+ * @param max terminal iteration
+ */
+ void showAdvanceLinear(size_t curr, size_t min, size_t max);
+
+ /*! tells the current series of measure has completed (on the terminal)
+ * @param curr current iteration
+ * @param all number of iterations
+ */
+ void showFinish(size_t curr, size_t all);
+
+ /*! tells the current series of measure was skipped (on the terminal)
+ * @param curr current iteration
+ * @param all number of iterations
+ */
+ void showSkip(size_t curr, size_t all);
+
+ //! Show progression on the terminal (helper)
+ class showProgression {
+ private :
+ size_t _cur_ ; //!< current iter
+ size_t _tot_ ; //!< max iter
+ public :
+ //! constructor
+ showProgression (size_t tot) ;
+
+ //! show an inter has finished
+ void FinishIter();
+
+ //! show an inter has been skipped.
+ void SkipIter();
+ }; // showProgression
+} // LinBox
+
+//
+// computing megaflops from time (series)/number ops
+//
+
+namespace LinBox {
+
+ /**
+ * @brief computes the number of megaflops.
+ * @param tim timer (seconds)
+ * @param mflo number of operations (1e6 operations)
+ * @param rpt number of experiences
+ * @return mflo/(tim*rpt)
+ */
+ double computeMFLOPS(const double & tim, const double mflo, const size_t rpt = 1);
+
+ /*! @internal @brief inserts a time in a vector of 3 best times.
+ * @param tim3 ordered form min to max vector of 3 best times
+ * @param tps inserts that time in \p tim3 if better.
+ * @return a reference to \p tim3
+ */
+ dvector_t &
+ insertTime(dvector_t & tim3, const double & tps);
+
+ /**
+ * @brief computes the number of megaflops.
+ * @param tim timer (seconds)
+ * @param mflo number of operations (1e6 operations)
+ * @param ts number of experiences to select. @see TimeSelect. Default to the best three
+ * @return mflo/(tim*rpt)
+ */
+ double computeMFLOPS(const dvector_t & tim, const double mflo, Tag::TimeSelect ts = Tag::TimeSelect::bestThree);
+
+}
+
+//
+// Chrono
+// warning : implem in benchmark.inl
+//
+
+namespace LinBox {
+ template<class MyTimer>
+ class Chrono {
+ private :
+ MyTimer _chrono_ ;
+ dvector_t _times_ ;
+ double _total_ ;
+ public:
+ Chrono() ;
+
+ ~Chrono() ;
+
+ void clear();
+
+ void start();
+
+ void stop();
+
+ double time() const;
+
+ dvector_t times() const;
+
+
+
+ }; // Chrono
+} // LinBox
+
+
+#ifdef LinBoxSrcOnly
+#include "benchmarks/benchmark-utils.C"
+#endif
+
+#endif // __LINBOX_benchmarks_benchmark_utils_H
+
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/benchmarks/benchmark.C b/benchmarks/benchmark.C
new file mode 100644
index 0000000..cb3003d
--- /dev/null
+++ b/benchmarks/benchmark.C
@@ -0,0 +1,1597 @@
+/* Copyright (C) 2013 LinBox
+ * Written by Brice Boyer (briceboyer) <boyer.brice at gmail.com>
+ *
+ *
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ * ========LICENCE========
+ */
+
+/*!@internal
+ * @file benchmarks/benchmark.C
+ * @ingroup benchmarks
+ * @brief utils
+ */
+
+#ifndef __LINBOX_benchmarks_benchmark_C
+#define __LINBOX_benchmarks_benchmark_C
+
+#include "linbox/linbox-config.h"
+
+#include "benchmark.h"
+
+//
+// PlotData
+//
+
+namespace LinBox {
+#ifdef __LINBOX_HAVE_TINYXML2
+ tinyxml2::XMLElement * PlotData::saveData(tinyxml2::XMLDocument & doc)
+ {
+ using namespace tinyxml2;
+ XMLElement * data = doc.NewElement( "data" );
+
+ selectFirstSeries();
+ for (size_t i = 0 ; i < size() ; ++i ) {
+
+ XMLElement * series = doc.NewElement ( "series" );
+ series->SetAttribute("name",unfortifyString(getCurrentSeriesName()).c_str());
+
+ for (size_t j = 0 ; j < getCurrentSeriesSize() ; ++j)
+ {
+ XMLElement * point = doc.NewElement ( "point" );
+ point->SetAttribute("x",unfortifyString(getCurrentSeriesEntry(j,Point::Labels() )).c_str());
+ point->SetAttribute("y",getCurrentSeriesEntry(j,Point::Values() ));
+ point->SetAttribute("time",getCurrentSeriesEntry(j,Point::Times() ));
+ point->SetAttribute("xval",getCurrentSeriesEntry(j,Point::Points() ));
+ point->SetAttribute("id",getCurrentSeriesId(j).c_str());
+
+ series->InsertEndChild( point );
+ }
+
+ data->InsertEndChild( series );
+
+ selectNextSeries();
+ }
+
+ return data ;
+ }
+#endif
+
+
+ PlotData::PlotData() :
+ _tableau_ (0)
+ ,_series_label_ (0)
+ ,_curr_series_ ( )
+ ,_time_watch_ ( )
+ {
+ }
+
+ PlotData::~PlotData() {}
+
+ PlotData::PlotData(const PlotData & PD):
+ _tableau_(PD.getTable())
+ ,_series_label_(PD.getSeriesLabels())
+ ,_curr_series_(PD.getCurrentSeriesNumber())
+ ,_time_watch_ (_tableau_[_curr_series_].Points,_tableau_[_curr_series_].Times)
+ {
+ }
+
+ size_t PlotData::selectIndex(const std::string & nom)
+ {
+
+ std::string nomf = fortifyString(nom);
+ size_t j ;
+ bool ok = findKeyword(j,_series_label_.begin() , _series_label_.end() , nomf);
+
+
+ if ( ! ok ) {
+ linbox_check(j ==(size_t)_series_label_.size() );
+ _series_label_.push_back(fortifyString(nom));
+ _tableau_.resize(j+1);
+ }
+
+ initWatch(j);
+
+ return j ;
+ }
+
+ size_t PlotData::getIndex(const std::string & nom) const
+ {
+
+ std::string nomf = fortifyString(nom);
+ size_t j ;
+#ifdef NDEBUG
+ findKeyword(j,_series_label_.begin() , _series_label_.end() , nomf);
+#else
+ bool ok = findKeyword(j,_series_label_.begin() , _series_label_.end() , nomf);
+ linbox_check(ok);
+#endif
+
+ return j ;
+ }
+
+ void PlotData::clear()
+ {
+ _tableau_.resize(0);
+ _series_label_.resize(0);
+ _curr_series_ = 0;
+ _time_watch_.clear();
+ }
+
+ void PlotData::merge(const PlotData &PD)
+ {
+ for (size_t i = 0 ; i < (size_t)PD.size() ; ++i) {
+ _tableau_.push_back(PD.getSeries(i));
+ _series_label_.push_back(fortifyString(PD.getSeriesName(i)));
+ }
+ return ;
+ }
+
+ size_t PlotData::size() const
+ {
+ linbox_check(_tableau_.size() == _series_label_.size());
+ return (size_t)_tableau_.size() ;
+ }
+
+ size_t PlotData::getCurrentSeriesNumber() const
+ {
+ return _curr_series_ ;
+ }
+
+ void PlotData::setSeriesName(const size_t & i, const std::string & nom)
+ {
+ linbox_check(i<size());
+ _series_label_[i] = fortifyString(nom) ;
+ }
+
+ const std::string & PlotData::getSeriesName(const size_t & i) const
+ {
+ linbox_check(i<size());
+ return _series_label_[i] ;
+ }
+
+ const std::string & PlotData::getCurrentSeriesName() const
+ {
+ return getSeriesName(_curr_series_) ;
+ }
+
+ void PlotData::setCurrentSeriesName(const std::string & nom)
+ {
+ return setSeriesName(_curr_series_,nom);
+ }
+
+ void PlotData::initWatch ( const size_t & i)
+ {
+ linbox_check(i < size());
+ _curr_series_ = i ;
+ _time_watch_.init(_tableau_[i].Points,_tableau_[i].Times);
+ }
+
+ void PlotData::initCurrentSeriesWatch ()
+ {
+ initWatch(_curr_series_);
+ }
+
+ void PlotData::newSeries(const std::string & nom )
+ {
+
+ size_t old_size = size() ;
+ _curr_series_ = old_size ;
+
+ _tableau_.resize(old_size+1);
+ _series_label_.resize(old_size+1);
+
+ if (nom.empty()) {
+ std::ostringstream emptytitle ;
+ emptytitle << "series." << _curr_series_ ;
+ setCurrentSeriesName(emptytitle.str());
+ }
+ else
+ setCurrentSeriesName(nom);
+
+ initCurrentSeriesWatch();
+
+ return;
+ }
+
+ void PlotData::finishSeries()
+ {
+ }
+
+ const DataSeries & PlotData::getSeries(const size_t &i) const
+ {
+ linbox_check(i < size());
+ return _tableau_[i] ;
+ }
+
+ const DataSeries & PlotData::selectSeries(const size_t &i)
+ {
+ initWatch(i);
+ return getSeries(i) ;
+ }
+
+ const DataSeries & PlotData::selectSeries(const std::string & name)
+ {
+ return selectSeries(selectIndex(name));
+ }
+
+ DataSeries & PlotData::refSeries(const size_t &i)
+ {
+ linbox_check(i < size());
+ return _tableau_[i] ;
+ }
+
+ DataSeries & PlotData::refSeries(const std::string &nom)
+ {
+ return refSeries(getIndex(nom));
+ }
+
+ const DataSeries & PlotData::getCurrentSeries() const
+ {
+ return getSeries(_curr_series_);
+ }
+
+ DataSeries & PlotData::refCurrentSeries()
+ {
+ return refSeries(_curr_series_);
+ }
+
+ size_t PlotData::getSeriesSize(const size_t & i) const
+ {
+ return getSeries(i).size();
+ }
+
+ size_t PlotData::getCurrentSeriesSize() const
+ {
+ return getSeries(_curr_series_).size();
+ }
+
+
+ void PlotData::selectFirstSeries()
+ {
+ selectSeries(0);
+
+ return;
+ }
+
+ bool PlotData::selectNextSeries()
+ {
+ linbox_check(_curr_series_ < size());
+ ++_curr_series_ ;
+ if (_curr_series_ < size()) {
+ selectSeries(_curr_series_);
+ return true;
+ }
+ return false;
+ }
+
+ void PlotData::setCurrentSeriesPointLabel(const size_t & j, const std::string & nom)
+ {
+ return setSeriesPointLabel(_curr_series_,j,nom);
+ }
+
+
+ std::string PlotData::getSeriesLabel(const size_t & i) const
+ {
+ linbox_check(i<size());
+ linbox_check(i<_series_label_.size() );
+ linbox_check(! _series_label_[i].empty()) ;
+
+ return(_series_label_[i]);
+ }
+
+ const svector_t & PlotData::getSeriesLabels() const
+ {
+ return _series_label_ ;
+ }
+
+
+ void PlotData::setSeriesEntry(const size_t &i, const std::string & nam, const double & val
+ , const double & xval , const double & yval)
+ {
+ refSeries(i).push_back(fortifyString(nam),val,xval,yval);
+ initWatch(i); // in case series has changed
+ return ;
+ }
+
+ void PlotData::setSeriesEntry(const std::string & nom, const std::string & nam, const double & val
+ , const double & xval, const double & yval)
+ {
+ selectSeries(nom);
+ return setCurrentSeriesEntry(nam,val,xval,yval);
+ }
+
+ const std::vector<DataSeries > & PlotData::getTable() const
+ {
+ return _tableau_ ;
+ }
+
+ std::vector<DataSeries > & PlotData::refTable()
+ {
+ return _tableau_ ;
+ }
+
+ bool PlotData::keepon(size_t & repet, double tim, bool usePrediction)
+ {
+ return _time_watch_.keepon(repet,tim, usePrediction);
+ }
+
+ void PlotData::load( const std::string & filename)
+ {
+#ifdef __LINBOX_HAVE_TINYXML2
+ using namespace tinyxml2;
+ XMLDocument doc;
+ doc.LoadFile( filename.c_str() );
+ // std::cout << "loaded " << filename << std::endl;
+ linbox_check(!doc.ErrorID());
+
+ XMLElement * bench = doc.FirstChildElement( "benchmark");
+ linbox_check(bench);
+ XMLElement* data = bench -> FirstChildElement( "data" ) ;
+ linbox_check(data);
+ XMLElement* series = data -> FirstChildElement( "series" ) ;
+
+ clear();
+
+ while (series)
+ {
+ newSeries( series->Attribute( "name" ) );
+ XMLElement * points = series->FirstChildElement() ;
+ while (points) {
+ std::string x = points->Attribute( "x" );
+ double y = points->DoubleAttribute( "y" );
+ double time = points->DoubleAttribute( "time" );
+ double xval = points->DoubleAttribute( "xval" );
+ // std::string id = points->Attribute( "id" );
+
+ setCurrentSeriesEntry(x,y,xval,time);
+
+ // setCurrentSeriesEntryId(id);
+
+ points = points->NextSiblingElement();
+ }
+
+ series = series->NextSiblingElement();
+ }
+#else
+ throw LinBoxError("You need tinyxml2 for loading data");
+#endif
+ // save("toto.xml");
+
+ }
+
+ void PlotData::save( const std::string & filename
+ , const std::string & title
+ , const std::string & xtitle
+ , const std::string & ytitle )
+ {
+#ifdef __LINBOX_HAVE_TINYXML2
+ using namespace tinyxml2;
+ XMLDocument doc;
+
+ doc.InsertEndChild(doc.NewDeclaration());
+
+ XMLElement * benchmark = doc.NewElement( "benchmark" );
+ doc.InsertEndChild(benchmark);
+
+ { // Benchmark Metadata
+ XMLElement * metadata = doc.NewElement( "metadata" );
+
+ smatrix_t uname = getMachineInformation();
+
+ for (size_t i = 0 ; i < uname[0].size() ; ++i) {
+ metadata->SetAttribute(uname[0][i].c_str(),uname[1][i].c_str());
+ }
+
+ std::string myTime = getDateTime();
+
+ metadata->SetAttribute("time",myTime.c_str());
+
+ benchmark->InsertEndChild(metadata);
+ }
+
+ { // Legende
+ XMLElement * legende = doc.NewElement( "legende" );
+
+ std::string mytitle = title;
+ if (title.empty())
+ mytitle =filename ;
+ legende->SetAttribute("title",unfortifyString(mytitle).c_str());
+ if (!xtitle.empty())
+ legende->SetAttribute("X",unfortifyString(xtitle).c_str());
+ if (!ytitle.empty())
+ legende->SetAttribute("Y",unfortifyString(ytitle).c_str());
+
+
+ benchmark->InsertEndChild(legende);
+ }
+
+
+ { // series
+ XMLElement * data = saveData(doc);
+
+ benchmark->InsertEndChild(data);
+ }
+
+ { // point metadata
+ XMLElement * metapoint = doc.NewElement( "PointMetaData" );
+ for (size_t i = 0 ; i < _meta_data_.MetaDataVec.size() ; ++i)
+ {
+ XMLElement * item = NULL ;
+ _meta_data_.MetaDataVec[i].writeMetaData(&item,doc);
+ std::string pts = "";
+ for (size_t j = 0 ; j < _meta_data_.MetaDataIDs[i].size(); ++j){
+ pts += _meta_data_.MetaDataIDs[i][j] ;
+ if (j+1 < _meta_data_.MetaDataIDs[i].size() )
+ pts += ',';
+ }
+ item->SetAttribute("used_in",pts.c_str());
+ metapoint->InsertEndChild(item);
+ }
+
+ benchmark->InsertEndChild(metapoint);
+ }
+
+ doc.SaveFile(filename.c_str());
+
+ std::cout << "xml table saved in " << filename << std::endl;
+#else
+ std::cout << "tinyxml2 is not installed, could not save" << std::endl;
+#endif
+
+ }
+
+} // LinBox
+
+
+//
+// PlotStyle
+//
+
+namespace LinBox {
+
+
+ PlotStyle::PlotStyle() :
+ _term_(Term::eps),_plot_type_(Plot::histo),_line_type_(Line::histogram)
+ {
+
+ }
+
+ void PlotStyle::setTitle ( const std::string & titre
+ , const std::string & titre_y
+ , const std::string & titre_x)
+ {
+ _title_ = titre ;
+ _title_x_ = titre_x ;
+ _title_y_ = titre_y ;
+ }
+
+ std::string PlotStyle::getTitle() const
+ {
+ std::string title = "#title\nset title \"" + _title_ + '\"';
+ if (!_title_x_.empty())
+ title +="\nset xlabel \"" + _title_x_ +'\"' ;
+ if (!_title_y_.empty())
+ title +="\nset ylabel \"" + _title_y_ +'\"' ;
+ return title ;
+ }
+
+ std::string PlotStyle::getTitleX() const
+ {
+ return "\nset xlabel \"" + _title_x_ + '\"' ;
+ }
+
+ std::string PlotStyle::PlotStyle::getTitleY() const
+ {
+ return "\nset ylabel \"" + _title_y_ + '\"' ;
+ }
+
+ std::string PlotStyle::getRawTitle(int index) const
+ {
+ switch (index) {
+ case 0 :
+ return _title_ ;
+ case 1 :
+ return _title_x_ ;
+ case 2 :
+ return _title_y_ ;
+ default :
+ return "bad index" ;
+ }
+ }
+
+ void PlotStyle::setTerm( enum Term::Type term)
+ {
+ _term_ = term ;
+ }
+
+ std::string PlotStyle::getTerm() const
+ {
+ std::string term = "#term\nset term " ;
+ switch(_term_) {
+ case (Term::png) :
+ term += "png noenhanced" ;
+ break;
+ case (Term::pdf) :
+ std::cerr << "warning, pdf not really working for now" << std::endl;
+ term += "postscript eps noenhanced color" ;
+ break;
+ case (Term::eps) :
+ term += "postscript eps noenhanced color" ;
+ break;
+ case (Term::epstex) :
+ term += "epslatex color colortext" ;
+ break;
+
+ case (Term::svg) :
+ term += "svg" ;
+ break;
+ case (Term::other) :
+ default :
+ std::cerr << " *** error ***" << std::endl << "No supported term set" << std::endl;
+ term += "unknown" ;
+ }
+ return term ;
+ }
+
+ std::string PlotStyle::getExt() const
+ {
+ switch(_term_) {
+ case (Term::png) :
+ return ".png" ;
+ case (Term::pdf) :
+#ifndef __LINBOX_HAVE_GHOSTSCRIPT
+ std::cerr << "warning, pdf not available. falling back to eps" << std::endl;
+#endif
+ return ".pdf" ;
+ case (Term::eps) :
+ return ".eps" ;
+ case (Term::epstex) :
+ return ".tex" ;
+ case (Term::svg) :
+ return ".svg" ;
+ default :
+ std::cerr << "unknown extension set" << std::endl;
+ return ".xxx" ;
+ }
+ }
+
+ void PlotStyle::setKeyPos(const std::string & keypos)
+ {
+ _legend_pos_ = keypos ;
+ }
+
+ std::string PlotStyle::getKeyPos() const
+ {
+ std::string lgd ="#legend\nset key " ;
+ if (!_legend_pos_.empty())
+ lgd += _legend_pos_ ;
+ else
+ lgd += " under" ;
+ return lgd;
+ }
+
+ void PlotStyle::setXtics ( enum Options::Type opt, const std::string & more )
+ {
+ _xtics_ = "#xtics\nset xtics ";
+ if (opt == Options::oblique)
+ _xtics_ += "nomirror rotate by -45 scale 0 ";
+ else {
+ linbox_check(opt == Options::other);
+ _xtics_ += more ;
+ }
+ }
+
+ const std::string & PlotStyle::getXtics() const
+ {
+ return _xtics_ ;
+ }
+
+ std::string PlotStyle::getOutput(const std::string & basnam) const
+ {
+ std::string setout = "#output\nset output \'" ;
+#ifdef __LINBOX_HAVE_GHOSTSCRIPT
+ if (_term_ == Term::pdf)
+ setout += "| ps2pdf - " ;
+ setout += basnam + getExt() + '\'' ;
+#else
+ setout += basnam + ".eps\'" ;
+#endif
+
+ return setout ;
+ }
+
+ void PlotStyle::setPlotType(enum Plot::Type type)
+ {
+ _plot_type_ = type ;
+ // _plot_extra_ = moreargs ;
+ }
+
+ void PlotStyle::setLineType( enum Line::Type type)
+ {
+ _line_type_ = type ;
+ }
+
+ std::string PlotStyle::getPlotType(const std::string & extraargs) // const
+ {
+ _styleopts_ += "\nset datafile missing \"inf\"" ;
+ std::string mystyle = "#style\nset style data " ;
+ if (_line_type_ != Line::other) {
+ switch (_line_type_) {
+ case (Line::lines) :
+ mystyle += "lines" ;
+ break;
+ case (Line::histogram) :
+ mystyle += "histogram" ;
+ if (extraargs.empty()) // default style
+ mystyle += "\nset style histogram cluster gap 1\nset style fill solid border rgb \"black\"";
+ break;
+ case (Line::points) :
+ mystyle += "points" ;
+ break;
+ case (Line::linespoints) :
+ mystyle += "linespoints" ;
+ break;
+ default :
+ std::cout << __func__ << " : you should have set the LineType when ploting PlotType::graph !" << std::endl;
+ mystyle += "other" ;
+ }
+ }
+ else { // userd defined datastyle
+ return _styleopts_ ;
+ }
+ // some more style args :
+ mystyle += "\n" + _styleopts_ + "\n" + extraargs + "\n";
+ return mystyle ;
+ }
+
+ void PlotStyle::addPlotType(const std::string & style)
+ {
+ _styleopts_ += "\n" + style ;
+ }
+
+ void PlotStyle::setUsingSeries(size_t col, const std::string & moreargs)
+ {
+ linbox_check(col>1);
+ std::ostringstream usingcols ;
+ if (_plot_type_ == Plot::histo) {
+ usingcols << " using " << col << ":xtic(1) title columnheader(" << col << ") " << moreargs << " ";
+ }
+ else {
+ linbox_check(_plot_type_ == Plot::graph);
+ usingcols << " using 1:" << col << " title columnheader(" << col << ") " << moreargs << " ";
+ }
+ _usingcols_ = usingcols.str();
+ }
+
+ void PlotStyle::addUsingSeries(size_t col, const std::string & moreargs)
+ {
+ linbox_check(col>2);
+ linbox_check(!_usingcols_.empty()); // we don't add if nothing was set
+ std::ostringstream usingcols ;
+ usingcols << ", \'\' using " ;
+ if (_plot_type_ == Plot::graph)
+ usingcols << "1:" ;
+ usingcols << col << " ti col " << moreargs << " ";
+ _usingcols_ += usingcols.str();
+ }
+
+ void PlotStyle::setUsingSeries(std::list<size_t> cols, const std::string & moreargs)
+ {
+ linbox_check(!cols.empty());
+ std::list<size_t>::iterator it = cols.begin();
+ // no way to check *it< coldim...
+ std::ostringstream usingcols ;
+ if ( _plot_type_ == Plot::histo ) {
+ usingcols << " using " << *it << ":xtic(1) title columnheader(" << *it << ") " << moreargs << " " ;
+ ++it ;
+ for (;it != cols.end();++it) {
+ usingcols << ", \'\' using " << *it << " ti col " << moreargs << " ";
+ }
+ }
+ else {
+ linbox_check(_plot_type_ == Plot::graph);
+ usingcols << " using 1:" << *it << " title columnheader(" << *it << ") " << moreargs << " ";
+ ++it ;
+ for (;it != cols.end();++it) {
+ usingcols << ", \'\' using 1:" << *it << " ti col " << moreargs << " ";
+ }
+ }
+
+ _usingcols_ = usingcols.str();
+ return;
+ }
+
+ void PlotStyle::addUsingSeries(std::list<size_t> cols, const std::string & moreargs)
+ {
+ linbox_check(!cols.empty());
+ linbox_check(!_usingcols_.empty()); // we don't add if nothing was set
+ std::list<size_t>::iterator it = cols.begin();
+ std::ostringstream usingcols ;
+ if (_plot_type_ == Plot::histo) {
+ for (;it != cols.end();++it) {
+ usingcols << ", \'\' using " << *it << " ti col " << moreargs << " ";
+ }
+ }
+ else {
+ linbox_check(_plot_type_ == Plot::graph);
+ for (;it != cols.end();++it) {
+ usingcols << ", \'\' using 1:" << *it << " ti col " << moreargs << " ";
+
+ }
+ }
+ _usingcols_ += usingcols.str();
+ return;
+ }
+
+ void PlotStyle::setUsingSeries(std::pair<size_t,size_t> cols, const std::string & moreargs)
+ {
+ std::ostringstream usingcols ;
+ if (_plot_type_ == Plot::histo) {
+ usingcols << " using " << cols.first << ":xtic(1) title columnheader(" << cols.first << ") " << moreargs << " ";
+ usingcols << ", for [i=" << cols.first+1 << ":" << cols.second << "] \'\' using i title columnheader(i) " << moreargs << " ";
+ }
+ else {
+ linbox_check(_plot_type_ == Plot::graph);
+ usingcols << " using 1:" << cols.first << " title columnheader(" << cols.first << ") " << moreargs << " ";
+ usingcols << ", for [i=" << cols.first+1 << ":" << cols.second << "] \'\' using 1:i title columnheader(i) " << moreargs << " ";
+ }
+
+ _usingcols_ = usingcols.str();
+ return;
+
+ }
+
+ void PlotStyle::addUsingSeries(std::pair<size_t,size_t> cols, const std::string & moreargs)
+ {
+ linbox_check(!_usingcols_.empty()); // we don't add if nothing was set
+ std::ostringstream usingcols ;
+ if (_plot_type_ == Plot::histo) {
+ usingcols << ", for i=[" << cols.first << ":" << cols.second << "] \'\' using i title columnheader(i) " << moreargs << " ";
+ }
+ else {
+ usingcols << ", for i=[" << cols.first << ":" << cols.second << "] \'\' using 1:i title columnheader(i) " << moreargs << " ";
+ linbox_check(_plot_type_ == Plot::graph);
+ }
+
+ _usingcols_ += usingcols.str();
+
+ }
+
+ const std::string & PlotStyle::getUsingSeries() const
+ {
+ return _usingcols_ ;
+ }
+
+} // LinBox
+
+//
+// Curve fitting
+//
+
+namespace LinBox {
+
+ // fit X[nn-1,nn],Y[nn-1,nn] and return evaluation at x.
+ double fit2(const dvector_t & X, const dvector_t & Y, int nn, double x)
+ {
+ size_t n = (size_t) nn;
+ assert(n>0);
+ if ( n==1 ) {
+ if ( X[0]==X[1] ) {
+ // std::cerr << "two of your evaluation points are at the same X" << std::endl;
+ // this is NOT supposed to happen.
+ return (Y[0]+Y[1])/2 ;
+ }
+ }
+ if (X[n]==X[n-1]) // discard the last one.
+ return fit2(X,Y,(int)n-1,x);
+
+ double a = (Y[n-1]-Y[n])/(X[n-1]-X[n]) ;
+ double b = (X[n-1]*Y[n]-X[n]*Y[n-1])/(X[n-1]-X[n]) ;
+ return a*x+b ;
+ }
+
+#ifdef __LINBOX_HAVE_LAPACK
+
+ double fit_lapack3(const dvector_t &X, const dvector_t &Z, double x)
+ {
+
+ dvector_t Y = Z ;
+
+ int n = (int) Z.size();
+ linbox_check((size_t)n == X.size());
+
+ int deg = (int) std::min((int)4,n);
+ dvector_t V((size_t)(deg*n));
+
+ int ldv = deg ;
+
+#if 0 // Clapack (not working)
+ for(size_t i = 0 ; i < (size_t)n; ++i) {
+ for (size_t j = 0 ; j < (size_t)ldv; ++j) {
+ V[i*ldv+j] = std::pow(X[i],j);
+ }
+ }
+
+ clapack_dgels(CblasRowMajor, CblasNoTrans, n, deg, 1, &V[0],
+ deg, &Y[0], 1);
+
+#endif
+
+#if 1 /* basic least squares */
+ // std::cout << V.size() << std::endl;
+ for(size_t i = 0 ; i < (size_t)n; ++i) {
+ for (size_t j = 0 ; j < (size_t)ldv; ++j) {
+ V[i+j*(size_t)n] = std::pow(X[i],j);
+ }
+ }
+
+ // std::cout << V << std::endl;
+
+ int info;
+ int ldun = 1 ;
+ {
+
+ int lwork = 2*n*deg*4 ;
+ dvector_t work((size_t)lwork);
+ char N[] = "N";
+ dgels_(N, &n, &ldv, &ldun, &(V[0]) , &n, &(Y[0]), &n, &work[0], &lwork, &info);
+ }
+
+#endif
+
+#if 0 /* least squares using SVN and V not nec. full rank */
+ {
+ int lwork = 2*deg+std::max(2*deg,n)*4 ;
+ dvector_t work(lwork);
+ dvector_t s(deg);
+ double rcond = 1e-8 ;
+ int rank ;
+ dgelss_( &n, &ldv, &ldun, &(V[0]) , &n, &(Y[0]), &n, &s[0], &rcond, &rank, &work[0], &lwork, &info);
+ }
+#endif
+
+#if 0 /* weighted least squares */
+ //DGGGLM
+
+ // TODO
+
+#endif
+
+
+ // std::cout << Y << std::endl;
+ // horner eval the poly
+ double res = 0.0;
+
+ for(int i=deg-1; i >= 0; i--) {
+ res = res * x + Y[(size_t)i];
+ }
+ return res;
+ }
+#endif // __LINBOX_HAVE_LAPACK
+
+
+ double fit3(const dvector_t & X, const dvector_t & Y,int n, double x)
+ {
+#ifndef __LINBOX_HAVE_LAPACK /* à la main */
+ linbox_check(n>1);
+ linbox_check((size_t)n< X.size());
+ linbox_check((size_t)n< Y.size());
+ if (n==2) {
+ if (X[1]==X[2])
+ return fit2(X,Y,1,x) ;
+ if (X[0]==X[2]) {
+ return fit2(X,Y,1,x) ;
+ }
+ if (X[0]==X[1]) {
+ dvector_t X1(2); X1[0]=X[1]; X1[2]=X[2];
+ dvector_t Y1(2); Y1[0]=Y[1]; Y1[2]=Y[2];
+ return fit2(X1,Y1,1,x) ;
+ }
+ }
+ if (X[n]==X[n-1]) { // discard last
+ dvector_t X1(X.begin(),X.begin()+(n-1));
+ dvector_t Y1(Y.begin(),Y.begin()+(n-1));
+
+ return fit3(X1,Y1,n-1,x) ;
+ }
+ if (X[n]==X[n-2]) { // discard last
+ dvector_t X1(X.begin(),X.begin()+(n-1));
+ dvector_t Y1(Y.begin(),Y.begin()+(n-1));
+
+ return fit3(X1,Y1,n-1,x) ;
+ }
+ if (X[n-1]==X[n-2]) { // discard last but one
+ dvector_t X1(X.begin(),X.begin()+(n-1));
+ dvector_t Y1(Y.begin(),Y.begin()+(n-1));
+ X1[n-1]=X[n];
+ Y1[n-1]=Y[n];
+
+ return fit3(X1,Y1,n-1,x) ;
+ }
+
+ // todo: use Lagrange ?
+ // std::cout << X[n-2] << ',' << X[n-1] << ',' << X[n] << std::endl;
+ double d = (-X[n]+X[n-1])*(-X[n]+X[n-2])*(X[n-2]-X[n-1]) ;
+ double a1 = -X[n]*Y[n-2]+X[n-2]*Y[n]+X[n-1]*Y[n-2]-X[n-1]*Y[n]+X[n]*Y[n-1]-X[n-2]*Y[n-1];
+ double a2 = -X[n-2]*X[n-2]*Y[n]+X[n-2]*X[n-2]*Y[n-1]+X[n-1]*X[n-1]*Y[n]-Y[n-2]*X[n-1]*X[n-1]+Y[n-2]*X[n]*X[n]-Y[n-1]*X[n]*X[n];
+ double a3 = X[n-2]*X[n-2]*X[n-1]*Y[n]-X[n-2]*X[n-2]*X[n]*Y[n-1]-X[n-1]*X[n-1]*X[n-2]*Y[n]+Y[n-1]*X[n-2]*X[n]*X[n]+X[n-1]*X[n-1]*X[n]*Y[n-2]-Y[n-2]*X[n-1]*X[n]*X[n];
+
+ // std::cout <<" (("<<a1<<"*x+"<<a2<<")*x+"<<a3<<")/"<<d << std::endl;
+ return ((a1*x+a2)*x+a3)/d ;
+#else // __LINBOX_HAVE_LAPACK
+ int m = min(n,5);
+ dvector_t X1((size_t)m) ;
+ dvector_t Y1((size_t)m) ;
+ for (int i = 0 ; i < m ; ++i) X1[(size_t)i] = X[(size_t)(n-m+i)] ;
+ for (int i = 0 ; i < m ; ++i) Y1[(size_t)i] = Y[(size_t)(n-m+i)] ;
+ return fit_lapack3(X1,Y1,x);
+
+#endif // __LINBOX_HAVE_LAPACK
+ }
+
+} // LinBox
+
+
+//
+// TimeWatcher
+//
+
+namespace LinBox {
+ TimeWatcher::TimeWatcher (dvector_t & pts, dvector_t & vals) :
+ Points_(&pts)
+ ,Values_(&vals)
+ ,MaxRepet_(12)
+ ,MinRepet_(2)
+ ,MaxTime_(0.5)
+ ,AbortTime_(10)
+ ,aborted_(false)
+ {
+ linbox_check(vals.size() == pts.size());
+ }
+
+ TimeWatcher::TimeWatcher () :
+ Points_(NULL)
+ ,Values_(NULL)
+ ,MaxRepet_(12)
+ ,MinRepet_(2)
+ ,MaxTime_(0.5)
+ ,AbortTime_(10)
+ ,aborted_(false)
+ {
+ }
+
+
+ void TimeWatcher::init(dvector_t & pts, dvector_t & vals)
+ {
+ linbox_check(vals.size() == pts.size());
+ Points_ = &pts ;
+ Values_ = &vals ;
+ }
+
+
+ dvector_t & TimeWatcher::refX()
+ {
+ return *Points_ ;
+ }
+
+ dvector_t & TimeWatcher::refY()
+ {
+ return *Values_ ;
+ }
+
+ // we don't assume that t(0sec) = 0 unless nothing has been computed yet.
+ double TimeWatcher::predict(double x)
+ {
+ size_t Current_ = size();
+ if (Current_ == 0)
+ return 0 ;
+ if (Current_ ==1 )
+ return refX()[Current_-1] ; // unknown. could be known if we suppose t(0)=0
+ if (Current_ == 2 ) {
+ return fit2(refX(),refY(),1,x);
+ }
+ return fit3(refX(),refY(), (int) Current_-1,x);
+ }
+
+ bool TimeWatcher::keepon( size_t & repet, double tim, bool usePrediction )
+ {
+
+ if (aborted_)
+ return false ;
+
+ if (usePrediction) {
+ if (predict(tim) < AbortTime_)
+ return true ;
+ else{
+ aborted_ = true ;
+ return false;
+ }
+ }
+
+ if (repet<MinRepet_ || (tim < MaxTime_ && repet < MaxRepet_) ) {
+ ++repet ;
+ return true;
+ }
+ return false ;
+ }
+
+ size_t TimeWatcher::size() const
+ {
+ if (Points_ == NULL || Values_ == NULL) {
+ linbox_check(Values_ == NULL && Points_ == NULL);
+ return 0 ;
+ }
+ linbox_check(Points_->size() == Values_->size());
+ return (size_t)Points_->size();
+ }
+
+ void TimeWatcher::clear()
+ {
+ Points_ = NULL ;
+ Values_ = NULL ;
+ }
+
+} // LinBox
+
+//
+// DataSeries
+//
+
+namespace LinBox {
+
+ DataSeries:: DataSeries() :
+ PointLabels(0)
+ , Points(0)
+ , Times(0)
+ , Values(0)
+ , UID(0)
+ {}
+
+ DataSeries::~DataSeries() {}
+
+#if 0
+ void
+ DataSeries::resize(const size_t & n)
+ {
+ linbox_check(n == Values.size()+1);
+ PointLabels.resize(n);
+ Times.resize(n);
+ Points.resize(n);
+ Values.resize(n);
+ UID.resize(n);
+
+ return;
+ }
+#endif
+
+ size_t
+ DataSeries::size() const
+ {
+ linbox_check(PointLabels.size() == Points.size())
+ linbox_check(Times.size() == Points.size())
+ linbox_check(Times.size() == Values.size())
+ linbox_check(Times.size() == UID.size())
+
+ return (size_t)Values.size();
+ }
+
+ void DataSeries::push_back(const std::string & nam, const double & val, const double & x , const double &y )
+ {
+ linbox_check(PointLabels.size() == Values.size());
+
+ PointLabels.push_back(nam);
+
+ Values.push_back(val);
+
+ if ( std::isnan(x) )
+ Points.push_back((double)Points.size());
+ else
+ Points.push_back(x);
+
+ if ( std::isnan(y))
+ Times.push_back(val);
+ else
+ Times.push_back(y);
+
+ UID.push_back("point_" + randomAlNum(8));
+ return;
+ }
+
+} // LinBox
+
+//
+// PlotGraph
+//
+
+namespace LinBox {
+
+ //!@todo use getUsingSeries in latex/html/csv/xml
+
+
+ void PlotGraph::_randomName()
+ {
+ std::ostringstream unique_filename ;
+ unique_filename << _filename_ << '_' << getDateTime("_") << '_' << randomAlNum(4);
+
+ // std::cout << unique_filename.str() << std::endl;
+
+ _printname_ = unique_filename.str() ;
+
+ }
+
+ const std::string & PlotGraph::getFileName()
+ {
+ if (_printname_.empty())
+ _randomName();
+ return _printname_;
+ }
+
+ void PlotGraph::mergeTwoSeries( svector_t & merge_points
+ , dmatrix_t & merge_data
+ , const svector_t & pts
+ , const dvector_t & dat
+ , const size_t & idx) const
+ {
+ size_t data_size = (size_t)merge_points.size();
+ linbox_check(data_size == (size_t)merge_data[0].size());
+
+ merge_data[idx].resize(data_size,NAN);
+ typename svector_t::iterator it ;
+
+ for (size_t i = 0 ; i < pts.size() ; ++i) {
+
+ size_t k ;
+ bool ok = findKeyword(k, merge_points.begin(), merge_points.begin()+data_size,pts[i]);
+
+ if ( ok ){
+ merge_data[idx][k] = dat[i] ;
+ }
+ else {
+ for (size_t j = 0 ; j < idx ; ++j) {
+ merge_data[j].push_back(NAN);
+ }
+
+ merge_data[idx].push_back(dat[i]) ;
+ merge_points.push_back(pts[i]) ;
+ }
+ // std::cout << "..." << std::endl;
+ // std::cout << merge_points << std::endl;
+ // std::cout << merge_data << std::endl;
+ // std::cout << "..." << std::endl;
+ }
+
+ return;
+
+ }
+
+ void PlotGraph::mergeSeries()
+ {
+ _data_. selectFirstSeries();
+ _merge_points_ = _data_.getCurrentSeries( Point::Labels() ) ;
+ _merge_data_[0] = _data_.getCurrentSeries( Point::Values() ) ;
+
+ // std::cout << "merge points " << _merge_points_ << std::endl;
+ // std::cout << "merge data " << _merge_data_ << std::endl;
+
+ for (size_t i = 1 ; i < _data_.size() ; ++i) {
+ _data_. selectNextSeries() ;
+ // std::cout << "to be merged " << i << " : " << std::endl;
+ // std::cout << "new points " << _data_.getCurrentSeriesPointLabel() << std::endl;
+ // std::cout << "new data " << _data_.getCurrentSeriesValues() << std::endl;
+
+ mergeTwoSeries(_merge_points_,_merge_data_,
+ _data_. getCurrentSeries( Point::Labels() ), _data_. getCurrentSeries( Point::Values() ),i);
+
+ // std::cout << "result : " << std::endl;
+ // std::cout << "merge points " << _merge_points_ << std::endl;
+ // std::cout << "merge data " << _merge_data_ << std::endl;
+
+ }
+
+ return ;
+ }
+
+ void PlotGraph::print_csv()
+ {
+ char comma = ',';
+ char comment = '#';
+ size_t nb_points = (size_t)_merge_points_.size() ;
+ size_t nb_series = (size_t)_data_.size() ;
+
+ std::string unique_filename = getFileName();
+ std::string DataFileName = unique_filename + ".csv" ;
+ std::ofstream DF(DataFileName.c_str());
+
+ /* Data file to be plot */
+ DF.precision(2);
+ // metadata
+ DF << comment << fortifyString("title") << comma << fortifyString(_style_.getRawTitle()) << std::endl;
+ DF << comment << fortifyString("date") << fortifyString(getDateTime()) << std::endl;
+ smatrix_t uname = getMachineInformation();
+ for (size_t i = 0 ; i < uname[0].size() ; ++i)
+ DF << comment << fortifyString(uname[0][i]) << comma << fortifyString(uname[1][i]) << std::endl ;
+
+ // data
+ DF << fortifyString(_style_.getRawTitle(1)) << comma ;
+ for (size_t i = 0 ; i < nb_series ; ++i) {
+ DF << _data_.getSeriesLabel(i) ;
+ if (i != nb_series -1)
+ DF << comma ;
+ }
+ DF << std::endl;
+
+ for (size_t j = 0 ; j < nb_points ; ++j) {
+ DF << _merge_points_[j] << comma;
+ for (size_t i = 0 ; i < nb_series ; ++i) {
+ DF << _merge_data_[i][j] ;
+ if (i != nb_series -1)
+ DF << comma ;
+
+ }
+ DF << std::endl;
+ }
+
+ std::cout << "csv data in " << DataFileName << std::endl;
+
+ }
+
+ void PlotGraph::print_dat()
+ {
+ print_gnuplot(true);
+ }
+
+ void PlotGraph::print_xml()
+ {
+#ifdef __LINBOX_HAVE_TINYXML2
+ std::string unique_filename = getFileName();
+ unique_filename += ".xml" ;
+
+ _data_.save(unique_filename,_style_.getRawTitle(),_style_.getRawTitle(1),_style_.getRawTitle(2));
+
+ load(unique_filename);
+#else
+ std::cout << "tinyxml2 is not installed, could not print" << std::endl;
+ exit(-1);
+#endif
+ return ;
+ }
+
+ void PlotGraph::print_html()
+ {
+
+ std::string comment_in = "<!--";
+ std::string comment_out = "-->";
+ size_t nb_points = (size_t)_merge_points_.size() ;
+ size_t nb_series = (size_t)_data_.size() ;
+
+ std::string unique_filename = getFileName();
+ std::string DataFileName = unique_filename + ".html" ;
+ std::ofstream DF(DataFileName.c_str());
+
+ /* Data file to be plot */
+ DF.precision(2);
+ // metadata
+ DF << comment_in << ("date") << (getDateTime()) << std::endl;
+ smatrix_t uname = getMachineInformation();
+ for (size_t i = 0 ; i < uname[0].size() ; ++i)
+ DF << (uname[0][i]) << " : " << (uname[1][i]) << std::endl ;
+ DF << comment_out << std::endl ;
+
+ // data
+ DF << "<table border=\"1\">" << std::endl;
+ DF << "<caption> " << (_style_.getRawTitle()) << " (data in " << _style_.getRawTitle(2) << ')' << " </caption>" << std::endl;
+ DF << "<tr> " << std::endl;
+ DF << "<th> " << _style_.getRawTitle(1) << " </th>";
+ for (size_t i = 0 ; i < nb_series ; ++i) {
+ DF << "<th> " << unfortifyString(_data_.getSeriesLabel(i)) << " </th>";
+ }
+ DF << " </tr>" << std::endl;
+
+ for (size_t j = 0 ; j < nb_points ; ++j) {
+ DF << "<tr> " << std::endl;
+ DF << "<th> " << unfortifyString(_merge_points_[j]) << " </th>";
+ for (size_t i = 0 ; i < nb_series ; ++i) {
+ DF << "<td> " << _merge_data_[i][j] << " </td>";
+
+ }
+ DF << std::endl;
+ DF << "</tr>" << std::endl;
+ }
+
+ DF << "</table>" << std::endl;
+ std::cout << "html data in " << DataFileName << std::endl;
+
+
+ }
+
+ void PlotGraph::print_latex()
+ {
+ size_t nb_points = (size_t)_merge_points_.size();
+ size_t nb_series = _data_.size();
+
+ linbox_check(nb_points);
+ linbox_check(nb_series);
+ // srand(time(NULL));
+ // std::ostringstream unique_filename ;
+ std::string unique_filename = getFileName();
+ unique_filename += ".tex" ;
+ // std::cout << _filename_ << " plot in " << unique_filename << '.'<< std::endl;
+ std::ofstream FN(unique_filename.c_str());
+ //!@todo check FN opened.
+ // begin
+ FN << "%\\usepackage{slashbox}" << std::endl;
+ FN << "\\begin{table}" << std::endl;
+ FN << "\\centering" << std::endl;
+ // format
+ FN << "\\begin{tabular}{c||" ;
+ for (size_t j = nb_points ; j-- ; )
+ FN << 'c' ;
+ FN << "|}" << std::endl;
+ // top left case
+ std::string series = _style_.getRawTitle(2);
+ std::string points = _style_.getRawTitle(1);
+ if (!points.empty()) {
+ FN << "\\backslashbox{" << points << "}{" << series << "}" ;
+ }
+ else {
+ FN << series ;
+ }
+ // first line
+ for (size_t j = 0 ; j < nb_points ; ++j ) {
+ FN << " & " << _merge_points_[j] ;
+ }
+ // lines of data
+ FN << std::endl << "\\hline" << std::endl;
+ FN.precision(2);
+ for (size_t i = 0 ; i < nb_series ; ++i) {
+ FN << _data_.getSeriesLabel(i) ;
+ for (size_t j = 0 ; j < nb_points ; ++j )
+ FN << " & " << _merge_data_[i][j] ;
+ if (i+1 < nb_series )
+ FN << "\\\\" ;
+ FN << std::endl;
+ }
+ // end
+ FN << "\\end{tabular}" << std::endl;
+ FN << "\\caption{" << _style_.getRawTitle() << "}" << std::endl;
+ FN << "\\label{tab:<+" << "label+>}" << std::endl;
+ FN << "\\end{table}" << std::endl ;
+
+ FN.close();
+
+ std::cout << "latex table in " << unique_filename << '.' << std::endl;
+ return ;
+
+ }
+
+ void PlotGraph::print_gnuplot(bool only_data)
+ {
+#ifndef __LINBOX_HAVE_GNUPLOT
+ std::cout << "gnuplot is not available on your system. only the data will be printed" << std::endl;
+#endif
+ size_t nb_points = (size_t)_merge_points_.size() ;
+ size_t nb_series = (size_t)_data_.size() ;
+
+ std::string unique_filename = getFileName();
+ std::string DataFileName = unique_filename + ".dat" ;
+ std::ofstream DF(DataFileName.c_str());
+
+ /* Data file to be plot */
+ // DF.precision(_style_.getPrecision());
+ DF.precision(2);
+
+ char comment = '#' ;
+ char comma = ' ';
+ // metadata
+ DF << comment << ("title") << comma << (_style_.getRawTitle()) << std::endl;
+ DF << comment << ("date") << (getDateTime()) << std::endl;
+ smatrix_t uname = getMachineInformation();
+ for (size_t i = 0 ; i < uname[0].size() ; ++i)
+ DF << comment << (uname[0][i]) << comma << (uname[1][i]) << std::endl ;
+
+
+ DF << "legend " ;
+ for (size_t i = 0 ; i < nb_series ; ++i) {
+ DF << _data_.getSeriesLabel(i) << ' ' ;
+ }
+ DF << std::endl;
+
+ for (size_t j = 0 ; j < nb_points ; ++j) {
+ DF << _merge_points_[j] ;
+ for (size_t i = 0 ; i < nb_series ; ++i) {
+ DF << " " << _merge_data_[i][j] ;
+ }
+ DF << std::endl;
+ }
+
+ if (only_data)
+ std::cout << "data in " << DataFileName << std::endl;
+
+#ifdef __LINBOX_HAVE_GNUPLOT
+ if (!only_data) {
+ std::string PlotFileName = unique_filename + ".gp" ;
+ std::ofstream PF(PlotFileName.c_str());
+
+ /* Ploting script */
+ PF << "#" << _filename_ << std::endl;
+ PF << _style_.getTerm() << std::endl;
+ PF << _style_.getOutput(unique_filename) << std::endl;
+ PF << _style_.getTitle() << std::endl;
+ PF << _style_.getKeyPos() << std::endl;
+ PF << _style_.getXtics() << std::endl;
+ PF << _style_.getPlotType() << std::endl;
+
+ PF << getPlotCommand(DataFileName) << std::endl;
+
+ PF.close();
+
+ std::string command( "gnuplot " ) ;
+ command += PlotFileName ;
+ int err = system( command.c_str() ) ;
+ if (err) {
+ std::cout << "errors have occured. Look at gnuplot output." << std::endl;
+ }
+ else {
+ std::cout << "Output generated as " << unique_filename + _style_.getExt() << std::endl;
+ }
+ }
+#endif
+
+
+ return;
+ }
+
+
+ void PlotGraph::setData( PlotData & data )
+ {
+ _data_ = data ;
+ }
+
+ PlotData & PlotGraph::refData( PlotData & data)
+ {
+ return data = _data_ ;
+ }
+
+ void PlotGraph::setStyle( PlotStyle & style )
+ {
+ _style_ = style ;
+ }
+
+ PlotStyle & PlotGraph::refStyle( PlotStyle & style)
+ {
+ return style = _style_ ;
+ }
+
+
+ // not implemented yet
+ void PlotGraph::sortSeries() {}
+
+ // not implemented yet
+ void PlotGraph::unique() {}
+
+ PlotGraph::PlotGraph( PlotData & data, PlotStyle & style ) :
+ _data_(data)
+ ,_style_(style)
+ ,_filename_("")
+ ,_printname_("")
+ ,_merge_data_(data.size())
+ ,_merge_points_(data.getSeries(0).size())
+ {
+ srand((unsigned)time(NULL));
+ mergeSeries();
+ }
+
+ void PlotGraph::setOutFilename( const std::string & filename )
+ {
+ int err = system( "test -d data || ( rm -rf data && mkdir data )" ) ;
+ if (err) {
+ throw LinBoxError("could not create directory data");
+ }
+
+ if ( filename.empty() ) {
+ _filename_ = "./data/plotdata" ;
+ std::cerr << "you should provide a filename. Using " << _filename_ << " as default ."<<std::endl;
+ }
+ else {
+ _filename_ = "./data/" + filename;
+ }
+
+ }
+
+ const std::string & PlotGraph::getUsingSeries() // const
+ {
+ // mutable _style_ ?
+ linbox_check(_merge_points_.size());
+ if (_style_.getUsingSeries().empty()) {
+ _style_.setUsingSeries(std::pair<size_t,size_t>((size_t)2,(size_t)_merge_data_.size()+1));
+ }
+ return _style_.getUsingSeries();
+ }
+
+ std::string PlotGraph::getPlotCommand(const std::string & File) //const
+ {
+ std::string PC = "#plot\nplot \'" + File + "\' ";
+ PC += getUsingSeries() ;
+ return PC ;
+ }
+
+ void PlotGraph::print( Tag::Printer pt ) {
+ switch (pt) {
+ case (Tag::Printer::xml):
+ {
+ print_xml();
+ break;
+ }
+ case (Tag::Printer::csv) :
+ {
+ print_csv();
+ break;
+ }
+ case (Tag::Printer::dat) :
+ {
+ print_dat();
+ break;
+ }
+ case (Tag::Printer::gnuplot) :
+ {
+ print_gnuplot();
+ break;
+ }
+ case (Tag::Printer::tex) :
+ {
+ print_latex();
+ break;
+ }
+ case (Tag::Printer::html) :
+ {
+ print_html();
+ break;
+ }
+ default :
+ {
+ throw LinBoxError("printer unknown");
+ }
+
+ }
+
+ return ;
+ }
+
+ void PlotGraph::save()
+ {
+ return print_xml();
+ }
+
+ void PlotGraph::load(const std::string & filename)
+ {
+ return _data_.load(filename);
+ }
+
+} // LinBox
+
+#endif // __LINBOX_benchmarks_benchmark_C
+
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/benchmarks/benchmark.doxy b/benchmarks/benchmark.doxy
index d437ef2..ee48fc6 100644
--- a/benchmarks/benchmark.doxy
+++ b/benchmarks/benchmark.doxy
@@ -26,7 +26,7 @@
* The benchmarks are meant for :
* - the \e user to guide her through the various choices of
* algorithms/implementation provided in her particular case.
- * - the \e developper to test her new algorithms against the others or check
+ * - the \e developer to test her new algorithms against the others or check
* that the newest shiny subroutine she just wrote didn't deteriorate too much
* the performance of LinBox :) (regression testing purpose).
* .
diff --git a/benchmarks/benchmark.h b/benchmarks/benchmark.h
index e30843b..206ad8e 100644
--- a/benchmarks/benchmark.h
+++ b/benchmarks/benchmark.h
@@ -1,12 +1,12 @@
/* Copyright (C) 2011 LinBox
- * Written by BB <brice.boyer at imag.fr>
+ * Written by Brice Boyer (briceboyer) <boyer.brice at gmail.com>
*
*
*
* ========LICENCE========
* This file is part of the library LinBox.
*
- * LinBox is free software: you can redistribute it and/or modify
+ * LinBox is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
@@ -39,9 +39,11 @@
*
*/
-#ifndef __LINBOX_benchmark_H
-#define __LINBOX_benchmark_H
+#ifndef __LINBOX_benchmarks_benchmark_H
+#define __LINBOX_benchmarks_benchmark_H
+// here classes TimeWatcher, PlotStyle, PlotData are declared
+#include "linbox/linbox-config.h"
#include <stdlib.h>
#include "linbox/integer.h"
#include "linbox/util/debug.h"
@@ -49,31 +51,167 @@
#include "linbox/util/timer.h"
#include <string>
#include <fstream>
+#include <iomanip> // setprecision
-typedef uint32_t index_t ;
+#include <sys/utsname.h>
+#include <ctime>
+#ifdef __LINBOX_HAVE_TINYXML2
+#include <tinyxml2.h>
+#endif
+
+#include "benchmark-utils.h"
+#include "benchmark-metadata.h"
+
+
+//
+// TimeWatcher
+//
+
+namespace LinBox {
+ /*! Helper.
+ * This helper has several functions :
+ * - Records the timings
+ * - predict the execution time for the next experiment
+ * - helps producing enough experiments (but not too much and not too time consuming) for producing a valid measure.
+ * .
+ * @warning if the timings are too short, this may not be accurate.
+ *
+ * See member function help for more information.
+ */
+ class TimeWatcher {
+ private :
+ dvector_t * Points_; //!< Points data. If <code>Points_[i] = x</code>, then <code>Values_[i]=f(x)<code>.
+ dvector_t * Values_; //!< Time data. See \p Points_ .
+
+ size_t MaxRepet_; //!< Maximum number of repetitions of timings
+ size_t MinRepet_; //!< Minimum number of repetitions of timings
+ double MaxTime_; //!< Maximum time to be spent on repetitions (after MinRepet_ iters have been done)
+ double AbortTime_; //!< Time to abort a series of computation.
+ bool aborted_; //!< abort any subsequent computation
+
+
+ public:
+ /*! constructor.
+ * Inits the time watcher with a pair of points/values
+ * @param pts vector of points
+ * @param vals vector of times
+ */
+ TimeWatcher (dvector_t & pts, dvector_t & vals) ;
+
+ //! Null Constructor. The pointers are intialised to NULL
+ TimeWatcher () ;
+
+ void init(dvector_t & pts, dvector_t & vals);
+
+ //! returns the vector of abscissa (points)
+ dvector_t & refX() ;
+
+ //! returns the vector of ordiantes (values)
+ dvector_t & refY() ;
+
+ /** Prediction for the next experiment time.
+ * It is assumed that \c predict(0)=0. If Curent_<3, a linear,
+ * then quadratic fit is done. Other wise, a cubic fit is
+ * performed.
+ * @param x the next evaluation point.
+ * @return f(x) where f tries to fit the points : \f$ f(\mathtt{Data\_}[0][0..\mathtt{Current\_}-1]) \approx refY()[0..\mathtt{Current\_}-1]\f$
+ */
+ double predict(double x) ;
+
+ /*! @brief Watches a timer and a number and repet and signals if over.
+ *
+ * We want at least 2 repetions but not more than maxtime spent on timing.
+ *
+ * @param repet number of previous repetitions. Should be 0 on the first time \c keepon is called.
+ * @param tim timer to watch
+ * @param maxtime maximum time (in seconds) until \c watchon tells stop.
+ * @return \c true if we conditions are not met to stop, \c false otherwise.
+ * @pre \c tim should have been started previously !
+ *
+ */
+ bool keepon(size_t & repet, double tim, bool usePrediction = false) ;
+
+ //! size
+ size_t size() const;
+
+ //! clear the pointers (not the settings)
+ void clear();
+
+ } ; // TimeWatcher
+} // LinBox
+
+//
+// DataSeries
+//
+
+namespace LinBox {
+ /** @brief this structure holds a bunch of timings.
+ * It collects the points, the time spent at each point and a measure
+ * (for instance mflops).
+ * @todo Times and Values could be dmatrix_t (and mergeable)
+ */
+ struct DataSeries {
+ svector_t PointLabels ; //!< points abscisa, values for the x axis. Used in legend for the X axis.
+ dvector_t Points ; //!< points abscisa, values for the x axis. Used in TimeWatcher (for instance, if PointLabels are the names of sparse matrices, Points would be their number of non zeros, or 1,2,3,... or whatever relevant for predicting time)
+ dvector_t Times ; //!< actual computation times.
+ dvector_t Values ; //!< actual data to be plotted (for instance mflops)
+ svector_t UID ; //!< unique id of a point.
+
+ //! Constructor
+ DataSeries() ;
+
+ ~DataSeries() ;
+
+#if 0
+ /** @brief resize
+ * @param n new size
+ * @pre the size before was n-1
+ */
+ void resize(const size_t & n);
+#endif
+
+ //! Size of the series of measurements.
+ size_t size() const;
+
+ //! add some new data.
+ void push_back(const std::string & nam, const double & val, const double & x = NAN, const double &y = NAN);
+
+ // use it but change time
+ // void useMetadata(const MetaData & m) ;
+ }; // DataSeries
+
+} // LinBox
+
+/* ********************** */
+/* Plot structures */
+/* ********************** */
-namespace LinBox
-{
+//
+// PlotStyle
+//
+namespace LinBox {
- /*! @brief Represents a table of values to plot.
+ /*! @brief Represents a table of values to plot (2D).
* list of values are reprensented by vectors. the table is a vector
* of these vectors.
*
* @warning NaN, inf are used as missing data. More genenally
* we could store data in strings.
- * @todo Allow for 'speed up against col X' style
+ * @todo Allow for 'speed up against col X' style
+ * @todo make depend on PlotData
*/
+ //!@todo setUsingSeries(const svector_t &)
class PlotStyle {
public:
//! What format the plot should be in?
- struct Term
- {
+ struct Term {
//! Term type
enum Type {
png = 100, //!< png. Portable Network Graphics file.
pdf = 101, //!< pdf. Portable Document Format actually, this is eps converted to pdf.
eps = 102, //!< eps. Encapsulated PostScript. Cool for inclusion in LaTex files. This is the default.
+ epstex = 107, //!< epslatex. Encapsulated PostScript. Cool for inclusion in LaTex files with latex formulas.
svg = 103, //!< sgv. Scalable Vector Graphics.
tex = 104, //!< tex. Simple tabular.
html = 105, //!< html. HTML table.
@@ -83,18 +221,16 @@ namespace LinBox
// enum NoType { other = 0 } ;
//! What style of graphic : histogram ? graph ?
- struct Plot
- {
+ struct Plot {
//! Plot type
enum Type {
histo = 200, //! histogram plot. This is the default. x ticks are evenly spaced, whatever there value and are labelled with their value.
- graph = 201, //! standard plot. Plots y_i=f(x) with x in the first colum and y_i in ith column. x-ticks are well spaced.
+ graph = 201, //! standard plot. Plots y_i=f(x) with x in the first colum and y_i in ith column. x-ticks are well spaced. This will not work if the X are not numbers (but strings).
other = 202 //! other (ie user supplied).
} ;
};
- struct Line
- {
+ struct Line {
enum Type {
lines = 300, //! lines.
histogram = 301, //! histogram (boxes).
@@ -104,8 +240,7 @@ namespace LinBox
} ;
};
- struct Options
- {
+ struct Options {
enum Type {
oblique = 400,
other = 401
@@ -115,149 +250,65 @@ namespace LinBox
/*! @brief Constructor.
* By default, creates an histogram representing the data in an eps plot.
*/
- PlotStyle() :
- _term_(Term::eps),_plot_type_(Plot::histo),_line_type_(Line::histogram)
- {
-
- }
+ PlotStyle() ;
/*! @brief sets the titles in the graph.
* @param titre Title of the graph
* @param titre_y Title of the y-axis (series)
* @param titre_x Title of the x-axis (data points)
*/
- void setTitle ( std::string titre
- , std::string titre_y
- , std::string titre_x)
- {
- _title_ = titre ;
- _title_x_ = titre_x ;
- _title_y_ = titre_y ;
- }
+ void setTitle ( const std::string & titre
+ , const std::string & titre_y
+ , const std::string & titre_x);
/*! @brief Gets the title of the graph.
* @return a gnuplot command to set the title of the graph.
*/
- std::string getTitle()
- {
- std::string title = "#title\nset title \"" + _title_ + '\"';
- if (!_title_x_.empty())
- title +="\nset xlabel \"" + _title_x_ +'\"' ;
- if (!_title_y_.empty())
- title +="\nset ylabel \"" + _title_y_ +'\"' ;
- return title ;
- }
+ std::string getTitle() const ;
/*! @brief Gets the title of points abscissa.
* @return a gnuplot command to set the title of the abscissa.
*/
- std::string getTitleX()
- {
- return "\nset xlabel \"" + _title_x_ + '\"' ;
- }
+ std::string getTitleX() const ;
/*! @brief Gets the title of the series.
* @return a gnuplot command to set the title of the ordinate (series).
*/
- std::string getTitleY()
- {
- return "\nset ylabel \"" + _title_y_ + '\"' ;
- }
+ std::string getTitleY() const ;
/*! @brief get the title string.
* @param index can be (0,1,2)
*/
- std::string getRawTitle(int index=0)
- {
- switch (index) {
- case 0 :
- return _title_ ;
- case 1 :
- return _title_x_ ;
- case 2 :
- return _title_y_ ;
- default :
- return "bad index" ;
- }
- }
+ std::string getRawTitle(int index=0) const ;
/*! @brief Sets the output format.
* @sa TermType
* @param term type
*/
- void setTerm( enum Term::Type term)
- {
- _term_ = term ;
- }
+ void setTerm( enum Term::Type term) ;
-#if 0
- /*! Set additionnal term features
- */
- void setTermOption(std::string & opts)
- {
- _termopts_ = opts;
- }
-#endif
/*! @brief Gets the output format.
* @return string for setting the expected output format in gnuplot.
+ * @warning noenhanced allows underscores while enhanced does subscripts.
+ * if we add a (no) enhanced option, we'll have to add a safeFormat(std::string) that replaces \c _ with <code>\_</code> .
+ * This is tricky and can be done at "post production" stage :-)
*/
- std::string getTerm()
- {
- std::string term = "#term\nset term " ;
- switch(_term_) {
- case (Term::png) :
- term += "png enhanced" ;
- break;
- case (Term::pdf) :
- std::cerr << "warning, pdf not really working for now" << std::endl;
- term += "postscript eps enhanced color" ;
- break;
- case (Term::eps) :
- term += "postscript eps enhanced color" ;
- break;
- case (Term::svg) :
- term += "svg" ;
- break;
- case (Term::other) :
- default :
- std::cerr << " *** error ***" << std::endl << "No supported term set" << std::endl;
- term += "unknown" ;
- }
- return term ;
- }
+ std::string getTerm() const ;
/*! @brief Gets the graph output extension.
* By default, this is ".eps".
* @return a string for this extension, including the sepatating dot.
*
*/
- std::string getExt()
- {
- switch(_term_) {
- case (Term::png) :
- return ".png" ;
- case (Term::pdf) :
-#ifndef __LINBOX_HAVE_GHOSTSCRIPT
- std::cerr << "warning, pdf not available. falling back to eps" << std::endl;
-#endif
- return ".pdf" ;
- case (Term::eps) :
- return ".eps" ;
- case (Term::svg) :
- return ".svg" ;
- default :
- std::cerr << "unknown extension set" << std::endl;
- return ".xxx" ;
- }
- }
+ std::string getExt() const ;
#if 0
/*! @brief gets the style of the graph.
* This is very user-tweakable !!
* @return the style for gnuplot.
*/
- std::string getStyle()
+ const std::string & getStyle()
{
return "#style\n"+_styleopts_ ;
}
@@ -266,7 +317,7 @@ namespace LinBox
* This is very user-tweakable !!
* @param style the style for gnuplot as a gnuplot command.
*/
- void setStyle(std::string style)
+ void setStyle(const std::string & style)
{
_styleopts_ = style ;
}
@@ -274,87 +325,58 @@ namespace LinBox
/*! @brief sets the legend position.
* @param keypos the arguments to key (where the legend should be put)
- * can be : inside, outside,...
+ * can be :
+ * <code>
+ * set key {on|off} {default}
+ * {{inside | outside} | {lmargin | rmargin | tmargin | bmargin} | {at <position>}}
+ * {left | right | center} {top | bottom | center}
+ * {vertical | horizontal} {Left | Right}
+ * {{no}reverse} {{no}invert}
+ * {samplen <sample_length>} {spacing <vertical_spacing>}
+ * {width <width_increment>}
+ * {height <height_increment>}
+ * {{no}autotitle {columnheader}}
+ * {title "<text>"} {{no}enhanced}
+ * {{no}box { {linestyle | ls <line_style>} | {linetype | lt <line_type>} {linewidth | lw <line_width>}}}
+ * </code>
*/
- void setKeyPos(std::string keypos)
- {
- _legend_pos_ = keypos ;
- }
+ void setKeyPos(const std::string & keypos) ;
/*! @brief Gets the legend position.
* by default, it is "under".
*/
- std::string getKeyPos()
- {
- std::string lgd ="#legend\nset key " ;
- if (!_legend_pos_.empty())
- lgd += _legend_pos_ ;
- else
- lgd += " under" ;
- return lgd;
- }
+ std::string getKeyPos() const ;
/*! @brief sets the position of the labels on the X absciss.
* @param opt
* @param more more stuff
*/
- void setXtics ( enum Options::Type opt, std::string more="")
- {
- _xtics_ = "#xtics\nset xtics ";
- if (opt == Options::oblique)
- _xtics_ += "nomirror rotate by -45 scale 0 ";
- else {
- linbox_check(opt == Options::other);
- _xtics_ += more ;
- }
- }
+ void setXtics ( enum Options::Type opt, const std::string & more="") ;
/*! @brief Gets the legend position.
* by default, it is 45° inclined (use in on long tics legends).
*/
- std::string getXtics()
- {
- return _xtics_ ;
- }
+ const std::string & getXtics() const ;
/*! @brief Gets the name of the output graph.
* @param basnam the raw name for the output.
* @return basnam+extenstion.
*/
- std::string getOutput(std::string basnam)
- {
- std::string setout = "#output\nset output \'" ;
-#ifdef __LINBOX_HAVE_GHOSTSCRIPT
- if (_term_ == Term::pdf)
- setout += "| ps2pdf - " ;
- setout += basnam + getExt() + '\'' ;
-#else
- setout += basnam + ".eps\'" ;
-#endif
-
- return setout ;
- }
+ std::string getOutput(const std::string & basnam) const ;
/*! @brief Sets the type of plot.
* @param type the type.
* @sa PlotType
*
*/
- void setPlotType(enum Plot::Type type)
- {
- _plot_type_ = type ;
- // _plot_extra_ = moreargs ;
- }
+ void setPlotType(enum Plot::Type type) ;
/*! @brief Sets the way dots are linked.
* @sa LineType
* @param type type
*/
- void setLineType( enum Line::Type type)
- {
- _line_type_ = type ;
- }
+ void setLineType( enum Line::Type type) ;
/*! @brief Gets the type of plot.
* default is histogram, or if graph is supplied, then the default is linespoints.
@@ -363,162 +385,47 @@ namespace LinBox
* @sa PlotType
*
*/
- std::string getPlotType()
- {
- _styleopts_ += "\nset datafile missing \"inf\"" ;
- std::string mystyle = "#style\nset style data " ;
- if (_line_type_ != Line::other) {
- switch (_line_type_) {
- case (Line::lines) :
- mystyle += "lines" ;
- break;
- case (Line::histogram) :
- mystyle += "histogram" ;
- break;
- case (Line::points) :
- mystyle += "points" ;
- break;
- case (Line::linespoints) :
- mystyle += "linespoints" ;
- break;
- default :
- std::cout << __func__ << " : you should have set the LineType when ploting PlotType::graph !" << std::endl;
- mystyle += "other" ;
- }
- }
- else { // userd defined datastyle
- return _styleopts_ ;
- }
- // some more style args :
- mystyle += "\n" + _styleopts_ + "\n";
- return mystyle ;
- }
+ std::string getPlotType(const std::string & extraargs ="") ;
/*! @brief adds some style line to the graph.
* This is very user-tweakable !!
* @param style a style line for gnuplot as a gnuplot command.
*/
- void addPlotType(std::string style)
- {
- _styleopts_ += "\n" + style ;
- }
+ void addPlotType(const std::string & style) ;
/*! @brief tells which columns to use.
* @param col a column to use.
* @param moreargs more stuff
*/
- void setUsingSeries(index_t col, std::string moreargs= "")
- {
- linbox_check(col>1);
- std::ostringstream usingcols ;
- if (_plot_type_ == Plot::histo) {
- usingcols << " using " << col << ":xtic(1) title columnheader(" << col << ") " << moreargs << " ";
- }
- else {
- linbox_check(_plot_type_ == Plot::graph);
- usingcols << " using 1:" << col << " title columnheader(" << col << ") " << moreargs << " ";
- }
- _usingcols_ = usingcols.str();
- }
+ void setUsingSeries(size_t col, const std::string & moreargs= "") ;
/*! @brief adds a column to use
* @param col a column to use.
* @param moreargs more stuff
* @pre \p _usingcols_ is not empty, ie \c setUsingSeries has already been called.
*/
- void addUsingSeries(index_t col, std::string moreargs= "")
- {
- linbox_check(col>2);
- linbox_check(!_usingcols_.empty());
- std::ostringstream usingcols ;
- usingcols << ", \'\' using " ;
- if (_plot_type_ == Plot::graph)
- usingcols << "1:" ;
- usingcols << col << " ti col " << moreargs << " ";
- _usingcols_ += usingcols.str();
- }
+ void addUsingSeries(size_t col, const std::string & moreargs= "") ;
/*! @brief tells which columns to use.
* @param cols a list of column to use.
* @param moreargs more stuff
*/
- void setUsingSeries(std::list<index_t> cols, std::string moreargs= "")
- {
- linbox_check(!cols.empty());
- std::list<index_t>::iterator it = cols.begin();
- // no way to check *it< coldim...
- std::ostringstream usingcols ;
- if (_plot_type_ == Plot::histo) {
- usingcols << " using " << *it << ":xtic(1) title columnheader(" << *it << ") " << moreargs << " " ;
- ++it ;
- for (;it != cols.end();++it) {
- usingcols << ", \'\' using " << *it << " ti col " << moreargs << " ";
- }
- }
- else {
- linbox_check(_plot_type_ == Plot::graph);
- usingcols << " using 1:" << *it << " title columnheader(" << *it << ") " << moreargs << " ";
- ++it ;
- for (;it != cols.end();++it) {
- usingcols << ", \'\' using 1:" << *it << " ti col " << moreargs << " ";
- }
- }
-
- _usingcols_ = usingcols.str();
- return;
- }
+ void setUsingSeries(std::list<size_t> cols, const std::string & moreargs= "") ;
/*! @brief adds a set of columns to use.
* @param cols a list of column to use.
* @param moreargs more stuff
* @pre \p _usingcols_ is not empty, ie \c setUsingSeries has already been called.
*/
- void addUsingSeries(std::list<index_t> cols, std::string moreargs= "")
- {
- linbox_check(!cols.empty());
- linbox_check(!_usingcols_.empty());
- std::list<index_t>::iterator it = cols.begin();
- std::ostringstream usingcols ;
- if (_plot_type_ == Plot::histo) {
- for (;it != cols.end();++it) {
- usingcols << ", \'\' using " << *it << " ti col " << moreargs << " ";
-
- }
- }
- else {
- linbox_check(_plot_type_ == Plot::graph);
- for (;it != cols.end();++it) {
- usingcols << ", \'\' using 1:" << *it << " ti col " << moreargs << " ";
-
- }
- }
- _usingcols_ += usingcols.str();
- return;
- }
+ void addUsingSeries(std::list<size_t> cols, const std::string & moreargs= "") ;
/*! @brief tells which columns to use.
- * @param cols all colums between \c cols.first and \c cols.second
+ * @param cols all colums between \c cols.first and \c cols.second (included)
* will be used.
* @param moreargs more stuff
*
*/
- void setUsingSeries(std::pair<index_t,index_t> cols, std::string moreargs= "")
- {
- std::ostringstream usingcols ;
- if (_plot_type_ == Plot::histo) {
- usingcols << " using " << cols.first << ":xtic(1) title columnheader(" << cols.first << ") " << moreargs << " ";
- usingcols << ", for [i=" << cols.first+1 << ":" << cols.second << "] \'\' using i title columnheader(i) " << moreargs << " ";
- }
- else {
- linbox_check(_plot_type_ == Plot::graph);
- usingcols << " using 1:" << cols.first << " title columnheader(" << cols.first << ") " << moreargs << " ";
- usingcols << ", for [i=" << cols.first+1 << ":" << cols.second << "] \'\' using 1:i title columnheader(i) " << moreargs << " ";
- }
-
- _usingcols_ = usingcols.str();
- return;
-
- }
+ void setUsingSeries(std::pair<size_t,size_t> cols, const std::string & moreargs= "") ;
/*! @brief adds contiguous columns to use.
* @param cols all colums between \c cols.first and \c
@@ -528,33 +435,9 @@ namespace LinBox
* already been called.
*
*/
- void addUsingSeries(std::pair<index_t,index_t> cols, std::string moreargs= "")
- {
- linbox_check(!_usingcols_.empty());
- std::ostringstream usingcols ;
- if (_plot_type_ == Plot::histo) {
- usingcols << ", for i=[" << cols.first << ":" << cols.second << "] \'\' using i title columnheader(i) " << moreargs << " ";
- }
- else {
- usingcols << ", for i=[" << cols.first << ":" << cols.second << "] \'\' using 1:i title columnheader(i) " << moreargs << " ";
- linbox_check(_plot_type_ == Plot::graph);
- }
-
- _usingcols_ += usingcols.str();
+ void addUsingSeries(std::pair<size_t,size_t> cols, const std::string & moreargs= "") ;
- }
-
- /*! @brief Gets the plot command line.
- * @param File the name of/path to the data file (with extension)
- * @return a gnuplot "plot" command stream.
- */
- std::string getPlotCommand(std::string File)
- {
- std::string PC = "#plot\nplot \'" + File + "\' ";
- PC += _usingcols_ ;
- return PC ;
- // "plot './data/fgemm_square_2ex03aS2.dat' using 1:2 title columnheader(2), for [i=3:5] '' using 1:i title columnheader(i)"
- }
+ const std::string & getUsingSeries() const ;
private :
// int _precision_ ; //!< precision of the output. by default 2.
@@ -579,232 +462,466 @@ namespace LinBox
std::string _usingcols_ ; //!< columns to be used (gp command)
- } ;
+ } ; // PlotStyle
+
+} // LinBox
+
+//
+// PlotData
+//
+
+namespace LinBox {
+
+ struct Point {
+ //! x
+ struct Labels {
+ typedef std::string type;
+ };
+
+ //! y
+ struct Values {
+ typedef double type;
+ } ;
+
+ //! numerical value for x
+ struct Points {
+ typedef double type;
+ };
+
+ //! y time
+ struct Times {
+ typedef double type;
+ };
+ } ;
/*! @brief The raw data to plot.
- * Represents the series of points and the labels for the points (X)
- * axis and the series (Y) axis. The internal representation is a
+ * Represents the labels for the points (X axis) and the values for
+ * each series of measures (Y axis).
+ *
+ * Members that set/get are named as follows :
+ * - getX(nom,j) return the j'th element of series named nom
+ * - getX(i,j) return the j'th element of series number i
+ * - getCurrentSeriesX(j) return the j'th element of current series
+ * - getCurrentEntryX() return the current element of current series (ie the last one)
+ * - .
+ *
+ * Members are also named as follows :
+ * - getXXX is a const member
+ * - selectXXX is non const and may create/update stuff
+ * - refXXX returns a reference
+ * - setXXX sets something
+ *
+ * @internal The internal representation is a
* vector of vector, each series of point being a vector of double.
- * @tparam NAM the X axis is parametered by NAM (string, int, double...)
- * @todo write members that permute, add, scale,... data.
+ *
+ * @tparam Xkind the X axis is parametrised by \p Xkind (string, int, double...)
+ * The Y axis is always represented by double.
+ * @todo put the legend (title, x, y) in there
*/
- template<class NAM>
class PlotData {
private :
- std::vector< std::vector< double > > _tableau_ ; //!< data. \c _tableau_[i][j] is the \e jth value of serie \e i.
- index_t _nb_points_ ; //!< number of points in each series. (size of \c _tableau_[0])
- index_t _nb_series_ ; //!< number of series. (size of \c _tableau_)
- std::vector< std::string > _serie_name_; //!< name for each serie of points
- std::vector< NAM > _absci_name_; //!< values of the x axis.
+ std::vector<DataSeries > _tableau_ ; //!< data. \c _tableau_[i] represents a series of measurements. A data series is augmented only via the \c push_back method. A series may be accessed by its name, its number or it is the current working series.
+ svector_t _series_label_ ; //!< label for each series of measures. Used in the legend of the plots/tables of points.
+ mutable size_t _curr_series_ ; //!< index of the current series of measurements.
+ mutable TimeWatcher _time_watch_ ; //!< time predictor, helper. See \c TimeWatcher.
+ MetaData _plot_data_ ; //!< information abouth the benchmark
+ MetaDataSeries _meta_data_ ; //!< information about each point
+ private:
+
+#ifdef __LINBOX_HAVE_TINYXML2
+ //! @internal data part of the XML output
+ tinyxml2::XMLElement * saveData(tinyxml2::XMLDocument & doc) ;
+#endif
+
+ /** Finds the index of a series by its name.
+ * @param nom name of the series
+ * @return its index
+ */
+ size_t getIndex(const std::string & nom) const ;
+
+ /** Finds the index of a series by its name.
+ * @param nom name of the series
+ * @return its index
+ */
+ size_t selectIndex(const std::string & nom) ;
+
public :
+
+ /*! Returns the ith series of measurements.
+ * @param i ith series to be returned
+ */
+ const DataSeries & getSeries(const size_t &i) const ;
+
+ /*! Returns the ith series of measurements.
+ * @param i ith series to be returned
+ */
+ const DataSeries & selectSeries(const size_t &i) ;
+
+ /*! Returns the series of measurements after its name.
+ * @param nom name of series to be returned
+ */
+ const DataSeries & selectSeries(const std::string &name) ;
+
+ /*! Returns the current series of measurements.
+ */
+ const DataSeries & getCurrentSeries() const;
+
+ /*! Returns the ith series of measurements.
+ * @param i ith series to be returned
+ */
+ DataSeries & refSeries(const size_t &i) ;
+
+ /*! Returns the ith series of measurements.
+ * @param i ith series to be returned
+ */
+ DataSeries & refSeries(const std::string & nom) ;
+
+ /*! Returns the current series of measurements.
+ */
+ DataSeries & refCurrentSeries() ;
+
/*! Inits a plot with series of data.
- * @param nb_pts number of points in each serie.
+ * @param nb_pts number of points in each series.
* @param nb_srs number of series of points. Default is 1.
*/
- PlotData(index_t nb_pts, index_t nb_srs=1) :
- _tableau_(nb_srs),_nb_points_(nb_pts),_nb_series_(nb_srs),_serie_name_(nb_srs),_absci_name_(nb_pts)
+ PlotData() ;
+ /*! destructor.
+ */
+ ~PlotData() ;
+
+ /*! copy constructor.
+ * @param PD a PlotData to copy.
+ */
+ PlotData(const PlotData & PD);
+
+ /** @brief initialize to empty
+ */
+ void clear() ;
+
+ /*! merges another plot data to the current one.
+ * (just adds to the end, does not merge series by name yet)
+ */
+ void merge(const PlotData &PD) ;
+
+ /*! @brief get the number of series.
+ * @return number of series.
+ */
+ size_t size() const ;
+
+ /** @brief gets the current series number.
+ */
+ size_t getCurrentSeriesNumber() const ;
+
+ /*! @brief Sets the name of a series.
+ * @param i index of the series
+ * @param nom name of the series
+ */
+ void setSeriesName(const size_t & i, const std::string & nom) ;
+
+ // ref Series
+
+ template<class Pt>
+ std::vector<typename Pt::type> & refSeries(const size_t & i, Pt kind) ;
+
+ template<class Pt>
+ std::vector<typename Pt::type> & refSeries(const std::string & name, Pt kind)
{
- linbox_check(nb_srs);
- linbox_check(nb_pts);
- for (index_t i = 0 ; i < nb_srs ; ++i)
- _tableau_[i].resize(nb_pts);
+ return refSeries(getIndex(name ), kind );
}
- //! destructor.
- ~PlotData() {} ;
+ // get Series
+
+ template<class Pt>
+ const std::vector<typename Pt::type> & getSeries(const size_t & i, Pt kind) const ;
- //! copy constructor.
- //! @param PD a PlotData to copy.
- PlotData(const PlotData<NAM> & PD):
- _tableau_(PD.getTable()),_nb_points_(PD.getPointsDim()),_nb_series_(PD.getSeriesDim()),_serie_name_(PD.getSerieNames()),_absci_name_(PD.getAbsciNames())
+ template<class Pt>
+ const std::vector<typename Pt::type> & getSeries(const std::string & name, Pt kind) const
{
+ return getSeries(getIndex(name),kind);
+ }
+ template<class Pt>
+ const std::vector<typename Pt::type> & getCurrentSeries( Pt kind) const
+ {
+ return getSeries(_curr_series_, kind);
}
- /*! @brief get the number of series.
- * @return number of series.
- */
- index_t getSeriesDim()
+ template<class Pt>
+ const typename Pt::type & getSeriesEntry(const size_t & i, const size_t & j, Pt kind) const
{
- return _nb_series_ ;
+ linbox_check(j<getSeriesSize(i));
+ return (getSeries(i,kind)[j]) ;
}
- /*! @brief get the common number of points in each serie.
- * @return number of points.
- */
- index_t getPointsDim()
+ template<class Pt>
+ const typename Pt::type & getSeriesEntry(const std::string & name, const size_t & j, Pt kind) const
{
- return _nb_points_ ;
+ return getSeriesEntry(getIndex(name),j,kind);
}
- /*! @brief Sets the name of a serie.
- * @param i index of the serie
- * @param nom name of the serie
- */
- void setSerieName(index_t i, std::string nom)
+ template<class Pt>
+ const typename Pt::type & getSeriesEntry(const size_t & i, Pt kind) const
{
- linbox_check(i<_nb_series_);
- _serie_name_[i] = nom ;
+ return ( getSeries(i,kind).back() ) ;
}
+ template<class Pt>
+ const typename Pt::type & getSeriesEntry(const std::string & name, Pt kind) const
+ {
+ return getSeriesEntry(getIndex(name),kind);
+ }
+
+ template<class Pt>
+ const typename Pt::type & getCurrentSeriesEntry(const size_t & j, Pt kind) const
+ {
+ return getSeriesEntry(_curr_series_, j, kind);
+ }
+
+ template<class Pt>
+ const typename Pt::type & getCurrentSeriesEntry( Pt kind) const
+ {
+ return getSeriesEntry(_curr_series_, kind);
+ }
+
+
+ // set Series
+
+ /** Gets the name of a series.
+ * @param i index of the series
+ */
+ const std::string & getSeriesName(const size_t & i) const ;
+
+ /** Gets the name of the current series.
+ */
+ const std::string & getCurrentSeriesName() const ;
+
+ /*! @brief Sets the name of the current series.
+ * @param nom name of the series
+ */
+ void setCurrentSeriesName(const std::string & nom) ;
+
+ /** Inits the watch on a series
+ * @param i index of a series
+ */
+ void initWatch ( const size_t & i) ;
+
+ /** Inits the watch to current series
+ */
+ void initCurrentSeriesWatch () ;
+
+ /** Creates a new series.
+ * It is created after the last series.
+ * \c getCurrentSeries() points to it.
+ * @param nom name of the new series
+ */
+ void newSeries(const std::string & nom = "") ;
+
+ /** Finish a series of measurements.
+ * Nothing is done for the moment.
+ */
+ void finishSeries() ;
+
+ /** @brief size of a series.
+ * @param i index of the series
+ */
+ size_t getSeriesSize(const size_t & i) const ;
+
+ /** @brief size of the current series.
+ */
+ size_t getCurrentSeriesSize() const ;
+
+ /*! goes to the next series of points
+ */
+ bool selectNextSeries() ;
+
+ /** selects the first series
+ */
+ void selectFirstSeries() ;
+
/*! @brief Sets the name of a point.
+ * @param i series number
* @param j index for the the point
* @param nom name of the point
*/
- void setAbsciName(index_t j, NAM nom)
+ template<class T>
+ void setSeriesPointLabel(const size_t & i, const size_t & j, const T & nom)
{
- linbox_check(j<_nb_points_);
- _absci_name_[j] = nom ;
+ std::string nom_s = fortifyString(toString(nom));
+ linbox_check(j<getSeriesSize(i) );
+ refSeries(i).PointLabels[j] = nom_s ;
+
+ return;
}
- /*! @brief gets the name of a serie.
- * Defaults to \c "serie.i"
+ /*! @brief Sets the name of a point.
+ * @param j index for the the point
+ * @param nom name of the point
+ */
+ void setCurrentSeriesPointLabel(const size_t & j, const std::string & nom) ;
+
+
+
+ /*! @brief gets the name of a series.
+ * Defaults to \c "series.i"
* @param i its index.
* @return its name.
*/
- std::string getSerieName(index_t i)
- {
- linbox_check(i<_nb_series_);
- if (_serie_name_[i].empty()) {
- std::ostringstream emptytitle ;
- emptytitle << "serie." << i ;
- return emptytitle.str();
- }
- return(_serie_name_[i]);
- }
+ std::string getSeriesLabel(const size_t & i) const ;
- /*! @brief gets the name of a point.
- * @param j its index.
+ /*! @brief gets the name of a series.
+ * Defaults to \c "series.i"
+ * @param i its index.
* @return its name.
- * @warning no default. \c setAbsciName has to be used beforehands.
*/
- NAM getAbsciName(index_t j)
- {
- linbox_check(j<_nb_points_);
- return(_absci_name_[j]) ;
- }
+ std::string getCurrentSeriesLabel() const;
/*! @brief gets all the names in the series.
* @return a vector of names.
*/
- std::vector<std::string > getSerieNames()
- {
- return _serie_name_ ;
- }
+ const svector_t & getSeriesLabels() const ;
- /*! @brief gets all the names in the points.
- * @return a vector of names.
+
+
+
+
+ /*! @brief sets a new entry.
+ * @param i index of the series
+ * @param j index of the point
+ * @param nam name of the point (eg size of the matrix, name of a sparse matrix,...)
+ * @param val value to be inserted (eg mflops, sec,...).
+ * @param xval x value of the point (eg size of the matrix, of a sparse matrix,...)
+ * @param yval time for this computation (seconds)
*/
- std::vector<NAM > getAbsciNames()
+ void setSeriesEntry(const size_t &i, const std::string & nam, const double & val
+ , const double & xval = NAN, const double & yval = NAN) ;
+
+ /*! @brief sets a new entry.
+ * @param name name of the series
+ * @param j index of the point
+ * @param nam name of the point (eg size of the matrix, name of a sparse matrix,...)
+ * @param val value to be inserted (eg mflops, sec,...).
+ * @param xval x value of the point (eg size of the matrix, of a sparse matrix,...)
+ * @param yval time for this computation (seconds)
+ */
+ void setSeriesEntry(const std::string & nom, const std::string & nam, const double & val
+ , const double & xval = NAN, const double & yval = NAN) ;
+
+ /*! @brief sets a new entry.
+ * @param j index of the point
+ * @param nam name of the point (eg size of the matrix, name of a sparse matrix,...)
+ * @param val value to be inserted (eg mflops, sec,...).
+ */
+ template<class T>
+ void setCurrentSeriesEntry(const T & nam, const double & val
+ , const double & xval = NAN, const double & yval = NAN)
{
- return _absci_name_ ;
+ std::string nam_s = fortifyString(toString(nam));
+ return setSeriesEntry(_curr_series_,nam_s,val,xval,yval) ;
}
- /*! @brief modifies the number of series.
- * @param n the new number of series. Some data will be lost if n is smaller than
- * the current size.
+
+
+ /*! gets a reference to the array of data.
+ * @return a reference to the member \c _tableau_ representing the data.
+ */
+ const std::vector<DataSeries > & getTable() const ;
+
+ /*! gets a reference to the array of data.
+ * @return a reference to the member \c _tableau_ representing the data.
+ */
+ std::vector<DataSeries > & refTable() ;
+
+
+ /** @brief Continue for another time measure ?
+ * @see TimeWatcher::keepon
+ * @param repet current number of repetitions for this new measure
+ * @param tim time previously spent on the measures.
+ * @return true if one more measure can be done
*/
- void resizeSeries( index_t & n)
+ bool keepon(size_t & repet, double tim, bool usePrediction=false) ;
+
+ void load( const std::string & filename) ;
+
+ /** @brief saves the data in XML format.
+ * @param filename file name
+ * @param title titles of the data
+ * @param xtitle legend of the X axis
+ * @param ytitle legend of the Y axis.
+ */
+ void save( const std::string & filename
+ , const std::string & title = ""
+ , const std::string & xtitle = ""
+ , const std::string & ytitle = "") ;
+
+ void addCurrentEntryMetaData(const MetaData & m)
{
- if (n<_nb_series_) {
- std::cerr << "warning, you are dropping series" << std::endl;
- }
- _tableau_.resize(n);
- return;
+ _meta_data_.push_back(getCurrentEntryId(),m);
}
- /*! @brief modifies the number of points.
- * @param n the new number of points in every series. Some data
- * will be lost if n is smaller than the current size.
+ /** returns the unique ID of the current series last entry
*/
- void resizePoints( index_t & n)
+ const std::string & getCurrentEntryId() const
{
- if (n<_nb_points_) {
- std::cerr << "warning, you are dropping points in the series" << std::endl;
- }
- for (index_t i = 0 ; i < _nb_series_ ; ++i)
- _tableau_[i].resize(n);
+ return (getCurrentSeries().UID).back();
}
- /*! @brief sets a new entry.
- * @param i index of the serie
- * @param j index of the point
- * @param val value to be inserted.
+ /** @brief returns the unique ID of the current series j'th entry.
+ * @param j index of the entry.
*/
- void setEntry(index_t i, index_t j, double val)
+ const std::string & getCurrentSeriesId(const size_t & j) const
{
- linbox_check(i<_nb_series_);
- linbox_check(j<_nb_points_);
- _tableau_[i][j] = val ;
- return ;
+ return (getCurrentSeries().UID[j]);
}
- /*! @brief gets a value for an entry.
- * @param i index of the serie
- * @param j index of the point
- * @return val value of point j in serie j.
+ /** @brief returns the unique ID of the i'th series j'th entry.
+ * @param i index of the series.
+ * @param j index of the entry.
*/
- double getEntry(index_t i, index_t j)
+ const std::string & getId(const size_t & i, const size_t & j)
{
- linbox_check(i<_nb_series_);
- linbox_check(j<_nb_points_);
- return _tableau_[i][j] ;
+ return (selectSeries(i).UID[j]);
}
- /*! gets a reference to the array of data.
- * @return a reference to the member \c _tableau_ representing the data.
+ /** @brief returns the unique ID of the i'th series j'th entry.
+ * @param i index of the series.
+ * @param j index of the entry.
*/
- std::vector<std::vector< float > > & getTable()
+ const std::string & getId(const std::string & name, const size_t & j)
{
- return _tableau_ ;
+ return (selectSeries(name).UID[j]);
}
- };
+ }; // PlotData
- /*! @brief The graph.
+} // LinBox
+
+//
+// PlotGraph
+//
+
+namespace LinBox {
+
+ /*! @brief The graph (2D).
* This class joins a PlotStyle and a PlotData to build up a graph. A
* filename should be provided as well, indicating where the output
* graph and scripts will be generated.
*
* @warning the filename will get a random suffix before the extension
* so as not to overwrite files "par inadvertance".
+ * @warning don't name anything else than a folder "data" in your working directory. You've been warned.
+ * @todo make depend on PlotStyle (that owns data)
*/
- template<class NAM>
+ //!@todo use getUsingSeries in latex/html/csv/xml
class PlotGraph {
private :
- PlotData<NAM> & _data_ ; //!< reference to the data points
- PlotStyle & _style_ ; //!< reference to a plotting style
- std::string _filename_ ; //!< name for the output file (without extension). a random \c _XXXXXX suffix will be added to make it unique.
+ PlotData & _data_ ; //!< reference to the data points
+ PlotStyle & _style_ ; //!< reference to a plotting style
+ std::string _filename_ ; //!< name for the output file (without extension). a random \c _XXXXXX suffix will be added to make it unique.
+ std::string _printname_ ; //!< name for the output file (without extension) to be printed. a random \c _XXXXXX suffix makes it unique.
+ dmatrix_t _merge_data_ ;
+ svector_t _merge_points_ ;
- /*! @internal
- * @brief random <code>:alnum:</code> \c char.
- * [[:alnum:]] characters are in range
- * - num : 48-57
- * - AL : 67-90
- * - al : 97-122
- * .
- * @return a random alphabetic or numeric char.
- */
- char _randomAlNum()
- {
- int c = rand()%62 ;
- c += 48 ; // c entre 48 et 109
- if (c < 58) {
- return (char) c;
- }
- else {
- c += 7 ;
- if (c < 91) {
- return (char)c ;
- }
- else {
- c += 6 ;
- return (char)c;
- }
- }
-
-
- }
+ private :
/*! @internal
* @brief Appends random suffix.
@@ -812,51 +929,71 @@ namespace LinBox
* underscore followed by 8 random alnum chars.
* @return the concatenation of \c _filename_ and this suffix.
*/
- std::string _randomName()
- {
- std::ostringstream unique_filename ;
- unique_filename << _filename_ << '_' ;
- for (index_t i = 8 ; i-- ; ) {
- unique_filename << _randomAlNum() ;
- }
- // std::cout << unique_filename.str() << std::endl;
- return unique_filename.str() ;
+ void _randomName();
- }
+ //! @internal returns the file name (without extension and uid)
+ const std::string & getFileName() ;
+
+ //! @bug this supposes the two series have unique measurements for one point.
+ void mergeTwoSeries( svector_t & merge_points
+ , dmatrix_t & merge_data
+ , const svector_t & pts
+ , const dvector_t & dat
+ , const size_t & idx) const ;
+
+ //! merge all series of points into a vector of absissa points and a vector of vector of data points
+ void mergeSeries();
+
+ void print_csv();
+
+ void print_dat();
+
+ void print_xml();
+
+ void print_html() ;
+
+ /*! @brief Prints data in a latex tabular.
+ */
+ void print_latex();
+
+ /*!@brief Plots the data with gnuplot.
+ * Produces data in a .dat file, creates a .gp gnuplot script and
+ * outputs a graph calling gnuplot.
+ * @warning If gnuplot is not available, fall back to the latex method.
+ */
+ void print_gnuplot(bool only_data=false);
+
+ public :
/*! @brief Sets a new data structure.
* @param data a reference to a PlotData class.
*/
- void setData( PlotData<NAM> & data )
- {
- _data_ = data ;
- }
+ void setData( PlotData & data );
/*! @brief Gets the data.
* @param[in,out] data a reference to a PlotData class.
*/
- PlotData<NAM> & refData( PlotData<NAM> & data)
- {
- return data = _data_ ;
- }
+ PlotData & refData( PlotData & data);
/*! @brief Sets a new style structure.
* @param style a reference to a PlotStyle class.
*/
- void setStyle( PlotStyle & style )
- {
- _style_ = style ;
- }
+ void setStyle( PlotStyle & style ) ;
/*! @brief Gets the style.
* @param[in,out] style a reference to a PlotStyle class.
*/
- PlotStyle & refStyle( PlotStyle & style)
- {
- return style = _style_ ;
- }
+ PlotStyle & refStyle( PlotStyle & style) ;
- public :
+ PlotStyle & refStyle( )
+ { return _style_ ; }
+
+
+ // not implemented yet
+ void sortSeries() ;
+
+ // not implemented yet
+ void unique() ;
/*! @brief Constructor for the PlotGraph class.
* Plots a series of data according to a style.
@@ -864,180 +1001,101 @@ namespace LinBox
* @param style sets parameters to gnuplot to achieve a nice
* plot.
*/
- PlotGraph( PlotData<NAM> & data, PlotStyle & style ) :
- _data_(data),_style_(style)
- {
- srand((unsigned)time(NULL));
- }
+ PlotGraph( PlotData & data, PlotStyle & style );
/*! @brief sets the ouput file name.
* All output is put in a "data" subfolder.
* @warning Since no file is overwritten, this
* directory can rapidly get very populated.
*/
- void setOutFilename( std::string filename )
- {
- if ( filename.empty() ) {
- _filename_ = "./data/plotdata" ;
- std::cerr << "you should provide a filename. Using " << _filename_ << " as default ."<<std::endl;
- }
- else {
- _filename_ = "./data/" + filename;
- }
+ void setOutFilename( const std::string & filename ) ;
- } ;
+ const std::string & getUsingSeries() ;
- /*! @brief Prints data in a latex tabular.
+ /*! @brief Gets the plot command line.
+ * @param File the name of/path to the data file (with extension)
+ * @return a gnuplot "plot" command stream.
*/
- void print_latex()
- {
- index_t nb_points = _data_.getPointsDim();
- index_t nb_series = _data_.getSeriesDim();
-
- linbox_check(nb_points);
- linbox_check(nb_series);
- // srand(time(NULL));
- // std::ostringstream unique_filename ;
- std::string unique_filename = _randomName();
- unique_filename += ".tex" ;
- // std::cout << _filename_ << " plot in " << unique_filename << '.'<< std::endl;
- std::ofstream FN(unique_filename.c_str());
- //!@todo check FN opened.
- // begin
- FN << "%\\usepackage{slashbox}" << std::endl;
- FN << "\\begin{table}" << std::endl;
- FN << "\\centering" << std::endl;
- // format
- FN << "\\begin{tabular}{c||" ;
- for (index_t j = nb_points ; j-- ; )
- FN << 'c' ;
- FN << "|}" << std::endl;
- // top left case
- std::string series = _style_.getRawTitle(2);
- std::string points = _style_.getRawTitle(1);
- if (!points.empty()) {
- FN << "\\backslashbox{" << points << "}{" << series << "}" ;
- }
- else {
- FN << series ;
- }
- // first line
- for (index_t j = 0 ; j < nb_points ; ++j ) {
- FN << " & " << _data_.getAbsciName(j) ;
- }
- // lines of data
- FN << std::endl << "\\hline" << std::endl;
- FN.precision(2);
- for (index_t i = 0 ; i < nb_series ; ++i) {
- FN << _data_.getSerieName(i) ;
- for (index_t j = 0 ; j < nb_points ; ++j )
- FN << " & " << _data_.getEntry(i,j) ;
- if (i+1 < nb_series )
- FN << "\\\\" ;
- FN << std::endl;
- }
- // end
- FN << "\\end{tabular}" << std::endl;
- FN << "\\caption{" << _style_.getRawTitle() << "}" << std::endl;
- FN << "\\label{tab:<+" << "label+>}" << std::endl;
- FN << "\\end{table}" << std::endl ;
-
- FN.close();
-
- std::cout << "latex table in " << unique_filename << '.' << std::endl;
- return ;
+ std::string getPlotCommand(const std::string & File) ;
- }
+ void print( Tag::Printer pt = Tag::Printer::xml) ;
- /*!@brief Plots the data with gnuplot.
- * Produces data in a .dat file, creates a .gp gnuplot script and
- * outputs a graph calling gnuplot.
- * @warning If gnuplot is not available, fall back to the latex method.
- */
- void print_gnuplot()
- {
-#ifndef __LINBOX_HAVE_GNUPLOT
- std::cout << "gnuplot is not available on your system. using latex table as fallback" << std::endl;
- print_latex();
-#else
- // srand(time(NULL));
- index_t nb_points = _data_.getPointsDim() ;
- index_t nb_series = _data_.getSeriesDim() ;
-
- std::string unique_filename = _randomName();
- std::string DataFileName = unique_filename + ".dat" ;
- std::string PlotFileName = unique_filename + ".gp" ;
- std::ofstream DF(DataFileName.c_str());
- std::ofstream PF(PlotFileName.c_str());
- /* Data file to be plot */
- // DF.precision(_style_.getPrecision());
- DF.precision(2);
- DF << "legend " ;
- for (index_t i = 0 ; i < nb_series ; ++i) {
- DF << _data_.getSerieName(i) << ' ' ;
- }
- DF << std::endl;
-
- for (index_t j = 0 ; j < nb_points ; ++j) {
- DF << _data_.getAbsciName(j) ;
- for (index_t i = 0 ; i < nb_series ; ++i) {
- DF << " " << _data_.getEntry(i,j) ;
- }
- DF << std::endl;
- }
-
- /* Ploting script */
- PF << "#" << _filename_ << std::endl;
- PF << _style_.getTerm() << std::endl;
- PF << _style_.getOutput(unique_filename) << std::endl;
- PF << _style_.getTitle() << std::endl;
- PF << _style_.getKeyPos() << std::endl;
- PF << _style_.getXtics() << std::endl;
- PF << _style_.getPlotType() << std::endl;
-#if 0
- for (index_t i = 0 ; i < nb_series ; ++i) {
- PF << "set style line " << _style_.getLineStyle() << std::endl;
- }
+ void save() ;
+
+ void load(const std::string & filename) ;
+
+ }; // PlotGraph
+
+} // LinBox
+
+//
+// Least Squares
+//
+
+#ifdef __LINBOX_HAVE_LAPACK
+extern "C" {
+#if 1 // from lapack (not clapack)
+
+ void dgels_(char *trans, int *m, int *n, int *nrhs, double *a, int *lda,
+ double *b, int *ldb, double *work, int *lwork, int *info);
+
+ void dgelsy_(int *m, int *n, int *nrhs, double *a, int *lda,
+ double *b, int *ldb, int *JPVT, double *RCOND, int *RANK,
+ double *work, int *lwork, int *info);
+
+ void dgelss_(int *m, int *n, int *nrhs, double *a, int *lda,
+ double *b, int *ldb, double *s, double *RCOND, int *RANK,
+ double *work, int *lwork, int *info);
#endif
- PF << _style_.getPlotCommand(DataFileName) << std::endl;
+
#if 0
- for (index_t i = 0 ; i < nb_series ; ++i) {
- PF << '\"' << DataFileName << "\" using 1:" << i+2 << " with lines " ;
- PF << " ls " << i+1 ;
- PF << " title '" << names[i] << "'";
- if (i < (nb_series-1))
- PF << ",\\" << std::endl;
- else
- PF << ';' ;
- }
- PF << std::endl;
+ int clapack_dgels (const enum CBLAS_ORDER Order,
+ const enum CBLAS_TRANSPOSE TA,
+ int M,
+ int N,
+ int NRHS,
+ double * A,
+ int lda,
+ double * B,
+ const int ldb
+ );
#endif
- PF.close();
+}
+#endif // __LINBOX_HAVE_LAPACK
+
+//
+// Curve fitting
+//
+
+namespace LinBox {
+
+ //! fit X[n-1,n],Y[n-1,n] and return evaluation at x.
+ double fit2(const dvector_t & X, const dvector_t & Y, int n, double x);
+
+#ifdef __LINBOX_HAVE_LAPACK
+ //! fits with a degree 3 polynomial and return evaluation at x.
+ double fit_lapack3(const dvector_t &X, const dvector_t &Z, double x);
+#endif // __LINBOX_HAVE_LAPACK
- std::string command( "gnuplot " ) ;
- command += PlotFileName ;
- int err = system( command.c_str() ) ;
- if (err) {
- std::cout << "errors have occured. Look at gnuplot output." << std::endl;
- }
- else {
- std::cout << "Output generated as " << unique_filename + _style_.getExt() << std::endl;
- }
+ //! fit X[n-2,n],Y[n-2,n] and return evaluation at x.
+ double fit3(const dvector_t & X, const dvector_t & Y,int n, double x);
+} // LinBox
+
+
+#ifdef LinBoxSrcOnly
+#include "benchmarks/benchmark.C"
#endif
- }
- };
+#include "benchmarks/benchmark.inl"
-}
-#endif // __LINBOX_benchmark_H
+#endif // __LINBOX_benchmarks_benchmark_H
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
// Local Variables:
// mode: C++
// tab-width: 8
// indent-tabs-mode: nil
// c-basic-offset: 8
// End:
-
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/benchmarks/benchmark.inl b/benchmarks/benchmark.inl
new file mode 100644
index 0000000..4561959
--- /dev/null
+++ b/benchmarks/benchmark.inl
@@ -0,0 +1,182 @@
+/* Copyright (C) 2013 LinBox
+ * Written by Brice Boyer (briceboyer) <boyer.brice at gmail.com>
+ *
+ *
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ * ========LICENCE========
+ */
+
+/*! @file benchmarks/benchmark.inl
+ * @ingroup benchmarks
+ * @brief Common header to ease benchmarking routines.
+ * We provide a class to easily populate and plot files that represent
+ * benchmarks.
+ *
+ * We use <a href="http://www.gnuplot.info/">gnuplot</a> for the plotting part
+ * or LaTeX to provide tables. A minimum knowledge of \c Gnuplot is a plus but
+ * the \c benchmark-* files should provide enough examples for creating
+ * standard (not too fancy) plots.
+ *
+ * We fall back to plain latex tabulars when gnuplot is not available. We plot
+ * graphs in files whose name is extended by a random 8-char string to avoid
+ * écraser files.
+ *
+ */
+
+#ifndef __LINBOX_benchmarks_benchmark_INL
+#define __LINBOX_benchmarks_benchmark_INL
+
+#include <stdlib.h>
+#include "linbox/integer.h"
+#include "linbox/util/debug.h"
+#include "tests/test-common.h"
+#include "linbox/util/timer.h"
+#include <string>
+#include <fstream>
+
+
+
+
+//
+// Chrono
+//
+
+namespace LinBox {
+
+ template<class MyTimer>
+ Chrono<MyTimer>::Chrono() :
+ _chrono_(),
+ _times_(0),
+ _total_(0)
+ {
+ _chrono_.clear();
+ }
+
+ template<class MyTimer>
+ Chrono<MyTimer>::~Chrono() {}
+
+ template<class MyTimer>
+ void Chrono<MyTimer>::clear()
+ {
+ _chrono_.clear();
+ _times_.resize(0);
+ _total_ = 0;
+ }
+
+ template<class MyTimer>
+ void Chrono<MyTimer>::start()
+ {
+ _chrono_.start();
+ }
+
+ template<class MyTimer>
+ void Chrono<MyTimer>::stop()
+ {
+ _chrono_.stop();
+ double split = _chrono_.userElapsedTime();
+ _times_.push_back( split );
+ _total_ += split ;
+ _chrono_.clear();
+ }
+
+ template<class MyTimer>
+ double Chrono<MyTimer>::time() const
+ {
+ return _total_ ;
+ }
+
+ template<class MyTimer>
+ dvector_t Chrono<MyTimer>::times() const
+ {
+ return _times_ ;
+ }
+
+
+} // LinBox
+
+//
+// PlotData
+//
+
+namespace LinBox {
+
+ // set Series
+
+ template<>
+ svector_t & PlotData::refSeries(const size_t & i, Point::Labels)
+ {
+ linbox_check(i<size());
+ return (refSeries(i).PointLabels) ;
+ }
+
+ template<>
+ dvector_t & PlotData::refSeries(const size_t & i, Point::Values)
+ {
+ return (refSeries(i).Values) ;
+ }
+
+ template<>
+ dvector_t & PlotData::refSeries(const size_t & i, Point::Points)
+ {
+ return (refSeries(i).Points) ;
+ }
+
+ template<>
+ dvector_t & PlotData::refSeries(const size_t & i, Point::Times)
+ {
+ return (refSeries(i).Times) ;
+ }
+
+ // get Series
+ template<>
+ const svector_t & PlotData::getSeries(const size_t & i, Point::Labels) const
+ {
+ linbox_check(i<size());
+ return (getSeries(i).PointLabels) ;
+ }
+
+ template<>
+ const dvector_t & PlotData::getSeries(const size_t & i, Point::Values) const
+ {
+ return (getSeries(i).Values) ;
+ }
+
+ template<>
+ const dvector_t & PlotData::getSeries(const size_t & i, Point::Points) const
+ {
+ return (getSeries(i).Points) ;
+ }
+
+ template<>
+ const dvector_t & PlotData::getSeries(const size_t & i, Point::Times) const
+ {
+ return (getSeries(i).Times) ;
+ }
+
+} // LinBox
+
+#endif // __LINBOX_benchmarks_benchmark_INL
+
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/benchmarks/block-coppersmith-benchmark.C b/benchmarks/block-coppersmith-benchmark.C
new file mode 100644
index 0000000..d68deb7
--- /dev/null
+++ b/benchmarks/block-coppersmith-benchmark.C
@@ -0,0 +1,93 @@
+#include "linbox/linbox-config.h"
+
+#include <iostream>
+#include <vector>
+#include <omp.h>
+
+#define __LINBOX_USE_OPENMP 1
+#include "linbox/ring/modular.h"
+#include "linbox/matrix/sparse-matrix.h"
+#include "linbox/matrix/dense-matrix.h"
+#include "linbox/matrix/matrix-domain.h"
+
+#include "linbox/algorithms/blackbox-block-container.h"
+#include "linbox/algorithms/block-coppersmith-domain.h"
+
+#include "linbox/solutions/det.h"
+
+// Computes the minimal polynomial of a sparse matrix (given in Matrix Market Format)
+// Times BlockCoppersmithDomain using TPL_omp
+
+using namespace LinBox;
+
+typedef Givaro::Modular<double> Field;
+typedef typename Field::Element Element;
+typedef SparseMatrix<Field, SparseMatrixFormat::TPL_omp> SparseMat;
+typedef MatrixDomain<Field> Domain;
+typedef typename Domain::OwnMatrix Block;
+
+void benchmarkBCD(Field& F,
+ Domain& MD,
+ SparseMat& M,
+ Block& U,
+ Block& V,
+ std::vector<Block>& gen,
+ std::vector<size_t>& deg,
+ int t)
+{
+ BlackboxBlockContainer<Field,SparseMat> blockseq(&M,F,U,V);
+ BlockCoppersmithDomain<Domain,BlackboxBlockContainer<Field,SparseMat> >
+ BCD(MD,&blockseq,t);
+
+ double start=omp_get_wtime();
+ deg=BCD.right_minpoly(gen);
+ double time=omp_get_wtime()-start;
+ std::cout << time << std::endl;
+}
+
+int main(int argc, char** argv)
+{
+ int earlyTerm;
+ int p;
+ std::string uFname,vFname,mFname;
+
+ static Argument args[] = {
+ { 'p', "-p P", "Set the field GF(p)", TYPE_INT, &p},
+ { 't', "-t T", "Early term threshold", TYPE_INT, &earlyTerm},
+ { 'm', "-m M", "Name of file for matrix M", TYPE_STR, &mFname},
+ { 'u', "-u U", "Name of file for matrix U", TYPE_STR, &uFname},
+ { 'v', "-v V", "Name of file for matrix V", TYPE_STR, &vFname},
+ END_OF_ARGUMENTS
+ };
+
+ parseArguments(argc,argv,args);
+
+ Field F(p);
+ Domain MD(F);
+ SparseMat M(F);
+ Block U(F),V(F);
+
+ {
+ ifstream iF(mFname);
+ M.read(iF);
+ M.finalize();
+ iF.close();
+ }
+ {
+ ifstream iF(uFname);
+ U.read(iF);
+ iF.close();
+ }
+ {
+ ifstream iF(vFname);
+ V.read(iF);
+ iF.close();
+ }
+
+ std::vector<Block> gen;
+ std::vector<size_t> deg;
+
+ benchmarkBCD(F,MD,M,U,V,gen,deg,earlyTerm);
+
+ return 0;
+}
diff --git a/benchmarks/data/Makefile.am b/benchmarks/data/Makefile.am
new file mode 100644
index 0000000..533cf81
--- /dev/null
+++ b/benchmarks/data/Makefile.am
@@ -0,0 +1,24 @@
+# Copyright (c) 2013 the LinBox group
+# Brice Boyer (briceboyer) <boyer.brice at gmail.com>
+# ========LICENCE========
+# This file is part of the library LinBox.
+#
+# LinBox is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+#
+# This library 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
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+# ========LICENCE========
+#/
+
+
+cleanup :
+ \rm -rf *dat *tex *gp *xml *csv *html *eps
diff --git a/benchmarks/gen-blocks.C b/benchmarks/gen-blocks.C
new file mode 100644
index 0000000..b9055ea
--- /dev/null
+++ b/benchmarks/gen-blocks.C
@@ -0,0 +1,184 @@
+#include "linbox/linbox-config.h"
+
+#include <iostream>
+#include <fstream>
+
+#include <omp.h>
+#include <time.h>
+#include <set>
+#include <utility>
+#include <sstream>
+
+#include "linbox/ring/modular.h"
+#include "linbox/matrix/sparse-matrix.h"
+#include "linbox/blackbox/transpose.h"
+#include "linbox/vector/vector-domain.h"
+#include "linbox/matrix/dense-matrix.h"
+#include "linbox/matrix/matrix-domain.h"
+
+#include "linbox/algorithms/blackbox-block-container.h"
+#include "linbox/algorithms/block-coppersmith-domain.h"
+
+#include "linbox/solutions/det.h"
+#include "linbox/solutions/rank.h"
+#include "linbox/solutions/methods.h"
+
+#include "linbox/algorithms/wiedemann.h"
+
+#include "examples/map-sparse.h"
+
+// Generates random dense matrices U and V and sparse matrix M for use
+// with block-coppersmith-benchmark and invariant-factors-benchmark.
+// Also computes the min-poly and saves that as well
+
+using namespace std;
+using namespace LinBox;
+
+typedef Givaro::Modular<double> Field;
+typedef typename Field::Element Element;
+typedef SparseMatrix<Field> SparseMat;
+typedef MatrixDomain<Field> Domain;
+typedef typename Domain::OwnMatrix Block;
+
+int randRange(int start, int end)
+{
+ double rval = rand();
+ static const double NORMALIZING_CONSTANT = 1.0/(1.0+RAND_MAX);
+ double normedRVal = rval*NORMALIZING_CONSTANT;
+ double rangeSize = end-start;
+ int offset = rangeSize*normedRVal;
+ return start+offset;
+}
+
+void randomBlock(Block& block, Field& field, int q, int m, int n)
+{
+ Element d;
+ for (int i=0;i<m;++i) {
+ for (int j=0;j<n;++j) {
+ field.init(d,randRange(0,q));
+ block.setEntry(i,j,d);
+ }
+ }
+}
+
+void randomNonSingular(Block& block, Field& field, int q, int m, int n)
+{
+ randomBlock(block,field,q,m,n);
+ long unsigned r;
+ long unsigned b=(long unsigned)(m<n?m:n);
+ std::cerr << "starting" << std::endl;
+ while (LinBox::rank(r,block,Method::BlasElimination()) < b) {
+ randomBlock(block,field,q,m,n);
+ std::cerr << "loop" << std::endl;
+ }
+}
+
+std::string fileDesc(int n, int b, double s, int q)
+{
+ std::stringstream ss;
+ ss << "n" << n;
+ ss << "b" << b;
+ int sInt=10000*(s-floor(s));
+ ss << "s" << setfill('0') << setw(4) << sInt << setw(0);
+ ss << "q" << q;
+ ss << ".txt";
+
+ return ss.str();
+}
+
+void computeMinPoly(Domain& MD,
+ SparseMat& M,
+ Field& F,
+ Block& U,
+ Block& V,
+ std::vector<Block>& gen,
+ std::vector<size_t>& deg,
+ int t)
+{
+ BlackboxBlockContainer<Field,SparseMat> blockseq(&M,F,U,V);
+ BlockCoppersmithDomain<Domain,BlackboxBlockContainer<Field,SparseMat> > BCD(MD,&blockseq,t);
+
+ deg=BCD.right_minpoly(gen);
+}
+
+int main(int argc, char** argv) {
+ int seed=501;
+ int n;
+ int b;
+ int nnz;
+ double sparsity;
+ int t;
+ int q=3;
+
+ srand(seed);
+
+ static Argument args[] = {
+ { 'n', "-n N", "Set row/col dimension of test matrix n.", TYPE_INT, &n },
+ { 'b', "-b B", "Set block size b.", TYPE_INT, &b },
+ { 's', "-s S", "Set the sparsity [0-1).", TYPE_DOUBLE, &sparsity },
+ { 'q', "-q Q", "Set the field GF(p)", TYPE_INT, &q},
+ { 't', "-t T", "Early term threshold", TYPE_INT, &t},
+ END_OF_ARGUMENTS
+ };
+
+ parseArguments (argc, argv, args);
+
+ nnz=(int)((((double)(n))*n)*sparsity);
+ std::cout << nnz << std::endl;
+
+ Field F(q);
+ Domain MD(F);
+ SparseMat M(F,n,n);
+ Block U(F,b,n),V(F,n,b);
+
+ std::vector<Block> gen;
+ std::vector<size_t> deg;
+
+ randomNonSingular(U,F,q,b,n);
+ randomNonSingular(V,F,q,n,b);
+
+ std::cerr << "done1" << std::endl;
+ MapSparse<Field> sparse(F,n,n);
+ MapSparse<Field>::generateSparseNonSingular(sparse,nnz,seed);
+ sparse.copy(M);
+ std::cerr << "done2" << std::endl;
+
+ {
+ ofstream oF("U"+fileDesc(n,b,sparsity,q));
+ U.write(oF);
+ oF.close();
+ }
+
+ {
+ ofstream oF("V"+fileDesc(n,b,sparsity,q));
+ V.write(oF);
+ oF.close();
+ }
+
+ {
+ ofstream oF("M"+fileDesc(n,b,sparsity,q));
+ M.write(oF);
+ oF.close();
+ }
+
+ std::cerr << "done3" << std::endl;
+ computeMinPoly(MD,M,F,U,V,gen,deg,t);
+
+ {
+ ofstream oF("MP"+fileDesc(n,b,sparsity,q));
+ for (int i=0;i<deg.size()-1;++i) {
+ oF << deg[i] << " ";
+ }
+ if (deg.size() > 0) {
+ oF << deg[deg.size()-1];
+ }
+ oF << std::endl;
+
+ for (int i=0;i<gen.size();++i) {
+ oF << gen[i] << std::endl;
+ }
+ }
+
+ std::cout << fileDesc(n,b,sparsity,q) << std::endl;
+ return 0;
+}
diff --git a/benchmarks/invariant-factors-benchmark.C b/benchmarks/invariant-factors-benchmark.C
new file mode 100644
index 0000000..dcdfe7b
--- /dev/null
+++ b/benchmarks/invariant-factors-benchmark.C
@@ -0,0 +1,183 @@
+#include "linbox/linbox-config.h"
+
+#include <iostream>
+#include <vector>
+#include <omp.h>
+
+#define __LINBOX_USE_OPENMP 1
+#include "linbox/ring/modular.h"
+#include "linbox/matrix/sparse-matrix.h"
+#include "linbox/matrix/dense-matrix.h"
+#include "linbox/matrix/matrix-domain.h"
+
+#include "linbox/algorithms/blackbox-block-container.h"
+#include "linbox/algorithms/block-coppersmith-domain.h"
+
+#include "linbox/solutions/det.h"
+
+#include <givaro/modular.h>
+#include <givaro/givpoly1.h>
+#include <linbox/ring/givaro-poly.h>
+#include <linbox/algorithms/smith-form-kannan-bachem.h>
+
+// Computes the invariant factors of a sparse matrix (given in Matrix Market Format)
+// Effectively times: TPL_omp, BlockCoppersmithDomain and KannanBachem
+
+using namespace LinBox;
+
+typedef Givaro::Modular<double> Field;
+typedef typename Field::Element Element;
+typedef SparseMatrix<Field, SparseMatrixFormat::TPL_omp> SparseMat;
+typedef MatrixDomain<Field> Domain;
+typedef typename Domain::OwnMatrix Block;
+
+
+typedef Givaro::Modular<int32_t> BaseDom;
+typedef Givaro::Poly1Dom<BaseDom,Givaro::Dense> PolyDom;
+typedef GivaroPoly<PolyDom> Ring;
+typedef MatrixDomain<Ring> PolyMatDom;
+typedef BlasMatrix<Ring> PolyMat;
+
+
+int randRange(int start, int end)
+{
+ double rval = rand();
+ static const double NORMALIZING_CONSTANT = 1.0/(1.0+RAND_MAX);
+ double normedRVal = rval*NORMALIZING_CONSTANT;
+ double rangeSize = end-start;
+ int offset = rangeSize*normedRVal;
+ return start+offset;
+}
+
+
+void benchmarkBCD(Field& F,
+ Domain& MD,
+ SparseMat& M,
+ Block& U,
+ Block& V,
+ std::vector<Block>& gen,
+ std::vector<size_t>& deg,
+ int t,
+ int p)
+{
+ BlackboxBlockContainer<Field,SparseMat> blockseq(&M,F,U,V);
+ BlockCoppersmithDomain<Domain,BlackboxBlockContainer<Field,SparseMat> >
+ BCD(MD,&blockseq,t);
+
+ double start=omp_get_wtime();
+ deg=BCD.right_minpoly(gen);
+
+ BaseDom BD(p);
+ PolyDom PD(BD, "x");
+ Ring R(PD);
+ PolyMatDom PMD(R);
+ int b=U.rowdim();
+ int d=gen.size();
+ PolyMat MM(R,b,b);
+ Ring::Element temp;
+ temp.resize(d);
+ for (int i=0;i<b;++i) {
+ for (int j=0;j<b;++j) {
+ for (int k=0;k<d;++k) {
+ temp[k]=gen[k].getEntry(i,j);
+ }
+ MM.setEntry(i,j,temp);
+ }
+ }
+
+ SmithFormKannanBachemDomain<PolyMatDom> SFKB(PMD);
+ BlasVector<Ring> diag(R,b,R.zero);
+ SFKB.solve(diag,MM);
+ PolyDom::Type_t lcoef;
+ for (size_t i=0;i<diag.size();++i) {
+ PD.leadcoef(lcoef, diag[i]);
+ PD.divin(diag[i],lcoef);
+ }
+ double time=omp_get_wtime()-start;
+ std::cout << time << std::endl;
+ for (size_t i=0;i<diag.size();++i) {
+ R.write(std::cout,diag[i]);
+ std::cout << std::endl;
+ }
+
+ testCorrectness(F,p,M,diag[diag.size()-1],PD);
+}
+
+bool testCorrectness(Field& F,
+ int p,
+ SparseMat& M,
+ Ring& minPoly
+ PolyDom& PD)
+{
+ int n=M.rowdim();
+ Element d,e;
+ F.init(d,0);
+ BlasVector<Element> v(F,n,d),sum(F,n,d),vPrime(F,n,d);
+ for (int i=0;i<n;++i) {
+ F.init(v[i],randRange(0,p));
+ }
+ for (int i=0;i<=PD.degree(minPoly);++i) {
+ PD.getEntry(d,i,minPoly);
+ for (int j=0;j<n;++j) {
+ F.mul(e,d,v[j]);
+ F.addin(sum[j],e);
+ }
+ M.apply(vPrime,v);
+ for (int j=0;j<n;++j) {
+ v[j]=vPrime[j]
+ }
+ }
+ for (int i=0;i<n;++i) {
+ if (!F.isZero(v[i])) {
+ return false;
+ }
+ }
+ return true;
+}
+
+int main(int argc, char** argv)
+{
+ int earlyTerm;
+ int p;
+ std::string uFname,vFname,mFname;
+
+ static Argument args[] = {
+ { 'p', "-p P", "Set the field GF(p)", TYPE_INT, &p},
+ { 't', "-t T", "Early term threshold", TYPE_INT, &earlyTerm},
+ { 'm', "-m M", "Name of file for matrix M", TYPE_STR, &mFname},
+ { 'u', "-u U", "Name of file for matrix U", TYPE_STR, &uFname},
+ { 'v', "-v V", "Name of file for matrix V", TYPE_STR, &vFname},
+ END_OF_ARGUMENTS
+ };
+
+ parseArguments(argc,argv,args);
+
+ Field F(p);
+ Domain MD(F);
+ SparseMat M(F);
+ Block U(F),V(F);
+
+ {
+ ifstream iF(mFname);
+ M.read(iF);
+ M.finalize();
+ iF.close();
+ }
+ {
+ ifstream iF(uFname);
+ U.read(iF);
+ iF.close();
+ }
+ {
+ ifstream iF(vFname);
+ V.read(iF);
+ iF.close();
+ }
+
+ std::vector<Block> gen;
+ std::vector<size_t> deg;
+
+ benchmarkBCD(F,MD,M,U,V,gen,deg,earlyTerm,p);
+
+ return 0;
+}
diff --git a/benchmarks/matrix/Makefile.am b/benchmarks/matrix/Makefile.am
new file mode 100644
index 0000000..90cf860
--- /dev/null
+++ b/benchmarks/matrix/Makefile.am
@@ -0,0 +1,22 @@
+# Copyright (c) 2013 the LinBox group
+# Brice Boyer (briceboyer) <boyer.brice at gmail.com>
+# ========LICENCE========
+# This file is part of the library LinBox.
+#
+# LinBox is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+#
+# This library 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
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+# ========LICENCE========
+#/
+
+
diff --git a/benchmarks/matrix/bibd_12_5_66x792.sms b/benchmarks/matrix/bibd_12_5_66x792.sms
new file mode 100644
index 0000000..81bc947
--- /dev/null
+++ b/benchmarks/matrix/bibd_12_5_66x792.sms
@@ -0,0 +1,7922 @@
+66 792 M
+1 1 1
+1 2 1
+1 3 1
+1 4 1
+1 5 1
+1 6 1
+1 7 1
+1 8 1
+1 9 1
+1 10 1
+1 11 1
+1 12 1
+1 13 1
+1 14 1
+1 15 1
+1 16 1
+1 17 1
+1 18 1
+1 19 1
+1 20 1
+1 21 1
+1 22 1
+1 23 1
+1 24 1
+1 25 1
+1 26 1
+1 27 1
+1 28 1
+1 29 1
+1 30 1
+1 31 1
+1 32 1
+1 33 1
+1 34 1
+1 35 1
+1 36 1
+1 37 1
+1 38 1
+1 39 1
+1 40 1
+1 41 1
+1 42 1
+1 43 1
+1 44 1
+1 45 1
+1 46 1
+1 47 1
+1 48 1
+1 49 1
+1 50 1
+1 51 1
+1 52 1
+1 53 1
+1 54 1
+1 55 1
+1 56 1
+1 57 1
+1 58 1
+1 59 1
+1 60 1
+1 61 1
+1 62 1
+1 63 1
+1 64 1
+1 65 1
+1 66 1
+1 67 1
+1 68 1
+1 69 1
+1 70 1
+1 71 1
+1 72 1
+1 73 1
+1 74 1
+1 75 1
+1 76 1
+1 77 1
+1 78 1
+1 79 1
+1 80 1
+1 81 1
+1 82 1
+1 83 1
+1 84 1
+1 85 1
+1 86 1
+1 87 1
+1 88 1
+1 89 1
+1 90 1
+1 91 1
+1 92 1
+1 93 1
+1 94 1
+1 95 1
+1 96 1
+1 97 1
+1 98 1
+1 99 1
+1 100 1
+1 101 1
+1 102 1
+1 103 1
+1 104 1
+1 105 1
+1 106 1
+1 107 1
+1 108 1
+1 109 1
+1 110 1
+1 111 1
+1 112 1
+1 113 1
+1 114 1
+1 115 1
+1 116 1
+1 117 1
+1 118 1
+1 119 1
+1 120 1
+2 1 1
+2 2 1
+2 3 1
+2 4 1
+2 5 1
+2 6 1
+2 7 1
+2 8 1
+2 9 1
+2 10 1
+2 11 1
+2 12 1
+2 13 1
+2 14 1
+2 15 1
+2 16 1
+2 17 1
+2 18 1
+2 19 1
+2 20 1
+2 21 1
+2 22 1
+2 23 1
+2 24 1
+2 25 1
+2 26 1
+2 27 1
+2 28 1
+2 29 1
+2 30 1
+2 31 1
+2 32 1
+2 33 1
+2 34 1
+2 35 1
+2 36 1
+2 121 1
+2 122 1
+2 123 1
+2 124 1
+2 125 1
+2 126 1
+2 127 1
+2 128 1
+2 129 1
+2 130 1
+2 131 1
+2 132 1
+2 133 1
+2 134 1
+2 135 1
+2 136 1
+2 137 1
+2 138 1
+2 139 1
+2 140 1
+2 141 1
+2 142 1
+2 143 1
+2 144 1
+2 145 1
+2 146 1
+2 147 1
+2 148 1
+2 149 1
+2 150 1
+2 151 1
+2 152 1
+2 153 1
+2 154 1
+2 155 1
+2 156 1
+2 157 1
+2 158 1
+2 159 1
+2 160 1
+2 161 1
+2 162 1
+2 163 1
+2 164 1
+2 165 1
+2 166 1
+2 167 1
+2 168 1
+2 169 1
+2 170 1
+2 171 1
+2 172 1
+2 173 1
+2 174 1
+2 175 1
+2 176 1
+2 177 1
+2 178 1
+2 179 1
+2 180 1
+2 181 1
+2 182 1
+2 183 1
+2 184 1
+2 185 1
+2 186 1
+2 187 1
+2 188 1
+2 189 1
+2 190 1
+2 191 1
+2 192 1
+2 193 1
+2 194 1
+2 195 1
+2 196 1
+2 197 1
+2 198 1
+2 199 1
+2 200 1
+2 201 1
+2 202 1
+2 203 1
+2 204 1
+3 1 1
+3 2 1
+3 3 1
+3 4 1
+3 5 1
+3 6 1
+3 7 1
+3 8 1
+3 37 1
+3 38 1
+3 39 1
+3 40 1
+3 41 1
+3 42 1
+3 43 1
+3 44 1
+3 45 1
+3 46 1
+3 47 1
+3 48 1
+3 49 1
+3 50 1
+3 51 1
+3 52 1
+3 53 1
+3 54 1
+3 55 1
+3 56 1
+3 57 1
+3 58 1
+3 59 1
+3 60 1
+3 61 1
+3 62 1
+3 63 1
+3 64 1
+3 121 1
+3 122 1
+3 123 1
+3 124 1
+3 125 1
+3 126 1
+3 127 1
+3 128 1
+3 129 1
+3 130 1
+3 131 1
+3 132 1
+3 133 1
+3 134 1
+3 135 1
+3 136 1
+3 137 1
+3 138 1
+3 139 1
+3 140 1
+3 141 1
+3 142 1
+3 143 1
+3 144 1
+3 145 1
+3 146 1
+3 147 1
+3 148 1
+3 205 1
+3 206 1
+3 207 1
+3 208 1
+3 209 1
+3 210 1
+3 211 1
+3 212 1
+3 213 1
+3 214 1
+3 215 1
+3 216 1
+3 217 1
+3 218 1
+3 219 1
+3 220 1
+3 221 1
+3 222 1
+3 223 1
+3 224 1
+3 225 1
+3 226 1
+3 227 1
+3 228 1
+3 229 1
+3 230 1
+3 231 1
+3 232 1
+3 233 1
+3 234 1
+3 235 1
+3 236 1
+3 237 1
+3 238 1
+3 239 1
+3 240 1
+3 241 1
+3 242 1
+3 243 1
+3 244 1
+3 245 1
+3 246 1
+3 247 1
+3 248 1
+3 249 1
+3 250 1
+3 251 1
+3 252 1
+3 253 1
+3 254 1
+3 255 1
+3 256 1
+3 257 1
+3 258 1
+3 259 1
+3 260 1
+4 1 1
+4 9 1
+4 10 1
+4 11 1
+4 12 1
+4 13 1
+4 14 1
+4 15 1
+4 37 1
+4 38 1
+4 39 1
+4 40 1
+4 41 1
+4 42 1
+4 43 1
+4 65 1
+4 66 1
+4 67 1
+4 68 1
+4 69 1
+4 70 1
+4 71 1
+4 72 1
+4 73 1
+4 74 1
+4 75 1
+4 76 1
+4 77 1
+4 78 1
+4 79 1
+4 80 1
+4 81 1
+4 82 1
+4 83 1
+4 84 1
+4 85 1
+4 121 1
+4 122 1
+4 123 1
+4 124 1
+4 125 1
+4 126 1
+4 127 1
+4 149 1
+4 150 1
+4 151 1
+4 152 1
+4 153 1
+4 154 1
+4 155 1
+4 156 1
+4 157 1
+4 158 1
+4 159 1
+4 160 1
+4 161 1
+4 162 1
+4 163 1
+4 164 1
+4 165 1
+4 166 1
+4 167 1
+4 168 1
+4 169 1
+4 205 1
+4 206 1
+4 207 1
+4 208 1
+4 209 1
+4 210 1
+4 211 1
+4 212 1
+4 213 1
+4 214 1
+4 215 1
+4 216 1
+4 217 1
+4 218 1
+4 219 1
+4 220 1
+4 221 1
+4 222 1
+4 223 1
+4 224 1
+4 225 1
+4 261 1
+4 262 1
+4 263 1
+4 264 1
+4 265 1
+4 266 1
+4 267 1
+4 268 1
+4 269 1
+4 270 1
+4 271 1
+4 272 1
+4 273 1
+4 274 1
+4 275 1
+4 276 1
+4 277 1
+4 278 1
+4 279 1
+4 280 1
+4 281 1
+4 282 1
+4 283 1
+4 284 1
+4 285 1
+4 286 1
+4 287 1
+4 288 1
+4 289 1
+4 290 1
+4 291 1
+4 292 1
+4 293 1
+4 294 1
+4 295 1
+5 2 1
+5 9 1
+5 16 1
+5 17 1
+5 18 1
+5 19 1
+5 20 1
+5 21 1
+5 37 1
+5 44 1
+5 45 1
+5 46 1
+5 47 1
+5 48 1
+5 49 1
+5 65 1
+5 66 1
+5 67 1
+5 68 1
+5 69 1
+5 70 1
+5 86 1
+5 87 1
+5 88 1
+5 89 1
+5 90 1
+5 91 1
+5 92 1
+5 93 1
+5 94 1
+5 95 1
+5 96 1
+5 97 1
+5 98 1
+5 99 1
+5 100 1
+5 121 1
+5 128 1
+5 129 1
+5 130 1
+5 131 1
+5 132 1
+5 133 1
+5 149 1
+5 150 1
+5 151 1
+5 152 1
+5 153 1
+5 154 1
+5 170 1
+5 171 1
+5 172 1
+5 173 1
+5 174 1
+5 175 1
+5 176 1
+5 177 1
+5 178 1
+5 179 1
+5 180 1
+5 181 1
+5 182 1
+5 183 1
+5 184 1
+5 205 1
+5 206 1
+5 207 1
+5 208 1
+5 209 1
+5 210 1
+5 226 1
+5 227 1
+5 228 1
+5 229 1
+5 230 1
+5 231 1
+5 232 1
+5 233 1
+5 234 1
+5 235 1
+5 236 1
+5 237 1
+5 238 1
+5 239 1
+5 240 1
+5 261 1
+5 262 1
+5 263 1
+5 264 1
+5 265 1
+5 266 1
+5 267 1
+5 268 1
+5 269 1
+5 270 1
+5 271 1
+5 272 1
+5 273 1
+5 274 1
+5 275 1
+5 296 1
+5 297 1
+5 298 1
+5 299 1
+5 300 1
+5 301 1
+5 302 1
+5 303 1
+5 304 1
+5 305 1
+5 306 1
+5 307 1
+5 308 1
+5 309 1
+5 310 1
+5 311 1
+5 312 1
+5 313 1
+5 314 1
+5 315 1
+6 3 1
+6 10 1
+6 16 1
+6 22 1
+6 23 1
+6 24 1
+6 25 1
+6 26 1
+6 38 1
+6 44 1
+6 50 1
+6 51 1
+6 52 1
+6 53 1
+6 54 1
+6 65 1
+6 71 1
+6 72 1
+6 73 1
+6 74 1
+6 75 1
+6 86 1
+6 87 1
+6 88 1
+6 89 1
+6 90 1
+6 101 1
+6 102 1
+6 103 1
+6 104 1
+6 105 1
+6 106 1
+6 107 1
+6 108 1
+6 109 1
+6 110 1
+6 122 1
+6 128 1
+6 134 1
+6 135 1
+6 136 1
+6 137 1
+6 138 1
+6 149 1
+6 155 1
+6 156 1
+6 157 1
+6 158 1
+6 159 1
+6 170 1
+6 171 1
+6 172 1
+6 173 1
+6 174 1
+6 185 1
+6 186 1
+6 187 1
+6 188 1
+6 189 1
+6 190 1
+6 191 1
+6 192 1
+6 193 1
+6 194 1
+6 205 1
+6 211 1
+6 212 1
+6 213 1
+6 214 1
+6 215 1
+6 226 1
+6 227 1
+6 228 1
+6 229 1
+6 230 1
+6 241 1
+6 242 1
+6 243 1
+6 244 1
+6 245 1
+6 246 1
+6 247 1
+6 248 1
+6 249 1
+6 250 1
+6 261 1
+6 262 1
+6 263 1
+6 264 1
+6 265 1
+6 276 1
+6 277 1
+6 278 1
+6 279 1
+6 280 1
+6 281 1
+6 282 1
+6 283 1
+6 284 1
+6 285 1
+6 296 1
+6 297 1
+6 298 1
+6 299 1
+6 300 1
+6 301 1
+6 302 1
+6 303 1
+6 304 1
+6 305 1
+6 316 1
+6 317 1
+6 318 1
+6 319 1
+6 320 1
+6 321 1
+6 322 1
+6 323 1
+6 324 1
+6 325 1
+7 4 1
+7 11 1
+7 17 1
+7 22 1
+7 27 1
+7 28 1
+7 29 1
+7 30 1
+7 39 1
+7 45 1
+7 50 1
+7 55 1
+7 56 1
+7 57 1
+7 58 1
+7 66 1
+7 71 1
+7 76 1
+7 77 1
+7 78 1
+7 79 1
+7 86 1
+7 91 1
+7 92 1
+7 93 1
+7 94 1
+7 101 1
+7 102 1
+7 103 1
+7 104 1
+7 111 1
+7 112 1
+7 113 1
+7 114 1
+7 115 1
+7 116 1
+7 123 1
+7 129 1
+7 134 1
+7 139 1
+7 140 1
+7 141 1
+7 142 1
+7 150 1
+7 155 1
+7 160 1
+7 161 1
+7 162 1
+7 163 1
+7 170 1
+7 175 1
+7 176 1
+7 177 1
+7 178 1
+7 185 1
+7 186 1
+7 187 1
+7 188 1
+7 195 1
+7 196 1
+7 197 1
+7 198 1
+7 199 1
+7 200 1
+7 206 1
+7 211 1
+7 216 1
+7 217 1
+7 218 1
+7 219 1
+7 226 1
+7 231 1
+7 232 1
+7 233 1
+7 234 1
+7 241 1
+7 242 1
+7 243 1
+7 244 1
+7 251 1
+7 252 1
+7 253 1
+7 254 1
+7 255 1
+7 256 1
+7 261 1
+7 266 1
+7 267 1
+7 268 1
+7 269 1
+7 276 1
+7 277 1
+7 278 1
+7 279 1
+7 286 1
+7 287 1
+7 288 1
+7 289 1
+7 290 1
+7 291 1
+7 296 1
+7 297 1
+7 298 1
+7 299 1
+7 306 1
+7 307 1
+7 308 1
+7 309 1
+7 310 1
+7 311 1
+7 316 1
+7 317 1
+7 318 1
+7 319 1
+7 320 1
+7 321 1
+7 326 1
+7 327 1
+7 328 1
+7 329 1
+8 5 1
+8 12 1
+8 18 1
+8 23 1
+8 27 1
+8 31 1
+8 32 1
+8 33 1
+8 40 1
+8 46 1
+8 51 1
+8 55 1
+8 59 1
+8 60 1
+8 61 1
+8 67 1
+8 72 1
+8 76 1
+8 80 1
+8 81 1
+8 82 1
+8 87 1
+8 91 1
+8 95 1
+8 96 1
+8 97 1
+8 101 1
+8 105 1
+8 106 1
+8 107 1
+8 111 1
+8 112 1
+8 113 1
+8 117 1
+8 118 1
+8 119 1
+8 124 1
+8 130 1
+8 135 1
+8 139 1
+8 143 1
+8 144 1
+8 145 1
+8 151 1
+8 156 1
+8 160 1
+8 164 1
+8 165 1
+8 166 1
+8 171 1
+8 175 1
+8 179 1
+8 180 1
+8 181 1
+8 185 1
+8 189 1
+8 190 1
+8 191 1
+8 195 1
+8 196 1
+8 197 1
+8 201 1
+8 202 1
+8 203 1
+8 207 1
+8 212 1
+8 216 1
+8 220 1
+8 221 1
+8 222 1
+8 227 1
+8 231 1
+8 235 1
+8 236 1
+8 237 1
+8 241 1
+8 245 1
+8 246 1
+8 247 1
+8 251 1
+8 252 1
+8 253 1
+8 257 1
+8 258 1
+8 259 1
+8 262 1
+8 266 1
+8 270 1
+8 271 1
+8 272 1
+8 276 1
+8 280 1
+8 281 1
+8 282 1
+8 286 1
+8 287 1
+8 288 1
+8 292 1
+8 293 1
+8 294 1
+8 296 1
+8 300 1
+8 301 1
+8 302 1
+8 306 1
+8 307 1
+8 308 1
+8 312 1
+8 313 1
+8 314 1
+8 316 1
+8 317 1
+8 318 1
+8 322 1
+8 323 1
+8 324 1
+8 326 1
+8 327 1
+8 328 1
+8 330 1
+9 6 1
+9 13 1
+9 19 1
+9 24 1
+9 28 1
+9 31 1
+9 34 1
+9 35 1
+9 41 1
+9 47 1
+9 52 1
+9 56 1
+9 59 1
+9 62 1
+9 63 1
+9 68 1
+9 73 1
+9 77 1
+9 80 1
+9 83 1
+9 84 1
+9 88 1
+9 92 1
+9 95 1
+9 98 1
+9 99 1
+9 102 1
+9 105 1
+9 108 1
+9 109 1
+9 111 1
+9 114 1
+9 115 1
+9 117 1
+9 118 1
+9 120 1
+9 125 1
+9 131 1
+9 136 1
+9 140 1
+9 143 1
+9 146 1
+9 147 1
+9 152 1
+9 157 1
+9 161 1
+9 164 1
+9 167 1
+9 168 1
+9 172 1
+9 176 1
+9 179 1
+9 182 1
+9 183 1
+9 186 1
+9 189 1
+9 192 1
+9 193 1
+9 195 1
+9 198 1
+9 199 1
+9 201 1
+9 202 1
+9 204 1
+9 208 1
+9 213 1
+9 217 1
+9 220 1
+9 223 1
+9 224 1
+9 228 1
+9 232 1
+9 235 1
+9 238 1
+9 239 1
+9 242 1
+9 245 1
+9 248 1
+9 249 1
+9 251 1
+9 254 1
+9 255 1
+9 257 1
+9 258 1
+9 260 1
+9 263 1
+9 267 1
+9 270 1
+9 273 1
+9 274 1
+9 277 1
+9 280 1
+9 283 1
+9 284 1
+9 286 1
+9 289 1
+9 290 1
+9 292 1
+9 293 1
+9 295 1
+9 297 1
+9 300 1
+9 303 1
+9 304 1
+9 306 1
+9 309 1
+9 310 1
+9 312 1
+9 313 1
+9 315 1
+9 316 1
+9 319 1
+9 320 1
+9 322 1
+9 323 1
+9 325 1
+9 326 1
+9 327 1
+9 329 1
+9 330 1
+10 7 1
+10 14 1
+10 20 1
+10 25 1
+10 29 1
+10 32 1
+10 34 1
+10 36 1
+10 42 1
+10 48 1
+10 53 1
+10 57 1
+10 60 1
+10 62 1
+10 64 1
+10 69 1
+10 74 1
+10 78 1
+10 81 1
+10 83 1
+10 85 1
+10 89 1
+10 93 1
+10 96 1
+10 98 1
+10 100 1
+10 103 1
+10 106 1
+10 108 1
+10 110 1
+10 112 1
+10 114 1
+10 116 1
+10 117 1
+10 119 1
+10 120 1
+10 126 1
+10 132 1
+10 137 1
+10 141 1
+10 144 1
+10 146 1
+10 148 1
+10 153 1
+10 158 1
+10 162 1
+10 165 1
+10 167 1
+10 169 1
+10 173 1
+10 177 1
+10 180 1
+10 182 1
+10 184 1
+10 187 1
+10 190 1
+10 192 1
+10 194 1
+10 196 1
+10 198 1
+10 200 1
+10 201 1
+10 203 1
+10 204 1
+10 209 1
+10 214 1
+10 218 1
+10 221 1
+10 223 1
+10 225 1
+10 229 1
+10 233 1
+10 236 1
+10 238 1
+10 240 1
+10 243 1
+10 246 1
+10 248 1
+10 250 1
+10 252 1
+10 254 1
+10 256 1
+10 257 1
+10 259 1
+10 260 1
+10 264 1
+10 268 1
+10 271 1
+10 273 1
+10 275 1
+10 278 1
+10 281 1
+10 283 1
+10 285 1
+10 287 1
+10 289 1
+10 291 1
+10 292 1
+10 294 1
+10 295 1
+10 298 1
+10 301 1
+10 303 1
+10 305 1
+10 307 1
+10 309 1
+10 311 1
+10 312 1
+10 314 1
+10 315 1
+10 317 1
+10 319 1
+10 321 1
+10 322 1
+10 324 1
+10 325 1
+10 326 1
+10 328 1
+10 329 1
+10 330 1
+11 8 1
+11 15 1
+11 21 1
+11 26 1
+11 30 1
+11 33 1
+11 35 1
+11 36 1
+11 43 1
+11 49 1
+11 54 1
+11 58 1
+11 61 1
+11 63 1
+11 64 1
+11 70 1
+11 75 1
+11 79 1
+11 82 1
+11 84 1
+11 85 1
+11 90 1
+11 94 1
+11 97 1
+11 99 1
+11 100 1
+11 104 1
+11 107 1
+11 109 1
+11 110 1
+11 113 1
+11 115 1
+11 116 1
+11 118 1
+11 119 1
+11 120 1
+11 127 1
+11 133 1
+11 138 1
+11 142 1
+11 145 1
+11 147 1
+11 148 1
+11 154 1
+11 159 1
+11 163 1
+11 166 1
+11 168 1
+11 169 1
+11 174 1
+11 178 1
+11 181 1
+11 183 1
+11 184 1
+11 188 1
+11 191 1
+11 193 1
+11 194 1
+11 197 1
+11 199 1
+11 200 1
+11 202 1
+11 203 1
+11 204 1
+11 210 1
+11 215 1
+11 219 1
+11 222 1
+11 224 1
+11 225 1
+11 230 1
+11 234 1
+11 237 1
+11 239 1
+11 240 1
+11 244 1
+11 247 1
+11 249 1
+11 250 1
+11 253 1
+11 255 1
+11 256 1
+11 258 1
+11 259 1
+11 260 1
+11 265 1
+11 269 1
+11 272 1
+11 274 1
+11 275 1
+11 279 1
+11 282 1
+11 284 1
+11 285 1
+11 288 1
+11 290 1
+11 291 1
+11 293 1
+11 294 1
+11 295 1
+11 299 1
+11 302 1
+11 304 1
+11 305 1
+11 308 1
+11 310 1
+11 311 1
+11 313 1
+11 314 1
+11 315 1
+11 318 1
+11 320 1
+11 321 1
+11 323 1
+11 324 1
+11 325 1
+11 327 1
+11 328 1
+11 329 1
+11 330 1
+12 1 1
+12 2 1
+12 3 1
+12 4 1
+12 5 1
+12 6 1
+12 7 1
+12 8 1
+12 9 1
+12 10 1
+12 11 1
+12 12 1
+12 13 1
+12 14 1
+12 15 1
+12 16 1
+12 17 1
+12 18 1
+12 19 1
+12 20 1
+12 21 1
+12 22 1
+12 23 1
+12 24 1
+12 25 1
+12 26 1
+12 27 1
+12 28 1
+12 29 1
+12 30 1
+12 31 1
+12 32 1
+12 33 1
+12 34 1
+12 35 1
+12 36 1
+12 331 1
+12 332 1
+12 333 1
+12 334 1
+12 335 1
+12 336 1
+12 337 1
+12 338 1
+12 339 1
+12 340 1
+12 341 1
+12 342 1
+12 343 1
+12 344 1
+12 345 1
+12 346 1
+12 347 1
+12 348 1
+12 349 1
+12 350 1
+12 351 1
+12 352 1
+12 353 1
+12 354 1
+12 355 1
+12 356 1
+12 357 1
+12 358 1
+12 359 1
+12 360 1
+12 361 1
+12 362 1
+12 363 1
+12 364 1
+12 365 1
+12 366 1
+12 367 1
+12 368 1
+12 369 1
+12 370 1
+12 371 1
+12 372 1
+12 373 1
+12 374 1
+12 375 1
+12 376 1
+12 377 1
+12 378 1
+12 379 1
+12 380 1
+12 381 1
+12 382 1
+12 383 1
+12 384 1
+12 385 1
+12 386 1
+12 387 1
+12 388 1
+12 389 1
+12 390 1
+12 391 1
+12 392 1
+12 393 1
+12 394 1
+12 395 1
+12 396 1
+12 397 1
+12 398 1
+12 399 1
+12 400 1
+12 401 1
+12 402 1
+12 403 1
+12 404 1
+12 405 1
+12 406 1
+12 407 1
+12 408 1
+12 409 1
+12 410 1
+12 411 1
+12 412 1
+12 413 1
+12 414 1
+13 1 1
+13 2 1
+13 3 1
+13 4 1
+13 5 1
+13 6 1
+13 7 1
+13 8 1
+13 37 1
+13 38 1
+13 39 1
+13 40 1
+13 41 1
+13 42 1
+13 43 1
+13 44 1
+13 45 1
+13 46 1
+13 47 1
+13 48 1
+13 49 1
+13 50 1
+13 51 1
+13 52 1
+13 53 1
+13 54 1
+13 55 1
+13 56 1
+13 57 1
+13 58 1
+13 59 1
+13 60 1
+13 61 1
+13 62 1
+13 63 1
+13 64 1
+13 331 1
+13 332 1
+13 333 1
+13 334 1
+13 335 1
+13 336 1
+13 337 1
+13 338 1
+13 339 1
+13 340 1
+13 341 1
+13 342 1
+13 343 1
+13 344 1
+13 345 1
+13 346 1
+13 347 1
+13 348 1
+13 349 1
+13 350 1
+13 351 1
+13 352 1
+13 353 1
+13 354 1
+13 355 1
+13 356 1
+13 357 1
+13 358 1
+13 415 1
+13 416 1
+13 417 1
+13 418 1
+13 419 1
+13 420 1
+13 421 1
+13 422 1
+13 423 1
+13 424 1
+13 425 1
+13 426 1
+13 427 1
+13 428 1
+13 429 1
+13 430 1
+13 431 1
+13 432 1
+13 433 1
+13 434 1
+13 435 1
+13 436 1
+13 437 1
+13 438 1
+13 439 1
+13 440 1
+13 441 1
+13 442 1
+13 443 1
+13 444 1
+13 445 1
+13 446 1
+13 447 1
+13 448 1
+13 449 1
+13 450 1
+13 451 1
+13 452 1
+13 453 1
+13 454 1
+13 455 1
+13 456 1
+13 457 1
+13 458 1
+13 459 1
+13 460 1
+13 461 1
+13 462 1
+13 463 1
+13 464 1
+13 465 1
+13 466 1
+13 467 1
+13 468 1
+13 469 1
+13 470 1
+14 1 1
+14 9 1
+14 10 1
+14 11 1
+14 12 1
+14 13 1
+14 14 1
+14 15 1
+14 37 1
+14 38 1
+14 39 1
+14 40 1
+14 41 1
+14 42 1
+14 43 1
+14 65 1
+14 66 1
+14 67 1
+14 68 1
+14 69 1
+14 70 1
+14 71 1
+14 72 1
+14 73 1
+14 74 1
+14 75 1
+14 76 1
+14 77 1
+14 78 1
+14 79 1
+14 80 1
+14 81 1
+14 82 1
+14 83 1
+14 84 1
+14 85 1
+14 331 1
+14 332 1
+14 333 1
+14 334 1
+14 335 1
+14 336 1
+14 337 1
+14 359 1
+14 360 1
+14 361 1
+14 362 1
+14 363 1
+14 364 1
+14 365 1
+14 366 1
+14 367 1
+14 368 1
+14 369 1
+14 370 1
+14 371 1
+14 372 1
+14 373 1
+14 374 1
+14 375 1
+14 376 1
+14 377 1
+14 378 1
+14 379 1
+14 415 1
+14 416 1
+14 417 1
+14 418 1
+14 419 1
+14 420 1
+14 421 1
+14 422 1
+14 423 1
+14 424 1
+14 425 1
+14 426 1
+14 427 1
+14 428 1
+14 429 1
+14 430 1
+14 431 1
+14 432 1
+14 433 1
+14 434 1
+14 435 1
+14 471 1
+14 472 1
+14 473 1
+14 474 1
+14 475 1
+14 476 1
+14 477 1
+14 478 1
+14 479 1
+14 480 1
+14 481 1
+14 482 1
+14 483 1
+14 484 1
+14 485 1
+14 486 1
+14 487 1
+14 488 1
+14 489 1
+14 490 1
+14 491 1
+14 492 1
+14 493 1
+14 494 1
+14 495 1
+14 496 1
+14 497 1
+14 498 1
+14 499 1
+14 500 1
+14 501 1
+14 502 1
+14 503 1
+14 504 1
+14 505 1
+15 2 1
+15 9 1
+15 16 1
+15 17 1
+15 18 1
+15 19 1
+15 20 1
+15 21 1
+15 37 1
+15 44 1
+15 45 1
+15 46 1
+15 47 1
+15 48 1
+15 49 1
+15 65 1
+15 66 1
+15 67 1
+15 68 1
+15 69 1
+15 70 1
+15 86 1
+15 87 1
+15 88 1
+15 89 1
+15 90 1
+15 91 1
+15 92 1
+15 93 1
+15 94 1
+15 95 1
+15 96 1
+15 97 1
+15 98 1
+15 99 1
+15 100 1
+15 331 1
+15 338 1
+15 339 1
+15 340 1
+15 341 1
+15 342 1
+15 343 1
+15 359 1
+15 360 1
+15 361 1
+15 362 1
+15 363 1
+15 364 1
+15 380 1
+15 381 1
+15 382 1
+15 383 1
+15 384 1
+15 385 1
+15 386 1
+15 387 1
+15 388 1
+15 389 1
+15 390 1
+15 391 1
+15 392 1
+15 393 1
+15 394 1
+15 415 1
+15 416 1
+15 417 1
+15 418 1
+15 419 1
+15 420 1
+15 436 1
+15 437 1
+15 438 1
+15 439 1
+15 440 1
+15 441 1
+15 442 1
+15 443 1
+15 444 1
+15 445 1
+15 446 1
+15 447 1
+15 448 1
+15 449 1
+15 450 1
+15 471 1
+15 472 1
+15 473 1
+15 474 1
+15 475 1
+15 476 1
+15 477 1
+15 478 1
+15 479 1
+15 480 1
+15 481 1
+15 482 1
+15 483 1
+15 484 1
+15 485 1
+15 506 1
+15 507 1
+15 508 1
+15 509 1
+15 510 1
+15 511 1
+15 512 1
+15 513 1
+15 514 1
+15 515 1
+15 516 1
+15 517 1
+15 518 1
+15 519 1
+15 520 1
+15 521 1
+15 522 1
+15 523 1
+15 524 1
+15 525 1
+16 3 1
+16 10 1
+16 16 1
+16 22 1
+16 23 1
+16 24 1
+16 25 1
+16 26 1
+16 38 1
+16 44 1
+16 50 1
+16 51 1
+16 52 1
+16 53 1
+16 54 1
+16 65 1
+16 71 1
+16 72 1
+16 73 1
+16 74 1
+16 75 1
+16 86 1
+16 87 1
+16 88 1
+16 89 1
+16 90 1
+16 101 1
+16 102 1
+16 103 1
+16 104 1
+16 105 1
+16 106 1
+16 107 1
+16 108 1
+16 109 1
+16 110 1
+16 332 1
+16 338 1
+16 344 1
+16 345 1
+16 346 1
+16 347 1
+16 348 1
+16 359 1
+16 365 1
+16 366 1
+16 367 1
+16 368 1
+16 369 1
+16 380 1
+16 381 1
+16 382 1
+16 383 1
+16 384 1
+16 395 1
+16 396 1
+16 397 1
+16 398 1
+16 399 1
+16 400 1
+16 401 1
+16 402 1
+16 403 1
+16 404 1
+16 415 1
+16 421 1
+16 422 1
+16 423 1
+16 424 1
+16 425 1
+16 436 1
+16 437 1
+16 438 1
+16 439 1
+16 440 1
+16 451 1
+16 452 1
+16 453 1
+16 454 1
+16 455 1
+16 456 1
+16 457 1
+16 458 1
+16 459 1
+16 460 1
+16 471 1
+16 472 1
+16 473 1
+16 474 1
+16 475 1
+16 486 1
+16 487 1
+16 488 1
+16 489 1
+16 490 1
+16 491 1
+16 492 1
+16 493 1
+16 494 1
+16 495 1
+16 506 1
+16 507 1
+16 508 1
+16 509 1
+16 510 1
+16 511 1
+16 512 1
+16 513 1
+16 514 1
+16 515 1
+16 526 1
+16 527 1
+16 528 1
+16 529 1
+16 530 1
+16 531 1
+16 532 1
+16 533 1
+16 534 1
+16 535 1
+17 4 1
+17 11 1
+17 17 1
+17 22 1
+17 27 1
+17 28 1
+17 29 1
+17 30 1
+17 39 1
+17 45 1
+17 50 1
+17 55 1
+17 56 1
+17 57 1
+17 58 1
+17 66 1
+17 71 1
+17 76 1
+17 77 1
+17 78 1
+17 79 1
+17 86 1
+17 91 1
+17 92 1
+17 93 1
+17 94 1
+17 101 1
+17 102 1
+17 103 1
+17 104 1
+17 111 1
+17 112 1
+17 113 1
+17 114 1
+17 115 1
+17 116 1
+17 333 1
+17 339 1
+17 344 1
+17 349 1
+17 350 1
+17 351 1
+17 352 1
+17 360 1
+17 365 1
+17 370 1
+17 371 1
+17 372 1
+17 373 1
+17 380 1
+17 385 1
+17 386 1
+17 387 1
+17 388 1
+17 395 1
+17 396 1
+17 397 1
+17 398 1
+17 405 1
+17 406 1
+17 407 1
+17 408 1
+17 409 1
+17 410 1
+17 416 1
+17 421 1
+17 426 1
+17 427 1
+17 428 1
+17 429 1
+17 436 1
+17 441 1
+17 442 1
+17 443 1
+17 444 1
+17 451 1
+17 452 1
+17 453 1
+17 454 1
+17 461 1
+17 462 1
+17 463 1
+17 464 1
+17 465 1
+17 466 1
+17 471 1
+17 476 1
+17 477 1
+17 478 1
+17 479 1
+17 486 1
+17 487 1
+17 488 1
+17 489 1
+17 496 1
+17 497 1
+17 498 1
+17 499 1
+17 500 1
+17 501 1
+17 506 1
+17 507 1
+17 508 1
+17 509 1
+17 516 1
+17 517 1
+17 518 1
+17 519 1
+17 520 1
+17 521 1
+17 526 1
+17 527 1
+17 528 1
+17 529 1
+17 530 1
+17 531 1
+17 536 1
+17 537 1
+17 538 1
+17 539 1
+18 5 1
+18 12 1
+18 18 1
+18 23 1
+18 27 1
+18 31 1
+18 32 1
+18 33 1
+18 40 1
+18 46 1
+18 51 1
+18 55 1
+18 59 1
+18 60 1
+18 61 1
+18 67 1
+18 72 1
+18 76 1
+18 80 1
+18 81 1
+18 82 1
+18 87 1
+18 91 1
+18 95 1
+18 96 1
+18 97 1
+18 101 1
+18 105 1
+18 106 1
+18 107 1
+18 111 1
+18 112 1
+18 113 1
+18 117 1
+18 118 1
+18 119 1
+18 334 1
+18 340 1
+18 345 1
+18 349 1
+18 353 1
+18 354 1
+18 355 1
+18 361 1
+18 366 1
+18 370 1
+18 374 1
+18 375 1
+18 376 1
+18 381 1
+18 385 1
+18 389 1
+18 390 1
+18 391 1
+18 395 1
+18 399 1
+18 400 1
+18 401 1
+18 405 1
+18 406 1
+18 407 1
+18 411 1
+18 412 1
+18 413 1
+18 417 1
+18 422 1
+18 426 1
+18 430 1
+18 431 1
+18 432 1
+18 437 1
+18 441 1
+18 445 1
+18 446 1
+18 447 1
+18 451 1
+18 455 1
+18 456 1
+18 457 1
+18 461 1
+18 462 1
+18 463 1
+18 467 1
+18 468 1
+18 469 1
+18 472 1
+18 476 1
+18 480 1
+18 481 1
+18 482 1
+18 486 1
+18 490 1
+18 491 1
+18 492 1
+18 496 1
+18 497 1
+18 498 1
+18 502 1
+18 503 1
+18 504 1
+18 506 1
+18 510 1
+18 511 1
+18 512 1
+18 516 1
+18 517 1
+18 518 1
+18 522 1
+18 523 1
+18 524 1
+18 526 1
+18 527 1
+18 528 1
+18 532 1
+18 533 1
+18 534 1
+18 536 1
+18 537 1
+18 538 1
+18 540 1
+19 6 1
+19 13 1
+19 19 1
+19 24 1
+19 28 1
+19 31 1
+19 34 1
+19 35 1
+19 41 1
+19 47 1
+19 52 1
+19 56 1
+19 59 1
+19 62 1
+19 63 1
+19 68 1
+19 73 1
+19 77 1
+19 80 1
+19 83 1
+19 84 1
+19 88 1
+19 92 1
+19 95 1
+19 98 1
+19 99 1
+19 102 1
+19 105 1
+19 108 1
+19 109 1
+19 111 1
+19 114 1
+19 115 1
+19 117 1
+19 118 1
+19 120 1
+19 335 1
+19 341 1
+19 346 1
+19 350 1
+19 353 1
+19 356 1
+19 357 1
+19 362 1
+19 367 1
+19 371 1
+19 374 1
+19 377 1
+19 378 1
+19 382 1
+19 386 1
+19 389 1
+19 392 1
+19 393 1
+19 396 1
+19 399 1
+19 402 1
+19 403 1
+19 405 1
+19 408 1
+19 409 1
+19 411 1
+19 412 1
+19 414 1
+19 418 1
+19 423 1
+19 427 1
+19 430 1
+19 433 1
+19 434 1
+19 438 1
+19 442 1
+19 445 1
+19 448 1
+19 449 1
+19 452 1
+19 455 1
+19 458 1
+19 459 1
+19 461 1
+19 464 1
+19 465 1
+19 467 1
+19 468 1
+19 470 1
+19 473 1
+19 477 1
+19 480 1
+19 483 1
+19 484 1
+19 487 1
+19 490 1
+19 493 1
+19 494 1
+19 496 1
+19 499 1
+19 500 1
+19 502 1
+19 503 1
+19 505 1
+19 507 1
+19 510 1
+19 513 1
+19 514 1
+19 516 1
+19 519 1
+19 520 1
+19 522 1
+19 523 1
+19 525 1
+19 526 1
+19 529 1
+19 530 1
+19 532 1
+19 533 1
+19 535 1
+19 536 1
+19 537 1
+19 539 1
+19 540 1
+20 7 1
+20 14 1
+20 20 1
+20 25 1
+20 29 1
+20 32 1
+20 34 1
+20 36 1
+20 42 1
+20 48 1
+20 53 1
+20 57 1
+20 60 1
+20 62 1
+20 64 1
+20 69 1
+20 74 1
+20 78 1
+20 81 1
+20 83 1
+20 85 1
+20 89 1
+20 93 1
+20 96 1
+20 98 1
+20 100 1
+20 103 1
+20 106 1
+20 108 1
+20 110 1
+20 112 1
+20 114 1
+20 116 1
+20 117 1
+20 119 1
+20 120 1
+20 336 1
+20 342 1
+20 347 1
+20 351 1
+20 354 1
+20 356 1
+20 358 1
+20 363 1
+20 368 1
+20 372 1
+20 375 1
+20 377 1
+20 379 1
+20 383 1
+20 387 1
+20 390 1
+20 392 1
+20 394 1
+20 397 1
+20 400 1
+20 402 1
+20 404 1
+20 406 1
+20 408 1
+20 410 1
+20 411 1
+20 413 1
+20 414 1
+20 419 1
+20 424 1
+20 428 1
+20 431 1
+20 433 1
+20 435 1
+20 439 1
+20 443 1
+20 446 1
+20 448 1
+20 450 1
+20 453 1
+20 456 1
+20 458 1
+20 460 1
+20 462 1
+20 464 1
+20 466 1
+20 467 1
+20 469 1
+20 470 1
+20 474 1
+20 478 1
+20 481 1
+20 483 1
+20 485 1
+20 488 1
+20 491 1
+20 493 1
+20 495 1
+20 497 1
+20 499 1
+20 501 1
+20 502 1
+20 504 1
+20 505 1
+20 508 1
+20 511 1
+20 513 1
+20 515 1
+20 517 1
+20 519 1
+20 521 1
+20 522 1
+20 524 1
+20 525 1
+20 527 1
+20 529 1
+20 531 1
+20 532 1
+20 534 1
+20 535 1
+20 536 1
+20 538 1
+20 539 1
+20 540 1
+21 8 1
+21 15 1
+21 21 1
+21 26 1
+21 30 1
+21 33 1
+21 35 1
+21 36 1
+21 43 1
+21 49 1
+21 54 1
+21 58 1
+21 61 1
+21 63 1
+21 64 1
+21 70 1
+21 75 1
+21 79 1
+21 82 1
+21 84 1
+21 85 1
+21 90 1
+21 94 1
+21 97 1
+21 99 1
+21 100 1
+21 104 1
+21 107 1
+21 109 1
+21 110 1
+21 113 1
+21 115 1
+21 116 1
+21 118 1
+21 119 1
+21 120 1
+21 337 1
+21 343 1
+21 348 1
+21 352 1
+21 355 1
+21 357 1
+21 358 1
+21 364 1
+21 369 1
+21 373 1
+21 376 1
+21 378 1
+21 379 1
+21 384 1
+21 388 1
+21 391 1
+21 393 1
+21 394 1
+21 398 1
+21 401 1
+21 403 1
+21 404 1
+21 407 1
+21 409 1
+21 410 1
+21 412 1
+21 413 1
+21 414 1
+21 420 1
+21 425 1
+21 429 1
+21 432 1
+21 434 1
+21 435 1
+21 440 1
+21 444 1
+21 447 1
+21 449 1
+21 450 1
+21 454 1
+21 457 1
+21 459 1
+21 460 1
+21 463 1
+21 465 1
+21 466 1
+21 468 1
+21 469 1
+21 470 1
+21 475 1
+21 479 1
+21 482 1
+21 484 1
+21 485 1
+21 489 1
+21 492 1
+21 494 1
+21 495 1
+21 498 1
+21 500 1
+21 501 1
+21 503 1
+21 504 1
+21 505 1
+21 509 1
+21 512 1
+21 514 1
+21 515 1
+21 518 1
+21 520 1
+21 521 1
+21 523 1
+21 524 1
+21 525 1
+21 528 1
+21 530 1
+21 531 1
+21 533 1
+21 534 1
+21 535 1
+21 537 1
+21 538 1
+21 539 1
+21 540 1
+22 1 1
+22 2 1
+22 3 1
+22 4 1
+22 5 1
+22 6 1
+22 7 1
+22 8 1
+22 121 1
+22 122 1
+22 123 1
+22 124 1
+22 125 1
+22 126 1
+22 127 1
+22 128 1
+22 129 1
+22 130 1
+22 131 1
+22 132 1
+22 133 1
+22 134 1
+22 135 1
+22 136 1
+22 137 1
+22 138 1
+22 139 1
+22 140 1
+22 141 1
+22 142 1
+22 143 1
+22 144 1
+22 145 1
+22 146 1
+22 147 1
+22 148 1
+22 331 1
+22 332 1
+22 333 1
+22 334 1
+22 335 1
+22 336 1
+22 337 1
+22 338 1
+22 339 1
+22 340 1
+22 341 1
+22 342 1
+22 343 1
+22 344 1
+22 345 1
+22 346 1
+22 347 1
+22 348 1
+22 349 1
+22 350 1
+22 351 1
+22 352 1
+22 353 1
+22 354 1
+22 355 1
+22 356 1
+22 357 1
+22 358 1
+22 541 1
+22 542 1
+22 543 1
+22 544 1
+22 545 1
+22 546 1
+22 547 1
+22 548 1
+22 549 1
+22 550 1
+22 551 1
+22 552 1
+22 553 1
+22 554 1
+22 555 1
+22 556 1
+22 557 1
+22 558 1
+22 559 1
+22 560 1
+22 561 1
+22 562 1
+22 563 1
+22 564 1
+22 565 1
+22 566 1
+22 567 1
+22 568 1
+22 569 1
+22 570 1
+22 571 1
+22 572 1
+22 573 1
+22 574 1
+22 575 1
+22 576 1
+22 577 1
+22 578 1
+22 579 1
+22 580 1
+22 581 1
+22 582 1
+22 583 1
+22 584 1
+22 585 1
+22 586 1
+22 587 1
+22 588 1
+22 589 1
+22 590 1
+22 591 1
+22 592 1
+22 593 1
+22 594 1
+22 595 1
+22 596 1
+23 1 1
+23 9 1
+23 10 1
+23 11 1
+23 12 1
+23 13 1
+23 14 1
+23 15 1
+23 121 1
+23 122 1
+23 123 1
+23 124 1
+23 125 1
+23 126 1
+23 127 1
+23 149 1
+23 150 1
+23 151 1
+23 152 1
+23 153 1
+23 154 1
+23 155 1
+23 156 1
+23 157 1
+23 158 1
+23 159 1
+23 160 1
+23 161 1
+23 162 1
+23 163 1
+23 164 1
+23 165 1
+23 166 1
+23 167 1
+23 168 1
+23 169 1
+23 331 1
+23 332 1
+23 333 1
+23 334 1
+23 335 1
+23 336 1
+23 337 1
+23 359 1
+23 360 1
+23 361 1
+23 362 1
+23 363 1
+23 364 1
+23 365 1
+23 366 1
+23 367 1
+23 368 1
+23 369 1
+23 370 1
+23 371 1
+23 372 1
+23 373 1
+23 374 1
+23 375 1
+23 376 1
+23 377 1
+23 378 1
+23 379 1
+23 541 1
+23 542 1
+23 543 1
+23 544 1
+23 545 1
+23 546 1
+23 547 1
+23 548 1
+23 549 1
+23 550 1
+23 551 1
+23 552 1
+23 553 1
+23 554 1
+23 555 1
+23 556 1
+23 557 1
+23 558 1
+23 559 1
+23 560 1
+23 561 1
+23 597 1
+23 598 1
+23 599 1
+23 600 1
+23 601 1
+23 602 1
+23 603 1
+23 604 1
+23 605 1
+23 606 1
+23 607 1
+23 608 1
+23 609 1
+23 610 1
+23 611 1
+23 612 1
+23 613 1
+23 614 1
+23 615 1
+23 616 1
+23 617 1
+23 618 1
+23 619 1
+23 620 1
+23 621 1
+23 622 1
+23 623 1
+23 624 1
+23 625 1
+23 626 1
+23 627 1
+23 628 1
+23 629 1
+23 630 1
+23 631 1
+24 2 1
+24 9 1
+24 16 1
+24 17 1
+24 18 1
+24 19 1
+24 20 1
+24 21 1
+24 121 1
+24 128 1
+24 129 1
+24 130 1
+24 131 1
+24 132 1
+24 133 1
+24 149 1
+24 150 1
+24 151 1
+24 152 1
+24 153 1
+24 154 1
+24 170 1
+24 171 1
+24 172 1
+24 173 1
+24 174 1
+24 175 1
+24 176 1
+24 177 1
+24 178 1
+24 179 1
+24 180 1
+24 181 1
+24 182 1
+24 183 1
+24 184 1
+24 331 1
+24 338 1
+24 339 1
+24 340 1
+24 341 1
+24 342 1
+24 343 1
+24 359 1
+24 360 1
+24 361 1
+24 362 1
+24 363 1
+24 364 1
+24 380 1
+24 381 1
+24 382 1
+24 383 1
+24 384 1
+24 385 1
+24 386 1
+24 387 1
+24 388 1
+24 389 1
+24 390 1
+24 391 1
+24 392 1
+24 393 1
+24 394 1
+24 541 1
+24 542 1
+24 543 1
+24 544 1
+24 545 1
+24 546 1
+24 562 1
+24 563 1
+24 564 1
+24 565 1
+24 566 1
+24 567 1
+24 568 1
+24 569 1
+24 570 1
+24 571 1
+24 572 1
+24 573 1
+24 574 1
+24 575 1
+24 576 1
+24 597 1
+24 598 1
+24 599 1
+24 600 1
+24 601 1
+24 602 1
+24 603 1
+24 604 1
+24 605 1
+24 606 1
+24 607 1
+24 608 1
+24 609 1
+24 610 1
+24 611 1
+24 632 1
+24 633 1
+24 634 1
+24 635 1
+24 636 1
+24 637 1
+24 638 1
+24 639 1
+24 640 1
+24 641 1
+24 642 1
+24 643 1
+24 644 1
+24 645 1
+24 646 1
+24 647 1
+24 648 1
+24 649 1
+24 650 1
+24 651 1
+25 3 1
+25 10 1
+25 16 1
+25 22 1
+25 23 1
+25 24 1
+25 25 1
+25 26 1
+25 122 1
+25 128 1
+25 134 1
+25 135 1
+25 136 1
+25 137 1
+25 138 1
+25 149 1
+25 155 1
+25 156 1
+25 157 1
+25 158 1
+25 159 1
+25 170 1
+25 171 1
+25 172 1
+25 173 1
+25 174 1
+25 185 1
+25 186 1
+25 187 1
+25 188 1
+25 189 1
+25 190 1
+25 191 1
+25 192 1
+25 193 1
+25 194 1
+25 332 1
+25 338 1
+25 344 1
+25 345 1
+25 346 1
+25 347 1
+25 348 1
+25 359 1
+25 365 1
+25 366 1
+25 367 1
+25 368 1
+25 369 1
+25 380 1
+25 381 1
+25 382 1
+25 383 1
+25 384 1
+25 395 1
+25 396 1
+25 397 1
+25 398 1
+25 399 1
+25 400 1
+25 401 1
+25 402 1
+25 403 1
+25 404 1
+25 541 1
+25 547 1
+25 548 1
+25 549 1
+25 550 1
+25 551 1
+25 562 1
+25 563 1
+25 564 1
+25 565 1
+25 566 1
+25 577 1
+25 578 1
+25 579 1
+25 580 1
+25 581 1
+25 582 1
+25 583 1
+25 584 1
+25 585 1
+25 586 1
+25 597 1
+25 598 1
+25 599 1
+25 600 1
+25 601 1
+25 612 1
+25 613 1
+25 614 1
+25 615 1
+25 616 1
+25 617 1
+25 618 1
+25 619 1
+25 620 1
+25 621 1
+25 632 1
+25 633 1
+25 634 1
+25 635 1
+25 636 1
+25 637 1
+25 638 1
+25 639 1
+25 640 1
+25 641 1
+25 652 1
+25 653 1
+25 654 1
+25 655 1
+25 656 1
+25 657 1
+25 658 1
+25 659 1
+25 660 1
+25 661 1
+26 4 1
+26 11 1
+26 17 1
+26 22 1
+26 27 1
+26 28 1
+26 29 1
+26 30 1
+26 123 1
+26 129 1
+26 134 1
+26 139 1
+26 140 1
+26 141 1
+26 142 1
+26 150 1
+26 155 1
+26 160 1
+26 161 1
+26 162 1
+26 163 1
+26 170 1
+26 175 1
+26 176 1
+26 177 1
+26 178 1
+26 185 1
+26 186 1
+26 187 1
+26 188 1
+26 195 1
+26 196 1
+26 197 1
+26 198 1
+26 199 1
+26 200 1
+26 333 1
+26 339 1
+26 344 1
+26 349 1
+26 350 1
+26 351 1
+26 352 1
+26 360 1
+26 365 1
+26 370 1
+26 371 1
+26 372 1
+26 373 1
+26 380 1
+26 385 1
+26 386 1
+26 387 1
+26 388 1
+26 395 1
+26 396 1
+26 397 1
+26 398 1
+26 405 1
+26 406 1
+26 407 1
+26 408 1
+26 409 1
+26 410 1
+26 542 1
+26 547 1
+26 552 1
+26 553 1
+26 554 1
+26 555 1
+26 562 1
+26 567 1
+26 568 1
+26 569 1
+26 570 1
+26 577 1
+26 578 1
+26 579 1
+26 580 1
+26 587 1
+26 588 1
+26 589 1
+26 590 1
+26 591 1
+26 592 1
+26 597 1
+26 602 1
+26 603 1
+26 604 1
+26 605 1
+26 612 1
+26 613 1
+26 614 1
+26 615 1
+26 622 1
+26 623 1
+26 624 1
+26 625 1
+26 626 1
+26 627 1
+26 632 1
+26 633 1
+26 634 1
+26 635 1
+26 642 1
+26 643 1
+26 644 1
+26 645 1
+26 646 1
+26 647 1
+26 652 1
+26 653 1
+26 654 1
+26 655 1
+26 656 1
+26 657 1
+26 662 1
+26 663 1
+26 664 1
+26 665 1
+27 5 1
+27 12 1
+27 18 1
+27 23 1
+27 27 1
+27 31 1
+27 32 1
+27 33 1
+27 124 1
+27 130 1
+27 135 1
+27 139 1
+27 143 1
+27 144 1
+27 145 1
+27 151 1
+27 156 1
+27 160 1
+27 164 1
+27 165 1
+27 166 1
+27 171 1
+27 175 1
+27 179 1
+27 180 1
+27 181 1
+27 185 1
+27 189 1
+27 190 1
+27 191 1
+27 195 1
+27 196 1
+27 197 1
+27 201 1
+27 202 1
+27 203 1
+27 334 1
+27 340 1
+27 345 1
+27 349 1
+27 353 1
+27 354 1
+27 355 1
+27 361 1
+27 366 1
+27 370 1
+27 374 1
+27 375 1
+27 376 1
+27 381 1
+27 385 1
+27 389 1
+27 390 1
+27 391 1
+27 395 1
+27 399 1
+27 400 1
+27 401 1
+27 405 1
+27 406 1
+27 407 1
+27 411 1
+27 412 1
+27 413 1
+27 543 1
+27 548 1
+27 552 1
+27 556 1
+27 557 1
+27 558 1
+27 563 1
+27 567 1
+27 571 1
+27 572 1
+27 573 1
+27 577 1
+27 581 1
+27 582 1
+27 583 1
+27 587 1
+27 588 1
+27 589 1
+27 593 1
+27 594 1
+27 595 1
+27 598 1
+27 602 1
+27 606 1
+27 607 1
+27 608 1
+27 612 1
+27 616 1
+27 617 1
+27 618 1
+27 622 1
+27 623 1
+27 624 1
+27 628 1
+27 629 1
+27 630 1
+27 632 1
+27 636 1
+27 637 1
+27 638 1
+27 642 1
+27 643 1
+27 644 1
+27 648 1
+27 649 1
+27 650 1
+27 652 1
+27 653 1
+27 654 1
+27 658 1
+27 659 1
+27 660 1
+27 662 1
+27 663 1
+27 664 1
+27 666 1
+28 6 1
+28 13 1
+28 19 1
+28 24 1
+28 28 1
+28 31 1
+28 34 1
+28 35 1
+28 125 1
+28 131 1
+28 136 1
+28 140 1
+28 143 1
+28 146 1
+28 147 1
+28 152 1
+28 157 1
+28 161 1
+28 164 1
+28 167 1
+28 168 1
+28 172 1
+28 176 1
+28 179 1
+28 182 1
+28 183 1
+28 186 1
+28 189 1
+28 192 1
+28 193 1
+28 195 1
+28 198 1
+28 199 1
+28 201 1
+28 202 1
+28 204 1
+28 335 1
+28 341 1
+28 346 1
+28 350 1
+28 353 1
+28 356 1
+28 357 1
+28 362 1
+28 367 1
+28 371 1
+28 374 1
+28 377 1
+28 378 1
+28 382 1
+28 386 1
+28 389 1
+28 392 1
+28 393 1
+28 396 1
+28 399 1
+28 402 1
+28 403 1
+28 405 1
+28 408 1
+28 409 1
+28 411 1
+28 412 1
+28 414 1
+28 544 1
+28 549 1
+28 553 1
+28 556 1
+28 559 1
+28 560 1
+28 564 1
+28 568 1
+28 571 1
+28 574 1
+28 575 1
+28 578 1
+28 581 1
+28 584 1
+28 585 1
+28 587 1
+28 590 1
+28 591 1
+28 593 1
+28 594 1
+28 596 1
+28 599 1
+28 603 1
+28 606 1
+28 609 1
+28 610 1
+28 613 1
+28 616 1
+28 619 1
+28 620 1
+28 622 1
+28 625 1
+28 626 1
+28 628 1
+28 629 1
+28 631 1
+28 633 1
+28 636 1
+28 639 1
+28 640 1
+28 642 1
+28 645 1
+28 646 1
+28 648 1
+28 649 1
+28 651 1
+28 652 1
+28 655 1
+28 656 1
+28 658 1
+28 659 1
+28 661 1
+28 662 1
+28 663 1
+28 665 1
+28 666 1
+29 7 1
+29 14 1
+29 20 1
+29 25 1
+29 29 1
+29 32 1
+29 34 1
+29 36 1
+29 126 1
+29 132 1
+29 137 1
+29 141 1
+29 144 1
+29 146 1
+29 148 1
+29 153 1
+29 158 1
+29 162 1
+29 165 1
+29 167 1
+29 169 1
+29 173 1
+29 177 1
+29 180 1
+29 182 1
+29 184 1
+29 187 1
+29 190 1
+29 192 1
+29 194 1
+29 196 1
+29 198 1
+29 200 1
+29 201 1
+29 203 1
+29 204 1
+29 336 1
+29 342 1
+29 347 1
+29 351 1
+29 354 1
+29 356 1
+29 358 1
+29 363 1
+29 368 1
+29 372 1
+29 375 1
+29 377 1
+29 379 1
+29 383 1
+29 387 1
+29 390 1
+29 392 1
+29 394 1
+29 397 1
+29 400 1
+29 402 1
+29 404 1
+29 406 1
+29 408 1
+29 410 1
+29 411 1
+29 413 1
+29 414 1
+29 545 1
+29 550 1
+29 554 1
+29 557 1
+29 559 1
+29 561 1
+29 565 1
+29 569 1
+29 572 1
+29 574 1
+29 576 1
+29 579 1
+29 582 1
+29 584 1
+29 586 1
+29 588 1
+29 590 1
+29 592 1
+29 593 1
+29 595 1
+29 596 1
+29 600 1
+29 604 1
+29 607 1
+29 609 1
+29 611 1
+29 614 1
+29 617 1
+29 619 1
+29 621 1
+29 623 1
+29 625 1
+29 627 1
+29 628 1
+29 630 1
+29 631 1
+29 634 1
+29 637 1
+29 639 1
+29 641 1
+29 643 1
+29 645 1
+29 647 1
+29 648 1
+29 650 1
+29 651 1
+29 653 1
+29 655 1
+29 657 1
+29 658 1
+29 660 1
+29 661 1
+29 662 1
+29 664 1
+29 665 1
+29 666 1
+30 8 1
+30 15 1
+30 21 1
+30 26 1
+30 30 1
+30 33 1
+30 35 1
+30 36 1
+30 127 1
+30 133 1
+30 138 1
+30 142 1
+30 145 1
+30 147 1
+30 148 1
+30 154 1
+30 159 1
+30 163 1
+30 166 1
+30 168 1
+30 169 1
+30 174 1
+30 178 1
+30 181 1
+30 183 1
+30 184 1
+30 188 1
+30 191 1
+30 193 1
+30 194 1
+30 197 1
+30 199 1
+30 200 1
+30 202 1
+30 203 1
+30 204 1
+30 337 1
+30 343 1
+30 348 1
+30 352 1
+30 355 1
+30 357 1
+30 358 1
+30 364 1
+30 369 1
+30 373 1
+30 376 1
+30 378 1
+30 379 1
+30 384 1
+30 388 1
+30 391 1
+30 393 1
+30 394 1
+30 398 1
+30 401 1
+30 403 1
+30 404 1
+30 407 1
+30 409 1
+30 410 1
+30 412 1
+30 413 1
+30 414 1
+30 546 1
+30 551 1
+30 555 1
+30 558 1
+30 560 1
+30 561 1
+30 566 1
+30 570 1
+30 573 1
+30 575 1
+30 576 1
+30 580 1
+30 583 1
+30 585 1
+30 586 1
+30 589 1
+30 591 1
+30 592 1
+30 594 1
+30 595 1
+30 596 1
+30 601 1
+30 605 1
+30 608 1
+30 610 1
+30 611 1
+30 615 1
+30 618 1
+30 620 1
+30 621 1
+30 624 1
+30 626 1
+30 627 1
+30 629 1
+30 630 1
+30 631 1
+30 635 1
+30 638 1
+30 640 1
+30 641 1
+30 644 1
+30 646 1
+30 647 1
+30 649 1
+30 650 1
+30 651 1
+30 654 1
+30 656 1
+30 657 1
+30 659 1
+30 660 1
+30 661 1
+30 663 1
+30 664 1
+30 665 1
+30 666 1
+31 1 1
+31 37 1
+31 38 1
+31 39 1
+31 40 1
+31 41 1
+31 42 1
+31 43 1
+31 121 1
+31 122 1
+31 123 1
+31 124 1
+31 125 1
+31 126 1
+31 127 1
+31 205 1
+31 206 1
+31 207 1
+31 208 1
+31 209 1
+31 210 1
+31 211 1
+31 212 1
+31 213 1
+31 214 1
+31 215 1
+31 216 1
+31 217 1
+31 218 1
+31 219 1
+31 220 1
+31 221 1
+31 222 1
+31 223 1
+31 224 1
+31 225 1
+31 331 1
+31 332 1
+31 333 1
+31 334 1
+31 335 1
+31 336 1
+31 337 1
+31 415 1
+31 416 1
+31 417 1
+31 418 1
+31 419 1
+31 420 1
+31 421 1
+31 422 1
+31 423 1
+31 424 1
+31 425 1
+31 426 1
+31 427 1
+31 428 1
+31 429 1
+31 430 1
+31 431 1
+31 432 1
+31 433 1
+31 434 1
+31 435 1
+31 541 1
+31 542 1
+31 543 1
+31 544 1
+31 545 1
+31 546 1
+31 547 1
+31 548 1
+31 549 1
+31 550 1
+31 551 1
+31 552 1
+31 553 1
+31 554 1
+31 555 1
+31 556 1
+31 557 1
+31 558 1
+31 559 1
+31 560 1
+31 561 1
+31 667 1
+31 668 1
+31 669 1
+31 670 1
+31 671 1
+31 672 1
+31 673 1
+31 674 1
+31 675 1
+31 676 1
+31 677 1
+31 678 1
+31 679 1
+31 680 1
+31 681 1
+31 682 1
+31 683 1
+31 684 1
+31 685 1
+31 686 1
+31 687 1
+31 688 1
+31 689 1
+31 690 1
+31 691 1
+31 692 1
+31 693 1
+31 694 1
+31 695 1
+31 696 1
+31 697 1
+31 698 1
+31 699 1
+31 700 1
+31 701 1
+32 2 1
+32 37 1
+32 44 1
+32 45 1
+32 46 1
+32 47 1
+32 48 1
+32 49 1
+32 121 1
+32 128 1
+32 129 1
+32 130 1
+32 131 1
+32 132 1
+32 133 1
+32 205 1
+32 206 1
+32 207 1
+32 208 1
+32 209 1
+32 210 1
+32 226 1
+32 227 1
+32 228 1
+32 229 1
+32 230 1
+32 231 1
+32 232 1
+32 233 1
+32 234 1
+32 235 1
+32 236 1
+32 237 1
+32 238 1
+32 239 1
+32 240 1
+32 331 1
+32 338 1
+32 339 1
+32 340 1
+32 341 1
+32 342 1
+32 343 1
+32 415 1
+32 416 1
+32 417 1
+32 418 1
+32 419 1
+32 420 1
+32 436 1
+32 437 1
+32 438 1
+32 439 1
+32 440 1
+32 441 1
+32 442 1
+32 443 1
+32 444 1
+32 445 1
+32 446 1
+32 447 1
+32 448 1
+32 449 1
+32 450 1
+32 541 1
+32 542 1
+32 543 1
+32 544 1
+32 545 1
+32 546 1
+32 562 1
+32 563 1
+32 564 1
+32 565 1
+32 566 1
+32 567 1
+32 568 1
+32 569 1
+32 570 1
+32 571 1
+32 572 1
+32 573 1
+32 574 1
+32 575 1
+32 576 1
+32 667 1
+32 668 1
+32 669 1
+32 670 1
+32 671 1
+32 672 1
+32 673 1
+32 674 1
+32 675 1
+32 676 1
+32 677 1
+32 678 1
+32 679 1
+32 680 1
+32 681 1
+32 702 1
+32 703 1
+32 704 1
+32 705 1
+32 706 1
+32 707 1
+32 708 1
+32 709 1
+32 710 1
+32 711 1
+32 712 1
+32 713 1
+32 714 1
+32 715 1
+32 716 1
+32 717 1
+32 718 1
+32 719 1
+32 720 1
+32 721 1
+33 3 1
+33 38 1
+33 44 1
+33 50 1
+33 51 1
+33 52 1
+33 53 1
+33 54 1
+33 122 1
+33 128 1
+33 134 1
+33 135 1
+33 136 1
+33 137 1
+33 138 1
+33 205 1
+33 211 1
+33 212 1
+33 213 1
+33 214 1
+33 215 1
+33 226 1
+33 227 1
+33 228 1
+33 229 1
+33 230 1
+33 241 1
+33 242 1
+33 243 1
+33 244 1
+33 245 1
+33 246 1
+33 247 1
+33 248 1
+33 249 1
+33 250 1
+33 332 1
+33 338 1
+33 344 1
+33 345 1
+33 346 1
+33 347 1
+33 348 1
+33 415 1
+33 421 1
+33 422 1
+33 423 1
+33 424 1
+33 425 1
+33 436 1
+33 437 1
+33 438 1
+33 439 1
+33 440 1
+33 451 1
+33 452 1
+33 453 1
+33 454 1
+33 455 1
+33 456 1
+33 457 1
+33 458 1
+33 459 1
+33 460 1
+33 541 1
+33 547 1
+33 548 1
+33 549 1
+33 550 1
+33 551 1
+33 562 1
+33 563 1
+33 564 1
+33 565 1
+33 566 1
+33 577 1
+33 578 1
+33 579 1
+33 580 1
+33 581 1
+33 582 1
+33 583 1
+33 584 1
+33 585 1
+33 586 1
+33 667 1
+33 668 1
+33 669 1
+33 670 1
+33 671 1
+33 682 1
+33 683 1
+33 684 1
+33 685 1
+33 686 1
+33 687 1
+33 688 1
+33 689 1
+33 690 1
+33 691 1
+33 702 1
+33 703 1
+33 704 1
+33 705 1
+33 706 1
+33 707 1
+33 708 1
+33 709 1
+33 710 1
+33 711 1
+33 722 1
+33 723 1
+33 724 1
+33 725 1
+33 726 1
+33 727 1
+33 728 1
+33 729 1
+33 730 1
+33 731 1
+34 4 1
+34 39 1
+34 45 1
+34 50 1
+34 55 1
+34 56 1
+34 57 1
+34 58 1
+34 123 1
+34 129 1
+34 134 1
+34 139 1
+34 140 1
+34 141 1
+34 142 1
+34 206 1
+34 211 1
+34 216 1
+34 217 1
+34 218 1
+34 219 1
+34 226 1
+34 231 1
+34 232 1
+34 233 1
+34 234 1
+34 241 1
+34 242 1
+34 243 1
+34 244 1
+34 251 1
+34 252 1
+34 253 1
+34 254 1
+34 255 1
+34 256 1
+34 333 1
+34 339 1
+34 344 1
+34 349 1
+34 350 1
+34 351 1
+34 352 1
+34 416 1
+34 421 1
+34 426 1
+34 427 1
+34 428 1
+34 429 1
+34 436 1
+34 441 1
+34 442 1
+34 443 1
+34 444 1
+34 451 1
+34 452 1
+34 453 1
+34 454 1
+34 461 1
+34 462 1
+34 463 1
+34 464 1
+34 465 1
+34 466 1
+34 542 1
+34 547 1
+34 552 1
+34 553 1
+34 554 1
+34 555 1
+34 562 1
+34 567 1
+34 568 1
+34 569 1
+34 570 1
+34 577 1
+34 578 1
+34 579 1
+34 580 1
+34 587 1
+34 588 1
+34 589 1
+34 590 1
+34 591 1
+34 592 1
+34 667 1
+34 672 1
+34 673 1
+34 674 1
+34 675 1
+34 682 1
+34 683 1
+34 684 1
+34 685 1
+34 692 1
+34 693 1
+34 694 1
+34 695 1
+34 696 1
+34 697 1
+34 702 1
+34 703 1
+34 704 1
+34 705 1
+34 712 1
+34 713 1
+34 714 1
+34 715 1
+34 716 1
+34 717 1
+34 722 1
+34 723 1
+34 724 1
+34 725 1
+34 726 1
+34 727 1
+34 732 1
+34 733 1
+34 734 1
+34 735 1
+35 5 1
+35 40 1
+35 46 1
+35 51 1
+35 55 1
+35 59 1
+35 60 1
+35 61 1
+35 124 1
+35 130 1
+35 135 1
+35 139 1
+35 143 1
+35 144 1
+35 145 1
+35 207 1
+35 212 1
+35 216 1
+35 220 1
+35 221 1
+35 222 1
+35 227 1
+35 231 1
+35 235 1
+35 236 1
+35 237 1
+35 241 1
+35 245 1
+35 246 1
+35 247 1
+35 251 1
+35 252 1
+35 253 1
+35 257 1
+35 258 1
+35 259 1
+35 334 1
+35 340 1
+35 345 1
+35 349 1
+35 353 1
+35 354 1
+35 355 1
+35 417 1
+35 422 1
+35 426 1
+35 430 1
+35 431 1
+35 432 1
+35 437 1
+35 441 1
+35 445 1
+35 446 1
+35 447 1
+35 451 1
+35 455 1
+35 456 1
+35 457 1
+35 461 1
+35 462 1
+35 463 1
+35 467 1
+35 468 1
+35 469 1
+35 543 1
+35 548 1
+35 552 1
+35 556 1
+35 557 1
+35 558 1
+35 563 1
+35 567 1
+35 571 1
+35 572 1
+35 573 1
+35 577 1
+35 581 1
+35 582 1
+35 583 1
+35 587 1
+35 588 1
+35 589 1
+35 593 1
+35 594 1
+35 595 1
+35 668 1
+35 672 1
+35 676 1
+35 677 1
+35 678 1
+35 682 1
+35 686 1
+35 687 1
+35 688 1
+35 692 1
+35 693 1
+35 694 1
+35 698 1
+35 699 1
+35 700 1
+35 702 1
+35 706 1
+35 707 1
+35 708 1
+35 712 1
+35 713 1
+35 714 1
+35 718 1
+35 719 1
+35 720 1
+35 722 1
+35 723 1
+35 724 1
+35 728 1
+35 729 1
+35 730 1
+35 732 1
+35 733 1
+35 734 1
+35 736 1
+36 6 1
+36 41 1
+36 47 1
+36 52 1
+36 56 1
+36 59 1
+36 62 1
+36 63 1
+36 125 1
+36 131 1
+36 136 1
+36 140 1
+36 143 1
+36 146 1
+36 147 1
+36 208 1
+36 213 1
+36 217 1
+36 220 1
+36 223 1
+36 224 1
+36 228 1
+36 232 1
+36 235 1
+36 238 1
+36 239 1
+36 242 1
+36 245 1
+36 248 1
+36 249 1
+36 251 1
+36 254 1
+36 255 1
+36 257 1
+36 258 1
+36 260 1
+36 335 1
+36 341 1
+36 346 1
+36 350 1
+36 353 1
+36 356 1
+36 357 1
+36 418 1
+36 423 1
+36 427 1
+36 430 1
+36 433 1
+36 434 1
+36 438 1
+36 442 1
+36 445 1
+36 448 1
+36 449 1
+36 452 1
+36 455 1
+36 458 1
+36 459 1
+36 461 1
+36 464 1
+36 465 1
+36 467 1
+36 468 1
+36 470 1
+36 544 1
+36 549 1
+36 553 1
+36 556 1
+36 559 1
+36 560 1
+36 564 1
+36 568 1
+36 571 1
+36 574 1
+36 575 1
+36 578 1
+36 581 1
+36 584 1
+36 585 1
+36 587 1
+36 590 1
+36 591 1
+36 593 1
+36 594 1
+36 596 1
+36 669 1
+36 673 1
+36 676 1
+36 679 1
+36 680 1
+36 683 1
+36 686 1
+36 689 1
+36 690 1
+36 692 1
+36 695 1
+36 696 1
+36 698 1
+36 699 1
+36 701 1
+36 703 1
+36 706 1
+36 709 1
+36 710 1
+36 712 1
+36 715 1
+36 716 1
+36 718 1
+36 719 1
+36 721 1
+36 722 1
+36 725 1
+36 726 1
+36 728 1
+36 729 1
+36 731 1
+36 732 1
+36 733 1
+36 735 1
+36 736 1
+37 7 1
+37 42 1
+37 48 1
+37 53 1
+37 57 1
+37 60 1
+37 62 1
+37 64 1
+37 126 1
+37 132 1
+37 137 1
+37 141 1
+37 144 1
+37 146 1
+37 148 1
+37 209 1
+37 214 1
+37 218 1
+37 221 1
+37 223 1
+37 225 1
+37 229 1
+37 233 1
+37 236 1
+37 238 1
+37 240 1
+37 243 1
+37 246 1
+37 248 1
+37 250 1
+37 252 1
+37 254 1
+37 256 1
+37 257 1
+37 259 1
+37 260 1
+37 336 1
+37 342 1
+37 347 1
+37 351 1
+37 354 1
+37 356 1
+37 358 1
+37 419 1
+37 424 1
+37 428 1
+37 431 1
+37 433 1
+37 435 1
+37 439 1
+37 443 1
+37 446 1
+37 448 1
+37 450 1
+37 453 1
+37 456 1
+37 458 1
+37 460 1
+37 462 1
+37 464 1
+37 466 1
+37 467 1
+37 469 1
+37 470 1
+37 545 1
+37 550 1
+37 554 1
+37 557 1
+37 559 1
+37 561 1
+37 565 1
+37 569 1
+37 572 1
+37 574 1
+37 576 1
+37 579 1
+37 582 1
+37 584 1
+37 586 1
+37 588 1
+37 590 1
+37 592 1
+37 593 1
+37 595 1
+37 596 1
+37 670 1
+37 674 1
+37 677 1
+37 679 1
+37 681 1
+37 684 1
+37 687 1
+37 689 1
+37 691 1
+37 693 1
+37 695 1
+37 697 1
+37 698 1
+37 700 1
+37 701 1
+37 704 1
+37 707 1
+37 709 1
+37 711 1
+37 713 1
+37 715 1
+37 717 1
+37 718 1
+37 720 1
+37 721 1
+37 723 1
+37 725 1
+37 727 1
+37 728 1
+37 730 1
+37 731 1
+37 732 1
+37 734 1
+37 735 1
+37 736 1
+38 8 1
+38 43 1
+38 49 1
+38 54 1
+38 58 1
+38 61 1
+38 63 1
+38 64 1
+38 127 1
+38 133 1
+38 138 1
+38 142 1
+38 145 1
+38 147 1
+38 148 1
+38 210 1
+38 215 1
+38 219 1
+38 222 1
+38 224 1
+38 225 1
+38 230 1
+38 234 1
+38 237 1
+38 239 1
+38 240 1
+38 244 1
+38 247 1
+38 249 1
+38 250 1
+38 253 1
+38 255 1
+38 256 1
+38 258 1
+38 259 1
+38 260 1
+38 337 1
+38 343 1
+38 348 1
+38 352 1
+38 355 1
+38 357 1
+38 358 1
+38 420 1
+38 425 1
+38 429 1
+38 432 1
+38 434 1
+38 435 1
+38 440 1
+38 444 1
+38 447 1
+38 449 1
+38 450 1
+38 454 1
+38 457 1
+38 459 1
+38 460 1
+38 463 1
+38 465 1
+38 466 1
+38 468 1
+38 469 1
+38 470 1
+38 546 1
+38 551 1
+38 555 1
+38 558 1
+38 560 1
+38 561 1
+38 566 1
+38 570 1
+38 573 1
+38 575 1
+38 576 1
+38 580 1
+38 583 1
+38 585 1
+38 586 1
+38 589 1
+38 591 1
+38 592 1
+38 594 1
+38 595 1
+38 596 1
+38 671 1
+38 675 1
+38 678 1
+38 680 1
+38 681 1
+38 685 1
+38 688 1
+38 690 1
+38 691 1
+38 694 1
+38 696 1
+38 697 1
+38 699 1
+38 700 1
+38 701 1
+38 705 1
+38 708 1
+38 710 1
+38 711 1
+38 714 1
+38 716 1
+38 717 1
+38 719 1
+38 720 1
+38 721 1
+38 724 1
+38 726 1
+38 727 1
+38 729 1
+38 730 1
+38 731 1
+38 733 1
+38 734 1
+38 735 1
+38 736 1
+39 9 1
+39 37 1
+39 65 1
+39 66 1
+39 67 1
+39 68 1
+39 69 1
+39 70 1
+39 121 1
+39 149 1
+39 150 1
+39 151 1
+39 152 1
+39 153 1
+39 154 1
+39 205 1
+39 206 1
+39 207 1
+39 208 1
+39 209 1
+39 210 1
+39 261 1
+39 262 1
+39 263 1
+39 264 1
+39 265 1
+39 266 1
+39 267 1
+39 268 1
+39 269 1
+39 270 1
+39 271 1
+39 272 1
+39 273 1
+39 274 1
+39 275 1
+39 331 1
+39 359 1
+39 360 1
+39 361 1
+39 362 1
+39 363 1
+39 364 1
+39 415 1
+39 416 1
+39 417 1
+39 418 1
+39 419 1
+39 420 1
+39 471 1
+39 472 1
+39 473 1
+39 474 1
+39 475 1
+39 476 1
+39 477 1
+39 478 1
+39 479 1
+39 480 1
+39 481 1
+39 482 1
+39 483 1
+39 484 1
+39 485 1
+39 541 1
+39 542 1
+39 543 1
+39 544 1
+39 545 1
+39 546 1
+39 597 1
+39 598 1
+39 599 1
+39 600 1
+39 601 1
+39 602 1
+39 603 1
+39 604 1
+39 605 1
+39 606 1
+39 607 1
+39 608 1
+39 609 1
+39 610 1
+39 611 1
+39 667 1
+39 668 1
+39 669 1
+39 670 1
+39 671 1
+39 672 1
+39 673 1
+39 674 1
+39 675 1
+39 676 1
+39 677 1
+39 678 1
+39 679 1
+39 680 1
+39 681 1
+39 737 1
+39 738 1
+39 739 1
+39 740 1
+39 741 1
+39 742 1
+39 743 1
+39 744 1
+39 745 1
+39 746 1
+39 747 1
+39 748 1
+39 749 1
+39 750 1
+39 751 1
+39 752 1
+39 753 1
+39 754 1
+39 755 1
+39 756 1
+40 10 1
+40 38 1
+40 65 1
+40 71 1
+40 72 1
+40 73 1
+40 74 1
+40 75 1
+40 122 1
+40 149 1
+40 155 1
+40 156 1
+40 157 1
+40 158 1
+40 159 1
+40 205 1
+40 211 1
+40 212 1
+40 213 1
+40 214 1
+40 215 1
+40 261 1
+40 262 1
+40 263 1
+40 264 1
+40 265 1
+40 276 1
+40 277 1
+40 278 1
+40 279 1
+40 280 1
+40 281 1
+40 282 1
+40 283 1
+40 284 1
+40 285 1
+40 332 1
+40 359 1
+40 365 1
+40 366 1
+40 367 1
+40 368 1
+40 369 1
+40 415 1
+40 421 1
+40 422 1
+40 423 1
+40 424 1
+40 425 1
+40 471 1
+40 472 1
+40 473 1
+40 474 1
+40 475 1
+40 486 1
+40 487 1
+40 488 1
+40 489 1
+40 490 1
+40 491 1
+40 492 1
+40 493 1
+40 494 1
+40 495 1
+40 541 1
+40 547 1
+40 548 1
+40 549 1
+40 550 1
+40 551 1
+40 597 1
+40 598 1
+40 599 1
+40 600 1
+40 601 1
+40 612 1
+40 613 1
+40 614 1
+40 615 1
+40 616 1
+40 617 1
+40 618 1
+40 619 1
+40 620 1
+40 621 1
+40 667 1
+40 668 1
+40 669 1
+40 670 1
+40 671 1
+40 682 1
+40 683 1
+40 684 1
+40 685 1
+40 686 1
+40 687 1
+40 688 1
+40 689 1
+40 690 1
+40 691 1
+40 737 1
+40 738 1
+40 739 1
+40 740 1
+40 741 1
+40 742 1
+40 743 1
+40 744 1
+40 745 1
+40 746 1
+40 757 1
+40 758 1
+40 759 1
+40 760 1
+40 761 1
+40 762 1
+40 763 1
+40 764 1
+40 765 1
+40 766 1
+41 11 1
+41 39 1
+41 66 1
+41 71 1
+41 76 1
+41 77 1
+41 78 1
+41 79 1
+41 123 1
+41 150 1
+41 155 1
+41 160 1
+41 161 1
+41 162 1
+41 163 1
+41 206 1
+41 211 1
+41 216 1
+41 217 1
+41 218 1
+41 219 1
+41 261 1
+41 266 1
+41 267 1
+41 268 1
+41 269 1
+41 276 1
+41 277 1
+41 278 1
+41 279 1
+41 286 1
+41 287 1
+41 288 1
+41 289 1
+41 290 1
+41 291 1
+41 333 1
+41 360 1
+41 365 1
+41 370 1
+41 371 1
+41 372 1
+41 373 1
+41 416 1
+41 421 1
+41 426 1
+41 427 1
+41 428 1
+41 429 1
+41 471 1
+41 476 1
+41 477 1
+41 478 1
+41 479 1
+41 486 1
+41 487 1
+41 488 1
+41 489 1
+41 496 1
+41 497 1
+41 498 1
+41 499 1
+41 500 1
+41 501 1
+41 542 1
+41 547 1
+41 552 1
+41 553 1
+41 554 1
+41 555 1
+41 597 1
+41 602 1
+41 603 1
+41 604 1
+41 605 1
+41 612 1
+41 613 1
+41 614 1
+41 615 1
+41 622 1
+41 623 1
+41 624 1
+41 625 1
+41 626 1
+41 627 1
+41 667 1
+41 672 1
+41 673 1
+41 674 1
+41 675 1
+41 682 1
+41 683 1
+41 684 1
+41 685 1
+41 692 1
+41 693 1
+41 694 1
+41 695 1
+41 696 1
+41 697 1
+41 737 1
+41 738 1
+41 739 1
+41 740 1
+41 747 1
+41 748 1
+41 749 1
+41 750 1
+41 751 1
+41 752 1
+41 757 1
+41 758 1
+41 759 1
+41 760 1
+41 761 1
+41 762 1
+41 767 1
+41 768 1
+41 769 1
+41 770 1
+42 12 1
+42 40 1
+42 67 1
+42 72 1
+42 76 1
+42 80 1
+42 81 1
+42 82 1
+42 124 1
+42 151 1
+42 156 1
+42 160 1
+42 164 1
+42 165 1
+42 166 1
+42 207 1
+42 212 1
+42 216 1
+42 220 1
+42 221 1
+42 222 1
+42 262 1
+42 266 1
+42 270 1
+42 271 1
+42 272 1
+42 276 1
+42 280 1
+42 281 1
+42 282 1
+42 286 1
+42 287 1
+42 288 1
+42 292 1
+42 293 1
+42 294 1
+42 334 1
+42 361 1
+42 366 1
+42 370 1
+42 374 1
+42 375 1
+42 376 1
+42 417 1
+42 422 1
+42 426 1
+42 430 1
+42 431 1
+42 432 1
+42 472 1
+42 476 1
+42 480 1
+42 481 1
+42 482 1
+42 486 1
+42 490 1
+42 491 1
+42 492 1
+42 496 1
+42 497 1
+42 498 1
+42 502 1
+42 503 1
+42 504 1
+42 543 1
+42 548 1
+42 552 1
+42 556 1
+42 557 1
+42 558 1
+42 598 1
+42 602 1
+42 606 1
+42 607 1
+42 608 1
+42 612 1
+42 616 1
+42 617 1
+42 618 1
+42 622 1
+42 623 1
+42 624 1
+42 628 1
+42 629 1
+42 630 1
+42 668 1
+42 672 1
+42 676 1
+42 677 1
+42 678 1
+42 682 1
+42 686 1
+42 687 1
+42 688 1
+42 692 1
+42 693 1
+42 694 1
+42 698 1
+42 699 1
+42 700 1
+42 737 1
+42 741 1
+42 742 1
+42 743 1
+42 747 1
+42 748 1
+42 749 1
+42 753 1
+42 754 1
+42 755 1
+42 757 1
+42 758 1
+42 759 1
+42 763 1
+42 764 1
+42 765 1
+42 767 1
+42 768 1
+42 769 1
+42 771 1
+43 13 1
+43 41 1
+43 68 1
+43 73 1
+43 77 1
+43 80 1
+43 83 1
+43 84 1
+43 125 1
+43 152 1
+43 157 1
+43 161 1
+43 164 1
+43 167 1
+43 168 1
+43 208 1
+43 213 1
+43 217 1
+43 220 1
+43 223 1
+43 224 1
+43 263 1
+43 267 1
+43 270 1
+43 273 1
+43 274 1
+43 277 1
+43 280 1
+43 283 1
+43 284 1
+43 286 1
+43 289 1
+43 290 1
+43 292 1
+43 293 1
+43 295 1
+43 335 1
+43 362 1
+43 367 1
+43 371 1
+43 374 1
+43 377 1
+43 378 1
+43 418 1
+43 423 1
+43 427 1
+43 430 1
+43 433 1
+43 434 1
+43 473 1
+43 477 1
+43 480 1
+43 483 1
+43 484 1
+43 487 1
+43 490 1
+43 493 1
+43 494 1
+43 496 1
+43 499 1
+43 500 1
+43 502 1
+43 503 1
+43 505 1
+43 544 1
+43 549 1
+43 553 1
+43 556 1
+43 559 1
+43 560 1
+43 599 1
+43 603 1
+43 606 1
+43 609 1
+43 610 1
+43 613 1
+43 616 1
+43 619 1
+43 620 1
+43 622 1
+43 625 1
+43 626 1
+43 628 1
+43 629 1
+43 631 1
+43 669 1
+43 673 1
+43 676 1
+43 679 1
+43 680 1
+43 683 1
+43 686 1
+43 689 1
+43 690 1
+43 692 1
+43 695 1
+43 696 1
+43 698 1
+43 699 1
+43 701 1
+43 738 1
+43 741 1
+43 744 1
+43 745 1
+43 747 1
+43 750 1
+43 751 1
+43 753 1
+43 754 1
+43 756 1
+43 757 1
+43 760 1
+43 761 1
+43 763 1
+43 764 1
+43 766 1
+43 767 1
+43 768 1
+43 770 1
+43 771 1
+44 14 1
+44 42 1
+44 69 1
+44 74 1
+44 78 1
+44 81 1
+44 83 1
+44 85 1
+44 126 1
+44 153 1
+44 158 1
+44 162 1
+44 165 1
+44 167 1
+44 169 1
+44 209 1
+44 214 1
+44 218 1
+44 221 1
+44 223 1
+44 225 1
+44 264 1
+44 268 1
+44 271 1
+44 273 1
+44 275 1
+44 278 1
+44 281 1
+44 283 1
+44 285 1
+44 287 1
+44 289 1
+44 291 1
+44 292 1
+44 294 1
+44 295 1
+44 336 1
+44 363 1
+44 368 1
+44 372 1
+44 375 1
+44 377 1
+44 379 1
+44 419 1
+44 424 1
+44 428 1
+44 431 1
+44 433 1
+44 435 1
+44 474 1
+44 478 1
+44 481 1
+44 483 1
+44 485 1
+44 488 1
+44 491 1
+44 493 1
+44 495 1
+44 497 1
+44 499 1
+44 501 1
+44 502 1
+44 504 1
+44 505 1
+44 545 1
+44 550 1
+44 554 1
+44 557 1
+44 559 1
+44 561 1
+44 600 1
+44 604 1
+44 607 1
+44 609 1
+44 611 1
+44 614 1
+44 617 1
+44 619 1
+44 621 1
+44 623 1
+44 625 1
+44 627 1
+44 628 1
+44 630 1
+44 631 1
+44 670 1
+44 674 1
+44 677 1
+44 679 1
+44 681 1
+44 684 1
+44 687 1
+44 689 1
+44 691 1
+44 693 1
+44 695 1
+44 697 1
+44 698 1
+44 700 1
+44 701 1
+44 739 1
+44 742 1
+44 744 1
+44 746 1
+44 748 1
+44 750 1
+44 752 1
+44 753 1
+44 755 1
+44 756 1
+44 758 1
+44 760 1
+44 762 1
+44 763 1
+44 765 1
+44 766 1
+44 767 1
+44 769 1
+44 770 1
+44 771 1
+45 15 1
+45 43 1
+45 70 1
+45 75 1
+45 79 1
+45 82 1
+45 84 1
+45 85 1
+45 127 1
+45 154 1
+45 159 1
+45 163 1
+45 166 1
+45 168 1
+45 169 1
+45 210 1
+45 215 1
+45 219 1
+45 222 1
+45 224 1
+45 225 1
+45 265 1
+45 269 1
+45 272 1
+45 274 1
+45 275 1
+45 279 1
+45 282 1
+45 284 1
+45 285 1
+45 288 1
+45 290 1
+45 291 1
+45 293 1
+45 294 1
+45 295 1
+45 337 1
+45 364 1
+45 369 1
+45 373 1
+45 376 1
+45 378 1
+45 379 1
+45 420 1
+45 425 1
+45 429 1
+45 432 1
+45 434 1
+45 435 1
+45 475 1
+45 479 1
+45 482 1
+45 484 1
+45 485 1
+45 489 1
+45 492 1
+45 494 1
+45 495 1
+45 498 1
+45 500 1
+45 501 1
+45 503 1
+45 504 1
+45 505 1
+45 546 1
+45 551 1
+45 555 1
+45 558 1
+45 560 1
+45 561 1
+45 601 1
+45 605 1
+45 608 1
+45 610 1
+45 611 1
+45 615 1
+45 618 1
+45 620 1
+45 621 1
+45 624 1
+45 626 1
+45 627 1
+45 629 1
+45 630 1
+45 631 1
+45 671 1
+45 675 1
+45 678 1
+45 680 1
+45 681 1
+45 685 1
+45 688 1
+45 690 1
+45 691 1
+45 694 1
+45 696 1
+45 697 1
+45 699 1
+45 700 1
+45 701 1
+45 740 1
+45 743 1
+45 745 1
+45 746 1
+45 749 1
+45 751 1
+45 752 1
+45 754 1
+45 755 1
+45 756 1
+45 759 1
+45 761 1
+45 762 1
+45 764 1
+45 765 1
+45 766 1
+45 768 1
+45 769 1
+45 770 1
+45 771 1
+46 16 1
+46 44 1
+46 65 1
+46 86 1
+46 87 1
+46 88 1
+46 89 1
+46 90 1
+46 128 1
+46 149 1
+46 170 1
+46 171 1
+46 172 1
+46 173 1
+46 174 1
+46 205 1
+46 226 1
+46 227 1
+46 228 1
+46 229 1
+46 230 1
+46 261 1
+46 262 1
+46 263 1
+46 264 1
+46 265 1
+46 296 1
+46 297 1
+46 298 1
+46 299 1
+46 300 1
+46 301 1
+46 302 1
+46 303 1
+46 304 1
+46 305 1
+46 338 1
+46 359 1
+46 380 1
+46 381 1
+46 382 1
+46 383 1
+46 384 1
+46 415 1
+46 436 1
+46 437 1
+46 438 1
+46 439 1
+46 440 1
+46 471 1
+46 472 1
+46 473 1
+46 474 1
+46 475 1
+46 506 1
+46 507 1
+46 508 1
+46 509 1
+46 510 1
+46 511 1
+46 512 1
+46 513 1
+46 514 1
+46 515 1
+46 541 1
+46 562 1
+46 563 1
+46 564 1
+46 565 1
+46 566 1
+46 597 1
+46 598 1
+46 599 1
+46 600 1
+46 601 1
+46 632 1
+46 633 1
+46 634 1
+46 635 1
+46 636 1
+46 637 1
+46 638 1
+46 639 1
+46 640 1
+46 641 1
+46 667 1
+46 668 1
+46 669 1
+46 670 1
+46 671 1
+46 702 1
+46 703 1
+46 704 1
+46 705 1
+46 706 1
+46 707 1
+46 708 1
+46 709 1
+46 710 1
+46 711 1
+46 737 1
+46 738 1
+46 739 1
+46 740 1
+46 741 1
+46 742 1
+46 743 1
+46 744 1
+46 745 1
+46 746 1
+46 772 1
+46 773 1
+46 774 1
+46 775 1
+46 776 1
+46 777 1
+46 778 1
+46 779 1
+46 780 1
+46 781 1
+47 17 1
+47 45 1
+47 66 1
+47 86 1
+47 91 1
+47 92 1
+47 93 1
+47 94 1
+47 129 1
+47 150 1
+47 170 1
+47 175 1
+47 176 1
+47 177 1
+47 178 1
+47 206 1
+47 226 1
+47 231 1
+47 232 1
+47 233 1
+47 234 1
+47 261 1
+47 266 1
+47 267 1
+47 268 1
+47 269 1
+47 296 1
+47 297 1
+47 298 1
+47 299 1
+47 306 1
+47 307 1
+47 308 1
+47 309 1
+47 310 1
+47 311 1
+47 339 1
+47 360 1
+47 380 1
+47 385 1
+47 386 1
+47 387 1
+47 388 1
+47 416 1
+47 436 1
+47 441 1
+47 442 1
+47 443 1
+47 444 1
+47 471 1
+47 476 1
+47 477 1
+47 478 1
+47 479 1
+47 506 1
+47 507 1
+47 508 1
+47 509 1
+47 516 1
+47 517 1
+47 518 1
+47 519 1
+47 520 1
+47 521 1
+47 542 1
+47 562 1
+47 567 1
+47 568 1
+47 569 1
+47 570 1
+47 597 1
+47 602 1
+47 603 1
+47 604 1
+47 605 1
+47 632 1
+47 633 1
+47 634 1
+47 635 1
+47 642 1
+47 643 1
+47 644 1
+47 645 1
+47 646 1
+47 647 1
+47 667 1
+47 672 1
+47 673 1
+47 674 1
+47 675 1
+47 702 1
+47 703 1
+47 704 1
+47 705 1
+47 712 1
+47 713 1
+47 714 1
+47 715 1
+47 716 1
+47 717 1
+47 737 1
+47 738 1
+47 739 1
+47 740 1
+47 747 1
+47 748 1
+47 749 1
+47 750 1
+47 751 1
+47 752 1
+47 772 1
+47 773 1
+47 774 1
+47 775 1
+47 776 1
+47 777 1
+47 782 1
+47 783 1
+47 784 1
+47 785 1
+48 18 1
+48 46 1
+48 67 1
+48 87 1
+48 91 1
+48 95 1
+48 96 1
+48 97 1
+48 130 1
+48 151 1
+48 171 1
+48 175 1
+48 179 1
+48 180 1
+48 181 1
+48 207 1
+48 227 1
+48 231 1
+48 235 1
+48 236 1
+48 237 1
+48 262 1
+48 266 1
+48 270 1
+48 271 1
+48 272 1
+48 296 1
+48 300 1
+48 301 1
+48 302 1
+48 306 1
+48 307 1
+48 308 1
+48 312 1
+48 313 1
+48 314 1
+48 340 1
+48 361 1
+48 381 1
+48 385 1
+48 389 1
+48 390 1
+48 391 1
+48 417 1
+48 437 1
+48 441 1
+48 445 1
+48 446 1
+48 447 1
+48 472 1
+48 476 1
+48 480 1
+48 481 1
+48 482 1
+48 506 1
+48 510 1
+48 511 1
+48 512 1
+48 516 1
+48 517 1
+48 518 1
+48 522 1
+48 523 1
+48 524 1
+48 543 1
+48 563 1
+48 567 1
+48 571 1
+48 572 1
+48 573 1
+48 598 1
+48 602 1
+48 606 1
+48 607 1
+48 608 1
+48 632 1
+48 636 1
+48 637 1
+48 638 1
+48 642 1
+48 643 1
+48 644 1
+48 648 1
+48 649 1
+48 650 1
+48 668 1
+48 672 1
+48 676 1
+48 677 1
+48 678 1
+48 702 1
+48 706 1
+48 707 1
+48 708 1
+48 712 1
+48 713 1
+48 714 1
+48 718 1
+48 719 1
+48 720 1
+48 737 1
+48 741 1
+48 742 1
+48 743 1
+48 747 1
+48 748 1
+48 749 1
+48 753 1
+48 754 1
+48 755 1
+48 772 1
+48 773 1
+48 774 1
+48 778 1
+48 779 1
+48 780 1
+48 782 1
+48 783 1
+48 784 1
+48 786 1
+49 19 1
+49 47 1
+49 68 1
+49 88 1
+49 92 1
+49 95 1
+49 98 1
+49 99 1
+49 131 1
+49 152 1
+49 172 1
+49 176 1
+49 179 1
+49 182 1
+49 183 1
+49 208 1
+49 228 1
+49 232 1
+49 235 1
+49 238 1
+49 239 1
+49 263 1
+49 267 1
+49 270 1
+49 273 1
+49 274 1
+49 297 1
+49 300 1
+49 303 1
+49 304 1
+49 306 1
+49 309 1
+49 310 1
+49 312 1
+49 313 1
+49 315 1
+49 341 1
+49 362 1
+49 382 1
+49 386 1
+49 389 1
+49 392 1
+49 393 1
+49 418 1
+49 438 1
+49 442 1
+49 445 1
+49 448 1
+49 449 1
+49 473 1
+49 477 1
+49 480 1
+49 483 1
+49 484 1
+49 507 1
+49 510 1
+49 513 1
+49 514 1
+49 516 1
+49 519 1
+49 520 1
+49 522 1
+49 523 1
+49 525 1
+49 544 1
+49 564 1
+49 568 1
+49 571 1
+49 574 1
+49 575 1
+49 599 1
+49 603 1
+49 606 1
+49 609 1
+49 610 1
+49 633 1
+49 636 1
+49 639 1
+49 640 1
+49 642 1
+49 645 1
+49 646 1
+49 648 1
+49 649 1
+49 651 1
+49 669 1
+49 673 1
+49 676 1
+49 679 1
+49 680 1
+49 703 1
+49 706 1
+49 709 1
+49 710 1
+49 712 1
+49 715 1
+49 716 1
+49 718 1
+49 719 1
+49 721 1
+49 738 1
+49 741 1
+49 744 1
+49 745 1
+49 747 1
+49 750 1
+49 751 1
+49 753 1
+49 754 1
+49 756 1
+49 772 1
+49 775 1
+49 776 1
+49 778 1
+49 779 1
+49 781 1
+49 782 1
+49 783 1
+49 785 1
+49 786 1
+50 20 1
+50 48 1
+50 69 1
+50 89 1
+50 93 1
+50 96 1
+50 98 1
+50 100 1
+50 132 1
+50 153 1
+50 173 1
+50 177 1
+50 180 1
+50 182 1
+50 184 1
+50 209 1
+50 229 1
+50 233 1
+50 236 1
+50 238 1
+50 240 1
+50 264 1
+50 268 1
+50 271 1
+50 273 1
+50 275 1
+50 298 1
+50 301 1
+50 303 1
+50 305 1
+50 307 1
+50 309 1
+50 311 1
+50 312 1
+50 314 1
+50 315 1
+50 342 1
+50 363 1
+50 383 1
+50 387 1
+50 390 1
+50 392 1
+50 394 1
+50 419 1
+50 439 1
+50 443 1
+50 446 1
+50 448 1
+50 450 1
+50 474 1
+50 478 1
+50 481 1
+50 483 1
+50 485 1
+50 508 1
+50 511 1
+50 513 1
+50 515 1
+50 517 1
+50 519 1
+50 521 1
+50 522 1
+50 524 1
+50 525 1
+50 545 1
+50 565 1
+50 569 1
+50 572 1
+50 574 1
+50 576 1
+50 600 1
+50 604 1
+50 607 1
+50 609 1
+50 611 1
+50 634 1
+50 637 1
+50 639 1
+50 641 1
+50 643 1
+50 645 1
+50 647 1
+50 648 1
+50 650 1
+50 651 1
+50 670 1
+50 674 1
+50 677 1
+50 679 1
+50 681 1
+50 704 1
+50 707 1
+50 709 1
+50 711 1
+50 713 1
+50 715 1
+50 717 1
+50 718 1
+50 720 1
+50 721 1
+50 739 1
+50 742 1
+50 744 1
+50 746 1
+50 748 1
+50 750 1
+50 752 1
+50 753 1
+50 755 1
+50 756 1
+50 773 1
+50 775 1
+50 777 1
+50 778 1
+50 780 1
+50 781 1
+50 782 1
+50 784 1
+50 785 1
+50 786 1
+51 21 1
+51 49 1
+51 70 1
+51 90 1
+51 94 1
+51 97 1
+51 99 1
+51 100 1
+51 133 1
+51 154 1
+51 174 1
+51 178 1
+51 181 1
+51 183 1
+51 184 1
+51 210 1
+51 230 1
+51 234 1
+51 237 1
+51 239 1
+51 240 1
+51 265 1
+51 269 1
+51 272 1
+51 274 1
+51 275 1
+51 299 1
+51 302 1
+51 304 1
+51 305 1
+51 308 1
+51 310 1
+51 311 1
+51 313 1
+51 314 1
+51 315 1
+51 343 1
+51 364 1
+51 384 1
+51 388 1
+51 391 1
+51 393 1
+51 394 1
+51 420 1
+51 440 1
+51 444 1
+51 447 1
+51 449 1
+51 450 1
+51 475 1
+51 479 1
+51 482 1
+51 484 1
+51 485 1
+51 509 1
+51 512 1
+51 514 1
+51 515 1
+51 518 1
+51 520 1
+51 521 1
+51 523 1
+51 524 1
+51 525 1
+51 546 1
+51 566 1
+51 570 1
+51 573 1
+51 575 1
+51 576 1
+51 601 1
+51 605 1
+51 608 1
+51 610 1
+51 611 1
+51 635 1
+51 638 1
+51 640 1
+51 641 1
+51 644 1
+51 646 1
+51 647 1
+51 649 1
+51 650 1
+51 651 1
+51 671 1
+51 675 1
+51 678 1
+51 680 1
+51 681 1
+51 705 1
+51 708 1
+51 710 1
+51 711 1
+51 714 1
+51 716 1
+51 717 1
+51 719 1
+51 720 1
+51 721 1
+51 740 1
+51 743 1
+51 745 1
+51 746 1
+51 749 1
+51 751 1
+51 752 1
+51 754 1
+51 755 1
+51 756 1
+51 774 1
+51 776 1
+51 777 1
+51 779 1
+51 780 1
+51 781 1
+51 783 1
+51 784 1
+51 785 1
+51 786 1
+52 22 1
+52 50 1
+52 71 1
+52 86 1
+52 101 1
+52 102 1
+52 103 1
+52 104 1
+52 134 1
+52 155 1
+52 170 1
+52 185 1
+52 186 1
+52 187 1
+52 188 1
+52 211 1
+52 226 1
+52 241 1
+52 242 1
+52 243 1
+52 244 1
+52 261 1
+52 276 1
+52 277 1
+52 278 1
+52 279 1
+52 296 1
+52 297 1
+52 298 1
+52 299 1
+52 316 1
+52 317 1
+52 318 1
+52 319 1
+52 320 1
+52 321 1
+52 344 1
+52 365 1
+52 380 1
+52 395 1
+52 396 1
+52 397 1
+52 398 1
+52 421 1
+52 436 1
+52 451 1
+52 452 1
+52 453 1
+52 454 1
+52 471 1
+52 486 1
+52 487 1
+52 488 1
+52 489 1
+52 506 1
+52 507 1
+52 508 1
+52 509 1
+52 526 1
+52 527 1
+52 528 1
+52 529 1
+52 530 1
+52 531 1
+52 547 1
+52 562 1
+52 577 1
+52 578 1
+52 579 1
+52 580 1
+52 597 1
+52 612 1
+52 613 1
+52 614 1
+52 615 1
+52 632 1
+52 633 1
+52 634 1
+52 635 1
+52 652 1
+52 653 1
+52 654 1
+52 655 1
+52 656 1
+52 657 1
+52 667 1
+52 682 1
+52 683 1
+52 684 1
+52 685 1
+52 702 1
+52 703 1
+52 704 1
+52 705 1
+52 722 1
+52 723 1
+52 724 1
+52 725 1
+52 726 1
+52 727 1
+52 737 1
+52 738 1
+52 739 1
+52 740 1
+52 757 1
+52 758 1
+52 759 1
+52 760 1
+52 761 1
+52 762 1
+52 772 1
+52 773 1
+52 774 1
+52 775 1
+52 776 1
+52 777 1
+52 787 1
+52 788 1
+52 789 1
+52 790 1
+53 23 1
+53 51 1
+53 72 1
+53 87 1
+53 101 1
+53 105 1
+53 106 1
+53 107 1
+53 135 1
+53 156 1
+53 171 1
+53 185 1
+53 189 1
+53 190 1
+53 191 1
+53 212 1
+53 227 1
+53 241 1
+53 245 1
+53 246 1
+53 247 1
+53 262 1
+53 276 1
+53 280 1
+53 281 1
+53 282 1
+53 296 1
+53 300 1
+53 301 1
+53 302 1
+53 316 1
+53 317 1
+53 318 1
+53 322 1
+53 323 1
+53 324 1
+53 345 1
+53 366 1
+53 381 1
+53 395 1
+53 399 1
+53 400 1
+53 401 1
+53 422 1
+53 437 1
+53 451 1
+53 455 1
+53 456 1
+53 457 1
+53 472 1
+53 486 1
+53 490 1
+53 491 1
+53 492 1
+53 506 1
+53 510 1
+53 511 1
+53 512 1
+53 526 1
+53 527 1
+53 528 1
+53 532 1
+53 533 1
+53 534 1
+53 548 1
+53 563 1
+53 577 1
+53 581 1
+53 582 1
+53 583 1
+53 598 1
+53 612 1
+53 616 1
+53 617 1
+53 618 1
+53 632 1
+53 636 1
+53 637 1
+53 638 1
+53 652 1
+53 653 1
+53 654 1
+53 658 1
+53 659 1
+53 660 1
+53 668 1
+53 682 1
+53 686 1
+53 687 1
+53 688 1
+53 702 1
+53 706 1
+53 707 1
+53 708 1
+53 722 1
+53 723 1
+53 724 1
+53 728 1
+53 729 1
+53 730 1
+53 737 1
+53 741 1
+53 742 1
+53 743 1
+53 757 1
+53 758 1
+53 759 1
+53 763 1
+53 764 1
+53 765 1
+53 772 1
+53 773 1
+53 774 1
+53 778 1
+53 779 1
+53 780 1
+53 787 1
+53 788 1
+53 789 1
+53 791 1
+54 24 1
+54 52 1
+54 73 1
+54 88 1
+54 102 1
+54 105 1
+54 108 1
+54 109 1
+54 136 1
+54 157 1
+54 172 1
+54 186 1
+54 189 1
+54 192 1
+54 193 1
+54 213 1
+54 228 1
+54 242 1
+54 245 1
+54 248 1
+54 249 1
+54 263 1
+54 277 1
+54 280 1
+54 283 1
+54 284 1
+54 297 1
+54 300 1
+54 303 1
+54 304 1
+54 316 1
+54 319 1
+54 320 1
+54 322 1
+54 323 1
+54 325 1
+54 346 1
+54 367 1
+54 382 1
+54 396 1
+54 399 1
+54 402 1
+54 403 1
+54 423 1
+54 438 1
+54 452 1
+54 455 1
+54 458 1
+54 459 1
+54 473 1
+54 487 1
+54 490 1
+54 493 1
+54 494 1
+54 507 1
+54 510 1
+54 513 1
+54 514 1
+54 526 1
+54 529 1
+54 530 1
+54 532 1
+54 533 1
+54 535 1
+54 549 1
+54 564 1
+54 578 1
+54 581 1
+54 584 1
+54 585 1
+54 599 1
+54 613 1
+54 616 1
+54 619 1
+54 620 1
+54 633 1
+54 636 1
+54 639 1
+54 640 1
+54 652 1
+54 655 1
+54 656 1
+54 658 1
+54 659 1
+54 661 1
+54 669 1
+54 683 1
+54 686 1
+54 689 1
+54 690 1
+54 703 1
+54 706 1
+54 709 1
+54 710 1
+54 722 1
+54 725 1
+54 726 1
+54 728 1
+54 729 1
+54 731 1
+54 738 1
+54 741 1
+54 744 1
+54 745 1
+54 757 1
+54 760 1
+54 761 1
+54 763 1
+54 764 1
+54 766 1
+54 772 1
+54 775 1
+54 776 1
+54 778 1
+54 779 1
+54 781 1
+54 787 1
+54 788 1
+54 790 1
+54 791 1
+55 25 1
+55 53 1
+55 74 1
+55 89 1
+55 103 1
+55 106 1
+55 108 1
+55 110 1
+55 137 1
+55 158 1
+55 173 1
+55 187 1
+55 190 1
+55 192 1
+55 194 1
+55 214 1
+55 229 1
+55 243 1
+55 246 1
+55 248 1
+55 250 1
+55 264 1
+55 278 1
+55 281 1
+55 283 1
+55 285 1
+55 298 1
+55 301 1
+55 303 1
+55 305 1
+55 317 1
+55 319 1
+55 321 1
+55 322 1
+55 324 1
+55 325 1
+55 347 1
+55 368 1
+55 383 1
+55 397 1
+55 400 1
+55 402 1
+55 404 1
+55 424 1
+55 439 1
+55 453 1
+55 456 1
+55 458 1
+55 460 1
+55 474 1
+55 488 1
+55 491 1
+55 493 1
+55 495 1
+55 508 1
+55 511 1
+55 513 1
+55 515 1
+55 527 1
+55 529 1
+55 531 1
+55 532 1
+55 534 1
+55 535 1
+55 550 1
+55 565 1
+55 579 1
+55 582 1
+55 584 1
+55 586 1
+55 600 1
+55 614 1
+55 617 1
+55 619 1
+55 621 1
+55 634 1
+55 637 1
+55 639 1
+55 641 1
+55 653 1
+55 655 1
+55 657 1
+55 658 1
+55 660 1
+55 661 1
+55 670 1
+55 684 1
+55 687 1
+55 689 1
+55 691 1
+55 704 1
+55 707 1
+55 709 1
+55 711 1
+55 723 1
+55 725 1
+55 727 1
+55 728 1
+55 730 1
+55 731 1
+55 739 1
+55 742 1
+55 744 1
+55 746 1
+55 758 1
+55 760 1
+55 762 1
+55 763 1
+55 765 1
+55 766 1
+55 773 1
+55 775 1
+55 777 1
+55 778 1
+55 780 1
+55 781 1
+55 787 1
+55 789 1
+55 790 1
+55 791 1
+56 26 1
+56 54 1
+56 75 1
+56 90 1
+56 104 1
+56 107 1
+56 109 1
+56 110 1
+56 138 1
+56 159 1
+56 174 1
+56 188 1
+56 191 1
+56 193 1
+56 194 1
+56 215 1
+56 230 1
+56 244 1
+56 247 1
+56 249 1
+56 250 1
+56 265 1
+56 279 1
+56 282 1
+56 284 1
+56 285 1
+56 299 1
+56 302 1
+56 304 1
+56 305 1
+56 318 1
+56 320 1
+56 321 1
+56 323 1
+56 324 1
+56 325 1
+56 348 1
+56 369 1
+56 384 1
+56 398 1
+56 401 1
+56 403 1
+56 404 1
+56 425 1
+56 440 1
+56 454 1
+56 457 1
+56 459 1
+56 460 1
+56 475 1
+56 489 1
+56 492 1
+56 494 1
+56 495 1
+56 509 1
+56 512 1
+56 514 1
+56 515 1
+56 528 1
+56 530 1
+56 531 1
+56 533 1
+56 534 1
+56 535 1
+56 551 1
+56 566 1
+56 580 1
+56 583 1
+56 585 1
+56 586 1
+56 601 1
+56 615 1
+56 618 1
+56 620 1
+56 621 1
+56 635 1
+56 638 1
+56 640 1
+56 641 1
+56 654 1
+56 656 1
+56 657 1
+56 659 1
+56 660 1
+56 661 1
+56 671 1
+56 685 1
+56 688 1
+56 690 1
+56 691 1
+56 705 1
+56 708 1
+56 710 1
+56 711 1
+56 724 1
+56 726 1
+56 727 1
+56 729 1
+56 730 1
+56 731 1
+56 740 1
+56 743 1
+56 745 1
+56 746 1
+56 759 1
+56 761 1
+56 762 1
+56 764 1
+56 765 1
+56 766 1
+56 774 1
+56 776 1
+56 777 1
+56 779 1
+56 780 1
+56 781 1
+56 788 1
+56 789 1
+56 790 1
+56 791 1
+57 27 1
+57 55 1
+57 76 1
+57 91 1
+57 101 1
+57 111 1
+57 112 1
+57 113 1
+57 139 1
+57 160 1
+57 175 1
+57 185 1
+57 195 1
+57 196 1
+57 197 1
+57 216 1
+57 231 1
+57 241 1
+57 251 1
+57 252 1
+57 253 1
+57 266 1
+57 276 1
+57 286 1
+57 287 1
+57 288 1
+57 296 1
+57 306 1
+57 307 1
+57 308 1
+57 316 1
+57 317 1
+57 318 1
+57 326 1
+57 327 1
+57 328 1
+57 349 1
+57 370 1
+57 385 1
+57 395 1
+57 405 1
+57 406 1
+57 407 1
+57 426 1
+57 441 1
+57 451 1
+57 461 1
+57 462 1
+57 463 1
+57 476 1
+57 486 1
+57 496 1
+57 497 1
+57 498 1
+57 506 1
+57 516 1
+57 517 1
+57 518 1
+57 526 1
+57 527 1
+57 528 1
+57 536 1
+57 537 1
+57 538 1
+57 552 1
+57 567 1
+57 577 1
+57 587 1
+57 588 1
+57 589 1
+57 602 1
+57 612 1
+57 622 1
+57 623 1
+57 624 1
+57 632 1
+57 642 1
+57 643 1
+57 644 1
+57 652 1
+57 653 1
+57 654 1
+57 662 1
+57 663 1
+57 664 1
+57 672 1
+57 682 1
+57 692 1
+57 693 1
+57 694 1
+57 702 1
+57 712 1
+57 713 1
+57 714 1
+57 722 1
+57 723 1
+57 724 1
+57 732 1
+57 733 1
+57 734 1
+57 737 1
+57 747 1
+57 748 1
+57 749 1
+57 757 1
+57 758 1
+57 759 1
+57 767 1
+57 768 1
+57 769 1
+57 772 1
+57 773 1
+57 774 1
+57 782 1
+57 783 1
+57 784 1
+57 787 1
+57 788 1
+57 789 1
+57 792 1
+58 28 1
+58 56 1
+58 77 1
+58 92 1
+58 102 1
+58 111 1
+58 114 1
+58 115 1
+58 140 1
+58 161 1
+58 176 1
+58 186 1
+58 195 1
+58 198 1
+58 199 1
+58 217 1
+58 232 1
+58 242 1
+58 251 1
+58 254 1
+58 255 1
+58 267 1
+58 277 1
+58 286 1
+58 289 1
+58 290 1
+58 297 1
+58 306 1
+58 309 1
+58 310 1
+58 316 1
+58 319 1
+58 320 1
+58 326 1
+58 327 1
+58 329 1
+58 350 1
+58 371 1
+58 386 1
+58 396 1
+58 405 1
+58 408 1
+58 409 1
+58 427 1
+58 442 1
+58 452 1
+58 461 1
+58 464 1
+58 465 1
+58 477 1
+58 487 1
+58 496 1
+58 499 1
+58 500 1
+58 507 1
+58 516 1
+58 519 1
+58 520 1
+58 526 1
+58 529 1
+58 530 1
+58 536 1
+58 537 1
+58 539 1
+58 553 1
+58 568 1
+58 578 1
+58 587 1
+58 590 1
+58 591 1
+58 603 1
+58 613 1
+58 622 1
+58 625 1
+58 626 1
+58 633 1
+58 642 1
+58 645 1
+58 646 1
+58 652 1
+58 655 1
+58 656 1
+58 662 1
+58 663 1
+58 665 1
+58 673 1
+58 683 1
+58 692 1
+58 695 1
+58 696 1
+58 703 1
+58 712 1
+58 715 1
+58 716 1
+58 722 1
+58 725 1
+58 726 1
+58 732 1
+58 733 1
+58 735 1
+58 738 1
+58 747 1
+58 750 1
+58 751 1
+58 757 1
+58 760 1
+58 761 1
+58 767 1
+58 768 1
+58 770 1
+58 772 1
+58 775 1
+58 776 1
+58 782 1
+58 783 1
+58 785 1
+58 787 1
+58 788 1
+58 790 1
+58 792 1
+59 29 1
+59 57 1
+59 78 1
+59 93 1
+59 103 1
+59 112 1
+59 114 1
+59 116 1
+59 141 1
+59 162 1
+59 177 1
+59 187 1
+59 196 1
+59 198 1
+59 200 1
+59 218 1
+59 233 1
+59 243 1
+59 252 1
+59 254 1
+59 256 1
+59 268 1
+59 278 1
+59 287 1
+59 289 1
+59 291 1
+59 298 1
+59 307 1
+59 309 1
+59 311 1
+59 317 1
+59 319 1
+59 321 1
+59 326 1
+59 328 1
+59 329 1
+59 351 1
+59 372 1
+59 387 1
+59 397 1
+59 406 1
+59 408 1
+59 410 1
+59 428 1
+59 443 1
+59 453 1
+59 462 1
+59 464 1
+59 466 1
+59 478 1
+59 488 1
+59 497 1
+59 499 1
+59 501 1
+59 508 1
+59 517 1
+59 519 1
+59 521 1
+59 527 1
+59 529 1
+59 531 1
+59 536 1
+59 538 1
+59 539 1
+59 554 1
+59 569 1
+59 579 1
+59 588 1
+59 590 1
+59 592 1
+59 604 1
+59 614 1
+59 623 1
+59 625 1
+59 627 1
+59 634 1
+59 643 1
+59 645 1
+59 647 1
+59 653 1
+59 655 1
+59 657 1
+59 662 1
+59 664 1
+59 665 1
+59 674 1
+59 684 1
+59 693 1
+59 695 1
+59 697 1
+59 704 1
+59 713 1
+59 715 1
+59 717 1
+59 723 1
+59 725 1
+59 727 1
+59 732 1
+59 734 1
+59 735 1
+59 739 1
+59 748 1
+59 750 1
+59 752 1
+59 758 1
+59 760 1
+59 762 1
+59 767 1
+59 769 1
+59 770 1
+59 773 1
+59 775 1
+59 777 1
+59 782 1
+59 784 1
+59 785 1
+59 787 1
+59 789 1
+59 790 1
+59 792 1
+60 30 1
+60 58 1
+60 79 1
+60 94 1
+60 104 1
+60 113 1
+60 115 1
+60 116 1
+60 142 1
+60 163 1
+60 178 1
+60 188 1
+60 197 1
+60 199 1
+60 200 1
+60 219 1
+60 234 1
+60 244 1
+60 253 1
+60 255 1
+60 256 1
+60 269 1
+60 279 1
+60 288 1
+60 290 1
+60 291 1
+60 299 1
+60 308 1
+60 310 1
+60 311 1
+60 318 1
+60 320 1
+60 321 1
+60 327 1
+60 328 1
+60 329 1
+60 352 1
+60 373 1
+60 388 1
+60 398 1
+60 407 1
+60 409 1
+60 410 1
+60 429 1
+60 444 1
+60 454 1
+60 463 1
+60 465 1
+60 466 1
+60 479 1
+60 489 1
+60 498 1
+60 500 1
+60 501 1
+60 509 1
+60 518 1
+60 520 1
+60 521 1
+60 528 1
+60 530 1
+60 531 1
+60 537 1
+60 538 1
+60 539 1
+60 555 1
+60 570 1
+60 580 1
+60 589 1
+60 591 1
+60 592 1
+60 605 1
+60 615 1
+60 624 1
+60 626 1
+60 627 1
+60 635 1
+60 644 1
+60 646 1
+60 647 1
+60 654 1
+60 656 1
+60 657 1
+60 663 1
+60 664 1
+60 665 1
+60 675 1
+60 685 1
+60 694 1
+60 696 1
+60 697 1
+60 705 1
+60 714 1
+60 716 1
+60 717 1
+60 724 1
+60 726 1
+60 727 1
+60 733 1
+60 734 1
+60 735 1
+60 740 1
+60 749 1
+60 751 1
+60 752 1
+60 759 1
+60 761 1
+60 762 1
+60 768 1
+60 769 1
+60 770 1
+60 774 1
+60 776 1
+60 777 1
+60 783 1
+60 784 1
+60 785 1
+60 788 1
+60 789 1
+60 790 1
+60 792 1
+61 31 1
+61 59 1
+61 80 1
+61 95 1
+61 105 1
+61 111 1
+61 117 1
+61 118 1
+61 143 1
+61 164 1
+61 179 1
+61 189 1
+61 195 1
+61 201 1
+61 202 1
+61 220 1
+61 235 1
+61 245 1
+61 251 1
+61 257 1
+61 258 1
+61 270 1
+61 280 1
+61 286 1
+61 292 1
+61 293 1
+61 300 1
+61 306 1
+61 312 1
+61 313 1
+61 316 1
+61 322 1
+61 323 1
+61 326 1
+61 327 1
+61 330 1
+61 353 1
+61 374 1
+61 389 1
+61 399 1
+61 405 1
+61 411 1
+61 412 1
+61 430 1
+61 445 1
+61 455 1
+61 461 1
+61 467 1
+61 468 1
+61 480 1
+61 490 1
+61 496 1
+61 502 1
+61 503 1
+61 510 1
+61 516 1
+61 522 1
+61 523 1
+61 526 1
+61 532 1
+61 533 1
+61 536 1
+61 537 1
+61 540 1
+61 556 1
+61 571 1
+61 581 1
+61 587 1
+61 593 1
+61 594 1
+61 606 1
+61 616 1
+61 622 1
+61 628 1
+61 629 1
+61 636 1
+61 642 1
+61 648 1
+61 649 1
+61 652 1
+61 658 1
+61 659 1
+61 662 1
+61 663 1
+61 666 1
+61 676 1
+61 686 1
+61 692 1
+61 698 1
+61 699 1
+61 706 1
+61 712 1
+61 718 1
+61 719 1
+61 722 1
+61 728 1
+61 729 1
+61 732 1
+61 733 1
+61 736 1
+61 741 1
+61 747 1
+61 753 1
+61 754 1
+61 757 1
+61 763 1
+61 764 1
+61 767 1
+61 768 1
+61 771 1
+61 772 1
+61 778 1
+61 779 1
+61 782 1
+61 783 1
+61 786 1
+61 787 1
+61 788 1
+61 791 1
+61 792 1
+62 32 1
+62 60 1
+62 81 1
+62 96 1
+62 106 1
+62 112 1
+62 117 1
+62 119 1
+62 144 1
+62 165 1
+62 180 1
+62 190 1
+62 196 1
+62 201 1
+62 203 1
+62 221 1
+62 236 1
+62 246 1
+62 252 1
+62 257 1
+62 259 1
+62 271 1
+62 281 1
+62 287 1
+62 292 1
+62 294 1
+62 301 1
+62 307 1
+62 312 1
+62 314 1
+62 317 1
+62 322 1
+62 324 1
+62 326 1
+62 328 1
+62 330 1
+62 354 1
+62 375 1
+62 390 1
+62 400 1
+62 406 1
+62 411 1
+62 413 1
+62 431 1
+62 446 1
+62 456 1
+62 462 1
+62 467 1
+62 469 1
+62 481 1
+62 491 1
+62 497 1
+62 502 1
+62 504 1
+62 511 1
+62 517 1
+62 522 1
+62 524 1
+62 527 1
+62 532 1
+62 534 1
+62 536 1
+62 538 1
+62 540 1
+62 557 1
+62 572 1
+62 582 1
+62 588 1
+62 593 1
+62 595 1
+62 607 1
+62 617 1
+62 623 1
+62 628 1
+62 630 1
+62 637 1
+62 643 1
+62 648 1
+62 650 1
+62 653 1
+62 658 1
+62 660 1
+62 662 1
+62 664 1
+62 666 1
+62 677 1
+62 687 1
+62 693 1
+62 698 1
+62 700 1
+62 707 1
+62 713 1
+62 718 1
+62 720 1
+62 723 1
+62 728 1
+62 730 1
+62 732 1
+62 734 1
+62 736 1
+62 742 1
+62 748 1
+62 753 1
+62 755 1
+62 758 1
+62 763 1
+62 765 1
+62 767 1
+62 769 1
+62 771 1
+62 773 1
+62 778 1
+62 780 1
+62 782 1
+62 784 1
+62 786 1
+62 787 1
+62 789 1
+62 791 1
+62 792 1
+63 33 1
+63 61 1
+63 82 1
+63 97 1
+63 107 1
+63 113 1
+63 118 1
+63 119 1
+63 145 1
+63 166 1
+63 181 1
+63 191 1
+63 197 1
+63 202 1
+63 203 1
+63 222 1
+63 237 1
+63 247 1
+63 253 1
+63 258 1
+63 259 1
+63 272 1
+63 282 1
+63 288 1
+63 293 1
+63 294 1
+63 302 1
+63 308 1
+63 313 1
+63 314 1
+63 318 1
+63 323 1
+63 324 1
+63 327 1
+63 328 1
+63 330 1
+63 355 1
+63 376 1
+63 391 1
+63 401 1
+63 407 1
+63 412 1
+63 413 1
+63 432 1
+63 447 1
+63 457 1
+63 463 1
+63 468 1
+63 469 1
+63 482 1
+63 492 1
+63 498 1
+63 503 1
+63 504 1
+63 512 1
+63 518 1
+63 523 1
+63 524 1
+63 528 1
+63 533 1
+63 534 1
+63 537 1
+63 538 1
+63 540 1
+63 558 1
+63 573 1
+63 583 1
+63 589 1
+63 594 1
+63 595 1
+63 608 1
+63 618 1
+63 624 1
+63 629 1
+63 630 1
+63 638 1
+63 644 1
+63 649 1
+63 650 1
+63 654 1
+63 659 1
+63 660 1
+63 663 1
+63 664 1
+63 666 1
+63 678 1
+63 688 1
+63 694 1
+63 699 1
+63 700 1
+63 708 1
+63 714 1
+63 719 1
+63 720 1
+63 724 1
+63 729 1
+63 730 1
+63 733 1
+63 734 1
+63 736 1
+63 743 1
+63 749 1
+63 754 1
+63 755 1
+63 759 1
+63 764 1
+63 765 1
+63 768 1
+63 769 1
+63 771 1
+63 774 1
+63 779 1
+63 780 1
+63 783 1
+63 784 1
+63 786 1
+63 788 1
+63 789 1
+63 791 1
+63 792 1
+64 34 1
+64 62 1
+64 83 1
+64 98 1
+64 108 1
+64 114 1
+64 117 1
+64 120 1
+64 146 1
+64 167 1
+64 182 1
+64 192 1
+64 198 1
+64 201 1
+64 204 1
+64 223 1
+64 238 1
+64 248 1
+64 254 1
+64 257 1
+64 260 1
+64 273 1
+64 283 1
+64 289 1
+64 292 1
+64 295 1
+64 303 1
+64 309 1
+64 312 1
+64 315 1
+64 319 1
+64 322 1
+64 325 1
+64 326 1
+64 329 1
+64 330 1
+64 356 1
+64 377 1
+64 392 1
+64 402 1
+64 408 1
+64 411 1
+64 414 1
+64 433 1
+64 448 1
+64 458 1
+64 464 1
+64 467 1
+64 470 1
+64 483 1
+64 493 1
+64 499 1
+64 502 1
+64 505 1
+64 513 1
+64 519 1
+64 522 1
+64 525 1
+64 529 1
+64 532 1
+64 535 1
+64 536 1
+64 539 1
+64 540 1
+64 559 1
+64 574 1
+64 584 1
+64 590 1
+64 593 1
+64 596 1
+64 609 1
+64 619 1
+64 625 1
+64 628 1
+64 631 1
+64 639 1
+64 645 1
+64 648 1
+64 651 1
+64 655 1
+64 658 1
+64 661 1
+64 662 1
+64 665 1
+64 666 1
+64 679 1
+64 689 1
+64 695 1
+64 698 1
+64 701 1
+64 709 1
+64 715 1
+64 718 1
+64 721 1
+64 725 1
+64 728 1
+64 731 1
+64 732 1
+64 735 1
+64 736 1
+64 744 1
+64 750 1
+64 753 1
+64 756 1
+64 760 1
+64 763 1
+64 766 1
+64 767 1
+64 770 1
+64 771 1
+64 775 1
+64 778 1
+64 781 1
+64 782 1
+64 785 1
+64 786 1
+64 787 1
+64 790 1
+64 791 1
+64 792 1
+65 35 1
+65 63 1
+65 84 1
+65 99 1
+65 109 1
+65 115 1
+65 118 1
+65 120 1
+65 147 1
+65 168 1
+65 183 1
+65 193 1
+65 199 1
+65 202 1
+65 204 1
+65 224 1
+65 239 1
+65 249 1
+65 255 1
+65 258 1
+65 260 1
+65 274 1
+65 284 1
+65 290 1
+65 293 1
+65 295 1
+65 304 1
+65 310 1
+65 313 1
+65 315 1
+65 320 1
+65 323 1
+65 325 1
+65 327 1
+65 329 1
+65 330 1
+65 357 1
+65 378 1
+65 393 1
+65 403 1
+65 409 1
+65 412 1
+65 414 1
+65 434 1
+65 449 1
+65 459 1
+65 465 1
+65 468 1
+65 470 1
+65 484 1
+65 494 1
+65 500 1
+65 503 1
+65 505 1
+65 514 1
+65 520 1
+65 523 1
+65 525 1
+65 530 1
+65 533 1
+65 535 1
+65 537 1
+65 539 1
+65 540 1
+65 560 1
+65 575 1
+65 585 1
+65 591 1
+65 594 1
+65 596 1
+65 610 1
+65 620 1
+65 626 1
+65 629 1
+65 631 1
+65 640 1
+65 646 1
+65 649 1
+65 651 1
+65 656 1
+65 659 1
+65 661 1
+65 663 1
+65 665 1
+65 666 1
+65 680 1
+65 690 1
+65 696 1
+65 699 1
+65 701 1
+65 710 1
+65 716 1
+65 719 1
+65 721 1
+65 726 1
+65 729 1
+65 731 1
+65 733 1
+65 735 1
+65 736 1
+65 745 1
+65 751 1
+65 754 1
+65 756 1
+65 761 1
+65 764 1
+65 766 1
+65 768 1
+65 770 1
+65 771 1
+65 776 1
+65 779 1
+65 781 1
+65 783 1
+65 785 1
+65 786 1
+65 788 1
+65 790 1
+65 791 1
+65 792 1
+66 36 1
+66 64 1
+66 85 1
+66 100 1
+66 110 1
+66 116 1
+66 119 1
+66 120 1
+66 148 1
+66 169 1
+66 184 1
+66 194 1
+66 200 1
+66 203 1
+66 204 1
+66 225 1
+66 240 1
+66 250 1
+66 256 1
+66 259 1
+66 260 1
+66 275 1
+66 285 1
+66 291 1
+66 294 1
+66 295 1
+66 305 1
+66 311 1
+66 314 1
+66 315 1
+66 321 1
+66 324 1
+66 325 1
+66 328 1
+66 329 1
+66 330 1
+66 358 1
+66 379 1
+66 394 1
+66 404 1
+66 410 1
+66 413 1
+66 414 1
+66 435 1
+66 450 1
+66 460 1
+66 466 1
+66 469 1
+66 470 1
+66 485 1
+66 495 1
+66 501 1
+66 504 1
+66 505 1
+66 515 1
+66 521 1
+66 524 1
+66 525 1
+66 531 1
+66 534 1
+66 535 1
+66 538 1
+66 539 1
+66 540 1
+66 561 1
+66 576 1
+66 586 1
+66 592 1
+66 595 1
+66 596 1
+66 611 1
+66 621 1
+66 627 1
+66 630 1
+66 631 1
+66 641 1
+66 647 1
+66 650 1
+66 651 1
+66 657 1
+66 660 1
+66 661 1
+66 664 1
+66 665 1
+66 666 1
+66 681 1
+66 691 1
+66 697 1
+66 700 1
+66 701 1
+66 711 1
+66 717 1
+66 720 1
+66 721 1
+66 727 1
+66 730 1
+66 731 1
+66 734 1
+66 735 1
+66 736 1
+66 746 1
+66 752 1
+66 755 1
+66 756 1
+66 762 1
+66 765 1
+66 766 1
+66 769 1
+66 770 1
+66 771 1
+66 777 1
+66 780 1
+66 781 1
+66 784 1
+66 785 1
+66 786 1
+66 789 1
+66 790 1
+66 791 1
+66 792 1
+0 0 0
diff --git a/benchmarks/matrix/bibd_12_5_66x792.sms.gz b/benchmarks/matrix/bibd_12_5_66x792.sms.gz
new file mode 100644
index 0000000..7069158
Binary files /dev/null and b/benchmarks/matrix/bibd_12_5_66x792.sms.gz differ
diff --git a/benchmarks/matrix/bibd_13_6_78x1716.sms b/benchmarks/matrix/bibd_13_6_78x1716.sms
new file mode 100644
index 0000000..e94826d
--- /dev/null
+++ b/benchmarks/matrix/bibd_13_6_78x1716.sms
@@ -0,0 +1,25742 @@
+78 1716 M
+1 1 1
+1 2 1
+1 3 1
+1 4 1
+1 5 1
+1 6 1
+1 7 1
+1 8 1
+1 9 1
+1 10 1
+1 11 1
+1 12 1
+1 13 1
+1 14 1
+1 15 1
+1 16 1
+1 17 1
+1 18 1
+1 19 1
+1 20 1
+1 21 1
+1 22 1
+1 23 1
+1 24 1
+1 25 1
+1 26 1
+1 27 1
+1 28 1
+1 29 1
+1 30 1
+1 31 1
+1 32 1
+1 33 1
+1 34 1
+1 35 1
+1 36 1
+1 37 1
+1 38 1
+1 39 1
+1 40 1
+1 41 1
+1 42 1
+1 43 1
+1 44 1
+1 45 1
+1 46 1
+1 47 1
+1 48 1
+1 49 1
+1 50 1
+1 51 1
+1 52 1
+1 53 1
+1 54 1
+1 55 1
+1 56 1
+1 57 1
+1 58 1
+1 59 1
+1 60 1
+1 61 1
+1 62 1
+1 63 1
+1 64 1
+1 65 1
+1 66 1
+1 67 1
+1 68 1
+1 69 1
+1 70 1
+1 71 1
+1 72 1
+1 73 1
+1 74 1
+1 75 1
+1 76 1
+1 77 1
+1 78 1
+1 79 1
+1 80 1
+1 81 1
+1 82 1
+1 83 1
+1 84 1
+1 85 1
+1 86 1
+1 87 1
+1 88 1
+1 89 1
+1 90 1
+1 91 1
+1 92 1
+1 93 1
+1 94 1
+1 95 1
+1 96 1
+1 97 1
+1 98 1
+1 99 1
+1 100 1
+1 101 1
+1 102 1
+1 103 1
+1 104 1
+1 105 1
+1 106 1
+1 107 1
+1 108 1
+1 109 1
+1 110 1
+1 111 1
+1 112 1
+1 113 1
+1 114 1
+1 115 1
+1 116 1
+1 117 1
+1 118 1
+1 119 1
+1 120 1
+1 121 1
+1 122 1
+1 123 1
+1 124 1
+1 125 1
+1 126 1
+1 127 1
+1 128 1
+1 129 1
+1 130 1
+1 131 1
+1 132 1
+1 133 1
+1 134 1
+1 135 1
+1 136 1
+1 137 1
+1 138 1
+1 139 1
+1 140 1
+1 141 1
+1 142 1
+1 143 1
+1 144 1
+1 145 1
+1 146 1
+1 147 1
+1 148 1
+1 149 1
+1 150 1
+1 151 1
+1 152 1
+1 153 1
+1 154 1
+1 155 1
+1 156 1
+1 157 1
+1 158 1
+1 159 1
+1 160 1
+1 161 1
+1 162 1
+1 163 1
+1 164 1
+1 165 1
+1 166 1
+1 167 1
+1 168 1
+1 169 1
+1 170 1
+1 171 1
+1 172 1
+1 173 1
+1 174 1
+1 175 1
+1 176 1
+1 177 1
+1 178 1
+1 179 1
+1 180 1
+1 181 1
+1 182 1
+1 183 1
+1 184 1
+1 185 1
+1 186 1
+1 187 1
+1 188 1
+1 189 1
+1 190 1
+1 191 1
+1 192 1
+1 193 1
+1 194 1
+1 195 1
+1 196 1
+1 197 1
+1 198 1
+1 199 1
+1 200 1
+1 201 1
+1 202 1
+1 203 1
+1 204 1
+1 205 1
+1 206 1
+1 207 1
+1 208 1
+1 209 1
+1 210 1
+1 211 1
+1 212 1
+1 213 1
+1 214 1
+1 215 1
+1 216 1
+1 217 1
+1 218 1
+1 219 1
+1 220 1
+1 221 1
+1 222 1
+1 223 1
+1 224 1
+1 225 1
+1 226 1
+1 227 1
+1 228 1
+1 229 1
+1 230 1
+1 231 1
+1 232 1
+1 233 1
+1 234 1
+1 235 1
+1 236 1
+1 237 1
+1 238 1
+1 239 1
+1 240 1
+1 241 1
+1 242 1
+1 243 1
+1 244 1
+1 245 1
+1 246 1
+1 247 1
+1 248 1
+1 249 1
+1 250 1
+1 251 1
+1 252 1
+1 253 1
+1 254 1
+1 255 1
+1 256 1
+1 257 1
+1 258 1
+1 259 1
+1 260 1
+1 261 1
+1 262 1
+1 263 1
+1 264 1
+1 265 1
+1 266 1
+1 267 1
+1 268 1
+1 269 1
+1 270 1
+1 271 1
+1 272 1
+1 273 1
+1 274 1
+1 275 1
+1 276 1
+1 277 1
+1 278 1
+1 279 1
+1 280 1
+1 281 1
+1 282 1
+1 283 1
+1 284 1
+1 285 1
+1 286 1
+1 287 1
+1 288 1
+1 289 1
+1 290 1
+1 291 1
+1 292 1
+1 293 1
+1 294 1
+1 295 1
+1 296 1
+1 297 1
+1 298 1
+1 299 1
+1 300 1
+1 301 1
+1 302 1
+1 303 1
+1 304 1
+1 305 1
+1 306 1
+1 307 1
+1 308 1
+1 309 1
+1 310 1
+1 311 1
+1 312 1
+1 313 1
+1 314 1
+1 315 1
+1 316 1
+1 317 1
+1 318 1
+1 319 1
+1 320 1
+1 321 1
+1 322 1
+1 323 1
+1 324 1
+1 325 1
+1 326 1
+1 327 1
+1 328 1
+1 329 1
+1 330 1
+2 1 1
+2 2 1
+2 3 1
+2 4 1
+2 5 1
+2 6 1
+2 7 1
+2 8 1
+2 9 1
+2 10 1
+2 11 1
+2 12 1
+2 13 1
+2 14 1
+2 15 1
+2 16 1
+2 17 1
+2 18 1
+2 19 1
+2 20 1
+2 21 1
+2 22 1
+2 23 1
+2 24 1
+2 25 1
+2 26 1
+2 27 1
+2 28 1
+2 29 1
+2 30 1
+2 31 1
+2 32 1
+2 33 1
+2 34 1
+2 35 1
+2 36 1
+2 37 1
+2 38 1
+2 39 1
+2 40 1
+2 41 1
+2 42 1
+2 43 1
+2 44 1
+2 45 1
+2 46 1
+2 47 1
+2 48 1
+2 49 1
+2 50 1
+2 51 1
+2 52 1
+2 53 1
+2 54 1
+2 55 1
+2 56 1
+2 57 1
+2 58 1
+2 59 1
+2 60 1
+2 61 1
+2 62 1
+2 63 1
+2 64 1
+2 65 1
+2 66 1
+2 67 1
+2 68 1
+2 69 1
+2 70 1
+2 71 1
+2 72 1
+2 73 1
+2 74 1
+2 75 1
+2 76 1
+2 77 1
+2 78 1
+2 79 1
+2 80 1
+2 81 1
+2 82 1
+2 83 1
+2 84 1
+2 85 1
+2 86 1
+2 87 1
+2 88 1
+2 89 1
+2 90 1
+2 91 1
+2 92 1
+2 93 1
+2 94 1
+2 95 1
+2 96 1
+2 97 1
+2 98 1
+2 99 1
+2 100 1
+2 101 1
+2 102 1
+2 103 1
+2 104 1
+2 105 1
+2 106 1
+2 107 1
+2 108 1
+2 109 1
+2 110 1
+2 111 1
+2 112 1
+2 113 1
+2 114 1
+2 115 1
+2 116 1
+2 117 1
+2 118 1
+2 119 1
+2 120 1
+2 331 1
+2 332 1
+2 333 1
+2 334 1
+2 335 1
+2 336 1
+2 337 1
+2 338 1
+2 339 1
+2 340 1
+2 341 1
+2 342 1
+2 343 1
+2 344 1
+2 345 1
+2 346 1
+2 347 1
+2 348 1
+2 349 1
+2 350 1
+2 351 1
+2 352 1
+2 353 1
+2 354 1
+2 355 1
+2 356 1
+2 357 1
+2 358 1
+2 359 1
+2 360 1
+2 361 1
+2 362 1
+2 363 1
+2 364 1
+2 365 1
+2 366 1
+2 367 1
+2 368 1
+2 369 1
+2 370 1
+2 371 1
+2 372 1
+2 373 1
+2 374 1
+2 375 1
+2 376 1
+2 377 1
+2 378 1
+2 379 1
+2 380 1
+2 381 1
+2 382 1
+2 383 1
+2 384 1
+2 385 1
+2 386 1
+2 387 1
+2 388 1
+2 389 1
+2 390 1
+2 391 1
+2 392 1
+2 393 1
+2 394 1
+2 395 1
+2 396 1
+2 397 1
+2 398 1
+2 399 1
+2 400 1
+2 401 1
+2 402 1
+2 403 1
+2 404 1
+2 405 1
+2 406 1
+2 407 1
+2 408 1
+2 409 1
+2 410 1
+2 411 1
+2 412 1
+2 413 1
+2 414 1
+2 415 1
+2 416 1
+2 417 1
+2 418 1
+2 419 1
+2 420 1
+2 421 1
+2 422 1
+2 423 1
+2 424 1
+2 425 1
+2 426 1
+2 427 1
+2 428 1
+2 429 1
+2 430 1
+2 431 1
+2 432 1
+2 433 1
+2 434 1
+2 435 1
+2 436 1
+2 437 1
+2 438 1
+2 439 1
+2 440 1
+2 441 1
+2 442 1
+2 443 1
+2 444 1
+2 445 1
+2 446 1
+2 447 1
+2 448 1
+2 449 1
+2 450 1
+2 451 1
+2 452 1
+2 453 1
+2 454 1
+2 455 1
+2 456 1
+2 457 1
+2 458 1
+2 459 1
+2 460 1
+2 461 1
+2 462 1
+2 463 1
+2 464 1
+2 465 1
+2 466 1
+2 467 1
+2 468 1
+2 469 1
+2 470 1
+2 471 1
+2 472 1
+2 473 1
+2 474 1
+2 475 1
+2 476 1
+2 477 1
+2 478 1
+2 479 1
+2 480 1
+2 481 1
+2 482 1
+2 483 1
+2 484 1
+2 485 1
+2 486 1
+2 487 1
+2 488 1
+2 489 1
+2 490 1
+2 491 1
+2 492 1
+2 493 1
+2 494 1
+2 495 1
+2 496 1
+2 497 1
+2 498 1
+2 499 1
+2 500 1
+2 501 1
+2 502 1
+2 503 1
+2 504 1
+2 505 1
+2 506 1
+2 507 1
+2 508 1
+2 509 1
+2 510 1
+2 511 1
+2 512 1
+2 513 1
+2 514 1
+2 515 1
+2 516 1
+2 517 1
+2 518 1
+2 519 1
+2 520 1
+2 521 1
+2 522 1
+2 523 1
+2 524 1
+2 525 1
+2 526 1
+2 527 1
+2 528 1
+2 529 1
+2 530 1
+2 531 1
+2 532 1
+2 533 1
+2 534 1
+2 535 1
+2 536 1
+2 537 1
+2 538 1
+2 539 1
+2 540 1
+3 1 1
+3 2 1
+3 3 1
+3 4 1
+3 5 1
+3 6 1
+3 7 1
+3 8 1
+3 9 1
+3 10 1
+3 11 1
+3 12 1
+3 13 1
+3 14 1
+3 15 1
+3 16 1
+3 17 1
+3 18 1
+3 19 1
+3 20 1
+3 21 1
+3 22 1
+3 23 1
+3 24 1
+3 25 1
+3 26 1
+3 27 1
+3 28 1
+3 29 1
+3 30 1
+3 31 1
+3 32 1
+3 33 1
+3 34 1
+3 35 1
+3 36 1
+3 121 1
+3 122 1
+3 123 1
+3 124 1
+3 125 1
+3 126 1
+3 127 1
+3 128 1
+3 129 1
+3 130 1
+3 131 1
+3 132 1
+3 133 1
+3 134 1
+3 135 1
+3 136 1
+3 137 1
+3 138 1
+3 139 1
+3 140 1
+3 141 1
+3 142 1
+3 143 1
+3 144 1
+3 145 1
+3 146 1
+3 147 1
+3 148 1
+3 149 1
+3 150 1
+3 151 1
+3 152 1
+3 153 1
+3 154 1
+3 155 1
+3 156 1
+3 157 1
+3 158 1
+3 159 1
+3 160 1
+3 161 1
+3 162 1
+3 163 1
+3 164 1
+3 165 1
+3 166 1
+3 167 1
+3 168 1
+3 169 1
+3 170 1
+3 171 1
+3 172 1
+3 173 1
+3 174 1
+3 175 1
+3 176 1
+3 177 1
+3 178 1
+3 179 1
+3 180 1
+3 181 1
+3 182 1
+3 183 1
+3 184 1
+3 185 1
+3 186 1
+3 187 1
+3 188 1
+3 189 1
+3 190 1
+3 191 1
+3 192 1
+3 193 1
+3 194 1
+3 195 1
+3 196 1
+3 197 1
+3 198 1
+3 199 1
+3 200 1
+3 201 1
+3 202 1
+3 203 1
+3 204 1
+3 331 1
+3 332 1
+3 333 1
+3 334 1
+3 335 1
+3 336 1
+3 337 1
+3 338 1
+3 339 1
+3 340 1
+3 341 1
+3 342 1
+3 343 1
+3 344 1
+3 345 1
+3 346 1
+3 347 1
+3 348 1
+3 349 1
+3 350 1
+3 351 1
+3 352 1
+3 353 1
+3 354 1
+3 355 1
+3 356 1
+3 357 1
+3 358 1
+3 359 1
+3 360 1
+3 361 1
+3 362 1
+3 363 1
+3 364 1
+3 365 1
+3 366 1
+3 367 1
+3 368 1
+3 369 1
+3 370 1
+3 371 1
+3 372 1
+3 373 1
+3 374 1
+3 375 1
+3 376 1
+3 377 1
+3 378 1
+3 379 1
+3 380 1
+3 381 1
+3 382 1
+3 383 1
+3 384 1
+3 385 1
+3 386 1
+3 387 1
+3 388 1
+3 389 1
+3 390 1
+3 391 1
+3 392 1
+3 393 1
+3 394 1
+3 395 1
+3 396 1
+3 397 1
+3 398 1
+3 399 1
+3 400 1
+3 401 1
+3 402 1
+3 403 1
+3 404 1
+3 405 1
+3 406 1
+3 407 1
+3 408 1
+3 409 1
+3 410 1
+3 411 1
+3 412 1
+3 413 1
+3 414 1
+3 541 1
+3 542 1
+3 543 1
+3 544 1
+3 545 1
+3 546 1
+3 547 1
+3 548 1
+3 549 1
+3 550 1
+3 551 1
+3 552 1
+3 553 1
+3 554 1
+3 555 1
+3 556 1
+3 557 1
+3 558 1
+3 559 1
+3 560 1
+3 561 1
+3 562 1
+3 563 1
+3 564 1
+3 565 1
+3 566 1
+3 567 1
+3 568 1
+3 569 1
+3 570 1
+3 571 1
+3 572 1
+3 573 1
+3 574 1
+3 575 1
+3 576 1
+3 577 1
+3 578 1
+3 579 1
+3 580 1
+3 581 1
+3 582 1
+3 583 1
+3 584 1
+3 585 1
+3 586 1
+3 587 1
+3 588 1
+3 589 1
+3 590 1
+3 591 1
+3 592 1
+3 593 1
+3 594 1
+3 595 1
+3 596 1
+3 597 1
+3 598 1
+3 599 1
+3 600 1
+3 601 1
+3 602 1
+3 603 1
+3 604 1
+3 605 1
+3 606 1
+3 607 1
+3 608 1
+3 609 1
+3 610 1
+3 611 1
+3 612 1
+3 613 1
+3 614 1
+3 615 1
+3 616 1
+3 617 1
+3 618 1
+3 619 1
+3 620 1
+3 621 1
+3 622 1
+3 623 1
+3 624 1
+3 625 1
+3 626 1
+3 627 1
+3 628 1
+3 629 1
+3 630 1
+3 631 1
+3 632 1
+3 633 1
+3 634 1
+3 635 1
+3 636 1
+3 637 1
+3 638 1
+3 639 1
+3 640 1
+3 641 1
+3 642 1
+3 643 1
+3 644 1
+3 645 1
+3 646 1
+3 647 1
+3 648 1
+3 649 1
+3 650 1
+3 651 1
+3 652 1
+3 653 1
+3 654 1
+3 655 1
+3 656 1
+3 657 1
+3 658 1
+3 659 1
+3 660 1
+3 661 1
+3 662 1
+3 663 1
+3 664 1
+3 665 1
+3 666 1
+4 1 1
+4 2 1
+4 3 1
+4 4 1
+4 5 1
+4 6 1
+4 7 1
+4 8 1
+4 37 1
+4 38 1
+4 39 1
+4 40 1
+4 41 1
+4 42 1
+4 43 1
+4 44 1
+4 45 1
+4 46 1
+4 47 1
+4 48 1
+4 49 1
+4 50 1
+4 51 1
+4 52 1
+4 53 1
+4 54 1
+4 55 1
+4 56 1
+4 57 1
+4 58 1
+4 59 1
+4 60 1
+4 61 1
+4 62 1
+4 63 1
+4 64 1
+4 121 1
+4 122 1
+4 123 1
+4 124 1
+4 125 1
+4 126 1
+4 127 1
+4 128 1
+4 129 1
+4 130 1
+4 131 1
+4 132 1
+4 133 1
+4 134 1
+4 135 1
+4 136 1
+4 137 1
+4 138 1
+4 139 1
+4 140 1
+4 141 1
+4 142 1
+4 143 1
+4 144 1
+4 145 1
+4 146 1
+4 147 1
+4 148 1
+4 205 1
+4 206 1
+4 207 1
+4 208 1
+4 209 1
+4 210 1
+4 211 1
+4 212 1
+4 213 1
+4 214 1
+4 215 1
+4 216 1
+4 217 1
+4 218 1
+4 219 1
+4 220 1
+4 221 1
+4 222 1
+4 223 1
+4 224 1
+4 225 1
+4 226 1
+4 227 1
+4 228 1
+4 229 1
+4 230 1
+4 231 1
+4 232 1
+4 233 1
+4 234 1
+4 235 1
+4 236 1
+4 237 1
+4 238 1
+4 239 1
+4 240 1
+4 241 1
+4 242 1
+4 243 1
+4 244 1
+4 245 1
+4 246 1
+4 247 1
+4 248 1
+4 249 1
+4 250 1
+4 251 1
+4 252 1
+4 253 1
+4 254 1
+4 255 1
+4 256 1
+4 257 1
+4 258 1
+4 259 1
+4 260 1
+4 331 1
+4 332 1
+4 333 1
+4 334 1
+4 335 1
+4 336 1
+4 337 1
+4 338 1
+4 339 1
+4 340 1
+4 341 1
+4 342 1
+4 343 1
+4 344 1
+4 345 1
+4 346 1
+4 347 1
+4 348 1
+4 349 1
+4 350 1
+4 351 1
+4 352 1
+4 353 1
+4 354 1
+4 355 1
+4 356 1
+4 357 1
+4 358 1
+4 415 1
+4 416 1
+4 417 1
+4 418 1
+4 419 1
+4 420 1
+4 421 1
+4 422 1
+4 423 1
+4 424 1
+4 425 1
+4 426 1
+4 427 1
+4 428 1
+4 429 1
+4 430 1
+4 431 1
+4 432 1
+4 433 1
+4 434 1
+4 435 1
+4 436 1
+4 437 1
+4 438 1
+4 439 1
+4 440 1
+4 441 1
+4 442 1
+4 443 1
+4 444 1
+4 445 1
+4 446 1
+4 447 1
+4 448 1
+4 449 1
+4 450 1
+4 451 1
+4 452 1
+4 453 1
+4 454 1
+4 455 1
+4 456 1
+4 457 1
+4 458 1
+4 459 1
+4 460 1
+4 461 1
+4 462 1
+4 463 1
+4 464 1
+4 465 1
+4 466 1
+4 467 1
+4 468 1
+4 469 1
+4 470 1
+4 541 1
+4 542 1
+4 543 1
+4 544 1
+4 545 1
+4 546 1
+4 547 1
+4 548 1
+4 549 1
+4 550 1
+4 551 1
+4 552 1
+4 553 1
+4 554 1
+4 555 1
+4 556 1
+4 557 1
+4 558 1
+4 559 1
+4 560 1
+4 561 1
+4 562 1
+4 563 1
+4 564 1
+4 565 1
+4 566 1
+4 567 1
+4 568 1
+4 569 1
+4 570 1
+4 571 1
+4 572 1
+4 573 1
+4 574 1
+4 575 1
+4 576 1
+4 577 1
+4 578 1
+4 579 1
+4 580 1
+4 581 1
+4 582 1
+4 583 1
+4 584 1
+4 585 1
+4 586 1
+4 587 1
+4 588 1
+4 589 1
+4 590 1
+4 591 1
+4 592 1
+4 593 1
+4 594 1
+4 595 1
+4 596 1
+4 667 1
+4 668 1
+4 669 1
+4 670 1
+4 671 1
+4 672 1
+4 673 1
+4 674 1
+4 675 1
+4 676 1
+4 677 1
+4 678 1
+4 679 1
+4 680 1
+4 681 1
+4 682 1
+4 683 1
+4 684 1
+4 685 1
+4 686 1
+4 687 1
+4 688 1
+4 689 1
+4 690 1
+4 691 1
+4 692 1
+4 693 1
+4 694 1
+4 695 1
+4 696 1
+4 697 1
+4 698 1
+4 699 1
+4 700 1
+4 701 1
+4 702 1
+4 703 1
+4 704 1
+4 705 1
+4 706 1
+4 707 1
+4 708 1
+4 709 1
+4 710 1
+4 711 1
+4 712 1
+4 713 1
+4 714 1
+4 715 1
+4 716 1
+4 717 1
+4 718 1
+4 719 1
+4 720 1
+4 721 1
+4 722 1
+4 723 1
+4 724 1
+4 725 1
+4 726 1
+4 727 1
+4 728 1
+4 729 1
+4 730 1
+4 731 1
+4 732 1
+4 733 1
+4 734 1
+4 735 1
+4 736 1
+5 1 1
+5 9 1
+5 10 1
+5 11 1
+5 12 1
+5 13 1
+5 14 1
+5 15 1
+5 37 1
+5 38 1
+5 39 1
+5 40 1
+5 41 1
+5 42 1
+5 43 1
+5 65 1
+5 66 1
+5 67 1
+5 68 1
+5 69 1
+5 70 1
+5 71 1
+5 72 1
+5 73 1
+5 74 1
+5 75 1
+5 76 1
+5 77 1
+5 78 1
+5 79 1
+5 80 1
+5 81 1
+5 82 1
+5 83 1
+5 84 1
+5 85 1
+5 121 1
+5 122 1
+5 123 1
+5 124 1
+5 125 1
+5 126 1
+5 127 1
+5 149 1
+5 150 1
+5 151 1
+5 152 1
+5 153 1
+5 154 1
+5 155 1
+5 156 1
+5 157 1
+5 158 1
+5 159 1
+5 160 1
+5 161 1
+5 162 1
+5 163 1
+5 164 1
+5 165 1
+5 166 1
+5 167 1
+5 168 1
+5 169 1
+5 205 1
+5 206 1
+5 207 1
+5 208 1
+5 209 1
+5 210 1
+5 211 1
+5 212 1
+5 213 1
+5 214 1
+5 215 1
+5 216 1
+5 217 1
+5 218 1
+5 219 1
+5 220 1
+5 221 1
+5 222 1
+5 223 1
+5 224 1
+5 225 1
+5 261 1
+5 262 1
+5 263 1
+5 264 1
+5 265 1
+5 266 1
+5 267 1
+5 268 1
+5 269 1
+5 270 1
+5 271 1
+5 272 1
+5 273 1
+5 274 1
+5 275 1
+5 276 1
+5 277 1
+5 278 1
+5 279 1
+5 280 1
+5 281 1
+5 282 1
+5 283 1
+5 284 1
+5 285 1
+5 286 1
+5 287 1
+5 288 1
+5 289 1
+5 290 1
+5 291 1
+5 292 1
+5 293 1
+5 294 1
+5 295 1
+5 331 1
+5 332 1
+5 333 1
+5 334 1
+5 335 1
+5 336 1
+5 337 1
+5 359 1
+5 360 1
+5 361 1
+5 362 1
+5 363 1
+5 364 1
+5 365 1
+5 366 1
+5 367 1
+5 368 1
+5 369 1
+5 370 1
+5 371 1
+5 372 1
+5 373 1
+5 374 1
+5 375 1
+5 376 1
+5 377 1
+5 378 1
+5 379 1
+5 415 1
+5 416 1
+5 417 1
+5 418 1
+5 419 1
+5 420 1
+5 421 1
+5 422 1
+5 423 1
+5 424 1
+5 425 1
+5 426 1
+5 427 1
+5 428 1
+5 429 1
+5 430 1
+5 431 1
+5 432 1
+5 433 1
+5 434 1
+5 435 1
+5 471 1
+5 472 1
+5 473 1
+5 474 1
+5 475 1
+5 476 1
+5 477 1
+5 478 1
+5 479 1
+5 480 1
+5 481 1
+5 482 1
+5 483 1
+5 484 1
+5 485 1
+5 486 1
+5 487 1
+5 488 1
+5 489 1
+5 490 1
+5 491 1
+5 492 1
+5 493 1
+5 494 1
+5 495 1
+5 496 1
+5 497 1
+5 498 1
+5 499 1
+5 500 1
+5 501 1
+5 502 1
+5 503 1
+5 504 1
+5 505 1
+5 541 1
+5 542 1
+5 543 1
+5 544 1
+5 545 1
+5 546 1
+5 547 1
+5 548 1
+5 549 1
+5 550 1
+5 551 1
+5 552 1
+5 553 1
+5 554 1
+5 555 1
+5 556 1
+5 557 1
+5 558 1
+5 559 1
+5 560 1
+5 561 1
+5 597 1
+5 598 1
+5 599 1
+5 600 1
+5 601 1
+5 602 1
+5 603 1
+5 604 1
+5 605 1
+5 606 1
+5 607 1
+5 608 1
+5 609 1
+5 610 1
+5 611 1
+5 612 1
+5 613 1
+5 614 1
+5 615 1
+5 616 1
+5 617 1
+5 618 1
+5 619 1
+5 620 1
+5 621 1
+5 622 1
+5 623 1
+5 624 1
+5 625 1
+5 626 1
+5 627 1
+5 628 1
+5 629 1
+5 630 1
+5 631 1
+5 667 1
+5 668 1
+5 669 1
+5 670 1
+5 671 1
+5 672 1
+5 673 1
+5 674 1
+5 675 1
+5 676 1
+5 677 1
+5 678 1
+5 679 1
+5 680 1
+5 681 1
+5 682 1
+5 683 1
+5 684 1
+5 685 1
+5 686 1
+5 687 1
+5 688 1
+5 689 1
+5 690 1
+5 691 1
+5 692 1
+5 693 1
+5 694 1
+5 695 1
+5 696 1
+5 697 1
+5 698 1
+5 699 1
+5 700 1
+5 701 1
+5 737 1
+5 738 1
+5 739 1
+5 740 1
+5 741 1
+5 742 1
+5 743 1
+5 744 1
+5 745 1
+5 746 1
+5 747 1
+5 748 1
+5 749 1
+5 750 1
+5 751 1
+5 752 1
+5 753 1
+5 754 1
+5 755 1
+5 756 1
+5 757 1
+5 758 1
+5 759 1
+5 760 1
+5 761 1
+5 762 1
+5 763 1
+5 764 1
+5 765 1
+5 766 1
+5 767 1
+5 768 1
+5 769 1
+5 770 1
+5 771 1
+6 2 1
+6 9 1
+6 16 1
+6 17 1
+6 18 1
+6 19 1
+6 20 1
+6 21 1
+6 37 1
+6 44 1
+6 45 1
+6 46 1
+6 47 1
+6 48 1
+6 49 1
+6 65 1
+6 66 1
+6 67 1
+6 68 1
+6 69 1
+6 70 1
+6 86 1
+6 87 1
+6 88 1
+6 89 1
+6 90 1
+6 91 1
+6 92 1
+6 93 1
+6 94 1
+6 95 1
+6 96 1
+6 97 1
+6 98 1
+6 99 1
+6 100 1
+6 121 1
+6 128 1
+6 129 1
+6 130 1
+6 131 1
+6 132 1
+6 133 1
+6 149 1
+6 150 1
+6 151 1
+6 152 1
+6 153 1
+6 154 1
+6 170 1
+6 171 1
+6 172 1
+6 173 1
+6 174 1
+6 175 1
+6 176 1
+6 177 1
+6 178 1
+6 179 1
+6 180 1
+6 181 1
+6 182 1
+6 183 1
+6 184 1
+6 205 1
+6 206 1
+6 207 1
+6 208 1
+6 209 1
+6 210 1
+6 226 1
+6 227 1
+6 228 1
+6 229 1
+6 230 1
+6 231 1
+6 232 1
+6 233 1
+6 234 1
+6 235 1
+6 236 1
+6 237 1
+6 238 1
+6 239 1
+6 240 1
+6 261 1
+6 262 1
+6 263 1
+6 264 1
+6 265 1
+6 266 1
+6 267 1
+6 268 1
+6 269 1
+6 270 1
+6 271 1
+6 272 1
+6 273 1
+6 274 1
+6 275 1
+6 296 1
+6 297 1
+6 298 1
+6 299 1
+6 300 1
+6 301 1
+6 302 1
+6 303 1
+6 304 1
+6 305 1
+6 306 1
+6 307 1
+6 308 1
+6 309 1
+6 310 1
+6 311 1
+6 312 1
+6 313 1
+6 314 1
+6 315 1
+6 331 1
+6 338 1
+6 339 1
+6 340 1
+6 341 1
+6 342 1
+6 343 1
+6 359 1
+6 360 1
+6 361 1
+6 362 1
+6 363 1
+6 364 1
+6 380 1
+6 381 1
+6 382 1
+6 383 1
+6 384 1
+6 385 1
+6 386 1
+6 387 1
+6 388 1
+6 389 1
+6 390 1
+6 391 1
+6 392 1
+6 393 1
+6 394 1
+6 415 1
+6 416 1
+6 417 1
+6 418 1
+6 419 1
+6 420 1
+6 436 1
+6 437 1
+6 438 1
+6 439 1
+6 440 1
+6 441 1
+6 442 1
+6 443 1
+6 444 1
+6 445 1
+6 446 1
+6 447 1
+6 448 1
+6 449 1
+6 450 1
+6 471 1
+6 472 1
+6 473 1
+6 474 1
+6 475 1
+6 476 1
+6 477 1
+6 478 1
+6 479 1
+6 480 1
+6 481 1
+6 482 1
+6 483 1
+6 484 1
+6 485 1
+6 506 1
+6 507 1
+6 508 1
+6 509 1
+6 510 1
+6 511 1
+6 512 1
+6 513 1
+6 514 1
+6 515 1
+6 516 1
+6 517 1
+6 518 1
+6 519 1
+6 520 1
+6 521 1
+6 522 1
+6 523 1
+6 524 1
+6 525 1
+6 541 1
+6 542 1
+6 543 1
+6 544 1
+6 545 1
+6 546 1
+6 562 1
+6 563 1
+6 564 1
+6 565 1
+6 566 1
+6 567 1
+6 568 1
+6 569 1
+6 570 1
+6 571 1
+6 572 1
+6 573 1
+6 574 1
+6 575 1
+6 576 1
+6 597 1
+6 598 1
+6 599 1
+6 600 1
+6 601 1
+6 602 1
+6 603 1
+6 604 1
+6 605 1
+6 606 1
+6 607 1
+6 608 1
+6 609 1
+6 610 1
+6 611 1
+6 632 1
+6 633 1
+6 634 1
+6 635 1
+6 636 1
+6 637 1
+6 638 1
+6 639 1
+6 640 1
+6 641 1
+6 642 1
+6 643 1
+6 644 1
+6 645 1
+6 646 1
+6 647 1
+6 648 1
+6 649 1
+6 650 1
+6 651 1
+6 667 1
+6 668 1
+6 669 1
+6 670 1
+6 671 1
+6 672 1
+6 673 1
+6 674 1
+6 675 1
+6 676 1
+6 677 1
+6 678 1
+6 679 1
+6 680 1
+6 681 1
+6 702 1
+6 703 1
+6 704 1
+6 705 1
+6 706 1
+6 707 1
+6 708 1
+6 709 1
+6 710 1
+6 711 1
+6 712 1
+6 713 1
+6 714 1
+6 715 1
+6 716 1
+6 717 1
+6 718 1
+6 719 1
+6 720 1
+6 721 1
+6 737 1
+6 738 1
+6 739 1
+6 740 1
+6 741 1
+6 742 1
+6 743 1
+6 744 1
+6 745 1
+6 746 1
+6 747 1
+6 748 1
+6 749 1
+6 750 1
+6 751 1
+6 752 1
+6 753 1
+6 754 1
+6 755 1
+6 756 1
+6 772 1
+6 773 1
+6 774 1
+6 775 1
+6 776 1
+6 777 1
+6 778 1
+6 779 1
+6 780 1
+6 781 1
+6 782 1
+6 783 1
+6 784 1
+6 785 1
+6 786 1
+7 3 1
+7 10 1
+7 16 1
+7 22 1
+7 23 1
+7 24 1
+7 25 1
+7 26 1
+7 38 1
+7 44 1
+7 50 1
+7 51 1
+7 52 1
+7 53 1
+7 54 1
+7 65 1
+7 71 1
+7 72 1
+7 73 1
+7 74 1
+7 75 1
+7 86 1
+7 87 1
+7 88 1
+7 89 1
+7 90 1
+7 101 1
+7 102 1
+7 103 1
+7 104 1
+7 105 1
+7 106 1
+7 107 1
+7 108 1
+7 109 1
+7 110 1
+7 122 1
+7 128 1
+7 134 1
+7 135 1
+7 136 1
+7 137 1
+7 138 1
+7 149 1
+7 155 1
+7 156 1
+7 157 1
+7 158 1
+7 159 1
+7 170 1
+7 171 1
+7 172 1
+7 173 1
+7 174 1
+7 185 1
+7 186 1
+7 187 1
+7 188 1
+7 189 1
+7 190 1
+7 191 1
+7 192 1
+7 193 1
+7 194 1
+7 205 1
+7 211 1
+7 212 1
+7 213 1
+7 214 1
+7 215 1
+7 226 1
+7 227 1
+7 228 1
+7 229 1
+7 230 1
+7 241 1
+7 242 1
+7 243 1
+7 244 1
+7 245 1
+7 246 1
+7 247 1
+7 248 1
+7 249 1
+7 250 1
+7 261 1
+7 262 1
+7 263 1
+7 264 1
+7 265 1
+7 276 1
+7 277 1
+7 278 1
+7 279 1
+7 280 1
+7 281 1
+7 282 1
+7 283 1
+7 284 1
+7 285 1
+7 296 1
+7 297 1
+7 298 1
+7 299 1
+7 300 1
+7 301 1
+7 302 1
+7 303 1
+7 304 1
+7 305 1
+7 316 1
+7 317 1
+7 318 1
+7 319 1
+7 320 1
+7 321 1
+7 322 1
+7 323 1
+7 324 1
+7 325 1
+7 332 1
+7 338 1
+7 344 1
+7 345 1
+7 346 1
+7 347 1
+7 348 1
+7 359 1
+7 365 1
+7 366 1
+7 367 1
+7 368 1
+7 369 1
+7 380 1
+7 381 1
+7 382 1
+7 383 1
+7 384 1
+7 395 1
+7 396 1
+7 397 1
+7 398 1
+7 399 1
+7 400 1
+7 401 1
+7 402 1
+7 403 1
+7 404 1
+7 415 1
+7 421 1
+7 422 1
+7 423 1
+7 424 1
+7 425 1
+7 436 1
+7 437 1
+7 438 1
+7 439 1
+7 440 1
+7 451 1
+7 452 1
+7 453 1
+7 454 1
+7 455 1
+7 456 1
+7 457 1
+7 458 1
+7 459 1
+7 460 1
+7 471 1
+7 472 1
+7 473 1
+7 474 1
+7 475 1
+7 486 1
+7 487 1
+7 488 1
+7 489 1
+7 490 1
+7 491 1
+7 492 1
+7 493 1
+7 494 1
+7 495 1
+7 506 1
+7 507 1
+7 508 1
+7 509 1
+7 510 1
+7 511 1
+7 512 1
+7 513 1
+7 514 1
+7 515 1
+7 526 1
+7 527 1
+7 528 1
+7 529 1
+7 530 1
+7 531 1
+7 532 1
+7 533 1
+7 534 1
+7 535 1
+7 541 1
+7 547 1
+7 548 1
+7 549 1
+7 550 1
+7 551 1
+7 562 1
+7 563 1
+7 564 1
+7 565 1
+7 566 1
+7 577 1
+7 578 1
+7 579 1
+7 580 1
+7 581 1
+7 582 1
+7 583 1
+7 584 1
+7 585 1
+7 586 1
+7 597 1
+7 598 1
+7 599 1
+7 600 1
+7 601 1
+7 612 1
+7 613 1
+7 614 1
+7 615 1
+7 616 1
+7 617 1
+7 618 1
+7 619 1
+7 620 1
+7 621 1
+7 632 1
+7 633 1
+7 634 1
+7 635 1
+7 636 1
+7 637 1
+7 638 1
+7 639 1
+7 640 1
+7 641 1
+7 652 1
+7 653 1
+7 654 1
+7 655 1
+7 656 1
+7 657 1
+7 658 1
+7 659 1
+7 660 1
+7 661 1
+7 667 1
+7 668 1
+7 669 1
+7 670 1
+7 671 1
+7 682 1
+7 683 1
+7 684 1
+7 685 1
+7 686 1
+7 687 1
+7 688 1
+7 689 1
+7 690 1
+7 691 1
+7 702 1
+7 703 1
+7 704 1
+7 705 1
+7 706 1
+7 707 1
+7 708 1
+7 709 1
+7 710 1
+7 711 1
+7 722 1
+7 723 1
+7 724 1
+7 725 1
+7 726 1
+7 727 1
+7 728 1
+7 729 1
+7 730 1
+7 731 1
+7 737 1
+7 738 1
+7 739 1
+7 740 1
+7 741 1
+7 742 1
+7 743 1
+7 744 1
+7 745 1
+7 746 1
+7 757 1
+7 758 1
+7 759 1
+7 760 1
+7 761 1
+7 762 1
+7 763 1
+7 764 1
+7 765 1
+7 766 1
+7 772 1
+7 773 1
+7 774 1
+7 775 1
+7 776 1
+7 777 1
+7 778 1
+7 779 1
+7 780 1
+7 781 1
+7 787 1
+7 788 1
+7 789 1
+7 790 1
+7 791 1
+8 4 1
+8 11 1
+8 17 1
+8 22 1
+8 27 1
+8 28 1
+8 29 1
+8 30 1
+8 39 1
+8 45 1
+8 50 1
+8 55 1
+8 56 1
+8 57 1
+8 58 1
+8 66 1
+8 71 1
+8 76 1
+8 77 1
+8 78 1
+8 79 1
+8 86 1
+8 91 1
+8 92 1
+8 93 1
+8 94 1
+8 101 1
+8 102 1
+8 103 1
+8 104 1
+8 111 1
+8 112 1
+8 113 1
+8 114 1
+8 115 1
+8 116 1
+8 123 1
+8 129 1
+8 134 1
+8 139 1
+8 140 1
+8 141 1
+8 142 1
+8 150 1
+8 155 1
+8 160 1
+8 161 1
+8 162 1
+8 163 1
+8 170 1
+8 175 1
+8 176 1
+8 177 1
+8 178 1
+8 185 1
+8 186 1
+8 187 1
+8 188 1
+8 195 1
+8 196 1
+8 197 1
+8 198 1
+8 199 1
+8 200 1
+8 206 1
+8 211 1
+8 216 1
+8 217 1
+8 218 1
+8 219 1
+8 226 1
+8 231 1
+8 232 1
+8 233 1
+8 234 1
+8 241 1
+8 242 1
+8 243 1
+8 244 1
+8 251 1
+8 252 1
+8 253 1
+8 254 1
+8 255 1
+8 256 1
+8 261 1
+8 266 1
+8 267 1
+8 268 1
+8 269 1
+8 276 1
+8 277 1
+8 278 1
+8 279 1
+8 286 1
+8 287 1
+8 288 1
+8 289 1
+8 290 1
+8 291 1
+8 296 1
+8 297 1
+8 298 1
+8 299 1
+8 306 1
+8 307 1
+8 308 1
+8 309 1
+8 310 1
+8 311 1
+8 316 1
+8 317 1
+8 318 1
+8 319 1
+8 320 1
+8 321 1
+8 326 1
+8 327 1
+8 328 1
+8 329 1
+8 333 1
+8 339 1
+8 344 1
+8 349 1
+8 350 1
+8 351 1
+8 352 1
+8 360 1
+8 365 1
+8 370 1
+8 371 1
+8 372 1
+8 373 1
+8 380 1
+8 385 1
+8 386 1
+8 387 1
+8 388 1
+8 395 1
+8 396 1
+8 397 1
+8 398 1
+8 405 1
+8 406 1
+8 407 1
+8 408 1
+8 409 1
+8 410 1
+8 416 1
+8 421 1
+8 426 1
+8 427 1
+8 428 1
+8 429 1
+8 436 1
+8 441 1
+8 442 1
+8 443 1
+8 444 1
+8 451 1
+8 452 1
+8 453 1
+8 454 1
+8 461 1
+8 462 1
+8 463 1
+8 464 1
+8 465 1
+8 466 1
+8 471 1
+8 476 1
+8 477 1
+8 478 1
+8 479 1
+8 486 1
+8 487 1
+8 488 1
+8 489 1
+8 496 1
+8 497 1
+8 498 1
+8 499 1
+8 500 1
+8 501 1
+8 506 1
+8 507 1
+8 508 1
+8 509 1
+8 516 1
+8 517 1
+8 518 1
+8 519 1
+8 520 1
+8 521 1
+8 526 1
+8 527 1
+8 528 1
+8 529 1
+8 530 1
+8 531 1
+8 536 1
+8 537 1
+8 538 1
+8 539 1
+8 542 1
+8 547 1
+8 552 1
+8 553 1
+8 554 1
+8 555 1
+8 562 1
+8 567 1
+8 568 1
+8 569 1
+8 570 1
+8 577 1
+8 578 1
+8 579 1
+8 580 1
+8 587 1
+8 588 1
+8 589 1
+8 590 1
+8 591 1
+8 592 1
+8 597 1
+8 602 1
+8 603 1
+8 604 1
+8 605 1
+8 612 1
+8 613 1
+8 614 1
+8 615 1
+8 622 1
+8 623 1
+8 624 1
+8 625 1
+8 626 1
+8 627 1
+8 632 1
+8 633 1
+8 634 1
+8 635 1
+8 642 1
+8 643 1
+8 644 1
+8 645 1
+8 646 1
+8 647 1
+8 652 1
+8 653 1
+8 654 1
+8 655 1
+8 656 1
+8 657 1
+8 662 1
+8 663 1
+8 664 1
+8 665 1
+8 667 1
+8 672 1
+8 673 1
+8 674 1
+8 675 1
+8 682 1
+8 683 1
+8 684 1
+8 685 1
+8 692 1
+8 693 1
+8 694 1
+8 695 1
+8 696 1
+8 697 1
+8 702 1
+8 703 1
+8 704 1
+8 705 1
+8 712 1
+8 713 1
+8 714 1
+8 715 1
+8 716 1
+8 717 1
+8 722 1
+8 723 1
+8 724 1
+8 725 1
+8 726 1
+8 727 1
+8 732 1
+8 733 1
+8 734 1
+8 735 1
+8 737 1
+8 738 1
+8 739 1
+8 740 1
+8 747 1
+8 748 1
+8 749 1
+8 750 1
+8 751 1
+8 752 1
+8 757 1
+8 758 1
+8 759 1
+8 760 1
+8 761 1
+8 762 1
+8 767 1
+8 768 1
+8 769 1
+8 770 1
+8 772 1
+8 773 1
+8 774 1
+8 775 1
+8 776 1
+8 777 1
+8 782 1
+8 783 1
+8 784 1
+8 785 1
+8 787 1
+8 788 1
+8 789 1
+8 790 1
+8 792 1
+9 5 1
+9 12 1
+9 18 1
+9 23 1
+9 27 1
+9 31 1
+9 32 1
+9 33 1
+9 40 1
+9 46 1
+9 51 1
+9 55 1
+9 59 1
+9 60 1
+9 61 1
+9 67 1
+9 72 1
+9 76 1
+9 80 1
+9 81 1
+9 82 1
+9 87 1
+9 91 1
+9 95 1
+9 96 1
+9 97 1
+9 101 1
+9 105 1
+9 106 1
+9 107 1
+9 111 1
+9 112 1
+9 113 1
+9 117 1
+9 118 1
+9 119 1
+9 124 1
+9 130 1
+9 135 1
+9 139 1
+9 143 1
+9 144 1
+9 145 1
+9 151 1
+9 156 1
+9 160 1
+9 164 1
+9 165 1
+9 166 1
+9 171 1
+9 175 1
+9 179 1
+9 180 1
+9 181 1
+9 185 1
+9 189 1
+9 190 1
+9 191 1
+9 195 1
+9 196 1
+9 197 1
+9 201 1
+9 202 1
+9 203 1
+9 207 1
+9 212 1
+9 216 1
+9 220 1
+9 221 1
+9 222 1
+9 227 1
+9 231 1
+9 235 1
+9 236 1
+9 237 1
+9 241 1
+9 245 1
+9 246 1
+9 247 1
+9 251 1
+9 252 1
+9 253 1
+9 257 1
+9 258 1
+9 259 1
+9 262 1
+9 266 1
+9 270 1
+9 271 1
+9 272 1
+9 276 1
+9 280 1
+9 281 1
+9 282 1
+9 286 1
+9 287 1
+9 288 1
+9 292 1
+9 293 1
+9 294 1
+9 296 1
+9 300 1
+9 301 1
+9 302 1
+9 306 1
+9 307 1
+9 308 1
+9 312 1
+9 313 1
+9 314 1
+9 316 1
+9 317 1
+9 318 1
+9 322 1
+9 323 1
+9 324 1
+9 326 1
+9 327 1
+9 328 1
+9 330 1
+9 334 1
+9 340 1
+9 345 1
+9 349 1
+9 353 1
+9 354 1
+9 355 1
+9 361 1
+9 366 1
+9 370 1
+9 374 1
+9 375 1
+9 376 1
+9 381 1
+9 385 1
+9 389 1
+9 390 1
+9 391 1
+9 395 1
+9 399 1
+9 400 1
+9 401 1
+9 405 1
+9 406 1
+9 407 1
+9 411 1
+9 412 1
+9 413 1
+9 417 1
+9 422 1
+9 426 1
+9 430 1
+9 431 1
+9 432 1
+9 437 1
+9 441 1
+9 445 1
+9 446 1
+9 447 1
+9 451 1
+9 455 1
+9 456 1
+9 457 1
+9 461 1
+9 462 1
+9 463 1
+9 467 1
+9 468 1
+9 469 1
+9 472 1
+9 476 1
+9 480 1
+9 481 1
+9 482 1
+9 486 1
+9 490 1
+9 491 1
+9 492 1
+9 496 1
+9 497 1
+9 498 1
+9 502 1
+9 503 1
+9 504 1
+9 506 1
+9 510 1
+9 511 1
+9 512 1
+9 516 1
+9 517 1
+9 518 1
+9 522 1
+9 523 1
+9 524 1
+9 526 1
+9 527 1
+9 528 1
+9 532 1
+9 533 1
+9 534 1
+9 536 1
+9 537 1
+9 538 1
+9 540 1
+9 543 1
+9 548 1
+9 552 1
+9 556 1
+9 557 1
+9 558 1
+9 563 1
+9 567 1
+9 571 1
+9 572 1
+9 573 1
+9 577 1
+9 581 1
+9 582 1
+9 583 1
+9 587 1
+9 588 1
+9 589 1
+9 593 1
+9 594 1
+9 595 1
+9 598 1
+9 602 1
+9 606 1
+9 607 1
+9 608 1
+9 612 1
+9 616 1
+9 617 1
+9 618 1
+9 622 1
+9 623 1
+9 624 1
+9 628 1
+9 629 1
+9 630 1
+9 632 1
+9 636 1
+9 637 1
+9 638 1
+9 642 1
+9 643 1
+9 644 1
+9 648 1
+9 649 1
+9 650 1
+9 652 1
+9 653 1
+9 654 1
+9 658 1
+9 659 1
+9 660 1
+9 662 1
+9 663 1
+9 664 1
+9 666 1
+9 668 1
+9 672 1
+9 676 1
+9 677 1
+9 678 1
+9 682 1
+9 686 1
+9 687 1
+9 688 1
+9 692 1
+9 693 1
+9 694 1
+9 698 1
+9 699 1
+9 700 1
+9 702 1
+9 706 1
+9 707 1
+9 708 1
+9 712 1
+9 713 1
+9 714 1
+9 718 1
+9 719 1
+9 720 1
+9 722 1
+9 723 1
+9 724 1
+9 728 1
+9 729 1
+9 730 1
+9 732 1
+9 733 1
+9 734 1
+9 736 1
+9 737 1
+9 741 1
+9 742 1
+9 743 1
+9 747 1
+9 748 1
+9 749 1
+9 753 1
+9 754 1
+9 755 1
+9 757 1
+9 758 1
+9 759 1
+9 763 1
+9 764 1
+9 765 1
+9 767 1
+9 768 1
+9 769 1
+9 771 1
+9 772 1
+9 773 1
+9 774 1
+9 778 1
+9 779 1
+9 780 1
+9 782 1
+9 783 1
+9 784 1
+9 786 1
+9 787 1
+9 788 1
+9 789 1
+9 791 1
+9 792 1
+10 6 1
+10 13 1
+10 19 1
+10 24 1
+10 28 1
+10 31 1
+10 34 1
+10 35 1
+10 41 1
+10 47 1
+10 52 1
+10 56 1
+10 59 1
+10 62 1
+10 63 1
+10 68 1
+10 73 1
+10 77 1
+10 80 1
+10 83 1
+10 84 1
+10 88 1
+10 92 1
+10 95 1
+10 98 1
+10 99 1
+10 102 1
+10 105 1
+10 108 1
+10 109 1
+10 111 1
+10 114 1
+10 115 1
+10 117 1
+10 118 1
+10 120 1
+10 125 1
+10 131 1
+10 136 1
+10 140 1
+10 143 1
+10 146 1
+10 147 1
+10 152 1
+10 157 1
+10 161 1
+10 164 1
+10 167 1
+10 168 1
+10 172 1
+10 176 1
+10 179 1
+10 182 1
+10 183 1
+10 186 1
+10 189 1
+10 192 1
+10 193 1
+10 195 1
+10 198 1
+10 199 1
+10 201 1
+10 202 1
+10 204 1
+10 208 1
+10 213 1
+10 217 1
+10 220 1
+10 223 1
+10 224 1
+10 228 1
+10 232 1
+10 235 1
+10 238 1
+10 239 1
+10 242 1
+10 245 1
+10 248 1
+10 249 1
+10 251 1
+10 254 1
+10 255 1
+10 257 1
+10 258 1
+10 260 1
+10 263 1
+10 267 1
+10 270 1
+10 273 1
+10 274 1
+10 277 1
+10 280 1
+10 283 1
+10 284 1
+10 286 1
+10 289 1
+10 290 1
+10 292 1
+10 293 1
+10 295 1
+10 297 1
+10 300 1
+10 303 1
+10 304 1
+10 306 1
+10 309 1
+10 310 1
+10 312 1
+10 313 1
+10 315 1
+10 316 1
+10 319 1
+10 320 1
+10 322 1
+10 323 1
+10 325 1
+10 326 1
+10 327 1
+10 329 1
+10 330 1
+10 335 1
+10 341 1
+10 346 1
+10 350 1
+10 353 1
+10 356 1
+10 357 1
+10 362 1
+10 367 1
+10 371 1
+10 374 1
+10 377 1
+10 378 1
+10 382 1
+10 386 1
+10 389 1
+10 392 1
+10 393 1
+10 396 1
+10 399 1
+10 402 1
+10 403 1
+10 405 1
+10 408 1
+10 409 1
+10 411 1
+10 412 1
+10 414 1
+10 418 1
+10 423 1
+10 427 1
+10 430 1
+10 433 1
+10 434 1
+10 438 1
+10 442 1
+10 445 1
+10 448 1
+10 449 1
+10 452 1
+10 455 1
+10 458 1
+10 459 1
+10 461 1
+10 464 1
+10 465 1
+10 467 1
+10 468 1
+10 470 1
+10 473 1
+10 477 1
+10 480 1
+10 483 1
+10 484 1
+10 487 1
+10 490 1
+10 493 1
+10 494 1
+10 496 1
+10 499 1
+10 500 1
+10 502 1
+10 503 1
+10 505 1
+10 507 1
+10 510 1
+10 513 1
+10 514 1
+10 516 1
+10 519 1
+10 520 1
+10 522 1
+10 523 1
+10 525 1
+10 526 1
+10 529 1
+10 530 1
+10 532 1
+10 533 1
+10 535 1
+10 536 1
+10 537 1
+10 539 1
+10 540 1
+10 544 1
+10 549 1
+10 553 1
+10 556 1
+10 559 1
+10 560 1
+10 564 1
+10 568 1
+10 571 1
+10 574 1
+10 575 1
+10 578 1
+10 581 1
+10 584 1
+10 585 1
+10 587 1
+10 590 1
+10 591 1
+10 593 1
+10 594 1
+10 596 1
+10 599 1
+10 603 1
+10 606 1
+10 609 1
+10 610 1
+10 613 1
+10 616 1
+10 619 1
+10 620 1
+10 622 1
+10 625 1
+10 626 1
+10 628 1
+10 629 1
+10 631 1
+10 633 1
+10 636 1
+10 639 1
+10 640 1
+10 642 1
+10 645 1
+10 646 1
+10 648 1
+10 649 1
+10 651 1
+10 652 1
+10 655 1
+10 656 1
+10 658 1
+10 659 1
+10 661 1
+10 662 1
+10 663 1
+10 665 1
+10 666 1
+10 669 1
+10 673 1
+10 676 1
+10 679 1
+10 680 1
+10 683 1
+10 686 1
+10 689 1
+10 690 1
+10 692 1
+10 695 1
+10 696 1
+10 698 1
+10 699 1
+10 701 1
+10 703 1
+10 706 1
+10 709 1
+10 710 1
+10 712 1
+10 715 1
+10 716 1
+10 718 1
+10 719 1
+10 721 1
+10 722 1
+10 725 1
+10 726 1
+10 728 1
+10 729 1
+10 731 1
+10 732 1
+10 733 1
+10 735 1
+10 736 1
+10 738 1
+10 741 1
+10 744 1
+10 745 1
+10 747 1
+10 750 1
+10 751 1
+10 753 1
+10 754 1
+10 756 1
+10 757 1
+10 760 1
+10 761 1
+10 763 1
+10 764 1
+10 766 1
+10 767 1
+10 768 1
+10 770 1
+10 771 1
+10 772 1
+10 775 1
+10 776 1
+10 778 1
+10 779 1
+10 781 1
+10 782 1
+10 783 1
+10 785 1
+10 786 1
+10 787 1
+10 788 1
+10 790 1
+10 791 1
+10 792 1
+11 7 1
+11 14 1
+11 20 1
+11 25 1
+11 29 1
+11 32 1
+11 34 1
+11 36 1
+11 42 1
+11 48 1
+11 53 1
+11 57 1
+11 60 1
+11 62 1
+11 64 1
+11 69 1
+11 74 1
+11 78 1
+11 81 1
+11 83 1
+11 85 1
+11 89 1
+11 93 1
+11 96 1
+11 98 1
+11 100 1
+11 103 1
+11 106 1
+11 108 1
+11 110 1
+11 112 1
+11 114 1
+11 116 1
+11 117 1
+11 119 1
+11 120 1
+11 126 1
+11 132 1
+11 137 1
+11 141 1
+11 144 1
+11 146 1
+11 148 1
+11 153 1
+11 158 1
+11 162 1
+11 165 1
+11 167 1
+11 169 1
+11 173 1
+11 177 1
+11 180 1
+11 182 1
+11 184 1
+11 187 1
+11 190 1
+11 192 1
+11 194 1
+11 196 1
+11 198 1
+11 200 1
+11 201 1
+11 203 1
+11 204 1
+11 209 1
+11 214 1
+11 218 1
+11 221 1
+11 223 1
+11 225 1
+11 229 1
+11 233 1
+11 236 1
+11 238 1
+11 240 1
+11 243 1
+11 246 1
+11 248 1
+11 250 1
+11 252 1
+11 254 1
+11 256 1
+11 257 1
+11 259 1
+11 260 1
+11 264 1
+11 268 1
+11 271 1
+11 273 1
+11 275 1
+11 278 1
+11 281 1
+11 283 1
+11 285 1
+11 287 1
+11 289 1
+11 291 1
+11 292 1
+11 294 1
+11 295 1
+11 298 1
+11 301 1
+11 303 1
+11 305 1
+11 307 1
+11 309 1
+11 311 1
+11 312 1
+11 314 1
+11 315 1
+11 317 1
+11 319 1
+11 321 1
+11 322 1
+11 324 1
+11 325 1
+11 326 1
+11 328 1
+11 329 1
+11 330 1
+11 336 1
+11 342 1
+11 347 1
+11 351 1
+11 354 1
+11 356 1
+11 358 1
+11 363 1
+11 368 1
+11 372 1
+11 375 1
+11 377 1
+11 379 1
+11 383 1
+11 387 1
+11 390 1
+11 392 1
+11 394 1
+11 397 1
+11 400 1
+11 402 1
+11 404 1
+11 406 1
+11 408 1
+11 410 1
+11 411 1
+11 413 1
+11 414 1
+11 419 1
+11 424 1
+11 428 1
+11 431 1
+11 433 1
+11 435 1
+11 439 1
+11 443 1
+11 446 1
+11 448 1
+11 450 1
+11 453 1
+11 456 1
+11 458 1
+11 460 1
+11 462 1
+11 464 1
+11 466 1
+11 467 1
+11 469 1
+11 470 1
+11 474 1
+11 478 1
+11 481 1
+11 483 1
+11 485 1
+11 488 1
+11 491 1
+11 493 1
+11 495 1
+11 497 1
+11 499 1
+11 501 1
+11 502 1
+11 504 1
+11 505 1
+11 508 1
+11 511 1
+11 513 1
+11 515 1
+11 517 1
+11 519 1
+11 521 1
+11 522 1
+11 524 1
+11 525 1
+11 527 1
+11 529 1
+11 531 1
+11 532 1
+11 534 1
+11 535 1
+11 536 1
+11 538 1
+11 539 1
+11 540 1
+11 545 1
+11 550 1
+11 554 1
+11 557 1
+11 559 1
+11 561 1
+11 565 1
+11 569 1
+11 572 1
+11 574 1
+11 576 1
+11 579 1
+11 582 1
+11 584 1
+11 586 1
+11 588 1
+11 590 1
+11 592 1
+11 593 1
+11 595 1
+11 596 1
+11 600 1
+11 604 1
+11 607 1
+11 609 1
+11 611 1
+11 614 1
+11 617 1
+11 619 1
+11 621 1
+11 623 1
+11 625 1
+11 627 1
+11 628 1
+11 630 1
+11 631 1
+11 634 1
+11 637 1
+11 639 1
+11 641 1
+11 643 1
+11 645 1
+11 647 1
+11 648 1
+11 650 1
+11 651 1
+11 653 1
+11 655 1
+11 657 1
+11 658 1
+11 660 1
+11 661 1
+11 662 1
+11 664 1
+11 665 1
+11 666 1
+11 670 1
+11 674 1
+11 677 1
+11 679 1
+11 681 1
+11 684 1
+11 687 1
+11 689 1
+11 691 1
+11 693 1
+11 695 1
+11 697 1
+11 698 1
+11 700 1
+11 701 1
+11 704 1
+11 707 1
+11 709 1
+11 711 1
+11 713 1
+11 715 1
+11 717 1
+11 718 1
+11 720 1
+11 721 1
+11 723 1
+11 725 1
+11 727 1
+11 728 1
+11 730 1
+11 731 1
+11 732 1
+11 734 1
+11 735 1
+11 736 1
+11 739 1
+11 742 1
+11 744 1
+11 746 1
+11 748 1
+11 750 1
+11 752 1
+11 753 1
+11 755 1
+11 756 1
+11 758 1
+11 760 1
+11 762 1
+11 763 1
+11 765 1
+11 766 1
+11 767 1
+11 769 1
+11 770 1
+11 771 1
+11 773 1
+11 775 1
+11 777 1
+11 778 1
+11 780 1
+11 781 1
+11 782 1
+11 784 1
+11 785 1
+11 786 1
+11 787 1
+11 789 1
+11 790 1
+11 791 1
+11 792 1
+12 8 1
+12 15 1
+12 21 1
+12 26 1
+12 30 1
+12 33 1
+12 35 1
+12 36 1
+12 43 1
+12 49 1
+12 54 1
+12 58 1
+12 61 1
+12 63 1
+12 64 1
+12 70 1
+12 75 1
+12 79 1
+12 82 1
+12 84 1
+12 85 1
+12 90 1
+12 94 1
+12 97 1
+12 99 1
+12 100 1
+12 104 1
+12 107 1
+12 109 1
+12 110 1
+12 113 1
+12 115 1
+12 116 1
+12 118 1
+12 119 1
+12 120 1
+12 127 1
+12 133 1
+12 138 1
+12 142 1
+12 145 1
+12 147 1
+12 148 1
+12 154 1
+12 159 1
+12 163 1
+12 166 1
+12 168 1
+12 169 1
+12 174 1
+12 178 1
+12 181 1
+12 183 1
+12 184 1
+12 188 1
+12 191 1
+12 193 1
+12 194 1
+12 197 1
+12 199 1
+12 200 1
+12 202 1
+12 203 1
+12 204 1
+12 210 1
+12 215 1
+12 219 1
+12 222 1
+12 224 1
+12 225 1
+12 230 1
+12 234 1
+12 237 1
+12 239 1
+12 240 1
+12 244 1
+12 247 1
+12 249 1
+12 250 1
+12 253 1
+12 255 1
+12 256 1
+12 258 1
+12 259 1
+12 260 1
+12 265 1
+12 269 1
+12 272 1
+12 274 1
+12 275 1
+12 279 1
+12 282 1
+12 284 1
+12 285 1
+12 288 1
+12 290 1
+12 291 1
+12 293 1
+12 294 1
+12 295 1
+12 299 1
+12 302 1
+12 304 1
+12 305 1
+12 308 1
+12 310 1
+12 311 1
+12 313 1
+12 314 1
+12 315 1
+12 318 1
+12 320 1
+12 321 1
+12 323 1
+12 324 1
+12 325 1
+12 327 1
+12 328 1
+12 329 1
+12 330 1
+12 337 1
+12 343 1
+12 348 1
+12 352 1
+12 355 1
+12 357 1
+12 358 1
+12 364 1
+12 369 1
+12 373 1
+12 376 1
+12 378 1
+12 379 1
+12 384 1
+12 388 1
+12 391 1
+12 393 1
+12 394 1
+12 398 1
+12 401 1
+12 403 1
+12 404 1
+12 407 1
+12 409 1
+12 410 1
+12 412 1
+12 413 1
+12 414 1
+12 420 1
+12 425 1
+12 429 1
+12 432 1
+12 434 1
+12 435 1
+12 440 1
+12 444 1
+12 447 1
+12 449 1
+12 450 1
+12 454 1
+12 457 1
+12 459 1
+12 460 1
+12 463 1
+12 465 1
+12 466 1
+12 468 1
+12 469 1
+12 470 1
+12 475 1
+12 479 1
+12 482 1
+12 484 1
+12 485 1
+12 489 1
+12 492 1
+12 494 1
+12 495 1
+12 498 1
+12 500 1
+12 501 1
+12 503 1
+12 504 1
+12 505 1
+12 509 1
+12 512 1
+12 514 1
+12 515 1
+12 518 1
+12 520 1
+12 521 1
+12 523 1
+12 524 1
+12 525 1
+12 528 1
+12 530 1
+12 531 1
+12 533 1
+12 534 1
+12 535 1
+12 537 1
+12 538 1
+12 539 1
+12 540 1
+12 546 1
+12 551 1
+12 555 1
+12 558 1
+12 560 1
+12 561 1
+12 566 1
+12 570 1
+12 573 1
+12 575 1
+12 576 1
+12 580 1
+12 583 1
+12 585 1
+12 586 1
+12 589 1
+12 591 1
+12 592 1
+12 594 1
+12 595 1
+12 596 1
+12 601 1
+12 605 1
+12 608 1
+12 610 1
+12 611 1
+12 615 1
+12 618 1
+12 620 1
+12 621 1
+12 624 1
+12 626 1
+12 627 1
+12 629 1
+12 630 1
+12 631 1
+12 635 1
+12 638 1
+12 640 1
+12 641 1
+12 644 1
+12 646 1
+12 647 1
+12 649 1
+12 650 1
+12 651 1
+12 654 1
+12 656 1
+12 657 1
+12 659 1
+12 660 1
+12 661 1
+12 663 1
+12 664 1
+12 665 1
+12 666 1
+12 671 1
+12 675 1
+12 678 1
+12 680 1
+12 681 1
+12 685 1
+12 688 1
+12 690 1
+12 691 1
+12 694 1
+12 696 1
+12 697 1
+12 699 1
+12 700 1
+12 701 1
+12 705 1
+12 708 1
+12 710 1
+12 711 1
+12 714 1
+12 716 1
+12 717 1
+12 719 1
+12 720 1
+12 721 1
+12 724 1
+12 726 1
+12 727 1
+12 729 1
+12 730 1
+12 731 1
+12 733 1
+12 734 1
+12 735 1
+12 736 1
+12 740 1
+12 743 1
+12 745 1
+12 746 1
+12 749 1
+12 751 1
+12 752 1
+12 754 1
+12 755 1
+12 756 1
+12 759 1
+12 761 1
+12 762 1
+12 764 1
+12 765 1
+12 766 1
+12 768 1
+12 769 1
+12 770 1
+12 771 1
+12 774 1
+12 776 1
+12 777 1
+12 779 1
+12 780 1
+12 781 1
+12 783 1
+12 784 1
+12 785 1
+12 786 1
+12 788 1
+12 789 1
+12 790 1
+12 791 1
+12 792 1
+13 1 1
+13 2 1
+13 3 1
+13 4 1
+13 5 1
+13 6 1
+13 7 1
+13 8 1
+13 9 1
+13 10 1
+13 11 1
+13 12 1
+13 13 1
+13 14 1
+13 15 1
+13 16 1
+13 17 1
+13 18 1
+13 19 1
+13 20 1
+13 21 1
+13 22 1
+13 23 1
+13 24 1
+13 25 1
+13 26 1
+13 27 1
+13 28 1
+13 29 1
+13 30 1
+13 31 1
+13 32 1
+13 33 1
+13 34 1
+13 35 1
+13 36 1
+13 37 1
+13 38 1
+13 39 1
+13 40 1
+13 41 1
+13 42 1
+13 43 1
+13 44 1
+13 45 1
+13 46 1
+13 47 1
+13 48 1
+13 49 1
+13 50 1
+13 51 1
+13 52 1
+13 53 1
+13 54 1
+13 55 1
+13 56 1
+13 57 1
+13 58 1
+13 59 1
+13 60 1
+13 61 1
+13 62 1
+13 63 1
+13 64 1
+13 65 1
+13 66 1
+13 67 1
+13 68 1
+13 69 1
+13 70 1
+13 71 1
+13 72 1
+13 73 1
+13 74 1
+13 75 1
+13 76 1
+13 77 1
+13 78 1
+13 79 1
+13 80 1
+13 81 1
+13 82 1
+13 83 1
+13 84 1
+13 85 1
+13 86 1
+13 87 1
+13 88 1
+13 89 1
+13 90 1
+13 91 1
+13 92 1
+13 93 1
+13 94 1
+13 95 1
+13 96 1
+13 97 1
+13 98 1
+13 99 1
+13 100 1
+13 101 1
+13 102 1
+13 103 1
+13 104 1
+13 105 1
+13 106 1
+13 107 1
+13 108 1
+13 109 1
+13 110 1
+13 111 1
+13 112 1
+13 113 1
+13 114 1
+13 115 1
+13 116 1
+13 117 1
+13 118 1
+13 119 1
+13 120 1
+13 793 1
+13 794 1
+13 795 1
+13 796 1
+13 797 1
+13 798 1
+13 799 1
+13 800 1
+13 801 1
+13 802 1
+13 803 1
+13 804 1
+13 805 1
+13 806 1
+13 807 1
+13 808 1
+13 809 1
+13 810 1
+13 811 1
+13 812 1
+13 813 1
+13 814 1
+13 815 1
+13 816 1
+13 817 1
+13 818 1
+13 819 1
+13 820 1
+13 821 1
+13 822 1
+13 823 1
+13 824 1
+13 825 1
+13 826 1
+13 827 1
+13 828 1
+13 829 1
+13 830 1
+13 831 1
+13 832 1
+13 833 1
+13 834 1
+13 835 1
+13 836 1
+13 837 1
+13 838 1
+13 839 1
+13 840 1
+13 841 1
+13 842 1
+13 843 1
+13 844 1
+13 845 1
+13 846 1
+13 847 1
+13 848 1
+13 849 1
+13 850 1
+13 851 1
+13 852 1
+13 853 1
+13 854 1
+13 855 1
+13 856 1
+13 857 1
+13 858 1
+13 859 1
+13 860 1
+13 861 1
+13 862 1
+13 863 1
+13 864 1
+13 865 1
+13 866 1
+13 867 1
+13 868 1
+13 869 1
+13 870 1
+13 871 1
+13 872 1
+13 873 1
+13 874 1
+13 875 1
+13 876 1
+13 877 1
+13 878 1
+13 879 1
+13 880 1
+13 881 1
+13 882 1
+13 883 1
+13 884 1
+13 885 1
+13 886 1
+13 887 1
+13 888 1
+13 889 1
+13 890 1
+13 891 1
+13 892 1
+13 893 1
+13 894 1
+13 895 1
+13 896 1
+13 897 1
+13 898 1
+13 899 1
+13 900 1
+13 901 1
+13 902 1
+13 903 1
+13 904 1
+13 905 1
+13 906 1
+13 907 1
+13 908 1
+13 909 1
+13 910 1
+13 911 1
+13 912 1
+13 913 1
+13 914 1
+13 915 1
+13 916 1
+13 917 1
+13 918 1
+13 919 1
+13 920 1
+13 921 1
+13 922 1
+13 923 1
+13 924 1
+13 925 1
+13 926 1
+13 927 1
+13 928 1
+13 929 1
+13 930 1
+13 931 1
+13 932 1
+13 933 1
+13 934 1
+13 935 1
+13 936 1
+13 937 1
+13 938 1
+13 939 1
+13 940 1
+13 941 1
+13 942 1
+13 943 1
+13 944 1
+13 945 1
+13 946 1
+13 947 1
+13 948 1
+13 949 1
+13 950 1
+13 951 1
+13 952 1
+13 953 1
+13 954 1
+13 955 1
+13 956 1
+13 957 1
+13 958 1
+13 959 1
+13 960 1
+13 961 1
+13 962 1
+13 963 1
+13 964 1
+13 965 1
+13 966 1
+13 967 1
+13 968 1
+13 969 1
+13 970 1
+13 971 1
+13 972 1
+13 973 1
+13 974 1
+13 975 1
+13 976 1
+13 977 1
+13 978 1
+13 979 1
+13 980 1
+13 981 1
+13 982 1
+13 983 1
+13 984 1
+13 985 1
+13 986 1
+13 987 1
+13 988 1
+13 989 1
+13 990 1
+13 991 1
+13 992 1
+13 993 1
+13 994 1
+13 995 1
+13 996 1
+13 997 1
+13 998 1
+13 999 1
+13 1000 1
+13 1001 1
+13 1002 1
+14 1 1
+14 2 1
+14 3 1
+14 4 1
+14 5 1
+14 6 1
+14 7 1
+14 8 1
+14 9 1
+14 10 1
+14 11 1
+14 12 1
+14 13 1
+14 14 1
+14 15 1
+14 16 1
+14 17 1
+14 18 1
+14 19 1
+14 20 1
+14 21 1
+14 22 1
+14 23 1
+14 24 1
+14 25 1
+14 26 1
+14 27 1
+14 28 1
+14 29 1
+14 30 1
+14 31 1
+14 32 1
+14 33 1
+14 34 1
+14 35 1
+14 36 1
+14 121 1
+14 122 1
+14 123 1
+14 124 1
+14 125 1
+14 126 1
+14 127 1
+14 128 1
+14 129 1
+14 130 1
+14 131 1
+14 132 1
+14 133 1
+14 134 1
+14 135 1
+14 136 1
+14 137 1
+14 138 1
+14 139 1
+14 140 1
+14 141 1
+14 142 1
+14 143 1
+14 144 1
+14 145 1
+14 146 1
+14 147 1
+14 148 1
+14 149 1
+14 150 1
+14 151 1
+14 152 1
+14 153 1
+14 154 1
+14 155 1
+14 156 1
+14 157 1
+14 158 1
+14 159 1
+14 160 1
+14 161 1
+14 162 1
+14 163 1
+14 164 1
+14 165 1
+14 166 1
+14 167 1
+14 168 1
+14 169 1
+14 170 1
+14 171 1
+14 172 1
+14 173 1
+14 174 1
+14 175 1
+14 176 1
+14 177 1
+14 178 1
+14 179 1
+14 180 1
+14 181 1
+14 182 1
+14 183 1
+14 184 1
+14 185 1
+14 186 1
+14 187 1
+14 188 1
+14 189 1
+14 190 1
+14 191 1
+14 192 1
+14 193 1
+14 194 1
+14 195 1
+14 196 1
+14 197 1
+14 198 1
+14 199 1
+14 200 1
+14 201 1
+14 202 1
+14 203 1
+14 204 1
+14 793 1
+14 794 1
+14 795 1
+14 796 1
+14 797 1
+14 798 1
+14 799 1
+14 800 1
+14 801 1
+14 802 1
+14 803 1
+14 804 1
+14 805 1
+14 806 1
+14 807 1
+14 808 1
+14 809 1
+14 810 1
+14 811 1
+14 812 1
+14 813 1
+14 814 1
+14 815 1
+14 816 1
+14 817 1
+14 818 1
+14 819 1
+14 820 1
+14 821 1
+14 822 1
+14 823 1
+14 824 1
+14 825 1
+14 826 1
+14 827 1
+14 828 1
+14 829 1
+14 830 1
+14 831 1
+14 832 1
+14 833 1
+14 834 1
+14 835 1
+14 836 1
+14 837 1
+14 838 1
+14 839 1
+14 840 1
+14 841 1
+14 842 1
+14 843 1
+14 844 1
+14 845 1
+14 846 1
+14 847 1
+14 848 1
+14 849 1
+14 850 1
+14 851 1
+14 852 1
+14 853 1
+14 854 1
+14 855 1
+14 856 1
+14 857 1
+14 858 1
+14 859 1
+14 860 1
+14 861 1
+14 862 1
+14 863 1
+14 864 1
+14 865 1
+14 866 1
+14 867 1
+14 868 1
+14 869 1
+14 870 1
+14 871 1
+14 872 1
+14 873 1
+14 874 1
+14 875 1
+14 876 1
+14 1003 1
+14 1004 1
+14 1005 1
+14 1006 1
+14 1007 1
+14 1008 1
+14 1009 1
+14 1010 1
+14 1011 1
+14 1012 1
+14 1013 1
+14 1014 1
+14 1015 1
+14 1016 1
+14 1017 1
+14 1018 1
+14 1019 1
+14 1020 1
+14 1021 1
+14 1022 1
+14 1023 1
+14 1024 1
+14 1025 1
+14 1026 1
+14 1027 1
+14 1028 1
+14 1029 1
+14 1030 1
+14 1031 1
+14 1032 1
+14 1033 1
+14 1034 1
+14 1035 1
+14 1036 1
+14 1037 1
+14 1038 1
+14 1039 1
+14 1040 1
+14 1041 1
+14 1042 1
+14 1043 1
+14 1044 1
+14 1045 1
+14 1046 1
+14 1047 1
+14 1048 1
+14 1049 1
+14 1050 1
+14 1051 1
+14 1052 1
+14 1053 1
+14 1054 1
+14 1055 1
+14 1056 1
+14 1057 1
+14 1058 1
+14 1059 1
+14 1060 1
+14 1061 1
+14 1062 1
+14 1063 1
+14 1064 1
+14 1065 1
+14 1066 1
+14 1067 1
+14 1068 1
+14 1069 1
+14 1070 1
+14 1071 1
+14 1072 1
+14 1073 1
+14 1074 1
+14 1075 1
+14 1076 1
+14 1077 1
+14 1078 1
+14 1079 1
+14 1080 1
+14 1081 1
+14 1082 1
+14 1083 1
+14 1084 1
+14 1085 1
+14 1086 1
+14 1087 1
+14 1088 1
+14 1089 1
+14 1090 1
+14 1091 1
+14 1092 1
+14 1093 1
+14 1094 1
+14 1095 1
+14 1096 1
+14 1097 1
+14 1098 1
+14 1099 1
+14 1100 1
+14 1101 1
+14 1102 1
+14 1103 1
+14 1104 1
+14 1105 1
+14 1106 1
+14 1107 1
+14 1108 1
+14 1109 1
+14 1110 1
+14 1111 1
+14 1112 1
+14 1113 1
+14 1114 1
+14 1115 1
+14 1116 1
+14 1117 1
+14 1118 1
+14 1119 1
+14 1120 1
+14 1121 1
+14 1122 1
+14 1123 1
+14 1124 1
+14 1125 1
+14 1126 1
+14 1127 1
+14 1128 1
+15 1 1
+15 2 1
+15 3 1
+15 4 1
+15 5 1
+15 6 1
+15 7 1
+15 8 1
+15 37 1
+15 38 1
+15 39 1
+15 40 1
+15 41 1
+15 42 1
+15 43 1
+15 44 1
+15 45 1
+15 46 1
+15 47 1
+15 48 1
+15 49 1
+15 50 1
+15 51 1
+15 52 1
+15 53 1
+15 54 1
+15 55 1
+15 56 1
+15 57 1
+15 58 1
+15 59 1
+15 60 1
+15 61 1
+15 62 1
+15 63 1
+15 64 1
+15 121 1
+15 122 1
+15 123 1
+15 124 1
+15 125 1
+15 126 1
+15 127 1
+15 128 1
+15 129 1
+15 130 1
+15 131 1
+15 132 1
+15 133 1
+15 134 1
+15 135 1
+15 136 1
+15 137 1
+15 138 1
+15 139 1
+15 140 1
+15 141 1
+15 142 1
+15 143 1
+15 144 1
+15 145 1
+15 146 1
+15 147 1
+15 148 1
+15 205 1
+15 206 1
+15 207 1
+15 208 1
+15 209 1
+15 210 1
+15 211 1
+15 212 1
+15 213 1
+15 214 1
+15 215 1
+15 216 1
+15 217 1
+15 218 1
+15 219 1
+15 220 1
+15 221 1
+15 222 1
+15 223 1
+15 224 1
+15 225 1
+15 226 1
+15 227 1
+15 228 1
+15 229 1
+15 230 1
+15 231 1
+15 232 1
+15 233 1
+15 234 1
+15 235 1
+15 236 1
+15 237 1
+15 238 1
+15 239 1
+15 240 1
+15 241 1
+15 242 1
+15 243 1
+15 244 1
+15 245 1
+15 246 1
+15 247 1
+15 248 1
+15 249 1
+15 250 1
+15 251 1
+15 252 1
+15 253 1
+15 254 1
+15 255 1
+15 256 1
+15 257 1
+15 258 1
+15 259 1
+15 260 1
+15 793 1
+15 794 1
+15 795 1
+15 796 1
+15 797 1
+15 798 1
+15 799 1
+15 800 1
+15 801 1
+15 802 1
+15 803 1
+15 804 1
+15 805 1
+15 806 1
+15 807 1
+15 808 1
+15 809 1
+15 810 1
+15 811 1
+15 812 1
+15 813 1
+15 814 1
+15 815 1
+15 816 1
+15 817 1
+15 818 1
+15 819 1
+15 820 1
+15 877 1
+15 878 1
+15 879 1
+15 880 1
+15 881 1
+15 882 1
+15 883 1
+15 884 1
+15 885 1
+15 886 1
+15 887 1
+15 888 1
+15 889 1
+15 890 1
+15 891 1
+15 892 1
+15 893 1
+15 894 1
+15 895 1
+15 896 1
+15 897 1
+15 898 1
+15 899 1
+15 900 1
+15 901 1
+15 902 1
+15 903 1
+15 904 1
+15 905 1
+15 906 1
+15 907 1
+15 908 1
+15 909 1
+15 910 1
+15 911 1
+15 912 1
+15 913 1
+15 914 1
+15 915 1
+15 916 1
+15 917 1
+15 918 1
+15 919 1
+15 920 1
+15 921 1
+15 922 1
+15 923 1
+15 924 1
+15 925 1
+15 926 1
+15 927 1
+15 928 1
+15 929 1
+15 930 1
+15 931 1
+15 932 1
+15 1003 1
+15 1004 1
+15 1005 1
+15 1006 1
+15 1007 1
+15 1008 1
+15 1009 1
+15 1010 1
+15 1011 1
+15 1012 1
+15 1013 1
+15 1014 1
+15 1015 1
+15 1016 1
+15 1017 1
+15 1018 1
+15 1019 1
+15 1020 1
+15 1021 1
+15 1022 1
+15 1023 1
+15 1024 1
+15 1025 1
+15 1026 1
+15 1027 1
+15 1028 1
+15 1029 1
+15 1030 1
+15 1031 1
+15 1032 1
+15 1033 1
+15 1034 1
+15 1035 1
+15 1036 1
+15 1037 1
+15 1038 1
+15 1039 1
+15 1040 1
+15 1041 1
+15 1042 1
+15 1043 1
+15 1044 1
+15 1045 1
+15 1046 1
+15 1047 1
+15 1048 1
+15 1049 1
+15 1050 1
+15 1051 1
+15 1052 1
+15 1053 1
+15 1054 1
+15 1055 1
+15 1056 1
+15 1057 1
+15 1058 1
+15 1129 1
+15 1130 1
+15 1131 1
+15 1132 1
+15 1133 1
+15 1134 1
+15 1135 1
+15 1136 1
+15 1137 1
+15 1138 1
+15 1139 1
+15 1140 1
+15 1141 1
+15 1142 1
+15 1143 1
+15 1144 1
+15 1145 1
+15 1146 1
+15 1147 1
+15 1148 1
+15 1149 1
+15 1150 1
+15 1151 1
+15 1152 1
+15 1153 1
+15 1154 1
+15 1155 1
+15 1156 1
+15 1157 1
+15 1158 1
+15 1159 1
+15 1160 1
+15 1161 1
+15 1162 1
+15 1163 1
+15 1164 1
+15 1165 1
+15 1166 1
+15 1167 1
+15 1168 1
+15 1169 1
+15 1170 1
+15 1171 1
+15 1172 1
+15 1173 1
+15 1174 1
+15 1175 1
+15 1176 1
+15 1177 1
+15 1178 1
+15 1179 1
+15 1180 1
+15 1181 1
+15 1182 1
+15 1183 1
+15 1184 1
+15 1185 1
+15 1186 1
+15 1187 1
+15 1188 1
+15 1189 1
+15 1190 1
+15 1191 1
+15 1192 1
+15 1193 1
+15 1194 1
+15 1195 1
+15 1196 1
+15 1197 1
+15 1198 1
+16 1 1
+16 9 1
+16 10 1
+16 11 1
+16 12 1
+16 13 1
+16 14 1
+16 15 1
+16 37 1
+16 38 1
+16 39 1
+16 40 1
+16 41 1
+16 42 1
+16 43 1
+16 65 1
+16 66 1
+16 67 1
+16 68 1
+16 69 1
+16 70 1
+16 71 1
+16 72 1
+16 73 1
+16 74 1
+16 75 1
+16 76 1
+16 77 1
+16 78 1
+16 79 1
+16 80 1
+16 81 1
+16 82 1
+16 83 1
+16 84 1
+16 85 1
+16 121 1
+16 122 1
+16 123 1
+16 124 1
+16 125 1
+16 126 1
+16 127 1
+16 149 1
+16 150 1
+16 151 1
+16 152 1
+16 153 1
+16 154 1
+16 155 1
+16 156 1
+16 157 1
+16 158 1
+16 159 1
+16 160 1
+16 161 1
+16 162 1
+16 163 1
+16 164 1
+16 165 1
+16 166 1
+16 167 1
+16 168 1
+16 169 1
+16 205 1
+16 206 1
+16 207 1
+16 208 1
+16 209 1
+16 210 1
+16 211 1
+16 212 1
+16 213 1
+16 214 1
+16 215 1
+16 216 1
+16 217 1
+16 218 1
+16 219 1
+16 220 1
+16 221 1
+16 222 1
+16 223 1
+16 224 1
+16 225 1
+16 261 1
+16 262 1
+16 263 1
+16 264 1
+16 265 1
+16 266 1
+16 267 1
+16 268 1
+16 269 1
+16 270 1
+16 271 1
+16 272 1
+16 273 1
+16 274 1
+16 275 1
+16 276 1
+16 277 1
+16 278 1
+16 279 1
+16 280 1
+16 281 1
+16 282 1
+16 283 1
+16 284 1
+16 285 1
+16 286 1
+16 287 1
+16 288 1
+16 289 1
+16 290 1
+16 291 1
+16 292 1
+16 293 1
+16 294 1
+16 295 1
+16 793 1
+16 794 1
+16 795 1
+16 796 1
+16 797 1
+16 798 1
+16 799 1
+16 821 1
+16 822 1
+16 823 1
+16 824 1
+16 825 1
+16 826 1
+16 827 1
+16 828 1
+16 829 1
+16 830 1
+16 831 1
+16 832 1
+16 833 1
+16 834 1
+16 835 1
+16 836 1
+16 837 1
+16 838 1
+16 839 1
+16 840 1
+16 841 1
+16 877 1
+16 878 1
+16 879 1
+16 880 1
+16 881 1
+16 882 1
+16 883 1
+16 884 1
+16 885 1
+16 886 1
+16 887 1
+16 888 1
+16 889 1
+16 890 1
+16 891 1
+16 892 1
+16 893 1
+16 894 1
+16 895 1
+16 896 1
+16 897 1
+16 933 1
+16 934 1
+16 935 1
+16 936 1
+16 937 1
+16 938 1
+16 939 1
+16 940 1
+16 941 1
+16 942 1
+16 943 1
+16 944 1
+16 945 1
+16 946 1
+16 947 1
+16 948 1
+16 949 1
+16 950 1
+16 951 1
+16 952 1
+16 953 1
+16 954 1
+16 955 1
+16 956 1
+16 957 1
+16 958 1
+16 959 1
+16 960 1
+16 961 1
+16 962 1
+16 963 1
+16 964 1
+16 965 1
+16 966 1
+16 967 1
+16 1003 1
+16 1004 1
+16 1005 1
+16 1006 1
+16 1007 1
+16 1008 1
+16 1009 1
+16 1010 1
+16 1011 1
+16 1012 1
+16 1013 1
+16 1014 1
+16 1015 1
+16 1016 1
+16 1017 1
+16 1018 1
+16 1019 1
+16 1020 1
+16 1021 1
+16 1022 1
+16 1023 1
+16 1059 1
+16 1060 1
+16 1061 1
+16 1062 1
+16 1063 1
+16 1064 1
+16 1065 1
+16 1066 1
+16 1067 1
+16 1068 1
+16 1069 1
+16 1070 1
+16 1071 1
+16 1072 1
+16 1073 1
+16 1074 1
+16 1075 1
+16 1076 1
+16 1077 1
+16 1078 1
+16 1079 1
+16 1080 1
+16 1081 1
+16 1082 1
+16 1083 1
+16 1084 1
+16 1085 1
+16 1086 1
+16 1087 1
+16 1088 1
+16 1089 1
+16 1090 1
+16 1091 1
+16 1092 1
+16 1093 1
+16 1129 1
+16 1130 1
+16 1131 1
+16 1132 1
+16 1133 1
+16 1134 1
+16 1135 1
+16 1136 1
+16 1137 1
+16 1138 1
+16 1139 1
+16 1140 1
+16 1141 1
+16 1142 1
+16 1143 1
+16 1144 1
+16 1145 1
+16 1146 1
+16 1147 1
+16 1148 1
+16 1149 1
+16 1150 1
+16 1151 1
+16 1152 1
+16 1153 1
+16 1154 1
+16 1155 1
+16 1156 1
+16 1157 1
+16 1158 1
+16 1159 1
+16 1160 1
+16 1161 1
+16 1162 1
+16 1163 1
+16 1199 1
+16 1200 1
+16 1201 1
+16 1202 1
+16 1203 1
+16 1204 1
+16 1205 1
+16 1206 1
+16 1207 1
+16 1208 1
+16 1209 1
+16 1210 1
+16 1211 1
+16 1212 1
+16 1213 1
+16 1214 1
+16 1215 1
+16 1216 1
+16 1217 1
+16 1218 1
+16 1219 1
+16 1220 1
+16 1221 1
+16 1222 1
+16 1223 1
+16 1224 1
+16 1225 1
+16 1226 1
+16 1227 1
+16 1228 1
+16 1229 1
+16 1230 1
+16 1231 1
+16 1232 1
+16 1233 1
+17 2 1
+17 9 1
+17 16 1
+17 17 1
+17 18 1
+17 19 1
+17 20 1
+17 21 1
+17 37 1
+17 44 1
+17 45 1
+17 46 1
+17 47 1
+17 48 1
+17 49 1
+17 65 1
+17 66 1
+17 67 1
+17 68 1
+17 69 1
+17 70 1
+17 86 1
+17 87 1
+17 88 1
+17 89 1
+17 90 1
+17 91 1
+17 92 1
+17 93 1
+17 94 1
+17 95 1
+17 96 1
+17 97 1
+17 98 1
+17 99 1
+17 100 1
+17 121 1
+17 128 1
+17 129 1
+17 130 1
+17 131 1
+17 132 1
+17 133 1
+17 149 1
+17 150 1
+17 151 1
+17 152 1
+17 153 1
+17 154 1
+17 170 1
+17 171 1
+17 172 1
+17 173 1
+17 174 1
+17 175 1
+17 176 1
+17 177 1
+17 178 1
+17 179 1
+17 180 1
+17 181 1
+17 182 1
+17 183 1
+17 184 1
+17 205 1
+17 206 1
+17 207 1
+17 208 1
+17 209 1
+17 210 1
+17 226 1
+17 227 1
+17 228 1
+17 229 1
+17 230 1
+17 231 1
+17 232 1
+17 233 1
+17 234 1
+17 235 1
+17 236 1
+17 237 1
+17 238 1
+17 239 1
+17 240 1
+17 261 1
+17 262 1
+17 263 1
+17 264 1
+17 265 1
+17 266 1
+17 267 1
+17 268 1
+17 269 1
+17 270 1
+17 271 1
+17 272 1
+17 273 1
+17 274 1
+17 275 1
+17 296 1
+17 297 1
+17 298 1
+17 299 1
+17 300 1
+17 301 1
+17 302 1
+17 303 1
+17 304 1
+17 305 1
+17 306 1
+17 307 1
+17 308 1
+17 309 1
+17 310 1
+17 311 1
+17 312 1
+17 313 1
+17 314 1
+17 315 1
+17 793 1
+17 800 1
+17 801 1
+17 802 1
+17 803 1
+17 804 1
+17 805 1
+17 821 1
+17 822 1
+17 823 1
+17 824 1
+17 825 1
+17 826 1
+17 842 1
+17 843 1
+17 844 1
+17 845 1
+17 846 1
+17 847 1
+17 848 1
+17 849 1
+17 850 1
+17 851 1
+17 852 1
+17 853 1
+17 854 1
+17 855 1
+17 856 1
+17 877 1
+17 878 1
+17 879 1
+17 880 1
+17 881 1
+17 882 1
+17 898 1
+17 899 1
+17 900 1
+17 901 1
+17 902 1
+17 903 1
+17 904 1
+17 905 1
+17 906 1
+17 907 1
+17 908 1
+17 909 1
+17 910 1
+17 911 1
+17 912 1
+17 933 1
+17 934 1
+17 935 1
+17 936 1
+17 937 1
+17 938 1
+17 939 1
+17 940 1
+17 941 1
+17 942 1
+17 943 1
+17 944 1
+17 945 1
+17 946 1
+17 947 1
+17 968 1
+17 969 1
+17 970 1
+17 971 1
+17 972 1
+17 973 1
+17 974 1
+17 975 1
+17 976 1
+17 977 1
+17 978 1
+17 979 1
+17 980 1
+17 981 1
+17 982 1
+17 983 1
+17 984 1
+17 985 1
+17 986 1
+17 987 1
+17 1003 1
+17 1004 1
+17 1005 1
+17 1006 1
+17 1007 1
+17 1008 1
+17 1024 1
+17 1025 1
+17 1026 1
+17 1027 1
+17 1028 1
+17 1029 1
+17 1030 1
+17 1031 1
+17 1032 1
+17 1033 1
+17 1034 1
+17 1035 1
+17 1036 1
+17 1037 1
+17 1038 1
+17 1059 1
+17 1060 1
+17 1061 1
+17 1062 1
+17 1063 1
+17 1064 1
+17 1065 1
+17 1066 1
+17 1067 1
+17 1068 1
+17 1069 1
+17 1070 1
+17 1071 1
+17 1072 1
+17 1073 1
+17 1094 1
+17 1095 1
+17 1096 1
+17 1097 1
+17 1098 1
+17 1099 1
+17 1100 1
+17 1101 1
+17 1102 1
+17 1103 1
+17 1104 1
+17 1105 1
+17 1106 1
+17 1107 1
+17 1108 1
+17 1109 1
+17 1110 1
+17 1111 1
+17 1112 1
+17 1113 1
+17 1129 1
+17 1130 1
+17 1131 1
+17 1132 1
+17 1133 1
+17 1134 1
+17 1135 1
+17 1136 1
+17 1137 1
+17 1138 1
+17 1139 1
+17 1140 1
+17 1141 1
+17 1142 1
+17 1143 1
+17 1164 1
+17 1165 1
+17 1166 1
+17 1167 1
+17 1168 1
+17 1169 1
+17 1170 1
+17 1171 1
+17 1172 1
+17 1173 1
+17 1174 1
+17 1175 1
+17 1176 1
+17 1177 1
+17 1178 1
+17 1179 1
+17 1180 1
+17 1181 1
+17 1182 1
+17 1183 1
+17 1199 1
+17 1200 1
+17 1201 1
+17 1202 1
+17 1203 1
+17 1204 1
+17 1205 1
+17 1206 1
+17 1207 1
+17 1208 1
+17 1209 1
+17 1210 1
+17 1211 1
+17 1212 1
+17 1213 1
+17 1214 1
+17 1215 1
+17 1216 1
+17 1217 1
+17 1218 1
+17 1234 1
+17 1235 1
+17 1236 1
+17 1237 1
+17 1238 1
+17 1239 1
+17 1240 1
+17 1241 1
+17 1242 1
+17 1243 1
+17 1244 1
+17 1245 1
+17 1246 1
+17 1247 1
+17 1248 1
+18 3 1
+18 10 1
+18 16 1
+18 22 1
+18 23 1
+18 24 1
+18 25 1
+18 26 1
+18 38 1
+18 44 1
+18 50 1
+18 51 1
+18 52 1
+18 53 1
+18 54 1
+18 65 1
+18 71 1
+18 72 1
+18 73 1
+18 74 1
+18 75 1
+18 86 1
+18 87 1
+18 88 1
+18 89 1
+18 90 1
+18 101 1
+18 102 1
+18 103 1
+18 104 1
+18 105 1
+18 106 1
+18 107 1
+18 108 1
+18 109 1
+18 110 1
+18 122 1
+18 128 1
+18 134 1
+18 135 1
+18 136 1
+18 137 1
+18 138 1
+18 149 1
+18 155 1
+18 156 1
+18 157 1
+18 158 1
+18 159 1
+18 170 1
+18 171 1
+18 172 1
+18 173 1
+18 174 1
+18 185 1
+18 186 1
+18 187 1
+18 188 1
+18 189 1
+18 190 1
+18 191 1
+18 192 1
+18 193 1
+18 194 1
+18 205 1
+18 211 1
+18 212 1
+18 213 1
+18 214 1
+18 215 1
+18 226 1
+18 227 1
+18 228 1
+18 229 1
+18 230 1
+18 241 1
+18 242 1
+18 243 1
+18 244 1
+18 245 1
+18 246 1
+18 247 1
+18 248 1
+18 249 1
+18 250 1
+18 261 1
+18 262 1
+18 263 1
+18 264 1
+18 265 1
+18 276 1
+18 277 1
+18 278 1
+18 279 1
+18 280 1
+18 281 1
+18 282 1
+18 283 1
+18 284 1
+18 285 1
+18 296 1
+18 297 1
+18 298 1
+18 299 1
+18 300 1
+18 301 1
+18 302 1
+18 303 1
+18 304 1
+18 305 1
+18 316 1
+18 317 1
+18 318 1
+18 319 1
+18 320 1
+18 321 1
+18 322 1
+18 323 1
+18 324 1
+18 325 1
+18 794 1
+18 800 1
+18 806 1
+18 807 1
+18 808 1
+18 809 1
+18 810 1
+18 821 1
+18 827 1
+18 828 1
+18 829 1
+18 830 1
+18 831 1
+18 842 1
+18 843 1
+18 844 1
+18 845 1
+18 846 1
+18 857 1
+18 858 1
+18 859 1
+18 860 1
+18 861 1
+18 862 1
+18 863 1
+18 864 1
+18 865 1
+18 866 1
+18 877 1
+18 883 1
+18 884 1
+18 885 1
+18 886 1
+18 887 1
+18 898 1
+18 899 1
+18 900 1
+18 901 1
+18 902 1
+18 913 1
+18 914 1
+18 915 1
+18 916 1
+18 917 1
+18 918 1
+18 919 1
+18 920 1
+18 921 1
+18 922 1
+18 933 1
+18 934 1
+18 935 1
+18 936 1
+18 937 1
+18 948 1
+18 949 1
+18 950 1
+18 951 1
+18 952 1
+18 953 1
+18 954 1
+18 955 1
+18 956 1
+18 957 1
+18 968 1
+18 969 1
+18 970 1
+18 971 1
+18 972 1
+18 973 1
+18 974 1
+18 975 1
+18 976 1
+18 977 1
+18 988 1
+18 989 1
+18 990 1
+18 991 1
+18 992 1
+18 993 1
+18 994 1
+18 995 1
+18 996 1
+18 997 1
+18 1003 1
+18 1009 1
+18 1010 1
+18 1011 1
+18 1012 1
+18 1013 1
+18 1024 1
+18 1025 1
+18 1026 1
+18 1027 1
+18 1028 1
+18 1039 1
+18 1040 1
+18 1041 1
+18 1042 1
+18 1043 1
+18 1044 1
+18 1045 1
+18 1046 1
+18 1047 1
+18 1048 1
+18 1059 1
+18 1060 1
+18 1061 1
+18 1062 1
+18 1063 1
+18 1074 1
+18 1075 1
+18 1076 1
+18 1077 1
+18 1078 1
+18 1079 1
+18 1080 1
+18 1081 1
+18 1082 1
+18 1083 1
+18 1094 1
+18 1095 1
+18 1096 1
+18 1097 1
+18 1098 1
+18 1099 1
+18 1100 1
+18 1101 1
+18 1102 1
+18 1103 1
+18 1114 1
+18 1115 1
+18 1116 1
+18 1117 1
+18 1118 1
+18 1119 1
+18 1120 1
+18 1121 1
+18 1122 1
+18 1123 1
+18 1129 1
+18 1130 1
+18 1131 1
+18 1132 1
+18 1133 1
+18 1144 1
+18 1145 1
+18 1146 1
+18 1147 1
+18 1148 1
+18 1149 1
+18 1150 1
+18 1151 1
+18 1152 1
+18 1153 1
+18 1164 1
+18 1165 1
+18 1166 1
+18 1167 1
+18 1168 1
+18 1169 1
+18 1170 1
+18 1171 1
+18 1172 1
+18 1173 1
+18 1184 1
+18 1185 1
+18 1186 1
+18 1187 1
+18 1188 1
+18 1189 1
+18 1190 1
+18 1191 1
+18 1192 1
+18 1193 1
+18 1199 1
+18 1200 1
+18 1201 1
+18 1202 1
+18 1203 1
+18 1204 1
+18 1205 1
+18 1206 1
+18 1207 1
+18 1208 1
+18 1219 1
+18 1220 1
+18 1221 1
+18 1222 1
+18 1223 1
+18 1224 1
+18 1225 1
+18 1226 1
+18 1227 1
+18 1228 1
+18 1234 1
+18 1235 1
+18 1236 1
+18 1237 1
+18 1238 1
+18 1239 1
+18 1240 1
+18 1241 1
+18 1242 1
+18 1243 1
+18 1249 1
+18 1250 1
+18 1251 1
+18 1252 1
+18 1253 1
+19 4 1
+19 11 1
+19 17 1
+19 22 1
+19 27 1
+19 28 1
+19 29 1
+19 30 1
+19 39 1
+19 45 1
+19 50 1
+19 55 1
+19 56 1
+19 57 1
+19 58 1
+19 66 1
+19 71 1
+19 76 1
+19 77 1
+19 78 1
+19 79 1
+19 86 1
+19 91 1
+19 92 1
+19 93 1
+19 94 1
+19 101 1
+19 102 1
+19 103 1
+19 104 1
+19 111 1
+19 112 1
+19 113 1
+19 114 1
+19 115 1
+19 116 1
+19 123 1
+19 129 1
+19 134 1
+19 139 1
+19 140 1
+19 141 1
+19 142 1
+19 150 1
+19 155 1
+19 160 1
+19 161 1
+19 162 1
+19 163 1
+19 170 1
+19 175 1
+19 176 1
+19 177 1
+19 178 1
+19 185 1
+19 186 1
+19 187 1
+19 188 1
+19 195 1
+19 196 1
+19 197 1
+19 198 1
+19 199 1
+19 200 1
+19 206 1
+19 211 1
+19 216 1
+19 217 1
+19 218 1
+19 219 1
+19 226 1
+19 231 1
+19 232 1
+19 233 1
+19 234 1
+19 241 1
+19 242 1
+19 243 1
+19 244 1
+19 251 1
+19 252 1
+19 253 1
+19 254 1
+19 255 1
+19 256 1
+19 261 1
+19 266 1
+19 267 1
+19 268 1
+19 269 1
+19 276 1
+19 277 1
+19 278 1
+19 279 1
+19 286 1
+19 287 1
+19 288 1
+19 289 1
+19 290 1
+19 291 1
+19 296 1
+19 297 1
+19 298 1
+19 299 1
+19 306 1
+19 307 1
+19 308 1
+19 309 1
+19 310 1
+19 311 1
+19 316 1
+19 317 1
+19 318 1
+19 319 1
+19 320 1
+19 321 1
+19 326 1
+19 327 1
+19 328 1
+19 329 1
+19 795 1
+19 801 1
+19 806 1
+19 811 1
+19 812 1
+19 813 1
+19 814 1
+19 822 1
+19 827 1
+19 832 1
+19 833 1
+19 834 1
+19 835 1
+19 842 1
+19 847 1
+19 848 1
+19 849 1
+19 850 1
+19 857 1
+19 858 1
+19 859 1
+19 860 1
+19 867 1
+19 868 1
+19 869 1
+19 870 1
+19 871 1
+19 872 1
+19 878 1
+19 883 1
+19 888 1
+19 889 1
+19 890 1
+19 891 1
+19 898 1
+19 903 1
+19 904 1
+19 905 1
+19 906 1
+19 913 1
+19 914 1
+19 915 1
+19 916 1
+19 923 1
+19 924 1
+19 925 1
+19 926 1
+19 927 1
+19 928 1
+19 933 1
+19 938 1
+19 939 1
+19 940 1
+19 941 1
+19 948 1
+19 949 1
+19 950 1
+19 951 1
+19 958 1
+19 959 1
+19 960 1
+19 961 1
+19 962 1
+19 963 1
+19 968 1
+19 969 1
+19 970 1
+19 971 1
+19 978 1
+19 979 1
+19 980 1
+19 981 1
+19 982 1
+19 983 1
+19 988 1
+19 989 1
+19 990 1
+19 991 1
+19 992 1
+19 993 1
+19 998 1
+19 999 1
+19 1000 1
+19 1001 1
+19 1004 1
+19 1009 1
+19 1014 1
+19 1015 1
+19 1016 1
+19 1017 1
+19 1024 1
+19 1029 1
+19 1030 1
+19 1031 1
+19 1032 1
+19 1039 1
+19 1040 1
+19 1041 1
+19 1042 1
+19 1049 1
+19 1050 1
+19 1051 1
+19 1052 1
+19 1053 1
+19 1054 1
+19 1059 1
+19 1064 1
+19 1065 1
+19 1066 1
+19 1067 1
+19 1074 1
+19 1075 1
+19 1076 1
+19 1077 1
+19 1084 1
+19 1085 1
+19 1086 1
+19 1087 1
+19 1088 1
+19 1089 1
+19 1094 1
+19 1095 1
+19 1096 1
+19 1097 1
+19 1104 1
+19 1105 1
+19 1106 1
+19 1107 1
+19 1108 1
+19 1109 1
+19 1114 1
+19 1115 1
+19 1116 1
+19 1117 1
+19 1118 1
+19 1119 1
+19 1124 1
+19 1125 1
+19 1126 1
+19 1127 1
+19 1129 1
+19 1134 1
+19 1135 1
+19 1136 1
+19 1137 1
+19 1144 1
+19 1145 1
+19 1146 1
+19 1147 1
+19 1154 1
+19 1155 1
+19 1156 1
+19 1157 1
+19 1158 1
+19 1159 1
+19 1164 1
+19 1165 1
+19 1166 1
+19 1167 1
+19 1174 1
+19 1175 1
+19 1176 1
+19 1177 1
+19 1178 1
+19 1179 1
+19 1184 1
+19 1185 1
+19 1186 1
+19 1187 1
+19 1188 1
+19 1189 1
+19 1194 1
+19 1195 1
+19 1196 1
+19 1197 1
+19 1199 1
+19 1200 1
+19 1201 1
+19 1202 1
+19 1209 1
+19 1210 1
+19 1211 1
+19 1212 1
+19 1213 1
+19 1214 1
+19 1219 1
+19 1220 1
+19 1221 1
+19 1222 1
+19 1223 1
+19 1224 1
+19 1229 1
+19 1230 1
+19 1231 1
+19 1232 1
+19 1234 1
+19 1235 1
+19 1236 1
+19 1237 1
+19 1238 1
+19 1239 1
+19 1244 1
+19 1245 1
+19 1246 1
+19 1247 1
+19 1249 1
+19 1250 1
+19 1251 1
+19 1252 1
+19 1254 1
+20 5 1
+20 12 1
+20 18 1
+20 23 1
+20 27 1
+20 31 1
+20 32 1
+20 33 1
+20 40 1
+20 46 1
+20 51 1
+20 55 1
+20 59 1
+20 60 1
+20 61 1
+20 67 1
+20 72 1
+20 76 1
+20 80 1
+20 81 1
+20 82 1
+20 87 1
+20 91 1
+20 95 1
+20 96 1
+20 97 1
+20 101 1
+20 105 1
+20 106 1
+20 107 1
+20 111 1
+20 112 1
+20 113 1
+20 117 1
+20 118 1
+20 119 1
+20 124 1
+20 130 1
+20 135 1
+20 139 1
+20 143 1
+20 144 1
+20 145 1
+20 151 1
+20 156 1
+20 160 1
+20 164 1
+20 165 1
+20 166 1
+20 171 1
+20 175 1
+20 179 1
+20 180 1
+20 181 1
+20 185 1
+20 189 1
+20 190 1
+20 191 1
+20 195 1
+20 196 1
+20 197 1
+20 201 1
+20 202 1
+20 203 1
+20 207 1
+20 212 1
+20 216 1
+20 220 1
+20 221 1
+20 222 1
+20 227 1
+20 231 1
+20 235 1
+20 236 1
+20 237 1
+20 241 1
+20 245 1
+20 246 1
+20 247 1
+20 251 1
+20 252 1
+20 253 1
+20 257 1
+20 258 1
+20 259 1
+20 262 1
+20 266 1
+20 270 1
+20 271 1
+20 272 1
+20 276 1
+20 280 1
+20 281 1
+20 282 1
+20 286 1
+20 287 1
+20 288 1
+20 292 1
+20 293 1
+20 294 1
+20 296 1
+20 300 1
+20 301 1
+20 302 1
+20 306 1
+20 307 1
+20 308 1
+20 312 1
+20 313 1
+20 314 1
+20 316 1
+20 317 1
+20 318 1
+20 322 1
+20 323 1
+20 324 1
+20 326 1
+20 327 1
+20 328 1
+20 330 1
+20 796 1
+20 802 1
+20 807 1
+20 811 1
+20 815 1
+20 816 1
+20 817 1
+20 823 1
+20 828 1
+20 832 1
+20 836 1
+20 837 1
+20 838 1
+20 843 1
+20 847 1
+20 851 1
+20 852 1
+20 853 1
+20 857 1
+20 861 1
+20 862 1
+20 863 1
+20 867 1
+20 868 1
+20 869 1
+20 873 1
+20 874 1
+20 875 1
+20 879 1
+20 884 1
+20 888 1
+20 892 1
+20 893 1
+20 894 1
+20 899 1
+20 903 1
+20 907 1
+20 908 1
+20 909 1
+20 913 1
+20 917 1
+20 918 1
+20 919 1
+20 923 1
+20 924 1
+20 925 1
+20 929 1
+20 930 1
+20 931 1
+20 934 1
+20 938 1
+20 942 1
+20 943 1
+20 944 1
+20 948 1
+20 952 1
+20 953 1
+20 954 1
+20 958 1
+20 959 1
+20 960 1
+20 964 1
+20 965 1
+20 966 1
+20 968 1
+20 972 1
+20 973 1
+20 974 1
+20 978 1
+20 979 1
+20 980 1
+20 984 1
+20 985 1
+20 986 1
+20 988 1
+20 989 1
+20 990 1
+20 994 1
+20 995 1
+20 996 1
+20 998 1
+20 999 1
+20 1000 1
+20 1002 1
+20 1005 1
+20 1010 1
+20 1014 1
+20 1018 1
+20 1019 1
+20 1020 1
+20 1025 1
+20 1029 1
+20 1033 1
+20 1034 1
+20 1035 1
+20 1039 1
+20 1043 1
+20 1044 1
+20 1045 1
+20 1049 1
+20 1050 1
+20 1051 1
+20 1055 1
+20 1056 1
+20 1057 1
+20 1060 1
+20 1064 1
+20 1068 1
+20 1069 1
+20 1070 1
+20 1074 1
+20 1078 1
+20 1079 1
+20 1080 1
+20 1084 1
+20 1085 1
+20 1086 1
+20 1090 1
+20 1091 1
+20 1092 1
+20 1094 1
+20 1098 1
+20 1099 1
+20 1100 1
+20 1104 1
+20 1105 1
+20 1106 1
+20 1110 1
+20 1111 1
+20 1112 1
+20 1114 1
+20 1115 1
+20 1116 1
+20 1120 1
+20 1121 1
+20 1122 1
+20 1124 1
+20 1125 1
+20 1126 1
+20 1128 1
+20 1130 1
+20 1134 1
+20 1138 1
+20 1139 1
+20 1140 1
+20 1144 1
+20 1148 1
+20 1149 1
+20 1150 1
+20 1154 1
+20 1155 1
+20 1156 1
+20 1160 1
+20 1161 1
+20 1162 1
+20 1164 1
+20 1168 1
+20 1169 1
+20 1170 1
+20 1174 1
+20 1175 1
+20 1176 1
+20 1180 1
+20 1181 1
+20 1182 1
+20 1184 1
+20 1185 1
+20 1186 1
+20 1190 1
+20 1191 1
+20 1192 1
+20 1194 1
+20 1195 1
+20 1196 1
+20 1198 1
+20 1199 1
+20 1203 1
+20 1204 1
+20 1205 1
+20 1209 1
+20 1210 1
+20 1211 1
+20 1215 1
+20 1216 1
+20 1217 1
+20 1219 1
+20 1220 1
+20 1221 1
+20 1225 1
+20 1226 1
+20 1227 1
+20 1229 1
+20 1230 1
+20 1231 1
+20 1233 1
+20 1234 1
+20 1235 1
+20 1236 1
+20 1240 1
+20 1241 1
+20 1242 1
+20 1244 1
+20 1245 1
+20 1246 1
+20 1248 1
+20 1249 1
+20 1250 1
+20 1251 1
+20 1253 1
+20 1254 1
+21 6 1
+21 13 1
+21 19 1
+21 24 1
+21 28 1
+21 31 1
+21 34 1
+21 35 1
+21 41 1
+21 47 1
+21 52 1
+21 56 1
+21 59 1
+21 62 1
+21 63 1
+21 68 1
+21 73 1
+21 77 1
+21 80 1
+21 83 1
+21 84 1
+21 88 1
+21 92 1
+21 95 1
+21 98 1
+21 99 1
+21 102 1
+21 105 1
+21 108 1
+21 109 1
+21 111 1
+21 114 1
+21 115 1
+21 117 1
+21 118 1
+21 120 1
+21 125 1
+21 131 1
+21 136 1
+21 140 1
+21 143 1
+21 146 1
+21 147 1
+21 152 1
+21 157 1
+21 161 1
+21 164 1
+21 167 1
+21 168 1
+21 172 1
+21 176 1
+21 179 1
+21 182 1
+21 183 1
+21 186 1
+21 189 1
+21 192 1
+21 193 1
+21 195 1
+21 198 1
+21 199 1
+21 201 1
+21 202 1
+21 204 1
+21 208 1
+21 213 1
+21 217 1
+21 220 1
+21 223 1
+21 224 1
+21 228 1
+21 232 1
+21 235 1
+21 238 1
+21 239 1
+21 242 1
+21 245 1
+21 248 1
+21 249 1
+21 251 1
+21 254 1
+21 255 1
+21 257 1
+21 258 1
+21 260 1
+21 263 1
+21 267 1
+21 270 1
+21 273 1
+21 274 1
+21 277 1
+21 280 1
+21 283 1
+21 284 1
+21 286 1
+21 289 1
+21 290 1
+21 292 1
+21 293 1
+21 295 1
+21 297 1
+21 300 1
+21 303 1
+21 304 1
+21 306 1
+21 309 1
+21 310 1
+21 312 1
+21 313 1
+21 315 1
+21 316 1
+21 319 1
+21 320 1
+21 322 1
+21 323 1
+21 325 1
+21 326 1
+21 327 1
+21 329 1
+21 330 1
+21 797 1
+21 803 1
+21 808 1
+21 812 1
+21 815 1
+21 818 1
+21 819 1
+21 824 1
+21 829 1
+21 833 1
+21 836 1
+21 839 1
+21 840 1
+21 844 1
+21 848 1
+21 851 1
+21 854 1
+21 855 1
+21 858 1
+21 861 1
+21 864 1
+21 865 1
+21 867 1
+21 870 1
+21 871 1
+21 873 1
+21 874 1
+21 876 1
+21 880 1
+21 885 1
+21 889 1
+21 892 1
+21 895 1
+21 896 1
+21 900 1
+21 904 1
+21 907 1
+21 910 1
+21 911 1
+21 914 1
+21 917 1
+21 920 1
+21 921 1
+21 923 1
+21 926 1
+21 927 1
+21 929 1
+21 930 1
+21 932 1
+21 935 1
+21 939 1
+21 942 1
+21 945 1
+21 946 1
+21 949 1
+21 952 1
+21 955 1
+21 956 1
+21 958 1
+21 961 1
+21 962 1
+21 964 1
+21 965 1
+21 967 1
+21 969 1
+21 972 1
+21 975 1
+21 976 1
+21 978 1
+21 981 1
+21 982 1
+21 984 1
+21 985 1
+21 987 1
+21 988 1
+21 991 1
+21 992 1
+21 994 1
+21 995 1
+21 997 1
+21 998 1
+21 999 1
+21 1001 1
+21 1002 1
+21 1006 1
+21 1011 1
+21 1015 1
+21 1018 1
+21 1021 1
+21 1022 1
+21 1026 1
+21 1030 1
+21 1033 1
+21 1036 1
+21 1037 1
+21 1040 1
+21 1043 1
+21 1046 1
+21 1047 1
+21 1049 1
+21 1052 1
+21 1053 1
+21 1055 1
+21 1056 1
+21 1058 1
+21 1061 1
+21 1065 1
+21 1068 1
+21 1071 1
+21 1072 1
+21 1075 1
+21 1078 1
+21 1081 1
+21 1082 1
+21 1084 1
+21 1087 1
+21 1088 1
+21 1090 1
+21 1091 1
+21 1093 1
+21 1095 1
+21 1098 1
+21 1101 1
+21 1102 1
+21 1104 1
+21 1107 1
+21 1108 1
+21 1110 1
+21 1111 1
+21 1113 1
+21 1114 1
+21 1117 1
+21 1118 1
+21 1120 1
+21 1121 1
+21 1123 1
+21 1124 1
+21 1125 1
+21 1127 1
+21 1128 1
+21 1131 1
+21 1135 1
+21 1138 1
+21 1141 1
+21 1142 1
+21 1145 1
+21 1148 1
+21 1151 1
+21 1152 1
+21 1154 1
+21 1157 1
+21 1158 1
+21 1160 1
+21 1161 1
+21 1163 1
+21 1165 1
+21 1168 1
+21 1171 1
+21 1172 1
+21 1174 1
+21 1177 1
+21 1178 1
+21 1180 1
+21 1181 1
+21 1183 1
+21 1184 1
+21 1187 1
+21 1188 1
+21 1190 1
+21 1191 1
+21 1193 1
+21 1194 1
+21 1195 1
+21 1197 1
+21 1198 1
+21 1200 1
+21 1203 1
+21 1206 1
+21 1207 1
+21 1209 1
+21 1212 1
+21 1213 1
+21 1215 1
+21 1216 1
+21 1218 1
+21 1219 1
+21 1222 1
+21 1223 1
+21 1225 1
+21 1226 1
+21 1228 1
+21 1229 1
+21 1230 1
+21 1232 1
+21 1233 1
+21 1234 1
+21 1237 1
+21 1238 1
+21 1240 1
+21 1241 1
+21 1243 1
+21 1244 1
+21 1245 1
+21 1247 1
+21 1248 1
+21 1249 1
+21 1250 1
+21 1252 1
+21 1253 1
+21 1254 1
+22 7 1
+22 14 1
+22 20 1
+22 25 1
+22 29 1
+22 32 1
+22 34 1
+22 36 1
+22 42 1
+22 48 1
+22 53 1
+22 57 1
+22 60 1
+22 62 1
+22 64 1
+22 69 1
+22 74 1
+22 78 1
+22 81 1
+22 83 1
+22 85 1
+22 89 1
+22 93 1
+22 96 1
+22 98 1
+22 100 1
+22 103 1
+22 106 1
+22 108 1
+22 110 1
+22 112 1
+22 114 1
+22 116 1
+22 117 1
+22 119 1
+22 120 1
+22 126 1
+22 132 1
+22 137 1
+22 141 1
+22 144 1
+22 146 1
+22 148 1
+22 153 1
+22 158 1
+22 162 1
+22 165 1
+22 167 1
+22 169 1
+22 173 1
+22 177 1
+22 180 1
+22 182 1
+22 184 1
+22 187 1
+22 190 1
+22 192 1
+22 194 1
+22 196 1
+22 198 1
+22 200 1
+22 201 1
+22 203 1
+22 204 1
+22 209 1
+22 214 1
+22 218 1
+22 221 1
+22 223 1
+22 225 1
+22 229 1
+22 233 1
+22 236 1
+22 238 1
+22 240 1
+22 243 1
+22 246 1
+22 248 1
+22 250 1
+22 252 1
+22 254 1
+22 256 1
+22 257 1
+22 259 1
+22 260 1
+22 264 1
+22 268 1
+22 271 1
+22 273 1
+22 275 1
+22 278 1
+22 281 1
+22 283 1
+22 285 1
+22 287 1
+22 289 1
+22 291 1
+22 292 1
+22 294 1
+22 295 1
+22 298 1
+22 301 1
+22 303 1
+22 305 1
+22 307 1
+22 309 1
+22 311 1
+22 312 1
+22 314 1
+22 315 1
+22 317 1
+22 319 1
+22 321 1
+22 322 1
+22 324 1
+22 325 1
+22 326 1
+22 328 1
+22 329 1
+22 330 1
+22 798 1
+22 804 1
+22 809 1
+22 813 1
+22 816 1
+22 818 1
+22 820 1
+22 825 1
+22 830 1
+22 834 1
+22 837 1
+22 839 1
+22 841 1
+22 845 1
+22 849 1
+22 852 1
+22 854 1
+22 856 1
+22 859 1
+22 862 1
+22 864 1
+22 866 1
+22 868 1
+22 870 1
+22 872 1
+22 873 1
+22 875 1
+22 876 1
+22 881 1
+22 886 1
+22 890 1
+22 893 1
+22 895 1
+22 897 1
+22 901 1
+22 905 1
+22 908 1
+22 910 1
+22 912 1
+22 915 1
+22 918 1
+22 920 1
+22 922 1
+22 924 1
+22 926 1
+22 928 1
+22 929 1
+22 931 1
+22 932 1
+22 936 1
+22 940 1
+22 943 1
+22 945 1
+22 947 1
+22 950 1
+22 953 1
+22 955 1
+22 957 1
+22 959 1
+22 961 1
+22 963 1
+22 964 1
+22 966 1
+22 967 1
+22 970 1
+22 973 1
+22 975 1
+22 977 1
+22 979 1
+22 981 1
+22 983 1
+22 984 1
+22 986 1
+22 987 1
+22 989 1
+22 991 1
+22 993 1
+22 994 1
+22 996 1
+22 997 1
+22 998 1
+22 1000 1
+22 1001 1
+22 1002 1
+22 1007 1
+22 1012 1
+22 1016 1
+22 1019 1
+22 1021 1
+22 1023 1
+22 1027 1
+22 1031 1
+22 1034 1
+22 1036 1
+22 1038 1
+22 1041 1
+22 1044 1
+22 1046 1
+22 1048 1
+22 1050 1
+22 1052 1
+22 1054 1
+22 1055 1
+22 1057 1
+22 1058 1
+22 1062 1
+22 1066 1
+22 1069 1
+22 1071 1
+22 1073 1
+22 1076 1
+22 1079 1
+22 1081 1
+22 1083 1
+22 1085 1
+22 1087 1
+22 1089 1
+22 1090 1
+22 1092 1
+22 1093 1
+22 1096 1
+22 1099 1
+22 1101 1
+22 1103 1
+22 1105 1
+22 1107 1
+22 1109 1
+22 1110 1
+22 1112 1
+22 1113 1
+22 1115 1
+22 1117 1
+22 1119 1
+22 1120 1
+22 1122 1
+22 1123 1
+22 1124 1
+22 1126 1
+22 1127 1
+22 1128 1
+22 1132 1
+22 1136 1
+22 1139 1
+22 1141 1
+22 1143 1
+22 1146 1
+22 1149 1
+22 1151 1
+22 1153 1
+22 1155 1
+22 1157 1
+22 1159 1
+22 1160 1
+22 1162 1
+22 1163 1
+22 1166 1
+22 1169 1
+22 1171 1
+22 1173 1
+22 1175 1
+22 1177 1
+22 1179 1
+22 1180 1
+22 1182 1
+22 1183 1
+22 1185 1
+22 1187 1
+22 1189 1
+22 1190 1
+22 1192 1
+22 1193 1
+22 1194 1
+22 1196 1
+22 1197 1
+22 1198 1
+22 1201 1
+22 1204 1
+22 1206 1
+22 1208 1
+22 1210 1
+22 1212 1
+22 1214 1
+22 1215 1
+22 1217 1
+22 1218 1
+22 1220 1
+22 1222 1
+22 1224 1
+22 1225 1
+22 1227 1
+22 1228 1
+22 1229 1
+22 1231 1
+22 1232 1
+22 1233 1
+22 1235 1
+22 1237 1
+22 1239 1
+22 1240 1
+22 1242 1
+22 1243 1
+22 1244 1
+22 1246 1
+22 1247 1
+22 1248 1
+22 1249 1
+22 1251 1
+22 1252 1
+22 1253 1
+22 1254 1
+23 8 1
+23 15 1
+23 21 1
+23 26 1
+23 30 1
+23 33 1
+23 35 1
+23 36 1
+23 43 1
+23 49 1
+23 54 1
+23 58 1
+23 61 1
+23 63 1
+23 64 1
+23 70 1
+23 75 1
+23 79 1
+23 82 1
+23 84 1
+23 85 1
+23 90 1
+23 94 1
+23 97 1
+23 99 1
+23 100 1
+23 104 1
+23 107 1
+23 109 1
+23 110 1
+23 113 1
+23 115 1
+23 116 1
+23 118 1
+23 119 1
+23 120 1
+23 127 1
+23 133 1
+23 138 1
+23 142 1
+23 145 1
+23 147 1
+23 148 1
+23 154 1
+23 159 1
+23 163 1
+23 166 1
+23 168 1
+23 169 1
+23 174 1
+23 178 1
+23 181 1
+23 183 1
+23 184 1
+23 188 1
+23 191 1
+23 193 1
+23 194 1
+23 197 1
+23 199 1
+23 200 1
+23 202 1
+23 203 1
+23 204 1
+23 210 1
+23 215 1
+23 219 1
+23 222 1
+23 224 1
+23 225 1
+23 230 1
+23 234 1
+23 237 1
+23 239 1
+23 240 1
+23 244 1
+23 247 1
+23 249 1
+23 250 1
+23 253 1
+23 255 1
+23 256 1
+23 258 1
+23 259 1
+23 260 1
+23 265 1
+23 269 1
+23 272 1
+23 274 1
+23 275 1
+23 279 1
+23 282 1
+23 284 1
+23 285 1
+23 288 1
+23 290 1
+23 291 1
+23 293 1
+23 294 1
+23 295 1
+23 299 1
+23 302 1
+23 304 1
+23 305 1
+23 308 1
+23 310 1
+23 311 1
+23 313 1
+23 314 1
+23 315 1
+23 318 1
+23 320 1
+23 321 1
+23 323 1
+23 324 1
+23 325 1
+23 327 1
+23 328 1
+23 329 1
+23 330 1
+23 799 1
+23 805 1
+23 810 1
+23 814 1
+23 817 1
+23 819 1
+23 820 1
+23 826 1
+23 831 1
+23 835 1
+23 838 1
+23 840 1
+23 841 1
+23 846 1
+23 850 1
+23 853 1
+23 855 1
+23 856 1
+23 860 1
+23 863 1
+23 865 1
+23 866 1
+23 869 1
+23 871 1
+23 872 1
+23 874 1
+23 875 1
+23 876 1
+23 882 1
+23 887 1
+23 891 1
+23 894 1
+23 896 1
+23 897 1
+23 902 1
+23 906 1
+23 909 1
+23 911 1
+23 912 1
+23 916 1
+23 919 1
+23 921 1
+23 922 1
+23 925 1
+23 927 1
+23 928 1
+23 930 1
+23 931 1
+23 932 1
+23 937 1
+23 941 1
+23 944 1
+23 946 1
+23 947 1
+23 951 1
+23 954 1
+23 956 1
+23 957 1
+23 960 1
+23 962 1
+23 963 1
+23 965 1
+23 966 1
+23 967 1
+23 971 1
+23 974 1
+23 976 1
+23 977 1
+23 980 1
+23 982 1
+23 983 1
+23 985 1
+23 986 1
+23 987 1
+23 990 1
+23 992 1
+23 993 1
+23 995 1
+23 996 1
+23 997 1
+23 999 1
+23 1000 1
+23 1001 1
+23 1002 1
+23 1008 1
+23 1013 1
+23 1017 1
+23 1020 1
+23 1022 1
+23 1023 1
+23 1028 1
+23 1032 1
+23 1035 1
+23 1037 1
+23 1038 1
+23 1042 1
+23 1045 1
+23 1047 1
+23 1048 1
+23 1051 1
+23 1053 1
+23 1054 1
+23 1056 1
+23 1057 1
+23 1058 1
+23 1063 1
+23 1067 1
+23 1070 1
+23 1072 1
+23 1073 1
+23 1077 1
+23 1080 1
+23 1082 1
+23 1083 1
+23 1086 1
+23 1088 1
+23 1089 1
+23 1091 1
+23 1092 1
+23 1093 1
+23 1097 1
+23 1100 1
+23 1102 1
+23 1103 1
+23 1106 1
+23 1108 1
+23 1109 1
+23 1111 1
+23 1112 1
+23 1113 1
+23 1116 1
+23 1118 1
+23 1119 1
+23 1121 1
+23 1122 1
+23 1123 1
+23 1125 1
+23 1126 1
+23 1127 1
+23 1128 1
+23 1133 1
+23 1137 1
+23 1140 1
+23 1142 1
+23 1143 1
+23 1147 1
+23 1150 1
+23 1152 1
+23 1153 1
+23 1156 1
+23 1158 1
+23 1159 1
+23 1161 1
+23 1162 1
+23 1163 1
+23 1167 1
+23 1170 1
+23 1172 1
+23 1173 1
+23 1176 1
+23 1178 1
+23 1179 1
+23 1181 1
+23 1182 1
+23 1183 1
+23 1186 1
+23 1188 1
+23 1189 1
+23 1191 1
+23 1192 1
+23 1193 1
+23 1195 1
+23 1196 1
+23 1197 1
+23 1198 1
+23 1202 1
+23 1205 1
+23 1207 1
+23 1208 1
+23 1211 1
+23 1213 1
+23 1214 1
+23 1216 1
+23 1217 1
+23 1218 1
+23 1221 1
+23 1223 1
+23 1224 1
+23 1226 1
+23 1227 1
+23 1228 1
+23 1230 1
+23 1231 1
+23 1232 1
+23 1233 1
+23 1236 1
+23 1238 1
+23 1239 1
+23 1241 1
+23 1242 1
+23 1243 1
+23 1245 1
+23 1246 1
+23 1247 1
+23 1248 1
+23 1250 1
+23 1251 1
+23 1252 1
+23 1253 1
+23 1254 1
+24 1 1
+24 2 1
+24 3 1
+24 4 1
+24 5 1
+24 6 1
+24 7 1
+24 8 1
+24 9 1
+24 10 1
+24 11 1
+24 12 1
+24 13 1
+24 14 1
+24 15 1
+24 16 1
+24 17 1
+24 18 1
+24 19 1
+24 20 1
+24 21 1
+24 22 1
+24 23 1
+24 24 1
+24 25 1
+24 26 1
+24 27 1
+24 28 1
+24 29 1
+24 30 1
+24 31 1
+24 32 1
+24 33 1
+24 34 1
+24 35 1
+24 36 1
+24 331 1
+24 332 1
+24 333 1
+24 334 1
+24 335 1
+24 336 1
+24 337 1
+24 338 1
+24 339 1
+24 340 1
+24 341 1
+24 342 1
+24 343 1
+24 344 1
+24 345 1
+24 346 1
+24 347 1
+24 348 1
+24 349 1
+24 350 1
+24 351 1
+24 352 1
+24 353 1
+24 354 1
+24 355 1
+24 356 1
+24 357 1
+24 358 1
+24 359 1
+24 360 1
+24 361 1
+24 362 1
+24 363 1
+24 364 1
+24 365 1
+24 366 1
+24 367 1
+24 368 1
+24 369 1
+24 370 1
+24 371 1
+24 372 1
+24 373 1
+24 374 1
+24 375 1
+24 376 1
+24 377 1
+24 378 1
+24 379 1
+24 380 1
+24 381 1
+24 382 1
+24 383 1
+24 384 1
+24 385 1
+24 386 1
+24 387 1
+24 388 1
+24 389 1
+24 390 1
+24 391 1
+24 392 1
+24 393 1
+24 394 1
+24 395 1
+24 396 1
+24 397 1
+24 398 1
+24 399 1
+24 400 1
+24 401 1
+24 402 1
+24 403 1
+24 404 1
+24 405 1
+24 406 1
+24 407 1
+24 408 1
+24 409 1
+24 410 1
+24 411 1
+24 412 1
+24 413 1
+24 414 1
+24 793 1
+24 794 1
+24 795 1
+24 796 1
+24 797 1
+24 798 1
+24 799 1
+24 800 1
+24 801 1
+24 802 1
+24 803 1
+24 804 1
+24 805 1
+24 806 1
+24 807 1
+24 808 1
+24 809 1
+24 810 1
+24 811 1
+24 812 1
+24 813 1
+24 814 1
+24 815 1
+24 816 1
+24 817 1
+24 818 1
+24 819 1
+24 820 1
+24 821 1
+24 822 1
+24 823 1
+24 824 1
+24 825 1
+24 826 1
+24 827 1
+24 828 1
+24 829 1
+24 830 1
+24 831 1
+24 832 1
+24 833 1
+24 834 1
+24 835 1
+24 836 1
+24 837 1
+24 838 1
+24 839 1
+24 840 1
+24 841 1
+24 842 1
+24 843 1
+24 844 1
+24 845 1
+24 846 1
+24 847 1
+24 848 1
+24 849 1
+24 850 1
+24 851 1
+24 852 1
+24 853 1
+24 854 1
+24 855 1
+24 856 1
+24 857 1
+24 858 1
+24 859 1
+24 860 1
+24 861 1
+24 862 1
+24 863 1
+24 864 1
+24 865 1
+24 866 1
+24 867 1
+24 868 1
+24 869 1
+24 870 1
+24 871 1
+24 872 1
+24 873 1
+24 874 1
+24 875 1
+24 876 1
+24 1255 1
+24 1256 1
+24 1257 1
+24 1258 1
+24 1259 1
+24 1260 1
+24 1261 1
+24 1262 1
+24 1263 1
+24 1264 1
+24 1265 1
+24 1266 1
+24 1267 1
+24 1268 1
+24 1269 1
+24 1270 1
+24 1271 1
+24 1272 1
+24 1273 1
+24 1274 1
+24 1275 1
+24 1276 1
+24 1277 1
+24 1278 1
+24 1279 1
+24 1280 1
+24 1281 1
+24 1282 1
+24 1283 1
+24 1284 1
+24 1285 1
+24 1286 1
+24 1287 1
+24 1288 1
+24 1289 1
+24 1290 1
+24 1291 1
+24 1292 1
+24 1293 1
+24 1294 1
+24 1295 1
+24 1296 1
+24 1297 1
+24 1298 1
+24 1299 1
+24 1300 1
+24 1301 1
+24 1302 1
+24 1303 1
+24 1304 1
+24 1305 1
+24 1306 1
+24 1307 1
+24 1308 1
+24 1309 1
+24 1310 1
+24 1311 1
+24 1312 1
+24 1313 1
+24 1314 1
+24 1315 1
+24 1316 1
+24 1317 1
+24 1318 1
+24 1319 1
+24 1320 1
+24 1321 1
+24 1322 1
+24 1323 1
+24 1324 1
+24 1325 1
+24 1326 1
+24 1327 1
+24 1328 1
+24 1329 1
+24 1330 1
+24 1331 1
+24 1332 1
+24 1333 1
+24 1334 1
+24 1335 1
+24 1336 1
+24 1337 1
+24 1338 1
+24 1339 1
+24 1340 1
+24 1341 1
+24 1342 1
+24 1343 1
+24 1344 1
+24 1345 1
+24 1346 1
+24 1347 1
+24 1348 1
+24 1349 1
+24 1350 1
+24 1351 1
+24 1352 1
+24 1353 1
+24 1354 1
+24 1355 1
+24 1356 1
+24 1357 1
+24 1358 1
+24 1359 1
+24 1360 1
+24 1361 1
+24 1362 1
+24 1363 1
+24 1364 1
+24 1365 1
+24 1366 1
+24 1367 1
+24 1368 1
+24 1369 1
+24 1370 1
+24 1371 1
+24 1372 1
+24 1373 1
+24 1374 1
+24 1375 1
+24 1376 1
+24 1377 1
+24 1378 1
+24 1379 1
+24 1380 1
+25 1 1
+25 2 1
+25 3 1
+25 4 1
+25 5 1
+25 6 1
+25 7 1
+25 8 1
+25 37 1
+25 38 1
+25 39 1
+25 40 1
+25 41 1
+25 42 1
+25 43 1
+25 44 1
+25 45 1
+25 46 1
+25 47 1
+25 48 1
+25 49 1
+25 50 1
+25 51 1
+25 52 1
+25 53 1
+25 54 1
+25 55 1
+25 56 1
+25 57 1
+25 58 1
+25 59 1
+25 60 1
+25 61 1
+25 62 1
+25 63 1
+25 64 1
+25 331 1
+25 332 1
+25 333 1
+25 334 1
+25 335 1
+25 336 1
+25 337 1
+25 338 1
+25 339 1
+25 340 1
+25 341 1
+25 342 1
+25 343 1
+25 344 1
+25 345 1
+25 346 1
+25 347 1
+25 348 1
+25 349 1
+25 350 1
+25 351 1
+25 352 1
+25 353 1
+25 354 1
+25 355 1
+25 356 1
+25 357 1
+25 358 1
+25 415 1
+25 416 1
+25 417 1
+25 418 1
+25 419 1
+25 420 1
+25 421 1
+25 422 1
+25 423 1
+25 424 1
+25 425 1
+25 426 1
+25 427 1
+25 428 1
+25 429 1
+25 430 1
+25 431 1
+25 432 1
+25 433 1
+25 434 1
+25 435 1
+25 436 1
+25 437 1
+25 438 1
+25 439 1
+25 440 1
+25 441 1
+25 442 1
+25 443 1
+25 444 1
+25 445 1
+25 446 1
+25 447 1
+25 448 1
+25 449 1
+25 450 1
+25 451 1
+25 452 1
+25 453 1
+25 454 1
+25 455 1
+25 456 1
+25 457 1
+25 458 1
+25 459 1
+25 460 1
+25 461 1
+25 462 1
+25 463 1
+25 464 1
+25 465 1
+25 466 1
+25 467 1
+25 468 1
+25 469 1
+25 470 1
+25 793 1
+25 794 1
+25 795 1
+25 796 1
+25 797 1
+25 798 1
+25 799 1
+25 800 1
+25 801 1
+25 802 1
+25 803 1
+25 804 1
+25 805 1
+25 806 1
+25 807 1
+25 808 1
+25 809 1
+25 810 1
+25 811 1
+25 812 1
+25 813 1
+25 814 1
+25 815 1
+25 816 1
+25 817 1
+25 818 1
+25 819 1
+25 820 1
+25 877 1
+25 878 1
+25 879 1
+25 880 1
+25 881 1
+25 882 1
+25 883 1
+25 884 1
+25 885 1
+25 886 1
+25 887 1
+25 888 1
+25 889 1
+25 890 1
+25 891 1
+25 892 1
+25 893 1
+25 894 1
+25 895 1
+25 896 1
+25 897 1
+25 898 1
+25 899 1
+25 900 1
+25 901 1
+25 902 1
+25 903 1
+25 904 1
+25 905 1
+25 906 1
+25 907 1
+25 908 1
+25 909 1
+25 910 1
+25 911 1
+25 912 1
+25 913 1
+25 914 1
+25 915 1
+25 916 1
+25 917 1
+25 918 1
+25 919 1
+25 920 1
+25 921 1
+25 922 1
+25 923 1
+25 924 1
+25 925 1
+25 926 1
+25 927 1
+25 928 1
+25 929 1
+25 930 1
+25 931 1
+25 932 1
+25 1255 1
+25 1256 1
+25 1257 1
+25 1258 1
+25 1259 1
+25 1260 1
+25 1261 1
+25 1262 1
+25 1263 1
+25 1264 1
+25 1265 1
+25 1266 1
+25 1267 1
+25 1268 1
+25 1269 1
+25 1270 1
+25 1271 1
+25 1272 1
+25 1273 1
+25 1274 1
+25 1275 1
+25 1276 1
+25 1277 1
+25 1278 1
+25 1279 1
+25 1280 1
+25 1281 1
+25 1282 1
+25 1283 1
+25 1284 1
+25 1285 1
+25 1286 1
+25 1287 1
+25 1288 1
+25 1289 1
+25 1290 1
+25 1291 1
+25 1292 1
+25 1293 1
+25 1294 1
+25 1295 1
+25 1296 1
+25 1297 1
+25 1298 1
+25 1299 1
+25 1300 1
+25 1301 1
+25 1302 1
+25 1303 1
+25 1304 1
+25 1305 1
+25 1306 1
+25 1307 1
+25 1308 1
+25 1309 1
+25 1310 1
+25 1381 1
+25 1382 1
+25 1383 1
+25 1384 1
+25 1385 1
+25 1386 1
+25 1387 1
+25 1388 1
+25 1389 1
+25 1390 1
+25 1391 1
+25 1392 1
+25 1393 1
+25 1394 1
+25 1395 1
+25 1396 1
+25 1397 1
+25 1398 1
+25 1399 1
+25 1400 1
+25 1401 1
+25 1402 1
+25 1403 1
+25 1404 1
+25 1405 1
+25 1406 1
+25 1407 1
+25 1408 1
+25 1409 1
+25 1410 1
+25 1411 1
+25 1412 1
+25 1413 1
+25 1414 1
+25 1415 1
+25 1416 1
+25 1417 1
+25 1418 1
+25 1419 1
+25 1420 1
+25 1421 1
+25 1422 1
+25 1423 1
+25 1424 1
+25 1425 1
+25 1426 1
+25 1427 1
+25 1428 1
+25 1429 1
+25 1430 1
+25 1431 1
+25 1432 1
+25 1433 1
+25 1434 1
+25 1435 1
+25 1436 1
+25 1437 1
+25 1438 1
+25 1439 1
+25 1440 1
+25 1441 1
+25 1442 1
+25 1443 1
+25 1444 1
+25 1445 1
+25 1446 1
+25 1447 1
+25 1448 1
+25 1449 1
+25 1450 1
+26 1 1
+26 9 1
+26 10 1
+26 11 1
+26 12 1
+26 13 1
+26 14 1
+26 15 1
+26 37 1
+26 38 1
+26 39 1
+26 40 1
+26 41 1
+26 42 1
+26 43 1
+26 65 1
+26 66 1
+26 67 1
+26 68 1
+26 69 1
+26 70 1
+26 71 1
+26 72 1
+26 73 1
+26 74 1
+26 75 1
+26 76 1
+26 77 1
+26 78 1
+26 79 1
+26 80 1
+26 81 1
+26 82 1
+26 83 1
+26 84 1
+26 85 1
+26 331 1
+26 332 1
+26 333 1
+26 334 1
+26 335 1
+26 336 1
+26 337 1
+26 359 1
+26 360 1
+26 361 1
+26 362 1
+26 363 1
+26 364 1
+26 365 1
+26 366 1
+26 367 1
+26 368 1
+26 369 1
+26 370 1
+26 371 1
+26 372 1
+26 373 1
+26 374 1
+26 375 1
+26 376 1
+26 377 1
+26 378 1
+26 379 1
+26 415 1
+26 416 1
+26 417 1
+26 418 1
+26 419 1
+26 420 1
+26 421 1
+26 422 1
+26 423 1
+26 424 1
+26 425 1
+26 426 1
+26 427 1
+26 428 1
+26 429 1
+26 430 1
+26 431 1
+26 432 1
+26 433 1
+26 434 1
+26 435 1
+26 471 1
+26 472 1
+26 473 1
+26 474 1
+26 475 1
+26 476 1
+26 477 1
+26 478 1
+26 479 1
+26 480 1
+26 481 1
+26 482 1
+26 483 1
+26 484 1
+26 485 1
+26 486 1
+26 487 1
+26 488 1
+26 489 1
+26 490 1
+26 491 1
+26 492 1
+26 493 1
+26 494 1
+26 495 1
+26 496 1
+26 497 1
+26 498 1
+26 499 1
+26 500 1
+26 501 1
+26 502 1
+26 503 1
+26 504 1
+26 505 1
+26 793 1
+26 794 1
+26 795 1
+26 796 1
+26 797 1
+26 798 1
+26 799 1
+26 821 1
+26 822 1
+26 823 1
+26 824 1
+26 825 1
+26 826 1
+26 827 1
+26 828 1
+26 829 1
+26 830 1
+26 831 1
+26 832 1
+26 833 1
+26 834 1
+26 835 1
+26 836 1
+26 837 1
+26 838 1
+26 839 1
+26 840 1
+26 841 1
+26 877 1
+26 878 1
+26 879 1
+26 880 1
+26 881 1
+26 882 1
+26 883 1
+26 884 1
+26 885 1
+26 886 1
+26 887 1
+26 888 1
+26 889 1
+26 890 1
+26 891 1
+26 892 1
+26 893 1
+26 894 1
+26 895 1
+26 896 1
+26 897 1
+26 933 1
+26 934 1
+26 935 1
+26 936 1
+26 937 1
+26 938 1
+26 939 1
+26 940 1
+26 941 1
+26 942 1
+26 943 1
+26 944 1
+26 945 1
+26 946 1
+26 947 1
+26 948 1
+26 949 1
+26 950 1
+26 951 1
+26 952 1
+26 953 1
+26 954 1
+26 955 1
+26 956 1
+26 957 1
+26 958 1
+26 959 1
+26 960 1
+26 961 1
+26 962 1
+26 963 1
+26 964 1
+26 965 1
+26 966 1
+26 967 1
+26 1255 1
+26 1256 1
+26 1257 1
+26 1258 1
+26 1259 1
+26 1260 1
+26 1261 1
+26 1262 1
+26 1263 1
+26 1264 1
+26 1265 1
+26 1266 1
+26 1267 1
+26 1268 1
+26 1269 1
+26 1270 1
+26 1271 1
+26 1272 1
+26 1273 1
+26 1274 1
+26 1275 1
+26 1311 1
+26 1312 1
+26 1313 1
+26 1314 1
+26 1315 1
+26 1316 1
+26 1317 1
+26 1318 1
+26 1319 1
+26 1320 1
+26 1321 1
+26 1322 1
+26 1323 1
+26 1324 1
+26 1325 1
+26 1326 1
+26 1327 1
+26 1328 1
+26 1329 1
+26 1330 1
+26 1331 1
+26 1332 1
+26 1333 1
+26 1334 1
+26 1335 1
+26 1336 1
+26 1337 1
+26 1338 1
+26 1339 1
+26 1340 1
+26 1341 1
+26 1342 1
+26 1343 1
+26 1344 1
+26 1345 1
+26 1381 1
+26 1382 1
+26 1383 1
+26 1384 1
+26 1385 1
+26 1386 1
+26 1387 1
+26 1388 1
+26 1389 1
+26 1390 1
+26 1391 1
+26 1392 1
+26 1393 1
+26 1394 1
+26 1395 1
+26 1396 1
+26 1397 1
+26 1398 1
+26 1399 1
+26 1400 1
+26 1401 1
+26 1402 1
+26 1403 1
+26 1404 1
+26 1405 1
+26 1406 1
+26 1407 1
+26 1408 1
+26 1409 1
+26 1410 1
+26 1411 1
+26 1412 1
+26 1413 1
+26 1414 1
+26 1415 1
+26 1451 1
+26 1452 1
+26 1453 1
+26 1454 1
+26 1455 1
+26 1456 1
+26 1457 1
+26 1458 1
+26 1459 1
+26 1460 1
+26 1461 1
+26 1462 1
+26 1463 1
+26 1464 1
+26 1465 1
+26 1466 1
+26 1467 1
+26 1468 1
+26 1469 1
+26 1470 1
+26 1471 1
+26 1472 1
+26 1473 1
+26 1474 1
+26 1475 1
+26 1476 1
+26 1477 1
+26 1478 1
+26 1479 1
+26 1480 1
+26 1481 1
+26 1482 1
+26 1483 1
+26 1484 1
+26 1485 1
+27 2 1
+27 9 1
+27 16 1
+27 17 1
+27 18 1
+27 19 1
+27 20 1
+27 21 1
+27 37 1
+27 44 1
+27 45 1
+27 46 1
+27 47 1
+27 48 1
+27 49 1
+27 65 1
+27 66 1
+27 67 1
+27 68 1
+27 69 1
+27 70 1
+27 86 1
+27 87 1
+27 88 1
+27 89 1
+27 90 1
+27 91 1
+27 92 1
+27 93 1
+27 94 1
+27 95 1
+27 96 1
+27 97 1
+27 98 1
+27 99 1
+27 100 1
+27 331 1
+27 338 1
+27 339 1
+27 340 1
+27 341 1
+27 342 1
+27 343 1
+27 359 1
+27 360 1
+27 361 1
+27 362 1
+27 363 1
+27 364 1
+27 380 1
+27 381 1
+27 382 1
+27 383 1
+27 384 1
+27 385 1
+27 386 1
+27 387 1
+27 388 1
+27 389 1
+27 390 1
+27 391 1
+27 392 1
+27 393 1
+27 394 1
+27 415 1
+27 416 1
+27 417 1
+27 418 1
+27 419 1
+27 420 1
+27 436 1
+27 437 1
+27 438 1
+27 439 1
+27 440 1
+27 441 1
+27 442 1
+27 443 1
+27 444 1
+27 445 1
+27 446 1
+27 447 1
+27 448 1
+27 449 1
+27 450 1
+27 471 1
+27 472 1
+27 473 1
+27 474 1
+27 475 1
+27 476 1
+27 477 1
+27 478 1
+27 479 1
+27 480 1
+27 481 1
+27 482 1
+27 483 1
+27 484 1
+27 485 1
+27 506 1
+27 507 1
+27 508 1
+27 509 1
+27 510 1
+27 511 1
+27 512 1
+27 513 1
+27 514 1
+27 515 1
+27 516 1
+27 517 1
+27 518 1
+27 519 1
+27 520 1
+27 521 1
+27 522 1
+27 523 1
+27 524 1
+27 525 1
+27 793 1
+27 800 1
+27 801 1
+27 802 1
+27 803 1
+27 804 1
+27 805 1
+27 821 1
+27 822 1
+27 823 1
+27 824 1
+27 825 1
+27 826 1
+27 842 1
+27 843 1
+27 844 1
+27 845 1
+27 846 1
+27 847 1
+27 848 1
+27 849 1
+27 850 1
+27 851 1
+27 852 1
+27 853 1
+27 854 1
+27 855 1
+27 856 1
+27 877 1
+27 878 1
+27 879 1
+27 880 1
+27 881 1
+27 882 1
+27 898 1
+27 899 1
+27 900 1
+27 901 1
+27 902 1
+27 903 1
+27 904 1
+27 905 1
+27 906 1
+27 907 1
+27 908 1
+27 909 1
+27 910 1
+27 911 1
+27 912 1
+27 933 1
+27 934 1
+27 935 1
+27 936 1
+27 937 1
+27 938 1
+27 939 1
+27 940 1
+27 941 1
+27 942 1
+27 943 1
+27 944 1
+27 945 1
+27 946 1
+27 947 1
+27 968 1
+27 969 1
+27 970 1
+27 971 1
+27 972 1
+27 973 1
+27 974 1
+27 975 1
+27 976 1
+27 977 1
+27 978 1
+27 979 1
+27 980 1
+27 981 1
+27 982 1
+27 983 1
+27 984 1
+27 985 1
+27 986 1
+27 987 1
+27 1255 1
+27 1256 1
+27 1257 1
+27 1258 1
+27 1259 1
+27 1260 1
+27 1276 1
+27 1277 1
+27 1278 1
+27 1279 1
+27 1280 1
+27 1281 1
+27 1282 1
+27 1283 1
+27 1284 1
+27 1285 1
+27 1286 1
+27 1287 1
+27 1288 1
+27 1289 1
+27 1290 1
+27 1311 1
+27 1312 1
+27 1313 1
+27 1314 1
+27 1315 1
+27 1316 1
+27 1317 1
+27 1318 1
+27 1319 1
+27 1320 1
+27 1321 1
+27 1322 1
+27 1323 1
+27 1324 1
+27 1325 1
+27 1346 1
+27 1347 1
+27 1348 1
+27 1349 1
+27 1350 1
+27 1351 1
+27 1352 1
+27 1353 1
+27 1354 1
+27 1355 1
+27 1356 1
+27 1357 1
+27 1358 1
+27 1359 1
+27 1360 1
+27 1361 1
+27 1362 1
+27 1363 1
+27 1364 1
+27 1365 1
+27 1381 1
+27 1382 1
+27 1383 1
+27 1384 1
+27 1385 1
+27 1386 1
+27 1387 1
+27 1388 1
+27 1389 1
+27 1390 1
+27 1391 1
+27 1392 1
+27 1393 1
+27 1394 1
+27 1395 1
+27 1416 1
+27 1417 1
+27 1418 1
+27 1419 1
+27 1420 1
+27 1421 1
+27 1422 1
+27 1423 1
+27 1424 1
+27 1425 1
+27 1426 1
+27 1427 1
+27 1428 1
+27 1429 1
+27 1430 1
+27 1431 1
+27 1432 1
+27 1433 1
+27 1434 1
+27 1435 1
+27 1451 1
+27 1452 1
+27 1453 1
+27 1454 1
+27 1455 1
+27 1456 1
+27 1457 1
+27 1458 1
+27 1459 1
+27 1460 1
+27 1461 1
+27 1462 1
+27 1463 1
+27 1464 1
+27 1465 1
+27 1466 1
+27 1467 1
+27 1468 1
+27 1469 1
+27 1470 1
+27 1486 1
+27 1487 1
+27 1488 1
+27 1489 1
+27 1490 1
+27 1491 1
+27 1492 1
+27 1493 1
+27 1494 1
+27 1495 1
+27 1496 1
+27 1497 1
+27 1498 1
+27 1499 1
+27 1500 1
+28 3 1
+28 10 1
+28 16 1
+28 22 1
+28 23 1
+28 24 1
+28 25 1
+28 26 1
+28 38 1
+28 44 1
+28 50 1
+28 51 1
+28 52 1
+28 53 1
+28 54 1
+28 65 1
+28 71 1
+28 72 1
+28 73 1
+28 74 1
+28 75 1
+28 86 1
+28 87 1
+28 88 1
+28 89 1
+28 90 1
+28 101 1
+28 102 1
+28 103 1
+28 104 1
+28 105 1
+28 106 1
+28 107 1
+28 108 1
+28 109 1
+28 110 1
+28 332 1
+28 338 1
+28 344 1
+28 345 1
+28 346 1
+28 347 1
+28 348 1
+28 359 1
+28 365 1
+28 366 1
+28 367 1
+28 368 1
+28 369 1
+28 380 1
+28 381 1
+28 382 1
+28 383 1
+28 384 1
+28 395 1
+28 396 1
+28 397 1
+28 398 1
+28 399 1
+28 400 1
+28 401 1
+28 402 1
+28 403 1
+28 404 1
+28 415 1
+28 421 1
+28 422 1
+28 423 1
+28 424 1
+28 425 1
+28 436 1
+28 437 1
+28 438 1
+28 439 1
+28 440 1
+28 451 1
+28 452 1
+28 453 1
+28 454 1
+28 455 1
+28 456 1
+28 457 1
+28 458 1
+28 459 1
+28 460 1
+28 471 1
+28 472 1
+28 473 1
+28 474 1
+28 475 1
+28 486 1
+28 487 1
+28 488 1
+28 489 1
+28 490 1
+28 491 1
+28 492 1
+28 493 1
+28 494 1
+28 495 1
+28 506 1
+28 507 1
+28 508 1
+28 509 1
+28 510 1
+28 511 1
+28 512 1
+28 513 1
+28 514 1
+28 515 1
+28 526 1
+28 527 1
+28 528 1
+28 529 1
+28 530 1
+28 531 1
+28 532 1
+28 533 1
+28 534 1
+28 535 1
+28 794 1
+28 800 1
+28 806 1
+28 807 1
+28 808 1
+28 809 1
+28 810 1
+28 821 1
+28 827 1
+28 828 1
+28 829 1
+28 830 1
+28 831 1
+28 842 1
+28 843 1
+28 844 1
+28 845 1
+28 846 1
+28 857 1
+28 858 1
+28 859 1
+28 860 1
+28 861 1
+28 862 1
+28 863 1
+28 864 1
+28 865 1
+28 866 1
+28 877 1
+28 883 1
+28 884 1
+28 885 1
+28 886 1
+28 887 1
+28 898 1
+28 899 1
+28 900 1
+28 901 1
+28 902 1
+28 913 1
+28 914 1
+28 915 1
+28 916 1
+28 917 1
+28 918 1
+28 919 1
+28 920 1
+28 921 1
+28 922 1
+28 933 1
+28 934 1
+28 935 1
+28 936 1
+28 937 1
+28 948 1
+28 949 1
+28 950 1
+28 951 1
+28 952 1
+28 953 1
+28 954 1
+28 955 1
+28 956 1
+28 957 1
+28 968 1
+28 969 1
+28 970 1
+28 971 1
+28 972 1
+28 973 1
+28 974 1
+28 975 1
+28 976 1
+28 977 1
+28 988 1
+28 989 1
+28 990 1
+28 991 1
+28 992 1
+28 993 1
+28 994 1
+28 995 1
+28 996 1
+28 997 1
+28 1255 1
+28 1261 1
+28 1262 1
+28 1263 1
+28 1264 1
+28 1265 1
+28 1276 1
+28 1277 1
+28 1278 1
+28 1279 1
+28 1280 1
+28 1291 1
+28 1292 1
+28 1293 1
+28 1294 1
+28 1295 1
+28 1296 1
+28 1297 1
+28 1298 1
+28 1299 1
+28 1300 1
+28 1311 1
+28 1312 1
+28 1313 1
+28 1314 1
+28 1315 1
+28 1326 1
+28 1327 1
+28 1328 1
+28 1329 1
+28 1330 1
+28 1331 1
+28 1332 1
+28 1333 1
+28 1334 1
+28 1335 1
+28 1346 1
+28 1347 1
+28 1348 1
+28 1349 1
+28 1350 1
+28 1351 1
+28 1352 1
+28 1353 1
+28 1354 1
+28 1355 1
+28 1366 1
+28 1367 1
+28 1368 1
+28 1369 1
+28 1370 1
+28 1371 1
+28 1372 1
+28 1373 1
+28 1374 1
+28 1375 1
+28 1381 1
+28 1382 1
+28 1383 1
+28 1384 1
+28 1385 1
+28 1396 1
+28 1397 1
+28 1398 1
+28 1399 1
+28 1400 1
+28 1401 1
+28 1402 1
+28 1403 1
+28 1404 1
+28 1405 1
+28 1416 1
+28 1417 1
+28 1418 1
+28 1419 1
+28 1420 1
+28 1421 1
+28 1422 1
+28 1423 1
+28 1424 1
+28 1425 1
+28 1436 1
+28 1437 1
+28 1438 1
+28 1439 1
+28 1440 1
+28 1441 1
+28 1442 1
+28 1443 1
+28 1444 1
+28 1445 1
+28 1451 1
+28 1452 1
+28 1453 1
+28 1454 1
+28 1455 1
+28 1456 1
+28 1457 1
+28 1458 1
+28 1459 1
+28 1460 1
+28 1471 1
+28 1472 1
+28 1473 1
+28 1474 1
+28 1475 1
+28 1476 1
+28 1477 1
+28 1478 1
+28 1479 1
+28 1480 1
+28 1486 1
+28 1487 1
+28 1488 1
+28 1489 1
+28 1490 1
+28 1491 1
+28 1492 1
+28 1493 1
+28 1494 1
+28 1495 1
+28 1501 1
+28 1502 1
+28 1503 1
+28 1504 1
+28 1505 1
+29 4 1
+29 11 1
+29 17 1
+29 22 1
+29 27 1
+29 28 1
+29 29 1
+29 30 1
+29 39 1
+29 45 1
+29 50 1
+29 55 1
+29 56 1
+29 57 1
+29 58 1
+29 66 1
+29 71 1
+29 76 1
+29 77 1
+29 78 1
+29 79 1
+29 86 1
+29 91 1
+29 92 1
+29 93 1
+29 94 1
+29 101 1
+29 102 1
+29 103 1
+29 104 1
+29 111 1
+29 112 1
+29 113 1
+29 114 1
+29 115 1
+29 116 1
+29 333 1
+29 339 1
+29 344 1
+29 349 1
+29 350 1
+29 351 1
+29 352 1
+29 360 1
+29 365 1
+29 370 1
+29 371 1
+29 372 1
+29 373 1
+29 380 1
+29 385 1
+29 386 1
+29 387 1
+29 388 1
+29 395 1
+29 396 1
+29 397 1
+29 398 1
+29 405 1
+29 406 1
+29 407 1
+29 408 1
+29 409 1
+29 410 1
+29 416 1
+29 421 1
+29 426 1
+29 427 1
+29 428 1
+29 429 1
+29 436 1
+29 441 1
+29 442 1
+29 443 1
+29 444 1
+29 451 1
+29 452 1
+29 453 1
+29 454 1
+29 461 1
+29 462 1
+29 463 1
+29 464 1
+29 465 1
+29 466 1
+29 471 1
+29 476 1
+29 477 1
+29 478 1
+29 479 1
+29 486 1
+29 487 1
+29 488 1
+29 489 1
+29 496 1
+29 497 1
+29 498 1
+29 499 1
+29 500 1
+29 501 1
+29 506 1
+29 507 1
+29 508 1
+29 509 1
+29 516 1
+29 517 1
+29 518 1
+29 519 1
+29 520 1
+29 521 1
+29 526 1
+29 527 1
+29 528 1
+29 529 1
+29 530 1
+29 531 1
+29 536 1
+29 537 1
+29 538 1
+29 539 1
+29 795 1
+29 801 1
+29 806 1
+29 811 1
+29 812 1
+29 813 1
+29 814 1
+29 822 1
+29 827 1
+29 832 1
+29 833 1
+29 834 1
+29 835 1
+29 842 1
+29 847 1
+29 848 1
+29 849 1
+29 850 1
+29 857 1
+29 858 1
+29 859 1
+29 860 1
+29 867 1
+29 868 1
+29 869 1
+29 870 1
+29 871 1
+29 872 1
+29 878 1
+29 883 1
+29 888 1
+29 889 1
+29 890 1
+29 891 1
+29 898 1
+29 903 1
+29 904 1
+29 905 1
+29 906 1
+29 913 1
+29 914 1
+29 915 1
+29 916 1
+29 923 1
+29 924 1
+29 925 1
+29 926 1
+29 927 1
+29 928 1
+29 933 1
+29 938 1
+29 939 1
+29 940 1
+29 941 1
+29 948 1
+29 949 1
+29 950 1
+29 951 1
+29 958 1
+29 959 1
+29 960 1
+29 961 1
+29 962 1
+29 963 1
+29 968 1
+29 969 1
+29 970 1
+29 971 1
+29 978 1
+29 979 1
+29 980 1
+29 981 1
+29 982 1
+29 983 1
+29 988 1
+29 989 1
+29 990 1
+29 991 1
+29 992 1
+29 993 1
+29 998 1
+29 999 1
+29 1000 1
+29 1001 1
+29 1256 1
+29 1261 1
+29 1266 1
+29 1267 1
+29 1268 1
+29 1269 1
+29 1276 1
+29 1281 1
+29 1282 1
+29 1283 1
+29 1284 1
+29 1291 1
+29 1292 1
+29 1293 1
+29 1294 1
+29 1301 1
+29 1302 1
+29 1303 1
+29 1304 1
+29 1305 1
+29 1306 1
+29 1311 1
+29 1316 1
+29 1317 1
+29 1318 1
+29 1319 1
+29 1326 1
+29 1327 1
+29 1328 1
+29 1329 1
+29 1336 1
+29 1337 1
+29 1338 1
+29 1339 1
+29 1340 1
+29 1341 1
+29 1346 1
+29 1347 1
+29 1348 1
+29 1349 1
+29 1356 1
+29 1357 1
+29 1358 1
+29 1359 1
+29 1360 1
+29 1361 1
+29 1366 1
+29 1367 1
+29 1368 1
+29 1369 1
+29 1370 1
+29 1371 1
+29 1376 1
+29 1377 1
+29 1378 1
+29 1379 1
+29 1381 1
+29 1386 1
+29 1387 1
+29 1388 1
+29 1389 1
+29 1396 1
+29 1397 1
+29 1398 1
+29 1399 1
+29 1406 1
+29 1407 1
+29 1408 1
+29 1409 1
+29 1410 1
+29 1411 1
+29 1416 1
+29 1417 1
+29 1418 1
+29 1419 1
+29 1426 1
+29 1427 1
+29 1428 1
+29 1429 1
+29 1430 1
+29 1431 1
+29 1436 1
+29 1437 1
+29 1438 1
+29 1439 1
+29 1440 1
+29 1441 1
+29 1446 1
+29 1447 1
+29 1448 1
+29 1449 1
+29 1451 1
+29 1452 1
+29 1453 1
+29 1454 1
+29 1461 1
+29 1462 1
+29 1463 1
+29 1464 1
+29 1465 1
+29 1466 1
+29 1471 1
+29 1472 1
+29 1473 1
+29 1474 1
+29 1475 1
+29 1476 1
+29 1481 1
+29 1482 1
+29 1483 1
+29 1484 1
+29 1486 1
+29 1487 1
+29 1488 1
+29 1489 1
+29 1490 1
+29 1491 1
+29 1496 1
+29 1497 1
+29 1498 1
+29 1499 1
+29 1501 1
+29 1502 1
+29 1503 1
+29 1504 1
+29 1506 1
+30 5 1
+30 12 1
+30 18 1
+30 23 1
+30 27 1
+30 31 1
+30 32 1
+30 33 1
+30 40 1
+30 46 1
+30 51 1
+30 55 1
+30 59 1
+30 60 1
+30 61 1
+30 67 1
+30 72 1
+30 76 1
+30 80 1
+30 81 1
+30 82 1
+30 87 1
+30 91 1
+30 95 1
+30 96 1
+30 97 1
+30 101 1
+30 105 1
+30 106 1
+30 107 1
+30 111 1
+30 112 1
+30 113 1
+30 117 1
+30 118 1
+30 119 1
+30 334 1
+30 340 1
+30 345 1
+30 349 1
+30 353 1
+30 354 1
+30 355 1
+30 361 1
+30 366 1
+30 370 1
+30 374 1
+30 375 1
+30 376 1
+30 381 1
+30 385 1
+30 389 1
+30 390 1
+30 391 1
+30 395 1
+30 399 1
+30 400 1
+30 401 1
+30 405 1
+30 406 1
+30 407 1
+30 411 1
+30 412 1
+30 413 1
+30 417 1
+30 422 1
+30 426 1
+30 430 1
+30 431 1
+30 432 1
+30 437 1
+30 441 1
+30 445 1
+30 446 1
+30 447 1
+30 451 1
+30 455 1
+30 456 1
+30 457 1
+30 461 1
+30 462 1
+30 463 1
+30 467 1
+30 468 1
+30 469 1
+30 472 1
+30 476 1
+30 480 1
+30 481 1
+30 482 1
+30 486 1
+30 490 1
+30 491 1
+30 492 1
+30 496 1
+30 497 1
+30 498 1
+30 502 1
+30 503 1
+30 504 1
+30 506 1
+30 510 1
+30 511 1
+30 512 1
+30 516 1
+30 517 1
+30 518 1
+30 522 1
+30 523 1
+30 524 1
+30 526 1
+30 527 1
+30 528 1
+30 532 1
+30 533 1
+30 534 1
+30 536 1
+30 537 1
+30 538 1
+30 540 1
+30 796 1
+30 802 1
+30 807 1
+30 811 1
+30 815 1
+30 816 1
+30 817 1
+30 823 1
+30 828 1
+30 832 1
+30 836 1
+30 837 1
+30 838 1
+30 843 1
+30 847 1
+30 851 1
+30 852 1
+30 853 1
+30 857 1
+30 861 1
+30 862 1
+30 863 1
+30 867 1
+30 868 1
+30 869 1
+30 873 1
+30 874 1
+30 875 1
+30 879 1
+30 884 1
+30 888 1
+30 892 1
+30 893 1
+30 894 1
+30 899 1
+30 903 1
+30 907 1
+30 908 1
+30 909 1
+30 913 1
+30 917 1
+30 918 1
+30 919 1
+30 923 1
+30 924 1
+30 925 1
+30 929 1
+30 930 1
+30 931 1
+30 934 1
+30 938 1
+30 942 1
+30 943 1
+30 944 1
+30 948 1
+30 952 1
+30 953 1
+30 954 1
+30 958 1
+30 959 1
+30 960 1
+30 964 1
+30 965 1
+30 966 1
+30 968 1
+30 972 1
+30 973 1
+30 974 1
+30 978 1
+30 979 1
+30 980 1
+30 984 1
+30 985 1
+30 986 1
+30 988 1
+30 989 1
+30 990 1
+30 994 1
+30 995 1
+30 996 1
+30 998 1
+30 999 1
+30 1000 1
+30 1002 1
+30 1257 1
+30 1262 1
+30 1266 1
+30 1270 1
+30 1271 1
+30 1272 1
+30 1277 1
+30 1281 1
+30 1285 1
+30 1286 1
+30 1287 1
+30 1291 1
+30 1295 1
+30 1296 1
+30 1297 1
+30 1301 1
+30 1302 1
+30 1303 1
+30 1307 1
+30 1308 1
+30 1309 1
+30 1312 1
+30 1316 1
+30 1320 1
+30 1321 1
+30 1322 1
+30 1326 1
+30 1330 1
+30 1331 1
+30 1332 1
+30 1336 1
+30 1337 1
+30 1338 1
+30 1342 1
+30 1343 1
+30 1344 1
+30 1346 1
+30 1350 1
+30 1351 1
+30 1352 1
+30 1356 1
+30 1357 1
+30 1358 1
+30 1362 1
+30 1363 1
+30 1364 1
+30 1366 1
+30 1367 1
+30 1368 1
+30 1372 1
+30 1373 1
+30 1374 1
+30 1376 1
+30 1377 1
+30 1378 1
+30 1380 1
+30 1382 1
+30 1386 1
+30 1390 1
+30 1391 1
+30 1392 1
+30 1396 1
+30 1400 1
+30 1401 1
+30 1402 1
+30 1406 1
+30 1407 1
+30 1408 1
+30 1412 1
+30 1413 1
+30 1414 1
+30 1416 1
+30 1420 1
+30 1421 1
+30 1422 1
+30 1426 1
+30 1427 1
+30 1428 1
+30 1432 1
+30 1433 1
+30 1434 1
+30 1436 1
+30 1437 1
+30 1438 1
+30 1442 1
+30 1443 1
+30 1444 1
+30 1446 1
+30 1447 1
+30 1448 1
+30 1450 1
+30 1451 1
+30 1455 1
+30 1456 1
+30 1457 1
+30 1461 1
+30 1462 1
+30 1463 1
+30 1467 1
+30 1468 1
+30 1469 1
+30 1471 1
+30 1472 1
+30 1473 1
+30 1477 1
+30 1478 1
+30 1479 1
+30 1481 1
+30 1482 1
+30 1483 1
+30 1485 1
+30 1486 1
+30 1487 1
+30 1488 1
+30 1492 1
+30 1493 1
+30 1494 1
+30 1496 1
+30 1497 1
+30 1498 1
+30 1500 1
+30 1501 1
+30 1502 1
+30 1503 1
+30 1505 1
+30 1506 1
+31 6 1
+31 13 1
+31 19 1
+31 24 1
+31 28 1
+31 31 1
+31 34 1
+31 35 1
+31 41 1
+31 47 1
+31 52 1
+31 56 1
+31 59 1
+31 62 1
+31 63 1
+31 68 1
+31 73 1
+31 77 1
+31 80 1
+31 83 1
+31 84 1
+31 88 1
+31 92 1
+31 95 1
+31 98 1
+31 99 1
+31 102 1
+31 105 1
+31 108 1
+31 109 1
+31 111 1
+31 114 1
+31 115 1
+31 117 1
+31 118 1
+31 120 1
+31 335 1
+31 341 1
+31 346 1
+31 350 1
+31 353 1
+31 356 1
+31 357 1
+31 362 1
+31 367 1
+31 371 1
+31 374 1
+31 377 1
+31 378 1
+31 382 1
+31 386 1
+31 389 1
+31 392 1
+31 393 1
+31 396 1
+31 399 1
+31 402 1
+31 403 1
+31 405 1
+31 408 1
+31 409 1
+31 411 1
+31 412 1
+31 414 1
+31 418 1
+31 423 1
+31 427 1
+31 430 1
+31 433 1
+31 434 1
+31 438 1
+31 442 1
+31 445 1
+31 448 1
+31 449 1
+31 452 1
+31 455 1
+31 458 1
+31 459 1
+31 461 1
+31 464 1
+31 465 1
+31 467 1
+31 468 1
+31 470 1
+31 473 1
+31 477 1
+31 480 1
+31 483 1
+31 484 1
+31 487 1
+31 490 1
+31 493 1
+31 494 1
+31 496 1
+31 499 1
+31 500 1
+31 502 1
+31 503 1
+31 505 1
+31 507 1
+31 510 1
+31 513 1
+31 514 1
+31 516 1
+31 519 1
+31 520 1
+31 522 1
+31 523 1
+31 525 1
+31 526 1
+31 529 1
+31 530 1
+31 532 1
+31 533 1
+31 535 1
+31 536 1
+31 537 1
+31 539 1
+31 540 1
+31 797 1
+31 803 1
+31 808 1
+31 812 1
+31 815 1
+31 818 1
+31 819 1
+31 824 1
+31 829 1
+31 833 1
+31 836 1
+31 839 1
+31 840 1
+31 844 1
+31 848 1
+31 851 1
+31 854 1
+31 855 1
+31 858 1
+31 861 1
+31 864 1
+31 865 1
+31 867 1
+31 870 1
+31 871 1
+31 873 1
+31 874 1
+31 876 1
+31 880 1
+31 885 1
+31 889 1
+31 892 1
+31 895 1
+31 896 1
+31 900 1
+31 904 1
+31 907 1
+31 910 1
+31 911 1
+31 914 1
+31 917 1
+31 920 1
+31 921 1
+31 923 1
+31 926 1
+31 927 1
+31 929 1
+31 930 1
+31 932 1
+31 935 1
+31 939 1
+31 942 1
+31 945 1
+31 946 1
+31 949 1
+31 952 1
+31 955 1
+31 956 1
+31 958 1
+31 961 1
+31 962 1
+31 964 1
+31 965 1
+31 967 1
+31 969 1
+31 972 1
+31 975 1
+31 976 1
+31 978 1
+31 981 1
+31 982 1
+31 984 1
+31 985 1
+31 987 1
+31 988 1
+31 991 1
+31 992 1
+31 994 1
+31 995 1
+31 997 1
+31 998 1
+31 999 1
+31 1001 1
+31 1002 1
+31 1258 1
+31 1263 1
+31 1267 1
+31 1270 1
+31 1273 1
+31 1274 1
+31 1278 1
+31 1282 1
+31 1285 1
+31 1288 1
+31 1289 1
+31 1292 1
+31 1295 1
+31 1298 1
+31 1299 1
+31 1301 1
+31 1304 1
+31 1305 1
+31 1307 1
+31 1308 1
+31 1310 1
+31 1313 1
+31 1317 1
+31 1320 1
+31 1323 1
+31 1324 1
+31 1327 1
+31 1330 1
+31 1333 1
+31 1334 1
+31 1336 1
+31 1339 1
+31 1340 1
+31 1342 1
+31 1343 1
+31 1345 1
+31 1347 1
+31 1350 1
+31 1353 1
+31 1354 1
+31 1356 1
+31 1359 1
+31 1360 1
+31 1362 1
+31 1363 1
+31 1365 1
+31 1366 1
+31 1369 1
+31 1370 1
+31 1372 1
+31 1373 1
+31 1375 1
+31 1376 1
+31 1377 1
+31 1379 1
+31 1380 1
+31 1383 1
+31 1387 1
+31 1390 1
+31 1393 1
+31 1394 1
+31 1397 1
+31 1400 1
+31 1403 1
+31 1404 1
+31 1406 1
+31 1409 1
+31 1410 1
+31 1412 1
+31 1413 1
+31 1415 1
+31 1417 1
+31 1420 1
+31 1423 1
+31 1424 1
+31 1426 1
+31 1429 1
+31 1430 1
+31 1432 1
+31 1433 1
+31 1435 1
+31 1436 1
+31 1439 1
+31 1440 1
+31 1442 1
+31 1443 1
+31 1445 1
+31 1446 1
+31 1447 1
+31 1449 1
+31 1450 1
+31 1452 1
+31 1455 1
+31 1458 1
+31 1459 1
+31 1461 1
+31 1464 1
+31 1465 1
+31 1467 1
+31 1468 1
+31 1470 1
+31 1471 1
+31 1474 1
+31 1475 1
+31 1477 1
+31 1478 1
+31 1480 1
+31 1481 1
+31 1482 1
+31 1484 1
+31 1485 1
+31 1486 1
+31 1489 1
+31 1490 1
+31 1492 1
+31 1493 1
+31 1495 1
+31 1496 1
+31 1497 1
+31 1499 1
+31 1500 1
+31 1501 1
+31 1502 1
+31 1504 1
+31 1505 1
+31 1506 1
+32 7 1
+32 14 1
+32 20 1
+32 25 1
+32 29 1
+32 32 1
+32 34 1
+32 36 1
+32 42 1
+32 48 1
+32 53 1
+32 57 1
+32 60 1
+32 62 1
+32 64 1
+32 69 1
+32 74 1
+32 78 1
+32 81 1
+32 83 1
+32 85 1
+32 89 1
+32 93 1
+32 96 1
+32 98 1
+32 100 1
+32 103 1
+32 106 1
+32 108 1
+32 110 1
+32 112 1
+32 114 1
+32 116 1
+32 117 1
+32 119 1
+32 120 1
+32 336 1
+32 342 1
+32 347 1
+32 351 1
+32 354 1
+32 356 1
+32 358 1
+32 363 1
+32 368 1
+32 372 1
+32 375 1
+32 377 1
+32 379 1
+32 383 1
+32 387 1
+32 390 1
+32 392 1
+32 394 1
+32 397 1
+32 400 1
+32 402 1
+32 404 1
+32 406 1
+32 408 1
+32 410 1
+32 411 1
+32 413 1
+32 414 1
+32 419 1
+32 424 1
+32 428 1
+32 431 1
+32 433 1
+32 435 1
+32 439 1
+32 443 1
+32 446 1
+32 448 1
+32 450 1
+32 453 1
+32 456 1
+32 458 1
+32 460 1
+32 462 1
+32 464 1
+32 466 1
+32 467 1
+32 469 1
+32 470 1
+32 474 1
+32 478 1
+32 481 1
+32 483 1
+32 485 1
+32 488 1
+32 491 1
+32 493 1
+32 495 1
+32 497 1
+32 499 1
+32 501 1
+32 502 1
+32 504 1
+32 505 1
+32 508 1
+32 511 1
+32 513 1
+32 515 1
+32 517 1
+32 519 1
+32 521 1
+32 522 1
+32 524 1
+32 525 1
+32 527 1
+32 529 1
+32 531 1
+32 532 1
+32 534 1
+32 535 1
+32 536 1
+32 538 1
+32 539 1
+32 540 1
+32 798 1
+32 804 1
+32 809 1
+32 813 1
+32 816 1
+32 818 1
+32 820 1
+32 825 1
+32 830 1
+32 834 1
+32 837 1
+32 839 1
+32 841 1
+32 845 1
+32 849 1
+32 852 1
+32 854 1
+32 856 1
+32 859 1
+32 862 1
+32 864 1
+32 866 1
+32 868 1
+32 870 1
+32 872 1
+32 873 1
+32 875 1
+32 876 1
+32 881 1
+32 886 1
+32 890 1
+32 893 1
+32 895 1
+32 897 1
+32 901 1
+32 905 1
+32 908 1
+32 910 1
+32 912 1
+32 915 1
+32 918 1
+32 920 1
+32 922 1
+32 924 1
+32 926 1
+32 928 1
+32 929 1
+32 931 1
+32 932 1
+32 936 1
+32 940 1
+32 943 1
+32 945 1
+32 947 1
+32 950 1
+32 953 1
+32 955 1
+32 957 1
+32 959 1
+32 961 1
+32 963 1
+32 964 1
+32 966 1
+32 967 1
+32 970 1
+32 973 1
+32 975 1
+32 977 1
+32 979 1
+32 981 1
+32 983 1
+32 984 1
+32 986 1
+32 987 1
+32 989 1
+32 991 1
+32 993 1
+32 994 1
+32 996 1
+32 997 1
+32 998 1
+32 1000 1
+32 1001 1
+32 1002 1
+32 1259 1
+32 1264 1
+32 1268 1
+32 1271 1
+32 1273 1
+32 1275 1
+32 1279 1
+32 1283 1
+32 1286 1
+32 1288 1
+32 1290 1
+32 1293 1
+32 1296 1
+32 1298 1
+32 1300 1
+32 1302 1
+32 1304 1
+32 1306 1
+32 1307 1
+32 1309 1
+32 1310 1
+32 1314 1
+32 1318 1
+32 1321 1
+32 1323 1
+32 1325 1
+32 1328 1
+32 1331 1
+32 1333 1
+32 1335 1
+32 1337 1
+32 1339 1
+32 1341 1
+32 1342 1
+32 1344 1
+32 1345 1
+32 1348 1
+32 1351 1
+32 1353 1
+32 1355 1
+32 1357 1
+32 1359 1
+32 1361 1
+32 1362 1
+32 1364 1
+32 1365 1
+32 1367 1
+32 1369 1
+32 1371 1
+32 1372 1
+32 1374 1
+32 1375 1
+32 1376 1
+32 1378 1
+32 1379 1
+32 1380 1
+32 1384 1
+32 1388 1
+32 1391 1
+32 1393 1
+32 1395 1
+32 1398 1
+32 1401 1
+32 1403 1
+32 1405 1
+32 1407 1
+32 1409 1
+32 1411 1
+32 1412 1
+32 1414 1
+32 1415 1
+32 1418 1
+32 1421 1
+32 1423 1
+32 1425 1
+32 1427 1
+32 1429 1
+32 1431 1
+32 1432 1
+32 1434 1
+32 1435 1
+32 1437 1
+32 1439 1
+32 1441 1
+32 1442 1
+32 1444 1
+32 1445 1
+32 1446 1
+32 1448 1
+32 1449 1
+32 1450 1
+32 1453 1
+32 1456 1
+32 1458 1
+32 1460 1
+32 1462 1
+32 1464 1
+32 1466 1
+32 1467 1
+32 1469 1
+32 1470 1
+32 1472 1
+32 1474 1
+32 1476 1
+32 1477 1
+32 1479 1
+32 1480 1
+32 1481 1
+32 1483 1
+32 1484 1
+32 1485 1
+32 1487 1
+32 1489 1
+32 1491 1
+32 1492 1
+32 1494 1
+32 1495 1
+32 1496 1
+32 1498 1
+32 1499 1
+32 1500 1
+32 1501 1
+32 1503 1
+32 1504 1
+32 1505 1
+32 1506 1
+33 8 1
+33 15 1
+33 21 1
+33 26 1
+33 30 1
+33 33 1
+33 35 1
+33 36 1
+33 43 1
+33 49 1
+33 54 1
+33 58 1
+33 61 1
+33 63 1
+33 64 1
+33 70 1
+33 75 1
+33 79 1
+33 82 1
+33 84 1
+33 85 1
+33 90 1
+33 94 1
+33 97 1
+33 99 1
+33 100 1
+33 104 1
+33 107 1
+33 109 1
+33 110 1
+33 113 1
+33 115 1
+33 116 1
+33 118 1
+33 119 1
+33 120 1
+33 337 1
+33 343 1
+33 348 1
+33 352 1
+33 355 1
+33 357 1
+33 358 1
+33 364 1
+33 369 1
+33 373 1
+33 376 1
+33 378 1
+33 379 1
+33 384 1
+33 388 1
+33 391 1
+33 393 1
+33 394 1
+33 398 1
+33 401 1
+33 403 1
+33 404 1
+33 407 1
+33 409 1
+33 410 1
+33 412 1
+33 413 1
+33 414 1
+33 420 1
+33 425 1
+33 429 1
+33 432 1
+33 434 1
+33 435 1
+33 440 1
+33 444 1
+33 447 1
+33 449 1
+33 450 1
+33 454 1
+33 457 1
+33 459 1
+33 460 1
+33 463 1
+33 465 1
+33 466 1
+33 468 1
+33 469 1
+33 470 1
+33 475 1
+33 479 1
+33 482 1
+33 484 1
+33 485 1
+33 489 1
+33 492 1
+33 494 1
+33 495 1
+33 498 1
+33 500 1
+33 501 1
+33 503 1
+33 504 1
+33 505 1
+33 509 1
+33 512 1
+33 514 1
+33 515 1
+33 518 1
+33 520 1
+33 521 1
+33 523 1
+33 524 1
+33 525 1
+33 528 1
+33 530 1
+33 531 1
+33 533 1
+33 534 1
+33 535 1
+33 537 1
+33 538 1
+33 539 1
+33 540 1
+33 799 1
+33 805 1
+33 810 1
+33 814 1
+33 817 1
+33 819 1
+33 820 1
+33 826 1
+33 831 1
+33 835 1
+33 838 1
+33 840 1
+33 841 1
+33 846 1
+33 850 1
+33 853 1
+33 855 1
+33 856 1
+33 860 1
+33 863 1
+33 865 1
+33 866 1
+33 869 1
+33 871 1
+33 872 1
+33 874 1
+33 875 1
+33 876 1
+33 882 1
+33 887 1
+33 891 1
+33 894 1
+33 896 1
+33 897 1
+33 902 1
+33 906 1
+33 909 1
+33 911 1
+33 912 1
+33 916 1
+33 919 1
+33 921 1
+33 922 1
+33 925 1
+33 927 1
+33 928 1
+33 930 1
+33 931 1
+33 932 1
+33 937 1
+33 941 1
+33 944 1
+33 946 1
+33 947 1
+33 951 1
+33 954 1
+33 956 1
+33 957 1
+33 960 1
+33 962 1
+33 963 1
+33 965 1
+33 966 1
+33 967 1
+33 971 1
+33 974 1
+33 976 1
+33 977 1
+33 980 1
+33 982 1
+33 983 1
+33 985 1
+33 986 1
+33 987 1
+33 990 1
+33 992 1
+33 993 1
+33 995 1
+33 996 1
+33 997 1
+33 999 1
+33 1000 1
+33 1001 1
+33 1002 1
+33 1260 1
+33 1265 1
+33 1269 1
+33 1272 1
+33 1274 1
+33 1275 1
+33 1280 1
+33 1284 1
+33 1287 1
+33 1289 1
+33 1290 1
+33 1294 1
+33 1297 1
+33 1299 1
+33 1300 1
+33 1303 1
+33 1305 1
+33 1306 1
+33 1308 1
+33 1309 1
+33 1310 1
+33 1315 1
+33 1319 1
+33 1322 1
+33 1324 1
+33 1325 1
+33 1329 1
+33 1332 1
+33 1334 1
+33 1335 1
+33 1338 1
+33 1340 1
+33 1341 1
+33 1343 1
+33 1344 1
+33 1345 1
+33 1349 1
+33 1352 1
+33 1354 1
+33 1355 1
+33 1358 1
+33 1360 1
+33 1361 1
+33 1363 1
+33 1364 1
+33 1365 1
+33 1368 1
+33 1370 1
+33 1371 1
+33 1373 1
+33 1374 1
+33 1375 1
+33 1377 1
+33 1378 1
+33 1379 1
+33 1380 1
+33 1385 1
+33 1389 1
+33 1392 1
+33 1394 1
+33 1395 1
+33 1399 1
+33 1402 1
+33 1404 1
+33 1405 1
+33 1408 1
+33 1410 1
+33 1411 1
+33 1413 1
+33 1414 1
+33 1415 1
+33 1419 1
+33 1422 1
+33 1424 1
+33 1425 1
+33 1428 1
+33 1430 1
+33 1431 1
+33 1433 1
+33 1434 1
+33 1435 1
+33 1438 1
+33 1440 1
+33 1441 1
+33 1443 1
+33 1444 1
+33 1445 1
+33 1447 1
+33 1448 1
+33 1449 1
+33 1450 1
+33 1454 1
+33 1457 1
+33 1459 1
+33 1460 1
+33 1463 1
+33 1465 1
+33 1466 1
+33 1468 1
+33 1469 1
+33 1470 1
+33 1473 1
+33 1475 1
+33 1476 1
+33 1478 1
+33 1479 1
+33 1480 1
+33 1482 1
+33 1483 1
+33 1484 1
+33 1485 1
+33 1488 1
+33 1490 1
+33 1491 1
+33 1493 1
+33 1494 1
+33 1495 1
+33 1497 1
+33 1498 1
+33 1499 1
+33 1500 1
+33 1502 1
+33 1503 1
+33 1504 1
+33 1505 1
+33 1506 1
+34 1 1
+34 2 1
+34 3 1
+34 4 1
+34 5 1
+34 6 1
+34 7 1
+34 8 1
+34 121 1
+34 122 1
+34 123 1
+34 124 1
+34 125 1
+34 126 1
+34 127 1
+34 128 1
+34 129 1
+34 130 1
+34 131 1
+34 132 1
+34 133 1
+34 134 1
+34 135 1
+34 136 1
+34 137 1
+34 138 1
+34 139 1
+34 140 1
+34 141 1
+34 142 1
+34 143 1
+34 144 1
+34 145 1
+34 146 1
+34 147 1
+34 148 1
+34 331 1
+34 332 1
+34 333 1
+34 334 1
+34 335 1
+34 336 1
+34 337 1
+34 338 1
+34 339 1
+34 340 1
+34 341 1
+34 342 1
+34 343 1
+34 344 1
+34 345 1
+34 346 1
+34 347 1
+34 348 1
+34 349 1
+34 350 1
+34 351 1
+34 352 1
+34 353 1
+34 354 1
+34 355 1
+34 356 1
+34 357 1
+34 358 1
+34 541 1
+34 542 1
+34 543 1
+34 544 1
+34 545 1
+34 546 1
+34 547 1
+34 548 1
+34 549 1
+34 550 1
+34 551 1
+34 552 1
+34 553 1
+34 554 1
+34 555 1
+34 556 1
+34 557 1
+34 558 1
+34 559 1
+34 560 1
+34 561 1
+34 562 1
+34 563 1
+34 564 1
+34 565 1
+34 566 1
+34 567 1
+34 568 1
+34 569 1
+34 570 1
+34 571 1
+34 572 1
+34 573 1
+34 574 1
+34 575 1
+34 576 1
+34 577 1
+34 578 1
+34 579 1
+34 580 1
+34 581 1
+34 582 1
+34 583 1
+34 584 1
+34 585 1
+34 586 1
+34 587 1
+34 588 1
+34 589 1
+34 590 1
+34 591 1
+34 592 1
+34 593 1
+34 594 1
+34 595 1
+34 596 1
+34 793 1
+34 794 1
+34 795 1
+34 796 1
+34 797 1
+34 798 1
+34 799 1
+34 800 1
+34 801 1
+34 802 1
+34 803 1
+34 804 1
+34 805 1
+34 806 1
+34 807 1
+34 808 1
+34 809 1
+34 810 1
+34 811 1
+34 812 1
+34 813 1
+34 814 1
+34 815 1
+34 816 1
+34 817 1
+34 818 1
+34 819 1
+34 820 1
+34 1003 1
+34 1004 1
+34 1005 1
+34 1006 1
+34 1007 1
+34 1008 1
+34 1009 1
+34 1010 1
+34 1011 1
+34 1012 1
+34 1013 1
+34 1014 1
+34 1015 1
+34 1016 1
+34 1017 1
+34 1018 1
+34 1019 1
+34 1020 1
+34 1021 1
+34 1022 1
+34 1023 1
+34 1024 1
+34 1025 1
+34 1026 1
+34 1027 1
+34 1028 1
+34 1029 1
+34 1030 1
+34 1031 1
+34 1032 1
+34 1033 1
+34 1034 1
+34 1035 1
+34 1036 1
+34 1037 1
+34 1038 1
+34 1039 1
+34 1040 1
+34 1041 1
+34 1042 1
+34 1043 1
+34 1044 1
+34 1045 1
+34 1046 1
+34 1047 1
+34 1048 1
+34 1049 1
+34 1050 1
+34 1051 1
+34 1052 1
+34 1053 1
+34 1054 1
+34 1055 1
+34 1056 1
+34 1057 1
+34 1058 1
+34 1255 1
+34 1256 1
+34 1257 1
+34 1258 1
+34 1259 1
+34 1260 1
+34 1261 1
+34 1262 1
+34 1263 1
+34 1264 1
+34 1265 1
+34 1266 1
+34 1267 1
+34 1268 1
+34 1269 1
+34 1270 1
+34 1271 1
+34 1272 1
+34 1273 1
+34 1274 1
+34 1275 1
+34 1276 1
+34 1277 1
+34 1278 1
+34 1279 1
+34 1280 1
+34 1281 1
+34 1282 1
+34 1283 1
+34 1284 1
+34 1285 1
+34 1286 1
+34 1287 1
+34 1288 1
+34 1289 1
+34 1290 1
+34 1291 1
+34 1292 1
+34 1293 1
+34 1294 1
+34 1295 1
+34 1296 1
+34 1297 1
+34 1298 1
+34 1299 1
+34 1300 1
+34 1301 1
+34 1302 1
+34 1303 1
+34 1304 1
+34 1305 1
+34 1306 1
+34 1307 1
+34 1308 1
+34 1309 1
+34 1310 1
+34 1507 1
+34 1508 1
+34 1509 1
+34 1510 1
+34 1511 1
+34 1512 1
+34 1513 1
+34 1514 1
+34 1515 1
+34 1516 1
+34 1517 1
+34 1518 1
+34 1519 1
+34 1520 1
+34 1521 1
+34 1522 1
+34 1523 1
+34 1524 1
+34 1525 1
+34 1526 1
+34 1527 1
+34 1528 1
+34 1529 1
+34 1530 1
+34 1531 1
+34 1532 1
+34 1533 1
+34 1534 1
+34 1535 1
+34 1536 1
+34 1537 1
+34 1538 1
+34 1539 1
+34 1540 1
+34 1541 1
+34 1542 1
+34 1543 1
+34 1544 1
+34 1545 1
+34 1546 1
+34 1547 1
+34 1548 1
+34 1549 1
+34 1550 1
+34 1551 1
+34 1552 1
+34 1553 1
+34 1554 1
+34 1555 1
+34 1556 1
+34 1557 1
+34 1558 1
+34 1559 1
+34 1560 1
+34 1561 1
+34 1562 1
+34 1563 1
+34 1564 1
+34 1565 1
+34 1566 1
+34 1567 1
+34 1568 1
+34 1569 1
+34 1570 1
+34 1571 1
+34 1572 1
+34 1573 1
+34 1574 1
+34 1575 1
+34 1576 1
+35 1 1
+35 9 1
+35 10 1
+35 11 1
+35 12 1
+35 13 1
+35 14 1
+35 15 1
+35 121 1
+35 122 1
+35 123 1
+35 124 1
+35 125 1
+35 126 1
+35 127 1
+35 149 1
+35 150 1
+35 151 1
+35 152 1
+35 153 1
+35 154 1
+35 155 1
+35 156 1
+35 157 1
+35 158 1
+35 159 1
+35 160 1
+35 161 1
+35 162 1
+35 163 1
+35 164 1
+35 165 1
+35 166 1
+35 167 1
+35 168 1
+35 169 1
+35 331 1
+35 332 1
+35 333 1
+35 334 1
+35 335 1
+35 336 1
+35 337 1
+35 359 1
+35 360 1
+35 361 1
+35 362 1
+35 363 1
+35 364 1
+35 365 1
+35 366 1
+35 367 1
+35 368 1
+35 369 1
+35 370 1
+35 371 1
+35 372 1
+35 373 1
+35 374 1
+35 375 1
+35 376 1
+35 377 1
+35 378 1
+35 379 1
+35 541 1
+35 542 1
+35 543 1
+35 544 1
+35 545 1
+35 546 1
+35 547 1
+35 548 1
+35 549 1
+35 550 1
+35 551 1
+35 552 1
+35 553 1
+35 554 1
+35 555 1
+35 556 1
+35 557 1
+35 558 1
+35 559 1
+35 560 1
+35 561 1
+35 597 1
+35 598 1
+35 599 1
+35 600 1
+35 601 1
+35 602 1
+35 603 1
+35 604 1
+35 605 1
+35 606 1
+35 607 1
+35 608 1
+35 609 1
+35 610 1
+35 611 1
+35 612 1
+35 613 1
+35 614 1
+35 615 1
+35 616 1
+35 617 1
+35 618 1
+35 619 1
+35 620 1
+35 621 1
+35 622 1
+35 623 1
+35 624 1
+35 625 1
+35 626 1
+35 627 1
+35 628 1
+35 629 1
+35 630 1
+35 631 1
+35 793 1
+35 794 1
+35 795 1
+35 796 1
+35 797 1
+35 798 1
+35 799 1
+35 821 1
+35 822 1
+35 823 1
+35 824 1
+35 825 1
+35 826 1
+35 827 1
+35 828 1
+35 829 1
+35 830 1
+35 831 1
+35 832 1
+35 833 1
+35 834 1
+35 835 1
+35 836 1
+35 837 1
+35 838 1
+35 839 1
+35 840 1
+35 841 1
+35 1003 1
+35 1004 1
+35 1005 1
+35 1006 1
+35 1007 1
+35 1008 1
+35 1009 1
+35 1010 1
+35 1011 1
+35 1012 1
+35 1013 1
+35 1014 1
+35 1015 1
+35 1016 1
+35 1017 1
+35 1018 1
+35 1019 1
+35 1020 1
+35 1021 1
+35 1022 1
+35 1023 1
+35 1059 1
+35 1060 1
+35 1061 1
+35 1062 1
+35 1063 1
+35 1064 1
+35 1065 1
+35 1066 1
+35 1067 1
+35 1068 1
+35 1069 1
+35 1070 1
+35 1071 1
+35 1072 1
+35 1073 1
+35 1074 1
+35 1075 1
+35 1076 1
+35 1077 1
+35 1078 1
+35 1079 1
+35 1080 1
+35 1081 1
+35 1082 1
+35 1083 1
+35 1084 1
+35 1085 1
+35 1086 1
+35 1087 1
+35 1088 1
+35 1089 1
+35 1090 1
+35 1091 1
+35 1092 1
+35 1093 1
+35 1255 1
+35 1256 1
+35 1257 1
+35 1258 1
+35 1259 1
+35 1260 1
+35 1261 1
+35 1262 1
+35 1263 1
+35 1264 1
+35 1265 1
+35 1266 1
+35 1267 1
+35 1268 1
+35 1269 1
+35 1270 1
+35 1271 1
+35 1272 1
+35 1273 1
+35 1274 1
+35 1275 1
+35 1311 1
+35 1312 1
+35 1313 1
+35 1314 1
+35 1315 1
+35 1316 1
+35 1317 1
+35 1318 1
+35 1319 1
+35 1320 1
+35 1321 1
+35 1322 1
+35 1323 1
+35 1324 1
+35 1325 1
+35 1326 1
+35 1327 1
+35 1328 1
+35 1329 1
+35 1330 1
+35 1331 1
+35 1332 1
+35 1333 1
+35 1334 1
+35 1335 1
+35 1336 1
+35 1337 1
+35 1338 1
+35 1339 1
+35 1340 1
+35 1341 1
+35 1342 1
+35 1343 1
+35 1344 1
+35 1345 1
+35 1507 1
+35 1508 1
+35 1509 1
+35 1510 1
+35 1511 1
+35 1512 1
+35 1513 1
+35 1514 1
+35 1515 1
+35 1516 1
+35 1517 1
+35 1518 1
+35 1519 1
+35 1520 1
+35 1521 1
+35 1522 1
+35 1523 1
+35 1524 1
+35 1525 1
+35 1526 1
+35 1527 1
+35 1528 1
+35 1529 1
+35 1530 1
+35 1531 1
+35 1532 1
+35 1533 1
+35 1534 1
+35 1535 1
+35 1536 1
+35 1537 1
+35 1538 1
+35 1539 1
+35 1540 1
+35 1541 1
+35 1577 1
+35 1578 1
+35 1579 1
+35 1580 1
+35 1581 1
+35 1582 1
+35 1583 1
+35 1584 1
+35 1585 1
+35 1586 1
+35 1587 1
+35 1588 1
+35 1589 1
+35 1590 1
+35 1591 1
+35 1592 1
+35 1593 1
+35 1594 1
+35 1595 1
+35 1596 1
+35 1597 1
+35 1598 1
+35 1599 1
+35 1600 1
+35 1601 1
+35 1602 1
+35 1603 1
+35 1604 1
+35 1605 1
+35 1606 1
+35 1607 1
+35 1608 1
+35 1609 1
+35 1610 1
+35 1611 1
+36 2 1
+36 9 1
+36 16 1
+36 17 1
+36 18 1
+36 19 1
+36 20 1
+36 21 1
+36 121 1
+36 128 1
+36 129 1
+36 130 1
+36 131 1
+36 132 1
+36 133 1
+36 149 1
+36 150 1
+36 151 1
+36 152 1
+36 153 1
+36 154 1
+36 170 1
+36 171 1
+36 172 1
+36 173 1
+36 174 1
+36 175 1
+36 176 1
+36 177 1
+36 178 1
+36 179 1
+36 180 1
+36 181 1
+36 182 1
+36 183 1
+36 184 1
+36 331 1
+36 338 1
+36 339 1
+36 340 1
+36 341 1
+36 342 1
+36 343 1
+36 359 1
+36 360 1
+36 361 1
+36 362 1
+36 363 1
+36 364 1
+36 380 1
+36 381 1
+36 382 1
+36 383 1
+36 384 1
+36 385 1
+36 386 1
+36 387 1
+36 388 1
+36 389 1
+36 390 1
+36 391 1
+36 392 1
+36 393 1
+36 394 1
+36 541 1
+36 542 1
+36 543 1
+36 544 1
+36 545 1
+36 546 1
+36 562 1
+36 563 1
+36 564 1
+36 565 1
+36 566 1
+36 567 1
+36 568 1
+36 569 1
+36 570 1
+36 571 1
+36 572 1
+36 573 1
+36 574 1
+36 575 1
+36 576 1
+36 597 1
+36 598 1
+36 599 1
+36 600 1
+36 601 1
+36 602 1
+36 603 1
+36 604 1
+36 605 1
+36 606 1
+36 607 1
+36 608 1
+36 609 1
+36 610 1
+36 611 1
+36 632 1
+36 633 1
+36 634 1
+36 635 1
+36 636 1
+36 637 1
+36 638 1
+36 639 1
+36 640 1
+36 641 1
+36 642 1
+36 643 1
+36 644 1
+36 645 1
+36 646 1
+36 647 1
+36 648 1
+36 649 1
+36 650 1
+36 651 1
+36 793 1
+36 800 1
+36 801 1
+36 802 1
+36 803 1
+36 804 1
+36 805 1
+36 821 1
+36 822 1
+36 823 1
+36 824 1
+36 825 1
+36 826 1
+36 842 1
+36 843 1
+36 844 1
+36 845 1
+36 846 1
+36 847 1
+36 848 1
+36 849 1
+36 850 1
+36 851 1
+36 852 1
+36 853 1
+36 854 1
+36 855 1
+36 856 1
+36 1003 1
+36 1004 1
+36 1005 1
+36 1006 1
+36 1007 1
+36 1008 1
+36 1024 1
+36 1025 1
+36 1026 1
+36 1027 1
+36 1028 1
+36 1029 1
+36 1030 1
+36 1031 1
+36 1032 1
+36 1033 1
+36 1034 1
+36 1035 1
+36 1036 1
+36 1037 1
+36 1038 1
+36 1059 1
+36 1060 1
+36 1061 1
+36 1062 1
+36 1063 1
+36 1064 1
+36 1065 1
+36 1066 1
+36 1067 1
+36 1068 1
+36 1069 1
+36 1070 1
+36 1071 1
+36 1072 1
+36 1073 1
+36 1094 1
+36 1095 1
+36 1096 1
+36 1097 1
+36 1098 1
+36 1099 1
+36 1100 1
+36 1101 1
+36 1102 1
+36 1103 1
+36 1104 1
+36 1105 1
+36 1106 1
+36 1107 1
+36 1108 1
+36 1109 1
+36 1110 1
+36 1111 1
+36 1112 1
+36 1113 1
+36 1255 1
+36 1256 1
+36 1257 1
+36 1258 1
+36 1259 1
+36 1260 1
+36 1276 1
+36 1277 1
+36 1278 1
+36 1279 1
+36 1280 1
+36 1281 1
+36 1282 1
+36 1283 1
+36 1284 1
+36 1285 1
+36 1286 1
+36 1287 1
+36 1288 1
+36 1289 1
+36 1290 1
+36 1311 1
+36 1312 1
+36 1313 1
+36 1314 1
+36 1315 1
+36 1316 1
+36 1317 1
+36 1318 1
+36 1319 1
+36 1320 1
+36 1321 1
+36 1322 1
+36 1323 1
+36 1324 1
+36 1325 1
+36 1346 1
+36 1347 1
+36 1348 1
+36 1349 1
+36 1350 1
+36 1351 1
+36 1352 1
+36 1353 1
+36 1354 1
+36 1355 1
+36 1356 1
+36 1357 1
+36 1358 1
+36 1359 1
+36 1360 1
+36 1361 1
+36 1362 1
+36 1363 1
+36 1364 1
+36 1365 1
+36 1507 1
+36 1508 1
+36 1509 1
+36 1510 1
+36 1511 1
+36 1512 1
+36 1513 1
+36 1514 1
+36 1515 1
+36 1516 1
+36 1517 1
+36 1518 1
+36 1519 1
+36 1520 1
+36 1521 1
+36 1542 1
+36 1543 1
+36 1544 1
+36 1545 1
+36 1546 1
+36 1547 1
+36 1548 1
+36 1549 1
+36 1550 1
+36 1551 1
+36 1552 1
+36 1553 1
+36 1554 1
+36 1555 1
+36 1556 1
+36 1557 1
+36 1558 1
+36 1559 1
+36 1560 1
+36 1561 1
+36 1577 1
+36 1578 1
+36 1579 1
+36 1580 1
+36 1581 1
+36 1582 1
+36 1583 1
+36 1584 1
+36 1585 1
+36 1586 1
+36 1587 1
+36 1588 1
+36 1589 1
+36 1590 1
+36 1591 1
+36 1592 1
+36 1593 1
+36 1594 1
+36 1595 1
+36 1596 1
+36 1612 1
+36 1613 1
+36 1614 1
+36 1615 1
+36 1616 1
+36 1617 1
+36 1618 1
+36 1619 1
+36 1620 1
+36 1621 1
+36 1622 1
+36 1623 1
+36 1624 1
+36 1625 1
+36 1626 1
+37 3 1
+37 10 1
+37 16 1
+37 22 1
+37 23 1
+37 24 1
+37 25 1
+37 26 1
+37 122 1
+37 128 1
+37 134 1
+37 135 1
+37 136 1
+37 137 1
+37 138 1
+37 149 1
+37 155 1
+37 156 1
+37 157 1
+37 158 1
+37 159 1
+37 170 1
+37 171 1
+37 172 1
+37 173 1
+37 174 1
+37 185 1
+37 186 1
+37 187 1
+37 188 1
+37 189 1
+37 190 1
+37 191 1
+37 192 1
+37 193 1
+37 194 1
+37 332 1
+37 338 1
+37 344 1
+37 345 1
+37 346 1
+37 347 1
+37 348 1
+37 359 1
+37 365 1
+37 366 1
+37 367 1
+37 368 1
+37 369 1
+37 380 1
+37 381 1
+37 382 1
+37 383 1
+37 384 1
+37 395 1
+37 396 1
+37 397 1
+37 398 1
+37 399 1
+37 400 1
+37 401 1
+37 402 1
+37 403 1
+37 404 1
+37 541 1
+37 547 1
+37 548 1
+37 549 1
+37 550 1
+37 551 1
+37 562 1
+37 563 1
+37 564 1
+37 565 1
+37 566 1
+37 577 1
+37 578 1
+37 579 1
+37 580 1
+37 581 1
+37 582 1
+37 583 1
+37 584 1
+37 585 1
+37 586 1
+37 597 1
+37 598 1
+37 599 1
+37 600 1
+37 601 1
+37 612 1
+37 613 1
+37 614 1
+37 615 1
+37 616 1
+37 617 1
+37 618 1
+37 619 1
+37 620 1
+37 621 1
+37 632 1
+37 633 1
+37 634 1
+37 635 1
+37 636 1
+37 637 1
+37 638 1
+37 639 1
+37 640 1
+37 641 1
+37 652 1
+37 653 1
+37 654 1
+37 655 1
+37 656 1
+37 657 1
+37 658 1
+37 659 1
+37 660 1
+37 661 1
+37 794 1
+37 800 1
+37 806 1
+37 807 1
+37 808 1
+37 809 1
+37 810 1
+37 821 1
+37 827 1
+37 828 1
+37 829 1
+37 830 1
+37 831 1
+37 842 1
+37 843 1
+37 844 1
+37 845 1
+37 846 1
+37 857 1
+37 858 1
+37 859 1
+37 860 1
+37 861 1
+37 862 1
+37 863 1
+37 864 1
+37 865 1
+37 866 1
+37 1003 1
+37 1009 1
+37 1010 1
+37 1011 1
+37 1012 1
+37 1013 1
+37 1024 1
+37 1025 1
+37 1026 1
+37 1027 1
+37 1028 1
+37 1039 1
+37 1040 1
+37 1041 1
+37 1042 1
+37 1043 1
+37 1044 1
+37 1045 1
+37 1046 1
+37 1047 1
+37 1048 1
+37 1059 1
+37 1060 1
+37 1061 1
+37 1062 1
+37 1063 1
+37 1074 1
+37 1075 1
+37 1076 1
+37 1077 1
+37 1078 1
+37 1079 1
+37 1080 1
+37 1081 1
+37 1082 1
+37 1083 1
+37 1094 1
+37 1095 1
+37 1096 1
+37 1097 1
+37 1098 1
+37 1099 1
+37 1100 1
+37 1101 1
+37 1102 1
+37 1103 1
+37 1114 1
+37 1115 1
+37 1116 1
+37 1117 1
+37 1118 1
+37 1119 1
+37 1120 1
+37 1121 1
+37 1122 1
+37 1123 1
+37 1255 1
+37 1261 1
+37 1262 1
+37 1263 1
+37 1264 1
+37 1265 1
+37 1276 1
+37 1277 1
+37 1278 1
+37 1279 1
+37 1280 1
+37 1291 1
+37 1292 1
+37 1293 1
+37 1294 1
+37 1295 1
+37 1296 1
+37 1297 1
+37 1298 1
+37 1299 1
+37 1300 1
+37 1311 1
+37 1312 1
+37 1313 1
+37 1314 1
+37 1315 1
+37 1326 1
+37 1327 1
+37 1328 1
+37 1329 1
+37 1330 1
+37 1331 1
+37 1332 1
+37 1333 1
+37 1334 1
+37 1335 1
+37 1346 1
+37 1347 1
+37 1348 1
+37 1349 1
+37 1350 1
+37 1351 1
+37 1352 1
+37 1353 1
+37 1354 1
+37 1355 1
+37 1366 1
+37 1367 1
+37 1368 1
+37 1369 1
+37 1370 1
+37 1371 1
+37 1372 1
+37 1373 1
+37 1374 1
+37 1375 1
+37 1507 1
+37 1508 1
+37 1509 1
+37 1510 1
+37 1511 1
+37 1522 1
+37 1523 1
+37 1524 1
+37 1525 1
+37 1526 1
+37 1527 1
+37 1528 1
+37 1529 1
+37 1530 1
+37 1531 1
+37 1542 1
+37 1543 1
+37 1544 1
+37 1545 1
+37 1546 1
+37 1547 1
+37 1548 1
+37 1549 1
+37 1550 1
+37 1551 1
+37 1562 1
+37 1563 1
+37 1564 1
+37 1565 1
+37 1566 1
+37 1567 1
+37 1568 1
+37 1569 1
+37 1570 1
+37 1571 1
+37 1577 1
+37 1578 1
+37 1579 1
+37 1580 1
+37 1581 1
+37 1582 1
+37 1583 1
+37 1584 1
+37 1585 1
+37 1586 1
+37 1597 1
+37 1598 1
+37 1599 1
+37 1600 1
+37 1601 1
+37 1602 1
+37 1603 1
+37 1604 1
+37 1605 1
+37 1606 1
+37 1612 1
+37 1613 1
+37 1614 1
+37 1615 1
+37 1616 1
+37 1617 1
+37 1618 1
+37 1619 1
+37 1620 1
+37 1621 1
+37 1627 1
+37 1628 1
+37 1629 1
+37 1630 1
+37 1631 1
+38 4 1
+38 11 1
+38 17 1
+38 22 1
+38 27 1
+38 28 1
+38 29 1
+38 30 1
+38 123 1
+38 129 1
+38 134 1
+38 139 1
+38 140 1
+38 141 1
+38 142 1
+38 150 1
+38 155 1
+38 160 1
+38 161 1
+38 162 1
+38 163 1
+38 170 1
+38 175 1
+38 176 1
+38 177 1
+38 178 1
+38 185 1
+38 186 1
+38 187 1
+38 188 1
+38 195 1
+38 196 1
+38 197 1
+38 198 1
+38 199 1
+38 200 1
+38 333 1
+38 339 1
+38 344 1
+38 349 1
+38 350 1
+38 351 1
+38 352 1
+38 360 1
+38 365 1
+38 370 1
+38 371 1
+38 372 1
+38 373 1
+38 380 1
+38 385 1
+38 386 1
+38 387 1
+38 388 1
+38 395 1
+38 396 1
+38 397 1
+38 398 1
+38 405 1
+38 406 1
+38 407 1
+38 408 1
+38 409 1
+38 410 1
+38 542 1
+38 547 1
+38 552 1
+38 553 1
+38 554 1
+38 555 1
+38 562 1
+38 567 1
+38 568 1
+38 569 1
+38 570 1
+38 577 1
+38 578 1
+38 579 1
+38 580 1
+38 587 1
+38 588 1
+38 589 1
+38 590 1
+38 591 1
+38 592 1
+38 597 1
+38 602 1
+38 603 1
+38 604 1
+38 605 1
+38 612 1
+38 613 1
+38 614 1
+38 615 1
+38 622 1
+38 623 1
+38 624 1
+38 625 1
+38 626 1
+38 627 1
+38 632 1
+38 633 1
+38 634 1
+38 635 1
+38 642 1
+38 643 1
+38 644 1
+38 645 1
+38 646 1
+38 647 1
+38 652 1
+38 653 1
+38 654 1
+38 655 1
+38 656 1
+38 657 1
+38 662 1
+38 663 1
+38 664 1
+38 665 1
+38 795 1
+38 801 1
+38 806 1
+38 811 1
+38 812 1
+38 813 1
+38 814 1
+38 822 1
+38 827 1
+38 832 1
+38 833 1
+38 834 1
+38 835 1
+38 842 1
+38 847 1
+38 848 1
+38 849 1
+38 850 1
+38 857 1
+38 858 1
+38 859 1
+38 860 1
+38 867 1
+38 868 1
+38 869 1
+38 870 1
+38 871 1
+38 872 1
+38 1004 1
+38 1009 1
+38 1014 1
+38 1015 1
+38 1016 1
+38 1017 1
+38 1024 1
+38 1029 1
+38 1030 1
+38 1031 1
+38 1032 1
+38 1039 1
+38 1040 1
+38 1041 1
+38 1042 1
+38 1049 1
+38 1050 1
+38 1051 1
+38 1052 1
+38 1053 1
+38 1054 1
+38 1059 1
+38 1064 1
+38 1065 1
+38 1066 1
+38 1067 1
+38 1074 1
+38 1075 1
+38 1076 1
+38 1077 1
+38 1084 1
+38 1085 1
+38 1086 1
+38 1087 1
+38 1088 1
+38 1089 1
+38 1094 1
+38 1095 1
+38 1096 1
+38 1097 1
+38 1104 1
+38 1105 1
+38 1106 1
+38 1107 1
+38 1108 1
+38 1109 1
+38 1114 1
+38 1115 1
+38 1116 1
+38 1117 1
+38 1118 1
+38 1119 1
+38 1124 1
+38 1125 1
+38 1126 1
+38 1127 1
+38 1256 1
+38 1261 1
+38 1266 1
+38 1267 1
+38 1268 1
+38 1269 1
+38 1276 1
+38 1281 1
+38 1282 1
+38 1283 1
+38 1284 1
+38 1291 1
+38 1292 1
+38 1293 1
+38 1294 1
+38 1301 1
+38 1302 1
+38 1303 1
+38 1304 1
+38 1305 1
+38 1306 1
+38 1311 1
+38 1316 1
+38 1317 1
+38 1318 1
+38 1319 1
+38 1326 1
+38 1327 1
+38 1328 1
+38 1329 1
+38 1336 1
+38 1337 1
+38 1338 1
+38 1339 1
+38 1340 1
+38 1341 1
+38 1346 1
+38 1347 1
+38 1348 1
+38 1349 1
+38 1356 1
+38 1357 1
+38 1358 1
+38 1359 1
+38 1360 1
+38 1361 1
+38 1366 1
+38 1367 1
+38 1368 1
+38 1369 1
+38 1370 1
+38 1371 1
+38 1376 1
+38 1377 1
+38 1378 1
+38 1379 1
+38 1507 1
+38 1512 1
+38 1513 1
+38 1514 1
+38 1515 1
+38 1522 1
+38 1523 1
+38 1524 1
+38 1525 1
+38 1532 1
+38 1533 1
+38 1534 1
+38 1535 1
+38 1536 1
+38 1537 1
+38 1542 1
+38 1543 1
+38 1544 1
+38 1545 1
+38 1552 1
+38 1553 1
+38 1554 1
+38 1555 1
+38 1556 1
+38 1557 1
+38 1562 1
+38 1563 1
+38 1564 1
+38 1565 1
+38 1566 1
+38 1567 1
+38 1572 1
+38 1573 1
+38 1574 1
+38 1575 1
+38 1577 1
+38 1578 1
+38 1579 1
+38 1580 1
+38 1587 1
+38 1588 1
+38 1589 1
+38 1590 1
+38 1591 1
+38 1592 1
+38 1597 1
+38 1598 1
+38 1599 1
+38 1600 1
+38 1601 1
+38 1602 1
+38 1607 1
+38 1608 1
+38 1609 1
+38 1610 1
+38 1612 1
+38 1613 1
+38 1614 1
+38 1615 1
+38 1616 1
+38 1617 1
+38 1622 1
+38 1623 1
+38 1624 1
+38 1625 1
+38 1627 1
+38 1628 1
+38 1629 1
+38 1630 1
+38 1632 1
+39 5 1
+39 12 1
+39 18 1
+39 23 1
+39 27 1
+39 31 1
+39 32 1
+39 33 1
+39 124 1
+39 130 1
+39 135 1
+39 139 1
+39 143 1
+39 144 1
+39 145 1
+39 151 1
+39 156 1
+39 160 1
+39 164 1
+39 165 1
+39 166 1
+39 171 1
+39 175 1
+39 179 1
+39 180 1
+39 181 1
+39 185 1
+39 189 1
+39 190 1
+39 191 1
+39 195 1
+39 196 1
+39 197 1
+39 201 1
+39 202 1
+39 203 1
+39 334 1
+39 340 1
+39 345 1
+39 349 1
+39 353 1
+39 354 1
+39 355 1
+39 361 1
+39 366 1
+39 370 1
+39 374 1
+39 375 1
+39 376 1
+39 381 1
+39 385 1
+39 389 1
+39 390 1
+39 391 1
+39 395 1
+39 399 1
+39 400 1
+39 401 1
+39 405 1
+39 406 1
+39 407 1
+39 411 1
+39 412 1
+39 413 1
+39 543 1
+39 548 1
+39 552 1
+39 556 1
+39 557 1
+39 558 1
+39 563 1
+39 567 1
+39 571 1
+39 572 1
+39 573 1
+39 577 1
+39 581 1
+39 582 1
+39 583 1
+39 587 1
+39 588 1
+39 589 1
+39 593 1
+39 594 1
+39 595 1
+39 598 1
+39 602 1
+39 606 1
+39 607 1
+39 608 1
+39 612 1
+39 616 1
+39 617 1
+39 618 1
+39 622 1
+39 623 1
+39 624 1
+39 628 1
+39 629 1
+39 630 1
+39 632 1
+39 636 1
+39 637 1
+39 638 1
+39 642 1
+39 643 1
+39 644 1
+39 648 1
+39 649 1
+39 650 1
+39 652 1
+39 653 1
+39 654 1
+39 658 1
+39 659 1
+39 660 1
+39 662 1
+39 663 1
+39 664 1
+39 666 1
+39 796 1
+39 802 1
+39 807 1
+39 811 1
+39 815 1
+39 816 1
+39 817 1
+39 823 1
+39 828 1
+39 832 1
+39 836 1
+39 837 1
+39 838 1
+39 843 1
+39 847 1
+39 851 1
+39 852 1
+39 853 1
+39 857 1
+39 861 1
+39 862 1
+39 863 1
+39 867 1
+39 868 1
+39 869 1
+39 873 1
+39 874 1
+39 875 1
+39 1005 1
+39 1010 1
+39 1014 1
+39 1018 1
+39 1019 1
+39 1020 1
+39 1025 1
+39 1029 1
+39 1033 1
+39 1034 1
+39 1035 1
+39 1039 1
+39 1043 1
+39 1044 1
+39 1045 1
+39 1049 1
+39 1050 1
+39 1051 1
+39 1055 1
+39 1056 1
+39 1057 1
+39 1060 1
+39 1064 1
+39 1068 1
+39 1069 1
+39 1070 1
+39 1074 1
+39 1078 1
+39 1079 1
+39 1080 1
+39 1084 1
+39 1085 1
+39 1086 1
+39 1090 1
+39 1091 1
+39 1092 1
+39 1094 1
+39 1098 1
+39 1099 1
+39 1100 1
+39 1104 1
+39 1105 1
+39 1106 1
+39 1110 1
+39 1111 1
+39 1112 1
+39 1114 1
+39 1115 1
+39 1116 1
+39 1120 1
+39 1121 1
+39 1122 1
+39 1124 1
+39 1125 1
+39 1126 1
+39 1128 1
+39 1257 1
+39 1262 1
+39 1266 1
+39 1270 1
+39 1271 1
+39 1272 1
+39 1277 1
+39 1281 1
+39 1285 1
+39 1286 1
+39 1287 1
+39 1291 1
+39 1295 1
+39 1296 1
+39 1297 1
+39 1301 1
+39 1302 1
+39 1303 1
+39 1307 1
+39 1308 1
+39 1309 1
+39 1312 1
+39 1316 1
+39 1320 1
+39 1321 1
+39 1322 1
+39 1326 1
+39 1330 1
+39 1331 1
+39 1332 1
+39 1336 1
+39 1337 1
+39 1338 1
+39 1342 1
+39 1343 1
+39 1344 1
+39 1346 1
+39 1350 1
+39 1351 1
+39 1352 1
+39 1356 1
+39 1357 1
+39 1358 1
+39 1362 1
+39 1363 1
+39 1364 1
+39 1366 1
+39 1367 1
+39 1368 1
+39 1372 1
+39 1373 1
+39 1374 1
+39 1376 1
+39 1377 1
+39 1378 1
+39 1380 1
+39 1508 1
+39 1512 1
+39 1516 1
+39 1517 1
+39 1518 1
+39 1522 1
+39 1526 1
+39 1527 1
+39 1528 1
+39 1532 1
+39 1533 1
+39 1534 1
+39 1538 1
+39 1539 1
+39 1540 1
+39 1542 1
+39 1546 1
+39 1547 1
+39 1548 1
+39 1552 1
+39 1553 1
+39 1554 1
+39 1558 1
+39 1559 1
+39 1560 1
+39 1562 1
+39 1563 1
+39 1564 1
+39 1568 1
+39 1569 1
+39 1570 1
+39 1572 1
+39 1573 1
+39 1574 1
+39 1576 1
+39 1577 1
+39 1581 1
+39 1582 1
+39 1583 1
+39 1587 1
+39 1588 1
+39 1589 1
+39 1593 1
+39 1594 1
+39 1595 1
+39 1597 1
+39 1598 1
+39 1599 1
+39 1603 1
+39 1604 1
+39 1605 1
+39 1607 1
+39 1608 1
+39 1609 1
+39 1611 1
+39 1612 1
+39 1613 1
+39 1614 1
+39 1618 1
+39 1619 1
+39 1620 1
+39 1622 1
+39 1623 1
+39 1624 1
+39 1626 1
+39 1627 1
+39 1628 1
+39 1629 1
+39 1631 1
+39 1632 1
+40 6 1
+40 13 1
+40 19 1
+40 24 1
+40 28 1
+40 31 1
+40 34 1
+40 35 1
+40 125 1
+40 131 1
+40 136 1
+40 140 1
+40 143 1
+40 146 1
+40 147 1
+40 152 1
+40 157 1
+40 161 1
+40 164 1
+40 167 1
+40 168 1
+40 172 1
+40 176 1
+40 179 1
+40 182 1
+40 183 1
+40 186 1
+40 189 1
+40 192 1
+40 193 1
+40 195 1
+40 198 1
+40 199 1
+40 201 1
+40 202 1
+40 204 1
+40 335 1
+40 341 1
+40 346 1
+40 350 1
+40 353 1
+40 356 1
+40 357 1
+40 362 1
+40 367 1
+40 371 1
+40 374 1
+40 377 1
+40 378 1
+40 382 1
+40 386 1
+40 389 1
+40 392 1
+40 393 1
+40 396 1
+40 399 1
+40 402 1
+40 403 1
+40 405 1
+40 408 1
+40 409 1
+40 411 1
+40 412 1
+40 414 1
+40 544 1
+40 549 1
+40 553 1
+40 556 1
+40 559 1
+40 560 1
+40 564 1
+40 568 1
+40 571 1
+40 574 1
+40 575 1
+40 578 1
+40 581 1
+40 584 1
+40 585 1
+40 587 1
+40 590 1
+40 591 1
+40 593 1
+40 594 1
+40 596 1
+40 599 1
+40 603 1
+40 606 1
+40 609 1
+40 610 1
+40 613 1
+40 616 1
+40 619 1
+40 620 1
+40 622 1
+40 625 1
+40 626 1
+40 628 1
+40 629 1
+40 631 1
+40 633 1
+40 636 1
+40 639 1
+40 640 1
+40 642 1
+40 645 1
+40 646 1
+40 648 1
+40 649 1
+40 651 1
+40 652 1
+40 655 1
+40 656 1
+40 658 1
+40 659 1
+40 661 1
+40 662 1
+40 663 1
+40 665 1
+40 666 1
+40 797 1
+40 803 1
+40 808 1
+40 812 1
+40 815 1
+40 818 1
+40 819 1
+40 824 1
+40 829 1
+40 833 1
+40 836 1
+40 839 1
+40 840 1
+40 844 1
+40 848 1
+40 851 1
+40 854 1
+40 855 1
+40 858 1
+40 861 1
+40 864 1
+40 865 1
+40 867 1
+40 870 1
+40 871 1
+40 873 1
+40 874 1
+40 876 1
+40 1006 1
+40 1011 1
+40 1015 1
+40 1018 1
+40 1021 1
+40 1022 1
+40 1026 1
+40 1030 1
+40 1033 1
+40 1036 1
+40 1037 1
+40 1040 1
+40 1043 1
+40 1046 1
+40 1047 1
+40 1049 1
+40 1052 1
+40 1053 1
+40 1055 1
+40 1056 1
+40 1058 1
+40 1061 1
+40 1065 1
+40 1068 1
+40 1071 1
+40 1072 1
+40 1075 1
+40 1078 1
+40 1081 1
+40 1082 1
+40 1084 1
+40 1087 1
+40 1088 1
+40 1090 1
+40 1091 1
+40 1093 1
+40 1095 1
+40 1098 1
+40 1101 1
+40 1102 1
+40 1104 1
+40 1107 1
+40 1108 1
+40 1110 1
+40 1111 1
+40 1113 1
+40 1114 1
+40 1117 1
+40 1118 1
+40 1120 1
+40 1121 1
+40 1123 1
+40 1124 1
+40 1125 1
+40 1127 1
+40 1128 1
+40 1258 1
+40 1263 1
+40 1267 1
+40 1270 1
+40 1273 1
+40 1274 1
+40 1278 1
+40 1282 1
+40 1285 1
+40 1288 1
+40 1289 1
+40 1292 1
+40 1295 1
+40 1298 1
+40 1299 1
+40 1301 1
+40 1304 1
+40 1305 1
+40 1307 1
+40 1308 1
+40 1310 1
+40 1313 1
+40 1317 1
+40 1320 1
+40 1323 1
+40 1324 1
+40 1327 1
+40 1330 1
+40 1333 1
+40 1334 1
+40 1336 1
+40 1339 1
+40 1340 1
+40 1342 1
+40 1343 1
+40 1345 1
+40 1347 1
+40 1350 1
+40 1353 1
+40 1354 1
+40 1356 1
+40 1359 1
+40 1360 1
+40 1362 1
+40 1363 1
+40 1365 1
+40 1366 1
+40 1369 1
+40 1370 1
+40 1372 1
+40 1373 1
+40 1375 1
+40 1376 1
+40 1377 1
+40 1379 1
+40 1380 1
+40 1509 1
+40 1513 1
+40 1516 1
+40 1519 1
+40 1520 1
+40 1523 1
+40 1526 1
+40 1529 1
+40 1530 1
+40 1532 1
+40 1535 1
+40 1536 1
+40 1538 1
+40 1539 1
+40 1541 1
+40 1543 1
+40 1546 1
+40 1549 1
+40 1550 1
+40 1552 1
+40 1555 1
+40 1556 1
+40 1558 1
+40 1559 1
+40 1561 1
+40 1562 1
+40 1565 1
+40 1566 1
+40 1568 1
+40 1569 1
+40 1571 1
+40 1572 1
+40 1573 1
+40 1575 1
+40 1576 1
+40 1578 1
+40 1581 1
+40 1584 1
+40 1585 1
+40 1587 1
+40 1590 1
+40 1591 1
+40 1593 1
+40 1594 1
+40 1596 1
+40 1597 1
+40 1600 1
+40 1601 1
+40 1603 1
+40 1604 1
+40 1606 1
+40 1607 1
+40 1608 1
+40 1610 1
+40 1611 1
+40 1612 1
+40 1615 1
+40 1616 1
+40 1618 1
+40 1619 1
+40 1621 1
+40 1622 1
+40 1623 1
+40 1625 1
+40 1626 1
+40 1627 1
+40 1628 1
+40 1630 1
+40 1631 1
+40 1632 1
+41 7 1
+41 14 1
+41 20 1
+41 25 1
+41 29 1
+41 32 1
+41 34 1
+41 36 1
+41 126 1
+41 132 1
+41 137 1
+41 141 1
+41 144 1
+41 146 1
+41 148 1
+41 153 1
+41 158 1
+41 162 1
+41 165 1
+41 167 1
+41 169 1
+41 173 1
+41 177 1
+41 180 1
+41 182 1
+41 184 1
+41 187 1
+41 190 1
+41 192 1
+41 194 1
+41 196 1
+41 198 1
+41 200 1
+41 201 1
+41 203 1
+41 204 1
+41 336 1
+41 342 1
+41 347 1
+41 351 1
+41 354 1
+41 356 1
+41 358 1
+41 363 1
+41 368 1
+41 372 1
+41 375 1
+41 377 1
+41 379 1
+41 383 1
+41 387 1
+41 390 1
+41 392 1
+41 394 1
+41 397 1
+41 400 1
+41 402 1
+41 404 1
+41 406 1
+41 408 1
+41 410 1
+41 411 1
+41 413 1
+41 414 1
+41 545 1
+41 550 1
+41 554 1
+41 557 1
+41 559 1
+41 561 1
+41 565 1
+41 569 1
+41 572 1
+41 574 1
+41 576 1
+41 579 1
+41 582 1
+41 584 1
+41 586 1
+41 588 1
+41 590 1
+41 592 1
+41 593 1
+41 595 1
+41 596 1
+41 600 1
+41 604 1
+41 607 1
+41 609 1
+41 611 1
+41 614 1
+41 617 1
+41 619 1
+41 621 1
+41 623 1
+41 625 1
+41 627 1
+41 628 1
+41 630 1
+41 631 1
+41 634 1
+41 637 1
+41 639 1
+41 641 1
+41 643 1
+41 645 1
+41 647 1
+41 648 1
+41 650 1
+41 651 1
+41 653 1
+41 655 1
+41 657 1
+41 658 1
+41 660 1
+41 661 1
+41 662 1
+41 664 1
+41 665 1
+41 666 1
+41 798 1
+41 804 1
+41 809 1
+41 813 1
+41 816 1
+41 818 1
+41 820 1
+41 825 1
+41 830 1
+41 834 1
+41 837 1
+41 839 1
+41 841 1
+41 845 1
+41 849 1
+41 852 1
+41 854 1
+41 856 1
+41 859 1
+41 862 1
+41 864 1
+41 866 1
+41 868 1
+41 870 1
+41 872 1
+41 873 1
+41 875 1
+41 876 1
+41 1007 1
+41 1012 1
+41 1016 1
+41 1019 1
+41 1021 1
+41 1023 1
+41 1027 1
+41 1031 1
+41 1034 1
+41 1036 1
+41 1038 1
+41 1041 1
+41 1044 1
+41 1046 1
+41 1048 1
+41 1050 1
+41 1052 1
+41 1054 1
+41 1055 1
+41 1057 1
+41 1058 1
+41 1062 1
+41 1066 1
+41 1069 1
+41 1071 1
+41 1073 1
+41 1076 1
+41 1079 1
+41 1081 1
+41 1083 1
+41 1085 1
+41 1087 1
+41 1089 1
+41 1090 1
+41 1092 1
+41 1093 1
+41 1096 1
+41 1099 1
+41 1101 1
+41 1103 1
+41 1105 1
+41 1107 1
+41 1109 1
+41 1110 1
+41 1112 1
+41 1113 1
+41 1115 1
+41 1117 1
+41 1119 1
+41 1120 1
+41 1122 1
+41 1123 1
+41 1124 1
+41 1126 1
+41 1127 1
+41 1128 1
+41 1259 1
+41 1264 1
+41 1268 1
+41 1271 1
+41 1273 1
+41 1275 1
+41 1279 1
+41 1283 1
+41 1286 1
+41 1288 1
+41 1290 1
+41 1293 1
+41 1296 1
+41 1298 1
+41 1300 1
+41 1302 1
+41 1304 1
+41 1306 1
+41 1307 1
+41 1309 1
+41 1310 1
+41 1314 1
+41 1318 1
+41 1321 1
+41 1323 1
+41 1325 1
+41 1328 1
+41 1331 1
+41 1333 1
+41 1335 1
+41 1337 1
+41 1339 1
+41 1341 1
+41 1342 1
+41 1344 1
+41 1345 1
+41 1348 1
+41 1351 1
+41 1353 1
+41 1355 1
+41 1357 1
+41 1359 1
+41 1361 1
+41 1362 1
+41 1364 1
+41 1365 1
+41 1367 1
+41 1369 1
+41 1371 1
+41 1372 1
+41 1374 1
+41 1375 1
+41 1376 1
+41 1378 1
+41 1379 1
+41 1380 1
+41 1510 1
+41 1514 1
+41 1517 1
+41 1519 1
+41 1521 1
+41 1524 1
+41 1527 1
+41 1529 1
+41 1531 1
+41 1533 1
+41 1535 1
+41 1537 1
+41 1538 1
+41 1540 1
+41 1541 1
+41 1544 1
+41 1547 1
+41 1549 1
+41 1551 1
+41 1553 1
+41 1555 1
+41 1557 1
+41 1558 1
+41 1560 1
+41 1561 1
+41 1563 1
+41 1565 1
+41 1567 1
+41 1568 1
+41 1570 1
+41 1571 1
+41 1572 1
+41 1574 1
+41 1575 1
+41 1576 1
+41 1579 1
+41 1582 1
+41 1584 1
+41 1586 1
+41 1588 1
+41 1590 1
+41 1592 1
+41 1593 1
+41 1595 1
+41 1596 1
+41 1598 1
+41 1600 1
+41 1602 1
+41 1603 1
+41 1605 1
+41 1606 1
+41 1607 1
+41 1609 1
+41 1610 1
+41 1611 1
+41 1613 1
+41 1615 1
+41 1617 1
+41 1618 1
+41 1620 1
+41 1621 1
+41 1622 1
+41 1624 1
+41 1625 1
+41 1626 1
+41 1627 1
+41 1629 1
+41 1630 1
+41 1631 1
+41 1632 1
+42 8 1
+42 15 1
+42 21 1
+42 26 1
+42 30 1
+42 33 1
+42 35 1
+42 36 1
+42 127 1
+42 133 1
+42 138 1
+42 142 1
+42 145 1
+42 147 1
+42 148 1
+42 154 1
+42 159 1
+42 163 1
+42 166 1
+42 168 1
+42 169 1
+42 174 1
+42 178 1
+42 181 1
+42 183 1
+42 184 1
+42 188 1
+42 191 1
+42 193 1
+42 194 1
+42 197 1
+42 199 1
+42 200 1
+42 202 1
+42 203 1
+42 204 1
+42 337 1
+42 343 1
+42 348 1
+42 352 1
+42 355 1
+42 357 1
+42 358 1
+42 364 1
+42 369 1
+42 373 1
+42 376 1
+42 378 1
+42 379 1
+42 384 1
+42 388 1
+42 391 1
+42 393 1
+42 394 1
+42 398 1
+42 401 1
+42 403 1
+42 404 1
+42 407 1
+42 409 1
+42 410 1
+42 412 1
+42 413 1
+42 414 1
+42 546 1
+42 551 1
+42 555 1
+42 558 1
+42 560 1
+42 561 1
+42 566 1
+42 570 1
+42 573 1
+42 575 1
+42 576 1
+42 580 1
+42 583 1
+42 585 1
+42 586 1
+42 589 1
+42 591 1
+42 592 1
+42 594 1
+42 595 1
+42 596 1
+42 601 1
+42 605 1
+42 608 1
+42 610 1
+42 611 1
+42 615 1
+42 618 1
+42 620 1
+42 621 1
+42 624 1
+42 626 1
+42 627 1
+42 629 1
+42 630 1
+42 631 1
+42 635 1
+42 638 1
+42 640 1
+42 641 1
+42 644 1
+42 646 1
+42 647 1
+42 649 1
+42 650 1
+42 651 1
+42 654 1
+42 656 1
+42 657 1
+42 659 1
+42 660 1
+42 661 1
+42 663 1
+42 664 1
+42 665 1
+42 666 1
+42 799 1
+42 805 1
+42 810 1
+42 814 1
+42 817 1
+42 819 1
+42 820 1
+42 826 1
+42 831 1
+42 835 1
+42 838 1
+42 840 1
+42 841 1
+42 846 1
+42 850 1
+42 853 1
+42 855 1
+42 856 1
+42 860 1
+42 863 1
+42 865 1
+42 866 1
+42 869 1
+42 871 1
+42 872 1
+42 874 1
+42 875 1
+42 876 1
+42 1008 1
+42 1013 1
+42 1017 1
+42 1020 1
+42 1022 1
+42 1023 1
+42 1028 1
+42 1032 1
+42 1035 1
+42 1037 1
+42 1038 1
+42 1042 1
+42 1045 1
+42 1047 1
+42 1048 1
+42 1051 1
+42 1053 1
+42 1054 1
+42 1056 1
+42 1057 1
+42 1058 1
+42 1063 1
+42 1067 1
+42 1070 1
+42 1072 1
+42 1073 1
+42 1077 1
+42 1080 1
+42 1082 1
+42 1083 1
+42 1086 1
+42 1088 1
+42 1089 1
+42 1091 1
+42 1092 1
+42 1093 1
+42 1097 1
+42 1100 1
+42 1102 1
+42 1103 1
+42 1106 1
+42 1108 1
+42 1109 1
+42 1111 1
+42 1112 1
+42 1113 1
+42 1116 1
+42 1118 1
+42 1119 1
+42 1121 1
+42 1122 1
+42 1123 1
+42 1125 1
+42 1126 1
+42 1127 1
+42 1128 1
+42 1260 1
+42 1265 1
+42 1269 1
+42 1272 1
+42 1274 1
+42 1275 1
+42 1280 1
+42 1284 1
+42 1287 1
+42 1289 1
+42 1290 1
+42 1294 1
+42 1297 1
+42 1299 1
+42 1300 1
+42 1303 1
+42 1305 1
+42 1306 1
+42 1308 1
+42 1309 1
+42 1310 1
+42 1315 1
+42 1319 1
+42 1322 1
+42 1324 1
+42 1325 1
+42 1329 1
+42 1332 1
+42 1334 1
+42 1335 1
+42 1338 1
+42 1340 1
+42 1341 1
+42 1343 1
+42 1344 1
+42 1345 1
+42 1349 1
+42 1352 1
+42 1354 1
+42 1355 1
+42 1358 1
+42 1360 1
+42 1361 1
+42 1363 1
+42 1364 1
+42 1365 1
+42 1368 1
+42 1370 1
+42 1371 1
+42 1373 1
+42 1374 1
+42 1375 1
+42 1377 1
+42 1378 1
+42 1379 1
+42 1380 1
+42 1511 1
+42 1515 1
+42 1518 1
+42 1520 1
+42 1521 1
+42 1525 1
+42 1528 1
+42 1530 1
+42 1531 1
+42 1534 1
+42 1536 1
+42 1537 1
+42 1539 1
+42 1540 1
+42 1541 1
+42 1545 1
+42 1548 1
+42 1550 1
+42 1551 1
+42 1554 1
+42 1556 1
+42 1557 1
+42 1559 1
+42 1560 1
+42 1561 1
+42 1564 1
+42 1566 1
+42 1567 1
+42 1569 1
+42 1570 1
+42 1571 1
+42 1573 1
+42 1574 1
+42 1575 1
+42 1576 1
+42 1580 1
+42 1583 1
+42 1585 1
+42 1586 1
+42 1589 1
+42 1591 1
+42 1592 1
+42 1594 1
+42 1595 1
+42 1596 1
+42 1599 1
+42 1601 1
+42 1602 1
+42 1604 1
+42 1605 1
+42 1606 1
+42 1608 1
+42 1609 1
+42 1610 1
+42 1611 1
+42 1614 1
+42 1616 1
+42 1617 1
+42 1619 1
+42 1620 1
+42 1621 1
+42 1623 1
+42 1624 1
+42 1625 1
+42 1626 1
+42 1628 1
+42 1629 1
+42 1630 1
+42 1631 1
+42 1632 1
+43 1 1
+43 37 1
+43 38 1
+43 39 1
+43 40 1
+43 41 1
+43 42 1
+43 43 1
+43 121 1
+43 122 1
+43 123 1
+43 124 1
+43 125 1
+43 126 1
+43 127 1
+43 205 1
+43 206 1
+43 207 1
+43 208 1
+43 209 1
+43 210 1
+43 211 1
+43 212 1
+43 213 1
+43 214 1
+43 215 1
+43 216 1
+43 217 1
+43 218 1
+43 219 1
+43 220 1
+43 221 1
+43 222 1
+43 223 1
+43 224 1
+43 225 1
+43 331 1
+43 332 1
+43 333 1
+43 334 1
+43 335 1
+43 336 1
+43 337 1
+43 415 1
+43 416 1
+43 417 1
+43 418 1
+43 419 1
+43 420 1
+43 421 1
+43 422 1
+43 423 1
+43 424 1
+43 425 1
+43 426 1
+43 427 1
+43 428 1
+43 429 1
+43 430 1
+43 431 1
+43 432 1
+43 433 1
+43 434 1
+43 435 1
+43 541 1
+43 542 1
+43 543 1
+43 544 1
+43 545 1
+43 546 1
+43 547 1
+43 548 1
+43 549 1
+43 550 1
+43 551 1
+43 552 1
+43 553 1
+43 554 1
+43 555 1
+43 556 1
+43 557 1
+43 558 1
+43 559 1
+43 560 1
+43 561 1
+43 667 1
+43 668 1
+43 669 1
+43 670 1
+43 671 1
+43 672 1
+43 673 1
+43 674 1
+43 675 1
+43 676 1
+43 677 1
+43 678 1
+43 679 1
+43 680 1
+43 681 1
+43 682 1
+43 683 1
+43 684 1
+43 685 1
+43 686 1
+43 687 1
+43 688 1
+43 689 1
+43 690 1
+43 691 1
+43 692 1
+43 693 1
+43 694 1
+43 695 1
+43 696 1
+43 697 1
+43 698 1
+43 699 1
+43 700 1
+43 701 1
+43 793 1
+43 794 1
+43 795 1
+43 796 1
+43 797 1
+43 798 1
+43 799 1
+43 877 1
+43 878 1
+43 879 1
+43 880 1
+43 881 1
+43 882 1
+43 883 1
+43 884 1
+43 885 1
+43 886 1
+43 887 1
+43 888 1
+43 889 1
+43 890 1
+43 891 1
+43 892 1
+43 893 1
+43 894 1
+43 895 1
+43 896 1
+43 897 1
+43 1003 1
+43 1004 1
+43 1005 1
+43 1006 1
+43 1007 1
+43 1008 1
+43 1009 1
+43 1010 1
+43 1011 1
+43 1012 1
+43 1013 1
+43 1014 1
+43 1015 1
+43 1016 1
+43 1017 1
+43 1018 1
+43 1019 1
+43 1020 1
+43 1021 1
+43 1022 1
+43 1023 1
+43 1129 1
+43 1130 1
+43 1131 1
+43 1132 1
+43 1133 1
+43 1134 1
+43 1135 1
+43 1136 1
+43 1137 1
+43 1138 1
+43 1139 1
+43 1140 1
+43 1141 1
+43 1142 1
+43 1143 1
+43 1144 1
+43 1145 1
+43 1146 1
+43 1147 1
+43 1148 1
+43 1149 1
+43 1150 1
+43 1151 1
+43 1152 1
+43 1153 1
+43 1154 1
+43 1155 1
+43 1156 1
+43 1157 1
+43 1158 1
+43 1159 1
+43 1160 1
+43 1161 1
+43 1162 1
+43 1163 1
+43 1255 1
+43 1256 1
+43 1257 1
+43 1258 1
+43 1259 1
+43 1260 1
+43 1261 1
+43 1262 1
+43 1263 1
+43 1264 1
+43 1265 1
+43 1266 1
+43 1267 1
+43 1268 1
+43 1269 1
+43 1270 1
+43 1271 1
+43 1272 1
+43 1273 1
+43 1274 1
+43 1275 1
+43 1381 1
+43 1382 1
+43 1383 1
+43 1384 1
+43 1385 1
+43 1386 1
+43 1387 1
+43 1388 1
+43 1389 1
+43 1390 1
+43 1391 1
+43 1392 1
+43 1393 1
+43 1394 1
+43 1395 1
+43 1396 1
+43 1397 1
+43 1398 1
+43 1399 1
+43 1400 1
+43 1401 1
+43 1402 1
+43 1403 1
+43 1404 1
+43 1405 1
+43 1406 1
+43 1407 1
+43 1408 1
+43 1409 1
+43 1410 1
+43 1411 1
+43 1412 1
+43 1413 1
+43 1414 1
+43 1415 1
+43 1507 1
+43 1508 1
+43 1509 1
+43 1510 1
+43 1511 1
+43 1512 1
+43 1513 1
+43 1514 1
+43 1515 1
+43 1516 1
+43 1517 1
+43 1518 1
+43 1519 1
+43 1520 1
+43 1521 1
+43 1522 1
+43 1523 1
+43 1524 1
+43 1525 1
+43 1526 1
+43 1527 1
+43 1528 1
+43 1529 1
+43 1530 1
+43 1531 1
+43 1532 1
+43 1533 1
+43 1534 1
+43 1535 1
+43 1536 1
+43 1537 1
+43 1538 1
+43 1539 1
+43 1540 1
+43 1541 1
+43 1633 1
+43 1634 1
+43 1635 1
+43 1636 1
+43 1637 1
+43 1638 1
+43 1639 1
+43 1640 1
+43 1641 1
+43 1642 1
+43 1643 1
+43 1644 1
+43 1645 1
+43 1646 1
+43 1647 1
+43 1648 1
+43 1649 1
+43 1650 1
+43 1651 1
+43 1652 1
+43 1653 1
+43 1654 1
+43 1655 1
+43 1656 1
+43 1657 1
+43 1658 1
+43 1659 1
+43 1660 1
+43 1661 1
+43 1662 1
+43 1663 1
+43 1664 1
+43 1665 1
+43 1666 1
+43 1667 1
+44 2 1
+44 37 1
+44 44 1
+44 45 1
+44 46 1
+44 47 1
+44 48 1
+44 49 1
+44 121 1
+44 128 1
+44 129 1
+44 130 1
+44 131 1
+44 132 1
+44 133 1
+44 205 1
+44 206 1
+44 207 1
+44 208 1
+44 209 1
+44 210 1
+44 226 1
+44 227 1
+44 228 1
+44 229 1
+44 230 1
+44 231 1
+44 232 1
+44 233 1
+44 234 1
+44 235 1
+44 236 1
+44 237 1
+44 238 1
+44 239 1
+44 240 1
+44 331 1
+44 338 1
+44 339 1
+44 340 1
+44 341 1
+44 342 1
+44 343 1
+44 415 1
+44 416 1
+44 417 1
+44 418 1
+44 419 1
+44 420 1
+44 436 1
+44 437 1
+44 438 1
+44 439 1
+44 440 1
+44 441 1
+44 442 1
+44 443 1
+44 444 1
+44 445 1
+44 446 1
+44 447 1
+44 448 1
+44 449 1
+44 450 1
+44 541 1
+44 542 1
+44 543 1
+44 544 1
+44 545 1
+44 546 1
+44 562 1
+44 563 1
+44 564 1
+44 565 1
+44 566 1
+44 567 1
+44 568 1
+44 569 1
+44 570 1
+44 571 1
+44 572 1
+44 573 1
+44 574 1
+44 575 1
+44 576 1
+44 667 1
+44 668 1
+44 669 1
+44 670 1
+44 671 1
+44 672 1
+44 673 1
+44 674 1
+44 675 1
+44 676 1
+44 677 1
+44 678 1
+44 679 1
+44 680 1
+44 681 1
+44 702 1
+44 703 1
+44 704 1
+44 705 1
+44 706 1
+44 707 1
+44 708 1
+44 709 1
+44 710 1
+44 711 1
+44 712 1
+44 713 1
+44 714 1
+44 715 1
+44 716 1
+44 717 1
+44 718 1
+44 719 1
+44 720 1
+44 721 1
+44 793 1
+44 800 1
+44 801 1
+44 802 1
+44 803 1
+44 804 1
+44 805 1
+44 877 1
+44 878 1
+44 879 1
+44 880 1
+44 881 1
+44 882 1
+44 898 1
+44 899 1
+44 900 1
+44 901 1
+44 902 1
+44 903 1
+44 904 1
+44 905 1
+44 906 1
+44 907 1
+44 908 1
+44 909 1
+44 910 1
+44 911 1
+44 912 1
+44 1003 1
+44 1004 1
+44 1005 1
+44 1006 1
+44 1007 1
+44 1008 1
+44 1024 1
+44 1025 1
+44 1026 1
+44 1027 1
+44 1028 1
+44 1029 1
+44 1030 1
+44 1031 1
+44 1032 1
+44 1033 1
+44 1034 1
+44 1035 1
+44 1036 1
+44 1037 1
+44 1038 1
+44 1129 1
+44 1130 1
+44 1131 1
+44 1132 1
+44 1133 1
+44 1134 1
+44 1135 1
+44 1136 1
+44 1137 1
+44 1138 1
+44 1139 1
+44 1140 1
+44 1141 1
+44 1142 1
+44 1143 1
+44 1164 1
+44 1165 1
+44 1166 1
+44 1167 1
+44 1168 1
+44 1169 1
+44 1170 1
+44 1171 1
+44 1172 1
+44 1173 1
+44 1174 1
+44 1175 1
+44 1176 1
+44 1177 1
+44 1178 1
+44 1179 1
+44 1180 1
+44 1181 1
+44 1182 1
+44 1183 1
+44 1255 1
+44 1256 1
+44 1257 1
+44 1258 1
+44 1259 1
+44 1260 1
+44 1276 1
+44 1277 1
+44 1278 1
+44 1279 1
+44 1280 1
+44 1281 1
+44 1282 1
+44 1283 1
+44 1284 1
+44 1285 1
+44 1286 1
+44 1287 1
+44 1288 1
+44 1289 1
+44 1290 1
+44 1381 1
+44 1382 1
+44 1383 1
+44 1384 1
+44 1385 1
+44 1386 1
+44 1387 1
+44 1388 1
+44 1389 1
+44 1390 1
+44 1391 1
+44 1392 1
+44 1393 1
+44 1394 1
+44 1395 1
+44 1416 1
+44 1417 1
+44 1418 1
+44 1419 1
+44 1420 1
+44 1421 1
+44 1422 1
+44 1423 1
+44 1424 1
+44 1425 1
+44 1426 1
+44 1427 1
+44 1428 1
+44 1429 1
+44 1430 1
+44 1431 1
+44 1432 1
+44 1433 1
+44 1434 1
+44 1435 1
+44 1507 1
+44 1508 1
+44 1509 1
+44 1510 1
+44 1511 1
+44 1512 1
+44 1513 1
+44 1514 1
+44 1515 1
+44 1516 1
+44 1517 1
+44 1518 1
+44 1519 1
+44 1520 1
+44 1521 1
+44 1542 1
+44 1543 1
+44 1544 1
+44 1545 1
+44 1546 1
+44 1547 1
+44 1548 1
+44 1549 1
+44 1550 1
+44 1551 1
+44 1552 1
+44 1553 1
+44 1554 1
+44 1555 1
+44 1556 1
+44 1557 1
+44 1558 1
+44 1559 1
+44 1560 1
+44 1561 1
+44 1633 1
+44 1634 1
+44 1635 1
+44 1636 1
+44 1637 1
+44 1638 1
+44 1639 1
+44 1640 1
+44 1641 1
+44 1642 1
+44 1643 1
+44 1644 1
+44 1645 1
+44 1646 1
+44 1647 1
+44 1648 1
+44 1649 1
+44 1650 1
+44 1651 1
+44 1652 1
+44 1668 1
+44 1669 1
+44 1670 1
+44 1671 1
+44 1672 1
+44 1673 1
+44 1674 1
+44 1675 1
+44 1676 1
+44 1677 1
+44 1678 1
+44 1679 1
+44 1680 1
+44 1681 1
+44 1682 1
+45 3 1
+45 38 1
+45 44 1
+45 50 1
+45 51 1
+45 52 1
+45 53 1
+45 54 1
+45 122 1
+45 128 1
+45 134 1
+45 135 1
+45 136 1
+45 137 1
+45 138 1
+45 205 1
+45 211 1
+45 212 1
+45 213 1
+45 214 1
+45 215 1
+45 226 1
+45 227 1
+45 228 1
+45 229 1
+45 230 1
+45 241 1
+45 242 1
+45 243 1
+45 244 1
+45 245 1
+45 246 1
+45 247 1
+45 248 1
+45 249 1
+45 250 1
+45 332 1
+45 338 1
+45 344 1
+45 345 1
+45 346 1
+45 347 1
+45 348 1
+45 415 1
+45 421 1
+45 422 1
+45 423 1
+45 424 1
+45 425 1
+45 436 1
+45 437 1
+45 438 1
+45 439 1
+45 440 1
+45 451 1
+45 452 1
+45 453 1
+45 454 1
+45 455 1
+45 456 1
+45 457 1
+45 458 1
+45 459 1
+45 460 1
+45 541 1
+45 547 1
+45 548 1
+45 549 1
+45 550 1
+45 551 1
+45 562 1
+45 563 1
+45 564 1
+45 565 1
+45 566 1
+45 577 1
+45 578 1
+45 579 1
+45 580 1
+45 581 1
+45 582 1
+45 583 1
+45 584 1
+45 585 1
+45 586 1
+45 667 1
+45 668 1
+45 669 1
+45 670 1
+45 671 1
+45 682 1
+45 683 1
+45 684 1
+45 685 1
+45 686 1
+45 687 1
+45 688 1
+45 689 1
+45 690 1
+45 691 1
+45 702 1
+45 703 1
+45 704 1
+45 705 1
+45 706 1
+45 707 1
+45 708 1
+45 709 1
+45 710 1
+45 711 1
+45 722 1
+45 723 1
+45 724 1
+45 725 1
+45 726 1
+45 727 1
+45 728 1
+45 729 1
+45 730 1
+45 731 1
+45 794 1
+45 800 1
+45 806 1
+45 807 1
+45 808 1
+45 809 1
+45 810 1
+45 877 1
+45 883 1
+45 884 1
+45 885 1
+45 886 1
+45 887 1
+45 898 1
+45 899 1
+45 900 1
+45 901 1
+45 902 1
+45 913 1
+45 914 1
+45 915 1
+45 916 1
+45 917 1
+45 918 1
+45 919 1
+45 920 1
+45 921 1
+45 922 1
+45 1003 1
+45 1009 1
+45 1010 1
+45 1011 1
+45 1012 1
+45 1013 1
+45 1024 1
+45 1025 1
+45 1026 1
+45 1027 1
+45 1028 1
+45 1039 1
+45 1040 1
+45 1041 1
+45 1042 1
+45 1043 1
+45 1044 1
+45 1045 1
+45 1046 1
+45 1047 1
+45 1048 1
+45 1129 1
+45 1130 1
+45 1131 1
+45 1132 1
+45 1133 1
+45 1144 1
+45 1145 1
+45 1146 1
+45 1147 1
+45 1148 1
+45 1149 1
+45 1150 1
+45 1151 1
+45 1152 1
+45 1153 1
+45 1164 1
+45 1165 1
+45 1166 1
+45 1167 1
+45 1168 1
+45 1169 1
+45 1170 1
+45 1171 1
+45 1172 1
+45 1173 1
+45 1184 1
+45 1185 1
+45 1186 1
+45 1187 1
+45 1188 1
+45 1189 1
+45 1190 1
+45 1191 1
+45 1192 1
+45 1193 1
+45 1255 1
+45 1261 1
+45 1262 1
+45 1263 1
+45 1264 1
+45 1265 1
+45 1276 1
+45 1277 1
+45 1278 1
+45 1279 1
+45 1280 1
+45 1291 1
+45 1292 1
+45 1293 1
+45 1294 1
+45 1295 1
+45 1296 1
+45 1297 1
+45 1298 1
+45 1299 1
+45 1300 1
+45 1381 1
+45 1382 1
+45 1383 1
+45 1384 1
+45 1385 1
+45 1396 1
+45 1397 1
+45 1398 1
+45 1399 1
+45 1400 1
+45 1401 1
+45 1402 1
+45 1403 1
+45 1404 1
+45 1405 1
+45 1416 1
+45 1417 1
+45 1418 1
+45 1419 1
+45 1420 1
+45 1421 1
+45 1422 1
+45 1423 1
+45 1424 1
+45 1425 1
+45 1436 1
+45 1437 1
+45 1438 1
+45 1439 1
+45 1440 1
+45 1441 1
+45 1442 1
+45 1443 1
+45 1444 1
+45 1445 1
+45 1507 1
+45 1508 1
+45 1509 1
+45 1510 1
+45 1511 1
+45 1522 1
+45 1523 1
+45 1524 1
+45 1525 1
+45 1526 1
+45 1527 1
+45 1528 1
+45 1529 1
+45 1530 1
+45 1531 1
+45 1542 1
+45 1543 1
+45 1544 1
+45 1545 1
+45 1546 1
+45 1547 1
+45 1548 1
+45 1549 1
+45 1550 1
+45 1551 1
+45 1562 1
+45 1563 1
+45 1564 1
+45 1565 1
+45 1566 1
+45 1567 1
+45 1568 1
+45 1569 1
+45 1570 1
+45 1571 1
+45 1633 1
+45 1634 1
+45 1635 1
+45 1636 1
+45 1637 1
+45 1638 1
+45 1639 1
+45 1640 1
+45 1641 1
+45 1642 1
+45 1653 1
+45 1654 1
+45 1655 1
+45 1656 1
+45 1657 1
+45 1658 1
+45 1659 1
+45 1660 1
+45 1661 1
+45 1662 1
+45 1668 1
+45 1669 1
+45 1670 1
+45 1671 1
+45 1672 1
+45 1673 1
+45 1674 1
+45 1675 1
+45 1676 1
+45 1677 1
+45 1683 1
+45 1684 1
+45 1685 1
+45 1686 1
+45 1687 1
+46 4 1
+46 39 1
+46 45 1
+46 50 1
+46 55 1
+46 56 1
+46 57 1
+46 58 1
+46 123 1
+46 129 1
+46 134 1
+46 139 1
+46 140 1
+46 141 1
+46 142 1
+46 206 1
+46 211 1
+46 216 1
+46 217 1
+46 218 1
+46 219 1
+46 226 1
+46 231 1
+46 232 1
+46 233 1
+46 234 1
+46 241 1
+46 242 1
+46 243 1
+46 244 1
+46 251 1
+46 252 1
+46 253 1
+46 254 1
+46 255 1
+46 256 1
+46 333 1
+46 339 1
+46 344 1
+46 349 1
+46 350 1
+46 351 1
+46 352 1
+46 416 1
+46 421 1
+46 426 1
+46 427 1
+46 428 1
+46 429 1
+46 436 1
+46 441 1
+46 442 1
+46 443 1
+46 444 1
+46 451 1
+46 452 1
+46 453 1
+46 454 1
+46 461 1
+46 462 1
+46 463 1
+46 464 1
+46 465 1
+46 466 1
+46 542 1
+46 547 1
+46 552 1
+46 553 1
+46 554 1
+46 555 1
+46 562 1
+46 567 1
+46 568 1
+46 569 1
+46 570 1
+46 577 1
+46 578 1
+46 579 1
+46 580 1
+46 587 1
+46 588 1
+46 589 1
+46 590 1
+46 591 1
+46 592 1
+46 667 1
+46 672 1
+46 673 1
+46 674 1
+46 675 1
+46 682 1
+46 683 1
+46 684 1
+46 685 1
+46 692 1
+46 693 1
+46 694 1
+46 695 1
+46 696 1
+46 697 1
+46 702 1
+46 703 1
+46 704 1
+46 705 1
+46 712 1
+46 713 1
+46 714 1
+46 715 1
+46 716 1
+46 717 1
+46 722 1
+46 723 1
+46 724 1
+46 725 1
+46 726 1
+46 727 1
+46 732 1
+46 733 1
+46 734 1
+46 735 1
+46 795 1
+46 801 1
+46 806 1
+46 811 1
+46 812 1
+46 813 1
+46 814 1
+46 878 1
+46 883 1
+46 888 1
+46 889 1
+46 890 1
+46 891 1
+46 898 1
+46 903 1
+46 904 1
+46 905 1
+46 906 1
+46 913 1
+46 914 1
+46 915 1
+46 916 1
+46 923 1
+46 924 1
+46 925 1
+46 926 1
+46 927 1
+46 928 1
+46 1004 1
+46 1009 1
+46 1014 1
+46 1015 1
+46 1016 1
+46 1017 1
+46 1024 1
+46 1029 1
+46 1030 1
+46 1031 1
+46 1032 1
+46 1039 1
+46 1040 1
+46 1041 1
+46 1042 1
+46 1049 1
+46 1050 1
+46 1051 1
+46 1052 1
+46 1053 1
+46 1054 1
+46 1129 1
+46 1134 1
+46 1135 1
+46 1136 1
+46 1137 1
+46 1144 1
+46 1145 1
+46 1146 1
+46 1147 1
+46 1154 1
+46 1155 1
+46 1156 1
+46 1157 1
+46 1158 1
+46 1159 1
+46 1164 1
+46 1165 1
+46 1166 1
+46 1167 1
+46 1174 1
+46 1175 1
+46 1176 1
+46 1177 1
+46 1178 1
+46 1179 1
+46 1184 1
+46 1185 1
+46 1186 1
+46 1187 1
+46 1188 1
+46 1189 1
+46 1194 1
+46 1195 1
+46 1196 1
+46 1197 1
+46 1256 1
+46 1261 1
+46 1266 1
+46 1267 1
+46 1268 1
+46 1269 1
+46 1276 1
+46 1281 1
+46 1282 1
+46 1283 1
+46 1284 1
+46 1291 1
+46 1292 1
+46 1293 1
+46 1294 1
+46 1301 1
+46 1302 1
+46 1303 1
+46 1304 1
+46 1305 1
+46 1306 1
+46 1381 1
+46 1386 1
+46 1387 1
+46 1388 1
+46 1389 1
+46 1396 1
+46 1397 1
+46 1398 1
+46 1399 1
+46 1406 1
+46 1407 1
+46 1408 1
+46 1409 1
+46 1410 1
+46 1411 1
+46 1416 1
+46 1417 1
+46 1418 1
+46 1419 1
+46 1426 1
+46 1427 1
+46 1428 1
+46 1429 1
+46 1430 1
+46 1431 1
+46 1436 1
+46 1437 1
+46 1438 1
+46 1439 1
+46 1440 1
+46 1441 1
+46 1446 1
+46 1447 1
+46 1448 1
+46 1449 1
+46 1507 1
+46 1512 1
+46 1513 1
+46 1514 1
+46 1515 1
+46 1522 1
+46 1523 1
+46 1524 1
+46 1525 1
+46 1532 1
+46 1533 1
+46 1534 1
+46 1535 1
+46 1536 1
+46 1537 1
+46 1542 1
+46 1543 1
+46 1544 1
+46 1545 1
+46 1552 1
+46 1553 1
+46 1554 1
+46 1555 1
+46 1556 1
+46 1557 1
+46 1562 1
+46 1563 1
+46 1564 1
+46 1565 1
+46 1566 1
+46 1567 1
+46 1572 1
+46 1573 1
+46 1574 1
+46 1575 1
+46 1633 1
+46 1634 1
+46 1635 1
+46 1636 1
+46 1643 1
+46 1644 1
+46 1645 1
+46 1646 1
+46 1647 1
+46 1648 1
+46 1653 1
+46 1654 1
+46 1655 1
+46 1656 1
+46 1657 1
+46 1658 1
+46 1663 1
+46 1664 1
+46 1665 1
+46 1666 1
+46 1668 1
+46 1669 1
+46 1670 1
+46 1671 1
+46 1672 1
+46 1673 1
+46 1678 1
+46 1679 1
+46 1680 1
+46 1681 1
+46 1683 1
+46 1684 1
+46 1685 1
+46 1686 1
+46 1688 1
+47 5 1
+47 40 1
+47 46 1
+47 51 1
+47 55 1
+47 59 1
+47 60 1
+47 61 1
+47 124 1
+47 130 1
+47 135 1
+47 139 1
+47 143 1
+47 144 1
+47 145 1
+47 207 1
+47 212 1
+47 216 1
+47 220 1
+47 221 1
+47 222 1
+47 227 1
+47 231 1
+47 235 1
+47 236 1
+47 237 1
+47 241 1
+47 245 1
+47 246 1
+47 247 1
+47 251 1
+47 252 1
+47 253 1
+47 257 1
+47 258 1
+47 259 1
+47 334 1
+47 340 1
+47 345 1
+47 349 1
+47 353 1
+47 354 1
+47 355 1
+47 417 1
+47 422 1
+47 426 1
+47 430 1
+47 431 1
+47 432 1
+47 437 1
+47 441 1
+47 445 1
+47 446 1
+47 447 1
+47 451 1
+47 455 1
+47 456 1
+47 457 1
+47 461 1
+47 462 1
+47 463 1
+47 467 1
+47 468 1
+47 469 1
+47 543 1
+47 548 1
+47 552 1
+47 556 1
+47 557 1
+47 558 1
+47 563 1
+47 567 1
+47 571 1
+47 572 1
+47 573 1
+47 577 1
+47 581 1
+47 582 1
+47 583 1
+47 587 1
+47 588 1
+47 589 1
+47 593 1
+47 594 1
+47 595 1
+47 668 1
+47 672 1
+47 676 1
+47 677 1
+47 678 1
+47 682 1
+47 686 1
+47 687 1
+47 688 1
+47 692 1
+47 693 1
+47 694 1
+47 698 1
+47 699 1
+47 700 1
+47 702 1
+47 706 1
+47 707 1
+47 708 1
+47 712 1
+47 713 1
+47 714 1
+47 718 1
+47 719 1
+47 720 1
+47 722 1
+47 723 1
+47 724 1
+47 728 1
+47 729 1
+47 730 1
+47 732 1
+47 733 1
+47 734 1
+47 736 1
+47 796 1
+47 802 1
+47 807 1
+47 811 1
+47 815 1
+47 816 1
+47 817 1
+47 879 1
+47 884 1
+47 888 1
+47 892 1
+47 893 1
+47 894 1
+47 899 1
+47 903 1
+47 907 1
+47 908 1
+47 909 1
+47 913 1
+47 917 1
+47 918 1
+47 919 1
+47 923 1
+47 924 1
+47 925 1
+47 929 1
+47 930 1
+47 931 1
+47 1005 1
+47 1010 1
+47 1014 1
+47 1018 1
+47 1019 1
+47 1020 1
+47 1025 1
+47 1029 1
+47 1033 1
+47 1034 1
+47 1035 1
+47 1039 1
+47 1043 1
+47 1044 1
+47 1045 1
+47 1049 1
+47 1050 1
+47 1051 1
+47 1055 1
+47 1056 1
+47 1057 1
+47 1130 1
+47 1134 1
+47 1138 1
+47 1139 1
+47 1140 1
+47 1144 1
+47 1148 1
+47 1149 1
+47 1150 1
+47 1154 1
+47 1155 1
+47 1156 1
+47 1160 1
+47 1161 1
+47 1162 1
+47 1164 1
+47 1168 1
+47 1169 1
+47 1170 1
+47 1174 1
+47 1175 1
+47 1176 1
+47 1180 1
+47 1181 1
+47 1182 1
+47 1184 1
+47 1185 1
+47 1186 1
+47 1190 1
+47 1191 1
+47 1192 1
+47 1194 1
+47 1195 1
+47 1196 1
+47 1198 1
+47 1257 1
+47 1262 1
+47 1266 1
+47 1270 1
+47 1271 1
+47 1272 1
+47 1277 1
+47 1281 1
+47 1285 1
+47 1286 1
+47 1287 1
+47 1291 1
+47 1295 1
+47 1296 1
+47 1297 1
+47 1301 1
+47 1302 1
+47 1303 1
+47 1307 1
+47 1308 1
+47 1309 1
+47 1382 1
+47 1386 1
+47 1390 1
+47 1391 1
+47 1392 1
+47 1396 1
+47 1400 1
+47 1401 1
+47 1402 1
+47 1406 1
+47 1407 1
+47 1408 1
+47 1412 1
+47 1413 1
+47 1414 1
+47 1416 1
+47 1420 1
+47 1421 1
+47 1422 1
+47 1426 1
+47 1427 1
+47 1428 1
+47 1432 1
+47 1433 1
+47 1434 1
+47 1436 1
+47 1437 1
+47 1438 1
+47 1442 1
+47 1443 1
+47 1444 1
+47 1446 1
+47 1447 1
+47 1448 1
+47 1450 1
+47 1508 1
+47 1512 1
+47 1516 1
+47 1517 1
+47 1518 1
+47 1522 1
+47 1526 1
+47 1527 1
+47 1528 1
+47 1532 1
+47 1533 1
+47 1534 1
+47 1538 1
+47 1539 1
+47 1540 1
+47 1542 1
+47 1546 1
+47 1547 1
+47 1548 1
+47 1552 1
+47 1553 1
+47 1554 1
+47 1558 1
+47 1559 1
+47 1560 1
+47 1562 1
+47 1563 1
+47 1564 1
+47 1568 1
+47 1569 1
+47 1570 1
+47 1572 1
+47 1573 1
+47 1574 1
+47 1576 1
+47 1633 1
+47 1637 1
+47 1638 1
+47 1639 1
+47 1643 1
+47 1644 1
+47 1645 1
+47 1649 1
+47 1650 1
+47 1651 1
+47 1653 1
+47 1654 1
+47 1655 1
+47 1659 1
+47 1660 1
+47 1661 1
+47 1663 1
+47 1664 1
+47 1665 1
+47 1667 1
+47 1668 1
+47 1669 1
+47 1670 1
+47 1674 1
+47 1675 1
+47 1676 1
+47 1678 1
+47 1679 1
+47 1680 1
+47 1682 1
+47 1683 1
+47 1684 1
+47 1685 1
+47 1687 1
+47 1688 1
+48 6 1
+48 41 1
+48 47 1
+48 52 1
+48 56 1
+48 59 1
+48 62 1
+48 63 1
+48 125 1
+48 131 1
+48 136 1
+48 140 1
+48 143 1
+48 146 1
+48 147 1
+48 208 1
+48 213 1
+48 217 1
+48 220 1
+48 223 1
+48 224 1
+48 228 1
+48 232 1
+48 235 1
+48 238 1
+48 239 1
+48 242 1
+48 245 1
+48 248 1
+48 249 1
+48 251 1
+48 254 1
+48 255 1
+48 257 1
+48 258 1
+48 260 1
+48 335 1
+48 341 1
+48 346 1
+48 350 1
+48 353 1
+48 356 1
+48 357 1
+48 418 1
+48 423 1
+48 427 1
+48 430 1
+48 433 1
+48 434 1
+48 438 1
+48 442 1
+48 445 1
+48 448 1
+48 449 1
+48 452 1
+48 455 1
+48 458 1
+48 459 1
+48 461 1
+48 464 1
+48 465 1
+48 467 1
+48 468 1
+48 470 1
+48 544 1
+48 549 1
+48 553 1
+48 556 1
+48 559 1
+48 560 1
+48 564 1
+48 568 1
+48 571 1
+48 574 1
+48 575 1
+48 578 1
+48 581 1
+48 584 1
+48 585 1
+48 587 1
+48 590 1
+48 591 1
+48 593 1
+48 594 1
+48 596 1
+48 669 1
+48 673 1
+48 676 1
+48 679 1
+48 680 1
+48 683 1
+48 686 1
+48 689 1
+48 690 1
+48 692 1
+48 695 1
+48 696 1
+48 698 1
+48 699 1
+48 701 1
+48 703 1
+48 706 1
+48 709 1
+48 710 1
+48 712 1
+48 715 1
+48 716 1
+48 718 1
+48 719 1
+48 721 1
+48 722 1
+48 725 1
+48 726 1
+48 728 1
+48 729 1
+48 731 1
+48 732 1
+48 733 1
+48 735 1
+48 736 1
+48 797 1
+48 803 1
+48 808 1
+48 812 1
+48 815 1
+48 818 1
+48 819 1
+48 880 1
+48 885 1
+48 889 1
+48 892 1
+48 895 1
+48 896 1
+48 900 1
+48 904 1
+48 907 1
+48 910 1
+48 911 1
+48 914 1
+48 917 1
+48 920 1
+48 921 1
+48 923 1
+48 926 1
+48 927 1
+48 929 1
+48 930 1
+48 932 1
+48 1006 1
+48 1011 1
+48 1015 1
+48 1018 1
+48 1021 1
+48 1022 1
+48 1026 1
+48 1030 1
+48 1033 1
+48 1036 1
+48 1037 1
+48 1040 1
+48 1043 1
+48 1046 1
+48 1047 1
+48 1049 1
+48 1052 1
+48 1053 1
+48 1055 1
+48 1056 1
+48 1058 1
+48 1131 1
+48 1135 1
+48 1138 1
+48 1141 1
+48 1142 1
+48 1145 1
+48 1148 1
+48 1151 1
+48 1152 1
+48 1154 1
+48 1157 1
+48 1158 1
+48 1160 1
+48 1161 1
+48 1163 1
+48 1165 1
+48 1168 1
+48 1171 1
+48 1172 1
+48 1174 1
+48 1177 1
+48 1178 1
+48 1180 1
+48 1181 1
+48 1183 1
+48 1184 1
+48 1187 1
+48 1188 1
+48 1190 1
+48 1191 1
+48 1193 1
+48 1194 1
+48 1195 1
+48 1197 1
+48 1198 1
+48 1258 1
+48 1263 1
+48 1267 1
+48 1270 1
+48 1273 1
+48 1274 1
+48 1278 1
+48 1282 1
+48 1285 1
+48 1288 1
+48 1289 1
+48 1292 1
+48 1295 1
+48 1298 1
+48 1299 1
+48 1301 1
+48 1304 1
+48 1305 1
+48 1307 1
+48 1308 1
+48 1310 1
+48 1383 1
+48 1387 1
+48 1390 1
+48 1393 1
+48 1394 1
+48 1397 1
+48 1400 1
+48 1403 1
+48 1404 1
+48 1406 1
+48 1409 1
+48 1410 1
+48 1412 1
+48 1413 1
+48 1415 1
+48 1417 1
+48 1420 1
+48 1423 1
+48 1424 1
+48 1426 1
+48 1429 1
+48 1430 1
+48 1432 1
+48 1433 1
+48 1435 1
+48 1436 1
+48 1439 1
+48 1440 1
+48 1442 1
+48 1443 1
+48 1445 1
+48 1446 1
+48 1447 1
+48 1449 1
+48 1450 1
+48 1509 1
+48 1513 1
+48 1516 1
+48 1519 1
+48 1520 1
+48 1523 1
+48 1526 1
+48 1529 1
+48 1530 1
+48 1532 1
+48 1535 1
+48 1536 1
+48 1538 1
+48 1539 1
+48 1541 1
+48 1543 1
+48 1546 1
+48 1549 1
+48 1550 1
+48 1552 1
+48 1555 1
+48 1556 1
+48 1558 1
+48 1559 1
+48 1561 1
+48 1562 1
+48 1565 1
+48 1566 1
+48 1568 1
+48 1569 1
+48 1571 1
+48 1572 1
+48 1573 1
+48 1575 1
+48 1576 1
+48 1634 1
+48 1637 1
+48 1640 1
+48 1641 1
+48 1643 1
+48 1646 1
+48 1647 1
+48 1649 1
+48 1650 1
+48 1652 1
+48 1653 1
+48 1656 1
+48 1657 1
+48 1659 1
+48 1660 1
+48 1662 1
+48 1663 1
+48 1664 1
+48 1666 1
+48 1667 1
+48 1668 1
+48 1671 1
+48 1672 1
+48 1674 1
+48 1675 1
+48 1677 1
+48 1678 1
+48 1679 1
+48 1681 1
+48 1682 1
+48 1683 1
+48 1684 1
+48 1686 1
+48 1687 1
+48 1688 1
+49 7 1
+49 42 1
+49 48 1
+49 53 1
+49 57 1
+49 60 1
+49 62 1
+49 64 1
+49 126 1
+49 132 1
+49 137 1
+49 141 1
+49 144 1
+49 146 1
+49 148 1
+49 209 1
+49 214 1
+49 218 1
+49 221 1
+49 223 1
+49 225 1
+49 229 1
+49 233 1
+49 236 1
+49 238 1
+49 240 1
+49 243 1
+49 246 1
+49 248 1
+49 250 1
+49 252 1
+49 254 1
+49 256 1
+49 257 1
+49 259 1
+49 260 1
+49 336 1
+49 342 1
+49 347 1
+49 351 1
+49 354 1
+49 356 1
+49 358 1
+49 419 1
+49 424 1
+49 428 1
+49 431 1
+49 433 1
+49 435 1
+49 439 1
+49 443 1
+49 446 1
+49 448 1
+49 450 1
+49 453 1
+49 456 1
+49 458 1
+49 460 1
+49 462 1
+49 464 1
+49 466 1
+49 467 1
+49 469 1
+49 470 1
+49 545 1
+49 550 1
+49 554 1
+49 557 1
+49 559 1
+49 561 1
+49 565 1
+49 569 1
+49 572 1
+49 574 1
+49 576 1
+49 579 1
+49 582 1
+49 584 1
+49 586 1
+49 588 1
+49 590 1
+49 592 1
+49 593 1
+49 595 1
+49 596 1
+49 670 1
+49 674 1
+49 677 1
+49 679 1
+49 681 1
+49 684 1
+49 687 1
+49 689 1
+49 691 1
+49 693 1
+49 695 1
+49 697 1
+49 698 1
+49 700 1
+49 701 1
+49 704 1
+49 707 1
+49 709 1
+49 711 1
+49 713 1
+49 715 1
+49 717 1
+49 718 1
+49 720 1
+49 721 1
+49 723 1
+49 725 1
+49 727 1
+49 728 1
+49 730 1
+49 731 1
+49 732 1
+49 734 1
+49 735 1
+49 736 1
+49 798 1
+49 804 1
+49 809 1
+49 813 1
+49 816 1
+49 818 1
+49 820 1
+49 881 1
+49 886 1
+49 890 1
+49 893 1
+49 895 1
+49 897 1
+49 901 1
+49 905 1
+49 908 1
+49 910 1
+49 912 1
+49 915 1
+49 918 1
+49 920 1
+49 922 1
+49 924 1
+49 926 1
+49 928 1
+49 929 1
+49 931 1
+49 932 1
+49 1007 1
+49 1012 1
+49 1016 1
+49 1019 1
+49 1021 1
+49 1023 1
+49 1027 1
+49 1031 1
+49 1034 1
+49 1036 1
+49 1038 1
+49 1041 1
+49 1044 1
+49 1046 1
+49 1048 1
+49 1050 1
+49 1052 1
+49 1054 1
+49 1055 1
+49 1057 1
+49 1058 1
+49 1132 1
+49 1136 1
+49 1139 1
+49 1141 1
+49 1143 1
+49 1146 1
+49 1149 1
+49 1151 1
+49 1153 1
+49 1155 1
+49 1157 1
+49 1159 1
+49 1160 1
+49 1162 1
+49 1163 1
+49 1166 1
+49 1169 1
+49 1171 1
+49 1173 1
+49 1175 1
+49 1177 1
+49 1179 1
+49 1180 1
+49 1182 1
+49 1183 1
+49 1185 1
+49 1187 1
+49 1189 1
+49 1190 1
+49 1192 1
+49 1193 1
+49 1194 1
+49 1196 1
+49 1197 1
+49 1198 1
+49 1259 1
+49 1264 1
+49 1268 1
+49 1271 1
+49 1273 1
+49 1275 1
+49 1279 1
+49 1283 1
+49 1286 1
+49 1288 1
+49 1290 1
+49 1293 1
+49 1296 1
+49 1298 1
+49 1300 1
+49 1302 1
+49 1304 1
+49 1306 1
+49 1307 1
+49 1309 1
+49 1310 1
+49 1384 1
+49 1388 1
+49 1391 1
+49 1393 1
+49 1395 1
+49 1398 1
+49 1401 1
+49 1403 1
+49 1405 1
+49 1407 1
+49 1409 1
+49 1411 1
+49 1412 1
+49 1414 1
+49 1415 1
+49 1418 1
+49 1421 1
+49 1423 1
+49 1425 1
+49 1427 1
+49 1429 1
+49 1431 1
+49 1432 1
+49 1434 1
+49 1435 1
+49 1437 1
+49 1439 1
+49 1441 1
+49 1442 1
+49 1444 1
+49 1445 1
+49 1446 1
+49 1448 1
+49 1449 1
+49 1450 1
+49 1510 1
+49 1514 1
+49 1517 1
+49 1519 1
+49 1521 1
+49 1524 1
+49 1527 1
+49 1529 1
+49 1531 1
+49 1533 1
+49 1535 1
+49 1537 1
+49 1538 1
+49 1540 1
+49 1541 1
+49 1544 1
+49 1547 1
+49 1549 1
+49 1551 1
+49 1553 1
+49 1555 1
+49 1557 1
+49 1558 1
+49 1560 1
+49 1561 1
+49 1563 1
+49 1565 1
+49 1567 1
+49 1568 1
+49 1570 1
+49 1571 1
+49 1572 1
+49 1574 1
+49 1575 1
+49 1576 1
+49 1635 1
+49 1638 1
+49 1640 1
+49 1642 1
+49 1644 1
+49 1646 1
+49 1648 1
+49 1649 1
+49 1651 1
+49 1652 1
+49 1654 1
+49 1656 1
+49 1658 1
+49 1659 1
+49 1661 1
+49 1662 1
+49 1663 1
+49 1665 1
+49 1666 1
+49 1667 1
+49 1669 1
+49 1671 1
+49 1673 1
+49 1674 1
+49 1676 1
+49 1677 1
+49 1678 1
+49 1680 1
+49 1681 1
+49 1682 1
+49 1683 1
+49 1685 1
+49 1686 1
+49 1687 1
+49 1688 1
+50 8 1
+50 43 1
+50 49 1
+50 54 1
+50 58 1
+50 61 1
+50 63 1
+50 64 1
+50 127 1
+50 133 1
+50 138 1
+50 142 1
+50 145 1
+50 147 1
+50 148 1
+50 210 1
+50 215 1
+50 219 1
+50 222 1
+50 224 1
+50 225 1
+50 230 1
+50 234 1
+50 237 1
+50 239 1
+50 240 1
+50 244 1
+50 247 1
+50 249 1
+50 250 1
+50 253 1
+50 255 1
+50 256 1
+50 258 1
+50 259 1
+50 260 1
+50 337 1
+50 343 1
+50 348 1
+50 352 1
+50 355 1
+50 357 1
+50 358 1
+50 420 1
+50 425 1
+50 429 1
+50 432 1
+50 434 1
+50 435 1
+50 440 1
+50 444 1
+50 447 1
+50 449 1
+50 450 1
+50 454 1
+50 457 1
+50 459 1
+50 460 1
+50 463 1
+50 465 1
+50 466 1
+50 468 1
+50 469 1
+50 470 1
+50 546 1
+50 551 1
+50 555 1
+50 558 1
+50 560 1
+50 561 1
+50 566 1
+50 570 1
+50 573 1
+50 575 1
+50 576 1
+50 580 1
+50 583 1
+50 585 1
+50 586 1
+50 589 1
+50 591 1
+50 592 1
+50 594 1
+50 595 1
+50 596 1
+50 671 1
+50 675 1
+50 678 1
+50 680 1
+50 681 1
+50 685 1
+50 688 1
+50 690 1
+50 691 1
+50 694 1
+50 696 1
+50 697 1
+50 699 1
+50 700 1
+50 701 1
+50 705 1
+50 708 1
+50 710 1
+50 711 1
+50 714 1
+50 716 1
+50 717 1
+50 719 1
+50 720 1
+50 721 1
+50 724 1
+50 726 1
+50 727 1
+50 729 1
+50 730 1
+50 731 1
+50 733 1
+50 734 1
+50 735 1
+50 736 1
+50 799 1
+50 805 1
+50 810 1
+50 814 1
+50 817 1
+50 819 1
+50 820 1
+50 882 1
+50 887 1
+50 891 1
+50 894 1
+50 896 1
+50 897 1
+50 902 1
+50 906 1
+50 909 1
+50 911 1
+50 912 1
+50 916 1
+50 919 1
+50 921 1
+50 922 1
+50 925 1
+50 927 1
+50 928 1
+50 930 1
+50 931 1
+50 932 1
+50 1008 1
+50 1013 1
+50 1017 1
+50 1020 1
+50 1022 1
+50 1023 1
+50 1028 1
+50 1032 1
+50 1035 1
+50 1037 1
+50 1038 1
+50 1042 1
+50 1045 1
+50 1047 1
+50 1048 1
+50 1051 1
+50 1053 1
+50 1054 1
+50 1056 1
+50 1057 1
+50 1058 1
+50 1133 1
+50 1137 1
+50 1140 1
+50 1142 1
+50 1143 1
+50 1147 1
+50 1150 1
+50 1152 1
+50 1153 1
+50 1156 1
+50 1158 1
+50 1159 1
+50 1161 1
+50 1162 1
+50 1163 1
+50 1167 1
+50 1170 1
+50 1172 1
+50 1173 1
+50 1176 1
+50 1178 1
+50 1179 1
+50 1181 1
+50 1182 1
+50 1183 1
+50 1186 1
+50 1188 1
+50 1189 1
+50 1191 1
+50 1192 1
+50 1193 1
+50 1195 1
+50 1196 1
+50 1197 1
+50 1198 1
+50 1260 1
+50 1265 1
+50 1269 1
+50 1272 1
+50 1274 1
+50 1275 1
+50 1280 1
+50 1284 1
+50 1287 1
+50 1289 1
+50 1290 1
+50 1294 1
+50 1297 1
+50 1299 1
+50 1300 1
+50 1303 1
+50 1305 1
+50 1306 1
+50 1308 1
+50 1309 1
+50 1310 1
+50 1385 1
+50 1389 1
+50 1392 1
+50 1394 1
+50 1395 1
+50 1399 1
+50 1402 1
+50 1404 1
+50 1405 1
+50 1408 1
+50 1410 1
+50 1411 1
+50 1413 1
+50 1414 1
+50 1415 1
+50 1419 1
+50 1422 1
+50 1424 1
+50 1425 1
+50 1428 1
+50 1430 1
+50 1431 1
+50 1433 1
+50 1434 1
+50 1435 1
+50 1438 1
+50 1440 1
+50 1441 1
+50 1443 1
+50 1444 1
+50 1445 1
+50 1447 1
+50 1448 1
+50 1449 1
+50 1450 1
+50 1511 1
+50 1515 1
+50 1518 1
+50 1520 1
+50 1521 1
+50 1525 1
+50 1528 1
+50 1530 1
+50 1531 1
+50 1534 1
+50 1536 1
+50 1537 1
+50 1539 1
+50 1540 1
+50 1541 1
+50 1545 1
+50 1548 1
+50 1550 1
+50 1551 1
+50 1554 1
+50 1556 1
+50 1557 1
+50 1559 1
+50 1560 1
+50 1561 1
+50 1564 1
+50 1566 1
+50 1567 1
+50 1569 1
+50 1570 1
+50 1571 1
+50 1573 1
+50 1574 1
+50 1575 1
+50 1576 1
+50 1636 1
+50 1639 1
+50 1641 1
+50 1642 1
+50 1645 1
+50 1647 1
+50 1648 1
+50 1650 1
+50 1651 1
+50 1652 1
+50 1655 1
+50 1657 1
+50 1658 1
+50 1660 1
+50 1661 1
+50 1662 1
+50 1664 1
+50 1665 1
+50 1666 1
+50 1667 1
+50 1670 1
+50 1672 1
+50 1673 1
+50 1675 1
+50 1676 1
+50 1677 1
+50 1679 1
+50 1680 1
+50 1681 1
+50 1682 1
+50 1684 1
+50 1685 1
+50 1686 1
+50 1687 1
+50 1688 1
+51 9 1
+51 37 1
+51 65 1
+51 66 1
+51 67 1
+51 68 1
+51 69 1
+51 70 1
+51 121 1
+51 149 1
+51 150 1
+51 151 1
+51 152 1
+51 153 1
+51 154 1
+51 205 1
+51 206 1
+51 207 1
+51 208 1
+51 209 1
+51 210 1
+51 261 1
+51 262 1
+51 263 1
+51 264 1
+51 265 1
+51 266 1
+51 267 1
+51 268 1
+51 269 1
+51 270 1
+51 271 1
+51 272 1
+51 273 1
+51 274 1
+51 275 1
+51 331 1
+51 359 1
+51 360 1
+51 361 1
+51 362 1
+51 363 1
+51 364 1
+51 415 1
+51 416 1
+51 417 1
+51 418 1
+51 419 1
+51 420 1
+51 471 1
+51 472 1
+51 473 1
+51 474 1
+51 475 1
+51 476 1
+51 477 1
+51 478 1
+51 479 1
+51 480 1
+51 481 1
+51 482 1
+51 483 1
+51 484 1
+51 485 1
+51 541 1
+51 542 1
+51 543 1
+51 544 1
+51 545 1
+51 546 1
+51 597 1
+51 598 1
+51 599 1
+51 600 1
+51 601 1
+51 602 1
+51 603 1
+51 604 1
+51 605 1
+51 606 1
+51 607 1
+51 608 1
+51 609 1
+51 610 1
+51 611 1
+51 667 1
+51 668 1
+51 669 1
+51 670 1
+51 671 1
+51 672 1
+51 673 1
+51 674 1
+51 675 1
+51 676 1
+51 677 1
+51 678 1
+51 679 1
+51 680 1
+51 681 1
+51 737 1
+51 738 1
+51 739 1
+51 740 1
+51 741 1
+51 742 1
+51 743 1
+51 744 1
+51 745 1
+51 746 1
+51 747 1
+51 748 1
+51 749 1
+51 750 1
+51 751 1
+51 752 1
+51 753 1
+51 754 1
+51 755 1
+51 756 1
+51 793 1
+51 821 1
+51 822 1
+51 823 1
+51 824 1
+51 825 1
+51 826 1
+51 877 1
+51 878 1
+51 879 1
+51 880 1
+51 881 1
+51 882 1
+51 933 1
+51 934 1
+51 935 1
+51 936 1
+51 937 1
+51 938 1
+51 939 1
+51 940 1
+51 941 1
+51 942 1
+51 943 1
+51 944 1
+51 945 1
+51 946 1
+51 947 1
+51 1003 1
+51 1004 1
+51 1005 1
+51 1006 1
+51 1007 1
+51 1008 1
+51 1059 1
+51 1060 1
+51 1061 1
+51 1062 1
+51 1063 1
+51 1064 1
+51 1065 1
+51 1066 1
+51 1067 1
+51 1068 1
+51 1069 1
+51 1070 1
+51 1071 1
+51 1072 1
+51 1073 1
+51 1129 1
+51 1130 1
+51 1131 1
+51 1132 1
+51 1133 1
+51 1134 1
+51 1135 1
+51 1136 1
+51 1137 1
+51 1138 1
+51 1139 1
+51 1140 1
+51 1141 1
+51 1142 1
+51 1143 1
+51 1199 1
+51 1200 1
+51 1201 1
+51 1202 1
+51 1203 1
+51 1204 1
+51 1205 1
+51 1206 1
+51 1207 1
+51 1208 1
+51 1209 1
+51 1210 1
+51 1211 1
+51 1212 1
+51 1213 1
+51 1214 1
+51 1215 1
+51 1216 1
+51 1217 1
+51 1218 1
+51 1255 1
+51 1256 1
+51 1257 1
+51 1258 1
+51 1259 1
+51 1260 1
+51 1311 1
+51 1312 1
+51 1313 1
+51 1314 1
+51 1315 1
+51 1316 1
+51 1317 1
+51 1318 1
+51 1319 1
+51 1320 1
+51 1321 1
+51 1322 1
+51 1323 1
+51 1324 1
+51 1325 1
+51 1381 1
+51 1382 1
+51 1383 1
+51 1384 1
+51 1385 1
+51 1386 1
+51 1387 1
+51 1388 1
+51 1389 1
+51 1390 1
+51 1391 1
+51 1392 1
+51 1393 1
+51 1394 1
+51 1395 1
+51 1451 1
+51 1452 1
+51 1453 1
+51 1454 1
+51 1455 1
+51 1456 1
+51 1457 1
+51 1458 1
+51 1459 1
+51 1460 1
+51 1461 1
+51 1462 1
+51 1463 1
+51 1464 1
+51 1465 1
+51 1466 1
+51 1467 1
+51 1468 1
+51 1469 1
+51 1470 1
+51 1507 1
+51 1508 1
+51 1509 1
+51 1510 1
+51 1511 1
+51 1512 1
+51 1513 1
+51 1514 1
+51 1515 1
+51 1516 1
+51 1517 1
+51 1518 1
+51 1519 1
+51 1520 1
+51 1521 1
+51 1577 1
+51 1578 1
+51 1579 1
+51 1580 1
+51 1581 1
+51 1582 1
+51 1583 1
+51 1584 1
+51 1585 1
+51 1586 1
+51 1587 1
+51 1588 1
+51 1589 1
+51 1590 1
+51 1591 1
+51 1592 1
+51 1593 1
+51 1594 1
+51 1595 1
+51 1596 1
+51 1633 1
+51 1634 1
+51 1635 1
+51 1636 1
+51 1637 1
+51 1638 1
+51 1639 1
+51 1640 1
+51 1641 1
+51 1642 1
+51 1643 1
+51 1644 1
+51 1645 1
+51 1646 1
+51 1647 1
+51 1648 1
+51 1649 1
+51 1650 1
+51 1651 1
+51 1652 1
+51 1689 1
+51 1690 1
+51 1691 1
+51 1692 1
+51 1693 1
+51 1694 1
+51 1695 1
+51 1696 1
+51 1697 1
+51 1698 1
+51 1699 1
+51 1700 1
+51 1701 1
+51 1702 1
+51 1703 1
+52 10 1
+52 38 1
+52 65 1
+52 71 1
+52 72 1
+52 73 1
+52 74 1
+52 75 1
+52 122 1
+52 149 1
+52 155 1
+52 156 1
+52 157 1
+52 158 1
+52 159 1
+52 205 1
+52 211 1
+52 212 1
+52 213 1
+52 214 1
+52 215 1
+52 261 1
+52 262 1
+52 263 1
+52 264 1
+52 265 1
+52 276 1
+52 277 1
+52 278 1
+52 279 1
+52 280 1
+52 281 1
+52 282 1
+52 283 1
+52 284 1
+52 285 1
+52 332 1
+52 359 1
+52 365 1
+52 366 1
+52 367 1
+52 368 1
+52 369 1
+52 415 1
+52 421 1
+52 422 1
+52 423 1
+52 424 1
+52 425 1
+52 471 1
+52 472 1
+52 473 1
+52 474 1
+52 475 1
+52 486 1
+52 487 1
+52 488 1
+52 489 1
+52 490 1
+52 491 1
+52 492 1
+52 493 1
+52 494 1
+52 495 1
+52 541 1
+52 547 1
+52 548 1
+52 549 1
+52 550 1
+52 551 1
+52 597 1
+52 598 1
+52 599 1
+52 600 1
+52 601 1
+52 612 1
+52 613 1
+52 614 1
+52 615 1
+52 616 1
+52 617 1
+52 618 1
+52 619 1
+52 620 1
+52 621 1
+52 667 1
+52 668 1
+52 669 1
+52 670 1
+52 671 1
+52 682 1
+52 683 1
+52 684 1
+52 685 1
+52 686 1
+52 687 1
+52 688 1
+52 689 1
+52 690 1
+52 691 1
+52 737 1
+52 738 1
+52 739 1
+52 740 1
+52 741 1
+52 742 1
+52 743 1
+52 744 1
+52 745 1
+52 746 1
+52 757 1
+52 758 1
+52 759 1
+52 760 1
+52 761 1
+52 762 1
+52 763 1
+52 764 1
+52 765 1
+52 766 1
+52 794 1
+52 821 1
+52 827 1
+52 828 1
+52 829 1
+52 830 1
+52 831 1
+52 877 1
+52 883 1
+52 884 1
+52 885 1
+52 886 1
+52 887 1
+52 933 1
+52 934 1
+52 935 1
+52 936 1
+52 937 1
+52 948 1
+52 949 1
+52 950 1
+52 951 1
+52 952 1
+52 953 1
+52 954 1
+52 955 1
+52 956 1
+52 957 1
+52 1003 1
+52 1009 1
+52 1010 1
+52 1011 1
+52 1012 1
+52 1013 1
+52 1059 1
+52 1060 1
+52 1061 1
+52 1062 1
+52 1063 1
+52 1074 1
+52 1075 1
+52 1076 1
+52 1077 1
+52 1078 1
+52 1079 1
+52 1080 1
+52 1081 1
+52 1082 1
+52 1083 1
+52 1129 1
+52 1130 1
+52 1131 1
+52 1132 1
+52 1133 1
+52 1144 1
+52 1145 1
+52 1146 1
+52 1147 1
+52 1148 1
+52 1149 1
+52 1150 1
+52 1151 1
+52 1152 1
+52 1153 1
+52 1199 1
+52 1200 1
+52 1201 1
+52 1202 1
+52 1203 1
+52 1204 1
+52 1205 1
+52 1206 1
+52 1207 1
+52 1208 1
+52 1219 1
+52 1220 1
+52 1221 1
+52 1222 1
+52 1223 1
+52 1224 1
+52 1225 1
+52 1226 1
+52 1227 1
+52 1228 1
+52 1255 1
+52 1261 1
+52 1262 1
+52 1263 1
+52 1264 1
+52 1265 1
+52 1311 1
+52 1312 1
+52 1313 1
+52 1314 1
+52 1315 1
+52 1326 1
+52 1327 1
+52 1328 1
+52 1329 1
+52 1330 1
+52 1331 1
+52 1332 1
+52 1333 1
+52 1334 1
+52 1335 1
+52 1381 1
+52 1382 1
+52 1383 1
+52 1384 1
+52 1385 1
+52 1396 1
+52 1397 1
+52 1398 1
+52 1399 1
+52 1400 1
+52 1401 1
+52 1402 1
+52 1403 1
+52 1404 1
+52 1405 1
+52 1451 1
+52 1452 1
+52 1453 1
+52 1454 1
+52 1455 1
+52 1456 1
+52 1457 1
+52 1458 1
+52 1459 1
+52 1460 1
+52 1471 1
+52 1472 1
+52 1473 1
+52 1474 1
+52 1475 1
+52 1476 1
+52 1477 1
+52 1478 1
+52 1479 1
+52 1480 1
+52 1507 1
+52 1508 1
+52 1509 1
+52 1510 1
+52 1511 1
+52 1522 1
+52 1523 1
+52 1524 1
+52 1525 1
+52 1526 1
+52 1527 1
+52 1528 1
+52 1529 1
+52 1530 1
+52 1531 1
+52 1577 1
+52 1578 1
+52 1579 1
+52 1580 1
+52 1581 1
+52 1582 1
+52 1583 1
+52 1584 1
+52 1585 1
+52 1586 1
+52 1597 1
+52 1598 1
+52 1599 1
+52 1600 1
+52 1601 1
+52 1602 1
+52 1603 1
+52 1604 1
+52 1605 1
+52 1606 1
+52 1633 1
+52 1634 1
+52 1635 1
+52 1636 1
+52 1637 1
+52 1638 1
+52 1639 1
+52 1640 1
+52 1641 1
+52 1642 1
+52 1653 1
+52 1654 1
+52 1655 1
+52 1656 1
+52 1657 1
+52 1658 1
+52 1659 1
+52 1660 1
+52 1661 1
+52 1662 1
+52 1689 1
+52 1690 1
+52 1691 1
+52 1692 1
+52 1693 1
+52 1694 1
+52 1695 1
+52 1696 1
+52 1697 1
+52 1698 1
+52 1704 1
+52 1705 1
+52 1706 1
+52 1707 1
+52 1708 1
+53 11 1
+53 39 1
+53 66 1
+53 71 1
+53 76 1
+53 77 1
+53 78 1
+53 79 1
+53 123 1
+53 150 1
+53 155 1
+53 160 1
+53 161 1
+53 162 1
+53 163 1
+53 206 1
+53 211 1
+53 216 1
+53 217 1
+53 218 1
+53 219 1
+53 261 1
+53 266 1
+53 267 1
+53 268 1
+53 269 1
+53 276 1
+53 277 1
+53 278 1
+53 279 1
+53 286 1
+53 287 1
+53 288 1
+53 289 1
+53 290 1
+53 291 1
+53 333 1
+53 360 1
+53 365 1
+53 370 1
+53 371 1
+53 372 1
+53 373 1
+53 416 1
+53 421 1
+53 426 1
+53 427 1
+53 428 1
+53 429 1
+53 471 1
+53 476 1
+53 477 1
+53 478 1
+53 479 1
+53 486 1
+53 487 1
+53 488 1
+53 489 1
+53 496 1
+53 497 1
+53 498 1
+53 499 1
+53 500 1
+53 501 1
+53 542 1
+53 547 1
+53 552 1
+53 553 1
+53 554 1
+53 555 1
+53 597 1
+53 602 1
+53 603 1
+53 604 1
+53 605 1
+53 612 1
+53 613 1
+53 614 1
+53 615 1
+53 622 1
+53 623 1
+53 624 1
+53 625 1
+53 626 1
+53 627 1
+53 667 1
+53 672 1
+53 673 1
+53 674 1
+53 675 1
+53 682 1
+53 683 1
+53 684 1
+53 685 1
+53 692 1
+53 693 1
+53 694 1
+53 695 1
+53 696 1
+53 697 1
+53 737 1
+53 738 1
+53 739 1
+53 740 1
+53 747 1
+53 748 1
+53 749 1
+53 750 1
+53 751 1
+53 752 1
+53 757 1
+53 758 1
+53 759 1
+53 760 1
+53 761 1
+53 762 1
+53 767 1
+53 768 1
+53 769 1
+53 770 1
+53 795 1
+53 822 1
+53 827 1
+53 832 1
+53 833 1
+53 834 1
+53 835 1
+53 878 1
+53 883 1
+53 888 1
+53 889 1
+53 890 1
+53 891 1
+53 933 1
+53 938 1
+53 939 1
+53 940 1
+53 941 1
+53 948 1
+53 949 1
+53 950 1
+53 951 1
+53 958 1
+53 959 1
+53 960 1
+53 961 1
+53 962 1
+53 963 1
+53 1004 1
+53 1009 1
+53 1014 1
+53 1015 1
+53 1016 1
+53 1017 1
+53 1059 1
+53 1064 1
+53 1065 1
+53 1066 1
+53 1067 1
+53 1074 1
+53 1075 1
+53 1076 1
+53 1077 1
+53 1084 1
+53 1085 1
+53 1086 1
+53 1087 1
+53 1088 1
+53 1089 1
+53 1129 1
+53 1134 1
+53 1135 1
+53 1136 1
+53 1137 1
+53 1144 1
+53 1145 1
+53 1146 1
+53 1147 1
+53 1154 1
+53 1155 1
+53 1156 1
+53 1157 1
+53 1158 1
+53 1159 1
+53 1199 1
+53 1200 1
+53 1201 1
+53 1202 1
+53 1209 1
+53 1210 1
+53 1211 1
+53 1212 1
+53 1213 1
+53 1214 1
+53 1219 1
+53 1220 1
+53 1221 1
+53 1222 1
+53 1223 1
+53 1224 1
+53 1229 1
+53 1230 1
+53 1231 1
+53 1232 1
+53 1256 1
+53 1261 1
+53 1266 1
+53 1267 1
+53 1268 1
+53 1269 1
+53 1311 1
+53 1316 1
+53 1317 1
+53 1318 1
+53 1319 1
+53 1326 1
+53 1327 1
+53 1328 1
+53 1329 1
+53 1336 1
+53 1337 1
+53 1338 1
+53 1339 1
+53 1340 1
+53 1341 1
+53 1381 1
+53 1386 1
+53 1387 1
+53 1388 1
+53 1389 1
+53 1396 1
+53 1397 1
+53 1398 1
+53 1399 1
+53 1406 1
+53 1407 1
+53 1408 1
+53 1409 1
+53 1410 1
+53 1411 1
+53 1451 1
+53 1452 1
+53 1453 1
+53 1454 1
+53 1461 1
+53 1462 1
+53 1463 1
+53 1464 1
+53 1465 1
+53 1466 1
+53 1471 1
+53 1472 1
+53 1473 1
+53 1474 1
+53 1475 1
+53 1476 1
+53 1481 1
+53 1482 1
+53 1483 1
+53 1484 1
+53 1507 1
+53 1512 1
+53 1513 1
+53 1514 1
+53 1515 1
+53 1522 1
+53 1523 1
+53 1524 1
+53 1525 1
+53 1532 1
+53 1533 1
+53 1534 1
+53 1535 1
+53 1536 1
+53 1537 1
+53 1577 1
+53 1578 1
+53 1579 1
+53 1580 1
+53 1587 1
+53 1588 1
+53 1589 1
+53 1590 1
+53 1591 1
+53 1592 1
+53 1597 1
+53 1598 1
+53 1599 1
+53 1600 1
+53 1601 1
+53 1602 1
+53 1607 1
+53 1608 1
+53 1609 1
+53 1610 1
+53 1633 1
+53 1634 1
+53 1635 1
+53 1636 1
+53 1643 1
+53 1644 1
+53 1645 1
+53 1646 1
+53 1647 1
+53 1648 1
+53 1653 1
+53 1654 1
+53 1655 1
+53 1656 1
+53 1657 1
+53 1658 1
+53 1663 1
+53 1664 1
+53 1665 1
+53 1666 1
+53 1689 1
+53 1690 1
+53 1691 1
+53 1692 1
+53 1693 1
+53 1694 1
+53 1699 1
+53 1700 1
+53 1701 1
+53 1702 1
+53 1704 1
+53 1705 1
+53 1706 1
+53 1707 1
+53 1709 1
+54 12 1
+54 40 1
+54 67 1
+54 72 1
+54 76 1
+54 80 1
+54 81 1
+54 82 1
+54 124 1
+54 151 1
+54 156 1
+54 160 1
+54 164 1
+54 165 1
+54 166 1
+54 207 1
+54 212 1
+54 216 1
+54 220 1
+54 221 1
+54 222 1
+54 262 1
+54 266 1
+54 270 1
+54 271 1
+54 272 1
+54 276 1
+54 280 1
+54 281 1
+54 282 1
+54 286 1
+54 287 1
+54 288 1
+54 292 1
+54 293 1
+54 294 1
+54 334 1
+54 361 1
+54 366 1
+54 370 1
+54 374 1
+54 375 1
+54 376 1
+54 417 1
+54 422 1
+54 426 1
+54 430 1
+54 431 1
+54 432 1
+54 472 1
+54 476 1
+54 480 1
+54 481 1
+54 482 1
+54 486 1
+54 490 1
+54 491 1
+54 492 1
+54 496 1
+54 497 1
+54 498 1
+54 502 1
+54 503 1
+54 504 1
+54 543 1
+54 548 1
+54 552 1
+54 556 1
+54 557 1
+54 558 1
+54 598 1
+54 602 1
+54 606 1
+54 607 1
+54 608 1
+54 612 1
+54 616 1
+54 617 1
+54 618 1
+54 622 1
+54 623 1
+54 624 1
+54 628 1
+54 629 1
+54 630 1
+54 668 1
+54 672 1
+54 676 1
+54 677 1
+54 678 1
+54 682 1
+54 686 1
+54 687 1
+54 688 1
+54 692 1
+54 693 1
+54 694 1
+54 698 1
+54 699 1
+54 700 1
+54 737 1
+54 741 1
+54 742 1
+54 743 1
+54 747 1
+54 748 1
+54 749 1
+54 753 1
+54 754 1
+54 755 1
+54 757 1
+54 758 1
+54 759 1
+54 763 1
+54 764 1
+54 765 1
+54 767 1
+54 768 1
+54 769 1
+54 771 1
+54 796 1
+54 823 1
+54 828 1
+54 832 1
+54 836 1
+54 837 1
+54 838 1
+54 879 1
+54 884 1
+54 888 1
+54 892 1
+54 893 1
+54 894 1
+54 934 1
+54 938 1
+54 942 1
+54 943 1
+54 944 1
+54 948 1
+54 952 1
+54 953 1
+54 954 1
+54 958 1
+54 959 1
+54 960 1
+54 964 1
+54 965 1
+54 966 1
+54 1005 1
+54 1010 1
+54 1014 1
+54 1018 1
+54 1019 1
+54 1020 1
+54 1060 1
+54 1064 1
+54 1068 1
+54 1069 1
+54 1070 1
+54 1074 1
+54 1078 1
+54 1079 1
+54 1080 1
+54 1084 1
+54 1085 1
+54 1086 1
+54 1090 1
+54 1091 1
+54 1092 1
+54 1130 1
+54 1134 1
+54 1138 1
+54 1139 1
+54 1140 1
+54 1144 1
+54 1148 1
+54 1149 1
+54 1150 1
+54 1154 1
+54 1155 1
+54 1156 1
+54 1160 1
+54 1161 1
+54 1162 1
+54 1199 1
+54 1203 1
+54 1204 1
+54 1205 1
+54 1209 1
+54 1210 1
+54 1211 1
+54 1215 1
+54 1216 1
+54 1217 1
+54 1219 1
+54 1220 1
+54 1221 1
+54 1225 1
+54 1226 1
+54 1227 1
+54 1229 1
+54 1230 1
+54 1231 1
+54 1233 1
+54 1257 1
+54 1262 1
+54 1266 1
+54 1270 1
+54 1271 1
+54 1272 1
+54 1312 1
+54 1316 1
+54 1320 1
+54 1321 1
+54 1322 1
+54 1326 1
+54 1330 1
+54 1331 1
+54 1332 1
+54 1336 1
+54 1337 1
+54 1338 1
+54 1342 1
+54 1343 1
+54 1344 1
+54 1382 1
+54 1386 1
+54 1390 1
+54 1391 1
+54 1392 1
+54 1396 1
+54 1400 1
+54 1401 1
+54 1402 1
+54 1406 1
+54 1407 1
+54 1408 1
+54 1412 1
+54 1413 1
+54 1414 1
+54 1451 1
+54 1455 1
+54 1456 1
+54 1457 1
+54 1461 1
+54 1462 1
+54 1463 1
+54 1467 1
+54 1468 1
+54 1469 1
+54 1471 1
+54 1472 1
+54 1473 1
+54 1477 1
+54 1478 1
+54 1479 1
+54 1481 1
+54 1482 1
+54 1483 1
+54 1485 1
+54 1508 1
+54 1512 1
+54 1516 1
+54 1517 1
+54 1518 1
+54 1522 1
+54 1526 1
+54 1527 1
+54 1528 1
+54 1532 1
+54 1533 1
+54 1534 1
+54 1538 1
+54 1539 1
+54 1540 1
+54 1577 1
+54 1581 1
+54 1582 1
+54 1583 1
+54 1587 1
+54 1588 1
+54 1589 1
+54 1593 1
+54 1594 1
+54 1595 1
+54 1597 1
+54 1598 1
+54 1599 1
+54 1603 1
+54 1604 1
+54 1605 1
+54 1607 1
+54 1608 1
+54 1609 1
+54 1611 1
+54 1633 1
+54 1637 1
+54 1638 1
+54 1639 1
+54 1643 1
+54 1644 1
+54 1645 1
+54 1649 1
+54 1650 1
+54 1651 1
+54 1653 1
+54 1654 1
+54 1655 1
+54 1659 1
+54 1660 1
+54 1661 1
+54 1663 1
+54 1664 1
+54 1665 1
+54 1667 1
+54 1689 1
+54 1690 1
+54 1691 1
+54 1695 1
+54 1696 1
+54 1697 1
+54 1699 1
+54 1700 1
+54 1701 1
+54 1703 1
+54 1704 1
+54 1705 1
+54 1706 1
+54 1708 1
+54 1709 1
+55 13 1
+55 41 1
+55 68 1
+55 73 1
+55 77 1
+55 80 1
+55 83 1
+55 84 1
+55 125 1
+55 152 1
+55 157 1
+55 161 1
+55 164 1
+55 167 1
+55 168 1
+55 208 1
+55 213 1
+55 217 1
+55 220 1
+55 223 1
+55 224 1
+55 263 1
+55 267 1
+55 270 1
+55 273 1
+55 274 1
+55 277 1
+55 280 1
+55 283 1
+55 284 1
+55 286 1
+55 289 1
+55 290 1
+55 292 1
+55 293 1
+55 295 1
+55 335 1
+55 362 1
+55 367 1
+55 371 1
+55 374 1
+55 377 1
+55 378 1
+55 418 1
+55 423 1
+55 427 1
+55 430 1
+55 433 1
+55 434 1
+55 473 1
+55 477 1
+55 480 1
+55 483 1
+55 484 1
+55 487 1
+55 490 1
+55 493 1
+55 494 1
+55 496 1
+55 499 1
+55 500 1
+55 502 1
+55 503 1
+55 505 1
+55 544 1
+55 549 1
+55 553 1
+55 556 1
+55 559 1
+55 560 1
+55 599 1
+55 603 1
+55 606 1
+55 609 1
+55 610 1
+55 613 1
+55 616 1
+55 619 1
+55 620 1
+55 622 1
+55 625 1
+55 626 1
+55 628 1
+55 629 1
+55 631 1
+55 669 1
+55 673 1
+55 676 1
+55 679 1
+55 680 1
+55 683 1
+55 686 1
+55 689 1
+55 690 1
+55 692 1
+55 695 1
+55 696 1
+55 698 1
+55 699 1
+55 701 1
+55 738 1
+55 741 1
+55 744 1
+55 745 1
+55 747 1
+55 750 1
+55 751 1
+55 753 1
+55 754 1
+55 756 1
+55 757 1
+55 760 1
+55 761 1
+55 763 1
+55 764 1
+55 766 1
+55 767 1
+55 768 1
+55 770 1
+55 771 1
+55 797 1
+55 824 1
+55 829 1
+55 833 1
+55 836 1
+55 839 1
+55 840 1
+55 880 1
+55 885 1
+55 889 1
+55 892 1
+55 895 1
+55 896 1
+55 935 1
+55 939 1
+55 942 1
+55 945 1
+55 946 1
+55 949 1
+55 952 1
+55 955 1
+55 956 1
+55 958 1
+55 961 1
+55 962 1
+55 964 1
+55 965 1
+55 967 1
+55 1006 1
+55 1011 1
+55 1015 1
+55 1018 1
+55 1021 1
+55 1022 1
+55 1061 1
+55 1065 1
+55 1068 1
+55 1071 1
+55 1072 1
+55 1075 1
+55 1078 1
+55 1081 1
+55 1082 1
+55 1084 1
+55 1087 1
+55 1088 1
+55 1090 1
+55 1091 1
+55 1093 1
+55 1131 1
+55 1135 1
+55 1138 1
+55 1141 1
+55 1142 1
+55 1145 1
+55 1148 1
+55 1151 1
+55 1152 1
+55 1154 1
+55 1157 1
+55 1158 1
+55 1160 1
+55 1161 1
+55 1163 1
+55 1200 1
+55 1203 1
+55 1206 1
+55 1207 1
+55 1209 1
+55 1212 1
+55 1213 1
+55 1215 1
+55 1216 1
+55 1218 1
+55 1219 1
+55 1222 1
+55 1223 1
+55 1225 1
+55 1226 1
+55 1228 1
+55 1229 1
+55 1230 1
+55 1232 1
+55 1233 1
+55 1258 1
+55 1263 1
+55 1267 1
+55 1270 1
+55 1273 1
+55 1274 1
+55 1313 1
+55 1317 1
+55 1320 1
+55 1323 1
+55 1324 1
+55 1327 1
+55 1330 1
+55 1333 1
+55 1334 1
+55 1336 1
+55 1339 1
+55 1340 1
+55 1342 1
+55 1343 1
+55 1345 1
+55 1383 1
+55 1387 1
+55 1390 1
+55 1393 1
+55 1394 1
+55 1397 1
+55 1400 1
+55 1403 1
+55 1404 1
+55 1406 1
+55 1409 1
+55 1410 1
+55 1412 1
+55 1413 1
+55 1415 1
+55 1452 1
+55 1455 1
+55 1458 1
+55 1459 1
+55 1461 1
+55 1464 1
+55 1465 1
+55 1467 1
+55 1468 1
+55 1470 1
+55 1471 1
+55 1474 1
+55 1475 1
+55 1477 1
+55 1478 1
+55 1480 1
+55 1481 1
+55 1482 1
+55 1484 1
+55 1485 1
+55 1509 1
+55 1513 1
+55 1516 1
+55 1519 1
+55 1520 1
+55 1523 1
+55 1526 1
+55 1529 1
+55 1530 1
+55 1532 1
+55 1535 1
+55 1536 1
+55 1538 1
+55 1539 1
+55 1541 1
+55 1578 1
+55 1581 1
+55 1584 1
+55 1585 1
+55 1587 1
+55 1590 1
+55 1591 1
+55 1593 1
+55 1594 1
+55 1596 1
+55 1597 1
+55 1600 1
+55 1601 1
+55 1603 1
+55 1604 1
+55 1606 1
+55 1607 1
+55 1608 1
+55 1610 1
+55 1611 1
+55 1634 1
+55 1637 1
+55 1640 1
+55 1641 1
+55 1643 1
+55 1646 1
+55 1647 1
+55 1649 1
+55 1650 1
+55 1652 1
+55 1653 1
+55 1656 1
+55 1657 1
+55 1659 1
+55 1660 1
+55 1662 1
+55 1663 1
+55 1664 1
+55 1666 1
+55 1667 1
+55 1689 1
+55 1692 1
+55 1693 1
+55 1695 1
+55 1696 1
+55 1698 1
+55 1699 1
+55 1700 1
+55 1702 1
+55 1703 1
+55 1704 1
+55 1705 1
+55 1707 1
+55 1708 1
+55 1709 1
+56 14 1
+56 42 1
+56 69 1
+56 74 1
+56 78 1
+56 81 1
+56 83 1
+56 85 1
+56 126 1
+56 153 1
+56 158 1
+56 162 1
+56 165 1
+56 167 1
+56 169 1
+56 209 1
+56 214 1
+56 218 1
+56 221 1
+56 223 1
+56 225 1
+56 264 1
+56 268 1
+56 271 1
+56 273 1
+56 275 1
+56 278 1
+56 281 1
+56 283 1
+56 285 1
+56 287 1
+56 289 1
+56 291 1
+56 292 1
+56 294 1
+56 295 1
+56 336 1
+56 363 1
+56 368 1
+56 372 1
+56 375 1
+56 377 1
+56 379 1
+56 419 1
+56 424 1
+56 428 1
+56 431 1
+56 433 1
+56 435 1
+56 474 1
+56 478 1
+56 481 1
+56 483 1
+56 485 1
+56 488 1
+56 491 1
+56 493 1
+56 495 1
+56 497 1
+56 499 1
+56 501 1
+56 502 1
+56 504 1
+56 505 1
+56 545 1
+56 550 1
+56 554 1
+56 557 1
+56 559 1
+56 561 1
+56 600 1
+56 604 1
+56 607 1
+56 609 1
+56 611 1
+56 614 1
+56 617 1
+56 619 1
+56 621 1
+56 623 1
+56 625 1
+56 627 1
+56 628 1
+56 630 1
+56 631 1
+56 670 1
+56 674 1
+56 677 1
+56 679 1
+56 681 1
+56 684 1
+56 687 1
+56 689 1
+56 691 1
+56 693 1
+56 695 1
+56 697 1
+56 698 1
+56 700 1
+56 701 1
+56 739 1
+56 742 1
+56 744 1
+56 746 1
+56 748 1
+56 750 1
+56 752 1
+56 753 1
+56 755 1
+56 756 1
+56 758 1
+56 760 1
+56 762 1
+56 763 1
+56 765 1
+56 766 1
+56 767 1
+56 769 1
+56 770 1
+56 771 1
+56 798 1
+56 825 1
+56 830 1
+56 834 1
+56 837 1
+56 839 1
+56 841 1
+56 881 1
+56 886 1
+56 890 1
+56 893 1
+56 895 1
+56 897 1
+56 936 1
+56 940 1
+56 943 1
+56 945 1
+56 947 1
+56 950 1
+56 953 1
+56 955 1
+56 957 1
+56 959 1
+56 961 1
+56 963 1
+56 964 1
+56 966 1
+56 967 1
+56 1007 1
+56 1012 1
+56 1016 1
+56 1019 1
+56 1021 1
+56 1023 1
+56 1062 1
+56 1066 1
+56 1069 1
+56 1071 1
+56 1073 1
+56 1076 1
+56 1079 1
+56 1081 1
+56 1083 1
+56 1085 1
+56 1087 1
+56 1089 1
+56 1090 1
+56 1092 1
+56 1093 1
+56 1132 1
+56 1136 1
+56 1139 1
+56 1141 1
+56 1143 1
+56 1146 1
+56 1149 1
+56 1151 1
+56 1153 1
+56 1155 1
+56 1157 1
+56 1159 1
+56 1160 1
+56 1162 1
+56 1163 1
+56 1201 1
+56 1204 1
+56 1206 1
+56 1208 1
+56 1210 1
+56 1212 1
+56 1214 1
+56 1215 1
+56 1217 1
+56 1218 1
+56 1220 1
+56 1222 1
+56 1224 1
+56 1225 1
+56 1227 1
+56 1228 1
+56 1229 1
+56 1231 1
+56 1232 1
+56 1233 1
+56 1259 1
+56 1264 1
+56 1268 1
+56 1271 1
+56 1273 1
+56 1275 1
+56 1314 1
+56 1318 1
+56 1321 1
+56 1323 1
+56 1325 1
+56 1328 1
+56 1331 1
+56 1333 1
+56 1335 1
+56 1337 1
+56 1339 1
+56 1341 1
+56 1342 1
+56 1344 1
+56 1345 1
+56 1384 1
+56 1388 1
+56 1391 1
+56 1393 1
+56 1395 1
+56 1398 1
+56 1401 1
+56 1403 1
+56 1405 1
+56 1407 1
+56 1409 1
+56 1411 1
+56 1412 1
+56 1414 1
+56 1415 1
+56 1453 1
+56 1456 1
+56 1458 1
+56 1460 1
+56 1462 1
+56 1464 1
+56 1466 1
+56 1467 1
+56 1469 1
+56 1470 1
+56 1472 1
+56 1474 1
+56 1476 1
+56 1477 1
+56 1479 1
+56 1480 1
+56 1481 1
+56 1483 1
+56 1484 1
+56 1485 1
+56 1510 1
+56 1514 1
+56 1517 1
+56 1519 1
+56 1521 1
+56 1524 1
+56 1527 1
+56 1529 1
+56 1531 1
+56 1533 1
+56 1535 1
+56 1537 1
+56 1538 1
+56 1540 1
+56 1541 1
+56 1579 1
+56 1582 1
+56 1584 1
+56 1586 1
+56 1588 1
+56 1590 1
+56 1592 1
+56 1593 1
+56 1595 1
+56 1596 1
+56 1598 1
+56 1600 1
+56 1602 1
+56 1603 1
+56 1605 1
+56 1606 1
+56 1607 1
+56 1609 1
+56 1610 1
+56 1611 1
+56 1635 1
+56 1638 1
+56 1640 1
+56 1642 1
+56 1644 1
+56 1646 1
+56 1648 1
+56 1649 1
+56 1651 1
+56 1652 1
+56 1654 1
+56 1656 1
+56 1658 1
+56 1659 1
+56 1661 1
+56 1662 1
+56 1663 1
+56 1665 1
+56 1666 1
+56 1667 1
+56 1690 1
+56 1692 1
+56 1694 1
+56 1695 1
+56 1697 1
+56 1698 1
+56 1699 1
+56 1701 1
+56 1702 1
+56 1703 1
+56 1704 1
+56 1706 1
+56 1707 1
+56 1708 1
+56 1709 1
+57 15 1
+57 43 1
+57 70 1
+57 75 1
+57 79 1
+57 82 1
+57 84 1
+57 85 1
+57 127 1
+57 154 1
+57 159 1
+57 163 1
+57 166 1
+57 168 1
+57 169 1
+57 210 1
+57 215 1
+57 219 1
+57 222 1
+57 224 1
+57 225 1
+57 265 1
+57 269 1
+57 272 1
+57 274 1
+57 275 1
+57 279 1
+57 282 1
+57 284 1
+57 285 1
+57 288 1
+57 290 1
+57 291 1
+57 293 1
+57 294 1
+57 295 1
+57 337 1
+57 364 1
+57 369 1
+57 373 1
+57 376 1
+57 378 1
+57 379 1
+57 420 1
+57 425 1
+57 429 1
+57 432 1
+57 434 1
+57 435 1
+57 475 1
+57 479 1
+57 482 1
+57 484 1
+57 485 1
+57 489 1
+57 492 1
+57 494 1
+57 495 1
+57 498 1
+57 500 1
+57 501 1
+57 503 1
+57 504 1
+57 505 1
+57 546 1
+57 551 1
+57 555 1
+57 558 1
+57 560 1
+57 561 1
+57 601 1
+57 605 1
+57 608 1
+57 610 1
+57 611 1
+57 615 1
+57 618 1
+57 620 1
+57 621 1
+57 624 1
+57 626 1
+57 627 1
+57 629 1
+57 630 1
+57 631 1
+57 671 1
+57 675 1
+57 678 1
+57 680 1
+57 681 1
+57 685 1
+57 688 1
+57 690 1
+57 691 1
+57 694 1
+57 696 1
+57 697 1
+57 699 1
+57 700 1
+57 701 1
+57 740 1
+57 743 1
+57 745 1
+57 746 1
+57 749 1
+57 751 1
+57 752 1
+57 754 1
+57 755 1
+57 756 1
+57 759 1
+57 761 1
+57 762 1
+57 764 1
+57 765 1
+57 766 1
+57 768 1
+57 769 1
+57 770 1
+57 771 1
+57 799 1
+57 826 1
+57 831 1
+57 835 1
+57 838 1
+57 840 1
+57 841 1
+57 882 1
+57 887 1
+57 891 1
+57 894 1
+57 896 1
+57 897 1
+57 937 1
+57 941 1
+57 944 1
+57 946 1
+57 947 1
+57 951 1
+57 954 1
+57 956 1
+57 957 1
+57 960 1
+57 962 1
+57 963 1
+57 965 1
+57 966 1
+57 967 1
+57 1008 1
+57 1013 1
+57 1017 1
+57 1020 1
+57 1022 1
+57 1023 1
+57 1063 1
+57 1067 1
+57 1070 1
+57 1072 1
+57 1073 1
+57 1077 1
+57 1080 1
+57 1082 1
+57 1083 1
+57 1086 1
+57 1088 1
+57 1089 1
+57 1091 1
+57 1092 1
+57 1093 1
+57 1133 1
+57 1137 1
+57 1140 1
+57 1142 1
+57 1143 1
+57 1147 1
+57 1150 1
+57 1152 1
+57 1153 1
+57 1156 1
+57 1158 1
+57 1159 1
+57 1161 1
+57 1162 1
+57 1163 1
+57 1202 1
+57 1205 1
+57 1207 1
+57 1208 1
+57 1211 1
+57 1213 1
+57 1214 1
+57 1216 1
+57 1217 1
+57 1218 1
+57 1221 1
+57 1223 1
+57 1224 1
+57 1226 1
+57 1227 1
+57 1228 1
+57 1230 1
+57 1231 1
+57 1232 1
+57 1233 1
+57 1260 1
+57 1265 1
+57 1269 1
+57 1272 1
+57 1274 1
+57 1275 1
+57 1315 1
+57 1319 1
+57 1322 1
+57 1324 1
+57 1325 1
+57 1329 1
+57 1332 1
+57 1334 1
+57 1335 1
+57 1338 1
+57 1340 1
+57 1341 1
+57 1343 1
+57 1344 1
+57 1345 1
+57 1385 1
+57 1389 1
+57 1392 1
+57 1394 1
+57 1395 1
+57 1399 1
+57 1402 1
+57 1404 1
+57 1405 1
+57 1408 1
+57 1410 1
+57 1411 1
+57 1413 1
+57 1414 1
+57 1415 1
+57 1454 1
+57 1457 1
+57 1459 1
+57 1460 1
+57 1463 1
+57 1465 1
+57 1466 1
+57 1468 1
+57 1469 1
+57 1470 1
+57 1473 1
+57 1475 1
+57 1476 1
+57 1478 1
+57 1479 1
+57 1480 1
+57 1482 1
+57 1483 1
+57 1484 1
+57 1485 1
+57 1511 1
+57 1515 1
+57 1518 1
+57 1520 1
+57 1521 1
+57 1525 1
+57 1528 1
+57 1530 1
+57 1531 1
+57 1534 1
+57 1536 1
+57 1537 1
+57 1539 1
+57 1540 1
+57 1541 1
+57 1580 1
+57 1583 1
+57 1585 1
+57 1586 1
+57 1589 1
+57 1591 1
+57 1592 1
+57 1594 1
+57 1595 1
+57 1596 1
+57 1599 1
+57 1601 1
+57 1602 1
+57 1604 1
+57 1605 1
+57 1606 1
+57 1608 1
+57 1609 1
+57 1610 1
+57 1611 1
+57 1636 1
+57 1639 1
+57 1641 1
+57 1642 1
+57 1645 1
+57 1647 1
+57 1648 1
+57 1650 1
+57 1651 1
+57 1652 1
+57 1655 1
+57 1657 1
+57 1658 1
+57 1660 1
+57 1661 1
+57 1662 1
+57 1664 1
+57 1665 1
+57 1666 1
+57 1667 1
+57 1691 1
+57 1693 1
+57 1694 1
+57 1696 1
+57 1697 1
+57 1698 1
+57 1700 1
+57 1701 1
+57 1702 1
+57 1703 1
+57 1705 1
+57 1706 1
+57 1707 1
+57 1708 1
+57 1709 1
+58 16 1
+58 44 1
+58 65 1
+58 86 1
+58 87 1
+58 88 1
+58 89 1
+58 90 1
+58 128 1
+58 149 1
+58 170 1
+58 171 1
+58 172 1
+58 173 1
+58 174 1
+58 205 1
+58 226 1
+58 227 1
+58 228 1
+58 229 1
+58 230 1
+58 261 1
+58 262 1
+58 263 1
+58 264 1
+58 265 1
+58 296 1
+58 297 1
+58 298 1
+58 299 1
+58 300 1
+58 301 1
+58 302 1
+58 303 1
+58 304 1
+58 305 1
+58 338 1
+58 359 1
+58 380 1
+58 381 1
+58 382 1
+58 383 1
+58 384 1
+58 415 1
+58 436 1
+58 437 1
+58 438 1
+58 439 1
+58 440 1
+58 471 1
+58 472 1
+58 473 1
+58 474 1
+58 475 1
+58 506 1
+58 507 1
+58 508 1
+58 509 1
+58 510 1
+58 511 1
+58 512 1
+58 513 1
+58 514 1
+58 515 1
+58 541 1
+58 562 1
+58 563 1
+58 564 1
+58 565 1
+58 566 1
+58 597 1
+58 598 1
+58 599 1
+58 600 1
+58 601 1
+58 632 1
+58 633 1
+58 634 1
+58 635 1
+58 636 1
+58 637 1
+58 638 1
+58 639 1
+58 640 1
+58 641 1
+58 667 1
+58 668 1
+58 669 1
+58 670 1
+58 671 1
+58 702 1
+58 703 1
+58 704 1
+58 705 1
+58 706 1
+58 707 1
+58 708 1
+58 709 1
+58 710 1
+58 711 1
+58 737 1
+58 738 1
+58 739 1
+58 740 1
+58 741 1
+58 742 1
+58 743 1
+58 744 1
+58 745 1
+58 746 1
+58 772 1
+58 773 1
+58 774 1
+58 775 1
+58 776 1
+58 777 1
+58 778 1
+58 779 1
+58 780 1
+58 781 1
+58 800 1
+58 821 1
+58 842 1
+58 843 1
+58 844 1
+58 845 1
+58 846 1
+58 877 1
+58 898 1
+58 899 1
+58 900 1
+58 901 1
+58 902 1
+58 933 1
+58 934 1
+58 935 1
+58 936 1
+58 937 1
+58 968 1
+58 969 1
+58 970 1
+58 971 1
+58 972 1
+58 973 1
+58 974 1
+58 975 1
+58 976 1
+58 977 1
+58 1003 1
+58 1024 1
+58 1025 1
+58 1026 1
+58 1027 1
+58 1028 1
+58 1059 1
+58 1060 1
+58 1061 1
+58 1062 1
+58 1063 1
+58 1094 1
+58 1095 1
+58 1096 1
+58 1097 1
+58 1098 1
+58 1099 1
+58 1100 1
+58 1101 1
+58 1102 1
+58 1103 1
+58 1129 1
+58 1130 1
+58 1131 1
+58 1132 1
+58 1133 1
+58 1164 1
+58 1165 1
+58 1166 1
+58 1167 1
+58 1168 1
+58 1169 1
+58 1170 1
+58 1171 1
+58 1172 1
+58 1173 1
+58 1199 1
+58 1200 1
+58 1201 1
+58 1202 1
+58 1203 1
+58 1204 1
+58 1205 1
+58 1206 1
+58 1207 1
+58 1208 1
+58 1234 1
+58 1235 1
+58 1236 1
+58 1237 1
+58 1238 1
+58 1239 1
+58 1240 1
+58 1241 1
+58 1242 1
+58 1243 1
+58 1255 1
+58 1276 1
+58 1277 1
+58 1278 1
+58 1279 1
+58 1280 1
+58 1311 1
+58 1312 1
+58 1313 1
+58 1314 1
+58 1315 1
+58 1346 1
+58 1347 1
+58 1348 1
+58 1349 1
+58 1350 1
+58 1351 1
+58 1352 1
+58 1353 1
+58 1354 1
+58 1355 1
+58 1381 1
+58 1382 1
+58 1383 1
+58 1384 1
+58 1385 1
+58 1416 1
+58 1417 1
+58 1418 1
+58 1419 1
+58 1420 1
+58 1421 1
+58 1422 1
+58 1423 1
+58 1424 1
+58 1425 1
+58 1451 1
+58 1452 1
+58 1453 1
+58 1454 1
+58 1455 1
+58 1456 1
+58 1457 1
+58 1458 1
+58 1459 1
+58 1460 1
+58 1486 1
+58 1487 1
+58 1488 1
+58 1489 1
+58 1490 1
+58 1491 1
+58 1492 1
+58 1493 1
+58 1494 1
+58 1495 1
+58 1507 1
+58 1508 1
+58 1509 1
+58 1510 1
+58 1511 1
+58 1542 1
+58 1543 1
+58 1544 1
+58 1545 1
+58 1546 1
+58 1547 1
+58 1548 1
+58 1549 1
+58 1550 1
+58 1551 1
+58 1577 1
+58 1578 1
+58 1579 1
+58 1580 1
+58 1581 1
+58 1582 1
+58 1583 1
+58 1584 1
+58 1585 1
+58 1586 1
+58 1612 1
+58 1613 1
+58 1614 1
+58 1615 1
+58 1616 1
+58 1617 1
+58 1618 1
+58 1619 1
+58 1620 1
+58 1621 1
+58 1633 1
+58 1634 1
+58 1635 1
+58 1636 1
+58 1637 1
+58 1638 1
+58 1639 1
+58 1640 1
+58 1641 1
+58 1642 1
+58 1668 1
+58 1669 1
+58 1670 1
+58 1671 1
+58 1672 1
+58 1673 1
+58 1674 1
+58 1675 1
+58 1676 1
+58 1677 1
+58 1689 1
+58 1690 1
+58 1691 1
+58 1692 1
+58 1693 1
+58 1694 1
+58 1695 1
+58 1696 1
+58 1697 1
+58 1698 1
+58 1710 1
+58 1711 1
+58 1712 1
+58 1713 1
+58 1714 1
+59 17 1
+59 45 1
+59 66 1
+59 86 1
+59 91 1
+59 92 1
+59 93 1
+59 94 1
+59 129 1
+59 150 1
+59 170 1
+59 175 1
+59 176 1
+59 177 1
+59 178 1
+59 206 1
+59 226 1
+59 231 1
+59 232 1
+59 233 1
+59 234 1
+59 261 1
+59 266 1
+59 267 1
+59 268 1
+59 269 1
+59 296 1
+59 297 1
+59 298 1
+59 299 1
+59 306 1
+59 307 1
+59 308 1
+59 309 1
+59 310 1
+59 311 1
+59 339 1
+59 360 1
+59 380 1
+59 385 1
+59 386 1
+59 387 1
+59 388 1
+59 416 1
+59 436 1
+59 441 1
+59 442 1
+59 443 1
+59 444 1
+59 471 1
+59 476 1
+59 477 1
+59 478 1
+59 479 1
+59 506 1
+59 507 1
+59 508 1
+59 509 1
+59 516 1
+59 517 1
+59 518 1
+59 519 1
+59 520 1
+59 521 1
+59 542 1
+59 562 1
+59 567 1
+59 568 1
+59 569 1
+59 570 1
+59 597 1
+59 602 1
+59 603 1
+59 604 1
+59 605 1
+59 632 1
+59 633 1
+59 634 1
+59 635 1
+59 642 1
+59 643 1
+59 644 1
+59 645 1
+59 646 1
+59 647 1
+59 667 1
+59 672 1
+59 673 1
+59 674 1
+59 675 1
+59 702 1
+59 703 1
+59 704 1
+59 705 1
+59 712 1
+59 713 1
+59 714 1
+59 715 1
+59 716 1
+59 717 1
+59 737 1
+59 738 1
+59 739 1
+59 740 1
+59 747 1
+59 748 1
+59 749 1
+59 750 1
+59 751 1
+59 752 1
+59 772 1
+59 773 1
+59 774 1
+59 775 1
+59 776 1
+59 777 1
+59 782 1
+59 783 1
+59 784 1
+59 785 1
+59 801 1
+59 822 1
+59 842 1
+59 847 1
+59 848 1
+59 849 1
+59 850 1
+59 878 1
+59 898 1
+59 903 1
+59 904 1
+59 905 1
+59 906 1
+59 933 1
+59 938 1
+59 939 1
+59 940 1
+59 941 1
+59 968 1
+59 969 1
+59 970 1
+59 971 1
+59 978 1
+59 979 1
+59 980 1
+59 981 1
+59 982 1
+59 983 1
+59 1004 1
+59 1024 1
+59 1029 1
+59 1030 1
+59 1031 1
+59 1032 1
+59 1059 1
+59 1064 1
+59 1065 1
+59 1066 1
+59 1067 1
+59 1094 1
+59 1095 1
+59 1096 1
+59 1097 1
+59 1104 1
+59 1105 1
+59 1106 1
+59 1107 1
+59 1108 1
+59 1109 1
+59 1129 1
+59 1134 1
+59 1135 1
+59 1136 1
+59 1137 1
+59 1164 1
+59 1165 1
+59 1166 1
+59 1167 1
+59 1174 1
+59 1175 1
+59 1176 1
+59 1177 1
+59 1178 1
+59 1179 1
+59 1199 1
+59 1200 1
+59 1201 1
+59 1202 1
+59 1209 1
+59 1210 1
+59 1211 1
+59 1212 1
+59 1213 1
+59 1214 1
+59 1234 1
+59 1235 1
+59 1236 1
+59 1237 1
+59 1238 1
+59 1239 1
+59 1244 1
+59 1245 1
+59 1246 1
+59 1247 1
+59 1256 1
+59 1276 1
+59 1281 1
+59 1282 1
+59 1283 1
+59 1284 1
+59 1311 1
+59 1316 1
+59 1317 1
+59 1318 1
+59 1319 1
+59 1346 1
+59 1347 1
+59 1348 1
+59 1349 1
+59 1356 1
+59 1357 1
+59 1358 1
+59 1359 1
+59 1360 1
+59 1361 1
+59 1381 1
+59 1386 1
+59 1387 1
+59 1388 1
+59 1389 1
+59 1416 1
+59 1417 1
+59 1418 1
+59 1419 1
+59 1426 1
+59 1427 1
+59 1428 1
+59 1429 1
+59 1430 1
+59 1431 1
+59 1451 1
+59 1452 1
+59 1453 1
+59 1454 1
+59 1461 1
+59 1462 1
+59 1463 1
+59 1464 1
+59 1465 1
+59 1466 1
+59 1486 1
+59 1487 1
+59 1488 1
+59 1489 1
+59 1490 1
+59 1491 1
+59 1496 1
+59 1497 1
+59 1498 1
+59 1499 1
+59 1507 1
+59 1512 1
+59 1513 1
+59 1514 1
+59 1515 1
+59 1542 1
+59 1543 1
+59 1544 1
+59 1545 1
+59 1552 1
+59 1553 1
+59 1554 1
+59 1555 1
+59 1556 1
+59 1557 1
+59 1577 1
+59 1578 1
+59 1579 1
+59 1580 1
+59 1587 1
+59 1588 1
+59 1589 1
+59 1590 1
+59 1591 1
+59 1592 1
+59 1612 1
+59 1613 1
+59 1614 1
+59 1615 1
+59 1616 1
+59 1617 1
+59 1622 1
+59 1623 1
+59 1624 1
+59 1625 1
+59 1633 1
+59 1634 1
+59 1635 1
+59 1636 1
+59 1643 1
+59 1644 1
+59 1645 1
+59 1646 1
+59 1647 1
+59 1648 1
+59 1668 1
+59 1669 1
+59 1670 1
+59 1671 1
+59 1672 1
+59 1673 1
+59 1678 1
+59 1679 1
+59 1680 1
+59 1681 1
+59 1689 1
+59 1690 1
+59 1691 1
+59 1692 1
+59 1693 1
+59 1694 1
+59 1699 1
+59 1700 1
+59 1701 1
+59 1702 1
+59 1710 1
+59 1711 1
+59 1712 1
+59 1713 1
+59 1715 1
+60 18 1
+60 46 1
+60 67 1
+60 87 1
+60 91 1
+60 95 1
+60 96 1
+60 97 1
+60 130 1
+60 151 1
+60 171 1
+60 175 1
+60 179 1
+60 180 1
+60 181 1
+60 207 1
+60 227 1
+60 231 1
+60 235 1
+60 236 1
+60 237 1
+60 262 1
+60 266 1
+60 270 1
+60 271 1
+60 272 1
+60 296 1
+60 300 1
+60 301 1
+60 302 1
+60 306 1
+60 307 1
+60 308 1
+60 312 1
+60 313 1
+60 314 1
+60 340 1
+60 361 1
+60 381 1
+60 385 1
+60 389 1
+60 390 1
+60 391 1
+60 417 1
+60 437 1
+60 441 1
+60 445 1
+60 446 1
+60 447 1
+60 472 1
+60 476 1
+60 480 1
+60 481 1
+60 482 1
+60 506 1
+60 510 1
+60 511 1
+60 512 1
+60 516 1
+60 517 1
+60 518 1
+60 522 1
+60 523 1
+60 524 1
+60 543 1
+60 563 1
+60 567 1
+60 571 1
+60 572 1
+60 573 1
+60 598 1
+60 602 1
+60 606 1
+60 607 1
+60 608 1
+60 632 1
+60 636 1
+60 637 1
+60 638 1
+60 642 1
+60 643 1
+60 644 1
+60 648 1
+60 649 1
+60 650 1
+60 668 1
+60 672 1
+60 676 1
+60 677 1
+60 678 1
+60 702 1
+60 706 1
+60 707 1
+60 708 1
+60 712 1
+60 713 1
+60 714 1
+60 718 1
+60 719 1
+60 720 1
+60 737 1
+60 741 1
+60 742 1
+60 743 1
+60 747 1
+60 748 1
+60 749 1
+60 753 1
+60 754 1
+60 755 1
+60 772 1
+60 773 1
+60 774 1
+60 778 1
+60 779 1
+60 780 1
+60 782 1
+60 783 1
+60 784 1
+60 786 1
+60 802 1
+60 823 1
+60 843 1
+60 847 1
+60 851 1
+60 852 1
+60 853 1
+60 879 1
+60 899 1
+60 903 1
+60 907 1
+60 908 1
+60 909 1
+60 934 1
+60 938 1
+60 942 1
+60 943 1
+60 944 1
+60 968 1
+60 972 1
+60 973 1
+60 974 1
+60 978 1
+60 979 1
+60 980 1
+60 984 1
+60 985 1
+60 986 1
+60 1005 1
+60 1025 1
+60 1029 1
+60 1033 1
+60 1034 1
+60 1035 1
+60 1060 1
+60 1064 1
+60 1068 1
+60 1069 1
+60 1070 1
+60 1094 1
+60 1098 1
+60 1099 1
+60 1100 1
+60 1104 1
+60 1105 1
+60 1106 1
+60 1110 1
+60 1111 1
+60 1112 1
+60 1130 1
+60 1134 1
+60 1138 1
+60 1139 1
+60 1140 1
+60 1164 1
+60 1168 1
+60 1169 1
+60 1170 1
+60 1174 1
+60 1175 1
+60 1176 1
+60 1180 1
+60 1181 1
+60 1182 1
+60 1199 1
+60 1203 1
+60 1204 1
+60 1205 1
+60 1209 1
+60 1210 1
+60 1211 1
+60 1215 1
+60 1216 1
+60 1217 1
+60 1234 1
+60 1235 1
+60 1236 1
+60 1240 1
+60 1241 1
+60 1242 1
+60 1244 1
+60 1245 1
+60 1246 1
+60 1248 1
+60 1257 1
+60 1277 1
+60 1281 1
+60 1285 1
+60 1286 1
+60 1287 1
+60 1312 1
+60 1316 1
+60 1320 1
+60 1321 1
+60 1322 1
+60 1346 1
+60 1350 1
+60 1351 1
+60 1352 1
+60 1356 1
+60 1357 1
+60 1358 1
+60 1362 1
+60 1363 1
+60 1364 1
+60 1382 1
+60 1386 1
+60 1390 1
+60 1391 1
+60 1392 1
+60 1416 1
+60 1420 1
+60 1421 1
+60 1422 1
+60 1426 1
+60 1427 1
+60 1428 1
+60 1432 1
+60 1433 1
+60 1434 1
+60 1451 1
+60 1455 1
+60 1456 1
+60 1457 1
+60 1461 1
+60 1462 1
+60 1463 1
+60 1467 1
+60 1468 1
+60 1469 1
+60 1486 1
+60 1487 1
+60 1488 1
+60 1492 1
+60 1493 1
+60 1494 1
+60 1496 1
+60 1497 1
+60 1498 1
+60 1500 1
+60 1508 1
+60 1512 1
+60 1516 1
+60 1517 1
+60 1518 1
+60 1542 1
+60 1546 1
+60 1547 1
+60 1548 1
+60 1552 1
+60 1553 1
+60 1554 1
+60 1558 1
+60 1559 1
+60 1560 1
+60 1577 1
+60 1581 1
+60 1582 1
+60 1583 1
+60 1587 1
+60 1588 1
+60 1589 1
+60 1593 1
+60 1594 1
+60 1595 1
+60 1612 1
+60 1613 1
+60 1614 1
+60 1618 1
+60 1619 1
+60 1620 1
+60 1622 1
+60 1623 1
+60 1624 1
+60 1626 1
+60 1633 1
+60 1637 1
+60 1638 1
+60 1639 1
+60 1643 1
+60 1644 1
+60 1645 1
+60 1649 1
+60 1650 1
+60 1651 1
+60 1668 1
+60 1669 1
+60 1670 1
+60 1674 1
+60 1675 1
+60 1676 1
+60 1678 1
+60 1679 1
+60 1680 1
+60 1682 1
+60 1689 1
+60 1690 1
+60 1691 1
+60 1695 1
+60 1696 1
+60 1697 1
+60 1699 1
+60 1700 1
+60 1701 1
+60 1703 1
+60 1710 1
+60 1711 1
+60 1712 1
+60 1714 1
+60 1715 1
+61 19 1
+61 47 1
+61 68 1
+61 88 1
+61 92 1
+61 95 1
+61 98 1
+61 99 1
+61 131 1
+61 152 1
+61 172 1
+61 176 1
+61 179 1
+61 182 1
+61 183 1
+61 208 1
+61 228 1
+61 232 1
+61 235 1
+61 238 1
+61 239 1
+61 263 1
+61 267 1
+61 270 1
+61 273 1
+61 274 1
+61 297 1
+61 300 1
+61 303 1
+61 304 1
+61 306 1
+61 309 1
+61 310 1
+61 312 1
+61 313 1
+61 315 1
+61 341 1
+61 362 1
+61 382 1
+61 386 1
+61 389 1
+61 392 1
+61 393 1
+61 418 1
+61 438 1
+61 442 1
+61 445 1
+61 448 1
+61 449 1
+61 473 1
+61 477 1
+61 480 1
+61 483 1
+61 484 1
+61 507 1
+61 510 1
+61 513 1
+61 514 1
+61 516 1
+61 519 1
+61 520 1
+61 522 1
+61 523 1
+61 525 1
+61 544 1
+61 564 1
+61 568 1
+61 571 1
+61 574 1
+61 575 1
+61 599 1
+61 603 1
+61 606 1
+61 609 1
+61 610 1
+61 633 1
+61 636 1
+61 639 1
+61 640 1
+61 642 1
+61 645 1
+61 646 1
+61 648 1
+61 649 1
+61 651 1
+61 669 1
+61 673 1
+61 676 1
+61 679 1
+61 680 1
+61 703 1
+61 706 1
+61 709 1
+61 710 1
+61 712 1
+61 715 1
+61 716 1
+61 718 1
+61 719 1
+61 721 1
+61 738 1
+61 741 1
+61 744 1
+61 745 1
+61 747 1
+61 750 1
+61 751 1
+61 753 1
+61 754 1
+61 756 1
+61 772 1
+61 775 1
+61 776 1
+61 778 1
+61 779 1
+61 781 1
+61 782 1
+61 783 1
+61 785 1
+61 786 1
+61 803 1
+61 824 1
+61 844 1
+61 848 1
+61 851 1
+61 854 1
+61 855 1
+61 880 1
+61 900 1
+61 904 1
+61 907 1
+61 910 1
+61 911 1
+61 935 1
+61 939 1
+61 942 1
+61 945 1
+61 946 1
+61 969 1
+61 972 1
+61 975 1
+61 976 1
+61 978 1
+61 981 1
+61 982 1
+61 984 1
+61 985 1
+61 987 1
+61 1006 1
+61 1026 1
+61 1030 1
+61 1033 1
+61 1036 1
+61 1037 1
+61 1061 1
+61 1065 1
+61 1068 1
+61 1071 1
+61 1072 1
+61 1095 1
+61 1098 1
+61 1101 1
+61 1102 1
+61 1104 1
+61 1107 1
+61 1108 1
+61 1110 1
+61 1111 1
+61 1113 1
+61 1131 1
+61 1135 1
+61 1138 1
+61 1141 1
+61 1142 1
+61 1165 1
+61 1168 1
+61 1171 1
+61 1172 1
+61 1174 1
+61 1177 1
+61 1178 1
+61 1180 1
+61 1181 1
+61 1183 1
+61 1200 1
+61 1203 1
+61 1206 1
+61 1207 1
+61 1209 1
+61 1212 1
+61 1213 1
+61 1215 1
+61 1216 1
+61 1218 1
+61 1234 1
+61 1237 1
+61 1238 1
+61 1240 1
+61 1241 1
+61 1243 1
+61 1244 1
+61 1245 1
+61 1247 1
+61 1248 1
+61 1258 1
+61 1278 1
+61 1282 1
+61 1285 1
+61 1288 1
+61 1289 1
+61 1313 1
+61 1317 1
+61 1320 1
+61 1323 1
+61 1324 1
+61 1347 1
+61 1350 1
+61 1353 1
+61 1354 1
+61 1356 1
+61 1359 1
+61 1360 1
+61 1362 1
+61 1363 1
+61 1365 1
+61 1383 1
+61 1387 1
+61 1390 1
+61 1393 1
+61 1394 1
+61 1417 1
+61 1420 1
+61 1423 1
+61 1424 1
+61 1426 1
+61 1429 1
+61 1430 1
+61 1432 1
+61 1433 1
+61 1435 1
+61 1452 1
+61 1455 1
+61 1458 1
+61 1459 1
+61 1461 1
+61 1464 1
+61 1465 1
+61 1467 1
+61 1468 1
+61 1470 1
+61 1486 1
+61 1489 1
+61 1490 1
+61 1492 1
+61 1493 1
+61 1495 1
+61 1496 1
+61 1497 1
+61 1499 1
+61 1500 1
+61 1509 1
+61 1513 1
+61 1516 1
+61 1519 1
+61 1520 1
+61 1543 1
+61 1546 1
+61 1549 1
+61 1550 1
+61 1552 1
+61 1555 1
+61 1556 1
+61 1558 1
+61 1559 1
+61 1561 1
+61 1578 1
+61 1581 1
+61 1584 1
+61 1585 1
+61 1587 1
+61 1590 1
+61 1591 1
+61 1593 1
+61 1594 1
+61 1596 1
+61 1612 1
+61 1615 1
+61 1616 1
+61 1618 1
+61 1619 1
+61 1621 1
+61 1622 1
+61 1623 1
+61 1625 1
+61 1626 1
+61 1634 1
+61 1637 1
+61 1640 1
+61 1641 1
+61 1643 1
+61 1646 1
+61 1647 1
+61 1649 1
+61 1650 1
+61 1652 1
+61 1668 1
+61 1671 1
+61 1672 1
+61 1674 1
+61 1675 1
+61 1677 1
+61 1678 1
+61 1679 1
+61 1681 1
+61 1682 1
+61 1689 1
+61 1692 1
+61 1693 1
+61 1695 1
+61 1696 1
+61 1698 1
+61 1699 1
+61 1700 1
+61 1702 1
+61 1703 1
+61 1710 1
+61 1711 1
+61 1713 1
+61 1714 1
+61 1715 1
+62 20 1
+62 48 1
+62 69 1
+62 89 1
+62 93 1
+62 96 1
+62 98 1
+62 100 1
+62 132 1
+62 153 1
+62 173 1
+62 177 1
+62 180 1
+62 182 1
+62 184 1
+62 209 1
+62 229 1
+62 233 1
+62 236 1
+62 238 1
+62 240 1
+62 264 1
+62 268 1
+62 271 1
+62 273 1
+62 275 1
+62 298 1
+62 301 1
+62 303 1
+62 305 1
+62 307 1
+62 309 1
+62 311 1
+62 312 1
+62 314 1
+62 315 1
+62 342 1
+62 363 1
+62 383 1
+62 387 1
+62 390 1
+62 392 1
+62 394 1
+62 419 1
+62 439 1
+62 443 1
+62 446 1
+62 448 1
+62 450 1
+62 474 1
+62 478 1
+62 481 1
+62 483 1
+62 485 1
+62 508 1
+62 511 1
+62 513 1
+62 515 1
+62 517 1
+62 519 1
+62 521 1
+62 522 1
+62 524 1
+62 525 1
+62 545 1
+62 565 1
+62 569 1
+62 572 1
+62 574 1
+62 576 1
+62 600 1
+62 604 1
+62 607 1
+62 609 1
+62 611 1
+62 634 1
+62 637 1
+62 639 1
+62 641 1
+62 643 1
+62 645 1
+62 647 1
+62 648 1
+62 650 1
+62 651 1
+62 670 1
+62 674 1
+62 677 1
+62 679 1
+62 681 1
+62 704 1
+62 707 1
+62 709 1
+62 711 1
+62 713 1
+62 715 1
+62 717 1
+62 718 1
+62 720 1
+62 721 1
+62 739 1
+62 742 1
+62 744 1
+62 746 1
+62 748 1
+62 750 1
+62 752 1
+62 753 1
+62 755 1
+62 756 1
+62 773 1
+62 775 1
+62 777 1
+62 778 1
+62 780 1
+62 781 1
+62 782 1
+62 784 1
+62 785 1
+62 786 1
+62 804 1
+62 825 1
+62 845 1
+62 849 1
+62 852 1
+62 854 1
+62 856 1
+62 881 1
+62 901 1
+62 905 1
+62 908 1
+62 910 1
+62 912 1
+62 936 1
+62 940 1
+62 943 1
+62 945 1
+62 947 1
+62 970 1
+62 973 1
+62 975 1
+62 977 1
+62 979 1
+62 981 1
+62 983 1
+62 984 1
+62 986 1
+62 987 1
+62 1007 1
+62 1027 1
+62 1031 1
+62 1034 1
+62 1036 1
+62 1038 1
+62 1062 1
+62 1066 1
+62 1069 1
+62 1071 1
+62 1073 1
+62 1096 1
+62 1099 1
+62 1101 1
+62 1103 1
+62 1105 1
+62 1107 1
+62 1109 1
+62 1110 1
+62 1112 1
+62 1113 1
+62 1132 1
+62 1136 1
+62 1139 1
+62 1141 1
+62 1143 1
+62 1166 1
+62 1169 1
+62 1171 1
+62 1173 1
+62 1175 1
+62 1177 1
+62 1179 1
+62 1180 1
+62 1182 1
+62 1183 1
+62 1201 1
+62 1204 1
+62 1206 1
+62 1208 1
+62 1210 1
+62 1212 1
+62 1214 1
+62 1215 1
+62 1217 1
+62 1218 1
+62 1235 1
+62 1237 1
+62 1239 1
+62 1240 1
+62 1242 1
+62 1243 1
+62 1244 1
+62 1246 1
+62 1247 1
+62 1248 1
+62 1259 1
+62 1279 1
+62 1283 1
+62 1286 1
+62 1288 1
+62 1290 1
+62 1314 1
+62 1318 1
+62 1321 1
+62 1323 1
+62 1325 1
+62 1348 1
+62 1351 1
+62 1353 1
+62 1355 1
+62 1357 1
+62 1359 1
+62 1361 1
+62 1362 1
+62 1364 1
+62 1365 1
+62 1384 1
+62 1388 1
+62 1391 1
+62 1393 1
+62 1395 1
+62 1418 1
+62 1421 1
+62 1423 1
+62 1425 1
+62 1427 1
+62 1429 1
+62 1431 1
+62 1432 1
+62 1434 1
+62 1435 1
+62 1453 1
+62 1456 1
+62 1458 1
+62 1460 1
+62 1462 1
+62 1464 1
+62 1466 1
+62 1467 1
+62 1469 1
+62 1470 1
+62 1487 1
+62 1489 1
+62 1491 1
+62 1492 1
+62 1494 1
+62 1495 1
+62 1496 1
+62 1498 1
+62 1499 1
+62 1500 1
+62 1510 1
+62 1514 1
+62 1517 1
+62 1519 1
+62 1521 1
+62 1544 1
+62 1547 1
+62 1549 1
+62 1551 1
+62 1553 1
+62 1555 1
+62 1557 1
+62 1558 1
+62 1560 1
+62 1561 1
+62 1579 1
+62 1582 1
+62 1584 1
+62 1586 1
+62 1588 1
+62 1590 1
+62 1592 1
+62 1593 1
+62 1595 1
+62 1596 1
+62 1613 1
+62 1615 1
+62 1617 1
+62 1618 1
+62 1620 1
+62 1621 1
+62 1622 1
+62 1624 1
+62 1625 1
+62 1626 1
+62 1635 1
+62 1638 1
+62 1640 1
+62 1642 1
+62 1644 1
+62 1646 1
+62 1648 1
+62 1649 1
+62 1651 1
+62 1652 1
+62 1669 1
+62 1671 1
+62 1673 1
+62 1674 1
+62 1676 1
+62 1677 1
+62 1678 1
+62 1680 1
+62 1681 1
+62 1682 1
+62 1690 1
+62 1692 1
+62 1694 1
+62 1695 1
+62 1697 1
+62 1698 1
+62 1699 1
+62 1701 1
+62 1702 1
+62 1703 1
+62 1710 1
+62 1712 1
+62 1713 1
+62 1714 1
+62 1715 1
+63 21 1
+63 49 1
+63 70 1
+63 90 1
+63 94 1
+63 97 1
+63 99 1
+63 100 1
+63 133 1
+63 154 1
+63 174 1
+63 178 1
+63 181 1
+63 183 1
+63 184 1
+63 210 1
+63 230 1
+63 234 1
+63 237 1
+63 239 1
+63 240 1
+63 265 1
+63 269 1
+63 272 1
+63 274 1
+63 275 1
+63 299 1
+63 302 1
+63 304 1
+63 305 1
+63 308 1
+63 310 1
+63 311 1
+63 313 1
+63 314 1
+63 315 1
+63 343 1
+63 364 1
+63 384 1
+63 388 1
+63 391 1
+63 393 1
+63 394 1
+63 420 1
+63 440 1
+63 444 1
+63 447 1
+63 449 1
+63 450 1
+63 475 1
+63 479 1
+63 482 1
+63 484 1
+63 485 1
+63 509 1
+63 512 1
+63 514 1
+63 515 1
+63 518 1
+63 520 1
+63 521 1
+63 523 1
+63 524 1
+63 525 1
+63 546 1
+63 566 1
+63 570 1
+63 573 1
+63 575 1
+63 576 1
+63 601 1
+63 605 1
+63 608 1
+63 610 1
+63 611 1
+63 635 1
+63 638 1
+63 640 1
+63 641 1
+63 644 1
+63 646 1
+63 647 1
+63 649 1
+63 650 1
+63 651 1
+63 671 1
+63 675 1
+63 678 1
+63 680 1
+63 681 1
+63 705 1
+63 708 1
+63 710 1
+63 711 1
+63 714 1
+63 716 1
+63 717 1
+63 719 1
+63 720 1
+63 721 1
+63 740 1
+63 743 1
+63 745 1
+63 746 1
+63 749 1
+63 751 1
+63 752 1
+63 754 1
+63 755 1
+63 756 1
+63 774 1
+63 776 1
+63 777 1
+63 779 1
+63 780 1
+63 781 1
+63 783 1
+63 784 1
+63 785 1
+63 786 1
+63 805 1
+63 826 1
+63 846 1
+63 850 1
+63 853 1
+63 855 1
+63 856 1
+63 882 1
+63 902 1
+63 906 1
+63 909 1
+63 911 1
+63 912 1
+63 937 1
+63 941 1
+63 944 1
+63 946 1
+63 947 1
+63 971 1
+63 974 1
+63 976 1
+63 977 1
+63 980 1
+63 982 1
+63 983 1
+63 985 1
+63 986 1
+63 987 1
+63 1008 1
+63 1028 1
+63 1032 1
+63 1035 1
+63 1037 1
+63 1038 1
+63 1063 1
+63 1067 1
+63 1070 1
+63 1072 1
+63 1073 1
+63 1097 1
+63 1100 1
+63 1102 1
+63 1103 1
+63 1106 1
+63 1108 1
+63 1109 1
+63 1111 1
+63 1112 1
+63 1113 1
+63 1133 1
+63 1137 1
+63 1140 1
+63 1142 1
+63 1143 1
+63 1167 1
+63 1170 1
+63 1172 1
+63 1173 1
+63 1176 1
+63 1178 1
+63 1179 1
+63 1181 1
+63 1182 1
+63 1183 1
+63 1202 1
+63 1205 1
+63 1207 1
+63 1208 1
+63 1211 1
+63 1213 1
+63 1214 1
+63 1216 1
+63 1217 1
+63 1218 1
+63 1236 1
+63 1238 1
+63 1239 1
+63 1241 1
+63 1242 1
+63 1243 1
+63 1245 1
+63 1246 1
+63 1247 1
+63 1248 1
+63 1260 1
+63 1280 1
+63 1284 1
+63 1287 1
+63 1289 1
+63 1290 1
+63 1315 1
+63 1319 1
+63 1322 1
+63 1324 1
+63 1325 1
+63 1349 1
+63 1352 1
+63 1354 1
+63 1355 1
+63 1358 1
+63 1360 1
+63 1361 1
+63 1363 1
+63 1364 1
+63 1365 1
+63 1385 1
+63 1389 1
+63 1392 1
+63 1394 1
+63 1395 1
+63 1419 1
+63 1422 1
+63 1424 1
+63 1425 1
+63 1428 1
+63 1430 1
+63 1431 1
+63 1433 1
+63 1434 1
+63 1435 1
+63 1454 1
+63 1457 1
+63 1459 1
+63 1460 1
+63 1463 1
+63 1465 1
+63 1466 1
+63 1468 1
+63 1469 1
+63 1470 1
+63 1488 1
+63 1490 1
+63 1491 1
+63 1493 1
+63 1494 1
+63 1495 1
+63 1497 1
+63 1498 1
+63 1499 1
+63 1500 1
+63 1511 1
+63 1515 1
+63 1518 1
+63 1520 1
+63 1521 1
+63 1545 1
+63 1548 1
+63 1550 1
+63 1551 1
+63 1554 1
+63 1556 1
+63 1557 1
+63 1559 1
+63 1560 1
+63 1561 1
+63 1580 1
+63 1583 1
+63 1585 1
+63 1586 1
+63 1589 1
+63 1591 1
+63 1592 1
+63 1594 1
+63 1595 1
+63 1596 1
+63 1614 1
+63 1616 1
+63 1617 1
+63 1619 1
+63 1620 1
+63 1621 1
+63 1623 1
+63 1624 1
+63 1625 1
+63 1626 1
+63 1636 1
+63 1639 1
+63 1641 1
+63 1642 1
+63 1645 1
+63 1647 1
+63 1648 1
+63 1650 1
+63 1651 1
+63 1652 1
+63 1670 1
+63 1672 1
+63 1673 1
+63 1675 1
+63 1676 1
+63 1677 1
+63 1679 1
+63 1680 1
+63 1681 1
+63 1682 1
+63 1691 1
+63 1693 1
+63 1694 1
+63 1696 1
+63 1697 1
+63 1698 1
+63 1700 1
+63 1701 1
+63 1702 1
+63 1703 1
+63 1711 1
+63 1712 1
+63 1713 1
+63 1714 1
+63 1715 1
+64 22 1
+64 50 1
+64 71 1
+64 86 1
+64 101 1
+64 102 1
+64 103 1
+64 104 1
+64 134 1
+64 155 1
+64 170 1
+64 185 1
+64 186 1
+64 187 1
+64 188 1
+64 211 1
+64 226 1
+64 241 1
+64 242 1
+64 243 1
+64 244 1
+64 261 1
+64 276 1
+64 277 1
+64 278 1
+64 279 1
+64 296 1
+64 297 1
+64 298 1
+64 299 1
+64 316 1
+64 317 1
+64 318 1
+64 319 1
+64 320 1
+64 321 1
+64 344 1
+64 365 1
+64 380 1
+64 395 1
+64 396 1
+64 397 1
+64 398 1
+64 421 1
+64 436 1
+64 451 1
+64 452 1
+64 453 1
+64 454 1
+64 471 1
+64 486 1
+64 487 1
+64 488 1
+64 489 1
+64 506 1
+64 507 1
+64 508 1
+64 509 1
+64 526 1
+64 527 1
+64 528 1
+64 529 1
+64 530 1
+64 531 1
+64 547 1
+64 562 1
+64 577 1
+64 578 1
+64 579 1
+64 580 1
+64 597 1
+64 612 1
+64 613 1
+64 614 1
+64 615 1
+64 632 1
+64 633 1
+64 634 1
+64 635 1
+64 652 1
+64 653 1
+64 654 1
+64 655 1
+64 656 1
+64 657 1
+64 667 1
+64 682 1
+64 683 1
+64 684 1
+64 685 1
+64 702 1
+64 703 1
+64 704 1
+64 705 1
+64 722 1
+64 723 1
+64 724 1
+64 725 1
+64 726 1
+64 727 1
+64 737 1
+64 738 1
+64 739 1
+64 740 1
+64 757 1
+64 758 1
+64 759 1
+64 760 1
+64 761 1
+64 762 1
+64 772 1
+64 773 1
+64 774 1
+64 775 1
+64 776 1
+64 777 1
+64 787 1
+64 788 1
+64 789 1
+64 790 1
+64 806 1
+64 827 1
+64 842 1
+64 857 1
+64 858 1
+64 859 1
+64 860 1
+64 883 1
+64 898 1
+64 913 1
+64 914 1
+64 915 1
+64 916 1
+64 933 1
+64 948 1
+64 949 1
+64 950 1
+64 951 1
+64 968 1
+64 969 1
+64 970 1
+64 971 1
+64 988 1
+64 989 1
+64 990 1
+64 991 1
+64 992 1
+64 993 1
+64 1009 1
+64 1024 1
+64 1039 1
+64 1040 1
+64 1041 1
+64 1042 1
+64 1059 1
+64 1074 1
+64 1075 1
+64 1076 1
+64 1077 1
+64 1094 1
+64 1095 1
+64 1096 1
+64 1097 1
+64 1114 1
+64 1115 1
+64 1116 1
+64 1117 1
+64 1118 1
+64 1119 1
+64 1129 1
+64 1144 1
+64 1145 1
+64 1146 1
+64 1147 1
+64 1164 1
+64 1165 1
+64 1166 1
+64 1167 1
+64 1184 1
+64 1185 1
+64 1186 1
+64 1187 1
+64 1188 1
+64 1189 1
+64 1199 1
+64 1200 1
+64 1201 1
+64 1202 1
+64 1219 1
+64 1220 1
+64 1221 1
+64 1222 1
+64 1223 1
+64 1224 1
+64 1234 1
+64 1235 1
+64 1236 1
+64 1237 1
+64 1238 1
+64 1239 1
+64 1249 1
+64 1250 1
+64 1251 1
+64 1252 1
+64 1261 1
+64 1276 1
+64 1291 1
+64 1292 1
+64 1293 1
+64 1294 1
+64 1311 1
+64 1326 1
+64 1327 1
+64 1328 1
+64 1329 1
+64 1346 1
+64 1347 1
+64 1348 1
+64 1349 1
+64 1366 1
+64 1367 1
+64 1368 1
+64 1369 1
+64 1370 1
+64 1371 1
+64 1381 1
+64 1396 1
+64 1397 1
+64 1398 1
+64 1399 1
+64 1416 1
+64 1417 1
+64 1418 1
+64 1419 1
+64 1436 1
+64 1437 1
+64 1438 1
+64 1439 1
+64 1440 1
+64 1441 1
+64 1451 1
+64 1452 1
+64 1453 1
+64 1454 1
+64 1471 1
+64 1472 1
+64 1473 1
+64 1474 1
+64 1475 1
+64 1476 1
+64 1486 1
+64 1487 1
+64 1488 1
+64 1489 1
+64 1490 1
+64 1491 1
+64 1501 1
+64 1502 1
+64 1503 1
+64 1504 1
+64 1507 1
+64 1522 1
+64 1523 1
+64 1524 1
+64 1525 1
+64 1542 1
+64 1543 1
+64 1544 1
+64 1545 1
+64 1562 1
+64 1563 1
+64 1564 1
+64 1565 1
+64 1566 1
+64 1567 1
+64 1577 1
+64 1578 1
+64 1579 1
+64 1580 1
+64 1597 1
+64 1598 1
+64 1599 1
+64 1600 1
+64 1601 1
+64 1602 1
+64 1612 1
+64 1613 1
+64 1614 1
+64 1615 1
+64 1616 1
+64 1617 1
+64 1627 1
+64 1628 1
+64 1629 1
+64 1630 1
+64 1633 1
+64 1634 1
+64 1635 1
+64 1636 1
+64 1653 1
+64 1654 1
+64 1655 1
+64 1656 1
+64 1657 1
+64 1658 1
+64 1668 1
+64 1669 1
+64 1670 1
+64 1671 1
+64 1672 1
+64 1673 1
+64 1683 1
+64 1684 1
+64 1685 1
+64 1686 1
+64 1689 1
+64 1690 1
+64 1691 1
+64 1692 1
+64 1693 1
+64 1694 1
+64 1704 1
+64 1705 1
+64 1706 1
+64 1707 1
+64 1710 1
+64 1711 1
+64 1712 1
+64 1713 1
+64 1716 1
+65 23 1
+65 51 1
+65 72 1
+65 87 1
+65 101 1
+65 105 1
+65 106 1
+65 107 1
+65 135 1
+65 156 1
+65 171 1
+65 185 1
+65 189 1
+65 190 1
+65 191 1
+65 212 1
+65 227 1
+65 241 1
+65 245 1
+65 246 1
+65 247 1
+65 262 1
+65 276 1
+65 280 1
+65 281 1
+65 282 1
+65 296 1
+65 300 1
+65 301 1
+65 302 1
+65 316 1
+65 317 1
+65 318 1
+65 322 1
+65 323 1
+65 324 1
+65 345 1
+65 366 1
+65 381 1
+65 395 1
+65 399 1
+65 400 1
+65 401 1
+65 422 1
+65 437 1
+65 451 1
+65 455 1
+65 456 1
+65 457 1
+65 472 1
+65 486 1
+65 490 1
+65 491 1
+65 492 1
+65 506 1
+65 510 1
+65 511 1
+65 512 1
+65 526 1
+65 527 1
+65 528 1
+65 532 1
+65 533 1
+65 534 1
+65 548 1
+65 563 1
+65 577 1
+65 581 1
+65 582 1
+65 583 1
+65 598 1
+65 612 1
+65 616 1
+65 617 1
+65 618 1
+65 632 1
+65 636 1
+65 637 1
+65 638 1
+65 652 1
+65 653 1
+65 654 1
+65 658 1
+65 659 1
+65 660 1
+65 668 1
+65 682 1
+65 686 1
+65 687 1
+65 688 1
+65 702 1
+65 706 1
+65 707 1
+65 708 1
+65 722 1
+65 723 1
+65 724 1
+65 728 1
+65 729 1
+65 730 1
+65 737 1
+65 741 1
+65 742 1
+65 743 1
+65 757 1
+65 758 1
+65 759 1
+65 763 1
+65 764 1
+65 765 1
+65 772 1
+65 773 1
+65 774 1
+65 778 1
+65 779 1
+65 780 1
+65 787 1
+65 788 1
+65 789 1
+65 791 1
+65 807 1
+65 828 1
+65 843 1
+65 857 1
+65 861 1
+65 862 1
+65 863 1
+65 884 1
+65 899 1
+65 913 1
+65 917 1
+65 918 1
+65 919 1
+65 934 1
+65 948 1
+65 952 1
+65 953 1
+65 954 1
+65 968 1
+65 972 1
+65 973 1
+65 974 1
+65 988 1
+65 989 1
+65 990 1
+65 994 1
+65 995 1
+65 996 1
+65 1010 1
+65 1025 1
+65 1039 1
+65 1043 1
+65 1044 1
+65 1045 1
+65 1060 1
+65 1074 1
+65 1078 1
+65 1079 1
+65 1080 1
+65 1094 1
+65 1098 1
+65 1099 1
+65 1100 1
+65 1114 1
+65 1115 1
+65 1116 1
+65 1120 1
+65 1121 1
+65 1122 1
+65 1130 1
+65 1144 1
+65 1148 1
+65 1149 1
+65 1150 1
+65 1164 1
+65 1168 1
+65 1169 1
+65 1170 1
+65 1184 1
+65 1185 1
+65 1186 1
+65 1190 1
+65 1191 1
+65 1192 1
+65 1199 1
+65 1203 1
+65 1204 1
+65 1205 1
+65 1219 1
+65 1220 1
+65 1221 1
+65 1225 1
+65 1226 1
+65 1227 1
+65 1234 1
+65 1235 1
+65 1236 1
+65 1240 1
+65 1241 1
+65 1242 1
+65 1249 1
+65 1250 1
+65 1251 1
+65 1253 1
+65 1262 1
+65 1277 1
+65 1291 1
+65 1295 1
+65 1296 1
+65 1297 1
+65 1312 1
+65 1326 1
+65 1330 1
+65 1331 1
+65 1332 1
+65 1346 1
+65 1350 1
+65 1351 1
+65 1352 1
+65 1366 1
+65 1367 1
+65 1368 1
+65 1372 1
+65 1373 1
+65 1374 1
+65 1382 1
+65 1396 1
+65 1400 1
+65 1401 1
+65 1402 1
+65 1416 1
+65 1420 1
+65 1421 1
+65 1422 1
+65 1436 1
+65 1437 1
+65 1438 1
+65 1442 1
+65 1443 1
+65 1444 1
+65 1451 1
+65 1455 1
+65 1456 1
+65 1457 1
+65 1471 1
+65 1472 1
+65 1473 1
+65 1477 1
+65 1478 1
+65 1479 1
+65 1486 1
+65 1487 1
+65 1488 1
+65 1492 1
+65 1493 1
+65 1494 1
+65 1501 1
+65 1502 1
+65 1503 1
+65 1505 1
+65 1508 1
+65 1522 1
+65 1526 1
+65 1527 1
+65 1528 1
+65 1542 1
+65 1546 1
+65 1547 1
+65 1548 1
+65 1562 1
+65 1563 1
+65 1564 1
+65 1568 1
+65 1569 1
+65 1570 1
+65 1577 1
+65 1581 1
+65 1582 1
+65 1583 1
+65 1597 1
+65 1598 1
+65 1599 1
+65 1603 1
+65 1604 1
+65 1605 1
+65 1612 1
+65 1613 1
+65 1614 1
+65 1618 1
+65 1619 1
+65 1620 1
+65 1627 1
+65 1628 1
+65 1629 1
+65 1631 1
+65 1633 1
+65 1637 1
+65 1638 1
+65 1639 1
+65 1653 1
+65 1654 1
+65 1655 1
+65 1659 1
+65 1660 1
+65 1661 1
+65 1668 1
+65 1669 1
+65 1670 1
+65 1674 1
+65 1675 1
+65 1676 1
+65 1683 1
+65 1684 1
+65 1685 1
+65 1687 1
+65 1689 1
+65 1690 1
+65 1691 1
+65 1695 1
+65 1696 1
+65 1697 1
+65 1704 1
+65 1705 1
+65 1706 1
+65 1708 1
+65 1710 1
+65 1711 1
+65 1712 1
+65 1714 1
+65 1716 1
+66 24 1
+66 52 1
+66 73 1
+66 88 1
+66 102 1
+66 105 1
+66 108 1
+66 109 1
+66 136 1
+66 157 1
+66 172 1
+66 186 1
+66 189 1
+66 192 1
+66 193 1
+66 213 1
+66 228 1
+66 242 1
+66 245 1
+66 248 1
+66 249 1
+66 263 1
+66 277 1
+66 280 1
+66 283 1
+66 284 1
+66 297 1
+66 300 1
+66 303 1
+66 304 1
+66 316 1
+66 319 1
+66 320 1
+66 322 1
+66 323 1
+66 325 1
+66 346 1
+66 367 1
+66 382 1
+66 396 1
+66 399 1
+66 402 1
+66 403 1
+66 423 1
+66 438 1
+66 452 1
+66 455 1
+66 458 1
+66 459 1
+66 473 1
+66 487 1
+66 490 1
+66 493 1
+66 494 1
+66 507 1
+66 510 1
+66 513 1
+66 514 1
+66 526 1
+66 529 1
+66 530 1
+66 532 1
+66 533 1
+66 535 1
+66 549 1
+66 564 1
+66 578 1
+66 581 1
+66 584 1
+66 585 1
+66 599 1
+66 613 1
+66 616 1
+66 619 1
+66 620 1
+66 633 1
+66 636 1
+66 639 1
+66 640 1
+66 652 1
+66 655 1
+66 656 1
+66 658 1
+66 659 1
+66 661 1
+66 669 1
+66 683 1
+66 686 1
+66 689 1
+66 690 1
+66 703 1
+66 706 1
+66 709 1
+66 710 1
+66 722 1
+66 725 1
+66 726 1
+66 728 1
+66 729 1
+66 731 1
+66 738 1
+66 741 1
+66 744 1
+66 745 1
+66 757 1
+66 760 1
+66 761 1
+66 763 1
+66 764 1
+66 766 1
+66 772 1
+66 775 1
+66 776 1
+66 778 1
+66 779 1
+66 781 1
+66 787 1
+66 788 1
+66 790 1
+66 791 1
+66 808 1
+66 829 1
+66 844 1
+66 858 1
+66 861 1
+66 864 1
+66 865 1
+66 885 1
+66 900 1
+66 914 1
+66 917 1
+66 920 1
+66 921 1
+66 935 1
+66 949 1
+66 952 1
+66 955 1
+66 956 1
+66 969 1
+66 972 1
+66 975 1
+66 976 1
+66 988 1
+66 991 1
+66 992 1
+66 994 1
+66 995 1
+66 997 1
+66 1011 1
+66 1026 1
+66 1040 1
+66 1043 1
+66 1046 1
+66 1047 1
+66 1061 1
+66 1075 1
+66 1078 1
+66 1081 1
+66 1082 1
+66 1095 1
+66 1098 1
+66 1101 1
+66 1102 1
+66 1114 1
+66 1117 1
+66 1118 1
+66 1120 1
+66 1121 1
+66 1123 1
+66 1131 1
+66 1145 1
+66 1148 1
+66 1151 1
+66 1152 1
+66 1165 1
+66 1168 1
+66 1171 1
+66 1172 1
+66 1184 1
+66 1187 1
+66 1188 1
+66 1190 1
+66 1191 1
+66 1193 1
+66 1200 1
+66 1203 1
+66 1206 1
+66 1207 1
+66 1219 1
+66 1222 1
+66 1223 1
+66 1225 1
+66 1226 1
+66 1228 1
+66 1234 1
+66 1237 1
+66 1238 1
+66 1240 1
+66 1241 1
+66 1243 1
+66 1249 1
+66 1250 1
+66 1252 1
+66 1253 1
+66 1263 1
+66 1278 1
+66 1292 1
+66 1295 1
+66 1298 1
+66 1299 1
+66 1313 1
+66 1327 1
+66 1330 1
+66 1333 1
+66 1334 1
+66 1347 1
+66 1350 1
+66 1353 1
+66 1354 1
+66 1366 1
+66 1369 1
+66 1370 1
+66 1372 1
+66 1373 1
+66 1375 1
+66 1383 1
+66 1397 1
+66 1400 1
+66 1403 1
+66 1404 1
+66 1417 1
+66 1420 1
+66 1423 1
+66 1424 1
+66 1436 1
+66 1439 1
+66 1440 1
+66 1442 1
+66 1443 1
+66 1445 1
+66 1452 1
+66 1455 1
+66 1458 1
+66 1459 1
+66 1471 1
+66 1474 1
+66 1475 1
+66 1477 1
+66 1478 1
+66 1480 1
+66 1486 1
+66 1489 1
+66 1490 1
+66 1492 1
+66 1493 1
+66 1495 1
+66 1501 1
+66 1502 1
+66 1504 1
+66 1505 1
+66 1509 1
+66 1523 1
+66 1526 1
+66 1529 1
+66 1530 1
+66 1543 1
+66 1546 1
+66 1549 1
+66 1550 1
+66 1562 1
+66 1565 1
+66 1566 1
+66 1568 1
+66 1569 1
+66 1571 1
+66 1578 1
+66 1581 1
+66 1584 1
+66 1585 1
+66 1597 1
+66 1600 1
+66 1601 1
+66 1603 1
+66 1604 1
+66 1606 1
+66 1612 1
+66 1615 1
+66 1616 1
+66 1618 1
+66 1619 1
+66 1621 1
+66 1627 1
+66 1628 1
+66 1630 1
+66 1631 1
+66 1634 1
+66 1637 1
+66 1640 1
+66 1641 1
+66 1653 1
+66 1656 1
+66 1657 1
+66 1659 1
+66 1660 1
+66 1662 1
+66 1668 1
+66 1671 1
+66 1672 1
+66 1674 1
+66 1675 1
+66 1677 1
+66 1683 1
+66 1684 1
+66 1686 1
+66 1687 1
+66 1689 1
+66 1692 1
+66 1693 1
+66 1695 1
+66 1696 1
+66 1698 1
+66 1704 1
+66 1705 1
+66 1707 1
+66 1708 1
+66 1710 1
+66 1711 1
+66 1713 1
+66 1714 1
+66 1716 1
+67 25 1
+67 53 1
+67 74 1
+67 89 1
+67 103 1
+67 106 1
+67 108 1
+67 110 1
+67 137 1
+67 158 1
+67 173 1
+67 187 1
+67 190 1
+67 192 1
+67 194 1
+67 214 1
+67 229 1
+67 243 1
+67 246 1
+67 248 1
+67 250 1
+67 264 1
+67 278 1
+67 281 1
+67 283 1
+67 285 1
+67 298 1
+67 301 1
+67 303 1
+67 305 1
+67 317 1
+67 319 1
+67 321 1
+67 322 1
+67 324 1
+67 325 1
+67 347 1
+67 368 1
+67 383 1
+67 397 1
+67 400 1
+67 402 1
+67 404 1
+67 424 1
+67 439 1
+67 453 1
+67 456 1
+67 458 1
+67 460 1
+67 474 1
+67 488 1
+67 491 1
+67 493 1
+67 495 1
+67 508 1
+67 511 1
+67 513 1
+67 515 1
+67 527 1
+67 529 1
+67 531 1
+67 532 1
+67 534 1
+67 535 1
+67 550 1
+67 565 1
+67 579 1
+67 582 1
+67 584 1
+67 586 1
+67 600 1
+67 614 1
+67 617 1
+67 619 1
+67 621 1
+67 634 1
+67 637 1
+67 639 1
+67 641 1
+67 653 1
+67 655 1
+67 657 1
+67 658 1
+67 660 1
+67 661 1
+67 670 1
+67 684 1
+67 687 1
+67 689 1
+67 691 1
+67 704 1
+67 707 1
+67 709 1
+67 711 1
+67 723 1
+67 725 1
+67 727 1
+67 728 1
+67 730 1
+67 731 1
+67 739 1
+67 742 1
+67 744 1
+67 746 1
+67 758 1
+67 760 1
+67 762 1
+67 763 1
+67 765 1
+67 766 1
+67 773 1
+67 775 1
+67 777 1
+67 778 1
+67 780 1
+67 781 1
+67 787 1
+67 789 1
+67 790 1
+67 791 1
+67 809 1
+67 830 1
+67 845 1
+67 859 1
+67 862 1
+67 864 1
+67 866 1
+67 886 1
+67 901 1
+67 915 1
+67 918 1
+67 920 1
+67 922 1
+67 936 1
+67 950 1
+67 953 1
+67 955 1
+67 957 1
+67 970 1
+67 973 1
+67 975 1
+67 977 1
+67 989 1
+67 991 1
+67 993 1
+67 994 1
+67 996 1
+67 997 1
+67 1012 1
+67 1027 1
+67 1041 1
+67 1044 1
+67 1046 1
+67 1048 1
+67 1062 1
+67 1076 1
+67 1079 1
+67 1081 1
+67 1083 1
+67 1096 1
+67 1099 1
+67 1101 1
+67 1103 1
+67 1115 1
+67 1117 1
+67 1119 1
+67 1120 1
+67 1122 1
+67 1123 1
+67 1132 1
+67 1146 1
+67 1149 1
+67 1151 1
+67 1153 1
+67 1166 1
+67 1169 1
+67 1171 1
+67 1173 1
+67 1185 1
+67 1187 1
+67 1189 1
+67 1190 1
+67 1192 1
+67 1193 1
+67 1201 1
+67 1204 1
+67 1206 1
+67 1208 1
+67 1220 1
+67 1222 1
+67 1224 1
+67 1225 1
+67 1227 1
+67 1228 1
+67 1235 1
+67 1237 1
+67 1239 1
+67 1240 1
+67 1242 1
+67 1243 1
+67 1249 1
+67 1251 1
+67 1252 1
+67 1253 1
+67 1264 1
+67 1279 1
+67 1293 1
+67 1296 1
+67 1298 1
+67 1300 1
+67 1314 1
+67 1328 1
+67 1331 1
+67 1333 1
+67 1335 1
+67 1348 1
+67 1351 1
+67 1353 1
+67 1355 1
+67 1367 1
+67 1369 1
+67 1371 1
+67 1372 1
+67 1374 1
+67 1375 1
+67 1384 1
+67 1398 1
+67 1401 1
+67 1403 1
+67 1405 1
+67 1418 1
+67 1421 1
+67 1423 1
+67 1425 1
+67 1437 1
+67 1439 1
+67 1441 1
+67 1442 1
+67 1444 1
+67 1445 1
+67 1453 1
+67 1456 1
+67 1458 1
+67 1460 1
+67 1472 1
+67 1474 1
+67 1476 1
+67 1477 1
+67 1479 1
+67 1480 1
+67 1487 1
+67 1489 1
+67 1491 1
+67 1492 1
+67 1494 1
+67 1495 1
+67 1501 1
+67 1503 1
+67 1504 1
+67 1505 1
+67 1510 1
+67 1524 1
+67 1527 1
+67 1529 1
+67 1531 1
+67 1544 1
+67 1547 1
+67 1549 1
+67 1551 1
+67 1563 1
+67 1565 1
+67 1567 1
+67 1568 1
+67 1570 1
+67 1571 1
+67 1579 1
+67 1582 1
+67 1584 1
+67 1586 1
+67 1598 1
+67 1600 1
+67 1602 1
+67 1603 1
+67 1605 1
+67 1606 1
+67 1613 1
+67 1615 1
+67 1617 1
+67 1618 1
+67 1620 1
+67 1621 1
+67 1627 1
+67 1629 1
+67 1630 1
+67 1631 1
+67 1635 1
+67 1638 1
+67 1640 1
+67 1642 1
+67 1654 1
+67 1656 1
+67 1658 1
+67 1659 1
+67 1661 1
+67 1662 1
+67 1669 1
+67 1671 1
+67 1673 1
+67 1674 1
+67 1676 1
+67 1677 1
+67 1683 1
+67 1685 1
+67 1686 1
+67 1687 1
+67 1690 1
+67 1692 1
+67 1694 1
+67 1695 1
+67 1697 1
+67 1698 1
+67 1704 1
+67 1706 1
+67 1707 1
+67 1708 1
+67 1710 1
+67 1712 1
+67 1713 1
+67 1714 1
+67 1716 1
+68 26 1
+68 54 1
+68 75 1
+68 90 1
+68 104 1
+68 107 1
+68 109 1
+68 110 1
+68 138 1
+68 159 1
+68 174 1
+68 188 1
+68 191 1
+68 193 1
+68 194 1
+68 215 1
+68 230 1
+68 244 1
+68 247 1
+68 249 1
+68 250 1
+68 265 1
+68 279 1
+68 282 1
+68 284 1
+68 285 1
+68 299 1
+68 302 1
+68 304 1
+68 305 1
+68 318 1
+68 320 1
+68 321 1
+68 323 1
+68 324 1
+68 325 1
+68 348 1
+68 369 1
+68 384 1
+68 398 1
+68 401 1
+68 403 1
+68 404 1
+68 425 1
+68 440 1
+68 454 1
+68 457 1
+68 459 1
+68 460 1
+68 475 1
+68 489 1
+68 492 1
+68 494 1
+68 495 1
+68 509 1
+68 512 1
+68 514 1
+68 515 1
+68 528 1
+68 530 1
+68 531 1
+68 533 1
+68 534 1
+68 535 1
+68 551 1
+68 566 1
+68 580 1
+68 583 1
+68 585 1
+68 586 1
+68 601 1
+68 615 1
+68 618 1
+68 620 1
+68 621 1
+68 635 1
+68 638 1
+68 640 1
+68 641 1
+68 654 1
+68 656 1
+68 657 1
+68 659 1
+68 660 1
+68 661 1
+68 671 1
+68 685 1
+68 688 1
+68 690 1
+68 691 1
+68 705 1
+68 708 1
+68 710 1
+68 711 1
+68 724 1
+68 726 1
+68 727 1
+68 729 1
+68 730 1
+68 731 1
+68 740 1
+68 743 1
+68 745 1
+68 746 1
+68 759 1
+68 761 1
+68 762 1
+68 764 1
+68 765 1
+68 766 1
+68 774 1
+68 776 1
+68 777 1
+68 779 1
+68 780 1
+68 781 1
+68 788 1
+68 789 1
+68 790 1
+68 791 1
+68 810 1
+68 831 1
+68 846 1
+68 860 1
+68 863 1
+68 865 1
+68 866 1
+68 887 1
+68 902 1
+68 916 1
+68 919 1
+68 921 1
+68 922 1
+68 937 1
+68 951 1
+68 954 1
+68 956 1
+68 957 1
+68 971 1
+68 974 1
+68 976 1
+68 977 1
+68 990 1
+68 992 1
+68 993 1
+68 995 1
+68 996 1
+68 997 1
+68 1013 1
+68 1028 1
+68 1042 1
+68 1045 1
+68 1047 1
+68 1048 1
+68 1063 1
+68 1077 1
+68 1080 1
+68 1082 1
+68 1083 1
+68 1097 1
+68 1100 1
+68 1102 1
+68 1103 1
+68 1116 1
+68 1118 1
+68 1119 1
+68 1121 1
+68 1122 1
+68 1123 1
+68 1133 1
+68 1147 1
+68 1150 1
+68 1152 1
+68 1153 1
+68 1167 1
+68 1170 1
+68 1172 1
+68 1173 1
+68 1186 1
+68 1188 1
+68 1189 1
+68 1191 1
+68 1192 1
+68 1193 1
+68 1202 1
+68 1205 1
+68 1207 1
+68 1208 1
+68 1221 1
+68 1223 1
+68 1224 1
+68 1226 1
+68 1227 1
+68 1228 1
+68 1236 1
+68 1238 1
+68 1239 1
+68 1241 1
+68 1242 1
+68 1243 1
+68 1250 1
+68 1251 1
+68 1252 1
+68 1253 1
+68 1265 1
+68 1280 1
+68 1294 1
+68 1297 1
+68 1299 1
+68 1300 1
+68 1315 1
+68 1329 1
+68 1332 1
+68 1334 1
+68 1335 1
+68 1349 1
+68 1352 1
+68 1354 1
+68 1355 1
+68 1368 1
+68 1370 1
+68 1371 1
+68 1373 1
+68 1374 1
+68 1375 1
+68 1385 1
+68 1399 1
+68 1402 1
+68 1404 1
+68 1405 1
+68 1419 1
+68 1422 1
+68 1424 1
+68 1425 1
+68 1438 1
+68 1440 1
+68 1441 1
+68 1443 1
+68 1444 1
+68 1445 1
+68 1454 1
+68 1457 1
+68 1459 1
+68 1460 1
+68 1473 1
+68 1475 1
+68 1476 1
+68 1478 1
+68 1479 1
+68 1480 1
+68 1488 1
+68 1490 1
+68 1491 1
+68 1493 1
+68 1494 1
+68 1495 1
+68 1502 1
+68 1503 1
+68 1504 1
+68 1505 1
+68 1511 1
+68 1525 1
+68 1528 1
+68 1530 1
+68 1531 1
+68 1545 1
+68 1548 1
+68 1550 1
+68 1551 1
+68 1564 1
+68 1566 1
+68 1567 1
+68 1569 1
+68 1570 1
+68 1571 1
+68 1580 1
+68 1583 1
+68 1585 1
+68 1586 1
+68 1599 1
+68 1601 1
+68 1602 1
+68 1604 1
+68 1605 1
+68 1606 1
+68 1614 1
+68 1616 1
+68 1617 1
+68 1619 1
+68 1620 1
+68 1621 1
+68 1628 1
+68 1629 1
+68 1630 1
+68 1631 1
+68 1636 1
+68 1639 1
+68 1641 1
+68 1642 1
+68 1655 1
+68 1657 1
+68 1658 1
+68 1660 1
+68 1661 1
+68 1662 1
+68 1670 1
+68 1672 1
+68 1673 1
+68 1675 1
+68 1676 1
+68 1677 1
+68 1684 1
+68 1685 1
+68 1686 1
+68 1687 1
+68 1691 1
+68 1693 1
+68 1694 1
+68 1696 1
+68 1697 1
+68 1698 1
+68 1705 1
+68 1706 1
+68 1707 1
+68 1708 1
+68 1711 1
+68 1712 1
+68 1713 1
+68 1714 1
+68 1716 1
+69 27 1
+69 55 1
+69 76 1
+69 91 1
+69 101 1
+69 111 1
+69 112 1
+69 113 1
+69 139 1
+69 160 1
+69 175 1
+69 185 1
+69 195 1
+69 196 1
+69 197 1
+69 216 1
+69 231 1
+69 241 1
+69 251 1
+69 252 1
+69 253 1
+69 266 1
+69 276 1
+69 286 1
+69 287 1
+69 288 1
+69 296 1
+69 306 1
+69 307 1
+69 308 1
+69 316 1
+69 317 1
+69 318 1
+69 326 1
+69 327 1
+69 328 1
+69 349 1
+69 370 1
+69 385 1
+69 395 1
+69 405 1
+69 406 1
+69 407 1
+69 426 1
+69 441 1
+69 451 1
+69 461 1
+69 462 1
+69 463 1
+69 476 1
+69 486 1
+69 496 1
+69 497 1
+69 498 1
+69 506 1
+69 516 1
+69 517 1
+69 518 1
+69 526 1
+69 527 1
+69 528 1
+69 536 1
+69 537 1
+69 538 1
+69 552 1
+69 567 1
+69 577 1
+69 587 1
+69 588 1
+69 589 1
+69 602 1
+69 612 1
+69 622 1
+69 623 1
+69 624 1
+69 632 1
+69 642 1
+69 643 1
+69 644 1
+69 652 1
+69 653 1
+69 654 1
+69 662 1
+69 663 1
+69 664 1
+69 672 1
+69 682 1
+69 692 1
+69 693 1
+69 694 1
+69 702 1
+69 712 1
+69 713 1
+69 714 1
+69 722 1
+69 723 1
+69 724 1
+69 732 1
+69 733 1
+69 734 1
+69 737 1
+69 747 1
+69 748 1
+69 749 1
+69 757 1
+69 758 1
+69 759 1
+69 767 1
+69 768 1
+69 769 1
+69 772 1
+69 773 1
+69 774 1
+69 782 1
+69 783 1
+69 784 1
+69 787 1
+69 788 1
+69 789 1
+69 792 1
+69 811 1
+69 832 1
+69 847 1
+69 857 1
+69 867 1
+69 868 1
+69 869 1
+69 888 1
+69 903 1
+69 913 1
+69 923 1
+69 924 1
+69 925 1
+69 938 1
+69 948 1
+69 958 1
+69 959 1
+69 960 1
+69 968 1
+69 978 1
+69 979 1
+69 980 1
+69 988 1
+69 989 1
+69 990 1
+69 998 1
+69 999 1
+69 1000 1
+69 1014 1
+69 1029 1
+69 1039 1
+69 1049 1
+69 1050 1
+69 1051 1
+69 1064 1
+69 1074 1
+69 1084 1
+69 1085 1
+69 1086 1
+69 1094 1
+69 1104 1
+69 1105 1
+69 1106 1
+69 1114 1
+69 1115 1
+69 1116 1
+69 1124 1
+69 1125 1
+69 1126 1
+69 1134 1
+69 1144 1
+69 1154 1
+69 1155 1
+69 1156 1
+69 1164 1
+69 1174 1
+69 1175 1
+69 1176 1
+69 1184 1
+69 1185 1
+69 1186 1
+69 1194 1
+69 1195 1
+69 1196 1
+69 1199 1
+69 1209 1
+69 1210 1
+69 1211 1
+69 1219 1
+69 1220 1
+69 1221 1
+69 1229 1
+69 1230 1
+69 1231 1
+69 1234 1
+69 1235 1
+69 1236 1
+69 1244 1
+69 1245 1
+69 1246 1
+69 1249 1
+69 1250 1
+69 1251 1
+69 1254 1
+69 1266 1
+69 1281 1
+69 1291 1
+69 1301 1
+69 1302 1
+69 1303 1
+69 1316 1
+69 1326 1
+69 1336 1
+69 1337 1
+69 1338 1
+69 1346 1
+69 1356 1
+69 1357 1
+69 1358 1
+69 1366 1
+69 1367 1
+69 1368 1
+69 1376 1
+69 1377 1
+69 1378 1
+69 1386 1
+69 1396 1
+69 1406 1
+69 1407 1
+69 1408 1
+69 1416 1
+69 1426 1
+69 1427 1
+69 1428 1
+69 1436 1
+69 1437 1
+69 1438 1
+69 1446 1
+69 1447 1
+69 1448 1
+69 1451 1
+69 1461 1
+69 1462 1
+69 1463 1
+69 1471 1
+69 1472 1
+69 1473 1
+69 1481 1
+69 1482 1
+69 1483 1
+69 1486 1
+69 1487 1
+69 1488 1
+69 1496 1
+69 1497 1
+69 1498 1
+69 1501 1
+69 1502 1
+69 1503 1
+69 1506 1
+69 1512 1
+69 1522 1
+69 1532 1
+69 1533 1
+69 1534 1
+69 1542 1
+69 1552 1
+69 1553 1
+69 1554 1
+69 1562 1
+69 1563 1
+69 1564 1
+69 1572 1
+69 1573 1
+69 1574 1
+69 1577 1
+69 1587 1
+69 1588 1
+69 1589 1
+69 1597 1
+69 1598 1
+69 1599 1
+69 1607 1
+69 1608 1
+69 1609 1
+69 1612 1
+69 1613 1
+69 1614 1
+69 1622 1
+69 1623 1
+69 1624 1
+69 1627 1
+69 1628 1
+69 1629 1
+69 1632 1
+69 1633 1
+69 1643 1
+69 1644 1
+69 1645 1
+69 1653 1
+69 1654 1
+69 1655 1
+69 1663 1
+69 1664 1
+69 1665 1
+69 1668 1
+69 1669 1
+69 1670 1
+69 1678 1
+69 1679 1
+69 1680 1
+69 1683 1
+69 1684 1
+69 1685 1
+69 1688 1
+69 1689 1
+69 1690 1
+69 1691 1
+69 1699 1
+69 1700 1
+69 1701 1
+69 1704 1
+69 1705 1
+69 1706 1
+69 1709 1
+69 1710 1
+69 1711 1
+69 1712 1
+69 1715 1
+69 1716 1
+70 28 1
+70 56 1
+70 77 1
+70 92 1
+70 102 1
+70 111 1
+70 114 1
+70 115 1
+70 140 1
+70 161 1
+70 176 1
+70 186 1
+70 195 1
+70 198 1
+70 199 1
+70 217 1
+70 232 1
+70 242 1
+70 251 1
+70 254 1
+70 255 1
+70 267 1
+70 277 1
+70 286 1
+70 289 1
+70 290 1
+70 297 1
+70 306 1
+70 309 1
+70 310 1
+70 316 1
+70 319 1
+70 320 1
+70 326 1
+70 327 1
+70 329 1
+70 350 1
+70 371 1
+70 386 1
+70 396 1
+70 405 1
+70 408 1
+70 409 1
+70 427 1
+70 442 1
+70 452 1
+70 461 1
+70 464 1
+70 465 1
+70 477 1
+70 487 1
+70 496 1
+70 499 1
+70 500 1
+70 507 1
+70 516 1
+70 519 1
+70 520 1
+70 526 1
+70 529 1
+70 530 1
+70 536 1
+70 537 1
+70 539 1
+70 553 1
+70 568 1
+70 578 1
+70 587 1
+70 590 1
+70 591 1
+70 603 1
+70 613 1
+70 622 1
+70 625 1
+70 626 1
+70 633 1
+70 642 1
+70 645 1
+70 646 1
+70 652 1
+70 655 1
+70 656 1
+70 662 1
+70 663 1
+70 665 1
+70 673 1
+70 683 1
+70 692 1
+70 695 1
+70 696 1
+70 703 1
+70 712 1
+70 715 1
+70 716 1
+70 722 1
+70 725 1
+70 726 1
+70 732 1
+70 733 1
+70 735 1
+70 738 1
+70 747 1
+70 750 1
+70 751 1
+70 757 1
+70 760 1
+70 761 1
+70 767 1
+70 768 1
+70 770 1
+70 772 1
+70 775 1
+70 776 1
+70 782 1
+70 783 1
+70 785 1
+70 787 1
+70 788 1
+70 790 1
+70 792 1
+70 812 1
+70 833 1
+70 848 1
+70 858 1
+70 867 1
+70 870 1
+70 871 1
+70 889 1
+70 904 1
+70 914 1
+70 923 1
+70 926 1
+70 927 1
+70 939 1
+70 949 1
+70 958 1
+70 961 1
+70 962 1
+70 969 1
+70 978 1
+70 981 1
+70 982 1
+70 988 1
+70 991 1
+70 992 1
+70 998 1
+70 999 1
+70 1001 1
+70 1015 1
+70 1030 1
+70 1040 1
+70 1049 1
+70 1052 1
+70 1053 1
+70 1065 1
+70 1075 1
+70 1084 1
+70 1087 1
+70 1088 1
+70 1095 1
+70 1104 1
+70 1107 1
+70 1108 1
+70 1114 1
+70 1117 1
+70 1118 1
+70 1124 1
+70 1125 1
+70 1127 1
+70 1135 1
+70 1145 1
+70 1154 1
+70 1157 1
+70 1158 1
+70 1165 1
+70 1174 1
+70 1177 1
+70 1178 1
+70 1184 1
+70 1187 1
+70 1188 1
+70 1194 1
+70 1195 1
+70 1197 1
+70 1200 1
+70 1209 1
+70 1212 1
+70 1213 1
+70 1219 1
+70 1222 1
+70 1223 1
+70 1229 1
+70 1230 1
+70 1232 1
+70 1234 1
+70 1237 1
+70 1238 1
+70 1244 1
+70 1245 1
+70 1247 1
+70 1249 1
+70 1250 1
+70 1252 1
+70 1254 1
+70 1267 1
+70 1282 1
+70 1292 1
+70 1301 1
+70 1304 1
+70 1305 1
+70 1317 1
+70 1327 1
+70 1336 1
+70 1339 1
+70 1340 1
+70 1347 1
+70 1356 1
+70 1359 1
+70 1360 1
+70 1366 1
+70 1369 1
+70 1370 1
+70 1376 1
+70 1377 1
+70 1379 1
+70 1387 1
+70 1397 1
+70 1406 1
+70 1409 1
+70 1410 1
+70 1417 1
+70 1426 1
+70 1429 1
+70 1430 1
+70 1436 1
+70 1439 1
+70 1440 1
+70 1446 1
+70 1447 1
+70 1449 1
+70 1452 1
+70 1461 1
+70 1464 1
+70 1465 1
+70 1471 1
+70 1474 1
+70 1475 1
+70 1481 1
+70 1482 1
+70 1484 1
+70 1486 1
+70 1489 1
+70 1490 1
+70 1496 1
+70 1497 1
+70 1499 1
+70 1501 1
+70 1502 1
+70 1504 1
+70 1506 1
+70 1513 1
+70 1523 1
+70 1532 1
+70 1535 1
+70 1536 1
+70 1543 1
+70 1552 1
+70 1555 1
+70 1556 1
+70 1562 1
+70 1565 1
+70 1566 1
+70 1572 1
+70 1573 1
+70 1575 1
+70 1578 1
+70 1587 1
+70 1590 1
+70 1591 1
+70 1597 1
+70 1600 1
+70 1601 1
+70 1607 1
+70 1608 1
+70 1610 1
+70 1612 1
+70 1615 1
+70 1616 1
+70 1622 1
+70 1623 1
+70 1625 1
+70 1627 1
+70 1628 1
+70 1630 1
+70 1632 1
+70 1634 1
+70 1643 1
+70 1646 1
+70 1647 1
+70 1653 1
+70 1656 1
+70 1657 1
+70 1663 1
+70 1664 1
+70 1666 1
+70 1668 1
+70 1671 1
+70 1672 1
+70 1678 1
+70 1679 1
+70 1681 1
+70 1683 1
+70 1684 1
+70 1686 1
+70 1688 1
+70 1689 1
+70 1692 1
+70 1693 1
+70 1699 1
+70 1700 1
+70 1702 1
+70 1704 1
+70 1705 1
+70 1707 1
+70 1709 1
+70 1710 1
+70 1711 1
+70 1713 1
+70 1715 1
+70 1716 1
+71 29 1
+71 57 1
+71 78 1
+71 93 1
+71 103 1
+71 112 1
+71 114 1
+71 116 1
+71 141 1
+71 162 1
+71 177 1
+71 187 1
+71 196 1
+71 198 1
+71 200 1
+71 218 1
+71 233 1
+71 243 1
+71 252 1
+71 254 1
+71 256 1
+71 268 1
+71 278 1
+71 287 1
+71 289 1
+71 291 1
+71 298 1
+71 307 1
+71 309 1
+71 311 1
+71 317 1
+71 319 1
+71 321 1
+71 326 1
+71 328 1
+71 329 1
+71 351 1
+71 372 1
+71 387 1
+71 397 1
+71 406 1
+71 408 1
+71 410 1
+71 428 1
+71 443 1
+71 453 1
+71 462 1
+71 464 1
+71 466 1
+71 478 1
+71 488 1
+71 497 1
+71 499 1
+71 501 1
+71 508 1
+71 517 1
+71 519 1
+71 521 1
+71 527 1
+71 529 1
+71 531 1
+71 536 1
+71 538 1
+71 539 1
+71 554 1
+71 569 1
+71 579 1
+71 588 1
+71 590 1
+71 592 1
+71 604 1
+71 614 1
+71 623 1
+71 625 1
+71 627 1
+71 634 1
+71 643 1
+71 645 1
+71 647 1
+71 653 1
+71 655 1
+71 657 1
+71 662 1
+71 664 1
+71 665 1
+71 674 1
+71 684 1
+71 693 1
+71 695 1
+71 697 1
+71 704 1
+71 713 1
+71 715 1
+71 717 1
+71 723 1
+71 725 1
+71 727 1
+71 732 1
+71 734 1
+71 735 1
+71 739 1
+71 748 1
+71 750 1
+71 752 1
+71 758 1
+71 760 1
+71 762 1
+71 767 1
+71 769 1
+71 770 1
+71 773 1
+71 775 1
+71 777 1
+71 782 1
+71 784 1
+71 785 1
+71 787 1
+71 789 1
+71 790 1
+71 792 1
+71 813 1
+71 834 1
+71 849 1
+71 859 1
+71 868 1
+71 870 1
+71 872 1
+71 890 1
+71 905 1
+71 915 1
+71 924 1
+71 926 1
+71 928 1
+71 940 1
+71 950 1
+71 959 1
+71 961 1
+71 963 1
+71 970 1
+71 979 1
+71 981 1
+71 983 1
+71 989 1
+71 991 1
+71 993 1
+71 998 1
+71 1000 1
+71 1001 1
+71 1016 1
+71 1031 1
+71 1041 1
+71 1050 1
+71 1052 1
+71 1054 1
+71 1066 1
+71 1076 1
+71 1085 1
+71 1087 1
+71 1089 1
+71 1096 1
+71 1105 1
+71 1107 1
+71 1109 1
+71 1115 1
+71 1117 1
+71 1119 1
+71 1124 1
+71 1126 1
+71 1127 1
+71 1136 1
+71 1146 1
+71 1155 1
+71 1157 1
+71 1159 1
+71 1166 1
+71 1175 1
+71 1177 1
+71 1179 1
+71 1185 1
+71 1187 1
+71 1189 1
+71 1194 1
+71 1196 1
+71 1197 1
+71 1201 1
+71 1210 1
+71 1212 1
+71 1214 1
+71 1220 1
+71 1222 1
+71 1224 1
+71 1229 1
+71 1231 1
+71 1232 1
+71 1235 1
+71 1237 1
+71 1239 1
+71 1244 1
+71 1246 1
+71 1247 1
+71 1249 1
+71 1251 1
+71 1252 1
+71 1254 1
+71 1268 1
+71 1283 1
+71 1293 1
+71 1302 1
+71 1304 1
+71 1306 1
+71 1318 1
+71 1328 1
+71 1337 1
+71 1339 1
+71 1341 1
+71 1348 1
+71 1357 1
+71 1359 1
+71 1361 1
+71 1367 1
+71 1369 1
+71 1371 1
+71 1376 1
+71 1378 1
+71 1379 1
+71 1388 1
+71 1398 1
+71 1407 1
+71 1409 1
+71 1411 1
+71 1418 1
+71 1427 1
+71 1429 1
+71 1431 1
+71 1437 1
+71 1439 1
+71 1441 1
+71 1446 1
+71 1448 1
+71 1449 1
+71 1453 1
+71 1462 1
+71 1464 1
+71 1466 1
+71 1472 1
+71 1474 1
+71 1476 1
+71 1481 1
+71 1483 1
+71 1484 1
+71 1487 1
+71 1489 1
+71 1491 1
+71 1496 1
+71 1498 1
+71 1499 1
+71 1501 1
+71 1503 1
+71 1504 1
+71 1506 1
+71 1514 1
+71 1524 1
+71 1533 1
+71 1535 1
+71 1537 1
+71 1544 1
+71 1553 1
+71 1555 1
+71 1557 1
+71 1563 1
+71 1565 1
+71 1567 1
+71 1572 1
+71 1574 1
+71 1575 1
+71 1579 1
+71 1588 1
+71 1590 1
+71 1592 1
+71 1598 1
+71 1600 1
+71 1602 1
+71 1607 1
+71 1609 1
+71 1610 1
+71 1613 1
+71 1615 1
+71 1617 1
+71 1622 1
+71 1624 1
+71 1625 1
+71 1627 1
+71 1629 1
+71 1630 1
+71 1632 1
+71 1635 1
+71 1644 1
+71 1646 1
+71 1648 1
+71 1654 1
+71 1656 1
+71 1658 1
+71 1663 1
+71 1665 1
+71 1666 1
+71 1669 1
+71 1671 1
+71 1673 1
+71 1678 1
+71 1680 1
+71 1681 1
+71 1683 1
+71 1685 1
+71 1686 1
+71 1688 1
+71 1690 1
+71 1692 1
+71 1694 1
+71 1699 1
+71 1701 1
+71 1702 1
+71 1704 1
+71 1706 1
+71 1707 1
+71 1709 1
+71 1710 1
+71 1712 1
+71 1713 1
+71 1715 1
+71 1716 1
+72 30 1
+72 58 1
+72 79 1
+72 94 1
+72 104 1
+72 113 1
+72 115 1
+72 116 1
+72 142 1
+72 163 1
+72 178 1
+72 188 1
+72 197 1
+72 199 1
+72 200 1
+72 219 1
+72 234 1
+72 244 1
+72 253 1
+72 255 1
+72 256 1
+72 269 1
+72 279 1
+72 288 1
+72 290 1
+72 291 1
+72 299 1
+72 308 1
+72 310 1
+72 311 1
+72 318 1
+72 320 1
+72 321 1
+72 327 1
+72 328 1
+72 329 1
+72 352 1
+72 373 1
+72 388 1
+72 398 1
+72 407 1
+72 409 1
+72 410 1
+72 429 1
+72 444 1
+72 454 1
+72 463 1
+72 465 1
+72 466 1
+72 479 1
+72 489 1
+72 498 1
+72 500 1
+72 501 1
+72 509 1
+72 518 1
+72 520 1
+72 521 1
+72 528 1
+72 530 1
+72 531 1
+72 537 1
+72 538 1
+72 539 1
+72 555 1
+72 570 1
+72 580 1
+72 589 1
+72 591 1
+72 592 1
+72 605 1
+72 615 1
+72 624 1
+72 626 1
+72 627 1
+72 635 1
+72 644 1
+72 646 1
+72 647 1
+72 654 1
+72 656 1
+72 657 1
+72 663 1
+72 664 1
+72 665 1
+72 675 1
+72 685 1
+72 694 1
+72 696 1
+72 697 1
+72 705 1
+72 714 1
+72 716 1
+72 717 1
+72 724 1
+72 726 1
+72 727 1
+72 733 1
+72 734 1
+72 735 1
+72 740 1
+72 749 1
+72 751 1
+72 752 1
+72 759 1
+72 761 1
+72 762 1
+72 768 1
+72 769 1
+72 770 1
+72 774 1
+72 776 1
+72 777 1
+72 783 1
+72 784 1
+72 785 1
+72 788 1
+72 789 1
+72 790 1
+72 792 1
+72 814 1
+72 835 1
+72 850 1
+72 860 1
+72 869 1
+72 871 1
+72 872 1
+72 891 1
+72 906 1
+72 916 1
+72 925 1
+72 927 1
+72 928 1
+72 941 1
+72 951 1
+72 960 1
+72 962 1
+72 963 1
+72 971 1
+72 980 1
+72 982 1
+72 983 1
+72 990 1
+72 992 1
+72 993 1
+72 999 1
+72 1000 1
+72 1001 1
+72 1017 1
+72 1032 1
+72 1042 1
+72 1051 1
+72 1053 1
+72 1054 1
+72 1067 1
+72 1077 1
+72 1086 1
+72 1088 1
+72 1089 1
+72 1097 1
+72 1106 1
+72 1108 1
+72 1109 1
+72 1116 1
+72 1118 1
+72 1119 1
+72 1125 1
+72 1126 1
+72 1127 1
+72 1137 1
+72 1147 1
+72 1156 1
+72 1158 1
+72 1159 1
+72 1167 1
+72 1176 1
+72 1178 1
+72 1179 1
+72 1186 1
+72 1188 1
+72 1189 1
+72 1195 1
+72 1196 1
+72 1197 1
+72 1202 1
+72 1211 1
+72 1213 1
+72 1214 1
+72 1221 1
+72 1223 1
+72 1224 1
+72 1230 1
+72 1231 1
+72 1232 1
+72 1236 1
+72 1238 1
+72 1239 1
+72 1245 1
+72 1246 1
+72 1247 1
+72 1250 1
+72 1251 1
+72 1252 1
+72 1254 1
+72 1269 1
+72 1284 1
+72 1294 1
+72 1303 1
+72 1305 1
+72 1306 1
+72 1319 1
+72 1329 1
+72 1338 1
+72 1340 1
+72 1341 1
+72 1349 1
+72 1358 1
+72 1360 1
+72 1361 1
+72 1368 1
+72 1370 1
+72 1371 1
+72 1377 1
+72 1378 1
+72 1379 1
+72 1389 1
+72 1399 1
+72 1408 1
+72 1410 1
+72 1411 1
+72 1419 1
+72 1428 1
+72 1430 1
+72 1431 1
+72 1438 1
+72 1440 1
+72 1441 1
+72 1447 1
+72 1448 1
+72 1449 1
+72 1454 1
+72 1463 1
+72 1465 1
+72 1466 1
+72 1473 1
+72 1475 1
+72 1476 1
+72 1482 1
+72 1483 1
+72 1484 1
+72 1488 1
+72 1490 1
+72 1491 1
+72 1497 1
+72 1498 1
+72 1499 1
+72 1502 1
+72 1503 1
+72 1504 1
+72 1506 1
+72 1515 1
+72 1525 1
+72 1534 1
+72 1536 1
+72 1537 1
+72 1545 1
+72 1554 1
+72 1556 1
+72 1557 1
+72 1564 1
+72 1566 1
+72 1567 1
+72 1573 1
+72 1574 1
+72 1575 1
+72 1580 1
+72 1589 1
+72 1591 1
+72 1592 1
+72 1599 1
+72 1601 1
+72 1602 1
+72 1608 1
+72 1609 1
+72 1610 1
+72 1614 1
+72 1616 1
+72 1617 1
+72 1623 1
+72 1624 1
+72 1625 1
+72 1628 1
+72 1629 1
+72 1630 1
+72 1632 1
+72 1636 1
+72 1645 1
+72 1647 1
+72 1648 1
+72 1655 1
+72 1657 1
+72 1658 1
+72 1664 1
+72 1665 1
+72 1666 1
+72 1670 1
+72 1672 1
+72 1673 1
+72 1679 1
+72 1680 1
+72 1681 1
+72 1684 1
+72 1685 1
+72 1686 1
+72 1688 1
+72 1691 1
+72 1693 1
+72 1694 1
+72 1700 1
+72 1701 1
+72 1702 1
+72 1705 1
+72 1706 1
+72 1707 1
+72 1709 1
+72 1711 1
+72 1712 1
+72 1713 1
+72 1715 1
+72 1716 1
+73 31 1
+73 59 1
+73 80 1
+73 95 1
+73 105 1
+73 111 1
+73 117 1
+73 118 1
+73 143 1
+73 164 1
+73 179 1
+73 189 1
+73 195 1
+73 201 1
+73 202 1
+73 220 1
+73 235 1
+73 245 1
+73 251 1
+73 257 1
+73 258 1
+73 270 1
+73 280 1
+73 286 1
+73 292 1
+73 293 1
+73 300 1
+73 306 1
+73 312 1
+73 313 1
+73 316 1
+73 322 1
+73 323 1
+73 326 1
+73 327 1
+73 330 1
+73 353 1
+73 374 1
+73 389 1
+73 399 1
+73 405 1
+73 411 1
+73 412 1
+73 430 1
+73 445 1
+73 455 1
+73 461 1
+73 467 1
+73 468 1
+73 480 1
+73 490 1
+73 496 1
+73 502 1
+73 503 1
+73 510 1
+73 516 1
+73 522 1
+73 523 1
+73 526 1
+73 532 1
+73 533 1
+73 536 1
+73 537 1
+73 540 1
+73 556 1
+73 571 1
+73 581 1
+73 587 1
+73 593 1
+73 594 1
+73 606 1
+73 616 1
+73 622 1
+73 628 1
+73 629 1
+73 636 1
+73 642 1
+73 648 1
+73 649 1
+73 652 1
+73 658 1
+73 659 1
+73 662 1
+73 663 1
+73 666 1
+73 676 1
+73 686 1
+73 692 1
+73 698 1
+73 699 1
+73 706 1
+73 712 1
+73 718 1
+73 719 1
+73 722 1
+73 728 1
+73 729 1
+73 732 1
+73 733 1
+73 736 1
+73 741 1
+73 747 1
+73 753 1
+73 754 1
+73 757 1
+73 763 1
+73 764 1
+73 767 1
+73 768 1
+73 771 1
+73 772 1
+73 778 1
+73 779 1
+73 782 1
+73 783 1
+73 786 1
+73 787 1
+73 788 1
+73 791 1
+73 792 1
+73 815 1
+73 836 1
+73 851 1
+73 861 1
+73 867 1
+73 873 1
+73 874 1
+73 892 1
+73 907 1
+73 917 1
+73 923 1
+73 929 1
+73 930 1
+73 942 1
+73 952 1
+73 958 1
+73 964 1
+73 965 1
+73 972 1
+73 978 1
+73 984 1
+73 985 1
+73 988 1
+73 994 1
+73 995 1
+73 998 1
+73 999 1
+73 1002 1
+73 1018 1
+73 1033 1
+73 1043 1
+73 1049 1
+73 1055 1
+73 1056 1
+73 1068 1
+73 1078 1
+73 1084 1
+73 1090 1
+73 1091 1
+73 1098 1
+73 1104 1
+73 1110 1
+73 1111 1
+73 1114 1
+73 1120 1
+73 1121 1
+73 1124 1
+73 1125 1
+73 1128 1
+73 1138 1
+73 1148 1
+73 1154 1
+73 1160 1
+73 1161 1
+73 1168 1
+73 1174 1
+73 1180 1
+73 1181 1
+73 1184 1
+73 1190 1
+73 1191 1
+73 1194 1
+73 1195 1
+73 1198 1
+73 1203 1
+73 1209 1
+73 1215 1
+73 1216 1
+73 1219 1
+73 1225 1
+73 1226 1
+73 1229 1
+73 1230 1
+73 1233 1
+73 1234 1
+73 1240 1
+73 1241 1
+73 1244 1
+73 1245 1
+73 1248 1
+73 1249 1
+73 1250 1
+73 1253 1
+73 1254 1
+73 1270 1
+73 1285 1
+73 1295 1
+73 1301 1
+73 1307 1
+73 1308 1
+73 1320 1
+73 1330 1
+73 1336 1
+73 1342 1
+73 1343 1
+73 1350 1
+73 1356 1
+73 1362 1
+73 1363 1
+73 1366 1
+73 1372 1
+73 1373 1
+73 1376 1
+73 1377 1
+73 1380 1
+73 1390 1
+73 1400 1
+73 1406 1
+73 1412 1
+73 1413 1
+73 1420 1
+73 1426 1
+73 1432 1
+73 1433 1
+73 1436 1
+73 1442 1
+73 1443 1
+73 1446 1
+73 1447 1
+73 1450 1
+73 1455 1
+73 1461 1
+73 1467 1
+73 1468 1
+73 1471 1
+73 1477 1
+73 1478 1
+73 1481 1
+73 1482 1
+73 1485 1
+73 1486 1
+73 1492 1
+73 1493 1
+73 1496 1
+73 1497 1
+73 1500 1
+73 1501 1
+73 1502 1
+73 1505 1
+73 1506 1
+73 1516 1
+73 1526 1
+73 1532 1
+73 1538 1
+73 1539 1
+73 1546 1
+73 1552 1
+73 1558 1
+73 1559 1
+73 1562 1
+73 1568 1
+73 1569 1
+73 1572 1
+73 1573 1
+73 1576 1
+73 1581 1
+73 1587 1
+73 1593 1
+73 1594 1
+73 1597 1
+73 1603 1
+73 1604 1
+73 1607 1
+73 1608 1
+73 1611 1
+73 1612 1
+73 1618 1
+73 1619 1
+73 1622 1
+73 1623 1
+73 1626 1
+73 1627 1
+73 1628 1
+73 1631 1
+73 1632 1
+73 1637 1
+73 1643 1
+73 1649 1
+73 1650 1
+73 1653 1
+73 1659 1
+73 1660 1
+73 1663 1
+73 1664 1
+73 1667 1
+73 1668 1
+73 1674 1
+73 1675 1
+73 1678 1
+73 1679 1
+73 1682 1
+73 1683 1
+73 1684 1
+73 1687 1
+73 1688 1
+73 1689 1
+73 1695 1
+73 1696 1
+73 1699 1
+73 1700 1
+73 1703 1
+73 1704 1
+73 1705 1
+73 1708 1
+73 1709 1
+73 1710 1
+73 1711 1
+73 1714 1
+73 1715 1
+73 1716 1
+74 32 1
+74 60 1
+74 81 1
+74 96 1
+74 106 1
+74 112 1
+74 117 1
+74 119 1
+74 144 1
+74 165 1
+74 180 1
+74 190 1
+74 196 1
+74 201 1
+74 203 1
+74 221 1
+74 236 1
+74 246 1
+74 252 1
+74 257 1
+74 259 1
+74 271 1
+74 281 1
+74 287 1
+74 292 1
+74 294 1
+74 301 1
+74 307 1
+74 312 1
+74 314 1
+74 317 1
+74 322 1
+74 324 1
+74 326 1
+74 328 1
+74 330 1
+74 354 1
+74 375 1
+74 390 1
+74 400 1
+74 406 1
+74 411 1
+74 413 1
+74 431 1
+74 446 1
+74 456 1
+74 462 1
+74 467 1
+74 469 1
+74 481 1
+74 491 1
+74 497 1
+74 502 1
+74 504 1
+74 511 1
+74 517 1
+74 522 1
+74 524 1
+74 527 1
+74 532 1
+74 534 1
+74 536 1
+74 538 1
+74 540 1
+74 557 1
+74 572 1
+74 582 1
+74 588 1
+74 593 1
+74 595 1
+74 607 1
+74 617 1
+74 623 1
+74 628 1
+74 630 1
+74 637 1
+74 643 1
+74 648 1
+74 650 1
+74 653 1
+74 658 1
+74 660 1
+74 662 1
+74 664 1
+74 666 1
+74 677 1
+74 687 1
+74 693 1
+74 698 1
+74 700 1
+74 707 1
+74 713 1
+74 718 1
+74 720 1
+74 723 1
+74 728 1
+74 730 1
+74 732 1
+74 734 1
+74 736 1
+74 742 1
+74 748 1
+74 753 1
+74 755 1
+74 758 1
+74 763 1
+74 765 1
+74 767 1
+74 769 1
+74 771 1
+74 773 1
+74 778 1
+74 780 1
+74 782 1
+74 784 1
+74 786 1
+74 787 1
+74 789 1
+74 791 1
+74 792 1
+74 816 1
+74 837 1
+74 852 1
+74 862 1
+74 868 1
+74 873 1
+74 875 1
+74 893 1
+74 908 1
+74 918 1
+74 924 1
+74 929 1
+74 931 1
+74 943 1
+74 953 1
+74 959 1
+74 964 1
+74 966 1
+74 973 1
+74 979 1
+74 984 1
+74 986 1
+74 989 1
+74 994 1
+74 996 1
+74 998 1
+74 1000 1
+74 1002 1
+74 1019 1
+74 1034 1
+74 1044 1
+74 1050 1
+74 1055 1
+74 1057 1
+74 1069 1
+74 1079 1
+74 1085 1
+74 1090 1
+74 1092 1
+74 1099 1
+74 1105 1
+74 1110 1
+74 1112 1
+74 1115 1
+74 1120 1
+74 1122 1
+74 1124 1
+74 1126 1
+74 1128 1
+74 1139 1
+74 1149 1
+74 1155 1
+74 1160 1
+74 1162 1
+74 1169 1
+74 1175 1
+74 1180 1
+74 1182 1
+74 1185 1
+74 1190 1
+74 1192 1
+74 1194 1
+74 1196 1
+74 1198 1
+74 1204 1
+74 1210 1
+74 1215 1
+74 1217 1
+74 1220 1
+74 1225 1
+74 1227 1
+74 1229 1
+74 1231 1
+74 1233 1
+74 1235 1
+74 1240 1
+74 1242 1
+74 1244 1
+74 1246 1
+74 1248 1
+74 1249 1
+74 1251 1
+74 1253 1
+74 1254 1
+74 1271 1
+74 1286 1
+74 1296 1
+74 1302 1
+74 1307 1
+74 1309 1
+74 1321 1
+74 1331 1
+74 1337 1
+74 1342 1
+74 1344 1
+74 1351 1
+74 1357 1
+74 1362 1
+74 1364 1
+74 1367 1
+74 1372 1
+74 1374 1
+74 1376 1
+74 1378 1
+74 1380 1
+74 1391 1
+74 1401 1
+74 1407 1
+74 1412 1
+74 1414 1
+74 1421 1
+74 1427 1
+74 1432 1
+74 1434 1
+74 1437 1
+74 1442 1
+74 1444 1
+74 1446 1
+74 1448 1
+74 1450 1
+74 1456 1
+74 1462 1
+74 1467 1
+74 1469 1
+74 1472 1
+74 1477 1
+74 1479 1
+74 1481 1
+74 1483 1
+74 1485 1
+74 1487 1
+74 1492 1
+74 1494 1
+74 1496 1
+74 1498 1
+74 1500 1
+74 1501 1
+74 1503 1
+74 1505 1
+74 1506 1
+74 1517 1
+74 1527 1
+74 1533 1
+74 1538 1
+74 1540 1
+74 1547 1
+74 1553 1
+74 1558 1
+74 1560 1
+74 1563 1
+74 1568 1
+74 1570 1
+74 1572 1
+74 1574 1
+74 1576 1
+74 1582 1
+74 1588 1
+74 1593 1
+74 1595 1
+74 1598 1
+74 1603 1
+74 1605 1
+74 1607 1
+74 1609 1
+74 1611 1
+74 1613 1
+74 1618 1
+74 1620 1
+74 1622 1
+74 1624 1
+74 1626 1
+74 1627 1
+74 1629 1
+74 1631 1
+74 1632 1
+74 1638 1
+74 1644 1
+74 1649 1
+74 1651 1
+74 1654 1
+74 1659 1
+74 1661 1
+74 1663 1
+74 1665 1
+74 1667 1
+74 1669 1
+74 1674 1
+74 1676 1
+74 1678 1
+74 1680 1
+74 1682 1
+74 1683 1
+74 1685 1
+74 1687 1
+74 1688 1
+74 1690 1
+74 1695 1
+74 1697 1
+74 1699 1
+74 1701 1
+74 1703 1
+74 1704 1
+74 1706 1
+74 1708 1
+74 1709 1
+74 1710 1
+74 1712 1
+74 1714 1
+74 1715 1
+74 1716 1
+75 33 1
+75 61 1
+75 82 1
+75 97 1
+75 107 1
+75 113 1
+75 118 1
+75 119 1
+75 145 1
+75 166 1
+75 181 1
+75 191 1
+75 197 1
+75 202 1
+75 203 1
+75 222 1
+75 237 1
+75 247 1
+75 253 1
+75 258 1
+75 259 1
+75 272 1
+75 282 1
+75 288 1
+75 293 1
+75 294 1
+75 302 1
+75 308 1
+75 313 1
+75 314 1
+75 318 1
+75 323 1
+75 324 1
+75 327 1
+75 328 1
+75 330 1
+75 355 1
+75 376 1
+75 391 1
+75 401 1
+75 407 1
+75 412 1
+75 413 1
+75 432 1
+75 447 1
+75 457 1
+75 463 1
+75 468 1
+75 469 1
+75 482 1
+75 492 1
+75 498 1
+75 503 1
+75 504 1
+75 512 1
+75 518 1
+75 523 1
+75 524 1
+75 528 1
+75 533 1
+75 534 1
+75 537 1
+75 538 1
+75 540 1
+75 558 1
+75 573 1
+75 583 1
+75 589 1
+75 594 1
+75 595 1
+75 608 1
+75 618 1
+75 624 1
+75 629 1
+75 630 1
+75 638 1
+75 644 1
+75 649 1
+75 650 1
+75 654 1
+75 659 1
+75 660 1
+75 663 1
+75 664 1
+75 666 1
+75 678 1
+75 688 1
+75 694 1
+75 699 1
+75 700 1
+75 708 1
+75 714 1
+75 719 1
+75 720 1
+75 724 1
+75 729 1
+75 730 1
+75 733 1
+75 734 1
+75 736 1
+75 743 1
+75 749 1
+75 754 1
+75 755 1
+75 759 1
+75 764 1
+75 765 1
+75 768 1
+75 769 1
+75 771 1
+75 774 1
+75 779 1
+75 780 1
+75 783 1
+75 784 1
+75 786 1
+75 788 1
+75 789 1
+75 791 1
+75 792 1
+75 817 1
+75 838 1
+75 853 1
+75 863 1
+75 869 1
+75 874 1
+75 875 1
+75 894 1
+75 909 1
+75 919 1
+75 925 1
+75 930 1
+75 931 1
+75 944 1
+75 954 1
+75 960 1
+75 965 1
+75 966 1
+75 974 1
+75 980 1
+75 985 1
+75 986 1
+75 990 1
+75 995 1
+75 996 1
+75 999 1
+75 1000 1
+75 1002 1
+75 1020 1
+75 1035 1
+75 1045 1
+75 1051 1
+75 1056 1
+75 1057 1
+75 1070 1
+75 1080 1
+75 1086 1
+75 1091 1
+75 1092 1
+75 1100 1
+75 1106 1
+75 1111 1
+75 1112 1
+75 1116 1
+75 1121 1
+75 1122 1
+75 1125 1
+75 1126 1
+75 1128 1
+75 1140 1
+75 1150 1
+75 1156 1
+75 1161 1
+75 1162 1
+75 1170 1
+75 1176 1
+75 1181 1
+75 1182 1
+75 1186 1
+75 1191 1
+75 1192 1
+75 1195 1
+75 1196 1
+75 1198 1
+75 1205 1
+75 1211 1
+75 1216 1
+75 1217 1
+75 1221 1
+75 1226 1
+75 1227 1
+75 1230 1
+75 1231 1
+75 1233 1
+75 1236 1
+75 1241 1
+75 1242 1
+75 1245 1
+75 1246 1
+75 1248 1
+75 1250 1
+75 1251 1
+75 1253 1
+75 1254 1
+75 1272 1
+75 1287 1
+75 1297 1
+75 1303 1
+75 1308 1
+75 1309 1
+75 1322 1
+75 1332 1
+75 1338 1
+75 1343 1
+75 1344 1
+75 1352 1
+75 1358 1
+75 1363 1
+75 1364 1
+75 1368 1
+75 1373 1
+75 1374 1
+75 1377 1
+75 1378 1
+75 1380 1
+75 1392 1
+75 1402 1
+75 1408 1
+75 1413 1
+75 1414 1
+75 1422 1
+75 1428 1
+75 1433 1
+75 1434 1
+75 1438 1
+75 1443 1
+75 1444 1
+75 1447 1
+75 1448 1
+75 1450 1
+75 1457 1
+75 1463 1
+75 1468 1
+75 1469 1
+75 1473 1
+75 1478 1
+75 1479 1
+75 1482 1
+75 1483 1
+75 1485 1
+75 1488 1
+75 1493 1
+75 1494 1
+75 1497 1
+75 1498 1
+75 1500 1
+75 1502 1
+75 1503 1
+75 1505 1
+75 1506 1
+75 1518 1
+75 1528 1
+75 1534 1
+75 1539 1
+75 1540 1
+75 1548 1
+75 1554 1
+75 1559 1
+75 1560 1
+75 1564 1
+75 1569 1
+75 1570 1
+75 1573 1
+75 1574 1
+75 1576 1
+75 1583 1
+75 1589 1
+75 1594 1
+75 1595 1
+75 1599 1
+75 1604 1
+75 1605 1
+75 1608 1
+75 1609 1
+75 1611 1
+75 1614 1
+75 1619 1
+75 1620 1
+75 1623 1
+75 1624 1
+75 1626 1
+75 1628 1
+75 1629 1
+75 1631 1
+75 1632 1
+75 1639 1
+75 1645 1
+75 1650 1
+75 1651 1
+75 1655 1
+75 1660 1
+75 1661 1
+75 1664 1
+75 1665 1
+75 1667 1
+75 1670 1
+75 1675 1
+75 1676 1
+75 1679 1
+75 1680 1
+75 1682 1
+75 1684 1
+75 1685 1
+75 1687 1
+75 1688 1
+75 1691 1
+75 1696 1
+75 1697 1
+75 1700 1
+75 1701 1
+75 1703 1
+75 1705 1
+75 1706 1
+75 1708 1
+75 1709 1
+75 1711 1
+75 1712 1
+75 1714 1
+75 1715 1
+75 1716 1
+76 34 1
+76 62 1
+76 83 1
+76 98 1
+76 108 1
+76 114 1
+76 117 1
+76 120 1
+76 146 1
+76 167 1
+76 182 1
+76 192 1
+76 198 1
+76 201 1
+76 204 1
+76 223 1
+76 238 1
+76 248 1
+76 254 1
+76 257 1
+76 260 1
+76 273 1
+76 283 1
+76 289 1
+76 292 1
+76 295 1
+76 303 1
+76 309 1
+76 312 1
+76 315 1
+76 319 1
+76 322 1
+76 325 1
+76 326 1
+76 329 1
+76 330 1
+76 356 1
+76 377 1
+76 392 1
+76 402 1
+76 408 1
+76 411 1
+76 414 1
+76 433 1
+76 448 1
+76 458 1
+76 464 1
+76 467 1
+76 470 1
+76 483 1
+76 493 1
+76 499 1
+76 502 1
+76 505 1
+76 513 1
+76 519 1
+76 522 1
+76 525 1
+76 529 1
+76 532 1
+76 535 1
+76 536 1
+76 539 1
+76 540 1
+76 559 1
+76 574 1
+76 584 1
+76 590 1
+76 593 1
+76 596 1
+76 609 1
+76 619 1
+76 625 1
+76 628 1
+76 631 1
+76 639 1
+76 645 1
+76 648 1
+76 651 1
+76 655 1
+76 658 1
+76 661 1
+76 662 1
+76 665 1
+76 666 1
+76 679 1
+76 689 1
+76 695 1
+76 698 1
+76 701 1
+76 709 1
+76 715 1
+76 718 1
+76 721 1
+76 725 1
+76 728 1
+76 731 1
+76 732 1
+76 735 1
+76 736 1
+76 744 1
+76 750 1
+76 753 1
+76 756 1
+76 760 1
+76 763 1
+76 766 1
+76 767 1
+76 770 1
+76 771 1
+76 775 1
+76 778 1
+76 781 1
+76 782 1
+76 785 1
+76 786 1
+76 787 1
+76 790 1
+76 791 1
+76 792 1
+76 818 1
+76 839 1
+76 854 1
+76 864 1
+76 870 1
+76 873 1
+76 876 1
+76 895 1
+76 910 1
+76 920 1
+76 926 1
+76 929 1
+76 932 1
+76 945 1
+76 955 1
+76 961 1
+76 964 1
+76 967 1
+76 975 1
+76 981 1
+76 984 1
+76 987 1
+76 991 1
+76 994 1
+76 997 1
+76 998 1
+76 1001 1
+76 1002 1
+76 1021 1
+76 1036 1
+76 1046 1
+76 1052 1
+76 1055 1
+76 1058 1
+76 1071 1
+76 1081 1
+76 1087 1
+76 1090 1
+76 1093 1
+76 1101 1
+76 1107 1
+76 1110 1
+76 1113 1
+76 1117 1
+76 1120 1
+76 1123 1
+76 1124 1
+76 1127 1
+76 1128 1
+76 1141 1
+76 1151 1
+76 1157 1
+76 1160 1
+76 1163 1
+76 1171 1
+76 1177 1
+76 1180 1
+76 1183 1
+76 1187 1
+76 1190 1
+76 1193 1
+76 1194 1
+76 1197 1
+76 1198 1
+76 1206 1
+76 1212 1
+76 1215 1
+76 1218 1
+76 1222 1
+76 1225 1
+76 1228 1
+76 1229 1
+76 1232 1
+76 1233 1
+76 1237 1
+76 1240 1
+76 1243 1
+76 1244 1
+76 1247 1
+76 1248 1
+76 1249 1
+76 1252 1
+76 1253 1
+76 1254 1
+76 1273 1
+76 1288 1
+76 1298 1
+76 1304 1
+76 1307 1
+76 1310 1
+76 1323 1
+76 1333 1
+76 1339 1
+76 1342 1
+76 1345 1
+76 1353 1
+76 1359 1
+76 1362 1
+76 1365 1
+76 1369 1
+76 1372 1
+76 1375 1
+76 1376 1
+76 1379 1
+76 1380 1
+76 1393 1
+76 1403 1
+76 1409 1
+76 1412 1
+76 1415 1
+76 1423 1
+76 1429 1
+76 1432 1
+76 1435 1
+76 1439 1
+76 1442 1
+76 1445 1
+76 1446 1
+76 1449 1
+76 1450 1
+76 1458 1
+76 1464 1
+76 1467 1
+76 1470 1
+76 1474 1
+76 1477 1
+76 1480 1
+76 1481 1
+76 1484 1
+76 1485 1
+76 1489 1
+76 1492 1
+76 1495 1
+76 1496 1
+76 1499 1
+76 1500 1
+76 1501 1
+76 1504 1
+76 1505 1
+76 1506 1
+76 1519 1
+76 1529 1
+76 1535 1
+76 1538 1
+76 1541 1
+76 1549 1
+76 1555 1
+76 1558 1
+76 1561 1
+76 1565 1
+76 1568 1
+76 1571 1
+76 1572 1
+76 1575 1
+76 1576 1
+76 1584 1
+76 1590 1
+76 1593 1
+76 1596 1
+76 1600 1
+76 1603 1
+76 1606 1
+76 1607 1
+76 1610 1
+76 1611 1
+76 1615 1
+76 1618 1
+76 1621 1
+76 1622 1
+76 1625 1
+76 1626 1
+76 1627 1
+76 1630 1
+76 1631 1
+76 1632 1
+76 1640 1
+76 1646 1
+76 1649 1
+76 1652 1
+76 1656 1
+76 1659 1
+76 1662 1
+76 1663 1
+76 1666 1
+76 1667 1
+76 1671 1
+76 1674 1
+76 1677 1
+76 1678 1
+76 1681 1
+76 1682 1
+76 1683 1
+76 1686 1
+76 1687 1
+76 1688 1
+76 1692 1
+76 1695 1
+76 1698 1
+76 1699 1
+76 1702 1
+76 1703 1
+76 1704 1
+76 1707 1
+76 1708 1
+76 1709 1
+76 1710 1
+76 1713 1
+76 1714 1
+76 1715 1
+76 1716 1
+77 35 1
+77 63 1
+77 84 1
+77 99 1
+77 109 1
+77 115 1
+77 118 1
+77 120 1
+77 147 1
+77 168 1
+77 183 1
+77 193 1
+77 199 1
+77 202 1
+77 204 1
+77 224 1
+77 239 1
+77 249 1
+77 255 1
+77 258 1
+77 260 1
+77 274 1
+77 284 1
+77 290 1
+77 293 1
+77 295 1
+77 304 1
+77 310 1
+77 313 1
+77 315 1
+77 320 1
+77 323 1
+77 325 1
+77 327 1
+77 329 1
+77 330 1
+77 357 1
+77 378 1
+77 393 1
+77 403 1
+77 409 1
+77 412 1
+77 414 1
+77 434 1
+77 449 1
+77 459 1
+77 465 1
+77 468 1
+77 470 1
+77 484 1
+77 494 1
+77 500 1
+77 503 1
+77 505 1
+77 514 1
+77 520 1
+77 523 1
+77 525 1
+77 530 1
+77 533 1
+77 535 1
+77 537 1
+77 539 1
+77 540 1
+77 560 1
+77 575 1
+77 585 1
+77 591 1
+77 594 1
+77 596 1
+77 610 1
+77 620 1
+77 626 1
+77 629 1
+77 631 1
+77 640 1
+77 646 1
+77 649 1
+77 651 1
+77 656 1
+77 659 1
+77 661 1
+77 663 1
+77 665 1
+77 666 1
+77 680 1
+77 690 1
+77 696 1
+77 699 1
+77 701 1
+77 710 1
+77 716 1
+77 719 1
+77 721 1
+77 726 1
+77 729 1
+77 731 1
+77 733 1
+77 735 1
+77 736 1
+77 745 1
+77 751 1
+77 754 1
+77 756 1
+77 761 1
+77 764 1
+77 766 1
+77 768 1
+77 770 1
+77 771 1
+77 776 1
+77 779 1
+77 781 1
+77 783 1
+77 785 1
+77 786 1
+77 788 1
+77 790 1
+77 791 1
+77 792 1
+77 819 1
+77 840 1
+77 855 1
+77 865 1
+77 871 1
+77 874 1
+77 876 1
+77 896 1
+77 911 1
+77 921 1
+77 927 1
+77 930 1
+77 932 1
+77 946 1
+77 956 1
+77 962 1
+77 965 1
+77 967 1
+77 976 1
+77 982 1
+77 985 1
+77 987 1
+77 992 1
+77 995 1
+77 997 1
+77 999 1
+77 1001 1
+77 1002 1
+77 1022 1
+77 1037 1
+77 1047 1
+77 1053 1
+77 1056 1
+77 1058 1
+77 1072 1
+77 1082 1
+77 1088 1
+77 1091 1
+77 1093 1
+77 1102 1
+77 1108 1
+77 1111 1
+77 1113 1
+77 1118 1
+77 1121 1
+77 1123 1
+77 1125 1
+77 1127 1
+77 1128 1
+77 1142 1
+77 1152 1
+77 1158 1
+77 1161 1
+77 1163 1
+77 1172 1
+77 1178 1
+77 1181 1
+77 1183 1
+77 1188 1
+77 1191 1
+77 1193 1
+77 1195 1
+77 1197 1
+77 1198 1
+77 1207 1
+77 1213 1
+77 1216 1
+77 1218 1
+77 1223 1
+77 1226 1
+77 1228 1
+77 1230 1
+77 1232 1
+77 1233 1
+77 1238 1
+77 1241 1
+77 1243 1
+77 1245 1
+77 1247 1
+77 1248 1
+77 1250 1
+77 1252 1
+77 1253 1
+77 1254 1
+77 1274 1
+77 1289 1
+77 1299 1
+77 1305 1
+77 1308 1
+77 1310 1
+77 1324 1
+77 1334 1
+77 1340 1
+77 1343 1
+77 1345 1
+77 1354 1
+77 1360 1
+77 1363 1
+77 1365 1
+77 1370 1
+77 1373 1
+77 1375 1
+77 1377 1
+77 1379 1
+77 1380 1
+77 1394 1
+77 1404 1
+77 1410 1
+77 1413 1
+77 1415 1
+77 1424 1
+77 1430 1
+77 1433 1
+77 1435 1
+77 1440 1
+77 1443 1
+77 1445 1
+77 1447 1
+77 1449 1
+77 1450 1
+77 1459 1
+77 1465 1
+77 1468 1
+77 1470 1
+77 1475 1
+77 1478 1
+77 1480 1
+77 1482 1
+77 1484 1
+77 1485 1
+77 1490 1
+77 1493 1
+77 1495 1
+77 1497 1
+77 1499 1
+77 1500 1
+77 1502 1
+77 1504 1
+77 1505 1
+77 1506 1
+77 1520 1
+77 1530 1
+77 1536 1
+77 1539 1
+77 1541 1
+77 1550 1
+77 1556 1
+77 1559 1
+77 1561 1
+77 1566 1
+77 1569 1
+77 1571 1
+77 1573 1
+77 1575 1
+77 1576 1
+77 1585 1
+77 1591 1
+77 1594 1
+77 1596 1
+77 1601 1
+77 1604 1
+77 1606 1
+77 1608 1
+77 1610 1
+77 1611 1
+77 1616 1
+77 1619 1
+77 1621 1
+77 1623 1
+77 1625 1
+77 1626 1
+77 1628 1
+77 1630 1
+77 1631 1
+77 1632 1
+77 1641 1
+77 1647 1
+77 1650 1
+77 1652 1
+77 1657 1
+77 1660 1
+77 1662 1
+77 1664 1
+77 1666 1
+77 1667 1
+77 1672 1
+77 1675 1
+77 1677 1
+77 1679 1
+77 1681 1
+77 1682 1
+77 1684 1
+77 1686 1
+77 1687 1
+77 1688 1
+77 1693 1
+77 1696 1
+77 1698 1
+77 1700 1
+77 1702 1
+77 1703 1
+77 1705 1
+77 1707 1
+77 1708 1
+77 1709 1
+77 1711 1
+77 1713 1
+77 1714 1
+77 1715 1
+77 1716 1
+78 36 1
+78 64 1
+78 85 1
+78 100 1
+78 110 1
+78 116 1
+78 119 1
+78 120 1
+78 148 1
+78 169 1
+78 184 1
+78 194 1
+78 200 1
+78 203 1
+78 204 1
+78 225 1
+78 240 1
+78 250 1
+78 256 1
+78 259 1
+78 260 1
+78 275 1
+78 285 1
+78 291 1
+78 294 1
+78 295 1
+78 305 1
+78 311 1
+78 314 1
+78 315 1
+78 321 1
+78 324 1
+78 325 1
+78 328 1
+78 329 1
+78 330 1
+78 358 1
+78 379 1
+78 394 1
+78 404 1
+78 410 1
+78 413 1
+78 414 1
+78 435 1
+78 450 1
+78 460 1
+78 466 1
+78 469 1
+78 470 1
+78 485 1
+78 495 1
+78 501 1
+78 504 1
+78 505 1
+78 515 1
+78 521 1
+78 524 1
+78 525 1
+78 531 1
+78 534 1
+78 535 1
+78 538 1
+78 539 1
+78 540 1
+78 561 1
+78 576 1
+78 586 1
+78 592 1
+78 595 1
+78 596 1
+78 611 1
+78 621 1
+78 627 1
+78 630 1
+78 631 1
+78 641 1
+78 647 1
+78 650 1
+78 651 1
+78 657 1
+78 660 1
+78 661 1
+78 664 1
+78 665 1
+78 666 1
+78 681 1
+78 691 1
+78 697 1
+78 700 1
+78 701 1
+78 711 1
+78 717 1
+78 720 1
+78 721 1
+78 727 1
+78 730 1
+78 731 1
+78 734 1
+78 735 1
+78 736 1
+78 746 1
+78 752 1
+78 755 1
+78 756 1
+78 762 1
+78 765 1
+78 766 1
+78 769 1
+78 770 1
+78 771 1
+78 777 1
+78 780 1
+78 781 1
+78 784 1
+78 785 1
+78 786 1
+78 789 1
+78 790 1
+78 791 1
+78 792 1
+78 820 1
+78 841 1
+78 856 1
+78 866 1
+78 872 1
+78 875 1
+78 876 1
+78 897 1
+78 912 1
+78 922 1
+78 928 1
+78 931 1
+78 932 1
+78 947 1
+78 957 1
+78 963 1
+78 966 1
+78 967 1
+78 977 1
+78 983 1
+78 986 1
+78 987 1
+78 993 1
+78 996 1
+78 997 1
+78 1000 1
+78 1001 1
+78 1002 1
+78 1023 1
+78 1038 1
+78 1048 1
+78 1054 1
+78 1057 1
+78 1058 1
+78 1073 1
+78 1083 1
+78 1089 1
+78 1092 1
+78 1093 1
+78 1103 1
+78 1109 1
+78 1112 1
+78 1113 1
+78 1119 1
+78 1122 1
+78 1123 1
+78 1126 1
+78 1127 1
+78 1128 1
+78 1143 1
+78 1153 1
+78 1159 1
+78 1162 1
+78 1163 1
+78 1173 1
+78 1179 1
+78 1182 1
+78 1183 1
+78 1189 1
+78 1192 1
+78 1193 1
+78 1196 1
+78 1197 1
+78 1198 1
+78 1208 1
+78 1214 1
+78 1217 1
+78 1218 1
+78 1224 1
+78 1227 1
+78 1228 1
+78 1231 1
+78 1232 1
+78 1233 1
+78 1239 1
+78 1242 1
+78 1243 1
+78 1246 1
+78 1247 1
+78 1248 1
+78 1251 1
+78 1252 1
+78 1253 1
+78 1254 1
+78 1275 1
+78 1290 1
+78 1300 1
+78 1306 1
+78 1309 1
+78 1310 1
+78 1325 1
+78 1335 1
+78 1341 1
+78 1344 1
+78 1345 1
+78 1355 1
+78 1361 1
+78 1364 1
+78 1365 1
+78 1371 1
+78 1374 1
+78 1375 1
+78 1378 1
+78 1379 1
+78 1380 1
+78 1395 1
+78 1405 1
+78 1411 1
+78 1414 1
+78 1415 1
+78 1425 1
+78 1431 1
+78 1434 1
+78 1435 1
+78 1441 1
+78 1444 1
+78 1445 1
+78 1448 1
+78 1449 1
+78 1450 1
+78 1460 1
+78 1466 1
+78 1469 1
+78 1470 1
+78 1476 1
+78 1479 1
+78 1480 1
+78 1483 1
+78 1484 1
+78 1485 1
+78 1491 1
+78 1494 1
+78 1495 1
+78 1498 1
+78 1499 1
+78 1500 1
+78 1503 1
+78 1504 1
+78 1505 1
+78 1506 1
+78 1521 1
+78 1531 1
+78 1537 1
+78 1540 1
+78 1541 1
+78 1551 1
+78 1557 1
+78 1560 1
+78 1561 1
+78 1567 1
+78 1570 1
+78 1571 1
+78 1574 1
+78 1575 1
+78 1576 1
+78 1586 1
+78 1592 1
+78 1595 1
+78 1596 1
+78 1602 1
+78 1605 1
+78 1606 1
+78 1609 1
+78 1610 1
+78 1611 1
+78 1617 1
+78 1620 1
+78 1621 1
+78 1624 1
+78 1625 1
+78 1626 1
+78 1629 1
+78 1630 1
+78 1631 1
+78 1632 1
+78 1642 1
+78 1648 1
+78 1651 1
+78 1652 1
+78 1658 1
+78 1661 1
+78 1662 1
+78 1665 1
+78 1666 1
+78 1667 1
+78 1673 1
+78 1676 1
+78 1677 1
+78 1680 1
+78 1681 1
+78 1682 1
+78 1685 1
+78 1686 1
+78 1687 1
+78 1688 1
+78 1694 1
+78 1697 1
+78 1698 1
+78 1701 1
+78 1702 1
+78 1703 1
+78 1706 1
+78 1707 1
+78 1708 1
+78 1709 1
+78 1712 1
+78 1713 1
+78 1714 1
+78 1715 1
+78 1716 1
+0 0 0
diff --git a/benchmarks/matrix/bibd_13_6_78x1716.sms.gz b/benchmarks/matrix/bibd_13_6_78x1716.sms.gz
new file mode 100644
index 0000000..f12f572
Binary files /dev/null and b/benchmarks/matrix/bibd_13_6_78x1716.sms.gz differ
diff --git a/benchmarks/matrix/bibd_14_7_91x3432.sms b/benchmarks/matrix/bibd_14_7_91x3432.sms
new file mode 100644
index 0000000..d0453e6
--- /dev/null
+++ b/benchmarks/matrix/bibd_14_7_91x3432.sms
@@ -0,0 +1,72074 @@
+91 3432 M
+1 1 1
+1 2 1
+1 3 1
+1 4 1
+1 5 1
+1 6 1
+1 7 1
+1 8 1
+1 9 1
+1 10 1
+1 11 1
+1 12 1
+1 13 1
+1 14 1
+1 15 1
+1 16 1
+1 17 1
+1 18 1
+1 19 1
+1 20 1
+1 21 1
+1 22 1
+1 23 1
+1 24 1
+1 25 1
+1 26 1
+1 27 1
+1 28 1
+1 29 1
+1 30 1
+1 31 1
+1 32 1
+1 33 1
+1 34 1
+1 35 1
+1 36 1
+1 37 1
+1 38 1
+1 39 1
+1 40 1
+1 41 1
+1 42 1
+1 43 1
+1 44 1
+1 45 1
+1 46 1
+1 47 1
+1 48 1
+1 49 1
+1 50 1
+1 51 1
+1 52 1
+1 53 1
+1 54 1
+1 55 1
+1 56 1
+1 57 1
+1 58 1
+1 59 1
+1 60 1
+1 61 1
+1 62 1
+1 63 1
+1 64 1
+1 65 1
+1 66 1
+1 67 1
+1 68 1
+1 69 1
+1 70 1
+1 71 1
+1 72 1
+1 73 1
+1 74 1
+1 75 1
+1 76 1
+1 77 1
+1 78 1
+1 79 1
+1 80 1
+1 81 1
+1 82 1
+1 83 1
+1 84 1
+1 85 1
+1 86 1
+1 87 1
+1 88 1
+1 89 1
+1 90 1
+1 91 1
+1 92 1
+1 93 1
+1 94 1
+1 95 1
+1 96 1
+1 97 1
+1 98 1
+1 99 1
+1 100 1
+1 101 1
+1 102 1
+1 103 1
+1 104 1
+1 105 1
+1 106 1
+1 107 1
+1 108 1
+1 109 1
+1 110 1
+1 111 1
+1 112 1
+1 113 1
+1 114 1
+1 115 1
+1 116 1
+1 117 1
+1 118 1
+1 119 1
+1 120 1
+1 121 1
+1 122 1
+1 123 1
+1 124 1
+1 125 1
+1 126 1
+1 127 1
+1 128 1
+1 129 1
+1 130 1
+1 131 1
+1 132 1
+1 133 1
+1 134 1
+1 135 1
+1 136 1
+1 137 1
+1 138 1
+1 139 1
+1 140 1
+1 141 1
+1 142 1
+1 143 1
+1 144 1
+1 145 1
+1 146 1
+1 147 1
+1 148 1
+1 149 1
+1 150 1
+1 151 1
+1 152 1
+1 153 1
+1 154 1
+1 155 1
+1 156 1
+1 157 1
+1 158 1
+1 159 1
+1 160 1
+1 161 1
+1 162 1
+1 163 1
+1 164 1
+1 165 1
+1 166 1
+1 167 1
+1 168 1
+1 169 1
+1 170 1
+1 171 1
+1 172 1
+1 173 1
+1 174 1
+1 175 1
+1 176 1
+1 177 1
+1 178 1
+1 179 1
+1 180 1
+1 181 1
+1 182 1
+1 183 1
+1 184 1
+1 185 1
+1 186 1
+1 187 1
+1 188 1
+1 189 1
+1 190 1
+1 191 1
+1 192 1
+1 193 1
+1 194 1
+1 195 1
+1 196 1
+1 197 1
+1 198 1
+1 199 1
+1 200 1
+1 201 1
+1 202 1
+1 203 1
+1 204 1
+1 205 1
+1 206 1
+1 207 1
+1 208 1
+1 209 1
+1 210 1
+1 211 1
+1 212 1
+1 213 1
+1 214 1
+1 215 1
+1 216 1
+1 217 1
+1 218 1
+1 219 1
+1 220 1
+1 221 1
+1 222 1
+1 223 1
+1 224 1
+1 225 1
+1 226 1
+1 227 1
+1 228 1
+1 229 1
+1 230 1
+1 231 1
+1 232 1
+1 233 1
+1 234 1
+1 235 1
+1 236 1
+1 237 1
+1 238 1
+1 239 1
+1 240 1
+1 241 1
+1 242 1
+1 243 1
+1 244 1
+1 245 1
+1 246 1
+1 247 1
+1 248 1
+1 249 1
+1 250 1
+1 251 1
+1 252 1
+1 253 1
+1 254 1
+1 255 1
+1 256 1
+1 257 1
+1 258 1
+1 259 1
+1 260 1
+1 261 1
+1 262 1
+1 263 1
+1 264 1
+1 265 1
+1 266 1
+1 267 1
+1 268 1
+1 269 1
+1 270 1
+1 271 1
+1 272 1
+1 273 1
+1 274 1
+1 275 1
+1 276 1
+1 277 1
+1 278 1
+1 279 1
+1 280 1
+1 281 1
+1 282 1
+1 283 1
+1 284 1
+1 285 1
+1 286 1
+1 287 1
+1 288 1
+1 289 1
+1 290 1
+1 291 1
+1 292 1
+1 293 1
+1 294 1
+1 295 1
+1 296 1
+1 297 1
+1 298 1
+1 299 1
+1 300 1
+1 301 1
+1 302 1
+1 303 1
+1 304 1
+1 305 1
+1 306 1
+1 307 1
+1 308 1
+1 309 1
+1 310 1
+1 311 1
+1 312 1
+1 313 1
+1 314 1
+1 315 1
+1 316 1
+1 317 1
+1 318 1
+1 319 1
+1 320 1
+1 321 1
+1 322 1
+1 323 1
+1 324 1
+1 325 1
+1 326 1
+1 327 1
+1 328 1
+1 329 1
+1 330 1
+1 331 1
+1 332 1
+1 333 1
+1 334 1
+1 335 1
+1 336 1
+1 337 1
+1 338 1
+1 339 1
+1 340 1
+1 341 1
+1 342 1
+1 343 1
+1 344 1
+1 345 1
+1 346 1
+1 347 1
+1 348 1
+1 349 1
+1 350 1
+1 351 1
+1 352 1
+1 353 1
+1 354 1
+1 355 1
+1 356 1
+1 357 1
+1 358 1
+1 359 1
+1 360 1
+1 361 1
+1 362 1
+1 363 1
+1 364 1
+1 365 1
+1 366 1
+1 367 1
+1 368 1
+1 369 1
+1 370 1
+1 371 1
+1 372 1
+1 373 1
+1 374 1
+1 375 1
+1 376 1
+1 377 1
+1 378 1
+1 379 1
+1 380 1
+1 381 1
+1 382 1
+1 383 1
+1 384 1
+1 385 1
+1 386 1
+1 387 1
+1 388 1
+1 389 1
+1 390 1
+1 391 1
+1 392 1
+1 393 1
+1 394 1
+1 395 1
+1 396 1
+1 397 1
+1 398 1
+1 399 1
+1 400 1
+1 401 1
+1 402 1
+1 403 1
+1 404 1
+1 405 1
+1 406 1
+1 407 1
+1 408 1
+1 409 1
+1 410 1
+1 411 1
+1 412 1
+1 413 1
+1 414 1
+1 415 1
+1 416 1
+1 417 1
+1 418 1
+1 419 1
+1 420 1
+1 421 1
+1 422 1
+1 423 1
+1 424 1
+1 425 1
+1 426 1
+1 427 1
+1 428 1
+1 429 1
+1 430 1
+1 431 1
+1 432 1
+1 433 1
+1 434 1
+1 435 1
+1 436 1
+1 437 1
+1 438 1
+1 439 1
+1 440 1
+1 441 1
+1 442 1
+1 443 1
+1 444 1
+1 445 1
+1 446 1
+1 447 1
+1 448 1
+1 449 1
+1 450 1
+1 451 1
+1 452 1
+1 453 1
+1 454 1
+1 455 1
+1 456 1
+1 457 1
+1 458 1
+1 459 1
+1 460 1
+1 461 1
+1 462 1
+1 463 1
+1 464 1
+1 465 1
+1 466 1
+1 467 1
+1 468 1
+1 469 1
+1 470 1
+1 471 1
+1 472 1
+1 473 1
+1 474 1
+1 475 1
+1 476 1
+1 477 1
+1 478 1
+1 479 1
+1 480 1
+1 481 1
+1 482 1
+1 483 1
+1 484 1
+1 485 1
+1 486 1
+1 487 1
+1 488 1
+1 489 1
+1 490 1
+1 491 1
+1 492 1
+1 493 1
+1 494 1
+1 495 1
+1 496 1
+1 497 1
+1 498 1
+1 499 1
+1 500 1
+1 501 1
+1 502 1
+1 503 1
+1 504 1
+1 505 1
+1 506 1
+1 507 1
+1 508 1
+1 509 1
+1 510 1
+1 511 1
+1 512 1
+1 513 1
+1 514 1
+1 515 1
+1 516 1
+1 517 1
+1 518 1
+1 519 1
+1 520 1
+1 521 1
+1 522 1
+1 523 1
+1 524 1
+1 525 1
+1 526 1
+1 527 1
+1 528 1
+1 529 1
+1 530 1
+1 531 1
+1 532 1
+1 533 1
+1 534 1
+1 535 1
+1 536 1
+1 537 1
+1 538 1
+1 539 1
+1 540 1
+1 541 1
+1 542 1
+1 543 1
+1 544 1
+1 545 1
+1 546 1
+1 547 1
+1 548 1
+1 549 1
+1 550 1
+1 551 1
+1 552 1
+1 553 1
+1 554 1
+1 555 1
+1 556 1
+1 557 1
+1 558 1
+1 559 1
+1 560 1
+1 561 1
+1 562 1
+1 563 1
+1 564 1
+1 565 1
+1 566 1
+1 567 1
+1 568 1
+1 569 1
+1 570 1
+1 571 1
+1 572 1
+1 573 1
+1 574 1
+1 575 1
+1 576 1
+1 577 1
+1 578 1
+1 579 1
+1 580 1
+1 581 1
+1 582 1
+1 583 1
+1 584 1
+1 585 1
+1 586 1
+1 587 1
+1 588 1
+1 589 1
+1 590 1
+1 591 1
+1 592 1
+1 593 1
+1 594 1
+1 595 1
+1 596 1
+1 597 1
+1 598 1
+1 599 1
+1 600 1
+1 601 1
+1 602 1
+1 603 1
+1 604 1
+1 605 1
+1 606 1
+1 607 1
+1 608 1
+1 609 1
+1 610 1
+1 611 1
+1 612 1
+1 613 1
+1 614 1
+1 615 1
+1 616 1
+1 617 1
+1 618 1
+1 619 1
+1 620 1
+1 621 1
+1 622 1
+1 623 1
+1 624 1
+1 625 1
+1 626 1
+1 627 1
+1 628 1
+1 629 1
+1 630 1
+1 631 1
+1 632 1
+1 633 1
+1 634 1
+1 635 1
+1 636 1
+1 637 1
+1 638 1
+1 639 1
+1 640 1
+1 641 1
+1 642 1
+1 643 1
+1 644 1
+1 645 1
+1 646 1
+1 647 1
+1 648 1
+1 649 1
+1 650 1
+1 651 1
+1 652 1
+1 653 1
+1 654 1
+1 655 1
+1 656 1
+1 657 1
+1 658 1
+1 659 1
+1 660 1
+1 661 1
+1 662 1
+1 663 1
+1 664 1
+1 665 1
+1 666 1
+1 667 1
+1 668 1
+1 669 1
+1 670 1
+1 671 1
+1 672 1
+1 673 1
+1 674 1
+1 675 1
+1 676 1
+1 677 1
+1 678 1
+1 679 1
+1 680 1
+1 681 1
+1 682 1
+1 683 1
+1 684 1
+1 685 1
+1 686 1
+1 687 1
+1 688 1
+1 689 1
+1 690 1
+1 691 1
+1 692 1
+1 693 1
+1 694 1
+1 695 1
+1 696 1
+1 697 1
+1 698 1
+1 699 1
+1 700 1
+1 701 1
+1 702 1
+1 703 1
+1 704 1
+1 705 1
+1 706 1
+1 707 1
+1 708 1
+1 709 1
+1 710 1
+1 711 1
+1 712 1
+1 713 1
+1 714 1
+1 715 1
+1 716 1
+1 717 1
+1 718 1
+1 719 1
+1 720 1
+1 721 1
+1 722 1
+1 723 1
+1 724 1
+1 725 1
+1 726 1
+1 727 1
+1 728 1
+1 729 1
+1 730 1
+1 731 1
+1 732 1
+1 733 1
+1 734 1
+1 735 1
+1 736 1
+1 737 1
+1 738 1
+1 739 1
+1 740 1
+1 741 1
+1 742 1
+1 743 1
+1 744 1
+1 745 1
+1 746 1
+1 747 1
+1 748 1
+1 749 1
+1 750 1
+1 751 1
+1 752 1
+1 753 1
+1 754 1
+1 755 1
+1 756 1
+1 757 1
+1 758 1
+1 759 1
+1 760 1
+1 761 1
+1 762 1
+1 763 1
+1 764 1
+1 765 1
+1 766 1
+1 767 1
+1 768 1
+1 769 1
+1 770 1
+1 771 1
+1 772 1
+1 773 1
+1 774 1
+1 775 1
+1 776 1
+1 777 1
+1 778 1
+1 779 1
+1 780 1
+1 781 1
+1 782 1
+1 783 1
+1 784 1
+1 785 1
+1 786 1
+1 787 1
+1 788 1
+1 789 1
+1 790 1
+1 791 1
+1 792 1
+2 1 1
+2 2 1
+2 3 1
+2 4 1
+2 5 1
+2 6 1
+2 7 1
+2 8 1
+2 9 1
+2 10 1
+2 11 1
+2 12 1
+2 13 1
+2 14 1
+2 15 1
+2 16 1
+2 17 1
+2 18 1
+2 19 1
+2 20 1
+2 21 1
+2 22 1
+2 23 1
+2 24 1
+2 25 1
+2 26 1
+2 27 1
+2 28 1
+2 29 1
+2 30 1
+2 31 1
+2 32 1
+2 33 1
+2 34 1
+2 35 1
+2 36 1
+2 37 1
+2 38 1
+2 39 1
+2 40 1
+2 41 1
+2 42 1
+2 43 1
+2 44 1
+2 45 1
+2 46 1
+2 47 1
+2 48 1
+2 49 1
+2 50 1
+2 51 1
+2 52 1
+2 53 1
+2 54 1
+2 55 1
+2 56 1
+2 57 1
+2 58 1
+2 59 1
+2 60 1
+2 61 1
+2 62 1
+2 63 1
+2 64 1
+2 65 1
+2 66 1
+2 67 1
+2 68 1
+2 69 1
+2 70 1
+2 71 1
+2 72 1
+2 73 1
+2 74 1
+2 75 1
+2 76 1
+2 77 1
+2 78 1
+2 79 1
+2 80 1
+2 81 1
+2 82 1
+2 83 1
+2 84 1
+2 85 1
+2 86 1
+2 87 1
+2 88 1
+2 89 1
+2 90 1
+2 91 1
+2 92 1
+2 93 1
+2 94 1
+2 95 1
+2 96 1
+2 97 1
+2 98 1
+2 99 1
+2 100 1
+2 101 1
+2 102 1
+2 103 1
+2 104 1
+2 105 1
+2 106 1
+2 107 1
+2 108 1
+2 109 1
+2 110 1
+2 111 1
+2 112 1
+2 113 1
+2 114 1
+2 115 1
+2 116 1
+2 117 1
+2 118 1
+2 119 1
+2 120 1
+2 121 1
+2 122 1
+2 123 1
+2 124 1
+2 125 1
+2 126 1
+2 127 1
+2 128 1
+2 129 1
+2 130 1
+2 131 1
+2 132 1
+2 133 1
+2 134 1
+2 135 1
+2 136 1
+2 137 1
+2 138 1
+2 139 1
+2 140 1
+2 141 1
+2 142 1
+2 143 1
+2 144 1
+2 145 1
+2 146 1
+2 147 1
+2 148 1
+2 149 1
+2 150 1
+2 151 1
+2 152 1
+2 153 1
+2 154 1
+2 155 1
+2 156 1
+2 157 1
+2 158 1
+2 159 1
+2 160 1
+2 161 1
+2 162 1
+2 163 1
+2 164 1
+2 165 1
+2 166 1
+2 167 1
+2 168 1
+2 169 1
+2 170 1
+2 171 1
+2 172 1
+2 173 1
+2 174 1
+2 175 1
+2 176 1
+2 177 1
+2 178 1
+2 179 1
+2 180 1
+2 181 1
+2 182 1
+2 183 1
+2 184 1
+2 185 1
+2 186 1
+2 187 1
+2 188 1
+2 189 1
+2 190 1
+2 191 1
+2 192 1
+2 193 1
+2 194 1
+2 195 1
+2 196 1
+2 197 1
+2 198 1
+2 199 1
+2 200 1
+2 201 1
+2 202 1
+2 203 1
+2 204 1
+2 205 1
+2 206 1
+2 207 1
+2 208 1
+2 209 1
+2 210 1
+2 211 1
+2 212 1
+2 213 1
+2 214 1
+2 215 1
+2 216 1
+2 217 1
+2 218 1
+2 219 1
+2 220 1
+2 221 1
+2 222 1
+2 223 1
+2 224 1
+2 225 1
+2 226 1
+2 227 1
+2 228 1
+2 229 1
+2 230 1
+2 231 1
+2 232 1
+2 233 1
+2 234 1
+2 235 1
+2 236 1
+2 237 1
+2 238 1
+2 239 1
+2 240 1
+2 241 1
+2 242 1
+2 243 1
+2 244 1
+2 245 1
+2 246 1
+2 247 1
+2 248 1
+2 249 1
+2 250 1
+2 251 1
+2 252 1
+2 253 1
+2 254 1
+2 255 1
+2 256 1
+2 257 1
+2 258 1
+2 259 1
+2 260 1
+2 261 1
+2 262 1
+2 263 1
+2 264 1
+2 265 1
+2 266 1
+2 267 1
+2 268 1
+2 269 1
+2 270 1
+2 271 1
+2 272 1
+2 273 1
+2 274 1
+2 275 1
+2 276 1
+2 277 1
+2 278 1
+2 279 1
+2 280 1
+2 281 1
+2 282 1
+2 283 1
+2 284 1
+2 285 1
+2 286 1
+2 287 1
+2 288 1
+2 289 1
+2 290 1
+2 291 1
+2 292 1
+2 293 1
+2 294 1
+2 295 1
+2 296 1
+2 297 1
+2 298 1
+2 299 1
+2 300 1
+2 301 1
+2 302 1
+2 303 1
+2 304 1
+2 305 1
+2 306 1
+2 307 1
+2 308 1
+2 309 1
+2 310 1
+2 311 1
+2 312 1
+2 313 1
+2 314 1
+2 315 1
+2 316 1
+2 317 1
+2 318 1
+2 319 1
+2 320 1
+2 321 1
+2 322 1
+2 323 1
+2 324 1
+2 325 1
+2 326 1
+2 327 1
+2 328 1
+2 329 1
+2 330 1
+2 793 1
+2 794 1
+2 795 1
+2 796 1
+2 797 1
+2 798 1
+2 799 1
+2 800 1
+2 801 1
+2 802 1
+2 803 1
+2 804 1
+2 805 1
+2 806 1
+2 807 1
+2 808 1
+2 809 1
+2 810 1
+2 811 1
+2 812 1
+2 813 1
+2 814 1
+2 815 1
+2 816 1
+2 817 1
+2 818 1
+2 819 1
+2 820 1
+2 821 1
+2 822 1
+2 823 1
+2 824 1
+2 825 1
+2 826 1
+2 827 1
+2 828 1
+2 829 1
+2 830 1
+2 831 1
+2 832 1
+2 833 1
+2 834 1
+2 835 1
+2 836 1
+2 837 1
+2 838 1
+2 839 1
+2 840 1
+2 841 1
+2 842 1
+2 843 1
+2 844 1
+2 845 1
+2 846 1
+2 847 1
+2 848 1
+2 849 1
+2 850 1
+2 851 1
+2 852 1
+2 853 1
+2 854 1
+2 855 1
+2 856 1
+2 857 1
+2 858 1
+2 859 1
+2 860 1
+2 861 1
+2 862 1
+2 863 1
+2 864 1
+2 865 1
+2 866 1
+2 867 1
+2 868 1
+2 869 1
+2 870 1
+2 871 1
+2 872 1
+2 873 1
+2 874 1
+2 875 1
+2 876 1
+2 877 1
+2 878 1
+2 879 1
+2 880 1
+2 881 1
+2 882 1
+2 883 1
+2 884 1
+2 885 1
+2 886 1
+2 887 1
+2 888 1
+2 889 1
+2 890 1
+2 891 1
+2 892 1
+2 893 1
+2 894 1
+2 895 1
+2 896 1
+2 897 1
+2 898 1
+2 899 1
+2 900 1
+2 901 1
+2 902 1
+2 903 1
+2 904 1
+2 905 1
+2 906 1
+2 907 1
+2 908 1
+2 909 1
+2 910 1
+2 911 1
+2 912 1
+2 913 1
+2 914 1
+2 915 1
+2 916 1
+2 917 1
+2 918 1
+2 919 1
+2 920 1
+2 921 1
+2 922 1
+2 923 1
+2 924 1
+2 925 1
+2 926 1
+2 927 1
+2 928 1
+2 929 1
+2 930 1
+2 931 1
+2 932 1
+2 933 1
+2 934 1
+2 935 1
+2 936 1
+2 937 1
+2 938 1
+2 939 1
+2 940 1
+2 941 1
+2 942 1
+2 943 1
+2 944 1
+2 945 1
+2 946 1
+2 947 1
+2 948 1
+2 949 1
+2 950 1
+2 951 1
+2 952 1
+2 953 1
+2 954 1
+2 955 1
+2 956 1
+2 957 1
+2 958 1
+2 959 1
+2 960 1
+2 961 1
+2 962 1
+2 963 1
+2 964 1
+2 965 1
+2 966 1
+2 967 1
+2 968 1
+2 969 1
+2 970 1
+2 971 1
+2 972 1
+2 973 1
+2 974 1
+2 975 1
+2 976 1
+2 977 1
+2 978 1
+2 979 1
+2 980 1
+2 981 1
+2 982 1
+2 983 1
+2 984 1
+2 985 1
+2 986 1
+2 987 1
+2 988 1
+2 989 1
+2 990 1
+2 991 1
+2 992 1
+2 993 1
+2 994 1
+2 995 1
+2 996 1
+2 997 1
+2 998 1
+2 999 1
+2 1000 1
+2 1001 1
+2 1002 1
+2 1003 1
+2 1004 1
+2 1005 1
+2 1006 1
+2 1007 1
+2 1008 1
+2 1009 1
+2 1010 1
+2 1011 1
+2 1012 1
+2 1013 1
+2 1014 1
+2 1015 1
+2 1016 1
+2 1017 1
+2 1018 1
+2 1019 1
+2 1020 1
+2 1021 1
+2 1022 1
+2 1023 1
+2 1024 1
+2 1025 1
+2 1026 1
+2 1027 1
+2 1028 1
+2 1029 1
+2 1030 1
+2 1031 1
+2 1032 1
+2 1033 1
+2 1034 1
+2 1035 1
+2 1036 1
+2 1037 1
+2 1038 1
+2 1039 1
+2 1040 1
+2 1041 1
+2 1042 1
+2 1043 1
+2 1044 1
+2 1045 1
+2 1046 1
+2 1047 1
+2 1048 1
+2 1049 1
+2 1050 1
+2 1051 1
+2 1052 1
+2 1053 1
+2 1054 1
+2 1055 1
+2 1056 1
+2 1057 1
+2 1058 1
+2 1059 1
+2 1060 1
+2 1061 1
+2 1062 1
+2 1063 1
+2 1064 1
+2 1065 1
+2 1066 1
+2 1067 1
+2 1068 1
+2 1069 1
+2 1070 1
+2 1071 1
+2 1072 1
+2 1073 1
+2 1074 1
+2 1075 1
+2 1076 1
+2 1077 1
+2 1078 1
+2 1079 1
+2 1080 1
+2 1081 1
+2 1082 1
+2 1083 1
+2 1084 1
+2 1085 1
+2 1086 1
+2 1087 1
+2 1088 1
+2 1089 1
+2 1090 1
+2 1091 1
+2 1092 1
+2 1093 1
+2 1094 1
+2 1095 1
+2 1096 1
+2 1097 1
+2 1098 1
+2 1099 1
+2 1100 1
+2 1101 1
+2 1102 1
+2 1103 1
+2 1104 1
+2 1105 1
+2 1106 1
+2 1107 1
+2 1108 1
+2 1109 1
+2 1110 1
+2 1111 1
+2 1112 1
+2 1113 1
+2 1114 1
+2 1115 1
+2 1116 1
+2 1117 1
+2 1118 1
+2 1119 1
+2 1120 1
+2 1121 1
+2 1122 1
+2 1123 1
+2 1124 1
+2 1125 1
+2 1126 1
+2 1127 1
+2 1128 1
+2 1129 1
+2 1130 1
+2 1131 1
+2 1132 1
+2 1133 1
+2 1134 1
+2 1135 1
+2 1136 1
+2 1137 1
+2 1138 1
+2 1139 1
+2 1140 1
+2 1141 1
+2 1142 1
+2 1143 1
+2 1144 1
+2 1145 1
+2 1146 1
+2 1147 1
+2 1148 1
+2 1149 1
+2 1150 1
+2 1151 1
+2 1152 1
+2 1153 1
+2 1154 1
+2 1155 1
+2 1156 1
+2 1157 1
+2 1158 1
+2 1159 1
+2 1160 1
+2 1161 1
+2 1162 1
+2 1163 1
+2 1164 1
+2 1165 1
+2 1166 1
+2 1167 1
+2 1168 1
+2 1169 1
+2 1170 1
+2 1171 1
+2 1172 1
+2 1173 1
+2 1174 1
+2 1175 1
+2 1176 1
+2 1177 1
+2 1178 1
+2 1179 1
+2 1180 1
+2 1181 1
+2 1182 1
+2 1183 1
+2 1184 1
+2 1185 1
+2 1186 1
+2 1187 1
+2 1188 1
+2 1189 1
+2 1190 1
+2 1191 1
+2 1192 1
+2 1193 1
+2 1194 1
+2 1195 1
+2 1196 1
+2 1197 1
+2 1198 1
+2 1199 1
+2 1200 1
+2 1201 1
+2 1202 1
+2 1203 1
+2 1204 1
+2 1205 1
+2 1206 1
+2 1207 1
+2 1208 1
+2 1209 1
+2 1210 1
+2 1211 1
+2 1212 1
+2 1213 1
+2 1214 1
+2 1215 1
+2 1216 1
+2 1217 1
+2 1218 1
+2 1219 1
+2 1220 1
+2 1221 1
+2 1222 1
+2 1223 1
+2 1224 1
+2 1225 1
+2 1226 1
+2 1227 1
+2 1228 1
+2 1229 1
+2 1230 1
+2 1231 1
+2 1232 1
+2 1233 1
+2 1234 1
+2 1235 1
+2 1236 1
+2 1237 1
+2 1238 1
+2 1239 1
+2 1240 1
+2 1241 1
+2 1242 1
+2 1243 1
+2 1244 1
+2 1245 1
+2 1246 1
+2 1247 1
+2 1248 1
+2 1249 1
+2 1250 1
+2 1251 1
+2 1252 1
+2 1253 1
+2 1254 1
+3 1 1
+3 2 1
+3 3 1
+3 4 1
+3 5 1
+3 6 1
+3 7 1
+3 8 1
+3 9 1
+3 10 1
+3 11 1
+3 12 1
+3 13 1
+3 14 1
+3 15 1
+3 16 1
+3 17 1
+3 18 1
+3 19 1
+3 20 1
+3 21 1
+3 22 1
+3 23 1
+3 24 1
+3 25 1
+3 26 1
+3 27 1
+3 28 1
+3 29 1
+3 30 1
+3 31 1
+3 32 1
+3 33 1
+3 34 1
+3 35 1
+3 36 1
+3 37 1
+3 38 1
+3 39 1
+3 40 1
+3 41 1
+3 42 1
+3 43 1
+3 44 1
+3 45 1
+3 46 1
+3 47 1
+3 48 1
+3 49 1
+3 50 1
+3 51 1
+3 52 1
+3 53 1
+3 54 1
+3 55 1
+3 56 1
+3 57 1
+3 58 1
+3 59 1
+3 60 1
+3 61 1
+3 62 1
+3 63 1
+3 64 1
+3 65 1
+3 66 1
+3 67 1
+3 68 1
+3 69 1
+3 70 1
+3 71 1
+3 72 1
+3 73 1
+3 74 1
+3 75 1
+3 76 1
+3 77 1
+3 78 1
+3 79 1
+3 80 1
+3 81 1
+3 82 1
+3 83 1
+3 84 1
+3 85 1
+3 86 1
+3 87 1
+3 88 1
+3 89 1
+3 90 1
+3 91 1
+3 92 1
+3 93 1
+3 94 1
+3 95 1
+3 96 1
+3 97 1
+3 98 1
+3 99 1
+3 100 1
+3 101 1
+3 102 1
+3 103 1
+3 104 1
+3 105 1
+3 106 1
+3 107 1
+3 108 1
+3 109 1
+3 110 1
+3 111 1
+3 112 1
+3 113 1
+3 114 1
+3 115 1
+3 116 1
+3 117 1
+3 118 1
+3 119 1
+3 120 1
+3 331 1
+3 332 1
+3 333 1
+3 334 1
+3 335 1
+3 336 1
+3 337 1
+3 338 1
+3 339 1
+3 340 1
+3 341 1
+3 342 1
+3 343 1
+3 344 1
+3 345 1
+3 346 1
+3 347 1
+3 348 1
+3 349 1
+3 350 1
+3 351 1
+3 352 1
+3 353 1
+3 354 1
+3 355 1
+3 356 1
+3 357 1
+3 358 1
+3 359 1
+3 360 1
+3 361 1
+3 362 1
+3 363 1
+3 364 1
+3 365 1
+3 366 1
+3 367 1
+3 368 1
+3 369 1
+3 370 1
+3 371 1
+3 372 1
+3 373 1
+3 374 1
+3 375 1
+3 376 1
+3 377 1
+3 378 1
+3 379 1
+3 380 1
+3 381 1
+3 382 1
+3 383 1
+3 384 1
+3 385 1
+3 386 1
+3 387 1
+3 388 1
+3 389 1
+3 390 1
+3 391 1
+3 392 1
+3 393 1
+3 394 1
+3 395 1
+3 396 1
+3 397 1
+3 398 1
+3 399 1
+3 400 1
+3 401 1
+3 402 1
+3 403 1
+3 404 1
+3 405 1
+3 406 1
+3 407 1
+3 408 1
+3 409 1
+3 410 1
+3 411 1
+3 412 1
+3 413 1
+3 414 1
+3 415 1
+3 416 1
+3 417 1
+3 418 1
+3 419 1
+3 420 1
+3 421 1
+3 422 1
+3 423 1
+3 424 1
+3 425 1
+3 426 1
+3 427 1
+3 428 1
+3 429 1
+3 430 1
+3 431 1
+3 432 1
+3 433 1
+3 434 1
+3 435 1
+3 436 1
+3 437 1
+3 438 1
+3 439 1
+3 440 1
+3 441 1
+3 442 1
+3 443 1
+3 444 1
+3 445 1
+3 446 1
+3 447 1
+3 448 1
+3 449 1
+3 450 1
+3 451 1
+3 452 1
+3 453 1
+3 454 1
+3 455 1
+3 456 1
+3 457 1
+3 458 1
+3 459 1
+3 460 1
+3 461 1
+3 462 1
+3 463 1
+3 464 1
+3 465 1
+3 466 1
+3 467 1
+3 468 1
+3 469 1
+3 470 1
+3 471 1
+3 472 1
+3 473 1
+3 474 1
+3 475 1
+3 476 1
+3 477 1
+3 478 1
+3 479 1
+3 480 1
+3 481 1
+3 482 1
+3 483 1
+3 484 1
+3 485 1
+3 486 1
+3 487 1
+3 488 1
+3 489 1
+3 490 1
+3 491 1
+3 492 1
+3 493 1
+3 494 1
+3 495 1
+3 496 1
+3 497 1
+3 498 1
+3 499 1
+3 500 1
+3 501 1
+3 502 1
+3 503 1
+3 504 1
+3 505 1
+3 506 1
+3 507 1
+3 508 1
+3 509 1
+3 510 1
+3 511 1
+3 512 1
+3 513 1
+3 514 1
+3 515 1
+3 516 1
+3 517 1
+3 518 1
+3 519 1
+3 520 1
+3 521 1
+3 522 1
+3 523 1
+3 524 1
+3 525 1
+3 526 1
+3 527 1
+3 528 1
+3 529 1
+3 530 1
+3 531 1
+3 532 1
+3 533 1
+3 534 1
+3 535 1
+3 536 1
+3 537 1
+3 538 1
+3 539 1
+3 540 1
+3 793 1
+3 794 1
+3 795 1
+3 796 1
+3 797 1
+3 798 1
+3 799 1
+3 800 1
+3 801 1
+3 802 1
+3 803 1
+3 804 1
+3 805 1
+3 806 1
+3 807 1
+3 808 1
+3 809 1
+3 810 1
+3 811 1
+3 812 1
+3 813 1
+3 814 1
+3 815 1
+3 816 1
+3 817 1
+3 818 1
+3 819 1
+3 820 1
+3 821 1
+3 822 1
+3 823 1
+3 824 1
+3 825 1
+3 826 1
+3 827 1
+3 828 1
+3 829 1
+3 830 1
+3 831 1
+3 832 1
+3 833 1
+3 834 1
+3 835 1
+3 836 1
+3 837 1
+3 838 1
+3 839 1
+3 840 1
+3 841 1
+3 842 1
+3 843 1
+3 844 1
+3 845 1
+3 846 1
+3 847 1
+3 848 1
+3 849 1
+3 850 1
+3 851 1
+3 852 1
+3 853 1
+3 854 1
+3 855 1
+3 856 1
+3 857 1
+3 858 1
+3 859 1
+3 860 1
+3 861 1
+3 862 1
+3 863 1
+3 864 1
+3 865 1
+3 866 1
+3 867 1
+3 868 1
+3 869 1
+3 870 1
+3 871 1
+3 872 1
+3 873 1
+3 874 1
+3 875 1
+3 876 1
+3 877 1
+3 878 1
+3 879 1
+3 880 1
+3 881 1
+3 882 1
+3 883 1
+3 884 1
+3 885 1
+3 886 1
+3 887 1
+3 888 1
+3 889 1
+3 890 1
+3 891 1
+3 892 1
+3 893 1
+3 894 1
+3 895 1
+3 896 1
+3 897 1
+3 898 1
+3 899 1
+3 900 1
+3 901 1
+3 902 1
+3 903 1
+3 904 1
+3 905 1
+3 906 1
+3 907 1
+3 908 1
+3 909 1
+3 910 1
+3 911 1
+3 912 1
+3 913 1
+3 914 1
+3 915 1
+3 916 1
+3 917 1
+3 918 1
+3 919 1
+3 920 1
+3 921 1
+3 922 1
+3 923 1
+3 924 1
+3 925 1
+3 926 1
+3 927 1
+3 928 1
+3 929 1
+3 930 1
+3 931 1
+3 932 1
+3 933 1
+3 934 1
+3 935 1
+3 936 1
+3 937 1
+3 938 1
+3 939 1
+3 940 1
+3 941 1
+3 942 1
+3 943 1
+3 944 1
+3 945 1
+3 946 1
+3 947 1
+3 948 1
+3 949 1
+3 950 1
+3 951 1
+3 952 1
+3 953 1
+3 954 1
+3 955 1
+3 956 1
+3 957 1
+3 958 1
+3 959 1
+3 960 1
+3 961 1
+3 962 1
+3 963 1
+3 964 1
+3 965 1
+3 966 1
+3 967 1
+3 968 1
+3 969 1
+3 970 1
+3 971 1
+3 972 1
+3 973 1
+3 974 1
+3 975 1
+3 976 1
+3 977 1
+3 978 1
+3 979 1
+3 980 1
+3 981 1
+3 982 1
+3 983 1
+3 984 1
+3 985 1
+3 986 1
+3 987 1
+3 988 1
+3 989 1
+3 990 1
+3 991 1
+3 992 1
+3 993 1
+3 994 1
+3 995 1
+3 996 1
+3 997 1
+3 998 1
+3 999 1
+3 1000 1
+3 1001 1
+3 1002 1
+3 1255 1
+3 1256 1
+3 1257 1
+3 1258 1
+3 1259 1
+3 1260 1
+3 1261 1
+3 1262 1
+3 1263 1
+3 1264 1
+3 1265 1
+3 1266 1
+3 1267 1
+3 1268 1
+3 1269 1
+3 1270 1
+3 1271 1
+3 1272 1
+3 1273 1
+3 1274 1
+3 1275 1
+3 1276 1
+3 1277 1
+3 1278 1
+3 1279 1
+3 1280 1
+3 1281 1
+3 1282 1
+3 1283 1
+3 1284 1
+3 1285 1
+3 1286 1
+3 1287 1
+3 1288 1
+3 1289 1
+3 1290 1
+3 1291 1
+3 1292 1
+3 1293 1
+3 1294 1
+3 1295 1
+3 1296 1
+3 1297 1
+3 1298 1
+3 1299 1
+3 1300 1
+3 1301 1
+3 1302 1
+3 1303 1
+3 1304 1
+3 1305 1
+3 1306 1
+3 1307 1
+3 1308 1
+3 1309 1
+3 1310 1
+3 1311 1
+3 1312 1
+3 1313 1
+3 1314 1
+3 1315 1
+3 1316 1
+3 1317 1
+3 1318 1
+3 1319 1
+3 1320 1
+3 1321 1
+3 1322 1
+3 1323 1
+3 1324 1
+3 1325 1
+3 1326 1
+3 1327 1
+3 1328 1
+3 1329 1
+3 1330 1
+3 1331 1
+3 1332 1
+3 1333 1
+3 1334 1
+3 1335 1
+3 1336 1
+3 1337 1
+3 1338 1
+3 1339 1
+3 1340 1
+3 1341 1
+3 1342 1
+3 1343 1
+3 1344 1
+3 1345 1
+3 1346 1
+3 1347 1
+3 1348 1
+3 1349 1
+3 1350 1
+3 1351 1
+3 1352 1
+3 1353 1
+3 1354 1
+3 1355 1
+3 1356 1
+3 1357 1
+3 1358 1
+3 1359 1
+3 1360 1
+3 1361 1
+3 1362 1
+3 1363 1
+3 1364 1
+3 1365 1
+3 1366 1
+3 1367 1
+3 1368 1
+3 1369 1
+3 1370 1
+3 1371 1
+3 1372 1
+3 1373 1
+3 1374 1
+3 1375 1
+3 1376 1
+3 1377 1
+3 1378 1
+3 1379 1
+3 1380 1
+3 1381 1
+3 1382 1
+3 1383 1
+3 1384 1
+3 1385 1
+3 1386 1
+3 1387 1
+3 1388 1
+3 1389 1
+3 1390 1
+3 1391 1
+3 1392 1
+3 1393 1
+3 1394 1
+3 1395 1
+3 1396 1
+3 1397 1
+3 1398 1
+3 1399 1
+3 1400 1
+3 1401 1
+3 1402 1
+3 1403 1
+3 1404 1
+3 1405 1
+3 1406 1
+3 1407 1
+3 1408 1
+3 1409 1
+3 1410 1
+3 1411 1
+3 1412 1
+3 1413 1
+3 1414 1
+3 1415 1
+3 1416 1
+3 1417 1
+3 1418 1
+3 1419 1
+3 1420 1
+3 1421 1
+3 1422 1
+3 1423 1
+3 1424 1
+3 1425 1
+3 1426 1
+3 1427 1
+3 1428 1
+3 1429 1
+3 1430 1
+3 1431 1
+3 1432 1
+3 1433 1
+3 1434 1
+3 1435 1
+3 1436 1
+3 1437 1
+3 1438 1
+3 1439 1
+3 1440 1
+3 1441 1
+3 1442 1
+3 1443 1
+3 1444 1
+3 1445 1
+3 1446 1
+3 1447 1
+3 1448 1
+3 1449 1
+3 1450 1
+3 1451 1
+3 1452 1
+3 1453 1
+3 1454 1
+3 1455 1
+3 1456 1
+3 1457 1
+3 1458 1
+3 1459 1
+3 1460 1
+3 1461 1
+3 1462 1
+3 1463 1
+3 1464 1
+3 1465 1
+3 1466 1
+3 1467 1
+3 1468 1
+3 1469 1
+3 1470 1
+3 1471 1
+3 1472 1
+3 1473 1
+3 1474 1
+3 1475 1
+3 1476 1
+3 1477 1
+3 1478 1
+3 1479 1
+3 1480 1
+3 1481 1
+3 1482 1
+3 1483 1
+3 1484 1
+3 1485 1
+3 1486 1
+3 1487 1
+3 1488 1
+3 1489 1
+3 1490 1
+3 1491 1
+3 1492 1
+3 1493 1
+3 1494 1
+3 1495 1
+3 1496 1
+3 1497 1
+3 1498 1
+3 1499 1
+3 1500 1
+3 1501 1
+3 1502 1
+3 1503 1
+3 1504 1
+3 1505 1
+3 1506 1
+4 1 1
+4 2 1
+4 3 1
+4 4 1
+4 5 1
+4 6 1
+4 7 1
+4 8 1
+4 9 1
+4 10 1
+4 11 1
+4 12 1
+4 13 1
+4 14 1
+4 15 1
+4 16 1
+4 17 1
+4 18 1
+4 19 1
+4 20 1
+4 21 1
+4 22 1
+4 23 1
+4 24 1
+4 25 1
+4 26 1
+4 27 1
+4 28 1
+4 29 1
+4 30 1
+4 31 1
+4 32 1
+4 33 1
+4 34 1
+4 35 1
+4 36 1
+4 121 1
+4 122 1
+4 123 1
+4 124 1
+4 125 1
+4 126 1
+4 127 1
+4 128 1
+4 129 1
+4 130 1
+4 131 1
+4 132 1
+4 133 1
+4 134 1
+4 135 1
+4 136 1
+4 137 1
+4 138 1
+4 139 1
+4 140 1
+4 141 1
+4 142 1
+4 143 1
+4 144 1
+4 145 1
+4 146 1
+4 147 1
+4 148 1
+4 149 1
+4 150 1
+4 151 1
+4 152 1
+4 153 1
+4 154 1
+4 155 1
+4 156 1
+4 157 1
+4 158 1
+4 159 1
+4 160 1
+4 161 1
+4 162 1
+4 163 1
+4 164 1
+4 165 1
+4 166 1
+4 167 1
+4 168 1
+4 169 1
+4 170 1
+4 171 1
+4 172 1
+4 173 1
+4 174 1
+4 175 1
+4 176 1
+4 177 1
+4 178 1
+4 179 1
+4 180 1
+4 181 1
+4 182 1
+4 183 1
+4 184 1
+4 185 1
+4 186 1
+4 187 1
+4 188 1
+4 189 1
+4 190 1
+4 191 1
+4 192 1
+4 193 1
+4 194 1
+4 195 1
+4 196 1
+4 197 1
+4 198 1
+4 199 1
+4 200 1
+4 201 1
+4 202 1
+4 203 1
+4 204 1
+4 331 1
+4 332 1
+4 333 1
+4 334 1
+4 335 1
+4 336 1
+4 337 1
+4 338 1
+4 339 1
+4 340 1
+4 341 1
+4 342 1
+4 343 1
+4 344 1
+4 345 1
+4 346 1
+4 347 1
+4 348 1
+4 349 1
+4 350 1
+4 351 1
+4 352 1
+4 353 1
+4 354 1
+4 355 1
+4 356 1
+4 357 1
+4 358 1
+4 359 1
+4 360 1
+4 361 1
+4 362 1
+4 363 1
+4 364 1
+4 365 1
+4 366 1
+4 367 1
+4 368 1
+4 369 1
+4 370 1
+4 371 1
+4 372 1
+4 373 1
+4 374 1
+4 375 1
+4 376 1
+4 377 1
+4 378 1
+4 379 1
+4 380 1
+4 381 1
+4 382 1
+4 383 1
+4 384 1
+4 385 1
+4 386 1
+4 387 1
+4 388 1
+4 389 1
+4 390 1
+4 391 1
+4 392 1
+4 393 1
+4 394 1
+4 395 1
+4 396 1
+4 397 1
+4 398 1
+4 399 1
+4 400 1
+4 401 1
+4 402 1
+4 403 1
+4 404 1
+4 405 1
+4 406 1
+4 407 1
+4 408 1
+4 409 1
+4 410 1
+4 411 1
+4 412 1
+4 413 1
+4 414 1
+4 541 1
+4 542 1
+4 543 1
+4 544 1
+4 545 1
+4 546 1
+4 547 1
+4 548 1
+4 549 1
+4 550 1
+4 551 1
+4 552 1
+4 553 1
+4 554 1
+4 555 1
+4 556 1
+4 557 1
+4 558 1
+4 559 1
+4 560 1
+4 561 1
+4 562 1
+4 563 1
+4 564 1
+4 565 1
+4 566 1
+4 567 1
+4 568 1
+4 569 1
+4 570 1
+4 571 1
+4 572 1
+4 573 1
+4 574 1
+4 575 1
+4 576 1
+4 577 1
+4 578 1
+4 579 1
+4 580 1
+4 581 1
+4 582 1
+4 583 1
+4 584 1
+4 585 1
+4 586 1
+4 587 1
+4 588 1
+4 589 1
+4 590 1
+4 591 1
+4 592 1
+4 593 1
+4 594 1
+4 595 1
+4 596 1
+4 597 1
+4 598 1
+4 599 1
+4 600 1
+4 601 1
+4 602 1
+4 603 1
+4 604 1
+4 605 1
+4 606 1
+4 607 1
+4 608 1
+4 609 1
+4 610 1
+4 611 1
+4 612 1
+4 613 1
+4 614 1
+4 615 1
+4 616 1
+4 617 1
+4 618 1
+4 619 1
+4 620 1
+4 621 1
+4 622 1
+4 623 1
+4 624 1
+4 625 1
+4 626 1
+4 627 1
+4 628 1
+4 629 1
+4 630 1
+4 631 1
+4 632 1
+4 633 1
+4 634 1
+4 635 1
+4 636 1
+4 637 1
+4 638 1
+4 639 1
+4 640 1
+4 641 1
+4 642 1
+4 643 1
+4 644 1
+4 645 1
+4 646 1
+4 647 1
+4 648 1
+4 649 1
+4 650 1
+4 651 1
+4 652 1
+4 653 1
+4 654 1
+4 655 1
+4 656 1
+4 657 1
+4 658 1
+4 659 1
+4 660 1
+4 661 1
+4 662 1
+4 663 1
+4 664 1
+4 665 1
+4 666 1
+4 793 1
+4 794 1
+4 795 1
+4 796 1
+4 797 1
+4 798 1
+4 799 1
+4 800 1
+4 801 1
+4 802 1
+4 803 1
+4 804 1
+4 805 1
+4 806 1
+4 807 1
+4 808 1
+4 809 1
+4 810 1
+4 811 1
+4 812 1
+4 813 1
+4 814 1
+4 815 1
+4 816 1
+4 817 1
+4 818 1
+4 819 1
+4 820 1
+4 821 1
+4 822 1
+4 823 1
+4 824 1
+4 825 1
+4 826 1
+4 827 1
+4 828 1
+4 829 1
+4 830 1
+4 831 1
+4 832 1
+4 833 1
+4 834 1
+4 835 1
+4 836 1
+4 837 1
+4 838 1
+4 839 1
+4 840 1
+4 841 1
+4 842 1
+4 843 1
+4 844 1
+4 845 1
+4 846 1
+4 847 1
+4 848 1
+4 849 1
+4 850 1
+4 851 1
+4 852 1
+4 853 1
+4 854 1
+4 855 1
+4 856 1
+4 857 1
+4 858 1
+4 859 1
+4 860 1
+4 861 1
+4 862 1
+4 863 1
+4 864 1
+4 865 1
+4 866 1
+4 867 1
+4 868 1
+4 869 1
+4 870 1
+4 871 1
+4 872 1
+4 873 1
+4 874 1
+4 875 1
+4 876 1
+4 1003 1
+4 1004 1
+4 1005 1
+4 1006 1
+4 1007 1
+4 1008 1
+4 1009 1
+4 1010 1
+4 1011 1
+4 1012 1
+4 1013 1
+4 1014 1
+4 1015 1
+4 1016 1
+4 1017 1
+4 1018 1
+4 1019 1
+4 1020 1
+4 1021 1
+4 1022 1
+4 1023 1
+4 1024 1
+4 1025 1
+4 1026 1
+4 1027 1
+4 1028 1
+4 1029 1
+4 1030 1
+4 1031 1
+4 1032 1
+4 1033 1
+4 1034 1
+4 1035 1
+4 1036 1
+4 1037 1
+4 1038 1
+4 1039 1
+4 1040 1
+4 1041 1
+4 1042 1
+4 1043 1
+4 1044 1
+4 1045 1
+4 1046 1
+4 1047 1
+4 1048 1
+4 1049 1
+4 1050 1
+4 1051 1
+4 1052 1
+4 1053 1
+4 1054 1
+4 1055 1
+4 1056 1
+4 1057 1
+4 1058 1
+4 1059 1
+4 1060 1
+4 1061 1
+4 1062 1
+4 1063 1
+4 1064 1
+4 1065 1
+4 1066 1
+4 1067 1
+4 1068 1
+4 1069 1
+4 1070 1
+4 1071 1
+4 1072 1
+4 1073 1
+4 1074 1
+4 1075 1
+4 1076 1
+4 1077 1
+4 1078 1
+4 1079 1
+4 1080 1
+4 1081 1
+4 1082 1
+4 1083 1
+4 1084 1
+4 1085 1
+4 1086 1
+4 1087 1
+4 1088 1
+4 1089 1
+4 1090 1
+4 1091 1
+4 1092 1
+4 1093 1
+4 1094 1
+4 1095 1
+4 1096 1
+4 1097 1
+4 1098 1
+4 1099 1
+4 1100 1
+4 1101 1
+4 1102 1
+4 1103 1
+4 1104 1
+4 1105 1
+4 1106 1
+4 1107 1
+4 1108 1
+4 1109 1
+4 1110 1
+4 1111 1
+4 1112 1
+4 1113 1
+4 1114 1
+4 1115 1
+4 1116 1
+4 1117 1
+4 1118 1
+4 1119 1
+4 1120 1
+4 1121 1
+4 1122 1
+4 1123 1
+4 1124 1
+4 1125 1
+4 1126 1
+4 1127 1
+4 1128 1
+4 1255 1
+4 1256 1
+4 1257 1
+4 1258 1
+4 1259 1
+4 1260 1
+4 1261 1
+4 1262 1
+4 1263 1
+4 1264 1
+4 1265 1
+4 1266 1
+4 1267 1
+4 1268 1
+4 1269 1
+4 1270 1
+4 1271 1
+4 1272 1
+4 1273 1
+4 1274 1
+4 1275 1
+4 1276 1
+4 1277 1
+4 1278 1
+4 1279 1
+4 1280 1
+4 1281 1
+4 1282 1
+4 1283 1
+4 1284 1
+4 1285 1
+4 1286 1
+4 1287 1
+4 1288 1
+4 1289 1
+4 1290 1
+4 1291 1
+4 1292 1
+4 1293 1
+4 1294 1
+4 1295 1
+4 1296 1
+4 1297 1
+4 1298 1
+4 1299 1
+4 1300 1
+4 1301 1
+4 1302 1
+4 1303 1
+4 1304 1
+4 1305 1
+4 1306 1
+4 1307 1
+4 1308 1
+4 1309 1
+4 1310 1
+4 1311 1
+4 1312 1
+4 1313 1
+4 1314 1
+4 1315 1
+4 1316 1
+4 1317 1
+4 1318 1
+4 1319 1
+4 1320 1
+4 1321 1
+4 1322 1
+4 1323 1
+4 1324 1
+4 1325 1
+4 1326 1
+4 1327 1
+4 1328 1
+4 1329 1
+4 1330 1
+4 1331 1
+4 1332 1
+4 1333 1
+4 1334 1
+4 1335 1
+4 1336 1
+4 1337 1
+4 1338 1
+4 1339 1
+4 1340 1
+4 1341 1
+4 1342 1
+4 1343 1
+4 1344 1
+4 1345 1
+4 1346 1
+4 1347 1
+4 1348 1
+4 1349 1
+4 1350 1
+4 1351 1
+4 1352 1
+4 1353 1
+4 1354 1
+4 1355 1
+4 1356 1
+4 1357 1
+4 1358 1
+4 1359 1
+4 1360 1
+4 1361 1
+4 1362 1
+4 1363 1
+4 1364 1
+4 1365 1
+4 1366 1
+4 1367 1
+4 1368 1
+4 1369 1
+4 1370 1
+4 1371 1
+4 1372 1
+4 1373 1
+4 1374 1
+4 1375 1
+4 1376 1
+4 1377 1
+4 1378 1
+4 1379 1
+4 1380 1
+4 1507 1
+4 1508 1
+4 1509 1
+4 1510 1
+4 1511 1
+4 1512 1
+4 1513 1
+4 1514 1
+4 1515 1
+4 1516 1
+4 1517 1
+4 1518 1
+4 1519 1
+4 1520 1
+4 1521 1
+4 1522 1
+4 1523 1
+4 1524 1
+4 1525 1
+4 1526 1
+4 1527 1
+4 1528 1
+4 1529 1
+4 1530 1
+4 1531 1
+4 1532 1
+4 1533 1
+4 1534 1
+4 1535 1
+4 1536 1
+4 1537 1
+4 1538 1
+4 1539 1
+4 1540 1
+4 1541 1
+4 1542 1
+4 1543 1
+4 1544 1
+4 1545 1
+4 1546 1
+4 1547 1
+4 1548 1
+4 1549 1
+4 1550 1
+4 1551 1
+4 1552 1
+4 1553 1
+4 1554 1
+4 1555 1
+4 1556 1
+4 1557 1
+4 1558 1
+4 1559 1
+4 1560 1
+4 1561 1
+4 1562 1
+4 1563 1
+4 1564 1
+4 1565 1
+4 1566 1
+4 1567 1
+4 1568 1
+4 1569 1
+4 1570 1
+4 1571 1
+4 1572 1
+4 1573 1
+4 1574 1
+4 1575 1
+4 1576 1
+4 1577 1
+4 1578 1
+4 1579 1
+4 1580 1
+4 1581 1
+4 1582 1
+4 1583 1
+4 1584 1
+4 1585 1
+4 1586 1
+4 1587 1
+4 1588 1
+4 1589 1
+4 1590 1
+4 1591 1
+4 1592 1
+4 1593 1
+4 1594 1
+4 1595 1
+4 1596 1
+4 1597 1
+4 1598 1
+4 1599 1
+4 1600 1
+4 1601 1
+4 1602 1
+4 1603 1
+4 1604 1
+4 1605 1
+4 1606 1
+4 1607 1
+4 1608 1
+4 1609 1
+4 1610 1
+4 1611 1
+4 1612 1
+4 1613 1
+4 1614 1
+4 1615 1
+4 1616 1
+4 1617 1
+4 1618 1
+4 1619 1
+4 1620 1
+4 1621 1
+4 1622 1
+4 1623 1
+4 1624 1
+4 1625 1
+4 1626 1
+4 1627 1
+4 1628 1
+4 1629 1
+4 1630 1
+4 1631 1
+4 1632 1
+5 1 1
+5 2 1
+5 3 1
+5 4 1
+5 5 1
+5 6 1
+5 7 1
+5 8 1
+5 37 1
+5 38 1
+5 39 1
+5 40 1
+5 41 1
+5 42 1
+5 43 1
+5 44 1
+5 45 1
+5 46 1
+5 47 1
+5 48 1
+5 49 1
+5 50 1
+5 51 1
+5 52 1
+5 53 1
+5 54 1
+5 55 1
+5 56 1
+5 57 1
+5 58 1
+5 59 1
+5 60 1
+5 61 1
+5 62 1
+5 63 1
+5 64 1
+5 121 1
+5 122 1
+5 123 1
+5 124 1
+5 125 1
+5 126 1
+5 127 1
+5 128 1
+5 129 1
+5 130 1
+5 131 1
+5 132 1
+5 133 1
+5 134 1
+5 135 1
+5 136 1
+5 137 1
+5 138 1
+5 139 1
+5 140 1
+5 141 1
+5 142 1
+5 143 1
+5 144 1
+5 145 1
+5 146 1
+5 147 1
+5 148 1
+5 205 1
+5 206 1
+5 207 1
+5 208 1
+5 209 1
+5 210 1
+5 211 1
+5 212 1
+5 213 1
+5 214 1
+5 215 1
+5 216 1
+5 217 1
+5 218 1
+5 219 1
+5 220 1
+5 221 1
+5 222 1
+5 223 1
+5 224 1
+5 225 1
+5 226 1
+5 227 1
+5 228 1
+5 229 1
+5 230 1
+5 231 1
+5 232 1
+5 233 1
+5 234 1
+5 235 1
+5 236 1
+5 237 1
+5 238 1
+5 239 1
+5 240 1
+5 241 1
+5 242 1
+5 243 1
+5 244 1
+5 245 1
+5 246 1
+5 247 1
+5 248 1
+5 249 1
+5 250 1
+5 251 1
+5 252 1
+5 253 1
+5 254 1
+5 255 1
+5 256 1
+5 257 1
+5 258 1
+5 259 1
+5 260 1
+5 331 1
+5 332 1
+5 333 1
+5 334 1
+5 335 1
+5 336 1
+5 337 1
+5 338 1
+5 339 1
+5 340 1
+5 341 1
+5 342 1
+5 343 1
+5 344 1
+5 345 1
+5 346 1
+5 347 1
+5 348 1
+5 349 1
+5 350 1
+5 351 1
+5 352 1
+5 353 1
+5 354 1
+5 355 1
+5 356 1
+5 357 1
+5 358 1
+5 415 1
+5 416 1
+5 417 1
+5 418 1
+5 419 1
+5 420 1
+5 421 1
+5 422 1
+5 423 1
+5 424 1
+5 425 1
+5 426 1
+5 427 1
+5 428 1
+5 429 1
+5 430 1
+5 431 1
+5 432 1
+5 433 1
+5 434 1
+5 435 1
+5 436 1
+5 437 1
+5 438 1
+5 439 1
+5 440 1
+5 441 1
+5 442 1
+5 443 1
+5 444 1
+5 445 1
+5 446 1
+5 447 1
+5 448 1
+5 449 1
+5 450 1
+5 451 1
+5 452 1
+5 453 1
+5 454 1
+5 455 1
+5 456 1
+5 457 1
+5 458 1
+5 459 1
+5 460 1
+5 461 1
+5 462 1
+5 463 1
+5 464 1
+5 465 1
+5 466 1
+5 467 1
+5 468 1
+5 469 1
+5 470 1
+5 541 1
+5 542 1
+5 543 1
+5 544 1
+5 545 1
+5 546 1
+5 547 1
+5 548 1
+5 549 1
+5 550 1
+5 551 1
+5 552 1
+5 553 1
+5 554 1
+5 555 1
+5 556 1
+5 557 1
+5 558 1
+5 559 1
+5 560 1
+5 561 1
+5 562 1
+5 563 1
+5 564 1
+5 565 1
+5 566 1
+5 567 1
+5 568 1
+5 569 1
+5 570 1
+5 571 1
+5 572 1
+5 573 1
+5 574 1
+5 575 1
+5 576 1
+5 577 1
+5 578 1
+5 579 1
+5 580 1
+5 581 1
+5 582 1
+5 583 1
+5 584 1
+5 585 1
+5 586 1
+5 587 1
+5 588 1
+5 589 1
+5 590 1
+5 591 1
+5 592 1
+5 593 1
+5 594 1
+5 595 1
+5 596 1
+5 667 1
+5 668 1
+5 669 1
+5 670 1
+5 671 1
+5 672 1
+5 673 1
+5 674 1
+5 675 1
+5 676 1
+5 677 1
+5 678 1
+5 679 1
+5 680 1
+5 681 1
+5 682 1
+5 683 1
+5 684 1
+5 685 1
+5 686 1
+5 687 1
+5 688 1
+5 689 1
+5 690 1
+5 691 1
+5 692 1
+5 693 1
+5 694 1
+5 695 1
+5 696 1
+5 697 1
+5 698 1
+5 699 1
+5 700 1
+5 701 1
+5 702 1
+5 703 1
+5 704 1
+5 705 1
+5 706 1
+5 707 1
+5 708 1
+5 709 1
+5 710 1
+5 711 1
+5 712 1
+5 713 1
+5 714 1
+5 715 1
+5 716 1
+5 717 1
+5 718 1
+5 719 1
+5 720 1
+5 721 1
+5 722 1
+5 723 1
+5 724 1
+5 725 1
+5 726 1
+5 727 1
+5 728 1
+5 729 1
+5 730 1
+5 731 1
+5 732 1
+5 733 1
+5 734 1
+5 735 1
+5 736 1
+5 793 1
+5 794 1
+5 795 1
+5 796 1
+5 797 1
+5 798 1
+5 799 1
+5 800 1
+5 801 1
+5 802 1
+5 803 1
+5 804 1
+5 805 1
+5 806 1
+5 807 1
+5 808 1
+5 809 1
+5 810 1
+5 811 1
+5 812 1
+5 813 1
+5 814 1
+5 815 1
+5 816 1
+5 817 1
+5 818 1
+5 819 1
+5 820 1
+5 877 1
+5 878 1
+5 879 1
+5 880 1
+5 881 1
+5 882 1
+5 883 1
+5 884 1
+5 885 1
+5 886 1
+5 887 1
+5 888 1
+5 889 1
+5 890 1
+5 891 1
+5 892 1
+5 893 1
+5 894 1
+5 895 1
+5 896 1
+5 897 1
+5 898 1
+5 899 1
+5 900 1
+5 901 1
+5 902 1
+5 903 1
+5 904 1
+5 905 1
+5 906 1
+5 907 1
+5 908 1
+5 909 1
+5 910 1
+5 911 1
+5 912 1
+5 913 1
+5 914 1
+5 915 1
+5 916 1
+5 917 1
+5 918 1
+5 919 1
+5 920 1
+5 921 1
+5 922 1
+5 923 1
+5 924 1
+5 925 1
+5 926 1
+5 927 1
+5 928 1
+5 929 1
+5 930 1
+5 931 1
+5 932 1
+5 1003 1
+5 1004 1
+5 1005 1
+5 1006 1
+5 1007 1
+5 1008 1
+5 1009 1
+5 1010 1
+5 1011 1
+5 1012 1
+5 1013 1
+5 1014 1
+5 1015 1
+5 1016 1
+5 1017 1
+5 1018 1
+5 1019 1
+5 1020 1
+5 1021 1
+5 1022 1
+5 1023 1
+5 1024 1
+5 1025 1
+5 1026 1
+5 1027 1
+5 1028 1
+5 1029 1
+5 1030 1
+5 1031 1
+5 1032 1
+5 1033 1
+5 1034 1
+5 1035 1
+5 1036 1
+5 1037 1
+5 1038 1
+5 1039 1
+5 1040 1
+5 1041 1
+5 1042 1
+5 1043 1
+5 1044 1
+5 1045 1
+5 1046 1
+5 1047 1
+5 1048 1
+5 1049 1
+5 1050 1
+5 1051 1
+5 1052 1
+5 1053 1
+5 1054 1
+5 1055 1
+5 1056 1
+5 1057 1
+5 1058 1
+5 1129 1
+5 1130 1
+5 1131 1
+5 1132 1
+5 1133 1
+5 1134 1
+5 1135 1
+5 1136 1
+5 1137 1
+5 1138 1
+5 1139 1
+5 1140 1
+5 1141 1
+5 1142 1
+5 1143 1
+5 1144 1
+5 1145 1
+5 1146 1
+5 1147 1
+5 1148 1
+5 1149 1
+5 1150 1
+5 1151 1
+5 1152 1
+5 1153 1
+5 1154 1
+5 1155 1
+5 1156 1
+5 1157 1
+5 1158 1
+5 1159 1
+5 1160 1
+5 1161 1
+5 1162 1
+5 1163 1
+5 1164 1
+5 1165 1
+5 1166 1
+5 1167 1
+5 1168 1
+5 1169 1
+5 1170 1
+5 1171 1
+5 1172 1
+5 1173 1
+5 1174 1
+5 1175 1
+5 1176 1
+5 1177 1
+5 1178 1
+5 1179 1
+5 1180 1
+5 1181 1
+5 1182 1
+5 1183 1
+5 1184 1
+5 1185 1
+5 1186 1
+5 1187 1
+5 1188 1
+5 1189 1
+5 1190 1
+5 1191 1
+5 1192 1
+5 1193 1
+5 1194 1
+5 1195 1
+5 1196 1
+5 1197 1
+5 1198 1
+5 1255 1
+5 1256 1
+5 1257 1
+5 1258 1
+5 1259 1
+5 1260 1
+5 1261 1
+5 1262 1
+5 1263 1
+5 1264 1
+5 1265 1
+5 1266 1
+5 1267 1
+5 1268 1
+5 1269 1
+5 1270 1
+5 1271 1
+5 1272 1
+5 1273 1
+5 1274 1
+5 1275 1
+5 1276 1
+5 1277 1
+5 1278 1
+5 1279 1
+5 1280 1
+5 1281 1
+5 1282 1
+5 1283 1
+5 1284 1
+5 1285 1
+5 1286 1
+5 1287 1
+5 1288 1
+5 1289 1
+5 1290 1
+5 1291 1
+5 1292 1
+5 1293 1
+5 1294 1
+5 1295 1
+5 1296 1
+5 1297 1
+5 1298 1
+5 1299 1
+5 1300 1
+5 1301 1
+5 1302 1
+5 1303 1
+5 1304 1
+5 1305 1
+5 1306 1
+5 1307 1
+5 1308 1
+5 1309 1
+5 1310 1
+5 1381 1
+5 1382 1
+5 1383 1
+5 1384 1
+5 1385 1
+5 1386 1
+5 1387 1
+5 1388 1
+5 1389 1
+5 1390 1
+5 1391 1
+5 1392 1
+5 1393 1
+5 1394 1
+5 1395 1
+5 1396 1
+5 1397 1
+5 1398 1
+5 1399 1
+5 1400 1
+5 1401 1
+5 1402 1
+5 1403 1
+5 1404 1
+5 1405 1
+5 1406 1
+5 1407 1
+5 1408 1
+5 1409 1
+5 1410 1
+5 1411 1
+5 1412 1
+5 1413 1
+5 1414 1
+5 1415 1
+5 1416 1
+5 1417 1
+5 1418 1
+5 1419 1
+5 1420 1
+5 1421 1
+5 1422 1
+5 1423 1
+5 1424 1
+5 1425 1
+5 1426 1
+5 1427 1
+5 1428 1
+5 1429 1
+5 1430 1
+5 1431 1
+5 1432 1
+5 1433 1
+5 1434 1
+5 1435 1
+5 1436 1
+5 1437 1
+5 1438 1
+5 1439 1
+5 1440 1
+5 1441 1
+5 1442 1
+5 1443 1
+5 1444 1
+5 1445 1
+5 1446 1
+5 1447 1
+5 1448 1
+5 1449 1
+5 1450 1
+5 1507 1
+5 1508 1
+5 1509 1
+5 1510 1
+5 1511 1
+5 1512 1
+5 1513 1
+5 1514 1
+5 1515 1
+5 1516 1
+5 1517 1
+5 1518 1
+5 1519 1
+5 1520 1
+5 1521 1
+5 1522 1
+5 1523 1
+5 1524 1
+5 1525 1
+5 1526 1
+5 1527 1
+5 1528 1
+5 1529 1
+5 1530 1
+5 1531 1
+5 1532 1
+5 1533 1
+5 1534 1
+5 1535 1
+5 1536 1
+5 1537 1
+5 1538 1
+5 1539 1
+5 1540 1
+5 1541 1
+5 1542 1
+5 1543 1
+5 1544 1
+5 1545 1
+5 1546 1
+5 1547 1
+5 1548 1
+5 1549 1
+5 1550 1
+5 1551 1
+5 1552 1
+5 1553 1
+5 1554 1
+5 1555 1
+5 1556 1
+5 1557 1
+5 1558 1
+5 1559 1
+5 1560 1
+5 1561 1
+5 1562 1
+5 1563 1
+5 1564 1
+5 1565 1
+5 1566 1
+5 1567 1
+5 1568 1
+5 1569 1
+5 1570 1
+5 1571 1
+5 1572 1
+5 1573 1
+5 1574 1
+5 1575 1
+5 1576 1
+5 1633 1
+5 1634 1
+5 1635 1
+5 1636 1
+5 1637 1
+5 1638 1
+5 1639 1
+5 1640 1
+5 1641 1
+5 1642 1
+5 1643 1
+5 1644 1
+5 1645 1
+5 1646 1
+5 1647 1
+5 1648 1
+5 1649 1
+5 1650 1
+5 1651 1
+5 1652 1
+5 1653 1
+5 1654 1
+5 1655 1
+5 1656 1
+5 1657 1
+5 1658 1
+5 1659 1
+5 1660 1
+5 1661 1
+5 1662 1
+5 1663 1
+5 1664 1
+5 1665 1
+5 1666 1
+5 1667 1
+5 1668 1
+5 1669 1
+5 1670 1
+5 1671 1
+5 1672 1
+5 1673 1
+5 1674 1
+5 1675 1
+5 1676 1
+5 1677 1
+5 1678 1
+5 1679 1
+5 1680 1
+5 1681 1
+5 1682 1
+5 1683 1
+5 1684 1
+5 1685 1
+5 1686 1
+5 1687 1
+5 1688 1
+6 1 1
+6 9 1
+6 10 1
+6 11 1
+6 12 1
+6 13 1
+6 14 1
+6 15 1
+6 37 1
+6 38 1
+6 39 1
+6 40 1
+6 41 1
+6 42 1
+6 43 1
+6 65 1
+6 66 1
+6 67 1
+6 68 1
+6 69 1
+6 70 1
+6 71 1
+6 72 1
+6 73 1
+6 74 1
+6 75 1
+6 76 1
+6 77 1
+6 78 1
+6 79 1
+6 80 1
+6 81 1
+6 82 1
+6 83 1
+6 84 1
+6 85 1
+6 121 1
+6 122 1
+6 123 1
+6 124 1
+6 125 1
+6 126 1
+6 127 1
+6 149 1
+6 150 1
+6 151 1
+6 152 1
+6 153 1
+6 154 1
+6 155 1
+6 156 1
+6 157 1
+6 158 1
+6 159 1
+6 160 1
+6 161 1
+6 162 1
+6 163 1
+6 164 1
+6 165 1
+6 166 1
+6 167 1
+6 168 1
+6 169 1
+6 205 1
+6 206 1
+6 207 1
+6 208 1
+6 209 1
+6 210 1
+6 211 1
+6 212 1
+6 213 1
+6 214 1
+6 215 1
+6 216 1
+6 217 1
+6 218 1
+6 219 1
+6 220 1
+6 221 1
+6 222 1
+6 223 1
+6 224 1
+6 225 1
+6 261 1
+6 262 1
+6 263 1
+6 264 1
+6 265 1
+6 266 1
+6 267 1
+6 268 1
+6 269 1
+6 270 1
+6 271 1
+6 272 1
+6 273 1
+6 274 1
+6 275 1
+6 276 1
+6 277 1
+6 278 1
+6 279 1
+6 280 1
+6 281 1
+6 282 1
+6 283 1
+6 284 1
+6 285 1
+6 286 1
+6 287 1
+6 288 1
+6 289 1
+6 290 1
+6 291 1
+6 292 1
+6 293 1
+6 294 1
+6 295 1
+6 331 1
+6 332 1
+6 333 1
+6 334 1
+6 335 1
+6 336 1
+6 337 1
+6 359 1
+6 360 1
+6 361 1
+6 362 1
+6 363 1
+6 364 1
+6 365 1
+6 366 1
+6 367 1
+6 368 1
+6 369 1
+6 370 1
+6 371 1
+6 372 1
+6 373 1
+6 374 1
+6 375 1
+6 376 1
+6 377 1
+6 378 1
+6 379 1
+6 415 1
+6 416 1
+6 417 1
+6 418 1
+6 419 1
+6 420 1
+6 421 1
+6 422 1
+6 423 1
+6 424 1
+6 425 1
+6 426 1
+6 427 1
+6 428 1
+6 429 1
+6 430 1
+6 431 1
+6 432 1
+6 433 1
+6 434 1
+6 435 1
+6 471 1
+6 472 1
+6 473 1
+6 474 1
+6 475 1
+6 476 1
+6 477 1
+6 478 1
+6 479 1
+6 480 1
+6 481 1
+6 482 1
+6 483 1
+6 484 1
+6 485 1
+6 486 1
+6 487 1
+6 488 1
+6 489 1
+6 490 1
+6 491 1
+6 492 1
+6 493 1
+6 494 1
+6 495 1
+6 496 1
+6 497 1
+6 498 1
+6 499 1
+6 500 1
+6 501 1
+6 502 1
+6 503 1
+6 504 1
+6 505 1
+6 541 1
+6 542 1
+6 543 1
+6 544 1
+6 545 1
+6 546 1
+6 547 1
+6 548 1
+6 549 1
+6 550 1
+6 551 1
+6 552 1
+6 553 1
+6 554 1
+6 555 1
+6 556 1
+6 557 1
+6 558 1
+6 559 1
+6 560 1
+6 561 1
+6 597 1
+6 598 1
+6 599 1
+6 600 1
+6 601 1
+6 602 1
+6 603 1
+6 604 1
+6 605 1
+6 606 1
+6 607 1
+6 608 1
+6 609 1
+6 610 1
+6 611 1
+6 612 1
+6 613 1
+6 614 1
+6 615 1
+6 616 1
+6 617 1
+6 618 1
+6 619 1
+6 620 1
+6 621 1
+6 622 1
+6 623 1
+6 624 1
+6 625 1
+6 626 1
+6 627 1
+6 628 1
+6 629 1
+6 630 1
+6 631 1
+6 667 1
+6 668 1
+6 669 1
+6 670 1
+6 671 1
+6 672 1
+6 673 1
+6 674 1
+6 675 1
+6 676 1
+6 677 1
+6 678 1
+6 679 1
+6 680 1
+6 681 1
+6 682 1
+6 683 1
+6 684 1
+6 685 1
+6 686 1
+6 687 1
+6 688 1
+6 689 1
+6 690 1
+6 691 1
+6 692 1
+6 693 1
+6 694 1
+6 695 1
+6 696 1
+6 697 1
+6 698 1
+6 699 1
+6 700 1
+6 701 1
+6 737 1
+6 738 1
+6 739 1
+6 740 1
+6 741 1
+6 742 1
+6 743 1
+6 744 1
+6 745 1
+6 746 1
+6 747 1
+6 748 1
+6 749 1
+6 750 1
+6 751 1
+6 752 1
+6 753 1
+6 754 1
+6 755 1
+6 756 1
+6 757 1
+6 758 1
+6 759 1
+6 760 1
+6 761 1
+6 762 1
+6 763 1
+6 764 1
+6 765 1
+6 766 1
+6 767 1
+6 768 1
+6 769 1
+6 770 1
+6 771 1
+6 793 1
+6 794 1
+6 795 1
+6 796 1
+6 797 1
+6 798 1
+6 799 1
+6 821 1
+6 822 1
+6 823 1
+6 824 1
+6 825 1
+6 826 1
+6 827 1
+6 828 1
+6 829 1
+6 830 1
+6 831 1
+6 832 1
+6 833 1
+6 834 1
+6 835 1
+6 836 1
+6 837 1
+6 838 1
+6 839 1
+6 840 1
+6 841 1
+6 877 1
+6 878 1
+6 879 1
+6 880 1
+6 881 1
+6 882 1
+6 883 1
+6 884 1
+6 885 1
+6 886 1
+6 887 1
+6 888 1
+6 889 1
+6 890 1
+6 891 1
+6 892 1
+6 893 1
+6 894 1
+6 895 1
+6 896 1
+6 897 1
+6 933 1
+6 934 1
+6 935 1
+6 936 1
+6 937 1
+6 938 1
+6 939 1
+6 940 1
+6 941 1
+6 942 1
+6 943 1
+6 944 1
+6 945 1
+6 946 1
+6 947 1
+6 948 1
+6 949 1
+6 950 1
+6 951 1
+6 952 1
+6 953 1
+6 954 1
+6 955 1
+6 956 1
+6 957 1
+6 958 1
+6 959 1
+6 960 1
+6 961 1
+6 962 1
+6 963 1
+6 964 1
+6 965 1
+6 966 1
+6 967 1
+6 1003 1
+6 1004 1
+6 1005 1
+6 1006 1
+6 1007 1
+6 1008 1
+6 1009 1
+6 1010 1
+6 1011 1
+6 1012 1
+6 1013 1
+6 1014 1
+6 1015 1
+6 1016 1
+6 1017 1
+6 1018 1
+6 1019 1
+6 1020 1
+6 1021 1
+6 1022 1
+6 1023 1
+6 1059 1
+6 1060 1
+6 1061 1
+6 1062 1
+6 1063 1
+6 1064 1
+6 1065 1
+6 1066 1
+6 1067 1
+6 1068 1
+6 1069 1
+6 1070 1
+6 1071 1
+6 1072 1
+6 1073 1
+6 1074 1
+6 1075 1
+6 1076 1
+6 1077 1
+6 1078 1
+6 1079 1
+6 1080 1
+6 1081 1
+6 1082 1
+6 1083 1
+6 1084 1
+6 1085 1
+6 1086 1
+6 1087 1
+6 1088 1
+6 1089 1
+6 1090 1
+6 1091 1
+6 1092 1
+6 1093 1
+6 1129 1
+6 1130 1
+6 1131 1
+6 1132 1
+6 1133 1
+6 1134 1
+6 1135 1
+6 1136 1
+6 1137 1
+6 1138 1
+6 1139 1
+6 1140 1
+6 1141 1
+6 1142 1
+6 1143 1
+6 1144 1
+6 1145 1
+6 1146 1
+6 1147 1
+6 1148 1
+6 1149 1
+6 1150 1
+6 1151 1
+6 1152 1
+6 1153 1
+6 1154 1
+6 1155 1
+6 1156 1
+6 1157 1
+6 1158 1
+6 1159 1
+6 1160 1
+6 1161 1
+6 1162 1
+6 1163 1
+6 1199 1
+6 1200 1
+6 1201 1
+6 1202 1
+6 1203 1
+6 1204 1
+6 1205 1
+6 1206 1
+6 1207 1
+6 1208 1
+6 1209 1
+6 1210 1
+6 1211 1
+6 1212 1
+6 1213 1
+6 1214 1
+6 1215 1
+6 1216 1
+6 1217 1
+6 1218 1
+6 1219 1
+6 1220 1
+6 1221 1
+6 1222 1
+6 1223 1
+6 1224 1
+6 1225 1
+6 1226 1
+6 1227 1
+6 1228 1
+6 1229 1
+6 1230 1
+6 1231 1
+6 1232 1
+6 1233 1
+6 1255 1
+6 1256 1
+6 1257 1
+6 1258 1
+6 1259 1
+6 1260 1
+6 1261 1
+6 1262 1
+6 1263 1
+6 1264 1
+6 1265 1
+6 1266 1
+6 1267 1
+6 1268 1
+6 1269 1
+6 1270 1
+6 1271 1
+6 1272 1
+6 1273 1
+6 1274 1
+6 1275 1
+6 1311 1
+6 1312 1
+6 1313 1
+6 1314 1
+6 1315 1
+6 1316 1
+6 1317 1
+6 1318 1
+6 1319 1
+6 1320 1
+6 1321 1
+6 1322 1
+6 1323 1
+6 1324 1
+6 1325 1
+6 1326 1
+6 1327 1
+6 1328 1
+6 1329 1
+6 1330 1
+6 1331 1
+6 1332 1
+6 1333 1
+6 1334 1
+6 1335 1
+6 1336 1
+6 1337 1
+6 1338 1
+6 1339 1
+6 1340 1
+6 1341 1
+6 1342 1
+6 1343 1
+6 1344 1
+6 1345 1
+6 1381 1
+6 1382 1
+6 1383 1
+6 1384 1
+6 1385 1
+6 1386 1
+6 1387 1
+6 1388 1
+6 1389 1
+6 1390 1
+6 1391 1
+6 1392 1
+6 1393 1
+6 1394 1
+6 1395 1
+6 1396 1
+6 1397 1
+6 1398 1
+6 1399 1
+6 1400 1
+6 1401 1
+6 1402 1
+6 1403 1
+6 1404 1
+6 1405 1
+6 1406 1
+6 1407 1
+6 1408 1
+6 1409 1
+6 1410 1
+6 1411 1
+6 1412 1
+6 1413 1
+6 1414 1
+6 1415 1
+6 1451 1
+6 1452 1
+6 1453 1
+6 1454 1
+6 1455 1
+6 1456 1
+6 1457 1
+6 1458 1
+6 1459 1
+6 1460 1
+6 1461 1
+6 1462 1
+6 1463 1
+6 1464 1
+6 1465 1
+6 1466 1
+6 1467 1
+6 1468 1
+6 1469 1
+6 1470 1
+6 1471 1
+6 1472 1
+6 1473 1
+6 1474 1
+6 1475 1
+6 1476 1
+6 1477 1
+6 1478 1
+6 1479 1
+6 1480 1
+6 1481 1
+6 1482 1
+6 1483 1
+6 1484 1
+6 1485 1
+6 1507 1
+6 1508 1
+6 1509 1
+6 1510 1
+6 1511 1
+6 1512 1
+6 1513 1
+6 1514 1
+6 1515 1
+6 1516 1
+6 1517 1
+6 1518 1
+6 1519 1
+6 1520 1
+6 1521 1
+6 1522 1
+6 1523 1
+6 1524 1
+6 1525 1
+6 1526 1
+6 1527 1
+6 1528 1
+6 1529 1
+6 1530 1
+6 1531 1
+6 1532 1
+6 1533 1
+6 1534 1
+6 1535 1
+6 1536 1
+6 1537 1
+6 1538 1
+6 1539 1
+6 1540 1
+6 1541 1
+6 1577 1
+6 1578 1
+6 1579 1
+6 1580 1
+6 1581 1
+6 1582 1
+6 1583 1
+6 1584 1
+6 1585 1
+6 1586 1
+6 1587 1
+6 1588 1
+6 1589 1
+6 1590 1
+6 1591 1
+6 1592 1
+6 1593 1
+6 1594 1
+6 1595 1
+6 1596 1
+6 1597 1
+6 1598 1
+6 1599 1
+6 1600 1
+6 1601 1
+6 1602 1
+6 1603 1
+6 1604 1
+6 1605 1
+6 1606 1
+6 1607 1
+6 1608 1
+6 1609 1
+6 1610 1
+6 1611 1
+6 1633 1
+6 1634 1
+6 1635 1
+6 1636 1
+6 1637 1
+6 1638 1
+6 1639 1
+6 1640 1
+6 1641 1
+6 1642 1
+6 1643 1
+6 1644 1
+6 1645 1
+6 1646 1
+6 1647 1
+6 1648 1
+6 1649 1
+6 1650 1
+6 1651 1
+6 1652 1
+6 1653 1
+6 1654 1
+6 1655 1
+6 1656 1
+6 1657 1
+6 1658 1
+6 1659 1
+6 1660 1
+6 1661 1
+6 1662 1
+6 1663 1
+6 1664 1
+6 1665 1
+6 1666 1
+6 1667 1
+6 1689 1
+6 1690 1
+6 1691 1
+6 1692 1
+6 1693 1
+6 1694 1
+6 1695 1
+6 1696 1
+6 1697 1
+6 1698 1
+6 1699 1
+6 1700 1
+6 1701 1
+6 1702 1
+6 1703 1
+6 1704 1
+6 1705 1
+6 1706 1
+6 1707 1
+6 1708 1
+6 1709 1
+7 2 1
+7 9 1
+7 16 1
+7 17 1
+7 18 1
+7 19 1
+7 20 1
+7 21 1
+7 37 1
+7 44 1
+7 45 1
+7 46 1
+7 47 1
+7 48 1
+7 49 1
+7 65 1
+7 66 1
+7 67 1
+7 68 1
+7 69 1
+7 70 1
+7 86 1
+7 87 1
+7 88 1
+7 89 1
+7 90 1
+7 91 1
+7 92 1
+7 93 1
+7 94 1
+7 95 1
+7 96 1
+7 97 1
+7 98 1
+7 99 1
+7 100 1
+7 121 1
+7 128 1
+7 129 1
+7 130 1
+7 131 1
+7 132 1
+7 133 1
+7 149 1
+7 150 1
+7 151 1
+7 152 1
+7 153 1
+7 154 1
+7 170 1
+7 171 1
+7 172 1
+7 173 1
+7 174 1
+7 175 1
+7 176 1
+7 177 1
+7 178 1
+7 179 1
+7 180 1
+7 181 1
+7 182 1
+7 183 1
+7 184 1
+7 205 1
+7 206 1
+7 207 1
+7 208 1
+7 209 1
+7 210 1
+7 226 1
+7 227 1
+7 228 1
+7 229 1
+7 230 1
+7 231 1
+7 232 1
+7 233 1
+7 234 1
+7 235 1
+7 236 1
+7 237 1
+7 238 1
+7 239 1
+7 240 1
+7 261 1
+7 262 1
+7 263 1
+7 264 1
+7 265 1
+7 266 1
+7 267 1
+7 268 1
+7 269 1
+7 270 1
+7 271 1
+7 272 1
+7 273 1
+7 274 1
+7 275 1
+7 296 1
+7 297 1
+7 298 1
+7 299 1
+7 300 1
+7 301 1
+7 302 1
+7 303 1
+7 304 1
+7 305 1
+7 306 1
+7 307 1
+7 308 1
+7 309 1
+7 310 1
+7 311 1
+7 312 1
+7 313 1
+7 314 1
+7 315 1
+7 331 1
+7 338 1
+7 339 1
+7 340 1
+7 341 1
+7 342 1
+7 343 1
+7 359 1
+7 360 1
+7 361 1
+7 362 1
+7 363 1
+7 364 1
+7 380 1
+7 381 1
+7 382 1
+7 383 1
+7 384 1
+7 385 1
+7 386 1
+7 387 1
+7 388 1
+7 389 1
+7 390 1
+7 391 1
+7 392 1
+7 393 1
+7 394 1
+7 415 1
+7 416 1
+7 417 1
+7 418 1
+7 419 1
+7 420 1
+7 436 1
+7 437 1
+7 438 1
+7 439 1
+7 440 1
+7 441 1
+7 442 1
+7 443 1
+7 444 1
+7 445 1
+7 446 1
+7 447 1
+7 448 1
+7 449 1
+7 450 1
+7 471 1
+7 472 1
+7 473 1
+7 474 1
+7 475 1
+7 476 1
+7 477 1
+7 478 1
+7 479 1
+7 480 1
+7 481 1
+7 482 1
+7 483 1
+7 484 1
+7 485 1
+7 506 1
+7 507 1
+7 508 1
+7 509 1
+7 510 1
+7 511 1
+7 512 1
+7 513 1
+7 514 1
+7 515 1
+7 516 1
+7 517 1
+7 518 1
+7 519 1
+7 520 1
+7 521 1
+7 522 1
+7 523 1
+7 524 1
+7 525 1
+7 541 1
+7 542 1
+7 543 1
+7 544 1
+7 545 1
+7 546 1
+7 562 1
+7 563 1
+7 564 1
+7 565 1
+7 566 1
+7 567 1
+7 568 1
+7 569 1
+7 570 1
+7 571 1
+7 572 1
+7 573 1
+7 574 1
+7 575 1
+7 576 1
+7 597 1
+7 598 1
+7 599 1
+7 600 1
+7 601 1
+7 602 1
+7 603 1
+7 604 1
+7 605 1
+7 606 1
+7 607 1
+7 608 1
+7 609 1
+7 610 1
+7 611 1
+7 632 1
+7 633 1
+7 634 1
+7 635 1
+7 636 1
+7 637 1
+7 638 1
+7 639 1
+7 640 1
+7 641 1
+7 642 1
+7 643 1
+7 644 1
+7 645 1
+7 646 1
+7 647 1
+7 648 1
+7 649 1
+7 650 1
+7 651 1
+7 667 1
+7 668 1
+7 669 1
+7 670 1
+7 671 1
+7 672 1
+7 673 1
+7 674 1
+7 675 1
+7 676 1
+7 677 1
+7 678 1
+7 679 1
+7 680 1
+7 681 1
+7 702 1
+7 703 1
+7 704 1
+7 705 1
+7 706 1
+7 707 1
+7 708 1
+7 709 1
+7 710 1
+7 711 1
+7 712 1
+7 713 1
+7 714 1
+7 715 1
+7 716 1
+7 717 1
+7 718 1
+7 719 1
+7 720 1
+7 721 1
+7 737 1
+7 738 1
+7 739 1
+7 740 1
+7 741 1
+7 742 1
+7 743 1
+7 744 1
+7 745 1
+7 746 1
+7 747 1
+7 748 1
+7 749 1
+7 750 1
+7 751 1
+7 752 1
+7 753 1
+7 754 1
+7 755 1
+7 756 1
+7 772 1
+7 773 1
+7 774 1
+7 775 1
+7 776 1
+7 777 1
+7 778 1
+7 779 1
+7 780 1
+7 781 1
+7 782 1
+7 783 1
+7 784 1
+7 785 1
+7 786 1
+7 793 1
+7 800 1
+7 801 1
+7 802 1
+7 803 1
+7 804 1
+7 805 1
+7 821 1
+7 822 1
+7 823 1
+7 824 1
+7 825 1
+7 826 1
+7 842 1
+7 843 1
+7 844 1
+7 845 1
+7 846 1
+7 847 1
+7 848 1
+7 849 1
+7 850 1
+7 851 1
+7 852 1
+7 853 1
+7 854 1
+7 855 1
+7 856 1
+7 877 1
+7 878 1
+7 879 1
+7 880 1
+7 881 1
+7 882 1
+7 898 1
+7 899 1
+7 900 1
+7 901 1
+7 902 1
+7 903 1
+7 904 1
+7 905 1
+7 906 1
+7 907 1
+7 908 1
+7 909 1
+7 910 1
+7 911 1
+7 912 1
+7 933 1
+7 934 1
+7 935 1
+7 936 1
+7 937 1
+7 938 1
+7 939 1
+7 940 1
+7 941 1
+7 942 1
+7 943 1
+7 944 1
+7 945 1
+7 946 1
+7 947 1
+7 968 1
+7 969 1
+7 970 1
+7 971 1
+7 972 1
+7 973 1
+7 974 1
+7 975 1
+7 976 1
+7 977 1
+7 978 1
+7 979 1
+7 980 1
+7 981 1
+7 982 1
+7 983 1
+7 984 1
+7 985 1
+7 986 1
+7 987 1
+7 1003 1
+7 1004 1
+7 1005 1
+7 1006 1
+7 1007 1
+7 1008 1
+7 1024 1
+7 1025 1
+7 1026 1
+7 1027 1
+7 1028 1
+7 1029 1
+7 1030 1
+7 1031 1
+7 1032 1
+7 1033 1
+7 1034 1
+7 1035 1
+7 1036 1
+7 1037 1
+7 1038 1
+7 1059 1
+7 1060 1
+7 1061 1
+7 1062 1
+7 1063 1
+7 1064 1
+7 1065 1
+7 1066 1
+7 1067 1
+7 1068 1
+7 1069 1
+7 1070 1
+7 1071 1
+7 1072 1
+7 1073 1
+7 1094 1
+7 1095 1
+7 1096 1
+7 1097 1
+7 1098 1
+7 1099 1
+7 1100 1
+7 1101 1
+7 1102 1
+7 1103 1
+7 1104 1
+7 1105 1
+7 1106 1
+7 1107 1
+7 1108 1
+7 1109 1
+7 1110 1
+7 1111 1
+7 1112 1
+7 1113 1
+7 1129 1
+7 1130 1
+7 1131 1
+7 1132 1
+7 1133 1
+7 1134 1
+7 1135 1
+7 1136 1
+7 1137 1
+7 1138 1
+7 1139 1
+7 1140 1
+7 1141 1
+7 1142 1
+7 1143 1
+7 1164 1
+7 1165 1
+7 1166 1
+7 1167 1
+7 1168 1
+7 1169 1
+7 1170 1
+7 1171 1
+7 1172 1
+7 1173 1
+7 1174 1
+7 1175 1
+7 1176 1
+7 1177 1
+7 1178 1
+7 1179 1
+7 1180 1
+7 1181 1
+7 1182 1
+7 1183 1
+7 1199 1
+7 1200 1
+7 1201 1
+7 1202 1
+7 1203 1
+7 1204 1
+7 1205 1
+7 1206 1
+7 1207 1
+7 1208 1
+7 1209 1
+7 1210 1
+7 1211 1
+7 1212 1
+7 1213 1
+7 1214 1
+7 1215 1
+7 1216 1
+7 1217 1
+7 1218 1
+7 1234 1
+7 1235 1
+7 1236 1
+7 1237 1
+7 1238 1
+7 1239 1
+7 1240 1
+7 1241 1
+7 1242 1
+7 1243 1
+7 1244 1
+7 1245 1
+7 1246 1
+7 1247 1
+7 1248 1
+7 1255 1
+7 1256 1
+7 1257 1
+7 1258 1
+7 1259 1
+7 1260 1
+7 1276 1
+7 1277 1
+7 1278 1
+7 1279 1
+7 1280 1
+7 1281 1
+7 1282 1
+7 1283 1
+7 1284 1
+7 1285 1
+7 1286 1
+7 1287 1
+7 1288 1
+7 1289 1
+7 1290 1
+7 1311 1
+7 1312 1
+7 1313 1
+7 1314 1
+7 1315 1
+7 1316 1
+7 1317 1
+7 1318 1
+7 1319 1
+7 1320 1
+7 1321 1
+7 1322 1
+7 1323 1
+7 1324 1
+7 1325 1
+7 1346 1
+7 1347 1
+7 1348 1
+7 1349 1
+7 1350 1
+7 1351 1
+7 1352 1
+7 1353 1
+7 1354 1
+7 1355 1
+7 1356 1
+7 1357 1
+7 1358 1
+7 1359 1
+7 1360 1
+7 1361 1
+7 1362 1
+7 1363 1
+7 1364 1
+7 1365 1
+7 1381 1
+7 1382 1
+7 1383 1
+7 1384 1
+7 1385 1
+7 1386 1
+7 1387 1
+7 1388 1
+7 1389 1
+7 1390 1
+7 1391 1
+7 1392 1
+7 1393 1
+7 1394 1
+7 1395 1
+7 1416 1
+7 1417 1
+7 1418 1
+7 1419 1
+7 1420 1
+7 1421 1
+7 1422 1
+7 1423 1
+7 1424 1
+7 1425 1
+7 1426 1
+7 1427 1
+7 1428 1
+7 1429 1
+7 1430 1
+7 1431 1
+7 1432 1
+7 1433 1
+7 1434 1
+7 1435 1
+7 1451 1
+7 1452 1
+7 1453 1
+7 1454 1
+7 1455 1
+7 1456 1
+7 1457 1
+7 1458 1
+7 1459 1
+7 1460 1
+7 1461 1
+7 1462 1
+7 1463 1
+7 1464 1
+7 1465 1
+7 1466 1
+7 1467 1
+7 1468 1
+7 1469 1
+7 1470 1
+7 1486 1
+7 1487 1
+7 1488 1
+7 1489 1
+7 1490 1
+7 1491 1
+7 1492 1
+7 1493 1
+7 1494 1
+7 1495 1
+7 1496 1
+7 1497 1
+7 1498 1
+7 1499 1
+7 1500 1
+7 1507 1
+7 1508 1
+7 1509 1
+7 1510 1
+7 1511 1
+7 1512 1
+7 1513 1
+7 1514 1
+7 1515 1
+7 1516 1
+7 1517 1
+7 1518 1
+7 1519 1
+7 1520 1
+7 1521 1
+7 1542 1
+7 1543 1
+7 1544 1
+7 1545 1
+7 1546 1
+7 1547 1
+7 1548 1
+7 1549 1
+7 1550 1
+7 1551 1
+7 1552 1
+7 1553 1
+7 1554 1
+7 1555 1
+7 1556 1
+7 1557 1
+7 1558 1
+7 1559 1
+7 1560 1
+7 1561 1
+7 1577 1
+7 1578 1
+7 1579 1
+7 1580 1
+7 1581 1
+7 1582 1
+7 1583 1
+7 1584 1
+7 1585 1
+7 1586 1
+7 1587 1
+7 1588 1
+7 1589 1
+7 1590 1
+7 1591 1
+7 1592 1
+7 1593 1
+7 1594 1
+7 1595 1
+7 1596 1
+7 1612 1
+7 1613 1
+7 1614 1
+7 1615 1
+7 1616 1
+7 1617 1
+7 1618 1
+7 1619 1
+7 1620 1
+7 1621 1
+7 1622 1
+7 1623 1
+7 1624 1
+7 1625 1
+7 1626 1
+7 1633 1
+7 1634 1
+7 1635 1
+7 1636 1
+7 1637 1
+7 1638 1
+7 1639 1
+7 1640 1
+7 1641 1
+7 1642 1
+7 1643 1
+7 1644 1
+7 1645 1
+7 1646 1
+7 1647 1
+7 1648 1
+7 1649 1
+7 1650 1
+7 1651 1
+7 1652 1
+7 1668 1
+7 1669 1
+7 1670 1
+7 1671 1
+7 1672 1
+7 1673 1
+7 1674 1
+7 1675 1
+7 1676 1
+7 1677 1
+7 1678 1
+7 1679 1
+7 1680 1
+7 1681 1
+7 1682 1
+7 1689 1
+7 1690 1
+7 1691 1
+7 1692 1
+7 1693 1
+7 1694 1
+7 1695 1
+7 1696 1
+7 1697 1
+7 1698 1
+7 1699 1
+7 1700 1
+7 1701 1
+7 1702 1
+7 1703 1
+7 1710 1
+7 1711 1
+7 1712 1
+7 1713 1
+7 1714 1
+7 1715 1
+8 3 1
+8 10 1
+8 16 1
+8 22 1
+8 23 1
+8 24 1
+8 25 1
+8 26 1
+8 38 1
+8 44 1
+8 50 1
+8 51 1
+8 52 1
+8 53 1
+8 54 1
+8 65 1
+8 71 1
+8 72 1
+8 73 1
+8 74 1
+8 75 1
+8 86 1
+8 87 1
+8 88 1
+8 89 1
+8 90 1
+8 101 1
+8 102 1
+8 103 1
+8 104 1
+8 105 1
+8 106 1
+8 107 1
+8 108 1
+8 109 1
+8 110 1
+8 122 1
+8 128 1
+8 134 1
+8 135 1
+8 136 1
+8 137 1
+8 138 1
+8 149 1
+8 155 1
+8 156 1
+8 157 1
+8 158 1
+8 159 1
+8 170 1
+8 171 1
+8 172 1
+8 173 1
+8 174 1
+8 185 1
+8 186 1
+8 187 1
+8 188 1
+8 189 1
+8 190 1
+8 191 1
+8 192 1
+8 193 1
+8 194 1
+8 205 1
+8 211 1
+8 212 1
+8 213 1
+8 214 1
+8 215 1
+8 226 1
+8 227 1
+8 228 1
+8 229 1
+8 230 1
+8 241 1
+8 242 1
+8 243 1
+8 244 1
+8 245 1
+8 246 1
+8 247 1
+8 248 1
+8 249 1
+8 250 1
+8 261 1
+8 262 1
+8 263 1
+8 264 1
+8 265 1
+8 276 1
+8 277 1
+8 278 1
+8 279 1
+8 280 1
+8 281 1
+8 282 1
+8 283 1
+8 284 1
+8 285 1
+8 296 1
+8 297 1
+8 298 1
+8 299 1
+8 300 1
+8 301 1
+8 302 1
+8 303 1
+8 304 1
+8 305 1
+8 316 1
+8 317 1
+8 318 1
+8 319 1
+8 320 1
+8 321 1
+8 322 1
+8 323 1
+8 324 1
+8 325 1
+8 332 1
+8 338 1
+8 344 1
+8 345 1
+8 346 1
+8 347 1
+8 348 1
+8 359 1
+8 365 1
+8 366 1
+8 367 1
+8 368 1
+8 369 1
+8 380 1
+8 381 1
+8 382 1
+8 383 1
+8 384 1
+8 395 1
+8 396 1
+8 397 1
+8 398 1
+8 399 1
+8 400 1
+8 401 1
+8 402 1
+8 403 1
+8 404 1
+8 415 1
+8 421 1
+8 422 1
+8 423 1
+8 424 1
+8 425 1
+8 436 1
+8 437 1
+8 438 1
+8 439 1
+8 440 1
+8 451 1
+8 452 1
+8 453 1
+8 454 1
+8 455 1
+8 456 1
+8 457 1
+8 458 1
+8 459 1
+8 460 1
+8 471 1
+8 472 1
+8 473 1
+8 474 1
+8 475 1
+8 486 1
+8 487 1
+8 488 1
+8 489 1
+8 490 1
+8 491 1
+8 492 1
+8 493 1
+8 494 1
+8 495 1
+8 506 1
+8 507 1
+8 508 1
+8 509 1
+8 510 1
+8 511 1
+8 512 1
+8 513 1
+8 514 1
+8 515 1
+8 526 1
+8 527 1
+8 528 1
+8 529 1
+8 530 1
+8 531 1
+8 532 1
+8 533 1
+8 534 1
+8 535 1
+8 541 1
+8 547 1
+8 548 1
+8 549 1
+8 550 1
+8 551 1
+8 562 1
+8 563 1
+8 564 1
+8 565 1
+8 566 1
+8 577 1
+8 578 1
+8 579 1
+8 580 1
+8 581 1
+8 582 1
+8 583 1
+8 584 1
+8 585 1
+8 586 1
+8 597 1
+8 598 1
+8 599 1
+8 600 1
+8 601 1
+8 612 1
+8 613 1
+8 614 1
+8 615 1
+8 616 1
+8 617 1
+8 618 1
+8 619 1
+8 620 1
+8 621 1
+8 632 1
+8 633 1
+8 634 1
+8 635 1
+8 636 1
+8 637 1
+8 638 1
+8 639 1
+8 640 1
+8 641 1
+8 652 1
+8 653 1
+8 654 1
+8 655 1
+8 656 1
+8 657 1
+8 658 1
+8 659 1
+8 660 1
+8 661 1
+8 667 1
+8 668 1
+8 669 1
+8 670 1
+8 671 1
+8 682 1
+8 683 1
+8 684 1
+8 685 1
+8 686 1
+8 687 1
+8 688 1
+8 689 1
+8 690 1
+8 691 1
+8 702 1
+8 703 1
+8 704 1
+8 705 1
+8 706 1
+8 707 1
+8 708 1
+8 709 1
+8 710 1
+8 711 1
+8 722 1
+8 723 1
+8 724 1
+8 725 1
+8 726 1
+8 727 1
+8 728 1
+8 729 1
+8 730 1
+8 731 1
+8 737 1
+8 738 1
+8 739 1
+8 740 1
+8 741 1
+8 742 1
+8 743 1
+8 744 1
+8 745 1
+8 746 1
+8 757 1
+8 758 1
+8 759 1
+8 760 1
+8 761 1
+8 762 1
+8 763 1
+8 764 1
+8 765 1
+8 766 1
+8 772 1
+8 773 1
+8 774 1
+8 775 1
+8 776 1
+8 777 1
+8 778 1
+8 779 1
+8 780 1
+8 781 1
+8 787 1
+8 788 1
+8 789 1
+8 790 1
+8 791 1
+8 794 1
+8 800 1
+8 806 1
+8 807 1
+8 808 1
+8 809 1
+8 810 1
+8 821 1
+8 827 1
+8 828 1
+8 829 1
+8 830 1
+8 831 1
+8 842 1
+8 843 1
+8 844 1
+8 845 1
+8 846 1
+8 857 1
+8 858 1
+8 859 1
+8 860 1
+8 861 1
+8 862 1
+8 863 1
+8 864 1
+8 865 1
+8 866 1
+8 877 1
+8 883 1
+8 884 1
+8 885 1
+8 886 1
+8 887 1
+8 898 1
+8 899 1
+8 900 1
+8 901 1
+8 902 1
+8 913 1
+8 914 1
+8 915 1
+8 916 1
+8 917 1
+8 918 1
+8 919 1
+8 920 1
+8 921 1
+8 922 1
+8 933 1
+8 934 1
+8 935 1
+8 936 1
+8 937 1
+8 948 1
+8 949 1
+8 950 1
+8 951 1
+8 952 1
+8 953 1
+8 954 1
+8 955 1
+8 956 1
+8 957 1
+8 968 1
+8 969 1
+8 970 1
+8 971 1
+8 972 1
+8 973 1
+8 974 1
+8 975 1
+8 976 1
+8 977 1
+8 988 1
+8 989 1
+8 990 1
+8 991 1
+8 992 1
+8 993 1
+8 994 1
+8 995 1
+8 996 1
+8 997 1
+8 1003 1
+8 1009 1
+8 1010 1
+8 1011 1
+8 1012 1
+8 1013 1
+8 1024 1
+8 1025 1
+8 1026 1
+8 1027 1
+8 1028 1
+8 1039 1
+8 1040 1
+8 1041 1
+8 1042 1
+8 1043 1
+8 1044 1
+8 1045 1
+8 1046 1
+8 1047 1
+8 1048 1
+8 1059 1
+8 1060 1
+8 1061 1
+8 1062 1
+8 1063 1
+8 1074 1
+8 1075 1
+8 1076 1
+8 1077 1
+8 1078 1
+8 1079 1
+8 1080 1
+8 1081 1
+8 1082 1
+8 1083 1
+8 1094 1
+8 1095 1
+8 1096 1
+8 1097 1
+8 1098 1
+8 1099 1
+8 1100 1
+8 1101 1
+8 1102 1
+8 1103 1
+8 1114 1
+8 1115 1
+8 1116 1
+8 1117 1
+8 1118 1
+8 1119 1
+8 1120 1
+8 1121 1
+8 1122 1
+8 1123 1
+8 1129 1
+8 1130 1
+8 1131 1
+8 1132 1
+8 1133 1
+8 1144 1
+8 1145 1
+8 1146 1
+8 1147 1
+8 1148 1
+8 1149 1
+8 1150 1
+8 1151 1
+8 1152 1
+8 1153 1
+8 1164 1
+8 1165 1
+8 1166 1
+8 1167 1
+8 1168 1
+8 1169 1
+8 1170 1
+8 1171 1
+8 1172 1
+8 1173 1
+8 1184 1
+8 1185 1
+8 1186 1
+8 1187 1
+8 1188 1
+8 1189 1
+8 1190 1
+8 1191 1
+8 1192 1
+8 1193 1
+8 1199 1
+8 1200 1
+8 1201 1
+8 1202 1
+8 1203 1
+8 1204 1
+8 1205 1
+8 1206 1
+8 1207 1
+8 1208 1
+8 1219 1
+8 1220 1
+8 1221 1
+8 1222 1
+8 1223 1
+8 1224 1
+8 1225 1
+8 1226 1
+8 1227 1
+8 1228 1
+8 1234 1
+8 1235 1
+8 1236 1
+8 1237 1
+8 1238 1
+8 1239 1
+8 1240 1
+8 1241 1
+8 1242 1
+8 1243 1
+8 1249 1
+8 1250 1
+8 1251 1
+8 1252 1
+8 1253 1
+8 1255 1
+8 1261 1
+8 1262 1
+8 1263 1
+8 1264 1
+8 1265 1
+8 1276 1
+8 1277 1
+8 1278 1
+8 1279 1
+8 1280 1
+8 1291 1
+8 1292 1
+8 1293 1
+8 1294 1
+8 1295 1
+8 1296 1
+8 1297 1
+8 1298 1
+8 1299 1
+8 1300 1
+8 1311 1
+8 1312 1
+8 1313 1
+8 1314 1
+8 1315 1
+8 1326 1
+8 1327 1
+8 1328 1
+8 1329 1
+8 1330 1
+8 1331 1
+8 1332 1
+8 1333 1
+8 1334 1
+8 1335 1
+8 1346 1
+8 1347 1
+8 1348 1
+8 1349 1
+8 1350 1
+8 1351 1
+8 1352 1
+8 1353 1
+8 1354 1
+8 1355 1
+8 1366 1
+8 1367 1
+8 1368 1
+8 1369 1
+8 1370 1
+8 1371 1
+8 1372 1
+8 1373 1
+8 1374 1
+8 1375 1
+8 1381 1
+8 1382 1
+8 1383 1
+8 1384 1
+8 1385 1
+8 1396 1
+8 1397 1
+8 1398 1
+8 1399 1
+8 1400 1
+8 1401 1
+8 1402 1
+8 1403 1
+8 1404 1
+8 1405 1
+8 1416 1
+8 1417 1
+8 1418 1
+8 1419 1
+8 1420 1
+8 1421 1
+8 1422 1
+8 1423 1
+8 1424 1
+8 1425 1
+8 1436 1
+8 1437 1
+8 1438 1
+8 1439 1
+8 1440 1
+8 1441 1
+8 1442 1
+8 1443 1
+8 1444 1
+8 1445 1
+8 1451 1
+8 1452 1
+8 1453 1
+8 1454 1
+8 1455 1
+8 1456 1
+8 1457 1
+8 1458 1
+8 1459 1
+8 1460 1
+8 1471 1
+8 1472 1
+8 1473 1
+8 1474 1
+8 1475 1
+8 1476 1
+8 1477 1
+8 1478 1
+8 1479 1
+8 1480 1
+8 1486 1
+8 1487 1
+8 1488 1
+8 1489 1
+8 1490 1
+8 1491 1
+8 1492 1
+8 1493 1
+8 1494 1
+8 1495 1
+8 1501 1
+8 1502 1
+8 1503 1
+8 1504 1
+8 1505 1
+8 1507 1
+8 1508 1
+8 1509 1
+8 1510 1
+8 1511 1
+8 1522 1
+8 1523 1
+8 1524 1
+8 1525 1
+8 1526 1
+8 1527 1
+8 1528 1
+8 1529 1
+8 1530 1
+8 1531 1
+8 1542 1
+8 1543 1
+8 1544 1
+8 1545 1
+8 1546 1
+8 1547 1
+8 1548 1
+8 1549 1
+8 1550 1
+8 1551 1
+8 1562 1
+8 1563 1
+8 1564 1
+8 1565 1
+8 1566 1
+8 1567 1
+8 1568 1
+8 1569 1
+8 1570 1
+8 1571 1
+8 1577 1
+8 1578 1
+8 1579 1
+8 1580 1
+8 1581 1
+8 1582 1
+8 1583 1
+8 1584 1
+8 1585 1
+8 1586 1
+8 1597 1
+8 1598 1
+8 1599 1
+8 1600 1
+8 1601 1
+8 1602 1
+8 1603 1
+8 1604 1
+8 1605 1
+8 1606 1
+8 1612 1
+8 1613 1
+8 1614 1
+8 1615 1
+8 1616 1
+8 1617 1
+8 1618 1
+8 1619 1
+8 1620 1
+8 1621 1
+8 1627 1
+8 1628 1
+8 1629 1
+8 1630 1
+8 1631 1
+8 1633 1
+8 1634 1
+8 1635 1
+8 1636 1
+8 1637 1
+8 1638 1
+8 1639 1
+8 1640 1
+8 1641 1
+8 1642 1
+8 1653 1
+8 1654 1
+8 1655 1
+8 1656 1
+8 1657 1
+8 1658 1
+8 1659 1
+8 1660 1
+8 1661 1
+8 1662 1
+8 1668 1
+8 1669 1
+8 1670 1
+8 1671 1
+8 1672 1
+8 1673 1
+8 1674 1
+8 1675 1
+8 1676 1
+8 1677 1
+8 1683 1
+8 1684 1
+8 1685 1
+8 1686 1
+8 1687 1
+8 1689 1
+8 1690 1
+8 1691 1
+8 1692 1
+8 1693 1
+8 1694 1
+8 1695 1
+8 1696 1
+8 1697 1
+8 1698 1
+8 1704 1
+8 1705 1
+8 1706 1
+8 1707 1
+8 1708 1
+8 1710 1
+8 1711 1
+8 1712 1
+8 1713 1
+8 1714 1
+8 1716 1
+9 4 1
+9 11 1
+9 17 1
+9 22 1
+9 27 1
+9 28 1
+9 29 1
+9 30 1
+9 39 1
+9 45 1
+9 50 1
+9 55 1
+9 56 1
+9 57 1
+9 58 1
+9 66 1
+9 71 1
+9 76 1
+9 77 1
+9 78 1
+9 79 1
+9 86 1
+9 91 1
+9 92 1
+9 93 1
+9 94 1
+9 101 1
+9 102 1
+9 103 1
+9 104 1
+9 111 1
+9 112 1
+9 113 1
+9 114 1
+9 115 1
+9 116 1
+9 123 1
+9 129 1
+9 134 1
+9 139 1
+9 140 1
+9 141 1
+9 142 1
+9 150 1
+9 155 1
+9 160 1
+9 161 1
+9 162 1
+9 163 1
+9 170 1
+9 175 1
+9 176 1
+9 177 1
+9 178 1
+9 185 1
+9 186 1
+9 187 1
+9 188 1
+9 195 1
+9 196 1
+9 197 1
+9 198 1
+9 199 1
+9 200 1
+9 206 1
+9 211 1
+9 216 1
+9 217 1
+9 218 1
+9 219 1
+9 226 1
+9 231 1
+9 232 1
+9 233 1
+9 234 1
+9 241 1
+9 242 1
+9 243 1
+9 244 1
+9 251 1
+9 252 1
+9 253 1
+9 254 1
+9 255 1
+9 256 1
+9 261 1
+9 266 1
+9 267 1
+9 268 1
+9 269 1
+9 276 1
+9 277 1
+9 278 1
+9 279 1
+9 286 1
+9 287 1
+9 288 1
+9 289 1
+9 290 1
+9 291 1
+9 296 1
+9 297 1
+9 298 1
+9 299 1
+9 306 1
+9 307 1
+9 308 1
+9 309 1
+9 310 1
+9 311 1
+9 316 1
+9 317 1
+9 318 1
+9 319 1
+9 320 1
+9 321 1
+9 326 1
+9 327 1
+9 328 1
+9 329 1
+9 333 1
+9 339 1
+9 344 1
+9 349 1
+9 350 1
+9 351 1
+9 352 1
+9 360 1
+9 365 1
+9 370 1
+9 371 1
+9 372 1
+9 373 1
+9 380 1
+9 385 1
+9 386 1
+9 387 1
+9 388 1
+9 395 1
+9 396 1
+9 397 1
+9 398 1
+9 405 1
+9 406 1
+9 407 1
+9 408 1
+9 409 1
+9 410 1
+9 416 1
+9 421 1
+9 426 1
+9 427 1
+9 428 1
+9 429 1
+9 436 1
+9 441 1
+9 442 1
+9 443 1
+9 444 1
+9 451 1
+9 452 1
+9 453 1
+9 454 1
+9 461 1
+9 462 1
+9 463 1
+9 464 1
+9 465 1
+9 466 1
+9 471 1
+9 476 1
+9 477 1
+9 478 1
+9 479 1
+9 486 1
+9 487 1
+9 488 1
+9 489 1
+9 496 1
+9 497 1
+9 498 1
+9 499 1
+9 500 1
+9 501 1
+9 506 1
+9 507 1
+9 508 1
+9 509 1
+9 516 1
+9 517 1
+9 518 1
+9 519 1
+9 520 1
+9 521 1
+9 526 1
+9 527 1
+9 528 1
+9 529 1
+9 530 1
+9 531 1
+9 536 1
+9 537 1
+9 538 1
+9 539 1
+9 542 1
+9 547 1
+9 552 1
+9 553 1
+9 554 1
+9 555 1
+9 562 1
+9 567 1
+9 568 1
+9 569 1
+9 570 1
+9 577 1
+9 578 1
+9 579 1
+9 580 1
+9 587 1
+9 588 1
+9 589 1
+9 590 1
+9 591 1
+9 592 1
+9 597 1
+9 602 1
+9 603 1
+9 604 1
+9 605 1
+9 612 1
+9 613 1
+9 614 1
+9 615 1
+9 622 1
+9 623 1
+9 624 1
+9 625 1
+9 626 1
+9 627 1
+9 632 1
+9 633 1
+9 634 1
+9 635 1
+9 642 1
+9 643 1
+9 644 1
+9 645 1
+9 646 1
+9 647 1
+9 652 1
+9 653 1
+9 654 1
+9 655 1
+9 656 1
+9 657 1
+9 662 1
+9 663 1
+9 664 1
+9 665 1
+9 667 1
+9 672 1
+9 673 1
+9 674 1
+9 675 1
+9 682 1
+9 683 1
+9 684 1
+9 685 1
+9 692 1
+9 693 1
+9 694 1
+9 695 1
+9 696 1
+9 697 1
+9 702 1
+9 703 1
+9 704 1
+9 705 1
+9 712 1
+9 713 1
+9 714 1
+9 715 1
+9 716 1
+9 717 1
+9 722 1
+9 723 1
+9 724 1
+9 725 1
+9 726 1
+9 727 1
+9 732 1
+9 733 1
+9 734 1
+9 735 1
+9 737 1
+9 738 1
+9 739 1
+9 740 1
+9 747 1
+9 748 1
+9 749 1
+9 750 1
+9 751 1
+9 752 1
+9 757 1
+9 758 1
+9 759 1
+9 760 1
+9 761 1
+9 762 1
+9 767 1
+9 768 1
+9 769 1
+9 770 1
+9 772 1
+9 773 1
+9 774 1
+9 775 1
+9 776 1
+9 777 1
+9 782 1
+9 783 1
+9 784 1
+9 785 1
+9 787 1
+9 788 1
+9 789 1
+9 790 1
+9 792 1
+9 795 1
+9 801 1
+9 806 1
+9 811 1
+9 812 1
+9 813 1
+9 814 1
+9 822 1
+9 827 1
+9 832 1
+9 833 1
+9 834 1
+9 835 1
+9 842 1
+9 847 1
+9 848 1
+9 849 1
+9 850 1
+9 857 1
+9 858 1
+9 859 1
+9 860 1
+9 867 1
+9 868 1
+9 869 1
+9 870 1
+9 871 1
+9 872 1
+9 878 1
+9 883 1
+9 888 1
+9 889 1
+9 890 1
+9 891 1
+9 898 1
+9 903 1
+9 904 1
+9 905 1
+9 906 1
+9 913 1
+9 914 1
+9 915 1
+9 916 1
+9 923 1
+9 924 1
+9 925 1
+9 926 1
+9 927 1
+9 928 1
+9 933 1
+9 938 1
+9 939 1
+9 940 1
+9 941 1
+9 948 1
+9 949 1
+9 950 1
+9 951 1
+9 958 1
+9 959 1
+9 960 1
+9 961 1
+9 962 1
+9 963 1
+9 968 1
+9 969 1
+9 970 1
+9 971 1
+9 978 1
+9 979 1
+9 980 1
+9 981 1
+9 982 1
+9 983 1
+9 988 1
+9 989 1
+9 990 1
+9 991 1
+9 992 1
+9 993 1
+9 998 1
+9 999 1
+9 1000 1
+9 1001 1
+9 1004 1
+9 1009 1
+9 1014 1
+9 1015 1
+9 1016 1
+9 1017 1
+9 1024 1
+9 1029 1
+9 1030 1
+9 1031 1
+9 1032 1
+9 1039 1
+9 1040 1
+9 1041 1
+9 1042 1
+9 1049 1
+9 1050 1
+9 1051 1
+9 1052 1
+9 1053 1
+9 1054 1
+9 1059 1
+9 1064 1
+9 1065 1
+9 1066 1
+9 1067 1
+9 1074 1
+9 1075 1
+9 1076 1
+9 1077 1
+9 1084 1
+9 1085 1
+9 1086 1
+9 1087 1
+9 1088 1
+9 1089 1
+9 1094 1
+9 1095 1
+9 1096 1
+9 1097 1
+9 1104 1
+9 1105 1
+9 1106 1
+9 1107 1
+9 1108 1
+9 1109 1
+9 1114 1
+9 1115 1
+9 1116 1
+9 1117 1
+9 1118 1
+9 1119 1
+9 1124 1
+9 1125 1
+9 1126 1
+9 1127 1
+9 1129 1
+9 1134 1
+9 1135 1
+9 1136 1
+9 1137 1
+9 1144 1
+9 1145 1
+9 1146 1
+9 1147 1
+9 1154 1
+9 1155 1
+9 1156 1
+9 1157 1
+9 1158 1
+9 1159 1
+9 1164 1
+9 1165 1
+9 1166 1
+9 1167 1
+9 1174 1
+9 1175 1
+9 1176 1
+9 1177 1
+9 1178 1
+9 1179 1
+9 1184 1
+9 1185 1
+9 1186 1
+9 1187 1
+9 1188 1
+9 1189 1
+9 1194 1
+9 1195 1
+9 1196 1
+9 1197 1
+9 1199 1
+9 1200 1
+9 1201 1
+9 1202 1
+9 1209 1
+9 1210 1
+9 1211 1
+9 1212 1
+9 1213 1
+9 1214 1
+9 1219 1
+9 1220 1
+9 1221 1
+9 1222 1
+9 1223 1
+9 1224 1
+9 1229 1
+9 1230 1
+9 1231 1
+9 1232 1
+9 1234 1
+9 1235 1
+9 1236 1
+9 1237 1
+9 1238 1
+9 1239 1
+9 1244 1
+9 1245 1
+9 1246 1
+9 1247 1
+9 1249 1
+9 1250 1
+9 1251 1
+9 1252 1
+9 1254 1
+9 1256 1
+9 1261 1
+9 1266 1
+9 1267 1
+9 1268 1
+9 1269 1
+9 1276 1
+9 1281 1
+9 1282 1
+9 1283 1
+9 1284 1
+9 1291 1
+9 1292 1
+9 1293 1
+9 1294 1
+9 1301 1
+9 1302 1
+9 1303 1
+9 1304 1
+9 1305 1
+9 1306 1
+9 1311 1
+9 1316 1
+9 1317 1
+9 1318 1
+9 1319 1
+9 1326 1
+9 1327 1
+9 1328 1
+9 1329 1
+9 1336 1
+9 1337 1
+9 1338 1
+9 1339 1
+9 1340 1
+9 1341 1
+9 1346 1
+9 1347 1
+9 1348 1
+9 1349 1
+9 1356 1
+9 1357 1
+9 1358 1
+9 1359 1
+9 1360 1
+9 1361 1
+9 1366 1
+9 1367 1
+9 1368 1
+9 1369 1
+9 1370 1
+9 1371 1
+9 1376 1
+9 1377 1
+9 1378 1
+9 1379 1
+9 1381 1
+9 1386 1
+9 1387 1
+9 1388 1
+9 1389 1
+9 1396 1
+9 1397 1
+9 1398 1
+9 1399 1
+9 1406 1
+9 1407 1
+9 1408 1
+9 1409 1
+9 1410 1
+9 1411 1
+9 1416 1
+9 1417 1
+9 1418 1
+9 1419 1
+9 1426 1
+9 1427 1
+9 1428 1
+9 1429 1
+9 1430 1
+9 1431 1
+9 1436 1
+9 1437 1
+9 1438 1
+9 1439 1
+9 1440 1
+9 1441 1
+9 1446 1
+9 1447 1
+9 1448 1
+9 1449 1
+9 1451 1
+9 1452 1
+9 1453 1
+9 1454 1
+9 1461 1
+9 1462 1
+9 1463 1
+9 1464 1
+9 1465 1
+9 1466 1
+9 1471 1
+9 1472 1
+9 1473 1
+9 1474 1
+9 1475 1
+9 1476 1
+9 1481 1
+9 1482 1
+9 1483 1
+9 1484 1
+9 1486 1
+9 1487 1
+9 1488 1
+9 1489 1
+9 1490 1
+9 1491 1
+9 1496 1
+9 1497 1
+9 1498 1
+9 1499 1
+9 1501 1
+9 1502 1
+9 1503 1
+9 1504 1
+9 1506 1
+9 1507 1
+9 1512 1
+9 1513 1
+9 1514 1
+9 1515 1
+9 1522 1
+9 1523 1
+9 1524 1
+9 1525 1
+9 1532 1
+9 1533 1
+9 1534 1
+9 1535 1
+9 1536 1
+9 1537 1
+9 1542 1
+9 1543 1
+9 1544 1
+9 1545 1
+9 1552 1
+9 1553 1
+9 1554 1
+9 1555 1
+9 1556 1
+9 1557 1
+9 1562 1
+9 1563 1
+9 1564 1
+9 1565 1
+9 1566 1
+9 1567 1
+9 1572 1
+9 1573 1
+9 1574 1
+9 1575 1
+9 1577 1
+9 1578 1
+9 1579 1
+9 1580 1
+9 1587 1
+9 1588 1
+9 1589 1
+9 1590 1
+9 1591 1
+9 1592 1
+9 1597 1
+9 1598 1
+9 1599 1
+9 1600 1
+9 1601 1
+9 1602 1
+9 1607 1
+9 1608 1
+9 1609 1
+9 1610 1
+9 1612 1
+9 1613 1
+9 1614 1
+9 1615 1
+9 1616 1
+9 1617 1
+9 1622 1
+9 1623 1
+9 1624 1
+9 1625 1
+9 1627 1
+9 1628 1
+9 1629 1
+9 1630 1
+9 1632 1
+9 1633 1
+9 1634 1
+9 1635 1
+9 1636 1
+9 1643 1
+9 1644 1
+9 1645 1
+9 1646 1
+9 1647 1
+9 1648 1
+9 1653 1
+9 1654 1
+9 1655 1
+9 1656 1
+9 1657 1
+9 1658 1
+9 1663 1
+9 1664 1
+9 1665 1
+9 1666 1
+9 1668 1
+9 1669 1
+9 1670 1
+9 1671 1
+9 1672 1
+9 1673 1
+9 1678 1
+9 1679 1
+9 1680 1
+9 1681 1
+9 1683 1
+9 1684 1
+9 1685 1
+9 1686 1
+9 1688 1
+9 1689 1
+9 1690 1
+9 1691 1
+9 1692 1
+9 1693 1
+9 1694 1
+9 1699 1
+9 1700 1
+9 1701 1
+9 1702 1
+9 1704 1
+9 1705 1
+9 1706 1
+9 1707 1
+9 1709 1
+9 1710 1
+9 1711 1
+9 1712 1
+9 1713 1
+9 1715 1
+9 1716 1
+10 5 1
+10 12 1
+10 18 1
+10 23 1
+10 27 1
+10 31 1
+10 32 1
+10 33 1
+10 40 1
+10 46 1
+10 51 1
+10 55 1
+10 59 1
+10 60 1
+10 61 1
+10 67 1
+10 72 1
+10 76 1
+10 80 1
+10 81 1
+10 82 1
+10 87 1
+10 91 1
+10 95 1
+10 96 1
+10 97 1
+10 101 1
+10 105 1
+10 106 1
+10 107 1
+10 111 1
+10 112 1
+10 113 1
+10 117 1
+10 118 1
+10 119 1
+10 124 1
+10 130 1
+10 135 1
+10 139 1
+10 143 1
+10 144 1
+10 145 1
+10 151 1
+10 156 1
+10 160 1
+10 164 1
+10 165 1
+10 166 1
+10 171 1
+10 175 1
+10 179 1
+10 180 1
+10 181 1
+10 185 1
+10 189 1
+10 190 1
+10 191 1
+10 195 1
+10 196 1
+10 197 1
+10 201 1
+10 202 1
+10 203 1
+10 207 1
+10 212 1
+10 216 1
+10 220 1
+10 221 1
+10 222 1
+10 227 1
+10 231 1
+10 235 1
+10 236 1
+10 237 1
+10 241 1
+10 245 1
+10 246 1
+10 247 1
+10 251 1
+10 252 1
+10 253 1
+10 257 1
+10 258 1
+10 259 1
+10 262 1
+10 266 1
+10 270 1
+10 271 1
+10 272 1
+10 276 1
+10 280 1
+10 281 1
+10 282 1
+10 286 1
+10 287 1
+10 288 1
+10 292 1
+10 293 1
+10 294 1
+10 296 1
+10 300 1
+10 301 1
+10 302 1
+10 306 1
+10 307 1
+10 308 1
+10 312 1
+10 313 1
+10 314 1
+10 316 1
+10 317 1
+10 318 1
+10 322 1
+10 323 1
+10 324 1
+10 326 1
+10 327 1
+10 328 1
+10 330 1
+10 334 1
+10 340 1
+10 345 1
+10 349 1
+10 353 1
+10 354 1
+10 355 1
+10 361 1
+10 366 1
+10 370 1
+10 374 1
+10 375 1
+10 376 1
+10 381 1
+10 385 1
+10 389 1
+10 390 1
+10 391 1
+10 395 1
+10 399 1
+10 400 1
+10 401 1
+10 405 1
+10 406 1
+10 407 1
+10 411 1
+10 412 1
+10 413 1
+10 417 1
+10 422 1
+10 426 1
+10 430 1
+10 431 1
+10 432 1
+10 437 1
+10 441 1
+10 445 1
+10 446 1
+10 447 1
+10 451 1
+10 455 1
+10 456 1
+10 457 1
+10 461 1
+10 462 1
+10 463 1
+10 467 1
+10 468 1
+10 469 1
+10 472 1
+10 476 1
+10 480 1
+10 481 1
+10 482 1
+10 486 1
+10 490 1
+10 491 1
+10 492 1
+10 496 1
+10 497 1
+10 498 1
+10 502 1
+10 503 1
+10 504 1
+10 506 1
+10 510 1
+10 511 1
+10 512 1
+10 516 1
+10 517 1
+10 518 1
+10 522 1
+10 523 1
+10 524 1
+10 526 1
+10 527 1
+10 528 1
+10 532 1
+10 533 1
+10 534 1
+10 536 1
+10 537 1
+10 538 1
+10 540 1
+10 543 1
+10 548 1
+10 552 1
+10 556 1
+10 557 1
+10 558 1
+10 563 1
+10 567 1
+10 571 1
+10 572 1
+10 573 1
+10 577 1
+10 581 1
+10 582 1
+10 583 1
+10 587 1
+10 588 1
+10 589 1
+10 593 1
+10 594 1
+10 595 1
+10 598 1
+10 602 1
+10 606 1
+10 607 1
+10 608 1
+10 612 1
+10 616 1
+10 617 1
+10 618 1
+10 622 1
+10 623 1
+10 624 1
+10 628 1
+10 629 1
+10 630 1
+10 632 1
+10 636 1
+10 637 1
+10 638 1
+10 642 1
+10 643 1
+10 644 1
+10 648 1
+10 649 1
+10 650 1
+10 652 1
+10 653 1
+10 654 1
+10 658 1
+10 659 1
+10 660 1
+10 662 1
+10 663 1
+10 664 1
+10 666 1
+10 668 1
+10 672 1
+10 676 1
+10 677 1
+10 678 1
+10 682 1
+10 686 1
+10 687 1
+10 688 1
+10 692 1
+10 693 1
+10 694 1
+10 698 1
+10 699 1
+10 700 1
+10 702 1
+10 706 1
+10 707 1
+10 708 1
+10 712 1
+10 713 1
+10 714 1
+10 718 1
+10 719 1
+10 720 1
+10 722 1
+10 723 1
+10 724 1
+10 728 1
+10 729 1
+10 730 1
+10 732 1
+10 733 1
+10 734 1
+10 736 1
+10 737 1
+10 741 1
+10 742 1
+10 743 1
+10 747 1
+10 748 1
+10 749 1
+10 753 1
+10 754 1
+10 755 1
+10 757 1
+10 758 1
+10 759 1
+10 763 1
+10 764 1
+10 765 1
+10 767 1
+10 768 1
+10 769 1
+10 771 1
+10 772 1
+10 773 1
+10 774 1
+10 778 1
+10 779 1
+10 780 1
+10 782 1
+10 783 1
+10 784 1
+10 786 1
+10 787 1
+10 788 1
+10 789 1
+10 791 1
+10 792 1
+10 796 1
+10 802 1
+10 807 1
+10 811 1
+10 815 1
+10 816 1
+10 817 1
+10 823 1
+10 828 1
+10 832 1
+10 836 1
+10 837 1
+10 838 1
+10 843 1
+10 847 1
+10 851 1
+10 852 1
+10 853 1
+10 857 1
+10 861 1
+10 862 1
+10 863 1
+10 867 1
+10 868 1
+10 869 1
+10 873 1
+10 874 1
+10 875 1
+10 879 1
+10 884 1
+10 888 1
+10 892 1
+10 893 1
+10 894 1
+10 899 1
+10 903 1
+10 907 1
+10 908 1
+10 909 1
+10 913 1
+10 917 1
+10 918 1
+10 919 1
+10 923 1
+10 924 1
+10 925 1
+10 929 1
+10 930 1
+10 931 1
+10 934 1
+10 938 1
+10 942 1
+10 943 1
+10 944 1
+10 948 1
+10 952 1
+10 953 1
+10 954 1
+10 958 1
+10 959 1
+10 960 1
+10 964 1
+10 965 1
+10 966 1
+10 968 1
+10 972 1
+10 973 1
+10 974 1
+10 978 1
+10 979 1
+10 980 1
+10 984 1
+10 985 1
+10 986 1
+10 988 1
+10 989 1
+10 990 1
+10 994 1
+10 995 1
+10 996 1
+10 998 1
+10 999 1
+10 1000 1
+10 1002 1
+10 1005 1
+10 1010 1
+10 1014 1
+10 1018 1
+10 1019 1
+10 1020 1
+10 1025 1
+10 1029 1
+10 1033 1
+10 1034 1
+10 1035 1
+10 1039 1
+10 1043 1
+10 1044 1
+10 1045 1
+10 1049 1
+10 1050 1
+10 1051 1
+10 1055 1
+10 1056 1
+10 1057 1
+10 1060 1
+10 1064 1
+10 1068 1
+10 1069 1
+10 1070 1
+10 1074 1
+10 1078 1
+10 1079 1
+10 1080 1
+10 1084 1
+10 1085 1
+10 1086 1
+10 1090 1
+10 1091 1
+10 1092 1
+10 1094 1
+10 1098 1
+10 1099 1
+10 1100 1
+10 1104 1
+10 1105 1
+10 1106 1
+10 1110 1
+10 1111 1
+10 1112 1
+10 1114 1
+10 1115 1
+10 1116 1
+10 1120 1
+10 1121 1
+10 1122 1
+10 1124 1
+10 1125 1
+10 1126 1
+10 1128 1
+10 1130 1
+10 1134 1
+10 1138 1
+10 1139 1
+10 1140 1
+10 1144 1
+10 1148 1
+10 1149 1
+10 1150 1
+10 1154 1
+10 1155 1
+10 1156 1
+10 1160 1
+10 1161 1
+10 1162 1
+10 1164 1
+10 1168 1
+10 1169 1
+10 1170 1
+10 1174 1
+10 1175 1
+10 1176 1
+10 1180 1
+10 1181 1
+10 1182 1
+10 1184 1
+10 1185 1
+10 1186 1
+10 1190 1
+10 1191 1
+10 1192 1
+10 1194 1
+10 1195 1
+10 1196 1
+10 1198 1
+10 1199 1
+10 1203 1
+10 1204 1
+10 1205 1
+10 1209 1
+10 1210 1
+10 1211 1
+10 1215 1
+10 1216 1
+10 1217 1
+10 1219 1
+10 1220 1
+10 1221 1
+10 1225 1
+10 1226 1
+10 1227 1
+10 1229 1
+10 1230 1
+10 1231 1
+10 1233 1
+10 1234 1
+10 1235 1
+10 1236 1
+10 1240 1
+10 1241 1
+10 1242 1
+10 1244 1
+10 1245 1
+10 1246 1
+10 1248 1
+10 1249 1
+10 1250 1
+10 1251 1
+10 1253 1
+10 1254 1
+10 1257 1
+10 1262 1
+10 1266 1
+10 1270 1
+10 1271 1
+10 1272 1
+10 1277 1
+10 1281 1
+10 1285 1
+10 1286 1
+10 1287 1
+10 1291 1
+10 1295 1
+10 1296 1
+10 1297 1
+10 1301 1
+10 1302 1
+10 1303 1
+10 1307 1
+10 1308 1
+10 1309 1
+10 1312 1
+10 1316 1
+10 1320 1
+10 1321 1
+10 1322 1
+10 1326 1
+10 1330 1
+10 1331 1
+10 1332 1
+10 1336 1
+10 1337 1
+10 1338 1
+10 1342 1
+10 1343 1
+10 1344 1
+10 1346 1
+10 1350 1
+10 1351 1
+10 1352 1
+10 1356 1
+10 1357 1
+10 1358 1
+10 1362 1
+10 1363 1
+10 1364 1
+10 1366 1
+10 1367 1
+10 1368 1
+10 1372 1
+10 1373 1
+10 1374 1
+10 1376 1
+10 1377 1
+10 1378 1
+10 1380 1
+10 1382 1
+10 1386 1
+10 1390 1
+10 1391 1
+10 1392 1
+10 1396 1
+10 1400 1
+10 1401 1
+10 1402 1
+10 1406 1
+10 1407 1
+10 1408 1
+10 1412 1
+10 1413 1
+10 1414 1
+10 1416 1
+10 1420 1
+10 1421 1
+10 1422 1
+10 1426 1
+10 1427 1
+10 1428 1
+10 1432 1
+10 1433 1
+10 1434 1
+10 1436 1
+10 1437 1
+10 1438 1
+10 1442 1
+10 1443 1
+10 1444 1
+10 1446 1
+10 1447 1
+10 1448 1
+10 1450 1
+10 1451 1
+10 1455 1
+10 1456 1
+10 1457 1
+10 1461 1
+10 1462 1
+10 1463 1
+10 1467 1
+10 1468 1
+10 1469 1
+10 1471 1
+10 1472 1
+10 1473 1
+10 1477 1
+10 1478 1
+10 1479 1
+10 1481 1
+10 1482 1
+10 1483 1
+10 1485 1
+10 1486 1
+10 1487 1
+10 1488 1
+10 1492 1
+10 1493 1
+10 1494 1
+10 1496 1
+10 1497 1
+10 1498 1
+10 1500 1
+10 1501 1
+10 1502 1
+10 1503 1
+10 1505 1
+10 1506 1
+10 1508 1
+10 1512 1
+10 1516 1
+10 1517 1
+10 1518 1
+10 1522 1
+10 1526 1
+10 1527 1
+10 1528 1
+10 1532 1
+10 1533 1
+10 1534 1
+10 1538 1
+10 1539 1
+10 1540 1
+10 1542 1
+10 1546 1
+10 1547 1
+10 1548 1
+10 1552 1
+10 1553 1
+10 1554 1
+10 1558 1
+10 1559 1
+10 1560 1
+10 1562 1
+10 1563 1
+10 1564 1
+10 1568 1
+10 1569 1
+10 1570 1
+10 1572 1
+10 1573 1
+10 1574 1
+10 1576 1
+10 1577 1
+10 1581 1
+10 1582 1
+10 1583 1
+10 1587 1
+10 1588 1
+10 1589 1
+10 1593 1
+10 1594 1
+10 1595 1
+10 1597 1
+10 1598 1
+10 1599 1
+10 1603 1
+10 1604 1
+10 1605 1
+10 1607 1
+10 1608 1
+10 1609 1
+10 1611 1
+10 1612 1
+10 1613 1
+10 1614 1
+10 1618 1
+10 1619 1
+10 1620 1
+10 1622 1
+10 1623 1
+10 1624 1
+10 1626 1
+10 1627 1
+10 1628 1
+10 1629 1
+10 1631 1
+10 1632 1
+10 1633 1
+10 1637 1
+10 1638 1
+10 1639 1
+10 1643 1
+10 1644 1
+10 1645 1
+10 1649 1
+10 1650 1
+10 1651 1
+10 1653 1
+10 1654 1
+10 1655 1
+10 1659 1
+10 1660 1
+10 1661 1
+10 1663 1
+10 1664 1
+10 1665 1
+10 1667 1
+10 1668 1
+10 1669 1
+10 1670 1
+10 1674 1
+10 1675 1
+10 1676 1
+10 1678 1
+10 1679 1
+10 1680 1
+10 1682 1
+10 1683 1
+10 1684 1
+10 1685 1
+10 1687 1
+10 1688 1
+10 1689 1
+10 1690 1
+10 1691 1
+10 1695 1
+10 1696 1
+10 1697 1
+10 1699 1
+10 1700 1
+10 1701 1
+10 1703 1
+10 1704 1
+10 1705 1
+10 1706 1
+10 1708 1
+10 1709 1
+10 1710 1
+10 1711 1
+10 1712 1
+10 1714 1
+10 1715 1
+10 1716 1
+11 6 1
+11 13 1
+11 19 1
+11 24 1
+11 28 1
+11 31 1
+11 34 1
+11 35 1
+11 41 1
+11 47 1
+11 52 1
+11 56 1
+11 59 1
+11 62 1
+11 63 1
+11 68 1
+11 73 1
+11 77 1
+11 80 1
+11 83 1
+11 84 1
+11 88 1
+11 92 1
+11 95 1
+11 98 1
+11 99 1
+11 102 1
+11 105 1
+11 108 1
+11 109 1
+11 111 1
+11 114 1
+11 115 1
+11 117 1
+11 118 1
+11 120 1
+11 125 1
+11 131 1
+11 136 1
+11 140 1
+11 143 1
+11 146 1
+11 147 1
+11 152 1
+11 157 1
+11 161 1
+11 164 1
+11 167 1
+11 168 1
+11 172 1
+11 176 1
+11 179 1
+11 182 1
+11 183 1
+11 186 1
+11 189 1
+11 192 1
+11 193 1
+11 195 1
+11 198 1
+11 199 1
+11 201 1
+11 202 1
+11 204 1
+11 208 1
+11 213 1
+11 217 1
+11 220 1
+11 223 1
+11 224 1
+11 228 1
+11 232 1
+11 235 1
+11 238 1
+11 239 1
+11 242 1
+11 245 1
+11 248 1
+11 249 1
+11 251 1
+11 254 1
+11 255 1
+11 257 1
+11 258 1
+11 260 1
+11 263 1
+11 267 1
+11 270 1
+11 273 1
+11 274 1
+11 277 1
+11 280 1
+11 283 1
+11 284 1
+11 286 1
+11 289 1
+11 290 1
+11 292 1
+11 293 1
+11 295 1
+11 297 1
+11 300 1
+11 303 1
+11 304 1
+11 306 1
+11 309 1
+11 310 1
+11 312 1
+11 313 1
+11 315 1
+11 316 1
+11 319 1
+11 320 1
+11 322 1
+11 323 1
+11 325 1
+11 326 1
+11 327 1
+11 329 1
+11 330 1
+11 335 1
+11 341 1
+11 346 1
+11 350 1
+11 353 1
+11 356 1
+11 357 1
+11 362 1
+11 367 1
+11 371 1
+11 374 1
+11 377 1
+11 378 1
+11 382 1
+11 386 1
+11 389 1
+11 392 1
+11 393 1
+11 396 1
+11 399 1
+11 402 1
+11 403 1
+11 405 1
+11 408 1
+11 409 1
+11 411 1
+11 412 1
+11 414 1
+11 418 1
+11 423 1
+11 427 1
+11 430 1
+11 433 1
+11 434 1
+11 438 1
+11 442 1
+11 445 1
+11 448 1
+11 449 1
+11 452 1
+11 455 1
+11 458 1
+11 459 1
+11 461 1
+11 464 1
+11 465 1
+11 467 1
+11 468 1
+11 470 1
+11 473 1
+11 477 1
+11 480 1
+11 483 1
+11 484 1
+11 487 1
+11 490 1
+11 493 1
+11 494 1
+11 496 1
+11 499 1
+11 500 1
+11 502 1
+11 503 1
+11 505 1
+11 507 1
+11 510 1
+11 513 1
+11 514 1
+11 516 1
+11 519 1
+11 520 1
+11 522 1
+11 523 1
+11 525 1
+11 526 1
+11 529 1
+11 530 1
+11 532 1
+11 533 1
+11 535 1
+11 536 1
+11 537 1
+11 539 1
+11 540 1
+11 544 1
+11 549 1
+11 553 1
+11 556 1
+11 559 1
+11 560 1
+11 564 1
+11 568 1
+11 571 1
+11 574 1
+11 575 1
+11 578 1
+11 581 1
+11 584 1
+11 585 1
+11 587 1
+11 590 1
+11 591 1
+11 593 1
+11 594 1
+11 596 1
+11 599 1
+11 603 1
+11 606 1
+11 609 1
+11 610 1
+11 613 1
+11 616 1
+11 619 1
+11 620 1
+11 622 1
+11 625 1
+11 626 1
+11 628 1
+11 629 1
+11 631 1
+11 633 1
+11 636 1
+11 639 1
+11 640 1
+11 642 1
+11 645 1
+11 646 1
+11 648 1
+11 649 1
+11 651 1
+11 652 1
+11 655 1
+11 656 1
+11 658 1
+11 659 1
+11 661 1
+11 662 1
+11 663 1
+11 665 1
+11 666 1
+11 669 1
+11 673 1
+11 676 1
+11 679 1
+11 680 1
+11 683 1
+11 686 1
+11 689 1
+11 690 1
+11 692 1
+11 695 1
+11 696 1
+11 698 1
+11 699 1
+11 701 1
+11 703 1
+11 706 1
+11 709 1
+11 710 1
+11 712 1
+11 715 1
+11 716 1
+11 718 1
+11 719 1
+11 721 1
+11 722 1
+11 725 1
+11 726 1
+11 728 1
+11 729 1
+11 731 1
+11 732 1
+11 733 1
+11 735 1
+11 736 1
+11 738 1
+11 741 1
+11 744 1
+11 745 1
+11 747 1
+11 750 1
+11 751 1
+11 753 1
+11 754 1
+11 756 1
+11 757 1
+11 760 1
+11 761 1
+11 763 1
+11 764 1
+11 766 1
+11 767 1
+11 768 1
+11 770 1
+11 771 1
+11 772 1
+11 775 1
+11 776 1
+11 778 1
+11 779 1
+11 781 1
+11 782 1
+11 783 1
+11 785 1
+11 786 1
+11 787 1
+11 788 1
+11 790 1
+11 791 1
+11 792 1
+11 797 1
+11 803 1
+11 808 1
+11 812 1
+11 815 1
+11 818 1
+11 819 1
+11 824 1
+11 829 1
+11 833 1
+11 836 1
+11 839 1
+11 840 1
+11 844 1
+11 848 1
+11 851 1
+11 854 1
+11 855 1
+11 858 1
+11 861 1
+11 864 1
+11 865 1
+11 867 1
+11 870 1
+11 871 1
+11 873 1
+11 874 1
+11 876 1
+11 880 1
+11 885 1
+11 889 1
+11 892 1
+11 895 1
+11 896 1
+11 900 1
+11 904 1
+11 907 1
+11 910 1
+11 911 1
+11 914 1
+11 917 1
+11 920 1
+11 921 1
+11 923 1
+11 926 1
+11 927 1
+11 929 1
+11 930 1
+11 932 1
+11 935 1
+11 939 1
+11 942 1
+11 945 1
+11 946 1
+11 949 1
+11 952 1
+11 955 1
+11 956 1
+11 958 1
+11 961 1
+11 962 1
+11 964 1
+11 965 1
+11 967 1
+11 969 1
+11 972 1
+11 975 1
+11 976 1
+11 978 1
+11 981 1
+11 982 1
+11 984 1
+11 985 1
+11 987 1
+11 988 1
+11 991 1
+11 992 1
+11 994 1
+11 995 1
+11 997 1
+11 998 1
+11 999 1
+11 1001 1
+11 1002 1
+11 1006 1
+11 1011 1
+11 1015 1
+11 1018 1
+11 1021 1
+11 1022 1
+11 1026 1
+11 1030 1
+11 1033 1
+11 1036 1
+11 1037 1
+11 1040 1
+11 1043 1
+11 1046 1
+11 1047 1
+11 1049 1
+11 1052 1
+11 1053 1
+11 1055 1
+11 1056 1
+11 1058 1
+11 1061 1
+11 1065 1
+11 1068 1
+11 1071 1
+11 1072 1
+11 1075 1
+11 1078 1
+11 1081 1
+11 1082 1
+11 1084 1
+11 1087 1
+11 1088 1
+11 1090 1
+11 1091 1
+11 1093 1
+11 1095 1
+11 1098 1
+11 1101 1
+11 1102 1
+11 1104 1
+11 1107 1
+11 1108 1
+11 1110 1
+11 1111 1
+11 1113 1
+11 1114 1
+11 1117 1
+11 1118 1
+11 1120 1
+11 1121 1
+11 1123 1
+11 1124 1
+11 1125 1
+11 1127 1
+11 1128 1
+11 1131 1
+11 1135 1
+11 1138 1
+11 1141 1
+11 1142 1
+11 1145 1
+11 1148 1
+11 1151 1
+11 1152 1
+11 1154 1
+11 1157 1
+11 1158 1
+11 1160 1
+11 1161 1
+11 1163 1
+11 1165 1
+11 1168 1
+11 1171 1
+11 1172 1
+11 1174 1
+11 1177 1
+11 1178 1
+11 1180 1
+11 1181 1
+11 1183 1
+11 1184 1
+11 1187 1
+11 1188 1
+11 1190 1
+11 1191 1
+11 1193 1
+11 1194 1
+11 1195 1
+11 1197 1
+11 1198 1
+11 1200 1
+11 1203 1
+11 1206 1
+11 1207 1
+11 1209 1
+11 1212 1
+11 1213 1
+11 1215 1
+11 1216 1
+11 1218 1
+11 1219 1
+11 1222 1
+11 1223 1
+11 1225 1
+11 1226 1
+11 1228 1
+11 1229 1
+11 1230 1
+11 1232 1
+11 1233 1
+11 1234 1
+11 1237 1
+11 1238 1
+11 1240 1
+11 1241 1
+11 1243 1
+11 1244 1
+11 1245 1
+11 1247 1
+11 1248 1
+11 1249 1
+11 1250 1
+11 1252 1
+11 1253 1
+11 1254 1
+11 1258 1
+11 1263 1
+11 1267 1
+11 1270 1
+11 1273 1
+11 1274 1
+11 1278 1
+11 1282 1
+11 1285 1
+11 1288 1
+11 1289 1
+11 1292 1
+11 1295 1
+11 1298 1
+11 1299 1
+11 1301 1
+11 1304 1
+11 1305 1
+11 1307 1
+11 1308 1
+11 1310 1
+11 1313 1
+11 1317 1
+11 1320 1
+11 1323 1
+11 1324 1
+11 1327 1
+11 1330 1
+11 1333 1
+11 1334 1
+11 1336 1
+11 1339 1
+11 1340 1
+11 1342 1
+11 1343 1
+11 1345 1
+11 1347 1
+11 1350 1
+11 1353 1
+11 1354 1
+11 1356 1
+11 1359 1
+11 1360 1
+11 1362 1
+11 1363 1
+11 1365 1
+11 1366 1
+11 1369 1
+11 1370 1
+11 1372 1
+11 1373 1
+11 1375 1
+11 1376 1
+11 1377 1
+11 1379 1
+11 1380 1
+11 1383 1
+11 1387 1
+11 1390 1
+11 1393 1
+11 1394 1
+11 1397 1
+11 1400 1
+11 1403 1
+11 1404 1
+11 1406 1
+11 1409 1
+11 1410 1
+11 1412 1
+11 1413 1
+11 1415 1
+11 1417 1
+11 1420 1
+11 1423 1
+11 1424 1
+11 1426 1
+11 1429 1
+11 1430 1
+11 1432 1
+11 1433 1
+11 1435 1
+11 1436 1
+11 1439 1
+11 1440 1
+11 1442 1
+11 1443 1
+11 1445 1
+11 1446 1
+11 1447 1
+11 1449 1
+11 1450 1
+11 1452 1
+11 1455 1
+11 1458 1
+11 1459 1
+11 1461 1
+11 1464 1
+11 1465 1
+11 1467 1
+11 1468 1
+11 1470 1
+11 1471 1
+11 1474 1
+11 1475 1
+11 1477 1
+11 1478 1
+11 1480 1
+11 1481 1
+11 1482 1
+11 1484 1
+11 1485 1
+11 1486 1
+11 1489 1
+11 1490 1
+11 1492 1
+11 1493 1
+11 1495 1
+11 1496 1
+11 1497 1
+11 1499 1
+11 1500 1
+11 1501 1
+11 1502 1
+11 1504 1
+11 1505 1
+11 1506 1
+11 1509 1
+11 1513 1
+11 1516 1
+11 1519 1
+11 1520 1
+11 1523 1
+11 1526 1
+11 1529 1
+11 1530 1
+11 1532 1
+11 1535 1
+11 1536 1
+11 1538 1
+11 1539 1
+11 1541 1
+11 1543 1
+11 1546 1
+11 1549 1
+11 1550 1
+11 1552 1
+11 1555 1
+11 1556 1
+11 1558 1
+11 1559 1
+11 1561 1
+11 1562 1
+11 1565 1
+11 1566 1
+11 1568 1
+11 1569 1
+11 1571 1
+11 1572 1
+11 1573 1
+11 1575 1
+11 1576 1
+11 1578 1
+11 1581 1
+11 1584 1
+11 1585 1
+11 1587 1
+11 1590 1
+11 1591 1
+11 1593 1
+11 1594 1
+11 1596 1
+11 1597 1
+11 1600 1
+11 1601 1
+11 1603 1
+11 1604 1
+11 1606 1
+11 1607 1
+11 1608 1
+11 1610 1
+11 1611 1
+11 1612 1
+11 1615 1
+11 1616 1
+11 1618 1
+11 1619 1
+11 1621 1
+11 1622 1
+11 1623 1
+11 1625 1
+11 1626 1
+11 1627 1
+11 1628 1
+11 1630 1
+11 1631 1
+11 1632 1
+11 1634 1
+11 1637 1
+11 1640 1
+11 1641 1
+11 1643 1
+11 1646 1
+11 1647 1
+11 1649 1
+11 1650 1
+11 1652 1
+11 1653 1
+11 1656 1
+11 1657 1
+11 1659 1
+11 1660 1
+11 1662 1
+11 1663 1
+11 1664 1
+11 1666 1
+11 1667 1
+11 1668 1
+11 1671 1
+11 1672 1
+11 1674 1
+11 1675 1
+11 1677 1
+11 1678 1
+11 1679 1
+11 1681 1
+11 1682 1
+11 1683 1
+11 1684 1
+11 1686 1
+11 1687 1
+11 1688 1
+11 1689 1
+11 1692 1
+11 1693 1
+11 1695 1
+11 1696 1
+11 1698 1
+11 1699 1
+11 1700 1
+11 1702 1
+11 1703 1
+11 1704 1
+11 1705 1
+11 1707 1
+11 1708 1
+11 1709 1
+11 1710 1
+11 1711 1
+11 1713 1
+11 1714 1
+11 1715 1
+11 1716 1
+12 7 1
+12 14 1
+12 20 1
+12 25 1
+12 29 1
+12 32 1
+12 34 1
+12 36 1
+12 42 1
+12 48 1
+12 53 1
+12 57 1
+12 60 1
+12 62 1
+12 64 1
+12 69 1
+12 74 1
+12 78 1
+12 81 1
+12 83 1
+12 85 1
+12 89 1
+12 93 1
+12 96 1
+12 98 1
+12 100 1
+12 103 1
+12 106 1
+12 108 1
+12 110 1
+12 112 1
+12 114 1
+12 116 1
+12 117 1
+12 119 1
+12 120 1
+12 126 1
+12 132 1
+12 137 1
+12 141 1
+12 144 1
+12 146 1
+12 148 1
+12 153 1
+12 158 1
+12 162 1
+12 165 1
+12 167 1
+12 169 1
+12 173 1
+12 177 1
+12 180 1
+12 182 1
+12 184 1
+12 187 1
+12 190 1
+12 192 1
+12 194 1
+12 196 1
+12 198 1
+12 200 1
+12 201 1
+12 203 1
+12 204 1
+12 209 1
+12 214 1
+12 218 1
+12 221 1
+12 223 1
+12 225 1
+12 229 1
+12 233 1
+12 236 1
+12 238 1
+12 240 1
+12 243 1
+12 246 1
+12 248 1
+12 250 1
+12 252 1
+12 254 1
+12 256 1
+12 257 1
+12 259 1
+12 260 1
+12 264 1
+12 268 1
+12 271 1
+12 273 1
+12 275 1
+12 278 1
+12 281 1
+12 283 1
+12 285 1
+12 287 1
+12 289 1
+12 291 1
+12 292 1
+12 294 1
+12 295 1
+12 298 1
+12 301 1
+12 303 1
+12 305 1
+12 307 1
+12 309 1
+12 311 1
+12 312 1
+12 314 1
+12 315 1
+12 317 1
+12 319 1
+12 321 1
+12 322 1
+12 324 1
+12 325 1
+12 326 1
+12 328 1
+12 329 1
+12 330 1
+12 336 1
+12 342 1
+12 347 1
+12 351 1
+12 354 1
+12 356 1
+12 358 1
+12 363 1
+12 368 1
+12 372 1
+12 375 1
+12 377 1
+12 379 1
+12 383 1
+12 387 1
+12 390 1
+12 392 1
+12 394 1
+12 397 1
+12 400 1
+12 402 1
+12 404 1
+12 406 1
+12 408 1
+12 410 1
+12 411 1
+12 413 1
+12 414 1
+12 419 1
+12 424 1
+12 428 1
+12 431 1
+12 433 1
+12 435 1
+12 439 1
+12 443 1
+12 446 1
+12 448 1
+12 450 1
+12 453 1
+12 456 1
+12 458 1
+12 460 1
+12 462 1
+12 464 1
+12 466 1
+12 467 1
+12 469 1
+12 470 1
+12 474 1
+12 478 1
+12 481 1
+12 483 1
+12 485 1
+12 488 1
+12 491 1
+12 493 1
+12 495 1
+12 497 1
+12 499 1
+12 501 1
+12 502 1
+12 504 1
+12 505 1
+12 508 1
+12 511 1
+12 513 1
+12 515 1
+12 517 1
+12 519 1
+12 521 1
+12 522 1
+12 524 1
+12 525 1
+12 527 1
+12 529 1
+12 531 1
+12 532 1
+12 534 1
+12 535 1
+12 536 1
+12 538 1
+12 539 1
+12 540 1
+12 545 1
+12 550 1
+12 554 1
+12 557 1
+12 559 1
+12 561 1
+12 565 1
+12 569 1
+12 572 1
+12 574 1
+12 576 1
+12 579 1
+12 582 1
+12 584 1
+12 586 1
+12 588 1
+12 590 1
+12 592 1
+12 593 1
+12 595 1
+12 596 1
+12 600 1
+12 604 1
+12 607 1
+12 609 1
+12 611 1
+12 614 1
+12 617 1
+12 619 1
+12 621 1
+12 623 1
+12 625 1
+12 627 1
+12 628 1
+12 630 1
+12 631 1
+12 634 1
+12 637 1
+12 639 1
+12 641 1
+12 643 1
+12 645 1
+12 647 1
+12 648 1
+12 650 1
+12 651 1
+12 653 1
+12 655 1
+12 657 1
+12 658 1
+12 660 1
+12 661 1
+12 662 1
+12 664 1
+12 665 1
+12 666 1
+12 670 1
+12 674 1
+12 677 1
+12 679 1
+12 681 1
+12 684 1
+12 687 1
+12 689 1
+12 691 1
+12 693 1
+12 695 1
+12 697 1
+12 698 1
+12 700 1
+12 701 1
+12 704 1
+12 707 1
+12 709 1
+12 711 1
+12 713 1
+12 715 1
+12 717 1
+12 718 1
+12 720 1
+12 721 1
+12 723 1
+12 725 1
+12 727 1
+12 728 1
+12 730 1
+12 731 1
+12 732 1
+12 734 1
+12 735 1
+12 736 1
+12 739 1
+12 742 1
+12 744 1
+12 746 1
+12 748 1
+12 750 1
+12 752 1
+12 753 1
+12 755 1
+12 756 1
+12 758 1
+12 760 1
+12 762 1
+12 763 1
+12 765 1
+12 766 1
+12 767 1
+12 769 1
+12 770 1
+12 771 1
+12 773 1
+12 775 1
+12 777 1
+12 778 1
+12 780 1
+12 781 1
+12 782 1
+12 784 1
+12 785 1
+12 786 1
+12 787 1
+12 789 1
+12 790 1
+12 791 1
+12 792 1
+12 798 1
+12 804 1
+12 809 1
+12 813 1
+12 816 1
+12 818 1
+12 820 1
+12 825 1
+12 830 1
+12 834 1
+12 837 1
+12 839 1
+12 841 1
+12 845 1
+12 849 1
+12 852 1
+12 854 1
+12 856 1
+12 859 1
+12 862 1
+12 864 1
+12 866 1
+12 868 1
+12 870 1
+12 872 1
+12 873 1
+12 875 1
+12 876 1
+12 881 1
+12 886 1
+12 890 1
+12 893 1
+12 895 1
+12 897 1
+12 901 1
+12 905 1
+12 908 1
+12 910 1
+12 912 1
+12 915 1
+12 918 1
+12 920 1
+12 922 1
+12 924 1
+12 926 1
+12 928 1
+12 929 1
+12 931 1
+12 932 1
+12 936 1
+12 940 1
+12 943 1
+12 945 1
+12 947 1
+12 950 1
+12 953 1
+12 955 1
+12 957 1
+12 959 1
+12 961 1
+12 963 1
+12 964 1
+12 966 1
+12 967 1
+12 970 1
+12 973 1
+12 975 1
+12 977 1
+12 979 1
+12 981 1
+12 983 1
+12 984 1
+12 986 1
+12 987 1
+12 989 1
+12 991 1
+12 993 1
+12 994 1
+12 996 1
+12 997 1
+12 998 1
+12 1000 1
+12 1001 1
+12 1002 1
+12 1007 1
+12 1012 1
+12 1016 1
+12 1019 1
+12 1021 1
+12 1023 1
+12 1027 1
+12 1031 1
+12 1034 1
+12 1036 1
+12 1038 1
+12 1041 1
+12 1044 1
+12 1046 1
+12 1048 1
+12 1050 1
+12 1052 1
+12 1054 1
+12 1055 1
+12 1057 1
+12 1058 1
+12 1062 1
+12 1066 1
+12 1069 1
+12 1071 1
+12 1073 1
+12 1076 1
+12 1079 1
+12 1081 1
+12 1083 1
+12 1085 1
+12 1087 1
+12 1089 1
+12 1090 1
+12 1092 1
+12 1093 1
+12 1096 1
+12 1099 1
+12 1101 1
+12 1103 1
+12 1105 1
+12 1107 1
+12 1109 1
+12 1110 1
+12 1112 1
+12 1113 1
+12 1115 1
+12 1117 1
+12 1119 1
+12 1120 1
+12 1122 1
+12 1123 1
+12 1124 1
+12 1126 1
+12 1127 1
+12 1128 1
+12 1132 1
+12 1136 1
+12 1139 1
+12 1141 1
+12 1143 1
+12 1146 1
+12 1149 1
+12 1151 1
+12 1153 1
+12 1155 1
+12 1157 1
+12 1159 1
+12 1160 1
+12 1162 1
+12 1163 1
+12 1166 1
+12 1169 1
+12 1171 1
+12 1173 1
+12 1175 1
+12 1177 1
+12 1179 1
+12 1180 1
+12 1182 1
+12 1183 1
+12 1185 1
+12 1187 1
+12 1189 1
+12 1190 1
+12 1192 1
+12 1193 1
+12 1194 1
+12 1196 1
+12 1197 1
+12 1198 1
+12 1201 1
+12 1204 1
+12 1206 1
+12 1208 1
+12 1210 1
+12 1212 1
+12 1214 1
+12 1215 1
+12 1217 1
+12 1218 1
+12 1220 1
+12 1222 1
+12 1224 1
+12 1225 1
+12 1227 1
+12 1228 1
+12 1229 1
+12 1231 1
+12 1232 1
+12 1233 1
+12 1235 1
+12 1237 1
+12 1239 1
+12 1240 1
+12 1242 1
+12 1243 1
+12 1244 1
+12 1246 1
+12 1247 1
+12 1248 1
+12 1249 1
+12 1251 1
+12 1252 1
+12 1253 1
+12 1254 1
+12 1259 1
+12 1264 1
+12 1268 1
+12 1271 1
+12 1273 1
+12 1275 1
+12 1279 1
+12 1283 1
+12 1286 1
+12 1288 1
+12 1290 1
+12 1293 1
+12 1296 1
+12 1298 1
+12 1300 1
+12 1302 1
+12 1304 1
+12 1306 1
+12 1307 1
+12 1309 1
+12 1310 1
+12 1314 1
+12 1318 1
+12 1321 1
+12 1323 1
+12 1325 1
+12 1328 1
+12 1331 1
+12 1333 1
+12 1335 1
+12 1337 1
+12 1339 1
+12 1341 1
+12 1342 1
+12 1344 1
+12 1345 1
+12 1348 1
+12 1351 1
+12 1353 1
+12 1355 1
+12 1357 1
+12 1359 1
+12 1361 1
+12 1362 1
+12 1364 1
+12 1365 1
+12 1367 1
+12 1369 1
+12 1371 1
+12 1372 1
+12 1374 1
+12 1375 1
+12 1376 1
+12 1378 1
+12 1379 1
+12 1380 1
+12 1384 1
+12 1388 1
+12 1391 1
+12 1393 1
+12 1395 1
+12 1398 1
+12 1401 1
+12 1403 1
+12 1405 1
+12 1407 1
+12 1409 1
+12 1411 1
+12 1412 1
+12 1414 1
+12 1415 1
+12 1418 1
+12 1421 1
+12 1423 1
+12 1425 1
+12 1427 1
+12 1429 1
+12 1431 1
+12 1432 1
+12 1434 1
+12 1435 1
+12 1437 1
+12 1439 1
+12 1441 1
+12 1442 1
+12 1444 1
+12 1445 1
+12 1446 1
+12 1448 1
+12 1449 1
+12 1450 1
+12 1453 1
+12 1456 1
+12 1458 1
+12 1460 1
+12 1462 1
+12 1464 1
+12 1466 1
+12 1467 1
+12 1469 1
+12 1470 1
+12 1472 1
+12 1474 1
+12 1476 1
+12 1477 1
+12 1479 1
+12 1480 1
+12 1481 1
+12 1483 1
+12 1484 1
+12 1485 1
+12 1487 1
+12 1489 1
+12 1491 1
+12 1492 1
+12 1494 1
+12 1495 1
+12 1496 1
+12 1498 1
+12 1499 1
+12 1500 1
+12 1501 1
+12 1503 1
+12 1504 1
+12 1505 1
+12 1506 1
+12 1510 1
+12 1514 1
+12 1517 1
+12 1519 1
+12 1521 1
+12 1524 1
+12 1527 1
+12 1529 1
+12 1531 1
+12 1533 1
+12 1535 1
+12 1537 1
+12 1538 1
+12 1540 1
+12 1541 1
+12 1544 1
+12 1547 1
+12 1549 1
+12 1551 1
+12 1553 1
+12 1555 1
+12 1557 1
+12 1558 1
+12 1560 1
+12 1561 1
+12 1563 1
+12 1565 1
+12 1567 1
+12 1568 1
+12 1570 1
+12 1571 1
+12 1572 1
+12 1574 1
+12 1575 1
+12 1576 1
+12 1579 1
+12 1582 1
+12 1584 1
+12 1586 1
+12 1588 1
+12 1590 1
+12 1592 1
+12 1593 1
+12 1595 1
+12 1596 1
+12 1598 1
+12 1600 1
+12 1602 1
+12 1603 1
+12 1605 1
+12 1606 1
+12 1607 1
+12 1609 1
+12 1610 1
+12 1611 1
+12 1613 1
+12 1615 1
+12 1617 1
+12 1618 1
+12 1620 1
+12 1621 1
+12 1622 1
+12 1624 1
+12 1625 1
+12 1626 1
+12 1627 1
+12 1629 1
+12 1630 1
+12 1631 1
+12 1632 1
+12 1635 1
+12 1638 1
+12 1640 1
+12 1642 1
+12 1644 1
+12 1646 1
+12 1648 1
+12 1649 1
+12 1651 1
+12 1652 1
+12 1654 1
+12 1656 1
+12 1658 1
+12 1659 1
+12 1661 1
+12 1662 1
+12 1663 1
+12 1665 1
+12 1666 1
+12 1667 1
+12 1669 1
+12 1671 1
+12 1673 1
+12 1674 1
+12 1676 1
+12 1677 1
+12 1678 1
+12 1680 1
+12 1681 1
+12 1682 1
+12 1683 1
+12 1685 1
+12 1686 1
+12 1687 1
+12 1688 1
+12 1690 1
+12 1692 1
+12 1694 1
+12 1695 1
+12 1697 1
+12 1698 1
+12 1699 1
+12 1701 1
+12 1702 1
+12 1703 1
+12 1704 1
+12 1706 1
+12 1707 1
+12 1708 1
+12 1709 1
+12 1710 1
+12 1712 1
+12 1713 1
+12 1714 1
+12 1715 1
+12 1716 1
+13 8 1
+13 15 1
+13 21 1
+13 26 1
+13 30 1
+13 33 1
+13 35 1
+13 36 1
+13 43 1
+13 49 1
+13 54 1
+13 58 1
+13 61 1
+13 63 1
+13 64 1
+13 70 1
+13 75 1
+13 79 1
+13 82 1
+13 84 1
+13 85 1
+13 90 1
+13 94 1
+13 97 1
+13 99 1
+13 100 1
+13 104 1
+13 107 1
+13 109 1
+13 110 1
+13 113 1
+13 115 1
+13 116 1
+13 118 1
+13 119 1
+13 120 1
+13 127 1
+13 133 1
+13 138 1
+13 142 1
+13 145 1
+13 147 1
+13 148 1
+13 154 1
+13 159 1
+13 163 1
+13 166 1
+13 168 1
+13 169 1
+13 174 1
+13 178 1
+13 181 1
+13 183 1
+13 184 1
+13 188 1
+13 191 1
+13 193 1
+13 194 1
+13 197 1
+13 199 1
+13 200 1
+13 202 1
+13 203 1
+13 204 1
+13 210 1
+13 215 1
+13 219 1
+13 222 1
+13 224 1
+13 225 1
+13 230 1
+13 234 1
+13 237 1
+13 239 1
+13 240 1
+13 244 1
+13 247 1
+13 249 1
+13 250 1
+13 253 1
+13 255 1
+13 256 1
+13 258 1
+13 259 1
+13 260 1
+13 265 1
+13 269 1
+13 272 1
+13 274 1
+13 275 1
+13 279 1
+13 282 1
+13 284 1
+13 285 1
+13 288 1
+13 290 1
+13 291 1
+13 293 1
+13 294 1
+13 295 1
+13 299 1
+13 302 1
+13 304 1
+13 305 1
+13 308 1
+13 310 1
+13 311 1
+13 313 1
+13 314 1
+13 315 1
+13 318 1
+13 320 1
+13 321 1
+13 323 1
+13 324 1
+13 325 1
+13 327 1
+13 328 1
+13 329 1
+13 330 1
+13 337 1
+13 343 1
+13 348 1
+13 352 1
+13 355 1
+13 357 1
+13 358 1
+13 364 1
+13 369 1
+13 373 1
+13 376 1
+13 378 1
+13 379 1
+13 384 1
+13 388 1
+13 391 1
+13 393 1
+13 394 1
+13 398 1
+13 401 1
+13 403 1
+13 404 1
+13 407 1
+13 409 1
+13 410 1
+13 412 1
+13 413 1
+13 414 1
+13 420 1
+13 425 1
+13 429 1
+13 432 1
+13 434 1
+13 435 1
+13 440 1
+13 444 1
+13 447 1
+13 449 1
+13 450 1
+13 454 1
+13 457 1
+13 459 1
+13 460 1
+13 463 1
+13 465 1
+13 466 1
+13 468 1
+13 469 1
+13 470 1
+13 475 1
+13 479 1
+13 482 1
+13 484 1
+13 485 1
+13 489 1
+13 492 1
+13 494 1
+13 495 1
+13 498 1
+13 500 1
+13 501 1
+13 503 1
+13 504 1
+13 505 1
+13 509 1
+13 512 1
+13 514 1
+13 515 1
+13 518 1
+13 520 1
+13 521 1
+13 523 1
+13 524 1
+13 525 1
+13 528 1
+13 530 1
+13 531 1
+13 533 1
+13 534 1
+13 535 1
+13 537 1
+13 538 1
+13 539 1
+13 540 1
+13 546 1
+13 551 1
+13 555 1
+13 558 1
+13 560 1
+13 561 1
+13 566 1
+13 570 1
+13 573 1
+13 575 1
+13 576 1
+13 580 1
+13 583 1
+13 585 1
+13 586 1
+13 589 1
+13 591 1
+13 592 1
+13 594 1
+13 595 1
+13 596 1
+13 601 1
+13 605 1
+13 608 1
+13 610 1
+13 611 1
+13 615 1
+13 618 1
+13 620 1
+13 621 1
+13 624 1
+13 626 1
+13 627 1
+13 629 1
+13 630 1
+13 631 1
+13 635 1
+13 638 1
+13 640 1
+13 641 1
+13 644 1
+13 646 1
+13 647 1
+13 649 1
+13 650 1
+13 651 1
+13 654 1
+13 656 1
+13 657 1
+13 659 1
+13 660 1
+13 661 1
+13 663 1
+13 664 1
+13 665 1
+13 666 1
+13 671 1
+13 675 1
+13 678 1
+13 680 1
+13 681 1
+13 685 1
+13 688 1
+13 690 1
+13 691 1
+13 694 1
+13 696 1
+13 697 1
+13 699 1
+13 700 1
+13 701 1
+13 705 1
+13 708 1
+13 710 1
+13 711 1
+13 714 1
+13 716 1
+13 717 1
+13 719 1
+13 720 1
+13 721 1
+13 724 1
+13 726 1
+13 727 1
+13 729 1
+13 730 1
+13 731 1
+13 733 1
+13 734 1
+13 735 1
+13 736 1
+13 740 1
+13 743 1
+13 745 1
+13 746 1
+13 749 1
+13 751 1
+13 752 1
+13 754 1
+13 755 1
+13 756 1
+13 759 1
+13 761 1
+13 762 1
+13 764 1
+13 765 1
+13 766 1
+13 768 1
+13 769 1
+13 770 1
+13 771 1
+13 774 1
+13 776 1
+13 777 1
+13 779 1
+13 780 1
+13 781 1
+13 783 1
+13 784 1
+13 785 1
+13 786 1
+13 788 1
+13 789 1
+13 790 1
+13 791 1
+13 792 1
+13 799 1
+13 805 1
+13 810 1
+13 814 1
+13 817 1
+13 819 1
+13 820 1
+13 826 1
+13 831 1
+13 835 1
+13 838 1
+13 840 1
+13 841 1
+13 846 1
+13 850 1
+13 853 1
+13 855 1
+13 856 1
+13 860 1
+13 863 1
+13 865 1
+13 866 1
+13 869 1
+13 871 1
+13 872 1
+13 874 1
+13 875 1
+13 876 1
+13 882 1
+13 887 1
+13 891 1
+13 894 1
+13 896 1
+13 897 1
+13 902 1
+13 906 1
+13 909 1
+13 911 1
+13 912 1
+13 916 1
+13 919 1
+13 921 1
+13 922 1
+13 925 1
+13 927 1
+13 928 1
+13 930 1
+13 931 1
+13 932 1
+13 937 1
+13 941 1
+13 944 1
+13 946 1
+13 947 1
+13 951 1
+13 954 1
+13 956 1
+13 957 1
+13 960 1
+13 962 1
+13 963 1
+13 965 1
+13 966 1
+13 967 1
+13 971 1
+13 974 1
+13 976 1
+13 977 1
+13 980 1
+13 982 1
+13 983 1
+13 985 1
+13 986 1
+13 987 1
+13 990 1
+13 992 1
+13 993 1
+13 995 1
+13 996 1
+13 997 1
+13 999 1
+13 1000 1
+13 1001 1
+13 1002 1
+13 1008 1
+13 1013 1
+13 1017 1
+13 1020 1
+13 1022 1
+13 1023 1
+13 1028 1
+13 1032 1
+13 1035 1
+13 1037 1
+13 1038 1
+13 1042 1
+13 1045 1
+13 1047 1
+13 1048 1
+13 1051 1
+13 1053 1
+13 1054 1
+13 1056 1
+13 1057 1
+13 1058 1
+13 1063 1
+13 1067 1
+13 1070 1
+13 1072 1
+13 1073 1
+13 1077 1
+13 1080 1
+13 1082 1
+13 1083 1
+13 1086 1
+13 1088 1
+13 1089 1
+13 1091 1
+13 1092 1
+13 1093 1
+13 1097 1
+13 1100 1
+13 1102 1
+13 1103 1
+13 1106 1
+13 1108 1
+13 1109 1
+13 1111 1
+13 1112 1
+13 1113 1
+13 1116 1
+13 1118 1
+13 1119 1
+13 1121 1
+13 1122 1
+13 1123 1
+13 1125 1
+13 1126 1
+13 1127 1
+13 1128 1
+13 1133 1
+13 1137 1
+13 1140 1
+13 1142 1
+13 1143 1
+13 1147 1
+13 1150 1
+13 1152 1
+13 1153 1
+13 1156 1
+13 1158 1
+13 1159 1
+13 1161 1
+13 1162 1
+13 1163 1
+13 1167 1
+13 1170 1
+13 1172 1
+13 1173 1
+13 1176 1
+13 1178 1
+13 1179 1
+13 1181 1
+13 1182 1
+13 1183 1
+13 1186 1
+13 1188 1
+13 1189 1
+13 1191 1
+13 1192 1
+13 1193 1
+13 1195 1
+13 1196 1
+13 1197 1
+13 1198 1
+13 1202 1
+13 1205 1
+13 1207 1
+13 1208 1
+13 1211 1
+13 1213 1
+13 1214 1
+13 1216 1
+13 1217 1
+13 1218 1
+13 1221 1
+13 1223 1
+13 1224 1
+13 1226 1
+13 1227 1
+13 1228 1
+13 1230 1
+13 1231 1
+13 1232 1
+13 1233 1
+13 1236 1
+13 1238 1
+13 1239 1
+13 1241 1
+13 1242 1
+13 1243 1
+13 1245 1
+13 1246 1
+13 1247 1
+13 1248 1
+13 1250 1
+13 1251 1
+13 1252 1
+13 1253 1
+13 1254 1
+13 1260 1
+13 1265 1
+13 1269 1
+13 1272 1
+13 1274 1
+13 1275 1
+13 1280 1
+13 1284 1
+13 1287 1
+13 1289 1
+13 1290 1
+13 1294 1
+13 1297 1
+13 1299 1
+13 1300 1
+13 1303 1
+13 1305 1
+13 1306 1
+13 1308 1
+13 1309 1
+13 1310 1
+13 1315 1
+13 1319 1
+13 1322 1
+13 1324 1
+13 1325 1
+13 1329 1
+13 1332 1
+13 1334 1
+13 1335 1
+13 1338 1
+13 1340 1
+13 1341 1
+13 1343 1
+13 1344 1
+13 1345 1
+13 1349 1
+13 1352 1
+13 1354 1
+13 1355 1
+13 1358 1
+13 1360 1
+13 1361 1
+13 1363 1
+13 1364 1
+13 1365 1
+13 1368 1
+13 1370 1
+13 1371 1
+13 1373 1
+13 1374 1
+13 1375 1
+13 1377 1
+13 1378 1
+13 1379 1
+13 1380 1
+13 1385 1
+13 1389 1
+13 1392 1
+13 1394 1
+13 1395 1
+13 1399 1
+13 1402 1
+13 1404 1
+13 1405 1
+13 1408 1
+13 1410 1
+13 1411 1
+13 1413 1
+13 1414 1
+13 1415 1
+13 1419 1
+13 1422 1
+13 1424 1
+13 1425 1
+13 1428 1
+13 1430 1
+13 1431 1
+13 1433 1
+13 1434 1
+13 1435 1
+13 1438 1
+13 1440 1
+13 1441 1
+13 1443 1
+13 1444 1
+13 1445 1
+13 1447 1
+13 1448 1
+13 1449 1
+13 1450 1
+13 1454 1
+13 1457 1
+13 1459 1
+13 1460 1
+13 1463 1
+13 1465 1
+13 1466 1
+13 1468 1
+13 1469 1
+13 1470 1
+13 1473 1
+13 1475 1
+13 1476 1
+13 1478 1
+13 1479 1
+13 1480 1
+13 1482 1
+13 1483 1
+13 1484 1
+13 1485 1
+13 1488 1
+13 1490 1
+13 1491 1
+13 1493 1
+13 1494 1
+13 1495 1
+13 1497 1
+13 1498 1
+13 1499 1
+13 1500 1
+13 1502 1
+13 1503 1
+13 1504 1
+13 1505 1
+13 1506 1
+13 1511 1
+13 1515 1
+13 1518 1
+13 1520 1
+13 1521 1
+13 1525 1
+13 1528 1
+13 1530 1
+13 1531 1
+13 1534 1
+13 1536 1
+13 1537 1
+13 1539 1
+13 1540 1
+13 1541 1
+13 1545 1
+13 1548 1
+13 1550 1
+13 1551 1
+13 1554 1
+13 1556 1
+13 1557 1
+13 1559 1
+13 1560 1
+13 1561 1
+13 1564 1
+13 1566 1
+13 1567 1
+13 1569 1
+13 1570 1
+13 1571 1
+13 1573 1
+13 1574 1
+13 1575 1
+13 1576 1
+13 1580 1
+13 1583 1
+13 1585 1
+13 1586 1
+13 1589 1
+13 1591 1
+13 1592 1
+13 1594 1
+13 1595 1
+13 1596 1
+13 1599 1
+13 1601 1
+13 1602 1
+13 1604 1
+13 1605 1
+13 1606 1
+13 1608 1
+13 1609 1
+13 1610 1
+13 1611 1
+13 1614 1
+13 1616 1
+13 1617 1
+13 1619 1
+13 1620 1
+13 1621 1
+13 1623 1
+13 1624 1
+13 1625 1
+13 1626 1
+13 1628 1
+13 1629 1
+13 1630 1
+13 1631 1
+13 1632 1
+13 1636 1
+13 1639 1
+13 1641 1
+13 1642 1
+13 1645 1
+13 1647 1
+13 1648 1
+13 1650 1
+13 1651 1
+13 1652 1
+13 1655 1
+13 1657 1
+13 1658 1
+13 1660 1
+13 1661 1
+13 1662 1
+13 1664 1
+13 1665 1
+13 1666 1
+13 1667 1
+13 1670 1
+13 1672 1
+13 1673 1
+13 1675 1
+13 1676 1
+13 1677 1
+13 1679 1
+13 1680 1
+13 1681 1
+13 1682 1
+13 1684 1
+13 1685 1
+13 1686 1
+13 1687 1
+13 1688 1
+13 1691 1
+13 1693 1
+13 1694 1
+13 1696 1
+13 1697 1
+13 1698 1
+13 1700 1
+13 1701 1
+13 1702 1
+13 1703 1
+13 1705 1
+13 1706 1
+13 1707 1
+13 1708 1
+13 1709 1
+13 1711 1
+13 1712 1
+13 1713 1
+13 1714 1
+13 1715 1
+13 1716 1
+14 1 1
+14 2 1
+14 3 1
+14 4 1
+14 5 1
+14 6 1
+14 7 1
+14 8 1
+14 9 1
+14 10 1
+14 11 1
+14 12 1
+14 13 1
+14 14 1
+14 15 1
+14 16 1
+14 17 1
+14 18 1
+14 19 1
+14 20 1
+14 21 1
+14 22 1
+14 23 1
+14 24 1
+14 25 1
+14 26 1
+14 27 1
+14 28 1
+14 29 1
+14 30 1
+14 31 1
+14 32 1
+14 33 1
+14 34 1
+14 35 1
+14 36 1
+14 37 1
+14 38 1
+14 39 1
+14 40 1
+14 41 1
+14 42 1
+14 43 1
+14 44 1
+14 45 1
+14 46 1
+14 47 1
+14 48 1
+14 49 1
+14 50 1
+14 51 1
+14 52 1
+14 53 1
+14 54 1
+14 55 1
+14 56 1
+14 57 1
+14 58 1
+14 59 1
+14 60 1
+14 61 1
+14 62 1
+14 63 1
+14 64 1
+14 65 1
+14 66 1
+14 67 1
+14 68 1
+14 69 1
+14 70 1
+14 71 1
+14 72 1
+14 73 1
+14 74 1
+14 75 1
+14 76 1
+14 77 1
+14 78 1
+14 79 1
+14 80 1
+14 81 1
+14 82 1
+14 83 1
+14 84 1
+14 85 1
+14 86 1
+14 87 1
+14 88 1
+14 89 1
+14 90 1
+14 91 1
+14 92 1
+14 93 1
+14 94 1
+14 95 1
+14 96 1
+14 97 1
+14 98 1
+14 99 1
+14 100 1
+14 101 1
+14 102 1
+14 103 1
+14 104 1
+14 105 1
+14 106 1
+14 107 1
+14 108 1
+14 109 1
+14 110 1
+14 111 1
+14 112 1
+14 113 1
+14 114 1
+14 115 1
+14 116 1
+14 117 1
+14 118 1
+14 119 1
+14 120 1
+14 121 1
+14 122 1
+14 123 1
+14 124 1
+14 125 1
+14 126 1
+14 127 1
+14 128 1
+14 129 1
+14 130 1
+14 131 1
+14 132 1
+14 133 1
+14 134 1
+14 135 1
+14 136 1
+14 137 1
+14 138 1
+14 139 1
+14 140 1
+14 141 1
+14 142 1
+14 143 1
+14 144 1
+14 145 1
+14 146 1
+14 147 1
+14 148 1
+14 149 1
+14 150 1
+14 151 1
+14 152 1
+14 153 1
+14 154 1
+14 155 1
+14 156 1
+14 157 1
+14 158 1
+14 159 1
+14 160 1
+14 161 1
+14 162 1
+14 163 1
+14 164 1
+14 165 1
+14 166 1
+14 167 1
+14 168 1
+14 169 1
+14 170 1
+14 171 1
+14 172 1
+14 173 1
+14 174 1
+14 175 1
+14 176 1
+14 177 1
+14 178 1
+14 179 1
+14 180 1
+14 181 1
+14 182 1
+14 183 1
+14 184 1
+14 185 1
+14 186 1
+14 187 1
+14 188 1
+14 189 1
+14 190 1
+14 191 1
+14 192 1
+14 193 1
+14 194 1
+14 195 1
+14 196 1
+14 197 1
+14 198 1
+14 199 1
+14 200 1
+14 201 1
+14 202 1
+14 203 1
+14 204 1
+14 205 1
+14 206 1
+14 207 1
+14 208 1
+14 209 1
+14 210 1
+14 211 1
+14 212 1
+14 213 1
+14 214 1
+14 215 1
+14 216 1
+14 217 1
+14 218 1
+14 219 1
+14 220 1
+14 221 1
+14 222 1
+14 223 1
+14 224 1
+14 225 1
+14 226 1
+14 227 1
+14 228 1
+14 229 1
+14 230 1
+14 231 1
+14 232 1
+14 233 1
+14 234 1
+14 235 1
+14 236 1
+14 237 1
+14 238 1
+14 239 1
+14 240 1
+14 241 1
+14 242 1
+14 243 1
+14 244 1
+14 245 1
+14 246 1
+14 247 1
+14 248 1
+14 249 1
+14 250 1
+14 251 1
+14 252 1
+14 253 1
+14 254 1
+14 255 1
+14 256 1
+14 257 1
+14 258 1
+14 259 1
+14 260 1
+14 261 1
+14 262 1
+14 263 1
+14 264 1
+14 265 1
+14 266 1
+14 267 1
+14 268 1
+14 269 1
+14 270 1
+14 271 1
+14 272 1
+14 273 1
+14 274 1
+14 275 1
+14 276 1
+14 277 1
+14 278 1
+14 279 1
+14 280 1
+14 281 1
+14 282 1
+14 283 1
+14 284 1
+14 285 1
+14 286 1
+14 287 1
+14 288 1
+14 289 1
+14 290 1
+14 291 1
+14 292 1
+14 293 1
+14 294 1
+14 295 1
+14 296 1
+14 297 1
+14 298 1
+14 299 1
+14 300 1
+14 301 1
+14 302 1
+14 303 1
+14 304 1
+14 305 1
+14 306 1
+14 307 1
+14 308 1
+14 309 1
+14 310 1
+14 311 1
+14 312 1
+14 313 1
+14 314 1
+14 315 1
+14 316 1
+14 317 1
+14 318 1
+14 319 1
+14 320 1
+14 321 1
+14 322 1
+14 323 1
+14 324 1
+14 325 1
+14 326 1
+14 327 1
+14 328 1
+14 329 1
+14 330 1
+14 1717 1
+14 1718 1
+14 1719 1
+14 1720 1
+14 1721 1
+14 1722 1
+14 1723 1
+14 1724 1
+14 1725 1
+14 1726 1
+14 1727 1
+14 1728 1
+14 1729 1
+14 1730 1
+14 1731 1
+14 1732 1
+14 1733 1
+14 1734 1
+14 1735 1
+14 1736 1
+14 1737 1
+14 1738 1
+14 1739 1
+14 1740 1
+14 1741 1
+14 1742 1
+14 1743 1
+14 1744 1
+14 1745 1
+14 1746 1
+14 1747 1
+14 1748 1
+14 1749 1
+14 1750 1
+14 1751 1
+14 1752 1
+14 1753 1
+14 1754 1
+14 1755 1
+14 1756 1
+14 1757 1
+14 1758 1
+14 1759 1
+14 1760 1
+14 1761 1
+14 1762 1
+14 1763 1
+14 1764 1
+14 1765 1
+14 1766 1
+14 1767 1
+14 1768 1
+14 1769 1
+14 1770 1
+14 1771 1
+14 1772 1
+14 1773 1
+14 1774 1
+14 1775 1
+14 1776 1
+14 1777 1
+14 1778 1
+14 1779 1
+14 1780 1
+14 1781 1
+14 1782 1
+14 1783 1
+14 1784 1
+14 1785 1
+14 1786 1
+14 1787 1
+14 1788 1
+14 1789 1
+14 1790 1
+14 1791 1
+14 1792 1
+14 1793 1
+14 1794 1
+14 1795 1
+14 1796 1
+14 1797 1
+14 1798 1
+14 1799 1
+14 1800 1
+14 1801 1
+14 1802 1
+14 1803 1
+14 1804 1
+14 1805 1
+14 1806 1
+14 1807 1
+14 1808 1
+14 1809 1
+14 1810 1
+14 1811 1
+14 1812 1
+14 1813 1
+14 1814 1
+14 1815 1
+14 1816 1
+14 1817 1
+14 1818 1
+14 1819 1
+14 1820 1
+14 1821 1
+14 1822 1
+14 1823 1
+14 1824 1
+14 1825 1
+14 1826 1
+14 1827 1
+14 1828 1
+14 1829 1
+14 1830 1
+14 1831 1
+14 1832 1
+14 1833 1
+14 1834 1
+14 1835 1
+14 1836 1
+14 1837 1
+14 1838 1
+14 1839 1
+14 1840 1
+14 1841 1
+14 1842 1
+14 1843 1
+14 1844 1
+14 1845 1
+14 1846 1
+14 1847 1
+14 1848 1
+14 1849 1
+14 1850 1
+14 1851 1
+14 1852 1
+14 1853 1
+14 1854 1
+14 1855 1
+14 1856 1
+14 1857 1
+14 1858 1
+14 1859 1
+14 1860 1
+14 1861 1
+14 1862 1
+14 1863 1
+14 1864 1
+14 1865 1
+14 1866 1
+14 1867 1
+14 1868 1
+14 1869 1
+14 1870 1
+14 1871 1
+14 1872 1
+14 1873 1
+14 1874 1
+14 1875 1
+14 1876 1
+14 1877 1
+14 1878 1
+14 1879 1
+14 1880 1
+14 1881 1
+14 1882 1
+14 1883 1
+14 1884 1
+14 1885 1
+14 1886 1
+14 1887 1
+14 1888 1
+14 1889 1
+14 1890 1
+14 1891 1
+14 1892 1
+14 1893 1
+14 1894 1
+14 1895 1
+14 1896 1
+14 1897 1
+14 1898 1
+14 1899 1
+14 1900 1
+14 1901 1
+14 1902 1
+14 1903 1
+14 1904 1
+14 1905 1
+14 1906 1
+14 1907 1
+14 1908 1
+14 1909 1
+14 1910 1
+14 1911 1
+14 1912 1
+14 1913 1
+14 1914 1
+14 1915 1
+14 1916 1
+14 1917 1
+14 1918 1
+14 1919 1
+14 1920 1
+14 1921 1
+14 1922 1
+14 1923 1
+14 1924 1
+14 1925 1
+14 1926 1
+14 1927 1
+14 1928 1
+14 1929 1
+14 1930 1
+14 1931 1
+14 1932 1
+14 1933 1
+14 1934 1
+14 1935 1
+14 1936 1
+14 1937 1
+14 1938 1
+14 1939 1
+14 1940 1
+14 1941 1
+14 1942 1
+14 1943 1
+14 1944 1
+14 1945 1
+14 1946 1
+14 1947 1
+14 1948 1
+14 1949 1
+14 1950 1
+14 1951 1
+14 1952 1
+14 1953 1
+14 1954 1
+14 1955 1
+14 1956 1
+14 1957 1
+14 1958 1
+14 1959 1
+14 1960 1
+14 1961 1
+14 1962 1
+14 1963 1
+14 1964 1
+14 1965 1
+14 1966 1
+14 1967 1
+14 1968 1
+14 1969 1
+14 1970 1
+14 1971 1
+14 1972 1
+14 1973 1
+14 1974 1
+14 1975 1
+14 1976 1
+14 1977 1
+14 1978 1
+14 1979 1
+14 1980 1
+14 1981 1
+14 1982 1
+14 1983 1
+14 1984 1
+14 1985 1
+14 1986 1
+14 1987 1
+14 1988 1
+14 1989 1
+14 1990 1
+14 1991 1
+14 1992 1
+14 1993 1
+14 1994 1
+14 1995 1
+14 1996 1
+14 1997 1
+14 1998 1
+14 1999 1
+14 2000 1
+14 2001 1
+14 2002 1
+14 2003 1
+14 2004 1
+14 2005 1
+14 2006 1
+14 2007 1
+14 2008 1
+14 2009 1
+14 2010 1
+14 2011 1
+14 2012 1
+14 2013 1
+14 2014 1
+14 2015 1
+14 2016 1
+14 2017 1
+14 2018 1
+14 2019 1
+14 2020 1
+14 2021 1
+14 2022 1
+14 2023 1
+14 2024 1
+14 2025 1
+14 2026 1
+14 2027 1
+14 2028 1
+14 2029 1
+14 2030 1
+14 2031 1
+14 2032 1
+14 2033 1
+14 2034 1
+14 2035 1
+14 2036 1
+14 2037 1
+14 2038 1
+14 2039 1
+14 2040 1
+14 2041 1
+14 2042 1
+14 2043 1
+14 2044 1
+14 2045 1
+14 2046 1
+14 2047 1
+14 2048 1
+14 2049 1
+14 2050 1
+14 2051 1
+14 2052 1
+14 2053 1
+14 2054 1
+14 2055 1
+14 2056 1
+14 2057 1
+14 2058 1
+14 2059 1
+14 2060 1
+14 2061 1
+14 2062 1
+14 2063 1
+14 2064 1
+14 2065 1
+14 2066 1
+14 2067 1
+14 2068 1
+14 2069 1
+14 2070 1
+14 2071 1
+14 2072 1
+14 2073 1
+14 2074 1
+14 2075 1
+14 2076 1
+14 2077 1
+14 2078 1
+14 2079 1
+14 2080 1
+14 2081 1
+14 2082 1
+14 2083 1
+14 2084 1
+14 2085 1
+14 2086 1
+14 2087 1
+14 2088 1
+14 2089 1
+14 2090 1
+14 2091 1
+14 2092 1
+14 2093 1
+14 2094 1
+14 2095 1
+14 2096 1
+14 2097 1
+14 2098 1
+14 2099 1
+14 2100 1
+14 2101 1
+14 2102 1
+14 2103 1
+14 2104 1
+14 2105 1
+14 2106 1
+14 2107 1
+14 2108 1
+14 2109 1
+14 2110 1
+14 2111 1
+14 2112 1
+14 2113 1
+14 2114 1
+14 2115 1
+14 2116 1
+14 2117 1
+14 2118 1
+14 2119 1
+14 2120 1
+14 2121 1
+14 2122 1
+14 2123 1
+14 2124 1
+14 2125 1
+14 2126 1
+14 2127 1
+14 2128 1
+14 2129 1
+14 2130 1
+14 2131 1
+14 2132 1
+14 2133 1
+14 2134 1
+14 2135 1
+14 2136 1
+14 2137 1
+14 2138 1
+14 2139 1
+14 2140 1
+14 2141 1
+14 2142 1
+14 2143 1
+14 2144 1
+14 2145 1
+14 2146 1
+14 2147 1
+14 2148 1
+14 2149 1
+14 2150 1
+14 2151 1
+14 2152 1
+14 2153 1
+14 2154 1
+14 2155 1
+14 2156 1
+14 2157 1
+14 2158 1
+14 2159 1
+14 2160 1
+14 2161 1
+14 2162 1
+14 2163 1
+14 2164 1
+14 2165 1
+14 2166 1
+14 2167 1
+14 2168 1
+14 2169 1
+14 2170 1
+14 2171 1
+14 2172 1
+14 2173 1
+14 2174 1
+14 2175 1
+14 2176 1
+14 2177 1
+14 2178 1
+15 1 1
+15 2 1
+15 3 1
+15 4 1
+15 5 1
+15 6 1
+15 7 1
+15 8 1
+15 9 1
+15 10 1
+15 11 1
+15 12 1
+15 13 1
+15 14 1
+15 15 1
+15 16 1
+15 17 1
+15 18 1
+15 19 1
+15 20 1
+15 21 1
+15 22 1
+15 23 1
+15 24 1
+15 25 1
+15 26 1
+15 27 1
+15 28 1
+15 29 1
+15 30 1
+15 31 1
+15 32 1
+15 33 1
+15 34 1
+15 35 1
+15 36 1
+15 37 1
+15 38 1
+15 39 1
+15 40 1
+15 41 1
+15 42 1
+15 43 1
+15 44 1
+15 45 1
+15 46 1
+15 47 1
+15 48 1
+15 49 1
+15 50 1
+15 51 1
+15 52 1
+15 53 1
+15 54 1
+15 55 1
+15 56 1
+15 57 1
+15 58 1
+15 59 1
+15 60 1
+15 61 1
+15 62 1
+15 63 1
+15 64 1
+15 65 1
+15 66 1
+15 67 1
+15 68 1
+15 69 1
+15 70 1
+15 71 1
+15 72 1
+15 73 1
+15 74 1
+15 75 1
+15 76 1
+15 77 1
+15 78 1
+15 79 1
+15 80 1
+15 81 1
+15 82 1
+15 83 1
+15 84 1
+15 85 1
+15 86 1
+15 87 1
+15 88 1
+15 89 1
+15 90 1
+15 91 1
+15 92 1
+15 93 1
+15 94 1
+15 95 1
+15 96 1
+15 97 1
+15 98 1
+15 99 1
+15 100 1
+15 101 1
+15 102 1
+15 103 1
+15 104 1
+15 105 1
+15 106 1
+15 107 1
+15 108 1
+15 109 1
+15 110 1
+15 111 1
+15 112 1
+15 113 1
+15 114 1
+15 115 1
+15 116 1
+15 117 1
+15 118 1
+15 119 1
+15 120 1
+15 331 1
+15 332 1
+15 333 1
+15 334 1
+15 335 1
+15 336 1
+15 337 1
+15 338 1
+15 339 1
+15 340 1
+15 341 1
+15 342 1
+15 343 1
+15 344 1
+15 345 1
+15 346 1
+15 347 1
+15 348 1
+15 349 1
+15 350 1
+15 351 1
+15 352 1
+15 353 1
+15 354 1
+15 355 1
+15 356 1
+15 357 1
+15 358 1
+15 359 1
+15 360 1
+15 361 1
+15 362 1
+15 363 1
+15 364 1
+15 365 1
+15 366 1
+15 367 1
+15 368 1
+15 369 1
+15 370 1
+15 371 1
+15 372 1
+15 373 1
+15 374 1
+15 375 1
+15 376 1
+15 377 1
+15 378 1
+15 379 1
+15 380 1
+15 381 1
+15 382 1
+15 383 1
+15 384 1
+15 385 1
+15 386 1
+15 387 1
+15 388 1
+15 389 1
+15 390 1
+15 391 1
+15 392 1
+15 393 1
+15 394 1
+15 395 1
+15 396 1
+15 397 1
+15 398 1
+15 399 1
+15 400 1
+15 401 1
+15 402 1
+15 403 1
+15 404 1
+15 405 1
+15 406 1
+15 407 1
+15 408 1
+15 409 1
+15 410 1
+15 411 1
+15 412 1
+15 413 1
+15 414 1
+15 415 1
+15 416 1
+15 417 1
+15 418 1
+15 419 1
+15 420 1
+15 421 1
+15 422 1
+15 423 1
+15 424 1
+15 425 1
+15 426 1
+15 427 1
+15 428 1
+15 429 1
+15 430 1
+15 431 1
+15 432 1
+15 433 1
+15 434 1
+15 435 1
+15 436 1
+15 437 1
+15 438 1
+15 439 1
+15 440 1
+15 441 1
+15 442 1
+15 443 1
+15 444 1
+15 445 1
+15 446 1
+15 447 1
+15 448 1
+15 449 1
+15 450 1
+15 451 1
+15 452 1
+15 453 1
+15 454 1
+15 455 1
+15 456 1
+15 457 1
+15 458 1
+15 459 1
+15 460 1
+15 461 1
+15 462 1
+15 463 1
+15 464 1
+15 465 1
+15 466 1
+15 467 1
+15 468 1
+15 469 1
+15 470 1
+15 471 1
+15 472 1
+15 473 1
+15 474 1
+15 475 1
+15 476 1
+15 477 1
+15 478 1
+15 479 1
+15 480 1
+15 481 1
+15 482 1
+15 483 1
+15 484 1
+15 485 1
+15 486 1
+15 487 1
+15 488 1
+15 489 1
+15 490 1
+15 491 1
+15 492 1
+15 493 1
+15 494 1
+15 495 1
+15 496 1
+15 497 1
+15 498 1
+15 499 1
+15 500 1
+15 501 1
+15 502 1
+15 503 1
+15 504 1
+15 505 1
+15 506 1
+15 507 1
+15 508 1
+15 509 1
+15 510 1
+15 511 1
+15 512 1
+15 513 1
+15 514 1
+15 515 1
+15 516 1
+15 517 1
+15 518 1
+15 519 1
+15 520 1
+15 521 1
+15 522 1
+15 523 1
+15 524 1
+15 525 1
+15 526 1
+15 527 1
+15 528 1
+15 529 1
+15 530 1
+15 531 1
+15 532 1
+15 533 1
+15 534 1
+15 535 1
+15 536 1
+15 537 1
+15 538 1
+15 539 1
+15 540 1
+15 1717 1
+15 1718 1
+15 1719 1
+15 1720 1
+15 1721 1
+15 1722 1
+15 1723 1
+15 1724 1
+15 1725 1
+15 1726 1
+15 1727 1
+15 1728 1
+15 1729 1
+15 1730 1
+15 1731 1
+15 1732 1
+15 1733 1
+15 1734 1
+15 1735 1
+15 1736 1
+15 1737 1
+15 1738 1
+15 1739 1
+15 1740 1
+15 1741 1
+15 1742 1
+15 1743 1
+15 1744 1
+15 1745 1
+15 1746 1
+15 1747 1
+15 1748 1
+15 1749 1
+15 1750 1
+15 1751 1
+15 1752 1
+15 1753 1
+15 1754 1
+15 1755 1
+15 1756 1
+15 1757 1
+15 1758 1
+15 1759 1
+15 1760 1
+15 1761 1
+15 1762 1
+15 1763 1
+15 1764 1
+15 1765 1
+15 1766 1
+15 1767 1
+15 1768 1
+15 1769 1
+15 1770 1
+15 1771 1
+15 1772 1
+15 1773 1
+15 1774 1
+15 1775 1
+15 1776 1
+15 1777 1
+15 1778 1
+15 1779 1
+15 1780 1
+15 1781 1
+15 1782 1
+15 1783 1
+15 1784 1
+15 1785 1
+15 1786 1
+15 1787 1
+15 1788 1
+15 1789 1
+15 1790 1
+15 1791 1
+15 1792 1
+15 1793 1
+15 1794 1
+15 1795 1
+15 1796 1
+15 1797 1
+15 1798 1
+15 1799 1
+15 1800 1
+15 1801 1
+15 1802 1
+15 1803 1
+15 1804 1
+15 1805 1
+15 1806 1
+15 1807 1
+15 1808 1
+15 1809 1
+15 1810 1
+15 1811 1
+15 1812 1
+15 1813 1
+15 1814 1
+15 1815 1
+15 1816 1
+15 1817 1
+15 1818 1
+15 1819 1
+15 1820 1
+15 1821 1
+15 1822 1
+15 1823 1
+15 1824 1
+15 1825 1
+15 1826 1
+15 1827 1
+15 1828 1
+15 1829 1
+15 1830 1
+15 1831 1
+15 1832 1
+15 1833 1
+15 1834 1
+15 1835 1
+15 1836 1
+15 1837 1
+15 1838 1
+15 1839 1
+15 1840 1
+15 1841 1
+15 1842 1
+15 1843 1
+15 1844 1
+15 1845 1
+15 1846 1
+15 1847 1
+15 1848 1
+15 1849 1
+15 1850 1
+15 1851 1
+15 1852 1
+15 1853 1
+15 1854 1
+15 1855 1
+15 1856 1
+15 1857 1
+15 1858 1
+15 1859 1
+15 1860 1
+15 1861 1
+15 1862 1
+15 1863 1
+15 1864 1
+15 1865 1
+15 1866 1
+15 1867 1
+15 1868 1
+15 1869 1
+15 1870 1
+15 1871 1
+15 1872 1
+15 1873 1
+15 1874 1
+15 1875 1
+15 1876 1
+15 1877 1
+15 1878 1
+15 1879 1
+15 1880 1
+15 1881 1
+15 1882 1
+15 1883 1
+15 1884 1
+15 1885 1
+15 1886 1
+15 1887 1
+15 1888 1
+15 1889 1
+15 1890 1
+15 1891 1
+15 1892 1
+15 1893 1
+15 1894 1
+15 1895 1
+15 1896 1
+15 1897 1
+15 1898 1
+15 1899 1
+15 1900 1
+15 1901 1
+15 1902 1
+15 1903 1
+15 1904 1
+15 1905 1
+15 1906 1
+15 1907 1
+15 1908 1
+15 1909 1
+15 1910 1
+15 1911 1
+15 1912 1
+15 1913 1
+15 1914 1
+15 1915 1
+15 1916 1
+15 1917 1
+15 1918 1
+15 1919 1
+15 1920 1
+15 1921 1
+15 1922 1
+15 1923 1
+15 1924 1
+15 1925 1
+15 1926 1
+15 2179 1
+15 2180 1
+15 2181 1
+15 2182 1
+15 2183 1
+15 2184 1
+15 2185 1
+15 2186 1
+15 2187 1
+15 2188 1
+15 2189 1
+15 2190 1
+15 2191 1
+15 2192 1
+15 2193 1
+15 2194 1
+15 2195 1
+15 2196 1
+15 2197 1
+15 2198 1
+15 2199 1
+15 2200 1
+15 2201 1
+15 2202 1
+15 2203 1
+15 2204 1
+15 2205 1
+15 2206 1
+15 2207 1
+15 2208 1
+15 2209 1
+15 2210 1
+15 2211 1
+15 2212 1
+15 2213 1
+15 2214 1
+15 2215 1
+15 2216 1
+15 2217 1
+15 2218 1
+15 2219 1
+15 2220 1
+15 2221 1
+15 2222 1
+15 2223 1
+15 2224 1
+15 2225 1
+15 2226 1
+15 2227 1
+15 2228 1
+15 2229 1
+15 2230 1
+15 2231 1
+15 2232 1
+15 2233 1
+15 2234 1
+15 2235 1
+15 2236 1
+15 2237 1
+15 2238 1
+15 2239 1
+15 2240 1
+15 2241 1
+15 2242 1
+15 2243 1
+15 2244 1
+15 2245 1
+15 2246 1
+15 2247 1
+15 2248 1
+15 2249 1
+15 2250 1
+15 2251 1
+15 2252 1
+15 2253 1
+15 2254 1
+15 2255 1
+15 2256 1
+15 2257 1
+15 2258 1
+15 2259 1
+15 2260 1
+15 2261 1
+15 2262 1
+15 2263 1
+15 2264 1
+15 2265 1
+15 2266 1
+15 2267 1
+15 2268 1
+15 2269 1
+15 2270 1
+15 2271 1
+15 2272 1
+15 2273 1
+15 2274 1
+15 2275 1
+15 2276 1
+15 2277 1
+15 2278 1
+15 2279 1
+15 2280 1
+15 2281 1
+15 2282 1
+15 2283 1
+15 2284 1
+15 2285 1
+15 2286 1
+15 2287 1
+15 2288 1
+15 2289 1
+15 2290 1
+15 2291 1
+15 2292 1
+15 2293 1
+15 2294 1
+15 2295 1
+15 2296 1
+15 2297 1
+15 2298 1
+15 2299 1
+15 2300 1
+15 2301 1
+15 2302 1
+15 2303 1
+15 2304 1
+15 2305 1
+15 2306 1
+15 2307 1
+15 2308 1
+15 2309 1
+15 2310 1
+15 2311 1
+15 2312 1
+15 2313 1
+15 2314 1
+15 2315 1
+15 2316 1
+15 2317 1
+15 2318 1
+15 2319 1
+15 2320 1
+15 2321 1
+15 2322 1
+15 2323 1
+15 2324 1
+15 2325 1
+15 2326 1
+15 2327 1
+15 2328 1
+15 2329 1
+15 2330 1
+15 2331 1
+15 2332 1
+15 2333 1
+15 2334 1
+15 2335 1
+15 2336 1
+15 2337 1
+15 2338 1
+15 2339 1
+15 2340 1
+15 2341 1
+15 2342 1
+15 2343 1
+15 2344 1
+15 2345 1
+15 2346 1
+15 2347 1
+15 2348 1
+15 2349 1
+15 2350 1
+15 2351 1
+15 2352 1
+15 2353 1
+15 2354 1
+15 2355 1
+15 2356 1
+15 2357 1
+15 2358 1
+15 2359 1
+15 2360 1
+15 2361 1
+15 2362 1
+15 2363 1
+15 2364 1
+15 2365 1
+15 2366 1
+15 2367 1
+15 2368 1
+15 2369 1
+15 2370 1
+15 2371 1
+15 2372 1
+15 2373 1
+15 2374 1
+15 2375 1
+15 2376 1
+15 2377 1
+15 2378 1
+15 2379 1
+15 2380 1
+15 2381 1
+15 2382 1
+15 2383 1
+15 2384 1
+15 2385 1
+15 2386 1
+15 2387 1
+15 2388 1
+15 2389 1
+15 2390 1
+15 2391 1
+15 2392 1
+15 2393 1
+15 2394 1
+15 2395 1
+15 2396 1
+15 2397 1
+15 2398 1
+15 2399 1
+15 2400 1
+15 2401 1
+15 2402 1
+15 2403 1
+15 2404 1
+15 2405 1
+15 2406 1
+15 2407 1
+15 2408 1
+15 2409 1
+15 2410 1
+15 2411 1
+15 2412 1
+15 2413 1
+15 2414 1
+15 2415 1
+15 2416 1
+15 2417 1
+15 2418 1
+15 2419 1
+15 2420 1
+15 2421 1
+15 2422 1
+15 2423 1
+15 2424 1
+15 2425 1
+15 2426 1
+15 2427 1
+15 2428 1
+15 2429 1
+15 2430 1
+16 1 1
+16 2 1
+16 3 1
+16 4 1
+16 5 1
+16 6 1
+16 7 1
+16 8 1
+16 9 1
+16 10 1
+16 11 1
+16 12 1
+16 13 1
+16 14 1
+16 15 1
+16 16 1
+16 17 1
+16 18 1
+16 19 1
+16 20 1
+16 21 1
+16 22 1
+16 23 1
+16 24 1
+16 25 1
+16 26 1
+16 27 1
+16 28 1
+16 29 1
+16 30 1
+16 31 1
+16 32 1
+16 33 1
+16 34 1
+16 35 1
+16 36 1
+16 121 1
+16 122 1
+16 123 1
+16 124 1
+16 125 1
+16 126 1
+16 127 1
+16 128 1
+16 129 1
+16 130 1
+16 131 1
+16 132 1
+16 133 1
+16 134 1
+16 135 1
+16 136 1
+16 137 1
+16 138 1
+16 139 1
+16 140 1
+16 141 1
+16 142 1
+16 143 1
+16 144 1
+16 145 1
+16 146 1
+16 147 1
+16 148 1
+16 149 1
+16 150 1
+16 151 1
+16 152 1
+16 153 1
+16 154 1
+16 155 1
+16 156 1
+16 157 1
+16 158 1
+16 159 1
+16 160 1
+16 161 1
+16 162 1
+16 163 1
+16 164 1
+16 165 1
+16 166 1
+16 167 1
+16 168 1
+16 169 1
+16 170 1
+16 171 1
+16 172 1
+16 173 1
+16 174 1
+16 175 1
+16 176 1
+16 177 1
+16 178 1
+16 179 1
+16 180 1
+16 181 1
+16 182 1
+16 183 1
+16 184 1
+16 185 1
+16 186 1
+16 187 1
+16 188 1
+16 189 1
+16 190 1
+16 191 1
+16 192 1
+16 193 1
+16 194 1
+16 195 1
+16 196 1
+16 197 1
+16 198 1
+16 199 1
+16 200 1
+16 201 1
+16 202 1
+16 203 1
+16 204 1
+16 331 1
+16 332 1
+16 333 1
+16 334 1
+16 335 1
+16 336 1
+16 337 1
+16 338 1
+16 339 1
+16 340 1
+16 341 1
+16 342 1
+16 343 1
+16 344 1
+16 345 1
+16 346 1
+16 347 1
+16 348 1
+16 349 1
+16 350 1
+16 351 1
+16 352 1
+16 353 1
+16 354 1
+16 355 1
+16 356 1
+16 357 1
+16 358 1
+16 359 1
+16 360 1
+16 361 1
+16 362 1
+16 363 1
+16 364 1
+16 365 1
+16 366 1
+16 367 1
+16 368 1
+16 369 1
+16 370 1
+16 371 1
+16 372 1
+16 373 1
+16 374 1
+16 375 1
+16 376 1
+16 377 1
+16 378 1
+16 379 1
+16 380 1
+16 381 1
+16 382 1
+16 383 1
+16 384 1
+16 385 1
+16 386 1
+16 387 1
+16 388 1
+16 389 1
+16 390 1
+16 391 1
+16 392 1
+16 393 1
+16 394 1
+16 395 1
+16 396 1
+16 397 1
+16 398 1
+16 399 1
+16 400 1
+16 401 1
+16 402 1
+16 403 1
+16 404 1
+16 405 1
+16 406 1
+16 407 1
+16 408 1
+16 409 1
+16 410 1
+16 411 1
+16 412 1
+16 413 1
+16 414 1
+16 541 1
+16 542 1
+16 543 1
+16 544 1
+16 545 1
+16 546 1
+16 547 1
+16 548 1
+16 549 1
+16 550 1
+16 551 1
+16 552 1
+16 553 1
+16 554 1
+16 555 1
+16 556 1
+16 557 1
+16 558 1
+16 559 1
+16 560 1
+16 561 1
+16 562 1
+16 563 1
+16 564 1
+16 565 1
+16 566 1
+16 567 1
+16 568 1
+16 569 1
+16 570 1
+16 571 1
+16 572 1
+16 573 1
+16 574 1
+16 575 1
+16 576 1
+16 577 1
+16 578 1
+16 579 1
+16 580 1
+16 581 1
+16 582 1
+16 583 1
+16 584 1
+16 585 1
+16 586 1
+16 587 1
+16 588 1
+16 589 1
+16 590 1
+16 591 1
+16 592 1
+16 593 1
+16 594 1
+16 595 1
+16 596 1
+16 597 1
+16 598 1
+16 599 1
+16 600 1
+16 601 1
+16 602 1
+16 603 1
+16 604 1
+16 605 1
+16 606 1
+16 607 1
+16 608 1
+16 609 1
+16 610 1
+16 611 1
+16 612 1
+16 613 1
+16 614 1
+16 615 1
+16 616 1
+16 617 1
+16 618 1
+16 619 1
+16 620 1
+16 621 1
+16 622 1
+16 623 1
+16 624 1
+16 625 1
+16 626 1
+16 627 1
+16 628 1
+16 629 1
+16 630 1
+16 631 1
+16 632 1
+16 633 1
+16 634 1
+16 635 1
+16 636 1
+16 637 1
+16 638 1
+16 639 1
+16 640 1
+16 641 1
+16 642 1
+16 643 1
+16 644 1
+16 645 1
+16 646 1
+16 647 1
+16 648 1
+16 649 1
+16 650 1
+16 651 1
+16 652 1
+16 653 1
+16 654 1
+16 655 1
+16 656 1
+16 657 1
+16 658 1
+16 659 1
+16 660 1
+16 661 1
+16 662 1
+16 663 1
+16 664 1
+16 665 1
+16 666 1
+16 1717 1
+16 1718 1
+16 1719 1
+16 1720 1
+16 1721 1
+16 1722 1
+16 1723 1
+16 1724 1
+16 1725 1
+16 1726 1
+16 1727 1
+16 1728 1
+16 1729 1
+16 1730 1
+16 1731 1
+16 1732 1
+16 1733 1
+16 1734 1
+16 1735 1
+16 1736 1
+16 1737 1
+16 1738 1
+16 1739 1
+16 1740 1
+16 1741 1
+16 1742 1
+16 1743 1
+16 1744 1
+16 1745 1
+16 1746 1
+16 1747 1
+16 1748 1
+16 1749 1
+16 1750 1
+16 1751 1
+16 1752 1
+16 1753 1
+16 1754 1
+16 1755 1
+16 1756 1
+16 1757 1
+16 1758 1
+16 1759 1
+16 1760 1
+16 1761 1
+16 1762 1
+16 1763 1
+16 1764 1
+16 1765 1
+16 1766 1
+16 1767 1
+16 1768 1
+16 1769 1
+16 1770 1
+16 1771 1
+16 1772 1
+16 1773 1
+16 1774 1
+16 1775 1
+16 1776 1
+16 1777 1
+16 1778 1
+16 1779 1
+16 1780 1
+16 1781 1
+16 1782 1
+16 1783 1
+16 1784 1
+16 1785 1
+16 1786 1
+16 1787 1
+16 1788 1
+16 1789 1
+16 1790 1
+16 1791 1
+16 1792 1
+16 1793 1
+16 1794 1
+16 1795 1
+16 1796 1
+16 1797 1
+16 1798 1
+16 1799 1
+16 1800 1
+16 1927 1
+16 1928 1
+16 1929 1
+16 1930 1
+16 1931 1
+16 1932 1
+16 1933 1
+16 1934 1
+16 1935 1
+16 1936 1
+16 1937 1
+16 1938 1
+16 1939 1
+16 1940 1
+16 1941 1
+16 1942 1
+16 1943 1
+16 1944 1
+16 1945 1
+16 1946 1
+16 1947 1
+16 1948 1
+16 1949 1
+16 1950 1
+16 1951 1
+16 1952 1
+16 1953 1
+16 1954 1
+16 1955 1
+16 1956 1
+16 1957 1
+16 1958 1
+16 1959 1
+16 1960 1
+16 1961 1
+16 1962 1
+16 1963 1
+16 1964 1
+16 1965 1
+16 1966 1
+16 1967 1
+16 1968 1
+16 1969 1
+16 1970 1
+16 1971 1
+16 1972 1
+16 1973 1
+16 1974 1
+16 1975 1
+16 1976 1
+16 1977 1
+16 1978 1
+16 1979 1
+16 1980 1
+16 1981 1
+16 1982 1
+16 1983 1
+16 1984 1
+16 1985 1
+16 1986 1
+16 1987 1
+16 1988 1
+16 1989 1
+16 1990 1
+16 1991 1
+16 1992 1
+16 1993 1
+16 1994 1
+16 1995 1
+16 1996 1
+16 1997 1
+16 1998 1
+16 1999 1
+16 2000 1
+16 2001 1
+16 2002 1
+16 2003 1
+16 2004 1
+16 2005 1
+16 2006 1
+16 2007 1
+16 2008 1
+16 2009 1
+16 2010 1
+16 2011 1
+16 2012 1
+16 2013 1
+16 2014 1
+16 2015 1
+16 2016 1
+16 2017 1
+16 2018 1
+16 2019 1
+16 2020 1
+16 2021 1
+16 2022 1
+16 2023 1
+16 2024 1
+16 2025 1
+16 2026 1
+16 2027 1
+16 2028 1
+16 2029 1
+16 2030 1
+16 2031 1
+16 2032 1
+16 2033 1
+16 2034 1
+16 2035 1
+16 2036 1
+16 2037 1
+16 2038 1
+16 2039 1
+16 2040 1
+16 2041 1
+16 2042 1
+16 2043 1
+16 2044 1
+16 2045 1
+16 2046 1
+16 2047 1
+16 2048 1
+16 2049 1
+16 2050 1
+16 2051 1
+16 2052 1
+16 2179 1
+16 2180 1
+16 2181 1
+16 2182 1
+16 2183 1
+16 2184 1
+16 2185 1
+16 2186 1
+16 2187 1
+16 2188 1
+16 2189 1
+16 2190 1
+16 2191 1
+16 2192 1
+16 2193 1
+16 2194 1
+16 2195 1
+16 2196 1
+16 2197 1
+16 2198 1
+16 2199 1
+16 2200 1
+16 2201 1
+16 2202 1
+16 2203 1
+16 2204 1
+16 2205 1
+16 2206 1
+16 2207 1
+16 2208 1
+16 2209 1
+16 2210 1
+16 2211 1
+16 2212 1
+16 2213 1
+16 2214 1
+16 2215 1
+16 2216 1
+16 2217 1
+16 2218 1
+16 2219 1
+16 2220 1
+16 2221 1
+16 2222 1
+16 2223 1
+16 2224 1
+16 2225 1
+16 2226 1
+16 2227 1
+16 2228 1
+16 2229 1
+16 2230 1
+16 2231 1
+16 2232 1
+16 2233 1
+16 2234 1
+16 2235 1
+16 2236 1
+16 2237 1
+16 2238 1
+16 2239 1
+16 2240 1
+16 2241 1
+16 2242 1
+16 2243 1
+16 2244 1
+16 2245 1
+16 2246 1
+16 2247 1
+16 2248 1
+16 2249 1
+16 2250 1
+16 2251 1
+16 2252 1
+16 2253 1
+16 2254 1
+16 2255 1
+16 2256 1
+16 2257 1
+16 2258 1
+16 2259 1
+16 2260 1
+16 2261 1
+16 2262 1
+16 2263 1
+16 2264 1
+16 2265 1
+16 2266 1
+16 2267 1
+16 2268 1
+16 2269 1
+16 2270 1
+16 2271 1
+16 2272 1
+16 2273 1
+16 2274 1
+16 2275 1
+16 2276 1
+16 2277 1
+16 2278 1
+16 2279 1
+16 2280 1
+16 2281 1
+16 2282 1
+16 2283 1
+16 2284 1
+16 2285 1
+16 2286 1
+16 2287 1
+16 2288 1
+16 2289 1
+16 2290 1
+16 2291 1
+16 2292 1
+16 2293 1
+16 2294 1
+16 2295 1
+16 2296 1
+16 2297 1
+16 2298 1
+16 2299 1
+16 2300 1
+16 2301 1
+16 2302 1
+16 2303 1
+16 2304 1
+16 2431 1
+16 2432 1
+16 2433 1
+16 2434 1
+16 2435 1
+16 2436 1
+16 2437 1
+16 2438 1
+16 2439 1
+16 2440 1
+16 2441 1
+16 2442 1
+16 2443 1
+16 2444 1
+16 2445 1
+16 2446 1
+16 2447 1
+16 2448 1
+16 2449 1
+16 2450 1
+16 2451 1
+16 2452 1
+16 2453 1
+16 2454 1
+16 2455 1
+16 2456 1
+16 2457 1
+16 2458 1
+16 2459 1
+16 2460 1
+16 2461 1
+16 2462 1
+16 2463 1
+16 2464 1
+16 2465 1
+16 2466 1
+16 2467 1
+16 2468 1
+16 2469 1
+16 2470 1
+16 2471 1
+16 2472 1
+16 2473 1
+16 2474 1
+16 2475 1
+16 2476 1
+16 2477 1
+16 2478 1
+16 2479 1
+16 2480 1
+16 2481 1
+16 2482 1
+16 2483 1
+16 2484 1
+16 2485 1
+16 2486 1
+16 2487 1
+16 2488 1
+16 2489 1
+16 2490 1
+16 2491 1
+16 2492 1
+16 2493 1
+16 2494 1
+16 2495 1
+16 2496 1
+16 2497 1
+16 2498 1
+16 2499 1
+16 2500 1
+16 2501 1
+16 2502 1
+16 2503 1
+16 2504 1
+16 2505 1
+16 2506 1
+16 2507 1
+16 2508 1
+16 2509 1
+16 2510 1
+16 2511 1
+16 2512 1
+16 2513 1
+16 2514 1
+16 2515 1
+16 2516 1
+16 2517 1
+16 2518 1
+16 2519 1
+16 2520 1
+16 2521 1
+16 2522 1
+16 2523 1
+16 2524 1
+16 2525 1
+16 2526 1
+16 2527 1
+16 2528 1
+16 2529 1
+16 2530 1
+16 2531 1
+16 2532 1
+16 2533 1
+16 2534 1
+16 2535 1
+16 2536 1
+16 2537 1
+16 2538 1
+16 2539 1
+16 2540 1
+16 2541 1
+16 2542 1
+16 2543 1
+16 2544 1
+16 2545 1
+16 2546 1
+16 2547 1
+16 2548 1
+16 2549 1
+16 2550 1
+16 2551 1
+16 2552 1
+16 2553 1
+16 2554 1
+16 2555 1
+16 2556 1
+17 1 1
+17 2 1
+17 3 1
+17 4 1
+17 5 1
+17 6 1
+17 7 1
+17 8 1
+17 37 1
+17 38 1
+17 39 1
+17 40 1
+17 41 1
+17 42 1
+17 43 1
+17 44 1
+17 45 1
+17 46 1
+17 47 1
+17 48 1
+17 49 1
+17 50 1
+17 51 1
+17 52 1
+17 53 1
+17 54 1
+17 55 1
+17 56 1
+17 57 1
+17 58 1
+17 59 1
+17 60 1
+17 61 1
+17 62 1
+17 63 1
+17 64 1
+17 121 1
+17 122 1
+17 123 1
+17 124 1
+17 125 1
+17 126 1
+17 127 1
+17 128 1
+17 129 1
+17 130 1
+17 131 1
+17 132 1
+17 133 1
+17 134 1
+17 135 1
+17 136 1
+17 137 1
+17 138 1
+17 139 1
+17 140 1
+17 141 1
+17 142 1
+17 143 1
+17 144 1
+17 145 1
+17 146 1
+17 147 1
+17 148 1
+17 205 1
+17 206 1
+17 207 1
+17 208 1
+17 209 1
+17 210 1
+17 211 1
+17 212 1
+17 213 1
+17 214 1
+17 215 1
+17 216 1
+17 217 1
+17 218 1
+17 219 1
+17 220 1
+17 221 1
+17 222 1
+17 223 1
+17 224 1
+17 225 1
+17 226 1
+17 227 1
+17 228 1
+17 229 1
+17 230 1
+17 231 1
+17 232 1
+17 233 1
+17 234 1
+17 235 1
+17 236 1
+17 237 1
+17 238 1
+17 239 1
+17 240 1
+17 241 1
+17 242 1
+17 243 1
+17 244 1
+17 245 1
+17 246 1
+17 247 1
+17 248 1
+17 249 1
+17 250 1
+17 251 1
+17 252 1
+17 253 1
+17 254 1
+17 255 1
+17 256 1
+17 257 1
+17 258 1
+17 259 1
+17 260 1
+17 331 1
+17 332 1
+17 333 1
+17 334 1
+17 335 1
+17 336 1
+17 337 1
+17 338 1
+17 339 1
+17 340 1
+17 341 1
+17 342 1
+17 343 1
+17 344 1
+17 345 1
+17 346 1
+17 347 1
+17 348 1
+17 349 1
+17 350 1
+17 351 1
+17 352 1
+17 353 1
+17 354 1
+17 355 1
+17 356 1
+17 357 1
+17 358 1
+17 415 1
+17 416 1
+17 417 1
+17 418 1
+17 419 1
+17 420 1
+17 421 1
+17 422 1
+17 423 1
+17 424 1
+17 425 1
+17 426 1
+17 427 1
+17 428 1
+17 429 1
+17 430 1
+17 431 1
+17 432 1
+17 433 1
+17 434 1
+17 435 1
+17 436 1
+17 437 1
+17 438 1
+17 439 1
+17 440 1
+17 441 1
+17 442 1
+17 443 1
+17 444 1
+17 445 1
+17 446 1
+17 447 1
+17 448 1
+17 449 1
+17 450 1
+17 451 1
+17 452 1
+17 453 1
+17 454 1
+17 455 1
+17 456 1
+17 457 1
+17 458 1
+17 459 1
+17 460 1
+17 461 1
+17 462 1
+17 463 1
+17 464 1
+17 465 1
+17 466 1
+17 467 1
+17 468 1
+17 469 1
+17 470 1
+17 541 1
+17 542 1
+17 543 1
+17 544 1
+17 545 1
+17 546 1
+17 547 1
+17 548 1
+17 549 1
+17 550 1
+17 551 1
+17 552 1
+17 553 1
+17 554 1
+17 555 1
+17 556 1
+17 557 1
+17 558 1
+17 559 1
+17 560 1
+17 561 1
+17 562 1
+17 563 1
+17 564 1
+17 565 1
+17 566 1
+17 567 1
+17 568 1
+17 569 1
+17 570 1
+17 571 1
+17 572 1
+17 573 1
+17 574 1
+17 575 1
+17 576 1
+17 577 1
+17 578 1
+17 579 1
+17 580 1
+17 581 1
+17 582 1
+17 583 1
+17 584 1
+17 585 1
+17 586 1
+17 587 1
+17 588 1
+17 589 1
+17 590 1
+17 591 1
+17 592 1
+17 593 1
+17 594 1
+17 595 1
+17 596 1
+17 667 1
+17 668 1
+17 669 1
+17 670 1
+17 671 1
+17 672 1
+17 673 1
+17 674 1
+17 675 1
+17 676 1
+17 677 1
+17 678 1
+17 679 1
+17 680 1
+17 681 1
+17 682 1
+17 683 1
+17 684 1
+17 685 1
+17 686 1
+17 687 1
+17 688 1
+17 689 1
+17 690 1
+17 691 1
+17 692 1
+17 693 1
+17 694 1
+17 695 1
+17 696 1
+17 697 1
+17 698 1
+17 699 1
+17 700 1
+17 701 1
+17 702 1
+17 703 1
+17 704 1
+17 705 1
+17 706 1
+17 707 1
+17 708 1
+17 709 1
+17 710 1
+17 711 1
+17 712 1
+17 713 1
+17 714 1
+17 715 1
+17 716 1
+17 717 1
+17 718 1
+17 719 1
+17 720 1
+17 721 1
+17 722 1
+17 723 1
+17 724 1
+17 725 1
+17 726 1
+17 727 1
+17 728 1
+17 729 1
+17 730 1
+17 731 1
+17 732 1
+17 733 1
+17 734 1
+17 735 1
+17 736 1
+17 1717 1
+17 1718 1
+17 1719 1
+17 1720 1
+17 1721 1
+17 1722 1
+17 1723 1
+17 1724 1
+17 1725 1
+17 1726 1
+17 1727 1
+17 1728 1
+17 1729 1
+17 1730 1
+17 1731 1
+17 1732 1
+17 1733 1
+17 1734 1
+17 1735 1
+17 1736 1
+17 1737 1
+17 1738 1
+17 1739 1
+17 1740 1
+17 1741 1
+17 1742 1
+17 1743 1
+17 1744 1
+17 1801 1
+17 1802 1
+17 1803 1
+17 1804 1
+17 1805 1
+17 1806 1
+17 1807 1
+17 1808 1
+17 1809 1
+17 1810 1
+17 1811 1
+17 1812 1
+17 1813 1
+17 1814 1
+17 1815 1
+17 1816 1
+17 1817 1
+17 1818 1
+17 1819 1
+17 1820 1
+17 1821 1
+17 1822 1
+17 1823 1
+17 1824 1
+17 1825 1
+17 1826 1
+17 1827 1
+17 1828 1
+17 1829 1
+17 1830 1
+17 1831 1
+17 1832 1
+17 1833 1
+17 1834 1
+17 1835 1
+17 1836 1
+17 1837 1
+17 1838 1
+17 1839 1
+17 1840 1
+17 1841 1
+17 1842 1
+17 1843 1
+17 1844 1
+17 1845 1
+17 1846 1
+17 1847 1
+17 1848 1
+17 1849 1
+17 1850 1
+17 1851 1
+17 1852 1
+17 1853 1
+17 1854 1
+17 1855 1
+17 1856 1
+17 1927 1
+17 1928 1
+17 1929 1
+17 1930 1
+17 1931 1
+17 1932 1
+17 1933 1
+17 1934 1
+17 1935 1
+17 1936 1
+17 1937 1
+17 1938 1
+17 1939 1
+17 1940 1
+17 1941 1
+17 1942 1
+17 1943 1
+17 1944 1
+17 1945 1
+17 1946 1
+17 1947 1
+17 1948 1
+17 1949 1
+17 1950 1
+17 1951 1
+17 1952 1
+17 1953 1
+17 1954 1
+17 1955 1
+17 1956 1
+17 1957 1
+17 1958 1
+17 1959 1
+17 1960 1
+17 1961 1
+17 1962 1
+17 1963 1
+17 1964 1
+17 1965 1
+17 1966 1
+17 1967 1
+17 1968 1
+17 1969 1
+17 1970 1
+17 1971 1
+17 1972 1
+17 1973 1
+17 1974 1
+17 1975 1
+17 1976 1
+17 1977 1
+17 1978 1
+17 1979 1
+17 1980 1
+17 1981 1
+17 1982 1
+17 2053 1
+17 2054 1
+17 2055 1
+17 2056 1
+17 2057 1
+17 2058 1
+17 2059 1
+17 2060 1
+17 2061 1
+17 2062 1
+17 2063 1
+17 2064 1
+17 2065 1
+17 2066 1
+17 2067 1
+17 2068 1
+17 2069 1
+17 2070 1
+17 2071 1
+17 2072 1
+17 2073 1
+17 2074 1
+17 2075 1
+17 2076 1
+17 2077 1
+17 2078 1
+17 2079 1
+17 2080 1
+17 2081 1
+17 2082 1
+17 2083 1
+17 2084 1
+17 2085 1
+17 2086 1
+17 2087 1
+17 2088 1
+17 2089 1
+17 2090 1
+17 2091 1
+17 2092 1
+17 2093 1
+17 2094 1
+17 2095 1
+17 2096 1
+17 2097 1
+17 2098 1
+17 2099 1
+17 2100 1
+17 2101 1
+17 2102 1
+17 2103 1
+17 2104 1
+17 2105 1
+17 2106 1
+17 2107 1
+17 2108 1
+17 2109 1
+17 2110 1
+17 2111 1
+17 2112 1
+17 2113 1
+17 2114 1
+17 2115 1
+17 2116 1
+17 2117 1
+17 2118 1
+17 2119 1
+17 2120 1
+17 2121 1
+17 2122 1
+17 2179 1
+17 2180 1
+17 2181 1
+17 2182 1
+17 2183 1
+17 2184 1
+17 2185 1
+17 2186 1
+17 2187 1
+17 2188 1
+17 2189 1
+17 2190 1
+17 2191 1
+17 2192 1
+17 2193 1
+17 2194 1
+17 2195 1
+17 2196 1
+17 2197 1
+17 2198 1
+17 2199 1
+17 2200 1
+17 2201 1
+17 2202 1
+17 2203 1
+17 2204 1
+17 2205 1
+17 2206 1
+17 2207 1
+17 2208 1
+17 2209 1
+17 2210 1
+17 2211 1
+17 2212 1
+17 2213 1
+17 2214 1
+17 2215 1
+17 2216 1
+17 2217 1
+17 2218 1
+17 2219 1
+17 2220 1
+17 2221 1
+17 2222 1
+17 2223 1
+17 2224 1
+17 2225 1
+17 2226 1
+17 2227 1
+17 2228 1
+17 2229 1
+17 2230 1
+17 2231 1
+17 2232 1
+17 2233 1
+17 2234 1
+17 2305 1
+17 2306 1
+17 2307 1
+17 2308 1
+17 2309 1
+17 2310 1
+17 2311 1
+17 2312 1
+17 2313 1
+17 2314 1
+17 2315 1
+17 2316 1
+17 2317 1
+17 2318 1
+17 2319 1
+17 2320 1
+17 2321 1
+17 2322 1
+17 2323 1
+17 2324 1
+17 2325 1
+17 2326 1
+17 2327 1
+17 2328 1
+17 2329 1
+17 2330 1
+17 2331 1
+17 2332 1
+17 2333 1
+17 2334 1
+17 2335 1
+17 2336 1
+17 2337 1
+17 2338 1
+17 2339 1
+17 2340 1
+17 2341 1
+17 2342 1
+17 2343 1
+17 2344 1
+17 2345 1
+17 2346 1
+17 2347 1
+17 2348 1
+17 2349 1
+17 2350 1
+17 2351 1
+17 2352 1
+17 2353 1
+17 2354 1
+17 2355 1
+17 2356 1
+17 2357 1
+17 2358 1
+17 2359 1
+17 2360 1
+17 2361 1
+17 2362 1
+17 2363 1
+17 2364 1
+17 2365 1
+17 2366 1
+17 2367 1
+17 2368 1
+17 2369 1
+17 2370 1
+17 2371 1
+17 2372 1
+17 2373 1
+17 2374 1
+17 2431 1
+17 2432 1
+17 2433 1
+17 2434 1
+17 2435 1
+17 2436 1
+17 2437 1
+17 2438 1
+17 2439 1
+17 2440 1
+17 2441 1
+17 2442 1
+17 2443 1
+17 2444 1
+17 2445 1
+17 2446 1
+17 2447 1
+17 2448 1
+17 2449 1
+17 2450 1
+17 2451 1
+17 2452 1
+17 2453 1
+17 2454 1
+17 2455 1
+17 2456 1
+17 2457 1
+17 2458 1
+17 2459 1
+17 2460 1
+17 2461 1
+17 2462 1
+17 2463 1
+17 2464 1
+17 2465 1
+17 2466 1
+17 2467 1
+17 2468 1
+17 2469 1
+17 2470 1
+17 2471 1
+17 2472 1
+17 2473 1
+17 2474 1
+17 2475 1
+17 2476 1
+17 2477 1
+17 2478 1
+17 2479 1
+17 2480 1
+17 2481 1
+17 2482 1
+17 2483 1
+17 2484 1
+17 2485 1
+17 2486 1
+17 2487 1
+17 2488 1
+17 2489 1
+17 2490 1
+17 2491 1
+17 2492 1
+17 2493 1
+17 2494 1
+17 2495 1
+17 2496 1
+17 2497 1
+17 2498 1
+17 2499 1
+17 2500 1
+17 2557 1
+17 2558 1
+17 2559 1
+17 2560 1
+17 2561 1
+17 2562 1
+17 2563 1
+17 2564 1
+17 2565 1
+17 2566 1
+17 2567 1
+17 2568 1
+17 2569 1
+17 2570 1
+17 2571 1
+17 2572 1
+17 2573 1
+17 2574 1
+17 2575 1
+17 2576 1
+17 2577 1
+17 2578 1
+17 2579 1
+17 2580 1
+17 2581 1
+17 2582 1
+17 2583 1
+17 2584 1
+17 2585 1
+17 2586 1
+17 2587 1
+17 2588 1
+17 2589 1
+17 2590 1
+17 2591 1
+17 2592 1
+17 2593 1
+17 2594 1
+17 2595 1
+17 2596 1
+17 2597 1
+17 2598 1
+17 2599 1
+17 2600 1
+17 2601 1
+17 2602 1
+17 2603 1
+17 2604 1
+17 2605 1
+17 2606 1
+17 2607 1
+17 2608 1
+17 2609 1
+17 2610 1
+17 2611 1
+17 2612 1
+18 1 1
+18 9 1
+18 10 1
+18 11 1
+18 12 1
+18 13 1
+18 14 1
+18 15 1
+18 37 1
+18 38 1
+18 39 1
+18 40 1
+18 41 1
+18 42 1
+18 43 1
+18 65 1
+18 66 1
+18 67 1
+18 68 1
+18 69 1
+18 70 1
+18 71 1
+18 72 1
+18 73 1
+18 74 1
+18 75 1
+18 76 1
+18 77 1
+18 78 1
+18 79 1
+18 80 1
+18 81 1
+18 82 1
+18 83 1
+18 84 1
+18 85 1
+18 121 1
+18 122 1
+18 123 1
+18 124 1
+18 125 1
+18 126 1
+18 127 1
+18 149 1
+18 150 1
+18 151 1
+18 152 1
+18 153 1
+18 154 1
+18 155 1
+18 156 1
+18 157 1
+18 158 1
+18 159 1
+18 160 1
+18 161 1
+18 162 1
+18 163 1
+18 164 1
+18 165 1
+18 166 1
+18 167 1
+18 168 1
+18 169 1
+18 205 1
+18 206 1
+18 207 1
+18 208 1
+18 209 1
+18 210 1
+18 211 1
+18 212 1
+18 213 1
+18 214 1
+18 215 1
+18 216 1
+18 217 1
+18 218 1
+18 219 1
+18 220 1
+18 221 1
+18 222 1
+18 223 1
+18 224 1
+18 225 1
+18 261 1
+18 262 1
+18 263 1
+18 264 1
+18 265 1
+18 266 1
+18 267 1
+18 268 1
+18 269 1
+18 270 1
+18 271 1
+18 272 1
+18 273 1
+18 274 1
+18 275 1
+18 276 1
+18 277 1
+18 278 1
+18 279 1
+18 280 1
+18 281 1
+18 282 1
+18 283 1
+18 284 1
+18 285 1
+18 286 1
+18 287 1
+18 288 1
+18 289 1
+18 290 1
+18 291 1
+18 292 1
+18 293 1
+18 294 1
+18 295 1
+18 331 1
+18 332 1
+18 333 1
+18 334 1
+18 335 1
+18 336 1
+18 337 1
+18 359 1
+18 360 1
+18 361 1
+18 362 1
+18 363 1
+18 364 1
+18 365 1
+18 366 1
+18 367 1
+18 368 1
+18 369 1
+18 370 1
+18 371 1
+18 372 1
+18 373 1
+18 374 1
+18 375 1
+18 376 1
+18 377 1
+18 378 1
+18 379 1
+18 415 1
+18 416 1
+18 417 1
+18 418 1
+18 419 1
+18 420 1
+18 421 1
+18 422 1
+18 423 1
+18 424 1
+18 425 1
+18 426 1
+18 427 1
+18 428 1
+18 429 1
+18 430 1
+18 431 1
+18 432 1
+18 433 1
+18 434 1
+18 435 1
+18 471 1
+18 472 1
+18 473 1
+18 474 1
+18 475 1
+18 476 1
+18 477 1
+18 478 1
+18 479 1
+18 480 1
+18 481 1
+18 482 1
+18 483 1
+18 484 1
+18 485 1
+18 486 1
+18 487 1
+18 488 1
+18 489 1
+18 490 1
+18 491 1
+18 492 1
+18 493 1
+18 494 1
+18 495 1
+18 496 1
+18 497 1
+18 498 1
+18 499 1
+18 500 1
+18 501 1
+18 502 1
+18 503 1
+18 504 1
+18 505 1
+18 541 1
+18 542 1
+18 543 1
+18 544 1
+18 545 1
+18 546 1
+18 547 1
+18 548 1
+18 549 1
+18 550 1
+18 551 1
+18 552 1
+18 553 1
+18 554 1
+18 555 1
+18 556 1
+18 557 1
+18 558 1
+18 559 1
+18 560 1
+18 561 1
+18 597 1
+18 598 1
+18 599 1
+18 600 1
+18 601 1
+18 602 1
+18 603 1
+18 604 1
+18 605 1
+18 606 1
+18 607 1
+18 608 1
+18 609 1
+18 610 1
+18 611 1
+18 612 1
+18 613 1
+18 614 1
+18 615 1
+18 616 1
+18 617 1
+18 618 1
+18 619 1
+18 620 1
+18 621 1
+18 622 1
+18 623 1
+18 624 1
+18 625 1
+18 626 1
+18 627 1
+18 628 1
+18 629 1
+18 630 1
+18 631 1
+18 667 1
+18 668 1
+18 669 1
+18 670 1
+18 671 1
+18 672 1
+18 673 1
+18 674 1
+18 675 1
+18 676 1
+18 677 1
+18 678 1
+18 679 1
+18 680 1
+18 681 1
+18 682 1
+18 683 1
+18 684 1
+18 685 1
+18 686 1
+18 687 1
+18 688 1
+18 689 1
+18 690 1
+18 691 1
+18 692 1
+18 693 1
+18 694 1
+18 695 1
+18 696 1
+18 697 1
+18 698 1
+18 699 1
+18 700 1
+18 701 1
+18 737 1
+18 738 1
+18 739 1
+18 740 1
+18 741 1
+18 742 1
+18 743 1
+18 744 1
+18 745 1
+18 746 1
+18 747 1
+18 748 1
+18 749 1
+18 750 1
+18 751 1
+18 752 1
+18 753 1
+18 754 1
+18 755 1
+18 756 1
+18 757 1
+18 758 1
+18 759 1
+18 760 1
+18 761 1
+18 762 1
+18 763 1
+18 764 1
+18 765 1
+18 766 1
+18 767 1
+18 768 1
+18 769 1
+18 770 1
+18 771 1
+18 1717 1
+18 1718 1
+18 1719 1
+18 1720 1
+18 1721 1
+18 1722 1
+18 1723 1
+18 1745 1
+18 1746 1
+18 1747 1
+18 1748 1
+18 1749 1
+18 1750 1
+18 1751 1
+18 1752 1
+18 1753 1
+18 1754 1
+18 1755 1
+18 1756 1
+18 1757 1
+18 1758 1
+18 1759 1
+18 1760 1
+18 1761 1
+18 1762 1
+18 1763 1
+18 1764 1
+18 1765 1
+18 1801 1
+18 1802 1
+18 1803 1
+18 1804 1
+18 1805 1
+18 1806 1
+18 1807 1
+18 1808 1
+18 1809 1
+18 1810 1
+18 1811 1
+18 1812 1
+18 1813 1
+18 1814 1
+18 1815 1
+18 1816 1
+18 1817 1
+18 1818 1
+18 1819 1
+18 1820 1
+18 1821 1
+18 1857 1
+18 1858 1
+18 1859 1
+18 1860 1
+18 1861 1
+18 1862 1
+18 1863 1
+18 1864 1
+18 1865 1
+18 1866 1
+18 1867 1
+18 1868 1
+18 1869 1
+18 1870 1
+18 1871 1
+18 1872 1
+18 1873 1
+18 1874 1
+18 1875 1
+18 1876 1
+18 1877 1
+18 1878 1
+18 1879 1
+18 1880 1
+18 1881 1
+18 1882 1
+18 1883 1
+18 1884 1
+18 1885 1
+18 1886 1
+18 1887 1
+18 1888 1
+18 1889 1
+18 1890 1
+18 1891 1
+18 1927 1
+18 1928 1
+18 1929 1
+18 1930 1
+18 1931 1
+18 1932 1
+18 1933 1
+18 1934 1
+18 1935 1
+18 1936 1
+18 1937 1
+18 1938 1
+18 1939 1
+18 1940 1
+18 1941 1
+18 1942 1
+18 1943 1
+18 1944 1
+18 1945 1
+18 1946 1
+18 1947 1
+18 1983 1
+18 1984 1
+18 1985 1
+18 1986 1
+18 1987 1
+18 1988 1
+18 1989 1
+18 1990 1
+18 1991 1
+18 1992 1
+18 1993 1
+18 1994 1
+18 1995 1
+18 1996 1
+18 1997 1
+18 1998 1
+18 1999 1
+18 2000 1
+18 2001 1
+18 2002 1
+18 2003 1
+18 2004 1
+18 2005 1
+18 2006 1
+18 2007 1
+18 2008 1
+18 2009 1
+18 2010 1
+18 2011 1
+18 2012 1
+18 2013 1
+18 2014 1
+18 2015 1
+18 2016 1
+18 2017 1
+18 2053 1
+18 2054 1
+18 2055 1
+18 2056 1
+18 2057 1
+18 2058 1
+18 2059 1
+18 2060 1
+18 2061 1
+18 2062 1
+18 2063 1
+18 2064 1
+18 2065 1
+18 2066 1
+18 2067 1
+18 2068 1
+18 2069 1
+18 2070 1
+18 2071 1
+18 2072 1
+18 2073 1
+18 2074 1
+18 2075 1
+18 2076 1
+18 2077 1
+18 2078 1
+18 2079 1
+18 2080 1
+18 2081 1
+18 2082 1
+18 2083 1
+18 2084 1
+18 2085 1
+18 2086 1
+18 2087 1
+18 2123 1
+18 2124 1
+18 2125 1
+18 2126 1
+18 2127 1
+18 2128 1
+18 2129 1
+18 2130 1
+18 2131 1
+18 2132 1
+18 2133 1
+18 2134 1
+18 2135 1
+18 2136 1
+18 2137 1
+18 2138 1
+18 2139 1
+18 2140 1
+18 2141 1
+18 2142 1
+18 2143 1
+18 2144 1
+18 2145 1
+18 2146 1
+18 2147 1
+18 2148 1
+18 2149 1
+18 2150 1
+18 2151 1
+18 2152 1
+18 2153 1
+18 2154 1
+18 2155 1
+18 2156 1
+18 2157 1
+18 2179 1
+18 2180 1
+18 2181 1
+18 2182 1
+18 2183 1
+18 2184 1
+18 2185 1
+18 2186 1
+18 2187 1
+18 2188 1
+18 2189 1
+18 2190 1
+18 2191 1
+18 2192 1
+18 2193 1
+18 2194 1
+18 2195 1
+18 2196 1
+18 2197 1
+18 2198 1
+18 2199 1
+18 2235 1
+18 2236 1
+18 2237 1
+18 2238 1
+18 2239 1
+18 2240 1
+18 2241 1
+18 2242 1
+18 2243 1
+18 2244 1
+18 2245 1
+18 2246 1
+18 2247 1
+18 2248 1
+18 2249 1
+18 2250 1
+18 2251 1
+18 2252 1
+18 2253 1
+18 2254 1
+18 2255 1
+18 2256 1
+18 2257 1
+18 2258 1
+18 2259 1
+18 2260 1
+18 2261 1
+18 2262 1
+18 2263 1
+18 2264 1
+18 2265 1
+18 2266 1
+18 2267 1
+18 2268 1
+18 2269 1
+18 2305 1
+18 2306 1
+18 2307 1
+18 2308 1
+18 2309 1
+18 2310 1
+18 2311 1
+18 2312 1
+18 2313 1
+18 2314 1
+18 2315 1
+18 2316 1
+18 2317 1
+18 2318 1
+18 2319 1
+18 2320 1
+18 2321 1
+18 2322 1
+18 2323 1
+18 2324 1
+18 2325 1
+18 2326 1
+18 2327 1
+18 2328 1
+18 2329 1
+18 2330 1
+18 2331 1
+18 2332 1
+18 2333 1
+18 2334 1
+18 2335 1
+18 2336 1
+18 2337 1
+18 2338 1
+18 2339 1
+18 2375 1
+18 2376 1
+18 2377 1
+18 2378 1
+18 2379 1
+18 2380 1
+18 2381 1
+18 2382 1
+18 2383 1
+18 2384 1
+18 2385 1
+18 2386 1
+18 2387 1
+18 2388 1
+18 2389 1
+18 2390 1
+18 2391 1
+18 2392 1
+18 2393 1
+18 2394 1
+18 2395 1
+18 2396 1
+18 2397 1
+18 2398 1
+18 2399 1
+18 2400 1
+18 2401 1
+18 2402 1
+18 2403 1
+18 2404 1
+18 2405 1
+18 2406 1
+18 2407 1
+18 2408 1
+18 2409 1
+18 2431 1
+18 2432 1
+18 2433 1
+18 2434 1
+18 2435 1
+18 2436 1
+18 2437 1
+18 2438 1
+18 2439 1
+18 2440 1
+18 2441 1
+18 2442 1
+18 2443 1
+18 2444 1
+18 2445 1
+18 2446 1
+18 2447 1
+18 2448 1
+18 2449 1
+18 2450 1
+18 2451 1
+18 2452 1
+18 2453 1
+18 2454 1
+18 2455 1
+18 2456 1
+18 2457 1
+18 2458 1
+18 2459 1
+18 2460 1
+18 2461 1
+18 2462 1
+18 2463 1
+18 2464 1
+18 2465 1
+18 2501 1
+18 2502 1
+18 2503 1
+18 2504 1
+18 2505 1
+18 2506 1
+18 2507 1
+18 2508 1
+18 2509 1
+18 2510 1
+18 2511 1
+18 2512 1
+18 2513 1
+18 2514 1
+18 2515 1
+18 2516 1
+18 2517 1
+18 2518 1
+18 2519 1
+18 2520 1
+18 2521 1
+18 2522 1
+18 2523 1
+18 2524 1
+18 2525 1
+18 2526 1
+18 2527 1
+18 2528 1
+18 2529 1
+18 2530 1
+18 2531 1
+18 2532 1
+18 2533 1
+18 2534 1
+18 2535 1
+18 2557 1
+18 2558 1
+18 2559 1
+18 2560 1
+18 2561 1
+18 2562 1
+18 2563 1
+18 2564 1
+18 2565 1
+18 2566 1
+18 2567 1
+18 2568 1
+18 2569 1
+18 2570 1
+18 2571 1
+18 2572 1
+18 2573 1
+18 2574 1
+18 2575 1
+18 2576 1
+18 2577 1
+18 2578 1
+18 2579 1
+18 2580 1
+18 2581 1
+18 2582 1
+18 2583 1
+18 2584 1
+18 2585 1
+18 2586 1
+18 2587 1
+18 2588 1
+18 2589 1
+18 2590 1
+18 2591 1
+18 2613 1
+18 2614 1
+18 2615 1
+18 2616 1
+18 2617 1
+18 2618 1
+18 2619 1
+18 2620 1
+18 2621 1
+18 2622 1
+18 2623 1
+18 2624 1
+18 2625 1
+18 2626 1
+18 2627 1
+18 2628 1
+18 2629 1
+18 2630 1
+18 2631 1
+18 2632 1
+18 2633 1
+19 2 1
+19 9 1
+19 16 1
+19 17 1
+19 18 1
+19 19 1
+19 20 1
+19 21 1
+19 37 1
+19 44 1
+19 45 1
+19 46 1
+19 47 1
+19 48 1
+19 49 1
+19 65 1
+19 66 1
+19 67 1
+19 68 1
+19 69 1
+19 70 1
+19 86 1
+19 87 1
+19 88 1
+19 89 1
+19 90 1
+19 91 1
+19 92 1
+19 93 1
+19 94 1
+19 95 1
+19 96 1
+19 97 1
+19 98 1
+19 99 1
+19 100 1
+19 121 1
+19 128 1
+19 129 1
+19 130 1
+19 131 1
+19 132 1
+19 133 1
+19 149 1
+19 150 1
+19 151 1
+19 152 1
+19 153 1
+19 154 1
+19 170 1
+19 171 1
+19 172 1
+19 173 1
+19 174 1
+19 175 1
+19 176 1
+19 177 1
+19 178 1
+19 179 1
+19 180 1
+19 181 1
+19 182 1
+19 183 1
+19 184 1
+19 205 1
+19 206 1
+19 207 1
+19 208 1
+19 209 1
+19 210 1
+19 226 1
+19 227 1
+19 228 1
+19 229 1
+19 230 1
+19 231 1
+19 232 1
+19 233 1
+19 234 1
+19 235 1
+19 236 1
+19 237 1
+19 238 1
+19 239 1
+19 240 1
+19 261 1
+19 262 1
+19 263 1
+19 264 1
+19 265 1
+19 266 1
+19 267 1
+19 268 1
+19 269 1
+19 270 1
+19 271 1
+19 272 1
+19 273 1
+19 274 1
+19 275 1
+19 296 1
+19 297 1
+19 298 1
+19 299 1
+19 300 1
+19 301 1
+19 302 1
+19 303 1
+19 304 1
+19 305 1
+19 306 1
+19 307 1
+19 308 1
+19 309 1
+19 310 1
+19 311 1
+19 312 1
+19 313 1
+19 314 1
+19 315 1
+19 331 1
+19 338 1
+19 339 1
+19 340 1
+19 341 1
+19 342 1
+19 343 1
+19 359 1
+19 360 1
+19 361 1
+19 362 1
+19 363 1
+19 364 1
+19 380 1
+19 381 1
+19 382 1
+19 383 1
+19 384 1
+19 385 1
+19 386 1
+19 387 1
+19 388 1
+19 389 1
+19 390 1
+19 391 1
+19 392 1
+19 393 1
+19 394 1
+19 415 1
+19 416 1
+19 417 1
+19 418 1
+19 419 1
+19 420 1
+19 436 1
+19 437 1
+19 438 1
+19 439 1
+19 440 1
+19 441 1
+19 442 1
+19 443 1
+19 444 1
+19 445 1
+19 446 1
+19 447 1
+19 448 1
+19 449 1
+19 450 1
+19 471 1
+19 472 1
+19 473 1
+19 474 1
+19 475 1
+19 476 1
+19 477 1
+19 478 1
+19 479 1
+19 480 1
+19 481 1
+19 482 1
+19 483 1
+19 484 1
+19 485 1
+19 506 1
+19 507 1
+19 508 1
+19 509 1
+19 510 1
+19 511 1
+19 512 1
+19 513 1
+19 514 1
+19 515 1
+19 516 1
+19 517 1
+19 518 1
+19 519 1
+19 520 1
+19 521 1
+19 522 1
+19 523 1
+19 524 1
+19 525 1
+19 541 1
+19 542 1
+19 543 1
+19 544 1
+19 545 1
+19 546 1
+19 562 1
+19 563 1
+19 564 1
+19 565 1
+19 566 1
+19 567 1
+19 568 1
+19 569 1
+19 570 1
+19 571 1
+19 572 1
+19 573 1
+19 574 1
+19 575 1
+19 576 1
+19 597 1
+19 598 1
+19 599 1
+19 600 1
+19 601 1
+19 602 1
+19 603 1
+19 604 1
+19 605 1
+19 606 1
+19 607 1
+19 608 1
+19 609 1
+19 610 1
+19 611 1
+19 632 1
+19 633 1
+19 634 1
+19 635 1
+19 636 1
+19 637 1
+19 638 1
+19 639 1
+19 640 1
+19 641 1
+19 642 1
+19 643 1
+19 644 1
+19 645 1
+19 646 1
+19 647 1
+19 648 1
+19 649 1
+19 650 1
+19 651 1
+19 667 1
+19 668 1
+19 669 1
+19 670 1
+19 671 1
+19 672 1
+19 673 1
+19 674 1
+19 675 1
+19 676 1
+19 677 1
+19 678 1
+19 679 1
+19 680 1
+19 681 1
+19 702 1
+19 703 1
+19 704 1
+19 705 1
+19 706 1
+19 707 1
+19 708 1
+19 709 1
+19 710 1
+19 711 1
+19 712 1
+19 713 1
+19 714 1
+19 715 1
+19 716 1
+19 717 1
+19 718 1
+19 719 1
+19 720 1
+19 721 1
+19 737 1
+19 738 1
+19 739 1
+19 740 1
+19 741 1
+19 742 1
+19 743 1
+19 744 1
+19 745 1
+19 746 1
+19 747 1
+19 748 1
+19 749 1
+19 750 1
+19 751 1
+19 752 1
+19 753 1
+19 754 1
+19 755 1
+19 756 1
+19 772 1
+19 773 1
+19 774 1
+19 775 1
+19 776 1
+19 777 1
+19 778 1
+19 779 1
+19 780 1
+19 781 1
+19 782 1
+19 783 1
+19 784 1
+19 785 1
+19 786 1
+19 1717 1
+19 1724 1
+19 1725 1
+19 1726 1
+19 1727 1
+19 1728 1
+19 1729 1
+19 1745 1
+19 1746 1
+19 1747 1
+19 1748 1
+19 1749 1
+19 1750 1
+19 1766 1
+19 1767 1
+19 1768 1
+19 1769 1
+19 1770 1
+19 1771 1
+19 1772 1
+19 1773 1
+19 1774 1
+19 1775 1
+19 1776 1
+19 1777 1
+19 1778 1
+19 1779 1
+19 1780 1
+19 1801 1
+19 1802 1
+19 1803 1
+19 1804 1
+19 1805 1
+19 1806 1
+19 1822 1
+19 1823 1
+19 1824 1
+19 1825 1
+19 1826 1
+19 1827 1
+19 1828 1
+19 1829 1
+19 1830 1
+19 1831 1
+19 1832 1
+19 1833 1
+19 1834 1
+19 1835 1
+19 1836 1
+19 1857 1
+19 1858 1
+19 1859 1
+19 1860 1
+19 1861 1
+19 1862 1
+19 1863 1
+19 1864 1
+19 1865 1
+19 1866 1
+19 1867 1
+19 1868 1
+19 1869 1
+19 1870 1
+19 1871 1
+19 1892 1
+19 1893 1
+19 1894 1
+19 1895 1
+19 1896 1
+19 1897 1
+19 1898 1
+19 1899 1
+19 1900 1
+19 1901 1
+19 1902 1
+19 1903 1
+19 1904 1
+19 1905 1
+19 1906 1
+19 1907 1
+19 1908 1
+19 1909 1
+19 1910 1
+19 1911 1
+19 1927 1
+19 1928 1
+19 1929 1
+19 1930 1
+19 1931 1
+19 1932 1
+19 1948 1
+19 1949 1
+19 1950 1
+19 1951 1
+19 1952 1
+19 1953 1
+19 1954 1
+19 1955 1
+19 1956 1
+19 1957 1
+19 1958 1
+19 1959 1
+19 1960 1
+19 1961 1
+19 1962 1
+19 1983 1
+19 1984 1
+19 1985 1
+19 1986 1
+19 1987 1
+19 1988 1
+19 1989 1
+19 1990 1
+19 1991 1
+19 1992 1
+19 1993 1
+19 1994 1
+19 1995 1
+19 1996 1
+19 1997 1
+19 2018 1
+19 2019 1
+19 2020 1
+19 2021 1
+19 2022 1
+19 2023 1
+19 2024 1
+19 2025 1
+19 2026 1
+19 2027 1
+19 2028 1
+19 2029 1
+19 2030 1
+19 2031 1
+19 2032 1
+19 2033 1
+19 2034 1
+19 2035 1
+19 2036 1
+19 2037 1
+19 2053 1
+19 2054 1
+19 2055 1
+19 2056 1
+19 2057 1
+19 2058 1
+19 2059 1
+19 2060 1
+19 2061 1
+19 2062 1
+19 2063 1
+19 2064 1
+19 2065 1
+19 2066 1
+19 2067 1
+19 2088 1
+19 2089 1
+19 2090 1
+19 2091 1
+19 2092 1
+19 2093 1
+19 2094 1
+19 2095 1
+19 2096 1
+19 2097 1
+19 2098 1
+19 2099 1
+19 2100 1
+19 2101 1
+19 2102 1
+19 2103 1
+19 2104 1
+19 2105 1
+19 2106 1
+19 2107 1
+19 2123 1
+19 2124 1
+19 2125 1
+19 2126 1
+19 2127 1
+19 2128 1
+19 2129 1
+19 2130 1
+19 2131 1
+19 2132 1
+19 2133 1
+19 2134 1
+19 2135 1
+19 2136 1
+19 2137 1
+19 2138 1
+19 2139 1
+19 2140 1
+19 2141 1
+19 2142 1
+19 2158 1
+19 2159 1
+19 2160 1
+19 2161 1
+19 2162 1
+19 2163 1
+19 2164 1
+19 2165 1
+19 2166 1
+19 2167 1
+19 2168 1
+19 2169 1
+19 2170 1
+19 2171 1
+19 2172 1
+19 2179 1
+19 2180 1
+19 2181 1
+19 2182 1
+19 2183 1
+19 2184 1
+19 2200 1
+19 2201 1
+19 2202 1
+19 2203 1
+19 2204 1
+19 2205 1
+19 2206 1
+19 2207 1
+19 2208 1
+19 2209 1
+19 2210 1
+19 2211 1
+19 2212 1
+19 2213 1
+19 2214 1
+19 2235 1
+19 2236 1
+19 2237 1
+19 2238 1
+19 2239 1
+19 2240 1
+19 2241 1
+19 2242 1
+19 2243 1
+19 2244 1
+19 2245 1
+19 2246 1
+19 2247 1
+19 2248 1
+19 2249 1
+19 2270 1
+19 2271 1
+19 2272 1
+19 2273 1
+19 2274 1
+19 2275 1
+19 2276 1
+19 2277 1
+19 2278 1
+19 2279 1
+19 2280 1
+19 2281 1
+19 2282 1
+19 2283 1
+19 2284 1
+19 2285 1
+19 2286 1
+19 2287 1
+19 2288 1
+19 2289 1
+19 2305 1
+19 2306 1
+19 2307 1
+19 2308 1
+19 2309 1
+19 2310 1
+19 2311 1
+19 2312 1
+19 2313 1
+19 2314 1
+19 2315 1
+19 2316 1
+19 2317 1
+19 2318 1
+19 2319 1
+19 2340 1
+19 2341 1
+19 2342 1
+19 2343 1
+19 2344 1
+19 2345 1
+19 2346 1
+19 2347 1
+19 2348 1
+19 2349 1
+19 2350 1
+19 2351 1
+19 2352 1
+19 2353 1
+19 2354 1
+19 2355 1
+19 2356 1
+19 2357 1
+19 2358 1
+19 2359 1
+19 2375 1
+19 2376 1
+19 2377 1
+19 2378 1
+19 2379 1
+19 2380 1
+19 2381 1
+19 2382 1
+19 2383 1
+19 2384 1
+19 2385 1
+19 2386 1
+19 2387 1
+19 2388 1
+19 2389 1
+19 2390 1
+19 2391 1
+19 2392 1
+19 2393 1
+19 2394 1
+19 2410 1
+19 2411 1
+19 2412 1
+19 2413 1
+19 2414 1
+19 2415 1
+19 2416 1
+19 2417 1
+19 2418 1
+19 2419 1
+19 2420 1
+19 2421 1
+19 2422 1
+19 2423 1
+19 2424 1
+19 2431 1
+19 2432 1
+19 2433 1
+19 2434 1
+19 2435 1
+19 2436 1
+19 2437 1
+19 2438 1
+19 2439 1
+19 2440 1
+19 2441 1
+19 2442 1
+19 2443 1
+19 2444 1
+19 2445 1
+19 2466 1
+19 2467 1
+19 2468 1
+19 2469 1
+19 2470 1
+19 2471 1
+19 2472 1
+19 2473 1
+19 2474 1
+19 2475 1
+19 2476 1
+19 2477 1
+19 2478 1
+19 2479 1
+19 2480 1
+19 2481 1
+19 2482 1
+19 2483 1
+19 2484 1
+19 2485 1
+19 2501 1
+19 2502 1
+19 2503 1
+19 2504 1
+19 2505 1
+19 2506 1
+19 2507 1
+19 2508 1
+19 2509 1
+19 2510 1
+19 2511 1
+19 2512 1
+19 2513 1
+19 2514 1
+19 2515 1
+19 2516 1
+19 2517 1
+19 2518 1
+19 2519 1
+19 2520 1
+19 2536 1
+19 2537 1
+19 2538 1
+19 2539 1
+19 2540 1
+19 2541 1
+19 2542 1
+19 2543 1
+19 2544 1
+19 2545 1
+19 2546 1
+19 2547 1
+19 2548 1
+19 2549 1
+19 2550 1
+19 2557 1
+19 2558 1
+19 2559 1
+19 2560 1
+19 2561 1
+19 2562 1
+19 2563 1
+19 2564 1
+19 2565 1
+19 2566 1
+19 2567 1
+19 2568 1
+19 2569 1
+19 2570 1
+19 2571 1
+19 2572 1
+19 2573 1
+19 2574 1
+19 2575 1
+19 2576 1
+19 2592 1
+19 2593 1
+19 2594 1
+19 2595 1
+19 2596 1
+19 2597 1
+19 2598 1
+19 2599 1
+19 2600 1
+19 2601 1
+19 2602 1
+19 2603 1
+19 2604 1
+19 2605 1
+19 2606 1
+19 2613 1
+19 2614 1
+19 2615 1
+19 2616 1
+19 2617 1
+19 2618 1
+19 2619 1
+19 2620 1
+19 2621 1
+19 2622 1
+19 2623 1
+19 2624 1
+19 2625 1
+19 2626 1
+19 2627 1
+19 2634 1
+19 2635 1
+19 2636 1
+19 2637 1
+19 2638 1
+19 2639 1
+20 3 1
+20 10 1
+20 16 1
+20 22 1
+20 23 1
+20 24 1
+20 25 1
+20 26 1
+20 38 1
+20 44 1
+20 50 1
+20 51 1
+20 52 1
+20 53 1
+20 54 1
+20 65 1
+20 71 1
+20 72 1
+20 73 1
+20 74 1
+20 75 1
+20 86 1
+20 87 1
+20 88 1
+20 89 1
+20 90 1
+20 101 1
+20 102 1
+20 103 1
+20 104 1
+20 105 1
+20 106 1
+20 107 1
+20 108 1
+20 109 1
+20 110 1
+20 122 1
+20 128 1
+20 134 1
+20 135 1
+20 136 1
+20 137 1
+20 138 1
+20 149 1
+20 155 1
+20 156 1
+20 157 1
+20 158 1
+20 159 1
+20 170 1
+20 171 1
+20 172 1
+20 173 1
+20 174 1
+20 185 1
+20 186 1
+20 187 1
+20 188 1
+20 189 1
+20 190 1
+20 191 1
+20 192 1
+20 193 1
+20 194 1
+20 205 1
+20 211 1
+20 212 1
+20 213 1
+20 214 1
+20 215 1
+20 226 1
+20 227 1
+20 228 1
+20 229 1
+20 230 1
+20 241 1
+20 242 1
+20 243 1
+20 244 1
+20 245 1
+20 246 1
+20 247 1
+20 248 1
+20 249 1
+20 250 1
+20 261 1
+20 262 1
+20 263 1
+20 264 1
+20 265 1
+20 276 1
+20 277 1
+20 278 1
+20 279 1
+20 280 1
+20 281 1
+20 282 1
+20 283 1
+20 284 1
+20 285 1
+20 296 1
+20 297 1
+20 298 1
+20 299 1
+20 300 1
+20 301 1
+20 302 1
+20 303 1
+20 304 1
+20 305 1
+20 316 1
+20 317 1
+20 318 1
+20 319 1
+20 320 1
+20 321 1
+20 322 1
+20 323 1
+20 324 1
+20 325 1
+20 332 1
+20 338 1
+20 344 1
+20 345 1
+20 346 1
+20 347 1
+20 348 1
+20 359 1
+20 365 1
+20 366 1
+20 367 1
+20 368 1
+20 369 1
+20 380 1
+20 381 1
+20 382 1
+20 383 1
+20 384 1
+20 395 1
+20 396 1
+20 397 1
+20 398 1
+20 399 1
+20 400 1
+20 401 1
+20 402 1
+20 403 1
+20 404 1
+20 415 1
+20 421 1
+20 422 1
+20 423 1
+20 424 1
+20 425 1
+20 436 1
+20 437 1
+20 438 1
+20 439 1
+20 440 1
+20 451 1
+20 452 1
+20 453 1
+20 454 1
+20 455 1
+20 456 1
+20 457 1
+20 458 1
+20 459 1
+20 460 1
+20 471 1
+20 472 1
+20 473 1
+20 474 1
+20 475 1
+20 486 1
+20 487 1
+20 488 1
+20 489 1
+20 490 1
+20 491 1
+20 492 1
+20 493 1
+20 494 1
+20 495 1
+20 506 1
+20 507 1
+20 508 1
+20 509 1
+20 510 1
+20 511 1
+20 512 1
+20 513 1
+20 514 1
+20 515 1
+20 526 1
+20 527 1
+20 528 1
+20 529 1
+20 530 1
+20 531 1
+20 532 1
+20 533 1
+20 534 1
+20 535 1
+20 541 1
+20 547 1
+20 548 1
+20 549 1
+20 550 1
+20 551 1
+20 562 1
+20 563 1
+20 564 1
+20 565 1
+20 566 1
+20 577 1
+20 578 1
+20 579 1
+20 580 1
+20 581 1
+20 582 1
+20 583 1
+20 584 1
+20 585 1
+20 586 1
+20 597 1
+20 598 1
+20 599 1
+20 600 1
+20 601 1
+20 612 1
+20 613 1
+20 614 1
+20 615 1
+20 616 1
+20 617 1
+20 618 1
+20 619 1
+20 620 1
+20 621 1
+20 632 1
+20 633 1
+20 634 1
+20 635 1
+20 636 1
+20 637 1
+20 638 1
+20 639 1
+20 640 1
+20 641 1
+20 652 1
+20 653 1
+20 654 1
+20 655 1
+20 656 1
+20 657 1
+20 658 1
+20 659 1
+20 660 1
+20 661 1
+20 667 1
+20 668 1
+20 669 1
+20 670 1
+20 671 1
+20 682 1
+20 683 1
+20 684 1
+20 685 1
+20 686 1
+20 687 1
+20 688 1
+20 689 1
+20 690 1
+20 691 1
+20 702 1
+20 703 1
+20 704 1
+20 705 1
+20 706 1
+20 707 1
+20 708 1
+20 709 1
+20 710 1
+20 711 1
+20 722 1
+20 723 1
+20 724 1
+20 725 1
+20 726 1
+20 727 1
+20 728 1
+20 729 1
+20 730 1
+20 731 1
+20 737 1
+20 738 1
+20 739 1
+20 740 1
+20 741 1
+20 742 1
+20 743 1
+20 744 1
+20 745 1
+20 746 1
+20 757 1
+20 758 1
+20 759 1
+20 760 1
+20 761 1
+20 762 1
+20 763 1
+20 764 1
+20 765 1
+20 766 1
+20 772 1
+20 773 1
+20 774 1
+20 775 1
+20 776 1
+20 777 1
+20 778 1
+20 779 1
+20 780 1
+20 781 1
+20 787 1
+20 788 1
+20 789 1
+20 790 1
+20 791 1
+20 1718 1
+20 1724 1
+20 1730 1
+20 1731 1
+20 1732 1
+20 1733 1
+20 1734 1
+20 1745 1
+20 1751 1
+20 1752 1
+20 1753 1
+20 1754 1
+20 1755 1
+20 1766 1
+20 1767 1
+20 1768 1
+20 1769 1
+20 1770 1
+20 1781 1
+20 1782 1
+20 1783 1
+20 1784 1
+20 1785 1
+20 1786 1
+20 1787 1
+20 1788 1
+20 1789 1
+20 1790 1
+20 1801 1
+20 1807 1
+20 1808 1
+20 1809 1
+20 1810 1
+20 1811 1
+20 1822 1
+20 1823 1
+20 1824 1
+20 1825 1
+20 1826 1
+20 1837 1
+20 1838 1
+20 1839 1
+20 1840 1
+20 1841 1
+20 1842 1
+20 1843 1
+20 1844 1
+20 1845 1
+20 1846 1
+20 1857 1
+20 1858 1
+20 1859 1
+20 1860 1
+20 1861 1
+20 1872 1
+20 1873 1
+20 1874 1
+20 1875 1
+20 1876 1
+20 1877 1
+20 1878 1
+20 1879 1
+20 1880 1
+20 1881 1
+20 1892 1
+20 1893 1
+20 1894 1
+20 1895 1
+20 1896 1
+20 1897 1
+20 1898 1
+20 1899 1
+20 1900 1
+20 1901 1
+20 1912 1
+20 1913 1
+20 1914 1
+20 1915 1
+20 1916 1
+20 1917 1
+20 1918 1
+20 1919 1
+20 1920 1
+20 1921 1
+20 1927 1
+20 1933 1
+20 1934 1
+20 1935 1
+20 1936 1
+20 1937 1
+20 1948 1
+20 1949 1
+20 1950 1
+20 1951 1
+20 1952 1
+20 1963 1
+20 1964 1
+20 1965 1
+20 1966 1
+20 1967 1
+20 1968 1
+20 1969 1
+20 1970 1
+20 1971 1
+20 1972 1
+20 1983 1
+20 1984 1
+20 1985 1
+20 1986 1
+20 1987 1
+20 1998 1
+20 1999 1
+20 2000 1
+20 2001 1
+20 2002 1
+20 2003 1
+20 2004 1
+20 2005 1
+20 2006 1
+20 2007 1
+20 2018 1
+20 2019 1
+20 2020 1
+20 2021 1
+20 2022 1
+20 2023 1
+20 2024 1
+20 2025 1
+20 2026 1
+20 2027 1
+20 2038 1
+20 2039 1
+20 2040 1
+20 2041 1
+20 2042 1
+20 2043 1
+20 2044 1
+20 2045 1
+20 2046 1
+20 2047 1
+20 2053 1
+20 2054 1
+20 2055 1
+20 2056 1
+20 2057 1
+20 2068 1
+20 2069 1
+20 2070 1
+20 2071 1
+20 2072 1
+20 2073 1
+20 2074 1
+20 2075 1
+20 2076 1
+20 2077 1
+20 2088 1
+20 2089 1
+20 2090 1
+20 2091 1
+20 2092 1
+20 2093 1
+20 2094 1
+20 2095 1
+20 2096 1
+20 2097 1
+20 2108 1
+20 2109 1
+20 2110 1
+20 2111 1
+20 2112 1
+20 2113 1
+20 2114 1
+20 2115 1
+20 2116 1
+20 2117 1
+20 2123 1
+20 2124 1
+20 2125 1
+20 2126 1
+20 2127 1
+20 2128 1
+20 2129 1
+20 2130 1
+20 2131 1
+20 2132 1
+20 2143 1
+20 2144 1
+20 2145 1
+20 2146 1
+20 2147 1
+20 2148 1
+20 2149 1
+20 2150 1
+20 2151 1
+20 2152 1
+20 2158 1
+20 2159 1
+20 2160 1
+20 2161 1
+20 2162 1
+20 2163 1
+20 2164 1
+20 2165 1
+20 2166 1
+20 2167 1
+20 2173 1
+20 2174 1
+20 2175 1
+20 2176 1
+20 2177 1
+20 2179 1
+20 2185 1
+20 2186 1
+20 2187 1
+20 2188 1
+20 2189 1
+20 2200 1
+20 2201 1
+20 2202 1
+20 2203 1
+20 2204 1
+20 2215 1
+20 2216 1
+20 2217 1
+20 2218 1
+20 2219 1
+20 2220 1
+20 2221 1
+20 2222 1
+20 2223 1
+20 2224 1
+20 2235 1
+20 2236 1
+20 2237 1
+20 2238 1
+20 2239 1
+20 2250 1
+20 2251 1
+20 2252 1
+20 2253 1
+20 2254 1
+20 2255 1
+20 2256 1
+20 2257 1
+20 2258 1
+20 2259 1
+20 2270 1
+20 2271 1
+20 2272 1
+20 2273 1
+20 2274 1
+20 2275 1
+20 2276 1
+20 2277 1
+20 2278 1
+20 2279 1
+20 2290 1
+20 2291 1
+20 2292 1
+20 2293 1
+20 2294 1
+20 2295 1
+20 2296 1
+20 2297 1
+20 2298 1
+20 2299 1
+20 2305 1
+20 2306 1
+20 2307 1
+20 2308 1
+20 2309 1
+20 2320 1
+20 2321 1
+20 2322 1
+20 2323 1
+20 2324 1
+20 2325 1
+20 2326 1
+20 2327 1
+20 2328 1
+20 2329 1
+20 2340 1
+20 2341 1
+20 2342 1
+20 2343 1
+20 2344 1
+20 2345 1
+20 2346 1
+20 2347 1
+20 2348 1
+20 2349 1
+20 2360 1
+20 2361 1
+20 2362 1
+20 2363 1
+20 2364 1
+20 2365 1
+20 2366 1
+20 2367 1
+20 2368 1
+20 2369 1
+20 2375 1
+20 2376 1
+20 2377 1
+20 2378 1
+20 2379 1
+20 2380 1
+20 2381 1
+20 2382 1
+20 2383 1
+20 2384 1
+20 2395 1
+20 2396 1
+20 2397 1
+20 2398 1
+20 2399 1
+20 2400 1
+20 2401 1
+20 2402 1
+20 2403 1
+20 2404 1
+20 2410 1
+20 2411 1
+20 2412 1
+20 2413 1
+20 2414 1
+20 2415 1
+20 2416 1
+20 2417 1
+20 2418 1
+20 2419 1
+20 2425 1
+20 2426 1
+20 2427 1
+20 2428 1
+20 2429 1
+20 2431 1
+20 2432 1
+20 2433 1
+20 2434 1
+20 2435 1
+20 2446 1
+20 2447 1
+20 2448 1
+20 2449 1
+20 2450 1
+20 2451 1
+20 2452 1
+20 2453 1
+20 2454 1
+20 2455 1
+20 2466 1
+20 2467 1
+20 2468 1
+20 2469 1
+20 2470 1
+20 2471 1
+20 2472 1
+20 2473 1
+20 2474 1
+20 2475 1
+20 2486 1
+20 2487 1
+20 2488 1
+20 2489 1
+20 2490 1
+20 2491 1
+20 2492 1
+20 2493 1
+20 2494 1
+20 2495 1
+20 2501 1
+20 2502 1
+20 2503 1
+20 2504 1
+20 2505 1
+20 2506 1
+20 2507 1
+20 2508 1
+20 2509 1
+20 2510 1
+20 2521 1
+20 2522 1
+20 2523 1
+20 2524 1
+20 2525 1
+20 2526 1
+20 2527 1
+20 2528 1
+20 2529 1
+20 2530 1
+20 2536 1
+20 2537 1
+20 2538 1
+20 2539 1
+20 2540 1
+20 2541 1
+20 2542 1
+20 2543 1
+20 2544 1
+20 2545 1
+20 2551 1
+20 2552 1
+20 2553 1
+20 2554 1
+20 2555 1
+20 2557 1
+20 2558 1
+20 2559 1
+20 2560 1
+20 2561 1
+20 2562 1
+20 2563 1
+20 2564 1
+20 2565 1
+20 2566 1
+20 2577 1
+20 2578 1
+20 2579 1
+20 2580 1
+20 2581 1
+20 2582 1
+20 2583 1
+20 2584 1
+20 2585 1
+20 2586 1
+20 2592 1
+20 2593 1
+20 2594 1
+20 2595 1
+20 2596 1
+20 2597 1
+20 2598 1
+20 2599 1
+20 2600 1
+20 2601 1
+20 2607 1
+20 2608 1
+20 2609 1
+20 2610 1
+20 2611 1
+20 2613 1
+20 2614 1
+20 2615 1
+20 2616 1
+20 2617 1
+20 2618 1
+20 2619 1
+20 2620 1
+20 2621 1
+20 2622 1
+20 2628 1
+20 2629 1
+20 2630 1
+20 2631 1
+20 2632 1
+20 2634 1
+20 2635 1
+20 2636 1
+20 2637 1
+20 2638 1
+20 2640 1
+21 4 1
+21 11 1
+21 17 1
+21 22 1
+21 27 1
+21 28 1
+21 29 1
+21 30 1
+21 39 1
+21 45 1
+21 50 1
+21 55 1
+21 56 1
+21 57 1
+21 58 1
+21 66 1
+21 71 1
+21 76 1
+21 77 1
+21 78 1
+21 79 1
+21 86 1
+21 91 1
+21 92 1
+21 93 1
+21 94 1
+21 101 1
+21 102 1
+21 103 1
+21 104 1
+21 111 1
+21 112 1
+21 113 1
+21 114 1
+21 115 1
+21 116 1
+21 123 1
+21 129 1
+21 134 1
+21 139 1
+21 140 1
+21 141 1
+21 142 1
+21 150 1
+21 155 1
+21 160 1
+21 161 1
+21 162 1
+21 163 1
+21 170 1
+21 175 1
+21 176 1
+21 177 1
+21 178 1
+21 185 1
+21 186 1
+21 187 1
+21 188 1
+21 195 1
+21 196 1
+21 197 1
+21 198 1
+21 199 1
+21 200 1
+21 206 1
+21 211 1
+21 216 1
+21 217 1
+21 218 1
+21 219 1
+21 226 1
+21 231 1
+21 232 1
+21 233 1
+21 234 1
+21 241 1
+21 242 1
+21 243 1
+21 244 1
+21 251 1
+21 252 1
+21 253 1
+21 254 1
+21 255 1
+21 256 1
+21 261 1
+21 266 1
+21 267 1
+21 268 1
+21 269 1
+21 276 1
+21 277 1
+21 278 1
+21 279 1
+21 286 1
+21 287 1
+21 288 1
+21 289 1
+21 290 1
+21 291 1
+21 296 1
+21 297 1
+21 298 1
+21 299 1
+21 306 1
+21 307 1
+21 308 1
+21 309 1
+21 310 1
+21 311 1
+21 316 1
+21 317 1
+21 318 1
+21 319 1
+21 320 1
+21 321 1
+21 326 1
+21 327 1
+21 328 1
+21 329 1
+21 333 1
+21 339 1
+21 344 1
+21 349 1
+21 350 1
+21 351 1
+21 352 1
+21 360 1
+21 365 1
+21 370 1
+21 371 1
+21 372 1
+21 373 1
+21 380 1
+21 385 1
+21 386 1
+21 387 1
+21 388 1
+21 395 1
+21 396 1
+21 397 1
+21 398 1
+21 405 1
+21 406 1
+21 407 1
+21 408 1
+21 409 1
+21 410 1
+21 416 1
+21 421 1
+21 426 1
+21 427 1
+21 428 1
+21 429 1
+21 436 1
+21 441 1
+21 442 1
+21 443 1
+21 444 1
+21 451 1
+21 452 1
+21 453 1
+21 454 1
+21 461 1
+21 462 1
+21 463 1
+21 464 1
+21 465 1
+21 466 1
+21 471 1
+21 476 1
+21 477 1
+21 478 1
+21 479 1
+21 486 1
+21 487 1
+21 488 1
+21 489 1
+21 496 1
+21 497 1
+21 498 1
+21 499 1
+21 500 1
+21 501 1
+21 506 1
+21 507 1
+21 508 1
+21 509 1
+21 516 1
+21 517 1
+21 518 1
+21 519 1
+21 520 1
+21 521 1
+21 526 1
+21 527 1
+21 528 1
+21 529 1
+21 530 1
+21 531 1
+21 536 1
+21 537 1
+21 538 1
+21 539 1
+21 542 1
+21 547 1
+21 552 1
+21 553 1
+21 554 1
+21 555 1
+21 562 1
+21 567 1
+21 568 1
+21 569 1
+21 570 1
+21 577 1
+21 578 1
+21 579 1
+21 580 1
+21 587 1
+21 588 1
+21 589 1
+21 590 1
+21 591 1
+21 592 1
+21 597 1
+21 602 1
+21 603 1
+21 604 1
+21 605 1
+21 612 1
+21 613 1
+21 614 1
+21 615 1
+21 622 1
+21 623 1
+21 624 1
+21 625 1
+21 626 1
+21 627 1
+21 632 1
+21 633 1
+21 634 1
+21 635 1
+21 642 1
+21 643 1
+21 644 1
+21 645 1
+21 646 1
+21 647 1
+21 652 1
+21 653 1
+21 654 1
+21 655 1
+21 656 1
+21 657 1
+21 662 1
+21 663 1
+21 664 1
+21 665 1
+21 667 1
+21 672 1
+21 673 1
+21 674 1
+21 675 1
+21 682 1
+21 683 1
+21 684 1
+21 685 1
+21 692 1
+21 693 1
+21 694 1
+21 695 1
+21 696 1
+21 697 1
+21 702 1
+21 703 1
+21 704 1
+21 705 1
+21 712 1
+21 713 1
+21 714 1
+21 715 1
+21 716 1
+21 717 1
+21 722 1
+21 723 1
+21 724 1
+21 725 1
+21 726 1
+21 727 1
+21 732 1
+21 733 1
+21 734 1
+21 735 1
+21 737 1
+21 738 1
+21 739 1
+21 740 1
+21 747 1
+21 748 1
+21 749 1
+21 750 1
+21 751 1
+21 752 1
+21 757 1
+21 758 1
+21 759 1
+21 760 1
+21 761 1
+21 762 1
+21 767 1
+21 768 1
+21 769 1
+21 770 1
+21 772 1
+21 773 1
+21 774 1
+21 775 1
+21 776 1
+21 777 1
+21 782 1
+21 783 1
+21 784 1
+21 785 1
+21 787 1
+21 788 1
+21 789 1
+21 790 1
+21 792 1
+21 1719 1
+21 1725 1
+21 1730 1
+21 1735 1
+21 1736 1
+21 1737 1
+21 1738 1
+21 1746 1
+21 1751 1
+21 1756 1
+21 1757 1
+21 1758 1
+21 1759 1
+21 1766 1
+21 1771 1
+21 1772 1
+21 1773 1
+21 1774 1
+21 1781 1
+21 1782 1
+21 1783 1
+21 1784 1
+21 1791 1
+21 1792 1
+21 1793 1
+21 1794 1
+21 1795 1
+21 1796 1
+21 1802 1
+21 1807 1
+21 1812 1
+21 1813 1
+21 1814 1
+21 1815 1
+21 1822 1
+21 1827 1
+21 1828 1
+21 1829 1
+21 1830 1
+21 1837 1
+21 1838 1
+21 1839 1
+21 1840 1
+21 1847 1
+21 1848 1
+21 1849 1
+21 1850 1
+21 1851 1
+21 1852 1
+21 1857 1
+21 1862 1
+21 1863 1
+21 1864 1
+21 1865 1
+21 1872 1
+21 1873 1
+21 1874 1
+21 1875 1
+21 1882 1
+21 1883 1
+21 1884 1
+21 1885 1
+21 1886 1
+21 1887 1
+21 1892 1
+21 1893 1
+21 1894 1
+21 1895 1
+21 1902 1
+21 1903 1
+21 1904 1
+21 1905 1
+21 1906 1
+21 1907 1
+21 1912 1
+21 1913 1
+21 1914 1
+21 1915 1
+21 1916 1
+21 1917 1
+21 1922 1
+21 1923 1
+21 1924 1
+21 1925 1
+21 1928 1
+21 1933 1
+21 1938 1
+21 1939 1
+21 1940 1
+21 1941 1
+21 1948 1
+21 1953 1
+21 1954 1
+21 1955 1
+21 1956 1
+21 1963 1
+21 1964 1
+21 1965 1
+21 1966 1
+21 1973 1
+21 1974 1
+21 1975 1
+21 1976 1
+21 1977 1
+21 1978 1
+21 1983 1
+21 1988 1
+21 1989 1
+21 1990 1
+21 1991 1
+21 1998 1
+21 1999 1
+21 2000 1
+21 2001 1
+21 2008 1
+21 2009 1
+21 2010 1
+21 2011 1
+21 2012 1
+21 2013 1
+21 2018 1
+21 2019 1
+21 2020 1
+21 2021 1
+21 2028 1
+21 2029 1
+21 2030 1
+21 2031 1
+21 2032 1
+21 2033 1
+21 2038 1
+21 2039 1
+21 2040 1
+21 2041 1
+21 2042 1
+21 2043 1
+21 2048 1
+21 2049 1
+21 2050 1
+21 2051 1
+21 2053 1
+21 2058 1
+21 2059 1
+21 2060 1
+21 2061 1
+21 2068 1
+21 2069 1
+21 2070 1
+21 2071 1
+21 2078 1
+21 2079 1
+21 2080 1
+21 2081 1
+21 2082 1
+21 2083 1
+21 2088 1
+21 2089 1
+21 2090 1
+21 2091 1
+21 2098 1
+21 2099 1
+21 2100 1
+21 2101 1
+21 2102 1
+21 2103 1
+21 2108 1
+21 2109 1
+21 2110 1
+21 2111 1
+21 2112 1
+21 2113 1
+21 2118 1
+21 2119 1
+21 2120 1
+21 2121 1
+21 2123 1
+21 2124 1
+21 2125 1
+21 2126 1
+21 2133 1
+21 2134 1
+21 2135 1
+21 2136 1
+21 2137 1
+21 2138 1
+21 2143 1
+21 2144 1
+21 2145 1
+21 2146 1
+21 2147 1
+21 2148 1
+21 2153 1
+21 2154 1
+21 2155 1
+21 2156 1
+21 2158 1
+21 2159 1
+21 2160 1
+21 2161 1
+21 2162 1
+21 2163 1
+21 2168 1
+21 2169 1
+21 2170 1
+21 2171 1
+21 2173 1
+21 2174 1
+21 2175 1
+21 2176 1
+21 2178 1
+21 2180 1
+21 2185 1
+21 2190 1
+21 2191 1
+21 2192 1
+21 2193 1
+21 2200 1
+21 2205 1
+21 2206 1
+21 2207 1
+21 2208 1
+21 2215 1
+21 2216 1
+21 2217 1
+21 2218 1
+21 2225 1
+21 2226 1
+21 2227 1
+21 2228 1
+21 2229 1
+21 2230 1
+21 2235 1
+21 2240 1
+21 2241 1
+21 2242 1
+21 2243 1
+21 2250 1
+21 2251 1
+21 2252 1
+21 2253 1
+21 2260 1
+21 2261 1
+21 2262 1
+21 2263 1
+21 2264 1
+21 2265 1
+21 2270 1
+21 2271 1
+21 2272 1
+21 2273 1
+21 2280 1
+21 2281 1
+21 2282 1
+21 2283 1
+21 2284 1
+21 2285 1
+21 2290 1
+21 2291 1
+21 2292 1
+21 2293 1
+21 2294 1
+21 2295 1
+21 2300 1
+21 2301 1
+21 2302 1
+21 2303 1
+21 2305 1
+21 2310 1
+21 2311 1
+21 2312 1
+21 2313 1
+21 2320 1
+21 2321 1
+21 2322 1
+21 2323 1
+21 2330 1
+21 2331 1
+21 2332 1
+21 2333 1
+21 2334 1
+21 2335 1
+21 2340 1
+21 2341 1
+21 2342 1
+21 2343 1
+21 2350 1
+21 2351 1
+21 2352 1
+21 2353 1
+21 2354 1
+21 2355 1
+21 2360 1
+21 2361 1
+21 2362 1
+21 2363 1
+21 2364 1
+21 2365 1
+21 2370 1
+21 2371 1
+21 2372 1
+21 2373 1
+21 2375 1
+21 2376 1
+21 2377 1
+21 2378 1
+21 2385 1
+21 2386 1
+21 2387 1
+21 2388 1
+21 2389 1
+21 2390 1
+21 2395 1
+21 2396 1
+21 2397 1
+21 2398 1
+21 2399 1
+21 2400 1
+21 2405 1
+21 2406 1
+21 2407 1
+21 2408 1
+21 2410 1
+21 2411 1
+21 2412 1
+21 2413 1
+21 2414 1
+21 2415 1
+21 2420 1
+21 2421 1
+21 2422 1
+21 2423 1
+21 2425 1
+21 2426 1
+21 2427 1
+21 2428 1
+21 2430 1
+21 2431 1
+21 2436 1
+21 2437 1
+21 2438 1
+21 2439 1
+21 2446 1
+21 2447 1
+21 2448 1
+21 2449 1
+21 2456 1
+21 2457 1
+21 2458 1
+21 2459 1
+21 2460 1
+21 2461 1
+21 2466 1
+21 2467 1
+21 2468 1
+21 2469 1
+21 2476 1
+21 2477 1
+21 2478 1
+21 2479 1
+21 2480 1
+21 2481 1
+21 2486 1
+21 2487 1
+21 2488 1
+21 2489 1
+21 2490 1
+21 2491 1
+21 2496 1
+21 2497 1
+21 2498 1
+21 2499 1
+21 2501 1
+21 2502 1
+21 2503 1
+21 2504 1
+21 2511 1
+21 2512 1
+21 2513 1
+21 2514 1
+21 2515 1
+21 2516 1
+21 2521 1
+21 2522 1
+21 2523 1
+21 2524 1
+21 2525 1
+21 2526 1
+21 2531 1
+21 2532 1
+21 2533 1
+21 2534 1
+21 2536 1
+21 2537 1
+21 2538 1
+21 2539 1
+21 2540 1
+21 2541 1
+21 2546 1
+21 2547 1
+21 2548 1
+21 2549 1
+21 2551 1
+21 2552 1
+21 2553 1
+21 2554 1
+21 2556 1
+21 2557 1
+21 2558 1
+21 2559 1
+21 2560 1
+21 2567 1
+21 2568 1
+21 2569 1
+21 2570 1
+21 2571 1
+21 2572 1
+21 2577 1
+21 2578 1
+21 2579 1
+21 2580 1
+21 2581 1
+21 2582 1
+21 2587 1
+21 2588 1
+21 2589 1
+21 2590 1
+21 2592 1
+21 2593 1
+21 2594 1
+21 2595 1
+21 2596 1
+21 2597 1
+21 2602 1
+21 2603 1
+21 2604 1
+21 2605 1
+21 2607 1
+21 2608 1
+21 2609 1
+21 2610 1
+21 2612 1
+21 2613 1
+21 2614 1
+21 2615 1
+21 2616 1
+21 2617 1
+21 2618 1
+21 2623 1
+21 2624 1
+21 2625 1
+21 2626 1
+21 2628 1
+21 2629 1
+21 2630 1
+21 2631 1
+21 2633 1
+21 2634 1
+21 2635 1
+21 2636 1
+21 2637 1
+21 2639 1
+21 2640 1
+22 5 1
+22 12 1
+22 18 1
+22 23 1
+22 27 1
+22 31 1
+22 32 1
+22 33 1
+22 40 1
+22 46 1
+22 51 1
+22 55 1
+22 59 1
+22 60 1
+22 61 1
+22 67 1
+22 72 1
+22 76 1
+22 80 1
+22 81 1
+22 82 1
+22 87 1
+22 91 1
+22 95 1
+22 96 1
+22 97 1
+22 101 1
+22 105 1
+22 106 1
+22 107 1
+22 111 1
+22 112 1
+22 113 1
+22 117 1
+22 118 1
+22 119 1
+22 124 1
+22 130 1
+22 135 1
+22 139 1
+22 143 1
+22 144 1
+22 145 1
+22 151 1
+22 156 1
+22 160 1
+22 164 1
+22 165 1
+22 166 1
+22 171 1
+22 175 1
+22 179 1
+22 180 1
+22 181 1
+22 185 1
+22 189 1
+22 190 1
+22 191 1
+22 195 1
+22 196 1
+22 197 1
+22 201 1
+22 202 1
+22 203 1
+22 207 1
+22 212 1
+22 216 1
+22 220 1
+22 221 1
+22 222 1
+22 227 1
+22 231 1
+22 235 1
+22 236 1
+22 237 1
+22 241 1
+22 245 1
+22 246 1
+22 247 1
+22 251 1
+22 252 1
+22 253 1
+22 257 1
+22 258 1
+22 259 1
+22 262 1
+22 266 1
+22 270 1
+22 271 1
+22 272 1
+22 276 1
+22 280 1
+22 281 1
+22 282 1
+22 286 1
+22 287 1
+22 288 1
+22 292 1
+22 293 1
+22 294 1
+22 296 1
+22 300 1
+22 301 1
+22 302 1
+22 306 1
+22 307 1
+22 308 1
+22 312 1
+22 313 1
+22 314 1
+22 316 1
+22 317 1
+22 318 1
+22 322 1
+22 323 1
+22 324 1
+22 326 1
+22 327 1
+22 328 1
+22 330 1
+22 334 1
+22 340 1
+22 345 1
+22 349 1
+22 353 1
+22 354 1
+22 355 1
+22 361 1
+22 366 1
+22 370 1
+22 374 1
+22 375 1
+22 376 1
+22 381 1
+22 385 1
+22 389 1
+22 390 1
+22 391 1
+22 395 1
+22 399 1
+22 400 1
+22 401 1
+22 405 1
+22 406 1
+22 407 1
+22 411 1
+22 412 1
+22 413 1
+22 417 1
+22 422 1
+22 426 1
+22 430 1
+22 431 1
+22 432 1
+22 437 1
+22 441 1
+22 445 1
+22 446 1
+22 447 1
+22 451 1
+22 455 1
+22 456 1
+22 457 1
+22 461 1
+22 462 1
+22 463 1
+22 467 1
+22 468 1
+22 469 1
+22 472 1
+22 476 1
+22 480 1
+22 481 1
+22 482 1
+22 486 1
+22 490 1
+22 491 1
+22 492 1
+22 496 1
+22 497 1
+22 498 1
+22 502 1
+22 503 1
+22 504 1
+22 506 1
+22 510 1
+22 511 1
+22 512 1
+22 516 1
+22 517 1
+22 518 1
+22 522 1
+22 523 1
+22 524 1
+22 526 1
+22 527 1
+22 528 1
+22 532 1
+22 533 1
+22 534 1
+22 536 1
+22 537 1
+22 538 1
+22 540 1
+22 543 1
+22 548 1
+22 552 1
+22 556 1
+22 557 1
+22 558 1
+22 563 1
+22 567 1
+22 571 1
+22 572 1
+22 573 1
+22 577 1
+22 581 1
+22 582 1
+22 583 1
+22 587 1
+22 588 1
+22 589 1
+22 593 1
+22 594 1
+22 595 1
+22 598 1
+22 602 1
+22 606 1
+22 607 1
+22 608 1
+22 612 1
+22 616 1
+22 617 1
+22 618 1
+22 622 1
+22 623 1
+22 624 1
+22 628 1
+22 629 1
+22 630 1
+22 632 1
+22 636 1
+22 637 1
+22 638 1
+22 642 1
+22 643 1
+22 644 1
+22 648 1
+22 649 1
+22 650 1
+22 652 1
+22 653 1
+22 654 1
+22 658 1
+22 659 1
+22 660 1
+22 662 1
+22 663 1
+22 664 1
+22 666 1
+22 668 1
+22 672 1
+22 676 1
+22 677 1
+22 678 1
+22 682 1
+22 686 1
+22 687 1
+22 688 1
+22 692 1
+22 693 1
+22 694 1
+22 698 1
+22 699 1
+22 700 1
+22 702 1
+22 706 1
+22 707 1
+22 708 1
+22 712 1
+22 713 1
+22 714 1
+22 718 1
+22 719 1
+22 720 1
+22 722 1
+22 723 1
+22 724 1
+22 728 1
+22 729 1
+22 730 1
+22 732 1
+22 733 1
+22 734 1
+22 736 1
+22 737 1
+22 741 1
+22 742 1
+22 743 1
+22 747 1
+22 748 1
+22 749 1
+22 753 1
+22 754 1
+22 755 1
+22 757 1
+22 758 1
+22 759 1
+22 763 1
+22 764 1
+22 765 1
+22 767 1
+22 768 1
+22 769 1
+22 771 1
+22 772 1
+22 773 1
+22 774 1
+22 778 1
+22 779 1
+22 780 1
+22 782 1
+22 783 1
+22 784 1
+22 786 1
+22 787 1
+22 788 1
+22 789 1
+22 791 1
+22 792 1
+22 1720 1
+22 1726 1
+22 1731 1
+22 1735 1
+22 1739 1
+22 1740 1
+22 1741 1
+22 1747 1
+22 1752 1
+22 1756 1
+22 1760 1
+22 1761 1
+22 1762 1
+22 1767 1
+22 1771 1
+22 1775 1
+22 1776 1
+22 1777 1
+22 1781 1
+22 1785 1
+22 1786 1
+22 1787 1
+22 1791 1
+22 1792 1
+22 1793 1
+22 1797 1
+22 1798 1
+22 1799 1
+22 1803 1
+22 1808 1
+22 1812 1
+22 1816 1
+22 1817 1
+22 1818 1
+22 1823 1
+22 1827 1
+22 1831 1
+22 1832 1
+22 1833 1
+22 1837 1
+22 1841 1
+22 1842 1
+22 1843 1
+22 1847 1
+22 1848 1
+22 1849 1
+22 1853 1
+22 1854 1
+22 1855 1
+22 1858 1
+22 1862 1
+22 1866 1
+22 1867 1
+22 1868 1
+22 1872 1
+22 1876 1
+22 1877 1
+22 1878 1
+22 1882 1
+22 1883 1
+22 1884 1
+22 1888 1
+22 1889 1
+22 1890 1
+22 1892 1
+22 1896 1
+22 1897 1
+22 1898 1
+22 1902 1
+22 1903 1
+22 1904 1
+22 1908 1
+22 1909 1
+22 1910 1
+22 1912 1
+22 1913 1
+22 1914 1
+22 1918 1
+22 1919 1
+22 1920 1
+22 1922 1
+22 1923 1
+22 1924 1
+22 1926 1
+22 1929 1
+22 1934 1
+22 1938 1
+22 1942 1
+22 1943 1
+22 1944 1
+22 1949 1
+22 1953 1
+22 1957 1
+22 1958 1
+22 1959 1
+22 1963 1
+22 1967 1
+22 1968 1
+22 1969 1
+22 1973 1
+22 1974 1
+22 1975 1
+22 1979 1
+22 1980 1
+22 1981 1
+22 1984 1
+22 1988 1
+22 1992 1
+22 1993 1
+22 1994 1
+22 1998 1
+22 2002 1
+22 2003 1
+22 2004 1
+22 2008 1
+22 2009 1
+22 2010 1
+22 2014 1
+22 2015 1
+22 2016 1
+22 2018 1
+22 2022 1
+22 2023 1
+22 2024 1
+22 2028 1
+22 2029 1
+22 2030 1
+22 2034 1
+22 2035 1
+22 2036 1
+22 2038 1
+22 2039 1
+22 2040 1
+22 2044 1
+22 2045 1
+22 2046 1
+22 2048 1
+22 2049 1
+22 2050 1
+22 2052 1
+22 2054 1
+22 2058 1
+22 2062 1
+22 2063 1
+22 2064 1
+22 2068 1
+22 2072 1
+22 2073 1
+22 2074 1
+22 2078 1
+22 2079 1
+22 2080 1
+22 2084 1
+22 2085 1
+22 2086 1
+22 2088 1
+22 2092 1
+22 2093 1
+22 2094 1
+22 2098 1
+22 2099 1
+22 2100 1
+22 2104 1
+22 2105 1
+22 2106 1
+22 2108 1
+22 2109 1
+22 2110 1
+22 2114 1
+22 2115 1
+22 2116 1
+22 2118 1
+22 2119 1
+22 2120 1
+22 2122 1
+22 2123 1
+22 2127 1
+22 2128 1
+22 2129 1
+22 2133 1
+22 2134 1
+22 2135 1
+22 2139 1
+22 2140 1
+22 2141 1
+22 2143 1
+22 2144 1
+22 2145 1
+22 2149 1
+22 2150 1
+22 2151 1
+22 2153 1
+22 2154 1
+22 2155 1
+22 2157 1
+22 2158 1
+22 2159 1
+22 2160 1
+22 2164 1
+22 2165 1
+22 2166 1
+22 2168 1
+22 2169 1
+22 2170 1
+22 2172 1
+22 2173 1
+22 2174 1
+22 2175 1
+22 2177 1
+22 2178 1
+22 2181 1
+22 2186 1
+22 2190 1
+22 2194 1
+22 2195 1
+22 2196 1
+22 2201 1
+22 2205 1
+22 2209 1
+22 2210 1
+22 2211 1
+22 2215 1
+22 2219 1
+22 2220 1
+22 2221 1
+22 2225 1
+22 2226 1
+22 2227 1
+22 2231 1
+22 2232 1
+22 2233 1
+22 2236 1
+22 2240 1
+22 2244 1
+22 2245 1
+22 2246 1
+22 2250 1
+22 2254 1
+22 2255 1
+22 2256 1
+22 2260 1
+22 2261 1
+22 2262 1
+22 2266 1
+22 2267 1
+22 2268 1
+22 2270 1
+22 2274 1
+22 2275 1
+22 2276 1
+22 2280 1
+22 2281 1
+22 2282 1
+22 2286 1
+22 2287 1
+22 2288 1
+22 2290 1
+22 2291 1
+22 2292 1
+22 2296 1
+22 2297 1
+22 2298 1
+22 2300 1
+22 2301 1
+22 2302 1
+22 2304 1
+22 2306 1
+22 2310 1
+22 2314 1
+22 2315 1
+22 2316 1
+22 2320 1
+22 2324 1
+22 2325 1
+22 2326 1
+22 2330 1
+22 2331 1
+22 2332 1
+22 2336 1
+22 2337 1
+22 2338 1
+22 2340 1
+22 2344 1
+22 2345 1
+22 2346 1
+22 2350 1
+22 2351 1
+22 2352 1
+22 2356 1
+22 2357 1
+22 2358 1
+22 2360 1
+22 2361 1
+22 2362 1
+22 2366 1
+22 2367 1
+22 2368 1
+22 2370 1
+22 2371 1
+22 2372 1
+22 2374 1
+22 2375 1
+22 2379 1
+22 2380 1
+22 2381 1
+22 2385 1
+22 2386 1
+22 2387 1
+22 2391 1
+22 2392 1
+22 2393 1
+22 2395 1
+22 2396 1
+22 2397 1
+22 2401 1
+22 2402 1
+22 2403 1
+22 2405 1
+22 2406 1
+22 2407 1
+22 2409 1
+22 2410 1
+22 2411 1
+22 2412 1
+22 2416 1
+22 2417 1
+22 2418 1
+22 2420 1
+22 2421 1
+22 2422 1
+22 2424 1
+22 2425 1
+22 2426 1
+22 2427 1
+22 2429 1
+22 2430 1
+22 2432 1
+22 2436 1
+22 2440 1
+22 2441 1
+22 2442 1
+22 2446 1
+22 2450 1
+22 2451 1
+22 2452 1
+22 2456 1
+22 2457 1
+22 2458 1
+22 2462 1
+22 2463 1
+22 2464 1
+22 2466 1
+22 2470 1
+22 2471 1
+22 2472 1
+22 2476 1
+22 2477 1
+22 2478 1
+22 2482 1
+22 2483 1
+22 2484 1
+22 2486 1
+22 2487 1
+22 2488 1
+22 2492 1
+22 2493 1
+22 2494 1
+22 2496 1
+22 2497 1
+22 2498 1
+22 2500 1
+22 2501 1
+22 2505 1
+22 2506 1
+22 2507 1
+22 2511 1
+22 2512 1
+22 2513 1
+22 2517 1
+22 2518 1
+22 2519 1
+22 2521 1
+22 2522 1
+22 2523 1
+22 2527 1
+22 2528 1
+22 2529 1
+22 2531 1
+22 2532 1
+22 2533 1
+22 2535 1
+22 2536 1
+22 2537 1
+22 2538 1
+22 2542 1
+22 2543 1
+22 2544 1
+22 2546 1
+22 2547 1
+22 2548 1
+22 2550 1
+22 2551 1
+22 2552 1
+22 2553 1
+22 2555 1
+22 2556 1
+22 2557 1
+22 2561 1
+22 2562 1
+22 2563 1
+22 2567 1
+22 2568 1
+22 2569 1
+22 2573 1
+22 2574 1
+22 2575 1
+22 2577 1
+22 2578 1
+22 2579 1
+22 2583 1
+22 2584 1
+22 2585 1
+22 2587 1
+22 2588 1
+22 2589 1
+22 2591 1
+22 2592 1
+22 2593 1
+22 2594 1
+22 2598 1
+22 2599 1
+22 2600 1
+22 2602 1
+22 2603 1
+22 2604 1
+22 2606 1
+22 2607 1
+22 2608 1
+22 2609 1
+22 2611 1
+22 2612 1
+22 2613 1
+22 2614 1
+22 2615 1
+22 2619 1
+22 2620 1
+22 2621 1
+22 2623 1
+22 2624 1
+22 2625 1
+22 2627 1
+22 2628 1
+22 2629 1
+22 2630 1
+22 2632 1
+22 2633 1
+22 2634 1
+22 2635 1
+22 2636 1
+22 2638 1
+22 2639 1
+22 2640 1
+23 6 1
+23 13 1
+23 19 1
+23 24 1
+23 28 1
+23 31 1
+23 34 1
+23 35 1
+23 41 1
+23 47 1
+23 52 1
+23 56 1
+23 59 1
+23 62 1
+23 63 1
+23 68 1
+23 73 1
+23 77 1
+23 80 1
+23 83 1
+23 84 1
+23 88 1
+23 92 1
+23 95 1
+23 98 1
+23 99 1
+23 102 1
+23 105 1
+23 108 1
+23 109 1
+23 111 1
+23 114 1
+23 115 1
+23 117 1
+23 118 1
+23 120 1
+23 125 1
+23 131 1
+23 136 1
+23 140 1
+23 143 1
+23 146 1
+23 147 1
+23 152 1
+23 157 1
+23 161 1
+23 164 1
+23 167 1
+23 168 1
+23 172 1
+23 176 1
+23 179 1
+23 182 1
+23 183 1
+23 186 1
+23 189 1
+23 192 1
+23 193 1
+23 195 1
+23 198 1
+23 199 1
+23 201 1
+23 202 1
+23 204 1
+23 208 1
+23 213 1
+23 217 1
+23 220 1
+23 223 1
+23 224 1
+23 228 1
+23 232 1
+23 235 1
+23 238 1
+23 239 1
+23 242 1
+23 245 1
+23 248 1
+23 249 1
+23 251 1
+23 254 1
+23 255 1
+23 257 1
+23 258 1
+23 260 1
+23 263 1
+23 267 1
+23 270 1
+23 273 1
+23 274 1
+23 277 1
+23 280 1
+23 283 1
+23 284 1
+23 286 1
+23 289 1
+23 290 1
+23 292 1
+23 293 1
+23 295 1
+23 297 1
+23 300 1
+23 303 1
+23 304 1
+23 306 1
+23 309 1
+23 310 1
+23 312 1
+23 313 1
+23 315 1
+23 316 1
+23 319 1
+23 320 1
+23 322 1
+23 323 1
+23 325 1
+23 326 1
+23 327 1
+23 329 1
+23 330 1
+23 335 1
+23 341 1
+23 346 1
+23 350 1
+23 353 1
+23 356 1
+23 357 1
+23 362 1
+23 367 1
+23 371 1
+23 374 1
+23 377 1
+23 378 1
+23 382 1
+23 386 1
+23 389 1
+23 392 1
+23 393 1
+23 396 1
+23 399 1
+23 402 1
+23 403 1
+23 405 1
+23 408 1
+23 409 1
+23 411 1
+23 412 1
+23 414 1
+23 418 1
+23 423 1
+23 427 1
+23 430 1
+23 433 1
+23 434 1
+23 438 1
+23 442 1
+23 445 1
+23 448 1
+23 449 1
+23 452 1
+23 455 1
+23 458 1
+23 459 1
+23 461 1
+23 464 1
+23 465 1
+23 467 1
+23 468 1
+23 470 1
+23 473 1
+23 477 1
+23 480 1
+23 483 1
+23 484 1
+23 487 1
+23 490 1
+23 493 1
+23 494 1
+23 496 1
+23 499 1
+23 500 1
+23 502 1
+23 503 1
+23 505 1
+23 507 1
+23 510 1
+23 513 1
+23 514 1
+23 516 1
+23 519 1
+23 520 1
+23 522 1
+23 523 1
+23 525 1
+23 526 1
+23 529 1
+23 530 1
+23 532 1
+23 533 1
+23 535 1
+23 536 1
+23 537 1
+23 539 1
+23 540 1
+23 544 1
+23 549 1
+23 553 1
+23 556 1
+23 559 1
+23 560 1
+23 564 1
+23 568 1
+23 571 1
+23 574 1
+23 575 1
+23 578 1
+23 581 1
+23 584 1
+23 585 1
+23 587 1
+23 590 1
+23 591 1
+23 593 1
+23 594 1
+23 596 1
+23 599 1
+23 603 1
+23 606 1
+23 609 1
+23 610 1
+23 613 1
+23 616 1
+23 619 1
+23 620 1
+23 622 1
+23 625 1
+23 626 1
+23 628 1
+23 629 1
+23 631 1
+23 633 1
+23 636 1
+23 639 1
+23 640 1
+23 642 1
+23 645 1
+23 646 1
+23 648 1
+23 649 1
+23 651 1
+23 652 1
+23 655 1
+23 656 1
+23 658 1
+23 659 1
+23 661 1
+23 662 1
+23 663 1
+23 665 1
+23 666 1
+23 669 1
+23 673 1
+23 676 1
+23 679 1
+23 680 1
+23 683 1
+23 686 1
+23 689 1
+23 690 1
+23 692 1
+23 695 1
+23 696 1
+23 698 1
+23 699 1
+23 701 1
+23 703 1
+23 706 1
+23 709 1
+23 710 1
+23 712 1
+23 715 1
+23 716 1
+23 718 1
+23 719 1
+23 721 1
+23 722 1
+23 725 1
+23 726 1
+23 728 1
+23 729 1
+23 731 1
+23 732 1
+23 733 1
+23 735 1
+23 736 1
+23 738 1
+23 741 1
+23 744 1
+23 745 1
+23 747 1
+23 750 1
+23 751 1
+23 753 1
+23 754 1
+23 756 1
+23 757 1
+23 760 1
+23 761 1
+23 763 1
+23 764 1
+23 766 1
+23 767 1
+23 768 1
+23 770 1
+23 771 1
+23 772 1
+23 775 1
+23 776 1
+23 778 1
+23 779 1
+23 781 1
+23 782 1
+23 783 1
+23 785 1
+23 786 1
+23 787 1
+23 788 1
+23 790 1
+23 791 1
+23 792 1
+23 1721 1
+23 1727 1
+23 1732 1
+23 1736 1
+23 1739 1
+23 1742 1
+23 1743 1
+23 1748 1
+23 1753 1
+23 1757 1
+23 1760 1
+23 1763 1
+23 1764 1
+23 1768 1
+23 1772 1
+23 1775 1
+23 1778 1
+23 1779 1
+23 1782 1
+23 1785 1
+23 1788 1
+23 1789 1
+23 1791 1
+23 1794 1
+23 1795 1
+23 1797 1
+23 1798 1
+23 1800 1
+23 1804 1
+23 1809 1
+23 1813 1
+23 1816 1
+23 1819 1
+23 1820 1
+23 1824 1
+23 1828 1
+23 1831 1
+23 1834 1
+23 1835 1
+23 1838 1
+23 1841 1
+23 1844 1
+23 1845 1
+23 1847 1
+23 1850 1
+23 1851 1
+23 1853 1
+23 1854 1
+23 1856 1
+23 1859 1
+23 1863 1
+23 1866 1
+23 1869 1
+23 1870 1
+23 1873 1
+23 1876 1
+23 1879 1
+23 1880 1
+23 1882 1
+23 1885 1
+23 1886 1
+23 1888 1
+23 1889 1
+23 1891 1
+23 1893 1
+23 1896 1
+23 1899 1
+23 1900 1
+23 1902 1
+23 1905 1
+23 1906 1
+23 1908 1
+23 1909 1
+23 1911 1
+23 1912 1
+23 1915 1
+23 1916 1
+23 1918 1
+23 1919 1
+23 1921 1
+23 1922 1
+23 1923 1
+23 1925 1
+23 1926 1
+23 1930 1
+23 1935 1
+23 1939 1
+23 1942 1
+23 1945 1
+23 1946 1
+23 1950 1
+23 1954 1
+23 1957 1
+23 1960 1
+23 1961 1
+23 1964 1
+23 1967 1
+23 1970 1
+23 1971 1
+23 1973 1
+23 1976 1
+23 1977 1
+23 1979 1
+23 1980 1
+23 1982 1
+23 1985 1
+23 1989 1
+23 1992 1
+23 1995 1
+23 1996 1
+23 1999 1
+23 2002 1
+23 2005 1
+23 2006 1
+23 2008 1
+23 2011 1
+23 2012 1
+23 2014 1
+23 2015 1
+23 2017 1
+23 2019 1
+23 2022 1
+23 2025 1
+23 2026 1
+23 2028 1
+23 2031 1
+23 2032 1
+23 2034 1
+23 2035 1
+23 2037 1
+23 2038 1
+23 2041 1
+23 2042 1
+23 2044 1
+23 2045 1
+23 2047 1
+23 2048 1
+23 2049 1
+23 2051 1
+23 2052 1
+23 2055 1
+23 2059 1
+23 2062 1
+23 2065 1
+23 2066 1
+23 2069 1
+23 2072 1
+23 2075 1
+23 2076 1
+23 2078 1
+23 2081 1
+23 2082 1
+23 2084 1
+23 2085 1
+23 2087 1
+23 2089 1
+23 2092 1
+23 2095 1
+23 2096 1
+23 2098 1
+23 2101 1
+23 2102 1
+23 2104 1
+23 2105 1
+23 2107 1
+23 2108 1
+23 2111 1
+23 2112 1
+23 2114 1
+23 2115 1
+23 2117 1
+23 2118 1
+23 2119 1
+23 2121 1
+23 2122 1
+23 2124 1
+23 2127 1
+23 2130 1
+23 2131 1
+23 2133 1
+23 2136 1
+23 2137 1
+23 2139 1
+23 2140 1
+23 2142 1
+23 2143 1
+23 2146 1
+23 2147 1
+23 2149 1
+23 2150 1
+23 2152 1
+23 2153 1
+23 2154 1
+23 2156 1
+23 2157 1
+23 2158 1
+23 2161 1
+23 2162 1
+23 2164 1
+23 2165 1
+23 2167 1
+23 2168 1
+23 2169 1
+23 2171 1
+23 2172 1
+23 2173 1
+23 2174 1
+23 2176 1
+23 2177 1
+23 2178 1
+23 2182 1
+23 2187 1
+23 2191 1
+23 2194 1
+23 2197 1
+23 2198 1
+23 2202 1
+23 2206 1
+23 2209 1
+23 2212 1
+23 2213 1
+23 2216 1
+23 2219 1
+23 2222 1
+23 2223 1
+23 2225 1
+23 2228 1
+23 2229 1
+23 2231 1
+23 2232 1
+23 2234 1
+23 2237 1
+23 2241 1
+23 2244 1
+23 2247 1
+23 2248 1
+23 2251 1
+23 2254 1
+23 2257 1
+23 2258 1
+23 2260 1
+23 2263 1
+23 2264 1
+23 2266 1
+23 2267 1
+23 2269 1
+23 2271 1
+23 2274 1
+23 2277 1
+23 2278 1
+23 2280 1
+23 2283 1
+23 2284 1
+23 2286 1
+23 2287 1
+23 2289 1
+23 2290 1
+23 2293 1
+23 2294 1
+23 2296 1
+23 2297 1
+23 2299 1
+23 2300 1
+23 2301 1
+23 2303 1
+23 2304 1
+23 2307 1
+23 2311 1
+23 2314 1
+23 2317 1
+23 2318 1
+23 2321 1
+23 2324 1
+23 2327 1
+23 2328 1
+23 2330 1
+23 2333 1
+23 2334 1
+23 2336 1
+23 2337 1
+23 2339 1
+23 2341 1
+23 2344 1
+23 2347 1
+23 2348 1
+23 2350 1
+23 2353 1
+23 2354 1
+23 2356 1
+23 2357 1
+23 2359 1
+23 2360 1
+23 2363 1
+23 2364 1
+23 2366 1
+23 2367 1
+23 2369 1
+23 2370 1
+23 2371 1
+23 2373 1
+23 2374 1
+23 2376 1
+23 2379 1
+23 2382 1
+23 2383 1
+23 2385 1
+23 2388 1
+23 2389 1
+23 2391 1
+23 2392 1
+23 2394 1
+23 2395 1
+23 2398 1
+23 2399 1
+23 2401 1
+23 2402 1
+23 2404 1
+23 2405 1
+23 2406 1
+23 2408 1
+23 2409 1
+23 2410 1
+23 2413 1
+23 2414 1
+23 2416 1
+23 2417 1
+23 2419 1
+23 2420 1
+23 2421 1
+23 2423 1
+23 2424 1
+23 2425 1
+23 2426 1
+23 2428 1
+23 2429 1
+23 2430 1
+23 2433 1
+23 2437 1
+23 2440 1
+23 2443 1
+23 2444 1
+23 2447 1
+23 2450 1
+23 2453 1
+23 2454 1
+23 2456 1
+23 2459 1
+23 2460 1
+23 2462 1
+23 2463 1
+23 2465 1
+23 2467 1
+23 2470 1
+23 2473 1
+23 2474 1
+23 2476 1
+23 2479 1
+23 2480 1
+23 2482 1
+23 2483 1
+23 2485 1
+23 2486 1
+23 2489 1
+23 2490 1
+23 2492 1
+23 2493 1
+23 2495 1
+23 2496 1
+23 2497 1
+23 2499 1
+23 2500 1
+23 2502 1
+23 2505 1
+23 2508 1
+23 2509 1
+23 2511 1
+23 2514 1
+23 2515 1
+23 2517 1
+23 2518 1
+23 2520 1
+23 2521 1
+23 2524 1
+23 2525 1
+23 2527 1
+23 2528 1
+23 2530 1
+23 2531 1
+23 2532 1
+23 2534 1
+23 2535 1
+23 2536 1
+23 2539 1
+23 2540 1
+23 2542 1
+23 2543 1
+23 2545 1
+23 2546 1
+23 2547 1
+23 2549 1
+23 2550 1
+23 2551 1
+23 2552 1
+23 2554 1
+23 2555 1
+23 2556 1
+23 2558 1
+23 2561 1
+23 2564 1
+23 2565 1
+23 2567 1
+23 2570 1
+23 2571 1
+23 2573 1
+23 2574 1
+23 2576 1
+23 2577 1
+23 2580 1
+23 2581 1
+23 2583 1
+23 2584 1
+23 2586 1
+23 2587 1
+23 2588 1
+23 2590 1
+23 2591 1
+23 2592 1
+23 2595 1
+23 2596 1
+23 2598 1
+23 2599 1
+23 2601 1
+23 2602 1
+23 2603 1
+23 2605 1
+23 2606 1
+23 2607 1
+23 2608 1
+23 2610 1
+23 2611 1
+23 2612 1
+23 2613 1
+23 2616 1
+23 2617 1
+23 2619 1
+23 2620 1
+23 2622 1
+23 2623 1
+23 2624 1
+23 2626 1
+23 2627 1
+23 2628 1
+23 2629 1
+23 2631 1
+23 2632 1
+23 2633 1
+23 2634 1
+23 2635 1
+23 2637 1
+23 2638 1
+23 2639 1
+23 2640 1
+24 7 1
+24 14 1
+24 20 1
+24 25 1
+24 29 1
+24 32 1
+24 34 1
+24 36 1
+24 42 1
+24 48 1
+24 53 1
+24 57 1
+24 60 1
+24 62 1
+24 64 1
+24 69 1
+24 74 1
+24 78 1
+24 81 1
+24 83 1
+24 85 1
+24 89 1
+24 93 1
+24 96 1
+24 98 1
+24 100 1
+24 103 1
+24 106 1
+24 108 1
+24 110 1
+24 112 1
+24 114 1
+24 116 1
+24 117 1
+24 119 1
+24 120 1
+24 126 1
+24 132 1
+24 137 1
+24 141 1
+24 144 1
+24 146 1
+24 148 1
+24 153 1
+24 158 1
+24 162 1
+24 165 1
+24 167 1
+24 169 1
+24 173 1
+24 177 1
+24 180 1
+24 182 1
+24 184 1
+24 187 1
+24 190 1
+24 192 1
+24 194 1
+24 196 1
+24 198 1
+24 200 1
+24 201 1
+24 203 1
+24 204 1
+24 209 1
+24 214 1
+24 218 1
+24 221 1
+24 223 1
+24 225 1
+24 229 1
+24 233 1
+24 236 1
+24 238 1
+24 240 1
+24 243 1
+24 246 1
+24 248 1
+24 250 1
+24 252 1
+24 254 1
+24 256 1
+24 257 1
+24 259 1
+24 260 1
+24 264 1
+24 268 1
+24 271 1
+24 273 1
+24 275 1
+24 278 1
+24 281 1
+24 283 1
+24 285 1
+24 287 1
+24 289 1
+24 291 1
+24 292 1
+24 294 1
+24 295 1
+24 298 1
+24 301 1
+24 303 1
+24 305 1
+24 307 1
+24 309 1
+24 311 1
+24 312 1
+24 314 1
+24 315 1
+24 317 1
+24 319 1
+24 321 1
+24 322 1
+24 324 1
+24 325 1
+24 326 1
+24 328 1
+24 329 1
+24 330 1
+24 336 1
+24 342 1
+24 347 1
+24 351 1
+24 354 1
+24 356 1
+24 358 1
+24 363 1
+24 368 1
+24 372 1
+24 375 1
+24 377 1
+24 379 1
+24 383 1
+24 387 1
+24 390 1
+24 392 1
+24 394 1
+24 397 1
+24 400 1
+24 402 1
+24 404 1
+24 406 1
+24 408 1
+24 410 1
+24 411 1
+24 413 1
+24 414 1
+24 419 1
+24 424 1
+24 428 1
+24 431 1
+24 433 1
+24 435 1
+24 439 1
+24 443 1
+24 446 1
+24 448 1
+24 450 1
+24 453 1
+24 456 1
+24 458 1
+24 460 1
+24 462 1
+24 464 1
+24 466 1
+24 467 1
+24 469 1
+24 470 1
+24 474 1
+24 478 1
+24 481 1
+24 483 1
+24 485 1
+24 488 1
+24 491 1
+24 493 1
+24 495 1
+24 497 1
+24 499 1
+24 501 1
+24 502 1
+24 504 1
+24 505 1
+24 508 1
+24 511 1
+24 513 1
+24 515 1
+24 517 1
+24 519 1
+24 521 1
+24 522 1
+24 524 1
+24 525 1
+24 527 1
+24 529 1
+24 531 1
+24 532 1
+24 534 1
+24 535 1
+24 536 1
+24 538 1
+24 539 1
+24 540 1
+24 545 1
+24 550 1
+24 554 1
+24 557 1
+24 559 1
+24 561 1
+24 565 1
+24 569 1
+24 572 1
+24 574 1
+24 576 1
+24 579 1
+24 582 1
+24 584 1
+24 586 1
+24 588 1
+24 590 1
+24 592 1
+24 593 1
+24 595 1
+24 596 1
+24 600 1
+24 604 1
+24 607 1
+24 609 1
+24 611 1
+24 614 1
+24 617 1
+24 619 1
+24 621 1
+24 623 1
+24 625 1
+24 627 1
+24 628 1
+24 630 1
+24 631 1
+24 634 1
+24 637 1
+24 639 1
+24 641 1
+24 643 1
+24 645 1
+24 647 1
+24 648 1
+24 650 1
+24 651 1
+24 653 1
+24 655 1
+24 657 1
+24 658 1
+24 660 1
+24 661 1
+24 662 1
+24 664 1
+24 665 1
+24 666 1
+24 670 1
+24 674 1
+24 677 1
+24 679 1
+24 681 1
+24 684 1
+24 687 1
+24 689 1
+24 691 1
+24 693 1
+24 695 1
+24 697 1
+24 698 1
+24 700 1
+24 701 1
+24 704 1
+24 707 1
+24 709 1
+24 711 1
+24 713 1
+24 715 1
+24 717 1
+24 718 1
+24 720 1
+24 721 1
+24 723 1
+24 725 1
+24 727 1
+24 728 1
+24 730 1
+24 731 1
+24 732 1
+24 734 1
+24 735 1
+24 736 1
+24 739 1
+24 742 1
+24 744 1
+24 746 1
+24 748 1
+24 750 1
+24 752 1
+24 753 1
+24 755 1
+24 756 1
+24 758 1
+24 760 1
+24 762 1
+24 763 1
+24 765 1
+24 766 1
+24 767 1
+24 769 1
+24 770 1
+24 771 1
+24 773 1
+24 775 1
+24 777 1
+24 778 1
+24 780 1
+24 781 1
+24 782 1
+24 784 1
+24 785 1
+24 786 1
+24 787 1
+24 789 1
+24 790 1
+24 791 1
+24 792 1
+24 1722 1
+24 1728 1
+24 1733 1
+24 1737 1
+24 1740 1
+24 1742 1
+24 1744 1
+24 1749 1
+24 1754 1
+24 1758 1
+24 1761 1
+24 1763 1
+24 1765 1
+24 1769 1
+24 1773 1
+24 1776 1
+24 1778 1
+24 1780 1
+24 1783 1
+24 1786 1
+24 1788 1
+24 1790 1
+24 1792 1
+24 1794 1
+24 1796 1
+24 1797 1
+24 1799 1
+24 1800 1
+24 1805 1
+24 1810 1
+24 1814 1
+24 1817 1
+24 1819 1
+24 1821 1
+24 1825 1
+24 1829 1
+24 1832 1
+24 1834 1
+24 1836 1
+24 1839 1
+24 1842 1
+24 1844 1
+24 1846 1
+24 1848 1
+24 1850 1
+24 1852 1
+24 1853 1
+24 1855 1
+24 1856 1
+24 1860 1
+24 1864 1
+24 1867 1
+24 1869 1
+24 1871 1
+24 1874 1
+24 1877 1
+24 1879 1
+24 1881 1
+24 1883 1
+24 1885 1
+24 1887 1
+24 1888 1
+24 1890 1
+24 1891 1
+24 1894 1
+24 1897 1
+24 1899 1
+24 1901 1
+24 1903 1
+24 1905 1
+24 1907 1
+24 1908 1
+24 1910 1
+24 1911 1
+24 1913 1
+24 1915 1
+24 1917 1
+24 1918 1
+24 1920 1
+24 1921 1
+24 1922 1
+24 1924 1
+24 1925 1
+24 1926 1
+24 1931 1
+24 1936 1
+24 1940 1
+24 1943 1
+24 1945 1
+24 1947 1
+24 1951 1
+24 1955 1
+24 1958 1
+24 1960 1
+24 1962 1
+24 1965 1
+24 1968 1
+24 1970 1
+24 1972 1
+24 1974 1
+24 1976 1
+24 1978 1
+24 1979 1
+24 1981 1
+24 1982 1
+24 1986 1
+24 1990 1
+24 1993 1
+24 1995 1
+24 1997 1
+24 2000 1
+24 2003 1
+24 2005 1
+24 2007 1
+24 2009 1
+24 2011 1
+24 2013 1
+24 2014 1
+24 2016 1
+24 2017 1
+24 2020 1
+24 2023 1
+24 2025 1
+24 2027 1
+24 2029 1
+24 2031 1
+24 2033 1
+24 2034 1
+24 2036 1
+24 2037 1
+24 2039 1
+24 2041 1
+24 2043 1
+24 2044 1
+24 2046 1
+24 2047 1
+24 2048 1
+24 2050 1
+24 2051 1
+24 2052 1
+24 2056 1
+24 2060 1
+24 2063 1
+24 2065 1
+24 2067 1
+24 2070 1
+24 2073 1
+24 2075 1
+24 2077 1
+24 2079 1
+24 2081 1
+24 2083 1
+24 2084 1
+24 2086 1
+24 2087 1
+24 2090 1
+24 2093 1
+24 2095 1
+24 2097 1
+24 2099 1
+24 2101 1
+24 2103 1
+24 2104 1
+24 2106 1
+24 2107 1
+24 2109 1
+24 2111 1
+24 2113 1
+24 2114 1
+24 2116 1
+24 2117 1
+24 2118 1
+24 2120 1
+24 2121 1
+24 2122 1
+24 2125 1
+24 2128 1
+24 2130 1
+24 2132 1
+24 2134 1
+24 2136 1
+24 2138 1
+24 2139 1
+24 2141 1
+24 2142 1
+24 2144 1
+24 2146 1
+24 2148 1
+24 2149 1
+24 2151 1
+24 2152 1
+24 2153 1
+24 2155 1
+24 2156 1
+24 2157 1
+24 2159 1
+24 2161 1
+24 2163 1
+24 2164 1
+24 2166 1
+24 2167 1
+24 2168 1
+24 2170 1
+24 2171 1
+24 2172 1
+24 2173 1
+24 2175 1
+24 2176 1
+24 2177 1
+24 2178 1
+24 2183 1
+24 2188 1
+24 2192 1
+24 2195 1
+24 2197 1
+24 2199 1
+24 2203 1
+24 2207 1
+24 2210 1
+24 2212 1
+24 2214 1
+24 2217 1
+24 2220 1
+24 2222 1
+24 2224 1
+24 2226 1
+24 2228 1
+24 2230 1
+24 2231 1
+24 2233 1
+24 2234 1
+24 2238 1
+24 2242 1
+24 2245 1
+24 2247 1
+24 2249 1
+24 2252 1
+24 2255 1
+24 2257 1
+24 2259 1
+24 2261 1
+24 2263 1
+24 2265 1
+24 2266 1
+24 2268 1
+24 2269 1
+24 2272 1
+24 2275 1
+24 2277 1
+24 2279 1
+24 2281 1
+24 2283 1
+24 2285 1
+24 2286 1
+24 2288 1
+24 2289 1
+24 2291 1
+24 2293 1
+24 2295 1
+24 2296 1
+24 2298 1
+24 2299 1
+24 2300 1
+24 2302 1
+24 2303 1
+24 2304 1
+24 2308 1
+24 2312 1
+24 2315 1
+24 2317 1
+24 2319 1
+24 2322 1
+24 2325 1
+24 2327 1
+24 2329 1
+24 2331 1
+24 2333 1
+24 2335 1
+24 2336 1
+24 2338 1
+24 2339 1
+24 2342 1
+24 2345 1
+24 2347 1
+24 2349 1
+24 2351 1
+24 2353 1
+24 2355 1
+24 2356 1
+24 2358 1
+24 2359 1
+24 2361 1
+24 2363 1
+24 2365 1
+24 2366 1
+24 2368 1
+24 2369 1
+24 2370 1
+24 2372 1
+24 2373 1
+24 2374 1
+24 2377 1
+24 2380 1
+24 2382 1
+24 2384 1
+24 2386 1
+24 2388 1
+24 2390 1
+24 2391 1
+24 2393 1
+24 2394 1
+24 2396 1
+24 2398 1
+24 2400 1
+24 2401 1
+24 2403 1
+24 2404 1
+24 2405 1
+24 2407 1
+24 2408 1
+24 2409 1
+24 2411 1
+24 2413 1
+24 2415 1
+24 2416 1
+24 2418 1
+24 2419 1
+24 2420 1
+24 2422 1
+24 2423 1
+24 2424 1
+24 2425 1
+24 2427 1
+24 2428 1
+24 2429 1
+24 2430 1
+24 2434 1
+24 2438 1
+24 2441 1
+24 2443 1
+24 2445 1
+24 2448 1
+24 2451 1
+24 2453 1
+24 2455 1
+24 2457 1
+24 2459 1
+24 2461 1
+24 2462 1
+24 2464 1
+24 2465 1
+24 2468 1
+24 2471 1
+24 2473 1
+24 2475 1
+24 2477 1
+24 2479 1
+24 2481 1
+24 2482 1
+24 2484 1
+24 2485 1
+24 2487 1
+24 2489 1
+24 2491 1
+24 2492 1
+24 2494 1
+24 2495 1
+24 2496 1
+24 2498 1
+24 2499 1
+24 2500 1
+24 2503 1
+24 2506 1
+24 2508 1
+24 2510 1
+24 2512 1
+24 2514 1
+24 2516 1
+24 2517 1
+24 2519 1
+24 2520 1
+24 2522 1
+24 2524 1
+24 2526 1
+24 2527 1
+24 2529 1
+24 2530 1
+24 2531 1
+24 2533 1
+24 2534 1
+24 2535 1
+24 2537 1
+24 2539 1
+24 2541 1
+24 2542 1
+24 2544 1
+24 2545 1
+24 2546 1
+24 2548 1
+24 2549 1
+24 2550 1
+24 2551 1
+24 2553 1
+24 2554 1
+24 2555 1
+24 2556 1
+24 2559 1
+24 2562 1
+24 2564 1
+24 2566 1
+24 2568 1
+24 2570 1
+24 2572 1
+24 2573 1
+24 2575 1
+24 2576 1
+24 2578 1
+24 2580 1
+24 2582 1
+24 2583 1
+24 2585 1
+24 2586 1
+24 2587 1
+24 2589 1
+24 2590 1
+24 2591 1
+24 2593 1
+24 2595 1
+24 2597 1
+24 2598 1
+24 2600 1
+24 2601 1
+24 2602 1
+24 2604 1
+24 2605 1
+24 2606 1
+24 2607 1
+24 2609 1
+24 2610 1
+24 2611 1
+24 2612 1
+24 2614 1
+24 2616 1
+24 2618 1
+24 2619 1
+24 2621 1
+24 2622 1
+24 2623 1
+24 2625 1
+24 2626 1
+24 2627 1
+24 2628 1
+24 2630 1
+24 2631 1
+24 2632 1
+24 2633 1
+24 2634 1
+24 2636 1
+24 2637 1
+24 2638 1
+24 2639 1
+24 2640 1
+25 8 1
+25 15 1
+25 21 1
+25 26 1
+25 30 1
+25 33 1
+25 35 1
+25 36 1
+25 43 1
+25 49 1
+25 54 1
+25 58 1
+25 61 1
+25 63 1
+25 64 1
+25 70 1
+25 75 1
+25 79 1
+25 82 1
+25 84 1
+25 85 1
+25 90 1
+25 94 1
+25 97 1
+25 99 1
+25 100 1
+25 104 1
+25 107 1
+25 109 1
+25 110 1
+25 113 1
+25 115 1
+25 116 1
+25 118 1
+25 119 1
+25 120 1
+25 127 1
+25 133 1
+25 138 1
+25 142 1
+25 145 1
+25 147 1
+25 148 1
+25 154 1
+25 159 1
+25 163 1
+25 166 1
+25 168 1
+25 169 1
+25 174 1
+25 178 1
+25 181 1
+25 183 1
+25 184 1
+25 188 1
+25 191 1
+25 193 1
+25 194 1
+25 197 1
+25 199 1
+25 200 1
+25 202 1
+25 203 1
+25 204 1
+25 210 1
+25 215 1
+25 219 1
+25 222 1
+25 224 1
+25 225 1
+25 230 1
+25 234 1
+25 237 1
+25 239 1
+25 240 1
+25 244 1
+25 247 1
+25 249 1
+25 250 1
+25 253 1
+25 255 1
+25 256 1
+25 258 1
+25 259 1
+25 260 1
+25 265 1
+25 269 1
+25 272 1
+25 274 1
+25 275 1
+25 279 1
+25 282 1
+25 284 1
+25 285 1
+25 288 1
+25 290 1
+25 291 1
+25 293 1
+25 294 1
+25 295 1
+25 299 1
+25 302 1
+25 304 1
+25 305 1
+25 308 1
+25 310 1
+25 311 1
+25 313 1
+25 314 1
+25 315 1
+25 318 1
+25 320 1
+25 321 1
+25 323 1
+25 324 1
+25 325 1
+25 327 1
+25 328 1
+25 329 1
+25 330 1
+25 337 1
+25 343 1
+25 348 1
+25 352 1
+25 355 1
+25 357 1
+25 358 1
+25 364 1
+25 369 1
+25 373 1
+25 376 1
+25 378 1
+25 379 1
+25 384 1
+25 388 1
+25 391 1
+25 393 1
+25 394 1
+25 398 1
+25 401 1
+25 403 1
+25 404 1
+25 407 1
+25 409 1
+25 410 1
+25 412 1
+25 413 1
+25 414 1
+25 420 1
+25 425 1
+25 429 1
+25 432 1
+25 434 1
+25 435 1
+25 440 1
+25 444 1
+25 447 1
+25 449 1
+25 450 1
+25 454 1
+25 457 1
+25 459 1
+25 460 1
+25 463 1
+25 465 1
+25 466 1
+25 468 1
+25 469 1
+25 470 1
+25 475 1
+25 479 1
+25 482 1
+25 484 1
+25 485 1
+25 489 1
+25 492 1
+25 494 1
+25 495 1
+25 498 1
+25 500 1
+25 501 1
+25 503 1
+25 504 1
+25 505 1
+25 509 1
+25 512 1
+25 514 1
+25 515 1
+25 518 1
+25 520 1
+25 521 1
+25 523 1
+25 524 1
+25 525 1
+25 528 1
+25 530 1
+25 531 1
+25 533 1
+25 534 1
+25 535 1
+25 537 1
+25 538 1
+25 539 1
+25 540 1
+25 546 1
+25 551 1
+25 555 1
+25 558 1
+25 560 1
+25 561 1
+25 566 1
+25 570 1
+25 573 1
+25 575 1
+25 576 1
+25 580 1
+25 583 1
+25 585 1
+25 586 1
+25 589 1
+25 591 1
+25 592 1
+25 594 1
+25 595 1
+25 596 1
+25 601 1
+25 605 1
+25 608 1
+25 610 1
+25 611 1
+25 615 1
+25 618 1
+25 620 1
+25 621 1
+25 624 1
+25 626 1
+25 627 1
+25 629 1
+25 630 1
+25 631 1
+25 635 1
+25 638 1
+25 640 1
+25 641 1
+25 644 1
+25 646 1
+25 647 1
+25 649 1
+25 650 1
+25 651 1
+25 654 1
+25 656 1
+25 657 1
+25 659 1
+25 660 1
+25 661 1
+25 663 1
+25 664 1
+25 665 1
+25 666 1
+25 671 1
+25 675 1
+25 678 1
+25 680 1
+25 681 1
+25 685 1
+25 688 1
+25 690 1
+25 691 1
+25 694 1
+25 696 1
+25 697 1
+25 699 1
+25 700 1
+25 701 1
+25 705 1
+25 708 1
+25 710 1
+25 711 1
+25 714 1
+25 716 1
+25 717 1
+25 719 1
+25 720 1
+25 721 1
+25 724 1
+25 726 1
+25 727 1
+25 729 1
+25 730 1
+25 731 1
+25 733 1
+25 734 1
+25 735 1
+25 736 1
+25 740 1
+25 743 1
+25 745 1
+25 746 1
+25 749 1
+25 751 1
+25 752 1
+25 754 1
+25 755 1
+25 756 1
+25 759 1
+25 761 1
+25 762 1
+25 764 1
+25 765 1
+25 766 1
+25 768 1
+25 769 1
+25 770 1
+25 771 1
+25 774 1
+25 776 1
+25 777 1
+25 779 1
+25 780 1
+25 781 1
+25 783 1
+25 784 1
+25 785 1
+25 786 1
+25 788 1
+25 789 1
+25 790 1
+25 791 1
+25 792 1
+25 1723 1
+25 1729 1
+25 1734 1
+25 1738 1
+25 1741 1
+25 1743 1
+25 1744 1
+25 1750 1
+25 1755 1
+25 1759 1
+25 1762 1
+25 1764 1
+25 1765 1
+25 1770 1
+25 1774 1
+25 1777 1
+25 1779 1
+25 1780 1
+25 1784 1
+25 1787 1
+25 1789 1
+25 1790 1
+25 1793 1
+25 1795 1
+25 1796 1
+25 1798 1
+25 1799 1
+25 1800 1
+25 1806 1
+25 1811 1
+25 1815 1
+25 1818 1
+25 1820 1
+25 1821 1
+25 1826 1
+25 1830 1
+25 1833 1
+25 1835 1
+25 1836 1
+25 1840 1
+25 1843 1
+25 1845 1
+25 1846 1
+25 1849 1
+25 1851 1
+25 1852 1
+25 1854 1
+25 1855 1
+25 1856 1
+25 1861 1
+25 1865 1
+25 1868 1
+25 1870 1
+25 1871 1
+25 1875 1
+25 1878 1
+25 1880 1
+25 1881 1
+25 1884 1
+25 1886 1
+25 1887 1
+25 1889 1
+25 1890 1
+25 1891 1
+25 1895 1
+25 1898 1
+25 1900 1
+25 1901 1
+25 1904 1
+25 1906 1
+25 1907 1
+25 1909 1
+25 1910 1
+25 1911 1
+25 1914 1
+25 1916 1
+25 1917 1
+25 1919 1
+25 1920 1
+25 1921 1
+25 1923 1
+25 1924 1
+25 1925 1
+25 1926 1
+25 1932 1
+25 1937 1
+25 1941 1
+25 1944 1
+25 1946 1
+25 1947 1
+25 1952 1
+25 1956 1
+25 1959 1
+25 1961 1
+25 1962 1
+25 1966 1
+25 1969 1
+25 1971 1
+25 1972 1
+25 1975 1
+25 1977 1
+25 1978 1
+25 1980 1
+25 1981 1
+25 1982 1
+25 1987 1
+25 1991 1
+25 1994 1
+25 1996 1
+25 1997 1
+25 2001 1
+25 2004 1
+25 2006 1
+25 2007 1
+25 2010 1
+25 2012 1
+25 2013 1
+25 2015 1
+25 2016 1
+25 2017 1
+25 2021 1
+25 2024 1
+25 2026 1
+25 2027 1
+25 2030 1
+25 2032 1
+25 2033 1
+25 2035 1
+25 2036 1
+25 2037 1
+25 2040 1
+25 2042 1
+25 2043 1
+25 2045 1
+25 2046 1
+25 2047 1
+25 2049 1
+25 2050 1
+25 2051 1
+25 2052 1
+25 2057 1
+25 2061 1
+25 2064 1
+25 2066 1
+25 2067 1
+25 2071 1
+25 2074 1
+25 2076 1
+25 2077 1
+25 2080 1
+25 2082 1
+25 2083 1
+25 2085 1
+25 2086 1
+25 2087 1
+25 2091 1
+25 2094 1
+25 2096 1
+25 2097 1
+25 2100 1
+25 2102 1
+25 2103 1
+25 2105 1
+25 2106 1
+25 2107 1
+25 2110 1
+25 2112 1
+25 2113 1
+25 2115 1
+25 2116 1
+25 2117 1
+25 2119 1
+25 2120 1
+25 2121 1
+25 2122 1
+25 2126 1
+25 2129 1
+25 2131 1
+25 2132 1
+25 2135 1
+25 2137 1
+25 2138 1
+25 2140 1
+25 2141 1
+25 2142 1
+25 2145 1
+25 2147 1
+25 2148 1
+25 2150 1
+25 2151 1
+25 2152 1
+25 2154 1
+25 2155 1
+25 2156 1
+25 2157 1
+25 2160 1
+25 2162 1
+25 2163 1
+25 2165 1
+25 2166 1
+25 2167 1
+25 2169 1
+25 2170 1
+25 2171 1
+25 2172 1
+25 2174 1
+25 2175 1
+25 2176 1
+25 2177 1
+25 2178 1
+25 2184 1
+25 2189 1
+25 2193 1
+25 2196 1
+25 2198 1
+25 2199 1
+25 2204 1
+25 2208 1
+25 2211 1
+25 2213 1
+25 2214 1
+25 2218 1
+25 2221 1
+25 2223 1
+25 2224 1
+25 2227 1
+25 2229 1
+25 2230 1
+25 2232 1
+25 2233 1
+25 2234 1
+25 2239 1
+25 2243 1
+25 2246 1
+25 2248 1
+25 2249 1
+25 2253 1
+25 2256 1
+25 2258 1
+25 2259 1
+25 2262 1
+25 2264 1
+25 2265 1
+25 2267 1
+25 2268 1
+25 2269 1
+25 2273 1
+25 2276 1
+25 2278 1
+25 2279 1
+25 2282 1
+25 2284 1
+25 2285 1
+25 2287 1
+25 2288 1
+25 2289 1
+25 2292 1
+25 2294 1
+25 2295 1
+25 2297 1
+25 2298 1
+25 2299 1
+25 2301 1
+25 2302 1
+25 2303 1
+25 2304 1
+25 2309 1
+25 2313 1
+25 2316 1
+25 2318 1
+25 2319 1
+25 2323 1
+25 2326 1
+25 2328 1
+25 2329 1
+25 2332 1
+25 2334 1
+25 2335 1
+25 2337 1
+25 2338 1
+25 2339 1
+25 2343 1
+25 2346 1
+25 2348 1
+25 2349 1
+25 2352 1
+25 2354 1
+25 2355 1
+25 2357 1
+25 2358 1
+25 2359 1
+25 2362 1
+25 2364 1
+25 2365 1
+25 2367 1
+25 2368 1
+25 2369 1
+25 2371 1
+25 2372 1
+25 2373 1
+25 2374 1
+25 2378 1
+25 2381 1
+25 2383 1
+25 2384 1
+25 2387 1
+25 2389 1
+25 2390 1
+25 2392 1
+25 2393 1
+25 2394 1
+25 2397 1
+25 2399 1
+25 2400 1
+25 2402 1
+25 2403 1
+25 2404 1
+25 2406 1
+25 2407 1
+25 2408 1
+25 2409 1
+25 2412 1
+25 2414 1
+25 2415 1
+25 2417 1
+25 2418 1
+25 2419 1
+25 2421 1
+25 2422 1
+25 2423 1
+25 2424 1
+25 2426 1
+25 2427 1
+25 2428 1
+25 2429 1
+25 2430 1
+25 2435 1
+25 2439 1
+25 2442 1
+25 2444 1
+25 2445 1
+25 2449 1
+25 2452 1
+25 2454 1
+25 2455 1
+25 2458 1
+25 2460 1
+25 2461 1
+25 2463 1
+25 2464 1
+25 2465 1
+25 2469 1
+25 2472 1
+25 2474 1
+25 2475 1
+25 2478 1
+25 2480 1
+25 2481 1
+25 2483 1
+25 2484 1
+25 2485 1
+25 2488 1
+25 2490 1
+25 2491 1
+25 2493 1
+25 2494 1
+25 2495 1
+25 2497 1
+25 2498 1
+25 2499 1
+25 2500 1
+25 2504 1
+25 2507 1
+25 2509 1
+25 2510 1
+25 2513 1
+25 2515 1
+25 2516 1
+25 2518 1
+25 2519 1
+25 2520 1
+25 2523 1
+25 2525 1
+25 2526 1
+25 2528 1
+25 2529 1
+25 2530 1
+25 2532 1
+25 2533 1
+25 2534 1
+25 2535 1
+25 2538 1
+25 2540 1
+25 2541 1
+25 2543 1
+25 2544 1
+25 2545 1
+25 2547 1
+25 2548 1
+25 2549 1
+25 2550 1
+25 2552 1
+25 2553 1
+25 2554 1
+25 2555 1
+25 2556 1
+25 2560 1
+25 2563 1
+25 2565 1
+25 2566 1
+25 2569 1
+25 2571 1
+25 2572 1
+25 2574 1
+25 2575 1
+25 2576 1
+25 2579 1
+25 2581 1
+25 2582 1
+25 2584 1
+25 2585 1
+25 2586 1
+25 2588 1
+25 2589 1
+25 2590 1
+25 2591 1
+25 2594 1
+25 2596 1
+25 2597 1
+25 2599 1
+25 2600 1
+25 2601 1
+25 2603 1
+25 2604 1
+25 2605 1
+25 2606 1
+25 2608 1
+25 2609 1
+25 2610 1
+25 2611 1
+25 2612 1
+25 2615 1
+25 2617 1
+25 2618 1
+25 2620 1
+25 2621 1
+25 2622 1
+25 2624 1
+25 2625 1
+25 2626 1
+25 2627 1
+25 2629 1
+25 2630 1
+25 2631 1
+25 2632 1
+25 2633 1
+25 2635 1
+25 2636 1
+25 2637 1
+25 2638 1
+25 2639 1
+25 2640 1
+26 1 1
+26 2 1
+26 3 1
+26 4 1
+26 5 1
+26 6 1
+26 7 1
+26 8 1
+26 9 1
+26 10 1
+26 11 1
+26 12 1
+26 13 1
+26 14 1
+26 15 1
+26 16 1
+26 17 1
+26 18 1
+26 19 1
+26 20 1
+26 21 1
+26 22 1
+26 23 1
+26 24 1
+26 25 1
+26 26 1
+26 27 1
+26 28 1
+26 29 1
+26 30 1
+26 31 1
+26 32 1
+26 33 1
+26 34 1
+26 35 1
+26 36 1
+26 37 1
+26 38 1
+26 39 1
+26 40 1
+26 41 1
+26 42 1
+26 43 1
+26 44 1
+26 45 1
+26 46 1
+26 47 1
+26 48 1
+26 49 1
+26 50 1
+26 51 1
+26 52 1
+26 53 1
+26 54 1
+26 55 1
+26 56 1
+26 57 1
+26 58 1
+26 59 1
+26 60 1
+26 61 1
+26 62 1
+26 63 1
+26 64 1
+26 65 1
+26 66 1
+26 67 1
+26 68 1
+26 69 1
+26 70 1
+26 71 1
+26 72 1
+26 73 1
+26 74 1
+26 75 1
+26 76 1
+26 77 1
+26 78 1
+26 79 1
+26 80 1
+26 81 1
+26 82 1
+26 83 1
+26 84 1
+26 85 1
+26 86 1
+26 87 1
+26 88 1
+26 89 1
+26 90 1
+26 91 1
+26 92 1
+26 93 1
+26 94 1
+26 95 1
+26 96 1
+26 97 1
+26 98 1
+26 99 1
+26 100 1
+26 101 1
+26 102 1
+26 103 1
+26 104 1
+26 105 1
+26 106 1
+26 107 1
+26 108 1
+26 109 1
+26 110 1
+26 111 1
+26 112 1
+26 113 1
+26 114 1
+26 115 1
+26 116 1
+26 117 1
+26 118 1
+26 119 1
+26 120 1
+26 793 1
+26 794 1
+26 795 1
+26 796 1
+26 797 1
+26 798 1
+26 799 1
+26 800 1
+26 801 1
+26 802 1
+26 803 1
+26 804 1
+26 805 1
+26 806 1
+26 807 1
+26 808 1
+26 809 1
+26 810 1
+26 811 1
+26 812 1
+26 813 1
+26 814 1
+26 815 1
+26 816 1
+26 817 1
+26 818 1
+26 819 1
+26 820 1
+26 821 1
+26 822 1
+26 823 1
+26 824 1
+26 825 1
+26 826 1
+26 827 1
+26 828 1
+26 829 1
+26 830 1
+26 831 1
+26 832 1
+26 833 1
+26 834 1
+26 835 1
+26 836 1
+26 837 1
+26 838 1
+26 839 1
+26 840 1
+26 841 1
+26 842 1
+26 843 1
+26 844 1
+26 845 1
+26 846 1
+26 847 1
+26 848 1
+26 849 1
+26 850 1
+26 851 1
+26 852 1
+26 853 1
+26 854 1
+26 855 1
+26 856 1
+26 857 1
+26 858 1
+26 859 1
+26 860 1
+26 861 1
+26 862 1
+26 863 1
+26 864 1
+26 865 1
+26 866 1
+26 867 1
+26 868 1
+26 869 1
+26 870 1
+26 871 1
+26 872 1
+26 873 1
+26 874 1
+26 875 1
+26 876 1
+26 877 1
+26 878 1
+26 879 1
+26 880 1
+26 881 1
+26 882 1
+26 883 1
+26 884 1
+26 885 1
+26 886 1
+26 887 1
+26 888 1
+26 889 1
+26 890 1
+26 891 1
+26 892 1
+26 893 1
+26 894 1
+26 895 1
+26 896 1
+26 897 1
+26 898 1
+26 899 1
+26 900 1
+26 901 1
+26 902 1
+26 903 1
+26 904 1
+26 905 1
+26 906 1
+26 907 1
+26 908 1
+26 909 1
+26 910 1
+26 911 1
+26 912 1
+26 913 1
+26 914 1
+26 915 1
+26 916 1
+26 917 1
+26 918 1
+26 919 1
+26 920 1
+26 921 1
+26 922 1
+26 923 1
+26 924 1
+26 925 1
+26 926 1
+26 927 1
+26 928 1
+26 929 1
+26 930 1
+26 931 1
+26 932 1
+26 933 1
+26 934 1
+26 935 1
+26 936 1
+26 937 1
+26 938 1
+26 939 1
+26 940 1
+26 941 1
+26 942 1
+26 943 1
+26 944 1
+26 945 1
+26 946 1
+26 947 1
+26 948 1
+26 949 1
+26 950 1
+26 951 1
+26 952 1
+26 953 1
+26 954 1
+26 955 1
+26 956 1
+26 957 1
+26 958 1
+26 959 1
+26 960 1
+26 961 1
+26 962 1
+26 963 1
+26 964 1
+26 965 1
+26 966 1
+26 967 1
+26 968 1
+26 969 1
+26 970 1
+26 971 1
+26 972 1
+26 973 1
+26 974 1
+26 975 1
+26 976 1
+26 977 1
+26 978 1
+26 979 1
+26 980 1
+26 981 1
+26 982 1
+26 983 1
+26 984 1
+26 985 1
+26 986 1
+26 987 1
+26 988 1
+26 989 1
+26 990 1
+26 991 1
+26 992 1
+26 993 1
+26 994 1
+26 995 1
+26 996 1
+26 997 1
+26 998 1
+26 999 1
+26 1000 1
+26 1001 1
+26 1002 1
+26 1717 1
+26 1718 1
+26 1719 1
+26 1720 1
+26 1721 1
+26 1722 1
+26 1723 1
+26 1724 1
+26 1725 1
+26 1726 1
+26 1727 1
+26 1728 1
+26 1729 1
+26 1730 1
+26 1731 1
+26 1732 1
+26 1733 1
+26 1734 1
+26 1735 1
+26 1736 1
+26 1737 1
+26 1738 1
+26 1739 1
+26 1740 1
+26 1741 1
+26 1742 1
+26 1743 1
+26 1744 1
+26 1745 1
+26 1746 1
+26 1747 1
+26 1748 1
+26 1749 1
+26 1750 1
+26 1751 1
+26 1752 1
+26 1753 1
+26 1754 1
+26 1755 1
+26 1756 1
+26 1757 1
+26 1758 1
+26 1759 1
+26 1760 1
+26 1761 1
+26 1762 1
+26 1763 1
+26 1764 1
+26 1765 1
+26 1766 1
+26 1767 1
+26 1768 1
+26 1769 1
+26 1770 1
+26 1771 1
+26 1772 1
+26 1773 1
+26 1774 1
+26 1775 1
+26 1776 1
+26 1777 1
+26 1778 1
+26 1779 1
+26 1780 1
+26 1781 1
+26 1782 1
+26 1783 1
+26 1784 1
+26 1785 1
+26 1786 1
+26 1787 1
+26 1788 1
+26 1789 1
+26 1790 1
+26 1791 1
+26 1792 1
+26 1793 1
+26 1794 1
+26 1795 1
+26 1796 1
+26 1797 1
+26 1798 1
+26 1799 1
+26 1800 1
+26 1801 1
+26 1802 1
+26 1803 1
+26 1804 1
+26 1805 1
+26 1806 1
+26 1807 1
+26 1808 1
+26 1809 1
+26 1810 1
+26 1811 1
+26 1812 1
+26 1813 1
+26 1814 1
+26 1815 1
+26 1816 1
+26 1817 1
+26 1818 1
+26 1819 1
+26 1820 1
+26 1821 1
+26 1822 1
+26 1823 1
+26 1824 1
+26 1825 1
+26 1826 1
+26 1827 1
+26 1828 1
+26 1829 1
+26 1830 1
+26 1831 1
+26 1832 1
+26 1833 1
+26 1834 1
+26 1835 1
+26 1836 1
+26 1837 1
+26 1838 1
+26 1839 1
+26 1840 1
+26 1841 1
+26 1842 1
+26 1843 1
+26 1844 1
+26 1845 1
+26 1846 1
+26 1847 1
+26 1848 1
+26 1849 1
+26 1850 1
+26 1851 1
+26 1852 1
+26 1853 1
+26 1854 1
+26 1855 1
+26 1856 1
+26 1857 1
+26 1858 1
+26 1859 1
+26 1860 1
+26 1861 1
+26 1862 1
+26 1863 1
+26 1864 1
+26 1865 1
+26 1866 1
+26 1867 1
+26 1868 1
+26 1869 1
+26 1870 1
+26 1871 1
+26 1872 1
+26 1873 1
+26 1874 1
+26 1875 1
+26 1876 1
+26 1877 1
+26 1878 1
+26 1879 1
+26 1880 1
+26 1881 1
+26 1882 1
+26 1883 1
+26 1884 1
+26 1885 1
+26 1886 1
+26 1887 1
+26 1888 1
+26 1889 1
+26 1890 1
+26 1891 1
+26 1892 1
+26 1893 1
+26 1894 1
+26 1895 1
+26 1896 1
+26 1897 1
+26 1898 1
+26 1899 1
+26 1900 1
+26 1901 1
+26 1902 1
+26 1903 1
+26 1904 1
+26 1905 1
+26 1906 1
+26 1907 1
+26 1908 1
+26 1909 1
+26 1910 1
+26 1911 1
+26 1912 1
+26 1913 1
+26 1914 1
+26 1915 1
+26 1916 1
+26 1917 1
+26 1918 1
+26 1919 1
+26 1920 1
+26 1921 1
+26 1922 1
+26 1923 1
+26 1924 1
+26 1925 1
+26 1926 1
+26 2641 1
+26 2642 1
+26 2643 1
+26 2644 1
+26 2645 1
+26 2646 1
+26 2647 1
+26 2648 1
+26 2649 1
+26 2650 1
+26 2651 1
+26 2652 1
+26 2653 1
+26 2654 1
+26 2655 1
+26 2656 1
+26 2657 1
+26 2658 1
+26 2659 1
+26 2660 1
+26 2661 1
+26 2662 1
+26 2663 1
+26 2664 1
+26 2665 1
+26 2666 1
+26 2667 1
+26 2668 1
+26 2669 1
+26 2670 1
+26 2671 1
+26 2672 1
+26 2673 1
+26 2674 1
+26 2675 1
+26 2676 1
+26 2677 1
+26 2678 1
+26 2679 1
+26 2680 1
+26 2681 1
+26 2682 1
+26 2683 1
+26 2684 1
+26 2685 1
+26 2686 1
+26 2687 1
+26 2688 1
+26 2689 1
+26 2690 1
+26 2691 1
+26 2692 1
+26 2693 1
+26 2694 1
+26 2695 1
+26 2696 1
+26 2697 1
+26 2698 1
+26 2699 1
+26 2700 1
+26 2701 1
+26 2702 1
+26 2703 1
+26 2704 1
+26 2705 1
+26 2706 1
+26 2707 1
+26 2708 1
+26 2709 1
+26 2710 1
+26 2711 1
+26 2712 1
+26 2713 1
+26 2714 1
+26 2715 1
+26 2716 1
+26 2717 1
+26 2718 1
+26 2719 1
+26 2720 1
+26 2721 1
+26 2722 1
+26 2723 1
+26 2724 1
+26 2725 1
+26 2726 1
+26 2727 1
+26 2728 1
+26 2729 1
+26 2730 1
+26 2731 1
+26 2732 1
+26 2733 1
+26 2734 1
+26 2735 1
+26 2736 1
+26 2737 1
+26 2738 1
+26 2739 1
+26 2740 1
+26 2741 1
+26 2742 1
+26 2743 1
+26 2744 1
+26 2745 1
+26 2746 1
+26 2747 1
+26 2748 1
+26 2749 1
+26 2750 1
+26 2751 1
+26 2752 1
+26 2753 1
+26 2754 1
+26 2755 1
+26 2756 1
+26 2757 1
+26 2758 1
+26 2759 1
+26 2760 1
+26 2761 1
+26 2762 1
+26 2763 1
+26 2764 1
+26 2765 1
+26 2766 1
+26 2767 1
+26 2768 1
+26 2769 1
+26 2770 1
+26 2771 1
+26 2772 1
+26 2773 1
+26 2774 1
+26 2775 1
+26 2776 1
+26 2777 1
+26 2778 1
+26 2779 1
+26 2780 1
+26 2781 1
+26 2782 1
+26 2783 1
+26 2784 1
+26 2785 1
+26 2786 1
+26 2787 1
+26 2788 1
+26 2789 1
+26 2790 1
+26 2791 1
+26 2792 1
+26 2793 1
+26 2794 1
+26 2795 1
+26 2796 1
+26 2797 1
+26 2798 1
+26 2799 1
+26 2800 1
+26 2801 1
+26 2802 1
+26 2803 1
+26 2804 1
+26 2805 1
+26 2806 1
+26 2807 1
+26 2808 1
+26 2809 1
+26 2810 1
+26 2811 1
+26 2812 1
+26 2813 1
+26 2814 1
+26 2815 1
+26 2816 1
+26 2817 1
+26 2818 1
+26 2819 1
+26 2820 1
+26 2821 1
+26 2822 1
+26 2823 1
+26 2824 1
+26 2825 1
+26 2826 1
+26 2827 1
+26 2828 1
+26 2829 1
+26 2830 1
+26 2831 1
+26 2832 1
+26 2833 1
+26 2834 1
+26 2835 1
+26 2836 1
+26 2837 1
+26 2838 1
+26 2839 1
+26 2840 1
+26 2841 1
+26 2842 1
+26 2843 1
+26 2844 1
+26 2845 1
+26 2846 1
+26 2847 1
+26 2848 1
+26 2849 1
+26 2850 1
+26 2851 1
+26 2852 1
+26 2853 1
+26 2854 1
+26 2855 1
+26 2856 1
+26 2857 1
+26 2858 1
+26 2859 1
+26 2860 1
+26 2861 1
+26 2862 1
+26 2863 1
+26 2864 1
+26 2865 1
+26 2866 1
+26 2867 1
+26 2868 1
+26 2869 1
+26 2870 1
+26 2871 1
+26 2872 1
+26 2873 1
+26 2874 1
+26 2875 1
+26 2876 1
+26 2877 1
+26 2878 1
+26 2879 1
+26 2880 1
+26 2881 1
+26 2882 1
+26 2883 1
+26 2884 1
+26 2885 1
+26 2886 1
+26 2887 1
+26 2888 1
+26 2889 1
+26 2890 1
+26 2891 1
+26 2892 1
+27 1 1
+27 2 1
+27 3 1
+27 4 1
+27 5 1
+27 6 1
+27 7 1
+27 8 1
+27 9 1
+27 10 1
+27 11 1
+27 12 1
+27 13 1
+27 14 1
+27 15 1
+27 16 1
+27 17 1
+27 18 1
+27 19 1
+27 20 1
+27 21 1
+27 22 1
+27 23 1
+27 24 1
+27 25 1
+27 26 1
+27 27 1
+27 28 1
+27 29 1
+27 30 1
+27 31 1
+27 32 1
+27 33 1
+27 34 1
+27 35 1
+27 36 1
+27 121 1
+27 122 1
+27 123 1
+27 124 1
+27 125 1
+27 126 1
+27 127 1
+27 128 1
+27 129 1
+27 130 1
+27 131 1
+27 132 1
+27 133 1
+27 134 1
+27 135 1
+27 136 1
+27 137 1
+27 138 1
+27 139 1
+27 140 1
+27 141 1
+27 142 1
+27 143 1
+27 144 1
+27 145 1
+27 146 1
+27 147 1
+27 148 1
+27 149 1
+27 150 1
+27 151 1
+27 152 1
+27 153 1
+27 154 1
+27 155 1
+27 156 1
+27 157 1
+27 158 1
+27 159 1
+27 160 1
+27 161 1
+27 162 1
+27 163 1
+27 164 1
+27 165 1
+27 166 1
+27 167 1
+27 168 1
+27 169 1
+27 170 1
+27 171 1
+27 172 1
+27 173 1
+27 174 1
+27 175 1
+27 176 1
+27 177 1
+27 178 1
+27 179 1
+27 180 1
+27 181 1
+27 182 1
+27 183 1
+27 184 1
+27 185 1
+27 186 1
+27 187 1
+27 188 1
+27 189 1
+27 190 1
+27 191 1
+27 192 1
+27 193 1
+27 194 1
+27 195 1
+27 196 1
+27 197 1
+27 198 1
+27 199 1
+27 200 1
+27 201 1
+27 202 1
+27 203 1
+27 204 1
+27 793 1
+27 794 1
+27 795 1
+27 796 1
+27 797 1
+27 798 1
+27 799 1
+27 800 1
+27 801 1
+27 802 1
+27 803 1
+27 804 1
+27 805 1
+27 806 1
+27 807 1
+27 808 1
+27 809 1
+27 810 1
+27 811 1
+27 812 1
+27 813 1
+27 814 1
+27 815 1
+27 816 1
+27 817 1
+27 818 1
+27 819 1
+27 820 1
+27 821 1
+27 822 1
+27 823 1
+27 824 1
+27 825 1
+27 826 1
+27 827 1
+27 828 1
+27 829 1
+27 830 1
+27 831 1
+27 832 1
+27 833 1
+27 834 1
+27 835 1
+27 836 1
+27 837 1
+27 838 1
+27 839 1
+27 840 1
+27 841 1
+27 842 1
+27 843 1
+27 844 1
+27 845 1
+27 846 1
+27 847 1
+27 848 1
+27 849 1
+27 850 1
+27 851 1
+27 852 1
+27 853 1
+27 854 1
+27 855 1
+27 856 1
+27 857 1
+27 858 1
+27 859 1
+27 860 1
+27 861 1
+27 862 1
+27 863 1
+27 864 1
+27 865 1
+27 866 1
+27 867 1
+27 868 1
+27 869 1
+27 870 1
+27 871 1
+27 872 1
+27 873 1
+27 874 1
+27 875 1
+27 876 1
+27 1003 1
+27 1004 1
+27 1005 1
+27 1006 1
+27 1007 1
+27 1008 1
+27 1009 1
+27 1010 1
+27 1011 1
+27 1012 1
+27 1013 1
+27 1014 1
+27 1015 1
+27 1016 1
+27 1017 1
+27 1018 1
+27 1019 1
+27 1020 1
+27 1021 1
+27 1022 1
+27 1023 1
+27 1024 1
+27 1025 1
+27 1026 1
+27 1027 1
+27 1028 1
+27 1029 1
+27 1030 1
+27 1031 1
+27 1032 1
+27 1033 1
+27 1034 1
+27 1035 1
+27 1036 1
+27 1037 1
+27 1038 1
+27 1039 1
+27 1040 1
+27 1041 1
+27 1042 1
+27 1043 1
+27 1044 1
+27 1045 1
+27 1046 1
+27 1047 1
+27 1048 1
+27 1049 1
+27 1050 1
+27 1051 1
+27 1052 1
+27 1053 1
+27 1054 1
+27 1055 1
+27 1056 1
+27 1057 1
+27 1058 1
+27 1059 1
+27 1060 1
+27 1061 1
+27 1062 1
+27 1063 1
+27 1064 1
+27 1065 1
+27 1066 1
+27 1067 1
+27 1068 1
+27 1069 1
+27 1070 1
+27 1071 1
+27 1072 1
+27 1073 1
+27 1074 1
+27 1075 1
+27 1076 1
+27 1077 1
+27 1078 1
+27 1079 1
+27 1080 1
+27 1081 1
+27 1082 1
+27 1083 1
+27 1084 1
+27 1085 1
+27 1086 1
+27 1087 1
+27 1088 1
+27 1089 1
+27 1090 1
+27 1091 1
+27 1092 1
+27 1093 1
+27 1094 1
+27 1095 1
+27 1096 1
+27 1097 1
+27 1098 1
+27 1099 1
+27 1100 1
+27 1101 1
+27 1102 1
+27 1103 1
+27 1104 1
+27 1105 1
+27 1106 1
+27 1107 1
+27 1108 1
+27 1109 1
+27 1110 1
+27 1111 1
+27 1112 1
+27 1113 1
+27 1114 1
+27 1115 1
+27 1116 1
+27 1117 1
+27 1118 1
+27 1119 1
+27 1120 1
+27 1121 1
+27 1122 1
+27 1123 1
+27 1124 1
+27 1125 1
+27 1126 1
+27 1127 1
+27 1128 1
+27 1717 1
+27 1718 1
+27 1719 1
+27 1720 1
+27 1721 1
+27 1722 1
+27 1723 1
+27 1724 1
+27 1725 1
+27 1726 1
+27 1727 1
+27 1728 1
+27 1729 1
+27 1730 1
+27 1731 1
+27 1732 1
+27 1733 1
+27 1734 1
+27 1735 1
+27 1736 1
+27 1737 1
+27 1738 1
+27 1739 1
+27 1740 1
+27 1741 1
+27 1742 1
+27 1743 1
+27 1744 1
+27 1745 1
+27 1746 1
+27 1747 1
+27 1748 1
+27 1749 1
+27 1750 1
+27 1751 1
+27 1752 1
+27 1753 1
+27 1754 1
+27 1755 1
+27 1756 1
+27 1757 1
+27 1758 1
+27 1759 1
+27 1760 1
+27 1761 1
+27 1762 1
+27 1763 1
+27 1764 1
+27 1765 1
+27 1766 1
+27 1767 1
+27 1768 1
+27 1769 1
+27 1770 1
+27 1771 1
+27 1772 1
+27 1773 1
+27 1774 1
+27 1775 1
+27 1776 1
+27 1777 1
+27 1778 1
+27 1779 1
+27 1780 1
+27 1781 1
+27 1782 1
+27 1783 1
+27 1784 1
+27 1785 1
+27 1786 1
+27 1787 1
+27 1788 1
+27 1789 1
+27 1790 1
+27 1791 1
+27 1792 1
+27 1793 1
+27 1794 1
+27 1795 1
+27 1796 1
+27 1797 1
+27 1798 1
+27 1799 1
+27 1800 1
+27 1927 1
+27 1928 1
+27 1929 1
+27 1930 1
+27 1931 1
+27 1932 1
+27 1933 1
+27 1934 1
+27 1935 1
+27 1936 1
+27 1937 1
+27 1938 1
+27 1939 1
+27 1940 1
+27 1941 1
+27 1942 1
+27 1943 1
+27 1944 1
+27 1945 1
+27 1946 1
+27 1947 1
+27 1948 1
+27 1949 1
+27 1950 1
+27 1951 1
+27 1952 1
+27 1953 1
+27 1954 1
+27 1955 1
+27 1956 1
+27 1957 1
+27 1958 1
+27 1959 1
+27 1960 1
+27 1961 1
+27 1962 1
+27 1963 1
+27 1964 1
+27 1965 1
+27 1966 1
+27 1967 1
+27 1968 1
+27 1969 1
+27 1970 1
+27 1971 1
+27 1972 1
+27 1973 1
+27 1974 1
+27 1975 1
+27 1976 1
+27 1977 1
+27 1978 1
+27 1979 1
+27 1980 1
+27 1981 1
+27 1982 1
+27 1983 1
+27 1984 1
+27 1985 1
+27 1986 1
+27 1987 1
+27 1988 1
+27 1989 1
+27 1990 1
+27 1991 1
+27 1992 1
+27 1993 1
+27 1994 1
+27 1995 1
+27 1996 1
+27 1997 1
+27 1998 1
+27 1999 1
+27 2000 1
+27 2001 1
+27 2002 1
+27 2003 1
+27 2004 1
+27 2005 1
+27 2006 1
+27 2007 1
+27 2008 1
+27 2009 1
+27 2010 1
+27 2011 1
+27 2012 1
+27 2013 1
+27 2014 1
+27 2015 1
+27 2016 1
+27 2017 1
+27 2018 1
+27 2019 1
+27 2020 1
+27 2021 1
+27 2022 1
+27 2023 1
+27 2024 1
+27 2025 1
+27 2026 1
+27 2027 1
+27 2028 1
+27 2029 1
+27 2030 1
+27 2031 1
+27 2032 1
+27 2033 1
+27 2034 1
+27 2035 1
+27 2036 1
+27 2037 1
+27 2038 1
+27 2039 1
+27 2040 1
+27 2041 1
+27 2042 1
+27 2043 1
+27 2044 1
+27 2045 1
+27 2046 1
+27 2047 1
+27 2048 1
+27 2049 1
+27 2050 1
+27 2051 1
+27 2052 1
+27 2641 1
+27 2642 1
+27 2643 1
+27 2644 1
+27 2645 1
+27 2646 1
+27 2647 1
+27 2648 1
+27 2649 1
+27 2650 1
+27 2651 1
+27 2652 1
+27 2653 1
+27 2654 1
+27 2655 1
+27 2656 1
+27 2657 1
+27 2658 1
+27 2659 1
+27 2660 1
+27 2661 1
+27 2662 1
+27 2663 1
+27 2664 1
+27 2665 1
+27 2666 1
+27 2667 1
+27 2668 1
+27 2669 1
+27 2670 1
+27 2671 1
+27 2672 1
+27 2673 1
+27 2674 1
+27 2675 1
+27 2676 1
+27 2677 1
+27 2678 1
+27 2679 1
+27 2680 1
+27 2681 1
+27 2682 1
+27 2683 1
+27 2684 1
+27 2685 1
+27 2686 1
+27 2687 1
+27 2688 1
+27 2689 1
+27 2690 1
+27 2691 1
+27 2692 1
+27 2693 1
+27 2694 1
+27 2695 1
+27 2696 1
+27 2697 1
+27 2698 1
+27 2699 1
+27 2700 1
+27 2701 1
+27 2702 1
+27 2703 1
+27 2704 1
+27 2705 1
+27 2706 1
+27 2707 1
+27 2708 1
+27 2709 1
+27 2710 1
+27 2711 1
+27 2712 1
+27 2713 1
+27 2714 1
+27 2715 1
+27 2716 1
+27 2717 1
+27 2718 1
+27 2719 1
+27 2720 1
+27 2721 1
+27 2722 1
+27 2723 1
+27 2724 1
+27 2725 1
+27 2726 1
+27 2727 1
+27 2728 1
+27 2729 1
+27 2730 1
+27 2731 1
+27 2732 1
+27 2733 1
+27 2734 1
+27 2735 1
+27 2736 1
+27 2737 1
+27 2738 1
+27 2739 1
+27 2740 1
+27 2741 1
+27 2742 1
+27 2743 1
+27 2744 1
+27 2745 1
+27 2746 1
+27 2747 1
+27 2748 1
+27 2749 1
+27 2750 1
+27 2751 1
+27 2752 1
+27 2753 1
+27 2754 1
+27 2755 1
+27 2756 1
+27 2757 1
+27 2758 1
+27 2759 1
+27 2760 1
+27 2761 1
+27 2762 1
+27 2763 1
+27 2764 1
+27 2765 1
+27 2766 1
+27 2893 1
+27 2894 1
+27 2895 1
+27 2896 1
+27 2897 1
+27 2898 1
+27 2899 1
+27 2900 1
+27 2901 1
+27 2902 1
+27 2903 1
+27 2904 1
+27 2905 1
+27 2906 1
+27 2907 1
+27 2908 1
+27 2909 1
+27 2910 1
+27 2911 1
+27 2912 1
+27 2913 1
+27 2914 1
+27 2915 1
+27 2916 1
+27 2917 1
+27 2918 1
+27 2919 1
+27 2920 1
+27 2921 1
+27 2922 1
+27 2923 1
+27 2924 1
+27 2925 1
+27 2926 1
+27 2927 1
+27 2928 1
+27 2929 1
+27 2930 1
+27 2931 1
+27 2932 1
+27 2933 1
+27 2934 1
+27 2935 1
+27 2936 1
+27 2937 1
+27 2938 1
+27 2939 1
+27 2940 1
+27 2941 1
+27 2942 1
+27 2943 1
+27 2944 1
+27 2945 1
+27 2946 1
+27 2947 1
+27 2948 1
+27 2949 1
+27 2950 1
+27 2951 1
+27 2952 1
+27 2953 1
+27 2954 1
+27 2955 1
+27 2956 1
+27 2957 1
+27 2958 1
+27 2959 1
+27 2960 1
+27 2961 1
+27 2962 1
+27 2963 1
+27 2964 1
+27 2965 1
+27 2966 1
+27 2967 1
+27 2968 1
+27 2969 1
+27 2970 1
+27 2971 1
+27 2972 1
+27 2973 1
+27 2974 1
+27 2975 1
+27 2976 1
+27 2977 1
+27 2978 1
+27 2979 1
+27 2980 1
+27 2981 1
+27 2982 1
+27 2983 1
+27 2984 1
+27 2985 1
+27 2986 1
+27 2987 1
+27 2988 1
+27 2989 1
+27 2990 1
+27 2991 1
+27 2992 1
+27 2993 1
+27 2994 1
+27 2995 1
+27 2996 1
+27 2997 1
+27 2998 1
+27 2999 1
+27 3000 1
+27 3001 1
+27 3002 1
+27 3003 1
+27 3004 1
+27 3005 1
+27 3006 1
+27 3007 1
+27 3008 1
+27 3009 1
+27 3010 1
+27 3011 1
+27 3012 1
+27 3013 1
+27 3014 1
+27 3015 1
+27 3016 1
+27 3017 1
+27 3018 1
+28 1 1
+28 2 1
+28 3 1
+28 4 1
+28 5 1
+28 6 1
+28 7 1
+28 8 1
+28 37 1
+28 38 1
+28 39 1
+28 40 1
+28 41 1
+28 42 1
+28 43 1
+28 44 1
+28 45 1
+28 46 1
+28 47 1
+28 48 1
+28 49 1
+28 50 1
+28 51 1
+28 52 1
+28 53 1
+28 54 1
+28 55 1
+28 56 1
+28 57 1
+28 58 1
+28 59 1
+28 60 1
+28 61 1
+28 62 1
+28 63 1
+28 64 1
+28 121 1
+28 122 1
+28 123 1
+28 124 1
+28 125 1
+28 126 1
+28 127 1
+28 128 1
+28 129 1
+28 130 1
+28 131 1
+28 132 1
+28 133 1
+28 134 1
+28 135 1
+28 136 1
+28 137 1
+28 138 1
+28 139 1
+28 140 1
+28 141 1
+28 142 1
+28 143 1
+28 144 1
+28 145 1
+28 146 1
+28 147 1
+28 148 1
+28 205 1
+28 206 1
+28 207 1
+28 208 1
+28 209 1
+28 210 1
+28 211 1
+28 212 1
+28 213 1
+28 214 1
+28 215 1
+28 216 1
+28 217 1
+28 218 1
+28 219 1
+28 220 1
+28 221 1
+28 222 1
+28 223 1
+28 224 1
+28 225 1
+28 226 1
+28 227 1
+28 228 1
+28 229 1
+28 230 1
+28 231 1
+28 232 1
+28 233 1
+28 234 1
+28 235 1
+28 236 1
+28 237 1
+28 238 1
+28 239 1
+28 240 1
+28 241 1
+28 242 1
+28 243 1
+28 244 1
+28 245 1
+28 246 1
+28 247 1
+28 248 1
+28 249 1
+28 250 1
+28 251 1
+28 252 1
+28 253 1
+28 254 1
+28 255 1
+28 256 1
+28 257 1
+28 258 1
+28 259 1
+28 260 1
+28 793 1
+28 794 1
+28 795 1
+28 796 1
+28 797 1
+28 798 1
+28 799 1
+28 800 1
+28 801 1
+28 802 1
+28 803 1
+28 804 1
+28 805 1
+28 806 1
+28 807 1
+28 808 1
+28 809 1
+28 810 1
+28 811 1
+28 812 1
+28 813 1
+28 814 1
+28 815 1
+28 816 1
+28 817 1
+28 818 1
+28 819 1
+28 820 1
+28 877 1
+28 878 1
+28 879 1
+28 880 1
+28 881 1
+28 882 1
+28 883 1
+28 884 1
+28 885 1
+28 886 1
+28 887 1
+28 888 1
+28 889 1
+28 890 1
+28 891 1
+28 892 1
+28 893 1
+28 894 1
+28 895 1
+28 896 1
+28 897 1
+28 898 1
+28 899 1
+28 900 1
+28 901 1
+28 902 1
+28 903 1
+28 904 1
+28 905 1
+28 906 1
+28 907 1
+28 908 1
+28 909 1
+28 910 1
+28 911 1
+28 912 1
+28 913 1
+28 914 1
+28 915 1
+28 916 1
+28 917 1
+28 918 1
+28 919 1
+28 920 1
+28 921 1
+28 922 1
+28 923 1
+28 924 1
+28 925 1
+28 926 1
+28 927 1
+28 928 1
+28 929 1
+28 930 1
+28 931 1
+28 932 1
+28 1003 1
+28 1004 1
+28 1005 1
+28 1006 1
+28 1007 1
+28 1008 1
+28 1009 1
+28 1010 1
+28 1011 1
+28 1012 1
+28 1013 1
+28 1014 1
+28 1015 1
+28 1016 1
+28 1017 1
+28 1018 1
+28 1019 1
+28 1020 1
+28 1021 1
+28 1022 1
+28 1023 1
+28 1024 1
+28 1025 1
+28 1026 1
+28 1027 1
+28 1028 1
+28 1029 1
+28 1030 1
+28 1031 1
+28 1032 1
+28 1033 1
+28 1034 1
+28 1035 1
+28 1036 1
+28 1037 1
+28 1038 1
+28 1039 1
+28 1040 1
+28 1041 1
+28 1042 1
+28 1043 1
+28 1044 1
+28 1045 1
+28 1046 1
+28 1047 1
+28 1048 1
+28 1049 1
+28 1050 1
+28 1051 1
+28 1052 1
+28 1053 1
+28 1054 1
+28 1055 1
+28 1056 1
+28 1057 1
+28 1058 1
+28 1129 1
+28 1130 1
+28 1131 1
+28 1132 1
+28 1133 1
+28 1134 1
+28 1135 1
+28 1136 1
+28 1137 1
+28 1138 1
+28 1139 1
+28 1140 1
+28 1141 1
+28 1142 1
+28 1143 1
+28 1144 1
+28 1145 1
+28 1146 1
+28 1147 1
+28 1148 1
+28 1149 1
+28 1150 1
+28 1151 1
+28 1152 1
+28 1153 1
+28 1154 1
+28 1155 1
+28 1156 1
+28 1157 1
+28 1158 1
+28 1159 1
+28 1160 1
+28 1161 1
+28 1162 1
+28 1163 1
+28 1164 1
+28 1165 1
+28 1166 1
+28 1167 1
+28 1168 1
+28 1169 1
+28 1170 1
+28 1171 1
+28 1172 1
+28 1173 1
+28 1174 1
+28 1175 1
+28 1176 1
+28 1177 1
+28 1178 1
+28 1179 1
+28 1180 1
+28 1181 1
+28 1182 1
+28 1183 1
+28 1184 1
+28 1185 1
+28 1186 1
+28 1187 1
+28 1188 1
+28 1189 1
+28 1190 1
+28 1191 1
+28 1192 1
+28 1193 1
+28 1194 1
+28 1195 1
+28 1196 1
+28 1197 1
+28 1198 1
+28 1717 1
+28 1718 1
+28 1719 1
+28 1720 1
+28 1721 1
+28 1722 1
+28 1723 1
+28 1724 1
+28 1725 1
+28 1726 1
+28 1727 1
+28 1728 1
+28 1729 1
+28 1730 1
+28 1731 1
+28 1732 1
+28 1733 1
+28 1734 1
+28 1735 1
+28 1736 1
+28 1737 1
+28 1738 1
+28 1739 1
+28 1740 1
+28 1741 1
+28 1742 1
+28 1743 1
+28 1744 1
+28 1801 1
+28 1802 1
+28 1803 1
+28 1804 1
+28 1805 1
+28 1806 1
+28 1807 1
+28 1808 1
+28 1809 1
+28 1810 1
+28 1811 1
+28 1812 1
+28 1813 1
+28 1814 1
+28 1815 1
+28 1816 1
+28 1817 1
+28 1818 1
+28 1819 1
+28 1820 1
+28 1821 1
+28 1822 1
+28 1823 1
+28 1824 1
+28 1825 1
+28 1826 1
+28 1827 1
+28 1828 1
+28 1829 1
+28 1830 1
+28 1831 1
+28 1832 1
+28 1833 1
+28 1834 1
+28 1835 1
+28 1836 1
+28 1837 1
+28 1838 1
+28 1839 1
+28 1840 1
+28 1841 1
+28 1842 1
+28 1843 1
+28 1844 1
+28 1845 1
+28 1846 1
+28 1847 1
+28 1848 1
+28 1849 1
+28 1850 1
+28 1851 1
+28 1852 1
+28 1853 1
+28 1854 1
+28 1855 1
+28 1856 1
+28 1927 1
+28 1928 1
+28 1929 1
+28 1930 1
+28 1931 1
+28 1932 1
+28 1933 1
+28 1934 1
+28 1935 1
+28 1936 1
+28 1937 1
+28 1938 1
+28 1939 1
+28 1940 1
+28 1941 1
+28 1942 1
+28 1943 1
+28 1944 1
+28 1945 1
+28 1946 1
+28 1947 1
+28 1948 1
+28 1949 1
+28 1950 1
+28 1951 1
+28 1952 1
+28 1953 1
+28 1954 1
+28 1955 1
+28 1956 1
+28 1957 1
+28 1958 1
+28 1959 1
+28 1960 1
+28 1961 1
+28 1962 1
+28 1963 1
+28 1964 1
+28 1965 1
+28 1966 1
+28 1967 1
+28 1968 1
+28 1969 1
+28 1970 1
+28 1971 1
+28 1972 1
+28 1973 1
+28 1974 1
+28 1975 1
+28 1976 1
+28 1977 1
+28 1978 1
+28 1979 1
+28 1980 1
+28 1981 1
+28 1982 1
+28 2053 1
+28 2054 1
+28 2055 1
+28 2056 1
+28 2057 1
+28 2058 1
+28 2059 1
+28 2060 1
+28 2061 1
+28 2062 1
+28 2063 1
+28 2064 1
+28 2065 1
+28 2066 1
+28 2067 1
+28 2068 1
+28 2069 1
+28 2070 1
+28 2071 1
+28 2072 1
+28 2073 1
+28 2074 1
+28 2075 1
+28 2076 1
+28 2077 1
+28 2078 1
+28 2079 1
+28 2080 1
+28 2081 1
+28 2082 1
+28 2083 1
+28 2084 1
+28 2085 1
+28 2086 1
+28 2087 1
+28 2088 1
+28 2089 1
+28 2090 1
+28 2091 1
+28 2092 1
+28 2093 1
+28 2094 1
+28 2095 1
+28 2096 1
+28 2097 1
+28 2098 1
+28 2099 1
+28 2100 1
+28 2101 1
+28 2102 1
+28 2103 1
+28 2104 1
+28 2105 1
+28 2106 1
+28 2107 1
+28 2108 1
+28 2109 1
+28 2110 1
+28 2111 1
+28 2112 1
+28 2113 1
+28 2114 1
+28 2115 1
+28 2116 1
+28 2117 1
+28 2118 1
+28 2119 1
+28 2120 1
+28 2121 1
+28 2122 1
+28 2641 1
+28 2642 1
+28 2643 1
+28 2644 1
+28 2645 1
+28 2646 1
+28 2647 1
+28 2648 1
+28 2649 1
+28 2650 1
+28 2651 1
+28 2652 1
+28 2653 1
+28 2654 1
+28 2655 1
+28 2656 1
+28 2657 1
+28 2658 1
+28 2659 1
+28 2660 1
+28 2661 1
+28 2662 1
+28 2663 1
+28 2664 1
+28 2665 1
+28 2666 1
+28 2667 1
+28 2668 1
+28 2669 1
+28 2670 1
+28 2671 1
+28 2672 1
+28 2673 1
+28 2674 1
+28 2675 1
+28 2676 1
+28 2677 1
+28 2678 1
+28 2679 1
+28 2680 1
+28 2681 1
+28 2682 1
+28 2683 1
+28 2684 1
+28 2685 1
+28 2686 1
+28 2687 1
+28 2688 1
+28 2689 1
+28 2690 1
+28 2691 1
+28 2692 1
+28 2693 1
+28 2694 1
+28 2695 1
+28 2696 1
+28 2767 1
+28 2768 1
+28 2769 1
+28 2770 1
+28 2771 1
+28 2772 1
+28 2773 1
+28 2774 1
+28 2775 1
+28 2776 1
+28 2777 1
+28 2778 1
+28 2779 1
+28 2780 1
+28 2781 1
+28 2782 1
+28 2783 1
+28 2784 1
+28 2785 1
+28 2786 1
+28 2787 1
+28 2788 1
+28 2789 1
+28 2790 1
+28 2791 1
+28 2792 1
+28 2793 1
+28 2794 1
+28 2795 1
+28 2796 1
+28 2797 1
+28 2798 1
+28 2799 1
+28 2800 1
+28 2801 1
+28 2802 1
+28 2803 1
+28 2804 1
+28 2805 1
+28 2806 1
+28 2807 1
+28 2808 1
+28 2809 1
+28 2810 1
+28 2811 1
+28 2812 1
+28 2813 1
+28 2814 1
+28 2815 1
+28 2816 1
+28 2817 1
+28 2818 1
+28 2819 1
+28 2820 1
+28 2821 1
+28 2822 1
+28 2823 1
+28 2824 1
+28 2825 1
+28 2826 1
+28 2827 1
+28 2828 1
+28 2829 1
+28 2830 1
+28 2831 1
+28 2832 1
+28 2833 1
+28 2834 1
+28 2835 1
+28 2836 1
+28 2893 1
+28 2894 1
+28 2895 1
+28 2896 1
+28 2897 1
+28 2898 1
+28 2899 1
+28 2900 1
+28 2901 1
+28 2902 1
+28 2903 1
+28 2904 1
+28 2905 1
+28 2906 1
+28 2907 1
+28 2908 1
+28 2909 1
+28 2910 1
+28 2911 1
+28 2912 1
+28 2913 1
+28 2914 1
+28 2915 1
+28 2916 1
+28 2917 1
+28 2918 1
+28 2919 1
+28 2920 1
+28 2921 1
+28 2922 1
+28 2923 1
+28 2924 1
+28 2925 1
+28 2926 1
+28 2927 1
+28 2928 1
+28 2929 1
+28 2930 1
+28 2931 1
+28 2932 1
+28 2933 1
+28 2934 1
+28 2935 1
+28 2936 1
+28 2937 1
+28 2938 1
+28 2939 1
+28 2940 1
+28 2941 1
+28 2942 1
+28 2943 1
+28 2944 1
+28 2945 1
+28 2946 1
+28 2947 1
+28 2948 1
+28 2949 1
+28 2950 1
+28 2951 1
+28 2952 1
+28 2953 1
+28 2954 1
+28 2955 1
+28 2956 1
+28 2957 1
+28 2958 1
+28 2959 1
+28 2960 1
+28 2961 1
+28 2962 1
+28 3019 1
+28 3020 1
+28 3021 1
+28 3022 1
+28 3023 1
+28 3024 1
+28 3025 1
+28 3026 1
+28 3027 1
+28 3028 1
+28 3029 1
+28 3030 1
+28 3031 1
+28 3032 1
+28 3033 1
+28 3034 1
+28 3035 1
+28 3036 1
+28 3037 1
+28 3038 1
+28 3039 1
+28 3040 1
+28 3041 1
+28 3042 1
+28 3043 1
+28 3044 1
+28 3045 1
+28 3046 1
+28 3047 1
+28 3048 1
+28 3049 1
+28 3050 1
+28 3051 1
+28 3052 1
+28 3053 1
+28 3054 1
+28 3055 1
+28 3056 1
+28 3057 1
+28 3058 1
+28 3059 1
+28 3060 1
+28 3061 1
+28 3062 1
+28 3063 1
+28 3064 1
+28 3065 1
+28 3066 1
+28 3067 1
+28 3068 1
+28 3069 1
+28 3070 1
+28 3071 1
+28 3072 1
+28 3073 1
+28 3074 1
+29 1 1
+29 9 1
+29 10 1
+29 11 1
+29 12 1
+29 13 1
+29 14 1
+29 15 1
+29 37 1
+29 38 1
+29 39 1
+29 40 1
+29 41 1
+29 42 1
+29 43 1
+29 65 1
+29 66 1
+29 67 1
+29 68 1
+29 69 1
+29 70 1
+29 71 1
+29 72 1
+29 73 1
+29 74 1
+29 75 1
+29 76 1
+29 77 1
+29 78 1
+29 79 1
+29 80 1
+29 81 1
+29 82 1
+29 83 1
+29 84 1
+29 85 1
+29 121 1
+29 122 1
+29 123 1
+29 124 1
+29 125 1
+29 126 1
+29 127 1
+29 149 1
+29 150 1
+29 151 1
+29 152 1
+29 153 1
+29 154 1
+29 155 1
+29 156 1
+29 157 1
+29 158 1
+29 159 1
+29 160 1
+29 161 1
+29 162 1
+29 163 1
+29 164 1
+29 165 1
+29 166 1
+29 167 1
+29 168 1
+29 169 1
+29 205 1
+29 206 1
+29 207 1
+29 208 1
+29 209 1
+29 210 1
+29 211 1
+29 212 1
+29 213 1
+29 214 1
+29 215 1
+29 216 1
+29 217 1
+29 218 1
+29 219 1
+29 220 1
+29 221 1
+29 222 1
+29 223 1
+29 224 1
+29 225 1
+29 261 1
+29 262 1
+29 263 1
+29 264 1
+29 265 1
+29 266 1
+29 267 1
+29 268 1
+29 269 1
+29 270 1
+29 271 1
+29 272 1
+29 273 1
+29 274 1
+29 275 1
+29 276 1
+29 277 1
+29 278 1
+29 279 1
+29 280 1
+29 281 1
+29 282 1
+29 283 1
+29 284 1
+29 285 1
+29 286 1
+29 287 1
+29 288 1
+29 289 1
+29 290 1
+29 291 1
+29 292 1
+29 293 1
+29 294 1
+29 295 1
+29 793 1
+29 794 1
+29 795 1
+29 796 1
+29 797 1
+29 798 1
+29 799 1
+29 821 1
+29 822 1
+29 823 1
+29 824 1
+29 825 1
+29 826 1
+29 827 1
+29 828 1
+29 829 1
+29 830 1
+29 831 1
+29 832 1
+29 833 1
+29 834 1
+29 835 1
+29 836 1
+29 837 1
+29 838 1
+29 839 1
+29 840 1
+29 841 1
+29 877 1
+29 878 1
+29 879 1
+29 880 1
+29 881 1
+29 882 1
+29 883 1
+29 884 1
+29 885 1
+29 886 1
+29 887 1
+29 888 1
+29 889 1
+29 890 1
+29 891 1
+29 892 1
+29 893 1
+29 894 1
+29 895 1
+29 896 1
+29 897 1
+29 933 1
+29 934 1
+29 935 1
+29 936 1
+29 937 1
+29 938 1
+29 939 1
+29 940 1
+29 941 1
+29 942 1
+29 943 1
+29 944 1
+29 945 1
+29 946 1
+29 947 1
+29 948 1
+29 949 1
+29 950 1
+29 951 1
+29 952 1
+29 953 1
+29 954 1
+29 955 1
+29 956 1
+29 957 1
+29 958 1
+29 959 1
+29 960 1
+29 961 1
+29 962 1
+29 963 1
+29 964 1
+29 965 1
+29 966 1
+29 967 1
+29 1003 1
+29 1004 1
+29 1005 1
+29 1006 1
+29 1007 1
+29 1008 1
+29 1009 1
+29 1010 1
+29 1011 1
+29 1012 1
+29 1013 1
+29 1014 1
+29 1015 1
+29 1016 1
+29 1017 1
+29 1018 1
+29 1019 1
+29 1020 1
+29 1021 1
+29 1022 1
+29 1023 1
+29 1059 1
+29 1060 1
+29 1061 1
+29 1062 1
+29 1063 1
+29 1064 1
+29 1065 1
+29 1066 1
+29 1067 1
+29 1068 1
+29 1069 1
+29 1070 1
+29 1071 1
+29 1072 1
+29 1073 1
+29 1074 1
+29 1075 1
+29 1076 1
+29 1077 1
+29 1078 1
+29 1079 1
+29 1080 1
+29 1081 1
+29 1082 1
+29 1083 1
+29 1084 1
+29 1085 1
+29 1086 1
+29 1087 1
+29 1088 1
+29 1089 1
+29 1090 1
+29 1091 1
+29 1092 1
+29 1093 1
+29 1129 1
+29 1130 1
+29 1131 1
+29 1132 1
+29 1133 1
+29 1134 1
+29 1135 1
+29 1136 1
+29 1137 1
+29 1138 1
+29 1139 1
+29 1140 1
+29 1141 1
+29 1142 1
+29 1143 1
+29 1144 1
+29 1145 1
+29 1146 1
+29 1147 1
+29 1148 1
+29 1149 1
+29 1150 1
+29 1151 1
+29 1152 1
+29 1153 1
+29 1154 1
+29 1155 1
+29 1156 1
+29 1157 1
+29 1158 1
+29 1159 1
+29 1160 1
+29 1161 1
+29 1162 1
+29 1163 1
+29 1199 1
+29 1200 1
+29 1201 1
+29 1202 1
+29 1203 1
+29 1204 1
+29 1205 1
+29 1206 1
+29 1207 1
+29 1208 1
+29 1209 1
+29 1210 1
+29 1211 1
+29 1212 1
+29 1213 1
+29 1214 1
+29 1215 1
+29 1216 1
+29 1217 1
+29 1218 1
+29 1219 1
+29 1220 1
+29 1221 1
+29 1222 1
+29 1223 1
+29 1224 1
+29 1225 1
+29 1226 1
+29 1227 1
+29 1228 1
+29 1229 1
+29 1230 1
+29 1231 1
+29 1232 1
+29 1233 1
+29 1717 1
+29 1718 1
+29 1719 1
+29 1720 1
+29 1721 1
+29 1722 1
+29 1723 1
+29 1745 1
+29 1746 1
+29 1747 1
+29 1748 1
+29 1749 1
+29 1750 1
+29 1751 1
+29 1752 1
+29 1753 1
+29 1754 1
+29 1755 1
+29 1756 1
+29 1757 1
+29 1758 1
+29 1759 1
+29 1760 1
+29 1761 1
+29 1762 1
+29 1763 1
+29 1764 1
+29 1765 1
+29 1801 1
+29 1802 1
+29 1803 1
+29 1804 1
+29 1805 1
+29 1806 1
+29 1807 1
+29 1808 1
+29 1809 1
+29 1810 1
+29 1811 1
+29 1812 1
+29 1813 1
+29 1814 1
+29 1815 1
+29 1816 1
+29 1817 1
+29 1818 1
+29 1819 1
+29 1820 1
+29 1821 1
+29 1857 1
+29 1858 1
+29 1859 1
+29 1860 1
+29 1861 1
+29 1862 1
+29 1863 1
+29 1864 1
+29 1865 1
+29 1866 1
+29 1867 1
+29 1868 1
+29 1869 1
+29 1870 1
+29 1871 1
+29 1872 1
+29 1873 1
+29 1874 1
+29 1875 1
+29 1876 1
+29 1877 1
+29 1878 1
+29 1879 1
+29 1880 1
+29 1881 1
+29 1882 1
+29 1883 1
+29 1884 1
+29 1885 1
+29 1886 1
+29 1887 1
+29 1888 1
+29 1889 1
+29 1890 1
+29 1891 1
+29 1927 1
+29 1928 1
+29 1929 1
+29 1930 1
+29 1931 1
+29 1932 1
+29 1933 1
+29 1934 1
+29 1935 1
+29 1936 1
+29 1937 1
+29 1938 1
+29 1939 1
+29 1940 1
+29 1941 1
+29 1942 1
+29 1943 1
+29 1944 1
+29 1945 1
+29 1946 1
+29 1947 1
+29 1983 1
+29 1984 1
+29 1985 1
+29 1986 1
+29 1987 1
+29 1988 1
+29 1989 1
+29 1990 1
+29 1991 1
+29 1992 1
+29 1993 1
+29 1994 1
+29 1995 1
+29 1996 1
+29 1997 1
+29 1998 1
+29 1999 1
+29 2000 1
+29 2001 1
+29 2002 1
+29 2003 1
+29 2004 1
+29 2005 1
+29 2006 1
+29 2007 1
+29 2008 1
+29 2009 1
+29 2010 1
+29 2011 1
+29 2012 1
+29 2013 1
+29 2014 1
+29 2015 1
+29 2016 1
+29 2017 1
+29 2053 1
+29 2054 1
+29 2055 1
+29 2056 1
+29 2057 1
+29 2058 1
+29 2059 1
+29 2060 1
+29 2061 1
+29 2062 1
+29 2063 1
+29 2064 1
+29 2065 1
+29 2066 1
+29 2067 1
+29 2068 1
+29 2069 1
+29 2070 1
+29 2071 1
+29 2072 1
+29 2073 1
+29 2074 1
+29 2075 1
+29 2076 1
+29 2077 1
+29 2078 1
+29 2079 1
+29 2080 1
+29 2081 1
+29 2082 1
+29 2083 1
+29 2084 1
+29 2085 1
+29 2086 1
+29 2087 1
+29 2123 1
+29 2124 1
+29 2125 1
+29 2126 1
+29 2127 1
+29 2128 1
+29 2129 1
+29 2130 1
+29 2131 1
+29 2132 1
+29 2133 1
+29 2134 1
+29 2135 1
+29 2136 1
+29 2137 1
+29 2138 1
+29 2139 1
+29 2140 1
+29 2141 1
+29 2142 1
+29 2143 1
+29 2144 1
+29 2145 1
+29 2146 1
+29 2147 1
+29 2148 1
+29 2149 1
+29 2150 1
+29 2151 1
+29 2152 1
+29 2153 1
+29 2154 1
+29 2155 1
+29 2156 1
+29 2157 1
+29 2641 1
+29 2642 1
+29 2643 1
+29 2644 1
+29 2645 1
+29 2646 1
+29 2647 1
+29 2648 1
+29 2649 1
+29 2650 1
+29 2651 1
+29 2652 1
+29 2653 1
+29 2654 1
+29 2655 1
+29 2656 1
+29 2657 1
+29 2658 1
+29 2659 1
+29 2660 1
+29 2661 1
+29 2697 1
+29 2698 1
+29 2699 1
+29 2700 1
+29 2701 1
+29 2702 1
+29 2703 1
+29 2704 1
+29 2705 1
+29 2706 1
+29 2707 1
+29 2708 1
+29 2709 1
+29 2710 1
+29 2711 1
+29 2712 1
+29 2713 1
+29 2714 1
+29 2715 1
+29 2716 1
+29 2717 1
+29 2718 1
+29 2719 1
+29 2720 1
+29 2721 1
+29 2722 1
+29 2723 1
+29 2724 1
+29 2725 1
+29 2726 1
+29 2727 1
+29 2728 1
+29 2729 1
+29 2730 1
+29 2731 1
+29 2767 1
+29 2768 1
+29 2769 1
+29 2770 1
+29 2771 1
+29 2772 1
+29 2773 1
+29 2774 1
+29 2775 1
+29 2776 1
+29 2777 1
+29 2778 1
+29 2779 1
+29 2780 1
+29 2781 1
+29 2782 1
+29 2783 1
+29 2784 1
+29 2785 1
+29 2786 1
+29 2787 1
+29 2788 1
+29 2789 1
+29 2790 1
+29 2791 1
+29 2792 1
+29 2793 1
+29 2794 1
+29 2795 1
+29 2796 1
+29 2797 1
+29 2798 1
+29 2799 1
+29 2800 1
+29 2801 1
+29 2837 1
+29 2838 1
+29 2839 1
+29 2840 1
+29 2841 1
+29 2842 1
+29 2843 1
+29 2844 1
+29 2845 1
+29 2846 1
+29 2847 1
+29 2848 1
+29 2849 1
+29 2850 1
+29 2851 1
+29 2852 1
+29 2853 1
+29 2854 1
+29 2855 1
+29 2856 1
+29 2857 1
+29 2858 1
+29 2859 1
+29 2860 1
+29 2861 1
+29 2862 1
+29 2863 1
+29 2864 1
+29 2865 1
+29 2866 1
+29 2867 1
+29 2868 1
+29 2869 1
+29 2870 1
+29 2871 1
+29 2893 1
+29 2894 1
+29 2895 1
+29 2896 1
+29 2897 1
+29 2898 1
+29 2899 1
+29 2900 1
+29 2901 1
+29 2902 1
+29 2903 1
+29 2904 1
+29 2905 1
+29 2906 1
+29 2907 1
+29 2908 1
+29 2909 1
+29 2910 1
+29 2911 1
+29 2912 1
+29 2913 1
+29 2914 1
+29 2915 1
+29 2916 1
+29 2917 1
+29 2918 1
+29 2919 1
+29 2920 1
+29 2921 1
+29 2922 1
+29 2923 1
+29 2924 1
+29 2925 1
+29 2926 1
+29 2927 1
+29 2963 1
+29 2964 1
+29 2965 1
+29 2966 1
+29 2967 1
+29 2968 1
+29 2969 1
+29 2970 1
+29 2971 1
+29 2972 1
+29 2973 1
+29 2974 1
+29 2975 1
+29 2976 1
+29 2977 1
+29 2978 1
+29 2979 1
+29 2980 1
+29 2981 1
+29 2982 1
+29 2983 1
+29 2984 1
+29 2985 1
+29 2986 1
+29 2987 1
+29 2988 1
+29 2989 1
+29 2990 1
+29 2991 1
+29 2992 1
+29 2993 1
+29 2994 1
+29 2995 1
+29 2996 1
+29 2997 1
+29 3019 1
+29 3020 1
+29 3021 1
+29 3022 1
+29 3023 1
+29 3024 1
+29 3025 1
+29 3026 1
+29 3027 1
+29 3028 1
+29 3029 1
+29 3030 1
+29 3031 1
+29 3032 1
+29 3033 1
+29 3034 1
+29 3035 1
+29 3036 1
+29 3037 1
+29 3038 1
+29 3039 1
+29 3040 1
+29 3041 1
+29 3042 1
+29 3043 1
+29 3044 1
+29 3045 1
+29 3046 1
+29 3047 1
+29 3048 1
+29 3049 1
+29 3050 1
+29 3051 1
+29 3052 1
+29 3053 1
+29 3075 1
+29 3076 1
+29 3077 1
+29 3078 1
+29 3079 1
+29 3080 1
+29 3081 1
+29 3082 1
+29 3083 1
+29 3084 1
+29 3085 1
+29 3086 1
+29 3087 1
+29 3088 1
+29 3089 1
+29 3090 1
+29 3091 1
+29 3092 1
+29 3093 1
+29 3094 1
+29 3095 1
+30 2 1
+30 9 1
+30 16 1
+30 17 1
+30 18 1
+30 19 1
+30 20 1
+30 21 1
+30 37 1
+30 44 1
+30 45 1
+30 46 1
+30 47 1
+30 48 1
+30 49 1
+30 65 1
+30 66 1
+30 67 1
+30 68 1
+30 69 1
+30 70 1
+30 86 1
+30 87 1
+30 88 1
+30 89 1
+30 90 1
+30 91 1
+30 92 1
+30 93 1
+30 94 1
+30 95 1
+30 96 1
+30 97 1
+30 98 1
+30 99 1
+30 100 1
+30 121 1
+30 128 1
+30 129 1
+30 130 1
+30 131 1
+30 132 1
+30 133 1
+30 149 1
+30 150 1
+30 151 1
+30 152 1
+30 153 1
+30 154 1
+30 170 1
+30 171 1
+30 172 1
+30 173 1
+30 174 1
+30 175 1
+30 176 1
+30 177 1
+30 178 1
+30 179 1
+30 180 1
+30 181 1
+30 182 1
+30 183 1
+30 184 1
+30 205 1
+30 206 1
+30 207 1
+30 208 1
+30 209 1
+30 210 1
+30 226 1
+30 227 1
+30 228 1
+30 229 1
+30 230 1
+30 231 1
+30 232 1
+30 233 1
+30 234 1
+30 235 1
+30 236 1
+30 237 1
+30 238 1
+30 239 1
+30 240 1
+30 261 1
+30 262 1
+30 263 1
+30 264 1
+30 265 1
+30 266 1
+30 267 1
+30 268 1
+30 269 1
+30 270 1
+30 271 1
+30 272 1
+30 273 1
+30 274 1
+30 275 1
+30 296 1
+30 297 1
+30 298 1
+30 299 1
+30 300 1
+30 301 1
+30 302 1
+30 303 1
+30 304 1
+30 305 1
+30 306 1
+30 307 1
+30 308 1
+30 309 1
+30 310 1
+30 311 1
+30 312 1
+30 313 1
+30 314 1
+30 315 1
+30 793 1
+30 800 1
+30 801 1
+30 802 1
+30 803 1
+30 804 1
+30 805 1
+30 821 1
+30 822 1
+30 823 1
+30 824 1
+30 825 1
+30 826 1
+30 842 1
+30 843 1
+30 844 1
+30 845 1
+30 846 1
+30 847 1
+30 848 1
+30 849 1
+30 850 1
+30 851 1
+30 852 1
+30 853 1
+30 854 1
+30 855 1
+30 856 1
+30 877 1
+30 878 1
+30 879 1
+30 880 1
+30 881 1
+30 882 1
+30 898 1
+30 899 1
+30 900 1
+30 901 1
+30 902 1
+30 903 1
+30 904 1
+30 905 1
+30 906 1
+30 907 1
+30 908 1
+30 909 1
+30 910 1
+30 911 1
+30 912 1
+30 933 1
+30 934 1
+30 935 1
+30 936 1
+30 937 1
+30 938 1
+30 939 1
+30 940 1
+30 941 1
+30 942 1
+30 943 1
+30 944 1
+30 945 1
+30 946 1
+30 947 1
+30 968 1
+30 969 1
+30 970 1
+30 971 1
+30 972 1
+30 973 1
+30 974 1
+30 975 1
+30 976 1
+30 977 1
+30 978 1
+30 979 1
+30 980 1
+30 981 1
+30 982 1
+30 983 1
+30 984 1
+30 985 1
+30 986 1
+30 987 1
+30 1003 1
+30 1004 1
+30 1005 1
+30 1006 1
+30 1007 1
+30 1008 1
+30 1024 1
+30 1025 1
+30 1026 1
+30 1027 1
+30 1028 1
+30 1029 1
+30 1030 1
+30 1031 1
+30 1032 1
+30 1033 1
+30 1034 1
+30 1035 1
+30 1036 1
+30 1037 1
+30 1038 1
+30 1059 1
+30 1060 1
+30 1061 1
+30 1062 1
+30 1063 1
+30 1064 1
+30 1065 1
+30 1066 1
+30 1067 1
+30 1068 1
+30 1069 1
+30 1070 1
+30 1071 1
+30 1072 1
+30 1073 1
+30 1094 1
+30 1095 1
+30 1096 1
+30 1097 1
+30 1098 1
+30 1099 1
+30 1100 1
+30 1101 1
+30 1102 1
+30 1103 1
+30 1104 1
+30 1105 1
+30 1106 1
+30 1107 1
+30 1108 1
+30 1109 1
+30 1110 1
+30 1111 1
+30 1112 1
+30 1113 1
+30 1129 1
+30 1130 1
+30 1131 1
+30 1132 1
+30 1133 1
+30 1134 1
+30 1135 1
+30 1136 1
+30 1137 1
+30 1138 1
+30 1139 1
+30 1140 1
+30 1141 1
+30 1142 1
+30 1143 1
+30 1164 1
+30 1165 1
+30 1166 1
+30 1167 1
+30 1168 1
+30 1169 1
+30 1170 1
+30 1171 1
+30 1172 1
+30 1173 1
+30 1174 1
+30 1175 1
+30 1176 1
+30 1177 1
+30 1178 1
+30 1179 1
+30 1180 1
+30 1181 1
+30 1182 1
+30 1183 1
+30 1199 1
+30 1200 1
+30 1201 1
+30 1202 1
+30 1203 1
+30 1204 1
+30 1205 1
+30 1206 1
+30 1207 1
+30 1208 1
+30 1209 1
+30 1210 1
+30 1211 1
+30 1212 1
+30 1213 1
+30 1214 1
+30 1215 1
+30 1216 1
+30 1217 1
+30 1218 1
+30 1234 1
+30 1235 1
+30 1236 1
+30 1237 1
+30 1238 1
+30 1239 1
+30 1240 1
+30 1241 1
+30 1242 1
+30 1243 1
+30 1244 1
+30 1245 1
+30 1246 1
+30 1247 1
+30 1248 1
+30 1717 1
+30 1724 1
+30 1725 1
+30 1726 1
+30 1727 1
+30 1728 1
+30 1729 1
+30 1745 1
+30 1746 1
+30 1747 1
+30 1748 1
+30 1749 1
+30 1750 1
+30 1766 1
+30 1767 1
+30 1768 1
+30 1769 1
+30 1770 1
+30 1771 1
+30 1772 1
+30 1773 1
+30 1774 1
+30 1775 1
+30 1776 1
+30 1777 1
+30 1778 1
+30 1779 1
+30 1780 1
+30 1801 1
+30 1802 1
+30 1803 1
+30 1804 1
+30 1805 1
+30 1806 1
+30 1822 1
+30 1823 1
+30 1824 1
+30 1825 1
+30 1826 1
+30 1827 1
+30 1828 1
+30 1829 1
+30 1830 1
+30 1831 1
+30 1832 1
+30 1833 1
+30 1834 1
+30 1835 1
+30 1836 1
+30 1857 1
+30 1858 1
+30 1859 1
+30 1860 1
+30 1861 1
+30 1862 1
+30 1863 1
+30 1864 1
+30 1865 1
+30 1866 1
+30 1867 1
+30 1868 1
+30 1869 1
+30 1870 1
+30 1871 1
+30 1892 1
+30 1893 1
+30 1894 1
+30 1895 1
+30 1896 1
+30 1897 1
+30 1898 1
+30 1899 1
+30 1900 1
+30 1901 1
+30 1902 1
+30 1903 1
+30 1904 1
+30 1905 1
+30 1906 1
+30 1907 1
+30 1908 1
+30 1909 1
+30 1910 1
+30 1911 1
+30 1927 1
+30 1928 1
+30 1929 1
+30 1930 1
+30 1931 1
+30 1932 1
+30 1948 1
+30 1949 1
+30 1950 1
+30 1951 1
+30 1952 1
+30 1953 1
+30 1954 1
+30 1955 1
+30 1956 1
+30 1957 1
+30 1958 1
+30 1959 1
+30 1960 1
+30 1961 1
+30 1962 1
+30 1983 1
+30 1984 1
+30 1985 1
+30 1986 1
+30 1987 1
+30 1988 1
+30 1989 1
+30 1990 1
+30 1991 1
+30 1992 1
+30 1993 1
+30 1994 1
+30 1995 1
+30 1996 1
+30 1997 1
+30 2018 1
+30 2019 1
+30 2020 1
+30 2021 1
+30 2022 1
+30 2023 1
+30 2024 1
+30 2025 1
+30 2026 1
+30 2027 1
+30 2028 1
+30 2029 1
+30 2030 1
+30 2031 1
+30 2032 1
+30 2033 1
+30 2034 1
+30 2035 1
+30 2036 1
+30 2037 1
+30 2053 1
+30 2054 1
+30 2055 1
+30 2056 1
+30 2057 1
+30 2058 1
+30 2059 1
+30 2060 1
+30 2061 1
+30 2062 1
+30 2063 1
+30 2064 1
+30 2065 1
+30 2066 1
+30 2067 1
+30 2088 1
+30 2089 1
+30 2090 1
+30 2091 1
+30 2092 1
+30 2093 1
+30 2094 1
+30 2095 1
+30 2096 1
+30 2097 1
+30 2098 1
+30 2099 1
+30 2100 1
+30 2101 1
+30 2102 1
+30 2103 1
+30 2104 1
+30 2105 1
+30 2106 1
+30 2107 1
+30 2123 1
+30 2124 1
+30 2125 1
+30 2126 1
+30 2127 1
+30 2128 1
+30 2129 1
+30 2130 1
+30 2131 1
+30 2132 1
+30 2133 1
+30 2134 1
+30 2135 1
+30 2136 1
+30 2137 1
+30 2138 1
+30 2139 1
+30 2140 1
+30 2141 1
+30 2142 1
+30 2158 1
+30 2159 1
+30 2160 1
+30 2161 1
+30 2162 1
+30 2163 1
+30 2164 1
+30 2165 1
+30 2166 1
+30 2167 1
+30 2168 1
+30 2169 1
+30 2170 1
+30 2171 1
+30 2172 1
+30 2641 1
+30 2642 1
+30 2643 1
+30 2644 1
+30 2645 1
+30 2646 1
+30 2662 1
+30 2663 1
+30 2664 1
+30 2665 1
+30 2666 1
+30 2667 1
+30 2668 1
+30 2669 1
+30 2670 1
+30 2671 1
+30 2672 1
+30 2673 1
+30 2674 1
+30 2675 1
+30 2676 1
+30 2697 1
+30 2698 1
+30 2699 1
+30 2700 1
+30 2701 1
+30 2702 1
+30 2703 1
+30 2704 1
+30 2705 1
+30 2706 1
+30 2707 1
+30 2708 1
+30 2709 1
+30 2710 1
+30 2711 1
+30 2732 1
+30 2733 1
+30 2734 1
+30 2735 1
+30 2736 1
+30 2737 1
+30 2738 1
+30 2739 1
+30 2740 1
+30 2741 1
+30 2742 1
+30 2743 1
+30 2744 1
+30 2745 1
+30 2746 1
+30 2747 1
+30 2748 1
+30 2749 1
+30 2750 1
+30 2751 1
+30 2767 1
+30 2768 1
+30 2769 1
+30 2770 1
+30 2771 1
+30 2772 1
+30 2773 1
+30 2774 1
+30 2775 1
+30 2776 1
+30 2777 1
+30 2778 1
+30 2779 1
+30 2780 1
+30 2781 1
+30 2802 1
+30 2803 1
+30 2804 1
+30 2805 1
+30 2806 1
+30 2807 1
+30 2808 1
+30 2809 1
+30 2810 1
+30 2811 1
+30 2812 1
+30 2813 1
+30 2814 1
+30 2815 1
+30 2816 1
+30 2817 1
+30 2818 1
+30 2819 1
+30 2820 1
+30 2821 1
+30 2837 1
+30 2838 1
+30 2839 1
+30 2840 1
+30 2841 1
+30 2842 1
+30 2843 1
+30 2844 1
+30 2845 1
+30 2846 1
+30 2847 1
+30 2848 1
+30 2849 1
+30 2850 1
+30 2851 1
+30 2852 1
+30 2853 1
+30 2854 1
+30 2855 1
+30 2856 1
+30 2872 1
+30 2873 1
+30 2874 1
+30 2875 1
+30 2876 1
+30 2877 1
+30 2878 1
+30 2879 1
+30 2880 1
+30 2881 1
+30 2882 1
+30 2883 1
+30 2884 1
+30 2885 1
+30 2886 1
+30 2893 1
+30 2894 1
+30 2895 1
+30 2896 1
+30 2897 1
+30 2898 1
+30 2899 1
+30 2900 1
+30 2901 1
+30 2902 1
+30 2903 1
+30 2904 1
+30 2905 1
+30 2906 1
+30 2907 1
+30 2928 1
+30 2929 1
+30 2930 1
+30 2931 1
+30 2932 1
+30 2933 1
+30 2934 1
+30 2935 1
+30 2936 1
+30 2937 1
+30 2938 1
+30 2939 1
+30 2940 1
+30 2941 1
+30 2942 1
+30 2943 1
+30 2944 1
+30 2945 1
+30 2946 1
+30 2947 1
+30 2963 1
+30 2964 1
+30 2965 1
+30 2966 1
+30 2967 1
+30 2968 1
+30 2969 1
+30 2970 1
+30 2971 1
+30 2972 1
+30 2973 1
+30 2974 1
+30 2975 1
+30 2976 1
+30 2977 1
+30 2978 1
+30 2979 1
+30 2980 1
+30 2981 1
+30 2982 1
+30 2998 1
+30 2999 1
+30 3000 1
+30 3001 1
+30 3002 1
+30 3003 1
+30 3004 1
+30 3005 1
+30 3006 1
+30 3007 1
+30 3008 1
+30 3009 1
+30 3010 1
+30 3011 1
+30 3012 1
+30 3019 1
+30 3020 1
+30 3021 1
+30 3022 1
+30 3023 1
+30 3024 1
+30 3025 1
+30 3026 1
+30 3027 1
+30 3028 1
+30 3029 1
+30 3030 1
+30 3031 1
+30 3032 1
+30 3033 1
+30 3034 1
+30 3035 1
+30 3036 1
+30 3037 1
+30 3038 1
+30 3054 1
+30 3055 1
+30 3056 1
+30 3057 1
+30 3058 1
+30 3059 1
+30 3060 1
+30 3061 1
+30 3062 1
+30 3063 1
+30 3064 1
+30 3065 1
+30 3066 1
+30 3067 1
+30 3068 1
+30 3075 1
+30 3076 1
+30 3077 1
+30 3078 1
+30 3079 1
+30 3080 1
+30 3081 1
+30 3082 1
+30 3083 1
+30 3084 1
+30 3085 1
+30 3086 1
+30 3087 1
+30 3088 1
+30 3089 1
+30 3096 1
+30 3097 1
+30 3098 1
+30 3099 1
+30 3100 1
+30 3101 1
+31 3 1
+31 10 1
+31 16 1
+31 22 1
+31 23 1
+31 24 1
+31 25 1
+31 26 1
+31 38 1
+31 44 1
+31 50 1
+31 51 1
+31 52 1
+31 53 1
+31 54 1
+31 65 1
+31 71 1
+31 72 1
+31 73 1
+31 74 1
+31 75 1
+31 86 1
+31 87 1
+31 88 1
+31 89 1
+31 90 1
+31 101 1
+31 102 1
+31 103 1
+31 104 1
+31 105 1
+31 106 1
+31 107 1
+31 108 1
+31 109 1
+31 110 1
+31 122 1
+31 128 1
+31 134 1
+31 135 1
+31 136 1
+31 137 1
+31 138 1
+31 149 1
+31 155 1
+31 156 1
+31 157 1
+31 158 1
+31 159 1
+31 170 1
+31 171 1
+31 172 1
+31 173 1
+31 174 1
+31 185 1
+31 186 1
+31 187 1
+31 188 1
+31 189 1
+31 190 1
+31 191 1
+31 192 1
+31 193 1
+31 194 1
+31 205 1
+31 211 1
+31 212 1
+31 213 1
+31 214 1
+31 215 1
+31 226 1
+31 227 1
+31 228 1
+31 229 1
+31 230 1
+31 241 1
+31 242 1
+31 243 1
+31 244 1
+31 245 1
+31 246 1
+31 247 1
+31 248 1
+31 249 1
+31 250 1
+31 261 1
+31 262 1
+31 263 1
+31 264 1
+31 265 1
+31 276 1
+31 277 1
+31 278 1
+31 279 1
+31 280 1
+31 281 1
+31 282 1
+31 283 1
+31 284 1
+31 285 1
+31 296 1
+31 297 1
+31 298 1
+31 299 1
+31 300 1
+31 301 1
+31 302 1
+31 303 1
+31 304 1
+31 305 1
+31 316 1
+31 317 1
+31 318 1
+31 319 1
+31 320 1
+31 321 1
+31 322 1
+31 323 1
+31 324 1
+31 325 1
+31 794 1
+31 800 1
+31 806 1
+31 807 1
+31 808 1
+31 809 1
+31 810 1
+31 821 1
+31 827 1
+31 828 1
+31 829 1
+31 830 1
+31 831 1
+31 842 1
+31 843 1
+31 844 1
+31 845 1
+31 846 1
+31 857 1
+31 858 1
+31 859 1
+31 860 1
+31 861 1
+31 862 1
+31 863 1
+31 864 1
+31 865 1
+31 866 1
+31 877 1
+31 883 1
+31 884 1
+31 885 1
+31 886 1
+31 887 1
+31 898 1
+31 899 1
+31 900 1
+31 901 1
+31 902 1
+31 913 1
+31 914 1
+31 915 1
+31 916 1
+31 917 1
+31 918 1
+31 919 1
+31 920 1
+31 921 1
+31 922 1
+31 933 1
+31 934 1
+31 935 1
+31 936 1
+31 937 1
+31 948 1
+31 949 1
+31 950 1
+31 951 1
+31 952 1
+31 953 1
+31 954 1
+31 955 1
+31 956 1
+31 957 1
+31 968 1
+31 969 1
+31 970 1
+31 971 1
+31 972 1
+31 973 1
+31 974 1
+31 975 1
+31 976 1
+31 977 1
+31 988 1
+31 989 1
+31 990 1
+31 991 1
+31 992 1
+31 993 1
+31 994 1
+31 995 1
+31 996 1
+31 997 1
+31 1003 1
+31 1009 1
+31 1010 1
+31 1011 1
+31 1012 1
+31 1013 1
+31 1024 1
+31 1025 1
+31 1026 1
+31 1027 1
+31 1028 1
+31 1039 1
+31 1040 1
+31 1041 1
+31 1042 1
+31 1043 1
+31 1044 1
+31 1045 1
+31 1046 1
+31 1047 1
+31 1048 1
+31 1059 1
+31 1060 1
+31 1061 1
+31 1062 1
+31 1063 1
+31 1074 1
+31 1075 1
+31 1076 1
+31 1077 1
+31 1078 1
+31 1079 1
+31 1080 1
+31 1081 1
+31 1082 1
+31 1083 1
+31 1094 1
+31 1095 1
+31 1096 1
+31 1097 1
+31 1098 1
+31 1099 1
+31 1100 1
+31 1101 1
+31 1102 1
+31 1103 1
+31 1114 1
+31 1115 1
+31 1116 1
+31 1117 1
+31 1118 1
+31 1119 1
+31 1120 1
+31 1121 1
+31 1122 1
+31 1123 1
+31 1129 1
+31 1130 1
+31 1131 1
+31 1132 1
+31 1133 1
+31 1144 1
+31 1145 1
+31 1146 1
+31 1147 1
+31 1148 1
+31 1149 1
+31 1150 1
+31 1151 1
+31 1152 1
+31 1153 1
+31 1164 1
+31 1165 1
+31 1166 1
+31 1167 1
+31 1168 1
+31 1169 1
+31 1170 1
+31 1171 1
+31 1172 1
+31 1173 1
+31 1184 1
+31 1185 1
+31 1186 1
+31 1187 1
+31 1188 1
+31 1189 1
+31 1190 1
+31 1191 1
+31 1192 1
+31 1193 1
+31 1199 1
+31 1200 1
+31 1201 1
+31 1202 1
+31 1203 1
+31 1204 1
+31 1205 1
+31 1206 1
+31 1207 1
+31 1208 1
+31 1219 1
+31 1220 1
+31 1221 1
+31 1222 1
+31 1223 1
+31 1224 1
+31 1225 1
+31 1226 1
+31 1227 1
+31 1228 1
+31 1234 1
+31 1235 1
+31 1236 1
+31 1237 1
+31 1238 1
+31 1239 1
+31 1240 1
+31 1241 1
+31 1242 1
+31 1243 1
+31 1249 1
+31 1250 1
+31 1251 1
+31 1252 1
+31 1253 1
+31 1718 1
+31 1724 1
+31 1730 1
+31 1731 1
+31 1732 1
+31 1733 1
+31 1734 1
+31 1745 1
+31 1751 1
+31 1752 1
+31 1753 1
+31 1754 1
+31 1755 1
+31 1766 1
+31 1767 1
+31 1768 1
+31 1769 1
+31 1770 1
+31 1781 1
+31 1782 1
+31 1783 1
+31 1784 1
+31 1785 1
+31 1786 1
+31 1787 1
+31 1788 1
+31 1789 1
+31 1790 1
+31 1801 1
+31 1807 1
+31 1808 1
+31 1809 1
+31 1810 1
+31 1811 1
+31 1822 1
+31 1823 1
+31 1824 1
+31 1825 1
+31 1826 1
+31 1837 1
+31 1838 1
+31 1839 1
+31 1840 1
+31 1841 1
+31 1842 1
+31 1843 1
+31 1844 1
+31 1845 1
+31 1846 1
+31 1857 1
+31 1858 1
+31 1859 1
+31 1860 1
+31 1861 1
+31 1872 1
+31 1873 1
+31 1874 1
+31 1875 1
+31 1876 1
+31 1877 1
+31 1878 1
+31 1879 1
+31 1880 1
+31 1881 1
+31 1892 1
+31 1893 1
+31 1894 1
+31 1895 1
+31 1896 1
+31 1897 1
+31 1898 1
+31 1899 1
+31 1900 1
+31 1901 1
+31 1912 1
+31 1913 1
+31 1914 1
+31 1915 1
+31 1916 1
+31 1917 1
+31 1918 1
+31 1919 1
+31 1920 1
+31 1921 1
+31 1927 1
+31 1933 1
+31 1934 1
+31 1935 1
+31 1936 1
+31 1937 1
+31 1948 1
+31 1949 1
+31 1950 1
+31 1951 1
+31 1952 1
+31 1963 1
+31 1964 1
+31 1965 1
+31 1966 1
+31 1967 1
+31 1968 1
+31 1969 1
+31 1970 1
+31 1971 1
+31 1972 1
+31 1983 1
+31 1984 1
+31 1985 1
+31 1986 1
+31 1987 1
+31 1998 1
+31 1999 1
+31 2000 1
+31 2001 1
+31 2002 1
+31 2003 1
+31 2004 1
+31 2005 1
+31 2006 1
+31 2007 1
+31 2018 1
+31 2019 1
+31 2020 1
+31 2021 1
+31 2022 1
+31 2023 1
+31 2024 1
+31 2025 1
+31 2026 1
+31 2027 1
+31 2038 1
+31 2039 1
+31 2040 1
+31 2041 1
+31 2042 1
+31 2043 1
+31 2044 1
+31 2045 1
+31 2046 1
+31 2047 1
+31 2053 1
+31 2054 1
+31 2055 1
+31 2056 1
+31 2057 1
+31 2068 1
+31 2069 1
+31 2070 1
+31 2071 1
+31 2072 1
+31 2073 1
+31 2074 1
+31 2075 1
+31 2076 1
+31 2077 1
+31 2088 1
+31 2089 1
+31 2090 1
+31 2091 1
+31 2092 1
+31 2093 1
+31 2094 1
+31 2095 1
+31 2096 1
+31 2097 1
+31 2108 1
+31 2109 1
+31 2110 1
+31 2111 1
+31 2112 1
+31 2113 1
+31 2114 1
+31 2115 1
+31 2116 1
+31 2117 1
+31 2123 1
+31 2124 1
+31 2125 1
+31 2126 1
+31 2127 1
+31 2128 1
+31 2129 1
+31 2130 1
+31 2131 1
+31 2132 1
+31 2143 1
+31 2144 1
+31 2145 1
+31 2146 1
+31 2147 1
+31 2148 1
+31 2149 1
+31 2150 1
+31 2151 1
+31 2152 1
+31 2158 1
+31 2159 1
+31 2160 1
+31 2161 1
+31 2162 1
+31 2163 1
+31 2164 1
+31 2165 1
+31 2166 1
+31 2167 1
+31 2173 1
+31 2174 1
+31 2175 1
+31 2176 1
+31 2177 1
+31 2641 1
+31 2647 1
+31 2648 1
+31 2649 1
+31 2650 1
+31 2651 1
+31 2662 1
+31 2663 1
+31 2664 1
+31 2665 1
+31 2666 1
+31 2677 1
+31 2678 1
+31 2679 1
+31 2680 1
+31 2681 1
+31 2682 1
+31 2683 1
+31 2684 1
+31 2685 1
+31 2686 1
+31 2697 1
+31 2698 1
+31 2699 1
+31 2700 1
+31 2701 1
+31 2712 1
+31 2713 1
+31 2714 1
+31 2715 1
+31 2716 1
+31 2717 1
+31 2718 1
+31 2719 1
+31 2720 1
+31 2721 1
+31 2732 1
+31 2733 1
+31 2734 1
+31 2735 1
+31 2736 1
+31 2737 1
+31 2738 1
+31 2739 1
+31 2740 1
+31 2741 1
+31 2752 1
+31 2753 1
+31 2754 1
+31 2755 1
+31 2756 1
+31 2757 1
+31 2758 1
+31 2759 1
+31 2760 1
+31 2761 1
+31 2767 1
+31 2768 1
+31 2769 1
+31 2770 1
+31 2771 1
+31 2782 1
+31 2783 1
+31 2784 1
+31 2785 1
+31 2786 1
+31 2787 1
+31 2788 1
+31 2789 1
+31 2790 1
+31 2791 1
+31 2802 1
+31 2803 1
+31 2804 1
+31 2805 1
+31 2806 1
+31 2807 1
+31 2808 1
+31 2809 1
+31 2810 1
+31 2811 1
+31 2822 1
+31 2823 1
+31 2824 1
+31 2825 1
+31 2826 1
+31 2827 1
+31 2828 1
+31 2829 1
+31 2830 1
+31 2831 1
+31 2837 1
+31 2838 1
+31 2839 1
+31 2840 1
+31 2841 1
+31 2842 1
+31 2843 1
+31 2844 1
+31 2845 1
+31 2846 1
+31 2857 1
+31 2858 1
+31 2859 1
+31 2860 1
+31 2861 1
+31 2862 1
+31 2863 1
+31 2864 1
+31 2865 1
+31 2866 1
+31 2872 1
+31 2873 1
+31 2874 1
+31 2875 1
+31 2876 1
+31 2877 1
+31 2878 1
+31 2879 1
+31 2880 1
+31 2881 1
+31 2887 1
+31 2888 1
+31 2889 1
+31 2890 1
+31 2891 1
+31 2893 1
+31 2894 1
+31 2895 1
+31 2896 1
+31 2897 1
+31 2908 1
+31 2909 1
+31 2910 1
+31 2911 1
+31 2912 1
+31 2913 1
+31 2914 1
+31 2915 1
+31 2916 1
+31 2917 1
+31 2928 1
+31 2929 1
+31 2930 1
+31 2931 1
+31 2932 1
+31 2933 1
+31 2934 1
+31 2935 1
+31 2936 1
+31 2937 1
+31 2948 1
+31 2949 1
+31 2950 1
+31 2951 1
+31 2952 1
+31 2953 1
+31 2954 1
+31 2955 1
+31 2956 1
+31 2957 1
+31 2963 1
+31 2964 1
+31 2965 1
+31 2966 1
+31 2967 1
+31 2968 1
+31 2969 1
+31 2970 1
+31 2971 1
+31 2972 1
+31 2983 1
+31 2984 1
+31 2985 1
+31 2986 1
+31 2987 1
+31 2988 1
+31 2989 1
+31 2990 1
+31 2991 1
+31 2992 1
+31 2998 1
+31 2999 1
+31 3000 1
+31 3001 1
+31 3002 1
+31 3003 1
+31 3004 1
+31 3005 1
+31 3006 1
+31 3007 1
+31 3013 1
+31 3014 1
+31 3015 1
+31 3016 1
+31 3017 1
+31 3019 1
+31 3020 1
+31 3021 1
+31 3022 1
+31 3023 1
+31 3024 1
+31 3025 1
+31 3026 1
+31 3027 1
+31 3028 1
+31 3039 1
+31 3040 1
+31 3041 1
+31 3042 1
+31 3043 1
+31 3044 1
+31 3045 1
+31 3046 1
+31 3047 1
+31 3048 1
+31 3054 1
+31 3055 1
+31 3056 1
+31 3057 1
+31 3058 1
+31 3059 1
+31 3060 1
+31 3061 1
+31 3062 1
+31 3063 1
+31 3069 1
+31 3070 1
+31 3071 1
+31 3072 1
+31 3073 1
+31 3075 1
+31 3076 1
+31 3077 1
+31 3078 1
+31 3079 1
+31 3080 1
+31 3081 1
+31 3082 1
+31 3083 1
+31 3084 1
+31 3090 1
+31 3091 1
+31 3092 1
+31 3093 1
+31 3094 1
+31 3096 1
+31 3097 1
+31 3098 1
+31 3099 1
+31 3100 1
+31 3102 1
+32 4 1
+32 11 1
+32 17 1
+32 22 1
+32 27 1
+32 28 1
+32 29 1
+32 30 1
+32 39 1
+32 45 1
+32 50 1
+32 55 1
+32 56 1
+32 57 1
+32 58 1
+32 66 1
+32 71 1
+32 76 1
+32 77 1
+32 78 1
+32 79 1
+32 86 1
+32 91 1
+32 92 1
+32 93 1
+32 94 1
+32 101 1
+32 102 1
+32 103 1
+32 104 1
+32 111 1
+32 112 1
+32 113 1
+32 114 1
+32 115 1
+32 116 1
+32 123 1
+32 129 1
+32 134 1
+32 139 1
+32 140 1
+32 141 1
+32 142 1
+32 150 1
+32 155 1
+32 160 1
+32 161 1
+32 162 1
+32 163 1
+32 170 1
+32 175 1
+32 176 1
+32 177 1
+32 178 1
+32 185 1
+32 186 1
+32 187 1
+32 188 1
+32 195 1
+32 196 1
+32 197 1
+32 198 1
+32 199 1
+32 200 1
+32 206 1
+32 211 1
+32 216 1
+32 217 1
+32 218 1
+32 219 1
+32 226 1
+32 231 1
+32 232 1
+32 233 1
+32 234 1
+32 241 1
+32 242 1
+32 243 1
+32 244 1
+32 251 1
+32 252 1
+32 253 1
+32 254 1
+32 255 1
+32 256 1
+32 261 1
+32 266 1
+32 267 1
+32 268 1
+32 269 1
+32 276 1
+32 277 1
+32 278 1
+32 279 1
+32 286 1
+32 287 1
+32 288 1
+32 289 1
+32 290 1
+32 291 1
+32 296 1
+32 297 1
+32 298 1
+32 299 1
+32 306 1
+32 307 1
+32 308 1
+32 309 1
+32 310 1
+32 311 1
+32 316 1
+32 317 1
+32 318 1
+32 319 1
+32 320 1
+32 321 1
+32 326 1
+32 327 1
+32 328 1
+32 329 1
+32 795 1
+32 801 1
+32 806 1
+32 811 1
+32 812 1
+32 813 1
+32 814 1
+32 822 1
+32 827 1
+32 832 1
+32 833 1
+32 834 1
+32 835 1
+32 842 1
+32 847 1
+32 848 1
+32 849 1
+32 850 1
+32 857 1
+32 858 1
+32 859 1
+32 860 1
+32 867 1
+32 868 1
+32 869 1
+32 870 1
+32 871 1
+32 872 1
+32 878 1
+32 883 1
+32 888 1
+32 889 1
+32 890 1
+32 891 1
+32 898 1
+32 903 1
+32 904 1
+32 905 1
+32 906 1
+32 913 1
+32 914 1
+32 915 1
+32 916 1
+32 923 1
+32 924 1
+32 925 1
+32 926 1
+32 927 1
+32 928 1
+32 933 1
+32 938 1
+32 939 1
+32 940 1
+32 941 1
+32 948 1
+32 949 1
+32 950 1
+32 951 1
+32 958 1
+32 959 1
+32 960 1
+32 961 1
+32 962 1
+32 963 1
+32 968 1
+32 969 1
+32 970 1
+32 971 1
+32 978 1
+32 979 1
+32 980 1
+32 981 1
+32 982 1
+32 983 1
+32 988 1
+32 989 1
+32 990 1
+32 991 1
+32 992 1
+32 993 1
+32 998 1
+32 999 1
+32 1000 1
+32 1001 1
+32 1004 1
+32 1009 1
+32 1014 1
+32 1015 1
+32 1016 1
+32 1017 1
+32 1024 1
+32 1029 1
+32 1030 1
+32 1031 1
+32 1032 1
+32 1039 1
+32 1040 1
+32 1041 1
+32 1042 1
+32 1049 1
+32 1050 1
+32 1051 1
+32 1052 1
+32 1053 1
+32 1054 1
+32 1059 1
+32 1064 1
+32 1065 1
+32 1066 1
+32 1067 1
+32 1074 1
+32 1075 1
+32 1076 1
+32 1077 1
+32 1084 1
+32 1085 1
+32 1086 1
+32 1087 1
+32 1088 1
+32 1089 1
+32 1094 1
+32 1095 1
+32 1096 1
+32 1097 1
+32 1104 1
+32 1105 1
+32 1106 1
+32 1107 1
+32 1108 1
+32 1109 1
+32 1114 1
+32 1115 1
+32 1116 1
+32 1117 1
+32 1118 1
+32 1119 1
+32 1124 1
+32 1125 1
+32 1126 1
+32 1127 1
+32 1129 1
+32 1134 1
+32 1135 1
+32 1136 1
+32 1137 1
+32 1144 1
+32 1145 1
+32 1146 1
+32 1147 1
+32 1154 1
+32 1155 1
+32 1156 1
+32 1157 1
+32 1158 1
+32 1159 1
+32 1164 1
+32 1165 1
+32 1166 1
+32 1167 1
+32 1174 1
+32 1175 1
+32 1176 1
+32 1177 1
+32 1178 1
+32 1179 1
+32 1184 1
+32 1185 1
+32 1186 1
+32 1187 1
+32 1188 1
+32 1189 1
+32 1194 1
+32 1195 1
+32 1196 1
+32 1197 1
+32 1199 1
+32 1200 1
+32 1201 1
+32 1202 1
+32 1209 1
+32 1210 1
+32 1211 1
+32 1212 1
+32 1213 1
+32 1214 1
+32 1219 1
+32 1220 1
+32 1221 1
+32 1222 1
+32 1223 1
+32 1224 1
+32 1229 1
+32 1230 1
+32 1231 1
+32 1232 1
+32 1234 1
+32 1235 1
+32 1236 1
+32 1237 1
+32 1238 1
+32 1239 1
+32 1244 1
+32 1245 1
+32 1246 1
+32 1247 1
+32 1249 1
+32 1250 1
+32 1251 1
+32 1252 1
+32 1254 1
+32 1719 1
+32 1725 1
+32 1730 1
+32 1735 1
+32 1736 1
+32 1737 1
+32 1738 1
+32 1746 1
+32 1751 1
+32 1756 1
+32 1757 1
+32 1758 1
+32 1759 1
+32 1766 1
+32 1771 1
+32 1772 1
+32 1773 1
+32 1774 1
+32 1781 1
+32 1782 1
+32 1783 1
+32 1784 1
+32 1791 1
+32 1792 1
+32 1793 1
+32 1794 1
+32 1795 1
+32 1796 1
+32 1802 1
+32 1807 1
+32 1812 1
+32 1813 1
+32 1814 1
+32 1815 1
+32 1822 1
+32 1827 1
+32 1828 1
+32 1829 1
+32 1830 1
+32 1837 1
+32 1838 1
+32 1839 1
+32 1840 1
+32 1847 1
+32 1848 1
+32 1849 1
+32 1850 1
+32 1851 1
+32 1852 1
+32 1857 1
+32 1862 1
+32 1863 1
+32 1864 1
+32 1865 1
+32 1872 1
+32 1873 1
+32 1874 1
+32 1875 1
+32 1882 1
+32 1883 1
+32 1884 1
+32 1885 1
+32 1886 1
+32 1887 1
+32 1892 1
+32 1893 1
+32 1894 1
+32 1895 1
+32 1902 1
+32 1903 1
+32 1904 1
+32 1905 1
+32 1906 1
+32 1907 1
+32 1912 1
+32 1913 1
+32 1914 1
+32 1915 1
+32 1916 1
+32 1917 1
+32 1922 1
+32 1923 1
+32 1924 1
+32 1925 1
+32 1928 1
+32 1933 1
+32 1938 1
+32 1939 1
+32 1940 1
+32 1941 1
+32 1948 1
+32 1953 1
+32 1954 1
+32 1955 1
+32 1956 1
+32 1963 1
+32 1964 1
+32 1965 1
+32 1966 1
+32 1973 1
+32 1974 1
+32 1975 1
+32 1976 1
+32 1977 1
+32 1978 1
+32 1983 1
+32 1988 1
+32 1989 1
+32 1990 1
+32 1991 1
+32 1998 1
+32 1999 1
+32 2000 1
+32 2001 1
+32 2008 1
+32 2009 1
+32 2010 1
+32 2011 1
+32 2012 1
+32 2013 1
+32 2018 1
+32 2019 1
+32 2020 1
+32 2021 1
+32 2028 1
+32 2029 1
+32 2030 1
+32 2031 1
+32 2032 1
+32 2033 1
+32 2038 1
+32 2039 1
+32 2040 1
+32 2041 1
+32 2042 1
+32 2043 1
+32 2048 1
+32 2049 1
+32 2050 1
+32 2051 1
+32 2053 1
+32 2058 1
+32 2059 1
+32 2060 1
+32 2061 1
+32 2068 1
+32 2069 1
+32 2070 1
+32 2071 1
+32 2078 1
+32 2079 1
+32 2080 1
+32 2081 1
+32 2082 1
+32 2083 1
+32 2088 1
+32 2089 1
+32 2090 1
+32 2091 1
+32 2098 1
+32 2099 1
+32 2100 1
+32 2101 1
+32 2102 1
+32 2103 1
+32 2108 1
+32 2109 1
+32 2110 1
+32 2111 1
+32 2112 1
+32 2113 1
+32 2118 1
+32 2119 1
+32 2120 1
+32 2121 1
+32 2123 1
+32 2124 1
+32 2125 1
+32 2126 1
+32 2133 1
+32 2134 1
+32 2135 1
+32 2136 1
+32 2137 1
+32 2138 1
+32 2143 1
+32 2144 1
+32 2145 1
+32 2146 1
+32 2147 1
+32 2148 1
+32 2153 1
+32 2154 1
+32 2155 1
+32 2156 1
+32 2158 1
+32 2159 1
+32 2160 1
+32 2161 1
+32 2162 1
+32 2163 1
+32 2168 1
+32 2169 1
+32 2170 1
+32 2171 1
+32 2173 1
+32 2174 1
+32 2175 1
+32 2176 1
+32 2178 1
+32 2642 1
+32 2647 1
+32 2652 1
+32 2653 1
+32 2654 1
+32 2655 1
+32 2662 1
+32 2667 1
+32 2668 1
+32 2669 1
+32 2670 1
+32 2677 1
+32 2678 1
+32 2679 1
+32 2680 1
+32 2687 1
+32 2688 1
+32 2689 1
+32 2690 1
+32 2691 1
+32 2692 1
+32 2697 1
+32 2702 1
+32 2703 1
+32 2704 1
+32 2705 1
+32 2712 1
+32 2713 1
+32 2714 1
+32 2715 1
+32 2722 1
+32 2723 1
+32 2724 1
+32 2725 1
+32 2726 1
+32 2727 1
+32 2732 1
+32 2733 1
+32 2734 1
+32 2735 1
+32 2742 1
+32 2743 1
+32 2744 1
+32 2745 1
+32 2746 1
+32 2747 1
+32 2752 1
+32 2753 1
+32 2754 1
+32 2755 1
+32 2756 1
+32 2757 1
+32 2762 1
+32 2763 1
+32 2764 1
+32 2765 1
+32 2767 1
+32 2772 1
+32 2773 1
+32 2774 1
+32 2775 1
+32 2782 1
+32 2783 1
+32 2784 1
+32 2785 1
+32 2792 1
+32 2793 1
+32 2794 1
+32 2795 1
+32 2796 1
+32 2797 1
+32 2802 1
+32 2803 1
+32 2804 1
+32 2805 1
+32 2812 1
+32 2813 1
+32 2814 1
+32 2815 1
+32 2816 1
+32 2817 1
+32 2822 1
+32 2823 1
+32 2824 1
+32 2825 1
+32 2826 1
+32 2827 1
+32 2832 1
+32 2833 1
+32 2834 1
+32 2835 1
+32 2837 1
+32 2838 1
+32 2839 1
+32 2840 1
+32 2847 1
+32 2848 1
+32 2849 1
+32 2850 1
+32 2851 1
+32 2852 1
+32 2857 1
+32 2858 1
+32 2859 1
+32 2860 1
+32 2861 1
+32 2862 1
+32 2867 1
+32 2868 1
+32 2869 1
+32 2870 1
+32 2872 1
+32 2873 1
+32 2874 1
+32 2875 1
+32 2876 1
+32 2877 1
+32 2882 1
+32 2883 1
+32 2884 1
+32 2885 1
+32 2887 1
+32 2888 1
+32 2889 1
+32 2890 1
+32 2892 1
+32 2893 1
+32 2898 1
+32 2899 1
+32 2900 1
+32 2901 1
+32 2908 1
+32 2909 1
+32 2910 1
+32 2911 1
+32 2918 1
+32 2919 1
+32 2920 1
+32 2921 1
+32 2922 1
+32 2923 1
+32 2928 1
+32 2929 1
+32 2930 1
+32 2931 1
+32 2938 1
+32 2939 1
+32 2940 1
+32 2941 1
+32 2942 1
+32 2943 1
+32 2948 1
+32 2949 1
+32 2950 1
+32 2951 1
+32 2952 1
+32 2953 1
+32 2958 1
+32 2959 1
+32 2960 1
+32 2961 1
+32 2963 1
+32 2964 1
+32 2965 1
+32 2966 1
+32 2973 1
+32 2974 1
+32 2975 1
+32 2976 1
+32 2977 1
+32 2978 1
+32 2983 1
+32 2984 1
+32 2985 1
+32 2986 1
+32 2987 1
+32 2988 1
+32 2993 1
+32 2994 1
+32 2995 1
+32 2996 1
+32 2998 1
+32 2999 1
+32 3000 1
+32 3001 1
+32 3002 1
+32 3003 1
+32 3008 1
+32 3009 1
+32 3010 1
+32 3011 1
+32 3013 1
+32 3014 1
+32 3015 1
+32 3016 1
+32 3018 1
+32 3019 1
+32 3020 1
+32 3021 1
+32 3022 1
+32 3029 1
+32 3030 1
+32 3031 1
+32 3032 1
+32 3033 1
+32 3034 1
+32 3039 1
+32 3040 1
+32 3041 1
+32 3042 1
+32 3043 1
+32 3044 1
+32 3049 1
+32 3050 1
+32 3051 1
+32 3052 1
+32 3054 1
+32 3055 1
+32 3056 1
+32 3057 1
+32 3058 1
+32 3059 1
+32 3064 1
+32 3065 1
+32 3066 1
+32 3067 1
+32 3069 1
+32 3070 1
+32 3071 1
+32 3072 1
+32 3074 1
+32 3075 1
+32 3076 1
+32 3077 1
+32 3078 1
+32 3079 1
+32 3080 1
+32 3085 1
+32 3086 1
+32 3087 1
+32 3088 1
+32 3090 1
+32 3091 1
+32 3092 1
+32 3093 1
+32 3095 1
+32 3096 1
+32 3097 1
+32 3098 1
+32 3099 1
+32 3101 1
+32 3102 1
+33 5 1
+33 12 1
+33 18 1
+33 23 1
+33 27 1
+33 31 1
+33 32 1
+33 33 1
+33 40 1
+33 46 1
+33 51 1
+33 55 1
+33 59 1
+33 60 1
+33 61 1
+33 67 1
+33 72 1
+33 76 1
+33 80 1
+33 81 1
+33 82 1
+33 87 1
+33 91 1
+33 95 1
+33 96 1
+33 97 1
+33 101 1
+33 105 1
+33 106 1
+33 107 1
+33 111 1
+33 112 1
+33 113 1
+33 117 1
+33 118 1
+33 119 1
+33 124 1
+33 130 1
+33 135 1
+33 139 1
+33 143 1
+33 144 1
+33 145 1
+33 151 1
+33 156 1
+33 160 1
+33 164 1
+33 165 1
+33 166 1
+33 171 1
+33 175 1
+33 179 1
+33 180 1
+33 181 1
+33 185 1
+33 189 1
+33 190 1
+33 191 1
+33 195 1
+33 196 1
+33 197 1
+33 201 1
+33 202 1
+33 203 1
+33 207 1
+33 212 1
+33 216 1
+33 220 1
+33 221 1
+33 222 1
+33 227 1
+33 231 1
+33 235 1
+33 236 1
+33 237 1
+33 241 1
+33 245 1
+33 246 1
+33 247 1
+33 251 1
+33 252 1
+33 253 1
+33 257 1
+33 258 1
+33 259 1
+33 262 1
+33 266 1
+33 270 1
+33 271 1
+33 272 1
+33 276 1
+33 280 1
+33 281 1
+33 282 1
+33 286 1
+33 287 1
+33 288 1
+33 292 1
+33 293 1
+33 294 1
+33 296 1
+33 300 1
+33 301 1
+33 302 1
+33 306 1
+33 307 1
+33 308 1
+33 312 1
+33 313 1
+33 314 1
+33 316 1
+33 317 1
+33 318 1
+33 322 1
+33 323 1
+33 324 1
+33 326 1
+33 327 1
+33 328 1
+33 330 1
+33 796 1
+33 802 1
+33 807 1
+33 811 1
+33 815 1
+33 816 1
+33 817 1
+33 823 1
+33 828 1
+33 832 1
+33 836 1
+33 837 1
+33 838 1
+33 843 1
+33 847 1
+33 851 1
+33 852 1
+33 853 1
+33 857 1
+33 861 1
+33 862 1
+33 863 1
+33 867 1
+33 868 1
+33 869 1
+33 873 1
+33 874 1
+33 875 1
+33 879 1
+33 884 1
+33 888 1
+33 892 1
+33 893 1
+33 894 1
+33 899 1
+33 903 1
+33 907 1
+33 908 1
+33 909 1
+33 913 1
+33 917 1
+33 918 1
+33 919 1
+33 923 1
+33 924 1
+33 925 1
+33 929 1
+33 930 1
+33 931 1
+33 934 1
+33 938 1
+33 942 1
+33 943 1
+33 944 1
+33 948 1
+33 952 1
+33 953 1
+33 954 1
+33 958 1
+33 959 1
+33 960 1
+33 964 1
+33 965 1
+33 966 1
+33 968 1
+33 972 1
+33 973 1
+33 974 1
+33 978 1
+33 979 1
+33 980 1
+33 984 1
+33 985 1
+33 986 1
+33 988 1
+33 989 1
+33 990 1
+33 994 1
+33 995 1
+33 996 1
+33 998 1
+33 999 1
+33 1000 1
+33 1002 1
+33 1005 1
+33 1010 1
+33 1014 1
+33 1018 1
+33 1019 1
+33 1020 1
+33 1025 1
+33 1029 1
+33 1033 1
+33 1034 1
+33 1035 1
+33 1039 1
+33 1043 1
+33 1044 1
+33 1045 1
+33 1049 1
+33 1050 1
+33 1051 1
+33 1055 1
+33 1056 1
+33 1057 1
+33 1060 1
+33 1064 1
+33 1068 1
+33 1069 1
+33 1070 1
+33 1074 1
+33 1078 1
+33 1079 1
+33 1080 1
+33 1084 1
+33 1085 1
+33 1086 1
+33 1090 1
+33 1091 1
+33 1092 1
+33 1094 1
+33 1098 1
+33 1099 1
+33 1100 1
+33 1104 1
+33 1105 1
+33 1106 1
+33 1110 1
+33 1111 1
+33 1112 1
+33 1114 1
+33 1115 1
+33 1116 1
+33 1120 1
+33 1121 1
+33 1122 1
+33 1124 1
+33 1125 1
+33 1126 1
+33 1128 1
+33 1130 1
+33 1134 1
+33 1138 1
+33 1139 1
+33 1140 1
+33 1144 1
+33 1148 1
+33 1149 1
+33 1150 1
+33 1154 1
+33 1155 1
+33 1156 1
+33 1160 1
+33 1161 1
+33 1162 1
+33 1164 1
+33 1168 1
+33 1169 1
+33 1170 1
+33 1174 1
+33 1175 1
+33 1176 1
+33 1180 1
+33 1181 1
+33 1182 1
+33 1184 1
+33 1185 1
+33 1186 1
+33 1190 1
+33 1191 1
+33 1192 1
+33 1194 1
+33 1195 1
+33 1196 1
+33 1198 1
+33 1199 1
+33 1203 1
+33 1204 1
+33 1205 1
+33 1209 1
+33 1210 1
+33 1211 1
+33 1215 1
+33 1216 1
+33 1217 1
+33 1219 1
+33 1220 1
+33 1221 1
+33 1225 1
+33 1226 1
+33 1227 1
+33 1229 1
+33 1230 1
+33 1231 1
+33 1233 1
+33 1234 1
+33 1235 1
+33 1236 1
+33 1240 1
+33 1241 1
+33 1242 1
+33 1244 1
+33 1245 1
+33 1246 1
+33 1248 1
+33 1249 1
+33 1250 1
+33 1251 1
+33 1253 1
+33 1254 1
+33 1720 1
+33 1726 1
+33 1731 1
+33 1735 1
+33 1739 1
+33 1740 1
+33 1741 1
+33 1747 1
+33 1752 1
+33 1756 1
+33 1760 1
+33 1761 1
+33 1762 1
+33 1767 1
+33 1771 1
+33 1775 1
+33 1776 1
+33 1777 1
+33 1781 1
+33 1785 1
+33 1786 1
+33 1787 1
+33 1791 1
+33 1792 1
+33 1793 1
+33 1797 1
+33 1798 1
+33 1799 1
+33 1803 1
+33 1808 1
+33 1812 1
+33 1816 1
+33 1817 1
+33 1818 1
+33 1823 1
+33 1827 1
+33 1831 1
+33 1832 1
+33 1833 1
+33 1837 1
+33 1841 1
+33 1842 1
+33 1843 1
+33 1847 1
+33 1848 1
+33 1849 1
+33 1853 1
+33 1854 1
+33 1855 1
+33 1858 1
+33 1862 1
+33 1866 1
+33 1867 1
+33 1868 1
+33 1872 1
+33 1876 1
+33 1877 1
+33 1878 1
+33 1882 1
+33 1883 1
+33 1884 1
+33 1888 1
+33 1889 1
+33 1890 1
+33 1892 1
+33 1896 1
+33 1897 1
+33 1898 1
+33 1902 1
+33 1903 1
+33 1904 1
+33 1908 1
+33 1909 1
+33 1910 1
+33 1912 1
+33 1913 1
+33 1914 1
+33 1918 1
+33 1919 1
+33 1920 1
+33 1922 1
+33 1923 1
+33 1924 1
+33 1926 1
+33 1929 1
+33 1934 1
+33 1938 1
+33 1942 1
+33 1943 1
+33 1944 1
+33 1949 1
+33 1953 1
+33 1957 1
+33 1958 1
+33 1959 1
+33 1963 1
+33 1967 1
+33 1968 1
+33 1969 1
+33 1973 1
+33 1974 1
+33 1975 1
+33 1979 1
+33 1980 1
+33 1981 1
+33 1984 1
+33 1988 1
+33 1992 1
+33 1993 1
+33 1994 1
+33 1998 1
+33 2002 1
+33 2003 1
+33 2004 1
+33 2008 1
+33 2009 1
+33 2010 1
+33 2014 1
+33 2015 1
+33 2016 1
+33 2018 1
+33 2022 1
+33 2023 1
+33 2024 1
+33 2028 1
+33 2029 1
+33 2030 1
+33 2034 1
+33 2035 1
+33 2036 1
+33 2038 1
+33 2039 1
+33 2040 1
+33 2044 1
+33 2045 1
+33 2046 1
+33 2048 1
+33 2049 1
+33 2050 1
+33 2052 1
+33 2054 1
+33 2058 1
+33 2062 1
+33 2063 1
+33 2064 1
+33 2068 1
+33 2072 1
+33 2073 1
+33 2074 1
+33 2078 1
+33 2079 1
+33 2080 1
+33 2084 1
+33 2085 1
+33 2086 1
+33 2088 1
+33 2092 1
+33 2093 1
+33 2094 1
+33 2098 1
+33 2099 1
+33 2100 1
+33 2104 1
+33 2105 1
+33 2106 1
+33 2108 1
+33 2109 1
+33 2110 1
+33 2114 1
+33 2115 1
+33 2116 1
+33 2118 1
+33 2119 1
+33 2120 1
+33 2122 1
+33 2123 1
+33 2127 1
+33 2128 1
+33 2129 1
+33 2133 1
+33 2134 1
+33 2135 1
+33 2139 1
+33 2140 1
+33 2141 1
+33 2143 1
+33 2144 1
+33 2145 1
+33 2149 1
+33 2150 1
+33 2151 1
+33 2153 1
+33 2154 1
+33 2155 1
+33 2157 1
+33 2158 1
+33 2159 1
+33 2160 1
+33 2164 1
+33 2165 1
+33 2166 1
+33 2168 1
+33 2169 1
+33 2170 1
+33 2172 1
+33 2173 1
+33 2174 1
+33 2175 1
+33 2177 1
+33 2178 1
+33 2643 1
+33 2648 1
+33 2652 1
+33 2656 1
+33 2657 1
+33 2658 1
+33 2663 1
+33 2667 1
+33 2671 1
+33 2672 1
+33 2673 1
+33 2677 1
+33 2681 1
+33 2682 1
+33 2683 1
+33 2687 1
+33 2688 1
+33 2689 1
+33 2693 1
+33 2694 1
+33 2695 1
+33 2698 1
+33 2702 1
+33 2706 1
+33 2707 1
+33 2708 1
+33 2712 1
+33 2716 1
+33 2717 1
+33 2718 1
+33 2722 1
+33 2723 1
+33 2724 1
+33 2728 1
+33 2729 1
+33 2730 1
+33 2732 1
+33 2736 1
+33 2737 1
+33 2738 1
+33 2742 1
+33 2743 1
+33 2744 1
+33 2748 1
+33 2749 1
+33 2750 1
+33 2752 1
+33 2753 1
+33 2754 1
+33 2758 1
+33 2759 1
+33 2760 1
+33 2762 1
+33 2763 1
+33 2764 1
+33 2766 1
+33 2768 1
+33 2772 1
+33 2776 1
+33 2777 1
+33 2778 1
+33 2782 1
+33 2786 1
+33 2787 1
+33 2788 1
+33 2792 1
+33 2793 1
+33 2794 1
+33 2798 1
+33 2799 1
+33 2800 1
+33 2802 1
+33 2806 1
+33 2807 1
+33 2808 1
+33 2812 1
+33 2813 1
+33 2814 1
+33 2818 1
+33 2819 1
+33 2820 1
+33 2822 1
+33 2823 1
+33 2824 1
+33 2828 1
+33 2829 1
+33 2830 1
+33 2832 1
+33 2833 1
+33 2834 1
+33 2836 1
+33 2837 1
+33 2841 1
+33 2842 1
+33 2843 1
+33 2847 1
+33 2848 1
+33 2849 1
+33 2853 1
+33 2854 1
+33 2855 1
+33 2857 1
+33 2858 1
+33 2859 1
+33 2863 1
+33 2864 1
+33 2865 1
+33 2867 1
+33 2868 1
+33 2869 1
+33 2871 1
+33 2872 1
+33 2873 1
+33 2874 1
+33 2878 1
+33 2879 1
+33 2880 1
+33 2882 1
+33 2883 1
+33 2884 1
+33 2886 1
+33 2887 1
+33 2888 1
+33 2889 1
+33 2891 1
+33 2892 1
+33 2894 1
+33 2898 1
+33 2902 1
+33 2903 1
+33 2904 1
+33 2908 1
+33 2912 1
+33 2913 1
+33 2914 1
+33 2918 1
+33 2919 1
+33 2920 1
+33 2924 1
+33 2925 1
+33 2926 1
+33 2928 1
+33 2932 1
+33 2933 1
+33 2934 1
+33 2938 1
+33 2939 1
+33 2940 1
+33 2944 1
+33 2945 1
+33 2946 1
+33 2948 1
+33 2949 1
+33 2950 1
+33 2954 1
+33 2955 1
+33 2956 1
+33 2958 1
+33 2959 1
+33 2960 1
+33 2962 1
+33 2963 1
+33 2967 1
+33 2968 1
+33 2969 1
+33 2973 1
+33 2974 1
+33 2975 1
+33 2979 1
+33 2980 1
+33 2981 1
+33 2983 1
+33 2984 1
+33 2985 1
+33 2989 1
+33 2990 1
+33 2991 1
+33 2993 1
+33 2994 1
+33 2995 1
+33 2997 1
+33 2998 1
+33 2999 1
+33 3000 1
+33 3004 1
+33 3005 1
+33 3006 1
+33 3008 1
+33 3009 1
+33 3010 1
+33 3012 1
+33 3013 1
+33 3014 1
+33 3015 1
+33 3017 1
+33 3018 1
+33 3019 1
+33 3023 1
+33 3024 1
+33 3025 1
+33 3029 1
+33 3030 1
+33 3031 1
+33 3035 1
+33 3036 1
+33 3037 1
+33 3039 1
+33 3040 1
+33 3041 1
+33 3045 1
+33 3046 1
+33 3047 1
+33 3049 1
+33 3050 1
+33 3051 1
+33 3053 1
+33 3054 1
+33 3055 1
+33 3056 1
+33 3060 1
+33 3061 1
+33 3062 1
+33 3064 1
+33 3065 1
+33 3066 1
+33 3068 1
+33 3069 1
+33 3070 1
+33 3071 1
+33 3073 1
+33 3074 1
+33 3075 1
+33 3076 1
+33 3077 1
+33 3081 1
+33 3082 1
+33 3083 1
+33 3085 1
+33 3086 1
+33 3087 1
+33 3089 1
+33 3090 1
+33 3091 1
+33 3092 1
+33 3094 1
+33 3095 1
+33 3096 1
+33 3097 1
+33 3098 1
+33 3100 1
+33 3101 1
+33 3102 1
+34 6 1
+34 13 1
+34 19 1
+34 24 1
+34 28 1
+34 31 1
+34 34 1
+34 35 1
+34 41 1
+34 47 1
+34 52 1
+34 56 1
+34 59 1
+34 62 1
+34 63 1
+34 68 1
+34 73 1
+34 77 1
+34 80 1
+34 83 1
+34 84 1
+34 88 1
+34 92 1
+34 95 1
+34 98 1
+34 99 1
+34 102 1
+34 105 1
+34 108 1
+34 109 1
+34 111 1
+34 114 1
+34 115 1
+34 117 1
+34 118 1
+34 120 1
+34 125 1
+34 131 1
+34 136 1
+34 140 1
+34 143 1
+34 146 1
+34 147 1
+34 152 1
+34 157 1
+34 161 1
+34 164 1
+34 167 1
+34 168 1
+34 172 1
+34 176 1
+34 179 1
+34 182 1
+34 183 1
+34 186 1
+34 189 1
+34 192 1
+34 193 1
+34 195 1
+34 198 1
+34 199 1
+34 201 1
+34 202 1
+34 204 1
+34 208 1
+34 213 1
+34 217 1
+34 220 1
+34 223 1
+34 224 1
+34 228 1
+34 232 1
+34 235 1
+34 238 1
+34 239 1
+34 242 1
+34 245 1
+34 248 1
+34 249 1
+34 251 1
+34 254 1
+34 255 1
+34 257 1
+34 258 1
+34 260 1
+34 263 1
+34 267 1
+34 270 1
+34 273 1
+34 274 1
+34 277 1
+34 280 1
+34 283 1
+34 284 1
+34 286 1
+34 289 1
+34 290 1
+34 292 1
+34 293 1
+34 295 1
+34 297 1
+34 300 1
+34 303 1
+34 304 1
+34 306 1
+34 309 1
+34 310 1
+34 312 1
+34 313 1
+34 315 1
+34 316 1
+34 319 1
+34 320 1
+34 322 1
+34 323 1
+34 325 1
+34 326 1
+34 327 1
+34 329 1
+34 330 1
+34 797 1
+34 803 1
+34 808 1
+34 812 1
+34 815 1
+34 818 1
+34 819 1
+34 824 1
+34 829 1
+34 833 1
+34 836 1
+34 839 1
+34 840 1
+34 844 1
+34 848 1
+34 851 1
+34 854 1
+34 855 1
+34 858 1
+34 861 1
+34 864 1
+34 865 1
+34 867 1
+34 870 1
+34 871 1
+34 873 1
+34 874 1
+34 876 1
+34 880 1
+34 885 1
+34 889 1
+34 892 1
+34 895 1
+34 896 1
+34 900 1
+34 904 1
+34 907 1
+34 910 1
+34 911 1
+34 914 1
+34 917 1
+34 920 1
+34 921 1
+34 923 1
+34 926 1
+34 927 1
+34 929 1
+34 930 1
+34 932 1
+34 935 1
+34 939 1
+34 942 1
+34 945 1
+34 946 1
+34 949 1
+34 952 1
+34 955 1
+34 956 1
+34 958 1
+34 961 1
+34 962 1
+34 964 1
+34 965 1
+34 967 1
+34 969 1
+34 972 1
+34 975 1
+34 976 1
+34 978 1
+34 981 1
+34 982 1
+34 984 1
+34 985 1
+34 987 1
+34 988 1
+34 991 1
+34 992 1
+34 994 1
+34 995 1
+34 997 1
+34 998 1
+34 999 1
+34 1001 1
+34 1002 1
+34 1006 1
+34 1011 1
+34 1015 1
+34 1018 1
+34 1021 1
+34 1022 1
+34 1026 1
+34 1030 1
+34 1033 1
+34 1036 1
+34 1037 1
+34 1040 1
+34 1043 1
+34 1046 1
+34 1047 1
+34 1049 1
+34 1052 1
+34 1053 1
+34 1055 1
+34 1056 1
+34 1058 1
+34 1061 1
+34 1065 1
+34 1068 1
+34 1071 1
+34 1072 1
+34 1075 1
+34 1078 1
+34 1081 1
+34 1082 1
+34 1084 1
+34 1087 1
+34 1088 1
+34 1090 1
+34 1091 1
+34 1093 1
+34 1095 1
+34 1098 1
+34 1101 1
+34 1102 1
+34 1104 1
+34 1107 1
+34 1108 1
+34 1110 1
+34 1111 1
+34 1113 1
+34 1114 1
+34 1117 1
+34 1118 1
+34 1120 1
+34 1121 1
+34 1123 1
+34 1124 1
+34 1125 1
+34 1127 1
+34 1128 1
+34 1131 1
+34 1135 1
+34 1138 1
+34 1141 1
+34 1142 1
+34 1145 1
+34 1148 1
+34 1151 1
+34 1152 1
+34 1154 1
+34 1157 1
+34 1158 1
+34 1160 1
+34 1161 1
+34 1163 1
+34 1165 1
+34 1168 1
+34 1171 1
+34 1172 1
+34 1174 1
+34 1177 1
+34 1178 1
+34 1180 1
+34 1181 1
+34 1183 1
+34 1184 1
+34 1187 1
+34 1188 1
+34 1190 1
+34 1191 1
+34 1193 1
+34 1194 1
+34 1195 1
+34 1197 1
+34 1198 1
+34 1200 1
+34 1203 1
+34 1206 1
+34 1207 1
+34 1209 1
+34 1212 1
+34 1213 1
+34 1215 1
+34 1216 1
+34 1218 1
+34 1219 1
+34 1222 1
+34 1223 1
+34 1225 1
+34 1226 1
+34 1228 1
+34 1229 1
+34 1230 1
+34 1232 1
+34 1233 1
+34 1234 1
+34 1237 1
+34 1238 1
+34 1240 1
+34 1241 1
+34 1243 1
+34 1244 1
+34 1245 1
+34 1247 1
+34 1248 1
+34 1249 1
+34 1250 1
+34 1252 1
+34 1253 1
+34 1254 1
+34 1721 1
+34 1727 1
+34 1732 1
+34 1736 1
+34 1739 1
+34 1742 1
+34 1743 1
+34 1748 1
+34 1753 1
+34 1757 1
+34 1760 1
+34 1763 1
+34 1764 1
+34 1768 1
+34 1772 1
+34 1775 1
+34 1778 1
+34 1779 1
+34 1782 1
+34 1785 1
+34 1788 1
+34 1789 1
+34 1791 1
+34 1794 1
+34 1795 1
+34 1797 1
+34 1798 1
+34 1800 1
+34 1804 1
+34 1809 1
+34 1813 1
+34 1816 1
+34 1819 1
+34 1820 1
+34 1824 1
+34 1828 1
+34 1831 1
+34 1834 1
+34 1835 1
+34 1838 1
+34 1841 1
+34 1844 1
+34 1845 1
+34 1847 1
+34 1850 1
+34 1851 1
+34 1853 1
+34 1854 1
+34 1856 1
+34 1859 1
+34 1863 1
+34 1866 1
+34 1869 1
+34 1870 1
+34 1873 1
+34 1876 1
+34 1879 1
+34 1880 1
+34 1882 1
+34 1885 1
+34 1886 1
+34 1888 1
+34 1889 1
+34 1891 1
+34 1893 1
+34 1896 1
+34 1899 1
+34 1900 1
+34 1902 1
+34 1905 1
+34 1906 1
+34 1908 1
+34 1909 1
+34 1911 1
+34 1912 1
+34 1915 1
+34 1916 1
+34 1918 1
+34 1919 1
+34 1921 1
+34 1922 1
+34 1923 1
+34 1925 1
+34 1926 1
+34 1930 1
+34 1935 1
+34 1939 1
+34 1942 1
+34 1945 1
+34 1946 1
+34 1950 1
+34 1954 1
+34 1957 1
+34 1960 1
+34 1961 1
+34 1964 1
+34 1967 1
+34 1970 1
+34 1971 1
+34 1973 1
+34 1976 1
+34 1977 1
+34 1979 1
+34 1980 1
+34 1982 1
+34 1985 1
+34 1989 1
+34 1992 1
+34 1995 1
+34 1996 1
+34 1999 1
+34 2002 1
+34 2005 1
+34 2006 1
+34 2008 1
+34 2011 1
+34 2012 1
+34 2014 1
+34 2015 1
+34 2017 1
+34 2019 1
+34 2022 1
+34 2025 1
+34 2026 1
+34 2028 1
+34 2031 1
+34 2032 1
+34 2034 1
+34 2035 1
+34 2037 1
+34 2038 1
+34 2041 1
+34 2042 1
+34 2044 1
+34 2045 1
+34 2047 1
+34 2048 1
+34 2049 1
+34 2051 1
+34 2052 1
+34 2055 1
+34 2059 1
+34 2062 1
+34 2065 1
+34 2066 1
+34 2069 1
+34 2072 1
+34 2075 1
+34 2076 1
+34 2078 1
+34 2081 1
+34 2082 1
+34 2084 1
+34 2085 1
+34 2087 1
+34 2089 1
+34 2092 1
+34 2095 1
+34 2096 1
+34 2098 1
+34 2101 1
+34 2102 1
+34 2104 1
+34 2105 1
+34 2107 1
+34 2108 1
+34 2111 1
+34 2112 1
+34 2114 1
+34 2115 1
+34 2117 1
+34 2118 1
+34 2119 1
+34 2121 1
+34 2122 1
+34 2124 1
+34 2127 1
+34 2130 1
+34 2131 1
+34 2133 1
+34 2136 1
+34 2137 1
+34 2139 1
+34 2140 1
+34 2142 1
+34 2143 1
+34 2146 1
+34 2147 1
+34 2149 1
+34 2150 1
+34 2152 1
+34 2153 1
+34 2154 1
+34 2156 1
+34 2157 1
+34 2158 1
+34 2161 1
+34 2162 1
+34 2164 1
+34 2165 1
+34 2167 1
+34 2168 1
+34 2169 1
+34 2171 1
+34 2172 1
+34 2173 1
+34 2174 1
+34 2176 1
+34 2177 1
+34 2178 1
+34 2644 1
+34 2649 1
+34 2653 1
+34 2656 1
+34 2659 1
+34 2660 1
+34 2664 1
+34 2668 1
+34 2671 1
+34 2674 1
+34 2675 1
+34 2678 1
+34 2681 1
+34 2684 1
+34 2685 1
+34 2687 1
+34 2690 1
+34 2691 1
+34 2693 1
+34 2694 1
+34 2696 1
+34 2699 1
+34 2703 1
+34 2706 1
+34 2709 1
+34 2710 1
+34 2713 1
+34 2716 1
+34 2719 1
+34 2720 1
+34 2722 1
+34 2725 1
+34 2726 1
+34 2728 1
+34 2729 1
+34 2731 1
+34 2733 1
+34 2736 1
+34 2739 1
+34 2740 1
+34 2742 1
+34 2745 1
+34 2746 1
+34 2748 1
+34 2749 1
+34 2751 1
+34 2752 1
+34 2755 1
+34 2756 1
+34 2758 1
+34 2759 1
+34 2761 1
+34 2762 1
+34 2763 1
+34 2765 1
+34 2766 1
+34 2769 1
+34 2773 1
+34 2776 1
+34 2779 1
+34 2780 1
+34 2783 1
+34 2786 1
+34 2789 1
+34 2790 1
+34 2792 1
+34 2795 1
+34 2796 1
+34 2798 1
+34 2799 1
+34 2801 1
+34 2803 1
+34 2806 1
+34 2809 1
+34 2810 1
+34 2812 1
+34 2815 1
+34 2816 1
+34 2818 1
+34 2819 1
+34 2821 1
+34 2822 1
+34 2825 1
+34 2826 1
+34 2828 1
+34 2829 1
+34 2831 1
+34 2832 1
+34 2833 1
+34 2835 1
+34 2836 1
+34 2838 1
+34 2841 1
+34 2844 1
+34 2845 1
+34 2847 1
+34 2850 1
+34 2851 1
+34 2853 1
+34 2854 1
+34 2856 1
+34 2857 1
+34 2860 1
+34 2861 1
+34 2863 1
+34 2864 1
+34 2866 1
+34 2867 1
+34 2868 1
+34 2870 1
+34 2871 1
+34 2872 1
+34 2875 1
+34 2876 1
+34 2878 1
+34 2879 1
+34 2881 1
+34 2882 1
+34 2883 1
+34 2885 1
+34 2886 1
+34 2887 1
+34 2888 1
+34 2890 1
+34 2891 1
+34 2892 1
+34 2895 1
+34 2899 1
+34 2902 1
+34 2905 1
+34 2906 1
+34 2909 1
+34 2912 1
+34 2915 1
+34 2916 1
+34 2918 1
+34 2921 1
+34 2922 1
+34 2924 1
+34 2925 1
+34 2927 1
+34 2929 1
+34 2932 1
+34 2935 1
+34 2936 1
+34 2938 1
+34 2941 1
+34 2942 1
+34 2944 1
+34 2945 1
+34 2947 1
+34 2948 1
+34 2951 1
+34 2952 1
+34 2954 1
+34 2955 1
+34 2957 1
+34 2958 1
+34 2959 1
+34 2961 1
+34 2962 1
+34 2964 1
+34 2967 1
+34 2970 1
+34 2971 1
+34 2973 1
+34 2976 1
+34 2977 1
+34 2979 1
+34 2980 1
+34 2982 1
+34 2983 1
+34 2986 1
+34 2987 1
+34 2989 1
+34 2990 1
+34 2992 1
+34 2993 1
+34 2994 1
+34 2996 1
+34 2997 1
+34 2998 1
+34 3001 1
+34 3002 1
+34 3004 1
+34 3005 1
+34 3007 1
+34 3008 1
+34 3009 1
+34 3011 1
+34 3012 1
+34 3013 1
+34 3014 1
+34 3016 1
+34 3017 1
+34 3018 1
+34 3020 1
+34 3023 1
+34 3026 1
+34 3027 1
+34 3029 1
+34 3032 1
+34 3033 1
+34 3035 1
+34 3036 1
+34 3038 1
+34 3039 1
+34 3042 1
+34 3043 1
+34 3045 1
+34 3046 1
+34 3048 1
+34 3049 1
+34 3050 1
+34 3052 1
+34 3053 1
+34 3054 1
+34 3057 1
+34 3058 1
+34 3060 1
+34 3061 1
+34 3063 1
+34 3064 1
+34 3065 1
+34 3067 1
+34 3068 1
+34 3069 1
+34 3070 1
+34 3072 1
+34 3073 1
+34 3074 1
+34 3075 1
+34 3078 1
+34 3079 1
+34 3081 1
+34 3082 1
+34 3084 1
+34 3085 1
+34 3086 1
+34 3088 1
+34 3089 1
+34 3090 1
+34 3091 1
+34 3093 1
+34 3094 1
+34 3095 1
+34 3096 1
+34 3097 1
+34 3099 1
+34 3100 1
+34 3101 1
+34 3102 1
+35 7 1
+35 14 1
+35 20 1
+35 25 1
+35 29 1
+35 32 1
+35 34 1
+35 36 1
+35 42 1
+35 48 1
+35 53 1
+35 57 1
+35 60 1
+35 62 1
+35 64 1
+35 69 1
+35 74 1
+35 78 1
+35 81 1
+35 83 1
+35 85 1
+35 89 1
+35 93 1
+35 96 1
+35 98 1
+35 100 1
+35 103 1
+35 106 1
+35 108 1
+35 110 1
+35 112 1
+35 114 1
+35 116 1
+35 117 1
+35 119 1
+35 120 1
+35 126 1
+35 132 1
+35 137 1
+35 141 1
+35 144 1
+35 146 1
+35 148 1
+35 153 1
+35 158 1
+35 162 1
+35 165 1
+35 167 1
+35 169 1
+35 173 1
+35 177 1
+35 180 1
+35 182 1
+35 184 1
+35 187 1
+35 190 1
+35 192 1
+35 194 1
+35 196 1
+35 198 1
+35 200 1
+35 201 1
+35 203 1
+35 204 1
+35 209 1
+35 214 1
+35 218 1
+35 221 1
+35 223 1
+35 225 1
+35 229 1
+35 233 1
+35 236 1
+35 238 1
+35 240 1
+35 243 1
+35 246 1
+35 248 1
+35 250 1
+35 252 1
+35 254 1
+35 256 1
+35 257 1
+35 259 1
+35 260 1
+35 264 1
+35 268 1
+35 271 1
+35 273 1
+35 275 1
+35 278 1
+35 281 1
+35 283 1
+35 285 1
+35 287 1
+35 289 1
+35 291 1
+35 292 1
+35 294 1
+35 295 1
+35 298 1
+35 301 1
+35 303 1
+35 305 1
+35 307 1
+35 309 1
+35 311 1
+35 312 1
+35 314 1
+35 315 1
+35 317 1
+35 319 1
+35 321 1
+35 322 1
+35 324 1
+35 325 1
+35 326 1
+35 328 1
+35 329 1
+35 330 1
+35 798 1
+35 804 1
+35 809 1
+35 813 1
+35 816 1
+35 818 1
+35 820 1
+35 825 1
+35 830 1
+35 834 1
+35 837 1
+35 839 1
+35 841 1
+35 845 1
+35 849 1
+35 852 1
+35 854 1
+35 856 1
+35 859 1
+35 862 1
+35 864 1
+35 866 1
+35 868 1
+35 870 1
+35 872 1
+35 873 1
+35 875 1
+35 876 1
+35 881 1
+35 886 1
+35 890 1
+35 893 1
+35 895 1
+35 897 1
+35 901 1
+35 905 1
+35 908 1
+35 910 1
+35 912 1
+35 915 1
+35 918 1
+35 920 1
+35 922 1
+35 924 1
+35 926 1
+35 928 1
+35 929 1
+35 931 1
+35 932 1
+35 936 1
+35 940 1
+35 943 1
+35 945 1
+35 947 1
+35 950 1
+35 953 1
+35 955 1
+35 957 1
+35 959 1
+35 961 1
+35 963 1
+35 964 1
+35 966 1
+35 967 1
+35 970 1
+35 973 1
+35 975 1
+35 977 1
+35 979 1
+35 981 1
+35 983 1
+35 984 1
+35 986 1
+35 987 1
+35 989 1
+35 991 1
+35 993 1
+35 994 1
+35 996 1
+35 997 1
+35 998 1
+35 1000 1
+35 1001 1
+35 1002 1
+35 1007 1
+35 1012 1
+35 1016 1
+35 1019 1
+35 1021 1
+35 1023 1
+35 1027 1
+35 1031 1
+35 1034 1
+35 1036 1
+35 1038 1
+35 1041 1
+35 1044 1
+35 1046 1
+35 1048 1
+35 1050 1
+35 1052 1
+35 1054 1
+35 1055 1
+35 1057 1
+35 1058 1
+35 1062 1
+35 1066 1
+35 1069 1
+35 1071 1
+35 1073 1
+35 1076 1
+35 1079 1
+35 1081 1
+35 1083 1
+35 1085 1
+35 1087 1
+35 1089 1
+35 1090 1
+35 1092 1
+35 1093 1
+35 1096 1
+35 1099 1
+35 1101 1
+35 1103 1
+35 1105 1
+35 1107 1
+35 1109 1
+35 1110 1
+35 1112 1
+35 1113 1
+35 1115 1
+35 1117 1
+35 1119 1
+35 1120 1
+35 1122 1
+35 1123 1
+35 1124 1
+35 1126 1
+35 1127 1
+35 1128 1
+35 1132 1
+35 1136 1
+35 1139 1
+35 1141 1
+35 1143 1
+35 1146 1
+35 1149 1
+35 1151 1
+35 1153 1
+35 1155 1
+35 1157 1
+35 1159 1
+35 1160 1
+35 1162 1
+35 1163 1
+35 1166 1
+35 1169 1
+35 1171 1
+35 1173 1
+35 1175 1
+35 1177 1
+35 1179 1
+35 1180 1
+35 1182 1
+35 1183 1
+35 1185 1
+35 1187 1
+35 1189 1
+35 1190 1
+35 1192 1
+35 1193 1
+35 1194 1
+35 1196 1
+35 1197 1
+35 1198 1
+35 1201 1
+35 1204 1
+35 1206 1
+35 1208 1
+35 1210 1
+35 1212 1
+35 1214 1
+35 1215 1
+35 1217 1
+35 1218 1
+35 1220 1
+35 1222 1
+35 1224 1
+35 1225 1
+35 1227 1
+35 1228 1
+35 1229 1
+35 1231 1
+35 1232 1
+35 1233 1
+35 1235 1
+35 1237 1
+35 1239 1
+35 1240 1
+35 1242 1
+35 1243 1
+35 1244 1
+35 1246 1
+35 1247 1
+35 1248 1
+35 1249 1
+35 1251 1
+35 1252 1
+35 1253 1
+35 1254 1
+35 1722 1
+35 1728 1
+35 1733 1
+35 1737 1
+35 1740 1
+35 1742 1
+35 1744 1
+35 1749 1
+35 1754 1
+35 1758 1
+35 1761 1
+35 1763 1
+35 1765 1
+35 1769 1
+35 1773 1
+35 1776 1
+35 1778 1
+35 1780 1
+35 1783 1
+35 1786 1
+35 1788 1
+35 1790 1
+35 1792 1
+35 1794 1
+35 1796 1
+35 1797 1
+35 1799 1
+35 1800 1
+35 1805 1
+35 1810 1
+35 1814 1
+35 1817 1
+35 1819 1
+35 1821 1
+35 1825 1
+35 1829 1
+35 1832 1
+35 1834 1
+35 1836 1
+35 1839 1
+35 1842 1
+35 1844 1
+35 1846 1
+35 1848 1
+35 1850 1
+35 1852 1
+35 1853 1
+35 1855 1
+35 1856 1
+35 1860 1
+35 1864 1
+35 1867 1
+35 1869 1
+35 1871 1
+35 1874 1
+35 1877 1
+35 1879 1
+35 1881 1
+35 1883 1
+35 1885 1
+35 1887 1
+35 1888 1
+35 1890 1
+35 1891 1
+35 1894 1
+35 1897 1
+35 1899 1
+35 1901 1
+35 1903 1
+35 1905 1
+35 1907 1
+35 1908 1
+35 1910 1
+35 1911 1
+35 1913 1
+35 1915 1
+35 1917 1
+35 1918 1
+35 1920 1
+35 1921 1
+35 1922 1
+35 1924 1
+35 1925 1
+35 1926 1
+35 1931 1
+35 1936 1
+35 1940 1
+35 1943 1
+35 1945 1
+35 1947 1
+35 1951 1
+35 1955 1
+35 1958 1
+35 1960 1
+35 1962 1
+35 1965 1
+35 1968 1
+35 1970 1
+35 1972 1
+35 1974 1
+35 1976 1
+35 1978 1
+35 1979 1
+35 1981 1
+35 1982 1
+35 1986 1
+35 1990 1
+35 1993 1
+35 1995 1
+35 1997 1
+35 2000 1
+35 2003 1
+35 2005 1
+35 2007 1
+35 2009 1
+35 2011 1
+35 2013 1
+35 2014 1
+35 2016 1
+35 2017 1
+35 2020 1
+35 2023 1
+35 2025 1
+35 2027 1
+35 2029 1
+35 2031 1
+35 2033 1
+35 2034 1
+35 2036 1
+35 2037 1
+35 2039 1
+35 2041 1
+35 2043 1
+35 2044 1
+35 2046 1
+35 2047 1
+35 2048 1
+35 2050 1
+35 2051 1
+35 2052 1
+35 2056 1
+35 2060 1
+35 2063 1
+35 2065 1
+35 2067 1
+35 2070 1
+35 2073 1
+35 2075 1
+35 2077 1
+35 2079 1
+35 2081 1
+35 2083 1
+35 2084 1
+35 2086 1
+35 2087 1
+35 2090 1
+35 2093 1
+35 2095 1
+35 2097 1
+35 2099 1
+35 2101 1
+35 2103 1
+35 2104 1
+35 2106 1
+35 2107 1
+35 2109 1
+35 2111 1
+35 2113 1
+35 2114 1
+35 2116 1
+35 2117 1
+35 2118 1
+35 2120 1
+35 2121 1
+35 2122 1
+35 2125 1
+35 2128 1
+35 2130 1
+35 2132 1
+35 2134 1
+35 2136 1
+35 2138 1
+35 2139 1
+35 2141 1
+35 2142 1
+35 2144 1
+35 2146 1
+35 2148 1
+35 2149 1
+35 2151 1
+35 2152 1
+35 2153 1
+35 2155 1
+35 2156 1
+35 2157 1
+35 2159 1
+35 2161 1
+35 2163 1
+35 2164 1
+35 2166 1
+35 2167 1
+35 2168 1
+35 2170 1
+35 2171 1
+35 2172 1
+35 2173 1
+35 2175 1
+35 2176 1
+35 2177 1
+35 2178 1
+35 2645 1
+35 2650 1
+35 2654 1
+35 2657 1
+35 2659 1
+35 2661 1
+35 2665 1
+35 2669 1
+35 2672 1
+35 2674 1
+35 2676 1
+35 2679 1
+35 2682 1
+35 2684 1
+35 2686 1
+35 2688 1
+35 2690 1
+35 2692 1
+35 2693 1
+35 2695 1
+35 2696 1
+35 2700 1
+35 2704 1
+35 2707 1
+35 2709 1
+35 2711 1
+35 2714 1
+35 2717 1
+35 2719 1
+35 2721 1
+35 2723 1
+35 2725 1
+35 2727 1
+35 2728 1
+35 2730 1
+35 2731 1
+35 2734 1
+35 2737 1
+35 2739 1
+35 2741 1
+35 2743 1
+35 2745 1
+35 2747 1
+35 2748 1
+35 2750 1
+35 2751 1
+35 2753 1
+35 2755 1
+35 2757 1
+35 2758 1
+35 2760 1
+35 2761 1
+35 2762 1
+35 2764 1
+35 2765 1
+35 2766 1
+35 2770 1
+35 2774 1
+35 2777 1
+35 2779 1
+35 2781 1
+35 2784 1
+35 2787 1
+35 2789 1
+35 2791 1
+35 2793 1
+35 2795 1
+35 2797 1
+35 2798 1
+35 2800 1
+35 2801 1
+35 2804 1
+35 2807 1
+35 2809 1
+35 2811 1
+35 2813 1
+35 2815 1
+35 2817 1
+35 2818 1
+35 2820 1
+35 2821 1
+35 2823 1
+35 2825 1
+35 2827 1
+35 2828 1
+35 2830 1
+35 2831 1
+35 2832 1
+35 2834 1
+35 2835 1
+35 2836 1
+35 2839 1
+35 2842 1
+35 2844 1
+35 2846 1
+35 2848 1
+35 2850 1
+35 2852 1
+35 2853 1
+35 2855 1
+35 2856 1
+35 2858 1
+35 2860 1
+35 2862 1
+35 2863 1
+35 2865 1
+35 2866 1
+35 2867 1
+35 2869 1
+35 2870 1
+35 2871 1
+35 2873 1
+35 2875 1
+35 2877 1
+35 2878 1
+35 2880 1
+35 2881 1
+35 2882 1
+35 2884 1
+35 2885 1
+35 2886 1
+35 2887 1
+35 2889 1
+35 2890 1
+35 2891 1
+35 2892 1
+35 2896 1
+35 2900 1
+35 2903 1
+35 2905 1
+35 2907 1
+35 2910 1
+35 2913 1
+35 2915 1
+35 2917 1
+35 2919 1
+35 2921 1
+35 2923 1
+35 2924 1
+35 2926 1
+35 2927 1
+35 2930 1
+35 2933 1
+35 2935 1
+35 2937 1
+35 2939 1
+35 2941 1
+35 2943 1
+35 2944 1
+35 2946 1
+35 2947 1
+35 2949 1
+35 2951 1
+35 2953 1
+35 2954 1
+35 2956 1
+35 2957 1
+35 2958 1
+35 2960 1
+35 2961 1
+35 2962 1
+35 2965 1
+35 2968 1
+35 2970 1
+35 2972 1
+35 2974 1
+35 2976 1
+35 2978 1
+35 2979 1
+35 2981 1
+35 2982 1
+35 2984 1
+35 2986 1
+35 2988 1
+35 2989 1
+35 2991 1
+35 2992 1
+35 2993 1
+35 2995 1
+35 2996 1
+35 2997 1
+35 2999 1
+35 3001 1
+35 3003 1
+35 3004 1
+35 3006 1
+35 3007 1
+35 3008 1
+35 3010 1
+35 3011 1
+35 3012 1
+35 3013 1
+35 3015 1
+35 3016 1
+35 3017 1
+35 3018 1
+35 3021 1
+35 3024 1
+35 3026 1
+35 3028 1
+35 3030 1
+35 3032 1
+35 3034 1
+35 3035 1
+35 3037 1
+35 3038 1
+35 3040 1
+35 3042 1
+35 3044 1
+35 3045 1
+35 3047 1
+35 3048 1
+35 3049 1
+35 3051 1
+35 3052 1
+35 3053 1
+35 3055 1
+35 3057 1
+35 3059 1
+35 3060 1
+35 3062 1
+35 3063 1
+35 3064 1
+35 3066 1
+35 3067 1
+35 3068 1
+35 3069 1
+35 3071 1
+35 3072 1
+35 3073 1
+35 3074 1
+35 3076 1
+35 3078 1
+35 3080 1
+35 3081 1
+35 3083 1
+35 3084 1
+35 3085 1
+35 3087 1
+35 3088 1
+35 3089 1
+35 3090 1
+35 3092 1
+35 3093 1
+35 3094 1
+35 3095 1
+35 3096 1
+35 3098 1
+35 3099 1
+35 3100 1
+35 3101 1
+35 3102 1
+36 8 1
+36 15 1
+36 21 1
+36 26 1
+36 30 1
+36 33 1
+36 35 1
+36 36 1
+36 43 1
+36 49 1
+36 54 1
+36 58 1
+36 61 1
+36 63 1
+36 64 1
+36 70 1
+36 75 1
+36 79 1
+36 82 1
+36 84 1
+36 85 1
+36 90 1
+36 94 1
+36 97 1
+36 99 1
+36 100 1
+36 104 1
+36 107 1
+36 109 1
+36 110 1
+36 113 1
+36 115 1
+36 116 1
+36 118 1
+36 119 1
+36 120 1
+36 127 1
+36 133 1
+36 138 1
+36 142 1
+36 145 1
+36 147 1
+36 148 1
+36 154 1
+36 159 1
+36 163 1
+36 166 1
+36 168 1
+36 169 1
+36 174 1
+36 178 1
+36 181 1
+36 183 1
+36 184 1
+36 188 1
+36 191 1
+36 193 1
+36 194 1
+36 197 1
+36 199 1
+36 200 1
+36 202 1
+36 203 1
+36 204 1
+36 210 1
+36 215 1
+36 219 1
+36 222 1
+36 224 1
+36 225 1
+36 230 1
+36 234 1
+36 237 1
+36 239 1
+36 240 1
+36 244 1
+36 247 1
+36 249 1
+36 250 1
+36 253 1
+36 255 1
+36 256 1
+36 258 1
+36 259 1
+36 260 1
+36 265 1
+36 269 1
+36 272 1
+36 274 1
+36 275 1
+36 279 1
+36 282 1
+36 284 1
+36 285 1
+36 288 1
+36 290 1
+36 291 1
+36 293 1
+36 294 1
+36 295 1
+36 299 1
+36 302 1
+36 304 1
+36 305 1
+36 308 1
+36 310 1
+36 311 1
+36 313 1
+36 314 1
+36 315 1
+36 318 1
+36 320 1
+36 321 1
+36 323 1
+36 324 1
+36 325 1
+36 327 1
+36 328 1
+36 329 1
+36 330 1
+36 799 1
+36 805 1
+36 810 1
+36 814 1
+36 817 1
+36 819 1
+36 820 1
+36 826 1
+36 831 1
+36 835 1
+36 838 1
+36 840 1
+36 841 1
+36 846 1
+36 850 1
+36 853 1
+36 855 1
+36 856 1
+36 860 1
+36 863 1
+36 865 1
+36 866 1
+36 869 1
+36 871 1
+36 872 1
+36 874 1
+36 875 1
+36 876 1
+36 882 1
+36 887 1
+36 891 1
+36 894 1
+36 896 1
+36 897 1
+36 902 1
+36 906 1
+36 909 1
+36 911 1
+36 912 1
+36 916 1
+36 919 1
+36 921 1
+36 922 1
+36 925 1
+36 927 1
+36 928 1
+36 930 1
+36 931 1
+36 932 1
+36 937 1
+36 941 1
+36 944 1
+36 946 1
+36 947 1
+36 951 1
+36 954 1
+36 956 1
+36 957 1
+36 960 1
+36 962 1
+36 963 1
+36 965 1
+36 966 1
+36 967 1
+36 971 1
+36 974 1
+36 976 1
+36 977 1
+36 980 1
+36 982 1
+36 983 1
+36 985 1
+36 986 1
+36 987 1
+36 990 1
+36 992 1
+36 993 1
+36 995 1
+36 996 1
+36 997 1
+36 999 1
+36 1000 1
+36 1001 1
+36 1002 1
+36 1008 1
+36 1013 1
+36 1017 1
+36 1020 1
+36 1022 1
+36 1023 1
+36 1028 1
+36 1032 1
+36 1035 1
+36 1037 1
+36 1038 1
+36 1042 1
+36 1045 1
+36 1047 1
+36 1048 1
+36 1051 1
+36 1053 1
+36 1054 1
+36 1056 1
+36 1057 1
+36 1058 1
+36 1063 1
+36 1067 1
+36 1070 1
+36 1072 1
+36 1073 1
+36 1077 1
+36 1080 1
+36 1082 1
+36 1083 1
+36 1086 1
+36 1088 1
+36 1089 1
+36 1091 1
+36 1092 1
+36 1093 1
+36 1097 1
+36 1100 1
+36 1102 1
+36 1103 1
+36 1106 1
+36 1108 1
+36 1109 1
+36 1111 1
+36 1112 1
+36 1113 1
+36 1116 1
+36 1118 1
+36 1119 1
+36 1121 1
+36 1122 1
+36 1123 1
+36 1125 1
+36 1126 1
+36 1127 1
+36 1128 1
+36 1133 1
+36 1137 1
+36 1140 1
+36 1142 1
+36 1143 1
+36 1147 1
+36 1150 1
+36 1152 1
+36 1153 1
+36 1156 1
+36 1158 1
+36 1159 1
+36 1161 1
+36 1162 1
+36 1163 1
+36 1167 1
+36 1170 1
+36 1172 1
+36 1173 1
+36 1176 1
+36 1178 1
+36 1179 1
+36 1181 1
+36 1182 1
+36 1183 1
+36 1186 1
+36 1188 1
+36 1189 1
+36 1191 1
+36 1192 1
+36 1193 1
+36 1195 1
+36 1196 1
+36 1197 1
+36 1198 1
+36 1202 1
+36 1205 1
+36 1207 1
+36 1208 1
+36 1211 1
+36 1213 1
+36 1214 1
+36 1216 1
+36 1217 1
+36 1218 1
+36 1221 1
+36 1223 1
+36 1224 1
+36 1226 1
+36 1227 1
+36 1228 1
+36 1230 1
+36 1231 1
+36 1232 1
+36 1233 1
+36 1236 1
+36 1238 1
+36 1239 1
+36 1241 1
+36 1242 1
+36 1243 1
+36 1245 1
+36 1246 1
+36 1247 1
+36 1248 1
+36 1250 1
+36 1251 1
+36 1252 1
+36 1253 1
+36 1254 1
+36 1723 1
+36 1729 1
+36 1734 1
+36 1738 1
+36 1741 1
+36 1743 1
+36 1744 1
+36 1750 1
+36 1755 1
+36 1759 1
+36 1762 1
+36 1764 1
+36 1765 1
+36 1770 1
+36 1774 1
+36 1777 1
+36 1779 1
+36 1780 1
+36 1784 1
+36 1787 1
+36 1789 1
+36 1790 1
+36 1793 1
+36 1795 1
+36 1796 1
+36 1798 1
+36 1799 1
+36 1800 1
+36 1806 1
+36 1811 1
+36 1815 1
+36 1818 1
+36 1820 1
+36 1821 1
+36 1826 1
+36 1830 1
+36 1833 1
+36 1835 1
+36 1836 1
+36 1840 1
+36 1843 1
+36 1845 1
+36 1846 1
+36 1849 1
+36 1851 1
+36 1852 1
+36 1854 1
+36 1855 1
+36 1856 1
+36 1861 1
+36 1865 1
+36 1868 1
+36 1870 1
+36 1871 1
+36 1875 1
+36 1878 1
+36 1880 1
+36 1881 1
+36 1884 1
+36 1886 1
+36 1887 1
+36 1889 1
+36 1890 1
+36 1891 1
+36 1895 1
+36 1898 1
+36 1900 1
+36 1901 1
+36 1904 1
+36 1906 1
+36 1907 1
+36 1909 1
+36 1910 1
+36 1911 1
+36 1914 1
+36 1916 1
+36 1917 1
+36 1919 1
+36 1920 1
+36 1921 1
+36 1923 1
+36 1924 1
+36 1925 1
+36 1926 1
+36 1932 1
+36 1937 1
+36 1941 1
+36 1944 1
+36 1946 1
+36 1947 1
+36 1952 1
+36 1956 1
+36 1959 1
+36 1961 1
+36 1962 1
+36 1966 1
+36 1969 1
+36 1971 1
+36 1972 1
+36 1975 1
+36 1977 1
+36 1978 1
+36 1980 1
+36 1981 1
+36 1982 1
+36 1987 1
+36 1991 1
+36 1994 1
+36 1996 1
+36 1997 1
+36 2001 1
+36 2004 1
+36 2006 1
+36 2007 1
+36 2010 1
+36 2012 1
+36 2013 1
+36 2015 1
+36 2016 1
+36 2017 1
+36 2021 1
+36 2024 1
+36 2026 1
+36 2027 1
+36 2030 1
+36 2032 1
+36 2033 1
+36 2035 1
+36 2036 1
+36 2037 1
+36 2040 1
+36 2042 1
+36 2043 1
+36 2045 1
+36 2046 1
+36 2047 1
+36 2049 1
+36 2050 1
+36 2051 1
+36 2052 1
+36 2057 1
+36 2061 1
+36 2064 1
+36 2066 1
+36 2067 1
+36 2071 1
+36 2074 1
+36 2076 1
+36 2077 1
+36 2080 1
+36 2082 1
+36 2083 1
+36 2085 1
+36 2086 1
+36 2087 1
+36 2091 1
+36 2094 1
+36 2096 1
+36 2097 1
+36 2100 1
+36 2102 1
+36 2103 1
+36 2105 1
+36 2106 1
+36 2107 1
+36 2110 1
+36 2112 1
+36 2113 1
+36 2115 1
+36 2116 1
+36 2117 1
+36 2119 1
+36 2120 1
+36 2121 1
+36 2122 1
+36 2126 1
+36 2129 1
+36 2131 1
+36 2132 1
+36 2135 1
+36 2137 1
+36 2138 1
+36 2140 1
+36 2141 1
+36 2142 1
+36 2145 1
+36 2147 1
+36 2148 1
+36 2150 1
+36 2151 1
+36 2152 1
+36 2154 1
+36 2155 1
+36 2156 1
+36 2157 1
+36 2160 1
+36 2162 1
+36 2163 1
+36 2165 1
+36 2166 1
+36 2167 1
+36 2169 1
+36 2170 1
+36 2171 1
+36 2172 1
+36 2174 1
+36 2175 1
+36 2176 1
+36 2177 1
+36 2178 1
+36 2646 1
+36 2651 1
+36 2655 1
+36 2658 1
+36 2660 1
+36 2661 1
+36 2666 1
+36 2670 1
+36 2673 1
+36 2675 1
+36 2676 1
+36 2680 1
+36 2683 1
+36 2685 1
+36 2686 1
+36 2689 1
+36 2691 1
+36 2692 1
+36 2694 1
+36 2695 1
+36 2696 1
+36 2701 1
+36 2705 1
+36 2708 1
+36 2710 1
+36 2711 1
+36 2715 1
+36 2718 1
+36 2720 1
+36 2721 1
+36 2724 1
+36 2726 1
+36 2727 1
+36 2729 1
+36 2730 1
+36 2731 1
+36 2735 1
+36 2738 1
+36 2740 1
+36 2741 1
+36 2744 1
+36 2746 1
+36 2747 1
+36 2749 1
+36 2750 1
+36 2751 1
+36 2754 1
+36 2756 1
+36 2757 1
+36 2759 1
+36 2760 1
+36 2761 1
+36 2763 1
+36 2764 1
+36 2765 1
+36 2766 1
+36 2771 1
+36 2775 1
+36 2778 1
+36 2780 1
+36 2781 1
+36 2785 1
+36 2788 1
+36 2790 1
+36 2791 1
+36 2794 1
+36 2796 1
+36 2797 1
+36 2799 1
+36 2800 1
+36 2801 1
+36 2805 1
+36 2808 1
+36 2810 1
+36 2811 1
+36 2814 1
+36 2816 1
+36 2817 1
+36 2819 1
+36 2820 1
+36 2821 1
+36 2824 1
+36 2826 1
+36 2827 1
+36 2829 1
+36 2830 1
+36 2831 1
+36 2833 1
+36 2834 1
+36 2835 1
+36 2836 1
+36 2840 1
+36 2843 1
+36 2845 1
+36 2846 1
+36 2849 1
+36 2851 1
+36 2852 1
+36 2854 1
+36 2855 1
+36 2856 1
+36 2859 1
+36 2861 1
+36 2862 1
+36 2864 1
+36 2865 1
+36 2866 1
+36 2868 1
+36 2869 1
+36 2870 1
+36 2871 1
+36 2874 1
+36 2876 1
+36 2877 1
+36 2879 1
+36 2880 1
+36 2881 1
+36 2883 1
+36 2884 1
+36 2885 1
+36 2886 1
+36 2888 1
+36 2889 1
+36 2890 1
+36 2891 1
+36 2892 1
+36 2897 1
+36 2901 1
+36 2904 1
+36 2906 1
+36 2907 1
+36 2911 1
+36 2914 1
+36 2916 1
+36 2917 1
+36 2920 1
+36 2922 1
+36 2923 1
+36 2925 1
+36 2926 1
+36 2927 1
+36 2931 1
+36 2934 1
+36 2936 1
+36 2937 1
+36 2940 1
+36 2942 1
+36 2943 1
+36 2945 1
+36 2946 1
+36 2947 1
+36 2950 1
+36 2952 1
+36 2953 1
+36 2955 1
+36 2956 1
+36 2957 1
+36 2959 1
+36 2960 1
+36 2961 1
+36 2962 1
+36 2966 1
+36 2969 1
+36 2971 1
+36 2972 1
+36 2975 1
+36 2977 1
+36 2978 1
+36 2980 1
+36 2981 1
+36 2982 1
+36 2985 1
+36 2987 1
+36 2988 1
+36 2990 1
+36 2991 1
+36 2992 1
+36 2994 1
+36 2995 1
+36 2996 1
+36 2997 1
+36 3000 1
+36 3002 1
+36 3003 1
+36 3005 1
+36 3006 1
+36 3007 1
+36 3009 1
+36 3010 1
+36 3011 1
+36 3012 1
+36 3014 1
+36 3015 1
+36 3016 1
+36 3017 1
+36 3018 1
+36 3022 1
+36 3025 1
+36 3027 1
+36 3028 1
+36 3031 1
+36 3033 1
+36 3034 1
+36 3036 1
+36 3037 1
+36 3038 1
+36 3041 1
+36 3043 1
+36 3044 1
+36 3046 1
+36 3047 1
+36 3048 1
+36 3050 1
+36 3051 1
+36 3052 1
+36 3053 1
+36 3056 1
+36 3058 1
+36 3059 1
+36 3061 1
+36 3062 1
+36 3063 1
+36 3065 1
+36 3066 1
+36 3067 1
+36 3068 1
+36 3070 1
+36 3071 1
+36 3072 1
+36 3073 1
+36 3074 1
+36 3077 1
+36 3079 1
+36 3080 1
+36 3082 1
+36 3083 1
+36 3084 1
+36 3086 1
+36 3087 1
+36 3088 1
+36 3089 1
+36 3091 1
+36 3092 1
+36 3093 1
+36 3094 1
+36 3095 1
+36 3097 1
+36 3098 1
+36 3099 1
+36 3100 1
+36 3101 1
+36 3102 1
+37 1 1
+37 2 1
+37 3 1
+37 4 1
+37 5 1
+37 6 1
+37 7 1
+37 8 1
+37 9 1
+37 10 1
+37 11 1
+37 12 1
+37 13 1
+37 14 1
+37 15 1
+37 16 1
+37 17 1
+37 18 1
+37 19 1
+37 20 1
+37 21 1
+37 22 1
+37 23 1
+37 24 1
+37 25 1
+37 26 1
+37 27 1
+37 28 1
+37 29 1
+37 30 1
+37 31 1
+37 32 1
+37 33 1
+37 34 1
+37 35 1
+37 36 1
+37 331 1
+37 332 1
+37 333 1
+37 334 1
+37 335 1
+37 336 1
+37 337 1
+37 338 1
+37 339 1
+37 340 1
+37 341 1
+37 342 1
+37 343 1
+37 344 1
+37 345 1
+37 346 1
+37 347 1
+37 348 1
+37 349 1
+37 350 1
+37 351 1
+37 352 1
+37 353 1
+37 354 1
+37 355 1
+37 356 1
+37 357 1
+37 358 1
+37 359 1
+37 360 1
+37 361 1
+37 362 1
+37 363 1
+37 364 1
+37 365 1
+37 366 1
+37 367 1
+37 368 1
+37 369 1
+37 370 1
+37 371 1
+37 372 1
+37 373 1
+37 374 1
+37 375 1
+37 376 1
+37 377 1
+37 378 1
+37 379 1
+37 380 1
+37 381 1
+37 382 1
+37 383 1
+37 384 1
+37 385 1
+37 386 1
+37 387 1
+37 388 1
+37 389 1
+37 390 1
+37 391 1
+37 392 1
+37 393 1
+37 394 1
+37 395 1
+37 396 1
+37 397 1
+37 398 1
+37 399 1
+37 400 1
+37 401 1
+37 402 1
+37 403 1
+37 404 1
+37 405 1
+37 406 1
+37 407 1
+37 408 1
+37 409 1
+37 410 1
+37 411 1
+37 412 1
+37 413 1
+37 414 1
+37 793 1
+37 794 1
+37 795 1
+37 796 1
+37 797 1
+37 798 1
+37 799 1
+37 800 1
+37 801 1
+37 802 1
+37 803 1
+37 804 1
+37 805 1
+37 806 1
+37 807 1
+37 808 1
+37 809 1
+37 810 1
+37 811 1
+37 812 1
+37 813 1
+37 814 1
+37 815 1
+37 816 1
+37 817 1
+37 818 1
+37 819 1
+37 820 1
+37 821 1
+37 822 1
+37 823 1
+37 824 1
+37 825 1
+37 826 1
+37 827 1
+37 828 1
+37 829 1
+37 830 1
+37 831 1
+37 832 1
+37 833 1
+37 834 1
+37 835 1
+37 836 1
+37 837 1
+37 838 1
+37 839 1
+37 840 1
+37 841 1
+37 842 1
+37 843 1
+37 844 1
+37 845 1
+37 846 1
+37 847 1
+37 848 1
+37 849 1
+37 850 1
+37 851 1
+37 852 1
+37 853 1
+37 854 1
+37 855 1
+37 856 1
+37 857 1
+37 858 1
+37 859 1
+37 860 1
+37 861 1
+37 862 1
+37 863 1
+37 864 1
+37 865 1
+37 866 1
+37 867 1
+37 868 1
+37 869 1
+37 870 1
+37 871 1
+37 872 1
+37 873 1
+37 874 1
+37 875 1
+37 876 1
+37 1255 1
+37 1256 1
+37 1257 1
+37 1258 1
+37 1259 1
+37 1260 1
+37 1261 1
+37 1262 1
+37 1263 1
+37 1264 1
+37 1265 1
+37 1266 1
+37 1267 1
+37 1268 1
+37 1269 1
+37 1270 1
+37 1271 1
+37 1272 1
+37 1273 1
+37 1274 1
+37 1275 1
+37 1276 1
+37 1277 1
+37 1278 1
+37 1279 1
+37 1280 1
+37 1281 1
+37 1282 1
+37 1283 1
+37 1284 1
+37 1285 1
+37 1286 1
+37 1287 1
+37 1288 1
+37 1289 1
+37 1290 1
+37 1291 1
+37 1292 1
+37 1293 1
+37 1294 1
+37 1295 1
+37 1296 1
+37 1297 1
+37 1298 1
+37 1299 1
+37 1300 1
+37 1301 1
+37 1302 1
+37 1303 1
+37 1304 1
+37 1305 1
+37 1306 1
+37 1307 1
+37 1308 1
+37 1309 1
+37 1310 1
+37 1311 1
+37 1312 1
+37 1313 1
+37 1314 1
+37 1315 1
+37 1316 1
+37 1317 1
+37 1318 1
+37 1319 1
+37 1320 1
+37 1321 1
+37 1322 1
+37 1323 1
+37 1324 1
+37 1325 1
+37 1326 1
+37 1327 1
+37 1328 1
+37 1329 1
+37 1330 1
+37 1331 1
+37 1332 1
+37 1333 1
+37 1334 1
+37 1335 1
+37 1336 1
+37 1337 1
+37 1338 1
+37 1339 1
+37 1340 1
+37 1341 1
+37 1342 1
+37 1343 1
+37 1344 1
+37 1345 1
+37 1346 1
+37 1347 1
+37 1348 1
+37 1349 1
+37 1350 1
+37 1351 1
+37 1352 1
+37 1353 1
+37 1354 1
+37 1355 1
+37 1356 1
+37 1357 1
+37 1358 1
+37 1359 1
+37 1360 1
+37 1361 1
+37 1362 1
+37 1363 1
+37 1364 1
+37 1365 1
+37 1366 1
+37 1367 1
+37 1368 1
+37 1369 1
+37 1370 1
+37 1371 1
+37 1372 1
+37 1373 1
+37 1374 1
+37 1375 1
+37 1376 1
+37 1377 1
+37 1378 1
+37 1379 1
+37 1380 1
+37 1717 1
+37 1718 1
+37 1719 1
+37 1720 1
+37 1721 1
+37 1722 1
+37 1723 1
+37 1724 1
+37 1725 1
+37 1726 1
+37 1727 1
+37 1728 1
+37 1729 1
+37 1730 1
+37 1731 1
+37 1732 1
+37 1733 1
+37 1734 1
+37 1735 1
+37 1736 1
+37 1737 1
+37 1738 1
+37 1739 1
+37 1740 1
+37 1741 1
+37 1742 1
+37 1743 1
+37 1744 1
+37 1745 1
+37 1746 1
+37 1747 1
+37 1748 1
+37 1749 1
+37 1750 1
+37 1751 1
+37 1752 1
+37 1753 1
+37 1754 1
+37 1755 1
+37 1756 1
+37 1757 1
+37 1758 1
+37 1759 1
+37 1760 1
+37 1761 1
+37 1762 1
+37 1763 1
+37 1764 1
+37 1765 1
+37 1766 1
+37 1767 1
+37 1768 1
+37 1769 1
+37 1770 1
+37 1771 1
+37 1772 1
+37 1773 1
+37 1774 1
+37 1775 1
+37 1776 1
+37 1777 1
+37 1778 1
+37 1779 1
+37 1780 1
+37 1781 1
+37 1782 1
+37 1783 1
+37 1784 1
+37 1785 1
+37 1786 1
+37 1787 1
+37 1788 1
+37 1789 1
+37 1790 1
+37 1791 1
+37 1792 1
+37 1793 1
+37 1794 1
+37 1795 1
+37 1796 1
+37 1797 1
+37 1798 1
+37 1799 1
+37 1800 1
+37 2179 1
+37 2180 1
+37 2181 1
+37 2182 1
+37 2183 1
+37 2184 1
+37 2185 1
+37 2186 1
+37 2187 1
+37 2188 1
+37 2189 1
+37 2190 1
+37 2191 1
+37 2192 1
+37 2193 1
+37 2194 1
+37 2195 1
+37 2196 1
+37 2197 1
+37 2198 1
+37 2199 1
+37 2200 1
+37 2201 1
+37 2202 1
+37 2203 1
+37 2204 1
+37 2205 1
+37 2206 1
+37 2207 1
+37 2208 1
+37 2209 1
+37 2210 1
+37 2211 1
+37 2212 1
+37 2213 1
+37 2214 1
+37 2215 1
+37 2216 1
+37 2217 1
+37 2218 1
+37 2219 1
+37 2220 1
+37 2221 1
+37 2222 1
+37 2223 1
+37 2224 1
+37 2225 1
+37 2226 1
+37 2227 1
+37 2228 1
+37 2229 1
+37 2230 1
+37 2231 1
+37 2232 1
+37 2233 1
+37 2234 1
+37 2235 1
+37 2236 1
+37 2237 1
+37 2238 1
+37 2239 1
+37 2240 1
+37 2241 1
+37 2242 1
+37 2243 1
+37 2244 1
+37 2245 1
+37 2246 1
+37 2247 1
+37 2248 1
+37 2249 1
+37 2250 1
+37 2251 1
+37 2252 1
+37 2253 1
+37 2254 1
+37 2255 1
+37 2256 1
+37 2257 1
+37 2258 1
+37 2259 1
+37 2260 1
+37 2261 1
+37 2262 1
+37 2263 1
+37 2264 1
+37 2265 1
+37 2266 1
+37 2267 1
+37 2268 1
+37 2269 1
+37 2270 1
+37 2271 1
+37 2272 1
+37 2273 1
+37 2274 1
+37 2275 1
+37 2276 1
+37 2277 1
+37 2278 1
+37 2279 1
+37 2280 1
+37 2281 1
+37 2282 1
+37 2283 1
+37 2284 1
+37 2285 1
+37 2286 1
+37 2287 1
+37 2288 1
+37 2289 1
+37 2290 1
+37 2291 1
+37 2292 1
+37 2293 1
+37 2294 1
+37 2295 1
+37 2296 1
+37 2297 1
+37 2298 1
+37 2299 1
+37 2300 1
+37 2301 1
+37 2302 1
+37 2303 1
+37 2304 1
+37 2641 1
+37 2642 1
+37 2643 1
+37 2644 1
+37 2645 1
+37 2646 1
+37 2647 1
+37 2648 1
+37 2649 1
+37 2650 1
+37 2651 1
+37 2652 1
+37 2653 1
+37 2654 1
+37 2655 1
+37 2656 1
+37 2657 1
+37 2658 1
+37 2659 1
+37 2660 1
+37 2661 1
+37 2662 1
+37 2663 1
+37 2664 1
+37 2665 1
+37 2666 1
+37 2667 1
+37 2668 1
+37 2669 1
+37 2670 1
+37 2671 1
+37 2672 1
+37 2673 1
+37 2674 1
+37 2675 1
+37 2676 1
+37 2677 1
+37 2678 1
+37 2679 1
+37 2680 1
+37 2681 1
+37 2682 1
+37 2683 1
+37 2684 1
+37 2685 1
+37 2686 1
+37 2687 1
+37 2688 1
+37 2689 1
+37 2690 1
+37 2691 1
+37 2692 1
+37 2693 1
+37 2694 1
+37 2695 1
+37 2696 1
+37 2697 1
+37 2698 1
+37 2699 1
+37 2700 1
+37 2701 1
+37 2702 1
+37 2703 1
+37 2704 1
+37 2705 1
+37 2706 1
+37 2707 1
+37 2708 1
+37 2709 1
+37 2710 1
+37 2711 1
+37 2712 1
+37 2713 1
+37 2714 1
+37 2715 1
+37 2716 1
+37 2717 1
+37 2718 1
+37 2719 1
+37 2720 1
+37 2721 1
+37 2722 1
+37 2723 1
+37 2724 1
+37 2725 1
+37 2726 1
+37 2727 1
+37 2728 1
+37 2729 1
+37 2730 1
+37 2731 1
+37 2732 1
+37 2733 1
+37 2734 1
+37 2735 1
+37 2736 1
+37 2737 1
+37 2738 1
+37 2739 1
+37 2740 1
+37 2741 1
+37 2742 1
+37 2743 1
+37 2744 1
+37 2745 1
+37 2746 1
+37 2747 1
+37 2748 1
+37 2749 1
+37 2750 1
+37 2751 1
+37 2752 1
+37 2753 1
+37 2754 1
+37 2755 1
+37 2756 1
+37 2757 1
+37 2758 1
+37 2759 1
+37 2760 1
+37 2761 1
+37 2762 1
+37 2763 1
+37 2764 1
+37 2765 1
+37 2766 1
+37 3103 1
+37 3104 1
+37 3105 1
+37 3106 1
+37 3107 1
+37 3108 1
+37 3109 1
+37 3110 1
+37 3111 1
+37 3112 1
+37 3113 1
+37 3114 1
+37 3115 1
+37 3116 1
+37 3117 1
+37 3118 1
+37 3119 1
+37 3120 1
+37 3121 1
+37 3122 1
+37 3123 1
+37 3124 1
+37 3125 1
+37 3126 1
+37 3127 1
+37 3128 1
+37 3129 1
+37 3130 1
+37 3131 1
+37 3132 1
+37 3133 1
+37 3134 1
+37 3135 1
+37 3136 1
+37 3137 1
+37 3138 1
+37 3139 1
+37 3140 1
+37 3141 1
+37 3142 1
+37 3143 1
+37 3144 1
+37 3145 1
+37 3146 1
+37 3147 1
+37 3148 1
+37 3149 1
+37 3150 1
+37 3151 1
+37 3152 1
+37 3153 1
+37 3154 1
+37 3155 1
+37 3156 1
+37 3157 1
+37 3158 1
+37 3159 1
+37 3160 1
+37 3161 1
+37 3162 1
+37 3163 1
+37 3164 1
+37 3165 1
+37 3166 1
+37 3167 1
+37 3168 1
+37 3169 1
+37 3170 1
+37 3171 1
+37 3172 1
+37 3173 1
+37 3174 1
+37 3175 1
+37 3176 1
+37 3177 1
+37 3178 1
+37 3179 1
+37 3180 1
+37 3181 1
+37 3182 1
+37 3183 1
+37 3184 1
+37 3185 1
+37 3186 1
+37 3187 1
+37 3188 1
+37 3189 1
+37 3190 1
+37 3191 1
+37 3192 1
+37 3193 1
+37 3194 1
+37 3195 1
+37 3196 1
+37 3197 1
+37 3198 1
+37 3199 1
+37 3200 1
+37 3201 1
+37 3202 1
+37 3203 1
+37 3204 1
+37 3205 1
+37 3206 1
+37 3207 1
+37 3208 1
+37 3209 1
+37 3210 1
+37 3211 1
+37 3212 1
+37 3213 1
+37 3214 1
+37 3215 1
+37 3216 1
+37 3217 1
+37 3218 1
+37 3219 1
+37 3220 1
+37 3221 1
+37 3222 1
+37 3223 1
+37 3224 1
+37 3225 1
+37 3226 1
+37 3227 1
+37 3228 1
+38 1 1
+38 2 1
+38 3 1
+38 4 1
+38 5 1
+38 6 1
+38 7 1
+38 8 1
+38 37 1
+38 38 1
+38 39 1
+38 40 1
+38 41 1
+38 42 1
+38 43 1
+38 44 1
+38 45 1
+38 46 1
+38 47 1
+38 48 1
+38 49 1
+38 50 1
+38 51 1
+38 52 1
+38 53 1
+38 54 1
+38 55 1
+38 56 1
+38 57 1
+38 58 1
+38 59 1
+38 60 1
+38 61 1
+38 62 1
+38 63 1
+38 64 1
+38 331 1
+38 332 1
+38 333 1
+38 334 1
+38 335 1
+38 336 1
+38 337 1
+38 338 1
+38 339 1
+38 340 1
+38 341 1
+38 342 1
+38 343 1
+38 344 1
+38 345 1
+38 346 1
+38 347 1
+38 348 1
+38 349 1
+38 350 1
+38 351 1
+38 352 1
+38 353 1
+38 354 1
+38 355 1
+38 356 1
+38 357 1
+38 358 1
+38 415 1
+38 416 1
+38 417 1
+38 418 1
+38 419 1
+38 420 1
+38 421 1
+38 422 1
+38 423 1
+38 424 1
+38 425 1
+38 426 1
+38 427 1
+38 428 1
+38 429 1
+38 430 1
+38 431 1
+38 432 1
+38 433 1
+38 434 1
+38 435 1
+38 436 1
+38 437 1
+38 438 1
+38 439 1
+38 440 1
+38 441 1
+38 442 1
+38 443 1
+38 444 1
+38 445 1
+38 446 1
+38 447 1
+38 448 1
+38 449 1
+38 450 1
+38 451 1
+38 452 1
+38 453 1
+38 454 1
+38 455 1
+38 456 1
+38 457 1
+38 458 1
+38 459 1
+38 460 1
+38 461 1
+38 462 1
+38 463 1
+38 464 1
+38 465 1
+38 466 1
+38 467 1
+38 468 1
+38 469 1
+38 470 1
+38 793 1
+38 794 1
+38 795 1
+38 796 1
+38 797 1
+38 798 1
+38 799 1
+38 800 1
+38 801 1
+38 802 1
+38 803 1
+38 804 1
+38 805 1
+38 806 1
+38 807 1
+38 808 1
+38 809 1
+38 810 1
+38 811 1
+38 812 1
+38 813 1
+38 814 1
+38 815 1
+38 816 1
+38 817 1
+38 818 1
+38 819 1
+38 820 1
+38 877 1
+38 878 1
+38 879 1
+38 880 1
+38 881 1
+38 882 1
+38 883 1
+38 884 1
+38 885 1
+38 886 1
+38 887 1
+38 888 1
+38 889 1
+38 890 1
+38 891 1
+38 892 1
+38 893 1
+38 894 1
+38 895 1
+38 896 1
+38 897 1
+38 898 1
+38 899 1
+38 900 1
+38 901 1
+38 902 1
+38 903 1
+38 904 1
+38 905 1
+38 906 1
+38 907 1
+38 908 1
+38 909 1
+38 910 1
+38 911 1
+38 912 1
+38 913 1
+38 914 1
+38 915 1
+38 916 1
+38 917 1
+38 918 1
+38 919 1
+38 920 1
+38 921 1
+38 922 1
+38 923 1
+38 924 1
+38 925 1
+38 926 1
+38 927 1
+38 928 1
+38 929 1
+38 930 1
+38 931 1
+38 932 1
+38 1255 1
+38 1256 1
+38 1257 1
+38 1258 1
+38 1259 1
+38 1260 1
+38 1261 1
+38 1262 1
+38 1263 1
+38 1264 1
+38 1265 1
+38 1266 1
+38 1267 1
+38 1268 1
+38 1269 1
+38 1270 1
+38 1271 1
+38 1272 1
+38 1273 1
+38 1274 1
+38 1275 1
+38 1276 1
+38 1277 1
+38 1278 1
+38 1279 1
+38 1280 1
+38 1281 1
+38 1282 1
+38 1283 1
+38 1284 1
+38 1285 1
+38 1286 1
+38 1287 1
+38 1288 1
+38 1289 1
+38 1290 1
+38 1291 1
+38 1292 1
+38 1293 1
+38 1294 1
+38 1295 1
+38 1296 1
+38 1297 1
+38 1298 1
+38 1299 1
+38 1300 1
+38 1301 1
+38 1302 1
+38 1303 1
+38 1304 1
+38 1305 1
+38 1306 1
+38 1307 1
+38 1308 1
+38 1309 1
+38 1310 1
+38 1381 1
+38 1382 1
+38 1383 1
+38 1384 1
+38 1385 1
+38 1386 1
+38 1387 1
+38 1388 1
+38 1389 1
+38 1390 1
+38 1391 1
+38 1392 1
+38 1393 1
+38 1394 1
+38 1395 1
+38 1396 1
+38 1397 1
+38 1398 1
+38 1399 1
+38 1400 1
+38 1401 1
+38 1402 1
+38 1403 1
+38 1404 1
+38 1405 1
+38 1406 1
+38 1407 1
+38 1408 1
+38 1409 1
+38 1410 1
+38 1411 1
+38 1412 1
+38 1413 1
+38 1414 1
+38 1415 1
+38 1416 1
+38 1417 1
+38 1418 1
+38 1419 1
+38 1420 1
+38 1421 1
+38 1422 1
+38 1423 1
+38 1424 1
+38 1425 1
+38 1426 1
+38 1427 1
+38 1428 1
+38 1429 1
+38 1430 1
+38 1431 1
+38 1432 1
+38 1433 1
+38 1434 1
+38 1435 1
+38 1436 1
+38 1437 1
+38 1438 1
+38 1439 1
+38 1440 1
+38 1441 1
+38 1442 1
+38 1443 1
+38 1444 1
+38 1445 1
+38 1446 1
+38 1447 1
+38 1448 1
+38 1449 1
+38 1450 1
+38 1717 1
+38 1718 1
+38 1719 1
+38 1720 1
+38 1721 1
+38 1722 1
+38 1723 1
+38 1724 1
+38 1725 1
+38 1726 1
+38 1727 1
+38 1728 1
+38 1729 1
+38 1730 1
+38 1731 1
+38 1732 1
+38 1733 1
+38 1734 1
+38 1735 1
+38 1736 1
+38 1737 1
+38 1738 1
+38 1739 1
+38 1740 1
+38 1741 1
+38 1742 1
+38 1743 1
+38 1744 1
+38 1801 1
+38 1802 1
+38 1803 1
+38 1804 1
+38 1805 1
+38 1806 1
+38 1807 1
+38 1808 1
+38 1809 1
+38 1810 1
+38 1811 1
+38 1812 1
+38 1813 1
+38 1814 1
+38 1815 1
+38 1816 1
+38 1817 1
+38 1818 1
+38 1819 1
+38 1820 1
+38 1821 1
+38 1822 1
+38 1823 1
+38 1824 1
+38 1825 1
+38 1826 1
+38 1827 1
+38 1828 1
+38 1829 1
+38 1830 1
+38 1831 1
+38 1832 1
+38 1833 1
+38 1834 1
+38 1835 1
+38 1836 1
+38 1837 1
+38 1838 1
+38 1839 1
+38 1840 1
+38 1841 1
+38 1842 1
+38 1843 1
+38 1844 1
+38 1845 1
+38 1846 1
+38 1847 1
+38 1848 1
+38 1849 1
+38 1850 1
+38 1851 1
+38 1852 1
+38 1853 1
+38 1854 1
+38 1855 1
+38 1856 1
+38 2179 1
+38 2180 1
+38 2181 1
+38 2182 1
+38 2183 1
+38 2184 1
+38 2185 1
+38 2186 1
+38 2187 1
+38 2188 1
+38 2189 1
+38 2190 1
+38 2191 1
+38 2192 1
+38 2193 1
+38 2194 1
+38 2195 1
+38 2196 1
+38 2197 1
+38 2198 1
+38 2199 1
+38 2200 1
+38 2201 1
+38 2202 1
+38 2203 1
+38 2204 1
+38 2205 1
+38 2206 1
+38 2207 1
+38 2208 1
+38 2209 1
+38 2210 1
+38 2211 1
+38 2212 1
+38 2213 1
+38 2214 1
+38 2215 1
+38 2216 1
+38 2217 1
+38 2218 1
+38 2219 1
+38 2220 1
+38 2221 1
+38 2222 1
+38 2223 1
+38 2224 1
+38 2225 1
+38 2226 1
+38 2227 1
+38 2228 1
+38 2229 1
+38 2230 1
+38 2231 1
+38 2232 1
+38 2233 1
+38 2234 1
+38 2305 1
+38 2306 1
+38 2307 1
+38 2308 1
+38 2309 1
+38 2310 1
+38 2311 1
+38 2312 1
+38 2313 1
+38 2314 1
+38 2315 1
+38 2316 1
+38 2317 1
+38 2318 1
+38 2319 1
+38 2320 1
+38 2321 1
+38 2322 1
+38 2323 1
+38 2324 1
+38 2325 1
+38 2326 1
+38 2327 1
+38 2328 1
+38 2329 1
+38 2330 1
+38 2331 1
+38 2332 1
+38 2333 1
+38 2334 1
+38 2335 1
+38 2336 1
+38 2337 1
+38 2338 1
+38 2339 1
+38 2340 1
+38 2341 1
+38 2342 1
+38 2343 1
+38 2344 1
+38 2345 1
+38 2346 1
+38 2347 1
+38 2348 1
+38 2349 1
+38 2350 1
+38 2351 1
+38 2352 1
+38 2353 1
+38 2354 1
+38 2355 1
+38 2356 1
+38 2357 1
+38 2358 1
+38 2359 1
+38 2360 1
+38 2361 1
+38 2362 1
+38 2363 1
+38 2364 1
+38 2365 1
+38 2366 1
+38 2367 1
+38 2368 1
+38 2369 1
+38 2370 1
+38 2371 1
+38 2372 1
+38 2373 1
+38 2374 1
+38 2641 1
+38 2642 1
+38 2643 1
+38 2644 1
+38 2645 1
+38 2646 1
+38 2647 1
+38 2648 1
+38 2649 1
+38 2650 1
+38 2651 1
+38 2652 1
+38 2653 1
+38 2654 1
+38 2655 1
+38 2656 1
+38 2657 1
+38 2658 1
+38 2659 1
+38 2660 1
+38 2661 1
+38 2662 1
+38 2663 1
+38 2664 1
+38 2665 1
+38 2666 1
+38 2667 1
+38 2668 1
+38 2669 1
+38 2670 1
+38 2671 1
+38 2672 1
+38 2673 1
+38 2674 1
+38 2675 1
+38 2676 1
+38 2677 1
+38 2678 1
+38 2679 1
+38 2680 1
+38 2681 1
+38 2682 1
+38 2683 1
+38 2684 1
+38 2685 1
+38 2686 1
+38 2687 1
+38 2688 1
+38 2689 1
+38 2690 1
+38 2691 1
+38 2692 1
+38 2693 1
+38 2694 1
+38 2695 1
+38 2696 1
+38 2767 1
+38 2768 1
+38 2769 1
+38 2770 1
+38 2771 1
+38 2772 1
+38 2773 1
+38 2774 1
+38 2775 1
+38 2776 1
+38 2777 1
+38 2778 1
+38 2779 1
+38 2780 1
+38 2781 1
+38 2782 1
+38 2783 1
+38 2784 1
+38 2785 1
+38 2786 1
+38 2787 1
+38 2788 1
+38 2789 1
+38 2790 1
+38 2791 1
+38 2792 1
+38 2793 1
+38 2794 1
+38 2795 1
+38 2796 1
+38 2797 1
+38 2798 1
+38 2799 1
+38 2800 1
+38 2801 1
+38 2802 1
+38 2803 1
+38 2804 1
+38 2805 1
+38 2806 1
+38 2807 1
+38 2808 1
+38 2809 1
+38 2810 1
+38 2811 1
+38 2812 1
+38 2813 1
+38 2814 1
+38 2815 1
+38 2816 1
+38 2817 1
+38 2818 1
+38 2819 1
+38 2820 1
+38 2821 1
+38 2822 1
+38 2823 1
+38 2824 1
+38 2825 1
+38 2826 1
+38 2827 1
+38 2828 1
+38 2829 1
+38 2830 1
+38 2831 1
+38 2832 1
+38 2833 1
+38 2834 1
+38 2835 1
+38 2836 1
+38 3103 1
+38 3104 1
+38 3105 1
+38 3106 1
+38 3107 1
+38 3108 1
+38 3109 1
+38 3110 1
+38 3111 1
+38 3112 1
+38 3113 1
+38 3114 1
+38 3115 1
+38 3116 1
+38 3117 1
+38 3118 1
+38 3119 1
+38 3120 1
+38 3121 1
+38 3122 1
+38 3123 1
+38 3124 1
+38 3125 1
+38 3126 1
+38 3127 1
+38 3128 1
+38 3129 1
+38 3130 1
+38 3131 1
+38 3132 1
+38 3133 1
+38 3134 1
+38 3135 1
+38 3136 1
+38 3137 1
+38 3138 1
+38 3139 1
+38 3140 1
+38 3141 1
+38 3142 1
+38 3143 1
+38 3144 1
+38 3145 1
+38 3146 1
+38 3147 1
+38 3148 1
+38 3149 1
+38 3150 1
+38 3151 1
+38 3152 1
+38 3153 1
+38 3154 1
+38 3155 1
+38 3156 1
+38 3157 1
+38 3158 1
+38 3159 1
+38 3160 1
+38 3161 1
+38 3162 1
+38 3163 1
+38 3164 1
+38 3165 1
+38 3166 1
+38 3167 1
+38 3168 1
+38 3169 1
+38 3170 1
+38 3171 1
+38 3172 1
+38 3229 1
+38 3230 1
+38 3231 1
+38 3232 1
+38 3233 1
+38 3234 1
+38 3235 1
+38 3236 1
+38 3237 1
+38 3238 1
+38 3239 1
+38 3240 1
+38 3241 1
+38 3242 1
+38 3243 1
+38 3244 1
+38 3245 1
+38 3246 1
+38 3247 1
+38 3248 1
+38 3249 1
+38 3250 1
+38 3251 1
+38 3252 1
+38 3253 1
+38 3254 1
+38 3255 1
+38 3256 1
+38 3257 1
+38 3258 1
+38 3259 1
+38 3260 1
+38 3261 1
+38 3262 1
+38 3263 1
+38 3264 1
+38 3265 1
+38 3266 1
+38 3267 1
+38 3268 1
+38 3269 1
+38 3270 1
+38 3271 1
+38 3272 1
+38 3273 1
+38 3274 1
+38 3275 1
+38 3276 1
+38 3277 1
+38 3278 1
+38 3279 1
+38 3280 1
+38 3281 1
+38 3282 1
+38 3283 1
+38 3284 1
+39 1 1
+39 9 1
+39 10 1
+39 11 1
+39 12 1
+39 13 1
+39 14 1
+39 15 1
+39 37 1
+39 38 1
+39 39 1
+39 40 1
+39 41 1
+39 42 1
+39 43 1
+39 65 1
+39 66 1
+39 67 1
+39 68 1
+39 69 1
+39 70 1
+39 71 1
+39 72 1
+39 73 1
+39 74 1
+39 75 1
+39 76 1
+39 77 1
+39 78 1
+39 79 1
+39 80 1
+39 81 1
+39 82 1
+39 83 1
+39 84 1
+39 85 1
+39 331 1
+39 332 1
+39 333 1
+39 334 1
+39 335 1
+39 336 1
+39 337 1
+39 359 1
+39 360 1
+39 361 1
+39 362 1
+39 363 1
+39 364 1
+39 365 1
+39 366 1
+39 367 1
+39 368 1
+39 369 1
+39 370 1
+39 371 1
+39 372 1
+39 373 1
+39 374 1
+39 375 1
+39 376 1
+39 377 1
+39 378 1
+39 379 1
+39 415 1
+39 416 1
+39 417 1
+39 418 1
+39 419 1
+39 420 1
+39 421 1
+39 422 1
+39 423 1
+39 424 1
+39 425 1
+39 426 1
+39 427 1
+39 428 1
+39 429 1
+39 430 1
+39 431 1
+39 432 1
+39 433 1
+39 434 1
+39 435 1
+39 471 1
+39 472 1
+39 473 1
+39 474 1
+39 475 1
+39 476 1
+39 477 1
+39 478 1
+39 479 1
+39 480 1
+39 481 1
+39 482 1
+39 483 1
+39 484 1
+39 485 1
+39 486 1
+39 487 1
+39 488 1
+39 489 1
+39 490 1
+39 491 1
+39 492 1
+39 493 1
+39 494 1
+39 495 1
+39 496 1
+39 497 1
+39 498 1
+39 499 1
+39 500 1
+39 501 1
+39 502 1
+39 503 1
+39 504 1
+39 505 1
+39 793 1
+39 794 1
+39 795 1
+39 796 1
+39 797 1
+39 798 1
+39 799 1
+39 821 1
+39 822 1
+39 823 1
+39 824 1
+39 825 1
+39 826 1
+39 827 1
+39 828 1
+39 829 1
+39 830 1
+39 831 1
+39 832 1
+39 833 1
+39 834 1
+39 835 1
+39 836 1
+39 837 1
+39 838 1
+39 839 1
+39 840 1
+39 841 1
+39 877 1
+39 878 1
+39 879 1
+39 880 1
+39 881 1
+39 882 1
+39 883 1
+39 884 1
+39 885 1
+39 886 1
+39 887 1
+39 888 1
+39 889 1
+39 890 1
+39 891 1
+39 892 1
+39 893 1
+39 894 1
+39 895 1
+39 896 1
+39 897 1
+39 933 1
+39 934 1
+39 935 1
+39 936 1
+39 937 1
+39 938 1
+39 939 1
+39 940 1
+39 941 1
+39 942 1
+39 943 1
+39 944 1
+39 945 1
+39 946 1
+39 947 1
+39 948 1
+39 949 1
+39 950 1
+39 951 1
+39 952 1
+39 953 1
+39 954 1
+39 955 1
+39 956 1
+39 957 1
+39 958 1
+39 959 1
+39 960 1
+39 961 1
+39 962 1
+39 963 1
+39 964 1
+39 965 1
+39 966 1
+39 967 1
+39 1255 1
+39 1256 1
+39 1257 1
+39 1258 1
+39 1259 1
+39 1260 1
+39 1261 1
+39 1262 1
+39 1263 1
+39 1264 1
+39 1265 1
+39 1266 1
+39 1267 1
+39 1268 1
+39 1269 1
+39 1270 1
+39 1271 1
+39 1272 1
+39 1273 1
+39 1274 1
+39 1275 1
+39 1311 1
+39 1312 1
+39 1313 1
+39 1314 1
+39 1315 1
+39 1316 1
+39 1317 1
+39 1318 1
+39 1319 1
+39 1320 1
+39 1321 1
+39 1322 1
+39 1323 1
+39 1324 1
+39 1325 1
+39 1326 1
+39 1327 1
+39 1328 1
+39 1329 1
+39 1330 1
+39 1331 1
+39 1332 1
+39 1333 1
+39 1334 1
+39 1335 1
+39 1336 1
+39 1337 1
+39 1338 1
+39 1339 1
+39 1340 1
+39 1341 1
+39 1342 1
+39 1343 1
+39 1344 1
+39 1345 1
+39 1381 1
+39 1382 1
+39 1383 1
+39 1384 1
+39 1385 1
+39 1386 1
+39 1387 1
+39 1388 1
+39 1389 1
+39 1390 1
+39 1391 1
+39 1392 1
+39 1393 1
+39 1394 1
+39 1395 1
+39 1396 1
+39 1397 1
+39 1398 1
+39 1399 1
+39 1400 1
+39 1401 1
+39 1402 1
+39 1403 1
+39 1404 1
+39 1405 1
+39 1406 1
+39 1407 1
+39 1408 1
+39 1409 1
+39 1410 1
+39 1411 1
+39 1412 1
+39 1413 1
+39 1414 1
+39 1415 1
+39 1451 1
+39 1452 1
+39 1453 1
+39 1454 1
+39 1455 1
+39 1456 1
+39 1457 1
+39 1458 1
+39 1459 1
+39 1460 1
+39 1461 1
+39 1462 1
+39 1463 1
+39 1464 1
+39 1465 1
+39 1466 1
+39 1467 1
+39 1468 1
+39 1469 1
+39 1470 1
+39 1471 1
+39 1472 1
+39 1473 1
+39 1474 1
+39 1475 1
+39 1476 1
+39 1477 1
+39 1478 1
+39 1479 1
+39 1480 1
+39 1481 1
+39 1482 1
+39 1483 1
+39 1484 1
+39 1485 1
+39 1717 1
+39 1718 1
+39 1719 1
+39 1720 1
+39 1721 1
+39 1722 1
+39 1723 1
+39 1745 1
+39 1746 1
+39 1747 1
+39 1748 1
+39 1749 1
+39 1750 1
+39 1751 1
+39 1752 1
+39 1753 1
+39 1754 1
+39 1755 1
+39 1756 1
+39 1757 1
+39 1758 1
+39 1759 1
+39 1760 1
+39 1761 1
+39 1762 1
+39 1763 1
+39 1764 1
+39 1765 1
+39 1801 1
+39 1802 1
+39 1803 1
+39 1804 1
+39 1805 1
+39 1806 1
+39 1807 1
+39 1808 1
+39 1809 1
+39 1810 1
+39 1811 1
+39 1812 1
+39 1813 1
+39 1814 1
+39 1815 1
+39 1816 1
+39 1817 1
+39 1818 1
+39 1819 1
+39 1820 1
+39 1821 1
+39 1857 1
+39 1858 1
+39 1859 1
+39 1860 1
+39 1861 1
+39 1862 1
+39 1863 1
+39 1864 1
+39 1865 1
+39 1866 1
+39 1867 1
+39 1868 1
+39 1869 1
+39 1870 1
+39 1871 1
+39 1872 1
+39 1873 1
+39 1874 1
+39 1875 1
+39 1876 1
+39 1877 1
+39 1878 1
+39 1879 1
+39 1880 1
+39 1881 1
+39 1882 1
+39 1883 1
+39 1884 1
+39 1885 1
+39 1886 1
+39 1887 1
+39 1888 1
+39 1889 1
+39 1890 1
+39 1891 1
+39 2179 1
+39 2180 1
+39 2181 1
+39 2182 1
+39 2183 1
+39 2184 1
+39 2185 1
+39 2186 1
+39 2187 1
+39 2188 1
+39 2189 1
+39 2190 1
+39 2191 1
+39 2192 1
+39 2193 1
+39 2194 1
+39 2195 1
+39 2196 1
+39 2197 1
+39 2198 1
+39 2199 1
+39 2235 1
+39 2236 1
+39 2237 1
+39 2238 1
+39 2239 1
+39 2240 1
+39 2241 1
+39 2242 1
+39 2243 1
+39 2244 1
+39 2245 1
+39 2246 1
+39 2247 1
+39 2248 1
+39 2249 1
+39 2250 1
+39 2251 1
+39 2252 1
+39 2253 1
+39 2254 1
+39 2255 1
+39 2256 1
+39 2257 1
+39 2258 1
+39 2259 1
+39 2260 1
+39 2261 1
+39 2262 1
+39 2263 1
+39 2264 1
+39 2265 1
+39 2266 1
+39 2267 1
+39 2268 1
+39 2269 1
+39 2305 1
+39 2306 1
+39 2307 1
+39 2308 1
+39 2309 1
+39 2310 1
+39 2311 1
+39 2312 1
+39 2313 1
+39 2314 1
+39 2315 1
+39 2316 1
+39 2317 1
+39 2318 1
+39 2319 1
+39 2320 1
+39 2321 1
+39 2322 1
+39 2323 1
+39 2324 1
+39 2325 1
+39 2326 1
+39 2327 1
+39 2328 1
+39 2329 1
+39 2330 1
+39 2331 1
+39 2332 1
+39 2333 1
+39 2334 1
+39 2335 1
+39 2336 1
+39 2337 1
+39 2338 1
+39 2339 1
+39 2375 1
+39 2376 1
+39 2377 1
+39 2378 1
+39 2379 1
+39 2380 1
+39 2381 1
+39 2382 1
+39 2383 1
+39 2384 1
+39 2385 1
+39 2386 1
+39 2387 1
+39 2388 1
+39 2389 1
+39 2390 1
+39 2391 1
+39 2392 1
+39 2393 1
+39 2394 1
+39 2395 1
+39 2396 1
+39 2397 1
+39 2398 1
+39 2399 1
+39 2400 1
+39 2401 1
+39 2402 1
+39 2403 1
+39 2404 1
+39 2405 1
+39 2406 1
+39 2407 1
+39 2408 1
+39 2409 1
+39 2641 1
+39 2642 1
+39 2643 1
+39 2644 1
+39 2645 1
+39 2646 1
+39 2647 1
+39 2648 1
+39 2649 1
+39 2650 1
+39 2651 1
+39 2652 1
+39 2653 1
+39 2654 1
+39 2655 1
+39 2656 1
+39 2657 1
+39 2658 1
+39 2659 1
+39 2660 1
+39 2661 1
+39 2697 1
+39 2698 1
+39 2699 1
+39 2700 1
+39 2701 1
+39 2702 1
+39 2703 1
+39 2704 1
+39 2705 1
+39 2706 1
+39 2707 1
+39 2708 1
+39 2709 1
+39 2710 1
+39 2711 1
+39 2712 1
+39 2713 1
+39 2714 1
+39 2715 1
+39 2716 1
+39 2717 1
+39 2718 1
+39 2719 1
+39 2720 1
+39 2721 1
+39 2722 1
+39 2723 1
+39 2724 1
+39 2725 1
+39 2726 1
+39 2727 1
+39 2728 1
+39 2729 1
+39 2730 1
+39 2731 1
+39 2767 1
+39 2768 1
+39 2769 1
+39 2770 1
+39 2771 1
+39 2772 1
+39 2773 1
+39 2774 1
+39 2775 1
+39 2776 1
+39 2777 1
+39 2778 1
+39 2779 1
+39 2780 1
+39 2781 1
+39 2782 1
+39 2783 1
+39 2784 1
+39 2785 1
+39 2786 1
+39 2787 1
+39 2788 1
+39 2789 1
+39 2790 1
+39 2791 1
+39 2792 1
+39 2793 1
+39 2794 1
+39 2795 1
+39 2796 1
+39 2797 1
+39 2798 1
+39 2799 1
+39 2800 1
+39 2801 1
+39 2837 1
+39 2838 1
+39 2839 1
+39 2840 1
+39 2841 1
+39 2842 1
+39 2843 1
+39 2844 1
+39 2845 1
+39 2846 1
+39 2847 1
+39 2848 1
+39 2849 1
+39 2850 1
+39 2851 1
+39 2852 1
+39 2853 1
+39 2854 1
+39 2855 1
+39 2856 1
+39 2857 1
+39 2858 1
+39 2859 1
+39 2860 1
+39 2861 1
+39 2862 1
+39 2863 1
+39 2864 1
+39 2865 1
+39 2866 1
+39 2867 1
+39 2868 1
+39 2869 1
+39 2870 1
+39 2871 1
+39 3103 1
+39 3104 1
+39 3105 1
+39 3106 1
+39 3107 1
+39 3108 1
+39 3109 1
+39 3110 1
+39 3111 1
+39 3112 1
+39 3113 1
+39 3114 1
+39 3115 1
+39 3116 1
+39 3117 1
+39 3118 1
+39 3119 1
+39 3120 1
+39 3121 1
+39 3122 1
+39 3123 1
+39 3124 1
+39 3125 1
+39 3126 1
+39 3127 1
+39 3128 1
+39 3129 1
+39 3130 1
+39 3131 1
+39 3132 1
+39 3133 1
+39 3134 1
+39 3135 1
+39 3136 1
+39 3137 1
+39 3173 1
+39 3174 1
+39 3175 1
+39 3176 1
+39 3177 1
+39 3178 1
+39 3179 1
+39 3180 1
+39 3181 1
+39 3182 1
+39 3183 1
+39 3184 1
+39 3185 1
+39 3186 1
+39 3187 1
+39 3188 1
+39 3189 1
+39 3190 1
+39 3191 1
+39 3192 1
+39 3193 1
+39 3194 1
+39 3195 1
+39 3196 1
+39 3197 1
+39 3198 1
+39 3199 1
+39 3200 1
+39 3201 1
+39 3202 1
+39 3203 1
+39 3204 1
+39 3205 1
+39 3206 1
+39 3207 1
+39 3229 1
+39 3230 1
+39 3231 1
+39 3232 1
+39 3233 1
+39 3234 1
+39 3235 1
+39 3236 1
+39 3237 1
+39 3238 1
+39 3239 1
+39 3240 1
+39 3241 1
+39 3242 1
+39 3243 1
+39 3244 1
+39 3245 1
+39 3246 1
+39 3247 1
+39 3248 1
+39 3249 1
+39 3250 1
+39 3251 1
+39 3252 1
+39 3253 1
+39 3254 1
+39 3255 1
+39 3256 1
+39 3257 1
+39 3258 1
+39 3259 1
+39 3260 1
+39 3261 1
+39 3262 1
+39 3263 1
+39 3285 1
+39 3286 1
+39 3287 1
+39 3288 1
+39 3289 1
+39 3290 1
+39 3291 1
+39 3292 1
+39 3293 1
+39 3294 1
+39 3295 1
+39 3296 1
+39 3297 1
+39 3298 1
+39 3299 1
+39 3300 1
+39 3301 1
+39 3302 1
+39 3303 1
+39 3304 1
+39 3305 1
+40 2 1
+40 9 1
+40 16 1
+40 17 1
+40 18 1
+40 19 1
+40 20 1
+40 21 1
+40 37 1
+40 44 1
+40 45 1
+40 46 1
+40 47 1
+40 48 1
+40 49 1
+40 65 1
+40 66 1
+40 67 1
+40 68 1
+40 69 1
+40 70 1
+40 86 1
+40 87 1
+40 88 1
+40 89 1
+40 90 1
+40 91 1
+40 92 1
+40 93 1
+40 94 1
+40 95 1
+40 96 1
+40 97 1
+40 98 1
+40 99 1
+40 100 1
+40 331 1
+40 338 1
+40 339 1
+40 340 1
+40 341 1
+40 342 1
+40 343 1
+40 359 1
+40 360 1
+40 361 1
+40 362 1
+40 363 1
+40 364 1
+40 380 1
+40 381 1
+40 382 1
+40 383 1
+40 384 1
+40 385 1
+40 386 1
+40 387 1
+40 388 1
+40 389 1
+40 390 1
+40 391 1
+40 392 1
+40 393 1
+40 394 1
+40 415 1
+40 416 1
+40 417 1
+40 418 1
+40 419 1
+40 420 1
+40 436 1
+40 437 1
+40 438 1
+40 439 1
+40 440 1
+40 441 1
+40 442 1
+40 443 1
+40 444 1
+40 445 1
+40 446 1
+40 447 1
+40 448 1
+40 449 1
+40 450 1
+40 471 1
+40 472 1
+40 473 1
+40 474 1
+40 475 1
+40 476 1
+40 477 1
+40 478 1
+40 479 1
+40 480 1
+40 481 1
+40 482 1
+40 483 1
+40 484 1
+40 485 1
+40 506 1
+40 507 1
+40 508 1
+40 509 1
+40 510 1
+40 511 1
+40 512 1
+40 513 1
+40 514 1
+40 515 1
+40 516 1
+40 517 1
+40 518 1
+40 519 1
+40 520 1
+40 521 1
+40 522 1
+40 523 1
+40 524 1
+40 525 1
+40 793 1
+40 800 1
+40 801 1
+40 802 1
+40 803 1
+40 804 1
+40 805 1
+40 821 1
+40 822 1
+40 823 1
+40 824 1
+40 825 1
+40 826 1
+40 842 1
+40 843 1
+40 844 1
+40 845 1
+40 846 1
+40 847 1
+40 848 1
+40 849 1
+40 850 1
+40 851 1
+40 852 1
+40 853 1
+40 854 1
+40 855 1
+40 856 1
+40 877 1
+40 878 1
+40 879 1
+40 880 1
+40 881 1
+40 882 1
+40 898 1
+40 899 1
+40 900 1
+40 901 1
+40 902 1
+40 903 1
+40 904 1
+40 905 1
+40 906 1
+40 907 1
+40 908 1
+40 909 1
+40 910 1
+40 911 1
+40 912 1
+40 933 1
+40 934 1
+40 935 1
+40 936 1
+40 937 1
+40 938 1
+40 939 1
+40 940 1
+40 941 1
+40 942 1
+40 943 1
+40 944 1
+40 945 1
+40 946 1
+40 947 1
+40 968 1
+40 969 1
+40 970 1
+40 971 1
+40 972 1
+40 973 1
+40 974 1
+40 975 1
+40 976 1
+40 977 1
+40 978 1
+40 979 1
+40 980 1
+40 981 1
+40 982 1
+40 983 1
+40 984 1
+40 985 1
+40 986 1
+40 987 1
+40 1255 1
+40 1256 1
+40 1257 1
+40 1258 1
+40 1259 1
+40 1260 1
+40 1276 1
+40 1277 1
+40 1278 1
+40 1279 1
+40 1280 1
+40 1281 1
+40 1282 1
+40 1283 1
+40 1284 1
+40 1285 1
+40 1286 1
+40 1287 1
+40 1288 1
+40 1289 1
+40 1290 1
+40 1311 1
+40 1312 1
+40 1313 1
+40 1314 1
+40 1315 1
+40 1316 1
+40 1317 1
+40 1318 1
+40 1319 1
+40 1320 1
+40 1321 1
+40 1322 1
+40 1323 1
+40 1324 1
+40 1325 1
+40 1346 1
+40 1347 1
+40 1348 1
+40 1349 1
+40 1350 1
+40 1351 1
+40 1352 1
+40 1353 1
+40 1354 1
+40 1355 1
+40 1356 1
+40 1357 1
+40 1358 1
+40 1359 1
+40 1360 1
+40 1361 1
+40 1362 1
+40 1363 1
+40 1364 1
+40 1365 1
+40 1381 1
+40 1382 1
+40 1383 1
+40 1384 1
+40 1385 1
+40 1386 1
+40 1387 1
+40 1388 1
+40 1389 1
+40 1390 1
+40 1391 1
+40 1392 1
+40 1393 1
+40 1394 1
+40 1395 1
+40 1416 1
+40 1417 1
+40 1418 1
+40 1419 1
+40 1420 1
+40 1421 1
+40 1422 1
+40 1423 1
+40 1424 1
+40 1425 1
+40 1426 1
+40 1427 1
+40 1428 1
+40 1429 1
+40 1430 1
+40 1431 1
+40 1432 1
+40 1433 1
+40 1434 1
+40 1435 1
+40 1451 1
+40 1452 1
+40 1453 1
+40 1454 1
+40 1455 1
+40 1456 1
+40 1457 1
+40 1458 1
+40 1459 1
+40 1460 1
+40 1461 1
+40 1462 1
+40 1463 1
+40 1464 1
+40 1465 1
+40 1466 1
+40 1467 1
+40 1468 1
+40 1469 1
+40 1470 1
+40 1486 1
+40 1487 1
+40 1488 1
+40 1489 1
+40 1490 1
+40 1491 1
+40 1492 1
+40 1493 1
+40 1494 1
+40 1495 1
+40 1496 1
+40 1497 1
+40 1498 1
+40 1499 1
+40 1500 1
+40 1717 1
+40 1724 1
+40 1725 1
+40 1726 1
+40 1727 1
+40 1728 1
+40 1729 1
+40 1745 1
+40 1746 1
+40 1747 1
+40 1748 1
+40 1749 1
+40 1750 1
+40 1766 1
+40 1767 1
+40 1768 1
+40 1769 1
+40 1770 1
+40 1771 1
+40 1772 1
+40 1773 1
+40 1774 1
+40 1775 1
+40 1776 1
+40 1777 1
+40 1778 1
+40 1779 1
+40 1780 1
+40 1801 1
+40 1802 1
+40 1803 1
+40 1804 1
+40 1805 1
+40 1806 1
+40 1822 1
+40 1823 1
+40 1824 1
+40 1825 1
+40 1826 1
+40 1827 1
+40 1828 1
+40 1829 1
+40 1830 1
+40 1831 1
+40 1832 1
+40 1833 1
+40 1834 1
+40 1835 1
+40 1836 1
+40 1857 1
+40 1858 1
+40 1859 1
+40 1860 1
+40 1861 1
+40 1862 1
+40 1863 1
+40 1864 1
+40 1865 1
+40 1866 1
+40 1867 1
+40 1868 1
+40 1869 1
+40 1870 1
+40 1871 1
+40 1892 1
+40 1893 1
+40 1894 1
+40 1895 1
+40 1896 1
+40 1897 1
+40 1898 1
+40 1899 1
+40 1900 1
+40 1901 1
+40 1902 1
+40 1903 1
+40 1904 1
+40 1905 1
+40 1906 1
+40 1907 1
+40 1908 1
+40 1909 1
+40 1910 1
+40 1911 1
+40 2179 1
+40 2180 1
+40 2181 1
+40 2182 1
+40 2183 1
+40 2184 1
+40 2200 1
+40 2201 1
+40 2202 1
+40 2203 1
+40 2204 1
+40 2205 1
+40 2206 1
+40 2207 1
+40 2208 1
+40 2209 1
+40 2210 1
+40 2211 1
+40 2212 1
+40 2213 1
+40 2214 1
+40 2235 1
+40 2236 1
+40 2237 1
+40 2238 1
+40 2239 1
+40 2240 1
+40 2241 1
+40 2242 1
+40 2243 1
+40 2244 1
+40 2245 1
+40 2246 1
+40 2247 1
+40 2248 1
+40 2249 1
+40 2270 1
+40 2271 1
+40 2272 1
+40 2273 1
+40 2274 1
+40 2275 1
+40 2276 1
+40 2277 1
+40 2278 1
+40 2279 1
+40 2280 1
+40 2281 1
+40 2282 1
+40 2283 1
+40 2284 1
+40 2285 1
+40 2286 1
+40 2287 1
+40 2288 1
+40 2289 1
+40 2305 1
+40 2306 1
+40 2307 1
+40 2308 1
+40 2309 1
+40 2310 1
+40 2311 1
+40 2312 1
+40 2313 1
+40 2314 1
+40 2315 1
+40 2316 1
+40 2317 1
+40 2318 1
+40 2319 1
+40 2340 1
+40 2341 1
+40 2342 1
+40 2343 1
+40 2344 1
+40 2345 1
+40 2346 1
+40 2347 1
+40 2348 1
+40 2349 1
+40 2350 1
+40 2351 1
+40 2352 1
+40 2353 1
+40 2354 1
+40 2355 1
+40 2356 1
+40 2357 1
+40 2358 1
+40 2359 1
+40 2375 1
+40 2376 1
+40 2377 1
+40 2378 1
+40 2379 1
+40 2380 1
+40 2381 1
+40 2382 1
+40 2383 1
+40 2384 1
+40 2385 1
+40 2386 1
+40 2387 1
+40 2388 1
+40 2389 1
+40 2390 1
+40 2391 1
+40 2392 1
+40 2393 1
+40 2394 1
+40 2410 1
+40 2411 1
+40 2412 1
+40 2413 1
+40 2414 1
+40 2415 1
+40 2416 1
+40 2417 1
+40 2418 1
+40 2419 1
+40 2420 1
+40 2421 1
+40 2422 1
+40 2423 1
+40 2424 1
+40 2641 1
+40 2642 1
+40 2643 1
+40 2644 1
+40 2645 1
+40 2646 1
+40 2662 1
+40 2663 1
+40 2664 1
+40 2665 1
+40 2666 1
+40 2667 1
+40 2668 1
+40 2669 1
+40 2670 1
+40 2671 1
+40 2672 1
+40 2673 1
+40 2674 1
+40 2675 1
+40 2676 1
+40 2697 1
+40 2698 1
+40 2699 1
+40 2700 1
+40 2701 1
+40 2702 1
+40 2703 1
+40 2704 1
+40 2705 1
+40 2706 1
+40 2707 1
+40 2708 1
+40 2709 1
+40 2710 1
+40 2711 1
+40 2732 1
+40 2733 1
+40 2734 1
+40 2735 1
+40 2736 1
+40 2737 1
+40 2738 1
+40 2739 1
+40 2740 1
+40 2741 1
+40 2742 1
+40 2743 1
+40 2744 1
+40 2745 1
+40 2746 1
+40 2747 1
+40 2748 1
+40 2749 1
+40 2750 1
+40 2751 1
+40 2767 1
+40 2768 1
+40 2769 1
+40 2770 1
+40 2771 1
+40 2772 1
+40 2773 1
+40 2774 1
+40 2775 1
+40 2776 1
+40 2777 1
+40 2778 1
+40 2779 1
+40 2780 1
+40 2781 1
+40 2802 1
+40 2803 1
+40 2804 1
+40 2805 1
+40 2806 1
+40 2807 1
+40 2808 1
+40 2809 1
+40 2810 1
+40 2811 1
+40 2812 1
+40 2813 1
+40 2814 1
+40 2815 1
+40 2816 1
+40 2817 1
+40 2818 1
+40 2819 1
+40 2820 1
+40 2821 1
+40 2837 1
+40 2838 1
+40 2839 1
+40 2840 1
+40 2841 1
+40 2842 1
+40 2843 1
+40 2844 1
+40 2845 1
+40 2846 1
+40 2847 1
+40 2848 1
+40 2849 1
+40 2850 1
+40 2851 1
+40 2852 1
+40 2853 1
+40 2854 1
+40 2855 1
+40 2856 1
+40 2872 1
+40 2873 1
+40 2874 1
+40 2875 1
+40 2876 1
+40 2877 1
+40 2878 1
+40 2879 1
+40 2880 1
+40 2881 1
+40 2882 1
+40 2883 1
+40 2884 1
+40 2885 1
+40 2886 1
+40 3103 1
+40 3104 1
+40 3105 1
+40 3106 1
+40 3107 1
+40 3108 1
+40 3109 1
+40 3110 1
+40 3111 1
+40 3112 1
+40 3113 1
+40 3114 1
+40 3115 1
+40 3116 1
+40 3117 1
+40 3138 1
+40 3139 1
+40 3140 1
+40 3141 1
+40 3142 1
+40 3143 1
+40 3144 1
+40 3145 1
+40 3146 1
+40 3147 1
+40 3148 1
+40 3149 1
+40 3150 1
+40 3151 1
+40 3152 1
+40 3153 1
+40 3154 1
+40 3155 1
+40 3156 1
+40 3157 1
+40 3173 1
+40 3174 1
+40 3175 1
+40 3176 1
+40 3177 1
+40 3178 1
+40 3179 1
+40 3180 1
+40 3181 1
+40 3182 1
+40 3183 1
+40 3184 1
+40 3185 1
+40 3186 1
+40 3187 1
+40 3188 1
+40 3189 1
+40 3190 1
+40 3191 1
+40 3192 1
+40 3208 1
+40 3209 1
+40 3210 1
+40 3211 1
+40 3212 1
+40 3213 1
+40 3214 1
+40 3215 1
+40 3216 1
+40 3217 1
+40 3218 1
+40 3219 1
+40 3220 1
+40 3221 1
+40 3222 1
+40 3229 1
+40 3230 1
+40 3231 1
+40 3232 1
+40 3233 1
+40 3234 1
+40 3235 1
+40 3236 1
+40 3237 1
+40 3238 1
+40 3239 1
+40 3240 1
+40 3241 1
+40 3242 1
+40 3243 1
+40 3244 1
+40 3245 1
+40 3246 1
+40 3247 1
+40 3248 1
+40 3264 1
+40 3265 1
+40 3266 1
+40 3267 1
+40 3268 1
+40 3269 1
+40 3270 1
+40 3271 1
+40 3272 1
+40 3273 1
+40 3274 1
+40 3275 1
+40 3276 1
+40 3277 1
+40 3278 1
+40 3285 1
+40 3286 1
+40 3287 1
+40 3288 1
+40 3289 1
+40 3290 1
+40 3291 1
+40 3292 1
+40 3293 1
+40 3294 1
+40 3295 1
+40 3296 1
+40 3297 1
+40 3298 1
+40 3299 1
+40 3306 1
+40 3307 1
+40 3308 1
+40 3309 1
+40 3310 1
+40 3311 1
+41 3 1
+41 10 1
+41 16 1
+41 22 1
+41 23 1
+41 24 1
+41 25 1
+41 26 1
+41 38 1
+41 44 1
+41 50 1
+41 51 1
+41 52 1
+41 53 1
+41 54 1
+41 65 1
+41 71 1
+41 72 1
+41 73 1
+41 74 1
+41 75 1
+41 86 1
+41 87 1
+41 88 1
+41 89 1
+41 90 1
+41 101 1
+41 102 1
+41 103 1
+41 104 1
+41 105 1
+41 106 1
+41 107 1
+41 108 1
+41 109 1
+41 110 1
+41 332 1
+41 338 1
+41 344 1
+41 345 1
+41 346 1
+41 347 1
+41 348 1
+41 359 1
+41 365 1
+41 366 1
+41 367 1
+41 368 1
+41 369 1
+41 380 1
+41 381 1
+41 382 1
+41 383 1
+41 384 1
+41 395 1
+41 396 1
+41 397 1
+41 398 1
+41 399 1
+41 400 1
+41 401 1
+41 402 1
+41 403 1
+41 404 1
+41 415 1
+41 421 1
+41 422 1
+41 423 1
+41 424 1
+41 425 1
+41 436 1
+41 437 1
+41 438 1
+41 439 1
+41 440 1
+41 451 1
+41 452 1
+41 453 1
+41 454 1
+41 455 1
+41 456 1
+41 457 1
+41 458 1
+41 459 1
+41 460 1
+41 471 1
+41 472 1
+41 473 1
+41 474 1
+41 475 1
+41 486 1
+41 487 1
+41 488 1
+41 489 1
+41 490 1
+41 491 1
+41 492 1
+41 493 1
+41 494 1
+41 495 1
+41 506 1
+41 507 1
+41 508 1
+41 509 1
+41 510 1
+41 511 1
+41 512 1
+41 513 1
+41 514 1
+41 515 1
+41 526 1
+41 527 1
+41 528 1
+41 529 1
+41 530 1
+41 531 1
+41 532 1
+41 533 1
+41 534 1
+41 535 1
+41 794 1
+41 800 1
+41 806 1
+41 807 1
+41 808 1
+41 809 1
+41 810 1
+41 821 1
+41 827 1
+41 828 1
+41 829 1
+41 830 1
+41 831 1
+41 842 1
+41 843 1
+41 844 1
+41 845 1
+41 846 1
+41 857 1
+41 858 1
+41 859 1
+41 860 1
+41 861 1
+41 862 1
+41 863 1
+41 864 1
+41 865 1
+41 866 1
+41 877 1
+41 883 1
+41 884 1
+41 885 1
+41 886 1
+41 887 1
+41 898 1
+41 899 1
+41 900 1
+41 901 1
+41 902 1
+41 913 1
+41 914 1
+41 915 1
+41 916 1
+41 917 1
+41 918 1
+41 919 1
+41 920 1
+41 921 1
+41 922 1
+41 933 1
+41 934 1
+41 935 1
+41 936 1
+41 937 1
+41 948 1
+41 949 1
+41 950 1
+41 951 1
+41 952 1
+41 953 1
+41 954 1
+41 955 1
+41 956 1
+41 957 1
+41 968 1
+41 969 1
+41 970 1
+41 971 1
+41 972 1
+41 973 1
+41 974 1
+41 975 1
+41 976 1
+41 977 1
+41 988 1
+41 989 1
+41 990 1
+41 991 1
+41 992 1
+41 993 1
+41 994 1
+41 995 1
+41 996 1
+41 997 1
+41 1255 1
+41 1261 1
+41 1262 1
+41 1263 1
+41 1264 1
+41 1265 1
+41 1276 1
+41 1277 1
+41 1278 1
+41 1279 1
+41 1280 1
+41 1291 1
+41 1292 1
+41 1293 1
+41 1294 1
+41 1295 1
+41 1296 1
+41 1297 1
+41 1298 1
+41 1299 1
+41 1300 1
+41 1311 1
+41 1312 1
+41 1313 1
+41 1314 1
+41 1315 1
+41 1326 1
+41 1327 1
+41 1328 1
+41 1329 1
+41 1330 1
+41 1331 1
+41 1332 1
+41 1333 1
+41 1334 1
+41 1335 1
+41 1346 1
+41 1347 1
+41 1348 1
+41 1349 1
+41 1350 1
+41 1351 1
+41 1352 1
+41 1353 1
+41 1354 1
+41 1355 1
+41 1366 1
+41 1367 1
+41 1368 1
+41 1369 1
+41 1370 1
+41 1371 1
+41 1372 1
+41 1373 1
+41 1374 1
+41 1375 1
+41 1381 1
+41 1382 1
+41 1383 1
+41 1384 1
+41 1385 1
+41 1396 1
+41 1397 1
+41 1398 1
+41 1399 1
+41 1400 1
+41 1401 1
+41 1402 1
+41 1403 1
+41 1404 1
+41 1405 1
+41 1416 1
+41 1417 1
+41 1418 1
+41 1419 1
+41 1420 1
+41 1421 1
+41 1422 1
+41 1423 1
+41 1424 1
+41 1425 1
+41 1436 1
+41 1437 1
+41 1438 1
+41 1439 1
+41 1440 1
+41 1441 1
+41 1442 1
+41 1443 1
+41 1444 1
+41 1445 1
+41 1451 1
+41 1452 1
+41 1453 1
+41 1454 1
+41 1455 1
+41 1456 1
+41 1457 1
+41 1458 1
+41 1459 1
+41 1460 1
+41 1471 1
+41 1472 1
+41 1473 1
+41 1474 1
+41 1475 1
+41 1476 1
+41 1477 1
+41 1478 1
+41 1479 1
+41 1480 1
+41 1486 1
+41 1487 1
+41 1488 1
+41 1489 1
+41 1490 1
+41 1491 1
+41 1492 1
+41 1493 1
+41 1494 1
+41 1495 1
+41 1501 1
+41 1502 1
+41 1503 1
+41 1504 1
+41 1505 1
+41 1718 1
+41 1724 1
+41 1730 1
+41 1731 1
+41 1732 1
+41 1733 1
+41 1734 1
+41 1745 1
+41 1751 1
+41 1752 1
+41 1753 1
+41 1754 1
+41 1755 1
+41 1766 1
+41 1767 1
+41 1768 1
+41 1769 1
+41 1770 1
+41 1781 1
+41 1782 1
+41 1783 1
+41 1784 1
+41 1785 1
+41 1786 1
+41 1787 1
+41 1788 1
+41 1789 1
+41 1790 1
+41 1801 1
+41 1807 1
+41 1808 1
+41 1809 1
+41 1810 1
+41 1811 1
+41 1822 1
+41 1823 1
+41 1824 1
+41 1825 1
+41 1826 1
+41 1837 1
+41 1838 1
+41 1839 1
+41 1840 1
+41 1841 1
+41 1842 1
+41 1843 1
+41 1844 1
+41 1845 1
+41 1846 1
+41 1857 1
+41 1858 1
+41 1859 1
+41 1860 1
+41 1861 1
+41 1872 1
+41 1873 1
+41 1874 1
+41 1875 1
+41 1876 1
+41 1877 1
+41 1878 1
+41 1879 1
+41 1880 1
+41 1881 1
+41 1892 1
+41 1893 1
+41 1894 1
+41 1895 1
+41 1896 1
+41 1897 1
+41 1898 1
+41 1899 1
+41 1900 1
+41 1901 1
+41 1912 1
+41 1913 1
+41 1914 1
+41 1915 1
+41 1916 1
+41 1917 1
+41 1918 1
+41 1919 1
+41 1920 1
+41 1921 1
+41 2179 1
+41 2185 1
+41 2186 1
+41 2187 1
+41 2188 1
+41 2189 1
+41 2200 1
+41 2201 1
+41 2202 1
+41 2203 1
+41 2204 1
+41 2215 1
+41 2216 1
+41 2217 1
+41 2218 1
+41 2219 1
+41 2220 1
+41 2221 1
+41 2222 1
+41 2223 1
+41 2224 1
+41 2235 1
+41 2236 1
+41 2237 1
+41 2238 1
+41 2239 1
+41 2250 1
+41 2251 1
+41 2252 1
+41 2253 1
+41 2254 1
+41 2255 1
+41 2256 1
+41 2257 1
+41 2258 1
+41 2259 1
+41 2270 1
+41 2271 1
+41 2272 1
+41 2273 1
+41 2274 1
+41 2275 1
+41 2276 1
+41 2277 1
+41 2278 1
+41 2279 1
+41 2290 1
+41 2291 1
+41 2292 1
+41 2293 1
+41 2294 1
+41 2295 1
+41 2296 1
+41 2297 1
+41 2298 1
+41 2299 1
+41 2305 1
+41 2306 1
+41 2307 1
+41 2308 1
+41 2309 1
+41 2320 1
+41 2321 1
+41 2322 1
+41 2323 1
+41 2324 1
+41 2325 1
+41 2326 1
+41 2327 1
+41 2328 1
+41 2329 1
+41 2340 1
+41 2341 1
+41 2342 1
+41 2343 1
+41 2344 1
+41 2345 1
+41 2346 1
+41 2347 1
+41 2348 1
+41 2349 1
+41 2360 1
+41 2361 1
+41 2362 1
+41 2363 1
+41 2364 1
+41 2365 1
+41 2366 1
+41 2367 1
+41 2368 1
+41 2369 1
+41 2375 1
+41 2376 1
+41 2377 1
+41 2378 1
+41 2379 1
+41 2380 1
+41 2381 1
+41 2382 1
+41 2383 1
+41 2384 1
+41 2395 1
+41 2396 1
+41 2397 1
+41 2398 1
+41 2399 1
+41 2400 1
+41 2401 1
+41 2402 1
+41 2403 1
+41 2404 1
+41 2410 1
+41 2411 1
+41 2412 1
+41 2413 1
+41 2414 1
+41 2415 1
+41 2416 1
+41 2417 1
+41 2418 1
+41 2419 1
+41 2425 1
+41 2426 1
+41 2427 1
+41 2428 1
+41 2429 1
+41 2641 1
+41 2647 1
+41 2648 1
+41 2649 1
+41 2650 1
+41 2651 1
+41 2662 1
+41 2663 1
+41 2664 1
+41 2665 1
+41 2666 1
+41 2677 1
+41 2678 1
+41 2679 1
+41 2680 1
+41 2681 1
+41 2682 1
+41 2683 1
+41 2684 1
+41 2685 1
+41 2686 1
+41 2697 1
+41 2698 1
+41 2699 1
+41 2700 1
+41 2701 1
+41 2712 1
+41 2713 1
+41 2714 1
+41 2715 1
+41 2716 1
+41 2717 1
+41 2718 1
+41 2719 1
+41 2720 1
+41 2721 1
+41 2732 1
+41 2733 1
+41 2734 1
+41 2735 1
+41 2736 1
+41 2737 1
+41 2738 1
+41 2739 1
+41 2740 1
+41 2741 1
+41 2752 1
+41 2753 1
+41 2754 1
+41 2755 1
+41 2756 1
+41 2757 1
+41 2758 1
+41 2759 1
+41 2760 1
+41 2761 1
+41 2767 1
+41 2768 1
+41 2769 1
+41 2770 1
+41 2771 1
+41 2782 1
+41 2783 1
+41 2784 1
+41 2785 1
+41 2786 1
+41 2787 1
+41 2788 1
+41 2789 1
+41 2790 1
+41 2791 1
+41 2802 1
+41 2803 1
+41 2804 1
+41 2805 1
+41 2806 1
+41 2807 1
+41 2808 1
+41 2809 1
+41 2810 1
+41 2811 1
+41 2822 1
+41 2823 1
+41 2824 1
+41 2825 1
+41 2826 1
+41 2827 1
+41 2828 1
+41 2829 1
+41 2830 1
+41 2831 1
+41 2837 1
+41 2838 1
+41 2839 1
+41 2840 1
+41 2841 1
+41 2842 1
+41 2843 1
+41 2844 1
+41 2845 1
+41 2846 1
+41 2857 1
+41 2858 1
+41 2859 1
+41 2860 1
+41 2861 1
+41 2862 1
+41 2863 1
+41 2864 1
+41 2865 1
+41 2866 1
+41 2872 1
+41 2873 1
+41 2874 1
+41 2875 1
+41 2876 1
+41 2877 1
+41 2878 1
+41 2879 1
+41 2880 1
+41 2881 1
+41 2887 1
+41 2888 1
+41 2889 1
+41 2890 1
+41 2891 1
+41 3103 1
+41 3104 1
+41 3105 1
+41 3106 1
+41 3107 1
+41 3118 1
+41 3119 1
+41 3120 1
+41 3121 1
+41 3122 1
+41 3123 1
+41 3124 1
+41 3125 1
+41 3126 1
+41 3127 1
+41 3138 1
+41 3139 1
+41 3140 1
+41 3141 1
+41 3142 1
+41 3143 1
+41 3144 1
+41 3145 1
+41 3146 1
+41 3147 1
+41 3158 1
+41 3159 1
+41 3160 1
+41 3161 1
+41 3162 1
+41 3163 1
+41 3164 1
+41 3165 1
+41 3166 1
+41 3167 1
+41 3173 1
+41 3174 1
+41 3175 1
+41 3176 1
+41 3177 1
+41 3178 1
+41 3179 1
+41 3180 1
+41 3181 1
+41 3182 1
+41 3193 1
+41 3194 1
+41 3195 1
+41 3196 1
+41 3197 1
+41 3198 1
+41 3199 1
+41 3200 1
+41 3201 1
+41 3202 1
+41 3208 1
+41 3209 1
+41 3210 1
+41 3211 1
+41 3212 1
+41 3213 1
+41 3214 1
+41 3215 1
+41 3216 1
+41 3217 1
+41 3223 1
+41 3224 1
+41 3225 1
+41 3226 1
+41 3227 1
+41 3229 1
+41 3230 1
+41 3231 1
+41 3232 1
+41 3233 1
+41 3234 1
+41 3235 1
+41 3236 1
+41 3237 1
+41 3238 1
+41 3249 1
+41 3250 1
+41 3251 1
+41 3252 1
+41 3253 1
+41 3254 1
+41 3255 1
+41 3256 1
+41 3257 1
+41 3258 1
+41 3264 1
+41 3265 1
+41 3266 1
+41 3267 1
+41 3268 1
+41 3269 1
+41 3270 1
+41 3271 1
+41 3272 1
+41 3273 1
+41 3279 1
+41 3280 1
+41 3281 1
+41 3282 1
+41 3283 1
+41 3285 1
+41 3286 1
+41 3287 1
+41 3288 1
+41 3289 1
+41 3290 1
+41 3291 1
+41 3292 1
+41 3293 1
+41 3294 1
+41 3300 1
+41 3301 1
+41 3302 1
+41 3303 1
+41 3304 1
+41 3306 1
+41 3307 1
+41 3308 1
+41 3309 1
+41 3310 1
+41 3312 1
+42 4 1
+42 11 1
+42 17 1
+42 22 1
+42 27 1
+42 28 1
+42 29 1
+42 30 1
+42 39 1
+42 45 1
+42 50 1
+42 55 1
+42 56 1
+42 57 1
+42 58 1
+42 66 1
+42 71 1
+42 76 1
+42 77 1
+42 78 1
+42 79 1
+42 86 1
+42 91 1
+42 92 1
+42 93 1
+42 94 1
+42 101 1
+42 102 1
+42 103 1
+42 104 1
+42 111 1
+42 112 1
+42 113 1
+42 114 1
+42 115 1
+42 116 1
+42 333 1
+42 339 1
+42 344 1
+42 349 1
+42 350 1
+42 351 1
+42 352 1
+42 360 1
+42 365 1
+42 370 1
+42 371 1
+42 372 1
+42 373 1
+42 380 1
+42 385 1
+42 386 1
+42 387 1
+42 388 1
+42 395 1
+42 396 1
+42 397 1
+42 398 1
+42 405 1
+42 406 1
+42 407 1
+42 408 1
+42 409 1
+42 410 1
+42 416 1
+42 421 1
+42 426 1
+42 427 1
+42 428 1
+42 429 1
+42 436 1
+42 441 1
+42 442 1
+42 443 1
+42 444 1
+42 451 1
+42 452 1
+42 453 1
+42 454 1
+42 461 1
+42 462 1
+42 463 1
+42 464 1
+42 465 1
+42 466 1
+42 471 1
+42 476 1
+42 477 1
+42 478 1
+42 479 1
+42 486 1
+42 487 1
+42 488 1
+42 489 1
+42 496 1
+42 497 1
+42 498 1
+42 499 1
+42 500 1
+42 501 1
+42 506 1
+42 507 1
+42 508 1
+42 509 1
+42 516 1
+42 517 1
+42 518 1
+42 519 1
+42 520 1
+42 521 1
+42 526 1
+42 527 1
+42 528 1
+42 529 1
+42 530 1
+42 531 1
+42 536 1
+42 537 1
+42 538 1
+42 539 1
+42 795 1
+42 801 1
+42 806 1
+42 811 1
+42 812 1
+42 813 1
+42 814 1
+42 822 1
+42 827 1
+42 832 1
+42 833 1
+42 834 1
+42 835 1
+42 842 1
+42 847 1
+42 848 1
+42 849 1
+42 850 1
+42 857 1
+42 858 1
+42 859 1
+42 860 1
+42 867 1
+42 868 1
+42 869 1
+42 870 1
+42 871 1
+42 872 1
+42 878 1
+42 883 1
+42 888 1
+42 889 1
+42 890 1
+42 891 1
+42 898 1
+42 903 1
+42 904 1
+42 905 1
+42 906 1
+42 913 1
+42 914 1
+42 915 1
+42 916 1
+42 923 1
+42 924 1
+42 925 1
+42 926 1
+42 927 1
+42 928 1
+42 933 1
+42 938 1
+42 939 1
+42 940 1
+42 941 1
+42 948 1
+42 949 1
+42 950 1
+42 951 1
+42 958 1
+42 959 1
+42 960 1
+42 961 1
+42 962 1
+42 963 1
+42 968 1
+42 969 1
+42 970 1
+42 971 1
+42 978 1
+42 979 1
+42 980 1
+42 981 1
+42 982 1
+42 983 1
+42 988 1
+42 989 1
+42 990 1
+42 991 1
+42 992 1
+42 993 1
+42 998 1
+42 999 1
+42 1000 1
+42 1001 1
+42 1256 1
+42 1261 1
+42 1266 1
+42 1267 1
+42 1268 1
+42 1269 1
+42 1276 1
+42 1281 1
+42 1282 1
+42 1283 1
+42 1284 1
+42 1291 1
+42 1292 1
+42 1293 1
+42 1294 1
+42 1301 1
+42 1302 1
+42 1303 1
+42 1304 1
+42 1305 1
+42 1306 1
+42 1311 1
+42 1316 1
+42 1317 1
+42 1318 1
+42 1319 1
+42 1326 1
+42 1327 1
+42 1328 1
+42 1329 1
+42 1336 1
+42 1337 1
+42 1338 1
+42 1339 1
+42 1340 1
+42 1341 1
+42 1346 1
+42 1347 1
+42 1348 1
+42 1349 1
+42 1356 1
+42 1357 1
+42 1358 1
+42 1359 1
+42 1360 1
+42 1361 1
+42 1366 1
+42 1367 1
+42 1368 1
+42 1369 1
+42 1370 1
+42 1371 1
+42 1376 1
+42 1377 1
+42 1378 1
+42 1379 1
+42 1381 1
+42 1386 1
+42 1387 1
+42 1388 1
+42 1389 1
+42 1396 1
+42 1397 1
+42 1398 1
+42 1399 1
+42 1406 1
+42 1407 1
+42 1408 1
+42 1409 1
+42 1410 1
+42 1411 1
+42 1416 1
+42 1417 1
+42 1418 1
+42 1419 1
+42 1426 1
+42 1427 1
+42 1428 1
+42 1429 1
+42 1430 1
+42 1431 1
+42 1436 1
+42 1437 1
+42 1438 1
+42 1439 1
+42 1440 1
+42 1441 1
+42 1446 1
+42 1447 1
+42 1448 1
+42 1449 1
+42 1451 1
+42 1452 1
+42 1453 1
+42 1454 1
+42 1461 1
+42 1462 1
+42 1463 1
+42 1464 1
+42 1465 1
+42 1466 1
+42 1471 1
+42 1472 1
+42 1473 1
+42 1474 1
+42 1475 1
+42 1476 1
+42 1481 1
+42 1482 1
+42 1483 1
+42 1484 1
+42 1486 1
+42 1487 1
+42 1488 1
+42 1489 1
+42 1490 1
+42 1491 1
+42 1496 1
+42 1497 1
+42 1498 1
+42 1499 1
+42 1501 1
+42 1502 1
+42 1503 1
+42 1504 1
+42 1506 1
+42 1719 1
+42 1725 1
+42 1730 1
+42 1735 1
+42 1736 1
+42 1737 1
+42 1738 1
+42 1746 1
+42 1751 1
+42 1756 1
+42 1757 1
+42 1758 1
+42 1759 1
+42 1766 1
+42 1771 1
+42 1772 1
+42 1773 1
+42 1774 1
+42 1781 1
+42 1782 1
+42 1783 1
+42 1784 1
+42 1791 1
+42 1792 1
+42 1793 1
+42 1794 1
+42 1795 1
+42 1796 1
+42 1802 1
+42 1807 1
+42 1812 1
+42 1813 1
+42 1814 1
+42 1815 1
+42 1822 1
+42 1827 1
+42 1828 1
+42 1829 1
+42 1830 1
+42 1837 1
+42 1838 1
+42 1839 1
+42 1840 1
+42 1847 1
+42 1848 1
+42 1849 1
+42 1850 1
+42 1851 1
+42 1852 1
+42 1857 1
+42 1862 1
+42 1863 1
+42 1864 1
+42 1865 1
+42 1872 1
+42 1873 1
+42 1874 1
+42 1875 1
+42 1882 1
+42 1883 1
+42 1884 1
+42 1885 1
+42 1886 1
+42 1887 1
+42 1892 1
+42 1893 1
+42 1894 1
+42 1895 1
+42 1902 1
+42 1903 1
+42 1904 1
+42 1905 1
+42 1906 1
+42 1907 1
+42 1912 1
+42 1913 1
+42 1914 1
+42 1915 1
+42 1916 1
+42 1917 1
+42 1922 1
+42 1923 1
+42 1924 1
+42 1925 1
+42 2180 1
+42 2185 1
+42 2190 1
+42 2191 1
+42 2192 1
+42 2193 1
+42 2200 1
+42 2205 1
+42 2206 1
+42 2207 1
+42 2208 1
+42 2215 1
+42 2216 1
+42 2217 1
+42 2218 1
+42 2225 1
+42 2226 1
+42 2227 1
+42 2228 1
+42 2229 1
+42 2230 1
+42 2235 1
+42 2240 1
+42 2241 1
+42 2242 1
+42 2243 1
+42 2250 1
+42 2251 1
+42 2252 1
+42 2253 1
+42 2260 1
+42 2261 1
+42 2262 1
+42 2263 1
+42 2264 1
+42 2265 1
+42 2270 1
+42 2271 1
+42 2272 1
+42 2273 1
+42 2280 1
+42 2281 1
+42 2282 1
+42 2283 1
+42 2284 1
+42 2285 1
+42 2290 1
+42 2291 1
+42 2292 1
+42 2293 1
+42 2294 1
+42 2295 1
+42 2300 1
+42 2301 1
+42 2302 1
+42 2303 1
+42 2305 1
+42 2310 1
+42 2311 1
+42 2312 1
+42 2313 1
+42 2320 1
+42 2321 1
+42 2322 1
+42 2323 1
+42 2330 1
+42 2331 1
+42 2332 1
+42 2333 1
+42 2334 1
+42 2335 1
+42 2340 1
+42 2341 1
+42 2342 1
+42 2343 1
+42 2350 1
+42 2351 1
+42 2352 1
+42 2353 1
+42 2354 1
+42 2355 1
+42 2360 1
+42 2361 1
+42 2362 1
+42 2363 1
+42 2364 1
+42 2365 1
+42 2370 1
+42 2371 1
+42 2372 1
+42 2373 1
+42 2375 1
+42 2376 1
+42 2377 1
+42 2378 1
+42 2385 1
+42 2386 1
+42 2387 1
+42 2388 1
+42 2389 1
+42 2390 1
+42 2395 1
+42 2396 1
+42 2397 1
+42 2398 1
+42 2399 1
+42 2400 1
+42 2405 1
+42 2406 1
+42 2407 1
+42 2408 1
+42 2410 1
+42 2411 1
+42 2412 1
+42 2413 1
+42 2414 1
+42 2415 1
+42 2420 1
+42 2421 1
+42 2422 1
+42 2423 1
+42 2425 1
+42 2426 1
+42 2427 1
+42 2428 1
+42 2430 1
+42 2642 1
+42 2647 1
+42 2652 1
+42 2653 1
+42 2654 1
+42 2655 1
+42 2662 1
+42 2667 1
+42 2668 1
+42 2669 1
+42 2670 1
+42 2677 1
+42 2678 1
+42 2679 1
+42 2680 1
+42 2687 1
+42 2688 1
+42 2689 1
+42 2690 1
+42 2691 1
+42 2692 1
+42 2697 1
+42 2702 1
+42 2703 1
+42 2704 1
+42 2705 1
+42 2712 1
+42 2713 1
+42 2714 1
+42 2715 1
+42 2722 1
+42 2723 1
+42 2724 1
+42 2725 1
+42 2726 1
+42 2727 1
+42 2732 1
+42 2733 1
+42 2734 1
+42 2735 1
+42 2742 1
+42 2743 1
+42 2744 1
+42 2745 1
+42 2746 1
+42 2747 1
+42 2752 1
+42 2753 1
+42 2754 1
+42 2755 1
+42 2756 1
+42 2757 1
+42 2762 1
+42 2763 1
+42 2764 1
+42 2765 1
+42 2767 1
+42 2772 1
+42 2773 1
+42 2774 1
+42 2775 1
+42 2782 1
+42 2783 1
+42 2784 1
+42 2785 1
+42 2792 1
+42 2793 1
+42 2794 1
+42 2795 1
+42 2796 1
+42 2797 1
+42 2802 1
+42 2803 1
+42 2804 1
+42 2805 1
+42 2812 1
+42 2813 1
+42 2814 1
+42 2815 1
+42 2816 1
+42 2817 1
+42 2822 1
+42 2823 1
+42 2824 1
+42 2825 1
+42 2826 1
+42 2827 1
+42 2832 1
+42 2833 1
+42 2834 1
+42 2835 1
+42 2837 1
+42 2838 1
+42 2839 1
+42 2840 1
+42 2847 1
+42 2848 1
+42 2849 1
+42 2850 1
+42 2851 1
+42 2852 1
+42 2857 1
+42 2858 1
+42 2859 1
+42 2860 1
+42 2861 1
+42 2862 1
+42 2867 1
+42 2868 1
+42 2869 1
+42 2870 1
+42 2872 1
+42 2873 1
+42 2874 1
+42 2875 1
+42 2876 1
+42 2877 1
+42 2882 1
+42 2883 1
+42 2884 1
+42 2885 1
+42 2887 1
+42 2888 1
+42 2889 1
+42 2890 1
+42 2892 1
+42 3103 1
+42 3108 1
+42 3109 1
+42 3110 1
+42 3111 1
+42 3118 1
+42 3119 1
+42 3120 1
+42 3121 1
+42 3128 1
+42 3129 1
+42 3130 1
+42 3131 1
+42 3132 1
+42 3133 1
+42 3138 1
+42 3139 1
+42 3140 1
+42 3141 1
+42 3148 1
+42 3149 1
+42 3150 1
+42 3151 1
+42 3152 1
+42 3153 1
+42 3158 1
+42 3159 1
+42 3160 1
+42 3161 1
+42 3162 1
+42 3163 1
+42 3168 1
+42 3169 1
+42 3170 1
+42 3171 1
+42 3173 1
+42 3174 1
+42 3175 1
+42 3176 1
+42 3183 1
+42 3184 1
+42 3185 1
+42 3186 1
+42 3187 1
+42 3188 1
+42 3193 1
+42 3194 1
+42 3195 1
+42 3196 1
+42 3197 1
+42 3198 1
+42 3203 1
+42 3204 1
+42 3205 1
+42 3206 1
+42 3208 1
+42 3209 1
+42 3210 1
+42 3211 1
+42 3212 1
+42 3213 1
+42 3218 1
+42 3219 1
+42 3220 1
+42 3221 1
+42 3223 1
+42 3224 1
+42 3225 1
+42 3226 1
+42 3228 1
+42 3229 1
+42 3230 1
+42 3231 1
+42 3232 1
+42 3239 1
+42 3240 1
+42 3241 1
+42 3242 1
+42 3243 1
+42 3244 1
+42 3249 1
+42 3250 1
+42 3251 1
+42 3252 1
+42 3253 1
+42 3254 1
+42 3259 1
+42 3260 1
+42 3261 1
+42 3262 1
+42 3264 1
+42 3265 1
+42 3266 1
+42 3267 1
+42 3268 1
+42 3269 1
+42 3274 1
+42 3275 1
+42 3276 1
+42 3277 1
+42 3279 1
+42 3280 1
+42 3281 1
+42 3282 1
+42 3284 1
+42 3285 1
+42 3286 1
+42 3287 1
+42 3288 1
+42 3289 1
+42 3290 1
+42 3295 1
+42 3296 1
+42 3297 1
+42 3298 1
+42 3300 1
+42 3301 1
+42 3302 1
+42 3303 1
+42 3305 1
+42 3306 1
+42 3307 1
+42 3308 1
+42 3309 1
+42 3311 1
+42 3312 1
+43 5 1
+43 12 1
+43 18 1
+43 23 1
+43 27 1
+43 31 1
+43 32 1
+43 33 1
+43 40 1
+43 46 1
+43 51 1
+43 55 1
+43 59 1
+43 60 1
+43 61 1
+43 67 1
+43 72 1
+43 76 1
+43 80 1
+43 81 1
+43 82 1
+43 87 1
+43 91 1
+43 95 1
+43 96 1
+43 97 1
+43 101 1
+43 105 1
+43 106 1
+43 107 1
+43 111 1
+43 112 1
+43 113 1
+43 117 1
+43 118 1
+43 119 1
+43 334 1
+43 340 1
+43 345 1
+43 349 1
+43 353 1
+43 354 1
+43 355 1
+43 361 1
+43 366 1
+43 370 1
+43 374 1
+43 375 1
+43 376 1
+43 381 1
+43 385 1
+43 389 1
+43 390 1
+43 391 1
+43 395 1
+43 399 1
+43 400 1
+43 401 1
+43 405 1
+43 406 1
+43 407 1
+43 411 1
+43 412 1
+43 413 1
+43 417 1
+43 422 1
+43 426 1
+43 430 1
+43 431 1
+43 432 1
+43 437 1
+43 441 1
+43 445 1
+43 446 1
+43 447 1
+43 451 1
+43 455 1
+43 456 1
+43 457 1
+43 461 1
+43 462 1
+43 463 1
+43 467 1
+43 468 1
+43 469 1
+43 472 1
+43 476 1
+43 480 1
+43 481 1
+43 482 1
+43 486 1
+43 490 1
+43 491 1
+43 492 1
+43 496 1
+43 497 1
+43 498 1
+43 502 1
+43 503 1
+43 504 1
+43 506 1
+43 510 1
+43 511 1
+43 512 1
+43 516 1
+43 517 1
+43 518 1
+43 522 1
+43 523 1
+43 524 1
+43 526 1
+43 527 1
+43 528 1
+43 532 1
+43 533 1
+43 534 1
+43 536 1
+43 537 1
+43 538 1
+43 540 1
+43 796 1
+43 802 1
+43 807 1
+43 811 1
+43 815 1
+43 816 1
+43 817 1
+43 823 1
+43 828 1
+43 832 1
+43 836 1
+43 837 1
+43 838 1
+43 843 1
+43 847 1
+43 851 1
+43 852 1
+43 853 1
+43 857 1
+43 861 1
+43 862 1
+43 863 1
+43 867 1
+43 868 1
+43 869 1
+43 873 1
+43 874 1
+43 875 1
+43 879 1
+43 884 1
+43 888 1
+43 892 1
+43 893 1
+43 894 1
+43 899 1
+43 903 1
+43 907 1
+43 908 1
+43 909 1
+43 913 1
+43 917 1
+43 918 1
+43 919 1
+43 923 1
+43 924 1
+43 925 1
+43 929 1
+43 930 1
+43 931 1
+43 934 1
+43 938 1
+43 942 1
+43 943 1
+43 944 1
+43 948 1
+43 952 1
+43 953 1
+43 954 1
+43 958 1
+43 959 1
+43 960 1
+43 964 1
+43 965 1
+43 966 1
+43 968 1
+43 972 1
+43 973 1
+43 974 1
+43 978 1
+43 979 1
+43 980 1
+43 984 1
+43 985 1
+43 986 1
+43 988 1
+43 989 1
+43 990 1
+43 994 1
+43 995 1
+43 996 1
+43 998 1
+43 999 1
+43 1000 1
+43 1002 1
+43 1257 1
+43 1262 1
+43 1266 1
+43 1270 1
+43 1271 1
+43 1272 1
+43 1277 1
+43 1281 1
+43 1285 1
+43 1286 1
+43 1287 1
+43 1291 1
+43 1295 1
+43 1296 1
+43 1297 1
+43 1301 1
+43 1302 1
+43 1303 1
+43 1307 1
+43 1308 1
+43 1309 1
+43 1312 1
+43 1316 1
+43 1320 1
+43 1321 1
+43 1322 1
+43 1326 1
+43 1330 1
+43 1331 1
+43 1332 1
+43 1336 1
+43 1337 1
+43 1338 1
+43 1342 1
+43 1343 1
+43 1344 1
+43 1346 1
+43 1350 1
+43 1351 1
+43 1352 1
+43 1356 1
+43 1357 1
+43 1358 1
+43 1362 1
+43 1363 1
+43 1364 1
+43 1366 1
+43 1367 1
+43 1368 1
+43 1372 1
+43 1373 1
+43 1374 1
+43 1376 1
+43 1377 1
+43 1378 1
+43 1380 1
+43 1382 1
+43 1386 1
+43 1390 1
+43 1391 1
+43 1392 1
+43 1396 1
+43 1400 1
+43 1401 1
+43 1402 1
+43 1406 1
+43 1407 1
+43 1408 1
+43 1412 1
+43 1413 1
+43 1414 1
+43 1416 1
+43 1420 1
+43 1421 1
+43 1422 1
+43 1426 1
+43 1427 1
+43 1428 1
+43 1432 1
+43 1433 1
+43 1434 1
+43 1436 1
+43 1437 1
+43 1438 1
+43 1442 1
+43 1443 1
+43 1444 1
+43 1446 1
+43 1447 1
+43 1448 1
+43 1450 1
+43 1451 1
+43 1455 1
+43 1456 1
+43 1457 1
+43 1461 1
+43 1462 1
+43 1463 1
+43 1467 1
+43 1468 1
+43 1469 1
+43 1471 1
+43 1472 1
+43 1473 1
+43 1477 1
+43 1478 1
+43 1479 1
+43 1481 1
+43 1482 1
+43 1483 1
+43 1485 1
+43 1486 1
+43 1487 1
+43 1488 1
+43 1492 1
+43 1493 1
+43 1494 1
+43 1496 1
+43 1497 1
+43 1498 1
+43 1500 1
+43 1501 1
+43 1502 1
+43 1503 1
+43 1505 1
+43 1506 1
+43 1720 1
+43 1726 1
+43 1731 1
+43 1735 1
+43 1739 1
+43 1740 1
+43 1741 1
+43 1747 1
+43 1752 1
+43 1756 1
+43 1760 1
+43 1761 1
+43 1762 1
+43 1767 1
+43 1771 1
+43 1775 1
+43 1776 1
+43 1777 1
+43 1781 1
+43 1785 1
+43 1786 1
+43 1787 1
+43 1791 1
+43 1792 1
+43 1793 1
+43 1797 1
+43 1798 1
+43 1799 1
+43 1803 1
+43 1808 1
+43 1812 1
+43 1816 1
+43 1817 1
+43 1818 1
+43 1823 1
+43 1827 1
+43 1831 1
+43 1832 1
+43 1833 1
+43 1837 1
+43 1841 1
+43 1842 1
+43 1843 1
+43 1847 1
+43 1848 1
+43 1849 1
+43 1853 1
+43 1854 1
+43 1855 1
+43 1858 1
+43 1862 1
+43 1866 1
+43 1867 1
+43 1868 1
+43 1872 1
+43 1876 1
+43 1877 1
+43 1878 1
+43 1882 1
+43 1883 1
+43 1884 1
+43 1888 1
+43 1889 1
+43 1890 1
+43 1892 1
+43 1896 1
+43 1897 1
+43 1898 1
+43 1902 1
+43 1903 1
+43 1904 1
+43 1908 1
+43 1909 1
+43 1910 1
+43 1912 1
+43 1913 1
+43 1914 1
+43 1918 1
+43 1919 1
+43 1920 1
+43 1922 1
+43 1923 1
+43 1924 1
+43 1926 1
+43 2181 1
+43 2186 1
+43 2190 1
+43 2194 1
+43 2195 1
+43 2196 1
+43 2201 1
+43 2205 1
+43 2209 1
+43 2210 1
+43 2211 1
+43 2215 1
+43 2219 1
+43 2220 1
+43 2221 1
+43 2225 1
+43 2226 1
+43 2227 1
+43 2231 1
+43 2232 1
+43 2233 1
+43 2236 1
+43 2240 1
+43 2244 1
+43 2245 1
+43 2246 1
+43 2250 1
+43 2254 1
+43 2255 1
+43 2256 1
+43 2260 1
+43 2261 1
+43 2262 1
+43 2266 1
+43 2267 1
+43 2268 1
+43 2270 1
+43 2274 1
+43 2275 1
+43 2276 1
+43 2280 1
+43 2281 1
+43 2282 1
+43 2286 1
+43 2287 1
+43 2288 1
+43 2290 1
+43 2291 1
+43 2292 1
+43 2296 1
+43 2297 1
+43 2298 1
+43 2300 1
+43 2301 1
+43 2302 1
+43 2304 1
+43 2306 1
+43 2310 1
+43 2314 1
+43 2315 1
+43 2316 1
+43 2320 1
+43 2324 1
+43 2325 1
+43 2326 1
+43 2330 1
+43 2331 1
+43 2332 1
+43 2336 1
+43 2337 1
+43 2338 1
+43 2340 1
+43 2344 1
+43 2345 1
+43 2346 1
+43 2350 1
+43 2351 1
+43 2352 1
+43 2356 1
+43 2357 1
+43 2358 1
+43 2360 1
+43 2361 1
+43 2362 1
+43 2366 1
+43 2367 1
+43 2368 1
+43 2370 1
+43 2371 1
+43 2372 1
+43 2374 1
+43 2375 1
+43 2379 1
+43 2380 1
+43 2381 1
+43 2385 1
+43 2386 1
+43 2387 1
+43 2391 1
+43 2392 1
+43 2393 1
+43 2395 1
+43 2396 1
+43 2397 1
+43 2401 1
+43 2402 1
+43 2403 1
+43 2405 1
+43 2406 1
+43 2407 1
+43 2409 1
+43 2410 1
+43 2411 1
+43 2412 1
+43 2416 1
+43 2417 1
+43 2418 1
+43 2420 1
+43 2421 1
+43 2422 1
+43 2424 1
+43 2425 1
+43 2426 1
+43 2427 1
+43 2429 1
+43 2430 1
+43 2643 1
+43 2648 1
+43 2652 1
+43 2656 1
+43 2657 1
+43 2658 1
+43 2663 1
+43 2667 1
+43 2671 1
+43 2672 1
+43 2673 1
+43 2677 1
+43 2681 1
+43 2682 1
+43 2683 1
+43 2687 1
+43 2688 1
+43 2689 1
+43 2693 1
+43 2694 1
+43 2695 1
+43 2698 1
+43 2702 1
+43 2706 1
+43 2707 1
+43 2708 1
+43 2712 1
+43 2716 1
+43 2717 1
+43 2718 1
+43 2722 1
+43 2723 1
+43 2724 1
+43 2728 1
+43 2729 1
+43 2730 1
+43 2732 1
+43 2736 1
+43 2737 1
+43 2738 1
+43 2742 1
+43 2743 1
+43 2744 1
+43 2748 1
+43 2749 1
+43 2750 1
+43 2752 1
+43 2753 1
+43 2754 1
+43 2758 1
+43 2759 1
+43 2760 1
+43 2762 1
+43 2763 1
+43 2764 1
+43 2766 1
+43 2768 1
+43 2772 1
+43 2776 1
+43 2777 1
+43 2778 1
+43 2782 1
+43 2786 1
+43 2787 1
+43 2788 1
+43 2792 1
+43 2793 1
+43 2794 1
+43 2798 1
+43 2799 1
+43 2800 1
+43 2802 1
+43 2806 1
+43 2807 1
+43 2808 1
+43 2812 1
+43 2813 1
+43 2814 1
+43 2818 1
+43 2819 1
+43 2820 1
+43 2822 1
+43 2823 1
+43 2824 1
+43 2828 1
+43 2829 1
+43 2830 1
+43 2832 1
+43 2833 1
+43 2834 1
+43 2836 1
+43 2837 1
+43 2841 1
+43 2842 1
+43 2843 1
+43 2847 1
+43 2848 1
+43 2849 1
+43 2853 1
+43 2854 1
+43 2855 1
+43 2857 1
+43 2858 1
+43 2859 1
+43 2863 1
+43 2864 1
+43 2865 1
+43 2867 1
+43 2868 1
+43 2869 1
+43 2871 1
+43 2872 1
+43 2873 1
+43 2874 1
+43 2878 1
+43 2879 1
+43 2880 1
+43 2882 1
+43 2883 1
+43 2884 1
+43 2886 1
+43 2887 1
+43 2888 1
+43 2889 1
+43 2891 1
+43 2892 1
+43 3104 1
+43 3108 1
+43 3112 1
+43 3113 1
+43 3114 1
+43 3118 1
+43 3122 1
+43 3123 1
+43 3124 1
+43 3128 1
+43 3129 1
+43 3130 1
+43 3134 1
+43 3135 1
+43 3136 1
+43 3138 1
+43 3142 1
+43 3143 1
+43 3144 1
+43 3148 1
+43 3149 1
+43 3150 1
+43 3154 1
+43 3155 1
+43 3156 1
+43 3158 1
+43 3159 1
+43 3160 1
+43 3164 1
+43 3165 1
+43 3166 1
+43 3168 1
+43 3169 1
+43 3170 1
+43 3172 1
+43 3173 1
+43 3177 1
+43 3178 1
+43 3179 1
+43 3183 1
+43 3184 1
+43 3185 1
+43 3189 1
+43 3190 1
+43 3191 1
+43 3193 1
+43 3194 1
+43 3195 1
+43 3199 1
+43 3200 1
+43 3201 1
+43 3203 1
+43 3204 1
+43 3205 1
+43 3207 1
+43 3208 1
+43 3209 1
+43 3210 1
+43 3214 1
+43 3215 1
+43 3216 1
+43 3218 1
+43 3219 1
+43 3220 1
+43 3222 1
+43 3223 1
+43 3224 1
+43 3225 1
+43 3227 1
+43 3228 1
+43 3229 1
+43 3233 1
+43 3234 1
+43 3235 1
+43 3239 1
+43 3240 1
+43 3241 1
+43 3245 1
+43 3246 1
+43 3247 1
+43 3249 1
+43 3250 1
+43 3251 1
+43 3255 1
+43 3256 1
+43 3257 1
+43 3259 1
+43 3260 1
+43 3261 1
+43 3263 1
+43 3264 1
+43 3265 1
+43 3266 1
+43 3270 1
+43 3271 1
+43 3272 1
+43 3274 1
+43 3275 1
+43 3276 1
+43 3278 1
+43 3279 1
+43 3280 1
+43 3281 1
+43 3283 1
+43 3284 1
+43 3285 1
+43 3286 1
+43 3287 1
+43 3291 1
+43 3292 1
+43 3293 1
+43 3295 1
+43 3296 1
+43 3297 1
+43 3299 1
+43 3300 1
+43 3301 1
+43 3302 1
+43 3304 1
+43 3305 1
+43 3306 1
+43 3307 1
+43 3308 1
+43 3310 1
+43 3311 1
+43 3312 1
+44 6 1
+44 13 1
+44 19 1
+44 24 1
+44 28 1
+44 31 1
+44 34 1
+44 35 1
+44 41 1
+44 47 1
+44 52 1
+44 56 1
+44 59 1
+44 62 1
+44 63 1
+44 68 1
+44 73 1
+44 77 1
+44 80 1
+44 83 1
+44 84 1
+44 88 1
+44 92 1
+44 95 1
+44 98 1
+44 99 1
+44 102 1
+44 105 1
+44 108 1
+44 109 1
+44 111 1
+44 114 1
+44 115 1
+44 117 1
+44 118 1
+44 120 1
+44 335 1
+44 341 1
+44 346 1
+44 350 1
+44 353 1
+44 356 1
+44 357 1
+44 362 1
+44 367 1
+44 371 1
+44 374 1
+44 377 1
+44 378 1
+44 382 1
+44 386 1
+44 389 1
+44 392 1
+44 393 1
+44 396 1
+44 399 1
+44 402 1
+44 403 1
+44 405 1
+44 408 1
+44 409 1
+44 411 1
+44 412 1
+44 414 1
+44 418 1
+44 423 1
+44 427 1
+44 430 1
+44 433 1
+44 434 1
+44 438 1
+44 442 1
+44 445 1
+44 448 1
+44 449 1
+44 452 1
+44 455 1
+44 458 1
+44 459 1
+44 461 1
+44 464 1
+44 465 1
+44 467 1
+44 468 1
+44 470 1
+44 473 1
+44 477 1
+44 480 1
+44 483 1
+44 484 1
+44 487 1
+44 490 1
+44 493 1
+44 494 1
+44 496 1
+44 499 1
+44 500 1
+44 502 1
+44 503 1
+44 505 1
+44 507 1
+44 510 1
+44 513 1
+44 514 1
+44 516 1
+44 519 1
+44 520 1
+44 522 1
+44 523 1
+44 525 1
+44 526 1
+44 529 1
+44 530 1
+44 532 1
+44 533 1
+44 535 1
+44 536 1
+44 537 1
+44 539 1
+44 540 1
+44 797 1
+44 803 1
+44 808 1
+44 812 1
+44 815 1
+44 818 1
+44 819 1
+44 824 1
+44 829 1
+44 833 1
+44 836 1
+44 839 1
+44 840 1
+44 844 1
+44 848 1
+44 851 1
+44 854 1
+44 855 1
+44 858 1
+44 861 1
+44 864 1
+44 865 1
+44 867 1
+44 870 1
+44 871 1
+44 873 1
+44 874 1
+44 876 1
+44 880 1
+44 885 1
+44 889 1
+44 892 1
+44 895 1
+44 896 1
+44 900 1
+44 904 1
+44 907 1
+44 910 1
+44 911 1
+44 914 1
+44 917 1
+44 920 1
+44 921 1
+44 923 1
+44 926 1
+44 927 1
+44 929 1
+44 930 1
+44 932 1
+44 935 1
+44 939 1
+44 942 1
+44 945 1
+44 946 1
+44 949 1
+44 952 1
+44 955 1
+44 956 1
+44 958 1
+44 961 1
+44 962 1
+44 964 1
+44 965 1
+44 967 1
+44 969 1
+44 972 1
+44 975 1
+44 976 1
+44 978 1
+44 981 1
+44 982 1
+44 984 1
+44 985 1
+44 987 1
+44 988 1
+44 991 1
+44 992 1
+44 994 1
+44 995 1
+44 997 1
+44 998 1
+44 999 1
+44 1001 1
+44 1002 1
+44 1258 1
+44 1263 1
+44 1267 1
+44 1270 1
+44 1273 1
+44 1274 1
+44 1278 1
+44 1282 1
+44 1285 1
+44 1288 1
+44 1289 1
+44 1292 1
+44 1295 1
+44 1298 1
+44 1299 1
+44 1301 1
+44 1304 1
+44 1305 1
+44 1307 1
+44 1308 1
+44 1310 1
+44 1313 1
+44 1317 1
+44 1320 1
+44 1323 1
+44 1324 1
+44 1327 1
+44 1330 1
+44 1333 1
+44 1334 1
+44 1336 1
+44 1339 1
+44 1340 1
+44 1342 1
+44 1343 1
+44 1345 1
+44 1347 1
+44 1350 1
+44 1353 1
+44 1354 1
+44 1356 1
+44 1359 1
+44 1360 1
+44 1362 1
+44 1363 1
+44 1365 1
+44 1366 1
+44 1369 1
+44 1370 1
+44 1372 1
+44 1373 1
+44 1375 1
+44 1376 1
+44 1377 1
+44 1379 1
+44 1380 1
+44 1383 1
+44 1387 1
+44 1390 1
+44 1393 1
+44 1394 1
+44 1397 1
+44 1400 1
+44 1403 1
+44 1404 1
+44 1406 1
+44 1409 1
+44 1410 1
+44 1412 1
+44 1413 1
+44 1415 1
+44 1417 1
+44 1420 1
+44 1423 1
+44 1424 1
+44 1426 1
+44 1429 1
+44 1430 1
+44 1432 1
+44 1433 1
+44 1435 1
+44 1436 1
+44 1439 1
+44 1440 1
+44 1442 1
+44 1443 1
+44 1445 1
+44 1446 1
+44 1447 1
+44 1449 1
+44 1450 1
+44 1452 1
+44 1455 1
+44 1458 1
+44 1459 1
+44 1461 1
+44 1464 1
+44 1465 1
+44 1467 1
+44 1468 1
+44 1470 1
+44 1471 1
+44 1474 1
+44 1475 1
+44 1477 1
+44 1478 1
+44 1480 1
+44 1481 1
+44 1482 1
+44 1484 1
+44 1485 1
+44 1486 1
+44 1489 1
+44 1490 1
+44 1492 1
+44 1493 1
+44 1495 1
+44 1496 1
+44 1497 1
+44 1499 1
+44 1500 1
+44 1501 1
+44 1502 1
+44 1504 1
+44 1505 1
+44 1506 1
+44 1721 1
+44 1727 1
+44 1732 1
+44 1736 1
+44 1739 1
+44 1742 1
+44 1743 1
+44 1748 1
+44 1753 1
+44 1757 1
+44 1760 1
+44 1763 1
+44 1764 1
+44 1768 1
+44 1772 1
+44 1775 1
+44 1778 1
+44 1779 1
+44 1782 1
+44 1785 1
+44 1788 1
+44 1789 1
+44 1791 1
+44 1794 1
+44 1795 1
+44 1797 1
+44 1798 1
+44 1800 1
+44 1804 1
+44 1809 1
+44 1813 1
+44 1816 1
+44 1819 1
+44 1820 1
+44 1824 1
+44 1828 1
+44 1831 1
+44 1834 1
+44 1835 1
+44 1838 1
+44 1841 1
+44 1844 1
+44 1845 1
+44 1847 1
+44 1850 1
+44 1851 1
+44 1853 1
+44 1854 1
+44 1856 1
+44 1859 1
+44 1863 1
+44 1866 1
+44 1869 1
+44 1870 1
+44 1873 1
+44 1876 1
+44 1879 1
+44 1880 1
+44 1882 1
+44 1885 1
+44 1886 1
+44 1888 1
+44 1889 1
+44 1891 1
+44 1893 1
+44 1896 1
+44 1899 1
+44 1900 1
+44 1902 1
+44 1905 1
+44 1906 1
+44 1908 1
+44 1909 1
+44 1911 1
+44 1912 1
+44 1915 1
+44 1916 1
+44 1918 1
+44 1919 1
+44 1921 1
+44 1922 1
+44 1923 1
+44 1925 1
+44 1926 1
+44 2182 1
+44 2187 1
+44 2191 1
+44 2194 1
+44 2197 1
+44 2198 1
+44 2202 1
+44 2206 1
+44 2209 1
+44 2212 1
+44 2213 1
+44 2216 1
+44 2219 1
+44 2222 1
+44 2223 1
+44 2225 1
+44 2228 1
+44 2229 1
+44 2231 1
+44 2232 1
+44 2234 1
+44 2237 1
+44 2241 1
+44 2244 1
+44 2247 1
+44 2248 1
+44 2251 1
+44 2254 1
+44 2257 1
+44 2258 1
+44 2260 1
+44 2263 1
+44 2264 1
+44 2266 1
+44 2267 1
+44 2269 1
+44 2271 1
+44 2274 1
+44 2277 1
+44 2278 1
+44 2280 1
+44 2283 1
+44 2284 1
+44 2286 1
+44 2287 1
+44 2289 1
+44 2290 1
+44 2293 1
+44 2294 1
+44 2296 1
+44 2297 1
+44 2299 1
+44 2300 1
+44 2301 1
+44 2303 1
+44 2304 1
+44 2307 1
+44 2311 1
+44 2314 1
+44 2317 1
+44 2318 1
+44 2321 1
+44 2324 1
+44 2327 1
+44 2328 1
+44 2330 1
+44 2333 1
+44 2334 1
+44 2336 1
+44 2337 1
+44 2339 1
+44 2341 1
+44 2344 1
+44 2347 1
+44 2348 1
+44 2350 1
+44 2353 1
+44 2354 1
+44 2356 1
+44 2357 1
+44 2359 1
+44 2360 1
+44 2363 1
+44 2364 1
+44 2366 1
+44 2367 1
+44 2369 1
+44 2370 1
+44 2371 1
+44 2373 1
+44 2374 1
+44 2376 1
+44 2379 1
+44 2382 1
+44 2383 1
+44 2385 1
+44 2388 1
+44 2389 1
+44 2391 1
+44 2392 1
+44 2394 1
+44 2395 1
+44 2398 1
+44 2399 1
+44 2401 1
+44 2402 1
+44 2404 1
+44 2405 1
+44 2406 1
+44 2408 1
+44 2409 1
+44 2410 1
+44 2413 1
+44 2414 1
+44 2416 1
+44 2417 1
+44 2419 1
+44 2420 1
+44 2421 1
+44 2423 1
+44 2424 1
+44 2425 1
+44 2426 1
+44 2428 1
+44 2429 1
+44 2430 1
+44 2644 1
+44 2649 1
+44 2653 1
+44 2656 1
+44 2659 1
+44 2660 1
+44 2664 1
+44 2668 1
+44 2671 1
+44 2674 1
+44 2675 1
+44 2678 1
+44 2681 1
+44 2684 1
+44 2685 1
+44 2687 1
+44 2690 1
+44 2691 1
+44 2693 1
+44 2694 1
+44 2696 1
+44 2699 1
+44 2703 1
+44 2706 1
+44 2709 1
+44 2710 1
+44 2713 1
+44 2716 1
+44 2719 1
+44 2720 1
+44 2722 1
+44 2725 1
+44 2726 1
+44 2728 1
+44 2729 1
+44 2731 1
+44 2733 1
+44 2736 1
+44 2739 1
+44 2740 1
+44 2742 1
+44 2745 1
+44 2746 1
+44 2748 1
+44 2749 1
+44 2751 1
+44 2752 1
+44 2755 1
+44 2756 1
+44 2758 1
+44 2759 1
+44 2761 1
+44 2762 1
+44 2763 1
+44 2765 1
+44 2766 1
+44 2769 1
+44 2773 1
+44 2776 1
+44 2779 1
+44 2780 1
+44 2783 1
+44 2786 1
+44 2789 1
+44 2790 1
+44 2792 1
+44 2795 1
+44 2796 1
+44 2798 1
+44 2799 1
+44 2801 1
+44 2803 1
+44 2806 1
+44 2809 1
+44 2810 1
+44 2812 1
+44 2815 1
+44 2816 1
+44 2818 1
+44 2819 1
+44 2821 1
+44 2822 1
+44 2825 1
+44 2826 1
+44 2828 1
+44 2829 1
+44 2831 1
+44 2832 1
+44 2833 1
+44 2835 1
+44 2836 1
+44 2838 1
+44 2841 1
+44 2844 1
+44 2845 1
+44 2847 1
+44 2850 1
+44 2851 1
+44 2853 1
+44 2854 1
+44 2856 1
+44 2857 1
+44 2860 1
+44 2861 1
+44 2863 1
+44 2864 1
+44 2866 1
+44 2867 1
+44 2868 1
+44 2870 1
+44 2871 1
+44 2872 1
+44 2875 1
+44 2876 1
+44 2878 1
+44 2879 1
+44 2881 1
+44 2882 1
+44 2883 1
+44 2885 1
+44 2886 1
+44 2887 1
+44 2888 1
+44 2890 1
+44 2891 1
+44 2892 1
+44 3105 1
+44 3109 1
+44 3112 1
+44 3115 1
+44 3116 1
+44 3119 1
+44 3122 1
+44 3125 1
+44 3126 1
+44 3128 1
+44 3131 1
+44 3132 1
+44 3134 1
+44 3135 1
+44 3137 1
+44 3139 1
+44 3142 1
+44 3145 1
+44 3146 1
+44 3148 1
+44 3151 1
+44 3152 1
+44 3154 1
+44 3155 1
+44 3157 1
+44 3158 1
+44 3161 1
+44 3162 1
+44 3164 1
+44 3165 1
+44 3167 1
+44 3168 1
+44 3169 1
+44 3171 1
+44 3172 1
+44 3174 1
+44 3177 1
+44 3180 1
+44 3181 1
+44 3183 1
+44 3186 1
+44 3187 1
+44 3189 1
+44 3190 1
+44 3192 1
+44 3193 1
+44 3196 1
+44 3197 1
+44 3199 1
+44 3200 1
+44 3202 1
+44 3203 1
+44 3204 1
+44 3206 1
+44 3207 1
+44 3208 1
+44 3211 1
+44 3212 1
+44 3214 1
+44 3215 1
+44 3217 1
+44 3218 1
+44 3219 1
+44 3221 1
+44 3222 1
+44 3223 1
+44 3224 1
+44 3226 1
+44 3227 1
+44 3228 1
+44 3230 1
+44 3233 1
+44 3236 1
+44 3237 1
+44 3239 1
+44 3242 1
+44 3243 1
+44 3245 1
+44 3246 1
+44 3248 1
+44 3249 1
+44 3252 1
+44 3253 1
+44 3255 1
+44 3256 1
+44 3258 1
+44 3259 1
+44 3260 1
+44 3262 1
+44 3263 1
+44 3264 1
+44 3267 1
+44 3268 1
+44 3270 1
+44 3271 1
+44 3273 1
+44 3274 1
+44 3275 1
+44 3277 1
+44 3278 1
+44 3279 1
+44 3280 1
+44 3282 1
+44 3283 1
+44 3284 1
+44 3285 1
+44 3288 1
+44 3289 1
+44 3291 1
+44 3292 1
+44 3294 1
+44 3295 1
+44 3296 1
+44 3298 1
+44 3299 1
+44 3300 1
+44 3301 1
+44 3303 1
+44 3304 1
+44 3305 1
+44 3306 1
+44 3307 1
+44 3309 1
+44 3310 1
+44 3311 1
+44 3312 1
+45 7 1
+45 14 1
+45 20 1
+45 25 1
+45 29 1
+45 32 1
+45 34 1
+45 36 1
+45 42 1
+45 48 1
+45 53 1
+45 57 1
+45 60 1
+45 62 1
+45 64 1
+45 69 1
+45 74 1
+45 78 1
+45 81 1
+45 83 1
+45 85 1
+45 89 1
+45 93 1
+45 96 1
+45 98 1
+45 100 1
+45 103 1
+45 106 1
+45 108 1
+45 110 1
+45 112 1
+45 114 1
+45 116 1
+45 117 1
+45 119 1
+45 120 1
+45 336 1
+45 342 1
+45 347 1
+45 351 1
+45 354 1
+45 356 1
+45 358 1
+45 363 1
+45 368 1
+45 372 1
+45 375 1
+45 377 1
+45 379 1
+45 383 1
+45 387 1
+45 390 1
+45 392 1
+45 394 1
+45 397 1
+45 400 1
+45 402 1
+45 404 1
+45 406 1
+45 408 1
+45 410 1
+45 411 1
+45 413 1
+45 414 1
+45 419 1
+45 424 1
+45 428 1
+45 431 1
+45 433 1
+45 435 1
+45 439 1
+45 443 1
+45 446 1
+45 448 1
+45 450 1
+45 453 1
+45 456 1
+45 458 1
+45 460 1
+45 462 1
+45 464 1
+45 466 1
+45 467 1
+45 469 1
+45 470 1
+45 474 1
+45 478 1
+45 481 1
+45 483 1
+45 485 1
+45 488 1
+45 491 1
+45 493 1
+45 495 1
+45 497 1
+45 499 1
+45 501 1
+45 502 1
+45 504 1
+45 505 1
+45 508 1
+45 511 1
+45 513 1
+45 515 1
+45 517 1
+45 519 1
+45 521 1
+45 522 1
+45 524 1
+45 525 1
+45 527 1
+45 529 1
+45 531 1
+45 532 1
+45 534 1
+45 535 1
+45 536 1
+45 538 1
+45 539 1
+45 540 1
+45 798 1
+45 804 1
+45 809 1
+45 813 1
+45 816 1
+45 818 1
+45 820 1
+45 825 1
+45 830 1
+45 834 1
+45 837 1
+45 839 1
+45 841 1
+45 845 1
+45 849 1
+45 852 1
+45 854 1
+45 856 1
+45 859 1
+45 862 1
+45 864 1
+45 866 1
+45 868 1
+45 870 1
+45 872 1
+45 873 1
+45 875 1
+45 876 1
+45 881 1
+45 886 1
+45 890 1
+45 893 1
+45 895 1
+45 897 1
+45 901 1
+45 905 1
+45 908 1
+45 910 1
+45 912 1
+45 915 1
+45 918 1
+45 920 1
+45 922 1
+45 924 1
+45 926 1
+45 928 1
+45 929 1
+45 931 1
+45 932 1
+45 936 1
+45 940 1
+45 943 1
+45 945 1
+45 947 1
+45 950 1
+45 953 1
+45 955 1
+45 957 1
+45 959 1
+45 961 1
+45 963 1
+45 964 1
+45 966 1
+45 967 1
+45 970 1
+45 973 1
+45 975 1
+45 977 1
+45 979 1
+45 981 1
+45 983 1
+45 984 1
+45 986 1
+45 987 1
+45 989 1
+45 991 1
+45 993 1
+45 994 1
+45 996 1
+45 997 1
+45 998 1
+45 1000 1
+45 1001 1
+45 1002 1
+45 1259 1
+45 1264 1
+45 1268 1
+45 1271 1
+45 1273 1
+45 1275 1
+45 1279 1
+45 1283 1
+45 1286 1
+45 1288 1
+45 1290 1
+45 1293 1
+45 1296 1
+45 1298 1
+45 1300 1
+45 1302 1
+45 1304 1
+45 1306 1
+45 1307 1
+45 1309 1
+45 1310 1
+45 1314 1
+45 1318 1
+45 1321 1
+45 1323 1
+45 1325 1
+45 1328 1
+45 1331 1
+45 1333 1
+45 1335 1
+45 1337 1
+45 1339 1
+45 1341 1
+45 1342 1
+45 1344 1
+45 1345 1
+45 1348 1
+45 1351 1
+45 1353 1
+45 1355 1
+45 1357 1
+45 1359 1
+45 1361 1
+45 1362 1
+45 1364 1
+45 1365 1
+45 1367 1
+45 1369 1
+45 1371 1
+45 1372 1
+45 1374 1
+45 1375 1
+45 1376 1
+45 1378 1
+45 1379 1
+45 1380 1
+45 1384 1
+45 1388 1
+45 1391 1
+45 1393 1
+45 1395 1
+45 1398 1
+45 1401 1
+45 1403 1
+45 1405 1
+45 1407 1
+45 1409 1
+45 1411 1
+45 1412 1
+45 1414 1
+45 1415 1
+45 1418 1
+45 1421 1
+45 1423 1
+45 1425 1
+45 1427 1
+45 1429 1
+45 1431 1
+45 1432 1
+45 1434 1
+45 1435 1
+45 1437 1
+45 1439 1
+45 1441 1
+45 1442 1
+45 1444 1
+45 1445 1
+45 1446 1
+45 1448 1
+45 1449 1
+45 1450 1
+45 1453 1
+45 1456 1
+45 1458 1
+45 1460 1
+45 1462 1
+45 1464 1
+45 1466 1
+45 1467 1
+45 1469 1
+45 1470 1
+45 1472 1
+45 1474 1
+45 1476 1
+45 1477 1
+45 1479 1
+45 1480 1
+45 1481 1
+45 1483 1
+45 1484 1
+45 1485 1
+45 1487 1
+45 1489 1
+45 1491 1
+45 1492 1
+45 1494 1
+45 1495 1
+45 1496 1
+45 1498 1
+45 1499 1
+45 1500 1
+45 1501 1
+45 1503 1
+45 1504 1
+45 1505 1
+45 1506 1
+45 1722 1
+45 1728 1
+45 1733 1
+45 1737 1
+45 1740 1
+45 1742 1
+45 1744 1
+45 1749 1
+45 1754 1
+45 1758 1
+45 1761 1
+45 1763 1
+45 1765 1
+45 1769 1
+45 1773 1
+45 1776 1
+45 1778 1
+45 1780 1
+45 1783 1
+45 1786 1
+45 1788 1
+45 1790 1
+45 1792 1
+45 1794 1
+45 1796 1
+45 1797 1
+45 1799 1
+45 1800 1
+45 1805 1
+45 1810 1
+45 1814 1
+45 1817 1
+45 1819 1
+45 1821 1
+45 1825 1
+45 1829 1
+45 1832 1
+45 1834 1
+45 1836 1
+45 1839 1
+45 1842 1
+45 1844 1
+45 1846 1
+45 1848 1
+45 1850 1
+45 1852 1
+45 1853 1
+45 1855 1
+45 1856 1
+45 1860 1
+45 1864 1
+45 1867 1
+45 1869 1
+45 1871 1
+45 1874 1
+45 1877 1
+45 1879 1
+45 1881 1
+45 1883 1
+45 1885 1
+45 1887 1
+45 1888 1
+45 1890 1
+45 1891 1
+45 1894 1
+45 1897 1
+45 1899 1
+45 1901 1
+45 1903 1
+45 1905 1
+45 1907 1
+45 1908 1
+45 1910 1
+45 1911 1
+45 1913 1
+45 1915 1
+45 1917 1
+45 1918 1
+45 1920 1
+45 1921 1
+45 1922 1
+45 1924 1
+45 1925 1
+45 1926 1
+45 2183 1
+45 2188 1
+45 2192 1
+45 2195 1
+45 2197 1
+45 2199 1
+45 2203 1
+45 2207 1
+45 2210 1
+45 2212 1
+45 2214 1
+45 2217 1
+45 2220 1
+45 2222 1
+45 2224 1
+45 2226 1
+45 2228 1
+45 2230 1
+45 2231 1
+45 2233 1
+45 2234 1
+45 2238 1
+45 2242 1
+45 2245 1
+45 2247 1
+45 2249 1
+45 2252 1
+45 2255 1
+45 2257 1
+45 2259 1
+45 2261 1
+45 2263 1
+45 2265 1
+45 2266 1
+45 2268 1
+45 2269 1
+45 2272 1
+45 2275 1
+45 2277 1
+45 2279 1
+45 2281 1
+45 2283 1
+45 2285 1
+45 2286 1
+45 2288 1
+45 2289 1
+45 2291 1
+45 2293 1
+45 2295 1
+45 2296 1
+45 2298 1
+45 2299 1
+45 2300 1
+45 2302 1
+45 2303 1
+45 2304 1
+45 2308 1
+45 2312 1
+45 2315 1
+45 2317 1
+45 2319 1
+45 2322 1
+45 2325 1
+45 2327 1
+45 2329 1
+45 2331 1
+45 2333 1
+45 2335 1
+45 2336 1
+45 2338 1
+45 2339 1
+45 2342 1
+45 2345 1
+45 2347 1
+45 2349 1
+45 2351 1
+45 2353 1
+45 2355 1
+45 2356 1
+45 2358 1
+45 2359 1
+45 2361 1
+45 2363 1
+45 2365 1
+45 2366 1
+45 2368 1
+45 2369 1
+45 2370 1
+45 2372 1
+45 2373 1
+45 2374 1
+45 2377 1
+45 2380 1
+45 2382 1
+45 2384 1
+45 2386 1
+45 2388 1
+45 2390 1
+45 2391 1
+45 2393 1
+45 2394 1
+45 2396 1
+45 2398 1
+45 2400 1
+45 2401 1
+45 2403 1
+45 2404 1
+45 2405 1
+45 2407 1
+45 2408 1
+45 2409 1
+45 2411 1
+45 2413 1
+45 2415 1
+45 2416 1
+45 2418 1
+45 2419 1
+45 2420 1
+45 2422 1
+45 2423 1
+45 2424 1
+45 2425 1
+45 2427 1
+45 2428 1
+45 2429 1
+45 2430 1
+45 2645 1
+45 2650 1
+45 2654 1
+45 2657 1
+45 2659 1
+45 2661 1
+45 2665 1
+45 2669 1
+45 2672 1
+45 2674 1
+45 2676 1
+45 2679 1
+45 2682 1
+45 2684 1
+45 2686 1
+45 2688 1
+45 2690 1
+45 2692 1
+45 2693 1
+45 2695 1
+45 2696 1
+45 2700 1
+45 2704 1
+45 2707 1
+45 2709 1
+45 2711 1
+45 2714 1
+45 2717 1
+45 2719 1
+45 2721 1
+45 2723 1
+45 2725 1
+45 2727 1
+45 2728 1
+45 2730 1
+45 2731 1
+45 2734 1
+45 2737 1
+45 2739 1
+45 2741 1
+45 2743 1
+45 2745 1
+45 2747 1
+45 2748 1
+45 2750 1
+45 2751 1
+45 2753 1
+45 2755 1
+45 2757 1
+45 2758 1
+45 2760 1
+45 2761 1
+45 2762 1
+45 2764 1
+45 2765 1
+45 2766 1
+45 2770 1
+45 2774 1
+45 2777 1
+45 2779 1
+45 2781 1
+45 2784 1
+45 2787 1
+45 2789 1
+45 2791 1
+45 2793 1
+45 2795 1
+45 2797 1
+45 2798 1
+45 2800 1
+45 2801 1
+45 2804 1
+45 2807 1
+45 2809 1
+45 2811 1
+45 2813 1
+45 2815 1
+45 2817 1
+45 2818 1
+45 2820 1
+45 2821 1
+45 2823 1
+45 2825 1
+45 2827 1
+45 2828 1
+45 2830 1
+45 2831 1
+45 2832 1
+45 2834 1
+45 2835 1
+45 2836 1
+45 2839 1
+45 2842 1
+45 2844 1
+45 2846 1
+45 2848 1
+45 2850 1
+45 2852 1
+45 2853 1
+45 2855 1
+45 2856 1
+45 2858 1
+45 2860 1
+45 2862 1
+45 2863 1
+45 2865 1
+45 2866 1
+45 2867 1
+45 2869 1
+45 2870 1
+45 2871 1
+45 2873 1
+45 2875 1
+45 2877 1
+45 2878 1
+45 2880 1
+45 2881 1
+45 2882 1
+45 2884 1
+45 2885 1
+45 2886 1
+45 2887 1
+45 2889 1
+45 2890 1
+45 2891 1
+45 2892 1
+45 3106 1
+45 3110 1
+45 3113 1
+45 3115 1
+45 3117 1
+45 3120 1
+45 3123 1
+45 3125 1
+45 3127 1
+45 3129 1
+45 3131 1
+45 3133 1
+45 3134 1
+45 3136 1
+45 3137 1
+45 3140 1
+45 3143 1
+45 3145 1
+45 3147 1
+45 3149 1
+45 3151 1
+45 3153 1
+45 3154 1
+45 3156 1
+45 3157 1
+45 3159 1
+45 3161 1
+45 3163 1
+45 3164 1
+45 3166 1
+45 3167 1
+45 3168 1
+45 3170 1
+45 3171 1
+45 3172 1
+45 3175 1
+45 3178 1
+45 3180 1
+45 3182 1
+45 3184 1
+45 3186 1
+45 3188 1
+45 3189 1
+45 3191 1
+45 3192 1
+45 3194 1
+45 3196 1
+45 3198 1
+45 3199 1
+45 3201 1
+45 3202 1
+45 3203 1
+45 3205 1
+45 3206 1
+45 3207 1
+45 3209 1
+45 3211 1
+45 3213 1
+45 3214 1
+45 3216 1
+45 3217 1
+45 3218 1
+45 3220 1
+45 3221 1
+45 3222 1
+45 3223 1
+45 3225 1
+45 3226 1
+45 3227 1
+45 3228 1
+45 3231 1
+45 3234 1
+45 3236 1
+45 3238 1
+45 3240 1
+45 3242 1
+45 3244 1
+45 3245 1
+45 3247 1
+45 3248 1
+45 3250 1
+45 3252 1
+45 3254 1
+45 3255 1
+45 3257 1
+45 3258 1
+45 3259 1
+45 3261 1
+45 3262 1
+45 3263 1
+45 3265 1
+45 3267 1
+45 3269 1
+45 3270 1
+45 3272 1
+45 3273 1
+45 3274 1
+45 3276 1
+45 3277 1
+45 3278 1
+45 3279 1
+45 3281 1
+45 3282 1
+45 3283 1
+45 3284 1
+45 3286 1
+45 3288 1
+45 3290 1
+45 3291 1
+45 3293 1
+45 3294 1
+45 3295 1
+45 3297 1
+45 3298 1
+45 3299 1
+45 3300 1
+45 3302 1
+45 3303 1
+45 3304 1
+45 3305 1
+45 3306 1
+45 3308 1
+45 3309 1
+45 3310 1
+45 3311 1
+45 3312 1
+46 8 1
+46 15 1
+46 21 1
+46 26 1
+46 30 1
+46 33 1
+46 35 1
+46 36 1
+46 43 1
+46 49 1
+46 54 1
+46 58 1
+46 61 1
+46 63 1
+46 64 1
+46 70 1
+46 75 1
+46 79 1
+46 82 1
+46 84 1
+46 85 1
+46 90 1
+46 94 1
+46 97 1
+46 99 1
+46 100 1
+46 104 1
+46 107 1
+46 109 1
+46 110 1
+46 113 1
+46 115 1
+46 116 1
+46 118 1
+46 119 1
+46 120 1
+46 337 1
+46 343 1
+46 348 1
+46 352 1
+46 355 1
+46 357 1
+46 358 1
+46 364 1
+46 369 1
+46 373 1
+46 376 1
+46 378 1
+46 379 1
+46 384 1
+46 388 1
+46 391 1
+46 393 1
+46 394 1
+46 398 1
+46 401 1
+46 403 1
+46 404 1
+46 407 1
+46 409 1
+46 410 1
+46 412 1
+46 413 1
+46 414 1
+46 420 1
+46 425 1
+46 429 1
+46 432 1
+46 434 1
+46 435 1
+46 440 1
+46 444 1
+46 447 1
+46 449 1
+46 450 1
+46 454 1
+46 457 1
+46 459 1
+46 460 1
+46 463 1
+46 465 1
+46 466 1
+46 468 1
+46 469 1
+46 470 1
+46 475 1
+46 479 1
+46 482 1
+46 484 1
+46 485 1
+46 489 1
+46 492 1
+46 494 1
+46 495 1
+46 498 1
+46 500 1
+46 501 1
+46 503 1
+46 504 1
+46 505 1
+46 509 1
+46 512 1
+46 514 1
+46 515 1
+46 518 1
+46 520 1
+46 521 1
+46 523 1
+46 524 1
+46 525 1
+46 528 1
+46 530 1
+46 531 1
+46 533 1
+46 534 1
+46 535 1
+46 537 1
+46 538 1
+46 539 1
+46 540 1
+46 799 1
+46 805 1
+46 810 1
+46 814 1
+46 817 1
+46 819 1
+46 820 1
+46 826 1
+46 831 1
+46 835 1
+46 838 1
+46 840 1
+46 841 1
+46 846 1
+46 850 1
+46 853 1
+46 855 1
+46 856 1
+46 860 1
+46 863 1
+46 865 1
+46 866 1
+46 869 1
+46 871 1
+46 872 1
+46 874 1
+46 875 1
+46 876 1
+46 882 1
+46 887 1
+46 891 1
+46 894 1
+46 896 1
+46 897 1
+46 902 1
+46 906 1
+46 909 1
+46 911 1
+46 912 1
+46 916 1
+46 919 1
+46 921 1
+46 922 1
+46 925 1
+46 927 1
+46 928 1
+46 930 1
+46 931 1
+46 932 1
+46 937 1
+46 941 1
+46 944 1
+46 946 1
+46 947 1
+46 951 1
+46 954 1
+46 956 1
+46 957 1
+46 960 1
+46 962 1
+46 963 1
+46 965 1
+46 966 1
+46 967 1
+46 971 1
+46 974 1
+46 976 1
+46 977 1
+46 980 1
+46 982 1
+46 983 1
+46 985 1
+46 986 1
+46 987 1
+46 990 1
+46 992 1
+46 993 1
+46 995 1
+46 996 1
+46 997 1
+46 999 1
+46 1000 1
+46 1001 1
+46 1002 1
+46 1260 1
+46 1265 1
+46 1269 1
+46 1272 1
+46 1274 1
+46 1275 1
+46 1280 1
+46 1284 1
+46 1287 1
+46 1289 1
+46 1290 1
+46 1294 1
+46 1297 1
+46 1299 1
+46 1300 1
+46 1303 1
+46 1305 1
+46 1306 1
+46 1308 1
+46 1309 1
+46 1310 1
+46 1315 1
+46 1319 1
+46 1322 1
+46 1324 1
+46 1325 1
+46 1329 1
+46 1332 1
+46 1334 1
+46 1335 1
+46 1338 1
+46 1340 1
+46 1341 1
+46 1343 1
+46 1344 1
+46 1345 1
+46 1349 1
+46 1352 1
+46 1354 1
+46 1355 1
+46 1358 1
+46 1360 1
+46 1361 1
+46 1363 1
+46 1364 1
+46 1365 1
+46 1368 1
+46 1370 1
+46 1371 1
+46 1373 1
+46 1374 1
+46 1375 1
+46 1377 1
+46 1378 1
+46 1379 1
+46 1380 1
+46 1385 1
+46 1389 1
+46 1392 1
+46 1394 1
+46 1395 1
+46 1399 1
+46 1402 1
+46 1404 1
+46 1405 1
+46 1408 1
+46 1410 1
+46 1411 1
+46 1413 1
+46 1414 1
+46 1415 1
+46 1419 1
+46 1422 1
+46 1424 1
+46 1425 1
+46 1428 1
+46 1430 1
+46 1431 1
+46 1433 1
+46 1434 1
+46 1435 1
+46 1438 1
+46 1440 1
+46 1441 1
+46 1443 1
+46 1444 1
+46 1445 1
+46 1447 1
+46 1448 1
+46 1449 1
+46 1450 1
+46 1454 1
+46 1457 1
+46 1459 1
+46 1460 1
+46 1463 1
+46 1465 1
+46 1466 1
+46 1468 1
+46 1469 1
+46 1470 1
+46 1473 1
+46 1475 1
+46 1476 1
+46 1478 1
+46 1479 1
+46 1480 1
+46 1482 1
+46 1483 1
+46 1484 1
+46 1485 1
+46 1488 1
+46 1490 1
+46 1491 1
+46 1493 1
+46 1494 1
+46 1495 1
+46 1497 1
+46 1498 1
+46 1499 1
+46 1500 1
+46 1502 1
+46 1503 1
+46 1504 1
+46 1505 1
+46 1506 1
+46 1723 1
+46 1729 1
+46 1734 1
+46 1738 1
+46 1741 1
+46 1743 1
+46 1744 1
+46 1750 1
+46 1755 1
+46 1759 1
+46 1762 1
+46 1764 1
+46 1765 1
+46 1770 1
+46 1774 1
+46 1777 1
+46 1779 1
+46 1780 1
+46 1784 1
+46 1787 1
+46 1789 1
+46 1790 1
+46 1793 1
+46 1795 1
+46 1796 1
+46 1798 1
+46 1799 1
+46 1800 1
+46 1806 1
+46 1811 1
+46 1815 1
+46 1818 1
+46 1820 1
+46 1821 1
+46 1826 1
+46 1830 1
+46 1833 1
+46 1835 1
+46 1836 1
+46 1840 1
+46 1843 1
+46 1845 1
+46 1846 1
+46 1849 1
+46 1851 1
+46 1852 1
+46 1854 1
+46 1855 1
+46 1856 1
+46 1861 1
+46 1865 1
+46 1868 1
+46 1870 1
+46 1871 1
+46 1875 1
+46 1878 1
+46 1880 1
+46 1881 1
+46 1884 1
+46 1886 1
+46 1887 1
+46 1889 1
+46 1890 1
+46 1891 1
+46 1895 1
+46 1898 1
+46 1900 1
+46 1901 1
+46 1904 1
+46 1906 1
+46 1907 1
+46 1909 1
+46 1910 1
+46 1911 1
+46 1914 1
+46 1916 1
+46 1917 1
+46 1919 1
+46 1920 1
+46 1921 1
+46 1923 1
+46 1924 1
+46 1925 1
+46 1926 1
+46 2184 1
+46 2189 1
+46 2193 1
+46 2196 1
+46 2198 1
+46 2199 1
+46 2204 1
+46 2208 1
+46 2211 1
+46 2213 1
+46 2214 1
+46 2218 1
+46 2221 1
+46 2223 1
+46 2224 1
+46 2227 1
+46 2229 1
+46 2230 1
+46 2232 1
+46 2233 1
+46 2234 1
+46 2239 1
+46 2243 1
+46 2246 1
+46 2248 1
+46 2249 1
+46 2253 1
+46 2256 1
+46 2258 1
+46 2259 1
+46 2262 1
+46 2264 1
+46 2265 1
+46 2267 1
+46 2268 1
+46 2269 1
+46 2273 1
+46 2276 1
+46 2278 1
+46 2279 1
+46 2282 1
+46 2284 1
+46 2285 1
+46 2287 1
+46 2288 1
+46 2289 1
+46 2292 1
+46 2294 1
+46 2295 1
+46 2297 1
+46 2298 1
+46 2299 1
+46 2301 1
+46 2302 1
+46 2303 1
+46 2304 1
+46 2309 1
+46 2313 1
+46 2316 1
+46 2318 1
+46 2319 1
+46 2323 1
+46 2326 1
+46 2328 1
+46 2329 1
+46 2332 1
+46 2334 1
+46 2335 1
+46 2337 1
+46 2338 1
+46 2339 1
+46 2343 1
+46 2346 1
+46 2348 1
+46 2349 1
+46 2352 1
+46 2354 1
+46 2355 1
+46 2357 1
+46 2358 1
+46 2359 1
+46 2362 1
+46 2364 1
+46 2365 1
+46 2367 1
+46 2368 1
+46 2369 1
+46 2371 1
+46 2372 1
+46 2373 1
+46 2374 1
+46 2378 1
+46 2381 1
+46 2383 1
+46 2384 1
+46 2387 1
+46 2389 1
+46 2390 1
+46 2392 1
+46 2393 1
+46 2394 1
+46 2397 1
+46 2399 1
+46 2400 1
+46 2402 1
+46 2403 1
+46 2404 1
+46 2406 1
+46 2407 1
+46 2408 1
+46 2409 1
+46 2412 1
+46 2414 1
+46 2415 1
+46 2417 1
+46 2418 1
+46 2419 1
+46 2421 1
+46 2422 1
+46 2423 1
+46 2424 1
+46 2426 1
+46 2427 1
+46 2428 1
+46 2429 1
+46 2430 1
+46 2646 1
+46 2651 1
+46 2655 1
+46 2658 1
+46 2660 1
+46 2661 1
+46 2666 1
+46 2670 1
+46 2673 1
+46 2675 1
+46 2676 1
+46 2680 1
+46 2683 1
+46 2685 1
+46 2686 1
+46 2689 1
+46 2691 1
+46 2692 1
+46 2694 1
+46 2695 1
+46 2696 1
+46 2701 1
+46 2705 1
+46 2708 1
+46 2710 1
+46 2711 1
+46 2715 1
+46 2718 1
+46 2720 1
+46 2721 1
+46 2724 1
+46 2726 1
+46 2727 1
+46 2729 1
+46 2730 1
+46 2731 1
+46 2735 1
+46 2738 1
+46 2740 1
+46 2741 1
+46 2744 1
+46 2746 1
+46 2747 1
+46 2749 1
+46 2750 1
+46 2751 1
+46 2754 1
+46 2756 1
+46 2757 1
+46 2759 1
+46 2760 1
+46 2761 1
+46 2763 1
+46 2764 1
+46 2765 1
+46 2766 1
+46 2771 1
+46 2775 1
+46 2778 1
+46 2780 1
+46 2781 1
+46 2785 1
+46 2788 1
+46 2790 1
+46 2791 1
+46 2794 1
+46 2796 1
+46 2797 1
+46 2799 1
+46 2800 1
+46 2801 1
+46 2805 1
+46 2808 1
+46 2810 1
+46 2811 1
+46 2814 1
+46 2816 1
+46 2817 1
+46 2819 1
+46 2820 1
+46 2821 1
+46 2824 1
+46 2826 1
+46 2827 1
+46 2829 1
+46 2830 1
+46 2831 1
+46 2833 1
+46 2834 1
+46 2835 1
+46 2836 1
+46 2840 1
+46 2843 1
+46 2845 1
+46 2846 1
+46 2849 1
+46 2851 1
+46 2852 1
+46 2854 1
+46 2855 1
+46 2856 1
+46 2859 1
+46 2861 1
+46 2862 1
+46 2864 1
+46 2865 1
+46 2866 1
+46 2868 1
+46 2869 1
+46 2870 1
+46 2871 1
+46 2874 1
+46 2876 1
+46 2877 1
+46 2879 1
+46 2880 1
+46 2881 1
+46 2883 1
+46 2884 1
+46 2885 1
+46 2886 1
+46 2888 1
+46 2889 1
+46 2890 1
+46 2891 1
+46 2892 1
+46 3107 1
+46 3111 1
+46 3114 1
+46 3116 1
+46 3117 1
+46 3121 1
+46 3124 1
+46 3126 1
+46 3127 1
+46 3130 1
+46 3132 1
+46 3133 1
+46 3135 1
+46 3136 1
+46 3137 1
+46 3141 1
+46 3144 1
+46 3146 1
+46 3147 1
+46 3150 1
+46 3152 1
+46 3153 1
+46 3155 1
+46 3156 1
+46 3157 1
+46 3160 1
+46 3162 1
+46 3163 1
+46 3165 1
+46 3166 1
+46 3167 1
+46 3169 1
+46 3170 1
+46 3171 1
+46 3172 1
+46 3176 1
+46 3179 1
+46 3181 1
+46 3182 1
+46 3185 1
+46 3187 1
+46 3188 1
+46 3190 1
+46 3191 1
+46 3192 1
+46 3195 1
+46 3197 1
+46 3198 1
+46 3200 1
+46 3201 1
+46 3202 1
+46 3204 1
+46 3205 1
+46 3206 1
+46 3207 1
+46 3210 1
+46 3212 1
+46 3213 1
+46 3215 1
+46 3216 1
+46 3217 1
+46 3219 1
+46 3220 1
+46 3221 1
+46 3222 1
+46 3224 1
+46 3225 1
+46 3226 1
+46 3227 1
+46 3228 1
+46 3232 1
+46 3235 1
+46 3237 1
+46 3238 1
+46 3241 1
+46 3243 1
+46 3244 1
+46 3246 1
+46 3247 1
+46 3248 1
+46 3251 1
+46 3253 1
+46 3254 1
+46 3256 1
+46 3257 1
+46 3258 1
+46 3260 1
+46 3261 1
+46 3262 1
+46 3263 1
+46 3266 1
+46 3268 1
+46 3269 1
+46 3271 1
+46 3272 1
+46 3273 1
+46 3275 1
+46 3276 1
+46 3277 1
+46 3278 1
+46 3280 1
+46 3281 1
+46 3282 1
+46 3283 1
+46 3284 1
+46 3287 1
+46 3289 1
+46 3290 1
+46 3292 1
+46 3293 1
+46 3294 1
+46 3296 1
+46 3297 1
+46 3298 1
+46 3299 1
+46 3301 1
+46 3302 1
+46 3303 1
+46 3304 1
+46 3305 1
+46 3307 1
+46 3308 1
+46 3309 1
+46 3310 1
+46 3311 1
+46 3312 1
+47 1 1
+47 2 1
+47 3 1
+47 4 1
+47 5 1
+47 6 1
+47 7 1
+47 8 1
+47 121 1
+47 122 1
+47 123 1
+47 124 1
+47 125 1
+47 126 1
+47 127 1
+47 128 1
+47 129 1
+47 130 1
+47 131 1
+47 132 1
+47 133 1
+47 134 1
+47 135 1
+47 136 1
+47 137 1
+47 138 1
+47 139 1
+47 140 1
+47 141 1
+47 142 1
+47 143 1
+47 144 1
+47 145 1
+47 146 1
+47 147 1
+47 148 1
+47 331 1
+47 332 1
+47 333 1
+47 334 1
+47 335 1
+47 336 1
+47 337 1
+47 338 1
+47 339 1
+47 340 1
+47 341 1
+47 342 1
+47 343 1
+47 344 1
+47 345 1
+47 346 1
+47 347 1
+47 348 1
+47 349 1
+47 350 1
+47 351 1
+47 352 1
+47 353 1
+47 354 1
+47 355 1
+47 356 1
+47 357 1
+47 358 1
+47 541 1
+47 542 1
+47 543 1
+47 544 1
+47 545 1
+47 546 1
+47 547 1
+47 548 1
+47 549 1
+47 550 1
+47 551 1
+47 552 1
+47 553 1
+47 554 1
+47 555 1
+47 556 1
+47 557 1
+47 558 1
+47 559 1
+47 560 1
+47 561 1
+47 562 1
+47 563 1
+47 564 1
+47 565 1
+47 566 1
+47 567 1
+47 568 1
+47 569 1
+47 570 1
+47 571 1
+47 572 1
+47 573 1
+47 574 1
+47 575 1
+47 576 1
+47 577 1
+47 578 1
+47 579 1
+47 580 1
+47 581 1
+47 582 1
+47 583 1
+47 584 1
+47 585 1
+47 586 1
+47 587 1
+47 588 1
+47 589 1
+47 590 1
+47 591 1
+47 592 1
+47 593 1
+47 594 1
+47 595 1
+47 596 1
+47 793 1
+47 794 1
+47 795 1
+47 796 1
+47 797 1
+47 798 1
+47 799 1
+47 800 1
+47 801 1
+47 802 1
+47 803 1
+47 804 1
+47 805 1
+47 806 1
+47 807 1
+47 808 1
+47 809 1
+47 810 1
+47 811 1
+47 812 1
+47 813 1
+47 814 1
+47 815 1
+47 816 1
+47 817 1
+47 818 1
+47 819 1
+47 820 1
+47 1003 1
+47 1004 1
+47 1005 1
+47 1006 1
+47 1007 1
+47 1008 1
+47 1009 1
+47 1010 1
+47 1011 1
+47 1012 1
+47 1013 1
+47 1014 1
+47 1015 1
+47 1016 1
+47 1017 1
+47 1018 1
+47 1019 1
+47 1020 1
+47 1021 1
+47 1022 1
+47 1023 1
+47 1024 1
+47 1025 1
+47 1026 1
+47 1027 1
+47 1028 1
+47 1029 1
+47 1030 1
+47 1031 1
+47 1032 1
+47 1033 1
+47 1034 1
+47 1035 1
+47 1036 1
+47 1037 1
+47 1038 1
+47 1039 1
+47 1040 1
+47 1041 1
+47 1042 1
+47 1043 1
+47 1044 1
+47 1045 1
+47 1046 1
+47 1047 1
+47 1048 1
+47 1049 1
+47 1050 1
+47 1051 1
+47 1052 1
+47 1053 1
+47 1054 1
+47 1055 1
+47 1056 1
+47 1057 1
+47 1058 1
+47 1255 1
+47 1256 1
+47 1257 1
+47 1258 1
+47 1259 1
+47 1260 1
+47 1261 1
+47 1262 1
+47 1263 1
+47 1264 1
+47 1265 1
+47 1266 1
+47 1267 1
+47 1268 1
+47 1269 1
+47 1270 1
+47 1271 1
+47 1272 1
+47 1273 1
+47 1274 1
+47 1275 1
+47 1276 1
+47 1277 1
+47 1278 1
+47 1279 1
+47 1280 1
+47 1281 1
+47 1282 1
+47 1283 1
+47 1284 1
+47 1285 1
+47 1286 1
+47 1287 1
+47 1288 1
+47 1289 1
+47 1290 1
+47 1291 1
+47 1292 1
+47 1293 1
+47 1294 1
+47 1295 1
+47 1296 1
+47 1297 1
+47 1298 1
+47 1299 1
+47 1300 1
+47 1301 1
+47 1302 1
+47 1303 1
+47 1304 1
+47 1305 1
+47 1306 1
+47 1307 1
+47 1308 1
+47 1309 1
+47 1310 1
+47 1507 1
+47 1508 1
+47 1509 1
+47 1510 1
+47 1511 1
+47 1512 1
+47 1513 1
+47 1514 1
+47 1515 1
+47 1516 1
+47 1517 1
+47 1518 1
+47 1519 1
+47 1520 1
+47 1521 1
+47 1522 1
+47 1523 1
+47 1524 1
+47 1525 1
+47 1526 1
+47 1527 1
+47 1528 1
+47 1529 1
+47 1530 1
+47 1531 1
+47 1532 1
+47 1533 1
+47 1534 1
+47 1535 1
+47 1536 1
+47 1537 1
+47 1538 1
+47 1539 1
+47 1540 1
+47 1541 1
+47 1542 1
+47 1543 1
+47 1544 1
+47 1545 1
+47 1546 1
+47 1547 1
+47 1548 1
+47 1549 1
+47 1550 1
+47 1551 1
+47 1552 1
+47 1553 1
+47 1554 1
+47 1555 1
+47 1556 1
+47 1557 1
+47 1558 1
+47 1559 1
+47 1560 1
+47 1561 1
+47 1562 1
+47 1563 1
+47 1564 1
+47 1565 1
+47 1566 1
+47 1567 1
+47 1568 1
+47 1569 1
+47 1570 1
+47 1571 1
+47 1572 1
+47 1573 1
+47 1574 1
+47 1575 1
+47 1576 1
+47 1717 1
+47 1718 1
+47 1719 1
+47 1720 1
+47 1721 1
+47 1722 1
+47 1723 1
+47 1724 1
+47 1725 1
+47 1726 1
+47 1727 1
+47 1728 1
+47 1729 1
+47 1730 1
+47 1731 1
+47 1732 1
+47 1733 1
+47 1734 1
+47 1735 1
+47 1736 1
+47 1737 1
+47 1738 1
+47 1739 1
+47 1740 1
+47 1741 1
+47 1742 1
+47 1743 1
+47 1744 1
+47 1927 1
+47 1928 1
+47 1929 1
+47 1930 1
+47 1931 1
+47 1932 1
+47 1933 1
+47 1934 1
+47 1935 1
+47 1936 1
+47 1937 1
+47 1938 1
+47 1939 1
+47 1940 1
+47 1941 1
+47 1942 1
+47 1943 1
+47 1944 1
+47 1945 1
+47 1946 1
+47 1947 1
+47 1948 1
+47 1949 1
+47 1950 1
+47 1951 1
+47 1952 1
+47 1953 1
+47 1954 1
+47 1955 1
+47 1956 1
+47 1957 1
+47 1958 1
+47 1959 1
+47 1960 1
+47 1961 1
+47 1962 1
+47 1963 1
+47 1964 1
+47 1965 1
+47 1966 1
+47 1967 1
+47 1968 1
+47 1969 1
+47 1970 1
+47 1971 1
+47 1972 1
+47 1973 1
+47 1974 1
+47 1975 1
+47 1976 1
+47 1977 1
+47 1978 1
+47 1979 1
+47 1980 1
+47 1981 1
+47 1982 1
+47 2179 1
+47 2180 1
+47 2181 1
+47 2182 1
+47 2183 1
+47 2184 1
+47 2185 1
+47 2186 1
+47 2187 1
+47 2188 1
+47 2189 1
+47 2190 1
+47 2191 1
+47 2192 1
+47 2193 1
+47 2194 1
+47 2195 1
+47 2196 1
+47 2197 1
+47 2198 1
+47 2199 1
+47 2200 1
+47 2201 1
+47 2202 1
+47 2203 1
+47 2204 1
+47 2205 1
+47 2206 1
+47 2207 1
+47 2208 1
+47 2209 1
+47 2210 1
+47 2211 1
+47 2212 1
+47 2213 1
+47 2214 1
+47 2215 1
+47 2216 1
+47 2217 1
+47 2218 1
+47 2219 1
+47 2220 1
+47 2221 1
+47 2222 1
+47 2223 1
+47 2224 1
+47 2225 1
+47 2226 1
+47 2227 1
+47 2228 1
+47 2229 1
+47 2230 1
+47 2231 1
+47 2232 1
+47 2233 1
+47 2234 1
+47 2431 1
+47 2432 1
+47 2433 1
+47 2434 1
+47 2435 1
+47 2436 1
+47 2437 1
+47 2438 1
+47 2439 1
+47 2440 1
+47 2441 1
+47 2442 1
+47 2443 1
+47 2444 1
+47 2445 1
+47 2446 1
+47 2447 1
+47 2448 1
+47 2449 1
+47 2450 1
+47 2451 1
+47 2452 1
+47 2453 1
+47 2454 1
+47 2455 1
+47 2456 1
+47 2457 1
+47 2458 1
+47 2459 1
+47 2460 1
+47 2461 1
+47 2462 1
+47 2463 1
+47 2464 1
+47 2465 1
+47 2466 1
+47 2467 1
+47 2468 1
+47 2469 1
+47 2470 1
+47 2471 1
+47 2472 1
+47 2473 1
+47 2474 1
+47 2475 1
+47 2476 1
+47 2477 1
+47 2478 1
+47 2479 1
+47 2480 1
+47 2481 1
+47 2482 1
+47 2483 1
+47 2484 1
+47 2485 1
+47 2486 1
+47 2487 1
+47 2488 1
+47 2489 1
+47 2490 1
+47 2491 1
+47 2492 1
+47 2493 1
+47 2494 1
+47 2495 1
+47 2496 1
+47 2497 1
+47 2498 1
+47 2499 1
+47 2500 1
+47 2641 1
+47 2642 1
+47 2643 1
+47 2644 1
+47 2645 1
+47 2646 1
+47 2647 1
+47 2648 1
+47 2649 1
+47 2650 1
+47 2651 1
+47 2652 1
+47 2653 1
+47 2654 1
+47 2655 1
+47 2656 1
+47 2657 1
+47 2658 1
+47 2659 1
+47 2660 1
+47 2661 1
+47 2662 1
+47 2663 1
+47 2664 1
+47 2665 1
+47 2666 1
+47 2667 1
+47 2668 1
+47 2669 1
+47 2670 1
+47 2671 1
+47 2672 1
+47 2673 1
+47 2674 1
+47 2675 1
+47 2676 1
+47 2677 1
+47 2678 1
+47 2679 1
+47 2680 1
+47 2681 1
+47 2682 1
+47 2683 1
+47 2684 1
+47 2685 1
+47 2686 1
+47 2687 1
+47 2688 1
+47 2689 1
+47 2690 1
+47 2691 1
+47 2692 1
+47 2693 1
+47 2694 1
+47 2695 1
+47 2696 1
+47 2893 1
+47 2894 1
+47 2895 1
+47 2896 1
+47 2897 1
+47 2898 1
+47 2899 1
+47 2900 1
+47 2901 1
+47 2902 1
+47 2903 1
+47 2904 1
+47 2905 1
+47 2906 1
+47 2907 1
+47 2908 1
+47 2909 1
+47 2910 1
+47 2911 1
+47 2912 1
+47 2913 1
+47 2914 1
+47 2915 1
+47 2916 1
+47 2917 1
+47 2918 1
+47 2919 1
+47 2920 1
+47 2921 1
+47 2922 1
+47 2923 1
+47 2924 1
+47 2925 1
+47 2926 1
+47 2927 1
+47 2928 1
+47 2929 1
+47 2930 1
+47 2931 1
+47 2932 1
+47 2933 1
+47 2934 1
+47 2935 1
+47 2936 1
+47 2937 1
+47 2938 1
+47 2939 1
+47 2940 1
+47 2941 1
+47 2942 1
+47 2943 1
+47 2944 1
+47 2945 1
+47 2946 1
+47 2947 1
+47 2948 1
+47 2949 1
+47 2950 1
+47 2951 1
+47 2952 1
+47 2953 1
+47 2954 1
+47 2955 1
+47 2956 1
+47 2957 1
+47 2958 1
+47 2959 1
+47 2960 1
+47 2961 1
+47 2962 1
+47 3103 1
+47 3104 1
+47 3105 1
+47 3106 1
+47 3107 1
+47 3108 1
+47 3109 1
+47 3110 1
+47 3111 1
+47 3112 1
+47 3113 1
+47 3114 1
+47 3115 1
+47 3116 1
+47 3117 1
+47 3118 1
+47 3119 1
+47 3120 1
+47 3121 1
+47 3122 1
+47 3123 1
+47 3124 1
+47 3125 1
+47 3126 1
+47 3127 1
+47 3128 1
+47 3129 1
+47 3130 1
+47 3131 1
+47 3132 1
+47 3133 1
+47 3134 1
+47 3135 1
+47 3136 1
+47 3137 1
+47 3138 1
+47 3139 1
+47 3140 1
+47 3141 1
+47 3142 1
+47 3143 1
+47 3144 1
+47 3145 1
+47 3146 1
+47 3147 1
+47 3148 1
+47 3149 1
+47 3150 1
+47 3151 1
+47 3152 1
+47 3153 1
+47 3154 1
+47 3155 1
+47 3156 1
+47 3157 1
+47 3158 1
+47 3159 1
+47 3160 1
+47 3161 1
+47 3162 1
+47 3163 1
+47 3164 1
+47 3165 1
+47 3166 1
+47 3167 1
+47 3168 1
+47 3169 1
+47 3170 1
+47 3171 1
+47 3172 1
+47 3313 1
+47 3314 1
+47 3315 1
+47 3316 1
+47 3317 1
+47 3318 1
+47 3319 1
+47 3320 1
+47 3321 1
+47 3322 1
+47 3323 1
+47 3324 1
+47 3325 1
+47 3326 1
+47 3327 1
+47 3328 1
+47 3329 1
+47 3330 1
+47 3331 1
+47 3332 1
+47 3333 1
+47 3334 1
+47 3335 1
+47 3336 1
+47 3337 1
+47 3338 1
+47 3339 1
+47 3340 1
+47 3341 1
+47 3342 1
+47 3343 1
+47 3344 1
+47 3345 1
+47 3346 1
+47 3347 1
+47 3348 1
+47 3349 1
+47 3350 1
+47 3351 1
+47 3352 1
+47 3353 1
+47 3354 1
+47 3355 1
+47 3356 1
+47 3357 1
+47 3358 1
+47 3359 1
+47 3360 1
+47 3361 1
+47 3362 1
+47 3363 1
+47 3364 1
+47 3365 1
+47 3366 1
+47 3367 1
+47 3368 1
+48 1 1
+48 9 1
+48 10 1
+48 11 1
+48 12 1
+48 13 1
+48 14 1
+48 15 1
+48 121 1
+48 122 1
+48 123 1
+48 124 1
+48 125 1
+48 126 1
+48 127 1
+48 149 1
+48 150 1
+48 151 1
+48 152 1
+48 153 1
+48 154 1
+48 155 1
+48 156 1
+48 157 1
+48 158 1
+48 159 1
+48 160 1
+48 161 1
+48 162 1
+48 163 1
+48 164 1
+48 165 1
+48 166 1
+48 167 1
+48 168 1
+48 169 1
+48 331 1
+48 332 1
+48 333 1
+48 334 1
+48 335 1
+48 336 1
+48 337 1
+48 359 1
+48 360 1
+48 361 1
+48 362 1
+48 363 1
+48 364 1
+48 365 1
+48 366 1
+48 367 1
+48 368 1
+48 369 1
+48 370 1
+48 371 1
+48 372 1
+48 373 1
+48 374 1
+48 375 1
+48 376 1
+48 377 1
+48 378 1
+48 379 1
+48 541 1
+48 542 1
+48 543 1
+48 544 1
+48 545 1
+48 546 1
+48 547 1
+48 548 1
+48 549 1
+48 550 1
+48 551 1
+48 552 1
+48 553 1
+48 554 1
+48 555 1
+48 556 1
+48 557 1
+48 558 1
+48 559 1
+48 560 1
+48 561 1
+48 597 1
+48 598 1
+48 599 1
+48 600 1
+48 601 1
+48 602 1
+48 603 1
+48 604 1
+48 605 1
+48 606 1
+48 607 1
+48 608 1
+48 609 1
+48 610 1
+48 611 1
+48 612 1
+48 613 1
+48 614 1
+48 615 1
+48 616 1
+48 617 1
+48 618 1
+48 619 1
+48 620 1
+48 621 1
+48 622 1
+48 623 1
+48 624 1
+48 625 1
+48 626 1
+48 627 1
+48 628 1
+48 629 1
+48 630 1
+48 631 1
+48 793 1
+48 794 1
+48 795 1
+48 796 1
+48 797 1
+48 798 1
+48 799 1
+48 821 1
+48 822 1
+48 823 1
+48 824 1
+48 825 1
+48 826 1
+48 827 1
+48 828 1
+48 829 1
+48 830 1
+48 831 1
+48 832 1
+48 833 1
+48 834 1
+48 835 1
+48 836 1
+48 837 1
+48 838 1
+48 839 1
+48 840 1
+48 841 1
+48 1003 1
+48 1004 1
+48 1005 1
+48 1006 1
+48 1007 1
+48 1008 1
+48 1009 1
+48 1010 1
+48 1011 1
+48 1012 1
+48 1013 1
+48 1014 1
+48 1015 1
+48 1016 1
+48 1017 1
+48 1018 1
+48 1019 1
+48 1020 1
+48 1021 1
+48 1022 1
+48 1023 1
+48 1059 1
+48 1060 1
+48 1061 1
+48 1062 1
+48 1063 1
+48 1064 1
+48 1065 1
+48 1066 1
+48 1067 1
+48 1068 1
+48 1069 1
+48 1070 1
+48 1071 1
+48 1072 1
+48 1073 1
+48 1074 1
+48 1075 1
+48 1076 1
+48 1077 1
+48 1078 1
+48 1079 1
+48 1080 1
+48 1081 1
+48 1082 1
+48 1083 1
+48 1084 1
+48 1085 1
+48 1086 1
+48 1087 1
+48 1088 1
+48 1089 1
+48 1090 1
+48 1091 1
+48 1092 1
+48 1093 1
+48 1255 1
+48 1256 1
+48 1257 1
+48 1258 1
+48 1259 1
+48 1260 1
+48 1261 1
+48 1262 1
+48 1263 1
+48 1264 1
+48 1265 1
+48 1266 1
+48 1267 1
+48 1268 1
+48 1269 1
+48 1270 1
+48 1271 1
+48 1272 1
+48 1273 1
+48 1274 1
+48 1275 1
+48 1311 1
+48 1312 1
+48 1313 1
+48 1314 1
+48 1315 1
+48 1316 1
+48 1317 1
+48 1318 1
+48 1319 1
+48 1320 1
+48 1321 1
+48 1322 1
+48 1323 1
+48 1324 1
+48 1325 1
+48 1326 1
+48 1327 1
+48 1328 1
+48 1329 1
+48 1330 1
+48 1331 1
+48 1332 1
+48 1333 1
+48 1334 1
+48 1335 1
+48 1336 1
+48 1337 1
+48 1338 1
+48 1339 1
+48 1340 1
+48 1341 1
+48 1342 1
+48 1343 1
+48 1344 1
+48 1345 1
+48 1507 1
+48 1508 1
+48 1509 1
+48 1510 1
+48 1511 1
+48 1512 1
+48 1513 1
+48 1514 1
+48 1515 1
+48 1516 1
+48 1517 1
+48 1518 1
+48 1519 1
+48 1520 1
+48 1521 1
+48 1522 1
+48 1523 1
+48 1524 1
+48 1525 1
+48 1526 1
+48 1527 1
+48 1528 1
+48 1529 1
+48 1530 1
+48 1531 1
+48 1532 1
+48 1533 1
+48 1534 1
+48 1535 1
+48 1536 1
+48 1537 1
+48 1538 1
+48 1539 1
+48 1540 1
+48 1541 1
+48 1577 1
+48 1578 1
+48 1579 1
+48 1580 1
+48 1581 1
+48 1582 1
+48 1583 1
+48 1584 1
+48 1585 1
+48 1586 1
+48 1587 1
+48 1588 1
+48 1589 1
+48 1590 1
+48 1591 1
+48 1592 1
+48 1593 1
+48 1594 1
+48 1595 1
+48 1596 1
+48 1597 1
+48 1598 1
+48 1599 1
+48 1600 1
+48 1601 1
+48 1602 1
+48 1603 1
+48 1604 1
+48 1605 1
+48 1606 1
+48 1607 1
+48 1608 1
+48 1609 1
+48 1610 1
+48 1611 1
+48 1717 1
+48 1718 1
+48 1719 1
+48 1720 1
+48 1721 1
+48 1722 1
+48 1723 1
+48 1745 1
+48 1746 1
+48 1747 1
+48 1748 1
+48 1749 1
+48 1750 1
+48 1751 1
+48 1752 1
+48 1753 1
+48 1754 1
+48 1755 1
+48 1756 1
+48 1757 1
+48 1758 1
+48 1759 1
+48 1760 1
+48 1761 1
+48 1762 1
+48 1763 1
+48 1764 1
+48 1765 1
+48 1927 1
+48 1928 1
+48 1929 1
+48 1930 1
+48 1931 1
+48 1932 1
+48 1933 1
+48 1934 1
+48 1935 1
+48 1936 1
+48 1937 1
+48 1938 1
+48 1939 1
+48 1940 1
+48 1941 1
+48 1942 1
+48 1943 1
+48 1944 1
+48 1945 1
+48 1946 1
+48 1947 1
+48 1983 1
+48 1984 1
+48 1985 1
+48 1986 1
+48 1987 1
+48 1988 1
+48 1989 1
+48 1990 1
+48 1991 1
+48 1992 1
+48 1993 1
+48 1994 1
+48 1995 1
+48 1996 1
+48 1997 1
+48 1998 1
+48 1999 1
+48 2000 1
+48 2001 1
+48 2002 1
+48 2003 1
+48 2004 1
+48 2005 1
+48 2006 1
+48 2007 1
+48 2008 1
+48 2009 1
+48 2010 1
+48 2011 1
+48 2012 1
+48 2013 1
+48 2014 1
+48 2015 1
+48 2016 1
+48 2017 1
+48 2179 1
+48 2180 1
+48 2181 1
+48 2182 1
+48 2183 1
+48 2184 1
+48 2185 1
+48 2186 1
+48 2187 1
+48 2188 1
+48 2189 1
+48 2190 1
+48 2191 1
+48 2192 1
+48 2193 1
+48 2194 1
+48 2195 1
+48 2196 1
+48 2197 1
+48 2198 1
+48 2199 1
+48 2235 1
+48 2236 1
+48 2237 1
+48 2238 1
+48 2239 1
+48 2240 1
+48 2241 1
+48 2242 1
+48 2243 1
+48 2244 1
+48 2245 1
+48 2246 1
+48 2247 1
+48 2248 1
+48 2249 1
+48 2250 1
+48 2251 1
+48 2252 1
+48 2253 1
+48 2254 1
+48 2255 1
+48 2256 1
+48 2257 1
+48 2258 1
+48 2259 1
+48 2260 1
+48 2261 1
+48 2262 1
+48 2263 1
+48 2264 1
+48 2265 1
+48 2266 1
+48 2267 1
+48 2268 1
+48 2269 1
+48 2431 1
+48 2432 1
+48 2433 1
+48 2434 1
+48 2435 1
+48 2436 1
+48 2437 1
+48 2438 1
+48 2439 1
+48 2440 1
+48 2441 1
+48 2442 1
+48 2443 1
+48 2444 1
+48 2445 1
+48 2446 1
+48 2447 1
+48 2448 1
+48 2449 1
+48 2450 1
+48 2451 1
+48 2452 1
+48 2453 1
+48 2454 1
+48 2455 1
+48 2456 1
+48 2457 1
+48 2458 1
+48 2459 1
+48 2460 1
+48 2461 1
+48 2462 1
+48 2463 1
+48 2464 1
+48 2465 1
+48 2501 1
+48 2502 1
+48 2503 1
+48 2504 1
+48 2505 1
+48 2506 1
+48 2507 1
+48 2508 1
+48 2509 1
+48 2510 1
+48 2511 1
+48 2512 1
+48 2513 1
+48 2514 1
+48 2515 1
+48 2516 1
+48 2517 1
+48 2518 1
+48 2519 1
+48 2520 1
+48 2521 1
+48 2522 1
+48 2523 1
+48 2524 1
+48 2525 1
+48 2526 1
+48 2527 1
+48 2528 1
+48 2529 1
+48 2530 1
+48 2531 1
+48 2532 1
+48 2533 1
+48 2534 1
+48 2535 1
+48 2641 1
+48 2642 1
+48 2643 1
+48 2644 1
+48 2645 1
+48 2646 1
+48 2647 1
+48 2648 1
+48 2649 1
+48 2650 1
+48 2651 1
+48 2652 1
+48 2653 1
+48 2654 1
+48 2655 1
+48 2656 1
+48 2657 1
+48 2658 1
+48 2659 1
+48 2660 1
+48 2661 1
+48 2697 1
+48 2698 1
+48 2699 1
+48 2700 1
+48 2701 1
+48 2702 1
+48 2703 1
+48 2704 1
+48 2705 1
+48 2706 1
+48 2707 1
+48 2708 1
+48 2709 1
+48 2710 1
+48 2711 1
+48 2712 1
+48 2713 1
+48 2714 1
+48 2715 1
+48 2716 1
+48 2717 1
+48 2718 1
+48 2719 1
+48 2720 1
+48 2721 1
+48 2722 1
+48 2723 1
+48 2724 1
+48 2725 1
+48 2726 1
+48 2727 1
+48 2728 1
+48 2729 1
+48 2730 1
+48 2731 1
+48 2893 1
+48 2894 1
+48 2895 1
+48 2896 1
+48 2897 1
+48 2898 1
+48 2899 1
+48 2900 1
+48 2901 1
+48 2902 1
+48 2903 1
+48 2904 1
+48 2905 1
+48 2906 1
+48 2907 1
+48 2908 1
+48 2909 1
+48 2910 1
+48 2911 1
+48 2912 1
+48 2913 1
+48 2914 1
+48 2915 1
+48 2916 1
+48 2917 1
+48 2918 1
+48 2919 1
+48 2920 1
+48 2921 1
+48 2922 1
+48 2923 1
+48 2924 1
+48 2925 1
+48 2926 1
+48 2927 1
+48 2963 1
+48 2964 1
+48 2965 1
+48 2966 1
+48 2967 1
+48 2968 1
+48 2969 1
+48 2970 1
+48 2971 1
+48 2972 1
+48 2973 1
+48 2974 1
+48 2975 1
+48 2976 1
+48 2977 1
+48 2978 1
+48 2979 1
+48 2980 1
+48 2981 1
+48 2982 1
+48 2983 1
+48 2984 1
+48 2985 1
+48 2986 1
+48 2987 1
+48 2988 1
+48 2989 1
+48 2990 1
+48 2991 1
+48 2992 1
+48 2993 1
+48 2994 1
+48 2995 1
+48 2996 1
+48 2997 1
+48 3103 1
+48 3104 1
+48 3105 1
+48 3106 1
+48 3107 1
+48 3108 1
+48 3109 1
+48 3110 1
+48 3111 1
+48 3112 1
+48 3113 1
+48 3114 1
+48 3115 1
+48 3116 1
+48 3117 1
+48 3118 1
+48 3119 1
+48 3120 1
+48 3121 1
+48 3122 1
+48 3123 1
+48 3124 1
+48 3125 1
+48 3126 1
+48 3127 1
+48 3128 1
+48 3129 1
+48 3130 1
+48 3131 1
+48 3132 1
+48 3133 1
+48 3134 1
+48 3135 1
+48 3136 1
+48 3137 1
+48 3173 1
+48 3174 1
+48 3175 1
+48 3176 1
+48 3177 1
+48 3178 1
+48 3179 1
+48 3180 1
+48 3181 1
+48 3182 1
+48 3183 1
+48 3184 1
+48 3185 1
+48 3186 1
+48 3187 1
+48 3188 1
+48 3189 1
+48 3190 1
+48 3191 1
+48 3192 1
+48 3193 1
+48 3194 1
+48 3195 1
+48 3196 1
+48 3197 1
+48 3198 1
+48 3199 1
+48 3200 1
+48 3201 1
+48 3202 1
+48 3203 1
+48 3204 1
+48 3205 1
+48 3206 1
+48 3207 1
+48 3313 1
+48 3314 1
+48 3315 1
+48 3316 1
+48 3317 1
+48 3318 1
+48 3319 1
+48 3320 1
+48 3321 1
+48 3322 1
+48 3323 1
+48 3324 1
+48 3325 1
+48 3326 1
+48 3327 1
+48 3328 1
+48 3329 1
+48 3330 1
+48 3331 1
+48 3332 1
+48 3333 1
+48 3334 1
+48 3335 1
+48 3336 1
+48 3337 1
+48 3338 1
+48 3339 1
+48 3340 1
+48 3341 1
+48 3342 1
+48 3343 1
+48 3344 1
+48 3345 1
+48 3346 1
+48 3347 1
+48 3369 1
+48 3370 1
+48 3371 1
+48 3372 1
+48 3373 1
+48 3374 1
+48 3375 1
+48 3376 1
+48 3377 1
+48 3378 1
+48 3379 1
+48 3380 1
+48 3381 1
+48 3382 1
+48 3383 1
+48 3384 1
+48 3385 1
+48 3386 1
+48 3387 1
+48 3388 1
+48 3389 1
+49 2 1
+49 9 1
+49 16 1
+49 17 1
+49 18 1
+49 19 1
+49 20 1
+49 21 1
+49 121 1
+49 128 1
+49 129 1
+49 130 1
+49 131 1
+49 132 1
+49 133 1
+49 149 1
+49 150 1
+49 151 1
+49 152 1
+49 153 1
+49 154 1
+49 170 1
+49 171 1
+49 172 1
+49 173 1
+49 174 1
+49 175 1
+49 176 1
+49 177 1
+49 178 1
+49 179 1
+49 180 1
+49 181 1
+49 182 1
+49 183 1
+49 184 1
+49 331 1
+49 338 1
+49 339 1
+49 340 1
+49 341 1
+49 342 1
+49 343 1
+49 359 1
+49 360 1
+49 361 1
+49 362 1
+49 363 1
+49 364 1
+49 380 1
+49 381 1
+49 382 1
+49 383 1
+49 384 1
+49 385 1
+49 386 1
+49 387 1
+49 388 1
+49 389 1
+49 390 1
+49 391 1
+49 392 1
+49 393 1
+49 394 1
+49 541 1
+49 542 1
+49 543 1
+49 544 1
+49 545 1
+49 546 1
+49 562 1
+49 563 1
+49 564 1
+49 565 1
+49 566 1
+49 567 1
+49 568 1
+49 569 1
+49 570 1
+49 571 1
+49 572 1
+49 573 1
+49 574 1
+49 575 1
+49 576 1
+49 597 1
+49 598 1
+49 599 1
+49 600 1
+49 601 1
+49 602 1
+49 603 1
+49 604 1
+49 605 1
+49 606 1
+49 607 1
+49 608 1
+49 609 1
+49 610 1
+49 611 1
+49 632 1
+49 633 1
+49 634 1
+49 635 1
+49 636 1
+49 637 1
+49 638 1
+49 639 1
+49 640 1
+49 641 1
+49 642 1
+49 643 1
+49 644 1
+49 645 1
+49 646 1
+49 647 1
+49 648 1
+49 649 1
+49 650 1
+49 651 1
+49 793 1
+49 800 1
+49 801 1
+49 802 1
+49 803 1
+49 804 1
+49 805 1
+49 821 1
+49 822 1
+49 823 1
+49 824 1
+49 825 1
+49 826 1
+49 842 1
+49 843 1
+49 844 1
+49 845 1
+49 846 1
+49 847 1
+49 848 1
+49 849 1
+49 850 1
+49 851 1
+49 852 1
+49 853 1
+49 854 1
+49 855 1
+49 856 1
+49 1003 1
+49 1004 1
+49 1005 1
+49 1006 1
+49 1007 1
+49 1008 1
+49 1024 1
+49 1025 1
+49 1026 1
+49 1027 1
+49 1028 1
+49 1029 1
+49 1030 1
+49 1031 1
+49 1032 1
+49 1033 1
+49 1034 1
+49 1035 1
+49 1036 1
+49 1037 1
+49 1038 1
+49 1059 1
+49 1060 1
+49 1061 1
+49 1062 1
+49 1063 1
+49 1064 1
+49 1065 1
+49 1066 1
+49 1067 1
+49 1068 1
+49 1069 1
+49 1070 1
+49 1071 1
+49 1072 1
+49 1073 1
+49 1094 1
+49 1095 1
+49 1096 1
+49 1097 1
+49 1098 1
+49 1099 1
+49 1100 1
+49 1101 1
+49 1102 1
+49 1103 1
+49 1104 1
+49 1105 1
+49 1106 1
+49 1107 1
+49 1108 1
+49 1109 1
+49 1110 1
+49 1111 1
+49 1112 1
+49 1113 1
+49 1255 1
+49 1256 1
+49 1257 1
+49 1258 1
+49 1259 1
+49 1260 1
+49 1276 1
+49 1277 1
+49 1278 1
+49 1279 1
+49 1280 1
+49 1281 1
+49 1282 1
+49 1283 1
+49 1284 1
+49 1285 1
+49 1286 1
+49 1287 1
+49 1288 1
+49 1289 1
+49 1290 1
+49 1311 1
+49 1312 1
+49 1313 1
+49 1314 1
+49 1315 1
+49 1316 1
+49 1317 1
+49 1318 1
+49 1319 1
+49 1320 1
+49 1321 1
+49 1322 1
+49 1323 1
+49 1324 1
+49 1325 1
+49 1346 1
+49 1347 1
+49 1348 1
+49 1349 1
+49 1350 1
+49 1351 1
+49 1352 1
+49 1353 1
+49 1354 1
+49 1355 1
+49 1356 1
+49 1357 1
+49 1358 1
+49 1359 1
+49 1360 1
+49 1361 1
+49 1362 1
+49 1363 1
+49 1364 1
+49 1365 1
+49 1507 1
+49 1508 1
+49 1509 1
+49 1510 1
+49 1511 1
+49 1512 1
+49 1513 1
+49 1514 1
+49 1515 1
+49 1516 1
+49 1517 1
+49 1518 1
+49 1519 1
+49 1520 1
+49 1521 1
+49 1542 1
+49 1543 1
+49 1544 1
+49 1545 1
+49 1546 1
+49 1547 1
+49 1548 1
+49 1549 1
+49 1550 1
+49 1551 1
+49 1552 1
+49 1553 1
+49 1554 1
+49 1555 1
+49 1556 1
+49 1557 1
+49 1558 1
+49 1559 1
+49 1560 1
+49 1561 1
+49 1577 1
+49 1578 1
+49 1579 1
+49 1580 1
+49 1581 1
+49 1582 1
+49 1583 1
+49 1584 1
+49 1585 1
+49 1586 1
+49 1587 1
+49 1588 1
+49 1589 1
+49 1590 1
+49 1591 1
+49 1592 1
+49 1593 1
+49 1594 1
+49 1595 1
+49 1596 1
+49 1612 1
+49 1613 1
+49 1614 1
+49 1615 1
+49 1616 1
+49 1617 1
+49 1618 1
+49 1619 1
+49 1620 1
+49 1621 1
+49 1622 1
+49 1623 1
+49 1624 1
+49 1625 1
+49 1626 1
+49 1717 1
+49 1724 1
+49 1725 1
+49 1726 1
+49 1727 1
+49 1728 1
+49 1729 1
+49 1745 1
+49 1746 1
+49 1747 1
+49 1748 1
+49 1749 1
+49 1750 1
+49 1766 1
+49 1767 1
+49 1768 1
+49 1769 1
+49 1770 1
+49 1771 1
+49 1772 1
+49 1773 1
+49 1774 1
+49 1775 1
+49 1776 1
+49 1777 1
+49 1778 1
+49 1779 1
+49 1780 1
+49 1927 1
+49 1928 1
+49 1929 1
+49 1930 1
+49 1931 1
+49 1932 1
+49 1948 1
+49 1949 1
+49 1950 1
+49 1951 1
+49 1952 1
+49 1953 1
+49 1954 1
+49 1955 1
+49 1956 1
+49 1957 1
+49 1958 1
+49 1959 1
+49 1960 1
+49 1961 1
+49 1962 1
+49 1983 1
+49 1984 1
+49 1985 1
+49 1986 1
+49 1987 1
+49 1988 1
+49 1989 1
+49 1990 1
+49 1991 1
+49 1992 1
+49 1993 1
+49 1994 1
+49 1995 1
+49 1996 1
+49 1997 1
+49 2018 1
+49 2019 1
+49 2020 1
+49 2021 1
+49 2022 1
+49 2023 1
+49 2024 1
+49 2025 1
+49 2026 1
+49 2027 1
+49 2028 1
+49 2029 1
+49 2030 1
+49 2031 1
+49 2032 1
+49 2033 1
+49 2034 1
+49 2035 1
+49 2036 1
+49 2037 1
+49 2179 1
+49 2180 1
+49 2181 1
+49 2182 1
+49 2183 1
+49 2184 1
+49 2200 1
+49 2201 1
+49 2202 1
+49 2203 1
+49 2204 1
+49 2205 1
+49 2206 1
+49 2207 1
+49 2208 1
+49 2209 1
+49 2210 1
+49 2211 1
+49 2212 1
+49 2213 1
+49 2214 1
+49 2235 1
+49 2236 1
+49 2237 1
+49 2238 1
+49 2239 1
+49 2240 1
+49 2241 1
+49 2242 1
+49 2243 1
+49 2244 1
+49 2245 1
+49 2246 1
+49 2247 1
+49 2248 1
+49 2249 1
+49 2270 1
+49 2271 1
+49 2272 1
+49 2273 1
+49 2274 1
+49 2275 1
+49 2276 1
+49 2277 1
+49 2278 1
+49 2279 1
+49 2280 1
+49 2281 1
+49 2282 1
+49 2283 1
+49 2284 1
+49 2285 1
+49 2286 1
+49 2287 1
+49 2288 1
+49 2289 1
+49 2431 1
+49 2432 1
+49 2433 1
+49 2434 1
+49 2435 1
+49 2436 1
+49 2437 1
+49 2438 1
+49 2439 1
+49 2440 1
+49 2441 1
+49 2442 1
+49 2443 1
+49 2444 1
+49 2445 1
+49 2466 1
+49 2467 1
+49 2468 1
+49 2469 1
+49 2470 1
+49 2471 1
+49 2472 1
+49 2473 1
+49 2474 1
+49 2475 1
+49 2476 1
+49 2477 1
+49 2478 1
+49 2479 1
+49 2480 1
+49 2481 1
+49 2482 1
+49 2483 1
+49 2484 1
+49 2485 1
+49 2501 1
+49 2502 1
+49 2503 1
+49 2504 1
+49 2505 1
+49 2506 1
+49 2507 1
+49 2508 1
+49 2509 1
+49 2510 1
+49 2511 1
+49 2512 1
+49 2513 1
+49 2514 1
+49 2515 1
+49 2516 1
+49 2517 1
+49 2518 1
+49 2519 1
+49 2520 1
+49 2536 1
+49 2537 1
+49 2538 1
+49 2539 1
+49 2540 1
+49 2541 1
+49 2542 1
+49 2543 1
+49 2544 1
+49 2545 1
+49 2546 1
+49 2547 1
+49 2548 1
+49 2549 1
+49 2550 1
+49 2641 1
+49 2642 1
+49 2643 1
+49 2644 1
+49 2645 1
+49 2646 1
+49 2662 1
+49 2663 1
+49 2664 1
+49 2665 1
+49 2666 1
+49 2667 1
+49 2668 1
+49 2669 1
+49 2670 1
+49 2671 1
+49 2672 1
+49 2673 1
+49 2674 1
+49 2675 1
+49 2676 1
+49 2697 1
+49 2698 1
+49 2699 1
+49 2700 1
+49 2701 1
+49 2702 1
+49 2703 1
+49 2704 1
+49 2705 1
+49 2706 1
+49 2707 1
+49 2708 1
+49 2709 1
+49 2710 1
+49 2711 1
+49 2732 1
+49 2733 1
+49 2734 1
+49 2735 1
+49 2736 1
+49 2737 1
+49 2738 1
+49 2739 1
+49 2740 1
+49 2741 1
+49 2742 1
+49 2743 1
+49 2744 1
+49 2745 1
+49 2746 1
+49 2747 1
+49 2748 1
+49 2749 1
+49 2750 1
+49 2751 1
+49 2893 1
+49 2894 1
+49 2895 1
+49 2896 1
+49 2897 1
+49 2898 1
+49 2899 1
+49 2900 1
+49 2901 1
+49 2902 1
+49 2903 1
+49 2904 1
+49 2905 1
+49 2906 1
+49 2907 1
+49 2928 1
+49 2929 1
+49 2930 1
+49 2931 1
+49 2932 1
+49 2933 1
+49 2934 1
+49 2935 1
+49 2936 1
+49 2937 1
+49 2938 1
+49 2939 1
+49 2940 1
+49 2941 1
+49 2942 1
+49 2943 1
+49 2944 1
+49 2945 1
+49 2946 1
+49 2947 1
+49 2963 1
+49 2964 1
+49 2965 1
+49 2966 1
+49 2967 1
+49 2968 1
+49 2969 1
+49 2970 1
+49 2971 1
+49 2972 1
+49 2973 1
+49 2974 1
+49 2975 1
+49 2976 1
+49 2977 1
+49 2978 1
+49 2979 1
+49 2980 1
+49 2981 1
+49 2982 1
+49 2998 1
+49 2999 1
+49 3000 1
+49 3001 1
+49 3002 1
+49 3003 1
+49 3004 1
+49 3005 1
+49 3006 1
+49 3007 1
+49 3008 1
+49 3009 1
+49 3010 1
+49 3011 1
+49 3012 1
+49 3103 1
+49 3104 1
+49 3105 1
+49 3106 1
+49 3107 1
+49 3108 1
+49 3109 1
+49 3110 1
+49 3111 1
+49 3112 1
+49 3113 1
+49 3114 1
+49 3115 1
+49 3116 1
+49 3117 1
+49 3138 1
+49 3139 1
+49 3140 1
+49 3141 1
+49 3142 1
+49 3143 1
+49 3144 1
+49 3145 1
+49 3146 1
+49 3147 1
+49 3148 1
+49 3149 1
+49 3150 1
+49 3151 1
+49 3152 1
+49 3153 1
+49 3154 1
+49 3155 1
+49 3156 1
+49 3157 1
+49 3173 1
+49 3174 1
+49 3175 1
+49 3176 1
+49 3177 1
+49 3178 1
+49 3179 1
+49 3180 1
+49 3181 1
+49 3182 1
+49 3183 1
+49 3184 1
+49 3185 1
+49 3186 1
+49 3187 1
+49 3188 1
+49 3189 1
+49 3190 1
+49 3191 1
+49 3192 1
+49 3208 1
+49 3209 1
+49 3210 1
+49 3211 1
+49 3212 1
+49 3213 1
+49 3214 1
+49 3215 1
+49 3216 1
+49 3217 1
+49 3218 1
+49 3219 1
+49 3220 1
+49 3221 1
+49 3222 1
+49 3313 1
+49 3314 1
+49 3315 1
+49 3316 1
+49 3317 1
+49 3318 1
+49 3319 1
+49 3320 1
+49 3321 1
+49 3322 1
+49 3323 1
+49 3324 1
+49 3325 1
+49 3326 1
+49 3327 1
+49 3328 1
+49 3329 1
+49 3330 1
+49 3331 1
+49 3332 1
+49 3348 1
+49 3349 1
+49 3350 1
+49 3351 1
+49 3352 1
+49 3353 1
+49 3354 1
+49 3355 1
+49 3356 1
+49 3357 1
+49 3358 1
+49 3359 1
+49 3360 1
+49 3361 1
+49 3362 1
+49 3369 1
+49 3370 1
+49 3371 1
+49 3372 1
+49 3373 1
+49 3374 1
+49 3375 1
+49 3376 1
+49 3377 1
+49 3378 1
+49 3379 1
+49 3380 1
+49 3381 1
+49 3382 1
+49 3383 1
+49 3390 1
+49 3391 1
+49 3392 1
+49 3393 1
+49 3394 1
+49 3395 1
+50 3 1
+50 10 1
+50 16 1
+50 22 1
+50 23 1
+50 24 1
+50 25 1
+50 26 1
+50 122 1
+50 128 1
+50 134 1
+50 135 1
+50 136 1
+50 137 1
+50 138 1
+50 149 1
+50 155 1
+50 156 1
+50 157 1
+50 158 1
+50 159 1
+50 170 1
+50 171 1
+50 172 1
+50 173 1
+50 174 1
+50 185 1
+50 186 1
+50 187 1
+50 188 1
+50 189 1
+50 190 1
+50 191 1
+50 192 1
+50 193 1
+50 194 1
+50 332 1
+50 338 1
+50 344 1
+50 345 1
+50 346 1
+50 347 1
+50 348 1
+50 359 1
+50 365 1
+50 366 1
+50 367 1
+50 368 1
+50 369 1
+50 380 1
+50 381 1
+50 382 1
+50 383 1
+50 384 1
+50 395 1
+50 396 1
+50 397 1
+50 398 1
+50 399 1
+50 400 1
+50 401 1
+50 402 1
+50 403 1
+50 404 1
+50 541 1
+50 547 1
+50 548 1
+50 549 1
+50 550 1
+50 551 1
+50 562 1
+50 563 1
+50 564 1
+50 565 1
+50 566 1
+50 577 1
+50 578 1
+50 579 1
+50 580 1
+50 581 1
+50 582 1
+50 583 1
+50 584 1
+50 585 1
+50 586 1
+50 597 1
+50 598 1
+50 599 1
+50 600 1
+50 601 1
+50 612 1
+50 613 1
+50 614 1
+50 615 1
+50 616 1
+50 617 1
+50 618 1
+50 619 1
+50 620 1
+50 621 1
+50 632 1
+50 633 1
+50 634 1
+50 635 1
+50 636 1
+50 637 1
+50 638 1
+50 639 1
+50 640 1
+50 641 1
+50 652 1
+50 653 1
+50 654 1
+50 655 1
+50 656 1
+50 657 1
+50 658 1
+50 659 1
+50 660 1
+50 661 1
+50 794 1
+50 800 1
+50 806 1
+50 807 1
+50 808 1
+50 809 1
+50 810 1
+50 821 1
+50 827 1
+50 828 1
+50 829 1
+50 830 1
+50 831 1
+50 842 1
+50 843 1
+50 844 1
+50 845 1
+50 846 1
+50 857 1
+50 858 1
+50 859 1
+50 860 1
+50 861 1
+50 862 1
+50 863 1
+50 864 1
+50 865 1
+50 866 1
+50 1003 1
+50 1009 1
+50 1010 1
+50 1011 1
+50 1012 1
+50 1013 1
+50 1024 1
+50 1025 1
+50 1026 1
+50 1027 1
+50 1028 1
+50 1039 1
+50 1040 1
+50 1041 1
+50 1042 1
+50 1043 1
+50 1044 1
+50 1045 1
+50 1046 1
+50 1047 1
+50 1048 1
+50 1059 1
+50 1060 1
+50 1061 1
+50 1062 1
+50 1063 1
+50 1074 1
+50 1075 1
+50 1076 1
+50 1077 1
+50 1078 1
+50 1079 1
+50 1080 1
+50 1081 1
+50 1082 1
+50 1083 1
+50 1094 1
+50 1095 1
+50 1096 1
+50 1097 1
+50 1098 1
+50 1099 1
+50 1100 1
+50 1101 1
+50 1102 1
+50 1103 1
+50 1114 1
+50 1115 1
+50 1116 1
+50 1117 1
+50 1118 1
+50 1119 1
+50 1120 1
+50 1121 1
+50 1122 1
+50 1123 1
+50 1255 1
+50 1261 1
+50 1262 1
+50 1263 1
+50 1264 1
+50 1265 1
+50 1276 1
+50 1277 1
+50 1278 1
+50 1279 1
+50 1280 1
+50 1291 1
+50 1292 1
+50 1293 1
+50 1294 1
+50 1295 1
+50 1296 1
+50 1297 1
+50 1298 1
+50 1299 1
+50 1300 1
+50 1311 1
+50 1312 1
+50 1313 1
+50 1314 1
+50 1315 1
+50 1326 1
+50 1327 1
+50 1328 1
+50 1329 1
+50 1330 1
+50 1331 1
+50 1332 1
+50 1333 1
+50 1334 1
+50 1335 1
+50 1346 1
+50 1347 1
+50 1348 1
+50 1349 1
+50 1350 1
+50 1351 1
+50 1352 1
+50 1353 1
+50 1354 1
+50 1355 1
+50 1366 1
+50 1367 1
+50 1368 1
+50 1369 1
+50 1370 1
+50 1371 1
+50 1372 1
+50 1373 1
+50 1374 1
+50 1375 1
+50 1507 1
+50 1508 1
+50 1509 1
+50 1510 1
+50 1511 1
+50 1522 1
+50 1523 1
+50 1524 1
+50 1525 1
+50 1526 1
+50 1527 1
+50 1528 1
+50 1529 1
+50 1530 1
+50 1531 1
+50 1542 1
+50 1543 1
+50 1544 1
+50 1545 1
+50 1546 1
+50 1547 1
+50 1548 1
+50 1549 1
+50 1550 1
+50 1551 1
+50 1562 1
+50 1563 1
+50 1564 1
+50 1565 1
+50 1566 1
+50 1567 1
+50 1568 1
+50 1569 1
+50 1570 1
+50 1571 1
+50 1577 1
+50 1578 1
+50 1579 1
+50 1580 1
+50 1581 1
+50 1582 1
+50 1583 1
+50 1584 1
+50 1585 1
+50 1586 1
+50 1597 1
+50 1598 1
+50 1599 1
+50 1600 1
+50 1601 1
+50 1602 1
+50 1603 1
+50 1604 1
+50 1605 1
+50 1606 1
+50 1612 1
+50 1613 1
+50 1614 1
+50 1615 1
+50 1616 1
+50 1617 1
+50 1618 1
+50 1619 1
+50 1620 1
+50 1621 1
+50 1627 1
+50 1628 1
+50 1629 1
+50 1630 1
+50 1631 1
+50 1718 1
+50 1724 1
+50 1730 1
+50 1731 1
+50 1732 1
+50 1733 1
+50 1734 1
+50 1745 1
+50 1751 1
+50 1752 1
+50 1753 1
+50 1754 1
+50 1755 1
+50 1766 1
+50 1767 1
+50 1768 1
+50 1769 1
+50 1770 1
+50 1781 1
+50 1782 1
+50 1783 1
+50 1784 1
+50 1785 1
+50 1786 1
+50 1787 1
+50 1788 1
+50 1789 1
+50 1790 1
+50 1927 1
+50 1933 1
+50 1934 1
+50 1935 1
+50 1936 1
+50 1937 1
+50 1948 1
+50 1949 1
+50 1950 1
+50 1951 1
+50 1952 1
+50 1963 1
+50 1964 1
+50 1965 1
+50 1966 1
+50 1967 1
+50 1968 1
+50 1969 1
+50 1970 1
+50 1971 1
+50 1972 1
+50 1983 1
+50 1984 1
+50 1985 1
+50 1986 1
+50 1987 1
+50 1998 1
+50 1999 1
+50 2000 1
+50 2001 1
+50 2002 1
+50 2003 1
+50 2004 1
+50 2005 1
+50 2006 1
+50 2007 1
+50 2018 1
+50 2019 1
+50 2020 1
+50 2021 1
+50 2022 1
+50 2023 1
+50 2024 1
+50 2025 1
+50 2026 1
+50 2027 1
+50 2038 1
+50 2039 1
+50 2040 1
+50 2041 1
+50 2042 1
+50 2043 1
+50 2044 1
+50 2045 1
+50 2046 1
+50 2047 1
+50 2179 1
+50 2185 1
+50 2186 1
+50 2187 1
+50 2188 1
+50 2189 1
+50 2200 1
+50 2201 1
+50 2202 1
+50 2203 1
+50 2204 1
+50 2215 1
+50 2216 1
+50 2217 1
+50 2218 1
+50 2219 1
+50 2220 1
+50 2221 1
+50 2222 1
+50 2223 1
+50 2224 1
+50 2235 1
+50 2236 1
+50 2237 1
+50 2238 1
+50 2239 1
+50 2250 1
+50 2251 1
+50 2252 1
+50 2253 1
+50 2254 1
+50 2255 1
+50 2256 1
+50 2257 1
+50 2258 1
+50 2259 1
+50 2270 1
+50 2271 1
+50 2272 1
+50 2273 1
+50 2274 1
+50 2275 1
+50 2276 1
+50 2277 1
+50 2278 1
+50 2279 1
+50 2290 1
+50 2291 1
+50 2292 1
+50 2293 1
+50 2294 1
+50 2295 1
+50 2296 1
+50 2297 1
+50 2298 1
+50 2299 1
+50 2431 1
+50 2432 1
+50 2433 1
+50 2434 1
+50 2435 1
+50 2446 1
+50 2447 1
+50 2448 1
+50 2449 1
+50 2450 1
+50 2451 1
+50 2452 1
+50 2453 1
+50 2454 1
+50 2455 1
+50 2466 1
+50 2467 1
+50 2468 1
+50 2469 1
+50 2470 1
+50 2471 1
+50 2472 1
+50 2473 1
+50 2474 1
+50 2475 1
+50 2486 1
+50 2487 1
+50 2488 1
+50 2489 1
+50 2490 1
+50 2491 1
+50 2492 1
+50 2493 1
+50 2494 1
+50 2495 1
+50 2501 1
+50 2502 1
+50 2503 1
+50 2504 1
+50 2505 1
+50 2506 1
+50 2507 1
+50 2508 1
+50 2509 1
+50 2510 1
+50 2521 1
+50 2522 1
+50 2523 1
+50 2524 1
+50 2525 1
+50 2526 1
+50 2527 1
+50 2528 1
+50 2529 1
+50 2530 1
+50 2536 1
+50 2537 1
+50 2538 1
+50 2539 1
+50 2540 1
+50 2541 1
+50 2542 1
+50 2543 1
+50 2544 1
+50 2545 1
+50 2551 1
+50 2552 1
+50 2553 1
+50 2554 1
+50 2555 1
+50 2641 1
+50 2647 1
+50 2648 1
+50 2649 1
+50 2650 1
+50 2651 1
+50 2662 1
+50 2663 1
+50 2664 1
+50 2665 1
+50 2666 1
+50 2677 1
+50 2678 1
+50 2679 1
+50 2680 1
+50 2681 1
+50 2682 1
+50 2683 1
+50 2684 1
+50 2685 1
+50 2686 1
+50 2697 1
+50 2698 1
+50 2699 1
+50 2700 1
+50 2701 1
+50 2712 1
+50 2713 1
+50 2714 1
+50 2715 1
+50 2716 1
+50 2717 1
+50 2718 1
+50 2719 1
+50 2720 1
+50 2721 1
+50 2732 1
+50 2733 1
+50 2734 1
+50 2735 1
+50 2736 1
+50 2737 1
+50 2738 1
+50 2739 1
+50 2740 1
+50 2741 1
+50 2752 1
+50 2753 1
+50 2754 1
+50 2755 1
+50 2756 1
+50 2757 1
+50 2758 1
+50 2759 1
+50 2760 1
+50 2761 1
+50 2893 1
+50 2894 1
+50 2895 1
+50 2896 1
+50 2897 1
+50 2908 1
+50 2909 1
+50 2910 1
+50 2911 1
+50 2912 1
+50 2913 1
+50 2914 1
+50 2915 1
+50 2916 1
+50 2917 1
+50 2928 1
+50 2929 1
+50 2930 1
+50 2931 1
+50 2932 1
+50 2933 1
+50 2934 1
+50 2935 1
+50 2936 1
+50 2937 1
+50 2948 1
+50 2949 1
+50 2950 1
+50 2951 1
+50 2952 1
+50 2953 1
+50 2954 1
+50 2955 1
+50 2956 1
+50 2957 1
+50 2963 1
+50 2964 1
+50 2965 1
+50 2966 1
+50 2967 1
+50 2968 1
+50 2969 1
+50 2970 1
+50 2971 1
+50 2972 1
+50 2983 1
+50 2984 1
+50 2985 1
+50 2986 1
+50 2987 1
+50 2988 1
+50 2989 1
+50 2990 1
+50 2991 1
+50 2992 1
+50 2998 1
+50 2999 1
+50 3000 1
+50 3001 1
+50 3002 1
+50 3003 1
+50 3004 1
+50 3005 1
+50 3006 1
+50 3007 1
+50 3013 1
+50 3014 1
+50 3015 1
+50 3016 1
+50 3017 1
+50 3103 1
+50 3104 1
+50 3105 1
+50 3106 1
+50 3107 1
+50 3118 1
+50 3119 1
+50 3120 1
+50 3121 1
+50 3122 1
+50 3123 1
+50 3124 1
+50 3125 1
+50 3126 1
+50 3127 1
+50 3138 1
+50 3139 1
+50 3140 1
+50 3141 1
+50 3142 1
+50 3143 1
+50 3144 1
+50 3145 1
+50 3146 1
+50 3147 1
+50 3158 1
+50 3159 1
+50 3160 1
+50 3161 1
+50 3162 1
+50 3163 1
+50 3164 1
+50 3165 1
+50 3166 1
+50 3167 1
+50 3173 1
+50 3174 1
+50 3175 1
+50 3176 1
+50 3177 1
+50 3178 1
+50 3179 1
+50 3180 1
+50 3181 1
+50 3182 1
+50 3193 1
+50 3194 1
+50 3195 1
+50 3196 1
+50 3197 1
+50 3198 1
+50 3199 1
+50 3200 1
+50 3201 1
+50 3202 1
+50 3208 1
+50 3209 1
+50 3210 1
+50 3211 1
+50 3212 1
+50 3213 1
+50 3214 1
+50 3215 1
+50 3216 1
+50 3217 1
+50 3223 1
+50 3224 1
+50 3225 1
+50 3226 1
+50 3227 1
+50 3313 1
+50 3314 1
+50 3315 1
+50 3316 1
+50 3317 1
+50 3318 1
+50 3319 1
+50 3320 1
+50 3321 1
+50 3322 1
+50 3333 1
+50 3334 1
+50 3335 1
+50 3336 1
+50 3337 1
+50 3338 1
+50 3339 1
+50 3340 1
+50 3341 1
+50 3342 1
+50 3348 1
+50 3349 1
+50 3350 1
+50 3351 1
+50 3352 1
+50 3353 1
+50 3354 1
+50 3355 1
+50 3356 1
+50 3357 1
+50 3363 1
+50 3364 1
+50 3365 1
+50 3366 1
+50 3367 1
+50 3369 1
+50 3370 1
+50 3371 1
+50 3372 1
+50 3373 1
+50 3374 1
+50 3375 1
+50 3376 1
+50 3377 1
+50 3378 1
+50 3384 1
+50 3385 1
+50 3386 1
+50 3387 1
+50 3388 1
+50 3390 1
+50 3391 1
+50 3392 1
+50 3393 1
+50 3394 1
+50 3396 1
+51 4 1
+51 11 1
+51 17 1
+51 22 1
+51 27 1
+51 28 1
+51 29 1
+51 30 1
+51 123 1
+51 129 1
+51 134 1
+51 139 1
+51 140 1
+51 141 1
+51 142 1
+51 150 1
+51 155 1
+51 160 1
+51 161 1
+51 162 1
+51 163 1
+51 170 1
+51 175 1
+51 176 1
+51 177 1
+51 178 1
+51 185 1
+51 186 1
+51 187 1
+51 188 1
+51 195 1
+51 196 1
+51 197 1
+51 198 1
+51 199 1
+51 200 1
+51 333 1
+51 339 1
+51 344 1
+51 349 1
+51 350 1
+51 351 1
+51 352 1
+51 360 1
+51 365 1
+51 370 1
+51 371 1
+51 372 1
+51 373 1
+51 380 1
+51 385 1
+51 386 1
+51 387 1
+51 388 1
+51 395 1
+51 396 1
+51 397 1
+51 398 1
+51 405 1
+51 406 1
+51 407 1
+51 408 1
+51 409 1
+51 410 1
+51 542 1
+51 547 1
+51 552 1
+51 553 1
+51 554 1
+51 555 1
+51 562 1
+51 567 1
+51 568 1
+51 569 1
+51 570 1
+51 577 1
+51 578 1
+51 579 1
+51 580 1
+51 587 1
+51 588 1
+51 589 1
+51 590 1
+51 591 1
+51 592 1
+51 597 1
+51 602 1
+51 603 1
+51 604 1
+51 605 1
+51 612 1
+51 613 1
+51 614 1
+51 615 1
+51 622 1
+51 623 1
+51 624 1
+51 625 1
+51 626 1
+51 627 1
+51 632 1
+51 633 1
+51 634 1
+51 635 1
+51 642 1
+51 643 1
+51 644 1
+51 645 1
+51 646 1
+51 647 1
+51 652 1
+51 653 1
+51 654 1
+51 655 1
+51 656 1
+51 657 1
+51 662 1
+51 663 1
+51 664 1
+51 665 1
+51 795 1
+51 801 1
+51 806 1
+51 811 1
+51 812 1
+51 813 1
+51 814 1
+51 822 1
+51 827 1
+51 832 1
+51 833 1
+51 834 1
+51 835 1
+51 842 1
+51 847 1
+51 848 1
+51 849 1
+51 850 1
+51 857 1
+51 858 1
+51 859 1
+51 860 1
+51 867 1
+51 868 1
+51 869 1
+51 870 1
+51 871 1
+51 872 1
+51 1004 1
+51 1009 1
+51 1014 1
+51 1015 1
+51 1016 1
+51 1017 1
+51 1024 1
+51 1029 1
+51 1030 1
+51 1031 1
+51 1032 1
+51 1039 1
+51 1040 1
+51 1041 1
+51 1042 1
+51 1049 1
+51 1050 1
+51 1051 1
+51 1052 1
+51 1053 1
+51 1054 1
+51 1059 1
+51 1064 1
+51 1065 1
+51 1066 1
+51 1067 1
+51 1074 1
+51 1075 1
+51 1076 1
+51 1077 1
+51 1084 1
+51 1085 1
+51 1086 1
+51 1087 1
+51 1088 1
+51 1089 1
+51 1094 1
+51 1095 1
+51 1096 1
+51 1097 1
+51 1104 1
+51 1105 1
+51 1106 1
+51 1107 1
+51 1108 1
+51 1109 1
+51 1114 1
+51 1115 1
+51 1116 1
+51 1117 1
+51 1118 1
+51 1119 1
+51 1124 1
+51 1125 1
+51 1126 1
+51 1127 1
+51 1256 1
+51 1261 1
+51 1266 1
+51 1267 1
+51 1268 1
+51 1269 1
+51 1276 1
+51 1281 1
+51 1282 1
+51 1283 1
+51 1284 1
+51 1291 1
+51 1292 1
+51 1293 1
+51 1294 1
+51 1301 1
+51 1302 1
+51 1303 1
+51 1304 1
+51 1305 1
+51 1306 1
+51 1311 1
+51 1316 1
+51 1317 1
+51 1318 1
+51 1319 1
+51 1326 1
+51 1327 1
+51 1328 1
+51 1329 1
+51 1336 1
+51 1337 1
+51 1338 1
+51 1339 1
+51 1340 1
+51 1341 1
+51 1346 1
+51 1347 1
+51 1348 1
+51 1349 1
+51 1356 1
+51 1357 1
+51 1358 1
+51 1359 1
+51 1360 1
+51 1361 1
+51 1366 1
+51 1367 1
+51 1368 1
+51 1369 1
+51 1370 1
+51 1371 1
+51 1376 1
+51 1377 1
+51 1378 1
+51 1379 1
+51 1507 1
+51 1512 1
+51 1513 1
+51 1514 1
+51 1515 1
+51 1522 1
+51 1523 1
+51 1524 1
+51 1525 1
+51 1532 1
+51 1533 1
+51 1534 1
+51 1535 1
+51 1536 1
+51 1537 1
+51 1542 1
+51 1543 1
+51 1544 1
+51 1545 1
+51 1552 1
+51 1553 1
+51 1554 1
+51 1555 1
+51 1556 1
+51 1557 1
+51 1562 1
+51 1563 1
+51 1564 1
+51 1565 1
+51 1566 1
+51 1567 1
+51 1572 1
+51 1573 1
+51 1574 1
+51 1575 1
+51 1577 1
+51 1578 1
+51 1579 1
+51 1580 1
+51 1587 1
+51 1588 1
+51 1589 1
+51 1590 1
+51 1591 1
+51 1592 1
+51 1597 1
+51 1598 1
+51 1599 1
+51 1600 1
+51 1601 1
+51 1602 1
+51 1607 1
+51 1608 1
+51 1609 1
+51 1610 1
+51 1612 1
+51 1613 1
+51 1614 1
+51 1615 1
+51 1616 1
+51 1617 1
+51 1622 1
+51 1623 1
+51 1624 1
+51 1625 1
+51 1627 1
+51 1628 1
+51 1629 1
+51 1630 1
+51 1632 1
+51 1719 1
+51 1725 1
+51 1730 1
+51 1735 1
+51 1736 1
+51 1737 1
+51 1738 1
+51 1746 1
+51 1751 1
+51 1756 1
+51 1757 1
+51 1758 1
+51 1759 1
+51 1766 1
+51 1771 1
+51 1772 1
+51 1773 1
+51 1774 1
+51 1781 1
+51 1782 1
+51 1783 1
+51 1784 1
+51 1791 1
+51 1792 1
+51 1793 1
+51 1794 1
+51 1795 1
+51 1796 1
+51 1928 1
+51 1933 1
+51 1938 1
+51 1939 1
+51 1940 1
+51 1941 1
+51 1948 1
+51 1953 1
+51 1954 1
+51 1955 1
+51 1956 1
+51 1963 1
+51 1964 1
+51 1965 1
+51 1966 1
+51 1973 1
+51 1974 1
+51 1975 1
+51 1976 1
+51 1977 1
+51 1978 1
+51 1983 1
+51 1988 1
+51 1989 1
+51 1990 1
+51 1991 1
+51 1998 1
+51 1999 1
+51 2000 1
+51 2001 1
+51 2008 1
+51 2009 1
+51 2010 1
+51 2011 1
+51 2012 1
+51 2013 1
+51 2018 1
+51 2019 1
+51 2020 1
+51 2021 1
+51 2028 1
+51 2029 1
+51 2030 1
+51 2031 1
+51 2032 1
+51 2033 1
+51 2038 1
+51 2039 1
+51 2040 1
+51 2041 1
+51 2042 1
+51 2043 1
+51 2048 1
+51 2049 1
+51 2050 1
+51 2051 1
+51 2180 1
+51 2185 1
+51 2190 1
+51 2191 1
+51 2192 1
+51 2193 1
+51 2200 1
+51 2205 1
+51 2206 1
+51 2207 1
+51 2208 1
+51 2215 1
+51 2216 1
+51 2217 1
+51 2218 1
+51 2225 1
+51 2226 1
+51 2227 1
+51 2228 1
+51 2229 1
+51 2230 1
+51 2235 1
+51 2240 1
+51 2241 1
+51 2242 1
+51 2243 1
+51 2250 1
+51 2251 1
+51 2252 1
+51 2253 1
+51 2260 1
+51 2261 1
+51 2262 1
+51 2263 1
+51 2264 1
+51 2265 1
+51 2270 1
+51 2271 1
+51 2272 1
+51 2273 1
+51 2280 1
+51 2281 1
+51 2282 1
+51 2283 1
+51 2284 1
+51 2285 1
+51 2290 1
+51 2291 1
+51 2292 1
+51 2293 1
+51 2294 1
+51 2295 1
+51 2300 1
+51 2301 1
+51 2302 1
+51 2303 1
+51 2431 1
+51 2436 1
+51 2437 1
+51 2438 1
+51 2439 1
+51 2446 1
+51 2447 1
+51 2448 1
+51 2449 1
+51 2456 1
+51 2457 1
+51 2458 1
+51 2459 1
+51 2460 1
+51 2461 1
+51 2466 1
+51 2467 1
+51 2468 1
+51 2469 1
+51 2476 1
+51 2477 1
+51 2478 1
+51 2479 1
+51 2480 1
+51 2481 1
+51 2486 1
+51 2487 1
+51 2488 1
+51 2489 1
+51 2490 1
+51 2491 1
+51 2496 1
+51 2497 1
+51 2498 1
+51 2499 1
+51 2501 1
+51 2502 1
+51 2503 1
+51 2504 1
+51 2511 1
+51 2512 1
+51 2513 1
+51 2514 1
+51 2515 1
+51 2516 1
+51 2521 1
+51 2522 1
+51 2523 1
+51 2524 1
+51 2525 1
+51 2526 1
+51 2531 1
+51 2532 1
+51 2533 1
+51 2534 1
+51 2536 1
+51 2537 1
+51 2538 1
+51 2539 1
+51 2540 1
+51 2541 1
+51 2546 1
+51 2547 1
+51 2548 1
+51 2549 1
+51 2551 1
+51 2552 1
+51 2553 1
+51 2554 1
+51 2556 1
+51 2642 1
+51 2647 1
+51 2652 1
+51 2653 1
+51 2654 1
+51 2655 1
+51 2662 1
+51 2667 1
+51 2668 1
+51 2669 1
+51 2670 1
+51 2677 1
+51 2678 1
+51 2679 1
+51 2680 1
+51 2687 1
+51 2688 1
+51 2689 1
+51 2690 1
+51 2691 1
+51 2692 1
+51 2697 1
+51 2702 1
+51 2703 1
+51 2704 1
+51 2705 1
+51 2712 1
+51 2713 1
+51 2714 1
+51 2715 1
+51 2722 1
+51 2723 1
+51 2724 1
+51 2725 1
+51 2726 1
+51 2727 1
+51 2732 1
+51 2733 1
+51 2734 1
+51 2735 1
+51 2742 1
+51 2743 1
+51 2744 1
+51 2745 1
+51 2746 1
+51 2747 1
+51 2752 1
+51 2753 1
+51 2754 1
+51 2755 1
+51 2756 1
+51 2757 1
+51 2762 1
+51 2763 1
+51 2764 1
+51 2765 1
+51 2893 1
+51 2898 1
+51 2899 1
+51 2900 1
+51 2901 1
+51 2908 1
+51 2909 1
+51 2910 1
+51 2911 1
+51 2918 1
+51 2919 1
+51 2920 1
+51 2921 1
+51 2922 1
+51 2923 1
+51 2928 1
+51 2929 1
+51 2930 1
+51 2931 1
+51 2938 1
+51 2939 1
+51 2940 1
+51 2941 1
+51 2942 1
+51 2943 1
+51 2948 1
+51 2949 1
+51 2950 1
+51 2951 1
+51 2952 1
+51 2953 1
+51 2958 1
+51 2959 1
+51 2960 1
+51 2961 1
+51 2963 1
+51 2964 1
+51 2965 1
+51 2966 1
+51 2973 1
+51 2974 1
+51 2975 1
+51 2976 1
+51 2977 1
+51 2978 1
+51 2983 1
+51 2984 1
+51 2985 1
+51 2986 1
+51 2987 1
+51 2988 1
+51 2993 1
+51 2994 1
+51 2995 1
+51 2996 1
+51 2998 1
+51 2999 1
+51 3000 1
+51 3001 1
+51 3002 1
+51 3003 1
+51 3008 1
+51 3009 1
+51 3010 1
+51 3011 1
+51 3013 1
+51 3014 1
+51 3015 1
+51 3016 1
+51 3018 1
+51 3103 1
+51 3108 1
+51 3109 1
+51 3110 1
+51 3111 1
+51 3118 1
+51 3119 1
+51 3120 1
+51 3121 1
+51 3128 1
+51 3129 1
+51 3130 1
+51 3131 1
+51 3132 1
+51 3133 1
+51 3138 1
+51 3139 1
+51 3140 1
+51 3141 1
+51 3148 1
+51 3149 1
+51 3150 1
+51 3151 1
+51 3152 1
+51 3153 1
+51 3158 1
+51 3159 1
+51 3160 1
+51 3161 1
+51 3162 1
+51 3163 1
+51 3168 1
+51 3169 1
+51 3170 1
+51 3171 1
+51 3173 1
+51 3174 1
+51 3175 1
+51 3176 1
+51 3183 1
+51 3184 1
+51 3185 1
+51 3186 1
+51 3187 1
+51 3188 1
+51 3193 1
+51 3194 1
+51 3195 1
+51 3196 1
+51 3197 1
+51 3198 1
+51 3203 1
+51 3204 1
+51 3205 1
+51 3206 1
+51 3208 1
+51 3209 1
+51 3210 1
+51 3211 1
+51 3212 1
+51 3213 1
+51 3218 1
+51 3219 1
+51 3220 1
+51 3221 1
+51 3223 1
+51 3224 1
+51 3225 1
+51 3226 1
+51 3228 1
+51 3313 1
+51 3314 1
+51 3315 1
+51 3316 1
+51 3323 1
+51 3324 1
+51 3325 1
+51 3326 1
+51 3327 1
+51 3328 1
+51 3333 1
+51 3334 1
+51 3335 1
+51 3336 1
+51 3337 1
+51 3338 1
+51 3343 1
+51 3344 1
+51 3345 1
+51 3346 1
+51 3348 1
+51 3349 1
+51 3350 1
+51 3351 1
+51 3352 1
+51 3353 1
+51 3358 1
+51 3359 1
+51 3360 1
+51 3361 1
+51 3363 1
+51 3364 1
+51 3365 1
+51 3366 1
+51 3368 1
+51 3369 1
+51 3370 1
+51 3371 1
+51 3372 1
+51 3373 1
+51 3374 1
+51 3379 1
+51 3380 1
+51 3381 1
+51 3382 1
+51 3384 1
+51 3385 1
+51 3386 1
+51 3387 1
+51 3389 1
+51 3390 1
+51 3391 1
+51 3392 1
+51 3393 1
+51 3395 1
+51 3396 1
+52 5 1
+52 12 1
+52 18 1
+52 23 1
+52 27 1
+52 31 1
+52 32 1
+52 33 1
+52 124 1
+52 130 1
+52 135 1
+52 139 1
+52 143 1
+52 144 1
+52 145 1
+52 151 1
+52 156 1
+52 160 1
+52 164 1
+52 165 1
+52 166 1
+52 171 1
+52 175 1
+52 179 1
+52 180 1
+52 181 1
+52 185 1
+52 189 1
+52 190 1
+52 191 1
+52 195 1
+52 196 1
+52 197 1
+52 201 1
+52 202 1
+52 203 1
+52 334 1
+52 340 1
+52 345 1
+52 349 1
+52 353 1
+52 354 1
+52 355 1
+52 361 1
+52 366 1
+52 370 1
+52 374 1
+52 375 1
+52 376 1
+52 381 1
+52 385 1
+52 389 1
+52 390 1
+52 391 1
+52 395 1
+52 399 1
+52 400 1
+52 401 1
+52 405 1
+52 406 1
+52 407 1
+52 411 1
+52 412 1
+52 413 1
+52 543 1
+52 548 1
+52 552 1
+52 556 1
+52 557 1
+52 558 1
+52 563 1
+52 567 1
+52 571 1
+52 572 1
+52 573 1
+52 577 1
+52 581 1
+52 582 1
+52 583 1
+52 587 1
+52 588 1
+52 589 1
+52 593 1
+52 594 1
+52 595 1
+52 598 1
+52 602 1
+52 606 1
+52 607 1
+52 608 1
+52 612 1
+52 616 1
+52 617 1
+52 618 1
+52 622 1
+52 623 1
+52 624 1
+52 628 1
+52 629 1
+52 630 1
+52 632 1
+52 636 1
+52 637 1
+52 638 1
+52 642 1
+52 643 1
+52 644 1
+52 648 1
+52 649 1
+52 650 1
+52 652 1
+52 653 1
+52 654 1
+52 658 1
+52 659 1
+52 660 1
+52 662 1
+52 663 1
+52 664 1
+52 666 1
+52 796 1
+52 802 1
+52 807 1
+52 811 1
+52 815 1
+52 816 1
+52 817 1
+52 823 1
+52 828 1
+52 832 1
+52 836 1
+52 837 1
+52 838 1
+52 843 1
+52 847 1
+52 851 1
+52 852 1
+52 853 1
+52 857 1
+52 861 1
+52 862 1
+52 863 1
+52 867 1
+52 868 1
+52 869 1
+52 873 1
+52 874 1
+52 875 1
+52 1005 1
+52 1010 1
+52 1014 1
+52 1018 1
+52 1019 1
+52 1020 1
+52 1025 1
+52 1029 1
+52 1033 1
+52 1034 1
+52 1035 1
+52 1039 1
+52 1043 1
+52 1044 1
+52 1045 1
+52 1049 1
+52 1050 1
+52 1051 1
+52 1055 1
+52 1056 1
+52 1057 1
+52 1060 1
+52 1064 1
+52 1068 1
+52 1069 1
+52 1070 1
+52 1074 1
+52 1078 1
+52 1079 1
+52 1080 1
+52 1084 1
+52 1085 1
+52 1086 1
+52 1090 1
+52 1091 1
+52 1092 1
+52 1094 1
+52 1098 1
+52 1099 1
+52 1100 1
+52 1104 1
+52 1105 1
+52 1106 1
+52 1110 1
+52 1111 1
+52 1112 1
+52 1114 1
+52 1115 1
+52 1116 1
+52 1120 1
+52 1121 1
+52 1122 1
+52 1124 1
+52 1125 1
+52 1126 1
+52 1128 1
+52 1257 1
+52 1262 1
+52 1266 1
+52 1270 1
+52 1271 1
+52 1272 1
+52 1277 1
+52 1281 1
+52 1285 1
+52 1286 1
+52 1287 1
+52 1291 1
+52 1295 1
+52 1296 1
+52 1297 1
+52 1301 1
+52 1302 1
+52 1303 1
+52 1307 1
+52 1308 1
+52 1309 1
+52 1312 1
+52 1316 1
+52 1320 1
+52 1321 1
+52 1322 1
+52 1326 1
+52 1330 1
+52 1331 1
+52 1332 1
+52 1336 1
+52 1337 1
+52 1338 1
+52 1342 1
+52 1343 1
+52 1344 1
+52 1346 1
+52 1350 1
+52 1351 1
+52 1352 1
+52 1356 1
+52 1357 1
+52 1358 1
+52 1362 1
+52 1363 1
+52 1364 1
+52 1366 1
+52 1367 1
+52 1368 1
+52 1372 1
+52 1373 1
+52 1374 1
+52 1376 1
+52 1377 1
+52 1378 1
+52 1380 1
+52 1508 1
+52 1512 1
+52 1516 1
+52 1517 1
+52 1518 1
+52 1522 1
+52 1526 1
+52 1527 1
+52 1528 1
+52 1532 1
+52 1533 1
+52 1534 1
+52 1538 1
+52 1539 1
+52 1540 1
+52 1542 1
+52 1546 1
+52 1547 1
+52 1548 1
+52 1552 1
+52 1553 1
+52 1554 1
+52 1558 1
+52 1559 1
+52 1560 1
+52 1562 1
+52 1563 1
+52 1564 1
+52 1568 1
+52 1569 1
+52 1570 1
+52 1572 1
+52 1573 1
+52 1574 1
+52 1576 1
+52 1577 1
+52 1581 1
+52 1582 1
+52 1583 1
+52 1587 1
+52 1588 1
+52 1589 1
+52 1593 1
+52 1594 1
+52 1595 1
+52 1597 1
+52 1598 1
+52 1599 1
+52 1603 1
+52 1604 1
+52 1605 1
+52 1607 1
+52 1608 1
+52 1609 1
+52 1611 1
+52 1612 1
+52 1613 1
+52 1614 1
+52 1618 1
+52 1619 1
+52 1620 1
+52 1622 1
+52 1623 1
+52 1624 1
+52 1626 1
+52 1627 1
+52 1628 1
+52 1629 1
+52 1631 1
+52 1632 1
+52 1720 1
+52 1726 1
+52 1731 1
+52 1735 1
+52 1739 1
+52 1740 1
+52 1741 1
+52 1747 1
+52 1752 1
+52 1756 1
+52 1760 1
+52 1761 1
+52 1762 1
+52 1767 1
+52 1771 1
+52 1775 1
+52 1776 1
+52 1777 1
+52 1781 1
+52 1785 1
+52 1786 1
+52 1787 1
+52 1791 1
+52 1792 1
+52 1793 1
+52 1797 1
+52 1798 1
+52 1799 1
+52 1929 1
+52 1934 1
+52 1938 1
+52 1942 1
+52 1943 1
+52 1944 1
+52 1949 1
+52 1953 1
+52 1957 1
+52 1958 1
+52 1959 1
+52 1963 1
+52 1967 1
+52 1968 1
+52 1969 1
+52 1973 1
+52 1974 1
+52 1975 1
+52 1979 1
+52 1980 1
+52 1981 1
+52 1984 1
+52 1988 1
+52 1992 1
+52 1993 1
+52 1994 1
+52 1998 1
+52 2002 1
+52 2003 1
+52 2004 1
+52 2008 1
+52 2009 1
+52 2010 1
+52 2014 1
+52 2015 1
+52 2016 1
+52 2018 1
+52 2022 1
+52 2023 1
+52 2024 1
+52 2028 1
+52 2029 1
+52 2030 1
+52 2034 1
+52 2035 1
+52 2036 1
+52 2038 1
+52 2039 1
+52 2040 1
+52 2044 1
+52 2045 1
+52 2046 1
+52 2048 1
+52 2049 1
+52 2050 1
+52 2052 1
+52 2181 1
+52 2186 1
+52 2190 1
+52 2194 1
+52 2195 1
+52 2196 1
+52 2201 1
+52 2205 1
+52 2209 1
+52 2210 1
+52 2211 1
+52 2215 1
+52 2219 1
+52 2220 1
+52 2221 1
+52 2225 1
+52 2226 1
+52 2227 1
+52 2231 1
+52 2232 1
+52 2233 1
+52 2236 1
+52 2240 1
+52 2244 1
+52 2245 1
+52 2246 1
+52 2250 1
+52 2254 1
+52 2255 1
+52 2256 1
+52 2260 1
+52 2261 1
+52 2262 1
+52 2266 1
+52 2267 1
+52 2268 1
+52 2270 1
+52 2274 1
+52 2275 1
+52 2276 1
+52 2280 1
+52 2281 1
+52 2282 1
+52 2286 1
+52 2287 1
+52 2288 1
+52 2290 1
+52 2291 1
+52 2292 1
+52 2296 1
+52 2297 1
+52 2298 1
+52 2300 1
+52 2301 1
+52 2302 1
+52 2304 1
+52 2432 1
+52 2436 1
+52 2440 1
+52 2441 1
+52 2442 1
+52 2446 1
+52 2450 1
+52 2451 1
+52 2452 1
+52 2456 1
+52 2457 1
+52 2458 1
+52 2462 1
+52 2463 1
+52 2464 1
+52 2466 1
+52 2470 1
+52 2471 1
+52 2472 1
+52 2476 1
+52 2477 1
+52 2478 1
+52 2482 1
+52 2483 1
+52 2484 1
+52 2486 1
+52 2487 1
+52 2488 1
+52 2492 1
+52 2493 1
+52 2494 1
+52 2496 1
+52 2497 1
+52 2498 1
+52 2500 1
+52 2501 1
+52 2505 1
+52 2506 1
+52 2507 1
+52 2511 1
+52 2512 1
+52 2513 1
+52 2517 1
+52 2518 1
+52 2519 1
+52 2521 1
+52 2522 1
+52 2523 1
+52 2527 1
+52 2528 1
+52 2529 1
+52 2531 1
+52 2532 1
+52 2533 1
+52 2535 1
+52 2536 1
+52 2537 1
+52 2538 1
+52 2542 1
+52 2543 1
+52 2544 1
+52 2546 1
+52 2547 1
+52 2548 1
+52 2550 1
+52 2551 1
+52 2552 1
+52 2553 1
+52 2555 1
+52 2556 1
+52 2643 1
+52 2648 1
+52 2652 1
+52 2656 1
+52 2657 1
+52 2658 1
+52 2663 1
+52 2667 1
+52 2671 1
+52 2672 1
+52 2673 1
+52 2677 1
+52 2681 1
+52 2682 1
+52 2683 1
+52 2687 1
+52 2688 1
+52 2689 1
+52 2693 1
+52 2694 1
+52 2695 1
+52 2698 1
+52 2702 1
+52 2706 1
+52 2707 1
+52 2708 1
+52 2712 1
+52 2716 1
+52 2717 1
+52 2718 1
+52 2722 1
+52 2723 1
+52 2724 1
+52 2728 1
+52 2729 1
+52 2730 1
+52 2732 1
+52 2736 1
+52 2737 1
+52 2738 1
+52 2742 1
+52 2743 1
+52 2744 1
+52 2748 1
+52 2749 1
+52 2750 1
+52 2752 1
+52 2753 1
+52 2754 1
+52 2758 1
+52 2759 1
+52 2760 1
+52 2762 1
+52 2763 1
+52 2764 1
+52 2766 1
+52 2894 1
+52 2898 1
+52 2902 1
+52 2903 1
+52 2904 1
+52 2908 1
+52 2912 1
+52 2913 1
+52 2914 1
+52 2918 1
+52 2919 1
+52 2920 1
+52 2924 1
+52 2925 1
+52 2926 1
+52 2928 1
+52 2932 1
+52 2933 1
+52 2934 1
+52 2938 1
+52 2939 1
+52 2940 1
+52 2944 1
+52 2945 1
+52 2946 1
+52 2948 1
+52 2949 1
+52 2950 1
+52 2954 1
+52 2955 1
+52 2956 1
+52 2958 1
+52 2959 1
+52 2960 1
+52 2962 1
+52 2963 1
+52 2967 1
+52 2968 1
+52 2969 1
+52 2973 1
+52 2974 1
+52 2975 1
+52 2979 1
+52 2980 1
+52 2981 1
+52 2983 1
+52 2984 1
+52 2985 1
+52 2989 1
+52 2990 1
+52 2991 1
+52 2993 1
+52 2994 1
+52 2995 1
+52 2997 1
+52 2998 1
+52 2999 1
+52 3000 1
+52 3004 1
+52 3005 1
+52 3006 1
+52 3008 1
+52 3009 1
+52 3010 1
+52 3012 1
+52 3013 1
+52 3014 1
+52 3015 1
+52 3017 1
+52 3018 1
+52 3104 1
+52 3108 1
+52 3112 1
+52 3113 1
+52 3114 1
+52 3118 1
+52 3122 1
+52 3123 1
+52 3124 1
+52 3128 1
+52 3129 1
+52 3130 1
+52 3134 1
+52 3135 1
+52 3136 1
+52 3138 1
+52 3142 1
+52 3143 1
+52 3144 1
+52 3148 1
+52 3149 1
+52 3150 1
+52 3154 1
+52 3155 1
+52 3156 1
+52 3158 1
+52 3159 1
+52 3160 1
+52 3164 1
+52 3165 1
+52 3166 1
+52 3168 1
+52 3169 1
+52 3170 1
+52 3172 1
+52 3173 1
+52 3177 1
+52 3178 1
+52 3179 1
+52 3183 1
+52 3184 1
+52 3185 1
+52 3189 1
+52 3190 1
+52 3191 1
+52 3193 1
+52 3194 1
+52 3195 1
+52 3199 1
+52 3200 1
+52 3201 1
+52 3203 1
+52 3204 1
+52 3205 1
+52 3207 1
+52 3208 1
+52 3209 1
+52 3210 1
+52 3214 1
+52 3215 1
+52 3216 1
+52 3218 1
+52 3219 1
+52 3220 1
+52 3222 1
+52 3223 1
+52 3224 1
+52 3225 1
+52 3227 1
+52 3228 1
+52 3313 1
+52 3317 1
+52 3318 1
+52 3319 1
+52 3323 1
+52 3324 1
+52 3325 1
+52 3329 1
+52 3330 1
+52 3331 1
+52 3333 1
+52 3334 1
+52 3335 1
+52 3339 1
+52 3340 1
+52 3341 1
+52 3343 1
+52 3344 1
+52 3345 1
+52 3347 1
+52 3348 1
+52 3349 1
+52 3350 1
+52 3354 1
+52 3355 1
+52 3356 1
+52 3358 1
+52 3359 1
+52 3360 1
+52 3362 1
+52 3363 1
+52 3364 1
+52 3365 1
+52 3367 1
+52 3368 1
+52 3369 1
+52 3370 1
+52 3371 1
+52 3375 1
+52 3376 1
+52 3377 1
+52 3379 1
+52 3380 1
+52 3381 1
+52 3383 1
+52 3384 1
+52 3385 1
+52 3386 1
+52 3388 1
+52 3389 1
+52 3390 1
+52 3391 1
+52 3392 1
+52 3394 1
+52 3395 1
+52 3396 1
+53 6 1
+53 13 1
+53 19 1
+53 24 1
+53 28 1
+53 31 1
+53 34 1
+53 35 1
+53 125 1
+53 131 1
+53 136 1
+53 140 1
+53 143 1
+53 146 1
+53 147 1
+53 152 1
+53 157 1
+53 161 1
+53 164 1
+53 167 1
+53 168 1
+53 172 1
+53 176 1
+53 179 1
+53 182 1
+53 183 1
+53 186 1
+53 189 1
+53 192 1
+53 193 1
+53 195 1
+53 198 1
+53 199 1
+53 201 1
+53 202 1
+53 204 1
+53 335 1
+53 341 1
+53 346 1
+53 350 1
+53 353 1
+53 356 1
+53 357 1
+53 362 1
+53 367 1
+53 371 1
+53 374 1
+53 377 1
+53 378 1
+53 382 1
+53 386 1
+53 389 1
+53 392 1
+53 393 1
+53 396 1
+53 399 1
+53 402 1
+53 403 1
+53 405 1
+53 408 1
+53 409 1
+53 411 1
+53 412 1
+53 414 1
+53 544 1
+53 549 1
+53 553 1
+53 556 1
+53 559 1
+53 560 1
+53 564 1
+53 568 1
+53 571 1
+53 574 1
+53 575 1
+53 578 1
+53 581 1
+53 584 1
+53 585 1
+53 587 1
+53 590 1
+53 591 1
+53 593 1
+53 594 1
+53 596 1
+53 599 1
+53 603 1
+53 606 1
+53 609 1
+53 610 1
+53 613 1
+53 616 1
+53 619 1
+53 620 1
+53 622 1
+53 625 1
+53 626 1
+53 628 1
+53 629 1
+53 631 1
+53 633 1
+53 636 1
+53 639 1
+53 640 1
+53 642 1
+53 645 1
+53 646 1
+53 648 1
+53 649 1
+53 651 1
+53 652 1
+53 655 1
+53 656 1
+53 658 1
+53 659 1
+53 661 1
+53 662 1
+53 663 1
+53 665 1
+53 666 1
+53 797 1
+53 803 1
+53 808 1
+53 812 1
+53 815 1
+53 818 1
+53 819 1
+53 824 1
+53 829 1
+53 833 1
+53 836 1
+53 839 1
+53 840 1
+53 844 1
+53 848 1
+53 851 1
+53 854 1
+53 855 1
+53 858 1
+53 861 1
+53 864 1
+53 865 1
+53 867 1
+53 870 1
+53 871 1
+53 873 1
+53 874 1
+53 876 1
+53 1006 1
+53 1011 1
+53 1015 1
+53 1018 1
+53 1021 1
+53 1022 1
+53 1026 1
+53 1030 1
+53 1033 1
+53 1036 1
+53 1037 1
+53 1040 1
+53 1043 1
+53 1046 1
+53 1047 1
+53 1049 1
+53 1052 1
+53 1053 1
+53 1055 1
+53 1056 1
+53 1058 1
+53 1061 1
+53 1065 1
+53 1068 1
+53 1071 1
+53 1072 1
+53 1075 1
+53 1078 1
+53 1081 1
+53 1082 1
+53 1084 1
+53 1087 1
+53 1088 1
+53 1090 1
+53 1091 1
+53 1093 1
+53 1095 1
+53 1098 1
+53 1101 1
+53 1102 1
+53 1104 1
+53 1107 1
+53 1108 1
+53 1110 1
+53 1111 1
+53 1113 1
+53 1114 1
+53 1117 1
+53 1118 1
+53 1120 1
+53 1121 1
+53 1123 1
+53 1124 1
+53 1125 1
+53 1127 1
+53 1128 1
+53 1258 1
+53 1263 1
+53 1267 1
+53 1270 1
+53 1273 1
+53 1274 1
+53 1278 1
+53 1282 1
+53 1285 1
+53 1288 1
+53 1289 1
+53 1292 1
+53 1295 1
+53 1298 1
+53 1299 1
+53 1301 1
+53 1304 1
+53 1305 1
+53 1307 1
+53 1308 1
+53 1310 1
+53 1313 1
+53 1317 1
+53 1320 1
+53 1323 1
+53 1324 1
+53 1327 1
+53 1330 1
+53 1333 1
+53 1334 1
+53 1336 1
+53 1339 1
+53 1340 1
+53 1342 1
+53 1343 1
+53 1345 1
+53 1347 1
+53 1350 1
+53 1353 1
+53 1354 1
+53 1356 1
+53 1359 1
+53 1360 1
+53 1362 1
+53 1363 1
+53 1365 1
+53 1366 1
+53 1369 1
+53 1370 1
+53 1372 1
+53 1373 1
+53 1375 1
+53 1376 1
+53 1377 1
+53 1379 1
+53 1380 1
+53 1509 1
+53 1513 1
+53 1516 1
+53 1519 1
+53 1520 1
+53 1523 1
+53 1526 1
+53 1529 1
+53 1530 1
+53 1532 1
+53 1535 1
+53 1536 1
+53 1538 1
+53 1539 1
+53 1541 1
+53 1543 1
+53 1546 1
+53 1549 1
+53 1550 1
+53 1552 1
+53 1555 1
+53 1556 1
+53 1558 1
+53 1559 1
+53 1561 1
+53 1562 1
+53 1565 1
+53 1566 1
+53 1568 1
+53 1569 1
+53 1571 1
+53 1572 1
+53 1573 1
+53 1575 1
+53 1576 1
+53 1578 1
+53 1581 1
+53 1584 1
+53 1585 1
+53 1587 1
+53 1590 1
+53 1591 1
+53 1593 1
+53 1594 1
+53 1596 1
+53 1597 1
+53 1600 1
+53 1601 1
+53 1603 1
+53 1604 1
+53 1606 1
+53 1607 1
+53 1608 1
+53 1610 1
+53 1611 1
+53 1612 1
+53 1615 1
+53 1616 1
+53 1618 1
+53 1619 1
+53 1621 1
+53 1622 1
+53 1623 1
+53 1625 1
+53 1626 1
+53 1627 1
+53 1628 1
+53 1630 1
+53 1631 1
+53 1632 1
+53 1721 1
+53 1727 1
+53 1732 1
+53 1736 1
+53 1739 1
+53 1742 1
+53 1743 1
+53 1748 1
+53 1753 1
+53 1757 1
+53 1760 1
+53 1763 1
+53 1764 1
+53 1768 1
+53 1772 1
+53 1775 1
+53 1778 1
+53 1779 1
+53 1782 1
+53 1785 1
+53 1788 1
+53 1789 1
+53 1791 1
+53 1794 1
+53 1795 1
+53 1797 1
+53 1798 1
+53 1800 1
+53 1930 1
+53 1935 1
+53 1939 1
+53 1942 1
+53 1945 1
+53 1946 1
+53 1950 1
+53 1954 1
+53 1957 1
+53 1960 1
+53 1961 1
+53 1964 1
+53 1967 1
+53 1970 1
+53 1971 1
+53 1973 1
+53 1976 1
+53 1977 1
+53 1979 1
+53 1980 1
+53 1982 1
+53 1985 1
+53 1989 1
+53 1992 1
+53 1995 1
+53 1996 1
+53 1999 1
+53 2002 1
+53 2005 1
+53 2006 1
+53 2008 1
+53 2011 1
+53 2012 1
+53 2014 1
+53 2015 1
+53 2017 1
+53 2019 1
+53 2022 1
+53 2025 1
+53 2026 1
+53 2028 1
+53 2031 1
+53 2032 1
+53 2034 1
+53 2035 1
+53 2037 1
+53 2038 1
+53 2041 1
+53 2042 1
+53 2044 1
+53 2045 1
+53 2047 1
+53 2048 1
+53 2049 1
+53 2051 1
+53 2052 1
+53 2182 1
+53 2187 1
+53 2191 1
+53 2194 1
+53 2197 1
+53 2198 1
+53 2202 1
+53 2206 1
+53 2209 1
+53 2212 1
+53 2213 1
+53 2216 1
+53 2219 1
+53 2222 1
+53 2223 1
+53 2225 1
+53 2228 1
+53 2229 1
+53 2231 1
+53 2232 1
+53 2234 1
+53 2237 1
+53 2241 1
+53 2244 1
+53 2247 1
+53 2248 1
+53 2251 1
+53 2254 1
+53 2257 1
+53 2258 1
+53 2260 1
+53 2263 1
+53 2264 1
+53 2266 1
+53 2267 1
+53 2269 1
+53 2271 1
+53 2274 1
+53 2277 1
+53 2278 1
+53 2280 1
+53 2283 1
+53 2284 1
+53 2286 1
+53 2287 1
+53 2289 1
+53 2290 1
+53 2293 1
+53 2294 1
+53 2296 1
+53 2297 1
+53 2299 1
+53 2300 1
+53 2301 1
+53 2303 1
+53 2304 1
+53 2433 1
+53 2437 1
+53 2440 1
+53 2443 1
+53 2444 1
+53 2447 1
+53 2450 1
+53 2453 1
+53 2454 1
+53 2456 1
+53 2459 1
+53 2460 1
+53 2462 1
+53 2463 1
+53 2465 1
+53 2467 1
+53 2470 1
+53 2473 1
+53 2474 1
+53 2476 1
+53 2479 1
+53 2480 1
+53 2482 1
+53 2483 1
+53 2485 1
+53 2486 1
+53 2489 1
+53 2490 1
+53 2492 1
+53 2493 1
+53 2495 1
+53 2496 1
+53 2497 1
+53 2499 1
+53 2500 1
+53 2502 1
+53 2505 1
+53 2508 1
+53 2509 1
+53 2511 1
+53 2514 1
+53 2515 1
+53 2517 1
+53 2518 1
+53 2520 1
+53 2521 1
+53 2524 1
+53 2525 1
+53 2527 1
+53 2528 1
+53 2530 1
+53 2531 1
+53 2532 1
+53 2534 1
+53 2535 1
+53 2536 1
+53 2539 1
+53 2540 1
+53 2542 1
+53 2543 1
+53 2545 1
+53 2546 1
+53 2547 1
+53 2549 1
+53 2550 1
+53 2551 1
+53 2552 1
+53 2554 1
+53 2555 1
+53 2556 1
+53 2644 1
+53 2649 1
+53 2653 1
+53 2656 1
+53 2659 1
+53 2660 1
+53 2664 1
+53 2668 1
+53 2671 1
+53 2674 1
+53 2675 1
+53 2678 1
+53 2681 1
+53 2684 1
+53 2685 1
+53 2687 1
+53 2690 1
+53 2691 1
+53 2693 1
+53 2694 1
+53 2696 1
+53 2699 1
+53 2703 1
+53 2706 1
+53 2709 1
+53 2710 1
+53 2713 1
+53 2716 1
+53 2719 1
+53 2720 1
+53 2722 1
+53 2725 1
+53 2726 1
+53 2728 1
+53 2729 1
+53 2731 1
+53 2733 1
+53 2736 1
+53 2739 1
+53 2740 1
+53 2742 1
+53 2745 1
+53 2746 1
+53 2748 1
+53 2749 1
+53 2751 1
+53 2752 1
+53 2755 1
+53 2756 1
+53 2758 1
+53 2759 1
+53 2761 1
+53 2762 1
+53 2763 1
+53 2765 1
+53 2766 1
+53 2895 1
+53 2899 1
+53 2902 1
+53 2905 1
+53 2906 1
+53 2909 1
+53 2912 1
+53 2915 1
+53 2916 1
+53 2918 1
+53 2921 1
+53 2922 1
+53 2924 1
+53 2925 1
+53 2927 1
+53 2929 1
+53 2932 1
+53 2935 1
+53 2936 1
+53 2938 1
+53 2941 1
+53 2942 1
+53 2944 1
+53 2945 1
+53 2947 1
+53 2948 1
+53 2951 1
+53 2952 1
+53 2954 1
+53 2955 1
+53 2957 1
+53 2958 1
+53 2959 1
+53 2961 1
+53 2962 1
+53 2964 1
+53 2967 1
+53 2970 1
+53 2971 1
+53 2973 1
+53 2976 1
+53 2977 1
+53 2979 1
+53 2980 1
+53 2982 1
+53 2983 1
+53 2986 1
+53 2987 1
+53 2989 1
+53 2990 1
+53 2992 1
+53 2993 1
+53 2994 1
+53 2996 1
+53 2997 1
+53 2998 1
+53 3001 1
+53 3002 1
+53 3004 1
+53 3005 1
+53 3007 1
+53 3008 1
+53 3009 1
+53 3011 1
+53 3012 1
+53 3013 1
+53 3014 1
+53 3016 1
+53 3017 1
+53 3018 1
+53 3105 1
+53 3109 1
+53 3112 1
+53 3115 1
+53 3116 1
+53 3119 1
+53 3122 1
+53 3125 1
+53 3126 1
+53 3128 1
+53 3131 1
+53 3132 1
+53 3134 1
+53 3135 1
+53 3137 1
+53 3139 1
+53 3142 1
+53 3145 1
+53 3146 1
+53 3148 1
+53 3151 1
+53 3152 1
+53 3154 1
+53 3155 1
+53 3157 1
+53 3158 1
+53 3161 1
+53 3162 1
+53 3164 1
+53 3165 1
+53 3167 1
+53 3168 1
+53 3169 1
+53 3171 1
+53 3172 1
+53 3174 1
+53 3177 1
+53 3180 1
+53 3181 1
+53 3183 1
+53 3186 1
+53 3187 1
+53 3189 1
+53 3190 1
+53 3192 1
+53 3193 1
+53 3196 1
+53 3197 1
+53 3199 1
+53 3200 1
+53 3202 1
+53 3203 1
+53 3204 1
+53 3206 1
+53 3207 1
+53 3208 1
+53 3211 1
+53 3212 1
+53 3214 1
+53 3215 1
+53 3217 1
+53 3218 1
+53 3219 1
+53 3221 1
+53 3222 1
+53 3223 1
+53 3224 1
+53 3226 1
+53 3227 1
+53 3228 1
+53 3314 1
+53 3317 1
+53 3320 1
+53 3321 1
+53 3323 1
+53 3326 1
+53 3327 1
+53 3329 1
+53 3330 1
+53 3332 1
+53 3333 1
+53 3336 1
+53 3337 1
+53 3339 1
+53 3340 1
+53 3342 1
+53 3343 1
+53 3344 1
+53 3346 1
+53 3347 1
+53 3348 1
+53 3351 1
+53 3352 1
+53 3354 1
+53 3355 1
+53 3357 1
+53 3358 1
+53 3359 1
+53 3361 1
+53 3362 1
+53 3363 1
+53 3364 1
+53 3366 1
+53 3367 1
+53 3368 1
+53 3369 1
+53 3372 1
+53 3373 1
+53 3375 1
+53 3376 1
+53 3378 1
+53 3379 1
+53 3380 1
+53 3382 1
+53 3383 1
+53 3384 1
+53 3385 1
+53 3387 1
+53 3388 1
+53 3389 1
+53 3390 1
+53 3391 1
+53 3393 1
+53 3394 1
+53 3395 1
+53 3396 1
+54 7 1
+54 14 1
+54 20 1
+54 25 1
+54 29 1
+54 32 1
+54 34 1
+54 36 1
+54 126 1
+54 132 1
+54 137 1
+54 141 1
+54 144 1
+54 146 1
+54 148 1
+54 153 1
+54 158 1
+54 162 1
+54 165 1
+54 167 1
+54 169 1
+54 173 1
+54 177 1
+54 180 1
+54 182 1
+54 184 1
+54 187 1
+54 190 1
+54 192 1
+54 194 1
+54 196 1
+54 198 1
+54 200 1
+54 201 1
+54 203 1
+54 204 1
+54 336 1
+54 342 1
+54 347 1
+54 351 1
+54 354 1
+54 356 1
+54 358 1
+54 363 1
+54 368 1
+54 372 1
+54 375 1
+54 377 1
+54 379 1
+54 383 1
+54 387 1
+54 390 1
+54 392 1
+54 394 1
+54 397 1
+54 400 1
+54 402 1
+54 404 1
+54 406 1
+54 408 1
+54 410 1
+54 411 1
+54 413 1
+54 414 1
+54 545 1
+54 550 1
+54 554 1
+54 557 1
+54 559 1
+54 561 1
+54 565 1
+54 569 1
+54 572 1
+54 574 1
+54 576 1
+54 579 1
+54 582 1
+54 584 1
+54 586 1
+54 588 1
+54 590 1
+54 592 1
+54 593 1
+54 595 1
+54 596 1
+54 600 1
+54 604 1
+54 607 1
+54 609 1
+54 611 1
+54 614 1
+54 617 1
+54 619 1
+54 621 1
+54 623 1
+54 625 1
+54 627 1
+54 628 1
+54 630 1
+54 631 1
+54 634 1
+54 637 1
+54 639 1
+54 641 1
+54 643 1
+54 645 1
+54 647 1
+54 648 1
+54 650 1
+54 651 1
+54 653 1
+54 655 1
+54 657 1
+54 658 1
+54 660 1
+54 661 1
+54 662 1
+54 664 1
+54 665 1
+54 666 1
+54 798 1
+54 804 1
+54 809 1
+54 813 1
+54 816 1
+54 818 1
+54 820 1
+54 825 1
+54 830 1
+54 834 1
+54 837 1
+54 839 1
+54 841 1
+54 845 1
+54 849 1
+54 852 1
+54 854 1
+54 856 1
+54 859 1
+54 862 1
+54 864 1
+54 866 1
+54 868 1
+54 870 1
+54 872 1
+54 873 1
+54 875 1
+54 876 1
+54 1007 1
+54 1012 1
+54 1016 1
+54 1019 1
+54 1021 1
+54 1023 1
+54 1027 1
+54 1031 1
+54 1034 1
+54 1036 1
+54 1038 1
+54 1041 1
+54 1044 1
+54 1046 1
+54 1048 1
+54 1050 1
+54 1052 1
+54 1054 1
+54 1055 1
+54 1057 1
+54 1058 1
+54 1062 1
+54 1066 1
+54 1069 1
+54 1071 1
+54 1073 1
+54 1076 1
+54 1079 1
+54 1081 1
+54 1083 1
+54 1085 1
+54 1087 1
+54 1089 1
+54 1090 1
+54 1092 1
+54 1093 1
+54 1096 1
+54 1099 1
+54 1101 1
+54 1103 1
+54 1105 1
+54 1107 1
+54 1109 1
+54 1110 1
+54 1112 1
+54 1113 1
+54 1115 1
+54 1117 1
+54 1119 1
+54 1120 1
+54 1122 1
+54 1123 1
+54 1124 1
+54 1126 1
+54 1127 1
+54 1128 1
+54 1259 1
+54 1264 1
+54 1268 1
+54 1271 1
+54 1273 1
+54 1275 1
+54 1279 1
+54 1283 1
+54 1286 1
+54 1288 1
+54 1290 1
+54 1293 1
+54 1296 1
+54 1298 1
+54 1300 1
+54 1302 1
+54 1304 1
+54 1306 1
+54 1307 1
+54 1309 1
+54 1310 1
+54 1314 1
+54 1318 1
+54 1321 1
+54 1323 1
+54 1325 1
+54 1328 1
+54 1331 1
+54 1333 1
+54 1335 1
+54 1337 1
+54 1339 1
+54 1341 1
+54 1342 1
+54 1344 1
+54 1345 1
+54 1348 1
+54 1351 1
+54 1353 1
+54 1355 1
+54 1357 1
+54 1359 1
+54 1361 1
+54 1362 1
+54 1364 1
+54 1365 1
+54 1367 1
+54 1369 1
+54 1371 1
+54 1372 1
+54 1374 1
+54 1375 1
+54 1376 1
+54 1378 1
+54 1379 1
+54 1380 1
+54 1510 1
+54 1514 1
+54 1517 1
+54 1519 1
+54 1521 1
+54 1524 1
+54 1527 1
+54 1529 1
+54 1531 1
+54 1533 1
+54 1535 1
+54 1537 1
+54 1538 1
+54 1540 1
+54 1541 1
+54 1544 1
+54 1547 1
+54 1549 1
+54 1551 1
+54 1553 1
+54 1555 1
+54 1557 1
+54 1558 1
+54 1560 1
+54 1561 1
+54 1563 1
+54 1565 1
+54 1567 1
+54 1568 1
+54 1570 1
+54 1571 1
+54 1572 1
+54 1574 1
+54 1575 1
+54 1576 1
+54 1579 1
+54 1582 1
+54 1584 1
+54 1586 1
+54 1588 1
+54 1590 1
+54 1592 1
+54 1593 1
+54 1595 1
+54 1596 1
+54 1598 1
+54 1600 1
+54 1602 1
+54 1603 1
+54 1605 1
+54 1606 1
+54 1607 1
+54 1609 1
+54 1610 1
+54 1611 1
+54 1613 1
+54 1615 1
+54 1617 1
+54 1618 1
+54 1620 1
+54 1621 1
+54 1622 1
+54 1624 1
+54 1625 1
+54 1626 1
+54 1627 1
+54 1629 1
+54 1630 1
+54 1631 1
+54 1632 1
+54 1722 1
+54 1728 1
+54 1733 1
+54 1737 1
+54 1740 1
+54 1742 1
+54 1744 1
+54 1749 1
+54 1754 1
+54 1758 1
+54 1761 1
+54 1763 1
+54 1765 1
+54 1769 1
+54 1773 1
+54 1776 1
+54 1778 1
+54 1780 1
+54 1783 1
+54 1786 1
+54 1788 1
+54 1790 1
+54 1792 1
+54 1794 1
+54 1796 1
+54 1797 1
+54 1799 1
+54 1800 1
+54 1931 1
+54 1936 1
+54 1940 1
+54 1943 1
+54 1945 1
+54 1947 1
+54 1951 1
+54 1955 1
+54 1958 1
+54 1960 1
+54 1962 1
+54 1965 1
+54 1968 1
+54 1970 1
+54 1972 1
+54 1974 1
+54 1976 1
+54 1978 1
+54 1979 1
+54 1981 1
+54 1982 1
+54 1986 1
+54 1990 1
+54 1993 1
+54 1995 1
+54 1997 1
+54 2000 1
+54 2003 1
+54 2005 1
+54 2007 1
+54 2009 1
+54 2011 1
+54 2013 1
+54 2014 1
+54 2016 1
+54 2017 1
+54 2020 1
+54 2023 1
+54 2025 1
+54 2027 1
+54 2029 1
+54 2031 1
+54 2033 1
+54 2034 1
+54 2036 1
+54 2037 1
+54 2039 1
+54 2041 1
+54 2043 1
+54 2044 1
+54 2046 1
+54 2047 1
+54 2048 1
+54 2050 1
+54 2051 1
+54 2052 1
+54 2183 1
+54 2188 1
+54 2192 1
+54 2195 1
+54 2197 1
+54 2199 1
+54 2203 1
+54 2207 1
+54 2210 1
+54 2212 1
+54 2214 1
+54 2217 1
+54 2220 1
+54 2222 1
+54 2224 1
+54 2226 1
+54 2228 1
+54 2230 1
+54 2231 1
+54 2233 1
+54 2234 1
+54 2238 1
+54 2242 1
+54 2245 1
+54 2247 1
+54 2249 1
+54 2252 1
+54 2255 1
+54 2257 1
+54 2259 1
+54 2261 1
+54 2263 1
+54 2265 1
+54 2266 1
+54 2268 1
+54 2269 1
+54 2272 1
+54 2275 1
+54 2277 1
+54 2279 1
+54 2281 1
+54 2283 1
+54 2285 1
+54 2286 1
+54 2288 1
+54 2289 1
+54 2291 1
+54 2293 1
+54 2295 1
+54 2296 1
+54 2298 1
+54 2299 1
+54 2300 1
+54 2302 1
+54 2303 1
+54 2304 1
+54 2434 1
+54 2438 1
+54 2441 1
+54 2443 1
+54 2445 1
+54 2448 1
+54 2451 1
+54 2453 1
+54 2455 1
+54 2457 1
+54 2459 1
+54 2461 1
+54 2462 1
+54 2464 1
+54 2465 1
+54 2468 1
+54 2471 1
+54 2473 1
+54 2475 1
+54 2477 1
+54 2479 1
+54 2481 1
+54 2482 1
+54 2484 1
+54 2485 1
+54 2487 1
+54 2489 1
+54 2491 1
+54 2492 1
+54 2494 1
+54 2495 1
+54 2496 1
+54 2498 1
+54 2499 1
+54 2500 1
+54 2503 1
+54 2506 1
+54 2508 1
+54 2510 1
+54 2512 1
+54 2514 1
+54 2516 1
+54 2517 1
+54 2519 1
+54 2520 1
+54 2522 1
+54 2524 1
+54 2526 1
+54 2527 1
+54 2529 1
+54 2530 1
+54 2531 1
+54 2533 1
+54 2534 1
+54 2535 1
+54 2537 1
+54 2539 1
+54 2541 1
+54 2542 1
+54 2544 1
+54 2545 1
+54 2546 1
+54 2548 1
+54 2549 1
+54 2550 1
+54 2551 1
+54 2553 1
+54 2554 1
+54 2555 1
+54 2556 1
+54 2645 1
+54 2650 1
+54 2654 1
+54 2657 1
+54 2659 1
+54 2661 1
+54 2665 1
+54 2669 1
+54 2672 1
+54 2674 1
+54 2676 1
+54 2679 1
+54 2682 1
+54 2684 1
+54 2686 1
+54 2688 1
+54 2690 1
+54 2692 1
+54 2693 1
+54 2695 1
+54 2696 1
+54 2700 1
+54 2704 1
+54 2707 1
+54 2709 1
+54 2711 1
+54 2714 1
+54 2717 1
+54 2719 1
+54 2721 1
+54 2723 1
+54 2725 1
+54 2727 1
+54 2728 1
+54 2730 1
+54 2731 1
+54 2734 1
+54 2737 1
+54 2739 1
+54 2741 1
+54 2743 1
+54 2745 1
+54 2747 1
+54 2748 1
+54 2750 1
+54 2751 1
+54 2753 1
+54 2755 1
+54 2757 1
+54 2758 1
+54 2760 1
+54 2761 1
+54 2762 1
+54 2764 1
+54 2765 1
+54 2766 1
+54 2896 1
+54 2900 1
+54 2903 1
+54 2905 1
+54 2907 1
+54 2910 1
+54 2913 1
+54 2915 1
+54 2917 1
+54 2919 1
+54 2921 1
+54 2923 1
+54 2924 1
+54 2926 1
+54 2927 1
+54 2930 1
+54 2933 1
+54 2935 1
+54 2937 1
+54 2939 1
+54 2941 1
+54 2943 1
+54 2944 1
+54 2946 1
+54 2947 1
+54 2949 1
+54 2951 1
+54 2953 1
+54 2954 1
+54 2956 1
+54 2957 1
+54 2958 1
+54 2960 1
+54 2961 1
+54 2962 1
+54 2965 1
+54 2968 1
+54 2970 1
+54 2972 1
+54 2974 1
+54 2976 1
+54 2978 1
+54 2979 1
+54 2981 1
+54 2982 1
+54 2984 1
+54 2986 1
+54 2988 1
+54 2989 1
+54 2991 1
+54 2992 1
+54 2993 1
+54 2995 1
+54 2996 1
+54 2997 1
+54 2999 1
+54 3001 1
+54 3003 1
+54 3004 1
+54 3006 1
+54 3007 1
+54 3008 1
+54 3010 1
+54 3011 1
+54 3012 1
+54 3013 1
+54 3015 1
+54 3016 1
+54 3017 1
+54 3018 1
+54 3106 1
+54 3110 1
+54 3113 1
+54 3115 1
+54 3117 1
+54 3120 1
+54 3123 1
+54 3125 1
+54 3127 1
+54 3129 1
+54 3131 1
+54 3133 1
+54 3134 1
+54 3136 1
+54 3137 1
+54 3140 1
+54 3143 1
+54 3145 1
+54 3147 1
+54 3149 1
+54 3151 1
+54 3153 1
+54 3154 1
+54 3156 1
+54 3157 1
+54 3159 1
+54 3161 1
+54 3163 1
+54 3164 1
+54 3166 1
+54 3167 1
+54 3168 1
+54 3170 1
+54 3171 1
+54 3172 1
+54 3175 1
+54 3178 1
+54 3180 1
+54 3182 1
+54 3184 1
+54 3186 1
+54 3188 1
+54 3189 1
+54 3191 1
+54 3192 1
+54 3194 1
+54 3196 1
+54 3198 1
+54 3199 1
+54 3201 1
+54 3202 1
+54 3203 1
+54 3205 1
+54 3206 1
+54 3207 1
+54 3209 1
+54 3211 1
+54 3213 1
+54 3214 1
+54 3216 1
+54 3217 1
+54 3218 1
+54 3220 1
+54 3221 1
+54 3222 1
+54 3223 1
+54 3225 1
+54 3226 1
+54 3227 1
+54 3228 1
+54 3315 1
+54 3318 1
+54 3320 1
+54 3322 1
+54 3324 1
+54 3326 1
+54 3328 1
+54 3329 1
+54 3331 1
+54 3332 1
+54 3334 1
+54 3336 1
+54 3338 1
+54 3339 1
+54 3341 1
+54 3342 1
+54 3343 1
+54 3345 1
+54 3346 1
+54 3347 1
+54 3349 1
+54 3351 1
+54 3353 1
+54 3354 1
+54 3356 1
+54 3357 1
+54 3358 1
+54 3360 1
+54 3361 1
+54 3362 1
+54 3363 1
+54 3365 1
+54 3366 1
+54 3367 1
+54 3368 1
+54 3370 1
+54 3372 1
+54 3374 1
+54 3375 1
+54 3377 1
+54 3378 1
+54 3379 1
+54 3381 1
+54 3382 1
+54 3383 1
+54 3384 1
+54 3386 1
+54 3387 1
+54 3388 1
+54 3389 1
+54 3390 1
+54 3392 1
+54 3393 1
+54 3394 1
+54 3395 1
+54 3396 1
+55 8 1
+55 15 1
+55 21 1
+55 26 1
+55 30 1
+55 33 1
+55 35 1
+55 36 1
+55 127 1
+55 133 1
+55 138 1
+55 142 1
+55 145 1
+55 147 1
+55 148 1
+55 154 1
+55 159 1
+55 163 1
+55 166 1
+55 168 1
+55 169 1
+55 174 1
+55 178 1
+55 181 1
+55 183 1
+55 184 1
+55 188 1
+55 191 1
+55 193 1
+55 194 1
+55 197 1
+55 199 1
+55 200 1
+55 202 1
+55 203 1
+55 204 1
+55 337 1
+55 343 1
+55 348 1
+55 352 1
+55 355 1
+55 357 1
+55 358 1
+55 364 1
+55 369 1
+55 373 1
+55 376 1
+55 378 1
+55 379 1
+55 384 1
+55 388 1
+55 391 1
+55 393 1
+55 394 1
+55 398 1
+55 401 1
+55 403 1
+55 404 1
+55 407 1
+55 409 1
+55 410 1
+55 412 1
+55 413 1
+55 414 1
+55 546 1
+55 551 1
+55 555 1
+55 558 1
+55 560 1
+55 561 1
+55 566 1
+55 570 1
+55 573 1
+55 575 1
+55 576 1
+55 580 1
+55 583 1
+55 585 1
+55 586 1
+55 589 1
+55 591 1
+55 592 1
+55 594 1
+55 595 1
+55 596 1
+55 601 1
+55 605 1
+55 608 1
+55 610 1
+55 611 1
+55 615 1
+55 618 1
+55 620 1
+55 621 1
+55 624 1
+55 626 1
+55 627 1
+55 629 1
+55 630 1
+55 631 1
+55 635 1
+55 638 1
+55 640 1
+55 641 1
+55 644 1
+55 646 1
+55 647 1
+55 649 1
+55 650 1
+55 651 1
+55 654 1
+55 656 1
+55 657 1
+55 659 1
+55 660 1
+55 661 1
+55 663 1
+55 664 1
+55 665 1
+55 666 1
+55 799 1
+55 805 1
+55 810 1
+55 814 1
+55 817 1
+55 819 1
+55 820 1
+55 826 1
+55 831 1
+55 835 1
+55 838 1
+55 840 1
+55 841 1
+55 846 1
+55 850 1
+55 853 1
+55 855 1
+55 856 1
+55 860 1
+55 863 1
+55 865 1
+55 866 1
+55 869 1
+55 871 1
+55 872 1
+55 874 1
+55 875 1
+55 876 1
+55 1008 1
+55 1013 1
+55 1017 1
+55 1020 1
+55 1022 1
+55 1023 1
+55 1028 1
+55 1032 1
+55 1035 1
+55 1037 1
+55 1038 1
+55 1042 1
+55 1045 1
+55 1047 1
+55 1048 1
+55 1051 1
+55 1053 1
+55 1054 1
+55 1056 1
+55 1057 1
+55 1058 1
+55 1063 1
+55 1067 1
+55 1070 1
+55 1072 1
+55 1073 1
+55 1077 1
+55 1080 1
+55 1082 1
+55 1083 1
+55 1086 1
+55 1088 1
+55 1089 1
+55 1091 1
+55 1092 1
+55 1093 1
+55 1097 1
+55 1100 1
+55 1102 1
+55 1103 1
+55 1106 1
+55 1108 1
+55 1109 1
+55 1111 1
+55 1112 1
+55 1113 1
+55 1116 1
+55 1118 1
+55 1119 1
+55 1121 1
+55 1122 1
+55 1123 1
+55 1125 1
+55 1126 1
+55 1127 1
+55 1128 1
+55 1260 1
+55 1265 1
+55 1269 1
+55 1272 1
+55 1274 1
+55 1275 1
+55 1280 1
+55 1284 1
+55 1287 1
+55 1289 1
+55 1290 1
+55 1294 1
+55 1297 1
+55 1299 1
+55 1300 1
+55 1303 1
+55 1305 1
+55 1306 1
+55 1308 1
+55 1309 1
+55 1310 1
+55 1315 1
+55 1319 1
+55 1322 1
+55 1324 1
+55 1325 1
+55 1329 1
+55 1332 1
+55 1334 1
+55 1335 1
+55 1338 1
+55 1340 1
+55 1341 1
+55 1343 1
+55 1344 1
+55 1345 1
+55 1349 1
+55 1352 1
+55 1354 1
+55 1355 1
+55 1358 1
+55 1360 1
+55 1361 1
+55 1363 1
+55 1364 1
+55 1365 1
+55 1368 1
+55 1370 1
+55 1371 1
+55 1373 1
+55 1374 1
+55 1375 1
+55 1377 1
+55 1378 1
+55 1379 1
+55 1380 1
+55 1511 1
+55 1515 1
+55 1518 1
+55 1520 1
+55 1521 1
+55 1525 1
+55 1528 1
+55 1530 1
+55 1531 1
+55 1534 1
+55 1536 1
+55 1537 1
+55 1539 1
+55 1540 1
+55 1541 1
+55 1545 1
+55 1548 1
+55 1550 1
+55 1551 1
+55 1554 1
+55 1556 1
+55 1557 1
+55 1559 1
+55 1560 1
+55 1561 1
+55 1564 1
+55 1566 1
+55 1567 1
+55 1569 1
+55 1570 1
+55 1571 1
+55 1573 1
+55 1574 1
+55 1575 1
+55 1576 1
+55 1580 1
+55 1583 1
+55 1585 1
+55 1586 1
+55 1589 1
+55 1591 1
+55 1592 1
+55 1594 1
+55 1595 1
+55 1596 1
+55 1599 1
+55 1601 1
+55 1602 1
+55 1604 1
+55 1605 1
+55 1606 1
+55 1608 1
+55 1609 1
+55 1610 1
+55 1611 1
+55 1614 1
+55 1616 1
+55 1617 1
+55 1619 1
+55 1620 1
+55 1621 1
+55 1623 1
+55 1624 1
+55 1625 1
+55 1626 1
+55 1628 1
+55 1629 1
+55 1630 1
+55 1631 1
+55 1632 1
+55 1723 1
+55 1729 1
+55 1734 1
+55 1738 1
+55 1741 1
+55 1743 1
+55 1744 1
+55 1750 1
+55 1755 1
+55 1759 1
+55 1762 1
+55 1764 1
+55 1765 1
+55 1770 1
+55 1774 1
+55 1777 1
+55 1779 1
+55 1780 1
+55 1784 1
+55 1787 1
+55 1789 1
+55 1790 1
+55 1793 1
+55 1795 1
+55 1796 1
+55 1798 1
+55 1799 1
+55 1800 1
+55 1932 1
+55 1937 1
+55 1941 1
+55 1944 1
+55 1946 1
+55 1947 1
+55 1952 1
+55 1956 1
+55 1959 1
+55 1961 1
+55 1962 1
+55 1966 1
+55 1969 1
+55 1971 1
+55 1972 1
+55 1975 1
+55 1977 1
+55 1978 1
+55 1980 1
+55 1981 1
+55 1982 1
+55 1987 1
+55 1991 1
+55 1994 1
+55 1996 1
+55 1997 1
+55 2001 1
+55 2004 1
+55 2006 1
+55 2007 1
+55 2010 1
+55 2012 1
+55 2013 1
+55 2015 1
+55 2016 1
+55 2017 1
+55 2021 1
+55 2024 1
+55 2026 1
+55 2027 1
+55 2030 1
+55 2032 1
+55 2033 1
+55 2035 1
+55 2036 1
+55 2037 1
+55 2040 1
+55 2042 1
+55 2043 1
+55 2045 1
+55 2046 1
+55 2047 1
+55 2049 1
+55 2050 1
+55 2051 1
+55 2052 1
+55 2184 1
+55 2189 1
+55 2193 1
+55 2196 1
+55 2198 1
+55 2199 1
+55 2204 1
+55 2208 1
+55 2211 1
+55 2213 1
+55 2214 1
+55 2218 1
+55 2221 1
+55 2223 1
+55 2224 1
+55 2227 1
+55 2229 1
+55 2230 1
+55 2232 1
+55 2233 1
+55 2234 1
+55 2239 1
+55 2243 1
+55 2246 1
+55 2248 1
+55 2249 1
+55 2253 1
+55 2256 1
+55 2258 1
+55 2259 1
+55 2262 1
+55 2264 1
+55 2265 1
+55 2267 1
+55 2268 1
+55 2269 1
+55 2273 1
+55 2276 1
+55 2278 1
+55 2279 1
+55 2282 1
+55 2284 1
+55 2285 1
+55 2287 1
+55 2288 1
+55 2289 1
+55 2292 1
+55 2294 1
+55 2295 1
+55 2297 1
+55 2298 1
+55 2299 1
+55 2301 1
+55 2302 1
+55 2303 1
+55 2304 1
+55 2435 1
+55 2439 1
+55 2442 1
+55 2444 1
+55 2445 1
+55 2449 1
+55 2452 1
+55 2454 1
+55 2455 1
+55 2458 1
+55 2460 1
+55 2461 1
+55 2463 1
+55 2464 1
+55 2465 1
+55 2469 1
+55 2472 1
+55 2474 1
+55 2475 1
+55 2478 1
+55 2480 1
+55 2481 1
+55 2483 1
+55 2484 1
+55 2485 1
+55 2488 1
+55 2490 1
+55 2491 1
+55 2493 1
+55 2494 1
+55 2495 1
+55 2497 1
+55 2498 1
+55 2499 1
+55 2500 1
+55 2504 1
+55 2507 1
+55 2509 1
+55 2510 1
+55 2513 1
+55 2515 1
+55 2516 1
+55 2518 1
+55 2519 1
+55 2520 1
+55 2523 1
+55 2525 1
+55 2526 1
+55 2528 1
+55 2529 1
+55 2530 1
+55 2532 1
+55 2533 1
+55 2534 1
+55 2535 1
+55 2538 1
+55 2540 1
+55 2541 1
+55 2543 1
+55 2544 1
+55 2545 1
+55 2547 1
+55 2548 1
+55 2549 1
+55 2550 1
+55 2552 1
+55 2553 1
+55 2554 1
+55 2555 1
+55 2556 1
+55 2646 1
+55 2651 1
+55 2655 1
+55 2658 1
+55 2660 1
+55 2661 1
+55 2666 1
+55 2670 1
+55 2673 1
+55 2675 1
+55 2676 1
+55 2680 1
+55 2683 1
+55 2685 1
+55 2686 1
+55 2689 1
+55 2691 1
+55 2692 1
+55 2694 1
+55 2695 1
+55 2696 1
+55 2701 1
+55 2705 1
+55 2708 1
+55 2710 1
+55 2711 1
+55 2715 1
+55 2718 1
+55 2720 1
+55 2721 1
+55 2724 1
+55 2726 1
+55 2727 1
+55 2729 1
+55 2730 1
+55 2731 1
+55 2735 1
+55 2738 1
+55 2740 1
+55 2741 1
+55 2744 1
+55 2746 1
+55 2747 1
+55 2749 1
+55 2750 1
+55 2751 1
+55 2754 1
+55 2756 1
+55 2757 1
+55 2759 1
+55 2760 1
+55 2761 1
+55 2763 1
+55 2764 1
+55 2765 1
+55 2766 1
+55 2897 1
+55 2901 1
+55 2904 1
+55 2906 1
+55 2907 1
+55 2911 1
+55 2914 1
+55 2916 1
+55 2917 1
+55 2920 1
+55 2922 1
+55 2923 1
+55 2925 1
+55 2926 1
+55 2927 1
+55 2931 1
+55 2934 1
+55 2936 1
+55 2937 1
+55 2940 1
+55 2942 1
+55 2943 1
+55 2945 1
+55 2946 1
+55 2947 1
+55 2950 1
+55 2952 1
+55 2953 1
+55 2955 1
+55 2956 1
+55 2957 1
+55 2959 1
+55 2960 1
+55 2961 1
+55 2962 1
+55 2966 1
+55 2969 1
+55 2971 1
+55 2972 1
+55 2975 1
+55 2977 1
+55 2978 1
+55 2980 1
+55 2981 1
+55 2982 1
+55 2985 1
+55 2987 1
+55 2988 1
+55 2990 1
+55 2991 1
+55 2992 1
+55 2994 1
+55 2995 1
+55 2996 1
+55 2997 1
+55 3000 1
+55 3002 1
+55 3003 1
+55 3005 1
+55 3006 1
+55 3007 1
+55 3009 1
+55 3010 1
+55 3011 1
+55 3012 1
+55 3014 1
+55 3015 1
+55 3016 1
+55 3017 1
+55 3018 1
+55 3107 1
+55 3111 1
+55 3114 1
+55 3116 1
+55 3117 1
+55 3121 1
+55 3124 1
+55 3126 1
+55 3127 1
+55 3130 1
+55 3132 1
+55 3133 1
+55 3135 1
+55 3136 1
+55 3137 1
+55 3141 1
+55 3144 1
+55 3146 1
+55 3147 1
+55 3150 1
+55 3152 1
+55 3153 1
+55 3155 1
+55 3156 1
+55 3157 1
+55 3160 1
+55 3162 1
+55 3163 1
+55 3165 1
+55 3166 1
+55 3167 1
+55 3169 1
+55 3170 1
+55 3171 1
+55 3172 1
+55 3176 1
+55 3179 1
+55 3181 1
+55 3182 1
+55 3185 1
+55 3187 1
+55 3188 1
+55 3190 1
+55 3191 1
+55 3192 1
+55 3195 1
+55 3197 1
+55 3198 1
+55 3200 1
+55 3201 1
+55 3202 1
+55 3204 1
+55 3205 1
+55 3206 1
+55 3207 1
+55 3210 1
+55 3212 1
+55 3213 1
+55 3215 1
+55 3216 1
+55 3217 1
+55 3219 1
+55 3220 1
+55 3221 1
+55 3222 1
+55 3224 1
+55 3225 1
+55 3226 1
+55 3227 1
+55 3228 1
+55 3316 1
+55 3319 1
+55 3321 1
+55 3322 1
+55 3325 1
+55 3327 1
+55 3328 1
+55 3330 1
+55 3331 1
+55 3332 1
+55 3335 1
+55 3337 1
+55 3338 1
+55 3340 1
+55 3341 1
+55 3342 1
+55 3344 1
+55 3345 1
+55 3346 1
+55 3347 1
+55 3350 1
+55 3352 1
+55 3353 1
+55 3355 1
+55 3356 1
+55 3357 1
+55 3359 1
+55 3360 1
+55 3361 1
+55 3362 1
+55 3364 1
+55 3365 1
+55 3366 1
+55 3367 1
+55 3368 1
+55 3371 1
+55 3373 1
+55 3374 1
+55 3376 1
+55 3377 1
+55 3378 1
+55 3380 1
+55 3381 1
+55 3382 1
+55 3383 1
+55 3385 1
+55 3386 1
+55 3387 1
+55 3388 1
+55 3389 1
+55 3391 1
+55 3392 1
+55 3393 1
+55 3394 1
+55 3395 1
+55 3396 1
+56 1 1
+56 37 1
+56 38 1
+56 39 1
+56 40 1
+56 41 1
+56 42 1
+56 43 1
+56 121 1
+56 122 1
+56 123 1
+56 124 1
+56 125 1
+56 126 1
+56 127 1
+56 205 1
+56 206 1
+56 207 1
+56 208 1
+56 209 1
+56 210 1
+56 211 1
+56 212 1
+56 213 1
+56 214 1
+56 215 1
+56 216 1
+56 217 1
+56 218 1
+56 219 1
+56 220 1
+56 221 1
+56 222 1
+56 223 1
+56 224 1
+56 225 1
+56 331 1
+56 332 1
+56 333 1
+56 334 1
+56 335 1
+56 336 1
+56 337 1
+56 415 1
+56 416 1
+56 417 1
+56 418 1
+56 419 1
+56 420 1
+56 421 1
+56 422 1
+56 423 1
+56 424 1
+56 425 1
+56 426 1
+56 427 1
+56 428 1
+56 429 1
+56 430 1
+56 431 1
+56 432 1
+56 433 1
+56 434 1
+56 435 1
+56 541 1
+56 542 1
+56 543 1
+56 544 1
+56 545 1
+56 546 1
+56 547 1
+56 548 1
+56 549 1
+56 550 1
+56 551 1
+56 552 1
+56 553 1
+56 554 1
+56 555 1
+56 556 1
+56 557 1
+56 558 1
+56 559 1
+56 560 1
+56 561 1
+56 667 1
+56 668 1
+56 669 1
+56 670 1
+56 671 1
+56 672 1
+56 673 1
+56 674 1
+56 675 1
+56 676 1
+56 677 1
+56 678 1
+56 679 1
+56 680 1
+56 681 1
+56 682 1
+56 683 1
+56 684 1
+56 685 1
+56 686 1
+56 687 1
+56 688 1
+56 689 1
+56 690 1
+56 691 1
+56 692 1
+56 693 1
+56 694 1
+56 695 1
+56 696 1
+56 697 1
+56 698 1
+56 699 1
+56 700 1
+56 701 1
+56 793 1
+56 794 1
+56 795 1
+56 796 1
+56 797 1
+56 798 1
+56 799 1
+56 877 1
+56 878 1
+56 879 1
+56 880 1
+56 881 1
+56 882 1
+56 883 1
+56 884 1
+56 885 1
+56 886 1
+56 887 1
+56 888 1
+56 889 1
+56 890 1
+56 891 1
+56 892 1
+56 893 1
+56 894 1
+56 895 1
+56 896 1
+56 897 1
+56 1003 1
+56 1004 1
+56 1005 1
+56 1006 1
+56 1007 1
+56 1008 1
+56 1009 1
+56 1010 1
+56 1011 1
+56 1012 1
+56 1013 1
+56 1014 1
+56 1015 1
+56 1016 1
+56 1017 1
+56 1018 1
+56 1019 1
+56 1020 1
+56 1021 1
+56 1022 1
+56 1023 1
+56 1129 1
+56 1130 1
+56 1131 1
+56 1132 1
+56 1133 1
+56 1134 1
+56 1135 1
+56 1136 1
+56 1137 1
+56 1138 1
+56 1139 1
+56 1140 1
+56 1141 1
+56 1142 1
+56 1143 1
+56 1144 1
+56 1145 1
+56 1146 1
+56 1147 1
+56 1148 1
+56 1149 1
+56 1150 1
+56 1151 1
+56 1152 1
+56 1153 1
+56 1154 1
+56 1155 1
+56 1156 1
+56 1157 1
+56 1158 1
+56 1159 1
+56 1160 1
+56 1161 1
+56 1162 1
+56 1163 1
+56 1255 1
+56 1256 1
+56 1257 1
+56 1258 1
+56 1259 1
+56 1260 1
+56 1261 1
+56 1262 1
+56 1263 1
+56 1264 1
+56 1265 1
+56 1266 1
+56 1267 1
+56 1268 1
+56 1269 1
+56 1270 1
+56 1271 1
+56 1272 1
+56 1273 1
+56 1274 1
+56 1275 1
+56 1381 1
+56 1382 1
+56 1383 1
+56 1384 1
+56 1385 1
+56 1386 1
+56 1387 1
+56 1388 1
+56 1389 1
+56 1390 1
+56 1391 1
+56 1392 1
+56 1393 1
+56 1394 1
+56 1395 1
+56 1396 1
+56 1397 1
+56 1398 1
+56 1399 1
+56 1400 1
+56 1401 1
+56 1402 1
+56 1403 1
+56 1404 1
+56 1405 1
+56 1406 1
+56 1407 1
+56 1408 1
+56 1409 1
+56 1410 1
+56 1411 1
+56 1412 1
+56 1413 1
+56 1414 1
+56 1415 1
+56 1507 1
+56 1508 1
+56 1509 1
+56 1510 1
+56 1511 1
+56 1512 1
+56 1513 1
+56 1514 1
+56 1515 1
+56 1516 1
+56 1517 1
+56 1518 1
+56 1519 1
+56 1520 1
+56 1521 1
+56 1522 1
+56 1523 1
+56 1524 1
+56 1525 1
+56 1526 1
+56 1527 1
+56 1528 1
+56 1529 1
+56 1530 1
+56 1531 1
+56 1532 1
+56 1533 1
+56 1534 1
+56 1535 1
+56 1536 1
+56 1537 1
+56 1538 1
+56 1539 1
+56 1540 1
+56 1541 1
+56 1633 1
+56 1634 1
+56 1635 1
+56 1636 1
+56 1637 1
+56 1638 1
+56 1639 1
+56 1640 1
+56 1641 1
+56 1642 1
+56 1643 1
+56 1644 1
+56 1645 1
+56 1646 1
+56 1647 1
+56 1648 1
+56 1649 1
+56 1650 1
+56 1651 1
+56 1652 1
+56 1653 1
+56 1654 1
+56 1655 1
+56 1656 1
+56 1657 1
+56 1658 1
+56 1659 1
+56 1660 1
+56 1661 1
+56 1662 1
+56 1663 1
+56 1664 1
+56 1665 1
+56 1666 1
+56 1667 1
+56 1717 1
+56 1718 1
+56 1719 1
+56 1720 1
+56 1721 1
+56 1722 1
+56 1723 1
+56 1801 1
+56 1802 1
+56 1803 1
+56 1804 1
+56 1805 1
+56 1806 1
+56 1807 1
+56 1808 1
+56 1809 1
+56 1810 1
+56 1811 1
+56 1812 1
+56 1813 1
+56 1814 1
+56 1815 1
+56 1816 1
+56 1817 1
+56 1818 1
+56 1819 1
+56 1820 1
+56 1821 1
+56 1927 1
+56 1928 1
+56 1929 1
+56 1930 1
+56 1931 1
+56 1932 1
+56 1933 1
+56 1934 1
+56 1935 1
+56 1936 1
+56 1937 1
+56 1938 1
+56 1939 1
+56 1940 1
+56 1941 1
+56 1942 1
+56 1943 1
+56 1944 1
+56 1945 1
+56 1946 1
+56 1947 1
+56 2053 1
+56 2054 1
+56 2055 1
+56 2056 1
+56 2057 1
+56 2058 1
+56 2059 1
+56 2060 1
+56 2061 1
+56 2062 1
+56 2063 1
+56 2064 1
+56 2065 1
+56 2066 1
+56 2067 1
+56 2068 1
+56 2069 1
+56 2070 1
+56 2071 1
+56 2072 1
+56 2073 1
+56 2074 1
+56 2075 1
+56 2076 1
+56 2077 1
+56 2078 1
+56 2079 1
+56 2080 1
+56 2081 1
+56 2082 1
+56 2083 1
+56 2084 1
+56 2085 1
+56 2086 1
+56 2087 1
+56 2179 1
+56 2180 1
+56 2181 1
+56 2182 1
+56 2183 1
+56 2184 1
+56 2185 1
+56 2186 1
+56 2187 1
+56 2188 1
+56 2189 1
+56 2190 1
+56 2191 1
+56 2192 1
+56 2193 1
+56 2194 1
+56 2195 1
+56 2196 1
+56 2197 1
+56 2198 1
+56 2199 1
+56 2305 1
+56 2306 1
+56 2307 1
+56 2308 1
+56 2309 1
+56 2310 1
+56 2311 1
+56 2312 1
+56 2313 1
+56 2314 1
+56 2315 1
+56 2316 1
+56 2317 1
+56 2318 1
+56 2319 1
+56 2320 1
+56 2321 1
+56 2322 1
+56 2323 1
+56 2324 1
+56 2325 1
+56 2326 1
+56 2327 1
+56 2328 1
+56 2329 1
+56 2330 1
+56 2331 1
+56 2332 1
+56 2333 1
+56 2334 1
+56 2335 1
+56 2336 1
+56 2337 1
+56 2338 1
+56 2339 1
+56 2431 1
+56 2432 1
+56 2433 1
+56 2434 1
+56 2435 1
+56 2436 1
+56 2437 1
+56 2438 1
+56 2439 1
+56 2440 1
+56 2441 1
+56 2442 1
+56 2443 1
+56 2444 1
+56 2445 1
+56 2446 1
+56 2447 1
+56 2448 1
+56 2449 1
+56 2450 1
+56 2451 1
+56 2452 1
+56 2453 1
+56 2454 1
+56 2455 1
+56 2456 1
+56 2457 1
+56 2458 1
+56 2459 1
+56 2460 1
+56 2461 1
+56 2462 1
+56 2463 1
+56 2464 1
+56 2465 1
+56 2557 1
+56 2558 1
+56 2559 1
+56 2560 1
+56 2561 1
+56 2562 1
+56 2563 1
+56 2564 1
+56 2565 1
+56 2566 1
+56 2567 1
+56 2568 1
+56 2569 1
+56 2570 1
+56 2571 1
+56 2572 1
+56 2573 1
+56 2574 1
+56 2575 1
+56 2576 1
+56 2577 1
+56 2578 1
+56 2579 1
+56 2580 1
+56 2581 1
+56 2582 1
+56 2583 1
+56 2584 1
+56 2585 1
+56 2586 1
+56 2587 1
+56 2588 1
+56 2589 1
+56 2590 1
+56 2591 1
+56 2641 1
+56 2642 1
+56 2643 1
+56 2644 1
+56 2645 1
+56 2646 1
+56 2647 1
+56 2648 1
+56 2649 1
+56 2650 1
+56 2651 1
+56 2652 1
+56 2653 1
+56 2654 1
+56 2655 1
+56 2656 1
+56 2657 1
+56 2658 1
+56 2659 1
+56 2660 1
+56 2661 1
+56 2767 1
+56 2768 1
+56 2769 1
+56 2770 1
+56 2771 1
+56 2772 1
+56 2773 1
+56 2774 1
+56 2775 1
+56 2776 1
+56 2777 1
+56 2778 1
+56 2779 1
+56 2780 1
+56 2781 1
+56 2782 1
+56 2783 1
+56 2784 1
+56 2785 1
+56 2786 1
+56 2787 1
+56 2788 1
+56 2789 1
+56 2790 1
+56 2791 1
+56 2792 1
+56 2793 1
+56 2794 1
+56 2795 1
+56 2796 1
+56 2797 1
+56 2798 1
+56 2799 1
+56 2800 1
+56 2801 1
+56 2893 1
+56 2894 1
+56 2895 1
+56 2896 1
+56 2897 1
+56 2898 1
+56 2899 1
+56 2900 1
+56 2901 1
+56 2902 1
+56 2903 1
+56 2904 1
+56 2905 1
+56 2906 1
+56 2907 1
+56 2908 1
+56 2909 1
+56 2910 1
+56 2911 1
+56 2912 1
+56 2913 1
+56 2914 1
+56 2915 1
+56 2916 1
+56 2917 1
+56 2918 1
+56 2919 1
+56 2920 1
+56 2921 1
+56 2922 1
+56 2923 1
+56 2924 1
+56 2925 1
+56 2926 1
+56 2927 1
+56 3019 1
+56 3020 1
+56 3021 1
+56 3022 1
+56 3023 1
+56 3024 1
+56 3025 1
+56 3026 1
+56 3027 1
+56 3028 1
+56 3029 1
+56 3030 1
+56 3031 1
+56 3032 1
+56 3033 1
+56 3034 1
+56 3035 1
+56 3036 1
+56 3037 1
+56 3038 1
+56 3039 1
+56 3040 1
+56 3041 1
+56 3042 1
+56 3043 1
+56 3044 1
+56 3045 1
+56 3046 1
+56 3047 1
+56 3048 1
+56 3049 1
+56 3050 1
+56 3051 1
+56 3052 1
+56 3053 1
+56 3103 1
+56 3104 1
+56 3105 1
+56 3106 1
+56 3107 1
+56 3108 1
+56 3109 1
+56 3110 1
+56 3111 1
+56 3112 1
+56 3113 1
+56 3114 1
+56 3115 1
+56 3116 1
+56 3117 1
+56 3118 1
+56 3119 1
+56 3120 1
+56 3121 1
+56 3122 1
+56 3123 1
+56 3124 1
+56 3125 1
+56 3126 1
+56 3127 1
+56 3128 1
+56 3129 1
+56 3130 1
+56 3131 1
+56 3132 1
+56 3133 1
+56 3134 1
+56 3135 1
+56 3136 1
+56 3137 1
+56 3229 1
+56 3230 1
+56 3231 1
+56 3232 1
+56 3233 1
+56 3234 1
+56 3235 1
+56 3236 1
+56 3237 1
+56 3238 1
+56 3239 1
+56 3240 1
+56 3241 1
+56 3242 1
+56 3243 1
+56 3244 1
+56 3245 1
+56 3246 1
+56 3247 1
+56 3248 1
+56 3249 1
+56 3250 1
+56 3251 1
+56 3252 1
+56 3253 1
+56 3254 1
+56 3255 1
+56 3256 1
+56 3257 1
+56 3258 1
+56 3259 1
+56 3260 1
+56 3261 1
+56 3262 1
+56 3263 1
+56 3313 1
+56 3314 1
+56 3315 1
+56 3316 1
+56 3317 1
+56 3318 1
+56 3319 1
+56 3320 1
+56 3321 1
+56 3322 1
+56 3323 1
+56 3324 1
+56 3325 1
+56 3326 1
+56 3327 1
+56 3328 1
+56 3329 1
+56 3330 1
+56 3331 1
+56 3332 1
+56 3333 1
+56 3334 1
+56 3335 1
+56 3336 1
+56 3337 1
+56 3338 1
+56 3339 1
+56 3340 1
+56 3341 1
+56 3342 1
+56 3343 1
+56 3344 1
+56 3345 1
+56 3346 1
+56 3347 1
+56 3397 1
+56 3398 1
+56 3399 1
+56 3400 1
+56 3401 1
+56 3402 1
+56 3403 1
+56 3404 1
+56 3405 1
+56 3406 1
+56 3407 1
+56 3408 1
+56 3409 1
+56 3410 1
+56 3411 1
+56 3412 1
+56 3413 1
+56 3414 1
+56 3415 1
+56 3416 1
+56 3417 1
+57 2 1
+57 37 1
+57 44 1
+57 45 1
+57 46 1
+57 47 1
+57 48 1
+57 49 1
+57 121 1
+57 128 1
+57 129 1
+57 130 1
+57 131 1
+57 132 1
+57 133 1
+57 205 1
+57 206 1
+57 207 1
+57 208 1
+57 209 1
+57 210 1
+57 226 1
+57 227 1
+57 228 1
+57 229 1
+57 230 1
+57 231 1
+57 232 1
+57 233 1
+57 234 1
+57 235 1
+57 236 1
+57 237 1
+57 238 1
+57 239 1
+57 240 1
+57 331 1
+57 338 1
+57 339 1
+57 340 1
+57 341 1
+57 342 1
+57 343 1
+57 415 1
+57 416 1
+57 417 1
+57 418 1
+57 419 1
+57 420 1
+57 436 1
+57 437 1
+57 438 1
+57 439 1
+57 440 1
+57 441 1
+57 442 1
+57 443 1
+57 444 1
+57 445 1
+57 446 1
+57 447 1
+57 448 1
+57 449 1
+57 450 1
+57 541 1
+57 542 1
+57 543 1
+57 544 1
+57 545 1
+57 546 1
+57 562 1
+57 563 1
+57 564 1
+57 565 1
+57 566 1
+57 567 1
+57 568 1
+57 569 1
+57 570 1
+57 571 1
+57 572 1
+57 573 1
+57 574 1
+57 575 1
+57 576 1
+57 667 1
+57 668 1
+57 669 1
+57 670 1
+57 671 1
+57 672 1
+57 673 1
+57 674 1
+57 675 1
+57 676 1
+57 677 1
+57 678 1
+57 679 1
+57 680 1
+57 681 1
+57 702 1
+57 703 1
+57 704 1
+57 705 1
+57 706 1
+57 707 1
+57 708 1
+57 709 1
+57 710 1
+57 711 1
+57 712 1
+57 713 1
+57 714 1
+57 715 1
+57 716 1
+57 717 1
+57 718 1
+57 719 1
+57 720 1
+57 721 1
+57 793 1
+57 800 1
+57 801 1
+57 802 1
+57 803 1
+57 804 1
+57 805 1
+57 877 1
+57 878 1
+57 879 1
+57 880 1
+57 881 1
+57 882 1
+57 898 1
+57 899 1
+57 900 1
+57 901 1
+57 902 1
+57 903 1
+57 904 1
+57 905 1
+57 906 1
+57 907 1
+57 908 1
+57 909 1
+57 910 1
+57 911 1
+57 912 1
+57 1003 1
+57 1004 1
+57 1005 1
+57 1006 1
+57 1007 1
+57 1008 1
+57 1024 1
+57 1025 1
+57 1026 1
+57 1027 1
+57 1028 1
+57 1029 1
+57 1030 1
+57 1031 1
+57 1032 1
+57 1033 1
+57 1034 1
+57 1035 1
+57 1036 1
+57 1037 1
+57 1038 1
+57 1129 1
+57 1130 1
+57 1131 1
+57 1132 1
+57 1133 1
+57 1134 1
+57 1135 1
+57 1136 1
+57 1137 1
+57 1138 1
+57 1139 1
+57 1140 1
+57 1141 1
+57 1142 1
+57 1143 1
+57 1164 1
+57 1165 1
+57 1166 1
+57 1167 1
+57 1168 1
+57 1169 1
+57 1170 1
+57 1171 1
+57 1172 1
+57 1173 1
+57 1174 1
+57 1175 1
+57 1176 1
+57 1177 1
+57 1178 1
+57 1179 1
+57 1180 1
+57 1181 1
+57 1182 1
+57 1183 1
+57 1255 1
+57 1256 1
+57 1257 1
+57 1258 1
+57 1259 1
+57 1260 1
+57 1276 1
+57 1277 1
+57 1278 1
+57 1279 1
+57 1280 1
+57 1281 1
+57 1282 1
+57 1283 1
+57 1284 1
+57 1285 1
+57 1286 1
+57 1287 1
+57 1288 1
+57 1289 1
+57 1290 1
+57 1381 1
+57 1382 1
+57 1383 1
+57 1384 1
+57 1385 1
+57 1386 1
+57 1387 1
+57 1388 1
+57 1389 1
+57 1390 1
+57 1391 1
+57 1392 1
+57 1393 1
+57 1394 1
+57 1395 1
+57 1416 1
+57 1417 1
+57 1418 1
+57 1419 1
+57 1420 1
+57 1421 1
+57 1422 1
+57 1423 1
+57 1424 1
+57 1425 1
+57 1426 1
+57 1427 1
+57 1428 1
+57 1429 1
+57 1430 1
+57 1431 1
+57 1432 1
+57 1433 1
+57 1434 1
+57 1435 1
+57 1507 1
+57 1508 1
+57 1509 1
+57 1510 1
+57 1511 1
+57 1512 1
+57 1513 1
+57 1514 1
+57 1515 1
+57 1516 1
+57 1517 1
+57 1518 1
+57 1519 1
+57 1520 1
+57 1521 1
+57 1542 1
+57 1543 1
+57 1544 1
+57 1545 1
+57 1546 1
+57 1547 1
+57 1548 1
+57 1549 1
+57 1550 1
+57 1551 1
+57 1552 1
+57 1553 1
+57 1554 1
+57 1555 1
+57 1556 1
+57 1557 1
+57 1558 1
+57 1559 1
+57 1560 1
+57 1561 1
+57 1633 1
+57 1634 1
+57 1635 1
+57 1636 1
+57 1637 1
+57 1638 1
+57 1639 1
+57 1640 1
+57 1641 1
+57 1642 1
+57 1643 1
+57 1644 1
+57 1645 1
+57 1646 1
+57 1647 1
+57 1648 1
+57 1649 1
+57 1650 1
+57 1651 1
+57 1652 1
+57 1668 1
+57 1669 1
+57 1670 1
+57 1671 1
+57 1672 1
+57 1673 1
+57 1674 1
+57 1675 1
+57 1676 1
+57 1677 1
+57 1678 1
+57 1679 1
+57 1680 1
+57 1681 1
+57 1682 1
+57 1717 1
+57 1724 1
+57 1725 1
+57 1726 1
+57 1727 1
+57 1728 1
+57 1729 1
+57 1801 1
+57 1802 1
+57 1803 1
+57 1804 1
+57 1805 1
+57 1806 1
+57 1822 1
+57 1823 1
+57 1824 1
+57 1825 1
+57 1826 1
+57 1827 1
+57 1828 1
+57 1829 1
+57 1830 1
+57 1831 1
+57 1832 1
+57 1833 1
+57 1834 1
+57 1835 1
+57 1836 1
+57 1927 1
+57 1928 1
+57 1929 1
+57 1930 1
+57 1931 1
+57 1932 1
+57 1948 1
+57 1949 1
+57 1950 1
+57 1951 1
+57 1952 1
+57 1953 1
+57 1954 1
+57 1955 1
+57 1956 1
+57 1957 1
+57 1958 1
+57 1959 1
+57 1960 1
+57 1961 1
+57 1962 1
+57 2053 1
+57 2054 1
+57 2055 1
+57 2056 1
+57 2057 1
+57 2058 1
+57 2059 1
+57 2060 1
+57 2061 1
+57 2062 1
+57 2063 1
+57 2064 1
+57 2065 1
+57 2066 1
+57 2067 1
+57 2088 1
+57 2089 1
+57 2090 1
+57 2091 1
+57 2092 1
+57 2093 1
+57 2094 1
+57 2095 1
+57 2096 1
+57 2097 1
+57 2098 1
+57 2099 1
+57 2100 1
+57 2101 1
+57 2102 1
+57 2103 1
+57 2104 1
+57 2105 1
+57 2106 1
+57 2107 1
+57 2179 1
+57 2180 1
+57 2181 1
+57 2182 1
+57 2183 1
+57 2184 1
+57 2200 1
+57 2201 1
+57 2202 1
+57 2203 1
+57 2204 1
+57 2205 1
+57 2206 1
+57 2207 1
+57 2208 1
+57 2209 1
+57 2210 1
+57 2211 1
+57 2212 1
+57 2213 1
+57 2214 1
+57 2305 1
+57 2306 1
+57 2307 1
+57 2308 1
+57 2309 1
+57 2310 1
+57 2311 1
+57 2312 1
+57 2313 1
+57 2314 1
+57 2315 1
+57 2316 1
+57 2317 1
+57 2318 1
+57 2319 1
+57 2340 1
+57 2341 1
+57 2342 1
+57 2343 1
+57 2344 1
+57 2345 1
+57 2346 1
+57 2347 1
+57 2348 1
+57 2349 1
+57 2350 1
+57 2351 1
+57 2352 1
+57 2353 1
+57 2354 1
+57 2355 1
+57 2356 1
+57 2357 1
+57 2358 1
+57 2359 1
+57 2431 1
+57 2432 1
+57 2433 1
+57 2434 1
+57 2435 1
+57 2436 1
+57 2437 1
+57 2438 1
+57 2439 1
+57 2440 1
+57 2441 1
+57 2442 1
+57 2443 1
+57 2444 1
+57 2445 1
+57 2466 1
+57 2467 1
+57 2468 1
+57 2469 1
+57 2470 1
+57 2471 1
+57 2472 1
+57 2473 1
+57 2474 1
+57 2475 1
+57 2476 1
+57 2477 1
+57 2478 1
+57 2479 1
+57 2480 1
+57 2481 1
+57 2482 1
+57 2483 1
+57 2484 1
+57 2485 1
+57 2557 1
+57 2558 1
+57 2559 1
+57 2560 1
+57 2561 1
+57 2562 1
+57 2563 1
+57 2564 1
+57 2565 1
+57 2566 1
+57 2567 1
+57 2568 1
+57 2569 1
+57 2570 1
+57 2571 1
+57 2572 1
+57 2573 1
+57 2574 1
+57 2575 1
+57 2576 1
+57 2592 1
+57 2593 1
+57 2594 1
+57 2595 1
+57 2596 1
+57 2597 1
+57 2598 1
+57 2599 1
+57 2600 1
+57 2601 1
+57 2602 1
+57 2603 1
+57 2604 1
+57 2605 1
+57 2606 1
+57 2641 1
+57 2642 1
+57 2643 1
+57 2644 1
+57 2645 1
+57 2646 1
+57 2662 1
+57 2663 1
+57 2664 1
+57 2665 1
+57 2666 1
+57 2667 1
+57 2668 1
+57 2669 1
+57 2670 1
+57 2671 1
+57 2672 1
+57 2673 1
+57 2674 1
+57 2675 1
+57 2676 1
+57 2767 1
+57 2768 1
+57 2769 1
+57 2770 1
+57 2771 1
+57 2772 1
+57 2773 1
+57 2774 1
+57 2775 1
+57 2776 1
+57 2777 1
+57 2778 1
+57 2779 1
+57 2780 1
+57 2781 1
+57 2802 1
+57 2803 1
+57 2804 1
+57 2805 1
+57 2806 1
+57 2807 1
+57 2808 1
+57 2809 1
+57 2810 1
+57 2811 1
+57 2812 1
+57 2813 1
+57 2814 1
+57 2815 1
+57 2816 1
+57 2817 1
+57 2818 1
+57 2819 1
+57 2820 1
+57 2821 1
+57 2893 1
+57 2894 1
+57 2895 1
+57 2896 1
+57 2897 1
+57 2898 1
+57 2899 1
+57 2900 1
+57 2901 1
+57 2902 1
+57 2903 1
+57 2904 1
+57 2905 1
+57 2906 1
+57 2907 1
+57 2928 1
+57 2929 1
+57 2930 1
+57 2931 1
+57 2932 1
+57 2933 1
+57 2934 1
+57 2935 1
+57 2936 1
+57 2937 1
+57 2938 1
+57 2939 1
+57 2940 1
+57 2941 1
+57 2942 1
+57 2943 1
+57 2944 1
+57 2945 1
+57 2946 1
+57 2947 1
+57 3019 1
+57 3020 1
+57 3021 1
+57 3022 1
+57 3023 1
+57 3024 1
+57 3025 1
+57 3026 1
+57 3027 1
+57 3028 1
+57 3029 1
+57 3030 1
+57 3031 1
+57 3032 1
+57 3033 1
+57 3034 1
+57 3035 1
+57 3036 1
+57 3037 1
+57 3038 1
+57 3054 1
+57 3055 1
+57 3056 1
+57 3057 1
+57 3058 1
+57 3059 1
+57 3060 1
+57 3061 1
+57 3062 1
+57 3063 1
+57 3064 1
+57 3065 1
+57 3066 1
+57 3067 1
+57 3068 1
+57 3103 1
+57 3104 1
+57 3105 1
+57 3106 1
+57 3107 1
+57 3108 1
+57 3109 1
+57 3110 1
+57 3111 1
+57 3112 1
+57 3113 1
+57 3114 1
+57 3115 1
+57 3116 1
+57 3117 1
+57 3138 1
+57 3139 1
+57 3140 1
+57 3141 1
+57 3142 1
+57 3143 1
+57 3144 1
+57 3145 1
+57 3146 1
+57 3147 1
+57 3148 1
+57 3149 1
+57 3150 1
+57 3151 1
+57 3152 1
+57 3153 1
+57 3154 1
+57 3155 1
+57 3156 1
+57 3157 1
+57 3229 1
+57 3230 1
+57 3231 1
+57 3232 1
+57 3233 1
+57 3234 1
+57 3235 1
+57 3236 1
+57 3237 1
+57 3238 1
+57 3239 1
+57 3240 1
+57 3241 1
+57 3242 1
+57 3243 1
+57 3244 1
+57 3245 1
+57 3246 1
+57 3247 1
+57 3248 1
+57 3264 1
+57 3265 1
+57 3266 1
+57 3267 1
+57 3268 1
+57 3269 1
+57 3270 1
+57 3271 1
+57 3272 1
+57 3273 1
+57 3274 1
+57 3275 1
+57 3276 1
+57 3277 1
+57 3278 1
+57 3313 1
+57 3314 1
+57 3315 1
+57 3316 1
+57 3317 1
+57 3318 1
+57 3319 1
+57 3320 1
+57 3321 1
+57 3322 1
+57 3323 1
+57 3324 1
+57 3325 1
+57 3326 1
+57 3327 1
+57 3328 1
+57 3329 1
+57 3330 1
+57 3331 1
+57 3332 1
+57 3348 1
+57 3349 1
+57 3350 1
+57 3351 1
+57 3352 1
+57 3353 1
+57 3354 1
+57 3355 1
+57 3356 1
+57 3357 1
+57 3358 1
+57 3359 1
+57 3360 1
+57 3361 1
+57 3362 1
+57 3397 1
+57 3398 1
+57 3399 1
+57 3400 1
+57 3401 1
+57 3402 1
+57 3403 1
+57 3404 1
+57 3405 1
+57 3406 1
+57 3407 1
+57 3408 1
+57 3409 1
+57 3410 1
+57 3411 1
+57 3418 1
+57 3419 1
+57 3420 1
+57 3421 1
+57 3422 1
+57 3423 1
+58 3 1
+58 38 1
+58 44 1
+58 50 1
+58 51 1
+58 52 1
+58 53 1
+58 54 1
+58 122 1
+58 128 1
+58 134 1
+58 135 1
+58 136 1
+58 137 1
+58 138 1
+58 205 1
+58 211 1
+58 212 1
+58 213 1
+58 214 1
+58 215 1
+58 226 1
+58 227 1
+58 228 1
+58 229 1
+58 230 1
+58 241 1
+58 242 1
+58 243 1
+58 244 1
+58 245 1
+58 246 1
+58 247 1
+58 248 1
+58 249 1
+58 250 1
+58 332 1
+58 338 1
+58 344 1
+58 345 1
+58 346 1
+58 347 1
+58 348 1
+58 415 1
+58 421 1
+58 422 1
+58 423 1
+58 424 1
+58 425 1
+58 436 1
+58 437 1
+58 438 1
+58 439 1
+58 440 1
+58 451 1
+58 452 1
+58 453 1
+58 454 1
+58 455 1
+58 456 1
+58 457 1
+58 458 1
+58 459 1
+58 460 1
+58 541 1
+58 547 1
+58 548 1
+58 549 1
+58 550 1
+58 551 1
+58 562 1
+58 563 1
+58 564 1
+58 565 1
+58 566 1
+58 577 1
+58 578 1
+58 579 1
+58 580 1
+58 581 1
+58 582 1
+58 583 1
+58 584 1
+58 585 1
+58 586 1
+58 667 1
+58 668 1
+58 669 1
+58 670 1
+58 671 1
+58 682 1
+58 683 1
+58 684 1
+58 685 1
+58 686 1
+58 687 1
+58 688 1
+58 689 1
+58 690 1
+58 691 1
+58 702 1
+58 703 1
+58 704 1
+58 705 1
+58 706 1
+58 707 1
+58 708 1
+58 709 1
+58 710 1
+58 711 1
+58 722 1
+58 723 1
+58 724 1
+58 725 1
+58 726 1
+58 727 1
+58 728 1
+58 729 1
+58 730 1
+58 731 1
+58 794 1
+58 800 1
+58 806 1
+58 807 1
+58 808 1
+58 809 1
+58 810 1
+58 877 1
+58 883 1
+58 884 1
+58 885 1
+58 886 1
+58 887 1
+58 898 1
+58 899 1
+58 900 1
+58 901 1
+58 902 1
+58 913 1
+58 914 1
+58 915 1
+58 916 1
+58 917 1
+58 918 1
+58 919 1
+58 920 1
+58 921 1
+58 922 1
+58 1003 1
+58 1009 1
+58 1010 1
+58 1011 1
+58 1012 1
+58 1013 1
+58 1024 1
+58 1025 1
+58 1026 1
+58 1027 1
+58 1028 1
+58 1039 1
+58 1040 1
+58 1041 1
+58 1042 1
+58 1043 1
+58 1044 1
+58 1045 1
+58 1046 1
+58 1047 1
+58 1048 1
+58 1129 1
+58 1130 1
+58 1131 1
+58 1132 1
+58 1133 1
+58 1144 1
+58 1145 1
+58 1146 1
+58 1147 1
+58 1148 1
+58 1149 1
+58 1150 1
+58 1151 1
+58 1152 1
+58 1153 1
+58 1164 1
+58 1165 1
+58 1166 1
+58 1167 1
+58 1168 1
+58 1169 1
+58 1170 1
+58 1171 1
+58 1172 1
+58 1173 1
+58 1184 1
+58 1185 1
+58 1186 1
+58 1187 1
+58 1188 1
+58 1189 1
+58 1190 1
+58 1191 1
+58 1192 1
+58 1193 1
+58 1255 1
+58 1261 1
+58 1262 1
+58 1263 1
+58 1264 1
+58 1265 1
+58 1276 1
+58 1277 1
+58 1278 1
+58 1279 1
+58 1280 1
+58 1291 1
+58 1292 1
+58 1293 1
+58 1294 1
+58 1295 1
+58 1296 1
+58 1297 1
+58 1298 1
+58 1299 1
+58 1300 1
+58 1381 1
+58 1382 1
+58 1383 1
+58 1384 1
+58 1385 1
+58 1396 1
+58 1397 1
+58 1398 1
+58 1399 1
+58 1400 1
+58 1401 1
+58 1402 1
+58 1403 1
+58 1404 1
+58 1405 1
+58 1416 1
+58 1417 1
+58 1418 1
+58 1419 1
+58 1420 1
+58 1421 1
+58 1422 1
+58 1423 1
+58 1424 1
+58 1425 1
+58 1436 1
+58 1437 1
+58 1438 1
+58 1439 1
+58 1440 1
+58 1441 1
+58 1442 1
+58 1443 1
+58 1444 1
+58 1445 1
+58 1507 1
+58 1508 1
+58 1509 1
+58 1510 1
+58 1511 1
+58 1522 1
+58 1523 1
+58 1524 1
+58 1525 1
+58 1526 1
+58 1527 1
+58 1528 1
+58 1529 1
+58 1530 1
+58 1531 1
+58 1542 1
+58 1543 1
+58 1544 1
+58 1545 1
+58 1546 1
+58 1547 1
+58 1548 1
+58 1549 1
+58 1550 1
+58 1551 1
+58 1562 1
+58 1563 1
+58 1564 1
+58 1565 1
+58 1566 1
+58 1567 1
+58 1568 1
+58 1569 1
+58 1570 1
+58 1571 1
+58 1633 1
+58 1634 1
+58 1635 1
+58 1636 1
+58 1637 1
+58 1638 1
+58 1639 1
+58 1640 1
+58 1641 1
+58 1642 1
+58 1653 1
+58 1654 1
+58 1655 1
+58 1656 1
+58 1657 1
+58 1658 1
+58 1659 1
+58 1660 1
+58 1661 1
+58 1662 1
+58 1668 1
+58 1669 1
+58 1670 1
+58 1671 1
+58 1672 1
+58 1673 1
+58 1674 1
+58 1675 1
+58 1676 1
+58 1677 1
+58 1683 1
+58 1684 1
+58 1685 1
+58 1686 1
+58 1687 1
+58 1718 1
+58 1724 1
+58 1730 1
+58 1731 1
+58 1732 1
+58 1733 1
+58 1734 1
+58 1801 1
+58 1807 1
+58 1808 1
+58 1809 1
+58 1810 1
+58 1811 1
+58 1822 1
+58 1823 1
+58 1824 1
+58 1825 1
+58 1826 1
+58 1837 1
+58 1838 1
+58 1839 1
+58 1840 1
+58 1841 1
+58 1842 1
+58 1843 1
+58 1844 1
+58 1845 1
+58 1846 1
+58 1927 1
+58 1933 1
+58 1934 1
+58 1935 1
+58 1936 1
+58 1937 1
+58 1948 1
+58 1949 1
+58 1950 1
+58 1951 1
+58 1952 1
+58 1963 1
+58 1964 1
+58 1965 1
+58 1966 1
+58 1967 1
+58 1968 1
+58 1969 1
+58 1970 1
+58 1971 1
+58 1972 1
+58 2053 1
+58 2054 1
+58 2055 1
+58 2056 1
+58 2057 1
+58 2068 1
+58 2069 1
+58 2070 1
+58 2071 1
+58 2072 1
+58 2073 1
+58 2074 1
+58 2075 1
+58 2076 1
+58 2077 1
+58 2088 1
+58 2089 1
+58 2090 1
+58 2091 1
+58 2092 1
+58 2093 1
+58 2094 1
+58 2095 1
+58 2096 1
+58 2097 1
+58 2108 1
+58 2109 1
+58 2110 1
+58 2111 1
+58 2112 1
+58 2113 1
+58 2114 1
+58 2115 1
+58 2116 1
+58 2117 1
+58 2179 1
+58 2185 1
+58 2186 1
+58 2187 1
+58 2188 1
+58 2189 1
+58 2200 1
+58 2201 1
+58 2202 1
+58 2203 1
+58 2204 1
+58 2215 1
+58 2216 1
+58 2217 1
+58 2218 1
+58 2219 1
+58 2220 1
+58 2221 1
+58 2222 1
+58 2223 1
+58 2224 1
+58 2305 1
+58 2306 1
+58 2307 1
+58 2308 1
+58 2309 1
+58 2320 1
+58 2321 1
+58 2322 1
+58 2323 1
+58 2324 1
+58 2325 1
+58 2326 1
+58 2327 1
+58 2328 1
+58 2329 1
+58 2340 1
+58 2341 1
+58 2342 1
+58 2343 1
+58 2344 1
+58 2345 1
+58 2346 1
+58 2347 1
+58 2348 1
+58 2349 1
+58 2360 1
+58 2361 1
+58 2362 1
+58 2363 1
+58 2364 1
+58 2365 1
+58 2366 1
+58 2367 1
+58 2368 1
+58 2369 1
+58 2431 1
+58 2432 1
+58 2433 1
+58 2434 1
+58 2435 1
+58 2446 1
+58 2447 1
+58 2448 1
+58 2449 1
+58 2450 1
+58 2451 1
+58 2452 1
+58 2453 1
+58 2454 1
+58 2455 1
+58 2466 1
+58 2467 1
+58 2468 1
+58 2469 1
+58 2470 1
+58 2471 1
+58 2472 1
+58 2473 1
+58 2474 1
+58 2475 1
+58 2486 1
+58 2487 1
+58 2488 1
+58 2489 1
+58 2490 1
+58 2491 1
+58 2492 1
+58 2493 1
+58 2494 1
+58 2495 1
+58 2557 1
+58 2558 1
+58 2559 1
+58 2560 1
+58 2561 1
+58 2562 1
+58 2563 1
+58 2564 1
+58 2565 1
+58 2566 1
+58 2577 1
+58 2578 1
+58 2579 1
+58 2580 1
+58 2581 1
+58 2582 1
+58 2583 1
+58 2584 1
+58 2585 1
+58 2586 1
+58 2592 1
+58 2593 1
+58 2594 1
+58 2595 1
+58 2596 1
+58 2597 1
+58 2598 1
+58 2599 1
+58 2600 1
+58 2601 1
+58 2607 1
+58 2608 1
+58 2609 1
+58 2610 1
+58 2611 1
+58 2641 1
+58 2647 1
+58 2648 1
+58 2649 1
+58 2650 1
+58 2651 1
+58 2662 1
+58 2663 1
+58 2664 1
+58 2665 1
+58 2666 1
+58 2677 1
+58 2678 1
+58 2679 1
+58 2680 1
+58 2681 1
+58 2682 1
+58 2683 1
+58 2684 1
+58 2685 1
+58 2686 1
+58 2767 1
+58 2768 1
+58 2769 1
+58 2770 1
+58 2771 1
+58 2782 1
+58 2783 1
+58 2784 1
+58 2785 1
+58 2786 1
+58 2787 1
+58 2788 1
+58 2789 1
+58 2790 1
+58 2791 1
+58 2802 1
+58 2803 1
+58 2804 1
+58 2805 1
+58 2806 1
+58 2807 1
+58 2808 1
+58 2809 1
+58 2810 1
+58 2811 1
+58 2822 1
+58 2823 1
+58 2824 1
+58 2825 1
+58 2826 1
+58 2827 1
+58 2828 1
+58 2829 1
+58 2830 1
+58 2831 1
+58 2893 1
+58 2894 1
+58 2895 1
+58 2896 1
+58 2897 1
+58 2908 1
+58 2909 1
+58 2910 1
+58 2911 1
+58 2912 1
+58 2913 1
+58 2914 1
+58 2915 1
+58 2916 1
+58 2917 1
+58 2928 1
+58 2929 1
+58 2930 1
+58 2931 1
+58 2932 1
+58 2933 1
+58 2934 1
+58 2935 1
+58 2936 1
+58 2937 1
+58 2948 1
+58 2949 1
+58 2950 1
+58 2951 1
+58 2952 1
+58 2953 1
+58 2954 1
+58 2955 1
+58 2956 1
+58 2957 1
+58 3019 1
+58 3020 1
+58 3021 1
+58 3022 1
+58 3023 1
+58 3024 1
+58 3025 1
+58 3026 1
+58 3027 1
+58 3028 1
+58 3039 1
+58 3040 1
+58 3041 1
+58 3042 1
+58 3043 1
+58 3044 1
+58 3045 1
+58 3046 1
+58 3047 1
+58 3048 1
+58 3054 1
+58 3055 1
+58 3056 1
+58 3057 1
+58 3058 1
+58 3059 1
+58 3060 1
+58 3061 1
+58 3062 1
+58 3063 1
+58 3069 1
+58 3070 1
+58 3071 1
+58 3072 1
+58 3073 1
+58 3103 1
+58 3104 1
+58 3105 1
+58 3106 1
+58 3107 1
+58 3118 1
+58 3119 1
+58 3120 1
+58 3121 1
+58 3122 1
+58 3123 1
+58 3124 1
+58 3125 1
+58 3126 1
+58 3127 1
+58 3138 1
+58 3139 1
+58 3140 1
+58 3141 1
+58 3142 1
+58 3143 1
+58 3144 1
+58 3145 1
+58 3146 1
+58 3147 1
+58 3158 1
+58 3159 1
+58 3160 1
+58 3161 1
+58 3162 1
+58 3163 1
+58 3164 1
+58 3165 1
+58 3166 1
+58 3167 1
+58 3229 1
+58 3230 1
+58 3231 1
+58 3232 1
+58 3233 1
+58 3234 1
+58 3235 1
+58 3236 1
+58 3237 1
+58 3238 1
+58 3249 1
+58 3250 1
+58 3251 1
+58 3252 1
+58 3253 1
+58 3254 1
+58 3255 1
+58 3256 1
+58 3257 1
+58 3258 1
+58 3264 1
+58 3265 1
+58 3266 1
+58 3267 1
+58 3268 1
+58 3269 1
+58 3270 1
+58 3271 1
+58 3272 1
+58 3273 1
+58 3279 1
+58 3280 1
+58 3281 1
+58 3282 1
+58 3283 1
+58 3313 1
+58 3314 1
+58 3315 1
+58 3316 1
+58 3317 1
+58 3318 1
+58 3319 1
+58 3320 1
+58 3321 1
+58 3322 1
+58 3333 1
+58 3334 1
+58 3335 1
+58 3336 1
+58 3337 1
+58 3338 1
+58 3339 1
+58 3340 1
+58 3341 1
+58 3342 1
+58 3348 1
+58 3349 1
+58 3350 1
+58 3351 1
+58 3352 1
+58 3353 1
+58 3354 1
+58 3355 1
+58 3356 1
+58 3357 1
+58 3363 1
+58 3364 1
+58 3365 1
+58 3366 1
+58 3367 1
+58 3397 1
+58 3398 1
+58 3399 1
+58 3400 1
+58 3401 1
+58 3402 1
+58 3403 1
+58 3404 1
+58 3405 1
+58 3406 1
+58 3412 1
+58 3413 1
+58 3414 1
+58 3415 1
+58 3416 1
+58 3418 1
+58 3419 1
+58 3420 1
+58 3421 1
+58 3422 1
+58 3424 1
+59 4 1
+59 39 1
+59 45 1
+59 50 1
+59 55 1
+59 56 1
+59 57 1
+59 58 1
+59 123 1
+59 129 1
+59 134 1
+59 139 1
+59 140 1
+59 141 1
+59 142 1
+59 206 1
+59 211 1
+59 216 1
+59 217 1
+59 218 1
+59 219 1
+59 226 1
+59 231 1
+59 232 1
+59 233 1
+59 234 1
+59 241 1
+59 242 1
+59 243 1
+59 244 1
+59 251 1
+59 252 1
+59 253 1
+59 254 1
+59 255 1
+59 256 1
+59 333 1
+59 339 1
+59 344 1
+59 349 1
+59 350 1
+59 351 1
+59 352 1
+59 416 1
+59 421 1
+59 426 1
+59 427 1
+59 428 1
+59 429 1
+59 436 1
+59 441 1
+59 442 1
+59 443 1
+59 444 1
+59 451 1
+59 452 1
+59 453 1
+59 454 1
+59 461 1
+59 462 1
+59 463 1
+59 464 1
+59 465 1
+59 466 1
+59 542 1
+59 547 1
+59 552 1
+59 553 1
+59 554 1
+59 555 1
+59 562 1
+59 567 1
+59 568 1
+59 569 1
+59 570 1
+59 577 1
+59 578 1
+59 579 1
+59 580 1
+59 587 1
+59 588 1
+59 589 1
+59 590 1
+59 591 1
+59 592 1
+59 667 1
+59 672 1
+59 673 1
+59 674 1
+59 675 1
+59 682 1
+59 683 1
+59 684 1
+59 685 1
+59 692 1
+59 693 1
+59 694 1
+59 695 1
+59 696 1
+59 697 1
+59 702 1
+59 703 1
+59 704 1
+59 705 1
+59 712 1
+59 713 1
+59 714 1
+59 715 1
+59 716 1
+59 717 1
+59 722 1
+59 723 1
+59 724 1
+59 725 1
+59 726 1
+59 727 1
+59 732 1
+59 733 1
+59 734 1
+59 735 1
+59 795 1
+59 801 1
+59 806 1
+59 811 1
+59 812 1
+59 813 1
+59 814 1
+59 878 1
+59 883 1
+59 888 1
+59 889 1
+59 890 1
+59 891 1
+59 898 1
+59 903 1
+59 904 1
+59 905 1
+59 906 1
+59 913 1
+59 914 1
+59 915 1
+59 916 1
+59 923 1
+59 924 1
+59 925 1
+59 926 1
+59 927 1
+59 928 1
+59 1004 1
+59 1009 1
+59 1014 1
+59 1015 1
+59 1016 1
+59 1017 1
+59 1024 1
+59 1029 1
+59 1030 1
+59 1031 1
+59 1032 1
+59 1039 1
+59 1040 1
+59 1041 1
+59 1042 1
+59 1049 1
+59 1050 1
+59 1051 1
+59 1052 1
+59 1053 1
+59 1054 1
+59 1129 1
+59 1134 1
+59 1135 1
+59 1136 1
+59 1137 1
+59 1144 1
+59 1145 1
+59 1146 1
+59 1147 1
+59 1154 1
+59 1155 1
+59 1156 1
+59 1157 1
+59 1158 1
+59 1159 1
+59 1164 1
+59 1165 1
+59 1166 1
+59 1167 1
+59 1174 1
+59 1175 1
+59 1176 1
+59 1177 1
+59 1178 1
+59 1179 1
+59 1184 1
+59 1185 1
+59 1186 1
+59 1187 1
+59 1188 1
+59 1189 1
+59 1194 1
+59 1195 1
+59 1196 1
+59 1197 1
+59 1256 1
+59 1261 1
+59 1266 1
+59 1267 1
+59 1268 1
+59 1269 1
+59 1276 1
+59 1281 1
+59 1282 1
+59 1283 1
+59 1284 1
+59 1291 1
+59 1292 1
+59 1293 1
+59 1294 1
+59 1301 1
+59 1302 1
+59 1303 1
+59 1304 1
+59 1305 1
+59 1306 1
+59 1381 1
+59 1386 1
+59 1387 1
+59 1388 1
+59 1389 1
+59 1396 1
+59 1397 1
+59 1398 1
+59 1399 1
+59 1406 1
+59 1407 1
+59 1408 1
+59 1409 1
+59 1410 1
+59 1411 1
+59 1416 1
+59 1417 1
+59 1418 1
+59 1419 1
+59 1426 1
+59 1427 1
+59 1428 1
+59 1429 1
+59 1430 1
+59 1431 1
+59 1436 1
+59 1437 1
+59 1438 1
+59 1439 1
+59 1440 1
+59 1441 1
+59 1446 1
+59 1447 1
+59 1448 1
+59 1449 1
+59 1507 1
+59 1512 1
+59 1513 1
+59 1514 1
+59 1515 1
+59 1522 1
+59 1523 1
+59 1524 1
+59 1525 1
+59 1532 1
+59 1533 1
+59 1534 1
+59 1535 1
+59 1536 1
+59 1537 1
+59 1542 1
+59 1543 1
+59 1544 1
+59 1545 1
+59 1552 1
+59 1553 1
+59 1554 1
+59 1555 1
+59 1556 1
+59 1557 1
+59 1562 1
+59 1563 1
+59 1564 1
+59 1565 1
+59 1566 1
+59 1567 1
+59 1572 1
+59 1573 1
+59 1574 1
+59 1575 1
+59 1633 1
+59 1634 1
+59 1635 1
+59 1636 1
+59 1643 1
+59 1644 1
+59 1645 1
+59 1646 1
+59 1647 1
+59 1648 1
+59 1653 1
+59 1654 1
+59 1655 1
+59 1656 1
+59 1657 1
+59 1658 1
+59 1663 1
+59 1664 1
+59 1665 1
+59 1666 1
+59 1668 1
+59 1669 1
+59 1670 1
+59 1671 1
+59 1672 1
+59 1673 1
+59 1678 1
+59 1679 1
+59 1680 1
+59 1681 1
+59 1683 1
+59 1684 1
+59 1685 1
+59 1686 1
+59 1688 1
+59 1719 1
+59 1725 1
+59 1730 1
+59 1735 1
+59 1736 1
+59 1737 1
+59 1738 1
+59 1802 1
+59 1807 1
+59 1812 1
+59 1813 1
+59 1814 1
+59 1815 1
+59 1822 1
+59 1827 1
+59 1828 1
+59 1829 1
+59 1830 1
+59 1837 1
+59 1838 1
+59 1839 1
+59 1840 1
+59 1847 1
+59 1848 1
+59 1849 1
+59 1850 1
+59 1851 1
+59 1852 1
+59 1928 1
+59 1933 1
+59 1938 1
+59 1939 1
+59 1940 1
+59 1941 1
+59 1948 1
+59 1953 1
+59 1954 1
+59 1955 1
+59 1956 1
+59 1963 1
+59 1964 1
+59 1965 1
+59 1966 1
+59 1973 1
+59 1974 1
+59 1975 1
+59 1976 1
+59 1977 1
+59 1978 1
+59 2053 1
+59 2058 1
+59 2059 1
+59 2060 1
+59 2061 1
+59 2068 1
+59 2069 1
+59 2070 1
+59 2071 1
+59 2078 1
+59 2079 1
+59 2080 1
+59 2081 1
+59 2082 1
+59 2083 1
+59 2088 1
+59 2089 1
+59 2090 1
+59 2091 1
+59 2098 1
+59 2099 1
+59 2100 1
+59 2101 1
+59 2102 1
+59 2103 1
+59 2108 1
+59 2109 1
+59 2110 1
+59 2111 1
+59 2112 1
+59 2113 1
+59 2118 1
+59 2119 1
+59 2120 1
+59 2121 1
+59 2180 1
+59 2185 1
+59 2190 1
+59 2191 1
+59 2192 1
+59 2193 1
+59 2200 1
+59 2205 1
+59 2206 1
+59 2207 1
+59 2208 1
+59 2215 1
+59 2216 1
+59 2217 1
+59 2218 1
+59 2225 1
+59 2226 1
+59 2227 1
+59 2228 1
+59 2229 1
+59 2230 1
+59 2305 1
+59 2310 1
+59 2311 1
+59 2312 1
+59 2313 1
+59 2320 1
+59 2321 1
+59 2322 1
+59 2323 1
+59 2330 1
+59 2331 1
+59 2332 1
+59 2333 1
+59 2334 1
+59 2335 1
+59 2340 1
+59 2341 1
+59 2342 1
+59 2343 1
+59 2350 1
+59 2351 1
+59 2352 1
+59 2353 1
+59 2354 1
+59 2355 1
+59 2360 1
+59 2361 1
+59 2362 1
+59 2363 1
+59 2364 1
+59 2365 1
+59 2370 1
+59 2371 1
+59 2372 1
+59 2373 1
+59 2431 1
+59 2436 1
+59 2437 1
+59 2438 1
+59 2439 1
+59 2446 1
+59 2447 1
+59 2448 1
+59 2449 1
+59 2456 1
+59 2457 1
+59 2458 1
+59 2459 1
+59 2460 1
+59 2461 1
+59 2466 1
+59 2467 1
+59 2468 1
+59 2469 1
+59 2476 1
+59 2477 1
+59 2478 1
+59 2479 1
+59 2480 1
+59 2481 1
+59 2486 1
+59 2487 1
+59 2488 1
+59 2489 1
+59 2490 1
+59 2491 1
+59 2496 1
+59 2497 1
+59 2498 1
+59 2499 1
+59 2557 1
+59 2558 1
+59 2559 1
+59 2560 1
+59 2567 1
+59 2568 1
+59 2569 1
+59 2570 1
+59 2571 1
+59 2572 1
+59 2577 1
+59 2578 1
+59 2579 1
+59 2580 1
+59 2581 1
+59 2582 1
+59 2587 1
+59 2588 1
+59 2589 1
+59 2590 1
+59 2592 1
+59 2593 1
+59 2594 1
+59 2595 1
+59 2596 1
+59 2597 1
+59 2602 1
+59 2603 1
+59 2604 1
+59 2605 1
+59 2607 1
+59 2608 1
+59 2609 1
+59 2610 1
+59 2612 1
+59 2642 1
+59 2647 1
+59 2652 1
+59 2653 1
+59 2654 1
+59 2655 1
+59 2662 1
+59 2667 1
+59 2668 1
+59 2669 1
+59 2670 1
+59 2677 1
+59 2678 1
+59 2679 1
+59 2680 1
+59 2687 1
+59 2688 1
+59 2689 1
+59 2690 1
+59 2691 1
+59 2692 1
+59 2767 1
+59 2772 1
+59 2773 1
+59 2774 1
+59 2775 1
+59 2782 1
+59 2783 1
+59 2784 1
+59 2785 1
+59 2792 1
+59 2793 1
+59 2794 1
+59 2795 1
+59 2796 1
+59 2797 1
+59 2802 1
+59 2803 1
+59 2804 1
+59 2805 1
+59 2812 1
+59 2813 1
+59 2814 1
+59 2815 1
+59 2816 1
+59 2817 1
+59 2822 1
+59 2823 1
+59 2824 1
+59 2825 1
+59 2826 1
+59 2827 1
+59 2832 1
+59 2833 1
+59 2834 1
+59 2835 1
+59 2893 1
+59 2898 1
+59 2899 1
+59 2900 1
+59 2901 1
+59 2908 1
+59 2909 1
+59 2910 1
+59 2911 1
+59 2918 1
+59 2919 1
+59 2920 1
+59 2921 1
+59 2922 1
+59 2923 1
+59 2928 1
+59 2929 1
+59 2930 1
+59 2931 1
+59 2938 1
+59 2939 1
+59 2940 1
+59 2941 1
+59 2942 1
+59 2943 1
+59 2948 1
+59 2949 1
+59 2950 1
+59 2951 1
+59 2952 1
+59 2953 1
+59 2958 1
+59 2959 1
+59 2960 1
+59 2961 1
+59 3019 1
+59 3020 1
+59 3021 1
+59 3022 1
+59 3029 1
+59 3030 1
+59 3031 1
+59 3032 1
+59 3033 1
+59 3034 1
+59 3039 1
+59 3040 1
+59 3041 1
+59 3042 1
+59 3043 1
+59 3044 1
+59 3049 1
+59 3050 1
+59 3051 1
+59 3052 1
+59 3054 1
+59 3055 1
+59 3056 1
+59 3057 1
+59 3058 1
+59 3059 1
+59 3064 1
+59 3065 1
+59 3066 1
+59 3067 1
+59 3069 1
+59 3070 1
+59 3071 1
+59 3072 1
+59 3074 1
+59 3103 1
+59 3108 1
+59 3109 1
+59 3110 1
+59 3111 1
+59 3118 1
+59 3119 1
+59 3120 1
+59 3121 1
+59 3128 1
+59 3129 1
+59 3130 1
+59 3131 1
+59 3132 1
+59 3133 1
+59 3138 1
+59 3139 1
+59 3140 1
+59 3141 1
+59 3148 1
+59 3149 1
+59 3150 1
+59 3151 1
+59 3152 1
+59 3153 1
+59 3158 1
+59 3159 1
+59 3160 1
+59 3161 1
+59 3162 1
+59 3163 1
+59 3168 1
+59 3169 1
+59 3170 1
+59 3171 1
+59 3229 1
+59 3230 1
+59 3231 1
+59 3232 1
+59 3239 1
+59 3240 1
+59 3241 1
+59 3242 1
+59 3243 1
+59 3244 1
+59 3249 1
+59 3250 1
+59 3251 1
+59 3252 1
+59 3253 1
+59 3254 1
+59 3259 1
+59 3260 1
+59 3261 1
+59 3262 1
+59 3264 1
+59 3265 1
+59 3266 1
+59 3267 1
+59 3268 1
+59 3269 1
+59 3274 1
+59 3275 1
+59 3276 1
+59 3277 1
+59 3279 1
+59 3280 1
+59 3281 1
+59 3282 1
+59 3284 1
+59 3313 1
+59 3314 1
+59 3315 1
+59 3316 1
+59 3323 1
+59 3324 1
+59 3325 1
+59 3326 1
+59 3327 1
+59 3328 1
+59 3333 1
+59 3334 1
+59 3335 1
+59 3336 1
+59 3337 1
+59 3338 1
+59 3343 1
+59 3344 1
+59 3345 1
+59 3346 1
+59 3348 1
+59 3349 1
+59 3350 1
+59 3351 1
+59 3352 1
+59 3353 1
+59 3358 1
+59 3359 1
+59 3360 1
+59 3361 1
+59 3363 1
+59 3364 1
+59 3365 1
+59 3366 1
+59 3368 1
+59 3397 1
+59 3398 1
+59 3399 1
+59 3400 1
+59 3401 1
+59 3402 1
+59 3407 1
+59 3408 1
+59 3409 1
+59 3410 1
+59 3412 1
+59 3413 1
+59 3414 1
+59 3415 1
+59 3417 1
+59 3418 1
+59 3419 1
+59 3420 1
+59 3421 1
+59 3423 1
+59 3424 1
+60 5 1
+60 40 1
+60 46 1
+60 51 1
+60 55 1
+60 59 1
+60 60 1
+60 61 1
+60 124 1
+60 130 1
+60 135 1
+60 139 1
+60 143 1
+60 144 1
+60 145 1
+60 207 1
+60 212 1
+60 216 1
+60 220 1
+60 221 1
+60 222 1
+60 227 1
+60 231 1
+60 235 1
+60 236 1
+60 237 1
+60 241 1
+60 245 1
+60 246 1
+60 247 1
+60 251 1
+60 252 1
+60 253 1
+60 257 1
+60 258 1
+60 259 1
+60 334 1
+60 340 1
+60 345 1
+60 349 1
+60 353 1
+60 354 1
+60 355 1
+60 417 1
+60 422 1
+60 426 1
+60 430 1
+60 431 1
+60 432 1
+60 437 1
+60 441 1
+60 445 1
+60 446 1
+60 447 1
+60 451 1
+60 455 1
+60 456 1
+60 457 1
+60 461 1
+60 462 1
+60 463 1
+60 467 1
+60 468 1
+60 469 1
+60 543 1
+60 548 1
+60 552 1
+60 556 1
+60 557 1
+60 558 1
+60 563 1
+60 567 1
+60 571 1
+60 572 1
+60 573 1
+60 577 1
+60 581 1
+60 582 1
+60 583 1
+60 587 1
+60 588 1
+60 589 1
+60 593 1
+60 594 1
+60 595 1
+60 668 1
+60 672 1
+60 676 1
+60 677 1
+60 678 1
+60 682 1
+60 686 1
+60 687 1
+60 688 1
+60 692 1
+60 693 1
+60 694 1
+60 698 1
+60 699 1
+60 700 1
+60 702 1
+60 706 1
+60 707 1
+60 708 1
+60 712 1
+60 713 1
+60 714 1
+60 718 1
+60 719 1
+60 720 1
+60 722 1
+60 723 1
+60 724 1
+60 728 1
+60 729 1
+60 730 1
+60 732 1
+60 733 1
+60 734 1
+60 736 1
+60 796 1
+60 802 1
+60 807 1
+60 811 1
+60 815 1
+60 816 1
+60 817 1
+60 879 1
+60 884 1
+60 888 1
+60 892 1
+60 893 1
+60 894 1
+60 899 1
+60 903 1
+60 907 1
+60 908 1
+60 909 1
+60 913 1
+60 917 1
+60 918 1
+60 919 1
+60 923 1
+60 924 1
+60 925 1
+60 929 1
+60 930 1
+60 931 1
+60 1005 1
+60 1010 1
+60 1014 1
+60 1018 1
+60 1019 1
+60 1020 1
+60 1025 1
+60 1029 1
+60 1033 1
+60 1034 1
+60 1035 1
+60 1039 1
+60 1043 1
+60 1044 1
+60 1045 1
+60 1049 1
+60 1050 1
+60 1051 1
+60 1055 1
+60 1056 1
+60 1057 1
+60 1130 1
+60 1134 1
+60 1138 1
+60 1139 1
+60 1140 1
+60 1144 1
+60 1148 1
+60 1149 1
+60 1150 1
+60 1154 1
+60 1155 1
+60 1156 1
+60 1160 1
+60 1161 1
+60 1162 1
+60 1164 1
+60 1168 1
+60 1169 1
+60 1170 1
+60 1174 1
+60 1175 1
+60 1176 1
+60 1180 1
+60 1181 1
+60 1182 1
+60 1184 1
+60 1185 1
+60 1186 1
+60 1190 1
+60 1191 1
+60 1192 1
+60 1194 1
+60 1195 1
+60 1196 1
+60 1198 1
+60 1257 1
+60 1262 1
+60 1266 1
+60 1270 1
+60 1271 1
+60 1272 1
+60 1277 1
+60 1281 1
+60 1285 1
+60 1286 1
+60 1287 1
+60 1291 1
+60 1295 1
+60 1296 1
+60 1297 1
+60 1301 1
+60 1302 1
+60 1303 1
+60 1307 1
+60 1308 1
+60 1309 1
+60 1382 1
+60 1386 1
+60 1390 1
+60 1391 1
+60 1392 1
+60 1396 1
+60 1400 1
+60 1401 1
+60 1402 1
+60 1406 1
+60 1407 1
+60 1408 1
+60 1412 1
+60 1413 1
+60 1414 1
+60 1416 1
+60 1420 1
+60 1421 1
+60 1422 1
+60 1426 1
+60 1427 1
+60 1428 1
+60 1432 1
+60 1433 1
+60 1434 1
+60 1436 1
+60 1437 1
+60 1438 1
+60 1442 1
+60 1443 1
+60 1444 1
+60 1446 1
+60 1447 1
+60 1448 1
+60 1450 1
+60 1508 1
+60 1512 1
+60 1516 1
+60 1517 1
+60 1518 1
+60 1522 1
+60 1526 1
+60 1527 1
+60 1528 1
+60 1532 1
+60 1533 1
+60 1534 1
+60 1538 1
+60 1539 1
+60 1540 1
+60 1542 1
+60 1546 1
+60 1547 1
+60 1548 1
+60 1552 1
+60 1553 1
+60 1554 1
+60 1558 1
+60 1559 1
+60 1560 1
+60 1562 1
+60 1563 1
+60 1564 1
+60 1568 1
+60 1569 1
+60 1570 1
+60 1572 1
+60 1573 1
+60 1574 1
+60 1576 1
+60 1633 1
+60 1637 1
+60 1638 1
+60 1639 1
+60 1643 1
+60 1644 1
+60 1645 1
+60 1649 1
+60 1650 1
+60 1651 1
+60 1653 1
+60 1654 1
+60 1655 1
+60 1659 1
+60 1660 1
+60 1661 1
+60 1663 1
+60 1664 1
+60 1665 1
+60 1667 1
+60 1668 1
+60 1669 1
+60 1670 1
+60 1674 1
+60 1675 1
+60 1676 1
+60 1678 1
+60 1679 1
+60 1680 1
+60 1682 1
+60 1683 1
+60 1684 1
+60 1685 1
+60 1687 1
+60 1688 1
+60 1720 1
+60 1726 1
+60 1731 1
+60 1735 1
+60 1739 1
+60 1740 1
+60 1741 1
+60 1803 1
+60 1808 1
+60 1812 1
+60 1816 1
+60 1817 1
+60 1818 1
+60 1823 1
+60 1827 1
+60 1831 1
+60 1832 1
+60 1833 1
+60 1837 1
+60 1841 1
+60 1842 1
+60 1843 1
+60 1847 1
+60 1848 1
+60 1849 1
+60 1853 1
+60 1854 1
+60 1855 1
+60 1929 1
+60 1934 1
+60 1938 1
+60 1942 1
+60 1943 1
+60 1944 1
+60 1949 1
+60 1953 1
+60 1957 1
+60 1958 1
+60 1959 1
+60 1963 1
+60 1967 1
+60 1968 1
+60 1969 1
+60 1973 1
+60 1974 1
+60 1975 1
+60 1979 1
+60 1980 1
+60 1981 1
+60 2054 1
+60 2058 1
+60 2062 1
+60 2063 1
+60 2064 1
+60 2068 1
+60 2072 1
+60 2073 1
+60 2074 1
+60 2078 1
+60 2079 1
+60 2080 1
+60 2084 1
+60 2085 1
+60 2086 1
+60 2088 1
+60 2092 1
+60 2093 1
+60 2094 1
+60 2098 1
+60 2099 1
+60 2100 1
+60 2104 1
+60 2105 1
+60 2106 1
+60 2108 1
+60 2109 1
+60 2110 1
+60 2114 1
+60 2115 1
+60 2116 1
+60 2118 1
+60 2119 1
+60 2120 1
+60 2122 1
+60 2181 1
+60 2186 1
+60 2190 1
+60 2194 1
+60 2195 1
+60 2196 1
+60 2201 1
+60 2205 1
+60 2209 1
+60 2210 1
+60 2211 1
+60 2215 1
+60 2219 1
+60 2220 1
+60 2221 1
+60 2225 1
+60 2226 1
+60 2227 1
+60 2231 1
+60 2232 1
+60 2233 1
+60 2306 1
+60 2310 1
+60 2314 1
+60 2315 1
+60 2316 1
+60 2320 1
+60 2324 1
+60 2325 1
+60 2326 1
+60 2330 1
+60 2331 1
+60 2332 1
+60 2336 1
+60 2337 1
+60 2338 1
+60 2340 1
+60 2344 1
+60 2345 1
+60 2346 1
+60 2350 1
+60 2351 1
+60 2352 1
+60 2356 1
+60 2357 1
+60 2358 1
+60 2360 1
+60 2361 1
+60 2362 1
+60 2366 1
+60 2367 1
+60 2368 1
+60 2370 1
+60 2371 1
+60 2372 1
+60 2374 1
+60 2432 1
+60 2436 1
+60 2440 1
+60 2441 1
+60 2442 1
+60 2446 1
+60 2450 1
+60 2451 1
+60 2452 1
+60 2456 1
+60 2457 1
+60 2458 1
+60 2462 1
+60 2463 1
+60 2464 1
+60 2466 1
+60 2470 1
+60 2471 1
+60 2472 1
+60 2476 1
+60 2477 1
+60 2478 1
+60 2482 1
+60 2483 1
+60 2484 1
+60 2486 1
+60 2487 1
+60 2488 1
+60 2492 1
+60 2493 1
+60 2494 1
+60 2496 1
+60 2497 1
+60 2498 1
+60 2500 1
+60 2557 1
+60 2561 1
+60 2562 1
+60 2563 1
+60 2567 1
+60 2568 1
+60 2569 1
+60 2573 1
+60 2574 1
+60 2575 1
+60 2577 1
+60 2578 1
+60 2579 1
+60 2583 1
+60 2584 1
+60 2585 1
+60 2587 1
+60 2588 1
+60 2589 1
+60 2591 1
+60 2592 1
+60 2593 1
+60 2594 1
+60 2598 1
+60 2599 1
+60 2600 1
+60 2602 1
+60 2603 1
+60 2604 1
+60 2606 1
+60 2607 1
+60 2608 1
+60 2609 1
+60 2611 1
+60 2612 1
+60 2643 1
+60 2648 1
+60 2652 1
+60 2656 1
+60 2657 1
+60 2658 1
+60 2663 1
+60 2667 1
+60 2671 1
+60 2672 1
+60 2673 1
+60 2677 1
+60 2681 1
+60 2682 1
+60 2683 1
+60 2687 1
+60 2688 1
+60 2689 1
+60 2693 1
+60 2694 1
+60 2695 1
+60 2768 1
+60 2772 1
+60 2776 1
+60 2777 1
+60 2778 1
+60 2782 1
+60 2786 1
+60 2787 1
+60 2788 1
+60 2792 1
+60 2793 1
+60 2794 1
+60 2798 1
+60 2799 1
+60 2800 1
+60 2802 1
+60 2806 1
+60 2807 1
+60 2808 1
+60 2812 1
+60 2813 1
+60 2814 1
+60 2818 1
+60 2819 1
+60 2820 1
+60 2822 1
+60 2823 1
+60 2824 1
+60 2828 1
+60 2829 1
+60 2830 1
+60 2832 1
+60 2833 1
+60 2834 1
+60 2836 1
+60 2894 1
+60 2898 1
+60 2902 1
+60 2903 1
+60 2904 1
+60 2908 1
+60 2912 1
+60 2913 1
+60 2914 1
+60 2918 1
+60 2919 1
+60 2920 1
+60 2924 1
+60 2925 1
+60 2926 1
+60 2928 1
+60 2932 1
+60 2933 1
+60 2934 1
+60 2938 1
+60 2939 1
+60 2940 1
+60 2944 1
+60 2945 1
+60 2946 1
+60 2948 1
+60 2949 1
+60 2950 1
+60 2954 1
+60 2955 1
+60 2956 1
+60 2958 1
+60 2959 1
+60 2960 1
+60 2962 1
+60 3019 1
+60 3023 1
+60 3024 1
+60 3025 1
+60 3029 1
+60 3030 1
+60 3031 1
+60 3035 1
+60 3036 1
+60 3037 1
+60 3039 1
+60 3040 1
+60 3041 1
+60 3045 1
+60 3046 1
+60 3047 1
+60 3049 1
+60 3050 1
+60 3051 1
+60 3053 1
+60 3054 1
+60 3055 1
+60 3056 1
+60 3060 1
+60 3061 1
+60 3062 1
+60 3064 1
+60 3065 1
+60 3066 1
+60 3068 1
+60 3069 1
+60 3070 1
+60 3071 1
+60 3073 1
+60 3074 1
+60 3104 1
+60 3108 1
+60 3112 1
+60 3113 1
+60 3114 1
+60 3118 1
+60 3122 1
+60 3123 1
+60 3124 1
+60 3128 1
+60 3129 1
+60 3130 1
+60 3134 1
+60 3135 1
+60 3136 1
+60 3138 1
+60 3142 1
+60 3143 1
+60 3144 1
+60 3148 1
+60 3149 1
+60 3150 1
+60 3154 1
+60 3155 1
+60 3156 1
+60 3158 1
+60 3159 1
+60 3160 1
+60 3164 1
+60 3165 1
+60 3166 1
+60 3168 1
+60 3169 1
+60 3170 1
+60 3172 1
+60 3229 1
+60 3233 1
+60 3234 1
+60 3235 1
+60 3239 1
+60 3240 1
+60 3241 1
+60 3245 1
+60 3246 1
+60 3247 1
+60 3249 1
+60 3250 1
+60 3251 1
+60 3255 1
+60 3256 1
+60 3257 1
+60 3259 1
+60 3260 1
+60 3261 1
+60 3263 1
+60 3264 1
+60 3265 1
+60 3266 1
+60 3270 1
+60 3271 1
+60 3272 1
+60 3274 1
+60 3275 1
+60 3276 1
+60 3278 1
+60 3279 1
+60 3280 1
+60 3281 1
+60 3283 1
+60 3284 1
+60 3313 1
+60 3317 1
+60 3318 1
+60 3319 1
+60 3323 1
+60 3324 1
+60 3325 1
+60 3329 1
+60 3330 1
+60 3331 1
+60 3333 1
+60 3334 1
+60 3335 1
+60 3339 1
+60 3340 1
+60 3341 1
+60 3343 1
+60 3344 1
+60 3345 1
+60 3347 1
+60 3348 1
+60 3349 1
+60 3350 1
+60 3354 1
+60 3355 1
+60 3356 1
+60 3358 1
+60 3359 1
+60 3360 1
+60 3362 1
+60 3363 1
+60 3364 1
+60 3365 1
+60 3367 1
+60 3368 1
+60 3397 1
+60 3398 1
+60 3399 1
+60 3403 1
+60 3404 1
+60 3405 1
+60 3407 1
+60 3408 1
+60 3409 1
+60 3411 1
+60 3412 1
+60 3413 1
+60 3414 1
+60 3416 1
+60 3417 1
+60 3418 1
+60 3419 1
+60 3420 1
+60 3422 1
+60 3423 1
+60 3424 1
+61 6 1
+61 41 1
+61 47 1
+61 52 1
+61 56 1
+61 59 1
+61 62 1
+61 63 1
+61 125 1
+61 131 1
+61 136 1
+61 140 1
+61 143 1
+61 146 1
+61 147 1
+61 208 1
+61 213 1
+61 217 1
+61 220 1
+61 223 1
+61 224 1
+61 228 1
+61 232 1
+61 235 1
+61 238 1
+61 239 1
+61 242 1
+61 245 1
+61 248 1
+61 249 1
+61 251 1
+61 254 1
+61 255 1
+61 257 1
+61 258 1
+61 260 1
+61 335 1
+61 341 1
+61 346 1
+61 350 1
+61 353 1
+61 356 1
+61 357 1
+61 418 1
+61 423 1
+61 427 1
+61 430 1
+61 433 1
+61 434 1
+61 438 1
+61 442 1
+61 445 1
+61 448 1
+61 449 1
+61 452 1
+61 455 1
+61 458 1
+61 459 1
+61 461 1
+61 464 1
+61 465 1
+61 467 1
+61 468 1
+61 470 1
+61 544 1
+61 549 1
+61 553 1
+61 556 1
+61 559 1
+61 560 1
+61 564 1
+61 568 1
+61 571 1
+61 574 1
+61 575 1
+61 578 1
+61 581 1
+61 584 1
+61 585 1
+61 587 1
+61 590 1
+61 591 1
+61 593 1
+61 594 1
+61 596 1
+61 669 1
+61 673 1
+61 676 1
+61 679 1
+61 680 1
+61 683 1
+61 686 1
+61 689 1
+61 690 1
+61 692 1
+61 695 1
+61 696 1
+61 698 1
+61 699 1
+61 701 1
+61 703 1
+61 706 1
+61 709 1
+61 710 1
+61 712 1
+61 715 1
+61 716 1
+61 718 1
+61 719 1
+61 721 1
+61 722 1
+61 725 1
+61 726 1
+61 728 1
+61 729 1
+61 731 1
+61 732 1
+61 733 1
+61 735 1
+61 736 1
+61 797 1
+61 803 1
+61 808 1
+61 812 1
+61 815 1
+61 818 1
+61 819 1
+61 880 1
+61 885 1
+61 889 1
+61 892 1
+61 895 1
+61 896 1
+61 900 1
+61 904 1
+61 907 1
+61 910 1
+61 911 1
+61 914 1
+61 917 1
+61 920 1
+61 921 1
+61 923 1
+61 926 1
+61 927 1
+61 929 1
+61 930 1
+61 932 1
+61 1006 1
+61 1011 1
+61 1015 1
+61 1018 1
+61 1021 1
+61 1022 1
+61 1026 1
+61 1030 1
+61 1033 1
+61 1036 1
+61 1037 1
+61 1040 1
+61 1043 1
+61 1046 1
+61 1047 1
+61 1049 1
+61 1052 1
+61 1053 1
+61 1055 1
+61 1056 1
+61 1058 1
+61 1131 1
+61 1135 1
+61 1138 1
+61 1141 1
+61 1142 1
+61 1145 1
+61 1148 1
+61 1151 1
+61 1152 1
+61 1154 1
+61 1157 1
+61 1158 1
+61 1160 1
+61 1161 1
+61 1163 1
+61 1165 1
+61 1168 1
+61 1171 1
+61 1172 1
+61 1174 1
+61 1177 1
+61 1178 1
+61 1180 1
+61 1181 1
+61 1183 1
+61 1184 1
+61 1187 1
+61 1188 1
+61 1190 1
+61 1191 1
+61 1193 1
+61 1194 1
+61 1195 1
+61 1197 1
+61 1198 1
+61 1258 1
+61 1263 1
+61 1267 1
+61 1270 1
+61 1273 1
+61 1274 1
+61 1278 1
+61 1282 1
+61 1285 1
+61 1288 1
+61 1289 1
+61 1292 1
+61 1295 1
+61 1298 1
+61 1299 1
+61 1301 1
+61 1304 1
+61 1305 1
+61 1307 1
+61 1308 1
+61 1310 1
+61 1383 1
+61 1387 1
+61 1390 1
+61 1393 1
+61 1394 1
+61 1397 1
+61 1400 1
+61 1403 1
+61 1404 1
+61 1406 1
+61 1409 1
+61 1410 1
+61 1412 1
+61 1413 1
+61 1415 1
+61 1417 1
+61 1420 1
+61 1423 1
+61 1424 1
+61 1426 1
+61 1429 1
+61 1430 1
+61 1432 1
+61 1433 1
+61 1435 1
+61 1436 1
+61 1439 1
+61 1440 1
+61 1442 1
+61 1443 1
+61 1445 1
+61 1446 1
+61 1447 1
+61 1449 1
+61 1450 1
+61 1509 1
+61 1513 1
+61 1516 1
+61 1519 1
+61 1520 1
+61 1523 1
+61 1526 1
+61 1529 1
+61 1530 1
+61 1532 1
+61 1535 1
+61 1536 1
+61 1538 1
+61 1539 1
+61 1541 1
+61 1543 1
+61 1546 1
+61 1549 1
+61 1550 1
+61 1552 1
+61 1555 1
+61 1556 1
+61 1558 1
+61 1559 1
+61 1561 1
+61 1562 1
+61 1565 1
+61 1566 1
+61 1568 1
+61 1569 1
+61 1571 1
+61 1572 1
+61 1573 1
+61 1575 1
+61 1576 1
+61 1634 1
+61 1637 1
+61 1640 1
+61 1641 1
+61 1643 1
+61 1646 1
+61 1647 1
+61 1649 1
+61 1650 1
+61 1652 1
+61 1653 1
+61 1656 1
+61 1657 1
+61 1659 1
+61 1660 1
+61 1662 1
+61 1663 1
+61 1664 1
+61 1666 1
+61 1667 1
+61 1668 1
+61 1671 1
+61 1672 1
+61 1674 1
+61 1675 1
+61 1677 1
+61 1678 1
+61 1679 1
+61 1681 1
+61 1682 1
+61 1683 1
+61 1684 1
+61 1686 1
+61 1687 1
+61 1688 1
+61 1721 1
+61 1727 1
+61 1732 1
+61 1736 1
+61 1739 1
+61 1742 1
+61 1743 1
+61 1804 1
+61 1809 1
+61 1813 1
+61 1816 1
+61 1819 1
+61 1820 1
+61 1824 1
+61 1828 1
+61 1831 1
+61 1834 1
+61 1835 1
+61 1838 1
+61 1841 1
+61 1844 1
+61 1845 1
+61 1847 1
+61 1850 1
+61 1851 1
+61 1853 1
+61 1854 1
+61 1856 1
+61 1930 1
+61 1935 1
+61 1939 1
+61 1942 1
+61 1945 1
+61 1946 1
+61 1950 1
+61 1954 1
+61 1957 1
+61 1960 1
+61 1961 1
+61 1964 1
+61 1967 1
+61 1970 1
+61 1971 1
+61 1973 1
+61 1976 1
+61 1977 1
+61 1979 1
+61 1980 1
+61 1982 1
+61 2055 1
+61 2059 1
+61 2062 1
+61 2065 1
+61 2066 1
+61 2069 1
+61 2072 1
+61 2075 1
+61 2076 1
+61 2078 1
+61 2081 1
+61 2082 1
+61 2084 1
+61 2085 1
+61 2087 1
+61 2089 1
+61 2092 1
+61 2095 1
+61 2096 1
+61 2098 1
+61 2101 1
+61 2102 1
+61 2104 1
+61 2105 1
+61 2107 1
+61 2108 1
+61 2111 1
+61 2112 1
+61 2114 1
+61 2115 1
+61 2117 1
+61 2118 1
+61 2119 1
+61 2121 1
+61 2122 1
+61 2182 1
+61 2187 1
+61 2191 1
+61 2194 1
+61 2197 1
+61 2198 1
+61 2202 1
+61 2206 1
+61 2209 1
+61 2212 1
+61 2213 1
+61 2216 1
+61 2219 1
+61 2222 1
+61 2223 1
+61 2225 1
+61 2228 1
+61 2229 1
+61 2231 1
+61 2232 1
+61 2234 1
+61 2307 1
+61 2311 1
+61 2314 1
+61 2317 1
+61 2318 1
+61 2321 1
+61 2324 1
+61 2327 1
+61 2328 1
+61 2330 1
+61 2333 1
+61 2334 1
+61 2336 1
+61 2337 1
+61 2339 1
+61 2341 1
+61 2344 1
+61 2347 1
+61 2348 1
+61 2350 1
+61 2353 1
+61 2354 1
+61 2356 1
+61 2357 1
+61 2359 1
+61 2360 1
+61 2363 1
+61 2364 1
+61 2366 1
+61 2367 1
+61 2369 1
+61 2370 1
+61 2371 1
+61 2373 1
+61 2374 1
+61 2433 1
+61 2437 1
+61 2440 1
+61 2443 1
+61 2444 1
+61 2447 1
+61 2450 1
+61 2453 1
+61 2454 1
+61 2456 1
+61 2459 1
+61 2460 1
+61 2462 1
+61 2463 1
+61 2465 1
+61 2467 1
+61 2470 1
+61 2473 1
+61 2474 1
+61 2476 1
+61 2479 1
+61 2480 1
+61 2482 1
+61 2483 1
+61 2485 1
+61 2486 1
+61 2489 1
+61 2490 1
+61 2492 1
+61 2493 1
+61 2495 1
+61 2496 1
+61 2497 1
+61 2499 1
+61 2500 1
+61 2558 1
+61 2561 1
+61 2564 1
+61 2565 1
+61 2567 1
+61 2570 1
+61 2571 1
+61 2573 1
+61 2574 1
+61 2576 1
+61 2577 1
+61 2580 1
+61 2581 1
+61 2583 1
+61 2584 1
+61 2586 1
+61 2587 1
+61 2588 1
+61 2590 1
+61 2591 1
+61 2592 1
+61 2595 1
+61 2596 1
+61 2598 1
+61 2599 1
+61 2601 1
+61 2602 1
+61 2603 1
+61 2605 1
+61 2606 1
+61 2607 1
+61 2608 1
+61 2610 1
+61 2611 1
+61 2612 1
+61 2644 1
+61 2649 1
+61 2653 1
+61 2656 1
+61 2659 1
+61 2660 1
+61 2664 1
+61 2668 1
+61 2671 1
+61 2674 1
+61 2675 1
+61 2678 1
+61 2681 1
+61 2684 1
+61 2685 1
+61 2687 1
+61 2690 1
+61 2691 1
+61 2693 1
+61 2694 1
+61 2696 1
+61 2769 1
+61 2773 1
+61 2776 1
+61 2779 1
+61 2780 1
+61 2783 1
+61 2786 1
+61 2789 1
+61 2790 1
+61 2792 1
+61 2795 1
+61 2796 1
+61 2798 1
+61 2799 1
+61 2801 1
+61 2803 1
+61 2806 1
+61 2809 1
+61 2810 1
+61 2812 1
+61 2815 1
+61 2816 1
+61 2818 1
+61 2819 1
+61 2821 1
+61 2822 1
+61 2825 1
+61 2826 1
+61 2828 1
+61 2829 1
+61 2831 1
+61 2832 1
+61 2833 1
+61 2835 1
+61 2836 1
+61 2895 1
+61 2899 1
+61 2902 1
+61 2905 1
+61 2906 1
+61 2909 1
+61 2912 1
+61 2915 1
+61 2916 1
+61 2918 1
+61 2921 1
+61 2922 1
+61 2924 1
+61 2925 1
+61 2927 1
+61 2929 1
+61 2932 1
+61 2935 1
+61 2936 1
+61 2938 1
+61 2941 1
+61 2942 1
+61 2944 1
+61 2945 1
+61 2947 1
+61 2948 1
+61 2951 1
+61 2952 1
+61 2954 1
+61 2955 1
+61 2957 1
+61 2958 1
+61 2959 1
+61 2961 1
+61 2962 1
+61 3020 1
+61 3023 1
+61 3026 1
+61 3027 1
+61 3029 1
+61 3032 1
+61 3033 1
+61 3035 1
+61 3036 1
+61 3038 1
+61 3039 1
+61 3042 1
+61 3043 1
+61 3045 1
+61 3046 1
+61 3048 1
+61 3049 1
+61 3050 1
+61 3052 1
+61 3053 1
+61 3054 1
+61 3057 1
+61 3058 1
+61 3060 1
+61 3061 1
+61 3063 1
+61 3064 1
+61 3065 1
+61 3067 1
+61 3068 1
+61 3069 1
+61 3070 1
+61 3072 1
+61 3073 1
+61 3074 1
+61 3105 1
+61 3109 1
+61 3112 1
+61 3115 1
+61 3116 1
+61 3119 1
+61 3122 1
+61 3125 1
+61 3126 1
+61 3128 1
+61 3131 1
+61 3132 1
+61 3134 1
+61 3135 1
+61 3137 1
+61 3139 1
+61 3142 1
+61 3145 1
+61 3146 1
+61 3148 1
+61 3151 1
+61 3152 1
+61 3154 1
+61 3155 1
+61 3157 1
+61 3158 1
+61 3161 1
+61 3162 1
+61 3164 1
+61 3165 1
+61 3167 1
+61 3168 1
+61 3169 1
+61 3171 1
+61 3172 1
+61 3230 1
+61 3233 1
+61 3236 1
+61 3237 1
+61 3239 1
+61 3242 1
+61 3243 1
+61 3245 1
+61 3246 1
+61 3248 1
+61 3249 1
+61 3252 1
+61 3253 1
+61 3255 1
+61 3256 1
+61 3258 1
+61 3259 1
+61 3260 1
+61 3262 1
+61 3263 1
+61 3264 1
+61 3267 1
+61 3268 1
+61 3270 1
+61 3271 1
+61 3273 1
+61 3274 1
+61 3275 1
+61 3277 1
+61 3278 1
+61 3279 1
+61 3280 1
+61 3282 1
+61 3283 1
+61 3284 1
+61 3314 1
+61 3317 1
+61 3320 1
+61 3321 1
+61 3323 1
+61 3326 1
+61 3327 1
+61 3329 1
+61 3330 1
+61 3332 1
+61 3333 1
+61 3336 1
+61 3337 1
+61 3339 1
+61 3340 1
+61 3342 1
+61 3343 1
+61 3344 1
+61 3346 1
+61 3347 1
+61 3348 1
+61 3351 1
+61 3352 1
+61 3354 1
+61 3355 1
+61 3357 1
+61 3358 1
+61 3359 1
+61 3361 1
+61 3362 1
+61 3363 1
+61 3364 1
+61 3366 1
+61 3367 1
+61 3368 1
+61 3397 1
+61 3400 1
+61 3401 1
+61 3403 1
+61 3404 1
+61 3406 1
+61 3407 1
+61 3408 1
+61 3410 1
+61 3411 1
+61 3412 1
+61 3413 1
+61 3415 1
+61 3416 1
+61 3417 1
+61 3418 1
+61 3419 1
+61 3421 1
+61 3422 1
+61 3423 1
+61 3424 1
+62 7 1
+62 42 1
+62 48 1
+62 53 1
+62 57 1
+62 60 1
+62 62 1
+62 64 1
+62 126 1
+62 132 1
+62 137 1
+62 141 1
+62 144 1
+62 146 1
+62 148 1
+62 209 1
+62 214 1
+62 218 1
+62 221 1
+62 223 1
+62 225 1
+62 229 1
+62 233 1
+62 236 1
+62 238 1
+62 240 1
+62 243 1
+62 246 1
+62 248 1
+62 250 1
+62 252 1
+62 254 1
+62 256 1
+62 257 1
+62 259 1
+62 260 1
+62 336 1
+62 342 1
+62 347 1
+62 351 1
+62 354 1
+62 356 1
+62 358 1
+62 419 1
+62 424 1
+62 428 1
+62 431 1
+62 433 1
+62 435 1
+62 439 1
+62 443 1
+62 446 1
+62 448 1
+62 450 1
+62 453 1
+62 456 1
+62 458 1
+62 460 1
+62 462 1
+62 464 1
+62 466 1
+62 467 1
+62 469 1
+62 470 1
+62 545 1
+62 550 1
+62 554 1
+62 557 1
+62 559 1
+62 561 1
+62 565 1
+62 569 1
+62 572 1
+62 574 1
+62 576 1
+62 579 1
+62 582 1
+62 584 1
+62 586 1
+62 588 1
+62 590 1
+62 592 1
+62 593 1
+62 595 1
+62 596 1
+62 670 1
+62 674 1
+62 677 1
+62 679 1
+62 681 1
+62 684 1
+62 687 1
+62 689 1
+62 691 1
+62 693 1
+62 695 1
+62 697 1
+62 698 1
+62 700 1
+62 701 1
+62 704 1
+62 707 1
+62 709 1
+62 711 1
+62 713 1
+62 715 1
+62 717 1
+62 718 1
+62 720 1
+62 721 1
+62 723 1
+62 725 1
+62 727 1
+62 728 1
+62 730 1
+62 731 1
+62 732 1
+62 734 1
+62 735 1
+62 736 1
+62 798 1
+62 804 1
+62 809 1
+62 813 1
+62 816 1
+62 818 1
+62 820 1
+62 881 1
+62 886 1
+62 890 1
+62 893 1
+62 895 1
+62 897 1
+62 901 1
+62 905 1
+62 908 1
+62 910 1
+62 912 1
+62 915 1
+62 918 1
+62 920 1
+62 922 1
+62 924 1
+62 926 1
+62 928 1
+62 929 1
+62 931 1
+62 932 1
+62 1007 1
+62 1012 1
+62 1016 1
+62 1019 1
+62 1021 1
+62 1023 1
+62 1027 1
+62 1031 1
+62 1034 1
+62 1036 1
+62 1038 1
+62 1041 1
+62 1044 1
+62 1046 1
+62 1048 1
+62 1050 1
+62 1052 1
+62 1054 1
+62 1055 1
+62 1057 1
+62 1058 1
+62 1132 1
+62 1136 1
+62 1139 1
+62 1141 1
+62 1143 1
+62 1146 1
+62 1149 1
+62 1151 1
+62 1153 1
+62 1155 1
+62 1157 1
+62 1159 1
+62 1160 1
+62 1162 1
+62 1163 1
+62 1166 1
+62 1169 1
+62 1171 1
+62 1173 1
+62 1175 1
+62 1177 1
+62 1179 1
+62 1180 1
+62 1182 1
+62 1183 1
+62 1185 1
+62 1187 1
+62 1189 1
+62 1190 1
+62 1192 1
+62 1193 1
+62 1194 1
+62 1196 1
+62 1197 1
+62 1198 1
+62 1259 1
+62 1264 1
+62 1268 1
+62 1271 1
+62 1273 1
+62 1275 1
+62 1279 1
+62 1283 1
+62 1286 1
+62 1288 1
+62 1290 1
+62 1293 1
+62 1296 1
+62 1298 1
+62 1300 1
+62 1302 1
+62 1304 1
+62 1306 1
+62 1307 1
+62 1309 1
+62 1310 1
+62 1384 1
+62 1388 1
+62 1391 1
+62 1393 1
+62 1395 1
+62 1398 1
+62 1401 1
+62 1403 1
+62 1405 1
+62 1407 1
+62 1409 1
+62 1411 1
+62 1412 1
+62 1414 1
+62 1415 1
+62 1418 1
+62 1421 1
+62 1423 1
+62 1425 1
+62 1427 1
+62 1429 1
+62 1431 1
+62 1432 1
+62 1434 1
+62 1435 1
+62 1437 1
+62 1439 1
+62 1441 1
+62 1442 1
+62 1444 1
+62 1445 1
+62 1446 1
+62 1448 1
+62 1449 1
+62 1450 1
+62 1510 1
+62 1514 1
+62 1517 1
+62 1519 1
+62 1521 1
+62 1524 1
+62 1527 1
+62 1529 1
+62 1531 1
+62 1533 1
+62 1535 1
+62 1537 1
+62 1538 1
+62 1540 1
+62 1541 1
+62 1544 1
+62 1547 1
+62 1549 1
+62 1551 1
+62 1553 1
+62 1555 1
+62 1557 1
+62 1558 1
+62 1560 1
+62 1561 1
+62 1563 1
+62 1565 1
+62 1567 1
+62 1568 1
+62 1570 1
+62 1571 1
+62 1572 1
+62 1574 1
+62 1575 1
+62 1576 1
+62 1635 1
+62 1638 1
+62 1640 1
+62 1642 1
+62 1644 1
+62 1646 1
+62 1648 1
+62 1649 1
+62 1651 1
+62 1652 1
+62 1654 1
+62 1656 1
+62 1658 1
+62 1659 1
+62 1661 1
+62 1662 1
+62 1663 1
+62 1665 1
+62 1666 1
+62 1667 1
+62 1669 1
+62 1671 1
+62 1673 1
+62 1674 1
+62 1676 1
+62 1677 1
+62 1678 1
+62 1680 1
+62 1681 1
+62 1682 1
+62 1683 1
+62 1685 1
+62 1686 1
+62 1687 1
+62 1688 1
+62 1722 1
+62 1728 1
+62 1733 1
+62 1737 1
+62 1740 1
+62 1742 1
+62 1744 1
+62 1805 1
+62 1810 1
+62 1814 1
+62 1817 1
+62 1819 1
+62 1821 1
+62 1825 1
+62 1829 1
+62 1832 1
+62 1834 1
+62 1836 1
+62 1839 1
+62 1842 1
+62 1844 1
+62 1846 1
+62 1848 1
+62 1850 1
+62 1852 1
+62 1853 1
+62 1855 1
+62 1856 1
+62 1931 1
+62 1936 1
+62 1940 1
+62 1943 1
+62 1945 1
+62 1947 1
+62 1951 1
+62 1955 1
+62 1958 1
+62 1960 1
+62 1962 1
+62 1965 1
+62 1968 1
+62 1970 1
+62 1972 1
+62 1974 1
+62 1976 1
+62 1978 1
+62 1979 1
+62 1981 1
+62 1982 1
+62 2056 1
+62 2060 1
+62 2063 1
+62 2065 1
+62 2067 1
+62 2070 1
+62 2073 1
+62 2075 1
+62 2077 1
+62 2079 1
+62 2081 1
+62 2083 1
+62 2084 1
+62 2086 1
+62 2087 1
+62 2090 1
+62 2093 1
+62 2095 1
+62 2097 1
+62 2099 1
+62 2101 1
+62 2103 1
+62 2104 1
+62 2106 1
+62 2107 1
+62 2109 1
+62 2111 1
+62 2113 1
+62 2114 1
+62 2116 1
+62 2117 1
+62 2118 1
+62 2120 1
+62 2121 1
+62 2122 1
+62 2183 1
+62 2188 1
+62 2192 1
+62 2195 1
+62 2197 1
+62 2199 1
+62 2203 1
+62 2207 1
+62 2210 1
+62 2212 1
+62 2214 1
+62 2217 1
+62 2220 1
+62 2222 1
+62 2224 1
+62 2226 1
+62 2228 1
+62 2230 1
+62 2231 1
+62 2233 1
+62 2234 1
+62 2308 1
+62 2312 1
+62 2315 1
+62 2317 1
+62 2319 1
+62 2322 1
+62 2325 1
+62 2327 1
+62 2329 1
+62 2331 1
+62 2333 1
+62 2335 1
+62 2336 1
+62 2338 1
+62 2339 1
+62 2342 1
+62 2345 1
+62 2347 1
+62 2349 1
+62 2351 1
+62 2353 1
+62 2355 1
+62 2356 1
+62 2358 1
+62 2359 1
+62 2361 1
+62 2363 1
+62 2365 1
+62 2366 1
+62 2368 1
+62 2369 1
+62 2370 1
+62 2372 1
+62 2373 1
+62 2374 1
+62 2434 1
+62 2438 1
+62 2441 1
+62 2443 1
+62 2445 1
+62 2448 1
+62 2451 1
+62 2453 1
+62 2455 1
+62 2457 1
+62 2459 1
+62 2461 1
+62 2462 1
+62 2464 1
+62 2465 1
+62 2468 1
+62 2471 1
+62 2473 1
+62 2475 1
+62 2477 1
+62 2479 1
+62 2481 1
+62 2482 1
+62 2484 1
+62 2485 1
+62 2487 1
+62 2489 1
+62 2491 1
+62 2492 1
+62 2494 1
+62 2495 1
+62 2496 1
+62 2498 1
+62 2499 1
+62 2500 1
+62 2559 1
+62 2562 1
+62 2564 1
+62 2566 1
+62 2568 1
+62 2570 1
+62 2572 1
+62 2573 1
+62 2575 1
+62 2576 1
+62 2578 1
+62 2580 1
+62 2582 1
+62 2583 1
+62 2585 1
+62 2586 1
+62 2587 1
+62 2589 1
+62 2590 1
+62 2591 1
+62 2593 1
+62 2595 1
+62 2597 1
+62 2598 1
+62 2600 1
+62 2601 1
+62 2602 1
+62 2604 1
+62 2605 1
+62 2606 1
+62 2607 1
+62 2609 1
+62 2610 1
+62 2611 1
+62 2612 1
+62 2645 1
+62 2650 1
+62 2654 1
+62 2657 1
+62 2659 1
+62 2661 1
+62 2665 1
+62 2669 1
+62 2672 1
+62 2674 1
+62 2676 1
+62 2679 1
+62 2682 1
+62 2684 1
+62 2686 1
+62 2688 1
+62 2690 1
+62 2692 1
+62 2693 1
+62 2695 1
+62 2696 1
+62 2770 1
+62 2774 1
+62 2777 1
+62 2779 1
+62 2781 1
+62 2784 1
+62 2787 1
+62 2789 1
+62 2791 1
+62 2793 1
+62 2795 1
+62 2797 1
+62 2798 1
+62 2800 1
+62 2801 1
+62 2804 1
+62 2807 1
+62 2809 1
+62 2811 1
+62 2813 1
+62 2815 1
+62 2817 1
+62 2818 1
+62 2820 1
+62 2821 1
+62 2823 1
+62 2825 1
+62 2827 1
+62 2828 1
+62 2830 1
+62 2831 1
+62 2832 1
+62 2834 1
+62 2835 1
+62 2836 1
+62 2896 1
+62 2900 1
+62 2903 1
+62 2905 1
+62 2907 1
+62 2910 1
+62 2913 1
+62 2915 1
+62 2917 1
+62 2919 1
+62 2921 1
+62 2923 1
+62 2924 1
+62 2926 1
+62 2927 1
+62 2930 1
+62 2933 1
+62 2935 1
+62 2937 1
+62 2939 1
+62 2941 1
+62 2943 1
+62 2944 1
+62 2946 1
+62 2947 1
+62 2949 1
+62 2951 1
+62 2953 1
+62 2954 1
+62 2956 1
+62 2957 1
+62 2958 1
+62 2960 1
+62 2961 1
+62 2962 1
+62 3021 1
+62 3024 1
+62 3026 1
+62 3028 1
+62 3030 1
+62 3032 1
+62 3034 1
+62 3035 1
+62 3037 1
+62 3038 1
+62 3040 1
+62 3042 1
+62 3044 1
+62 3045 1
+62 3047 1
+62 3048 1
+62 3049 1
+62 3051 1
+62 3052 1
+62 3053 1
+62 3055 1
+62 3057 1
+62 3059 1
+62 3060 1
+62 3062 1
+62 3063 1
+62 3064 1
+62 3066 1
+62 3067 1
+62 3068 1
+62 3069 1
+62 3071 1
+62 3072 1
+62 3073 1
+62 3074 1
+62 3106 1
+62 3110 1
+62 3113 1
+62 3115 1
+62 3117 1
+62 3120 1
+62 3123 1
+62 3125 1
+62 3127 1
+62 3129 1
+62 3131 1
+62 3133 1
+62 3134 1
+62 3136 1
+62 3137 1
+62 3140 1
+62 3143 1
+62 3145 1
+62 3147 1
+62 3149 1
+62 3151 1
+62 3153 1
+62 3154 1
+62 3156 1
+62 3157 1
+62 3159 1
+62 3161 1
+62 3163 1
+62 3164 1
+62 3166 1
+62 3167 1
+62 3168 1
+62 3170 1
+62 3171 1
+62 3172 1
+62 3231 1
+62 3234 1
+62 3236 1
+62 3238 1
+62 3240 1
+62 3242 1
+62 3244 1
+62 3245 1
+62 3247 1
+62 3248 1
+62 3250 1
+62 3252 1
+62 3254 1
+62 3255 1
+62 3257 1
+62 3258 1
+62 3259 1
+62 3261 1
+62 3262 1
+62 3263 1
+62 3265 1
+62 3267 1
+62 3269 1
+62 3270 1
+62 3272 1
+62 3273 1
+62 3274 1
+62 3276 1
+62 3277 1
+62 3278 1
+62 3279 1
+62 3281 1
+62 3282 1
+62 3283 1
+62 3284 1
+62 3315 1
+62 3318 1
+62 3320 1
+62 3322 1
+62 3324 1
+62 3326 1
+62 3328 1
+62 3329 1
+62 3331 1
+62 3332 1
+62 3334 1
+62 3336 1
+62 3338 1
+62 3339 1
+62 3341 1
+62 3342 1
+62 3343 1
+62 3345 1
+62 3346 1
+62 3347 1
+62 3349 1
+62 3351 1
+62 3353 1
+62 3354 1
+62 3356 1
+62 3357 1
+62 3358 1
+62 3360 1
+62 3361 1
+62 3362 1
+62 3363 1
+62 3365 1
+62 3366 1
+62 3367 1
+62 3368 1
+62 3398 1
+62 3400 1
+62 3402 1
+62 3403 1
+62 3405 1
+62 3406 1
+62 3407 1
+62 3409 1
+62 3410 1
+62 3411 1
+62 3412 1
+62 3414 1
+62 3415 1
+62 3416 1
+62 3417 1
+62 3418 1
+62 3420 1
+62 3421 1
+62 3422 1
+62 3423 1
+62 3424 1
+63 8 1
+63 43 1
+63 49 1
+63 54 1
+63 58 1
+63 61 1
+63 63 1
+63 64 1
+63 127 1
+63 133 1
+63 138 1
+63 142 1
+63 145 1
+63 147 1
+63 148 1
+63 210 1
+63 215 1
+63 219 1
+63 222 1
+63 224 1
+63 225 1
+63 230 1
+63 234 1
+63 237 1
+63 239 1
+63 240 1
+63 244 1
+63 247 1
+63 249 1
+63 250 1
+63 253 1
+63 255 1
+63 256 1
+63 258 1
+63 259 1
+63 260 1
+63 337 1
+63 343 1
+63 348 1
+63 352 1
+63 355 1
+63 357 1
+63 358 1
+63 420 1
+63 425 1
+63 429 1
+63 432 1
+63 434 1
+63 435 1
+63 440 1
+63 444 1
+63 447 1
+63 449 1
+63 450 1
+63 454 1
+63 457 1
+63 459 1
+63 460 1
+63 463 1
+63 465 1
+63 466 1
+63 468 1
+63 469 1
+63 470 1
+63 546 1
+63 551 1
+63 555 1
+63 558 1
+63 560 1
+63 561 1
+63 566 1
+63 570 1
+63 573 1
+63 575 1
+63 576 1
+63 580 1
+63 583 1
+63 585 1
+63 586 1
+63 589 1
+63 591 1
+63 592 1
+63 594 1
+63 595 1
+63 596 1
+63 671 1
+63 675 1
+63 678 1
+63 680 1
+63 681 1
+63 685 1
+63 688 1
+63 690 1
+63 691 1
+63 694 1
+63 696 1
+63 697 1
+63 699 1
+63 700 1
+63 701 1
+63 705 1
+63 708 1
+63 710 1
+63 711 1
+63 714 1
+63 716 1
+63 717 1
+63 719 1
+63 720 1
+63 721 1
+63 724 1
+63 726 1
+63 727 1
+63 729 1
+63 730 1
+63 731 1
+63 733 1
+63 734 1
+63 735 1
+63 736 1
+63 799 1
+63 805 1
+63 810 1
+63 814 1
+63 817 1
+63 819 1
+63 820 1
+63 882 1
+63 887 1
+63 891 1
+63 894 1
+63 896 1
+63 897 1
+63 902 1
+63 906 1
+63 909 1
+63 911 1
+63 912 1
+63 916 1
+63 919 1
+63 921 1
+63 922 1
+63 925 1
+63 927 1
+63 928 1
+63 930 1
+63 931 1
+63 932 1
+63 1008 1
+63 1013 1
+63 1017 1
+63 1020 1
+63 1022 1
+63 1023 1
+63 1028 1
+63 1032 1
+63 1035 1
+63 1037 1
+63 1038 1
+63 1042 1
+63 1045 1
+63 1047 1
+63 1048 1
+63 1051 1
+63 1053 1
+63 1054 1
+63 1056 1
+63 1057 1
+63 1058 1
+63 1133 1
+63 1137 1
+63 1140 1
+63 1142 1
+63 1143 1
+63 1147 1
+63 1150 1
+63 1152 1
+63 1153 1
+63 1156 1
+63 1158 1
+63 1159 1
+63 1161 1
+63 1162 1
+63 1163 1
+63 1167 1
+63 1170 1
+63 1172 1
+63 1173 1
+63 1176 1
+63 1178 1
+63 1179 1
+63 1181 1
+63 1182 1
+63 1183 1
+63 1186 1
+63 1188 1
+63 1189 1
+63 1191 1
+63 1192 1
+63 1193 1
+63 1195 1
+63 1196 1
+63 1197 1
+63 1198 1
+63 1260 1
+63 1265 1
+63 1269 1
+63 1272 1
+63 1274 1
+63 1275 1
+63 1280 1
+63 1284 1
+63 1287 1
+63 1289 1
+63 1290 1
+63 1294 1
+63 1297 1
+63 1299 1
+63 1300 1
+63 1303 1
+63 1305 1
+63 1306 1
+63 1308 1
+63 1309 1
+63 1310 1
+63 1385 1
+63 1389 1
+63 1392 1
+63 1394 1
+63 1395 1
+63 1399 1
+63 1402 1
+63 1404 1
+63 1405 1
+63 1408 1
+63 1410 1
+63 1411 1
+63 1413 1
+63 1414 1
+63 1415 1
+63 1419 1
+63 1422 1
+63 1424 1
+63 1425 1
+63 1428 1
+63 1430 1
+63 1431 1
+63 1433 1
+63 1434 1
+63 1435 1
+63 1438 1
+63 1440 1
+63 1441 1
+63 1443 1
+63 1444 1
+63 1445 1
+63 1447 1
+63 1448 1
+63 1449 1
+63 1450 1
+63 1511 1
+63 1515 1
+63 1518 1
+63 1520 1
+63 1521 1
+63 1525 1
+63 1528 1
+63 1530 1
+63 1531 1
+63 1534 1
+63 1536 1
+63 1537 1
+63 1539 1
+63 1540 1
+63 1541 1
+63 1545 1
+63 1548 1
+63 1550 1
+63 1551 1
+63 1554 1
+63 1556 1
+63 1557 1
+63 1559 1
+63 1560 1
+63 1561 1
+63 1564 1
+63 1566 1
+63 1567 1
+63 1569 1
+63 1570 1
+63 1571 1
+63 1573 1
+63 1574 1
+63 1575 1
+63 1576 1
+63 1636 1
+63 1639 1
+63 1641 1
+63 1642 1
+63 1645 1
+63 1647 1
+63 1648 1
+63 1650 1
+63 1651 1
+63 1652 1
+63 1655 1
+63 1657 1
+63 1658 1
+63 1660 1
+63 1661 1
+63 1662 1
+63 1664 1
+63 1665 1
+63 1666 1
+63 1667 1
+63 1670 1
+63 1672 1
+63 1673 1
+63 1675 1
+63 1676 1
+63 1677 1
+63 1679 1
+63 1680 1
+63 1681 1
+63 1682 1
+63 1684 1
+63 1685 1
+63 1686 1
+63 1687 1
+63 1688 1
+63 1723 1
+63 1729 1
+63 1734 1
+63 1738 1
+63 1741 1
+63 1743 1
+63 1744 1
+63 1806 1
+63 1811 1
+63 1815 1
+63 1818 1
+63 1820 1
+63 1821 1
+63 1826 1
+63 1830 1
+63 1833 1
+63 1835 1
+63 1836 1
+63 1840 1
+63 1843 1
+63 1845 1
+63 1846 1
+63 1849 1
+63 1851 1
+63 1852 1
+63 1854 1
+63 1855 1
+63 1856 1
+63 1932 1
+63 1937 1
+63 1941 1
+63 1944 1
+63 1946 1
+63 1947 1
+63 1952 1
+63 1956 1
+63 1959 1
+63 1961 1
+63 1962 1
+63 1966 1
+63 1969 1
+63 1971 1
+63 1972 1
+63 1975 1
+63 1977 1
+63 1978 1
+63 1980 1
+63 1981 1
+63 1982 1
+63 2057 1
+63 2061 1
+63 2064 1
+63 2066 1
+63 2067 1
+63 2071 1
+63 2074 1
+63 2076 1
+63 2077 1
+63 2080 1
+63 2082 1
+63 2083 1
+63 2085 1
+63 2086 1
+63 2087 1
+63 2091 1
+63 2094 1
+63 2096 1
+63 2097 1
+63 2100 1
+63 2102 1
+63 2103 1
+63 2105 1
+63 2106 1
+63 2107 1
+63 2110 1
+63 2112 1
+63 2113 1
+63 2115 1
+63 2116 1
+63 2117 1
+63 2119 1
+63 2120 1
+63 2121 1
+63 2122 1
+63 2184 1
+63 2189 1
+63 2193 1
+63 2196 1
+63 2198 1
+63 2199 1
+63 2204 1
+63 2208 1
+63 2211 1
+63 2213 1
+63 2214 1
+63 2218 1
+63 2221 1
+63 2223 1
+63 2224 1
+63 2227 1
+63 2229 1
+63 2230 1
+63 2232 1
+63 2233 1
+63 2234 1
+63 2309 1
+63 2313 1
+63 2316 1
+63 2318 1
+63 2319 1
+63 2323 1
+63 2326 1
+63 2328 1
+63 2329 1
+63 2332 1
+63 2334 1
+63 2335 1
+63 2337 1
+63 2338 1
+63 2339 1
+63 2343 1
+63 2346 1
+63 2348 1
+63 2349 1
+63 2352 1
+63 2354 1
+63 2355 1
+63 2357 1
+63 2358 1
+63 2359 1
+63 2362 1
+63 2364 1
+63 2365 1
+63 2367 1
+63 2368 1
+63 2369 1
+63 2371 1
+63 2372 1
+63 2373 1
+63 2374 1
+63 2435 1
+63 2439 1
+63 2442 1
+63 2444 1
+63 2445 1
+63 2449 1
+63 2452 1
+63 2454 1
+63 2455 1
+63 2458 1
+63 2460 1
+63 2461 1
+63 2463 1
+63 2464 1
+63 2465 1
+63 2469 1
+63 2472 1
+63 2474 1
+63 2475 1
+63 2478 1
+63 2480 1
+63 2481 1
+63 2483 1
+63 2484 1
+63 2485 1
+63 2488 1
+63 2490 1
+63 2491 1
+63 2493 1
+63 2494 1
+63 2495 1
+63 2497 1
+63 2498 1
+63 2499 1
+63 2500 1
+63 2560 1
+63 2563 1
+63 2565 1
+63 2566 1
+63 2569 1
+63 2571 1
+63 2572 1
+63 2574 1
+63 2575 1
+63 2576 1
+63 2579 1
+63 2581 1
+63 2582 1
+63 2584 1
+63 2585 1
+63 2586 1
+63 2588 1
+63 2589 1
+63 2590 1
+63 2591 1
+63 2594 1
+63 2596 1
+63 2597 1
+63 2599 1
+63 2600 1
+63 2601 1
+63 2603 1
+63 2604 1
+63 2605 1
+63 2606 1
+63 2608 1
+63 2609 1
+63 2610 1
+63 2611 1
+63 2612 1
+63 2646 1
+63 2651 1
+63 2655 1
+63 2658 1
+63 2660 1
+63 2661 1
+63 2666 1
+63 2670 1
+63 2673 1
+63 2675 1
+63 2676 1
+63 2680 1
+63 2683 1
+63 2685 1
+63 2686 1
+63 2689 1
+63 2691 1
+63 2692 1
+63 2694 1
+63 2695 1
+63 2696 1
+63 2771 1
+63 2775 1
+63 2778 1
+63 2780 1
+63 2781 1
+63 2785 1
+63 2788 1
+63 2790 1
+63 2791 1
+63 2794 1
+63 2796 1
+63 2797 1
+63 2799 1
+63 2800 1
+63 2801 1
+63 2805 1
+63 2808 1
+63 2810 1
+63 2811 1
+63 2814 1
+63 2816 1
+63 2817 1
+63 2819 1
+63 2820 1
+63 2821 1
+63 2824 1
+63 2826 1
+63 2827 1
+63 2829 1
+63 2830 1
+63 2831 1
+63 2833 1
+63 2834 1
+63 2835 1
+63 2836 1
+63 2897 1
+63 2901 1
+63 2904 1
+63 2906 1
+63 2907 1
+63 2911 1
+63 2914 1
+63 2916 1
+63 2917 1
+63 2920 1
+63 2922 1
+63 2923 1
+63 2925 1
+63 2926 1
+63 2927 1
+63 2931 1
+63 2934 1
+63 2936 1
+63 2937 1
+63 2940 1
+63 2942 1
+63 2943 1
+63 2945 1
+63 2946 1
+63 2947 1
+63 2950 1
+63 2952 1
+63 2953 1
+63 2955 1
+63 2956 1
+63 2957 1
+63 2959 1
+63 2960 1
+63 2961 1
+63 2962 1
+63 3022 1
+63 3025 1
+63 3027 1
+63 3028 1
+63 3031 1
+63 3033 1
+63 3034 1
+63 3036 1
+63 3037 1
+63 3038 1
+63 3041 1
+63 3043 1
+63 3044 1
+63 3046 1
+63 3047 1
+63 3048 1
+63 3050 1
+63 3051 1
+63 3052 1
+63 3053 1
+63 3056 1
+63 3058 1
+63 3059 1
+63 3061 1
+63 3062 1
+63 3063 1
+63 3065 1
+63 3066 1
+63 3067 1
+63 3068 1
+63 3070 1
+63 3071 1
+63 3072 1
+63 3073 1
+63 3074 1
+63 3107 1
+63 3111 1
+63 3114 1
+63 3116 1
+63 3117 1
+63 3121 1
+63 3124 1
+63 3126 1
+63 3127 1
+63 3130 1
+63 3132 1
+63 3133 1
+63 3135 1
+63 3136 1
+63 3137 1
+63 3141 1
+63 3144 1
+63 3146 1
+63 3147 1
+63 3150 1
+63 3152 1
+63 3153 1
+63 3155 1
+63 3156 1
+63 3157 1
+63 3160 1
+63 3162 1
+63 3163 1
+63 3165 1
+63 3166 1
+63 3167 1
+63 3169 1
+63 3170 1
+63 3171 1
+63 3172 1
+63 3232 1
+63 3235 1
+63 3237 1
+63 3238 1
+63 3241 1
+63 3243 1
+63 3244 1
+63 3246 1
+63 3247 1
+63 3248 1
+63 3251 1
+63 3253 1
+63 3254 1
+63 3256 1
+63 3257 1
+63 3258 1
+63 3260 1
+63 3261 1
+63 3262 1
+63 3263 1
+63 3266 1
+63 3268 1
+63 3269 1
+63 3271 1
+63 3272 1
+63 3273 1
+63 3275 1
+63 3276 1
+63 3277 1
+63 3278 1
+63 3280 1
+63 3281 1
+63 3282 1
+63 3283 1
+63 3284 1
+63 3316 1
+63 3319 1
+63 3321 1
+63 3322 1
+63 3325 1
+63 3327 1
+63 3328 1
+63 3330 1
+63 3331 1
+63 3332 1
+63 3335 1
+63 3337 1
+63 3338 1
+63 3340 1
+63 3341 1
+63 3342 1
+63 3344 1
+63 3345 1
+63 3346 1
+63 3347 1
+63 3350 1
+63 3352 1
+63 3353 1
+63 3355 1
+63 3356 1
+63 3357 1
+63 3359 1
+63 3360 1
+63 3361 1
+63 3362 1
+63 3364 1
+63 3365 1
+63 3366 1
+63 3367 1
+63 3368 1
+63 3399 1
+63 3401 1
+63 3402 1
+63 3404 1
+63 3405 1
+63 3406 1
+63 3408 1
+63 3409 1
+63 3410 1
+63 3411 1
+63 3413 1
+63 3414 1
+63 3415 1
+63 3416 1
+63 3417 1
+63 3419 1
+63 3420 1
+63 3421 1
+63 3422 1
+63 3423 1
+63 3424 1
+64 9 1
+64 37 1
+64 65 1
+64 66 1
+64 67 1
+64 68 1
+64 69 1
+64 70 1
+64 121 1
+64 149 1
+64 150 1
+64 151 1
+64 152 1
+64 153 1
+64 154 1
+64 205 1
+64 206 1
+64 207 1
+64 208 1
+64 209 1
+64 210 1
+64 261 1
+64 262 1
+64 263 1
+64 264 1
+64 265 1
+64 266 1
+64 267 1
+64 268 1
+64 269 1
+64 270 1
+64 271 1
+64 272 1
+64 273 1
+64 274 1
+64 275 1
+64 331 1
+64 359 1
+64 360 1
+64 361 1
+64 362 1
+64 363 1
+64 364 1
+64 415 1
+64 416 1
+64 417 1
+64 418 1
+64 419 1
+64 420 1
+64 471 1
+64 472 1
+64 473 1
+64 474 1
+64 475 1
+64 476 1
+64 477 1
+64 478 1
+64 479 1
+64 480 1
+64 481 1
+64 482 1
+64 483 1
+64 484 1
+64 485 1
+64 541 1
+64 542 1
+64 543 1
+64 544 1
+64 545 1
+64 546 1
+64 597 1
+64 598 1
+64 599 1
+64 600 1
+64 601 1
+64 602 1
+64 603 1
+64 604 1
+64 605 1
+64 606 1
+64 607 1
+64 608 1
+64 609 1
+64 610 1
+64 611 1
+64 667 1
+64 668 1
+64 669 1
+64 670 1
+64 671 1
+64 672 1
+64 673 1
+64 674 1
+64 675 1
+64 676 1
+64 677 1
+64 678 1
+64 679 1
+64 680 1
+64 681 1
+64 737 1
+64 738 1
+64 739 1
+64 740 1
+64 741 1
+64 742 1
+64 743 1
+64 744 1
+64 745 1
+64 746 1
+64 747 1
+64 748 1
+64 749 1
+64 750 1
+64 751 1
+64 752 1
+64 753 1
+64 754 1
+64 755 1
+64 756 1
+64 793 1
+64 821 1
+64 822 1
+64 823 1
+64 824 1
+64 825 1
+64 826 1
+64 877 1
+64 878 1
+64 879 1
+64 880 1
+64 881 1
+64 882 1
+64 933 1
+64 934 1
+64 935 1
+64 936 1
+64 937 1
+64 938 1
+64 939 1
+64 940 1
+64 941 1
+64 942 1
+64 943 1
+64 944 1
+64 945 1
+64 946 1
+64 947 1
+64 1003 1
+64 1004 1
+64 1005 1
+64 1006 1
+64 1007 1
+64 1008 1
+64 1059 1
+64 1060 1
+64 1061 1
+64 1062 1
+64 1063 1
+64 1064 1
+64 1065 1
+64 1066 1
+64 1067 1
+64 1068 1
+64 1069 1
+64 1070 1
+64 1071 1
+64 1072 1
+64 1073 1
+64 1129 1
+64 1130 1
+64 1131 1
+64 1132 1
+64 1133 1
+64 1134 1
+64 1135 1
+64 1136 1
+64 1137 1
+64 1138 1
+64 1139 1
+64 1140 1
+64 1141 1
+64 1142 1
+64 1143 1
+64 1199 1
+64 1200 1
+64 1201 1
+64 1202 1
+64 1203 1
+64 1204 1
+64 1205 1
+64 1206 1
+64 1207 1
+64 1208 1
+64 1209 1
+64 1210 1
+64 1211 1
+64 1212 1
+64 1213 1
+64 1214 1
+64 1215 1
+64 1216 1
+64 1217 1
+64 1218 1
+64 1255 1
+64 1256 1
+64 1257 1
+64 1258 1
+64 1259 1
+64 1260 1
+64 1311 1
+64 1312 1
+64 1313 1
+64 1314 1
+64 1315 1
+64 1316 1
+64 1317 1
+64 1318 1
+64 1319 1
+64 1320 1
+64 1321 1
+64 1322 1
+64 1323 1
+64 1324 1
+64 1325 1
+64 1381 1
+64 1382 1
+64 1383 1
+64 1384 1
+64 1385 1
+64 1386 1
+64 1387 1
+64 1388 1
+64 1389 1
+64 1390 1
+64 1391 1
+64 1392 1
+64 1393 1
+64 1394 1
+64 1395 1
+64 1451 1
+64 1452 1
+64 1453 1
+64 1454 1
+64 1455 1
+64 1456 1
+64 1457 1
+64 1458 1
+64 1459 1
+64 1460 1
+64 1461 1
+64 1462 1
+64 1463 1
+64 1464 1
+64 1465 1
+64 1466 1
+64 1467 1
+64 1468 1
+64 1469 1
+64 1470 1
+64 1507 1
+64 1508 1
+64 1509 1
+64 1510 1
+64 1511 1
+64 1512 1
+64 1513 1
+64 1514 1
+64 1515 1
+64 1516 1
+64 1517 1
+64 1518 1
+64 1519 1
+64 1520 1
+64 1521 1
+64 1577 1
+64 1578 1
+64 1579 1
+64 1580 1
+64 1581 1
+64 1582 1
+64 1583 1
+64 1584 1
+64 1585 1
+64 1586 1
+64 1587 1
+64 1588 1
+64 1589 1
+64 1590 1
+64 1591 1
+64 1592 1
+64 1593 1
+64 1594 1
+64 1595 1
+64 1596 1
+64 1633 1
+64 1634 1
+64 1635 1
+64 1636 1
+64 1637 1
+64 1638 1
+64 1639 1
+64 1640 1
+64 1641 1
+64 1642 1
+64 1643 1
+64 1644 1
+64 1645 1
+64 1646 1
+64 1647 1
+64 1648 1
+64 1649 1
+64 1650 1
+64 1651 1
+64 1652 1
+64 1689 1
+64 1690 1
+64 1691 1
+64 1692 1
+64 1693 1
+64 1694 1
+64 1695 1
+64 1696 1
+64 1697 1
+64 1698 1
+64 1699 1
+64 1700 1
+64 1701 1
+64 1702 1
+64 1703 1
+64 1717 1
+64 1745 1
+64 1746 1
+64 1747 1
+64 1748 1
+64 1749 1
+64 1750 1
+64 1801 1
+64 1802 1
+64 1803 1
+64 1804 1
+64 1805 1
+64 1806 1
+64 1857 1
+64 1858 1
+64 1859 1
+64 1860 1
+64 1861 1
+64 1862 1
+64 1863 1
+64 1864 1
+64 1865 1
+64 1866 1
+64 1867 1
+64 1868 1
+64 1869 1
+64 1870 1
+64 1871 1
+64 1927 1
+64 1928 1
+64 1929 1
+64 1930 1
+64 1931 1
+64 1932 1
+64 1983 1
+64 1984 1
+64 1985 1
+64 1986 1
+64 1987 1
+64 1988 1
+64 1989 1
+64 1990 1
+64 1991 1
+64 1992 1
+64 1993 1
+64 1994 1
+64 1995 1
+64 1996 1
+64 1997 1
+64 2053 1
+64 2054 1
+64 2055 1
+64 2056 1
+64 2057 1
+64 2058 1
+64 2059 1
+64 2060 1
+64 2061 1
+64 2062 1
+64 2063 1
+64 2064 1
+64 2065 1
+64 2066 1
+64 2067 1
+64 2123 1
+64 2124 1
+64 2125 1
+64 2126 1
+64 2127 1
+64 2128 1
+64 2129 1
+64 2130 1
+64 2131 1
+64 2132 1
+64 2133 1
+64 2134 1
+64 2135 1
+64 2136 1
+64 2137 1
+64 2138 1
+64 2139 1
+64 2140 1
+64 2141 1
+64 2142 1
+64 2179 1
+64 2180 1
+64 2181 1
+64 2182 1
+64 2183 1
+64 2184 1
+64 2235 1
+64 2236 1
+64 2237 1
+64 2238 1
+64 2239 1
+64 2240 1
+64 2241 1
+64 2242 1
+64 2243 1
+64 2244 1
+64 2245 1
+64 2246 1
+64 2247 1
+64 2248 1
+64 2249 1
+64 2305 1
+64 2306 1
+64 2307 1
+64 2308 1
+64 2309 1
+64 2310 1
+64 2311 1
+64 2312 1
+64 2313 1
+64 2314 1
+64 2315 1
+64 2316 1
+64 2317 1
+64 2318 1
+64 2319 1
+64 2375 1
+64 2376 1
+64 2377 1
+64 2378 1
+64 2379 1
+64 2380 1
+64 2381 1
+64 2382 1
+64 2383 1
+64 2384 1
+64 2385 1
+64 2386 1
+64 2387 1
+64 2388 1
+64 2389 1
+64 2390 1
+64 2391 1
+64 2392 1
+64 2393 1
+64 2394 1
+64 2431 1
+64 2432 1
+64 2433 1
+64 2434 1
+64 2435 1
+64 2436 1
+64 2437 1
+64 2438 1
+64 2439 1
+64 2440 1
+64 2441 1
+64 2442 1
+64 2443 1
+64 2444 1
+64 2445 1
+64 2501 1
+64 2502 1
+64 2503 1
+64 2504 1
+64 2505 1
+64 2506 1
+64 2507 1
+64 2508 1
+64 2509 1
+64 2510 1
+64 2511 1
+64 2512 1
+64 2513 1
+64 2514 1
+64 2515 1
+64 2516 1
+64 2517 1
+64 2518 1
+64 2519 1
+64 2520 1
+64 2557 1
+64 2558 1
+64 2559 1
+64 2560 1
+64 2561 1
+64 2562 1
+64 2563 1
+64 2564 1
+64 2565 1
+64 2566 1
+64 2567 1
+64 2568 1
+64 2569 1
+64 2570 1
+64 2571 1
+64 2572 1
+64 2573 1
+64 2574 1
+64 2575 1
+64 2576 1
+64 2613 1
+64 2614 1
+64 2615 1
+64 2616 1
+64 2617 1
+64 2618 1
+64 2619 1
+64 2620 1
+64 2621 1
+64 2622 1
+64 2623 1
+64 2624 1
+64 2625 1
+64 2626 1
+64 2627 1
+64 2641 1
+64 2642 1
+64 2643 1
+64 2644 1
+64 2645 1
+64 2646 1
+64 2697 1
+64 2698 1
+64 2699 1
+64 2700 1
+64 2701 1
+64 2702 1
+64 2703 1
+64 2704 1
+64 2705 1
+64 2706 1
+64 2707 1
+64 2708 1
+64 2709 1
+64 2710 1
+64 2711 1
+64 2767 1
+64 2768 1
+64 2769 1
+64 2770 1
+64 2771 1
+64 2772 1
+64 2773 1
+64 2774 1
+64 2775 1
+64 2776 1
+64 2777 1
+64 2778 1
+64 2779 1
+64 2780 1
+64 2781 1
+64 2837 1
+64 2838 1
+64 2839 1
+64 2840 1
+64 2841 1
+64 2842 1
+64 2843 1
+64 2844 1
+64 2845 1
+64 2846 1
+64 2847 1
+64 2848 1
+64 2849 1
+64 2850 1
+64 2851 1
+64 2852 1
+64 2853 1
+64 2854 1
+64 2855 1
+64 2856 1
+64 2893 1
+64 2894 1
+64 2895 1
+64 2896 1
+64 2897 1
+64 2898 1
+64 2899 1
+64 2900 1
+64 2901 1
+64 2902 1
+64 2903 1
+64 2904 1
+64 2905 1
+64 2906 1
+64 2907 1
+64 2963 1
+64 2964 1
+64 2965 1
+64 2966 1
+64 2967 1
+64 2968 1
+64 2969 1
+64 2970 1
+64 2971 1
+64 2972 1
+64 2973 1
+64 2974 1
+64 2975 1
+64 2976 1
+64 2977 1
+64 2978 1
+64 2979 1
+64 2980 1
+64 2981 1
+64 2982 1
+64 3019 1
+64 3020 1
+64 3021 1
+64 3022 1
+64 3023 1
+64 3024 1
+64 3025 1
+64 3026 1
+64 3027 1
+64 3028 1
+64 3029 1
+64 3030 1
+64 3031 1
+64 3032 1
+64 3033 1
+64 3034 1
+64 3035 1
+64 3036 1
+64 3037 1
+64 3038 1
+64 3075 1
+64 3076 1
+64 3077 1
+64 3078 1
+64 3079 1
+64 3080 1
+64 3081 1
+64 3082 1
+64 3083 1
+64 3084 1
+64 3085 1
+64 3086 1
+64 3087 1
+64 3088 1
+64 3089 1
+64 3103 1
+64 3104 1
+64 3105 1
+64 3106 1
+64 3107 1
+64 3108 1
+64 3109 1
+64 3110 1
+64 3111 1
+64 3112 1
+64 3113 1
+64 3114 1
+64 3115 1
+64 3116 1
+64 3117 1
+64 3173 1
+64 3174 1
+64 3175 1
+64 3176 1
+64 3177 1
+64 3178 1
+64 3179 1
+64 3180 1
+64 3181 1
+64 3182 1
+64 3183 1
+64 3184 1
+64 3185 1
+64 3186 1
+64 3187 1
+64 3188 1
+64 3189 1
+64 3190 1
+64 3191 1
+64 3192 1
+64 3229 1
+64 3230 1
+64 3231 1
+64 3232 1
+64 3233 1
+64 3234 1
+64 3235 1
+64 3236 1
+64 3237 1
+64 3238 1
+64 3239 1
+64 3240 1
+64 3241 1
+64 3242 1
+64 3243 1
+64 3244 1
+64 3245 1
+64 3246 1
+64 3247 1
+64 3248 1
+64 3285 1
+64 3286 1
+64 3287 1
+64 3288 1
+64 3289 1
+64 3290 1
+64 3291 1
+64 3292 1
+64 3293 1
+64 3294 1
+64 3295 1
+64 3296 1
+64 3297 1
+64 3298 1
+64 3299 1
+64 3313 1
+64 3314 1
+64 3315 1
+64 3316 1
+64 3317 1
+64 3318 1
+64 3319 1
+64 3320 1
+64 3321 1
+64 3322 1
+64 3323 1
+64 3324 1
+64 3325 1
+64 3326 1
+64 3327 1
+64 3328 1
+64 3329 1
+64 3330 1
+64 3331 1
+64 3332 1
+64 3369 1
+64 3370 1
+64 3371 1
+64 3372 1
+64 3373 1
+64 3374 1
+64 3375 1
+64 3376 1
+64 3377 1
+64 3378 1
+64 3379 1
+64 3380 1
+64 3381 1
+64 3382 1
+64 3383 1
+64 3397 1
+64 3398 1
+64 3399 1
+64 3400 1
+64 3401 1
+64 3402 1
+64 3403 1
+64 3404 1
+64 3405 1
+64 3406 1
+64 3407 1
+64 3408 1
+64 3409 1
+64 3410 1
+64 3411 1
+64 3425 1
+64 3426 1
+64 3427 1
+64 3428 1
+64 3429 1
+64 3430 1
+65 10 1
+65 38 1
+65 65 1
+65 71 1
+65 72 1
+65 73 1
+65 74 1
+65 75 1
+65 122 1
+65 149 1
+65 155 1
+65 156 1
+65 157 1
+65 158 1
+65 159 1
+65 205 1
+65 211 1
+65 212 1
+65 213 1
+65 214 1
+65 215 1
+65 261 1
+65 262 1
+65 263 1
+65 264 1
+65 265 1
+65 276 1
+65 277 1
+65 278 1
+65 279 1
+65 280 1
+65 281 1
+65 282 1
+65 283 1
+65 284 1
+65 285 1
+65 332 1
+65 359 1
+65 365 1
+65 366 1
+65 367 1
+65 368 1
+65 369 1
+65 415 1
+65 421 1
+65 422 1
+65 423 1
+65 424 1
+65 425 1
+65 471 1
+65 472 1
+65 473 1
+65 474 1
+65 475 1
+65 486 1
+65 487 1
+65 488 1
+65 489 1
+65 490 1
+65 491 1
+65 492 1
+65 493 1
+65 494 1
+65 495 1
+65 541 1
+65 547 1
+65 548 1
+65 549 1
+65 550 1
+65 551 1
+65 597 1
+65 598 1
+65 599 1
+65 600 1
+65 601 1
+65 612 1
+65 613 1
+65 614 1
+65 615 1
+65 616 1
+65 617 1
+65 618 1
+65 619 1
+65 620 1
+65 621 1
+65 667 1
+65 668 1
+65 669 1
+65 670 1
+65 671 1
+65 682 1
+65 683 1
+65 684 1
+65 685 1
+65 686 1
+65 687 1
+65 688 1
+65 689 1
+65 690 1
+65 691 1
+65 737 1
+65 738 1
+65 739 1
+65 740 1
+65 741 1
+65 742 1
+65 743 1
+65 744 1
+65 745 1
+65 746 1
+65 757 1
+65 758 1
+65 759 1
+65 760 1
+65 761 1
+65 762 1
+65 763 1
+65 764 1
+65 765 1
+65 766 1
+65 794 1
+65 821 1
+65 827 1
+65 828 1
+65 829 1
+65 830 1
+65 831 1
+65 877 1
+65 883 1
+65 884 1
+65 885 1
+65 886 1
+65 887 1
+65 933 1
+65 934 1
+65 935 1
+65 936 1
+65 937 1
+65 948 1
+65 949 1
+65 950 1
+65 951 1
+65 952 1
+65 953 1
+65 954 1
+65 955 1
+65 956 1
+65 957 1
+65 1003 1
+65 1009 1
+65 1010 1
+65 1011 1
+65 1012 1
+65 1013 1
+65 1059 1
+65 1060 1
+65 1061 1
+65 1062 1
+65 1063 1
+65 1074 1
+65 1075 1
+65 1076 1
+65 1077 1
+65 1078 1
+65 1079 1
+65 1080 1
+65 1081 1
+65 1082 1
+65 1083 1
+65 1129 1
+65 1130 1
+65 1131 1
+65 1132 1
+65 1133 1
+65 1144 1
+65 1145 1
+65 1146 1
+65 1147 1
+65 1148 1
+65 1149 1
+65 1150 1
+65 1151 1
+65 1152 1
+65 1153 1
+65 1199 1
+65 1200 1
+65 1201 1
+65 1202 1
+65 1203 1
+65 1204 1
+65 1205 1
+65 1206 1
+65 1207 1
+65 1208 1
+65 1219 1
+65 1220 1
+65 1221 1
+65 1222 1
+65 1223 1
+65 1224 1
+65 1225 1
+65 1226 1
+65 1227 1
+65 1228 1
+65 1255 1
+65 1261 1
+65 1262 1
+65 1263 1
+65 1264 1
+65 1265 1
+65 1311 1
+65 1312 1
+65 1313 1
+65 1314 1
+65 1315 1
+65 1326 1
+65 1327 1
+65 1328 1
+65 1329 1
+65 1330 1
+65 1331 1
+65 1332 1
+65 1333 1
+65 1334 1
+65 1335 1
+65 1381 1
+65 1382 1
+65 1383 1
+65 1384 1
+65 1385 1
+65 1396 1
+65 1397 1
+65 1398 1
+65 1399 1
+65 1400 1
+65 1401 1
+65 1402 1
+65 1403 1
+65 1404 1
+65 1405 1
+65 1451 1
+65 1452 1
+65 1453 1
+65 1454 1
+65 1455 1
+65 1456 1
+65 1457 1
+65 1458 1
+65 1459 1
+65 1460 1
+65 1471 1
+65 1472 1
+65 1473 1
+65 1474 1
+65 1475 1
+65 1476 1
+65 1477 1
+65 1478 1
+65 1479 1
+65 1480 1
+65 1507 1
+65 1508 1
+65 1509 1
+65 1510 1
+65 1511 1
+65 1522 1
+65 1523 1
+65 1524 1
+65 1525 1
+65 1526 1
+65 1527 1
+65 1528 1
+65 1529 1
+65 1530 1
+65 1531 1
+65 1577 1
+65 1578 1
+65 1579 1
+65 1580 1
+65 1581 1
+65 1582 1
+65 1583 1
+65 1584 1
+65 1585 1
+65 1586 1
+65 1597 1
+65 1598 1
+65 1599 1
+65 1600 1
+65 1601 1
+65 1602 1
+65 1603 1
+65 1604 1
+65 1605 1
+65 1606 1
+65 1633 1
+65 1634 1
+65 1635 1
+65 1636 1
+65 1637 1
+65 1638 1
+65 1639 1
+65 1640 1
+65 1641 1
+65 1642 1
+65 1653 1
+65 1654 1
+65 1655 1
+65 1656 1
+65 1657 1
+65 1658 1
+65 1659 1
+65 1660 1
+65 1661 1
+65 1662 1
+65 1689 1
+65 1690 1
+65 1691 1
+65 1692 1
+65 1693 1
+65 1694 1
+65 1695 1
+65 1696 1
+65 1697 1
+65 1698 1
+65 1704 1
+65 1705 1
+65 1706 1
+65 1707 1
+65 1708 1
+65 1718 1
+65 1745 1
+65 1751 1
+65 1752 1
+65 1753 1
+65 1754 1
+65 1755 1
+65 1801 1
+65 1807 1
+65 1808 1
+65 1809 1
+65 1810 1
+65 1811 1
+65 1857 1
+65 1858 1
+65 1859 1
+65 1860 1
+65 1861 1
+65 1872 1
+65 1873 1
+65 1874 1
+65 1875 1
+65 1876 1
+65 1877 1
+65 1878 1
+65 1879 1
+65 1880 1
+65 1881 1
+65 1927 1
+65 1933 1
+65 1934 1
+65 1935 1
+65 1936 1
+65 1937 1
+65 1983 1
+65 1984 1
+65 1985 1
+65 1986 1
+65 1987 1
+65 1998 1
+65 1999 1
+65 2000 1
+65 2001 1
+65 2002 1
+65 2003 1
+65 2004 1
+65 2005 1
+65 2006 1
+65 2007 1
+65 2053 1
+65 2054 1
+65 2055 1
+65 2056 1
+65 2057 1
+65 2068 1
+65 2069 1
+65 2070 1
+65 2071 1
+65 2072 1
+65 2073 1
+65 2074 1
+65 2075 1
+65 2076 1
+65 2077 1
+65 2123 1
+65 2124 1
+65 2125 1
+65 2126 1
+65 2127 1
+65 2128 1
+65 2129 1
+65 2130 1
+65 2131 1
+65 2132 1
+65 2143 1
+65 2144 1
+65 2145 1
+65 2146 1
+65 2147 1
+65 2148 1
+65 2149 1
+65 2150 1
+65 2151 1
+65 2152 1
+65 2179 1
+65 2185 1
+65 2186 1
+65 2187 1
+65 2188 1
+65 2189 1
+65 2235 1
+65 2236 1
+65 2237 1
+65 2238 1
+65 2239 1
+65 2250 1
+65 2251 1
+65 2252 1
+65 2253 1
+65 2254 1
+65 2255 1
+65 2256 1
+65 2257 1
+65 2258 1
+65 2259 1
+65 2305 1
+65 2306 1
+65 2307 1
+65 2308 1
+65 2309 1
+65 2320 1
+65 2321 1
+65 2322 1
+65 2323 1
+65 2324 1
+65 2325 1
+65 2326 1
+65 2327 1
+65 2328 1
+65 2329 1
+65 2375 1
+65 2376 1
+65 2377 1
+65 2378 1
+65 2379 1
+65 2380 1
+65 2381 1
+65 2382 1
+65 2383 1
+65 2384 1
+65 2395 1
+65 2396 1
+65 2397 1
+65 2398 1
+65 2399 1
+65 2400 1
+65 2401 1
+65 2402 1
+65 2403 1
+65 2404 1
+65 2431 1
+65 2432 1
+65 2433 1
+65 2434 1
+65 2435 1
+65 2446 1
+65 2447 1
+65 2448 1
+65 2449 1
+65 2450 1
+65 2451 1
+65 2452 1
+65 2453 1
+65 2454 1
+65 2455 1
+65 2501 1
+65 2502 1
+65 2503 1
+65 2504 1
+65 2505 1
+65 2506 1
+65 2507 1
+65 2508 1
+65 2509 1
+65 2510 1
+65 2521 1
+65 2522 1
+65 2523 1
+65 2524 1
+65 2525 1
+65 2526 1
+65 2527 1
+65 2528 1
+65 2529 1
+65 2530 1
+65 2557 1
+65 2558 1
+65 2559 1
+65 2560 1
+65 2561 1
+65 2562 1
+65 2563 1
+65 2564 1
+65 2565 1
+65 2566 1
+65 2577 1
+65 2578 1
+65 2579 1
+65 2580 1
+65 2581 1
+65 2582 1
+65 2583 1
+65 2584 1
+65 2585 1
+65 2586 1
+65 2613 1
+65 2614 1
+65 2615 1
+65 2616 1
+65 2617 1
+65 2618 1
+65 2619 1
+65 2620 1
+65 2621 1
+65 2622 1
+65 2628 1
+65 2629 1
+65 2630 1
+65 2631 1
+65 2632 1
+65 2641 1
+65 2647 1
+65 2648 1
+65 2649 1
+65 2650 1
+65 2651 1
+65 2697 1
+65 2698 1
+65 2699 1
+65 2700 1
+65 2701 1
+65 2712 1
+65 2713 1
+65 2714 1
+65 2715 1
+65 2716 1
+65 2717 1
+65 2718 1
+65 2719 1
+65 2720 1
+65 2721 1
+65 2767 1
+65 2768 1
+65 2769 1
+65 2770 1
+65 2771 1
+65 2782 1
+65 2783 1
+65 2784 1
+65 2785 1
+65 2786 1
+65 2787 1
+65 2788 1
+65 2789 1
+65 2790 1
+65 2791 1
+65 2837 1
+65 2838 1
+65 2839 1
+65 2840 1
+65 2841 1
+65 2842 1
+65 2843 1
+65 2844 1
+65 2845 1
+65 2846 1
+65 2857 1
+65 2858 1
+65 2859 1
+65 2860 1
+65 2861 1
+65 2862 1
+65 2863 1
+65 2864 1
+65 2865 1
+65 2866 1
+65 2893 1
+65 2894 1
+65 2895 1
+65 2896 1
+65 2897 1
+65 2908 1
+65 2909 1
+65 2910 1
+65 2911 1
+65 2912 1
+65 2913 1
+65 2914 1
+65 2915 1
+65 2916 1
+65 2917 1
+65 2963 1
+65 2964 1
+65 2965 1
+65 2966 1
+65 2967 1
+65 2968 1
+65 2969 1
+65 2970 1
+65 2971 1
+65 2972 1
+65 2983 1
+65 2984 1
+65 2985 1
+65 2986 1
+65 2987 1
+65 2988 1
+65 2989 1
+65 2990 1
+65 2991 1
+65 2992 1
+65 3019 1
+65 3020 1
+65 3021 1
+65 3022 1
+65 3023 1
+65 3024 1
+65 3025 1
+65 3026 1
+65 3027 1
+65 3028 1
+65 3039 1
+65 3040 1
+65 3041 1
+65 3042 1
+65 3043 1
+65 3044 1
+65 3045 1
+65 3046 1
+65 3047 1
+65 3048 1
+65 3075 1
+65 3076 1
+65 3077 1
+65 3078 1
+65 3079 1
+65 3080 1
+65 3081 1
+65 3082 1
+65 3083 1
+65 3084 1
+65 3090 1
+65 3091 1
+65 3092 1
+65 3093 1
+65 3094 1
+65 3103 1
+65 3104 1
+65 3105 1
+65 3106 1
+65 3107 1
+65 3118 1
+65 3119 1
+65 3120 1
+65 3121 1
+65 3122 1
+65 3123 1
+65 3124 1
+65 3125 1
+65 3126 1
+65 3127 1
+65 3173 1
+65 3174 1
+65 3175 1
+65 3176 1
+65 3177 1
+65 3178 1
+65 3179 1
+65 3180 1
+65 3181 1
+65 3182 1
+65 3193 1
+65 3194 1
+65 3195 1
+65 3196 1
+65 3197 1
+65 3198 1
+65 3199 1
+65 3200 1
+65 3201 1
+65 3202 1
+65 3229 1
+65 3230 1
+65 3231 1
+65 3232 1
+65 3233 1
+65 3234 1
+65 3235 1
+65 3236 1
+65 3237 1
+65 3238 1
+65 3249 1
+65 3250 1
+65 3251 1
+65 3252 1
+65 3253 1
+65 3254 1
+65 3255 1
+65 3256 1
+65 3257 1
+65 3258 1
+65 3285 1
+65 3286 1
+65 3287 1
+65 3288 1
+65 3289 1
+65 3290 1
+65 3291 1
+65 3292 1
+65 3293 1
+65 3294 1
+65 3300 1
+65 3301 1
+65 3302 1
+65 3303 1
+65 3304 1
+65 3313 1
+65 3314 1
+65 3315 1
+65 3316 1
+65 3317 1
+65 3318 1
+65 3319 1
+65 3320 1
+65 3321 1
+65 3322 1
+65 3333 1
+65 3334 1
+65 3335 1
+65 3336 1
+65 3337 1
+65 3338 1
+65 3339 1
+65 3340 1
+65 3341 1
+65 3342 1
+65 3369 1
+65 3370 1
+65 3371 1
+65 3372 1
+65 3373 1
+65 3374 1
+65 3375 1
+65 3376 1
+65 3377 1
+65 3378 1
+65 3384 1
+65 3385 1
+65 3386 1
+65 3387 1
+65 3388 1
+65 3397 1
+65 3398 1
+65 3399 1
+65 3400 1
+65 3401 1
+65 3402 1
+65 3403 1
+65 3404 1
+65 3405 1
+65 3406 1
+65 3412 1
+65 3413 1
+65 3414 1
+65 3415 1
+65 3416 1
+65 3425 1
+65 3426 1
+65 3427 1
+65 3428 1
+65 3429 1
+65 3431 1
+66 11 1
+66 39 1
+66 66 1
+66 71 1
+66 76 1
+66 77 1
+66 78 1
+66 79 1
+66 123 1
+66 150 1
+66 155 1
+66 160 1
+66 161 1
+66 162 1
+66 163 1
+66 206 1
+66 211 1
+66 216 1
+66 217 1
+66 218 1
+66 219 1
+66 261 1
+66 266 1
+66 267 1
+66 268 1
+66 269 1
+66 276 1
+66 277 1
+66 278 1
+66 279 1
+66 286 1
+66 287 1
+66 288 1
+66 289 1
+66 290 1
+66 291 1
+66 333 1
+66 360 1
+66 365 1
+66 370 1
+66 371 1
+66 372 1
+66 373 1
+66 416 1
+66 421 1
+66 426 1
+66 427 1
+66 428 1
+66 429 1
+66 471 1
+66 476 1
+66 477 1
+66 478 1
+66 479 1
+66 486 1
+66 487 1
+66 488 1
+66 489 1
+66 496 1
+66 497 1
+66 498 1
+66 499 1
+66 500 1
+66 501 1
+66 542 1
+66 547 1
+66 552 1
+66 553 1
+66 554 1
+66 555 1
+66 597 1
+66 602 1
+66 603 1
+66 604 1
+66 605 1
+66 612 1
+66 613 1
+66 614 1
+66 615 1
+66 622 1
+66 623 1
+66 624 1
+66 625 1
+66 626 1
+66 627 1
+66 667 1
+66 672 1
+66 673 1
+66 674 1
+66 675 1
+66 682 1
+66 683 1
+66 684 1
+66 685 1
+66 692 1
+66 693 1
+66 694 1
+66 695 1
+66 696 1
+66 697 1
+66 737 1
+66 738 1
+66 739 1
+66 740 1
+66 747 1
+66 748 1
+66 749 1
+66 750 1
+66 751 1
+66 752 1
+66 757 1
+66 758 1
+66 759 1
+66 760 1
+66 761 1
+66 762 1
+66 767 1
+66 768 1
+66 769 1
+66 770 1
+66 795 1
+66 822 1
+66 827 1
+66 832 1
+66 833 1
+66 834 1
+66 835 1
+66 878 1
+66 883 1
+66 888 1
+66 889 1
+66 890 1
+66 891 1
+66 933 1
+66 938 1
+66 939 1
+66 940 1
+66 941 1
+66 948 1
+66 949 1
+66 950 1
+66 951 1
+66 958 1
+66 959 1
+66 960 1
+66 961 1
+66 962 1
+66 963 1
+66 1004 1
+66 1009 1
+66 1014 1
+66 1015 1
+66 1016 1
+66 1017 1
+66 1059 1
+66 1064 1
+66 1065 1
+66 1066 1
+66 1067 1
+66 1074 1
+66 1075 1
+66 1076 1
+66 1077 1
+66 1084 1
+66 1085 1
+66 1086 1
+66 1087 1
+66 1088 1
+66 1089 1
+66 1129 1
+66 1134 1
+66 1135 1
+66 1136 1
+66 1137 1
+66 1144 1
+66 1145 1
+66 1146 1
+66 1147 1
+66 1154 1
+66 1155 1
+66 1156 1
+66 1157 1
+66 1158 1
+66 1159 1
+66 1199 1
+66 1200 1
+66 1201 1
+66 1202 1
+66 1209 1
+66 1210 1
+66 1211 1
+66 1212 1
+66 1213 1
+66 1214 1
+66 1219 1
+66 1220 1
+66 1221 1
+66 1222 1
+66 1223 1
+66 1224 1
+66 1229 1
+66 1230 1
+66 1231 1
+66 1232 1
+66 1256 1
+66 1261 1
+66 1266 1
+66 1267 1
+66 1268 1
+66 1269 1
+66 1311 1
+66 1316 1
+66 1317 1
+66 1318 1
+66 1319 1
+66 1326 1
+66 1327 1
+66 1328 1
+66 1329 1
+66 1336 1
+66 1337 1
+66 1338 1
+66 1339 1
+66 1340 1
+66 1341 1
+66 1381 1
+66 1386 1
+66 1387 1
+66 1388 1
+66 1389 1
+66 1396 1
+66 1397 1
+66 1398 1
+66 1399 1
+66 1406 1
+66 1407 1
+66 1408 1
+66 1409 1
+66 1410 1
+66 1411 1
+66 1451 1
+66 1452 1
+66 1453 1
+66 1454 1
+66 1461 1
+66 1462 1
+66 1463 1
+66 1464 1
+66 1465 1
+66 1466 1
+66 1471 1
+66 1472 1
+66 1473 1
+66 1474 1
+66 1475 1
+66 1476 1
+66 1481 1
+66 1482 1
+66 1483 1
+66 1484 1
+66 1507 1
+66 1512 1
+66 1513 1
+66 1514 1
+66 1515 1
+66 1522 1
+66 1523 1
+66 1524 1
+66 1525 1
+66 1532 1
+66 1533 1
+66 1534 1
+66 1535 1
+66 1536 1
+66 1537 1
+66 1577 1
+66 1578 1
+66 1579 1
+66 1580 1
+66 1587 1
+66 1588 1
+66 1589 1
+66 1590 1
+66 1591 1
+66 1592 1
+66 1597 1
+66 1598 1
+66 1599 1
+66 1600 1
+66 1601 1
+66 1602 1
+66 1607 1
+66 1608 1
+66 1609 1
+66 1610 1
+66 1633 1
+66 1634 1
+66 1635 1
+66 1636 1
+66 1643 1
+66 1644 1
+66 1645 1
+66 1646 1
+66 1647 1
+66 1648 1
+66 1653 1
+66 1654 1
+66 1655 1
+66 1656 1
+66 1657 1
+66 1658 1
+66 1663 1
+66 1664 1
+66 1665 1
+66 1666 1
+66 1689 1
+66 1690 1
+66 1691 1
+66 1692 1
+66 1693 1
+66 1694 1
+66 1699 1
+66 1700 1
+66 1701 1
+66 1702 1
+66 1704 1
+66 1705 1
+66 1706 1
+66 1707 1
+66 1709 1
+66 1719 1
+66 1746 1
+66 1751 1
+66 1756 1
+66 1757 1
+66 1758 1
+66 1759 1
+66 1802 1
+66 1807 1
+66 1812 1
+66 1813 1
+66 1814 1
+66 1815 1
+66 1857 1
+66 1862 1
+66 1863 1
+66 1864 1
+66 1865 1
+66 1872 1
+66 1873 1
+66 1874 1
+66 1875 1
+66 1882 1
+66 1883 1
+66 1884 1
+66 1885 1
+66 1886 1
+66 1887 1
+66 1928 1
+66 1933 1
+66 1938 1
+66 1939 1
+66 1940 1
+66 1941 1
+66 1983 1
+66 1988 1
+66 1989 1
+66 1990 1
+66 1991 1
+66 1998 1
+66 1999 1
+66 2000 1
+66 2001 1
+66 2008 1
+66 2009 1
+66 2010 1
+66 2011 1
+66 2012 1
+66 2013 1
+66 2053 1
+66 2058 1
+66 2059 1
+66 2060 1
+66 2061 1
+66 2068 1
+66 2069 1
+66 2070 1
+66 2071 1
+66 2078 1
+66 2079 1
+66 2080 1
+66 2081 1
+66 2082 1
+66 2083 1
+66 2123 1
+66 2124 1
+66 2125 1
+66 2126 1
+66 2133 1
+66 2134 1
+66 2135 1
+66 2136 1
+66 2137 1
+66 2138 1
+66 2143 1
+66 2144 1
+66 2145 1
+66 2146 1
+66 2147 1
+66 2148 1
+66 2153 1
+66 2154 1
+66 2155 1
+66 2156 1
+66 2180 1
+66 2185 1
+66 2190 1
+66 2191 1
+66 2192 1
+66 2193 1
+66 2235 1
+66 2240 1
+66 2241 1
+66 2242 1
+66 2243 1
+66 2250 1
+66 2251 1
+66 2252 1
+66 2253 1
+66 2260 1
+66 2261 1
+66 2262 1
+66 2263 1
+66 2264 1
+66 2265 1
+66 2305 1
+66 2310 1
+66 2311 1
+66 2312 1
+66 2313 1
+66 2320 1
+66 2321 1
+66 2322 1
+66 2323 1
+66 2330 1
+66 2331 1
+66 2332 1
+66 2333 1
+66 2334 1
+66 2335 1
+66 2375 1
+66 2376 1
+66 2377 1
+66 2378 1
+66 2385 1
+66 2386 1
+66 2387 1
+66 2388 1
+66 2389 1
+66 2390 1
+66 2395 1
+66 2396 1
+66 2397 1
+66 2398 1
+66 2399 1
+66 2400 1
+66 2405 1
+66 2406 1
+66 2407 1
+66 2408 1
+66 2431 1
+66 2436 1
+66 2437 1
+66 2438 1
+66 2439 1
+66 2446 1
+66 2447 1
+66 2448 1
+66 2449 1
+66 2456 1
+66 2457 1
+66 2458 1
+66 2459 1
+66 2460 1
+66 2461 1
+66 2501 1
+66 2502 1
+66 2503 1
+66 2504 1
+66 2511 1
+66 2512 1
+66 2513 1
+66 2514 1
+66 2515 1
+66 2516 1
+66 2521 1
+66 2522 1
+66 2523 1
+66 2524 1
+66 2525 1
+66 2526 1
+66 2531 1
+66 2532 1
+66 2533 1
+66 2534 1
+66 2557 1
+66 2558 1
+66 2559 1
+66 2560 1
+66 2567 1
+66 2568 1
+66 2569 1
+66 2570 1
+66 2571 1
+66 2572 1
+66 2577 1
+66 2578 1
+66 2579 1
+66 2580 1
+66 2581 1
+66 2582 1
+66 2587 1
+66 2588 1
+66 2589 1
+66 2590 1
+66 2613 1
+66 2614 1
+66 2615 1
+66 2616 1
+66 2617 1
+66 2618 1
+66 2623 1
+66 2624 1
+66 2625 1
+66 2626 1
+66 2628 1
+66 2629 1
+66 2630 1
+66 2631 1
+66 2633 1
+66 2642 1
+66 2647 1
+66 2652 1
+66 2653 1
+66 2654 1
+66 2655 1
+66 2697 1
+66 2702 1
+66 2703 1
+66 2704 1
+66 2705 1
+66 2712 1
+66 2713 1
+66 2714 1
+66 2715 1
+66 2722 1
+66 2723 1
+66 2724 1
+66 2725 1
+66 2726 1
+66 2727 1
+66 2767 1
+66 2772 1
+66 2773 1
+66 2774 1
+66 2775 1
+66 2782 1
+66 2783 1
+66 2784 1
+66 2785 1
+66 2792 1
+66 2793 1
+66 2794 1
+66 2795 1
+66 2796 1
+66 2797 1
+66 2837 1
+66 2838 1
+66 2839 1
+66 2840 1
+66 2847 1
+66 2848 1
+66 2849 1
+66 2850 1
+66 2851 1
+66 2852 1
+66 2857 1
+66 2858 1
+66 2859 1
+66 2860 1
+66 2861 1
+66 2862 1
+66 2867 1
+66 2868 1
+66 2869 1
+66 2870 1
+66 2893 1
+66 2898 1
+66 2899 1
+66 2900 1
+66 2901 1
+66 2908 1
+66 2909 1
+66 2910 1
+66 2911 1
+66 2918 1
+66 2919 1
+66 2920 1
+66 2921 1
+66 2922 1
+66 2923 1
+66 2963 1
+66 2964 1
+66 2965 1
+66 2966 1
+66 2973 1
+66 2974 1
+66 2975 1
+66 2976 1
+66 2977 1
+66 2978 1
+66 2983 1
+66 2984 1
+66 2985 1
+66 2986 1
+66 2987 1
+66 2988 1
+66 2993 1
+66 2994 1
+66 2995 1
+66 2996 1
+66 3019 1
+66 3020 1
+66 3021 1
+66 3022 1
+66 3029 1
+66 3030 1
+66 3031 1
+66 3032 1
+66 3033 1
+66 3034 1
+66 3039 1
+66 3040 1
+66 3041 1
+66 3042 1
+66 3043 1
+66 3044 1
+66 3049 1
+66 3050 1
+66 3051 1
+66 3052 1
+66 3075 1
+66 3076 1
+66 3077 1
+66 3078 1
+66 3079 1
+66 3080 1
+66 3085 1
+66 3086 1
+66 3087 1
+66 3088 1
+66 3090 1
+66 3091 1
+66 3092 1
+66 3093 1
+66 3095 1
+66 3103 1
+66 3108 1
+66 3109 1
+66 3110 1
+66 3111 1
+66 3118 1
+66 3119 1
+66 3120 1
+66 3121 1
+66 3128 1
+66 3129 1
+66 3130 1
+66 3131 1
+66 3132 1
+66 3133 1
+66 3173 1
+66 3174 1
+66 3175 1
+66 3176 1
+66 3183 1
+66 3184 1
+66 3185 1
+66 3186 1
+66 3187 1
+66 3188 1
+66 3193 1
+66 3194 1
+66 3195 1
+66 3196 1
+66 3197 1
+66 3198 1
+66 3203 1
+66 3204 1
+66 3205 1
+66 3206 1
+66 3229 1
+66 3230 1
+66 3231 1
+66 3232 1
+66 3239 1
+66 3240 1
+66 3241 1
+66 3242 1
+66 3243 1
+66 3244 1
+66 3249 1
+66 3250 1
+66 3251 1
+66 3252 1
+66 3253 1
+66 3254 1
+66 3259 1
+66 3260 1
+66 3261 1
+66 3262 1
+66 3285 1
+66 3286 1
+66 3287 1
+66 3288 1
+66 3289 1
+66 3290 1
+66 3295 1
+66 3296 1
+66 3297 1
+66 3298 1
+66 3300 1
+66 3301 1
+66 3302 1
+66 3303 1
+66 3305 1
+66 3313 1
+66 3314 1
+66 3315 1
+66 3316 1
+66 3323 1
+66 3324 1
+66 3325 1
+66 3326 1
+66 3327 1
+66 3328 1
+66 3333 1
+66 3334 1
+66 3335 1
+66 3336 1
+66 3337 1
+66 3338 1
+66 3343 1
+66 3344 1
+66 3345 1
+66 3346 1
+66 3369 1
+66 3370 1
+66 3371 1
+66 3372 1
+66 3373 1
+66 3374 1
+66 3379 1
+66 3380 1
+66 3381 1
+66 3382 1
+66 3384 1
+66 3385 1
+66 3386 1
+66 3387 1
+66 3389 1
+66 3397 1
+66 3398 1
+66 3399 1
+66 3400 1
+66 3401 1
+66 3402 1
+66 3407 1
+66 3408 1
+66 3409 1
+66 3410 1
+66 3412 1
+66 3413 1
+66 3414 1
+66 3415 1
+66 3417 1
+66 3425 1
+66 3426 1
+66 3427 1
+66 3428 1
+66 3430 1
+66 3431 1
+67 12 1
+67 40 1
+67 67 1
+67 72 1
+67 76 1
+67 80 1
+67 81 1
+67 82 1
+67 124 1
+67 151 1
+67 156 1
+67 160 1
+67 164 1
+67 165 1
+67 166 1
+67 207 1
+67 212 1
+67 216 1
+67 220 1
+67 221 1
+67 222 1
+67 262 1
+67 266 1
+67 270 1
+67 271 1
+67 272 1
+67 276 1
+67 280 1
+67 281 1
+67 282 1
+67 286 1
+67 287 1
+67 288 1
+67 292 1
+67 293 1
+67 294 1
+67 334 1
+67 361 1
+67 366 1
+67 370 1
+67 374 1
+67 375 1
+67 376 1
+67 417 1
+67 422 1
+67 426 1
+67 430 1
+67 431 1
+67 432 1
+67 472 1
+67 476 1
+67 480 1
+67 481 1
+67 482 1
+67 486 1
+67 490 1
+67 491 1
+67 492 1
+67 496 1
+67 497 1
+67 498 1
+67 502 1
+67 503 1
+67 504 1
+67 543 1
+67 548 1
+67 552 1
+67 556 1
+67 557 1
+67 558 1
+67 598 1
+67 602 1
+67 606 1
+67 607 1
+67 608 1
+67 612 1
+67 616 1
+67 617 1
+67 618 1
+67 622 1
+67 623 1
+67 624 1
+67 628 1
+67 629 1
+67 630 1
+67 668 1
+67 672 1
+67 676 1
+67 677 1
+67 678 1
+67 682 1
+67 686 1
+67 687 1
+67 688 1
+67 692 1
+67 693 1
+67 694 1
+67 698 1
+67 699 1
+67 700 1
+67 737 1
+67 741 1
+67 742 1
+67 743 1
+67 747 1
+67 748 1
+67 749 1
+67 753 1
+67 754 1
+67 755 1
+67 757 1
+67 758 1
+67 759 1
+67 763 1
+67 764 1
+67 765 1
+67 767 1
+67 768 1
+67 769 1
+67 771 1
+67 796 1
+67 823 1
+67 828 1
+67 832 1
+67 836 1
+67 837 1
+67 838 1
+67 879 1
+67 884 1
+67 888 1
+67 892 1
+67 893 1
+67 894 1
+67 934 1
+67 938 1
+67 942 1
+67 943 1
+67 944 1
+67 948 1
+67 952 1
+67 953 1
+67 954 1
+67 958 1
+67 959 1
+67 960 1
+67 964 1
+67 965 1
+67 966 1
+67 1005 1
+67 1010 1
+67 1014 1
+67 1018 1
+67 1019 1
+67 1020 1
+67 1060 1
+67 1064 1
+67 1068 1
+67 1069 1
+67 1070 1
+67 1074 1
+67 1078 1
+67 1079 1
+67 1080 1
+67 1084 1
+67 1085 1
+67 1086 1
+67 1090 1
+67 1091 1
+67 1092 1
+67 1130 1
+67 1134 1
+67 1138 1
+67 1139 1
+67 1140 1
+67 1144 1
+67 1148 1
+67 1149 1
+67 1150 1
+67 1154 1
+67 1155 1
+67 1156 1
+67 1160 1
+67 1161 1
+67 1162 1
+67 1199 1
+67 1203 1
+67 1204 1
+67 1205 1
+67 1209 1
+67 1210 1
+67 1211 1
+67 1215 1
+67 1216 1
+67 1217 1
+67 1219 1
+67 1220 1
+67 1221 1
+67 1225 1
+67 1226 1
+67 1227 1
+67 1229 1
+67 1230 1
+67 1231 1
+67 1233 1
+67 1257 1
+67 1262 1
+67 1266 1
+67 1270 1
+67 1271 1
+67 1272 1
+67 1312 1
+67 1316 1
+67 1320 1
+67 1321 1
+67 1322 1
+67 1326 1
+67 1330 1
+67 1331 1
+67 1332 1
+67 1336 1
+67 1337 1
+67 1338 1
+67 1342 1
+67 1343 1
+67 1344 1
+67 1382 1
+67 1386 1
+67 1390 1
+67 1391 1
+67 1392 1
+67 1396 1
+67 1400 1
+67 1401 1
+67 1402 1
+67 1406 1
+67 1407 1
+67 1408 1
+67 1412 1
+67 1413 1
+67 1414 1
+67 1451 1
+67 1455 1
+67 1456 1
+67 1457 1
+67 1461 1
+67 1462 1
+67 1463 1
+67 1467 1
+67 1468 1
+67 1469 1
+67 1471 1
+67 1472 1
+67 1473 1
+67 1477 1
+67 1478 1
+67 1479 1
+67 1481 1
+67 1482 1
+67 1483 1
+67 1485 1
+67 1508 1
+67 1512 1
+67 1516 1
+67 1517 1
+67 1518 1
+67 1522 1
+67 1526 1
+67 1527 1
+67 1528 1
+67 1532 1
+67 1533 1
+67 1534 1
+67 1538 1
+67 1539 1
+67 1540 1
+67 1577 1
+67 1581 1
+67 1582 1
+67 1583 1
+67 1587 1
+67 1588 1
+67 1589 1
+67 1593 1
+67 1594 1
+67 1595 1
+67 1597 1
+67 1598 1
+67 1599 1
+67 1603 1
+67 1604 1
+67 1605 1
+67 1607 1
+67 1608 1
+67 1609 1
+67 1611 1
+67 1633 1
+67 1637 1
+67 1638 1
+67 1639 1
+67 1643 1
+67 1644 1
+67 1645 1
+67 1649 1
+67 1650 1
+67 1651 1
+67 1653 1
+67 1654 1
+67 1655 1
+67 1659 1
+67 1660 1
+67 1661 1
+67 1663 1
+67 1664 1
+67 1665 1
+67 1667 1
+67 1689 1
+67 1690 1
+67 1691 1
+67 1695 1
+67 1696 1
+67 1697 1
+67 1699 1
+67 1700 1
+67 1701 1
+67 1703 1
+67 1704 1
+67 1705 1
+67 1706 1
+67 1708 1
+67 1709 1
+67 1720 1
+67 1747 1
+67 1752 1
+67 1756 1
+67 1760 1
+67 1761 1
+67 1762 1
+67 1803 1
+67 1808 1
+67 1812 1
+67 1816 1
+67 1817 1
+67 1818 1
+67 1858 1
+67 1862 1
+67 1866 1
+67 1867 1
+67 1868 1
+67 1872 1
+67 1876 1
+67 1877 1
+67 1878 1
+67 1882 1
+67 1883 1
+67 1884 1
+67 1888 1
+67 1889 1
+67 1890 1
+67 1929 1
+67 1934 1
+67 1938 1
+67 1942 1
+67 1943 1
+67 1944 1
+67 1984 1
+67 1988 1
+67 1992 1
+67 1993 1
+67 1994 1
+67 1998 1
+67 2002 1
+67 2003 1
+67 2004 1
+67 2008 1
+67 2009 1
+67 2010 1
+67 2014 1
+67 2015 1
+67 2016 1
+67 2054 1
+67 2058 1
+67 2062 1
+67 2063 1
+67 2064 1
+67 2068 1
+67 2072 1
+67 2073 1
+67 2074 1
+67 2078 1
+67 2079 1
+67 2080 1
+67 2084 1
+67 2085 1
+67 2086 1
+67 2123 1
+67 2127 1
+67 2128 1
+67 2129 1
+67 2133 1
+67 2134 1
+67 2135 1
+67 2139 1
+67 2140 1
+67 2141 1
+67 2143 1
+67 2144 1
+67 2145 1
+67 2149 1
+67 2150 1
+67 2151 1
+67 2153 1
+67 2154 1
+67 2155 1
+67 2157 1
+67 2181 1
+67 2186 1
+67 2190 1
+67 2194 1
+67 2195 1
+67 2196 1
+67 2236 1
+67 2240 1
+67 2244 1
+67 2245 1
+67 2246 1
+67 2250 1
+67 2254 1
+67 2255 1
+67 2256 1
+67 2260 1
+67 2261 1
+67 2262 1
+67 2266 1
+67 2267 1
+67 2268 1
+67 2306 1
+67 2310 1
+67 2314 1
+67 2315 1
+67 2316 1
+67 2320 1
+67 2324 1
+67 2325 1
+67 2326 1
+67 2330 1
+67 2331 1
+67 2332 1
+67 2336 1
+67 2337 1
+67 2338 1
+67 2375 1
+67 2379 1
+67 2380 1
+67 2381 1
+67 2385 1
+67 2386 1
+67 2387 1
+67 2391 1
+67 2392 1
+67 2393 1
+67 2395 1
+67 2396 1
+67 2397 1
+67 2401 1
+67 2402 1
+67 2403 1
+67 2405 1
+67 2406 1
+67 2407 1
+67 2409 1
+67 2432 1
+67 2436 1
+67 2440 1
+67 2441 1
+67 2442 1
+67 2446 1
+67 2450 1
+67 2451 1
+67 2452 1
+67 2456 1
+67 2457 1
+67 2458 1
+67 2462 1
+67 2463 1
+67 2464 1
+67 2501 1
+67 2505 1
+67 2506 1
+67 2507 1
+67 2511 1
+67 2512 1
+67 2513 1
+67 2517 1
+67 2518 1
+67 2519 1
+67 2521 1
+67 2522 1
+67 2523 1
+67 2527 1
+67 2528 1
+67 2529 1
+67 2531 1
+67 2532 1
+67 2533 1
+67 2535 1
+67 2557 1
+67 2561 1
+67 2562 1
+67 2563 1
+67 2567 1
+67 2568 1
+67 2569 1
+67 2573 1
+67 2574 1
+67 2575 1
+67 2577 1
+67 2578 1
+67 2579 1
+67 2583 1
+67 2584 1
+67 2585 1
+67 2587 1
+67 2588 1
+67 2589 1
+67 2591 1
+67 2613 1
+67 2614 1
+67 2615 1
+67 2619 1
+67 2620 1
+67 2621 1
+67 2623 1
+67 2624 1
+67 2625 1
+67 2627 1
+67 2628 1
+67 2629 1
+67 2630 1
+67 2632 1
+67 2633 1
+67 2643 1
+67 2648 1
+67 2652 1
+67 2656 1
+67 2657 1
+67 2658 1
+67 2698 1
+67 2702 1
+67 2706 1
+67 2707 1
+67 2708 1
+67 2712 1
+67 2716 1
+67 2717 1
+67 2718 1
+67 2722 1
+67 2723 1
+67 2724 1
+67 2728 1
+67 2729 1
+67 2730 1
+67 2768 1
+67 2772 1
+67 2776 1
+67 2777 1
+67 2778 1
+67 2782 1
+67 2786 1
+67 2787 1
+67 2788 1
+67 2792 1
+67 2793 1
+67 2794 1
+67 2798 1
+67 2799 1
+67 2800 1
+67 2837 1
+67 2841 1
+67 2842 1
+67 2843 1
+67 2847 1
+67 2848 1
+67 2849 1
+67 2853 1
+67 2854 1
+67 2855 1
+67 2857 1
+67 2858 1
+67 2859 1
+67 2863 1
+67 2864 1
+67 2865 1
+67 2867 1
+67 2868 1
+67 2869 1
+67 2871 1
+67 2894 1
+67 2898 1
+67 2902 1
+67 2903 1
+67 2904 1
+67 2908 1
+67 2912 1
+67 2913 1
+67 2914 1
+67 2918 1
+67 2919 1
+67 2920 1
+67 2924 1
+67 2925 1
+67 2926 1
+67 2963 1
+67 2967 1
+67 2968 1
+67 2969 1
+67 2973 1
+67 2974 1
+67 2975 1
+67 2979 1
+67 2980 1
+67 2981 1
+67 2983 1
+67 2984 1
+67 2985 1
+67 2989 1
+67 2990 1
+67 2991 1
+67 2993 1
+67 2994 1
+67 2995 1
+67 2997 1
+67 3019 1
+67 3023 1
+67 3024 1
+67 3025 1
+67 3029 1
+67 3030 1
+67 3031 1
+67 3035 1
+67 3036 1
+67 3037 1
+67 3039 1
+67 3040 1
+67 3041 1
+67 3045 1
+67 3046 1
+67 3047 1
+67 3049 1
+67 3050 1
+67 3051 1
+67 3053 1
+67 3075 1
+67 3076 1
+67 3077 1
+67 3081 1
+67 3082 1
+67 3083 1
+67 3085 1
+67 3086 1
+67 3087 1
+67 3089 1
+67 3090 1
+67 3091 1
+67 3092 1
+67 3094 1
+67 3095 1
+67 3104 1
+67 3108 1
+67 3112 1
+67 3113 1
+67 3114 1
+67 3118 1
+67 3122 1
+67 3123 1
+67 3124 1
+67 3128 1
+67 3129 1
+67 3130 1
+67 3134 1
+67 3135 1
+67 3136 1
+67 3173 1
+67 3177 1
+67 3178 1
+67 3179 1
+67 3183 1
+67 3184 1
+67 3185 1
+67 3189 1
+67 3190 1
+67 3191 1
+67 3193 1
+67 3194 1
+67 3195 1
+67 3199 1
+67 3200 1
+67 3201 1
+67 3203 1
+67 3204 1
+67 3205 1
+67 3207 1
+67 3229 1
+67 3233 1
+67 3234 1
+67 3235 1
+67 3239 1
+67 3240 1
+67 3241 1
+67 3245 1
+67 3246 1
+67 3247 1
+67 3249 1
+67 3250 1
+67 3251 1
+67 3255 1
+67 3256 1
+67 3257 1
+67 3259 1
+67 3260 1
+67 3261 1
+67 3263 1
+67 3285 1
+67 3286 1
+67 3287 1
+67 3291 1
+67 3292 1
+67 3293 1
+67 3295 1
+67 3296 1
+67 3297 1
+67 3299 1
+67 3300 1
+67 3301 1
+67 3302 1
+67 3304 1
+67 3305 1
+67 3313 1
+67 3317 1
+67 3318 1
+67 3319 1
+67 3323 1
+67 3324 1
+67 3325 1
+67 3329 1
+67 3330 1
+67 3331 1
+67 3333 1
+67 3334 1
+67 3335 1
+67 3339 1
+67 3340 1
+67 3341 1
+67 3343 1
+67 3344 1
+67 3345 1
+67 3347 1
+67 3369 1
+67 3370 1
+67 3371 1
+67 3375 1
+67 3376 1
+67 3377 1
+67 3379 1
+67 3380 1
+67 3381 1
+67 3383 1
+67 3384 1
+67 3385 1
+67 3386 1
+67 3388 1
+67 3389 1
+67 3397 1
+67 3398 1
+67 3399 1
+67 3403 1
+67 3404 1
+67 3405 1
+67 3407 1
+67 3408 1
+67 3409 1
+67 3411 1
+67 3412 1
+67 3413 1
+67 3414 1
+67 3416 1
+67 3417 1
+67 3425 1
+67 3426 1
+67 3427 1
+67 3429 1
+67 3430 1
+67 3431 1
+68 13 1
+68 41 1
+68 68 1
+68 73 1
+68 77 1
+68 80 1
+68 83 1
+68 84 1
+68 125 1
+68 152 1
+68 157 1
+68 161 1
+68 164 1
+68 167 1
+68 168 1
+68 208 1
+68 213 1
+68 217 1
+68 220 1
+68 223 1
+68 224 1
+68 263 1
+68 267 1
+68 270 1
+68 273 1
+68 274 1
+68 277 1
+68 280 1
+68 283 1
+68 284 1
+68 286 1
+68 289 1
+68 290 1
+68 292 1
+68 293 1
+68 295 1
+68 335 1
+68 362 1
+68 367 1
+68 371 1
+68 374 1
+68 377 1
+68 378 1
+68 418 1
+68 423 1
+68 427 1
+68 430 1
+68 433 1
+68 434 1
+68 473 1
+68 477 1
+68 480 1
+68 483 1
+68 484 1
+68 487 1
+68 490 1
+68 493 1
+68 494 1
+68 496 1
+68 499 1
+68 500 1
+68 502 1
+68 503 1
+68 505 1
+68 544 1
+68 549 1
+68 553 1
+68 556 1
+68 559 1
+68 560 1
+68 599 1
+68 603 1
+68 606 1
+68 609 1
+68 610 1
+68 613 1
+68 616 1
+68 619 1
+68 620 1
+68 622 1
+68 625 1
+68 626 1
+68 628 1
+68 629 1
+68 631 1
+68 669 1
+68 673 1
+68 676 1
+68 679 1
+68 680 1
+68 683 1
+68 686 1
+68 689 1
+68 690 1
+68 692 1
+68 695 1
+68 696 1
+68 698 1
+68 699 1
+68 701 1
+68 738 1
+68 741 1
+68 744 1
+68 745 1
+68 747 1
+68 750 1
+68 751 1
+68 753 1
+68 754 1
+68 756 1
+68 757 1
+68 760 1
+68 761 1
+68 763 1
+68 764 1
+68 766 1
+68 767 1
+68 768 1
+68 770 1
+68 771 1
+68 797 1
+68 824 1
+68 829 1
+68 833 1
+68 836 1
+68 839 1
+68 840 1
+68 880 1
+68 885 1
+68 889 1
+68 892 1
+68 895 1
+68 896 1
+68 935 1
+68 939 1
+68 942 1
+68 945 1
+68 946 1
+68 949 1
+68 952 1
+68 955 1
+68 956 1
+68 958 1
+68 961 1
+68 962 1
+68 964 1
+68 965 1
+68 967 1
+68 1006 1
+68 1011 1
+68 1015 1
+68 1018 1
+68 1021 1
+68 1022 1
+68 1061 1
+68 1065 1
+68 1068 1
+68 1071 1
+68 1072 1
+68 1075 1
+68 1078 1
+68 1081 1
+68 1082 1
+68 1084 1
+68 1087 1
+68 1088 1
+68 1090 1
+68 1091 1
+68 1093 1
+68 1131 1
+68 1135 1
+68 1138 1
+68 1141 1
+68 1142 1
+68 1145 1
+68 1148 1
+68 1151 1
+68 1152 1
+68 1154 1
+68 1157 1
+68 1158 1
+68 1160 1
+68 1161 1
+68 1163 1
+68 1200 1
+68 1203 1
+68 1206 1
+68 1207 1
+68 1209 1
+68 1212 1
+68 1213 1
+68 1215 1
+68 1216 1
+68 1218 1
+68 1219 1
+68 1222 1
+68 1223 1
+68 1225 1
+68 1226 1
+68 1228 1
+68 1229 1
+68 1230 1
+68 1232 1
+68 1233 1
+68 1258 1
+68 1263 1
+68 1267 1
+68 1270 1
+68 1273 1
+68 1274 1
+68 1313 1
+68 1317 1
+68 1320 1
+68 1323 1
+68 1324 1
+68 1327 1
+68 1330 1
+68 1333 1
+68 1334 1
+68 1336 1
+68 1339 1
+68 1340 1
+68 1342 1
+68 1343 1
+68 1345 1
+68 1383 1
+68 1387 1
+68 1390 1
+68 1393 1
+68 1394 1
+68 1397 1
+68 1400 1
+68 1403 1
+68 1404 1
+68 1406 1
+68 1409 1
+68 1410 1
+68 1412 1
+68 1413 1
+68 1415 1
+68 1452 1
+68 1455 1
+68 1458 1
+68 1459 1
+68 1461 1
+68 1464 1
+68 1465 1
+68 1467 1
+68 1468 1
+68 1470 1
+68 1471 1
+68 1474 1
+68 1475 1
+68 1477 1
+68 1478 1
+68 1480 1
+68 1481 1
+68 1482 1
+68 1484 1
+68 1485 1
+68 1509 1
+68 1513 1
+68 1516 1
+68 1519 1
+68 1520 1
+68 1523 1
+68 1526 1
+68 1529 1
+68 1530 1
+68 1532 1
+68 1535 1
+68 1536 1
+68 1538 1
+68 1539 1
+68 1541 1
+68 1578 1
+68 1581 1
+68 1584 1
+68 1585 1
+68 1587 1
+68 1590 1
+68 1591 1
+68 1593 1
+68 1594 1
+68 1596 1
+68 1597 1
+68 1600 1
+68 1601 1
+68 1603 1
+68 1604 1
+68 1606 1
+68 1607 1
+68 1608 1
+68 1610 1
+68 1611 1
+68 1634 1
+68 1637 1
+68 1640 1
+68 1641 1
+68 1643 1
+68 1646 1
+68 1647 1
+68 1649 1
+68 1650 1
+68 1652 1
+68 1653 1
+68 1656 1
+68 1657 1
+68 1659 1
+68 1660 1
+68 1662 1
+68 1663 1
+68 1664 1
+68 1666 1
+68 1667 1
+68 1689 1
+68 1692 1
+68 1693 1
+68 1695 1
+68 1696 1
+68 1698 1
+68 1699 1
+68 1700 1
+68 1702 1
+68 1703 1
+68 1704 1
+68 1705 1
+68 1707 1
+68 1708 1
+68 1709 1
+68 1721 1
+68 1748 1
+68 1753 1
+68 1757 1
+68 1760 1
+68 1763 1
+68 1764 1
+68 1804 1
+68 1809 1
+68 1813 1
+68 1816 1
+68 1819 1
+68 1820 1
+68 1859 1
+68 1863 1
+68 1866 1
+68 1869 1
+68 1870 1
+68 1873 1
+68 1876 1
+68 1879 1
+68 1880 1
+68 1882 1
+68 1885 1
+68 1886 1
+68 1888 1
+68 1889 1
+68 1891 1
+68 1930 1
+68 1935 1
+68 1939 1
+68 1942 1
+68 1945 1
+68 1946 1
+68 1985 1
+68 1989 1
+68 1992 1
+68 1995 1
+68 1996 1
+68 1999 1
+68 2002 1
+68 2005 1
+68 2006 1
+68 2008 1
+68 2011 1
+68 2012 1
+68 2014 1
+68 2015 1
+68 2017 1
+68 2055 1
+68 2059 1
+68 2062 1
+68 2065 1
+68 2066 1
+68 2069 1
+68 2072 1
+68 2075 1
+68 2076 1
+68 2078 1
+68 2081 1
+68 2082 1
+68 2084 1
+68 2085 1
+68 2087 1
+68 2124 1
+68 2127 1
+68 2130 1
+68 2131 1
+68 2133 1
+68 2136 1
+68 2137 1
+68 2139 1
+68 2140 1
+68 2142 1
+68 2143 1
+68 2146 1
+68 2147 1
+68 2149 1
+68 2150 1
+68 2152 1
+68 2153 1
+68 2154 1
+68 2156 1
+68 2157 1
+68 2182 1
+68 2187 1
+68 2191 1
+68 2194 1
+68 2197 1
+68 2198 1
+68 2237 1
+68 2241 1
+68 2244 1
+68 2247 1
+68 2248 1
+68 2251 1
+68 2254 1
+68 2257 1
+68 2258 1
+68 2260 1
+68 2263 1
+68 2264 1
+68 2266 1
+68 2267 1
+68 2269 1
+68 2307 1
+68 2311 1
+68 2314 1
+68 2317 1
+68 2318 1
+68 2321 1
+68 2324 1
+68 2327 1
+68 2328 1
+68 2330 1
+68 2333 1
+68 2334 1
+68 2336 1
+68 2337 1
+68 2339 1
+68 2376 1
+68 2379 1
+68 2382 1
+68 2383 1
+68 2385 1
+68 2388 1
+68 2389 1
+68 2391 1
+68 2392 1
+68 2394 1
+68 2395 1
+68 2398 1
+68 2399 1
+68 2401 1
+68 2402 1
+68 2404 1
+68 2405 1
+68 2406 1
+68 2408 1
+68 2409 1
+68 2433 1
+68 2437 1
+68 2440 1
+68 2443 1
+68 2444 1
+68 2447 1
+68 2450 1
+68 2453 1
+68 2454 1
+68 2456 1
+68 2459 1
+68 2460 1
+68 2462 1
+68 2463 1
+68 2465 1
+68 2502 1
+68 2505 1
+68 2508 1
+68 2509 1
+68 2511 1
+68 2514 1
+68 2515 1
+68 2517 1
+68 2518 1
+68 2520 1
+68 2521 1
+68 2524 1
+68 2525 1
+68 2527 1
+68 2528 1
+68 2530 1
+68 2531 1
+68 2532 1
+68 2534 1
+68 2535 1
+68 2558 1
+68 2561 1
+68 2564 1
+68 2565 1
+68 2567 1
+68 2570 1
+68 2571 1
+68 2573 1
+68 2574 1
+68 2576 1
+68 2577 1
+68 2580 1
+68 2581 1
+68 2583 1
+68 2584 1
+68 2586 1
+68 2587 1
+68 2588 1
+68 2590 1
+68 2591 1
+68 2613 1
+68 2616 1
+68 2617 1
+68 2619 1
+68 2620 1
+68 2622 1
+68 2623 1
+68 2624 1
+68 2626 1
+68 2627 1
+68 2628 1
+68 2629 1
+68 2631 1
+68 2632 1
+68 2633 1
+68 2644 1
+68 2649 1
+68 2653 1
+68 2656 1
+68 2659 1
+68 2660 1
+68 2699 1
+68 2703 1
+68 2706 1
+68 2709 1
+68 2710 1
+68 2713 1
+68 2716 1
+68 2719 1
+68 2720 1
+68 2722 1
+68 2725 1
+68 2726 1
+68 2728 1
+68 2729 1
+68 2731 1
+68 2769 1
+68 2773 1
+68 2776 1
+68 2779 1
+68 2780 1
+68 2783 1
+68 2786 1
+68 2789 1
+68 2790 1
+68 2792 1
+68 2795 1
+68 2796 1
+68 2798 1
+68 2799 1
+68 2801 1
+68 2838 1
+68 2841 1
+68 2844 1
+68 2845 1
+68 2847 1
+68 2850 1
+68 2851 1
+68 2853 1
+68 2854 1
+68 2856 1
+68 2857 1
+68 2860 1
+68 2861 1
+68 2863 1
+68 2864 1
+68 2866 1
+68 2867 1
+68 2868 1
+68 2870 1
+68 2871 1
+68 2895 1
+68 2899 1
+68 2902 1
+68 2905 1
+68 2906 1
+68 2909 1
+68 2912 1
+68 2915 1
+68 2916 1
+68 2918 1
+68 2921 1
+68 2922 1
+68 2924 1
+68 2925 1
+68 2927 1
+68 2964 1
+68 2967 1
+68 2970 1
+68 2971 1
+68 2973 1
+68 2976 1
+68 2977 1
+68 2979 1
+68 2980 1
+68 2982 1
+68 2983 1
+68 2986 1
+68 2987 1
+68 2989 1
+68 2990 1
+68 2992 1
+68 2993 1
+68 2994 1
+68 2996 1
+68 2997 1
+68 3020 1
+68 3023 1
+68 3026 1
+68 3027 1
+68 3029 1
+68 3032 1
+68 3033 1
+68 3035 1
+68 3036 1
+68 3038 1
+68 3039 1
+68 3042 1
+68 3043 1
+68 3045 1
+68 3046 1
+68 3048 1
+68 3049 1
+68 3050 1
+68 3052 1
+68 3053 1
+68 3075 1
+68 3078 1
+68 3079 1
+68 3081 1
+68 3082 1
+68 3084 1
+68 3085 1
+68 3086 1
+68 3088 1
+68 3089 1
+68 3090 1
+68 3091 1
+68 3093 1
+68 3094 1
+68 3095 1
+68 3105 1
+68 3109 1
+68 3112 1
+68 3115 1
+68 3116 1
+68 3119 1
+68 3122 1
+68 3125 1
+68 3126 1
+68 3128 1
+68 3131 1
+68 3132 1
+68 3134 1
+68 3135 1
+68 3137 1
+68 3174 1
+68 3177 1
+68 3180 1
+68 3181 1
+68 3183 1
+68 3186 1
+68 3187 1
+68 3189 1
+68 3190 1
+68 3192 1
+68 3193 1
+68 3196 1
+68 3197 1
+68 3199 1
+68 3200 1
+68 3202 1
+68 3203 1
+68 3204 1
+68 3206 1
+68 3207 1
+68 3230 1
+68 3233 1
+68 3236 1
+68 3237 1
+68 3239 1
+68 3242 1
+68 3243 1
+68 3245 1
+68 3246 1
+68 3248 1
+68 3249 1
+68 3252 1
+68 3253 1
+68 3255 1
+68 3256 1
+68 3258 1
+68 3259 1
+68 3260 1
+68 3262 1
+68 3263 1
+68 3285 1
+68 3288 1
+68 3289 1
+68 3291 1
+68 3292 1
+68 3294 1
+68 3295 1
+68 3296 1
+68 3298 1
+68 3299 1
+68 3300 1
+68 3301 1
+68 3303 1
+68 3304 1
+68 3305 1
+68 3314 1
+68 3317 1
+68 3320 1
+68 3321 1
+68 3323 1
+68 3326 1
+68 3327 1
+68 3329 1
+68 3330 1
+68 3332 1
+68 3333 1
+68 3336 1
+68 3337 1
+68 3339 1
+68 3340 1
+68 3342 1
+68 3343 1
+68 3344 1
+68 3346 1
+68 3347 1
+68 3369 1
+68 3372 1
+68 3373 1
+68 3375 1
+68 3376 1
+68 3378 1
+68 3379 1
+68 3380 1
+68 3382 1
+68 3383 1
+68 3384 1
+68 3385 1
+68 3387 1
+68 3388 1
+68 3389 1
+68 3397 1
+68 3400 1
+68 3401 1
+68 3403 1
+68 3404 1
+68 3406 1
+68 3407 1
+68 3408 1
+68 3410 1
+68 3411 1
+68 3412 1
+68 3413 1
+68 3415 1
+68 3416 1
+68 3417 1
+68 3425 1
+68 3426 1
+68 3428 1
+68 3429 1
+68 3430 1
+68 3431 1
+69 14 1
+69 42 1
+69 69 1
+69 74 1
+69 78 1
+69 81 1
+69 83 1
+69 85 1
+69 126 1
+69 153 1
+69 158 1
+69 162 1
+69 165 1
+69 167 1
+69 169 1
+69 209 1
+69 214 1
+69 218 1
+69 221 1
+69 223 1
+69 225 1
+69 264 1
+69 268 1
+69 271 1
+69 273 1
+69 275 1
+69 278 1
+69 281 1
+69 283 1
+69 285 1
+69 287 1
+69 289 1
+69 291 1
+69 292 1
+69 294 1
+69 295 1
+69 336 1
+69 363 1
+69 368 1
+69 372 1
+69 375 1
+69 377 1
+69 379 1
+69 419 1
+69 424 1
+69 428 1
+69 431 1
+69 433 1
+69 435 1
+69 474 1
+69 478 1
+69 481 1
+69 483 1
+69 485 1
+69 488 1
+69 491 1
+69 493 1
+69 495 1
+69 497 1
+69 499 1
+69 501 1
+69 502 1
+69 504 1
+69 505 1
+69 545 1
+69 550 1
+69 554 1
+69 557 1
+69 559 1
+69 561 1
+69 600 1
+69 604 1
+69 607 1
+69 609 1
+69 611 1
+69 614 1
+69 617 1
+69 619 1
+69 621 1
+69 623 1
+69 625 1
+69 627 1
+69 628 1
+69 630 1
+69 631 1
+69 670 1
+69 674 1
+69 677 1
+69 679 1
+69 681 1
+69 684 1
+69 687 1
+69 689 1
+69 691 1
+69 693 1
+69 695 1
+69 697 1
+69 698 1
+69 700 1
+69 701 1
+69 739 1
+69 742 1
+69 744 1
+69 746 1
+69 748 1
+69 750 1
+69 752 1
+69 753 1
+69 755 1
+69 756 1
+69 758 1
+69 760 1
+69 762 1
+69 763 1
+69 765 1
+69 766 1
+69 767 1
+69 769 1
+69 770 1
+69 771 1
+69 798 1
+69 825 1
+69 830 1
+69 834 1
+69 837 1
+69 839 1
+69 841 1
+69 881 1
+69 886 1
+69 890 1
+69 893 1
+69 895 1
+69 897 1
+69 936 1
+69 940 1
+69 943 1
+69 945 1
+69 947 1
+69 950 1
+69 953 1
+69 955 1
+69 957 1
+69 959 1
+69 961 1
+69 963 1
+69 964 1
+69 966 1
+69 967 1
+69 1007 1
+69 1012 1
+69 1016 1
+69 1019 1
+69 1021 1
+69 1023 1
+69 1062 1
+69 1066 1
+69 1069 1
+69 1071 1
+69 1073 1
+69 1076 1
+69 1079 1
+69 1081 1
+69 1083 1
+69 1085 1
+69 1087 1
+69 1089 1
+69 1090 1
+69 1092 1
+69 1093 1
+69 1132 1
+69 1136 1
+69 1139 1
+69 1141 1
+69 1143 1
+69 1146 1
+69 1149 1
+69 1151 1
+69 1153 1
+69 1155 1
+69 1157 1
+69 1159 1
+69 1160 1
+69 1162 1
+69 1163 1
+69 1201 1
+69 1204 1
+69 1206 1
+69 1208 1
+69 1210 1
+69 1212 1
+69 1214 1
+69 1215 1
+69 1217 1
+69 1218 1
+69 1220 1
+69 1222 1
+69 1224 1
+69 1225 1
+69 1227 1
+69 1228 1
+69 1229 1
+69 1231 1
+69 1232 1
+69 1233 1
+69 1259 1
+69 1264 1
+69 1268 1
+69 1271 1
+69 1273 1
+69 1275 1
+69 1314 1
+69 1318 1
+69 1321 1
+69 1323 1
+69 1325 1
+69 1328 1
+69 1331 1
+69 1333 1
+69 1335 1
+69 1337 1
+69 1339 1
+69 1341 1
+69 1342 1
+69 1344 1
+69 1345 1
+69 1384 1
+69 1388 1
+69 1391 1
+69 1393 1
+69 1395 1
+69 1398 1
+69 1401 1
+69 1403 1
+69 1405 1
+69 1407 1
+69 1409 1
+69 1411 1
+69 1412 1
+69 1414 1
+69 1415 1
+69 1453 1
+69 1456 1
+69 1458 1
+69 1460 1
+69 1462 1
+69 1464 1
+69 1466 1
+69 1467 1
+69 1469 1
+69 1470 1
+69 1472 1
+69 1474 1
+69 1476 1
+69 1477 1
+69 1479 1
+69 1480 1
+69 1481 1
+69 1483 1
+69 1484 1
+69 1485 1
+69 1510 1
+69 1514 1
+69 1517 1
+69 1519 1
+69 1521 1
+69 1524 1
+69 1527 1
+69 1529 1
+69 1531 1
+69 1533 1
+69 1535 1
+69 1537 1
+69 1538 1
+69 1540 1
+69 1541 1
+69 1579 1
+69 1582 1
+69 1584 1
+69 1586 1
+69 1588 1
+69 1590 1
+69 1592 1
+69 1593 1
+69 1595 1
+69 1596 1
+69 1598 1
+69 1600 1
+69 1602 1
+69 1603 1
+69 1605 1
+69 1606 1
+69 1607 1
+69 1609 1
+69 1610 1
+69 1611 1
+69 1635 1
+69 1638 1
+69 1640 1
+69 1642 1
+69 1644 1
+69 1646 1
+69 1648 1
+69 1649 1
+69 1651 1
+69 1652 1
+69 1654 1
+69 1656 1
+69 1658 1
+69 1659 1
+69 1661 1
+69 1662 1
+69 1663 1
+69 1665 1
+69 1666 1
+69 1667 1
+69 1690 1
+69 1692 1
+69 1694 1
+69 1695 1
+69 1697 1
+69 1698 1
+69 1699 1
+69 1701 1
+69 1702 1
+69 1703 1
+69 1704 1
+69 1706 1
+69 1707 1
+69 1708 1
+69 1709 1
+69 1722 1
+69 1749 1
+69 1754 1
+69 1758 1
+69 1761 1
+69 1763 1
+69 1765 1
+69 1805 1
+69 1810 1
+69 1814 1
+69 1817 1
+69 1819 1
+69 1821 1
+69 1860 1
+69 1864 1
+69 1867 1
+69 1869 1
+69 1871 1
+69 1874 1
+69 1877 1
+69 1879 1
+69 1881 1
+69 1883 1
+69 1885 1
+69 1887 1
+69 1888 1
+69 1890 1
+69 1891 1
+69 1931 1
+69 1936 1
+69 1940 1
+69 1943 1
+69 1945 1
+69 1947 1
+69 1986 1
+69 1990 1
+69 1993 1
+69 1995 1
+69 1997 1
+69 2000 1
+69 2003 1
+69 2005 1
+69 2007 1
+69 2009 1
+69 2011 1
+69 2013 1
+69 2014 1
+69 2016 1
+69 2017 1
+69 2056 1
+69 2060 1
+69 2063 1
+69 2065 1
+69 2067 1
+69 2070 1
+69 2073 1
+69 2075 1
+69 2077 1
+69 2079 1
+69 2081 1
+69 2083 1
+69 2084 1
+69 2086 1
+69 2087 1
+69 2125 1
+69 2128 1
+69 2130 1
+69 2132 1
+69 2134 1
+69 2136 1
+69 2138 1
+69 2139 1
+69 2141 1
+69 2142 1
+69 2144 1
+69 2146 1
+69 2148 1
+69 2149 1
+69 2151 1
+69 2152 1
+69 2153 1
+69 2155 1
+69 2156 1
+69 2157 1
+69 2183 1
+69 2188 1
+69 2192 1
+69 2195 1
+69 2197 1
+69 2199 1
+69 2238 1
+69 2242 1
+69 2245 1
+69 2247 1
+69 2249 1
+69 2252 1
+69 2255 1
+69 2257 1
+69 2259 1
+69 2261 1
+69 2263 1
+69 2265 1
+69 2266 1
+69 2268 1
+69 2269 1
+69 2308 1
+69 2312 1
+69 2315 1
+69 2317 1
+69 2319 1
+69 2322 1
+69 2325 1
+69 2327 1
+69 2329 1
+69 2331 1
+69 2333 1
+69 2335 1
+69 2336 1
+69 2338 1
+69 2339 1
+69 2377 1
+69 2380 1
+69 2382 1
+69 2384 1
+69 2386 1
+69 2388 1
+69 2390 1
+69 2391 1
+69 2393 1
+69 2394 1
+69 2396 1
+69 2398 1
+69 2400 1
+69 2401 1
+69 2403 1
+69 2404 1
+69 2405 1
+69 2407 1
+69 2408 1
+69 2409 1
+69 2434 1
+69 2438 1
+69 2441 1
+69 2443 1
+69 2445 1
+69 2448 1
+69 2451 1
+69 2453 1
+69 2455 1
+69 2457 1
+69 2459 1
+69 2461 1
+69 2462 1
+69 2464 1
+69 2465 1
+69 2503 1
+69 2506 1
+69 2508 1
+69 2510 1
+69 2512 1
+69 2514 1
+69 2516 1
+69 2517 1
+69 2519 1
+69 2520 1
+69 2522 1
+69 2524 1
+69 2526 1
+69 2527 1
+69 2529 1
+69 2530 1
+69 2531 1
+69 2533 1
+69 2534 1
+69 2535 1
+69 2559 1
+69 2562 1
+69 2564 1
+69 2566 1
+69 2568 1
+69 2570 1
+69 2572 1
+69 2573 1
+69 2575 1
+69 2576 1
+69 2578 1
+69 2580 1
+69 2582 1
+69 2583 1
+69 2585 1
+69 2586 1
+69 2587 1
+69 2589 1
+69 2590 1
+69 2591 1
+69 2614 1
+69 2616 1
+69 2618 1
+69 2619 1
+69 2621 1
+69 2622 1
+69 2623 1
+69 2625 1
+69 2626 1
+69 2627 1
+69 2628 1
+69 2630 1
+69 2631 1
+69 2632 1
+69 2633 1
+69 2645 1
+69 2650 1
+69 2654 1
+69 2657 1
+69 2659 1
+69 2661 1
+69 2700 1
+69 2704 1
+69 2707 1
+69 2709 1
+69 2711 1
+69 2714 1
+69 2717 1
+69 2719 1
+69 2721 1
+69 2723 1
+69 2725 1
+69 2727 1
+69 2728 1
+69 2730 1
+69 2731 1
+69 2770 1
+69 2774 1
+69 2777 1
+69 2779 1
+69 2781 1
+69 2784 1
+69 2787 1
+69 2789 1
+69 2791 1
+69 2793 1
+69 2795 1
+69 2797 1
+69 2798 1
+69 2800 1
+69 2801 1
+69 2839 1
+69 2842 1
+69 2844 1
+69 2846 1
+69 2848 1
+69 2850 1
+69 2852 1
+69 2853 1
+69 2855 1
+69 2856 1
+69 2858 1
+69 2860 1
+69 2862 1
+69 2863 1
+69 2865 1
+69 2866 1
+69 2867 1
+69 2869 1
+69 2870 1
+69 2871 1
+69 2896 1
+69 2900 1
+69 2903 1
+69 2905 1
+69 2907 1
+69 2910 1
+69 2913 1
+69 2915 1
+69 2917 1
+69 2919 1
+69 2921 1
+69 2923 1
+69 2924 1
+69 2926 1
+69 2927 1
+69 2965 1
+69 2968 1
+69 2970 1
+69 2972 1
+69 2974 1
+69 2976 1
+69 2978 1
+69 2979 1
+69 2981 1
+69 2982 1
+69 2984 1
+69 2986 1
+69 2988 1
+69 2989 1
+69 2991 1
+69 2992 1
+69 2993 1
+69 2995 1
+69 2996 1
+69 2997 1
+69 3021 1
+69 3024 1
+69 3026 1
+69 3028 1
+69 3030 1
+69 3032 1
+69 3034 1
+69 3035 1
+69 3037 1
+69 3038 1
+69 3040 1
+69 3042 1
+69 3044 1
+69 3045 1
+69 3047 1
+69 3048 1
+69 3049 1
+69 3051 1
+69 3052 1
+69 3053 1
+69 3076 1
+69 3078 1
+69 3080 1
+69 3081 1
+69 3083 1
+69 3084 1
+69 3085 1
+69 3087 1
+69 3088 1
+69 3089 1
+69 3090 1
+69 3092 1
+69 3093 1
+69 3094 1
+69 3095 1
+69 3106 1
+69 3110 1
+69 3113 1
+69 3115 1
+69 3117 1
+69 3120 1
+69 3123 1
+69 3125 1
+69 3127 1
+69 3129 1
+69 3131 1
+69 3133 1
+69 3134 1
+69 3136 1
+69 3137 1
+69 3175 1
+69 3178 1
+69 3180 1
+69 3182 1
+69 3184 1
+69 3186 1
+69 3188 1
+69 3189 1
+69 3191 1
+69 3192 1
+69 3194 1
+69 3196 1
+69 3198 1
+69 3199 1
+69 3201 1
+69 3202 1
+69 3203 1
+69 3205 1
+69 3206 1
+69 3207 1
+69 3231 1
+69 3234 1
+69 3236 1
+69 3238 1
+69 3240 1
+69 3242 1
+69 3244 1
+69 3245 1
+69 3247 1
+69 3248 1
+69 3250 1
+69 3252 1
+69 3254 1
+69 3255 1
+69 3257 1
+69 3258 1
+69 3259 1
+69 3261 1
+69 3262 1
+69 3263 1
+69 3286 1
+69 3288 1
+69 3290 1
+69 3291 1
+69 3293 1
+69 3294 1
+69 3295 1
+69 3297 1
+69 3298 1
+69 3299 1
+69 3300 1
+69 3302 1
+69 3303 1
+69 3304 1
+69 3305 1
+69 3315 1
+69 3318 1
+69 3320 1
+69 3322 1
+69 3324 1
+69 3326 1
+69 3328 1
+69 3329 1
+69 3331 1
+69 3332 1
+69 3334 1
+69 3336 1
+69 3338 1
+69 3339 1
+69 3341 1
+69 3342 1
+69 3343 1
+69 3345 1
+69 3346 1
+69 3347 1
+69 3370 1
+69 3372 1
+69 3374 1
+69 3375 1
+69 3377 1
+69 3378 1
+69 3379 1
+69 3381 1
+69 3382 1
+69 3383 1
+69 3384 1
+69 3386 1
+69 3387 1
+69 3388 1
+69 3389 1
+69 3398 1
+69 3400 1
+69 3402 1
+69 3403 1
+69 3405 1
+69 3406 1
+69 3407 1
+69 3409 1
+69 3410 1
+69 3411 1
+69 3412 1
+69 3414 1
+69 3415 1
+69 3416 1
+69 3417 1
+69 3425 1
+69 3427 1
+69 3428 1
+69 3429 1
+69 3430 1
+69 3431 1
+70 15 1
+70 43 1
+70 70 1
+70 75 1
+70 79 1
+70 82 1
+70 84 1
+70 85 1
+70 127 1
+70 154 1
+70 159 1
+70 163 1
+70 166 1
+70 168 1
+70 169 1
+70 210 1
+70 215 1
+70 219 1
+70 222 1
+70 224 1
+70 225 1
+70 265 1
+70 269 1
+70 272 1
+70 274 1
+70 275 1
+70 279 1
+70 282 1
+70 284 1
+70 285 1
+70 288 1
+70 290 1
+70 291 1
+70 293 1
+70 294 1
+70 295 1
+70 337 1
+70 364 1
+70 369 1
+70 373 1
+70 376 1
+70 378 1
+70 379 1
+70 420 1
+70 425 1
+70 429 1
+70 432 1
+70 434 1
+70 435 1
+70 475 1
+70 479 1
+70 482 1
+70 484 1
+70 485 1
+70 489 1
+70 492 1
+70 494 1
+70 495 1
+70 498 1
+70 500 1
+70 501 1
+70 503 1
+70 504 1
+70 505 1
+70 546 1
+70 551 1
+70 555 1
+70 558 1
+70 560 1
+70 561 1
+70 601 1
+70 605 1
+70 608 1
+70 610 1
+70 611 1
+70 615 1
+70 618 1
+70 620 1
+70 621 1
+70 624 1
+70 626 1
+70 627 1
+70 629 1
+70 630 1
+70 631 1
+70 671 1
+70 675 1
+70 678 1
+70 680 1
+70 681 1
+70 685 1
+70 688 1
+70 690 1
+70 691 1
+70 694 1
+70 696 1
+70 697 1
+70 699 1
+70 700 1
+70 701 1
+70 740 1
+70 743 1
+70 745 1
+70 746 1
+70 749 1
+70 751 1
+70 752 1
+70 754 1
+70 755 1
+70 756 1
+70 759 1
+70 761 1
+70 762 1
+70 764 1
+70 765 1
+70 766 1
+70 768 1
+70 769 1
+70 770 1
+70 771 1
+70 799 1
+70 826 1
+70 831 1
+70 835 1
+70 838 1
+70 840 1
+70 841 1
+70 882 1
+70 887 1
+70 891 1
+70 894 1
+70 896 1
+70 897 1
+70 937 1
+70 941 1
+70 944 1
+70 946 1
+70 947 1
+70 951 1
+70 954 1
+70 956 1
+70 957 1
+70 960 1
+70 962 1
+70 963 1
+70 965 1
+70 966 1
+70 967 1
+70 1008 1
+70 1013 1
+70 1017 1
+70 1020 1
+70 1022 1
+70 1023 1
+70 1063 1
+70 1067 1
+70 1070 1
+70 1072 1
+70 1073 1
+70 1077 1
+70 1080 1
+70 1082 1
+70 1083 1
+70 1086 1
+70 1088 1
+70 1089 1
+70 1091 1
+70 1092 1
+70 1093 1
+70 1133 1
+70 1137 1
+70 1140 1
+70 1142 1
+70 1143 1
+70 1147 1
+70 1150 1
+70 1152 1
+70 1153 1
+70 1156 1
+70 1158 1
+70 1159 1
+70 1161 1
+70 1162 1
+70 1163 1
+70 1202 1
+70 1205 1
+70 1207 1
+70 1208 1
+70 1211 1
+70 1213 1
+70 1214 1
+70 1216 1
+70 1217 1
+70 1218 1
+70 1221 1
+70 1223 1
+70 1224 1
+70 1226 1
+70 1227 1
+70 1228 1
+70 1230 1
+70 1231 1
+70 1232 1
+70 1233 1
+70 1260 1
+70 1265 1
+70 1269 1
+70 1272 1
+70 1274 1
+70 1275 1
+70 1315 1
+70 1319 1
+70 1322 1
+70 1324 1
+70 1325 1
+70 1329 1
+70 1332 1
+70 1334 1
+70 1335 1
+70 1338 1
+70 1340 1
+70 1341 1
+70 1343 1
+70 1344 1
+70 1345 1
+70 1385 1
+70 1389 1
+70 1392 1
+70 1394 1
+70 1395 1
+70 1399 1
+70 1402 1
+70 1404 1
+70 1405 1
+70 1408 1
+70 1410 1
+70 1411 1
+70 1413 1
+70 1414 1
+70 1415 1
+70 1454 1
+70 1457 1
+70 1459 1
+70 1460 1
+70 1463 1
+70 1465 1
+70 1466 1
+70 1468 1
+70 1469 1
+70 1470 1
+70 1473 1
+70 1475 1
+70 1476 1
+70 1478 1
+70 1479 1
+70 1480 1
+70 1482 1
+70 1483 1
+70 1484 1
+70 1485 1
+70 1511 1
+70 1515 1
+70 1518 1
+70 1520 1
+70 1521 1
+70 1525 1
+70 1528 1
+70 1530 1
+70 1531 1
+70 1534 1
+70 1536 1
+70 1537 1
+70 1539 1
+70 1540 1
+70 1541 1
+70 1580 1
+70 1583 1
+70 1585 1
+70 1586 1
+70 1589 1
+70 1591 1
+70 1592 1
+70 1594 1
+70 1595 1
+70 1596 1
+70 1599 1
+70 1601 1
+70 1602 1
+70 1604 1
+70 1605 1
+70 1606 1
+70 1608 1
+70 1609 1
+70 1610 1
+70 1611 1
+70 1636 1
+70 1639 1
+70 1641 1
+70 1642 1
+70 1645 1
+70 1647 1
+70 1648 1
+70 1650 1
+70 1651 1
+70 1652 1
+70 1655 1
+70 1657 1
+70 1658 1
+70 1660 1
+70 1661 1
+70 1662 1
+70 1664 1
+70 1665 1
+70 1666 1
+70 1667 1
+70 1691 1
+70 1693 1
+70 1694 1
+70 1696 1
+70 1697 1
+70 1698 1
+70 1700 1
+70 1701 1
+70 1702 1
+70 1703 1
+70 1705 1
+70 1706 1
+70 1707 1
+70 1708 1
+70 1709 1
+70 1723 1
+70 1750 1
+70 1755 1
+70 1759 1
+70 1762 1
+70 1764 1
+70 1765 1
+70 1806 1
+70 1811 1
+70 1815 1
+70 1818 1
+70 1820 1
+70 1821 1
+70 1861 1
+70 1865 1
+70 1868 1
+70 1870 1
+70 1871 1
+70 1875 1
+70 1878 1
+70 1880 1
+70 1881 1
+70 1884 1
+70 1886 1
+70 1887 1
+70 1889 1
+70 1890 1
+70 1891 1
+70 1932 1
+70 1937 1
+70 1941 1
+70 1944 1
+70 1946 1
+70 1947 1
+70 1987 1
+70 1991 1
+70 1994 1
+70 1996 1
+70 1997 1
+70 2001 1
+70 2004 1
+70 2006 1
+70 2007 1
+70 2010 1
+70 2012 1
+70 2013 1
+70 2015 1
+70 2016 1
+70 2017 1
+70 2057 1
+70 2061 1
+70 2064 1
+70 2066 1
+70 2067 1
+70 2071 1
+70 2074 1
+70 2076 1
+70 2077 1
+70 2080 1
+70 2082 1
+70 2083 1
+70 2085 1
+70 2086 1
+70 2087 1
+70 2126 1
+70 2129 1
+70 2131 1
+70 2132 1
+70 2135 1
+70 2137 1
+70 2138 1
+70 2140 1
+70 2141 1
+70 2142 1
+70 2145 1
+70 2147 1
+70 2148 1
+70 2150 1
+70 2151 1
+70 2152 1
+70 2154 1
+70 2155 1
+70 2156 1
+70 2157 1
+70 2184 1
+70 2189 1
+70 2193 1
+70 2196 1
+70 2198 1
+70 2199 1
+70 2239 1
+70 2243 1
+70 2246 1
+70 2248 1
+70 2249 1
+70 2253 1
+70 2256 1
+70 2258 1
+70 2259 1
+70 2262 1
+70 2264 1
+70 2265 1
+70 2267 1
+70 2268 1
+70 2269 1
+70 2309 1
+70 2313 1
+70 2316 1
+70 2318 1
+70 2319 1
+70 2323 1
+70 2326 1
+70 2328 1
+70 2329 1
+70 2332 1
+70 2334 1
+70 2335 1
+70 2337 1
+70 2338 1
+70 2339 1
+70 2378 1
+70 2381 1
+70 2383 1
+70 2384 1
+70 2387 1
+70 2389 1
+70 2390 1
+70 2392 1
+70 2393 1
+70 2394 1
+70 2397 1
+70 2399 1
+70 2400 1
+70 2402 1
+70 2403 1
+70 2404 1
+70 2406 1
+70 2407 1
+70 2408 1
+70 2409 1
+70 2435 1
+70 2439 1
+70 2442 1
+70 2444 1
+70 2445 1
+70 2449 1
+70 2452 1
+70 2454 1
+70 2455 1
+70 2458 1
+70 2460 1
+70 2461 1
+70 2463 1
+70 2464 1
+70 2465 1
+70 2504 1
+70 2507 1
+70 2509 1
+70 2510 1
+70 2513 1
+70 2515 1
+70 2516 1
+70 2518 1
+70 2519 1
+70 2520 1
+70 2523 1
+70 2525 1
+70 2526 1
+70 2528 1
+70 2529 1
+70 2530 1
+70 2532 1
+70 2533 1
+70 2534 1
+70 2535 1
+70 2560 1
+70 2563 1
+70 2565 1
+70 2566 1
+70 2569 1
+70 2571 1
+70 2572 1
+70 2574 1
+70 2575 1
+70 2576 1
+70 2579 1
+70 2581 1
+70 2582 1
+70 2584 1
+70 2585 1
+70 2586 1
+70 2588 1
+70 2589 1
+70 2590 1
+70 2591 1
+70 2615 1
+70 2617 1
+70 2618 1
+70 2620 1
+70 2621 1
+70 2622 1
+70 2624 1
+70 2625 1
+70 2626 1
+70 2627 1
+70 2629 1
+70 2630 1
+70 2631 1
+70 2632 1
+70 2633 1
+70 2646 1
+70 2651 1
+70 2655 1
+70 2658 1
+70 2660 1
+70 2661 1
+70 2701 1
+70 2705 1
+70 2708 1
+70 2710 1
+70 2711 1
+70 2715 1
+70 2718 1
+70 2720 1
+70 2721 1
+70 2724 1
+70 2726 1
+70 2727 1
+70 2729 1
+70 2730 1
+70 2731 1
+70 2771 1
+70 2775 1
+70 2778 1
+70 2780 1
+70 2781 1
+70 2785 1
+70 2788 1
+70 2790 1
+70 2791 1
+70 2794 1
+70 2796 1
+70 2797 1
+70 2799 1
+70 2800 1
+70 2801 1
+70 2840 1
+70 2843 1
+70 2845 1
+70 2846 1
+70 2849 1
+70 2851 1
+70 2852 1
+70 2854 1
+70 2855 1
+70 2856 1
+70 2859 1
+70 2861 1
+70 2862 1
+70 2864 1
+70 2865 1
+70 2866 1
+70 2868 1
+70 2869 1
+70 2870 1
+70 2871 1
+70 2897 1
+70 2901 1
+70 2904 1
+70 2906 1
+70 2907 1
+70 2911 1
+70 2914 1
+70 2916 1
+70 2917 1
+70 2920 1
+70 2922 1
+70 2923 1
+70 2925 1
+70 2926 1
+70 2927 1
+70 2966 1
+70 2969 1
+70 2971 1
+70 2972 1
+70 2975 1
+70 2977 1
+70 2978 1
+70 2980 1
+70 2981 1
+70 2982 1
+70 2985 1
+70 2987 1
+70 2988 1
+70 2990 1
+70 2991 1
+70 2992 1
+70 2994 1
+70 2995 1
+70 2996 1
+70 2997 1
+70 3022 1
+70 3025 1
+70 3027 1
+70 3028 1
+70 3031 1
+70 3033 1
+70 3034 1
+70 3036 1
+70 3037 1
+70 3038 1
+70 3041 1
+70 3043 1
+70 3044 1
+70 3046 1
+70 3047 1
+70 3048 1
+70 3050 1
+70 3051 1
+70 3052 1
+70 3053 1
+70 3077 1
+70 3079 1
+70 3080 1
+70 3082 1
+70 3083 1
+70 3084 1
+70 3086 1
+70 3087 1
+70 3088 1
+70 3089 1
+70 3091 1
+70 3092 1
+70 3093 1
+70 3094 1
+70 3095 1
+70 3107 1
+70 3111 1
+70 3114 1
+70 3116 1
+70 3117 1
+70 3121 1
+70 3124 1
+70 3126 1
+70 3127 1
+70 3130 1
+70 3132 1
+70 3133 1
+70 3135 1
+70 3136 1
+70 3137 1
+70 3176 1
+70 3179 1
+70 3181 1
+70 3182 1
+70 3185 1
+70 3187 1
+70 3188 1
+70 3190 1
+70 3191 1
+70 3192 1
+70 3195 1
+70 3197 1
+70 3198 1
+70 3200 1
+70 3201 1
+70 3202 1
+70 3204 1
+70 3205 1
+70 3206 1
+70 3207 1
+70 3232 1
+70 3235 1
+70 3237 1
+70 3238 1
+70 3241 1
+70 3243 1
+70 3244 1
+70 3246 1
+70 3247 1
+70 3248 1
+70 3251 1
+70 3253 1
+70 3254 1
+70 3256 1
+70 3257 1
+70 3258 1
+70 3260 1
+70 3261 1
+70 3262 1
+70 3263 1
+70 3287 1
+70 3289 1
+70 3290 1
+70 3292 1
+70 3293 1
+70 3294 1
+70 3296 1
+70 3297 1
+70 3298 1
+70 3299 1
+70 3301 1
+70 3302 1
+70 3303 1
+70 3304 1
+70 3305 1
+70 3316 1
+70 3319 1
+70 3321 1
+70 3322 1
+70 3325 1
+70 3327 1
+70 3328 1
+70 3330 1
+70 3331 1
+70 3332 1
+70 3335 1
+70 3337 1
+70 3338 1
+70 3340 1
+70 3341 1
+70 3342 1
+70 3344 1
+70 3345 1
+70 3346 1
+70 3347 1
+70 3371 1
+70 3373 1
+70 3374 1
+70 3376 1
+70 3377 1
+70 3378 1
+70 3380 1
+70 3381 1
+70 3382 1
+70 3383 1
+70 3385 1
+70 3386 1
+70 3387 1
+70 3388 1
+70 3389 1
+70 3399 1
+70 3401 1
+70 3402 1
+70 3404 1
+70 3405 1
+70 3406 1
+70 3408 1
+70 3409 1
+70 3410 1
+70 3411 1
+70 3413 1
+70 3414 1
+70 3415 1
+70 3416 1
+70 3417 1
+70 3426 1
+70 3427 1
+70 3428 1
+70 3429 1
+70 3430 1
+70 3431 1
+71 16 1
+71 44 1
+71 65 1
+71 86 1
+71 87 1
+71 88 1
+71 89 1
+71 90 1
+71 128 1
+71 149 1
+71 170 1
+71 171 1
+71 172 1
+71 173 1
+71 174 1
+71 205 1
+71 226 1
+71 227 1
+71 228 1
+71 229 1
+71 230 1
+71 261 1
+71 262 1
+71 263 1
+71 264 1
+71 265 1
+71 296 1
+71 297 1
+71 298 1
+71 299 1
+71 300 1
+71 301 1
+71 302 1
+71 303 1
+71 304 1
+71 305 1
+71 338 1
+71 359 1
+71 380 1
+71 381 1
+71 382 1
+71 383 1
+71 384 1
+71 415 1
+71 436 1
+71 437 1
+71 438 1
+71 439 1
+71 440 1
+71 471 1
+71 472 1
+71 473 1
+71 474 1
+71 475 1
+71 506 1
+71 507 1
+71 508 1
+71 509 1
+71 510 1
+71 511 1
+71 512 1
+71 513 1
+71 514 1
+71 515 1
+71 541 1
+71 562 1
+71 563 1
+71 564 1
+71 565 1
+71 566 1
+71 597 1
+71 598 1
+71 599 1
+71 600 1
+71 601 1
+71 632 1
+71 633 1
+71 634 1
+71 635 1
+71 636 1
+71 637 1
+71 638 1
+71 639 1
+71 640 1
+71 641 1
+71 667 1
+71 668 1
+71 669 1
+71 670 1
+71 671 1
+71 702 1
+71 703 1
+71 704 1
+71 705 1
+71 706 1
+71 707 1
+71 708 1
+71 709 1
+71 710 1
+71 711 1
+71 737 1
+71 738 1
+71 739 1
+71 740 1
+71 741 1
+71 742 1
+71 743 1
+71 744 1
+71 745 1
+71 746 1
+71 772 1
+71 773 1
+71 774 1
+71 775 1
+71 776 1
+71 777 1
+71 778 1
+71 779 1
+71 780 1
+71 781 1
+71 800 1
+71 821 1
+71 842 1
+71 843 1
+71 844 1
+71 845 1
+71 846 1
+71 877 1
+71 898 1
+71 899 1
+71 900 1
+71 901 1
+71 902 1
+71 933 1
+71 934 1
+71 935 1
+71 936 1
+71 937 1
+71 968 1
+71 969 1
+71 970 1
+71 971 1
+71 972 1
+71 973 1
+71 974 1
+71 975 1
+71 976 1
+71 977 1
+71 1003 1
+71 1024 1
+71 1025 1
+71 1026 1
+71 1027 1
+71 1028 1
+71 1059 1
+71 1060 1
+71 1061 1
+71 1062 1
+71 1063 1
+71 1094 1
+71 1095 1
+71 1096 1
+71 1097 1
+71 1098 1
+71 1099 1
+71 1100 1
+71 1101 1
+71 1102 1
+71 1103 1
+71 1129 1
+71 1130 1
+71 1131 1
+71 1132 1
+71 1133 1
+71 1164 1
+71 1165 1
+71 1166 1
+71 1167 1
+71 1168 1
+71 1169 1
+71 1170 1
+71 1171 1
+71 1172 1
+71 1173 1
+71 1199 1
+71 1200 1
+71 1201 1
+71 1202 1
+71 1203 1
+71 1204 1
+71 1205 1
+71 1206 1
+71 1207 1
+71 1208 1
+71 1234 1
+71 1235 1
+71 1236 1
+71 1237 1
+71 1238 1
+71 1239 1
+71 1240 1
+71 1241 1
+71 1242 1
+71 1243 1
+71 1255 1
+71 1276 1
+71 1277 1
+71 1278 1
+71 1279 1
+71 1280 1
+71 1311 1
+71 1312 1
+71 1313 1
+71 1314 1
+71 1315 1
+71 1346 1
+71 1347 1
+71 1348 1
+71 1349 1
+71 1350 1
+71 1351 1
+71 1352 1
+71 1353 1
+71 1354 1
+71 1355 1
+71 1381 1
+71 1382 1
+71 1383 1
+71 1384 1
+71 1385 1
+71 1416 1
+71 1417 1
+71 1418 1
+71 1419 1
+71 1420 1
+71 1421 1
+71 1422 1
+71 1423 1
+71 1424 1
+71 1425 1
+71 1451 1
+71 1452 1
+71 1453 1
+71 1454 1
+71 1455 1
+71 1456 1
+71 1457 1
+71 1458 1
+71 1459 1
+71 1460 1
+71 1486 1
+71 1487 1
+71 1488 1
+71 1489 1
+71 1490 1
+71 1491 1
+71 1492 1
+71 1493 1
+71 1494 1
+71 1495 1
+71 1507 1
+71 1508 1
+71 1509 1
+71 1510 1
+71 1511 1
+71 1542 1
+71 1543 1
+71 1544 1
+71 1545 1
+71 1546 1
+71 1547 1
+71 1548 1
+71 1549 1
+71 1550 1
+71 1551 1
+71 1577 1
+71 1578 1
+71 1579 1
+71 1580 1
+71 1581 1
+71 1582 1
+71 1583 1
+71 1584 1
+71 1585 1
+71 1586 1
+71 1612 1
+71 1613 1
+71 1614 1
+71 1615 1
+71 1616 1
+71 1617 1
+71 1618 1
+71 1619 1
+71 1620 1
+71 1621 1
+71 1633 1
+71 1634 1
+71 1635 1
+71 1636 1
+71 1637 1
+71 1638 1
+71 1639 1
+71 1640 1
+71 1641 1
+71 1642 1
+71 1668 1
+71 1669 1
+71 1670 1
+71 1671 1
+71 1672 1
+71 1673 1
+71 1674 1
+71 1675 1
+71 1676 1
+71 1677 1
+71 1689 1
+71 1690 1
+71 1691 1
+71 1692 1
+71 1693 1
+71 1694 1
+71 1695 1
+71 1696 1
+71 1697 1
+71 1698 1
+71 1710 1
+71 1711 1
+71 1712 1
+71 1713 1
+71 1714 1
+71 1724 1
+71 1745 1
+71 1766 1
+71 1767 1
+71 1768 1
+71 1769 1
+71 1770 1
+71 1801 1
+71 1822 1
+71 1823 1
+71 1824 1
+71 1825 1
+71 1826 1
+71 1857 1
+71 1858 1
+71 1859 1
+71 1860 1
+71 1861 1
+71 1892 1
+71 1893 1
+71 1894 1
+71 1895 1
+71 1896 1
+71 1897 1
+71 1898 1
+71 1899 1
+71 1900 1
+71 1901 1
+71 1927 1
+71 1948 1
+71 1949 1
+71 1950 1
+71 1951 1
+71 1952 1
+71 1983 1
+71 1984 1
+71 1985 1
+71 1986 1
+71 1987 1
+71 2018 1
+71 2019 1
+71 2020 1
+71 2021 1
+71 2022 1
+71 2023 1
+71 2024 1
+71 2025 1
+71 2026 1
+71 2027 1
+71 2053 1
+71 2054 1
+71 2055 1
+71 2056 1
+71 2057 1
+71 2088 1
+71 2089 1
+71 2090 1
+71 2091 1
+71 2092 1
+71 2093 1
+71 2094 1
+71 2095 1
+71 2096 1
+71 2097 1
+71 2123 1
+71 2124 1
+71 2125 1
+71 2126 1
+71 2127 1
+71 2128 1
+71 2129 1
+71 2130 1
+71 2131 1
+71 2132 1
+71 2158 1
+71 2159 1
+71 2160 1
+71 2161 1
+71 2162 1
+71 2163 1
+71 2164 1
+71 2165 1
+71 2166 1
+71 2167 1
+71 2179 1
+71 2200 1
+71 2201 1
+71 2202 1
+71 2203 1
+71 2204 1
+71 2235 1
+71 2236 1
+71 2237 1
+71 2238 1
+71 2239 1
+71 2270 1
+71 2271 1
+71 2272 1
+71 2273 1
+71 2274 1
+71 2275 1
+71 2276 1
+71 2277 1
+71 2278 1
+71 2279 1
+71 2305 1
+71 2306 1
+71 2307 1
+71 2308 1
+71 2309 1
+71 2340 1
+71 2341 1
+71 2342 1
+71 2343 1
+71 2344 1
+71 2345 1
+71 2346 1
+71 2347 1
+71 2348 1
+71 2349 1
+71 2375 1
+71 2376 1
+71 2377 1
+71 2378 1
+71 2379 1
+71 2380 1
+71 2381 1
+71 2382 1
+71 2383 1
+71 2384 1
+71 2410 1
+71 2411 1
+71 2412 1
+71 2413 1
+71 2414 1
+71 2415 1
+71 2416 1
+71 2417 1
+71 2418 1
+71 2419 1
+71 2431 1
+71 2432 1
+71 2433 1
+71 2434 1
+71 2435 1
+71 2466 1
+71 2467 1
+71 2468 1
+71 2469 1
+71 2470 1
+71 2471 1
+71 2472 1
+71 2473 1
+71 2474 1
+71 2475 1
+71 2501 1
+71 2502 1
+71 2503 1
+71 2504 1
+71 2505 1
+71 2506 1
+71 2507 1
+71 2508 1
+71 2509 1
+71 2510 1
+71 2536 1
+71 2537 1
+71 2538 1
+71 2539 1
+71 2540 1
+71 2541 1
+71 2542 1
+71 2543 1
+71 2544 1
+71 2545 1
+71 2557 1
+71 2558 1
+71 2559 1
+71 2560 1
+71 2561 1
+71 2562 1
+71 2563 1
+71 2564 1
+71 2565 1
+71 2566 1
+71 2592 1
+71 2593 1
+71 2594 1
+71 2595 1
+71 2596 1
+71 2597 1
+71 2598 1
+71 2599 1
+71 2600 1
+71 2601 1
+71 2613 1
+71 2614 1
+71 2615 1
+71 2616 1
+71 2617 1
+71 2618 1
+71 2619 1
+71 2620 1
+71 2621 1
+71 2622 1
+71 2634 1
+71 2635 1
+71 2636 1
+71 2637 1
+71 2638 1
+71 2641 1
+71 2662 1
+71 2663 1
+71 2664 1
+71 2665 1
+71 2666 1
+71 2697 1
+71 2698 1
+71 2699 1
+71 2700 1
+71 2701 1
+71 2732 1
+71 2733 1
+71 2734 1
+71 2735 1
+71 2736 1
+71 2737 1
+71 2738 1
+71 2739 1
+71 2740 1
+71 2741 1
+71 2767 1
+71 2768 1
+71 2769 1
+71 2770 1
+71 2771 1
+71 2802 1
+71 2803 1
+71 2804 1
+71 2805 1
+71 2806 1
+71 2807 1
+71 2808 1
+71 2809 1
+71 2810 1
+71 2811 1
+71 2837 1
+71 2838 1
+71 2839 1
+71 2840 1
+71 2841 1
+71 2842 1
+71 2843 1
+71 2844 1
+71 2845 1
+71 2846 1
+71 2872 1
+71 2873 1
+71 2874 1
+71 2875 1
+71 2876 1
+71 2877 1
+71 2878 1
+71 2879 1
+71 2880 1
+71 2881 1
+71 2893 1
+71 2894 1
+71 2895 1
+71 2896 1
+71 2897 1
+71 2928 1
+71 2929 1
+71 2930 1
+71 2931 1
+71 2932 1
+71 2933 1
+71 2934 1
+71 2935 1
+71 2936 1
+71 2937 1
+71 2963 1
+71 2964 1
+71 2965 1
+71 2966 1
+71 2967 1
+71 2968 1
+71 2969 1
+71 2970 1
+71 2971 1
+71 2972 1
+71 2998 1
+71 2999 1
+71 3000 1
+71 3001 1
+71 3002 1
+71 3003 1
+71 3004 1
+71 3005 1
+71 3006 1
+71 3007 1
+71 3019 1
+71 3020 1
+71 3021 1
+71 3022 1
+71 3023 1
+71 3024 1
+71 3025 1
+71 3026 1
+71 3027 1
+71 3028 1
+71 3054 1
+71 3055 1
+71 3056 1
+71 3057 1
+71 3058 1
+71 3059 1
+71 3060 1
+71 3061 1
+71 3062 1
+71 3063 1
+71 3075 1
+71 3076 1
+71 3077 1
+71 3078 1
+71 3079 1
+71 3080 1
+71 3081 1
+71 3082 1
+71 3083 1
+71 3084 1
+71 3096 1
+71 3097 1
+71 3098 1
+71 3099 1
+71 3100 1
+71 3103 1
+71 3104 1
+71 3105 1
+71 3106 1
+71 3107 1
+71 3138 1
+71 3139 1
+71 3140 1
+71 3141 1
+71 3142 1
+71 3143 1
+71 3144 1
+71 3145 1
+71 3146 1
+71 3147 1
+71 3173 1
+71 3174 1
+71 3175 1
+71 3176 1
+71 3177 1
+71 3178 1
+71 3179 1
+71 3180 1
+71 3181 1
+71 3182 1
+71 3208 1
+71 3209 1
+71 3210 1
+71 3211 1
+71 3212 1
+71 3213 1
+71 3214 1
+71 3215 1
+71 3216 1
+71 3217 1
+71 3229 1
+71 3230 1
+71 3231 1
+71 3232 1
+71 3233 1
+71 3234 1
+71 3235 1
+71 3236 1
+71 3237 1
+71 3238 1
+71 3264 1
+71 3265 1
+71 3266 1
+71 3267 1
+71 3268 1
+71 3269 1
+71 3270 1
+71 3271 1
+71 3272 1
+71 3273 1
+71 3285 1
+71 3286 1
+71 3287 1
+71 3288 1
+71 3289 1
+71 3290 1
+71 3291 1
+71 3292 1
+71 3293 1
+71 3294 1
+71 3306 1
+71 3307 1
+71 3308 1
+71 3309 1
+71 3310 1
+71 3313 1
+71 3314 1
+71 3315 1
+71 3316 1
+71 3317 1
+71 3318 1
+71 3319 1
+71 3320 1
+71 3321 1
+71 3322 1
+71 3348 1
+71 3349 1
+71 3350 1
+71 3351 1
+71 3352 1
+71 3353 1
+71 3354 1
+71 3355 1
+71 3356 1
+71 3357 1
+71 3369 1
+71 3370 1
+71 3371 1
+71 3372 1
+71 3373 1
+71 3374 1
+71 3375 1
+71 3376 1
+71 3377 1
+71 3378 1
+71 3390 1
+71 3391 1
+71 3392 1
+71 3393 1
+71 3394 1
+71 3397 1
+71 3398 1
+71 3399 1
+71 3400 1
+71 3401 1
+71 3402 1
+71 3403 1
+71 3404 1
+71 3405 1
+71 3406 1
+71 3418 1
+71 3419 1
+71 3420 1
+71 3421 1
+71 3422 1
+71 3425 1
+71 3426 1
+71 3427 1
+71 3428 1
+71 3429 1
+71 3432 1
+72 17 1
+72 45 1
+72 66 1
+72 86 1
+72 91 1
+72 92 1
+72 93 1
+72 94 1
+72 129 1
+72 150 1
+72 170 1
+72 175 1
+72 176 1
+72 177 1
+72 178 1
+72 206 1
+72 226 1
+72 231 1
+72 232 1
+72 233 1
+72 234 1
+72 261 1
+72 266 1
+72 267 1
+72 268 1
+72 269 1
+72 296 1
+72 297 1
+72 298 1
+72 299 1
+72 306 1
+72 307 1
+72 308 1
+72 309 1
+72 310 1
+72 311 1
+72 339 1
+72 360 1
+72 380 1
+72 385 1
+72 386 1
+72 387 1
+72 388 1
+72 416 1
+72 436 1
+72 441 1
+72 442 1
+72 443 1
+72 444 1
+72 471 1
+72 476 1
+72 477 1
+72 478 1
+72 479 1
+72 506 1
+72 507 1
+72 508 1
+72 509 1
+72 516 1
+72 517 1
+72 518 1
+72 519 1
+72 520 1
+72 521 1
+72 542 1
+72 562 1
+72 567 1
+72 568 1
+72 569 1
+72 570 1
+72 597 1
+72 602 1
+72 603 1
+72 604 1
+72 605 1
+72 632 1
+72 633 1
+72 634 1
+72 635 1
+72 642 1
+72 643 1
+72 644 1
+72 645 1
+72 646 1
+72 647 1
+72 667 1
+72 672 1
+72 673 1
+72 674 1
+72 675 1
+72 702 1
+72 703 1
+72 704 1
+72 705 1
+72 712 1
+72 713 1
+72 714 1
+72 715 1
+72 716 1
+72 717 1
+72 737 1
+72 738 1
+72 739 1
+72 740 1
+72 747 1
+72 748 1
+72 749 1
+72 750 1
+72 751 1
+72 752 1
+72 772 1
+72 773 1
+72 774 1
+72 775 1
+72 776 1
+72 777 1
+72 782 1
+72 783 1
+72 784 1
+72 785 1
+72 801 1
+72 822 1
+72 842 1
+72 847 1
+72 848 1
+72 849 1
+72 850 1
+72 878 1
+72 898 1
+72 903 1
+72 904 1
+72 905 1
+72 906 1
+72 933 1
+72 938 1
+72 939 1
+72 940 1
+72 941 1
+72 968 1
+72 969 1
+72 970 1
+72 971 1
+72 978 1
+72 979 1
+72 980 1
+72 981 1
+72 982 1
+72 983 1
+72 1004 1
+72 1024 1
+72 1029 1
+72 1030 1
+72 1031 1
+72 1032 1
+72 1059 1
+72 1064 1
+72 1065 1
+72 1066 1
+72 1067 1
+72 1094 1
+72 1095 1
+72 1096 1
+72 1097 1
+72 1104 1
+72 1105 1
+72 1106 1
+72 1107 1
+72 1108 1
+72 1109 1
+72 1129 1
+72 1134 1
+72 1135 1
+72 1136 1
+72 1137 1
+72 1164 1
+72 1165 1
+72 1166 1
+72 1167 1
+72 1174 1
+72 1175 1
+72 1176 1
+72 1177 1
+72 1178 1
+72 1179 1
+72 1199 1
+72 1200 1
+72 1201 1
+72 1202 1
+72 1209 1
+72 1210 1
+72 1211 1
+72 1212 1
+72 1213 1
+72 1214 1
+72 1234 1
+72 1235 1
+72 1236 1
+72 1237 1
+72 1238 1
+72 1239 1
+72 1244 1
+72 1245 1
+72 1246 1
+72 1247 1
+72 1256 1
+72 1276 1
+72 1281 1
+72 1282 1
+72 1283 1
+72 1284 1
+72 1311 1
+72 1316 1
+72 1317 1
+72 1318 1
+72 1319 1
+72 1346 1
+72 1347 1
+72 1348 1
+72 1349 1
+72 1356 1
+72 1357 1
+72 1358 1
+72 1359 1
+72 1360 1
+72 1361 1
+72 1381 1
+72 1386 1
+72 1387 1
+72 1388 1
+72 1389 1
+72 1416 1
+72 1417 1
+72 1418 1
+72 1419 1
+72 1426 1
+72 1427 1
+72 1428 1
+72 1429 1
+72 1430 1
+72 1431 1
+72 1451 1
+72 1452 1
+72 1453 1
+72 1454 1
+72 1461 1
+72 1462 1
+72 1463 1
+72 1464 1
+72 1465 1
+72 1466 1
+72 1486 1
+72 1487 1
+72 1488 1
+72 1489 1
+72 1490 1
+72 1491 1
+72 1496 1
+72 1497 1
+72 1498 1
+72 1499 1
+72 1507 1
+72 1512 1
+72 1513 1
+72 1514 1
+72 1515 1
+72 1542 1
+72 1543 1
+72 1544 1
+72 1545 1
+72 1552 1
+72 1553 1
+72 1554 1
+72 1555 1
+72 1556 1
+72 1557 1
+72 1577 1
+72 1578 1
+72 1579 1
+72 1580 1
+72 1587 1
+72 1588 1
+72 1589 1
+72 1590 1
+72 1591 1
+72 1592 1
+72 1612 1
+72 1613 1
+72 1614 1
+72 1615 1
+72 1616 1
+72 1617 1
+72 1622 1
+72 1623 1
+72 1624 1
+72 1625 1
+72 1633 1
+72 1634 1
+72 1635 1
+72 1636 1
+72 1643 1
+72 1644 1
+72 1645 1
+72 1646 1
+72 1647 1
+72 1648 1
+72 1668 1
+72 1669 1
+72 1670 1
+72 1671 1
+72 1672 1
+72 1673 1
+72 1678 1
+72 1679 1
+72 1680 1
+72 1681 1
+72 1689 1
+72 1690 1
+72 1691 1
+72 1692 1
+72 1693 1
+72 1694 1
+72 1699 1
+72 1700 1
+72 1701 1
+72 1702 1
+72 1710 1
+72 1711 1
+72 1712 1
+72 1713 1
+72 1715 1
+72 1725 1
+72 1746 1
+72 1766 1
+72 1771 1
+72 1772 1
+72 1773 1
+72 1774 1
+72 1802 1
+72 1822 1
+72 1827 1
+72 1828 1
+72 1829 1
+72 1830 1
+72 1857 1
+72 1862 1
+72 1863 1
+72 1864 1
+72 1865 1
+72 1892 1
+72 1893 1
+72 1894 1
+72 1895 1
+72 1902 1
+72 1903 1
+72 1904 1
+72 1905 1
+72 1906 1
+72 1907 1
+72 1928 1
+72 1948 1
+72 1953 1
+72 1954 1
+72 1955 1
+72 1956 1
+72 1983 1
+72 1988 1
+72 1989 1
+72 1990 1
+72 1991 1
+72 2018 1
+72 2019 1
+72 2020 1
+72 2021 1
+72 2028 1
+72 2029 1
+72 2030 1
+72 2031 1
+72 2032 1
+72 2033 1
+72 2053 1
+72 2058 1
+72 2059 1
+72 2060 1
+72 2061 1
+72 2088 1
+72 2089 1
+72 2090 1
+72 2091 1
+72 2098 1
+72 2099 1
+72 2100 1
+72 2101 1
+72 2102 1
+72 2103 1
+72 2123 1
+72 2124 1
+72 2125 1
+72 2126 1
+72 2133 1
+72 2134 1
+72 2135 1
+72 2136 1
+72 2137 1
+72 2138 1
+72 2158 1
+72 2159 1
+72 2160 1
+72 2161 1
+72 2162 1
+72 2163 1
+72 2168 1
+72 2169 1
+72 2170 1
+72 2171 1
+72 2180 1
+72 2200 1
+72 2205 1
+72 2206 1
+72 2207 1
+72 2208 1
+72 2235 1
+72 2240 1
+72 2241 1
+72 2242 1
+72 2243 1
+72 2270 1
+72 2271 1
+72 2272 1
+72 2273 1
+72 2280 1
+72 2281 1
+72 2282 1
+72 2283 1
+72 2284 1
+72 2285 1
+72 2305 1
+72 2310 1
+72 2311 1
+72 2312 1
+72 2313 1
+72 2340 1
+72 2341 1
+72 2342 1
+72 2343 1
+72 2350 1
+72 2351 1
+72 2352 1
+72 2353 1
+72 2354 1
+72 2355 1
+72 2375 1
+72 2376 1
+72 2377 1
+72 2378 1
+72 2385 1
+72 2386 1
+72 2387 1
+72 2388 1
+72 2389 1
+72 2390 1
+72 2410 1
+72 2411 1
+72 2412 1
+72 2413 1
+72 2414 1
+72 2415 1
+72 2420 1
+72 2421 1
+72 2422 1
+72 2423 1
+72 2431 1
+72 2436 1
+72 2437 1
+72 2438 1
+72 2439 1
+72 2466 1
+72 2467 1
+72 2468 1
+72 2469 1
+72 2476 1
+72 2477 1
+72 2478 1
+72 2479 1
+72 2480 1
+72 2481 1
+72 2501 1
+72 2502 1
+72 2503 1
+72 2504 1
+72 2511 1
+72 2512 1
+72 2513 1
+72 2514 1
+72 2515 1
+72 2516 1
+72 2536 1
+72 2537 1
+72 2538 1
+72 2539 1
+72 2540 1
+72 2541 1
+72 2546 1
+72 2547 1
+72 2548 1
+72 2549 1
+72 2557 1
+72 2558 1
+72 2559 1
+72 2560 1
+72 2567 1
+72 2568 1
+72 2569 1
+72 2570 1
+72 2571 1
+72 2572 1
+72 2592 1
+72 2593 1
+72 2594 1
+72 2595 1
+72 2596 1
+72 2597 1
+72 2602 1
+72 2603 1
+72 2604 1
+72 2605 1
+72 2613 1
+72 2614 1
+72 2615 1
+72 2616 1
+72 2617 1
+72 2618 1
+72 2623 1
+72 2624 1
+72 2625 1
+72 2626 1
+72 2634 1
+72 2635 1
+72 2636 1
+72 2637 1
+72 2639 1
+72 2642 1
+72 2662 1
+72 2667 1
+72 2668 1
+72 2669 1
+72 2670 1
+72 2697 1
+72 2702 1
+72 2703 1
+72 2704 1
+72 2705 1
+72 2732 1
+72 2733 1
+72 2734 1
+72 2735 1
+72 2742 1
+72 2743 1
+72 2744 1
+72 2745 1
+72 2746 1
+72 2747 1
+72 2767 1
+72 2772 1
+72 2773 1
+72 2774 1
+72 2775 1
+72 2802 1
+72 2803 1
+72 2804 1
+72 2805 1
+72 2812 1
+72 2813 1
+72 2814 1
+72 2815 1
+72 2816 1
+72 2817 1
+72 2837 1
+72 2838 1
+72 2839 1
+72 2840 1
+72 2847 1
+72 2848 1
+72 2849 1
+72 2850 1
+72 2851 1
+72 2852 1
+72 2872 1
+72 2873 1
+72 2874 1
+72 2875 1
+72 2876 1
+72 2877 1
+72 2882 1
+72 2883 1
+72 2884 1
+72 2885 1
+72 2893 1
+72 2898 1
+72 2899 1
+72 2900 1
+72 2901 1
+72 2928 1
+72 2929 1
+72 2930 1
+72 2931 1
+72 2938 1
+72 2939 1
+72 2940 1
+72 2941 1
+72 2942 1
+72 2943 1
+72 2963 1
+72 2964 1
+72 2965 1
+72 2966 1
+72 2973 1
+72 2974 1
+72 2975 1
+72 2976 1
+72 2977 1
+72 2978 1
+72 2998 1
+72 2999 1
+72 3000 1
+72 3001 1
+72 3002 1
+72 3003 1
+72 3008 1
+72 3009 1
+72 3010 1
+72 3011 1
+72 3019 1
+72 3020 1
+72 3021 1
+72 3022 1
+72 3029 1
+72 3030 1
+72 3031 1
+72 3032 1
+72 3033 1
+72 3034 1
+72 3054 1
+72 3055 1
+72 3056 1
+72 3057 1
+72 3058 1
+72 3059 1
+72 3064 1
+72 3065 1
+72 3066 1
+72 3067 1
+72 3075 1
+72 3076 1
+72 3077 1
+72 3078 1
+72 3079 1
+72 3080 1
+72 3085 1
+72 3086 1
+72 3087 1
+72 3088 1
+72 3096 1
+72 3097 1
+72 3098 1
+72 3099 1
+72 3101 1
+72 3103 1
+72 3108 1
+72 3109 1
+72 3110 1
+72 3111 1
+72 3138 1
+72 3139 1
+72 3140 1
+72 3141 1
+72 3148 1
+72 3149 1
+72 3150 1
+72 3151 1
+72 3152 1
+72 3153 1
+72 3173 1
+72 3174 1
+72 3175 1
+72 3176 1
+72 3183 1
+72 3184 1
+72 3185 1
+72 3186 1
+72 3187 1
+72 3188 1
+72 3208 1
+72 3209 1
+72 3210 1
+72 3211 1
+72 3212 1
+72 3213 1
+72 3218 1
+72 3219 1
+72 3220 1
+72 3221 1
+72 3229 1
+72 3230 1
+72 3231 1
+72 3232 1
+72 3239 1
+72 3240 1
+72 3241 1
+72 3242 1
+72 3243 1
+72 3244 1
+72 3264 1
+72 3265 1
+72 3266 1
+72 3267 1
+72 3268 1
+72 3269 1
+72 3274 1
+72 3275 1
+72 3276 1
+72 3277 1
+72 3285 1
+72 3286 1
+72 3287 1
+72 3288 1
+72 3289 1
+72 3290 1
+72 3295 1
+72 3296 1
+72 3297 1
+72 3298 1
+72 3306 1
+72 3307 1
+72 3308 1
+72 3309 1
+72 3311 1
+72 3313 1
+72 3314 1
+72 3315 1
+72 3316 1
+72 3323 1
+72 3324 1
+72 3325 1
+72 3326 1
+72 3327 1
+72 3328 1
+72 3348 1
+72 3349 1
+72 3350 1
+72 3351 1
+72 3352 1
+72 3353 1
+72 3358 1
+72 3359 1
+72 3360 1
+72 3361 1
+72 3369 1
+72 3370 1
+72 3371 1
+72 3372 1
+72 3373 1
+72 3374 1
+72 3379 1
+72 3380 1
+72 3381 1
+72 3382 1
+72 3390 1
+72 3391 1
+72 3392 1
+72 3393 1
+72 3395 1
+72 3397 1
+72 3398 1
+72 3399 1
+72 3400 1
+72 3401 1
+72 3402 1
+72 3407 1
+72 3408 1
+72 3409 1
+72 3410 1
+72 3418 1
+72 3419 1
+72 3420 1
+72 3421 1
+72 3423 1
+72 3425 1
+72 3426 1
+72 3427 1
+72 3428 1
+72 3430 1
+72 3432 1
+73 18 1
+73 46 1
+73 67 1
+73 87 1
+73 91 1
+73 95 1
+73 96 1
+73 97 1
+73 130 1
+73 151 1
+73 171 1
+73 175 1
+73 179 1
+73 180 1
+73 181 1
+73 207 1
+73 227 1
+73 231 1
+73 235 1
+73 236 1
+73 237 1
+73 262 1
+73 266 1
+73 270 1
+73 271 1
+73 272 1
+73 296 1
+73 300 1
+73 301 1
+73 302 1
+73 306 1
+73 307 1
+73 308 1
+73 312 1
+73 313 1
+73 314 1
+73 340 1
+73 361 1
+73 381 1
+73 385 1
+73 389 1
+73 390 1
+73 391 1
+73 417 1
+73 437 1
+73 441 1
+73 445 1
+73 446 1
+73 447 1
+73 472 1
+73 476 1
+73 480 1
+73 481 1
+73 482 1
+73 506 1
+73 510 1
+73 511 1
+73 512 1
+73 516 1
+73 517 1
+73 518 1
+73 522 1
+73 523 1
+73 524 1
+73 543 1
+73 563 1
+73 567 1
+73 571 1
+73 572 1
+73 573 1
+73 598 1
+73 602 1
+73 606 1
+73 607 1
+73 608 1
+73 632 1
+73 636 1
+73 637 1
+73 638 1
+73 642 1
+73 643 1
+73 644 1
+73 648 1
+73 649 1
+73 650 1
+73 668 1
+73 672 1
+73 676 1
+73 677 1
+73 678 1
+73 702 1
+73 706 1
+73 707 1
+73 708 1
+73 712 1
+73 713 1
+73 714 1
+73 718 1
+73 719 1
+73 720 1
+73 737 1
+73 741 1
+73 742 1
+73 743 1
+73 747 1
+73 748 1
+73 749 1
+73 753 1
+73 754 1
+73 755 1
+73 772 1
+73 773 1
+73 774 1
+73 778 1
+73 779 1
+73 780 1
+73 782 1
+73 783 1
+73 784 1
+73 786 1
+73 802 1
+73 823 1
+73 843 1
+73 847 1
+73 851 1
+73 852 1
+73 853 1
+73 879 1
+73 899 1
+73 903 1
+73 907 1
+73 908 1
+73 909 1
+73 934 1
+73 938 1
+73 942 1
+73 943 1
+73 944 1
+73 968 1
+73 972 1
+73 973 1
+73 974 1
+73 978 1
+73 979 1
+73 980 1
+73 984 1
+73 985 1
+73 986 1
+73 1005 1
+73 1025 1
+73 1029 1
+73 1033 1
+73 1034 1
+73 1035 1
+73 1060 1
+73 1064 1
+73 1068 1
+73 1069 1
+73 1070 1
+73 1094 1
+73 1098 1
+73 1099 1
+73 1100 1
+73 1104 1
+73 1105 1
+73 1106 1
+73 1110 1
+73 1111 1
+73 1112 1
+73 1130 1
+73 1134 1
+73 1138 1
+73 1139 1
+73 1140 1
+73 1164 1
+73 1168 1
+73 1169 1
+73 1170 1
+73 1174 1
+73 1175 1
+73 1176 1
+73 1180 1
+73 1181 1
+73 1182 1
+73 1199 1
+73 1203 1
+73 1204 1
+73 1205 1
+73 1209 1
+73 1210 1
+73 1211 1
+73 1215 1
+73 1216 1
+73 1217 1
+73 1234 1
+73 1235 1
+73 1236 1
+73 1240 1
+73 1241 1
+73 1242 1
+73 1244 1
+73 1245 1
+73 1246 1
+73 1248 1
+73 1257 1
+73 1277 1
+73 1281 1
+73 1285 1
+73 1286 1
+73 1287 1
+73 1312 1
+73 1316 1
+73 1320 1
+73 1321 1
+73 1322 1
+73 1346 1
+73 1350 1
+73 1351 1
+73 1352 1
+73 1356 1
+73 1357 1
+73 1358 1
+73 1362 1
+73 1363 1
+73 1364 1
+73 1382 1
+73 1386 1
+73 1390 1
+73 1391 1
+73 1392 1
+73 1416 1
+73 1420 1
+73 1421 1
+73 1422 1
+73 1426 1
+73 1427 1
+73 1428 1
+73 1432 1
+73 1433 1
+73 1434 1
+73 1451 1
+73 1455 1
+73 1456 1
+73 1457 1
+73 1461 1
+73 1462 1
+73 1463 1
+73 1467 1
+73 1468 1
+73 1469 1
+73 1486 1
+73 1487 1
+73 1488 1
+73 1492 1
+73 1493 1
+73 1494 1
+73 1496 1
+73 1497 1
+73 1498 1
+73 1500 1
+73 1508 1
+73 1512 1
+73 1516 1
+73 1517 1
+73 1518 1
+73 1542 1
+73 1546 1
+73 1547 1
+73 1548 1
+73 1552 1
+73 1553 1
+73 1554 1
+73 1558 1
+73 1559 1
+73 1560 1
+73 1577 1
+73 1581 1
+73 1582 1
+73 1583 1
+73 1587 1
+73 1588 1
+73 1589 1
+73 1593 1
+73 1594 1
+73 1595 1
+73 1612 1
+73 1613 1
+73 1614 1
+73 1618 1
+73 1619 1
+73 1620 1
+73 1622 1
+73 1623 1
+73 1624 1
+73 1626 1
+73 1633 1
+73 1637 1
+73 1638 1
+73 1639 1
+73 1643 1
+73 1644 1
+73 1645 1
+73 1649 1
+73 1650 1
+73 1651 1
+73 1668 1
+73 1669 1
+73 1670 1
+73 1674 1
+73 1675 1
+73 1676 1
+73 1678 1
+73 1679 1
+73 1680 1
+73 1682 1
+73 1689 1
+73 1690 1
+73 1691 1
+73 1695 1
+73 1696 1
+73 1697 1
+73 1699 1
+73 1700 1
+73 1701 1
+73 1703 1
+73 1710 1
+73 1711 1
+73 1712 1
+73 1714 1
+73 1715 1
+73 1726 1
+73 1747 1
+73 1767 1
+73 1771 1
+73 1775 1
+73 1776 1
+73 1777 1
+73 1803 1
+73 1823 1
+73 1827 1
+73 1831 1
+73 1832 1
+73 1833 1
+73 1858 1
+73 1862 1
+73 1866 1
+73 1867 1
+73 1868 1
+73 1892 1
+73 1896 1
+73 1897 1
+73 1898 1
+73 1902 1
+73 1903 1
+73 1904 1
+73 1908 1
+73 1909 1
+73 1910 1
+73 1929 1
+73 1949 1
+73 1953 1
+73 1957 1
+73 1958 1
+73 1959 1
+73 1984 1
+73 1988 1
+73 1992 1
+73 1993 1
+73 1994 1
+73 2018 1
+73 2022 1
+73 2023 1
+73 2024 1
+73 2028 1
+73 2029 1
+73 2030 1
+73 2034 1
+73 2035 1
+73 2036 1
+73 2054 1
+73 2058 1
+73 2062 1
+73 2063 1
+73 2064 1
+73 2088 1
+73 2092 1
+73 2093 1
+73 2094 1
+73 2098 1
+73 2099 1
+73 2100 1
+73 2104 1
+73 2105 1
+73 2106 1
+73 2123 1
+73 2127 1
+73 2128 1
+73 2129 1
+73 2133 1
+73 2134 1
+73 2135 1
+73 2139 1
+73 2140 1
+73 2141 1
+73 2158 1
+73 2159 1
+73 2160 1
+73 2164 1
+73 2165 1
+73 2166 1
+73 2168 1
+73 2169 1
+73 2170 1
+73 2172 1
+73 2181 1
+73 2201 1
+73 2205 1
+73 2209 1
+73 2210 1
+73 2211 1
+73 2236 1
+73 2240 1
+73 2244 1
+73 2245 1
+73 2246 1
+73 2270 1
+73 2274 1
+73 2275 1
+73 2276 1
+73 2280 1
+73 2281 1
+73 2282 1
+73 2286 1
+73 2287 1
+73 2288 1
+73 2306 1
+73 2310 1
+73 2314 1
+73 2315 1
+73 2316 1
+73 2340 1
+73 2344 1
+73 2345 1
+73 2346 1
+73 2350 1
+73 2351 1
+73 2352 1
+73 2356 1
+73 2357 1
+73 2358 1
+73 2375 1
+73 2379 1
+73 2380 1
+73 2381 1
+73 2385 1
+73 2386 1
+73 2387 1
+73 2391 1
+73 2392 1
+73 2393 1
+73 2410 1
+73 2411 1
+73 2412 1
+73 2416 1
+73 2417 1
+73 2418 1
+73 2420 1
+73 2421 1
+73 2422 1
+73 2424 1
+73 2432 1
+73 2436 1
+73 2440 1
+73 2441 1
+73 2442 1
+73 2466 1
+73 2470 1
+73 2471 1
+73 2472 1
+73 2476 1
+73 2477 1
+73 2478 1
+73 2482 1
+73 2483 1
+73 2484 1
+73 2501 1
+73 2505 1
+73 2506 1
+73 2507 1
+73 2511 1
+73 2512 1
+73 2513 1
+73 2517 1
+73 2518 1
+73 2519 1
+73 2536 1
+73 2537 1
+73 2538 1
+73 2542 1
+73 2543 1
+73 2544 1
+73 2546 1
+73 2547 1
+73 2548 1
+73 2550 1
+73 2557 1
+73 2561 1
+73 2562 1
+73 2563 1
+73 2567 1
+73 2568 1
+73 2569 1
+73 2573 1
+73 2574 1
+73 2575 1
+73 2592 1
+73 2593 1
+73 2594 1
+73 2598 1
+73 2599 1
+73 2600 1
+73 2602 1
+73 2603 1
+73 2604 1
+73 2606 1
+73 2613 1
+73 2614 1
+73 2615 1
+73 2619 1
+73 2620 1
+73 2621 1
+73 2623 1
+73 2624 1
+73 2625 1
+73 2627 1
+73 2634 1
+73 2635 1
+73 2636 1
+73 2638 1
+73 2639 1
+73 2643 1
+73 2663 1
+73 2667 1
+73 2671 1
+73 2672 1
+73 2673 1
+73 2698 1
+73 2702 1
+73 2706 1
+73 2707 1
+73 2708 1
+73 2732 1
+73 2736 1
+73 2737 1
+73 2738 1
+73 2742 1
+73 2743 1
+73 2744 1
+73 2748 1
+73 2749 1
+73 2750 1
+73 2768 1
+73 2772 1
+73 2776 1
+73 2777 1
+73 2778 1
+73 2802 1
+73 2806 1
+73 2807 1
+73 2808 1
+73 2812 1
+73 2813 1
+73 2814 1
+73 2818 1
+73 2819 1
+73 2820 1
+73 2837 1
+73 2841 1
+73 2842 1
+73 2843 1
+73 2847 1
+73 2848 1
+73 2849 1
+73 2853 1
+73 2854 1
+73 2855 1
+73 2872 1
+73 2873 1
+73 2874 1
+73 2878 1
+73 2879 1
+73 2880 1
+73 2882 1
+73 2883 1
+73 2884 1
+73 2886 1
+73 2894 1
+73 2898 1
+73 2902 1
+73 2903 1
+73 2904 1
+73 2928 1
+73 2932 1
+73 2933 1
+73 2934 1
+73 2938 1
+73 2939 1
+73 2940 1
+73 2944 1
+73 2945 1
+73 2946 1
+73 2963 1
+73 2967 1
+73 2968 1
+73 2969 1
+73 2973 1
+73 2974 1
+73 2975 1
+73 2979 1
+73 2980 1
+73 2981 1
+73 2998 1
+73 2999 1
+73 3000 1
+73 3004 1
+73 3005 1
+73 3006 1
+73 3008 1
+73 3009 1
+73 3010 1
+73 3012 1
+73 3019 1
+73 3023 1
+73 3024 1
+73 3025 1
+73 3029 1
+73 3030 1
+73 3031 1
+73 3035 1
+73 3036 1
+73 3037 1
+73 3054 1
+73 3055 1
+73 3056 1
+73 3060 1
+73 3061 1
+73 3062 1
+73 3064 1
+73 3065 1
+73 3066 1
+73 3068 1
+73 3075 1
+73 3076 1
+73 3077 1
+73 3081 1
+73 3082 1
+73 3083 1
+73 3085 1
+73 3086 1
+73 3087 1
+73 3089 1
+73 3096 1
+73 3097 1
+73 3098 1
+73 3100 1
+73 3101 1
+73 3104 1
+73 3108 1
+73 3112 1
+73 3113 1
+73 3114 1
+73 3138 1
+73 3142 1
+73 3143 1
+73 3144 1
+73 3148 1
+73 3149 1
+73 3150 1
+73 3154 1
+73 3155 1
+73 3156 1
+73 3173 1
+73 3177 1
+73 3178 1
+73 3179 1
+73 3183 1
+73 3184 1
+73 3185 1
+73 3189 1
+73 3190 1
+73 3191 1
+73 3208 1
+73 3209 1
+73 3210 1
+73 3214 1
+73 3215 1
+73 3216 1
+73 3218 1
+73 3219 1
+73 3220 1
+73 3222 1
+73 3229 1
+73 3233 1
+73 3234 1
+73 3235 1
+73 3239 1
+73 3240 1
+73 3241 1
+73 3245 1
+73 3246 1
+73 3247 1
+73 3264 1
+73 3265 1
+73 3266 1
+73 3270 1
+73 3271 1
+73 3272 1
+73 3274 1
+73 3275 1
+73 3276 1
+73 3278 1
+73 3285 1
+73 3286 1
+73 3287 1
+73 3291 1
+73 3292 1
+73 3293 1
+73 3295 1
+73 3296 1
+73 3297 1
+73 3299 1
+73 3306 1
+73 3307 1
+73 3308 1
+73 3310 1
+73 3311 1
+73 3313 1
+73 3317 1
+73 3318 1
+73 3319 1
+73 3323 1
+73 3324 1
+73 3325 1
+73 3329 1
+73 3330 1
+73 3331 1
+73 3348 1
+73 3349 1
+73 3350 1
+73 3354 1
+73 3355 1
+73 3356 1
+73 3358 1
+73 3359 1
+73 3360 1
+73 3362 1
+73 3369 1
+73 3370 1
+73 3371 1
+73 3375 1
+73 3376 1
+73 3377 1
+73 3379 1
+73 3380 1
+73 3381 1
+73 3383 1
+73 3390 1
+73 3391 1
+73 3392 1
+73 3394 1
+73 3395 1
+73 3397 1
+73 3398 1
+73 3399 1
+73 3403 1
+73 3404 1
+73 3405 1
+73 3407 1
+73 3408 1
+73 3409 1
+73 3411 1
+73 3418 1
+73 3419 1
+73 3420 1
+73 3422 1
+73 3423 1
+73 3425 1
+73 3426 1
+73 3427 1
+73 3429 1
+73 3430 1
+73 3432 1
+74 19 1
+74 47 1
+74 68 1
+74 88 1
+74 92 1
+74 95 1
+74 98 1
+74 99 1
+74 131 1
+74 152 1
+74 172 1
+74 176 1
+74 179 1
+74 182 1
+74 183 1
+74 208 1
+74 228 1
+74 232 1
+74 235 1
+74 238 1
+74 239 1
+74 263 1
+74 267 1
+74 270 1
+74 273 1
+74 274 1
+74 297 1
+74 300 1
+74 303 1
+74 304 1
+74 306 1
+74 309 1
+74 310 1
+74 312 1
+74 313 1
+74 315 1
+74 341 1
+74 362 1
+74 382 1
+74 386 1
+74 389 1
+74 392 1
+74 393 1
+74 418 1
+74 438 1
+74 442 1
+74 445 1
+74 448 1
+74 449 1
+74 473 1
+74 477 1
+74 480 1
+74 483 1
+74 484 1
+74 507 1
+74 510 1
+74 513 1
+74 514 1
+74 516 1
+74 519 1
+74 520 1
+74 522 1
+74 523 1
+74 525 1
+74 544 1
+74 564 1
+74 568 1
+74 571 1
+74 574 1
+74 575 1
+74 599 1
+74 603 1
+74 606 1
+74 609 1
+74 610 1
+74 633 1
+74 636 1
+74 639 1
+74 640 1
+74 642 1
+74 645 1
+74 646 1
+74 648 1
+74 649 1
+74 651 1
+74 669 1
+74 673 1
+74 676 1
+74 679 1
+74 680 1
+74 703 1
+74 706 1
+74 709 1
+74 710 1
+74 712 1
+74 715 1
+74 716 1
+74 718 1
+74 719 1
+74 721 1
+74 738 1
+74 741 1
+74 744 1
+74 745 1
+74 747 1
+74 750 1
+74 751 1
+74 753 1
+74 754 1
+74 756 1
+74 772 1
+74 775 1
+74 776 1
+74 778 1
+74 779 1
+74 781 1
+74 782 1
+74 783 1
+74 785 1
+74 786 1
+74 803 1
+74 824 1
+74 844 1
+74 848 1
+74 851 1
+74 854 1
+74 855 1
+74 880 1
+74 900 1
+74 904 1
+74 907 1
+74 910 1
+74 911 1
+74 935 1
+74 939 1
+74 942 1
+74 945 1
+74 946 1
+74 969 1
+74 972 1
+74 975 1
+74 976 1
+74 978 1
+74 981 1
+74 982 1
+74 984 1
+74 985 1
+74 987 1
+74 1006 1
+74 1026 1
+74 1030 1
+74 1033 1
+74 1036 1
+74 1037 1
+74 1061 1
+74 1065 1
+74 1068 1
+74 1071 1
+74 1072 1
+74 1095 1
+74 1098 1
+74 1101 1
+74 1102 1
+74 1104 1
+74 1107 1
+74 1108 1
+74 1110 1
+74 1111 1
+74 1113 1
+74 1131 1
+74 1135 1
+74 1138 1
+74 1141 1
+74 1142 1
+74 1165 1
+74 1168 1
+74 1171 1
+74 1172 1
+74 1174 1
+74 1177 1
+74 1178 1
+74 1180 1
+74 1181 1
+74 1183 1
+74 1200 1
+74 1203 1
+74 1206 1
+74 1207 1
+74 1209 1
+74 1212 1
+74 1213 1
+74 1215 1
+74 1216 1
+74 1218 1
+74 1234 1
+74 1237 1
+74 1238 1
+74 1240 1
+74 1241 1
+74 1243 1
+74 1244 1
+74 1245 1
+74 1247 1
+74 1248 1
+74 1258 1
+74 1278 1
+74 1282 1
+74 1285 1
+74 1288 1
+74 1289 1
+74 1313 1
+74 1317 1
+74 1320 1
+74 1323 1
+74 1324 1
+74 1347 1
+74 1350 1
+74 1353 1
+74 1354 1
+74 1356 1
+74 1359 1
+74 1360 1
+74 1362 1
+74 1363 1
+74 1365 1
+74 1383 1
+74 1387 1
+74 1390 1
+74 1393 1
+74 1394 1
+74 1417 1
+74 1420 1
+74 1423 1
+74 1424 1
+74 1426 1
+74 1429 1
+74 1430 1
+74 1432 1
+74 1433 1
+74 1435 1
+74 1452 1
+74 1455 1
+74 1458 1
+74 1459 1
+74 1461 1
+74 1464 1
+74 1465 1
+74 1467 1
+74 1468 1
+74 1470 1
+74 1486 1
+74 1489 1
+74 1490 1
+74 1492 1
+74 1493 1
+74 1495 1
+74 1496 1
+74 1497 1
+74 1499 1
+74 1500 1
+74 1509 1
+74 1513 1
+74 1516 1
+74 1519 1
+74 1520 1
+74 1543 1
+74 1546 1
+74 1549 1
+74 1550 1
+74 1552 1
+74 1555 1
+74 1556 1
+74 1558 1
+74 1559 1
+74 1561 1
+74 1578 1
+74 1581 1
+74 1584 1
+74 1585 1
+74 1587 1
+74 1590 1
+74 1591 1
+74 1593 1
+74 1594 1
+74 1596 1
+74 1612 1
+74 1615 1
+74 1616 1
+74 1618 1
+74 1619 1
+74 1621 1
+74 1622 1
+74 1623 1
+74 1625 1
+74 1626 1
+74 1634 1
+74 1637 1
+74 1640 1
+74 1641 1
+74 1643 1
+74 1646 1
+74 1647 1
+74 1649 1
+74 1650 1
+74 1652 1
+74 1668 1
+74 1671 1
+74 1672 1
+74 1674 1
+74 1675 1
+74 1677 1
+74 1678 1
+74 1679 1
+74 1681 1
+74 1682 1
+74 1689 1
+74 1692 1
+74 1693 1
+74 1695 1
+74 1696 1
+74 1698 1
+74 1699 1
+74 1700 1
+74 1702 1
+74 1703 1
+74 1710 1
+74 1711 1
+74 1713 1
+74 1714 1
+74 1715 1
+74 1727 1
+74 1748 1
+74 1768 1
+74 1772 1
+74 1775 1
+74 1778 1
+74 1779 1
+74 1804 1
+74 1824 1
+74 1828 1
+74 1831 1
+74 1834 1
+74 1835 1
+74 1859 1
+74 1863 1
+74 1866 1
+74 1869 1
+74 1870 1
+74 1893 1
+74 1896 1
+74 1899 1
+74 1900 1
+74 1902 1
+74 1905 1
+74 1906 1
+74 1908 1
+74 1909 1
+74 1911 1
+74 1930 1
+74 1950 1
+74 1954 1
+74 1957 1
+74 1960 1
+74 1961 1
+74 1985 1
+74 1989 1
+74 1992 1
+74 1995 1
+74 1996 1
+74 2019 1
+74 2022 1
+74 2025 1
+74 2026 1
+74 2028 1
+74 2031 1
+74 2032 1
+74 2034 1
+74 2035 1
+74 2037 1
+74 2055 1
+74 2059 1
+74 2062 1
+74 2065 1
+74 2066 1
+74 2089 1
+74 2092 1
+74 2095 1
+74 2096 1
+74 2098 1
+74 2101 1
+74 2102 1
+74 2104 1
+74 2105 1
+74 2107 1
+74 2124 1
+74 2127 1
+74 2130 1
+74 2131 1
+74 2133 1
+74 2136 1
+74 2137 1
+74 2139 1
+74 2140 1
+74 2142 1
+74 2158 1
+74 2161 1
+74 2162 1
+74 2164 1
+74 2165 1
+74 2167 1
+74 2168 1
+74 2169 1
+74 2171 1
+74 2172 1
+74 2182 1
+74 2202 1
+74 2206 1
+74 2209 1
+74 2212 1
+74 2213 1
+74 2237 1
+74 2241 1
+74 2244 1
+74 2247 1
+74 2248 1
+74 2271 1
+74 2274 1
+74 2277 1
+74 2278 1
+74 2280 1
+74 2283 1
+74 2284 1
+74 2286 1
+74 2287 1
+74 2289 1
+74 2307 1
+74 2311 1
+74 2314 1
+74 2317 1
+74 2318 1
+74 2341 1
+74 2344 1
+74 2347 1
+74 2348 1
+74 2350 1
+74 2353 1
+74 2354 1
+74 2356 1
+74 2357 1
+74 2359 1
+74 2376 1
+74 2379 1
+74 2382 1
+74 2383 1
+74 2385 1
+74 2388 1
+74 2389 1
+74 2391 1
+74 2392 1
+74 2394 1
+74 2410 1
+74 2413 1
+74 2414 1
+74 2416 1
+74 2417 1
+74 2419 1
+74 2420 1
+74 2421 1
+74 2423 1
+74 2424 1
+74 2433 1
+74 2437 1
+74 2440 1
+74 2443 1
+74 2444 1
+74 2467 1
+74 2470 1
+74 2473 1
+74 2474 1
+74 2476 1
+74 2479 1
+74 2480 1
+74 2482 1
+74 2483 1
+74 2485 1
+74 2502 1
+74 2505 1
+74 2508 1
+74 2509 1
+74 2511 1
+74 2514 1
+74 2515 1
+74 2517 1
+74 2518 1
+74 2520 1
+74 2536 1
+74 2539 1
+74 2540 1
+74 2542 1
+74 2543 1
+74 2545 1
+74 2546 1
+74 2547 1
+74 2549 1
+74 2550 1
+74 2558 1
+74 2561 1
+74 2564 1
+74 2565 1
+74 2567 1
+74 2570 1
+74 2571 1
+74 2573 1
+74 2574 1
+74 2576 1
+74 2592 1
+74 2595 1
+74 2596 1
+74 2598 1
+74 2599 1
+74 2601 1
+74 2602 1
+74 2603 1
+74 2605 1
+74 2606 1
+74 2613 1
+74 2616 1
+74 2617 1
+74 2619 1
+74 2620 1
+74 2622 1
+74 2623 1
+74 2624 1
+74 2626 1
+74 2627 1
+74 2634 1
+74 2635 1
+74 2637 1
+74 2638 1
+74 2639 1
+74 2644 1
+74 2664 1
+74 2668 1
+74 2671 1
+74 2674 1
+74 2675 1
+74 2699 1
+74 2703 1
+74 2706 1
+74 2709 1
+74 2710 1
+74 2733 1
+74 2736 1
+74 2739 1
+74 2740 1
+74 2742 1
+74 2745 1
+74 2746 1
+74 2748 1
+74 2749 1
+74 2751 1
+74 2769 1
+74 2773 1
+74 2776 1
+74 2779 1
+74 2780 1
+74 2803 1
+74 2806 1
+74 2809 1
+74 2810 1
+74 2812 1
+74 2815 1
+74 2816 1
+74 2818 1
+74 2819 1
+74 2821 1
+74 2838 1
+74 2841 1
+74 2844 1
+74 2845 1
+74 2847 1
+74 2850 1
+74 2851 1
+74 2853 1
+74 2854 1
+74 2856 1
+74 2872 1
+74 2875 1
+74 2876 1
+74 2878 1
+74 2879 1
+74 2881 1
+74 2882 1
+74 2883 1
+74 2885 1
+74 2886 1
+74 2895 1
+74 2899 1
+74 2902 1
+74 2905 1
+74 2906 1
+74 2929 1
+74 2932 1
+74 2935 1
+74 2936 1
+74 2938 1
+74 2941 1
+74 2942 1
+74 2944 1
+74 2945 1
+74 2947 1
+74 2964 1
+74 2967 1
+74 2970 1
+74 2971 1
+74 2973 1
+74 2976 1
+74 2977 1
+74 2979 1
+74 2980 1
+74 2982 1
+74 2998 1
+74 3001 1
+74 3002 1
+74 3004 1
+74 3005 1
+74 3007 1
+74 3008 1
+74 3009 1
+74 3011 1
+74 3012 1
+74 3020 1
+74 3023 1
+74 3026 1
+74 3027 1
+74 3029 1
+74 3032 1
+74 3033 1
+74 3035 1
+74 3036 1
+74 3038 1
+74 3054 1
+74 3057 1
+74 3058 1
+74 3060 1
+74 3061 1
+74 3063 1
+74 3064 1
+74 3065 1
+74 3067 1
+74 3068 1
+74 3075 1
+74 3078 1
+74 3079 1
+74 3081 1
+74 3082 1
+74 3084 1
+74 3085 1
+74 3086 1
+74 3088 1
+74 3089 1
+74 3096 1
+74 3097 1
+74 3099 1
+74 3100 1
+74 3101 1
+74 3105 1
+74 3109 1
+74 3112 1
+74 3115 1
+74 3116 1
+74 3139 1
+74 3142 1
+74 3145 1
+74 3146 1
+74 3148 1
+74 3151 1
+74 3152 1
+74 3154 1
+74 3155 1
+74 3157 1
+74 3174 1
+74 3177 1
+74 3180 1
+74 3181 1
+74 3183 1
+74 3186 1
+74 3187 1
+74 3189 1
+74 3190 1
+74 3192 1
+74 3208 1
+74 3211 1
+74 3212 1
+74 3214 1
+74 3215 1
+74 3217 1
+74 3218 1
+74 3219 1
+74 3221 1
+74 3222 1
+74 3230 1
+74 3233 1
+74 3236 1
+74 3237 1
+74 3239 1
+74 3242 1
+74 3243 1
+74 3245 1
+74 3246 1
+74 3248 1
+74 3264 1
+74 3267 1
+74 3268 1
+74 3270 1
+74 3271 1
+74 3273 1
+74 3274 1
+74 3275 1
+74 3277 1
+74 3278 1
+74 3285 1
+74 3288 1
+74 3289 1
+74 3291 1
+74 3292 1
+74 3294 1
+74 3295 1
+74 3296 1
+74 3298 1
+74 3299 1
+74 3306 1
+74 3307 1
+74 3309 1
+74 3310 1
+74 3311 1
+74 3314 1
+74 3317 1
+74 3320 1
+74 3321 1
+74 3323 1
+74 3326 1
+74 3327 1
+74 3329 1
+74 3330 1
+74 3332 1
+74 3348 1
+74 3351 1
+74 3352 1
+74 3354 1
+74 3355 1
+74 3357 1
+74 3358 1
+74 3359 1
+74 3361 1
+74 3362 1
+74 3369 1
+74 3372 1
+74 3373 1
+74 3375 1
+74 3376 1
+74 3378 1
+74 3379 1
+74 3380 1
+74 3382 1
+74 3383 1
+74 3390 1
+74 3391 1
+74 3393 1
+74 3394 1
+74 3395 1
+74 3397 1
+74 3400 1
+74 3401 1
+74 3403 1
+74 3404 1
+74 3406 1
+74 3407 1
+74 3408 1
+74 3410 1
+74 3411 1
+74 3418 1
+74 3419 1
+74 3421 1
+74 3422 1
+74 3423 1
+74 3425 1
+74 3426 1
+74 3428 1
+74 3429 1
+74 3430 1
+74 3432 1
+75 20 1
+75 48 1
+75 69 1
+75 89 1
+75 93 1
+75 96 1
+75 98 1
+75 100 1
+75 132 1
+75 153 1
+75 173 1
+75 177 1
+75 180 1
+75 182 1
+75 184 1
+75 209 1
+75 229 1
+75 233 1
+75 236 1
+75 238 1
+75 240 1
+75 264 1
+75 268 1
+75 271 1
+75 273 1
+75 275 1
+75 298 1
+75 301 1
+75 303 1
+75 305 1
+75 307 1
+75 309 1
+75 311 1
+75 312 1
+75 314 1
+75 315 1
+75 342 1
+75 363 1
+75 383 1
+75 387 1
+75 390 1
+75 392 1
+75 394 1
+75 419 1
+75 439 1
+75 443 1
+75 446 1
+75 448 1
+75 450 1
+75 474 1
+75 478 1
+75 481 1
+75 483 1
+75 485 1
+75 508 1
+75 511 1
+75 513 1
+75 515 1
+75 517 1
+75 519 1
+75 521 1
+75 522 1
+75 524 1
+75 525 1
+75 545 1
+75 565 1
+75 569 1
+75 572 1
+75 574 1
+75 576 1
+75 600 1
+75 604 1
+75 607 1
+75 609 1
+75 611 1
+75 634 1
+75 637 1
+75 639 1
+75 641 1
+75 643 1
+75 645 1
+75 647 1
+75 648 1
+75 650 1
+75 651 1
+75 670 1
+75 674 1
+75 677 1
+75 679 1
+75 681 1
+75 704 1
+75 707 1
+75 709 1
+75 711 1
+75 713 1
+75 715 1
+75 717 1
+75 718 1
+75 720 1
+75 721 1
+75 739 1
+75 742 1
+75 744 1
+75 746 1
+75 748 1
+75 750 1
+75 752 1
+75 753 1
+75 755 1
+75 756 1
+75 773 1
+75 775 1
+75 777 1
+75 778 1
+75 780 1
+75 781 1
+75 782 1
+75 784 1
+75 785 1
+75 786 1
+75 804 1
+75 825 1
+75 845 1
+75 849 1
+75 852 1
+75 854 1
+75 856 1
+75 881 1
+75 901 1
+75 905 1
+75 908 1
+75 910 1
+75 912 1
+75 936 1
+75 940 1
+75 943 1
+75 945 1
+75 947 1
+75 970 1
+75 973 1
+75 975 1
+75 977 1
+75 979 1
+75 981 1
+75 983 1
+75 984 1
+75 986 1
+75 987 1
+75 1007 1
+75 1027 1
+75 1031 1
+75 1034 1
+75 1036 1
+75 1038 1
+75 1062 1
+75 1066 1
+75 1069 1
+75 1071 1
+75 1073 1
+75 1096 1
+75 1099 1
+75 1101 1
+75 1103 1
+75 1105 1
+75 1107 1
+75 1109 1
+75 1110 1
+75 1112 1
+75 1113 1
+75 1132 1
+75 1136 1
+75 1139 1
+75 1141 1
+75 1143 1
+75 1166 1
+75 1169 1
+75 1171 1
+75 1173 1
+75 1175 1
+75 1177 1
+75 1179 1
+75 1180 1
+75 1182 1
+75 1183 1
+75 1201 1
+75 1204 1
+75 1206 1
+75 1208 1
+75 1210 1
+75 1212 1
+75 1214 1
+75 1215 1
+75 1217 1
+75 1218 1
+75 1235 1
+75 1237 1
+75 1239 1
+75 1240 1
+75 1242 1
+75 1243 1
+75 1244 1
+75 1246 1
+75 1247 1
+75 1248 1
+75 1259 1
+75 1279 1
+75 1283 1
+75 1286 1
+75 1288 1
+75 1290 1
+75 1314 1
+75 1318 1
+75 1321 1
+75 1323 1
+75 1325 1
+75 1348 1
+75 1351 1
+75 1353 1
+75 1355 1
+75 1357 1
+75 1359 1
+75 1361 1
+75 1362 1
+75 1364 1
+75 1365 1
+75 1384 1
+75 1388 1
+75 1391 1
+75 1393 1
+75 1395 1
+75 1418 1
+75 1421 1
+75 1423 1
+75 1425 1
+75 1427 1
+75 1429 1
+75 1431 1
+75 1432 1
+75 1434 1
+75 1435 1
+75 1453 1
+75 1456 1
+75 1458 1
+75 1460 1
+75 1462 1
+75 1464 1
+75 1466 1
+75 1467 1
+75 1469 1
+75 1470 1
+75 1487 1
+75 1489 1
+75 1491 1
+75 1492 1
+75 1494 1
+75 1495 1
+75 1496 1
+75 1498 1
+75 1499 1
+75 1500 1
+75 1510 1
+75 1514 1
+75 1517 1
+75 1519 1
+75 1521 1
+75 1544 1
+75 1547 1
+75 1549 1
+75 1551 1
+75 1553 1
+75 1555 1
+75 1557 1
+75 1558 1
+75 1560 1
+75 1561 1
+75 1579 1
+75 1582 1
+75 1584 1
+75 1586 1
+75 1588 1
+75 1590 1
+75 1592 1
+75 1593 1
+75 1595 1
+75 1596 1
+75 1613 1
+75 1615 1
+75 1617 1
+75 1618 1
+75 1620 1
+75 1621 1
+75 1622 1
+75 1624 1
+75 1625 1
+75 1626 1
+75 1635 1
+75 1638 1
+75 1640 1
+75 1642 1
+75 1644 1
+75 1646 1
+75 1648 1
+75 1649 1
+75 1651 1
+75 1652 1
+75 1669 1
+75 1671 1
+75 1673 1
+75 1674 1
+75 1676 1
+75 1677 1
+75 1678 1
+75 1680 1
+75 1681 1
+75 1682 1
+75 1690 1
+75 1692 1
+75 1694 1
+75 1695 1
+75 1697 1
+75 1698 1
+75 1699 1
+75 1701 1
+75 1702 1
+75 1703 1
+75 1710 1
+75 1712 1
+75 1713 1
+75 1714 1
+75 1715 1
+75 1728 1
+75 1749 1
+75 1769 1
+75 1773 1
+75 1776 1
+75 1778 1
+75 1780 1
+75 1805 1
+75 1825 1
+75 1829 1
+75 1832 1
+75 1834 1
+75 1836 1
+75 1860 1
+75 1864 1
+75 1867 1
+75 1869 1
+75 1871 1
+75 1894 1
+75 1897 1
+75 1899 1
+75 1901 1
+75 1903 1
+75 1905 1
+75 1907 1
+75 1908 1
+75 1910 1
+75 1911 1
+75 1931 1
+75 1951 1
+75 1955 1
+75 1958 1
+75 1960 1
+75 1962 1
+75 1986 1
+75 1990 1
+75 1993 1
+75 1995 1
+75 1997 1
+75 2020 1
+75 2023 1
+75 2025 1
+75 2027 1
+75 2029 1
+75 2031 1
+75 2033 1
+75 2034 1
+75 2036 1
+75 2037 1
+75 2056 1
+75 2060 1
+75 2063 1
+75 2065 1
+75 2067 1
+75 2090 1
+75 2093 1
+75 2095 1
+75 2097 1
+75 2099 1
+75 2101 1
+75 2103 1
+75 2104 1
+75 2106 1
+75 2107 1
+75 2125 1
+75 2128 1
+75 2130 1
+75 2132 1
+75 2134 1
+75 2136 1
+75 2138 1
+75 2139 1
+75 2141 1
+75 2142 1
+75 2159 1
+75 2161 1
+75 2163 1
+75 2164 1
+75 2166 1
+75 2167 1
+75 2168 1
+75 2170 1
+75 2171 1
+75 2172 1
+75 2183 1
+75 2203 1
+75 2207 1
+75 2210 1
+75 2212 1
+75 2214 1
+75 2238 1
+75 2242 1
+75 2245 1
+75 2247 1
+75 2249 1
+75 2272 1
+75 2275 1
+75 2277 1
+75 2279 1
+75 2281 1
+75 2283 1
+75 2285 1
+75 2286 1
+75 2288 1
+75 2289 1
+75 2308 1
+75 2312 1
+75 2315 1
+75 2317 1
+75 2319 1
+75 2342 1
+75 2345 1
+75 2347 1
+75 2349 1
+75 2351 1
+75 2353 1
+75 2355 1
+75 2356 1
+75 2358 1
+75 2359 1
+75 2377 1
+75 2380 1
+75 2382 1
+75 2384 1
+75 2386 1
+75 2388 1
+75 2390 1
+75 2391 1
+75 2393 1
+75 2394 1
+75 2411 1
+75 2413 1
+75 2415 1
+75 2416 1
+75 2418 1
+75 2419 1
+75 2420 1
+75 2422 1
+75 2423 1
+75 2424 1
+75 2434 1
+75 2438 1
+75 2441 1
+75 2443 1
+75 2445 1
+75 2468 1
+75 2471 1
+75 2473 1
+75 2475 1
+75 2477 1
+75 2479 1
+75 2481 1
+75 2482 1
+75 2484 1
+75 2485 1
+75 2503 1
+75 2506 1
+75 2508 1
+75 2510 1
+75 2512 1
+75 2514 1
+75 2516 1
+75 2517 1
+75 2519 1
+75 2520 1
+75 2537 1
+75 2539 1
+75 2541 1
+75 2542 1
+75 2544 1
+75 2545 1
+75 2546 1
+75 2548 1
+75 2549 1
+75 2550 1
+75 2559 1
+75 2562 1
+75 2564 1
+75 2566 1
+75 2568 1
+75 2570 1
+75 2572 1
+75 2573 1
+75 2575 1
+75 2576 1
+75 2593 1
+75 2595 1
+75 2597 1
+75 2598 1
+75 2600 1
+75 2601 1
+75 2602 1
+75 2604 1
+75 2605 1
+75 2606 1
+75 2614 1
+75 2616 1
+75 2618 1
+75 2619 1
+75 2621 1
+75 2622 1
+75 2623 1
+75 2625 1
+75 2626 1
+75 2627 1
+75 2634 1
+75 2636 1
+75 2637 1
+75 2638 1
+75 2639 1
+75 2645 1
+75 2665 1
+75 2669 1
+75 2672 1
+75 2674 1
+75 2676 1
+75 2700 1
+75 2704 1
+75 2707 1
+75 2709 1
+75 2711 1
+75 2734 1
+75 2737 1
+75 2739 1
+75 2741 1
+75 2743 1
+75 2745 1
+75 2747 1
+75 2748 1
+75 2750 1
+75 2751 1
+75 2770 1
+75 2774 1
+75 2777 1
+75 2779 1
+75 2781 1
+75 2804 1
+75 2807 1
+75 2809 1
+75 2811 1
+75 2813 1
+75 2815 1
+75 2817 1
+75 2818 1
+75 2820 1
+75 2821 1
+75 2839 1
+75 2842 1
+75 2844 1
+75 2846 1
+75 2848 1
+75 2850 1
+75 2852 1
+75 2853 1
+75 2855 1
+75 2856 1
+75 2873 1
+75 2875 1
+75 2877 1
+75 2878 1
+75 2880 1
+75 2881 1
+75 2882 1
+75 2884 1
+75 2885 1
+75 2886 1
+75 2896 1
+75 2900 1
+75 2903 1
+75 2905 1
+75 2907 1
+75 2930 1
+75 2933 1
+75 2935 1
+75 2937 1
+75 2939 1
+75 2941 1
+75 2943 1
+75 2944 1
+75 2946 1
+75 2947 1
+75 2965 1
+75 2968 1
+75 2970 1
+75 2972 1
+75 2974 1
+75 2976 1
+75 2978 1
+75 2979 1
+75 2981 1
+75 2982 1
+75 2999 1
+75 3001 1
+75 3003 1
+75 3004 1
+75 3006 1
+75 3007 1
+75 3008 1
+75 3010 1
+75 3011 1
+75 3012 1
+75 3021 1
+75 3024 1
+75 3026 1
+75 3028 1
+75 3030 1
+75 3032 1
+75 3034 1
+75 3035 1
+75 3037 1
+75 3038 1
+75 3055 1
+75 3057 1
+75 3059 1
+75 3060 1
+75 3062 1
+75 3063 1
+75 3064 1
+75 3066 1
+75 3067 1
+75 3068 1
+75 3076 1
+75 3078 1
+75 3080 1
+75 3081 1
+75 3083 1
+75 3084 1
+75 3085 1
+75 3087 1
+75 3088 1
+75 3089 1
+75 3096 1
+75 3098 1
+75 3099 1
+75 3100 1
+75 3101 1
+75 3106 1
+75 3110 1
+75 3113 1
+75 3115 1
+75 3117 1
+75 3140 1
+75 3143 1
+75 3145 1
+75 3147 1
+75 3149 1
+75 3151 1
+75 3153 1
+75 3154 1
+75 3156 1
+75 3157 1
+75 3175 1
+75 3178 1
+75 3180 1
+75 3182 1
+75 3184 1
+75 3186 1
+75 3188 1
+75 3189 1
+75 3191 1
+75 3192 1
+75 3209 1
+75 3211 1
+75 3213 1
+75 3214 1
+75 3216 1
+75 3217 1
+75 3218 1
+75 3220 1
+75 3221 1
+75 3222 1
+75 3231 1
+75 3234 1
+75 3236 1
+75 3238 1
+75 3240 1
+75 3242 1
+75 3244 1
+75 3245 1
+75 3247 1
+75 3248 1
+75 3265 1
+75 3267 1
+75 3269 1
+75 3270 1
+75 3272 1
+75 3273 1
+75 3274 1
+75 3276 1
+75 3277 1
+75 3278 1
+75 3286 1
+75 3288 1
+75 3290 1
+75 3291 1
+75 3293 1
+75 3294 1
+75 3295 1
+75 3297 1
+75 3298 1
+75 3299 1
+75 3306 1
+75 3308 1
+75 3309 1
+75 3310 1
+75 3311 1
+75 3315 1
+75 3318 1
+75 3320 1
+75 3322 1
+75 3324 1
+75 3326 1
+75 3328 1
+75 3329 1
+75 3331 1
+75 3332 1
+75 3349 1
+75 3351 1
+75 3353 1
+75 3354 1
+75 3356 1
+75 3357 1
+75 3358 1
+75 3360 1
+75 3361 1
+75 3362 1
+75 3370 1
+75 3372 1
+75 3374 1
+75 3375 1
+75 3377 1
+75 3378 1
+75 3379 1
+75 3381 1
+75 3382 1
+75 3383 1
+75 3390 1
+75 3392 1
+75 3393 1
+75 3394 1
+75 3395 1
+75 3398 1
+75 3400 1
+75 3402 1
+75 3403 1
+75 3405 1
+75 3406 1
+75 3407 1
+75 3409 1
+75 3410 1
+75 3411 1
+75 3418 1
+75 3420 1
+75 3421 1
+75 3422 1
+75 3423 1
+75 3425 1
+75 3427 1
+75 3428 1
+75 3429 1
+75 3430 1
+75 3432 1
+76 21 1
+76 49 1
+76 70 1
+76 90 1
+76 94 1
+76 97 1
+76 99 1
+76 100 1
+76 133 1
+76 154 1
+76 174 1
+76 178 1
+76 181 1
+76 183 1
+76 184 1
+76 210 1
+76 230 1
+76 234 1
+76 237 1
+76 239 1
+76 240 1
+76 265 1
+76 269 1
+76 272 1
+76 274 1
+76 275 1
+76 299 1
+76 302 1
+76 304 1
+76 305 1
+76 308 1
+76 310 1
+76 311 1
+76 313 1
+76 314 1
+76 315 1
+76 343 1
+76 364 1
+76 384 1
+76 388 1
+76 391 1
+76 393 1
+76 394 1
+76 420 1
+76 440 1
+76 444 1
+76 447 1
+76 449 1
+76 450 1
+76 475 1
+76 479 1
+76 482 1
+76 484 1
+76 485 1
+76 509 1
+76 512 1
+76 514 1
+76 515 1
+76 518 1
+76 520 1
+76 521 1
+76 523 1
+76 524 1
+76 525 1
+76 546 1
+76 566 1
+76 570 1
+76 573 1
+76 575 1
+76 576 1
+76 601 1
+76 605 1
+76 608 1
+76 610 1
+76 611 1
+76 635 1
+76 638 1
+76 640 1
+76 641 1
+76 644 1
+76 646 1
+76 647 1
+76 649 1
+76 650 1
+76 651 1
+76 671 1
+76 675 1
+76 678 1
+76 680 1
+76 681 1
+76 705 1
+76 708 1
+76 710 1
+76 711 1
+76 714 1
+76 716 1
+76 717 1
+76 719 1
+76 720 1
+76 721 1
+76 740 1
+76 743 1
+76 745 1
+76 746 1
+76 749 1
+76 751 1
+76 752 1
+76 754 1
+76 755 1
+76 756 1
+76 774 1
+76 776 1
+76 777 1
+76 779 1
+76 780 1
+76 781 1
+76 783 1
+76 784 1
+76 785 1
+76 786 1
+76 805 1
+76 826 1
+76 846 1
+76 850 1
+76 853 1
+76 855 1
+76 856 1
+76 882 1
+76 902 1
+76 906 1
+76 909 1
+76 911 1
+76 912 1
+76 937 1
+76 941 1
+76 944 1
+76 946 1
+76 947 1
+76 971 1
+76 974 1
+76 976 1
+76 977 1
+76 980 1
+76 982 1
+76 983 1
+76 985 1
+76 986 1
+76 987 1
+76 1008 1
+76 1028 1
+76 1032 1
+76 1035 1
+76 1037 1
+76 1038 1
+76 1063 1
+76 1067 1
+76 1070 1
+76 1072 1
+76 1073 1
+76 1097 1
+76 1100 1
+76 1102 1
+76 1103 1
+76 1106 1
+76 1108 1
+76 1109 1
+76 1111 1
+76 1112 1
+76 1113 1
+76 1133 1
+76 1137 1
+76 1140 1
+76 1142 1
+76 1143 1
+76 1167 1
+76 1170 1
+76 1172 1
+76 1173 1
+76 1176 1
+76 1178 1
+76 1179 1
+76 1181 1
+76 1182 1
+76 1183 1
+76 1202 1
+76 1205 1
+76 1207 1
+76 1208 1
+76 1211 1
+76 1213 1
+76 1214 1
+76 1216 1
+76 1217 1
+76 1218 1
+76 1236 1
+76 1238 1
+76 1239 1
+76 1241 1
+76 1242 1
+76 1243 1
+76 1245 1
+76 1246 1
+76 1247 1
+76 1248 1
+76 1260 1
+76 1280 1
+76 1284 1
+76 1287 1
+76 1289 1
+76 1290 1
+76 1315 1
+76 1319 1
+76 1322 1
+76 1324 1
+76 1325 1
+76 1349 1
+76 1352 1
+76 1354 1
+76 1355 1
+76 1358 1
+76 1360 1
+76 1361 1
+76 1363 1
+76 1364 1
+76 1365 1
+76 1385 1
+76 1389 1
+76 1392 1
+76 1394 1
+76 1395 1
+76 1419 1
+76 1422 1
+76 1424 1
+76 1425 1
+76 1428 1
+76 1430 1
+76 1431 1
+76 1433 1
+76 1434 1
+76 1435 1
+76 1454 1
+76 1457 1
+76 1459 1
+76 1460 1
+76 1463 1
+76 1465 1
+76 1466 1
+76 1468 1
+76 1469 1
+76 1470 1
+76 1488 1
+76 1490 1
+76 1491 1
+76 1493 1
+76 1494 1
+76 1495 1
+76 1497 1
+76 1498 1
+76 1499 1
+76 1500 1
+76 1511 1
+76 1515 1
+76 1518 1
+76 1520 1
+76 1521 1
+76 1545 1
+76 1548 1
+76 1550 1
+76 1551 1
+76 1554 1
+76 1556 1
+76 1557 1
+76 1559 1
+76 1560 1
+76 1561 1
+76 1580 1
+76 1583 1
+76 1585 1
+76 1586 1
+76 1589 1
+76 1591 1
+76 1592 1
+76 1594 1
+76 1595 1
+76 1596 1
+76 1614 1
+76 1616 1
+76 1617 1
+76 1619 1
+76 1620 1
+76 1621 1
+76 1623 1
+76 1624 1
+76 1625 1
+76 1626 1
+76 1636 1
+76 1639 1
+76 1641 1
+76 1642 1
+76 1645 1
+76 1647 1
+76 1648 1
+76 1650 1
+76 1651 1
+76 1652 1
+76 1670 1
+76 1672 1
+76 1673 1
+76 1675 1
+76 1676 1
+76 1677 1
+76 1679 1
+76 1680 1
+76 1681 1
+76 1682 1
+76 1691 1
+76 1693 1
+76 1694 1
+76 1696 1
+76 1697 1
+76 1698 1
+76 1700 1
+76 1701 1
+76 1702 1
+76 1703 1
+76 1711 1
+76 1712 1
+76 1713 1
+76 1714 1
+76 1715 1
+76 1729 1
+76 1750 1
+76 1770 1
+76 1774 1
+76 1777 1
+76 1779 1
+76 1780 1
+76 1806 1
+76 1826 1
+76 1830 1
+76 1833 1
+76 1835 1
+76 1836 1
+76 1861 1
+76 1865 1
+76 1868 1
+76 1870 1
+76 1871 1
+76 1895 1
+76 1898 1
+76 1900 1
+76 1901 1
+76 1904 1
+76 1906 1
+76 1907 1
+76 1909 1
+76 1910 1
+76 1911 1
+76 1932 1
+76 1952 1
+76 1956 1
+76 1959 1
+76 1961 1
+76 1962 1
+76 1987 1
+76 1991 1
+76 1994 1
+76 1996 1
+76 1997 1
+76 2021 1
+76 2024 1
+76 2026 1
+76 2027 1
+76 2030 1
+76 2032 1
+76 2033 1
+76 2035 1
+76 2036 1
+76 2037 1
+76 2057 1
+76 2061 1
+76 2064 1
+76 2066 1
+76 2067 1
+76 2091 1
+76 2094 1
+76 2096 1
+76 2097 1
+76 2100 1
+76 2102 1
+76 2103 1
+76 2105 1
+76 2106 1
+76 2107 1
+76 2126 1
+76 2129 1
+76 2131 1
+76 2132 1
+76 2135 1
+76 2137 1
+76 2138 1
+76 2140 1
+76 2141 1
+76 2142 1
+76 2160 1
+76 2162 1
+76 2163 1
+76 2165 1
+76 2166 1
+76 2167 1
+76 2169 1
+76 2170 1
+76 2171 1
+76 2172 1
+76 2184 1
+76 2204 1
+76 2208 1
+76 2211 1
+76 2213 1
+76 2214 1
+76 2239 1
+76 2243 1
+76 2246 1
+76 2248 1
+76 2249 1
+76 2273 1
+76 2276 1
+76 2278 1
+76 2279 1
+76 2282 1
+76 2284 1
+76 2285 1
+76 2287 1
+76 2288 1
+76 2289 1
+76 2309 1
+76 2313 1
+76 2316 1
+76 2318 1
+76 2319 1
+76 2343 1
+76 2346 1
+76 2348 1
+76 2349 1
+76 2352 1
+76 2354 1
+76 2355 1
+76 2357 1
+76 2358 1
+76 2359 1
+76 2378 1
+76 2381 1
+76 2383 1
+76 2384 1
+76 2387 1
+76 2389 1
+76 2390 1
+76 2392 1
+76 2393 1
+76 2394 1
+76 2412 1
+76 2414 1
+76 2415 1
+76 2417 1
+76 2418 1
+76 2419 1
+76 2421 1
+76 2422 1
+76 2423 1
+76 2424 1
+76 2435 1
+76 2439 1
+76 2442 1
+76 2444 1
+76 2445 1
+76 2469 1
+76 2472 1
+76 2474 1
+76 2475 1
+76 2478 1
+76 2480 1
+76 2481 1
+76 2483 1
+76 2484 1
+76 2485 1
+76 2504 1
+76 2507 1
+76 2509 1
+76 2510 1
+76 2513 1
+76 2515 1
+76 2516 1
+76 2518 1
+76 2519 1
+76 2520 1
+76 2538 1
+76 2540 1
+76 2541 1
+76 2543 1
+76 2544 1
+76 2545 1
+76 2547 1
+76 2548 1
+76 2549 1
+76 2550 1
+76 2560 1
+76 2563 1
+76 2565 1
+76 2566 1
+76 2569 1
+76 2571 1
+76 2572 1
+76 2574 1
+76 2575 1
+76 2576 1
+76 2594 1
+76 2596 1
+76 2597 1
+76 2599 1
+76 2600 1
+76 2601 1
+76 2603 1
+76 2604 1
+76 2605 1
+76 2606 1
+76 2615 1
+76 2617 1
+76 2618 1
+76 2620 1
+76 2621 1
+76 2622 1
+76 2624 1
+76 2625 1
+76 2626 1
+76 2627 1
+76 2635 1
+76 2636 1
+76 2637 1
+76 2638 1
+76 2639 1
+76 2646 1
+76 2666 1
+76 2670 1
+76 2673 1
+76 2675 1
+76 2676 1
+76 2701 1
+76 2705 1
+76 2708 1
+76 2710 1
+76 2711 1
+76 2735 1
+76 2738 1
+76 2740 1
+76 2741 1
+76 2744 1
+76 2746 1
+76 2747 1
+76 2749 1
+76 2750 1
+76 2751 1
+76 2771 1
+76 2775 1
+76 2778 1
+76 2780 1
+76 2781 1
+76 2805 1
+76 2808 1
+76 2810 1
+76 2811 1
+76 2814 1
+76 2816 1
+76 2817 1
+76 2819 1
+76 2820 1
+76 2821 1
+76 2840 1
+76 2843 1
+76 2845 1
+76 2846 1
+76 2849 1
+76 2851 1
+76 2852 1
+76 2854 1
+76 2855 1
+76 2856 1
+76 2874 1
+76 2876 1
+76 2877 1
+76 2879 1
+76 2880 1
+76 2881 1
+76 2883 1
+76 2884 1
+76 2885 1
+76 2886 1
+76 2897 1
+76 2901 1
+76 2904 1
+76 2906 1
+76 2907 1
+76 2931 1
+76 2934 1
+76 2936 1
+76 2937 1
+76 2940 1
+76 2942 1
+76 2943 1
+76 2945 1
+76 2946 1
+76 2947 1
+76 2966 1
+76 2969 1
+76 2971 1
+76 2972 1
+76 2975 1
+76 2977 1
+76 2978 1
+76 2980 1
+76 2981 1
+76 2982 1
+76 3000 1
+76 3002 1
+76 3003 1
+76 3005 1
+76 3006 1
+76 3007 1
+76 3009 1
+76 3010 1
+76 3011 1
+76 3012 1
+76 3022 1
+76 3025 1
+76 3027 1
+76 3028 1
+76 3031 1
+76 3033 1
+76 3034 1
+76 3036 1
+76 3037 1
+76 3038 1
+76 3056 1
+76 3058 1
+76 3059 1
+76 3061 1
+76 3062 1
+76 3063 1
+76 3065 1
+76 3066 1
+76 3067 1
+76 3068 1
+76 3077 1
+76 3079 1
+76 3080 1
+76 3082 1
+76 3083 1
+76 3084 1
+76 3086 1
+76 3087 1
+76 3088 1
+76 3089 1
+76 3097 1
+76 3098 1
+76 3099 1
+76 3100 1
+76 3101 1
+76 3107 1
+76 3111 1
+76 3114 1
+76 3116 1
+76 3117 1
+76 3141 1
+76 3144 1
+76 3146 1
+76 3147 1
+76 3150 1
+76 3152 1
+76 3153 1
+76 3155 1
+76 3156 1
+76 3157 1
+76 3176 1
+76 3179 1
+76 3181 1
+76 3182 1
+76 3185 1
+76 3187 1
+76 3188 1
+76 3190 1
+76 3191 1
+76 3192 1
+76 3210 1
+76 3212 1
+76 3213 1
+76 3215 1
+76 3216 1
+76 3217 1
+76 3219 1
+76 3220 1
+76 3221 1
+76 3222 1
+76 3232 1
+76 3235 1
+76 3237 1
+76 3238 1
+76 3241 1
+76 3243 1
+76 3244 1
+76 3246 1
+76 3247 1
+76 3248 1
+76 3266 1
+76 3268 1
+76 3269 1
+76 3271 1
+76 3272 1
+76 3273 1
+76 3275 1
+76 3276 1
+76 3277 1
+76 3278 1
+76 3287 1
+76 3289 1
+76 3290 1
+76 3292 1
+76 3293 1
+76 3294 1
+76 3296 1
+76 3297 1
+76 3298 1
+76 3299 1
+76 3307 1
+76 3308 1
+76 3309 1
+76 3310 1
+76 3311 1
+76 3316 1
+76 3319 1
+76 3321 1
+76 3322 1
+76 3325 1
+76 3327 1
+76 3328 1
+76 3330 1
+76 3331 1
+76 3332 1
+76 3350 1
+76 3352 1
+76 3353 1
+76 3355 1
+76 3356 1
+76 3357 1
+76 3359 1
+76 3360 1
+76 3361 1
+76 3362 1
+76 3371 1
+76 3373 1
+76 3374 1
+76 3376 1
+76 3377 1
+76 3378 1
+76 3380 1
+76 3381 1
+76 3382 1
+76 3383 1
+76 3391 1
+76 3392 1
+76 3393 1
+76 3394 1
+76 3395 1
+76 3399 1
+76 3401 1
+76 3402 1
+76 3404 1
+76 3405 1
+76 3406 1
+76 3408 1
+76 3409 1
+76 3410 1
+76 3411 1
+76 3419 1
+76 3420 1
+76 3421 1
+76 3422 1
+76 3423 1
+76 3426 1
+76 3427 1
+76 3428 1
+76 3429 1
+76 3430 1
+76 3432 1
+77 22 1
+77 50 1
+77 71 1
+77 86 1
+77 101 1
+77 102 1
+77 103 1
+77 104 1
+77 134 1
+77 155 1
+77 170 1
+77 185 1
+77 186 1
+77 187 1
+77 188 1
+77 211 1
+77 226 1
+77 241 1
+77 242 1
+77 243 1
+77 244 1
+77 261 1
+77 276 1
+77 277 1
+77 278 1
+77 279 1
+77 296 1
+77 297 1
+77 298 1
+77 299 1
+77 316 1
+77 317 1
+77 318 1
+77 319 1
+77 320 1
+77 321 1
+77 344 1
+77 365 1
+77 380 1
+77 395 1
+77 396 1
+77 397 1
+77 398 1
+77 421 1
+77 436 1
+77 451 1
+77 452 1
+77 453 1
+77 454 1
+77 471 1
+77 486 1
+77 487 1
+77 488 1
+77 489 1
+77 506 1
+77 507 1
+77 508 1
+77 509 1
+77 526 1
+77 527 1
+77 528 1
+77 529 1
+77 530 1
+77 531 1
+77 547 1
+77 562 1
+77 577 1
+77 578 1
+77 579 1
+77 580 1
+77 597 1
+77 612 1
+77 613 1
+77 614 1
+77 615 1
+77 632 1
+77 633 1
+77 634 1
+77 635 1
+77 652 1
+77 653 1
+77 654 1
+77 655 1
+77 656 1
+77 657 1
+77 667 1
+77 682 1
+77 683 1
+77 684 1
+77 685 1
+77 702 1
+77 703 1
+77 704 1
+77 705 1
+77 722 1
+77 723 1
+77 724 1
+77 725 1
+77 726 1
+77 727 1
+77 737 1
+77 738 1
+77 739 1
+77 740 1
+77 757 1
+77 758 1
+77 759 1
+77 760 1
+77 761 1
+77 762 1
+77 772 1
+77 773 1
+77 774 1
+77 775 1
+77 776 1
+77 777 1
+77 787 1
+77 788 1
+77 789 1
+77 790 1
+77 806 1
+77 827 1
+77 842 1
+77 857 1
+77 858 1
+77 859 1
+77 860 1
+77 883 1
+77 898 1
+77 913 1
+77 914 1
+77 915 1
+77 916 1
+77 933 1
+77 948 1
+77 949 1
+77 950 1
+77 951 1
+77 968 1
+77 969 1
+77 970 1
+77 971 1
+77 988 1
+77 989 1
+77 990 1
+77 991 1
+77 992 1
+77 993 1
+77 1009 1
+77 1024 1
+77 1039 1
+77 1040 1
+77 1041 1
+77 1042 1
+77 1059 1
+77 1074 1
+77 1075 1
+77 1076 1
+77 1077 1
+77 1094 1
+77 1095 1
+77 1096 1
+77 1097 1
+77 1114 1
+77 1115 1
+77 1116 1
+77 1117 1
+77 1118 1
+77 1119 1
+77 1129 1
+77 1144 1
+77 1145 1
+77 1146 1
+77 1147 1
+77 1164 1
+77 1165 1
+77 1166 1
+77 1167 1
+77 1184 1
+77 1185 1
+77 1186 1
+77 1187 1
+77 1188 1
+77 1189 1
+77 1199 1
+77 1200 1
+77 1201 1
+77 1202 1
+77 1219 1
+77 1220 1
+77 1221 1
+77 1222 1
+77 1223 1
+77 1224 1
+77 1234 1
+77 1235 1
+77 1236 1
+77 1237 1
+77 1238 1
+77 1239 1
+77 1249 1
+77 1250 1
+77 1251 1
+77 1252 1
+77 1261 1
+77 1276 1
+77 1291 1
+77 1292 1
+77 1293 1
+77 1294 1
+77 1311 1
+77 1326 1
+77 1327 1
+77 1328 1
+77 1329 1
+77 1346 1
+77 1347 1
+77 1348 1
+77 1349 1
+77 1366 1
+77 1367 1
+77 1368 1
+77 1369 1
+77 1370 1
+77 1371 1
+77 1381 1
+77 1396 1
+77 1397 1
+77 1398 1
+77 1399 1
+77 1416 1
+77 1417 1
+77 1418 1
+77 1419 1
+77 1436 1
+77 1437 1
+77 1438 1
+77 1439 1
+77 1440 1
+77 1441 1
+77 1451 1
+77 1452 1
+77 1453 1
+77 1454 1
+77 1471 1
+77 1472 1
+77 1473 1
+77 1474 1
+77 1475 1
+77 1476 1
+77 1486 1
+77 1487 1
+77 1488 1
+77 1489 1
+77 1490 1
+77 1491 1
+77 1501 1
+77 1502 1
+77 1503 1
+77 1504 1
+77 1507 1
+77 1522 1
+77 1523 1
+77 1524 1
+77 1525 1
+77 1542 1
+77 1543 1
+77 1544 1
+77 1545 1
+77 1562 1
+77 1563 1
+77 1564 1
+77 1565 1
+77 1566 1
+77 1567 1
+77 1577 1
+77 1578 1
+77 1579 1
+77 1580 1
+77 1597 1
+77 1598 1
+77 1599 1
+77 1600 1
+77 1601 1
+77 1602 1
+77 1612 1
+77 1613 1
+77 1614 1
+77 1615 1
+77 1616 1
+77 1617 1
+77 1627 1
+77 1628 1
+77 1629 1
+77 1630 1
+77 1633 1
+77 1634 1
+77 1635 1
+77 1636 1
+77 1653 1
+77 1654 1
+77 1655 1
+77 1656 1
+77 1657 1
+77 1658 1
+77 1668 1
+77 1669 1
+77 1670 1
+77 1671 1
+77 1672 1
+77 1673 1
+77 1683 1
+77 1684 1
+77 1685 1
+77 1686 1
+77 1689 1
+77 1690 1
+77 1691 1
+77 1692 1
+77 1693 1
+77 1694 1
+77 1704 1
+77 1705 1
+77 1706 1
+77 1707 1
+77 1710 1
+77 1711 1
+77 1712 1
+77 1713 1
+77 1716 1
+77 1730 1
+77 1751 1
+77 1766 1
+77 1781 1
+77 1782 1
+77 1783 1
+77 1784 1
+77 1807 1
+77 1822 1
+77 1837 1
+77 1838 1
+77 1839 1
+77 1840 1
+77 1857 1
+77 1872 1
+77 1873 1
+77 1874 1
+77 1875 1
+77 1892 1
+77 1893 1
+77 1894 1
+77 1895 1
+77 1912 1
+77 1913 1
+77 1914 1
+77 1915 1
+77 1916 1
+77 1917 1
+77 1933 1
+77 1948 1
+77 1963 1
+77 1964 1
+77 1965 1
+77 1966 1
+77 1983 1
+77 1998 1
+77 1999 1
+77 2000 1
+77 2001 1
+77 2018 1
+77 2019 1
+77 2020 1
+77 2021 1
+77 2038 1
+77 2039 1
+77 2040 1
+77 2041 1
+77 2042 1
+77 2043 1
+77 2053 1
+77 2068 1
+77 2069 1
+77 2070 1
+77 2071 1
+77 2088 1
+77 2089 1
+77 2090 1
+77 2091 1
+77 2108 1
+77 2109 1
+77 2110 1
+77 2111 1
+77 2112 1
+77 2113 1
+77 2123 1
+77 2124 1
+77 2125 1
+77 2126 1
+77 2143 1
+77 2144 1
+77 2145 1
+77 2146 1
+77 2147 1
+77 2148 1
+77 2158 1
+77 2159 1
+77 2160 1
+77 2161 1
+77 2162 1
+77 2163 1
+77 2173 1
+77 2174 1
+77 2175 1
+77 2176 1
+77 2185 1
+77 2200 1
+77 2215 1
+77 2216 1
+77 2217 1
+77 2218 1
+77 2235 1
+77 2250 1
+77 2251 1
+77 2252 1
+77 2253 1
+77 2270 1
+77 2271 1
+77 2272 1
+77 2273 1
+77 2290 1
+77 2291 1
+77 2292 1
+77 2293 1
+77 2294 1
+77 2295 1
+77 2305 1
+77 2320 1
+77 2321 1
+77 2322 1
+77 2323 1
+77 2340 1
+77 2341 1
+77 2342 1
+77 2343 1
+77 2360 1
+77 2361 1
+77 2362 1
+77 2363 1
+77 2364 1
+77 2365 1
+77 2375 1
+77 2376 1
+77 2377 1
+77 2378 1
+77 2395 1
+77 2396 1
+77 2397 1
+77 2398 1
+77 2399 1
+77 2400 1
+77 2410 1
+77 2411 1
+77 2412 1
+77 2413 1
+77 2414 1
+77 2415 1
+77 2425 1
+77 2426 1
+77 2427 1
+77 2428 1
+77 2431 1
+77 2446 1
+77 2447 1
+77 2448 1
+77 2449 1
+77 2466 1
+77 2467 1
+77 2468 1
+77 2469 1
+77 2486 1
+77 2487 1
+77 2488 1
+77 2489 1
+77 2490 1
+77 2491 1
+77 2501 1
+77 2502 1
+77 2503 1
+77 2504 1
+77 2521 1
+77 2522 1
+77 2523 1
+77 2524 1
+77 2525 1
+77 2526 1
+77 2536 1
+77 2537 1
+77 2538 1
+77 2539 1
+77 2540 1
+77 2541 1
+77 2551 1
+77 2552 1
+77 2553 1
+77 2554 1
+77 2557 1
+77 2558 1
+77 2559 1
+77 2560 1
+77 2577 1
+77 2578 1
+77 2579 1
+77 2580 1
+77 2581 1
+77 2582 1
+77 2592 1
+77 2593 1
+77 2594 1
+77 2595 1
+77 2596 1
+77 2597 1
+77 2607 1
+77 2608 1
+77 2609 1
+77 2610 1
+77 2613 1
+77 2614 1
+77 2615 1
+77 2616 1
+77 2617 1
+77 2618 1
+77 2628 1
+77 2629 1
+77 2630 1
+77 2631 1
+77 2634 1
+77 2635 1
+77 2636 1
+77 2637 1
+77 2640 1
+77 2647 1
+77 2662 1
+77 2677 1
+77 2678 1
+77 2679 1
+77 2680 1
+77 2697 1
+77 2712 1
+77 2713 1
+77 2714 1
+77 2715 1
+77 2732 1
+77 2733 1
+77 2734 1
+77 2735 1
+77 2752 1
+77 2753 1
+77 2754 1
+77 2755 1
+77 2756 1
+77 2757 1
+77 2767 1
+77 2782 1
+77 2783 1
+77 2784 1
+77 2785 1
+77 2802 1
+77 2803 1
+77 2804 1
+77 2805 1
+77 2822 1
+77 2823 1
+77 2824 1
+77 2825 1
+77 2826 1
+77 2827 1
+77 2837 1
+77 2838 1
+77 2839 1
+77 2840 1
+77 2857 1
+77 2858 1
+77 2859 1
+77 2860 1
+77 2861 1
+77 2862 1
+77 2872 1
+77 2873 1
+77 2874 1
+77 2875 1
+77 2876 1
+77 2877 1
+77 2887 1
+77 2888 1
+77 2889 1
+77 2890 1
+77 2893 1
+77 2908 1
+77 2909 1
+77 2910 1
+77 2911 1
+77 2928 1
+77 2929 1
+77 2930 1
+77 2931 1
+77 2948 1
+77 2949 1
+77 2950 1
+77 2951 1
+77 2952 1
+77 2953 1
+77 2963 1
+77 2964 1
+77 2965 1
+77 2966 1
+77 2983 1
+77 2984 1
+77 2985 1
+77 2986 1
+77 2987 1
+77 2988 1
+77 2998 1
+77 2999 1
+77 3000 1
+77 3001 1
+77 3002 1
+77 3003 1
+77 3013 1
+77 3014 1
+77 3015 1
+77 3016 1
+77 3019 1
+77 3020 1
+77 3021 1
+77 3022 1
+77 3039 1
+77 3040 1
+77 3041 1
+77 3042 1
+77 3043 1
+77 3044 1
+77 3054 1
+77 3055 1
+77 3056 1
+77 3057 1
+77 3058 1
+77 3059 1
+77 3069 1
+77 3070 1
+77 3071 1
+77 3072 1
+77 3075 1
+77 3076 1
+77 3077 1
+77 3078 1
+77 3079 1
+77 3080 1
+77 3090 1
+77 3091 1
+77 3092 1
+77 3093 1
+77 3096 1
+77 3097 1
+77 3098 1
+77 3099 1
+77 3102 1
+77 3103 1
+77 3118 1
+77 3119 1
+77 3120 1
+77 3121 1
+77 3138 1
+77 3139 1
+77 3140 1
+77 3141 1
+77 3158 1
+77 3159 1
+77 3160 1
+77 3161 1
+77 3162 1
+77 3163 1
+77 3173 1
+77 3174 1
+77 3175 1
+77 3176 1
+77 3193 1
+77 3194 1
+77 3195 1
+77 3196 1
+77 3197 1
+77 3198 1
+77 3208 1
+77 3209 1
+77 3210 1
+77 3211 1
+77 3212 1
+77 3213 1
+77 3223 1
+77 3224 1
+77 3225 1
+77 3226 1
+77 3229 1
+77 3230 1
+77 3231 1
+77 3232 1
+77 3249 1
+77 3250 1
+77 3251 1
+77 3252 1
+77 3253 1
+77 3254 1
+77 3264 1
+77 3265 1
+77 3266 1
+77 3267 1
+77 3268 1
+77 3269 1
+77 3279 1
+77 3280 1
+77 3281 1
+77 3282 1
+77 3285 1
+77 3286 1
+77 3287 1
+77 3288 1
+77 3289 1
+77 3290 1
+77 3300 1
+77 3301 1
+77 3302 1
+77 3303 1
+77 3306 1
+77 3307 1
+77 3308 1
+77 3309 1
+77 3312 1
+77 3313 1
+77 3314 1
+77 3315 1
+77 3316 1
+77 3333 1
+77 3334 1
+77 3335 1
+77 3336 1
+77 3337 1
+77 3338 1
+77 3348 1
+77 3349 1
+77 3350 1
+77 3351 1
+77 3352 1
+77 3353 1
+77 3363 1
+77 3364 1
+77 3365 1
+77 3366 1
+77 3369 1
+77 3370 1
+77 3371 1
+77 3372 1
+77 3373 1
+77 3374 1
+77 3384 1
+77 3385 1
+77 3386 1
+77 3387 1
+77 3390 1
+77 3391 1
+77 3392 1
+77 3393 1
+77 3396 1
+77 3397 1
+77 3398 1
+77 3399 1
+77 3400 1
+77 3401 1
+77 3402 1
+77 3412 1
+77 3413 1
+77 3414 1
+77 3415 1
+77 3418 1
+77 3419 1
+77 3420 1
+77 3421 1
+77 3424 1
+77 3425 1
+77 3426 1
+77 3427 1
+77 3428 1
+77 3431 1
+77 3432 1
+78 23 1
+78 51 1
+78 72 1
+78 87 1
+78 101 1
+78 105 1
+78 106 1
+78 107 1
+78 135 1
+78 156 1
+78 171 1
+78 185 1
+78 189 1
+78 190 1
+78 191 1
+78 212 1
+78 227 1
+78 241 1
+78 245 1
+78 246 1
+78 247 1
+78 262 1
+78 276 1
+78 280 1
+78 281 1
+78 282 1
+78 296 1
+78 300 1
+78 301 1
+78 302 1
+78 316 1
+78 317 1
+78 318 1
+78 322 1
+78 323 1
+78 324 1
+78 345 1
+78 366 1
+78 381 1
+78 395 1
+78 399 1
+78 400 1
+78 401 1
+78 422 1
+78 437 1
+78 451 1
+78 455 1
+78 456 1
+78 457 1
+78 472 1
+78 486 1
+78 490 1
+78 491 1
+78 492 1
+78 506 1
+78 510 1
+78 511 1
+78 512 1
+78 526 1
+78 527 1
+78 528 1
+78 532 1
+78 533 1
+78 534 1
+78 548 1
+78 563 1
+78 577 1
+78 581 1
+78 582 1
+78 583 1
+78 598 1
+78 612 1
+78 616 1
+78 617 1
+78 618 1
+78 632 1
+78 636 1
+78 637 1
+78 638 1
+78 652 1
+78 653 1
+78 654 1
+78 658 1
+78 659 1
+78 660 1
+78 668 1
+78 682 1
+78 686 1
+78 687 1
+78 688 1
+78 702 1
+78 706 1
+78 707 1
+78 708 1
+78 722 1
+78 723 1
+78 724 1
+78 728 1
+78 729 1
+78 730 1
+78 737 1
+78 741 1
+78 742 1
+78 743 1
+78 757 1
+78 758 1
+78 759 1
+78 763 1
+78 764 1
+78 765 1
+78 772 1
+78 773 1
+78 774 1
+78 778 1
+78 779 1
+78 780 1
+78 787 1
+78 788 1
+78 789 1
+78 791 1
+78 807 1
+78 828 1
+78 843 1
+78 857 1
+78 861 1
+78 862 1
+78 863 1
+78 884 1
+78 899 1
+78 913 1
+78 917 1
+78 918 1
+78 919 1
+78 934 1
+78 948 1
+78 952 1
+78 953 1
+78 954 1
+78 968 1
+78 972 1
+78 973 1
+78 974 1
+78 988 1
+78 989 1
+78 990 1
+78 994 1
+78 995 1
+78 996 1
+78 1010 1
+78 1025 1
+78 1039 1
+78 1043 1
+78 1044 1
+78 1045 1
+78 1060 1
+78 1074 1
+78 1078 1
+78 1079 1
+78 1080 1
+78 1094 1
+78 1098 1
+78 1099 1
+78 1100 1
+78 1114 1
+78 1115 1
+78 1116 1
+78 1120 1
+78 1121 1
+78 1122 1
+78 1130 1
+78 1144 1
+78 1148 1
+78 1149 1
+78 1150 1
+78 1164 1
+78 1168 1
+78 1169 1
+78 1170 1
+78 1184 1
+78 1185 1
+78 1186 1
+78 1190 1
+78 1191 1
+78 1192 1
+78 1199 1
+78 1203 1
+78 1204 1
+78 1205 1
+78 1219 1
+78 1220 1
+78 1221 1
+78 1225 1
+78 1226 1
+78 1227 1
+78 1234 1
+78 1235 1
+78 1236 1
+78 1240 1
+78 1241 1
+78 1242 1
+78 1249 1
+78 1250 1
+78 1251 1
+78 1253 1
+78 1262 1
+78 1277 1
+78 1291 1
+78 1295 1
+78 1296 1
+78 1297 1
+78 1312 1
+78 1326 1
+78 1330 1
+78 1331 1
+78 1332 1
+78 1346 1
+78 1350 1
+78 1351 1
+78 1352 1
+78 1366 1
+78 1367 1
+78 1368 1
+78 1372 1
+78 1373 1
+78 1374 1
+78 1382 1
+78 1396 1
+78 1400 1
+78 1401 1
+78 1402 1
+78 1416 1
+78 1420 1
+78 1421 1
+78 1422 1
+78 1436 1
+78 1437 1
+78 1438 1
+78 1442 1
+78 1443 1
+78 1444 1
+78 1451 1
+78 1455 1
+78 1456 1
+78 1457 1
+78 1471 1
+78 1472 1
+78 1473 1
+78 1477 1
+78 1478 1
+78 1479 1
+78 1486 1
+78 1487 1
+78 1488 1
+78 1492 1
+78 1493 1
+78 1494 1
+78 1501 1
+78 1502 1
+78 1503 1
+78 1505 1
+78 1508 1
+78 1522 1
+78 1526 1
+78 1527 1
+78 1528 1
+78 1542 1
+78 1546 1
+78 1547 1
+78 1548 1
+78 1562 1
+78 1563 1
+78 1564 1
+78 1568 1
+78 1569 1
+78 1570 1
+78 1577 1
+78 1581 1
+78 1582 1
+78 1583 1
+78 1597 1
+78 1598 1
+78 1599 1
+78 1603 1
+78 1604 1
+78 1605 1
+78 1612 1
+78 1613 1
+78 1614 1
+78 1618 1
+78 1619 1
+78 1620 1
+78 1627 1
+78 1628 1
+78 1629 1
+78 1631 1
+78 1633 1
+78 1637 1
+78 1638 1
+78 1639 1
+78 1653 1
+78 1654 1
+78 1655 1
+78 1659 1
+78 1660 1
+78 1661 1
+78 1668 1
+78 1669 1
+78 1670 1
+78 1674 1
+78 1675 1
+78 1676 1
+78 1683 1
+78 1684 1
+78 1685 1
+78 1687 1
+78 1689 1
+78 1690 1
+78 1691 1
+78 1695 1
+78 1696 1
+78 1697 1
+78 1704 1
+78 1705 1
+78 1706 1
+78 1708 1
+78 1710 1
+78 1711 1
+78 1712 1
+78 1714 1
+78 1716 1
+78 1731 1
+78 1752 1
+78 1767 1
+78 1781 1
+78 1785 1
+78 1786 1
+78 1787 1
+78 1808 1
+78 1823 1
+78 1837 1
+78 1841 1
+78 1842 1
+78 1843 1
+78 1858 1
+78 1872 1
+78 1876 1
+78 1877 1
+78 1878 1
+78 1892 1
+78 1896 1
+78 1897 1
+78 1898 1
+78 1912 1
+78 1913 1
+78 1914 1
+78 1918 1
+78 1919 1
+78 1920 1
+78 1934 1
+78 1949 1
+78 1963 1
+78 1967 1
+78 1968 1
+78 1969 1
+78 1984 1
+78 1998 1
+78 2002 1
+78 2003 1
+78 2004 1
+78 2018 1
+78 2022 1
+78 2023 1
+78 2024 1
+78 2038 1
+78 2039 1
+78 2040 1
+78 2044 1
+78 2045 1
+78 2046 1
+78 2054 1
+78 2068 1
+78 2072 1
+78 2073 1
+78 2074 1
+78 2088 1
+78 2092 1
+78 2093 1
+78 2094 1
+78 2108 1
+78 2109 1
+78 2110 1
+78 2114 1
+78 2115 1
+78 2116 1
+78 2123 1
+78 2127 1
+78 2128 1
+78 2129 1
+78 2143 1
+78 2144 1
+78 2145 1
+78 2149 1
+78 2150 1
+78 2151 1
+78 2158 1
+78 2159 1
+78 2160 1
+78 2164 1
+78 2165 1
+78 2166 1
+78 2173 1
+78 2174 1
+78 2175 1
+78 2177 1
+78 2186 1
+78 2201 1
+78 2215 1
+78 2219 1
+78 2220 1
+78 2221 1
+78 2236 1
+78 2250 1
+78 2254 1
+78 2255 1
+78 2256 1
+78 2270 1
+78 2274 1
+78 2275 1
+78 2276 1
+78 2290 1
+78 2291 1
+78 2292 1
+78 2296 1
+78 2297 1
+78 2298 1
+78 2306 1
+78 2320 1
+78 2324 1
+78 2325 1
+78 2326 1
+78 2340 1
+78 2344 1
+78 2345 1
+78 2346 1
+78 2360 1
+78 2361 1
+78 2362 1
+78 2366 1
+78 2367 1
+78 2368 1
+78 2375 1
+78 2379 1
+78 2380 1
+78 2381 1
+78 2395 1
+78 2396 1
+78 2397 1
+78 2401 1
+78 2402 1
+78 2403 1
+78 2410 1
+78 2411 1
+78 2412 1
+78 2416 1
+78 2417 1
+78 2418 1
+78 2425 1
+78 2426 1
+78 2427 1
+78 2429 1
+78 2432 1
+78 2446 1
+78 2450 1
+78 2451 1
+78 2452 1
+78 2466 1
+78 2470 1
+78 2471 1
+78 2472 1
+78 2486 1
+78 2487 1
+78 2488 1
+78 2492 1
+78 2493 1
+78 2494 1
+78 2501 1
+78 2505 1
+78 2506 1
+78 2507 1
+78 2521 1
+78 2522 1
+78 2523 1
+78 2527 1
+78 2528 1
+78 2529 1
+78 2536 1
+78 2537 1
+78 2538 1
+78 2542 1
+78 2543 1
+78 2544 1
+78 2551 1
+78 2552 1
+78 2553 1
+78 2555 1
+78 2557 1
+78 2561 1
+78 2562 1
+78 2563 1
+78 2577 1
+78 2578 1
+78 2579 1
+78 2583 1
+78 2584 1
+78 2585 1
+78 2592 1
+78 2593 1
+78 2594 1
+78 2598 1
+78 2599 1
+78 2600 1
+78 2607 1
+78 2608 1
+78 2609 1
+78 2611 1
+78 2613 1
+78 2614 1
+78 2615 1
+78 2619 1
+78 2620 1
+78 2621 1
+78 2628 1
+78 2629 1
+78 2630 1
+78 2632 1
+78 2634 1
+78 2635 1
+78 2636 1
+78 2638 1
+78 2640 1
+78 2648 1
+78 2663 1
+78 2677 1
+78 2681 1
+78 2682 1
+78 2683 1
+78 2698 1
+78 2712 1
+78 2716 1
+78 2717 1
+78 2718 1
+78 2732 1
+78 2736 1
+78 2737 1
+78 2738 1
+78 2752 1
+78 2753 1
+78 2754 1
+78 2758 1
+78 2759 1
+78 2760 1
+78 2768 1
+78 2782 1
+78 2786 1
+78 2787 1
+78 2788 1
+78 2802 1
+78 2806 1
+78 2807 1
+78 2808 1
+78 2822 1
+78 2823 1
+78 2824 1
+78 2828 1
+78 2829 1
+78 2830 1
+78 2837 1
+78 2841 1
+78 2842 1
+78 2843 1
+78 2857 1
+78 2858 1
+78 2859 1
+78 2863 1
+78 2864 1
+78 2865 1
+78 2872 1
+78 2873 1
+78 2874 1
+78 2878 1
+78 2879 1
+78 2880 1
+78 2887 1
+78 2888 1
+78 2889 1
+78 2891 1
+78 2894 1
+78 2908 1
+78 2912 1
+78 2913 1
+78 2914 1
+78 2928 1
+78 2932 1
+78 2933 1
+78 2934 1
+78 2948 1
+78 2949 1
+78 2950 1
+78 2954 1
+78 2955 1
+78 2956 1
+78 2963 1
+78 2967 1
+78 2968 1
+78 2969 1
+78 2983 1
+78 2984 1
+78 2985 1
+78 2989 1
+78 2990 1
+78 2991 1
+78 2998 1
+78 2999 1
+78 3000 1
+78 3004 1
+78 3005 1
+78 3006 1
+78 3013 1
+78 3014 1
+78 3015 1
+78 3017 1
+78 3019 1
+78 3023 1
+78 3024 1
+78 3025 1
+78 3039 1
+78 3040 1
+78 3041 1
+78 3045 1
+78 3046 1
+78 3047 1
+78 3054 1
+78 3055 1
+78 3056 1
+78 3060 1
+78 3061 1
+78 3062 1
+78 3069 1
+78 3070 1
+78 3071 1
+78 3073 1
+78 3075 1
+78 3076 1
+78 3077 1
+78 3081 1
+78 3082 1
+78 3083 1
+78 3090 1
+78 3091 1
+78 3092 1
+78 3094 1
+78 3096 1
+78 3097 1
+78 3098 1
+78 3100 1
+78 3102 1
+78 3104 1
+78 3118 1
+78 3122 1
+78 3123 1
+78 3124 1
+78 3138 1
+78 3142 1
+78 3143 1
+78 3144 1
+78 3158 1
+78 3159 1
+78 3160 1
+78 3164 1
+78 3165 1
+78 3166 1
+78 3173 1
+78 3177 1
+78 3178 1
+78 3179 1
+78 3193 1
+78 3194 1
+78 3195 1
+78 3199 1
+78 3200 1
+78 3201 1
+78 3208 1
+78 3209 1
+78 3210 1
+78 3214 1
+78 3215 1
+78 3216 1
+78 3223 1
+78 3224 1
+78 3225 1
+78 3227 1
+78 3229 1
+78 3233 1
+78 3234 1
+78 3235 1
+78 3249 1
+78 3250 1
+78 3251 1
+78 3255 1
+78 3256 1
+78 3257 1
+78 3264 1
+78 3265 1
+78 3266 1
+78 3270 1
+78 3271 1
+78 3272 1
+78 3279 1
+78 3280 1
+78 3281 1
+78 3283 1
+78 3285 1
+78 3286 1
+78 3287 1
+78 3291 1
+78 3292 1
+78 3293 1
+78 3300 1
+78 3301 1
+78 3302 1
+78 3304 1
+78 3306 1
+78 3307 1
+78 3308 1
+78 3310 1
+78 3312 1
+78 3313 1
+78 3317 1
+78 3318 1
+78 3319 1
+78 3333 1
+78 3334 1
+78 3335 1
+78 3339 1
+78 3340 1
+78 3341 1
+78 3348 1
+78 3349 1
+78 3350 1
+78 3354 1
+78 3355 1
+78 3356 1
+78 3363 1
+78 3364 1
+78 3365 1
+78 3367 1
+78 3369 1
+78 3370 1
+78 3371 1
+78 3375 1
+78 3376 1
+78 3377 1
+78 3384 1
+78 3385 1
+78 3386 1
+78 3388 1
+78 3390 1
+78 3391 1
+78 3392 1
+78 3394 1
+78 3396 1
+78 3397 1
+78 3398 1
+78 3399 1
+78 3403 1
+78 3404 1
+78 3405 1
+78 3412 1
+78 3413 1
+78 3414 1
+78 3416 1
+78 3418 1
+78 3419 1
+78 3420 1
+78 3422 1
+78 3424 1
+78 3425 1
+78 3426 1
+78 3427 1
+78 3429 1
+78 3431 1
+78 3432 1
+79 24 1
+79 52 1
+79 73 1
+79 88 1
+79 102 1
+79 105 1
+79 108 1
+79 109 1
+79 136 1
+79 157 1
+79 172 1
+79 186 1
+79 189 1
+79 192 1
+79 193 1
+79 213 1
+79 228 1
+79 242 1
+79 245 1
+79 248 1
+79 249 1
+79 263 1
+79 277 1
+79 280 1
+79 283 1
+79 284 1
+79 297 1
+79 300 1
+79 303 1
+79 304 1
+79 316 1
+79 319 1
+79 320 1
+79 322 1
+79 323 1
+79 325 1
+79 346 1
+79 367 1
+79 382 1
+79 396 1
+79 399 1
+79 402 1
+79 403 1
+79 423 1
+79 438 1
+79 452 1
+79 455 1
+79 458 1
+79 459 1
+79 473 1
+79 487 1
+79 490 1
+79 493 1
+79 494 1
+79 507 1
+79 510 1
+79 513 1
+79 514 1
+79 526 1
+79 529 1
+79 530 1
+79 532 1
+79 533 1
+79 535 1
+79 549 1
+79 564 1
+79 578 1
+79 581 1
+79 584 1
+79 585 1
+79 599 1
+79 613 1
+79 616 1
+79 619 1
+79 620 1
+79 633 1
+79 636 1
+79 639 1
+79 640 1
+79 652 1
+79 655 1
+79 656 1
+79 658 1
+79 659 1
+79 661 1
+79 669 1
+79 683 1
+79 686 1
+79 689 1
+79 690 1
+79 703 1
+79 706 1
+79 709 1
+79 710 1
+79 722 1
+79 725 1
+79 726 1
+79 728 1
+79 729 1
+79 731 1
+79 738 1
+79 741 1
+79 744 1
+79 745 1
+79 757 1
+79 760 1
+79 761 1
+79 763 1
+79 764 1
+79 766 1
+79 772 1
+79 775 1
+79 776 1
+79 778 1
+79 779 1
+79 781 1
+79 787 1
+79 788 1
+79 790 1
+79 791 1
+79 808 1
+79 829 1
+79 844 1
+79 858 1
+79 861 1
+79 864 1
+79 865 1
+79 885 1
+79 900 1
+79 914 1
+79 917 1
+79 920 1
+79 921 1
+79 935 1
+79 949 1
+79 952 1
+79 955 1
+79 956 1
+79 969 1
+79 972 1
+79 975 1
+79 976 1
+79 988 1
+79 991 1
+79 992 1
+79 994 1
+79 995 1
+79 997 1
+79 1011 1
+79 1026 1
+79 1040 1
+79 1043 1
+79 1046 1
+79 1047 1
+79 1061 1
+79 1075 1
+79 1078 1
+79 1081 1
+79 1082 1
+79 1095 1
+79 1098 1
+79 1101 1
+79 1102 1
+79 1114 1
+79 1117 1
+79 1118 1
+79 1120 1
+79 1121 1
+79 1123 1
+79 1131 1
+79 1145 1
+79 1148 1
+79 1151 1
+79 1152 1
+79 1165 1
+79 1168 1
+79 1171 1
+79 1172 1
+79 1184 1
+79 1187 1
+79 1188 1
+79 1190 1
+79 1191 1
+79 1193 1
+79 1200 1
+79 1203 1
+79 1206 1
+79 1207 1
+79 1219 1
+79 1222 1
+79 1223 1
+79 1225 1
+79 1226 1
+79 1228 1
+79 1234 1
+79 1237 1
+79 1238 1
+79 1240 1
+79 1241 1
+79 1243 1
+79 1249 1
+79 1250 1
+79 1252 1
+79 1253 1
+79 1263 1
+79 1278 1
+79 1292 1
+79 1295 1
+79 1298 1
+79 1299 1
+79 1313 1
+79 1327 1
+79 1330 1
+79 1333 1
+79 1334 1
+79 1347 1
+79 1350 1
+79 1353 1
+79 1354 1
+79 1366 1
+79 1369 1
+79 1370 1
+79 1372 1
+79 1373 1
+79 1375 1
+79 1383 1
+79 1397 1
+79 1400 1
+79 1403 1
+79 1404 1
+79 1417 1
+79 1420 1
+79 1423 1
+79 1424 1
+79 1436 1
+79 1439 1
+79 1440 1
+79 1442 1
+79 1443 1
+79 1445 1
+79 1452 1
+79 1455 1
+79 1458 1
+79 1459 1
+79 1471 1
+79 1474 1
+79 1475 1
+79 1477 1
+79 1478 1
+79 1480 1
+79 1486 1
+79 1489 1
+79 1490 1
+79 1492 1
+79 1493 1
+79 1495 1
+79 1501 1
+79 1502 1
+79 1504 1
+79 1505 1
+79 1509 1
+79 1523 1
+79 1526 1
+79 1529 1
+79 1530 1
+79 1543 1
+79 1546 1
+79 1549 1
+79 1550 1
+79 1562 1
+79 1565 1
+79 1566 1
+79 1568 1
+79 1569 1
+79 1571 1
+79 1578 1
+79 1581 1
+79 1584 1
+79 1585 1
+79 1597 1
+79 1600 1
+79 1601 1
+79 1603 1
+79 1604 1
+79 1606 1
+79 1612 1
+79 1615 1
+79 1616 1
+79 1618 1
+79 1619 1
+79 1621 1
+79 1627 1
+79 1628 1
+79 1630 1
+79 1631 1
+79 1634 1
+79 1637 1
+79 1640 1
+79 1641 1
+79 1653 1
+79 1656 1
+79 1657 1
+79 1659 1
+79 1660 1
+79 1662 1
+79 1668 1
+79 1671 1
+79 1672 1
+79 1674 1
+79 1675 1
+79 1677 1
+79 1683 1
+79 1684 1
+79 1686 1
+79 1687 1
+79 1689 1
+79 1692 1
+79 1693 1
+79 1695 1
+79 1696 1
+79 1698 1
+79 1704 1
+79 1705 1
+79 1707 1
+79 1708 1
+79 1710 1
+79 1711 1
+79 1713 1
+79 1714 1
+79 1716 1
+79 1732 1
+79 1753 1
+79 1768 1
+79 1782 1
+79 1785 1
+79 1788 1
+79 1789 1
+79 1809 1
+79 1824 1
+79 1838 1
+79 1841 1
+79 1844 1
+79 1845 1
+79 1859 1
+79 1873 1
+79 1876 1
+79 1879 1
+79 1880 1
+79 1893 1
+79 1896 1
+79 1899 1
+79 1900 1
+79 1912 1
+79 1915 1
+79 1916 1
+79 1918 1
+79 1919 1
+79 1921 1
+79 1935 1
+79 1950 1
+79 1964 1
+79 1967 1
+79 1970 1
+79 1971 1
+79 1985 1
+79 1999 1
+79 2002 1
+79 2005 1
+79 2006 1
+79 2019 1
+79 2022 1
+79 2025 1
+79 2026 1
+79 2038 1
+79 2041 1
+79 2042 1
+79 2044 1
+79 2045 1
+79 2047 1
+79 2055 1
+79 2069 1
+79 2072 1
+79 2075 1
+79 2076 1
+79 2089 1
+79 2092 1
+79 2095 1
+79 2096 1
+79 2108 1
+79 2111 1
+79 2112 1
+79 2114 1
+79 2115 1
+79 2117 1
+79 2124 1
+79 2127 1
+79 2130 1
+79 2131 1
+79 2143 1
+79 2146 1
+79 2147 1
+79 2149 1
+79 2150 1
+79 2152 1
+79 2158 1
+79 2161 1
+79 2162 1
+79 2164 1
+79 2165 1
+79 2167 1
+79 2173 1
+79 2174 1
+79 2176 1
+79 2177 1
+79 2187 1
+79 2202 1
+79 2216 1
+79 2219 1
+79 2222 1
+79 2223 1
+79 2237 1
+79 2251 1
+79 2254 1
+79 2257 1
+79 2258 1
+79 2271 1
+79 2274 1
+79 2277 1
+79 2278 1
+79 2290 1
+79 2293 1
+79 2294 1
+79 2296 1
+79 2297 1
+79 2299 1
+79 2307 1
+79 2321 1
+79 2324 1
+79 2327 1
+79 2328 1
+79 2341 1
+79 2344 1
+79 2347 1
+79 2348 1
+79 2360 1
+79 2363 1
+79 2364 1
+79 2366 1
+79 2367 1
+79 2369 1
+79 2376 1
+79 2379 1
+79 2382 1
+79 2383 1
+79 2395 1
+79 2398 1
+79 2399 1
+79 2401 1
+79 2402 1
+79 2404 1
+79 2410 1
+79 2413 1
+79 2414 1
+79 2416 1
+79 2417 1
+79 2419 1
+79 2425 1
+79 2426 1
+79 2428 1
+79 2429 1
+79 2433 1
+79 2447 1
+79 2450 1
+79 2453 1
+79 2454 1
+79 2467 1
+79 2470 1
+79 2473 1
+79 2474 1
+79 2486 1
+79 2489 1
+79 2490 1
+79 2492 1
+79 2493 1
+79 2495 1
+79 2502 1
+79 2505 1
+79 2508 1
+79 2509 1
+79 2521 1
+79 2524 1
+79 2525 1
+79 2527 1
+79 2528 1
+79 2530 1
+79 2536 1
+79 2539 1
+79 2540 1
+79 2542 1
+79 2543 1
+79 2545 1
+79 2551 1
+79 2552 1
+79 2554 1
+79 2555 1
+79 2558 1
+79 2561 1
+79 2564 1
+79 2565 1
+79 2577 1
+79 2580 1
+79 2581 1
+79 2583 1
+79 2584 1
+79 2586 1
+79 2592 1
+79 2595 1
+79 2596 1
+79 2598 1
+79 2599 1
+79 2601 1
+79 2607 1
+79 2608 1
+79 2610 1
+79 2611 1
+79 2613 1
+79 2616 1
+79 2617 1
+79 2619 1
+79 2620 1
+79 2622 1
+79 2628 1
+79 2629 1
+79 2631 1
+79 2632 1
+79 2634 1
+79 2635 1
+79 2637 1
+79 2638 1
+79 2640 1
+79 2649 1
+79 2664 1
+79 2678 1
+79 2681 1
+79 2684 1
+79 2685 1
+79 2699 1
+79 2713 1
+79 2716 1
+79 2719 1
+79 2720 1
+79 2733 1
+79 2736 1
+79 2739 1
+79 2740 1
+79 2752 1
+79 2755 1
+79 2756 1
+79 2758 1
+79 2759 1
+79 2761 1
+79 2769 1
+79 2783 1
+79 2786 1
+79 2789 1
+79 2790 1
+79 2803 1
+79 2806 1
+79 2809 1
+79 2810 1
+79 2822 1
+79 2825 1
+79 2826 1
+79 2828 1
+79 2829 1
+79 2831 1
+79 2838 1
+79 2841 1
+79 2844 1
+79 2845 1
+79 2857 1
+79 2860 1
+79 2861 1
+79 2863 1
+79 2864 1
+79 2866 1
+79 2872 1
+79 2875 1
+79 2876 1
+79 2878 1
+79 2879 1
+79 2881 1
+79 2887 1
+79 2888 1
+79 2890 1
+79 2891 1
+79 2895 1
+79 2909 1
+79 2912 1
+79 2915 1
+79 2916 1
+79 2929 1
+79 2932 1
+79 2935 1
+79 2936 1
+79 2948 1
+79 2951 1
+79 2952 1
+79 2954 1
+79 2955 1
+79 2957 1
+79 2964 1
+79 2967 1
+79 2970 1
+79 2971 1
+79 2983 1
+79 2986 1
+79 2987 1
+79 2989 1
+79 2990 1
+79 2992 1
+79 2998 1
+79 3001 1
+79 3002 1
+79 3004 1
+79 3005 1
+79 3007 1
+79 3013 1
+79 3014 1
+79 3016 1
+79 3017 1
+79 3020 1
+79 3023 1
+79 3026 1
+79 3027 1
+79 3039 1
+79 3042 1
+79 3043 1
+79 3045 1
+79 3046 1
+79 3048 1
+79 3054 1
+79 3057 1
+79 3058 1
+79 3060 1
+79 3061 1
+79 3063 1
+79 3069 1
+79 3070 1
+79 3072 1
+79 3073 1
+79 3075 1
+79 3078 1
+79 3079 1
+79 3081 1
+79 3082 1
+79 3084 1
+79 3090 1
+79 3091 1
+79 3093 1
+79 3094 1
+79 3096 1
+79 3097 1
+79 3099 1
+79 3100 1
+79 3102 1
+79 3105 1
+79 3119 1
+79 3122 1
+79 3125 1
+79 3126 1
+79 3139 1
+79 3142 1
+79 3145 1
+79 3146 1
+79 3158 1
+79 3161 1
+79 3162 1
+79 3164 1
+79 3165 1
+79 3167 1
+79 3174 1
+79 3177 1
+79 3180 1
+79 3181 1
+79 3193 1
+79 3196 1
+79 3197 1
+79 3199 1
+79 3200 1
+79 3202 1
+79 3208 1
+79 3211 1
+79 3212 1
+79 3214 1
+79 3215 1
+79 3217 1
+79 3223 1
+79 3224 1
+79 3226 1
+79 3227 1
+79 3230 1
+79 3233 1
+79 3236 1
+79 3237 1
+79 3249 1
+79 3252 1
+79 3253 1
+79 3255 1
+79 3256 1
+79 3258 1
+79 3264 1
+79 3267 1
+79 3268 1
+79 3270 1
+79 3271 1
+79 3273 1
+79 3279 1
+79 3280 1
+79 3282 1
+79 3283 1
+79 3285 1
+79 3288 1
+79 3289 1
+79 3291 1
+79 3292 1
+79 3294 1
+79 3300 1
+79 3301 1
+79 3303 1
+79 3304 1
+79 3306 1
+79 3307 1
+79 3309 1
+79 3310 1
+79 3312 1
+79 3314 1
+79 3317 1
+79 3320 1
+79 3321 1
+79 3333 1
+79 3336 1
+79 3337 1
+79 3339 1
+79 3340 1
+79 3342 1
+79 3348 1
+79 3351 1
+79 3352 1
+79 3354 1
+79 3355 1
+79 3357 1
+79 3363 1
+79 3364 1
+79 3366 1
+79 3367 1
+79 3369 1
+79 3372 1
+79 3373 1
+79 3375 1
+79 3376 1
+79 3378 1
+79 3384 1
+79 3385 1
+79 3387 1
+79 3388 1
+79 3390 1
+79 3391 1
+79 3393 1
+79 3394 1
+79 3396 1
+79 3397 1
+79 3400 1
+79 3401 1
+79 3403 1
+79 3404 1
+79 3406 1
+79 3412 1
+79 3413 1
+79 3415 1
+79 3416 1
+79 3418 1
+79 3419 1
+79 3421 1
+79 3422 1
+79 3424 1
+79 3425 1
+79 3426 1
+79 3428 1
+79 3429 1
+79 3431 1
+79 3432 1
+80 25 1
+80 53 1
+80 74 1
+80 89 1
+80 103 1
+80 106 1
+80 108 1
+80 110 1
+80 137 1
+80 158 1
+80 173 1
+80 187 1
+80 190 1
+80 192 1
+80 194 1
+80 214 1
+80 229 1
+80 243 1
+80 246 1
+80 248 1
+80 250 1
+80 264 1
+80 278 1
+80 281 1
+80 283 1
+80 285 1
+80 298 1
+80 301 1
+80 303 1
+80 305 1
+80 317 1
+80 319 1
+80 321 1
+80 322 1
+80 324 1
+80 325 1
+80 347 1
+80 368 1
+80 383 1
+80 397 1
+80 400 1
+80 402 1
+80 404 1
+80 424 1
+80 439 1
+80 453 1
+80 456 1
+80 458 1
+80 460 1
+80 474 1
+80 488 1
+80 491 1
+80 493 1
+80 495 1
+80 508 1
+80 511 1
+80 513 1
+80 515 1
+80 527 1
+80 529 1
+80 531 1
+80 532 1
+80 534 1
+80 535 1
+80 550 1
+80 565 1
+80 579 1
+80 582 1
+80 584 1
+80 586 1
+80 600 1
+80 614 1
+80 617 1
+80 619 1
+80 621 1
+80 634 1
+80 637 1
+80 639 1
+80 641 1
+80 653 1
+80 655 1
+80 657 1
+80 658 1
+80 660 1
+80 661 1
+80 670 1
+80 684 1
+80 687 1
+80 689 1
+80 691 1
+80 704 1
+80 707 1
+80 709 1
+80 711 1
+80 723 1
+80 725 1
+80 727 1
+80 728 1
+80 730 1
+80 731 1
+80 739 1
+80 742 1
+80 744 1
+80 746 1
+80 758 1
+80 760 1
+80 762 1
+80 763 1
+80 765 1
+80 766 1
+80 773 1
+80 775 1
+80 777 1
+80 778 1
+80 780 1
+80 781 1
+80 787 1
+80 789 1
+80 790 1
+80 791 1
+80 809 1
+80 830 1
+80 845 1
+80 859 1
+80 862 1
+80 864 1
+80 866 1
+80 886 1
+80 901 1
+80 915 1
+80 918 1
+80 920 1
+80 922 1
+80 936 1
+80 950 1
+80 953 1
+80 955 1
+80 957 1
+80 970 1
+80 973 1
+80 975 1
+80 977 1
+80 989 1
+80 991 1
+80 993 1
+80 994 1
+80 996 1
+80 997 1
+80 1012 1
+80 1027 1
+80 1041 1
+80 1044 1
+80 1046 1
+80 1048 1
+80 1062 1
+80 1076 1
+80 1079 1
+80 1081 1
+80 1083 1
+80 1096 1
+80 1099 1
+80 1101 1
+80 1103 1
+80 1115 1
+80 1117 1
+80 1119 1
+80 1120 1
+80 1122 1
+80 1123 1
+80 1132 1
+80 1146 1
+80 1149 1
+80 1151 1
+80 1153 1
+80 1166 1
+80 1169 1
+80 1171 1
+80 1173 1
+80 1185 1
+80 1187 1
+80 1189 1
+80 1190 1
+80 1192 1
+80 1193 1
+80 1201 1
+80 1204 1
+80 1206 1
+80 1208 1
+80 1220 1
+80 1222 1
+80 1224 1
+80 1225 1
+80 1227 1
+80 1228 1
+80 1235 1
+80 1237 1
+80 1239 1
+80 1240 1
+80 1242 1
+80 1243 1
+80 1249 1
+80 1251 1
+80 1252 1
+80 1253 1
+80 1264 1
+80 1279 1
+80 1293 1
+80 1296 1
+80 1298 1
+80 1300 1
+80 1314 1
+80 1328 1
+80 1331 1
+80 1333 1
+80 1335 1
+80 1348 1
+80 1351 1
+80 1353 1
+80 1355 1
+80 1367 1
+80 1369 1
+80 1371 1
+80 1372 1
+80 1374 1
+80 1375 1
+80 1384 1
+80 1398 1
+80 1401 1
+80 1403 1
+80 1405 1
+80 1418 1
+80 1421 1
+80 1423 1
+80 1425 1
+80 1437 1
+80 1439 1
+80 1441 1
+80 1442 1
+80 1444 1
+80 1445 1
+80 1453 1
+80 1456 1
+80 1458 1
+80 1460 1
+80 1472 1
+80 1474 1
+80 1476 1
+80 1477 1
+80 1479 1
+80 1480 1
+80 1487 1
+80 1489 1
+80 1491 1
+80 1492 1
+80 1494 1
+80 1495 1
+80 1501 1
+80 1503 1
+80 1504 1
+80 1505 1
+80 1510 1
+80 1524 1
+80 1527 1
+80 1529 1
+80 1531 1
+80 1544 1
+80 1547 1
+80 1549 1
+80 1551 1
+80 1563 1
+80 1565 1
+80 1567 1
+80 1568 1
+80 1570 1
+80 1571 1
+80 1579 1
+80 1582 1
+80 1584 1
+80 1586 1
+80 1598 1
+80 1600 1
+80 1602 1
+80 1603 1
+80 1605 1
+80 1606 1
+80 1613 1
+80 1615 1
+80 1617 1
+80 1618 1
+80 1620 1
+80 1621 1
+80 1627 1
+80 1629 1
+80 1630 1
+80 1631 1
+80 1635 1
+80 1638 1
+80 1640 1
+80 1642 1
+80 1654 1
+80 1656 1
+80 1658 1
+80 1659 1
+80 1661 1
+80 1662 1
+80 1669 1
+80 1671 1
+80 1673 1
+80 1674 1
+80 1676 1
+80 1677 1
+80 1683 1
+80 1685 1
+80 1686 1
+80 1687 1
+80 1690 1
+80 1692 1
+80 1694 1
+80 1695 1
+80 1697 1
+80 1698 1
+80 1704 1
+80 1706 1
+80 1707 1
+80 1708 1
+80 1710 1
+80 1712 1
+80 1713 1
+80 1714 1
+80 1716 1
+80 1733 1
+80 1754 1
+80 1769 1
+80 1783 1
+80 1786 1
+80 1788 1
+80 1790 1
+80 1810 1
+80 1825 1
+80 1839 1
+80 1842 1
+80 1844 1
+80 1846 1
+80 1860 1
+80 1874 1
+80 1877 1
+80 1879 1
+80 1881 1
+80 1894 1
+80 1897 1
+80 1899 1
+80 1901 1
+80 1913 1
+80 1915 1
+80 1917 1
+80 1918 1
+80 1920 1
+80 1921 1
+80 1936 1
+80 1951 1
+80 1965 1
+80 1968 1
+80 1970 1
+80 1972 1
+80 1986 1
+80 2000 1
+80 2003 1
+80 2005 1
+80 2007 1
+80 2020 1
+80 2023 1
+80 2025 1
+80 2027 1
+80 2039 1
+80 2041 1
+80 2043 1
+80 2044 1
+80 2046 1
+80 2047 1
+80 2056 1
+80 2070 1
+80 2073 1
+80 2075 1
+80 2077 1
+80 2090 1
+80 2093 1
+80 2095 1
+80 2097 1
+80 2109 1
+80 2111 1
+80 2113 1
+80 2114 1
+80 2116 1
+80 2117 1
+80 2125 1
+80 2128 1
+80 2130 1
+80 2132 1
+80 2144 1
+80 2146 1
+80 2148 1
+80 2149 1
+80 2151 1
+80 2152 1
+80 2159 1
+80 2161 1
+80 2163 1
+80 2164 1
+80 2166 1
+80 2167 1
+80 2173 1
+80 2175 1
+80 2176 1
+80 2177 1
+80 2188 1
+80 2203 1
+80 2217 1
+80 2220 1
+80 2222 1
+80 2224 1
+80 2238 1
+80 2252 1
+80 2255 1
+80 2257 1
+80 2259 1
+80 2272 1
+80 2275 1
+80 2277 1
+80 2279 1
+80 2291 1
+80 2293 1
+80 2295 1
+80 2296 1
+80 2298 1
+80 2299 1
+80 2308 1
+80 2322 1
+80 2325 1
+80 2327 1
+80 2329 1
+80 2342 1
+80 2345 1
+80 2347 1
+80 2349 1
+80 2361 1
+80 2363 1
+80 2365 1
+80 2366 1
+80 2368 1
+80 2369 1
+80 2377 1
+80 2380 1
+80 2382 1
+80 2384 1
+80 2396 1
+80 2398 1
+80 2400 1
+80 2401 1
+80 2403 1
+80 2404 1
+80 2411 1
+80 2413 1
+80 2415 1
+80 2416 1
+80 2418 1
+80 2419 1
+80 2425 1
+80 2427 1
+80 2428 1
+80 2429 1
+80 2434 1
+80 2448 1
+80 2451 1
+80 2453 1
+80 2455 1
+80 2468 1
+80 2471 1
+80 2473 1
+80 2475 1
+80 2487 1
+80 2489 1
+80 2491 1
+80 2492 1
+80 2494 1
+80 2495 1
+80 2503 1
+80 2506 1
+80 2508 1
+80 2510 1
+80 2522 1
+80 2524 1
+80 2526 1
+80 2527 1
+80 2529 1
+80 2530 1
+80 2537 1
+80 2539 1
+80 2541 1
+80 2542 1
+80 2544 1
+80 2545 1
+80 2551 1
+80 2553 1
+80 2554 1
+80 2555 1
+80 2559 1
+80 2562 1
+80 2564 1
+80 2566 1
+80 2578 1
+80 2580 1
+80 2582 1
+80 2583 1
+80 2585 1
+80 2586 1
+80 2593 1
+80 2595 1
+80 2597 1
+80 2598 1
+80 2600 1
+80 2601 1
+80 2607 1
+80 2609 1
+80 2610 1
+80 2611 1
+80 2614 1
+80 2616 1
+80 2618 1
+80 2619 1
+80 2621 1
+80 2622 1
+80 2628 1
+80 2630 1
+80 2631 1
+80 2632 1
+80 2634 1
+80 2636 1
+80 2637 1
+80 2638 1
+80 2640 1
+80 2650 1
+80 2665 1
+80 2679 1
+80 2682 1
+80 2684 1
+80 2686 1
+80 2700 1
+80 2714 1
+80 2717 1
+80 2719 1
+80 2721 1
+80 2734 1
+80 2737 1
+80 2739 1
+80 2741 1
+80 2753 1
+80 2755 1
+80 2757 1
+80 2758 1
+80 2760 1
+80 2761 1
+80 2770 1
+80 2784 1
+80 2787 1
+80 2789 1
+80 2791 1
+80 2804 1
+80 2807 1
+80 2809 1
+80 2811 1
+80 2823 1
+80 2825 1
+80 2827 1
+80 2828 1
+80 2830 1
+80 2831 1
+80 2839 1
+80 2842 1
+80 2844 1
+80 2846 1
+80 2858 1
+80 2860 1
+80 2862 1
+80 2863 1
+80 2865 1
+80 2866 1
+80 2873 1
+80 2875 1
+80 2877 1
+80 2878 1
+80 2880 1
+80 2881 1
+80 2887 1
+80 2889 1
+80 2890 1
+80 2891 1
+80 2896 1
+80 2910 1
+80 2913 1
+80 2915 1
+80 2917 1
+80 2930 1
+80 2933 1
+80 2935 1
+80 2937 1
+80 2949 1
+80 2951 1
+80 2953 1
+80 2954 1
+80 2956 1
+80 2957 1
+80 2965 1
+80 2968 1
+80 2970 1
+80 2972 1
+80 2984 1
+80 2986 1
+80 2988 1
+80 2989 1
+80 2991 1
+80 2992 1
+80 2999 1
+80 3001 1
+80 3003 1
+80 3004 1
+80 3006 1
+80 3007 1
+80 3013 1
+80 3015 1
+80 3016 1
+80 3017 1
+80 3021 1
+80 3024 1
+80 3026 1
+80 3028 1
+80 3040 1
+80 3042 1
+80 3044 1
+80 3045 1
+80 3047 1
+80 3048 1
+80 3055 1
+80 3057 1
+80 3059 1
+80 3060 1
+80 3062 1
+80 3063 1
+80 3069 1
+80 3071 1
+80 3072 1
+80 3073 1
+80 3076 1
+80 3078 1
+80 3080 1
+80 3081 1
+80 3083 1
+80 3084 1
+80 3090 1
+80 3092 1
+80 3093 1
+80 3094 1
+80 3096 1
+80 3098 1
+80 3099 1
+80 3100 1
+80 3102 1
+80 3106 1
+80 3120 1
+80 3123 1
+80 3125 1
+80 3127 1
+80 3140 1
+80 3143 1
+80 3145 1
+80 3147 1
+80 3159 1
+80 3161 1
+80 3163 1
+80 3164 1
+80 3166 1
+80 3167 1
+80 3175 1
+80 3178 1
+80 3180 1
+80 3182 1
+80 3194 1
+80 3196 1
+80 3198 1
+80 3199 1
+80 3201 1
+80 3202 1
+80 3209 1
+80 3211 1
+80 3213 1
+80 3214 1
+80 3216 1
+80 3217 1
+80 3223 1
+80 3225 1
+80 3226 1
+80 3227 1
+80 3231 1
+80 3234 1
+80 3236 1
+80 3238 1
+80 3250 1
+80 3252 1
+80 3254 1
+80 3255 1
+80 3257 1
+80 3258 1
+80 3265 1
+80 3267 1
+80 3269 1
+80 3270 1
+80 3272 1
+80 3273 1
+80 3279 1
+80 3281 1
+80 3282 1
+80 3283 1
+80 3286 1
+80 3288 1
+80 3290 1
+80 3291 1
+80 3293 1
+80 3294 1
+80 3300 1
+80 3302 1
+80 3303 1
+80 3304 1
+80 3306 1
+80 3308 1
+80 3309 1
+80 3310 1
+80 3312 1
+80 3315 1
+80 3318 1
+80 3320 1
+80 3322 1
+80 3334 1
+80 3336 1
+80 3338 1
+80 3339 1
+80 3341 1
+80 3342 1
+80 3349 1
+80 3351 1
+80 3353 1
+80 3354 1
+80 3356 1
+80 3357 1
+80 3363 1
+80 3365 1
+80 3366 1
+80 3367 1
+80 3370 1
+80 3372 1
+80 3374 1
+80 3375 1
+80 3377 1
+80 3378 1
+80 3384 1
+80 3386 1
+80 3387 1
+80 3388 1
+80 3390 1
+80 3392 1
+80 3393 1
+80 3394 1
+80 3396 1
+80 3398 1
+80 3400 1
+80 3402 1
+80 3403 1
+80 3405 1
+80 3406 1
+80 3412 1
+80 3414 1
+80 3415 1
+80 3416 1
+80 3418 1
+80 3420 1
+80 3421 1
+80 3422 1
+80 3424 1
+80 3425 1
+80 3427 1
+80 3428 1
+80 3429 1
+80 3431 1
+80 3432 1
+81 26 1
+81 54 1
+81 75 1
+81 90 1
+81 104 1
+81 107 1
+81 109 1
+81 110 1
+81 138 1
+81 159 1
+81 174 1
+81 188 1
+81 191 1
+81 193 1
+81 194 1
+81 215 1
+81 230 1
+81 244 1
+81 247 1
+81 249 1
+81 250 1
+81 265 1
+81 279 1
+81 282 1
+81 284 1
+81 285 1
+81 299 1
+81 302 1
+81 304 1
+81 305 1
+81 318 1
+81 320 1
+81 321 1
+81 323 1
+81 324 1
+81 325 1
+81 348 1
+81 369 1
+81 384 1
+81 398 1
+81 401 1
+81 403 1
+81 404 1
+81 425 1
+81 440 1
+81 454 1
+81 457 1
+81 459 1
+81 460 1
+81 475 1
+81 489 1
+81 492 1
+81 494 1
+81 495 1
+81 509 1
+81 512 1
+81 514 1
+81 515 1
+81 528 1
+81 530 1
+81 531 1
+81 533 1
+81 534 1
+81 535 1
+81 551 1
+81 566 1
+81 580 1
+81 583 1
+81 585 1
+81 586 1
+81 601 1
+81 615 1
+81 618 1
+81 620 1
+81 621 1
+81 635 1
+81 638 1
+81 640 1
+81 641 1
+81 654 1
+81 656 1
+81 657 1
+81 659 1
+81 660 1
+81 661 1
+81 671 1
+81 685 1
+81 688 1
+81 690 1
+81 691 1
+81 705 1
+81 708 1
+81 710 1
+81 711 1
+81 724 1
+81 726 1
+81 727 1
+81 729 1
+81 730 1
+81 731 1
+81 740 1
+81 743 1
+81 745 1
+81 746 1
+81 759 1
+81 761 1
+81 762 1
+81 764 1
+81 765 1
+81 766 1
+81 774 1
+81 776 1
+81 777 1
+81 779 1
+81 780 1
+81 781 1
+81 788 1
+81 789 1
+81 790 1
+81 791 1
+81 810 1
+81 831 1
+81 846 1
+81 860 1
+81 863 1
+81 865 1
+81 866 1
+81 887 1
+81 902 1
+81 916 1
+81 919 1
+81 921 1
+81 922 1
+81 937 1
+81 951 1
+81 954 1
+81 956 1
+81 957 1
+81 971 1
+81 974 1
+81 976 1
+81 977 1
+81 990 1
+81 992 1
+81 993 1
+81 995 1
+81 996 1
+81 997 1
+81 1013 1
+81 1028 1
+81 1042 1
+81 1045 1
+81 1047 1
+81 1048 1
+81 1063 1
+81 1077 1
+81 1080 1
+81 1082 1
+81 1083 1
+81 1097 1
+81 1100 1
+81 1102 1
+81 1103 1
+81 1116 1
+81 1118 1
+81 1119 1
+81 1121 1
+81 1122 1
+81 1123 1
+81 1133 1
+81 1147 1
+81 1150 1
+81 1152 1
+81 1153 1
+81 1167 1
+81 1170 1
+81 1172 1
+81 1173 1
+81 1186 1
+81 1188 1
+81 1189 1
+81 1191 1
+81 1192 1
+81 1193 1
+81 1202 1
+81 1205 1
+81 1207 1
+81 1208 1
+81 1221 1
+81 1223 1
+81 1224 1
+81 1226 1
+81 1227 1
+81 1228 1
+81 1236 1
+81 1238 1
+81 1239 1
+81 1241 1
+81 1242 1
+81 1243 1
+81 1250 1
+81 1251 1
+81 1252 1
+81 1253 1
+81 1265 1
+81 1280 1
+81 1294 1
+81 1297 1
+81 1299 1
+81 1300 1
+81 1315 1
+81 1329 1
+81 1332 1
+81 1334 1
+81 1335 1
+81 1349 1
+81 1352 1
+81 1354 1
+81 1355 1
+81 1368 1
+81 1370 1
+81 1371 1
+81 1373 1
+81 1374 1
+81 1375 1
+81 1385 1
+81 1399 1
+81 1402 1
+81 1404 1
+81 1405 1
+81 1419 1
+81 1422 1
+81 1424 1
+81 1425 1
+81 1438 1
+81 1440 1
+81 1441 1
+81 1443 1
+81 1444 1
+81 1445 1
+81 1454 1
+81 1457 1
+81 1459 1
+81 1460 1
+81 1473 1
+81 1475 1
+81 1476 1
+81 1478 1
+81 1479 1
+81 1480 1
+81 1488 1
+81 1490 1
+81 1491 1
+81 1493 1
+81 1494 1
+81 1495 1
+81 1502 1
+81 1503 1
+81 1504 1
+81 1505 1
+81 1511 1
+81 1525 1
+81 1528 1
+81 1530 1
+81 1531 1
+81 1545 1
+81 1548 1
+81 1550 1
+81 1551 1
+81 1564 1
+81 1566 1
+81 1567 1
+81 1569 1
+81 1570 1
+81 1571 1
+81 1580 1
+81 1583 1
+81 1585 1
+81 1586 1
+81 1599 1
+81 1601 1
+81 1602 1
+81 1604 1
+81 1605 1
+81 1606 1
+81 1614 1
+81 1616 1
+81 1617 1
+81 1619 1
+81 1620 1
+81 1621 1
+81 1628 1
+81 1629 1
+81 1630 1
+81 1631 1
+81 1636 1
+81 1639 1
+81 1641 1
+81 1642 1
+81 1655 1
+81 1657 1
+81 1658 1
+81 1660 1
+81 1661 1
+81 1662 1
+81 1670 1
+81 1672 1
+81 1673 1
+81 1675 1
+81 1676 1
+81 1677 1
+81 1684 1
+81 1685 1
+81 1686 1
+81 1687 1
+81 1691 1
+81 1693 1
+81 1694 1
+81 1696 1
+81 1697 1
+81 1698 1
+81 1705 1
+81 1706 1
+81 1707 1
+81 1708 1
+81 1711 1
+81 1712 1
+81 1713 1
+81 1714 1
+81 1716 1
+81 1734 1
+81 1755 1
+81 1770 1
+81 1784 1
+81 1787 1
+81 1789 1
+81 1790 1
+81 1811 1
+81 1826 1
+81 1840 1
+81 1843 1
+81 1845 1
+81 1846 1
+81 1861 1
+81 1875 1
+81 1878 1
+81 1880 1
+81 1881 1
+81 1895 1
+81 1898 1
+81 1900 1
+81 1901 1
+81 1914 1
+81 1916 1
+81 1917 1
+81 1919 1
+81 1920 1
+81 1921 1
+81 1937 1
+81 1952 1
+81 1966 1
+81 1969 1
+81 1971 1
+81 1972 1
+81 1987 1
+81 2001 1
+81 2004 1
+81 2006 1
+81 2007 1
+81 2021 1
+81 2024 1
+81 2026 1
+81 2027 1
+81 2040 1
+81 2042 1
+81 2043 1
+81 2045 1
+81 2046 1
+81 2047 1
+81 2057 1
+81 2071 1
+81 2074 1
+81 2076 1
+81 2077 1
+81 2091 1
+81 2094 1
+81 2096 1
+81 2097 1
+81 2110 1
+81 2112 1
+81 2113 1
+81 2115 1
+81 2116 1
+81 2117 1
+81 2126 1
+81 2129 1
+81 2131 1
+81 2132 1
+81 2145 1
+81 2147 1
+81 2148 1
+81 2150 1
+81 2151 1
+81 2152 1
+81 2160 1
+81 2162 1
+81 2163 1
+81 2165 1
+81 2166 1
+81 2167 1
+81 2174 1
+81 2175 1
+81 2176 1
+81 2177 1
+81 2189 1
+81 2204 1
+81 2218 1
+81 2221 1
+81 2223 1
+81 2224 1
+81 2239 1
+81 2253 1
+81 2256 1
+81 2258 1
+81 2259 1
+81 2273 1
+81 2276 1
+81 2278 1
+81 2279 1
+81 2292 1
+81 2294 1
+81 2295 1
+81 2297 1
+81 2298 1
+81 2299 1
+81 2309 1
+81 2323 1
+81 2326 1
+81 2328 1
+81 2329 1
+81 2343 1
+81 2346 1
+81 2348 1
+81 2349 1
+81 2362 1
+81 2364 1
+81 2365 1
+81 2367 1
+81 2368 1
+81 2369 1
+81 2378 1
+81 2381 1
+81 2383 1
+81 2384 1
+81 2397 1
+81 2399 1
+81 2400 1
+81 2402 1
+81 2403 1
+81 2404 1
+81 2412 1
+81 2414 1
+81 2415 1
+81 2417 1
+81 2418 1
+81 2419 1
+81 2426 1
+81 2427 1
+81 2428 1
+81 2429 1
+81 2435 1
+81 2449 1
+81 2452 1
+81 2454 1
+81 2455 1
+81 2469 1
+81 2472 1
+81 2474 1
+81 2475 1
+81 2488 1
+81 2490 1
+81 2491 1
+81 2493 1
+81 2494 1
+81 2495 1
+81 2504 1
+81 2507 1
+81 2509 1
+81 2510 1
+81 2523 1
+81 2525 1
+81 2526 1
+81 2528 1
+81 2529 1
+81 2530 1
+81 2538 1
+81 2540 1
+81 2541 1
+81 2543 1
+81 2544 1
+81 2545 1
+81 2552 1
+81 2553 1
+81 2554 1
+81 2555 1
+81 2560 1
+81 2563 1
+81 2565 1
+81 2566 1
+81 2579 1
+81 2581 1
+81 2582 1
+81 2584 1
+81 2585 1
+81 2586 1
+81 2594 1
+81 2596 1
+81 2597 1
+81 2599 1
+81 2600 1
+81 2601 1
+81 2608 1
+81 2609 1
+81 2610 1
+81 2611 1
+81 2615 1
+81 2617 1
+81 2618 1
+81 2620 1
+81 2621 1
+81 2622 1
+81 2629 1
+81 2630 1
+81 2631 1
+81 2632 1
+81 2635 1
+81 2636 1
+81 2637 1
+81 2638 1
+81 2640 1
+81 2651 1
+81 2666 1
+81 2680 1
+81 2683 1
+81 2685 1
+81 2686 1
+81 2701 1
+81 2715 1
+81 2718 1
+81 2720 1
+81 2721 1
+81 2735 1
+81 2738 1
+81 2740 1
+81 2741 1
+81 2754 1
+81 2756 1
+81 2757 1
+81 2759 1
+81 2760 1
+81 2761 1
+81 2771 1
+81 2785 1
+81 2788 1
+81 2790 1
+81 2791 1
+81 2805 1
+81 2808 1
+81 2810 1
+81 2811 1
+81 2824 1
+81 2826 1
+81 2827 1
+81 2829 1
+81 2830 1
+81 2831 1
+81 2840 1
+81 2843 1
+81 2845 1
+81 2846 1
+81 2859 1
+81 2861 1
+81 2862 1
+81 2864 1
+81 2865 1
+81 2866 1
+81 2874 1
+81 2876 1
+81 2877 1
+81 2879 1
+81 2880 1
+81 2881 1
+81 2888 1
+81 2889 1
+81 2890 1
+81 2891 1
+81 2897 1
+81 2911 1
+81 2914 1
+81 2916 1
+81 2917 1
+81 2931 1
+81 2934 1
+81 2936 1
+81 2937 1
+81 2950 1
+81 2952 1
+81 2953 1
+81 2955 1
+81 2956 1
+81 2957 1
+81 2966 1
+81 2969 1
+81 2971 1
+81 2972 1
+81 2985 1
+81 2987 1
+81 2988 1
+81 2990 1
+81 2991 1
+81 2992 1
+81 3000 1
+81 3002 1
+81 3003 1
+81 3005 1
+81 3006 1
+81 3007 1
+81 3014 1
+81 3015 1
+81 3016 1
+81 3017 1
+81 3022 1
+81 3025 1
+81 3027 1
+81 3028 1
+81 3041 1
+81 3043 1
+81 3044 1
+81 3046 1
+81 3047 1
+81 3048 1
+81 3056 1
+81 3058 1
+81 3059 1
+81 3061 1
+81 3062 1
+81 3063 1
+81 3070 1
+81 3071 1
+81 3072 1
+81 3073 1
+81 3077 1
+81 3079 1
+81 3080 1
+81 3082 1
+81 3083 1
+81 3084 1
+81 3091 1
+81 3092 1
+81 3093 1
+81 3094 1
+81 3097 1
+81 3098 1
+81 3099 1
+81 3100 1
+81 3102 1
+81 3107 1
+81 3121 1
+81 3124 1
+81 3126 1
+81 3127 1
+81 3141 1
+81 3144 1
+81 3146 1
+81 3147 1
+81 3160 1
+81 3162 1
+81 3163 1
+81 3165 1
+81 3166 1
+81 3167 1
+81 3176 1
+81 3179 1
+81 3181 1
+81 3182 1
+81 3195 1
+81 3197 1
+81 3198 1
+81 3200 1
+81 3201 1
+81 3202 1
+81 3210 1
+81 3212 1
+81 3213 1
+81 3215 1
+81 3216 1
+81 3217 1
+81 3224 1
+81 3225 1
+81 3226 1
+81 3227 1
+81 3232 1
+81 3235 1
+81 3237 1
+81 3238 1
+81 3251 1
+81 3253 1
+81 3254 1
+81 3256 1
+81 3257 1
+81 3258 1
+81 3266 1
+81 3268 1
+81 3269 1
+81 3271 1
+81 3272 1
+81 3273 1
+81 3280 1
+81 3281 1
+81 3282 1
+81 3283 1
+81 3287 1
+81 3289 1
+81 3290 1
+81 3292 1
+81 3293 1
+81 3294 1
+81 3301 1
+81 3302 1
+81 3303 1
+81 3304 1
+81 3307 1
+81 3308 1
+81 3309 1
+81 3310 1
+81 3312 1
+81 3316 1
+81 3319 1
+81 3321 1
+81 3322 1
+81 3335 1
+81 3337 1
+81 3338 1
+81 3340 1
+81 3341 1
+81 3342 1
+81 3350 1
+81 3352 1
+81 3353 1
+81 3355 1
+81 3356 1
+81 3357 1
+81 3364 1
+81 3365 1
+81 3366 1
+81 3367 1
+81 3371 1
+81 3373 1
+81 3374 1
+81 3376 1
+81 3377 1
+81 3378 1
+81 3385 1
+81 3386 1
+81 3387 1
+81 3388 1
+81 3391 1
+81 3392 1
+81 3393 1
+81 3394 1
+81 3396 1
+81 3399 1
+81 3401 1
+81 3402 1
+81 3404 1
+81 3405 1
+81 3406 1
+81 3413 1
+81 3414 1
+81 3415 1
+81 3416 1
+81 3419 1
+81 3420 1
+81 3421 1
+81 3422 1
+81 3424 1
+81 3426 1
+81 3427 1
+81 3428 1
+81 3429 1
+81 3431 1
+81 3432 1
+82 27 1
+82 55 1
+82 76 1
+82 91 1
+82 101 1
+82 111 1
+82 112 1
+82 113 1
+82 139 1
+82 160 1
+82 175 1
+82 185 1
+82 195 1
+82 196 1
+82 197 1
+82 216 1
+82 231 1
+82 241 1
+82 251 1
+82 252 1
+82 253 1
+82 266 1
+82 276 1
+82 286 1
+82 287 1
+82 288 1
+82 296 1
+82 306 1
+82 307 1
+82 308 1
+82 316 1
+82 317 1
+82 318 1
+82 326 1
+82 327 1
+82 328 1
+82 349 1
+82 370 1
+82 385 1
+82 395 1
+82 405 1
+82 406 1
+82 407 1
+82 426 1
+82 441 1
+82 451 1
+82 461 1
+82 462 1
+82 463 1
+82 476 1
+82 486 1
+82 496 1
+82 497 1
+82 498 1
+82 506 1
+82 516 1
+82 517 1
+82 518 1
+82 526 1
+82 527 1
+82 528 1
+82 536 1
+82 537 1
+82 538 1
+82 552 1
+82 567 1
+82 577 1
+82 587 1
+82 588 1
+82 589 1
+82 602 1
+82 612 1
+82 622 1
+82 623 1
+82 624 1
+82 632 1
+82 642 1
+82 643 1
+82 644 1
+82 652 1
+82 653 1
+82 654 1
+82 662 1
+82 663 1
+82 664 1
+82 672 1
+82 682 1
+82 692 1
+82 693 1
+82 694 1
+82 702 1
+82 712 1
+82 713 1
+82 714 1
+82 722 1
+82 723 1
+82 724 1
+82 732 1
+82 733 1
+82 734 1
+82 737 1
+82 747 1
+82 748 1
+82 749 1
+82 757 1
+82 758 1
+82 759 1
+82 767 1
+82 768 1
+82 769 1
+82 772 1
+82 773 1
+82 774 1
+82 782 1
+82 783 1
+82 784 1
+82 787 1
+82 788 1
+82 789 1
+82 792 1
+82 811 1
+82 832 1
+82 847 1
+82 857 1
+82 867 1
+82 868 1
+82 869 1
+82 888 1
+82 903 1
+82 913 1
+82 923 1
+82 924 1
+82 925 1
+82 938 1
+82 948 1
+82 958 1
+82 959 1
+82 960 1
+82 968 1
+82 978 1
+82 979 1
+82 980 1
+82 988 1
+82 989 1
+82 990 1
+82 998 1
+82 999 1
+82 1000 1
+82 1014 1
+82 1029 1
+82 1039 1
+82 1049 1
+82 1050 1
+82 1051 1
+82 1064 1
+82 1074 1
+82 1084 1
+82 1085 1
+82 1086 1
+82 1094 1
+82 1104 1
+82 1105 1
+82 1106 1
+82 1114 1
+82 1115 1
+82 1116 1
+82 1124 1
+82 1125 1
+82 1126 1
+82 1134 1
+82 1144 1
+82 1154 1
+82 1155 1
+82 1156 1
+82 1164 1
+82 1174 1
+82 1175 1
+82 1176 1
+82 1184 1
+82 1185 1
+82 1186 1
+82 1194 1
+82 1195 1
+82 1196 1
+82 1199 1
+82 1209 1
+82 1210 1
+82 1211 1
+82 1219 1
+82 1220 1
+82 1221 1
+82 1229 1
+82 1230 1
+82 1231 1
+82 1234 1
+82 1235 1
+82 1236 1
+82 1244 1
+82 1245 1
+82 1246 1
+82 1249 1
+82 1250 1
+82 1251 1
+82 1254 1
+82 1266 1
+82 1281 1
+82 1291 1
+82 1301 1
+82 1302 1
+82 1303 1
+82 1316 1
+82 1326 1
+82 1336 1
+82 1337 1
+82 1338 1
+82 1346 1
+82 1356 1
+82 1357 1
+82 1358 1
+82 1366 1
+82 1367 1
+82 1368 1
+82 1376 1
+82 1377 1
+82 1378 1
+82 1386 1
+82 1396 1
+82 1406 1
+82 1407 1
+82 1408 1
+82 1416 1
+82 1426 1
+82 1427 1
+82 1428 1
+82 1436 1
+82 1437 1
+82 1438 1
+82 1446 1
+82 1447 1
+82 1448 1
+82 1451 1
+82 1461 1
+82 1462 1
+82 1463 1
+82 1471 1
+82 1472 1
+82 1473 1
+82 1481 1
+82 1482 1
+82 1483 1
+82 1486 1
+82 1487 1
+82 1488 1
+82 1496 1
+82 1497 1
+82 1498 1
+82 1501 1
+82 1502 1
+82 1503 1
+82 1506 1
+82 1512 1
+82 1522 1
+82 1532 1
+82 1533 1
+82 1534 1
+82 1542 1
+82 1552 1
+82 1553 1
+82 1554 1
+82 1562 1
+82 1563 1
+82 1564 1
+82 1572 1
+82 1573 1
+82 1574 1
+82 1577 1
+82 1587 1
+82 1588 1
+82 1589 1
+82 1597 1
+82 1598 1
+82 1599 1
+82 1607 1
+82 1608 1
+82 1609 1
+82 1612 1
+82 1613 1
+82 1614 1
+82 1622 1
+82 1623 1
+82 1624 1
+82 1627 1
+82 1628 1
+82 1629 1
+82 1632 1
+82 1633 1
+82 1643 1
+82 1644 1
+82 1645 1
+82 1653 1
+82 1654 1
+82 1655 1
+82 1663 1
+82 1664 1
+82 1665 1
+82 1668 1
+82 1669 1
+82 1670 1
+82 1678 1
+82 1679 1
+82 1680 1
+82 1683 1
+82 1684 1
+82 1685 1
+82 1688 1
+82 1689 1
+82 1690 1
+82 1691 1
+82 1699 1
+82 1700 1
+82 1701 1
+82 1704 1
+82 1705 1
+82 1706 1
+82 1709 1
+82 1710 1
+82 1711 1
+82 1712 1
+82 1715 1
+82 1716 1
+82 1735 1
+82 1756 1
+82 1771 1
+82 1781 1
+82 1791 1
+82 1792 1
+82 1793 1
+82 1812 1
+82 1827 1
+82 1837 1
+82 1847 1
+82 1848 1
+82 1849 1
+82 1862 1
+82 1872 1
+82 1882 1
+82 1883 1
+82 1884 1
+82 1892 1
+82 1902 1
+82 1903 1
+82 1904 1
+82 1912 1
+82 1913 1
+82 1914 1
+82 1922 1
+82 1923 1
+82 1924 1
+82 1938 1
+82 1953 1
+82 1963 1
+82 1973 1
+82 1974 1
+82 1975 1
+82 1988 1
+82 1998 1
+82 2008 1
+82 2009 1
+82 2010 1
+82 2018 1
+82 2028 1
+82 2029 1
+82 2030 1
+82 2038 1
+82 2039 1
+82 2040 1
+82 2048 1
+82 2049 1
+82 2050 1
+82 2058 1
+82 2068 1
+82 2078 1
+82 2079 1
+82 2080 1
+82 2088 1
+82 2098 1
+82 2099 1
+82 2100 1
+82 2108 1
+82 2109 1
+82 2110 1
+82 2118 1
+82 2119 1
+82 2120 1
+82 2123 1
+82 2133 1
+82 2134 1
+82 2135 1
+82 2143 1
+82 2144 1
+82 2145 1
+82 2153 1
+82 2154 1
+82 2155 1
+82 2158 1
+82 2159 1
+82 2160 1
+82 2168 1
+82 2169 1
+82 2170 1
+82 2173 1
+82 2174 1
+82 2175 1
+82 2178 1
+82 2190 1
+82 2205 1
+82 2215 1
+82 2225 1
+82 2226 1
+82 2227 1
+82 2240 1
+82 2250 1
+82 2260 1
+82 2261 1
+82 2262 1
+82 2270 1
+82 2280 1
+82 2281 1
+82 2282 1
+82 2290 1
+82 2291 1
+82 2292 1
+82 2300 1
+82 2301 1
+82 2302 1
+82 2310 1
+82 2320 1
+82 2330 1
+82 2331 1
+82 2332 1
+82 2340 1
+82 2350 1
+82 2351 1
+82 2352 1
+82 2360 1
+82 2361 1
+82 2362 1
+82 2370 1
+82 2371 1
+82 2372 1
+82 2375 1
+82 2385 1
+82 2386 1
+82 2387 1
+82 2395 1
+82 2396 1
+82 2397 1
+82 2405 1
+82 2406 1
+82 2407 1
+82 2410 1
+82 2411 1
+82 2412 1
+82 2420 1
+82 2421 1
+82 2422 1
+82 2425 1
+82 2426 1
+82 2427 1
+82 2430 1
+82 2436 1
+82 2446 1
+82 2456 1
+82 2457 1
+82 2458 1
+82 2466 1
+82 2476 1
+82 2477 1
+82 2478 1
+82 2486 1
+82 2487 1
+82 2488 1
+82 2496 1
+82 2497 1
+82 2498 1
+82 2501 1
+82 2511 1
+82 2512 1
+82 2513 1
+82 2521 1
+82 2522 1
+82 2523 1
+82 2531 1
+82 2532 1
+82 2533 1
+82 2536 1
+82 2537 1
+82 2538 1
+82 2546 1
+82 2547 1
+82 2548 1
+82 2551 1
+82 2552 1
+82 2553 1
+82 2556 1
+82 2557 1
+82 2567 1
+82 2568 1
+82 2569 1
+82 2577 1
+82 2578 1
+82 2579 1
+82 2587 1
+82 2588 1
+82 2589 1
+82 2592 1
+82 2593 1
+82 2594 1
+82 2602 1
+82 2603 1
+82 2604 1
+82 2607 1
+82 2608 1
+82 2609 1
+82 2612 1
+82 2613 1
+82 2614 1
+82 2615 1
+82 2623 1
+82 2624 1
+82 2625 1
+82 2628 1
+82 2629 1
+82 2630 1
+82 2633 1
+82 2634 1
+82 2635 1
+82 2636 1
+82 2639 1
+82 2640 1
+82 2652 1
+82 2667 1
+82 2677 1
+82 2687 1
+82 2688 1
+82 2689 1
+82 2702 1
+82 2712 1
+82 2722 1
+82 2723 1
+82 2724 1
+82 2732 1
+82 2742 1
+82 2743 1
+82 2744 1
+82 2752 1
+82 2753 1
+82 2754 1
+82 2762 1
+82 2763 1
+82 2764 1
+82 2772 1
+82 2782 1
+82 2792 1
+82 2793 1
+82 2794 1
+82 2802 1
+82 2812 1
+82 2813 1
+82 2814 1
+82 2822 1
+82 2823 1
+82 2824 1
+82 2832 1
+82 2833 1
+82 2834 1
+82 2837 1
+82 2847 1
+82 2848 1
+82 2849 1
+82 2857 1
+82 2858 1
+82 2859 1
+82 2867 1
+82 2868 1
+82 2869 1
+82 2872 1
+82 2873 1
+82 2874 1
+82 2882 1
+82 2883 1
+82 2884 1
+82 2887 1
+82 2888 1
+82 2889 1
+82 2892 1
+82 2898 1
+82 2908 1
+82 2918 1
+82 2919 1
+82 2920 1
+82 2928 1
+82 2938 1
+82 2939 1
+82 2940 1
+82 2948 1
+82 2949 1
+82 2950 1
+82 2958 1
+82 2959 1
+82 2960 1
+82 2963 1
+82 2973 1
+82 2974 1
+82 2975 1
+82 2983 1
+82 2984 1
+82 2985 1
+82 2993 1
+82 2994 1
+82 2995 1
+82 2998 1
+82 2999 1
+82 3000 1
+82 3008 1
+82 3009 1
+82 3010 1
+82 3013 1
+82 3014 1
+82 3015 1
+82 3018 1
+82 3019 1
+82 3029 1
+82 3030 1
+82 3031 1
+82 3039 1
+82 3040 1
+82 3041 1
+82 3049 1
+82 3050 1
+82 3051 1
+82 3054 1
+82 3055 1
+82 3056 1
+82 3064 1
+82 3065 1
+82 3066 1
+82 3069 1
+82 3070 1
+82 3071 1
+82 3074 1
+82 3075 1
+82 3076 1
+82 3077 1
+82 3085 1
+82 3086 1
+82 3087 1
+82 3090 1
+82 3091 1
+82 3092 1
+82 3095 1
+82 3096 1
+82 3097 1
+82 3098 1
+82 3101 1
+82 3102 1
+82 3108 1
+82 3118 1
+82 3128 1
+82 3129 1
+82 3130 1
+82 3138 1
+82 3148 1
+82 3149 1
+82 3150 1
+82 3158 1
+82 3159 1
+82 3160 1
+82 3168 1
+82 3169 1
+82 3170 1
+82 3173 1
+82 3183 1
+82 3184 1
+82 3185 1
+82 3193 1
+82 3194 1
+82 3195 1
+82 3203 1
+82 3204 1
+82 3205 1
+82 3208 1
+82 3209 1
+82 3210 1
+82 3218 1
+82 3219 1
+82 3220 1
+82 3223 1
+82 3224 1
+82 3225 1
+82 3228 1
+82 3229 1
+82 3239 1
+82 3240 1
+82 3241 1
+82 3249 1
+82 3250 1
+82 3251 1
+82 3259 1
+82 3260 1
+82 3261 1
+82 3264 1
+82 3265 1
+82 3266 1
+82 3274 1
+82 3275 1
+82 3276 1
+82 3279 1
+82 3280 1
+82 3281 1
+82 3284 1
+82 3285 1
+82 3286 1
+82 3287 1
+82 3295 1
+82 3296 1
+82 3297 1
+82 3300 1
+82 3301 1
+82 3302 1
+82 3305 1
+82 3306 1
+82 3307 1
+82 3308 1
+82 3311 1
+82 3312 1
+82 3313 1
+82 3323 1
+82 3324 1
+82 3325 1
+82 3333 1
+82 3334 1
+82 3335 1
+82 3343 1
+82 3344 1
+82 3345 1
+82 3348 1
+82 3349 1
+82 3350 1
+82 3358 1
+82 3359 1
+82 3360 1
+82 3363 1
+82 3364 1
+82 3365 1
+82 3368 1
+82 3369 1
+82 3370 1
+82 3371 1
+82 3379 1
+82 3380 1
+82 3381 1
+82 3384 1
+82 3385 1
+82 3386 1
+82 3389 1
+82 3390 1
+82 3391 1
+82 3392 1
+82 3395 1
+82 3396 1
+82 3397 1
+82 3398 1
+82 3399 1
+82 3407 1
+82 3408 1
+82 3409 1
+82 3412 1
+82 3413 1
+82 3414 1
+82 3417 1
+82 3418 1
+82 3419 1
+82 3420 1
+82 3423 1
+82 3424 1
+82 3425 1
+82 3426 1
+82 3427 1
+82 3430 1
+82 3431 1
+82 3432 1
+83 28 1
+83 56 1
+83 77 1
+83 92 1
+83 102 1
+83 111 1
+83 114 1
+83 115 1
+83 140 1
+83 161 1
+83 176 1
+83 186 1
+83 195 1
+83 198 1
+83 199 1
+83 217 1
+83 232 1
+83 242 1
+83 251 1
+83 254 1
+83 255 1
+83 267 1
+83 277 1
+83 286 1
+83 289 1
+83 290 1
+83 297 1
+83 306 1
+83 309 1
+83 310 1
+83 316 1
+83 319 1
+83 320 1
+83 326 1
+83 327 1
+83 329 1
+83 350 1
+83 371 1
+83 386 1
+83 396 1
+83 405 1
+83 408 1
+83 409 1
+83 427 1
+83 442 1
+83 452 1
+83 461 1
+83 464 1
+83 465 1
+83 477 1
+83 487 1
+83 496 1
+83 499 1
+83 500 1
+83 507 1
+83 516 1
+83 519 1
+83 520 1
+83 526 1
+83 529 1
+83 530 1
+83 536 1
+83 537 1
+83 539 1
+83 553 1
+83 568 1
+83 578 1
+83 587 1
+83 590 1
+83 591 1
+83 603 1
+83 613 1
+83 622 1
+83 625 1
+83 626 1
+83 633 1
+83 642 1
+83 645 1
+83 646 1
+83 652 1
+83 655 1
+83 656 1
+83 662 1
+83 663 1
+83 665 1
+83 673 1
+83 683 1
+83 692 1
+83 695 1
+83 696 1
+83 703 1
+83 712 1
+83 715 1
+83 716 1
+83 722 1
+83 725 1
+83 726 1
+83 732 1
+83 733 1
+83 735 1
+83 738 1
+83 747 1
+83 750 1
+83 751 1
+83 757 1
+83 760 1
+83 761 1
+83 767 1
+83 768 1
+83 770 1
+83 772 1
+83 775 1
+83 776 1
+83 782 1
+83 783 1
+83 785 1
+83 787 1
+83 788 1
+83 790 1
+83 792 1
+83 812 1
+83 833 1
+83 848 1
+83 858 1
+83 867 1
+83 870 1
+83 871 1
+83 889 1
+83 904 1
+83 914 1
+83 923 1
+83 926 1
+83 927 1
+83 939 1
+83 949 1
+83 958 1
+83 961 1
+83 962 1
+83 969 1
+83 978 1
+83 981 1
+83 982 1
+83 988 1
+83 991 1
+83 992 1
+83 998 1
+83 999 1
+83 1001 1
+83 1015 1
+83 1030 1
+83 1040 1
+83 1049 1
+83 1052 1
+83 1053 1
+83 1065 1
+83 1075 1
+83 1084 1
+83 1087 1
+83 1088 1
+83 1095 1
+83 1104 1
+83 1107 1
+83 1108 1
+83 1114 1
+83 1117 1
+83 1118 1
+83 1124 1
+83 1125 1
+83 1127 1
+83 1135 1
+83 1145 1
+83 1154 1
+83 1157 1
+83 1158 1
+83 1165 1
+83 1174 1
+83 1177 1
+83 1178 1
+83 1184 1
+83 1187 1
+83 1188 1
+83 1194 1
+83 1195 1
+83 1197 1
+83 1200 1
+83 1209 1
+83 1212 1
+83 1213 1
+83 1219 1
+83 1222 1
+83 1223 1
+83 1229 1
+83 1230 1
+83 1232 1
+83 1234 1
+83 1237 1
+83 1238 1
+83 1244 1
+83 1245 1
+83 1247 1
+83 1249 1
+83 1250 1
+83 1252 1
+83 1254 1
+83 1267 1
+83 1282 1
+83 1292 1
+83 1301 1
+83 1304 1
+83 1305 1
+83 1317 1
+83 1327 1
+83 1336 1
+83 1339 1
+83 1340 1
+83 1347 1
+83 1356 1
+83 1359 1
+83 1360 1
+83 1366 1
+83 1369 1
+83 1370 1
+83 1376 1
+83 1377 1
+83 1379 1
+83 1387 1
+83 1397 1
+83 1406 1
+83 1409 1
+83 1410 1
+83 1417 1
+83 1426 1
+83 1429 1
+83 1430 1
+83 1436 1
+83 1439 1
+83 1440 1
+83 1446 1
+83 1447 1
+83 1449 1
+83 1452 1
+83 1461 1
+83 1464 1
+83 1465 1
+83 1471 1
+83 1474 1
+83 1475 1
+83 1481 1
+83 1482 1
+83 1484 1
+83 1486 1
+83 1489 1
+83 1490 1
+83 1496 1
+83 1497 1
+83 1499 1
+83 1501 1
+83 1502 1
+83 1504 1
+83 1506 1
+83 1513 1
+83 1523 1
+83 1532 1
+83 1535 1
+83 1536 1
+83 1543 1
+83 1552 1
+83 1555 1
+83 1556 1
+83 1562 1
+83 1565 1
+83 1566 1
+83 1572 1
+83 1573 1
+83 1575 1
+83 1578 1
+83 1587 1
+83 1590 1
+83 1591 1
+83 1597 1
+83 1600 1
+83 1601 1
+83 1607 1
+83 1608 1
+83 1610 1
+83 1612 1
+83 1615 1
+83 1616 1
+83 1622 1
+83 1623 1
+83 1625 1
+83 1627 1
+83 1628 1
+83 1630 1
+83 1632 1
+83 1634 1
+83 1643 1
+83 1646 1
+83 1647 1
+83 1653 1
+83 1656 1
+83 1657 1
+83 1663 1
+83 1664 1
+83 1666 1
+83 1668 1
+83 1671 1
+83 1672 1
+83 1678 1
+83 1679 1
+83 1681 1
+83 1683 1
+83 1684 1
+83 1686 1
+83 1688 1
+83 1689 1
+83 1692 1
+83 1693 1
+83 1699 1
+83 1700 1
+83 1702 1
+83 1704 1
+83 1705 1
+83 1707 1
+83 1709 1
+83 1710 1
+83 1711 1
+83 1713 1
+83 1715 1
+83 1716 1
+83 1736 1
+83 1757 1
+83 1772 1
+83 1782 1
+83 1791 1
+83 1794 1
+83 1795 1
+83 1813 1
+83 1828 1
+83 1838 1
+83 1847 1
+83 1850 1
+83 1851 1
+83 1863 1
+83 1873 1
+83 1882 1
+83 1885 1
+83 1886 1
+83 1893 1
+83 1902 1
+83 1905 1
+83 1906 1
+83 1912 1
+83 1915 1
+83 1916 1
+83 1922 1
+83 1923 1
+83 1925 1
+83 1939 1
+83 1954 1
+83 1964 1
+83 1973 1
+83 1976 1
+83 1977 1
+83 1989 1
+83 1999 1
+83 2008 1
+83 2011 1
+83 2012 1
+83 2019 1
+83 2028 1
+83 2031 1
+83 2032 1
+83 2038 1
+83 2041 1
+83 2042 1
+83 2048 1
+83 2049 1
+83 2051 1
+83 2059 1
+83 2069 1
+83 2078 1
+83 2081 1
+83 2082 1
+83 2089 1
+83 2098 1
+83 2101 1
+83 2102 1
+83 2108 1
+83 2111 1
+83 2112 1
+83 2118 1
+83 2119 1
+83 2121 1
+83 2124 1
+83 2133 1
+83 2136 1
+83 2137 1
+83 2143 1
+83 2146 1
+83 2147 1
+83 2153 1
+83 2154 1
+83 2156 1
+83 2158 1
+83 2161 1
+83 2162 1
+83 2168 1
+83 2169 1
+83 2171 1
+83 2173 1
+83 2174 1
+83 2176 1
+83 2178 1
+83 2191 1
+83 2206 1
+83 2216 1
+83 2225 1
+83 2228 1
+83 2229 1
+83 2241 1
+83 2251 1
+83 2260 1
+83 2263 1
+83 2264 1
+83 2271 1
+83 2280 1
+83 2283 1
+83 2284 1
+83 2290 1
+83 2293 1
+83 2294 1
+83 2300 1
+83 2301 1
+83 2303 1
+83 2311 1
+83 2321 1
+83 2330 1
+83 2333 1
+83 2334 1
+83 2341 1
+83 2350 1
+83 2353 1
+83 2354 1
+83 2360 1
+83 2363 1
+83 2364 1
+83 2370 1
+83 2371 1
+83 2373 1
+83 2376 1
+83 2385 1
+83 2388 1
+83 2389 1
+83 2395 1
+83 2398 1
+83 2399 1
+83 2405 1
+83 2406 1
+83 2408 1
+83 2410 1
+83 2413 1
+83 2414 1
+83 2420 1
+83 2421 1
+83 2423 1
+83 2425 1
+83 2426 1
+83 2428 1
+83 2430 1
+83 2437 1
+83 2447 1
+83 2456 1
+83 2459 1
+83 2460 1
+83 2467 1
+83 2476 1
+83 2479 1
+83 2480 1
+83 2486 1
+83 2489 1
+83 2490 1
+83 2496 1
+83 2497 1
+83 2499 1
+83 2502 1
+83 2511 1
+83 2514 1
+83 2515 1
+83 2521 1
+83 2524 1
+83 2525 1
+83 2531 1
+83 2532 1
+83 2534 1
+83 2536 1
+83 2539 1
+83 2540 1
+83 2546 1
+83 2547 1
+83 2549 1
+83 2551 1
+83 2552 1
+83 2554 1
+83 2556 1
+83 2558 1
+83 2567 1
+83 2570 1
+83 2571 1
+83 2577 1
+83 2580 1
+83 2581 1
+83 2587 1
+83 2588 1
+83 2590 1
+83 2592 1
+83 2595 1
+83 2596 1
+83 2602 1
+83 2603 1
+83 2605 1
+83 2607 1
+83 2608 1
+83 2610 1
+83 2612 1
+83 2613 1
+83 2616 1
+83 2617 1
+83 2623 1
+83 2624 1
+83 2626 1
+83 2628 1
+83 2629 1
+83 2631 1
+83 2633 1
+83 2634 1
+83 2635 1
+83 2637 1
+83 2639 1
+83 2640 1
+83 2653 1
+83 2668 1
+83 2678 1
+83 2687 1
+83 2690 1
+83 2691 1
+83 2703 1
+83 2713 1
+83 2722 1
+83 2725 1
+83 2726 1
+83 2733 1
+83 2742 1
+83 2745 1
+83 2746 1
+83 2752 1
+83 2755 1
+83 2756 1
+83 2762 1
+83 2763 1
+83 2765 1
+83 2773 1
+83 2783 1
+83 2792 1
+83 2795 1
+83 2796 1
+83 2803 1
+83 2812 1
+83 2815 1
+83 2816 1
+83 2822 1
+83 2825 1
+83 2826 1
+83 2832 1
+83 2833 1
+83 2835 1
+83 2838 1
+83 2847 1
+83 2850 1
+83 2851 1
+83 2857 1
+83 2860 1
+83 2861 1
+83 2867 1
+83 2868 1
+83 2870 1
+83 2872 1
+83 2875 1
+83 2876 1
+83 2882 1
+83 2883 1
+83 2885 1
+83 2887 1
+83 2888 1
+83 2890 1
+83 2892 1
+83 2899 1
+83 2909 1
+83 2918 1
+83 2921 1
+83 2922 1
+83 2929 1
+83 2938 1
+83 2941 1
+83 2942 1
+83 2948 1
+83 2951 1
+83 2952 1
+83 2958 1
+83 2959 1
+83 2961 1
+83 2964 1
+83 2973 1
+83 2976 1
+83 2977 1
+83 2983 1
+83 2986 1
+83 2987 1
+83 2993 1
+83 2994 1
+83 2996 1
+83 2998 1
+83 3001 1
+83 3002 1
+83 3008 1
+83 3009 1
+83 3011 1
+83 3013 1
+83 3014 1
+83 3016 1
+83 3018 1
+83 3020 1
+83 3029 1
+83 3032 1
+83 3033 1
+83 3039 1
+83 3042 1
+83 3043 1
+83 3049 1
+83 3050 1
+83 3052 1
+83 3054 1
+83 3057 1
+83 3058 1
+83 3064 1
+83 3065 1
+83 3067 1
+83 3069 1
+83 3070 1
+83 3072 1
+83 3074 1
+83 3075 1
+83 3078 1
+83 3079 1
+83 3085 1
+83 3086 1
+83 3088 1
+83 3090 1
+83 3091 1
+83 3093 1
+83 3095 1
+83 3096 1
+83 3097 1
+83 3099 1
+83 3101 1
+83 3102 1
+83 3109 1
+83 3119 1
+83 3128 1
+83 3131 1
+83 3132 1
+83 3139 1
+83 3148 1
+83 3151 1
+83 3152 1
+83 3158 1
+83 3161 1
+83 3162 1
+83 3168 1
+83 3169 1
+83 3171 1
+83 3174 1
+83 3183 1
+83 3186 1
+83 3187 1
+83 3193 1
+83 3196 1
+83 3197 1
+83 3203 1
+83 3204 1
+83 3206 1
+83 3208 1
+83 3211 1
+83 3212 1
+83 3218 1
+83 3219 1
+83 3221 1
+83 3223 1
+83 3224 1
+83 3226 1
+83 3228 1
+83 3230 1
+83 3239 1
+83 3242 1
+83 3243 1
+83 3249 1
+83 3252 1
+83 3253 1
+83 3259 1
+83 3260 1
+83 3262 1
+83 3264 1
+83 3267 1
+83 3268 1
+83 3274 1
+83 3275 1
+83 3277 1
+83 3279 1
+83 3280 1
+83 3282 1
+83 3284 1
+83 3285 1
+83 3288 1
+83 3289 1
+83 3295 1
+83 3296 1
+83 3298 1
+83 3300 1
+83 3301 1
+83 3303 1
+83 3305 1
+83 3306 1
+83 3307 1
+83 3309 1
+83 3311 1
+83 3312 1
+83 3314 1
+83 3323 1
+83 3326 1
+83 3327 1
+83 3333 1
+83 3336 1
+83 3337 1
+83 3343 1
+83 3344 1
+83 3346 1
+83 3348 1
+83 3351 1
+83 3352 1
+83 3358 1
+83 3359 1
+83 3361 1
+83 3363 1
+83 3364 1
+83 3366 1
+83 3368 1
+83 3369 1
+83 3372 1
+83 3373 1
+83 3379 1
+83 3380 1
+83 3382 1
+83 3384 1
+83 3385 1
+83 3387 1
+83 3389 1
+83 3390 1
+83 3391 1
+83 3393 1
+83 3395 1
+83 3396 1
+83 3397 1
+83 3400 1
+83 3401 1
+83 3407 1
+83 3408 1
+83 3410 1
+83 3412 1
+83 3413 1
+83 3415 1
+83 3417 1
+83 3418 1
+83 3419 1
+83 3421 1
+83 3423 1
+83 3424 1
+83 3425 1
+83 3426 1
+83 3428 1
+83 3430 1
+83 3431 1
+83 3432 1
+84 29 1
+84 57 1
+84 78 1
+84 93 1
+84 103 1
+84 112 1
+84 114 1
+84 116 1
+84 141 1
+84 162 1
+84 177 1
+84 187 1
+84 196 1
+84 198 1
+84 200 1
+84 218 1
+84 233 1
+84 243 1
+84 252 1
+84 254 1
+84 256 1
+84 268 1
+84 278 1
+84 287 1
+84 289 1
+84 291 1
+84 298 1
+84 307 1
+84 309 1
+84 311 1
+84 317 1
+84 319 1
+84 321 1
+84 326 1
+84 328 1
+84 329 1
+84 351 1
+84 372 1
+84 387 1
+84 397 1
+84 406 1
+84 408 1
+84 410 1
+84 428 1
+84 443 1
+84 453 1
+84 462 1
+84 464 1
+84 466 1
+84 478 1
+84 488 1
+84 497 1
+84 499 1
+84 501 1
+84 508 1
+84 517 1
+84 519 1
+84 521 1
+84 527 1
+84 529 1
+84 531 1
+84 536 1
+84 538 1
+84 539 1
+84 554 1
+84 569 1
+84 579 1
+84 588 1
+84 590 1
+84 592 1
+84 604 1
+84 614 1
+84 623 1
+84 625 1
+84 627 1
+84 634 1
+84 643 1
+84 645 1
+84 647 1
+84 653 1
+84 655 1
+84 657 1
+84 662 1
+84 664 1
+84 665 1
+84 674 1
+84 684 1
+84 693 1
+84 695 1
+84 697 1
+84 704 1
+84 713 1
+84 715 1
+84 717 1
+84 723 1
+84 725 1
+84 727 1
+84 732 1
+84 734 1
+84 735 1
+84 739 1
+84 748 1
+84 750 1
+84 752 1
+84 758 1
+84 760 1
+84 762 1
+84 767 1
+84 769 1
+84 770 1
+84 773 1
+84 775 1
+84 777 1
+84 782 1
+84 784 1
+84 785 1
+84 787 1
+84 789 1
+84 790 1
+84 792 1
+84 813 1
+84 834 1
+84 849 1
+84 859 1
+84 868 1
+84 870 1
+84 872 1
+84 890 1
+84 905 1
+84 915 1
+84 924 1
+84 926 1
+84 928 1
+84 940 1
+84 950 1
+84 959 1
+84 961 1
+84 963 1
+84 970 1
+84 979 1
+84 981 1
+84 983 1
+84 989 1
+84 991 1
+84 993 1
+84 998 1
+84 1000 1
+84 1001 1
+84 1016 1
+84 1031 1
+84 1041 1
+84 1050 1
+84 1052 1
+84 1054 1
+84 1066 1
+84 1076 1
+84 1085 1
+84 1087 1
+84 1089 1
+84 1096 1
+84 1105 1
+84 1107 1
+84 1109 1
+84 1115 1
+84 1117 1
+84 1119 1
+84 1124 1
+84 1126 1
+84 1127 1
+84 1136 1
+84 1146 1
+84 1155 1
+84 1157 1
+84 1159 1
+84 1166 1
+84 1175 1
+84 1177 1
+84 1179 1
+84 1185 1
+84 1187 1
+84 1189 1
+84 1194 1
+84 1196 1
+84 1197 1
+84 1201 1
+84 1210 1
+84 1212 1
+84 1214 1
+84 1220 1
+84 1222 1
+84 1224 1
+84 1229 1
+84 1231 1
+84 1232 1
+84 1235 1
+84 1237 1
+84 1239 1
+84 1244 1
+84 1246 1
+84 1247 1
+84 1249 1
+84 1251 1
+84 1252 1
+84 1254 1
+84 1268 1
+84 1283 1
+84 1293 1
+84 1302 1
+84 1304 1
+84 1306 1
+84 1318 1
+84 1328 1
+84 1337 1
+84 1339 1
+84 1341 1
+84 1348 1
+84 1357 1
+84 1359 1
+84 1361 1
+84 1367 1
+84 1369 1
+84 1371 1
+84 1376 1
+84 1378 1
+84 1379 1
+84 1388 1
+84 1398 1
+84 1407 1
+84 1409 1
+84 1411 1
+84 1418 1
+84 1427 1
+84 1429 1
+84 1431 1
+84 1437 1
+84 1439 1
+84 1441 1
+84 1446 1
+84 1448 1
+84 1449 1
+84 1453 1
+84 1462 1
+84 1464 1
+84 1466 1
+84 1472 1
+84 1474 1
+84 1476 1
+84 1481 1
+84 1483 1
+84 1484 1
+84 1487 1
+84 1489 1
+84 1491 1
+84 1496 1
+84 1498 1
+84 1499 1
+84 1501 1
+84 1503 1
+84 1504 1
+84 1506 1
+84 1514 1
+84 1524 1
+84 1533 1
+84 1535 1
+84 1537 1
+84 1544 1
+84 1553 1
+84 1555 1
+84 1557 1
+84 1563 1
+84 1565 1
+84 1567 1
+84 1572 1
+84 1574 1
+84 1575 1
+84 1579 1
+84 1588 1
+84 1590 1
+84 1592 1
+84 1598 1
+84 1600 1
+84 1602 1
+84 1607 1
+84 1609 1
+84 1610 1
+84 1613 1
+84 1615 1
+84 1617 1
+84 1622 1
+84 1624 1
+84 1625 1
+84 1627 1
+84 1629 1
+84 1630 1
+84 1632 1
+84 1635 1
+84 1644 1
+84 1646 1
+84 1648 1
+84 1654 1
+84 1656 1
+84 1658 1
+84 1663 1
+84 1665 1
+84 1666 1
+84 1669 1
+84 1671 1
+84 1673 1
+84 1678 1
+84 1680 1
+84 1681 1
+84 1683 1
+84 1685 1
+84 1686 1
+84 1688 1
+84 1690 1
+84 1692 1
+84 1694 1
+84 1699 1
+84 1701 1
+84 1702 1
+84 1704 1
+84 1706 1
+84 1707 1
+84 1709 1
+84 1710 1
+84 1712 1
+84 1713 1
+84 1715 1
+84 1716 1
+84 1737 1
+84 1758 1
+84 1773 1
+84 1783 1
+84 1792 1
+84 1794 1
+84 1796 1
+84 1814 1
+84 1829 1
+84 1839 1
+84 1848 1
+84 1850 1
+84 1852 1
+84 1864 1
+84 1874 1
+84 1883 1
+84 1885 1
+84 1887 1
+84 1894 1
+84 1903 1
+84 1905 1
+84 1907 1
+84 1913 1
+84 1915 1
+84 1917 1
+84 1922 1
+84 1924 1
+84 1925 1
+84 1940 1
+84 1955 1
+84 1965 1
+84 1974 1
+84 1976 1
+84 1978 1
+84 1990 1
+84 2000 1
+84 2009 1
+84 2011 1
+84 2013 1
+84 2020 1
+84 2029 1
+84 2031 1
+84 2033 1
+84 2039 1
+84 2041 1
+84 2043 1
+84 2048 1
+84 2050 1
+84 2051 1
+84 2060 1
+84 2070 1
+84 2079 1
+84 2081 1
+84 2083 1
+84 2090 1
+84 2099 1
+84 2101 1
+84 2103 1
+84 2109 1
+84 2111 1
+84 2113 1
+84 2118 1
+84 2120 1
+84 2121 1
+84 2125 1
+84 2134 1
+84 2136 1
+84 2138 1
+84 2144 1
+84 2146 1
+84 2148 1
+84 2153 1
+84 2155 1
+84 2156 1
+84 2159 1
+84 2161 1
+84 2163 1
+84 2168 1
+84 2170 1
+84 2171 1
+84 2173 1
+84 2175 1
+84 2176 1
+84 2178 1
+84 2192 1
+84 2207 1
+84 2217 1
+84 2226 1
+84 2228 1
+84 2230 1
+84 2242 1
+84 2252 1
+84 2261 1
+84 2263 1
+84 2265 1
+84 2272 1
+84 2281 1
+84 2283 1
+84 2285 1
+84 2291 1
+84 2293 1
+84 2295 1
+84 2300 1
+84 2302 1
+84 2303 1
+84 2312 1
+84 2322 1
+84 2331 1
+84 2333 1
+84 2335 1
+84 2342 1
+84 2351 1
+84 2353 1
+84 2355 1
+84 2361 1
+84 2363 1
+84 2365 1
+84 2370 1
+84 2372 1
+84 2373 1
+84 2377 1
+84 2386 1
+84 2388 1
+84 2390 1
+84 2396 1
+84 2398 1
+84 2400 1
+84 2405 1
+84 2407 1
+84 2408 1
+84 2411 1
+84 2413 1
+84 2415 1
+84 2420 1
+84 2422 1
+84 2423 1
+84 2425 1
+84 2427 1
+84 2428 1
+84 2430 1
+84 2438 1
+84 2448 1
+84 2457 1
+84 2459 1
+84 2461 1
+84 2468 1
+84 2477 1
+84 2479 1
+84 2481 1
+84 2487 1
+84 2489 1
+84 2491 1
+84 2496 1
+84 2498 1
+84 2499 1
+84 2503 1
+84 2512 1
+84 2514 1
+84 2516 1
+84 2522 1
+84 2524 1
+84 2526 1
+84 2531 1
+84 2533 1
+84 2534 1
+84 2537 1
+84 2539 1
+84 2541 1
+84 2546 1
+84 2548 1
+84 2549 1
+84 2551 1
+84 2553 1
+84 2554 1
+84 2556 1
+84 2559 1
+84 2568 1
+84 2570 1
+84 2572 1
+84 2578 1
+84 2580 1
+84 2582 1
+84 2587 1
+84 2589 1
+84 2590 1
+84 2593 1
+84 2595 1
+84 2597 1
+84 2602 1
+84 2604 1
+84 2605 1
+84 2607 1
+84 2609 1
+84 2610 1
+84 2612 1
+84 2614 1
+84 2616 1
+84 2618 1
+84 2623 1
+84 2625 1
+84 2626 1
+84 2628 1
+84 2630 1
+84 2631 1
+84 2633 1
+84 2634 1
+84 2636 1
+84 2637 1
+84 2639 1
+84 2640 1
+84 2654 1
+84 2669 1
+84 2679 1
+84 2688 1
+84 2690 1
+84 2692 1
+84 2704 1
+84 2714 1
+84 2723 1
+84 2725 1
+84 2727 1
+84 2734 1
+84 2743 1
+84 2745 1
+84 2747 1
+84 2753 1
+84 2755 1
+84 2757 1
+84 2762 1
+84 2764 1
+84 2765 1
+84 2774 1
+84 2784 1
+84 2793 1
+84 2795 1
+84 2797 1
+84 2804 1
+84 2813 1
+84 2815 1
+84 2817 1
+84 2823 1
+84 2825 1
+84 2827 1
+84 2832 1
+84 2834 1
+84 2835 1
+84 2839 1
+84 2848 1
+84 2850 1
+84 2852 1
+84 2858 1
+84 2860 1
+84 2862 1
+84 2867 1
+84 2869 1
+84 2870 1
+84 2873 1
+84 2875 1
+84 2877 1
+84 2882 1
+84 2884 1
+84 2885 1
+84 2887 1
+84 2889 1
+84 2890 1
+84 2892 1
+84 2900 1
+84 2910 1
+84 2919 1
+84 2921 1
+84 2923 1
+84 2930 1
+84 2939 1
+84 2941 1
+84 2943 1
+84 2949 1
+84 2951 1
+84 2953 1
+84 2958 1
+84 2960 1
+84 2961 1
+84 2965 1
+84 2974 1
+84 2976 1
+84 2978 1
+84 2984 1
+84 2986 1
+84 2988 1
+84 2993 1
+84 2995 1
+84 2996 1
+84 2999 1
+84 3001 1
+84 3003 1
+84 3008 1
+84 3010 1
+84 3011 1
+84 3013 1
+84 3015 1
+84 3016 1
+84 3018 1
+84 3021 1
+84 3030 1
+84 3032 1
+84 3034 1
+84 3040 1
+84 3042 1
+84 3044 1
+84 3049 1
+84 3051 1
+84 3052 1
+84 3055 1
+84 3057 1
+84 3059 1
+84 3064 1
+84 3066 1
+84 3067 1
+84 3069 1
+84 3071 1
+84 3072 1
+84 3074 1
+84 3076 1
+84 3078 1
+84 3080 1
+84 3085 1
+84 3087 1
+84 3088 1
+84 3090 1
+84 3092 1
+84 3093 1
+84 3095 1
+84 3096 1
+84 3098 1
+84 3099 1
+84 3101 1
+84 3102 1
+84 3110 1
+84 3120 1
+84 3129 1
+84 3131 1
+84 3133 1
+84 3140 1
+84 3149 1
+84 3151 1
+84 3153 1
+84 3159 1
+84 3161 1
+84 3163 1
+84 3168 1
+84 3170 1
+84 3171 1
+84 3175 1
+84 3184 1
+84 3186 1
+84 3188 1
+84 3194 1
+84 3196 1
+84 3198 1
+84 3203 1
+84 3205 1
+84 3206 1
+84 3209 1
+84 3211 1
+84 3213 1
+84 3218 1
+84 3220 1
+84 3221 1
+84 3223 1
+84 3225 1
+84 3226 1
+84 3228 1
+84 3231 1
+84 3240 1
+84 3242 1
+84 3244 1
+84 3250 1
+84 3252 1
+84 3254 1
+84 3259 1
+84 3261 1
+84 3262 1
+84 3265 1
+84 3267 1
+84 3269 1
+84 3274 1
+84 3276 1
+84 3277 1
+84 3279 1
+84 3281 1
+84 3282 1
+84 3284 1
+84 3286 1
+84 3288 1
+84 3290 1
+84 3295 1
+84 3297 1
+84 3298 1
+84 3300 1
+84 3302 1
+84 3303 1
+84 3305 1
+84 3306 1
+84 3308 1
+84 3309 1
+84 3311 1
+84 3312 1
+84 3315 1
+84 3324 1
+84 3326 1
+84 3328 1
+84 3334 1
+84 3336 1
+84 3338 1
+84 3343 1
+84 3345 1
+84 3346 1
+84 3349 1
+84 3351 1
+84 3353 1
+84 3358 1
+84 3360 1
+84 3361 1
+84 3363 1
+84 3365 1
+84 3366 1
+84 3368 1
+84 3370 1
+84 3372 1
+84 3374 1
+84 3379 1
+84 3381 1
+84 3382 1
+84 3384 1
+84 3386 1
+84 3387 1
+84 3389 1
+84 3390 1
+84 3392 1
+84 3393 1
+84 3395 1
+84 3396 1
+84 3398 1
+84 3400 1
+84 3402 1
+84 3407 1
+84 3409 1
+84 3410 1
+84 3412 1
+84 3414 1
+84 3415 1
+84 3417 1
+84 3418 1
+84 3420 1
+84 3421 1
+84 3423 1
+84 3424 1
+84 3425 1
+84 3427 1
+84 3428 1
+84 3430 1
+84 3431 1
+84 3432 1
+85 30 1
+85 58 1
+85 79 1
+85 94 1
+85 104 1
+85 113 1
+85 115 1
+85 116 1
+85 142 1
+85 163 1
+85 178 1
+85 188 1
+85 197 1
+85 199 1
+85 200 1
+85 219 1
+85 234 1
+85 244 1
+85 253 1
+85 255 1
+85 256 1
+85 269 1
+85 279 1
+85 288 1
+85 290 1
+85 291 1
+85 299 1
+85 308 1
+85 310 1
+85 311 1
+85 318 1
+85 320 1
+85 321 1
+85 327 1
+85 328 1
+85 329 1
+85 352 1
+85 373 1
+85 388 1
+85 398 1
+85 407 1
+85 409 1
+85 410 1
+85 429 1
+85 444 1
+85 454 1
+85 463 1
+85 465 1
+85 466 1
+85 479 1
+85 489 1
+85 498 1
+85 500 1
+85 501 1
+85 509 1
+85 518 1
+85 520 1
+85 521 1
+85 528 1
+85 530 1
+85 531 1
+85 537 1
+85 538 1
+85 539 1
+85 555 1
+85 570 1
+85 580 1
+85 589 1
+85 591 1
+85 592 1
+85 605 1
+85 615 1
+85 624 1
+85 626 1
+85 627 1
+85 635 1
+85 644 1
+85 646 1
+85 647 1
+85 654 1
+85 656 1
+85 657 1
+85 663 1
+85 664 1
+85 665 1
+85 675 1
+85 685 1
+85 694 1
+85 696 1
+85 697 1
+85 705 1
+85 714 1
+85 716 1
+85 717 1
+85 724 1
+85 726 1
+85 727 1
+85 733 1
+85 734 1
+85 735 1
+85 740 1
+85 749 1
+85 751 1
+85 752 1
+85 759 1
+85 761 1
+85 762 1
+85 768 1
+85 769 1
+85 770 1
+85 774 1
+85 776 1
+85 777 1
+85 783 1
+85 784 1
+85 785 1
+85 788 1
+85 789 1
+85 790 1
+85 792 1
+85 814 1
+85 835 1
+85 850 1
+85 860 1
+85 869 1
+85 871 1
+85 872 1
+85 891 1
+85 906 1
+85 916 1
+85 925 1
+85 927 1
+85 928 1
+85 941 1
+85 951 1
+85 960 1
+85 962 1
+85 963 1
+85 971 1
+85 980 1
+85 982 1
+85 983 1
+85 990 1
+85 992 1
+85 993 1
+85 999 1
+85 1000 1
+85 1001 1
+85 1017 1
+85 1032 1
+85 1042 1
+85 1051 1
+85 1053 1
+85 1054 1
+85 1067 1
+85 1077 1
+85 1086 1
+85 1088 1
+85 1089 1
+85 1097 1
+85 1106 1
+85 1108 1
+85 1109 1
+85 1116 1
+85 1118 1
+85 1119 1
+85 1125 1
+85 1126 1
+85 1127 1
+85 1137 1
+85 1147 1
+85 1156 1
+85 1158 1
+85 1159 1
+85 1167 1
+85 1176 1
+85 1178 1
+85 1179 1
+85 1186 1
+85 1188 1
+85 1189 1
+85 1195 1
+85 1196 1
+85 1197 1
+85 1202 1
+85 1211 1
+85 1213 1
+85 1214 1
+85 1221 1
+85 1223 1
+85 1224 1
+85 1230 1
+85 1231 1
+85 1232 1
+85 1236 1
+85 1238 1
+85 1239 1
+85 1245 1
+85 1246 1
+85 1247 1
+85 1250 1
+85 1251 1
+85 1252 1
+85 1254 1
+85 1269 1
+85 1284 1
+85 1294 1
+85 1303 1
+85 1305 1
+85 1306 1
+85 1319 1
+85 1329 1
+85 1338 1
+85 1340 1
+85 1341 1
+85 1349 1
+85 1358 1
+85 1360 1
+85 1361 1
+85 1368 1
+85 1370 1
+85 1371 1
+85 1377 1
+85 1378 1
+85 1379 1
+85 1389 1
+85 1399 1
+85 1408 1
+85 1410 1
+85 1411 1
+85 1419 1
+85 1428 1
+85 1430 1
+85 1431 1
+85 1438 1
+85 1440 1
+85 1441 1
+85 1447 1
+85 1448 1
+85 1449 1
+85 1454 1
+85 1463 1
+85 1465 1
+85 1466 1
+85 1473 1
+85 1475 1
+85 1476 1
+85 1482 1
+85 1483 1
+85 1484 1
+85 1488 1
+85 1490 1
+85 1491 1
+85 1497 1
+85 1498 1
+85 1499 1
+85 1502 1
+85 1503 1
+85 1504 1
+85 1506 1
+85 1515 1
+85 1525 1
+85 1534 1
+85 1536 1
+85 1537 1
+85 1545 1
+85 1554 1
+85 1556 1
+85 1557 1
+85 1564 1
+85 1566 1
+85 1567 1
+85 1573 1
+85 1574 1
+85 1575 1
+85 1580 1
+85 1589 1
+85 1591 1
+85 1592 1
+85 1599 1
+85 1601 1
+85 1602 1
+85 1608 1
+85 1609 1
+85 1610 1
+85 1614 1
+85 1616 1
+85 1617 1
+85 1623 1
+85 1624 1
+85 1625 1
+85 1628 1
+85 1629 1
+85 1630 1
+85 1632 1
+85 1636 1
+85 1645 1
+85 1647 1
+85 1648 1
+85 1655 1
+85 1657 1
+85 1658 1
+85 1664 1
+85 1665 1
+85 1666 1
+85 1670 1
+85 1672 1
+85 1673 1
+85 1679 1
+85 1680 1
+85 1681 1
+85 1684 1
+85 1685 1
+85 1686 1
+85 1688 1
+85 1691 1
+85 1693 1
+85 1694 1
+85 1700 1
+85 1701 1
+85 1702 1
+85 1705 1
+85 1706 1
+85 1707 1
+85 1709 1
+85 1711 1
+85 1712 1
+85 1713 1
+85 1715 1
+85 1716 1
+85 1738 1
+85 1759 1
+85 1774 1
+85 1784 1
+85 1793 1
+85 1795 1
+85 1796 1
+85 1815 1
+85 1830 1
+85 1840 1
+85 1849 1
+85 1851 1
+85 1852 1
+85 1865 1
+85 1875 1
+85 1884 1
+85 1886 1
+85 1887 1
+85 1895 1
+85 1904 1
+85 1906 1
+85 1907 1
+85 1914 1
+85 1916 1
+85 1917 1
+85 1923 1
+85 1924 1
+85 1925 1
+85 1941 1
+85 1956 1
+85 1966 1
+85 1975 1
+85 1977 1
+85 1978 1
+85 1991 1
+85 2001 1
+85 2010 1
+85 2012 1
+85 2013 1
+85 2021 1
+85 2030 1
+85 2032 1
+85 2033 1
+85 2040 1
+85 2042 1
+85 2043 1
+85 2049 1
+85 2050 1
+85 2051 1
+85 2061 1
+85 2071 1
+85 2080 1
+85 2082 1
+85 2083 1
+85 2091 1
+85 2100 1
+85 2102 1
+85 2103 1
+85 2110 1
+85 2112 1
+85 2113 1
+85 2119 1
+85 2120 1
+85 2121 1
+85 2126 1
+85 2135 1
+85 2137 1
+85 2138 1
+85 2145 1
+85 2147 1
+85 2148 1
+85 2154 1
+85 2155 1
+85 2156 1
+85 2160 1
+85 2162 1
+85 2163 1
+85 2169 1
+85 2170 1
+85 2171 1
+85 2174 1
+85 2175 1
+85 2176 1
+85 2178 1
+85 2193 1
+85 2208 1
+85 2218 1
+85 2227 1
+85 2229 1
+85 2230 1
+85 2243 1
+85 2253 1
+85 2262 1
+85 2264 1
+85 2265 1
+85 2273 1
+85 2282 1
+85 2284 1
+85 2285 1
+85 2292 1
+85 2294 1
+85 2295 1
+85 2301 1
+85 2302 1
+85 2303 1
+85 2313 1
+85 2323 1
+85 2332 1
+85 2334 1
+85 2335 1
+85 2343 1
+85 2352 1
+85 2354 1
+85 2355 1
+85 2362 1
+85 2364 1
+85 2365 1
+85 2371 1
+85 2372 1
+85 2373 1
+85 2378 1
+85 2387 1
+85 2389 1
+85 2390 1
+85 2397 1
+85 2399 1
+85 2400 1
+85 2406 1
+85 2407 1
+85 2408 1
+85 2412 1
+85 2414 1
+85 2415 1
+85 2421 1
+85 2422 1
+85 2423 1
+85 2426 1
+85 2427 1
+85 2428 1
+85 2430 1
+85 2439 1
+85 2449 1
+85 2458 1
+85 2460 1
+85 2461 1
+85 2469 1
+85 2478 1
+85 2480 1
+85 2481 1
+85 2488 1
+85 2490 1
+85 2491 1
+85 2497 1
+85 2498 1
+85 2499 1
+85 2504 1
+85 2513 1
+85 2515 1
+85 2516 1
+85 2523 1
+85 2525 1
+85 2526 1
+85 2532 1
+85 2533 1
+85 2534 1
+85 2538 1
+85 2540 1
+85 2541 1
+85 2547 1
+85 2548 1
+85 2549 1
+85 2552 1
+85 2553 1
+85 2554 1
+85 2556 1
+85 2560 1
+85 2569 1
+85 2571 1
+85 2572 1
+85 2579 1
+85 2581 1
+85 2582 1
+85 2588 1
+85 2589 1
+85 2590 1
+85 2594 1
+85 2596 1
+85 2597 1
+85 2603 1
+85 2604 1
+85 2605 1
+85 2608 1
+85 2609 1
+85 2610 1
+85 2612 1
+85 2615 1
+85 2617 1
+85 2618 1
+85 2624 1
+85 2625 1
+85 2626 1
+85 2629 1
+85 2630 1
+85 2631 1
+85 2633 1
+85 2635 1
+85 2636 1
+85 2637 1
+85 2639 1
+85 2640 1
+85 2655 1
+85 2670 1
+85 2680 1
+85 2689 1
+85 2691 1
+85 2692 1
+85 2705 1
+85 2715 1
+85 2724 1
+85 2726 1
+85 2727 1
+85 2735 1
+85 2744 1
+85 2746 1
+85 2747 1
+85 2754 1
+85 2756 1
+85 2757 1
+85 2763 1
+85 2764 1
+85 2765 1
+85 2775 1
+85 2785 1
+85 2794 1
+85 2796 1
+85 2797 1
+85 2805 1
+85 2814 1
+85 2816 1
+85 2817 1
+85 2824 1
+85 2826 1
+85 2827 1
+85 2833 1
+85 2834 1
+85 2835 1
+85 2840 1
+85 2849 1
+85 2851 1
+85 2852 1
+85 2859 1
+85 2861 1
+85 2862 1
+85 2868 1
+85 2869 1
+85 2870 1
+85 2874 1
+85 2876 1
+85 2877 1
+85 2883 1
+85 2884 1
+85 2885 1
+85 2888 1
+85 2889 1
+85 2890 1
+85 2892 1
+85 2901 1
+85 2911 1
+85 2920 1
+85 2922 1
+85 2923 1
+85 2931 1
+85 2940 1
+85 2942 1
+85 2943 1
+85 2950 1
+85 2952 1
+85 2953 1
+85 2959 1
+85 2960 1
+85 2961 1
+85 2966 1
+85 2975 1
+85 2977 1
+85 2978 1
+85 2985 1
+85 2987 1
+85 2988 1
+85 2994 1
+85 2995 1
+85 2996 1
+85 3000 1
+85 3002 1
+85 3003 1
+85 3009 1
+85 3010 1
+85 3011 1
+85 3014 1
+85 3015 1
+85 3016 1
+85 3018 1
+85 3022 1
+85 3031 1
+85 3033 1
+85 3034 1
+85 3041 1
+85 3043 1
+85 3044 1
+85 3050 1
+85 3051 1
+85 3052 1
+85 3056 1
+85 3058 1
+85 3059 1
+85 3065 1
+85 3066 1
+85 3067 1
+85 3070 1
+85 3071 1
+85 3072 1
+85 3074 1
+85 3077 1
+85 3079 1
+85 3080 1
+85 3086 1
+85 3087 1
+85 3088 1
+85 3091 1
+85 3092 1
+85 3093 1
+85 3095 1
+85 3097 1
+85 3098 1
+85 3099 1
+85 3101 1
+85 3102 1
+85 3111 1
+85 3121 1
+85 3130 1
+85 3132 1
+85 3133 1
+85 3141 1
+85 3150 1
+85 3152 1
+85 3153 1
+85 3160 1
+85 3162 1
+85 3163 1
+85 3169 1
+85 3170 1
+85 3171 1
+85 3176 1
+85 3185 1
+85 3187 1
+85 3188 1
+85 3195 1
+85 3197 1
+85 3198 1
+85 3204 1
+85 3205 1
+85 3206 1
+85 3210 1
+85 3212 1
+85 3213 1
+85 3219 1
+85 3220 1
+85 3221 1
+85 3224 1
+85 3225 1
+85 3226 1
+85 3228 1
+85 3232 1
+85 3241 1
+85 3243 1
+85 3244 1
+85 3251 1
+85 3253 1
+85 3254 1
+85 3260 1
+85 3261 1
+85 3262 1
+85 3266 1
+85 3268 1
+85 3269 1
+85 3275 1
+85 3276 1
+85 3277 1
+85 3280 1
+85 3281 1
+85 3282 1
+85 3284 1
+85 3287 1
+85 3289 1
+85 3290 1
+85 3296 1
+85 3297 1
+85 3298 1
+85 3301 1
+85 3302 1
+85 3303 1
+85 3305 1
+85 3307 1
+85 3308 1
+85 3309 1
+85 3311 1
+85 3312 1
+85 3316 1
+85 3325 1
+85 3327 1
+85 3328 1
+85 3335 1
+85 3337 1
+85 3338 1
+85 3344 1
+85 3345 1
+85 3346 1
+85 3350 1
+85 3352 1
+85 3353 1
+85 3359 1
+85 3360 1
+85 3361 1
+85 3364 1
+85 3365 1
+85 3366 1
+85 3368 1
+85 3371 1
+85 3373 1
+85 3374 1
+85 3380 1
+85 3381 1
+85 3382 1
+85 3385 1
+85 3386 1
+85 3387 1
+85 3389 1
+85 3391 1
+85 3392 1
+85 3393 1
+85 3395 1
+85 3396 1
+85 3399 1
+85 3401 1
+85 3402 1
+85 3408 1
+85 3409 1
+85 3410 1
+85 3413 1
+85 3414 1
+85 3415 1
+85 3417 1
+85 3419 1
+85 3420 1
+85 3421 1
+85 3423 1
+85 3424 1
+85 3426 1
+85 3427 1
+85 3428 1
+85 3430 1
+85 3431 1
+85 3432 1
+86 31 1
+86 59 1
+86 80 1
+86 95 1
+86 105 1
+86 111 1
+86 117 1
+86 118 1
+86 143 1
+86 164 1
+86 179 1
+86 189 1
+86 195 1
+86 201 1
+86 202 1
+86 220 1
+86 235 1
+86 245 1
+86 251 1
+86 257 1
+86 258 1
+86 270 1
+86 280 1
+86 286 1
+86 292 1
+86 293 1
+86 300 1
+86 306 1
+86 312 1
+86 313 1
+86 316 1
+86 322 1
+86 323 1
+86 326 1
+86 327 1
+86 330 1
+86 353 1
+86 374 1
+86 389 1
+86 399 1
+86 405 1
+86 411 1
+86 412 1
+86 430 1
+86 445 1
+86 455 1
+86 461 1
+86 467 1
+86 468 1
+86 480 1
+86 490 1
+86 496 1
+86 502 1
+86 503 1
+86 510 1
+86 516 1
+86 522 1
+86 523 1
+86 526 1
+86 532 1
+86 533 1
+86 536 1
+86 537 1
+86 540 1
+86 556 1
+86 571 1
+86 581 1
+86 587 1
+86 593 1
+86 594 1
+86 606 1
+86 616 1
+86 622 1
+86 628 1
+86 629 1
+86 636 1
+86 642 1
+86 648 1
+86 649 1
+86 652 1
+86 658 1
+86 659 1
+86 662 1
+86 663 1
+86 666 1
+86 676 1
+86 686 1
+86 692 1
+86 698 1
+86 699 1
+86 706 1
+86 712 1
+86 718 1
+86 719 1
+86 722 1
+86 728 1
+86 729 1
+86 732 1
+86 733 1
+86 736 1
+86 741 1
+86 747 1
+86 753 1
+86 754 1
+86 757 1
+86 763 1
+86 764 1
+86 767 1
+86 768 1
+86 771 1
+86 772 1
+86 778 1
+86 779 1
+86 782 1
+86 783 1
+86 786 1
+86 787 1
+86 788 1
+86 791 1
+86 792 1
+86 815 1
+86 836 1
+86 851 1
+86 861 1
+86 867 1
+86 873 1
+86 874 1
+86 892 1
+86 907 1
+86 917 1
+86 923 1
+86 929 1
+86 930 1
+86 942 1
+86 952 1
+86 958 1
+86 964 1
+86 965 1
+86 972 1
+86 978 1
+86 984 1
+86 985 1
+86 988 1
+86 994 1
+86 995 1
+86 998 1
+86 999 1
+86 1002 1
+86 1018 1
+86 1033 1
+86 1043 1
+86 1049 1
+86 1055 1
+86 1056 1
+86 1068 1
+86 1078 1
+86 1084 1
+86 1090 1
+86 1091 1
+86 1098 1
+86 1104 1
+86 1110 1
+86 1111 1
+86 1114 1
+86 1120 1
+86 1121 1
+86 1124 1
+86 1125 1
+86 1128 1
+86 1138 1
+86 1148 1
+86 1154 1
+86 1160 1
+86 1161 1
+86 1168 1
+86 1174 1
+86 1180 1
+86 1181 1
+86 1184 1
+86 1190 1
+86 1191 1
+86 1194 1
+86 1195 1
+86 1198 1
+86 1203 1
+86 1209 1
+86 1215 1
+86 1216 1
+86 1219 1
+86 1225 1
+86 1226 1
+86 1229 1
+86 1230 1
+86 1233 1
+86 1234 1
+86 1240 1
+86 1241 1
+86 1244 1
+86 1245 1
+86 1248 1
+86 1249 1
+86 1250 1
+86 1253 1
+86 1254 1
+86 1270 1
+86 1285 1
+86 1295 1
+86 1301 1
+86 1307 1
+86 1308 1
+86 1320 1
+86 1330 1
+86 1336 1
+86 1342 1
+86 1343 1
+86 1350 1
+86 1356 1
+86 1362 1
+86 1363 1
+86 1366 1
+86 1372 1
+86 1373 1
+86 1376 1
+86 1377 1
+86 1380 1
+86 1390 1
+86 1400 1
+86 1406 1
+86 1412 1
+86 1413 1
+86 1420 1
+86 1426 1
+86 1432 1
+86 1433 1
+86 1436 1
+86 1442 1
+86 1443 1
+86 1446 1
+86 1447 1
+86 1450 1
+86 1455 1
+86 1461 1
+86 1467 1
+86 1468 1
+86 1471 1
+86 1477 1
+86 1478 1
+86 1481 1
+86 1482 1
+86 1485 1
+86 1486 1
+86 1492 1
+86 1493 1
+86 1496 1
+86 1497 1
+86 1500 1
+86 1501 1
+86 1502 1
+86 1505 1
+86 1506 1
+86 1516 1
+86 1526 1
+86 1532 1
+86 1538 1
+86 1539 1
+86 1546 1
+86 1552 1
+86 1558 1
+86 1559 1
+86 1562 1
+86 1568 1
+86 1569 1
+86 1572 1
+86 1573 1
+86 1576 1
+86 1581 1
+86 1587 1
+86 1593 1
+86 1594 1
+86 1597 1
+86 1603 1
+86 1604 1
+86 1607 1
+86 1608 1
+86 1611 1
+86 1612 1
+86 1618 1
+86 1619 1
+86 1622 1
+86 1623 1
+86 1626 1
+86 1627 1
+86 1628 1
+86 1631 1
+86 1632 1
+86 1637 1
+86 1643 1
+86 1649 1
+86 1650 1
+86 1653 1
+86 1659 1
+86 1660 1
+86 1663 1
+86 1664 1
+86 1667 1
+86 1668 1
+86 1674 1
+86 1675 1
+86 1678 1
+86 1679 1
+86 1682 1
+86 1683 1
+86 1684 1
+86 1687 1
+86 1688 1
+86 1689 1
+86 1695 1
+86 1696 1
+86 1699 1
+86 1700 1
+86 1703 1
+86 1704 1
+86 1705 1
+86 1708 1
+86 1709 1
+86 1710 1
+86 1711 1
+86 1714 1
+86 1715 1
+86 1716 1
+86 1739 1
+86 1760 1
+86 1775 1
+86 1785 1
+86 1791 1
+86 1797 1
+86 1798 1
+86 1816 1
+86 1831 1
+86 1841 1
+86 1847 1
+86 1853 1
+86 1854 1
+86 1866 1
+86 1876 1
+86 1882 1
+86 1888 1
+86 1889 1
+86 1896 1
+86 1902 1
+86 1908 1
+86 1909 1
+86 1912 1
+86 1918 1
+86 1919 1
+86 1922 1
+86 1923 1
+86 1926 1
+86 1942 1
+86 1957 1
+86 1967 1
+86 1973 1
+86 1979 1
+86 1980 1
+86 1992 1
+86 2002 1
+86 2008 1
+86 2014 1
+86 2015 1
+86 2022 1
+86 2028 1
+86 2034 1
+86 2035 1
+86 2038 1
+86 2044 1
+86 2045 1
+86 2048 1
+86 2049 1
+86 2052 1
+86 2062 1
+86 2072 1
+86 2078 1
+86 2084 1
+86 2085 1
+86 2092 1
+86 2098 1
+86 2104 1
+86 2105 1
+86 2108 1
+86 2114 1
+86 2115 1
+86 2118 1
+86 2119 1
+86 2122 1
+86 2127 1
+86 2133 1
+86 2139 1
+86 2140 1
+86 2143 1
+86 2149 1
+86 2150 1
+86 2153 1
+86 2154 1
+86 2157 1
+86 2158 1
+86 2164 1
+86 2165 1
+86 2168 1
+86 2169 1
+86 2172 1
+86 2173 1
+86 2174 1
+86 2177 1
+86 2178 1
+86 2194 1
+86 2209 1
+86 2219 1
+86 2225 1
+86 2231 1
+86 2232 1
+86 2244 1
+86 2254 1
+86 2260 1
+86 2266 1
+86 2267 1
+86 2274 1
+86 2280 1
+86 2286 1
+86 2287 1
+86 2290 1
+86 2296 1
+86 2297 1
+86 2300 1
+86 2301 1
+86 2304 1
+86 2314 1
+86 2324 1
+86 2330 1
+86 2336 1
+86 2337 1
+86 2344 1
+86 2350 1
+86 2356 1
+86 2357 1
+86 2360 1
+86 2366 1
+86 2367 1
+86 2370 1
+86 2371 1
+86 2374 1
+86 2379 1
+86 2385 1
+86 2391 1
+86 2392 1
+86 2395 1
+86 2401 1
+86 2402 1
+86 2405 1
+86 2406 1
+86 2409 1
+86 2410 1
+86 2416 1
+86 2417 1
+86 2420 1
+86 2421 1
+86 2424 1
+86 2425 1
+86 2426 1
+86 2429 1
+86 2430 1
+86 2440 1
+86 2450 1
+86 2456 1
+86 2462 1
+86 2463 1
+86 2470 1
+86 2476 1
+86 2482 1
+86 2483 1
+86 2486 1
+86 2492 1
+86 2493 1
+86 2496 1
+86 2497 1
+86 2500 1
+86 2505 1
+86 2511 1
+86 2517 1
+86 2518 1
+86 2521 1
+86 2527 1
+86 2528 1
+86 2531 1
+86 2532 1
+86 2535 1
+86 2536 1
+86 2542 1
+86 2543 1
+86 2546 1
+86 2547 1
+86 2550 1
+86 2551 1
+86 2552 1
+86 2555 1
+86 2556 1
+86 2561 1
+86 2567 1
+86 2573 1
+86 2574 1
+86 2577 1
+86 2583 1
+86 2584 1
+86 2587 1
+86 2588 1
+86 2591 1
+86 2592 1
+86 2598 1
+86 2599 1
+86 2602 1
+86 2603 1
+86 2606 1
+86 2607 1
+86 2608 1
+86 2611 1
+86 2612 1
+86 2613 1
+86 2619 1
+86 2620 1
+86 2623 1
+86 2624 1
+86 2627 1
+86 2628 1
+86 2629 1
+86 2632 1
+86 2633 1
+86 2634 1
+86 2635 1
+86 2638 1
+86 2639 1
+86 2640 1
+86 2656 1
+86 2671 1
+86 2681 1
+86 2687 1
+86 2693 1
+86 2694 1
+86 2706 1
+86 2716 1
+86 2722 1
+86 2728 1
+86 2729 1
+86 2736 1
+86 2742 1
+86 2748 1
+86 2749 1
+86 2752 1
+86 2758 1
+86 2759 1
+86 2762 1
+86 2763 1
+86 2766 1
+86 2776 1
+86 2786 1
+86 2792 1
+86 2798 1
+86 2799 1
+86 2806 1
+86 2812 1
+86 2818 1
+86 2819 1
+86 2822 1
+86 2828 1
+86 2829 1
+86 2832 1
+86 2833 1
+86 2836 1
+86 2841 1
+86 2847 1
+86 2853 1
+86 2854 1
+86 2857 1
+86 2863 1
+86 2864 1
+86 2867 1
+86 2868 1
+86 2871 1
+86 2872 1
+86 2878 1
+86 2879 1
+86 2882 1
+86 2883 1
+86 2886 1
+86 2887 1
+86 2888 1
+86 2891 1
+86 2892 1
+86 2902 1
+86 2912 1
+86 2918 1
+86 2924 1
+86 2925 1
+86 2932 1
+86 2938 1
+86 2944 1
+86 2945 1
+86 2948 1
+86 2954 1
+86 2955 1
+86 2958 1
+86 2959 1
+86 2962 1
+86 2967 1
+86 2973 1
+86 2979 1
+86 2980 1
+86 2983 1
+86 2989 1
+86 2990 1
+86 2993 1
+86 2994 1
+86 2997 1
+86 2998 1
+86 3004 1
+86 3005 1
+86 3008 1
+86 3009 1
+86 3012 1
+86 3013 1
+86 3014 1
+86 3017 1
+86 3018 1
+86 3023 1
+86 3029 1
+86 3035 1
+86 3036 1
+86 3039 1
+86 3045 1
+86 3046 1
+86 3049 1
+86 3050 1
+86 3053 1
+86 3054 1
+86 3060 1
+86 3061 1
+86 3064 1
+86 3065 1
+86 3068 1
+86 3069 1
+86 3070 1
+86 3073 1
+86 3074 1
+86 3075 1
+86 3081 1
+86 3082 1
+86 3085 1
+86 3086 1
+86 3089 1
+86 3090 1
+86 3091 1
+86 3094 1
+86 3095 1
+86 3096 1
+86 3097 1
+86 3100 1
+86 3101 1
+86 3102 1
+86 3112 1
+86 3122 1
+86 3128 1
+86 3134 1
+86 3135 1
+86 3142 1
+86 3148 1
+86 3154 1
+86 3155 1
+86 3158 1
+86 3164 1
+86 3165 1
+86 3168 1
+86 3169 1
+86 3172 1
+86 3177 1
+86 3183 1
+86 3189 1
+86 3190 1
+86 3193 1
+86 3199 1
+86 3200 1
+86 3203 1
+86 3204 1
+86 3207 1
+86 3208 1
+86 3214 1
+86 3215 1
+86 3218 1
+86 3219 1
+86 3222 1
+86 3223 1
+86 3224 1
+86 3227 1
+86 3228 1
+86 3233 1
+86 3239 1
+86 3245 1
+86 3246 1
+86 3249 1
+86 3255 1
+86 3256 1
+86 3259 1
+86 3260 1
+86 3263 1
+86 3264 1
+86 3270 1
+86 3271 1
+86 3274 1
+86 3275 1
+86 3278 1
+86 3279 1
+86 3280 1
+86 3283 1
+86 3284 1
+86 3285 1
+86 3291 1
+86 3292 1
+86 3295 1
+86 3296 1
+86 3299 1
+86 3300 1
+86 3301 1
+86 3304 1
+86 3305 1
+86 3306 1
+86 3307 1
+86 3310 1
+86 3311 1
+86 3312 1
+86 3317 1
+86 3323 1
+86 3329 1
+86 3330 1
+86 3333 1
+86 3339 1
+86 3340 1
+86 3343 1
+86 3344 1
+86 3347 1
+86 3348 1
+86 3354 1
+86 3355 1
+86 3358 1
+86 3359 1
+86 3362 1
+86 3363 1
+86 3364 1
+86 3367 1
+86 3368 1
+86 3369 1
+86 3375 1
+86 3376 1
+86 3379 1
+86 3380 1
+86 3383 1
+86 3384 1
+86 3385 1
+86 3388 1
+86 3389 1
+86 3390 1
+86 3391 1
+86 3394 1
+86 3395 1
+86 3396 1
+86 3397 1
+86 3403 1
+86 3404 1
+86 3407 1
+86 3408 1
+86 3411 1
+86 3412 1
+86 3413 1
+86 3416 1
+86 3417 1
+86 3418 1
+86 3419 1
+86 3422 1
+86 3423 1
+86 3424 1
+86 3425 1
+86 3426 1
+86 3429 1
+86 3430 1
+86 3431 1
+86 3432 1
+87 32 1
+87 60 1
+87 81 1
+87 96 1
+87 106 1
+87 112 1
+87 117 1
+87 119 1
+87 144 1
+87 165 1
+87 180 1
+87 190 1
+87 196 1
+87 201 1
+87 203 1
+87 221 1
+87 236 1
+87 246 1
+87 252 1
+87 257 1
+87 259 1
+87 271 1
+87 281 1
+87 287 1
+87 292 1
+87 294 1
+87 301 1
+87 307 1
+87 312 1
+87 314 1
+87 317 1
+87 322 1
+87 324 1
+87 326 1
+87 328 1
+87 330 1
+87 354 1
+87 375 1
+87 390 1
+87 400 1
+87 406 1
+87 411 1
+87 413 1
+87 431 1
+87 446 1
+87 456 1
+87 462 1
+87 467 1
+87 469 1
+87 481 1
+87 491 1
+87 497 1
+87 502 1
+87 504 1
+87 511 1
+87 517 1
+87 522 1
+87 524 1
+87 527 1
+87 532 1
+87 534 1
+87 536 1
+87 538 1
+87 540 1
+87 557 1
+87 572 1
+87 582 1
+87 588 1
+87 593 1
+87 595 1
+87 607 1
+87 617 1
+87 623 1
+87 628 1
+87 630 1
+87 637 1
+87 643 1
+87 648 1
+87 650 1
+87 653 1
+87 658 1
+87 660 1
+87 662 1
+87 664 1
+87 666 1
+87 677 1
+87 687 1
+87 693 1
+87 698 1
+87 700 1
+87 707 1
+87 713 1
+87 718 1
+87 720 1
+87 723 1
+87 728 1
+87 730 1
+87 732 1
+87 734 1
+87 736 1
+87 742 1
+87 748 1
+87 753 1
+87 755 1
+87 758 1
+87 763 1
+87 765 1
+87 767 1
+87 769 1
+87 771 1
+87 773 1
+87 778 1
+87 780 1
+87 782 1
+87 784 1
+87 786 1
+87 787 1
+87 789 1
+87 791 1
+87 792 1
+87 816 1
+87 837 1
+87 852 1
+87 862 1
+87 868 1
+87 873 1
+87 875 1
+87 893 1
+87 908 1
+87 918 1
+87 924 1
+87 929 1
+87 931 1
+87 943 1
+87 953 1
+87 959 1
+87 964 1
+87 966 1
+87 973 1
+87 979 1
+87 984 1
+87 986 1
+87 989 1
+87 994 1
+87 996 1
+87 998 1
+87 1000 1
+87 1002 1
+87 1019 1
+87 1034 1
+87 1044 1
+87 1050 1
+87 1055 1
+87 1057 1
+87 1069 1
+87 1079 1
+87 1085 1
+87 1090 1
+87 1092 1
+87 1099 1
+87 1105 1
+87 1110 1
+87 1112 1
+87 1115 1
+87 1120 1
+87 1122 1
+87 1124 1
+87 1126 1
+87 1128 1
+87 1139 1
+87 1149 1
+87 1155 1
+87 1160 1
+87 1162 1
+87 1169 1
+87 1175 1
+87 1180 1
+87 1182 1
+87 1185 1
+87 1190 1
+87 1192 1
+87 1194 1
+87 1196 1
+87 1198 1
+87 1204 1
+87 1210 1
+87 1215 1
+87 1217 1
+87 1220 1
+87 1225 1
+87 1227 1
+87 1229 1
+87 1231 1
+87 1233 1
+87 1235 1
+87 1240 1
+87 1242 1
+87 1244 1
+87 1246 1
+87 1248 1
+87 1249 1
+87 1251 1
+87 1253 1
+87 1254 1
+87 1271 1
+87 1286 1
+87 1296 1
+87 1302 1
+87 1307 1
+87 1309 1
+87 1321 1
+87 1331 1
+87 1337 1
+87 1342 1
+87 1344 1
+87 1351 1
+87 1357 1
+87 1362 1
+87 1364 1
+87 1367 1
+87 1372 1
+87 1374 1
+87 1376 1
+87 1378 1
+87 1380 1
+87 1391 1
+87 1401 1
+87 1407 1
+87 1412 1
+87 1414 1
+87 1421 1
+87 1427 1
+87 1432 1
+87 1434 1
+87 1437 1
+87 1442 1
+87 1444 1
+87 1446 1
+87 1448 1
+87 1450 1
+87 1456 1
+87 1462 1
+87 1467 1
+87 1469 1
+87 1472 1
+87 1477 1
+87 1479 1
+87 1481 1
+87 1483 1
+87 1485 1
+87 1487 1
+87 1492 1
+87 1494 1
+87 1496 1
+87 1498 1
+87 1500 1
+87 1501 1
+87 1503 1
+87 1505 1
+87 1506 1
+87 1517 1
+87 1527 1
+87 1533 1
+87 1538 1
+87 1540 1
+87 1547 1
+87 1553 1
+87 1558 1
+87 1560 1
+87 1563 1
+87 1568 1
+87 1570 1
+87 1572 1
+87 1574 1
+87 1576 1
+87 1582 1
+87 1588 1
+87 1593 1
+87 1595 1
+87 1598 1
+87 1603 1
+87 1605 1
+87 1607 1
+87 1609 1
+87 1611 1
+87 1613 1
+87 1618 1
+87 1620 1
+87 1622 1
+87 1624 1
+87 1626 1
+87 1627 1
+87 1629 1
+87 1631 1
+87 1632 1
+87 1638 1
+87 1644 1
+87 1649 1
+87 1651 1
+87 1654 1
+87 1659 1
+87 1661 1
+87 1663 1
+87 1665 1
+87 1667 1
+87 1669 1
+87 1674 1
+87 1676 1
+87 1678 1
+87 1680 1
+87 1682 1
+87 1683 1
+87 1685 1
+87 1687 1
+87 1688 1
+87 1690 1
+87 1695 1
+87 1697 1
+87 1699 1
+87 1701 1
+87 1703 1
+87 1704 1
+87 1706 1
+87 1708 1
+87 1709 1
+87 1710 1
+87 1712 1
+87 1714 1
+87 1715 1
+87 1716 1
+87 1740 1
+87 1761 1
+87 1776 1
+87 1786 1
+87 1792 1
+87 1797 1
+87 1799 1
+87 1817 1
+87 1832 1
+87 1842 1
+87 1848 1
+87 1853 1
+87 1855 1
+87 1867 1
+87 1877 1
+87 1883 1
+87 1888 1
+87 1890 1
+87 1897 1
+87 1903 1
+87 1908 1
+87 1910 1
+87 1913 1
+87 1918 1
+87 1920 1
+87 1922 1
+87 1924 1
+87 1926 1
+87 1943 1
+87 1958 1
+87 1968 1
+87 1974 1
+87 1979 1
+87 1981 1
+87 1993 1
+87 2003 1
+87 2009 1
+87 2014 1
+87 2016 1
+87 2023 1
+87 2029 1
+87 2034 1
+87 2036 1
+87 2039 1
+87 2044 1
+87 2046 1
+87 2048 1
+87 2050 1
+87 2052 1
+87 2063 1
+87 2073 1
+87 2079 1
+87 2084 1
+87 2086 1
+87 2093 1
+87 2099 1
+87 2104 1
+87 2106 1
+87 2109 1
+87 2114 1
+87 2116 1
+87 2118 1
+87 2120 1
+87 2122 1
+87 2128 1
+87 2134 1
+87 2139 1
+87 2141 1
+87 2144 1
+87 2149 1
+87 2151 1
+87 2153 1
+87 2155 1
+87 2157 1
+87 2159 1
+87 2164 1
+87 2166 1
+87 2168 1
+87 2170 1
+87 2172 1
+87 2173 1
+87 2175 1
+87 2177 1
+87 2178 1
+87 2195 1
+87 2210 1
+87 2220 1
+87 2226 1
+87 2231 1
+87 2233 1
+87 2245 1
+87 2255 1
+87 2261 1
+87 2266 1
+87 2268 1
+87 2275 1
+87 2281 1
+87 2286 1
+87 2288 1
+87 2291 1
+87 2296 1
+87 2298 1
+87 2300 1
+87 2302 1
+87 2304 1
+87 2315 1
+87 2325 1
+87 2331 1
+87 2336 1
+87 2338 1
+87 2345 1
+87 2351 1
+87 2356 1
+87 2358 1
+87 2361 1
+87 2366 1
+87 2368 1
+87 2370 1
+87 2372 1
+87 2374 1
+87 2380 1
+87 2386 1
+87 2391 1
+87 2393 1
+87 2396 1
+87 2401 1
+87 2403 1
+87 2405 1
+87 2407 1
+87 2409 1
+87 2411 1
+87 2416 1
+87 2418 1
+87 2420 1
+87 2422 1
+87 2424 1
+87 2425 1
+87 2427 1
+87 2429 1
+87 2430 1
+87 2441 1
+87 2451 1
+87 2457 1
+87 2462 1
+87 2464 1
+87 2471 1
+87 2477 1
+87 2482 1
+87 2484 1
+87 2487 1
+87 2492 1
+87 2494 1
+87 2496 1
+87 2498 1
+87 2500 1
+87 2506 1
+87 2512 1
+87 2517 1
+87 2519 1
+87 2522 1
+87 2527 1
+87 2529 1
+87 2531 1
+87 2533 1
+87 2535 1
+87 2537 1
+87 2542 1
+87 2544 1
+87 2546 1
+87 2548 1
+87 2550 1
+87 2551 1
+87 2553 1
+87 2555 1
+87 2556 1
+87 2562 1
+87 2568 1
+87 2573 1
+87 2575 1
+87 2578 1
+87 2583 1
+87 2585 1
+87 2587 1
+87 2589 1
+87 2591 1
+87 2593 1
+87 2598 1
+87 2600 1
+87 2602 1
+87 2604 1
+87 2606 1
+87 2607 1
+87 2609 1
+87 2611 1
+87 2612 1
+87 2614 1
+87 2619 1
+87 2621 1
+87 2623 1
+87 2625 1
+87 2627 1
+87 2628 1
+87 2630 1
+87 2632 1
+87 2633 1
+87 2634 1
+87 2636 1
+87 2638 1
+87 2639 1
+87 2640 1
+87 2657 1
+87 2672 1
+87 2682 1
+87 2688 1
+87 2693 1
+87 2695 1
+87 2707 1
+87 2717 1
+87 2723 1
+87 2728 1
+87 2730 1
+87 2737 1
+87 2743 1
+87 2748 1
+87 2750 1
+87 2753 1
+87 2758 1
+87 2760 1
+87 2762 1
+87 2764 1
+87 2766 1
+87 2777 1
+87 2787 1
+87 2793 1
+87 2798 1
+87 2800 1
+87 2807 1
+87 2813 1
+87 2818 1
+87 2820 1
+87 2823 1
+87 2828 1
+87 2830 1
+87 2832 1
+87 2834 1
+87 2836 1
+87 2842 1
+87 2848 1
+87 2853 1
+87 2855 1
+87 2858 1
+87 2863 1
+87 2865 1
+87 2867 1
+87 2869 1
+87 2871 1
+87 2873 1
+87 2878 1
+87 2880 1
+87 2882 1
+87 2884 1
+87 2886 1
+87 2887 1
+87 2889 1
+87 2891 1
+87 2892 1
+87 2903 1
+87 2913 1
+87 2919 1
+87 2924 1
+87 2926 1
+87 2933 1
+87 2939 1
+87 2944 1
+87 2946 1
+87 2949 1
+87 2954 1
+87 2956 1
+87 2958 1
+87 2960 1
+87 2962 1
+87 2968 1
+87 2974 1
+87 2979 1
+87 2981 1
+87 2984 1
+87 2989 1
+87 2991 1
+87 2993 1
+87 2995 1
+87 2997 1
+87 2999 1
+87 3004 1
+87 3006 1
+87 3008 1
+87 3010 1
+87 3012 1
+87 3013 1
+87 3015 1
+87 3017 1
+87 3018 1
+87 3024 1
+87 3030 1
+87 3035 1
+87 3037 1
+87 3040 1
+87 3045 1
+87 3047 1
+87 3049 1
+87 3051 1
+87 3053 1
+87 3055 1
+87 3060 1
+87 3062 1
+87 3064 1
+87 3066 1
+87 3068 1
+87 3069 1
+87 3071 1
+87 3073 1
+87 3074 1
+87 3076 1
+87 3081 1
+87 3083 1
+87 3085 1
+87 3087 1
+87 3089 1
+87 3090 1
+87 3092 1
+87 3094 1
+87 3095 1
+87 3096 1
+87 3098 1
+87 3100 1
+87 3101 1
+87 3102 1
+87 3113 1
+87 3123 1
+87 3129 1
+87 3134 1
+87 3136 1
+87 3143 1
+87 3149 1
+87 3154 1
+87 3156 1
+87 3159 1
+87 3164 1
+87 3166 1
+87 3168 1
+87 3170 1
+87 3172 1
+87 3178 1
+87 3184 1
+87 3189 1
+87 3191 1
+87 3194 1
+87 3199 1
+87 3201 1
+87 3203 1
+87 3205 1
+87 3207 1
+87 3209 1
+87 3214 1
+87 3216 1
+87 3218 1
+87 3220 1
+87 3222 1
+87 3223 1
+87 3225 1
+87 3227 1
+87 3228 1
+87 3234 1
+87 3240 1
+87 3245 1
+87 3247 1
+87 3250 1
+87 3255 1
+87 3257 1
+87 3259 1
+87 3261 1
+87 3263 1
+87 3265 1
+87 3270 1
+87 3272 1
+87 3274 1
+87 3276 1
+87 3278 1
+87 3279 1
+87 3281 1
+87 3283 1
+87 3284 1
+87 3286 1
+87 3291 1
+87 3293 1
+87 3295 1
+87 3297 1
+87 3299 1
+87 3300 1
+87 3302 1
+87 3304 1
+87 3305 1
+87 3306 1
+87 3308 1
+87 3310 1
+87 3311 1
+87 3312 1
+87 3318 1
+87 3324 1
+87 3329 1
+87 3331 1
+87 3334 1
+87 3339 1
+87 3341 1
+87 3343 1
+87 3345 1
+87 3347 1
+87 3349 1
+87 3354 1
+87 3356 1
+87 3358 1
+87 3360 1
+87 3362 1
+87 3363 1
+87 3365 1
+87 3367 1
+87 3368 1
+87 3370 1
+87 3375 1
+87 3377 1
+87 3379 1
+87 3381 1
+87 3383 1
+87 3384 1
+87 3386 1
+87 3388 1
+87 3389 1
+87 3390 1
+87 3392 1
+87 3394 1
+87 3395 1
+87 3396 1
+87 3398 1
+87 3403 1
+87 3405 1
+87 3407 1
+87 3409 1
+87 3411 1
+87 3412 1
+87 3414 1
+87 3416 1
+87 3417 1
+87 3418 1
+87 3420 1
+87 3422 1
+87 3423 1
+87 3424 1
+87 3425 1
+87 3427 1
+87 3429 1
+87 3430 1
+87 3431 1
+87 3432 1
+88 33 1
+88 61 1
+88 82 1
+88 97 1
+88 107 1
+88 113 1
+88 118 1
+88 119 1
+88 145 1
+88 166 1
+88 181 1
+88 191 1
+88 197 1
+88 202 1
+88 203 1
+88 222 1
+88 237 1
+88 247 1
+88 253 1
+88 258 1
+88 259 1
+88 272 1
+88 282 1
+88 288 1
+88 293 1
+88 294 1
+88 302 1
+88 308 1
+88 313 1
+88 314 1
+88 318 1
+88 323 1
+88 324 1
+88 327 1
+88 328 1
+88 330 1
+88 355 1
+88 376 1
+88 391 1
+88 401 1
+88 407 1
+88 412 1
+88 413 1
+88 432 1
+88 447 1
+88 457 1
+88 463 1
+88 468 1
+88 469 1
+88 482 1
+88 492 1
+88 498 1
+88 503 1
+88 504 1
+88 512 1
+88 518 1
+88 523 1
+88 524 1
+88 528 1
+88 533 1
+88 534 1
+88 537 1
+88 538 1
+88 540 1
+88 558 1
+88 573 1
+88 583 1
+88 589 1
+88 594 1
+88 595 1
+88 608 1
+88 618 1
+88 624 1
+88 629 1
+88 630 1
+88 638 1
+88 644 1
+88 649 1
+88 650 1
+88 654 1
+88 659 1
+88 660 1
+88 663 1
+88 664 1
+88 666 1
+88 678 1
+88 688 1
+88 694 1
+88 699 1
+88 700 1
+88 708 1
+88 714 1
+88 719 1
+88 720 1
+88 724 1
+88 729 1
+88 730 1
+88 733 1
+88 734 1
+88 736 1
+88 743 1
+88 749 1
+88 754 1
+88 755 1
+88 759 1
+88 764 1
+88 765 1
+88 768 1
+88 769 1
+88 771 1
+88 774 1
+88 779 1
+88 780 1
+88 783 1
+88 784 1
+88 786 1
+88 788 1
+88 789 1
+88 791 1
+88 792 1
+88 817 1
+88 838 1
+88 853 1
+88 863 1
+88 869 1
+88 874 1
+88 875 1
+88 894 1
+88 909 1
+88 919 1
+88 925 1
+88 930 1
+88 931 1
+88 944 1
+88 954 1
+88 960 1
+88 965 1
+88 966 1
+88 974 1
+88 980 1
+88 985 1
+88 986 1
+88 990 1
+88 995 1
+88 996 1
+88 999 1
+88 1000 1
+88 1002 1
+88 1020 1
+88 1035 1
+88 1045 1
+88 1051 1
+88 1056 1
+88 1057 1
+88 1070 1
+88 1080 1
+88 1086 1
+88 1091 1
+88 1092 1
+88 1100 1
+88 1106 1
+88 1111 1
+88 1112 1
+88 1116 1
+88 1121 1
+88 1122 1
+88 1125 1
+88 1126 1
+88 1128 1
+88 1140 1
+88 1150 1
+88 1156 1
+88 1161 1
+88 1162 1
+88 1170 1
+88 1176 1
+88 1181 1
+88 1182 1
+88 1186 1
+88 1191 1
+88 1192 1
+88 1195 1
+88 1196 1
+88 1198 1
+88 1205 1
+88 1211 1
+88 1216 1
+88 1217 1
+88 1221 1
+88 1226 1
+88 1227 1
+88 1230 1
+88 1231 1
+88 1233 1
+88 1236 1
+88 1241 1
+88 1242 1
+88 1245 1
+88 1246 1
+88 1248 1
+88 1250 1
+88 1251 1
+88 1253 1
+88 1254 1
+88 1272 1
+88 1287 1
+88 1297 1
+88 1303 1
+88 1308 1
+88 1309 1
+88 1322 1
+88 1332 1
+88 1338 1
+88 1343 1
+88 1344 1
+88 1352 1
+88 1358 1
+88 1363 1
+88 1364 1
+88 1368 1
+88 1373 1
+88 1374 1
+88 1377 1
+88 1378 1
+88 1380 1
+88 1392 1
+88 1402 1
+88 1408 1
+88 1413 1
+88 1414 1
+88 1422 1
+88 1428 1
+88 1433 1
+88 1434 1
+88 1438 1
+88 1443 1
+88 1444 1
+88 1447 1
+88 1448 1
+88 1450 1
+88 1457 1
+88 1463 1
+88 1468 1
+88 1469 1
+88 1473 1
+88 1478 1
+88 1479 1
+88 1482 1
+88 1483 1
+88 1485 1
+88 1488 1
+88 1493 1
+88 1494 1
+88 1497 1
+88 1498 1
+88 1500 1
+88 1502 1
+88 1503 1
+88 1505 1
+88 1506 1
+88 1518 1
+88 1528 1
+88 1534 1
+88 1539 1
+88 1540 1
+88 1548 1
+88 1554 1
+88 1559 1
+88 1560 1
+88 1564 1
+88 1569 1
+88 1570 1
+88 1573 1
+88 1574 1
+88 1576 1
+88 1583 1
+88 1589 1
+88 1594 1
+88 1595 1
+88 1599 1
+88 1604 1
+88 1605 1
+88 1608 1
+88 1609 1
+88 1611 1
+88 1614 1
+88 1619 1
+88 1620 1
+88 1623 1
+88 1624 1
+88 1626 1
+88 1628 1
+88 1629 1
+88 1631 1
+88 1632 1
+88 1639 1
+88 1645 1
+88 1650 1
+88 1651 1
+88 1655 1
+88 1660 1
+88 1661 1
+88 1664 1
+88 1665 1
+88 1667 1
+88 1670 1
+88 1675 1
+88 1676 1
+88 1679 1
+88 1680 1
+88 1682 1
+88 1684 1
+88 1685 1
+88 1687 1
+88 1688 1
+88 1691 1
+88 1696 1
+88 1697 1
+88 1700 1
+88 1701 1
+88 1703 1
+88 1705 1
+88 1706 1
+88 1708 1
+88 1709 1
+88 1711 1
+88 1712 1
+88 1714 1
+88 1715 1
+88 1716 1
+88 1741 1
+88 1762 1
+88 1777 1
+88 1787 1
+88 1793 1
+88 1798 1
+88 1799 1
+88 1818 1
+88 1833 1
+88 1843 1
+88 1849 1
+88 1854 1
+88 1855 1
+88 1868 1
+88 1878 1
+88 1884 1
+88 1889 1
+88 1890 1
+88 1898 1
+88 1904 1
+88 1909 1
+88 1910 1
+88 1914 1
+88 1919 1
+88 1920 1
+88 1923 1
+88 1924 1
+88 1926 1
+88 1944 1
+88 1959 1
+88 1969 1
+88 1975 1
+88 1980 1
+88 1981 1
+88 1994 1
+88 2004 1
+88 2010 1
+88 2015 1
+88 2016 1
+88 2024 1
+88 2030 1
+88 2035 1
+88 2036 1
+88 2040 1
+88 2045 1
+88 2046 1
+88 2049 1
+88 2050 1
+88 2052 1
+88 2064 1
+88 2074 1
+88 2080 1
+88 2085 1
+88 2086 1
+88 2094 1
+88 2100 1
+88 2105 1
+88 2106 1
+88 2110 1
+88 2115 1
+88 2116 1
+88 2119 1
+88 2120 1
+88 2122 1
+88 2129 1
+88 2135 1
+88 2140 1
+88 2141 1
+88 2145 1
+88 2150 1
+88 2151 1
+88 2154 1
+88 2155 1
+88 2157 1
+88 2160 1
+88 2165 1
+88 2166 1
+88 2169 1
+88 2170 1
+88 2172 1
+88 2174 1
+88 2175 1
+88 2177 1
+88 2178 1
+88 2196 1
+88 2211 1
+88 2221 1
+88 2227 1
+88 2232 1
+88 2233 1
+88 2246 1
+88 2256 1
+88 2262 1
+88 2267 1
+88 2268 1
+88 2276 1
+88 2282 1
+88 2287 1
+88 2288 1
+88 2292 1
+88 2297 1
+88 2298 1
+88 2301 1
+88 2302 1
+88 2304 1
+88 2316 1
+88 2326 1
+88 2332 1
+88 2337 1
+88 2338 1
+88 2346 1
+88 2352 1
+88 2357 1
+88 2358 1
+88 2362 1
+88 2367 1
+88 2368 1
+88 2371 1
+88 2372 1
+88 2374 1
+88 2381 1
+88 2387 1
+88 2392 1
+88 2393 1
+88 2397 1
+88 2402 1
+88 2403 1
+88 2406 1
+88 2407 1
+88 2409 1
+88 2412 1
+88 2417 1
+88 2418 1
+88 2421 1
+88 2422 1
+88 2424 1
+88 2426 1
+88 2427 1
+88 2429 1
+88 2430 1
+88 2442 1
+88 2452 1
+88 2458 1
+88 2463 1
+88 2464 1
+88 2472 1
+88 2478 1
+88 2483 1
+88 2484 1
+88 2488 1
+88 2493 1
+88 2494 1
+88 2497 1
+88 2498 1
+88 2500 1
+88 2507 1
+88 2513 1
+88 2518 1
+88 2519 1
+88 2523 1
+88 2528 1
+88 2529 1
+88 2532 1
+88 2533 1
+88 2535 1
+88 2538 1
+88 2543 1
+88 2544 1
+88 2547 1
+88 2548 1
+88 2550 1
+88 2552 1
+88 2553 1
+88 2555 1
+88 2556 1
+88 2563 1
+88 2569 1
+88 2574 1
+88 2575 1
+88 2579 1
+88 2584 1
+88 2585 1
+88 2588 1
+88 2589 1
+88 2591 1
+88 2594 1
+88 2599 1
+88 2600 1
+88 2603 1
+88 2604 1
+88 2606 1
+88 2608 1
+88 2609 1
+88 2611 1
+88 2612 1
+88 2615 1
+88 2620 1
+88 2621 1
+88 2624 1
+88 2625 1
+88 2627 1
+88 2629 1
+88 2630 1
+88 2632 1
+88 2633 1
+88 2635 1
+88 2636 1
+88 2638 1
+88 2639 1
+88 2640 1
+88 2658 1
+88 2673 1
+88 2683 1
+88 2689 1
+88 2694 1
+88 2695 1
+88 2708 1
+88 2718 1
+88 2724 1
+88 2729 1
+88 2730 1
+88 2738 1
+88 2744 1
+88 2749 1
+88 2750 1
+88 2754 1
+88 2759 1
+88 2760 1
+88 2763 1
+88 2764 1
+88 2766 1
+88 2778 1
+88 2788 1
+88 2794 1
+88 2799 1
+88 2800 1
+88 2808 1
+88 2814 1
+88 2819 1
+88 2820 1
+88 2824 1
+88 2829 1
+88 2830 1
+88 2833 1
+88 2834 1
+88 2836 1
+88 2843 1
+88 2849 1
+88 2854 1
+88 2855 1
+88 2859 1
+88 2864 1
+88 2865 1
+88 2868 1
+88 2869 1
+88 2871 1
+88 2874 1
+88 2879 1
+88 2880 1
+88 2883 1
+88 2884 1
+88 2886 1
+88 2888 1
+88 2889 1
+88 2891 1
+88 2892 1
+88 2904 1
+88 2914 1
+88 2920 1
+88 2925 1
+88 2926 1
+88 2934 1
+88 2940 1
+88 2945 1
+88 2946 1
+88 2950 1
+88 2955 1
+88 2956 1
+88 2959 1
+88 2960 1
+88 2962 1
+88 2969 1
+88 2975 1
+88 2980 1
+88 2981 1
+88 2985 1
+88 2990 1
+88 2991 1
+88 2994 1
+88 2995 1
+88 2997 1
+88 3000 1
+88 3005 1
+88 3006 1
+88 3009 1
+88 3010 1
+88 3012 1
+88 3014 1
+88 3015 1
+88 3017 1
+88 3018 1
+88 3025 1
+88 3031 1
+88 3036 1
+88 3037 1
+88 3041 1
+88 3046 1
+88 3047 1
+88 3050 1
+88 3051 1
+88 3053 1
+88 3056 1
+88 3061 1
+88 3062 1
+88 3065 1
+88 3066 1
+88 3068 1
+88 3070 1
+88 3071 1
+88 3073 1
+88 3074 1
+88 3077 1
+88 3082 1
+88 3083 1
+88 3086 1
+88 3087 1
+88 3089 1
+88 3091 1
+88 3092 1
+88 3094 1
+88 3095 1
+88 3097 1
+88 3098 1
+88 3100 1
+88 3101 1
+88 3102 1
+88 3114 1
+88 3124 1
+88 3130 1
+88 3135 1
+88 3136 1
+88 3144 1
+88 3150 1
+88 3155 1
+88 3156 1
+88 3160 1
+88 3165 1
+88 3166 1
+88 3169 1
+88 3170 1
+88 3172 1
+88 3179 1
+88 3185 1
+88 3190 1
+88 3191 1
+88 3195 1
+88 3200 1
+88 3201 1
+88 3204 1
+88 3205 1
+88 3207 1
+88 3210 1
+88 3215 1
+88 3216 1
+88 3219 1
+88 3220 1
+88 3222 1
+88 3224 1
+88 3225 1
+88 3227 1
+88 3228 1
+88 3235 1
+88 3241 1
+88 3246 1
+88 3247 1
+88 3251 1
+88 3256 1
+88 3257 1
+88 3260 1
+88 3261 1
+88 3263 1
+88 3266 1
+88 3271 1
+88 3272 1
+88 3275 1
+88 3276 1
+88 3278 1
+88 3280 1
+88 3281 1
+88 3283 1
+88 3284 1
+88 3287 1
+88 3292 1
+88 3293 1
+88 3296 1
+88 3297 1
+88 3299 1
+88 3301 1
+88 3302 1
+88 3304 1
+88 3305 1
+88 3307 1
+88 3308 1
+88 3310 1
+88 3311 1
+88 3312 1
+88 3319 1
+88 3325 1
+88 3330 1
+88 3331 1
+88 3335 1
+88 3340 1
+88 3341 1
+88 3344 1
+88 3345 1
+88 3347 1
+88 3350 1
+88 3355 1
+88 3356 1
+88 3359 1
+88 3360 1
+88 3362 1
+88 3364 1
+88 3365 1
+88 3367 1
+88 3368 1
+88 3371 1
+88 3376 1
+88 3377 1
+88 3380 1
+88 3381 1
+88 3383 1
+88 3385 1
+88 3386 1
+88 3388 1
+88 3389 1
+88 3391 1
+88 3392 1
+88 3394 1
+88 3395 1
+88 3396 1
+88 3399 1
+88 3404 1
+88 3405 1
+88 3408 1
+88 3409 1
+88 3411 1
+88 3413 1
+88 3414 1
+88 3416 1
+88 3417 1
+88 3419 1
+88 3420 1
+88 3422 1
+88 3423 1
+88 3424 1
+88 3426 1
+88 3427 1
+88 3429 1
+88 3430 1
+88 3431 1
+88 3432 1
+89 34 1
+89 62 1
+89 83 1
+89 98 1
+89 108 1
+89 114 1
+89 117 1
+89 120 1
+89 146 1
+89 167 1
+89 182 1
+89 192 1
+89 198 1
+89 201 1
+89 204 1
+89 223 1
+89 238 1
+89 248 1
+89 254 1
+89 257 1
+89 260 1
+89 273 1
+89 283 1
+89 289 1
+89 292 1
+89 295 1
+89 303 1
+89 309 1
+89 312 1
+89 315 1
+89 319 1
+89 322 1
+89 325 1
+89 326 1
+89 329 1
+89 330 1
+89 356 1
+89 377 1
+89 392 1
+89 402 1
+89 408 1
+89 411 1
+89 414 1
+89 433 1
+89 448 1
+89 458 1
+89 464 1
+89 467 1
+89 470 1
+89 483 1
+89 493 1
+89 499 1
+89 502 1
+89 505 1
+89 513 1
+89 519 1
+89 522 1
+89 525 1
+89 529 1
+89 532 1
+89 535 1
+89 536 1
+89 539 1
+89 540 1
+89 559 1
+89 574 1
+89 584 1
+89 590 1
+89 593 1
+89 596 1
+89 609 1
+89 619 1
+89 625 1
+89 628 1
+89 631 1
+89 639 1
+89 645 1
+89 648 1
+89 651 1
+89 655 1
+89 658 1
+89 661 1
+89 662 1
+89 665 1
+89 666 1
+89 679 1
+89 689 1
+89 695 1
+89 698 1
+89 701 1
+89 709 1
+89 715 1
+89 718 1
+89 721 1
+89 725 1
+89 728 1
+89 731 1
+89 732 1
+89 735 1
+89 736 1
+89 744 1
+89 750 1
+89 753 1
+89 756 1
+89 760 1
+89 763 1
+89 766 1
+89 767 1
+89 770 1
+89 771 1
+89 775 1
+89 778 1
+89 781 1
+89 782 1
+89 785 1
+89 786 1
+89 787 1
+89 790 1
+89 791 1
+89 792 1
+89 818 1
+89 839 1
+89 854 1
+89 864 1
+89 870 1
+89 873 1
+89 876 1
+89 895 1
+89 910 1
+89 920 1
+89 926 1
+89 929 1
+89 932 1
+89 945 1
+89 955 1
+89 961 1
+89 964 1
+89 967 1
+89 975 1
+89 981 1
+89 984 1
+89 987 1
+89 991 1
+89 994 1
+89 997 1
+89 998 1
+89 1001 1
+89 1002 1
+89 1021 1
+89 1036 1
+89 1046 1
+89 1052 1
+89 1055 1
+89 1058 1
+89 1071 1
+89 1081 1
+89 1087 1
+89 1090 1
+89 1093 1
+89 1101 1
+89 1107 1
+89 1110 1
+89 1113 1
+89 1117 1
+89 1120 1
+89 1123 1
+89 1124 1
+89 1127 1
+89 1128 1
+89 1141 1
+89 1151 1
+89 1157 1
+89 1160 1
+89 1163 1
+89 1171 1
+89 1177 1
+89 1180 1
+89 1183 1
+89 1187 1
+89 1190 1
+89 1193 1
+89 1194 1
+89 1197 1
+89 1198 1
+89 1206 1
+89 1212 1
+89 1215 1
+89 1218 1
+89 1222 1
+89 1225 1
+89 1228 1
+89 1229 1
+89 1232 1
+89 1233 1
+89 1237 1
+89 1240 1
+89 1243 1
+89 1244 1
+89 1247 1
+89 1248 1
+89 1249 1
+89 1252 1
+89 1253 1
+89 1254 1
+89 1273 1
+89 1288 1
+89 1298 1
+89 1304 1
+89 1307 1
+89 1310 1
+89 1323 1
+89 1333 1
+89 1339 1
+89 1342 1
+89 1345 1
+89 1353 1
+89 1359 1
+89 1362 1
+89 1365 1
+89 1369 1
+89 1372 1
+89 1375 1
+89 1376 1
+89 1379 1
+89 1380 1
+89 1393 1
+89 1403 1
+89 1409 1
+89 1412 1
+89 1415 1
+89 1423 1
+89 1429 1
+89 1432 1
+89 1435 1
+89 1439 1
+89 1442 1
+89 1445 1
+89 1446 1
+89 1449 1
+89 1450 1
+89 1458 1
+89 1464 1
+89 1467 1
+89 1470 1
+89 1474 1
+89 1477 1
+89 1480 1
+89 1481 1
+89 1484 1
+89 1485 1
+89 1489 1
+89 1492 1
+89 1495 1
+89 1496 1
+89 1499 1
+89 1500 1
+89 1501 1
+89 1504 1
+89 1505 1
+89 1506 1
+89 1519 1
+89 1529 1
+89 1535 1
+89 1538 1
+89 1541 1
+89 1549 1
+89 1555 1
+89 1558 1
+89 1561 1
+89 1565 1
+89 1568 1
+89 1571 1
+89 1572 1
+89 1575 1
+89 1576 1
+89 1584 1
+89 1590 1
+89 1593 1
+89 1596 1
+89 1600 1
+89 1603 1
+89 1606 1
+89 1607 1
+89 1610 1
+89 1611 1
+89 1615 1
+89 1618 1
+89 1621 1
+89 1622 1
+89 1625 1
+89 1626 1
+89 1627 1
+89 1630 1
+89 1631 1
+89 1632 1
+89 1640 1
+89 1646 1
+89 1649 1
+89 1652 1
+89 1656 1
+89 1659 1
+89 1662 1
+89 1663 1
+89 1666 1
+89 1667 1
+89 1671 1
+89 1674 1
+89 1677 1
+89 1678 1
+89 1681 1
+89 1682 1
+89 1683 1
+89 1686 1
+89 1687 1
+89 1688 1
+89 1692 1
+89 1695 1
+89 1698 1
+89 1699 1
+89 1702 1
+89 1703 1
+89 1704 1
+89 1707 1
+89 1708 1
+89 1709 1
+89 1710 1
+89 1713 1
+89 1714 1
+89 1715 1
+89 1716 1
+89 1742 1
+89 1763 1
+89 1778 1
+89 1788 1
+89 1794 1
+89 1797 1
+89 1800 1
+89 1819 1
+89 1834 1
+89 1844 1
+89 1850 1
+89 1853 1
+89 1856 1
+89 1869 1
+89 1879 1
+89 1885 1
+89 1888 1
+89 1891 1
+89 1899 1
+89 1905 1
+89 1908 1
+89 1911 1
+89 1915 1
+89 1918 1
+89 1921 1
+89 1922 1
+89 1925 1
+89 1926 1
+89 1945 1
+89 1960 1
+89 1970 1
+89 1976 1
+89 1979 1
+89 1982 1
+89 1995 1
+89 2005 1
+89 2011 1
+89 2014 1
+89 2017 1
+89 2025 1
+89 2031 1
+89 2034 1
+89 2037 1
+89 2041 1
+89 2044 1
+89 2047 1
+89 2048 1
+89 2051 1
+89 2052 1
+89 2065 1
+89 2075 1
+89 2081 1
+89 2084 1
+89 2087 1
+89 2095 1
+89 2101 1
+89 2104 1
+89 2107 1
+89 2111 1
+89 2114 1
+89 2117 1
+89 2118 1
+89 2121 1
+89 2122 1
+89 2130 1
+89 2136 1
+89 2139 1
+89 2142 1
+89 2146 1
+89 2149 1
+89 2152 1
+89 2153 1
+89 2156 1
+89 2157 1
+89 2161 1
+89 2164 1
+89 2167 1
+89 2168 1
+89 2171 1
+89 2172 1
+89 2173 1
+89 2176 1
+89 2177 1
+89 2178 1
+89 2197 1
+89 2212 1
+89 2222 1
+89 2228 1
+89 2231 1
+89 2234 1
+89 2247 1
+89 2257 1
+89 2263 1
+89 2266 1
+89 2269 1
+89 2277 1
+89 2283 1
+89 2286 1
+89 2289 1
+89 2293 1
+89 2296 1
+89 2299 1
+89 2300 1
+89 2303 1
+89 2304 1
+89 2317 1
+89 2327 1
+89 2333 1
+89 2336 1
+89 2339 1
+89 2347 1
+89 2353 1
+89 2356 1
+89 2359 1
+89 2363 1
+89 2366 1
+89 2369 1
+89 2370 1
+89 2373 1
+89 2374 1
+89 2382 1
+89 2388 1
+89 2391 1
+89 2394 1
+89 2398 1
+89 2401 1
+89 2404 1
+89 2405 1
+89 2408 1
+89 2409 1
+89 2413 1
+89 2416 1
+89 2419 1
+89 2420 1
+89 2423 1
+89 2424 1
+89 2425 1
+89 2428 1
+89 2429 1
+89 2430 1
+89 2443 1
+89 2453 1
+89 2459 1
+89 2462 1
+89 2465 1
+89 2473 1
+89 2479 1
+89 2482 1
+89 2485 1
+89 2489 1
+89 2492 1
+89 2495 1
+89 2496 1
+89 2499 1
+89 2500 1
+89 2508 1
+89 2514 1
+89 2517 1
+89 2520 1
+89 2524 1
+89 2527 1
+89 2530 1
+89 2531 1
+89 2534 1
+89 2535 1
+89 2539 1
+89 2542 1
+89 2545 1
+89 2546 1
+89 2549 1
+89 2550 1
+89 2551 1
+89 2554 1
+89 2555 1
+89 2556 1
+89 2564 1
+89 2570 1
+89 2573 1
+89 2576 1
+89 2580 1
+89 2583 1
+89 2586 1
+89 2587 1
+89 2590 1
+89 2591 1
+89 2595 1
+89 2598 1
+89 2601 1
+89 2602 1
+89 2605 1
+89 2606 1
+89 2607 1
+89 2610 1
+89 2611 1
+89 2612 1
+89 2616 1
+89 2619 1
+89 2622 1
+89 2623 1
+89 2626 1
+89 2627 1
+89 2628 1
+89 2631 1
+89 2632 1
+89 2633 1
+89 2634 1
+89 2637 1
+89 2638 1
+89 2639 1
+89 2640 1
+89 2659 1
+89 2674 1
+89 2684 1
+89 2690 1
+89 2693 1
+89 2696 1
+89 2709 1
+89 2719 1
+89 2725 1
+89 2728 1
+89 2731 1
+89 2739 1
+89 2745 1
+89 2748 1
+89 2751 1
+89 2755 1
+89 2758 1
+89 2761 1
+89 2762 1
+89 2765 1
+89 2766 1
+89 2779 1
+89 2789 1
+89 2795 1
+89 2798 1
+89 2801 1
+89 2809 1
+89 2815 1
+89 2818 1
+89 2821 1
+89 2825 1
+89 2828 1
+89 2831 1
+89 2832 1
+89 2835 1
+89 2836 1
+89 2844 1
+89 2850 1
+89 2853 1
+89 2856 1
+89 2860 1
+89 2863 1
+89 2866 1
+89 2867 1
+89 2870 1
+89 2871 1
+89 2875 1
+89 2878 1
+89 2881 1
+89 2882 1
+89 2885 1
+89 2886 1
+89 2887 1
+89 2890 1
+89 2891 1
+89 2892 1
+89 2905 1
+89 2915 1
+89 2921 1
+89 2924 1
+89 2927 1
+89 2935 1
+89 2941 1
+89 2944 1
+89 2947 1
+89 2951 1
+89 2954 1
+89 2957 1
+89 2958 1
+89 2961 1
+89 2962 1
+89 2970 1
+89 2976 1
+89 2979 1
+89 2982 1
+89 2986 1
+89 2989 1
+89 2992 1
+89 2993 1
+89 2996 1
+89 2997 1
+89 3001 1
+89 3004 1
+89 3007 1
+89 3008 1
+89 3011 1
+89 3012 1
+89 3013 1
+89 3016 1
+89 3017 1
+89 3018 1
+89 3026 1
+89 3032 1
+89 3035 1
+89 3038 1
+89 3042 1
+89 3045 1
+89 3048 1
+89 3049 1
+89 3052 1
+89 3053 1
+89 3057 1
+89 3060 1
+89 3063 1
+89 3064 1
+89 3067 1
+89 3068 1
+89 3069 1
+89 3072 1
+89 3073 1
+89 3074 1
+89 3078 1
+89 3081 1
+89 3084 1
+89 3085 1
+89 3088 1
+89 3089 1
+89 3090 1
+89 3093 1
+89 3094 1
+89 3095 1
+89 3096 1
+89 3099 1
+89 3100 1
+89 3101 1
+89 3102 1
+89 3115 1
+89 3125 1
+89 3131 1
+89 3134 1
+89 3137 1
+89 3145 1
+89 3151 1
+89 3154 1
+89 3157 1
+89 3161 1
+89 3164 1
+89 3167 1
+89 3168 1
+89 3171 1
+89 3172 1
+89 3180 1
+89 3186 1
+89 3189 1
+89 3192 1
+89 3196 1
+89 3199 1
+89 3202 1
+89 3203 1
+89 3206 1
+89 3207 1
+89 3211 1
+89 3214 1
+89 3217 1
+89 3218 1
+89 3221 1
+89 3222 1
+89 3223 1
+89 3226 1
+89 3227 1
+89 3228 1
+89 3236 1
+89 3242 1
+89 3245 1
+89 3248 1
+89 3252 1
+89 3255 1
+89 3258 1
+89 3259 1
+89 3262 1
+89 3263 1
+89 3267 1
+89 3270 1
+89 3273 1
+89 3274 1
+89 3277 1
+89 3278 1
+89 3279 1
+89 3282 1
+89 3283 1
+89 3284 1
+89 3288 1
+89 3291 1
+89 3294 1
+89 3295 1
+89 3298 1
+89 3299 1
+89 3300 1
+89 3303 1
+89 3304 1
+89 3305 1
+89 3306 1
+89 3309 1
+89 3310 1
+89 3311 1
+89 3312 1
+89 3320 1
+89 3326 1
+89 3329 1
+89 3332 1
+89 3336 1
+89 3339 1
+89 3342 1
+89 3343 1
+89 3346 1
+89 3347 1
+89 3351 1
+89 3354 1
+89 3357 1
+89 3358 1
+89 3361 1
+89 3362 1
+89 3363 1
+89 3366 1
+89 3367 1
+89 3368 1
+89 3372 1
+89 3375 1
+89 3378 1
+89 3379 1
+89 3382 1
+89 3383 1
+89 3384 1
+89 3387 1
+89 3388 1
+89 3389 1
+89 3390 1
+89 3393 1
+89 3394 1
+89 3395 1
+89 3396 1
+89 3400 1
+89 3403 1
+89 3406 1
+89 3407 1
+89 3410 1
+89 3411 1
+89 3412 1
+89 3415 1
+89 3416 1
+89 3417 1
+89 3418 1
+89 3421 1
+89 3422 1
+89 3423 1
+89 3424 1
+89 3425 1
+89 3428 1
+89 3429 1
+89 3430 1
+89 3431 1
+89 3432 1
+90 35 1
+90 63 1
+90 84 1
+90 99 1
+90 109 1
+90 115 1
+90 118 1
+90 120 1
+90 147 1
+90 168 1
+90 183 1
+90 193 1
+90 199 1
+90 202 1
+90 204 1
+90 224 1
+90 239 1
+90 249 1
+90 255 1
+90 258 1
+90 260 1
+90 274 1
+90 284 1
+90 290 1
+90 293 1
+90 295 1
+90 304 1
+90 310 1
+90 313 1
+90 315 1
+90 320 1
+90 323 1
+90 325 1
+90 327 1
+90 329 1
+90 330 1
+90 357 1
+90 378 1
+90 393 1
+90 403 1
+90 409 1
+90 412 1
+90 414 1
+90 434 1
+90 449 1
+90 459 1
+90 465 1
+90 468 1
+90 470 1
+90 484 1
+90 494 1
+90 500 1
+90 503 1
+90 505 1
+90 514 1
+90 520 1
+90 523 1
+90 525 1
+90 530 1
+90 533 1
+90 535 1
+90 537 1
+90 539 1
+90 540 1
+90 560 1
+90 575 1
+90 585 1
+90 591 1
+90 594 1
+90 596 1
+90 610 1
+90 620 1
+90 626 1
+90 629 1
+90 631 1
+90 640 1
+90 646 1
+90 649 1
+90 651 1
+90 656 1
+90 659 1
+90 661 1
+90 663 1
+90 665 1
+90 666 1
+90 680 1
+90 690 1
+90 696 1
+90 699 1
+90 701 1
+90 710 1
+90 716 1
+90 719 1
+90 721 1
+90 726 1
+90 729 1
+90 731 1
+90 733 1
+90 735 1
+90 736 1
+90 745 1
+90 751 1
+90 754 1
+90 756 1
+90 761 1
+90 764 1
+90 766 1
+90 768 1
+90 770 1
+90 771 1
+90 776 1
+90 779 1
+90 781 1
+90 783 1
+90 785 1
+90 786 1
+90 788 1
+90 790 1
+90 791 1
+90 792 1
+90 819 1
+90 840 1
+90 855 1
+90 865 1
+90 871 1
+90 874 1
+90 876 1
+90 896 1
+90 911 1
+90 921 1
+90 927 1
+90 930 1
+90 932 1
+90 946 1
+90 956 1
+90 962 1
+90 965 1
+90 967 1
+90 976 1
+90 982 1
+90 985 1
+90 987 1
+90 992 1
+90 995 1
+90 997 1
+90 999 1
+90 1001 1
+90 1002 1
+90 1022 1
+90 1037 1
+90 1047 1
+90 1053 1
+90 1056 1
+90 1058 1
+90 1072 1
+90 1082 1
+90 1088 1
+90 1091 1
+90 1093 1
+90 1102 1
+90 1108 1
+90 1111 1
+90 1113 1
+90 1118 1
+90 1121 1
+90 1123 1
+90 1125 1
+90 1127 1
+90 1128 1
+90 1142 1
+90 1152 1
+90 1158 1
+90 1161 1
+90 1163 1
+90 1172 1
+90 1178 1
+90 1181 1
+90 1183 1
+90 1188 1
+90 1191 1
+90 1193 1
+90 1195 1
+90 1197 1
+90 1198 1
+90 1207 1
+90 1213 1
+90 1216 1
+90 1218 1
+90 1223 1
+90 1226 1
+90 1228 1
+90 1230 1
+90 1232 1
+90 1233 1
+90 1238 1
+90 1241 1
+90 1243 1
+90 1245 1
+90 1247 1
+90 1248 1
+90 1250 1
+90 1252 1
+90 1253 1
+90 1254 1
+90 1274 1
+90 1289 1
+90 1299 1
+90 1305 1
+90 1308 1
+90 1310 1
+90 1324 1
+90 1334 1
+90 1340 1
+90 1343 1
+90 1345 1
+90 1354 1
+90 1360 1
+90 1363 1
+90 1365 1
+90 1370 1
+90 1373 1
+90 1375 1
+90 1377 1
+90 1379 1
+90 1380 1
+90 1394 1
+90 1404 1
+90 1410 1
+90 1413 1
+90 1415 1
+90 1424 1
+90 1430 1
+90 1433 1
+90 1435 1
+90 1440 1
+90 1443 1
+90 1445 1
+90 1447 1
+90 1449 1
+90 1450 1
+90 1459 1
+90 1465 1
+90 1468 1
+90 1470 1
+90 1475 1
+90 1478 1
+90 1480 1
+90 1482 1
+90 1484 1
+90 1485 1
+90 1490 1
+90 1493 1
+90 1495 1
+90 1497 1
+90 1499 1
+90 1500 1
+90 1502 1
+90 1504 1
+90 1505 1
+90 1506 1
+90 1520 1
+90 1530 1
+90 1536 1
+90 1539 1
+90 1541 1
+90 1550 1
+90 1556 1
+90 1559 1
+90 1561 1
+90 1566 1
+90 1569 1
+90 1571 1
+90 1573 1
+90 1575 1
+90 1576 1
+90 1585 1
+90 1591 1
+90 1594 1
+90 1596 1
+90 1601 1
+90 1604 1
+90 1606 1
+90 1608 1
+90 1610 1
+90 1611 1
+90 1616 1
+90 1619 1
+90 1621 1
+90 1623 1
+90 1625 1
+90 1626 1
+90 1628 1
+90 1630 1
+90 1631 1
+90 1632 1
+90 1641 1
+90 1647 1
+90 1650 1
+90 1652 1
+90 1657 1
+90 1660 1
+90 1662 1
+90 1664 1
+90 1666 1
+90 1667 1
+90 1672 1
+90 1675 1
+90 1677 1
+90 1679 1
+90 1681 1
+90 1682 1
+90 1684 1
+90 1686 1
+90 1687 1
+90 1688 1
+90 1693 1
+90 1696 1
+90 1698 1
+90 1700 1
+90 1702 1
+90 1703 1
+90 1705 1
+90 1707 1
+90 1708 1
+90 1709 1
+90 1711 1
+90 1713 1
+90 1714 1
+90 1715 1
+90 1716 1
+90 1743 1
+90 1764 1
+90 1779 1
+90 1789 1
+90 1795 1
+90 1798 1
+90 1800 1
+90 1820 1
+90 1835 1
+90 1845 1
+90 1851 1
+90 1854 1
+90 1856 1
+90 1870 1
+90 1880 1
+90 1886 1
+90 1889 1
+90 1891 1
+90 1900 1
+90 1906 1
+90 1909 1
+90 1911 1
+90 1916 1
+90 1919 1
+90 1921 1
+90 1923 1
+90 1925 1
+90 1926 1
+90 1946 1
+90 1961 1
+90 1971 1
+90 1977 1
+90 1980 1
+90 1982 1
+90 1996 1
+90 2006 1
+90 2012 1
+90 2015 1
+90 2017 1
+90 2026 1
+90 2032 1
+90 2035 1
+90 2037 1
+90 2042 1
+90 2045 1
+90 2047 1
+90 2049 1
+90 2051 1
+90 2052 1
+90 2066 1
+90 2076 1
+90 2082 1
+90 2085 1
+90 2087 1
+90 2096 1
+90 2102 1
+90 2105 1
+90 2107 1
+90 2112 1
+90 2115 1
+90 2117 1
+90 2119 1
+90 2121 1
+90 2122 1
+90 2131 1
+90 2137 1
+90 2140 1
+90 2142 1
+90 2147 1
+90 2150 1
+90 2152 1
+90 2154 1
+90 2156 1
+90 2157 1
+90 2162 1
+90 2165 1
+90 2167 1
+90 2169 1
+90 2171 1
+90 2172 1
+90 2174 1
+90 2176 1
+90 2177 1
+90 2178 1
+90 2198 1
+90 2213 1
+90 2223 1
+90 2229 1
+90 2232 1
+90 2234 1
+90 2248 1
+90 2258 1
+90 2264 1
+90 2267 1
+90 2269 1
+90 2278 1
+90 2284 1
+90 2287 1
+90 2289 1
+90 2294 1
+90 2297 1
+90 2299 1
+90 2301 1
+90 2303 1
+90 2304 1
+90 2318 1
+90 2328 1
+90 2334 1
+90 2337 1
+90 2339 1
+90 2348 1
+90 2354 1
+90 2357 1
+90 2359 1
+90 2364 1
+90 2367 1
+90 2369 1
+90 2371 1
+90 2373 1
+90 2374 1
+90 2383 1
+90 2389 1
+90 2392 1
+90 2394 1
+90 2399 1
+90 2402 1
+90 2404 1
+90 2406 1
+90 2408 1
+90 2409 1
+90 2414 1
+90 2417 1
+90 2419 1
+90 2421 1
+90 2423 1
+90 2424 1
+90 2426 1
+90 2428 1
+90 2429 1
+90 2430 1
+90 2444 1
+90 2454 1
+90 2460 1
+90 2463 1
+90 2465 1
+90 2474 1
+90 2480 1
+90 2483 1
+90 2485 1
+90 2490 1
+90 2493 1
+90 2495 1
+90 2497 1
+90 2499 1
+90 2500 1
+90 2509 1
+90 2515 1
+90 2518 1
+90 2520 1
+90 2525 1
+90 2528 1
+90 2530 1
+90 2532 1
+90 2534 1
+90 2535 1
+90 2540 1
+90 2543 1
+90 2545 1
+90 2547 1
+90 2549 1
+90 2550 1
+90 2552 1
+90 2554 1
+90 2555 1
+90 2556 1
+90 2565 1
+90 2571 1
+90 2574 1
+90 2576 1
+90 2581 1
+90 2584 1
+90 2586 1
+90 2588 1
+90 2590 1
+90 2591 1
+90 2596 1
+90 2599 1
+90 2601 1
+90 2603 1
+90 2605 1
+90 2606 1
+90 2608 1
+90 2610 1
+90 2611 1
+90 2612 1
+90 2617 1
+90 2620 1
+90 2622 1
+90 2624 1
+90 2626 1
+90 2627 1
+90 2629 1
+90 2631 1
+90 2632 1
+90 2633 1
+90 2635 1
+90 2637 1
+90 2638 1
+90 2639 1
+90 2640 1
+90 2660 1
+90 2675 1
+90 2685 1
+90 2691 1
+90 2694 1
+90 2696 1
+90 2710 1
+90 2720 1
+90 2726 1
+90 2729 1
+90 2731 1
+90 2740 1
+90 2746 1
+90 2749 1
+90 2751 1
+90 2756 1
+90 2759 1
+90 2761 1
+90 2763 1
+90 2765 1
+90 2766 1
+90 2780 1
+90 2790 1
+90 2796 1
+90 2799 1
+90 2801 1
+90 2810 1
+90 2816 1
+90 2819 1
+90 2821 1
+90 2826 1
+90 2829 1
+90 2831 1
+90 2833 1
+90 2835 1
+90 2836 1
+90 2845 1
+90 2851 1
+90 2854 1
+90 2856 1
+90 2861 1
+90 2864 1
+90 2866 1
+90 2868 1
+90 2870 1
+90 2871 1
+90 2876 1
+90 2879 1
+90 2881 1
+90 2883 1
+90 2885 1
+90 2886 1
+90 2888 1
+90 2890 1
+90 2891 1
+90 2892 1
+90 2906 1
+90 2916 1
+90 2922 1
+90 2925 1
+90 2927 1
+90 2936 1
+90 2942 1
+90 2945 1
+90 2947 1
+90 2952 1
+90 2955 1
+90 2957 1
+90 2959 1
+90 2961 1
+90 2962 1
+90 2971 1
+90 2977 1
+90 2980 1
+90 2982 1
+90 2987 1
+90 2990 1
+90 2992 1
+90 2994 1
+90 2996 1
+90 2997 1
+90 3002 1
+90 3005 1
+90 3007 1
+90 3009 1
+90 3011 1
+90 3012 1
+90 3014 1
+90 3016 1
+90 3017 1
+90 3018 1
+90 3027 1
+90 3033 1
+90 3036 1
+90 3038 1
+90 3043 1
+90 3046 1
+90 3048 1
+90 3050 1
+90 3052 1
+90 3053 1
+90 3058 1
+90 3061 1
+90 3063 1
+90 3065 1
+90 3067 1
+90 3068 1
+90 3070 1
+90 3072 1
+90 3073 1
+90 3074 1
+90 3079 1
+90 3082 1
+90 3084 1
+90 3086 1
+90 3088 1
+90 3089 1
+90 3091 1
+90 3093 1
+90 3094 1
+90 3095 1
+90 3097 1
+90 3099 1
+90 3100 1
+90 3101 1
+90 3102 1
+90 3116 1
+90 3126 1
+90 3132 1
+90 3135 1
+90 3137 1
+90 3146 1
+90 3152 1
+90 3155 1
+90 3157 1
+90 3162 1
+90 3165 1
+90 3167 1
+90 3169 1
+90 3171 1
+90 3172 1
+90 3181 1
+90 3187 1
+90 3190 1
+90 3192 1
+90 3197 1
+90 3200 1
+90 3202 1
+90 3204 1
+90 3206 1
+90 3207 1
+90 3212 1
+90 3215 1
+90 3217 1
+90 3219 1
+90 3221 1
+90 3222 1
+90 3224 1
+90 3226 1
+90 3227 1
+90 3228 1
+90 3237 1
+90 3243 1
+90 3246 1
+90 3248 1
+90 3253 1
+90 3256 1
+90 3258 1
+90 3260 1
+90 3262 1
+90 3263 1
+90 3268 1
+90 3271 1
+90 3273 1
+90 3275 1
+90 3277 1
+90 3278 1
+90 3280 1
+90 3282 1
+90 3283 1
+90 3284 1
+90 3289 1
+90 3292 1
+90 3294 1
+90 3296 1
+90 3298 1
+90 3299 1
+90 3301 1
+90 3303 1
+90 3304 1
+90 3305 1
+90 3307 1
+90 3309 1
+90 3310 1
+90 3311 1
+90 3312 1
+90 3321 1
+90 3327 1
+90 3330 1
+90 3332 1
+90 3337 1
+90 3340 1
+90 3342 1
+90 3344 1
+90 3346 1
+90 3347 1
+90 3352 1
+90 3355 1
+90 3357 1
+90 3359 1
+90 3361 1
+90 3362 1
+90 3364 1
+90 3366 1
+90 3367 1
+90 3368 1
+90 3373 1
+90 3376 1
+90 3378 1
+90 3380 1
+90 3382 1
+90 3383 1
+90 3385 1
+90 3387 1
+90 3388 1
+90 3389 1
+90 3391 1
+90 3393 1
+90 3394 1
+90 3395 1
+90 3396 1
+90 3401 1
+90 3404 1
+90 3406 1
+90 3408 1
+90 3410 1
+90 3411 1
+90 3413 1
+90 3415 1
+90 3416 1
+90 3417 1
+90 3419 1
+90 3421 1
+90 3422 1
+90 3423 1
+90 3424 1
+90 3426 1
+90 3428 1
+90 3429 1
+90 3430 1
+90 3431 1
+90 3432 1
+91 36 1
+91 64 1
+91 85 1
+91 100 1
+91 110 1
+91 116 1
+91 119 1
+91 120 1
+91 148 1
+91 169 1
+91 184 1
+91 194 1
+91 200 1
+91 203 1
+91 204 1
+91 225 1
+91 240 1
+91 250 1
+91 256 1
+91 259 1
+91 260 1
+91 275 1
+91 285 1
+91 291 1
+91 294 1
+91 295 1
+91 305 1
+91 311 1
+91 314 1
+91 315 1
+91 321 1
+91 324 1
+91 325 1
+91 328 1
+91 329 1
+91 330 1
+91 358 1
+91 379 1
+91 394 1
+91 404 1
+91 410 1
+91 413 1
+91 414 1
+91 435 1
+91 450 1
+91 460 1
+91 466 1
+91 469 1
+91 470 1
+91 485 1
+91 495 1
+91 501 1
+91 504 1
+91 505 1
+91 515 1
+91 521 1
+91 524 1
+91 525 1
+91 531 1
+91 534 1
+91 535 1
+91 538 1
+91 539 1
+91 540 1
+91 561 1
+91 576 1
+91 586 1
+91 592 1
+91 595 1
+91 596 1
+91 611 1
+91 621 1
+91 627 1
+91 630 1
+91 631 1
+91 641 1
+91 647 1
+91 650 1
+91 651 1
+91 657 1
+91 660 1
+91 661 1
+91 664 1
+91 665 1
+91 666 1
+91 681 1
+91 691 1
+91 697 1
+91 700 1
+91 701 1
+91 711 1
+91 717 1
+91 720 1
+91 721 1
+91 727 1
+91 730 1
+91 731 1
+91 734 1
+91 735 1
+91 736 1
+91 746 1
+91 752 1
+91 755 1
+91 756 1
+91 762 1
+91 765 1
+91 766 1
+91 769 1
+91 770 1
+91 771 1
+91 777 1
+91 780 1
+91 781 1
+91 784 1
+91 785 1
+91 786 1
+91 789 1
+91 790 1
+91 791 1
+91 792 1
+91 820 1
+91 841 1
+91 856 1
+91 866 1
+91 872 1
+91 875 1
+91 876 1
+91 897 1
+91 912 1
+91 922 1
+91 928 1
+91 931 1
+91 932 1
+91 947 1
+91 957 1
+91 963 1
+91 966 1
+91 967 1
+91 977 1
+91 983 1
+91 986 1
+91 987 1
+91 993 1
+91 996 1
+91 997 1
+91 1000 1
+91 1001 1
+91 1002 1
+91 1023 1
+91 1038 1
+91 1048 1
+91 1054 1
+91 1057 1
+91 1058 1
+91 1073 1
+91 1083 1
+91 1089 1
+91 1092 1
+91 1093 1
+91 1103 1
+91 1109 1
+91 1112 1
+91 1113 1
+91 1119 1
+91 1122 1
+91 1123 1
+91 1126 1
+91 1127 1
+91 1128 1
+91 1143 1
+91 1153 1
+91 1159 1
+91 1162 1
+91 1163 1
+91 1173 1
+91 1179 1
+91 1182 1
+91 1183 1
+91 1189 1
+91 1192 1
+91 1193 1
+91 1196 1
+91 1197 1
+91 1198 1
+91 1208 1
+91 1214 1
+91 1217 1
+91 1218 1
+91 1224 1
+91 1227 1
+91 1228 1
+91 1231 1
+91 1232 1
+91 1233 1
+91 1239 1
+91 1242 1
+91 1243 1
+91 1246 1
+91 1247 1
+91 1248 1
+91 1251 1
+91 1252 1
+91 1253 1
+91 1254 1
+91 1275 1
+91 1290 1
+91 1300 1
+91 1306 1
+91 1309 1
+91 1310 1
+91 1325 1
+91 1335 1
+91 1341 1
+91 1344 1
+91 1345 1
+91 1355 1
+91 1361 1
+91 1364 1
+91 1365 1
+91 1371 1
+91 1374 1
+91 1375 1
+91 1378 1
+91 1379 1
+91 1380 1
+91 1395 1
+91 1405 1
+91 1411 1
+91 1414 1
+91 1415 1
+91 1425 1
+91 1431 1
+91 1434 1
+91 1435 1
+91 1441 1
+91 1444 1
+91 1445 1
+91 1448 1
+91 1449 1
+91 1450 1
+91 1460 1
+91 1466 1
+91 1469 1
+91 1470 1
+91 1476 1
+91 1479 1
+91 1480 1
+91 1483 1
+91 1484 1
+91 1485 1
+91 1491 1
+91 1494 1
+91 1495 1
+91 1498 1
+91 1499 1
+91 1500 1
+91 1503 1
+91 1504 1
+91 1505 1
+91 1506 1
+91 1521 1
+91 1531 1
+91 1537 1
+91 1540 1
+91 1541 1
+91 1551 1
+91 1557 1
+91 1560 1
+91 1561 1
+91 1567 1
+91 1570 1
+91 1571 1
+91 1574 1
+91 1575 1
+91 1576 1
+91 1586 1
+91 1592 1
+91 1595 1
+91 1596 1
+91 1602 1
+91 1605 1
+91 1606 1
+91 1609 1
+91 1610 1
+91 1611 1
+91 1617 1
+91 1620 1
+91 1621 1
+91 1624 1
+91 1625 1
+91 1626 1
+91 1629 1
+91 1630 1
+91 1631 1
+91 1632 1
+91 1642 1
+91 1648 1
+91 1651 1
+91 1652 1
+91 1658 1
+91 1661 1
+91 1662 1
+91 1665 1
+91 1666 1
+91 1667 1
+91 1673 1
+91 1676 1
+91 1677 1
+91 1680 1
+91 1681 1
+91 1682 1
+91 1685 1
+91 1686 1
+91 1687 1
+91 1688 1
+91 1694 1
+91 1697 1
+91 1698 1
+91 1701 1
+91 1702 1
+91 1703 1
+91 1706 1
+91 1707 1
+91 1708 1
+91 1709 1
+91 1712 1
+91 1713 1
+91 1714 1
+91 1715 1
+91 1716 1
+91 1744 1
+91 1765 1
+91 1780 1
+91 1790 1
+91 1796 1
+91 1799 1
+91 1800 1
+91 1821 1
+91 1836 1
+91 1846 1
+91 1852 1
+91 1855 1
+91 1856 1
+91 1871 1
+91 1881 1
+91 1887 1
+91 1890 1
+91 1891 1
+91 1901 1
+91 1907 1
+91 1910 1
+91 1911 1
+91 1917 1
+91 1920 1
+91 1921 1
+91 1924 1
+91 1925 1
+91 1926 1
+91 1947 1
+91 1962 1
+91 1972 1
+91 1978 1
+91 1981 1
+91 1982 1
+91 1997 1
+91 2007 1
+91 2013 1
+91 2016 1
+91 2017 1
+91 2027 1
+91 2033 1
+91 2036 1
+91 2037 1
+91 2043 1
+91 2046 1
+91 2047 1
+91 2050 1
+91 2051 1
+91 2052 1
+91 2067 1
+91 2077 1
+91 2083 1
+91 2086 1
+91 2087 1
+91 2097 1
+91 2103 1
+91 2106 1
+91 2107 1
+91 2113 1
+91 2116 1
+91 2117 1
+91 2120 1
+91 2121 1
+91 2122 1
+91 2132 1
+91 2138 1
+91 2141 1
+91 2142 1
+91 2148 1
+91 2151 1
+91 2152 1
+91 2155 1
+91 2156 1
+91 2157 1
+91 2163 1
+91 2166 1
+91 2167 1
+91 2170 1
+91 2171 1
+91 2172 1
+91 2175 1
+91 2176 1
+91 2177 1
+91 2178 1
+91 2199 1
+91 2214 1
+91 2224 1
+91 2230 1
+91 2233 1
+91 2234 1
+91 2249 1
+91 2259 1
+91 2265 1
+91 2268 1
+91 2269 1
+91 2279 1
+91 2285 1
+91 2288 1
+91 2289 1
+91 2295 1
+91 2298 1
+91 2299 1
+91 2302 1
+91 2303 1
+91 2304 1
+91 2319 1
+91 2329 1
+91 2335 1
+91 2338 1
+91 2339 1
+91 2349 1
+91 2355 1
+91 2358 1
+91 2359 1
+91 2365 1
+91 2368 1
+91 2369 1
+91 2372 1
+91 2373 1
+91 2374 1
+91 2384 1
+91 2390 1
+91 2393 1
+91 2394 1
+91 2400 1
+91 2403 1
+91 2404 1
+91 2407 1
+91 2408 1
+91 2409 1
+91 2415 1
+91 2418 1
+91 2419 1
+91 2422 1
+91 2423 1
+91 2424 1
+91 2427 1
+91 2428 1
+91 2429 1
+91 2430 1
+91 2445 1
+91 2455 1
+91 2461 1
+91 2464 1
+91 2465 1
+91 2475 1
+91 2481 1
+91 2484 1
+91 2485 1
+91 2491 1
+91 2494 1
+91 2495 1
+91 2498 1
+91 2499 1
+91 2500 1
+91 2510 1
+91 2516 1
+91 2519 1
+91 2520 1
+91 2526 1
+91 2529 1
+91 2530 1
+91 2533 1
+91 2534 1
+91 2535 1
+91 2541 1
+91 2544 1
+91 2545 1
+91 2548 1
+91 2549 1
+91 2550 1
+91 2553 1
+91 2554 1
+91 2555 1
+91 2556 1
+91 2566 1
+91 2572 1
+91 2575 1
+91 2576 1
+91 2582 1
+91 2585 1
+91 2586 1
+91 2589 1
+91 2590 1
+91 2591 1
+91 2597 1
+91 2600 1
+91 2601 1
+91 2604 1
+91 2605 1
+91 2606 1
+91 2609 1
+91 2610 1
+91 2611 1
+91 2612 1
+91 2618 1
+91 2621 1
+91 2622 1
+91 2625 1
+91 2626 1
+91 2627 1
+91 2630 1
+91 2631 1
+91 2632 1
+91 2633 1
+91 2636 1
+91 2637 1
+91 2638 1
+91 2639 1
+91 2640 1
+91 2661 1
+91 2676 1
+91 2686 1
+91 2692 1
+91 2695 1
+91 2696 1
+91 2711 1
+91 2721 1
+91 2727 1
+91 2730 1
+91 2731 1
+91 2741 1
+91 2747 1
+91 2750 1
+91 2751 1
+91 2757 1
+91 2760 1
+91 2761 1
+91 2764 1
+91 2765 1
+91 2766 1
+91 2781 1
+91 2791 1
+91 2797 1
+91 2800 1
+91 2801 1
+91 2811 1
+91 2817 1
+91 2820 1
+91 2821 1
+91 2827 1
+91 2830 1
+91 2831 1
+91 2834 1
+91 2835 1
+91 2836 1
+91 2846 1
+91 2852 1
+91 2855 1
+91 2856 1
+91 2862 1
+91 2865 1
+91 2866 1
+91 2869 1
+91 2870 1
+91 2871 1
+91 2877 1
+91 2880 1
+91 2881 1
+91 2884 1
+91 2885 1
+91 2886 1
+91 2889 1
+91 2890 1
+91 2891 1
+91 2892 1
+91 2907 1
+91 2917 1
+91 2923 1
+91 2926 1
+91 2927 1
+91 2937 1
+91 2943 1
+91 2946 1
+91 2947 1
+91 2953 1
+91 2956 1
+91 2957 1
+91 2960 1
+91 2961 1
+91 2962 1
+91 2972 1
+91 2978 1
+91 2981 1
+91 2982 1
+91 2988 1
+91 2991 1
+91 2992 1
+91 2995 1
+91 2996 1
+91 2997 1
+91 3003 1
+91 3006 1
+91 3007 1
+91 3010 1
+91 3011 1
+91 3012 1
+91 3015 1
+91 3016 1
+91 3017 1
+91 3018 1
+91 3028 1
+91 3034 1
+91 3037 1
+91 3038 1
+91 3044 1
+91 3047 1
+91 3048 1
+91 3051 1
+91 3052 1
+91 3053 1
+91 3059 1
+91 3062 1
+91 3063 1
+91 3066 1
+91 3067 1
+91 3068 1
+91 3071 1
+91 3072 1
+91 3073 1
+91 3074 1
+91 3080 1
+91 3083 1
+91 3084 1
+91 3087 1
+91 3088 1
+91 3089 1
+91 3092 1
+91 3093 1
+91 3094 1
+91 3095 1
+91 3098 1
+91 3099 1
+91 3100 1
+91 3101 1
+91 3102 1
+91 3117 1
+91 3127 1
+91 3133 1
+91 3136 1
+91 3137 1
+91 3147 1
+91 3153 1
+91 3156 1
+91 3157 1
+91 3163 1
+91 3166 1
+91 3167 1
+91 3170 1
+91 3171 1
+91 3172 1
+91 3182 1
+91 3188 1
+91 3191 1
+91 3192 1
+91 3198 1
+91 3201 1
+91 3202 1
+91 3205 1
+91 3206 1
+91 3207 1
+91 3213 1
+91 3216 1
+91 3217 1
+91 3220 1
+91 3221 1
+91 3222 1
+91 3225 1
+91 3226 1
+91 3227 1
+91 3228 1
+91 3238 1
+91 3244 1
+91 3247 1
+91 3248 1
+91 3254 1
+91 3257 1
+91 3258 1
+91 3261 1
+91 3262 1
+91 3263 1
+91 3269 1
+91 3272 1
+91 3273 1
+91 3276 1
+91 3277 1
+91 3278 1
+91 3281 1
+91 3282 1
+91 3283 1
+91 3284 1
+91 3290 1
+91 3293 1
+91 3294 1
+91 3297 1
+91 3298 1
+91 3299 1
+91 3302 1
+91 3303 1
+91 3304 1
+91 3305 1
+91 3308 1
+91 3309 1
+91 3310 1
+91 3311 1
+91 3312 1
+91 3322 1
+91 3328 1
+91 3331 1
+91 3332 1
+91 3338 1
+91 3341 1
+91 3342 1
+91 3345 1
+91 3346 1
+91 3347 1
+91 3353 1
+91 3356 1
+91 3357 1
+91 3360 1
+91 3361 1
+91 3362 1
+91 3365 1
+91 3366 1
+91 3367 1
+91 3368 1
+91 3374 1
+91 3377 1
+91 3378 1
+91 3381 1
+91 3382 1
+91 3383 1
+91 3386 1
+91 3387 1
+91 3388 1
+91 3389 1
+91 3392 1
+91 3393 1
+91 3394 1
+91 3395 1
+91 3396 1
+91 3402 1
+91 3405 1
+91 3406 1
+91 3409 1
+91 3410 1
+91 3411 1
+91 3414 1
+91 3415 1
+91 3416 1
+91 3417 1
+91 3420 1
+91 3421 1
+91 3422 1
+91 3423 1
+91 3424 1
+91 3427 1
+91 3428 1
+91 3429 1
+91 3430 1
+91 3431 1
+91 3432 1
+0 0 0
diff --git a/benchmarks/matrix/bibd_14_7_91x3432.sms.gz b/benchmarks/matrix/bibd_14_7_91x3432.sms.gz
new file mode 100644
index 0000000..a8022a2
Binary files /dev/null and b/benchmarks/matrix/bibd_14_7_91x3432.sms.gz differ
diff --git a/benchmarks/omp-benchmark.C b/benchmarks/omp-benchmark.C
new file mode 100644
index 0000000..7cdf575
--- /dev/null
+++ b/benchmarks/omp-benchmark.C
@@ -0,0 +1,320 @@
+/* Copyright (C) 2013 LinBox
+ * Written by AJS <stachnik at udel.edu>
+ *
+ *
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ * ========LICENCE========
+ */
+
+/*! @file benchmarks/omp-benchmark.C
+ * @ingroup benchmarks
+ * @brief f
+ */
+
+#include "linbox/linbox-config.h"
+
+#include <stdlib.h>
+#include <fstream>
+#include <time.h>
+#include <omp.h>
+
+#include "benchmarks/CSValue.h"
+#include "benchmarks/BenchmarkFile.h"
+
+#include "linbox/matrix/sparse-matrix.h"
+#include "linbox/matrix/sparse-matrix.h"
+#include "linbox/vector/blas-vector.h"
+#include "linbox/matrix/dense-matrix.h"
+#include "linbox/util/timer.h"
+#include "linbox/ring/modular.h"
+#include "linbox/matrix/sparsematrix/sparse-tpl-matrix-omp.h"
+#include "linbox/blackbox/transpose.h"
+#include "linbox/vector/vector-domain.h"
+#include "examples/map-sparse.h"
+
+#include "linbox/algorithms/blackbox-block-container.h"
+#include "linbox/algorithms/block-massey-domain.h"
+
+using namespace LinBox;
+
+typedef Givaro::Modular<double> Field;
+typedef TriplesBBOMP<Field> OMPBB;
+typedef TriplesBB<Field> SeqBB;
+typedef SparseMatrix<Field,SparseMatrixFormat::VPV> VPVBB;
+
+int randRange(int start, int end)
+{
+ double rval = rand();
+ static const double NORMALIZING_CONSTANT = 1.0/(1.0+RAND_MAX);
+ double normedRVal = rval*NORMALIZING_CONSTANT;
+ double rangeSize = end-start;
+ int offset = rangeSize*normedRVal;
+ return start+offset;
+}
+
+template<class Blackbox>
+void runBlockWiedemann(BenchmarkFile& of,
+ typename Blackbox::Field F,
+ MapSparse<typename Blackbox::Field> matA,
+ MapSparse<typename Blackbox::Field> matU,
+ MapSparse<typename Blackbox::Field> matV,
+ int iters)
+{
+ typedef typename Blackbox::Field Field;
+ typedef BlackboxBlockContainer<Field,Blackbox> BlockContainer;
+ typedef BlasMatrix<Field> Block;
+
+ int m=matA.rowdim();
+ int n=matA.coldim();
+ int p=matU.rowdim();
+ int q=matV.coldim();
+
+ Blackbox A(F,m,n);
+ Block U(F,p,m), V(F,n,q);
+ matU.copy(U);
+ matV.copy(V);
+ matA.copy(A);
+ A.finalize();
+
+ BlockContainer Sequence(&A,F,U,V);
+ BlockMasseyDomain<Field,BlockContainer> MBD(&Sequence);
+ std::vector<Block> minpoly;
+ std::vector<size_t> degree;
+
+ double start = omp_get_wtime();
+ for (int i=0;i<iters;++i) {
+ MBD.left_minpoly_rec(minpoly,degree);
+ }
+ double time=omp_get_wtime()-start;
+
+ of.addDataField("time",CSDouble(time));
+}
+
+template<class Blackbox>
+void runMMP(BenchmarkFile& of,
+ typename Blackbox::Field F,
+ MapSparse<typename Blackbox::Field> leftMat,
+ MapSparse<typename Blackbox::Field> rightMat,
+ int iters)
+{
+ typedef typename MatrixDomain<typename Blackbox::Field>::OwnMatrix OwnMatrix;
+
+ int m=leftMat.rowdim();
+ int n=leftMat.coldim();
+ int p=rightMat.coldim();
+
+ Blackbox A(F,m,n);
+ OwnMatrix x(F,n,p), y(F,n,p);
+ linbox_check(n==p);
+
+ leftMat.copy(A);
+ rightMat.copy(x);
+ A.finalize();
+
+ double start = omp_get_wtime();
+ for (int i=0;i<iters;++i) {
+ A.applyLeft(y,x);
+ A.applyLeft(x,y);
+ }
+ double time=omp_get_wtime()-start;
+
+ of.addDataField("time",CSDouble(time));
+}
+
+template<class Blackbox>
+void runMVP(BenchmarkFile& of,
+ typename Blackbox::Field F,
+ MapSparse<typename Blackbox::Field> mat,
+ MapSparse<typename Blackbox::Field> vec,
+ int iters)
+{
+ typedef typename Blackbox::Field Field;
+ typedef typename Field::Element Element;
+ typedef typename std::vector<Element> Vector;
+
+ int m=mat.rowdim();
+ int n=mat.coldim();
+
+ Blackbox A(F,m,n);
+ Vector x(n), y(n);
+
+ mat.copy(A);
+ vec.toVector(x);
+ A.finalize();
+
+ double start = omp_get_wtime();
+ for (int i=0;i<iters;++i) {
+ A.apply(y,x);
+ A.apply(x,y);
+ }
+ double time=omp_get_wtime()-start;
+
+ of.addDataField("time",CSDouble(time));
+}
+
+
+void blockWiedemannBenchmark(BenchmarkFile& benchmarkFile,
+ int n,
+ int m,
+ int nnz,
+ int iters,
+ int q)
+{
+ benchmarkFile.addMetadata("problem",CSString("Min-poly"));
+
+ Field F(q);
+
+ MapSparse<Field> A(F,n,n);
+ MapSparse<Field> U(F,n,m);
+ MapSparse<Field> V(F,m,n);
+ MapSparse<Field>::generateRandMat(A,nnz,q);
+ MapSparse<Field>::generateDenseRandMat(U,q);
+ MapSparse<Field>::generateDenseRandMat(V,q);
+
+ benchmarkFile.addDataField("algorithm",CSString("Block-Wiedemann Parallel"));
+ runBlockWiedemann<OMPBB>(benchmarkFile,F,A,U,V,iters);
+ benchmarkFile.pushBackTest();
+
+ benchmarkFile.addDataField("algorithm",CSString("Block-Wiedemann Seq"));
+ runBlockWiedemann<SeqBB>(benchmarkFile,F,A,U,V,iters);
+ benchmarkFile.pushBackTest();
+}
+
+
+void MMPBenchmark(BenchmarkFile& benchmarkFile,
+ int n,
+ int m,
+ int nnz,
+ int iters,
+ int q)
+{
+ benchmarkFile.addMetadata("problem",CSString("Matrix-Matrix Product"));
+
+ Field F(q);
+
+ MapSparse<Field> A(F,n,n);
+ MapSparse<Field> X(F,n,m);
+ MapSparse<Field>::generateRandMat(A,nnz,q);
+ MapSparse<Field>::generateDenseRandMat(X,q);
+
+ benchmarkFile.addDataField("algorithm",CSString("TriplesBBOMP-applyLeft"));
+ runMMP<OMPBB>(benchmarkFile,F,A,X,iters);
+ benchmarkFile.pushBackTest();
+
+ benchmarkFile.addDataField("algorithm",CSString("TriplesBB-seq-applyLeft"));
+ runMMP<SeqBB>(benchmarkFile,F,A,X,iters);
+ benchmarkFile.pushBackTest();
+}
+
+
+void MVPBenchmark(BenchmarkFile& benchmarkFile,
+ int n,
+ int nnz,
+ int iters,
+ int q)
+{
+ benchmarkFile.addMetadata("problem",CSString("Matrix-Vector Product"));
+
+ Field F(q);
+
+ MapSparse<Field> A(F,n,n);
+ MapSparse<Field> X(F,n,1);
+ MapSparse<Field>::generateRandMat(A,nnz,q);
+ MapSparse<Field>::generateDenseRandMat(X,q);
+
+ benchmarkFile.addDataField("algorithm",CSString("TriplesBBOMP-apply"));
+ runMVP<OMPBB>(benchmarkFile,F,A,X,iters);
+ benchmarkFile.pushBackTest();
+
+ benchmarkFile.addDataField("algorithm",CSString("TriplesBBOMP-applyLeft"));
+ runMVP<OMPBB>(benchmarkFile,F,A,X,iters);
+ benchmarkFile.pushBackTest();
+
+ benchmarkFile.addDataField("algorithm",CSString("TriplesBB-seq-applyLeft"));
+ runMVP<SeqBB>(benchmarkFile,F,A,X,iters);
+ benchmarkFile.pushBackTest();
+
+ benchmarkFile.addDataField("algorithm",CSString("TriplesBB-seq-apply"));
+ runMVP<SeqBB>(benchmarkFile,F,A,X,iters);
+ benchmarkFile.pushBackTest();
+
+ benchmarkFile.addDataField("algorithm",CSString("SparseMatrix::VPV"));
+ runMVP<VPVBB>(benchmarkFile,F,A,X,iters);
+ benchmarkFile.pushBackTest();
+}
+
+int main(int argc, char **argv)
+{
+ int numThreads=1,n=50000,m=100,nnz=50000,q=65521,iters=1;
+ bool runMMPBenchmarks=false,runMVPBenchmarks=false,runWiedemann=false;
+
+ static Argument args[] = {
+ { 't', "-t THREADS", "Number of threads", TYPE_INT, &numThreads },
+ { 'n', "-n N", "Dimension of N*N matrix A", TYPE_INT, &n },
+ { 'm', "-m M", "Dimension of N*M matrix X", TYPE_INT, &m },
+ { 'z', "-z NNZ", "Number of non-zero entries", TYPE_INT, &nnz},
+ { 'q', "-q PRIME", "Use field GF(Q) for prime Q", TYPE_INT, &q},
+ { 'i', "-i ITERS", "Number of iterations", TYPE_INT, &iters},
+
+ { 'a', NULL, "Run Matrix-Matrix Benchmarks", TYPE_BOOL,&runMMPBenchmarks},
+ { 'b', NULL, "Run Matrix-Vector Benchmarks", TYPE_BOOL,&runMVPBenchmarks},
+ { 'c', NULL, "Run Block-Wiedemann Benchmarks", TYPE_BOOL,&runWiedemann},
+ END_OF_ARGUMENTS};
+
+ parseArguments (argc, argv, args);
+
+ BenchmarkFile benchmarkFile;
+
+ benchmarkFile.addMetadata("Field-Implementation",CSString("Givaro::Modular<double>"));
+ benchmarkFile.addMetadata("num_threads",CSInt(numThreads));
+ benchmarkFile.addMetadata("N*N Blackbox Dimensions",CSInt(n));
+ benchmarkFile.addMetadata("Fat Vector Dimension",CSInt(m));
+ benchmarkFile.addMetadata("nnz",CSInt(nnz));
+ benchmarkFile.addMetadata("iterations",CSInt(iters));
+ benchmarkFile.addMetadata("date",BenchmarkFile::getDateStamp());
+ benchmarkFile.addMetadata("GF(q)",CSInt(q));
+
+ benchmarkFile.setType("date",BenchmarkFile::getDateFormat());
+ benchmarkFile.setType("time","seconds");
+
+ omp_set_num_threads(numThreads);
+
+ if (runMMPBenchmarks) {
+ MMPBenchmark(benchmarkFile,n,m,nnz,iters,q);
+ benchmarkFile.write(std::cout);
+ }
+ if (runMVPBenchmarks) {
+ MVPBenchmark(benchmarkFile,n,nnz,iters,q);
+ benchmarkFile.write(std::cout);
+ }
+ if (runWiedemann) {
+ blockWiedemannBenchmark(benchmarkFile,n,m,nnz,iters,q);
+ benchmarkFile.write(std::cout);
+ }
+
+ return 0;
+}
+
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/benchmarks/optimizer.h b/benchmarks/optimizer.h
new file mode 100644
index 0000000..9f4d8af
--- /dev/null
+++ b/benchmarks/optimizer.h
@@ -0,0 +1,85 @@
+/* Copyright (C) 2013 LinBox
+ * Written by Brice Boyer (briceboyer) <boyer.brice at gmail.com>
+ *
+ *
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ * ========LICENCE========
+ */
+
+/*! @file benchmarks/optimizer.h
+ * @ingroup benchmarks
+ *
+ */
+
+#ifndef __LINBOX_benchmarks_optimizer_H_
+#define __LINBOX_benchmarks_optimizer_H_
+
+namespace LinBox {
+
+ /* optimiser from a graph. */
+
+ /*
+ * -----
+ * if (a < threshold) then
+ * toto()
+ * else
+ * titi()
+ * ----
+ *
+ * OR (always better)
+ *
+ * ----
+ * toto();
+ * ----
+ */
+
+ // Optimizer opt(Data,Skeleton);
+ // opt.run();
+ // opt.report("file");
+
+ /* optimiser from two timers */
+ // Optimizer opt(class1,class2,Skeleton);
+ // opt.run();
+ // opt.report("file")
+ //
+ // opt.fit()
+ //
+ //
+ class Optimizer {
+
+
+
+ void report(const std::string & filename) ;
+
+ void run() ;
+
+ void fit();
+
+ }
+}
+
+#endif // __LINBOX_benchmarks_optimizer_H_
+
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/benchmarks/perfpublisher.sh b/benchmarks/perfpublisher.sh
new file mode 100755
index 0000000..8be3168
--- /dev/null
+++ b/benchmarks/perfpublisher.sh
@@ -0,0 +1,169 @@
+#!/bin/bash
+# Script to format benchmarks results into a single xml file.
+# See https://wiki.jenkins-ci.org/display/JENKINS/PerfPublisher+Plugin
+# -----
+# 2014/11/17 - Written by AB <Alexis.Breust at imag.fr>
+
+XMLFILE=$1
+benchmarks=$2
+COMPILER=$3
+
+#=================#
+# Plateform infos #
+#=================#
+
+COMPILERVERSION=$($COMPILER --version 2>&1 | head -1)
+CPUFREQ=$(lscpu | grep "MHz" | rev | cut -f1 -d' ' | rev)
+ARCH=$(uname -m)
+OSNAME=$(uname -s)
+OSVERSION=$(uname -r)
+
+if hash lsb_release 2>/dev/null
+ then DISTRIB=$(lsb_release -ds)
+ else DISTRIB='Unknown distribution'
+fi
+
+#==========#
+# Prologue #
+#==========#
+
+if [[ -f $XMLFILE ]]
+then
+ echo '----> WARNING: File '$XMLFILE' is not empty.'
+ echo '----> Results will be added to its end.'
+fi
+
+#========#
+# Header #
+#========#
+
+echo '<?xml version="1.0" encoding="UTF-8"?>' >> $XMLFILE
+echo '<report name="benchmarks-report" categ="benchmarks">' >> $XMLFILE
+
+#=======#
+# Start #
+#=======#
+
+echo '<start>' >> $XMLFILE
+echo '<date format="YYYYMMDD" val="'$(date +%Y%m%d)'" />' >> $XMLFILE
+echo '<time format="HHMMSS" val="'$(date +%H%M%S)'" />' >> $XMLFILE
+echo '</start>' >> $XMLFILE
+
+#============#
+# Benchmarks #
+#============#
+
+for benchmark in $benchmarks
+do
+ if [[ ! -f $benchmark ]]
+ then
+ #File does not exist: compile it
+ echo '[Compiling]' $benchmark
+ COMPILESTART=$(date +%s%3N)
+ COMPILELOG=$(make $benchmark 2>&1; echo 'Returned state: '$?)
+ COMPILEEND=$(date +%s%3N)
+ COMPILETIME=$(($COMPILEEND - $COMPILESTART))
+ COMPILECHECK=$(echo $COMPILELOG | grep -o '[^ ]*$')
+ COMPILETIMERELEVANT='true'
+ else
+ #File does exist
+ echo '[Already compiled]' $benchmark
+ COMPILELOG='(Previously compiled)'
+ COMPILETIME='0.0'
+ COMPILECHECK='0'
+ COMPILETIMERELEVANT='false'
+ fi
+
+ if [[ $COMPILECHECK -ne 0 ]]
+ then
+ #Compilation failure
+ # EXECUTED='no' - keep it to yes so that Jenkins
+ # uses it within its results
+ EXECUTED='yes'
+ PASSED='no'
+ STATE='0'
+ EXECUTIONLOG='(Not executed)'
+ EXECUTIONTIME='0.0'
+ PERFORMANCEFLOPS='0.0'
+ COMPILETIMERELEVANT='false'
+ EXECUTIONTIMERELEVANT='false'
+ PERFORMANCEFLOPSRELEVANT='false'
+ ERRORLOG='Does not compile.'
+ echo '-> Does not compile.'
+ else
+ #Compilation success
+ echo '[Executing]' $benchmark
+ EXECUTED='yes'
+ EXECUTIONLOG=$(./$benchmark 2>&1)
+
+ if [[ ${EXECUTIONLOG,,} != "time:"* ]]
+ then
+ #Execution failure
+ PASSED='no'
+ STATE='0'
+ EXECUTIONTIME='0.0'
+ PERFORMANCEFLOPS='0.0'
+ EXECUTIONTIMERELEVANT='false'
+ PERFORMANCEFLOPSRELEVANT='false'
+ ERRORLOG='Unexpected output.'
+ echo '-> Unexpected output.'
+ else
+ #Execution success
+ PASSED='yes'
+ STATE='100'
+ EXECUTIONTIME=$(echo $EXECUTIONLOG | cut -d' ' -f2)
+ PERFORMANCEFLOPS=$(echo $EXECUTIONLOG | cut -d' ' -f4)
+ EXECUTIONTIMERELEVANT='true'
+ if [[ ${PERFORMANCEFLOPS,,} != "irrelevant" ]]
+ then
+ PERFORMANCEFLOPSRELEVANT='true'
+ else
+ PERFORMANCEFLOPSRELEVANT='false'
+ PERFORMANCEFLOPS='0.0'
+ fi
+ ERRORLOG=''
+ fi
+ fi
+
+ echo '<test name="'$benchmark'" executed="'$EXECUTED'">' >> $XMLFILE
+ echo '<targets><target>BENCHMARK</target></targets>' >> $XMLFILE
+ echo '<platform>' >> $XMLFILE
+ echo '<os>' >> $XMLFILE
+ echo '<name><![CDATA['$OSNAME']]></name>' >> $XMLFILE
+ echo '<version><![CDATA['$OSVERSION']]></version>' >> $XMLFILE
+ echo '<distribution><![CDATA['$DISTRIB']]></distribution>' >> $XMLFILE
+ echo '</os>' >> $XMLFILE
+ echo '<processor arch="'$ARCH'">' >> $XMLFILE
+ echo '<frequency unit="MHz" cpufreq="'$CPUFREQ'" />' >> $XMLFILE
+ echo '</processor>' >> $XMLFILE
+ echo '<compiler name="'$COMPILER'" version="'$COMPILERVERSION'" />' >> $XMLFILE
+ echo '</platform>' >> $XMLFILE
+ echo '<result>' >> $XMLFILE
+
+ # Logs
+ echo '<success passed="'$PASSED'" state="'$STATE'" />' >> $XMLFILE
+ echo '<errorlog><![CDATA['$ERRORLOG']]></errorlog>' >> $XMLFILE
+ echo '<log name="Compile output"><![CDATA['"$COMPILELOG"']]></log>' >> $XMLFILE
+ echo '<log name="Execution output"><![CDATA['"$benchmark $EXECUTIONLOG"']]></log>' >> $XMLFILE
+
+ # Times
+ echo '<compiletime unit="ms" mesure="'$COMPILETIME'" isRelevant="'$COMPILETIMERELEVANT'" />' >> $XMLFILE
+ echo '<executiontime unit="s" mesure="'$EXECUTIONTIME'" isRelevant="'$EXECUTIONTIMERELEVANT'" />' >> $XMLFILE
+ echo '<performance unit="GFLOPS" mesure="'$PERFORMANCEFLOPS'" isRelevant="'$PERFORMANCEFLOPSRELEVANT'" />' >> $XMLFILE
+
+ echo '</result>' >> $XMLFILE
+ echo '</test>' >> $XMLFILE
+done
+
+#========#
+# Footer #
+#========#
+
+echo '</report>' >> $XMLFILE
+
+#==========#
+# Epilogue #
+#==========#
+
+echo 'Results correctly exported to' $XMLFILE
+
diff --git a/build-aux/config.guess b/build-aux/config.guess
deleted file mode 100755
index a3b0d66..0000000
--- a/build-aux/config.guess
+++ /dev/null
@@ -1,1545 +0,0 @@
-#! /bin/sh
-# Attempt to guess a canonical system name.
-# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
-# 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010,
-# 2011, 2012 Free Software Foundation, Inc.
-
-timestamp='2012-02-10'
-
-# This file 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, see <http://www.gnu.org/licenses/>.
-#
-# As a special exception to the GNU General Public License, if you
-# distribute this file as part of a program that contains a
-# configuration script generated by Autoconf, you may include it under
-# the same distribution terms that you use for the rest of that program.
-
-
-# Originally written by Per Bothner. Please send patches (context
-# diff format) to <config-patches at gnu.org> and include a ChangeLog
-# entry.
-#
-# This script attempts to guess a canonical system name similar to
-# config.sub. If it succeeds, it prints the system name on stdout, and
-# exits with 0. Otherwise, it exits with 1.
-#
-# You can get the latest version of this script from:
-# http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD
-
-me=`echo "$0" | sed -e 's,.*/,,'`
-
-usage="\
-Usage: $0 [OPTION]
-
-Output the configuration name of the system \`$me' is run on.
-
-Operation modes:
- -h, --help print this help, then exit
- -t, --time-stamp print date of last modification, then exit
- -v, --version print version number, then exit
-
-Report bugs and patches to <config-patches at gnu.org>."
-
-version="\
-GNU config.guess ($timestamp)
-
-Originally written by Per Bothner.
-Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000,
-2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012
-Free Software Foundation, Inc.
-
-This is free software; see the source for copying conditions. There is NO
-warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
-
-help="
-Try \`$me --help' for more information."
-
-# Parse command line
-while test $# -gt 0 ; do
- case $1 in
- --time-stamp | --time* | -t )
- echo "$timestamp" ; exit ;;
- --version | -v )
- echo "$version" ; exit ;;
- --help | --h* | -h )
- echo "$usage"; exit ;;
- -- ) # Stop option processing
- shift; break ;;
- - ) # Use stdin as input.
- break ;;
- -* )
- echo "$me: invalid option $1$help" >&2
- exit 1 ;;
- * )
- break ;;
- esac
-done
-
-if test $# != 0; then
- echo "$me: too many arguments$help" >&2
- exit 1
-fi
-
-trap 'exit 1' 1 2 15
-
-# CC_FOR_BUILD -- compiler used by this script. Note that the use of a
-# compiler to aid in system detection is discouraged as it requires
-# temporary files to be created and, as you can see below, it is a
-# headache to deal with in a portable fashion.
-
-# Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still
-# use `HOST_CC' if defined, but it is deprecated.
-
-# Portable tmp directory creation inspired by the Autoconf team.
-
-set_cc_for_build='
-trap "exitcode=\$?; (rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null) && exit \$exitcode" 0 ;
-trap "rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null; exit 1" 1 2 13 15 ;
-: ${TMPDIR=/tmp} ;
- { tmp=`(umask 077 && mktemp -d "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } ||
- { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir $tmp) ; } ||
- { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir $tmp) && echo "Warning: creating insecure temp directory" >&2 ; } ||
- { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } ;
-dummy=$tmp/dummy ;
-tmpfiles="$dummy.c $dummy.o $dummy.rel $dummy" ;
-case $CC_FOR_BUILD,$HOST_CC,$CC in
- ,,) echo "int x;" > $dummy.c ;
- for c in cc gcc c89 c99 ; do
- if ($c -c -o $dummy.o $dummy.c) >/dev/null 2>&1 ; then
- CC_FOR_BUILD="$c"; break ;
- fi ;
- done ;
- if test x"$CC_FOR_BUILD" = x ; then
- CC_FOR_BUILD=no_compiler_found ;
- fi
- ;;
- ,,*) CC_FOR_BUILD=$CC ;;
- ,*,*) CC_FOR_BUILD=$HOST_CC ;;
-esac ; set_cc_for_build= ;'
-
-# This is needed to find uname on a Pyramid OSx when run in the BSD universe.
-# (ghazi at noc.rutgers.edu 1994-08-24)
-if (test -f /.attbin/uname) >/dev/null 2>&1 ; then
- PATH=$PATH:/.attbin ; export PATH
-fi
-
-UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown
-UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown
-UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown
-UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown
-
-case "${UNAME_SYSTEM}" in
-Linux|GNU/*)
- eval $set_cc_for_build
- cat <<-EOF > $dummy.c
- #include <features.h>
- #ifdef __UCLIBC__
- # ifdef __UCLIBC_CONFIG_VERSION__
- LIBC=uclibc __UCLIBC_CONFIG_VERSION__
- # else
- LIBC=uclibc
- # endif
- #else
- # ifdef __dietlibc__
- LIBC=dietlibc
- # else
- LIBC=gnu
- # endif
- #endif
- EOF
- eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^LIBC'`
- ;;
-esac
-
-# Note: order is significant - the case branches are not exclusive.
-
-case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
- *:NetBSD:*:*)
- # NetBSD (nbsd) targets should (where applicable) match one or
- # more of the tuples: *-*-netbsdelf*, *-*-netbsdaout*,
- # *-*-netbsdecoff* and *-*-netbsd*. For targets that recently
- # switched to ELF, *-*-netbsd* would select the old
- # object file format. This provides both forward
- # compatibility and a consistent mechanism for selecting the
- # object file format.
- #
- # Note: NetBSD doesn't particularly care about the vendor
- # portion of the name. We always set it to "unknown".
- sysctl="sysctl -n hw.machine_arch"
- UNAME_MACHINE_ARCH=`(/sbin/$sysctl 2>/dev/null || \
- /usr/sbin/$sysctl 2>/dev/null || echo unknown)`
- case "${UNAME_MACHINE_ARCH}" in
- armeb) machine=armeb-unknown ;;
- arm*) machine=arm-unknown ;;
- sh3el) machine=shl-unknown ;;
- sh3eb) machine=sh-unknown ;;
- sh5el) machine=sh5le-unknown ;;
- *) machine=${UNAME_MACHINE_ARCH}-unknown ;;
- esac
- # The Operating System including object format, if it has switched
- # to ELF recently, or will in the future.
- case "${UNAME_MACHINE_ARCH}" in
- arm*|i386|m68k|ns32k|sh3*|sparc|vax)
- eval $set_cc_for_build
- if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \
- | grep -q __ELF__
- then
- # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout).
- # Return netbsd for either. FIX?
- os=netbsd
- else
- os=netbsdelf
- fi
- ;;
- *)
- os=netbsd
- ;;
- esac
- # The OS release
- # Debian GNU/NetBSD machines have a different userland, and
- # thus, need a distinct triplet. However, they do not need
- # kernel version information, so it can be replaced with a
- # suitable tag, in the style of linux-gnu.
- case "${UNAME_VERSION}" in
- Debian*)
- release='-gnu'
- ;;
- *)
- release=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'`
- ;;
- esac
- # Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM:
- # contains redundant information, the shorter form:
- # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used.
- echo "${machine}-${os}${release}"
- exit ;;
- *:OpenBSD:*:*)
- UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'`
- echo ${UNAME_MACHINE_ARCH}-unknown-openbsd${UNAME_RELEASE}
- exit ;;
- *:ekkoBSD:*:*)
- echo ${UNAME_MACHINE}-unknown-ekkobsd${UNAME_RELEASE}
- exit ;;
- *:SolidBSD:*:*)
- echo ${UNAME_MACHINE}-unknown-solidbsd${UNAME_RELEASE}
- exit ;;
- macppc:MirBSD:*:*)
- echo powerpc-unknown-mirbsd${UNAME_RELEASE}
- exit ;;
- *:MirBSD:*:*)
- echo ${UNAME_MACHINE}-unknown-mirbsd${UNAME_RELEASE}
- exit ;;
- alpha:OSF1:*:*)
- case $UNAME_RELEASE in
- *4.0)
- UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'`
- ;;
- *5.*)
- UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'`
- ;;
- esac
- # According to Compaq, /usr/sbin/psrinfo has been available on
- # OSF/1 and Tru64 systems produced since 1995. I hope that
- # covers most systems running today. This code pipes the CPU
- # types through head -n 1, so we only detect the type of CPU 0.
- ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^ The alpha \(.*\) processor.*$/\1/p' | head -n 1`
- case "$ALPHA_CPU_TYPE" in
- "EV4 (21064)")
- UNAME_MACHINE="alpha" ;;
- "EV4.5 (21064)")
- UNAME_MACHINE="alpha" ;;
- "LCA4 (21066/21068)")
- UNAME_MACHINE="alpha" ;;
- "EV5 (21164)")
- UNAME_MACHINE="alphaev5" ;;
- "EV5.6 (21164A)")
- UNAME_MACHINE="alphaev56" ;;
- "EV5.6 (21164PC)")
- UNAME_MACHINE="alphapca56" ;;
- "EV5.7 (21164PC)")
- UNAME_MACHINE="alphapca57" ;;
- "EV6 (21264)")
- UNAME_MACHINE="alphaev6" ;;
- "EV6.7 (21264A)")
- UNAME_MACHINE="alphaev67" ;;
- "EV6.8CB (21264C)")
- UNAME_MACHINE="alphaev68" ;;
- "EV6.8AL (21264B)")
- UNAME_MACHINE="alphaev68" ;;
- "EV6.8CX (21264D)")
- UNAME_MACHINE="alphaev68" ;;
- "EV6.9A (21264/EV69A)")
- UNAME_MACHINE="alphaev69" ;;
- "EV7 (21364)")
- UNAME_MACHINE="alphaev7" ;;
- "EV7.9 (21364A)")
- UNAME_MACHINE="alphaev79" ;;
- esac
- # A Pn.n version is a patched version.
- # A Vn.n version is a released version.
- # A Tn.n version is a released field test version.
- # A Xn.n version is an unreleased experimental baselevel.
- # 1.2 uses "1.2" for uname -r.
- echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[PVTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'`
- # Reset EXIT trap before exiting to avoid spurious non-zero exit code.
- exitcode=$?
- trap '' 0
- exit $exitcode ;;
- Alpha\ *:Windows_NT*:*)
- # How do we know it's Interix rather than the generic POSIX subsystem?
- # Should we change UNAME_MACHINE based on the output of uname instead
- # of the specific Alpha model?
- echo alpha-pc-interix
- exit ;;
- 21064:Windows_NT:50:3)
- echo alpha-dec-winnt3.5
- exit ;;
- Amiga*:UNIX_System_V:4.0:*)
- echo m68k-unknown-sysv4
- exit ;;
- *:[Aa]miga[Oo][Ss]:*:*)
- echo ${UNAME_MACHINE}-unknown-amigaos
- exit ;;
- *:[Mm]orph[Oo][Ss]:*:*)
- echo ${UNAME_MACHINE}-unknown-morphos
- exit ;;
- *:OS/390:*:*)
- echo i370-ibm-openedition
- exit ;;
- *:z/VM:*:*)
- echo s390-ibm-zvmoe
- exit ;;
- *:OS400:*:*)
- echo powerpc-ibm-os400
- exit ;;
- arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*)
- echo arm-acorn-riscix${UNAME_RELEASE}
- exit ;;
- arm:riscos:*:*|arm:RISCOS:*:*)
- echo arm-unknown-riscos
- exit ;;
- SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*)
- echo hppa1.1-hitachi-hiuxmpp
- exit ;;
- Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*)
- # akee at wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE.
- if test "`(/bin/universe) 2>/dev/null`" = att ; then
- echo pyramid-pyramid-sysv3
- else
- echo pyramid-pyramid-bsd
- fi
- exit ;;
- NILE*:*:*:dcosx)
- echo pyramid-pyramid-svr4
- exit ;;
- DRS?6000:unix:4.0:6*)
- echo sparc-icl-nx6
- exit ;;
- DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*)
- case `/usr/bin/uname -p` in
- sparc) echo sparc-icl-nx7; exit ;;
- esac ;;
- s390x:SunOS:*:*)
- echo ${UNAME_MACHINE}-ibm-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
- exit ;;
- sun4H:SunOS:5.*:*)
- echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
- exit ;;
- sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*)
- echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
- exit ;;
- i86pc:AuroraUX:5.*:* | i86xen:AuroraUX:5.*:*)
- echo i386-pc-auroraux${UNAME_RELEASE}
- exit ;;
- i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*)
- eval $set_cc_for_build
- SUN_ARCH="i386"
- # If there is a compiler, see if it is configured for 64-bit objects.
- # Note that the Sun cc does not turn __LP64__ into 1 like gcc does.
- # This test works for both compilers.
- if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then
- if (echo '#ifdef __amd64'; echo IS_64BIT_ARCH; echo '#endif') | \
- (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \
- grep IS_64BIT_ARCH >/dev/null
- then
- SUN_ARCH="x86_64"
- fi
- fi
- echo ${SUN_ARCH}-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
- exit ;;
- sun4*:SunOS:6*:*)
- # According to config.sub, this is the proper way to canonicalize
- # SunOS6. Hard to guess exactly what SunOS6 will be like, but
- # it's likely to be more like Solaris than SunOS4.
- echo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
- exit ;;
- sun4*:SunOS:*:*)
- case "`/usr/bin/arch -k`" in
- Series*|S4*)
- UNAME_RELEASE=`uname -v`
- ;;
- esac
- # Japanese Language versions have a version number like `4.1.3-JL'.
- echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'`
- exit ;;
- sun3*:SunOS:*:*)
- echo m68k-sun-sunos${UNAME_RELEASE}
- exit ;;
- sun*:*:4.2BSD:*)
- UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null`
- test "x${UNAME_RELEASE}" = "x" && UNAME_RELEASE=3
- case "`/bin/arch`" in
- sun3)
- echo m68k-sun-sunos${UNAME_RELEASE}
- ;;
- sun4)
- echo sparc-sun-sunos${UNAME_RELEASE}
- ;;
- esac
- exit ;;
- aushp:SunOS:*:*)
- echo sparc-auspex-sunos${UNAME_RELEASE}
- exit ;;
- # The situation for MiNT is a little confusing. The machine name
- # can be virtually everything (everything which is not
- # "atarist" or "atariste" at least should have a processor
- # > m68000). The system name ranges from "MiNT" over "FreeMiNT"
- # to the lowercase version "mint" (or "freemint"). Finally
- # the system name "TOS" denotes a system which is actually not
- # MiNT. But MiNT is downward compatible to TOS, so this should
- # be no problem.
- atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*)
- echo m68k-atari-mint${UNAME_RELEASE}
- exit ;;
- atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*)
- echo m68k-atari-mint${UNAME_RELEASE}
- exit ;;
- *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*)
- echo m68k-atari-mint${UNAME_RELEASE}
- exit ;;
- milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*)
- echo m68k-milan-mint${UNAME_RELEASE}
- exit ;;
- hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*)
- echo m68k-hades-mint${UNAME_RELEASE}
- exit ;;
- *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*)
- echo m68k-unknown-mint${UNAME_RELEASE}
- exit ;;
- m68k:machten:*:*)
- echo m68k-apple-machten${UNAME_RELEASE}
- exit ;;
- powerpc:machten:*:*)
- echo powerpc-apple-machten${UNAME_RELEASE}
- exit ;;
- RISC*:Mach:*:*)
- echo mips-dec-mach_bsd4.3
- exit ;;
- RISC*:ULTRIX:*:*)
- echo mips-dec-ultrix${UNAME_RELEASE}
- exit ;;
- VAX*:ULTRIX*:*:*)
- echo vax-dec-ultrix${UNAME_RELEASE}
- exit ;;
- 2020:CLIX:*:* | 2430:CLIX:*:*)
- echo clipper-intergraph-clix${UNAME_RELEASE}
- exit ;;
- mips:*:*:UMIPS | mips:*:*:RISCos)
- eval $set_cc_for_build
- sed 's/^ //' << EOF >$dummy.c
-#ifdef __cplusplus
-#include <stdio.h> /* for printf() prototype */
- int main (int argc, char *argv[]) {
-#else
- int main (argc, argv) int argc; char *argv[]; {
-#endif
- #if defined (host_mips) && defined (MIPSEB)
- #if defined (SYSTYPE_SYSV)
- printf ("mips-mips-riscos%ssysv\n", argv[1]); exit (0);
- #endif
- #if defined (SYSTYPE_SVR4)
- printf ("mips-mips-riscos%ssvr4\n", argv[1]); exit (0);
- #endif
- #if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD)
- printf ("mips-mips-riscos%sbsd\n", argv[1]); exit (0);
- #endif
- #endif
- exit (-1);
- }
-EOF
- $CC_FOR_BUILD -o $dummy $dummy.c &&
- dummyarg=`echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` &&
- SYSTEM_NAME=`$dummy $dummyarg` &&
- { echo "$SYSTEM_NAME"; exit; }
- echo mips-mips-riscos${UNAME_RELEASE}
- exit ;;
- Motorola:PowerMAX_OS:*:*)
- echo powerpc-motorola-powermax
- exit ;;
- Motorola:*:4.3:PL8-*)
- echo powerpc-harris-powermax
- exit ;;
- Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*)
- echo powerpc-harris-powermax
- exit ;;
- Night_Hawk:Power_UNIX:*:*)
- echo powerpc-harris-powerunix
- exit ;;
- m88k:CX/UX:7*:*)
- echo m88k-harris-cxux7
- exit ;;
- m88k:*:4*:R4*)
- echo m88k-motorola-sysv4
- exit ;;
- m88k:*:3*:R3*)
- echo m88k-motorola-sysv3
- exit ;;
- AViiON:dgux:*:*)
- # DG/UX returns AViiON for all architectures
- UNAME_PROCESSOR=`/usr/bin/uname -p`
- if [ $UNAME_PROCESSOR = mc88100 ] || [ $UNAME_PROCESSOR = mc88110 ]
- then
- if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx ] || \
- [ ${TARGET_BINARY_INTERFACE}x = x ]
- then
- echo m88k-dg-dgux${UNAME_RELEASE}
- else
- echo m88k-dg-dguxbcs${UNAME_RELEASE}
- fi
- else
- echo i586-dg-dgux${UNAME_RELEASE}
- fi
- exit ;;
- M88*:DolphinOS:*:*) # DolphinOS (SVR3)
- echo m88k-dolphin-sysv3
- exit ;;
- M88*:*:R3*:*)
- # Delta 88k system running SVR3
- echo m88k-motorola-sysv3
- exit ;;
- XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3)
- echo m88k-tektronix-sysv3
- exit ;;
- Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD)
- echo m68k-tektronix-bsd
- exit ;;
- *:IRIX*:*:*)
- echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'`
- exit ;;
- ????????:AIX?:[12].1:2) # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX.
- echo romp-ibm-aix # uname -m gives an 8 hex-code CPU id
- exit ;; # Note that: echo "'`uname -s`'" gives 'AIX '
- i*86:AIX:*:*)
- echo i386-ibm-aix
- exit ;;
- ia64:AIX:*:*)
- if [ -x /usr/bin/oslevel ] ; then
- IBM_REV=`/usr/bin/oslevel`
- else
- IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE}
- fi
- echo ${UNAME_MACHINE}-ibm-aix${IBM_REV}
- exit ;;
- *:AIX:2:3)
- if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then
- eval $set_cc_for_build
- sed 's/^ //' << EOF >$dummy.c
- #include <sys/systemcfg.h>
-
- main()
- {
- if (!__power_pc())
- exit(1);
- puts("powerpc-ibm-aix3.2.5");
- exit(0);
- }
-EOF
- if $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy`
- then
- echo "$SYSTEM_NAME"
- else
- echo rs6000-ibm-aix3.2.5
- fi
- elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then
- echo rs6000-ibm-aix3.2.4
- else
- echo rs6000-ibm-aix3.2
- fi
- exit ;;
- *:AIX:*:[4567])
- IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'`
- if /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then
- IBM_ARCH=rs6000
- else
- IBM_ARCH=powerpc
- fi
- if [ -x /usr/bin/oslevel ] ; then
- IBM_REV=`/usr/bin/oslevel`
- else
- IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE}
- fi
- echo ${IBM_ARCH}-ibm-aix${IBM_REV}
- exit ;;
- *:AIX:*:*)
- echo rs6000-ibm-aix
- exit ;;
- ibmrt:4.4BSD:*|romp-ibm:BSD:*)
- echo romp-ibm-bsd4.4
- exit ;;
- ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC BSD and
- echo romp-ibm-bsd${UNAME_RELEASE} # 4.3 with uname added to
- exit ;; # report: romp-ibm BSD 4.3
- *:BOSX:*:*)
- echo rs6000-bull-bosx
- exit ;;
- DPX/2?00:B.O.S.:*:*)
- echo m68k-bull-sysv3
- exit ;;
- 9000/[34]??:4.3bsd:1.*:*)
- echo m68k-hp-bsd
- exit ;;
- hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*)
- echo m68k-hp-bsd4.4
- exit ;;
- 9000/[34678]??:HP-UX:*:*)
- HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'`
- case "${UNAME_MACHINE}" in
- 9000/31? ) HP_ARCH=m68000 ;;
- 9000/[34]?? ) HP_ARCH=m68k ;;
- 9000/[678][0-9][0-9])
- if [ -x /usr/bin/getconf ]; then
- sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null`
- sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null`
- case "${sc_cpu_version}" in
- 523) HP_ARCH="hppa1.0" ;; # CPU_PA_RISC1_0
- 528) HP_ARCH="hppa1.1" ;; # CPU_PA_RISC1_1
- 532) # CPU_PA_RISC2_0
- case "${sc_kernel_bits}" in
- 32) HP_ARCH="hppa2.0n" ;;
- 64) HP_ARCH="hppa2.0w" ;;
- '') HP_ARCH="hppa2.0" ;; # HP-UX 10.20
- esac ;;
- esac
- fi
- if [ "${HP_ARCH}" = "" ]; then
- eval $set_cc_for_build
- sed 's/^ //' << EOF >$dummy.c
-
- #define _HPUX_SOURCE
- #include <stdlib.h>
- #include <unistd.h>
-
- int main ()
- {
- #if defined(_SC_KERNEL_BITS)
- long bits = sysconf(_SC_KERNEL_BITS);
- #endif
- long cpu = sysconf (_SC_CPU_VERSION);
-
- switch (cpu)
- {
- case CPU_PA_RISC1_0: puts ("hppa1.0"); break;
- case CPU_PA_RISC1_1: puts ("hppa1.1"); break;
- case CPU_PA_RISC2_0:
- #if defined(_SC_KERNEL_BITS)
- switch (bits)
- {
- case 64: puts ("hppa2.0w"); break;
- case 32: puts ("hppa2.0n"); break;
- default: puts ("hppa2.0"); break;
- } break;
- #else /* !defined(_SC_KERNEL_BITS) */
- puts ("hppa2.0"); break;
- #endif
- default: puts ("hppa1.0"); break;
- }
- exit (0);
- }
-EOF
- (CCOPTS= $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null) && HP_ARCH=`$dummy`
- test -z "$HP_ARCH" && HP_ARCH=hppa
- fi ;;
- esac
- if [ ${HP_ARCH} = "hppa2.0w" ]
- then
- eval $set_cc_for_build
-
- # hppa2.0w-hp-hpux* has a 64-bit kernel and a compiler generating
- # 32-bit code. hppa64-hp-hpux* has the same kernel and a compiler
- # generating 64-bit code. GNU and HP use different nomenclature:
- #
- # $ CC_FOR_BUILD=cc ./config.guess
- # => hppa2.0w-hp-hpux11.23
- # $ CC_FOR_BUILD="cc +DA2.0w" ./config.guess
- # => hppa64-hp-hpux11.23
-
- if echo __LP64__ | (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) |
- grep -q __LP64__
- then
- HP_ARCH="hppa2.0w"
- else
- HP_ARCH="hppa64"
- fi
- fi
- echo ${HP_ARCH}-hp-hpux${HPUX_REV}
- exit ;;
- ia64:HP-UX:*:*)
- HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'`
- echo ia64-hp-hpux${HPUX_REV}
- exit ;;
- 3050*:HI-UX:*:*)
- eval $set_cc_for_build
- sed 's/^ //' << EOF >$dummy.c
- #include <unistd.h>
- int
- main ()
- {
- long cpu = sysconf (_SC_CPU_VERSION);
- /* The order matters, because CPU_IS_HP_MC68K erroneously returns
- true for CPU_PA_RISC1_0. CPU_IS_PA_RISC returns correct
- results, however. */
- if (CPU_IS_PA_RISC (cpu))
- {
- switch (cpu)
- {
- case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break;
- case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break;
- case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break;
- default: puts ("hppa-hitachi-hiuxwe2"); break;
- }
- }
- else if (CPU_IS_HP_MC68K (cpu))
- puts ("m68k-hitachi-hiuxwe2");
- else puts ("unknown-hitachi-hiuxwe2");
- exit (0);
- }
-EOF
- $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` &&
- { echo "$SYSTEM_NAME"; exit; }
- echo unknown-hitachi-hiuxwe2
- exit ;;
- 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* )
- echo hppa1.1-hp-bsd
- exit ;;
- 9000/8??:4.3bsd:*:*)
- echo hppa1.0-hp-bsd
- exit ;;
- *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*)
- echo hppa1.0-hp-mpeix
- exit ;;
- hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* )
- echo hppa1.1-hp-osf
- exit ;;
- hp8??:OSF1:*:*)
- echo hppa1.0-hp-osf
- exit ;;
- i*86:OSF1:*:*)
- if [ -x /usr/sbin/sysversion ] ; then
- echo ${UNAME_MACHINE}-unknown-osf1mk
- else
- echo ${UNAME_MACHINE}-unknown-osf1
- fi
- exit ;;
- parisc*:Lites*:*:*)
- echo hppa1.1-hp-lites
- exit ;;
- C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*)
- echo c1-convex-bsd
- exit ;;
- C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*)
- if getsysinfo -f scalar_acc
- then echo c32-convex-bsd
- else echo c2-convex-bsd
- fi
- exit ;;
- C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*)
- echo c34-convex-bsd
- exit ;;
- C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*)
- echo c38-convex-bsd
- exit ;;
- C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*)
- echo c4-convex-bsd
- exit ;;
- CRAY*Y-MP:*:*:*)
- echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
- exit ;;
- CRAY*[A-Z]90:*:*:*)
- echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \
- | sed -e 's/CRAY.*\([A-Z]90\)/\1/' \
- -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \
- -e 's/\.[^.]*$/.X/'
- exit ;;
- CRAY*TS:*:*:*)
- echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
- exit ;;
- CRAY*T3E:*:*:*)
- echo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
- exit ;;
- CRAY*SV1:*:*:*)
- echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
- exit ;;
- *:UNICOS/mp:*:*)
- echo craynv-cray-unicosmp${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
- exit ;;
- F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*)
- FUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'`
- FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'`
- FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'`
- echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}"
- exit ;;
- 5000:UNIX_System_V:4.*:*)
- FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'`
- FUJITSU_REL=`echo ${UNAME_RELEASE} | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/ /_/'`
- echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}"
- exit ;;
- i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*)
- echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE}
- exit ;;
- sparc*:BSD/OS:*:*)
- echo sparc-unknown-bsdi${UNAME_RELEASE}
- exit ;;
- *:BSD/OS:*:*)
- echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE}
- exit ;;
- *:FreeBSD:*:*)
- UNAME_PROCESSOR=`/usr/bin/uname -p`
- case ${UNAME_PROCESSOR} in
- amd64)
- echo x86_64-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;;
- *)
- echo ${UNAME_PROCESSOR}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;;
- esac
- exit ;;
- i*:CYGWIN*:*)
- echo ${UNAME_MACHINE}-pc-cygwin
- exit ;;
- *:MINGW*:*)
- echo ${UNAME_MACHINE}-pc-mingw32
- exit ;;
- i*:MSYS*:*)
- echo ${UNAME_MACHINE}-pc-msys
- exit ;;
- i*:windows32*:*)
- # uname -m includes "-pc" on this system.
- echo ${UNAME_MACHINE}-mingw32
- exit ;;
- i*:PW*:*)
- echo ${UNAME_MACHINE}-pc-pw32
- exit ;;
- *:Interix*:*)
- case ${UNAME_MACHINE} in
- x86)
- echo i586-pc-interix${UNAME_RELEASE}
- exit ;;
- authenticamd | genuineintel | EM64T)
- echo x86_64-unknown-interix${UNAME_RELEASE}
- exit ;;
- IA64)
- echo ia64-unknown-interix${UNAME_RELEASE}
- exit ;;
- esac ;;
- [345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*)
- echo i${UNAME_MACHINE}-pc-mks
- exit ;;
- 8664:Windows_NT:*)
- echo x86_64-pc-mks
- exit ;;
- i*:Windows_NT*:* | Pentium*:Windows_NT*:*)
- # How do we know it's Interix rather than the generic POSIX subsystem?
- # It also conflicts with pre-2.0 versions of AT&T UWIN. Should we
- # UNAME_MACHINE based on the output of uname instead of i386?
- echo i586-pc-interix
- exit ;;
- i*:UWIN*:*)
- echo ${UNAME_MACHINE}-pc-uwin
- exit ;;
- amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*)
- echo x86_64-unknown-cygwin
- exit ;;
- p*:CYGWIN*:*)
- echo powerpcle-unknown-cygwin
- exit ;;
- prep*:SunOS:5.*:*)
- echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
- exit ;;
- *:GNU:*:*)
- # the GNU system
- echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-${LIBC}`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'`
- exit ;;
- *:GNU/*:*:*)
- # other systems with GNU libc and userland
- echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr '[A-Z]' '[a-z]'``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-${LIBC}
- exit ;;
- i*86:Minix:*:*)
- echo ${UNAME_MACHINE}-pc-minix
- exit ;;
- aarch64:Linux:*:*)
- echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
- exit ;;
- aarch64_be:Linux:*:*)
- UNAME_MACHINE=aarch64_be
- echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
- exit ;;
- alpha:Linux:*:*)
- case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in
- EV5) UNAME_MACHINE=alphaev5 ;;
- EV56) UNAME_MACHINE=alphaev56 ;;
- PCA56) UNAME_MACHINE=alphapca56 ;;
- PCA57) UNAME_MACHINE=alphapca56 ;;
- EV6) UNAME_MACHINE=alphaev6 ;;
- EV67) UNAME_MACHINE=alphaev67 ;;
- EV68*) UNAME_MACHINE=alphaev68 ;;
- esac
- objdump --private-headers /bin/sh | grep -q ld.so.1
- if test "$?" = 0 ; then LIBC="gnulibc1" ; fi
- echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
- exit ;;
- arm*:Linux:*:*)
- eval $set_cc_for_build
- if echo __ARM_EABI__ | $CC_FOR_BUILD -E - 2>/dev/null \
- | grep -q __ARM_EABI__
- then
- echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
- else
- if echo __ARM_PCS_VFP | $CC_FOR_BUILD -E - 2>/dev/null \
- | grep -q __ARM_PCS_VFP
- then
- echo ${UNAME_MACHINE}-unknown-linux-${LIBC}eabi
- else
- echo ${UNAME_MACHINE}-unknown-linux-${LIBC}eabihf
- fi
- fi
- exit ;;
- avr32*:Linux:*:*)
- echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
- exit ;;
- cris:Linux:*:*)
- echo ${UNAME_MACHINE}-axis-linux-${LIBC}
- exit ;;
- crisv32:Linux:*:*)
- echo ${UNAME_MACHINE}-axis-linux-${LIBC}
- exit ;;
- frv:Linux:*:*)
- echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
- exit ;;
- hexagon:Linux:*:*)
- echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
- exit ;;
- i*86:Linux:*:*)
- echo ${UNAME_MACHINE}-pc-linux-${LIBC}
- exit ;;
- ia64:Linux:*:*)
- echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
- exit ;;
- m32r*:Linux:*:*)
- echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
- exit ;;
- m68*:Linux:*:*)
- echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
- exit ;;
- mips:Linux:*:* | mips64:Linux:*:*)
- eval $set_cc_for_build
- sed 's/^ //' << EOF >$dummy.c
- #undef CPU
- #undef ${UNAME_MACHINE}
- #undef ${UNAME_MACHINE}el
- #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL)
- CPU=${UNAME_MACHINE}el
- #else
- #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB)
- CPU=${UNAME_MACHINE}
- #else
- CPU=
- #endif
- #endif
-EOF
- eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^CPU'`
- test x"${CPU}" != x && { echo "${CPU}-unknown-linux-${LIBC}"; exit; }
- ;;
- or32:Linux:*:*)
- echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
- exit ;;
- padre:Linux:*:*)
- echo sparc-unknown-linux-${LIBC}
- exit ;;
- parisc64:Linux:*:* | hppa64:Linux:*:*)
- echo hppa64-unknown-linux-${LIBC}
- exit ;;
- parisc:Linux:*:* | hppa:Linux:*:*)
- # Look for CPU level
- case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in
- PA7*) echo hppa1.1-unknown-linux-${LIBC} ;;
- PA8*) echo hppa2.0-unknown-linux-${LIBC} ;;
- *) echo hppa-unknown-linux-${LIBC} ;;
- esac
- exit ;;
- ppc64:Linux:*:*)
- echo powerpc64-unknown-linux-${LIBC}
- exit ;;
- ppc:Linux:*:*)
- echo powerpc-unknown-linux-${LIBC}
- exit ;;
- s390:Linux:*:* | s390x:Linux:*:*)
- echo ${UNAME_MACHINE}-ibm-linux
- exit ;;
- sh64*:Linux:*:*)
- echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
- exit ;;
- sh*:Linux:*:*)
- echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
- exit ;;
- sparc:Linux:*:* | sparc64:Linux:*:*)
- echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
- exit ;;
- tile*:Linux:*:*)
- echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
- exit ;;
- vax:Linux:*:*)
- echo ${UNAME_MACHINE}-dec-linux-${LIBC}
- exit ;;
- x86_64:Linux:*:*)
- echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
- exit ;;
- xtensa*:Linux:*:*)
- echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
- exit ;;
- i*86:DYNIX/ptx:4*:*)
- # ptx 4.0 does uname -s correctly, with DYNIX/ptx in there.
- # earlier versions are messed up and put the nodename in both
- # sysname and nodename.
- echo i386-sequent-sysv4
- exit ;;
- i*86:UNIX_SV:4.2MP:2.*)
- # Unixware is an offshoot of SVR4, but it has its own version
- # number series starting with 2...
- # I am not positive that other SVR4 systems won't match this,
- # I just have to hope. -- rms.
- # Use sysv4.2uw... so that sysv4* matches it.
- echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION}
- exit ;;
- i*86:OS/2:*:*)
- # If we were able to find `uname', then EMX Unix compatibility
- # is probably installed.
- echo ${UNAME_MACHINE}-pc-os2-emx
- exit ;;
- i*86:XTS-300:*:STOP)
- echo ${UNAME_MACHINE}-unknown-stop
- exit ;;
- i*86:atheos:*:*)
- echo ${UNAME_MACHINE}-unknown-atheos
- exit ;;
- i*86:syllable:*:*)
- echo ${UNAME_MACHINE}-pc-syllable
- exit ;;
- i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.[02]*:*)
- echo i386-unknown-lynxos${UNAME_RELEASE}
- exit ;;
- i*86:*DOS:*:*)
- echo ${UNAME_MACHINE}-pc-msdosdjgpp
- exit ;;
- i*86:*:4.*:* | i*86:SYSTEM_V:4.*:*)
- UNAME_REL=`echo ${UNAME_RELEASE} | sed 's/\/MP$//'`
- if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then
- echo ${UNAME_MACHINE}-univel-sysv${UNAME_REL}
- else
- echo ${UNAME_MACHINE}-pc-sysv${UNAME_REL}
- fi
- exit ;;
- i*86:*:5:[678]*)
- # UnixWare 7.x, OpenUNIX and OpenServer 6.
- case `/bin/uname -X | grep "^Machine"` in
- *486*) UNAME_MACHINE=i486 ;;
- *Pentium) UNAME_MACHINE=i586 ;;
- *Pent*|*Celeron) UNAME_MACHINE=i686 ;;
- esac
- echo ${UNAME_MACHINE}-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION}
- exit ;;
- i*86:*:3.2:*)
- if test -f /usr/options/cb.name; then
- UNAME_REL=`sed -n 's/.*Version //p' </usr/options/cb.name`
- echo ${UNAME_MACHINE}-pc-isc$UNAME_REL
- elif /bin/uname -X 2>/dev/null >/dev/null ; then
- UNAME_REL=`(/bin/uname -X|grep Release|sed -e 's/.*= //')`
- (/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486
- (/bin/uname -X|grep '^Machine.*Pentium' >/dev/null) \
- && UNAME_MACHINE=i586
- (/bin/uname -X|grep '^Machine.*Pent *II' >/dev/null) \
- && UNAME_MACHINE=i686
- (/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \
- && UNAME_MACHINE=i686
- echo ${UNAME_MACHINE}-pc-sco$UNAME_REL
- else
- echo ${UNAME_MACHINE}-pc-sysv32
- fi
- exit ;;
- pc:*:*:*)
- # Left here for compatibility:
- # uname -m prints for DJGPP always 'pc', but it prints nothing about
- # the processor, so we play safe by assuming i586.
- # Note: whatever this is, it MUST be the same as what config.sub
- # prints for the "djgpp" host, or else GDB configury will decide that
- # this is a cross-build.
- echo i586-pc-msdosdjgpp
- exit ;;
- Intel:Mach:3*:*)
- echo i386-pc-mach3
- exit ;;
- paragon:*:*:*)
- echo i860-intel-osf1
- exit ;;
- i860:*:4.*:*) # i860-SVR4
- if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then
- echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4
- else # Add other i860-SVR4 vendors below as they are discovered.
- echo i860-unknown-sysv${UNAME_RELEASE} # Unknown i860-SVR4
- fi
- exit ;;
- mini*:CTIX:SYS*5:*)
- # "miniframe"
- echo m68010-convergent-sysv
- exit ;;
- mc68k:UNIX:SYSTEM5:3.51m)
- echo m68k-convergent-sysv
- exit ;;
- M680?0:D-NIX:5.3:*)
- echo m68k-diab-dnix
- exit ;;
- M68*:*:R3V[5678]*:*)
- test -r /sysV68 && { echo 'm68k-motorola-sysv'; exit; } ;;
- 3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0 | S7501*:*:4.0:3.0)
- OS_REL=''
- test -r /etc/.relid \
- && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid`
- /bin/uname -p 2>/dev/null | grep 86 >/dev/null \
- && { echo i486-ncr-sysv4.3${OS_REL}; exit; }
- /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \
- && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;;
- 3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*)
- /bin/uname -p 2>/dev/null | grep 86 >/dev/null \
- && { echo i486-ncr-sysv4; exit; } ;;
- NCR*:*:4.2:* | MPRAS*:*:4.2:*)
- OS_REL='.3'
- test -r /etc/.relid \
- && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid`
- /bin/uname -p 2>/dev/null | grep 86 >/dev/null \
- && { echo i486-ncr-sysv4.3${OS_REL}; exit; }
- /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \
- && { echo i586-ncr-sysv4.3${OS_REL}; exit; }
- /bin/uname -p 2>/dev/null | /bin/grep pteron >/dev/null \
- && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;;
- m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*)
- echo m68k-unknown-lynxos${UNAME_RELEASE}
- exit ;;
- mc68030:UNIX_System_V:4.*:*)
- echo m68k-atari-sysv4
- exit ;;
- TSUNAMI:LynxOS:2.*:*)
- echo sparc-unknown-lynxos${UNAME_RELEASE}
- exit ;;
- rs6000:LynxOS:2.*:*)
- echo rs6000-unknown-lynxos${UNAME_RELEASE}
- exit ;;
- PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.[02]*:*)
- echo powerpc-unknown-lynxos${UNAME_RELEASE}
- exit ;;
- SM[BE]S:UNIX_SV:*:*)
- echo mips-dde-sysv${UNAME_RELEASE}
- exit ;;
- RM*:ReliantUNIX-*:*:*)
- echo mips-sni-sysv4
- exit ;;
- RM*:SINIX-*:*:*)
- echo mips-sni-sysv4
- exit ;;
- *:SINIX-*:*:*)
- if uname -p 2>/dev/null >/dev/null ; then
- UNAME_MACHINE=`(uname -p) 2>/dev/null`
- echo ${UNAME_MACHINE}-sni-sysv4
- else
- echo ns32k-sni-sysv
- fi
- exit ;;
- PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort
- # says <Richard.M.Bartel at ccMail.Census.GOV>
- echo i586-unisys-sysv4
- exit ;;
- *:UNIX_System_V:4*:FTX*)
- # From Gerald Hewes <hewes at openmarket.com>.
- # How about differentiating between stratus architectures? -djm
- echo hppa1.1-stratus-sysv4
- exit ;;
- *:*:*:FTX*)
- # From seanf at swdc.stratus.com.
- echo i860-stratus-sysv4
- exit ;;
- i*86:VOS:*:*)
- # From Paul.Green at stratus.com.
- echo ${UNAME_MACHINE}-stratus-vos
- exit ;;
- *:VOS:*:*)
- # From Paul.Green at stratus.com.
- echo hppa1.1-stratus-vos
- exit ;;
- mc68*:A/UX:*:*)
- echo m68k-apple-aux${UNAME_RELEASE}
- exit ;;
- news*:NEWS-OS:6*:*)
- echo mips-sony-newsos6
- exit ;;
- R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*)
- if [ -d /usr/nec ]; then
- echo mips-nec-sysv${UNAME_RELEASE}
- else
- echo mips-unknown-sysv${UNAME_RELEASE}
- fi
- exit ;;
- BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only.
- echo powerpc-be-beos
- exit ;;
- BeMac:BeOS:*:*) # BeOS running on Mac or Mac clone, PPC only.
- echo powerpc-apple-beos
- exit ;;
- BePC:BeOS:*:*) # BeOS running on Intel PC compatible.
- echo i586-pc-beos
- exit ;;
- BePC:Haiku:*:*) # Haiku running on Intel PC compatible.
- echo i586-pc-haiku
- exit ;;
- SX-4:SUPER-UX:*:*)
- echo sx4-nec-superux${UNAME_RELEASE}
- exit ;;
- SX-5:SUPER-UX:*:*)
- echo sx5-nec-superux${UNAME_RELEASE}
- exit ;;
- SX-6:SUPER-UX:*:*)
- echo sx6-nec-superux${UNAME_RELEASE}
- exit ;;
- SX-7:SUPER-UX:*:*)
- echo sx7-nec-superux${UNAME_RELEASE}
- exit ;;
- SX-8:SUPER-UX:*:*)
- echo sx8-nec-superux${UNAME_RELEASE}
- exit ;;
- SX-8R:SUPER-UX:*:*)
- echo sx8r-nec-superux${UNAME_RELEASE}
- exit ;;
- Power*:Rhapsody:*:*)
- echo powerpc-apple-rhapsody${UNAME_RELEASE}
- exit ;;
- *:Rhapsody:*:*)
- echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE}
- exit ;;
- *:Darwin:*:*)
- UNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown
- case $UNAME_PROCESSOR in
- i386)
- eval $set_cc_for_build
- if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then
- if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \
- (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \
- grep IS_64BIT_ARCH >/dev/null
- then
- UNAME_PROCESSOR="x86_64"
- fi
- fi ;;
- unknown) UNAME_PROCESSOR=powerpc ;;
- esac
- echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE}
- exit ;;
- *:procnto*:*:* | *:QNX:[0123456789]*:*)
- UNAME_PROCESSOR=`uname -p`
- if test "$UNAME_PROCESSOR" = "x86"; then
- UNAME_PROCESSOR=i386
- UNAME_MACHINE=pc
- fi
- echo ${UNAME_PROCESSOR}-${UNAME_MACHINE}-nto-qnx${UNAME_RELEASE}
- exit ;;
- *:QNX:*:4*)
- echo i386-pc-qnx
- exit ;;
- NEO-?:NONSTOP_KERNEL:*:*)
- echo neo-tandem-nsk${UNAME_RELEASE}
- exit ;;
- NSE-?:NONSTOP_KERNEL:*:*)
- echo nse-tandem-nsk${UNAME_RELEASE}
- exit ;;
- NSR-?:NONSTOP_KERNEL:*:*)
- echo nsr-tandem-nsk${UNAME_RELEASE}
- exit ;;
- *:NonStop-UX:*:*)
- echo mips-compaq-nonstopux
- exit ;;
- BS2000:POSIX*:*:*)
- echo bs2000-siemens-sysv
- exit ;;
- DS/*:UNIX_System_V:*:*)
- echo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE}
- exit ;;
- *:Plan9:*:*)
- # "uname -m" is not consistent, so use $cputype instead. 386
- # is converted to i386 for consistency with other x86
- # operating systems.
- if test "$cputype" = "386"; then
- UNAME_MACHINE=i386
- else
- UNAME_MACHINE="$cputype"
- fi
- echo ${UNAME_MACHINE}-unknown-plan9
- exit ;;
- *:TOPS-10:*:*)
- echo pdp10-unknown-tops10
- exit ;;
- *:TENEX:*:*)
- echo pdp10-unknown-tenex
- exit ;;
- KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*)
- echo pdp10-dec-tops20
- exit ;;
- XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*)
- echo pdp10-xkl-tops20
- exit ;;
- *:TOPS-20:*:*)
- echo pdp10-unknown-tops20
- exit ;;
- *:ITS:*:*)
- echo pdp10-unknown-its
- exit ;;
- SEI:*:*:SEIUX)
- echo mips-sei-seiux${UNAME_RELEASE}
- exit ;;
- *:DragonFly:*:*)
- echo ${UNAME_MACHINE}-unknown-dragonfly`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`
- exit ;;
- *:*VMS:*:*)
- UNAME_MACHINE=`(uname -p) 2>/dev/null`
- case "${UNAME_MACHINE}" in
- A*) echo alpha-dec-vms ; exit ;;
- I*) echo ia64-dec-vms ; exit ;;
- V*) echo vax-dec-vms ; exit ;;
- esac ;;
- *:XENIX:*:SysV)
- echo i386-pc-xenix
- exit ;;
- i*86:skyos:*:*)
- echo ${UNAME_MACHINE}-pc-skyos`echo ${UNAME_RELEASE}` | sed -e 's/ .*$//'
- exit ;;
- i*86:rdos:*:*)
- echo ${UNAME_MACHINE}-pc-rdos
- exit ;;
- i*86:AROS:*:*)
- echo ${UNAME_MACHINE}-pc-aros
- exit ;;
- x86_64:VMkernel:*:*)
- echo ${UNAME_MACHINE}-unknown-esx
- exit ;;
-esac
-
-#echo '(No uname command or uname output not recognized.)' 1>&2
-#echo "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" 1>&2
-
-eval $set_cc_for_build
-cat >$dummy.c <<EOF
-#ifdef _SEQUENT_
-# include <sys/types.h>
-# include <sys/utsname.h>
-#endif
-main ()
-{
-#if defined (sony)
-#if defined (MIPSEB)
- /* BFD wants "bsd" instead of "newsos". Perhaps BFD should be changed,
- I don't know.... */
- printf ("mips-sony-bsd\n"); exit (0);
-#else
-#include <sys/param.h>
- printf ("m68k-sony-newsos%s\n",
-#ifdef NEWSOS4
- "4"
-#else
- ""
-#endif
- ); exit (0);
-#endif
-#endif
-
-#if defined (__arm) && defined (__acorn) && defined (__unix)
- printf ("arm-acorn-riscix\n"); exit (0);
-#endif
-
-#if defined (hp300) && !defined (hpux)
- printf ("m68k-hp-bsd\n"); exit (0);
-#endif
-
-#if defined (NeXT)
-#if !defined (__ARCHITECTURE__)
-#define __ARCHITECTURE__ "m68k"
-#endif
- int version;
- version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`;
- if (version < 4)
- printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version);
- else
- printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version);
- exit (0);
-#endif
-
-#if defined (MULTIMAX) || defined (n16)
-#if defined (UMAXV)
- printf ("ns32k-encore-sysv\n"); exit (0);
-#else
-#if defined (CMU)
- printf ("ns32k-encore-mach\n"); exit (0);
-#else
- printf ("ns32k-encore-bsd\n"); exit (0);
-#endif
-#endif
-#endif
-
-#if defined (__386BSD__)
- printf ("i386-pc-bsd\n"); exit (0);
-#endif
-
-#if defined (sequent)
-#if defined (i386)
- printf ("i386-sequent-dynix\n"); exit (0);
-#endif
-#if defined (ns32000)
- printf ("ns32k-sequent-dynix\n"); exit (0);
-#endif
-#endif
-
-#if defined (_SEQUENT_)
- struct utsname un;
-
- uname(&un);
-
- if (strncmp(un.version, "V2", 2) == 0) {
- printf ("i386-sequent-ptx2\n"); exit (0);
- }
- if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */
- printf ("i386-sequent-ptx1\n"); exit (0);
- }
- printf ("i386-sequent-ptx\n"); exit (0);
-
-#endif
-
-#if defined (vax)
-# if !defined (ultrix)
-# include <sys/param.h>
-# if defined (BSD)
-# if BSD == 43
- printf ("vax-dec-bsd4.3\n"); exit (0);
-# else
-# if BSD == 199006
- printf ("vax-dec-bsd4.3reno\n"); exit (0);
-# else
- printf ("vax-dec-bsd\n"); exit (0);
-# endif
-# endif
-# else
- printf ("vax-dec-bsd\n"); exit (0);
-# endif
-# else
- printf ("vax-dec-ultrix\n"); exit (0);
-# endif
-#endif
-
-#if defined (alliant) && defined (i860)
- printf ("i860-alliant-bsd\n"); exit (0);
-#endif
-
- exit (1);
-}
-EOF
-
-$CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null && SYSTEM_NAME=`$dummy` &&
- { echo "$SYSTEM_NAME"; exit; }
-
-# Apollos put the system type in the environment.
-
-test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit; }
-
-# Convex versions that predate uname can use getsysinfo(1)
-
-if [ -x /usr/convex/getsysinfo ]
-then
- case `getsysinfo -f cpu_type` in
- c1*)
- echo c1-convex-bsd
- exit ;;
- c2*)
- if getsysinfo -f scalar_acc
- then echo c32-convex-bsd
- else echo c2-convex-bsd
- fi
- exit ;;
- c34*)
- echo c34-convex-bsd
- exit ;;
- c38*)
- echo c38-convex-bsd
- exit ;;
- c4*)
- echo c4-convex-bsd
- exit ;;
- esac
-fi
-
-cat >&2 <<EOF
-$0: unable to guess system type
-
-This script, last modified $timestamp, has failed to recognize
-the operating system you are using. It is advised that you
-download the most up to date version of the config scripts from
-
- http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD
-and
- http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub;hb=HEAD
-
-If the version you run ($0) is already up to date, please
-send the following data and any information you think might be
-pertinent to <config-patches at gnu.org> in order to provide the needed
-information to handle your system.
-
-config.guess timestamp = $timestamp
-
-uname -m = `(uname -m) 2>/dev/null || echo unknown`
-uname -r = `(uname -r) 2>/dev/null || echo unknown`
-uname -s = `(uname -s) 2>/dev/null || echo unknown`
-uname -v = `(uname -v) 2>/dev/null || echo unknown`
-
-/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null`
-/bin/uname -X = `(/bin/uname -X) 2>/dev/null`
-
-hostinfo = `(hostinfo) 2>/dev/null`
-/bin/universe = `(/bin/universe) 2>/dev/null`
-/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null`
-/bin/arch = `(/bin/arch) 2>/dev/null`
-/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null`
-/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null`
-
-UNAME_MACHINE = ${UNAME_MACHINE}
-UNAME_RELEASE = ${UNAME_RELEASE}
-UNAME_SYSTEM = ${UNAME_SYSTEM}
-UNAME_VERSION = ${UNAME_VERSION}
-EOF
-
-exit 1
-
-# Local variables:
-# eval: (add-hook 'write-file-hooks 'time-stamp)
-# time-stamp-start: "timestamp='"
-# time-stamp-format: "%:y-%02m-%02d"
-# time-stamp-end: "'"
-# End:
diff --git a/build-aux/config.sub b/build-aux/config.sub
deleted file mode 100755
index 42adc67..0000000
--- a/build-aux/config.sub
+++ /dev/null
@@ -1,1791 +0,0 @@
-#! /bin/sh
-# Configuration validation subroutine script.
-# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
-# 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010,
-# 2011, 2012 Free Software Foundation, Inc.
-
-timestamp='2012-02-10'
-
-# This file is (in principle) common to ALL GNU software.
-# The presence of a machine in this file suggests that SOME GNU software
-# can handle that machine. It does not imply ALL GNU software can.
-#
-# This file 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, see <http://www.gnu.org/licenses/>.
-#
-# As a special exception to the GNU General Public License, if you
-# distribute this file as part of a program that contains a
-# configuration script generated by Autoconf, you may include it under
-# the same distribution terms that you use for the rest of that program.
-
-
-# Please send patches to <config-patches at gnu.org>. Submit a context
-# diff and a properly formatted GNU ChangeLog entry.
-#
-# Configuration subroutine to validate and canonicalize a configuration type.
-# Supply the specified configuration type as an argument.
-# If it is invalid, we print an error message on stderr and exit with code 1.
-# Otherwise, we print the canonical config type on stdout and succeed.
-
-# You can get the latest version of this script from:
-# http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub;hb=HEAD
-
-# This file is supposed to be the same for all GNU packages
-# and recognize all the CPU types, system types and aliases
-# that are meaningful with *any* GNU software.
-# Each package is responsible for reporting which valid configurations
-# it does not support. The user should be able to distinguish
-# a failure to support a valid configuration from a meaningless
-# configuration.
-
-# The goal of this file is to map all the various variations of a given
-# machine specification into a single specification in the form:
-# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM
-# or in some cases, the newer four-part form:
-# CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM
-# It is wrong to echo any other type of specification.
-
-me=`echo "$0" | sed -e 's,.*/,,'`
-
-usage="\
-Usage: $0 [OPTION] CPU-MFR-OPSYS
- $0 [OPTION] ALIAS
-
-Canonicalize a configuration name.
-
-Operation modes:
- -h, --help print this help, then exit
- -t, --time-stamp print date of last modification, then exit
- -v, --version print version number, then exit
-
-Report bugs and patches to <config-patches at gnu.org>."
-
-version="\
-GNU config.sub ($timestamp)
-
-Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000,
-2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012
-Free Software Foundation, Inc.
-
-This is free software; see the source for copying conditions. There is NO
-warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
-
-help="
-Try \`$me --help' for more information."
-
-# Parse command line
-while test $# -gt 0 ; do
- case $1 in
- --time-stamp | --time* | -t )
- echo "$timestamp" ; exit ;;
- --version | -v )
- echo "$version" ; exit ;;
- --help | --h* | -h )
- echo "$usage"; exit ;;
- -- ) # Stop option processing
- shift; break ;;
- - ) # Use stdin as input.
- break ;;
- -* )
- echo "$me: invalid option $1$help"
- exit 1 ;;
-
- *local*)
- # First pass through any local machine types.
- echo $1
- exit ;;
-
- * )
- break ;;
- esac
-done
-
-case $# in
- 0) echo "$me: missing argument$help" >&2
- exit 1;;
- 1) ;;
- *) echo "$me: too many arguments$help" >&2
- exit 1;;
-esac
-
-# Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any).
-# Here we must recognize all the valid KERNEL-OS combinations.
-maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'`
-case $maybe_os in
- nto-qnx* | linux-gnu* | linux-android* | linux-dietlibc | linux-newlib* | \
- linux-uclibc* | uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | \
- knetbsd*-gnu* | netbsd*-gnu* | \
- kopensolaris*-gnu* | \
- storm-chaos* | os2-emx* | rtmk-nova*)
- os=-$maybe_os
- basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`
- ;;
- android-linux)
- os=-linux-android
- basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`-unknown
- ;;
- *)
- basic_machine=`echo $1 | sed 's/-[^-]*$//'`
- if [ $basic_machine != $1 ]
- then os=`echo $1 | sed 's/.*-/-/'`
- else os=; fi
- ;;
-esac
-
-### Let's recognize common machines as not being operating systems so
-### that things like config.sub decstation-3100 work. We also
-### recognize some manufacturers as not being operating systems, so we
-### can provide default operating systems below.
-case $os in
- -sun*os*)
- # Prevent following clause from handling this invalid input.
- ;;
- -dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \
- -att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \
- -unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \
- -convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\
- -c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \
- -harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \
- -apple | -axis | -knuth | -cray | -microblaze)
- os=
- basic_machine=$1
- ;;
- -bluegene*)
- os=-cnk
- ;;
- -sim | -cisco | -oki | -wec | -winbond)
- os=
- basic_machine=$1
- ;;
- -scout)
- ;;
- -wrs)
- os=-vxworks
- basic_machine=$1
- ;;
- -chorusos*)
- os=-chorusos
- basic_machine=$1
- ;;
- -chorusrdb)
- os=-chorusrdb
- basic_machine=$1
- ;;
- -hiux*)
- os=-hiuxwe2
- ;;
- -sco6)
- os=-sco5v6
- basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
- ;;
- -sco5)
- os=-sco3.2v5
- basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
- ;;
- -sco4)
- os=-sco3.2v4
- basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
- ;;
- -sco3.2.[4-9]*)
- os=`echo $os | sed -e 's/sco3.2./sco3.2v/'`
- basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
- ;;
- -sco3.2v[4-9]*)
- # Don't forget version if it is 3.2v4 or newer.
- basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
- ;;
- -sco5v6*)
- # Don't forget version if it is 3.2v4 or newer.
- basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
- ;;
- -sco*)
- os=-sco3.2v2
- basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
- ;;
- -udk*)
- basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
- ;;
- -isc)
- os=-isc2.2
- basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
- ;;
- -clix*)
- basic_machine=clipper-intergraph
- ;;
- -isc*)
- basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
- ;;
- -lynx*)
- os=-lynxos
- ;;
- -ptx*)
- basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'`
- ;;
- -windowsnt*)
- os=`echo $os | sed -e 's/windowsnt/winnt/'`
- ;;
- -psos*)
- os=-psos
- ;;
- -mint | -mint[0-9]*)
- basic_machine=m68k-atari
- os=-mint
- ;;
-esac
-
-# Decode aliases for certain CPU-COMPANY combinations.
-case $basic_machine in
- # Recognize the basic CPU types without company name.
- # Some are omitted here because they have special meanings below.
- 1750a | 580 \
- | a29k \
- | aarch64 | aarch64_be \
- | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \
- | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \
- | am33_2.0 \
- | arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr | avr32 \
- | be32 | be64 \
- | bfin \
- | c4x | clipper \
- | d10v | d30v | dlx | dsp16xx | dvp \
- | epiphany \
- | fido | fr30 | frv \
- | h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \
- | hexagon \
- | i370 | i860 | i960 | ia64 \
- | ip2k | iq2000 \
- | le32 | le64 \
- | lm32 \
- | m32c | m32r | m32rle | m68000 | m68k | m88k \
- | maxq | mb | microblaze | mcore | mep | metag \
- | mips | mipsbe | mipseb | mipsel | mipsle \
- | mips16 \
- | mips64 | mips64el \
- | mips64octeon | mips64octeonel \
- | mips64orion | mips64orionel \
- | mips64r5900 | mips64r5900el \
- | mips64vr | mips64vrel \
- | mips64vr4100 | mips64vr4100el \
- | mips64vr4300 | mips64vr4300el \
- | mips64vr5000 | mips64vr5000el \
- | mips64vr5900 | mips64vr5900el \
- | mipsisa32 | mipsisa32el \
- | mipsisa32r2 | mipsisa32r2el \
- | mipsisa64 | mipsisa64el \
- | mipsisa64r2 | mipsisa64r2el \
- | mipsisa64sb1 | mipsisa64sb1el \
- | mipsisa64sr71k | mipsisa64sr71kel \
- | mipstx39 | mipstx39el \
- | mn10200 | mn10300 \
- | moxie \
- | mt \
- | msp430 \
- | nds32 | nds32le | nds32be \
- | nios | nios2 \
- | ns16k | ns32k \
- | open8 \
- | or32 \
- | pdp10 | pdp11 | pj | pjl \
- | powerpc | powerpc64 | powerpc64le | powerpcle \
- | pyramid \
- | rl78 | rx \
- | score \
- | sh | sh[1234] | sh[24]a | sh[24]aeb | sh[23]e | sh[34]eb | sheb | shbe | shle | sh[1234]le | sh3ele \
- | sh64 | sh64le \
- | sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet | sparclite \
- | sparcv8 | sparcv9 | sparcv9b | sparcv9v \
- | spu \
- | tahoe | tic4x | tic54x | tic55x | tic6x | tic80 | tron \
- | ubicom32 \
- | v850 | v850e | v850e1 | v850e2 | v850es | v850e2v3 \
- | we32k \
- | x86 | xc16x | xstormy16 | xtensa \
- | z8k | z80)
- basic_machine=$basic_machine-unknown
- ;;
- c54x)
- basic_machine=tic54x-unknown
- ;;
- c55x)
- basic_machine=tic55x-unknown
- ;;
- c6x)
- basic_machine=tic6x-unknown
- ;;
- m6811 | m68hc11 | m6812 | m68hc12 | m68hcs12x | picochip)
- basic_machine=$basic_machine-unknown
- os=-none
- ;;
- m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k)
- ;;
- ms1)
- basic_machine=mt-unknown
- ;;
-
- strongarm | thumb | xscale)
- basic_machine=arm-unknown
- ;;
- xgate)
- basic_machine=$basic_machine-unknown
- os=-none
- ;;
- xscaleeb)
- basic_machine=armeb-unknown
- ;;
-
- xscaleel)
- basic_machine=armel-unknown
- ;;
-
- # We use `pc' rather than `unknown'
- # because (1) that's what they normally are, and
- # (2) the word "unknown" tends to confuse beginning users.
- i*86 | x86_64)
- basic_machine=$basic_machine-pc
- ;;
- # Object if more than one company name word.
- *-*-*)
- echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2
- exit 1
- ;;
- # Recognize the basic CPU types with company name.
- 580-* \
- | a29k-* \
- | aarch64-* | aarch64_be-* \
- | alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \
- | alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \
- | alphapca5[67]-* | alpha64pca5[67]-* | arc-* \
- | arm-* | armbe-* | armle-* | armeb-* | armv*-* \
- | avr-* | avr32-* \
- | be32-* | be64-* \
- | bfin-* | bs2000-* \
- | c[123]* | c30-* | [cjt]90-* | c4x-* \
- | clipper-* | craynv-* | cydra-* \
- | d10v-* | d30v-* | dlx-* \
- | elxsi-* \
- | f30[01]-* | f700-* | fido-* | fr30-* | frv-* | fx80-* \
- | h8300-* | h8500-* \
- | hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \
- | hexagon-* \
- | i*86-* | i860-* | i960-* | ia64-* \
- | ip2k-* | iq2000-* \
- | le32-* | le64-* \
- | lm32-* \
- | m32c-* | m32r-* | m32rle-* \
- | m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \
- | m88110-* | m88k-* | maxq-* | mcore-* | metag-* | microblaze-* \
- | mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \
- | mips16-* \
- | mips64-* | mips64el-* \
- | mips64octeon-* | mips64octeonel-* \
- | mips64orion-* | mips64orionel-* \
- | mips64r5900-* | mips64r5900el-* \
- | mips64vr-* | mips64vrel-* \
- | mips64vr4100-* | mips64vr4100el-* \
- | mips64vr4300-* | mips64vr4300el-* \
- | mips64vr5000-* | mips64vr5000el-* \
- | mips64vr5900-* | mips64vr5900el-* \
- | mipsisa32-* | mipsisa32el-* \
- | mipsisa32r2-* | mipsisa32r2el-* \
- | mipsisa64-* | mipsisa64el-* \
- | mipsisa64r2-* | mipsisa64r2el-* \
- | mipsisa64sb1-* | mipsisa64sb1el-* \
- | mipsisa64sr71k-* | mipsisa64sr71kel-* \
- | mipstx39-* | mipstx39el-* \
- | mmix-* \
- | mt-* \
- | msp430-* \
- | nds32-* | nds32le-* | nds32be-* \
- | nios-* | nios2-* \
- | none-* | np1-* | ns16k-* | ns32k-* \
- | open8-* \
- | orion-* \
- | pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \
- | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* \
- | pyramid-* \
- | rl78-* | romp-* | rs6000-* | rx-* \
- | sh-* | sh[1234]-* | sh[24]a-* | sh[24]aeb-* | sh[23]e-* | sh[34]eb-* | sheb-* | shbe-* \
- | shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \
- | sparc-* | sparc64-* | sparc64b-* | sparc64v-* | sparc86x-* | sparclet-* \
- | sparclite-* \
- | sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | sv1-* | sx?-* \
- | tahoe-* \
- | tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \
- | tile*-* \
- | tron-* \
- | ubicom32-* \
- | v850-* | v850e-* | v850e1-* | v850es-* | v850e2-* | v850e2v3-* \
- | vax-* \
- | we32k-* \
- | x86-* | x86_64-* | xc16x-* | xps100-* \
- | xstormy16-* | xtensa*-* \
- | ymp-* \
- | z8k-* | z80-*)
- ;;
- # Recognize the basic CPU types without company name, with glob match.
- xtensa*)
- basic_machine=$basic_machine-unknown
- ;;
- # Recognize the various machine names and aliases which stand
- # for a CPU type and a company and sometimes even an OS.
- 386bsd)
- basic_machine=i386-unknown
- os=-bsd
- ;;
- 3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc)
- basic_machine=m68000-att
- ;;
- 3b*)
- basic_machine=we32k-att
- ;;
- a29khif)
- basic_machine=a29k-amd
- os=-udi
- ;;
- abacus)
- basic_machine=abacus-unknown
- ;;
- adobe68k)
- basic_machine=m68010-adobe
- os=-scout
- ;;
- alliant | fx80)
- basic_machine=fx80-alliant
- ;;
- altos | altos3068)
- basic_machine=m68k-altos
- ;;
- am29k)
- basic_machine=a29k-none
- os=-bsd
- ;;
- amd64)
- basic_machine=x86_64-pc
- ;;
- amd64-*)
- basic_machine=x86_64-`echo $basic_machine | sed 's/^[^-]*-//'`
- ;;
- amdahl)
- basic_machine=580-amdahl
- os=-sysv
- ;;
- amiga | amiga-*)
- basic_machine=m68k-unknown
- ;;
- amigaos | amigados)
- basic_machine=m68k-unknown
- os=-amigaos
- ;;
- amigaunix | amix)
- basic_machine=m68k-unknown
- os=-sysv4
- ;;
- apollo68)
- basic_machine=m68k-apollo
- os=-sysv
- ;;
- apollo68bsd)
- basic_machine=m68k-apollo
- os=-bsd
- ;;
- aros)
- basic_machine=i386-pc
- os=-aros
- ;;
- aux)
- basic_machine=m68k-apple
- os=-aux
- ;;
- balance)
- basic_machine=ns32k-sequent
- os=-dynix
- ;;
- blackfin)
- basic_machine=bfin-unknown
- os=-linux
- ;;
- blackfin-*)
- basic_machine=bfin-`echo $basic_machine | sed 's/^[^-]*-//'`
- os=-linux
- ;;
- bluegene*)
- basic_machine=powerpc-ibm
- os=-cnk
- ;;
- c54x-*)
- basic_machine=tic54x-`echo $basic_machine | sed 's/^[^-]*-//'`
- ;;
- c55x-*)
- basic_machine=tic55x-`echo $basic_machine | sed 's/^[^-]*-//'`
- ;;
- c6x-*)
- basic_machine=tic6x-`echo $basic_machine | sed 's/^[^-]*-//'`
- ;;
- c90)
- basic_machine=c90-cray
- os=-unicos
- ;;
- cegcc)
- basic_machine=arm-unknown
- os=-cegcc
- ;;
- convex-c1)
- basic_machine=c1-convex
- os=-bsd
- ;;
- convex-c2)
- basic_machine=c2-convex
- os=-bsd
- ;;
- convex-c32)
- basic_machine=c32-convex
- os=-bsd
- ;;
- convex-c34)
- basic_machine=c34-convex
- os=-bsd
- ;;
- convex-c38)
- basic_machine=c38-convex
- os=-bsd
- ;;
- cray | j90)
- basic_machine=j90-cray
- os=-unicos
- ;;
- craynv)
- basic_machine=craynv-cray
- os=-unicosmp
- ;;
- cr16 | cr16-*)
- basic_machine=cr16-unknown
- os=-elf
- ;;
- crds | unos)
- basic_machine=m68k-crds
- ;;
- crisv32 | crisv32-* | etraxfs*)
- basic_machine=crisv32-axis
- ;;
- cris | cris-* | etrax*)
- basic_machine=cris-axis
- ;;
- crx)
- basic_machine=crx-unknown
- os=-elf
- ;;
- da30 | da30-*)
- basic_machine=m68k-da30
- ;;
- decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn)
- basic_machine=mips-dec
- ;;
- decsystem10* | dec10*)
- basic_machine=pdp10-dec
- os=-tops10
- ;;
- decsystem20* | dec20*)
- basic_machine=pdp10-dec
- os=-tops20
- ;;
- delta | 3300 | motorola-3300 | motorola-delta \
- | 3300-motorola | delta-motorola)
- basic_machine=m68k-motorola
- ;;
- delta88)
- basic_machine=m88k-motorola
- os=-sysv3
- ;;
- dicos)
- basic_machine=i686-pc
- os=-dicos
- ;;
- djgpp)
- basic_machine=i586-pc
- os=-msdosdjgpp
- ;;
- dpx20 | dpx20-*)
- basic_machine=rs6000-bull
- os=-bosx
- ;;
- dpx2* | dpx2*-bull)
- basic_machine=m68k-bull
- os=-sysv3
- ;;
- ebmon29k)
- basic_machine=a29k-amd
- os=-ebmon
- ;;
- elxsi)
- basic_machine=elxsi-elxsi
- os=-bsd
- ;;
- encore | umax | mmax)
- basic_machine=ns32k-encore
- ;;
- es1800 | OSE68k | ose68k | ose | OSE)
- basic_machine=m68k-ericsson
- os=-ose
- ;;
- fx2800)
- basic_machine=i860-alliant
- ;;
- genix)
- basic_machine=ns32k-ns
- ;;
- gmicro)
- basic_machine=tron-gmicro
- os=-sysv
- ;;
- go32)
- basic_machine=i386-pc
- os=-go32
- ;;
- h3050r* | hiux*)
- basic_machine=hppa1.1-hitachi
- os=-hiuxwe2
- ;;
- h8300hms)
- basic_machine=h8300-hitachi
- os=-hms
- ;;
- h8300xray)
- basic_machine=h8300-hitachi
- os=-xray
- ;;
- h8500hms)
- basic_machine=h8500-hitachi
- os=-hms
- ;;
- harris)
- basic_machine=m88k-harris
- os=-sysv3
- ;;
- hp300-*)
- basic_machine=m68k-hp
- ;;
- hp300bsd)
- basic_machine=m68k-hp
- os=-bsd
- ;;
- hp300hpux)
- basic_machine=m68k-hp
- os=-hpux
- ;;
- hp3k9[0-9][0-9] | hp9[0-9][0-9])
- basic_machine=hppa1.0-hp
- ;;
- hp9k2[0-9][0-9] | hp9k31[0-9])
- basic_machine=m68000-hp
- ;;
- hp9k3[2-9][0-9])
- basic_machine=m68k-hp
- ;;
- hp9k6[0-9][0-9] | hp6[0-9][0-9])
- basic_machine=hppa1.0-hp
- ;;
- hp9k7[0-79][0-9] | hp7[0-79][0-9])
- basic_machine=hppa1.1-hp
- ;;
- hp9k78[0-9] | hp78[0-9])
- # FIXME: really hppa2.0-hp
- basic_machine=hppa1.1-hp
- ;;
- hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893)
- # FIXME: really hppa2.0-hp
- basic_machine=hppa1.1-hp
- ;;
- hp9k8[0-9][13679] | hp8[0-9][13679])
- basic_machine=hppa1.1-hp
- ;;
- hp9k8[0-9][0-9] | hp8[0-9][0-9])
- basic_machine=hppa1.0-hp
- ;;
- hppa-next)
- os=-nextstep3
- ;;
- hppaosf)
- basic_machine=hppa1.1-hp
- os=-osf
- ;;
- hppro)
- basic_machine=hppa1.1-hp
- os=-proelf
- ;;
- i370-ibm* | ibm*)
- basic_machine=i370-ibm
- ;;
- i*86v32)
- basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
- os=-sysv32
- ;;
- i*86v4*)
- basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
- os=-sysv4
- ;;
- i*86v)
- basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
- os=-sysv
- ;;
- i*86sol2)
- basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
- os=-solaris2
- ;;
- i386mach)
- basic_machine=i386-mach
- os=-mach
- ;;
- i386-vsta | vsta)
- basic_machine=i386-unknown
- os=-vsta
- ;;
- iris | iris4d)
- basic_machine=mips-sgi
- case $os in
- -irix*)
- ;;
- *)
- os=-irix4
- ;;
- esac
- ;;
- isi68 | isi)
- basic_machine=m68k-isi
- os=-sysv
- ;;
- m68knommu)
- basic_machine=m68k-unknown
- os=-linux
- ;;
- m68knommu-*)
- basic_machine=m68k-`echo $basic_machine | sed 's/^[^-]*-//'`
- os=-linux
- ;;
- m88k-omron*)
- basic_machine=m88k-omron
- ;;
- magnum | m3230)
- basic_machine=mips-mips
- os=-sysv
- ;;
- merlin)
- basic_machine=ns32k-utek
- os=-sysv
- ;;
- microblaze)
- basic_machine=microblaze-xilinx
- ;;
- mingw32)
- basic_machine=i386-pc
- os=-mingw32
- ;;
- mingw32ce)
- basic_machine=arm-unknown
- os=-mingw32ce
- ;;
- miniframe)
- basic_machine=m68000-convergent
- ;;
- *mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*)
- basic_machine=m68k-atari
- os=-mint
- ;;
- mipsEE* | ee | ps2)
- basic_machine=mips64r5900el-scei
- case $os in
- -linux*)
- ;;
- *)
- os=-elf
- ;;
- esac
- ;;
- iop)
- basic_machine=mipsel-scei
- os=-irx
- ;;
- dvp)
- basic_machine=dvp-scei
- os=-elf
- ;;
- mips3*-*)
- basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`
- ;;
- mips3*)
- basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown
- ;;
- monitor)
- basic_machine=m68k-rom68k
- os=-coff
- ;;
- morphos)
- basic_machine=powerpc-unknown
- os=-morphos
- ;;
- msdos)
- basic_machine=i386-pc
- os=-msdos
- ;;
- ms1-*)
- basic_machine=`echo $basic_machine | sed -e 's/ms1-/mt-/'`
- ;;
- msys)
- basic_machine=i386-pc
- os=-msys
- ;;
- mvs)
- basic_machine=i370-ibm
- os=-mvs
- ;;
- nacl)
- basic_machine=le32-unknown
- os=-nacl
- ;;
- ncr3000)
- basic_machine=i486-ncr
- os=-sysv4
- ;;
- netbsd386)
- basic_machine=i386-unknown
- os=-netbsd
- ;;
- netwinder)
- basic_machine=armv4l-rebel
- os=-linux
- ;;
- news | news700 | news800 | news900)
- basic_machine=m68k-sony
- os=-newsos
- ;;
- news1000)
- basic_machine=m68030-sony
- os=-newsos
- ;;
- news-3600 | risc-news)
- basic_machine=mips-sony
- os=-newsos
- ;;
- necv70)
- basic_machine=v70-nec
- os=-sysv
- ;;
- next | m*-next )
- basic_machine=m68k-next
- case $os in
- -nextstep* )
- ;;
- -ns2*)
- os=-nextstep2
- ;;
- *)
- os=-nextstep3
- ;;
- esac
- ;;
- nh3000)
- basic_machine=m68k-harris
- os=-cxux
- ;;
- nh[45]000)
- basic_machine=m88k-harris
- os=-cxux
- ;;
- nindy960)
- basic_machine=i960-intel
- os=-nindy
- ;;
- mon960)
- basic_machine=i960-intel
- os=-mon960
- ;;
- nonstopux)
- basic_machine=mips-compaq
- os=-nonstopux
- ;;
- np1)
- basic_machine=np1-gould
- ;;
- neo-tandem)
- basic_machine=neo-tandem
- ;;
- nse-tandem)
- basic_machine=nse-tandem
- ;;
- nsr-tandem)
- basic_machine=nsr-tandem
- ;;
- op50n-* | op60c-*)
- basic_machine=hppa1.1-oki
- os=-proelf
- ;;
- openrisc | openrisc-*)
- basic_machine=or32-unknown
- ;;
- os400)
- basic_machine=powerpc-ibm
- os=-os400
- ;;
- OSE68000 | ose68000)
- basic_machine=m68000-ericsson
- os=-ose
- ;;
- os68k)
- basic_machine=m68k-none
- os=-os68k
- ;;
- pa-hitachi)
- basic_machine=hppa1.1-hitachi
- os=-hiuxwe2
- ;;
- paragon)
- basic_machine=i860-intel
- os=-osf
- ;;
- parisc)
- basic_machine=hppa-unknown
- os=-linux
- ;;
- parisc-*)
- basic_machine=hppa-`echo $basic_machine | sed 's/^[^-]*-//'`
- os=-linux
- ;;
- pbd)
- basic_machine=sparc-tti
- ;;
- pbb)
- basic_machine=m68k-tti
- ;;
- pc532 | pc532-*)
- basic_machine=ns32k-pc532
- ;;
- pc98)
- basic_machine=i386-pc
- ;;
- pc98-*)
- basic_machine=i386-`echo $basic_machine | sed 's/^[^-]*-//'`
- ;;
- pentium | p5 | k5 | k6 | nexgen | viac3)
- basic_machine=i586-pc
- ;;
- pentiumpro | p6 | 6x86 | athlon | athlon_*)
- basic_machine=i686-pc
- ;;
- pentiumii | pentium2 | pentiumiii | pentium3)
- basic_machine=i686-pc
- ;;
- pentium4)
- basic_machine=i786-pc
- ;;
- pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*)
- basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'`
- ;;
- pentiumpro-* | p6-* | 6x86-* | athlon-*)
- basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'`
- ;;
- pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*)
- basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'`
- ;;
- pentium4-*)
- basic_machine=i786-`echo $basic_machine | sed 's/^[^-]*-//'`
- ;;
- pn)
- basic_machine=pn-gould
- ;;
- power) basic_machine=power-ibm
- ;;
- ppc | ppcbe) basic_machine=powerpc-unknown
- ;;
- ppc-* | ppcbe-*)
- basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'`
- ;;
- ppcle | powerpclittle | ppc-le | powerpc-little)
- basic_machine=powerpcle-unknown
- ;;
- ppcle-* | powerpclittle-*)
- basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'`
- ;;
- ppc64) basic_machine=powerpc64-unknown
- ;;
- ppc64-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'`
- ;;
- ppc64le | powerpc64little | ppc64-le | powerpc64-little)
- basic_machine=powerpc64le-unknown
- ;;
- ppc64le-* | powerpc64little-*)
- basic_machine=powerpc64le-`echo $basic_machine | sed 's/^[^-]*-//'`
- ;;
- ps2)
- basic_machine=i386-ibm
- ;;
- pw32)
- basic_machine=i586-unknown
- os=-pw32
- ;;
- rdos)
- basic_machine=i386-pc
- os=-rdos
- ;;
- rom68k)
- basic_machine=m68k-rom68k
- os=-coff
- ;;
- rm[46]00)
- basic_machine=mips-siemens
- ;;
- rtpc | rtpc-*)
- basic_machine=romp-ibm
- ;;
- s390 | s390-*)
- basic_machine=s390-ibm
- ;;
- s390x | s390x-*)
- basic_machine=s390x-ibm
- ;;
- sa29200)
- basic_machine=a29k-amd
- os=-udi
- ;;
- sb1)
- basic_machine=mipsisa64sb1-unknown
- ;;
- sb1el)
- basic_machine=mipsisa64sb1el-unknown
- ;;
- sde)
- basic_machine=mipsisa32-sde
- os=-elf
- ;;
- sei)
- basic_machine=mips-sei
- os=-seiux
- ;;
- sequent)
- basic_machine=i386-sequent
- ;;
- sh)
- basic_machine=sh-hitachi
- os=-hms
- ;;
- sh5el)
- basic_machine=sh5le-unknown
- ;;
- sh64)
- basic_machine=sh64-unknown
- ;;
- sparclite-wrs | simso-wrs)
- basic_machine=sparclite-wrs
- os=-vxworks
- ;;
- sps7)
- basic_machine=m68k-bull
- os=-sysv2
- ;;
- spur)
- basic_machine=spur-unknown
- ;;
- st2000)
- basic_machine=m68k-tandem
- ;;
- stratus)
- basic_machine=i860-stratus
- os=-sysv4
- ;;
- strongarm-* | thumb-*)
- basic_machine=arm-`echo $basic_machine | sed 's/^[^-]*-//'`
- ;;
- sun2)
- basic_machine=m68000-sun
- ;;
- sun2os3)
- basic_machine=m68000-sun
- os=-sunos3
- ;;
- sun2os4)
- basic_machine=m68000-sun
- os=-sunos4
- ;;
- sun3os3)
- basic_machine=m68k-sun
- os=-sunos3
- ;;
- sun3os4)
- basic_machine=m68k-sun
- os=-sunos4
- ;;
- sun4os3)
- basic_machine=sparc-sun
- os=-sunos3
- ;;
- sun4os4)
- basic_machine=sparc-sun
- os=-sunos4
- ;;
- sun4sol2)
- basic_machine=sparc-sun
- os=-solaris2
- ;;
- sun3 | sun3-*)
- basic_machine=m68k-sun
- ;;
- sun4)
- basic_machine=sparc-sun
- ;;
- sun386 | sun386i | roadrunner)
- basic_machine=i386-sun
- ;;
- sv1)
- basic_machine=sv1-cray
- os=-unicos
- ;;
- symmetry)
- basic_machine=i386-sequent
- os=-dynix
- ;;
- t3e)
- basic_machine=alphaev5-cray
- os=-unicos
- ;;
- t90)
- basic_machine=t90-cray
- os=-unicos
- ;;
- tile*)
- basic_machine=$basic_machine-unknown
- os=-linux-gnu
- ;;
- tx39)
- basic_machine=mipstx39-unknown
- ;;
- tx39el)
- basic_machine=mipstx39el-unknown
- ;;
- toad1)
- basic_machine=pdp10-xkl
- os=-tops20
- ;;
- tower | tower-32)
- basic_machine=m68k-ncr
- ;;
- tpf)
- basic_machine=s390x-ibm
- os=-tpf
- ;;
- udi29k)
- basic_machine=a29k-amd
- os=-udi
- ;;
- ultra3)
- basic_machine=a29k-nyu
- os=-sym1
- ;;
- v810 | necv810)
- basic_machine=v810-nec
- os=-none
- ;;
- vaxv)
- basic_machine=vax-dec
- os=-sysv
- ;;
- vms)
- basic_machine=vax-dec
- os=-vms
- ;;
- vpp*|vx|vx-*)
- basic_machine=f301-fujitsu
- ;;
- vxworks960)
- basic_machine=i960-wrs
- os=-vxworks
- ;;
- vxworks68)
- basic_machine=m68k-wrs
- os=-vxworks
- ;;
- vxworks29k)
- basic_machine=a29k-wrs
- os=-vxworks
- ;;
- w65*)
- basic_machine=w65-wdc
- os=-none
- ;;
- w89k-*)
- basic_machine=hppa1.1-winbond
- os=-proelf
- ;;
- xbox)
- basic_machine=i686-pc
- os=-mingw32
- ;;
- xps | xps100)
- basic_machine=xps100-honeywell
- ;;
- xscale-* | xscalee[bl]-*)
- basic_machine=`echo $basic_machine | sed 's/^xscale/arm/'`
- ;;
- ymp)
- basic_machine=ymp-cray
- os=-unicos
- ;;
- z8k-*-coff)
- basic_machine=z8k-unknown
- os=-sim
- ;;
- z80-*-coff)
- basic_machine=z80-unknown
- os=-sim
- ;;
- none)
- basic_machine=none-none
- os=-none
- ;;
-
-# Here we handle the default manufacturer of certain CPU types. It is in
-# some cases the only manufacturer, in others, it is the most popular.
- w89k)
- basic_machine=hppa1.1-winbond
- ;;
- op50n)
- basic_machine=hppa1.1-oki
- ;;
- op60c)
- basic_machine=hppa1.1-oki
- ;;
- romp)
- basic_machine=romp-ibm
- ;;
- mmix)
- basic_machine=mmix-knuth
- ;;
- rs6000)
- basic_machine=rs6000-ibm
- ;;
- vax)
- basic_machine=vax-dec
- ;;
- pdp10)
- # there are many clones, so DEC is not a safe bet
- basic_machine=pdp10-unknown
- ;;
- pdp11)
- basic_machine=pdp11-dec
- ;;
- we32k)
- basic_machine=we32k-att
- ;;
- sh[1234] | sh[24]a | sh[24]aeb | sh[34]eb | sh[1234]le | sh[23]ele)
- basic_machine=sh-unknown
- ;;
- sparc | sparcv8 | sparcv9 | sparcv9b | sparcv9v)
- basic_machine=sparc-sun
- ;;
- cydra)
- basic_machine=cydra-cydrome
- ;;
- orion)
- basic_machine=orion-highlevel
- ;;
- orion105)
- basic_machine=clipper-highlevel
- ;;
- mac | mpw | mac-mpw)
- basic_machine=m68k-apple
- ;;
- pmac | pmac-mpw)
- basic_machine=powerpc-apple
- ;;
- *-unknown)
- # Make sure to match an already-canonicalized machine name.
- ;;
- *)
- echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2
- exit 1
- ;;
-esac
-
-# Here we canonicalize certain aliases for manufacturers.
-case $basic_machine in
- *-digital*)
- basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'`
- ;;
- *-commodore*)
- basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'`
- ;;
- *)
- ;;
-esac
-
-# Decode manufacturer-specific aliases for certain operating systems.
-
-if [ x"$os" != x"" ]
-then
-case $os in
- # First match some system type aliases
- # that might get confused with valid system types.
- # -solaris* is a basic system type, with this one exception.
- -auroraux)
- os=-auroraux
- ;;
- -solaris1 | -solaris1.*)
- os=`echo $os | sed -e 's|solaris1|sunos4|'`
- ;;
- -solaris)
- os=-solaris2
- ;;
- -svr4*)
- os=-sysv4
- ;;
- -unixware*)
- os=-sysv4.2uw
- ;;
- -gnu/linux*)
- os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'`
- ;;
- # First accept the basic system types.
- # The portable systems comes first.
- # Each alternative MUST END IN A *, to match a version number.
- # -sysv* is not here because it comes later, after sysvr4.
- -gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \
- | -*vms* | -sco* | -esix* | -isc* | -aix* | -cnk* | -sunos | -sunos[34]*\
- | -hpux* | -unos* | -osf* | -luna* | -dgux* | -auroraux* | -solaris* \
- | -sym* | -kopensolaris* \
- | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \
- | -aos* | -aros* \
- | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \
- | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \
- | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* \
- | -openbsd* | -solidbsd* \
- | -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \
- | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \
- | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \
- | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \
- | -chorusos* | -chorusrdb* | -cegcc* \
- | -cygwin* | -msys* | -pe* | -psos* | -moss* | -proelf* | -rtems* \
- | -mingw32* | -linux-gnu* | -linux-android* \
- | -linux-newlib* | -linux-uclibc* \
- | -uxpv* | -beos* | -mpeix* | -udk* \
- | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \
- | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \
- | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* | -irx* \
- | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \
- | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \
- | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \
- | -skyos* | -haiku* | -rdos* | -toppers* | -drops* | -es*)
- # Remember, each alternative MUST END IN *, to match a version number.
- ;;
- -qnx*)
- case $basic_machine in
- x86-* | i*86-*)
- ;;
- *)
- os=-nto$os
- ;;
- esac
- ;;
- -nto-qnx*)
- ;;
- -nto*)
- os=`echo $os | sed -e 's|nto|nto-qnx|'`
- ;;
- -sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \
- | -windows* | -osx | -abug | -netware* | -os9* | -beos* | -haiku* \
- | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*)
- ;;
- -mac*)
- os=`echo $os | sed -e 's|mac|macos|'`
- ;;
- -linux-dietlibc)
- os=-linux-dietlibc
- ;;
- -linux*)
- os=`echo $os | sed -e 's|linux|linux-gnu|'`
- ;;
- -sunos5*)
- os=`echo $os | sed -e 's|sunos5|solaris2|'`
- ;;
- -sunos6*)
- os=`echo $os | sed -e 's|sunos6|solaris3|'`
- ;;
- -opened*)
- os=-openedition
- ;;
- -os400*)
- os=-os400
- ;;
- -wince*)
- os=-wince
- ;;
- -osfrose*)
- os=-osfrose
- ;;
- -osf*)
- os=-osf
- ;;
- -utek*)
- os=-bsd
- ;;
- -dynix*)
- os=-bsd
- ;;
- -acis*)
- os=-aos
- ;;
- -atheos*)
- os=-atheos
- ;;
- -syllable*)
- os=-syllable
- ;;
- -386bsd)
- os=-bsd
- ;;
- -ctix* | -uts*)
- os=-sysv
- ;;
- -nova*)
- os=-rtmk-nova
- ;;
- -ns2 )
- os=-nextstep2
- ;;
- -nsk*)
- os=-nsk
- ;;
- # Preserve the version number of sinix5.
- -sinix5.*)
- os=`echo $os | sed -e 's|sinix|sysv|'`
- ;;
- -sinix*)
- os=-sysv4
- ;;
- -tpf*)
- os=-tpf
- ;;
- -triton*)
- os=-sysv3
- ;;
- -oss*)
- os=-sysv3
- ;;
- -svr4)
- os=-sysv4
- ;;
- -svr3)
- os=-sysv3
- ;;
- -sysvr4)
- os=-sysv4
- ;;
- # This must come after -sysvr4.
- -sysv*)
- ;;
- -ose*)
- os=-ose
- ;;
- -es1800*)
- os=-ose
- ;;
- -xenix)
- os=-xenix
- ;;
- -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*)
- os=-mint
- ;;
- -aros*)
- os=-aros
- ;;
- -kaos*)
- os=-kaos
- ;;
- -zvmoe)
- os=-zvmoe
- ;;
- -dicos*)
- os=-dicos
- ;;
- -nacl*)
- ;;
- -none)
- ;;
- *)
- # Get rid of the `-' at the beginning of $os.
- os=`echo $os | sed 's/[^-]*-//'`
- echo Invalid configuration \`$1\': system \`$os\' not recognized 1>&2
- exit 1
- ;;
-esac
-else
-
-# Here we handle the default operating systems that come with various machines.
-# The value should be what the vendor currently ships out the door with their
-# machine or put another way, the most popular os provided with the machine.
-
-# Note that if you're going to try to match "-MANUFACTURER" here (say,
-# "-sun"), then you have to tell the case statement up towards the top
-# that MANUFACTURER isn't an operating system. Otherwise, code above
-# will signal an error saying that MANUFACTURER isn't an operating
-# system, and we'll never get to this point.
-
-case $basic_machine in
- score-*)
- os=-elf
- ;;
- spu-*)
- os=-elf
- ;;
- *-acorn)
- os=-riscix1.2
- ;;
- arm*-rebel)
- os=-linux
- ;;
- arm*-semi)
- os=-aout
- ;;
- c4x-* | tic4x-*)
- os=-coff
- ;;
- tic54x-*)
- os=-coff
- ;;
- tic55x-*)
- os=-coff
- ;;
- tic6x-*)
- os=-coff
- ;;
- # This must come before the *-dec entry.
- pdp10-*)
- os=-tops20
- ;;
- pdp11-*)
- os=-none
- ;;
- *-dec | vax-*)
- os=-ultrix4.2
- ;;
- m68*-apollo)
- os=-domain
- ;;
- i386-sun)
- os=-sunos4.0.2
- ;;
- m68000-sun)
- os=-sunos3
- ;;
- m68*-cisco)
- os=-aout
- ;;
- mep-*)
- os=-elf
- ;;
- mips*-cisco)
- os=-elf
- ;;
- mips*-*)
- os=-elf
- ;;
- or32-*)
- os=-coff
- ;;
- *-tti) # must be before sparc entry or we get the wrong os.
- os=-sysv3
- ;;
- sparc-* | *-sun)
- os=-sunos4.1.1
- ;;
- *-be)
- os=-beos
- ;;
- *-haiku)
- os=-haiku
- ;;
- *-ibm)
- os=-aix
- ;;
- *-knuth)
- os=-mmixware
- ;;
- *-wec)
- os=-proelf
- ;;
- *-winbond)
- os=-proelf
- ;;
- *-oki)
- os=-proelf
- ;;
- *-hp)
- os=-hpux
- ;;
- *-hitachi)
- os=-hiux
- ;;
- i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent)
- os=-sysv
- ;;
- *-cbm)
- os=-amigaos
- ;;
- *-dg)
- os=-dgux
- ;;
- *-dolphin)
- os=-sysv3
- ;;
- m68k-ccur)
- os=-rtu
- ;;
- m88k-omron*)
- os=-luna
- ;;
- *-next )
- os=-nextstep
- ;;
- *-sequent)
- os=-ptx
- ;;
- *-crds)
- os=-unos
- ;;
- *-ns)
- os=-genix
- ;;
- i370-*)
- os=-mvs
- ;;
- *-next)
- os=-nextstep3
- ;;
- *-gould)
- os=-sysv
- ;;
- *-highlevel)
- os=-bsd
- ;;
- *-encore)
- os=-bsd
- ;;
- *-sgi)
- os=-irix
- ;;
- *-siemens)
- os=-sysv4
- ;;
- *-masscomp)
- os=-rtu
- ;;
- f30[01]-fujitsu | f700-fujitsu)
- os=-uxpv
- ;;
- *-rom68k)
- os=-coff
- ;;
- *-*bug)
- os=-coff
- ;;
- *-apple)
- os=-macos
- ;;
- *-atari*)
- os=-mint
- ;;
- *)
- os=-none
- ;;
-esac
-fi
-
-# Here we handle the case where we know the os, and the CPU type, but not the
-# manufacturer. We pick the logical manufacturer.
-vendor=unknown
-case $basic_machine in
- *-unknown)
- case $os in
- -riscix*)
- vendor=acorn
- ;;
- -sunos*)
- vendor=sun
- ;;
- -cnk*|-aix*)
- vendor=ibm
- ;;
- -beos*)
- vendor=be
- ;;
- -hpux*)
- vendor=hp
- ;;
- -mpeix*)
- vendor=hp
- ;;
- -hiux*)
- vendor=hitachi
- ;;
- -unos*)
- vendor=crds
- ;;
- -dgux*)
- vendor=dg
- ;;
- -luna*)
- vendor=omron
- ;;
- -genix*)
- vendor=ns
- ;;
- -mvs* | -opened*)
- vendor=ibm
- ;;
- -os400*)
- vendor=ibm
- ;;
- -ptx*)
- vendor=sequent
- ;;
- -tpf*)
- vendor=ibm
- ;;
- -vxsim* | -vxworks* | -windiss*)
- vendor=wrs
- ;;
- -aux*)
- vendor=apple
- ;;
- -hms*)
- vendor=hitachi
- ;;
- -mpw* | -macos*)
- vendor=apple
- ;;
- -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*)
- vendor=atari
- ;;
- -vos*)
- vendor=stratus
- ;;
- esac
- basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"`
- ;;
-esac
-
-echo $basic_machine$os
-exit
-
-# Local variables:
-# eval: (add-hook 'write-file-hooks 'time-stamp)
-# time-stamp-start: "timestamp='"
-# time-stamp-format: "%:y-%02m-%02d"
-# time-stamp-end: "'"
-# End:
diff --git a/build-aux/install-sh b/build-aux/install-sh
deleted file mode 100755
index a9244eb..0000000
--- a/build-aux/install-sh
+++ /dev/null
@@ -1,527 +0,0 @@
-#!/bin/sh
-# install - install a program, script, or datafile
-
-scriptversion=2011-01-19.21; # UTC
-
-# This originates from X11R5 (mit/util/scripts/install.sh), which was
-# later released in X11R6 (xc/config/util/install.sh) with the
-# following copyright and license.
-#
-# Copyright (C) 1994 X Consortium
-#
-# Permission is hereby granted, free of charge, to any person obtaining a copy
-# of this software and associated documentation files (the "Software"), to
-# deal in the Software without restriction, including without limitation the
-# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
-# sell copies of the Software, and to permit persons to whom the Software is
-# furnished to do so, subject to the following conditions:
-#
-# The above copyright notice and this permission notice shall be included in
-# all copies or substantial portions of the Software.
-#
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-# X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
-# AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC-
-# TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-#
-# Except as contained in this notice, the name of the X Consortium shall not
-# be used in advertising or otherwise to promote the sale, use or other deal-
-# ings in this Software without prior written authorization from the X Consor-
-# tium.
-#
-#
-# FSF changes to this file are in the public domain.
-#
-# Calling this script install-sh is preferred over install.sh, to prevent
-# `make' implicit rules from creating a file called install from it
-# when there is no Makefile.
-#
-# This script is compatible with the BSD install script, but was written
-# from scratch.
-
-nl='
-'
-IFS=" "" $nl"
-
-# set DOITPROG to echo to test this script
-
-# Don't use :- since 4.3BSD and earlier shells don't like it.
-doit=${DOITPROG-}
-if test -z "$doit"; then
- doit_exec=exec
-else
- doit_exec=$doit
-fi
-
-# Put in absolute file names if you don't have them in your path;
-# or use environment vars.
-
-chgrpprog=${CHGRPPROG-chgrp}
-chmodprog=${CHMODPROG-chmod}
-chownprog=${CHOWNPROG-chown}
-cmpprog=${CMPPROG-cmp}
-cpprog=${CPPROG-cp}
-mkdirprog=${MKDIRPROG-mkdir}
-mvprog=${MVPROG-mv}
-rmprog=${RMPROG-rm}
-stripprog=${STRIPPROG-strip}
-
-posix_glob='?'
-initialize_posix_glob='
- test "$posix_glob" != "?" || {
- if (set -f) 2>/dev/null; then
- posix_glob=
- else
- posix_glob=:
- fi
- }
-'
-
-posix_mkdir=
-
-# Desired mode of installed file.
-mode=0755
-
-chgrpcmd=
-chmodcmd=$chmodprog
-chowncmd=
-mvcmd=$mvprog
-rmcmd="$rmprog -f"
-stripcmd=
-
-src=
-dst=
-dir_arg=
-dst_arg=
-
-copy_on_change=false
-no_target_directory=
-
-usage="\
-Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE
- or: $0 [OPTION]... SRCFILES... DIRECTORY
- or: $0 [OPTION]... -t DIRECTORY SRCFILES...
- or: $0 [OPTION]... -d DIRECTORIES...
-
-In the 1st form, copy SRCFILE to DSTFILE.
-In the 2nd and 3rd, copy all SRCFILES to DIRECTORY.
-In the 4th, create DIRECTORIES.
-
-Options:
- --help display this help and exit.
- --version display version info and exit.
-
- -c (ignored)
- -C install only if different (preserve the last data modification time)
- -d create directories instead of installing files.
- -g GROUP $chgrpprog installed files to GROUP.
- -m MODE $chmodprog installed files to MODE.
- -o USER $chownprog installed files to USER.
- -s $stripprog installed files.
- -t DIRECTORY install into DIRECTORY.
- -T report an error if DSTFILE is a directory.
-
-Environment variables override the default commands:
- CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG
- RMPROG STRIPPROG
-"
-
-while test $# -ne 0; do
- case $1 in
- -c) ;;
-
- -C) copy_on_change=true;;
-
- -d) dir_arg=true;;
-
- -g) chgrpcmd="$chgrpprog $2"
- shift;;
-
- --help) echo "$usage"; exit $?;;
-
- -m) mode=$2
- case $mode in
- *' '* | *' '* | *'
-'* | *'*'* | *'?'* | *'['*)
- echo "$0: invalid mode: $mode" >&2
- exit 1;;
- esac
- shift;;
-
- -o) chowncmd="$chownprog $2"
- shift;;
-
- -s) stripcmd=$stripprog;;
-
- -t) dst_arg=$2
- # Protect names problematic for `test' and other utilities.
- case $dst_arg in
- -* | [=\(\)!]) dst_arg=./$dst_arg;;
- esac
- shift;;
-
- -T) no_target_directory=true;;
-
- --version) echo "$0 $scriptversion"; exit $?;;
-
- --) shift
- break;;
-
- -*) echo "$0: invalid option: $1" >&2
- exit 1;;
-
- *) break;;
- esac
- shift
-done
-
-if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then
- # When -d is used, all remaining arguments are directories to create.
- # When -t is used, the destination is already specified.
- # Otherwise, the last argument is the destination. Remove it from $@.
- for arg
- do
- if test -n "$dst_arg"; then
- # $@ is not empty: it contains at least $arg.
- set fnord "$@" "$dst_arg"
- shift # fnord
- fi
- shift # arg
- dst_arg=$arg
- # Protect names problematic for `test' and other utilities.
- case $dst_arg in
- -* | [=\(\)!]) dst_arg=./$dst_arg;;
- esac
- done
-fi
-
-if test $# -eq 0; then
- if test -z "$dir_arg"; then
- echo "$0: no input file specified." >&2
- exit 1
- fi
- # It's OK to call `install-sh -d' without argument.
- # This can happen when creating conditional directories.
- exit 0
-fi
-
-if test -z "$dir_arg"; then
- do_exit='(exit $ret); exit $ret'
- trap "ret=129; $do_exit" 1
- trap "ret=130; $do_exit" 2
- trap "ret=141; $do_exit" 13
- trap "ret=143; $do_exit" 15
-
- # Set umask so as not to create temps with too-generous modes.
- # However, 'strip' requires both read and write access to temps.
- case $mode in
- # Optimize common cases.
- *644) cp_umask=133;;
- *755) cp_umask=22;;
-
- *[0-7])
- if test -z "$stripcmd"; then
- u_plus_rw=
- else
- u_plus_rw='% 200'
- fi
- cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;;
- *)
- if test -z "$stripcmd"; then
- u_plus_rw=
- else
- u_plus_rw=,u+rw
- fi
- cp_umask=$mode$u_plus_rw;;
- esac
-fi
-
-for src
-do
- # Protect names problematic for `test' and other utilities.
- case $src in
- -* | [=\(\)!]) src=./$src;;
- esac
-
- if test -n "$dir_arg"; then
- dst=$src
- dstdir=$dst
- test -d "$dstdir"
- dstdir_status=$?
- else
-
- # Waiting for this to be detected by the "$cpprog $src $dsttmp" command
- # might cause directories to be created, which would be especially bad
- # if $src (and thus $dsttmp) contains '*'.
- if test ! -f "$src" && test ! -d "$src"; then
- echo "$0: $src does not exist." >&2
- exit 1
- fi
-
- if test -z "$dst_arg"; then
- echo "$0: no destination specified." >&2
- exit 1
- fi
- dst=$dst_arg
-
- # If destination is a directory, append the input filename; won't work
- # if double slashes aren't ignored.
- if test -d "$dst"; then
- if test -n "$no_target_directory"; then
- echo "$0: $dst_arg: Is a directory" >&2
- exit 1
- fi
- dstdir=$dst
- dst=$dstdir/`basename "$src"`
- dstdir_status=0
- else
- # Prefer dirname, but fall back on a substitute if dirname fails.
- dstdir=`
- (dirname "$dst") 2>/dev/null ||
- expr X"$dst" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
- X"$dst" : 'X\(//\)[^/]' \| \
- X"$dst" : 'X\(//\)$' \| \
- X"$dst" : 'X\(/\)' \| . 2>/dev/null ||
- echo X"$dst" |
- sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
- s//\1/
- q
- }
- /^X\(\/\/\)[^/].*/{
- s//\1/
- q
- }
- /^X\(\/\/\)$/{
- s//\1/
- q
- }
- /^X\(\/\).*/{
- s//\1/
- q
- }
- s/.*/./; q'
- `
-
- test -d "$dstdir"
- dstdir_status=$?
- fi
- fi
-
- obsolete_mkdir_used=false
-
- if test $dstdir_status != 0; then
- case $posix_mkdir in
- '')
- # Create intermediate dirs using mode 755 as modified by the umask.
- # This is like FreeBSD 'install' as of 1997-10-28.
- umask=`umask`
- case $stripcmd.$umask in
- # Optimize common cases.
- *[2367][2367]) mkdir_umask=$umask;;
- .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;;
-
- *[0-7])
- mkdir_umask=`expr $umask + 22 \
- - $umask % 100 % 40 + $umask % 20 \
- - $umask % 10 % 4 + $umask % 2
- `;;
- *) mkdir_umask=$umask,go-w;;
- esac
-
- # With -d, create the new directory with the user-specified mode.
- # Otherwise, rely on $mkdir_umask.
- if test -n "$dir_arg"; then
- mkdir_mode=-m$mode
- else
- mkdir_mode=
- fi
-
- posix_mkdir=false
- case $umask in
- *[123567][0-7][0-7])
- # POSIX mkdir -p sets u+wx bits regardless of umask, which
- # is incompatible with FreeBSD 'install' when (umask & 300) != 0.
- ;;
- *)
- tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$
- trap 'ret=$?; rmdir "$tmpdir/d" "$tmpdir" 2>/dev/null; exit $ret' 0
-
- if (umask $mkdir_umask &&
- exec $mkdirprog $mkdir_mode -p -- "$tmpdir/d") >/dev/null 2>&1
- then
- if test -z "$dir_arg" || {
- # Check for POSIX incompatibilities with -m.
- # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or
- # other-writeable bit of parent directory when it shouldn't.
- # FreeBSD 6.1 mkdir -m -p sets mode of existing directory.
- ls_ld_tmpdir=`ls -ld "$tmpdir"`
- case $ls_ld_tmpdir in
- d????-?r-*) different_mode=700;;
- d????-?--*) different_mode=755;;
- *) false;;
- esac &&
- $mkdirprog -m$different_mode -p -- "$tmpdir" && {
- ls_ld_tmpdir_1=`ls -ld "$tmpdir"`
- test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1"
- }
- }
- then posix_mkdir=:
- fi
- rmdir "$tmpdir/d" "$tmpdir"
- else
- # Remove any dirs left behind by ancient mkdir implementations.
- rmdir ./$mkdir_mode ./-p ./-- 2>/dev/null
- fi
- trap '' 0;;
- esac;;
- esac
-
- if
- $posix_mkdir && (
- umask $mkdir_umask &&
- $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir"
- )
- then :
- else
-
- # The umask is ridiculous, or mkdir does not conform to POSIX,
- # or it failed possibly due to a race condition. Create the
- # directory the slow way, step by step, checking for races as we go.
-
- case $dstdir in
- /*) prefix='/';;
- [-=\(\)!]*) prefix='./';;
- *) prefix='';;
- esac
-
- eval "$initialize_posix_glob"
-
- oIFS=$IFS
- IFS=/
- $posix_glob set -f
- set fnord $dstdir
- shift
- $posix_glob set +f
- IFS=$oIFS
-
- prefixes=
-
- for d
- do
- test X"$d" = X && continue
-
- prefix=$prefix$d
- if test -d "$prefix"; then
- prefixes=
- else
- if $posix_mkdir; then
- (umask=$mkdir_umask &&
- $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break
- # Don't fail if two instances are running concurrently.
- test -d "$prefix" || exit 1
- else
- case $prefix in
- *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;;
- *) qprefix=$prefix;;
- esac
- prefixes="$prefixes '$qprefix'"
- fi
- fi
- prefix=$prefix/
- done
-
- if test -n "$prefixes"; then
- # Don't fail if two instances are running concurrently.
- (umask $mkdir_umask &&
- eval "\$doit_exec \$mkdirprog $prefixes") ||
- test -d "$dstdir" || exit 1
- obsolete_mkdir_used=true
- fi
- fi
- fi
-
- if test -n "$dir_arg"; then
- { test -z "$chowncmd" || $doit $chowncmd "$dst"; } &&
- { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } &&
- { test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false ||
- test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1
- else
-
- # Make a couple of temp file names in the proper directory.
- dsttmp=$dstdir/_inst.$$_
- rmtmp=$dstdir/_rm.$$_
-
- # Trap to clean up those temp files at exit.
- trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0
-
- # Copy the file name to the temp name.
- (umask $cp_umask && $doit_exec $cpprog "$src" "$dsttmp") &&
-
- # and set any options; do chmod last to preserve setuid bits.
- #
- # If any of these fail, we abort the whole thing. If we want to
- # ignore errors from any of these, just make sure not to ignore
- # errors from the above "$doit $cpprog $src $dsttmp" command.
- #
- { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } &&
- { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } &&
- { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } &&
- { test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } &&
-
- # If -C, don't bother to copy if it wouldn't change the file.
- if $copy_on_change &&
- old=`LC_ALL=C ls -dlL "$dst" 2>/dev/null` &&
- new=`LC_ALL=C ls -dlL "$dsttmp" 2>/dev/null` &&
-
- eval "$initialize_posix_glob" &&
- $posix_glob set -f &&
- set X $old && old=:$2:$4:$5:$6 &&
- set X $new && new=:$2:$4:$5:$6 &&
- $posix_glob set +f &&
-
- test "$old" = "$new" &&
- $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1
- then
- rm -f "$dsttmp"
- else
- # Rename the file to the real destination.
- $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null ||
-
- # The rename failed, perhaps because mv can't rename something else
- # to itself, or perhaps because mv is so ancient that it does not
- # support -f.
- {
- # Now remove or move aside any old file at destination location.
- # We try this two ways since rm can't unlink itself on some
- # systems and the destination file might be busy for other
- # reasons. In this case, the final cleanup might fail but the new
- # file should still install successfully.
- {
- test ! -f "$dst" ||
- $doit $rmcmd -f "$dst" 2>/dev/null ||
- { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null &&
- { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; }
- } ||
- { echo "$0: cannot unlink or rename $dst" >&2
- (exit 1); exit 1
- }
- } &&
-
- # Now rename the file to the real destination.
- $doit $mvcmd "$dsttmp" "$dst"
- }
- fi || exit 1
-
- trap '' 0
- fi
-done
-
-# Local variables:
-# eval: (add-hook 'write-file-hooks 'time-stamp)
-# time-stamp-start: "scriptversion="
-# time-stamp-format: "%:y-%02m-%02d.%02H"
-# time-stamp-time-zone: "UTC"
-# time-stamp-end: "; # UTC"
-# End:
diff --git a/build-aux/ltmain.sh b/build-aux/ltmain.sh
deleted file mode 100644
index 63ae69d..0000000
--- a/build-aux/ltmain.sh
+++ /dev/null
@@ -1,9655 +0,0 @@
-
-# libtool (GNU libtool) 2.4.2
-# Written by Gordon Matzigkeit <gord at gnu.ai.mit.edu>, 1996
-
-# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, 2006,
-# 2007, 2008, 2009, 2010, 2011 Free Software Foundation, Inc.
-# This is free software; see the source for copying conditions. There is NO
-# warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
-
-# GNU Libtool 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.
-#
-# As a special exception to the GNU General Public License,
-# if you distribute this file as part of a program or library that
-# is built using GNU Libtool, you may include this file under the
-# same distribution terms that you use for the rest of that program.
-#
-# GNU Libtool 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 GNU Libtool; see the file COPYING. If not, a copy
-# can be downloaded from http://www.gnu.org/licenses/gpl.html,
-# or obtained by writing to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-
-# Usage: $progname [OPTION]... [MODE-ARG]...
-#
-# Provide generalized library-building support services.
-#
-# --config show all configuration variables
-# --debug enable verbose shell tracing
-# -n, --dry-run display commands without modifying any files
-# --features display basic configuration information and exit
-# --mode=MODE use operation mode MODE
-# --preserve-dup-deps don't remove duplicate dependency libraries
-# --quiet, --silent don't print informational messages
-# --no-quiet, --no-silent
-# print informational messages (default)
-# --no-warn don't display warning messages
-# --tag=TAG use configuration variables from tag TAG
-# -v, --verbose print more informational messages than default
-# --no-verbose don't print the extra informational messages
-# --version print version information
-# -h, --help, --help-all print short, long, or detailed help message
-#
-# MODE must be one of the following:
-#
-# clean remove files from the build directory
-# compile compile a source file into a libtool object
-# execute automatically set library path, then run a program
-# finish complete the installation of libtool libraries
-# install install libraries or executables
-# link create a library or an executable
-# uninstall remove libraries from an installed directory
-#
-# MODE-ARGS vary depending on the MODE. When passed as first option,
-# `--mode=MODE' may be abbreviated as `MODE' or a unique abbreviation of that.
-# Try `$progname --help --mode=MODE' for a more detailed description of MODE.
-#
-# When reporting a bug, please describe a test case to reproduce it and
-# include the following information:
-#
-# host-triplet: $host
-# shell: $SHELL
-# compiler: $LTCC
-# compiler flags: $LTCFLAGS
-# linker: $LD (gnu? $with_gnu_ld)
-# $progname: (GNU libtool) 2.4.2
-# automake: $automake_version
-# autoconf: $autoconf_version
-#
-# Report bugs to <bug-libtool at gnu.org>.
-# GNU libtool home page: <http://www.gnu.org/software/libtool/>.
-# General help using GNU software: <http://www.gnu.org/gethelp/>.
-
-PROGRAM=libtool
-PACKAGE=libtool
-VERSION=2.4.2
-TIMESTAMP=""
-package_revision=1.3337
-
-# Be Bourne compatible
-if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
- emulate sh
- NULLCMD=:
- # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which
- # is contrary to our usage. Disable this feature.
- alias -g '${1+"$@"}'='"$@"'
- setopt NO_GLOB_SUBST
-else
- case `(set -o) 2>/dev/null` in *posix*) set -o posix;; esac
-fi
-BIN_SH=xpg4; export BIN_SH # for Tru64
-DUALCASE=1; export DUALCASE # for MKS sh
-
-# A function that is used when there is no print builtin or printf.
-func_fallback_echo ()
-{
- eval 'cat <<_LTECHO_EOF
-$1
-_LTECHO_EOF'
-}
-
-# NLS nuisances: We save the old values to restore during execute mode.
-lt_user_locale=
-lt_safe_locale=
-for lt_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES
-do
- eval "if test \"\${$lt_var+set}\" = set; then
- save_$lt_var=\$$lt_var
- $lt_var=C
- export $lt_var
- lt_user_locale=\"$lt_var=\\\$save_\$lt_var; \$lt_user_locale\"
- lt_safe_locale=\"$lt_var=C; \$lt_safe_locale\"
- fi"
-done
-LC_ALL=C
-LANGUAGE=C
-export LANGUAGE LC_ALL
-
-$lt_unset CDPATH
-
-
-# Work around backward compatibility issue on IRIX 6.5. On IRIX 6.4+, sh
-# is ksh but when the shell is invoked as "sh" and the current value of
-# the _XPG environment variable is not equal to 1 (one), the special
-# positional parameter $0, within a function call, is the name of the
-# function.
-progpath="$0"
-
-
-
-: ${CP="cp -f"}
-test "${ECHO+set}" = set || ECHO=${as_echo-'printf %s\n'}
-: ${MAKE="make"}
-: ${MKDIR="mkdir"}
-: ${MV="mv -f"}
-: ${RM="rm -f"}
-: ${SHELL="${CONFIG_SHELL-/bin/sh}"}
-: ${Xsed="$SED -e 1s/^X//"}
-
-# Global variables:
-EXIT_SUCCESS=0
-EXIT_FAILURE=1
-EXIT_MISMATCH=63 # $? = 63 is used to indicate version mismatch to missing.
-EXIT_SKIP=77 # $? = 77 is used to indicate a skipped test to automake.
-
-exit_status=$EXIT_SUCCESS
-
-# Make sure IFS has a sensible default
-lt_nl='
-'
-IFS=" $lt_nl"
-
-dirname="s,/[^/]*$,,"
-basename="s,^.*/,,"
-
-# func_dirname file append nondir_replacement
-# Compute the dirname of FILE. If nonempty, add APPEND to the result,
-# otherwise set result to NONDIR_REPLACEMENT.
-func_dirname ()
-{
- func_dirname_result=`$ECHO "${1}" | $SED "$dirname"`
- if test "X$func_dirname_result" = "X${1}"; then
- func_dirname_result="${3}"
- else
- func_dirname_result="$func_dirname_result${2}"
- fi
-} # func_dirname may be replaced by extended shell implementation
-
-
-# func_basename file
-func_basename ()
-{
- func_basename_result=`$ECHO "${1}" | $SED "$basename"`
-} # func_basename may be replaced by extended shell implementation
-
-
-# func_dirname_and_basename file append nondir_replacement
-# perform func_basename and func_dirname in a single function
-# call:
-# dirname: Compute the dirname of FILE. If nonempty,
-# add APPEND to the result, otherwise set result
-# to NONDIR_REPLACEMENT.
-# value returned in "$func_dirname_result"
-# basename: Compute filename of FILE.
-# value retuned in "$func_basename_result"
-# Implementation must be kept synchronized with func_dirname
-# and func_basename. For efficiency, we do not delegate to
-# those functions but instead duplicate the functionality here.
-func_dirname_and_basename ()
-{
- # Extract subdirectory from the argument.
- func_dirname_result=`$ECHO "${1}" | $SED -e "$dirname"`
- if test "X$func_dirname_result" = "X${1}"; then
- func_dirname_result="${3}"
- else
- func_dirname_result="$func_dirname_result${2}"
- fi
- func_basename_result=`$ECHO "${1}" | $SED -e "$basename"`
-} # func_dirname_and_basename may be replaced by extended shell implementation
-
-
-# func_stripname prefix suffix name
-# strip PREFIX and SUFFIX off of NAME.
-# PREFIX and SUFFIX must not contain globbing or regex special
-# characters, hashes, percent signs, but SUFFIX may contain a leading
-# dot (in which case that matches only a dot).
-# func_strip_suffix prefix name
-func_stripname ()
-{
- case ${2} in
- .*) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%\\\\${2}\$%%"`;;
- *) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%${2}\$%%"`;;
- esac
-} # func_stripname may be replaced by extended shell implementation
-
-
-# These SED scripts presuppose an absolute path with a trailing slash.
-pathcar='s,^/\([^/]*\).*$,\1,'
-pathcdr='s,^/[^/]*,,'
-removedotparts=':dotsl
- s@/\./@/@g
- t dotsl
- s,/\.$,/,'
-collapseslashes='s@/\{1,\}@/@g'
-finalslash='s,/*$,/,'
-
-# func_normal_abspath PATH
-# Remove doubled-up and trailing slashes, "." path components,
-# and cancel out any ".." path components in PATH after making
-# it an absolute path.
-# value returned in "$func_normal_abspath_result"
-func_normal_abspath ()
-{
- # Start from root dir and reassemble the path.
- func_normal_abspath_result=
- func_normal_abspath_tpath=$1
- func_normal_abspath_altnamespace=
- case $func_normal_abspath_tpath in
- "")
- # Empty path, that just means $cwd.
- func_stripname '' '/' "`pwd`"
- func_normal_abspath_result=$func_stripname_result
- return
- ;;
- # The next three entries are used to spot a run of precisely
- # two leading slashes without using negated character classes;
- # we take advantage of case's first-match behaviour.
- ///*)
- # Unusual form of absolute path, do nothing.
- ;;
- //*)
- # Not necessarily an ordinary path; POSIX reserves leading '//'
- # and for example Cygwin uses it to access remote file shares
- # over CIFS/SMB, so we conserve a leading double slash if found.
- func_normal_abspath_altnamespace=/
- ;;
- /*)
- # Absolute path, do nothing.
- ;;
- *)
- # Relative path, prepend $cwd.
- func_normal_abspath_tpath=`pwd`/$func_normal_abspath_tpath
- ;;
- esac
- # Cancel out all the simple stuff to save iterations. We also want
- # the path to end with a slash for ease of parsing, so make sure
- # there is one (and only one) here.
- func_normal_abspath_tpath=`$ECHO "$func_normal_abspath_tpath" | $SED \
- -e "$removedotparts" -e "$collapseslashes" -e "$finalslash"`
- while :; do
- # Processed it all yet?
- if test "$func_normal_abspath_tpath" = / ; then
- # If we ascended to the root using ".." the result may be empty now.
- if test -z "$func_normal_abspath_result" ; then
- func_normal_abspath_result=/
- fi
- break
- fi
- func_normal_abspath_tcomponent=`$ECHO "$func_normal_abspath_tpath" | $SED \
- -e "$pathcar"`
- func_normal_abspath_tpath=`$ECHO "$func_normal_abspath_tpath" | $SED \
- -e "$pathcdr"`
- # Figure out what to do with it
- case $func_normal_abspath_tcomponent in
- "")
- # Trailing empty path component, ignore it.
- ;;
- ..)
- # Parent dir; strip last assembled component from result.
- func_dirname "$func_normal_abspath_result"
- func_normal_abspath_result=$func_dirname_result
- ;;
- *)
- # Actual path component, append it.
- func_normal_abspath_result=$func_normal_abspath_result/$func_normal_abspath_tcomponent
- ;;
- esac
- done
- # Restore leading double-slash if one was found on entry.
- func_normal_abspath_result=$func_normal_abspath_altnamespace$func_normal_abspath_result
-}
-
-# func_relative_path SRCDIR DSTDIR
-# generates a relative path from SRCDIR to DSTDIR, with a trailing
-# slash if non-empty, suitable for immediately appending a filename
-# without needing to append a separator.
-# value returned in "$func_relative_path_result"
-func_relative_path ()
-{
- func_relative_path_result=
- func_normal_abspath "$1"
- func_relative_path_tlibdir=$func_normal_abspath_result
- func_normal_abspath "$2"
- func_relative_path_tbindir=$func_normal_abspath_result
-
- # Ascend the tree starting from libdir
- while :; do
- # check if we have found a prefix of bindir
- case $func_relative_path_tbindir in
- $func_relative_path_tlibdir)
- # found an exact match
- func_relative_path_tcancelled=
- break
- ;;
- $func_relative_path_tlibdir*)
- # found a matching prefix
- func_stripname "$func_relative_path_tlibdir" '' "$func_relative_path_tbindir"
- func_relative_path_tcancelled=$func_stripname_result
- if test -z "$func_relative_path_result"; then
- func_relative_path_result=.
- fi
- break
- ;;
- *)
- func_dirname $func_relative_path_tlibdir
- func_relative_path_tlibdir=${func_dirname_result}
- if test "x$func_relative_path_tlibdir" = x ; then
- # Have to descend all the way to the root!
- func_relative_path_result=../$func_relative_path_result
- func_relative_path_tcancelled=$func_relative_path_tbindir
- break
- fi
- func_relative_path_result=../$func_relative_path_result
- ;;
- esac
- done
-
- # Now calculate path; take care to avoid doubling-up slashes.
- func_stripname '' '/' "$func_relative_path_result"
- func_relative_path_result=$func_stripname_result
- func_stripname '/' '/' "$func_relative_path_tcancelled"
- if test "x$func_stripname_result" != x ; then
- func_relative_path_result=${func_relative_path_result}/${func_stripname_result}
- fi
-
- # Normalisation. If bindir is libdir, return empty string,
- # else relative path ending with a slash; either way, target
- # file name can be directly appended.
- if test ! -z "$func_relative_path_result"; then
- func_stripname './' '' "$func_relative_path_result/"
- func_relative_path_result=$func_stripname_result
- fi
-}
-
-# The name of this program:
-func_dirname_and_basename "$progpath"
-progname=$func_basename_result
-
-# Make sure we have an absolute path for reexecution:
-case $progpath in
- [\\/]*|[A-Za-z]:\\*) ;;
- *[\\/]*)
- progdir=$func_dirname_result
- progdir=`cd "$progdir" && pwd`
- progpath="$progdir/$progname"
- ;;
- *)
- save_IFS="$IFS"
- IFS=${PATH_SEPARATOR-:}
- for progdir in $PATH; do
- IFS="$save_IFS"
- test -x "$progdir/$progname" && break
- done
- IFS="$save_IFS"
- test -n "$progdir" || progdir=`pwd`
- progpath="$progdir/$progname"
- ;;
-esac
-
-# Sed substitution that helps us do robust quoting. It backslashifies
-# metacharacters that are still active within double-quoted strings.
-Xsed="${SED}"' -e 1s/^X//'
-sed_quote_subst='s/\([`"$\\]\)/\\\1/g'
-
-# Same as above, but do not quote variable references.
-double_quote_subst='s/\(["`\\]\)/\\\1/g'
-
-# Sed substitution that turns a string into a regex matching for the
-# string literally.
-sed_make_literal_regex='s,[].[^$\\*\/],\\&,g'
-
-# Sed substitution that converts a w32 file name or path
-# which contains forward slashes, into one that contains
-# (escaped) backslashes. A very naive implementation.
-lt_sed_naive_backslashify='s|\\\\*|\\|g;s|/|\\|g;s|\\|\\\\|g'
-
-# Re-`\' parameter expansions in output of double_quote_subst that were
-# `\'-ed in input to the same. If an odd number of `\' preceded a '$'
-# in input to double_quote_subst, that '$' was protected from expansion.
-# Since each input `\' is now two `\'s, look for any number of runs of
-# four `\'s followed by two `\'s and then a '$'. `\' that '$'.
-bs='\\'
-bs2='\\\\'
-bs4='\\\\\\\\'
-dollar='\$'
-sed_double_backslash="\
- s/$bs4/&\\
-/g
- s/^$bs2$dollar/$bs&/
- s/\\([^$bs]\\)$bs2$dollar/\\1$bs2$bs$dollar/g
- s/\n//g"
-
-# Standard options:
-opt_dry_run=false
-opt_help=false
-opt_quiet=false
-opt_verbose=false
-opt_warning=:
-
-# func_echo arg...
-# Echo program name prefixed message, along with the current mode
-# name if it has been set yet.
-func_echo ()
-{
- $ECHO "$progname: ${opt_mode+$opt_mode: }$*"
-}
-
-# func_verbose arg...
-# Echo program name prefixed message in verbose mode only.
-func_verbose ()
-{
- $opt_verbose && func_echo ${1+"$@"}
-
- # A bug in bash halts the script if the last line of a function
- # fails when set -e is in force, so we need another command to
- # work around that:
- :
-}
-
-# func_echo_all arg...
-# Invoke $ECHO with all args, space-separated.
-func_echo_all ()
-{
- $ECHO "$*"
-}
-
-# func_error arg...
-# Echo program name prefixed message to standard error.
-func_error ()
-{
- $ECHO "$progname: ${opt_mode+$opt_mode: }"${1+"$@"} 1>&2
-}
-
-# func_warning arg...
-# Echo program name prefixed warning message to standard error.
-func_warning ()
-{
- $opt_warning && $ECHO "$progname: ${opt_mode+$opt_mode: }warning: "${1+"$@"} 1>&2
-
- # bash bug again:
- :
-}
-
-# func_fatal_error arg...
-# Echo program name prefixed message to standard error, and exit.
-func_fatal_error ()
-{
- func_error ${1+"$@"}
- exit $EXIT_FAILURE
-}
-
-# func_fatal_help arg...
-# Echo program name prefixed message to standard error, followed by
-# a help hint, and exit.
-func_fatal_help ()
-{
- func_error ${1+"$@"}
- func_fatal_error "$help"
-}
-help="Try \`$progname --help' for more information." ## default
-
-
-# func_grep expression filename
-# Check whether EXPRESSION matches any line of FILENAME, without output.
-func_grep ()
-{
- $GREP "$1" "$2" >/dev/null 2>&1
-}
-
-
-# func_mkdir_p directory-path
-# Make sure the entire path to DIRECTORY-PATH is available.
-func_mkdir_p ()
-{
- my_directory_path="$1"
- my_dir_list=
-
- if test -n "$my_directory_path" && test "$opt_dry_run" != ":"; then
-
- # Protect directory names starting with `-'
- case $my_directory_path in
- -*) my_directory_path="./$my_directory_path" ;;
- esac
-
- # While some portion of DIR does not yet exist...
- while test ! -d "$my_directory_path"; do
- # ...make a list in topmost first order. Use a colon delimited
- # list incase some portion of path contains whitespace.
- my_dir_list="$my_directory_path:$my_dir_list"
-
- # If the last portion added has no slash in it, the list is done
- case $my_directory_path in */*) ;; *) break ;; esac
-
- # ...otherwise throw away the child directory and loop
- my_directory_path=`$ECHO "$my_directory_path" | $SED -e "$dirname"`
- done
- my_dir_list=`$ECHO "$my_dir_list" | $SED 's,:*$,,'`
-
- save_mkdir_p_IFS="$IFS"; IFS=':'
- for my_dir in $my_dir_list; do
- IFS="$save_mkdir_p_IFS"
- # mkdir can fail with a `File exist' error if two processes
- # try to create one of the directories concurrently. Don't
- # stop in that case!
- $MKDIR "$my_dir" 2>/dev/null || :
- done
- IFS="$save_mkdir_p_IFS"
-
- # Bail out if we (or some other process) failed to create a directory.
- test -d "$my_directory_path" || \
- func_fatal_error "Failed to create \`$1'"
- fi
-}
-
-
-# func_mktempdir [string]
-# Make a temporary directory that won't clash with other running
-# libtool processes, and avoids race conditions if possible. If
-# given, STRING is the basename for that directory.
-func_mktempdir ()
-{
- my_template="${TMPDIR-/tmp}/${1-$progname}"
-
- if test "$opt_dry_run" = ":"; then
- # Return a directory name, but don't create it in dry-run mode
- my_tmpdir="${my_template}-$$"
- else
-
- # If mktemp works, use that first and foremost
- my_tmpdir=`mktemp -d "${my_template}-XXXXXXXX" 2>/dev/null`
-
- if test ! -d "$my_tmpdir"; then
- # Failing that, at least try and use $RANDOM to avoid a race
- my_tmpdir="${my_template}-${RANDOM-0}$$"
-
- save_mktempdir_umask=`umask`
- umask 0077
- $MKDIR "$my_tmpdir"
- umask $save_mktempdir_umask
- fi
-
- # If we're not in dry-run mode, bomb out on failure
- test -d "$my_tmpdir" || \
- func_fatal_error "cannot create temporary directory \`$my_tmpdir'"
- fi
-
- $ECHO "$my_tmpdir"
-}
-
-
-# func_quote_for_eval arg
-# Aesthetically quote ARG to be evaled later.
-# This function returns two values: FUNC_QUOTE_FOR_EVAL_RESULT
-# is double-quoted, suitable for a subsequent eval, whereas
-# FUNC_QUOTE_FOR_EVAL_UNQUOTED_RESULT has merely all characters
-# which are still active within double quotes backslashified.
-func_quote_for_eval ()
-{
- case $1 in
- *[\\\`\"\$]*)
- func_quote_for_eval_unquoted_result=`$ECHO "$1" | $SED "$sed_quote_subst"` ;;
- *)
- func_quote_for_eval_unquoted_result="$1" ;;
- esac
-
- case $func_quote_for_eval_unquoted_result in
- # Double-quote args containing shell metacharacters to delay
- # word splitting, command substitution and and variable
- # expansion for a subsequent eval.
- # Many Bourne shells cannot handle close brackets correctly
- # in scan sets, so we specify it separately.
- *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"")
- func_quote_for_eval_result="\"$func_quote_for_eval_unquoted_result\""
- ;;
- *)
- func_quote_for_eval_result="$func_quote_for_eval_unquoted_result"
- esac
-}
-
-
-# func_quote_for_expand arg
-# Aesthetically quote ARG to be evaled later; same as above,
-# but do not quote variable references.
-func_quote_for_expand ()
-{
- case $1 in
- *[\\\`\"]*)
- my_arg=`$ECHO "$1" | $SED \
- -e "$double_quote_subst" -e "$sed_double_backslash"` ;;
- *)
- my_arg="$1" ;;
- esac
-
- case $my_arg in
- # Double-quote args containing shell metacharacters to delay
- # word splitting and command substitution for a subsequent eval.
- # Many Bourne shells cannot handle close brackets correctly
- # in scan sets, so we specify it separately.
- *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"")
- my_arg="\"$my_arg\""
- ;;
- esac
-
- func_quote_for_expand_result="$my_arg"
-}
-
-
-# func_show_eval cmd [fail_exp]
-# Unless opt_silent is true, then output CMD. Then, if opt_dryrun is
-# not true, evaluate CMD. If the evaluation of CMD fails, and FAIL_EXP
-# is given, then evaluate it.
-func_show_eval ()
-{
- my_cmd="$1"
- my_fail_exp="${2-:}"
-
- ${opt_silent-false} || {
- func_quote_for_expand "$my_cmd"
- eval "func_echo $func_quote_for_expand_result"
- }
-
- if ${opt_dry_run-false}; then :; else
- eval "$my_cmd"
- my_status=$?
- if test "$my_status" -eq 0; then :; else
- eval "(exit $my_status); $my_fail_exp"
- fi
- fi
-}
-
-
-# func_show_eval_locale cmd [fail_exp]
-# Unless opt_silent is true, then output CMD. Then, if opt_dryrun is
-# not true, evaluate CMD. If the evaluation of CMD fails, and FAIL_EXP
-# is given, then evaluate it. Use the saved locale for evaluation.
-func_show_eval_locale ()
-{
- my_cmd="$1"
- my_fail_exp="${2-:}"
-
- ${opt_silent-false} || {
- func_quote_for_expand "$my_cmd"
- eval "func_echo $func_quote_for_expand_result"
- }
-
- if ${opt_dry_run-false}; then :; else
- eval "$lt_user_locale
- $my_cmd"
- my_status=$?
- eval "$lt_safe_locale"
- if test "$my_status" -eq 0; then :; else
- eval "(exit $my_status); $my_fail_exp"
- fi
- fi
-}
-
-# func_tr_sh
-# Turn $1 into a string suitable for a shell variable name.
-# Result is stored in $func_tr_sh_result. All characters
-# not in the set a-zA-Z0-9_ are replaced with '_'. Further,
-# if $1 begins with a digit, a '_' is prepended as well.
-func_tr_sh ()
-{
- case $1 in
- [0-9]* | *[!a-zA-Z0-9_]*)
- func_tr_sh_result=`$ECHO "$1" | $SED 's/^\([0-9]\)/_\1/; s/[^a-zA-Z0-9_]/_/g'`
- ;;
- * )
- func_tr_sh_result=$1
- ;;
- esac
-}
-
-
-# func_version
-# Echo version message to standard output and exit.
-func_version ()
-{
- $opt_debug
-
- $SED -n '/(C)/!b go
- :more
- /\./!{
- N
- s/\n# / /
- b more
- }
- :go
- /^# '$PROGRAM' (GNU /,/# warranty; / {
- s/^# //
- s/^# *$//
- s/\((C)\)[ 0-9,-]*\( [1-9][0-9]*\)/\1\2/
- p
- }' < "$progpath"
- exit $?
-}
-
-# func_usage
-# Echo short help message to standard output and exit.
-func_usage ()
-{
- $opt_debug
-
- $SED -n '/^# Usage:/,/^# *.*--help/ {
- s/^# //
- s/^# *$//
- s/\$progname/'$progname'/
- p
- }' < "$progpath"
- echo
- $ECHO "run \`$progname --help | more' for full usage"
- exit $?
-}
-
-# func_help [NOEXIT]
-# Echo long help message to standard output and exit,
-# unless 'noexit' is passed as argument.
-func_help ()
-{
- $opt_debug
-
- $SED -n '/^# Usage:/,/# Report bugs to/ {
- :print
- s/^# //
- s/^# *$//
- s*\$progname*'$progname'*
- s*\$host*'"$host"'*
- s*\$SHELL*'"$SHELL"'*
- s*\$LTCC*'"$LTCC"'*
- s*\$LTCFLAGS*'"$LTCFLAGS"'*
- s*\$LD*'"$LD"'*
- s/\$with_gnu_ld/'"$with_gnu_ld"'/
- s/\$automake_version/'"`(${AUTOMAKE-automake} --version) 2>/dev/null |$SED 1q`"'/
- s/\$autoconf_version/'"`(${AUTOCONF-autoconf} --version) 2>/dev/null |$SED 1q`"'/
- p
- d
- }
- /^# .* home page:/b print
- /^# General help using/b print
- ' < "$progpath"
- ret=$?
- if test -z "$1"; then
- exit $ret
- fi
-}
-
-# func_missing_arg argname
-# Echo program name prefixed message to standard error and set global
-# exit_cmd.
-func_missing_arg ()
-{
- $opt_debug
-
- func_error "missing argument for $1."
- exit_cmd=exit
-}
-
-
-# func_split_short_opt shortopt
-# Set func_split_short_opt_name and func_split_short_opt_arg shell
-# variables after splitting SHORTOPT after the 2nd character.
-func_split_short_opt ()
-{
- my_sed_short_opt='1s/^\(..\).*$/\1/;q'
- my_sed_short_rest='1s/^..\(.*\)$/\1/;q'
-
- func_split_short_opt_name=`$ECHO "$1" | $SED "$my_sed_short_opt"`
- func_split_short_opt_arg=`$ECHO "$1" | $SED "$my_sed_short_rest"`
-} # func_split_short_opt may be replaced by extended shell implementation
-
-
-# func_split_long_opt longopt
-# Set func_split_long_opt_name and func_split_long_opt_arg shell
-# variables after splitting LONGOPT at the `=' sign.
-func_split_long_opt ()
-{
- my_sed_long_opt='1s/^\(--[^=]*\)=.*/\1/;q'
- my_sed_long_arg='1s/^--[^=]*=//'
-
- func_split_long_opt_name=`$ECHO "$1" | $SED "$my_sed_long_opt"`
- func_split_long_opt_arg=`$ECHO "$1" | $SED "$my_sed_long_arg"`
-} # func_split_long_opt may be replaced by extended shell implementation
-
-exit_cmd=:
-
-
-
-
-
-magic="%%%MAGIC variable%%%"
-magic_exe="%%%MAGIC EXE variable%%%"
-
-# Global variables.
-nonopt=
-preserve_args=
-lo2o="s/\\.lo\$/.${objext}/"
-o2lo="s/\\.${objext}\$/.lo/"
-extracted_archives=
-extracted_serial=0
-
-# If this variable is set in any of the actions, the command in it
-# will be execed at the end. This prevents here-documents from being
-# left over by shells.
-exec_cmd=
-
-# func_append var value
-# Append VALUE to the end of shell variable VAR.
-func_append ()
-{
- eval "${1}=\$${1}\${2}"
-} # func_append may be replaced by extended shell implementation
-
-# func_append_quoted var value
-# Quote VALUE and append to the end of shell variable VAR, separated
-# by a space.
-func_append_quoted ()
-{
- func_quote_for_eval "${2}"
- eval "${1}=\$${1}\\ \$func_quote_for_eval_result"
-} # func_append_quoted may be replaced by extended shell implementation
-
-
-# func_arith arithmetic-term...
-func_arith ()
-{
- func_arith_result=`expr "${@}"`
-} # func_arith may be replaced by extended shell implementation
-
-
-# func_len string
-# STRING may not start with a hyphen.
-func_len ()
-{
- func_len_result=`expr "${1}" : ".*" 2>/dev/null || echo $max_cmd_len`
-} # func_len may be replaced by extended shell implementation
-
-
-# func_lo2o object
-func_lo2o ()
-{
- func_lo2o_result=`$ECHO "${1}" | $SED "$lo2o"`
-} # func_lo2o may be replaced by extended shell implementation
-
-
-# func_xform libobj-or-source
-func_xform ()
-{
- func_xform_result=`$ECHO "${1}" | $SED 's/\.[^.]*$/.lo/'`
-} # func_xform may be replaced by extended shell implementation
-
-
-# func_fatal_configuration arg...
-# Echo program name prefixed message to standard error, followed by
-# a configuration failure hint, and exit.
-func_fatal_configuration ()
-{
- func_error ${1+"$@"}
- func_error "See the $PACKAGE documentation for more information."
- func_fatal_error "Fatal configuration error."
-}
-
-
-# func_config
-# Display the configuration for all the tags in this script.
-func_config ()
-{
- re_begincf='^# ### BEGIN LIBTOOL'
- re_endcf='^# ### END LIBTOOL'
-
- # Default configuration.
- $SED "1,/$re_begincf CONFIG/d;/$re_endcf CONFIG/,\$d" < "$progpath"
-
- # Now print the configurations for the tags.
- for tagname in $taglist; do
- $SED -n "/$re_begincf TAG CONFIG: $tagname\$/,/$re_endcf TAG CONFIG: $tagname\$/p" < "$progpath"
- done
-
- exit $?
-}
-
-# func_features
-# Display the features supported by this script.
-func_features ()
-{
- echo "host: $host"
- if test "$build_libtool_libs" = yes; then
- echo "enable shared libraries"
- else
- echo "disable shared libraries"
- fi
- if test "$build_old_libs" = yes; then
- echo "enable static libraries"
- else
- echo "disable static libraries"
- fi
-
- exit $?
-}
-
-# func_enable_tag tagname
-# Verify that TAGNAME is valid, and either flag an error and exit, or
-# enable the TAGNAME tag. We also add TAGNAME to the global $taglist
-# variable here.
-func_enable_tag ()
-{
- # Global variable:
- tagname="$1"
-
- re_begincf="^# ### BEGIN LIBTOOL TAG CONFIG: $tagname\$"
- re_endcf="^# ### END LIBTOOL TAG CONFIG: $tagname\$"
- sed_extractcf="/$re_begincf/,/$re_endcf/p"
-
- # Validate tagname.
- case $tagname in
- *[!-_A-Za-z0-9,/]*)
- func_fatal_error "invalid tag name: $tagname"
- ;;
- esac
-
- # Don't test for the "default" C tag, as we know it's
- # there but not specially marked.
- case $tagname in
- CC) ;;
- *)
- if $GREP "$re_begincf" "$progpath" >/dev/null 2>&1; then
- taglist="$taglist $tagname"
-
- # Evaluate the configuration. Be careful to quote the path
- # and the sed script, to avoid splitting on whitespace, but
- # also don't use non-portable quotes within backquotes within
- # quotes we have to do it in 2 steps:
- extractedcf=`$SED -n -e "$sed_extractcf" < "$progpath"`
- eval "$extractedcf"
- else
- func_error "ignoring unknown tag $tagname"
- fi
- ;;
- esac
-}
-
-# func_check_version_match
-# Ensure that we are using m4 macros, and libtool script from the same
-# release of libtool.
-func_check_version_match ()
-{
- if test "$package_revision" != "$macro_revision"; then
- if test "$VERSION" != "$macro_version"; then
- if test -z "$macro_version"; then
- cat >&2 <<_LT_EOF
-$progname: Version mismatch error. This is $PACKAGE $VERSION, but the
-$progname: definition of this LT_INIT comes from an older release.
-$progname: You should recreate aclocal.m4 with macros from $PACKAGE $VERSION
-$progname: and run autoconf again.
-_LT_EOF
- else
- cat >&2 <<_LT_EOF
-$progname: Version mismatch error. This is $PACKAGE $VERSION, but the
-$progname: definition of this LT_INIT comes from $PACKAGE $macro_version.
-$progname: You should recreate aclocal.m4 with macros from $PACKAGE $VERSION
-$progname: and run autoconf again.
-_LT_EOF
- fi
- else
- cat >&2 <<_LT_EOF
-$progname: Version mismatch error. This is $PACKAGE $VERSION, revision $package_revision,
-$progname: but the definition of this LT_INIT comes from revision $macro_revision.
-$progname: You should recreate aclocal.m4 with macros from revision $package_revision
-$progname: of $PACKAGE $VERSION and run autoconf again.
-_LT_EOF
- fi
-
- exit $EXIT_MISMATCH
- fi
-}
-
-
-# Shorthand for --mode=foo, only valid as the first argument
-case $1 in
-clean|clea|cle|cl)
- shift; set dummy --mode clean ${1+"$@"}; shift
- ;;
-compile|compil|compi|comp|com|co|c)
- shift; set dummy --mode compile ${1+"$@"}; shift
- ;;
-execute|execut|execu|exec|exe|ex|e)
- shift; set dummy --mode execute ${1+"$@"}; shift
- ;;
-finish|finis|fini|fin|fi|f)
- shift; set dummy --mode finish ${1+"$@"}; shift
- ;;
-install|instal|insta|inst|ins|in|i)
- shift; set dummy --mode install ${1+"$@"}; shift
- ;;
-link|lin|li|l)
- shift; set dummy --mode link ${1+"$@"}; shift
- ;;
-uninstall|uninstal|uninsta|uninst|unins|unin|uni|un|u)
- shift; set dummy --mode uninstall ${1+"$@"}; shift
- ;;
-esac
-
-
-
-# Option defaults:
-opt_debug=:
-opt_dry_run=false
-opt_config=false
-opt_preserve_dup_deps=false
-opt_features=false
-opt_finish=false
-opt_help=false
-opt_help_all=false
-opt_silent=:
-opt_warning=:
-opt_verbose=:
-opt_silent=false
-opt_verbose=false
-
-
-# Parse options once, thoroughly. This comes as soon as possible in the
-# script to make things like `--version' happen as quickly as we can.
-{
- # this just eases exit handling
- while test $# -gt 0; do
- opt="$1"
- shift
- case $opt in
- --debug|-x) opt_debug='set -x'
- func_echo "enabling shell trace mode"
- $opt_debug
- ;;
- --dry-run|--dryrun|-n)
- opt_dry_run=:
- ;;
- --config)
- opt_config=:
-func_config
- ;;
- --dlopen|-dlopen)
- optarg="$1"
- opt_dlopen="${opt_dlopen+$opt_dlopen
-}$optarg"
- shift
- ;;
- --preserve-dup-deps)
- opt_preserve_dup_deps=:
- ;;
- --features)
- opt_features=:
-func_features
- ;;
- --finish)
- opt_finish=:
-set dummy --mode finish ${1+"$@"}; shift
- ;;
- --help)
- opt_help=:
- ;;
- --help-all)
- opt_help_all=:
-opt_help=': help-all'
- ;;
- --mode)
- test $# = 0 && func_missing_arg $opt && break
- optarg="$1"
- opt_mode="$optarg"
-case $optarg in
- # Valid mode arguments:
- clean|compile|execute|finish|install|link|relink|uninstall) ;;
-
- # Catch anything else as an error
- *) func_error "invalid argument for $opt"
- exit_cmd=exit
- break
- ;;
-esac
- shift
- ;;
- --no-silent|--no-quiet)
- opt_silent=false
-func_append preserve_args " $opt"
- ;;
- --no-warning|--no-warn)
- opt_warning=false
-func_append preserve_args " $opt"
- ;;
- --no-verbose)
- opt_verbose=false
-func_append preserve_args " $opt"
- ;;
- --silent|--quiet)
- opt_silent=:
-func_append preserve_args " $opt"
- opt_verbose=false
- ;;
- --verbose|-v)
- opt_verbose=:
-func_append preserve_args " $opt"
-opt_silent=false
- ;;
- --tag)
- test $# = 0 && func_missing_arg $opt && break
- optarg="$1"
- opt_tag="$optarg"
-func_append preserve_args " $opt $optarg"
-func_enable_tag "$optarg"
- shift
- ;;
-
- -\?|-h) func_usage ;;
- --help) func_help ;;
- --version) func_version ;;
-
- # Separate optargs to long options:
- --*=*)
- func_split_long_opt "$opt"
- set dummy "$func_split_long_opt_name" "$func_split_long_opt_arg" ${1+"$@"}
- shift
- ;;
-
- # Separate non-argument short options:
- -\?*|-h*|-n*|-v*)
- func_split_short_opt "$opt"
- set dummy "$func_split_short_opt_name" "-$func_split_short_opt_arg" ${1+"$@"}
- shift
- ;;
-
- --) break ;;
- -*) func_fatal_help "unrecognized option \`$opt'" ;;
- *) set dummy "$opt" ${1+"$@"}; shift; break ;;
- esac
- done
-
- # Validate options:
-
- # save first non-option argument
- if test "$#" -gt 0; then
- nonopt="$opt"
- shift
- fi
-
- # preserve --debug
- test "$opt_debug" = : || func_append preserve_args " --debug"
-
- case $host in
- *cygwin* | *mingw* | *pw32* | *cegcc*)
- # don't eliminate duplications in $postdeps and $predeps
- opt_duplicate_compiler_generated_deps=:
- ;;
- *)
- opt_duplicate_compiler_generated_deps=$opt_preserve_dup_deps
- ;;
- esac
-
- $opt_help || {
- # Sanity checks first:
- func_check_version_match
-
- if test "$build_libtool_libs" != yes && test "$build_old_libs" != yes; then
- func_fatal_configuration "not configured to build any kind of library"
- fi
-
- # Darwin sucks
- eval std_shrext=\"$shrext_cmds\"
-
- # Only execute mode is allowed to have -dlopen flags.
- if test -n "$opt_dlopen" && test "$opt_mode" != execute; then
- func_error "unrecognized option \`-dlopen'"
- $ECHO "$help" 1>&2
- exit $EXIT_FAILURE
- fi
-
- # Change the help message to a mode-specific one.
- generic_help="$help"
- help="Try \`$progname --help --mode=$opt_mode' for more information."
- }
-
-
- # Bail if the options were screwed
- $exit_cmd $EXIT_FAILURE
-}
-
-
-
-
-## ----------- ##
-## Main. ##
-## ----------- ##
-
-# func_lalib_p file
-# True iff FILE is a libtool `.la' library or `.lo' object file.
-# This function is only a basic sanity check; it will hardly flush out
-# determined imposters.
-func_lalib_p ()
-{
- test -f "$1" &&
- $SED -e 4q "$1" 2>/dev/null \
- | $GREP "^# Generated by .*$PACKAGE" > /dev/null 2>&1
-}
-
-# func_lalib_unsafe_p file
-# True iff FILE is a libtool `.la' library or `.lo' object file.
-# This function implements the same check as func_lalib_p without
-# resorting to external programs. To this end, it redirects stdin and
-# closes it afterwards, without saving the original file descriptor.
-# As a safety measure, use it only where a negative result would be
-# fatal anyway. Works if `file' does not exist.
-func_lalib_unsafe_p ()
-{
- lalib_p=no
- if test -f "$1" && test -r "$1" && exec 5<&0 <"$1"; then
- for lalib_p_l in 1 2 3 4
- do
- read lalib_p_line
- case "$lalib_p_line" in
- \#\ Generated\ by\ *$PACKAGE* ) lalib_p=yes; break;;
- esac
- done
- exec 0<&5 5<&-
- fi
- test "$lalib_p" = yes
-}
-
-# func_ltwrapper_script_p file
-# True iff FILE is a libtool wrapper script
-# This function is only a basic sanity check; it will hardly flush out
-# determined imposters.
-func_ltwrapper_script_p ()
-{
- func_lalib_p "$1"
-}
-
-# func_ltwrapper_executable_p file
-# True iff FILE is a libtool wrapper executable
-# This function is only a basic sanity check; it will hardly flush out
-# determined imposters.
-func_ltwrapper_executable_p ()
-{
- func_ltwrapper_exec_suffix=
- case $1 in
- *.exe) ;;
- *) func_ltwrapper_exec_suffix=.exe ;;
- esac
- $GREP "$magic_exe" "$1$func_ltwrapper_exec_suffix" >/dev/null 2>&1
-}
-
-# func_ltwrapper_scriptname file
-# Assumes file is an ltwrapper_executable
-# uses $file to determine the appropriate filename for a
-# temporary ltwrapper_script.
-func_ltwrapper_scriptname ()
-{
- func_dirname_and_basename "$1" "" "."
- func_stripname '' '.exe' "$func_basename_result"
- func_ltwrapper_scriptname_result="$func_dirname_result/$objdir/${func_stripname_result}_ltshwrapper"
-}
-
-# func_ltwrapper_p file
-# True iff FILE is a libtool wrapper script or wrapper executable
-# This function is only a basic sanity check; it will hardly flush out
-# determined imposters.
-func_ltwrapper_p ()
-{
- func_ltwrapper_script_p "$1" || func_ltwrapper_executable_p "$1"
-}
-
-
-# func_execute_cmds commands fail_cmd
-# Execute tilde-delimited COMMANDS.
-# If FAIL_CMD is given, eval that upon failure.
-# FAIL_CMD may read-access the current command in variable CMD!
-func_execute_cmds ()
-{
- $opt_debug
- save_ifs=$IFS; IFS='~'
- for cmd in $1; do
- IFS=$save_ifs
- eval cmd=\"$cmd\"
- func_show_eval "$cmd" "${2-:}"
- done
- IFS=$save_ifs
-}
-
-
-# func_source file
-# Source FILE, adding directory component if necessary.
-# Note that it is not necessary on cygwin/mingw to append a dot to
-# FILE even if both FILE and FILE.exe exist: automatic-append-.exe
-# behavior happens only for exec(3), not for open(2)! Also, sourcing
-# `FILE.' does not work on cygwin managed mounts.
-func_source ()
-{
- $opt_debug
- case $1 in
- */* | *\\*) . "$1" ;;
- *) . "./$1" ;;
- esac
-}
-
-
-# func_resolve_sysroot PATH
-# Replace a leading = in PATH with a sysroot. Store the result into
-# func_resolve_sysroot_result
-func_resolve_sysroot ()
-{
- func_resolve_sysroot_result=$1
- case $func_resolve_sysroot_result in
- =*)
- func_stripname '=' '' "$func_resolve_sysroot_result"
- func_resolve_sysroot_result=$lt_sysroot$func_stripname_result
- ;;
- esac
-}
-
-# func_replace_sysroot PATH
-# If PATH begins with the sysroot, replace it with = and
-# store the result into func_replace_sysroot_result.
-func_replace_sysroot ()
-{
- case "$lt_sysroot:$1" in
- ?*:"$lt_sysroot"*)
- func_stripname "$lt_sysroot" '' "$1"
- func_replace_sysroot_result="=$func_stripname_result"
- ;;
- *)
- # Including no sysroot.
- func_replace_sysroot_result=$1
- ;;
- esac
-}
-
-# func_infer_tag arg
-# Infer tagged configuration to use if any are available and
-# if one wasn't chosen via the "--tag" command line option.
-# Only attempt this if the compiler in the base compile
-# command doesn't match the default compiler.
-# arg is usually of the form 'gcc ...'
-func_infer_tag ()
-{
- $opt_debug
- if test -n "$available_tags" && test -z "$tagname"; then
- CC_quoted=
- for arg in $CC; do
- func_append_quoted CC_quoted "$arg"
- done
- CC_expanded=`func_echo_all $CC`
- CC_quoted_expanded=`func_echo_all $CC_quoted`
- case $@ in
- # Blanks in the command may have been stripped by the calling shell,
- # but not from the CC environment variable when configure was run.
- " $CC "* | "$CC "* | " $CC_expanded "* | "$CC_expanded "* | \
- " $CC_quoted"* | "$CC_quoted "* | " $CC_quoted_expanded "* | "$CC_quoted_expanded "*) ;;
- # Blanks at the start of $base_compile will cause this to fail
- # if we don't check for them as well.
- *)
- for z in $available_tags; do
- if $GREP "^# ### BEGIN LIBTOOL TAG CONFIG: $z$" < "$progpath" > /dev/null; then
- # Evaluate the configuration.
- eval "`${SED} -n -e '/^# ### BEGIN LIBTOOL TAG CONFIG: '$z'$/,/^# ### END LIBTOOL TAG CONFIG: '$z'$/p' < $progpath`"
- CC_quoted=
- for arg in $CC; do
- # Double-quote args containing other shell metacharacters.
- func_append_quoted CC_quoted "$arg"
- done
- CC_expanded=`func_echo_all $CC`
- CC_quoted_expanded=`func_echo_all $CC_quoted`
- case "$@ " in
- " $CC "* | "$CC "* | " $CC_expanded "* | "$CC_expanded "* | \
- " $CC_quoted"* | "$CC_quoted "* | " $CC_quoted_expanded "* | "$CC_quoted_expanded "*)
- # The compiler in the base compile command matches
- # the one in the tagged configuration.
- # Assume this is the tagged configuration we want.
- tagname=$z
- break
- ;;
- esac
- fi
- done
- # If $tagname still isn't set, then no tagged configuration
- # was found and let the user know that the "--tag" command
- # line option must be used.
- if test -z "$tagname"; then
- func_echo "unable to infer tagged configuration"
- func_fatal_error "specify a tag with \`--tag'"
-# else
-# func_verbose "using $tagname tagged configuration"
- fi
- ;;
- esac
- fi
-}
-
-
-
-# func_write_libtool_object output_name pic_name nonpic_name
-# Create a libtool object file (analogous to a ".la" file),
-# but don't create it if we're doing a dry run.
-func_write_libtool_object ()
-{
- write_libobj=${1}
- if test "$build_libtool_libs" = yes; then
- write_lobj=\'${2}\'
- else
- write_lobj=none
- fi
-
- if test "$build_old_libs" = yes; then
- write_oldobj=\'${3}\'
- else
- write_oldobj=none
- fi
-
- $opt_dry_run || {
- cat >${write_libobj}T <<EOF
-# $write_libobj - a libtool object file
-# Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION
-#
-# Please DO NOT delete this file!
-# It is necessary for linking the library.
-
-# Name of the PIC object.
-pic_object=$write_lobj
-
-# Name of the non-PIC object
-non_pic_object=$write_oldobj
-
-EOF
- $MV "${write_libobj}T" "${write_libobj}"
- }
-}
-
-
-##################################################
-# FILE NAME AND PATH CONVERSION HELPER FUNCTIONS #
-##################################################
-
-# func_convert_core_file_wine_to_w32 ARG
-# Helper function used by file name conversion functions when $build is *nix,
-# and $host is mingw, cygwin, or some other w32 environment. Relies on a
-# correctly configured wine environment available, with the winepath program
-# in $build's $PATH.
-#
-# ARG is the $build file name to be converted to w32 format.
-# Result is available in $func_convert_core_file_wine_to_w32_result, and will
-# be empty on error (or when ARG is empty)
-func_convert_core_file_wine_to_w32 ()
-{
- $opt_debug
- func_convert_core_file_wine_to_w32_result="$1"
- if test -n "$1"; then
- # Unfortunately, winepath does not exit with a non-zero error code, so we
- # are forced to check the contents of stdout. On the other hand, if the
- # command is not found, the shell will set an exit code of 127 and print
- # *an error message* to stdout. So we must check for both error code of
- # zero AND non-empty stdout, which explains the odd construction:
- func_convert_core_file_wine_to_w32_tmp=`winepath -w "$1" 2>/dev/null`
- if test "$?" -eq 0 && test -n "${func_convert_core_file_wine_to_w32_tmp}"; then
- func_convert_core_file_wine_to_w32_result=`$ECHO "$func_convert_core_file_wine_to_w32_tmp" |
- $SED -e "$lt_sed_naive_backslashify"`
- else
- func_convert_core_file_wine_to_w32_result=
- fi
- fi
-}
-# end: func_convert_core_file_wine_to_w32
-
-
-# func_convert_core_path_wine_to_w32 ARG
-# Helper function used by path conversion functions when $build is *nix, and
-# $host is mingw, cygwin, or some other w32 environment. Relies on a correctly
-# configured wine environment available, with the winepath program in $build's
-# $PATH. Assumes ARG has no leading or trailing path separator characters.
-#
-# ARG is path to be converted from $build format to win32.
-# Result is available in $func_convert_core_path_wine_to_w32_result.
-# Unconvertible file (directory) names in ARG are skipped; if no directory names
-# are convertible, then the result may be empty.
-func_convert_core_path_wine_to_w32 ()
-{
- $opt_debug
- # unfortunately, winepath doesn't convert paths, only file names
- func_convert_core_path_wine_to_w32_result=""
- if test -n "$1"; then
- oldIFS=$IFS
- IFS=:
- for func_convert_core_path_wine_to_w32_f in $1; do
- IFS=$oldIFS
- func_convert_core_file_wine_to_w32 "$func_convert_core_path_wine_to_w32_f"
- if test -n "$func_convert_core_file_wine_to_w32_result" ; then
- if test -z "$func_convert_core_path_wine_to_w32_result"; then
- func_convert_core_path_wine_to_w32_result="$func_convert_core_file_wine_to_w32_result"
- else
- func_append func_convert_core_path_wine_to_w32_result ";$func_convert_core_file_wine_to_w32_result"
- fi
- fi
- done
- IFS=$oldIFS
- fi
-}
-# end: func_convert_core_path_wine_to_w32
-
-
-# func_cygpath ARGS...
-# Wrapper around calling the cygpath program via LT_CYGPATH. This is used when
-# when (1) $build is *nix and Cygwin is hosted via a wine environment; or (2)
-# $build is MSYS and $host is Cygwin, or (3) $build is Cygwin. In case (1) or
-# (2), returns the Cygwin file name or path in func_cygpath_result (input
-# file name or path is assumed to be in w32 format, as previously converted
-# from $build's *nix or MSYS format). In case (3), returns the w32 file name
-# or path in func_cygpath_result (input file name or path is assumed to be in
-# Cygwin format). Returns an empty string on error.
-#
-# ARGS are passed to cygpath, with the last one being the file name or path to
-# be converted.
-#
-# Specify the absolute *nix (or w32) name to cygpath in the LT_CYGPATH
-# environment variable; do not put it in $PATH.
-func_cygpath ()
-{
- $opt_debug
- if test -n "$LT_CYGPATH" && test -f "$LT_CYGPATH"; then
- func_cygpath_result=`$LT_CYGPATH "$@" 2>/dev/null`
- if test "$?" -ne 0; then
- # on failure, ensure result is empty
- func_cygpath_result=
- fi
- else
- func_cygpath_result=
- func_error "LT_CYGPATH is empty or specifies non-existent file: \`$LT_CYGPATH'"
- fi
-}
-#end: func_cygpath
-
-
-# func_convert_core_msys_to_w32 ARG
-# Convert file name or path ARG from MSYS format to w32 format. Return
-# result in func_convert_core_msys_to_w32_result.
-func_convert_core_msys_to_w32 ()
-{
- $opt_debug
- # awkward: cmd appends spaces to result
- func_convert_core_msys_to_w32_result=`( cmd //c echo "$1" ) 2>/dev/null |
- $SED -e 's/[ ]*$//' -e "$lt_sed_naive_backslashify"`
-}
-#end: func_convert_core_msys_to_w32
-
-
-# func_convert_file_check ARG1 ARG2
-# Verify that ARG1 (a file name in $build format) was converted to $host
-# format in ARG2. Otherwise, emit an error message, but continue (resetting
-# func_to_host_file_result to ARG1).
-func_convert_file_check ()
-{
- $opt_debug
- if test -z "$2" && test -n "$1" ; then
- func_error "Could not determine host file name corresponding to"
- func_error " \`$1'"
- func_error "Continuing, but uninstalled executables may not work."
- # Fallback:
- func_to_host_file_result="$1"
- fi
-}
-# end func_convert_file_check
-
-
-# func_convert_path_check FROM_PATHSEP TO_PATHSEP FROM_PATH TO_PATH
-# Verify that FROM_PATH (a path in $build format) was converted to $host
-# format in TO_PATH. Otherwise, emit an error message, but continue, resetting
-# func_to_host_file_result to a simplistic fallback value (see below).
-func_convert_path_check ()
-{
- $opt_debug
- if test -z "$4" && test -n "$3"; then
- func_error "Could not determine the host path corresponding to"
- func_error " \`$3'"
- func_error "Continuing, but uninstalled executables may not work."
- # Fallback. This is a deliberately simplistic "conversion" and
- # should not be "improved". See libtool.info.
- if test "x$1" != "x$2"; then
- lt_replace_pathsep_chars="s|$1|$2|g"
- func_to_host_path_result=`echo "$3" |
- $SED -e "$lt_replace_pathsep_chars"`
- else
- func_to_host_path_result="$3"
- fi
- fi
-}
-# end func_convert_path_check
-
-
-# func_convert_path_front_back_pathsep FRONTPAT BACKPAT REPL ORIG
-# Modifies func_to_host_path_result by prepending REPL if ORIG matches FRONTPAT
-# and appending REPL if ORIG matches BACKPAT.
-func_convert_path_front_back_pathsep ()
-{
- $opt_debug
- case $4 in
- $1 ) func_to_host_path_result="$3$func_to_host_path_result"
- ;;
- esac
- case $4 in
- $2 ) func_append func_to_host_path_result "$3"
- ;;
- esac
-}
-# end func_convert_path_front_back_pathsep
-
-
-##################################################
-# $build to $host FILE NAME CONVERSION FUNCTIONS #
-##################################################
-# invoked via `$to_host_file_cmd ARG'
-#
-# In each case, ARG is the path to be converted from $build to $host format.
-# Result will be available in $func_to_host_file_result.
-
-
-# func_to_host_file ARG
-# Converts the file name ARG from $build format to $host format. Return result
-# in func_to_host_file_result.
-func_to_host_file ()
-{
- $opt_debug
- $to_host_file_cmd "$1"
-}
-# end func_to_host_file
-
-
-# func_to_tool_file ARG LAZY
-# converts the file name ARG from $build format to toolchain format. Return
-# result in func_to_tool_file_result. If the conversion in use is listed
-# in (the comma separated) LAZY, no conversion takes place.
-func_to_tool_file ()
-{
- $opt_debug
- case ,$2, in
- *,"$to_tool_file_cmd",*)
- func_to_tool_file_result=$1
- ;;
- *)
- $to_tool_file_cmd "$1"
- func_to_tool_file_result=$func_to_host_file_result
- ;;
- esac
-}
-# end func_to_tool_file
-
-
-# func_convert_file_noop ARG
-# Copy ARG to func_to_host_file_result.
-func_convert_file_noop ()
-{
- func_to_host_file_result="$1"
-}
-# end func_convert_file_noop
-
-
-# func_convert_file_msys_to_w32 ARG
-# Convert file name ARG from (mingw) MSYS to (mingw) w32 format; automatic
-# conversion to w32 is not available inside the cwrapper. Returns result in
-# func_to_host_file_result.
-func_convert_file_msys_to_w32 ()
-{
- $opt_debug
- func_to_host_file_result="$1"
- if test -n "$1"; then
- func_convert_core_msys_to_w32 "$1"
- func_to_host_file_result="$func_convert_core_msys_to_w32_result"
- fi
- func_convert_file_check "$1" "$func_to_host_file_result"
-}
-# end func_convert_file_msys_to_w32
-
-
-# func_convert_file_cygwin_to_w32 ARG
-# Convert file name ARG from Cygwin to w32 format. Returns result in
-# func_to_host_file_result.
-func_convert_file_cygwin_to_w32 ()
-{
- $opt_debug
- func_to_host_file_result="$1"
- if test -n "$1"; then
- # because $build is cygwin, we call "the" cygpath in $PATH; no need to use
- # LT_CYGPATH in this case.
- func_to_host_file_result=`cygpath -m "$1"`
- fi
- func_convert_file_check "$1" "$func_to_host_file_result"
-}
-# end func_convert_file_cygwin_to_w32
-
-
-# func_convert_file_nix_to_w32 ARG
-# Convert file name ARG from *nix to w32 format. Requires a wine environment
-# and a working winepath. Returns result in func_to_host_file_result.
-func_convert_file_nix_to_w32 ()
-{
- $opt_debug
- func_to_host_file_result="$1"
- if test -n "$1"; then
- func_convert_core_file_wine_to_w32 "$1"
- func_to_host_file_result="$func_convert_core_file_wine_to_w32_result"
- fi
- func_convert_file_check "$1" "$func_to_host_file_result"
-}
-# end func_convert_file_nix_to_w32
-
-
-# func_convert_file_msys_to_cygwin ARG
-# Convert file name ARG from MSYS to Cygwin format. Requires LT_CYGPATH set.
-# Returns result in func_to_host_file_result.
-func_convert_file_msys_to_cygwin ()
-{
- $opt_debug
- func_to_host_file_result="$1"
- if test -n "$1"; then
- func_convert_core_msys_to_w32 "$1"
- func_cygpath -u "$func_convert_core_msys_to_w32_result"
- func_to_host_file_result="$func_cygpath_result"
- fi
- func_convert_file_check "$1" "$func_to_host_file_result"
-}
-# end func_convert_file_msys_to_cygwin
-
-
-# func_convert_file_nix_to_cygwin ARG
-# Convert file name ARG from *nix to Cygwin format. Requires Cygwin installed
-# in a wine environment, working winepath, and LT_CYGPATH set. Returns result
-# in func_to_host_file_result.
-func_convert_file_nix_to_cygwin ()
-{
- $opt_debug
- func_to_host_file_result="$1"
- if test -n "$1"; then
- # convert from *nix to w32, then use cygpath to convert from w32 to cygwin.
- func_convert_core_file_wine_to_w32 "$1"
- func_cygpath -u "$func_convert_core_file_wine_to_w32_result"
- func_to_host_file_result="$func_cygpath_result"
- fi
- func_convert_file_check "$1" "$func_to_host_file_result"
-}
-# end func_convert_file_nix_to_cygwin
-
-
-#############################################
-# $build to $host PATH CONVERSION FUNCTIONS #
-#############################################
-# invoked via `$to_host_path_cmd ARG'
-#
-# In each case, ARG is the path to be converted from $build to $host format.
-# The result will be available in $func_to_host_path_result.
-#
-# Path separators are also converted from $build format to $host format. If
-# ARG begins or ends with a path separator character, it is preserved (but
-# converted to $host format) on output.
-#
-# All path conversion functions are named using the following convention:
-# file name conversion function : func_convert_file_X_to_Y ()
-# path conversion function : func_convert_path_X_to_Y ()
-# where, for any given $build/$host combination the 'X_to_Y' value is the
-# same. If conversion functions are added for new $build/$host combinations,
-# the two new functions must follow this pattern, or func_init_to_host_path_cmd
-# will break.
-
-
-# func_init_to_host_path_cmd
-# Ensures that function "pointer" variable $to_host_path_cmd is set to the
-# appropriate value, based on the value of $to_host_file_cmd.
-to_host_path_cmd=
-func_init_to_host_path_cmd ()
-{
- $opt_debug
- if test -z "$to_host_path_cmd"; then
- func_stripname 'func_convert_file_' '' "$to_host_file_cmd"
- to_host_path_cmd="func_convert_path_${func_stripname_result}"
- fi
-}
-
-
-# func_to_host_path ARG
-# Converts the path ARG from $build format to $host format. Return result
-# in func_to_host_path_result.
-func_to_host_path ()
-{
- $opt_debug
- func_init_to_host_path_cmd
- $to_host_path_cmd "$1"
-}
-# end func_to_host_path
-
-
-# func_convert_path_noop ARG
-# Copy ARG to func_to_host_path_result.
-func_convert_path_noop ()
-{
- func_to_host_path_result="$1"
-}
-# end func_convert_path_noop
-
-
-# func_convert_path_msys_to_w32 ARG
-# Convert path ARG from (mingw) MSYS to (mingw) w32 format; automatic
-# conversion to w32 is not available inside the cwrapper. Returns result in
-# func_to_host_path_result.
-func_convert_path_msys_to_w32 ()
-{
- $opt_debug
- func_to_host_path_result="$1"
- if test -n "$1"; then
- # Remove leading and trailing path separator characters from ARG. MSYS
- # behavior is inconsistent here; cygpath turns them into '.;' and ';.';
- # and winepath ignores them completely.
- func_stripname : : "$1"
- func_to_host_path_tmp1=$func_stripname_result
- func_convert_core_msys_to_w32 "$func_to_host_path_tmp1"
- func_to_host_path_result="$func_convert_core_msys_to_w32_result"
- func_convert_path_check : ";" \
- "$func_to_host_path_tmp1" "$func_to_host_path_result"
- func_convert_path_front_back_pathsep ":*" "*:" ";" "$1"
- fi
-}
-# end func_convert_path_msys_to_w32
-
-
-# func_convert_path_cygwin_to_w32 ARG
-# Convert path ARG from Cygwin to w32 format. Returns result in
-# func_to_host_file_result.
-func_convert_path_cygwin_to_w32 ()
-{
- $opt_debug
- func_to_host_path_result="$1"
- if test -n "$1"; then
- # See func_convert_path_msys_to_w32:
- func_stripname : : "$1"
- func_to_host_path_tmp1=$func_stripname_result
- func_to_host_path_result=`cygpath -m -p "$func_to_host_path_tmp1"`
- func_convert_path_check : ";" \
- "$func_to_host_path_tmp1" "$func_to_host_path_result"
- func_convert_path_front_back_pathsep ":*" "*:" ";" "$1"
- fi
-}
-# end func_convert_path_cygwin_to_w32
-
-
-# func_convert_path_nix_to_w32 ARG
-# Convert path ARG from *nix to w32 format. Requires a wine environment and
-# a working winepath. Returns result in func_to_host_file_result.
-func_convert_path_nix_to_w32 ()
-{
- $opt_debug
- func_to_host_path_result="$1"
- if test -n "$1"; then
- # See func_convert_path_msys_to_w32:
- func_stripname : : "$1"
- func_to_host_path_tmp1=$func_stripname_result
- func_convert_core_path_wine_to_w32 "$func_to_host_path_tmp1"
- func_to_host_path_result="$func_convert_core_path_wine_to_w32_result"
- func_convert_path_check : ";" \
- "$func_to_host_path_tmp1" "$func_to_host_path_result"
- func_convert_path_front_back_pathsep ":*" "*:" ";" "$1"
- fi
-}
-# end func_convert_path_nix_to_w32
-
-
-# func_convert_path_msys_to_cygwin ARG
-# Convert path ARG from MSYS to Cygwin format. Requires LT_CYGPATH set.
-# Returns result in func_to_host_file_result.
-func_convert_path_msys_to_cygwin ()
-{
- $opt_debug
- func_to_host_path_result="$1"
- if test -n "$1"; then
- # See func_convert_path_msys_to_w32:
- func_stripname : : "$1"
- func_to_host_path_tmp1=$func_stripname_result
- func_convert_core_msys_to_w32 "$func_to_host_path_tmp1"
- func_cygpath -u -p "$func_convert_core_msys_to_w32_result"
- func_to_host_path_result="$func_cygpath_result"
- func_convert_path_check : : \
- "$func_to_host_path_tmp1" "$func_to_host_path_result"
- func_convert_path_front_back_pathsep ":*" "*:" : "$1"
- fi
-}
-# end func_convert_path_msys_to_cygwin
-
-
-# func_convert_path_nix_to_cygwin ARG
-# Convert path ARG from *nix to Cygwin format. Requires Cygwin installed in a
-# a wine environment, working winepath, and LT_CYGPATH set. Returns result in
-# func_to_host_file_result.
-func_convert_path_nix_to_cygwin ()
-{
- $opt_debug
- func_to_host_path_result="$1"
- if test -n "$1"; then
- # Remove leading and trailing path separator characters from
- # ARG. msys behavior is inconsistent here, cygpath turns them
- # into '.;' and ';.', and winepath ignores them completely.
- func_stripname : : "$1"
- func_to_host_path_tmp1=$func_stripname_result
- func_convert_core_path_wine_to_w32 "$func_to_host_path_tmp1"
- func_cygpath -u -p "$func_convert_core_path_wine_to_w32_result"
- func_to_host_path_result="$func_cygpath_result"
- func_convert_path_check : : \
- "$func_to_host_path_tmp1" "$func_to_host_path_result"
- func_convert_path_front_back_pathsep ":*" "*:" : "$1"
- fi
-}
-# end func_convert_path_nix_to_cygwin
-
-
-# func_mode_compile arg...
-func_mode_compile ()
-{
- $opt_debug
- # Get the compilation command and the source file.
- base_compile=
- srcfile="$nonopt" # always keep a non-empty value in "srcfile"
- suppress_opt=yes
- suppress_output=
- arg_mode=normal
- libobj=
- later=
- pie_flag=
-
- for arg
- do
- case $arg_mode in
- arg )
- # do not "continue". Instead, add this to base_compile
- lastarg="$arg"
- arg_mode=normal
- ;;
-
- target )
- libobj="$arg"
- arg_mode=normal
- continue
- ;;
-
- normal )
- # Accept any command-line options.
- case $arg in
- -o)
- test -n "$libobj" && \
- func_fatal_error "you cannot specify \`-o' more than once"
- arg_mode=target
- continue
- ;;
-
- -pie | -fpie | -fPIE)
- func_append pie_flag " $arg"
- continue
- ;;
-
- -shared | -static | -prefer-pic | -prefer-non-pic)
- func_append later " $arg"
- continue
- ;;
-
- -no-suppress)
- suppress_opt=no
- continue
- ;;
-
- -Xcompiler)
- arg_mode=arg # the next one goes into the "base_compile" arg list
- continue # The current "srcfile" will either be retained or
- ;; # replaced later. I would guess that would be a bug.
-
- -Wc,*)
- func_stripname '-Wc,' '' "$arg"
- args=$func_stripname_result
- lastarg=
- save_ifs="$IFS"; IFS=','
- for arg in $args; do
- IFS="$save_ifs"
- func_append_quoted lastarg "$arg"
- done
- IFS="$save_ifs"
- func_stripname ' ' '' "$lastarg"
- lastarg=$func_stripname_result
-
- # Add the arguments to base_compile.
- func_append base_compile " $lastarg"
- continue
- ;;
-
- *)
- # Accept the current argument as the source file.
- # The previous "srcfile" becomes the current argument.
- #
- lastarg="$srcfile"
- srcfile="$arg"
- ;;
- esac # case $arg
- ;;
- esac # case $arg_mode
-
- # Aesthetically quote the previous argument.
- func_append_quoted base_compile "$lastarg"
- done # for arg
-
- case $arg_mode in
- arg)
- func_fatal_error "you must specify an argument for -Xcompile"
- ;;
- target)
- func_fatal_error "you must specify a target with \`-o'"
- ;;
- *)
- # Get the name of the library object.
- test -z "$libobj" && {
- func_basename "$srcfile"
- libobj="$func_basename_result"
- }
- ;;
- esac
-
- # Recognize several different file suffixes.
- # If the user specifies -o file.o, it is replaced with file.lo
- case $libobj in
- *.[cCFSifmso] | \
- *.ada | *.adb | *.ads | *.asm | \
- *.c++ | *.cc | *.ii | *.class | *.cpp | *.cxx | \
- *.[fF][09]? | *.for | *.java | *.go | *.obj | *.sx | *.cu | *.cup)
- func_xform "$libobj"
- libobj=$func_xform_result
- ;;
- esac
-
- case $libobj in
- *.lo) func_lo2o "$libobj"; obj=$func_lo2o_result ;;
- *)
- func_fatal_error "cannot determine name of library object from \`$libobj'"
- ;;
- esac
-
- func_infer_tag $base_compile
-
- for arg in $later; do
- case $arg in
- -shared)
- test "$build_libtool_libs" != yes && \
- func_fatal_configuration "can not build a shared library"
- build_old_libs=no
- continue
- ;;
-
- -static)
- build_libtool_libs=no
- build_old_libs=yes
- continue
- ;;
-
- -prefer-pic)
- pic_mode=yes
- continue
- ;;
-
- -prefer-non-pic)
- pic_mode=no
- continue
- ;;
- esac
- done
-
- func_quote_for_eval "$libobj"
- test "X$libobj" != "X$func_quote_for_eval_result" \
- && $ECHO "X$libobj" | $GREP '[]~#^*{};<>?"'"'"' &()|`$[]' \
- && func_warning "libobj name \`$libobj' may not contain shell special characters."
- func_dirname_and_basename "$obj" "/" ""
- objname="$func_basename_result"
- xdir="$func_dirname_result"
- lobj=${xdir}$objdir/$objname
-
- test -z "$base_compile" && \
- func_fatal_help "you must specify a compilation command"
-
- # Delete any leftover library objects.
- if test "$build_old_libs" = yes; then
- removelist="$obj $lobj $libobj ${libobj}T"
- else
- removelist="$lobj $libobj ${libobj}T"
- fi
-
- # On Cygwin there's no "real" PIC flag so we must build both object types
- case $host_os in
- cygwin* | mingw* | pw32* | os2* | cegcc*)
- pic_mode=default
- ;;
- esac
- if test "$pic_mode" = no && test "$deplibs_check_method" != pass_all; then
- # non-PIC code in shared libraries is not supported
- pic_mode=default
- fi
-
- # Calculate the filename of the output object if compiler does
- # not support -o with -c
- if test "$compiler_c_o" = no; then
- output_obj=`$ECHO "$srcfile" | $SED 's%^.*/%%; s%\.[^.]*$%%'`.${objext}
- lockfile="$output_obj.lock"
- else
- output_obj=
- need_locks=no
- lockfile=
- fi
-
- # Lock this critical section if it is needed
- # We use this script file to make the link, it avoids creating a new file
- if test "$need_locks" = yes; then
- until $opt_dry_run || ln "$progpath" "$lockfile" 2>/dev/null; do
- func_echo "Waiting for $lockfile to be removed"
- sleep 2
- done
- elif test "$need_locks" = warn; then
- if test -f "$lockfile"; then
- $ECHO "\
-*** ERROR, $lockfile exists and contains:
-`cat $lockfile 2>/dev/null`
-
-This indicates that another process is trying to use the same
-temporary object file, and libtool could not work around it because
-your compiler does not support \`-c' and \`-o' together. If you
-repeat this compilation, it may succeed, by chance, but you had better
-avoid parallel builds (make -j) in this platform, or get a better
-compiler."
-
- $opt_dry_run || $RM $removelist
- exit $EXIT_FAILURE
- fi
- func_append removelist " $output_obj"
- $ECHO "$srcfile" > "$lockfile"
- fi
-
- $opt_dry_run || $RM $removelist
- func_append removelist " $lockfile"
- trap '$opt_dry_run || $RM $removelist; exit $EXIT_FAILURE' 1 2 15
-
- func_to_tool_file "$srcfile" func_convert_file_msys_to_w32
- srcfile=$func_to_tool_file_result
- func_quote_for_eval "$srcfile"
- qsrcfile=$func_quote_for_eval_result
-
- # Only build a PIC object if we are building libtool libraries.
- if test "$build_libtool_libs" = yes; then
- # Without this assignment, base_compile gets emptied.
- fbsd_hideous_sh_bug=$base_compile
-
- if test "$pic_mode" != no; then
- command="$base_compile $qsrcfile $pic_flag"
- else
- # Don't build PIC code
- command="$base_compile $qsrcfile"
- fi
-
- func_mkdir_p "$xdir$objdir"
-
- if test -z "$output_obj"; then
- # Place PIC objects in $objdir
- func_append command " -o $lobj"
- fi
-
- func_show_eval_locale "$command" \
- 'test -n "$output_obj" && $RM $removelist; exit $EXIT_FAILURE'
-
- if test "$need_locks" = warn &&
- test "X`cat $lockfile 2>/dev/null`" != "X$srcfile"; then
- $ECHO "\
-*** ERROR, $lockfile contains:
-`cat $lockfile 2>/dev/null`
-
-but it should contain:
-$srcfile
-
-This indicates that another process is trying to use the same
-temporary object file, and libtool could not work around it because
-your compiler does not support \`-c' and \`-o' together. If you
-repeat this compilation, it may succeed, by chance, but you had better
-avoid parallel builds (make -j) in this platform, or get a better
-compiler."
-
- $opt_dry_run || $RM $removelist
- exit $EXIT_FAILURE
- fi
-
- # Just move the object if needed, then go on to compile the next one
- if test -n "$output_obj" && test "X$output_obj" != "X$lobj"; then
- func_show_eval '$MV "$output_obj" "$lobj"' \
- 'error=$?; $opt_dry_run || $RM $removelist; exit $error'
- fi
-
- # Allow error messages only from the first compilation.
- if test "$suppress_opt" = yes; then
- suppress_output=' >/dev/null 2>&1'
- fi
- fi
-
- # Only build a position-dependent object if we build old libraries.
- if test "$build_old_libs" = yes; then
- if test "$pic_mode" != yes; then
- # Don't build PIC code
- command="$base_compile $qsrcfile$pie_flag"
- else
- command="$base_compile $qsrcfile $pic_flag"
- fi
- if test "$compiler_c_o" = yes; then
- func_append command " -o $obj"
- fi
-
- # Suppress compiler output if we already did a PIC compilation.
- func_append command "$suppress_output"
- func_show_eval_locale "$command" \
- '$opt_dry_run || $RM $removelist; exit $EXIT_FAILURE'
-
- if test "$need_locks" = warn &&
- test "X`cat $lockfile 2>/dev/null`" != "X$srcfile"; then
- $ECHO "\
-*** ERROR, $lockfile contains:
-`cat $lockfile 2>/dev/null`
-
-but it should contain:
-$srcfile
-
-This indicates that another process is trying to use the same
-temporary object file, and libtool could not work around it because
-your compiler does not support \`-c' and \`-o' together. If you
-repeat this compilation, it may succeed, by chance, but you had better
-avoid parallel builds (make -j) in this platform, or get a better
-compiler."
-
- $opt_dry_run || $RM $removelist
- exit $EXIT_FAILURE
- fi
-
- # Just move the object if needed
- if test -n "$output_obj" && test "X$output_obj" != "X$obj"; then
- func_show_eval '$MV "$output_obj" "$obj"' \
- 'error=$?; $opt_dry_run || $RM $removelist; exit $error'
- fi
- fi
-
- $opt_dry_run || {
- func_write_libtool_object "$libobj" "$objdir/$objname" "$objname"
-
- # Unlock the critical section if it was locked
- if test "$need_locks" != no; then
- removelist=$lockfile
- $RM "$lockfile"
- fi
- }
-
- exit $EXIT_SUCCESS
-}
-
-$opt_help || {
- test "$opt_mode" = compile && func_mode_compile ${1+"$@"}
-}
-
-func_mode_help ()
-{
- # We need to display help for each of the modes.
- case $opt_mode in
- "")
- # Generic help is extracted from the usage comments
- # at the start of this file.
- func_help
- ;;
-
- clean)
- $ECHO \
-"Usage: $progname [OPTION]... --mode=clean RM [RM-OPTION]... FILE...
-
-Remove files from the build directory.
-
-RM is the name of the program to use to delete files associated with each FILE
-(typically \`/bin/rm'). RM-OPTIONS are options (such as \`-f') to be passed
-to RM.
-
-If FILE is a libtool library, object or program, all the files associated
-with it are deleted. Otherwise, only FILE itself is deleted using RM."
- ;;
-
- compile)
- $ECHO \
-"Usage: $progname [OPTION]... --mode=compile COMPILE-COMMAND... SOURCEFILE
-
-Compile a source file into a libtool library object.
-
-This mode accepts the following additional options:
-
- -o OUTPUT-FILE set the output file name to OUTPUT-FILE
- -no-suppress do not suppress compiler output for multiple passes
- -prefer-pic try to build PIC objects only
- -prefer-non-pic try to build non-PIC objects only
- -shared do not build a \`.o' file suitable for static linking
- -static only build a \`.o' file suitable for static linking
- -Wc,FLAG pass FLAG directly to the compiler
-
-COMPILE-COMMAND is a command to be used in creating a \`standard' object file
-from the given SOURCEFILE.
-
-The output file name is determined by removing the directory component from
-SOURCEFILE, then substituting the C source code suffix \`.c' with the
-library object suffix, \`.lo'."
- ;;
-
- execute)
- $ECHO \
-"Usage: $progname [OPTION]... --mode=execute COMMAND [ARGS]...
-
-Automatically set library path, then run a program.
-
-This mode accepts the following additional options:
-
- -dlopen FILE add the directory containing FILE to the library path
-
-This mode sets the library path environment variable according to \`-dlopen'
-flags.
-
-If any of the ARGS are libtool executable wrappers, then they are translated
-into their corresponding uninstalled binary, and any of their required library
-directories are added to the library path.
-
-Then, COMMAND is executed, with ARGS as arguments."
- ;;
-
- finish)
- $ECHO \
-"Usage: $progname [OPTION]... --mode=finish [LIBDIR]...
-
-Complete the installation of libtool libraries.
-
-Each LIBDIR is a directory that contains libtool libraries.
-
-The commands that this mode executes may require superuser privileges. Use
-the \`--dry-run' option if you just want to see what would be executed."
- ;;
-
- install)
- $ECHO \
-"Usage: $progname [OPTION]... --mode=install INSTALL-COMMAND...
-
-Install executables or libraries.
-
-INSTALL-COMMAND is the installation command. The first component should be
-either the \`install' or \`cp' program.
-
-The following components of INSTALL-COMMAND are treated specially:
-
- -inst-prefix-dir PREFIX-DIR Use PREFIX-DIR as a staging area for installation
-
-The rest of the components are interpreted as arguments to that command (only
-BSD-compatible install options are recognized)."
- ;;
-
- link)
- $ECHO \
-"Usage: $progname [OPTION]... --mode=link LINK-COMMAND...
-
-Link object files or libraries together to form another library, or to
-create an executable program.
-
-LINK-COMMAND is a command using the C compiler that you would use to create
-a program from several object files.
-
-The following components of LINK-COMMAND are treated specially:
-
- -all-static do not do any dynamic linking at all
- -avoid-version do not add a version suffix if possible
- -bindir BINDIR specify path to binaries directory (for systems where
- libraries must be found in the PATH setting at runtime)
- -dlopen FILE \`-dlpreopen' FILE if it cannot be dlopened at runtime
- -dlpreopen FILE link in FILE and add its symbols to lt_preloaded_symbols
- -export-dynamic allow symbols from OUTPUT-FILE to be resolved with dlsym(3)
- -export-symbols SYMFILE
- try to export only the symbols listed in SYMFILE
- -export-symbols-regex REGEX
- try to export only the symbols matching REGEX
- -LLIBDIR search LIBDIR for required installed libraries
- -lNAME OUTPUT-FILE requires the installed library libNAME
- -module build a library that can dlopened
- -no-fast-install disable the fast-install mode
- -no-install link a not-installable executable
- -no-undefined declare that a library does not refer to external symbols
- -o OUTPUT-FILE create OUTPUT-FILE from the specified objects
- -objectlist FILE Use a list of object files found in FILE to specify objects
- -precious-files-regex REGEX
- don't remove output files matching REGEX
- -release RELEASE specify package release information
- -rpath LIBDIR the created library will eventually be installed in LIBDIR
- -R[ ]LIBDIR add LIBDIR to the runtime path of programs and libraries
- -shared only do dynamic linking of libtool libraries
- -shrext SUFFIX override the standard shared library file extension
- -static do not do any dynamic linking of uninstalled libtool libraries
- -static-libtool-libs
- do not do any dynamic linking of libtool libraries
- -version-info CURRENT[:REVISION[:AGE]]
- specify library version info [each variable defaults to 0]
- -weak LIBNAME declare that the target provides the LIBNAME interface
- -Wc,FLAG
- -Xcompiler FLAG pass linker-specific FLAG directly to the compiler
- -Wl,FLAG
- -Xlinker FLAG pass linker-specific FLAG directly to the linker
- -XCClinker FLAG pass link-specific FLAG to the compiler driver (CC)
-
-All other options (arguments beginning with \`-') are ignored.
-
-Every other argument is treated as a filename. Files ending in \`.la' are
-treated as uninstalled libtool libraries, other files are standard or library
-object files.
-
-If the OUTPUT-FILE ends in \`.la', then a libtool library is created,
-only library objects (\`.lo' files) may be specified, and \`-rpath' is
-required, except when creating a convenience library.
-
-If OUTPUT-FILE ends in \`.a' or \`.lib', then a standard library is created
-using \`ar' and \`ranlib', or on Windows using \`lib'.
-
-If OUTPUT-FILE ends in \`.lo' or \`.${objext}', then a reloadable object file
-is created, otherwise an executable program is created."
- ;;
-
- uninstall)
- $ECHO \
-"Usage: $progname [OPTION]... --mode=uninstall RM [RM-OPTION]... FILE...
-
-Remove libraries from an installation directory.
-
-RM is the name of the program to use to delete files associated with each FILE
-(typically \`/bin/rm'). RM-OPTIONS are options (such as \`-f') to be passed
-to RM.
-
-If FILE is a libtool library, all the files associated with it are deleted.
-Otherwise, only FILE itself is deleted using RM."
- ;;
-
- *)
- func_fatal_help "invalid operation mode \`$opt_mode'"
- ;;
- esac
-
- echo
- $ECHO "Try \`$progname --help' for more information about other modes."
-}
-
-# Now that we've collected a possible --mode arg, show help if necessary
-if $opt_help; then
- if test "$opt_help" = :; then
- func_mode_help
- else
- {
- func_help noexit
- for opt_mode in compile link execute install finish uninstall clean; do
- func_mode_help
- done
- } | sed -n '1p; 2,$s/^Usage:/ or: /p'
- {
- func_help noexit
- for opt_mode in compile link execute install finish uninstall clean; do
- echo
- func_mode_help
- done
- } |
- sed '1d
- /^When reporting/,/^Report/{
- H
- d
- }
- $x
- /information about other modes/d
- /more detailed .*MODE/d
- s/^Usage:.*--mode=\([^ ]*\) .*/Description of \1 mode:/'
- fi
- exit $?
-fi
-
-
-# func_mode_execute arg...
-func_mode_execute ()
-{
- $opt_debug
- # The first argument is the command name.
- cmd="$nonopt"
- test -z "$cmd" && \
- func_fatal_help "you must specify a COMMAND"
-
- # Handle -dlopen flags immediately.
- for file in $opt_dlopen; do
- test -f "$file" \
- || func_fatal_help "\`$file' is not a file"
-
- dir=
- case $file in
- *.la)
- func_resolve_sysroot "$file"
- file=$func_resolve_sysroot_result
-
- # Check to see that this really is a libtool archive.
- func_lalib_unsafe_p "$file" \
- || func_fatal_help "\`$lib' is not a valid libtool archive"
-
- # Read the libtool library.
- dlname=
- library_names=
- func_source "$file"
-
- # Skip this library if it cannot be dlopened.
- if test -z "$dlname"; then
- # Warn if it was a shared library.
- test -n "$library_names" && \
- func_warning "\`$file' was not linked with \`-export-dynamic'"
- continue
- fi
-
- func_dirname "$file" "" "."
- dir="$func_dirname_result"
-
- if test -f "$dir/$objdir/$dlname"; then
- func_append dir "/$objdir"
- else
- if test ! -f "$dir/$dlname"; then
- func_fatal_error "cannot find \`$dlname' in \`$dir' or \`$dir/$objdir'"
- fi
- fi
- ;;
-
- *.lo)
- # Just add the directory containing the .lo file.
- func_dirname "$file" "" "."
- dir="$func_dirname_result"
- ;;
-
- *)
- func_warning "\`-dlopen' is ignored for non-libtool libraries and objects"
- continue
- ;;
- esac
-
- # Get the absolute pathname.
- absdir=`cd "$dir" && pwd`
- test -n "$absdir" && dir="$absdir"
-
- # Now add the directory to shlibpath_var.
- if eval "test -z \"\$$shlibpath_var\""; then
- eval "$shlibpath_var=\"\$dir\""
- else
- eval "$shlibpath_var=\"\$dir:\$$shlibpath_var\""
- fi
- done
-
- # This variable tells wrapper scripts just to set shlibpath_var
- # rather than running their programs.
- libtool_execute_magic="$magic"
-
- # Check if any of the arguments is a wrapper script.
- args=
- for file
- do
- case $file in
- -* | *.la | *.lo ) ;;
- *)
- # Do a test to see if this is really a libtool program.
- if func_ltwrapper_script_p "$file"; then
- func_source "$file"
- # Transform arg to wrapped name.
- file="$progdir/$program"
- elif func_ltwrapper_executable_p "$file"; then
- func_ltwrapper_scriptname "$file"
- func_source "$func_ltwrapper_scriptname_result"
- # Transform arg to wrapped name.
- file="$progdir/$program"
- fi
- ;;
- esac
- # Quote arguments (to preserve shell metacharacters).
- func_append_quoted args "$file"
- done
-
- if test "X$opt_dry_run" = Xfalse; then
- if test -n "$shlibpath_var"; then
- # Export the shlibpath_var.
- eval "export $shlibpath_var"
- fi
-
- # Restore saved environment variables
- for lt_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES
- do
- eval "if test \"\${save_$lt_var+set}\" = set; then
- $lt_var=\$save_$lt_var; export $lt_var
- else
- $lt_unset $lt_var
- fi"
- done
-
- # Now prepare to actually exec the command.
- exec_cmd="\$cmd$args"
- else
- # Display what would be done.
- if test -n "$shlibpath_var"; then
- eval "\$ECHO \"\$shlibpath_var=\$$shlibpath_var\""
- echo "export $shlibpath_var"
- fi
- $ECHO "$cmd$args"
- exit $EXIT_SUCCESS
- fi
-}
-
-test "$opt_mode" = execute && func_mode_execute ${1+"$@"}
-
-
-# func_mode_finish arg...
-func_mode_finish ()
-{
- $opt_debug
- libs=
- libdirs=
- admincmds=
-
- for opt in "$nonopt" ${1+"$@"}
- do
- if test -d "$opt"; then
- func_append libdirs " $opt"
-
- elif test -f "$opt"; then
- if func_lalib_unsafe_p "$opt"; then
- func_append libs " $opt"
- else
- func_warning "\`$opt' is not a valid libtool archive"
- fi
-
- else
- func_fatal_error "invalid argument \`$opt'"
- fi
- done
-
- if test -n "$libs"; then
- if test -n "$lt_sysroot"; then
- sysroot_regex=`$ECHO "$lt_sysroot" | $SED "$sed_make_literal_regex"`
- sysroot_cmd="s/\([ ']\)$sysroot_regex/\1/g;"
- else
- sysroot_cmd=
- fi
-
- # Remove sysroot references
- if $opt_dry_run; then
- for lib in $libs; do
- echo "removing references to $lt_sysroot and \`=' prefixes from $lib"
- done
- else
- tmpdir=`func_mktempdir`
- for lib in $libs; do
- sed -e "${sysroot_cmd} s/\([ ']-[LR]\)=/\1/g; s/\([ ']\)=/\1/g" $lib \
- > $tmpdir/tmp-la
- mv -f $tmpdir/tmp-la $lib
- done
- ${RM}r "$tmpdir"
- fi
- fi
-
- if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then
- for libdir in $libdirs; do
- if test -n "$finish_cmds"; then
- # Do each command in the finish commands.
- func_execute_cmds "$finish_cmds" 'admincmds="$admincmds
-'"$cmd"'"'
- fi
- if test -n "$finish_eval"; then
- # Do the single finish_eval.
- eval cmds=\"$finish_eval\"
- $opt_dry_run || eval "$cmds" || func_append admincmds "
- $cmds"
- fi
- done
- fi
-
- # Exit here if they wanted silent mode.
- $opt_silent && exit $EXIT_SUCCESS
-
- if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then
- echo "----------------------------------------------------------------------"
- echo "Libraries have been installed in:"
- for libdir in $libdirs; do
- $ECHO " $libdir"
- done
- echo
- echo "If you ever happen to want to link against installed libraries"
- echo "in a given directory, LIBDIR, you must either use libtool, and"
- echo "specify the full pathname of the library, or use the \`-LLIBDIR'"
- echo "flag during linking and do at least one of the following:"
- if test -n "$shlibpath_var"; then
- echo " - add LIBDIR to the \`$shlibpath_var' environment variable"
- echo " during execution"
- fi
- if test -n "$runpath_var"; then
- echo " - add LIBDIR to the \`$runpath_var' environment variable"
- echo " during linking"
- fi
- if test -n "$hardcode_libdir_flag_spec"; then
- libdir=LIBDIR
- eval flag=\"$hardcode_libdir_flag_spec\"
-
- $ECHO " - use the \`$flag' linker flag"
- fi
- if test -n "$admincmds"; then
- $ECHO " - have your system administrator run these commands:$admincmds"
- fi
- if test -f /etc/ld.so.conf; then
- echo " - have your system administrator add LIBDIR to \`/etc/ld.so.conf'"
- fi
- echo
-
- echo "See any operating system documentation about shared libraries for"
- case $host in
- solaris2.[6789]|solaris2.1[0-9])
- echo "more information, such as the ld(1), crle(1) and ld.so(8) manual"
- echo "pages."
- ;;
- *)
- echo "more information, such as the ld(1) and ld.so(8) manual pages."
- ;;
- esac
- echo "----------------------------------------------------------------------"
- fi
- exit $EXIT_SUCCESS
-}
-
-test "$opt_mode" = finish && func_mode_finish ${1+"$@"}
-
-
-# func_mode_install arg...
-func_mode_install ()
-{
- $opt_debug
- # There may be an optional sh(1) argument at the beginning of
- # install_prog (especially on Windows NT).
- if test "$nonopt" = "$SHELL" || test "$nonopt" = /bin/sh ||
- # Allow the use of GNU shtool's install command.
- case $nonopt in *shtool*) :;; *) false;; esac; then
- # Aesthetically quote it.
- func_quote_for_eval "$nonopt"
- install_prog="$func_quote_for_eval_result "
- arg=$1
- shift
- else
- install_prog=
- arg=$nonopt
- fi
-
- # The real first argument should be the name of the installation program.
- # Aesthetically quote it.
- func_quote_for_eval "$arg"
- func_append install_prog "$func_quote_for_eval_result"
- install_shared_prog=$install_prog
- case " $install_prog " in
- *[\\\ /]cp\ *) install_cp=: ;;
- *) install_cp=false ;;
- esac
-
- # We need to accept at least all the BSD install flags.
- dest=
- files=
- opts=
- prev=
- install_type=
- isdir=no
- stripme=
- no_mode=:
- for arg
- do
- arg2=
- if test -n "$dest"; then
- func_append files " $dest"
- dest=$arg
- continue
- fi
-
- case $arg in
- -d) isdir=yes ;;
- -f)
- if $install_cp; then :; else
- prev=$arg
- fi
- ;;
- -g | -m | -o)
- prev=$arg
- ;;
- -s)
- stripme=" -s"
- continue
- ;;
- -*)
- ;;
- *)
- # If the previous option needed an argument, then skip it.
- if test -n "$prev"; then
- if test "x$prev" = x-m && test -n "$install_override_mode"; then
- arg2=$install_override_mode
- no_mode=false
- fi
- prev=
- else
- dest=$arg
- continue
- fi
- ;;
- esac
-
- # Aesthetically quote the argument.
- func_quote_for_eval "$arg"
- func_append install_prog " $func_quote_for_eval_result"
- if test -n "$arg2"; then
- func_quote_for_eval "$arg2"
- fi
- func_append install_shared_prog " $func_quote_for_eval_result"
- done
-
- test -z "$install_prog" && \
- func_fatal_help "you must specify an install program"
-
- test -n "$prev" && \
- func_fatal_help "the \`$prev' option requires an argument"
-
- if test -n "$install_override_mode" && $no_mode; then
- if $install_cp; then :; else
- func_quote_for_eval "$install_override_mode"
- func_append install_shared_prog " -m $func_quote_for_eval_result"
- fi
- fi
-
- if test -z "$files"; then
- if test -z "$dest"; then
- func_fatal_help "no file or destination specified"
- else
- func_fatal_help "you must specify a destination"
- fi
- fi
-
- # Strip any trailing slash from the destination.
- func_stripname '' '/' "$dest"
- dest=$func_stripname_result
-
- # Check to see that the destination is a directory.
- test -d "$dest" && isdir=yes
- if test "$isdir" = yes; then
- destdir="$dest"
- destname=
- else
- func_dirname_and_basename "$dest" "" "."
- destdir="$func_dirname_result"
- destname="$func_basename_result"
-
- # Not a directory, so check to see that there is only one file specified.
- set dummy $files; shift
- test "$#" -gt 1 && \
- func_fatal_help "\`$dest' is not a directory"
- fi
- case $destdir in
- [\\/]* | [A-Za-z]:[\\/]*) ;;
- *)
- for file in $files; do
- case $file in
- *.lo) ;;
- *)
- func_fatal_help "\`$destdir' must be an absolute directory name"
- ;;
- esac
- done
- ;;
- esac
-
- # This variable tells wrapper scripts just to set variables rather
- # than running their programs.
- libtool_install_magic="$magic"
-
- staticlibs=
- future_libdirs=
- current_libdirs=
- for file in $files; do
-
- # Do each installation.
- case $file in
- *.$libext)
- # Do the static libraries later.
- func_append staticlibs " $file"
- ;;
-
- *.la)
- func_resolve_sysroot "$file"
- file=$func_resolve_sysroot_result
-
- # Check to see that this really is a libtool archive.
- func_lalib_unsafe_p "$file" \
- || func_fatal_help "\`$file' is not a valid libtool archive"
-
- library_names=
- old_library=
- relink_command=
- func_source "$file"
-
- # Add the libdir to current_libdirs if it is the destination.
- if test "X$destdir" = "X$libdir"; then
- case "$current_libdirs " in
- *" $libdir "*) ;;
- *) func_append current_libdirs " $libdir" ;;
- esac
- else
- # Note the libdir as a future libdir.
- case "$future_libdirs " in
- *" $libdir "*) ;;
- *) func_append future_libdirs " $libdir" ;;
- esac
- fi
-
- func_dirname "$file" "/" ""
- dir="$func_dirname_result"
- func_append dir "$objdir"
-
- if test -n "$relink_command"; then
- # Determine the prefix the user has applied to our future dir.
- inst_prefix_dir=`$ECHO "$destdir" | $SED -e "s%$libdir\$%%"`
-
- # Don't allow the user to place us outside of our expected
- # location b/c this prevents finding dependent libraries that
- # are installed to the same prefix.
- # At present, this check doesn't affect windows .dll's that
- # are installed into $libdir/../bin (currently, that works fine)
- # but it's something to keep an eye on.
- test "$inst_prefix_dir" = "$destdir" && \
- func_fatal_error "error: cannot install \`$file' to a directory not ending in $libdir"
-
- if test -n "$inst_prefix_dir"; then
- # Stick the inst_prefix_dir data into the link command.
- relink_command=`$ECHO "$relink_command" | $SED "s%@inst_prefix_dir@%-inst-prefix-dir $inst_prefix_dir%"`
- else
- relink_command=`$ECHO "$relink_command" | $SED "s%@inst_prefix_dir@%%"`
- fi
-
- func_warning "relinking \`$file'"
- func_show_eval "$relink_command" \
- 'func_fatal_error "error: relink \`$file'\'' with the above command before installing it"'
- fi
-
- # See the names of the shared library.
- set dummy $library_names; shift
- if test -n "$1"; then
- realname="$1"
- shift
-
- srcname="$realname"
- test -n "$relink_command" && srcname="$realname"T
-
- # Install the shared library and build the symlinks.
- func_show_eval "$install_shared_prog $dir/$srcname $destdir/$realname" \
- 'exit $?'
- tstripme="$stripme"
- case $host_os in
- cygwin* | mingw* | pw32* | cegcc*)
- case $realname in
- *.dll.a)
- tstripme=""
- ;;
- esac
- ;;
- esac
- if test -n "$tstripme" && test -n "$striplib"; then
- func_show_eval "$striplib $destdir/$realname" 'exit $?'
- fi
-
- if test "$#" -gt 0; then
- # Delete the old symlinks, and create new ones.
- # Try `ln -sf' first, because the `ln' binary might depend on
- # the symlink we replace! Solaris /bin/ln does not understand -f,
- # so we also need to try rm && ln -s.
- for linkname
- do
- test "$linkname" != "$realname" \
- && func_show_eval "(cd $destdir && { $LN_S -f $realname $linkname || { $RM $linkname && $LN_S $realname $linkname; }; })"
- done
- fi
-
- # Do each command in the postinstall commands.
- lib="$destdir/$realname"
- func_execute_cmds "$postinstall_cmds" 'exit $?'
- fi
-
- # Install the pseudo-library for information purposes.
- func_basename "$file"
- name="$func_basename_result"
- instname="$dir/$name"i
- func_show_eval "$install_prog $instname $destdir/$name" 'exit $?'
-
- # Maybe install the static library, too.
- test -n "$old_library" && func_append staticlibs " $dir/$old_library"
- ;;
-
- *.lo)
- # Install (i.e. copy) a libtool object.
-
- # Figure out destination file name, if it wasn't already specified.
- if test -n "$destname"; then
- destfile="$destdir/$destname"
- else
- func_basename "$file"
- destfile="$func_basename_result"
- destfile="$destdir/$destfile"
- fi
-
- # Deduce the name of the destination old-style object file.
- case $destfile in
- *.lo)
- func_lo2o "$destfile"
- staticdest=$func_lo2o_result
- ;;
- *.$objext)
- staticdest="$destfile"
- destfile=
- ;;
- *)
- func_fatal_help "cannot copy a libtool object to \`$destfile'"
- ;;
- esac
-
- # Install the libtool object if requested.
- test -n "$destfile" && \
- func_show_eval "$install_prog $file $destfile" 'exit $?'
-
- # Install the old object if enabled.
- if test "$build_old_libs" = yes; then
- # Deduce the name of the old-style object file.
- func_lo2o "$file"
- staticobj=$func_lo2o_result
- func_show_eval "$install_prog \$staticobj \$staticdest" 'exit $?'
- fi
- exit $EXIT_SUCCESS
- ;;
-
- *)
- # Figure out destination file name, if it wasn't already specified.
- if test -n "$destname"; then
- destfile="$destdir/$destname"
- else
- func_basename "$file"
- destfile="$func_basename_result"
- destfile="$destdir/$destfile"
- fi
-
- # If the file is missing, and there is a .exe on the end, strip it
- # because it is most likely a libtool script we actually want to
- # install
- stripped_ext=""
- case $file in
- *.exe)
- if test ! -f "$file"; then
- func_stripname '' '.exe' "$file"
- file=$func_stripname_result
- stripped_ext=".exe"
- fi
- ;;
- esac
-
- # Do a test to see if this is really a libtool program.
- case $host in
- *cygwin* | *mingw*)
- if func_ltwrapper_executable_p "$file"; then
- func_ltwrapper_scriptname "$file"
- wrapper=$func_ltwrapper_scriptname_result
- else
- func_stripname '' '.exe' "$file"
- wrapper=$func_stripname_result
- fi
- ;;
- *)
- wrapper=$file
- ;;
- esac
- if func_ltwrapper_script_p "$wrapper"; then
- notinst_deplibs=
- relink_command=
-
- func_source "$wrapper"
-
- # Check the variables that should have been set.
- test -z "$generated_by_libtool_version" && \
- func_fatal_error "invalid libtool wrapper script \`$wrapper'"
-
- finalize=yes
- for lib in $notinst_deplibs; do
- # Check to see that each library is installed.
- libdir=
- if test -f "$lib"; then
- func_source "$lib"
- fi
- libfile="$libdir/"`$ECHO "$lib" | $SED 's%^.*/%%g'` ### testsuite: skip nested quoting test
- if test -n "$libdir" && test ! -f "$libfile"; then
- func_warning "\`$lib' has not been installed in \`$libdir'"
- finalize=no
- fi
- done
-
- relink_command=
- func_source "$wrapper"
-
- outputname=
- if test "$fast_install" = no && test -n "$relink_command"; then
- $opt_dry_run || {
- if test "$finalize" = yes; then
- tmpdir=`func_mktempdir`
- func_basename "$file$stripped_ext"
- file="$func_basename_result"
- outputname="$tmpdir/$file"
- # Replace the output file specification.
- relink_command=`$ECHO "$relink_command" | $SED 's%@OUTPUT@%'"$outputname"'%g'`
-
- $opt_silent || {
- func_quote_for_expand "$relink_command"
- eval "func_echo $func_quote_for_expand_result"
- }
- if eval "$relink_command"; then :
- else
- func_error "error: relink \`$file' with the above command before installing it"
- $opt_dry_run || ${RM}r "$tmpdir"
- continue
- fi
- file="$outputname"
- else
- func_warning "cannot relink \`$file'"
- fi
- }
- else
- # Install the binary that we compiled earlier.
- file=`$ECHO "$file$stripped_ext" | $SED "s%\([^/]*\)$%$objdir/\1%"`
- fi
- fi
-
- # remove .exe since cygwin /usr/bin/install will append another
- # one anyway
- case $install_prog,$host in
- */usr/bin/install*,*cygwin*)
- case $file:$destfile in
- *.exe:*.exe)
- # this is ok
- ;;
- *.exe:*)
- destfile=$destfile.exe
- ;;
- *:*.exe)
- func_stripname '' '.exe' "$destfile"
- destfile=$func_stripname_result
- ;;
- esac
- ;;
- esac
- func_show_eval "$install_prog\$stripme \$file \$destfile" 'exit $?'
- $opt_dry_run || if test -n "$outputname"; then
- ${RM}r "$tmpdir"
- fi
- ;;
- esac
- done
-
- for file in $staticlibs; do
- func_basename "$file"
- name="$func_basename_result"
-
- # Set up the ranlib parameters.
- oldlib="$destdir/$name"
- func_to_tool_file "$oldlib" func_convert_file_msys_to_w32
- tool_oldlib=$func_to_tool_file_result
-
- func_show_eval "$install_prog \$file \$oldlib" 'exit $?'
-
- if test -n "$stripme" && test -n "$old_striplib"; then
- func_show_eval "$old_striplib $tool_oldlib" 'exit $?'
- fi
-
- # Do each command in the postinstall commands.
- func_execute_cmds "$old_postinstall_cmds" 'exit $?'
- done
-
- test -n "$future_libdirs" && \
- func_warning "remember to run \`$progname --finish$future_libdirs'"
-
- if test -n "$current_libdirs"; then
- # Maybe just do a dry run.
- $opt_dry_run && current_libdirs=" -n$current_libdirs"
- exec_cmd='$SHELL $progpath $preserve_args --finish$current_libdirs'
- else
- exit $EXIT_SUCCESS
- fi
-}
-
-test "$opt_mode" = install && func_mode_install ${1+"$@"}
-
-
-# func_generate_dlsyms outputname originator pic_p
-# Extract symbols from dlprefiles and create ${outputname}S.o with
-# a dlpreopen symbol table.
-func_generate_dlsyms ()
-{
- $opt_debug
- my_outputname="$1"
- my_originator="$2"
- my_pic_p="${3-no}"
- my_prefix=`$ECHO "$my_originator" | sed 's%[^a-zA-Z0-9]%_%g'`
- my_dlsyms=
-
- if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then
- if test -n "$NM" && test -n "$global_symbol_pipe"; then
- my_dlsyms="${my_outputname}S.c"
- else
- func_error "not configured to extract global symbols from dlpreopened files"
- fi
- fi
-
- if test -n "$my_dlsyms"; then
- case $my_dlsyms in
- "") ;;
- *.c)
- # Discover the nlist of each of the dlfiles.
- nlist="$output_objdir/${my_outputname}.nm"
-
- func_show_eval "$RM $nlist ${nlist}S ${nlist}T"
-
- # Parse the name list into a source file.
- func_verbose "creating $output_objdir/$my_dlsyms"
-
- $opt_dry_run || $ECHO > "$output_objdir/$my_dlsyms" "\
-/* $my_dlsyms - symbol resolution table for \`$my_outputname' dlsym emulation. */
-/* Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION */
-
-#ifdef __cplusplus
-extern \"C\" {
-#endif
-
-#if defined(__GNUC__) && (((__GNUC__ == 4) && (__GNUC_MINOR__ >= 4)) || (__GNUC__ > 4))
-#pragma GCC diagnostic ignored \"-Wstrict-prototypes\"
-#endif
-
-/* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests. */
-#if defined(_WIN32) || defined(__CYGWIN__) || defined(_WIN32_WCE)
-/* DATA imports from DLLs on WIN32 con't be const, because runtime
- relocations are performed -- see ld's documentation on pseudo-relocs. */
-# define LT_DLSYM_CONST
-#elif defined(__osf__)
-/* This system does not cope well with relocations in const data. */
-# define LT_DLSYM_CONST
-#else
-# define LT_DLSYM_CONST const
-#endif
-
-/* External symbol declarations for the compiler. */\
-"
-
- if test "$dlself" = yes; then
- func_verbose "generating symbol list for \`$output'"
-
- $opt_dry_run || echo ': @PROGRAM@ ' > "$nlist"
-
- # Add our own program objects to the symbol list.
- progfiles=`$ECHO "$objs$old_deplibs" | $SP2NL | $SED "$lo2o" | $NL2SP`
- for progfile in $progfiles; do
- func_to_tool_file "$progfile" func_convert_file_msys_to_w32
- func_verbose "extracting global C symbols from \`$func_to_tool_file_result'"
- $opt_dry_run || eval "$NM $func_to_tool_file_result | $global_symbol_pipe >> '$nlist'"
- done
-
- if test -n "$exclude_expsyms"; then
- $opt_dry_run || {
- eval '$EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T'
- eval '$MV "$nlist"T "$nlist"'
- }
- fi
-
- if test -n "$export_symbols_regex"; then
- $opt_dry_run || {
- eval '$EGREP -e "$export_symbols_regex" "$nlist" > "$nlist"T'
- eval '$MV "$nlist"T "$nlist"'
- }
- fi
-
- # Prepare the list of exported symbols
- if test -z "$export_symbols"; then
- export_symbols="$output_objdir/$outputname.exp"
- $opt_dry_run || {
- $RM $export_symbols
- eval "${SED} -n -e '/^: @PROGRAM@ $/d' -e 's/^.* \(.*\)$/\1/p' "'< "$nlist" > "$export_symbols"'
- case $host in
- *cygwin* | *mingw* | *cegcc* )
- eval "echo EXPORTS "'> "$output_objdir/$outputname.def"'
- eval 'cat "$export_symbols" >> "$output_objdir/$outputname.def"'
- ;;
- esac
- }
- else
- $opt_dry_run || {
- eval "${SED} -e 's/\([].[*^$]\)/\\\\\1/g' -e 's/^/ /' -e 's/$/$/'"' < "$export_symbols" > "$output_objdir/$outputname.exp"'
- eval '$GREP -f "$output_objdir/$outputname.exp" < "$nlist" > "$nlist"T'
- eval '$MV "$nlist"T "$nlist"'
- case $host in
- *cygwin* | *mingw* | *cegcc* )
- eval "echo EXPORTS "'> "$output_objdir/$outputname.def"'
- eval 'cat "$nlist" >> "$output_objdir/$outputname.def"'
- ;;
- esac
- }
- fi
- fi
-
- for dlprefile in $dlprefiles; do
- func_verbose "extracting global C symbols from \`$dlprefile'"
- func_basename "$dlprefile"
- name="$func_basename_result"
- case $host in
- *cygwin* | *mingw* | *cegcc* )
- # if an import library, we need to obtain dlname
- if func_win32_import_lib_p "$dlprefile"; then
- func_tr_sh "$dlprefile"
- eval "curr_lafile=\$libfile_$func_tr_sh_result"
- dlprefile_dlbasename=""
- if test -n "$curr_lafile" && func_lalib_p "$curr_lafile"; then
- # Use subshell, to avoid clobbering current variable values
- dlprefile_dlname=`source "$curr_lafile" && echo "$dlname"`
- if test -n "$dlprefile_dlname" ; then
- func_basename "$dlprefile_dlname"
- dlprefile_dlbasename="$func_basename_result"
- else
- # no lafile. user explicitly requested -dlpreopen <import library>.
- $sharedlib_from_linklib_cmd "$dlprefile"
- dlprefile_dlbasename=$sharedlib_from_linklib_result
- fi
- fi
- $opt_dry_run || {
- if test -n "$dlprefile_dlbasename" ; then
- eval '$ECHO ": $dlprefile_dlbasename" >> "$nlist"'
- else
- func_warning "Could not compute DLL name from $name"
- eval '$ECHO ": $name " >> "$nlist"'
- fi
- func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32
- eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe |
- $SED -e '/I __imp/d' -e 's/I __nm_/D /;s/_nm__//' >> '$nlist'"
- }
- else # not an import lib
- $opt_dry_run || {
- eval '$ECHO ": $name " >> "$nlist"'
- func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32
- eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe >> '$nlist'"
- }
- fi
- ;;
- *)
- $opt_dry_run || {
- eval '$ECHO ": $name " >> "$nlist"'
- func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32
- eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe >> '$nlist'"
- }
- ;;
- esac
- done
-
- $opt_dry_run || {
- # Make sure we have at least an empty file.
- test -f "$nlist" || : > "$nlist"
-
- if test -n "$exclude_expsyms"; then
- $EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T
- $MV "$nlist"T "$nlist"
- fi
-
- # Try sorting and uniquifying the output.
- if $GREP -v "^: " < "$nlist" |
- if sort -k 3 </dev/null >/dev/null 2>&1; then
- sort -k 3
- else
- sort +2
- fi |
- uniq > "$nlist"S; then
- :
- else
- $GREP -v "^: " < "$nlist" > "$nlist"S
- fi
-
- if test -f "$nlist"S; then
- eval "$global_symbol_to_cdecl"' < "$nlist"S >> "$output_objdir/$my_dlsyms"'
- else
- echo '/* NONE */' >> "$output_objdir/$my_dlsyms"
- fi
-
- echo >> "$output_objdir/$my_dlsyms" "\
-
-/* The mapping between symbol names and symbols. */
-typedef struct {
- const char *name;
- void *address;
-} lt_dlsymlist;
-extern LT_DLSYM_CONST lt_dlsymlist
-lt_${my_prefix}_LTX_preloaded_symbols[];
-LT_DLSYM_CONST lt_dlsymlist
-lt_${my_prefix}_LTX_preloaded_symbols[] =
-{\
- { \"$my_originator\", (void *) 0 },"
-
- case $need_lib_prefix in
- no)
- eval "$global_symbol_to_c_name_address" < "$nlist" >> "$output_objdir/$my_dlsyms"
- ;;
- *)
- eval "$global_symbol_to_c_name_address_lib_prefix" < "$nlist" >> "$output_objdir/$my_dlsyms"
- ;;
- esac
- echo >> "$output_objdir/$my_dlsyms" "\
- {0, (void *) 0}
-};
-
-/* This works around a problem in FreeBSD linker */
-#ifdef FREEBSD_WORKAROUND
-static const void *lt_preloaded_setup() {
- return lt_${my_prefix}_LTX_preloaded_symbols;
-}
-#endif
-
-#ifdef __cplusplus
-}
-#endif\
-"
- } # !$opt_dry_run
-
- pic_flag_for_symtable=
- case "$compile_command " in
- *" -static "*) ;;
- *)
- case $host in
- # compiling the symbol table file with pic_flag works around
- # a FreeBSD bug that causes programs to crash when -lm is
- # linked before any other PIC object. But we must not use
- # pic_flag when linking with -static. The problem exists in
- # FreeBSD 2.2.6 and is fixed in FreeBSD 3.1.
- *-*-freebsd2.*|*-*-freebsd3.0*|*-*-freebsdelf3.0*)
- pic_flag_for_symtable=" $pic_flag -DFREEBSD_WORKAROUND" ;;
- *-*-hpux*)
- pic_flag_for_symtable=" $pic_flag" ;;
- *)
- if test "X$my_pic_p" != Xno; then
- pic_flag_for_symtable=" $pic_flag"
- fi
- ;;
- esac
- ;;
- esac
- symtab_cflags=
- for arg in $LTCFLAGS; do
- case $arg in
- -pie | -fpie | -fPIE) ;;
- *) func_append symtab_cflags " $arg" ;;
- esac
- done
-
- # Now compile the dynamic symbol file.
- func_show_eval '(cd $output_objdir && $LTCC$symtab_cflags -c$no_builtin_flag$pic_flag_for_symtable "$my_dlsyms")' 'exit $?'
-
- # Clean up the generated files.
- func_show_eval '$RM "$output_objdir/$my_dlsyms" "$nlist" "${nlist}S" "${nlist}T"'
-
- # Transform the symbol file into the correct name.
- symfileobj="$output_objdir/${my_outputname}S.$objext"
- case $host in
- *cygwin* | *mingw* | *cegcc* )
- if test -f "$output_objdir/$my_outputname.def"; then
- compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%"`
- finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%"`
- else
- compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$symfileobj%"`
- finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$symfileobj%"`
- fi
- ;;
- *)
- compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$symfileobj%"`
- finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$symfileobj%"`
- ;;
- esac
- ;;
- *)
- func_fatal_error "unknown suffix for \`$my_dlsyms'"
- ;;
- esac
- else
- # We keep going just in case the user didn't refer to
- # lt_preloaded_symbols. The linker will fail if global_symbol_pipe
- # really was required.
-
- # Nullify the symbol file.
- compile_command=`$ECHO "$compile_command" | $SED "s% @SYMFILE@%%"`
- finalize_command=`$ECHO "$finalize_command" | $SED "s% @SYMFILE@%%"`
- fi
-}
-
-# func_win32_libid arg
-# return the library type of file 'arg'
-#
-# Need a lot of goo to handle *both* DLLs and import libs
-# Has to be a shell function in order to 'eat' the argument
-# that is supplied when $file_magic_command is called.
-# Despite the name, also deal with 64 bit binaries.
-func_win32_libid ()
-{
- $opt_debug
- win32_libid_type="unknown"
- win32_fileres=`file -L $1 2>/dev/null`
- case $win32_fileres in
- *ar\ archive\ import\ library*) # definitely import
- win32_libid_type="x86 archive import"
- ;;
- *ar\ archive*) # could be an import, or static
- # Keep the egrep pattern in sync with the one in _LT_CHECK_MAGIC_METHOD.
- if eval $OBJDUMP -f $1 | $SED -e '10q' 2>/dev/null |
- $EGREP 'file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)' >/dev/null; then
- func_to_tool_file "$1" func_convert_file_msys_to_w32
- win32_nmres=`eval $NM -f posix -A \"$func_to_tool_file_result\" |
- $SED -n -e '
- 1,100{
- / I /{
- s,.*,import,
- p
- q
- }
- }'`
- case $win32_nmres in
- import*) win32_libid_type="x86 archive import";;
- *) win32_libid_type="x86 archive static";;
- esac
- fi
- ;;
- *DLL*)
- win32_libid_type="x86 DLL"
- ;;
- *executable*) # but shell scripts are "executable" too...
- case $win32_fileres in
- *MS\ Windows\ PE\ Intel*)
- win32_libid_type="x86 DLL"
- ;;
- esac
- ;;
- esac
- $ECHO "$win32_libid_type"
-}
-
-# func_cygming_dll_for_implib ARG
-#
-# Platform-specific function to extract the
-# name of the DLL associated with the specified
-# import library ARG.
-# Invoked by eval'ing the libtool variable
-# $sharedlib_from_linklib_cmd
-# Result is available in the variable
-# $sharedlib_from_linklib_result
-func_cygming_dll_for_implib ()
-{
- $opt_debug
- sharedlib_from_linklib_result=`$DLLTOOL --identify-strict --identify "$1"`
-}
-
-# func_cygming_dll_for_implib_fallback_core SECTION_NAME LIBNAMEs
-#
-# The is the core of a fallback implementation of a
-# platform-specific function to extract the name of the
-# DLL associated with the specified import library LIBNAME.
-#
-# SECTION_NAME is either .idata$6 or .idata$7, depending
-# on the platform and compiler that created the implib.
-#
-# Echos the name of the DLL associated with the
-# specified import library.
-func_cygming_dll_for_implib_fallback_core ()
-{
- $opt_debug
- match_literal=`$ECHO "$1" | $SED "$sed_make_literal_regex"`
- $OBJDUMP -s --section "$1" "$2" 2>/dev/null |
- $SED '/^Contents of section '"$match_literal"':/{
- # Place marker at beginning of archive member dllname section
- s/.*/====MARK====/
- p
- d
- }
- # These lines can sometimes be longer than 43 characters, but
- # are always uninteresting
- /:[ ]*file format pe[i]\{,1\}-/d
- /^In archive [^:]*:/d
- # Ensure marker is printed
- /^====MARK====/p
- # Remove all lines with less than 43 characters
- /^.\{43\}/!d
- # From remaining lines, remove first 43 characters
- s/^.\{43\}//' |
- $SED -n '
- # Join marker and all lines until next marker into a single line
- /^====MARK====/ b para
- H
- $ b para
- b
- :para
- x
- s/\n//g
- # Remove the marker
- s/^====MARK====//
- # Remove trailing dots and whitespace
- s/[\. \t]*$//
- # Print
- /./p' |
- # we now have a list, one entry per line, of the stringified
- # contents of the appropriate section of all members of the
- # archive which possess that section. Heuristic: eliminate
- # all those which have a first or second character that is
- # a '.' (that is, objdump's representation of an unprintable
- # character.) This should work for all archives with less than
- # 0x302f exports -- but will fail for DLLs whose name actually
- # begins with a literal '.' or a single character followed by
- # a '.'.
- #
- # Of those that remain, print the first one.
- $SED -e '/^\./d;/^.\./d;q'
-}
-
-# func_cygming_gnu_implib_p ARG
-# This predicate returns with zero status (TRUE) if
-# ARG is a GNU/binutils-style import library. Returns
-# with nonzero status (FALSE) otherwise.
-func_cygming_gnu_implib_p ()
-{
- $opt_debug
- func_to_tool_file "$1" func_convert_file_msys_to_w32
- func_cygming_gnu_implib_tmp=`$NM "$func_to_tool_file_result" | eval "$global_symbol_pipe" | $EGREP ' (_head_[A-Za-z0-9_]+_[ad]l*|[A-Za-z0-9_]+_[ad]l*_iname)$'`
- test -n "$func_cygming_gnu_implib_tmp"
-}
-
-# func_cygming_ms_implib_p ARG
-# This predicate returns with zero status (TRUE) if
-# ARG is an MS-style import library. Returns
-# with nonzero status (FALSE) otherwise.
-func_cygming_ms_implib_p ()
-{
- $opt_debug
- func_to_tool_file "$1" func_convert_file_msys_to_w32
- func_cygming_ms_implib_tmp=`$NM "$func_to_tool_file_result" | eval "$global_symbol_pipe" | $GREP '_NULL_IMPORT_DESCRIPTOR'`
- test -n "$func_cygming_ms_implib_tmp"
-}
-
-# func_cygming_dll_for_implib_fallback ARG
-# Platform-specific function to extract the
-# name of the DLL associated with the specified
-# import library ARG.
-#
-# This fallback implementation is for use when $DLLTOOL
-# does not support the --identify-strict option.
-# Invoked by eval'ing the libtool variable
-# $sharedlib_from_linklib_cmd
-# Result is available in the variable
-# $sharedlib_from_linklib_result
-func_cygming_dll_for_implib_fallback ()
-{
- $opt_debug
- if func_cygming_gnu_implib_p "$1" ; then
- # binutils import library
- sharedlib_from_linklib_result=`func_cygming_dll_for_implib_fallback_core '.idata$7' "$1"`
- elif func_cygming_ms_implib_p "$1" ; then
- # ms-generated import library
- sharedlib_from_linklib_result=`func_cygming_dll_for_implib_fallback_core '.idata$6' "$1"`
- else
- # unknown
- sharedlib_from_linklib_result=""
- fi
-}
-
-
-# func_extract_an_archive dir oldlib
-func_extract_an_archive ()
-{
- $opt_debug
- f_ex_an_ar_dir="$1"; shift
- f_ex_an_ar_oldlib="$1"
- if test "$lock_old_archive_extraction" = yes; then
- lockfile=$f_ex_an_ar_oldlib.lock
- until $opt_dry_run || ln "$progpath" "$lockfile" 2>/dev/null; do
- func_echo "Waiting for $lockfile to be removed"
- sleep 2
- done
- fi
- func_show_eval "(cd \$f_ex_an_ar_dir && $AR x \"\$f_ex_an_ar_oldlib\")" \
- 'stat=$?; rm -f "$lockfile"; exit $stat'
- if test "$lock_old_archive_extraction" = yes; then
- $opt_dry_run || rm -f "$lockfile"
- fi
- if ($AR t "$f_ex_an_ar_oldlib" | sort | sort -uc >/dev/null 2>&1); then
- :
- else
- func_fatal_error "object name conflicts in archive: $f_ex_an_ar_dir/$f_ex_an_ar_oldlib"
- fi
-}
-
-
-# func_extract_archives gentop oldlib ...
-func_extract_archives ()
-{
- $opt_debug
- my_gentop="$1"; shift
- my_oldlibs=${1+"$@"}
- my_oldobjs=""
- my_xlib=""
- my_xabs=""
- my_xdir=""
-
- for my_xlib in $my_oldlibs; do
- # Extract the objects.
- case $my_xlib in
- [\\/]* | [A-Za-z]:[\\/]*) my_xabs="$my_xlib" ;;
- *) my_xabs=`pwd`"/$my_xlib" ;;
- esac
- func_basename "$my_xlib"
- my_xlib="$func_basename_result"
- my_xlib_u=$my_xlib
- while :; do
- case " $extracted_archives " in
- *" $my_xlib_u "*)
- func_arith $extracted_serial + 1
- extracted_serial=$func_arith_result
- my_xlib_u=lt$extracted_serial-$my_xlib ;;
- *) break ;;
- esac
- done
- extracted_archives="$extracted_archives $my_xlib_u"
- my_xdir="$my_gentop/$my_xlib_u"
-
- func_mkdir_p "$my_xdir"
-
- case $host in
- *-darwin*)
- func_verbose "Extracting $my_xabs"
- # Do not bother doing anything if just a dry run
- $opt_dry_run || {
- darwin_orig_dir=`pwd`
- cd $my_xdir || exit $?
- darwin_archive=$my_xabs
- darwin_curdir=`pwd`
- darwin_base_archive=`basename "$darwin_archive"`
- darwin_arches=`$LIPO -info "$darwin_archive" 2>/dev/null | $GREP Architectures 2>/dev/null || true`
- if test -n "$darwin_arches"; then
- darwin_arches=`$ECHO "$darwin_arches" | $SED -e 's/.*are://'`
- darwin_arch=
- func_verbose "$darwin_base_archive has multiple architectures $darwin_arches"
- for darwin_arch in $darwin_arches ; do
- func_mkdir_p "unfat-$$/${darwin_base_archive}-${darwin_arch}"
- $LIPO -thin $darwin_arch -output "unfat-$$/${darwin_base_archive}-${darwin_arch}/${darwin_base_archive}" "${darwin_archive}"
- cd "unfat-$$/${darwin_base_archive}-${darwin_arch}"
- func_extract_an_archive "`pwd`" "${darwin_base_archive}"
- cd "$darwin_curdir"
- $RM "unfat-$$/${darwin_base_archive}-${darwin_arch}/${darwin_base_archive}"
- done # $darwin_arches
- ## Okay now we've a bunch of thin objects, gotta fatten them up :)
- darwin_filelist=`find unfat-$$ -type f -name \*.o -print -o -name \*.lo -print | $SED -e "$basename" | sort -u`
- darwin_file=
- darwin_files=
- for darwin_file in $darwin_filelist; do
- darwin_files=`find unfat-$$ -name $darwin_file -print | sort | $NL2SP`
- $LIPO -create -output "$darwin_file" $darwin_files
- done # $darwin_filelist
- $RM -rf unfat-$$
- cd "$darwin_orig_dir"
- else
- cd $darwin_orig_dir
- func_extract_an_archive "$my_xdir" "$my_xabs"
- fi # $darwin_arches
- } # !$opt_dry_run
- ;;
- *)
- func_extract_an_archive "$my_xdir" "$my_xabs"
- ;;
- esac
- my_oldobjs="$my_oldobjs "`find $my_xdir -name \*.$objext -print -o -name \*.lo -print | sort | $NL2SP`
- done
-
- func_extract_archives_result="$my_oldobjs"
-}
-
-
-# func_emit_wrapper [arg=no]
-#
-# Emit a libtool wrapper script on stdout.
-# Don't directly open a file because we may want to
-# incorporate the script contents within a cygwin/mingw
-# wrapper executable. Must ONLY be called from within
-# func_mode_link because it depends on a number of variables
-# set therein.
-#
-# ARG is the value that the WRAPPER_SCRIPT_BELONGS_IN_OBJDIR
-# variable will take. If 'yes', then the emitted script
-# will assume that the directory in which it is stored is
-# the $objdir directory. This is a cygwin/mingw-specific
-# behavior.
-func_emit_wrapper ()
-{
- func_emit_wrapper_arg1=${1-no}
-
- $ECHO "\
-#! $SHELL
-
-# $output - temporary wrapper script for $objdir/$outputname
-# Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION
-#
-# The $output program cannot be directly executed until all the libtool
-# libraries that it depends on are installed.
-#
-# This wrapper script should never be moved out of the build directory.
-# If it is, it will not operate correctly.
-
-# Sed substitution that helps us do robust quoting. It backslashifies
-# metacharacters that are still active within double-quoted strings.
-sed_quote_subst='$sed_quote_subst'
-
-# Be Bourne compatible
-if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then
- emulate sh
- NULLCMD=:
- # Zsh 3.x and 4.x performs word splitting on \${1+\"\$@\"}, which
- # is contrary to our usage. Disable this feature.
- alias -g '\${1+\"\$@\"}'='\"\$@\"'
- setopt NO_GLOB_SUBST
-else
- case \`(set -o) 2>/dev/null\` in *posix*) set -o posix;; esac
-fi
-BIN_SH=xpg4; export BIN_SH # for Tru64
-DUALCASE=1; export DUALCASE # for MKS sh
-
-# The HP-UX ksh and POSIX shell print the target directory to stdout
-# if CDPATH is set.
-(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
-
-relink_command=\"$relink_command\"
-
-# This environment variable determines our operation mode.
-if test \"\$libtool_install_magic\" = \"$magic\"; then
- # install mode needs the following variables:
- generated_by_libtool_version='$macro_version'
- notinst_deplibs='$notinst_deplibs'
-else
- # When we are sourced in execute mode, \$file and \$ECHO are already set.
- if test \"\$libtool_execute_magic\" != \"$magic\"; then
- file=\"\$0\""
-
- qECHO=`$ECHO "$ECHO" | $SED "$sed_quote_subst"`
- $ECHO "\
-
-# A function that is used when there is no print builtin or printf.
-func_fallback_echo ()
-{
- eval 'cat <<_LTECHO_EOF
-\$1
-_LTECHO_EOF'
-}
- ECHO=\"$qECHO\"
- fi
-
-# Very basic option parsing. These options are (a) specific to
-# the libtool wrapper, (b) are identical between the wrapper
-# /script/ and the wrapper /executable/ which is used only on
-# windows platforms, and (c) all begin with the string "--lt-"
-# (application programs are unlikely to have options which match
-# this pattern).
-#
-# There are only two supported options: --lt-debug and
-# --lt-dump-script. There is, deliberately, no --lt-help.
-#
-# The first argument to this parsing function should be the
-# script's $0 value, followed by "$@".
-lt_option_debug=
-func_parse_lt_options ()
-{
- lt_script_arg0=\$0
- shift
- for lt_opt
- do
- case \"\$lt_opt\" in
- --lt-debug) lt_option_debug=1 ;;
- --lt-dump-script)
- lt_dump_D=\`\$ECHO \"X\$lt_script_arg0\" | $SED -e 's/^X//' -e 's%/[^/]*$%%'\`
- test \"X\$lt_dump_D\" = \"X\$lt_script_arg0\" && lt_dump_D=.
- lt_dump_F=\`\$ECHO \"X\$lt_script_arg0\" | $SED -e 's/^X//' -e 's%^.*/%%'\`
- cat \"\$lt_dump_D/\$lt_dump_F\"
- exit 0
- ;;
- --lt-*)
- \$ECHO \"Unrecognized --lt- option: '\$lt_opt'\" 1>&2
- exit 1
- ;;
- esac
- done
-
- # Print the debug banner immediately:
- if test -n \"\$lt_option_debug\"; then
- echo \"${outputname}:${output}:\${LINENO}: libtool wrapper (GNU $PACKAGE$TIMESTAMP) $VERSION\" 1>&2
- fi
-}
-
-# Used when --lt-debug. Prints its arguments to stdout
-# (redirection is the responsibility of the caller)
-func_lt_dump_args ()
-{
- lt_dump_args_N=1;
- for lt_arg
- do
- \$ECHO \"${outputname}:${output}:\${LINENO}: newargv[\$lt_dump_args_N]: \$lt_arg\"
- lt_dump_args_N=\`expr \$lt_dump_args_N + 1\`
- done
-}
-
-# Core function for launching the target application
-func_exec_program_core ()
-{
-"
- case $host in
- # Backslashes separate directories on plain windows
- *-*-mingw | *-*-os2* | *-cegcc*)
- $ECHO "\
- if test -n \"\$lt_option_debug\"; then
- \$ECHO \"${outputname}:${output}:\${LINENO}: newargv[0]: \$progdir\\\\\$program\" 1>&2
- func_lt_dump_args \${1+\"\$@\"} 1>&2
- fi
- exec \"\$progdir\\\\\$program\" \${1+\"\$@\"}
-"
- ;;
-
- *)
- $ECHO "\
- if test -n \"\$lt_option_debug\"; then
- \$ECHO \"${outputname}:${output}:\${LINENO}: newargv[0]: \$progdir/\$program\" 1>&2
- func_lt_dump_args \${1+\"\$@\"} 1>&2
- fi
- exec \"\$progdir/\$program\" \${1+\"\$@\"}
-"
- ;;
- esac
- $ECHO "\
- \$ECHO \"\$0: cannot exec \$program \$*\" 1>&2
- exit 1
-}
-
-# A function to encapsulate launching the target application
-# Strips options in the --lt-* namespace from \$@ and
-# launches target application with the remaining arguments.
-func_exec_program ()
-{
- case \" \$* \" in
- *\\ --lt-*)
- for lt_wr_arg
- do
- case \$lt_wr_arg in
- --lt-*) ;;
- *) set x \"\$@\" \"\$lt_wr_arg\"; shift;;
- esac
- shift
- done ;;
- esac
- func_exec_program_core \${1+\"\$@\"}
-}
-
- # Parse options
- func_parse_lt_options \"\$0\" \${1+\"\$@\"}
-
- # Find the directory that this script lives in.
- thisdir=\`\$ECHO \"\$file\" | $SED 's%/[^/]*$%%'\`
- test \"x\$thisdir\" = \"x\$file\" && thisdir=.
-
- # Follow symbolic links until we get to the real thisdir.
- file=\`ls -ld \"\$file\" | $SED -n 's/.*-> //p'\`
- while test -n \"\$file\"; do
- destdir=\`\$ECHO \"\$file\" | $SED 's%/[^/]*\$%%'\`
-
- # If there was a directory component, then change thisdir.
- if test \"x\$destdir\" != \"x\$file\"; then
- case \"\$destdir\" in
- [\\\\/]* | [A-Za-z]:[\\\\/]*) thisdir=\"\$destdir\" ;;
- *) thisdir=\"\$thisdir/\$destdir\" ;;
- esac
- fi
-
- file=\`\$ECHO \"\$file\" | $SED 's%^.*/%%'\`
- file=\`ls -ld \"\$thisdir/\$file\" | $SED -n 's/.*-> //p'\`
- done
-
- # Usually 'no', except on cygwin/mingw when embedded into
- # the cwrapper.
- WRAPPER_SCRIPT_BELONGS_IN_OBJDIR=$func_emit_wrapper_arg1
- if test \"\$WRAPPER_SCRIPT_BELONGS_IN_OBJDIR\" = \"yes\"; then
- # special case for '.'
- if test \"\$thisdir\" = \".\"; then
- thisdir=\`pwd\`
- fi
- # remove .libs from thisdir
- case \"\$thisdir\" in
- *[\\\\/]$objdir ) thisdir=\`\$ECHO \"\$thisdir\" | $SED 's%[\\\\/][^\\\\/]*$%%'\` ;;
- $objdir ) thisdir=. ;;
- esac
- fi
-
- # Try to get the absolute directory name.
- absdir=\`cd \"\$thisdir\" && pwd\`
- test -n \"\$absdir\" && thisdir=\"\$absdir\"
-"
-
- if test "$fast_install" = yes; then
- $ECHO "\
- program=lt-'$outputname'$exeext
- progdir=\"\$thisdir/$objdir\"
-
- if test ! -f \"\$progdir/\$program\" ||
- { file=\`ls -1dt \"\$progdir/\$program\" \"\$progdir/../\$program\" 2>/dev/null | ${SED} 1q\`; \\
- test \"X\$file\" != \"X\$progdir/\$program\"; }; then
-
- file=\"\$\$-\$program\"
-
- if test ! -d \"\$progdir\"; then
- $MKDIR \"\$progdir\"
- else
- $RM \"\$progdir/\$file\"
- fi"
-
- $ECHO "\
-
- # relink executable if necessary
- if test -n \"\$relink_command\"; then
- if relink_command_output=\`eval \$relink_command 2>&1\`; then :
- else
- $ECHO \"\$relink_command_output\" >&2
- $RM \"\$progdir/\$file\"
- exit 1
- fi
- fi
-
- $MV \"\$progdir/\$file\" \"\$progdir/\$program\" 2>/dev/null ||
- { $RM \"\$progdir/\$program\";
- $MV \"\$progdir/\$file\" \"\$progdir/\$program\"; }
- $RM \"\$progdir/\$file\"
- fi"
- else
- $ECHO "\
- program='$outputname'
- progdir=\"\$thisdir/$objdir\"
-"
- fi
-
- $ECHO "\
-
- if test -f \"\$progdir/\$program\"; then"
-
- # fixup the dll searchpath if we need to.
- #
- # Fix the DLL searchpath if we need to. Do this before prepending
- # to shlibpath, because on Windows, both are PATH and uninstalled
- # libraries must come first.
- if test -n "$dllsearchpath"; then
- $ECHO "\
- # Add the dll search path components to the executable PATH
- PATH=$dllsearchpath:\$PATH
-"
- fi
-
- # Export our shlibpath_var if we have one.
- if test "$shlibpath_overrides_runpath" = yes && test -n "$shlibpath_var" && test -n "$temp_rpath"; then
- $ECHO "\
- # Add our own library path to $shlibpath_var
- $shlibpath_var=\"$temp_rpath\$$shlibpath_var\"
-
- # Some systems cannot cope with colon-terminated $shlibpath_var
- # The second colon is a workaround for a bug in BeOS R4 sed
- $shlibpath_var=\`\$ECHO \"\$$shlibpath_var\" | $SED 's/::*\$//'\`
-
- export $shlibpath_var
-"
- fi
-
- $ECHO "\
- if test \"\$libtool_execute_magic\" != \"$magic\"; then
- # Run the actual program with our arguments.
- func_exec_program \${1+\"\$@\"}
- fi
- else
- # The program doesn't exist.
- \$ECHO \"\$0: error: \\\`\$progdir/\$program' does not exist\" 1>&2
- \$ECHO \"This script is just a wrapper for \$program.\" 1>&2
- \$ECHO \"See the $PACKAGE documentation for more information.\" 1>&2
- exit 1
- fi
-fi\
-"
-}
-
-
-# func_emit_cwrapperexe_src
-# emit the source code for a wrapper executable on stdout
-# Must ONLY be called from within func_mode_link because
-# it depends on a number of variable set therein.
-func_emit_cwrapperexe_src ()
-{
- cat <<EOF
-
-/* $cwrappersource - temporary wrapper executable for $objdir/$outputname
- Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION
-
- The $output program cannot be directly executed until all the libtool
- libraries that it depends on are installed.
-
- This wrapper executable should never be moved out of the build directory.
- If it is, it will not operate correctly.
-*/
-EOF
- cat <<"EOF"
-#ifdef _MSC_VER
-# define _CRT_SECURE_NO_DEPRECATE 1
-#endif
-#include <stdio.h>
-#include <stdlib.h>
-#ifdef _MSC_VER
-# include <direct.h>
-# include <process.h>
-# include <io.h>
-#else
-# include <unistd.h>
-# include <stdint.h>
-# ifdef __CYGWIN__
-# include <io.h>
-# endif
-#endif
-#include <malloc.h>
-#include <stdarg.h>
-#include <assert.h>
-#include <string.h>
-#include <ctype.h>
-#include <errno.h>
-#include <fcntl.h>
-#include <sys/stat.h>
-
-/* declarations of non-ANSI functions */
-#if defined(__MINGW32__)
-# ifdef __STRICT_ANSI__
-int _putenv (const char *);
-# endif
-#elif defined(__CYGWIN__)
-# ifdef __STRICT_ANSI__
-char *realpath (const char *, char *);
-int putenv (char *);
-int setenv (const char *, const char *, int);
-# endif
-/* #elif defined (other platforms) ... */
-#endif
-
-/* portability defines, excluding path handling macros */
-#if defined(_MSC_VER)
-# define setmode _setmode
-# define stat _stat
-# define chmod _chmod
-# define getcwd _getcwd
-# define putenv _putenv
-# define S_IXUSR _S_IEXEC
-# ifndef _INTPTR_T_DEFINED
-# define _INTPTR_T_DEFINED
-# define intptr_t int
-# endif
-#elif defined(__MINGW32__)
-# define setmode _setmode
-# define stat _stat
-# define chmod _chmod
-# define getcwd _getcwd
-# define putenv _putenv
-#elif defined(__CYGWIN__)
-# define HAVE_SETENV
-# define FOPEN_WB "wb"
-/* #elif defined (other platforms) ... */
-#endif
-
-#if defined(PATH_MAX)
-# define LT_PATHMAX PATH_MAX
-#elif defined(MAXPATHLEN)
-# define LT_PATHMAX MAXPATHLEN
-#else
-# define LT_PATHMAX 1024
-#endif
-
-#ifndef S_IXOTH
-# define S_IXOTH 0
-#endif
-#ifndef S_IXGRP
-# define S_IXGRP 0
-#endif
-
-/* path handling portability macros */
-#ifndef DIR_SEPARATOR
-# define DIR_SEPARATOR '/'
-# define PATH_SEPARATOR ':'
-#endif
-
-#if defined (_WIN32) || defined (__MSDOS__) || defined (__DJGPP__) || \
- defined (__OS2__)
-# define HAVE_DOS_BASED_FILE_SYSTEM
-# define FOPEN_WB "wb"
-# ifndef DIR_SEPARATOR_2
-# define DIR_SEPARATOR_2 '\\'
-# endif
-# ifndef PATH_SEPARATOR_2
-# define PATH_SEPARATOR_2 ';'
-# endif
-#endif
-
-#ifndef DIR_SEPARATOR_2
-# define IS_DIR_SEPARATOR(ch) ((ch) == DIR_SEPARATOR)
-#else /* DIR_SEPARATOR_2 */
-# define IS_DIR_SEPARATOR(ch) \
- (((ch) == DIR_SEPARATOR) || ((ch) == DIR_SEPARATOR_2))
-#endif /* DIR_SEPARATOR_2 */
-
-#ifndef PATH_SEPARATOR_2
-# define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR)
-#else /* PATH_SEPARATOR_2 */
-# define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR_2)
-#endif /* PATH_SEPARATOR_2 */
-
-#ifndef FOPEN_WB
-# define FOPEN_WB "w"
-#endif
-#ifndef _O_BINARY
-# define _O_BINARY 0
-#endif
-
-#define XMALLOC(type, num) ((type *) xmalloc ((num) * sizeof(type)))
-#define XFREE(stale) do { \
- if (stale) { free ((void *) stale); stale = 0; } \
-} while (0)
-
-#if defined(LT_DEBUGWRAPPER)
-static int lt_debug = 1;
-#else
-static int lt_debug = 0;
-#endif
-
-const char *program_name = "libtool-wrapper"; /* in case xstrdup fails */
-
-void *xmalloc (size_t num);
-char *xstrdup (const char *string);
-const char *base_name (const char *name);
-char *find_executable (const char *wrapper);
-char *chase_symlinks (const char *pathspec);
-int make_executable (const char *path);
-int check_executable (const char *path);
-char *strendzap (char *str, const char *pat);
-void lt_debugprintf (const char *file, int line, const char *fmt, ...);
-void lt_fatal (const char *file, int line, const char *message, ...);
-static const char *nonnull (const char *s);
-static const char *nonempty (const char *s);
-void lt_setenv (const char *name, const char *value);
-char *lt_extend_str (const char *orig_value, const char *add, int to_end);
-void lt_update_exe_path (const char *name, const char *value);
-void lt_update_lib_path (const char *name, const char *value);
-char **prepare_spawn (char **argv);
-void lt_dump_script (FILE *f);
-EOF
-
- cat <<EOF
-volatile const char * MAGIC_EXE = "$magic_exe";
-const char * LIB_PATH_VARNAME = "$shlibpath_var";
-EOF
-
- if test "$shlibpath_overrides_runpath" = yes && test -n "$shlibpath_var" && test -n "$temp_rpath"; then
- func_to_host_path "$temp_rpath"
- cat <<EOF
-const char * LIB_PATH_VALUE = "$func_to_host_path_result";
-EOF
- else
- cat <<"EOF"
-const char * LIB_PATH_VALUE = "";
-EOF
- fi
-
- if test -n "$dllsearchpath"; then
- func_to_host_path "$dllsearchpath:"
- cat <<EOF
-const char * EXE_PATH_VARNAME = "PATH";
-const char * EXE_PATH_VALUE = "$func_to_host_path_result";
-EOF
- else
- cat <<"EOF"
-const char * EXE_PATH_VARNAME = "";
-const char * EXE_PATH_VALUE = "";
-EOF
- fi
-
- if test "$fast_install" = yes; then
- cat <<EOF
-const char * TARGET_PROGRAM_NAME = "lt-$outputname"; /* hopefully, no .exe */
-EOF
- else
- cat <<EOF
-const char * TARGET_PROGRAM_NAME = "$outputname"; /* hopefully, no .exe */
-EOF
- fi
-
-
- cat <<"EOF"
-
-#define LTWRAPPER_OPTION_PREFIX "--lt-"
-
-static const char *ltwrapper_option_prefix = LTWRAPPER_OPTION_PREFIX;
-static const char *dumpscript_opt = LTWRAPPER_OPTION_PREFIX "dump-script";
-static const char *debug_opt = LTWRAPPER_OPTION_PREFIX "debug";
-
-int
-main (int argc, char *argv[])
-{
- char **newargz;
- int newargc;
- char *tmp_pathspec;
- char *actual_cwrapper_path;
- char *actual_cwrapper_name;
- char *target_name;
- char *lt_argv_zero;
- intptr_t rval = 127;
-
- int i;
-
- program_name = (char *) xstrdup (base_name (argv[0]));
- newargz = XMALLOC (char *, argc + 1);
-
- /* very simple arg parsing; don't want to rely on getopt
- * also, copy all non cwrapper options to newargz, except
- * argz[0], which is handled differently
- */
- newargc=0;
- for (i = 1; i < argc; i++)
- {
- if (strcmp (argv[i], dumpscript_opt) == 0)
- {
-EOF
- case "$host" in
- *mingw* | *cygwin* )
- # make stdout use "unix" line endings
- echo " setmode(1,_O_BINARY);"
- ;;
- esac
-
- cat <<"EOF"
- lt_dump_script (stdout);
- return 0;
- }
- if (strcmp (argv[i], debug_opt) == 0)
- {
- lt_debug = 1;
- continue;
- }
- if (strcmp (argv[i], ltwrapper_option_prefix) == 0)
- {
- /* however, if there is an option in the LTWRAPPER_OPTION_PREFIX
- namespace, but it is not one of the ones we know about and
- have already dealt with, above (inluding dump-script), then
- report an error. Otherwise, targets might begin to believe
- they are allowed to use options in the LTWRAPPER_OPTION_PREFIX
- namespace. The first time any user complains about this, we'll
- need to make LTWRAPPER_OPTION_PREFIX a configure-time option
- or a configure.ac-settable value.
- */
- lt_fatal (__FILE__, __LINE__,
- "unrecognized %s option: '%s'",
- ltwrapper_option_prefix, argv[i]);
- }
- /* otherwise ... */
- newargz[++newargc] = xstrdup (argv[i]);
- }
- newargz[++newargc] = NULL;
-
-EOF
- cat <<EOF
- /* The GNU banner must be the first non-error debug message */
- lt_debugprintf (__FILE__, __LINE__, "libtool wrapper (GNU $PACKAGE$TIMESTAMP) $VERSION\n");
-EOF
- cat <<"EOF"
- lt_debugprintf (__FILE__, __LINE__, "(main) argv[0]: %s\n", argv[0]);
- lt_debugprintf (__FILE__, __LINE__, "(main) program_name: %s\n", program_name);
-
- tmp_pathspec = find_executable (argv[0]);
- if (tmp_pathspec == NULL)
- lt_fatal (__FILE__, __LINE__, "couldn't find %s", argv[0]);
- lt_debugprintf (__FILE__, __LINE__,
- "(main) found exe (before symlink chase) at: %s\n",
- tmp_pathspec);
-
- actual_cwrapper_path = chase_symlinks (tmp_pathspec);
- lt_debugprintf (__FILE__, __LINE__,
- "(main) found exe (after symlink chase) at: %s\n",
- actual_cwrapper_path);
- XFREE (tmp_pathspec);
-
- actual_cwrapper_name = xstrdup (base_name (actual_cwrapper_path));
- strendzap (actual_cwrapper_path, actual_cwrapper_name);
-
- /* wrapper name transforms */
- strendzap (actual_cwrapper_name, ".exe");
- tmp_pathspec = lt_extend_str (actual_cwrapper_name, ".exe", 1);
- XFREE (actual_cwrapper_name);
- actual_cwrapper_name = tmp_pathspec;
- tmp_pathspec = 0;
-
- /* target_name transforms -- use actual target program name; might have lt- prefix */
- target_name = xstrdup (base_name (TARGET_PROGRAM_NAME));
- strendzap (target_name, ".exe");
- tmp_pathspec = lt_extend_str (target_name, ".exe", 1);
- XFREE (target_name);
- target_name = tmp_pathspec;
- tmp_pathspec = 0;
-
- lt_debugprintf (__FILE__, __LINE__,
- "(main) libtool target name: %s\n",
- target_name);
-EOF
-
- cat <<EOF
- newargz[0] =
- XMALLOC (char, (strlen (actual_cwrapper_path) +
- strlen ("$objdir") + 1 + strlen (actual_cwrapper_name) + 1));
- strcpy (newargz[0], actual_cwrapper_path);
- strcat (newargz[0], "$objdir");
- strcat (newargz[0], "/");
-EOF
-
- cat <<"EOF"
- /* stop here, and copy so we don't have to do this twice */
- tmp_pathspec = xstrdup (newargz[0]);
-
- /* do NOT want the lt- prefix here, so use actual_cwrapper_name */
- strcat (newargz[0], actual_cwrapper_name);
-
- /* DO want the lt- prefix here if it exists, so use target_name */
- lt_argv_zero = lt_extend_str (tmp_pathspec, target_name, 1);
- XFREE (tmp_pathspec);
- tmp_pathspec = NULL;
-EOF
-
- case $host_os in
- mingw*)
- cat <<"EOF"
- {
- char* p;
- while ((p = strchr (newargz[0], '\\')) != NULL)
- {
- *p = '/';
- }
- while ((p = strchr (lt_argv_zero, '\\')) != NULL)
- {
- *p = '/';
- }
- }
-EOF
- ;;
- esac
-
- cat <<"EOF"
- XFREE (target_name);
- XFREE (actual_cwrapper_path);
- XFREE (actual_cwrapper_name);
-
- lt_setenv ("BIN_SH", "xpg4"); /* for Tru64 */
- lt_setenv ("DUALCASE", "1"); /* for MSK sh */
- /* Update the DLL searchpath. EXE_PATH_VALUE ($dllsearchpath) must
- be prepended before (that is, appear after) LIB_PATH_VALUE ($temp_rpath)
- because on Windows, both *_VARNAMEs are PATH but uninstalled
- libraries must come first. */
- lt_update_exe_path (EXE_PATH_VARNAME, EXE_PATH_VALUE);
- lt_update_lib_path (LIB_PATH_VARNAME, LIB_PATH_VALUE);
-
- lt_debugprintf (__FILE__, __LINE__, "(main) lt_argv_zero: %s\n",
- nonnull (lt_argv_zero));
- for (i = 0; i < newargc; i++)
- {
- lt_debugprintf (__FILE__, __LINE__, "(main) newargz[%d]: %s\n",
- i, nonnull (newargz[i]));
- }
-
-EOF
-
- case $host_os in
- mingw*)
- cat <<"EOF"
- /* execv doesn't actually work on mingw as expected on unix */
- newargz = prepare_spawn (newargz);
- rval = _spawnv (_P_WAIT, lt_argv_zero, (const char * const *) newargz);
- if (rval == -1)
- {
- /* failed to start process */
- lt_debugprintf (__FILE__, __LINE__,
- "(main) failed to launch target \"%s\": %s\n",
- lt_argv_zero, nonnull (strerror (errno)));
- return 127;
- }
- return rval;
-EOF
- ;;
- *)
- cat <<"EOF"
- execv (lt_argv_zero, newargz);
- return rval; /* =127, but avoids unused variable warning */
-EOF
- ;;
- esac
-
- cat <<"EOF"
-}
-
-void *
-xmalloc (size_t num)
-{
- void *p = (void *) malloc (num);
- if (!p)
- lt_fatal (__FILE__, __LINE__, "memory exhausted");
-
- return p;
-}
-
-char *
-xstrdup (const char *string)
-{
- return string ? strcpy ((char *) xmalloc (strlen (string) + 1),
- string) : NULL;
-}
-
-const char *
-base_name (const char *name)
-{
- const char *base;
-
-#if defined (HAVE_DOS_BASED_FILE_SYSTEM)
- /* Skip over the disk name in MSDOS pathnames. */
- if (isalpha ((unsigned char) name[0]) && name[1] == ':')
- name += 2;
-#endif
-
- for (base = name; *name; name++)
- if (IS_DIR_SEPARATOR (*name))
- base = name + 1;
- return base;
-}
-
-int
-check_executable (const char *path)
-{
- struct stat st;
-
- lt_debugprintf (__FILE__, __LINE__, "(check_executable): %s\n",
- nonempty (path));
- if ((!path) || (!*path))
- return 0;
-
- if ((stat (path, &st) >= 0)
- && (st.st_mode & (S_IXUSR | S_IXGRP | S_IXOTH)))
- return 1;
- else
- return 0;
-}
-
-int
-make_executable (const char *path)
-{
- int rval = 0;
- struct stat st;
-
- lt_debugprintf (__FILE__, __LINE__, "(make_executable): %s\n",
- nonempty (path));
- if ((!path) || (!*path))
- return 0;
-
- if (stat (path, &st) >= 0)
- {
- rval = chmod (path, st.st_mode | S_IXOTH | S_IXGRP | S_IXUSR);
- }
- return rval;
-}
-
-/* Searches for the full path of the wrapper. Returns
- newly allocated full path name if found, NULL otherwise
- Does not chase symlinks, even on platforms that support them.
-*/
-char *
-find_executable (const char *wrapper)
-{
- int has_slash = 0;
- const char *p;
- const char *p_next;
- /* static buffer for getcwd */
- char tmp[LT_PATHMAX + 1];
- int tmp_len;
- char *concat_name;
-
- lt_debugprintf (__FILE__, __LINE__, "(find_executable): %s\n",
- nonempty (wrapper));
-
- if ((wrapper == NULL) || (*wrapper == '\0'))
- return NULL;
-
- /* Absolute path? */
-#if defined (HAVE_DOS_BASED_FILE_SYSTEM)
- if (isalpha ((unsigned char) wrapper[0]) && wrapper[1] == ':')
- {
- concat_name = xstrdup (wrapper);
- if (check_executable (concat_name))
- return concat_name;
- XFREE (concat_name);
- }
- else
- {
-#endif
- if (IS_DIR_SEPARATOR (wrapper[0]))
- {
- concat_name = xstrdup (wrapper);
- if (check_executable (concat_name))
- return concat_name;
- XFREE (concat_name);
- }
-#if defined (HAVE_DOS_BASED_FILE_SYSTEM)
- }
-#endif
-
- for (p = wrapper; *p; p++)
- if (*p == '/')
- {
- has_slash = 1;
- break;
- }
- if (!has_slash)
- {
- /* no slashes; search PATH */
- const char *path = getenv ("PATH");
- if (path != NULL)
- {
- for (p = path; *p; p = p_next)
- {
- const char *q;
- size_t p_len;
- for (q = p; *q; q++)
- if (IS_PATH_SEPARATOR (*q))
- break;
- p_len = q - p;
- p_next = (*q == '\0' ? q : q + 1);
- if (p_len == 0)
- {
- /* empty path: current directory */
- if (getcwd (tmp, LT_PATHMAX) == NULL)
- lt_fatal (__FILE__, __LINE__, "getcwd failed: %s",
- nonnull (strerror (errno)));
- tmp_len = strlen (tmp);
- concat_name =
- XMALLOC (char, tmp_len + 1 + strlen (wrapper) + 1);
- memcpy (concat_name, tmp, tmp_len);
- concat_name[tmp_len] = '/';
- strcpy (concat_name + tmp_len + 1, wrapper);
- }
- else
- {
- concat_name =
- XMALLOC (char, p_len + 1 + strlen (wrapper) + 1);
- memcpy (concat_name, p, p_len);
- concat_name[p_len] = '/';
- strcpy (concat_name + p_len + 1, wrapper);
- }
- if (check_executable (concat_name))
- return concat_name;
- XFREE (concat_name);
- }
- }
- /* not found in PATH; assume curdir */
- }
- /* Relative path | not found in path: prepend cwd */
- if (getcwd (tmp, LT_PATHMAX) == NULL)
- lt_fatal (__FILE__, __LINE__, "getcwd failed: %s",
- nonnull (strerror (errno)));
- tmp_len = strlen (tmp);
- concat_name = XMALLOC (char, tmp_len + 1 + strlen (wrapper) + 1);
- memcpy (concat_name, tmp, tmp_len);
- concat_name[tmp_len] = '/';
- strcpy (concat_name + tmp_len + 1, wrapper);
-
- if (check_executable (concat_name))
- return concat_name;
- XFREE (concat_name);
- return NULL;
-}
-
-char *
-chase_symlinks (const char *pathspec)
-{
-#ifndef S_ISLNK
- return xstrdup (pathspec);
-#else
- char buf[LT_PATHMAX];
- struct stat s;
- char *tmp_pathspec = xstrdup (pathspec);
- char *p;
- int has_symlinks = 0;
- while (strlen (tmp_pathspec) && !has_symlinks)
- {
- lt_debugprintf (__FILE__, __LINE__,
- "checking path component for symlinks: %s\n",
- tmp_pathspec);
- if (lstat (tmp_pathspec, &s) == 0)
- {
- if (S_ISLNK (s.st_mode) != 0)
- {
- has_symlinks = 1;
- break;
- }
-
- /* search backwards for last DIR_SEPARATOR */
- p = tmp_pathspec + strlen (tmp_pathspec) - 1;
- while ((p > tmp_pathspec) && (!IS_DIR_SEPARATOR (*p)))
- p--;
- if ((p == tmp_pathspec) && (!IS_DIR_SEPARATOR (*p)))
- {
- /* no more DIR_SEPARATORS left */
- break;
- }
- *p = '\0';
- }
- else
- {
- lt_fatal (__FILE__, __LINE__,
- "error accessing file \"%s\": %s",
- tmp_pathspec, nonnull (strerror (errno)));
- }
- }
- XFREE (tmp_pathspec);
-
- if (!has_symlinks)
- {
- return xstrdup (pathspec);
- }
-
- tmp_pathspec = realpath (pathspec, buf);
- if (tmp_pathspec == 0)
- {
- lt_fatal (__FILE__, __LINE__,
- "could not follow symlinks for %s", pathspec);
- }
- return xstrdup (tmp_pathspec);
-#endif
-}
-
-char *
-strendzap (char *str, const char *pat)
-{
- size_t len, patlen;
-
- assert (str != NULL);
- assert (pat != NULL);
-
- len = strlen (str);
- patlen = strlen (pat);
-
- if (patlen <= len)
- {
- str += len - patlen;
- if (strcmp (str, pat) == 0)
- *str = '\0';
- }
- return str;
-}
-
-void
-lt_debugprintf (const char *file, int line, const char *fmt, ...)
-{
- va_list args;
- if (lt_debug)
- {
- (void) fprintf (stderr, "%s:%s:%d: ", program_name, file, line);
- va_start (args, fmt);
- (void) vfprintf (stderr, fmt, args);
- va_end (args);
- }
-}
-
-static void
-lt_error_core (int exit_status, const char *file,
- int line, const char *mode,
- const char *message, va_list ap)
-{
- fprintf (stderr, "%s:%s:%d: %s: ", program_name, file, line, mode);
- vfprintf (stderr, message, ap);
- fprintf (stderr, ".\n");
-
- if (exit_status >= 0)
- exit (exit_status);
-}
-
-void
-lt_fatal (const char *file, int line, const char *message, ...)
-{
- va_list ap;
- va_start (ap, message);
- lt_error_core (EXIT_FAILURE, file, line, "FATAL", message, ap);
- va_end (ap);
-}
-
-static const char *
-nonnull (const char *s)
-{
- return s ? s : "(null)";
-}
-
-static const char *
-nonempty (const char *s)
-{
- return (s && !*s) ? "(empty)" : nonnull (s);
-}
-
-void
-lt_setenv (const char *name, const char *value)
-{
- lt_debugprintf (__FILE__, __LINE__,
- "(lt_setenv) setting '%s' to '%s'\n",
- nonnull (name), nonnull (value));
- {
-#ifdef HAVE_SETENV
- /* always make a copy, for consistency with !HAVE_SETENV */
- char *str = xstrdup (value);
- setenv (name, str, 1);
-#else
- int len = strlen (name) + 1 + strlen (value) + 1;
- char *str = XMALLOC (char, len);
- sprintf (str, "%s=%s", name, value);
- if (putenv (str) != EXIT_SUCCESS)
- {
- XFREE (str);
- }
-#endif
- }
-}
-
-char *
-lt_extend_str (const char *orig_value, const char *add, int to_end)
-{
- char *new_value;
- if (orig_value && *orig_value)
- {
- int orig_value_len = strlen (orig_value);
- int add_len = strlen (add);
- new_value = XMALLOC (char, add_len + orig_value_len + 1);
- if (to_end)
- {
- strcpy (new_value, orig_value);
- strcpy (new_value + orig_value_len, add);
- }
- else
- {
- strcpy (new_value, add);
- strcpy (new_value + add_len, orig_value);
- }
- }
- else
- {
- new_value = xstrdup (add);
- }
- return new_value;
-}
-
-void
-lt_update_exe_path (const char *name, const char *value)
-{
- lt_debugprintf (__FILE__, __LINE__,
- "(lt_update_exe_path) modifying '%s' by prepending '%s'\n",
- nonnull (name), nonnull (value));
-
- if (name && *name && value && *value)
- {
- char *new_value = lt_extend_str (getenv (name), value, 0);
- /* some systems can't cope with a ':'-terminated path #' */
- int len = strlen (new_value);
- while (((len = strlen (new_value)) > 0) && IS_PATH_SEPARATOR (new_value[len-1]))
- {
- new_value[len-1] = '\0';
- }
- lt_setenv (name, new_value);
- XFREE (new_value);
- }
-}
-
-void
-lt_update_lib_path (const char *name, const char *value)
-{
- lt_debugprintf (__FILE__, __LINE__,
- "(lt_update_lib_path) modifying '%s' by prepending '%s'\n",
- nonnull (name), nonnull (value));
-
- if (name && *name && value && *value)
- {
- char *new_value = lt_extend_str (getenv (name), value, 0);
- lt_setenv (name, new_value);
- XFREE (new_value);
- }
-}
-
-EOF
- case $host_os in
- mingw*)
- cat <<"EOF"
-
-/* Prepares an argument vector before calling spawn().
- Note that spawn() does not by itself call the command interpreter
- (getenv ("COMSPEC") != NULL ? getenv ("COMSPEC") :
- ({ OSVERSIONINFO v; v.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
- GetVersionEx(&v);
- v.dwPlatformId == VER_PLATFORM_WIN32_NT;
- }) ? "cmd.exe" : "command.com").
- Instead it simply concatenates the arguments, separated by ' ', and calls
- CreateProcess(). We must quote the arguments since Win32 CreateProcess()
- interprets characters like ' ', '\t', '\\', '"' (but not '<' and '>') in a
- special way:
- - Space and tab are interpreted as delimiters. They are not treated as
- delimiters if they are surrounded by double quotes: "...".
- - Unescaped double quotes are removed from the input. Their only effect is
- that within double quotes, space and tab are treated like normal
- characters.
- - Backslashes not followed by double quotes are not special.
- - But 2*n+1 backslashes followed by a double quote become
- n backslashes followed by a double quote (n >= 0):
- \" -> "
- \\\" -> \"
- \\\\\" -> \\"
- */
-#define SHELL_SPECIAL_CHARS "\"\\ \001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037"
-#define SHELL_SPACE_CHARS " \001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037"
-char **
-prepare_spawn (char **argv)
-{
- size_t argc;
- char **new_argv;
- size_t i;
-
- /* Count number of arguments. */
- for (argc = 0; argv[argc] != NULL; argc++)
- ;
-
- /* Allocate new argument vector. */
- new_argv = XMALLOC (char *, argc + 1);
-
- /* Put quoted arguments into the new argument vector. */
- for (i = 0; i < argc; i++)
- {
- const char *string = argv[i];
-
- if (string[0] == '\0')
- new_argv[i] = xstrdup ("\"\"");
- else if (strpbrk (string, SHELL_SPECIAL_CHARS) != NULL)
- {
- int quote_around = (strpbrk (string, SHELL_SPACE_CHARS) != NULL);
- size_t length;
- unsigned int backslashes;
- const char *s;
- char *quoted_string;
- char *p;
-
- length = 0;
- backslashes = 0;
- if (quote_around)
- length++;
- for (s = string; *s != '\0'; s++)
- {
- char c = *s;
- if (c == '"')
- length += backslashes + 1;
- length++;
- if (c == '\\')
- backslashes++;
- else
- backslashes = 0;
- }
- if (quote_around)
- length += backslashes + 1;
-
- quoted_string = XMALLOC (char, length + 1);
-
- p = quoted_string;
- backslashes = 0;
- if (quote_around)
- *p++ = '"';
- for (s = string; *s != '\0'; s++)
- {
- char c = *s;
- if (c == '"')
- {
- unsigned int j;
- for (j = backslashes + 1; j > 0; j--)
- *p++ = '\\';
- }
- *p++ = c;
- if (c == '\\')
- backslashes++;
- else
- backslashes = 0;
- }
- if (quote_around)
- {
- unsigned int j;
- for (j = backslashes; j > 0; j--)
- *p++ = '\\';
- *p++ = '"';
- }
- *p = '\0';
-
- new_argv[i] = quoted_string;
- }
- else
- new_argv[i] = (char *) string;
- }
- new_argv[argc] = NULL;
-
- return new_argv;
-}
-EOF
- ;;
- esac
-
- cat <<"EOF"
-void lt_dump_script (FILE* f)
-{
-EOF
- func_emit_wrapper yes |
- $SED -n -e '
-s/^\(.\{79\}\)\(..*\)/\1\
-\2/
-h
-s/\([\\"]\)/\\\1/g
-s/$/\\n/
-s/\([^\n]*\).*/ fputs ("\1", f);/p
-g
-D'
- cat <<"EOF"
-}
-EOF
-}
-# end: func_emit_cwrapperexe_src
-
-# func_win32_import_lib_p ARG
-# True if ARG is an import lib, as indicated by $file_magic_cmd
-func_win32_import_lib_p ()
-{
- $opt_debug
- case `eval $file_magic_cmd \"\$1\" 2>/dev/null | $SED -e 10q` in
- *import*) : ;;
- *) false ;;
- esac
-}
-
-# func_mode_link arg...
-func_mode_link ()
-{
- $opt_debug
- case $host in
- *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*)
- # It is impossible to link a dll without this setting, and
- # we shouldn't force the makefile maintainer to figure out
- # which system we are compiling for in order to pass an extra
- # flag for every libtool invocation.
- # allow_undefined=no
-
- # FIXME: Unfortunately, there are problems with the above when trying
- # to make a dll which has undefined symbols, in which case not
- # even a static library is built. For now, we need to specify
- # -no-undefined on the libtool link line when we can be certain
- # that all symbols are satisfied, otherwise we get a static library.
- allow_undefined=yes
- ;;
- *)
- allow_undefined=yes
- ;;
- esac
- libtool_args=$nonopt
- base_compile="$nonopt $@"
- compile_command=$nonopt
- finalize_command=$nonopt
-
- compile_rpath=
- finalize_rpath=
- compile_shlibpath=
- finalize_shlibpath=
- convenience=
- old_convenience=
- deplibs=
- old_deplibs=
- compiler_flags=
- linker_flags=
- dllsearchpath=
- lib_search_path=`pwd`
- inst_prefix_dir=
- new_inherited_linker_flags=
-
- avoid_version=no
- bindir=
- dlfiles=
- dlprefiles=
- dlself=no
- export_dynamic=no
- export_symbols=
- export_symbols_regex=
- generated=
- libobjs=
- ltlibs=
- module=no
- no_install=no
- objs=
- non_pic_objects=
- precious_files_regex=
- prefer_static_libs=no
- preload=no
- prev=
- prevarg=
- release=
- rpath=
- xrpath=
- perm_rpath=
- temp_rpath=
- thread_safe=no
- vinfo=
- vinfo_number=no
- weak_libs=
- single_module="${wl}-single_module"
- func_infer_tag $base_compile
-
- # We need to know -static, to get the right output filenames.
- for arg
- do
- case $arg in
- -shared)
- test "$build_libtool_libs" != yes && \
- func_fatal_configuration "can not build a shared library"
- build_old_libs=no
- break
- ;;
- -all-static | -static | -static-libtool-libs)
- case $arg in
- -all-static)
- if test "$build_libtool_libs" = yes && test -z "$link_static_flag"; then
- func_warning "complete static linking is impossible in this configuration"
- fi
- if test -n "$link_static_flag"; then
- dlopen_self=$dlopen_self_static
- fi
- prefer_static_libs=yes
- ;;
- -static)
- if test -z "$pic_flag" && test -n "$link_static_flag"; then
- dlopen_self=$dlopen_self_static
- fi
- prefer_static_libs=built
- ;;
- -static-libtool-libs)
- if test -z "$pic_flag" && test -n "$link_static_flag"; then
- dlopen_self=$dlopen_self_static
- fi
- prefer_static_libs=yes
- ;;
- esac
- build_libtool_libs=no
- build_old_libs=yes
- break
- ;;
- esac
- done
-
- # See if our shared archives depend on static archives.
- test -n "$old_archive_from_new_cmds" && build_old_libs=yes
-
- # Go through the arguments, transforming them on the way.
- while test "$#" -gt 0; do
- arg="$1"
- shift
- func_quote_for_eval "$arg"
- qarg=$func_quote_for_eval_unquoted_result
- func_append libtool_args " $func_quote_for_eval_result"
-
- # If the previous option needs an argument, assign it.
- if test -n "$prev"; then
- case $prev in
- output)
- func_append compile_command " @OUTPUT@"
- func_append finalize_command " @OUTPUT@"
- ;;
- esac
-
- case $prev in
- bindir)
- bindir="$arg"
- prev=
- continue
- ;;
- dlfiles|dlprefiles)
- if test "$preload" = no; then
- # Add the symbol object into the linking commands.
- func_append compile_command " @SYMFILE@"
- func_append finalize_command " @SYMFILE@"
- preload=yes
- fi
- case $arg in
- *.la | *.lo) ;; # We handle these cases below.
- force)
- if test "$dlself" = no; then
- dlself=needless
- export_dynamic=yes
- fi
- prev=
- continue
- ;;
- self)
- if test "$prev" = dlprefiles; then
- dlself=yes
- elif test "$prev" = dlfiles && test "$dlopen_self" != yes; then
- dlself=yes
- else
- dlself=needless
- export_dynamic=yes
- fi
- prev=
- continue
- ;;
- *)
- if test "$prev" = dlfiles; then
- func_append dlfiles " $arg"
- else
- func_append dlprefiles " $arg"
- fi
- prev=
- continue
- ;;
- esac
- ;;
- expsyms)
- export_symbols="$arg"
- test -f "$arg" \
- || func_fatal_error "symbol file \`$arg' does not exist"
- prev=
- continue
- ;;
- expsyms_regex)
- export_symbols_regex="$arg"
- prev=
- continue
- ;;
- framework)
- case $host in
- *-*-darwin*)
- case "$deplibs " in
- *" $qarg.ltframework "*) ;;
- *) func_append deplibs " $qarg.ltframework" # this is fixed later
- ;;
- esac
- ;;
- esac
- prev=
- continue
- ;;
- inst_prefix)
- inst_prefix_dir="$arg"
- prev=
- continue
- ;;
- objectlist)
- if test -f "$arg"; then
- save_arg=$arg
- moreargs=
- for fil in `cat "$save_arg"`
- do
-# func_append moreargs " $fil"
- arg=$fil
- # A libtool-controlled object.
-
- # Check to see that this really is a libtool object.
- if func_lalib_unsafe_p "$arg"; then
- pic_object=
- non_pic_object=
-
- # Read the .lo file
- func_source "$arg"
-
- if test -z "$pic_object" ||
- test -z "$non_pic_object" ||
- test "$pic_object" = none &&
- test "$non_pic_object" = none; then
- func_fatal_error "cannot find name of object for \`$arg'"
- fi
-
- # Extract subdirectory from the argument.
- func_dirname "$arg" "/" ""
- xdir="$func_dirname_result"
-
- if test "$pic_object" != none; then
- # Prepend the subdirectory the object is found in.
- pic_object="$xdir$pic_object"
-
- if test "$prev" = dlfiles; then
- if test "$build_libtool_libs" = yes && test "$dlopen_support" = yes; then
- func_append dlfiles " $pic_object"
- prev=
- continue
- else
- # If libtool objects are unsupported, then we need to preload.
- prev=dlprefiles
- fi
- fi
-
- # CHECK ME: I think I busted this. -Ossama
- if test "$prev" = dlprefiles; then
- # Preload the old-style object.
- func_append dlprefiles " $pic_object"
- prev=
- fi
-
- # A PIC object.
- func_append libobjs " $pic_object"
- arg="$pic_object"
- fi
-
- # Non-PIC object.
- if test "$non_pic_object" != none; then
- # Prepend the subdirectory the object is found in.
- non_pic_object="$xdir$non_pic_object"
-
- # A standard non-PIC object
- func_append non_pic_objects " $non_pic_object"
- if test -z "$pic_object" || test "$pic_object" = none ; then
- arg="$non_pic_object"
- fi
- else
- # If the PIC object exists, use it instead.
- # $xdir was prepended to $pic_object above.
- non_pic_object="$pic_object"
- func_append non_pic_objects " $non_pic_object"
- fi
- else
- # Only an error if not doing a dry-run.
- if $opt_dry_run; then
- # Extract subdirectory from the argument.
- func_dirname "$arg" "/" ""
- xdir="$func_dirname_result"
-
- func_lo2o "$arg"
- pic_object=$xdir$objdir/$func_lo2o_result
- non_pic_object=$xdir$func_lo2o_result
- func_append libobjs " $pic_object"
- func_append non_pic_objects " $non_pic_object"
- else
- func_fatal_error "\`$arg' is not a valid libtool object"
- fi
- fi
- done
- else
- func_fatal_error "link input file \`$arg' does not exist"
- fi
- arg=$save_arg
- prev=
- continue
- ;;
- precious_regex)
- precious_files_regex="$arg"
- prev=
- continue
- ;;
- release)
- release="-$arg"
- prev=
- continue
- ;;
- rpath | xrpath)
- # We need an absolute path.
- case $arg in
- [\\/]* | [A-Za-z]:[\\/]*) ;;
- *)
- func_fatal_error "only absolute run-paths are allowed"
- ;;
- esac
- if test "$prev" = rpath; then
- case "$rpath " in
- *" $arg "*) ;;
- *) func_append rpath " $arg" ;;
- esac
- else
- case "$xrpath " in
- *" $arg "*) ;;
- *) func_append xrpath " $arg" ;;
- esac
- fi
- prev=
- continue
- ;;
- shrext)
- shrext_cmds="$arg"
- prev=
- continue
- ;;
- weak)
- func_append weak_libs " $arg"
- prev=
- continue
- ;;
- xcclinker)
- func_append linker_flags " $qarg"
- func_append compiler_flags " $qarg"
- prev=
- func_append compile_command " $qarg"
- func_append finalize_command " $qarg"
- continue
- ;;
- xcompiler)
- func_append compiler_flags " $qarg"
- prev=
- func_append compile_command " $qarg"
- func_append finalize_command " $qarg"
- continue
- ;;
- xlinker)
- func_append linker_flags " $qarg"
- func_append compiler_flags " $wl$qarg"
- prev=
- func_append compile_command " $wl$qarg"
- func_append finalize_command " $wl$qarg"
- continue
- ;;
- *)
- eval "$prev=\"\$arg\""
- prev=
- continue
- ;;
- esac
- fi # test -n "$prev"
-
- prevarg="$arg"
-
- case $arg in
- -all-static)
- if test -n "$link_static_flag"; then
- # See comment for -static flag below, for more details.
- func_append compile_command " $link_static_flag"
- func_append finalize_command " $link_static_flag"
- fi
- continue
- ;;
-
- -allow-undefined)
- # FIXME: remove this flag sometime in the future.
- func_fatal_error "\`-allow-undefined' must not be used because it is the default"
- ;;
-
- -avoid-version)
- avoid_version=yes
- continue
- ;;
-
- -bindir)
- prev=bindir
- continue
- ;;
-
- -dlopen)
- prev=dlfiles
- continue
- ;;
-
- -dlpreopen)
- prev=dlprefiles
- continue
- ;;
-
- -export-dynamic)
- export_dynamic=yes
- continue
- ;;
-
- -export-symbols | -export-symbols-regex)
- if test -n "$export_symbols" || test -n "$export_symbols_regex"; then
- func_fatal_error "more than one -exported-symbols argument is not allowed"
- fi
- if test "X$arg" = "X-export-symbols"; then
- prev=expsyms
- else
- prev=expsyms_regex
- fi
- continue
- ;;
-
- -framework)
- prev=framework
- continue
- ;;
-
- -inst-prefix-dir)
- prev=inst_prefix
- continue
- ;;
-
- # The native IRIX linker understands -LANG:*, -LIST:* and -LNO:*
- # so, if we see these flags be careful not to treat them like -L
- -L[A-Z][A-Z]*:*)
- case $with_gcc/$host in
- no/*-*-irix* | /*-*-irix*)
- func_append compile_command " $arg"
- func_append finalize_command " $arg"
- ;;
- esac
- continue
- ;;
-
- -L*)
- func_stripname "-L" '' "$arg"
- if test -z "$func_stripname_result"; then
- if test "$#" -gt 0; then
- func_fatal_error "require no space between \`-L' and \`$1'"
- else
- func_fatal_error "need path for \`-L' option"
- fi
- fi
- func_resolve_sysroot "$func_stripname_result"
- dir=$func_resolve_sysroot_result
- # We need an absolute path.
- case $dir in
- [\\/]* | [A-Za-z]:[\\/]*) ;;
- *)
- absdir=`cd "$dir" && pwd`
- test -z "$absdir" && \
- func_fatal_error "cannot determine absolute directory name of \`$dir'"
- dir="$absdir"
- ;;
- esac
- case "$deplibs " in
- *" -L$dir "* | *" $arg "*)
- # Will only happen for absolute or sysroot arguments
- ;;
- *)
- # Preserve sysroot, but never include relative directories
- case $dir in
- [\\/]* | [A-Za-z]:[\\/]* | =*) func_append deplibs " $arg" ;;
- *) func_append deplibs " -L$dir" ;;
- esac
- func_append lib_search_path " $dir"
- ;;
- esac
- case $host in
- *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*)
- testbindir=`$ECHO "$dir" | $SED 's*/lib$*/bin*'`
- case :$dllsearchpath: in
- *":$dir:"*) ;;
- ::) dllsearchpath=$dir;;
- *) func_append dllsearchpath ":$dir";;
- esac
- case :$dllsearchpath: in
- *":$testbindir:"*) ;;
- ::) dllsearchpath=$testbindir;;
- *) func_append dllsearchpath ":$testbindir";;
- esac
- ;;
- esac
- continue
- ;;
-
- -l*)
- if test "X$arg" = "X-lc" || test "X$arg" = "X-lm"; then
- case $host in
- *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-beos* | *-cegcc* | *-*-haiku*)
- # These systems don't actually have a C or math library (as such)
- continue
- ;;
- *-*-os2*)
- # These systems don't actually have a C library (as such)
- test "X$arg" = "X-lc" && continue
- ;;
- *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*)
- # Do not include libc due to us having libc/libc_r.
- test "X$arg" = "X-lc" && continue
- ;;
- *-*-rhapsody* | *-*-darwin1.[012])
- # Rhapsody C and math libraries are in the System framework
- func_append deplibs " System.ltframework"
- continue
- ;;
- *-*-sco3.2v5* | *-*-sco5v6*)
- # Causes problems with __ctype
- test "X$arg" = "X-lc" && continue
- ;;
- *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*)
- # Compiler inserts libc in the correct place for threads to work
- test "X$arg" = "X-lc" && continue
- ;;
- esac
- elif test "X$arg" = "X-lc_r"; then
- case $host in
- *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*)
- # Do not include libc_r directly, use -pthread flag.
- continue
- ;;
- esac
- fi
- func_append deplibs " $arg"
- continue
- ;;
-
- -module)
- module=yes
- continue
- ;;
-
- # Tru64 UNIX uses -model [arg] to determine the layout of C++
- # classes, name mangling, and exception handling.
- # Darwin uses the -arch flag to determine output architecture.
- -model|-arch|-isysroot|--sysroot)
- func_append compiler_flags " $arg"
- func_append compile_command " $arg"
- func_append finalize_command " $arg"
- prev=xcompiler
- continue
- ;;
-
- -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe \
- |-threads|-fopenmp|-openmp|-mp|-xopenmp|-omp|-qsmp=*)
- func_append compiler_flags " $arg"
- func_append compile_command " $arg"
- func_append finalize_command " $arg"
- case "$new_inherited_linker_flags " in
- *" $arg "*) ;;
- * ) func_append new_inherited_linker_flags " $arg" ;;
- esac
- continue
- ;;
-
- -multi_module)
- single_module="${wl}-multi_module"
- continue
- ;;
-
- -no-fast-install)
- fast_install=no
- continue
- ;;
-
- -no-install)
- case $host in
- *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-darwin* | *-cegcc*)
- # The PATH hackery in wrapper scripts is required on Windows
- # and Darwin in order for the loader to find any dlls it needs.
- func_warning "\`-no-install' is ignored for $host"
- func_warning "assuming \`-no-fast-install' instead"
- fast_install=no
- ;;
- *) no_install=yes ;;
- esac
- continue
- ;;
-
- -no-undefined)
- allow_undefined=no
- continue
- ;;
-
- -objectlist)
- prev=objectlist
- continue
- ;;
-
- -o) prev=output ;;
-
- -precious-files-regex)
- prev=precious_regex
- continue
- ;;
-
- -release)
- prev=release
- continue
- ;;
-
- -rpath)
- prev=rpath
- continue
- ;;
-
- -R)
- prev=xrpath
- continue
- ;;
-
- -R*)
- func_stripname '-R' '' "$arg"
- dir=$func_stripname_result
- # We need an absolute path.
- case $dir in
- [\\/]* | [A-Za-z]:[\\/]*) ;;
- =*)
- func_stripname '=' '' "$dir"
- dir=$lt_sysroot$func_stripname_result
- ;;
- *)
- func_fatal_error "only absolute run-paths are allowed"
- ;;
- esac
- case "$xrpath " in
- *" $dir "*) ;;
- *) func_append xrpath " $dir" ;;
- esac
- continue
- ;;
-
- -shared)
- # The effects of -shared are defined in a previous loop.
- continue
- ;;
-
- -shrext)
- prev=shrext
- continue
- ;;
-
- -static | -static-libtool-libs)
- # The effects of -static are defined in a previous loop.
- # We used to do the same as -all-static on platforms that
- # didn't have a PIC flag, but the assumption that the effects
- # would be equivalent was wrong. It would break on at least
- # Digital Unix and AIX.
- continue
- ;;
-
- -thread-safe)
- thread_safe=yes
- continue
- ;;
-
- -version-info)
- prev=vinfo
- continue
- ;;
-
- -version-number)
- prev=vinfo
- vinfo_number=yes
- continue
- ;;
-
- -weak)
- prev=weak
- continue
- ;;
-
- -Wc,*)
- func_stripname '-Wc,' '' "$arg"
- args=$func_stripname_result
- arg=
- save_ifs="$IFS"; IFS=','
- for flag in $args; do
- IFS="$save_ifs"
- func_quote_for_eval "$flag"
- func_append arg " $func_quote_for_eval_result"
- func_append compiler_flags " $func_quote_for_eval_result"
- done
- IFS="$save_ifs"
- func_stripname ' ' '' "$arg"
- arg=$func_stripname_result
- ;;
-
- -Wl,*)
- func_stripname '-Wl,' '' "$arg"
- args=$func_stripname_result
- arg=
- save_ifs="$IFS"; IFS=','
- for flag in $args; do
- IFS="$save_ifs"
- func_quote_for_eval "$flag"
- func_append arg " $wl$func_quote_for_eval_result"
- func_append compiler_flags " $wl$func_quote_for_eval_result"
- func_append linker_flags " $func_quote_for_eval_result"
- done
- IFS="$save_ifs"
- func_stripname ' ' '' "$arg"
- arg=$func_stripname_result
- ;;
-
- -Xcompiler)
- prev=xcompiler
- continue
- ;;
-
- -Xlinker)
- prev=xlinker
- continue
- ;;
-
- -XCClinker)
- prev=xcclinker
- continue
- ;;
-
- # -msg_* for osf cc
- -msg_*)
- func_quote_for_eval "$arg"
- arg="$func_quote_for_eval_result"
- ;;
-
- # Flags to be passed through unchanged, with rationale:
- # -64, -mips[0-9] enable 64-bit mode for the SGI compiler
- # -r[0-9][0-9]* specify processor for the SGI compiler
- # -xarch=*, -xtarget=* enable 64-bit mode for the Sun compiler
- # +DA*, +DD* enable 64-bit mode for the HP compiler
- # -q* compiler args for the IBM compiler
- # -m*, -t[45]*, -txscale* architecture-specific flags for GCC
- # -F/path path to uninstalled frameworks, gcc on darwin
- # -p, -pg, --coverage, -fprofile-* profiling flags for GCC
- # @file GCC response files
- # -tp=* Portland pgcc target processor selection
- # --sysroot=* for sysroot support
- # -O*, -flto*, -fwhopr*, -fuse-linker-plugin GCC link-time optimization
- -64|-mips[0-9]|-r[0-9][0-9]*|-xarch=*|-xtarget=*|+DA*|+DD*|-q*|-m*| \
- -t[45]*|-txscale*|-p|-pg|--coverage|-fprofile-*|-F*|@*|-tp=*|--sysroot=*| \
- -O*|-flto*|-fwhopr*|-fuse-linker-plugin)
- func_quote_for_eval "$arg"
- arg="$func_quote_for_eval_result"
- func_append compile_command " $arg"
- func_append finalize_command " $arg"
- func_append compiler_flags " $arg"
- continue
- ;;
-
- # Some other compiler flag.
- -* | +*)
- func_quote_for_eval "$arg"
- arg="$func_quote_for_eval_result"
- ;;
-
- *.$objext)
- # A standard object.
- func_append objs " $arg"
- ;;
-
- *.lo)
- # A libtool-controlled object.
-
- # Check to see that this really is a libtool object.
- if func_lalib_unsafe_p "$arg"; then
- pic_object=
- non_pic_object=
-
- # Read the .lo file
- func_source "$arg"
-
- if test -z "$pic_object" ||
- test -z "$non_pic_object" ||
- test "$pic_object" = none &&
- test "$non_pic_object" = none; then
- func_fatal_error "cannot find name of object for \`$arg'"
- fi
-
- # Extract subdirectory from the argument.
- func_dirname "$arg" "/" ""
- xdir="$func_dirname_result"
-
- if test "$pic_object" != none; then
- # Prepend the subdirectory the object is found in.
- pic_object="$xdir$pic_object"
-
- if test "$prev" = dlfiles; then
- if test "$build_libtool_libs" = yes && test "$dlopen_support" = yes; then
- func_append dlfiles " $pic_object"
- prev=
- continue
- else
- # If libtool objects are unsupported, then we need to preload.
- prev=dlprefiles
- fi
- fi
-
- # CHECK ME: I think I busted this. -Ossama
- if test "$prev" = dlprefiles; then
- # Preload the old-style object.
- func_append dlprefiles " $pic_object"
- prev=
- fi
-
- # A PIC object.
- func_append libobjs " $pic_object"
- arg="$pic_object"
- fi
-
- # Non-PIC object.
- if test "$non_pic_object" != none; then
- # Prepend the subdirectory the object is found in.
- non_pic_object="$xdir$non_pic_object"
-
- # A standard non-PIC object
- func_append non_pic_objects " $non_pic_object"
- if test -z "$pic_object" || test "$pic_object" = none ; then
- arg="$non_pic_object"
- fi
- else
- # If the PIC object exists, use it instead.
- # $xdir was prepended to $pic_object above.
- non_pic_object="$pic_object"
- func_append non_pic_objects " $non_pic_object"
- fi
- else
- # Only an error if not doing a dry-run.
- if $opt_dry_run; then
- # Extract subdirectory from the argument.
- func_dirname "$arg" "/" ""
- xdir="$func_dirname_result"
-
- func_lo2o "$arg"
- pic_object=$xdir$objdir/$func_lo2o_result
- non_pic_object=$xdir$func_lo2o_result
- func_append libobjs " $pic_object"
- func_append non_pic_objects " $non_pic_object"
- else
- func_fatal_error "\`$arg' is not a valid libtool object"
- fi
- fi
- ;;
-
- *.$libext)
- # An archive.
- func_append deplibs " $arg"
- func_append old_deplibs " $arg"
- continue
- ;;
-
- *.la)
- # A libtool-controlled library.
-
- func_resolve_sysroot "$arg"
- if test "$prev" = dlfiles; then
- # This library was specified with -dlopen.
- func_append dlfiles " $func_resolve_sysroot_result"
- prev=
- elif test "$prev" = dlprefiles; then
- # The library was specified with -dlpreopen.
- func_append dlprefiles " $func_resolve_sysroot_result"
- prev=
- else
- func_append deplibs " $func_resolve_sysroot_result"
- fi
- continue
- ;;
-
- # Some other compiler argument.
- *)
- # Unknown arguments in both finalize_command and compile_command need
- # to be aesthetically quoted because they are evaled later.
- func_quote_for_eval "$arg"
- arg="$func_quote_for_eval_result"
- ;;
- esac # arg
-
- # Now actually substitute the argument into the commands.
- if test -n "$arg"; then
- func_append compile_command " $arg"
- func_append finalize_command " $arg"
- fi
- done # argument parsing loop
-
- test -n "$prev" && \
- func_fatal_help "the \`$prevarg' option requires an argument"
-
- if test "$export_dynamic" = yes && test -n "$export_dynamic_flag_spec"; then
- eval arg=\"$export_dynamic_flag_spec\"
- func_append compile_command " $arg"
- func_append finalize_command " $arg"
- fi
-
- oldlibs=
- # calculate the name of the file, without its directory
- func_basename "$output"
- outputname="$func_basename_result"
- libobjs_save="$libobjs"
-
- if test -n "$shlibpath_var"; then
- # get the directories listed in $shlibpath_var
- eval shlib_search_path=\`\$ECHO \"\${$shlibpath_var}\" \| \$SED \'s/:/ /g\'\`
- else
- shlib_search_path=
- fi
- eval sys_lib_search_path=\"$sys_lib_search_path_spec\"
- eval sys_lib_dlsearch_path=\"$sys_lib_dlsearch_path_spec\"
-
- func_dirname "$output" "/" ""
- output_objdir="$func_dirname_result$objdir"
- func_to_tool_file "$output_objdir/"
- tool_output_objdir=$func_to_tool_file_result
- # Create the object directory.
- func_mkdir_p "$output_objdir"
-
- # Determine the type of output
- case $output in
- "")
- func_fatal_help "you must specify an output file"
- ;;
- *.$libext) linkmode=oldlib ;;
- *.lo | *.$objext) linkmode=obj ;;
- *.la) linkmode=lib ;;
- *) linkmode=prog ;; # Anything else should be a program.
- esac
-
- specialdeplibs=
-
- libs=
- # Find all interdependent deplibs by searching for libraries
- # that are linked more than once (e.g. -la -lb -la)
- for deplib in $deplibs; do
- if $opt_preserve_dup_deps ; then
- case "$libs " in
- *" $deplib "*) func_append specialdeplibs " $deplib" ;;
- esac
- fi
- func_append libs " $deplib"
- done
-
- if test "$linkmode" = lib; then
- libs="$predeps $libs $compiler_lib_search_path $postdeps"
-
- # Compute libraries that are listed more than once in $predeps
- # $postdeps and mark them as special (i.e., whose duplicates are
- # not to be eliminated).
- pre_post_deps=
- if $opt_duplicate_compiler_generated_deps; then
- for pre_post_dep in $predeps $postdeps; do
- case "$pre_post_deps " in
- *" $pre_post_dep "*) func_append specialdeplibs " $pre_post_deps" ;;
- esac
- func_append pre_post_deps " $pre_post_dep"
- done
- fi
- pre_post_deps=
- fi
-
- deplibs=
- newdependency_libs=
- newlib_search_path=
- need_relink=no # whether we're linking any uninstalled libtool libraries
- notinst_deplibs= # not-installed libtool libraries
- notinst_path= # paths that contain not-installed libtool libraries
-
- case $linkmode in
- lib)
- passes="conv dlpreopen link"
- for file in $dlfiles $dlprefiles; do
- case $file in
- *.la) ;;
- *)
- func_fatal_help "libraries can \`-dlopen' only libtool libraries: $file"
- ;;
- esac
- done
- ;;
- prog)
- compile_deplibs=
- finalize_deplibs=
- alldeplibs=no
- newdlfiles=
- newdlprefiles=
- passes="conv scan dlopen dlpreopen link"
- ;;
- *) passes="conv"
- ;;
- esac
-
- for pass in $passes; do
- # The preopen pass in lib mode reverses $deplibs; put it back here
- # so that -L comes before libs that need it for instance...
- if test "$linkmode,$pass" = "lib,link"; then
- ## FIXME: Find the place where the list is rebuilt in the wrong
- ## order, and fix it there properly
- tmp_deplibs=
- for deplib in $deplibs; do
- tmp_deplibs="$deplib $tmp_deplibs"
- done
- deplibs="$tmp_deplibs"
- fi
-
- if test "$linkmode,$pass" = "lib,link" ||
- test "$linkmode,$pass" = "prog,scan"; then
- libs="$deplibs"
- deplibs=
- fi
- if test "$linkmode" = prog; then
- case $pass in
- dlopen) libs="$dlfiles" ;;
- dlpreopen) libs="$dlprefiles" ;;
- link) libs="$deplibs %DEPLIBS% $dependency_libs" ;;
- esac
- fi
- if test "$linkmode,$pass" = "lib,dlpreopen"; then
- # Collect and forward deplibs of preopened libtool libs
- for lib in $dlprefiles; do
- # Ignore non-libtool-libs
- dependency_libs=
- func_resolve_sysroot "$lib"
- case $lib in
- *.la) func_source "$func_resolve_sysroot_result" ;;
- esac
-
- # Collect preopened libtool deplibs, except any this library
- # has declared as weak libs
- for deplib in $dependency_libs; do
- func_basename "$deplib"
- deplib_base=$func_basename_result
- case " $weak_libs " in
- *" $deplib_base "*) ;;
- *) func_append deplibs " $deplib" ;;
- esac
- done
- done
- libs="$dlprefiles"
- fi
- if test "$pass" = dlopen; then
- # Collect dlpreopened libraries
- save_deplibs="$deplibs"
- deplibs=
- fi
-
- for deplib in $libs; do
- lib=
- found=no
- case $deplib in
- -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe \
- |-threads|-fopenmp|-openmp|-mp|-xopenmp|-omp|-qsmp=*)
- if test "$linkmode,$pass" = "prog,link"; then
- compile_deplibs="$deplib $compile_deplibs"
- finalize_deplibs="$deplib $finalize_deplibs"
- else
- func_append compiler_flags " $deplib"
- if test "$linkmode" = lib ; then
- case "$new_inherited_linker_flags " in
- *" $deplib "*) ;;
- * ) func_append new_inherited_linker_flags " $deplib" ;;
- esac
- fi
- fi
- continue
- ;;
- -l*)
- if test "$linkmode" != lib && test "$linkmode" != prog; then
- func_warning "\`-l' is ignored for archives/objects"
- continue
- fi
- func_stripname '-l' '' "$deplib"
- name=$func_stripname_result
- if test "$linkmode" = lib; then
- searchdirs="$newlib_search_path $lib_search_path $compiler_lib_search_dirs $sys_lib_search_path $shlib_search_path"
- else
- searchdirs="$newlib_search_path $lib_search_path $sys_lib_search_path $shlib_search_path"
- fi
- for searchdir in $searchdirs; do
- for search_ext in .la $std_shrext .so .a; do
- # Search the libtool library
- lib="$searchdir/lib${name}${search_ext}"
- if test -f "$lib"; then
- if test "$search_ext" = ".la"; then
- found=yes
- else
- found=no
- fi
- break 2
- fi
- done
- done
- if test "$found" != yes; then
- # deplib doesn't seem to be a libtool library
- if test "$linkmode,$pass" = "prog,link"; then
- compile_deplibs="$deplib $compile_deplibs"
- finalize_deplibs="$deplib $finalize_deplibs"
- else
- deplibs="$deplib $deplibs"
- test "$linkmode" = lib && newdependency_libs="$deplib $newdependency_libs"
- fi
- continue
- else # deplib is a libtool library
- # If $allow_libtool_libs_with_static_runtimes && $deplib is a stdlib,
- # We need to do some special things here, and not later.
- if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then
- case " $predeps $postdeps " in
- *" $deplib "*)
- if func_lalib_p "$lib"; then
- library_names=
- old_library=
- func_source "$lib"
- for l in $old_library $library_names; do
- ll="$l"
- done
- if test "X$ll" = "X$old_library" ; then # only static version available
- found=no
- func_dirname "$lib" "" "."
- ladir="$func_dirname_result"
- lib=$ladir/$old_library
- if test "$linkmode,$pass" = "prog,link"; then
- compile_deplibs="$deplib $compile_deplibs"
- finalize_deplibs="$deplib $finalize_deplibs"
- else
- deplibs="$deplib $deplibs"
- test "$linkmode" = lib && newdependency_libs="$deplib $newdependency_libs"
- fi
- continue
- fi
- fi
- ;;
- *) ;;
- esac
- fi
- fi
- ;; # -l
- *.ltframework)
- if test "$linkmode,$pass" = "prog,link"; then
- compile_deplibs="$deplib $compile_deplibs"
- finalize_deplibs="$deplib $finalize_deplibs"
- else
- deplibs="$deplib $deplibs"
- if test "$linkmode" = lib ; then
- case "$new_inherited_linker_flags " in
- *" $deplib "*) ;;
- * ) func_append new_inherited_linker_flags " $deplib" ;;
- esac
- fi
- fi
- continue
- ;;
- -L*)
- case $linkmode in
- lib)
- deplibs="$deplib $deplibs"
- test "$pass" = conv && continue
- newdependency_libs="$deplib $newdependency_libs"
- func_stripname '-L' '' "$deplib"
- func_resolve_sysroot "$func_stripname_result"
- func_append newlib_search_path " $func_resolve_sysroot_result"
- ;;
- prog)
- if test "$pass" = conv; then
- deplibs="$deplib $deplibs"
- continue
- fi
- if test "$pass" = scan; then
- deplibs="$deplib $deplibs"
- else
- compile_deplibs="$deplib $compile_deplibs"
- finalize_deplibs="$deplib $finalize_deplibs"
- fi
- func_stripname '-L' '' "$deplib"
- func_resolve_sysroot "$func_stripname_result"
- func_append newlib_search_path " $func_resolve_sysroot_result"
- ;;
- *)
- func_warning "\`-L' is ignored for archives/objects"
- ;;
- esac # linkmode
- continue
- ;; # -L
- -R*)
- if test "$pass" = link; then
- func_stripname '-R' '' "$deplib"
- func_resolve_sysroot "$func_stripname_result"
- dir=$func_resolve_sysroot_result
- # Make sure the xrpath contains only unique directories.
- case "$xrpath " in
- *" $dir "*) ;;
- *) func_append xrpath " $dir" ;;
- esac
- fi
- deplibs="$deplib $deplibs"
- continue
- ;;
- *.la)
- func_resolve_sysroot "$deplib"
- lib=$func_resolve_sysroot_result
- ;;
- *.$libext)
- if test "$pass" = conv; then
- deplibs="$deplib $deplibs"
- continue
- fi
- case $linkmode in
- lib)
- # Linking convenience modules into shared libraries is allowed,
- # but linking other static libraries is non-portable.
- case " $dlpreconveniencelibs " in
- *" $deplib "*) ;;
- *)
- valid_a_lib=no
- case $deplibs_check_method in
- match_pattern*)
- set dummy $deplibs_check_method; shift
- match_pattern_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"`
- if eval "\$ECHO \"$deplib\"" 2>/dev/null | $SED 10q \
- | $EGREP "$match_pattern_regex" > /dev/null; then
- valid_a_lib=yes
- fi
- ;;
- pass_all)
- valid_a_lib=yes
- ;;
- esac
- if test "$valid_a_lib" != yes; then
- echo
- $ECHO "*** Warning: Trying to link with static lib archive $deplib."
- echo "*** I have the capability to make that library automatically link in when"
- echo "*** you link to this library. But I can only do this if you have a"
- echo "*** shared version of the library, which you do not appear to have"
- echo "*** because the file extensions .$libext of this argument makes me believe"
- echo "*** that it is just a static archive that I should not use here."
- else
- echo
- $ECHO "*** Warning: Linking the shared library $output against the"
- $ECHO "*** static library $deplib is not portable!"
- deplibs="$deplib $deplibs"
- fi
- ;;
- esac
- continue
- ;;
- prog)
- if test "$pass" != link; then
- deplibs="$deplib $deplibs"
- else
- compile_deplibs="$deplib $compile_deplibs"
- finalize_deplibs="$deplib $finalize_deplibs"
- fi
- continue
- ;;
- esac # linkmode
- ;; # *.$libext
- *.lo | *.$objext)
- if test "$pass" = conv; then
- deplibs="$deplib $deplibs"
- elif test "$linkmode" = prog; then
- if test "$pass" = dlpreopen || test "$dlopen_support" != yes || test "$build_libtool_libs" = no; then
- # If there is no dlopen support or we're linking statically,
- # we need to preload.
- func_append newdlprefiles " $deplib"
- compile_deplibs="$deplib $compile_deplibs"
- finalize_deplibs="$deplib $finalize_deplibs"
- else
- func_append newdlfiles " $deplib"
- fi
- fi
- continue
- ;;
- %DEPLIBS%)
- alldeplibs=yes
- continue
- ;;
- esac # case $deplib
-
- if test "$found" = yes || test -f "$lib"; then :
- else
- func_fatal_error "cannot find the library \`$lib' or unhandled argument \`$deplib'"
- fi
-
- # Check to see that this really is a libtool archive.
- func_lalib_unsafe_p "$lib" \
- || func_fatal_error "\`$lib' is not a valid libtool archive"
-
- func_dirname "$lib" "" "."
- ladir="$func_dirname_result"
-
- dlname=
- dlopen=
- dlpreopen=
- libdir=
- library_names=
- old_library=
- inherited_linker_flags=
- # If the library was installed with an old release of libtool,
- # it will not redefine variables installed, or shouldnotlink
- installed=yes
- shouldnotlink=no
- avoidtemprpath=
-
-
- # Read the .la file
- func_source "$lib"
-
- # Convert "-framework foo" to "foo.ltframework"
- if test -n "$inherited_linker_flags"; then
- tmp_inherited_linker_flags=`$ECHO "$inherited_linker_flags" | $SED 's/-framework \([^ $]*\)/\1.ltframework/g'`
- for tmp_inherited_linker_flag in $tmp_inherited_linker_flags; do
- case " $new_inherited_linker_flags " in
- *" $tmp_inherited_linker_flag "*) ;;
- *) func_append new_inherited_linker_flags " $tmp_inherited_linker_flag";;
- esac
- done
- fi
- dependency_libs=`$ECHO " $dependency_libs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'`
- if test "$linkmode,$pass" = "lib,link" ||
- test "$linkmode,$pass" = "prog,scan" ||
- { test "$linkmode" != prog && test "$linkmode" != lib; }; then
- test -n "$dlopen" && func_append dlfiles " $dlopen"
- test -n "$dlpreopen" && func_append dlprefiles " $dlpreopen"
- fi
-
- if test "$pass" = conv; then
- # Only check for convenience libraries
- deplibs="$lib $deplibs"
- if test -z "$libdir"; then
- if test -z "$old_library"; then
- func_fatal_error "cannot find name of link library for \`$lib'"
- fi
- # It is a libtool convenience library, so add in its objects.
- func_append convenience " $ladir/$objdir/$old_library"
- func_append old_convenience " $ladir/$objdir/$old_library"
- elif test "$linkmode" != prog && test "$linkmode" != lib; then
- func_fatal_error "\`$lib' is not a convenience library"
- fi
- tmp_libs=
- for deplib in $dependency_libs; do
- deplibs="$deplib $deplibs"
- if $opt_preserve_dup_deps ; then
- case "$tmp_libs " in
- *" $deplib "*) func_append specialdeplibs " $deplib" ;;
- esac
- fi
- func_append tmp_libs " $deplib"
- done
- continue
- fi # $pass = conv
-
-
- # Get the name of the library we link against.
- linklib=
- if test -n "$old_library" &&
- { test "$prefer_static_libs" = yes ||
- test "$prefer_static_libs,$installed" = "built,no"; }; then
- linklib=$old_library
- else
- for l in $old_library $library_names; do
- linklib="$l"
- done
- fi
- if test -z "$linklib"; then
- func_fatal_error "cannot find name of link library for \`$lib'"
- fi
-
- # This library was specified with -dlopen.
- if test "$pass" = dlopen; then
- if test -z "$libdir"; then
- func_fatal_error "cannot -dlopen a convenience library: \`$lib'"
- fi
- if test -z "$dlname" ||
- test "$dlopen_support" != yes ||
- test "$build_libtool_libs" = no; then
- # If there is no dlname, no dlopen support or we're linking
- # statically, we need to preload. We also need to preload any
- # dependent libraries so libltdl's deplib preloader doesn't
- # bomb out in the load deplibs phase.
- func_append dlprefiles " $lib $dependency_libs"
- else
- func_append newdlfiles " $lib"
- fi
- continue
- fi # $pass = dlopen
-
- # We need an absolute path.
- case $ladir in
- [\\/]* | [A-Za-z]:[\\/]*) abs_ladir="$ladir" ;;
- *)
- abs_ladir=`cd "$ladir" && pwd`
- if test -z "$abs_ladir"; then
- func_warning "cannot determine absolute directory name of \`$ladir'"
- func_warning "passing it literally to the linker, although it might fail"
- abs_ladir="$ladir"
- fi
- ;;
- esac
- func_basename "$lib"
- laname="$func_basename_result"
-
- # Find the relevant object directory and library name.
- if test "X$installed" = Xyes; then
- if test ! -f "$lt_sysroot$libdir/$linklib" && test -f "$abs_ladir/$linklib"; then
- func_warning "library \`$lib' was moved."
- dir="$ladir"
- absdir="$abs_ladir"
- libdir="$abs_ladir"
- else
- dir="$lt_sysroot$libdir"
- absdir="$lt_sysroot$libdir"
- fi
- test "X$hardcode_automatic" = Xyes && avoidtemprpath=yes
- else
- if test ! -f "$ladir/$objdir/$linklib" && test -f "$abs_ladir/$linklib"; then
- dir="$ladir"
- absdir="$abs_ladir"
- # Remove this search path later
- func_append notinst_path " $abs_ladir"
- else
- dir="$ladir/$objdir"
- absdir="$abs_ladir/$objdir"
- # Remove this search path later
- func_append notinst_path " $abs_ladir"
- fi
- fi # $installed = yes
- func_stripname 'lib' '.la' "$laname"
- name=$func_stripname_result
-
- # This library was specified with -dlpreopen.
- if test "$pass" = dlpreopen; then
- if test -z "$libdir" && test "$linkmode" = prog; then
- func_fatal_error "only libraries may -dlpreopen a convenience library: \`$lib'"
- fi
- case "$host" in
- # special handling for platforms with PE-DLLs.
- *cygwin* | *mingw* | *cegcc* )
- # Linker will automatically link against shared library if both
- # static and shared are present. Therefore, ensure we extract
- # symbols from the import library if a shared library is present
- # (otherwise, the dlopen module name will be incorrect). We do
- # this by putting the import library name into $newdlprefiles.
- # We recover the dlopen module name by 'saving' the la file
- # name in a special purpose variable, and (later) extracting the
- # dlname from the la file.
- if test -n "$dlname"; then
- func_tr_sh "$dir/$linklib"
- eval "libfile_$func_tr_sh_result=\$abs_ladir/\$laname"
- func_append newdlprefiles " $dir/$linklib"
- else
- func_append newdlprefiles " $dir/$old_library"
- # Keep a list of preopened convenience libraries to check
- # that they are being used correctly in the link pass.
- test -z "$libdir" && \
- func_append dlpreconveniencelibs " $dir/$old_library"
- fi
- ;;
- * )
- # Prefer using a static library (so that no silly _DYNAMIC symbols
- # are required to link).
- if test -n "$old_library"; then
- func_append newdlprefiles " $dir/$old_library"
- # Keep a list of preopened convenience libraries to check
- # that they are being used correctly in the link pass.
- test -z "$libdir" && \
- func_append dlpreconveniencelibs " $dir/$old_library"
- # Otherwise, use the dlname, so that lt_dlopen finds it.
- elif test -n "$dlname"; then
- func_append newdlprefiles " $dir/$dlname"
- else
- func_append newdlprefiles " $dir/$linklib"
- fi
- ;;
- esac
- fi # $pass = dlpreopen
-
- if test -z "$libdir"; then
- # Link the convenience library
- if test "$linkmode" = lib; then
- deplibs="$dir/$old_library $deplibs"
- elif test "$linkmode,$pass" = "prog,link"; then
- compile_deplibs="$dir/$old_library $compile_deplibs"
- finalize_deplibs="$dir/$old_library $finalize_deplibs"
- else
- deplibs="$lib $deplibs" # used for prog,scan pass
- fi
- continue
- fi
-
-
- if test "$linkmode" = prog && test "$pass" != link; then
- func_append newlib_search_path " $ladir"
- deplibs="$lib $deplibs"
-
- linkalldeplibs=no
- if test "$link_all_deplibs" != no || test -z "$library_names" ||
- test "$build_libtool_libs" = no; then
- linkalldeplibs=yes
- fi
-
- tmp_libs=
- for deplib in $dependency_libs; do
- case $deplib in
- -L*) func_stripname '-L' '' "$deplib"
- func_resolve_sysroot "$func_stripname_result"
- func_append newlib_search_path " $func_resolve_sysroot_result"
- ;;
- esac
- # Need to link against all dependency_libs?
- if test "$linkalldeplibs" = yes; then
- deplibs="$deplib $deplibs"
- else
- # Need to hardcode shared library paths
- # or/and link against static libraries
- newdependency_libs="$deplib $newdependency_libs"
- fi
- if $opt_preserve_dup_deps ; then
- case "$tmp_libs " in
- *" $deplib "*) func_append specialdeplibs " $deplib" ;;
- esac
- fi
- func_append tmp_libs " $deplib"
- done # for deplib
- continue
- fi # $linkmode = prog...
-
- if test "$linkmode,$pass" = "prog,link"; then
- if test -n "$library_names" &&
- { { test "$prefer_static_libs" = no ||
- test "$prefer_static_libs,$installed" = "built,yes"; } ||
- test -z "$old_library"; }; then
- # We need to hardcode the library path
- if test -n "$shlibpath_var" && test -z "$avoidtemprpath" ; then
- # Make sure the rpath contains only unique directories.
- case "$temp_rpath:" in
- *"$absdir:"*) ;;
- *) func_append temp_rpath "$absdir:" ;;
- esac
- fi
-
- # Hardcode the library path.
- # Skip directories that are in the system default run-time
- # search path.
- case " $sys_lib_dlsearch_path " in
- *" $absdir "*) ;;
- *)
- case "$compile_rpath " in
- *" $absdir "*) ;;
- *) func_append compile_rpath " $absdir" ;;
- esac
- ;;
- esac
- case " $sys_lib_dlsearch_path " in
- *" $libdir "*) ;;
- *)
- case "$finalize_rpath " in
- *" $libdir "*) ;;
- *) func_append finalize_rpath " $libdir" ;;
- esac
- ;;
- esac
- fi # $linkmode,$pass = prog,link...
-
- if test "$alldeplibs" = yes &&
- { test "$deplibs_check_method" = pass_all ||
- { test "$build_libtool_libs" = yes &&
- test -n "$library_names"; }; }; then
- # We only need to search for static libraries
- continue
- fi
- fi
-
- link_static=no # Whether the deplib will be linked statically
- use_static_libs=$prefer_static_libs
- if test "$use_static_libs" = built && test "$installed" = yes; then
- use_static_libs=no
- fi
- if test -n "$library_names" &&
- { test "$use_static_libs" = no || test -z "$old_library"; }; then
- case $host in
- *cygwin* | *mingw* | *cegcc*)
- # No point in relinking DLLs because paths are not encoded
- func_append notinst_deplibs " $lib"
- need_relink=no
- ;;
- *)
- if test "$installed" = no; then
- func_append notinst_deplibs " $lib"
- need_relink=yes
- fi
- ;;
- esac
- # This is a shared library
-
- # Warn about portability, can't link against -module's on some
- # systems (darwin). Don't bleat about dlopened modules though!
- dlopenmodule=""
- for dlpremoduletest in $dlprefiles; do
- if test "X$dlpremoduletest" = "X$lib"; then
- dlopenmodule="$dlpremoduletest"
- break
- fi
- done
- if test -z "$dlopenmodule" && test "$shouldnotlink" = yes && test "$pass" = link; then
- echo
- if test "$linkmode" = prog; then
- $ECHO "*** Warning: Linking the executable $output against the loadable module"
- else
- $ECHO "*** Warning: Linking the shared library $output against the loadable module"
- fi
- $ECHO "*** $linklib is not portable!"
- fi
- if test "$linkmode" = lib &&
- test "$hardcode_into_libs" = yes; then
- # Hardcode the library path.
- # Skip directories that are in the system default run-time
- # search path.
- case " $sys_lib_dlsearch_path " in
- *" $absdir "*) ;;
- *)
- case "$compile_rpath " in
- *" $absdir "*) ;;
- *) func_append compile_rpath " $absdir" ;;
- esac
- ;;
- esac
- case " $sys_lib_dlsearch_path " in
- *" $libdir "*) ;;
- *)
- case "$finalize_rpath " in
- *" $libdir "*) ;;
- *) func_append finalize_rpath " $libdir" ;;
- esac
- ;;
- esac
- fi
-
- if test -n "$old_archive_from_expsyms_cmds"; then
- # figure out the soname
- set dummy $library_names
- shift
- realname="$1"
- shift
- libname=`eval "\\$ECHO \"$libname_spec\""`
- # use dlname if we got it. it's perfectly good, no?
- if test -n "$dlname"; then
- soname="$dlname"
- elif test -n "$soname_spec"; then
- # bleh windows
- case $host in
- *cygwin* | mingw* | *cegcc*)
- func_arith $current - $age
- major=$func_arith_result
- versuffix="-$major"
- ;;
- esac
- eval soname=\"$soname_spec\"
- else
- soname="$realname"
- fi
-
- # Make a new name for the extract_expsyms_cmds to use
- soroot="$soname"
- func_basename "$soroot"
- soname="$func_basename_result"
- func_stripname 'lib' '.dll' "$soname"
- newlib=libimp-$func_stripname_result.a
-
- # If the library has no export list, then create one now
- if test -f "$output_objdir/$soname-def"; then :
- else
- func_verbose "extracting exported symbol list from \`$soname'"
- func_execute_cmds "$extract_expsyms_cmds" 'exit $?'
- fi
-
- # Create $newlib
- if test -f "$output_objdir/$newlib"; then :; else
- func_verbose "generating import library for \`$soname'"
- func_execute_cmds "$old_archive_from_expsyms_cmds" 'exit $?'
- fi
- # make sure the library variables are pointing to the new library
- dir=$output_objdir
- linklib=$newlib
- fi # test -n "$old_archive_from_expsyms_cmds"
-
- if test "$linkmode" = prog || test "$opt_mode" != relink; then
- add_shlibpath=
- add_dir=
- add=
- lib_linked=yes
- case $hardcode_action in
- immediate | unsupported)
- if test "$hardcode_direct" = no; then
- add="$dir/$linklib"
- case $host in
- *-*-sco3.2v5.0.[024]*) add_dir="-L$dir" ;;
- *-*-sysv4*uw2*) add_dir="-L$dir" ;;
- *-*-sysv5OpenUNIX* | *-*-sysv5UnixWare7.[01].[10]* | \
- *-*-unixware7*) add_dir="-L$dir" ;;
- *-*-darwin* )
- # if the lib is a (non-dlopened) module then we can not
- # link against it, someone is ignoring the earlier warnings
- if /usr/bin/file -L $add 2> /dev/null |
- $GREP ": [^:]* bundle" >/dev/null ; then
- if test "X$dlopenmodule" != "X$lib"; then
- $ECHO "*** Warning: lib $linklib is a module, not a shared library"
- if test -z "$old_library" ; then
- echo
- echo "*** And there doesn't seem to be a static archive available"
- echo "*** The link will probably fail, sorry"
- else
- add="$dir/$old_library"
- fi
- elif test -n "$old_library"; then
- add="$dir/$old_library"
- fi
- fi
- esac
- elif test "$hardcode_minus_L" = no; then
- case $host in
- *-*-sunos*) add_shlibpath="$dir" ;;
- esac
- add_dir="-L$dir"
- add="-l$name"
- elif test "$hardcode_shlibpath_var" = no; then
- add_shlibpath="$dir"
- add="-l$name"
- else
- lib_linked=no
- fi
- ;;
- relink)
- if test "$hardcode_direct" = yes &&
- test "$hardcode_direct_absolute" = no; then
- add="$dir/$linklib"
- elif test "$hardcode_minus_L" = yes; then
- add_dir="-L$absdir"
- # Try looking first in the location we're being installed to.
- if test -n "$inst_prefix_dir"; then
- case $libdir in
- [\\/]*)
- func_append add_dir " -L$inst_prefix_dir$libdir"
- ;;
- esac
- fi
- add="-l$name"
- elif test "$hardcode_shlibpath_var" = yes; then
- add_shlibpath="$dir"
- add="-l$name"
- else
- lib_linked=no
- fi
- ;;
- *) lib_linked=no ;;
- esac
-
- if test "$lib_linked" != yes; then
- func_fatal_configuration "unsupported hardcode properties"
- fi
-
- if test -n "$add_shlibpath"; then
- case :$compile_shlibpath: in
- *":$add_shlibpath:"*) ;;
- *) func_append compile_shlibpath "$add_shlibpath:" ;;
- esac
- fi
- if test "$linkmode" = prog; then
- test -n "$add_dir" && compile_deplibs="$add_dir $compile_deplibs"
- test -n "$add" && compile_deplibs="$add $compile_deplibs"
- else
- test -n "$add_dir" && deplibs="$add_dir $deplibs"
- test -n "$add" && deplibs="$add $deplibs"
- if test "$hardcode_direct" != yes &&
- test "$hardcode_minus_L" != yes &&
- test "$hardcode_shlibpath_var" = yes; then
- case :$finalize_shlibpath: in
- *":$libdir:"*) ;;
- *) func_append finalize_shlibpath "$libdir:" ;;
- esac
- fi
- fi
- fi
-
- if test "$linkmode" = prog || test "$opt_mode" = relink; then
- add_shlibpath=
- add_dir=
- add=
- # Finalize command for both is simple: just hardcode it.
- if test "$hardcode_direct" = yes &&
- test "$hardcode_direct_absolute" = no; then
- add="$libdir/$linklib"
- elif test "$hardcode_minus_L" = yes; then
- add_dir="-L$libdir"
- add="-l$name"
- elif test "$hardcode_shlibpath_var" = yes; then
- case :$finalize_shlibpath: in
- *":$libdir:"*) ;;
- *) func_append finalize_shlibpath "$libdir:" ;;
- esac
- add="-l$name"
- elif test "$hardcode_automatic" = yes; then
- if test -n "$inst_prefix_dir" &&
- test -f "$inst_prefix_dir$libdir/$linklib" ; then
- add="$inst_prefix_dir$libdir/$linklib"
- else
- add="$libdir/$linklib"
- fi
- else
- # We cannot seem to hardcode it, guess we'll fake it.
- add_dir="-L$libdir"
- # Try looking first in the location we're being installed to.
- if test -n "$inst_prefix_dir"; then
- case $libdir in
- [\\/]*)
- func_append add_dir " -L$inst_prefix_dir$libdir"
- ;;
- esac
- fi
- add="-l$name"
- fi
-
- if test "$linkmode" = prog; then
- test -n "$add_dir" && finalize_deplibs="$add_dir $finalize_deplibs"
- test -n "$add" && finalize_deplibs="$add $finalize_deplibs"
- else
- test -n "$add_dir" && deplibs="$add_dir $deplibs"
- test -n "$add" && deplibs="$add $deplibs"
- fi
- fi
- elif test "$linkmode" = prog; then
- # Here we assume that one of hardcode_direct or hardcode_minus_L
- # is not unsupported. This is valid on all known static and
- # shared platforms.
- if test "$hardcode_direct" != unsupported; then
- test -n "$old_library" && linklib="$old_library"
- compile_deplibs="$dir/$linklib $compile_deplibs"
- finalize_deplibs="$dir/$linklib $finalize_deplibs"
- else
- compile_deplibs="-l$name -L$dir $compile_deplibs"
- finalize_deplibs="-l$name -L$dir $finalize_deplibs"
- fi
- elif test "$build_libtool_libs" = yes; then
- # Not a shared library
- if test "$deplibs_check_method" != pass_all; then
- # We're trying link a shared library against a static one
- # but the system doesn't support it.
-
- # Just print a warning and add the library to dependency_libs so
- # that the program can be linked against the static library.
- echo
- $ECHO "*** Warning: This system can not link to static lib archive $lib."
- echo "*** I have the capability to make that library automatically link in when"
- echo "*** you link to this library. But I can only do this if you have a"
- echo "*** shared version of the library, which you do not appear to have."
- if test "$module" = yes; then
- echo "*** But as you try to build a module library, libtool will still create "
- echo "*** a static module, that should work as long as the dlopening application"
- echo "*** is linked with the -dlopen flag to resolve symbols at runtime."
- if test -z "$global_symbol_pipe"; then
- echo
- echo "*** However, this would only work if libtool was able to extract symbol"
- echo "*** lists from a program, using \`nm' or equivalent, but libtool could"
- echo "*** not find such a program. So, this module is probably useless."
- echo "*** \`nm' from GNU binutils and a full rebuild may help."
- fi
- if test "$build_old_libs" = no; then
- build_libtool_libs=module
- build_old_libs=yes
- else
- build_libtool_libs=no
- fi
- fi
- else
- deplibs="$dir/$old_library $deplibs"
- link_static=yes
- fi
- fi # link shared/static library?
-
- if test "$linkmode" = lib; then
- if test -n "$dependency_libs" &&
- { test "$hardcode_into_libs" != yes ||
- test "$build_old_libs" = yes ||
- test "$link_static" = yes; }; then
- # Extract -R from dependency_libs
- temp_deplibs=
- for libdir in $dependency_libs; do
- case $libdir in
- -R*) func_stripname '-R' '' "$libdir"
- temp_xrpath=$func_stripname_result
- case " $xrpath " in
- *" $temp_xrpath "*) ;;
- *) func_append xrpath " $temp_xrpath";;
- esac;;
- *) func_append temp_deplibs " $libdir";;
- esac
- done
- dependency_libs="$temp_deplibs"
- fi
-
- func_append newlib_search_path " $absdir"
- # Link against this library
- test "$link_static" = no && newdependency_libs="$abs_ladir/$laname $newdependency_libs"
- # ... and its dependency_libs
- tmp_libs=
- for deplib in $dependency_libs; do
- newdependency_libs="$deplib $newdependency_libs"
- case $deplib in
- -L*) func_stripname '-L' '' "$deplib"
- func_resolve_sysroot "$func_stripname_result";;
- *) func_resolve_sysroot "$deplib" ;;
- esac
- if $opt_preserve_dup_deps ; then
- case "$tmp_libs " in
- *" $func_resolve_sysroot_result "*)
- func_append specialdeplibs " $func_resolve_sysroot_result" ;;
- esac
- fi
- func_append tmp_libs " $func_resolve_sysroot_result"
- done
-
- if test "$link_all_deplibs" != no; then
- # Add the search paths of all dependency libraries
- for deplib in $dependency_libs; do
- path=
- case $deplib in
- -L*) path="$deplib" ;;
- *.la)
- func_resolve_sysroot "$deplib"
- deplib=$func_resolve_sysroot_result
- func_dirname "$deplib" "" "."
- dir=$func_dirname_result
- # We need an absolute path.
- case $dir in
- [\\/]* | [A-Za-z]:[\\/]*) absdir="$dir" ;;
- *)
- absdir=`cd "$dir" && pwd`
- if test -z "$absdir"; then
- func_warning "cannot determine absolute directory name of \`$dir'"
- absdir="$dir"
- fi
- ;;
- esac
- if $GREP "^installed=no" $deplib > /dev/null; then
- case $host in
- *-*-darwin*)
- depdepl=
- eval deplibrary_names=`${SED} -n -e 's/^library_names=\(.*\)$/\1/p' $deplib`
- if test -n "$deplibrary_names" ; then
- for tmp in $deplibrary_names ; do
- depdepl=$tmp
- done
- if test -f "$absdir/$objdir/$depdepl" ; then
- depdepl="$absdir/$objdir/$depdepl"
- darwin_install_name=`${OTOOL} -L $depdepl | awk '{if (NR == 2) {print $1;exit}}'`
- if test -z "$darwin_install_name"; then
- darwin_install_name=`${OTOOL64} -L $depdepl | awk '{if (NR == 2) {print $1;exit}}'`
- fi
- func_append compiler_flags " ${wl}-dylib_file ${wl}${darwin_install_name}:${depdepl}"
- func_append linker_flags " -dylib_file ${darwin_install_name}:${depdepl}"
- path=
- fi
- fi
- ;;
- *)
- path="-L$absdir/$objdir"
- ;;
- esac
- else
- eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $deplib`
- test -z "$libdir" && \
- func_fatal_error "\`$deplib' is not a valid libtool archive"
- test "$absdir" != "$libdir" && \
- func_warning "\`$deplib' seems to be moved"
-
- path="-L$absdir"
- fi
- ;;
- esac
- case " $deplibs " in
- *" $path "*) ;;
- *) deplibs="$path $deplibs" ;;
- esac
- done
- fi # link_all_deplibs != no
- fi # linkmode = lib
- done # for deplib in $libs
- if test "$pass" = link; then
- if test "$linkmode" = "prog"; then
- compile_deplibs="$new_inherited_linker_flags $compile_deplibs"
- finalize_deplibs="$new_inherited_linker_flags $finalize_deplibs"
- else
- compiler_flags="$compiler_flags "`$ECHO " $new_inherited_linker_flags" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'`
- fi
- fi
- dependency_libs="$newdependency_libs"
- if test "$pass" = dlpreopen; then
- # Link the dlpreopened libraries before other libraries
- for deplib in $save_deplibs; do
- deplibs="$deplib $deplibs"
- done
- fi
- if test "$pass" != dlopen; then
- if test "$pass" != conv; then
- # Make sure lib_search_path contains only unique directories.
- lib_search_path=
- for dir in $newlib_search_path; do
- case "$lib_search_path " in
- *" $dir "*) ;;
- *) func_append lib_search_path " $dir" ;;
- esac
- done
- newlib_search_path=
- fi
-
- if test "$linkmode,$pass" != "prog,link"; then
- vars="deplibs"
- else
- vars="compile_deplibs finalize_deplibs"
- fi
- for var in $vars dependency_libs; do
- # Add libraries to $var in reverse order
- eval tmp_libs=\"\$$var\"
- new_libs=
- for deplib in $tmp_libs; do
- # FIXME: Pedantically, this is the right thing to do, so
- # that some nasty dependency loop isn't accidentally
- # broken:
- #new_libs="$deplib $new_libs"
- # Pragmatically, this seems to cause very few problems in
- # practice:
- case $deplib in
- -L*) new_libs="$deplib $new_libs" ;;
- -R*) ;;
- *)
- # And here is the reason: when a library appears more
- # than once as an explicit dependence of a library, or
- # is implicitly linked in more than once by the
- # compiler, it is considered special, and multiple
- # occurrences thereof are not removed. Compare this
- # with having the same library being listed as a
- # dependency of multiple other libraries: in this case,
- # we know (pedantically, we assume) the library does not
- # need to be listed more than once, so we keep only the
- # last copy. This is not always right, but it is rare
- # enough that we require users that really mean to play
- # such unportable linking tricks to link the library
- # using -Wl,-lname, so that libtool does not consider it
- # for duplicate removal.
- case " $specialdeplibs " in
- *" $deplib "*) new_libs="$deplib $new_libs" ;;
- *)
- case " $new_libs " in
- *" $deplib "*) ;;
- *) new_libs="$deplib $new_libs" ;;
- esac
- ;;
- esac
- ;;
- esac
- done
- tmp_libs=
- for deplib in $new_libs; do
- case $deplib in
- -L*)
- case " $tmp_libs " in
- *" $deplib "*) ;;
- *) func_append tmp_libs " $deplib" ;;
- esac
- ;;
- *) func_append tmp_libs " $deplib" ;;
- esac
- done
- eval $var=\"$tmp_libs\"
- done # for var
- fi
- # Last step: remove runtime libs from dependency_libs
- # (they stay in deplibs)
- tmp_libs=
- for i in $dependency_libs ; do
- case " $predeps $postdeps $compiler_lib_search_path " in
- *" $i "*)
- i=""
- ;;
- esac
- if test -n "$i" ; then
- func_append tmp_libs " $i"
- fi
- done
- dependency_libs=$tmp_libs
- done # for pass
- if test "$linkmode" = prog; then
- dlfiles="$newdlfiles"
- fi
- if test "$linkmode" = prog || test "$linkmode" = lib; then
- dlprefiles="$newdlprefiles"
- fi
-
- case $linkmode in
- oldlib)
- if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then
- func_warning "\`-dlopen' is ignored for archives"
- fi
-
- case " $deplibs" in
- *\ -l* | *\ -L*)
- func_warning "\`-l' and \`-L' are ignored for archives" ;;
- esac
-
- test -n "$rpath" && \
- func_warning "\`-rpath' is ignored for archives"
-
- test -n "$xrpath" && \
- func_warning "\`-R' is ignored for archives"
-
- test -n "$vinfo" && \
- func_warning "\`-version-info/-version-number' is ignored for archives"
-
- test -n "$release" && \
- func_warning "\`-release' is ignored for archives"
-
- test -n "$export_symbols$export_symbols_regex" && \
- func_warning "\`-export-symbols' is ignored for archives"
-
- # Now set the variables for building old libraries.
- build_libtool_libs=no
- oldlibs="$output"
- func_append objs "$old_deplibs"
- ;;
-
- lib)
- # Make sure we only generate libraries of the form `libNAME.la'.
- case $outputname in
- lib*)
- func_stripname 'lib' '.la' "$outputname"
- name=$func_stripname_result
- eval shared_ext=\"$shrext_cmds\"
- eval libname=\"$libname_spec\"
- ;;
- *)
- test "$module" = no && \
- func_fatal_help "libtool library \`$output' must begin with \`lib'"
-
- if test "$need_lib_prefix" != no; then
- # Add the "lib" prefix for modules if required
- func_stripname '' '.la' "$outputname"
- name=$func_stripname_result
- eval shared_ext=\"$shrext_cmds\"
- eval libname=\"$libname_spec\"
- else
- func_stripname '' '.la' "$outputname"
- libname=$func_stripname_result
- fi
- ;;
- esac
-
- if test -n "$objs"; then
- if test "$deplibs_check_method" != pass_all; then
- func_fatal_error "cannot build libtool library \`$output' from non-libtool objects on this host:$objs"
- else
- echo
- $ECHO "*** Warning: Linking the shared library $output against the non-libtool"
- $ECHO "*** objects $objs is not portable!"
- func_append libobjs " $objs"
- fi
- fi
-
- test "$dlself" != no && \
- func_warning "\`-dlopen self' is ignored for libtool libraries"
-
- set dummy $rpath
- shift
- test "$#" -gt 1 && \
- func_warning "ignoring multiple \`-rpath's for a libtool library"
-
- install_libdir="$1"
-
- oldlibs=
- if test -z "$rpath"; then
- if test "$build_libtool_libs" = yes; then
- # Building a libtool convenience library.
- # Some compilers have problems with a `.al' extension so
- # convenience libraries should have the same extension an
- # archive normally would.
- oldlibs="$output_objdir/$libname.$libext $oldlibs"
- build_libtool_libs=convenience
- build_old_libs=yes
- fi
-
- test -n "$vinfo" && \
- func_warning "\`-version-info/-version-number' is ignored for convenience libraries"
-
- test -n "$release" && \
- func_warning "\`-release' is ignored for convenience libraries"
- else
-
- # Parse the version information argument.
- save_ifs="$IFS"; IFS=':'
- set dummy $vinfo 0 0 0
- shift
- IFS="$save_ifs"
-
- test -n "$7" && \
- func_fatal_help "too many parameters to \`-version-info'"
-
- # convert absolute version numbers to libtool ages
- # this retains compatibility with .la files and attempts
- # to make the code below a bit more comprehensible
-
- case $vinfo_number in
- yes)
- number_major="$1"
- number_minor="$2"
- number_revision="$3"
- #
- # There are really only two kinds -- those that
- # use the current revision as the major version
- # and those that subtract age and use age as
- # a minor version. But, then there is irix
- # which has an extra 1 added just for fun
- #
- case $version_type in
- # correct linux to gnu/linux during the next big refactor
- darwin|linux|osf|windows|none)
- func_arith $number_major + $number_minor
- current=$func_arith_result
- age="$number_minor"
- revision="$number_revision"
- ;;
- freebsd-aout|freebsd-elf|qnx|sunos)
- current="$number_major"
- revision="$number_minor"
- age="0"
- ;;
- irix|nonstopux)
- func_arith $number_major + $number_minor
- current=$func_arith_result
- age="$number_minor"
- revision="$number_minor"
- lt_irix_increment=no
- ;;
- esac
- ;;
- no)
- current="$1"
- revision="$2"
- age="$3"
- ;;
- esac
-
- # Check that each of the things are valid numbers.
- case $current in
- 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;;
- *)
- func_error "CURRENT \`$current' must be a nonnegative integer"
- func_fatal_error "\`$vinfo' is not valid version information"
- ;;
- esac
-
- case $revision in
- 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;;
- *)
- func_error "REVISION \`$revision' must be a nonnegative integer"
- func_fatal_error "\`$vinfo' is not valid version information"
- ;;
- esac
-
- case $age in
- 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;;
- *)
- func_error "AGE \`$age' must be a nonnegative integer"
- func_fatal_error "\`$vinfo' is not valid version information"
- ;;
- esac
-
- if test "$age" -gt "$current"; then
- func_error "AGE \`$age' is greater than the current interface number \`$current'"
- func_fatal_error "\`$vinfo' is not valid version information"
- fi
-
- # Calculate the version variables.
- major=
- versuffix=
- verstring=
- case $version_type in
- none) ;;
-
- darwin)
- # Like Linux, but with the current version available in
- # verstring for coding it into the library header
- func_arith $current - $age
- major=.$func_arith_result
- versuffix="$major.$age.$revision"
- # Darwin ld doesn't like 0 for these options...
- func_arith $current + 1
- minor_current=$func_arith_result
- xlcverstring="${wl}-compatibility_version ${wl}$minor_current ${wl}-current_version ${wl}$minor_current.$revision"
- verstring="-compatibility_version $minor_current -current_version $minor_current.$revision"
- ;;
-
- freebsd-aout)
- major=".$current"
- versuffix=".$current.$revision";
- ;;
-
- freebsd-elf)
- major=".$current"
- versuffix=".$current"
- ;;
-
- irix | nonstopux)
- if test "X$lt_irix_increment" = "Xno"; then
- func_arith $current - $age
- else
- func_arith $current - $age + 1
- fi
- major=$func_arith_result
-
- case $version_type in
- nonstopux) verstring_prefix=nonstopux ;;
- *) verstring_prefix=sgi ;;
- esac
- verstring="$verstring_prefix$major.$revision"
-
- # Add in all the interfaces that we are compatible with.
- loop=$revision
- while test "$loop" -ne 0; do
- func_arith $revision - $loop
- iface=$func_arith_result
- func_arith $loop - 1
- loop=$func_arith_result
- verstring="$verstring_prefix$major.$iface:$verstring"
- done
-
- # Before this point, $major must not contain `.'.
- major=.$major
- versuffix="$major.$revision"
- ;;
-
- linux) # correct to gnu/linux during the next big refactor
- func_arith $current - $age
- major=.$func_arith_result
- versuffix="$major.$age.$revision"
- ;;
-
- osf)
- func_arith $current - $age
- major=.$func_arith_result
- versuffix=".$current.$age.$revision"
- verstring="$current.$age.$revision"
-
- # Add in all the interfaces that we are compatible with.
- loop=$age
- while test "$loop" -ne 0; do
- func_arith $current - $loop
- iface=$func_arith_result
- func_arith $loop - 1
- loop=$func_arith_result
- verstring="$verstring:${iface}.0"
- done
-
- # Make executables depend on our current version.
- func_append verstring ":${current}.0"
- ;;
-
- qnx)
- major=".$current"
- versuffix=".$current"
- ;;
-
- sunos)
- major=".$current"
- versuffix=".$current.$revision"
- ;;
-
- windows)
- # Use '-' rather than '.', since we only want one
- # extension on DOS 8.3 filesystems.
- func_arith $current - $age
- major=$func_arith_result
- versuffix="-$major"
- ;;
-
- *)
- func_fatal_configuration "unknown library version type \`$version_type'"
- ;;
- esac
-
- # Clear the version info if we defaulted, and they specified a release.
- if test -z "$vinfo" && test -n "$release"; then
- major=
- case $version_type in
- darwin)
- # we can't check for "0.0" in archive_cmds due to quoting
- # problems, so we reset it completely
- verstring=
- ;;
- *)
- verstring="0.0"
- ;;
- esac
- if test "$need_version" = no; then
- versuffix=
- else
- versuffix=".0.0"
- fi
- fi
-
- # Remove version info from name if versioning should be avoided
- if test "$avoid_version" = yes && test "$need_version" = no; then
- major=
- versuffix=
- verstring=""
- fi
-
- # Check to see if the archive will have undefined symbols.
- if test "$allow_undefined" = yes; then
- if test "$allow_undefined_flag" = unsupported; then
- func_warning "undefined symbols not allowed in $host shared libraries"
- build_libtool_libs=no
- build_old_libs=yes
- fi
- else
- # Don't allow undefined symbols.
- allow_undefined_flag="$no_undefined_flag"
- fi
-
- fi
-
- func_generate_dlsyms "$libname" "$libname" "yes"
- func_append libobjs " $symfileobj"
- test "X$libobjs" = "X " && libobjs=
-
- if test "$opt_mode" != relink; then
- # Remove our outputs, but don't remove object files since they
- # may have been created when compiling PIC objects.
- removelist=
- tempremovelist=`$ECHO "$output_objdir/*"`
- for p in $tempremovelist; do
- case $p in
- *.$objext | *.gcno)
- ;;
- $output_objdir/$outputname | $output_objdir/$libname.* | $output_objdir/${libname}${release}.*)
- if test "X$precious_files_regex" != "X"; then
- if $ECHO "$p" | $EGREP -e "$precious_files_regex" >/dev/null 2>&1
- then
- continue
- fi
- fi
- func_append removelist " $p"
- ;;
- *) ;;
- esac
- done
- test -n "$removelist" && \
- func_show_eval "${RM}r \$removelist"
- fi
-
- # Now set the variables for building old libraries.
- if test "$build_old_libs" = yes && test "$build_libtool_libs" != convenience ; then
- func_append oldlibs " $output_objdir/$libname.$libext"
-
- # Transform .lo files to .o files.
- oldobjs="$objs "`$ECHO "$libobjs" | $SP2NL | $SED "/\.${libext}$/d; $lo2o" | $NL2SP`
- fi
-
- # Eliminate all temporary directories.
- #for path in $notinst_path; do
- # lib_search_path=`$ECHO "$lib_search_path " | $SED "s% $path % %g"`
- # deplibs=`$ECHO "$deplibs " | $SED "s% -L$path % %g"`
- # dependency_libs=`$ECHO "$dependency_libs " | $SED "s% -L$path % %g"`
- #done
-
- if test -n "$xrpath"; then
- # If the user specified any rpath flags, then add them.
- temp_xrpath=
- for libdir in $xrpath; do
- func_replace_sysroot "$libdir"
- func_append temp_xrpath " -R$func_replace_sysroot_result"
- case "$finalize_rpath " in
- *" $libdir "*) ;;
- *) func_append finalize_rpath " $libdir" ;;
- esac
- done
- if test "$hardcode_into_libs" != yes || test "$build_old_libs" = yes; then
- dependency_libs="$temp_xrpath $dependency_libs"
- fi
- fi
-
- # Make sure dlfiles contains only unique files that won't be dlpreopened
- old_dlfiles="$dlfiles"
- dlfiles=
- for lib in $old_dlfiles; do
- case " $dlprefiles $dlfiles " in
- *" $lib "*) ;;
- *) func_append dlfiles " $lib" ;;
- esac
- done
-
- # Make sure dlprefiles contains only unique files
- old_dlprefiles="$dlprefiles"
- dlprefiles=
- for lib in $old_dlprefiles; do
- case "$dlprefiles " in
- *" $lib "*) ;;
- *) func_append dlprefiles " $lib" ;;
- esac
- done
-
- if test "$build_libtool_libs" = yes; then
- if test -n "$rpath"; then
- case $host in
- *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-beos* | *-cegcc* | *-*-haiku*)
- # these systems don't actually have a c library (as such)!
- ;;
- *-*-rhapsody* | *-*-darwin1.[012])
- # Rhapsody C library is in the System framework
- func_append deplibs " System.ltframework"
- ;;
- *-*-netbsd*)
- # Don't link with libc until the a.out ld.so is fixed.
- ;;
- *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*)
- # Do not include libc due to us having libc/libc_r.
- ;;
- *-*-sco3.2v5* | *-*-sco5v6*)
- # Causes problems with __ctype
- ;;
- *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*)
- # Compiler inserts libc in the correct place for threads to work
- ;;
- *)
- # Add libc to deplibs on all other systems if necessary.
- if test "$build_libtool_need_lc" = "yes"; then
- func_append deplibs " -lc"
- fi
- ;;
- esac
- fi
-
- # Transform deplibs into only deplibs that can be linked in shared.
- name_save=$name
- libname_save=$libname
- release_save=$release
- versuffix_save=$versuffix
- major_save=$major
- # I'm not sure if I'm treating the release correctly. I think
- # release should show up in the -l (ie -lgmp5) so we don't want to
- # add it in twice. Is that correct?
- release=""
- versuffix=""
- major=""
- newdeplibs=
- droppeddeps=no
- case $deplibs_check_method in
- pass_all)
- # Don't check for shared/static. Everything works.
- # This might be a little naive. We might want to check
- # whether the library exists or not. But this is on
- # osf3 & osf4 and I'm not really sure... Just
- # implementing what was already the behavior.
- newdeplibs=$deplibs
- ;;
- test_compile)
- # This code stresses the "libraries are programs" paradigm to its
- # limits. Maybe even breaks it. We compile a program, linking it
- # against the deplibs as a proxy for the library. Then we can check
- # whether they linked in statically or dynamically with ldd.
- $opt_dry_run || $RM conftest.c
- cat > conftest.c <<EOF
- int main() { return 0; }
-EOF
- $opt_dry_run || $RM conftest
- if $LTCC $LTCFLAGS -o conftest conftest.c $deplibs; then
- ldd_output=`ldd conftest`
- for i in $deplibs; do
- case $i in
- -l*)
- func_stripname -l '' "$i"
- name=$func_stripname_result
- if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then
- case " $predeps $postdeps " in
- *" $i "*)
- func_append newdeplibs " $i"
- i=""
- ;;
- esac
- fi
- if test -n "$i" ; then
- libname=`eval "\\$ECHO \"$libname_spec\""`
- deplib_matches=`eval "\\$ECHO \"$library_names_spec\""`
- set dummy $deplib_matches; shift
- deplib_match=$1
- if test `expr "$ldd_output" : ".*$deplib_match"` -ne 0 ; then
- func_append newdeplibs " $i"
- else
- droppeddeps=yes
- echo
- $ECHO "*** Warning: dynamic linker does not accept needed library $i."
- echo "*** I have the capability to make that library automatically link in when"
- echo "*** you link to this library. But I can only do this if you have a"
- echo "*** shared version of the library, which I believe you do not have"
- echo "*** because a test_compile did reveal that the linker did not use it for"
- echo "*** its dynamic dependency list that programs get resolved with at runtime."
- fi
- fi
- ;;
- *)
- func_append newdeplibs " $i"
- ;;
- esac
- done
- else
- # Error occurred in the first compile. Let's try to salvage
- # the situation: Compile a separate program for each library.
- for i in $deplibs; do
- case $i in
- -l*)
- func_stripname -l '' "$i"
- name=$func_stripname_result
- $opt_dry_run || $RM conftest
- if $LTCC $LTCFLAGS -o conftest conftest.c $i; then
- ldd_output=`ldd conftest`
- if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then
- case " $predeps $postdeps " in
- *" $i "*)
- func_append newdeplibs " $i"
- i=""
- ;;
- esac
- fi
- if test -n "$i" ; then
- libname=`eval "\\$ECHO \"$libname_spec\""`
- deplib_matches=`eval "\\$ECHO \"$library_names_spec\""`
- set dummy $deplib_matches; shift
- deplib_match=$1
- if test `expr "$ldd_output" : ".*$deplib_match"` -ne 0 ; then
- func_append newdeplibs " $i"
- else
- droppeddeps=yes
- echo
- $ECHO "*** Warning: dynamic linker does not accept needed library $i."
- echo "*** I have the capability to make that library automatically link in when"
- echo "*** you link to this library. But I can only do this if you have a"
- echo "*** shared version of the library, which you do not appear to have"
- echo "*** because a test_compile did reveal that the linker did not use this one"
- echo "*** as a dynamic dependency that programs can get resolved with at runtime."
- fi
- fi
- else
- droppeddeps=yes
- echo
- $ECHO "*** Warning! Library $i is needed by this library but I was not able to"
- echo "*** make it link in! You will probably need to install it or some"
- echo "*** library that it depends on before this library will be fully"
- echo "*** functional. Installing it before continuing would be even better."
- fi
- ;;
- *)
- func_append newdeplibs " $i"
- ;;
- esac
- done
- fi
- ;;
- file_magic*)
- set dummy $deplibs_check_method; shift
- file_magic_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"`
- for a_deplib in $deplibs; do
- case $a_deplib in
- -l*)
- func_stripname -l '' "$a_deplib"
- name=$func_stripname_result
- if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then
- case " $predeps $postdeps " in
- *" $a_deplib "*)
- func_append newdeplibs " $a_deplib"
- a_deplib=""
- ;;
- esac
- fi
- if test -n "$a_deplib" ; then
- libname=`eval "\\$ECHO \"$libname_spec\""`
- if test -n "$file_magic_glob"; then
- libnameglob=`func_echo_all "$libname" | $SED -e $file_magic_glob`
- else
- libnameglob=$libname
- fi
- test "$want_nocaseglob" = yes && nocaseglob=`shopt -p nocaseglob`
- for i in $lib_search_path $sys_lib_search_path $shlib_search_path; do
- if test "$want_nocaseglob" = yes; then
- shopt -s nocaseglob
- potential_libs=`ls $i/$libnameglob[.-]* 2>/dev/null`
- $nocaseglob
- else
- potential_libs=`ls $i/$libnameglob[.-]* 2>/dev/null`
- fi
- for potent_lib in $potential_libs; do
- # Follow soft links.
- if ls -lLd "$potent_lib" 2>/dev/null |
- $GREP " -> " >/dev/null; then
- continue
- fi
- # The statement above tries to avoid entering an
- # endless loop below, in case of cyclic links.
- # We might still enter an endless loop, since a link
- # loop can be closed while we follow links,
- # but so what?
- potlib="$potent_lib"
- while test -h "$potlib" 2>/dev/null; do
- potliblink=`ls -ld $potlib | ${SED} 's/.* -> //'`
- case $potliblink in
- [\\/]* | [A-Za-z]:[\\/]*) potlib="$potliblink";;
- *) potlib=`$ECHO "$potlib" | $SED 's,[^/]*$,,'`"$potliblink";;
- esac
- done
- if eval $file_magic_cmd \"\$potlib\" 2>/dev/null |
- $SED -e 10q |
- $EGREP "$file_magic_regex" > /dev/null; then
- func_append newdeplibs " $a_deplib"
- a_deplib=""
- break 2
- fi
- done
- done
- fi
- if test -n "$a_deplib" ; then
- droppeddeps=yes
- echo
- $ECHO "*** Warning: linker path does not have real file for library $a_deplib."
- echo "*** I have the capability to make that library automatically link in when"
- echo "*** you link to this library. But I can only do this if you have a"
- echo "*** shared version of the library, which you do not appear to have"
- echo "*** because I did check the linker path looking for a file starting"
- if test -z "$potlib" ; then
- $ECHO "*** with $libname but no candidates were found. (...for file magic test)"
- else
- $ECHO "*** with $libname and none of the candidates passed a file format test"
- $ECHO "*** using a file magic. Last file checked: $potlib"
- fi
- fi
- ;;
- *)
- # Add a -L argument.
- func_append newdeplibs " $a_deplib"
- ;;
- esac
- done # Gone through all deplibs.
- ;;
- match_pattern*)
- set dummy $deplibs_check_method; shift
- match_pattern_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"`
- for a_deplib in $deplibs; do
- case $a_deplib in
- -l*)
- func_stripname -l '' "$a_deplib"
- name=$func_stripname_result
- if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then
- case " $predeps $postdeps " in
- *" $a_deplib "*)
- func_append newdeplibs " $a_deplib"
- a_deplib=""
- ;;
- esac
- fi
- if test -n "$a_deplib" ; then
- libname=`eval "\\$ECHO \"$libname_spec\""`
- for i in $lib_search_path $sys_lib_search_path $shlib_search_path; do
- potential_libs=`ls $i/$libname[.-]* 2>/dev/null`
- for potent_lib in $potential_libs; do
- potlib="$potent_lib" # see symlink-check above in file_magic test
- if eval "\$ECHO \"$potent_lib\"" 2>/dev/null | $SED 10q | \
- $EGREP "$match_pattern_regex" > /dev/null; then
- func_append newdeplibs " $a_deplib"
- a_deplib=""
- break 2
- fi
- done
- done
- fi
- if test -n "$a_deplib" ; then
- droppeddeps=yes
- echo
- $ECHO "*** Warning: linker path does not have real file for library $a_deplib."
- echo "*** I have the capability to make that library automatically link in when"
- echo "*** you link to this library. But I can only do this if you have a"
- echo "*** shared version of the library, which you do not appear to have"
- echo "*** because I did check the linker path looking for a file starting"
- if test -z "$potlib" ; then
- $ECHO "*** with $libname but no candidates were found. (...for regex pattern test)"
- else
- $ECHO "*** with $libname and none of the candidates passed a file format test"
- $ECHO "*** using a regex pattern. Last file checked: $potlib"
- fi
- fi
- ;;
- *)
- # Add a -L argument.
- func_append newdeplibs " $a_deplib"
- ;;
- esac
- done # Gone through all deplibs.
- ;;
- none | unknown | *)
- newdeplibs=""
- tmp_deplibs=`$ECHO " $deplibs" | $SED 's/ -lc$//; s/ -[LR][^ ]*//g'`
- if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then
- for i in $predeps $postdeps ; do
- # can't use Xsed below, because $i might contain '/'
- tmp_deplibs=`$ECHO " $tmp_deplibs" | $SED "s,$i,,"`
- done
- fi
- case $tmp_deplibs in
- *[!\ \ ]*)
- echo
- if test "X$deplibs_check_method" = "Xnone"; then
- echo "*** Warning: inter-library dependencies are not supported in this platform."
- else
- echo "*** Warning: inter-library dependencies are not known to be supported."
- fi
- echo "*** All declared inter-library dependencies are being dropped."
- droppeddeps=yes
- ;;
- esac
- ;;
- esac
- versuffix=$versuffix_save
- major=$major_save
- release=$release_save
- libname=$libname_save
- name=$name_save
-
- case $host in
- *-*-rhapsody* | *-*-darwin1.[012])
- # On Rhapsody replace the C library with the System framework
- newdeplibs=`$ECHO " $newdeplibs" | $SED 's/ -lc / System.ltframework /'`
- ;;
- esac
-
- if test "$droppeddeps" = yes; then
- if test "$module" = yes; then
- echo
- echo "*** Warning: libtool could not satisfy all declared inter-library"
- $ECHO "*** dependencies of module $libname. Therefore, libtool will create"
- echo "*** a static module, that should work as long as the dlopening"
- echo "*** application is linked with the -dlopen flag."
- if test -z "$global_symbol_pipe"; then
- echo
- echo "*** However, this would only work if libtool was able to extract symbol"
- echo "*** lists from a program, using \`nm' or equivalent, but libtool could"
- echo "*** not find such a program. So, this module is probably useless."
- echo "*** \`nm' from GNU binutils and a full rebuild may help."
- fi
- if test "$build_old_libs" = no; then
- oldlibs="$output_objdir/$libname.$libext"
- build_libtool_libs=module
- build_old_libs=yes
- else
- build_libtool_libs=no
- fi
- else
- echo "*** The inter-library dependencies that have been dropped here will be"
- echo "*** automatically added whenever a program is linked with this library"
- echo "*** or is declared to -dlopen it."
-
- if test "$allow_undefined" = no; then
- echo
- echo "*** Since this library must not contain undefined symbols,"
- echo "*** because either the platform does not support them or"
- echo "*** it was explicitly requested with -no-undefined,"
- echo "*** libtool will only create a static version of it."
- if test "$build_old_libs" = no; then
- oldlibs="$output_objdir/$libname.$libext"
- build_libtool_libs=module
- build_old_libs=yes
- else
- build_libtool_libs=no
- fi
- fi
- fi
- fi
- # Done checking deplibs!
- deplibs=$newdeplibs
- fi
- # Time to change all our "foo.ltframework" stuff back to "-framework foo"
- case $host in
- *-*-darwin*)
- newdeplibs=`$ECHO " $newdeplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'`
- new_inherited_linker_flags=`$ECHO " $new_inherited_linker_flags" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'`
- deplibs=`$ECHO " $deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'`
- ;;
- esac
-
- # move library search paths that coincide with paths to not yet
- # installed libraries to the beginning of the library search list
- new_libs=
- for path in $notinst_path; do
- case " $new_libs " in
- *" -L$path/$objdir "*) ;;
- *)
- case " $deplibs " in
- *" -L$path/$objdir "*)
- func_append new_libs " -L$path/$objdir" ;;
- esac
- ;;
- esac
- done
- for deplib in $deplibs; do
- case $deplib in
- -L*)
- case " $new_libs " in
- *" $deplib "*) ;;
- *) func_append new_libs " $deplib" ;;
- esac
- ;;
- *) func_append new_libs " $deplib" ;;
- esac
- done
- deplibs="$new_libs"
-
- # All the library-specific variables (install_libdir is set above).
- library_names=
- old_library=
- dlname=
-
- # Test again, we may have decided not to build it any more
- if test "$build_libtool_libs" = yes; then
- # Remove ${wl} instances when linking with ld.
- # FIXME: should test the right _cmds variable.
- case $archive_cmds in
- *\$LD\ *) wl= ;;
- esac
- if test "$hardcode_into_libs" = yes; then
- # Hardcode the library paths
- hardcode_libdirs=
- dep_rpath=
- rpath="$finalize_rpath"
- test "$opt_mode" != relink && rpath="$compile_rpath$rpath"
- for libdir in $rpath; do
- if test -n "$hardcode_libdir_flag_spec"; then
- if test -n "$hardcode_libdir_separator"; then
- func_replace_sysroot "$libdir"
- libdir=$func_replace_sysroot_result
- if test -z "$hardcode_libdirs"; then
- hardcode_libdirs="$libdir"
- else
- # Just accumulate the unique libdirs.
- case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in
- *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*)
- ;;
- *)
- func_append hardcode_libdirs "$hardcode_libdir_separator$libdir"
- ;;
- esac
- fi
- else
- eval flag=\"$hardcode_libdir_flag_spec\"
- func_append dep_rpath " $flag"
- fi
- elif test -n "$runpath_var"; then
- case "$perm_rpath " in
- *" $libdir "*) ;;
- *) func_append perm_rpath " $libdir" ;;
- esac
- fi
- done
- # Substitute the hardcoded libdirs into the rpath.
- if test -n "$hardcode_libdir_separator" &&
- test -n "$hardcode_libdirs"; then
- libdir="$hardcode_libdirs"
- eval "dep_rpath=\"$hardcode_libdir_flag_spec\""
- fi
- if test -n "$runpath_var" && test -n "$perm_rpath"; then
- # We should set the runpath_var.
- rpath=
- for dir in $perm_rpath; do
- func_append rpath "$dir:"
- done
- eval "$runpath_var='$rpath\$$runpath_var'; export $runpath_var"
- fi
- test -n "$dep_rpath" && deplibs="$dep_rpath $deplibs"
- fi
-
- shlibpath="$finalize_shlibpath"
- test "$opt_mode" != relink && shlibpath="$compile_shlibpath$shlibpath"
- if test -n "$shlibpath"; then
- eval "$shlibpath_var='$shlibpath\$$shlibpath_var'; export $shlibpath_var"
- fi
-
- # Get the real and link names of the library.
- eval shared_ext=\"$shrext_cmds\"
- eval library_names=\"$library_names_spec\"
- set dummy $library_names
- shift
- realname="$1"
- shift
-
- if test -n "$soname_spec"; then
- eval soname=\"$soname_spec\"
- else
- soname="$realname"
- fi
- if test -z "$dlname"; then
- dlname=$soname
- fi
-
- lib="$output_objdir/$realname"
- linknames=
- for link
- do
- func_append linknames " $link"
- done
-
- # Use standard objects if they are pic
- test -z "$pic_flag" && libobjs=`$ECHO "$libobjs" | $SP2NL | $SED "$lo2o" | $NL2SP`
- test "X$libobjs" = "X " && libobjs=
-
- delfiles=
- if test -n "$export_symbols" && test -n "$include_expsyms"; then
- $opt_dry_run || cp "$export_symbols" "$output_objdir/$libname.uexp"
- export_symbols="$output_objdir/$libname.uexp"
- func_append delfiles " $export_symbols"
- fi
-
- orig_export_symbols=
- case $host_os in
- cygwin* | mingw* | cegcc*)
- if test -n "$export_symbols" && test -z "$export_symbols_regex"; then
- # exporting using user supplied symfile
- if test "x`$SED 1q $export_symbols`" != xEXPORTS; then
- # and it's NOT already a .def file. Must figure out
- # which of the given symbols are data symbols and tag
- # them as such. So, trigger use of export_symbols_cmds.
- # export_symbols gets reassigned inside the "prepare
- # the list of exported symbols" if statement, so the
- # include_expsyms logic still works.
- orig_export_symbols="$export_symbols"
- export_symbols=
- always_export_symbols=yes
- fi
- fi
- ;;
- esac
-
- # Prepare the list of exported symbols
- if test -z "$export_symbols"; then
- if test "$always_export_symbols" = yes || test -n "$export_symbols_regex"; then
- func_verbose "generating symbol list for \`$libname.la'"
- export_symbols="$output_objdir/$libname.exp"
- $opt_dry_run || $RM $export_symbols
- cmds=$export_symbols_cmds
- save_ifs="$IFS"; IFS='~'
- for cmd1 in $cmds; do
- IFS="$save_ifs"
- # Take the normal branch if the nm_file_list_spec branch
- # doesn't work or if tool conversion is not needed.
- case $nm_file_list_spec~$to_tool_file_cmd in
- *~func_convert_file_noop | *~func_convert_file_msys_to_w32 | ~*)
- try_normal_branch=yes
- eval cmd=\"$cmd1\"
- func_len " $cmd"
- len=$func_len_result
- ;;
- *)
- try_normal_branch=no
- ;;
- esac
- if test "$try_normal_branch" = yes \
- && { test "$len" -lt "$max_cmd_len" \
- || test "$max_cmd_len" -le -1; }
- then
- func_show_eval "$cmd" 'exit $?'
- skipped_export=false
- elif test -n "$nm_file_list_spec"; then
- func_basename "$output"
- output_la=$func_basename_result
- save_libobjs=$libobjs
- save_output=$output
- output=${output_objdir}/${output_la}.nm
- func_to_tool_file "$output"
- libobjs=$nm_file_list_spec$func_to_tool_file_result
- func_append delfiles " $output"
- func_verbose "creating $NM input file list: $output"
- for obj in $save_libobjs; do
- func_to_tool_file "$obj"
- $ECHO "$func_to_tool_file_result"
- done > "$output"
- eval cmd=\"$cmd1\"
- func_show_eval "$cmd" 'exit $?'
- output=$save_output
- libobjs=$save_libobjs
- skipped_export=false
- else
- # The command line is too long to execute in one step.
- func_verbose "using reloadable object file for export list..."
- skipped_export=:
- # Break out early, otherwise skipped_export may be
- # set to false by a later but shorter cmd.
- break
- fi
- done
- IFS="$save_ifs"
- if test -n "$export_symbols_regex" && test "X$skipped_export" != "X:"; then
- func_show_eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"'
- func_show_eval '$MV "${export_symbols}T" "$export_symbols"'
- fi
- fi
- fi
-
- if test -n "$export_symbols" && test -n "$include_expsyms"; then
- tmp_export_symbols="$export_symbols"
- test -n "$orig_export_symbols" && tmp_export_symbols="$orig_export_symbols"
- $opt_dry_run || eval '$ECHO "$include_expsyms" | $SP2NL >> "$tmp_export_symbols"'
- fi
-
- if test "X$skipped_export" != "X:" && test -n "$orig_export_symbols"; then
- # The given exports_symbols file has to be filtered, so filter it.
- func_verbose "filter symbol list for \`$libname.la' to tag DATA exports"
- # FIXME: $output_objdir/$libname.filter potentially contains lots of
- # 's' commands which not all seds can handle. GNU sed should be fine
- # though. Also, the filter scales superlinearly with the number of
- # global variables. join(1) would be nice here, but unfortunately
- # isn't a blessed tool.
- $opt_dry_run || $SED -e '/[ ,]DATA/!d;s,\(.*\)\([ \,].*\),s|^\1$|\1\2|,' < $export_symbols > $output_objdir/$libname.filter
- func_append delfiles " $export_symbols $output_objdir/$libname.filter"
- export_symbols=$output_objdir/$libname.def
- $opt_dry_run || $SED -f $output_objdir/$libname.filter < $orig_export_symbols > $export_symbols
- fi
-
- tmp_deplibs=
- for test_deplib in $deplibs; do
- case " $convenience " in
- *" $test_deplib "*) ;;
- *)
- func_append tmp_deplibs " $test_deplib"
- ;;
- esac
- done
- deplibs="$tmp_deplibs"
-
- if test -n "$convenience"; then
- if test -n "$whole_archive_flag_spec" &&
- test "$compiler_needs_object" = yes &&
- test -z "$libobjs"; then
- # extract the archives, so we have objects to list.
- # TODO: could optimize this to just extract one archive.
- whole_archive_flag_spec=
- fi
- if test -n "$whole_archive_flag_spec"; then
- save_libobjs=$libobjs
- eval libobjs=\"\$libobjs $whole_archive_flag_spec\"
- test "X$libobjs" = "X " && libobjs=
- else
- gentop="$output_objdir/${outputname}x"
- func_append generated " $gentop"
-
- func_extract_archives $gentop $convenience
- func_append libobjs " $func_extract_archives_result"
- test "X$libobjs" = "X " && libobjs=
- fi
- fi
-
- if test "$thread_safe" = yes && test -n "$thread_safe_flag_spec"; then
- eval flag=\"$thread_safe_flag_spec\"
- func_append linker_flags " $flag"
- fi
-
- # Make a backup of the uninstalled library when relinking
- if test "$opt_mode" = relink; then
- $opt_dry_run || eval '(cd $output_objdir && $RM ${realname}U && $MV $realname ${realname}U)' || exit $?
- fi
-
- # Do each of the archive commands.
- if test "$module" = yes && test -n "$module_cmds" ; then
- if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then
- eval test_cmds=\"$module_expsym_cmds\"
- cmds=$module_expsym_cmds
- else
- eval test_cmds=\"$module_cmds\"
- cmds=$module_cmds
- fi
- else
- if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then
- eval test_cmds=\"$archive_expsym_cmds\"
- cmds=$archive_expsym_cmds
- else
- eval test_cmds=\"$archive_cmds\"
- cmds=$archive_cmds
- fi
- fi
-
- if test "X$skipped_export" != "X:" &&
- func_len " $test_cmds" &&
- len=$func_len_result &&
- test "$len" -lt "$max_cmd_len" || test "$max_cmd_len" -le -1; then
- :
- else
- # The command line is too long to link in one step, link piecewise
- # or, if using GNU ld and skipped_export is not :, use a linker
- # script.
-
- # Save the value of $output and $libobjs because we want to
- # use them later. If we have whole_archive_flag_spec, we
- # want to use save_libobjs as it was before
- # whole_archive_flag_spec was expanded, because we can't
- # assume the linker understands whole_archive_flag_spec.
- # This may have to be revisited, in case too many
- # convenience libraries get linked in and end up exceeding
- # the spec.
- if test -z "$convenience" || test -z "$whole_archive_flag_spec"; then
- save_libobjs=$libobjs
- fi
- save_output=$output
- func_basename "$output"
- output_la=$func_basename_result
-
- # Clear the reloadable object creation command queue and
- # initialize k to one.
- test_cmds=
- concat_cmds=
- objlist=
- last_robj=
- k=1
-
- if test -n "$save_libobjs" && test "X$skipped_export" != "X:" && test "$with_gnu_ld" = yes; then
- output=${output_objdir}/${output_la}.lnkscript
- func_verbose "creating GNU ld script: $output"
- echo 'INPUT (' > $output
- for obj in $save_libobjs
- do
- func_to_tool_file "$obj"
- $ECHO "$func_to_tool_file_result" >> $output
- done
- echo ')' >> $output
- func_append delfiles " $output"
- func_to_tool_file "$output"
- output=$func_to_tool_file_result
- elif test -n "$save_libobjs" && test "X$skipped_export" != "X:" && test "X$file_list_spec" != X; then
- output=${output_objdir}/${output_la}.lnk
- func_verbose "creating linker input file list: $output"
- : > $output
- set x $save_libobjs
- shift
- firstobj=
- if test "$compiler_needs_object" = yes; then
- firstobj="$1 "
- shift
- fi
- for obj
- do
- func_to_tool_file "$obj"
- $ECHO "$func_to_tool_file_result" >> $output
- done
- func_append delfiles " $output"
- func_to_tool_file "$output"
- output=$firstobj\"$file_list_spec$func_to_tool_file_result\"
- else
- if test -n "$save_libobjs"; then
- func_verbose "creating reloadable object files..."
- output=$output_objdir/$output_la-${k}.$objext
- eval test_cmds=\"$reload_cmds\"
- func_len " $test_cmds"
- len0=$func_len_result
- len=$len0
-
- # Loop over the list of objects to be linked.
- for obj in $save_libobjs
- do
- func_len " $obj"
- func_arith $len + $func_len_result
- len=$func_arith_result
- if test "X$objlist" = X ||
- test "$len" -lt "$max_cmd_len"; then
- func_append objlist " $obj"
- else
- # The command $test_cmds is almost too long, add a
- # command to the queue.
- if test "$k" -eq 1 ; then
- # The first file doesn't have a previous command to add.
- reload_objs=$objlist
- eval concat_cmds=\"$reload_cmds\"
- else
- # All subsequent reloadable object files will link in
- # the last one created.
- reload_objs="$objlist $last_robj"
- eval concat_cmds=\"\$concat_cmds~$reload_cmds~\$RM $last_robj\"
- fi
- last_robj=$output_objdir/$output_la-${k}.$objext
- func_arith $k + 1
- k=$func_arith_result
- output=$output_objdir/$output_la-${k}.$objext
- objlist=" $obj"
- func_len " $last_robj"
- func_arith $len0 + $func_len_result
- len=$func_arith_result
- fi
- done
- # Handle the remaining objects by creating one last
- # reloadable object file. All subsequent reloadable object
- # files will link in the last one created.
- test -z "$concat_cmds" || concat_cmds=$concat_cmds~
- reload_objs="$objlist $last_robj"
- eval concat_cmds=\"\${concat_cmds}$reload_cmds\"
- if test -n "$last_robj"; then
- eval concat_cmds=\"\${concat_cmds}~\$RM $last_robj\"
- fi
- func_append delfiles " $output"
-
- else
- output=
- fi
-
- if ${skipped_export-false}; then
- func_verbose "generating symbol list for \`$libname.la'"
- export_symbols="$output_objdir/$libname.exp"
- $opt_dry_run || $RM $export_symbols
- libobjs=$output
- # Append the command to create the export file.
- test -z "$concat_cmds" || concat_cmds=$concat_cmds~
- eval concat_cmds=\"\$concat_cmds$export_symbols_cmds\"
- if test -n "$last_robj"; then
- eval concat_cmds=\"\$concat_cmds~\$RM $last_robj\"
- fi
- fi
-
- test -n "$save_libobjs" &&
- func_verbose "creating a temporary reloadable object file: $output"
-
- # Loop through the commands generated above and execute them.
- save_ifs="$IFS"; IFS='~'
- for cmd in $concat_cmds; do
- IFS="$save_ifs"
- $opt_silent || {
- func_quote_for_expand "$cmd"
- eval "func_echo $func_quote_for_expand_result"
- }
- $opt_dry_run || eval "$cmd" || {
- lt_exit=$?
-
- # Restore the uninstalled library and exit
- if test "$opt_mode" = relink; then
- ( cd "$output_objdir" && \
- $RM "${realname}T" && \
- $MV "${realname}U" "$realname" )
- fi
-
- exit $lt_exit
- }
- done
- IFS="$save_ifs"
-
- if test -n "$export_symbols_regex" && ${skipped_export-false}; then
- func_show_eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"'
- func_show_eval '$MV "${export_symbols}T" "$export_symbols"'
- fi
- fi
-
- if ${skipped_export-false}; then
- if test -n "$export_symbols" && test -n "$include_expsyms"; then
- tmp_export_symbols="$export_symbols"
- test -n "$orig_export_symbols" && tmp_export_symbols="$orig_export_symbols"
- $opt_dry_run || eval '$ECHO "$include_expsyms" | $SP2NL >> "$tmp_export_symbols"'
- fi
-
- if test -n "$orig_export_symbols"; then
- # The given exports_symbols file has to be filtered, so filter it.
- func_verbose "filter symbol list for \`$libname.la' to tag DATA exports"
- # FIXME: $output_objdir/$libname.filter potentially contains lots of
- # 's' commands which not all seds can handle. GNU sed should be fine
- # though. Also, the filter scales superlinearly with the number of
- # global variables. join(1) would be nice here, but unfortunately
- # isn't a blessed tool.
- $opt_dry_run || $SED -e '/[ ,]DATA/!d;s,\(.*\)\([ \,].*\),s|^\1$|\1\2|,' < $export_symbols > $output_objdir/$libname.filter
- func_append delfiles " $export_symbols $output_objdir/$libname.filter"
- export_symbols=$output_objdir/$libname.def
- $opt_dry_run || $SED -f $output_objdir/$libname.filter < $orig_export_symbols > $export_symbols
- fi
- fi
-
- libobjs=$output
- # Restore the value of output.
- output=$save_output
-
- if test -n "$convenience" && test -n "$whole_archive_flag_spec"; then
- eval libobjs=\"\$libobjs $whole_archive_flag_spec\"
- test "X$libobjs" = "X " && libobjs=
- fi
- # Expand the library linking commands again to reset the
- # value of $libobjs for piecewise linking.
-
- # Do each of the archive commands.
- if test "$module" = yes && test -n "$module_cmds" ; then
- if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then
- cmds=$module_expsym_cmds
- else
- cmds=$module_cmds
- fi
- else
- if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then
- cmds=$archive_expsym_cmds
- else
- cmds=$archive_cmds
- fi
- fi
- fi
-
- if test -n "$delfiles"; then
- # Append the command to remove temporary files to $cmds.
- eval cmds=\"\$cmds~\$RM $delfiles\"
- fi
-
- # Add any objects from preloaded convenience libraries
- if test -n "$dlprefiles"; then
- gentop="$output_objdir/${outputname}x"
- func_append generated " $gentop"
-
- func_extract_archives $gentop $dlprefiles
- func_append libobjs " $func_extract_archives_result"
- test "X$libobjs" = "X " && libobjs=
- fi
-
- save_ifs="$IFS"; IFS='~'
- for cmd in $cmds; do
- IFS="$save_ifs"
- eval cmd=\"$cmd\"
- $opt_silent || {
- func_quote_for_expand "$cmd"
- eval "func_echo $func_quote_for_expand_result"
- }
- $opt_dry_run || eval "$cmd" || {
- lt_exit=$?
-
- # Restore the uninstalled library and exit
- if test "$opt_mode" = relink; then
- ( cd "$output_objdir" && \
- $RM "${realname}T" && \
- $MV "${realname}U" "$realname" )
- fi
-
- exit $lt_exit
- }
- done
- IFS="$save_ifs"
-
- # Restore the uninstalled library and exit
- if test "$opt_mode" = relink; then
- $opt_dry_run || eval '(cd $output_objdir && $RM ${realname}T && $MV $realname ${realname}T && $MV ${realname}U $realname)' || exit $?
-
- if test -n "$convenience"; then
- if test -z "$whole_archive_flag_spec"; then
- func_show_eval '${RM}r "$gentop"'
- fi
- fi
-
- exit $EXIT_SUCCESS
- fi
-
- # Create links to the real library.
- for linkname in $linknames; do
- if test "$realname" != "$linkname"; then
- func_show_eval '(cd "$output_objdir" && $RM "$linkname" && $LN_S "$realname" "$linkname")' 'exit $?'
- fi
- done
-
- # If -module or -export-dynamic was specified, set the dlname.
- if test "$module" = yes || test "$export_dynamic" = yes; then
- # On all known operating systems, these are identical.
- dlname="$soname"
- fi
- fi
- ;;
-
- obj)
- if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then
- func_warning "\`-dlopen' is ignored for objects"
- fi
-
- case " $deplibs" in
- *\ -l* | *\ -L*)
- func_warning "\`-l' and \`-L' are ignored for objects" ;;
- esac
-
- test -n "$rpath" && \
- func_warning "\`-rpath' is ignored for objects"
-
- test -n "$xrpath" && \
- func_warning "\`-R' is ignored for objects"
-
- test -n "$vinfo" && \
- func_warning "\`-version-info' is ignored for objects"
-
- test -n "$release" && \
- func_warning "\`-release' is ignored for objects"
-
- case $output in
- *.lo)
- test -n "$objs$old_deplibs" && \
- func_fatal_error "cannot build library object \`$output' from non-libtool objects"
-
- libobj=$output
- func_lo2o "$libobj"
- obj=$func_lo2o_result
- ;;
- *)
- libobj=
- obj="$output"
- ;;
- esac
-
- # Delete the old objects.
- $opt_dry_run || $RM $obj $libobj
-
- # Objects from convenience libraries. This assumes
- # single-version convenience libraries. Whenever we create
- # different ones for PIC/non-PIC, this we'll have to duplicate
- # the extraction.
- reload_conv_objs=
- gentop=
- # reload_cmds runs $LD directly, so let us get rid of
- # -Wl from whole_archive_flag_spec and hope we can get by with
- # turning comma into space..
- wl=
-
- if test -n "$convenience"; then
- if test -n "$whole_archive_flag_spec"; then
- eval tmp_whole_archive_flags=\"$whole_archive_flag_spec\"
- reload_conv_objs=$reload_objs\ `$ECHO "$tmp_whole_archive_flags" | $SED 's|,| |g'`
- else
- gentop="$output_objdir/${obj}x"
- func_append generated " $gentop"
-
- func_extract_archives $gentop $convenience
- reload_conv_objs="$reload_objs $func_extract_archives_result"
- fi
- fi
-
- # If we're not building shared, we need to use non_pic_objs
- test "$build_libtool_libs" != yes && libobjs="$non_pic_objects"
-
- # Create the old-style object.
- reload_objs="$objs$old_deplibs "`$ECHO "$libobjs" | $SP2NL | $SED "/\.${libext}$/d; /\.lib$/d; $lo2o" | $NL2SP`" $reload_conv_objs" ### testsuite: skip nested quoting test
-
- output="$obj"
- func_execute_cmds "$reload_cmds" 'exit $?'
-
- # Exit if we aren't doing a library object file.
- if test -z "$libobj"; then
- if test -n "$gentop"; then
- func_show_eval '${RM}r "$gentop"'
- fi
-
- exit $EXIT_SUCCESS
- fi
-
- if test "$build_libtool_libs" != yes; then
- if test -n "$gentop"; then
- func_show_eval '${RM}r "$gentop"'
- fi
-
- # Create an invalid libtool object if no PIC, so that we don't
- # accidentally link it into a program.
- # $show "echo timestamp > $libobj"
- # $opt_dry_run || eval "echo timestamp > $libobj" || exit $?
- exit $EXIT_SUCCESS
- fi
-
- if test -n "$pic_flag" || test "$pic_mode" != default; then
- # Only do commands if we really have different PIC objects.
- reload_objs="$libobjs $reload_conv_objs"
- output="$libobj"
- func_execute_cmds "$reload_cmds" 'exit $?'
- fi
-
- if test -n "$gentop"; then
- func_show_eval '${RM}r "$gentop"'
- fi
-
- exit $EXIT_SUCCESS
- ;;
-
- prog)
- case $host in
- *cygwin*) func_stripname '' '.exe' "$output"
- output=$func_stripname_result.exe;;
- esac
- test -n "$vinfo" && \
- func_warning "\`-version-info' is ignored for programs"
-
- test -n "$release" && \
- func_warning "\`-release' is ignored for programs"
-
- test "$preload" = yes \
- && test "$dlopen_support" = unknown \
- && test "$dlopen_self" = unknown \
- && test "$dlopen_self_static" = unknown && \
- func_warning "\`LT_INIT([dlopen])' not used. Assuming no dlopen support."
-
- case $host in
- *-*-rhapsody* | *-*-darwin1.[012])
- # On Rhapsody replace the C library is the System framework
- compile_deplibs=`$ECHO " $compile_deplibs" | $SED 's/ -lc / System.ltframework /'`
- finalize_deplibs=`$ECHO " $finalize_deplibs" | $SED 's/ -lc / System.ltframework /'`
- ;;
- esac
-
- case $host in
- *-*-darwin*)
- # Don't allow lazy linking, it breaks C++ global constructors
- # But is supposedly fixed on 10.4 or later (yay!).
- if test "$tagname" = CXX ; then
- case ${MACOSX_DEPLOYMENT_TARGET-10.0} in
- 10.[0123])
- func_append compile_command " ${wl}-bind_at_load"
- func_append finalize_command " ${wl}-bind_at_load"
- ;;
- esac
- fi
- # Time to change all our "foo.ltframework" stuff back to "-framework foo"
- compile_deplibs=`$ECHO " $compile_deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'`
- finalize_deplibs=`$ECHO " $finalize_deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'`
- ;;
- esac
-
-
- # move library search paths that coincide with paths to not yet
- # installed libraries to the beginning of the library search list
- new_libs=
- for path in $notinst_path; do
- case " $new_libs " in
- *" -L$path/$objdir "*) ;;
- *)
- case " $compile_deplibs " in
- *" -L$path/$objdir "*)
- func_append new_libs " -L$path/$objdir" ;;
- esac
- ;;
- esac
- done
- for deplib in $compile_deplibs; do
- case $deplib in
- -L*)
- case " $new_libs " in
- *" $deplib "*) ;;
- *) func_append new_libs " $deplib" ;;
- esac
- ;;
- *) func_append new_libs " $deplib" ;;
- esac
- done
- compile_deplibs="$new_libs"
-
-
- func_append compile_command " $compile_deplibs"
- func_append finalize_command " $finalize_deplibs"
-
- if test -n "$rpath$xrpath"; then
- # If the user specified any rpath flags, then add them.
- for libdir in $rpath $xrpath; do
- # This is the magic to use -rpath.
- case "$finalize_rpath " in
- *" $libdir "*) ;;
- *) func_append finalize_rpath " $libdir" ;;
- esac
- done
- fi
-
- # Now hardcode the library paths
- rpath=
- hardcode_libdirs=
- for libdir in $compile_rpath $finalize_rpath; do
- if test -n "$hardcode_libdir_flag_spec"; then
- if test -n "$hardcode_libdir_separator"; then
- if test -z "$hardcode_libdirs"; then
- hardcode_libdirs="$libdir"
- else
- # Just accumulate the unique libdirs.
- case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in
- *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*)
- ;;
- *)
- func_append hardcode_libdirs "$hardcode_libdir_separator$libdir"
- ;;
- esac
- fi
- else
- eval flag=\"$hardcode_libdir_flag_spec\"
- func_append rpath " $flag"
- fi
- elif test -n "$runpath_var"; then
- case "$perm_rpath " in
- *" $libdir "*) ;;
- *) func_append perm_rpath " $libdir" ;;
- esac
- fi
- case $host in
- *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*)
- testbindir=`${ECHO} "$libdir" | ${SED} -e 's*/lib$*/bin*'`
- case :$dllsearchpath: in
- *":$libdir:"*) ;;
- ::) dllsearchpath=$libdir;;
- *) func_append dllsearchpath ":$libdir";;
- esac
- case :$dllsearchpath: in
- *":$testbindir:"*) ;;
- ::) dllsearchpath=$testbindir;;
- *) func_append dllsearchpath ":$testbindir";;
- esac
- ;;
- esac
- done
- # Substitute the hardcoded libdirs into the rpath.
- if test -n "$hardcode_libdir_separator" &&
- test -n "$hardcode_libdirs"; then
- libdir="$hardcode_libdirs"
- eval rpath=\" $hardcode_libdir_flag_spec\"
- fi
- compile_rpath="$rpath"
-
- rpath=
- hardcode_libdirs=
- for libdir in $finalize_rpath; do
- if test -n "$hardcode_libdir_flag_spec"; then
- if test -n "$hardcode_libdir_separator"; then
- if test -z "$hardcode_libdirs"; then
- hardcode_libdirs="$libdir"
- else
- # Just accumulate the unique libdirs.
- case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in
- *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*)
- ;;
- *)
- func_append hardcode_libdirs "$hardcode_libdir_separator$libdir"
- ;;
- esac
- fi
- else
- eval flag=\"$hardcode_libdir_flag_spec\"
- func_append rpath " $flag"
- fi
- elif test -n "$runpath_var"; then
- case "$finalize_perm_rpath " in
- *" $libdir "*) ;;
- *) func_append finalize_perm_rpath " $libdir" ;;
- esac
- fi
- done
- # Substitute the hardcoded libdirs into the rpath.
- if test -n "$hardcode_libdir_separator" &&
- test -n "$hardcode_libdirs"; then
- libdir="$hardcode_libdirs"
- eval rpath=\" $hardcode_libdir_flag_spec\"
- fi
- finalize_rpath="$rpath"
-
- if test -n "$libobjs" && test "$build_old_libs" = yes; then
- # Transform all the library objects into standard objects.
- compile_command=`$ECHO "$compile_command" | $SP2NL | $SED "$lo2o" | $NL2SP`
- finalize_command=`$ECHO "$finalize_command" | $SP2NL | $SED "$lo2o" | $NL2SP`
- fi
-
- func_generate_dlsyms "$outputname" "@PROGRAM@" "no"
-
- # template prelinking step
- if test -n "$prelink_cmds"; then
- func_execute_cmds "$prelink_cmds" 'exit $?'
- fi
-
- wrappers_required=yes
- case $host in
- *cegcc* | *mingw32ce*)
- # Disable wrappers for cegcc and mingw32ce hosts, we are cross compiling anyway.
- wrappers_required=no
- ;;
- *cygwin* | *mingw* )
- if test "$build_libtool_libs" != yes; then
- wrappers_required=no
- fi
- ;;
- *)
- if test "$need_relink" = no || test "$build_libtool_libs" != yes; then
- wrappers_required=no
- fi
- ;;
- esac
- if test "$wrappers_required" = no; then
- # Replace the output file specification.
- compile_command=`$ECHO "$compile_command" | $SED 's%@OUTPUT@%'"$output"'%g'`
- link_command="$compile_command$compile_rpath"
-
- # We have no uninstalled library dependencies, so finalize right now.
- exit_status=0
- func_show_eval "$link_command" 'exit_status=$?'
-
- if test -n "$postlink_cmds"; then
- func_to_tool_file "$output"
- postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'`
- func_execute_cmds "$postlink_cmds" 'exit $?'
- fi
-
- # Delete the generated files.
- if test -f "$output_objdir/${outputname}S.${objext}"; then
- func_show_eval '$RM "$output_objdir/${outputname}S.${objext}"'
- fi
-
- exit $exit_status
- fi
-
- if test -n "$compile_shlibpath$finalize_shlibpath"; then
- compile_command="$shlibpath_var=\"$compile_shlibpath$finalize_shlibpath\$$shlibpath_var\" $compile_command"
- fi
- if test -n "$finalize_shlibpath"; then
- finalize_command="$shlibpath_var=\"$finalize_shlibpath\$$shlibpath_var\" $finalize_command"
- fi
-
- compile_var=
- finalize_var=
- if test -n "$runpath_var"; then
- if test -n "$perm_rpath"; then
- # We should set the runpath_var.
- rpath=
- for dir in $perm_rpath; do
- func_append rpath "$dir:"
- done
- compile_var="$runpath_var=\"$rpath\$$runpath_var\" "
- fi
- if test -n "$finalize_perm_rpath"; then
- # We should set the runpath_var.
- rpath=
- for dir in $finalize_perm_rpath; do
- func_append rpath "$dir:"
- done
- finalize_var="$runpath_var=\"$rpath\$$runpath_var\" "
- fi
- fi
-
- if test "$no_install" = yes; then
- # We don't need to create a wrapper script.
- link_command="$compile_var$compile_command$compile_rpath"
- # Replace the output file specification.
- link_command=`$ECHO "$link_command" | $SED 's%@OUTPUT@%'"$output"'%g'`
- # Delete the old output file.
- $opt_dry_run || $RM $output
- # Link the executable and exit
- func_show_eval "$link_command" 'exit $?'
-
- if test -n "$postlink_cmds"; then
- func_to_tool_file "$output"
- postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'`
- func_execute_cmds "$postlink_cmds" 'exit $?'
- fi
-
- exit $EXIT_SUCCESS
- fi
-
- if test "$hardcode_action" = relink; then
- # Fast installation is not supported
- link_command="$compile_var$compile_command$compile_rpath"
- relink_command="$finalize_var$finalize_command$finalize_rpath"
-
- func_warning "this platform does not like uninstalled shared libraries"
- func_warning "\`$output' will be relinked during installation"
- else
- if test "$fast_install" != no; then
- link_command="$finalize_var$compile_command$finalize_rpath"
- if test "$fast_install" = yes; then
- relink_command=`$ECHO "$compile_var$compile_command$compile_rpath" | $SED 's%@OUTPUT@%\$progdir/\$file%g'`
- else
- # fast_install is set to needless
- relink_command=
- fi
- else
- link_command="$compile_var$compile_command$compile_rpath"
- relink_command="$finalize_var$finalize_command$finalize_rpath"
- fi
- fi
-
- # Replace the output file specification.
- link_command=`$ECHO "$link_command" | $SED 's%@OUTPUT@%'"$output_objdir/$outputname"'%g'`
-
- # Delete the old output files.
- $opt_dry_run || $RM $output $output_objdir/$outputname $output_objdir/lt-$outputname
-
- func_show_eval "$link_command" 'exit $?'
-
- if test -n "$postlink_cmds"; then
- func_to_tool_file "$output_objdir/$outputname"
- postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output_objdir/$outputname"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'`
- func_execute_cmds "$postlink_cmds" 'exit $?'
- fi
-
- # Now create the wrapper script.
- func_verbose "creating $output"
-
- # Quote the relink command for shipping.
- if test -n "$relink_command"; then
- # Preserve any variables that may affect compiler behavior
- for var in $variables_saved_for_relink; do
- if eval test -z \"\${$var+set}\"; then
- relink_command="{ test -z \"\${$var+set}\" || $lt_unset $var || { $var=; export $var; }; }; $relink_command"
- elif eval var_value=\$$var; test -z "$var_value"; then
- relink_command="$var=; export $var; $relink_command"
- else
- func_quote_for_eval "$var_value"
- relink_command="$var=$func_quote_for_eval_result; export $var; $relink_command"
- fi
- done
- relink_command="(cd `pwd`; $relink_command)"
- relink_command=`$ECHO "$relink_command" | $SED "$sed_quote_subst"`
- fi
-
- # Only actually do things if not in dry run mode.
- $opt_dry_run || {
- # win32 will think the script is a binary if it has
- # a .exe suffix, so we strip it off here.
- case $output in
- *.exe) func_stripname '' '.exe' "$output"
- output=$func_stripname_result ;;
- esac
- # test for cygwin because mv fails w/o .exe extensions
- case $host in
- *cygwin*)
- exeext=.exe
- func_stripname '' '.exe' "$outputname"
- outputname=$func_stripname_result ;;
- *) exeext= ;;
- esac
- case $host in
- *cygwin* | *mingw* )
- func_dirname_and_basename "$output" "" "."
- output_name=$func_basename_result
- output_path=$func_dirname_result
- cwrappersource="$output_path/$objdir/lt-$output_name.c"
- cwrapper="$output_path/$output_name.exe"
- $RM $cwrappersource $cwrapper
- trap "$RM $cwrappersource $cwrapper; exit $EXIT_FAILURE" 1 2 15
-
- func_emit_cwrapperexe_src > $cwrappersource
-
- # The wrapper executable is built using the $host compiler,
- # because it contains $host paths and files. If cross-
- # compiling, it, like the target executable, must be
- # executed on the $host or under an emulation environment.
- $opt_dry_run || {
- $LTCC $LTCFLAGS -o $cwrapper $cwrappersource
- $STRIP $cwrapper
- }
-
- # Now, create the wrapper script for func_source use:
- func_ltwrapper_scriptname $cwrapper
- $RM $func_ltwrapper_scriptname_result
- trap "$RM $func_ltwrapper_scriptname_result; exit $EXIT_FAILURE" 1 2 15
- $opt_dry_run || {
- # note: this script will not be executed, so do not chmod.
- if test "x$build" = "x$host" ; then
- $cwrapper --lt-dump-script > $func_ltwrapper_scriptname_result
- else
- func_emit_wrapper no > $func_ltwrapper_scriptname_result
- fi
- }
- ;;
- * )
- $RM $output
- trap "$RM $output; exit $EXIT_FAILURE" 1 2 15
-
- func_emit_wrapper no > $output
- chmod +x $output
- ;;
- esac
- }
- exit $EXIT_SUCCESS
- ;;
- esac
-
- # See if we need to build an old-fashioned archive.
- for oldlib in $oldlibs; do
-
- if test "$build_libtool_libs" = convenience; then
- oldobjs="$libobjs_save $symfileobj"
- addlibs="$convenience"
- build_libtool_libs=no
- else
- if test "$build_libtool_libs" = module; then
- oldobjs="$libobjs_save"
- build_libtool_libs=no
- else
- oldobjs="$old_deplibs $non_pic_objects"
- if test "$preload" = yes && test -f "$symfileobj"; then
- func_append oldobjs " $symfileobj"
- fi
- fi
- addlibs="$old_convenience"
- fi
-
- if test -n "$addlibs"; then
- gentop="$output_objdir/${outputname}x"
- func_append generated " $gentop"
-
- func_extract_archives $gentop $addlibs
- func_append oldobjs " $func_extract_archives_result"
- fi
-
- # Do each command in the archive commands.
- if test -n "$old_archive_from_new_cmds" && test "$build_libtool_libs" = yes; then
- cmds=$old_archive_from_new_cmds
- else
-
- # Add any objects from preloaded convenience libraries
- if test -n "$dlprefiles"; then
- gentop="$output_objdir/${outputname}x"
- func_append generated " $gentop"
-
- func_extract_archives $gentop $dlprefiles
- func_append oldobjs " $func_extract_archives_result"
- fi
-
- # POSIX demands no paths to be encoded in archives. We have
- # to avoid creating archives with duplicate basenames if we
- # might have to extract them afterwards, e.g., when creating a
- # static archive out of a convenience library, or when linking
- # the entirety of a libtool archive into another (currently
- # not supported by libtool).
- if (for obj in $oldobjs
- do
- func_basename "$obj"
- $ECHO "$func_basename_result"
- done | sort | sort -uc >/dev/null 2>&1); then
- :
- else
- echo "copying selected object files to avoid basename conflicts..."
- gentop="$output_objdir/${outputname}x"
- func_append generated " $gentop"
- func_mkdir_p "$gentop"
- save_oldobjs=$oldobjs
- oldobjs=
- counter=1
- for obj in $save_oldobjs
- do
- func_basename "$obj"
- objbase="$func_basename_result"
- case " $oldobjs " in
- " ") oldobjs=$obj ;;
- *[\ /]"$objbase "*)
- while :; do
- # Make sure we don't pick an alternate name that also
- # overlaps.
- newobj=lt$counter-$objbase
- func_arith $counter + 1
- counter=$func_arith_result
- case " $oldobjs " in
- *[\ /]"$newobj "*) ;;
- *) if test ! -f "$gentop/$newobj"; then break; fi ;;
- esac
- done
- func_show_eval "ln $obj $gentop/$newobj || cp $obj $gentop/$newobj"
- func_append oldobjs " $gentop/$newobj"
- ;;
- *) func_append oldobjs " $obj" ;;
- esac
- done
- fi
- func_to_tool_file "$oldlib" func_convert_file_msys_to_w32
- tool_oldlib=$func_to_tool_file_result
- eval cmds=\"$old_archive_cmds\"
-
- func_len " $cmds"
- len=$func_len_result
- if test "$len" -lt "$max_cmd_len" || test "$max_cmd_len" -le -1; then
- cmds=$old_archive_cmds
- elif test -n "$archiver_list_spec"; then
- func_verbose "using command file archive linking..."
- for obj in $oldobjs
- do
- func_to_tool_file "$obj"
- $ECHO "$func_to_tool_file_result"
- done > $output_objdir/$libname.libcmd
- func_to_tool_file "$output_objdir/$libname.libcmd"
- oldobjs=" $archiver_list_spec$func_to_tool_file_result"
- cmds=$old_archive_cmds
- else
- # the command line is too long to link in one step, link in parts
- func_verbose "using piecewise archive linking..."
- save_RANLIB=$RANLIB
- RANLIB=:
- objlist=
- concat_cmds=
- save_oldobjs=$oldobjs
- oldobjs=
- # Is there a better way of finding the last object in the list?
- for obj in $save_oldobjs
- do
- last_oldobj=$obj
- done
- eval test_cmds=\"$old_archive_cmds\"
- func_len " $test_cmds"
- len0=$func_len_result
- len=$len0
- for obj in $save_oldobjs
- do
- func_len " $obj"
- func_arith $len + $func_len_result
- len=$func_arith_result
- func_append objlist " $obj"
- if test "$len" -lt "$max_cmd_len"; then
- :
- else
- # the above command should be used before it gets too long
- oldobjs=$objlist
- if test "$obj" = "$last_oldobj" ; then
- RANLIB=$save_RANLIB
- fi
- test -z "$concat_cmds" || concat_cmds=$concat_cmds~
- eval concat_cmds=\"\${concat_cmds}$old_archive_cmds\"
- objlist=
- len=$len0
- fi
- done
- RANLIB=$save_RANLIB
- oldobjs=$objlist
- if test "X$oldobjs" = "X" ; then
- eval cmds=\"\$concat_cmds\"
- else
- eval cmds=\"\$concat_cmds~\$old_archive_cmds\"
- fi
- fi
- fi
- func_execute_cmds "$cmds" 'exit $?'
- done
-
- test -n "$generated" && \
- func_show_eval "${RM}r$generated"
-
- # Now create the libtool archive.
- case $output in
- *.la)
- old_library=
- test "$build_old_libs" = yes && old_library="$libname.$libext"
- func_verbose "creating $output"
-
- # Preserve any variables that may affect compiler behavior
- for var in $variables_saved_for_relink; do
- if eval test -z \"\${$var+set}\"; then
- relink_command="{ test -z \"\${$var+set}\" || $lt_unset $var || { $var=; export $var; }; }; $relink_command"
- elif eval var_value=\$$var; test -z "$var_value"; then
- relink_command="$var=; export $var; $relink_command"
- else
- func_quote_for_eval "$var_value"
- relink_command="$var=$func_quote_for_eval_result; export $var; $relink_command"
- fi
- done
- # Quote the link command for shipping.
- relink_command="(cd `pwd`; $SHELL $progpath $preserve_args --mode=relink $libtool_args @inst_prefix_dir@)"
- relink_command=`$ECHO "$relink_command" | $SED "$sed_quote_subst"`
- if test "$hardcode_automatic" = yes ; then
- relink_command=
- fi
-
- # Only create the output if not a dry run.
- $opt_dry_run || {
- for installed in no yes; do
- if test "$installed" = yes; then
- if test -z "$install_libdir"; then
- break
- fi
- output="$output_objdir/$outputname"i
- # Replace all uninstalled libtool libraries with the installed ones
- newdependency_libs=
- for deplib in $dependency_libs; do
- case $deplib in
- *.la)
- func_basename "$deplib"
- name="$func_basename_result"
- func_resolve_sysroot "$deplib"
- eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $func_resolve_sysroot_result`
- test -z "$libdir" && \
- func_fatal_error "\`$deplib' is not a valid libtool archive"
- func_append newdependency_libs " ${lt_sysroot:+=}$libdir/$name"
- ;;
- -L*)
- func_stripname -L '' "$deplib"
- func_replace_sysroot "$func_stripname_result"
- func_append newdependency_libs " -L$func_replace_sysroot_result"
- ;;
- -R*)
- func_stripname -R '' "$deplib"
- func_replace_sysroot "$func_stripname_result"
- func_append newdependency_libs " -R$func_replace_sysroot_result"
- ;;
- *) func_append newdependency_libs " $deplib" ;;
- esac
- done
- dependency_libs="$newdependency_libs"
- newdlfiles=
-
- for lib in $dlfiles; do
- case $lib in
- *.la)
- func_basename "$lib"
- name="$func_basename_result"
- eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $lib`
- test -z "$libdir" && \
- func_fatal_error "\`$lib' is not a valid libtool archive"
- func_append newdlfiles " ${lt_sysroot:+=}$libdir/$name"
- ;;
- *) func_append newdlfiles " $lib" ;;
- esac
- done
- dlfiles="$newdlfiles"
- newdlprefiles=
- for lib in $dlprefiles; do
- case $lib in
- *.la)
- # Only pass preopened files to the pseudo-archive (for
- # eventual linking with the app. that links it) if we
- # didn't already link the preopened objects directly into
- # the library:
- func_basename "$lib"
- name="$func_basename_result"
- eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $lib`
- test -z "$libdir" && \
- func_fatal_error "\`$lib' is not a valid libtool archive"
- func_append newdlprefiles " ${lt_sysroot:+=}$libdir/$name"
- ;;
- esac
- done
- dlprefiles="$newdlprefiles"
- else
- newdlfiles=
- for lib in $dlfiles; do
- case $lib in
- [\\/]* | [A-Za-z]:[\\/]*) abs="$lib" ;;
- *) abs=`pwd`"/$lib" ;;
- esac
- func_append newdlfiles " $abs"
- done
- dlfiles="$newdlfiles"
- newdlprefiles=
- for lib in $dlprefiles; do
- case $lib in
- [\\/]* | [A-Za-z]:[\\/]*) abs="$lib" ;;
- *) abs=`pwd`"/$lib" ;;
- esac
- func_append newdlprefiles " $abs"
- done
- dlprefiles="$newdlprefiles"
- fi
- $RM $output
- # place dlname in correct position for cygwin
- # In fact, it would be nice if we could use this code for all target
- # systems that can't hard-code library paths into their executables
- # and that have no shared library path variable independent of PATH,
- # but it turns out we can't easily determine that from inspecting
- # libtool variables, so we have to hard-code the OSs to which it
- # applies here; at the moment, that means platforms that use the PE
- # object format with DLL files. See the long comment at the top of
- # tests/bindir.at for full details.
- tdlname=$dlname
- case $host,$output,$installed,$module,$dlname in
- *cygwin*,*lai,yes,no,*.dll | *mingw*,*lai,yes,no,*.dll | *cegcc*,*lai,yes,no,*.dll)
- # If a -bindir argument was supplied, place the dll there.
- if test "x$bindir" != x ;
- then
- func_relative_path "$install_libdir" "$bindir"
- tdlname=$func_relative_path_result$dlname
- else
- # Otherwise fall back on heuristic.
- tdlname=../bin/$dlname
- fi
- ;;
- esac
- $ECHO > $output "\
-# $outputname - a libtool library file
-# Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION
-#
-# Please DO NOT delete this file!
-# It is necessary for linking the library.
-
-# The name that we can dlopen(3).
-dlname='$tdlname'
-
-# Names of this library.
-library_names='$library_names'
-
-# The name of the static archive.
-old_library='$old_library'
-
-# Linker flags that can not go in dependency_libs.
-inherited_linker_flags='$new_inherited_linker_flags'
-
-# Libraries that this one depends upon.
-dependency_libs='$dependency_libs'
-
-# Names of additional weak libraries provided by this library
-weak_library_names='$weak_libs'
-
-# Version information for $libname.
-current=$current
-age=$age
-revision=$revision
-
-# Is this an already installed library?
-installed=$installed
-
-# Should we warn about portability when linking against -modules?
-shouldnotlink=$module
-
-# Files to dlopen/dlpreopen
-dlopen='$dlfiles'
-dlpreopen='$dlprefiles'
-
-# Directory that this library needs to be installed in:
-libdir='$install_libdir'"
- if test "$installed" = no && test "$need_relink" = yes; then
- $ECHO >> $output "\
-relink_command=\"$relink_command\""
- fi
- done
- }
-
- # Do a symbolic link so that the libtool archive can be found in
- # LD_LIBRARY_PATH before the program is installed.
- func_show_eval '( cd "$output_objdir" && $RM "$outputname" && $LN_S "../$outputname" "$outputname" )' 'exit $?'
- ;;
- esac
- exit $EXIT_SUCCESS
-}
-
-{ test "$opt_mode" = link || test "$opt_mode" = relink; } &&
- func_mode_link ${1+"$@"}
-
-
-# func_mode_uninstall arg...
-func_mode_uninstall ()
-{
- $opt_debug
- RM="$nonopt"
- files=
- rmforce=
- exit_status=0
-
- # This variable tells wrapper scripts just to set variables rather
- # than running their programs.
- libtool_install_magic="$magic"
-
- for arg
- do
- case $arg in
- -f) func_append RM " $arg"; rmforce=yes ;;
- -*) func_append RM " $arg" ;;
- *) func_append files " $arg" ;;
- esac
- done
-
- test -z "$RM" && \
- func_fatal_help "you must specify an RM program"
-
- rmdirs=
-
- for file in $files; do
- func_dirname "$file" "" "."
- dir="$func_dirname_result"
- if test "X$dir" = X.; then
- odir="$objdir"
- else
- odir="$dir/$objdir"
- fi
- func_basename "$file"
- name="$func_basename_result"
- test "$opt_mode" = uninstall && odir="$dir"
-
- # Remember odir for removal later, being careful to avoid duplicates
- if test "$opt_mode" = clean; then
- case " $rmdirs " in
- *" $odir "*) ;;
- *) func_append rmdirs " $odir" ;;
- esac
- fi
-
- # Don't error if the file doesn't exist and rm -f was used.
- if { test -L "$file"; } >/dev/null 2>&1 ||
- { test -h "$file"; } >/dev/null 2>&1 ||
- test -f "$file"; then
- :
- elif test -d "$file"; then
- exit_status=1
- continue
- elif test "$rmforce" = yes; then
- continue
- fi
-
- rmfiles="$file"
-
- case $name in
- *.la)
- # Possibly a libtool archive, so verify it.
- if func_lalib_p "$file"; then
- func_source $dir/$name
-
- # Delete the libtool libraries and symlinks.
- for n in $library_names; do
- func_append rmfiles " $odir/$n"
- done
- test -n "$old_library" && func_append rmfiles " $odir/$old_library"
-
- case "$opt_mode" in
- clean)
- case " $library_names " in
- *" $dlname "*) ;;
- *) test -n "$dlname" && func_append rmfiles " $odir/$dlname" ;;
- esac
- test -n "$libdir" && func_append rmfiles " $odir/$name $odir/${name}i"
- ;;
- uninstall)
- if test -n "$library_names"; then
- # Do each command in the postuninstall commands.
- func_execute_cmds "$postuninstall_cmds" 'test "$rmforce" = yes || exit_status=1'
- fi
-
- if test -n "$old_library"; then
- # Do each command in the old_postuninstall commands.
- func_execute_cmds "$old_postuninstall_cmds" 'test "$rmforce" = yes || exit_status=1'
- fi
- # FIXME: should reinstall the best remaining shared library.
- ;;
- esac
- fi
- ;;
-
- *.lo)
- # Possibly a libtool object, so verify it.
- if func_lalib_p "$file"; then
-
- # Read the .lo file
- func_source $dir/$name
-
- # Add PIC object to the list of files to remove.
- if test -n "$pic_object" &&
- test "$pic_object" != none; then
- func_append rmfiles " $dir/$pic_object"
- fi
-
- # Add non-PIC object to the list of files to remove.
- if test -n "$non_pic_object" &&
- test "$non_pic_object" != none; then
- func_append rmfiles " $dir/$non_pic_object"
- fi
- fi
- ;;
-
- *)
- if test "$opt_mode" = clean ; then
- noexename=$name
- case $file in
- *.exe)
- func_stripname '' '.exe' "$file"
- file=$func_stripname_result
- func_stripname '' '.exe' "$name"
- noexename=$func_stripname_result
- # $file with .exe has already been added to rmfiles,
- # add $file without .exe
- func_append rmfiles " $file"
- ;;
- esac
- # Do a test to see if this is a libtool program.
- if func_ltwrapper_p "$file"; then
- if func_ltwrapper_executable_p "$file"; then
- func_ltwrapper_scriptname "$file"
- relink_command=
- func_source $func_ltwrapper_scriptname_result
- func_append rmfiles " $func_ltwrapper_scriptname_result"
- else
- relink_command=
- func_source $dir/$noexename
- fi
-
- # note $name still contains .exe if it was in $file originally
- # as does the version of $file that was added into $rmfiles
- func_append rmfiles " $odir/$name $odir/${name}S.${objext}"
- if test "$fast_install" = yes && test -n "$relink_command"; then
- func_append rmfiles " $odir/lt-$name"
- fi
- if test "X$noexename" != "X$name" ; then
- func_append rmfiles " $odir/lt-${noexename}.c"
- fi
- fi
- fi
- ;;
- esac
- func_show_eval "$RM $rmfiles" 'exit_status=1'
- done
-
- # Try to remove the ${objdir}s in the directories where we deleted files
- for dir in $rmdirs; do
- if test -d "$dir"; then
- func_show_eval "rmdir $dir >/dev/null 2>&1"
- fi
- done
-
- exit $exit_status
-}
-
-{ test "$opt_mode" = uninstall || test "$opt_mode" = clean; } &&
- func_mode_uninstall ${1+"$@"}
-
-test -z "$opt_mode" && {
- help="$generic_help"
- func_fatal_help "you must specify a MODE"
-}
-
-test -z "$exec_cmd" && \
- func_fatal_help "invalid operation mode \`$opt_mode'"
-
-if test -n "$exec_cmd"; then
- eval exec "$exec_cmd"
- exit $EXIT_FAILURE
-fi
-
-exit $exit_status
-
-
-# The TAGs below are defined such that we never get into a situation
-# in which we disable both kinds of libraries. Given conflicting
-# choices, we go for a static library, that is the most portable,
-# since we can't tell whether shared libraries were disabled because
-# the user asked for that or because the platform doesn't support
-# them. This is particularly important on AIX, because we don't
-# support having both static and shared libraries enabled at the same
-# time on that platform, so we default to a shared-only configuration.
-# If a disable-shared tag is given, we'll fallback to a static-only
-# configuration. But we'll never go from static-only to shared-only.
-
-# ### BEGIN LIBTOOL TAG CONFIG: disable-shared
-build_libtool_libs=no
-build_old_libs=yes
-# ### END LIBTOOL TAG CONFIG: disable-shared
-
-# ### BEGIN LIBTOOL TAG CONFIG: disable-static
-build_old_libs=`case $build_libtool_libs in yes) echo no;; *) echo yes;; esac`
-# ### END LIBTOOL TAG CONFIG: disable-static
-
-# Local Variables:
-# mode:shell-script
-# sh-indentation:2
-# End:
-# vi:sw=2
-
diff --git a/build-aux/missing b/build-aux/missing
deleted file mode 100755
index 86a8fc3..0000000
--- a/build-aux/missing
+++ /dev/null
@@ -1,331 +0,0 @@
-#! /bin/sh
-# Common stub for a few missing GNU programs while installing.
-
-scriptversion=2012-01-06.13; # UTC
-
-# Copyright (C) 1996, 1997, 1999, 2000, 2002, 2003, 2004, 2005, 2006,
-# 2008, 2009, 2010, 2011, 2012 Free Software Foundation, Inc.
-# Originally by Fran,cois Pinard <pinard at iro.umontreal.ca>, 1996.
-
-# 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, 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, see <http://www.gnu.org/licenses/>.
-
-# As a special exception to the GNU General Public License, if you
-# distribute this file as part of a program that contains a
-# configuration script generated by Autoconf, you may include it under
-# the same distribution terms that you use for the rest of that program.
-
-if test $# -eq 0; then
- echo 1>&2 "Try \`$0 --help' for more information"
- exit 1
-fi
-
-run=:
-sed_output='s/.* --output[ =]\([^ ]*\).*/\1/p'
-sed_minuso='s/.* -o \([^ ]*\).*/\1/p'
-
-# In the cases where this matters, `missing' is being run in the
-# srcdir already.
-if test -f configure.ac; then
- configure_ac=configure.ac
-else
- configure_ac=configure.in
-fi
-
-msg="missing on your system"
-
-case $1 in
---run)
- # Try to run requested program, and just exit if it succeeds.
- run=
- shift
- "$@" && exit 0
- # Exit code 63 means version mismatch. This often happens
- # when the user try to use an ancient version of a tool on
- # a file that requires a minimum version. In this case we
- # we should proceed has if the program had been absent, or
- # if --run hadn't been passed.
- if test $? = 63; then
- run=:
- msg="probably too old"
- fi
- ;;
-
- -h|--h|--he|--hel|--help)
- echo "\
-$0 [OPTION]... PROGRAM [ARGUMENT]...
-
-Handle \`PROGRAM [ARGUMENT]...' for when PROGRAM is missing, or return an
-error status if there is no known handling for PROGRAM.
-
-Options:
- -h, --help display this help and exit
- -v, --version output version information and exit
- --run try to run the given command, and emulate it if it fails
-
-Supported PROGRAM values:
- aclocal touch file \`aclocal.m4'
- autoconf touch file \`configure'
- autoheader touch file \`config.h.in'
- autom4te touch the output file, or create a stub one
- automake touch all \`Makefile.in' files
- bison create \`y.tab.[ch]', if possible, from existing .[ch]
- flex create \`lex.yy.c', if possible, from existing .c
- help2man touch the output file
- lex create \`lex.yy.c', if possible, from existing .c
- makeinfo touch the output file
- yacc create \`y.tab.[ch]', if possible, from existing .[ch]
-
-Version suffixes to PROGRAM as well as the prefixes \`gnu-', \`gnu', and
-\`g' are ignored when checking the name.
-
-Send bug reports to <bug-automake at gnu.org>."
- exit $?
- ;;
-
- -v|--v|--ve|--ver|--vers|--versi|--versio|--version)
- echo "missing $scriptversion (GNU Automake)"
- exit $?
- ;;
-
- -*)
- echo 1>&2 "$0: Unknown \`$1' option"
- echo 1>&2 "Try \`$0 --help' for more information"
- exit 1
- ;;
-
-esac
-
-# normalize program name to check for.
-program=`echo "$1" | sed '
- s/^gnu-//; t
- s/^gnu//; t
- s/^g//; t'`
-
-# Now exit if we have it, but it failed. Also exit now if we
-# don't have it and --version was passed (most likely to detect
-# the program). This is about non-GNU programs, so use $1 not
-# $program.
-case $1 in
- lex*|yacc*)
- # Not GNU programs, they don't have --version.
- ;;
-
- *)
- if test -z "$run" && ($1 --version) > /dev/null 2>&1; then
- # We have it, but it failed.
- exit 1
- elif test "x$2" = "x--version" || test "x$2" = "x--help"; then
- # Could not run --version or --help. This is probably someone
- # running `$TOOL --version' or `$TOOL --help' to check whether
- # $TOOL exists and not knowing $TOOL uses missing.
- exit 1
- fi
- ;;
-esac
-
-# If it does not exist, or fails to run (possibly an outdated version),
-# try to emulate it.
-case $program in
- aclocal*)
- echo 1>&2 "\
-WARNING: \`$1' is $msg. You should only need it if
- you modified \`acinclude.m4' or \`${configure_ac}'. You might want
- to install the \`Automake' and \`Perl' packages. Grab them from
- any GNU archive site."
- touch aclocal.m4
- ;;
-
- autoconf*)
- echo 1>&2 "\
-WARNING: \`$1' is $msg. You should only need it if
- you modified \`${configure_ac}'. You might want to install the
- \`Autoconf' and \`GNU m4' packages. Grab them from any GNU
- archive site."
- touch configure
- ;;
-
- autoheader*)
- echo 1>&2 "\
-WARNING: \`$1' is $msg. You should only need it if
- you modified \`acconfig.h' or \`${configure_ac}'. You might want
- to install the \`Autoconf' and \`GNU m4' packages. Grab them
- from any GNU archive site."
- files=`sed -n 's/^[ ]*A[CM]_CONFIG_HEADER(\([^)]*\)).*/\1/p' ${configure_ac}`
- test -z "$files" && files="config.h"
- touch_files=
- for f in $files; do
- case $f in
- *:*) touch_files="$touch_files "`echo "$f" |
- sed -e 's/^[^:]*://' -e 's/:.*//'`;;
- *) touch_files="$touch_files $f.in";;
- esac
- done
- touch $touch_files
- ;;
-
- automake*)
- echo 1>&2 "\
-WARNING: \`$1' is $msg. You should only need it if
- you modified \`Makefile.am', \`acinclude.m4' or \`${configure_ac}'.
- You might want to install the \`Automake' and \`Perl' packages.
- Grab them from any GNU archive site."
- find . -type f -name Makefile.am -print |
- sed 's/\.am$/.in/' |
- while read f; do touch "$f"; done
- ;;
-
- autom4te*)
- echo 1>&2 "\
-WARNING: \`$1' is needed, but is $msg.
- You might have modified some files without having the
- proper tools for further handling them.
- You can get \`$1' as part of \`Autoconf' from any GNU
- archive site."
-
- file=`echo "$*" | sed -n "$sed_output"`
- test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"`
- if test -f "$file"; then
- touch $file
- else
- test -z "$file" || exec >$file
- echo "#! /bin/sh"
- echo "# Created by GNU Automake missing as a replacement of"
- echo "# $ $@"
- echo "exit 0"
- chmod +x $file
- exit 1
- fi
- ;;
-
- bison*|yacc*)
- echo 1>&2 "\
-WARNING: \`$1' $msg. You should only need it if
- you modified a \`.y' file. You may need the \`Bison' package
- in order for those modifications to take effect. You can get
- \`Bison' from any GNU archive site."
- rm -f y.tab.c y.tab.h
- if test $# -ne 1; then
- eval LASTARG=\${$#}
- case $LASTARG in
- *.y)
- SRCFILE=`echo "$LASTARG" | sed 's/y$/c/'`
- if test -f "$SRCFILE"; then
- cp "$SRCFILE" y.tab.c
- fi
- SRCFILE=`echo "$LASTARG" | sed 's/y$/h/'`
- if test -f "$SRCFILE"; then
- cp "$SRCFILE" y.tab.h
- fi
- ;;
- esac
- fi
- if test ! -f y.tab.h; then
- echo >y.tab.h
- fi
- if test ! -f y.tab.c; then
- echo 'main() { return 0; }' >y.tab.c
- fi
- ;;
-
- lex*|flex*)
- echo 1>&2 "\
-WARNING: \`$1' is $msg. You should only need it if
- you modified a \`.l' file. You may need the \`Flex' package
- in order for those modifications to take effect. You can get
- \`Flex' from any GNU archive site."
- rm -f lex.yy.c
- if test $# -ne 1; then
- eval LASTARG=\${$#}
- case $LASTARG in
- *.l)
- SRCFILE=`echo "$LASTARG" | sed 's/l$/c/'`
- if test -f "$SRCFILE"; then
- cp "$SRCFILE" lex.yy.c
- fi
- ;;
- esac
- fi
- if test ! -f lex.yy.c; then
- echo 'main() { return 0; }' >lex.yy.c
- fi
- ;;
-
- help2man*)
- echo 1>&2 "\
-WARNING: \`$1' is $msg. You should only need it if
- you modified a dependency of a manual page. You may need the
- \`Help2man' package in order for those modifications to take
- effect. You can get \`Help2man' from any GNU archive site."
-
- file=`echo "$*" | sed -n "$sed_output"`
- test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"`
- if test -f "$file"; then
- touch $file
- else
- test -z "$file" || exec >$file
- echo ".ab help2man is required to generate this page"
- exit $?
- fi
- ;;
-
- makeinfo*)
- echo 1>&2 "\
-WARNING: \`$1' is $msg. You should only need it if
- you modified a \`.texi' or \`.texinfo' file, or any other file
- indirectly affecting the aspect of the manual. The spurious
- call might also be the consequence of using a buggy \`make' (AIX,
- DU, IRIX). You might want to install the \`Texinfo' package or
- the \`GNU make' package. Grab either from any GNU archive site."
- # The file to touch is that specified with -o ...
- file=`echo "$*" | sed -n "$sed_output"`
- test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"`
- if test -z "$file"; then
- # ... or it is the one specified with @setfilename ...
- infile=`echo "$*" | sed 's/.* \([^ ]*\) *$/\1/'`
- file=`sed -n '
- /^@setfilename/{
- s/.* \([^ ]*\) *$/\1/
- p
- q
- }' $infile`
- # ... or it is derived from the source name (dir/f.texi becomes f.info)
- test -z "$file" && file=`echo "$infile" | sed 's,.*/,,;s,.[^.]*$,,'`.info
- fi
- # If the file does not exist, the user really needs makeinfo;
- # let's fail without touching anything.
- test -f $file || exit 1
- touch $file
- ;;
-
- *)
- echo 1>&2 "\
-WARNING: \`$1' is needed, and is $msg.
- You might have modified some files without having the
- proper tools for further handling them. Check the \`README' file,
- it often tells you about the needed prerequisites for installing
- this package. You may also peek at any GNU archive site, in case
- some other package would contain this missing \`$1' program."
- exit 1
- ;;
-esac
-
-exit 0
-
-# Local variables:
-# eval: (add-hook 'write-file-hooks 'time-stamp)
-# time-stamp-start: "scriptversion="
-# time-stamp-format: "%:y-%02m-%02d.%02H"
-# time-stamp-time-zone: "UTC"
-# time-stamp-end: "; # UTC"
-# End:
diff --git a/config.h.in b/config.h.in
deleted file mode 100644
index 44eb0b5..0000000
--- a/config.h.in
+++ /dev/null
@@ -1,173 +0,0 @@
-/* config.h.in. Generated from configure.ac by autoheader. */
-
-/* Define if building universal (internal helper macro) */
-#undef AC_APPLE_UNIVERSAL_BUILD
-
-/* what version of FFLAS-FFPACK is installed */
-#undef FFLAS_FFPACK_VERSION
-
-/* Define if GMP is version 3.xxx */
-#undef GMP_VERSION_3
-
-/* Define that architecture uses big endian storage */
-#undef HAVE_BIG_ENDIAN
-
-/* Define to 1 if you have the <dlfcn.h> header file. */
-#undef HAVE_DLFCN_H
-
-/* Define if FFLAS-FFPACK is installed */
-#undef HAVE_FFLAS_FFPACK
-
-/* Define to 1 if you have the <float.h> header file. */
-#undef HAVE_FLOAT_H
-
-/* Define if FPLLL is installed */
-#undef HAVE_FPLLL
-
-/* ps2pdf available as external program */
-#undef HAVE_GHOSTSCRIPT
-
-/* Define if GIVARO is installed */
-#undef HAVE_GIVARO
-
-/* Define if GMP is installed */
-#undef HAVE_GMP
-
-/* gnuplot available as external program */
-#undef HAVE_GNUPLOT
-
-/* Define if IML is installed */
-#undef HAVE_IML
-
-/* Define to 1 if you have the <inttypes.h> header file. */
-#undef HAVE_INTTYPES_H
-
-/* Define if LAPACK is available */
-#undef HAVE_LAPACK
-
-/* Define if LIDIA is installed */
-#undef HAVE_LIDIA
-
-/* Define to 1 if you have the <limits.h> header file. */
-#undef HAVE_LIMITS_H
-
-/* Define that architecture uses little endian storage */
-#undef HAVE_LITTLE_ENDIAN
-
-/* Define if M4RI is installed */
-#undef HAVE_M4RI
-
-/* Define if M4RIE is installed */
-#undef HAVE_M4RIE
-
-/* Define if MAPLE is installed */
-#undef HAVE_MAPLE
-
-/* Define to 1 if you have the <memory.h> header file. */
-#undef HAVE_MEMORY_H
-
-/* Define if MPFR is installed */
-#undef HAVE_MPFR
-
-/* Define if NTL is installed */
-#undef HAVE_NTL
-
-/* Define if SACLIB is installed */
-#undef HAVE_SACLIB
-
-/* Define to 1 if you have the <stddef.h> header file. */
-#undef HAVE_STDDEF_H
-
-/* Define to 1 if you have the <stdint.h> header file. */
-#undef HAVE_STDINT_H
-
-/* Define to 1 if you have the <stdlib.h> header file. */
-#undef HAVE_STDLIB_H
-
-/* Define to 1 if you have the <strings.h> header file. */
-#undef HAVE_STRINGS_H
-
-/* Define to 1 if you have the <string.h> header file. */
-#undef HAVE_STRING_H
-
-/* Define to 1 if you have the <sys/stat.h> header file. */
-#undef HAVE_SYS_STAT_H
-
-/* Define to 1 if you have the <sys/time.h> header file. */
-#undef HAVE_SYS_TIME_H
-
-/* Define to 1 if you have the <sys/types.h> header file. */
-#undef HAVE_SYS_TYPES_H
-
-/* Define to 1 if you have the <unistd.h> header file. */
-#undef HAVE_UNISTD_H
-
-/* Define to the sub-directory in which libtool stores uninstalled libraries.
- */
-#undef LT_OBJDIR
-
-/* define is the version of Maple have access function to gmp data */
-#undef MAPLE_GMP_ACCESS
-
-/* Name of package */
-#undef PACKAGE
-
-/* Define to the address where bug reports for this package should be sent. */
-#undef PACKAGE_BUGREPORT
-
-/* Define to the full name of this package. */
-#undef PACKAGE_NAME
-
-/* Define to the full name and version of this package. */
-#undef PACKAGE_STRING
-
-/* Define to the one symbol short name of this package. */
-#undef PACKAGE_TARNAME
-
-/* Define to the home page for this package. */
-#undef PACKAGE_URL
-
-/* Define to the version of this package. */
-#undef PACKAGE_VERSION
-
-/* The size of `char', as computed by sizeof. */
-#undef SIZEOF_CHAR
-
-/* The size of `int', as computed by sizeof. */
-#undef SIZEOF_INT
-
-/* The size of `long', as computed by sizeof. */
-#undef SIZEOF_LONG
-
-/* The size of `long long', as computed by sizeof. */
-#undef SIZEOF_LONG_LONG
-
-/* The size of `short', as computed by sizeof. */
-#undef SIZEOF_SHORT
-
-/* The size of `__int64', as computed by sizeof. */
-#undef SIZEOF___INT64
-
-/* Define to 1 if you have the ANSI C header files. */
-#undef STDC_HEADERS
-
-/* Version number of package */
-#undef VERSION
-
-/* optimized threshold for switching to strassen matrix multiplication */
-#undef WINOTHRESHOLD
-
-/* Define WORDS_BIGENDIAN to 1 if your processor stores words with the most
- significant byte first (like Motorola and SPARC, unlike Intel). */
-#if defined AC_APPLE_UNIVERSAL_BUILD
-# if defined __BIG_ENDIAN__
-# define WORDS_BIGENDIAN 1
-# endif
-#else
-# ifndef WORDS_BIGENDIAN
-# undef WORDS_BIGENDIAN
-# endif
-#endif
-
-/* Define if Expat is installed */
-#undef XMLENABLED
diff --git a/configure b/configure
deleted file mode 100755
index 279172c..0000000
--- a/configure
+++ /dev/null
@@ -1,21334 +0,0 @@
-#! /bin/sh
-# Guess values for system-dependent variables and create Makefiles.
-# Generated by GNU Autoconf 2.69 for LinBox 1.3.2.
-#
-# Report bugs to <linbox-use at googlegroups.com>.
-#
-#
-# Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc.
-#
-#
-# This configure script is free software; the Free Software Foundation
-# gives unlimited permission to copy, distribute and modify it.
-## -------------------- ##
-## M4sh Initialization. ##
-## -------------------- ##
-
-# Be more Bourne compatible
-DUALCASE=1; export DUALCASE # for MKS sh
-if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then :
- emulate sh
- NULLCMD=:
- # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which
- # is contrary to our usage. Disable this feature.
- alias -g '${1+"$@"}'='"$@"'
- setopt NO_GLOB_SUBST
-else
- case `(set -o) 2>/dev/null` in #(
- *posix*) :
- set -o posix ;; #(
- *) :
- ;;
-esac
-fi
-
-
-as_nl='
-'
-export as_nl
-# Printing a long string crashes Solaris 7 /usr/bin/printf.
-as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
-as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo
-as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo
-# Prefer a ksh shell builtin over an external printf program on Solaris,
-# but without wasting forks for bash or zsh.
-if test -z "$BASH_VERSION$ZSH_VERSION" \
- && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then
- as_echo='print -r --'
- as_echo_n='print -rn --'
-elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then
- as_echo='printf %s\n'
- as_echo_n='printf %s'
-else
- if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then
- as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"'
- as_echo_n='/usr/ucb/echo -n'
- else
- as_echo_body='eval expr "X$1" : "X\\(.*\\)"'
- as_echo_n_body='eval
- arg=$1;
- case $arg in #(
- *"$as_nl"*)
- expr "X$arg" : "X\\(.*\\)$as_nl";
- arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;;
- esac;
- expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl"
- '
- export as_echo_n_body
- as_echo_n='sh -c $as_echo_n_body as_echo'
- fi
- export as_echo_body
- as_echo='sh -c $as_echo_body as_echo'
-fi
-
-# The user is always right.
-if test "${PATH_SEPARATOR+set}" != set; then
- PATH_SEPARATOR=:
- (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && {
- (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 ||
- PATH_SEPARATOR=';'
- }
-fi
-
-
-# IFS
-# We need space, tab and new line, in precisely that order. Quoting is
-# there to prevent editors from complaining about space-tab.
-# (If _AS_PATH_WALK were called with IFS unset, it would disable word
-# splitting by setting IFS to empty value.)
-IFS=" "" $as_nl"
-
-# Find who we are. Look in the path if we contain no directory separator.
-as_myself=
-case $0 in #((
- *[\\/]* ) as_myself=$0 ;;
- *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
- IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
- test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
- done
-IFS=$as_save_IFS
-
- ;;
-esac
-# We did not find ourselves, most probably we were run as `sh COMMAND'
-# in which case we are not to be found in the path.
-if test "x$as_myself" = x; then
- as_myself=$0
-fi
-if test ! -f "$as_myself"; then
- $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2
- exit 1
-fi
-
-# Unset variables that we do not need and which cause bugs (e.g. in
-# pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1"
-# suppresses any "Segmentation fault" message there. '((' could
-# trigger a bug in pdksh 5.2.14.
-for as_var in BASH_ENV ENV MAIL MAILPATH
-do eval test x\${$as_var+set} = xset \
- && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || :
-done
-PS1='$ '
-PS2='> '
-PS4='+ '
-
-# NLS nuisances.
-LC_ALL=C
-export LC_ALL
-LANGUAGE=C
-export LANGUAGE
-
-# CDPATH.
-(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
-
-# Use a proper internal environment variable to ensure we don't fall
- # into an infinite loop, continuously re-executing ourselves.
- if test x"${_as_can_reexec}" != xno && test "x$CONFIG_SHELL" != x; then
- _as_can_reexec=no; export _as_can_reexec;
- # We cannot yet assume a decent shell, so we have to provide a
-# neutralization value for shells without unset; and this also
-# works around shells that cannot unset nonexistent variables.
-# Preserve -v and -x to the replacement shell.
-BASH_ENV=/dev/null
-ENV=/dev/null
-(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV
-case $- in # ((((
- *v*x* | *x*v* ) as_opts=-vx ;;
- *v* ) as_opts=-v ;;
- *x* ) as_opts=-x ;;
- * ) as_opts= ;;
-esac
-exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"}
-# Admittedly, this is quite paranoid, since all the known shells bail
-# out after a failed `exec'.
-$as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2
-as_fn_exit 255
- fi
- # We don't want this to propagate to other subprocesses.
- { _as_can_reexec=; unset _as_can_reexec;}
-if test "x$CONFIG_SHELL" = x; then
- as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then :
- emulate sh
- NULLCMD=:
- # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which
- # is contrary to our usage. Disable this feature.
- alias -g '\${1+\"\$@\"}'='\"\$@\"'
- setopt NO_GLOB_SUBST
-else
- case \`(set -o) 2>/dev/null\` in #(
- *posix*) :
- set -o posix ;; #(
- *) :
- ;;
-esac
-fi
-"
- as_required="as_fn_return () { (exit \$1); }
-as_fn_success () { as_fn_return 0; }
-as_fn_failure () { as_fn_return 1; }
-as_fn_ret_success () { return 0; }
-as_fn_ret_failure () { return 1; }
-
-exitcode=0
-as_fn_success || { exitcode=1; echo as_fn_success failed.; }
-as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; }
-as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; }
-as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; }
-if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then :
-
-else
- exitcode=1; echo positional parameters were not saved.
-fi
-test x\$exitcode = x0 || exit 1
-test -x / || exit 1"
- as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO
- as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO
- eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" &&
- test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1
-test \$(( 1 + 1 )) = 2 || exit 1
-
- test -n \"\${ZSH_VERSION+set}\${BASH_VERSION+set}\" || (
- ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
- ECHO=\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO
- ECHO=\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO
- PATH=/empty FPATH=/empty; export PATH FPATH
- test \"X\`printf %s \$ECHO\`\" = \"X\$ECHO\" \\
- || test \"X\`print -r -- \$ECHO\`\" = \"X\$ECHO\" ) || exit 1"
- if (eval "$as_required") 2>/dev/null; then :
- as_have_required=yes
-else
- as_have_required=no
-fi
- if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then :
-
-else
- as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-as_found=false
-for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH
-do
- IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
- as_found=:
- case $as_dir in #(
- /*)
- for as_base in sh bash ksh sh5; do
- # Try only shells that exist, to save several forks.
- as_shell=$as_dir/$as_base
- if { test -f "$as_shell" || test -f "$as_shell.exe"; } &&
- { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then :
- CONFIG_SHELL=$as_shell as_have_required=yes
- if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then :
- break 2
-fi
-fi
- done;;
- esac
- as_found=false
-done
-$as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } &&
- { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then :
- CONFIG_SHELL=$SHELL as_have_required=yes
-fi; }
-IFS=$as_save_IFS
-
-
- if test "x$CONFIG_SHELL" != x; then :
- export CONFIG_SHELL
- # We cannot yet assume a decent shell, so we have to provide a
-# neutralization value for shells without unset; and this also
-# works around shells that cannot unset nonexistent variables.
-# Preserve -v and -x to the replacement shell.
-BASH_ENV=/dev/null
-ENV=/dev/null
-(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV
-case $- in # ((((
- *v*x* | *x*v* ) as_opts=-vx ;;
- *v* ) as_opts=-v ;;
- *x* ) as_opts=-x ;;
- * ) as_opts= ;;
-esac
-exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"}
-# Admittedly, this is quite paranoid, since all the known shells bail
-# out after a failed `exec'.
-$as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2
-exit 255
-fi
-
- if test x$as_have_required = xno; then :
- $as_echo "$0: This script requires a shell more modern than all"
- $as_echo "$0: the shells that I found on your system."
- if test x${ZSH_VERSION+set} = xset ; then
- $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should"
- $as_echo "$0: be upgraded to zsh 4.3.4 or later."
- else
- $as_echo "$0: Please tell bug-autoconf at gnu.org and
-$0: linbox-use at googlegroups.com about your system,
-$0: including any error possibly output before this
-$0: message. Then install a modern shell, or manually run
-$0: the script under such a shell if you do have one."
- fi
- exit 1
-fi
-fi
-fi
-SHELL=${CONFIG_SHELL-/bin/sh}
-export SHELL
-# Unset more variables known to interfere with behavior of common tools.
-CLICOLOR_FORCE= GREP_OPTIONS=
-unset CLICOLOR_FORCE GREP_OPTIONS
-
-## --------------------- ##
-## M4sh Shell Functions. ##
-## --------------------- ##
-# as_fn_unset VAR
-# ---------------
-# Portably unset VAR.
-as_fn_unset ()
-{
- { eval $1=; unset $1;}
-}
-as_unset=as_fn_unset
-
-# as_fn_set_status STATUS
-# -----------------------
-# Set $? to STATUS, without forking.
-as_fn_set_status ()
-{
- return $1
-} # as_fn_set_status
-
-# as_fn_exit STATUS
-# -----------------
-# Exit the shell with STATUS, even in a "trap 0" or "set -e" context.
-as_fn_exit ()
-{
- set +e
- as_fn_set_status $1
- exit $1
-} # as_fn_exit
-
-# as_fn_mkdir_p
-# -------------
-# Create "$as_dir" as a directory, including parents if necessary.
-as_fn_mkdir_p ()
-{
-
- case $as_dir in #(
- -*) as_dir=./$as_dir;;
- esac
- test -d "$as_dir" || eval $as_mkdir_p || {
- as_dirs=
- while :; do
- case $as_dir in #(
- *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'(
- *) as_qdir=$as_dir;;
- esac
- as_dirs="'$as_qdir' $as_dirs"
- as_dir=`$as_dirname -- "$as_dir" ||
-$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
- X"$as_dir" : 'X\(//\)[^/]' \| \
- X"$as_dir" : 'X\(//\)$' \| \
- X"$as_dir" : 'X\(/\)' \| . 2>/dev/null ||
-$as_echo X"$as_dir" |
- sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
- s//\1/
- q
- }
- /^X\(\/\/\)[^/].*/{
- s//\1/
- q
- }
- /^X\(\/\/\)$/{
- s//\1/
- q
- }
- /^X\(\/\).*/{
- s//\1/
- q
- }
- s/.*/./; q'`
- test -d "$as_dir" && break
- done
- test -z "$as_dirs" || eval "mkdir $as_dirs"
- } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir"
-
-
-} # as_fn_mkdir_p
-
-# as_fn_executable_p FILE
-# -----------------------
-# Test if FILE is an executable regular file.
-as_fn_executable_p ()
-{
- test -f "$1" && test -x "$1"
-} # as_fn_executable_p
-# as_fn_append VAR VALUE
-# ----------------------
-# Append the text in VALUE to the end of the definition contained in VAR. Take
-# advantage of any shell optimizations that allow amortized linear growth over
-# repeated appends, instead of the typical quadratic growth present in naive
-# implementations.
-if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then :
- eval 'as_fn_append ()
- {
- eval $1+=\$2
- }'
-else
- as_fn_append ()
- {
- eval $1=\$$1\$2
- }
-fi # as_fn_append
-
-# as_fn_arith ARG...
-# ------------------
-# Perform arithmetic evaluation on the ARGs, and store the result in the
-# global $as_val. Take advantage of shells that can avoid forks. The arguments
-# must be portable across $(()) and expr.
-if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then :
- eval 'as_fn_arith ()
- {
- as_val=$(( $* ))
- }'
-else
- as_fn_arith ()
- {
- as_val=`expr "$@" || test $? -eq 1`
- }
-fi # as_fn_arith
-
-
-# as_fn_error STATUS ERROR [LINENO LOG_FD]
-# ----------------------------------------
-# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are
-# provided, also output the error to LOG_FD, referencing LINENO. Then exit the
-# script with STATUS, using 1 if that was 0.
-as_fn_error ()
-{
- as_status=$1; test $as_status -eq 0 && as_status=1
- if test "$4"; then
- as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
- $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4
- fi
- $as_echo "$as_me: error: $2" >&2
- as_fn_exit $as_status
-} # as_fn_error
-
-if expr a : '\(a\)' >/dev/null 2>&1 &&
- test "X`expr 00001 : '.*\(...\)'`" = X001; then
- as_expr=expr
-else
- as_expr=false
-fi
-
-if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then
- as_basename=basename
-else
- as_basename=false
-fi
-
-if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then
- as_dirname=dirname
-else
- as_dirname=false
-fi
-
-as_me=`$as_basename -- "$0" ||
-$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
- X"$0" : 'X\(//\)$' \| \
- X"$0" : 'X\(/\)' \| . 2>/dev/null ||
-$as_echo X/"$0" |
- sed '/^.*\/\([^/][^/]*\)\/*$/{
- s//\1/
- q
- }
- /^X\/\(\/\/\)$/{
- s//\1/
- q
- }
- /^X\/\(\/\).*/{
- s//\1/
- q
- }
- s/.*/./; q'`
-
-# Avoid depending upon Character Ranges.
-as_cr_letters='abcdefghijklmnopqrstuvwxyz'
-as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
-as_cr_Letters=$as_cr_letters$as_cr_LETTERS
-as_cr_digits='0123456789'
-as_cr_alnum=$as_cr_Letters$as_cr_digits
-
-
- as_lineno_1=$LINENO as_lineno_1a=$LINENO
- as_lineno_2=$LINENO as_lineno_2a=$LINENO
- eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" &&
- test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || {
- # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-)
- sed -n '
- p
- /[$]LINENO/=
- ' <$as_myself |
- sed '
- s/[$]LINENO.*/&-/
- t lineno
- b
- :lineno
- N
- :loop
- s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/
- t loop
- s/-\n.*//
- ' >$as_me.lineno &&
- chmod +x "$as_me.lineno" ||
- { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; }
-
- # If we had to re-execute with $CONFIG_SHELL, we're ensured to have
- # already done that, so ensure we don't try to do so again and fall
- # in an infinite loop. This has already happened in practice.
- _as_can_reexec=no; export _as_can_reexec
- # Don't try to exec as it changes $[0], causing all sort of problems
- # (the dirname of $[0] is not the place where we might find the
- # original and so on. Autoconf is especially sensitive to this).
- . "./$as_me.lineno"
- # Exit status is that of the last command.
- exit
-}
-
-ECHO_C= ECHO_N= ECHO_T=
-case `echo -n x` in #(((((
--n*)
- case `echo 'xy\c'` in
- *c*) ECHO_T=' ';; # ECHO_T is single tab character.
- xy) ECHO_C='\c';;
- *) echo `echo ksh88 bug on AIX 6.1` > /dev/null
- ECHO_T=' ';;
- esac;;
-*)
- ECHO_N='-n';;
-esac
-
-rm -f conf$$ conf$$.exe conf$$.file
-if test -d conf$$.dir; then
- rm -f conf$$.dir/conf$$.file
-else
- rm -f conf$$.dir
- mkdir conf$$.dir 2>/dev/null
-fi
-if (echo >conf$$.file) 2>/dev/null; then
- if ln -s conf$$.file conf$$ 2>/dev/null; then
- as_ln_s='ln -s'
- # ... but there are two gotchas:
- # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail.
- # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable.
- # In both cases, we have to default to `cp -pR'.
- ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe ||
- as_ln_s='cp -pR'
- elif ln conf$$.file conf$$ 2>/dev/null; then
- as_ln_s=ln
- else
- as_ln_s='cp -pR'
- fi
-else
- as_ln_s='cp -pR'
-fi
-rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file
-rmdir conf$$.dir 2>/dev/null
-
-if mkdir -p . 2>/dev/null; then
- as_mkdir_p='mkdir -p "$as_dir"'
-else
- test -d ./-p && rmdir ./-p
- as_mkdir_p=false
-fi
-
-as_test_x='test -x'
-as_executable_p=as_fn_executable_p
-
-# Sed expression to map a string onto a valid CPP name.
-as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"
-
-# Sed expression to map a string onto a valid variable name.
-as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'"
-
-SHELL=${CONFIG_SHELL-/bin/sh}
-
-
-test -n "$DJDIR" || exec 7<&0 </dev/null
-exec 6>&1
-
-# Name of the host.
-# hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status,
-# so uname gets run too.
-ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q`
-
-#
-# Initializations.
-#
-ac_default_prefix=/usr/local
-ac_clean_files=
-ac_config_libobj_dir=.
-LIBOBJS=
-cross_compiling=no
-subdirs=
-MFLAGS=
-MAKEFLAGS=
-
-# Identity of this package.
-PACKAGE_NAME='LinBox'
-PACKAGE_TARNAME='linbox'
-PACKAGE_VERSION='1.3.2'
-PACKAGE_STRING='LinBox 1.3.2'
-PACKAGE_BUGREPORT='linbox-use at googlegroups.com'
-PACKAGE_URL='http://www.linalg.org/'
-
-# Factoring default headers for most tests.
-ac_includes_default="\
-#include <stdio.h>
-#ifdef HAVE_SYS_TYPES_H
-# include <sys/types.h>
-#endif
-#ifdef HAVE_SYS_STAT_H
-# include <sys/stat.h>
-#endif
-#ifdef STDC_HEADERS
-# include <stdlib.h>
-# include <stddef.h>
-#else
-# ifdef HAVE_STDLIB_H
-# include <stdlib.h>
-# endif
-#endif
-#ifdef HAVE_STRING_H
-# if !defined STDC_HEADERS && defined HAVE_MEMORY_H
-# include <memory.h>
-# endif
-# include <string.h>
-#endif
-#ifdef HAVE_STRINGS_H
-# include <strings.h>
-#endif
-#ifdef HAVE_INTTYPES_H
-# include <inttypes.h>
-#endif
-#ifdef HAVE_STDINT_H
-# include <stdint.h>
-#endif
-#ifdef HAVE_UNISTD_H
-# include <unistd.h>
-#endif"
-
-ac_subst_vars='am__EXEEXT_FALSE
-am__EXEEXT_TRUE
-LTLIBOBJS
-LIBOBJS
-LINBOX_BUILD_DOC_FALSE
-LINBOX_BUILD_DOC_TRUE
-LINBOX_DOC_PATH
-LINBOX_BENCH_PATH
-LINBOX_HAVE_EXPAT_FALSE
-LINBOX_HAVE_EXPAT_TRUE
-EXPAT_LIBS
-EXPAT_CFLAGS
-LINBOX_HAVE_LAPACK_FALSE
-LINBOX_HAVE_LAPACK_TRUE
-LINBOX_HAVE_FFLAS_FFPACK_FALSE
-LINBOX_HAVE_FFLAS_FFPACK_TRUE
-BLAS_CFLAGS
-BLAS_LIBS
-FFLAS_FFPACK_LOC
-FFLAS_FFPACK_LIBS
-FFLAS_FFPACK_CFLAGS
-LINBOX_HAVE_SAGE_FALSE
-LINBOX_HAVE_SAGE_TRUE
-LINBOX_HAVE_MAPLE_FALSE
-LINBOX_HAVE_MAPLE_TRUE
-MAPLE_VERSION
-MAPLE_HOME
-MAPLE_CFLAGS
-MAPLE_LIBS
-LINBOX_HAVE_LIDIA_FALSE
-LINBOX_HAVE_LIDIA_TRUE
-LIDIA_LIBS
-LIDIA_CFLAGS
-LINBOX_HAVE_SACLIB_FALSE
-LINBOX_HAVE_SACLIB_TRUE
-SACLIB_LIBS
-SACLIB_CFLAGS
-LINBOX_HAVE_GIVARO_FALSE
-LINBOX_HAVE_GIVARO_TRUE
-GIVARO_LIBS
-GIVARO_CFLAGS
-LINBOX_HAVE_NTL_FALSE
-LINBOX_HAVE_NTL_TRUE
-NTL_LIBS
-NTL_CFLAGS
-LINBOX_HAVE_FPLLL_FALSE
-LINBOX_HAVE_FPLLL_TRUE
-FPLLL_LIBS
-FPLLL_CFLAGS
-LINBOX_HAVE_MPFR_FALSE
-LINBOX_HAVE_MPFR_TRUE
-MPFR_LIBS
-MPFR_CFLAGS
-LINBOX_HAVE_M4RIE_FALSE
-LINBOX_HAVE_M4RIE_TRUE
-M4RIE_LIBS
-M4RIE_CFLAGS
-LINBOX_HAVE_M4RI_FALSE
-LINBOX_HAVE_M4RI_TRUE
-M4RI_LIBS
-M4RI_CFLAGS
-LINBOX_HAVE_IML_FALSE
-LINBOX_HAVE_IML_TRUE
-IML_LIBS
-IML_CFLAGS
-GMP_VERSION
-GMP_LIBS
-GMP_CFLAGS
-LINBOX_COMPILE_DRIVERS_FALSE
-LINBOX_COMPILE_DRIVERS_TRUE
-OTOOL64
-OTOOL
-LIPO
-NMEDIT
-DSYMUTIL
-MANIFEST_TOOL
-RANLIB
-ac_ct_AR
-AR
-DLLTOOL
-OBJDUMP
-LN_S
-NM
-ac_ct_DUMPBIN
-DUMPBIN
-LD
-FGREP
-SED
-ac_ct_CC
-CFLAGS
-CC
-host_os
-host_vendor
-host_cpu
-host
-build_os
-build_vendor
-build_cpu
-build
-LIBTOOL
-EGREP
-GREP
-CXXCPP
-TESTS_CFLAGS
-DEBUG_CFLAGS
-DEFAULT_CFLAGS
-CCNAM
-OBJEXT
-EXEEXT
-ac_ct_CXX
-CPPFLAGS
-LDFLAGS
-CXXFLAGS
-CXX
-WARN
-PROF
-PROFILE_FALSE
-PROFILE_TRUE
-DBG
-DEBUG_FALSE
-DEBUG_TRUE
-INSIDE_GNOME_COMMON_FALSE
-INSIDE_GNOME_COMMON_TRUE
-am__nodep
-AMDEPBACKSLASH
-AMDEP_FALSE
-AMDEP_TRUE
-MAINT
-MAINTAINER_MODE_FALSE
-MAINTAINER_MODE_TRUE
-RM
-am__untar
-am__tar
-AMTAR
-am__leading_dot
-SET_MAKE
-AWK
-mkdir_p
-MKDIR_P
-INSTALL_STRIP_PROGRAM
-STRIP
-install_sh
-MAKEINFO
-AUTOHEADER
-AUTOMAKE
-AUTOCONF
-ACLOCAL
-VERSION
-PACKAGE
-CYGPATH_W
-am__isrc
-INSTALL_DATA
-INSTALL_SCRIPT
-INSTALL_PROGRAM
-target_alias
-host_alias
-build_alias
-LIBS
-ECHO_T
-ECHO_N
-ECHO_C
-DEFS
-mandir
-localedir
-libdir
-psdir
-pdfdir
-dvidir
-htmldir
-infodir
-docdir
-oldincludedir
-includedir
-localstatedir
-sharedstatedir
-sysconfdir
-datadir
-datarootdir
-libexecdir
-sbindir
-bindir
-program_transform_name
-prefix
-exec_prefix
-PACKAGE_URL
-PACKAGE_BUGREPORT
-PACKAGE_STRING
-PACKAGE_VERSION
-PACKAGE_TARNAME
-PACKAGE_NAME
-PATH_SEPARATOR
-SHELL'
-ac_subst_files=''
-ac_user_opts='
-enable_option_checking
-enable_maintainer_mode
-enable_dependency_tracking
-enable_debug
-enable_profile
-enable_warnings
-enable_shared
-enable_static
-with_pic
-enable_fast_install
-with_gnu_ld
-with_sysroot
-enable_libtool_lock
-with_default
-with_all
-enable_drivers
-with_gmp
-with_iml
-with_m4ri
-with_m4rie
-with_mpfr
-with_fplll
-with_ntl
-with_givaro
-with_saclib
-with_lidia
-with_maple
-enable_sage
-with_fflas_ffpack
-with_expat
-with_benchdir
-with_gnuplot
-with_ghostscript
-enable_optimization
-with_docdir
-with_doxygen
-enable_doc
-'
- ac_precious_vars='build_alias
-host_alias
-target_alias
-CXX
-CXXFLAGS
-LDFLAGS
-LIBS
-CPPFLAGS
-CCC
-CXXCPP
-CC
-CFLAGS'
-
-
-# Initialize some variables set by options.
-ac_init_help=
-ac_init_version=false
-ac_unrecognized_opts=
-ac_unrecognized_sep=
-# The variables have the same names as the options, with
-# dashes changed to underlines.
-cache_file=/dev/null
-exec_prefix=NONE
-no_create=
-no_recursion=
-prefix=NONE
-program_prefix=NONE
-program_suffix=NONE
-program_transform_name=s,x,x,
-silent=
-site=
-srcdir=
-verbose=
-x_includes=NONE
-x_libraries=NONE
-
-# Installation directory options.
-# These are left unexpanded so users can "make install exec_prefix=/foo"
-# and all the variables that are supposed to be based on exec_prefix
-# by default will actually change.
-# Use braces instead of parens because sh, perl, etc. also accept them.
-# (The list follows the same order as the GNU Coding Standards.)
-bindir='${exec_prefix}/bin'
-sbindir='${exec_prefix}/sbin'
-libexecdir='${exec_prefix}/libexec'
-datarootdir='${prefix}/share'
-datadir='${datarootdir}'
-sysconfdir='${prefix}/etc'
-sharedstatedir='${prefix}/com'
-localstatedir='${prefix}/var'
-includedir='${prefix}/include'
-oldincludedir='/usr/include'
-docdir='${datarootdir}/doc/${PACKAGE_TARNAME}'
-infodir='${datarootdir}/info'
-htmldir='${docdir}'
-dvidir='${docdir}'
-pdfdir='${docdir}'
-psdir='${docdir}'
-libdir='${exec_prefix}/lib'
-localedir='${datarootdir}/locale'
-mandir='${datarootdir}/man'
-
-ac_prev=
-ac_dashdash=
-for ac_option
-do
- # If the previous option needs an argument, assign it.
- if test -n "$ac_prev"; then
- eval $ac_prev=\$ac_option
- ac_prev=
- continue
- fi
-
- case $ac_option in
- *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;;
- *=) ac_optarg= ;;
- *) ac_optarg=yes ;;
- esac
-
- # Accept the important Cygnus configure options, so we can diagnose typos.
-
- case $ac_dashdash$ac_option in
- --)
- ac_dashdash=yes ;;
-
- -bindir | --bindir | --bindi | --bind | --bin | --bi)
- ac_prev=bindir ;;
- -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*)
- bindir=$ac_optarg ;;
-
- -build | --build | --buil | --bui | --bu)
- ac_prev=build_alias ;;
- -build=* | --build=* | --buil=* | --bui=* | --bu=*)
- build_alias=$ac_optarg ;;
-
- -cache-file | --cache-file | --cache-fil | --cache-fi \
- | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c)
- ac_prev=cache_file ;;
- -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \
- | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*)
- cache_file=$ac_optarg ;;
-
- --config-cache | -C)
- cache_file=config.cache ;;
-
- -datadir | --datadir | --datadi | --datad)
- ac_prev=datadir ;;
- -datadir=* | --datadir=* | --datadi=* | --datad=*)
- datadir=$ac_optarg ;;
-
- -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \
- | --dataroo | --dataro | --datar)
- ac_prev=datarootdir ;;
- -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \
- | --dataroot=* | --dataroo=* | --dataro=* | --datar=*)
- datarootdir=$ac_optarg ;;
-
- -disable-* | --disable-*)
- ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'`
- # Reject names that are not valid shell variable names.
- expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
- as_fn_error $? "invalid feature name: $ac_useropt"
- ac_useropt_orig=$ac_useropt
- ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
- case $ac_user_opts in
- *"
-"enable_$ac_useropt"
-"*) ;;
- *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig"
- ac_unrecognized_sep=', ';;
- esac
- eval enable_$ac_useropt=no ;;
-
- -docdir | --docdir | --docdi | --doc | --do)
- ac_prev=docdir ;;
- -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*)
- docdir=$ac_optarg ;;
-
- -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv)
- ac_prev=dvidir ;;
- -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*)
- dvidir=$ac_optarg ;;
-
- -enable-* | --enable-*)
- ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'`
- # Reject names that are not valid shell variable names.
- expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
- as_fn_error $? "invalid feature name: $ac_useropt"
- ac_useropt_orig=$ac_useropt
- ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
- case $ac_user_opts in
- *"
-"enable_$ac_useropt"
-"*) ;;
- *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig"
- ac_unrecognized_sep=', ';;
- esac
- eval enable_$ac_useropt=\$ac_optarg ;;
-
- -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \
- | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \
- | --exec | --exe | --ex)
- ac_prev=exec_prefix ;;
- -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \
- | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \
- | --exec=* | --exe=* | --ex=*)
- exec_prefix=$ac_optarg ;;
-
- -gas | --gas | --ga | --g)
- # Obsolete; use --with-gas.
- with_gas=yes ;;
-
- -help | --help | --hel | --he | -h)
- ac_init_help=long ;;
- -help=r* | --help=r* | --hel=r* | --he=r* | -hr*)
- ac_init_help=recursive ;;
- -help=s* | --help=s* | --hel=s* | --he=s* | -hs*)
- ac_init_help=short ;;
-
- -host | --host | --hos | --ho)
- ac_prev=host_alias ;;
- -host=* | --host=* | --hos=* | --ho=*)
- host_alias=$ac_optarg ;;
-
- -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht)
- ac_prev=htmldir ;;
- -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \
- | --ht=*)
- htmldir=$ac_optarg ;;
-
- -includedir | --includedir | --includedi | --included | --include \
- | --includ | --inclu | --incl | --inc)
- ac_prev=includedir ;;
- -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \
- | --includ=* | --inclu=* | --incl=* | --inc=*)
- includedir=$ac_optarg ;;
-
- -infodir | --infodir | --infodi | --infod | --info | --inf)
- ac_prev=infodir ;;
- -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*)
- infodir=$ac_optarg ;;
-
- -libdir | --libdir | --libdi | --libd)
- ac_prev=libdir ;;
- -libdir=* | --libdir=* | --libdi=* | --libd=*)
- libdir=$ac_optarg ;;
-
- -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \
- | --libexe | --libex | --libe)
- ac_prev=libexecdir ;;
- -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \
- | --libexe=* | --libex=* | --libe=*)
- libexecdir=$ac_optarg ;;
-
- -localedir | --localedir | --localedi | --localed | --locale)
- ac_prev=localedir ;;
- -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*)
- localedir=$ac_optarg ;;
-
- -localstatedir | --localstatedir | --localstatedi | --localstated \
- | --localstate | --localstat | --localsta | --localst | --locals)
- ac_prev=localstatedir ;;
- -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \
- | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*)
- localstatedir=$ac_optarg ;;
-
- -mandir | --mandir | --mandi | --mand | --man | --ma | --m)
- ac_prev=mandir ;;
- -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*)
- mandir=$ac_optarg ;;
-
- -nfp | --nfp | --nf)
- # Obsolete; use --without-fp.
- with_fp=no ;;
-
- -no-create | --no-create | --no-creat | --no-crea | --no-cre \
- | --no-cr | --no-c | -n)
- no_create=yes ;;
-
- -no-recursion | --no-recursion | --no-recursio | --no-recursi \
- | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r)
- no_recursion=yes ;;
-
- -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \
- | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \
- | --oldin | --oldi | --old | --ol | --o)
- ac_prev=oldincludedir ;;
- -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \
- | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \
- | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*)
- oldincludedir=$ac_optarg ;;
-
- -prefix | --prefix | --prefi | --pref | --pre | --pr | --p)
- ac_prev=prefix ;;
- -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*)
- prefix=$ac_optarg ;;
-
- -program-prefix | --program-prefix | --program-prefi | --program-pref \
- | --program-pre | --program-pr | --program-p)
- ac_prev=program_prefix ;;
- -program-prefix=* | --program-prefix=* | --program-prefi=* \
- | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*)
- program_prefix=$ac_optarg ;;
-
- -program-suffix | --program-suffix | --program-suffi | --program-suff \
- | --program-suf | --program-su | --program-s)
- ac_prev=program_suffix ;;
- -program-suffix=* | --program-suffix=* | --program-suffi=* \
- | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*)
- program_suffix=$ac_optarg ;;
-
- -program-transform-name | --program-transform-name \
- | --program-transform-nam | --program-transform-na \
- | --program-transform-n | --program-transform- \
- | --program-transform | --program-transfor \
- | --program-transfo | --program-transf \
- | --program-trans | --program-tran \
- | --progr-tra | --program-tr | --program-t)
- ac_prev=program_transform_name ;;
- -program-transform-name=* | --program-transform-name=* \
- | --program-transform-nam=* | --program-transform-na=* \
- | --program-transform-n=* | --program-transform-=* \
- | --program-transform=* | --program-transfor=* \
- | --program-transfo=* | --program-transf=* \
- | --program-trans=* | --program-tran=* \
- | --progr-tra=* | --program-tr=* | --program-t=*)
- program_transform_name=$ac_optarg ;;
-
- -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd)
- ac_prev=pdfdir ;;
- -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*)
- pdfdir=$ac_optarg ;;
-
- -psdir | --psdir | --psdi | --psd | --ps)
- ac_prev=psdir ;;
- -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*)
- psdir=$ac_optarg ;;
-
- -q | -quiet | --quiet | --quie | --qui | --qu | --q \
- | -silent | --silent | --silen | --sile | --sil)
- silent=yes ;;
-
- -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb)
- ac_prev=sbindir ;;
- -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \
- | --sbi=* | --sb=*)
- sbindir=$ac_optarg ;;
-
- -sharedstatedir | --sharedstatedir | --sharedstatedi \
- | --sharedstated | --sharedstate | --sharedstat | --sharedsta \
- | --sharedst | --shareds | --shared | --share | --shar \
- | --sha | --sh)
- ac_prev=sharedstatedir ;;
- -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \
- | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \
- | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \
- | --sha=* | --sh=*)
- sharedstatedir=$ac_optarg ;;
-
- -site | --site | --sit)
- ac_prev=site ;;
- -site=* | --site=* | --sit=*)
- site=$ac_optarg ;;
-
- -srcdir | --srcdir | --srcdi | --srcd | --src | --sr)
- ac_prev=srcdir ;;
- -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*)
- srcdir=$ac_optarg ;;
-
- -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \
- | --syscon | --sysco | --sysc | --sys | --sy)
- ac_prev=sysconfdir ;;
- -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \
- | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*)
- sysconfdir=$ac_optarg ;;
-
- -target | --target | --targe | --targ | --tar | --ta | --t)
- ac_prev=target_alias ;;
- -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*)
- target_alias=$ac_optarg ;;
-
- -v | -verbose | --verbose | --verbos | --verbo | --verb)
- verbose=yes ;;
-
- -version | --version | --versio | --versi | --vers | -V)
- ac_init_version=: ;;
-
- -with-* | --with-*)
- ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'`
- # Reject names that are not valid shell variable names.
- expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
- as_fn_error $? "invalid package name: $ac_useropt"
- ac_useropt_orig=$ac_useropt
- ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
- case $ac_user_opts in
- *"
-"with_$ac_useropt"
-"*) ;;
- *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig"
- ac_unrecognized_sep=', ';;
- esac
- eval with_$ac_useropt=\$ac_optarg ;;
-
- -without-* | --without-*)
- ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'`
- # Reject names that are not valid shell variable names.
- expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
- as_fn_error $? "invalid package name: $ac_useropt"
- ac_useropt_orig=$ac_useropt
- ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
- case $ac_user_opts in
- *"
-"with_$ac_useropt"
-"*) ;;
- *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig"
- ac_unrecognized_sep=', ';;
- esac
- eval with_$ac_useropt=no ;;
-
- --x)
- # Obsolete; use --with-x.
- with_x=yes ;;
-
- -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \
- | --x-incl | --x-inc | --x-in | --x-i)
- ac_prev=x_includes ;;
- -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \
- | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*)
- x_includes=$ac_optarg ;;
-
- -x-libraries | --x-libraries | --x-librarie | --x-librari \
- | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l)
- ac_prev=x_libraries ;;
- -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \
- | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*)
- x_libraries=$ac_optarg ;;
-
- -*) as_fn_error $? "unrecognized option: \`$ac_option'
-Try \`$0 --help' for more information"
- ;;
-
- *=*)
- ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='`
- # Reject names that are not valid shell variable names.
- case $ac_envvar in #(
- '' | [0-9]* | *[!_$as_cr_alnum]* )
- as_fn_error $? "invalid variable name: \`$ac_envvar'" ;;
- esac
- eval $ac_envvar=\$ac_optarg
- export $ac_envvar ;;
-
- *)
- # FIXME: should be removed in autoconf 3.0.
- $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2
- expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null &&
- $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2
- : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}"
- ;;
-
- esac
-done
-
-if test -n "$ac_prev"; then
- ac_option=--`echo $ac_prev | sed 's/_/-/g'`
- as_fn_error $? "missing argument to $ac_option"
-fi
-
-if test -n "$ac_unrecognized_opts"; then
- case $enable_option_checking in
- no) ;;
- fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;;
- *) $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;;
- esac
-fi
-
-# Check all directory arguments for consistency.
-for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \
- datadir sysconfdir sharedstatedir localstatedir includedir \
- oldincludedir docdir infodir htmldir dvidir pdfdir psdir \
- libdir localedir mandir
-do
- eval ac_val=\$$ac_var
- # Remove trailing slashes.
- case $ac_val in
- */ )
- ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'`
- eval $ac_var=\$ac_val;;
- esac
- # Be sure to have absolute directory names.
- case $ac_val in
- [\\/$]* | ?:[\\/]* ) continue;;
- NONE | '' ) case $ac_var in *prefix ) continue;; esac;;
- esac
- as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val"
-done
-
-# There might be people who depend on the old broken behavior: `$host'
-# used to hold the argument of --host etc.
-# FIXME: To remove some day.
-build=$build_alias
-host=$host_alias
-target=$target_alias
-
-# FIXME: To remove some day.
-if test "x$host_alias" != x; then
- if test "x$build_alias" = x; then
- cross_compiling=maybe
- elif test "x$build_alias" != "x$host_alias"; then
- cross_compiling=yes
- fi
-fi
-
-ac_tool_prefix=
-test -n "$host_alias" && ac_tool_prefix=$host_alias-
-
-test "$silent" = yes && exec 6>/dev/null
-
-
-ac_pwd=`pwd` && test -n "$ac_pwd" &&
-ac_ls_di=`ls -di .` &&
-ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` ||
- as_fn_error $? "working directory cannot be determined"
-test "X$ac_ls_di" = "X$ac_pwd_ls_di" ||
- as_fn_error $? "pwd does not report name of working directory"
-
-
-# Find the source files, if location was not specified.
-if test -z "$srcdir"; then
- ac_srcdir_defaulted=yes
- # Try the directory containing this script, then the parent directory.
- ac_confdir=`$as_dirname -- "$as_myself" ||
-$as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
- X"$as_myself" : 'X\(//\)[^/]' \| \
- X"$as_myself" : 'X\(//\)$' \| \
- X"$as_myself" : 'X\(/\)' \| . 2>/dev/null ||
-$as_echo X"$as_myself" |
- sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
- s//\1/
- q
- }
- /^X\(\/\/\)[^/].*/{
- s//\1/
- q
- }
- /^X\(\/\/\)$/{
- s//\1/
- q
- }
- /^X\(\/\).*/{
- s//\1/
- q
- }
- s/.*/./; q'`
- srcdir=$ac_confdir
- if test ! -r "$srcdir/$ac_unique_file"; then
- srcdir=..
- fi
-else
- ac_srcdir_defaulted=no
-fi
-if test ! -r "$srcdir/$ac_unique_file"; then
- test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .."
- as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir"
-fi
-ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work"
-ac_abs_confdir=`(
- cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg"
- pwd)`
-# When building in place, set srcdir=.
-if test "$ac_abs_confdir" = "$ac_pwd"; then
- srcdir=.
-fi
-# Remove unnecessary trailing slashes from srcdir.
-# Double slashes in file names in object file debugging info
-# mess up M-x gdb in Emacs.
-case $srcdir in
-*/) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;;
-esac
-for ac_var in $ac_precious_vars; do
- eval ac_env_${ac_var}_set=\${${ac_var}+set}
- eval ac_env_${ac_var}_value=\$${ac_var}
- eval ac_cv_env_${ac_var}_set=\${${ac_var}+set}
- eval ac_cv_env_${ac_var}_value=\$${ac_var}
-done
-
-#
-# Report the --help message.
-#
-if test "$ac_init_help" = "long"; then
- # Omit some internal or obsolete options to make the list less imposing.
- # This message is too long to be a string in the A/UX 3.1 sh.
- cat <<_ACEOF
-\`configure' configures LinBox 1.3.2 to adapt to many kinds of systems.
-
-Usage: $0 [OPTION]... [VAR=VALUE]...
-
-To assign environment variables (e.g., CC, CFLAGS...), specify them as
-VAR=VALUE. See below for descriptions of some of the useful variables.
-
-Defaults for the options are specified in brackets.
-
-Configuration:
- -h, --help display this help and exit
- --help=short display options specific to this package
- --help=recursive display the short help of all the included packages
- -V, --version display version information and exit
- -q, --quiet, --silent do not print \`checking ...' messages
- --cache-file=FILE cache test results in FILE [disabled]
- -C, --config-cache alias for \`--cache-file=config.cache'
- -n, --no-create do not create output files
- --srcdir=DIR find the sources in DIR [configure dir or \`..']
-
-Installation directories:
- --prefix=PREFIX install architecture-independent files in PREFIX
- [$ac_default_prefix]
- --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX
- [PREFIX]
-
-By default, \`make install' will install all the files in
-\`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify
-an installation prefix other than \`$ac_default_prefix' using \`--prefix',
-for instance \`--prefix=\$HOME'.
-
-For better control, use the options below.
-
-Fine tuning of the installation directories:
- --bindir=DIR user executables [EPREFIX/bin]
- --sbindir=DIR system admin executables [EPREFIX/sbin]
- --libexecdir=DIR program executables [EPREFIX/libexec]
- --sysconfdir=DIR read-only single-machine data [PREFIX/etc]
- --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com]
- --localstatedir=DIR modifiable single-machine data [PREFIX/var]
- --libdir=DIR object code libraries [EPREFIX/lib]
- --includedir=DIR C header files [PREFIX/include]
- --oldincludedir=DIR C header files for non-gcc [/usr/include]
- --datarootdir=DIR read-only arch.-independent data root [PREFIX/share]
- --datadir=DIR read-only architecture-independent data [DATAROOTDIR]
- --infodir=DIR info documentation [DATAROOTDIR/info]
- --localedir=DIR locale-dependent data [DATAROOTDIR/locale]
- --mandir=DIR man documentation [DATAROOTDIR/man]
- --docdir=DIR documentation root [DATAROOTDIR/doc/linbox]
- --htmldir=DIR html documentation [DOCDIR]
- --dvidir=DIR dvi documentation [DOCDIR]
- --pdfdir=DIR pdf documentation [DOCDIR]
- --psdir=DIR ps documentation [DOCDIR]
-_ACEOF
-
- cat <<\_ACEOF
-
-Program names:
- --program-prefix=PREFIX prepend PREFIX to installed program names
- --program-suffix=SUFFIX append SUFFIX to installed program names
- --program-transform-name=PROGRAM run sed PROGRAM on installed program names
-
-System types:
- --build=BUILD configure for building on BUILD [guessed]
- --host=HOST cross-compile to build programs to run on HOST [BUILD]
-_ACEOF
-fi
-
-if test -n "$ac_init_help"; then
- case $ac_init_help in
- short | recursive ) echo "Configuration of LinBox 1.3.2:";;
- esac
- cat <<\_ACEOF
-
-Optional Features:
- --disable-option-checking ignore unrecognized --enable/--with options
- --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no)
- --enable-FEATURE[=ARG] include FEATURE [ARG=yes]
- --enable-maintainer-mode enable make rules and dependencies not useful
- (and sometimes confusing) to the casual installer
- --disable-dependency-tracking speeds up one-time build
- --enable-dependency-tracking do not reject slow dependency extractors
- --enable-debug enable debugging options in library
- --enable-profile enable profiling options in library
- --enable-warnings=yes|full|no
- enable warnings when compiling the library. If
- nothing or yes is given, more aggressive compiler
- warnings are passed to the compiler. If full is
- given, we become paranoïd about warnings and treat
- them as errors.
- --enable-shared[=PKGS] build shared libraries [default=yes]
- --enable-static[=PKGS] build static libraries [default=yes]
- --enable-fast-install[=PKGS]
- optimize for fast installation [default=yes]
- --disable-libtool-lock avoid locking (might break parallel builds)
- --enable-drivers Enable the compilation of the drivers
- --enable-shared Check for shared compilation (needed by
- --with-maple)
- --enable-sage Enable the compilation of the SAGE interface
- --enable-optimization Enable run time optimization in LinBox code (only
- Strassen matrix threshold for now)
- --enable-doc Enable building documentation
-
-Optional Packages:
- --with-PACKAGE[=ARG] use PACKAGE [ARG=yes]
- --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no)
- --with-pic[=PKGS] try to use only PIC/non-PIC objects [default=use
- both]
- --with-gnu-ld assume the C compiler uses GNU ld [default=no]
- --with-sysroot=DIR Search for dependent libraries within DIR
- (or the compiler's sysroot if not specified).
- --with-default=<path> Add <path> to the default path for external package
- checking. Set as default with /usr and /usr/local.
- --with-all=<path>|yes|no
- Use all external packages. If the argument is no,
- you not sure that all libraries are reachable with
- the default path. If the argument is yes or <empty>,
- that means that all libraries are reachable with the
- default path. Otherwise add <path> to default path
- and enable all external packages.
- --with-gmp= <path>|yes Use GMP library. This library is mandatory for
- LinBox compilation. If argument is yes or <empty>
- that means the library is reachable with the
- standard search path "/usr" or "/usr/local" (set as
- default). Otherwise you give the <path> to the
- directory which contain the library.
- --with-iml=<path>|yes Use IML library. This library is (not yet) mandatory
- for LinBox compilation. If argument is yes or
- <empty> or <bad> :) that means the library is
- reachable with the standard search path (/usr or
- /usr/local). Otherwise you give the <path> to the
- directory which contains the library.
- --with-m4ri=<path>|yes Use M4RI library. This library is (not yet)
- mandatory for LinBox compilation. If argument is yes
- or <empty> or <bad> that means the library is
- reachable with the standard search path (/usr or
- /usr/local). Otherwise you give the <path> to the
- directory which contains the library.
-
- --with-m4rie=<path>|yes Use M4RIE library. This library is (not yet)
- mandatory for LinBox compilation. If argument is yes
- or <empty> or <bad> that means the library is
- reachable with the standard search path (/usr or
- /usr/local). Otherwise you give the <path> to the
- directory which contains the library.
-
- --with-mpfr=<path>|yes Use MPFR library. This library is (not yet)
- mandatory for LinBox compilation. If argument is yes
- or <empty> or <bad> :) that means the library is
- reachable with the standard search path (/usr or
- /usr/local). Otherwise you give the <path> to the
- directory which contains the library.
- --with-fplll=<path>|yes Use FPLLL library. This library is (not yet)
- mandatory for LinBox compilation. If argument is yes
- or <empty> or <bad> :) that means the library is
- reachable with the standard search path (/usr or
- /usr/local). Otherwise you give the <path> to the
- directory which contains the library.
- --with-ntl=<path>|yes|no
- Use NTL library. If argument is no, you do not have
- the library installed on your machine (set as
- default). If argument is yes or <empty> that means
- the library is reachable with the standard search
- path (/usr or /usr/local). Otherwise you give the
- <path> to the directory which contain the library.
- --with-givaro=<path>|yes
- Use Givaro library. This library is mandatory for
- LinBox compilation. If argument is yes or <empty>
- that means the library is reachable with the
- standard search path (/usr or /usr/local). Otherwise
- you give the <path> to the directory which contains
- the library.
- --with-saclib=<path>|yes|no
- Use Saclib library. If argument is no, you do not
- have the library installed on your machine (set as
- default). If argument is yes or <empty> that means
- the library is reachable with the standard search
- path (/usr or /usr/local). Otherwise you give the
- <path> to the directory which contain the library.
- --with-lidia=<path>|yes|no
- Use Lidia library. If argument is no, you do not
- have the library installed on your machine (set as
- default). If argument is yes or <empty> that means
- the library is reachable with the standard search
- path (/usr or /usr/local). Otherwise you give the
- <path> to the directory which contain the library.
- --with-maple=<path>|yes|no
- Use Maple library. If argument is no, you do not
- have the library installed on your machine (set as
- default). If argument is yes or <empty> that means
- the library is well installed and so reachable.
- Otherwise you give the <path> to the directory which
- contains the Software.
- --with-fflas-ffpack=<path>|yes
- Use Fflas-Ffpack library. This library is mandatory
- for LinBox compilation. If argument is yes or
- <empty> or <bad> :) that means the library is
- reachable with the standard search path (/usr or
- /usr/local). Otherwise you give the <path> to the
- directory which contains the library. Available at
- "http://linalg.org/projects/fflas-ffpack".
- --with-expat=<path>|yes|no
- Use Expat library. If argument is no, you do not
- have the library installed on your machine (set as
- default). If argument is yes or <empty> that means
- the library is reachable with the standard search
- path (/usr or /usr/local). Otherwise you give the
- <path> to the directory which contain the library.
- --with-benchdir=<path> Where the LinBox benchmarks should be performed
- --with-gnuplot=<path> Give the path to Gnuplot.
- --with-ghostscript=<path>
- Give the path to ghostscript.
- --with-docdir=<path> Where the LinBox documentation should be installed
- --with-doxygen=<path> Give the path to Doxygen. Note: --enable-doc needed
-
-Some influential environment variables:
- CXX C++ compiler command
- CXXFLAGS C++ compiler flags
- LDFLAGS linker flags, e.g. -L<lib dir> if you have libraries in a
- nonstandard directory <lib dir>
- LIBS libraries to pass to the linker, e.g. -l<library>
- CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I<include dir> if
- you have headers in a nonstandard directory <include dir>
- CXXCPP C++ preprocessor
- CC C compiler command
- CFLAGS C compiler flags
-
-Use these variables to override the choices made by `configure' or to help
-it to find libraries and programs with nonstandard names/locations.
-
-Report bugs to <linbox-use at googlegroups.com>.
-LinBox home page: <http://www.linalg.org/>.
-_ACEOF
-ac_status=$?
-fi
-
-if test "$ac_init_help" = "recursive"; then
- # If there are subdirs, report their specific --help.
- for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue
- test -d "$ac_dir" ||
- { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } ||
- continue
- ac_builddir=.
-
-case "$ac_dir" in
-.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;;
-*)
- ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'`
- # A ".." for each directory in $ac_dir_suffix.
- ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'`
- case $ac_top_builddir_sub in
- "") ac_top_builddir_sub=. ac_top_build_prefix= ;;
- *) ac_top_build_prefix=$ac_top_builddir_sub/ ;;
- esac ;;
-esac
-ac_abs_top_builddir=$ac_pwd
-ac_abs_builddir=$ac_pwd$ac_dir_suffix
-# for backward compatibility:
-ac_top_builddir=$ac_top_build_prefix
-
-case $srcdir in
- .) # We are building in place.
- ac_srcdir=.
- ac_top_srcdir=$ac_top_builddir_sub
- ac_abs_top_srcdir=$ac_pwd ;;
- [\\/]* | ?:[\\/]* ) # Absolute name.
- ac_srcdir=$srcdir$ac_dir_suffix;
- ac_top_srcdir=$srcdir
- ac_abs_top_srcdir=$srcdir ;;
- *) # Relative name.
- ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix
- ac_top_srcdir=$ac_top_build_prefix$srcdir
- ac_abs_top_srcdir=$ac_pwd/$srcdir ;;
-esac
-ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix
-
- cd "$ac_dir" || { ac_status=$?; continue; }
- # Check for guested configure.
- if test -f "$ac_srcdir/configure.gnu"; then
- echo &&
- $SHELL "$ac_srcdir/configure.gnu" --help=recursive
- elif test -f "$ac_srcdir/configure"; then
- echo &&
- $SHELL "$ac_srcdir/configure" --help=recursive
- else
- $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2
- fi || ac_status=$?
- cd "$ac_pwd" || { ac_status=$?; break; }
- done
-fi
-
-test -n "$ac_init_help" && exit $ac_status
-if $ac_init_version; then
- cat <<\_ACEOF
-LinBox configure 1.3.2
-generated by GNU Autoconf 2.69
-
-Copyright (C) 2012 Free Software Foundation, Inc.
-This configure script is free software; the Free Software Foundation
-gives unlimited permission to copy, distribute and modify it.
-_ACEOF
- exit
-fi
-
-## ------------------------ ##
-## Autoconf initialization. ##
-## ------------------------ ##
-
-# ac_fn_cxx_try_compile LINENO
-# ----------------------------
-# Try to compile conftest.$ac_ext, and return whether this succeeded.
-ac_fn_cxx_try_compile ()
-{
- as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
- rm -f conftest.$ac_objext
- if { { ac_try="$ac_compile"
-case "(($ac_try" in
- *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
- *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
- (eval "$ac_compile") 2>conftest.err
- ac_status=$?
- if test -s conftest.err; then
- grep -v '^ *+' conftest.err >conftest.er1
- cat conftest.er1 >&5
- mv -f conftest.er1 conftest.err
- fi
- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
- test $ac_status = 0; } && {
- test -z "$ac_cxx_werror_flag" ||
- test ! -s conftest.err
- } && test -s conftest.$ac_objext; then :
- ac_retval=0
-else
- $as_echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
- ac_retval=1
-fi
- eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
- as_fn_set_status $ac_retval
-
-} # ac_fn_cxx_try_compile
-
-# ac_fn_cxx_try_run LINENO
-# ------------------------
-# Try to link conftest.$ac_ext, and return whether this succeeded. Assumes
-# that executables *can* be run.
-ac_fn_cxx_try_run ()
-{
- as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
- if { { ac_try="$ac_link"
-case "(($ac_try" in
- *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
- *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
- (eval "$ac_link") 2>&5
- ac_status=$?
- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
- test $ac_status = 0; } && { ac_try='./conftest$ac_exeext'
- { { case "(($ac_try" in
- *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
- *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
- (eval "$ac_try") 2>&5
- ac_status=$?
- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
- test $ac_status = 0; }; }; then :
- ac_retval=0
-else
- $as_echo "$as_me: program exited with status $ac_status" >&5
- $as_echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
- ac_retval=$ac_status
-fi
- rm -rf conftest.dSYM conftest_ipa8_conftest.oo
- eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
- as_fn_set_status $ac_retval
-
-} # ac_fn_cxx_try_run
-
-# ac_fn_cxx_try_cpp LINENO
-# ------------------------
-# Try to preprocess conftest.$ac_ext, and return whether this succeeded.
-ac_fn_cxx_try_cpp ()
-{
- as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
- if { { ac_try="$ac_cpp conftest.$ac_ext"
-case "(($ac_try" in
- *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
- *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
- (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err
- ac_status=$?
- if test -s conftest.err; then
- grep -v '^ *+' conftest.err >conftest.er1
- cat conftest.er1 >&5
- mv -f conftest.er1 conftest.err
- fi
- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
- test $ac_status = 0; } > conftest.i && {
- test -z "$ac_cxx_preproc_warn_flag$ac_cxx_werror_flag" ||
- test ! -s conftest.err
- }; then :
- ac_retval=0
-else
- $as_echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
- ac_retval=1
-fi
- eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
- as_fn_set_status $ac_retval
-
-} # ac_fn_cxx_try_cpp
-
-# ac_fn_c_try_compile LINENO
-# --------------------------
-# Try to compile conftest.$ac_ext, and return whether this succeeded.
-ac_fn_c_try_compile ()
-{
- as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
- rm -f conftest.$ac_objext
- if { { ac_try="$ac_compile"
-case "(($ac_try" in
- *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
- *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
- (eval "$ac_compile") 2>conftest.err
- ac_status=$?
- if test -s conftest.err; then
- grep -v '^ *+' conftest.err >conftest.er1
- cat conftest.er1 >&5
- mv -f conftest.er1 conftest.err
- fi
- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
- test $ac_status = 0; } && {
- test -z "$ac_c_werror_flag" ||
- test ! -s conftest.err
- } && test -s conftest.$ac_objext; then :
- ac_retval=0
-else
- $as_echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
- ac_retval=1
-fi
- eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
- as_fn_set_status $ac_retval
-
-} # ac_fn_c_try_compile
-
-# ac_fn_c_try_link LINENO
-# -----------------------
-# Try to link conftest.$ac_ext, and return whether this succeeded.
-ac_fn_c_try_link ()
-{
- as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
- rm -f conftest.$ac_objext conftest$ac_exeext
- if { { ac_try="$ac_link"
-case "(($ac_try" in
- *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
- *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
- (eval "$ac_link") 2>conftest.err
- ac_status=$?
- if test -s conftest.err; then
- grep -v '^ *+' conftest.err >conftest.er1
- cat conftest.er1 >&5
- mv -f conftest.er1 conftest.err
- fi
- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
- test $ac_status = 0; } && {
- test -z "$ac_c_werror_flag" ||
- test ! -s conftest.err
- } && test -s conftest$ac_exeext && {
- test "$cross_compiling" = yes ||
- test -x conftest$ac_exeext
- }; then :
- ac_retval=0
-else
- $as_echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
- ac_retval=1
-fi
- # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information
- # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would
- # interfere with the next link command; also delete a directory that is
- # left behind by Apple's compiler. We do this before executing the actions.
- rm -rf conftest.dSYM conftest_ipa8_conftest.oo
- eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
- as_fn_set_status $ac_retval
-
-} # ac_fn_c_try_link
-
-# ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES
-# -------------------------------------------------------
-# Tests whether HEADER exists and can be compiled using the include files in
-# INCLUDES, setting the cache variable VAR accordingly.
-ac_fn_c_check_header_compile ()
-{
- as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
-$as_echo_n "checking for $2... " >&6; }
-if eval \${$3+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-$4
-#include <$2>
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
- eval "$3=yes"
-else
- eval "$3=no"
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-eval ac_res=\$$3
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
-$as_echo "$ac_res" >&6; }
- eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
-
-} # ac_fn_c_check_header_compile
-
-# ac_fn_c_check_func LINENO FUNC VAR
-# ----------------------------------
-# Tests whether FUNC exists, setting the cache variable VAR accordingly
-ac_fn_c_check_func ()
-{
- as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
-$as_echo_n "checking for $2... " >&6; }
-if eval \${$3+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-/* Define $2 to an innocuous variant, in case <limits.h> declares $2.
- For example, HP-UX 11i <limits.h> declares gettimeofday. */
-#define $2 innocuous_$2
-
-/* System header to define __stub macros and hopefully few prototypes,
- which can conflict with char $2 (); below.
- Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
- <limits.h> exists even on freestanding compilers. */
-
-#ifdef __STDC__
-# include <limits.h>
-#else
-# include <assert.h>
-#endif
-
-#undef $2
-
-/* Override any GCC internal prototype to avoid an error.
- Use char because int might match the return type of a GCC
- builtin and then its argument prototype would still apply. */
-#ifdef __cplusplus
-extern "C"
-#endif
-char $2 ();
-/* The GNU C library defines this for functions which it implements
- to always fail with ENOSYS. Some functions are actually named
- something starting with __ and the normal name is an alias. */
-#if defined __stub_$2 || defined __stub___$2
-choke me
-#endif
-
-int
-main ()
-{
-return $2 ();
- ;
- return 0;
-}
-_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
- eval "$3=yes"
-else
- eval "$3=no"
-fi
-rm -f core conftest.err conftest.$ac_objext \
- conftest$ac_exeext conftest.$ac_ext
-fi
-eval ac_res=\$$3
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
-$as_echo "$ac_res" >&6; }
- eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
-
-} # ac_fn_c_check_func
-
-# ac_fn_cxx_try_link LINENO
-# -------------------------
-# Try to link conftest.$ac_ext, and return whether this succeeded.
-ac_fn_cxx_try_link ()
-{
- as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
- rm -f conftest.$ac_objext conftest$ac_exeext
- if { { ac_try="$ac_link"
-case "(($ac_try" in
- *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
- *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
- (eval "$ac_link") 2>conftest.err
- ac_status=$?
- if test -s conftest.err; then
- grep -v '^ *+' conftest.err >conftest.er1
- cat conftest.er1 >&5
- mv -f conftest.er1 conftest.err
- fi
- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
- test $ac_status = 0; } && {
- test -z "$ac_cxx_werror_flag" ||
- test ! -s conftest.err
- } && test -s conftest$ac_exeext && {
- test "$cross_compiling" = yes ||
- test -x conftest$ac_exeext
- }; then :
- ac_retval=0
-else
- $as_echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
- ac_retval=1
-fi
- # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information
- # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would
- # interfere with the next link command; also delete a directory that is
- # left behind by Apple's compiler. We do this before executing the actions.
- rm -rf conftest.dSYM conftest_ipa8_conftest.oo
- eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
- as_fn_set_status $ac_retval
-
-} # ac_fn_cxx_try_link
-
-# ac_fn_cxx_compute_int LINENO EXPR VAR INCLUDES
-# ----------------------------------------------
-# Tries to find the compile-time value of EXPR in a program that includes
-# INCLUDES, setting VAR accordingly. Returns whether the value could be
-# computed
-ac_fn_cxx_compute_int ()
-{
- as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
- if test "$cross_compiling" = yes; then
- # Depending upon the size, compute the lo and hi bounds.
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-$4
-int
-main ()
-{
-static int test_array [1 - 2 * !(($2) >= 0)];
-test_array [0] = 0;
-return test_array [0];
-
- ;
- return 0;
-}
-_ACEOF
-if ac_fn_cxx_try_compile "$LINENO"; then :
- ac_lo=0 ac_mid=0
- while :; do
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-$4
-int
-main ()
-{
-static int test_array [1 - 2 * !(($2) <= $ac_mid)];
-test_array [0] = 0;
-return test_array [0];
-
- ;
- return 0;
-}
-_ACEOF
-if ac_fn_cxx_try_compile "$LINENO"; then :
- ac_hi=$ac_mid; break
-else
- as_fn_arith $ac_mid + 1 && ac_lo=$as_val
- if test $ac_lo -le $ac_mid; then
- ac_lo= ac_hi=
- break
- fi
- as_fn_arith 2 '*' $ac_mid + 1 && ac_mid=$as_val
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
- done
-else
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-$4
-int
-main ()
-{
-static int test_array [1 - 2 * !(($2) < 0)];
-test_array [0] = 0;
-return test_array [0];
-
- ;
- return 0;
-}
-_ACEOF
-if ac_fn_cxx_try_compile "$LINENO"; then :
- ac_hi=-1 ac_mid=-1
- while :; do
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-$4
-int
-main ()
-{
-static int test_array [1 - 2 * !(($2) >= $ac_mid)];
-test_array [0] = 0;
-return test_array [0];
-
- ;
- return 0;
-}
-_ACEOF
-if ac_fn_cxx_try_compile "$LINENO"; then :
- ac_lo=$ac_mid; break
-else
- as_fn_arith '(' $ac_mid ')' - 1 && ac_hi=$as_val
- if test $ac_mid -le $ac_hi; then
- ac_lo= ac_hi=
- break
- fi
- as_fn_arith 2 '*' $ac_mid && ac_mid=$as_val
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
- done
-else
- ac_lo= ac_hi=
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-# Binary search between lo and hi bounds.
-while test "x$ac_lo" != "x$ac_hi"; do
- as_fn_arith '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo && ac_mid=$as_val
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-$4
-int
-main ()
-{
-static int test_array [1 - 2 * !(($2) <= $ac_mid)];
-test_array [0] = 0;
-return test_array [0];
-
- ;
- return 0;
-}
-_ACEOF
-if ac_fn_cxx_try_compile "$LINENO"; then :
- ac_hi=$ac_mid
-else
- as_fn_arith '(' $ac_mid ')' + 1 && ac_lo=$as_val
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-done
-case $ac_lo in #((
-?*) eval "$3=\$ac_lo"; ac_retval=0 ;;
-'') ac_retval=1 ;;
-esac
- else
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-$4
-static long int longval () { return $2; }
-static unsigned long int ulongval () { return $2; }
-#include <stdio.h>
-#include <stdlib.h>
-int
-main ()
-{
-
- FILE *f = fopen ("conftest.val", "w");
- if (! f)
- return 1;
- if (($2) < 0)
- {
- long int i = longval ();
- if (i != ($2))
- return 1;
- fprintf (f, "%ld", i);
- }
- else
- {
- unsigned long int i = ulongval ();
- if (i != ($2))
- return 1;
- fprintf (f, "%lu", i);
- }
- /* Do not output a trailing newline, as this causes \r\n confusion
- on some platforms. */
- return ferror (f) || fclose (f) != 0;
-
- ;
- return 0;
-}
-_ACEOF
-if ac_fn_cxx_try_run "$LINENO"; then :
- echo >>conftest.val; read $3 <conftest.val; ac_retval=0
-else
- ac_retval=1
-fi
-rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
- conftest.$ac_objext conftest.beam conftest.$ac_ext
-rm -f conftest.val
-
- fi
- eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
- as_fn_set_status $ac_retval
-
-} # ac_fn_cxx_compute_int
-
-# ac_fn_cxx_check_header_mongrel LINENO HEADER VAR INCLUDES
-# ---------------------------------------------------------
-# Tests whether HEADER exists, giving a warning if it cannot be compiled using
-# the include files in INCLUDES and setting the cache variable VAR
-# accordingly.
-ac_fn_cxx_check_header_mongrel ()
-{
- as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
- if eval \${$3+:} false; then :
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
-$as_echo_n "checking for $2... " >&6; }
-if eval \${$3+:} false; then :
- $as_echo_n "(cached) " >&6
-fi
-eval ac_res=\$$3
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
-$as_echo "$ac_res" >&6; }
-else
- # Is the header compilable?
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5
-$as_echo_n "checking $2 usability... " >&6; }
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-$4
-#include <$2>
-_ACEOF
-if ac_fn_cxx_try_compile "$LINENO"; then :
- ac_header_compiler=yes
-else
- ac_header_compiler=no
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5
-$as_echo "$ac_header_compiler" >&6; }
-
-# Is the header present?
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5
-$as_echo_n "checking $2 presence... " >&6; }
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-#include <$2>
-_ACEOF
-if ac_fn_cxx_try_cpp "$LINENO"; then :
- ac_header_preproc=yes
-else
- ac_header_preproc=no
-fi
-rm -f conftest.err conftest.i conftest.$ac_ext
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5
-$as_echo "$ac_header_preproc" >&6; }
-
-# So? What about this header?
-case $ac_header_compiler:$ac_header_preproc:$ac_cxx_preproc_warn_flag in #((
- yes:no: )
- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5
-$as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;}
- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5
-$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;}
- ;;
- no:yes:* )
- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5
-$as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;}
- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: check for missing prerequisite headers?" >&5
-$as_echo "$as_me: WARNING: $2: check for missing prerequisite headers?" >&2;}
- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5
-$as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;}
- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&5
-$as_echo "$as_me: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&2;}
- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5
-$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;}
-( $as_echo "## ------------------------------------------ ##
-## Report this to linbox-use at googlegroups.com ##
-## ------------------------------------------ ##"
- ) | sed "s/^/$as_me: WARNING: /" >&2
- ;;
-esac
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
-$as_echo_n "checking for $2... " >&6; }
-if eval \${$3+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- eval "$3=\$ac_header_compiler"
-fi
-eval ac_res=\$$3
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
-$as_echo "$ac_res" >&6; }
-fi
- eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
-
-} # ac_fn_cxx_check_header_mongrel
-cat >config.log <<_ACEOF
-This file contains any messages produced by compilers while
-running configure, to aid debugging if configure makes a mistake.
-
-It was created by LinBox $as_me 1.3.2, which was
-generated by GNU Autoconf 2.69. Invocation command line was
-
- $ $0 $@
-
-_ACEOF
-exec 5>>config.log
-{
-cat <<_ASUNAME
-## --------- ##
-## Platform. ##
-## --------- ##
-
-hostname = `(hostname || uname -n) 2>/dev/null | sed 1q`
-uname -m = `(uname -m) 2>/dev/null || echo unknown`
-uname -r = `(uname -r) 2>/dev/null || echo unknown`
-uname -s = `(uname -s) 2>/dev/null || echo unknown`
-uname -v = `(uname -v) 2>/dev/null || echo unknown`
-
-/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown`
-/bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown`
-
-/bin/arch = `(/bin/arch) 2>/dev/null || echo unknown`
-/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown`
-/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown`
-/usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown`
-/bin/machine = `(/bin/machine) 2>/dev/null || echo unknown`
-/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown`
-/bin/universe = `(/bin/universe) 2>/dev/null || echo unknown`
-
-_ASUNAME
-
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
- IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
- $as_echo "PATH: $as_dir"
- done
-IFS=$as_save_IFS
-
-} >&5
-
-cat >&5 <<_ACEOF
-
-
-## ----------- ##
-## Core tests. ##
-## ----------- ##
-
-_ACEOF
-
-
-# Keep a trace of the command line.
-# Strip out --no-create and --no-recursion so they do not pile up.
-# Strip out --silent because we don't want to record it for future runs.
-# Also quote any args containing shell meta-characters.
-# Make two passes to allow for proper duplicate-argument suppression.
-ac_configure_args=
-ac_configure_args0=
-ac_configure_args1=
-ac_must_keep_next=false
-for ac_pass in 1 2
-do
- for ac_arg
- do
- case $ac_arg in
- -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;;
- -q | -quiet | --quiet | --quie | --qui | --qu | --q \
- | -silent | --silent | --silen | --sile | --sil)
- continue ;;
- *\'*)
- ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;;
- esac
- case $ac_pass in
- 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;;
- 2)
- as_fn_append ac_configure_args1 " '$ac_arg'"
- if test $ac_must_keep_next = true; then
- ac_must_keep_next=false # Got value, back to normal.
- else
- case $ac_arg in
- *=* | --config-cache | -C | -disable-* | --disable-* \
- | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \
- | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \
- | -with-* | --with-* | -without-* | --without-* | --x)
- case "$ac_configure_args0 " in
- "$ac_configure_args1"*" '$ac_arg' "* ) continue ;;
- esac
- ;;
- -* ) ac_must_keep_next=true ;;
- esac
- fi
- as_fn_append ac_configure_args " '$ac_arg'"
- ;;
- esac
- done
-done
-{ ac_configure_args0=; unset ac_configure_args0;}
-{ ac_configure_args1=; unset ac_configure_args1;}
-
-# When interrupted or exit'd, cleanup temporary files, and complete
-# config.log. We remove comments because anyway the quotes in there
-# would cause problems or look ugly.
-# WARNING: Use '\'' to represent an apostrophe within the trap.
-# WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug.
-trap 'exit_status=$?
- # Save into config.log some information that might help in debugging.
- {
- echo
-
- $as_echo "## ---------------- ##
-## Cache variables. ##
-## ---------------- ##"
- echo
- # The following way of writing the cache mishandles newlines in values,
-(
- for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do
- eval ac_val=\$$ac_var
- case $ac_val in #(
- *${as_nl}*)
- case $ac_var in #(
- *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5
-$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;;
- esac
- case $ac_var in #(
- _ | IFS | as_nl) ;; #(
- BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #(
- *) { eval $ac_var=; unset $ac_var;} ;;
- esac ;;
- esac
- done
- (set) 2>&1 |
- case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #(
- *${as_nl}ac_space=\ *)
- sed -n \
- "s/'\''/'\''\\\\'\'''\''/g;
- s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p"
- ;; #(
- *)
- sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p"
- ;;
- esac |
- sort
-)
- echo
-
- $as_echo "## ----------------- ##
-## Output variables. ##
-## ----------------- ##"
- echo
- for ac_var in $ac_subst_vars
- do
- eval ac_val=\$$ac_var
- case $ac_val in
- *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;;
- esac
- $as_echo "$ac_var='\''$ac_val'\''"
- done | sort
- echo
-
- if test -n "$ac_subst_files"; then
- $as_echo "## ------------------- ##
-## File substitutions. ##
-## ------------------- ##"
- echo
- for ac_var in $ac_subst_files
- do
- eval ac_val=\$$ac_var
- case $ac_val in
- *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;;
- esac
- $as_echo "$ac_var='\''$ac_val'\''"
- done | sort
- echo
- fi
-
- if test -s confdefs.h; then
- $as_echo "## ----------- ##
-## confdefs.h. ##
-## ----------- ##"
- echo
- cat confdefs.h
- echo
- fi
- test "$ac_signal" != 0 &&
- $as_echo "$as_me: caught signal $ac_signal"
- $as_echo "$as_me: exit $exit_status"
- } >&5
- rm -f core *.core core.conftest.* &&
- rm -f -r conftest* confdefs* conf$$* $ac_clean_files &&
- exit $exit_status
-' 0
-for ac_signal in 1 2 13 15; do
- trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal
-done
-ac_signal=0
-
-# confdefs.h avoids OS command line length limits that DEFS can exceed.
-rm -f -r conftest* confdefs.h
-
-$as_echo "/* confdefs.h */" > confdefs.h
-
-# Predefined preprocessor variables.
-
-cat >>confdefs.h <<_ACEOF
-#define PACKAGE_NAME "$PACKAGE_NAME"
-_ACEOF
-
-cat >>confdefs.h <<_ACEOF
-#define PACKAGE_TARNAME "$PACKAGE_TARNAME"
-_ACEOF
-
-cat >>confdefs.h <<_ACEOF
-#define PACKAGE_VERSION "$PACKAGE_VERSION"
-_ACEOF
-
-cat >>confdefs.h <<_ACEOF
-#define PACKAGE_STRING "$PACKAGE_STRING"
-_ACEOF
-
-cat >>confdefs.h <<_ACEOF
-#define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT"
-_ACEOF
-
-cat >>confdefs.h <<_ACEOF
-#define PACKAGE_URL "$PACKAGE_URL"
-_ACEOF
-
-
-# Let the site file select an alternate cache file if it wants to.
-# Prefer an explicitly selected file to automatically selected ones.
-ac_site_file1=NONE
-ac_site_file2=NONE
-if test -n "$CONFIG_SITE"; then
- # We do not want a PATH search for config.site.
- case $CONFIG_SITE in #((
- -*) ac_site_file1=./$CONFIG_SITE;;
- */*) ac_site_file1=$CONFIG_SITE;;
- *) ac_site_file1=./$CONFIG_SITE;;
- esac
-elif test "x$prefix" != xNONE; then
- ac_site_file1=$prefix/share/config.site
- ac_site_file2=$prefix/etc/config.site
-else
- ac_site_file1=$ac_default_prefix/share/config.site
- ac_site_file2=$ac_default_prefix/etc/config.site
-fi
-for ac_site_file in "$ac_site_file1" "$ac_site_file2"
-do
- test "x$ac_site_file" = xNONE && continue
- if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5
-$as_echo "$as_me: loading site script $ac_site_file" >&6;}
- sed 's/^/| /' "$ac_site_file" >&5
- . "$ac_site_file" \
- || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
-as_fn_error $? "failed to load site script $ac_site_file
-See \`config.log' for more details" "$LINENO" 5; }
- fi
-done
-
-if test -r "$cache_file"; then
- # Some versions of bash will fail to source /dev/null (special files
- # actually), so we avoid doing that. DJGPP emulates it as a regular file.
- if test /dev/null != "$cache_file" && test -f "$cache_file"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5
-$as_echo "$as_me: loading cache $cache_file" >&6;}
- case $cache_file in
- [\\/]* | ?:[\\/]* ) . "$cache_file";;
- *) . "./$cache_file";;
- esac
- fi
-else
- { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5
-$as_echo "$as_me: creating cache $cache_file" >&6;}
- >$cache_file
-fi
-
-# Check that the precious variables saved in the cache have kept the same
-# value.
-ac_cache_corrupted=false
-for ac_var in $ac_precious_vars; do
- eval ac_old_set=\$ac_cv_env_${ac_var}_set
- eval ac_new_set=\$ac_env_${ac_var}_set
- eval ac_old_val=\$ac_cv_env_${ac_var}_value
- eval ac_new_val=\$ac_env_${ac_var}_value
- case $ac_old_set,$ac_new_set in
- set,)
- { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5
-$as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;}
- ac_cache_corrupted=: ;;
- ,set)
- { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5
-$as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;}
- ac_cache_corrupted=: ;;
- ,);;
- *)
- if test "x$ac_old_val" != "x$ac_new_val"; then
- # differences in whitespace do not lead to failure.
- ac_old_val_w=`echo x $ac_old_val`
- ac_new_val_w=`echo x $ac_new_val`
- if test "$ac_old_val_w" != "$ac_new_val_w"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5
-$as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;}
- ac_cache_corrupted=:
- else
- { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5
-$as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;}
- eval $ac_var=\$ac_old_val
- fi
- { $as_echo "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5
-$as_echo "$as_me: former value: \`$ac_old_val'" >&2;}
- { $as_echo "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5
-$as_echo "$as_me: current value: \`$ac_new_val'" >&2;}
- fi;;
- esac
- # Pass precious variables to config.status.
- if test "$ac_new_set" = set; then
- case $ac_new_val in
- *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;;
- *) ac_arg=$ac_var=$ac_new_val ;;
- esac
- case " $ac_configure_args " in
- *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy.
- *) as_fn_append ac_configure_args " '$ac_arg'" ;;
- esac
- fi
-done
-if $ac_cache_corrupted; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
- { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5
-$as_echo "$as_me: error: changes in the environment can compromise the build" >&2;}
- as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5
-fi
-## -------------------- ##
-## Main body of script. ##
-## -------------------- ##
-
-ac_ext=c
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_c_compiler_gnu
-
-
-
-ac_aux_dir=
-for ac_dir in build-aux "$srcdir"/build-aux; do
- if test -f "$ac_dir/install-sh"; then
- ac_aux_dir=$ac_dir
- ac_install_sh="$ac_aux_dir/install-sh -c"
- break
- elif test -f "$ac_dir/install.sh"; then
- ac_aux_dir=$ac_dir
- ac_install_sh="$ac_aux_dir/install.sh -c"
- break
- elif test -f "$ac_dir/shtool"; then
- ac_aux_dir=$ac_dir
- ac_install_sh="$ac_aux_dir/shtool install -c"
- break
- fi
-done
-if test -z "$ac_aux_dir"; then
- as_fn_error $? "cannot find install-sh, install.sh, or shtool in build-aux \"$srcdir\"/build-aux" "$LINENO" 5
-fi
-
-# These three variables are undocumented and unsupported,
-# and are intended to be withdrawn in a future Autoconf release.
-# They can cause serious problems if a builder's source tree is in a directory
-# whose full name contains unusual characters.
-ac_config_guess="$SHELL $ac_aux_dir/config.guess" # Please don't use this var.
-ac_config_sub="$SHELL $ac_aux_dir/config.sub" # Please don't use this var.
-ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var.
-
-
-am__api_version='1.11'
-
-# Find a good install program. We prefer a C program (faster),
-# so one script is as good as another. But avoid the broken or
-# incompatible versions:
-# SysV /etc/install, /usr/sbin/install
-# SunOS /usr/etc/install
-# IRIX /sbin/install
-# AIX /bin/install
-# AmigaOS /C/install, which installs bootblocks on floppy discs
-# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag
-# AFS /usr/afsws/bin/install, which mishandles nonexistent args
-# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff"
-# OS/2's system install, which has a completely different semantic
-# ./install, which can be erroneously created by make from ./install.sh.
-# Reject install programs that cannot install multiple files.
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5
-$as_echo_n "checking for a BSD-compatible install... " >&6; }
-if test -z "$INSTALL"; then
-if ${ac_cv_path_install+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
- IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
- # Account for people who put trailing slashes in PATH elements.
-case $as_dir/ in #((
- ./ | .// | /[cC]/* | \
- /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \
- ?:[\\/]os2[\\/]install[\\/]* | ?:[\\/]OS2[\\/]INSTALL[\\/]* | \
- /usr/ucb/* ) ;;
- *)
- # OSF1 and SCO ODT 3.0 have their own names for install.
- # Don't use installbsd from OSF since it installs stuff as root
- # by default.
- for ac_prog in ginstall scoinst install; do
- for ac_exec_ext in '' $ac_executable_extensions; do
- if as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then
- if test $ac_prog = install &&
- grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then
- # AIX install. It has an incompatible calling convention.
- :
- elif test $ac_prog = install &&
- grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then
- # program-specific install script used by HP pwplus--don't use.
- :
- else
- rm -rf conftest.one conftest.two conftest.dir
- echo one > conftest.one
- echo two > conftest.two
- mkdir conftest.dir
- if "$as_dir/$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir" &&
- test -s conftest.one && test -s conftest.two &&
- test -s conftest.dir/conftest.one &&
- test -s conftest.dir/conftest.two
- then
- ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c"
- break 3
- fi
- fi
- fi
- done
- done
- ;;
-esac
-
- done
-IFS=$as_save_IFS
-
-rm -rf conftest.one conftest.two conftest.dir
-
-fi
- if test "${ac_cv_path_install+set}" = set; then
- INSTALL=$ac_cv_path_install
- else
- # As a last resort, use the slow shell script. Don't cache a
- # value for INSTALL within a source directory, because that will
- # break other packages using the cache if that directory is
- # removed, or if the value is a relative name.
- INSTALL=$ac_install_sh
- fi
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5
-$as_echo "$INSTALL" >&6; }
-
-# Use test -z because SunOS4 sh mishandles braces in ${var-val}.
-# It thinks the first close brace ends the variable substitution.
-test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}'
-
-test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}'
-
-test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644'
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether build environment is sane" >&5
-$as_echo_n "checking whether build environment is sane... " >&6; }
-# Just in case
-sleep 1
-echo timestamp > conftest.file
-# Reject unsafe characters in $srcdir or the absolute working directory
-# name. Accept space and tab only in the latter.
-am_lf='
-'
-case `pwd` in
- *[\\\"\#\$\&\'\`$am_lf]*)
- as_fn_error $? "unsafe absolute working directory name" "$LINENO" 5;;
-esac
-case $srcdir in
- *[\\\"\#\$\&\'\`$am_lf\ \ ]*)
- as_fn_error $? "unsafe srcdir value: \`$srcdir'" "$LINENO" 5;;
-esac
-
-# Do `set' in a subshell so we don't clobber the current shell's
-# arguments. Must try -L first in case configure is actually a
-# symlink; some systems play weird games with the mod time of symlinks
-# (eg FreeBSD returns the mod time of the symlink's containing
-# directory).
-if (
- set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null`
- if test "$*" = "X"; then
- # -L didn't work.
- set X `ls -t "$srcdir/configure" conftest.file`
- fi
- rm -f conftest.file
- if test "$*" != "X $srcdir/configure conftest.file" \
- && test "$*" != "X conftest.file $srcdir/configure"; then
-
- # If neither matched, then we have a broken ls. This can happen
- # if, for instance, CONFIG_SHELL is bash and it inherits a
- # broken ls alias from the environment. This has actually
- # happened. Such a system could not be considered "sane".
- as_fn_error $? "ls -t appears to fail. Make sure there is not a broken
-alias in your environment" "$LINENO" 5
- fi
-
- test "$2" = conftest.file
- )
-then
- # Ok.
- :
-else
- as_fn_error $? "newly created file is older than distributed files!
-Check your system clock" "$LINENO" 5
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
-test "$program_prefix" != NONE &&
- program_transform_name="s&^&$program_prefix&;$program_transform_name"
-# Use a double $ so make ignores it.
-test "$program_suffix" != NONE &&
- program_transform_name="s&\$&$program_suffix&;$program_transform_name"
-# Double any \ or $.
-# By default was `s,x,x', remove it if useless.
-ac_script='s/[\\$]/&&/g;s/;s,x,x,$//'
-program_transform_name=`$as_echo "$program_transform_name" | sed "$ac_script"`
-
-# expand $ac_aux_dir to an absolute path
-am_aux_dir=`cd $ac_aux_dir && pwd`
-
-if test x"${MISSING+set}" != xset; then
- case $am_aux_dir in
- *\ * | *\ *)
- MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;;
- *)
- MISSING="\${SHELL} $am_aux_dir/missing" ;;
- esac
-fi
-# Use eval to expand $SHELL
-if eval "$MISSING --run true"; then
- am_missing_run="$MISSING --run "
-else
- am_missing_run=
- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \`missing' script is too old or missing" >&5
-$as_echo "$as_me: WARNING: \`missing' script is too old or missing" >&2;}
-fi
-
-if test x"${install_sh}" != xset; then
- case $am_aux_dir in
- *\ * | *\ *)
- install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;;
- *)
- install_sh="\${SHELL} $am_aux_dir/install-sh"
- esac
-fi
-
-# Installed binaries are usually stripped using `strip' when the user
-# run `make install-strip'. However `strip' might not be the right
-# tool to use in cross-compilation environments, therefore Automake
-# will honor the `STRIP' environment variable to overrule this program.
-if test "$cross_compiling" != no; then
- if test -n "$ac_tool_prefix"; then
- # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args.
-set dummy ${ac_tool_prefix}strip; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_STRIP+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- if test -n "$STRIP"; then
- ac_cv_prog_STRIP="$STRIP" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
- IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
- for ac_exec_ext in '' $ac_executable_extensions; do
- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
- ac_cv_prog_STRIP="${ac_tool_prefix}strip"
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
- break 2
- fi
-done
- done
-IFS=$as_save_IFS
-
-fi
-fi
-STRIP=$ac_cv_prog_STRIP
-if test -n "$STRIP"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5
-$as_echo "$STRIP" >&6; }
-else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-fi
-if test -z "$ac_cv_prog_STRIP"; then
- ac_ct_STRIP=$STRIP
- # Extract the first word of "strip", so it can be a program name with args.
-set dummy strip; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_ac_ct_STRIP+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- if test -n "$ac_ct_STRIP"; then
- ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
- IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
- for ac_exec_ext in '' $ac_executable_extensions; do
- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
- ac_cv_prog_ac_ct_STRIP="strip"
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
- break 2
- fi
-done
- done
-IFS=$as_save_IFS
-
-fi
-fi
-ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP
-if test -n "$ac_ct_STRIP"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5
-$as_echo "$ac_ct_STRIP" >&6; }
-else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
- if test "x$ac_ct_STRIP" = x; then
- STRIP=":"
- else
- case $cross_compiling:$ac_tool_warned in
-yes:)
-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
-ac_tool_warned=yes ;;
-esac
- STRIP=$ac_ct_STRIP
- fi
-else
- STRIP="$ac_cv_prog_STRIP"
-fi
-
-fi
-INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s"
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a thread-safe mkdir -p" >&5
-$as_echo_n "checking for a thread-safe mkdir -p... " >&6; }
-if test -z "$MKDIR_P"; then
- if ${ac_cv_path_mkdir+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH$PATH_SEPARATOR/opt/sfw/bin
-do
- IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
- for ac_prog in mkdir gmkdir; do
- for ac_exec_ext in '' $ac_executable_extensions; do
- as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext" || continue
- case `"$as_dir/$ac_prog$ac_exec_ext" --version 2>&1` in #(
- 'mkdir (GNU coreutils) '* | \
- 'mkdir (coreutils) '* | \
- 'mkdir (fileutils) '4.1*)
- ac_cv_path_mkdir=$as_dir/$ac_prog$ac_exec_ext
- break 3;;
- esac
- done
- done
- done
-IFS=$as_save_IFS
-
-fi
-
- test -d ./--version && rmdir ./--version
- if test "${ac_cv_path_mkdir+set}" = set; then
- MKDIR_P="$ac_cv_path_mkdir -p"
- else
- # As a last resort, use the slow shell script. Don't cache a
- # value for MKDIR_P within a source directory, because that will
- # break other packages using the cache if that directory is
- # removed, or if the value is a relative name.
- MKDIR_P="$ac_install_sh -d"
- fi
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $MKDIR_P" >&5
-$as_echo "$MKDIR_P" >&6; }
-
-mkdir_p="$MKDIR_P"
-case $mkdir_p in
- [\\/$]* | ?:[\\/]*) ;;
- */*) mkdir_p="\$(top_builddir)/$mkdir_p" ;;
-esac
-
-for ac_prog in gawk mawk nawk awk
-do
- # Extract the first word of "$ac_prog", so it can be a program name with args.
-set dummy $ac_prog; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_AWK+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- if test -n "$AWK"; then
- ac_cv_prog_AWK="$AWK" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
- IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
- for ac_exec_ext in '' $ac_executable_extensions; do
- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
- ac_cv_prog_AWK="$ac_prog"
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
- break 2
- fi
-done
- done
-IFS=$as_save_IFS
-
-fi
-fi
-AWK=$ac_cv_prog_AWK
-if test -n "$AWK"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5
-$as_echo "$AWK" >&6; }
-else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
- test -n "$AWK" && break
-done
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5
-$as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; }
-set x ${MAKE-make}
-ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'`
-if eval \${ac_cv_prog_make_${ac_make}_set+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- cat >conftest.make <<\_ACEOF
-SHELL = /bin/sh
-all:
- @echo '@@@%%%=$(MAKE)=@@@%%%'
-_ACEOF
-# GNU make sometimes prints "make[1]: Entering ...", which would confuse us.
-case `${MAKE-make} -f conftest.make 2>/dev/null` in
- *@@@%%%=?*=@@@%%%*)
- eval ac_cv_prog_make_${ac_make}_set=yes;;
- *)
- eval ac_cv_prog_make_${ac_make}_set=no;;
-esac
-rm -f conftest.make
-fi
-if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
- SET_MAKE=
-else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
- SET_MAKE="MAKE=${MAKE-make}"
-fi
-
-rm -rf .tst 2>/dev/null
-mkdir .tst 2>/dev/null
-if test -d .tst; then
- am__leading_dot=.
-else
- am__leading_dot=_
-fi
-rmdir .tst 2>/dev/null
-
-if test "`cd $srcdir && pwd`" != "`pwd`"; then
- # Use -I$(srcdir) only when $(srcdir) != ., so that make's output
- # is not polluted with repeated "-I."
- am__isrc=' -I$(srcdir)'
- # test to see if srcdir already configured
- if test -f $srcdir/config.status; then
- as_fn_error $? "source directory already configured; run \"make distclean\" there first" "$LINENO" 5
- fi
-fi
-
-# test whether we have cygpath
-if test -z "$CYGPATH_W"; then
- if (cygpath --version) >/dev/null 2>/dev/null; then
- CYGPATH_W='cygpath -w'
- else
- CYGPATH_W=echo
- fi
-fi
-
-
-# Define the identity of the package.
- PACKAGE='linbox'
- VERSION='1.3.2'
-
-
-cat >>confdefs.h <<_ACEOF
-#define PACKAGE "$PACKAGE"
-_ACEOF
-
-
-cat >>confdefs.h <<_ACEOF
-#define VERSION "$VERSION"
-_ACEOF
-
-# Some tools Automake needs.
-
-ACLOCAL=${ACLOCAL-"${am_missing_run}aclocal-${am__api_version}"}
-
-
-AUTOCONF=${AUTOCONF-"${am_missing_run}autoconf"}
-
-
-AUTOMAKE=${AUTOMAKE-"${am_missing_run}automake-${am__api_version}"}
-
-
-AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"}
-
-
-MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"}
-
-# We need awk for the "check" target. The system "awk" is bad on
-# some platforms.
-# Always define AMTAR for backward compatibility. Yes, it's still used
-# in the wild :-( We should find a proper way to deprecate it ...
-AMTAR='$${TAR-tar}'
-
-am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -'
-
-
-
-
-
-ac_config_headers="$ac_config_headers config.h"
-
-
-ac_config_commands="$ac_config_commands linbox/linbox-config.h"
-
-# Extract the first word of "rm", so it can be a program name with args.
-set dummy rm; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_path_RM+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- case $RM in
- [\\/]* | ?:[\\/]*)
- ac_cv_path_RM="$RM" # Let the user override the test with a path.
- ;;
- *)
- as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
- IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
- for ac_exec_ext in '' $ac_executable_extensions; do
- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
- ac_cv_path_RM="$as_dir/$ac_word$ac_exec_ext"
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
- break 2
- fi
-done
- done
-IFS=$as_save_IFS
-
- test -z "$ac_cv_path_RM" && ac_cv_path_RM="$FALSE"
- ;;
-esac
-fi
-RM=$ac_cv_path_RM
-if test -n "$RM"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RM" >&5
-$as_echo "$RM" >&6; }
-else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-RM="$RM -f"
-
-
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to enable maintainer-specific portions of Makefiles" >&5
-$as_echo_n "checking whether to enable maintainer-specific portions of Makefiles... " >&6; }
- # Check whether --enable-maintainer-mode was given.
-if test "${enable_maintainer_mode+set}" = set; then :
- enableval=$enable_maintainer_mode; USE_MAINTAINER_MODE=$enableval
-else
- USE_MAINTAINER_MODE=no
-fi
-
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $USE_MAINTAINER_MODE" >&5
-$as_echo "$USE_MAINTAINER_MODE" >&6; }
- if test $USE_MAINTAINER_MODE = yes; then
- MAINTAINER_MODE_TRUE=
- MAINTAINER_MODE_FALSE='#'
-else
- MAINTAINER_MODE_TRUE='#'
- MAINTAINER_MODE_FALSE=
-fi
-
- MAINT=$MAINTAINER_MODE_TRUE
-
-
-# Check whether --enable-dependency-tracking was given.
-if test "${enable_dependency_tracking+set}" = set; then :
- enableval=$enable_dependency_tracking;
-fi
-
-if test "x$enable_dependency_tracking" != xno; then
- am_depcomp="$ac_aux_dir/depcomp"
- AMDEPBACKSLASH='\'
- am__nodep='_no'
-fi
- if test "x$enable_dependency_tracking" != xno; then
- AMDEP_TRUE=
- AMDEP_FALSE='#'
-else
- AMDEP_TRUE='#'
- AMDEP_FALSE=
-fi
-
-
-ac_config_commands="$ac_config_commands depfiles"
-
-
-
-
- if test x = y; then
- INSIDE_GNOME_COMMON_TRUE=
- INSIDE_GNOME_COMMON_FALSE='#'
-else
- INSIDE_GNOME_COMMON_TRUE='#'
- INSIDE_GNOME_COMMON_FALSE=
-fi
-
-
- test -n "$ACLOCAL_FLAGS" && ACLOCAL="$ACLOCAL $ACLOCAL_FLAGS"
-
- for k in macros ; do ACLOCAL="$ACLOCAL -I $k" ; done
-
-
-# work around to fix the backward compatibility issue of automake 1.10 with 1.9 (pb with MKDIR_P)
-
-
-ac_ext=cpp
-ac_cpp='$CXXCPP $CPPFLAGS'
-ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
-
-
-echo "-----------------------------------------------"
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to enable debugging options in the library" >&5
-$as_echo_n "checking whether to enable debugging options in the library... " >&6; }
- # Check whether --enable-debug was given.
-if test "${enable_debug+set}" = set; then :
- enableval=$enable_debug; USE_DEBUG=$enableval
-else
- USE_DEBUG=no
-fi
-
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $USE_DEBUG" >&5
-$as_echo "$USE_DEBUG" >&6; }
- if test $USE_DEBUG = yes; then
- DEBUG_TRUE=
- DEBUG_FALSE='#'
-else
- DEBUG_TRUE='#'
- DEBUG_FALSE=
-fi
-
- DBG=$USE_DEBUG
-
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to enable profiling everything in the library" >&5
-$as_echo_n "checking whether to enable profiling everything in the library... " >&6; }
- # Check whether --enable-profile was given.
-if test "${enable_profile+set}" = set; then :
- enableval=$enable_profile; USE_PROFILE=$enableval
-else
- USE_PROFILE=no
-fi
-
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $USE_PROFILE" >&5
-$as_echo "$USE_PROFILE" >&6; }
- if test $USE_PROFILE = yes; then
- PROFILE_TRUE=
- PROFILE_FALSE='#'
-else
- PROFILE_TRUE='#'
- PROFILE_FALSE=
-fi
-
- PROF=$USE_PROFILE
-
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to enable warnings when compiling the library" >&5
-$as_echo_n "checking whether to enable warnings when compiling the library... " >&6; }
- # Check whether --enable-warnings was given.
-if test "${enable_warnings+set}" = set; then :
- enableval=$enable_warnings; USE_WARNINGS=$enableval
-else
- USE_WARNINGS=no
-fi
-
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $USE_WARNINGS" >&5
-$as_echo "$USE_WARNINGS" >&6; }
- WARN=$USE_WARNINGS
-
-
-echo "-----------------------------------------------"
-
-# CFLAGS=${CFLAGS:-$DEFAULT_CFLAGS}
-# CXXFLAGS=${CXXFLAGS:-$DEFAULT_CXXFLAGS}
-
-######################################################
-# Try and pass different flags according to compiler #
-######################################################
-
-
-# disable default -g -O2 CXXFLAGS
-: ${CXXFLAGS=""}
-
-#set CXX
-ac_ext=cpp
-ac_cpp='$CXXCPP $CPPFLAGS'
-ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
-if test -z "$CXX"; then
- if test -n "$CCC"; then
- CXX=$CCC
- else
- if test -n "$ac_tool_prefix"; then
- for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC
- do
- # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
-set dummy $ac_tool_prefix$ac_prog; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_CXX+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- if test -n "$CXX"; then
- ac_cv_prog_CXX="$CXX" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
- IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
- for ac_exec_ext in '' $ac_executable_extensions; do
- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
- ac_cv_prog_CXX="$ac_tool_prefix$ac_prog"
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
- break 2
- fi
-done
- done
-IFS=$as_save_IFS
-
-fi
-fi
-CXX=$ac_cv_prog_CXX
-if test -n "$CXX"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXX" >&5
-$as_echo "$CXX" >&6; }
-else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
- test -n "$CXX" && break
- done
-fi
-if test -z "$CXX"; then
- ac_ct_CXX=$CXX
- for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC
-do
- # Extract the first word of "$ac_prog", so it can be a program name with args.
-set dummy $ac_prog; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_ac_ct_CXX+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- if test -n "$ac_ct_CXX"; then
- ac_cv_prog_ac_ct_CXX="$ac_ct_CXX" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
- IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
- for ac_exec_ext in '' $ac_executable_extensions; do
- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
- ac_cv_prog_ac_ct_CXX="$ac_prog"
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
- break 2
- fi
-done
- done
-IFS=$as_save_IFS
-
-fi
-fi
-ac_ct_CXX=$ac_cv_prog_ac_ct_CXX
-if test -n "$ac_ct_CXX"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CXX" >&5
-$as_echo "$ac_ct_CXX" >&6; }
-else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
- test -n "$ac_ct_CXX" && break
-done
-
- if test "x$ac_ct_CXX" = x; then
- CXX="g++"
- else
- case $cross_compiling:$ac_tool_warned in
-yes:)
-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
-ac_tool_warned=yes ;;
-esac
- CXX=$ac_ct_CXX
- fi
-fi
-
- fi
-fi
-# Provide some information about the compiler.
-$as_echo "$as_me:${as_lineno-$LINENO}: checking for C++ compiler version" >&5
-set X $ac_compile
-ac_compiler=$2
-for ac_option in --version -v -V -qversion; do
- { { ac_try="$ac_compiler $ac_option >&5"
-case "(($ac_try" in
- *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
- *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
- (eval "$ac_compiler $ac_option >&5") 2>conftest.err
- ac_status=$?
- if test -s conftest.err; then
- sed '10a\
-... rest of stderr output deleted ...
- 10q' conftest.err >conftest.er1
- cat conftest.er1 >&5
- fi
- rm -f conftest.er1 conftest.err
- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
- test $ac_status = 0; }
-done
-
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-
-int
-main ()
-{
-
- ;
- return 0;
-}
-_ACEOF
-ac_clean_files_save=$ac_clean_files
-ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out"
-# Try to create an executable without -o first, disregard a.out.
-# It will help us diagnose broken compilers, and finding out an intuition
-# of exeext.
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C++ compiler works" >&5
-$as_echo_n "checking whether the C++ compiler works... " >&6; }
-ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'`
-
-# The possible output files:
-ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*"
-
-ac_rmfiles=
-for ac_file in $ac_files
-do
- case $ac_file in
- *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;;
- * ) ac_rmfiles="$ac_rmfiles $ac_file";;
- esac
-done
-rm -f $ac_rmfiles
-
-if { { ac_try="$ac_link_default"
-case "(($ac_try" in
- *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
- *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
- (eval "$ac_link_default") 2>&5
- ac_status=$?
- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
- test $ac_status = 0; }; then :
- # Autoconf-2.13 could set the ac_cv_exeext variable to `no'.
-# So ignore a value of `no', otherwise this would lead to `EXEEXT = no'
-# in a Makefile. We should not override ac_cv_exeext if it was cached,
-# so that the user can short-circuit this test for compilers unknown to
-# Autoconf.
-for ac_file in $ac_files ''
-do
- test -f "$ac_file" || continue
- case $ac_file in
- *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj )
- ;;
- [ab].out )
- # We found the default executable, but exeext='' is most
- # certainly right.
- break;;
- *.* )
- if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no;
- then :; else
- ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
- fi
- # We set ac_cv_exeext here because the later test for it is not
- # safe: cross compilers may not add the suffix if given an `-o'
- # argument, so we may need to know it at that point already.
- # Even if this section looks crufty: it has the advantage of
- # actually working.
- break;;
- * )
- break;;
- esac
-done
-test "$ac_cv_exeext" = no && ac_cv_exeext=
-
-else
- ac_file=''
-fi
-if test -z "$ac_file"; then :
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-$as_echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
-as_fn_error 77 "C++ compiler cannot create executables
-See \`config.log' for more details" "$LINENO" 5; }
-else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for C++ compiler default output file name" >&5
-$as_echo_n "checking for C++ compiler default output file name... " >&6; }
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5
-$as_echo "$ac_file" >&6; }
-ac_exeext=$ac_cv_exeext
-
-rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out
-ac_clean_files=$ac_clean_files_save
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5
-$as_echo_n "checking for suffix of executables... " >&6; }
-if { { ac_try="$ac_link"
-case "(($ac_try" in
- *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
- *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
- (eval "$ac_link") 2>&5
- ac_status=$?
- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
- test $ac_status = 0; }; then :
- # If both `conftest.exe' and `conftest' are `present' (well, observable)
-# catch `conftest.exe'. For instance with Cygwin, `ls conftest' will
-# work properly (i.e., refer to `conftest.exe'), while it won't with
-# `rm'.
-for ac_file in conftest.exe conftest conftest.*; do
- test -f "$ac_file" || continue
- case $ac_file in
- *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;;
- *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
- break;;
- * ) break;;
- esac
-done
-else
- { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
-as_fn_error $? "cannot compute suffix of executables: cannot compile and link
-See \`config.log' for more details" "$LINENO" 5; }
-fi
-rm -f conftest conftest$ac_cv_exeext
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5
-$as_echo "$ac_cv_exeext" >&6; }
-
-rm -f conftest.$ac_ext
-EXEEXT=$ac_cv_exeext
-ac_exeext=$EXEEXT
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-#include <stdio.h>
-int
-main ()
-{
-FILE *f = fopen ("conftest.out", "w");
- return ferror (f) || fclose (f) != 0;
-
- ;
- return 0;
-}
-_ACEOF
-ac_clean_files="$ac_clean_files conftest.out"
-# Check that the compiler produces executables we can run. If not, either
-# the compiler is broken, or we cross compile.
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5
-$as_echo_n "checking whether we are cross compiling... " >&6; }
-if test "$cross_compiling" != yes; then
- { { ac_try="$ac_link"
-case "(($ac_try" in
- *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
- *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
- (eval "$ac_link") 2>&5
- ac_status=$?
- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
- test $ac_status = 0; }
- if { ac_try='./conftest$ac_cv_exeext'
- { { case "(($ac_try" in
- *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
- *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
- (eval "$ac_try") 2>&5
- ac_status=$?
- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
- test $ac_status = 0; }; }; then
- cross_compiling=no
- else
- if test "$cross_compiling" = maybe; then
- cross_compiling=yes
- else
- { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
-as_fn_error $? "cannot run C++ compiled programs.
-If you meant to cross compile, use \`--host'.
-See \`config.log' for more details" "$LINENO" 5; }
- fi
- fi
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5
-$as_echo "$cross_compiling" >&6; }
-
-rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out
-ac_clean_files=$ac_clean_files_save
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5
-$as_echo_n "checking for suffix of object files... " >&6; }
-if ${ac_cv_objext+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-
-int
-main ()
-{
-
- ;
- return 0;
-}
-_ACEOF
-rm -f conftest.o conftest.obj
-if { { ac_try="$ac_compile"
-case "(($ac_try" in
- *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
- *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
- (eval "$ac_compile") 2>&5
- ac_status=$?
- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
- test $ac_status = 0; }; then :
- for ac_file in conftest.o conftest.obj conftest.*; do
- test -f "$ac_file" || continue;
- case $ac_file in
- *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;;
- *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'`
- break;;
- esac
-done
-else
- $as_echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
-as_fn_error $? "cannot compute suffix of object files: cannot compile
-See \`config.log' for more details" "$LINENO" 5; }
-fi
-rm -f conftest.$ac_cv_objext conftest.$ac_ext
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5
-$as_echo "$ac_cv_objext" >&6; }
-OBJEXT=$ac_cv_objext
-ac_objext=$OBJEXT
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C++ compiler" >&5
-$as_echo_n "checking whether we are using the GNU C++ compiler... " >&6; }
-if ${ac_cv_cxx_compiler_gnu+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-
-int
-main ()
-{
-#ifndef __GNUC__
- choke me
-#endif
-
- ;
- return 0;
-}
-_ACEOF
-if ac_fn_cxx_try_compile "$LINENO"; then :
- ac_compiler_gnu=yes
-else
- ac_compiler_gnu=no
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-ac_cv_cxx_compiler_gnu=$ac_compiler_gnu
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cxx_compiler_gnu" >&5
-$as_echo "$ac_cv_cxx_compiler_gnu" >&6; }
-if test $ac_compiler_gnu = yes; then
- GXX=yes
-else
- GXX=
-fi
-ac_test_CXXFLAGS=${CXXFLAGS+set}
-ac_save_CXXFLAGS=$CXXFLAGS
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CXX accepts -g" >&5
-$as_echo_n "checking whether $CXX accepts -g... " >&6; }
-if ${ac_cv_prog_cxx_g+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- ac_save_cxx_werror_flag=$ac_cxx_werror_flag
- ac_cxx_werror_flag=yes
- ac_cv_prog_cxx_g=no
- CXXFLAGS="-g"
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-
-int
-main ()
-{
-
- ;
- return 0;
-}
-_ACEOF
-if ac_fn_cxx_try_compile "$LINENO"; then :
- ac_cv_prog_cxx_g=yes
-else
- CXXFLAGS=""
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-
-int
-main ()
-{
-
- ;
- return 0;
-}
-_ACEOF
-if ac_fn_cxx_try_compile "$LINENO"; then :
-
-else
- ac_cxx_werror_flag=$ac_save_cxx_werror_flag
- CXXFLAGS="-g"
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-
-int
-main ()
-{
-
- ;
- return 0;
-}
-_ACEOF
-if ac_fn_cxx_try_compile "$LINENO"; then :
- ac_cv_prog_cxx_g=yes
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
- ac_cxx_werror_flag=$ac_save_cxx_werror_flag
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cxx_g" >&5
-$as_echo "$ac_cv_prog_cxx_g" >&6; }
-if test "$ac_test_CXXFLAGS" = set; then
- CXXFLAGS=$ac_save_CXXFLAGS
-elif test $ac_cv_prog_cxx_g = yes; then
- if test "$GXX" = yes; then
- CXXFLAGS="-g -O2"
- else
- CXXFLAGS="-g"
- fi
-else
- if test "$GXX" = yes; then
- CXXFLAGS="-O2"
- else
- CXXFLAGS=
- fi
-fi
-ac_ext=cpp
-ac_cpp='$CXXCPP $CPPFLAGS'
-ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
-
-
-
-
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for family name of compiler" >&5
-$as_echo_n "checking for family name of compiler... " >&6; }
-
- if test "$cross_compiling" = yes; then :
- { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
-as_fn_error $? "cannot run test program while cross compiling
-See \`config.log' for more details" "$LINENO" 5; }
-else
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-
- #ifdef __INTEL_COMPILER
- int main() { return 0 ; }
- #else
- pas intel
- #endif
-_ACEOF
-if ac_fn_cxx_try_run "$LINENO"; then :
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: icc" >&5
-$as_echo "icc" >&6; }
- CCNAM=icc
-
-
-fi
-rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
- conftest.$ac_objext conftest.beam conftest.$ac_ext
-fi
-
-
- if test -z "${CCNAM}"; then :
-
- if test "$cross_compiling" = yes; then :
- { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
-as_fn_error $? "cannot run test program while cross compiling
-See \`config.log' for more details" "$LINENO" 5; }
-else
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-
- #ifdef __PATHSCALE__
- int main() { return !(__PATHCC__ >= 4) ; }
- #else
- pas ekopath non plus.
- #endif
-_ACEOF
-if ac_fn_cxx_try_run "$LINENO"; then :
-
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: eko" >&5
-$as_echo "eko" >&6; }
- CCNAM=eko
-
-fi
-rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
- conftest.$ac_objext conftest.beam conftest.$ac_ext
-fi
-
-
-fi
-
- if test -z "${CCNAM}"; then :
-
- if test "$cross_compiling" = yes; then :
- { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
-as_fn_error $? "cannot run test program while cross compiling
-See \`config.log' for more details" "$LINENO" 5; }
-else
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-
- #ifdef __clang__
- int main() { return !(__clang_major >=3) ; }
- #else
- pas clang non plus.
- #endif
-_ACEOF
-if ac_fn_cxx_try_run "$LINENO"; then :
-
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: clang" >&5
-$as_echo "clang" >&6; }
- CCNAM=clang
-
-fi
-rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
- conftest.$ac_objext conftest.beam conftest.$ac_ext
-fi
-
-
-fi
-
- if test -z "${CCNAM}"; then :
-
- if test "$cross_compiling" = yes; then :
- { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
-as_fn_error $? "cannot run test program while cross compiling
-See \`config.log' for more details" "$LINENO" 5; }
-else
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-
- #ifdef __GNUC__
- int main() { return !(__GNUC__ >= 4 || (__GNUC__ == 4 && __GNUC_MINOR__ > 2)) ; }
- #else
- pas gcc non plus ???
- #endif
-_ACEOF
-if ac_fn_cxx_try_run "$LINENO"; then :
-
- CCNOM=gcc
- if test -n "${CC}" ; then :
- CCNOM="`$CC --version 2>&1| awk 'NR<2{print }'`"
-fi
- CCNAM=gcc
-
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CCNOM" >&5
-$as_echo "$CCNOM" >&6; }
-
-fi
-rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
- conftest.$ac_objext conftest.beam conftest.$ac_ext
-fi
-
-
-fi
-
-
- if test -z "${CCNAM}"; then :
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: unknown" >&5
-$as_echo "unknown" >&6; }
- CCNAM=unknown
-
- echo
- echo " *** unknow compiler. please file a bug "
- echo
-
-fi
-
-
-
-
-
-
-TESTS_CFLAGS="-O0"
-DEBUG_CFLAGS="-g"
-
-DEFAULT_CFLAGS=""
-# WARN_CFLAGS="-Wall"
-
-#TODO use -fast for icc, -ipa for eko...
-if test "x$DBG" = "xyes" ; then
- DEFAULT_CFLAGS="-O0 ${DEFAULT_CFLAGS} " #those are CXXFLAGS
- DEBUG_CFLAGS="${DEBUG_CFLAGS} -DDEBUG -D_LB_DEBUG"
-else
- DEFAULT_CFLAGS="-O2 ${DEFAULT_CFLAGS} "
- DEBUG_CFLAGS="${DEBUG_CFLAGS} -DNDEBUG -U_LB_DEBUG"
-fi
-
-if test "x$PROF" = "xyes" ; then
- DEFAULT_CFLAGS="${DEFAULT_CFLAGS} -pg"
-fi
-
-if test "x$WARN" = "xyes" -o "x$WARN" = "xfull" ; then
- case x${CCNAM} in
- xicc)
- WARN_CFLAGS="${WARN_CFLAGS} -Wcheck"
- # DEBUG_CFLAGS="-fast"
- ;;
- xeko)
- WARN_CFLAGS="${WARN_CFLAGS} -Wno-unused-parameter"
- ;;
- xgcc|xclang)
- WARN_CFLAGS="${WARN_CFLAGS} -Wextra -Wno-unused-parameter"
- if test "x${WARN}" = "xfull" ; then
- WARN_CFLAGS="${WARN_CFLAGS} -Wuninitialized -Wconversion -Wcast-qual -ansi -pedantic -Wshadow -Wpointer-arith -Wcast-align -Wwrite-strings -Wno-long-long"
- fi
- ;;
- *)
- echo
- echo "*******************************************************"
- echo "unsupported compiler ($CCNAM). Please file a bug."
- echo "*******************************************************"
- echo
- WARN_CFLAGS="${WARN_CFLAGS}"
- esac
-fi
-
-
-DEFAULT_CFLAGS="${DEFAULT_CFLAGS} ${WARN_CFLAGS} ${DEBUG_CFLAGS}"
-TESTS_CFLAGS="${TESTS_CFLAGS} ${WARN_CFLAGS} ${DEBUG_CFLAGS}"
-
-
-ac_ext=cpp
-ac_cpp='$CXXCPP $CPPFLAGS'
-ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C++ preprocessor" >&5
-$as_echo_n "checking how to run the C++ preprocessor... " >&6; }
-if test -z "$CXXCPP"; then
- if ${ac_cv_prog_CXXCPP+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- # Double quotes because CXXCPP needs to be expanded
- for CXXCPP in "$CXX -E" "/lib/cpp"
- do
- ac_preproc_ok=false
-for ac_cxx_preproc_warn_flag in '' yes
-do
- # Use a header file that comes with gcc, so configuring glibc
- # with a fresh cross-compiler works.
- # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
- # <limits.h> exists even on freestanding compilers.
- # On the NeXT, cc -E runs the code through the compiler's parser,
- # not just through cpp. "Syntax error" is here to catch this case.
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-#ifdef __STDC__
-# include <limits.h>
-#else
-# include <assert.h>
-#endif
- Syntax error
-_ACEOF
-if ac_fn_cxx_try_cpp "$LINENO"; then :
-
-else
- # Broken: fails on valid input.
-continue
-fi
-rm -f conftest.err conftest.i conftest.$ac_ext
-
- # OK, works on sane cases. Now check whether nonexistent headers
- # can be detected and how.
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-#include <ac_nonexistent.h>
-_ACEOF
-if ac_fn_cxx_try_cpp "$LINENO"; then :
- # Broken: success on invalid input.
-continue
-else
- # Passes both tests.
-ac_preproc_ok=:
-break
-fi
-rm -f conftest.err conftest.i conftest.$ac_ext
-
-done
-# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
-rm -f conftest.i conftest.err conftest.$ac_ext
-if $ac_preproc_ok; then :
- break
-fi
-
- done
- ac_cv_prog_CXXCPP=$CXXCPP
-
-fi
- CXXCPP=$ac_cv_prog_CXXCPP
-else
- ac_cv_prog_CXXCPP=$CXXCPP
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXXCPP" >&5
-$as_echo "$CXXCPP" >&6; }
-ac_preproc_ok=false
-for ac_cxx_preproc_warn_flag in '' yes
-do
- # Use a header file that comes with gcc, so configuring glibc
- # with a fresh cross-compiler works.
- # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
- # <limits.h> exists even on freestanding compilers.
- # On the NeXT, cc -E runs the code through the compiler's parser,
- # not just through cpp. "Syntax error" is here to catch this case.
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-#ifdef __STDC__
-# include <limits.h>
-#else
-# include <assert.h>
-#endif
- Syntax error
-_ACEOF
-if ac_fn_cxx_try_cpp "$LINENO"; then :
-
-else
- # Broken: fails on valid input.
-continue
-fi
-rm -f conftest.err conftest.i conftest.$ac_ext
-
- # OK, works on sane cases. Now check whether nonexistent headers
- # can be detected and how.
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-#include <ac_nonexistent.h>
-_ACEOF
-if ac_fn_cxx_try_cpp "$LINENO"; then :
- # Broken: success on invalid input.
-continue
-else
- # Passes both tests.
-ac_preproc_ok=:
-break
-fi
-rm -f conftest.err conftest.i conftest.$ac_ext
-
-done
-# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
-rm -f conftest.i conftest.err conftest.$ac_ext
-if $ac_preproc_ok; then :
-
-else
- { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
-as_fn_error $? "C++ preprocessor \"$CXXCPP\" fails sanity check
-See \`config.log' for more details" "$LINENO" 5; }
-fi
-
-ac_ext=cpp
-ac_cpp='$CXXCPP $CPPFLAGS'
-ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
-
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5
-$as_echo_n "checking for grep that handles long lines and -e... " >&6; }
-if ${ac_cv_path_GREP+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- if test -z "$GREP"; then
- ac_path_GREP_found=false
- # Loop through the user's path and test for each of PROGNAME-LIST
- as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin
-do
- IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
- for ac_prog in grep ggrep; do
- for ac_exec_ext in '' $ac_executable_extensions; do
- ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext"
- as_fn_executable_p "$ac_path_GREP" || continue
-# Check for GNU ac_path_GREP and select it if it is found.
- # Check for GNU $ac_path_GREP
-case `"$ac_path_GREP" --version 2>&1` in
-*GNU*)
- ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;;
-*)
- ac_count=0
- $as_echo_n 0123456789 >"conftest.in"
- while :
- do
- cat "conftest.in" "conftest.in" >"conftest.tmp"
- mv "conftest.tmp" "conftest.in"
- cp "conftest.in" "conftest.nl"
- $as_echo 'GREP' >> "conftest.nl"
- "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break
- diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
- as_fn_arith $ac_count + 1 && ac_count=$as_val
- if test $ac_count -gt ${ac_path_GREP_max-0}; then
- # Best one so far, save it but keep looking for a better one
- ac_cv_path_GREP="$ac_path_GREP"
- ac_path_GREP_max=$ac_count
- fi
- # 10*(2^10) chars as input seems more than enough
- test $ac_count -gt 10 && break
- done
- rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
-esac
-
- $ac_path_GREP_found && break 3
- done
- done
- done
-IFS=$as_save_IFS
- if test -z "$ac_cv_path_GREP"; then
- as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5
- fi
-else
- ac_cv_path_GREP=$GREP
-fi
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5
-$as_echo "$ac_cv_path_GREP" >&6; }
- GREP="$ac_cv_path_GREP"
-
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5
-$as_echo_n "checking for egrep... " >&6; }
-if ${ac_cv_path_EGREP+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- if echo a | $GREP -E '(a|b)' >/dev/null 2>&1
- then ac_cv_path_EGREP="$GREP -E"
- else
- if test -z "$EGREP"; then
- ac_path_EGREP_found=false
- # Loop through the user's path and test for each of PROGNAME-LIST
- as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin
-do
- IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
- for ac_prog in egrep; do
- for ac_exec_ext in '' $ac_executable_extensions; do
- ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext"
- as_fn_executable_p "$ac_path_EGREP" || continue
-# Check for GNU ac_path_EGREP and select it if it is found.
- # Check for GNU $ac_path_EGREP
-case `"$ac_path_EGREP" --version 2>&1` in
-*GNU*)
- ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;;
-*)
- ac_count=0
- $as_echo_n 0123456789 >"conftest.in"
- while :
- do
- cat "conftest.in" "conftest.in" >"conftest.tmp"
- mv "conftest.tmp" "conftest.in"
- cp "conftest.in" "conftest.nl"
- $as_echo 'EGREP' >> "conftest.nl"
- "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break
- diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
- as_fn_arith $ac_count + 1 && ac_count=$as_val
- if test $ac_count -gt ${ac_path_EGREP_max-0}; then
- # Best one so far, save it but keep looking for a better one
- ac_cv_path_EGREP="$ac_path_EGREP"
- ac_path_EGREP_max=$ac_count
- fi
- # 10*(2^10) chars as input seems more than enough
- test $ac_count -gt 10 && break
- done
- rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
-esac
-
- $ac_path_EGREP_found && break 3
- done
- done
- done
-IFS=$as_save_IFS
- if test -z "$ac_cv_path_EGREP"; then
- as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5
- fi
-else
- ac_cv_path_EGREP=$EGREP
-fi
-
- fi
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5
-$as_echo "$ac_cv_path_EGREP" >&6; }
- EGREP="$ac_cv_path_EGREP"
-
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5
-$as_echo_n "checking for ANSI C header files... " >&6; }
-if ${ac_cv_header_stdc+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-#include <stdlib.h>
-#include <stdarg.h>
-#include <string.h>
-#include <float.h>
-
-int
-main ()
-{
-
- ;
- return 0;
-}
-_ACEOF
-if ac_fn_cxx_try_compile "$LINENO"; then :
- ac_cv_header_stdc=yes
-else
- ac_cv_header_stdc=no
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-
-if test $ac_cv_header_stdc = yes; then
- # SunOS 4.x string.h does not declare mem*, contrary to ANSI.
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-#include <string.h>
-
-_ACEOF
-if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
- $EGREP "memchr" >/dev/null 2>&1; then :
-
-else
- ac_cv_header_stdc=no
-fi
-rm -f conftest*
-
-fi
-
-if test $ac_cv_header_stdc = yes; then
- # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI.
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-#include <stdlib.h>
-
-_ACEOF
-if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
- $EGREP "free" >/dev/null 2>&1; then :
-
-else
- ac_cv_header_stdc=no
-fi
-rm -f conftest*
-
-fi
-
-if test $ac_cv_header_stdc = yes; then
- # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi.
- if test "$cross_compiling" = yes; then :
- :
-else
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-#include <ctype.h>
-#include <stdlib.h>
-#if ((' ' & 0x0FF) == 0x020)
-# define ISLOWER(c) ('a' <= (c) && (c) <= 'z')
-# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c))
-#else
-# define ISLOWER(c) \
- (('a' <= (c) && (c) <= 'i') \
- || ('j' <= (c) && (c) <= 'r') \
- || ('s' <= (c) && (c) <= 'z'))
-# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c))
-#endif
-
-#define XOR(e, f) (((e) && !(f)) || (!(e) && (f)))
-int
-main ()
-{
- int i;
- for (i = 0; i < 256; i++)
- if (XOR (islower (i), ISLOWER (i))
- || toupper (i) != TOUPPER (i))
- return 2;
- return 0;
-}
-_ACEOF
-if ac_fn_cxx_try_run "$LINENO"; then :
-
-else
- ac_cv_header_stdc=no
-fi
-rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
- conftest.$ac_objext conftest.beam conftest.$ac_ext
-fi
-
-fi
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5
-$as_echo "$ac_cv_header_stdc" >&6; }
-if test $ac_cv_header_stdc = yes; then
-
-$as_echo "#define STDC_HEADERS 1" >>confdefs.h
-
-fi
-
-case `pwd` in
- *\ * | *\ *)
- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&5
-$as_echo "$as_me: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&2;} ;;
-esac
-
-
-
-macro_version='2.4.2'
-macro_revision='1.3337'
-
-
-
-
-
-
-
-
-
-
-
-
-
-ltmain="$ac_aux_dir/ltmain.sh"
-
-# Make sure we can run config.sub.
-$SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 ||
- as_fn_error $? "cannot run $SHELL $ac_aux_dir/config.sub" "$LINENO" 5
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking build system type" >&5
-$as_echo_n "checking build system type... " >&6; }
-if ${ac_cv_build+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- ac_build_alias=$build_alias
-test "x$ac_build_alias" = x &&
- ac_build_alias=`$SHELL "$ac_aux_dir/config.guess"`
-test "x$ac_build_alias" = x &&
- as_fn_error $? "cannot guess build type; you must specify one" "$LINENO" 5
-ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` ||
- as_fn_error $? "$SHELL $ac_aux_dir/config.sub $ac_build_alias failed" "$LINENO" 5
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5
-$as_echo "$ac_cv_build" >&6; }
-case $ac_cv_build in
-*-*-*) ;;
-*) as_fn_error $? "invalid value of canonical build" "$LINENO" 5;;
-esac
-build=$ac_cv_build
-ac_save_IFS=$IFS; IFS='-'
-set x $ac_cv_build
-shift
-build_cpu=$1
-build_vendor=$2
-shift; shift
-# Remember, the first character of IFS is used to create $*,
-# except with old shells:
-build_os=$*
-IFS=$ac_save_IFS
-case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac
-
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking host system type" >&5
-$as_echo_n "checking host system type... " >&6; }
-if ${ac_cv_host+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- if test "x$host_alias" = x; then
- ac_cv_host=$ac_cv_build
-else
- ac_cv_host=`$SHELL "$ac_aux_dir/config.sub" $host_alias` ||
- as_fn_error $? "$SHELL $ac_aux_dir/config.sub $host_alias failed" "$LINENO" 5
-fi
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_host" >&5
-$as_echo "$ac_cv_host" >&6; }
-case $ac_cv_host in
-*-*-*) ;;
-*) as_fn_error $? "invalid value of canonical host" "$LINENO" 5;;
-esac
-host=$ac_cv_host
-ac_save_IFS=$IFS; IFS='-'
-set x $ac_cv_host
-shift
-host_cpu=$1
-host_vendor=$2
-shift; shift
-# Remember, the first character of IFS is used to create $*,
-# except with old shells:
-host_os=$*
-IFS=$ac_save_IFS
-case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac
-
-
-# Backslashify metacharacters that are still active within
-# double-quoted strings.
-sed_quote_subst='s/\(["`$\\]\)/\\\1/g'
-
-# Same as above, but do not quote variable references.
-double_quote_subst='s/\(["`\\]\)/\\\1/g'
-
-# Sed substitution to delay expansion of an escaped shell variable in a
-# double_quote_subst'ed string.
-delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g'
-
-# Sed substitution to delay expansion of an escaped single quote.
-delay_single_quote_subst='s/'\''/'\'\\\\\\\'\''/g'
-
-# Sed substitution to avoid accidental globbing in evaled expressions
-no_glob_subst='s/\*/\\\*/g'
-
-ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
-ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO
-ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to print strings" >&5
-$as_echo_n "checking how to print strings... " >&6; }
-# Test print first, because it will be a builtin if present.
-if test "X`( print -r -- -n ) 2>/dev/null`" = X-n && \
- test "X`print -r -- $ECHO 2>/dev/null`" = "X$ECHO"; then
- ECHO='print -r --'
-elif test "X`printf %s $ECHO 2>/dev/null`" = "X$ECHO"; then
- ECHO='printf %s\n'
-else
- # Use this function as a fallback that always works.
- func_fallback_echo ()
- {
- eval 'cat <<_LTECHO_EOF
-$1
-_LTECHO_EOF'
- }
- ECHO='func_fallback_echo'
-fi
-
-# func_echo_all arg...
-# Invoke $ECHO with all args, space-separated.
-func_echo_all ()
-{
- $ECHO ""
-}
-
-case "$ECHO" in
- printf*) { $as_echo "$as_me:${as_lineno-$LINENO}: result: printf" >&5
-$as_echo "printf" >&6; } ;;
- print*) { $as_echo "$as_me:${as_lineno-$LINENO}: result: print -r" >&5
-$as_echo "print -r" >&6; } ;;
- *) { $as_echo "$as_me:${as_lineno-$LINENO}: result: cat" >&5
-$as_echo "cat" >&6; } ;;
-esac
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-ac_ext=c
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_c_compiler_gnu
-if test -n "$ac_tool_prefix"; then
- # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args.
-set dummy ${ac_tool_prefix}gcc; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_CC+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- if test -n "$CC"; then
- ac_cv_prog_CC="$CC" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
- IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
- for ac_exec_ext in '' $ac_executable_extensions; do
- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
- ac_cv_prog_CC="${ac_tool_prefix}gcc"
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
- break 2
- fi
-done
- done
-IFS=$as_save_IFS
-
-fi
-fi
-CC=$ac_cv_prog_CC
-if test -n "$CC"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
-$as_echo "$CC" >&6; }
-else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-fi
-if test -z "$ac_cv_prog_CC"; then
- ac_ct_CC=$CC
- # Extract the first word of "gcc", so it can be a program name with args.
-set dummy gcc; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_ac_ct_CC+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- if test -n "$ac_ct_CC"; then
- ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
- IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
- for ac_exec_ext in '' $ac_executable_extensions; do
- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
- ac_cv_prog_ac_ct_CC="gcc"
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
- break 2
- fi
-done
- done
-IFS=$as_save_IFS
-
-fi
-fi
-ac_ct_CC=$ac_cv_prog_ac_ct_CC
-if test -n "$ac_ct_CC"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5
-$as_echo "$ac_ct_CC" >&6; }
-else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
- if test "x$ac_ct_CC" = x; then
- CC=""
- else
- case $cross_compiling:$ac_tool_warned in
-yes:)
-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
-ac_tool_warned=yes ;;
-esac
- CC=$ac_ct_CC
- fi
-else
- CC="$ac_cv_prog_CC"
-fi
-
-if test -z "$CC"; then
- if test -n "$ac_tool_prefix"; then
- # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args.
-set dummy ${ac_tool_prefix}cc; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_CC+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- if test -n "$CC"; then
- ac_cv_prog_CC="$CC" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
- IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
- for ac_exec_ext in '' $ac_executable_extensions; do
- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
- ac_cv_prog_CC="${ac_tool_prefix}cc"
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
- break 2
- fi
-done
- done
-IFS=$as_save_IFS
-
-fi
-fi
-CC=$ac_cv_prog_CC
-if test -n "$CC"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
-$as_echo "$CC" >&6; }
-else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
- fi
-fi
-if test -z "$CC"; then
- # Extract the first word of "cc", so it can be a program name with args.
-set dummy cc; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_CC+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- if test -n "$CC"; then
- ac_cv_prog_CC="$CC" # Let the user override the test.
-else
- ac_prog_rejected=no
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
- IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
- for ac_exec_ext in '' $ac_executable_extensions; do
- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
- if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then
- ac_prog_rejected=yes
- continue
- fi
- ac_cv_prog_CC="cc"
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
- break 2
- fi
-done
- done
-IFS=$as_save_IFS
-
-if test $ac_prog_rejected = yes; then
- # We found a bogon in the path, so make sure we never use it.
- set dummy $ac_cv_prog_CC
- shift
- if test $# != 0; then
- # We chose a different compiler from the bogus one.
- # However, it has the same basename, so the bogon will be chosen
- # first if we set CC to just the basename; use the full file name.
- shift
- ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@"
- fi
-fi
-fi
-fi
-CC=$ac_cv_prog_CC
-if test -n "$CC"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
-$as_echo "$CC" >&6; }
-else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-fi
-if test -z "$CC"; then
- if test -n "$ac_tool_prefix"; then
- for ac_prog in cl.exe
- do
- # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
-set dummy $ac_tool_prefix$ac_prog; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_CC+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- if test -n "$CC"; then
- ac_cv_prog_CC="$CC" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
- IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
- for ac_exec_ext in '' $ac_executable_extensions; do
- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
- ac_cv_prog_CC="$ac_tool_prefix$ac_prog"
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
- break 2
- fi
-done
- done
-IFS=$as_save_IFS
-
-fi
-fi
-CC=$ac_cv_prog_CC
-if test -n "$CC"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
-$as_echo "$CC" >&6; }
-else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
- test -n "$CC" && break
- done
-fi
-if test -z "$CC"; then
- ac_ct_CC=$CC
- for ac_prog in cl.exe
-do
- # Extract the first word of "$ac_prog", so it can be a program name with args.
-set dummy $ac_prog; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_ac_ct_CC+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- if test -n "$ac_ct_CC"; then
- ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
- IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
- for ac_exec_ext in '' $ac_executable_extensions; do
- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
- ac_cv_prog_ac_ct_CC="$ac_prog"
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
- break 2
- fi
-done
- done
-IFS=$as_save_IFS
-
-fi
-fi
-ac_ct_CC=$ac_cv_prog_ac_ct_CC
-if test -n "$ac_ct_CC"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5
-$as_echo "$ac_ct_CC" >&6; }
-else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
- test -n "$ac_ct_CC" && break
-done
-
- if test "x$ac_ct_CC" = x; then
- CC=""
- else
- case $cross_compiling:$ac_tool_warned in
-yes:)
-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
-ac_tool_warned=yes ;;
-esac
- CC=$ac_ct_CC
- fi
-fi
-
-fi
-
-
-test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
-as_fn_error $? "no acceptable C compiler found in \$PATH
-See \`config.log' for more details" "$LINENO" 5; }
-
-# Provide some information about the compiler.
-$as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5
-set X $ac_compile
-ac_compiler=$2
-for ac_option in --version -v -V -qversion; do
- { { ac_try="$ac_compiler $ac_option >&5"
-case "(($ac_try" in
- *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
- *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
- (eval "$ac_compiler $ac_option >&5") 2>conftest.err
- ac_status=$?
- if test -s conftest.err; then
- sed '10a\
-... rest of stderr output deleted ...
- 10q' conftest.err >conftest.er1
- cat conftest.er1 >&5
- fi
- rm -f conftest.er1 conftest.err
- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
- test $ac_status = 0; }
-done
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5
-$as_echo_n "checking whether we are using the GNU C compiler... " >&6; }
-if ${ac_cv_c_compiler_gnu+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-
-int
-main ()
-{
-#ifndef __GNUC__
- choke me
-#endif
-
- ;
- return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
- ac_compiler_gnu=yes
-else
- ac_compiler_gnu=no
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-ac_cv_c_compiler_gnu=$ac_compiler_gnu
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5
-$as_echo "$ac_cv_c_compiler_gnu" >&6; }
-if test $ac_compiler_gnu = yes; then
- GCC=yes
-else
- GCC=
-fi
-ac_test_CFLAGS=${CFLAGS+set}
-ac_save_CFLAGS=$CFLAGS
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5
-$as_echo_n "checking whether $CC accepts -g... " >&6; }
-if ${ac_cv_prog_cc_g+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- ac_save_c_werror_flag=$ac_c_werror_flag
- ac_c_werror_flag=yes
- ac_cv_prog_cc_g=no
- CFLAGS="-g"
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-
-int
-main ()
-{
-
- ;
- return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
- ac_cv_prog_cc_g=yes
-else
- CFLAGS=""
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-
-int
-main ()
-{
-
- ;
- return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-
-else
- ac_c_werror_flag=$ac_save_c_werror_flag
- CFLAGS="-g"
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-
-int
-main ()
-{
-
- ;
- return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
- ac_cv_prog_cc_g=yes
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
- ac_c_werror_flag=$ac_save_c_werror_flag
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5
-$as_echo "$ac_cv_prog_cc_g" >&6; }
-if test "$ac_test_CFLAGS" = set; then
- CFLAGS=$ac_save_CFLAGS
-elif test $ac_cv_prog_cc_g = yes; then
- if test "$GCC" = yes; then
- CFLAGS="-g -O2"
- else
- CFLAGS="-g"
- fi
-else
- if test "$GCC" = yes; then
- CFLAGS="-O2"
- else
- CFLAGS=
- fi
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5
-$as_echo_n "checking for $CC option to accept ISO C89... " >&6; }
-if ${ac_cv_prog_cc_c89+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- ac_cv_prog_cc_c89=no
-ac_save_CC=$CC
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-#include <stdarg.h>
-#include <stdio.h>
-struct stat;
-/* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */
-struct buf { int x; };
-FILE * (*rcsopen) (struct buf *, struct stat *, int);
-static char *e (p, i)
- char **p;
- int i;
-{
- return p[i];
-}
-static char *f (char * (*g) (char **, int), char **p, ...)
-{
- char *s;
- va_list v;
- va_start (v,p);
- s = g (p, va_arg (v,int));
- va_end (v);
- return s;
-}
-
-/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has
- function prototypes and stuff, but not '\xHH' hex character constants.
- These don't provoke an error unfortunately, instead are silently treated
- as 'x'. The following induces an error, until -std is added to get
- proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an
- array size at least. It's necessary to write '\x00'==0 to get something
- that's true only with -std. */
-int osf4_cc_array ['\x00' == 0 ? 1 : -1];
-
-/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters
- inside strings and character constants. */
-#define FOO(x) 'x'
-int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1];
-
-int test (int i, double x);
-struct s1 {int (*f) (int a);};
-struct s2 {int (*f) (double a);};
-int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int);
-int argc;
-char **argv;
-int
-main ()
-{
-return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1];
- ;
- return 0;
-}
-_ACEOF
-for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \
- -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__"
-do
- CC="$ac_save_CC $ac_arg"
- if ac_fn_c_try_compile "$LINENO"; then :
- ac_cv_prog_cc_c89=$ac_arg
-fi
-rm -f core conftest.err conftest.$ac_objext
- test "x$ac_cv_prog_cc_c89" != "xno" && break
-done
-rm -f conftest.$ac_ext
-CC=$ac_save_CC
-
-fi
-# AC_CACHE_VAL
-case "x$ac_cv_prog_cc_c89" in
- x)
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5
-$as_echo "none needed" >&6; } ;;
- xno)
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5
-$as_echo "unsupported" >&6; } ;;
- *)
- CC="$CC $ac_cv_prog_cc_c89"
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5
-$as_echo "$ac_cv_prog_cc_c89" >&6; } ;;
-esac
-if test "x$ac_cv_prog_cc_c89" != xno; then :
-
-fi
-
-ac_ext=cpp
-ac_cpp='$CXXCPP $CPPFLAGS'
-ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a sed that does not truncate output" >&5
-$as_echo_n "checking for a sed that does not truncate output... " >&6; }
-if ${ac_cv_path_SED+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- ac_script=s/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/
- for ac_i in 1 2 3 4 5 6 7; do
- ac_script="$ac_script$as_nl$ac_script"
- done
- echo "$ac_script" 2>/dev/null | sed 99q >conftest.sed
- { ac_script=; unset ac_script;}
- if test -z "$SED"; then
- ac_path_SED_found=false
- # Loop through the user's path and test for each of PROGNAME-LIST
- as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
- IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
- for ac_prog in sed gsed; do
- for ac_exec_ext in '' $ac_executable_extensions; do
- ac_path_SED="$as_dir/$ac_prog$ac_exec_ext"
- as_fn_executable_p "$ac_path_SED" || continue
-# Check for GNU ac_path_SED and select it if it is found.
- # Check for GNU $ac_path_SED
-case `"$ac_path_SED" --version 2>&1` in
-*GNU*)
- ac_cv_path_SED="$ac_path_SED" ac_path_SED_found=:;;
-*)
- ac_count=0
- $as_echo_n 0123456789 >"conftest.in"
- while :
- do
- cat "conftest.in" "conftest.in" >"conftest.tmp"
- mv "conftest.tmp" "conftest.in"
- cp "conftest.in" "conftest.nl"
- $as_echo '' >> "conftest.nl"
- "$ac_path_SED" -f conftest.sed < "conftest.nl" >"conftest.out" 2>/dev/null || break
- diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
- as_fn_arith $ac_count + 1 && ac_count=$as_val
- if test $ac_count -gt ${ac_path_SED_max-0}; then
- # Best one so far, save it but keep looking for a better one
- ac_cv_path_SED="$ac_path_SED"
- ac_path_SED_max=$ac_count
- fi
- # 10*(2^10) chars as input seems more than enough
- test $ac_count -gt 10 && break
- done
- rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
-esac
-
- $ac_path_SED_found && break 3
- done
- done
- done
-IFS=$as_save_IFS
- if test -z "$ac_cv_path_SED"; then
- as_fn_error $? "no acceptable sed could be found in \$PATH" "$LINENO" 5
- fi
-else
- ac_cv_path_SED=$SED
-fi
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_SED" >&5
-$as_echo "$ac_cv_path_SED" >&6; }
- SED="$ac_cv_path_SED"
- rm -f conftest.sed
-
-test -z "$SED" && SED=sed
-Xsed="$SED -e 1s/^X//"
-
-
-
-
-
-
-
-
-
-
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for fgrep" >&5
-$as_echo_n "checking for fgrep... " >&6; }
-if ${ac_cv_path_FGREP+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- if echo 'ab*c' | $GREP -F 'ab*c' >/dev/null 2>&1
- then ac_cv_path_FGREP="$GREP -F"
- else
- if test -z "$FGREP"; then
- ac_path_FGREP_found=false
- # Loop through the user's path and test for each of PROGNAME-LIST
- as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin
-do
- IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
- for ac_prog in fgrep; do
- for ac_exec_ext in '' $ac_executable_extensions; do
- ac_path_FGREP="$as_dir/$ac_prog$ac_exec_ext"
- as_fn_executable_p "$ac_path_FGREP" || continue
-# Check for GNU ac_path_FGREP and select it if it is found.
- # Check for GNU $ac_path_FGREP
-case `"$ac_path_FGREP" --version 2>&1` in
-*GNU*)
- ac_cv_path_FGREP="$ac_path_FGREP" ac_path_FGREP_found=:;;
-*)
- ac_count=0
- $as_echo_n 0123456789 >"conftest.in"
- while :
- do
- cat "conftest.in" "conftest.in" >"conftest.tmp"
- mv "conftest.tmp" "conftest.in"
- cp "conftest.in" "conftest.nl"
- $as_echo 'FGREP' >> "conftest.nl"
- "$ac_path_FGREP" FGREP < "conftest.nl" >"conftest.out" 2>/dev/null || break
- diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
- as_fn_arith $ac_count + 1 && ac_count=$as_val
- if test $ac_count -gt ${ac_path_FGREP_max-0}; then
- # Best one so far, save it but keep looking for a better one
- ac_cv_path_FGREP="$ac_path_FGREP"
- ac_path_FGREP_max=$ac_count
- fi
- # 10*(2^10) chars as input seems more than enough
- test $ac_count -gt 10 && break
- done
- rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
-esac
-
- $ac_path_FGREP_found && break 3
- done
- done
- done
-IFS=$as_save_IFS
- if test -z "$ac_cv_path_FGREP"; then
- as_fn_error $? "no acceptable fgrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5
- fi
-else
- ac_cv_path_FGREP=$FGREP
-fi
-
- fi
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_FGREP" >&5
-$as_echo "$ac_cv_path_FGREP" >&6; }
- FGREP="$ac_cv_path_FGREP"
-
-
-test -z "$GREP" && GREP=grep
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-# Check whether --with-gnu-ld was given.
-if test "${with_gnu_ld+set}" = set; then :
- withval=$with_gnu_ld; test "$withval" = no || with_gnu_ld=yes
-else
- with_gnu_ld=no
-fi
-
-ac_prog=ld
-if test "$GCC" = yes; then
- # Check if gcc -print-prog-name=ld gives a path.
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld used by $CC" >&5
-$as_echo_n "checking for ld used by $CC... " >&6; }
- case $host in
- *-*-mingw*)
- # gcc leaves a trailing carriage return which upsets mingw
- ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;;
- *)
- ac_prog=`($CC -print-prog-name=ld) 2>&5` ;;
- esac
- case $ac_prog in
- # Accept absolute paths.
- [\\/]* | ?:[\\/]*)
- re_direlt='/[^/][^/]*/\.\./'
- # Canonicalize the pathname of ld
- ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'`
- while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do
- ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"`
- done
- test -z "$LD" && LD="$ac_prog"
- ;;
- "")
- # If it fails, then pretend we aren't using GCC.
- ac_prog=ld
- ;;
- *)
- # If it is relative, then search for the first ld in PATH.
- with_gnu_ld=unknown
- ;;
- esac
-elif test "$with_gnu_ld" = yes; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5
-$as_echo_n "checking for GNU ld... " >&6; }
-else
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5
-$as_echo_n "checking for non-GNU ld... " >&6; }
-fi
-if ${lt_cv_path_LD+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- if test -z "$LD"; then
- lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
- for ac_dir in $PATH; do
- IFS="$lt_save_ifs"
- test -z "$ac_dir" && ac_dir=.
- if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then
- lt_cv_path_LD="$ac_dir/$ac_prog"
- # Check to see if the program is GNU ld. I'd rather use --version,
- # but apparently some variants of GNU ld only accept -v.
- # Break only if it was the GNU/non-GNU ld that we prefer.
- case `"$lt_cv_path_LD" -v 2>&1 </dev/null` in
- *GNU* | *'with BFD'*)
- test "$with_gnu_ld" != no && break
- ;;
- *)
- test "$with_gnu_ld" != yes && break
- ;;
- esac
- fi
- done
- IFS="$lt_save_ifs"
-else
- lt_cv_path_LD="$LD" # Let the user override the test with a path.
-fi
-fi
-
-LD="$lt_cv_path_LD"
-if test -n "$LD"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LD" >&5
-$as_echo "$LD" >&6; }
-else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-test -z "$LD" && as_fn_error $? "no acceptable ld found in \$PATH" "$LINENO" 5
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5
-$as_echo_n "checking if the linker ($LD) is GNU ld... " >&6; }
-if ${lt_cv_prog_gnu_ld+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- # I'd rather use --version here, but apparently some GNU lds only accept -v.
-case `$LD -v 2>&1 </dev/null` in
-*GNU* | *'with BFD'*)
- lt_cv_prog_gnu_ld=yes
- ;;
-*)
- lt_cv_prog_gnu_ld=no
- ;;
-esac
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_gnu_ld" >&5
-$as_echo "$lt_cv_prog_gnu_ld" >&6; }
-with_gnu_ld=$lt_cv_prog_gnu_ld
-
-
-
-
-
-
-
-
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for BSD- or MS-compatible name lister (nm)" >&5
-$as_echo_n "checking for BSD- or MS-compatible name lister (nm)... " >&6; }
-if ${lt_cv_path_NM+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- if test -n "$NM"; then
- # Let the user override the test.
- lt_cv_path_NM="$NM"
-else
- lt_nm_to_check="${ac_tool_prefix}nm"
- if test -n "$ac_tool_prefix" && test "$build" = "$host"; then
- lt_nm_to_check="$lt_nm_to_check nm"
- fi
- for lt_tmp_nm in $lt_nm_to_check; do
- lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
- for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do
- IFS="$lt_save_ifs"
- test -z "$ac_dir" && ac_dir=.
- tmp_nm="$ac_dir/$lt_tmp_nm"
- if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext" ; then
- # Check to see if the nm accepts a BSD-compat flag.
- # Adding the `sed 1q' prevents false positives on HP-UX, which says:
- # nm: unknown option "B" ignored
- # Tru64's nm complains that /dev/null is an invalid object file
- case `"$tmp_nm" -B /dev/null 2>&1 | sed '1q'` in
- */dev/null* | *'Invalid file or object type'*)
- lt_cv_path_NM="$tmp_nm -B"
- break
- ;;
- *)
- case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in
- */dev/null*)
- lt_cv_path_NM="$tmp_nm -p"
- break
- ;;
- *)
- lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but
- continue # so that we can try to find one that supports BSD flags
- ;;
- esac
- ;;
- esac
- fi
- done
- IFS="$lt_save_ifs"
- done
- : ${lt_cv_path_NM=no}
-fi
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_NM" >&5
-$as_echo "$lt_cv_path_NM" >&6; }
-if test "$lt_cv_path_NM" != "no"; then
- NM="$lt_cv_path_NM"
-else
- # Didn't find any BSD compatible name lister, look for dumpbin.
- if test -n "$DUMPBIN"; then :
- # Let the user override the test.
- else
- if test -n "$ac_tool_prefix"; then
- for ac_prog in dumpbin "link -dump"
- do
- # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
-set dummy $ac_tool_prefix$ac_prog; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_DUMPBIN+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- if test -n "$DUMPBIN"; then
- ac_cv_prog_DUMPBIN="$DUMPBIN" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
- IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
- for ac_exec_ext in '' $ac_executable_extensions; do
- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
- ac_cv_prog_DUMPBIN="$ac_tool_prefix$ac_prog"
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
- break 2
- fi
-done
- done
-IFS=$as_save_IFS
-
-fi
-fi
-DUMPBIN=$ac_cv_prog_DUMPBIN
-if test -n "$DUMPBIN"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DUMPBIN" >&5
-$as_echo "$DUMPBIN" >&6; }
-else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
- test -n "$DUMPBIN" && break
- done
-fi
-if test -z "$DUMPBIN"; then
- ac_ct_DUMPBIN=$DUMPBIN
- for ac_prog in dumpbin "link -dump"
-do
- # Extract the first word of "$ac_prog", so it can be a program name with args.
-set dummy $ac_prog; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_ac_ct_DUMPBIN+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- if test -n "$ac_ct_DUMPBIN"; then
- ac_cv_prog_ac_ct_DUMPBIN="$ac_ct_DUMPBIN" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
- IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
- for ac_exec_ext in '' $ac_executable_extensions; do
- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
- ac_cv_prog_ac_ct_DUMPBIN="$ac_prog"
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
- break 2
- fi
-done
- done
-IFS=$as_save_IFS
-
-fi
-fi
-ac_ct_DUMPBIN=$ac_cv_prog_ac_ct_DUMPBIN
-if test -n "$ac_ct_DUMPBIN"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DUMPBIN" >&5
-$as_echo "$ac_ct_DUMPBIN" >&6; }
-else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
- test -n "$ac_ct_DUMPBIN" && break
-done
-
- if test "x$ac_ct_DUMPBIN" = x; then
- DUMPBIN=":"
- else
- case $cross_compiling:$ac_tool_warned in
-yes:)
-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
-ac_tool_warned=yes ;;
-esac
- DUMPBIN=$ac_ct_DUMPBIN
- fi
-fi
-
- case `$DUMPBIN -symbols /dev/null 2>&1 | sed '1q'` in
- *COFF*)
- DUMPBIN="$DUMPBIN -symbols"
- ;;
- *)
- DUMPBIN=:
- ;;
- esac
- fi
-
- if test "$DUMPBIN" != ":"; then
- NM="$DUMPBIN"
- fi
-fi
-test -z "$NM" && NM=nm
-
-
-
-
-
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking the name lister ($NM) interface" >&5
-$as_echo_n "checking the name lister ($NM) interface... " >&6; }
-if ${lt_cv_nm_interface+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- lt_cv_nm_interface="BSD nm"
- echo "int some_variable = 0;" > conftest.$ac_ext
- (eval echo "\"\$as_me:$LINENO: $ac_compile\"" >&5)
- (eval "$ac_compile" 2>conftest.err)
- cat conftest.err >&5
- (eval echo "\"\$as_me:$LINENO: $NM \\\"conftest.$ac_objext\\\"\"" >&5)
- (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out)
- cat conftest.err >&5
- (eval echo "\"\$as_me:$LINENO: output\"" >&5)
- cat conftest.out >&5
- if $GREP 'External.*some_variable' conftest.out > /dev/null; then
- lt_cv_nm_interface="MS dumpbin"
- fi
- rm -f conftest*
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_nm_interface" >&5
-$as_echo "$lt_cv_nm_interface" >&6; }
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ln -s works" >&5
-$as_echo_n "checking whether ln -s works... " >&6; }
-LN_S=$as_ln_s
-if test "$LN_S" = "ln -s"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
-else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no, using $LN_S" >&5
-$as_echo "no, using $LN_S" >&6; }
-fi
-
-# find the maximum length of command line arguments
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking the maximum length of command line arguments" >&5
-$as_echo_n "checking the maximum length of command line arguments... " >&6; }
-if ${lt_cv_sys_max_cmd_len+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- i=0
- teststring="ABCD"
-
- case $build_os in
- msdosdjgpp*)
- # On DJGPP, this test can blow up pretty badly due to problems in libc
- # (any single argument exceeding 2000 bytes causes a buffer overrun
- # during glob expansion). Even if it were fixed, the result of this
- # check would be larger than it should be.
- lt_cv_sys_max_cmd_len=12288; # 12K is about right
- ;;
-
- gnu*)
- # Under GNU Hurd, this test is not required because there is
- # no limit to the length of command line arguments.
- # Libtool will interpret -1 as no limit whatsoever
- lt_cv_sys_max_cmd_len=-1;
- ;;
-
- cygwin* | mingw* | cegcc*)
- # On Win9x/ME, this test blows up -- it succeeds, but takes
- # about 5 minutes as the teststring grows exponentially.
- # Worse, since 9x/ME are not pre-emptively multitasking,
- # you end up with a "frozen" computer, even though with patience
- # the test eventually succeeds (with a max line length of 256k).
- # Instead, let's just punt: use the minimum linelength reported by
- # all of the supported platforms: 8192 (on NT/2K/XP).
- lt_cv_sys_max_cmd_len=8192;
- ;;
-
- mint*)
- # On MiNT this can take a long time and run out of memory.
- lt_cv_sys_max_cmd_len=8192;
- ;;
-
- amigaos*)
- # On AmigaOS with pdksh, this test takes hours, literally.
- # So we just punt and use a minimum line length of 8192.
- lt_cv_sys_max_cmd_len=8192;
- ;;
-
- netbsd* | freebsd* | openbsd* | darwin* | dragonfly*)
- # This has been around since 386BSD, at least. Likely further.
- if test -x /sbin/sysctl; then
- lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax`
- elif test -x /usr/sbin/sysctl; then
- lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax`
- else
- lt_cv_sys_max_cmd_len=65536 # usable default for all BSDs
- fi
- # And add a safety zone
- lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4`
- lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3`
- ;;
-
- interix*)
- # We know the value 262144 and hardcode it with a safety zone (like BSD)
- lt_cv_sys_max_cmd_len=196608
- ;;
-
- os2*)
- # The test takes a long time on OS/2.
- lt_cv_sys_max_cmd_len=8192
- ;;
-
- osf*)
- # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure
- # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not
- # nice to cause kernel panics so lets avoid the loop below.
- # First set a reasonable default.
- lt_cv_sys_max_cmd_len=16384
- #
- if test -x /sbin/sysconfig; then
- case `/sbin/sysconfig -q proc exec_disable_arg_limit` in
- *1*) lt_cv_sys_max_cmd_len=-1 ;;
- esac
- fi
- ;;
- sco3.2v5*)
- lt_cv_sys_max_cmd_len=102400
- ;;
- sysv5* | sco5v6* | sysv4.2uw2*)
- kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null`
- if test -n "$kargmax"; then
- lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[ ]//'`
- else
- lt_cv_sys_max_cmd_len=32768
- fi
- ;;
- *)
- lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null`
- if test -n "$lt_cv_sys_max_cmd_len"; then
- lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4`
- lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3`
- else
- # Make teststring a little bigger before we do anything with it.
- # a 1K string should be a reasonable start.
- for i in 1 2 3 4 5 6 7 8 ; do
- teststring=$teststring$teststring
- done
- SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}}
- # If test is not a shell built-in, we'll probably end up computing a
- # maximum length that is only half of the actual maximum length, but
- # we can't tell.
- while { test "X"`env echo "$teststring$teststring" 2>/dev/null` \
- = "X$teststring$teststring"; } >/dev/null 2>&1 &&
- test $i != 17 # 1/2 MB should be enough
- do
- i=`expr $i + 1`
- teststring=$teststring$teststring
- done
- # Only check the string length outside the loop.
- lt_cv_sys_max_cmd_len=`expr "X$teststring" : ".*" 2>&1`
- teststring=
- # Add a significant safety factor because C++ compilers can tack on
- # massive amounts of additional arguments before passing them to the
- # linker. It appears as though 1/2 is a usable value.
- lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2`
- fi
- ;;
- esac
-
-fi
-
-if test -n $lt_cv_sys_max_cmd_len ; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sys_max_cmd_len" >&5
-$as_echo "$lt_cv_sys_max_cmd_len" >&6; }
-else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: none" >&5
-$as_echo "none" >&6; }
-fi
-max_cmd_len=$lt_cv_sys_max_cmd_len
-
-
-
-
-
-
-: ${CP="cp -f"}
-: ${MV="mv -f"}
-: ${RM="rm -f"}
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the shell understands some XSI constructs" >&5
-$as_echo_n "checking whether the shell understands some XSI constructs... " >&6; }
-# Try some XSI features
-xsi_shell=no
-( _lt_dummy="a/b/c"
- test "${_lt_dummy##*/},${_lt_dummy%/*},${_lt_dummy#??}"${_lt_dummy%"$_lt_dummy"}, \
- = c,a/b,b/c, \
- && eval 'test $(( 1 + 1 )) -eq 2 \
- && test "${#_lt_dummy}" -eq 5' ) >/dev/null 2>&1 \
- && xsi_shell=yes
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $xsi_shell" >&5
-$as_echo "$xsi_shell" >&6; }
-
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the shell understands \"+=\"" >&5
-$as_echo_n "checking whether the shell understands \"+=\"... " >&6; }
-lt_shell_append=no
-( foo=bar; set foo baz; eval "$1+=\$2" && test "$foo" = barbaz ) \
- >/dev/null 2>&1 \
- && lt_shell_append=yes
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_shell_append" >&5
-$as_echo "$lt_shell_append" >&6; }
-
-
-if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then
- lt_unset=unset
-else
- lt_unset=false
-fi
-
-
-
-
-
-# test EBCDIC or ASCII
-case `echo X|tr X '\101'` in
- A) # ASCII based system
- # \n is not interpreted correctly by Solaris 8 /usr/ucb/tr
- lt_SP2NL='tr \040 \012'
- lt_NL2SP='tr \015\012 \040\040'
- ;;
- *) # EBCDIC based system
- lt_SP2NL='tr \100 \n'
- lt_NL2SP='tr \r\n \100\100'
- ;;
-esac
-
-
-
-
-
-
-
-
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to convert $build file names to $host format" >&5
-$as_echo_n "checking how to convert $build file names to $host format... " >&6; }
-if ${lt_cv_to_host_file_cmd+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- case $host in
- *-*-mingw* )
- case $build in
- *-*-mingw* ) # actually msys
- lt_cv_to_host_file_cmd=func_convert_file_msys_to_w32
- ;;
- *-*-cygwin* )
- lt_cv_to_host_file_cmd=func_convert_file_cygwin_to_w32
- ;;
- * ) # otherwise, assume *nix
- lt_cv_to_host_file_cmd=func_convert_file_nix_to_w32
- ;;
- esac
- ;;
- *-*-cygwin* )
- case $build in
- *-*-mingw* ) # actually msys
- lt_cv_to_host_file_cmd=func_convert_file_msys_to_cygwin
- ;;
- *-*-cygwin* )
- lt_cv_to_host_file_cmd=func_convert_file_noop
- ;;
- * ) # otherwise, assume *nix
- lt_cv_to_host_file_cmd=func_convert_file_nix_to_cygwin
- ;;
- esac
- ;;
- * ) # unhandled hosts (and "normal" native builds)
- lt_cv_to_host_file_cmd=func_convert_file_noop
- ;;
-esac
-
-fi
-
-to_host_file_cmd=$lt_cv_to_host_file_cmd
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_to_host_file_cmd" >&5
-$as_echo "$lt_cv_to_host_file_cmd" >&6; }
-
-
-
-
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to convert $build file names to toolchain format" >&5
-$as_echo_n "checking how to convert $build file names to toolchain format... " >&6; }
-if ${lt_cv_to_tool_file_cmd+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- #assume ordinary cross tools, or native build.
-lt_cv_to_tool_file_cmd=func_convert_file_noop
-case $host in
- *-*-mingw* )
- case $build in
- *-*-mingw* ) # actually msys
- lt_cv_to_tool_file_cmd=func_convert_file_msys_to_w32
- ;;
- esac
- ;;
-esac
-
-fi
-
-to_tool_file_cmd=$lt_cv_to_tool_file_cmd
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_to_tool_file_cmd" >&5
-$as_echo "$lt_cv_to_tool_file_cmd" >&6; }
-
-
-
-
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $LD option to reload object files" >&5
-$as_echo_n "checking for $LD option to reload object files... " >&6; }
-if ${lt_cv_ld_reload_flag+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- lt_cv_ld_reload_flag='-r'
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_reload_flag" >&5
-$as_echo "$lt_cv_ld_reload_flag" >&6; }
-reload_flag=$lt_cv_ld_reload_flag
-case $reload_flag in
-"" | " "*) ;;
-*) reload_flag=" $reload_flag" ;;
-esac
-reload_cmds='$LD$reload_flag -o $output$reload_objs'
-case $host_os in
- cygwin* | mingw* | pw32* | cegcc*)
- if test "$GCC" != yes; then
- reload_cmds=false
- fi
- ;;
- darwin*)
- if test "$GCC" = yes; then
- reload_cmds='$LTCC $LTCFLAGS -nostdlib ${wl}-r -o $output$reload_objs'
- else
- reload_cmds='$LD$reload_flag -o $output$reload_objs'
- fi
- ;;
-esac
-
-
-
-
-
-
-
-
-
-if test -n "$ac_tool_prefix"; then
- # Extract the first word of "${ac_tool_prefix}objdump", so it can be a program name with args.
-set dummy ${ac_tool_prefix}objdump; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_OBJDUMP+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- if test -n "$OBJDUMP"; then
- ac_cv_prog_OBJDUMP="$OBJDUMP" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
- IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
- for ac_exec_ext in '' $ac_executable_extensions; do
- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
- ac_cv_prog_OBJDUMP="${ac_tool_prefix}objdump"
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
- break 2
- fi
-done
- done
-IFS=$as_save_IFS
-
-fi
-fi
-OBJDUMP=$ac_cv_prog_OBJDUMP
-if test -n "$OBJDUMP"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OBJDUMP" >&5
-$as_echo "$OBJDUMP" >&6; }
-else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-fi
-if test -z "$ac_cv_prog_OBJDUMP"; then
- ac_ct_OBJDUMP=$OBJDUMP
- # Extract the first word of "objdump", so it can be a program name with args.
-set dummy objdump; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_ac_ct_OBJDUMP+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- if test -n "$ac_ct_OBJDUMP"; then
- ac_cv_prog_ac_ct_OBJDUMP="$ac_ct_OBJDUMP" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
- IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
- for ac_exec_ext in '' $ac_executable_extensions; do
- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
- ac_cv_prog_ac_ct_OBJDUMP="objdump"
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
- break 2
- fi
-done
- done
-IFS=$as_save_IFS
-
-fi
-fi
-ac_ct_OBJDUMP=$ac_cv_prog_ac_ct_OBJDUMP
-if test -n "$ac_ct_OBJDUMP"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OBJDUMP" >&5
-$as_echo "$ac_ct_OBJDUMP" >&6; }
-else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
- if test "x$ac_ct_OBJDUMP" = x; then
- OBJDUMP="false"
- else
- case $cross_compiling:$ac_tool_warned in
-yes:)
-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
-ac_tool_warned=yes ;;
-esac
- OBJDUMP=$ac_ct_OBJDUMP
- fi
-else
- OBJDUMP="$ac_cv_prog_OBJDUMP"
-fi
-
-test -z "$OBJDUMP" && OBJDUMP=objdump
-
-
-
-
-
-
-
-
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to recognize dependent libraries" >&5
-$as_echo_n "checking how to recognize dependent libraries... " >&6; }
-if ${lt_cv_deplibs_check_method+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- lt_cv_file_magic_cmd='$MAGIC_CMD'
-lt_cv_file_magic_test_file=
-lt_cv_deplibs_check_method='unknown'
-# Need to set the preceding variable on all platforms that support
-# interlibrary dependencies.
-# 'none' -- dependencies not supported.
-# `unknown' -- same as none, but documents that we really don't know.
-# 'pass_all' -- all dependencies passed with no checks.
-# 'test_compile' -- check by making test program.
-# 'file_magic [[regex]]' -- check by looking for files in library path
-# which responds to the $file_magic_cmd with a given extended regex.
-# If you have `file' or equivalent on your system and you're not sure
-# whether `pass_all' will *always* work, you probably want this one.
-
-case $host_os in
-aix[4-9]*)
- lt_cv_deplibs_check_method=pass_all
- ;;
-
-beos*)
- lt_cv_deplibs_check_method=pass_all
- ;;
-
-bsdi[45]*)
- lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib)'
- lt_cv_file_magic_cmd='/usr/bin/file -L'
- lt_cv_file_magic_test_file=/shlib/libc.so
- ;;
-
-cygwin*)
- # func_win32_libid is a shell function defined in ltmain.sh
- lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL'
- lt_cv_file_magic_cmd='func_win32_libid'
- ;;
-
-mingw* | pw32*)
- # Base MSYS/MinGW do not provide the 'file' command needed by
- # func_win32_libid shell function, so use a weaker test based on 'objdump',
- # unless we find 'file', for example because we are cross-compiling.
- # func_win32_libid assumes BSD nm, so disallow it if using MS dumpbin.
- if ( test "$lt_cv_nm_interface" = "BSD nm" && file / ) >/dev/null 2>&1; then
- lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL'
- lt_cv_file_magic_cmd='func_win32_libid'
- else
- # Keep this pattern in sync with the one in func_win32_libid.
- lt_cv_deplibs_check_method='file_magic file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)'
- lt_cv_file_magic_cmd='$OBJDUMP -f'
- fi
- ;;
-
-cegcc*)
- # use the weaker test based on 'objdump'. See mingw*.
- lt_cv_deplibs_check_method='file_magic file format pe-arm-.*little(.*architecture: arm)?'
- lt_cv_file_magic_cmd='$OBJDUMP -f'
- ;;
-
-darwin* | rhapsody*)
- lt_cv_deplibs_check_method=pass_all
- ;;
-
-freebsd* | dragonfly*)
- if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then
- case $host_cpu in
- i*86 )
- # Not sure whether the presence of OpenBSD here was a mistake.
- # Let's accept both of them until this is cleared up.
- lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[3-9]86 (compact )?demand paged shared library'
- lt_cv_file_magic_cmd=/usr/bin/file
- lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*`
- ;;
- esac
- else
- lt_cv_deplibs_check_method=pass_all
- fi
- ;;
-
-gnu*)
- lt_cv_deplibs_check_method=pass_all
- ;;
-
-haiku*)
- lt_cv_deplibs_check_method=pass_all
- ;;
-
-hpux10.20* | hpux11*)
- lt_cv_file_magic_cmd=/usr/bin/file
- case $host_cpu in
- ia64*)
- lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - IA64'
- lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so
- ;;
- hppa*64*)
- lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF[ -][0-9][0-9])(-bit)?( [LM]SB)? shared object( file)?[, -]* PA-RISC [0-9]\.[0-9]'
- lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl
- ;;
- *)
- lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|PA-RISC[0-9]\.[0-9]) shared library'
- lt_cv_file_magic_test_file=/usr/lib/libc.sl
- ;;
- esac
- ;;
-
-interix[3-9]*)
- # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here
- lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|\.a)$'
- ;;
-
-irix5* | irix6* | nonstopux*)
- case $LD in
- *-32|*"-32 ") libmagic=32-bit;;
- *-n32|*"-n32 ") libmagic=N32;;
- *-64|*"-64 ") libmagic=64-bit;;
- *) libmagic=never-match;;
- esac
- lt_cv_deplibs_check_method=pass_all
- ;;
-
-# This must be glibc/ELF.
-linux* | k*bsd*-gnu | kopensolaris*-gnu)
- lt_cv_deplibs_check_method=pass_all
- ;;
-
-netbsd*)
- if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then
- lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$'
- else
- lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|_pic\.a)$'
- fi
- ;;
-
-newos6*)
- lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (executable|dynamic lib)'
- lt_cv_file_magic_cmd=/usr/bin/file
- lt_cv_file_magic_test_file=/usr/lib/libnls.so
- ;;
-
-*nto* | *qnx*)
- lt_cv_deplibs_check_method=pass_all
- ;;
-
-openbsd*)
- if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
- lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|\.so|_pic\.a)$'
- else
- lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$'
- fi
- ;;
-
-osf3* | osf4* | osf5*)
- lt_cv_deplibs_check_method=pass_all
- ;;
-
-rdos*)
- lt_cv_deplibs_check_method=pass_all
- ;;
-
-solaris*)
- lt_cv_deplibs_check_method=pass_all
- ;;
-
-sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
- lt_cv_deplibs_check_method=pass_all
- ;;
-
-sysv4 | sysv4.3*)
- case $host_vendor in
- motorola)
- lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib) M[0-9][0-9]* Version [0-9]'
- lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*`
- ;;
- ncr)
- lt_cv_deplibs_check_method=pass_all
- ;;
- sequent)
- lt_cv_file_magic_cmd='/bin/file'
- lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [LM]SB (shared object|dynamic lib )'
- ;;
- sni)
- lt_cv_file_magic_cmd='/bin/file'
- lt_cv_deplibs_check_method="file_magic ELF [0-9][0-9]*-bit [LM]SB dynamic lib"
- lt_cv_file_magic_test_file=/lib/libc.so
- ;;
- siemens)
- lt_cv_deplibs_check_method=pass_all
- ;;
- pc)
- lt_cv_deplibs_check_method=pass_all
- ;;
- esac
- ;;
-
-tpf*)
- lt_cv_deplibs_check_method=pass_all
- ;;
-esac
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_deplibs_check_method" >&5
-$as_echo "$lt_cv_deplibs_check_method" >&6; }
-
-file_magic_glob=
-want_nocaseglob=no
-if test "$build" = "$host"; then
- case $host_os in
- mingw* | pw32*)
- if ( shopt | grep nocaseglob ) >/dev/null 2>&1; then
- want_nocaseglob=yes
- else
- file_magic_glob=`echo aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ | $SED -e "s/\(..\)/s\/[\1]\/[\1]\/g;/g"`
- fi
- ;;
- esac
-fi
-
-file_magic_cmd=$lt_cv_file_magic_cmd
-deplibs_check_method=$lt_cv_deplibs_check_method
-test -z "$deplibs_check_method" && deplibs_check_method=unknown
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-if test -n "$ac_tool_prefix"; then
- # Extract the first word of "${ac_tool_prefix}dlltool", so it can be a program name with args.
-set dummy ${ac_tool_prefix}dlltool; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_DLLTOOL+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- if test -n "$DLLTOOL"; then
- ac_cv_prog_DLLTOOL="$DLLTOOL" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
- IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
- for ac_exec_ext in '' $ac_executable_extensions; do
- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
- ac_cv_prog_DLLTOOL="${ac_tool_prefix}dlltool"
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
- break 2
- fi
-done
- done
-IFS=$as_save_IFS
-
-fi
-fi
-DLLTOOL=$ac_cv_prog_DLLTOOL
-if test -n "$DLLTOOL"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DLLTOOL" >&5
-$as_echo "$DLLTOOL" >&6; }
-else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-fi
-if test -z "$ac_cv_prog_DLLTOOL"; then
- ac_ct_DLLTOOL=$DLLTOOL
- # Extract the first word of "dlltool", so it can be a program name with args.
-set dummy dlltool; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_ac_ct_DLLTOOL+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- if test -n "$ac_ct_DLLTOOL"; then
- ac_cv_prog_ac_ct_DLLTOOL="$ac_ct_DLLTOOL" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
- IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
- for ac_exec_ext in '' $ac_executable_extensions; do
- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
- ac_cv_prog_ac_ct_DLLTOOL="dlltool"
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
- break 2
- fi
-done
- done
-IFS=$as_save_IFS
-
-fi
-fi
-ac_ct_DLLTOOL=$ac_cv_prog_ac_ct_DLLTOOL
-if test -n "$ac_ct_DLLTOOL"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DLLTOOL" >&5
-$as_echo "$ac_ct_DLLTOOL" >&6; }
-else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
- if test "x$ac_ct_DLLTOOL" = x; then
- DLLTOOL="false"
- else
- case $cross_compiling:$ac_tool_warned in
-yes:)
-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
-ac_tool_warned=yes ;;
-esac
- DLLTOOL=$ac_ct_DLLTOOL
- fi
-else
- DLLTOOL="$ac_cv_prog_DLLTOOL"
-fi
-
-test -z "$DLLTOOL" && DLLTOOL=dlltool
-
-
-
-
-
-
-
-
-
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to associate runtime and link libraries" >&5
-$as_echo_n "checking how to associate runtime and link libraries... " >&6; }
-if ${lt_cv_sharedlib_from_linklib_cmd+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- lt_cv_sharedlib_from_linklib_cmd='unknown'
-
-case $host_os in
-cygwin* | mingw* | pw32* | cegcc*)
- # two different shell functions defined in ltmain.sh
- # decide which to use based on capabilities of $DLLTOOL
- case `$DLLTOOL --help 2>&1` in
- *--identify-strict*)
- lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib
- ;;
- *)
- lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib_fallback
- ;;
- esac
- ;;
-*)
- # fallback: assume linklib IS sharedlib
- lt_cv_sharedlib_from_linklib_cmd="$ECHO"
- ;;
-esac
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sharedlib_from_linklib_cmd" >&5
-$as_echo "$lt_cv_sharedlib_from_linklib_cmd" >&6; }
-sharedlib_from_linklib_cmd=$lt_cv_sharedlib_from_linklib_cmd
-test -z "$sharedlib_from_linklib_cmd" && sharedlib_from_linklib_cmd=$ECHO
-
-
-
-
-
-
-
-if test -n "$ac_tool_prefix"; then
- for ac_prog in ar
- do
- # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
-set dummy $ac_tool_prefix$ac_prog; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_AR+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- if test -n "$AR"; then
- ac_cv_prog_AR="$AR" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
- IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
- for ac_exec_ext in '' $ac_executable_extensions; do
- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
- ac_cv_prog_AR="$ac_tool_prefix$ac_prog"
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
- break 2
- fi
-done
- done
-IFS=$as_save_IFS
-
-fi
-fi
-AR=$ac_cv_prog_AR
-if test -n "$AR"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AR" >&5
-$as_echo "$AR" >&6; }
-else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
- test -n "$AR" && break
- done
-fi
-if test -z "$AR"; then
- ac_ct_AR=$AR
- for ac_prog in ar
-do
- # Extract the first word of "$ac_prog", so it can be a program name with args.
-set dummy $ac_prog; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_ac_ct_AR+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- if test -n "$ac_ct_AR"; then
- ac_cv_prog_ac_ct_AR="$ac_ct_AR" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
- IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
- for ac_exec_ext in '' $ac_executable_extensions; do
- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
- ac_cv_prog_ac_ct_AR="$ac_prog"
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
- break 2
- fi
-done
- done
-IFS=$as_save_IFS
-
-fi
-fi
-ac_ct_AR=$ac_cv_prog_ac_ct_AR
-if test -n "$ac_ct_AR"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_AR" >&5
-$as_echo "$ac_ct_AR" >&6; }
-else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
- test -n "$ac_ct_AR" && break
-done
-
- if test "x$ac_ct_AR" = x; then
- AR="false"
- else
- case $cross_compiling:$ac_tool_warned in
-yes:)
-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
-ac_tool_warned=yes ;;
-esac
- AR=$ac_ct_AR
- fi
-fi
-
-: ${AR=ar}
-: ${AR_FLAGS=cru}
-
-
-
-
-
-
-
-
-
-
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for archiver @FILE support" >&5
-$as_echo_n "checking for archiver @FILE support... " >&6; }
-if ${lt_cv_ar_at_file+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- lt_cv_ar_at_file=no
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-
-int
-main ()
-{
-
- ;
- return 0;
-}
-_ACEOF
-if ac_fn_cxx_try_compile "$LINENO"; then :
- echo conftest.$ac_objext > conftest.lst
- lt_ar_try='$AR $AR_FLAGS libconftest.a @conftest.lst >&5'
- { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$lt_ar_try\""; } >&5
- (eval $lt_ar_try) 2>&5
- ac_status=$?
- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
- test $ac_status = 0; }
- if test "$ac_status" -eq 0; then
- # Ensure the archiver fails upon bogus file names.
- rm -f conftest.$ac_objext libconftest.a
- { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$lt_ar_try\""; } >&5
- (eval $lt_ar_try) 2>&5
- ac_status=$?
- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
- test $ac_status = 0; }
- if test "$ac_status" -ne 0; then
- lt_cv_ar_at_file=@
- fi
- fi
- rm -f conftest.* libconftest.a
-
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ar_at_file" >&5
-$as_echo "$lt_cv_ar_at_file" >&6; }
-
-if test "x$lt_cv_ar_at_file" = xno; then
- archiver_list_spec=
-else
- archiver_list_spec=$lt_cv_ar_at_file
-fi
-
-
-
-
-
-
-
-if test -n "$ac_tool_prefix"; then
- # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args.
-set dummy ${ac_tool_prefix}strip; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_STRIP+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- if test -n "$STRIP"; then
- ac_cv_prog_STRIP="$STRIP" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
- IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
- for ac_exec_ext in '' $ac_executable_extensions; do
- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
- ac_cv_prog_STRIP="${ac_tool_prefix}strip"
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
- break 2
- fi
-done
- done
-IFS=$as_save_IFS
-
-fi
-fi
-STRIP=$ac_cv_prog_STRIP
-if test -n "$STRIP"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5
-$as_echo "$STRIP" >&6; }
-else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-fi
-if test -z "$ac_cv_prog_STRIP"; then
- ac_ct_STRIP=$STRIP
- # Extract the first word of "strip", so it can be a program name with args.
-set dummy strip; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_ac_ct_STRIP+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- if test -n "$ac_ct_STRIP"; then
- ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
- IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
- for ac_exec_ext in '' $ac_executable_extensions; do
- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
- ac_cv_prog_ac_ct_STRIP="strip"
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
- break 2
- fi
-done
- done
-IFS=$as_save_IFS
-
-fi
-fi
-ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP
-if test -n "$ac_ct_STRIP"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5
-$as_echo "$ac_ct_STRIP" >&6; }
-else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
- if test "x$ac_ct_STRIP" = x; then
- STRIP=":"
- else
- case $cross_compiling:$ac_tool_warned in
-yes:)
-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
-ac_tool_warned=yes ;;
-esac
- STRIP=$ac_ct_STRIP
- fi
-else
- STRIP="$ac_cv_prog_STRIP"
-fi
-
-test -z "$STRIP" && STRIP=:
-
-
-
-
-
-
-if test -n "$ac_tool_prefix"; then
- # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args.
-set dummy ${ac_tool_prefix}ranlib; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_RANLIB+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- if test -n "$RANLIB"; then
- ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
- IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
- for ac_exec_ext in '' $ac_executable_extensions; do
- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
- ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib"
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
- break 2
- fi
-done
- done
-IFS=$as_save_IFS
-
-fi
-fi
-RANLIB=$ac_cv_prog_RANLIB
-if test -n "$RANLIB"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5
-$as_echo "$RANLIB" >&6; }
-else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-fi
-if test -z "$ac_cv_prog_RANLIB"; then
- ac_ct_RANLIB=$RANLIB
- # Extract the first word of "ranlib", so it can be a program name with args.
-set dummy ranlib; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_ac_ct_RANLIB+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- if test -n "$ac_ct_RANLIB"; then
- ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
- IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
- for ac_exec_ext in '' $ac_executable_extensions; do
- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
- ac_cv_prog_ac_ct_RANLIB="ranlib"
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
- break 2
- fi
-done
- done
-IFS=$as_save_IFS
-
-fi
-fi
-ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB
-if test -n "$ac_ct_RANLIB"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5
-$as_echo "$ac_ct_RANLIB" >&6; }
-else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
- if test "x$ac_ct_RANLIB" = x; then
- RANLIB=":"
- else
- case $cross_compiling:$ac_tool_warned in
-yes:)
-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
-ac_tool_warned=yes ;;
-esac
- RANLIB=$ac_ct_RANLIB
- fi
-else
- RANLIB="$ac_cv_prog_RANLIB"
-fi
-
-test -z "$RANLIB" && RANLIB=:
-
-
-
-
-
-
-# Determine commands to create old-style static archives.
-old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs'
-old_postinstall_cmds='chmod 644 $oldlib'
-old_postuninstall_cmds=
-
-if test -n "$RANLIB"; then
- case $host_os in
- openbsd*)
- old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$tool_oldlib"
- ;;
- *)
- old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$tool_oldlib"
- ;;
- esac
- old_archive_cmds="$old_archive_cmds~\$RANLIB \$tool_oldlib"
-fi
-
-case $host_os in
- darwin*)
- lock_old_archive_extraction=yes ;;
- *)
- lock_old_archive_extraction=no ;;
-esac
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-# If no C compiler was specified, use CC.
-LTCC=${LTCC-"$CC"}
-
-# If no C compiler flags were specified, use CFLAGS.
-LTCFLAGS=${LTCFLAGS-"$CFLAGS"}
-
-# Allow CC to be a program name with arguments.
-compiler=$CC
-
-
-# Check for command to grab the raw symbol name followed by C symbol from nm.
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking command to parse $NM output from $compiler object" >&5
-$as_echo_n "checking command to parse $NM output from $compiler object... " >&6; }
-if ${lt_cv_sys_global_symbol_pipe+:} false; then :
- $as_echo_n "(cached) " >&6
-else
-
-# These are sane defaults that work on at least a few old systems.
-# [They come from Ultrix. What could be older than Ultrix?!! ;)]
-
-# Character class describing NM global symbol codes.
-symcode='[BCDEGRST]'
-
-# Regexp to match symbols that can be accessed directly from C.
-sympat='\([_A-Za-z][_A-Za-z0-9]*\)'
-
-# Define system-specific variables.
-case $host_os in
-aix*)
- symcode='[BCDT]'
- ;;
-cygwin* | mingw* | pw32* | cegcc*)
- symcode='[ABCDGISTW]'
- ;;
-hpux*)
- if test "$host_cpu" = ia64; then
- symcode='[ABCDEGRST]'
- fi
- ;;
-irix* | nonstopux*)
- symcode='[BCDEGRST]'
- ;;
-osf*)
- symcode='[BCDEGQRST]'
- ;;
-solaris*)
- symcode='[BDRT]'
- ;;
-sco3.2v5*)
- symcode='[DT]'
- ;;
-sysv4.2uw2*)
- symcode='[DT]'
- ;;
-sysv5* | sco5v6* | unixware* | OpenUNIX*)
- symcode='[ABDT]'
- ;;
-sysv4)
- symcode='[DFNSTU]'
- ;;
-esac
-
-# If we're using GNU nm, then use its standard symbol codes.
-case `$NM -V 2>&1` in
-*GNU* | *'with BFD'*)
- symcode='[ABCDGIRSTW]' ;;
-esac
-
-# Transform an extracted symbol line into a proper C declaration.
-# Some systems (esp. on ia64) link data and code symbols differently,
-# so use this general approach.
-lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'"
-
-# Transform an extracted symbol line into symbol name and symbol address
-lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([^ ]*\)[ ]*$/ {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([^ ]*\) \([^ ]*\)$/ {\"\2\", (void *) \&\2},/p'"
-lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="sed -n -e 's/^: \([^ ]*\)[ ]*$/ {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([^ ]*\) \(lib[^ ]*\)$/ {\"\2\", (void *) \&\2},/p' -e 's/^$symcode* \([^ ]*\) \([^ ]*\)$/ {\"lib\2\", (void *) \&\2},/p'"
-
-# Handle CRLF in mingw tool chain
-opt_cr=
-case $build_os in
-mingw*)
- opt_cr=`$ECHO 'x\{0,1\}' | tr x '\015'` # option cr in regexp
- ;;
-esac
-
-# Try without a prefix underscore, then with it.
-for ac_symprfx in "" "_"; do
-
- # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol.
- symxfrm="\\1 $ac_symprfx\\2 \\2"
-
- # Write the raw and C identifiers.
- if test "$lt_cv_nm_interface" = "MS dumpbin"; then
- # Fake it for dumpbin and say T for any non-static function
- # and D for any global variable.
- # Also find C++ and __fastcall symbols from MSVC++,
- # which start with @ or ?.
- lt_cv_sys_global_symbol_pipe="$AWK '"\
-" {last_section=section; section=\$ 3};"\
-" /^COFF SYMBOL TABLE/{for(i in hide) delete hide[i]};"\
-" /Section length .*#relocs.*(pick any)/{hide[last_section]=1};"\
-" \$ 0!~/External *\|/{next};"\
-" / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\
-" {if(hide[section]) next};"\
-" {f=0}; \$ 0~/\(\).*\|/{f=1}; {printf f ? \"T \" : \"D \"};"\
-" {split(\$ 0, a, /\||\r/); split(a[2], s)};"\
-" s[1]~/^[@?]/{print s[1], s[1]; next};"\
-" s[1]~prfx {split(s[1],t,\"@\"); print t[1], substr(t[1],length(prfx))}"\
-" ' prfx=^$ac_symprfx"
- else
- lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[ ]\($symcode$symcode*\)[ ][ ]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'"
- fi
- lt_cv_sys_global_symbol_pipe="$lt_cv_sys_global_symbol_pipe | sed '/ __gnu_lto/d'"
-
- # Check to see that the pipe works correctly.
- pipe_works=no
-
- rm -f conftest*
- cat > conftest.$ac_ext <<_LT_EOF
-#ifdef __cplusplus
-extern "C" {
-#endif
-char nm_test_var;
-void nm_test_func(void);
-void nm_test_func(void){}
-#ifdef __cplusplus
-}
-#endif
-int main(){nm_test_var='a';nm_test_func();return(0);}
-_LT_EOF
-
- if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
- (eval $ac_compile) 2>&5
- ac_status=$?
- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
- test $ac_status = 0; }; then
- # Now try to grab the symbols.
- nlist=conftest.nm
- if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist\""; } >&5
- (eval $NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist) 2>&5
- ac_status=$?
- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
- test $ac_status = 0; } && test -s "$nlist"; then
- # Try sorting and uniquifying the output.
- if sort "$nlist" | uniq > "$nlist"T; then
- mv -f "$nlist"T "$nlist"
- else
- rm -f "$nlist"T
- fi
-
- # Make sure that we snagged all the symbols we need.
- if $GREP ' nm_test_var$' "$nlist" >/dev/null; then
- if $GREP ' nm_test_func$' "$nlist" >/dev/null; then
- cat <<_LT_EOF > conftest.$ac_ext
-/* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests. */
-#if defined(_WIN32) || defined(__CYGWIN__) || defined(_WIN32_WCE)
-/* DATA imports from DLLs on WIN32 con't be const, because runtime
- relocations are performed -- see ld's documentation on pseudo-relocs. */
-# define LT_DLSYM_CONST
-#elif defined(__osf__)
-/* This system does not cope well with relocations in const data. */
-# define LT_DLSYM_CONST
-#else
-# define LT_DLSYM_CONST const
-#endif
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-_LT_EOF
- # Now generate the symbol file.
- eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | $GREP -v main >> conftest.$ac_ext'
-
- cat <<_LT_EOF >> conftest.$ac_ext
-
-/* The mapping between symbol names and symbols. */
-LT_DLSYM_CONST struct {
- const char *name;
- void *address;
-}
-lt__PROGRAM__LTX_preloaded_symbols[] =
-{
- { "@PROGRAM@", (void *) 0 },
-_LT_EOF
- $SED "s/^$symcode$symcode* \(.*\) \(.*\)$/ {\"\2\", (void *) \&\2},/" < "$nlist" | $GREP -v main >> conftest.$ac_ext
- cat <<\_LT_EOF >> conftest.$ac_ext
- {0, (void *) 0}
-};
-
-/* This works around a problem in FreeBSD linker */
-#ifdef FREEBSD_WORKAROUND
-static const void *lt_preloaded_setup() {
- return lt__PROGRAM__LTX_preloaded_symbols;
-}
-#endif
-
-#ifdef __cplusplus
-}
-#endif
-_LT_EOF
- # Now try linking the two files.
- mv conftest.$ac_objext conftstm.$ac_objext
- lt_globsym_save_LIBS=$LIBS
- lt_globsym_save_CFLAGS=$CFLAGS
- LIBS="conftstm.$ac_objext"
- CFLAGS="$CFLAGS$lt_prog_compiler_no_builtin_flag"
- if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5
- (eval $ac_link) 2>&5
- ac_status=$?
- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
- test $ac_status = 0; } && test -s conftest${ac_exeext}; then
- pipe_works=yes
- fi
- LIBS=$lt_globsym_save_LIBS
- CFLAGS=$lt_globsym_save_CFLAGS
- else
- echo "cannot find nm_test_func in $nlist" >&5
- fi
- else
- echo "cannot find nm_test_var in $nlist" >&5
- fi
- else
- echo "cannot run $lt_cv_sys_global_symbol_pipe" >&5
- fi
- else
- echo "$progname: failed program was:" >&5
- cat conftest.$ac_ext >&5
- fi
- rm -rf conftest* conftst*
-
- # Do not use the global_symbol_pipe unless it works.
- if test "$pipe_works" = yes; then
- break
- else
- lt_cv_sys_global_symbol_pipe=
- fi
-done
-
-fi
-
-if test -z "$lt_cv_sys_global_symbol_pipe"; then
- lt_cv_sys_global_symbol_to_cdecl=
-fi
-if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: failed" >&5
-$as_echo "failed" >&6; }
-else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: ok" >&5
-$as_echo "ok" >&6; }
-fi
-
-# Response file support.
-if test "$lt_cv_nm_interface" = "MS dumpbin"; then
- nm_file_list_spec='@'
-elif $NM --help 2>/dev/null | grep '[@]FILE' >/dev/null; then
- nm_file_list_spec='@'
-fi
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for sysroot" >&5
-$as_echo_n "checking for sysroot... " >&6; }
-
-# Check whether --with-sysroot was given.
-if test "${with_sysroot+set}" = set; then :
- withval=$with_sysroot;
-else
- with_sysroot=no
-fi
-
-
-lt_sysroot=
-case ${with_sysroot} in #(
- yes)
- if test "$GCC" = yes; then
- lt_sysroot=`$CC --print-sysroot 2>/dev/null`
- fi
- ;; #(
- /*)
- lt_sysroot=`echo "$with_sysroot" | sed -e "$sed_quote_subst"`
- ;; #(
- no|'')
- ;; #(
- *)
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${with_sysroot}" >&5
-$as_echo "${with_sysroot}" >&6; }
- as_fn_error $? "The sysroot must be an absolute path." "$LINENO" 5
- ;;
-esac
-
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${lt_sysroot:-no}" >&5
-$as_echo "${lt_sysroot:-no}" >&6; }
-
-
-
-
-
-
-# Check whether --enable-libtool-lock was given.
-if test "${enable_libtool_lock+set}" = set; then :
- enableval=$enable_libtool_lock;
-fi
-
-test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes
-
-# Some flags need to be propagated to the compiler or linker for good
-# libtool support.
-case $host in
-ia64-*-hpux*)
- # Find out which ABI we are using.
- echo 'int i;' > conftest.$ac_ext
- if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
- (eval $ac_compile) 2>&5
- ac_status=$?
- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
- test $ac_status = 0; }; then
- case `/usr/bin/file conftest.$ac_objext` in
- *ELF-32*)
- HPUX_IA64_MODE="32"
- ;;
- *ELF-64*)
- HPUX_IA64_MODE="64"
- ;;
- esac
- fi
- rm -rf conftest*
- ;;
-*-*-irix6*)
- # Find out which ABI we are using.
- echo '#line '$LINENO' "configure"' > conftest.$ac_ext
- if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
- (eval $ac_compile) 2>&5
- ac_status=$?
- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
- test $ac_status = 0; }; then
- if test "$lt_cv_prog_gnu_ld" = yes; then
- case `/usr/bin/file conftest.$ac_objext` in
- *32-bit*)
- LD="${LD-ld} -melf32bsmip"
- ;;
- *N32*)
- LD="${LD-ld} -melf32bmipn32"
- ;;
- *64-bit*)
- LD="${LD-ld} -melf64bmip"
- ;;
- esac
- else
- case `/usr/bin/file conftest.$ac_objext` in
- *32-bit*)
- LD="${LD-ld} -32"
- ;;
- *N32*)
- LD="${LD-ld} -n32"
- ;;
- *64-bit*)
- LD="${LD-ld} -64"
- ;;
- esac
- fi
- fi
- rm -rf conftest*
- ;;
-
-x86_64-*kfreebsd*-gnu|x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*| \
-s390*-*linux*|s390*-*tpf*|sparc*-*linux*)
- # Find out which ABI we are using.
- echo 'int i;' > conftest.$ac_ext
- if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
- (eval $ac_compile) 2>&5
- ac_status=$?
- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
- test $ac_status = 0; }; then
- case `/usr/bin/file conftest.o` in
- *32-bit*)
- case $host in
- x86_64-*kfreebsd*-gnu)
- LD="${LD-ld} -m elf_i386_fbsd"
- ;;
- x86_64-*linux*)
- LD="${LD-ld} -m elf_i386"
- ;;
- ppc64-*linux*|powerpc64-*linux*)
- LD="${LD-ld} -m elf32ppclinux"
- ;;
- s390x-*linux*)
- LD="${LD-ld} -m elf_s390"
- ;;
- sparc64-*linux*)
- LD="${LD-ld} -m elf32_sparc"
- ;;
- esac
- ;;
- *64-bit*)
- case $host in
- x86_64-*kfreebsd*-gnu)
- LD="${LD-ld} -m elf_x86_64_fbsd"
- ;;
- x86_64-*linux*)
- LD="${LD-ld} -m elf_x86_64"
- ;;
- ppc*-*linux*|powerpc*-*linux*)
- LD="${LD-ld} -m elf64ppc"
- ;;
- s390*-*linux*|s390*-*tpf*)
- LD="${LD-ld} -m elf64_s390"
- ;;
- sparc*-*linux*)
- LD="${LD-ld} -m elf64_sparc"
- ;;
- esac
- ;;
- esac
- fi
- rm -rf conftest*
- ;;
-
-*-*-sco3.2v5*)
- # On SCO OpenServer 5, we need -belf to get full-featured binaries.
- SAVE_CFLAGS="$CFLAGS"
- CFLAGS="$CFLAGS -belf"
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler needs -belf" >&5
-$as_echo_n "checking whether the C compiler needs -belf... " >&6; }
-if ${lt_cv_cc_needs_belf+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- ac_ext=c
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_c_compiler_gnu
-
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-
-int
-main ()
-{
-
- ;
- return 0;
-}
-_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
- lt_cv_cc_needs_belf=yes
-else
- lt_cv_cc_needs_belf=no
-fi
-rm -f core conftest.err conftest.$ac_objext \
- conftest$ac_exeext conftest.$ac_ext
- ac_ext=c
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_c_compiler_gnu
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_cc_needs_belf" >&5
-$as_echo "$lt_cv_cc_needs_belf" >&6; }
- if test x"$lt_cv_cc_needs_belf" != x"yes"; then
- # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf
- CFLAGS="$SAVE_CFLAGS"
- fi
- ;;
-*-*solaris*)
- # Find out which ABI we are using.
- echo 'int i;' > conftest.$ac_ext
- if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
- (eval $ac_compile) 2>&5
- ac_status=$?
- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
- test $ac_status = 0; }; then
- case `/usr/bin/file conftest.o` in
- *64-bit*)
- case $lt_cv_prog_gnu_ld in
- yes*)
- case $host in
- i?86-*-solaris*)
- LD="${LD-ld} -m elf_x86_64"
- ;;
- sparc*-*-solaris*)
- LD="${LD-ld} -m elf64_sparc"
- ;;
- esac
- # GNU ld 2.21 introduced _sol2 emulations. Use them if available.
- if ${LD-ld} -V | grep _sol2 >/dev/null 2>&1; then
- LD="${LD-ld}_sol2"
- fi
- ;;
- *)
- if ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then
- LD="${LD-ld} -64"
- fi
- ;;
- esac
- ;;
- esac
- fi
- rm -rf conftest*
- ;;
-esac
-
-need_locks="$enable_libtool_lock"
-
-if test -n "$ac_tool_prefix"; then
- # Extract the first word of "${ac_tool_prefix}mt", so it can be a program name with args.
-set dummy ${ac_tool_prefix}mt; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_MANIFEST_TOOL+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- if test -n "$MANIFEST_TOOL"; then
- ac_cv_prog_MANIFEST_TOOL="$MANIFEST_TOOL" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
- IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
- for ac_exec_ext in '' $ac_executable_extensions; do
- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
- ac_cv_prog_MANIFEST_TOOL="${ac_tool_prefix}mt"
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
- break 2
- fi
-done
- done
-IFS=$as_save_IFS
-
-fi
-fi
-MANIFEST_TOOL=$ac_cv_prog_MANIFEST_TOOL
-if test -n "$MANIFEST_TOOL"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MANIFEST_TOOL" >&5
-$as_echo "$MANIFEST_TOOL" >&6; }
-else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-fi
-if test -z "$ac_cv_prog_MANIFEST_TOOL"; then
- ac_ct_MANIFEST_TOOL=$MANIFEST_TOOL
- # Extract the first word of "mt", so it can be a program name with args.
-set dummy mt; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_ac_ct_MANIFEST_TOOL+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- if test -n "$ac_ct_MANIFEST_TOOL"; then
- ac_cv_prog_ac_ct_MANIFEST_TOOL="$ac_ct_MANIFEST_TOOL" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
- IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
- for ac_exec_ext in '' $ac_executable_extensions; do
- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
- ac_cv_prog_ac_ct_MANIFEST_TOOL="mt"
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
- break 2
- fi
-done
- done
-IFS=$as_save_IFS
-
-fi
-fi
-ac_ct_MANIFEST_TOOL=$ac_cv_prog_ac_ct_MANIFEST_TOOL
-if test -n "$ac_ct_MANIFEST_TOOL"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_MANIFEST_TOOL" >&5
-$as_echo "$ac_ct_MANIFEST_TOOL" >&6; }
-else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
- if test "x$ac_ct_MANIFEST_TOOL" = x; then
- MANIFEST_TOOL=":"
- else
- case $cross_compiling:$ac_tool_warned in
-yes:)
-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
-ac_tool_warned=yes ;;
-esac
- MANIFEST_TOOL=$ac_ct_MANIFEST_TOOL
- fi
-else
- MANIFEST_TOOL="$ac_cv_prog_MANIFEST_TOOL"
-fi
-
-test -z "$MANIFEST_TOOL" && MANIFEST_TOOL=mt
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $MANIFEST_TOOL is a manifest tool" >&5
-$as_echo_n "checking if $MANIFEST_TOOL is a manifest tool... " >&6; }
-if ${lt_cv_path_mainfest_tool+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- lt_cv_path_mainfest_tool=no
- echo "$as_me:$LINENO: $MANIFEST_TOOL '-?'" >&5
- $MANIFEST_TOOL '-?' 2>conftest.err > conftest.out
- cat conftest.err >&5
- if $GREP 'Manifest Tool' conftest.out > /dev/null; then
- lt_cv_path_mainfest_tool=yes
- fi
- rm -f conftest*
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_mainfest_tool" >&5
-$as_echo "$lt_cv_path_mainfest_tool" >&6; }
-if test "x$lt_cv_path_mainfest_tool" != xyes; then
- MANIFEST_TOOL=:
-fi
-
-
-
-
-
-
- case $host_os in
- rhapsody* | darwin*)
- if test -n "$ac_tool_prefix"; then
- # Extract the first word of "${ac_tool_prefix}dsymutil", so it can be a program name with args.
-set dummy ${ac_tool_prefix}dsymutil; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_DSYMUTIL+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- if test -n "$DSYMUTIL"; then
- ac_cv_prog_DSYMUTIL="$DSYMUTIL" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
- IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
- for ac_exec_ext in '' $ac_executable_extensions; do
- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
- ac_cv_prog_DSYMUTIL="${ac_tool_prefix}dsymutil"
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
- break 2
- fi
-done
- done
-IFS=$as_save_IFS
-
-fi
-fi
-DSYMUTIL=$ac_cv_prog_DSYMUTIL
-if test -n "$DSYMUTIL"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DSYMUTIL" >&5
-$as_echo "$DSYMUTIL" >&6; }
-else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-fi
-if test -z "$ac_cv_prog_DSYMUTIL"; then
- ac_ct_DSYMUTIL=$DSYMUTIL
- # Extract the first word of "dsymutil", so it can be a program name with args.
-set dummy dsymutil; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_ac_ct_DSYMUTIL+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- if test -n "$ac_ct_DSYMUTIL"; then
- ac_cv_prog_ac_ct_DSYMUTIL="$ac_ct_DSYMUTIL" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
- IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
- for ac_exec_ext in '' $ac_executable_extensions; do
- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
- ac_cv_prog_ac_ct_DSYMUTIL="dsymutil"
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
- break 2
- fi
-done
- done
-IFS=$as_save_IFS
-
-fi
-fi
-ac_ct_DSYMUTIL=$ac_cv_prog_ac_ct_DSYMUTIL
-if test -n "$ac_ct_DSYMUTIL"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DSYMUTIL" >&5
-$as_echo "$ac_ct_DSYMUTIL" >&6; }
-else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
- if test "x$ac_ct_DSYMUTIL" = x; then
- DSYMUTIL=":"
- else
- case $cross_compiling:$ac_tool_warned in
-yes:)
-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
-ac_tool_warned=yes ;;
-esac
- DSYMUTIL=$ac_ct_DSYMUTIL
- fi
-else
- DSYMUTIL="$ac_cv_prog_DSYMUTIL"
-fi
-
- if test -n "$ac_tool_prefix"; then
- # Extract the first word of "${ac_tool_prefix}nmedit", so it can be a program name with args.
-set dummy ${ac_tool_prefix}nmedit; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_NMEDIT+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- if test -n "$NMEDIT"; then
- ac_cv_prog_NMEDIT="$NMEDIT" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
- IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
- for ac_exec_ext in '' $ac_executable_extensions; do
- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
- ac_cv_prog_NMEDIT="${ac_tool_prefix}nmedit"
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
- break 2
- fi
-done
- done
-IFS=$as_save_IFS
-
-fi
-fi
-NMEDIT=$ac_cv_prog_NMEDIT
-if test -n "$NMEDIT"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $NMEDIT" >&5
-$as_echo "$NMEDIT" >&6; }
-else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-fi
-if test -z "$ac_cv_prog_NMEDIT"; then
- ac_ct_NMEDIT=$NMEDIT
- # Extract the first word of "nmedit", so it can be a program name with args.
-set dummy nmedit; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_ac_ct_NMEDIT+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- if test -n "$ac_ct_NMEDIT"; then
- ac_cv_prog_ac_ct_NMEDIT="$ac_ct_NMEDIT" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
- IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
- for ac_exec_ext in '' $ac_executable_extensions; do
- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
- ac_cv_prog_ac_ct_NMEDIT="nmedit"
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
- break 2
- fi
-done
- done
-IFS=$as_save_IFS
-
-fi
-fi
-ac_ct_NMEDIT=$ac_cv_prog_ac_ct_NMEDIT
-if test -n "$ac_ct_NMEDIT"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_NMEDIT" >&5
-$as_echo "$ac_ct_NMEDIT" >&6; }
-else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
- if test "x$ac_ct_NMEDIT" = x; then
- NMEDIT=":"
- else
- case $cross_compiling:$ac_tool_warned in
-yes:)
-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
-ac_tool_warned=yes ;;
-esac
- NMEDIT=$ac_ct_NMEDIT
- fi
-else
- NMEDIT="$ac_cv_prog_NMEDIT"
-fi
-
- if test -n "$ac_tool_prefix"; then
- # Extract the first word of "${ac_tool_prefix}lipo", so it can be a program name with args.
-set dummy ${ac_tool_prefix}lipo; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_LIPO+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- if test -n "$LIPO"; then
- ac_cv_prog_LIPO="$LIPO" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
- IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
- for ac_exec_ext in '' $ac_executable_extensions; do
- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
- ac_cv_prog_LIPO="${ac_tool_prefix}lipo"
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
- break 2
- fi
-done
- done
-IFS=$as_save_IFS
-
-fi
-fi
-LIPO=$ac_cv_prog_LIPO
-if test -n "$LIPO"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LIPO" >&5
-$as_echo "$LIPO" >&6; }
-else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-fi
-if test -z "$ac_cv_prog_LIPO"; then
- ac_ct_LIPO=$LIPO
- # Extract the first word of "lipo", so it can be a program name with args.
-set dummy lipo; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_ac_ct_LIPO+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- if test -n "$ac_ct_LIPO"; then
- ac_cv_prog_ac_ct_LIPO="$ac_ct_LIPO" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
- IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
- for ac_exec_ext in '' $ac_executable_extensions; do
- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
- ac_cv_prog_ac_ct_LIPO="lipo"
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
- break 2
- fi
-done
- done
-IFS=$as_save_IFS
-
-fi
-fi
-ac_ct_LIPO=$ac_cv_prog_ac_ct_LIPO
-if test -n "$ac_ct_LIPO"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_LIPO" >&5
-$as_echo "$ac_ct_LIPO" >&6; }
-else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
- if test "x$ac_ct_LIPO" = x; then
- LIPO=":"
- else
- case $cross_compiling:$ac_tool_warned in
-yes:)
-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
-ac_tool_warned=yes ;;
-esac
- LIPO=$ac_ct_LIPO
- fi
-else
- LIPO="$ac_cv_prog_LIPO"
-fi
-
- if test -n "$ac_tool_prefix"; then
- # Extract the first word of "${ac_tool_prefix}otool", so it can be a program name with args.
-set dummy ${ac_tool_prefix}otool; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_OTOOL+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- if test -n "$OTOOL"; then
- ac_cv_prog_OTOOL="$OTOOL" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
- IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
- for ac_exec_ext in '' $ac_executable_extensions; do
- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
- ac_cv_prog_OTOOL="${ac_tool_prefix}otool"
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
- break 2
- fi
-done
- done
-IFS=$as_save_IFS
-
-fi
-fi
-OTOOL=$ac_cv_prog_OTOOL
-if test -n "$OTOOL"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OTOOL" >&5
-$as_echo "$OTOOL" >&6; }
-else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-fi
-if test -z "$ac_cv_prog_OTOOL"; then
- ac_ct_OTOOL=$OTOOL
- # Extract the first word of "otool", so it can be a program name with args.
-set dummy otool; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_ac_ct_OTOOL+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- if test -n "$ac_ct_OTOOL"; then
- ac_cv_prog_ac_ct_OTOOL="$ac_ct_OTOOL" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
- IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
- for ac_exec_ext in '' $ac_executable_extensions; do
- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
- ac_cv_prog_ac_ct_OTOOL="otool"
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
- break 2
- fi
-done
- done
-IFS=$as_save_IFS
-
-fi
-fi
-ac_ct_OTOOL=$ac_cv_prog_ac_ct_OTOOL
-if test -n "$ac_ct_OTOOL"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL" >&5
-$as_echo "$ac_ct_OTOOL" >&6; }
-else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
- if test "x$ac_ct_OTOOL" = x; then
- OTOOL=":"
- else
- case $cross_compiling:$ac_tool_warned in
-yes:)
-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
-ac_tool_warned=yes ;;
-esac
- OTOOL=$ac_ct_OTOOL
- fi
-else
- OTOOL="$ac_cv_prog_OTOOL"
-fi
-
- if test -n "$ac_tool_prefix"; then
- # Extract the first word of "${ac_tool_prefix}otool64", so it can be a program name with args.
-set dummy ${ac_tool_prefix}otool64; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_OTOOL64+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- if test -n "$OTOOL64"; then
- ac_cv_prog_OTOOL64="$OTOOL64" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
- IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
- for ac_exec_ext in '' $ac_executable_extensions; do
- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
- ac_cv_prog_OTOOL64="${ac_tool_prefix}otool64"
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
- break 2
- fi
-done
- done
-IFS=$as_save_IFS
-
-fi
-fi
-OTOOL64=$ac_cv_prog_OTOOL64
-if test -n "$OTOOL64"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OTOOL64" >&5
-$as_echo "$OTOOL64" >&6; }
-else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-fi
-if test -z "$ac_cv_prog_OTOOL64"; then
- ac_ct_OTOOL64=$OTOOL64
- # Extract the first word of "otool64", so it can be a program name with args.
-set dummy otool64; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_ac_ct_OTOOL64+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- if test -n "$ac_ct_OTOOL64"; then
- ac_cv_prog_ac_ct_OTOOL64="$ac_ct_OTOOL64" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
- IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
- for ac_exec_ext in '' $ac_executable_extensions; do
- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
- ac_cv_prog_ac_ct_OTOOL64="otool64"
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
- break 2
- fi
-done
- done
-IFS=$as_save_IFS
-
-fi
-fi
-ac_ct_OTOOL64=$ac_cv_prog_ac_ct_OTOOL64
-if test -n "$ac_ct_OTOOL64"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL64" >&5
-$as_echo "$ac_ct_OTOOL64" >&6; }
-else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
- if test "x$ac_ct_OTOOL64" = x; then
- OTOOL64=":"
- else
- case $cross_compiling:$ac_tool_warned in
-yes:)
-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
-ac_tool_warned=yes ;;
-esac
- OTOOL64=$ac_ct_OTOOL64
- fi
-else
- OTOOL64="$ac_cv_prog_OTOOL64"
-fi
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -single_module linker flag" >&5
-$as_echo_n "checking for -single_module linker flag... " >&6; }
-if ${lt_cv_apple_cc_single_mod+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- lt_cv_apple_cc_single_mod=no
- if test -z "${LT_MULTI_MODULE}"; then
- # By default we will add the -single_module flag. You can override
- # by either setting the environment variable LT_MULTI_MODULE
- # non-empty at configure time, or by adding -multi_module to the
- # link flags.
- rm -rf libconftest.dylib*
- echo "int foo(void){return 1;}" > conftest.c
- echo "$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \
--dynamiclib -Wl,-single_module conftest.c" >&5
- $LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \
- -dynamiclib -Wl,-single_module conftest.c 2>conftest.err
- _lt_result=$?
- # If there is a non-empty error log, and "single_module"
- # appears in it, assume the flag caused a linker warning
- if test -s conftest.err && $GREP single_module conftest.err; then
- cat conftest.err >&5
- # Otherwise, if the output was created with a 0 exit code from
- # the compiler, it worked.
- elif test -f libconftest.dylib && test $_lt_result -eq 0; then
- lt_cv_apple_cc_single_mod=yes
- else
- cat conftest.err >&5
- fi
- rm -rf libconftest.dylib*
- rm -f conftest.*
- fi
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_apple_cc_single_mod" >&5
-$as_echo "$lt_cv_apple_cc_single_mod" >&6; }
-
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -exported_symbols_list linker flag" >&5
-$as_echo_n "checking for -exported_symbols_list linker flag... " >&6; }
-if ${lt_cv_ld_exported_symbols_list+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- lt_cv_ld_exported_symbols_list=no
- save_LDFLAGS=$LDFLAGS
- echo "_main" > conftest.sym
- LDFLAGS="$LDFLAGS -Wl,-exported_symbols_list,conftest.sym"
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-
-int
-main ()
-{
-
- ;
- return 0;
-}
-_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
- lt_cv_ld_exported_symbols_list=yes
-else
- lt_cv_ld_exported_symbols_list=no
-fi
-rm -f core conftest.err conftest.$ac_objext \
- conftest$ac_exeext conftest.$ac_ext
- LDFLAGS="$save_LDFLAGS"
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_exported_symbols_list" >&5
-$as_echo "$lt_cv_ld_exported_symbols_list" >&6; }
-
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -force_load linker flag" >&5
-$as_echo_n "checking for -force_load linker flag... " >&6; }
-if ${lt_cv_ld_force_load+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- lt_cv_ld_force_load=no
- cat > conftest.c << _LT_EOF
-int forced_loaded() { return 2;}
-_LT_EOF
- echo "$LTCC $LTCFLAGS -c -o conftest.o conftest.c" >&5
- $LTCC $LTCFLAGS -c -o conftest.o conftest.c 2>&5
- echo "$AR cru libconftest.a conftest.o" >&5
- $AR cru libconftest.a conftest.o 2>&5
- echo "$RANLIB libconftest.a" >&5
- $RANLIB libconftest.a 2>&5
- cat > conftest.c << _LT_EOF
-int main() { return 0;}
-_LT_EOF
- echo "$LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a" >&5
- $LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a 2>conftest.err
- _lt_result=$?
- if test -s conftest.err && $GREP force_load conftest.err; then
- cat conftest.err >&5
- elif test -f conftest && test $_lt_result -eq 0 && $GREP forced_load conftest >/dev/null 2>&1 ; then
- lt_cv_ld_force_load=yes
- else
- cat conftest.err >&5
- fi
- rm -f conftest.err libconftest.a conftest conftest.c
- rm -rf conftest.dSYM
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_force_load" >&5
-$as_echo "$lt_cv_ld_force_load" >&6; }
- case $host_os in
- rhapsody* | darwin1.[012])
- _lt_dar_allow_undefined='${wl}-undefined ${wl}suppress' ;;
- darwin1.*)
- _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;;
- darwin*) # darwin 5.x on
- # if running on 10.5 or later, the deployment target defaults
- # to the OS version, if on x86, and 10.4, the deployment
- # target defaults to 10.4. Don't you love it?
- case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in
- 10.0,*86*-darwin8*|10.0,*-darwin[91]*)
- _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;;
- 10.[012]*)
- _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;;
- 10.*)
- _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;;
- esac
- ;;
- esac
- if test "$lt_cv_apple_cc_single_mod" = "yes"; then
- _lt_dar_single_mod='$single_module'
- fi
- if test "$lt_cv_ld_exported_symbols_list" = "yes"; then
- _lt_dar_export_syms=' ${wl}-exported_symbols_list,$output_objdir/${libname}-symbols.expsym'
- else
- _lt_dar_export_syms='~$NMEDIT -s $output_objdir/${libname}-symbols.expsym ${lib}'
- fi
- if test "$DSYMUTIL" != ":" && test "$lt_cv_ld_force_load" = "no"; then
- _lt_dsymutil='~$DSYMUTIL $lib || :'
- else
- _lt_dsymutil=
- fi
- ;;
- esac
-
-# On IRIX 5.3, sys/types and inttypes.h are conflicting.
-for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \
- inttypes.h stdint.h unistd.h
-do :
- as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`
-ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default
-"
-if eval test \"x\$"$as_ac_Header"\" = x"yes"; then :
- cat >>confdefs.h <<_ACEOF
-#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1
-_ACEOF
-
-fi
-
-done
-
-
-for ac_header in dlfcn.h
-do :
- ac_fn_c_check_header_compile "$LINENO" "dlfcn.h" "ac_cv_header_dlfcn_h" "$ac_includes_default
-"
-if test "x$ac_cv_header_dlfcn_h" = xyes; then :
- cat >>confdefs.h <<_ACEOF
-#define HAVE_DLFCN_H 1
-_ACEOF
-
-fi
-
-done
-
-
-
-func_stripname_cnf ()
-{
- case ${2} in
- .*) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%\\\\${2}\$%%"`;;
- *) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%${2}\$%%"`;;
- esac
-} # func_stripname_cnf
-
-
-
-
-
-# Set options
-
-
-
- enable_dlopen=no
-
-
- enable_win32_dll=no
-
-
- # Check whether --enable-shared was given.
-if test "${enable_shared+set}" = set; then :
- enableval=$enable_shared; p=${PACKAGE-default}
- case $enableval in
- yes) enable_shared=yes ;;
- no) enable_shared=no ;;
- *)
- enable_shared=no
- # Look at the argument we got. We use all the common list separators.
- lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
- for pkg in $enableval; do
- IFS="$lt_save_ifs"
- if test "X$pkg" = "X$p"; then
- enable_shared=yes
- fi
- done
- IFS="$lt_save_ifs"
- ;;
- esac
-else
- enable_shared=yes
-fi
-
-
-
-
-
-
-
-
-
- # Check whether --enable-static was given.
-if test "${enable_static+set}" = set; then :
- enableval=$enable_static; p=${PACKAGE-default}
- case $enableval in
- yes) enable_static=yes ;;
- no) enable_static=no ;;
- *)
- enable_static=no
- # Look at the argument we got. We use all the common list separators.
- lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
- for pkg in $enableval; do
- IFS="$lt_save_ifs"
- if test "X$pkg" = "X$p"; then
- enable_static=yes
- fi
- done
- IFS="$lt_save_ifs"
- ;;
- esac
-else
- enable_static=yes
-fi
-
-
-
-
-
-
-
-
-
-
-# Check whether --with-pic was given.
-if test "${with_pic+set}" = set; then :
- withval=$with_pic; lt_p=${PACKAGE-default}
- case $withval in
- yes|no) pic_mode=$withval ;;
- *)
- pic_mode=default
- # Look at the argument we got. We use all the common list separators.
- lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
- for lt_pkg in $withval; do
- IFS="$lt_save_ifs"
- if test "X$lt_pkg" = "X$lt_p"; then
- pic_mode=yes
- fi
- done
- IFS="$lt_save_ifs"
- ;;
- esac
-else
- pic_mode=default
-fi
-
-
-test -z "$pic_mode" && pic_mode=default
-
-
-
-
-
-
-
- # Check whether --enable-fast-install was given.
-if test "${enable_fast_install+set}" = set; then :
- enableval=$enable_fast_install; p=${PACKAGE-default}
- case $enableval in
- yes) enable_fast_install=yes ;;
- no) enable_fast_install=no ;;
- *)
- enable_fast_install=no
- # Look at the argument we got. We use all the common list separators.
- lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
- for pkg in $enableval; do
- IFS="$lt_save_ifs"
- if test "X$pkg" = "X$p"; then
- enable_fast_install=yes
- fi
- done
- IFS="$lt_save_ifs"
- ;;
- esac
-else
- enable_fast_install=yes
-fi
-
-
-
-
-
-
-
-
-
-
-
-# This can be used to rebuild libtool when needed
-LIBTOOL_DEPS="$ltmain"
-
-# Always use our own libtool.
-LIBTOOL='$(SHELL) $(top_builddir)/libtool'
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-test -z "$LN_S" && LN_S="ln -s"
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-if test -n "${ZSH_VERSION+set}" ; then
- setopt NO_GLOB_SUBST
-fi
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for objdir" >&5
-$as_echo_n "checking for objdir... " >&6; }
-if ${lt_cv_objdir+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- rm -f .libs 2>/dev/null
-mkdir .libs 2>/dev/null
-if test -d .libs; then
- lt_cv_objdir=.libs
-else
- # MS-DOS does not allow filenames that begin with a dot.
- lt_cv_objdir=_libs
-fi
-rmdir .libs 2>/dev/null
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_objdir" >&5
-$as_echo "$lt_cv_objdir" >&6; }
-objdir=$lt_cv_objdir
-
-
-
-
-
-cat >>confdefs.h <<_ACEOF
-#define LT_OBJDIR "$lt_cv_objdir/"
-_ACEOF
-
-
-
-
-case $host_os in
-aix3*)
- # AIX sometimes has problems with the GCC collect2 program. For some
- # reason, if we set the COLLECT_NAMES environment variable, the problems
- # vanish in a puff of smoke.
- if test "X${COLLECT_NAMES+set}" != Xset; then
- COLLECT_NAMES=
- export COLLECT_NAMES
- fi
- ;;
-esac
-
-# Global variables:
-ofile=libtool
-can_build_shared=yes
-
-# All known linkers require a `.a' archive for static linking (except MSVC,
-# which needs '.lib').
-libext=a
-
-with_gnu_ld="$lt_cv_prog_gnu_ld"
-
-old_CC="$CC"
-old_CFLAGS="$CFLAGS"
-
-# Set sane defaults for various variables
-test -z "$CC" && CC=cc
-test -z "$LTCC" && LTCC=$CC
-test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS
-test -z "$LD" && LD=ld
-test -z "$ac_objext" && ac_objext=o
-
-for cc_temp in $compiler""; do
- case $cc_temp in
- compile | *[\\/]compile | ccache | *[\\/]ccache ) ;;
- distcc | *[\\/]distcc | purify | *[\\/]purify ) ;;
- \-*) ;;
- *) break;;
- esac
-done
-cc_basename=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"`
-
-
-# Only perform the check for file, if the check method requires it
-test -z "$MAGIC_CMD" && MAGIC_CMD=file
-case $deplibs_check_method in
-file_magic*)
- if test "$file_magic_cmd" = '$MAGIC_CMD'; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ${ac_tool_prefix}file" >&5
-$as_echo_n "checking for ${ac_tool_prefix}file... " >&6; }
-if ${lt_cv_path_MAGIC_CMD+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- case $MAGIC_CMD in
-[\\/*] | ?:[\\/]*)
- lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path.
- ;;
-*)
- lt_save_MAGIC_CMD="$MAGIC_CMD"
- lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
- ac_dummy="/usr/bin$PATH_SEPARATOR$PATH"
- for ac_dir in $ac_dummy; do
- IFS="$lt_save_ifs"
- test -z "$ac_dir" && ac_dir=.
- if test -f $ac_dir/${ac_tool_prefix}file; then
- lt_cv_path_MAGIC_CMD="$ac_dir/${ac_tool_prefix}file"
- if test -n "$file_magic_test_file"; then
- case $deplibs_check_method in
- "file_magic "*)
- file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"`
- MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
- if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null |
- $EGREP "$file_magic_regex" > /dev/null; then
- :
- else
- cat <<_LT_EOF 1>&2
-
-*** Warning: the command libtool uses to detect shared libraries,
-*** $file_magic_cmd, produces output that libtool cannot recognize.
-*** The result is that libtool may fail to recognize shared libraries
-*** as such. This will affect the creation of libtool libraries that
-*** depend on shared libraries, but programs linked with such libtool
-*** libraries will work regardless of this problem. Nevertheless, you
-*** may want to report the problem to your system manager and/or to
-*** bug-libtool at gnu.org
-
-_LT_EOF
- fi ;;
- esac
- fi
- break
- fi
- done
- IFS="$lt_save_ifs"
- MAGIC_CMD="$lt_save_MAGIC_CMD"
- ;;
-esac
-fi
-
-MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
-if test -n "$MAGIC_CMD"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5
-$as_echo "$MAGIC_CMD" >&6; }
-else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-
-
-
-if test -z "$lt_cv_path_MAGIC_CMD"; then
- if test -n "$ac_tool_prefix"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for file" >&5
-$as_echo_n "checking for file... " >&6; }
-if ${lt_cv_path_MAGIC_CMD+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- case $MAGIC_CMD in
-[\\/*] | ?:[\\/]*)
- lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path.
- ;;
-*)
- lt_save_MAGIC_CMD="$MAGIC_CMD"
- lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
- ac_dummy="/usr/bin$PATH_SEPARATOR$PATH"
- for ac_dir in $ac_dummy; do
- IFS="$lt_save_ifs"
- test -z "$ac_dir" && ac_dir=.
- if test -f $ac_dir/file; then
- lt_cv_path_MAGIC_CMD="$ac_dir/file"
- if test -n "$file_magic_test_file"; then
- case $deplibs_check_method in
- "file_magic "*)
- file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"`
- MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
- if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null |
- $EGREP "$file_magic_regex" > /dev/null; then
- :
- else
- cat <<_LT_EOF 1>&2
-
-*** Warning: the command libtool uses to detect shared libraries,
-*** $file_magic_cmd, produces output that libtool cannot recognize.
-*** The result is that libtool may fail to recognize shared libraries
-*** as such. This will affect the creation of libtool libraries that
-*** depend on shared libraries, but programs linked with such libtool
-*** libraries will work regardless of this problem. Nevertheless, you
-*** may want to report the problem to your system manager and/or to
-*** bug-libtool at gnu.org
-
-_LT_EOF
- fi ;;
- esac
- fi
- break
- fi
- done
- IFS="$lt_save_ifs"
- MAGIC_CMD="$lt_save_MAGIC_CMD"
- ;;
-esac
-fi
-
-MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
-if test -n "$MAGIC_CMD"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5
-$as_echo "$MAGIC_CMD" >&6; }
-else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
- else
- MAGIC_CMD=:
- fi
-fi
-
- fi
- ;;
-esac
-
-# Use C for the default configuration in the libtool script
-
-lt_save_CC="$CC"
-ac_ext=c
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_c_compiler_gnu
-
-
-# Source file extension for C test sources.
-ac_ext=c
-
-# Object file extension for compiled C test sources.
-objext=o
-objext=$objext
-
-# Code to be used in simple compile tests
-lt_simple_compile_test_code="int some_variable = 0;"
-
-# Code to be used in simple link tests
-lt_simple_link_test_code='int main(){return(0);}'
-
-
-
-
-
-
-
-# If no C compiler was specified, use CC.
-LTCC=${LTCC-"$CC"}
-
-# If no C compiler flags were specified, use CFLAGS.
-LTCFLAGS=${LTCFLAGS-"$CFLAGS"}
-
-# Allow CC to be a program name with arguments.
-compiler=$CC
-
-# Save the default compiler, since it gets overwritten when the other
-# tags are being tested, and _LT_TAGVAR(compiler, []) is a NOP.
-compiler_DEFAULT=$CC
-
-# save warnings/boilerplate of simple test code
-ac_outfile=conftest.$ac_objext
-echo "$lt_simple_compile_test_code" >conftest.$ac_ext
-eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
-_lt_compiler_boilerplate=`cat conftest.err`
-$RM conftest*
-
-ac_outfile=conftest.$ac_objext
-echo "$lt_simple_link_test_code" >conftest.$ac_ext
-eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
-_lt_linker_boilerplate=`cat conftest.err`
-$RM -r conftest*
-
-
-## CAVEAT EMPTOR:
-## There is no encapsulation within the following macros, do not change
-## the running order or otherwise move them around unless you know exactly
-## what you are doing...
-if test -n "$compiler"; then
-
-lt_prog_compiler_no_builtin_flag=
-
-if test "$GCC" = yes; then
- case $cc_basename in
- nvcc*)
- lt_prog_compiler_no_builtin_flag=' -Xcompiler -fno-builtin' ;;
- *)
- lt_prog_compiler_no_builtin_flag=' -fno-builtin' ;;
- esac
-
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -fno-rtti -fno-exceptions" >&5
-$as_echo_n "checking if $compiler supports -fno-rtti -fno-exceptions... " >&6; }
-if ${lt_cv_prog_compiler_rtti_exceptions+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- lt_cv_prog_compiler_rtti_exceptions=no
- ac_outfile=conftest.$ac_objext
- echo "$lt_simple_compile_test_code" > conftest.$ac_ext
- lt_compiler_flag="-fno-rtti -fno-exceptions"
- # Insert the option either (1) after the last *FLAGS variable, or
- # (2) before a word containing "conftest.", or (3) at the end.
- # Note that $ac_compile itself does not contain backslashes and begins
- # with a dollar sign (not a hyphen), so the echo should work correctly.
- # The option is referenced via a variable to avoid confusing sed.
- lt_compile=`echo "$ac_compile" | $SED \
- -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
- -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
- -e 's:$: $lt_compiler_flag:'`
- (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5)
- (eval "$lt_compile" 2>conftest.err)
- ac_status=$?
- cat conftest.err >&5
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- if (exit $ac_status) && test -s "$ac_outfile"; then
- # The compiler can only warn and ignore the option if not recognized
- # So say no if there are warnings other than the usual output.
- $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp
- $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
- if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then
- lt_cv_prog_compiler_rtti_exceptions=yes
- fi
- fi
- $RM conftest*
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_rtti_exceptions" >&5
-$as_echo "$lt_cv_prog_compiler_rtti_exceptions" >&6; }
-
-if test x"$lt_cv_prog_compiler_rtti_exceptions" = xyes; then
- lt_prog_compiler_no_builtin_flag="$lt_prog_compiler_no_builtin_flag -fno-rtti -fno-exceptions"
-else
- :
-fi
-
-fi
-
-
-
-
-
-
- lt_prog_compiler_wl=
-lt_prog_compiler_pic=
-lt_prog_compiler_static=
-
-
- if test "$GCC" = yes; then
- lt_prog_compiler_wl='-Wl,'
- lt_prog_compiler_static='-static'
-
- case $host_os in
- aix*)
- # All AIX code is PIC.
- if test "$host_cpu" = ia64; then
- # AIX 5 now supports IA64 processor
- lt_prog_compiler_static='-Bstatic'
- fi
- ;;
-
- amigaos*)
- case $host_cpu in
- powerpc)
- # see comment about AmigaOS4 .so support
- lt_prog_compiler_pic='-fPIC'
- ;;
- m68k)
- # FIXME: we need at least 68020 code to build shared libraries, but
- # adding the `-m68020' flag to GCC prevents building anything better,
- # like `-m68040'.
- lt_prog_compiler_pic='-m68020 -resident32 -malways-restore-a4'
- ;;
- esac
- ;;
-
- beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*)
- # PIC is the default for these OSes.
- ;;
-
- mingw* | cygwin* | pw32* | os2* | cegcc*)
- # This hack is so that the source file can tell whether it is being
- # built for inclusion in a dll (and should export symbols for example).
- # Although the cygwin gcc ignores -fPIC, still need this for old-style
- # (--disable-auto-import) libraries
- lt_prog_compiler_pic='-DDLL_EXPORT'
- ;;
-
- darwin* | rhapsody*)
- # PIC is the default on this platform
- # Common symbols not allowed in MH_DYLIB files
- lt_prog_compiler_pic='-fno-common'
- ;;
-
- haiku*)
- # PIC is the default for Haiku.
- # The "-static" flag exists, but is broken.
- lt_prog_compiler_static=
- ;;
-
- hpux*)
- # PIC is the default for 64-bit PA HP-UX, but not for 32-bit
- # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag
- # sets the default TLS model and affects inlining.
- case $host_cpu in
- hppa*64*)
- # +Z the default
- ;;
- *)
- lt_prog_compiler_pic='-fPIC'
- ;;
- esac
- ;;
-
- interix[3-9]*)
- # Interix 3.x gcc -fpic/-fPIC options generate broken code.
- # Instead, we relocate shared libraries at runtime.
- ;;
-
- msdosdjgpp*)
- # Just because we use GCC doesn't mean we suddenly get shared libraries
- # on systems that don't support them.
- lt_prog_compiler_can_build_shared=no
- enable_shared=no
- ;;
-
- *nto* | *qnx*)
- # QNX uses GNU C++, but need to define -shared option too, otherwise
- # it will coredump.
- lt_prog_compiler_pic='-fPIC -shared'
- ;;
-
- sysv4*MP*)
- if test -d /usr/nec; then
- lt_prog_compiler_pic=-Kconform_pic
- fi
- ;;
-
- *)
- lt_prog_compiler_pic='-fPIC'
- ;;
- esac
-
- case $cc_basename in
- nvcc*) # Cuda Compiler Driver 2.2
- lt_prog_compiler_wl='-Xlinker '
- if test -n "$lt_prog_compiler_pic"; then
- lt_prog_compiler_pic="-Xcompiler $lt_prog_compiler_pic"
- fi
- ;;
- esac
- else
- # PORTME Check for flag to pass linker flags through the system compiler.
- case $host_os in
- aix*)
- lt_prog_compiler_wl='-Wl,'
- if test "$host_cpu" = ia64; then
- # AIX 5 now supports IA64 processor
- lt_prog_compiler_static='-Bstatic'
- else
- lt_prog_compiler_static='-bnso -bI:/lib/syscalls.exp'
- fi
- ;;
-
- mingw* | cygwin* | pw32* | os2* | cegcc*)
- # This hack is so that the source file can tell whether it is being
- # built for inclusion in a dll (and should export symbols for example).
- lt_prog_compiler_pic='-DDLL_EXPORT'
- ;;
-
- hpux9* | hpux10* | hpux11*)
- lt_prog_compiler_wl='-Wl,'
- # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but
- # not for PA HP-UX.
- case $host_cpu in
- hppa*64*|ia64*)
- # +Z the default
- ;;
- *)
- lt_prog_compiler_pic='+Z'
- ;;
- esac
- # Is there a better lt_prog_compiler_static that works with the bundled CC?
- lt_prog_compiler_static='${wl}-a ${wl}archive'
- ;;
-
- irix5* | irix6* | nonstopux*)
- lt_prog_compiler_wl='-Wl,'
- # PIC (with -KPIC) is the default.
- lt_prog_compiler_static='-non_shared'
- ;;
-
- linux* | k*bsd*-gnu | kopensolaris*-gnu)
- case $cc_basename in
- # old Intel for x86_64 which still supported -KPIC.
- ecc*)
- lt_prog_compiler_wl='-Wl,'
- lt_prog_compiler_pic='-KPIC'
- lt_prog_compiler_static='-static'
- ;;
- # icc used to be incompatible with GCC.
- # ICC 10 doesn't accept -KPIC any more.
- icc* | ifort*)
- lt_prog_compiler_wl='-Wl,'
- lt_prog_compiler_pic='-fPIC'
- lt_prog_compiler_static='-static'
- ;;
- # Lahey Fortran 8.1.
- lf95*)
- lt_prog_compiler_wl='-Wl,'
- lt_prog_compiler_pic='--shared'
- lt_prog_compiler_static='--static'
- ;;
- nagfor*)
- # NAG Fortran compiler
- lt_prog_compiler_wl='-Wl,-Wl,,'
- lt_prog_compiler_pic='-PIC'
- lt_prog_compiler_static='-Bstatic'
- ;;
- pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*)
- # Portland Group compilers (*not* the Pentium gcc compiler,
- # which looks to be a dead project)
- lt_prog_compiler_wl='-Wl,'
- lt_prog_compiler_pic='-fpic'
- lt_prog_compiler_static='-Bstatic'
- ;;
- ccc*)
- lt_prog_compiler_wl='-Wl,'
- # All Alpha code is PIC.
- lt_prog_compiler_static='-non_shared'
- ;;
- xl* | bgxl* | bgf* | mpixl*)
- # IBM XL C 8.0/Fortran 10.1, 11.1 on PPC and BlueGene
- lt_prog_compiler_wl='-Wl,'
- lt_prog_compiler_pic='-qpic'
- lt_prog_compiler_static='-qstaticlink'
- ;;
- *)
- case `$CC -V 2>&1 | sed 5q` in
- *Sun\ Ceres\ Fortran* | *Sun*Fortran*\ [1-7].* | *Sun*Fortran*\ 8.[0-3]*)
- # Sun Fortran 8.3 passes all unrecognized flags to the linker
- lt_prog_compiler_pic='-KPIC'
- lt_prog_compiler_static='-Bstatic'
- lt_prog_compiler_wl=''
- ;;
- *Sun\ F* | *Sun*Fortran*)
- lt_prog_compiler_pic='-KPIC'
- lt_prog_compiler_static='-Bstatic'
- lt_prog_compiler_wl='-Qoption ld '
- ;;
- *Sun\ C*)
- # Sun C 5.9
- lt_prog_compiler_pic='-KPIC'
- lt_prog_compiler_static='-Bstatic'
- lt_prog_compiler_wl='-Wl,'
- ;;
- *Intel*\ [CF]*Compiler*)
- lt_prog_compiler_wl='-Wl,'
- lt_prog_compiler_pic='-fPIC'
- lt_prog_compiler_static='-static'
- ;;
- *Portland\ Group*)
- lt_prog_compiler_wl='-Wl,'
- lt_prog_compiler_pic='-fpic'
- lt_prog_compiler_static='-Bstatic'
- ;;
- esac
- ;;
- esac
- ;;
-
- newsos6)
- lt_prog_compiler_pic='-KPIC'
- lt_prog_compiler_static='-Bstatic'
- ;;
-
- *nto* | *qnx*)
- # QNX uses GNU C++, but need to define -shared option too, otherwise
- # it will coredump.
- lt_prog_compiler_pic='-fPIC -shared'
- ;;
-
- osf3* | osf4* | osf5*)
- lt_prog_compiler_wl='-Wl,'
- # All OSF/1 code is PIC.
- lt_prog_compiler_static='-non_shared'
- ;;
-
- rdos*)
- lt_prog_compiler_static='-non_shared'
- ;;
-
- solaris*)
- lt_prog_compiler_pic='-KPIC'
- lt_prog_compiler_static='-Bstatic'
- case $cc_basename in
- f77* | f90* | f95* | sunf77* | sunf90* | sunf95*)
- lt_prog_compiler_wl='-Qoption ld ';;
- *)
- lt_prog_compiler_wl='-Wl,';;
- esac
- ;;
-
- sunos4*)
- lt_prog_compiler_wl='-Qoption ld '
- lt_prog_compiler_pic='-PIC'
- lt_prog_compiler_static='-Bstatic'
- ;;
-
- sysv4 | sysv4.2uw2* | sysv4.3*)
- lt_prog_compiler_wl='-Wl,'
- lt_prog_compiler_pic='-KPIC'
- lt_prog_compiler_static='-Bstatic'
- ;;
-
- sysv4*MP*)
- if test -d /usr/nec ;then
- lt_prog_compiler_pic='-Kconform_pic'
- lt_prog_compiler_static='-Bstatic'
- fi
- ;;
-
- sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*)
- lt_prog_compiler_wl='-Wl,'
- lt_prog_compiler_pic='-KPIC'
- lt_prog_compiler_static='-Bstatic'
- ;;
-
- unicos*)
- lt_prog_compiler_wl='-Wl,'
- lt_prog_compiler_can_build_shared=no
- ;;
-
- uts4*)
- lt_prog_compiler_pic='-pic'
- lt_prog_compiler_static='-Bstatic'
- ;;
-
- *)
- lt_prog_compiler_can_build_shared=no
- ;;
- esac
- fi
-
-case $host_os in
- # For platforms which do not support PIC, -DPIC is meaningless:
- *djgpp*)
- lt_prog_compiler_pic=
- ;;
- *)
- lt_prog_compiler_pic="$lt_prog_compiler_pic -DPIC"
- ;;
-esac
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC" >&5
-$as_echo_n "checking for $compiler option to produce PIC... " >&6; }
-if ${lt_cv_prog_compiler_pic+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- lt_cv_prog_compiler_pic=$lt_prog_compiler_pic
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic" >&5
-$as_echo "$lt_cv_prog_compiler_pic" >&6; }
-lt_prog_compiler_pic=$lt_cv_prog_compiler_pic
-
-#
-# Check to make sure the PIC flag actually works.
-#
-if test -n "$lt_prog_compiler_pic"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic works" >&5
-$as_echo_n "checking if $compiler PIC flag $lt_prog_compiler_pic works... " >&6; }
-if ${lt_cv_prog_compiler_pic_works+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- lt_cv_prog_compiler_pic_works=no
- ac_outfile=conftest.$ac_objext
- echo "$lt_simple_compile_test_code" > conftest.$ac_ext
- lt_compiler_flag="$lt_prog_compiler_pic -DPIC"
- # Insert the option either (1) after the last *FLAGS variable, or
- # (2) before a word containing "conftest.", or (3) at the end.
- # Note that $ac_compile itself does not contain backslashes and begins
- # with a dollar sign (not a hyphen), so the echo should work correctly.
- # The option is referenced via a variable to avoid confusing sed.
- lt_compile=`echo "$ac_compile" | $SED \
- -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
- -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
- -e 's:$: $lt_compiler_flag:'`
- (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5)
- (eval "$lt_compile" 2>conftest.err)
- ac_status=$?
- cat conftest.err >&5
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- if (exit $ac_status) && test -s "$ac_outfile"; then
- # The compiler can only warn and ignore the option if not recognized
- # So say no if there are warnings other than the usual output.
- $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp
- $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
- if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then
- lt_cv_prog_compiler_pic_works=yes
- fi
- fi
- $RM conftest*
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works" >&5
-$as_echo "$lt_cv_prog_compiler_pic_works" >&6; }
-
-if test x"$lt_cv_prog_compiler_pic_works" = xyes; then
- case $lt_prog_compiler_pic in
- "" | " "*) ;;
- *) lt_prog_compiler_pic=" $lt_prog_compiler_pic" ;;
- esac
-else
- lt_prog_compiler_pic=
- lt_prog_compiler_can_build_shared=no
-fi
-
-fi
-
-
-
-
-
-
-
-
-
-
-
-#
-# Check to make sure the static flag actually works.
-#
-wl=$lt_prog_compiler_wl eval lt_tmp_static_flag=\"$lt_prog_compiler_static\"
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler static flag $lt_tmp_static_flag works" >&5
-$as_echo_n "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; }
-if ${lt_cv_prog_compiler_static_works+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- lt_cv_prog_compiler_static_works=no
- save_LDFLAGS="$LDFLAGS"
- LDFLAGS="$LDFLAGS $lt_tmp_static_flag"
- echo "$lt_simple_link_test_code" > conftest.$ac_ext
- if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then
- # The linker can only warn and ignore the option if not recognized
- # So say no if there are warnings
- if test -s conftest.err; then
- # Append any errors to the config.log.
- cat conftest.err 1>&5
- $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp
- $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
- if diff conftest.exp conftest.er2 >/dev/null; then
- lt_cv_prog_compiler_static_works=yes
- fi
- else
- lt_cv_prog_compiler_static_works=yes
- fi
- fi
- $RM -r conftest*
- LDFLAGS="$save_LDFLAGS"
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_static_works" >&5
-$as_echo "$lt_cv_prog_compiler_static_works" >&6; }
-
-if test x"$lt_cv_prog_compiler_static_works" = xyes; then
- :
-else
- lt_prog_compiler_static=
-fi
-
-
-
-
-
-
-
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5
-$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; }
-if ${lt_cv_prog_compiler_c_o+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- lt_cv_prog_compiler_c_o=no
- $RM -r conftest 2>/dev/null
- mkdir conftest
- cd conftest
- mkdir out
- echo "$lt_simple_compile_test_code" > conftest.$ac_ext
-
- lt_compiler_flag="-o out/conftest2.$ac_objext"
- # Insert the option either (1) after the last *FLAGS variable, or
- # (2) before a word containing "conftest.", or (3) at the end.
- # Note that $ac_compile itself does not contain backslashes and begins
- # with a dollar sign (not a hyphen), so the echo should work correctly.
- lt_compile=`echo "$ac_compile" | $SED \
- -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
- -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
- -e 's:$: $lt_compiler_flag:'`
- (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5)
- (eval "$lt_compile" 2>out/conftest.err)
- ac_status=$?
- cat out/conftest.err >&5
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- if (exit $ac_status) && test -s out/conftest2.$ac_objext
- then
- # The compiler can only warn and ignore the option if not recognized
- # So say no if there are warnings
- $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp
- $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2
- if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then
- lt_cv_prog_compiler_c_o=yes
- fi
- fi
- chmod u+w . 2>&5
- $RM conftest*
- # SGI C++ compiler will create directory out/ii_files/ for
- # template instantiation
- test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files
- $RM out/* && rmdir out
- cd ..
- $RM -r conftest
- $RM conftest*
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5
-$as_echo "$lt_cv_prog_compiler_c_o" >&6; }
-
-
-
-
-
-
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5
-$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; }
-if ${lt_cv_prog_compiler_c_o+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- lt_cv_prog_compiler_c_o=no
- $RM -r conftest 2>/dev/null
- mkdir conftest
- cd conftest
- mkdir out
- echo "$lt_simple_compile_test_code" > conftest.$ac_ext
-
- lt_compiler_flag="-o out/conftest2.$ac_objext"
- # Insert the option either (1) after the last *FLAGS variable, or
- # (2) before a word containing "conftest.", or (3) at the end.
- # Note that $ac_compile itself does not contain backslashes and begins
- # with a dollar sign (not a hyphen), so the echo should work correctly.
- lt_compile=`echo "$ac_compile" | $SED \
- -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
- -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
- -e 's:$: $lt_compiler_flag:'`
- (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5)
- (eval "$lt_compile" 2>out/conftest.err)
- ac_status=$?
- cat out/conftest.err >&5
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- if (exit $ac_status) && test -s out/conftest2.$ac_objext
- then
- # The compiler can only warn and ignore the option if not recognized
- # So say no if there are warnings
- $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp
- $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2
- if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then
- lt_cv_prog_compiler_c_o=yes
- fi
- fi
- chmod u+w . 2>&5
- $RM conftest*
- # SGI C++ compiler will create directory out/ii_files/ for
- # template instantiation
- test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files
- $RM out/* && rmdir out
- cd ..
- $RM -r conftest
- $RM conftest*
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5
-$as_echo "$lt_cv_prog_compiler_c_o" >&6; }
-
-
-
-
-hard_links="nottested"
-if test "$lt_cv_prog_compiler_c_o" = no && test "$need_locks" != no; then
- # do not overwrite the value of need_locks provided by the user
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links" >&5
-$as_echo_n "checking if we can lock with hard links... " >&6; }
- hard_links=yes
- $RM conftest*
- ln conftest.a conftest.b 2>/dev/null && hard_links=no
- touch conftest.a
- ln conftest.a conftest.b 2>&5 || hard_links=no
- ln conftest.a conftest.b 2>/dev/null && hard_links=no
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hard_links" >&5
-$as_echo "$hard_links" >&6; }
- if test "$hard_links" = no; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5
-$as_echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;}
- need_locks=warn
- fi
-else
- need_locks=no
-fi
-
-
-
-
-
-
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5
-$as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; }
-
- runpath_var=
- allow_undefined_flag=
- always_export_symbols=no
- archive_cmds=
- archive_expsym_cmds=
- compiler_needs_object=no
- enable_shared_with_static_runtimes=no
- export_dynamic_flag_spec=
- export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
- hardcode_automatic=no
- hardcode_direct=no
- hardcode_direct_absolute=no
- hardcode_libdir_flag_spec=
- hardcode_libdir_separator=
- hardcode_minus_L=no
- hardcode_shlibpath_var=unsupported
- inherit_rpath=no
- link_all_deplibs=unknown
- module_cmds=
- module_expsym_cmds=
- old_archive_from_new_cmds=
- old_archive_from_expsyms_cmds=
- thread_safe_flag_spec=
- whole_archive_flag_spec=
- # include_expsyms should be a list of space-separated symbols to be *always*
- # included in the symbol list
- include_expsyms=
- # exclude_expsyms can be an extended regexp of symbols to exclude
- # it will be wrapped by ` (' and `)$', so one must not match beginning or
- # end of line. Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc',
- # as well as any symbol that contains `d'.
- exclude_expsyms='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'
- # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out
- # platforms (ab)use it in PIC code, but their linkers get confused if
- # the symbol is explicitly referenced. Since portable code cannot
- # rely on this symbol name, it's probably fine to never include it in
- # preloaded symbol tables.
- # Exclude shared library initialization/finalization symbols.
- extract_expsyms_cmds=
-
- case $host_os in
- cygwin* | mingw* | pw32* | cegcc*)
- # FIXME: the MSVC++ port hasn't been tested in a loooong time
- # When not using gcc, we currently assume that we are using
- # Microsoft Visual C++.
- if test "$GCC" != yes; then
- with_gnu_ld=no
- fi
- ;;
- interix*)
- # we just hope/assume this is gcc and not c89 (= MSVC++)
- with_gnu_ld=yes
- ;;
- openbsd*)
- with_gnu_ld=no
- ;;
- esac
-
- ld_shlibs=yes
-
- # On some targets, GNU ld is compatible enough with the native linker
- # that we're better off using the native interface for both.
- lt_use_gnu_ld_interface=no
- if test "$with_gnu_ld" = yes; then
- case $host_os in
- aix*)
- # The AIX port of GNU ld has always aspired to compatibility
- # with the native linker. However, as the warning in the GNU ld
- # block says, versions before 2.19.5* couldn't really create working
- # shared libraries, regardless of the interface used.
- case `$LD -v 2>&1` in
- *\ \(GNU\ Binutils\)\ 2.19.5*) ;;
- *\ \(GNU\ Binutils\)\ 2.[2-9]*) ;;
- *\ \(GNU\ Binutils\)\ [3-9]*) ;;
- *)
- lt_use_gnu_ld_interface=yes
- ;;
- esac
- ;;
- *)
- lt_use_gnu_ld_interface=yes
- ;;
- esac
- fi
-
- if test "$lt_use_gnu_ld_interface" = yes; then
- # If archive_cmds runs LD, not CC, wlarc should be empty
- wlarc='${wl}'
-
- # Set some defaults for GNU ld with shared library support. These
- # are reset later if shared libraries are not supported. Putting them
- # here allows them to be overridden if necessary.
- runpath_var=LD_RUN_PATH
- hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
- export_dynamic_flag_spec='${wl}--export-dynamic'
- # ancient GNU ld didn't support --whole-archive et. al.
- if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then
- whole_archive_flag_spec="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive'
- else
- whole_archive_flag_spec=
- fi
- supports_anon_versioning=no
- case `$LD -v 2>&1` in
- *GNU\ gold*) supports_anon_versioning=yes ;;
- *\ [01].* | *\ 2.[0-9].* | *\ 2.10.*) ;; # catch versions < 2.11
- *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ...
- *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ...
- *\ 2.11.*) ;; # other 2.11 versions
- *) supports_anon_versioning=yes ;;
- esac
-
- # See if GNU ld supports shared libraries.
- case $host_os in
- aix[3-9]*)
- # On AIX/PPC, the GNU linker is very broken
- if test "$host_cpu" != ia64; then
- ld_shlibs=no
- cat <<_LT_EOF 1>&2
-
-*** Warning: the GNU linker, at least up to release 2.19, is reported
-*** to be unable to reliably create shared libraries on AIX.
-*** Therefore, libtool is disabling shared libraries support. If you
-*** really care for shared libraries, you may want to install binutils
-*** 2.20 or above, or modify your PATH so that a non-GNU linker is found.
-*** You will then need to restart the configuration process.
-
-_LT_EOF
- fi
- ;;
-
- amigaos*)
- case $host_cpu in
- powerpc)
- # see comment about AmigaOS4 .so support
- archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
- archive_expsym_cmds=''
- ;;
- m68k)
- archive_cmds='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)'
- hardcode_libdir_flag_spec='-L$libdir'
- hardcode_minus_L=yes
- ;;
- esac
- ;;
-
- beos*)
- if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
- allow_undefined_flag=unsupported
- # Joseph Beckenbach <jrb3 at best.com> says some releases of gcc
- # support --undefined. This deserves some investigation. FIXME
- archive_cmds='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
- else
- ld_shlibs=no
- fi
- ;;
-
- cygwin* | mingw* | pw32* | cegcc*)
- # _LT_TAGVAR(hardcode_libdir_flag_spec, ) is actually meaningless,
- # as there is no search path for DLLs.
- hardcode_libdir_flag_spec='-L$libdir'
- export_dynamic_flag_spec='${wl}--export-all-symbols'
- allow_undefined_flag=unsupported
- always_export_symbols=no
- enable_shared_with_static_runtimes=yes
- export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/;s/^.*[ ]__nm__\([^ ]*\)[ ][^ ]*/\1 DATA/;/^I[ ]/d;/^[AITW][ ]/s/.* //'\'' | sort | uniq > $export_symbols'
- exclude_expsyms='[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname'
-
- if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then
- archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
- # If the export-symbols file already is a .def file (1st line
- # is EXPORTS), use it as is; otherwise, prepend...
- archive_expsym_cmds='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then
- cp $export_symbols $output_objdir/$soname.def;
- else
- echo EXPORTS > $output_objdir/$soname.def;
- cat $export_symbols >> $output_objdir/$soname.def;
- fi~
- $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
- else
- ld_shlibs=no
- fi
- ;;
-
- haiku*)
- archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
- link_all_deplibs=yes
- ;;
-
- interix[3-9]*)
- hardcode_direct=no
- hardcode_shlibpath_var=no
- hardcode_libdir_flag_spec='${wl}-rpath,$libdir'
- export_dynamic_flag_spec='${wl}-E'
- # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc.
- # Instead, shared libraries are loaded at an image base (0x10000000 by
- # default) and relocated if they conflict, which is a slow very memory
- # consuming and fragmenting process. To avoid this, we pick a random,
- # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link
- # time. Moving up from 0x10000000 also allows more sbrk(2) space.
- archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
- archive_expsym_cmds='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
- ;;
-
- gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu)
- tmp_diet=no
- if test "$host_os" = linux-dietlibc; then
- case $cc_basename in
- diet\ *) tmp_diet=yes;; # linux-dietlibc with static linking (!diet-dyn)
- esac
- fi
- if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \
- && test "$tmp_diet" = no
- then
- tmp_addflag=' $pic_flag'
- tmp_sharedflag='-shared'
- case $cc_basename,$host_cpu in
- pgcc*) # Portland Group C compiler
- whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
- tmp_addflag=' $pic_flag'
- ;;
- pgf77* | pgf90* | pgf95* | pgfortran*)
- # Portland Group f77 and f90 compilers
- whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
- tmp_addflag=' $pic_flag -Mnomain' ;;
- ecc*,ia64* | icc*,ia64*) # Intel C compiler on ia64
- tmp_addflag=' -i_dynamic' ;;
- efc*,ia64* | ifort*,ia64*) # Intel Fortran compiler on ia64
- tmp_addflag=' -i_dynamic -nofor_main' ;;
- ifc* | ifort*) # Intel Fortran compiler
- tmp_addflag=' -nofor_main' ;;
- lf95*) # Lahey Fortran 8.1
- whole_archive_flag_spec=
- tmp_sharedflag='--shared' ;;
- xl[cC]* | bgxl[cC]* | mpixl[cC]*) # IBM XL C 8.0 on PPC (deal with xlf below)
- tmp_sharedflag='-qmkshrobj'
- tmp_addflag= ;;
- nvcc*) # Cuda Compiler Driver 2.2
- whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
- compiler_needs_object=yes
- ;;
- esac
- case `$CC -V 2>&1 | sed 5q` in
- *Sun\ C*) # Sun C 5.9
- whole_archive_flag_spec='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
- compiler_needs_object=yes
- tmp_sharedflag='-G' ;;
- *Sun\ F*) # Sun Fortran 8.3
- tmp_sharedflag='-G' ;;
- esac
- archive_cmds='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-
- if test "x$supports_anon_versioning" = xyes; then
- archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~
- cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
- echo "local: *; };" >> $output_objdir/$libname.ver~
- $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib'
- fi
-
- case $cc_basename in
- xlf* | bgf* | bgxlf* | mpixlf*)
- # IBM XL Fortran 10.1 on PPC cannot create shared libs itself
- whole_archive_flag_spec='--whole-archive$convenience --no-whole-archive'
- hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
- archive_cmds='$LD -shared $libobjs $deplibs $linker_flags -soname $soname -o $lib'
- if test "x$supports_anon_versioning" = xyes; then
- archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~
- cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
- echo "local: *; };" >> $output_objdir/$libname.ver~
- $LD -shared $libobjs $deplibs $linker_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib'
- fi
- ;;
- esac
- else
- ld_shlibs=no
- fi
- ;;
-
- netbsd*)
- if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
- archive_cmds='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib'
- wlarc=
- else
- archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
- archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
- fi
- ;;
-
- solaris*)
- if $LD -v 2>&1 | $GREP 'BFD 2\.8' > /dev/null; then
- ld_shlibs=no
- cat <<_LT_EOF 1>&2
-
-*** Warning: The releases 2.8.* of the GNU linker cannot reliably
-*** create shared libraries on Solaris systems. Therefore, libtool
-*** is disabling shared libraries support. We urge you to upgrade GNU
-*** binutils to release 2.9.1 or newer. Another option is to modify
-*** your PATH or compiler configuration so that the native linker is
-*** used, and then restart.
-
-_LT_EOF
- elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
- archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
- archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
- else
- ld_shlibs=no
- fi
- ;;
-
- sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*)
- case `$LD -v 2>&1` in
- *\ [01].* | *\ 2.[0-9].* | *\ 2.1[0-5].*)
- ld_shlibs=no
- cat <<_LT_EOF 1>&2
-
-*** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not
-*** reliably create shared libraries on SCO systems. Therefore, libtool
-*** is disabling shared libraries support. We urge you to upgrade GNU
-*** binutils to release 2.16.91.0.3 or newer. Another option is to modify
-*** your PATH or compiler configuration so that the native linker is
-*** used, and then restart.
-
-_LT_EOF
- ;;
- *)
- # For security reasons, it is highly recommended that you always
- # use absolute paths for naming shared libraries, and exclude the
- # DT_RUNPATH tag from executables and libraries. But doing so
- # requires that you compile everything twice, which is a pain.
- if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
- hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
- archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
- archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
- else
- ld_shlibs=no
- fi
- ;;
- esac
- ;;
-
- sunos4*)
- archive_cmds='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags'
- wlarc=
- hardcode_direct=yes
- hardcode_shlibpath_var=no
- ;;
-
- *)
- if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
- archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
- archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
- else
- ld_shlibs=no
- fi
- ;;
- esac
-
- if test "$ld_shlibs" = no; then
- runpath_var=
- hardcode_libdir_flag_spec=
- export_dynamic_flag_spec=
- whole_archive_flag_spec=
- fi
- else
- # PORTME fill in a description of your system's linker (not GNU ld)
- case $host_os in
- aix3*)
- allow_undefined_flag=unsupported
- always_export_symbols=yes
- archive_expsym_cmds='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname'
- # Note: this linker hardcodes the directories in LIBPATH if there
- # are no directories specified by -L.
- hardcode_minus_L=yes
- if test "$GCC" = yes && test -z "$lt_prog_compiler_static"; then
- # Neither direct hardcoding nor static linking is supported with a
- # broken collect2.
- hardcode_direct=unsupported
- fi
- ;;
-
- aix[4-9]*)
- if test "$host_cpu" = ia64; then
- # On IA64, the linker does run time linking by default, so we don't
- # have to do anything special.
- aix_use_runtimelinking=no
- exp_sym_flag='-Bexport'
- no_entry_flag=""
- else
- # If we're using GNU nm, then we don't want the "-C" option.
- # -C means demangle to AIX nm, but means don't demangle with GNU nm
- # Also, AIX nm treats weak defined symbols like other global
- # defined symbols, whereas GNU nm marks them as "W".
- if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then
- export_symbols_cmds='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols'
- else
- export_symbols_cmds='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols'
- fi
- aix_use_runtimelinking=no
-
- # Test if we are trying to use run time linking or normal
- # AIX style linking. If -brtl is somewhere in LDFLAGS, we
- # need to do runtime linking.
- case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*)
- for ld_flag in $LDFLAGS; do
- if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then
- aix_use_runtimelinking=yes
- break
- fi
- done
- ;;
- esac
-
- exp_sym_flag='-bexport'
- no_entry_flag='-bnoentry'
- fi
-
- # When large executables or shared objects are built, AIX ld can
- # have problems creating the table of contents. If linking a library
- # or program results in "error TOC overflow" add -mminimal-toc to
- # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not
- # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS.
-
- archive_cmds=''
- hardcode_direct=yes
- hardcode_direct_absolute=yes
- hardcode_libdir_separator=':'
- link_all_deplibs=yes
- file_list_spec='${wl}-f,'
-
- if test "$GCC" = yes; then
- case $host_os in aix4.[012]|aix4.[012].*)
- # We only want to do this on AIX 4.2 and lower, the check
- # below for broken collect2 doesn't work under 4.3+
- collect2name=`${CC} -print-prog-name=collect2`
- if test -f "$collect2name" &&
- strings "$collect2name" | $GREP resolve_lib_name >/dev/null
- then
- # We have reworked collect2
- :
- else
- # We have old collect2
- hardcode_direct=unsupported
- # It fails to find uninstalled libraries when the uninstalled
- # path is not listed in the libpath. Setting hardcode_minus_L
- # to unsupported forces relinking
- hardcode_minus_L=yes
- hardcode_libdir_flag_spec='-L$libdir'
- hardcode_libdir_separator=
- fi
- ;;
- esac
- shared_flag='-shared'
- if test "$aix_use_runtimelinking" = yes; then
- shared_flag="$shared_flag "'${wl}-G'
- fi
- else
- # not using gcc
- if test "$host_cpu" = ia64; then
- # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release
- # chokes on -Wl,-G. The following line is correct:
- shared_flag='-G'
- else
- if test "$aix_use_runtimelinking" = yes; then
- shared_flag='${wl}-G'
- else
- shared_flag='${wl}-bM:SRE'
- fi
- fi
- fi
-
- export_dynamic_flag_spec='${wl}-bexpall'
- # It seems that -bexpall does not export symbols beginning with
- # underscore (_), so it is better to generate a list of symbols to export.
- always_export_symbols=yes
- if test "$aix_use_runtimelinking" = yes; then
- # Warning - without using the other runtime loading flags (-brtl),
- # -berok will link without error, but may produce a broken library.
- allow_undefined_flag='-berok'
- # Determine the default libpath from the value encoded in an
- # empty executable.
- if test "${lt_cv_aix_libpath+set}" = set; then
- aix_libpath=$lt_cv_aix_libpath
-else
- if ${lt_cv_aix_libpath_+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-
-int
-main ()
-{
-
- ;
- return 0;
-}
-_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
-
- lt_aix_libpath_sed='
- /Import File Strings/,/^$/ {
- /^0/ {
- s/^0 *\([^ ]*\) *$/\1/
- p
- }
- }'
- lt_cv_aix_libpath_=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
- # Check for a 64-bit object if we didn't find anything.
- if test -z "$lt_cv_aix_libpath_"; then
- lt_cv_aix_libpath_=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
- fi
-fi
-rm -f core conftest.err conftest.$ac_objext \
- conftest$ac_exeext conftest.$ac_ext
- if test -z "$lt_cv_aix_libpath_"; then
- lt_cv_aix_libpath_="/usr/lib:/lib"
- fi
-
-fi
-
- aix_libpath=$lt_cv_aix_libpath_
-fi
-
- hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath"
- archive_expsym_cmds='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag"
- else
- if test "$host_cpu" = ia64; then
- hardcode_libdir_flag_spec='${wl}-R $libdir:/usr/lib:/lib'
- allow_undefined_flag="-z nodefs"
- archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols"
- else
- # Determine the default libpath from the value encoded in an
- # empty executable.
- if test "${lt_cv_aix_libpath+set}" = set; then
- aix_libpath=$lt_cv_aix_libpath
-else
- if ${lt_cv_aix_libpath_+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-
-int
-main ()
-{
-
- ;
- return 0;
-}
-_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
-
- lt_aix_libpath_sed='
- /Import File Strings/,/^$/ {
- /^0/ {
- s/^0 *\([^ ]*\) *$/\1/
- p
- }
- }'
- lt_cv_aix_libpath_=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
- # Check for a 64-bit object if we didn't find anything.
- if test -z "$lt_cv_aix_libpath_"; then
- lt_cv_aix_libpath_=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
- fi
-fi
-rm -f core conftest.err conftest.$ac_objext \
- conftest$ac_exeext conftest.$ac_ext
- if test -z "$lt_cv_aix_libpath_"; then
- lt_cv_aix_libpath_="/usr/lib:/lib"
- fi
-
-fi
-
- aix_libpath=$lt_cv_aix_libpath_
-fi
-
- hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath"
- # Warning - without using the other run time loading flags,
- # -berok will link without error, but may produce a broken library.
- no_undefined_flag=' ${wl}-bernotok'
- allow_undefined_flag=' ${wl}-berok'
- if test "$with_gnu_ld" = yes; then
- # We only use this code for GNU lds that support --whole-archive.
- whole_archive_flag_spec='${wl}--whole-archive$convenience ${wl}--no-whole-archive'
- else
- # Exported symbols can be pulled into shared objects from archives
- whole_archive_flag_spec='$convenience'
- fi
- archive_cmds_need_lc=yes
- # This is similar to how AIX traditionally builds its shared libraries.
- archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname'
- fi
- fi
- ;;
-
- amigaos*)
- case $host_cpu in
- powerpc)
- # see comment about AmigaOS4 .so support
- archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
- archive_expsym_cmds=''
- ;;
- m68k)
- archive_cmds='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)'
- hardcode_libdir_flag_spec='-L$libdir'
- hardcode_minus_L=yes
- ;;
- esac
- ;;
-
- bsdi[45]*)
- export_dynamic_flag_spec=-rdynamic
- ;;
-
- cygwin* | mingw* | pw32* | cegcc*)
- # When not using gcc, we currently assume that we are using
- # Microsoft Visual C++.
- # hardcode_libdir_flag_spec is actually meaningless, as there is
- # no search path for DLLs.
- case $cc_basename in
- cl*)
- # Native MSVC
- hardcode_libdir_flag_spec=' '
- allow_undefined_flag=unsupported
- always_export_symbols=yes
- file_list_spec='@'
- # Tell ltmain to make .lib files, not .a files.
- libext=lib
- # Tell ltmain to make .dll files, not .so files.
- shrext_cmds=".dll"
- # FIXME: Setting linknames here is a bad hack.
- archive_cmds='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames='
- archive_expsym_cmds='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then
- sed -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp;
- else
- sed -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp;
- fi~
- $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~
- linknames='
- # The linker will not automatically build a static lib if we build a DLL.
- # _LT_TAGVAR(old_archive_from_new_cmds, )='true'
- enable_shared_with_static_runtimes=yes
- exclude_expsyms='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*'
- export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1,DATA/'\'' | $SED -e '\''/^[AITW][ ]/s/.*[ ]//'\'' | sort | uniq > $export_symbols'
- # Don't use ranlib
- old_postinstall_cmds='chmod 644 $oldlib'
- postlink_cmds='lt_outputfile="@OUTPUT@"~
- lt_tool_outputfile="@TOOL_OUTPUT@"~
- case $lt_outputfile in
- *.exe|*.EXE) ;;
- *)
- lt_outputfile="$lt_outputfile.exe"
- lt_tool_outputfile="$lt_tool_outputfile.exe"
- ;;
- esac~
- if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then
- $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1;
- $RM "$lt_outputfile.manifest";
- fi'
- ;;
- *)
- # Assume MSVC wrapper
- hardcode_libdir_flag_spec=' '
- allow_undefined_flag=unsupported
- # Tell ltmain to make .lib files, not .a files.
- libext=lib
- # Tell ltmain to make .dll files, not .so files.
- shrext_cmds=".dll"
- # FIXME: Setting linknames here is a bad hack.
- archive_cmds='$CC -o $lib $libobjs $compiler_flags `func_echo_all "$deplibs" | $SED '\''s/ -lc$//'\''` -link -dll~linknames='
- # The linker will automatically build a .lib file if we build a DLL.
- old_archive_from_new_cmds='true'
- # FIXME: Should let the user specify the lib program.
- old_archive_cmds='lib -OUT:$oldlib$oldobjs$old_deplibs'
- enable_shared_with_static_runtimes=yes
- ;;
- esac
- ;;
-
- darwin* | rhapsody*)
-
-
- archive_cmds_need_lc=no
- hardcode_direct=no
- hardcode_automatic=yes
- hardcode_shlibpath_var=unsupported
- if test "$lt_cv_ld_force_load" = "yes"; then
- whole_archive_flag_spec='`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience ${wl}-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`'
-
- else
- whole_archive_flag_spec=''
- fi
- link_all_deplibs=yes
- allow_undefined_flag="$_lt_dar_allow_undefined"
- case $cc_basename in
- ifort*) _lt_dar_can_shared=yes ;;
- *) _lt_dar_can_shared=$GCC ;;
- esac
- if test "$_lt_dar_can_shared" = "yes"; then
- output_verbose_link_cmd=func_echo_all
- archive_cmds="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}"
- module_cmds="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}"
- archive_expsym_cmds="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}"
- module_expsym_cmds="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}"
-
- else
- ld_shlibs=no
- fi
-
- ;;
-
- dgux*)
- archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
- hardcode_libdir_flag_spec='-L$libdir'
- hardcode_shlibpath_var=no
- ;;
-
- # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor
- # support. Future versions do this automatically, but an explicit c++rt0.o
- # does not break anything, and helps significantly (at the cost of a little
- # extra space).
- freebsd2.2*)
- archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o'
- hardcode_libdir_flag_spec='-R$libdir'
- hardcode_direct=yes
- hardcode_shlibpath_var=no
- ;;
-
- # Unfortunately, older versions of FreeBSD 2 do not have this feature.
- freebsd2.*)
- archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'
- hardcode_direct=yes
- hardcode_minus_L=yes
- hardcode_shlibpath_var=no
- ;;
-
- # FreeBSD 3 and greater uses gcc -shared to do shared libraries.
- freebsd* | dragonfly*)
- archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
- hardcode_libdir_flag_spec='-R$libdir'
- hardcode_direct=yes
- hardcode_shlibpath_var=no
- ;;
-
- hpux9*)
- if test "$GCC" = yes; then
- archive_cmds='$RM $output_objdir/$soname~$CC -shared $pic_flag ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
- else
- archive_cmds='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
- fi
- hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir'
- hardcode_libdir_separator=:
- hardcode_direct=yes
-
- # hardcode_minus_L: Not really in the search PATH,
- # but as the default location of the library.
- hardcode_minus_L=yes
- export_dynamic_flag_spec='${wl}-E'
- ;;
-
- hpux10*)
- if test "$GCC" = yes && test "$with_gnu_ld" = no; then
- archive_cmds='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
- else
- archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'
- fi
- if test "$with_gnu_ld" = no; then
- hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir'
- hardcode_libdir_separator=:
- hardcode_direct=yes
- hardcode_direct_absolute=yes
- export_dynamic_flag_spec='${wl}-E'
- # hardcode_minus_L: Not really in the search PATH,
- # but as the default location of the library.
- hardcode_minus_L=yes
- fi
- ;;
-
- hpux11*)
- if test "$GCC" = yes && test "$with_gnu_ld" = no; then
- case $host_cpu in
- hppa*64*)
- archive_cmds='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
- ;;
- ia64*)
- archive_cmds='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
- ;;
- *)
- archive_cmds='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
- ;;
- esac
- else
- case $host_cpu in
- hppa*64*)
- archive_cmds='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
- ;;
- ia64*)
- archive_cmds='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
- ;;
- *)
-
- # Older versions of the 11.00 compiler do not understand -b yet
- # (HP92453-01 A.11.01.20 doesn't, HP92453-01 B.11.X.35175-35176.GP does)
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC understands -b" >&5
-$as_echo_n "checking if $CC understands -b... " >&6; }
-if ${lt_cv_prog_compiler__b+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- lt_cv_prog_compiler__b=no
- save_LDFLAGS="$LDFLAGS"
- LDFLAGS="$LDFLAGS -b"
- echo "$lt_simple_link_test_code" > conftest.$ac_ext
- if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then
- # The linker can only warn and ignore the option if not recognized
- # So say no if there are warnings
- if test -s conftest.err; then
- # Append any errors to the config.log.
- cat conftest.err 1>&5
- $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp
- $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
- if diff conftest.exp conftest.er2 >/dev/null; then
- lt_cv_prog_compiler__b=yes
- fi
- else
- lt_cv_prog_compiler__b=yes
- fi
- fi
- $RM -r conftest*
- LDFLAGS="$save_LDFLAGS"
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler__b" >&5
-$as_echo "$lt_cv_prog_compiler__b" >&6; }
-
-if test x"$lt_cv_prog_compiler__b" = xyes; then
- archive_cmds='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
-else
- archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'
-fi
-
- ;;
- esac
- fi
- if test "$with_gnu_ld" = no; then
- hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir'
- hardcode_libdir_separator=:
-
- case $host_cpu in
- hppa*64*|ia64*)
- hardcode_direct=no
- hardcode_shlibpath_var=no
- ;;
- *)
- hardcode_direct=yes
- hardcode_direct_absolute=yes
- export_dynamic_flag_spec='${wl}-E'
-
- # hardcode_minus_L: Not really in the search PATH,
- # but as the default location of the library.
- hardcode_minus_L=yes
- ;;
- esac
- fi
- ;;
-
- irix5* | irix6* | nonstopux*)
- if test "$GCC" = yes; then
- archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
- # Try to use the -exported_symbol ld option, if it does not
- # work, assume that -exports_file does not work either and
- # implicitly export all symbols.
- # This should be the same for all languages, so no per-tag cache variable.
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $host_os linker accepts -exported_symbol" >&5
-$as_echo_n "checking whether the $host_os linker accepts -exported_symbol... " >&6; }
-if ${lt_cv_irix_exported_symbol+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- save_LDFLAGS="$LDFLAGS"
- LDFLAGS="$LDFLAGS -shared ${wl}-exported_symbol ${wl}foo ${wl}-update_registry ${wl}/dev/null"
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-int foo (void) { return 0; }
-_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
- lt_cv_irix_exported_symbol=yes
-else
- lt_cv_irix_exported_symbol=no
-fi
-rm -f core conftest.err conftest.$ac_objext \
- conftest$ac_exeext conftest.$ac_ext
- LDFLAGS="$save_LDFLAGS"
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_irix_exported_symbol" >&5
-$as_echo "$lt_cv_irix_exported_symbol" >&6; }
- if test "$lt_cv_irix_exported_symbol" = yes; then
- archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations ${wl}-exports_file ${wl}$export_symbols -o $lib'
- fi
- else
- archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
- archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -exports_file $export_symbols -o $lib'
- fi
- archive_cmds_need_lc='no'
- hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
- hardcode_libdir_separator=:
- inherit_rpath=yes
- link_all_deplibs=yes
- ;;
-
- netbsd*)
- if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
- archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out
- else
- archive_cmds='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF
- fi
- hardcode_libdir_flag_spec='-R$libdir'
- hardcode_direct=yes
- hardcode_shlibpath_var=no
- ;;
-
- newsos6)
- archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
- hardcode_direct=yes
- hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
- hardcode_libdir_separator=:
- hardcode_shlibpath_var=no
- ;;
-
- *nto* | *qnx*)
- ;;
-
- openbsd*)
- if test -f /usr/libexec/ld.so; then
- hardcode_direct=yes
- hardcode_shlibpath_var=no
- hardcode_direct_absolute=yes
- if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
- archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
- archive_expsym_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols'
- hardcode_libdir_flag_spec='${wl}-rpath,$libdir'
- export_dynamic_flag_spec='${wl}-E'
- else
- case $host_os in
- openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*)
- archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'
- hardcode_libdir_flag_spec='-R$libdir'
- ;;
- *)
- archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
- hardcode_libdir_flag_spec='${wl}-rpath,$libdir'
- ;;
- esac
- fi
- else
- ld_shlibs=no
- fi
- ;;
-
- os2*)
- hardcode_libdir_flag_spec='-L$libdir'
- hardcode_minus_L=yes
- allow_undefined_flag=unsupported
- archive_cmds='$ECHO "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~echo DATA >> $output_objdir/$libname.def~echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def'
- old_archive_from_new_cmds='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def'
- ;;
-
- osf3*)
- if test "$GCC" = yes; then
- allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*'
- archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
- else
- allow_undefined_flag=' -expect_unresolved \*'
- archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
- fi
- archive_cmds_need_lc='no'
- hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
- hardcode_libdir_separator=:
- ;;
-
- osf4* | osf5*) # as osf3* with the addition of -msym flag
- if test "$GCC" = yes; then
- allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*'
- archive_cmds='$CC -shared${allow_undefined_flag} $pic_flag $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
- hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
- else
- allow_undefined_flag=' -expect_unresolved \*'
- archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
- archive_expsym_cmds='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; printf "%s\\n" "-hidden">> $lib.exp~
- $CC -shared${allow_undefined_flag} ${wl}-input ${wl}$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~$RM $lib.exp'
-
- # Both c and cxx compiler support -rpath directly
- hardcode_libdir_flag_spec='-rpath $libdir'
- fi
- archive_cmds_need_lc='no'
- hardcode_libdir_separator=:
- ;;
-
- solaris*)
- no_undefined_flag=' -z defs'
- if test "$GCC" = yes; then
- wlarc='${wl}'
- archive_cmds='$CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
- archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
- $CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp'
- else
- case `$CC -V 2>&1` in
- *"Compilers 5.0"*)
- wlarc=''
- archive_cmds='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags'
- archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
- $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp'
- ;;
- *)
- wlarc='${wl}'
- archive_cmds='$CC -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $compiler_flags'
- archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
- $CC -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp'
- ;;
- esac
- fi
- hardcode_libdir_flag_spec='-R$libdir'
- hardcode_shlibpath_var=no
- case $host_os in
- solaris2.[0-5] | solaris2.[0-5].*) ;;
- *)
- # The compiler driver will combine and reorder linker options,
- # but understands `-z linker_flag'. GCC discards it without `$wl',
- # but is careful enough not to reorder.
- # Supported since Solaris 2.6 (maybe 2.5.1?)
- if test "$GCC" = yes; then
- whole_archive_flag_spec='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract'
- else
- whole_archive_flag_spec='-z allextract$convenience -z defaultextract'
- fi
- ;;
- esac
- link_all_deplibs=yes
- ;;
-
- sunos4*)
- if test "x$host_vendor" = xsequent; then
- # Use $CC to link under sequent, because it throws in some extra .o
- # files that make .init and .fini sections work.
- archive_cmds='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags'
- else
- archive_cmds='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags'
- fi
- hardcode_libdir_flag_spec='-L$libdir'
- hardcode_direct=yes
- hardcode_minus_L=yes
- hardcode_shlibpath_var=no
- ;;
-
- sysv4)
- case $host_vendor in
- sni)
- archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
- hardcode_direct=yes # is this really true???
- ;;
- siemens)
- ## LD is ld it makes a PLAMLIB
- ## CC just makes a GrossModule.
- archive_cmds='$LD -G -o $lib $libobjs $deplibs $linker_flags'
- reload_cmds='$CC -r -o $output$reload_objs'
- hardcode_direct=no
- ;;
- motorola)
- archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
- hardcode_direct=no #Motorola manual says yes, but my tests say they lie
- ;;
- esac
- runpath_var='LD_RUN_PATH'
- hardcode_shlibpath_var=no
- ;;
-
- sysv4.3*)
- archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
- hardcode_shlibpath_var=no
- export_dynamic_flag_spec='-Bexport'
- ;;
-
- sysv4*MP*)
- if test -d /usr/nec; then
- archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
- hardcode_shlibpath_var=no
- runpath_var=LD_RUN_PATH
- hardcode_runpath_var=yes
- ld_shlibs=yes
- fi
- ;;
-
- sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*)
- no_undefined_flag='${wl}-z,text'
- archive_cmds_need_lc=no
- hardcode_shlibpath_var=no
- runpath_var='LD_RUN_PATH'
-
- if test "$GCC" = yes; then
- archive_cmds='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
- archive_expsym_cmds='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
- else
- archive_cmds='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
- archive_expsym_cmds='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
- fi
- ;;
-
- sysv5* | sco3.2v5* | sco5v6*)
- # Note: We can NOT use -z defs as we might desire, because we do not
- # link with -lc, and that would cause any symbols used from libc to
- # always be unresolved, which means just about no library would
- # ever link correctly. If we're not using GNU ld we use -z text
- # though, which does catch some bad symbols but isn't as heavy-handed
- # as -z defs.
- no_undefined_flag='${wl}-z,text'
- allow_undefined_flag='${wl}-z,nodefs'
- archive_cmds_need_lc=no
- hardcode_shlibpath_var=no
- hardcode_libdir_flag_spec='${wl}-R,$libdir'
- hardcode_libdir_separator=':'
- link_all_deplibs=yes
- export_dynamic_flag_spec='${wl}-Bexport'
- runpath_var='LD_RUN_PATH'
-
- if test "$GCC" = yes; then
- archive_cmds='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
- archive_expsym_cmds='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
- else
- archive_cmds='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
- archive_expsym_cmds='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
- fi
- ;;
-
- uts4*)
- archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
- hardcode_libdir_flag_spec='-L$libdir'
- hardcode_shlibpath_var=no
- ;;
-
- *)
- ld_shlibs=no
- ;;
- esac
-
- if test x$host_vendor = xsni; then
- case $host in
- sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*)
- export_dynamic_flag_spec='${wl}-Blargedynsym'
- ;;
- esac
- fi
- fi
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs" >&5
-$as_echo "$ld_shlibs" >&6; }
-test "$ld_shlibs" = no && can_build_shared=no
-
-with_gnu_ld=$with_gnu_ld
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#
-# Do we need to explicitly link libc?
-#
-case "x$archive_cmds_need_lc" in
-x|xyes)
- # Assume -lc should be added
- archive_cmds_need_lc=yes
-
- if test "$enable_shared" = yes && test "$GCC" = yes; then
- case $archive_cmds in
- *'~'*)
- # FIXME: we may have to deal with multi-command sequences.
- ;;
- '$CC '*)
- # Test whether the compiler implicitly links with -lc since on some
- # systems, -lgcc has to come before -lc. If gcc already passes -lc
- # to ld, don't add -lc before -lgcc.
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -lc should be explicitly linked in" >&5
-$as_echo_n "checking whether -lc should be explicitly linked in... " >&6; }
-if ${lt_cv_archive_cmds_need_lc+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- $RM conftest*
- echo "$lt_simple_compile_test_code" > conftest.$ac_ext
-
- if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
- (eval $ac_compile) 2>&5
- ac_status=$?
- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
- test $ac_status = 0; } 2>conftest.err; then
- soname=conftest
- lib=conftest
- libobjs=conftest.$ac_objext
- deplibs=
- wl=$lt_prog_compiler_wl
- pic_flag=$lt_prog_compiler_pic
- compiler_flags=-v
- linker_flags=-v
- verstring=
- output_objdir=.
- libname=conftest
- lt_save_allow_undefined_flag=$allow_undefined_flag
- allow_undefined_flag=
- if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1\""; } >&5
- (eval $archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) 2>&5
- ac_status=$?
- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
- test $ac_status = 0; }
- then
- lt_cv_archive_cmds_need_lc=no
- else
- lt_cv_archive_cmds_need_lc=yes
- fi
- allow_undefined_flag=$lt_save_allow_undefined_flag
- else
- cat conftest.err 1>&5
- fi
- $RM conftest*
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_archive_cmds_need_lc" >&5
-$as_echo "$lt_cv_archive_cmds_need_lc" >&6; }
- archive_cmds_need_lc=$lt_cv_archive_cmds_need_lc
- ;;
- esac
- fi
- ;;
-esac
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics" >&5
-$as_echo_n "checking dynamic linker characteristics... " >&6; }
-
-if test "$GCC" = yes; then
- case $host_os in
- darwin*) lt_awk_arg="/^libraries:/,/LR/" ;;
- *) lt_awk_arg="/^libraries:/" ;;
- esac
- case $host_os in
- mingw* | cegcc*) lt_sed_strip_eq="s,=\([A-Za-z]:\),\1,g" ;;
- *) lt_sed_strip_eq="s,=/,/,g" ;;
- esac
- lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e $lt_sed_strip_eq`
- case $lt_search_path_spec in
- *\;*)
- # if the path contains ";" then we assume it to be the separator
- # otherwise default to the standard path separator (i.e. ":") - it is
- # assumed that no part of a normal pathname contains ";" but that should
- # okay in the real world where ";" in dirpaths is itself problematic.
- lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED 's/;/ /g'`
- ;;
- *)
- lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED "s/$PATH_SEPARATOR/ /g"`
- ;;
- esac
- # Ok, now we have the path, separated by spaces, we can step through it
- # and add multilib dir if necessary.
- lt_tmp_lt_search_path_spec=
- lt_multi_os_dir=`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null`
- for lt_sys_path in $lt_search_path_spec; do
- if test -d "$lt_sys_path/$lt_multi_os_dir"; then
- lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path/$lt_multi_os_dir"
- else
- test -d "$lt_sys_path" && \
- lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path"
- fi
- done
- lt_search_path_spec=`$ECHO "$lt_tmp_lt_search_path_spec" | awk '
-BEGIN {RS=" "; FS="/|\n";} {
- lt_foo="";
- lt_count=0;
- for (lt_i = NF; lt_i > 0; lt_i--) {
- if ($lt_i != "" && $lt_i != ".") {
- if ($lt_i == "..") {
- lt_count++;
- } else {
- if (lt_count == 0) {
- lt_foo="/" $lt_i lt_foo;
- } else {
- lt_count--;
- }
- }
- }
- }
- if (lt_foo != "") { lt_freq[lt_foo]++; }
- if (lt_freq[lt_foo] == 1) { print lt_foo; }
-}'`
- # AWK program above erroneously prepends '/' to C:/dos/paths
- # for these hosts.
- case $host_os in
- mingw* | cegcc*) lt_search_path_spec=`$ECHO "$lt_search_path_spec" |\
- $SED 's,/\([A-Za-z]:\),\1,g'` ;;
- esac
- sys_lib_search_path_spec=`$ECHO "$lt_search_path_spec" | $lt_NL2SP`
-else
- sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib"
-fi
-library_names_spec=
-libname_spec='lib$name'
-soname_spec=
-shrext_cmds=".so"
-postinstall_cmds=
-postuninstall_cmds=
-finish_cmds=
-finish_eval=
-shlibpath_var=
-shlibpath_overrides_runpath=unknown
-version_type=none
-dynamic_linker="$host_os ld.so"
-sys_lib_dlsearch_path_spec="/lib /usr/lib"
-need_lib_prefix=unknown
-hardcode_into_libs=no
-
-# when you set need_version to no, make sure it does not cause -set_version
-# flags to be left without arguments
-need_version=unknown
-
-case $host_os in
-aix3*)
- version_type=linux # correct to gnu/linux during the next big refactor
- library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a'
- shlibpath_var=LIBPATH
-
- # AIX 3 has no versioning support, so we append a major version to the name.
- soname_spec='${libname}${release}${shared_ext}$major'
- ;;
-
-aix[4-9]*)
- version_type=linux # correct to gnu/linux during the next big refactor
- need_lib_prefix=no
- need_version=no
- hardcode_into_libs=yes
- if test "$host_cpu" = ia64; then
- # AIX 5 supports IA64
- library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}'
- shlibpath_var=LD_LIBRARY_PATH
- else
- # With GCC up to 2.95.x, collect2 would create an import file
- # for dependence libraries. The import file would start with
- # the line `#! .'. This would cause the generated library to
- # depend on `.', always an invalid library. This was fixed in
- # development snapshots of GCC prior to 3.0.
- case $host_os in
- aix4 | aix4.[01] | aix4.[01].*)
- if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)'
- echo ' yes '
- echo '#endif'; } | ${CC} -E - | $GREP yes > /dev/null; then
- :
- else
- can_build_shared=no
- fi
- ;;
- esac
- # AIX (on Power*) has no versioning support, so currently we can not hardcode correct
- # soname into executable. Probably we can add versioning support to
- # collect2, so additional links can be useful in future.
- if test "$aix_use_runtimelinking" = yes; then
- # If using run time linking (on AIX 4.2 or later) use lib<name>.so
- # instead of lib<name>.a to let people know that these are not
- # typical AIX shared libraries.
- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
- else
- # We preserve .a as extension for shared libraries through AIX4.2
- # and later when we are not doing run time linking.
- library_names_spec='${libname}${release}.a $libname.a'
- soname_spec='${libname}${release}${shared_ext}$major'
- fi
- shlibpath_var=LIBPATH
- fi
- ;;
-
-amigaos*)
- case $host_cpu in
- powerpc)
- # Since July 2007 AmigaOS4 officially supports .so libraries.
- # When compiling the executable, add -use-dynld -Lsobjs: to the compileline.
- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
- ;;
- m68k)
- library_names_spec='$libname.ixlibrary $libname.a'
- # Create ${libname}_ixlibrary.a entries in /sys/libs.
- finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done'
- ;;
- esac
- ;;
-
-beos*)
- library_names_spec='${libname}${shared_ext}'
- dynamic_linker="$host_os ld.so"
- shlibpath_var=LIBRARY_PATH
- ;;
-
-bsdi[45]*)
- version_type=linux # correct to gnu/linux during the next big refactor
- need_version=no
- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
- soname_spec='${libname}${release}${shared_ext}$major'
- finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir'
- shlibpath_var=LD_LIBRARY_PATH
- sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib"
- sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib"
- # the default ld.so.conf also contains /usr/contrib/lib and
- # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow
- # libtool to hard-code these into programs
- ;;
-
-cygwin* | mingw* | pw32* | cegcc*)
- version_type=windows
- shrext_cmds=".dll"
- need_version=no
- need_lib_prefix=no
-
- case $GCC,$cc_basename in
- yes,*)
- # gcc
- library_names_spec='$libname.dll.a'
- # DLL is installed to $(libdir)/../bin by postinstall_cmds
- postinstall_cmds='base_file=`basename \${file}`~
- dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~
- dldir=$destdir/`dirname \$dlpath`~
- test -d \$dldir || mkdir -p \$dldir~
- $install_prog $dir/$dlname \$dldir/$dlname~
- chmod a+x \$dldir/$dlname~
- if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then
- eval '\''$striplib \$dldir/$dlname'\'' || exit \$?;
- fi'
- postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~
- dlpath=$dir/\$dldll~
- $RM \$dlpath'
- shlibpath_overrides_runpath=yes
-
- case $host_os in
- cygwin*)
- # Cygwin DLLs use 'cyg' prefix rather than 'lib'
- soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
-
- sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/lib/w32api"
- ;;
- mingw* | cegcc*)
- # MinGW DLLs use traditional 'lib' prefix
- soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
- ;;
- pw32*)
- # pw32 DLLs use 'pw' prefix rather than 'lib'
- library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
- ;;
- esac
- dynamic_linker='Win32 ld.exe'
- ;;
-
- *,cl*)
- # Native MSVC
- libname_spec='$name'
- soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
- library_names_spec='${libname}.dll.lib'
-
- case $build_os in
- mingw*)
- sys_lib_search_path_spec=
- lt_save_ifs=$IFS
- IFS=';'
- for lt_path in $LIB
- do
- IFS=$lt_save_ifs
- # Let DOS variable expansion print the short 8.3 style file name.
- lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"`
- sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path"
- done
- IFS=$lt_save_ifs
- # Convert to MSYS style.
- sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([a-zA-Z]\\):| /\\1|g' -e 's|^ ||'`
- ;;
- cygwin*)
- # Convert to unix form, then to dos form, then back to unix form
- # but this time dos style (no spaces!) so that the unix form looks
- # like /cygdrive/c/PROGRA~1:/cygdr...
- sys_lib_search_path_spec=`cygpath --path --unix "$LIB"`
- sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null`
- sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"`
- ;;
- *)
- sys_lib_search_path_spec="$LIB"
- if $ECHO "$sys_lib_search_path_spec" | $GREP ';[c-zC-Z]:/' >/dev/null; then
- # It is most probably a Windows format PATH.
- sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'`
- else
- sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"`
- fi
- # FIXME: find the short name or the path components, as spaces are
- # common. (e.g. "Program Files" -> "PROGRA~1")
- ;;
- esac
-
- # DLL is installed to $(libdir)/../bin by postinstall_cmds
- postinstall_cmds='base_file=`basename \${file}`~
- dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~
- dldir=$destdir/`dirname \$dlpath`~
- test -d \$dldir || mkdir -p \$dldir~
- $install_prog $dir/$dlname \$dldir/$dlname'
- postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~
- dlpath=$dir/\$dldll~
- $RM \$dlpath'
- shlibpath_overrides_runpath=yes
- dynamic_linker='Win32 link.exe'
- ;;
-
- *)
- # Assume MSVC wrapper
- library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib'
- dynamic_linker='Win32 ld.exe'
- ;;
- esac
- # FIXME: first we should search . and the directory the executable is in
- shlibpath_var=PATH
- ;;
-
-darwin* | rhapsody*)
- dynamic_linker="$host_os dyld"
- version_type=darwin
- need_lib_prefix=no
- need_version=no
- library_names_spec='${libname}${release}${major}$shared_ext ${libname}$shared_ext'
- soname_spec='${libname}${release}${major}$shared_ext'
- shlibpath_overrides_runpath=yes
- shlibpath_var=DYLD_LIBRARY_PATH
- shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`'
-
- sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/local/lib"
- sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib'
- ;;
-
-dgux*)
- version_type=linux # correct to gnu/linux during the next big refactor
- need_lib_prefix=no
- need_version=no
- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext'
- soname_spec='${libname}${release}${shared_ext}$major'
- shlibpath_var=LD_LIBRARY_PATH
- ;;
-
-freebsd* | dragonfly*)
- # DragonFly does not have aout. When/if they implement a new
- # versioning mechanism, adjust this.
- if test -x /usr/bin/objformat; then
- objformat=`/usr/bin/objformat`
- else
- case $host_os in
- freebsd[23].*) objformat=aout ;;
- *) objformat=elf ;;
- esac
- fi
- # Handle Gentoo/FreeBSD as it was Linux
- case $host_vendor in
- gentoo)
- version_type=linux ;;
- *)
- version_type=freebsd-$objformat ;;
- esac
-
- case $version_type in
- freebsd-elf*)
- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}'
- need_version=no
- need_lib_prefix=no
- ;;
- freebsd-*)
- library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix'
- need_version=yes
- ;;
- linux)
- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
- soname_spec='${libname}${release}${shared_ext}$major'
- need_lib_prefix=no
- need_version=no
- ;;
- esac
- shlibpath_var=LD_LIBRARY_PATH
- case $host_os in
- freebsd2.*)
- shlibpath_overrides_runpath=yes
- ;;
- freebsd3.[01]* | freebsdelf3.[01]*)
- shlibpath_overrides_runpath=yes
- hardcode_into_libs=yes
- ;;
- freebsd3.[2-9]* | freebsdelf3.[2-9]* | \
- freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1)
- shlibpath_overrides_runpath=no
- hardcode_into_libs=yes
- ;;
- *) # from 4.6 on, and DragonFly
- shlibpath_overrides_runpath=yes
- hardcode_into_libs=yes
- ;;
- esac
- ;;
-
-gnu*)
- version_type=linux # correct to gnu/linux during the next big refactor
- need_lib_prefix=no
- need_version=no
- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}'
- soname_spec='${libname}${release}${shared_ext}$major'
- shlibpath_var=LD_LIBRARY_PATH
- shlibpath_overrides_runpath=no
- hardcode_into_libs=yes
- ;;
-
-haiku*)
- version_type=linux # correct to gnu/linux during the next big refactor
- need_lib_prefix=no
- need_version=no
- dynamic_linker="$host_os runtime_loader"
- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}'
- soname_spec='${libname}${release}${shared_ext}$major'
- shlibpath_var=LIBRARY_PATH
- shlibpath_overrides_runpath=yes
- sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib'
- hardcode_into_libs=yes
- ;;
-
-hpux9* | hpux10* | hpux11*)
- # Give a soname corresponding to the major version so that dld.sl refuses to
- # link against other versions.
- version_type=sunos
- need_lib_prefix=no
- need_version=no
- case $host_cpu in
- ia64*)
- shrext_cmds='.so'
- hardcode_into_libs=yes
- dynamic_linker="$host_os dld.so"
- shlibpath_var=LD_LIBRARY_PATH
- shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
- soname_spec='${libname}${release}${shared_ext}$major'
- if test "X$HPUX_IA64_MODE" = X32; then
- sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib"
- else
- sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64"
- fi
- sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
- ;;
- hppa*64*)
- shrext_cmds='.sl'
- hardcode_into_libs=yes
- dynamic_linker="$host_os dld.sl"
- shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH
- shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
- soname_spec='${libname}${release}${shared_ext}$major'
- sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64"
- sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
- ;;
- *)
- shrext_cmds='.sl'
- dynamic_linker="$host_os dld.sl"
- shlibpath_var=SHLIB_PATH
- shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH
- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
- soname_spec='${libname}${release}${shared_ext}$major'
- ;;
- esac
- # HP-UX runs *really* slowly unless shared libraries are mode 555, ...
- postinstall_cmds='chmod 555 $lib'
- # or fails outright, so override atomically:
- install_override_mode=555
- ;;
-
-interix[3-9]*)
- version_type=linux # correct to gnu/linux during the next big refactor
- need_lib_prefix=no
- need_version=no
- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
- soname_spec='${libname}${release}${shared_ext}$major'
- dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)'
- shlibpath_var=LD_LIBRARY_PATH
- shlibpath_overrides_runpath=no
- hardcode_into_libs=yes
- ;;
-
-irix5* | irix6* | nonstopux*)
- case $host_os in
- nonstopux*) version_type=nonstopux ;;
- *)
- if test "$lt_cv_prog_gnu_ld" = yes; then
- version_type=linux # correct to gnu/linux during the next big refactor
- else
- version_type=irix
- fi ;;
- esac
- need_lib_prefix=no
- need_version=no
- soname_spec='${libname}${release}${shared_ext}$major'
- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}'
- case $host_os in
- irix5* | nonstopux*)
- libsuff= shlibsuff=
- ;;
- *)
- case $LD in # libtool.m4 will add one of these switches to LD
- *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ")
- libsuff= shlibsuff= libmagic=32-bit;;
- *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ")
- libsuff=32 shlibsuff=N32 libmagic=N32;;
- *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ")
- libsuff=64 shlibsuff=64 libmagic=64-bit;;
- *) libsuff= shlibsuff= libmagic=never-match;;
- esac
- ;;
- esac
- shlibpath_var=LD_LIBRARY${shlibsuff}_PATH
- shlibpath_overrides_runpath=no
- sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}"
- sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}"
- hardcode_into_libs=yes
- ;;
-
-# No shared lib support for Linux oldld, aout, or coff.
-linux*oldld* | linux*aout* | linux*coff*)
- dynamic_linker=no
- ;;
-
-# This must be glibc/ELF.
-linux* | k*bsd*-gnu | kopensolaris*-gnu)
- version_type=linux # correct to gnu/linux during the next big refactor
- need_lib_prefix=no
- need_version=no
- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
- soname_spec='${libname}${release}${shared_ext}$major'
- finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir'
- shlibpath_var=LD_LIBRARY_PATH
- shlibpath_overrides_runpath=no
-
- # Some binutils ld are patched to set DT_RUNPATH
- if ${lt_cv_shlibpath_overrides_runpath+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- lt_cv_shlibpath_overrides_runpath=no
- save_LDFLAGS=$LDFLAGS
- save_libdir=$libdir
- eval "libdir=/foo; wl=\"$lt_prog_compiler_wl\"; \
- LDFLAGS=\"\$LDFLAGS $hardcode_libdir_flag_spec\""
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-
-int
-main ()
-{
-
- ;
- return 0;
-}
-_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
- if ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null; then :
- lt_cv_shlibpath_overrides_runpath=yes
-fi
-fi
-rm -f core conftest.err conftest.$ac_objext \
- conftest$ac_exeext conftest.$ac_ext
- LDFLAGS=$save_LDFLAGS
- libdir=$save_libdir
-
-fi
-
- shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath
-
- # This implies no fast_install, which is unacceptable.
- # Some rework will be needed to allow for fast_install
- # before this can be enabled.
- hardcode_into_libs=yes
-
- # Append ld.so.conf contents to the search path
- if test -f /etc/ld.so.conf; then
- lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '`
- sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra"
- fi
-
- # We used to test for /lib/ld.so.1 and disable shared libraries on
- # powerpc, because MkLinux only supported shared libraries with the
- # GNU dynamic linker. Since this was broken with cross compilers,
- # most powerpc-linux boxes support dynamic linking these days and
- # people can always --disable-shared, the test was removed, and we
- # assume the GNU/Linux dynamic linker is in use.
- dynamic_linker='GNU/Linux ld.so'
- ;;
-
-netbsd*)
- version_type=sunos
- need_lib_prefix=no
- need_version=no
- if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
- finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
- dynamic_linker='NetBSD (a.out) ld.so'
- else
- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
- soname_spec='${libname}${release}${shared_ext}$major'
- dynamic_linker='NetBSD ld.elf_so'
- fi
- shlibpath_var=LD_LIBRARY_PATH
- shlibpath_overrides_runpath=yes
- hardcode_into_libs=yes
- ;;
-
-newsos6)
- version_type=linux # correct to gnu/linux during the next big refactor
- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
- shlibpath_var=LD_LIBRARY_PATH
- shlibpath_overrides_runpath=yes
- ;;
-
-*nto* | *qnx*)
- version_type=qnx
- need_lib_prefix=no
- need_version=no
- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
- soname_spec='${libname}${release}${shared_ext}$major'
- shlibpath_var=LD_LIBRARY_PATH
- shlibpath_overrides_runpath=no
- hardcode_into_libs=yes
- dynamic_linker='ldqnx.so'
- ;;
-
-openbsd*)
- version_type=sunos
- sys_lib_dlsearch_path_spec="/usr/lib"
- need_lib_prefix=no
- # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs.
- case $host_os in
- openbsd3.3 | openbsd3.3.*) need_version=yes ;;
- *) need_version=no ;;
- esac
- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
- finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
- shlibpath_var=LD_LIBRARY_PATH
- if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
- case $host_os in
- openbsd2.[89] | openbsd2.[89].*)
- shlibpath_overrides_runpath=no
- ;;
- *)
- shlibpath_overrides_runpath=yes
- ;;
- esac
- else
- shlibpath_overrides_runpath=yes
- fi
- ;;
-
-os2*)
- libname_spec='$name'
- shrext_cmds=".dll"
- need_lib_prefix=no
- library_names_spec='$libname${shared_ext} $libname.a'
- dynamic_linker='OS/2 ld.exe'
- shlibpath_var=LIBPATH
- ;;
-
-osf3* | osf4* | osf5*)
- version_type=osf
- need_lib_prefix=no
- need_version=no
- soname_spec='${libname}${release}${shared_ext}$major'
- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
- shlibpath_var=LD_LIBRARY_PATH
- sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib"
- sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec"
- ;;
-
-rdos*)
- dynamic_linker=no
- ;;
-
-solaris*)
- version_type=linux # correct to gnu/linux during the next big refactor
- need_lib_prefix=no
- need_version=no
- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
- soname_spec='${libname}${release}${shared_ext}$major'
- shlibpath_var=LD_LIBRARY_PATH
- shlibpath_overrides_runpath=yes
- hardcode_into_libs=yes
- # ldd complains unless libraries are executable
- postinstall_cmds='chmod +x $lib'
- ;;
-
-sunos4*)
- version_type=sunos
- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
- finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir'
- shlibpath_var=LD_LIBRARY_PATH
- shlibpath_overrides_runpath=yes
- if test "$with_gnu_ld" = yes; then
- need_lib_prefix=no
- fi
- need_version=yes
- ;;
-
-sysv4 | sysv4.3*)
- version_type=linux # correct to gnu/linux during the next big refactor
- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
- soname_spec='${libname}${release}${shared_ext}$major'
- shlibpath_var=LD_LIBRARY_PATH
- case $host_vendor in
- sni)
- shlibpath_overrides_runpath=no
- need_lib_prefix=no
- runpath_var=LD_RUN_PATH
- ;;
- siemens)
- need_lib_prefix=no
- ;;
- motorola)
- need_lib_prefix=no
- need_version=no
- shlibpath_overrides_runpath=no
- sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib'
- ;;
- esac
- ;;
-
-sysv4*MP*)
- if test -d /usr/nec ;then
- version_type=linux # correct to gnu/linux during the next big refactor
- library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}'
- soname_spec='$libname${shared_ext}.$major'
- shlibpath_var=LD_LIBRARY_PATH
- fi
- ;;
-
-sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
- version_type=freebsd-elf
- need_lib_prefix=no
- need_version=no
- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}'
- soname_spec='${libname}${release}${shared_ext}$major'
- shlibpath_var=LD_LIBRARY_PATH
- shlibpath_overrides_runpath=yes
- hardcode_into_libs=yes
- if test "$with_gnu_ld" = yes; then
- sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib'
- else
- sys_lib_search_path_spec='/usr/ccs/lib /usr/lib'
- case $host_os in
- sco3.2v5*)
- sys_lib_search_path_spec="$sys_lib_search_path_spec /lib"
- ;;
- esac
- fi
- sys_lib_dlsearch_path_spec='/usr/lib'
- ;;
-
-tpf*)
- # TPF is a cross-target only. Preferred cross-host = GNU/Linux.
- version_type=linux # correct to gnu/linux during the next big refactor
- need_lib_prefix=no
- need_version=no
- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
- shlibpath_var=LD_LIBRARY_PATH
- shlibpath_overrides_runpath=no
- hardcode_into_libs=yes
- ;;
-
-uts4*)
- version_type=linux # correct to gnu/linux during the next big refactor
- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
- soname_spec='${libname}${release}${shared_ext}$major'
- shlibpath_var=LD_LIBRARY_PATH
- ;;
-
-*)
- dynamic_linker=no
- ;;
-esac
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $dynamic_linker" >&5
-$as_echo "$dynamic_linker" >&6; }
-test "$dynamic_linker" = no && can_build_shared=no
-
-variables_saved_for_relink="PATH $shlibpath_var $runpath_var"
-if test "$GCC" = yes; then
- variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH"
-fi
-
-if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then
- sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec"
-fi
-if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then
- sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec"
-fi
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to hardcode library paths into programs" >&5
-$as_echo_n "checking how to hardcode library paths into programs... " >&6; }
-hardcode_action=
-if test -n "$hardcode_libdir_flag_spec" ||
- test -n "$runpath_var" ||
- test "X$hardcode_automatic" = "Xyes" ; then
-
- # We can hardcode non-existent directories.
- if test "$hardcode_direct" != no &&
- # If the only mechanism to avoid hardcoding is shlibpath_var, we
- # have to relink, otherwise we might link with an installed library
- # when we should be linking with a yet-to-be-installed one
- ## test "$_LT_TAGVAR(hardcode_shlibpath_var, )" != no &&
- test "$hardcode_minus_L" != no; then
- # Linking always hardcodes the temporary library directory.
- hardcode_action=relink
- else
- # We can link without hardcoding, and we can hardcode nonexisting dirs.
- hardcode_action=immediate
- fi
-else
- # We cannot hardcode anything, or else we can only hardcode existing
- # directories.
- hardcode_action=unsupported
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $hardcode_action" >&5
-$as_echo "$hardcode_action" >&6; }
-
-if test "$hardcode_action" = relink ||
- test "$inherit_rpath" = yes; then
- # Fast installation is not supported
- enable_fast_install=no
-elif test "$shlibpath_overrides_runpath" = yes ||
- test "$enable_shared" = no; then
- # Fast installation is not necessary
- enable_fast_install=needless
-fi
-
-
-
-
-
-
- if test "x$enable_dlopen" != xyes; then
- enable_dlopen=unknown
- enable_dlopen_self=unknown
- enable_dlopen_self_static=unknown
-else
- lt_cv_dlopen=no
- lt_cv_dlopen_libs=
-
- case $host_os in
- beos*)
- lt_cv_dlopen="load_add_on"
- lt_cv_dlopen_libs=
- lt_cv_dlopen_self=yes
- ;;
-
- mingw* | pw32* | cegcc*)
- lt_cv_dlopen="LoadLibrary"
- lt_cv_dlopen_libs=
- ;;
-
- cygwin*)
- lt_cv_dlopen="dlopen"
- lt_cv_dlopen_libs=
- ;;
-
- darwin*)
- # if libdl is installed we need to link against it
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5
-$as_echo_n "checking for dlopen in -ldl... " >&6; }
-if ${ac_cv_lib_dl_dlopen+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- ac_check_lib_save_LIBS=$LIBS
-LIBS="-ldl $LIBS"
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-
-/* Override any GCC internal prototype to avoid an error.
- Use char because int might match the return type of a GCC
- builtin and then its argument prototype would still apply. */
-#ifdef __cplusplus
-extern "C"
-#endif
-char dlopen ();
-int
-main ()
-{
-return dlopen ();
- ;
- return 0;
-}
-_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
- ac_cv_lib_dl_dlopen=yes
-else
- ac_cv_lib_dl_dlopen=no
-fi
-rm -f core conftest.err conftest.$ac_objext \
- conftest$ac_exeext conftest.$ac_ext
-LIBS=$ac_check_lib_save_LIBS
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5
-$as_echo "$ac_cv_lib_dl_dlopen" >&6; }
-if test "x$ac_cv_lib_dl_dlopen" = xyes; then :
- lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"
-else
-
- lt_cv_dlopen="dyld"
- lt_cv_dlopen_libs=
- lt_cv_dlopen_self=yes
-
-fi
-
- ;;
-
- *)
- ac_fn_c_check_func "$LINENO" "shl_load" "ac_cv_func_shl_load"
-if test "x$ac_cv_func_shl_load" = xyes; then :
- lt_cv_dlopen="shl_load"
-else
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for shl_load in -ldld" >&5
-$as_echo_n "checking for shl_load in -ldld... " >&6; }
-if ${ac_cv_lib_dld_shl_load+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- ac_check_lib_save_LIBS=$LIBS
-LIBS="-ldld $LIBS"
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-
-/* Override any GCC internal prototype to avoid an error.
- Use char because int might match the return type of a GCC
- builtin and then its argument prototype would still apply. */
-#ifdef __cplusplus
-extern "C"
-#endif
-char shl_load ();
-int
-main ()
-{
-return shl_load ();
- ;
- return 0;
-}
-_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
- ac_cv_lib_dld_shl_load=yes
-else
- ac_cv_lib_dld_shl_load=no
-fi
-rm -f core conftest.err conftest.$ac_objext \
- conftest$ac_exeext conftest.$ac_ext
-LIBS=$ac_check_lib_save_LIBS
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_shl_load" >&5
-$as_echo "$ac_cv_lib_dld_shl_load" >&6; }
-if test "x$ac_cv_lib_dld_shl_load" = xyes; then :
- lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-ldld"
-else
- ac_fn_c_check_func "$LINENO" "dlopen" "ac_cv_func_dlopen"
-if test "x$ac_cv_func_dlopen" = xyes; then :
- lt_cv_dlopen="dlopen"
-else
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5
-$as_echo_n "checking for dlopen in -ldl... " >&6; }
-if ${ac_cv_lib_dl_dlopen+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- ac_check_lib_save_LIBS=$LIBS
-LIBS="-ldl $LIBS"
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-
-/* Override any GCC internal prototype to avoid an error.
- Use char because int might match the return type of a GCC
- builtin and then its argument prototype would still apply. */
-#ifdef __cplusplus
-extern "C"
-#endif
-char dlopen ();
-int
-main ()
-{
-return dlopen ();
- ;
- return 0;
-}
-_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
- ac_cv_lib_dl_dlopen=yes
-else
- ac_cv_lib_dl_dlopen=no
-fi
-rm -f core conftest.err conftest.$ac_objext \
- conftest$ac_exeext conftest.$ac_ext
-LIBS=$ac_check_lib_save_LIBS
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5
-$as_echo "$ac_cv_lib_dl_dlopen" >&6; }
-if test "x$ac_cv_lib_dl_dlopen" = xyes; then :
- lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"
-else
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -lsvld" >&5
-$as_echo_n "checking for dlopen in -lsvld... " >&6; }
-if ${ac_cv_lib_svld_dlopen+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- ac_check_lib_save_LIBS=$LIBS
-LIBS="-lsvld $LIBS"
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-
-/* Override any GCC internal prototype to avoid an error.
- Use char because int might match the return type of a GCC
- builtin and then its argument prototype would still apply. */
-#ifdef __cplusplus
-extern "C"
-#endif
-char dlopen ();
-int
-main ()
-{
-return dlopen ();
- ;
- return 0;
-}
-_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
- ac_cv_lib_svld_dlopen=yes
-else
- ac_cv_lib_svld_dlopen=no
-fi
-rm -f core conftest.err conftest.$ac_objext \
- conftest$ac_exeext conftest.$ac_ext
-LIBS=$ac_check_lib_save_LIBS
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_svld_dlopen" >&5
-$as_echo "$ac_cv_lib_svld_dlopen" >&6; }
-if test "x$ac_cv_lib_svld_dlopen" = xyes; then :
- lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld"
-else
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dld_link in -ldld" >&5
-$as_echo_n "checking for dld_link in -ldld... " >&6; }
-if ${ac_cv_lib_dld_dld_link+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- ac_check_lib_save_LIBS=$LIBS
-LIBS="-ldld $LIBS"
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-
-/* Override any GCC internal prototype to avoid an error.
- Use char because int might match the return type of a GCC
- builtin and then its argument prototype would still apply. */
-#ifdef __cplusplus
-extern "C"
-#endif
-char dld_link ();
-int
-main ()
-{
-return dld_link ();
- ;
- return 0;
-}
-_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
- ac_cv_lib_dld_dld_link=yes
-else
- ac_cv_lib_dld_dld_link=no
-fi
-rm -f core conftest.err conftest.$ac_objext \
- conftest$ac_exeext conftest.$ac_ext
-LIBS=$ac_check_lib_save_LIBS
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_dld_link" >&5
-$as_echo "$ac_cv_lib_dld_dld_link" >&6; }
-if test "x$ac_cv_lib_dld_dld_link" = xyes; then :
- lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-ldld"
-fi
-
-
-fi
-
-
-fi
-
-
-fi
-
-
-fi
-
-
-fi
-
- ;;
- esac
-
- if test "x$lt_cv_dlopen" != xno; then
- enable_dlopen=yes
- else
- enable_dlopen=no
- fi
-
- case $lt_cv_dlopen in
- dlopen)
- save_CPPFLAGS="$CPPFLAGS"
- test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H"
-
- save_LDFLAGS="$LDFLAGS"
- wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\"
-
- save_LIBS="$LIBS"
- LIBS="$lt_cv_dlopen_libs $LIBS"
-
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a program can dlopen itself" >&5
-$as_echo_n "checking whether a program can dlopen itself... " >&6; }
-if ${lt_cv_dlopen_self+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- if test "$cross_compiling" = yes; then :
- lt_cv_dlopen_self=cross
-else
- lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
- lt_status=$lt_dlunknown
- cat > conftest.$ac_ext <<_LT_EOF
-#line $LINENO "configure"
-#include "confdefs.h"
-
-#if HAVE_DLFCN_H
-#include <dlfcn.h>
-#endif
-
-#include <stdio.h>
-
-#ifdef RTLD_GLOBAL
-# define LT_DLGLOBAL RTLD_GLOBAL
-#else
-# ifdef DL_GLOBAL
-# define LT_DLGLOBAL DL_GLOBAL
-# else
-# define LT_DLGLOBAL 0
-# endif
-#endif
-
-/* We may have to define LT_DLLAZY_OR_NOW in the command line if we
- find out it does not work in some platform. */
-#ifndef LT_DLLAZY_OR_NOW
-# ifdef RTLD_LAZY
-# define LT_DLLAZY_OR_NOW RTLD_LAZY
-# else
-# ifdef DL_LAZY
-# define LT_DLLAZY_OR_NOW DL_LAZY
-# else
-# ifdef RTLD_NOW
-# define LT_DLLAZY_OR_NOW RTLD_NOW
-# else
-# ifdef DL_NOW
-# define LT_DLLAZY_OR_NOW DL_NOW
-# else
-# define LT_DLLAZY_OR_NOW 0
-# endif
-# endif
-# endif
-# endif
-#endif
-
-/* When -fvisbility=hidden is used, assume the code has been annotated
- correspondingly for the symbols needed. */
-#if defined(__GNUC__) && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3))
-int fnord () __attribute__((visibility("default")));
-#endif
-
-int fnord () { return 42; }
-int main ()
-{
- void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW);
- int status = $lt_dlunknown;
-
- if (self)
- {
- if (dlsym (self,"fnord")) status = $lt_dlno_uscore;
- else
- {
- if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore;
- else puts (dlerror ());
- }
- /* dlclose (self); */
- }
- else
- puts (dlerror ());
-
- return status;
-}
-_LT_EOF
- if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5
- (eval $ac_link) 2>&5
- ac_status=$?
- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
- test $ac_status = 0; } && test -s conftest${ac_exeext} 2>/dev/null; then
- (./conftest; exit; ) >&5 2>/dev/null
- lt_status=$?
- case x$lt_status in
- x$lt_dlno_uscore) lt_cv_dlopen_self=yes ;;
- x$lt_dlneed_uscore) lt_cv_dlopen_self=yes ;;
- x$lt_dlunknown|x*) lt_cv_dlopen_self=no ;;
- esac
- else :
- # compilation failed
- lt_cv_dlopen_self=no
- fi
-fi
-rm -fr conftest*
-
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self" >&5
-$as_echo "$lt_cv_dlopen_self" >&6; }
-
- if test "x$lt_cv_dlopen_self" = xyes; then
- wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\"
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a statically linked program can dlopen itself" >&5
-$as_echo_n "checking whether a statically linked program can dlopen itself... " >&6; }
-if ${lt_cv_dlopen_self_static+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- if test "$cross_compiling" = yes; then :
- lt_cv_dlopen_self_static=cross
-else
- lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
- lt_status=$lt_dlunknown
- cat > conftest.$ac_ext <<_LT_EOF
-#line $LINENO "configure"
-#include "confdefs.h"
-
-#if HAVE_DLFCN_H
-#include <dlfcn.h>
-#endif
-
-#include <stdio.h>
-
-#ifdef RTLD_GLOBAL
-# define LT_DLGLOBAL RTLD_GLOBAL
-#else
-# ifdef DL_GLOBAL
-# define LT_DLGLOBAL DL_GLOBAL
-# else
-# define LT_DLGLOBAL 0
-# endif
-#endif
-
-/* We may have to define LT_DLLAZY_OR_NOW in the command line if we
- find out it does not work in some platform. */
-#ifndef LT_DLLAZY_OR_NOW
-# ifdef RTLD_LAZY
-# define LT_DLLAZY_OR_NOW RTLD_LAZY
-# else
-# ifdef DL_LAZY
-# define LT_DLLAZY_OR_NOW DL_LAZY
-# else
-# ifdef RTLD_NOW
-# define LT_DLLAZY_OR_NOW RTLD_NOW
-# else
-# ifdef DL_NOW
-# define LT_DLLAZY_OR_NOW DL_NOW
-# else
-# define LT_DLLAZY_OR_NOW 0
-# endif
-# endif
-# endif
-# endif
-#endif
-
-/* When -fvisbility=hidden is used, assume the code has been annotated
- correspondingly for the symbols needed. */
-#if defined(__GNUC__) && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3))
-int fnord () __attribute__((visibility("default")));
-#endif
-
-int fnord () { return 42; }
-int main ()
-{
- void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW);
- int status = $lt_dlunknown;
-
- if (self)
- {
- if (dlsym (self,"fnord")) status = $lt_dlno_uscore;
- else
- {
- if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore;
- else puts (dlerror ());
- }
- /* dlclose (self); */
- }
- else
- puts (dlerror ());
-
- return status;
-}
-_LT_EOF
- if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5
- (eval $ac_link) 2>&5
- ac_status=$?
- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
- test $ac_status = 0; } && test -s conftest${ac_exeext} 2>/dev/null; then
- (./conftest; exit; ) >&5 2>/dev/null
- lt_status=$?
- case x$lt_status in
- x$lt_dlno_uscore) lt_cv_dlopen_self_static=yes ;;
- x$lt_dlneed_uscore) lt_cv_dlopen_self_static=yes ;;
- x$lt_dlunknown|x*) lt_cv_dlopen_self_static=no ;;
- esac
- else :
- # compilation failed
- lt_cv_dlopen_self_static=no
- fi
-fi
-rm -fr conftest*
-
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self_static" >&5
-$as_echo "$lt_cv_dlopen_self_static" >&6; }
- fi
-
- CPPFLAGS="$save_CPPFLAGS"
- LDFLAGS="$save_LDFLAGS"
- LIBS="$save_LIBS"
- ;;
- esac
-
- case $lt_cv_dlopen_self in
- yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;;
- *) enable_dlopen_self=unknown ;;
- esac
-
- case $lt_cv_dlopen_self_static in
- yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;;
- *) enable_dlopen_self_static=unknown ;;
- esac
-fi
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-striplib=
-old_striplib=
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether stripping libraries is possible" >&5
-$as_echo_n "checking whether stripping libraries is possible... " >&6; }
-if test -n "$STRIP" && $STRIP -V 2>&1 | $GREP "GNU strip" >/dev/null; then
- test -z "$old_striplib" && old_striplib="$STRIP --strip-debug"
- test -z "$striplib" && striplib="$STRIP --strip-unneeded"
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
-else
-# FIXME - insert some real tests, host_os isn't really good enough
- case $host_os in
- darwin*)
- if test -n "$STRIP" ; then
- striplib="$STRIP -x"
- old_striplib="$STRIP -S"
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
- else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
- fi
- ;;
- *)
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
- ;;
- esac
-fi
-
-
-
-
-
-
-
-
-
-
-
-
- # Report which library types will actually be built
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking if libtool supports shared libraries" >&5
-$as_echo_n "checking if libtool supports shared libraries... " >&6; }
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $can_build_shared" >&5
-$as_echo "$can_build_shared" >&6; }
-
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build shared libraries" >&5
-$as_echo_n "checking whether to build shared libraries... " >&6; }
- test "$can_build_shared" = "no" && enable_shared=no
-
- # On AIX, shared libraries and static libraries use the same namespace, and
- # are all built from PIC.
- case $host_os in
- aix3*)
- test "$enable_shared" = yes && enable_static=no
- if test -n "$RANLIB"; then
- archive_cmds="$archive_cmds~\$RANLIB \$lib"
- postinstall_cmds='$RANLIB $lib'
- fi
- ;;
-
- aix[4-9]*)
- if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then
- test "$enable_shared" = yes && enable_static=no
- fi
- ;;
- esac
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_shared" >&5
-$as_echo "$enable_shared" >&6; }
-
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build static libraries" >&5
-$as_echo_n "checking whether to build static libraries... " >&6; }
- # Make sure either enable_shared or enable_static is yes.
- test "$enable_shared" = yes || enable_static=yes
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_static" >&5
-$as_echo "$enable_static" >&6; }
-
-
-
-
-fi
-ac_ext=cpp
-ac_cpp='$CXXCPP $CPPFLAGS'
-ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
-
-CC="$lt_save_CC"
-
- if test -n "$CXX" && ( test "X$CXX" != "Xno" &&
- ( (test "X$CXX" = "Xg++" && `g++ -v >/dev/null 2>&1` ) ||
- (test "X$CXX" != "Xg++"))) ; then
- ac_ext=cpp
-ac_cpp='$CXXCPP $CPPFLAGS'
-ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C++ preprocessor" >&5
-$as_echo_n "checking how to run the C++ preprocessor... " >&6; }
-if test -z "$CXXCPP"; then
- if ${ac_cv_prog_CXXCPP+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- # Double quotes because CXXCPP needs to be expanded
- for CXXCPP in "$CXX -E" "/lib/cpp"
- do
- ac_preproc_ok=false
-for ac_cxx_preproc_warn_flag in '' yes
-do
- # Use a header file that comes with gcc, so configuring glibc
- # with a fresh cross-compiler works.
- # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
- # <limits.h> exists even on freestanding compilers.
- # On the NeXT, cc -E runs the code through the compiler's parser,
- # not just through cpp. "Syntax error" is here to catch this case.
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-#ifdef __STDC__
-# include <limits.h>
-#else
-# include <assert.h>
-#endif
- Syntax error
-_ACEOF
-if ac_fn_cxx_try_cpp "$LINENO"; then :
-
-else
- # Broken: fails on valid input.
-continue
-fi
-rm -f conftest.err conftest.i conftest.$ac_ext
-
- # OK, works on sane cases. Now check whether nonexistent headers
- # can be detected and how.
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-#include <ac_nonexistent.h>
-_ACEOF
-if ac_fn_cxx_try_cpp "$LINENO"; then :
- # Broken: success on invalid input.
-continue
-else
- # Passes both tests.
-ac_preproc_ok=:
-break
-fi
-rm -f conftest.err conftest.i conftest.$ac_ext
-
-done
-# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
-rm -f conftest.i conftest.err conftest.$ac_ext
-if $ac_preproc_ok; then :
- break
-fi
-
- done
- ac_cv_prog_CXXCPP=$CXXCPP
-
-fi
- CXXCPP=$ac_cv_prog_CXXCPP
-else
- ac_cv_prog_CXXCPP=$CXXCPP
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXXCPP" >&5
-$as_echo "$CXXCPP" >&6; }
-ac_preproc_ok=false
-for ac_cxx_preproc_warn_flag in '' yes
-do
- # Use a header file that comes with gcc, so configuring glibc
- # with a fresh cross-compiler works.
- # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
- # <limits.h> exists even on freestanding compilers.
- # On the NeXT, cc -E runs the code through the compiler's parser,
- # not just through cpp. "Syntax error" is here to catch this case.
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-#ifdef __STDC__
-# include <limits.h>
-#else
-# include <assert.h>
-#endif
- Syntax error
-_ACEOF
-if ac_fn_cxx_try_cpp "$LINENO"; then :
-
-else
- # Broken: fails on valid input.
-continue
-fi
-rm -f conftest.err conftest.i conftest.$ac_ext
-
- # OK, works on sane cases. Now check whether nonexistent headers
- # can be detected and how.
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-#include <ac_nonexistent.h>
-_ACEOF
-if ac_fn_cxx_try_cpp "$LINENO"; then :
- # Broken: success on invalid input.
-continue
-else
- # Passes both tests.
-ac_preproc_ok=:
-break
-fi
-rm -f conftest.err conftest.i conftest.$ac_ext
-
-done
-# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
-rm -f conftest.i conftest.err conftest.$ac_ext
-if $ac_preproc_ok; then :
-
-else
- { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
-as_fn_error $? "C++ preprocessor \"$CXXCPP\" fails sanity check
-See \`config.log' for more details" "$LINENO" 5; }
-fi
-
-ac_ext=cpp
-ac_cpp='$CXXCPP $CPPFLAGS'
-ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
-
-else
- _lt_caught_CXX_error=yes
-fi
-
-ac_ext=cpp
-ac_cpp='$CXXCPP $CPPFLAGS'
-ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
-
-archive_cmds_need_lc_CXX=no
-allow_undefined_flag_CXX=
-always_export_symbols_CXX=no
-archive_expsym_cmds_CXX=
-compiler_needs_object_CXX=no
-export_dynamic_flag_spec_CXX=
-hardcode_direct_CXX=no
-hardcode_direct_absolute_CXX=no
-hardcode_libdir_flag_spec_CXX=
-hardcode_libdir_separator_CXX=
-hardcode_minus_L_CXX=no
-hardcode_shlibpath_var_CXX=unsupported
-hardcode_automatic_CXX=no
-inherit_rpath_CXX=no
-module_cmds_CXX=
-module_expsym_cmds_CXX=
-link_all_deplibs_CXX=unknown
-old_archive_cmds_CXX=$old_archive_cmds
-reload_flag_CXX=$reload_flag
-reload_cmds_CXX=$reload_cmds
-no_undefined_flag_CXX=
-whole_archive_flag_spec_CXX=
-enable_shared_with_static_runtimes_CXX=no
-
-# Source file extension for C++ test sources.
-ac_ext=cpp
-
-# Object file extension for compiled C++ test sources.
-objext=o
-objext_CXX=$objext
-
-# No sense in running all these tests if we already determined that
-# the CXX compiler isn't working. Some variables (like enable_shared)
-# are currently assumed to apply to all compilers on this platform,
-# and will be corrupted by setting them based on a non-working compiler.
-if test "$_lt_caught_CXX_error" != yes; then
- # Code to be used in simple compile tests
- lt_simple_compile_test_code="int some_variable = 0;"
-
- # Code to be used in simple link tests
- lt_simple_link_test_code='int main(int, char *[]) { return(0); }'
-
- # ltmain only uses $CC for tagged configurations so make sure $CC is set.
-
-
-
-
-
-
-# If no C compiler was specified, use CC.
-LTCC=${LTCC-"$CC"}
-
-# If no C compiler flags were specified, use CFLAGS.
-LTCFLAGS=${LTCFLAGS-"$CFLAGS"}
-
-# Allow CC to be a program name with arguments.
-compiler=$CC
-
-
- # save warnings/boilerplate of simple test code
- ac_outfile=conftest.$ac_objext
-echo "$lt_simple_compile_test_code" >conftest.$ac_ext
-eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
-_lt_compiler_boilerplate=`cat conftest.err`
-$RM conftest*
-
- ac_outfile=conftest.$ac_objext
-echo "$lt_simple_link_test_code" >conftest.$ac_ext
-eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
-_lt_linker_boilerplate=`cat conftest.err`
-$RM -r conftest*
-
-
- # Allow CC to be a program name with arguments.
- lt_save_CC=$CC
- lt_save_CFLAGS=$CFLAGS
- lt_save_LD=$LD
- lt_save_GCC=$GCC
- GCC=$GXX
- lt_save_with_gnu_ld=$with_gnu_ld
- lt_save_path_LD=$lt_cv_path_LD
- if test -n "${lt_cv_prog_gnu_ldcxx+set}"; then
- lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx
- else
- $as_unset lt_cv_prog_gnu_ld
- fi
- if test -n "${lt_cv_path_LDCXX+set}"; then
- lt_cv_path_LD=$lt_cv_path_LDCXX
- else
- $as_unset lt_cv_path_LD
- fi
- test -z "${LDCXX+set}" || LD=$LDCXX
- CC=${CXX-"c++"}
- CFLAGS=$CXXFLAGS
- compiler=$CC
- compiler_CXX=$CC
- for cc_temp in $compiler""; do
- case $cc_temp in
- compile | *[\\/]compile | ccache | *[\\/]ccache ) ;;
- distcc | *[\\/]distcc | purify | *[\\/]purify ) ;;
- \-*) ;;
- *) break;;
- esac
-done
-cc_basename=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"`
-
-
- if test -n "$compiler"; then
- # We don't want -fno-exception when compiling C++ code, so set the
- # no_builtin_flag separately
- if test "$GXX" = yes; then
- lt_prog_compiler_no_builtin_flag_CXX=' -fno-builtin'
- else
- lt_prog_compiler_no_builtin_flag_CXX=
- fi
-
- if test "$GXX" = yes; then
- # Set up default GNU C++ configuration
-
-
-
-# Check whether --with-gnu-ld was given.
-if test "${with_gnu_ld+set}" = set; then :
- withval=$with_gnu_ld; test "$withval" = no || with_gnu_ld=yes
-else
- with_gnu_ld=no
-fi
-
-ac_prog=ld
-if test "$GCC" = yes; then
- # Check if gcc -print-prog-name=ld gives a path.
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld used by $CC" >&5
-$as_echo_n "checking for ld used by $CC... " >&6; }
- case $host in
- *-*-mingw*)
- # gcc leaves a trailing carriage return which upsets mingw
- ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;;
- *)
- ac_prog=`($CC -print-prog-name=ld) 2>&5` ;;
- esac
- case $ac_prog in
- # Accept absolute paths.
- [\\/]* | ?:[\\/]*)
- re_direlt='/[^/][^/]*/\.\./'
- # Canonicalize the pathname of ld
- ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'`
- while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do
- ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"`
- done
- test -z "$LD" && LD="$ac_prog"
- ;;
- "")
- # If it fails, then pretend we aren't using GCC.
- ac_prog=ld
- ;;
- *)
- # If it is relative, then search for the first ld in PATH.
- with_gnu_ld=unknown
- ;;
- esac
-elif test "$with_gnu_ld" = yes; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5
-$as_echo_n "checking for GNU ld... " >&6; }
-else
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5
-$as_echo_n "checking for non-GNU ld... " >&6; }
-fi
-if ${lt_cv_path_LD+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- if test -z "$LD"; then
- lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
- for ac_dir in $PATH; do
- IFS="$lt_save_ifs"
- test -z "$ac_dir" && ac_dir=.
- if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then
- lt_cv_path_LD="$ac_dir/$ac_prog"
- # Check to see if the program is GNU ld. I'd rather use --version,
- # but apparently some variants of GNU ld only accept -v.
- # Break only if it was the GNU/non-GNU ld that we prefer.
- case `"$lt_cv_path_LD" -v 2>&1 </dev/null` in
- *GNU* | *'with BFD'*)
- test "$with_gnu_ld" != no && break
- ;;
- *)
- test "$with_gnu_ld" != yes && break
- ;;
- esac
- fi
- done
- IFS="$lt_save_ifs"
-else
- lt_cv_path_LD="$LD" # Let the user override the test with a path.
-fi
-fi
-
-LD="$lt_cv_path_LD"
-if test -n "$LD"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LD" >&5
-$as_echo "$LD" >&6; }
-else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-test -z "$LD" && as_fn_error $? "no acceptable ld found in \$PATH" "$LINENO" 5
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5
-$as_echo_n "checking if the linker ($LD) is GNU ld... " >&6; }
-if ${lt_cv_prog_gnu_ld+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- # I'd rather use --version here, but apparently some GNU lds only accept -v.
-case `$LD -v 2>&1 </dev/null` in
-*GNU* | *'with BFD'*)
- lt_cv_prog_gnu_ld=yes
- ;;
-*)
- lt_cv_prog_gnu_ld=no
- ;;
-esac
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_gnu_ld" >&5
-$as_echo "$lt_cv_prog_gnu_ld" >&6; }
-with_gnu_ld=$lt_cv_prog_gnu_ld
-
-
-
-
-
-
-
- # Check if GNU C++ uses GNU ld as the underlying linker, since the
- # archiving commands below assume that GNU ld is being used.
- if test "$with_gnu_ld" = yes; then
- archive_cmds_CXX='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib'
- archive_expsym_cmds_CXX='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
-
- hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir'
- export_dynamic_flag_spec_CXX='${wl}--export-dynamic'
-
- # If archive_cmds runs LD, not CC, wlarc should be empty
- # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to
- # investigate it a little bit more. (MM)
- wlarc='${wl}'
-
- # ancient GNU ld didn't support --whole-archive et. al.
- if eval "`$CC -print-prog-name=ld` --help 2>&1" |
- $GREP 'no-whole-archive' > /dev/null; then
- whole_archive_flag_spec_CXX="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive'
- else
- whole_archive_flag_spec_CXX=
- fi
- else
- with_gnu_ld=no
- wlarc=
-
- # A generic and very simple default shared library creation
- # command for GNU C++ for the case where it uses the native
- # linker, instead of GNU ld. If possible, this setting should
- # overridden to take advantage of the native linker features on
- # the platform it is being used on.
- archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib'
- fi
-
- # Commands to make compiler produce verbose output that lists
- # what "hidden" libraries, object files and flags are used when
- # linking a shared library.
- output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"'
-
- else
- GXX=no
- with_gnu_ld=no
- wlarc=
- fi
-
- # PORTME: fill in a description of your system's C++ link characteristics
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5
-$as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; }
- ld_shlibs_CXX=yes
- case $host_os in
- aix3*)
- # FIXME: insert proper C++ library support
- ld_shlibs_CXX=no
- ;;
- aix[4-9]*)
- if test "$host_cpu" = ia64; then
- # On IA64, the linker does run time linking by default, so we don't
- # have to do anything special.
- aix_use_runtimelinking=no
- exp_sym_flag='-Bexport'
- no_entry_flag=""
- else
- aix_use_runtimelinking=no
-
- # Test if we are trying to use run time linking or normal
- # AIX style linking. If -brtl is somewhere in LDFLAGS, we
- # need to do runtime linking.
- case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*)
- for ld_flag in $LDFLAGS; do
- case $ld_flag in
- *-brtl*)
- aix_use_runtimelinking=yes
- break
- ;;
- esac
- done
- ;;
- esac
-
- exp_sym_flag='-bexport'
- no_entry_flag='-bnoentry'
- fi
-
- # When large executables or shared objects are built, AIX ld can
- # have problems creating the table of contents. If linking a library
- # or program results in "error TOC overflow" add -mminimal-toc to
- # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not
- # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS.
-
- archive_cmds_CXX=''
- hardcode_direct_CXX=yes
- hardcode_direct_absolute_CXX=yes
- hardcode_libdir_separator_CXX=':'
- link_all_deplibs_CXX=yes
- file_list_spec_CXX='${wl}-f,'
-
- if test "$GXX" = yes; then
- case $host_os in aix4.[012]|aix4.[012].*)
- # We only want to do this on AIX 4.2 and lower, the check
- # below for broken collect2 doesn't work under 4.3+
- collect2name=`${CC} -print-prog-name=collect2`
- if test -f "$collect2name" &&
- strings "$collect2name" | $GREP resolve_lib_name >/dev/null
- then
- # We have reworked collect2
- :
- else
- # We have old collect2
- hardcode_direct_CXX=unsupported
- # It fails to find uninstalled libraries when the uninstalled
- # path is not listed in the libpath. Setting hardcode_minus_L
- # to unsupported forces relinking
- hardcode_minus_L_CXX=yes
- hardcode_libdir_flag_spec_CXX='-L$libdir'
- hardcode_libdir_separator_CXX=
- fi
- esac
- shared_flag='-shared'
- if test "$aix_use_runtimelinking" = yes; then
- shared_flag="$shared_flag "'${wl}-G'
- fi
- else
- # not using gcc
- if test "$host_cpu" = ia64; then
- # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release
- # chokes on -Wl,-G. The following line is correct:
- shared_flag='-G'
- else
- if test "$aix_use_runtimelinking" = yes; then
- shared_flag='${wl}-G'
- else
- shared_flag='${wl}-bM:SRE'
- fi
- fi
- fi
-
- export_dynamic_flag_spec_CXX='${wl}-bexpall'
- # It seems that -bexpall does not export symbols beginning with
- # underscore (_), so it is better to generate a list of symbols to
- # export.
- always_export_symbols_CXX=yes
- if test "$aix_use_runtimelinking" = yes; then
- # Warning - without using the other runtime loading flags (-brtl),
- # -berok will link without error, but may produce a broken library.
- allow_undefined_flag_CXX='-berok'
- # Determine the default libpath from the value encoded in an empty
- # executable.
- if test "${lt_cv_aix_libpath+set}" = set; then
- aix_libpath=$lt_cv_aix_libpath
-else
- if ${lt_cv_aix_libpath__CXX+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-
-int
-main ()
-{
-
- ;
- return 0;
-}
-_ACEOF
-if ac_fn_cxx_try_link "$LINENO"; then :
-
- lt_aix_libpath_sed='
- /Import File Strings/,/^$/ {
- /^0/ {
- s/^0 *\([^ ]*\) *$/\1/
- p
- }
- }'
- lt_cv_aix_libpath__CXX=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
- # Check for a 64-bit object if we didn't find anything.
- if test -z "$lt_cv_aix_libpath__CXX"; then
- lt_cv_aix_libpath__CXX=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
- fi
-fi
-rm -f core conftest.err conftest.$ac_objext \
- conftest$ac_exeext conftest.$ac_ext
- if test -z "$lt_cv_aix_libpath__CXX"; then
- lt_cv_aix_libpath__CXX="/usr/lib:/lib"
- fi
-
-fi
-
- aix_libpath=$lt_cv_aix_libpath__CXX
-fi
-
- hardcode_libdir_flag_spec_CXX='${wl}-blibpath:$libdir:'"$aix_libpath"
-
- archive_expsym_cmds_CXX='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag"
- else
- if test "$host_cpu" = ia64; then
- hardcode_libdir_flag_spec_CXX='${wl}-R $libdir:/usr/lib:/lib'
- allow_undefined_flag_CXX="-z nodefs"
- archive_expsym_cmds_CXX="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols"
- else
- # Determine the default libpath from the value encoded in an
- # empty executable.
- if test "${lt_cv_aix_libpath+set}" = set; then
- aix_libpath=$lt_cv_aix_libpath
-else
- if ${lt_cv_aix_libpath__CXX+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-
-int
-main ()
-{
-
- ;
- return 0;
-}
-_ACEOF
-if ac_fn_cxx_try_link "$LINENO"; then :
-
- lt_aix_libpath_sed='
- /Import File Strings/,/^$/ {
- /^0/ {
- s/^0 *\([^ ]*\) *$/\1/
- p
- }
- }'
- lt_cv_aix_libpath__CXX=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
- # Check for a 64-bit object if we didn't find anything.
- if test -z "$lt_cv_aix_libpath__CXX"; then
- lt_cv_aix_libpath__CXX=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
- fi
-fi
-rm -f core conftest.err conftest.$ac_objext \
- conftest$ac_exeext conftest.$ac_ext
- if test -z "$lt_cv_aix_libpath__CXX"; then
- lt_cv_aix_libpath__CXX="/usr/lib:/lib"
- fi
-
-fi
-
- aix_libpath=$lt_cv_aix_libpath__CXX
-fi
-
- hardcode_libdir_flag_spec_CXX='${wl}-blibpath:$libdir:'"$aix_libpath"
- # Warning - without using the other run time loading flags,
- # -berok will link without error, but may produce a broken library.
- no_undefined_flag_CXX=' ${wl}-bernotok'
- allow_undefined_flag_CXX=' ${wl}-berok'
- if test "$with_gnu_ld" = yes; then
- # We only use this code for GNU lds that support --whole-archive.
- whole_archive_flag_spec_CXX='${wl}--whole-archive$convenience ${wl}--no-whole-archive'
- else
- # Exported symbols can be pulled into shared objects from archives
- whole_archive_flag_spec_CXX='$convenience'
- fi
- archive_cmds_need_lc_CXX=yes
- # This is similar to how AIX traditionally builds its shared
- # libraries.
- archive_expsym_cmds_CXX="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname'
- fi
- fi
- ;;
-
- beos*)
- if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
- allow_undefined_flag_CXX=unsupported
- # Joseph Beckenbach <jrb3 at best.com> says some releases of gcc
- # support --undefined. This deserves some investigation. FIXME
- archive_cmds_CXX='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
- else
- ld_shlibs_CXX=no
- fi
- ;;
-
- chorus*)
- case $cc_basename in
- *)
- # FIXME: insert proper C++ library support
- ld_shlibs_CXX=no
- ;;
- esac
- ;;
-
- cygwin* | mingw* | pw32* | cegcc*)
- case $GXX,$cc_basename in
- ,cl* | no,cl*)
- # Native MSVC
- # hardcode_libdir_flag_spec is actually meaningless, as there is
- # no search path for DLLs.
- hardcode_libdir_flag_spec_CXX=' '
- allow_undefined_flag_CXX=unsupported
- always_export_symbols_CXX=yes
- file_list_spec_CXX='@'
- # Tell ltmain to make .lib files, not .a files.
- libext=lib
- # Tell ltmain to make .dll files, not .so files.
- shrext_cmds=".dll"
- # FIXME: Setting linknames here is a bad hack.
- archive_cmds_CXX='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames='
- archive_expsym_cmds_CXX='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then
- $SED -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp;
- else
- $SED -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp;
- fi~
- $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~
- linknames='
- # The linker will not automatically build a static lib if we build a DLL.
- # _LT_TAGVAR(old_archive_from_new_cmds, CXX)='true'
- enable_shared_with_static_runtimes_CXX=yes
- # Don't use ranlib
- old_postinstall_cmds_CXX='chmod 644 $oldlib'
- postlink_cmds_CXX='lt_outputfile="@OUTPUT@"~
- lt_tool_outputfile="@TOOL_OUTPUT@"~
- case $lt_outputfile in
- *.exe|*.EXE) ;;
- *)
- lt_outputfile="$lt_outputfile.exe"
- lt_tool_outputfile="$lt_tool_outputfile.exe"
- ;;
- esac~
- func_to_tool_file "$lt_outputfile"~
- if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then
- $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1;
- $RM "$lt_outputfile.manifest";
- fi'
- ;;
- *)
- # g++
- # _LT_TAGVAR(hardcode_libdir_flag_spec, CXX) is actually meaningless,
- # as there is no search path for DLLs.
- hardcode_libdir_flag_spec_CXX='-L$libdir'
- export_dynamic_flag_spec_CXX='${wl}--export-all-symbols'
- allow_undefined_flag_CXX=unsupported
- always_export_symbols_CXX=no
- enable_shared_with_static_runtimes_CXX=yes
-
- if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then
- archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
- # If the export-symbols file already is a .def file (1st line
- # is EXPORTS), use it as is; otherwise, prepend...
- archive_expsym_cmds_CXX='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then
- cp $export_symbols $output_objdir/$soname.def;
- else
- echo EXPORTS > $output_objdir/$soname.def;
- cat $export_symbols >> $output_objdir/$soname.def;
- fi~
- $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
- else
- ld_shlibs_CXX=no
- fi
- ;;
- esac
- ;;
- darwin* | rhapsody*)
-
-
- archive_cmds_need_lc_CXX=no
- hardcode_direct_CXX=no
- hardcode_automatic_CXX=yes
- hardcode_shlibpath_var_CXX=unsupported
- if test "$lt_cv_ld_force_load" = "yes"; then
- whole_archive_flag_spec_CXX='`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience ${wl}-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`'
-
- else
- whole_archive_flag_spec_CXX=''
- fi
- link_all_deplibs_CXX=yes
- allow_undefined_flag_CXX="$_lt_dar_allow_undefined"
- case $cc_basename in
- ifort*) _lt_dar_can_shared=yes ;;
- *) _lt_dar_can_shared=$GCC ;;
- esac
- if test "$_lt_dar_can_shared" = "yes"; then
- output_verbose_link_cmd=func_echo_all
- archive_cmds_CXX="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}"
- module_cmds_CXX="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}"
- archive_expsym_cmds_CXX="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}"
- module_expsym_cmds_CXX="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}"
- if test "$lt_cv_apple_cc_single_mod" != "yes"; then
- archive_cmds_CXX="\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dsymutil}"
- archive_expsym_cmds_CXX="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dar_export_syms}${_lt_dsymutil}"
- fi
-
- else
- ld_shlibs_CXX=no
- fi
-
- ;;
-
- dgux*)
- case $cc_basename in
- ec++*)
- # FIXME: insert proper C++ library support
- ld_shlibs_CXX=no
- ;;
- ghcx*)
- # Green Hills C++ Compiler
- # FIXME: insert proper C++ library support
- ld_shlibs_CXX=no
- ;;
- *)
- # FIXME: insert proper C++ library support
- ld_shlibs_CXX=no
- ;;
- esac
- ;;
-
- freebsd2.*)
- # C++ shared libraries reported to be fairly broken before
- # switch to ELF
- ld_shlibs_CXX=no
- ;;
-
- freebsd-elf*)
- archive_cmds_need_lc_CXX=no
- ;;
-
- freebsd* | dragonfly*)
- # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF
- # conventions
- ld_shlibs_CXX=yes
- ;;
-
- gnu*)
- ;;
-
- haiku*)
- archive_cmds_CXX='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
- link_all_deplibs_CXX=yes
- ;;
-
- hpux9*)
- hardcode_libdir_flag_spec_CXX='${wl}+b ${wl}$libdir'
- hardcode_libdir_separator_CXX=:
- export_dynamic_flag_spec_CXX='${wl}-E'
- hardcode_direct_CXX=yes
- hardcode_minus_L_CXX=yes # Not in the search PATH,
- # but as the default
- # location of the library.
-
- case $cc_basename in
- CC*)
- # FIXME: insert proper C++ library support
- ld_shlibs_CXX=no
- ;;
- aCC*)
- archive_cmds_CXX='$RM $output_objdir/$soname~$CC -b ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
- # Commands to make compiler produce verbose output that lists
- # what "hidden" libraries, object files and flags are used when
- # linking a shared library.
- #
- # There doesn't appear to be a way to prevent this compiler from
- # explicitly linking system object files so we need to strip them
- # from the output so that they don't get included in the library
- # dependencies.
- output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $EGREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"'
- ;;
- *)
- if test "$GXX" = yes; then
- archive_cmds_CXX='$RM $output_objdir/$soname~$CC -shared -nostdlib $pic_flag ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
- else
- # FIXME: insert proper C++ library support
- ld_shlibs_CXX=no
- fi
- ;;
- esac
- ;;
-
- hpux10*|hpux11*)
- if test $with_gnu_ld = no; then
- hardcode_libdir_flag_spec_CXX='${wl}+b ${wl}$libdir'
- hardcode_libdir_separator_CXX=:
-
- case $host_cpu in
- hppa*64*|ia64*)
- ;;
- *)
- export_dynamic_flag_spec_CXX='${wl}-E'
- ;;
- esac
- fi
- case $host_cpu in
- hppa*64*|ia64*)
- hardcode_direct_CXX=no
- hardcode_shlibpath_var_CXX=no
- ;;
- *)
- hardcode_direct_CXX=yes
- hardcode_direct_absolute_CXX=yes
- hardcode_minus_L_CXX=yes # Not in the search PATH,
- # but as the default
- # location of the library.
- ;;
- esac
-
- case $cc_basename in
- CC*)
- # FIXME: insert proper C++ library support
- ld_shlibs_CXX=no
- ;;
- aCC*)
- case $host_cpu in
- hppa*64*)
- archive_cmds_CXX='$CC -b ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
- ;;
- ia64*)
- archive_cmds_CXX='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
- ;;
- *)
- archive_cmds_CXX='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
- ;;
- esac
- # Commands to make compiler produce verbose output that lists
- # what "hidden" libraries, object files and flags are used when
- # linking a shared library.
- #
- # There doesn't appear to be a way to prevent this compiler from
- # explicitly linking system object files so we need to strip them
- # from the output so that they don't get included in the library
- # dependencies.
- output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $GREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"'
- ;;
- *)
- if test "$GXX" = yes; then
- if test $with_gnu_ld = no; then
- case $host_cpu in
- hppa*64*)
- archive_cmds_CXX='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
- ;;
- ia64*)
- archive_cmds_CXX='$CC -shared -nostdlib $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
- ;;
- *)
- archive_cmds_CXX='$CC -shared -nostdlib $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
- ;;
- esac
- fi
- else
- # FIXME: insert proper C++ library support
- ld_shlibs_CXX=no
- fi
- ;;
- esac
- ;;
-
- interix[3-9]*)
- hardcode_direct_CXX=no
- hardcode_shlibpath_var_CXX=no
- hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir'
- export_dynamic_flag_spec_CXX='${wl}-E'
- # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc.
- # Instead, shared libraries are loaded at an image base (0x10000000 by
- # default) and relocated if they conflict, which is a slow very memory
- # consuming and fragmenting process. To avoid this, we pick a random,
- # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link
- # time. Moving up from 0x10000000 also allows more sbrk(2) space.
- archive_cmds_CXX='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
- archive_expsym_cmds_CXX='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
- ;;
- irix5* | irix6*)
- case $cc_basename in
- CC*)
- # SGI C++
- archive_cmds_CXX='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
-
- # Archives containing C++ object files must be created using
- # "CC -ar", where "CC" is the IRIX C++ compiler. This is
- # necessary to make sure instantiated templates are included
- # in the archive.
- old_archive_cmds_CXX='$CC -ar -WR,-u -o $oldlib $oldobjs'
- ;;
- *)
- if test "$GXX" = yes; then
- if test "$with_gnu_ld" = no; then
- archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
- else
- archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` -o $lib'
- fi
- fi
- link_all_deplibs_CXX=yes
- ;;
- esac
- hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir'
- hardcode_libdir_separator_CXX=:
- inherit_rpath_CXX=yes
- ;;
-
- linux* | k*bsd*-gnu | kopensolaris*-gnu)
- case $cc_basename in
- KCC*)
- # Kuck and Associates, Inc. (KAI) C++ Compiler
-
- # KCC will only create a shared library if the output file
- # ends with ".so" (or ".sl" for HP-UX), so rename the library
- # to its proper name (with version) after linking.
- archive_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib'
- archive_expsym_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib ${wl}-retain-symbols-file,$export_symbols; mv \$templib $lib'
- # Commands to make compiler produce verbose output that lists
- # what "hidden" libraries, object files and flags are used when
- # linking a shared library.
- #
- # There doesn't appear to be a way to prevent this compiler from
- # explicitly linking system object files so we need to strip them
- # from the output so that they don't get included in the library
- # dependencies.
- output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | $GREP "ld"`; rm -f libconftest$shared_ext; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"'
-
- hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir'
- export_dynamic_flag_spec_CXX='${wl}--export-dynamic'
-
- # Archives containing C++ object files must be created using
- # "CC -Bstatic", where "CC" is the KAI C++ compiler.
- old_archive_cmds_CXX='$CC -Bstatic -o $oldlib $oldobjs'
- ;;
- icpc* | ecpc* )
- # Intel C++
- with_gnu_ld=yes
- # version 8.0 and above of icpc choke on multiply defined symbols
- # if we add $predep_objects and $postdep_objects, however 7.1 and
- # earlier do not add the objects themselves.
- case `$CC -V 2>&1` in
- *"Version 7."*)
- archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib'
- archive_expsym_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
- ;;
- *) # Version 8.0 or newer
- tmp_idyn=
- case $host_cpu in
- ia64*) tmp_idyn=' -i_dynamic';;
- esac
- archive_cmds_CXX='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
- archive_expsym_cmds_CXX='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
- ;;
- esac
- archive_cmds_need_lc_CXX=no
- hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir'
- export_dynamic_flag_spec_CXX='${wl}--export-dynamic'
- whole_archive_flag_spec_CXX='${wl}--whole-archive$convenience ${wl}--no-whole-archive'
- ;;
- pgCC* | pgcpp*)
- # Portland Group C++ compiler
- case `$CC -V` in
- *pgCC\ [1-5].* | *pgcpp\ [1-5].*)
- prelink_cmds_CXX='tpldir=Template.dir~
- rm -rf $tpldir~
- $CC --prelink_objects --instantiation_dir $tpldir $objs $libobjs $compile_deplibs~
- compile_command="$compile_command `find $tpldir -name \*.o | sort | $NL2SP`"'
- old_archive_cmds_CXX='tpldir=Template.dir~
- rm -rf $tpldir~
- $CC --prelink_objects --instantiation_dir $tpldir $oldobjs$old_deplibs~
- $AR $AR_FLAGS $oldlib$oldobjs$old_deplibs `find $tpldir -name \*.o | sort | $NL2SP`~
- $RANLIB $oldlib'
- archive_cmds_CXX='tpldir=Template.dir~
- rm -rf $tpldir~
- $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~
- $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib'
- archive_expsym_cmds_CXX='tpldir=Template.dir~
- rm -rf $tpldir~
- $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~
- $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib'
- ;;
- *) # Version 6 and above use weak symbols
- archive_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib'
- archive_expsym_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib'
- ;;
- esac
-
- hardcode_libdir_flag_spec_CXX='${wl}--rpath ${wl}$libdir'
- export_dynamic_flag_spec_CXX='${wl}--export-dynamic'
- whole_archive_flag_spec_CXX='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
- ;;
- cxx*)
- # Compaq C++
- archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib'
- archive_expsym_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib ${wl}-retain-symbols-file $wl$export_symbols'
-
- runpath_var=LD_RUN_PATH
- hardcode_libdir_flag_spec_CXX='-rpath $libdir'
- hardcode_libdir_separator_CXX=:
-
- # Commands to make compiler produce verbose output that lists
- # what "hidden" libraries, object files and flags are used when
- # linking a shared library.
- #
- # There doesn't appear to be a way to prevent this compiler from
- # explicitly linking system object files so we need to strip them
- # from the output so that they don't get included in the library
- # dependencies.
- output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "X$list" | $Xsed'
- ;;
- xl* | mpixl* | bgxl*)
- # IBM XL 8.0 on PPC, with GNU ld
- hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir'
- export_dynamic_flag_spec_CXX='${wl}--export-dynamic'
- archive_cmds_CXX='$CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
- if test "x$supports_anon_versioning" = xyes; then
- archive_expsym_cmds_CXX='echo "{ global:" > $output_objdir/$libname.ver~
- cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
- echo "local: *; };" >> $output_objdir/$libname.ver~
- $CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib'
- fi
- ;;
- *)
- case `$CC -V 2>&1 | sed 5q` in
- *Sun\ C*)
- # Sun C++ 5.9
- no_undefined_flag_CXX=' -zdefs'
- archive_cmds_CXX='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
- archive_expsym_cmds_CXX='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file ${wl}$export_symbols'
- hardcode_libdir_flag_spec_CXX='-R$libdir'
- whole_archive_flag_spec_CXX='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
- compiler_needs_object_CXX=yes
-
- # Not sure whether something based on
- # $CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1
- # would be better.
- output_verbose_link_cmd='func_echo_all'
-
- # Archives containing C++ object files must be created using
- # "CC -xar", where "CC" is the Sun C++ compiler. This is
- # necessary to make sure instantiated templates are included
- # in the archive.
- old_archive_cmds_CXX='$CC -xar -o $oldlib $oldobjs'
- ;;
- esac
- ;;
- esac
- ;;
-
- lynxos*)
- # FIXME: insert proper C++ library support
- ld_shlibs_CXX=no
- ;;
-
- m88k*)
- # FIXME: insert proper C++ library support
- ld_shlibs_CXX=no
- ;;
-
- mvs*)
- case $cc_basename in
- cxx*)
- # FIXME: insert proper C++ library support
- ld_shlibs_CXX=no
- ;;
- *)
- # FIXME: insert proper C++ library support
- ld_shlibs_CXX=no
- ;;
- esac
- ;;
-
- netbsd*)
- if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
- archive_cmds_CXX='$LD -Bshareable -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags'
- wlarc=
- hardcode_libdir_flag_spec_CXX='-R$libdir'
- hardcode_direct_CXX=yes
- hardcode_shlibpath_var_CXX=no
- fi
- # Workaround some broken pre-1.5 toolchains
- output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP conftest.$objext | $SED -e "s:-lgcc -lc -lgcc::"'
- ;;
-
- *nto* | *qnx*)
- ld_shlibs_CXX=yes
- ;;
-
- openbsd2*)
- # C++ shared libraries are fairly broken
- ld_shlibs_CXX=no
- ;;
-
- openbsd*)
- if test -f /usr/libexec/ld.so; then
- hardcode_direct_CXX=yes
- hardcode_shlibpath_var_CXX=no
- hardcode_direct_absolute_CXX=yes
- archive_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib'
- hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir'
- if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
- archive_expsym_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file,$export_symbols -o $lib'
- export_dynamic_flag_spec_CXX='${wl}-E'
- whole_archive_flag_spec_CXX="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive'
- fi
- output_verbose_link_cmd=func_echo_all
- else
- ld_shlibs_CXX=no
- fi
- ;;
-
- osf3* | osf4* | osf5*)
- case $cc_basename in
- KCC*)
- # Kuck and Associates, Inc. (KAI) C++ Compiler
-
- # KCC will only create a shared library if the output file
- # ends with ".so" (or ".sl" for HP-UX), so rename the library
- # to its proper name (with version) after linking.
- archive_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo "$lib" | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib'
-
- hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir'
- hardcode_libdir_separator_CXX=:
-
- # Archives containing C++ object files must be created using
- # the KAI C++ compiler.
- case $host in
- osf3*) old_archive_cmds_CXX='$CC -Bstatic -o $oldlib $oldobjs' ;;
- *) old_archive_cmds_CXX='$CC -o $oldlib $oldobjs' ;;
- esac
- ;;
- RCC*)
- # Rational C++ 2.4.1
- # FIXME: insert proper C++ library support
- ld_shlibs_CXX=no
- ;;
- cxx*)
- case $host in
- osf3*)
- allow_undefined_flag_CXX=' ${wl}-expect_unresolved ${wl}\*'
- archive_cmds_CXX='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $soname `test -n "$verstring" && func_echo_all "${wl}-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
- hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir'
- ;;
- *)
- allow_undefined_flag_CXX=' -expect_unresolved \*'
- archive_cmds_CXX='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
- archive_expsym_cmds_CXX='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~
- echo "-hidden">> $lib.exp~
- $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname ${wl}-input ${wl}$lib.exp `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~
- $RM $lib.exp'
- hardcode_libdir_flag_spec_CXX='-rpath $libdir'
- ;;
- esac
-
- hardcode_libdir_separator_CXX=:
-
- # Commands to make compiler produce verbose output that lists
- # what "hidden" libraries, object files and flags are used when
- # linking a shared library.
- #
- # There doesn't appear to be a way to prevent this compiler from
- # explicitly linking system object files so we need to strip them
- # from the output so that they don't get included in the library
- # dependencies.
- output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld" | $GREP -v "ld:"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"'
- ;;
- *)
- if test "$GXX" = yes && test "$with_gnu_ld" = no; then
- allow_undefined_flag_CXX=' ${wl}-expect_unresolved ${wl}\*'
- case $host in
- osf3*)
- archive_cmds_CXX='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
- ;;
- *)
- archive_cmds_CXX='$CC -shared $pic_flag -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
- ;;
- esac
-
- hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir'
- hardcode_libdir_separator_CXX=:
-
- # Commands to make compiler produce verbose output that lists
- # what "hidden" libraries, object files and flags are used when
- # linking a shared library.
- output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"'
-
- else
- # FIXME: insert proper C++ library support
- ld_shlibs_CXX=no
- fi
- ;;
- esac
- ;;
-
- psos*)
- # FIXME: insert proper C++ library support
- ld_shlibs_CXX=no
- ;;
-
- sunos4*)
- case $cc_basename in
- CC*)
- # Sun C++ 4.x
- # FIXME: insert proper C++ library support
- ld_shlibs_CXX=no
- ;;
- lcc*)
- # Lucid
- # FIXME: insert proper C++ library support
- ld_shlibs_CXX=no
- ;;
- *)
- # FIXME: insert proper C++ library support
- ld_shlibs_CXX=no
- ;;
- esac
- ;;
-
- solaris*)
- case $cc_basename in
- CC* | sunCC*)
- # Sun C++ 4.2, 5.x and Centerline C++
- archive_cmds_need_lc_CXX=yes
- no_undefined_flag_CXX=' -zdefs'
- archive_cmds_CXX='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
- archive_expsym_cmds_CXX='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
- $CC -G${allow_undefined_flag} ${wl}-M ${wl}$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp'
-
- hardcode_libdir_flag_spec_CXX='-R$libdir'
- hardcode_shlibpath_var_CXX=no
- case $host_os in
- solaris2.[0-5] | solaris2.[0-5].*) ;;
- *)
- # The compiler driver will combine and reorder linker options,
- # but understands `-z linker_flag'.
- # Supported since Solaris 2.6 (maybe 2.5.1?)
- whole_archive_flag_spec_CXX='-z allextract$convenience -z defaultextract'
- ;;
- esac
- link_all_deplibs_CXX=yes
-
- output_verbose_link_cmd='func_echo_all'
-
- # Archives containing C++ object files must be created using
- # "CC -xar", where "CC" is the Sun C++ compiler. This is
- # necessary to make sure instantiated templates are included
- # in the archive.
- old_archive_cmds_CXX='$CC -xar -o $oldlib $oldobjs'
- ;;
- gcx*)
- # Green Hills C++ Compiler
- archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib'
-
- # The C++ compiler must be used to create the archive.
- old_archive_cmds_CXX='$CC $LDFLAGS -archive -o $oldlib $oldobjs'
- ;;
- *)
- # GNU C++ compiler with Solaris linker
- if test "$GXX" = yes && test "$with_gnu_ld" = no; then
- no_undefined_flag_CXX=' ${wl}-z ${wl}defs'
- if $CC --version | $GREP -v '^2\.7' > /dev/null; then
- archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib'
- archive_expsym_cmds_CXX='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
- $CC -shared $pic_flag -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp'
-
- # Commands to make compiler produce verbose output that lists
- # what "hidden" libraries, object files and flags are used when
- # linking a shared library.
- output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"'
- else
- # g++ 2.7 appears to require `-G' NOT `-shared' on this
- # platform.
- archive_cmds_CXX='$CC -G -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib'
- archive_expsym_cmds_CXX='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
- $CC -G -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp'
-
- # Commands to make compiler produce verbose output that lists
- # what "hidden" libraries, object files and flags are used when
- # linking a shared library.
- output_verbose_link_cmd='$CC -G $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"'
- fi
-
- hardcode_libdir_flag_spec_CXX='${wl}-R $wl$libdir'
- case $host_os in
- solaris2.[0-5] | solaris2.[0-5].*) ;;
- *)
- whole_archive_flag_spec_CXX='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract'
- ;;
- esac
- fi
- ;;
- esac
- ;;
-
- sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*)
- no_undefined_flag_CXX='${wl}-z,text'
- archive_cmds_need_lc_CXX=no
- hardcode_shlibpath_var_CXX=no
- runpath_var='LD_RUN_PATH'
-
- case $cc_basename in
- CC*)
- archive_cmds_CXX='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
- archive_expsym_cmds_CXX='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
- ;;
- *)
- archive_cmds_CXX='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
- archive_expsym_cmds_CXX='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
- ;;
- esac
- ;;
-
- sysv5* | sco3.2v5* | sco5v6*)
- # Note: We can NOT use -z defs as we might desire, because we do not
- # link with -lc, and that would cause any symbols used from libc to
- # always be unresolved, which means just about no library would
- # ever link correctly. If we're not using GNU ld we use -z text
- # though, which does catch some bad symbols but isn't as heavy-handed
- # as -z defs.
- no_undefined_flag_CXX='${wl}-z,text'
- allow_undefined_flag_CXX='${wl}-z,nodefs'
- archive_cmds_need_lc_CXX=no
- hardcode_shlibpath_var_CXX=no
- hardcode_libdir_flag_spec_CXX='${wl}-R,$libdir'
- hardcode_libdir_separator_CXX=':'
- link_all_deplibs_CXX=yes
- export_dynamic_flag_spec_CXX='${wl}-Bexport'
- runpath_var='LD_RUN_PATH'
-
- case $cc_basename in
- CC*)
- archive_cmds_CXX='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
- archive_expsym_cmds_CXX='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
- old_archive_cmds_CXX='$CC -Tprelink_objects $oldobjs~
- '"$old_archive_cmds_CXX"
- reload_cmds_CXX='$CC -Tprelink_objects $reload_objs~
- '"$reload_cmds_CXX"
- ;;
- *)
- archive_cmds_CXX='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
- archive_expsym_cmds_CXX='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
- ;;
- esac
- ;;
-
- tandem*)
- case $cc_basename in
- NCC*)
- # NonStop-UX NCC 3.20
- # FIXME: insert proper C++ library support
- ld_shlibs_CXX=no
- ;;
- *)
- # FIXME: insert proper C++ library support
- ld_shlibs_CXX=no
- ;;
- esac
- ;;
-
- vxworks*)
- # FIXME: insert proper C++ library support
- ld_shlibs_CXX=no
- ;;
-
- *)
- # FIXME: insert proper C++ library support
- ld_shlibs_CXX=no
- ;;
- esac
-
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs_CXX" >&5
-$as_echo "$ld_shlibs_CXX" >&6; }
- test "$ld_shlibs_CXX" = no && can_build_shared=no
-
- GCC_CXX="$GXX"
- LD_CXX="$LD"
-
- ## CAVEAT EMPTOR:
- ## There is no encapsulation within the following macros, do not change
- ## the running order or otherwise move them around unless you know exactly
- ## what you are doing...
- # Dependencies to place before and after the object being linked:
-predep_objects_CXX=
-postdep_objects_CXX=
-predeps_CXX=
-postdeps_CXX=
-compiler_lib_search_path_CXX=
-
-cat > conftest.$ac_ext <<_LT_EOF
-class Foo
-{
-public:
- Foo (void) { a = 0; }
-private:
- int a;
-};
-_LT_EOF
-
-
-_lt_libdeps_save_CFLAGS=$CFLAGS
-case "$CC $CFLAGS " in #(
-*\ -flto*\ *) CFLAGS="$CFLAGS -fno-lto" ;;
-*\ -fwhopr*\ *) CFLAGS="$CFLAGS -fno-whopr" ;;
-*\ -fuse-linker-plugin*\ *) CFLAGS="$CFLAGS -fno-use-linker-plugin" ;;
-esac
-
-if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
- (eval $ac_compile) 2>&5
- ac_status=$?
- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
- test $ac_status = 0; }; then
- # Parse the compiler output and extract the necessary
- # objects, libraries and library flags.
-
- # Sentinel used to keep track of whether or not we are before
- # the conftest object file.
- pre_test_object_deps_done=no
-
- for p in `eval "$output_verbose_link_cmd"`; do
- case ${prev}${p} in
-
- -L* | -R* | -l*)
- # Some compilers place space between "-{L,R}" and the path.
- # Remove the space.
- if test $p = "-L" ||
- test $p = "-R"; then
- prev=$p
- continue
- fi
-
- # Expand the sysroot to ease extracting the directories later.
- if test -z "$prev"; then
- case $p in
- -L*) func_stripname_cnf '-L' '' "$p"; prev=-L; p=$func_stripname_result ;;
- -R*) func_stripname_cnf '-R' '' "$p"; prev=-R; p=$func_stripname_result ;;
- -l*) func_stripname_cnf '-l' '' "$p"; prev=-l; p=$func_stripname_result ;;
- esac
- fi
- case $p in
- =*) func_stripname_cnf '=' '' "$p"; p=$lt_sysroot$func_stripname_result ;;
- esac
- if test "$pre_test_object_deps_done" = no; then
- case ${prev} in
- -L | -R)
- # Internal compiler library paths should come after those
- # provided the user. The postdeps already come after the
- # user supplied libs so there is no need to process them.
- if test -z "$compiler_lib_search_path_CXX"; then
- compiler_lib_search_path_CXX="${prev}${p}"
- else
- compiler_lib_search_path_CXX="${compiler_lib_search_path_CXX} ${prev}${p}"
- fi
- ;;
- # The "-l" case would never come before the object being
- # linked, so don't bother handling this case.
- esac
- else
- if test -z "$postdeps_CXX"; then
- postdeps_CXX="${prev}${p}"
- else
- postdeps_CXX="${postdeps_CXX} ${prev}${p}"
- fi
- fi
- prev=
- ;;
-
- *.lto.$objext) ;; # Ignore GCC LTO objects
- *.$objext)
- # This assumes that the test object file only shows up
- # once in the compiler output.
- if test "$p" = "conftest.$objext"; then
- pre_test_object_deps_done=yes
- continue
- fi
-
- if test "$pre_test_object_deps_done" = no; then
- if test -z "$predep_objects_CXX"; then
- predep_objects_CXX="$p"
- else
- predep_objects_CXX="$predep_objects_CXX $p"
- fi
- else
- if test -z "$postdep_objects_CXX"; then
- postdep_objects_CXX="$p"
- else
- postdep_objects_CXX="$postdep_objects_CXX $p"
- fi
- fi
- ;;
-
- *) ;; # Ignore the rest.
-
- esac
- done
-
- # Clean up.
- rm -f a.out a.exe
-else
- echo "libtool.m4: error: problem compiling CXX test program"
-fi
-
-$RM -f confest.$objext
-CFLAGS=$_lt_libdeps_save_CFLAGS
-
-# PORTME: override above test on systems where it is broken
-case $host_os in
-interix[3-9]*)
- # Interix 3.5 installs completely hosed .la files for C++, so rather than
- # hack all around it, let's just trust "g++" to DTRT.
- predep_objects_CXX=
- postdep_objects_CXX=
- postdeps_CXX=
- ;;
-
-linux*)
- case `$CC -V 2>&1 | sed 5q` in
- *Sun\ C*)
- # Sun C++ 5.9
-
- # The more standards-conforming stlport4 library is
- # incompatible with the Cstd library. Avoid specifying
- # it if it's in CXXFLAGS. Ignore libCrun as
- # -library=stlport4 depends on it.
- case " $CXX $CXXFLAGS " in
- *" -library=stlport4 "*)
- solaris_use_stlport4=yes
- ;;
- esac
-
- if test "$solaris_use_stlport4" != yes; then
- postdeps_CXX='-library=Cstd -library=Crun'
- fi
- ;;
- esac
- ;;
-
-solaris*)
- case $cc_basename in
- CC* | sunCC*)
- # The more standards-conforming stlport4 library is
- # incompatible with the Cstd library. Avoid specifying
- # it if it's in CXXFLAGS. Ignore libCrun as
- # -library=stlport4 depends on it.
- case " $CXX $CXXFLAGS " in
- *" -library=stlport4 "*)
- solaris_use_stlport4=yes
- ;;
- esac
-
- # Adding this requires a known-good setup of shared libraries for
- # Sun compiler versions before 5.6, else PIC objects from an old
- # archive will be linked into the output, leading to subtle bugs.
- if test "$solaris_use_stlport4" != yes; then
- postdeps_CXX='-library=Cstd -library=Crun'
- fi
- ;;
- esac
- ;;
-esac
-
-
-case " $postdeps_CXX " in
-*" -lc "*) archive_cmds_need_lc_CXX=no ;;
-esac
- compiler_lib_search_dirs_CXX=
-if test -n "${compiler_lib_search_path_CXX}"; then
- compiler_lib_search_dirs_CXX=`echo " ${compiler_lib_search_path_CXX}" | ${SED} -e 's! -L! !g' -e 's!^ !!'`
-fi
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- lt_prog_compiler_wl_CXX=
-lt_prog_compiler_pic_CXX=
-lt_prog_compiler_static_CXX=
-
-
- # C++ specific cases for pic, static, wl, etc.
- if test "$GXX" = yes; then
- lt_prog_compiler_wl_CXX='-Wl,'
- lt_prog_compiler_static_CXX='-static'
-
- case $host_os in
- aix*)
- # All AIX code is PIC.
- if test "$host_cpu" = ia64; then
- # AIX 5 now supports IA64 processor
- lt_prog_compiler_static_CXX='-Bstatic'
- fi
- ;;
-
- amigaos*)
- case $host_cpu in
- powerpc)
- # see comment about AmigaOS4 .so support
- lt_prog_compiler_pic_CXX='-fPIC'
- ;;
- m68k)
- # FIXME: we need at least 68020 code to build shared libraries, but
- # adding the `-m68020' flag to GCC prevents building anything better,
- # like `-m68040'.
- lt_prog_compiler_pic_CXX='-m68020 -resident32 -malways-restore-a4'
- ;;
- esac
- ;;
-
- beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*)
- # PIC is the default for these OSes.
- ;;
- mingw* | cygwin* | os2* | pw32* | cegcc*)
- # This hack is so that the source file can tell whether it is being
- # built for inclusion in a dll (and should export symbols for example).
- # Although the cygwin gcc ignores -fPIC, still need this for old-style
- # (--disable-auto-import) libraries
- lt_prog_compiler_pic_CXX='-DDLL_EXPORT'
- ;;
- darwin* | rhapsody*)
- # PIC is the default on this platform
- # Common symbols not allowed in MH_DYLIB files
- lt_prog_compiler_pic_CXX='-fno-common'
- ;;
- *djgpp*)
- # DJGPP does not support shared libraries at all
- lt_prog_compiler_pic_CXX=
- ;;
- haiku*)
- # PIC is the default for Haiku.
- # The "-static" flag exists, but is broken.
- lt_prog_compiler_static_CXX=
- ;;
- interix[3-9]*)
- # Interix 3.x gcc -fpic/-fPIC options generate broken code.
- # Instead, we relocate shared libraries at runtime.
- ;;
- sysv4*MP*)
- if test -d /usr/nec; then
- lt_prog_compiler_pic_CXX=-Kconform_pic
- fi
- ;;
- hpux*)
- # PIC is the default for 64-bit PA HP-UX, but not for 32-bit
- # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag
- # sets the default TLS model and affects inlining.
- case $host_cpu in
- hppa*64*)
- ;;
- *)
- lt_prog_compiler_pic_CXX='-fPIC'
- ;;
- esac
- ;;
- *qnx* | *nto*)
- # QNX uses GNU C++, but need to define -shared option too, otherwise
- # it will coredump.
- lt_prog_compiler_pic_CXX='-fPIC -shared'
- ;;
- *)
- lt_prog_compiler_pic_CXX='-fPIC'
- ;;
- esac
- else
- case $host_os in
- aix[4-9]*)
- # All AIX code is PIC.
- if test "$host_cpu" = ia64; then
- # AIX 5 now supports IA64 processor
- lt_prog_compiler_static_CXX='-Bstatic'
- else
- lt_prog_compiler_static_CXX='-bnso -bI:/lib/syscalls.exp'
- fi
- ;;
- chorus*)
- case $cc_basename in
- cxch68*)
- # Green Hills C++ Compiler
- # _LT_TAGVAR(lt_prog_compiler_static, CXX)="--no_auto_instantiation -u __main -u __premain -u _abort -r $COOL_DIR/lib/libOrb.a $MVME_DIR/lib/CC/libC.a $MVME_DIR/lib/classix/libcx.s.a"
- ;;
- esac
- ;;
- mingw* | cygwin* | os2* | pw32* | cegcc*)
- # This hack is so that the source file can tell whether it is being
- # built for inclusion in a dll (and should export symbols for example).
- lt_prog_compiler_pic_CXX='-DDLL_EXPORT'
- ;;
- dgux*)
- case $cc_basename in
- ec++*)
- lt_prog_compiler_pic_CXX='-KPIC'
- ;;
- ghcx*)
- # Green Hills C++ Compiler
- lt_prog_compiler_pic_CXX='-pic'
- ;;
- *)
- ;;
- esac
- ;;
- freebsd* | dragonfly*)
- # FreeBSD uses GNU C++
- ;;
- hpux9* | hpux10* | hpux11*)
- case $cc_basename in
- CC*)
- lt_prog_compiler_wl_CXX='-Wl,'
- lt_prog_compiler_static_CXX='${wl}-a ${wl}archive'
- if test "$host_cpu" != ia64; then
- lt_prog_compiler_pic_CXX='+Z'
- fi
- ;;
- aCC*)
- lt_prog_compiler_wl_CXX='-Wl,'
- lt_prog_compiler_static_CXX='${wl}-a ${wl}archive'
- case $host_cpu in
- hppa*64*|ia64*)
- # +Z the default
- ;;
- *)
- lt_prog_compiler_pic_CXX='+Z'
- ;;
- esac
- ;;
- *)
- ;;
- esac
- ;;
- interix*)
- # This is c89, which is MS Visual C++ (no shared libs)
- # Anyone wants to do a port?
- ;;
- irix5* | irix6* | nonstopux*)
- case $cc_basename in
- CC*)
- lt_prog_compiler_wl_CXX='-Wl,'
- lt_prog_compiler_static_CXX='-non_shared'
- # CC pic flag -KPIC is the default.
- ;;
- *)
- ;;
- esac
- ;;
- linux* | k*bsd*-gnu | kopensolaris*-gnu)
- case $cc_basename in
- KCC*)
- # KAI C++ Compiler
- lt_prog_compiler_wl_CXX='--backend -Wl,'
- lt_prog_compiler_pic_CXX='-fPIC'
- ;;
- ecpc* )
- # old Intel C++ for x86_64 which still supported -KPIC.
- lt_prog_compiler_wl_CXX='-Wl,'
- lt_prog_compiler_pic_CXX='-KPIC'
- lt_prog_compiler_static_CXX='-static'
- ;;
- icpc* )
- # Intel C++, used to be incompatible with GCC.
- # ICC 10 doesn't accept -KPIC any more.
- lt_prog_compiler_wl_CXX='-Wl,'
- lt_prog_compiler_pic_CXX='-fPIC'
- lt_prog_compiler_static_CXX='-static'
- ;;
- pgCC* | pgcpp*)
- # Portland Group C++ compiler
- lt_prog_compiler_wl_CXX='-Wl,'
- lt_prog_compiler_pic_CXX='-fpic'
- lt_prog_compiler_static_CXX='-Bstatic'
- ;;
- cxx*)
- # Compaq C++
- # Make sure the PIC flag is empty. It appears that all Alpha
- # Linux and Compaq Tru64 Unix objects are PIC.
- lt_prog_compiler_pic_CXX=
- lt_prog_compiler_static_CXX='-non_shared'
- ;;
- xlc* | xlC* | bgxl[cC]* | mpixl[cC]*)
- # IBM XL 8.0, 9.0 on PPC and BlueGene
- lt_prog_compiler_wl_CXX='-Wl,'
- lt_prog_compiler_pic_CXX='-qpic'
- lt_prog_compiler_static_CXX='-qstaticlink'
- ;;
- *)
- case `$CC -V 2>&1 | sed 5q` in
- *Sun\ C*)
- # Sun C++ 5.9
- lt_prog_compiler_pic_CXX='-KPIC'
- lt_prog_compiler_static_CXX='-Bstatic'
- lt_prog_compiler_wl_CXX='-Qoption ld '
- ;;
- esac
- ;;
- esac
- ;;
- lynxos*)
- ;;
- m88k*)
- ;;
- mvs*)
- case $cc_basename in
- cxx*)
- lt_prog_compiler_pic_CXX='-W c,exportall'
- ;;
- *)
- ;;
- esac
- ;;
- netbsd*)
- ;;
- *qnx* | *nto*)
- # QNX uses GNU C++, but need to define -shared option too, otherwise
- # it will coredump.
- lt_prog_compiler_pic_CXX='-fPIC -shared'
- ;;
- osf3* | osf4* | osf5*)
- case $cc_basename in
- KCC*)
- lt_prog_compiler_wl_CXX='--backend -Wl,'
- ;;
- RCC*)
- # Rational C++ 2.4.1
- lt_prog_compiler_pic_CXX='-pic'
- ;;
- cxx*)
- # Digital/Compaq C++
- lt_prog_compiler_wl_CXX='-Wl,'
- # Make sure the PIC flag is empty. It appears that all Alpha
- # Linux and Compaq Tru64 Unix objects are PIC.
- lt_prog_compiler_pic_CXX=
- lt_prog_compiler_static_CXX='-non_shared'
- ;;
- *)
- ;;
- esac
- ;;
- psos*)
- ;;
- solaris*)
- case $cc_basename in
- CC* | sunCC*)
- # Sun C++ 4.2, 5.x and Centerline C++
- lt_prog_compiler_pic_CXX='-KPIC'
- lt_prog_compiler_static_CXX='-Bstatic'
- lt_prog_compiler_wl_CXX='-Qoption ld '
- ;;
- gcx*)
- # Green Hills C++ Compiler
- lt_prog_compiler_pic_CXX='-PIC'
- ;;
- *)
- ;;
- esac
- ;;
- sunos4*)
- case $cc_basename in
- CC*)
- # Sun C++ 4.x
- lt_prog_compiler_pic_CXX='-pic'
- lt_prog_compiler_static_CXX='-Bstatic'
- ;;
- lcc*)
- # Lucid
- lt_prog_compiler_pic_CXX='-pic'
- ;;
- *)
- ;;
- esac
- ;;
- sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*)
- case $cc_basename in
- CC*)
- lt_prog_compiler_wl_CXX='-Wl,'
- lt_prog_compiler_pic_CXX='-KPIC'
- lt_prog_compiler_static_CXX='-Bstatic'
- ;;
- esac
- ;;
- tandem*)
- case $cc_basename in
- NCC*)
- # NonStop-UX NCC 3.20
- lt_prog_compiler_pic_CXX='-KPIC'
- ;;
- *)
- ;;
- esac
- ;;
- vxworks*)
- ;;
- *)
- lt_prog_compiler_can_build_shared_CXX=no
- ;;
- esac
- fi
-
-case $host_os in
- # For platforms which do not support PIC, -DPIC is meaningless:
- *djgpp*)
- lt_prog_compiler_pic_CXX=
- ;;
- *)
- lt_prog_compiler_pic_CXX="$lt_prog_compiler_pic_CXX -DPIC"
- ;;
-esac
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC" >&5
-$as_echo_n "checking for $compiler option to produce PIC... " >&6; }
-if ${lt_cv_prog_compiler_pic_CXX+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- lt_cv_prog_compiler_pic_CXX=$lt_prog_compiler_pic_CXX
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_CXX" >&5
-$as_echo "$lt_cv_prog_compiler_pic_CXX" >&6; }
-lt_prog_compiler_pic_CXX=$lt_cv_prog_compiler_pic_CXX
-
-#
-# Check to make sure the PIC flag actually works.
-#
-if test -n "$lt_prog_compiler_pic_CXX"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic_CXX works" >&5
-$as_echo_n "checking if $compiler PIC flag $lt_prog_compiler_pic_CXX works... " >&6; }
-if ${lt_cv_prog_compiler_pic_works_CXX+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- lt_cv_prog_compiler_pic_works_CXX=no
- ac_outfile=conftest.$ac_objext
- echo "$lt_simple_compile_test_code" > conftest.$ac_ext
- lt_compiler_flag="$lt_prog_compiler_pic_CXX -DPIC"
- # Insert the option either (1) after the last *FLAGS variable, or
- # (2) before a word containing "conftest.", or (3) at the end.
- # Note that $ac_compile itself does not contain backslashes and begins
- # with a dollar sign (not a hyphen), so the echo should work correctly.
- # The option is referenced via a variable to avoid confusing sed.
- lt_compile=`echo "$ac_compile" | $SED \
- -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
- -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
- -e 's:$: $lt_compiler_flag:'`
- (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5)
- (eval "$lt_compile" 2>conftest.err)
- ac_status=$?
- cat conftest.err >&5
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- if (exit $ac_status) && test -s "$ac_outfile"; then
- # The compiler can only warn and ignore the option if not recognized
- # So say no if there are warnings other than the usual output.
- $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp
- $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
- if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then
- lt_cv_prog_compiler_pic_works_CXX=yes
- fi
- fi
- $RM conftest*
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works_CXX" >&5
-$as_echo "$lt_cv_prog_compiler_pic_works_CXX" >&6; }
-
-if test x"$lt_cv_prog_compiler_pic_works_CXX" = xyes; then
- case $lt_prog_compiler_pic_CXX in
- "" | " "*) ;;
- *) lt_prog_compiler_pic_CXX=" $lt_prog_compiler_pic_CXX" ;;
- esac
-else
- lt_prog_compiler_pic_CXX=
- lt_prog_compiler_can_build_shared_CXX=no
-fi
-
-fi
-
-
-
-
-
-#
-# Check to make sure the static flag actually works.
-#
-wl=$lt_prog_compiler_wl_CXX eval lt_tmp_static_flag=\"$lt_prog_compiler_static_CXX\"
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler static flag $lt_tmp_static_flag works" >&5
-$as_echo_n "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; }
-if ${lt_cv_prog_compiler_static_works_CXX+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- lt_cv_prog_compiler_static_works_CXX=no
- save_LDFLAGS="$LDFLAGS"
- LDFLAGS="$LDFLAGS $lt_tmp_static_flag"
- echo "$lt_simple_link_test_code" > conftest.$ac_ext
- if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then
- # The linker can only warn and ignore the option if not recognized
- # So say no if there are warnings
- if test -s conftest.err; then
- # Append any errors to the config.log.
- cat conftest.err 1>&5
- $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp
- $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
- if diff conftest.exp conftest.er2 >/dev/null; then
- lt_cv_prog_compiler_static_works_CXX=yes
- fi
- else
- lt_cv_prog_compiler_static_works_CXX=yes
- fi
- fi
- $RM -r conftest*
- LDFLAGS="$save_LDFLAGS"
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_static_works_CXX" >&5
-$as_echo "$lt_cv_prog_compiler_static_works_CXX" >&6; }
-
-if test x"$lt_cv_prog_compiler_static_works_CXX" = xyes; then
- :
-else
- lt_prog_compiler_static_CXX=
-fi
-
-
-
-
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5
-$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; }
-if ${lt_cv_prog_compiler_c_o_CXX+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- lt_cv_prog_compiler_c_o_CXX=no
- $RM -r conftest 2>/dev/null
- mkdir conftest
- cd conftest
- mkdir out
- echo "$lt_simple_compile_test_code" > conftest.$ac_ext
-
- lt_compiler_flag="-o out/conftest2.$ac_objext"
- # Insert the option either (1) after the last *FLAGS variable, or
- # (2) before a word containing "conftest.", or (3) at the end.
- # Note that $ac_compile itself does not contain backslashes and begins
- # with a dollar sign (not a hyphen), so the echo should work correctly.
- lt_compile=`echo "$ac_compile" | $SED \
- -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
- -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
- -e 's:$: $lt_compiler_flag:'`
- (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5)
- (eval "$lt_compile" 2>out/conftest.err)
- ac_status=$?
- cat out/conftest.err >&5
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- if (exit $ac_status) && test -s out/conftest2.$ac_objext
- then
- # The compiler can only warn and ignore the option if not recognized
- # So say no if there are warnings
- $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp
- $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2
- if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then
- lt_cv_prog_compiler_c_o_CXX=yes
- fi
- fi
- chmod u+w . 2>&5
- $RM conftest*
- # SGI C++ compiler will create directory out/ii_files/ for
- # template instantiation
- test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files
- $RM out/* && rmdir out
- cd ..
- $RM -r conftest
- $RM conftest*
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o_CXX" >&5
-$as_echo "$lt_cv_prog_compiler_c_o_CXX" >&6; }
-
-
-
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5
-$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; }
-if ${lt_cv_prog_compiler_c_o_CXX+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- lt_cv_prog_compiler_c_o_CXX=no
- $RM -r conftest 2>/dev/null
- mkdir conftest
- cd conftest
- mkdir out
- echo "$lt_simple_compile_test_code" > conftest.$ac_ext
-
- lt_compiler_flag="-o out/conftest2.$ac_objext"
- # Insert the option either (1) after the last *FLAGS variable, or
- # (2) before a word containing "conftest.", or (3) at the end.
- # Note that $ac_compile itself does not contain backslashes and begins
- # with a dollar sign (not a hyphen), so the echo should work correctly.
- lt_compile=`echo "$ac_compile" | $SED \
- -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
- -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
- -e 's:$: $lt_compiler_flag:'`
- (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5)
- (eval "$lt_compile" 2>out/conftest.err)
- ac_status=$?
- cat out/conftest.err >&5
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- if (exit $ac_status) && test -s out/conftest2.$ac_objext
- then
- # The compiler can only warn and ignore the option if not recognized
- # So say no if there are warnings
- $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp
- $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2
- if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then
- lt_cv_prog_compiler_c_o_CXX=yes
- fi
- fi
- chmod u+w . 2>&5
- $RM conftest*
- # SGI C++ compiler will create directory out/ii_files/ for
- # template instantiation
- test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files
- $RM out/* && rmdir out
- cd ..
- $RM -r conftest
- $RM conftest*
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o_CXX" >&5
-$as_echo "$lt_cv_prog_compiler_c_o_CXX" >&6; }
-
-
-
-
-hard_links="nottested"
-if test "$lt_cv_prog_compiler_c_o_CXX" = no && test "$need_locks" != no; then
- # do not overwrite the value of need_locks provided by the user
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links" >&5
-$as_echo_n "checking if we can lock with hard links... " >&6; }
- hard_links=yes
- $RM conftest*
- ln conftest.a conftest.b 2>/dev/null && hard_links=no
- touch conftest.a
- ln conftest.a conftest.b 2>&5 || hard_links=no
- ln conftest.a conftest.b 2>/dev/null && hard_links=no
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hard_links" >&5
-$as_echo "$hard_links" >&6; }
- if test "$hard_links" = no; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5
-$as_echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;}
- need_locks=warn
- fi
-else
- need_locks=no
-fi
-
-
-
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5
-$as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; }
-
- export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
- exclude_expsyms_CXX='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'
- case $host_os in
- aix[4-9]*)
- # If we're using GNU nm, then we don't want the "-C" option.
- # -C means demangle to AIX nm, but means don't demangle with GNU nm
- # Also, AIX nm treats weak defined symbols like other global defined
- # symbols, whereas GNU nm marks them as "W".
- if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then
- export_symbols_cmds_CXX='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols'
- else
- export_symbols_cmds_CXX='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols'
- fi
- ;;
- pw32*)
- export_symbols_cmds_CXX="$ltdll_cmds"
- ;;
- cygwin* | mingw* | cegcc*)
- case $cc_basename in
- cl*)
- exclude_expsyms_CXX='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*'
- ;;
- *)
- export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/;s/^.*[ ]__nm__\([^ ]*\)[ ][^ ]*/\1 DATA/;/^I[ ]/d;/^[AITW][ ]/s/.* //'\'' | sort | uniq > $export_symbols'
- exclude_expsyms_CXX='[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname'
- ;;
- esac
- ;;
- *)
- export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
- ;;
- esac
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs_CXX" >&5
-$as_echo "$ld_shlibs_CXX" >&6; }
-test "$ld_shlibs_CXX" = no && can_build_shared=no
-
-with_gnu_ld_CXX=$with_gnu_ld
-
-
-
-
-
-
-#
-# Do we need to explicitly link libc?
-#
-case "x$archive_cmds_need_lc_CXX" in
-x|xyes)
- # Assume -lc should be added
- archive_cmds_need_lc_CXX=yes
-
- if test "$enable_shared" = yes && test "$GCC" = yes; then
- case $archive_cmds_CXX in
- *'~'*)
- # FIXME: we may have to deal with multi-command sequences.
- ;;
- '$CC '*)
- # Test whether the compiler implicitly links with -lc since on some
- # systems, -lgcc has to come before -lc. If gcc already passes -lc
- # to ld, don't add -lc before -lgcc.
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -lc should be explicitly linked in" >&5
-$as_echo_n "checking whether -lc should be explicitly linked in... " >&6; }
-if ${lt_cv_archive_cmds_need_lc_CXX+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- $RM conftest*
- echo "$lt_simple_compile_test_code" > conftest.$ac_ext
-
- if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
- (eval $ac_compile) 2>&5
- ac_status=$?
- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
- test $ac_status = 0; } 2>conftest.err; then
- soname=conftest
- lib=conftest
- libobjs=conftest.$ac_objext
- deplibs=
- wl=$lt_prog_compiler_wl_CXX
- pic_flag=$lt_prog_compiler_pic_CXX
- compiler_flags=-v
- linker_flags=-v
- verstring=
- output_objdir=.
- libname=conftest
- lt_save_allow_undefined_flag=$allow_undefined_flag_CXX
- allow_undefined_flag_CXX=
- if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$archive_cmds_CXX 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1\""; } >&5
- (eval $archive_cmds_CXX 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) 2>&5
- ac_status=$?
- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
- test $ac_status = 0; }
- then
- lt_cv_archive_cmds_need_lc_CXX=no
- else
- lt_cv_archive_cmds_need_lc_CXX=yes
- fi
- allow_undefined_flag_CXX=$lt_save_allow_undefined_flag
- else
- cat conftest.err 1>&5
- fi
- $RM conftest*
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_archive_cmds_need_lc_CXX" >&5
-$as_echo "$lt_cv_archive_cmds_need_lc_CXX" >&6; }
- archive_cmds_need_lc_CXX=$lt_cv_archive_cmds_need_lc_CXX
- ;;
- esac
- fi
- ;;
-esac
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics" >&5
-$as_echo_n "checking dynamic linker characteristics... " >&6; }
-
-library_names_spec=
-libname_spec='lib$name'
-soname_spec=
-shrext_cmds=".so"
-postinstall_cmds=
-postuninstall_cmds=
-finish_cmds=
-finish_eval=
-shlibpath_var=
-shlibpath_overrides_runpath=unknown
-version_type=none
-dynamic_linker="$host_os ld.so"
-sys_lib_dlsearch_path_spec="/lib /usr/lib"
-need_lib_prefix=unknown
-hardcode_into_libs=no
-
-# when you set need_version to no, make sure it does not cause -set_version
-# flags to be left without arguments
-need_version=unknown
-
-case $host_os in
-aix3*)
- version_type=linux # correct to gnu/linux during the next big refactor
- library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a'
- shlibpath_var=LIBPATH
-
- # AIX 3 has no versioning support, so we append a major version to the name.
- soname_spec='${libname}${release}${shared_ext}$major'
- ;;
-
-aix[4-9]*)
- version_type=linux # correct to gnu/linux during the next big refactor
- need_lib_prefix=no
- need_version=no
- hardcode_into_libs=yes
- if test "$host_cpu" = ia64; then
- # AIX 5 supports IA64
- library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}'
- shlibpath_var=LD_LIBRARY_PATH
- else
- # With GCC up to 2.95.x, collect2 would create an import file
- # for dependence libraries. The import file would start with
- # the line `#! .'. This would cause the generated library to
- # depend on `.', always an invalid library. This was fixed in
- # development snapshots of GCC prior to 3.0.
- case $host_os in
- aix4 | aix4.[01] | aix4.[01].*)
- if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)'
- echo ' yes '
- echo '#endif'; } | ${CC} -E - | $GREP yes > /dev/null; then
- :
- else
- can_build_shared=no
- fi
- ;;
- esac
- # AIX (on Power*) has no versioning support, so currently we can not hardcode correct
- # soname into executable. Probably we can add versioning support to
- # collect2, so additional links can be useful in future.
- if test "$aix_use_runtimelinking" = yes; then
- # If using run time linking (on AIX 4.2 or later) use lib<name>.so
- # instead of lib<name>.a to let people know that these are not
- # typical AIX shared libraries.
- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
- else
- # We preserve .a as extension for shared libraries through AIX4.2
- # and later when we are not doing run time linking.
- library_names_spec='${libname}${release}.a $libname.a'
- soname_spec='${libname}${release}${shared_ext}$major'
- fi
- shlibpath_var=LIBPATH
- fi
- ;;
-
-amigaos*)
- case $host_cpu in
- powerpc)
- # Since July 2007 AmigaOS4 officially supports .so libraries.
- # When compiling the executable, add -use-dynld -Lsobjs: to the compileline.
- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
- ;;
- m68k)
- library_names_spec='$libname.ixlibrary $libname.a'
- # Create ${libname}_ixlibrary.a entries in /sys/libs.
- finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done'
- ;;
- esac
- ;;
-
-beos*)
- library_names_spec='${libname}${shared_ext}'
- dynamic_linker="$host_os ld.so"
- shlibpath_var=LIBRARY_PATH
- ;;
-
-bsdi[45]*)
- version_type=linux # correct to gnu/linux during the next big refactor
- need_version=no
- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
- soname_spec='${libname}${release}${shared_ext}$major'
- finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir'
- shlibpath_var=LD_LIBRARY_PATH
- sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib"
- sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib"
- # the default ld.so.conf also contains /usr/contrib/lib and
- # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow
- # libtool to hard-code these into programs
- ;;
-
-cygwin* | mingw* | pw32* | cegcc*)
- version_type=windows
- shrext_cmds=".dll"
- need_version=no
- need_lib_prefix=no
-
- case $GCC,$cc_basename in
- yes,*)
- # gcc
- library_names_spec='$libname.dll.a'
- # DLL is installed to $(libdir)/../bin by postinstall_cmds
- postinstall_cmds='base_file=`basename \${file}`~
- dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~
- dldir=$destdir/`dirname \$dlpath`~
- test -d \$dldir || mkdir -p \$dldir~
- $install_prog $dir/$dlname \$dldir/$dlname~
- chmod a+x \$dldir/$dlname~
- if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then
- eval '\''$striplib \$dldir/$dlname'\'' || exit \$?;
- fi'
- postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~
- dlpath=$dir/\$dldll~
- $RM \$dlpath'
- shlibpath_overrides_runpath=yes
-
- case $host_os in
- cygwin*)
- # Cygwin DLLs use 'cyg' prefix rather than 'lib'
- soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
-
- ;;
- mingw* | cegcc*)
- # MinGW DLLs use traditional 'lib' prefix
- soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
- ;;
- pw32*)
- # pw32 DLLs use 'pw' prefix rather than 'lib'
- library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
- ;;
- esac
- dynamic_linker='Win32 ld.exe'
- ;;
-
- *,cl*)
- # Native MSVC
- libname_spec='$name'
- soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
- library_names_spec='${libname}.dll.lib'
-
- case $build_os in
- mingw*)
- sys_lib_search_path_spec=
- lt_save_ifs=$IFS
- IFS=';'
- for lt_path in $LIB
- do
- IFS=$lt_save_ifs
- # Let DOS variable expansion print the short 8.3 style file name.
- lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"`
- sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path"
- done
- IFS=$lt_save_ifs
- # Convert to MSYS style.
- sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([a-zA-Z]\\):| /\\1|g' -e 's|^ ||'`
- ;;
- cygwin*)
- # Convert to unix form, then to dos form, then back to unix form
- # but this time dos style (no spaces!) so that the unix form looks
- # like /cygdrive/c/PROGRA~1:/cygdr...
- sys_lib_search_path_spec=`cygpath --path --unix "$LIB"`
- sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null`
- sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"`
- ;;
- *)
- sys_lib_search_path_spec="$LIB"
- if $ECHO "$sys_lib_search_path_spec" | $GREP ';[c-zC-Z]:/' >/dev/null; then
- # It is most probably a Windows format PATH.
- sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'`
- else
- sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"`
- fi
- # FIXME: find the short name or the path components, as spaces are
- # common. (e.g. "Program Files" -> "PROGRA~1")
- ;;
- esac
-
- # DLL is installed to $(libdir)/../bin by postinstall_cmds
- postinstall_cmds='base_file=`basename \${file}`~
- dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~
- dldir=$destdir/`dirname \$dlpath`~
- test -d \$dldir || mkdir -p \$dldir~
- $install_prog $dir/$dlname \$dldir/$dlname'
- postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~
- dlpath=$dir/\$dldll~
- $RM \$dlpath'
- shlibpath_overrides_runpath=yes
- dynamic_linker='Win32 link.exe'
- ;;
-
- *)
- # Assume MSVC wrapper
- library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib'
- dynamic_linker='Win32 ld.exe'
- ;;
- esac
- # FIXME: first we should search . and the directory the executable is in
- shlibpath_var=PATH
- ;;
-
-darwin* | rhapsody*)
- dynamic_linker="$host_os dyld"
- version_type=darwin
- need_lib_prefix=no
- need_version=no
- library_names_spec='${libname}${release}${major}$shared_ext ${libname}$shared_ext'
- soname_spec='${libname}${release}${major}$shared_ext'
- shlibpath_overrides_runpath=yes
- shlibpath_var=DYLD_LIBRARY_PATH
- shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`'
-
- sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib'
- ;;
-
-dgux*)
- version_type=linux # correct to gnu/linux during the next big refactor
- need_lib_prefix=no
- need_version=no
- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext'
- soname_spec='${libname}${release}${shared_ext}$major'
- shlibpath_var=LD_LIBRARY_PATH
- ;;
-
-freebsd* | dragonfly*)
- # DragonFly does not have aout. When/if they implement a new
- # versioning mechanism, adjust this.
- if test -x /usr/bin/objformat; then
- objformat=`/usr/bin/objformat`
- else
- case $host_os in
- freebsd[23].*) objformat=aout ;;
- *) objformat=elf ;;
- esac
- fi
- # Handle Gentoo/FreeBSD as it was Linux
- case $host_vendor in
- gentoo)
- version_type=linux ;;
- *)
- version_type=freebsd-$objformat ;;
- esac
-
- case $version_type in
- freebsd-elf*)
- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}'
- need_version=no
- need_lib_prefix=no
- ;;
- freebsd-*)
- library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix'
- need_version=yes
- ;;
- linux)
- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
- soname_spec='${libname}${release}${shared_ext}$major'
- need_lib_prefix=no
- need_version=no
- ;;
- esac
- shlibpath_var=LD_LIBRARY_PATH
- case $host_os in
- freebsd2.*)
- shlibpath_overrides_runpath=yes
- ;;
- freebsd3.[01]* | freebsdelf3.[01]*)
- shlibpath_overrides_runpath=yes
- hardcode_into_libs=yes
- ;;
- freebsd3.[2-9]* | freebsdelf3.[2-9]* | \
- freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1)
- shlibpath_overrides_runpath=no
- hardcode_into_libs=yes
- ;;
- *) # from 4.6 on, and DragonFly
- shlibpath_overrides_runpath=yes
- hardcode_into_libs=yes
- ;;
- esac
- ;;
-
-gnu*)
- version_type=linux # correct to gnu/linux during the next big refactor
- need_lib_prefix=no
- need_version=no
- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}'
- soname_spec='${libname}${release}${shared_ext}$major'
- shlibpath_var=LD_LIBRARY_PATH
- shlibpath_overrides_runpath=no
- hardcode_into_libs=yes
- ;;
-
-haiku*)
- version_type=linux # correct to gnu/linux during the next big refactor
- need_lib_prefix=no
- need_version=no
- dynamic_linker="$host_os runtime_loader"
- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}'
- soname_spec='${libname}${release}${shared_ext}$major'
- shlibpath_var=LIBRARY_PATH
- shlibpath_overrides_runpath=yes
- sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib'
- hardcode_into_libs=yes
- ;;
-
-hpux9* | hpux10* | hpux11*)
- # Give a soname corresponding to the major version so that dld.sl refuses to
- # link against other versions.
- version_type=sunos
- need_lib_prefix=no
- need_version=no
- case $host_cpu in
- ia64*)
- shrext_cmds='.so'
- hardcode_into_libs=yes
- dynamic_linker="$host_os dld.so"
- shlibpath_var=LD_LIBRARY_PATH
- shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
- soname_spec='${libname}${release}${shared_ext}$major'
- if test "X$HPUX_IA64_MODE" = X32; then
- sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib"
- else
- sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64"
- fi
- sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
- ;;
- hppa*64*)
- shrext_cmds='.sl'
- hardcode_into_libs=yes
- dynamic_linker="$host_os dld.sl"
- shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH
- shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
- soname_spec='${libname}${release}${shared_ext}$major'
- sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64"
- sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
- ;;
- *)
- shrext_cmds='.sl'
- dynamic_linker="$host_os dld.sl"
- shlibpath_var=SHLIB_PATH
- shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH
- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
- soname_spec='${libname}${release}${shared_ext}$major'
- ;;
- esac
- # HP-UX runs *really* slowly unless shared libraries are mode 555, ...
- postinstall_cmds='chmod 555 $lib'
- # or fails outright, so override atomically:
- install_override_mode=555
- ;;
-
-interix[3-9]*)
- version_type=linux # correct to gnu/linux during the next big refactor
- need_lib_prefix=no
- need_version=no
- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
- soname_spec='${libname}${release}${shared_ext}$major'
- dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)'
- shlibpath_var=LD_LIBRARY_PATH
- shlibpath_overrides_runpath=no
- hardcode_into_libs=yes
- ;;
-
-irix5* | irix6* | nonstopux*)
- case $host_os in
- nonstopux*) version_type=nonstopux ;;
- *)
- if test "$lt_cv_prog_gnu_ld" = yes; then
- version_type=linux # correct to gnu/linux during the next big refactor
- else
- version_type=irix
- fi ;;
- esac
- need_lib_prefix=no
- need_version=no
- soname_spec='${libname}${release}${shared_ext}$major'
- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}'
- case $host_os in
- irix5* | nonstopux*)
- libsuff= shlibsuff=
- ;;
- *)
- case $LD in # libtool.m4 will add one of these switches to LD
- *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ")
- libsuff= shlibsuff= libmagic=32-bit;;
- *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ")
- libsuff=32 shlibsuff=N32 libmagic=N32;;
- *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ")
- libsuff=64 shlibsuff=64 libmagic=64-bit;;
- *) libsuff= shlibsuff= libmagic=never-match;;
- esac
- ;;
- esac
- shlibpath_var=LD_LIBRARY${shlibsuff}_PATH
- shlibpath_overrides_runpath=no
- sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}"
- sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}"
- hardcode_into_libs=yes
- ;;
-
-# No shared lib support for Linux oldld, aout, or coff.
-linux*oldld* | linux*aout* | linux*coff*)
- dynamic_linker=no
- ;;
-
-# This must be glibc/ELF.
-linux* | k*bsd*-gnu | kopensolaris*-gnu)
- version_type=linux # correct to gnu/linux during the next big refactor
- need_lib_prefix=no
- need_version=no
- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
- soname_spec='${libname}${release}${shared_ext}$major'
- finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir'
- shlibpath_var=LD_LIBRARY_PATH
- shlibpath_overrides_runpath=no
-
- # Some binutils ld are patched to set DT_RUNPATH
- if ${lt_cv_shlibpath_overrides_runpath+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- lt_cv_shlibpath_overrides_runpath=no
- save_LDFLAGS=$LDFLAGS
- save_libdir=$libdir
- eval "libdir=/foo; wl=\"$lt_prog_compiler_wl_CXX\"; \
- LDFLAGS=\"\$LDFLAGS $hardcode_libdir_flag_spec_CXX\""
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-
-int
-main ()
-{
-
- ;
- return 0;
-}
-_ACEOF
-if ac_fn_cxx_try_link "$LINENO"; then :
- if ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null; then :
- lt_cv_shlibpath_overrides_runpath=yes
-fi
-fi
-rm -f core conftest.err conftest.$ac_objext \
- conftest$ac_exeext conftest.$ac_ext
- LDFLAGS=$save_LDFLAGS
- libdir=$save_libdir
-
-fi
-
- shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath
-
- # This implies no fast_install, which is unacceptable.
- # Some rework will be needed to allow for fast_install
- # before this can be enabled.
- hardcode_into_libs=yes
-
- # Append ld.so.conf contents to the search path
- if test -f /etc/ld.so.conf; then
- lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '`
- sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra"
- fi
-
- # We used to test for /lib/ld.so.1 and disable shared libraries on
- # powerpc, because MkLinux only supported shared libraries with the
- # GNU dynamic linker. Since this was broken with cross compilers,
- # most powerpc-linux boxes support dynamic linking these days and
- # people can always --disable-shared, the test was removed, and we
- # assume the GNU/Linux dynamic linker is in use.
- dynamic_linker='GNU/Linux ld.so'
- ;;
-
-netbsd*)
- version_type=sunos
- need_lib_prefix=no
- need_version=no
- if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
- finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
- dynamic_linker='NetBSD (a.out) ld.so'
- else
- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
- soname_spec='${libname}${release}${shared_ext}$major'
- dynamic_linker='NetBSD ld.elf_so'
- fi
- shlibpath_var=LD_LIBRARY_PATH
- shlibpath_overrides_runpath=yes
- hardcode_into_libs=yes
- ;;
-
-newsos6)
- version_type=linux # correct to gnu/linux during the next big refactor
- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
- shlibpath_var=LD_LIBRARY_PATH
- shlibpath_overrides_runpath=yes
- ;;
-
-*nto* | *qnx*)
- version_type=qnx
- need_lib_prefix=no
- need_version=no
- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
- soname_spec='${libname}${release}${shared_ext}$major'
- shlibpath_var=LD_LIBRARY_PATH
- shlibpath_overrides_runpath=no
- hardcode_into_libs=yes
- dynamic_linker='ldqnx.so'
- ;;
-
-openbsd*)
- version_type=sunos
- sys_lib_dlsearch_path_spec="/usr/lib"
- need_lib_prefix=no
- # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs.
- case $host_os in
- openbsd3.3 | openbsd3.3.*) need_version=yes ;;
- *) need_version=no ;;
- esac
- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
- finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
- shlibpath_var=LD_LIBRARY_PATH
- if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
- case $host_os in
- openbsd2.[89] | openbsd2.[89].*)
- shlibpath_overrides_runpath=no
- ;;
- *)
- shlibpath_overrides_runpath=yes
- ;;
- esac
- else
- shlibpath_overrides_runpath=yes
- fi
- ;;
-
-os2*)
- libname_spec='$name'
- shrext_cmds=".dll"
- need_lib_prefix=no
- library_names_spec='$libname${shared_ext} $libname.a'
- dynamic_linker='OS/2 ld.exe'
- shlibpath_var=LIBPATH
- ;;
-
-osf3* | osf4* | osf5*)
- version_type=osf
- need_lib_prefix=no
- need_version=no
- soname_spec='${libname}${release}${shared_ext}$major'
- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
- shlibpath_var=LD_LIBRARY_PATH
- sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib"
- sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec"
- ;;
-
-rdos*)
- dynamic_linker=no
- ;;
-
-solaris*)
- version_type=linux # correct to gnu/linux during the next big refactor
- need_lib_prefix=no
- need_version=no
- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
- soname_spec='${libname}${release}${shared_ext}$major'
- shlibpath_var=LD_LIBRARY_PATH
- shlibpath_overrides_runpath=yes
- hardcode_into_libs=yes
- # ldd complains unless libraries are executable
- postinstall_cmds='chmod +x $lib'
- ;;
-
-sunos4*)
- version_type=sunos
- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
- finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir'
- shlibpath_var=LD_LIBRARY_PATH
- shlibpath_overrides_runpath=yes
- if test "$with_gnu_ld" = yes; then
- need_lib_prefix=no
- fi
- need_version=yes
- ;;
-
-sysv4 | sysv4.3*)
- version_type=linux # correct to gnu/linux during the next big refactor
- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
- soname_spec='${libname}${release}${shared_ext}$major'
- shlibpath_var=LD_LIBRARY_PATH
- case $host_vendor in
- sni)
- shlibpath_overrides_runpath=no
- need_lib_prefix=no
- runpath_var=LD_RUN_PATH
- ;;
- siemens)
- need_lib_prefix=no
- ;;
- motorola)
- need_lib_prefix=no
- need_version=no
- shlibpath_overrides_runpath=no
- sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib'
- ;;
- esac
- ;;
-
-sysv4*MP*)
- if test -d /usr/nec ;then
- version_type=linux # correct to gnu/linux during the next big refactor
- library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}'
- soname_spec='$libname${shared_ext}.$major'
- shlibpath_var=LD_LIBRARY_PATH
- fi
- ;;
-
-sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
- version_type=freebsd-elf
- need_lib_prefix=no
- need_version=no
- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}'
- soname_spec='${libname}${release}${shared_ext}$major'
- shlibpath_var=LD_LIBRARY_PATH
- shlibpath_overrides_runpath=yes
- hardcode_into_libs=yes
- if test "$with_gnu_ld" = yes; then
- sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib'
- else
- sys_lib_search_path_spec='/usr/ccs/lib /usr/lib'
- case $host_os in
- sco3.2v5*)
- sys_lib_search_path_spec="$sys_lib_search_path_spec /lib"
- ;;
- esac
- fi
- sys_lib_dlsearch_path_spec='/usr/lib'
- ;;
-
-tpf*)
- # TPF is a cross-target only. Preferred cross-host = GNU/Linux.
- version_type=linux # correct to gnu/linux during the next big refactor
- need_lib_prefix=no
- need_version=no
- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
- shlibpath_var=LD_LIBRARY_PATH
- shlibpath_overrides_runpath=no
- hardcode_into_libs=yes
- ;;
-
-uts4*)
- version_type=linux # correct to gnu/linux during the next big refactor
- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
- soname_spec='${libname}${release}${shared_ext}$major'
- shlibpath_var=LD_LIBRARY_PATH
- ;;
-
-*)
- dynamic_linker=no
- ;;
-esac
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $dynamic_linker" >&5
-$as_echo "$dynamic_linker" >&6; }
-test "$dynamic_linker" = no && can_build_shared=no
-
-variables_saved_for_relink="PATH $shlibpath_var $runpath_var"
-if test "$GCC" = yes; then
- variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH"
-fi
-
-if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then
- sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec"
-fi
-if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then
- sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec"
-fi
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to hardcode library paths into programs" >&5
-$as_echo_n "checking how to hardcode library paths into programs... " >&6; }
-hardcode_action_CXX=
-if test -n "$hardcode_libdir_flag_spec_CXX" ||
- test -n "$runpath_var_CXX" ||
- test "X$hardcode_automatic_CXX" = "Xyes" ; then
-
- # We can hardcode non-existent directories.
- if test "$hardcode_direct_CXX" != no &&
- # If the only mechanism to avoid hardcoding is shlibpath_var, we
- # have to relink, otherwise we might link with an installed library
- # when we should be linking with a yet-to-be-installed one
- ## test "$_LT_TAGVAR(hardcode_shlibpath_var, CXX)" != no &&
- test "$hardcode_minus_L_CXX" != no; then
- # Linking always hardcodes the temporary library directory.
- hardcode_action_CXX=relink
- else
- # We can link without hardcoding, and we can hardcode nonexisting dirs.
- hardcode_action_CXX=immediate
- fi
-else
- # We cannot hardcode anything, or else we can only hardcode existing
- # directories.
- hardcode_action_CXX=unsupported
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $hardcode_action_CXX" >&5
-$as_echo "$hardcode_action_CXX" >&6; }
-
-if test "$hardcode_action_CXX" = relink ||
- test "$inherit_rpath_CXX" = yes; then
- # Fast installation is not supported
- enable_fast_install=no
-elif test "$shlibpath_overrides_runpath" = yes ||
- test "$enable_shared" = no; then
- # Fast installation is not necessary
- enable_fast_install=needless
-fi
-
-
-
-
-
-
-
- fi # test -n "$compiler"
-
- CC=$lt_save_CC
- CFLAGS=$lt_save_CFLAGS
- LDCXX=$LD
- LD=$lt_save_LD
- GCC=$lt_save_GCC
- with_gnu_ld=$lt_save_with_gnu_ld
- lt_cv_path_LDCXX=$lt_cv_path_LD
- lt_cv_path_LD=$lt_save_path_LD
- lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld
- lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld
-fi # test "$_lt_caught_CXX_error" != yes
-
-ac_ext=cpp
-ac_cpp='$CXXCPP $CPPFLAGS'
-ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- ac_config_commands="$ac_config_commands libtool"
-
-
-
-
-# Only expand once:
-
-
-
-# newer libtool...
-
-
-
-
-echo "-----------------------------------------------"
-
-
-# Machine characteristics
-
-# The cast to long int works around a bug in the HP C Compiler
-# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
-# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'.
-# This bug is HP SR number 8606223364.
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of char" >&5
-$as_echo_n "checking size of char... " >&6; }
-if ${ac_cv_sizeof_char+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- if ac_fn_cxx_compute_int "$LINENO" "(long int) (sizeof (char))" "ac_cv_sizeof_char" "$ac_includes_default"; then :
-
-else
- if test "$ac_cv_type_char" = yes; then
- { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
-as_fn_error 77 "cannot compute sizeof (char)
-See \`config.log' for more details" "$LINENO" 5; }
- else
- ac_cv_sizeof_char=0
- fi
-fi
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_char" >&5
-$as_echo "$ac_cv_sizeof_char" >&6; }
-
-
-
-cat >>confdefs.h <<_ACEOF
-#define SIZEOF_CHAR $ac_cv_sizeof_char
-_ACEOF
-
-
-# The cast to long int works around a bug in the HP C Compiler
-# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
-# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'.
-# This bug is HP SR number 8606223364.
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of short" >&5
-$as_echo_n "checking size of short... " >&6; }
-if ${ac_cv_sizeof_short+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- if ac_fn_cxx_compute_int "$LINENO" "(long int) (sizeof (short))" "ac_cv_sizeof_short" "$ac_includes_default"; then :
-
-else
- if test "$ac_cv_type_short" = yes; then
- { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
-as_fn_error 77 "cannot compute sizeof (short)
-See \`config.log' for more details" "$LINENO" 5; }
- else
- ac_cv_sizeof_short=0
- fi
-fi
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_short" >&5
-$as_echo "$ac_cv_sizeof_short" >&6; }
-
-
-
-cat >>confdefs.h <<_ACEOF
-#define SIZEOF_SHORT $ac_cv_sizeof_short
-_ACEOF
-
-
-# The cast to long int works around a bug in the HP C Compiler
-# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
-# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'.
-# This bug is HP SR number 8606223364.
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of int" >&5
-$as_echo_n "checking size of int... " >&6; }
-if ${ac_cv_sizeof_int+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- if ac_fn_cxx_compute_int "$LINENO" "(long int) (sizeof (int))" "ac_cv_sizeof_int" "$ac_includes_default"; then :
-
-else
- if test "$ac_cv_type_int" = yes; then
- { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
-as_fn_error 77 "cannot compute sizeof (int)
-See \`config.log' for more details" "$LINENO" 5; }
- else
- ac_cv_sizeof_int=0
- fi
-fi
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_int" >&5
-$as_echo "$ac_cv_sizeof_int" >&6; }
-
-
-
-cat >>confdefs.h <<_ACEOF
-#define SIZEOF_INT $ac_cv_sizeof_int
-_ACEOF
-
-
-# The cast to long int works around a bug in the HP C Compiler
-# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
-# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'.
-# This bug is HP SR number 8606223364.
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of long" >&5
-$as_echo_n "checking size of long... " >&6; }
-if ${ac_cv_sizeof_long+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- if ac_fn_cxx_compute_int "$LINENO" "(long int) (sizeof (long))" "ac_cv_sizeof_long" "$ac_includes_default"; then :
-
-else
- if test "$ac_cv_type_long" = yes; then
- { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
-as_fn_error 77 "cannot compute sizeof (long)
-See \`config.log' for more details" "$LINENO" 5; }
- else
- ac_cv_sizeof_long=0
- fi
-fi
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_long" >&5
-$as_echo "$ac_cv_sizeof_long" >&6; }
-
-
-
-cat >>confdefs.h <<_ACEOF
-#define SIZEOF_LONG $ac_cv_sizeof_long
-_ACEOF
-
-
-# The cast to long int works around a bug in the HP C Compiler
-# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
-# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'.
-# This bug is HP SR number 8606223364.
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of long long" >&5
-$as_echo_n "checking size of long long... " >&6; }
-if ${ac_cv_sizeof_long_long+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- if ac_fn_cxx_compute_int "$LINENO" "(long int) (sizeof (long long))" "ac_cv_sizeof_long_long" "$ac_includes_default"; then :
-
-else
- if test "$ac_cv_type_long_long" = yes; then
- { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
-as_fn_error 77 "cannot compute sizeof (long long)
-See \`config.log' for more details" "$LINENO" 5; }
- else
- ac_cv_sizeof_long_long=0
- fi
-fi
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_long_long" >&5
-$as_echo "$ac_cv_sizeof_long_long" >&6; }
-
-
-
-cat >>confdefs.h <<_ACEOF
-#define SIZEOF_LONG_LONG $ac_cv_sizeof_long_long
-_ACEOF
-
-
-# The cast to long int works around a bug in the HP C Compiler
-# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
-# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'.
-# This bug is HP SR number 8606223364.
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of __int64" >&5
-$as_echo_n "checking size of __int64... " >&6; }
-if ${ac_cv_sizeof___int64+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- if ac_fn_cxx_compute_int "$LINENO" "(long int) (sizeof (__int64))" "ac_cv_sizeof___int64" "$ac_includes_default"; then :
-
-else
- if test "$ac_cv_type___int64" = yes; then
- { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
-as_fn_error 77 "cannot compute sizeof (__int64)
-See \`config.log' for more details" "$LINENO" 5; }
- else
- ac_cv_sizeof___int64=0
- fi
-fi
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof___int64" >&5
-$as_echo "$ac_cv_sizeof___int64" >&6; }
-
-
-
-cat >>confdefs.h <<_ACEOF
-#define SIZEOF___INT64 $ac_cv_sizeof___int64
-_ACEOF
-
-
-
-# Checks for header files.
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5
-$as_echo_n "checking for ANSI C header files... " >&6; }
-if ${ac_cv_header_stdc+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-#include <stdlib.h>
-#include <stdarg.h>
-#include <string.h>
-#include <float.h>
-
-int
-main ()
-{
-
- ;
- return 0;
-}
-_ACEOF
-if ac_fn_cxx_try_compile "$LINENO"; then :
- ac_cv_header_stdc=yes
-else
- ac_cv_header_stdc=no
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-
-if test $ac_cv_header_stdc = yes; then
- # SunOS 4.x string.h does not declare mem*, contrary to ANSI.
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-#include <string.h>
-
-_ACEOF
-if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
- $EGREP "memchr" >/dev/null 2>&1; then :
-
-else
- ac_cv_header_stdc=no
-fi
-rm -f conftest*
-
-fi
-
-if test $ac_cv_header_stdc = yes; then
- # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI.
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-#include <stdlib.h>
-
-_ACEOF
-if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
- $EGREP "free" >/dev/null 2>&1; then :
-
-else
- ac_cv_header_stdc=no
-fi
-rm -f conftest*
-
-fi
-
-if test $ac_cv_header_stdc = yes; then
- # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi.
- if test "$cross_compiling" = yes; then :
- :
-else
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-#include <ctype.h>
-#include <stdlib.h>
-#if ((' ' & 0x0FF) == 0x020)
-# define ISLOWER(c) ('a' <= (c) && (c) <= 'z')
-# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c))
-#else
-# define ISLOWER(c) \
- (('a' <= (c) && (c) <= 'i') \
- || ('j' <= (c) && (c) <= 'r') \
- || ('s' <= (c) && (c) <= 'z'))
-# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c))
-#endif
-
-#define XOR(e, f) (((e) && !(f)) || (!(e) && (f)))
-int
-main ()
-{
- int i;
- for (i = 0; i < 256; i++)
- if (XOR (islower (i), ISLOWER (i))
- || toupper (i) != TOUPPER (i))
- return 2;
- return 0;
-}
-_ACEOF
-if ac_fn_cxx_try_run "$LINENO"; then :
-
-else
- ac_cv_header_stdc=no
-fi
-rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
- conftest.$ac_objext conftest.beam conftest.$ac_ext
-fi
-
-fi
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5
-$as_echo "$ac_cv_header_stdc" >&6; }
-if test $ac_cv_header_stdc = yes; then
-
-$as_echo "#define STDC_HEADERS 1" >>confdefs.h
-
-fi
-
-for ac_header in float.h limits.h stddef.h stdlib.h string.h sys/time.h stdint.h
-do :
- as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`
-ac_fn_cxx_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default"
-if eval test \"x\$"$as_ac_Header"\" = x"yes"; then :
- cat >>confdefs.h <<_ACEOF
-#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1
-_ACEOF
-
-fi
-
-done
-
-
-
-# check endianness of the architecture
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether byte ordering is bigendian" >&5
-$as_echo_n "checking whether byte ordering is bigendian... " >&6; }
-if ${ac_cv_c_bigendian+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- ac_cv_c_bigendian=unknown
- # See if we're dealing with a universal compiler.
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-#ifndef __APPLE_CC__
- not a universal capable compiler
- #endif
- typedef int dummy;
-
-_ACEOF
-if ac_fn_cxx_try_compile "$LINENO"; then :
-
- # Check for potential -arch flags. It is not universal unless
- # there are at least two -arch flags with different values.
- ac_arch=
- ac_prev=
- for ac_word in $CC $CFLAGS $CPPFLAGS $LDFLAGS; do
- if test -n "$ac_prev"; then
- case $ac_word in
- i?86 | x86_64 | ppc | ppc64)
- if test -z "$ac_arch" || test "$ac_arch" = "$ac_word"; then
- ac_arch=$ac_word
- else
- ac_cv_c_bigendian=universal
- break
- fi
- ;;
- esac
- ac_prev=
- elif test "x$ac_word" = "x-arch"; then
- ac_prev=arch
- fi
- done
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
- if test $ac_cv_c_bigendian = unknown; then
- # See if sys/param.h defines the BYTE_ORDER macro.
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-#include <sys/types.h>
- #include <sys/param.h>
-
-int
-main ()
-{
-#if ! (defined BYTE_ORDER && defined BIG_ENDIAN \
- && defined LITTLE_ENDIAN && BYTE_ORDER && BIG_ENDIAN \
- && LITTLE_ENDIAN)
- bogus endian macros
- #endif
-
- ;
- return 0;
-}
-_ACEOF
-if ac_fn_cxx_try_compile "$LINENO"; then :
- # It does; now see whether it defined to BIG_ENDIAN or not.
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-#include <sys/types.h>
- #include <sys/param.h>
-
-int
-main ()
-{
-#if BYTE_ORDER != BIG_ENDIAN
- not big endian
- #endif
-
- ;
- return 0;
-}
-_ACEOF
-if ac_fn_cxx_try_compile "$LINENO"; then :
- ac_cv_c_bigendian=yes
-else
- ac_cv_c_bigendian=no
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
- fi
- if test $ac_cv_c_bigendian = unknown; then
- # See if <limits.h> defines _LITTLE_ENDIAN or _BIG_ENDIAN (e.g., Solaris).
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-#include <limits.h>
-
-int
-main ()
-{
-#if ! (defined _LITTLE_ENDIAN || defined _BIG_ENDIAN)
- bogus endian macros
- #endif
-
- ;
- return 0;
-}
-_ACEOF
-if ac_fn_cxx_try_compile "$LINENO"; then :
- # It does; now see whether it defined to _BIG_ENDIAN or not.
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-#include <limits.h>
-
-int
-main ()
-{
-#ifndef _BIG_ENDIAN
- not big endian
- #endif
-
- ;
- return 0;
-}
-_ACEOF
-if ac_fn_cxx_try_compile "$LINENO"; then :
- ac_cv_c_bigendian=yes
-else
- ac_cv_c_bigendian=no
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
- fi
- if test $ac_cv_c_bigendian = unknown; then
- # Compile a test program.
- if test "$cross_compiling" = yes; then :
- # Try to guess by grepping values from an object file.
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-short int ascii_mm[] =
- { 0x4249, 0x4765, 0x6E44, 0x6961, 0x6E53, 0x7953, 0 };
- short int ascii_ii[] =
- { 0x694C, 0x5454, 0x656C, 0x6E45, 0x6944, 0x6E61, 0 };
- int use_ascii (int i) {
- return ascii_mm[i] + ascii_ii[i];
- }
- short int ebcdic_ii[] =
- { 0x89D3, 0xE3E3, 0x8593, 0x95C5, 0x89C4, 0x9581, 0 };
- short int ebcdic_mm[] =
- { 0xC2C9, 0xC785, 0x95C4, 0x8981, 0x95E2, 0xA8E2, 0 };
- int use_ebcdic (int i) {
- return ebcdic_mm[i] + ebcdic_ii[i];
- }
- extern int foo;
-
-int
-main ()
-{
-return use_ascii (foo) == use_ebcdic (foo);
- ;
- return 0;
-}
-_ACEOF
-if ac_fn_cxx_try_compile "$LINENO"; then :
- if grep BIGenDianSyS conftest.$ac_objext >/dev/null; then
- ac_cv_c_bigendian=yes
- fi
- if grep LiTTleEnDian conftest.$ac_objext >/dev/null ; then
- if test "$ac_cv_c_bigendian" = unknown; then
- ac_cv_c_bigendian=no
- else
- # finding both strings is unlikely to happen, but who knows?
- ac_cv_c_bigendian=unknown
- fi
- fi
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-else
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-$ac_includes_default
-int
-main ()
-{
-
- /* Are we little or big endian? From Harbison&Steele. */
- union
- {
- long int l;
- char c[sizeof (long int)];
- } u;
- u.l = 1;
- return u.c[sizeof (long int) - 1] == 1;
-
- ;
- return 0;
-}
-_ACEOF
-if ac_fn_cxx_try_run "$LINENO"; then :
- ac_cv_c_bigendian=no
-else
- ac_cv_c_bigendian=yes
-fi
-rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
- conftest.$ac_objext conftest.beam conftest.$ac_ext
-fi
-
- fi
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_bigendian" >&5
-$as_echo "$ac_cv_c_bigendian" >&6; }
- case $ac_cv_c_bigendian in #(
- yes)
-
-$as_echo "#define HAVE_BIG_ENDIAN 1" >>confdefs.h
-;; #(
- no)
-
-$as_echo "#define HAVE_LITTLE_ENDIAN 1" >>confdefs.h
- ;; #(
- universal)
-
-$as_echo "#define AC_APPLE_UNIVERSAL_BUILD 1" >>confdefs.h
-
- ;; #(
- *)
- as_fn_error $? "unknown endianness
- presetting ac_cv_c_bigendian=no (or yes) will help" "$LINENO" 5 ;;
- esac
-
-
-# Create some useful data types of fixed, known lengths
-
-# We hereby assume that a character is always one byte
-# LINBOX_INT8="char";
-
-# case $ac_cv_sizeof_char in
- # 1)
- # TWO_BYTES=2;
- # FOUR_BYTES=4;
- # EIGHT_BYTES=8;
- # ;;
- # 8)
- # TWO_BYTES=16;
- # FOUR_BYTES=32;
- # EIGHT_BYTES=64;
-# esac
-
-# case $TWO_BYTES in
- # $ac_cv_sizeof_short)
- # LINBOX_INT16="short";
- # ;;
- # $ac_cv_sizeof_int)
- # LINBOX_INT16="int";
- # ;;
-# esac
-
-# case $FOUR_BYTES in
- # $ac_cv_sizeof_short)
- # LINBOX_INT32="short";
- # ;;
- # $ac_cv_sizeof_int)
- # LINBOX_INT32="int";
- # ;;
- # $ac_cv_sizeof_long)
- # LINBOX_INT32="long";
- # ;;
-# esac
-
-# case $EIGHT_BYTES in
- # $ac_cv_sizeof_short)
- # LINBOX_INT64="short";
- # ;;
- # $ac_cv_sizeof_int)
- # LINBOX_INT64="int";
- # ;;
- # $ac_cv_sizeof_long)
- # LINBOX_INT64="long";
- # ;;
- # $ac_cv_sizeof_long_long)
- # LINBOX_INT64="long long";
- # ;;
- # $ac_cv_sizeof___int64)
- # LINBOX_INT64="__int64";
- # ;;
-# esac
-
-# AC_DEFINE_UNQUOTED(INT8, $LINBOX_INT8, Canonical 8-bit data type)
-# AC_DEFINE_UNQUOTED(INT16, $LINBOX_INT16, Canonical 16-bit data type)
-# AC_DEFINE_UNQUOTED(INT32, $LINBOX_INT32, Canonical 32-bit data type)
-# AC_DEFINE_UNQUOTED(INT64, $LINBOX_INT64, Canonical 64-bit data type)
-
-echo "-----------------------------------------------"
-# Feature checks
-
-
-
-# Check whether --with-default was given.
-if test "${with_default+set}" = set; then :
- withval=$with_default; if test "$withval" = yes ; then
- echo "Default path = /usr /usr/local "
- DEFAULT_CHECKING_PATH="/usr /usr/local "
- else
- echo "Default path = $withval /usr /usr/local "
- DEFAULT_CHECKING_PATH="$withval /usr /usr/local "
- fi
-
-else
-
- echo "Default path = /usr /usr/local "
- DEFAULT_CHECKING_PATH="/usr /usr/local "
-
-fi
-
-
-
-
-# Check whether --with-all was given.
-if test "${with_all+set}" = set; then :
- withval=$with_all; if test "$withval" = yes ; then
- check_all="yes"
- echo "Checking all external packages in ${DEFAULT_CHECKING_PATH}"
-
- elif test "$withval" != no ; then
- check_all="yes"
- DEFAULT_CHECKING_PATH="$withval ${DEFAULT_CHECKING_PATH}"
- echo "Checking all external packages in ${DEFAULT_CHECKING_PATH}"
- fi
-
-fi
-
-
-if test -n "$check_all"; then
-
- GMP_HOME_PATH="${DEFAULT_CHECKING_PATH}"
- GIVARO_HOME_PATH="${DEFAULT_CHECKING_PATH}"
- NTL_HOME_PATH="${DEFAULT_CHECKING_PATH}"
- IML_HOME_PATH="${DEFAULT_CHECKING_PATH}"
- FFLAS_FFPACK_HOME_PATH="${DEFAULT_CHECKING_PATH}"
- LIDIA_HOME_PATH="${DEFAULT_CHECKING_PATH}"
- SACLIB_HOME_PATH="${DEFAULT_CHECKING_PATH}"
- MAPLE_HOME_PATH="${DEFAULT_CHECKING_PATH} unknown"
- BLAS_HOME_PATH="${DEFAULT_CHECKING_PATH}"
-fi
-
-
-
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to compile the drivers" >&5
-$as_echo_n "checking whether to compile the drivers... " >&6; }
-
-# Check whether --enable-drivers was given.
-if test "${enable_drivers+set}" = set; then :
- enableval=$enable_drivers;
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
-compile_drivers="yes"
-
-else
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-compile_drivers="no"
-
-fi
-
- if test "x$compile_drivers" = "xyes"; then
- LINBOX_COMPILE_DRIVERS_TRUE=
- LINBOX_COMPILE_DRIVERS_FALSE='#'
-else
- LINBOX_COMPILE_DRIVERS_TRUE='#'
- LINBOX_COMPILE_DRIVERS_FALSE=
-fi
-
-
-
-ac_ext=cpp
-ac_cpp='$CXXCPP $CPPFLAGS'
-ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
-
-
-echo "-----------------------------------------------"
-
-
-
-# Check whether --with-gmp was given.
-if test "${with_gmp+set}" = set; then :
- withval=$with_gmp; if test "$withval" = yes ; then
- GMP_HOME_PATH="${DEFAULT_CHECKING_PATH}"
- elif test "$withval" != no ; then
- GMP_HOME_PATH="$withval ${DEFAULT_CHECKING_PATH}"
- fi
-else
- GMP_HOME_PATH="${DEFAULT_CHECKING_PATH}"
-fi
-
-
-min_gmp_version=3.1.1
-
-BACKUP_CXXFLAGS=${CXXFLAGS}
-BACKUP_LIBS=${LIBS}
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for GMP >= $min_gmp_version" >&5
-$as_echo_n "checking for GMP >= $min_gmp_version... " >&6; }
-
-for GMP_HOME in ${GMP_HOME_PATH}
- do
- if test -r "$GMP_HOME/include/gmp.h"; then
-
- if test "x$GMP_HOME" != "x/usr" -a "x$GMP_HOME" != "x/usr/local"; then
- GMP_CFLAGS="-I${GMP_HOME}/include"
- GMP_LIBS="-L${GMP_HOME}/lib -lgmpxx -lgmp"
- else
- GMP_CFLAGS=
- GMP_LIBS="-lgmpxx -lgmp"
- fi
-
- CXXFLAGS="${CXXFLAGS} ${GMP_CFLAGS}"
- LIBS="${LIBS} ${GMP_LIBS}"
-
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-
-#ifdef __PATHCC__
-#include <rw/_defs.h>
-#include <ansi/_cstddef.h>
-#endif
-#include "stddef.h"
- #include <gmp.h>
-
-int
-main ()
-{
-mpz_t a; mpz_init (a);
- ;
- return 0;
-}
-_ACEOF
-if ac_fn_cxx_try_link "$LINENO"; then :
-
- if test "$cross_compiling" = yes; then :
-
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: unknown" >&5
-$as_echo "unknown" >&6; }
- echo "WARNING: You appear to be cross compiling, so there is no way to determine"
- echo "whether your GMP version is new enough. I am assuming it is."
-
-
-
-$as_echo "#define HAVE_GMP 1" >>confdefs.h
-
- :
- break
-
-else
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-
-#ifdef __PATHCC__
-#include <rw/_defs.h>
- #include <ansi/_cstddef.h>
- #include "stddef.h"
-#endif
- #include <gmp.h>
- int main () { if (__GNU_MP_VERSION < 3) return -1; else return 0; }
-
-_ACEOF
-if ac_fn_cxx_try_run "$LINENO"; then :
-
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: found" >&5
-$as_echo "found" >&6; }
-
-
-
-$as_echo "#define HAVE_GMP 1" >>confdefs.h
-
- # See if we are running GMP 4.0
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether GMP is 4.0 or greater" >&5
-$as_echo_n "checking whether GMP is 4.0 or greater... " >&6; }
- if test "$cross_compiling" = yes; then :
-
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-
-else
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-
-#ifdef __PATHCC__
-#include <rw/_defs.h>
- #include <ansi/_cstddef.h>
- #include "stddef.h"
-#endif
-#include <gmp.h>
- int main () { if (__GNU_MP_VERSION < 4) return -1; else return 0; }
-
-_ACEOF
-if ac_fn_cxx_try_run "$LINENO"; then :
-
- gmp_found="yes"
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
- # See if GMP was compiled with --enable-cxx
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether GMP was compiled with --enable-cxx" >&5
-$as_echo_n "checking whether GMP was compiled with --enable-cxx... " >&6; }
- if test "$cross_compiling" = yes; then :
-
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-
-else
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-#include <gmpxx.h>
- int main () { mpz_class a(2),b(3),c(5); if ( a+b == c ) return 0; else return -1; }
-
-_ACEOF
-if ac_fn_cxx_try_run "$LINENO"; then :
-
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
- GMP_VERSION=""
-
-
-else
-
- gmp_found="no"
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-
-fi
-rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
- conftest.$ac_objext conftest.beam conftest.$ac_ext
-fi
-
-
-else
-
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-
-$as_echo "#define GMP_VERSION_3 1" >>confdefs.h
-
- GMP_VERSION="-DGMP_VERSION_3"
-
-
-fi
-rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
- conftest.$ac_objext conftest.beam conftest.$ac_ext
-fi
-
- :
- break
-
-else
-
- gmp_problem="$gmp_problem $GMP_HOME"
- unset GMP_CFLAGS
- unset GMP_LIBS
-
-fi
-rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
- conftest.$ac_objext conftest.beam conftest.$ac_ext
-fi
-
-
-else
-
- gmp_found="no"
- unset GMP_CFLAGS
- unset GMP_LIBS
-
-fi
-rm -f core conftest.err conftest.$ac_objext \
- conftest$ac_exeext conftest.$ac_ext
-
- else
- gmp_found="no"
- fi
-done
-
-if test "x$gmp_found" != "xyes"; then
- if test -n "$gmp_problem"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: problem" >&5
-$as_echo "problem" >&6; }
- echo "Sorry, your GMP version is too old. Disabling."
- elif test "x$gmp_found" != "xno"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found" >&5
-$as_echo "not found" >&6; }
- fi
- echo '*******************************************************************************'
-echo ' ERROR: GMP not found!'
-echo
-echo ' GMP library compiled with --enable-cxx is required for this library to compile.'
-echo ' Please make sure GMP is installed and specify its location with the option'
-echo ' --with-gmp=<prefix> when running configure.'
-echo '*******************************************************************************'
-exit 1
-
-fi
-
-
-CXXFLAGS=${BACKUP_CXXFLAGS}
-LIBS=${BACKUP_LIBS}
-#unset LD_LIBRARY_PATH
-
-
-
-
-
-
-# Check whether --with-iml was given.
-if test "${with_iml+set}" = set; then :
- withval=$with_iml; if test "$withval" = yes ; then
- IML_HOME_PATH="${DEFAULT_CHECKING_PATH}"
- elif test "$withval" != no ; then
- IML_HOME_PATH="$withval ${DEFAULT_CHECKING_PATH}"
- fi
-else
- IML_HOME_PATH="${DEFAULT_CHECKING_PATH}"
-fi
-
-
-
-
-BACKUP_CXXFLAGS=${CXXFLAGS}
-BACKUP_LIBS=${LIBS}
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for IML" >&5
-$as_echo_n "checking for IML... " >&6; }
-
-for IML_HOME in ${IML_HOME_PATH}
- do
- if test -r "$IML_HOME/include/iml.h"; then
-
- if test "x$IML_HOME" != "x/usr" -a "x$IML_HOME" != "x/usr/local"; then
- IML_CFLAGS="-I${IML_HOME}/include"
- IML_LIBS="-L${IML_HOME}/lib -liml"
- else
- IML_CFLAGS=
- IML_LIBS="-liml"
- fi
-
- CXXFLAGS="${BACKUP_CXXFLAGS} ${IML_CFLAGS} ${GMP_CFLAGS}"
- LIBS="${BACKUP_LIBS} ${IML_LIBS} ${GMP_LIBS}"
-
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-#include <gmp.h>
- extern "C" {
- #include <iml.h>
- }
-int
-main ()
-{
-Double a;
- ;
- return 0;
-}
-_ACEOF
-if ac_fn_cxx_try_link "$LINENO"; then :
-
- if test "$cross_compiling" = yes; then :
-
- iml_found="yes"
- iml_cross="yes"
- break
-
-else
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-
- int main () { return 0; /* not possible to check version */ }
-
-_ACEOF
-if ac_fn_cxx_try_run "$LINENO"; then :
-
- iml_found="yes"
- break
-
-else
-
- iml_problem="$problem $IML_HOME"
- unset IML_CFLAGS
- unset IML_LIBS
-
-fi
-rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
- conftest.$ac_objext conftest.beam conftest.$ac_ext
-fi
-
-
-else
-
- iml_found="no"
- iml_checked="$checked $IML_HOME"
- unset IML_CFLAGS
- unset IML_LIBS
-
-fi
-rm -f core conftest.err conftest.$ac_objext \
- conftest$ac_exeext conftest.$ac_ext
- else
- iml_found="no"
- fi
-done
-
-if test "x$iml_found" = "xyes" ; then
-
-
-
-$as_echo "#define HAVE_IML 1" >>confdefs.h
-
- HAVE_IML=yes
- if test "x$iml_cross" != "xyes"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: found" >&5
-$as_echo "found" >&6; }
- else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: unknown" >&5
-$as_echo "unknown" >&6; }
- echo "WARNING: You appear to be cross compiling, so there is no way to determine"
- echo "whether your IML version is new enough. I am assuming it is."
- fi
- :
-elif test -n "$iml_problem"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: problem" >&5
-$as_echo "problem" >&6; }
- echo "Sorry, your IML version is too old. Disabling."
- :
-elif test "x$iml_found" = "xno" ; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found" >&5
-$as_echo "not found" >&6; }
- :
-fi
-
- if test "x$HAVE_IML" = "xyes"; then
- LINBOX_HAVE_IML_TRUE=
- LINBOX_HAVE_IML_FALSE='#'
-else
- LINBOX_HAVE_IML_TRUE='#'
- LINBOX_HAVE_IML_FALSE=
-fi
-
-
-CXXFLAGS=${BACKUP_CXXFLAGS}
-LIBS=${BACKUP_LIBS}
-#unset LD_LIBRARY_PATH
-
-
-
-
-
-# Check whether --with-m4ri was given.
-if test "${with_m4ri+set}" = set; then :
- withval=$with_m4ri;
-fi
-
-
-if test "$withval" = yes ; then :
- M4RI_HOME_PATH="${DEFAULT_CHECKING_PATH}"
-elif test "$withval" != no ; then :
- M4RI_HOME_PATH="$withval ${DEFAULT_CHECKING_PATH}"
-else
- M4RI_HOME_PATH="${DEFAULT_CHECKING_PATH}"
-fi
-
-
-
-BACKUP_CXXFLAGS=${CXXFLAGS}
-BACKUP_LIBS=${LIBS}
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for M4RI" >&5
-$as_echo_n "checking for M4RI... " >&6; }
-
-for M4RI_HOME in ${M4RI_HOME_PATH}
- do
- if test -r "$M4RI_HOME/include/m4ri/m4ri.h"; then :
-
-
- if test "x$M4RI_HOME" != "x/usr" -a "x$M4RI_HOME" != "x/usr/local"; then :
-
- M4RI_CFLAGS="-I${M4RI_HOME}/include"
- M4RI_LIBS="-L${M4RI_HOME}/lib -lm4ri"
-else
-
- M4RI_CFLAGS=
- M4RI_LIBS="-lm4ri"
-fi
-
- CXXFLAGS="${BACKUP_CXXFLAGS} ${M4RI_CFLAGS} ${GMP_CFLAGS}"
- LIBS="${BACKUP_LIBS} ${M4RI_LIBS} ${GMP_LIBS}"
-
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-#include <m4ri/m4ri.h>
-int
-main ()
-{
-mzd_t a;
- ;
- return 0;
-}
-_ACEOF
-if ac_fn_cxx_try_link "$LINENO"; then :
-
- if test "$cross_compiling" = yes; then :
-
- m4ri_found="yes"
- m4ri_cross="yes"
- break
-
-else
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-
- int main () { return 0; /* not possible to check version */ }
-
-_ACEOF
-if ac_fn_cxx_try_run "$LINENO"; then :
-
- m4ri_found="yes"
- break
-
-else
-
- m4ri_problem="$problem $M4RI_HOME"
- unset M4RI_CFLAGS
- unset M4RI_LIBS
-
-fi
-rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
- conftest.$ac_objext conftest.beam conftest.$ac_ext
-fi
-
-
-else
-
- m4ri_found="no"
- m4ri_checked="$checked $M4RI_HOME"
- unset M4RI_CFLAGS
- unset M4RI_LIBS
-
-fi
-rm -f core conftest.err conftest.$ac_objext \
- conftest$ac_exeext conftest.$ac_ext
-
-else
-
- m4ri_found="no"
-
-fi
-done
-
-if test "x$m4ri_found" = "xyes"; then :
-
-
-
-
-$as_echo "#define HAVE_M4RI 1" >>confdefs.h
-
- HAVE_M4RI=yes
- if test "x$m4ri_cross" != "xyes"; then :
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: found" >&5
-$as_echo "found" >&6; }
-else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: unknown" >&5
-$as_echo "unknown" >&6; }
- echo "WARNING: You appear to be cross compiling, so there is no way to determine"
- echo "whether your M4RI version is new enough. I am assuming it is."
-
-fi
- :
-elif test -n "$m4ri_problem" ; then :
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: problem" >&5
-$as_echo "problem" >&6; }
- echo "Sorry, your M4RI version is too old. Disabling."
- :
-elif test "x$m4ri_found" = "xno" ; then :
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found" >&5
-$as_echo "not found" >&6; }
- :
-fi
-
- if test "x$HAVE_M4RI" = "xyes"; then
- LINBOX_HAVE_M4RI_TRUE=
- LINBOX_HAVE_M4RI_FALSE='#'
-else
- LINBOX_HAVE_M4RI_TRUE='#'
- LINBOX_HAVE_M4RI_FALSE=
-fi
-
-
-CXXFLAGS=${BACKUP_CXXFLAGS}
-LIBS=${BACKUP_LIBS}
-#unset LD_LIBRARY_PATH
-
-
-
-
-
-# Check whether --with-m4rie was given.
-if test "${with_m4rie+set}" = set; then :
- withval=$with_m4rie;
-fi
-
-
-if test "$withval" = yes ; then :
- M4RIE_HOME_PATH="${DEFAULT_CHECKING_PATH}"
-elif test "$withval" != no ; then :
- M4RIE_HOME_PATH="$withval ${DEFAULT_CHECKING_PATH}"
-else
- M4RIE_HOME_PATH="${DEFAULT_CHECKING_PATH}"
-fi
-
-
-
-BACKUP_CXXFLAGS=${CXXFLAGS}
-BACKUP_LIBS=${LIBS}
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for M4RIE" >&5
-$as_echo_n "checking for M4RIE... " >&6; }
-
-for M4RIE_HOME in ${M4RIE_HOME_PATH}
- do
- if test -r "$M4RIE_HOME/include/m4rie/m4rie.h"; then :
-
-
- if test "x$M4RIE_HOME" != "x/usr" -a "x$M4RIE_HOME" != "x/usr/local"; then :
-
- M4RIE_CFLAGS="-I${M4RIE_HOME}/include"
- M4RIE_LIBS="-L${M4RIE_HOME}/lib -lm4rie"
-else
-
- M4RIE_CFLAGS=
- M4RIE_LIBS="-lm4rie"
-fi
-
- CXXFLAGS="${BACKUP_CXXFLAGS} ${M4RIE_CFLAGS} ${GMP_CFLAGS}"
- LIBS="${BACKUP_LIBS} ${M4RIE_LIBS} ${GMP_LIBS}"
-
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-#include <m4rie/m4rie.h>
-int
-main ()
-{
-gf2e a;
- ;
- return 0;
-}
-_ACEOF
-if ac_fn_cxx_try_link "$LINENO"; then :
-
- if test "$cross_compiling" = yes; then :
-
- m4rie_found="yes"
- m4rie_cross="yes"
- break
-
-else
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-
- int main () { return 0; /* not possible to check version */ }
-
-_ACEOF
-if ac_fn_cxx_try_run "$LINENO"; then :
-
- m4rie_found="yes"
- break
-
-else
-
- m4rie_problem="$problem $M4RIE_HOME"
- unset M4RIE_CFLAGS
- unset M4RIE_LIBS
-
-fi
-rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
- conftest.$ac_objext conftest.beam conftest.$ac_ext
-fi
-
-
-else
-
- m4rie_found="no"
- m4rie_checked="$checked $M4RIE_HOME"
- unset M4RIE_CFLAGS
- unset M4RIE_LIBS
-
-fi
-rm -f core conftest.err conftest.$ac_objext \
- conftest$ac_exeext conftest.$ac_ext
-
-else
-
- m4rie_found="no"
-
-fi
-done
-
-if test "x$m4rie_found" = "xyes"; then :
-
-
-
-
-$as_echo "#define HAVE_M4RIE 1" >>confdefs.h
-
- HAVE_M4RIE=yes
- if test "x$m4rie_cross" != "xyes"; then :
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: found" >&5
-$as_echo "found" >&6; }
-else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: unknown" >&5
-$as_echo "unknown" >&6; }
- echo "WARNING: You appear to be cross compiling, so there is no way to determine"
- echo "whether your M4RIE version is new enough. I am assuming it is."
-
-fi
- :
-elif test -n "$m4rie_problem" ; then :
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: problem" >&5
-$as_echo "problem" >&6; }
- echo "Sorry, your M4RIE version is too old. Disabling."
- :
-elif test "x$m4rie_found" = "xno" ; then :
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found" >&5
-$as_echo "not found" >&6; }
- :
-fi
-
- if test "x$HAVE_M4RIE" = "xyes"; then
- LINBOX_HAVE_M4RIE_TRUE=
- LINBOX_HAVE_M4RIE_FALSE='#'
-else
- LINBOX_HAVE_M4RIE_TRUE='#'
- LINBOX_HAVE_M4RIE_FALSE=
-fi
-
-
-CXXFLAGS=${BACKUP_CXXFLAGS}
-LIBS=${BACKUP_LIBS}
-#unset LD_LIBRARY_PATH
-
-
-
-
-
-# Check whether --with-mpfr was given.
-if test "${with_mpfr+set}" = set; then :
- withval=$with_mpfr; if test "$withval" = yes ; then
- MPFR_HOME_PATH="${DEFAULT_CHECKING_PATH}"
- elif test "$withval" != no ; then
- MPFR_HOME_PATH="$withval ${DEFAULT_CHECKING_PATH}"
- fi
-else
- MPFR_HOME_PATH="${DEFAULT_CHECKING_PATH}"
-fi
-
-
-
-
-BACKUP_CXXFLAGS=${CXXFLAGS}
-BACKUP_LIBS=${LIBS}
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for MPFR" >&5
-$as_echo_n "checking for MPFR... " >&6; }
-
-for MPFR_HOME in ${MPFR_HOME_PATH}
- do
- if test -r "$MPFR_HOME/include/mpfr.h"; then
-
- if test "x$MPFR_HOME" != "x/usr" -a "x$MPFR_HOME" != "x/usr/local"; then :
-
- MPFR_CFLAGS="-I${MPFR_HOME}/include"
- MPFR_LIBS="-L${MPFR_HOME}/lib -lmpfr"
-
-else
-
- MPFR_CFLAGS=
- MPFR_LIBS="-lmpfr"
-
-fi
-
- CXXFLAGS="${BACKUP_CXXFLAGS} ${MPFR_CFLAGS} ${GMP_CFLAGS}"
- LIBS="${BACKUP_LIBS} ${GMP_LIBS} ${MPFR_LIBS} "
-
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-
- #include <mpfr.h>
-
-int
-main ()
-{
-mpfr_t a ;
- ;
- return 0;
-}
-_ACEOF
-if ac_fn_cxx_try_link "$LINENO"; then :
-
- if test "$cross_compiling" = yes; then :
-
- mpfr_found="yes"
- mpfr_cross="yes"
- break
-
-else
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-
- int main () { return 0; /* not important to check for version */ }
-
-_ACEOF
-if ac_fn_cxx_try_run "$LINENO"; then :
-
- mpfr_found="yes"
- break
-
-else
-
- mpfr_problem="$problem $MPFR_HOME"
- unset MPFR_CFLAGS
- unset MPFR_LIBS
-
-fi
-rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
- conftest.$ac_objext conftest.beam conftest.$ac_ext
-fi
-
-
-else
-
- mpfr_found="no"
- mpfr_checked="$checked $MPFR_HOME"
- unset MPFR_CFLAGS
- unset MPFR_LIBS
-
-fi
-rm -f core conftest.err conftest.$ac_objext \
- conftest$ac_exeext conftest.$ac_ext
- else
- mpfr_found="no"
- fi
-done
-
-if test "x$mpfr_found" = "xyes" ; then
-
-
-
-$as_echo "#define HAVE_MPFR 1" >>confdefs.h
-
- HAVE_MPFR=yes
- if test "x$mpfr_cross" != "xyes" ; then :
-
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: found" >&5
-$as_echo "found" >&6; }
-
-else
-
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: unknown" >&5
-$as_echo "unknown" >&6; }
- echo "WARNING: You appear to be cross compiling, so there is no way to determine"
- echo "whether your MPFR version is new enough. I am assuming it is."
-
-fi
- :
-elif test -n "$mpfr_problem"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: problem" >&5
-$as_echo "problem" >&6; }
- echo "Sorry, your MPFR version is too old. Disabling."
- :
-elif test "x$mpfr_found" = "xno" ; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found" >&5
-$as_echo "not found" >&6; }
- :
-fi
-
- if test "x$HAVE_MPFR" = "xyes"; then
- LINBOX_HAVE_MPFR_TRUE=
- LINBOX_HAVE_MPFR_FALSE='#'
-else
- LINBOX_HAVE_MPFR_TRUE='#'
- LINBOX_HAVE_MPFR_FALSE=
-fi
-
-
-CXXFLAGS=${BACKUP_CXXFLAGS}
-LIBS=${BACKUP_LIBS}
-#unset LD_LIBRARY_PATH
-
-
-# we nedd mpfr next :
-
-
-
-# Check whether --with-fplll was given.
-if test "${with_fplll+set}" = set; then :
- withval=$with_fplll; if test "$withval" = yes ; then
- FPLLL_HOME_PATH="${DEFAULT_CHECKING_PATH}"
- elif test "$withval" != no ; then
- FPLLL_HOME_PATH="$withval ${DEFAULT_CHECKING_PATH}"
- fi
-else
- FPLLL_HOME_PATH="${DEFAULT_CHECKING_PATH}"
-fi
-
-
-
-
-BACKUP_CXXFLAGS=${CXXFLAGS}
-BACKUP_LIBS=${LIBS}
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for FPLLL" >&5
-$as_echo_n "checking for FPLLL... " >&6; }
-
-for FPLLL_HOME in ${FPLLL_HOME_PATH}
- do
- if test -r "$FPLLL_HOME/include/fplll/fplll.h"; then
-
- if test "x$FPLLL_HOME" != "x/usr" -a "x$FPLLL_HOME" != "x/usr/local"; then :
-
- FPLLL_CFLAGS="-I${FPLLL_HOME}/include"
- FPLLL_LIBS="-L${FPLLL_HOME}/lib -lfplll"
-
-else
-
- FPLLL_CFLAGS=
- FPLLL_LIBS="-lfplll"
-
-fi
-
- CXXFLAGS="${BACKUP_CXXFLAGS} ${MPFR_CFLAGS} ${FPLLL_CFLAGS} ${GMP_CFLAGS}"
- LIBS="${BACKUP_LIBS} ${GMP_LIBS} ${MPFR_LIBS} ${FPLLL_LIBS} "
-
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-
- #include <fplll/fplll.h>
- #include <fplll/solver.h>
-
-int
-main ()
-{
-enum EvaluatorType a ;
- ;
- return 0;
-}
-_ACEOF
-if ac_fn_cxx_try_link "$LINENO"; then :
-
- if test "$cross_compiling" = yes; then :
-
- fplll_found="yes"
- fplll_cross="yes"
- break
-
-else
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-
- int main () { return 0; /* not important to check for version */ }
-
-_ACEOF
-if ac_fn_cxx_try_run "$LINENO"; then :
-
- fplll_found="yes"
- break
-
-else
-
- fplll_problem="$problem $FPLLL_HOME"
- unset FPLLL_CFLAGS
- unset FPLLL_LIBS
-
-fi
-rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
- conftest.$ac_objext conftest.beam conftest.$ac_ext
-fi
-
-
-else
-
- fplll_found="no"
- fplll_checked="$checked $FPLLL_HOME"
- unset FPLLL_CFLAGS
- unset FPLLL_LIBS
-
-fi
-rm -f core conftest.err conftest.$ac_objext \
- conftest$ac_exeext conftest.$ac_ext
- else
- fplll_found="no"
- fi
-done
-
-if test "x$fplll_found" = "xyes" ; then
-
-
-
-$as_echo "#define HAVE_FPLLL 1" >>confdefs.h
-
- HAVE_FPLLL=yes
- if test "x$fplll_cross" != "xyes" ; then :
-
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: found" >&5
-$as_echo "found" >&6; }
-
-else
-
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: unknown" >&5
-$as_echo "unknown" >&6; }
- echo "WARNING: You appear to be cross compiling, so there is no way to determine"
- echo "whether your FPLLL version is new enough. I am assuming it is."
-
-fi
- :
-elif test -n "$fplll_problem"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: problem" >&5
-$as_echo "problem" >&6; }
- echo "Sorry, your FPLLL version is too old. Disabling."
- :
-elif test "x$fplll_found" = "xno" ; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found" >&5
-$as_echo "not found" >&6; }
- :
-fi
-
- if test "x$HAVE_FPLLL" = "xyes"; then
- LINBOX_HAVE_FPLLL_TRUE=
- LINBOX_HAVE_FPLLL_FALSE='#'
-else
- LINBOX_HAVE_FPLLL_TRUE='#'
- LINBOX_HAVE_FPLLL_FALSE=
-fi
-
-
-CXXFLAGS=${BACKUP_CXXFLAGS}
-LIBS=${BACKUP_LIBS}
-#unset LD_LIBRARY_PATH
-
-
-
-
-
-
-# Check whether --with-ntl was given.
-if test "${with_ntl+set}" = set; then :
- withval=$with_ntl; if test "$withval" = yes ; then
- NTL_HOME_PATH="${DEFAULT_CHECKING_PATH}"
- elif test "$withval" != no ; then
- NTL_HOME_PATH="$withval ${DEFAULT_CHECKING_PATH}"
- fi
-else
- NTL_HOME_PATH=${DEFAULT_CHECKING_PATH}
-fi
-
-
-min_ntl_version=5.0
-
-
-BACKUP_CXXFLAGS=${CXXFLAGS}
-BACKUP_LIBS=${LIBS}
-
-if test -n "$NTL_HOME_PATH"; then
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for NTL >= $min_ntl_version" >&5
-$as_echo_n "checking for NTL >= $min_ntl_version... " >&6; }
-fi
-
-for NTL_HOME in ${NTL_HOME_PATH}
- do
-if test -r "$NTL_HOME/include/NTL/ZZ.h"; then
-
- if test "x$NTL_HOME" != "x/usr" -a "x$NTL_HOME" != "x/usr/local"; then
- NTL_CFLAGS="-I${NTL_HOME}/include"
- NTL_LIBS="-L${NTL_HOME}/lib -lntl"
- else
- NTL_CFLAGS=
- NTL_LIBS="-lntl"
- fi
- CXXFLAGS="${BACKUP_CXXFLAGS} ${NTL_CFLAGS} ${GMP_CFLAGS}"
- LIBS="${BACKUP_LIBS} ${NTL_LIBS} ${GMP_LIBS}"
-
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-#include <NTL/ZZ.h>
-int
-main ()
-{
-NTL::ZZ a;
- ;
- return 0;
-}
-_ACEOF
-if ac_fn_cxx_try_link "$LINENO"; then :
-
- if test "$cross_compiling" = yes; then :
-
- ntl_found="yes"
- ntl_cross="yes"
- break
-
-else
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-#include <NTL/version.h>
- int main () { if (NTL_MAJOR_VERSION < 5) return -1; else return 0; }
-
-_ACEOF
-if ac_fn_cxx_try_run "$LINENO"; then :
-
- ntl_found="yes"
- break
-
-else
-
- ntl_problem="$problem $NTL_HOME"
- unset NTL_CFLAGS
- unset NTL_LIBS
-
-fi
-rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
- conftest.$ac_objext conftest.beam conftest.$ac_ext
-fi
-
-
-else
-
- ntl_found="no"
- ntl_checked="$checked $NTL_HOME"
- unset NTL_CFLAGS
- unset NTL_LIBS
-
-fi
-rm -f core conftest.err conftest.$ac_objext \
- conftest$ac_exeext conftest.$ac_ext
-else
- ntl_found="no"
-fi
-done
-
-if test "x$ntl_found" = "xyes" ; then
-
-
-
-$as_echo "#define HAVE_NTL 1" >>confdefs.h
-
- HAVE_NTL=yes
- if test "x$ntl_cross" != "xyes"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: found" >&5
-$as_echo "found" >&6; }
- else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: unknown" >&5
-$as_echo "unknown" >&6; }
- echo "WARNING: You appear to be cross compiling, so there is no way to determine"
- echo "whether your NTL version is new enough. I am assuming it is."
- fi
- :
-elif test -n "$ntl_problem"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: problem" >&5
-$as_echo "problem" >&6; }
- echo "Sorry, your NTL version is too old. Disabling."
- :
-elif test "x$ntl_found" = "xno"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found" >&5
-$as_echo "not found" >&6; }
- if test "x$NTL_HOME" != "x/usr" -a "x$NTL_HOME" != "x/usr/local" ; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: NTL >= $min_ntl_version was not found. LinBox also requires the NTL namespace to be enabled. Please make sure NTL is compiled correctly." >&5
-$as_echo "$as_me: WARNING: NTL >= $min_ntl_version was not found. LinBox also requires the NTL namespace to be enabled. Please make sure NTL is compiled correctly." >&2;}
- fi
- :
-fi
-
-
-
- if test "x$HAVE_NTL" = "xyes"; then
- LINBOX_HAVE_NTL_TRUE=
- LINBOX_HAVE_NTL_FALSE='#'
-else
- LINBOX_HAVE_NTL_TRUE='#'
- LINBOX_HAVE_NTL_FALSE=
-fi
-
-
-CXXFLAGS=${BACKUP_CXXFLAGS}
-LIBS=${BACKUP_LIBS}
-#unset LD_LIBRARY_PATH
-
-
-
-
-
-# Check whether --with-givaro was given.
-if test "${with_givaro+set}" = set; then :
- withval=$with_givaro; if test "$withval" = yes ; then
- GIVARO_HOME_PATH="${DEFAULT_CHECKING_PATH}"
- elif test "$withval" != no ; then
- GIVARO_HOME_PATH="$withval ${DEFAULT_CHECKING_PATH}"
- fi
-else
- GIVARO_HOME_PATH="${DEFAULT_CHECKING_PATH}"
-fi
-
-
-
-version_min=30700
-version_max=30800
-
-
-BACKUP_CXXFLAGS=${CXXFLAGS}
-BACKUP_LIBS=${LIBS}
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for GIVARO >= $version_min and < $version_max" >&5
-$as_echo_n "checking for GIVARO >= $version_min and < $version_max... " >&6; }
-
-for GIVARO_HOME in ${GIVARO_HOME_PATH}
- do
-if test -r "$GIVARO_HOME/include/givaro/givconfig.h"; then
-
- if test "x$GIVARO_HOME" != "x/usr" -a "x$GIVARO_HOME" != "x/usr/local"; then
- GIVARO_CFLAGS="-I${GIVARO_HOME}/include"
- GIVARO_LIBS="-L${GIVARO_HOME}/lib -lgivaro"
- else
- GIVARO_CFLAGS=
- GIVARO_LIBS="-lgivaro"
- fi
- CXXFLAGS="${BACKUP_CXXFLAGS} ${GIVARO_CFLAGS} ${GMP_CFLAGS}"
- LIBS="${BACKUP_LIBS} ${GIVARO_LIBS} ${GMP_LIBS}"
-
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-#include <givaro/givinteger.h>
-int
-main ()
-{
-Givaro::Integer a;
- ;
- return 0;
-}
-_ACEOF
-if ac_fn_cxx_try_link "$LINENO"; then :
-
- if test "$cross_compiling" = yes; then :
-
- givaro_found="yes"
- givaro_cross="yes"
-
- break
-
-else
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-#include <givaro/givconfig.h>
- int main () { if (GIVARO_VERSION < $version_min || GIVARO_VERSION >= $version_max || GIVARO_VERSION>0x030000) return -1; else return 0; /* old version of Givaro are defined as hexa 0x03yyzz*/ }
-
-_ACEOF
-if ac_fn_cxx_try_run "$LINENO"; then :
-
- givaro_found="yes"
- break
-
-else
-
- givaro_problem="$problem $GIVARO_HOME"
- unset GIVARO_CFLAGS
- unset GIVARO_LIBS
-
-fi
-rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
- conftest.$ac_objext conftest.beam conftest.$ac_ext
-fi
-
-
-else
-
- givaro_found="no"
- givaro_checked="$checked $GIVARO_HOME"
- unset GIVARO_CFLAGS
- unset GIVARO_LIBS
-
-
-fi
-rm -f core conftest.err conftest.$ac_objext \
- conftest$ac_exeext conftest.$ac_ext
-else
- givaro_found="no"
-fi
-done
-
-if test "x$givaro_found" = "xyes" ; then
-
-
-
-$as_echo "#define HAVE_GIVARO 1" >>confdefs.h
-
- HAVE_GIVARO=yes
- if test "x$givaro_cross" != "xyes"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: found" >&5
-$as_echo "found" >&6; }
- else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: unknown" >&5
-$as_echo "unknown" >&6; }
- echo "WARNING: You appear to be cross compiling, so there is no way to determine"
- echo "whether your GIVARO version is new enough. I am assuming it is."
- fi
- :
-elif test -n "$givaro_problem"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: problem" >&5
-$as_echo "problem" >&6; }
- echo "Sorry, your GIVARO version is too old. Disabling."
-
-echo '*******************************************************************************'
-echo ' ERROR: GIVARO not found!'
-echo
-echo ' GIVARO library is required for this library to compile.'
-echo ' Please make sure GIVARO is installed and specify its location with the'
-echo ' option --with-givaro=<prefix> when running configure.'
-echo '*******************************************************************************'
-exit 1
-
-elif test "x$givaro_found" = "xno" ; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found" >&5
-$as_echo "not found" >&6; }
-
-echo '*******************************************************************************'
-echo ' ERROR: GIVARO not found!'
-echo
-echo ' GIVARO library is required for this library to compile.'
-echo ' Please make sure GIVARO is installed and specify its location with the'
-echo ' option --with-givaro=<prefix> when running configure.'
-echo '*******************************************************************************'
-exit 1
-
-fi
-
- if test "x$HAVE_GIVARO" = "xyes"; then
- LINBOX_HAVE_GIVARO_TRUE=
- LINBOX_HAVE_GIVARO_FALSE='#'
-else
- LINBOX_HAVE_GIVARO_TRUE='#'
- LINBOX_HAVE_GIVARO_FALSE=
-fi
-
-
-CXXFLAGS=${BACKUP_CXXFLAGS}
-LIBS=${BACKUP_LIBS}
-#unset LD_LIBRARY_PATH
-
-
-
-
-
-
-
-# Check whether --with-saclib was given.
-if test "${with_saclib+set}" = set; then :
- withval=$with_saclib; if test "$withval" = yes ; then
- SACLIB_HOME_PATH="${DEFAULT_CHECKING_PATH}"
- elif test "$withval" != no ; then
- SACLIB_HOME_PATH="$withval"
- fi
-fi
-
-
-min_saclib_version=2.0
-
-
-
-BACKUP_CXXFLAGS=${CXXFLAGS}
-BACKUP_LIBS=${LIBS}
-
-if test -n "$SACLIB_HOME_PATH"; then
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for SACLIB >= $min_saclib_version" >&5
-$as_echo_n "checking for SACLIB >= $min_saclib_version... " >&6; }
-fi
-
-for SACLIB_HOME in ${SACLIB_HOME_PATH}
- do
-if test -r "$SACLIB_HOME/include/saclib.h"; then
-
- if test "x$SACLIB_HOME" != "x/usr" -a "x$SACLIB_HOME" != "x/usr/local"; then
- SACLIB_CFLAGS="-I${SACLIB_HOME}/include"
- SACLIB_LIBS="-L${SACLIB_HOME}/lib -lsaclib"
- else
- SACLIB_CFLAGS=
- SACLIB_LIBS="-lsaclib"
- fi
-
- CXXFLAGS="${BACKUP_CXXFLAGS} ${SACLIB_CFLAGS} ${GMP_CFLAGS}" LIBS="${BACKUP_LIBS} ${SACLIB_LIBS} ${GMP_LIBS}"
-
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-#include <saclib.h>
-int
-main ()
-{
-BDigit a;
- ;
- return 0;
-}
-_ACEOF
-if ac_fn_cxx_try_link "$LINENO"; then :
-
- if test "$cross_compiling" = yes; then :
-
- saclib_found="yes"
- saclib_cross="yes"
- break
-
-else
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-#include <saclib.h>
- int main () { if ( __GNU_MP_VERSION < 3) return -1; else return 0; }
-
-_ACEOF
-if ac_fn_cxx_try_run "$LINENO"; then :
-
- saclib_found="yes"
- break
-
-else
-
- saclib_problem="$problem $SACLIB_HOME"
- unset SACLIB_CFLAGS
- unset SACLIB_LIBS
-
-
-
-fi
-rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
- conftest.$ac_objext conftest.beam conftest.$ac_ext
-fi
-
-
-else
-
- saclib_found="no"
- saclib_checked="$saclib_checked $SACLIB_HOME"
- unset SACLIB_CFLAGS
- unset SACLIB_LIBS
-
-fi
-rm -f core conftest.err conftest.$ac_objext \
- conftest$ac_exeext conftest.$ac_ext
-else
- saclib_found="no"
-
-fi
-done
-
-
-if test "x$saclib_found" = "xyes" ; then
-
-
-
-$as_echo "#define HAVE_SACLIB 1" >>confdefs.h
-
- HAVE_SACLIB=yes
-
- if test "x$saclib_cross" != "xyes"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: found" >&5
-$as_echo "found" >&6; }
- else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: unknown" >&5
-$as_echo "unknown" >&6; }
- echo "WARNING: You appear to be cross compiling, so there is no way to determine"
- echo "whether your SACLIB version is new enough. I am assuming it is."
- fi
- :
-elif test -n "$saclib_problem"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: problem" >&5
-$as_echo "problem" >&6; }
- echo "Sorry, your SACLIB version is too old. Disabling."
- :
-elif test "x$saclib_found" = "xno" ; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found" >&5
-$as_echo "not found" >&6; }
- :
-fi
-
-
-
- if test "x$HAVE_SACLIB" = "xyes"; then
- LINBOX_HAVE_SACLIB_TRUE=
- LINBOX_HAVE_SACLIB_FALSE='#'
-else
- LINBOX_HAVE_SACLIB_TRUE='#'
- LINBOX_HAVE_SACLIB_FALSE=
-fi
-
-
-CXXFLAGS=${BACKUP_CXXFLAGS}
-LIBS=${BACKUP_LIBS}
-#unset LD_LIBRARY_PATH
-
-
-
-
-
-# Check whether --with-lidia was given.
-if test "${with_lidia+set}" = set; then :
- withval=$with_lidia; if test "$withval" = yes ; then
- LIDIA_HOME_PATH="${DEFAULT_CHECKING_PATH}"
- elif test "$withval" != no ; then
- LIDIA_HOME_PATH="$withval"
- fi
-fi
-
-
-min_lidia_version=2.1
-
-
-
-BACKUP_CXXFLAGS=${CXXFLAGS}
-BACKUP_LIBS=${LIBS}
-
-if test -n "$LIDIA_HOME_PATH" ; then
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for LIDIA >= $min_lidia_version" >&5
-$as_echo_n "checking for LIDIA >= $min_lidia_version... " >&6; }
-fi
-
-for LIDIA_HOME in ${LIDIA_HOME_PATH}
- do
-if test -r "$LIDIA_HOME/include/LiDIA/LiDIA.h"; then
- if test "x$LIDIA_HOME" != "x/usr" -a "x$LIDIA_HOME" != "x/usr/local"; then
- LIDIA_CFLAGS="-I${LIDIA_HOME}/include"
- LIDIA_LIBS="-L${LIDIA_HOME}/lib -lLiDIA"
- else
- LIDIA_CFLAGS=
- LIDIA_LIBS="-lLiDIA"
- fi
- CXXFLAGS="${BACKUP_CXXFLAGS} ${LIDIA_CFLAGS} ${GMP_CFLAGS}"
- LIBS="${BACKUP_LIBS} ${LIDIA_LIBS} ${GMP_LIBS}"
-
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-#include <LiDIA/bigint.h>
-int
-main ()
-{
-LiDIA::bigint a;
- ;
- return 0;
-}
-_ACEOF
-if ac_fn_cxx_try_link "$LINENO"; then :
-
- if test "$cross_compiling" = yes; then :
-
- lidia_found="yes"
- lidia_cross="yes"
- break
-
-else
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-#include <LiDIA/LiDIA.h>
- int main () { if (LIDIA_MAJOR_VERSION < 2) return -1; else return 0; }
-
-_ACEOF
-if ac_fn_cxx_try_run "$LINENO"; then :
-
- lidia_found="yes"
- break
-
-else
-
- lidia_problem="$problem $LIDIA_HOME"
- unset LIDIA_CFLAGS
- unset LIDIA_LIBS
-
-fi
-rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
- conftest.$ac_objext conftest.beam conftest.$ac_ext
-fi
-
-
-else
-
- lidia_found="no"
- lidia_checked="$checked $LIDIA_HOME"
- unset LIDIA_CFLAGS
- unset LIDIA_LIBS
-
-fi
-rm -f core conftest.err conftest.$ac_objext \
- conftest$ac_exeext conftest.$ac_ext
-else
- lidia_found="no"
-fi
-done
-
-if test "x$lidia_found" = "xyes" ; then
-
-
-
-$as_echo "#define HAVE_LIDIA 1" >>confdefs.h
-
- HAVE_LIDIA=yes
- if test "x$lidia_cross" != "xyes"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: found" >&5
-$as_echo "found" >&6; }
- else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: unknown" >&5
-$as_echo "unknown" >&6; }
- echo "WARNING: You appear to be cross compiling, so there is no way to determine"
- echo "whether your LIDIA version is new enough. I am assuming it is."
- fi
- :
-elif test -n "$lidia_problem"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: problem" >&5
-$as_echo "problem" >&6; }
- echo "Sorry, your LIDIA version is too old. Disabling."
- :
-elif test "x$lidia_found" = "xno" ; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found" >&5
-$as_echo "not found" >&6; }
- :
-fi
-
-
- if test "x$HAVE_LIDIA" = "xyes"; then
- LINBOX_HAVE_LIDIA_TRUE=
- LINBOX_HAVE_LIDIA_FALSE='#'
-else
- LINBOX_HAVE_LIDIA_TRUE='#'
- LINBOX_HAVE_LIDIA_FALSE=
-fi
-
-
-CXXFLAGS=${BACKUP_CXXFLAGS}
-LIBS=${BACKUP_LIBS}
-#unset LD_LIBRARY_PATH
-
-
-
-
-
-# Check whether --with-maple was given.
-if test "${with_maple+set}" = set; then :
- withval=$with_maple; if test "$withval" = yes ; then
- MAPLE_HOME_PATH="${DEFAULT_CHECKING_PATH} unknown"
- elif test "$withval" != no ; then
- MAPLE_HOME_PATH="$withval ${DEFAULT_CHECKING_PATH} unknown"
- fi
-fi
-
-
-# Check whether --enable-shared was given.
-if test "${enable_shared+set}" = set; then :
- enableval=$enable_shared; have_shared="$enableval"
-else
- have_shared="no"
-fi
-
-
-if test -n "$MAPLE_HOME_PATH" ; then
-min_maple_version=9.0
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for MAPLE >= $min_maple_version" >&5
-$as_echo_n "checking for MAPLE >= $min_maple_version... " >&6; }
-fi
-
-eval LIB_DIR=${libdir}
-if test ${LIB_DIR} = "NONE/lib" ; then
- eval LIB_DIR="${prefix}/lib"
-fi
-
-
-for MAPLE_HOME in ${MAPLE_HOME_PATH}
-do
- if test "x$MAPLE_HOME" != "xunknown"; then
- if test -r "${MAPLE_HOME}/bin/maple.system.type" && test -r "${MAPLE_HOME}/extern/include/maplec.h" ; then
- MAPLE_BIN=${MAPLE_HOME}/`${MAPLE_HOME}/bin/maple.system.type`
- else
- MAPLE_BIN=""
- fi
- else
- if test -r "/usr/local/bin/xmaple" && test -r "/usr/local/bin/maple.system.type"; then
- MAPLE_HOME=`sed -ne "s/MAPLE='\(.*\)'/\\1/p" /usr/local/bin/xmaple`
- MAPLE_BIN="${MAPLE_HOME}/"`${MAPLE_HOME}/bin/maple.system.type`
- elif test -r "/usr/bin/xmaple" ; then
- MAPLE_HOME=`sed -ne "s/MAPLE='\(.*\)'/\\1/p" /usr/bin/xmaple`
- MAPLE_BIN="${MAPLE_HOME}/"`${MAPLE_HOME}/bin/maple.system.type`
- else
- MAPLE_BIN=""
- fi
- fi
-
- if test -z "${MAPLE_BIN}" ; then
- maple_found="no"
- else
- maple_found="yes"
- if test $have_shared = "yes"; then
- ${MAPLE_HOME}/bin/maple macros/maple-check-version.mpl > /dev/null
- MAPLE_VERSION=`cat maple_version.txt`
-
- if test ${MAPLE_VERSION} -lt 9; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: problem" >&5
-$as_echo "problem" >&6; }
- echo " your version of Maple is too old, at least version 9 is recquired. Disabling."
- break
- else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: found" >&5
-$as_echo "found" >&6; }
- LD_LIBRARY_PATH="${LD_LIBRARY_PATH}:${MAPLE_BIN}:${LIB_DIR}"
- LD_RUN_PATH="${LD_RUN_PATH}:${MAPLE_BIN}:${LIB_DIR}"
- export LD_LIBRARY_PATH
- export LD_RUN_PATH
- MAPLE_LIBS="-L${MAPLE_BIN} -lmaplec -lstdc++"
- MAPLE_CFLAGS="-I${MAPLE_HOME}/extern/include"
-
-
-
-
- if test ${MAPLE_VERSION} -ge 10 ; then
-
-cat >>confdefs.h <<_ACEOF
-#define MAPLE_GMP_ACCESS /**/
-_ACEOF
-
- fi
-
-$as_echo "#define HAVE_MAPLE 1" >>confdefs.h
-
- HAVE_MAPLE=yes
- break
- fi
- else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: problem" >&5
-$as_echo "problem" >&6; }
- echo " you need to give option --enable-shared to allow Maple interfacing. Disabling."
- break
- fi
- fi
-done
-
-if test "x$maple_found" = "xno" ; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found" >&5
-$as_echo "not found" >&6; }
- $as_echo "#define HAVE_MAPLE 0" >>confdefs.h
-
-fi
-
- if test "x$HAVE_MAPLE" = "xyes"; then
- LINBOX_HAVE_MAPLE_TRUE=
- LINBOX_HAVE_MAPLE_FALSE='#'
-else
- LINBOX_HAVE_MAPLE_TRUE='#'
- LINBOX_HAVE_MAPLE_FALSE=
-fi
-
- if test "x$compile_drivers" = "xyes" -o "x$HAVE_MAPLE" = "xyes" ; then
- LINBOX_COMPILE_DRIVERS_TRUE=
- LINBOX_COMPILE_DRIVERS_FALSE='#'
-else
- LINBOX_COMPILE_DRIVERS_TRUE='#'
- LINBOX_COMPILE_DRIVERS_FALSE=
-fi
-
-
-
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to compile the SAGE interface" >&5
-$as_echo_n "checking whether to compile the SAGE interface... " >&6; }
-
-# Check whether --enable-sage was given.
-if test "${enable_sage+set}" = set; then :
- enableval=$enable_sage;
-fi
-
- if test "x$enable_sage" = "xyes"; then
- LINBOX_HAVE_SAGE_TRUE=
- LINBOX_HAVE_SAGE_FALSE='#'
-else
- LINBOX_HAVE_SAGE_TRUE='#'
- LINBOX_HAVE_SAGE_FALSE=
-fi
-
-if test "x$enable_sage" = "xyes"; then :
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
-
-
-
-
-else
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-
-fi
-
-#LB_CHECK_ATLAS
-
-# LB_CHECK_BLAS(,,[
-# echo ''
-# echo '*******************************************************************************'
-# echo ' ERROR: BLAS not found!'
-# echo
-# echo ' BLAS routines are required for this library to compile. Please'
-# echo ' make sure BLAS are installed and specify its location with the option'
-# echo ' --with-blas=<lib> when running configure.'
-# echo '*******************************************************************************'
-# exit 1
-# ])
-
-
-
-
-
-# Check whether --with-fflas-ffpack was given.
-if test "${with_fflas_ffpack+set}" = set; then :
- withval=$with_fflas_ffpack; if test "$withval" = yes ; then
- FFLAS_FFPACK_HOME_PATH="${DEFAULT_CHECKING_PATH}"
- elif test "$withval" != no ; then
- FFLAS_FFPACK_HOME_PATH="$withval ${DEFAULT_CHECKING_PATH}"
- fi
-else
- FFLAS_FFPACK_HOME_PATH="${DEFAULT_CHECKING_PATH}"
-fi
-
-
-
-
-version_min=10600
-version_max=10700
-
-
-BACKUP_CXXFLAGS=${CXXFLAGS}
-BACKUP_LIBS=${LIBS}
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for FFLAS-FFPACK >= $version_min and < $version_max" >&5
-$as_echo_n "checking for FFLAS-FFPACK >= $version_min and < $version_max... " >&6; }
-
-for FFLAS_FFPACK_HOME in ${FFLAS_FFPACK_HOME_PATH}
- do
- if test -r "$FFLAS_FFPACK_HOME/include/fflas-ffpack/fflas-ffpack.h" -a -x "$FFLAS_FFPACK_HOME/bin/fflas-ffpack-config"; then
-
- BLAS_LIBS=`$FFLAS_FFPACK_HOME/bin/fflas-ffpack-config --blas-libs`
- BLAS_CFLAGS=`$FFLAS_FFPACK_HOME/bin/fflas-ffpack-config --cflags`
-
-
- if test "x$FFLAS_FFPACK_HOME" != "x/usr" -a "x$FFLAS_FFPACK_HOME" != "x/usr/local"; then
- FFLAS_FFPACK_CFLAGS="-I${FFLAS_FFPACK_HOME}/include"
- else
- FFLAS_FFPACK_CFLAGS=
- fi
-
- CXXFLAGS="${BACKUP_CXXFLAGS} ${FFLAS_FFPACK_CFLAGS} ${BLAS_CFLAGS}"
- LIBS="${BACKUP_LIBS} ${BLAS_LIBS}"
-
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-#include "fflas-ffpack/fflas-ffpack.h"
-int
-main ()
-{
-FFLAS::FFLAS_TRANSPOSE a;
- ;
- return 0;
-}
-_ACEOF
-if ac_fn_cxx_try_link "$LINENO"; then :
-
-
- FF_VER=`$FFLAS_FFPACK_HOME/bin/fflas-ffpack-config --decimal-version`
- if test $FF_VER -ge $version_min -a $FF_VER -lt $version_max ; then :
-
- ffflasffpack_found="yes"
- FFLAS_FFPACK_LOC="$FFLAS_FFPACK_HOME"
- break
-
-else
-
- ffflasffpack_found="no"
-
-
-fi
-
-else
-
- ffflasffpack_found="no"
- ffflasffpack_checked="$checked $FFLAS_FFPACK_HOME"
- unset FFLAS_FFPACK_CFLAGS
- unset FFLAS_FFPACK_LOC
- unset BLAS_LIBS
- unset BLAS_CFLAGS
-
-fi
-rm -f core conftest.err conftest.$ac_objext \
- conftest$ac_exeext conftest.$ac_ext
- else
- fflasflas_found="no"
- fi
-done
-
-if test "x$ffflasffpack_found" = "xyes" ; then
-
-
-
-
-
-
-$as_echo "#define HAVE_FFLAS_FFPACK 1" >>confdefs.h
-
- FF_VER=`$FFLAS_FFPACK_LOC/bin/fflas-ffpack-config --decimal-version`
-
-cat >>confdefs.h <<_ACEOF
-#define FFLAS_FFPACK_VERSION $FF_VER
-_ACEOF
-
- HAVE_FFLAS_FFPACK=yes
- if test "x$fflasflas_cross" != "xyes"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: found" >&5
-$as_echo "found" >&6; }
- else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: unknown" >&5
-$as_echo "unknown" >&6; }
- echo "WARNING: You appear to be cross compiling, so there is no way to determine"
- echo "whether your FFLAS-FFPACK version is new enough. I am assuming it is."
- fi
- :
-elif test -n "$fflasflas_problem"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: problem" >&5
-$as_echo "problem" >&6; }
- echo "Sorry, your FFLAS-FFPACK version is too old. Disabling."
-
-echo ''
-echo '*******************************************************************************'
-echo ' ERROR: Fflas-Ffpack not found!'
-echo
-echo ' Fflas-Ffpack routines are required for this library to compile. Please'
-echo ' make sure they are installed and specify its location with the option'
-echo ' --with-fflas-ffpack=<lib> when running configure.'
-echo '*******************************************************************************'
-exit 1
-
-elif test "x$fflasflas_found" = "xno" ; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found" >&5
-$as_echo "not found" >&6; }
-
-echo ''
-echo '*******************************************************************************'
-echo ' ERROR: Fflas-Ffpack not found!'
-echo
-echo ' Fflas-Ffpack routines are required for this library to compile. Please'
-echo ' make sure they are installed and specify its location with the option'
-echo ' --with-fflas-ffpack=<lib> when running configure.'
-echo '*******************************************************************************'
-exit 1
-
-fi
-
- if test "x$HAVE_FFLAS_FFPACK" = "xyes"; then
- LINBOX_HAVE_FFLAS_FFPACK_TRUE=
- LINBOX_HAVE_FFLAS_FFPACK_FALSE='#'
-else
- LINBOX_HAVE_FFLAS_FFPACK_TRUE='#'
- LINBOX_HAVE_FFLAS_FFPACK_FALSE=
-fi
-
-
-CXXFLAGS=${BACKUP_CXXFLAGS}
-LIBS=${BACKUP_LIBS}
-#unset LD_LIBRARY_PATH
-
-
-
-
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for LAPACK in fflas-ffpack" >&5
-$as_echo_n "checking for LAPACK in fflas-ffpack... " >&6; }
-
-BACKUP_CXXFLAGS=${CXXFLAGS}
-BACKUP_LIBS=${LIBS}
-
-CXXFLAGS="${BACKUP_CXXFLAGS} ${FFLAS_FFPACK_CFLAGS} ${BLAS_CFLAGS}"
-LIBS="${BACKUP_LIBS} ${BLAS_LIBS}"
-
-if test "$cross_compiling" = yes; then :
-
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: unknown" >&5
-$as_echo "unknown" >&6; }
- if false; then
- LINBOX_HAVE_LAPACK_TRUE=
- LINBOX_HAVE_LAPACK_FALSE='#'
-else
- LINBOX_HAVE_LAPACK_TRUE='#'
- LINBOX_HAVE_LAPACK_FALSE=
-fi
-
-
-else
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
- #include "fflas-ffpack/fflas-ffpack-config.h"
- #ifdef __FFLAS_FFPACK_HAVE_LAPACK
- int main() { return 0 ; }
- #else
- a pas lapack
- #endif
-
-_ACEOF
-if ac_fn_cxx_try_run "$LINENO"; then :
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: ok" >&5
-$as_echo "ok" >&6; }
-
-$as_echo "#define HAVE_LAPACK 1" >>confdefs.h
-
- if true; then
- LINBOX_HAVE_LAPACK_TRUE=
- LINBOX_HAVE_LAPACK_FALSE='#'
-else
- LINBOX_HAVE_LAPACK_TRUE='#'
- LINBOX_HAVE_LAPACK_FALSE=
-fi
-
-
-else
-
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
- if false; then
- LINBOX_HAVE_LAPACK_TRUE=
- LINBOX_HAVE_LAPACK_FALSE='#'
-else
- LINBOX_HAVE_LAPACK_TRUE='#'
- LINBOX_HAVE_LAPACK_FALSE=
-fi
-
-
-fi
-rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
- conftest.$ac_objext conftest.beam conftest.$ac_ext
-fi
-
-
-CXXFLAGS=${BACKUP_CXXFLAGS}
-LIBS=${BACKUP_LIBS}
-
-
-
-
-# AC_MSG_RESULT($BLAS_LIBS)
-# AC_MSG_RESULT($BLAS_CFLAGS)
-
-
-
-
-
-# Check whether --with-expat was given.
-if test "${with_expat+set}" = set; then :
- withval=$with_expat; if test "$withval" = yes ; then
- EXPAT_HOME_PATH="${DEFAULT_CHECKING_PATH}"
- elif test "$withval" != no ; then
- EXPAT_HOME_PATH="$withval"
- fi
-fi
-
-
-min_expat_version=1.95
-
-
-
-BACKUP_CXXFLAGS=${CXXFLAGS}
-BACKUP_LIBS=${LIBS}
-
-if test -n "$EXPAT_HOME_PATH"; then
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for EXPAT >= $min_expat_version" >&5
-$as_echo_n "checking for EXPAT >= $min_expat_version... " >&6; }
-fi
-
-for EXPAT_HOME in ${EXPAT_HOME_PATH}
- do
-if test -r "$EXPAT_HOME/include/expat.h"; then
-
- if test "x$EXPAT_HOME" != "x/usr" -a "x$EXPAT_HOME" != "x/usr/local"; then
- EXPAT_CFLAGS="-I${EXPAT_HOME}/include"
- EXPAT_LIBS="-L${EXPAT_HOME}/lib -lexpat"
- else
- EXPAT_CFLAGS=
- EXPAT_LIBS="-lexpat"
- fi
-
- CXXFLAGS="${BACKUP_CXXFLAGS} ${EXPAT_CFLAGS} ${GMP_CFLAGS}"
- LIBS="${BACKUP_LIBS} ${EXPAT_LIBS} ${GMP_LIBS}"
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-#include <expat.h>
-int
-main ()
-{
-XML_Content_Type a;
- ;
- return 0;
-}
-_ACEOF
-if ac_fn_cxx_try_link "$LINENO"; then :
-
- if test "$cross_compiling" = yes; then :
-
- expat_found="yes"
- expat_cross="yes"
- break
-
-else
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-#include <expat.h>
- int main () { if(XML_MAJOR_VERSION < 1 || (XML_MAJOR_VERSION == 1 && XML_MINOR_VERSION < 95)) return -1; else return 0; }
-
-_ACEOF
-if ac_fn_cxx_try_run "$LINENO"; then :
-
- expat_found="yes"
- break
-
-else
-
- expat_problem="$problem $EXPAT_HOME"
- unset EXPAT_CFLAGS
- unset EXPAT_LIBS
-
-fi
-rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
- conftest.$ac_objext conftest.beam conftest.$ac_ext
-fi
-
-
-else
-
- expat_found="no"
- expat_checked="$checked $EXPAT_HOME"
- unset EXPAT_CFLAGS
- unset EXPAT_LIBS
-
-fi
-rm -f core conftest.err conftest.$ac_objext \
- conftest$ac_exeext conftest.$ac_ext
-else
- expat_found="no"
-fi
-done
-
-if test "x$expat_found" = "xyes" ; then
-
-
-
-$as_echo "#define XMLENABLED 1" >>confdefs.h
-
- HAVE_EXPAT=yes
- if test "x$expat_cross" != "xyes"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: found" >&5
-$as_echo "found" >&6; }
- else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: unknown" >&5
-$as_echo "unknown" >&6; }
- echo "WARNING: You appear to be cross compiling, so there is no way to determine"
- echo "whether your EXPAT version is new enough. I am assuming it is."
- fi
- :
-elif test -n "$expat_problem"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: problem" >&5
-$as_echo "problem" >&6; }
- echo "Sorry, your EXPAT version is too old. Disabling."
- :
-elif test "x$expat_found" = "xno" ; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found" >&5
-$as_echo "not found" >&6; }
- :
-fi
-
- if test "x$HAVE_EXPAT" = "xyes"; then
- LINBOX_HAVE_EXPAT_TRUE=
- LINBOX_HAVE_EXPAT_FALSE='#'
-else
- LINBOX_HAVE_EXPAT_TRUE='#'
- LINBOX_HAVE_EXPAT_FALSE=
-fi
-
-
-CXXFLAGS=${BACKUP_CXXFLAGS}
-LIBS=${BACKUP_LIBS}
-#unset LD_LIBRARY_PATH
-
-
-
-
-
-
-
-# Check whether --with-benchdir was given.
-if test "${with_benchdir+set}" = set; then :
- withval=$with_benchdir;
- LINBOX_BENCH_PATH="$withval"
-
-else
-
- eval LINBOX_BENCH_PATH="${prefix}/benchmarks"
-
-fi
-
-
-
-
-
-# Check whether --with-gnuplot was given.
-if test "${with_gnuplot+set}" = set; then :
- withval=$with_gnuplot;
- GNUPLOT_PATH="$PATH $withval"
-
-else
-
- GNUPLOT_PATH="$PATH"
-
-fi
-
-
-# Check whether --with-ghostscript was given.
-if test "${with_ghostscript+set}" = set; then :
- withval=$with_ghostscript;
- GHOSTSCRIPT_PATH="$PATH $withval"
-
-else
-
- GHOSTSCRIPT_PATH="$PATH"
-
-fi
-
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether gnuplot works" >&5
-$as_echo_n "checking whether gnuplot works... " >&6; }
-res=yes;
-export PATH=$GNUPLOT_PATH
-(gnuplot --version) < /dev/null > /dev/null 2>&1 || res=no
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $res" >&5
-$as_echo "$res" >&6; }
-if test $res = no ; then
- echo
- echo "You must have gnuplot installed to create benchmark "
- echo "graphics for LinBox. Download the appropriate package"
- echo "for your distribution, or get the source tarball from"
- echo "http://www.gnuplot.info/download.html "
-else
-
-$as_echo "#define HAVE_GNUPLOT 1" >>confdefs.h
-
-fi
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ps2pdf works" >&5
-$as_echo_n "checking whether ps2pdf works... " >&6; }
-res=yes;
-export PATH=$GHOSTSCRIPT_PATH
-(ps2pdf --version -) < /dev/null > /dev/null 2>&1 || res=no
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $res" >&5
-$as_echo "$res" >&6; }
-if test $res = no ; then
- echo
- echo "You must have ps2pdf installed to create pdf benchmarks"
- echo "graphics for LinBox. Download the appropriate package "
- echo "for your distribution, or get the source tarball from "
- echo "http://pages.cs.wisc.edu/~ghost/ "
-else
-
-$as_echo "#define HAVE_GHOSTSCRIPT 1" >>confdefs.h
-
-fi
-
-
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to use run time optimization" >&5
-$as_echo_n "checking whether to use run time optimization... " >&6; }
-
-# Check whether --enable-optimization was given.
-if test "${enable_optimization+set}" = set; then :
- enableval=$enable_optimization;
-
- WINO="`grep "define.*__FFLASFFPACK_WINOTHRESHOLD" ${FFLAS_FFPACK_LOC}/include/fflas-ffpack/fflas-ffpack-optimise.h | awk '{print $NF}'`"
- if test -z "{WINO}"; then :
-
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: \"fflas-ffpack was not optimised. Defaulting\"" >&5
-$as_echo "\"fflas-ffpack was not optimised. Defaulting\"" >&6; }
- WINO="`grep "define.*__FFLASFFPACK_WINOTHRESHOLD" ${FFLAS_FFPACK_LOC}/include/fflas-ffpack/fflas-ffpack-config.h | awk '{print $NF}'`"
-
-else
-
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: OK" >&5
-$as_echo "OK" >&6; }
-
-fi
-
-cat >>confdefs.h <<_ACEOF
-#define WINOTHRESHOLD $WINO
-_ACEOF
-
-
-
-else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build documentation" >&5
-$as_echo_n "checking whether to build documentation... " >&6; }
-
-
-
-# Check whether --with-docdir was given.
-if test "${with_docdir+set}" = set; then :
- withval=$with_docdir;
- LINBOX_DOC_PATH="$withval"
-
-else
-
- eval LINBOX_DOC_PATH="${prefix}/doc"
-
-fi
-
-
-
-
-
-# Check whether --with-doxygen was given.
-if test "${with_doxygen+set}" = set; then :
- withval=$with_doxygen;
- DOXYGEN_PATH="$PATH $withval"
-
-else
-
- DOXYGEN_PATH="$PATH"
-
-fi
-
-
-# Check whether --enable-doc was given.
-if test "${enable_doc+set}" = set; then :
- enableval=$enable_doc;
-fi
-
-WANTDOC="no"
-if test "x$enable_doc" = "xyes"; then :
-
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether doxygen works" >&5
-$as_echo_n "checking whether doxygen works... " >&6; }
- export PATH=$DOXYGEN_PATH
- (doxygen --version) < /dev/null > /dev/null 2>&1 || {
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
- echo
- echo "You must have doxygen installed to create documentation for"
- echo "LinBox. This error only happens if you use --enable-doc."
- echo "Download the appropriate package for your distribution, or get"
- echo "the source tarball from http://www.stack.nl/~dimitri/doxygen/"
- exit -1
- }
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
- WANTDOC="yes"
-
-else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
- if test "x$WANTDOC" != "xno" ; then
- LINBOX_BUILD_DOC_TRUE=
- LINBOX_BUILD_DOC_FALSE='#'
-else
- LINBOX_BUILD_DOC_TRUE='#'
- LINBOX_BUILD_DOC_FALSE=
-fi
-
-
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether dot works" >&5
-$as_echo_n "checking whether dot works... " >&6; }
-res=yes;
-(dot -V) < /dev/null > /dev/null 2>&1 || res=no
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $res" >&5
-$as_echo "$res" >&6; }
-if test $res = yes; then :
-
-sed 's/^HAVE_DOT.*/HAVE_DOT = YES/' doc/Doxyfile.mod > doc/Doxyfile
-sed 's/^HAVE_DOT.*/HAVE_DOT = YES/' doc/DoxyfileDev.mod > doc/DoxyfileDev
-
-else
- cp doc/Doxyfile.mod doc/Doxyfile ;
-cp doc/DoxyfileDev.mod doc/DoxyfileDev
-
-fi
-
-
-
-
-if test ! -d ./benchmarks/data ; then
- echo "Creating data dir in benchmark" ;
- mkdir ./benchmarks/data ;
-fi
-
-# this is bogus so far as I can tell. -bds
-#CXXFLAGS="${GMP_CFLAGS} ${NTL_CFLAGS} ${GIVARO_CFLAGS} ${SACLIB_CFLAGS} ${CXXFLAGS}"
-#AC_SUBST(CXXFLAGS)
-
-CXXFLAGS="${GMP_CFLAGS} ${CXXFLAGS}"
-
-
-echo "-----------------------------------------------"
-
-ac_config_files="$ac_config_files Makefile linbox-config examples/Makefile examples/fields/Makefile examples/Readme-make doc/Makefile linbox/Makefile linbox/algorithms/Makefile linbox/algorithms/gauss/Makefile linbox/algorithms/matrix-blas3/Makefile linbox/blackbox/Makefile linbox/element/Makefile linbox/field/Makefile linbox/field/NTL/Makefile linbox/field/Givaro/Makefile linbox/field/Modular/Makefile linbox/matrix/Makefile linbox/randiter/Makefile linbox/ring/Makefile linbox/solutions/ [...]
-
-cat >confcache <<\_ACEOF
-# This file is a shell script that caches the results of configure
-# tests run on this system so they can be shared between configure
-# scripts and configure runs, see configure's option --config-cache.
-# It is not useful on other systems. If it contains results you don't
-# want to keep, you may remove or edit it.
-#
-# config.status only pays attention to the cache file if you give it
-# the --recheck option to rerun configure.
-#
-# `ac_cv_env_foo' variables (set or unset) will be overridden when
-# loading this file, other *unset* `ac_cv_foo' will be assigned the
-# following values.
-
-_ACEOF
-
-# The following way of writing the cache mishandles newlines in values,
-# but we know of no workaround that is simple, portable, and efficient.
-# So, we kill variables containing newlines.
-# Ultrix sh set writes to stderr and can't be redirected directly,
-# and sets the high bit in the cache file unless we assign to the vars.
-(
- for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do
- eval ac_val=\$$ac_var
- case $ac_val in #(
- *${as_nl}*)
- case $ac_var in #(
- *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5
-$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;;
- esac
- case $ac_var in #(
- _ | IFS | as_nl) ;; #(
- BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #(
- *) { eval $ac_var=; unset $ac_var;} ;;
- esac ;;
- esac
- done
-
- (set) 2>&1 |
- case $as_nl`(ac_space=' '; set) 2>&1` in #(
- *${as_nl}ac_space=\ *)
- # `set' does not quote correctly, so add quotes: double-quote
- # substitution turns \\\\ into \\, and sed turns \\ into \.
- sed -n \
- "s/'/'\\\\''/g;
- s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p"
- ;; #(
- *)
- # `set' quotes correctly as required by POSIX, so do not add quotes.
- sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p"
- ;;
- esac |
- sort
-) |
- sed '
- /^ac_cv_env_/b end
- t clear
- :clear
- s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/
- t end
- s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/
- :end' >>confcache
-if diff "$cache_file" confcache >/dev/null 2>&1; then :; else
- if test -w "$cache_file"; then
- if test "x$cache_file" != "x/dev/null"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5
-$as_echo "$as_me: updating cache $cache_file" >&6;}
- if test ! -f "$cache_file" || test -h "$cache_file"; then
- cat confcache >"$cache_file"
- else
- case $cache_file in #(
- */* | ?:*)
- mv -f confcache "$cache_file"$$ &&
- mv -f "$cache_file"$$ "$cache_file" ;; #(
- *)
- mv -f confcache "$cache_file" ;;
- esac
- fi
- fi
- else
- { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5
-$as_echo "$as_me: not updating unwritable cache $cache_file" >&6;}
- fi
-fi
-rm -f confcache
-
-test "x$prefix" = xNONE && prefix=$ac_default_prefix
-# Let make expand exec_prefix.
-test "x$exec_prefix" = xNONE && exec_prefix='${prefix}'
-
-DEFS=-DHAVE_CONFIG_H
-
-ac_libobjs=
-ac_ltlibobjs=
-U=
-for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue
- # 1. Remove the extension, and $U if already installed.
- ac_script='s/\$U\././;s/\.o$//;s/\.obj$//'
- ac_i=`$as_echo "$ac_i" | sed "$ac_script"`
- # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR
- # will be set to the directory where LIBOBJS objects are built.
- as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext"
- as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo'
-done
-LIBOBJS=$ac_libobjs
-
-LTLIBOBJS=$ac_ltlibobjs
-
-
- if test -n "$EXEEXT"; then
- am__EXEEXT_TRUE=
- am__EXEEXT_FALSE='#'
-else
- am__EXEEXT_TRUE='#'
- am__EXEEXT_FALSE=
-fi
-
-if test -z "${MAINTAINER_MODE_TRUE}" && test -z "${MAINTAINER_MODE_FALSE}"; then
- as_fn_error $? "conditional \"MAINTAINER_MODE\" was never defined.
-Usually this means the macro was only invoked conditionally." "$LINENO" 5
-fi
-if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then
- as_fn_error $? "conditional \"AMDEP\" was never defined.
-Usually this means the macro was only invoked conditionally." "$LINENO" 5
-fi
-if test -z "${INSIDE_GNOME_COMMON_TRUE}" && test -z "${INSIDE_GNOME_COMMON_FALSE}"; then
- as_fn_error $? "conditional \"INSIDE_GNOME_COMMON\" was never defined.
-Usually this means the macro was only invoked conditionally." "$LINENO" 5
-fi
-if test -z "${DEBUG_TRUE}" && test -z "${DEBUG_FALSE}"; then
- as_fn_error $? "conditional \"DEBUG\" was never defined.
-Usually this means the macro was only invoked conditionally." "$LINENO" 5
-fi
-if test -z "${PROFILE_TRUE}" && test -z "${PROFILE_FALSE}"; then
- as_fn_error $? "conditional \"PROFILE\" was never defined.
-Usually this means the macro was only invoked conditionally." "$LINENO" 5
-fi
-
-if test -z "${LINBOX_COMPILE_DRIVERS_TRUE}" && test -z "${LINBOX_COMPILE_DRIVERS_FALSE}"; then
- as_fn_error $? "conditional \"LINBOX_COMPILE_DRIVERS\" was never defined.
-Usually this means the macro was only invoked conditionally." "$LINENO" 5
-fi
-if test -z "${LINBOX_HAVE_IML_TRUE}" && test -z "${LINBOX_HAVE_IML_FALSE}"; then
- as_fn_error $? "conditional \"LINBOX_HAVE_IML\" was never defined.
-Usually this means the macro was only invoked conditionally." "$LINENO" 5
-fi
-if test -z "${LINBOX_HAVE_M4RI_TRUE}" && test -z "${LINBOX_HAVE_M4RI_FALSE}"; then
- as_fn_error $? "conditional \"LINBOX_HAVE_M4RI\" was never defined.
-Usually this means the macro was only invoked conditionally." "$LINENO" 5
-fi
-if test -z "${LINBOX_HAVE_M4RIE_TRUE}" && test -z "${LINBOX_HAVE_M4RIE_FALSE}"; then
- as_fn_error $? "conditional \"LINBOX_HAVE_M4RIE\" was never defined.
-Usually this means the macro was only invoked conditionally." "$LINENO" 5
-fi
-if test -z "${LINBOX_HAVE_MPFR_TRUE}" && test -z "${LINBOX_HAVE_MPFR_FALSE}"; then
- as_fn_error $? "conditional \"LINBOX_HAVE_MPFR\" was never defined.
-Usually this means the macro was only invoked conditionally." "$LINENO" 5
-fi
-if test -z "${LINBOX_HAVE_FPLLL_TRUE}" && test -z "${LINBOX_HAVE_FPLLL_FALSE}"; then
- as_fn_error $? "conditional \"LINBOX_HAVE_FPLLL\" was never defined.
-Usually this means the macro was only invoked conditionally." "$LINENO" 5
-fi
-if test -z "${LINBOX_HAVE_NTL_TRUE}" && test -z "${LINBOX_HAVE_NTL_FALSE}"; then
- as_fn_error $? "conditional \"LINBOX_HAVE_NTL\" was never defined.
-Usually this means the macro was only invoked conditionally." "$LINENO" 5
-fi
-if test -z "${LINBOX_HAVE_GIVARO_TRUE}" && test -z "${LINBOX_HAVE_GIVARO_FALSE}"; then
- as_fn_error $? "conditional \"LINBOX_HAVE_GIVARO\" was never defined.
-Usually this means the macro was only invoked conditionally." "$LINENO" 5
-fi
-if test -z "${LINBOX_HAVE_SACLIB_TRUE}" && test -z "${LINBOX_HAVE_SACLIB_FALSE}"; then
- as_fn_error $? "conditional \"LINBOX_HAVE_SACLIB\" was never defined.
-Usually this means the macro was only invoked conditionally." "$LINENO" 5
-fi
-if test -z "${LINBOX_HAVE_LIDIA_TRUE}" && test -z "${LINBOX_HAVE_LIDIA_FALSE}"; then
- as_fn_error $? "conditional \"LINBOX_HAVE_LIDIA\" was never defined.
-Usually this means the macro was only invoked conditionally." "$LINENO" 5
-fi
-if test -z "${LINBOX_HAVE_MAPLE_TRUE}" && test -z "${LINBOX_HAVE_MAPLE_FALSE}"; then
- as_fn_error $? "conditional \"LINBOX_HAVE_MAPLE\" was never defined.
-Usually this means the macro was only invoked conditionally." "$LINENO" 5
-fi
-if test -z "${LINBOX_COMPILE_DRIVERS_TRUE}" && test -z "${LINBOX_COMPILE_DRIVERS_FALSE}"; then
- as_fn_error $? "conditional \"LINBOX_COMPILE_DRIVERS\" was never defined.
-Usually this means the macro was only invoked conditionally." "$LINENO" 5
-fi
-if test -z "${LINBOX_HAVE_SAGE_TRUE}" && test -z "${LINBOX_HAVE_SAGE_FALSE}"; then
- as_fn_error $? "conditional \"LINBOX_HAVE_SAGE\" was never defined.
-Usually this means the macro was only invoked conditionally." "$LINENO" 5
-fi
-if test -z "${LINBOX_HAVE_FFLAS_FFPACK_TRUE}" && test -z "${LINBOX_HAVE_FFLAS_FFPACK_FALSE}"; then
- as_fn_error $? "conditional \"LINBOX_HAVE_FFLAS_FFPACK\" was never defined.
-Usually this means the macro was only invoked conditionally." "$LINENO" 5
-fi
-if test -z "${LINBOX_HAVE_LAPACK_TRUE}" && test -z "${LINBOX_HAVE_LAPACK_FALSE}"; then
- as_fn_error $? "conditional \"LINBOX_HAVE_LAPACK\" was never defined.
-Usually this means the macro was only invoked conditionally." "$LINENO" 5
-fi
-if test -z "${LINBOX_HAVE_LAPACK_TRUE}" && test -z "${LINBOX_HAVE_LAPACK_FALSE}"; then
- as_fn_error $? "conditional \"LINBOX_HAVE_LAPACK\" was never defined.
-Usually this means the macro was only invoked conditionally." "$LINENO" 5
-fi
-if test -z "${LINBOX_HAVE_LAPACK_TRUE}" && test -z "${LINBOX_HAVE_LAPACK_FALSE}"; then
- as_fn_error $? "conditional \"LINBOX_HAVE_LAPACK\" was never defined.
-Usually this means the macro was only invoked conditionally." "$LINENO" 5
-fi
-if test -z "${LINBOX_HAVE_EXPAT_TRUE}" && test -z "${LINBOX_HAVE_EXPAT_FALSE}"; then
- as_fn_error $? "conditional \"LINBOX_HAVE_EXPAT\" was never defined.
-Usually this means the macro was only invoked conditionally." "$LINENO" 5
-fi
-if test -z "${LINBOX_BUILD_DOC_TRUE}" && test -z "${LINBOX_BUILD_DOC_FALSE}"; then
- as_fn_error $? "conditional \"LINBOX_BUILD_DOC\" was never defined.
-Usually this means the macro was only invoked conditionally." "$LINENO" 5
-fi
-
-: "${CONFIG_STATUS=./config.status}"
-ac_write_fail=0
-ac_clean_files_save=$ac_clean_files
-ac_clean_files="$ac_clean_files $CONFIG_STATUS"
-{ $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5
-$as_echo "$as_me: creating $CONFIG_STATUS" >&6;}
-as_write_fail=0
-cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1
-#! $SHELL
-# Generated by $as_me.
-# Run this file to recreate the current configuration.
-# Compiler output produced by configure, useful for debugging
-# configure, is in config.log if it exists.
-
-debug=false
-ac_cs_recheck=false
-ac_cs_silent=false
-
-SHELL=\${CONFIG_SHELL-$SHELL}
-export SHELL
-_ASEOF
-cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1
-## -------------------- ##
-## M4sh Initialization. ##
-## -------------------- ##
-
-# Be more Bourne compatible
-DUALCASE=1; export DUALCASE # for MKS sh
-if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then :
- emulate sh
- NULLCMD=:
- # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which
- # is contrary to our usage. Disable this feature.
- alias -g '${1+"$@"}'='"$@"'
- setopt NO_GLOB_SUBST
-else
- case `(set -o) 2>/dev/null` in #(
- *posix*) :
- set -o posix ;; #(
- *) :
- ;;
-esac
-fi
-
-
-as_nl='
-'
-export as_nl
-# Printing a long string crashes Solaris 7 /usr/bin/printf.
-as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
-as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo
-as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo
-# Prefer a ksh shell builtin over an external printf program on Solaris,
-# but without wasting forks for bash or zsh.
-if test -z "$BASH_VERSION$ZSH_VERSION" \
- && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then
- as_echo='print -r --'
- as_echo_n='print -rn --'
-elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then
- as_echo='printf %s\n'
- as_echo_n='printf %s'
-else
- if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then
- as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"'
- as_echo_n='/usr/ucb/echo -n'
- else
- as_echo_body='eval expr "X$1" : "X\\(.*\\)"'
- as_echo_n_body='eval
- arg=$1;
- case $arg in #(
- *"$as_nl"*)
- expr "X$arg" : "X\\(.*\\)$as_nl";
- arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;;
- esac;
- expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl"
- '
- export as_echo_n_body
- as_echo_n='sh -c $as_echo_n_body as_echo'
- fi
- export as_echo_body
- as_echo='sh -c $as_echo_body as_echo'
-fi
-
-# The user is always right.
-if test "${PATH_SEPARATOR+set}" != set; then
- PATH_SEPARATOR=:
- (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && {
- (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 ||
- PATH_SEPARATOR=';'
- }
-fi
-
-
-# IFS
-# We need space, tab and new line, in precisely that order. Quoting is
-# there to prevent editors from complaining about space-tab.
-# (If _AS_PATH_WALK were called with IFS unset, it would disable word
-# splitting by setting IFS to empty value.)
-IFS=" "" $as_nl"
-
-# Find who we are. Look in the path if we contain no directory separator.
-as_myself=
-case $0 in #((
- *[\\/]* ) as_myself=$0 ;;
- *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
- IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
- test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
- done
-IFS=$as_save_IFS
-
- ;;
-esac
-# We did not find ourselves, most probably we were run as `sh COMMAND'
-# in which case we are not to be found in the path.
-if test "x$as_myself" = x; then
- as_myself=$0
-fi
-if test ! -f "$as_myself"; then
- $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2
- exit 1
-fi
-
-# Unset variables that we do not need and which cause bugs (e.g. in
-# pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1"
-# suppresses any "Segmentation fault" message there. '((' could
-# trigger a bug in pdksh 5.2.14.
-for as_var in BASH_ENV ENV MAIL MAILPATH
-do eval test x\${$as_var+set} = xset \
- && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || :
-done
-PS1='$ '
-PS2='> '
-PS4='+ '
-
-# NLS nuisances.
-LC_ALL=C
-export LC_ALL
-LANGUAGE=C
-export LANGUAGE
-
-# CDPATH.
-(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
-
-
-# as_fn_error STATUS ERROR [LINENO LOG_FD]
-# ----------------------------------------
-# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are
-# provided, also output the error to LOG_FD, referencing LINENO. Then exit the
-# script with STATUS, using 1 if that was 0.
-as_fn_error ()
-{
- as_status=$1; test $as_status -eq 0 && as_status=1
- if test "$4"; then
- as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
- $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4
- fi
- $as_echo "$as_me: error: $2" >&2
- as_fn_exit $as_status
-} # as_fn_error
-
-
-# as_fn_set_status STATUS
-# -----------------------
-# Set $? to STATUS, without forking.
-as_fn_set_status ()
-{
- return $1
-} # as_fn_set_status
-
-# as_fn_exit STATUS
-# -----------------
-# Exit the shell with STATUS, even in a "trap 0" or "set -e" context.
-as_fn_exit ()
-{
- set +e
- as_fn_set_status $1
- exit $1
-} # as_fn_exit
-
-# as_fn_unset VAR
-# ---------------
-# Portably unset VAR.
-as_fn_unset ()
-{
- { eval $1=; unset $1;}
-}
-as_unset=as_fn_unset
-# as_fn_append VAR VALUE
-# ----------------------
-# Append the text in VALUE to the end of the definition contained in VAR. Take
-# advantage of any shell optimizations that allow amortized linear growth over
-# repeated appends, instead of the typical quadratic growth present in naive
-# implementations.
-if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then :
- eval 'as_fn_append ()
- {
- eval $1+=\$2
- }'
-else
- as_fn_append ()
- {
- eval $1=\$$1\$2
- }
-fi # as_fn_append
-
-# as_fn_arith ARG...
-# ------------------
-# Perform arithmetic evaluation on the ARGs, and store the result in the
-# global $as_val. Take advantage of shells that can avoid forks. The arguments
-# must be portable across $(()) and expr.
-if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then :
- eval 'as_fn_arith ()
- {
- as_val=$(( $* ))
- }'
-else
- as_fn_arith ()
- {
- as_val=`expr "$@" || test $? -eq 1`
- }
-fi # as_fn_arith
-
-
-if expr a : '\(a\)' >/dev/null 2>&1 &&
- test "X`expr 00001 : '.*\(...\)'`" = X001; then
- as_expr=expr
-else
- as_expr=false
-fi
-
-if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then
- as_basename=basename
-else
- as_basename=false
-fi
-
-if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then
- as_dirname=dirname
-else
- as_dirname=false
-fi
-
-as_me=`$as_basename -- "$0" ||
-$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
- X"$0" : 'X\(//\)$' \| \
- X"$0" : 'X\(/\)' \| . 2>/dev/null ||
-$as_echo X/"$0" |
- sed '/^.*\/\([^/][^/]*\)\/*$/{
- s//\1/
- q
- }
- /^X\/\(\/\/\)$/{
- s//\1/
- q
- }
- /^X\/\(\/\).*/{
- s//\1/
- q
- }
- s/.*/./; q'`
-
-# Avoid depending upon Character Ranges.
-as_cr_letters='abcdefghijklmnopqrstuvwxyz'
-as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
-as_cr_Letters=$as_cr_letters$as_cr_LETTERS
-as_cr_digits='0123456789'
-as_cr_alnum=$as_cr_Letters$as_cr_digits
-
-ECHO_C= ECHO_N= ECHO_T=
-case `echo -n x` in #(((((
--n*)
- case `echo 'xy\c'` in
- *c*) ECHO_T=' ';; # ECHO_T is single tab character.
- xy) ECHO_C='\c';;
- *) echo `echo ksh88 bug on AIX 6.1` > /dev/null
- ECHO_T=' ';;
- esac;;
-*)
- ECHO_N='-n';;
-esac
-
-rm -f conf$$ conf$$.exe conf$$.file
-if test -d conf$$.dir; then
- rm -f conf$$.dir/conf$$.file
-else
- rm -f conf$$.dir
- mkdir conf$$.dir 2>/dev/null
-fi
-if (echo >conf$$.file) 2>/dev/null; then
- if ln -s conf$$.file conf$$ 2>/dev/null; then
- as_ln_s='ln -s'
- # ... but there are two gotchas:
- # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail.
- # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable.
- # In both cases, we have to default to `cp -pR'.
- ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe ||
- as_ln_s='cp -pR'
- elif ln conf$$.file conf$$ 2>/dev/null; then
- as_ln_s=ln
- else
- as_ln_s='cp -pR'
- fi
-else
- as_ln_s='cp -pR'
-fi
-rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file
-rmdir conf$$.dir 2>/dev/null
-
-
-# as_fn_mkdir_p
-# -------------
-# Create "$as_dir" as a directory, including parents if necessary.
-as_fn_mkdir_p ()
-{
-
- case $as_dir in #(
- -*) as_dir=./$as_dir;;
- esac
- test -d "$as_dir" || eval $as_mkdir_p || {
- as_dirs=
- while :; do
- case $as_dir in #(
- *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'(
- *) as_qdir=$as_dir;;
- esac
- as_dirs="'$as_qdir' $as_dirs"
- as_dir=`$as_dirname -- "$as_dir" ||
-$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
- X"$as_dir" : 'X\(//\)[^/]' \| \
- X"$as_dir" : 'X\(//\)$' \| \
- X"$as_dir" : 'X\(/\)' \| . 2>/dev/null ||
-$as_echo X"$as_dir" |
- sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
- s//\1/
- q
- }
- /^X\(\/\/\)[^/].*/{
- s//\1/
- q
- }
- /^X\(\/\/\)$/{
- s//\1/
- q
- }
- /^X\(\/\).*/{
- s//\1/
- q
- }
- s/.*/./; q'`
- test -d "$as_dir" && break
- done
- test -z "$as_dirs" || eval "mkdir $as_dirs"
- } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir"
-
-
-} # as_fn_mkdir_p
-if mkdir -p . 2>/dev/null; then
- as_mkdir_p='mkdir -p "$as_dir"'
-else
- test -d ./-p && rmdir ./-p
- as_mkdir_p=false
-fi
-
-
-# as_fn_executable_p FILE
-# -----------------------
-# Test if FILE is an executable regular file.
-as_fn_executable_p ()
-{
- test -f "$1" && test -x "$1"
-} # as_fn_executable_p
-as_test_x='test -x'
-as_executable_p=as_fn_executable_p
-
-# Sed expression to map a string onto a valid CPP name.
-as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"
-
-# Sed expression to map a string onto a valid variable name.
-as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'"
-
-
-exec 6>&1
-## ----------------------------------- ##
-## Main body of $CONFIG_STATUS script. ##
-## ----------------------------------- ##
-_ASEOF
-test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1
-
-cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
-# Save the log message, to keep $0 and so on meaningful, and to
-# report actual input values of CONFIG_FILES etc. instead of their
-# values after options handling.
-ac_log="
-This file was extended by LinBox $as_me 1.3.2, which was
-generated by GNU Autoconf 2.69. Invocation command line was
-
- CONFIG_FILES = $CONFIG_FILES
- CONFIG_HEADERS = $CONFIG_HEADERS
- CONFIG_LINKS = $CONFIG_LINKS
- CONFIG_COMMANDS = $CONFIG_COMMANDS
- $ $0 $@
-
-on `(hostname || uname -n) 2>/dev/null | sed 1q`
-"
-
-_ACEOF
-
-case $ac_config_files in *"
-"*) set x $ac_config_files; shift; ac_config_files=$*;;
-esac
-
-case $ac_config_headers in *"
-"*) set x $ac_config_headers; shift; ac_config_headers=$*;;
-esac
-
-
-cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
-# Files that config.status was made for.
-config_files="$ac_config_files"
-config_headers="$ac_config_headers"
-config_commands="$ac_config_commands"
-
-_ACEOF
-
-cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
-ac_cs_usage="\
-\`$as_me' instantiates files and other configuration actions
-from templates according to the current configuration. Unless the files
-and actions are specified as TAGs, all are instantiated by default.
-
-Usage: $0 [OPTION]... [TAG]...
-
- -h, --help print this help, then exit
- -V, --version print version number and configuration settings, then exit
- --config print configuration, then exit
- -q, --quiet, --silent
- do not print progress messages
- -d, --debug don't remove temporary files
- --recheck update $as_me by reconfiguring in the same conditions
- --file=FILE[:TEMPLATE]
- instantiate the configuration file FILE
- --header=FILE[:TEMPLATE]
- instantiate the configuration header FILE
-
-Configuration files:
-$config_files
-
-Configuration headers:
-$config_headers
-
-Configuration commands:
-$config_commands
-
-Report bugs to <linbox-use at googlegroups.com>.
-LinBox home page: <http://www.linalg.org/>."
-
-_ACEOF
-cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
-ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`"
-ac_cs_version="\\
-LinBox config.status 1.3.2
-configured by $0, generated by GNU Autoconf 2.69,
- with options \\"\$ac_cs_config\\"
-
-Copyright (C) 2012 Free Software Foundation, Inc.
-This config.status script is free software; the Free Software Foundation
-gives unlimited permission to copy, distribute and modify it."
-
-ac_pwd='$ac_pwd'
-srcdir='$srcdir'
-INSTALL='$INSTALL'
-MKDIR_P='$MKDIR_P'
-AWK='$AWK'
-test -n "\$AWK" || AWK=awk
-_ACEOF
-
-cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
-# The default lists apply if the user does not specify any file.
-ac_need_defaults=:
-while test $# != 0
-do
- case $1 in
- --*=?*)
- ac_option=`expr "X$1" : 'X\([^=]*\)='`
- ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'`
- ac_shift=:
- ;;
- --*=)
- ac_option=`expr "X$1" : 'X\([^=]*\)='`
- ac_optarg=
- ac_shift=:
- ;;
- *)
- ac_option=$1
- ac_optarg=$2
- ac_shift=shift
- ;;
- esac
-
- case $ac_option in
- # Handling of the options.
- -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r)
- ac_cs_recheck=: ;;
- --version | --versio | --versi | --vers | --ver | --ve | --v | -V )
- $as_echo "$ac_cs_version"; exit ;;
- --config | --confi | --conf | --con | --co | --c )
- $as_echo "$ac_cs_config"; exit ;;
- --debug | --debu | --deb | --de | --d | -d )
- debug=: ;;
- --file | --fil | --fi | --f )
- $ac_shift
- case $ac_optarg in
- *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;;
- '') as_fn_error $? "missing file argument" ;;
- esac
- as_fn_append CONFIG_FILES " '$ac_optarg'"
- ac_need_defaults=false;;
- --header | --heade | --head | --hea )
- $ac_shift
- case $ac_optarg in
- *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;;
- esac
- as_fn_append CONFIG_HEADERS " '$ac_optarg'"
- ac_need_defaults=false;;
- --he | --h)
- # Conflict between --help and --header
- as_fn_error $? "ambiguous option: \`$1'
-Try \`$0 --help' for more information.";;
- --help | --hel | -h )
- $as_echo "$ac_cs_usage"; exit ;;
- -q | -quiet | --quiet | --quie | --qui | --qu | --q \
- | -silent | --silent | --silen | --sile | --sil | --si | --s)
- ac_cs_silent=: ;;
-
- # This is an error.
- -*) as_fn_error $? "unrecognized option: \`$1'
-Try \`$0 --help' for more information." ;;
-
- *) as_fn_append ac_config_targets " $1"
- ac_need_defaults=false ;;
-
- esac
- shift
-done
-
-ac_configure_extra_args=
-
-if $ac_cs_silent; then
- exec 6>/dev/null
- ac_configure_extra_args="$ac_configure_extra_args --silent"
-fi
-
-_ACEOF
-cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
-if \$ac_cs_recheck; then
- set X $SHELL '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion
- shift
- \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6
- CONFIG_SHELL='$SHELL'
- export CONFIG_SHELL
- exec "\$@"
-fi
-
-_ACEOF
-cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
-exec 5>>config.log
-{
- echo
- sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX
-## Running $as_me. ##
-_ASBOX
- $as_echo "$ac_log"
-} >&5
-
-_ACEOF
-cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
-#
-# INIT-COMMANDS
-#
-PACKAGE="$PACKAGE"
-AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"
-
-
-# The HP-UX ksh and POSIX shell print the target directory to stdout
-# if CDPATH is set.
-(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
-
-sed_quote_subst='$sed_quote_subst'
-double_quote_subst='$double_quote_subst'
-delay_variable_subst='$delay_variable_subst'
-macro_version='`$ECHO "$macro_version" | $SED "$delay_single_quote_subst"`'
-macro_revision='`$ECHO "$macro_revision" | $SED "$delay_single_quote_subst"`'
-enable_shared='`$ECHO "$enable_shared" | $SED "$delay_single_quote_subst"`'
-enable_static='`$ECHO "$enable_static" | $SED "$delay_single_quote_subst"`'
-pic_mode='`$ECHO "$pic_mode" | $SED "$delay_single_quote_subst"`'
-enable_fast_install='`$ECHO "$enable_fast_install" | $SED "$delay_single_quote_subst"`'
-SHELL='`$ECHO "$SHELL" | $SED "$delay_single_quote_subst"`'
-ECHO='`$ECHO "$ECHO" | $SED "$delay_single_quote_subst"`'
-PATH_SEPARATOR='`$ECHO "$PATH_SEPARATOR" | $SED "$delay_single_quote_subst"`'
-host_alias='`$ECHO "$host_alias" | $SED "$delay_single_quote_subst"`'
-host='`$ECHO "$host" | $SED "$delay_single_quote_subst"`'
-host_os='`$ECHO "$host_os" | $SED "$delay_single_quote_subst"`'
-build_alias='`$ECHO "$build_alias" | $SED "$delay_single_quote_subst"`'
-build='`$ECHO "$build" | $SED "$delay_single_quote_subst"`'
-build_os='`$ECHO "$build_os" | $SED "$delay_single_quote_subst"`'
-SED='`$ECHO "$SED" | $SED "$delay_single_quote_subst"`'
-Xsed='`$ECHO "$Xsed" | $SED "$delay_single_quote_subst"`'
-GREP='`$ECHO "$GREP" | $SED "$delay_single_quote_subst"`'
-EGREP='`$ECHO "$EGREP" | $SED "$delay_single_quote_subst"`'
-FGREP='`$ECHO "$FGREP" | $SED "$delay_single_quote_subst"`'
-LD='`$ECHO "$LD" | $SED "$delay_single_quote_subst"`'
-NM='`$ECHO "$NM" | $SED "$delay_single_quote_subst"`'
-LN_S='`$ECHO "$LN_S" | $SED "$delay_single_quote_subst"`'
-max_cmd_len='`$ECHO "$max_cmd_len" | $SED "$delay_single_quote_subst"`'
-ac_objext='`$ECHO "$ac_objext" | $SED "$delay_single_quote_subst"`'
-exeext='`$ECHO "$exeext" | $SED "$delay_single_quote_subst"`'
-lt_unset='`$ECHO "$lt_unset" | $SED "$delay_single_quote_subst"`'
-lt_SP2NL='`$ECHO "$lt_SP2NL" | $SED "$delay_single_quote_subst"`'
-lt_NL2SP='`$ECHO "$lt_NL2SP" | $SED "$delay_single_quote_subst"`'
-lt_cv_to_host_file_cmd='`$ECHO "$lt_cv_to_host_file_cmd" | $SED "$delay_single_quote_subst"`'
-lt_cv_to_tool_file_cmd='`$ECHO "$lt_cv_to_tool_file_cmd" | $SED "$delay_single_quote_subst"`'
-reload_flag='`$ECHO "$reload_flag" | $SED "$delay_single_quote_subst"`'
-reload_cmds='`$ECHO "$reload_cmds" | $SED "$delay_single_quote_subst"`'
-OBJDUMP='`$ECHO "$OBJDUMP" | $SED "$delay_single_quote_subst"`'
-deplibs_check_method='`$ECHO "$deplibs_check_method" | $SED "$delay_single_quote_subst"`'
-file_magic_cmd='`$ECHO "$file_magic_cmd" | $SED "$delay_single_quote_subst"`'
-file_magic_glob='`$ECHO "$file_magic_glob" | $SED "$delay_single_quote_subst"`'
-want_nocaseglob='`$ECHO "$want_nocaseglob" | $SED "$delay_single_quote_subst"`'
-DLLTOOL='`$ECHO "$DLLTOOL" | $SED "$delay_single_quote_subst"`'
-sharedlib_from_linklib_cmd='`$ECHO "$sharedlib_from_linklib_cmd" | $SED "$delay_single_quote_subst"`'
-AR='`$ECHO "$AR" | $SED "$delay_single_quote_subst"`'
-AR_FLAGS='`$ECHO "$AR_FLAGS" | $SED "$delay_single_quote_subst"`'
-archiver_list_spec='`$ECHO "$archiver_list_spec" | $SED "$delay_single_quote_subst"`'
-STRIP='`$ECHO "$STRIP" | $SED "$delay_single_quote_subst"`'
-RANLIB='`$ECHO "$RANLIB" | $SED "$delay_single_quote_subst"`'
-old_postinstall_cmds='`$ECHO "$old_postinstall_cmds" | $SED "$delay_single_quote_subst"`'
-old_postuninstall_cmds='`$ECHO "$old_postuninstall_cmds" | $SED "$delay_single_quote_subst"`'
-old_archive_cmds='`$ECHO "$old_archive_cmds" | $SED "$delay_single_quote_subst"`'
-lock_old_archive_extraction='`$ECHO "$lock_old_archive_extraction" | $SED "$delay_single_quote_subst"`'
-CC='`$ECHO "$CC" | $SED "$delay_single_quote_subst"`'
-CFLAGS='`$ECHO "$CFLAGS" | $SED "$delay_single_quote_subst"`'
-compiler='`$ECHO "$compiler" | $SED "$delay_single_quote_subst"`'
-GCC='`$ECHO "$GCC" | $SED "$delay_single_quote_subst"`'
-lt_cv_sys_global_symbol_pipe='`$ECHO "$lt_cv_sys_global_symbol_pipe" | $SED "$delay_single_quote_subst"`'
-lt_cv_sys_global_symbol_to_cdecl='`$ECHO "$lt_cv_sys_global_symbol_to_cdecl" | $SED "$delay_single_quote_subst"`'
-lt_cv_sys_global_symbol_to_c_name_address='`$ECHO "$lt_cv_sys_global_symbol_to_c_name_address" | $SED "$delay_single_quote_subst"`'
-lt_cv_sys_global_symbol_to_c_name_address_lib_prefix='`$ECHO "$lt_cv_sys_global_symbol_to_c_name_address_lib_prefix" | $SED "$delay_single_quote_subst"`'
-nm_file_list_spec='`$ECHO "$nm_file_list_spec" | $SED "$delay_single_quote_subst"`'
-lt_sysroot='`$ECHO "$lt_sysroot" | $SED "$delay_single_quote_subst"`'
-objdir='`$ECHO "$objdir" | $SED "$delay_single_quote_subst"`'
-MAGIC_CMD='`$ECHO "$MAGIC_CMD" | $SED "$delay_single_quote_subst"`'
-lt_prog_compiler_no_builtin_flag='`$ECHO "$lt_prog_compiler_no_builtin_flag" | $SED "$delay_single_quote_subst"`'
-lt_prog_compiler_pic='`$ECHO "$lt_prog_compiler_pic" | $SED "$delay_single_quote_subst"`'
-lt_prog_compiler_wl='`$ECHO "$lt_prog_compiler_wl" | $SED "$delay_single_quote_subst"`'
-lt_prog_compiler_static='`$ECHO "$lt_prog_compiler_static" | $SED "$delay_single_quote_subst"`'
-lt_cv_prog_compiler_c_o='`$ECHO "$lt_cv_prog_compiler_c_o" | $SED "$delay_single_quote_subst"`'
-need_locks='`$ECHO "$need_locks" | $SED "$delay_single_quote_subst"`'
-MANIFEST_TOOL='`$ECHO "$MANIFEST_TOOL" | $SED "$delay_single_quote_subst"`'
-DSYMUTIL='`$ECHO "$DSYMUTIL" | $SED "$delay_single_quote_subst"`'
-NMEDIT='`$ECHO "$NMEDIT" | $SED "$delay_single_quote_subst"`'
-LIPO='`$ECHO "$LIPO" | $SED "$delay_single_quote_subst"`'
-OTOOL='`$ECHO "$OTOOL" | $SED "$delay_single_quote_subst"`'
-OTOOL64='`$ECHO "$OTOOL64" | $SED "$delay_single_quote_subst"`'
-libext='`$ECHO "$libext" | $SED "$delay_single_quote_subst"`'
-shrext_cmds='`$ECHO "$shrext_cmds" | $SED "$delay_single_quote_subst"`'
-extract_expsyms_cmds='`$ECHO "$extract_expsyms_cmds" | $SED "$delay_single_quote_subst"`'
-archive_cmds_need_lc='`$ECHO "$archive_cmds_need_lc" | $SED "$delay_single_quote_subst"`'
-enable_shared_with_static_runtimes='`$ECHO "$enable_shared_with_static_runtimes" | $SED "$delay_single_quote_subst"`'
-export_dynamic_flag_spec='`$ECHO "$export_dynamic_flag_spec" | $SED "$delay_single_quote_subst"`'
-whole_archive_flag_spec='`$ECHO "$whole_archive_flag_spec" | $SED "$delay_single_quote_subst"`'
-compiler_needs_object='`$ECHO "$compiler_needs_object" | $SED "$delay_single_quote_subst"`'
-old_archive_from_new_cmds='`$ECHO "$old_archive_from_new_cmds" | $SED "$delay_single_quote_subst"`'
-old_archive_from_expsyms_cmds='`$ECHO "$old_archive_from_expsyms_cmds" | $SED "$delay_single_quote_subst"`'
-archive_cmds='`$ECHO "$archive_cmds" | $SED "$delay_single_quote_subst"`'
-archive_expsym_cmds='`$ECHO "$archive_expsym_cmds" | $SED "$delay_single_quote_subst"`'
-module_cmds='`$ECHO "$module_cmds" | $SED "$delay_single_quote_subst"`'
-module_expsym_cmds='`$ECHO "$module_expsym_cmds" | $SED "$delay_single_quote_subst"`'
-with_gnu_ld='`$ECHO "$with_gnu_ld" | $SED "$delay_single_quote_subst"`'
-allow_undefined_flag='`$ECHO "$allow_undefined_flag" | $SED "$delay_single_quote_subst"`'
-no_undefined_flag='`$ECHO "$no_undefined_flag" | $SED "$delay_single_quote_subst"`'
-hardcode_libdir_flag_spec='`$ECHO "$hardcode_libdir_flag_spec" | $SED "$delay_single_quote_subst"`'
-hardcode_libdir_separator='`$ECHO "$hardcode_libdir_separator" | $SED "$delay_single_quote_subst"`'
-hardcode_direct='`$ECHO "$hardcode_direct" | $SED "$delay_single_quote_subst"`'
-hardcode_direct_absolute='`$ECHO "$hardcode_direct_absolute" | $SED "$delay_single_quote_subst"`'
-hardcode_minus_L='`$ECHO "$hardcode_minus_L" | $SED "$delay_single_quote_subst"`'
-hardcode_shlibpath_var='`$ECHO "$hardcode_shlibpath_var" | $SED "$delay_single_quote_subst"`'
-hardcode_automatic='`$ECHO "$hardcode_automatic" | $SED "$delay_single_quote_subst"`'
-inherit_rpath='`$ECHO "$inherit_rpath" | $SED "$delay_single_quote_subst"`'
-link_all_deplibs='`$ECHO "$link_all_deplibs" | $SED "$delay_single_quote_subst"`'
-always_export_symbols='`$ECHO "$always_export_symbols" | $SED "$delay_single_quote_subst"`'
-export_symbols_cmds='`$ECHO "$export_symbols_cmds" | $SED "$delay_single_quote_subst"`'
-exclude_expsyms='`$ECHO "$exclude_expsyms" | $SED "$delay_single_quote_subst"`'
-include_expsyms='`$ECHO "$include_expsyms" | $SED "$delay_single_quote_subst"`'
-prelink_cmds='`$ECHO "$prelink_cmds" | $SED "$delay_single_quote_subst"`'
-postlink_cmds='`$ECHO "$postlink_cmds" | $SED "$delay_single_quote_subst"`'
-file_list_spec='`$ECHO "$file_list_spec" | $SED "$delay_single_quote_subst"`'
-variables_saved_for_relink='`$ECHO "$variables_saved_for_relink" | $SED "$delay_single_quote_subst"`'
-need_lib_prefix='`$ECHO "$need_lib_prefix" | $SED "$delay_single_quote_subst"`'
-need_version='`$ECHO "$need_version" | $SED "$delay_single_quote_subst"`'
-version_type='`$ECHO "$version_type" | $SED "$delay_single_quote_subst"`'
-runpath_var='`$ECHO "$runpath_var" | $SED "$delay_single_quote_subst"`'
-shlibpath_var='`$ECHO "$shlibpath_var" | $SED "$delay_single_quote_subst"`'
-shlibpath_overrides_runpath='`$ECHO "$shlibpath_overrides_runpath" | $SED "$delay_single_quote_subst"`'
-libname_spec='`$ECHO "$libname_spec" | $SED "$delay_single_quote_subst"`'
-library_names_spec='`$ECHO "$library_names_spec" | $SED "$delay_single_quote_subst"`'
-soname_spec='`$ECHO "$soname_spec" | $SED "$delay_single_quote_subst"`'
-install_override_mode='`$ECHO "$install_override_mode" | $SED "$delay_single_quote_subst"`'
-postinstall_cmds='`$ECHO "$postinstall_cmds" | $SED "$delay_single_quote_subst"`'
-postuninstall_cmds='`$ECHO "$postuninstall_cmds" | $SED "$delay_single_quote_subst"`'
-finish_cmds='`$ECHO "$finish_cmds" | $SED "$delay_single_quote_subst"`'
-finish_eval='`$ECHO "$finish_eval" | $SED "$delay_single_quote_subst"`'
-hardcode_into_libs='`$ECHO "$hardcode_into_libs" | $SED "$delay_single_quote_subst"`'
-sys_lib_search_path_spec='`$ECHO "$sys_lib_search_path_spec" | $SED "$delay_single_quote_subst"`'
-sys_lib_dlsearch_path_spec='`$ECHO "$sys_lib_dlsearch_path_spec" | $SED "$delay_single_quote_subst"`'
-hardcode_action='`$ECHO "$hardcode_action" | $SED "$delay_single_quote_subst"`'
-enable_dlopen='`$ECHO "$enable_dlopen" | $SED "$delay_single_quote_subst"`'
-enable_dlopen_self='`$ECHO "$enable_dlopen_self" | $SED "$delay_single_quote_subst"`'
-enable_dlopen_self_static='`$ECHO "$enable_dlopen_self_static" | $SED "$delay_single_quote_subst"`'
-old_striplib='`$ECHO "$old_striplib" | $SED "$delay_single_quote_subst"`'
-striplib='`$ECHO "$striplib" | $SED "$delay_single_quote_subst"`'
-compiler_lib_search_dirs='`$ECHO "$compiler_lib_search_dirs" | $SED "$delay_single_quote_subst"`'
-predep_objects='`$ECHO "$predep_objects" | $SED "$delay_single_quote_subst"`'
-postdep_objects='`$ECHO "$postdep_objects" | $SED "$delay_single_quote_subst"`'
-predeps='`$ECHO "$predeps" | $SED "$delay_single_quote_subst"`'
-postdeps='`$ECHO "$postdeps" | $SED "$delay_single_quote_subst"`'
-compiler_lib_search_path='`$ECHO "$compiler_lib_search_path" | $SED "$delay_single_quote_subst"`'
-LD_CXX='`$ECHO "$LD_CXX" | $SED "$delay_single_quote_subst"`'
-reload_flag_CXX='`$ECHO "$reload_flag_CXX" | $SED "$delay_single_quote_subst"`'
-reload_cmds_CXX='`$ECHO "$reload_cmds_CXX" | $SED "$delay_single_quote_subst"`'
-old_archive_cmds_CXX='`$ECHO "$old_archive_cmds_CXX" | $SED "$delay_single_quote_subst"`'
-compiler_CXX='`$ECHO "$compiler_CXX" | $SED "$delay_single_quote_subst"`'
-GCC_CXX='`$ECHO "$GCC_CXX" | $SED "$delay_single_quote_subst"`'
-lt_prog_compiler_no_builtin_flag_CXX='`$ECHO "$lt_prog_compiler_no_builtin_flag_CXX" | $SED "$delay_single_quote_subst"`'
-lt_prog_compiler_pic_CXX='`$ECHO "$lt_prog_compiler_pic_CXX" | $SED "$delay_single_quote_subst"`'
-lt_prog_compiler_wl_CXX='`$ECHO "$lt_prog_compiler_wl_CXX" | $SED "$delay_single_quote_subst"`'
-lt_prog_compiler_static_CXX='`$ECHO "$lt_prog_compiler_static_CXX" | $SED "$delay_single_quote_subst"`'
-lt_cv_prog_compiler_c_o_CXX='`$ECHO "$lt_cv_prog_compiler_c_o_CXX" | $SED "$delay_single_quote_subst"`'
-archive_cmds_need_lc_CXX='`$ECHO "$archive_cmds_need_lc_CXX" | $SED "$delay_single_quote_subst"`'
-enable_shared_with_static_runtimes_CXX='`$ECHO "$enable_shared_with_static_runtimes_CXX" | $SED "$delay_single_quote_subst"`'
-export_dynamic_flag_spec_CXX='`$ECHO "$export_dynamic_flag_spec_CXX" | $SED "$delay_single_quote_subst"`'
-whole_archive_flag_spec_CXX='`$ECHO "$whole_archive_flag_spec_CXX" | $SED "$delay_single_quote_subst"`'
-compiler_needs_object_CXX='`$ECHO "$compiler_needs_object_CXX" | $SED "$delay_single_quote_subst"`'
-old_archive_from_new_cmds_CXX='`$ECHO "$old_archive_from_new_cmds_CXX" | $SED "$delay_single_quote_subst"`'
-old_archive_from_expsyms_cmds_CXX='`$ECHO "$old_archive_from_expsyms_cmds_CXX" | $SED "$delay_single_quote_subst"`'
-archive_cmds_CXX='`$ECHO "$archive_cmds_CXX" | $SED "$delay_single_quote_subst"`'
-archive_expsym_cmds_CXX='`$ECHO "$archive_expsym_cmds_CXX" | $SED "$delay_single_quote_subst"`'
-module_cmds_CXX='`$ECHO "$module_cmds_CXX" | $SED "$delay_single_quote_subst"`'
-module_expsym_cmds_CXX='`$ECHO "$module_expsym_cmds_CXX" | $SED "$delay_single_quote_subst"`'
-with_gnu_ld_CXX='`$ECHO "$with_gnu_ld_CXX" | $SED "$delay_single_quote_subst"`'
-allow_undefined_flag_CXX='`$ECHO "$allow_undefined_flag_CXX" | $SED "$delay_single_quote_subst"`'
-no_undefined_flag_CXX='`$ECHO "$no_undefined_flag_CXX" | $SED "$delay_single_quote_subst"`'
-hardcode_libdir_flag_spec_CXX='`$ECHO "$hardcode_libdir_flag_spec_CXX" | $SED "$delay_single_quote_subst"`'
-hardcode_libdir_separator_CXX='`$ECHO "$hardcode_libdir_separator_CXX" | $SED "$delay_single_quote_subst"`'
-hardcode_direct_CXX='`$ECHO "$hardcode_direct_CXX" | $SED "$delay_single_quote_subst"`'
-hardcode_direct_absolute_CXX='`$ECHO "$hardcode_direct_absolute_CXX" | $SED "$delay_single_quote_subst"`'
-hardcode_minus_L_CXX='`$ECHO "$hardcode_minus_L_CXX" | $SED "$delay_single_quote_subst"`'
-hardcode_shlibpath_var_CXX='`$ECHO "$hardcode_shlibpath_var_CXX" | $SED "$delay_single_quote_subst"`'
-hardcode_automatic_CXX='`$ECHO "$hardcode_automatic_CXX" | $SED "$delay_single_quote_subst"`'
-inherit_rpath_CXX='`$ECHO "$inherit_rpath_CXX" | $SED "$delay_single_quote_subst"`'
-link_all_deplibs_CXX='`$ECHO "$link_all_deplibs_CXX" | $SED "$delay_single_quote_subst"`'
-always_export_symbols_CXX='`$ECHO "$always_export_symbols_CXX" | $SED "$delay_single_quote_subst"`'
-export_symbols_cmds_CXX='`$ECHO "$export_symbols_cmds_CXX" | $SED "$delay_single_quote_subst"`'
-exclude_expsyms_CXX='`$ECHO "$exclude_expsyms_CXX" | $SED "$delay_single_quote_subst"`'
-include_expsyms_CXX='`$ECHO "$include_expsyms_CXX" | $SED "$delay_single_quote_subst"`'
-prelink_cmds_CXX='`$ECHO "$prelink_cmds_CXX" | $SED "$delay_single_quote_subst"`'
-postlink_cmds_CXX='`$ECHO "$postlink_cmds_CXX" | $SED "$delay_single_quote_subst"`'
-file_list_spec_CXX='`$ECHO "$file_list_spec_CXX" | $SED "$delay_single_quote_subst"`'
-hardcode_action_CXX='`$ECHO "$hardcode_action_CXX" | $SED "$delay_single_quote_subst"`'
-compiler_lib_search_dirs_CXX='`$ECHO "$compiler_lib_search_dirs_CXX" | $SED "$delay_single_quote_subst"`'
-predep_objects_CXX='`$ECHO "$predep_objects_CXX" | $SED "$delay_single_quote_subst"`'
-postdep_objects_CXX='`$ECHO "$postdep_objects_CXX" | $SED "$delay_single_quote_subst"`'
-predeps_CXX='`$ECHO "$predeps_CXX" | $SED "$delay_single_quote_subst"`'
-postdeps_CXX='`$ECHO "$postdeps_CXX" | $SED "$delay_single_quote_subst"`'
-compiler_lib_search_path_CXX='`$ECHO "$compiler_lib_search_path_CXX" | $SED "$delay_single_quote_subst"`'
-
-LTCC='$LTCC'
-LTCFLAGS='$LTCFLAGS'
-compiler='$compiler_DEFAULT'
-
-# A function that is used when there is no print builtin or printf.
-func_fallback_echo ()
-{
- eval 'cat <<_LTECHO_EOF
-\$1
-_LTECHO_EOF'
-}
-
-# Quote evaled strings.
-for var in SHELL \
-ECHO \
-PATH_SEPARATOR \
-SED \
-GREP \
-EGREP \
-FGREP \
-LD \
-NM \
-LN_S \
-lt_SP2NL \
-lt_NL2SP \
-reload_flag \
-OBJDUMP \
-deplibs_check_method \
-file_magic_cmd \
-file_magic_glob \
-want_nocaseglob \
-DLLTOOL \
-sharedlib_from_linklib_cmd \
-AR \
-AR_FLAGS \
-archiver_list_spec \
-STRIP \
-RANLIB \
-CC \
-CFLAGS \
-compiler \
-lt_cv_sys_global_symbol_pipe \
-lt_cv_sys_global_symbol_to_cdecl \
-lt_cv_sys_global_symbol_to_c_name_address \
-lt_cv_sys_global_symbol_to_c_name_address_lib_prefix \
-nm_file_list_spec \
-lt_prog_compiler_no_builtin_flag \
-lt_prog_compiler_pic \
-lt_prog_compiler_wl \
-lt_prog_compiler_static \
-lt_cv_prog_compiler_c_o \
-need_locks \
-MANIFEST_TOOL \
-DSYMUTIL \
-NMEDIT \
-LIPO \
-OTOOL \
-OTOOL64 \
-shrext_cmds \
-export_dynamic_flag_spec \
-whole_archive_flag_spec \
-compiler_needs_object \
-with_gnu_ld \
-allow_undefined_flag \
-no_undefined_flag \
-hardcode_libdir_flag_spec \
-hardcode_libdir_separator \
-exclude_expsyms \
-include_expsyms \
-file_list_spec \
-variables_saved_for_relink \
-libname_spec \
-library_names_spec \
-soname_spec \
-install_override_mode \
-finish_eval \
-old_striplib \
-striplib \
-compiler_lib_search_dirs \
-predep_objects \
-postdep_objects \
-predeps \
-postdeps \
-compiler_lib_search_path \
-LD_CXX \
-reload_flag_CXX \
-compiler_CXX \
-lt_prog_compiler_no_builtin_flag_CXX \
-lt_prog_compiler_pic_CXX \
-lt_prog_compiler_wl_CXX \
-lt_prog_compiler_static_CXX \
-lt_cv_prog_compiler_c_o_CXX \
-export_dynamic_flag_spec_CXX \
-whole_archive_flag_spec_CXX \
-compiler_needs_object_CXX \
-with_gnu_ld_CXX \
-allow_undefined_flag_CXX \
-no_undefined_flag_CXX \
-hardcode_libdir_flag_spec_CXX \
-hardcode_libdir_separator_CXX \
-exclude_expsyms_CXX \
-include_expsyms_CXX \
-file_list_spec_CXX \
-compiler_lib_search_dirs_CXX \
-predep_objects_CXX \
-postdep_objects_CXX \
-predeps_CXX \
-postdeps_CXX \
-compiler_lib_search_path_CXX; do
- case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in
- *[\\\\\\\`\\"\\\$]*)
- eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED \\"\\\$sed_quote_subst\\"\\\`\\\\\\""
- ;;
- *)
- eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\""
- ;;
- esac
-done
-
-# Double-quote double-evaled strings.
-for var in reload_cmds \
-old_postinstall_cmds \
-old_postuninstall_cmds \
-old_archive_cmds \
-extract_expsyms_cmds \
-old_archive_from_new_cmds \
-old_archive_from_expsyms_cmds \
-archive_cmds \
-archive_expsym_cmds \
-module_cmds \
-module_expsym_cmds \
-export_symbols_cmds \
-prelink_cmds \
-postlink_cmds \
-postinstall_cmds \
-postuninstall_cmds \
-finish_cmds \
-sys_lib_search_path_spec \
-sys_lib_dlsearch_path_spec \
-reload_cmds_CXX \
-old_archive_cmds_CXX \
-old_archive_from_new_cmds_CXX \
-old_archive_from_expsyms_cmds_CXX \
-archive_cmds_CXX \
-archive_expsym_cmds_CXX \
-module_cmds_CXX \
-module_expsym_cmds_CXX \
-export_symbols_cmds_CXX \
-prelink_cmds_CXX \
-postlink_cmds_CXX; do
- case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in
- *[\\\\\\\`\\"\\\$]*)
- eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\""
- ;;
- *)
- eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\""
- ;;
- esac
-done
-
-ac_aux_dir='$ac_aux_dir'
-xsi_shell='$xsi_shell'
-lt_shell_append='$lt_shell_append'
-
-# See if we are running on zsh, and set the options which allow our
-# commands through without removal of \ escapes INIT.
-if test -n "\${ZSH_VERSION+set}" ; then
- setopt NO_GLOB_SUBST
-fi
-
-
- PACKAGE='$PACKAGE'
- VERSION='$VERSION'
- TIMESTAMP='$TIMESTAMP'
- RM='$RM'
- ofile='$ofile'
-
-
-
-
-
-
-_ACEOF
-
-cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
-
-# Handling of arguments.
-for ac_config_target in $ac_config_targets
-do
- case $ac_config_target in
- "config.h") CONFIG_HEADERS="$CONFIG_HEADERS config.h" ;;
- "linbox/linbox-config.h") CONFIG_COMMANDS="$CONFIG_COMMANDS linbox/linbox-config.h" ;;
- "depfiles") CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;;
- "libtool") CONFIG_COMMANDS="$CONFIG_COMMANDS libtool" ;;
- "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;;
- "linbox-config") CONFIG_FILES="$CONFIG_FILES linbox-config" ;;
- "examples/Makefile") CONFIG_FILES="$CONFIG_FILES examples/Makefile" ;;
- "examples/fields/Makefile") CONFIG_FILES="$CONFIG_FILES examples/fields/Makefile" ;;
- "examples/Readme-make") CONFIG_FILES="$CONFIG_FILES examples/Readme-make" ;;
- "doc/Makefile") CONFIG_FILES="$CONFIG_FILES doc/Makefile" ;;
- "linbox/Makefile") CONFIG_FILES="$CONFIG_FILES linbox/Makefile" ;;
- "linbox/algorithms/Makefile") CONFIG_FILES="$CONFIG_FILES linbox/algorithms/Makefile" ;;
- "linbox/algorithms/gauss/Makefile") CONFIG_FILES="$CONFIG_FILES linbox/algorithms/gauss/Makefile" ;;
- "linbox/algorithms/matrix-blas3/Makefile") CONFIG_FILES="$CONFIG_FILES linbox/algorithms/matrix-blas3/Makefile" ;;
- "linbox/blackbox/Makefile") CONFIG_FILES="$CONFIG_FILES linbox/blackbox/Makefile" ;;
- "linbox/element/Makefile") CONFIG_FILES="$CONFIG_FILES linbox/element/Makefile" ;;
- "linbox/field/Makefile") CONFIG_FILES="$CONFIG_FILES linbox/field/Makefile" ;;
- "linbox/field/NTL/Makefile") CONFIG_FILES="$CONFIG_FILES linbox/field/NTL/Makefile" ;;
- "linbox/field/Givaro/Makefile") CONFIG_FILES="$CONFIG_FILES linbox/field/Givaro/Makefile" ;;
- "linbox/field/Modular/Makefile") CONFIG_FILES="$CONFIG_FILES linbox/field/Modular/Makefile" ;;
- "linbox/matrix/Makefile") CONFIG_FILES="$CONFIG_FILES linbox/matrix/Makefile" ;;
- "linbox/randiter/Makefile") CONFIG_FILES="$CONFIG_FILES linbox/randiter/Makefile" ;;
- "linbox/ring/Makefile") CONFIG_FILES="$CONFIG_FILES linbox/ring/Makefile" ;;
- "linbox/solutions/Makefile") CONFIG_FILES="$CONFIG_FILES linbox/solutions/Makefile" ;;
- "linbox/switch/Makefile") CONFIG_FILES="$CONFIG_FILES linbox/switch/Makefile" ;;
- "linbox/util/Makefile") CONFIG_FILES="$CONFIG_FILES linbox/util/Makefile" ;;
- "linbox/util/formats/Makefile") CONFIG_FILES="$CONFIG_FILES linbox/util/formats/Makefile" ;;
- "linbox/vector/Makefile") CONFIG_FILES="$CONFIG_FILES linbox/vector/Makefile" ;;
- "tests/Makefile") CONFIG_FILES="$CONFIG_FILES tests/Makefile" ;;
- "tests/data/Makefile") CONFIG_FILES="$CONFIG_FILES tests/data/Makefile" ;;
- "tests/matrix/Makefile") CONFIG_FILES="$CONFIG_FILES tests/matrix/Makefile" ;;
- "interfaces/Makefile") CONFIG_FILES="$CONFIG_FILES interfaces/Makefile" ;;
- "interfaces/driver/Makefile") CONFIG_FILES="$CONFIG_FILES interfaces/driver/Makefile" ;;
- "interfaces/maple/Makefile") CONFIG_FILES="$CONFIG_FILES interfaces/maple/Makefile" ;;
- "interfaces/kaapi/Makefile") CONFIG_FILES="$CONFIG_FILES interfaces/kaapi/Makefile" ;;
- "interfaces/sage/Makefile") CONFIG_FILES="$CONFIG_FILES interfaces/sage/Makefile" ;;
- "macros/Makefile") CONFIG_FILES="$CONFIG_FILES macros/Makefile" ;;
- "benchmarks/Makefile") CONFIG_FILES="$CONFIG_FILES benchmarks/Makefile" ;;
-
- *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;;
- esac
-done
-
-
-# If the user did not use the arguments to specify the items to instantiate,
-# then the envvar interface is used. Set only those that are not.
-# We use the long form for the default assignment because of an extremely
-# bizarre bug on SunOS 4.1.3.
-if $ac_need_defaults; then
- test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files
- test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers
- test "${CONFIG_COMMANDS+set}" = set || CONFIG_COMMANDS=$config_commands
-fi
-
-# Have a temporary directory for convenience. Make it in the build tree
-# simply because there is no reason against having it here, and in addition,
-# creating and moving files from /tmp can sometimes cause problems.
-# Hook for its removal unless debugging.
-# Note that there is a small window in which the directory will not be cleaned:
-# after its creation but before its name has been assigned to `$tmp'.
-$debug ||
-{
- tmp= ac_tmp=
- trap 'exit_status=$?
- : "${ac_tmp:=$tmp}"
- { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status
-' 0
- trap 'as_fn_exit 1' 1 2 13 15
-}
-# Create a (secure) tmp directory for tmp files.
-
-{
- tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` &&
- test -d "$tmp"
-} ||
-{
- tmp=./conf$$-$RANDOM
- (umask 077 && mkdir "$tmp")
-} || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5
-ac_tmp=$tmp
-
-# Set up the scripts for CONFIG_FILES section.
-# No need to generate them if there are no CONFIG_FILES.
-# This happens for instance with `./config.status config.h'.
-if test -n "$CONFIG_FILES"; then
-
-
-ac_cr=`echo X | tr X '\015'`
-# On cygwin, bash can eat \r inside `` if the user requested igncr.
-# But we know of no other shell where ac_cr would be empty at this
-# point, so we can use a bashism as a fallback.
-if test "x$ac_cr" = x; then
- eval ac_cr=\$\'\\r\'
-fi
-ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' </dev/null 2>/dev/null`
-if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then
- ac_cs_awk_cr='\\r'
-else
- ac_cs_awk_cr=$ac_cr
-fi
-
-echo 'BEGIN {' >"$ac_tmp/subs1.awk" &&
-_ACEOF
-
-
-{
- echo "cat >conf$$subs.awk <<_ACEOF" &&
- echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' &&
- echo "_ACEOF"
-} >conf$$subs.sh ||
- as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5
-ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'`
-ac_delim='%!_!# '
-for ac_last_try in false false false false false :; do
- . ./conf$$subs.sh ||
- as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5
-
- ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X`
- if test $ac_delim_n = $ac_delim_num; then
- break
- elif $ac_last_try; then
- as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5
- else
- ac_delim="$ac_delim!$ac_delim _$ac_delim!! "
- fi
-done
-rm -f conf$$subs.sh
-
-cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
-cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK &&
-_ACEOF
-sed -n '
-h
-s/^/S["/; s/!.*/"]=/
-p
-g
-s/^[^!]*!//
-:repl
-t repl
-s/'"$ac_delim"'$//
-t delim
-:nl
-h
-s/\(.\{148\}\)..*/\1/
-t more1
-s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/
-p
-n
-b repl
-:more1
-s/["\\]/\\&/g; s/^/"/; s/$/"\\/
-p
-g
-s/.\{148\}//
-t nl
-:delim
-h
-s/\(.\{148\}\)..*/\1/
-t more2
-s/["\\]/\\&/g; s/^/"/; s/$/"/
-p
-b
-:more2
-s/["\\]/\\&/g; s/^/"/; s/$/"\\/
-p
-g
-s/.\{148\}//
-t delim
-' <conf$$subs.awk | sed '
-/^[^""]/{
- N
- s/\n//
-}
-' >>$CONFIG_STATUS || ac_write_fail=1
-rm -f conf$$subs.awk
-cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
-_ACAWK
-cat >>"\$ac_tmp/subs1.awk" <<_ACAWK &&
- for (key in S) S_is_set[key] = 1
- FS = ""
-
-}
-{
- line = $ 0
- nfields = split(line, field, "@")
- substed = 0
- len = length(field[1])
- for (i = 2; i < nfields; i++) {
- key = field[i]
- keylen = length(key)
- if (S_is_set[key]) {
- value = S[key]
- line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3)
- len += length(value) + length(field[++i])
- substed = 1
- } else
- len += 1 + keylen
- }
-
- print line
-}
-
-_ACAWK
-_ACEOF
-cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
-if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then
- sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g"
-else
- cat
-fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \
- || as_fn_error $? "could not setup config files machinery" "$LINENO" 5
-_ACEOF
-
-# VPATH may cause trouble with some makes, so we remove sole $(srcdir),
-# ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and
-# trailing colons and then remove the whole line if VPATH becomes empty
-# (actually we leave an empty line to preserve line numbers).
-if test "x$srcdir" = x.; then
- ac_vpsub='/^[ ]*VPATH[ ]*=[ ]*/{
-h
-s///
-s/^/:/
-s/[ ]*$/:/
-s/:\$(srcdir):/:/g
-s/:\${srcdir}:/:/g
-s/:@srcdir@:/:/g
-s/^:*//
-s/:*$//
-x
-s/\(=[ ]*\).*/\1/
-G
-s/\n//
-s/^[^=]*=[ ]*$//
-}'
-fi
-
-cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
-fi # test -n "$CONFIG_FILES"
-
-# Set up the scripts for CONFIG_HEADERS section.
-# No need to generate them if there are no CONFIG_HEADERS.
-# This happens for instance with `./config.status Makefile'.
-if test -n "$CONFIG_HEADERS"; then
-cat >"$ac_tmp/defines.awk" <<\_ACAWK ||
-BEGIN {
-_ACEOF
-
-# Transform confdefs.h into an awk script `defines.awk', embedded as
-# here-document in config.status, that substitutes the proper values into
-# config.h.in to produce config.h.
-
-# Create a delimiter string that does not exist in confdefs.h, to ease
-# handling of long lines.
-ac_delim='%!_!# '
-for ac_last_try in false false :; do
- ac_tt=`sed -n "/$ac_delim/p" confdefs.h`
- if test -z "$ac_tt"; then
- break
- elif $ac_last_try; then
- as_fn_error $? "could not make $CONFIG_HEADERS" "$LINENO" 5
- else
- ac_delim="$ac_delim!$ac_delim _$ac_delim!! "
- fi
-done
-
-# For the awk script, D is an array of macro values keyed by name,
-# likewise P contains macro parameters if any. Preserve backslash
-# newline sequences.
-
-ac_word_re=[_$as_cr_Letters][_$as_cr_alnum]*
-sed -n '
-s/.\{148\}/&'"$ac_delim"'/g
-t rset
-:rset
-s/^[ ]*#[ ]*define[ ][ ]*/ /
-t def
-d
-:def
-s/\\$//
-t bsnl
-s/["\\]/\\&/g
-s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\
-D["\1"]=" \3"/p
-s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2"/p
-d
-:bsnl
-s/["\\]/\\&/g
-s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\
-D["\1"]=" \3\\\\\\n"\\/p
-t cont
-s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2\\\\\\n"\\/p
-t cont
-d
-:cont
-n
-s/.\{148\}/&'"$ac_delim"'/g
-t clear
-:clear
-s/\\$//
-t bsnlc
-s/["\\]/\\&/g; s/^/"/; s/$/"/p
-d
-:bsnlc
-s/["\\]/\\&/g; s/^/"/; s/$/\\\\\\n"\\/p
-b cont
-' <confdefs.h | sed '
-s/'"$ac_delim"'/"\\\
-"/g' >>$CONFIG_STATUS || ac_write_fail=1
-
-cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
- for (key in D) D_is_set[key] = 1
- FS = ""
-}
-/^[\t ]*#[\t ]*(define|undef)[\t ]+$ac_word_re([\t (]|\$)/ {
- line = \$ 0
- split(line, arg, " ")
- if (arg[1] == "#") {
- defundef = arg[2]
- mac1 = arg[3]
- } else {
- defundef = substr(arg[1], 2)
- mac1 = arg[2]
- }
- split(mac1, mac2, "(") #)
- macro = mac2[1]
- prefix = substr(line, 1, index(line, defundef) - 1)
- if (D_is_set[macro]) {
- # Preserve the white space surrounding the "#".
- print prefix "define", macro P[macro] D[macro]
- next
- } else {
- # Replace #undef with comments. This is necessary, for example,
- # in the case of _POSIX_SOURCE, which is predefined and required
- # on some systems where configure will not decide to define it.
- if (defundef == "undef") {
- print "/*", prefix defundef, macro, "*/"
- next
- }
- }
-}
-{ print }
-_ACAWK
-_ACEOF
-cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
- as_fn_error $? "could not setup config headers machinery" "$LINENO" 5
-fi # test -n "$CONFIG_HEADERS"
-
-
-eval set X " :F $CONFIG_FILES :H $CONFIG_HEADERS :C $CONFIG_COMMANDS"
-shift
-for ac_tag
-do
- case $ac_tag in
- :[FHLC]) ac_mode=$ac_tag; continue;;
- esac
- case $ac_mode$ac_tag in
- :[FHL]*:*);;
- :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;;
- :[FH]-) ac_tag=-:-;;
- :[FH]*) ac_tag=$ac_tag:$ac_tag.in;;
- esac
- ac_save_IFS=$IFS
- IFS=:
- set x $ac_tag
- IFS=$ac_save_IFS
- shift
- ac_file=$1
- shift
-
- case $ac_mode in
- :L) ac_source=$1;;
- :[FH])
- ac_file_inputs=
- for ac_f
- do
- case $ac_f in
- -) ac_f="$ac_tmp/stdin";;
- *) # Look for the file first in the build tree, then in the source tree
- # (if the path is not absolute). The absolute path cannot be DOS-style,
- # because $ac_f cannot contain `:'.
- test -f "$ac_f" ||
- case $ac_f in
- [\\/$]*) false;;
- *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";;
- esac ||
- as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;;
- esac
- case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac
- as_fn_append ac_file_inputs " '$ac_f'"
- done
-
- # Let's still pretend it is `configure' which instantiates (i.e., don't
- # use $as_me), people would be surprised to read:
- # /* config.h. Generated by config.status. */
- configure_input='Generated from '`
- $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g'
- `' by configure.'
- if test x"$ac_file" != x-; then
- configure_input="$ac_file. $configure_input"
- { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5
-$as_echo "$as_me: creating $ac_file" >&6;}
- fi
- # Neutralize special characters interpreted by sed in replacement strings.
- case $configure_input in #(
- *\&* | *\|* | *\\* )
- ac_sed_conf_input=`$as_echo "$configure_input" |
- sed 's/[\\\\&|]/\\\\&/g'`;; #(
- *) ac_sed_conf_input=$configure_input;;
- esac
-
- case $ac_tag in
- *:-:* | *:-) cat >"$ac_tmp/stdin" \
- || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;;
- esac
- ;;
- esac
-
- ac_dir=`$as_dirname -- "$ac_file" ||
-$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
- X"$ac_file" : 'X\(//\)[^/]' \| \
- X"$ac_file" : 'X\(//\)$' \| \
- X"$ac_file" : 'X\(/\)' \| . 2>/dev/null ||
-$as_echo X"$ac_file" |
- sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
- s//\1/
- q
- }
- /^X\(\/\/\)[^/].*/{
- s//\1/
- q
- }
- /^X\(\/\/\)$/{
- s//\1/
- q
- }
- /^X\(\/\).*/{
- s//\1/
- q
- }
- s/.*/./; q'`
- as_dir="$ac_dir"; as_fn_mkdir_p
- ac_builddir=.
-
-case "$ac_dir" in
-.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;;
-*)
- ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'`
- # A ".." for each directory in $ac_dir_suffix.
- ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'`
- case $ac_top_builddir_sub in
- "") ac_top_builddir_sub=. ac_top_build_prefix= ;;
- *) ac_top_build_prefix=$ac_top_builddir_sub/ ;;
- esac ;;
-esac
-ac_abs_top_builddir=$ac_pwd
-ac_abs_builddir=$ac_pwd$ac_dir_suffix
-# for backward compatibility:
-ac_top_builddir=$ac_top_build_prefix
-
-case $srcdir in
- .) # We are building in place.
- ac_srcdir=.
- ac_top_srcdir=$ac_top_builddir_sub
- ac_abs_top_srcdir=$ac_pwd ;;
- [\\/]* | ?:[\\/]* ) # Absolute name.
- ac_srcdir=$srcdir$ac_dir_suffix;
- ac_top_srcdir=$srcdir
- ac_abs_top_srcdir=$srcdir ;;
- *) # Relative name.
- ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix
- ac_top_srcdir=$ac_top_build_prefix$srcdir
- ac_abs_top_srcdir=$ac_pwd/$srcdir ;;
-esac
-ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix
-
-
- case $ac_mode in
- :F)
- #
- # CONFIG_FILE
- #
-
- case $INSTALL in
- [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;;
- *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;;
- esac
- ac_MKDIR_P=$MKDIR_P
- case $MKDIR_P in
- [\\/$]* | ?:[\\/]* ) ;;
- */*) ac_MKDIR_P=$ac_top_build_prefix$MKDIR_P ;;
- esac
-_ACEOF
-
-cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
-# If the template does not know about datarootdir, expand it.
-# FIXME: This hack should be removed a few years after 2.60.
-ac_datarootdir_hack=; ac_datarootdir_seen=
-ac_sed_dataroot='
-/datarootdir/ {
- p
- q
-}
-/@datadir@/p
-/@docdir@/p
-/@infodir@/p
-/@localedir@/p
-/@mandir@/p'
-case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in
-*datarootdir*) ac_datarootdir_seen=yes;;
-*@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*)
- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5
-$as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;}
-_ACEOF
-cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
- ac_datarootdir_hack='
- s&@datadir@&$datadir&g
- s&@docdir@&$docdir&g
- s&@infodir@&$infodir&g
- s&@localedir@&$localedir&g
- s&@mandir@&$mandir&g
- s&\\\${datarootdir}&$datarootdir&g' ;;
-esac
-_ACEOF
-
-# Neutralize VPATH when `$srcdir' = `.'.
-# Shell code in configure.ac might set extrasub.
-# FIXME: do we really want to maintain this feature?
-cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
-ac_sed_extra="$ac_vpsub
-$extrasub
-_ACEOF
-cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
-:t
-/@[a-zA-Z_][a-zA-Z_0-9]*@/!b
-s|@configure_input@|$ac_sed_conf_input|;t t
-s&@top_builddir@&$ac_top_builddir_sub&;t t
-s&@top_build_prefix@&$ac_top_build_prefix&;t t
-s&@srcdir@&$ac_srcdir&;t t
-s&@abs_srcdir@&$ac_abs_srcdir&;t t
-s&@top_srcdir@&$ac_top_srcdir&;t t
-s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t
-s&@builddir@&$ac_builddir&;t t
-s&@abs_builddir@&$ac_abs_builddir&;t t
-s&@abs_top_builddir@&$ac_abs_top_builddir&;t t
-s&@INSTALL@&$ac_INSTALL&;t t
-s&@MKDIR_P@&$ac_MKDIR_P&;t t
-$ac_datarootdir_hack
-"
-eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \
- >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5
-
-test -z "$ac_datarootdir_hack$ac_datarootdir_seen" &&
- { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } &&
- { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \
- "$ac_tmp/out"`; test -z "$ac_out"; } &&
- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir'
-which seems to be undefined. Please make sure it is defined" >&5
-$as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir'
-which seems to be undefined. Please make sure it is defined" >&2;}
-
- rm -f "$ac_tmp/stdin"
- case $ac_file in
- -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";;
- *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";;
- esac \
- || as_fn_error $? "could not create $ac_file" "$LINENO" 5
- ;;
- :H)
- #
- # CONFIG_HEADER
- #
- if test x"$ac_file" != x-; then
- {
- $as_echo "/* $configure_input */" \
- && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs"
- } >"$ac_tmp/config.h" \
- || as_fn_error $? "could not create $ac_file" "$LINENO" 5
- if diff "$ac_file" "$ac_tmp/config.h" >/dev/null 2>&1; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5
-$as_echo "$as_me: $ac_file is unchanged" >&6;}
- else
- rm -f "$ac_file"
- mv "$ac_tmp/config.h" "$ac_file" \
- || as_fn_error $? "could not create $ac_file" "$LINENO" 5
- fi
- else
- $as_echo "/* $configure_input */" \
- && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" \
- || as_fn_error $? "could not create -" "$LINENO" 5
- fi
-# Compute "$ac_file"'s index in $config_headers.
-_am_arg="$ac_file"
-_am_stamp_count=1
-for _am_header in $config_headers :; do
- case $_am_header in
- $_am_arg | $_am_arg:* )
- break ;;
- * )
- _am_stamp_count=`expr $_am_stamp_count + 1` ;;
- esac
-done
-echo "timestamp for $_am_arg" >`$as_dirname -- "$_am_arg" ||
-$as_expr X"$_am_arg" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
- X"$_am_arg" : 'X\(//\)[^/]' \| \
- X"$_am_arg" : 'X\(//\)$' \| \
- X"$_am_arg" : 'X\(/\)' \| . 2>/dev/null ||
-$as_echo X"$_am_arg" |
- sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
- s//\1/
- q
- }
- /^X\(\/\/\)[^/].*/{
- s//\1/
- q
- }
- /^X\(\/\/\)$/{
- s//\1/
- q
- }
- /^X\(\/\).*/{
- s//\1/
- q
- }
- s/.*/./; q'`/stamp-h$_am_stamp_count
- ;;
-
- :C) { $as_echo "$as_me:${as_lineno-$LINENO}: executing $ac_file commands" >&5
-$as_echo "$as_me: executing $ac_file commands" >&6;}
- ;;
- esac
-
-
- case $ac_file$ac_mode in
- "linbox/linbox-config.h":C) ac_prefix_conf_OUT=`echo linbox/linbox-config.h`
-ac_prefix_conf_DEF=`echo _$ac_prefix_conf_OUT | sed -e "y:abcdefghijklmnopqrstuvwxyz:ABCDEFGHIJKLMNOPQRSTUVWXYZ:" -e "s/[^abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ]/_/g"`
-ac_prefix_conf_PKG=`echo __LINBOX`
-ac_prefix_conf_LOW=`echo _$ac_prefix_conf_PKG | sed -e "y:ABCDEFGHIJKLMNOPQRSTUVWXYZ-:abcdefghijklmnopqrstuvwxyz_:"`
-ac_prefix_conf_UPP=`echo $ac_prefix_conf_PKG | sed -e "y:abcdefghijklmnopqrstuvwxyz-:ABCDEFGHIJKLMNOPQRSTUVWXYZ_:" -e "/^[0123456789]/s/^/_/"`
-ac_prefix_conf_INP=`echo "" | sed -e 's/ *//'`
-if test ".$ac_prefix_conf_INP" = "."; then
- for ac_file in : $CONFIG_HEADERS; do test "_$ac_file" = _: && continue
- case "$ac_file" in
- *.h) ac_prefix_conf_INP=$ac_file ;;
- *)
- esac
- test ".$ac_prefix_conf_INP" != "." && break
- done
-fi
-if test ".$ac_prefix_conf_INP" = "."; then
- case "$ac_prefix_conf_OUT" in
- */*) ac_prefix_conf_INP=`basename "$ac_prefix_conf_OUT"`
- ;;
- *-*) ac_prefix_conf_INP=`echo "$ac_prefix_conf_OUT" | sed -e "s/[abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_]*-//"`
- ;;
- *) ac_prefix_conf_INP=config.h
- ;;
- esac
-fi
-if test -z "$ac_prefix_conf_PKG" ; then
- as_fn_error $? "no prefix for _PREFIX_PKG_CONFIG_H" "$LINENO" 5
-else
- if test ! -f "$ac_prefix_conf_INP" ; then if test -f "$srcdir/$ac_prefix_conf_INP" ; then
- ac_prefix_conf_INP="$srcdir/$ac_prefix_conf_INP"
- fi fi
- { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_prefix_conf_OUT - prefix $ac_prefix_conf_UPP for $ac_prefix_conf_INP defines" >&5
-$as_echo "$as_me: creating $ac_prefix_conf_OUT - prefix $ac_prefix_conf_UPP for $ac_prefix_conf_INP defines" >&6;}
- if test -f $ac_prefix_conf_INP ; then
- echo "s/#undef *\\([ABCDEFGHIJKLMNOPQRSTUVWXYZ_]\\)/#undef $ac_prefix_conf_UPP""_\\1/" > conftest.prefix
- echo "s/#undef *\\([abcdefghijklmnopqrstuvwxyz]\\)/#undef $ac_prefix_conf_LOW""_\\1/" >> conftest.prefix
- echo "s/#define *\\([ABCDEFGHIJKLMNOPQRSTUVWXYZ_][abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_]*\\)\\(.*\\)/#ifndef $ac_prefix_conf_UPP""_\\1 \\" >> conftest.prefix
- echo "#define $ac_prefix_conf_UPP""_\\1 \\2 \\" >> conftest.prefix
- echo "#endif/" >>conftest.prefix
- echo "s/#define *\\([abcdefghijklmnopqrstuvwxyz][abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_]*\\)\\(.*\\)/#ifndef $ac_prefix_conf_LOW""_\\1 \\" >> conftest.prefix
- echo "#define $ac_prefix_conf_LOW""_\\1 \\2 \\" >> conftest.prefix
- echo "#endif/" >> conftest.prefix
- # now executing _script on _DEF input to create _OUT output file
- echo "#ifndef $ac_prefix_conf_DEF" >$tmp/pconfig.h
- echo "#define $ac_prefix_conf_DEF 1" >>$tmp/pconfig.h
- echo ' ' >>$tmp/pconfig.h
- echo /'*' $ac_prefix_conf_OUT. Generated automatically at end of configure. '*'/ >>$tmp/pconfig.h
-
- sed -f conftest.prefix $ac_prefix_conf_INP >>$tmp/pconfig.h
- echo ' ' >>$tmp/pconfig.h
- echo '/* once:' $ac_prefix_conf_DEF '*/' >>$tmp/pconfig.h
- echo "#endif" >>$tmp/pconfig.h
- if cmp -s $ac_prefix_conf_OUT $tmp/pconfig.h 2>/dev/null; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: $ac_prefix_conf_OUT is unchanged" >&5
-$as_echo "$as_me: $ac_prefix_conf_OUT is unchanged" >&6;}
- else
- ac_dir=`$as_dirname -- "$ac_prefix_conf_OUT" ||
-$as_expr X"$ac_prefix_conf_OUT" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
- X"$ac_prefix_conf_OUT" : 'X\(//\)[^/]' \| \
- X"$ac_prefix_conf_OUT" : 'X\(//\)$' \| \
- X"$ac_prefix_conf_OUT" : 'X\(/\)' \| . 2>/dev/null ||
-$as_echo X"$ac_prefix_conf_OUT" |
- sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
- s//\1/
- q
- }
- /^X\(\/\/\)[^/].*/{
- s//\1/
- q
- }
- /^X\(\/\/\)$/{
- s//\1/
- q
- }
- /^X\(\/\).*/{
- s//\1/
- q
- }
- s/.*/./; q'`
- as_dir="$ac_dir"; as_fn_mkdir_p
- rm -f "$ac_prefix_conf_OUT"
- mv $tmp/pconfig.h "$ac_prefix_conf_OUT"
- fi
- cp conftest.prefix _configs.sed
- else
- as_fn_error $? "input file $ac_prefix_conf_INP does not exist - skip generating $ac_prefix_conf_OUT" "$LINENO" 5
- fi
- rm -f conftest.*
-fi
- ;;
- "depfiles":C) test x"$AMDEP_TRUE" != x"" || {
- # Autoconf 2.62 quotes --file arguments for eval, but not when files
- # are listed without --file. Let's play safe and only enable the eval
- # if we detect the quoting.
- case $CONFIG_FILES in
- *\'*) eval set x "$CONFIG_FILES" ;;
- *) set x $CONFIG_FILES ;;
- esac
- shift
- for mf
- do
- # Strip MF so we end up with the name of the file.
- mf=`echo "$mf" | sed -e 's/:.*$//'`
- # Check whether this is an Automake generated Makefile or not.
- # We used to match only the files named `Makefile.in', but
- # some people rename them; so instead we look at the file content.
- # Grep'ing the first line is not enough: some people post-process
- # each Makefile.in and add a new line on top of each file to say so.
- # Grep'ing the whole file is not good either: AIX grep has a line
- # limit of 2048, but all sed's we know have understand at least 4000.
- if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then
- dirpart=`$as_dirname -- "$mf" ||
-$as_expr X"$mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
- X"$mf" : 'X\(//\)[^/]' \| \
- X"$mf" : 'X\(//\)$' \| \
- X"$mf" : 'X\(/\)' \| . 2>/dev/null ||
-$as_echo X"$mf" |
- sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
- s//\1/
- q
- }
- /^X\(\/\/\)[^/].*/{
- s//\1/
- q
- }
- /^X\(\/\/\)$/{
- s//\1/
- q
- }
- /^X\(\/\).*/{
- s//\1/
- q
- }
- s/.*/./; q'`
- else
- continue
- fi
- # Extract the definition of DEPDIR, am__include, and am__quote
- # from the Makefile without running `make'.
- DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"`
- test -z "$DEPDIR" && continue
- am__include=`sed -n 's/^am__include = //p' < "$mf"`
- test -z "am__include" && continue
- am__quote=`sed -n 's/^am__quote = //p' < "$mf"`
- # When using ansi2knr, U may be empty or an underscore; expand it
- U=`sed -n 's/^U = //p' < "$mf"`
- # Find all dependency output files, they are included files with
- # $(DEPDIR) in their names. We invoke sed twice because it is the
- # simplest approach to changing $(DEPDIR) to its actual value in the
- # expansion.
- for file in `sed -n "
- s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \
- sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do
- # Make sure the directory exists.
- test -f "$dirpart/$file" && continue
- fdir=`$as_dirname -- "$file" ||
-$as_expr X"$file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
- X"$file" : 'X\(//\)[^/]' \| \
- X"$file" : 'X\(//\)$' \| \
- X"$file" : 'X\(/\)' \| . 2>/dev/null ||
-$as_echo X"$file" |
- sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
- s//\1/
- q
- }
- /^X\(\/\/\)[^/].*/{
- s//\1/
- q
- }
- /^X\(\/\/\)$/{
- s//\1/
- q
- }
- /^X\(\/\).*/{
- s//\1/
- q
- }
- s/.*/./; q'`
- as_dir=$dirpart/$fdir; as_fn_mkdir_p
- # echo "creating $dirpart/$file"
- echo '# dummy' > "$dirpart/$file"
- done
- done
-}
- ;;
- "libtool":C)
-
- # See if we are running on zsh, and set the options which allow our
- # commands through without removal of \ escapes.
- if test -n "${ZSH_VERSION+set}" ; then
- setopt NO_GLOB_SUBST
- fi
-
- cfgfile="${ofile}T"
- trap "$RM \"$cfgfile\"; exit 1" 1 2 15
- $RM "$cfgfile"
-
- cat <<_LT_EOF >> "$cfgfile"
-#! $SHELL
-
-# `$ECHO "$ofile" | sed 's%^.*/%%'` - Provide generalized library-building support services.
-# Generated automatically by $as_me ($PACKAGE$TIMESTAMP) $VERSION
-# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`:
-# NOTE: Changes made to this file will be lost: look at ltmain.sh.
-#
-# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005,
-# 2006, 2007, 2008, 2009, 2010, 2011 Free Software
-# Foundation, Inc.
-# Written by Gordon Matzigkeit, 1996
-#
-# This file is part of GNU Libtool.
-#
-# GNU Libtool 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.
-#
-# As a special exception to the GNU General Public License,
-# if you distribute this file as part of a program or library that
-# is built using GNU Libtool, you may include this file under the
-# same distribution terms that you use for the rest of that program.
-#
-# GNU Libtool 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 GNU Libtool; see the file COPYING. If not, a copy
-# can be downloaded from http://www.gnu.org/licenses/gpl.html, or
-# obtained by writing to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-
-
-# The names of the tagged configurations supported by this script.
-available_tags="CXX "
-
-# ### BEGIN LIBTOOL CONFIG
-
-# Which release of libtool.m4 was used?
-macro_version=$macro_version
-macro_revision=$macro_revision
-
-# Whether or not to build shared libraries.
-build_libtool_libs=$enable_shared
-
-# Whether or not to build static libraries.
-build_old_libs=$enable_static
-
-# What type of objects to build.
-pic_mode=$pic_mode
-
-# Whether or not to optimize for fast installation.
-fast_install=$enable_fast_install
-
-# Shell to use when invoking shell scripts.
-SHELL=$lt_SHELL
-
-# An echo program that protects backslashes.
-ECHO=$lt_ECHO
-
-# The PATH separator for the build system.
-PATH_SEPARATOR=$lt_PATH_SEPARATOR
-
-# The host system.
-host_alias=$host_alias
-host=$host
-host_os=$host_os
-
-# The build system.
-build_alias=$build_alias
-build=$build
-build_os=$build_os
-
-# A sed program that does not truncate output.
-SED=$lt_SED
-
-# Sed that helps us avoid accidentally triggering echo(1) options like -n.
-Xsed="\$SED -e 1s/^X//"
-
-# A grep program that handles long lines.
-GREP=$lt_GREP
-
-# An ERE matcher.
-EGREP=$lt_EGREP
-
-# A literal string matcher.
-FGREP=$lt_FGREP
-
-# A BSD- or MS-compatible name lister.
-NM=$lt_NM
-
-# Whether we need soft or hard links.
-LN_S=$lt_LN_S
-
-# What is the maximum length of a command?
-max_cmd_len=$max_cmd_len
-
-# Object file suffix (normally "o").
-objext=$ac_objext
-
-# Executable file suffix (normally "").
-exeext=$exeext
-
-# whether the shell understands "unset".
-lt_unset=$lt_unset
-
-# turn spaces into newlines.
-SP2NL=$lt_lt_SP2NL
-
-# turn newlines into spaces.
-NL2SP=$lt_lt_NL2SP
-
-# convert \$build file names to \$host format.
-to_host_file_cmd=$lt_cv_to_host_file_cmd
-
-# convert \$build files to toolchain format.
-to_tool_file_cmd=$lt_cv_to_tool_file_cmd
-
-# An object symbol dumper.
-OBJDUMP=$lt_OBJDUMP
-
-# Method to check whether dependent libraries are shared objects.
-deplibs_check_method=$lt_deplibs_check_method
-
-# Command to use when deplibs_check_method = "file_magic".
-file_magic_cmd=$lt_file_magic_cmd
-
-# How to find potential files when deplibs_check_method = "file_magic".
-file_magic_glob=$lt_file_magic_glob
-
-# Find potential files using nocaseglob when deplibs_check_method = "file_magic".
-want_nocaseglob=$lt_want_nocaseglob
-
-# DLL creation program.
-DLLTOOL=$lt_DLLTOOL
-
-# Command to associate shared and link libraries.
-sharedlib_from_linklib_cmd=$lt_sharedlib_from_linklib_cmd
-
-# The archiver.
-AR=$lt_AR
-
-# Flags to create an archive.
-AR_FLAGS=$lt_AR_FLAGS
-
-# How to feed a file listing to the archiver.
-archiver_list_spec=$lt_archiver_list_spec
-
-# A symbol stripping program.
-STRIP=$lt_STRIP
-
-# Commands used to install an old-style archive.
-RANLIB=$lt_RANLIB
-old_postinstall_cmds=$lt_old_postinstall_cmds
-old_postuninstall_cmds=$lt_old_postuninstall_cmds
-
-# Whether to use a lock for old archive extraction.
-lock_old_archive_extraction=$lock_old_archive_extraction
-
-# A C compiler.
-LTCC=$lt_CC
-
-# LTCC compiler flags.
-LTCFLAGS=$lt_CFLAGS
-
-# Take the output of nm and produce a listing of raw symbols and C names.
-global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe
-
-# Transform the output of nm in a proper C declaration.
-global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl
-
-# Transform the output of nm in a C name address pair.
-global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address
-
-# Transform the output of nm in a C name address pair when lib prefix is needed.
-global_symbol_to_c_name_address_lib_prefix=$lt_lt_cv_sys_global_symbol_to_c_name_address_lib_prefix
-
-# Specify filename containing input files for \$NM.
-nm_file_list_spec=$lt_nm_file_list_spec
-
-# The root where to search for dependent libraries,and in which our libraries should be installed.
-lt_sysroot=$lt_sysroot
-
-# The name of the directory that contains temporary libtool files.
-objdir=$objdir
-
-# Used to examine libraries when file_magic_cmd begins with "file".
-MAGIC_CMD=$MAGIC_CMD
-
-# Must we lock files when doing compilation?
-need_locks=$lt_need_locks
-
-# Manifest tool.
-MANIFEST_TOOL=$lt_MANIFEST_TOOL
-
-# Tool to manipulate archived DWARF debug symbol files on Mac OS X.
-DSYMUTIL=$lt_DSYMUTIL
-
-# Tool to change global to local symbols on Mac OS X.
-NMEDIT=$lt_NMEDIT
-
-# Tool to manipulate fat objects and archives on Mac OS X.
-LIPO=$lt_LIPO
-
-# ldd/readelf like tool for Mach-O binaries on Mac OS X.
-OTOOL=$lt_OTOOL
-
-# ldd/readelf like tool for 64 bit Mach-O binaries on Mac OS X 10.4.
-OTOOL64=$lt_OTOOL64
-
-# Old archive suffix (normally "a").
-libext=$libext
-
-# Shared library suffix (normally ".so").
-shrext_cmds=$lt_shrext_cmds
-
-# The commands to extract the exported symbol list from a shared archive.
-extract_expsyms_cmds=$lt_extract_expsyms_cmds
-
-# Variables whose values should be saved in libtool wrapper scripts and
-# restored at link time.
-variables_saved_for_relink=$lt_variables_saved_for_relink
-
-# Do we need the "lib" prefix for modules?
-need_lib_prefix=$need_lib_prefix
-
-# Do we need a version for libraries?
-need_version=$need_version
-
-# Library versioning type.
-version_type=$version_type
-
-# Shared library runtime path variable.
-runpath_var=$runpath_var
-
-# Shared library path variable.
-shlibpath_var=$shlibpath_var
-
-# Is shlibpath searched before the hard-coded library search path?
-shlibpath_overrides_runpath=$shlibpath_overrides_runpath
-
-# Format of library name prefix.
-libname_spec=$lt_libname_spec
-
-# List of archive names. First name is the real one, the rest are links.
-# The last name is the one that the linker finds with -lNAME
-library_names_spec=$lt_library_names_spec
-
-# The coded name of the library, if different from the real name.
-soname_spec=$lt_soname_spec
-
-# Permission mode override for installation of shared libraries.
-install_override_mode=$lt_install_override_mode
-
-# Command to use after installation of a shared archive.
-postinstall_cmds=$lt_postinstall_cmds
-
-# Command to use after uninstallation of a shared archive.
-postuninstall_cmds=$lt_postuninstall_cmds
-
-# Commands used to finish a libtool library installation in a directory.
-finish_cmds=$lt_finish_cmds
-
-# As "finish_cmds", except a single script fragment to be evaled but
-# not shown.
-finish_eval=$lt_finish_eval
-
-# Whether we should hardcode library paths into libraries.
-hardcode_into_libs=$hardcode_into_libs
-
-# Compile-time system search path for libraries.
-sys_lib_search_path_spec=$lt_sys_lib_search_path_spec
-
-# Run-time system search path for libraries.
-sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec
-
-# Whether dlopen is supported.
-dlopen_support=$enable_dlopen
-
-# Whether dlopen of programs is supported.
-dlopen_self=$enable_dlopen_self
-
-# Whether dlopen of statically linked programs is supported.
-dlopen_self_static=$enable_dlopen_self_static
-
-# Commands to strip libraries.
-old_striplib=$lt_old_striplib
-striplib=$lt_striplib
-
-
-# The linker used to build libraries.
-LD=$lt_LD
-
-# How to create reloadable object files.
-reload_flag=$lt_reload_flag
-reload_cmds=$lt_reload_cmds
-
-# Commands used to build an old-style archive.
-old_archive_cmds=$lt_old_archive_cmds
-
-# A language specific compiler.
-CC=$lt_compiler
-
-# Is the compiler the GNU compiler?
-with_gcc=$GCC
-
-# Compiler flag to turn off builtin functions.
-no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag
-
-# Additional compiler flags for building library objects.
-pic_flag=$lt_lt_prog_compiler_pic
-
-# How to pass a linker flag through the compiler.
-wl=$lt_lt_prog_compiler_wl
-
-# Compiler flag to prevent dynamic linking.
-link_static_flag=$lt_lt_prog_compiler_static
-
-# Does compiler simultaneously support -c and -o options?
-compiler_c_o=$lt_lt_cv_prog_compiler_c_o
-
-# Whether or not to add -lc for building shared libraries.
-build_libtool_need_lc=$archive_cmds_need_lc
-
-# Whether or not to disallow shared libs when runtime libs are static.
-allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes
-
-# Compiler flag to allow reflexive dlopens.
-export_dynamic_flag_spec=$lt_export_dynamic_flag_spec
-
-# Compiler flag to generate shared objects directly from archives.
-whole_archive_flag_spec=$lt_whole_archive_flag_spec
-
-# Whether the compiler copes with passing no objects directly.
-compiler_needs_object=$lt_compiler_needs_object
-
-# Create an old-style archive from a shared archive.
-old_archive_from_new_cmds=$lt_old_archive_from_new_cmds
-
-# Create a temporary old-style archive to link instead of a shared archive.
-old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds
-
-# Commands used to build a shared archive.
-archive_cmds=$lt_archive_cmds
-archive_expsym_cmds=$lt_archive_expsym_cmds
-
-# Commands used to build a loadable module if different from building
-# a shared archive.
-module_cmds=$lt_module_cmds
-module_expsym_cmds=$lt_module_expsym_cmds
-
-# Whether we are building with GNU ld or not.
-with_gnu_ld=$lt_with_gnu_ld
-
-# Flag that allows shared libraries with undefined symbols to be built.
-allow_undefined_flag=$lt_allow_undefined_flag
-
-# Flag that enforces no undefined symbols.
-no_undefined_flag=$lt_no_undefined_flag
-
-# Flag to hardcode \$libdir into a binary during linking.
-# This must work even if \$libdir does not exist
-hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec
-
-# Whether we need a single "-rpath" flag with a separated argument.
-hardcode_libdir_separator=$lt_hardcode_libdir_separator
-
-# Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes
-# DIR into the resulting binary.
-hardcode_direct=$hardcode_direct
-
-# Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes
-# DIR into the resulting binary and the resulting library dependency is
-# "absolute",i.e impossible to change by setting \${shlibpath_var} if the
-# library is relocated.
-hardcode_direct_absolute=$hardcode_direct_absolute
-
-# Set to "yes" if using the -LDIR flag during linking hardcodes DIR
-# into the resulting binary.
-hardcode_minus_L=$hardcode_minus_L
-
-# Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR
-# into the resulting binary.
-hardcode_shlibpath_var=$hardcode_shlibpath_var
-
-# Set to "yes" if building a shared library automatically hardcodes DIR
-# into the library and all subsequent libraries and executables linked
-# against it.
-hardcode_automatic=$hardcode_automatic
-
-# Set to yes if linker adds runtime paths of dependent libraries
-# to runtime path list.
-inherit_rpath=$inherit_rpath
-
-# Whether libtool must link a program against all its dependency libraries.
-link_all_deplibs=$link_all_deplibs
-
-# Set to "yes" if exported symbols are required.
-always_export_symbols=$always_export_symbols
-
-# The commands to list exported symbols.
-export_symbols_cmds=$lt_export_symbols_cmds
-
-# Symbols that should not be listed in the preloaded symbols.
-exclude_expsyms=$lt_exclude_expsyms
-
-# Symbols that must always be exported.
-include_expsyms=$lt_include_expsyms
-
-# Commands necessary for linking programs (against libraries) with templates.
-prelink_cmds=$lt_prelink_cmds
-
-# Commands necessary for finishing linking programs.
-postlink_cmds=$lt_postlink_cmds
-
-# Specify filename containing input files.
-file_list_spec=$lt_file_list_spec
-
-# How to hardcode a shared library path into an executable.
-hardcode_action=$hardcode_action
-
-# The directories searched by this compiler when creating a shared library.
-compiler_lib_search_dirs=$lt_compiler_lib_search_dirs
-
-# Dependencies to place before and after the objects being linked to
-# create a shared library.
-predep_objects=$lt_predep_objects
-postdep_objects=$lt_postdep_objects
-predeps=$lt_predeps
-postdeps=$lt_postdeps
-
-# The library search path used internally by the compiler when linking
-# a shared library.
-compiler_lib_search_path=$lt_compiler_lib_search_path
-
-# ### END LIBTOOL CONFIG
-
-_LT_EOF
-
- case $host_os in
- aix3*)
- cat <<\_LT_EOF >> "$cfgfile"
-# AIX sometimes has problems with the GCC collect2 program. For some
-# reason, if we set the COLLECT_NAMES environment variable, the problems
-# vanish in a puff of smoke.
-if test "X${COLLECT_NAMES+set}" != Xset; then
- COLLECT_NAMES=
- export COLLECT_NAMES
-fi
-_LT_EOF
- ;;
- esac
-
-
-ltmain="$ac_aux_dir/ltmain.sh"
-
-
- # We use sed instead of cat because bash on DJGPP gets confused if
- # if finds mixed CR/LF and LF-only lines. Since sed operates in
- # text mode, it properly converts lines to CR/LF. This bash problem
- # is reportedly fixed, but why not run on old versions too?
- sed '$q' "$ltmain" >> "$cfgfile" \
- || (rm -f "$cfgfile"; exit 1)
-
- if test x"$xsi_shell" = xyes; then
- sed -e '/^func_dirname ()$/,/^} # func_dirname /c\
-func_dirname ()\
-{\
-\ case ${1} in\
-\ */*) func_dirname_result="${1%/*}${2}" ;;\
-\ * ) func_dirname_result="${3}" ;;\
-\ esac\
-} # Extended-shell func_dirname implementation' "$cfgfile" > $cfgfile.tmp \
- && mv -f "$cfgfile.tmp" "$cfgfile" \
- || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
-test 0 -eq $? || _lt_function_replace_fail=:
-
-
- sed -e '/^func_basename ()$/,/^} # func_basename /c\
-func_basename ()\
-{\
-\ func_basename_result="${1##*/}"\
-} # Extended-shell func_basename implementation' "$cfgfile" > $cfgfile.tmp \
- && mv -f "$cfgfile.tmp" "$cfgfile" \
- || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
-test 0 -eq $? || _lt_function_replace_fail=:
-
-
- sed -e '/^func_dirname_and_basename ()$/,/^} # func_dirname_and_basename /c\
-func_dirname_and_basename ()\
-{\
-\ case ${1} in\
-\ */*) func_dirname_result="${1%/*}${2}" ;;\
-\ * ) func_dirname_result="${3}" ;;\
-\ esac\
-\ func_basename_result="${1##*/}"\
-} # Extended-shell func_dirname_and_basename implementation' "$cfgfile" > $cfgfile.tmp \
- && mv -f "$cfgfile.tmp" "$cfgfile" \
- || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
-test 0 -eq $? || _lt_function_replace_fail=:
-
-
- sed -e '/^func_stripname ()$/,/^} # func_stripname /c\
-func_stripname ()\
-{\
-\ # pdksh 5.2.14 does not do ${X%$Y} correctly if both X and Y are\
-\ # positional parameters, so assign one to ordinary parameter first.\
-\ func_stripname_result=${3}\
-\ func_stripname_result=${func_stripname_result#"${1}"}\
-\ func_stripname_result=${func_stripname_result%"${2}"}\
-} # Extended-shell func_stripname implementation' "$cfgfile" > $cfgfile.tmp \
- && mv -f "$cfgfile.tmp" "$cfgfile" \
- || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
-test 0 -eq $? || _lt_function_replace_fail=:
-
-
- sed -e '/^func_split_long_opt ()$/,/^} # func_split_long_opt /c\
-func_split_long_opt ()\
-{\
-\ func_split_long_opt_name=${1%%=*}\
-\ func_split_long_opt_arg=${1#*=}\
-} # Extended-shell func_split_long_opt implementation' "$cfgfile" > $cfgfile.tmp \
- && mv -f "$cfgfile.tmp" "$cfgfile" \
- || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
-test 0 -eq $? || _lt_function_replace_fail=:
-
-
- sed -e '/^func_split_short_opt ()$/,/^} # func_split_short_opt /c\
-func_split_short_opt ()\
-{\
-\ func_split_short_opt_arg=${1#??}\
-\ func_split_short_opt_name=${1%"$func_split_short_opt_arg"}\
-} # Extended-shell func_split_short_opt implementation' "$cfgfile" > $cfgfile.tmp \
- && mv -f "$cfgfile.tmp" "$cfgfile" \
- || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
-test 0 -eq $? || _lt_function_replace_fail=:
-
-
- sed -e '/^func_lo2o ()$/,/^} # func_lo2o /c\
-func_lo2o ()\
-{\
-\ case ${1} in\
-\ *.lo) func_lo2o_result=${1%.lo}.${objext} ;;\
-\ *) func_lo2o_result=${1} ;;\
-\ esac\
-} # Extended-shell func_lo2o implementation' "$cfgfile" > $cfgfile.tmp \
- && mv -f "$cfgfile.tmp" "$cfgfile" \
- || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
-test 0 -eq $? || _lt_function_replace_fail=:
-
-
- sed -e '/^func_xform ()$/,/^} # func_xform /c\
-func_xform ()\
-{\
- func_xform_result=${1%.*}.lo\
-} # Extended-shell func_xform implementation' "$cfgfile" > $cfgfile.tmp \
- && mv -f "$cfgfile.tmp" "$cfgfile" \
- || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
-test 0 -eq $? || _lt_function_replace_fail=:
-
-
- sed -e '/^func_arith ()$/,/^} # func_arith /c\
-func_arith ()\
-{\
- func_arith_result=$(( $* ))\
-} # Extended-shell func_arith implementation' "$cfgfile" > $cfgfile.tmp \
- && mv -f "$cfgfile.tmp" "$cfgfile" \
- || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
-test 0 -eq $? || _lt_function_replace_fail=:
-
-
- sed -e '/^func_len ()$/,/^} # func_len /c\
-func_len ()\
-{\
- func_len_result=${#1}\
-} # Extended-shell func_len implementation' "$cfgfile" > $cfgfile.tmp \
- && mv -f "$cfgfile.tmp" "$cfgfile" \
- || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
-test 0 -eq $? || _lt_function_replace_fail=:
-
-fi
-
-if test x"$lt_shell_append" = xyes; then
- sed -e '/^func_append ()$/,/^} # func_append /c\
-func_append ()\
-{\
- eval "${1}+=\\${2}"\
-} # Extended-shell func_append implementation' "$cfgfile" > $cfgfile.tmp \
- && mv -f "$cfgfile.tmp" "$cfgfile" \
- || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
-test 0 -eq $? || _lt_function_replace_fail=:
-
-
- sed -e '/^func_append_quoted ()$/,/^} # func_append_quoted /c\
-func_append_quoted ()\
-{\
-\ func_quote_for_eval "${2}"\
-\ eval "${1}+=\\\\ \\$func_quote_for_eval_result"\
-} # Extended-shell func_append_quoted implementation' "$cfgfile" > $cfgfile.tmp \
- && mv -f "$cfgfile.tmp" "$cfgfile" \
- || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
-test 0 -eq $? || _lt_function_replace_fail=:
-
-
- # Save a `func_append' function call where possible by direct use of '+='
- sed -e 's%func_append \([a-zA-Z_]\{1,\}\) "%\1+="%g' $cfgfile > $cfgfile.tmp \
- && mv -f "$cfgfile.tmp" "$cfgfile" \
- || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
- test 0 -eq $? || _lt_function_replace_fail=:
-else
- # Save a `func_append' function call even when '+=' is not available
- sed -e 's%func_append \([a-zA-Z_]\{1,\}\) "%\1="$\1%g' $cfgfile > $cfgfile.tmp \
- && mv -f "$cfgfile.tmp" "$cfgfile" \
- || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
- test 0 -eq $? || _lt_function_replace_fail=:
-fi
-
-if test x"$_lt_function_replace_fail" = x":"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Unable to substitute extended shell functions in $ofile" >&5
-$as_echo "$as_me: WARNING: Unable to substitute extended shell functions in $ofile" >&2;}
-fi
-
-
- mv -f "$cfgfile" "$ofile" ||
- (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile")
- chmod +x "$ofile"
-
-
- cat <<_LT_EOF >> "$ofile"
-
-# ### BEGIN LIBTOOL TAG CONFIG: CXX
-
-# The linker used to build libraries.
-LD=$lt_LD_CXX
-
-# How to create reloadable object files.
-reload_flag=$lt_reload_flag_CXX
-reload_cmds=$lt_reload_cmds_CXX
-
-# Commands used to build an old-style archive.
-old_archive_cmds=$lt_old_archive_cmds_CXX
-
-# A language specific compiler.
-CC=$lt_compiler_CXX
-
-# Is the compiler the GNU compiler?
-with_gcc=$GCC_CXX
-
-# Compiler flag to turn off builtin functions.
-no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag_CXX
-
-# Additional compiler flags for building library objects.
-pic_flag=$lt_lt_prog_compiler_pic_CXX
-
-# How to pass a linker flag through the compiler.
-wl=$lt_lt_prog_compiler_wl_CXX
-
-# Compiler flag to prevent dynamic linking.
-link_static_flag=$lt_lt_prog_compiler_static_CXX
-
-# Does compiler simultaneously support -c and -o options?
-compiler_c_o=$lt_lt_cv_prog_compiler_c_o_CXX
-
-# Whether or not to add -lc for building shared libraries.
-build_libtool_need_lc=$archive_cmds_need_lc_CXX
-
-# Whether or not to disallow shared libs when runtime libs are static.
-allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes_CXX
-
-# Compiler flag to allow reflexive dlopens.
-export_dynamic_flag_spec=$lt_export_dynamic_flag_spec_CXX
-
-# Compiler flag to generate shared objects directly from archives.
-whole_archive_flag_spec=$lt_whole_archive_flag_spec_CXX
-
-# Whether the compiler copes with passing no objects directly.
-compiler_needs_object=$lt_compiler_needs_object_CXX
-
-# Create an old-style archive from a shared archive.
-old_archive_from_new_cmds=$lt_old_archive_from_new_cmds_CXX
-
-# Create a temporary old-style archive to link instead of a shared archive.
-old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds_CXX
-
-# Commands used to build a shared archive.
-archive_cmds=$lt_archive_cmds_CXX
-archive_expsym_cmds=$lt_archive_expsym_cmds_CXX
-
-# Commands used to build a loadable module if different from building
-# a shared archive.
-module_cmds=$lt_module_cmds_CXX
-module_expsym_cmds=$lt_module_expsym_cmds_CXX
-
-# Whether we are building with GNU ld or not.
-with_gnu_ld=$lt_with_gnu_ld_CXX
-
-# Flag that allows shared libraries with undefined symbols to be built.
-allow_undefined_flag=$lt_allow_undefined_flag_CXX
-
-# Flag that enforces no undefined symbols.
-no_undefined_flag=$lt_no_undefined_flag_CXX
-
-# Flag to hardcode \$libdir into a binary during linking.
-# This must work even if \$libdir does not exist
-hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec_CXX
-
-# Whether we need a single "-rpath" flag with a separated argument.
-hardcode_libdir_separator=$lt_hardcode_libdir_separator_CXX
-
-# Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes
-# DIR into the resulting binary.
-hardcode_direct=$hardcode_direct_CXX
-
-# Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes
-# DIR into the resulting binary and the resulting library dependency is
-# "absolute",i.e impossible to change by setting \${shlibpath_var} if the
-# library is relocated.
-hardcode_direct_absolute=$hardcode_direct_absolute_CXX
-
-# Set to "yes" if using the -LDIR flag during linking hardcodes DIR
-# into the resulting binary.
-hardcode_minus_L=$hardcode_minus_L_CXX
-
-# Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR
-# into the resulting binary.
-hardcode_shlibpath_var=$hardcode_shlibpath_var_CXX
-
-# Set to "yes" if building a shared library automatically hardcodes DIR
-# into the library and all subsequent libraries and executables linked
-# against it.
-hardcode_automatic=$hardcode_automatic_CXX
-
-# Set to yes if linker adds runtime paths of dependent libraries
-# to runtime path list.
-inherit_rpath=$inherit_rpath_CXX
-
-# Whether libtool must link a program against all its dependency libraries.
-link_all_deplibs=$link_all_deplibs_CXX
-
-# Set to "yes" if exported symbols are required.
-always_export_symbols=$always_export_symbols_CXX
-
-# The commands to list exported symbols.
-export_symbols_cmds=$lt_export_symbols_cmds_CXX
-
-# Symbols that should not be listed in the preloaded symbols.
-exclude_expsyms=$lt_exclude_expsyms_CXX
-
-# Symbols that must always be exported.
-include_expsyms=$lt_include_expsyms_CXX
-
-# Commands necessary for linking programs (against libraries) with templates.
-prelink_cmds=$lt_prelink_cmds_CXX
-
-# Commands necessary for finishing linking programs.
-postlink_cmds=$lt_postlink_cmds_CXX
-
-# Specify filename containing input files.
-file_list_spec=$lt_file_list_spec_CXX
-
-# How to hardcode a shared library path into an executable.
-hardcode_action=$hardcode_action_CXX
-
-# The directories searched by this compiler when creating a shared library.
-compiler_lib_search_dirs=$lt_compiler_lib_search_dirs_CXX
-
-# Dependencies to place before and after the objects being linked to
-# create a shared library.
-predep_objects=$lt_predep_objects_CXX
-postdep_objects=$lt_postdep_objects_CXX
-predeps=$lt_predeps_CXX
-postdeps=$lt_postdeps_CXX
-
-# The library search path used internally by the compiler when linking
-# a shared library.
-compiler_lib_search_path=$lt_compiler_lib_search_path_CXX
-
-# ### END LIBTOOL TAG CONFIG: CXX
-_LT_EOF
-
- ;;
-
- esac
-done # for ac_tag
-
-
-as_fn_exit 0
-_ACEOF
-ac_clean_files=$ac_clean_files_save
-
-test $ac_write_fail = 0 ||
- as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5
-
-
-# configure is writing to config.log, and then calls config.status.
-# config.status does its own redirection, appending to config.log.
-# Unfortunately, on DOS this fails, as config.log is still kept open
-# by configure, so config.status won't be able to write to it; its
-# output is simply discarded. So we exec the FD to /dev/null,
-# effectively closing config.log, so it can be properly (re)opened and
-# appended to by config.status. When coming back to configure, we
-# need to make the FD available again.
-if test "$no_create" != yes; then
- ac_cs_success=:
- ac_config_status_args=
- test "$silent" = yes &&
- ac_config_status_args="$ac_config_status_args --quiet"
- exec 5>/dev/null
- $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false
- exec 5>>config.log
- # Use ||, not &&, to avoid exiting from the if with $? = 1, which
- # would make configure fail if this is the last instruction.
- $ac_cs_success || as_fn_exit 1
-fi
-if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5
-$as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;}
-fi
-
diff --git a/configure.ac b/configure.ac
index 760f5ec..12c8981 100644
--- a/configure.ac
+++ b/configure.ac
@@ -3,7 +3,7 @@
# ========LICENCE========
# This file is part of the library LinBox.
#
- LinBox is free software: you can redistribute it and/or modify
+# LinBox is free software: you can redistribute it and/or modify
# it under the terms of the GNU Lesser General Public
# License as published by the Free Software Foundation; either
# version 2.1 of the License, or (at your option) any later version.
@@ -17,15 +17,18 @@
# License along with this library; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
# ========LICENCE========
-AC_PREREQ(2.61)
+#/
-AC_INIT([LinBox], [1.3.2],[linbox-use at googlegroups.com],[linbox],
+AC_PREREQ([2.61])
+
+AC_INIT([LinBox], [1.4.1],[linbox-use at googlegroups.com],[linbox],
[http://www.linalg.org/])
+
AC_CONFIG_MACRO_DIR([macros])
AC_CONFIG_AUX_DIR([build-aux])
AM_INIT_AUTOMAKE([1.8 gnu no-dependencies -Wall -Wno-portability])
-AM_CONFIG_HEADER([config.h])
-AX_PREFIX_CONFIG_H(linbox/linbox-config.h, __LINBOX)
+AC_CONFIG_HEADERS([config.h])
+AX_PREFIX_CONFIG_H(linbox/config.h, __LINBOX)
AC_PATH_PROG(RM, rm, $FALSE)
RM="$RM -f"
@@ -65,15 +68,21 @@ AC_PROG_CXX
AC_COMPILER_NAME
+STDFLAG=${CXXFLAGS}
+
+CXXFLAGS=""
+
+# We need a C++11 compiler now - AB 2014-12-12
+AX_CXX_COMPILE_STDCXX_11([],[mandatory])
+
AC_SUBST([DEFAULT_CFLAGS])
AC_SUBST([DEBUG_CFLAGS])
AC_SUBST([TESTS_CFLAGS])
TESTS_CFLAGS="-O0"
DEBUG_CFLAGS="-g"
-
DEFAULT_CFLAGS=""
-# WARN_CFLAGS="-Wall"
+WARN_CFLAGS="-Wall"
#TODO use -fast for icc, -ipa for eko...
if test "x$DBG" = "xyes" ; then
@@ -92,17 +101,49 @@ if test "x$WARN" = "xyes" -o "x$WARN" = "xfull" ; then
case x${CCNAM} in
xicc)
WARN_CFLAGS="${WARN_CFLAGS} -Wcheck"
- # DEBUG_CFLAGS="-fast"
+ WARN_CFLAGS="${WARN_CFLAGS} -Wall -Wno-unused-parameter -Wuninitialized -Wconversion -Wcast-qual -pedantic -Wshadow -Wpointer-arith -Wwrite-strings -Wno-long-long"
+ WARN_CFLAGS="${WARN_CFLAGS} -Wextra -ansi"
;;
xeko)
WARN_CFLAGS="${WARN_CFLAGS} -Wno-unused-parameter"
;;
- xgcc|xclang)
+ xgcc|xgcc44)
+ WARN_CFLAGS="${WARN_CFLAGS} -Wextra -Wno-unused-parameter"
+ if test "x${WARN}" = "xfull" ; then
+ WARN_CFLAGS="${WARN_CFLAGS} -Wuninitialized -Wconversion -Wcast-qual -pedantic -Wshadow -Wpointer-arith -Wcast-align -Wwrite-strings -Wno-long-long -Wno-variadic-macros -Wno-vla"
+ fi
+ if test "x${HAVE_CXX11}" = "x0" ; then
+ WARN_CFLAGS="${WARN_CFLAGS} -ansi"
+ fi
+ ;;
+ xgcc48)
+ WARN_CFLAGS="${WARN_CFLAGS} -Wextra -Wno-unused-parameter"
+ if test "x${WARN}" = "xfull" ; then
+ WARN_CFLAGS="${WARN_CFLAGS} -Wuninitialized -Wconversion -Wcast-qual -pedantic -Wshadow -Wpointer-arith -Wcast-align -Wwrite-strings -Wno-long-long -Wno-variadic-macros -Wno-vla"
+ # WARN_CFLAGS="${WARN_CFLAGS} -fsanitize=address"
+ fi
+ if test "x${HAVE_CXX11}" = "x0" ; then
+ WARN_CFLAGS="${WARN_CFLAGS} -ansi"
+ fi
+
+ ;;
+
+ xclang)
WARN_CFLAGS="${WARN_CFLAGS} -Wextra -Wno-unused-parameter"
if test "x${WARN}" = "xfull" ; then
- WARN_CFLAGS="${WARN_CFLAGS} -Wuninitialized -Wconversion -Wcast-qual -ansi -pedantic -Wshadow -Wpointer-arith -Wcast-align -Wwrite-strings -Wno-long-long"
+ WARN_CFLAGS="${WARN_CFLAGS} -Wuninitialized -Wconversion -Wcast-qual -pedantic -Wshadow -Wpointer-arith -Wcast-align -Wwrite-strings -Wno-long-long -Wno-vla-extension -Wno-variadic-macros"
+ WARN_CFLAGS="${WARN_CFLAGS} -D__STRICT_ANSI__"
fi
- ;;
+ ;;
+ xclang31)
+ WARN_CFLAGS="${WARN_CFLAGS} -Wextra -Wno-unused-parameter"
+ if test "x${WARN}" = "xfull" ; then
+ WARN_CFLAGS="${WARN_CFLAGS} -Wuninitialized -Wconversion -Wcast-qual -pedantic -Wshadow -Wpointer-arith -Wcast-align -Wwrite-strings -Wno-long-long -g -Wno-vla-extension -Wno-variadic-macros"
+ WARN_CFLAGS="${WARN_CFLAGS} -D__STRICT_ANSI__"
+ # WARN_CFLAGS="${WARN_CFLAGS} -fsanitize=address"
+ fi
+ ;;
+
*)
echo
echo "*******************************************************"
@@ -127,8 +168,16 @@ LT_INIT
echo "-----------------------------------------------"
+echo " START LINBOX CONFIG "
+echo "-----------------------------------------------"
+echo "-----------------------------------------------"
+LB_OMP
+echo "-----------------------------------------------"
+AC_SUBST([PARFLAGS],['${OMPFLAGS}'])
+AC_SUBST([PARLIBS],['${OMPFLAGS}'])
+
# Machine characteristics
AC_CHECK_SIZEOF(char, 8)
@@ -140,7 +189,7 @@ AC_CHECK_SIZEOF(__int64, 64)
# Checks for header files.
AC_HEADER_STDC
-AC_CHECK_HEADERS([float.h limits.h stddef.h stdlib.h string.h sys/time.h stdint.h])
+AC_CHECK_HEADERS([float.h limits.h stddef.h stdlib.h string.h sys/time.h stdint.h pthread.h])
# check endianness of the architecture
@@ -149,186 +198,113 @@ AC_C_BIGENDIAN(
[AC_DEFINE(HAVE_LITTLE_ENDIAN, 1, [Define that architecture uses little endian storage])],
[])
-# Create some useful data types of fixed, known lengths
-
-# We hereby assume that a character is always one byte
-# LINBOX_INT8="char";
-
-# case $ac_cv_sizeof_char in
- # 1)
- # TWO_BYTES=2;
- # FOUR_BYTES=4;
- # EIGHT_BYTES=8;
- # ;;
- # 8)
- # TWO_BYTES=16;
- # FOUR_BYTES=32;
- # EIGHT_BYTES=64;
-# esac
-
-# case $TWO_BYTES in
- # $ac_cv_sizeof_short)
- # LINBOX_INT16="short";
- # ;;
- # $ac_cv_sizeof_int)
- # LINBOX_INT16="int";
- # ;;
-# esac
-
-# case $FOUR_BYTES in
- # $ac_cv_sizeof_short)
- # LINBOX_INT32="short";
- # ;;
- # $ac_cv_sizeof_int)
- # LINBOX_INT32="int";
- # ;;
- # $ac_cv_sizeof_long)
- # LINBOX_INT32="long";
- # ;;
-# esac
-
-# case $EIGHT_BYTES in
- # $ac_cv_sizeof_short)
- # LINBOX_INT64="short";
- # ;;
- # $ac_cv_sizeof_int)
- # LINBOX_INT64="int";
- # ;;
- # $ac_cv_sizeof_long)
- # LINBOX_INT64="long";
- # ;;
- # $ac_cv_sizeof_long_long)
- # LINBOX_INT64="long long";
- # ;;
- # $ac_cv_sizeof___int64)
- # LINBOX_INT64="__int64";
- # ;;
-# esac
-
-# AC_DEFINE_UNQUOTED(INT8, $LINBOX_INT8, Canonical 8-bit data type)
-# AC_DEFINE_UNQUOTED(INT16, $LINBOX_INT16, Canonical 16-bit data type)
-# AC_DEFINE_UNQUOTED(INT32, $LINBOX_INT32, Canonical 32-bit data type)
-# AC_DEFINE_UNQUOTED(INT64, $LINBOX_INT64, Canonical 64-bit data type)
-
echo "-----------------------------------------------"
# Feature checks
LB_MISC
LB_DRIVER
-AC_LANG_CPLUSPLUS
echo "-----------------------------------------------"
-LB_CHECK_GMP(,,[
+# Now getting GMP and Givaro from FFLAS-FFPACK - AB 2014-12-10
+
+LB_CHECK_FFLAS_FFPACK(,,[
+echo ''
echo '*******************************************************************************'
-echo ' ERROR: GMP not found!'
+echo ' ERROR: Fflas-Ffpack not found!'
echo
-echo ' GMP library compiled with --enable-cxx is required for this library to compile.'
-echo ' Please make sure GMP is installed and specify its location with the option'
-echo ' --with-gmp=<prefix> when running configure.'
+echo ' Fflas-Ffpack routines are required for this library to compile. Please'
+echo ' make sure they are installed and specify its location with the option'
+echo ' --with-fflas-ffpack=<lib> when running configure.'
+echo ' Also make sure your compiler supports cxx-11...'
echo '*******************************************************************************'
exit 1
])
+LB_CHECK_LAPACK
+
+# AC_MSG_RESULT($BLAS_LIBS)
+# AC_MSG_RESULT($BLAS_CFLAGS)
+
LB_CHECK_IML
LB_CHECK_M4RI
LB_CHECK_M4RIE
LB_CHECK_MPFR
# we nedd mpfr next :
LB_CHECK_FPLLL
+LB_CHECK_FLINT
LB_CHECK_NTL
-LB_CHECK_GIVARO(,,[
-echo '*******************************************************************************'
-echo ' ERROR: GIVARO not found!'
-echo
-echo ' GIVARO library is required for this library to compile.'
-echo ' Please make sure GIVARO is installed and specify its location with the'
-echo ' option --with-givaro=<prefix> when running configure.'
-echo '*******************************************************************************'
-exit 1
-])
-
LB_CHECK_SACLIB
-LB_CHECK_LIDIA
LB_CHECK_MAPLE
LB_CHECK_SAGE
-#LB_CHECK_ATLAS
-
-# LB_CHECK_BLAS(,,[
-# echo ''
-# echo '*******************************************************************************'
-# echo ' ERROR: BLAS not found!'
-# echo
-# echo ' BLAS routines are required for this library to compile. Please'
-# echo ' make sure BLAS are installed and specify its location with the option'
-# echo ' --with-blas=<lib> when running configure.'
-# echo '*******************************************************************************'
-# exit 1
-# ])
-
-
-LB_CHECK_FFLAS_FFPACK(,,[
-echo ''
-echo '*******************************************************************************'
-echo ' ERROR: Fflas-Ffpack not found!'
-echo
-echo ' Fflas-Ffpack routines are required for this library to compile. Please'
-echo ' make sure they are installed and specify its location with the option'
-echo ' --with-fflas-ffpack=<lib> when running configure.'
-echo '*******************************************************************************'
-exit 1
-])
-
-LB_CHECK_LAPACK
-
-# AC_MSG_RESULT($BLAS_LIBS)
-# AC_MSG_RESULT($BLAS_CFLAGS)
-
LB_CHECK_EXPAT
LB_BENCH
-LB_OPT
+LB_CHECK_XML
+# LB_OPT
LB_DOC
-if test ! -d ./benchmarks/data ; then
+LB_CHECK_OCL
+
+
+if test ! -d ./benchmarks/data ; then
echo "Creating data dir in benchmark" ;
- mkdir ./benchmarks/data ;
+ mkdir ./benchmarks/data ;
fi
-# this is bogus so far as I can tell. -bds
-#CXXFLAGS="${GMP_CFLAGS} ${NTL_CFLAGS} ${GIVARO_CFLAGS} ${SACLIB_CFLAGS} ${CXXFLAGS}"
-#AC_SUBST(CXXFLAGS)
+DEPS_CFLAGS="${FFLAS_FFPACK_CFLAGS} ${NTL_CFLAGS} ${MPFR_CFLAGS} ${FPLLL_CFLAGS} ${IML_CFLAGS} ${FLINT_CFLAGS}"
+DEPS_LIBS="${FFLAS_FFPACK_LIBS} ${NTL_LIBS} ${MPFR_LIBS} ${FPLLL_LIBS} ${IML_LIBS} ${FLINT_LIBS} ${OCL_LIBS}"
+
+CXXFLAGS="${CXXFLAGS} ${STDFLAG}"
-CXXFLAGS="${GMP_CFLAGS} ${CXXFLAGS}"
AC_SUBST(CXXFLAGS)
+AC_SUBST(DEPS_CFLAGS)
+AC_SUBST(DEPS_LIBS)
echo "-----------------------------------------------"
+dnl MYLIBS="${FFLAS_FFPACK_LIBS} ${NTL_LIBS} ${MPFR_LIBS} ${FPLLL_LIBS} ${IML_LIBS} ${FLINT_LIBS} ${LDFLAGS} ${OCL_LIBS}"
+dnl MYLIBS="${LIBS}"
+dnl MYFLAGS="${FFLAS_FFPACK_CFLAGS} ${NTL_CFLAGS} ${MPFR_CFLAGS} ${FPLLL_CFLAGS} ${IML_CFLAGS} ${FLINT_CFLAGS} ${OPT_FLAGS}"
+
+echo "CXXFLAGS = ${CXXFLAGS}"
+echo "LIBS = ${LIBS}"
+echo "DEPS_CFLAGS = ${DEPS_CFLAGS}"
+echo "DEPS_LIBS = ${DEPS_LIBS}"
+echo "DEFAULT CFLAGS = ${DEFAULT_CFLAGS}"
+echo "TESTS CFLAGS = ${TESTS_CFLAGS}"
+
+echo "-----------------------------------------------"
+echo " END LINBOX CONFIG "
+echo "-----------------------------------------------"
+
AC_CONFIG_FILES([
Makefile
linbox-config
examples/Makefile
-examples/fields/Makefile
-examples/Readme-make
doc/Makefile
linbox/Makefile
linbox/algorithms/Makefile
linbox/algorithms/gauss/Makefile
linbox/algorithms/matrix-blas3/Makefile
+linbox/algorithms/opencl-kernels/Makefile
+linbox/algorithms/polynomial-matrix/Makefile
linbox/blackbox/Makefile
linbox/element/Makefile
linbox/field/Makefile
-linbox/field/NTL/Makefile
-linbox/field/Givaro/Makefile
-linbox/field/Modular/Makefile
linbox/matrix/Makefile
+linbox/matrix/sparsematrix/Makefile
+linbox/matrix/densematrix/Makefile
+linbox/matrix/matrixdomain/Makefile
+linbox/matrix/sliced3/Makefile
linbox/randiter/Makefile
linbox/ring/Makefile
+linbox/ring/ntl/Makefile
+linbox/ring/modular/Makefile
linbox/solutions/Makefile
-linbox/switch/Makefile
linbox/util/Makefile
linbox/util/formats/Makefile
linbox/vector/Makefile
@@ -342,5 +318,18 @@ interfaces/kaapi/Makefile
interfaces/sage/Makefile
macros/Makefile
benchmarks/Makefile
+benchmarks/data/Makefile
+benchmarks/matrix/Makefile
+linbox.pc
])
+# linbox/algorithms/IML/Makefile
+
+# examples/Readme-make
+# examples/field
+# examples/solver
+# examples/blackbox
+# examples/data
+
AC_OUTPUT
+
+echo "-----------------------------------------------"
diff --git a/doc/Makefile.am b/doc/Makefile.am
index d56ce1d..0f50f59 100644
--- a/doc/Makefile.am
+++ b/doc/Makefile.am
@@ -39,7 +39,6 @@ docs :
if test -d linbox-html ; then echo exists; else mkdir linbox-html ; fi
if test -d linbox-dev-html ; then echo exists; else mkdir linbox-dev-html ; fi
cp index-dev.html linbox-dev-html/index.html
- cp tutorial.html linbox-html/
cp install-dist.html linbox-html/
cp install-dev.html linbox-html/
cp ../INSTALL linbox-html/
@@ -49,7 +48,6 @@ docs :
docs_dev :
make docs
- cp tutorial.html linbox-dev-html/
cp install-dist.html linbox-dev-html/
cp install-dev.html linbox-dev-html/
cp ../INSTALL linbox-dev-html/
@@ -67,7 +65,6 @@ install-doc :
EXTRA_DIST= \
linbox.html \
- tutorial.html \
install-dev.html \
index-dev.html \
install-dist.html \
@@ -76,6 +73,7 @@ EXTRA_DIST= \
doc.doxy \
mainpage.doxy \
tutorial.doxy \
+ versionning.doxy \
linbox-config.1
diff --git a/doc/Makefile.in b/doc/Makefile.in
deleted file mode 100644
index 90d5449..0000000
--- a/doc/Makefile.in
+++ /dev/null
@@ -1,611 +0,0 @@
-# Makefile.in generated by automake 1.11.5 from Makefile.am.
-# @configure_input@
-
-# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software
-# Foundation, Inc.
-# This Makefile.in is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
-# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
-# PARTICULAR PURPOSE.
-
- at SET_MAKE@
-
-# Copyright (c) 2010 the LinBox group
-#
-# ========LICENCE========
-# This file is part of the library LinBox.
-#
-# LinBox is free software: you can redistribute it and/or modify
-# it under the terms of the GNU Lesser General Public
-# License as published by the Free Software Foundation; either
-# version 2.1 of the License, or (at your option) any later version.
-#
-# This library 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
-# Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public
-# License along with this library; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
-# ========LICENCE========
-#/
-VPATH = @srcdir@
-am__make_dryrun = \
- { \
- am__dry=no; \
- case $$MAKEFLAGS in \
- *\\[\ \ ]*) \
- echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \
- | grep '^AM OK$$' >/dev/null || am__dry=yes;; \
- *) \
- for am__flg in $$MAKEFLAGS; do \
- case $$am__flg in \
- *=*|--*) ;; \
- *n*) am__dry=yes; break;; \
- esac; \
- done;; \
- esac; \
- test $$am__dry = yes; \
- }
-pkgdatadir = $(datadir)/@PACKAGE@
-pkgincludedir = $(includedir)/@PACKAGE@
-pkglibdir = $(libdir)/@PACKAGE@
-pkglibexecdir = $(libexecdir)/@PACKAGE@
-am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
-install_sh_DATA = $(install_sh) -c -m 644
-install_sh_PROGRAM = $(install_sh) -c
-install_sh_SCRIPT = $(install_sh) -c
-INSTALL_HEADER = $(INSTALL_DATA)
-transform = $(program_transform_name)
-NORMAL_INSTALL = :
-PRE_INSTALL = :
-POST_INSTALL = :
-NORMAL_UNINSTALL = :
-PRE_UNINSTALL = :
-POST_UNINSTALL = :
-build_triplet = @build@
-host_triplet = @host@
-subdir = doc
-DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in
-ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-am__aclocal_m4_deps = $(top_srcdir)/macros/aclocal-include.m4 \
- $(top_srcdir)/macros/config-header.m4 \
- $(top_srcdir)/macros/debug.m4 \
- $(top_srcdir)/macros/expat-check.m4 \
- $(top_srcdir)/macros/fflas-ffpack-check.m4 \
- $(top_srcdir)/macros/fplll-check.m4 \
- $(top_srcdir)/macros/givaro-check.m4 \
- $(top_srcdir)/macros/gmp-check.m4 \
- $(top_srcdir)/macros/iml-check.m4 \
- $(top_srcdir)/macros/lapack-check.m4 \
- $(top_srcdir)/macros/libtool.m4 \
- $(top_srcdir)/macros/lidia-check.m4 \
- $(top_srcdir)/macros/linbox-benchmark.m4 \
- $(top_srcdir)/macros/linbox-doc.m4 \
- $(top_srcdir)/macros/linbox-misc.m4 \
- $(top_srcdir)/macros/linbox-opt.m4 \
- $(top_srcdir)/macros/ltoptions.m4 \
- $(top_srcdir)/macros/ltsugar.m4 \
- $(top_srcdir)/macros/ltversion.m4 \
- $(top_srcdir)/macros/lt~obsolete.m4 \
- $(top_srcdir)/macros/m4ri-check.m4 \
- $(top_srcdir)/macros/m4rie-check.m4 \
- $(top_srcdir)/macros/maple-check.m4 \
- $(top_srcdir)/macros/mpfr-check.m4 \
- $(top_srcdir)/macros/ntl-check.m4 \
- $(top_srcdir)/macros/saclib-check.m4 \
- $(top_srcdir)/macros/sage-check.m4 $(top_srcdir)/configure.ac
-am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
- $(ACLOCAL_M4)
-mkinstalldirs = $(install_sh) -d
-CONFIG_HEADER = $(top_builddir)/config.h
-CONFIG_CLEAN_FILES =
-CONFIG_CLEAN_VPATH_FILES =
-depcomp =
-am__depfiles_maybe =
-SOURCES =
-DIST_SOURCES =
-am__can_run_installinfo = \
- case $$AM_UPDATE_INFO_DIR in \
- n|no|NO) false;; \
- *) (install-info --version) >/dev/null 2>&1;; \
- esac
-am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
-am__vpath_adj = case $$p in \
- $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
- *) f=$$p;; \
- esac;
-am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
-am__install_max = 40
-am__nobase_strip_setup = \
- srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
-am__nobase_strip = \
- for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
-am__nobase_list = $(am__nobase_strip_setup); \
- for p in $$list; do echo "$$p $$p"; done | \
- sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
- $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
- if (++n[$$2] == $(am__install_max)) \
- { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
- END { for (dir in files) print dir, files[dir] }'
-am__base_list = \
- sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
- sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
-am__uninstall_files_from_dir = { \
- test -z "$$files" \
- || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \
- || { echo " ( cd '$$dir' && rm -f" $$files ")"; \
- $(am__cd) "$$dir" && rm -f $$files; }; \
- }
-man1dir = $(mandir)/man1
-am__installdirs = "$(DESTDIR)$(man1dir)"
-NROFF = nroff
-MANS = $(man1_MANS)
-DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
-ACLOCAL = @ACLOCAL@
-AMTAR = @AMTAR@
-AR = @AR@
-AUTOCONF = @AUTOCONF@
-AUTOHEADER = @AUTOHEADER@
-AUTOMAKE = @AUTOMAKE@
-AWK = @AWK@
-BLAS_CFLAGS = @BLAS_CFLAGS@
-BLAS_LIBS = @BLAS_LIBS@
-CC = @CC@
-CCNAM = @CCNAM@
-CFLAGS = @CFLAGS@
-CPPFLAGS = @CPPFLAGS@
-CXX = @CXX@
-CXXCPP = @CXXCPP@
-CXXFLAGS = @CXXFLAGS@
-CYGPATH_W = @CYGPATH_W@
-DBG = @DBG@
-DEBUG_CFLAGS = @DEBUG_CFLAGS@
-DEFAULT_CFLAGS = @DEFAULT_CFLAGS@
-DEFS = @DEFS@
-DLLTOOL = @DLLTOOL@
-DSYMUTIL = @DSYMUTIL@
-DUMPBIN = @DUMPBIN@
-ECHO_C = @ECHO_C@
-ECHO_N = @ECHO_N@
-ECHO_T = @ECHO_T@
-EGREP = @EGREP@
-EXEEXT = @EXEEXT@
-EXPAT_CFLAGS = @EXPAT_CFLAGS@
-EXPAT_LIBS = @EXPAT_LIBS@
-FFLAS_FFPACK_CFLAGS = @FFLAS_FFPACK_CFLAGS@
-FFLAS_FFPACK_LIBS = @FFLAS_FFPACK_LIBS@
-FFLAS_FFPACK_LOC = @FFLAS_FFPACK_LOC@
-FGREP = @FGREP@
-FPLLL_CFLAGS = @FPLLL_CFLAGS@
-FPLLL_LIBS = @FPLLL_LIBS@
-GIVARO_CFLAGS = @GIVARO_CFLAGS@
-GIVARO_LIBS = @GIVARO_LIBS@
-GMP_CFLAGS = @GMP_CFLAGS@
-GMP_LIBS = @GMP_LIBS@
-GMP_VERSION = @GMP_VERSION@
-GREP = @GREP@
-IML_CFLAGS = @IML_CFLAGS@
-IML_LIBS = @IML_LIBS@
-INSTALL = @INSTALL@
-INSTALL_DATA = @INSTALL_DATA@
-INSTALL_PROGRAM = @INSTALL_PROGRAM@
-INSTALL_SCRIPT = @INSTALL_SCRIPT@
-INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
-LD = @LD@
-LDFLAGS = @LDFLAGS@
-LIBOBJS = @LIBOBJS@
-LIBS = @LIBS@
-LIBTOOL = @LIBTOOL@
-LIDIA_CFLAGS = @LIDIA_CFLAGS@
-LIDIA_LIBS = @LIDIA_LIBS@
-LINBOX_BENCH_PATH = @LINBOX_BENCH_PATH@
-LINBOX_DOC_PATH = @LINBOX_DOC_PATH@
-LIPO = @LIPO@
-LN_S = @LN_S@
-LTLIBOBJS = @LTLIBOBJS@
-M4RIE_CFLAGS = @M4RIE_CFLAGS@
-M4RIE_LIBS = @M4RIE_LIBS@
-M4RI_CFLAGS = @M4RI_CFLAGS@
-M4RI_LIBS = @M4RI_LIBS@
-MAINT = @MAINT@
-MAKEINFO = @MAKEINFO@
-MANIFEST_TOOL = @MANIFEST_TOOL@
-MAPLE_CFLAGS = @MAPLE_CFLAGS@
-MAPLE_HOME = @MAPLE_HOME@
-MAPLE_LIBS = @MAPLE_LIBS@
-MAPLE_VERSION = @MAPLE_VERSION@
-MKDIR_P = @MKDIR_P@
-MPFR_CFLAGS = @MPFR_CFLAGS@
-MPFR_LIBS = @MPFR_LIBS@
-NM = @NM@
-NMEDIT = @NMEDIT@
-NTL_CFLAGS = @NTL_CFLAGS@
-NTL_LIBS = @NTL_LIBS@
-OBJDUMP = @OBJDUMP@
-OBJEXT = @OBJEXT@
-OTOOL = @OTOOL@
-OTOOL64 = @OTOOL64@
-PACKAGE = @PACKAGE@
-PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
-PACKAGE_NAME = @PACKAGE_NAME@
-PACKAGE_STRING = @PACKAGE_STRING@
-PACKAGE_TARNAME = @PACKAGE_TARNAME@
-PACKAGE_URL = @PACKAGE_URL@
-PACKAGE_VERSION = @PACKAGE_VERSION@
-PATH_SEPARATOR = @PATH_SEPARATOR@
-PROF = @PROF@
-RANLIB = @RANLIB@
-RM = @RM@
-SACLIB_CFLAGS = @SACLIB_CFLAGS@
-SACLIB_LIBS = @SACLIB_LIBS@
-SED = @SED@
-SET_MAKE = @SET_MAKE@
-SHELL = @SHELL@
-STRIP = @STRIP@
-TESTS_CFLAGS = @TESTS_CFLAGS@
-VERSION = @VERSION@
-WARN = @WARN@
-abs_builddir = @abs_builddir@
-abs_srcdir = @abs_srcdir@
-abs_top_builddir = @abs_top_builddir@
-abs_top_srcdir = @abs_top_srcdir@
-ac_ct_AR = @ac_ct_AR@
-ac_ct_CC = @ac_ct_CC@
-ac_ct_CXX = @ac_ct_CXX@
-ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
-am__leading_dot = @am__leading_dot@
-am__tar = @am__tar@
-am__untar = @am__untar@
-bindir = @bindir@
-build = @build@
-build_alias = @build_alias@
-build_cpu = @build_cpu@
-build_os = @build_os@
-build_vendor = @build_vendor@
-builddir = @builddir@
-datadir = @datadir@
-datarootdir = @datarootdir@
-docdir = $(LINBOX_DOC_PATH)
-dvidir = @dvidir@
-exec_prefix = @exec_prefix@
-host = @host@
-host_alias = @host_alias@
-host_cpu = @host_cpu@
-host_os = @host_os@
-host_vendor = @host_vendor@
-htmldir = @htmldir@
-includedir = @includedir@
-infodir = @infodir@
-install_sh = @install_sh@
-libdir = @libdir@
-libexecdir = @libexecdir@
-localedir = @localedir@
-localstatedir = @localstatedir@
-mandir = @mandir@
-mkdir_p = @mkdir_p@
-oldincludedir = @oldincludedir@
-pdfdir = @pdfdir@
-prefix = @prefix@
-program_transform_name = @program_transform_name@
-psdir = @psdir@
-sbindir = @sbindir@
-sharedstatedir = @sharedstatedir@
-srcdir = @srcdir@
-sysconfdir = @sysconfdir@
-target_alias = @target_alias@
-top_build_prefix = @top_build_prefix@
-top_builddir = @top_builddir@
-top_srcdir = @top_srcdir@
- at LINBOX_BUILD_DOC_TRUE@USE_TARGETS = docs
- at LINBOX_BUILD_DOC_TRUE@INSTALL_TARGETS = install-doc
-man1_MANS = linbox-config.1
-EXTRA_DIST = \
- linbox.html \
- tutorial.html \
- install-dev.html \
- index-dev.html \
- install-dist.html \
- Doxyfile.mod \
- DoxyfileDev.mod \
- doc.doxy \
- mainpage.doxy \
- tutorial.doxy \
- linbox-config.1
-
-all: all-am
-
-.SUFFIXES:
-$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps)
- @for dep in $?; do \
- case '$(am__configure_deps)' in \
- *$$dep*) \
- ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
- && { if test -f $@; then exit 0; else break; fi; }; \
- exit 1;; \
- esac; \
- done; \
- echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu --ignore-deps doc/Makefile'; \
- $(am__cd) $(top_srcdir) && \
- $(AUTOMAKE) --gnu --ignore-deps doc/Makefile
-.PRECIOUS: Makefile
-Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
- @case '$?' in \
- *config.status*) \
- cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
- *) \
- echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
- cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
- esac;
-
-$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
- cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-
-$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
- cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
- cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-$(am__aclocal_m4_deps):
-
-mostlyclean-libtool:
- -rm -f *.lo
-
-clean-libtool:
- -rm -rf .libs _libs
-install-man1: $(man1_MANS)
- @$(NORMAL_INSTALL)
- @list1='$(man1_MANS)'; \
- list2=''; \
- test -n "$(man1dir)" \
- && test -n "`echo $$list1$$list2`" \
- || exit 0; \
- echo " $(MKDIR_P) '$(DESTDIR)$(man1dir)'"; \
- $(MKDIR_P) "$(DESTDIR)$(man1dir)" || exit 1; \
- { for i in $$list1; do echo "$$i"; done; \
- if test -n "$$list2"; then \
- for i in $$list2; do echo "$$i"; done \
- | sed -n '/\.1[a-z]*$$/p'; \
- fi; \
- } | while read p; do \
- if test -f $$p; then d=; else d="$(srcdir)/"; fi; \
- echo "$$d$$p"; echo "$$p"; \
- done | \
- sed -e 'n;s,.*/,,;p;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \
- -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,' | \
- sed 'N;N;s,\n, ,g' | { \
- list=; while read file base inst; do \
- if test "$$base" = "$$inst"; then list="$$list $$file"; else \
- echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man1dir)/$$inst'"; \
- $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man1dir)/$$inst" || exit $$?; \
- fi; \
- done; \
- for i in $$list; do echo "$$i"; done | $(am__base_list) | \
- while read files; do \
- test -z "$$files" || { \
- echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(man1dir)'"; \
- $(INSTALL_DATA) $$files "$(DESTDIR)$(man1dir)" || exit $$?; }; \
- done; }
-
-uninstall-man1:
- @$(NORMAL_UNINSTALL)
- @list='$(man1_MANS)'; test -n "$(man1dir)" || exit 0; \
- files=`{ for i in $$list; do echo "$$i"; done; \
- } | sed -e 's,.*/,,;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \
- -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,'`; \
- dir='$(DESTDIR)$(man1dir)'; $(am__uninstall_files_from_dir)
-tags: TAGS
-TAGS:
-
-ctags: CTAGS
-CTAGS:
-
-
-distdir: $(DISTFILES)
- @list='$(MANS)'; if test -n "$$list"; then \
- list=`for p in $$list; do \
- if test -f $$p; then d=; else d="$(srcdir)/"; fi; \
- if test -f "$$d$$p"; then echo "$$d$$p"; else :; fi; done`; \
- if test -n "$$list" && \
- grep 'ab help2man is required to generate this page' $$list >/dev/null; then \
- echo "error: found man pages containing the \`missing help2man' replacement text:" >&2; \
- grep -l 'ab help2man is required to generate this page' $$list | sed 's/^/ /' >&2; \
- echo " to fix them, install help2man, remove and regenerate the man pages;" >&2; \
- echo " typically \`make maintainer-clean' will remove them" >&2; \
- exit 1; \
- else :; fi; \
- else :; fi
- @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
- topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
- list='$(DISTFILES)'; \
- dist_files=`for file in $$list; do echo $$file; done | \
- sed -e "s|^$$srcdirstrip/||;t" \
- -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
- case $$dist_files in \
- */*) $(MKDIR_P) `echo "$$dist_files" | \
- sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
- sort -u` ;; \
- esac; \
- for file in $$dist_files; do \
- if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
- if test -d $$d/$$file; then \
- dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
- if test -d "$(distdir)/$$file"; then \
- find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
- fi; \
- if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
- cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
- find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
- fi; \
- cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
- else \
- test -f "$(distdir)/$$file" \
- || cp -p $$d/$$file "$(distdir)/$$file" \
- || exit 1; \
- fi; \
- done
-check-am: all-am
-check: check-am
-all-am: Makefile $(MANS)
-installdirs:
- for dir in "$(DESTDIR)$(man1dir)"; do \
- test -z "$$dir" || $(MKDIR_P) "$$dir"; \
- done
-install: install-am
-install-exec: install-exec-am
-install-data: install-data-am
-uninstall: uninstall-am
-
-install-am: all-am
- @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
-
-installcheck: installcheck-am
-install-strip:
- if test -z '$(STRIP)'; then \
- $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
- install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
- install; \
- else \
- $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
- install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
- "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
- fi
-mostlyclean-generic:
-
-clean-generic:
-
-distclean-generic:
- -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
- -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
-
-maintainer-clean-generic:
- @echo "This command is intended for maintainers to use"
- @echo "it deletes files that may require special tools to rebuild."
-clean: clean-am
-
-clean-am: clean-generic clean-libtool clean-local mostlyclean-am
-
-distclean: distclean-am
- -rm -f Makefile
-distclean-am: clean-am distclean-generic
-
-dvi: dvi-am
-
-dvi-am:
-
-html: html-am
-
-html-am:
-
-info: info-am
-
-info-am:
-
-install-data-am: install-man
-
-install-dvi: install-dvi-am
-
-install-dvi-am:
-
-install-exec-am:
-
-install-html: install-html-am
-
-install-html-am:
-
-install-info: install-info-am
-
-install-info-am:
-
-install-man: install-man1
-
-install-pdf: install-pdf-am
-
-install-pdf-am:
-
-install-ps: install-ps-am
-
-install-ps-am:
-
-installcheck-am:
-
-maintainer-clean: maintainer-clean-am
- -rm -f Makefile
-maintainer-clean-am: distclean-am maintainer-clean-generic
-
-mostlyclean: mostlyclean-am
-
-mostlyclean-am: mostlyclean-generic mostlyclean-libtool
-
-pdf: pdf-am
-
-pdf-am:
-
-ps: ps-am
-
-ps-am:
-
-uninstall-am: uninstall-man
-
-uninstall-man: uninstall-man1
-
-.MAKE: install-am install-strip
-
-.PHONY: all all-am check check-am clean clean-generic clean-libtool \
- clean-local distclean distclean-generic distclean-libtool \
- distdir dvi dvi-am html html-am info info-am install \
- install-am install-data install-data-am install-dvi \
- install-dvi-am install-exec install-exec-am install-html \
- install-html-am install-info install-info-am install-man \
- install-man1 install-pdf install-pdf-am install-ps \
- install-ps-am install-strip installcheck installcheck-am \
- installdirs maintainer-clean maintainer-clean-generic \
- mostlyclean mostlyclean-generic mostlyclean-libtool pdf pdf-am \
- ps ps-am uninstall uninstall-am uninstall-man uninstall-man1
-
-
-all all-local: $(USE_TARGETS)
-
-install install-data-local: $(INSTALL_TARGETS)
-
-docs :
- sed -i 's/\\version\s1.*/\\version\ $(VERSION)/' mainpage.doxy
- if test -d linbox-html ; then echo exists; else mkdir linbox-html ; fi
- if test -d linbox-dev-html ; then echo exists; else mkdir linbox-dev-html ; fi
- cp index-dev.html linbox-dev-html/index.html
- cp tutorial.html linbox-html/
- cp install-dist.html linbox-html/
- cp install-dev.html linbox-html/
- cp ../INSTALL linbox-html/
- cp ../COPYING linbox-html/
- cp ../AUTHORS linbox-html/
- doxygen Doxyfile
-
-docs_dev :
- make docs
- cp tutorial.html linbox-dev-html/
- cp install-dist.html linbox-dev-html/
- cp install-dev.html linbox-dev-html/
- cp ../INSTALL linbox-dev-html/
- cp ../COPYING linbox-dev-html/
- cp ../AUTHORS linbox-dev-html/
- doxygen DoxyfileDev
-
-install-doc :
- mkdir -p $(DESTDIR)/$(docdir)
- cp -rp linbox-html $(DESTDIR)/$(docdir)/linbox-html
- cp -rp linbox-dev-html $(DESTDIR)/$(docdir)/linbox-dev-html
- cp -p linbox.html $(DESTDIR)/$(docdir)/linbox.html
-
-clean-local :
- rm -rf linbox-html
- rm -rf linbox-dev-html
-
-# Tell versions [3.59,3.63) of GNU make to not export all variables.
-# Otherwise a system limit (for SysV at least) may be exceeded.
-.NOEXPORT:
diff --git a/doc/install-1.0.html b/doc/install-1.0.html
new file mode 100644
index 0000000..528e02c
--- /dev/null
+++ b/doc/install-1.0.html
@@ -0,0 +1,164 @@
+<!doctype html public "-//w3c//dtd html 4.0 transitional//en">
+<!-- Copyright (C) 2005 LinBox team, part of LinBox, GNU LGPL, see COPYING
+-->
+<!--
+/*
+ * Coypright (c) LinBox
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ * ========LICENCE========
+ *
+ */
+ -->
+<html>
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+ <meta name="GENERATOR" content="Mozilla/4.76 [en] (X11; U; SunOS 5.8 sun4u) [Netscape]">
+</head>
+ <body text="#000000" bgcolor="#FFFFFF" link="#0000EE" vlink="#551A8B" alink="#FF0000">
+
+ <center>
+ <p><b><font size=+2>How to install LinBox (from a distribution)</font></b></center>
+
+ <p><br>
+ <blockquote>
+ See also <a href="INSTALL">INSTALL</a>. Once the LinBox
+ distribution has been downloaded from the <a href="http://www.linalg.org/download.html"> LinBox download section</a> ,
+ </blockquote>
+
+ <blockquote>
+ <p><b>1.</b>
+ Unpack the distribution using <tt>tar</tt> command:
+ <blockquote>
+ <tt>
+ tar -xvzf linbox-X.X.X.tar.gz
+ </tt>
+ </blockquote>
+ </blockquote>
+
+ <blockquote>
+ <b>2.</b> Go to the newly-created linbox directory and
+ run the script
+ <b>configure,</b> optionally you may specify the LinBox
+ installation directory or an optional package directory using prefixes:
+ <blockquote><tt>> cd linbox</tt>
+ <br><tt>> ./configure [--prefix=<inst. dir.> --with-package=<location> --enable-feature]</tt></blockquote>
+ <a href="http://swox.com/gmp">Gmp</a> is required and its location
+ must be specified <gmp location> is not a standard location such as
+ <tt>/usr</tt> or <tt>/usr/loca</tt>l:
+ <blockquote><tt>> ./configure --with-gmp= <gmp location>
+ [...]</tt></blockquote>
+ <a href="http://math-atlas.sourceforge.net/">Atlas</a>, or other source of BLAS, is also required and its location
+ must be specified if not standard.
+ <blockquote><tt>> ./configure --with-atlas= <atlas location>
+ [...]</tt></blockquote>
+ This sets up the library and runs .<tt>/configure</tt>
+
+ <p> <b>3.</b> Optional configurations
+
+ <blockquote>
+ <b> 3.1.</b> Where to put the <tt>include/</tt> and <tt>lib/</tt> directories:
+ <blockquote><tt>--prefix= <chosen installation directory></tt>
+ <br>Ex: <tt> ./configure --prefix= `pwd` </tt>will put the files within the current
+ directory</blockquote>
+
+ <p><b> 3.2.</b> The use of an optional package is switched on by specifying the directory
+ where it can be found:
+ <blockquote>
+ --with-package=<package_directory>
+ <br>
+ <br>
+ <package_directory> can be left blank if the package is installed in a standard directory (<tt>/usr</tt> or <tt>/usr/local</tt>)
+ <br>
+ Ex: <tt> ./configure --with-givaro</tt> will enable the use of Givaro library and assume it is installed in a standard directory
+ <br>
+ <br>
+ <b>Available packages are the following:</b>
+ <br>
+ <br>
+ <table border="3" style="text-align: left; margin-left: 30pt;" cellpadding="5" cellspacing="5">
+ <tr>
+ <td> <a href="http://ljk.imag.fr/CASYS/LOGICIELS/givaro/givaro-3.1.3.tar.gz"> Givaro (v3.1.3)</a> </td>
+ <td> <tt> --with-givaro= <givaro_directory></tt> </td>
+ <td> used for finite field arithmetic.</td>
+ </tr>
+ <tr>
+ <td> <a href="http://www.informatik.tu-darmstadt.de/TI/LiDIA/"> Lidia </a></td>
+ <td> <tt> --with-lidia= <lidia_directory></tt> </td>
+ <td> used for finite field arithmetic.</td>
+ </tr>
+ <tr>
+ <td> <a href="http://shoup.net/ntl/">NTL</a></td>
+ <td> <tt> --with-ntl= <ntl_directory></tt></td>
+ <td> used for finite field, polynomial arithmetic.</td>
+ </tr>
+ <tr>
+ <td> <a href="ftp://ftp.risc.uni-linz.ac.at/pub/saclib/"> Saclib </a></td>
+ <td> <tt> --with-saclib= <saclib_directory></td>
+ <td> not yet used </td>
+ </tr>
+ <tr>
+ <td> <a href="http://www.maplesoft.com/"> Maple </a></td>
+ <td> <tt> --with-maple= <maple-directory> </tt></td>
+ <td> used to create an interface with Maple.</td>
+ </tr>
+ <tr>
+ <td> <a href="http://www.doxygen.org/"> Doxygen </a></td>
+ <td> <tt> --with-doxygen= <doxygen-path> </tt></td>
+ <td>used to create the html reference manual.</td>
+ </tr>
+ </table>
+
+ <br>
+ Note:
+ <blockquote>
+ <p> the use of <tt> --with-default= <default_directory></tt> can add a special directory to the default location of library
+ <p> the use of <tt> --with-all</tt> specifies that all packages will be used
+ </blockquote>
+ </blockquote>
+
+ <p><b> 3.3.</b> The use of special feature is switched on by calling the enable parameter:
+ <blockquote>
+ <tt> --enable-feature</tt>
+ <br>
+ Ex: <tt> ./configure --enable-shared</tt> will turn on the build of a shared library
+ <br>
+ <br>
+ <b>Available extra features are the following:</b>
+ <br>
+ <br>
+ <table border="3" style="text-align: left; margin-left: 30pt;" cellpadding="5" cellspacing="5">
+ <tr>
+ <td> <tt> --enable-optimization</tt> </td>
+ <td> turn on runtime optimization during the configuration </td>
+ </tr>
+ <tr>
+ <td> <tt> --enable-doc</tt> </td>
+ <td> turn on the build of documentation via Doxygen.</td>
+ </tr>
+ </table>
+ </blockquote>
+ </blockquote>
+ <b>4. </b>Install the library:
+ <blockquote><tt>> make install</tt></blockquote>
+ </blockquote>
+
+ <hr WIDTH="100%">
+ <div align=right><font size=-1>Copyright 1999-2005 The Linbox Group.</font></div>
+
+ </body>
+</html>
diff --git a/doc/install-dev.html b/doc/install-dev.html
index 78445e8..aecd689 100644
--- a/doc/install-dev.html
+++ b/doc/install-dev.html
@@ -34,10 +34,12 @@
<body text="#000000" bgcolor="#FFFFFF" link="#0000EE" vlink="#551A8B" alink="#FF0000">
<center>
- <p><b><font size=+2>How to install LinBox (for developers using svn)</font></b></center></p>
+ <p><b><font size=+2>How to install LinBox (for developers using git)</font></b></center></p>
<p>
-When you have retrieved your local svn snapshot, you can configure LinBox with the <b>autogen.sh</b> script.
+Retrieve givaro, fflas-ffpack, and from github.com/linbox-team.
+You can configure LinBox with the <b>autogen.sh</b> script.
+
You can use it exactly the same way <tt>./configure</tt> works (<small>execpt for the --help part... :(</small>) See <a href="install-dist.html">here</a> for additional information on configure script.
</p>
<p>
diff --git a/doc/mainpage.doxy b/doc/mainpage.doxy
index 964277d..69647d6 100644
--- a/doc/mainpage.doxy
+++ b/doc/mainpage.doxy
@@ -1,5 +1,5 @@
// Copyright (C) 2005 David Saunders, 2010 LinBox. This file is part of LinBox,
-// GNU LGPL, see COPYING for lincene information.
+// GNU LGPL, see COPYING for license information.
/*
* Coypright (c) LinBox
* ========LICENCE========
@@ -95,6 +95,11 @@
* - \subpage inst. Explains how to install from sources or from the latest svn
* version.
* - \subpage arch. Describes how %LinBox is organized
+ * \internal
+ * - \subpage upgr. Explains how to make new versions of %LinBox \endinternal
+ * .
+ *
+ * \section docu Documentation
* - <a href="../linbox-html/index.html" style="color: blue ; font-weight:
* bold"> Documentation for Users</a>. If everything around is blue, then you
* are reading the lighter, user-oriented, documentation.
@@ -114,10 +119,10 @@
* discussions).
*
* \authors Members of the \link AUTHORS %LinBox group\endlink. The most
- * prolific documenters have been first William J Turner, then Bradford
- * Hovinen, and David Saunders.
+ * prolific documenters have been William J Turner, Bradford Hovinen,
+ * David Saunders, Brice Boyer.
*
- * \version 1.3.0
+ * \version 1.4.0
*
* \par Support.
* The project is supported by the National Science Foundation
@@ -125,8 +130,9 @@
*/
/*! \page copy Copyright and Licencing
- * The copyright and licensing (GNU LGPL) info of %LinBox is in \c COPYING
- * \verbinclude "COPYING".
+ * The copyright and licensing (GNU LGPL) info of %LinBox is in \c COPYING.LESSER (and below).
+ * It gives permissions in addition to those of the GPL, see \c COPYING.
+ * \verbinclude "COPYING.LESSER".
*/
/*! \page inst Installing LinBox
diff --git a/doc/organization/Linbox.draft b/doc/organization/Linbox.draft
new file mode 100644
index 0000000..cc40512
--- /dev/null
+++ b/doc/organization/Linbox.draft
@@ -0,0 +1,60 @@
+/Linbox
+ --/doc : Describes Linbox
+ --/algorithms : requirements and implementations for algorithms
+ --/organization : documentation on the package organization
+
+ --/config : generic makefiles, configuration files
+
+ --/src : Library
+ --/library
+ --/archetypes : Linbox archetypes
+ --/Field
+ --/Blackbox
+ --/Polynomials
+
+ --/algorithms : Linbox algorithms (generic on Linbox objects)
+ --/Ring
+ --/Field
+ --/FiniteExtension : Finite fields as a polynomial domain over finite fields
+ Requires templates with field operations
+ Implements field operations
+ --/Blackbox : Requires templates with Apply
+ Implements Apply
+ --/Composition : A o B
+ --/Transposition : A^t
+ --/Sequence : Minimum polynomials
+ --/Iterator : Requires templates with Apply
+ Implements forward_iterator (u^t A^i v)
+ --/Massey : Requires templates with forward_iterator
+ Implements degree, minimun_poly
+ --/Wiedemann : Requires templates with Apply, minimum_poly
+ Implements rank, matrix minpoly
+
+ --/objects : Implements from scratch
+ --/Random
+ --/Blackbox
+ --/Field
+
+ --/wrappers : Links existing libraries
+ --/by_library : Wraps existing classes to match Linbox requirements
+ --/A Library
+ --/Rings : Implements ring operations from +,*,..
+ --/Integer : Implements integer operations from GMP, ...
+ --/Polynomials : Implements Polynomial domain from ...
+ --/Fields : Implements field operations from +,*,/,..
+ --/ZpZ : parametrized with a modulus from NTL ...
+ --/GFq : tabulated finite fields from Givaro ...
+ --/Blackbox
+ --/SparseBlackbox : Implements Apply from vector of sparse vectors
+ --/DenseBlackbox : Implements Apply from bidimensionnal arrays
+
+ --/by_scope : Links to wrappers, but organized by scope
+
+ --/tools
+ --/Commentator
+ --/SparseVector
+
+ --/examples
+ --/Gauss : Sparse gaussian elimination with reordering
+ --/Random : Random generators tests
+ --/Sequence : Wiedemann algorithm
diff --git a/doc/organization/Makefile.am b/doc/organization/Makefile.am
new file mode 100644
index 0000000..13a43c1
--- /dev/null
+++ b/doc/organization/Makefile.am
@@ -0,0 +1,24 @@
+# Copyright (c) 2010 the LinBox group
+# see COPYING for licence
+# ========LICENCE========
+# This file is part of the library LinBox.
+#
+# LinBox is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+#
+# This library 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
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+# ========LICENCE========
+
+
+
+EXTRA_DIST=\
+ Linbox.draft
diff --git a/doc/tex/Makefile.am b/doc/tex/Makefile.am
new file mode 100644
index 0000000..85ec499
--- /dev/null
+++ b/doc/tex/Makefile.am
@@ -0,0 +1,38 @@
+# Copyright (c) 2010 the LinBox group
+# ========LICENCE========
+# This file is part of the library LinBox.
+#
+# LinBox is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+#
+# This library 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
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+# ========LICENCE========
+
+
+
+if USE_DOCPLUSPLUS_TEX
+USE_TARGETS = linbox.tex linbox.ps linbox.dvi
+endif
+
+CLEANFILES = linbox.tex linbox.ps
+MOSTLYCLEANFILES = linbox.aux linbox.log linbox.dvi
+
+all-local: $(USE_TARGETS)
+
+linbox.ps: linbox.dvi
+ dvips linbox.dvi -o linbox.ps
+
+linbox.dvi: linbox.tex
+ latex "\scrollmode\input linbox"; exit 0
+
+linbox.tex: $(top_srcdir)/linbox/linbox.dxx
+ doc++ -t -o linbox.tex $(top_srcdir)/linbox/linbox.dxx
diff --git a/doc/tutorial.doxy b/doc/tutorial.doxy
index 8871876..22e8d6e 100644
--- a/doc/tutorial.doxy
+++ b/doc/tutorial.doxy
@@ -134,7 +134,7 @@ your specific field.
#include <linbox/field/modular.h>
-typedef Modular<short> Field;
+typedef Givaro::Modular<short> Field;
Field F(101);
\endcode
@@ -145,7 +145,7 @@ href="http://shoup.net/ntl/" target="_blank">NTL</a>'s \c NTL::ZZ_p class. The
LinBox wrapper of that, called \p LinBox::NTL_ZZ_p is found in \c
field/ntl-ZZ_p.h. Or use a <a
href="http://ljk.imag.fr/CASYS/LOGICIELS/givaro/" target="_blank">Givaro</a>
-table based representation, \c LinBox::GivaroGfq in \c field/givaro-gfq.h
+table based representation, \c LinBox::Givaro::GFq in \c field/givaro-gfq.h
...and there are many other options. The program \c tests/test-fields.C will
provide some timing data on the basic functions of each representation. In
%LinBox, a \p Field class and the class representing the field entries are
@@ -173,7 +173,7 @@ good representation choice if a blackbox algorithm is to be used. For a
space and time. On the other hand, if elimination is to be used, those will
not serve at all, but \c LinBox::SparseMatrix, which allows internal
modification, will do the trick. The ordinary matrix representation is
-\c LinBox::DenseMatrix. If your matrix structure allows you to compute
+\c LinBox::BlasMatrix. If your matrix structure allows you to compute
matrix-vector products in a way faster than these classes provide, you can gain
by defining your own matrix class adhering to the \ref blackbox interface. The main
components of the blackbox interface are member functions \c apply() and
@@ -203,21 +203,25 @@ for ( ... )
Putting it all together, we may have a program looking like this.
\code
#include <linbox/field/modular.h>
-#include <linbox/blackbox/dense.h>
+#include <linbox/matrix/blas-matrix.h>
#include <linbox/solutions/det.h>
+#include <linbox/util/matrix-stream.h>
using namespace LinBox;
main()
{
- typedef Modular<double> Field;
- typedef DenseMatrix<Field> Matrix;
+ typedef Givaro::Modular<double> Field;
+ typedef BlasMatrix<Field> Matrix;
Field F(65521);
- Matrix A; A.read("datafile");
+ MatrixStream<Field> ms(F, std::cin);
+ Matrix A(ms);
Field::Element d;
- det(d, A, blasElimination);
- F.write(cout << "the determinant is ", d) << endl;
+ Method::BlasElimination M;
+ det(d, A, M);
+ F.write(std::cout << "the determinant is ", d) << std::endl;
}
+
\endcode
This tutorial should continue with a discussion of compilation issues, but it
diff --git a/doc/tutorial.html b/doc/tutorial.html
deleted file mode 100644
index 054fafd..0000000
--- a/doc/tutorial.html
+++ /dev/null
@@ -1,207 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<!-- Copyright (C) 2005 David Saunders, part of LinBox, GNU LGPL, see COPYING -->
-<!--
-/*
- * Coypright (c) LinBox
- * ========LICENCE========
- * This file is part of the library LinBox.
- *
- * LinBox is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- * ========LICENCE========
- *
- */
- -->
-<title>linbox: LinBox Tutorial</title>
-<link href="doxygen.css" rel="stylesheet" type="text/css">
-</head><body>
-<h1><a class="el" href="namespace_lin_box.html">LinBox</a> Tutorial</h1>
-
-
-The person requiring some exact linear algebra computation may exploit linbox at
-any of four general levels.
-In order from least involved with the details to most involved, they are:
-
-<ol>
-<li>
-Access using a linbox web server.
-<p>
-The user at this level must attend to preparation of a matrix in
-a suitable file format and invoking the webservice. The server itself should provide adequate
-documentation for this.
-Servers are generally available at <a href="linalg.org">linalg.org</a>.
-
-<li>
-Access using compiled codes. Full programs exist in the examples directory and
-can be used through an interface to linbox
-in a general purposes system such as Maple or SAGE.
-<p>
-The user at this level must see to installation, and then attend to preparation of her
-matrix in a suitable file format and to the form of the program or procedure invocation.
-A number of programs are available in the examples directory distributed with LinBox
-providing for rank, determinant, linear system solution, etc. The documentation of the
-examples module should serve for this level of access.
-<!-- what about interfaces maple and gap - can they be documented now? -->
-
-<li>
-Use of LinBox as a programmers library for exact linear algebra functions.
-<p>
-At this level a user must do at least the following:
-<ol type="a">
-<li>
-Choose a field or ring representation and construct a specific field or ring object R.
-<li>
-Choose a blackbox or matrix representation suitable to your data and construct
-specific matrix A over R.
-<li>
-Call needed algorithm. The solutions directory is designed to support this by
-providing functions with simple problem oriented interfaces (<tt>rank(), det(), solve()</tt>), yet
-allowing some user control of algorithm details. The programmer may be providing some of the
-parts such as an application specific blackbox matrix class.
-</ol>
-
-<p>
-<li>
-Power development.
-<p>
-Again, this is use of LinBox as a library, but with hands fully on the details.
-The programmer
-at this level apparently needs the best opportunities for high performance and is
-willing to use the more complicated internal interfaces to get it. Direct calls to functions
-in the algorithms directory and perhaps to related packages such as
-fflas, ffpac, or other components are being used.
-The programmer working at this level of intimacy with LinBox is likely to develop some
-components that ought to be included in future releases of LinBox. Such contributions
-are warmly welcomed.
-The online documentation system is intended primarily for the programmer at level 3.
-Thus documentation is not generated to the last internal detail.
-It is supposed that the the level 4 (and 3) programmer, when studying internal details,
-will be best served by reading the code.
-It is possible, if you wish, to set doxygen parameters so as to
-have a documentation listing for every class and function.
-Good luck separating wheat from chaff in that case.
-</ul>
-
-<p>
-In this tutorial we will discuss a simple application at level 3, the design of a
-program to compute the determinant of a sparse matrix over GF(101). The programmer
-has 3 major issues: field, matrix, algorithm.
-
-The basic algorithm choice is between blackbox and elimination algorithms.
-If our matrix is A, then the algorithm call may look like
-<pre>
-determinant(det, A, Method::Blackbox());
-//or
-determinant(det, A, Method::Elimination());
-</pre>
-To have access to this determinant function, <tt>#include <linbox/solutions/determinant.h></tt>.
-
-The larger and
-sparser the matrix the more likely that the blackbox algorithm is fastest. Hybrids are
-under development to help make this choice, and even to make it at run time adaptively.
-The last argument to the solutions functions is a method object which specifies
-the algorithm to be used. In each case there is a default, so this argument is optional.
-Also, some method objects may be constructed so as to convey more detail about the algorithm to use.
-For example it may help to promise that the matrix is nonsingular or symmetric or to request
-a particular algorithm variant. The blackbox algorithm based fundamentally on
-Wiedemann's approach is specified by <tt>Method::Wiedemann</tt>, see <tt>linbox/solutions/methods.h</tt> for more details. Specification
-of a blocked blackbox algorithm may be advantageous (in the future).
-Elimination is likely fastest if the matrix is not extremely sparse or not large or
-not subject to rapid fill-in.
-<p>
-Of course, first we must construct the matrix and field.
-For the field, you must first choose the class (representation type) of field and then
-instantiate your specific field.
-
-<pre>
-#include <linbox/field/modular.h>
-
-typedef Modular<short> Field;
-Field F(101);
-</pre>
-It is a good idea to use a typedef, making it easy to change representations later.
-The <em>Modular</em> field representations are LinBox's own and contain some useful
-optimizations. Another possibility is use of NTL's zz_p class. The linbox wrapper of
-that, called NTL_zz_p is found in <tt>linbox/field/NTL-zz_p.h</tt>. Or use
-a Givaro table based representation, <tt>GivaroGFq</tt> in <tt>linbox/field/givaro-gfq.h</tt>.
-...and there are many other options. The program <tt>tests/test-fields.C</tt> will provide some
-timing data on the basic functions of each representation.
-In linbox, a Field class and the class representing the field entries are distinct types. The
-field object owns the arithmetic operations, whereas the entry objects may be of a primitive
-type such as short, int, double. Each field class Fld has the embedded class Fld::Element for
-it's elements.
-<pre>
-Field::Element a, b, c;
-F.init(a, 2); F.init(b, 3);
-F.mul(c, a, b); // c <- a*b
-F.write(cout, c);
-</pre>
-
-<!-- put here a diatribe on field and element representations -->
-
-You have seen that the field representations are in subdirectory <tt>linbox/field</tt>. Similarly
-the matrix representations are in <tt>linbox/blackbox</tt>.
-All of these are are suitable for blackbox algorithms. Only those deriving from
-representations in <tt>linbox/matrix</tt> are suitable for elimination.
-For a sparse matrix, <tt>TriplesBB</tt> is a good representation choice if a blackbox algorithm
-is to be used. For a {0,1}-incidence matrix, the class <tt>ZeroOne</tt> will be more economical
-of space and time. On the other hand, if elimination is to be used, those will not serve at
-all,
-but <tt>SparseMatrix</tt>, which allows internal modification, will do the trick.
-The ordinary matrix representation is <tt>DenseMatrix</tt>.
-If your matrix structure allows you to compute matrix-vector products in a way faster than
-these classes provide, you can gain by defining your own matrix class adhering to the
-blackbox interface. The main components of the blackbox interface are member functions <tt>apply()</tt> and <tt>applyTranspose()</tt>
-functions. <tt>A.apply(y, x)</tt> performs y leftarrow Ax.
-
-Then there is the question of initializing matrix
-entries. Two basic approaches are illustrated here.
-<pre>
-TriplesBB A;
-A.read("triples-file"); // initialize A from data in file (including shape).
-</pre>
-Or a program can add entries to a sparse or dense matrix one by one using the <tt>setEntry</tt>
-function.
-<pre>
-SparseMatrix B(100, 200); // 100 by 200 zero matrix (so far).
-for ( ... )
-{
- Field::Element v;
- F.init(v, ...);
- B.setEntry(i, j, v); // put nonzerp v in i,j position.
-}
-</pre>
-
-Putting it all together, we may have a program looking like this.
-<pre>
-#include <linbox/field/modular.h>
-#include <linbox/blackbox/dense.h>
-#include <linbox/solutions/determinant.h>
-using namespace LinBox;
-
-main(){
-typedef Modular<double> Field;
-typedef DenseMatrix<Field> Matrix;
-Field F(65521);
-Matrix A; A.read("datafile");
-Field::Element det;
-determinant(det, A, blasElimination);
-F.write(cout << "the determinant is ", det) << endl;
-}
-</pre>
-
-This tutorial should continue with a discussion of compilation issues, but it
-doesn't. Something useful may be learned from examining the Makefile.am in the examples directory.
-</body></html>
diff --git a/doc/versionning.doxy b/doc/versionning.doxy
new file mode 100644
index 0000000..f53d4fe
--- /dev/null
+++ b/doc/versionning.doxy
@@ -0,0 +1,141 @@
+// Copyright (C) 2013 the LinBox Group
+// Written by Brice Boyer (briceboyer) <boyer.brice at gmail.com>
+// This file is part of LinBox, see COPYING for licence information.
+/*
+ * Coypright (c) LinBox
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ * ========LICENCE========
+ *
+ */
+
+/*!
+* \page upgr Updating/Versionning
+* <h3>Creating a new version number for LinBox/Givaro/fflas-ffpack:</h3>
+*
+* These software are versioned as \c projectname-x.y.z where \c x is a \b major revision
+* number, \c y a \b minor number and \c z a \b revision (or bug) number.
+* The script \c incremente-version — in the root directory of these project
+* sources — takes care of incrementing these numbers (along with the library
+* so-names if necessary).
+*
+*<ul>
+* <li> \b Revision number. <br/>
+* Minor changes are changes that do not change any API and do not provoke
+* any miscompilation in LinBox. As a consequence, for instance, any release
+* \c 1.3.z of LinBox should compile with any givaro \c 3.7.z and any
+* fflas-ffpack \c 1.6.z. <br/>
+* This correspondance should be published on the website. It is however always put in
+* the \c auto-install.sh script.
+* </li>
+*
+* <li> \b Minor number. <br/>
+* Any change in these numbers in givaro or fflas-ffpack produces a minor
+* version change in LinBox. A minor version number changed is required when there
+* is some API change in fflas-ffpack or givaro or linbox or anything leading to
+* a failure to compile properly due to newly added inconsistencies.
+* </li>
+*
+* <li> \b Major number. <br/>
+* These number are incremented when big change happens. Only the minor number
+* of LinBox is needed to change when a major increment happens in
+* givaro/fflas-ffpack.
+* </li>
+*</ul>
+*
+* <h3> Publishing </h3>
+* Before publishing a new version :
+* <ul>
+* <li> \b Testing
+* - The buildbots should be green and the script \c auto-install.sh should
+* succeed and the tests/example pass/compile. <small>(It would be cool if more
+* compilers were tested, namely clang and ekopath).</small>
+* - The number of warnings when compiled with \c --enable-warnings=full should
+* also be minimised.
+* - The number of warnings when compiling the doc should be minimised (and new
+* functionalities/concepts documented).
+* .
+* </li>
+*
+* <li> \b Incrementing
+* - on an up-to-date svn source, run the script \c incremente-version, follow
+* its instruction and confirm.
+* - commit these changes as in: \code svn commit -m "updated to projectname-x.y.z"\endcode
+* so that it is easier to spot the changes in the ChangeLog when publishing it.
+* </li>
+*
+* <li> \b Branching <br/>
+* Once the incrementing has been done, if the minor or major number
+* has been changed, then a new branch should be created in the svn repository
+* using \code svn copy /path/to/trunk /path/to/branch/project-x.y \endcode
+* This is done in order to allow maintainance and support, eg. new patches from
+* distributions and easy support of a \c x.y major.minor version (for sage for
+* instance).
+* </li>
+*
+* <li> \b Publishing <br/>
+* A release comes with a tar ball \c tar.gz, a \c md5sum of it and a summary \c ChangeLog.
+*
+* <ul>
+* <li> LinBox and fflas-ffpack
+* - a \c tar.gz and a \c md5sum is created in the \c www directory
+* - the corresponding web pages are updated
+* - The changes form the ChangeLog should be
+* put in \c NEWS-a.b.html (even for revision versions) for LinBox and \c fflas-ffpack-Changelog-x.y.z for
+* fflas-ffpack.
+* </li>
+*
+* <li> Givaro<br/>
+* - a \c tar.gz and a \c md5sum is created and uploaded to the
+* <a href="https://forge.imag.fr/frs/?group_id=187">forge</a> where
+* one can also put the ChangeLog in a form.
+* </li>
+*
+* <li>\c auto-install.sh script<br/>
+* - the auto-installation script (first 4 lines) should be updated
+* accordingly. They should correspond to the latest stable/desired version number for
+* givaro/fflas-ffpack.
+* </li>
+* <li> ChangeLogs <br/>
+* It would be nice if the <code>ChangeLog</code>s looked something like (the
+* users cannot/won't view the <code>svn log</code>):
+*
+* \verbatim
+Date
+- code update :
+ * item
+
+- bugs :
+ * item
+
+- new features :
+ * item
+
+ \endverbatim
+*
+* </li>
+* </ul>
+* </li>
+* <li> \b Documentation <br/>
+* If a minor revision change happens, there should be an automatic way to update the doxygen documentation.
+* </li>
+* </ul>
+*.
+*
+*/
+
+// vim:syntax=doxygen
diff --git a/examples/Makefile.am b/examples/Makefile.am
index ef35f50..11b459d 100644
--- a/examples/Makefile.am
+++ b/examples/Makefile.am
@@ -19,42 +19,35 @@
# ========LICENCE========
#/
-#INCLUDES=-I$(top_srcdir)
-AM_CPPFLAGS=-I$(top_srcdir) -I$(top_srcdir)/linbox
-
-#if LinBoxSrcOnly
-#AM_CPPFLAGS=-g -DLinBoxSrcOnly $(GMP_CFLAGS) $(NTL_CFLAGS) $(GIVARO_CFLAGS) $(LIDIA_CFLAGS)
-#LINBOX_LIBS=
-#else
-#AM_CPPFLAGS=-g $(GMP_CFLAGS) $(NTL_CFLAGS) $(GIVARO_CFLAGS) $(LIDIA_CFLAGS)
-#LINBOX_LIBS= $(top_builddir)/linbox/liblinbox.la
-#endif
-
-# SAFER_FLAGS=--std=c++98 -g -Wall -Wextra -Wno-ignored-qualifiers -Wno-unused-parameter
-# SAFER_FLAGS=-g -Wall -Wextra -Wno-unused-parameter
-
-# AM_CXXFLAGS = $(SAFER_FLAGS) -DLinBoxSrcOnly -DDEBUG -O0
-AM_CXXFLAGS = @DEFAULT_CFLAGS@ -DLinBoxSrcOnly -DDISABLE_COMMENTATOR
-AM_CPPFLAGS += $(GMP_CFLAGS) $(NTL_CFLAGS) $(FFLAS_FFPACK_CFLAGS) $(GIVARO_CFLAGS) $(LIDIA_CFLAGS) $(IML_CFLAGS)
-#LDADD = $(NTL_LIBS) $(GIVARO_LIBS) $(LIDIA_LIBS) $(BLAS_LIBS) $(GMP_LIBS) "-Wl,-enable-auto-import"
-LDADD = $(NTL_LIBS) $(GIVARO_LIBS) $(LIDIA_LIBS) $(BLAS_LIBS) $(GMP_LIBS) $(MPFR_LIBS) $(FPLLL_LIBS) $(LDFLAGS) $(IML_LIBS)
+# DEFAULT_INCLUDES=-I at includedir@
+
+# -DLinBoxSrcOnly
+DEFCPPFLAGS = @DEFAULT_CFLAGS@ -DDISABLE_COMMENTATOR
+AM_CPPFLAGS = -I$(top_srcdir)/linbox $(DEFCPPFLAGS) $(DEPS_CFLAGS)
+LDADD = $(DEPS_LIBS) $(LDFLAGS)
+LDADD += $(top_builddir)/linbox/liblinbox.la
# AM_LDFLAGS=-static
-AM_LDFLAGS = $(top_srcdir)/linbox/.libs/liblinbox.a
+
+#AM_LDFLAGS=-L at libdir@ -llinbox
+
+# if LINBOX_HAVE_OCL
+# AM_CPPFLAGS += $(OCL_CFLAGS)
+# LDADD += $(OCL_LIBS)
+# endif
-#EX_LDADD = $(NTL_LIBS) $(GMP_LIBS) $(GIVARO_LIBS) $(LIDIA_LIBS) $(BLAS_LIBS)
+
+#EX_LDADD = $(NTL_LIBS)
#LDADD = $(LINBOX_LIBS) $(EX_LDADD)
-SUBDIRS=fields
+# SUBDIRS=fields solver data blackbox
-EXAMPLES=rank det minpoly valence solve dot-product echelon sparseelimdet sparseelimrank checksolve doubledet smithvalence
-# EXAMPLES+=nulp yabla
-GIVARONTL_EXAMPLES=smith charpoly graph-charpoly
+EXAMPLES=rank det minpoly valence solve dot-product echelon sparseelimdet sparseelimrank checksolve doubledet smithvalence charpoly polysmith benchfft benchmatpolymult
+# EXAMPLES+=nulp yabla
+GIVARONTL_EXAMPLES=smith graph-charpoly
if LINBOX_HAVE_NTL
-if LINBOX_HAVE_GIVARO
USE_GIVARONTL_EXAMPLES = $(GIVARONTL_EXAMPLES)
endif
-endif
EXTRA_PROGRAMS= $(EXAMPLES) $(USE_GIVARONTL_EXAMPLES)
@@ -62,8 +55,9 @@ EXTRA_PROGRAMS= $(EXAMPLES) $(USE_GIVARONTL_EXAMPLES)
CLEANFILES=$(EXTRA_PROGRAMS)
EXTRA_DIST = examples.doxy smithvalence.h
+#map-sparse.h map-sparse.inl
-examples: ${EXTRA_PROGRAMS}
+examples: ${EXTRA_PROGRAMS}
dot_product_SOURCES = dot-product.C
doubledet_SOURCES = doubledet.C
@@ -82,16 +76,19 @@ echelon_SOURCES = echelon.C
smithvalence_SOURCES = smithvalence.C
sparseelimdet_SOURCES = sparseelimdet.C
sparseelimrank_SOURCES = sparseelimrank.C
+polysmith_SOURCES = poly-smith.C
+benchfft_SOURCES = bench-fft.C
+benchmatpolymult_SOURCES = bench-matpoly-mult.C
LINBOX=@prefix@
-# no /bin if LinBox is uncompiled
-#LINBOX_BIN=$(LINBOX)/bin
LINBOX_BIN=@bindir@
# for compilation of new examples
+new_examp_comp = $(CXX) -I at includedir@ $(CXXFLAGS) $(AM_CPPFLAGS) $(OPTFLAGS) ${INCLUDES} $< -o $@ -L at libdir@ -llinbox $(AM_LDFLAGS) $(LDADD) $(LIBS)
+
%:%.C
- $(CXX) $(CXXFLAGS) $(AM_CXXFLAGS) $(OPTFLAGS) ${INCLUDES} $(AM_CPPFLAGS) $*.C -o $@ $(AM_LDFLAGS) $(LDADD)
+ $(new_examp_comp)
%:%.cpp
- $(CXX) $(CXXFLAGS) $(AM_CXXFLAGS) $(OPTFLAGS) ${INCLUDES} $(AM_CPPFLAGS) $*.cpp -o $@ $(AM_LDFLAGS) $(LDADD)
+ $(new_examp_comp)
diff --git a/examples/Makefile.in b/examples/Makefile.in
deleted file mode 100644
index 9ef7fc0..0000000
--- a/examples/Makefile.in
+++ /dev/null
@@ -1,948 +0,0 @@
-# Makefile.in generated by automake 1.11.5 from Makefile.am.
-# @configure_input@
-
-# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software
-# Foundation, Inc.
-# This Makefile.in is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
-# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
-# PARTICULAR PURPOSE.
-
- at SET_MAKE@
-
-# Copyright (c) 2010 the LinBox group
-# This file is part of LinBox
-# ========LICENCE========
-# This file is part of the library LinBox.
-#
-# LinBox is free software: you can redistribute it and/or modify
-# it under the terms of the GNU Lesser General Public
-# License as published by the Free Software Foundation; either
-# version 2.1 of the License, or (at your option) any later version.
-#
-# This library 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
-# Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public
-# License along with this library; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
-# ========LICENCE========
-#/
-VPATH = @srcdir@
-am__make_dryrun = \
- { \
- am__dry=no; \
- case $$MAKEFLAGS in \
- *\\[\ \ ]*) \
- echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \
- | grep '^AM OK$$' >/dev/null || am__dry=yes;; \
- *) \
- for am__flg in $$MAKEFLAGS; do \
- case $$am__flg in \
- *=*|--*) ;; \
- *n*) am__dry=yes; break;; \
- esac; \
- done;; \
- esac; \
- test $$am__dry = yes; \
- }
-pkgdatadir = $(datadir)/@PACKAGE@
-pkgincludedir = $(includedir)/@PACKAGE@
-pkglibdir = $(libdir)/@PACKAGE@
-pkglibexecdir = $(libexecdir)/@PACKAGE@
-am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
-install_sh_DATA = $(install_sh) -c -m 644
-install_sh_PROGRAM = $(install_sh) -c
-install_sh_SCRIPT = $(install_sh) -c
-INSTALL_HEADER = $(INSTALL_DATA)
-transform = $(program_transform_name)
-NORMAL_INSTALL = :
-PRE_INSTALL = :
-POST_INSTALL = :
-NORMAL_UNINSTALL = :
-PRE_UNINSTALL = :
-POST_UNINSTALL = :
-build_triplet = @build@
-host_triplet = @host@
-EXTRA_PROGRAMS = $(am__EXEEXT_1) $(am__EXEEXT_3)
-subdir = examples
-DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \
- $(srcdir)/Readme-make.in
-ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-am__aclocal_m4_deps = $(top_srcdir)/macros/aclocal-include.m4 \
- $(top_srcdir)/macros/config-header.m4 \
- $(top_srcdir)/macros/debug.m4 \
- $(top_srcdir)/macros/expat-check.m4 \
- $(top_srcdir)/macros/fflas-ffpack-check.m4 \
- $(top_srcdir)/macros/fplll-check.m4 \
- $(top_srcdir)/macros/givaro-check.m4 \
- $(top_srcdir)/macros/gmp-check.m4 \
- $(top_srcdir)/macros/iml-check.m4 \
- $(top_srcdir)/macros/lapack-check.m4 \
- $(top_srcdir)/macros/libtool.m4 \
- $(top_srcdir)/macros/lidia-check.m4 \
- $(top_srcdir)/macros/linbox-benchmark.m4 \
- $(top_srcdir)/macros/linbox-doc.m4 \
- $(top_srcdir)/macros/linbox-misc.m4 \
- $(top_srcdir)/macros/linbox-opt.m4 \
- $(top_srcdir)/macros/ltoptions.m4 \
- $(top_srcdir)/macros/ltsugar.m4 \
- $(top_srcdir)/macros/ltversion.m4 \
- $(top_srcdir)/macros/lt~obsolete.m4 \
- $(top_srcdir)/macros/m4ri-check.m4 \
- $(top_srcdir)/macros/m4rie-check.m4 \
- $(top_srcdir)/macros/maple-check.m4 \
- $(top_srcdir)/macros/mpfr-check.m4 \
- $(top_srcdir)/macros/ntl-check.m4 \
- $(top_srcdir)/macros/saclib-check.m4 \
- $(top_srcdir)/macros/sage-check.m4 $(top_srcdir)/configure.ac
-am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
- $(ACLOCAL_M4)
-mkinstalldirs = $(install_sh) -d
-CONFIG_HEADER = $(top_builddir)/config.h
-CONFIG_CLEAN_FILES = Readme-make
-CONFIG_CLEAN_VPATH_FILES =
-am__EXEEXT_1 = rank$(EXEEXT) det$(EXEEXT) minpoly$(EXEEXT) \
- valence$(EXEEXT) solve$(EXEEXT) dot-product$(EXEEXT) \
- echelon$(EXEEXT) sparseelimdet$(EXEEXT) \
- sparseelimrank$(EXEEXT) checksolve$(EXEEXT) doubledet$(EXEEXT) \
- smithvalence$(EXEEXT)
-am__EXEEXT_2 = smith$(EXEEXT) charpoly$(EXEEXT) \
- graph-charpoly$(EXEEXT)
- at LINBOX_HAVE_GIVARO_TRUE@@LINBOX_HAVE_NTL_TRUE at am__EXEEXT_3 = $(am__EXEEXT_2)
-am_charpoly_OBJECTS = charpoly.$(OBJEXT)
-charpoly_OBJECTS = $(am_charpoly_OBJECTS)
-charpoly_LDADD = $(LDADD)
-am__DEPENDENCIES_1 =
-charpoly_DEPENDENCIES = $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1)
-am_checksolve_OBJECTS = checksolve.$(OBJEXT)
-checksolve_OBJECTS = $(am_checksolve_OBJECTS)
-checksolve_LDADD = $(LDADD)
-checksolve_DEPENDENCIES = $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1)
-am_det_OBJECTS = det.$(OBJEXT)
-det_OBJECTS = $(am_det_OBJECTS)
-det_LDADD = $(LDADD)
-det_DEPENDENCIES = $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1)
-am_dot_product_OBJECTS = dot-product.$(OBJEXT)
-dot_product_OBJECTS = $(am_dot_product_OBJECTS)
-dot_product_LDADD = $(LDADD)
-dot_product_DEPENDENCIES = $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1)
-am_doubledet_OBJECTS = doubledet.$(OBJEXT)
-doubledet_OBJECTS = $(am_doubledet_OBJECTS)
-doubledet_LDADD = $(LDADD)
-doubledet_DEPENDENCIES = $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1)
-am_echelon_OBJECTS = echelon.$(OBJEXT)
-echelon_OBJECTS = $(am_echelon_OBJECTS)
-echelon_LDADD = $(LDADD)
-echelon_DEPENDENCIES = $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1)
-am_graph_charpoly_OBJECTS = graph-charpoly.$(OBJEXT)
-graph_charpoly_OBJECTS = $(am_graph_charpoly_OBJECTS)
-graph_charpoly_LDADD = $(LDADD)
-graph_charpoly_DEPENDENCIES = $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1)
-am_minpoly_OBJECTS = minpoly.$(OBJEXT)
-minpoly_OBJECTS = $(am_minpoly_OBJECTS)
-minpoly_LDADD = $(LDADD)
-minpoly_DEPENDENCIES = $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1)
-am_rank_OBJECTS = rank.$(OBJEXT)
-rank_OBJECTS = $(am_rank_OBJECTS)
-rank_LDADD = $(LDADD)
-rank_DEPENDENCIES = $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1)
-am_smith_OBJECTS = smith.$(OBJEXT)
-smith_OBJECTS = $(am_smith_OBJECTS)
-smith_LDADD = $(LDADD)
-smith_DEPENDENCIES = $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1)
-am_smithvalence_OBJECTS = smithvalence.$(OBJEXT)
-smithvalence_OBJECTS = $(am_smithvalence_OBJECTS)
-smithvalence_LDADD = $(LDADD)
-smithvalence_DEPENDENCIES = $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1)
-am_solve_OBJECTS = solve.$(OBJEXT)
-solve_OBJECTS = $(am_solve_OBJECTS)
-solve_LDADD = $(LDADD)
-solve_DEPENDENCIES = $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1)
-am_sparseelimdet_OBJECTS = sparseelimdet.$(OBJEXT)
-sparseelimdet_OBJECTS = $(am_sparseelimdet_OBJECTS)
-sparseelimdet_LDADD = $(LDADD)
-sparseelimdet_DEPENDENCIES = $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1)
-am_sparseelimrank_OBJECTS = sparseelimrank.$(OBJEXT)
-sparseelimrank_OBJECTS = $(am_sparseelimrank_OBJECTS)
-sparseelimrank_LDADD = $(LDADD)
-sparseelimrank_DEPENDENCIES = $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1)
-am_valence_OBJECTS = valence.$(OBJEXT)
-valence_OBJECTS = $(am_valence_OBJECTS)
-valence_LDADD = $(LDADD)
-valence_DEPENDENCIES = $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1)
-DEFAULT_INCLUDES = -I. at am__isrc@ -I$(top_builddir)
-depcomp =
-am__depfiles_maybe =
-CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
- $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
-LTCXXCOMPILE = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
- --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
- $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
-CXXLD = $(CXX)
-CXXLINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
- --mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \
- $(LDFLAGS) -o $@
-SOURCES = $(charpoly_SOURCES) $(checksolve_SOURCES) $(det_SOURCES) \
- $(dot_product_SOURCES) $(doubledet_SOURCES) $(echelon_SOURCES) \
- $(graph_charpoly_SOURCES) $(minpoly_SOURCES) $(rank_SOURCES) \
- $(smith_SOURCES) $(smithvalence_SOURCES) $(solve_SOURCES) \
- $(sparseelimdet_SOURCES) $(sparseelimrank_SOURCES) \
- $(valence_SOURCES)
-DIST_SOURCES = $(charpoly_SOURCES) $(checksolve_SOURCES) \
- $(det_SOURCES) $(dot_product_SOURCES) $(doubledet_SOURCES) \
- $(echelon_SOURCES) $(graph_charpoly_SOURCES) \
- $(minpoly_SOURCES) $(rank_SOURCES) $(smith_SOURCES) \
- $(smithvalence_SOURCES) $(solve_SOURCES) \
- $(sparseelimdet_SOURCES) $(sparseelimrank_SOURCES) \
- $(valence_SOURCES)
-RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \
- html-recursive info-recursive install-data-recursive \
- install-dvi-recursive install-exec-recursive \
- install-html-recursive install-info-recursive \
- install-pdf-recursive install-ps-recursive install-recursive \
- installcheck-recursive installdirs-recursive pdf-recursive \
- ps-recursive uninstall-recursive
-am__can_run_installinfo = \
- case $$AM_UPDATE_INFO_DIR in \
- n|no|NO) false;; \
- *) (install-info --version) >/dev/null 2>&1;; \
- esac
-RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \
- distclean-recursive maintainer-clean-recursive
-AM_RECURSIVE_TARGETS = $(RECURSIVE_TARGETS:-recursive=) \
- $(RECURSIVE_CLEAN_TARGETS:-recursive=) tags TAGS ctags CTAGS \
- distdir
-ETAGS = etags
-CTAGS = ctags
-DIST_SUBDIRS = $(SUBDIRS)
-DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
-am__relativize = \
- dir0=`pwd`; \
- sed_first='s,^\([^/]*\)/.*$$,\1,'; \
- sed_rest='s,^[^/]*/*,,'; \
- sed_last='s,^.*/\([^/]*\)$$,\1,'; \
- sed_butlast='s,/*[^/]*$$,,'; \
- while test -n "$$dir1"; do \
- first=`echo "$$dir1" | sed -e "$$sed_first"`; \
- if test "$$first" != "."; then \
- if test "$$first" = ".."; then \
- dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \
- dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \
- else \
- first2=`echo "$$dir2" | sed -e "$$sed_first"`; \
- if test "$$first2" = "$$first"; then \
- dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \
- else \
- dir2="../$$dir2"; \
- fi; \
- dir0="$$dir0"/"$$first"; \
- fi; \
- fi; \
- dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \
- done; \
- reldir="$$dir2"
-ACLOCAL = @ACLOCAL@
-AMTAR = @AMTAR@
-AR = @AR@
-AUTOCONF = @AUTOCONF@
-AUTOHEADER = @AUTOHEADER@
-AUTOMAKE = @AUTOMAKE@
-AWK = @AWK@
-BLAS_CFLAGS = @BLAS_CFLAGS@
-BLAS_LIBS = @BLAS_LIBS@
-CC = @CC@
-CCNAM = @CCNAM@
-CFLAGS = @CFLAGS@
-CPPFLAGS = @CPPFLAGS@
-CXX = @CXX@
-CXXCPP = @CXXCPP@
-CXXFLAGS = @CXXFLAGS@
-CYGPATH_W = @CYGPATH_W@
-DBG = @DBG@
-DEBUG_CFLAGS = @DEBUG_CFLAGS@
-DEFAULT_CFLAGS = @DEFAULT_CFLAGS@
-DEFS = @DEFS@
-DLLTOOL = @DLLTOOL@
-DSYMUTIL = @DSYMUTIL@
-DUMPBIN = @DUMPBIN@
-ECHO_C = @ECHO_C@
-ECHO_N = @ECHO_N@
-ECHO_T = @ECHO_T@
-EGREP = @EGREP@
-EXEEXT = @EXEEXT@
-EXPAT_CFLAGS = @EXPAT_CFLAGS@
-EXPAT_LIBS = @EXPAT_LIBS@
-FFLAS_FFPACK_CFLAGS = @FFLAS_FFPACK_CFLAGS@
-FFLAS_FFPACK_LIBS = @FFLAS_FFPACK_LIBS@
-FFLAS_FFPACK_LOC = @FFLAS_FFPACK_LOC@
-FGREP = @FGREP@
-FPLLL_CFLAGS = @FPLLL_CFLAGS@
-FPLLL_LIBS = @FPLLL_LIBS@
-GIVARO_CFLAGS = @GIVARO_CFLAGS@
-GIVARO_LIBS = @GIVARO_LIBS@
-GMP_CFLAGS = @GMP_CFLAGS@
-GMP_LIBS = @GMP_LIBS@
-GMP_VERSION = @GMP_VERSION@
-GREP = @GREP@
-IML_CFLAGS = @IML_CFLAGS@
-IML_LIBS = @IML_LIBS@
-INSTALL = @INSTALL@
-INSTALL_DATA = @INSTALL_DATA@
-INSTALL_PROGRAM = @INSTALL_PROGRAM@
-INSTALL_SCRIPT = @INSTALL_SCRIPT@
-INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
-LD = @LD@
-LDFLAGS = @LDFLAGS@
-LIBOBJS = @LIBOBJS@
-LIBS = @LIBS@
-LIBTOOL = @LIBTOOL@
-LIDIA_CFLAGS = @LIDIA_CFLAGS@
-LIDIA_LIBS = @LIDIA_LIBS@
-LINBOX_BENCH_PATH = @LINBOX_BENCH_PATH@
-LINBOX_DOC_PATH = @LINBOX_DOC_PATH@
-LIPO = @LIPO@
-LN_S = @LN_S@
-LTLIBOBJS = @LTLIBOBJS@
-M4RIE_CFLAGS = @M4RIE_CFLAGS@
-M4RIE_LIBS = @M4RIE_LIBS@
-M4RI_CFLAGS = @M4RI_CFLAGS@
-M4RI_LIBS = @M4RI_LIBS@
-MAINT = @MAINT@
-MAKEINFO = @MAKEINFO@
-MANIFEST_TOOL = @MANIFEST_TOOL@
-MAPLE_CFLAGS = @MAPLE_CFLAGS@
-MAPLE_HOME = @MAPLE_HOME@
-MAPLE_LIBS = @MAPLE_LIBS@
-MAPLE_VERSION = @MAPLE_VERSION@
-MKDIR_P = @MKDIR_P@
-MPFR_CFLAGS = @MPFR_CFLAGS@
-MPFR_LIBS = @MPFR_LIBS@
-NM = @NM@
-NMEDIT = @NMEDIT@
-NTL_CFLAGS = @NTL_CFLAGS@
-NTL_LIBS = @NTL_LIBS@
-OBJDUMP = @OBJDUMP@
-OBJEXT = @OBJEXT@
-OTOOL = @OTOOL@
-OTOOL64 = @OTOOL64@
-PACKAGE = @PACKAGE@
-PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
-PACKAGE_NAME = @PACKAGE_NAME@
-PACKAGE_STRING = @PACKAGE_STRING@
-PACKAGE_TARNAME = @PACKAGE_TARNAME@
-PACKAGE_URL = @PACKAGE_URL@
-PACKAGE_VERSION = @PACKAGE_VERSION@
-PATH_SEPARATOR = @PATH_SEPARATOR@
-PROF = @PROF@
-RANLIB = @RANLIB@
-RM = @RM@
-SACLIB_CFLAGS = @SACLIB_CFLAGS@
-SACLIB_LIBS = @SACLIB_LIBS@
-SED = @SED@
-SET_MAKE = @SET_MAKE@
-SHELL = @SHELL@
-STRIP = @STRIP@
-TESTS_CFLAGS = @TESTS_CFLAGS@
-VERSION = @VERSION@
-WARN = @WARN@
-abs_builddir = @abs_builddir@
-abs_srcdir = @abs_srcdir@
-abs_top_builddir = @abs_top_builddir@
-abs_top_srcdir = @abs_top_srcdir@
-ac_ct_AR = @ac_ct_AR@
-ac_ct_CC = @ac_ct_CC@
-ac_ct_CXX = @ac_ct_CXX@
-ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
-am__leading_dot = @am__leading_dot@
-am__tar = @am__tar@
-am__untar = @am__untar@
-bindir = @bindir@
-build = @build@
-build_alias = @build_alias@
-build_cpu = @build_cpu@
-build_os = @build_os@
-build_vendor = @build_vendor@
-builddir = @builddir@
-datadir = @datadir@
-datarootdir = @datarootdir@
-docdir = @docdir@
-dvidir = @dvidir@
-exec_prefix = @exec_prefix@
-host = @host@
-host_alias = @host_alias@
-host_cpu = @host_cpu@
-host_os = @host_os@
-host_vendor = @host_vendor@
-htmldir = @htmldir@
-includedir = @includedir@
-infodir = @infodir@
-install_sh = @install_sh@
-libdir = @libdir@
-libexecdir = @libexecdir@
-localedir = @localedir@
-localstatedir = @localstatedir@
-mandir = @mandir@
-mkdir_p = @mkdir_p@
-oldincludedir = @oldincludedir@
-pdfdir = @pdfdir@
-prefix = @prefix@
-program_transform_name = @program_transform_name@
-psdir = @psdir@
-sbindir = @sbindir@
-sharedstatedir = @sharedstatedir@
-srcdir = @srcdir@
-sysconfdir = @sysconfdir@
-target_alias = @target_alias@
-top_build_prefix = @top_build_prefix@
-top_builddir = @top_builddir@
-top_srcdir = @top_srcdir@
-
-#INCLUDES=-I$(top_srcdir)
-AM_CPPFLAGS = -I$(top_srcdir) -I$(top_srcdir)/linbox $(GMP_CFLAGS) \
- $(NTL_CFLAGS) $(FFLAS_FFPACK_CFLAGS) $(GIVARO_CFLAGS) \
- $(LIDIA_CFLAGS) $(IML_CFLAGS)
-
-#if LinBoxSrcOnly
-#AM_CPPFLAGS=-g -DLinBoxSrcOnly $(GMP_CFLAGS) $(NTL_CFLAGS) $(GIVARO_CFLAGS) $(LIDIA_CFLAGS)
-#LINBOX_LIBS=
-#else
-#AM_CPPFLAGS=-g $(GMP_CFLAGS) $(NTL_CFLAGS) $(GIVARO_CFLAGS) $(LIDIA_CFLAGS)
-#LINBOX_LIBS= $(top_builddir)/linbox/liblinbox.la
-#endif
-
-# SAFER_FLAGS=--std=c++98 -g -Wall -Wextra -Wno-ignored-qualifiers -Wno-unused-parameter
-# SAFER_FLAGS=-g -Wall -Wextra -Wno-unused-parameter
-
-# AM_CXXFLAGS = $(SAFER_FLAGS) -DLinBoxSrcOnly -DDEBUG -O0
-AM_CXXFLAGS = @DEFAULT_CFLAGS@ -DLinBoxSrcOnly -DDISABLE_COMMENTATOR
-#LDADD = $(NTL_LIBS) $(GIVARO_LIBS) $(LIDIA_LIBS) $(BLAS_LIBS) $(GMP_LIBS) "-Wl,-enable-auto-import"
-LDADD = $(NTL_LIBS) $(GIVARO_LIBS) $(LIDIA_LIBS) $(BLAS_LIBS) $(GMP_LIBS) $(MPFR_LIBS) $(FPLLL_LIBS) $(LDFLAGS) $(IML_LIBS)
-# AM_LDFLAGS=-static
-AM_LDFLAGS = $(top_srcdir)/linbox/.libs/liblinbox.a
-
-#EX_LDADD = $(NTL_LIBS) $(GMP_LIBS) $(GIVARO_LIBS) $(LIDIA_LIBS) $(BLAS_LIBS)
-#LDADD = $(LINBOX_LIBS) $(EX_LDADD)
-SUBDIRS = fields
-EXAMPLES = rank det minpoly valence solve dot-product echelon sparseelimdet sparseelimrank checksolve doubledet smithvalence
-# EXAMPLES+=nulp yabla
-GIVARONTL_EXAMPLES = smith charpoly graph-charpoly
- at LINBOX_HAVE_GIVARO_TRUE@@LINBOX_HAVE_NTL_TRUE at USE_GIVARONTL_EXAMPLES = $(GIVARONTL_EXAMPLES)
-CLEANFILES = $(EXTRA_PROGRAMS)
-EXTRA_DIST = examples.doxy smithvalence.h
-dot_product_SOURCES = dot-product.C
-doubledet_SOURCES = doubledet.C
-#linbox_program_SOURCES = \
-# linbox-program.C
-checksolve_SOURCES = checksolve.C
-charpoly_SOURCES = charpoly.C
-graph_charpoly_SOURCES = graph-charpoly.C
-det_SOURCES = det.C
-rank_SOURCES = rank.C
-smith_SOURCES = smith.C
-minpoly_SOURCES = minpoly.C
-valence_SOURCES = valence.C
-solve_SOURCES = solve.C
-echelon_SOURCES = echelon.C
-smithvalence_SOURCES = smithvalence.C
-sparseelimdet_SOURCES = sparseelimdet.C
-sparseelimrank_SOURCES = sparseelimrank.C
-LINBOX = @prefix@
-
-# no /bin if LinBox is uncompiled
-#LINBOX_BIN=$(LINBOX)/bin
-LINBOX_BIN = @bindir@
-all: all-recursive
-
-.SUFFIXES:
-.SUFFIXES: .C .lo .o .obj
-$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps)
- @for dep in $?; do \
- case '$(am__configure_deps)' in \
- *$$dep*) \
- ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
- && { if test -f $@; then exit 0; else break; fi; }; \
- exit 1;; \
- esac; \
- done; \
- echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu --ignore-deps examples/Makefile'; \
- $(am__cd) $(top_srcdir) && \
- $(AUTOMAKE) --gnu --ignore-deps examples/Makefile
-.PRECIOUS: Makefile
-Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
- @case '$?' in \
- *config.status*) \
- cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
- *) \
- echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
- cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
- esac;
-
-$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
- cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-
-$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
- cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
- cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-$(am__aclocal_m4_deps):
-Readme-make: $(top_builddir)/config.status $(srcdir)/Readme-make.in
- cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
-charpoly$(EXEEXT): $(charpoly_OBJECTS) $(charpoly_DEPENDENCIES) $(EXTRA_charpoly_DEPENDENCIES)
- @rm -f charpoly$(EXEEXT)
- $(CXXLINK) $(charpoly_OBJECTS) $(charpoly_LDADD) $(LIBS)
-checksolve$(EXEEXT): $(checksolve_OBJECTS) $(checksolve_DEPENDENCIES) $(EXTRA_checksolve_DEPENDENCIES)
- @rm -f checksolve$(EXEEXT)
- $(CXXLINK) $(checksolve_OBJECTS) $(checksolve_LDADD) $(LIBS)
-det$(EXEEXT): $(det_OBJECTS) $(det_DEPENDENCIES) $(EXTRA_det_DEPENDENCIES)
- @rm -f det$(EXEEXT)
- $(CXXLINK) $(det_OBJECTS) $(det_LDADD) $(LIBS)
-dot-product$(EXEEXT): $(dot_product_OBJECTS) $(dot_product_DEPENDENCIES) $(EXTRA_dot_product_DEPENDENCIES)
- @rm -f dot-product$(EXEEXT)
- $(CXXLINK) $(dot_product_OBJECTS) $(dot_product_LDADD) $(LIBS)
-doubledet$(EXEEXT): $(doubledet_OBJECTS) $(doubledet_DEPENDENCIES) $(EXTRA_doubledet_DEPENDENCIES)
- @rm -f doubledet$(EXEEXT)
- $(CXXLINK) $(doubledet_OBJECTS) $(doubledet_LDADD) $(LIBS)
-echelon$(EXEEXT): $(echelon_OBJECTS) $(echelon_DEPENDENCIES) $(EXTRA_echelon_DEPENDENCIES)
- @rm -f echelon$(EXEEXT)
- $(CXXLINK) $(echelon_OBJECTS) $(echelon_LDADD) $(LIBS)
-graph-charpoly$(EXEEXT): $(graph_charpoly_OBJECTS) $(graph_charpoly_DEPENDENCIES) $(EXTRA_graph_charpoly_DEPENDENCIES)
- @rm -f graph-charpoly$(EXEEXT)
- $(CXXLINK) $(graph_charpoly_OBJECTS) $(graph_charpoly_LDADD) $(LIBS)
-minpoly$(EXEEXT): $(minpoly_OBJECTS) $(minpoly_DEPENDENCIES) $(EXTRA_minpoly_DEPENDENCIES)
- @rm -f minpoly$(EXEEXT)
- $(CXXLINK) $(minpoly_OBJECTS) $(minpoly_LDADD) $(LIBS)
-rank$(EXEEXT): $(rank_OBJECTS) $(rank_DEPENDENCIES) $(EXTRA_rank_DEPENDENCIES)
- @rm -f rank$(EXEEXT)
- $(CXXLINK) $(rank_OBJECTS) $(rank_LDADD) $(LIBS)
-smith$(EXEEXT): $(smith_OBJECTS) $(smith_DEPENDENCIES) $(EXTRA_smith_DEPENDENCIES)
- @rm -f smith$(EXEEXT)
- $(CXXLINK) $(smith_OBJECTS) $(smith_LDADD) $(LIBS)
-smithvalence$(EXEEXT): $(smithvalence_OBJECTS) $(smithvalence_DEPENDENCIES) $(EXTRA_smithvalence_DEPENDENCIES)
- @rm -f smithvalence$(EXEEXT)
- $(CXXLINK) $(smithvalence_OBJECTS) $(smithvalence_LDADD) $(LIBS)
-solve$(EXEEXT): $(solve_OBJECTS) $(solve_DEPENDENCIES) $(EXTRA_solve_DEPENDENCIES)
- @rm -f solve$(EXEEXT)
- $(CXXLINK) $(solve_OBJECTS) $(solve_LDADD) $(LIBS)
-sparseelimdet$(EXEEXT): $(sparseelimdet_OBJECTS) $(sparseelimdet_DEPENDENCIES) $(EXTRA_sparseelimdet_DEPENDENCIES)
- @rm -f sparseelimdet$(EXEEXT)
- $(CXXLINK) $(sparseelimdet_OBJECTS) $(sparseelimdet_LDADD) $(LIBS)
-sparseelimrank$(EXEEXT): $(sparseelimrank_OBJECTS) $(sparseelimrank_DEPENDENCIES) $(EXTRA_sparseelimrank_DEPENDENCIES)
- @rm -f sparseelimrank$(EXEEXT)
- $(CXXLINK) $(sparseelimrank_OBJECTS) $(sparseelimrank_LDADD) $(LIBS)
-valence$(EXEEXT): $(valence_OBJECTS) $(valence_DEPENDENCIES) $(EXTRA_valence_DEPENDENCIES)
- @rm -f valence$(EXEEXT)
- $(CXXLINK) $(valence_OBJECTS) $(valence_LDADD) $(LIBS)
-
-mostlyclean-compile:
- -rm -f *.$(OBJEXT)
-
-distclean-compile:
- -rm -f *.tab.c
-
-.C.o:
- $(CXXCOMPILE) -c -o $@ $<
-
-.C.obj:
- $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
-
-.C.lo:
- $(LTCXXCOMPILE) -c -o $@ $<
-
-mostlyclean-libtool:
- -rm -f *.lo
-
-clean-libtool:
- -rm -rf .libs _libs
-
-# This directory's subdirectories are mostly independent; you can cd
-# into them and run `make' without going through this Makefile.
-# To change the values of `make' variables: instead of editing Makefiles,
-# (1) if the variable is set in `config.status', edit `config.status'
-# (which will cause the Makefiles to be regenerated when you run `make');
-# (2) otherwise, pass the desired values on the `make' command line.
-$(RECURSIVE_TARGETS):
- @fail= failcom='exit 1'; \
- for f in x $$MAKEFLAGS; do \
- case $$f in \
- *=* | --[!k]*);; \
- *k*) failcom='fail=yes';; \
- esac; \
- done; \
- dot_seen=no; \
- target=`echo $@ | sed s/-recursive//`; \
- list='$(SUBDIRS)'; for subdir in $$list; do \
- echo "Making $$target in $$subdir"; \
- if test "$$subdir" = "."; then \
- dot_seen=yes; \
- local_target="$$target-am"; \
- else \
- local_target="$$target"; \
- fi; \
- ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
- || eval $$failcom; \
- done; \
- if test "$$dot_seen" = "no"; then \
- $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \
- fi; test -z "$$fail"
-
-$(RECURSIVE_CLEAN_TARGETS):
- @fail= failcom='exit 1'; \
- for f in x $$MAKEFLAGS; do \
- case $$f in \
- *=* | --[!k]*);; \
- *k*) failcom='fail=yes';; \
- esac; \
- done; \
- dot_seen=no; \
- case "$@" in \
- distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \
- *) list='$(SUBDIRS)' ;; \
- esac; \
- rev=''; for subdir in $$list; do \
- if test "$$subdir" = "."; then :; else \
- rev="$$subdir $$rev"; \
- fi; \
- done; \
- rev="$$rev ."; \
- target=`echo $@ | sed s/-recursive//`; \
- for subdir in $$rev; do \
- echo "Making $$target in $$subdir"; \
- if test "$$subdir" = "."; then \
- local_target="$$target-am"; \
- else \
- local_target="$$target"; \
- fi; \
- ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
- || eval $$failcom; \
- done && test -z "$$fail"
-tags-recursive:
- list='$(SUBDIRS)'; for subdir in $$list; do \
- test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \
- done
-ctags-recursive:
- list='$(SUBDIRS)'; for subdir in $$list; do \
- test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \
- done
-
-ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
- list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
- unique=`for i in $$list; do \
- if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
- done | \
- $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
- END { if (nonempty) { for (i in files) print i; }; }'`; \
- mkid -fID $$unique
-tags: TAGS
-
-TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
- $(TAGS_FILES) $(LISP)
- set x; \
- here=`pwd`; \
- if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \
- include_option=--etags-include; \
- empty_fix=.; \
- else \
- include_option=--include; \
- empty_fix=; \
- fi; \
- list='$(SUBDIRS)'; for subdir in $$list; do \
- if test "$$subdir" = .; then :; else \
- test ! -f $$subdir/TAGS || \
- set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \
- fi; \
- done; \
- list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
- unique=`for i in $$list; do \
- if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
- done | \
- $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
- END { if (nonempty) { for (i in files) print i; }; }'`; \
- shift; \
- if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
- test -n "$$unique" || unique=$$empty_fix; \
- if test $$# -gt 0; then \
- $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
- "$$@" $$unique; \
- else \
- $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
- $$unique; \
- fi; \
- fi
-ctags: CTAGS
-CTAGS: ctags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
- $(TAGS_FILES) $(LISP)
- list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
- unique=`for i in $$list; do \
- if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
- done | \
- $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
- END { if (nonempty) { for (i in files) print i; }; }'`; \
- test -z "$(CTAGS_ARGS)$$unique" \
- || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
- $$unique
-
-GTAGS:
- here=`$(am__cd) $(top_builddir) && pwd` \
- && $(am__cd) $(top_srcdir) \
- && gtags -i $(GTAGS_ARGS) "$$here"
-
-distclean-tags:
- -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
-
-distdir: $(DISTFILES)
- @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
- topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
- list='$(DISTFILES)'; \
- dist_files=`for file in $$list; do echo $$file; done | \
- sed -e "s|^$$srcdirstrip/||;t" \
- -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
- case $$dist_files in \
- */*) $(MKDIR_P) `echo "$$dist_files" | \
- sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
- sort -u` ;; \
- esac; \
- for file in $$dist_files; do \
- if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
- if test -d $$d/$$file; then \
- dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
- if test -d "$(distdir)/$$file"; then \
- find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
- fi; \
- if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
- cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
- find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
- fi; \
- cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
- else \
- test -f "$(distdir)/$$file" \
- || cp -p $$d/$$file "$(distdir)/$$file" \
- || exit 1; \
- fi; \
- done
- @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \
- if test "$$subdir" = .; then :; else \
- $(am__make_dryrun) \
- || test -d "$(distdir)/$$subdir" \
- || $(MKDIR_P) "$(distdir)/$$subdir" \
- || exit 1; \
- dir1=$$subdir; dir2="$(distdir)/$$subdir"; \
- $(am__relativize); \
- new_distdir=$$reldir; \
- dir1=$$subdir; dir2="$(top_distdir)"; \
- $(am__relativize); \
- new_top_distdir=$$reldir; \
- echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \
- echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \
- ($(am__cd) $$subdir && \
- $(MAKE) $(AM_MAKEFLAGS) \
- top_distdir="$$new_top_distdir" \
- distdir="$$new_distdir" \
- am__remove_distdir=: \
- am__skip_length_check=: \
- am__skip_mode_fix=: \
- distdir) \
- || exit 1; \
- fi; \
- done
-check-am: all-am
-check: check-recursive
-all-am: Makefile
-installdirs: installdirs-recursive
-installdirs-am:
-install: install-recursive
-install-exec: install-exec-recursive
-install-data: install-data-recursive
-uninstall: uninstall-recursive
-
-install-am: all-am
- @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
-
-installcheck: installcheck-recursive
-install-strip:
- if test -z '$(STRIP)'; then \
- $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
- install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
- install; \
- else \
- $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
- install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
- "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
- fi
-mostlyclean-generic:
-
-clean-generic:
- -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
-
-distclean-generic:
- -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
- -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
-
-maintainer-clean-generic:
- @echo "This command is intended for maintainers to use"
- @echo "it deletes files that may require special tools to rebuild."
-clean: clean-recursive
-
-clean-am: clean-generic clean-libtool mostlyclean-am
-
-distclean: distclean-recursive
- -rm -f Makefile
-distclean-am: clean-am distclean-compile distclean-generic \
- distclean-tags
-
-dvi: dvi-recursive
-
-dvi-am:
-
-html: html-recursive
-
-html-am:
-
-info: info-recursive
-
-info-am:
-
-install-data-am:
-
-install-dvi: install-dvi-recursive
-
-install-dvi-am:
-
-install-exec-am:
-
-install-html: install-html-recursive
-
-install-html-am:
-
-install-info: install-info-recursive
-
-install-info-am:
-
-install-man:
-
-install-pdf: install-pdf-recursive
-
-install-pdf-am:
-
-install-ps: install-ps-recursive
-
-install-ps-am:
-
-installcheck-am:
-
-maintainer-clean: maintainer-clean-recursive
- -rm -f Makefile
-maintainer-clean-am: distclean-am maintainer-clean-generic
-
-mostlyclean: mostlyclean-recursive
-
-mostlyclean-am: mostlyclean-compile mostlyclean-generic \
- mostlyclean-libtool
-
-pdf: pdf-recursive
-
-pdf-am:
-
-ps: ps-recursive
-
-ps-am:
-
-uninstall-am:
-
-.MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) ctags-recursive \
- install-am install-strip tags-recursive
-
-.PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \
- all all-am check check-am clean clean-generic clean-libtool \
- ctags ctags-recursive distclean distclean-compile \
- distclean-generic distclean-libtool distclean-tags distdir dvi \
- dvi-am html html-am info info-am install install-am \
- install-data install-data-am install-dvi install-dvi-am \
- install-exec install-exec-am install-html install-html-am \
- install-info install-info-am install-man install-pdf \
- install-pdf-am install-ps install-ps-am install-strip \
- installcheck installcheck-am installdirs installdirs-am \
- maintainer-clean maintainer-clean-generic mostlyclean \
- mostlyclean-compile mostlyclean-generic mostlyclean-libtool \
- pdf pdf-am ps ps-am tags tags-recursive uninstall uninstall-am
-
-
-examples: ${EXTRA_PROGRAMS}
-
-# for compilation of new examples
-%:%.C
- $(CXX) $(CXXFLAGS) $(AM_CXXFLAGS) $(OPTFLAGS) ${INCLUDES} $(AM_CPPFLAGS) $*.C -o $@ $(AM_LDFLAGS) $(LDADD)
-
-%:%.cpp
- $(CXX) $(CXXFLAGS) $(AM_CXXFLAGS) $(OPTFLAGS) ${INCLUDES} $(AM_CPPFLAGS) $*.cpp -o $@ $(AM_LDFLAGS) $(LDADD)
-
-# Tell versions [3.59,3.63) of GNU make to not export all variables.
-# Otherwise a system limit (for SysV at least) may be exceeded.
-.NOEXPORT:
diff --git a/examples/Readme b/examples/Readme
new file mode 100644
index 0000000..ac7e230
--- /dev/null
+++ b/examples/Readme
@@ -0,0 +1 @@
+See also matrix examples in ../../tests/data/
diff --git a/examples/athadet.C b/examples/athadet.C
new file mode 100644
index 0000000..b4d397b
--- /dev/null
+++ b/examples/athadet.C
@@ -0,0 +1,107 @@
+/*
+ * examples/athadet.C
+ *
+ * Copyright (C) 2007, 2010 S. Guelton
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ * ========LICENCE========
+ */
+
+/**\file examples/athadet.C
+ * @example examples/athadet.C
+ \brief Determinant of sparse matrix over Z or Zp.
+ \ingroup examples
+ @author serge.guelton at imag.fr
+ */
+
+
+/*
+ * to be compiled with kaapi library **svn sources**, available at http://gforge.inria.fr
+ * g++ -o atahdet athadet.C $(pkg-config --cflags --libs kaapi) -g3 $( linbox-config --cflags --libs)
+ * or
+ * g++ -o atahdet athadet.C $KAAPI_CPPFLAGS $KAAPI_LDFLAGS -g3 $( linbox-config --cflags --libs)
+ */
+#define __LINBOX_HAVE_KAAPI
+
+#include <iostream>
+#include <string>
+
+#include <linbox/ring/modular.h>
+#include <linbox/ring/gmp-integers.h>
+#include <linbox/matrix/sparse-matrix.h>
+#include <linbox/solutions/det.h>
+#include <linbox/util/matrix-stream.h>
+
+
+using namespace LinBox;
+using namespace std;
+
+typedef Givaro::ZRing<Integer> Integers;
+
+struct cra_det_task {
+
+
+ void operator()(int argc, char **argv) {
+ ifstream input (argv[1]);
+ if (!input) {
+ cerr << "Error opening matrix file '" << argv[1] << "'" << endl;
+ return ;
+ }
+
+
+ Util::logfile() << "creating matrix" << std::endl;
+ Integers ZZ;
+ SparseMatrix<Integers> sparseMatrix (ZZ);
+ sparseMatrix.read(input);
+ Util::logfile() << "matrix created" << std::endl;
+ Givaro::ZRing<Integer>::Element det_A;
+ try {
+ cra_det(det_A, sparseMatrix, RingCategories::IntegerTag(), Method::Hybrid() );
+ }
+ catch ( LinBox::LinboxError & err ) {
+ std::cerr << err << std::endl;
+ }
+ cout << "Determinant is ";
+ ZZ.write(cout, det_A) << endl;
+ }
+};
+
+int main (int argc, char **argv)
+{
+ if(argc<2) {
+ cerr << "not enough args : usage = athadet file" << endl;
+ return 1;
+ }
+
+ a1::Community com = a1::System::join_community(argc,argv);
+
+ Util::logfile() << "starting job" << std::endl;
+ a1::ForkMain<cra_det_task>()(argc,argv);
+ com.leave();
+ a1::System::terminate();
+ return 0;
+}
+
+
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+
diff --git a/examples/bench-fft.C b/examples/bench-fft.C
new file mode 100755
index 0000000..9c8583f
--- /dev/null
+++ b/examples/bench-fft.C
@@ -0,0 +1,249 @@
+/* -*- mode: C++; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
+/*
+ * Copyright (C) 2013 Pascal Giorgi
+ *
+ * Written by Pascal Giorgi <pascal.giorgi at lirmm.fr>
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ * ========LICENCE========
+ */
+
+#include <linbox/linbox-config.h>
+
+#include <functional>
+#include <iostream>
+#include <vector>
+
+#include <givaro/modular.h>
+#include <givaro/givranditer.h>
+
+using namespace std;
+
+
+#include "linbox/algorithms/polynomial-matrix/polynomial-fft-transform.h"
+#include "linbox/randiter/random-fftprime.h"
+#include "linbox/ring/modular.h"
+#include "fflas-ffpack/utils/align-allocator.h"
+
+using namespace LinBox;
+
+
+
+template <typename Rand, typename Vect>
+void randomVect (Rand& r, Vect& v) {
+ size_t s = v.size();
+ for (size_t i = 0; i < s; ++i)
+ r.random(v[i]);
+}
+
+
+/**********************************
+ ****** DFT CHECKING FUNCTION *****
+ *********************************/
+template<typename T>
+struct congruent{
+ T p;
+ congruent(T _p): p(_p){}
+ bool operator()(T a, T b) const { return ((uint64_t)a%(uint64_t)p) == ((uint64_t)b%(uint64_t)p);}
+};
+template<typename Funct, typename FFT, typename Vect>
+void DFT_sanity_check(FFT& FFTDom, Funct f, const Vect& x, const Vect& y, string msg){
+ typedef typename FFT::Element Element ;
+ Vect z(x);
+ auto Functor = bind(f, &FFTDom, &z[0]);
+ Functor();
+ msg+=" ";
+ msg.resize(45,'.');
+ cout<<" Checking ... "<<msg
+ << (equal(y.begin(),y.end(),z.begin(),congruent<Element>(FFTDom._p))?" done":" error")<<endl;
+
+ // if (!(equal(y.begin(),y.end(),z.begin(),congruent<Element>(FFTDom._p)))){
+ // std::ostream_iterator<Element> out_it (std::cout,", ");
+ // std::copy ( z.begin(), z.end(), out_it );
+ // std::cout<<std::endl;
+ // std::copy ( y.begin(), y.end(), out_it );
+ // std::cout<<std::endl;
+ // }
+
+}
+
+template<typename Field>
+void check_DIF(const Field& fld, size_t kmax, long seed) {
+ typedef typename Field::Element Element;
+ for (size_t lpts = 1; lpts < kmax ; lpts++){
+ size_t pts = 1 << lpts;
+ cout<<"********************************************************"<<endl;
+ cout<<"*** Testing polynomials of size 2^" << lpts <<endl;
+ cout<<"********************************************************"<<endl;
+ //vector<Element> x(pts),y(pts);
+ std::vector<Element,AlignedAllocator<Element, Alignment::DEFAULT>> x(pts),y(pts);
+
+ // Generate random inputs
+ typename Field::RandIter Gen(fld);//,fld.characteristic(),seed);
+ randomVect(Gen,y);
+ x=y;
+
+ FFT_transform<Field> MulDom(fld,lpts);
+ typedef FFT_transform<Field> FFT_t;
+
+
+ /* CHECK DIF */
+ // compute the correct result
+ MulDom.FFT_DIF_Harvey_mod2p_iterative(y.data());
+ // check 2x2
+ DFT_sanity_check(MulDom,&FFT_t::FFT_DIF_Harvey_mod2p_iterative2x2,x,y, "DIF_Harvey_mod2p_iterative2x2");
+ // check 3x3
+ DFT_sanity_check(MulDom,&FFT_t::FFT_DIF_Harvey_mod2p_iterative3x3,x,y, "DIF_Harvey_mod2p_iterative3x3");
+ // check 4x1 SSE
+ //DFT_sanity_check(MulDom,&FFT_t::FFT_DIF_Harvey_mod2p_iterative4x1_SSE,x,y, "DIF_Harvey_mod2p_iterative4x1_SSE");
+ // check 4x2 SSE
+ //DFT_sanity_check(MulDom,&FFT_t::FFT_DIF_Harvey_mod2p_iterative4x2_SSE,x,y, "DIF_Harvey_mod2p_iterative4x2_SSE");
+#ifdef __AVX2__
+ // check 8x1 AVX
+ //DFT_sanity_check(MulDom,&FFT_t::FFT_DIF_Harvey_mod2p_iterative8x1_AVX,x,y, "DIF_Harvey_mod2p_iterative8x1_AVX");
+#endif
+ // check Harvey SSE
+ DFT_sanity_check(MulDom,&FFT_t::template FFT_DIF<Element>,x,y, "DIF_Harvey_SSE");
+ cout<<"---------------------------------------------------------------"<<endl;
+ /* CHECK DIT */
+ // compute the correct result
+ y=x;
+ MulDom.FFT_DIT_Harvey_mod4p_iterative2x2(y.data());
+ // check 2x2
+ DFT_sanity_check(MulDom,&FFT_t::FFT_DIT_Harvey_mod4p_iterative2x2,x,y, "DIT_Harvey_mod4p_iterative2x2");
+ // check 3x3
+ DFT_sanity_check(MulDom,&FFT_t::FFT_DIT_Harvey_mod4p_iterative3x3,x,y, "DIT_Harvey_mod4p_iterative3x3");
+ // check 4x1 SSE
+ //DFT_sanity_check(MulDom,&FFT_t::FFT_DIT_Harvey_mod4p_iterative4x1_SSE,x,y, "DIT_Harvey_mod4p_iterative4x1_SSE");
+#ifdef __AVX2__
+ // check 8x1 AVX
+ //DFT_sanity_check(MulDom,&FFT_t::FFT_DIT_Harvey_mod4p_iterative8x1_AVX,x,y, "DIT_Harvey_mod4p_iterative8x1_AVX");
+#endif
+ // check Harvey SSE
+ DFT_sanity_check(MulDom,&FFT_t::template FFT_DIT<Element>,x,y, "DIT_Harvey_SSE");
+
+ cout<<endl;
+ }
+}
+
+/**************************************
+ ****** DFT PERFORMANCE FUNCTION ******
+ **************************************/
+template<typename Funct, typename FFT, typename Vect>
+void DFT_performance(FFT& FFTDom, Funct f, size_t lpts, const Vect& x, string msg){
+ Vect z(x);
+ auto Functor = bind(f, &FFTDom, &z[0]);
+ Timer chrono;
+ double time;
+ double Miops;
+ size_t ct,minct=4;
+ ct = 0;
+ chrono.start();
+ while (chrono.realElapsedTime() < 1){
+ for (size_t k=0;k<minct;k++)
+ Functor();
+ ct+=minct;
+ }
+ time = chrono.userElapsedTime()/ct;
+ Miops = 17 * (lpts<<(lpts-1)) /(1e6 * time); // 3/2 n log n
+ msg+=" ";
+ msg.resize(45,'.');
+ cout << "Timings ... " << msg <<" : ";
+ cout.precision(2);
+ cout.width(10);
+ cout<<scientific<<time << " s, ";
+ cout.precision(2);
+ cout.width(10);
+ cout<<fixed<<Miops << " Miops\n";
+}
+
+
+
+template<typename Field>
+void bench_DIF(const Field& fld, size_t kmax, long seed) {
+ typedef typename Field::Element Element;
+ for (size_t lpts = 5; lpts < kmax ; lpts++){
+ size_t pts = 1 << lpts;
+ cout<<"********************************************************"<<endl;
+ cout<<"*** Testing polynomials of size 2^" << lpts <<endl;
+ cout<<"********************************************************"<<endl;
+ vector<Element> x(pts);
+
+ // Generate random inputs
+ typename Field::RandIter Gen(fld,seed);
+ randomVect(Gen,x);
+ FFT_transform<Field> MulDom(fld,lpts);
+ typedef FFT_transform<Field> FFT_t;
+
+ // check 2x2
+ DFT_performance(MulDom,&FFT_t::FFT_DIF_Harvey_mod2p_iterative2x2,lpts, x, "DIF_Harvey_mod2p_iterative2x2");
+ // check 3x3
+ DFT_performance(MulDom,&FFT_t::FFT_DIF_Harvey_mod2p_iterative3x3,lpts, x, "DIF_Harvey_mod2p_iterative3x3");
+ // check 4x1 SSE
+ //DFT_performance(MulDom,&FFT_t::FFT_DIF_Harvey_mod2p_iterative4x1_SSE,lpts, x, "DIF_Harvey_mod2p_iterative4x1_SSE");
+ // check 4x2 SSE
+ //DFT_performance(MulDom,&FFT_t::FFT_DIF_Harvey_mod2p_iterative4x2_SSE,lpts, x, "DIF_Harvey_mod2p_iterative4x2_SSE");
+#ifdef __AVX2__
+ // check 8x1 AVX
+ //DFT_performance(MulDom,&FFT_t::FFT_DIF_Harvey_mod2p_iterative8x1_AVX,lpts, x, "DIF_Harvey_mod2p_iterative8x1_AVX");
+#endif
+ // check Harvey SSE
+ DFT_performance(MulDom,&FFT_t::template FFT_DIF<Element>,lpts, x, "DIF_Harvey_SSE");
+ cout<<"---------------------------------------------------------------"<<endl;
+ // check 2x2
+ DFT_performance(MulDom,&FFT_t::FFT_DIT_Harvey_mod4p_iterative2x2,lpts, x, "DIT_Harvey_mod4p_iterative2x2");
+ // check 3x3
+ DFT_performance(MulDom,&FFT_t::FFT_DIT_Harvey_mod4p_iterative3x3,lpts, x, "DIT_Harvey_mod4p_iterative3x3");
+ // check 4x1 SSE
+ //DFT_performance(MulDom,&FFT_t::FFT_DIT_Harvey_mod4p_iterative4x1_SSE,lpts, x, "DIT_Harvey_mod4p_iterative4x1_SSE");
+#ifdef __AVX2__
+ // check 8x1 AVX
+ //DFT_performance(MulDom,&FFT_t::FFT_DIT_Harvey_mod4p_iterative8x1_AVX,lpts, x, "DIT_Harvey_mod4p_iterative8x1_AVX");
+#endif
+ // check Harvey SSE
+ DFT_performance(MulDom,&FFT_t::template FFT_DIT<Element>,lpts, x, "DIT_Harvey_SSE");
+
+
+ cout<<endl;
+ }
+}
+
+
+int main(int argc, char** argv){
+ if (argc < 2 || argc >3){
+ cerr<<"usage : prime_bitsize , (seed)"<<endl;
+ exit(0);
+ }
+ uint64_t bits =atoi(argv[1]);
+ long seed=((argc>2)?atoi(argv[2]):time(NULL));
+ RandomFFTPrime Rd(1<<bits,seed);
+ uint32_t p = (uint32_t)Rd.randomPrime(5);
+ size_t k = bits-4;
+ cout<<"prime : "<<p<<endl;
+ cout<<endl;
+
+ //Givaro::Modular<uint32_t> F(p);
+ Givaro::Modular<double> F(p);
+ check_DIF(F,k,seed);
+ bench_DIF(F,k,seed);
+
+
+ return 0;
+}
+
+
diff --git a/examples/bench-matpoly-mult.C b/examples/bench-matpoly-mult.C
new file mode 100755
index 0000000..6779c8d
--- /dev/null
+++ b/examples/bench-matpoly-mult.C
@@ -0,0 +1,495 @@
+/* -*- mode: C++; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
+/*
+ * Copyright (C) 2013 Pascal Giorgi
+ *
+ * Written by Pascal Giorgi <pascal.giorgi at lirmm.fr>
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ * ========LICENCE========
+ */
+#include <linbox/linbox-config.h>
+#ifdef VERB
+#define KARA_TIMING
+#define FFT_PROFILE
+#endif
+#ifdef VERBINT
+#define INTFFT_TIMING
+#endif
+
+
+#ifdef HAVE_OPENMP
+#include <omp.h>
+#define GIVARO_USES_OMP
+#include <givaro/givtimer.h>
+#define gettime realtime
+typedef Givaro::OMPTimer myTimer;
+#else
+#include <givaro/givtimer.h>
+#define gettime usertime
+typedef Givaro::Timer myTimer;
+#endif
+
+
+#include <functional>
+#include <iostream>
+#include <vector>
+using namespace std;
+#include <linbox/ring/modular.h>
+#include <linbox/randiter/random-prime.h>
+#include <linbox/randiter/random-fftprime.h>
+//#include <linbox/field/unparametric.h>
+#include <givaro/zring.h>
+#include <recint/rint.h>
+#include <linbox/matrix/matrix-domain.h>
+#include <linbox/util/commentator.h>
+#include <linbox/util/timer.h>
+#include <linbox/matrix/polynomial-matrix.h>
+#include <linbox/algorithms/polynomial-matrix/polynomial-matrix-domain.h>
+
+
+#ifdef BENCH_FLINT
+#define __GMP_BITS_PER_MP_LIMB 64
+extern "C" {
+#include "flint/longlong.h"
+#include "flint/ulong_extras.h"
+#include "flint/nmod_poly_mat.h"
+#include "flint/flint.h"
+}
+#endif
+#ifdef BENCH_MMX
+#include <numerix/modular_int.hpp>
+#include <algebramix/polynomial.hpp>
+#include <algebramix/polynomial_modular_int.hpp>
+#include <algebramix/polynomial_tft.hpp>
+#include <algebramix/matrix.hpp>
+#include <algebramix/matrix_modular_int.hpp>
+#include <algebramix/matrix_tft.hpp>
+#define Prime_field(C, n, p) \
+ modular<modulus<C, modulus_int_preinverse<n> >, modular_fixed<int,p> >
+
+#endif
+
+using namespace LinBox;
+
+
+
+
+template <typename Rand, typename Vect>
+void randomVect (Rand& r, Vect& v) {
+ size_t s = v.size();
+ for (size_t i = 0; i < s; ++i)
+ r.random(v[i]);
+}
+
+template <typename Rand, typename Mat>
+void randomMat (Rand& r, Mat& m) {
+ for (size_t i = 0; i < m.rowdim(); ++i)
+ for (size_t j = 0; j < m.coldim(); ++j)
+ r.random(m.refEntry(i,j));
+}
+
+template<typename MatPol>
+bool operator==(const MatPol& A, const MatPol& B){
+ MatrixDomain<typename MatPol::Field> MD(A.field());
+ if (A.size()!=B.size()|| A.rowdim()!= B.rowdim() || A.coldim()!=B.coldim())
+ return false;
+ size_t i=0;
+ while (i<A.size() && MD.areEqual(A[i],B[i]))
+ i++;
+
+ if (i<A.size() && A.rowdim()<10 && A.coldim()<10){
+ cout<<"first:"<<endl<<A<<endl;
+ cout<<"second:"<<endl<<B<<endl;
+ }
+
+ return i==A.size();
+}
+
+/******************************************
+ ****** MATPOLY MUL CHECKING FUNCTION *****
+ ******************************************/
+template<typename T>
+struct congruent{
+ T p;
+ congruent(T _p): p(_p){}
+ bool operator()(T a, T b) const { return (a%p) == (b%p);}
+};
+
+template<typename MULDOM, typename MatPol>
+void MATPOLMUL_sanity_check(MULDOM& MulDom, const MatPol& C, const MatPol& A, const MatPol& B, std::string msg){
+ MatPol CC(C.field(),C.rowdim(),C.coldim(),C.size());
+ //auto Functor = bind(f, &MulDom, ref(CC),A,B);
+ //Functor();
+#ifdef FFT_PROFILER
+ FFT_PROF_LEVEL=3;
+#endif
+ MulDom.mul(CC,A,B);
+ msg+=" ";
+ msg.resize(45,'.');
+ cout<<" Checking ... "<<msg
+ << ((C==CC)?" done":" error")<<endl;
+}
+
+template<typename Field, typename RandIter>
+void check_matpol_mul(const Field& fld, RandIter& Gen, size_t n, size_t d) {
+ typedef PolynomialMatrix<PMType::polfirst,PMStorage::plain,Field> MatrixP;
+ typedef PolynomialMatrix<PMType::matfirst,PMStorage::plain,Field> PMatrix;
+ PMatrix A(fld,n,n,d),B(fld,n,n,d),C(fld,n,n,2*d-1);
+ MatrixP AA(fld,n,n,d),BB(fld,n,n,d),CC(fld,n,n,2*d-1);
+ // Generate random matrix of polynomial
+ for (size_t i=0;i<d;i++){
+ randomMat(Gen,A[i]);
+ randomMat(Gen,B[i]);
+ }
+
+ typedef PolynomialMatrixNaiveMulDomain<Field> Naive;
+ typedef PolynomialMatrixKaraDomain<Field> Kara;
+ typedef PolynomialMatrixFFTMulDomain<Field> FFT;
+
+ Naive NMD(fld);
+ Kara PMKD(fld);
+ FFT PMFFT(fld);
+
+ // compute the correct result
+ for (size_t r=0;r<n;r++)
+ for (size_t c=0;c<n;c++)
+ for (size_t k=0;k<n;k++)
+ for (size_t i=0;i<A.size();i++)
+ for (size_t j=0;j<B.size();j++)
+ fld.axpyin(C.ref(r,c,i+j),A.get(r,k,i),B.get(k,c,j));
+
+
+ // check naive
+ MATPOLMUL_sanity_check(NMD,C,A,B, "Naive Multiplication");
+ // check karatsuba
+ MATPOLMUL_sanity_check(PMKD,C,A,B, "Karatsuba Multiplication");
+
+ AA.copy(A);
+ BB.copy(B);
+ CC.copy(C);
+ // check fft
+ MATPOLMUL_sanity_check(PMFFT,CC,AA,BB, "FFT Multiplication");
+
+ cout<<endl;
+}
+
+
+/***********************************************
+ ****** MATPOLY MUL PERFORMANCE FUNCTION ******
+ ***********************************************/
+template<typename MULDOM, typename MatPol>
+void MATPOLMUL_performance(MULDOM& MulDom, const MatPol& A, const MatPol& B, double Miops, std::string msg){
+ MatPol C(A.field(),A.rowdim(),A.coldim(),A.size()+B.size()-1);
+ //auto Functor = bind(f, &MulDom, ref(C),A,B);
+ Timer chrono;
+ double time;
+ size_t ct,minct=4;
+ size_t prec=6;
+ ct = 0;
+ chrono.start();
+ while (chrono.realElapsedTime() < 1){
+ for (size_t k=0;k<minct;k++)
+ //Functor();
+ MulDom.mul(C,A,B);
+ ct+=minct;
+ }
+
+ time = chrono.userElapsedTime()/ct;
+ Miops/=(1e6*time);
+ msg+=" ";
+ msg.resize(45,'.');
+ cout << "Timings ... " << msg <<" : ";
+ cout.precision(prec);
+ cout.width(10);
+ cout<<fixed<<time << " s, ";
+ cout.precision(2);
+ cout.width(10);
+ cout<<fixed<<Miops << " Miops\n";
+}
+
+
+template<typename Field, typename RandIter>
+void bench_matpol_mul(const Field& fld, RandIter& Gen, size_t n, size_t d) {
+ typedef PolynomialMatrix<PMType::matfirst,PMStorage::plain,Field> MatrixP;
+ MatrixP A(fld,n,n,d),B(fld,n,n,d),C(fld,n,n,2*d-1);
+
+ // Generate random matrix of polynomial
+ for (size_t i=0;i<d;i++){
+ randomMat(Gen,A[i]);
+ randomMat(Gen,B[i]);
+ }
+
+ typedef PolynomialMatrixNaiveMulDomain<Field> Naive;
+ typedef PolynomialMatrixKaraDomain<Field> Kara;
+ typedef PolynomialMatrixFFTMulDomain<Field> FFT;
+
+ Naive NMD(fld);
+ Kara PMKD(fld);
+ FFT PMFFT(fld);
+ size_t mmul=2*n*n*n;
+ size_t madd=n*n;
+ size_t kara=pow((double)d, log(3.)/log(2.));
+ //size_t fft= 17 *d *log(2.*d)/log(2.);
+ size_t costNaive= mmul*d*d + madd*(d-1)*(d-1);
+ size_t costKara = mmul*kara+ 6*madd*kara;
+ //size_t costFFT = mmul*2*d + 3*madd*fft;
+
+#ifdef FFT_PROFILER
+ FFT_PROF_LEVEL=3;
+#endif
+ // bench naive
+ MATPOLMUL_performance(NMD,A,B,costNaive, "Naive Multiplication");
+ // bench karatsuba
+ MATPOLMUL_performance(PMKD,A,B,costKara, "Karatsuba Multiplication");
+ // bench fft
+ //MATPOLMUL_performance(PMFFT,A,B,costFFT, "FFT Multiplication");
+
+
+ Timer chrono;
+#ifdef BENCH_FLINT
+ nmod_poly_mat_t AA,BB,CC;
+ nmod_poly_mat_init(AA,n,n,(uint64_t)fld.cardinality());
+ nmod_poly_mat_init(BB,n,n,(uint64_t)fld.cardinality());
+ nmod_poly_mat_init(CC,n,n,(uint64_t)fld.cardinality());
+ flint_rand_t state;
+ flint_randinit(state);
+ nmod_poly_mat_randtest(AA,state,d);
+ nmod_poly_mat_randtest(BB,state,d);
+ cout<<"-----------------------"<<endl;
+ chrono.start();
+ nmod_poly_mat_mul(CC,AA,BB);
+ cout.precision(6);
+ chrono.stop();
+ cout<<"FLINT Multiplication : "<<chrono.usertime()<<" s"<<endl;
+ chrono.start();
+ nmod_poly_mat_mul_KS(CC,AA,BB);
+ cout.precision(6);
+ chrono.stop();
+ cout<<"FLINT Multiplication KS : "<<chrono.usertime()<<" s"<<endl;
+ chrono.start();
+ nmod_poly_mat_mul_interpolate(CC,AA,BB);
+ cout.precision(6);
+ chrono.stop();
+ cout<<"FLINT Multiplication E/I: "<<chrono.usertime()<<" s"<<endl;
+#endif
+
+
+ cout<<endl;
+}
+
+
+
+template<typename Field, typename RandIter>
+void profile_matpol_mulfft(const Field& fld, RandIter& Gen, size_t n, size_t d) {
+ typedef PolynomialMatrix<PMType::polfirst,PMStorage::plain,Field> MatrixP;
+ MatrixP A(fld,n,n,d),B(fld,n,n,d),C(fld,n,n,2*d-1);
+
+ // Generate random matrix of polynomial
+ for (size_t i=0;i<n*n;i++){
+ randomVect(Gen,A(i));
+ randomVect(Gen,B(i));
+ }
+ std::cout<<n<<" "<<d<<" "<<std::endl;
+ typedef PolynomialMatrixFFTMulDomain<Field> FFT;
+ FFT PMFFT(fld);
+ myTimer chrono;
+ //size_t mmul=2*n*n*n;
+ //size_t madd=n*n;
+ //size_t fft= 17 *d *log(2.*d)/log(2.);
+ //size_t costFFT = mmul*2*d + 3*madd*fft;
+ size_t count=0;
+ chrono.start();
+ do {
+ PMFFT.mul(C,A,B);
+ count++;
+ } while (false);//count<20 && chrono.userElapsedTime()<1);
+ //cout<<"FFT Multiplication total: "<<chrono.userElapsedTime()<<" s, "
+ // <<costFFT/(1e6*chrono.userElapsedTime())<<" Miops"<<endl;
+ chrono.stop();
+ //cout<<chrono.userElapsedTime()/count<<" (";
+ //cout<<chrono.realElapsedTime()/count<<") ";
+ //cout<<chrono.gettime()/count<<" ";
+ cout<<chrono<<" ";
+
+#ifdef BENCH_FLINT
+ nmod_poly_mat_t AA,BB,CC;
+ nmod_poly_mat_init(AA,n,n,(uint64_t)fld.cardinality());
+ nmod_poly_mat_init(BB,n,n,(uint64_t)fld.cardinality());
+ nmod_poly_mat_init(CC,n,n,(uint64_t)fld.cardinality());
+ flint_rand_t state;
+ flint_randinit(state);
+ nmod_poly_mat_randtest(AA,state,d);
+ nmod_poly_mat_randtest(BB,state,d);
+ count=0;
+ chrono.start();
+ do {
+ nmod_poly_mat_mul(CC,AA,BB);
+ count++;
+ } while (false);//(count<20 && chrono.userElapsedTime()<1);
+ cout<<chrono.userElapsedTime()/count<<" (";
+ cout<<chrono.realElapsedTime()/count<<") ";
+ //cout<<"FLINT Multiplication: "<<chrono.userElapsedTime()<<" s, "
+ // <<costFFT/(1e6*chrono.userElapsedTime())<<" Miops"<<endl;
+
+#endif
+
+#ifdef BENCH_MMX
+ {
+ mmx::threads_set_number (1);
+ srand(time(NULL));
+ //typedef mmx::modulus<uint32_t,mmx::modulus_int_preinverse<29> > MOD;
+ // typedef mmx::modulus<uint64_t > MOD;
+ // typedef mmx::modular<MOD> COEFF;
+ // MOD M((uint64_t)fld.cardinality());
+ // COEFF::set_modulus(M);
+ typedef mmx::modular<mmx::modulus<uint32_t,mmx::modulus_int_preinverse<29> >, mmx::modular_fixed<mmx::nat,469762049>> COEFF;
+ //mmx::mmout <<"\n MMX mod :"<< COEFF::get_modulus()<<"\n";
+ typedef mmx::polynomial_tft<mmx::polynomial_naive> PV;
+ typedef mmx::matrix_tft<mmx::matrix_naive> MV;
+ typedef mmx::polynomial<COEFF,PV> POLY;
+ typedef mmx::matrix<POLY,MV> MATRIX;
+ MATRIX AAA(1,n,n), BBB(1,n,n), CCC(1,n,n);
+ for (mmx::nat i=0; i<n; i++)
+ for (mmx::nat j=0; j<n; j++) {
+ mmx::vector<COEFF> vA,vB;
+ for(size_t h=0;h<d;h++){
+ vA<<COEFF(rand()%(uint64_t)fld.cardinality());
+ vB<<COEFF(rand()%(uint64_t)fld.cardinality());
+ }
+ AAA(i,j)=POLY(vA);
+ BBB(i,j)=POLY(vB);
+ //mmx::mmout<<AAA(i,j)<<"\n";
+ //mmx::mmout<<BBB(i,j)<<"\n";
+ }
+ chrono.clear();
+ chrono.start();
+ CCC=AAA*BBB;
+ //mmx::mmout<<CCC;
+ cout<<chrono.userElapsedTime()/count<<" ";
+ }
+#endif
+ cout<<endl;
+}
+
+
+
+template<typename Field, typename RandIter>
+void profile_matpol_mulkara(const Field& fld, RandIter& Gen, size_t n, size_t d) {
+ typedef PolynomialMatrix<PMType::matfirst,PMStorage::plain,Field> MatrixP;
+ MatrixP A(fld,n,n,d),B(fld,n,n,d),C(fld,n,n,2*d-1);
+
+ // Generate random matrix of polynomial
+ for (size_t i=0;i<d;i++){
+ randomMat(Gen,A[i]);
+ randomMat(Gen,B[i]);
+ }
+
+ typedef PolynomialMatrixKaraDomain<Field> Kara;
+ Kara PM(fld);
+ Timer chrono;
+ chrono.start();
+ PM.mul(C,A,B);
+ size_t mmul=2*n*n*n;
+ size_t madd=n*n;
+ size_t kara=pow((double)d, log(3.)/log(2.));
+ size_t costKara = mmul*kara+ 6*madd*kara;
+ cout<<"Kara Multiplication total: "<<chrono.userElapsedTime()<<" s, "
+ <<costKara/(1e6*chrono.userElapsedTime())<<" Miops"<<endl;
+}
+
+
+template<typename Field>
+void runTest(const Field& F, size_t n, long b, long d, long seed, std::string test){
+ //typename Field::RandIter G(F,b,seed);
+ typename Field::RandIter G(F,seed);
+ if (test == "check"|| test == "all")
+ check_matpol_mul(F,G,n,d);
+ if (test == "bench" || test == "all")
+ bench_matpol_mul(F,G,n,d);
+ if (test == "fft")
+ profile_matpol_mulfft(F,G,n,d);
+ if (test == "longfft"){
+ size_t N[15]={16,16,16,16,16,16,16,16, 64,128,256,512,512,1024,2048};
+ size_t D[15]={64,128,256,512,1024,2048,4096,8192,1024,512,256,512,128, 64,32 };
+ for (size_t i=0;i<15;i++)
+ profile_matpol_mulfft(F,G,N[i],D[i]);
+ }
+ if (test == "kara")
+ profile_matpol_mulkara(F,G,n,d);
+}
+
+int main(int argc, char** argv){
+ static size_t n = 32; // matrix dimension
+ static long b = 20; // entries bitsize
+ static uint64_t d = 32; // matrix degree
+ static bool z = false; // computer over Z[x]
+ static long seed = time(NULL);
+ static std::string test ="all";
+
+ static Argument args[] = {
+ { 'n', "-n N", "Set dimension of test matrices to NxN.", TYPE_INT, &n },
+ { 'd', "-d D", "Set degree of test matrices to D.", TYPE_INT, &d },
+ { 'b', "-b B", "Set bitsize of the matrix entries", TYPE_INT, &b },
+ { 'z', "-z y", "Perform the computation over Z[x]", TYPE_BOOL, &z},
+ { 's', "-s s", "Set the random seed to a specific value", TYPE_INT, &seed},
+ { 't', "-t t", "Choose the targeted test {all,check,bench,fft,kara,longfft}", TYPE_STR, &test},
+ END_OF_ARGUMENTS
+ };
+ parseArguments (argc, argv, args);
+
+ if (z){
+#ifdef FFT_PROFILER
+ FFT_PROF_LEVEL=2;
+#endif
+ cout<<"Computation over Z[x] "<<endl;
+ cout<<"++++++++++++++++++++++++++++++++++++"<<endl;
+ Givaro::ZRing<integer> F;
+ runTest (F,n,b,d,seed,test);
+ }
+ else {
+ if (b > 29){
+#ifdef FFT_PROFILER
+ FFT_PROF_LEVEL=2;
+#endif
+ RandomPrimeIter Rd(b,seed);
+ integer p= Rd.random();
+ Givaro::Modular<integer> F(p);
+ //Givaro::Modular<RecInt::ruint128,RecInt::ruint512> F(p);
+ cout<<"Computation over Fp[x] with p= "<<p<<" (Generic prime)"<<endl;
+ cout<<"++++++++++++++++++++++++++++++++++++"<<endl;
+ runTest (F,n,b,d,seed,test);
+ }
+ else {
+#ifdef FFT_PROFILER
+ FFT_PROF_LEVEL=1;
+#endif
+ RandomFFTPrime Rd(1<<b,seed);
+ integer p = Rd.randomPrime(integer(d).bitsize()+1);
+ //Givaro::Modular<int32_t> F((int32_t)p);
+ Givaro::Modular<double> F((int32_t)p);
+ cout<<"Computation over Fp[x] with p= "<<p<<" (FFT prime)"<<endl;
+ cout<<"++++++++++++++++++++++++++++++++++++"<<endl;
+ runTest (F,n,b,d,seed,test);
+ }
+ }
+ return 0;
+}
+
+
+
+
diff --git a/examples/bigmat.C b/examples/bigmat.C
new file mode 100644
index 0000000..4e6897c
--- /dev/null
+++ b/examples/bigmat.C
@@ -0,0 +1,68 @@
+/*
+ * examples/bigmat.C
+ *
+ * Copyright (C) 2007, 2010 B Youse, D. Saunders
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ * ========LICENCE========
+ */
+
+
+/*! @file examples/bigmat.C
+ * @example examples/bigmat.C
+ * \ingroup examples
+ * @brief Outputs a big and very sparse matrix.
+ *
+ * let C be the cyclic shift matrix with 1 on the 1,n position and along the first subdiagonal.
+ *
+ * This matrix is \f$2C + 3I\f$. It has 2 nonzero entries per row and per column.
+ * It is an \f$ n \times n\f$ matrix whose determinant is considerably less than the
+ * Hadamard bound (but is large -- 3^n +- 2^n).
+ *
+ */
+#include <iostream>
+#include <cstdlib>
+using namespace std;
+
+int main(int argc, char* argv[])
+{
+ if (argc != 2 ) {
+ cerr << "Usage: bigmat <n>, where <n> is the size you like." << endl;
+ return -1;
+ }
+
+ int n = atoi(argv[1]);
+ cout << n << " " << n << " M" << endl;
+ cout << "1 1 3" << endl;
+ cout << "1 " << n << " 2" << endl;
+ for (int i = 2; i <=n; ++i)
+ {
+ cout << i << " " << i-1 << " " << 2 << endl;
+ cout << i << " " << i << " " << 3 << endl;
+ }
+ cout << "0 0 0" << endl;
+ return 0 ;
+}
+
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+
diff --git a/examples/blackbox/Makefile.am b/examples/blackbox/Makefile.am
new file mode 100644
index 0000000..f9c1125
--- /dev/null
+++ b/examples/blackbox/Makefile.am
@@ -0,0 +1,44 @@
+# Copyright (c) 2010 the LinBox group
+# This file is part of LinBox
+# ========LICENCE========
+# This file is part of the library LinBox.
+#
+# LinBox is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+#
+# This library 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
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+# ========LICENCE========
+#/
+
+INCLUDES=-I$(top_srcdir)
+
+EXTRA_PROGRAMS = smith example ex-mat0 load-det load-minpoly load-symmetrize random-rank
+#zeroone-rank
+
+AM_CPPFLAGS=-DLinBoxSrcOnly $(NTL_CFLAGS) -DEXAMPLE_DATADIR=\"$(srcdir)/data\"
+LDADD = $(NTL_LIBS) -lgivaro -lclapack -lcblas -latlas $(LDFLAGS)
+
+example_SOURCES = example.C
+smith_SOURCES = smith.C
+load_det_SOURCES = load-det.C
+load_minpoly_SOURCES = load-minpoly.C
+load_symmetrize_SOURCES = load-symmetrize.C
+random_rank_SOURCES = random-rank.C
+#zeroone_rank_SOURCES = zeroone-rank.C
+ex_mat0_SOURCES = ex-mat0.C
+
+# general
+
+%:%.o
+ $(CXXLINK) $(LDFLAGS) $(OBJECTS) $(LDADD) $(LIBS)
+
+
diff --git a/examples/blackbox/ex-mat0.C b/examples/blackbox/ex-mat0.C
new file mode 100644
index 0000000..3673270
--- /dev/null
+++ b/examples/blackbox/ex-mat0.C
@@ -0,0 +1,91 @@
+/*
+ * examples/blackbox/example.C
+ *
+ * Copyright (C) 2003 William J. Turner
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ * ========LICENCE========
+ */
+
+/** @name examples/blackbox/ex-mat0.C
+ * @author William J. Turner for the LinBox group
+ *
+ * @memo usage: ex-mat0 in-file out-file
+ *
+ * @doc
+ * Run tests on Wiedemann algorithm for solving nonhomogeneous linear
+ * equations
+ *
+ * FIXME What does it do? I think this may be a remnant, has evolved
+ * into one of the other examples. delete it?
+ */
+//@{
+
+#include <iostream>
+#include <fstream>
+#include <vector>
+#include <list>
+#include <utility>
+
+#include "linbox/field/modular.h"
+//#include "linbox/blackbox/sparse0.h"
+#include "linbox/blackbox/sparse1.h"
+
+using namespace LinBox;
+using namespace std;
+
+int main(int argc, char* argv[])
+{
+
+ if (argc != 3)
+ { cerr << "usage: " << argv[0] << " in_file out_file" << endl;
+ return -1;
+ }
+ char* in_file = argv[1];
+ char* out_file = argv[2];
+
+ typedef Givaro::Modular<uint32_t> Field;
+ typedef Field::Element Element;
+ typedef Field::RandIter RandIter;
+ typedef std::list< pair<size_t, Element> > Row;
+ typedef std::vector<Element> Vector;
+
+ Field K(7);
+
+ ofstream out_stream(out_file);
+ ifstream in_stream(in_file);
+
+// SparseMatrix<Field, Row, Vector> A(K,4,4);
+// A.read(in_stream);
+// A.write(out_stream);
+
+ SparseBlackBoxDom< Field > A(K) ;
+
+ A.read(in_stream);
+ A.write(out_stream);
+
+}
+//@}
+
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+
diff --git a/examples/blackbox/example.C b/examples/blackbox/example.C
new file mode 100644
index 0000000..0c8cdce
--- /dev/null
+++ b/examples/blackbox/example.C
@@ -0,0 +1,166 @@
+
+/*
+ * examples/blackbox/example.C
+ *
+ * Copyright (C) 2001, 2002, 2010 Bradford Hovinen <hovinen at cis.udel.edu>
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ * ========LICENCE========
+ */
+
+/** @name examples/blackbox/example.C
+ *
+ * @author Bradford Hovinen <hovinen at cis.udel.edu>
+ * @memo
+ * Simple example on Linbox use. Demonstrates loading and application of
+ * blackbox matrix to a vector and computation of the minimal polynomial.
+ * @doc
+ * FIXME what is shown different that in other minpoly example?
+ *
+ */
+//@{
+#include "linbox/linbox-config.h"
+
+#include <iostream>
+#include <fstream>
+#include <vector>
+
+// Field we are working with
+//#include "linbox/field/modular.h"
+#include "linbox/field/givaro-gfq.h"
+
+// Black box classes we are going to work with
+#include "linbox/matrix/sparse-matrix.h"
+
+// Minimal polynomial algorithm
+#include "linbox/solutions/minpoly.h"
+
+#include "linbox/vector/vector-domain.h"
+
+//using namespace LinBox;
+using namespace std;
+
+// This is the field we are going to be working with - integers mod q
+//typedef Givaro::Modular<LinBox::uint32_t> Field;
+typedef LinBox::Givaro::GFq Field;
+
+// Some typedefs to make the type names less daunting
+typedef vector <Field::Element> Vector;
+typedef vector <Field::Element> Polynomial;
+typedef vector <pair <size_t, Field::Element> > Row;
+typedef LinBox::SparseMatrix <Field, VectorTraits<Row>::SparseFormat > Blackbox;
+
+// Constants: we are working with an n x n matrix over GF(q)
+const int n = 10;
+const int q = 101;
+
+void printVector (const Field &F, const Vector &v)
+{
+ int i;
+
+ cout << '(';
+ for (i = 0; i < v.size (); i++) {
+ F.write (cout, v[i]);
+ if (i < v.size () - 1)
+ cout << ", ";
+ }
+ cout << ')' << endl;
+}
+
+void printPolynomial (const Field &F, const Polynomial &v)
+{
+ int i;
+
+ for (i = v.size () - 1; i >= 0; i--) {
+ F.write (cout, v[i]);
+
+ if (i > 0)
+ cout << " x^" << i << " + ";
+ }
+
+ cout << endl;
+}
+
+void makeTestVector (const Field &F, const Blackbox &A, Vector &v)
+{
+ int i;
+
+ v.resize (A.coldim ());
+
+ for (i = 0; i < v.size (); i++)
+ F.init (v[i], i);
+}
+
+void testApply (const Field &F, const Blackbox &A, const Vector &v)
+{
+ Vector w (A.coldim ());
+
+ cout << "v = ";
+ printVector (F, v);
+
+ A.apply (w, v);
+
+ cout << "Av = ";
+ printVector (F, w);
+ cout << endl;
+}
+
+void testMinpoly (const Field &F, const Blackbox &A)
+{
+ Polynomial m_A;
+
+ LinBox::minpoly (m_A, A, F);
+
+ cout << "Minimal polynomial m_A of A is: ";
+ printPolynomial (F, m_A);
+ cout << endl;
+}
+
+/// no command line args
+int main (int argc, char **argv)
+{
+ srand (time (NULL));
+
+ // Construct the field GF(q) and a vector over GF(q)^n to
+ // which to apply the matrix
+ //Field F (q);
+ Field F (2, 15);
+ Vector v (n);
+
+ // Construct and load the sparse test matrix
+ Blackbox A (F, n, n);
+ //ifstream input (EXAMPLE_DATADIR "/test.matrix");
+ ifstream input ("mat.txt");
+ A.read (input);
+
+ // Run tests
+ makeTestVector (F, A, v);
+ testApply (F, A, v);
+ testMinpoly (F, A);
+
+ return 0;
+}
+//@}
+
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+
diff --git a/examples/blackbox/load-det.C b/examples/blackbox/load-det.C
new file mode 100644
index 0000000..7c84097
--- /dev/null
+++ b/examples/blackbox/load-det.C
@@ -0,0 +1,98 @@
+
+
+/*
+ * examples/blackbox/load-det.C
+ *
+ * Copyright (C) 2001, 2002, 2010 Bradford Hovinen <hovinen at cis.udel.edu>
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ * ========LICENCE========
+ */
+
+/** @name examples/blackbox/load-det.C
+ *
+ * @author Bradford Hovinen <hovinen at cis.udel.edu>
+ *
+ * @memo
+ * Small program that loads and computes the determinant of a matrix whose
+ * filename is given on the command line.
+ */
+//@{
+#include "linbox/linbox-config.h"
+
+#include <fstream>
+#include <vector>
+
+#include "linbox/field/modular.h"
+#include "linbox/solutions/det.h"
+
+using namespace LinBox;
+using namespace std;
+
+// Select our field: integers modulo a word-size (max. 31-bit) modulus
+typedef Givaro::Modular<uint32_t> Field;
+
+// Select our black box: a sparse matrix over the above-mentioned field with
+// default application vector and row representation types
+typedef DenseMatrix<Field> Blackbox;
+
+// Constants: we are working with a matrix over GF(q)
+
+/// load-det matrix-file
+int main (int argc, char **argv)
+{
+ Field::Element det_A;
+ int q = 65521U;
+
+ if (argc < 2 || argc > 3) {
+ cerr << "Usage: load-det <matrix> [<p>]" << endl;
+ return -1;
+ }
+
+ commentator().setMaxDepth (2);
+ commentator().setReportStream (cout);
+
+ if (argc == 3) q = atoi(argv[2]);
+ Field F (q);
+
+ Blackbox A (F);
+ ifstream input (argv[1]);
+
+ if (!input) {
+ cerr << "Error: Cannot load matrix " << argv[1] << endl;
+ return -1;
+ }
+
+ A.read (input); // size is determined by the input.
+ cout << "A is " << A.rowdim() << " by " << A.coldim() << endl;
+
+ det (det_A, A, F);
+
+ cout << "Determinant is " << det_A << " mod " << q << endl;
+
+ return 0;
+}
+//@}
+
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+
diff --git a/examples/blackbox/load-minpoly.C b/examples/blackbox/load-minpoly.C
new file mode 100644
index 0000000..9a90022
--- /dev/null
+++ b/examples/blackbox/load-minpoly.C
@@ -0,0 +1,117 @@
+
+/*
+ * examples/blackbox/load-minpoly.C
+ *
+ * Copyright (C) 2001, 2002 Bradford Hovinen <hovinen at cis.udel.edu>
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ * ========LICENCE========
+ */
+
+/** @name examples/blackbox/load-minpoly.C
+ *
+ * @author Bradford Hovinen <hovinen at cis.udel.edu>
+ *
+ * @memo
+ * Small program that loads and computes the minimal polynomial of a matrix
+ * whose filename is given on the command line.
+ */
+//@{
+
+#include "linbox/linbox-config.h"
+
+#include <iostream>
+#include <fstream>
+#include <vector>
+
+#include "linbox/field/modular.h"
+#include "linbox/matrix/sparse-matrix.h"
+#include "linbox/solutions/minpoly.h"
+
+using namespace LinBox;
+using namespace std;
+
+// Select our field: integers modulo a word-size (max. 31-bit) modulus
+typedef Givaro::Modular<uint32_t> Field;
+
+// Select our black box: a sparse matrix over the above-mentioned field with
+// default application vector and row representation types
+typedef SparseMatrix<Field> Blackbox;
+
+// We are using dense vectors to represent polynomials
+typedef Vector<Field>::Dense Polynomial;
+
+// Constants: we are working with an n x n matrix over GF(q)
+const int n = 1000;
+const int q = 65521U;
+
+void printPolynomial (const Field &F, const Polynomial &v)
+{
+ int i;
+
+ for (i = v.size () - 1; i >= 0; i--) {
+ F.write (cout, v[i]);
+
+ if (i > 0)
+ cout << " x^" << i << " + ";
+ }
+
+ cout << endl;
+}
+
+/// load-minpoly matrix-file
+int main (int argc, char **argv)
+{
+ Polynomial m_A;
+
+ if (argc < 2) {
+ cerr << "Usage: load-minpoly <matrix>" << endl;
+ return -1;
+ }
+
+ commentator().setMaxDepth (2);
+ commentator().setReportStream (cout);
+
+ Field F (q);
+
+ Blackbox A (F, n, n);
+ ifstream input (argv[1]);
+
+ if (!input) {
+ cerr << "Error: Cannot load matrix " << argv[1] << endl;
+ return -1;
+ }
+
+ A.read (input);
+
+ minpoly (m_A, A, F);
+
+ cout << "Minimal polynomial is ";
+ printPolynomial (F, m_A);
+
+ return 0;
+}
+//@}
+
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+
diff --git a/examples/blackbox/load-symmetrize.C b/examples/blackbox/load-symmetrize.C
new file mode 100644
index 0000000..f626326
--- /dev/null
+++ b/examples/blackbox/load-symmetrize.C
@@ -0,0 +1,103 @@
+
+/*
+ * examples/blackbox/load-sylletrize.C
+ *
+ * Copyright (C) 2001, 2002, 2010 Bradford Hovinen <hovinen at cis.udel.edu>
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ * ========LICENCE========
+ */
+
+/** @name examples/blackbox/load-symmetrize.C
+ *
+ * @author Bradford Hovinen <hovinen at cis.udel.edu>
+ * @memo
+ * Small program that loads and computes the minimal polynomial of A^T A, where
+ * A is a matrix whose filename is given on the command line
+ */
+//@{
+
+#include "linbox/linbox-config.h"
+
+#include <iostream>
+#include <fstream>
+#include <vector>
+
+#include "linbox/field/modular.h"
+#include "linbox/matrix/sparse-matrix.h"
+#include "linbox/algorithms/blackbox-container-symmetrize.h"
+#include "linbox/algorithms/massey-domain.h"
+
+using namespace LinBox;
+using namespace std;
+
+typedef Givaro::Modular<uint32_t> Field;
+
+typedef vector <Field::Element> Vector;
+typedef vector <Field::Element> Polynomial;
+typedef SparseMatrix <Field, VectorTraits<Vector>::SparseFormat > Blackbox;
+
+// Constants: we are working with an n x n matrix over GF(q)
+const int n = 1000;
+const int q = 65521U;
+
+/// load-symmetrize matrix-file
+int main (int argc, char **argv)
+{
+ if (argc < 2) {
+ cerr << "Usage: load-symmetrize <matrix>" << endl;
+ return -1;
+ }
+
+ commentator().setMaxDepth (2);
+ commentator().setReportStream (cout);
+
+ Field F (q);
+
+ Blackbox A (F, n, n);
+ ifstream input (argv[1]);
+
+ if (!input) {
+ cerr << "Error: Cannot load matrix " << argv[1] << endl;
+ return -1;
+ }
+
+ A.read (input);
+
+ unsigned long deg;
+ std::vector<Field::Element> P;
+
+ BlackboxContainerSymmetrize<Field, Vector> TF (&A, F);
+ MasseyDomain< Field, BlackboxContainerSymmetrize<Field, Vector> > WD (&TF, 20);
+
+ WD.pseudo_minpoly (P, deg);
+
+ cout << "Determinant is " << P[0] << endl;
+ cout << "Degree is " << P.size () - 1 << endl;
+
+ return 0;
+}
+//@}
+
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+
diff --git a/examples/blackbox/mat.txt b/examples/blackbox/mat.txt
new file mode 100644
index 0000000..36fdda9
--- /dev/null
+++ b/examples/blackbox/mat.txt
@@ -0,0 +1,9 @@
+4 4 M
+1 1 1
+1 2 2
+1 3 8
+1 3 9
+2 2 3
+3 0 9
+-1
+
diff --git a/examples/blackbox/mat2.txt b/examples/blackbox/mat2.txt
new file mode 100644
index 0000000..080a01d
--- /dev/null
+++ b/examples/blackbox/mat2.txt
@@ -0,0 +1,6 @@
+2 2 M
+0 0 1
+0 1 2
+1 0 3
+1 1 4
+-1
diff --git a/examples/blackbox/random-rank.C b/examples/blackbox/random-rank.C
new file mode 100644
index 0000000..20414e9
--- /dev/null
+++ b/examples/blackbox/random-rank.C
@@ -0,0 +1,108 @@
+
+/*
+ * examples/blackbox/random-rank.C
+ *
+ * Copyright (C) 2001, 2002, 2010 Bradford Hovinen <hovinen at cis.udel.edu>
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ * ========LICENCE========
+ */
+/** @name examples/blackbox/random-rank.C
+ *
+ * @author Bradford Hovinen <bghovinen at math.uwaterloo.ca>
+ *
+ * @memo rank by several algorithms over large and small fields.
+ * @doc FIXME what's it do more precisely?
+ */
+//@{
+
+#include "linbox/linbox-config.h"
+
+#include <iostream>
+#include <fstream>
+#include <vector>
+
+#include "linbox/field/modular.h"
+#include "linbox/field/givaro-gfq.h"
+#include "linbox/matrix/sparse-matrix.h"
+#include "linbox/solutions/rank.h"
+#include "linbox/solutions/methods.h"
+#include "linbox/vector/stream.h"
+
+using namespace LinBox;
+using namespace std;
+
+// Select our field: integers modulo a word-size (max. 31-bit) modulus
+typedef Givaro::Modular<LinBox::uint32_t> Field;
+typedef Givaro::GFq FieldExtn;
+
+// The Gaussian elimiation code only works with sparse sequence vectors, so we'll use those
+typedef Vector<Field>::SparseSeq Row;
+typedef Vector<FieldExtn>::SparseSeq RowE;
+
+// Select our black box: a sparse matrix over the above-mentioned field with
+// default application vector and row representation types
+typedef SparseMatrix<Field, VectorTraits<Row>::SparseFormat> Blackbox;
+typedef SparseMatrix<FieldExtn, VectorTraits<RowE>::SparseFormat> BlackboxE;
+
+// Constants: we are working with an n x n matrix over GF(q)
+const int n = 1000;
+//const int q = 65521U;
+const int q = 2U;
+const double p = 0.026;
+
+/// no command line args
+int main (int argc, char **argv)
+{
+ unsigned long rank_A_Wiedemann, rank_A_elimination;
+
+ commentator().setMaxDepth (2);
+ commentator().setReportStream (cout);
+
+ Field F (q); Field::RandIter gen(F);
+ FieldExtn E (q, 10); FieldExtn::RandIter Egen(E);
+
+ RandomSparseStream<Field, Row> A_stream (F, gen, p, n, n);
+ RandomSparseStream<FieldExtn, RowE> B_stream (E, Egen, p, n, n);
+
+ Blackbox A (F, A_stream);
+ BlackboxE B (E, B_stream);
+
+ rank (rank_A_Wiedemann, A, F, MethodTrait::Wiedemann ());
+ rank (rank_A_elimination, A, F, MethodTrait::Elimination ());
+
+ cout << "Rank by Wiedemann is " << rank_A_Wiedemann << endl;
+ cout << "Rank by Elimination is " << rank_A_elimination << endl;
+
+ rank (rank_A_Wiedemann, B, E, MethodTrait::Wiedemann ());
+ rank (rank_A_elimination, B, E, MethodTrait::Elimination ());
+
+ cout << "Over Extension Field Rank by Wiedemann is " << rank_A_Wiedemann << endl;
+ cout << "Over Extension Field Rank by Elimination is " << rank_A_elimination << endl;
+
+ return 0;
+}
+//@}
+
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+
diff --git a/examples/blackbox/smith.C b/examples/blackbox/smith.C
new file mode 100644
index 0000000..3e2626d
--- /dev/null
+++ b/examples/blackbox/smith.C
@@ -0,0 +1,576 @@
+/* Copyright (C) LinBox
+ * Written by bds, zw
+ *
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ * ========LICENCE========
+ */
+
+
+/** \file examples/blackbox/smith.C
+ \brief mod m Smith form by elmination
+
+ \author bds & zw
+
+*/
+#include <iostream>
+#include <string>
+#include <vector>
+#include <list>
+
+using namespace std;
+#include "linbox/util/timer.h"
+#include "linbox/field/unparametric.h"
+#include "linbox/field/local2_32.h"
+//#include "linbox/field/PIR-modular-int32.h"
+#include "linbox/algorithms/2local-smith.h"
+#include "linbox/algorithms/local-smith.h"
+#include "linbox/algorithms/iliopoulos-elimination.h"
+
+using namespace LinBox;
+#ifndef BIG
+#include "linbox/field/PIR-modular-int32.h"
+typedef PIRModular<int32_t> PIR;
+#else
+#include "linbox/field/PIR-ntl-ZZ_p.h"
+typedef PIR_ntl_ZZ_p PIR;
+#endif
+
+
+
+template<class PIR>
+void Mat(DenseMatrix<PIR>& M, PIR& R, int n,
+ string src, string file, string format);
+
+template<class I1, class Lp> void distinct (I1 a, I1 b, Lp& c);
+template <class I> void display(I b, I e);
+
+int main(int argc, char* argv[])
+{
+
+ if (argc < 5) {
+
+ cout << "usage: " << argv[0] << " alg m n source format \n" << endl;
+
+ cout << "alg = `adaptive', `ilio', `local', or `2local', \n"
+ << "m is modulus (ignored by 2local, adaptive), "
+ << "n is matrix order, \n"
+ << "source is `random', `random-rough', `fib', `tref', or a filename \n"
+ << "format is `dense' or `sparse' (if matrix from a file)\n"
+ << "compile with -DBIG if you want big integers used.\n";
+
+ return 0;
+ }
+
+ string algo = argv[1];
+
+ int m = atoi(argv[2]);
+
+ int n = atoi(argv[3]);
+
+ string src = argv[4];
+
+ string file = src;
+
+ string format = (argc >= 6 ? argv[5] : "");
+
+ UserTimer T;
+
+ if (algo == "adaptive")
+ {
+ cerr << "adaptive call not implemented yet" << endl;
+ }
+ if (algo == "ilio") {
+
+ PIR R(m);
+
+ DenseMatrix<PIR> M(R);
+
+ Mat(M, R, n, src, file, format);
+
+ T.start();
+
+ IliopoulosElimination::smithIn (M);
+
+ T.stop();
+
+ typedef list< PIR::Element > List;
+
+ List L;
+
+ for (size_t i = 0; i < M.rowdim(); ++i) L.push_back(M[i][i]);
+
+ list<pair<PIR::Element, size_t> > p;
+
+ distinct(L.begin(), L.end(), p);
+
+ cout << "#";
+
+ display(p.begin(), p.end());
+
+ cout << "# ilio, PIR-Modular-int32_t(" << m << "), n = " << n << endl;
+
+ cout << "T" << n << "ilio" << m << " := ";
+ }
+
+ else if (algo == "local") { // m must be a prime power
+
+ PIR R(m);
+
+ DenseMatrix<PIR> M(R);
+
+ Mat(M, R, n, src, file, format);
+
+ typedef list< PIR::Element > List;
+
+ List L;
+
+ LocalSmith<PIR> SmithForm;
+
+ T.start();
+
+ SmithForm( L, M, R );
+
+ T.stop();
+
+ list<pair<PIR::Element, size_t> > p;
+
+ distinct(L.begin(), L.end(), p);
+
+ cout << "#";
+
+ display(p.begin(), p.end());
+
+ cout << "# local, PIR-Modular-int32_t(" << m << "), n = " << n << endl;
+
+ cout << "T" << n << "local" << m << " := ";
+ }
+
+ else if (algo == "2local") {
+
+ Local2_32 R;
+
+ DenseMatrix<Local2_32> M(R);
+
+ Mat(M, R, n, src, file, format);
+
+ typedef list< Local2_32::Element > List;
+
+ List L;
+
+ LocalSmith<Local2_32> SmithForm;
+
+ T.start();
+
+ SmithForm( L, M, R );
+
+ T.stop();
+
+ list<pair<Local2_32::Element, size_t> > p;
+
+ distinct(L.begin(), L.end(), p);
+
+ cout << "#";
+
+ display(p.begin(), p.end());
+
+ cout << "# 2local, Local2_32, n = " << n << endl;
+
+ cout << "T" << n << "local2_32 := ";
+ }
+
+ else {
+
+ printf ("Unknown algorithms\n");
+
+ exit (-1);
+
+ }
+
+ T.print(cout); cout << ";" << endl;
+
+ return 0 ;
+}
+
+/** Output matrix is determined by src which may be:
+ "random-rough"
+ This mat will have s, near sqrt(n), distinct invariant factors,
+ each repeated twice), involving the s primes 101, 103, ...
+ "random"
+ This mat will have the same nontrivial invariant factors as
+ diag(1,2,3,5,8, ... 999, 0, 1, 2, ...).
+ "fib"
+ This mat will have the same nontrivial invariant factors as
+ diag(1,2,3,5,8, ... fib(k)), where k is about sqrt(n).
+ The basic matrix is block diagonal with i-th block of order i and
+ being a tridiagonal {-1,0,1} matrix whose snf = diag(i-1 1's, fib(i)),
+ where fib(1) = 1, fib(2) = 2. But note that, depending on n,
+ the last block may be truncated, thus repeating an earlier fibonacci number.
+ "file" (or any other string)
+ mat read from named file with format "sparse" or "dense".
+ Also "tref" and file with format "kdense"
+ */
+template <class PIR>
+
+void Mat(DenseMatrix<PIR>& M, PIR& R, int n,
+ string src, string file, string format) {
+
+ if (src == "random-rough") RandomRoughMat(M, R, n);
+
+ else if (src == "random") RandomFromDiagMat(M, R, n);
+
+ else if (src == "fib") RandomFibMat(M, R, n);
+
+ else if (src == "tref") TrefMat(M, R, n);
+
+ else // from file
+ {
+
+ int rdim, cdim;
+
+ std::ifstream in (file.c_str(), std::ios::in);
+ if (! in) { cerr << "error: unable to open file" << endl; exit(-1); }
+
+ in >> rdim >> cdim;
+
+ M. resize (rdim, cdim);
+
+
+ if (format == "dense" ) {
+ int val;
+
+ for (int i = 0; i < rdim; ++ i)
+
+ for ( int j = 0; j < cdim; ++ j) {
+
+ in >> val;
+
+ R. init (M[i][j], val);
+
+ }
+ }
+
+ else if (format == "sparse") {
+
+ int i, j;
+
+ char mark;
+
+ in >> mark;
+
+ LinBox::integer val;
+
+ do {
+
+ in >> i >> j;
+ in. ignore (1);
+ in >> val;
+
+ if ( i == 0) break;
+
+ R. init (M[i-1][j-1], val);
+
+ } while (true);
+
+ }
+ //Krattenthaler's q^e matrices, given by exponent
+ else if (format == "kdense") KratMat(M, R, n, in);
+
+ else {
+
+ cout << "Format: " << format << " Unknown\n";
+
+ exit (-1);
+
+ }
+ }
+
+ /*show some entries
+ for (int k = 0; k < 10; ++k)
+ cout << M.getEntry(0,k) << " " << M.getEntry(M.rowdim()-1, M.coldim()-1 - k) << endl;
+ cout << endl << M.rowdim() << " " << M.coldim() << endl;
+ */
+
+ /* some row ops and some col ops */
+} // Mat
+
+// This mat will have s, near sqrt(n), distinct invariant factors,
+// each repeated twice), involving the s primes 101, 103, ...
+template <class PIR>
+void RandomRoughMat(DenseMatrix<PIR>& M, PIR& R, int n) {
+ M.resize(n, n, R.zero);
+ if (n > 10000) {cerr << "n too big" << endl; exit(-1);}
+ int jth_factor[130] =
+ {2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67,
+ 71, 73, 79, 83, 89, 97, 101, 103, 107, 109, 113, 127, 131, 137, 139, 149,
+ 151, 157, 163, 167, 173, 179, 181, 191, 193, 197, 199, 211, 223, 227, 229,
+ 233, 239, 241, 251, 257, 263, 269, 271, 277, 281, 283, 293, 307, 311, 313,
+ 317, 331, 337, 347, 349, 353, 359, 367, 373, 379, 383, 389, 397, 401, 409,
+ 419, 421, 431, 433, 439, 443, 449, 457, 461, 463, 467, 479, 487, 491, 499,
+ 503, 509, 521, 523, 541, 547, 557, 563, 569, 571, 577, 587, 593, 599, 601,
+ 607, 613, 617, 619, 631, 641, 643, 647, 653, 659, 661, 673, 677, 683, 691,
+ 701, 709, 719, 727, 733};
+
+ for (int j= 0, i = 0 ; i < n; ++j)
+ {
+ typename PIR::Element v; R.init(v, jth_factor[25+j]);
+ for (int k = j ; k > 0 && i < n ; --k)
+ { M[i][i] = v; ++i;
+ if (i < n) {M[i][i] = v; ++i;}
+ }
+ }
+ scramble(M);
+}
+
+// This mat will have the same nontrivial invariant factors as
+// diag(1,2,3,5,8, ... 999, 0, 1, 2, ...).
+template <class PIR>
+void RandomFromDiagMat(DenseMatrix<PIR>& M, PIR& R, int n) {
+ M.resize(n, n, R.zero);
+
+ for (int i= 0 ; i < n; ++i)
+
+ R.init(M[i][i], i % 1000 + 1);
+ scramble(M);
+
+}
+
+// This mat will have the same nontrivial invariant factors as
+// diag(1,2,3,5,8, ... fib(k)), where k is about sqrt(n).
+// The basic matrix is block diagonal with i-th block of order i and
+// being a tridiagonal {-1,0,1} matrix whose snf = diag(i-1 1's, fib(i)),
+// where fib(1) = 1, fib(2) = 2. But note that, depending on n,
+// the last block may be truncated, thus repeating an earlier fibonacci number.
+template <class PIR>
+void RandomFibMat(DenseMatrix<PIR>& M, PIR& R, int n) {
+ M.resize(n, n, R.zero);
+
+ typename PIR::Element pmone; R.assign(pmone, R.one);
+
+ for (int i= 0 ; i < n; ++i) M[i][i] = R.one;
+
+ int j = 1, k = 0;
+
+ for (int i= 0 ; i < n-1; ++i) {
+
+ if ( i == k) {
+
+ M[i][i+1] = R.zero;
+
+ k += ++j;
+ }
+
+ else {
+
+ M[i][i+1] = pmone;
+
+ R.negin(pmone);
+ }
+ R.neg(M[i+1][i], M[i][i+1]);
+ }
+ scramble(M);
+}
+
+template < class Ring >
+void scramble(DenseMatrix<Ring>& M)
+{
+
+ Ring R = M.field();
+
+ int N,n = M.rowdim(); // number of random basic row and col ops.
+ N = n;
+
+ for (int k = 0; k < N; ++k) {
+
+ int i = rand()%M.rowdim();
+
+ int j = rand()%M.coldim();
+
+ if (i == j) continue;
+
+ // M*i += alpha M*j and Mi* += beta Mj
+
+ //int a = rand()%2;
+ int a = 0;
+
+ for (size_t l = 0; l < M.rowdim(); ++l) {
+
+ if (a)
+
+ R.subin(M[l][i], M[l][j]);
+
+ else
+
+ R.addin(M[l][i], M[l][j]);
+
+ //K.axpy(c, M.getEntry(l, i), x, M.getEntry(l, j));
+ //M.setEntry(l, i, c);
+ }
+
+ //a = rand()%2;
+
+ for (size_t l = 0; l < M.coldim(); ++l) {
+
+ if (a)
+
+ R.subin(M[i][l], M[j][l]);
+ else
+
+ R.addin(M[i][l], M[j][l]);
+ }
+ }
+
+ std::ofstream out("matrix", std::ios::out);
+
+ //M. write(std::cout);
+
+ out << n << " " << n << "\n";
+
+ for (int i = 0; i < n; ++ i) {
+
+ for ( int j = 0; j < n; ++ j) {
+
+ R. write(out, M[i][j]);
+
+ out << " ";
+ }
+
+ out << "\n";
+
+ }
+
+ //}
+}
+
+//////////////////////////////////
+// special mats tref and krat
+
+// Trefethen's challenge #7 mat (primes on diag, 1's on 2^e bands).
+template <class PIR>
+void TrefMat(DenseMatrix<PIR>& M, PIR& R, int n) {
+ M.resize(n, n, R.zero);
+
+ std::vector<int> power2;
+
+ int i = 1;
+
+ do {
+
+ power2. push_back(i);
+
+ i *= 2;
+ } while (i < n);
+
+ std::ifstream in ("prime", std::ios::in);
+
+ for ( i = 0; i < n; ++ i)
+
+ in >> M[i][i];
+
+ std::vector<int>::iterator p;
+
+ for ( i = 0; i < n; ++ i) {
+
+ for ( p = power2. begin(); (p != power2. end()) && (*p <= i); ++ p)
+ M[i][i - *p] = 1;
+
+ for ( p = power2. begin(); (p != power2. end()) && (*p < n - i); ++ p)
+ M[i][i + *p] = 1;
+ }
+
+}
+//// end tref /////// begin krat /////////////////////////////
+
+struct pwrlist
+{
+ vector<integer> m;
+ pwrlist(integer q)
+ { m.push_back(1); m.push_back(q); //cout << "pwrlist " << m[0] << " " << m[1] << endl;
+ }
+ integer operator[](int e)
+ {
+ for (int i = m.size(); i <= e; ++i) m.push_back(m[1]*m[i-1]);
+ return m[e];
+ }
+};
+
+// Read "1" or "q" or "q^e", for some (small) exponent e.
+// Return value of the power of q at q = _q.
+template <class num>
+num& qread(num& val, pwrlist& M, istream& in)
+{
+ char c;
+ in >> c; // next nonwhitespace
+ if (c == '0') return val = 0;
+ if (c == '1') return val = 1;
+ if (c != 'p' && c != 'q') { cout << "exiting due to unknown char " << c << endl; exit(-1);}
+ in.get(c);
+ if (c !='^') {in.putback(c); return val = M[1];}
+ else
+ { int expt; in >> expt;
+ return val = M[expt];
+ };
+}
+
+template <class PIR>
+void KratMat(DenseMatrix<PIR>& M, PIR& R, int q, istream& in)
+{
+ pwrlist pwrs(q);
+ for (int i = 0; i < M.rowdim(); ++ i)
+
+ for ( int j = 0; j < M.coldim(); ++ j) {
+ int /* e,*/ val;
+ qread(val, pwrs, in);
+ R. init (M[i][j], val);
+ }
+}
+
+///// end krat ////////////////////////////
+template<class I1, class Lp>
+void distinct (I1 a, I1 b, Lp& c)
+{ typename I1::value_type e;
+ size_t count = 0;
+ if (a != b) {e = *a; ++a; count = 1;}
+ else return;
+ while (a != b)
+ { if (*a == e) ++count;
+ else
+ { c.push_back(typename Lp::value_type(e, count));
+ e = *a; count = 1;
+ }
+ ++a;
+ }
+ c.push_back(typename Lp::value_type(e, count));
+ return;
+}
+template <class I>
+void display(I b, I e)
+{ cout << "(";
+ for (I p = b; p != e; ++p) cout << p->first << " " << p->second << ", ";
+ cout << ")" << endl;
+}
+//@}
+
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+
diff --git a/examples/charpoly.C b/examples/charpoly.C
index fd73e79..b99eb76 100644
--- a/examples/charpoly.C
+++ b/examples/charpoly.C
@@ -26,24 +26,26 @@
\brief Characteristic polynomial of matrix over Z or Zp.
\ingroup examples
*/
+#include <linbox/linbox-config.h>
+
#include <iostream>
#include <iomanip>
-#include "linbox/util/timer.h"
-#include "linbox/field/modular.h"
-#include "linbox/field/unparametric.h"
-#include "linbox/blackbox/sparse.h"
+#include <linbox/util/timer.h>
+#include <linbox/ring/modular.h>
+#include <givaro/zring.h>
+#include <linbox/matrix/sparse-matrix.h>
using namespace std;
-#include "linbox/solutions/charpoly.h"
-#include "linbox/ring/givaro-polynomial.h"
+#include <linbox/solutions/charpoly.h>
+#include <givaro/givpoly1.h>
using namespace LinBox;
template <class Field, class Polynomial>
std::ostream& printPolynomial (std::ostream& out, const Field &F, const Polynomial &v)
{
- for (int i = v.size () - 1; i >= 0; i--) {
- F.write (out, v[i]);
+ for (int i = (int)(v.size () - 1); i >= 0; i--) {
+ F.write (out, v[(size_t)i]);
if (i > 0)
out << " X^" << i << " + ";
}
@@ -62,9 +64,9 @@ std::ostream& prettyprintIntegerPolynomial (std::ostream& out, const Field &F, c
out << 'X';
if (n > 1) out << '^' << n;
for (int i = (int)n - 1; i > 0; i--) {
- if (v[i] != 0) {
- if (v[i] >0) out << " + ";
- if (v[i] != 1) F.write (out, v[i]) << '*';
+ if (v[(size_t)i] != 0) {
+ if (v[(size_t)i] >0) out << " + ";
+ if (v[(size_t)i] != 1) F.write (out, v[(size_t)i]) << '*';
out << 'X';
if (i > 1) out << '^' << i;
}
@@ -83,13 +85,15 @@ std::ostream& printFactorization (std::ostream& out, const Field &F, const Facto
typename Factors::const_iterator itf = f.begin();
typename Exponents::const_iterator ite = exp.begin();
for ( ; itf != f.end(); ++itf, ++ite) {
- prettyprintIntegerPolynomial(out << '(', F, *(*itf)) << ')';
+ prettyprintIntegerPolynomial(out << '(', F, *itf) << ')';
if (*ite > 1) out << '^' << *ite;
out << endl;
}
return out;
}
+typedef Givaro::ZRing<Givaro::Integer> IntDom;
+
int main (int argc, char **argv)
{
commentator().setMaxDetailLevel (2);
@@ -108,69 +112,64 @@ int main (int argc, char **argv)
if (argc == 2) {
- PID_integer ZZ;
- BlasMatrix<PID_integer > A (ZZ);
+ IntDom ZZ;
+ DenseMatrix<IntDom > A (ZZ);
A.read (input);
- typedef GivPolynomialRing<PID_integer, Givaro::Dense> IntPolRing;
- IntPolRing::Element c_A;
+ typedef Givaro::Poly1FactorDom<IntDom> IntPolRing;
+ DenseVector<IntDom> c_A(ZZ);
Timer tim; tim.clear();tim.start();
charpoly (c_A, A, Method::Blackbox());
tim.stop();
cout << "Characteristic Polynomial is ";
- //printPolynomial (cout, ZZ, c_A) << endl;
+ printPolynomial (cout, ZZ, c_A) << endl;
cout << tim << endl;
-#ifdef __LINBOX_HAVE_NTL
cout << "Do you want a factorization (y/n) ? ";
char tmp;
cin >> tmp;
if (tmp == 'y' || tmp == 'Y') {
commentator().start("Integer Polynomial factorization by NTL", "NTLfac");
- vector<IntPolRing::Element*> intFactors;
- vector<unsigned long> exp;
+ vector<IntPolRing::Element> intFactors;
+ vector<uint64_t> exp;
IntPolRing IPD(ZZ);
tim.start();
- IPD.factor (intFactors, exp, c_A);
+ IPD.factor (intFactors, exp, IntPolRing::Element(c_A.getRep().begin(),c_A.getRep().end()));
tim.stop();
commentator().stop("done", NULL, "NTLfac");
printFactorization(cout << intFactors.size() << " integer polynomial factors:" << endl, ZZ, intFactors, exp) << endl;
- vector<IntPolRing::Element*>::const_iterator itf = intFactors.begin();
- for ( ; itf != intFactors.end(); ++itf)
- delete *itf;
cout << tim << endl;
}
-#endif
}
if (argc == 3) {
- typedef Modular<double> Field;
+ typedef Givaro::Modular<double> Field;
double q = atof(argv[2]);
Field F(q);
- BlasMatrix<Field> B (F);
+ DenseMatrix<Field> B (F);
B.read (input);
cout << "B is " << B.rowdim() << " by " << B.coldim() << endl;
- GivPolynomialRing<Field, Givaro::Dense>::Element c_B;
+// Givaro::Poly1Dom<Field, Givaro::Dense>::Element c_B;
+ DenseVector<Field> c_B(F);
Timer tim; tim.clear();tim.start();
charpoly (c_B, B);
tim.stop();
cout << "Characteristic Polynomial is ";
- //printPolynomial (cout, F, c_B) << endl;
+ printPolynomial (cout, F, c_B) << endl;
cout << tim << endl;
}
return 0;
}
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
// Local Variables:
// mode: C++
// tab-width: 8
// indent-tabs-mode: nil
// c-basic-offset: 8
// End:
-
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/examples/checksolve.C b/examples/checksolve.C
index f414193..95ea611 100644
--- a/examples/checksolve.C
+++ b/examples/checksolve.C
@@ -25,13 +25,13 @@
\brief Solving of sparse matrix over Z or Zp.
\ingroup examples
*/
-//#include "linbox-config.h"
+#include <linbox/linbox-config.h>
#include <iostream>
-#include "linbox/field/modular.h"
-#include "linbox/solutions/solve.h"
-#include "linbox/util/matrix-stream.h"
-#include "linbox/solutions/methods.h"
+#include <linbox/ring/modular.h>
+#include <linbox/solutions/solve.h>
+#include <linbox/util/matrix-stream.h>
+#include <linbox/solutions/methods.h>
using namespace LinBox;
// using namespace std;
@@ -58,16 +58,16 @@ int main (int argc, char **argv)
if (!input) { std::cerr << "Error opening vector file " << argv[2] << std::endl; return -1; }
- typedef Modular<double> Field;
+ typedef Givaro::Modular<double> Field;
double q = atof(argv[3]);
Field F(q);
MatrixStream< Field > ms ( F, input );
- BlasMatrix<Field> A (ms); // A.write(std::cout);
+ DenseMatrix<Field> A (ms); // A.write(std::cout);
std::cout << "A is " << A.rowdim() << " by " << A.coldim() << std::endl;
- std::vector<Field::Element> X( A.coldim()),B(A.rowdim());
+ DenseVector<Field> X(F, A.coldim()),B(F, A.rowdim());
- for(std::vector<Field::Element>::iterator it=B.begin();
+ for(DenseVector<Field>::iterator it=B.begin();
it != B.end(); ++it)
invect >> *it;
@@ -76,9 +76,9 @@ int main (int argc, char **argv)
solve (X, A, B, Method::BlasElimination());
std::cout << "(BlasElimination) Solution is [ "<<X<< "]" << std::endl;
- std::vector<Field::Element> r(A.rowdim());
+ DenseVector<Field> r(F, A.rowdim());
BlasMatrixDomain<Field> BMD(F);
- BMD.mul(r, static_cast<BlasMatrix<Field>& >(A), X);
+ BMD.mul(r, static_cast<DenseMatrix<Field>& >(A), X);
//A.apply (r,X);
VectorDomain<Field> VD(F);
if (VD.areEqual (r,B))
diff --git a/examples/data/Makefile.am b/examples/data/Makefile.am
new file mode 100644
index 0000000..0bfbb0a
--- /dev/null
+++ b/examples/data/Makefile.am
@@ -0,0 +1,23 @@
+# Copyright (c) 2010 the LinBox group
+# This file is part of LinBox
+# ========LICENCE========
+# This file is part of the library LinBox.
+#
+# LinBox is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+#
+# This library 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
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+# ========LICENCE========
+#/
+
+EXTRA_DIST = \
+ test.matrix
diff --git a/examples/data/mat.txt b/examples/data/mat.txt
new file mode 100644
index 0000000..4b327b2
--- /dev/null
+++ b/examples/data/mat.txt
@@ -0,0 +1,8 @@
+4 4 M
+1 1 1
+1 2 2
+1 3 8
+1 4 9
+2 2 3
+3 1 9
+0 0 0
diff --git a/examples/data/mat2.txt b/examples/data/mat2.txt
new file mode 100644
index 0000000..ecc2cc4
--- /dev/null
+++ b/examples/data/mat2.txt
@@ -0,0 +1,6 @@
+2 2 M
+1 1 1
+1 2 2
+2 1 3
+2 2 4
+0 0 0
diff --git a/examples/data/test.matrix b/examples/data/test.matrix
new file mode 100644
index 0000000..ee4f31a
--- /dev/null
+++ b/examples/data/test.matrix
@@ -0,0 +1,28 @@
+10 10 M
+1 2 7
+1 3 83
+1 7 38
+2 1 6
+2 4 16
+2 9 24
+3 5 56
+3 6 79
+3 7 61
+4 7 65
+4 8 9
+4 9 98
+5 1 27
+5 9 87
+6 4 57
+6 6 28
+6 8 35
+7 1 93
+7 4 43
+7 8 95
+8 2 94
+8 3 40
+9 2 66
+9 8 60
+9 9 21
+10 10 1
+0 0 0
diff --git a/examples/data/wikivote b/examples/data/wikivote
new file mode 100644
index 0000000..0cef96c
--- /dev/null
+++ b/examples/data/wikivote
@@ -0,0 +1,103691 @@
+8297 8297 M
+30 1412 1
+30 3352 1
+30 5254 1
+30 5543 1
+30 7478 1
+3 28 1
+3 30 1
+3 39 1
+3 54 1
+3 108 1
+3 152 1
+3 178 1
+3 182 1
+3 214 1
+3 271 1
+3 286 1
+3 300 1
+3 348 1
+3 349 1
+3 371 1
+3 567 1
+3 581 1
+3 584 1
+3 586 1
+3 590 1
+3 604 1
+3 611 1
+3 8283 1
+25 3 1
+25 6 1
+25 8 1
+25 19 1
+25 23 1
+25 28 1
+25 29 1
+25 30 1
+25 33 1
+25 35 1
+25 50 1
+25 54 1
+25 55 1
+25 75 1
+25 80 1
+25 86 1
+25 94 1
+25 127 1
+25 152 1
+25 154 1
+25 182 1
+25 192 1
+25 214 1
+25 224 1
+25 226 1
+25 246 1
+25 252 1
+25 255 1
+25 257 1
+25 261 1
+25 271 1
+25 273 1
+25 280 1
+25 282 1
+25 286 1
+25 299 1
+25 300 1
+25 302 1
+25 306 1
+25 308 1
+25 310 1
+25 322 1
+25 325 1
+25 339 1
+25 348 1
+25 349 1
+25 356 1
+25 358 1
+25 363 1
+25 370 1
+25 371 1
+25 373 1
+25 377 1
+25 379 1
+25 407 1
+25 415 1
+25 422 1
+25 428 1
+25 439 1
+25 488 1
+25 514 1
+25 545 1
+25 549 1
+25 560 1
+25 590 1
+25 592 1
+25 600 1
+25 604 1
+25 611 1
+25 645 1
+25 650 1
+25 659 1
+25 664 1
+25 667 1
+25 673 1
+25 675 1
+25 696 1
+25 706 1
+25 723 1
+25 739 1
+25 756 1
+25 857 1
+25 864 1
+25 893 1
+25 959 1
+25 994 1
+25 1131 1
+25 3755 1
+25 8282 1
+25 8284 1
+4 8 1
+4 10 1
+4 28 1
+4 30 1
+4 38 1
+4 55 1
+4 56 1
+4 75 1
+4 130 1
+4 140 1
+4 147 1
+4 151 1
+4 152 1
+4 214 1
+4 232 1
+4 243 1
+4 282 1
+4 299 1
+4 341 1
+4 363 1
+4 370 1
+4 415 1
+4 560 1
+4 606 1
+4 611 1
+4 645 1
+4 650 1
+4 659 1
+4 8282 1
+5 6 1
+5 8 1
+5 10 1
+5 23 1
+5 30 1
+5 33 1
+5 38 1
+5 50 1
+5 54 1
+5 55 1
+5 61 1
+5 75 1
+5 89 1
+5 93 1
+5 127 1
+5 130 1
+5 147 1
+5 153 1
+5 163 1
+5 167 1
+5 168 1
+5 175 1
+5 299 1
+6 3 1
+6 8 1
+6 10 1
+6 19 1
+6 23 1
+6 28 1
+6 29 1
+6 30 1
+6 33 1
+6 34 1
+6 35 1
+6 38 1
+6 39 1
+6 50 1
+6 54 1
+6 55 1
+6 56 1
+6 61 1
+6 80 1
+6 86 1
+6 89 1
+6 93 1
+6 94 1
+6 127 1
+6 130 1
+6 132 1
+6 135 1
+6 140 1
+6 147 1
+6 151 1
+6 153 1
+6 154 1
+6 163 1
+6 167 1
+6 168 1
+6 171 1
+6 175 1
+6 178 1
+6 182 1
+6 183 1
+6 216 1
+6 219 1
+6 226 1
+6 227 1
+6 228 1
+6 232 1
+6 236 1
+6 243 1
+6 250 1
+6 252 1
+6 257 1
+6 258 1
+6 259 1
+6 261 1
+6 271 1
+6 273 1
+6 274 1
+6 280 1
+6 285 1
+6 286 1
+6 290 1
+6 298 1
+6 299 1
+6 300 1
+6 301 1
+6 304 1
+6 306 1
+6 317 1
+6 319 1
+6 322 1
+6 325 1
+6 339 1
+6 348 1
+6 349 1
+6 356 1
+6 358 1
+6 359 1
+6 362 1
+6 363 1
+6 370 1
+6 371 1
+6 373 1
+6 377 1
+6 378 1
+6 379 1
+6 390 1
+6 391 1
+6 392 1
+6 394 1
+6 396 1
+6 402 1
+6 405 1
+6 406 1
+6 407 1
+6 415 1
+6 421 1
+6 422 1
+6 427 1
+6 428 1
+6 431 1
+6 432 1
+6 433 1
+6 435 1
+6 439 1
+6 440 1
+6 447 1
+6 538 1
+6 545 1
+6 549 1
+6 560 1
+6 564 1
+6 566 1
+6 567 1
+6 579 1
+6 581 1
+6 584 1
+6 586 1
+6 589 1
+6 590 1
+6 592 1
+6 600 1
+6 604 1
+6 609 1
+6 611 1
+6 613 1
+6 616 1
+6 617 1
+6 619 1
+6 643 1
+6 656 1
+6 659 1
+6 665 1
+6 668 1
+6 673 1
+6 691 1
+6 694 1
+6 700 1
+6 704 1
+6 717 1
+6 723 1
+6 730 1
+6 733 1
+6 739 1
+6 741 1
+6 761 1
+6 765 1
+6 779 1
+6 789 1
+6 791 1
+6 798 1
+6 802 1
+6 813 1
+6 820 1
+6 826 1
+6 857 1
+6 863 1
+6 871 1
+6 881 1
+6 885 1
+6 893 1
+6 895 1
+6 897 1
+6 904 1
+6 906 1
+6 907 1
+6 913 1
+6 922 1
+6 932 1
+6 936 1
+6 955 1
+6 960 1
+6 963 1
+6 966 1
+6 971 1
+6 972 1
+6 978 1
+6 979 1
+6 983 1
+6 991 1
+6 993 1
+6 995 1
+6 1007 1
+6 1014 1
+6 1022 1
+6 1026 1
+6 1032 1
+6 1035 1
+6 1043 1
+6 1055 1
+6 1062 1
+6 1125 1
+6 1144 1
+6 1152 1
+6 1156 1
+6 1160 1
+6 1167 1
+6 1168 1
+6 1218 1
+6 1220 1
+6 1221 1
+6 1222 1
+6 1234 1
+6 1241 1
+6 1248 1
+6 1253 1
+6 1261 1
+6 1297 1
+6 1321 1
+6 1326 1
+6 1377 1
+6 1389 1
+6 1390 1
+6 1394 1
+6 1396 1
+6 1428 1
+6 1439 1
+6 1441 1
+6 1442 1
+6 1446 1
+6 1453 1
+6 1464 1
+6 1465 1
+6 1468 1
+6 1471 1
+6 1472 1
+6 1476 1
+6 1478 1
+6 1484 1
+6 1485 1
+6 1487 1
+6 1489 1
+6 1490 1
+6 1497 1
+6 1501 1
+6 1506 1
+6 1507 1
+6 1513 1
+6 1514 1
+6 1518 1
+6 1524 1
+6 1525 1
+6 1531 1
+6 1532 1
+6 1533 1
+6 1538 1
+6 1549 1
+6 1555 1
+6 1556 1
+6 1557 1
+6 1563 1
+6 1569 1
+6 1573 1
+6 1587 1
+6 1597 1
+6 1610 1
+6 1619 1
+6 1641 1
+6 1648 1
+6 1652 1
+6 1654 1
+6 1657 1
+6 1662 1
+6 1669 1
+6 1679 1
+6 1689 1
+6 1692 1
+6 1701 1
+6 1716 1
+6 1718 1
+6 1752 1
+6 1758 1
+6 1768 1
+6 1774 1
+6 1783 1
+6 1787 1
+6 1788 1
+6 1798 1
+6 1861 1
+6 1864 1
+6 1982 1
+6 2409 1
+6 2651 1
+6 2843 1
+6 2909 1
+6 3755 1
+6 3892 1
+6 4037 1
+6 4134 1
+6 4792 1
+6 4942 1
+6 5323 1
+6 5697 1
+6 6227 1
+6 6330 1
+6 6624 1
+6 6765 1
+6 6790 1
+6 6965 1
+6 7161 1
+6 7632 1
+6 8282 1
+6 8290 1
+7 6 1
+7 28 1
+7 30 1
+7 32 1
+7 35 1
+7 38 1
+7 54 1
+7 55 1
+7 61 1
+7 75 1
+7 93 1
+7 105 1
+7 228 1
+7 259 1
+7 271 1
+7 299 1
+7 524 1
+7 1190 1
+7 1193 1
+7 1425 1
+7 1471 1
+7 1919 1
+7 8283 1
+7 8287 1
+8 6 1
+8 10 1
+8 19 1
+8 23 1
+8 28 1
+8 30 1
+8 33 1
+8 34 1
+8 36 1
+8 39 1
+8 49 1
+8 50 1
+8 54 1
+8 55 1
+8 56 1
+8 61 1
+8 75 1
+8 80 1
+8 86 1
+8 89 1
+8 127 1
+8 130 1
+8 132 1
+8 135 1
+8 140 1
+8 144 1
+8 150 1
+8 151 1
+8 152 1
+8 153 1
+8 154 1
+8 163 1
+8 167 1
+8 168 1
+8 175 1
+8 178 1
+8 182 1
+8 183 1
+8 192 1
+8 214 1
+8 216 1
+8 219 1
+8 224 1
+8 226 1
+8 232 1
+8 236 1
+8 243 1
+8 250 1
+8 252 1
+8 255 1
+8 258 1
+8 261 1
+8 271 1
+8 273 1
+8 274 1
+8 280 1
+8 282 1
+8 286 1
+8 299 1
+8 300 1
+8 301 1
+8 308 1
+8 310 1
+8 319 1
+8 322 1
+8 339 1
+8 341 1
+8 348 1
+8 349 1
+8 356 1
+8 358 1
+8 362 1
+8 363 1
+8 370 1
+8 371 1
+8 373 1
+8 377 1
+8 378 1
+8 379 1
+8 389 1
+8 390 1
+8 391 1
+8 392 1
+8 394 1
+8 396 1
+8 402 1
+8 405 1
+8 406 1
+8 415 1
+8 421 1
+8 422 1
+8 427 1
+8 428 1
+8 431 1
+8 432 1
+8 433 1
+8 435 1
+8 439 1
+8 440 1
+8 488 1
+8 506 1
+8 514 1
+8 524 1
+8 538 1
+8 549 1
+8 560 1
+8 564 1
+8 566 1
+8 567 1
+8 581 1
+8 584 1
+8 586 1
+8 587 1
+8 589 1
+8 590 1
+8 592 1
+8 600 1
+8 604 1
+8 606 1
+8 607 1
+8 609 1
+8 611 1
+8 613 1
+8 616 1
+8 617 1
+8 622 1
+8 624 1
+8 627 1
+8 628 1
+8 631 1
+8 636 1
+8 637 1
+8 645 1
+8 650 1
+8 656 1
+8 657 1
+8 658 1
+8 659 1
+8 664 1
+8 665 1
+8 667 1
+8 668 1
+8 673 1
+8 674 1
+8 675 1
+8 677 1
+8 681 1
+8 687 1
+8 706 1
+8 715 1
+8 719 1
+8 723 1
+8 725 1
+8 739 1
+8 741 1
+8 749 1
+8 756 1
+8 760 1
+8 761 1
+8 778 1
+8 779 1
+8 798 1
+8 802 1
+8 806 1
+8 810 1
+8 817 1
+8 822 1
+8 844 1
+8 857 1
+8 864 1
+8 866 1
+8 868 1
+8 875 1
+8 878 1
+8 881 1
+8 882 1
+8 885 1
+8 936 1
+8 938 1
+8 977 1
+8 1092 1
+8 8284 1
+9 8 1
+9 10 1
+9 23 1
+9 28 1
+9 30 1
+9 33 1
+9 34 1
+9 54 1
+9 55 1
+9 56 1
+9 61 1
+9 75 1
+9 80 1
+9 86 1
+9 94 1
+9 130 1
+9 135 1
+9 144 1
+9 151 1
+9 168 1
+9 214 1
+9 226 1
+9 228 1
+9 243 1
+9 250 1
+9 258 1
+9 261 1
+9 271 1
+9 274 1
+9 299 1
+9 325 1
+9 339 1
+9 348 1
+9 356 1
+9 363 1
+9 370 1
+9 377 1
+9 378 1
+9 379 1
+9 390 1
+9 391 1
+9 392 1
+9 394 1
+9 402 1
+9 421 1
+9 422 1
+9 427 1
+9 431 1
+9 439 1
+9 440 1
+9 506 1
+9 517 1
+9 559 1
+9 560 1
+9 579 1
+9 592 1
+9 611 1
+9 626 1
+9 658 1
+9 664 1
+9 715 1
+9 733 1
+9 756 1
+9 857 1
+9 868 1
+9 893 1
+9 904 1
+9 918 1
+9 932 1
+9 972 1
+9 982 1
+9 1049 1
+9 1103 1
+9 1384 1
+9 1525 1
+9 1580 1
+9 1618 1
+9 1652 1
+9 1717 1
+9 1855 1
+9 1966 1
+10 3 1
+10 6 1
+10 8 1
+10 19 1
+10 23 1
+10 28 1
+10 30 1
+10 33 1
+10 34 1
+10 38 1
+10 50 1
+10 54 1
+10 89 1
+10 93 1
+10 105 1
+10 130 1
+10 132 1
+10 135 1
+10 147 1
+10 153 1
+10 154 1
+10 163 1
+10 168 1
+10 175 1
+10 183 1
+10 214 1
+10 216 1
+10 219 1
+10 246 1
+10 250 1
+10 252 1
+10 255 1
+10 257 1
+10 261 1
+10 271 1
+10 274 1
+10 280 1
+10 286 1
+10 300 1
+10 301 1
+10 306 1
+10 310 1
+10 319 1
+10 405 1
+10 406 1
+10 407 1
+10 432 1
+10 549 1
+10 587 1
+10 600 1
+10 609 1
+10 617 1
+10 619 1
+10 622 1
+10 627 1
+10 628 1
+10 631 1
+10 636 1
+10 656 1
+10 657 1
+10 658 1
+10 659 1
+10 664 1
+10 665 1
+10 667 1
+10 668 1
+10 673 1
+10 675 1
+10 681 1
+10 700 1
+10 706 1
+10 715 1
+10 719 1
+10 725 1
+10 739 1
+10 741 1
+10 743 1
+10 746 1
+10 748 1
+10 750 1
+10 756 1
+10 760 1
+10 761 1
+10 765 1
+10 778 1
+10 779 1
+11 6 1
+11 8 1
+11 10 1
+11 15 1
+11 19 1
+11 23 1
+11 28 1
+11 29 1
+11 30 1
+11 33 1
+11 34 1
+11 35 1
+11 36 1
+11 38 1
+11 49 1
+11 50 1
+11 54 1
+11 55 1
+11 56 1
+11 61 1
+11 72 1
+11 75 1
+11 86 1
+11 89 1
+11 93 1
+11 95 1
+11 105 1
+11 127 1
+11 130 1
+11 132 1
+11 147 1
+11 151 1
+11 153 1
+11 154 1
+11 163 1
+11 168 1
+11 171 1
+11 178 1
+11 183 1
+11 192 1
+11 204 1
+11 214 1
+11 216 1
+11 219 1
+11 224 1
+11 227 1
+11 228 1
+11 230 1
+11 246 1
+11 250 1
+11 252 1
+11 255 1
+11 257 1
+11 259 1
+11 261 1
+11 271 1
+11 274 1
+11 282 1
+11 285 1
+11 286 1
+11 298 1
+11 299 1
+11 306 1
+11 308 1
+11 310 1
+11 313 1
+11 317 1
+11 319 1
+11 322 1
+11 325 1
+11 332 1
+11 334 1
+11 338 1
+11 350 1
+11 372 1
+11 406 1
+11 407 1
+11 415 1
+11 429 1
+11 431 1
+11 432 1
+11 439 1
+11 440 1
+11 465 1
+11 488 1
+11 506 1
+11 514 1
+11 545 1
+11 549 1
+11 559 1
+11 560 1
+11 575 1
+11 579 1
+11 587 1
+11 600 1
+11 607 1
+11 608 1
+11 609 1
+11 611 1
+11 613 1
+11 617 1
+11 622 1
+11 624 1
+11 627 1
+11 628 1
+11 631 1
+11 636 1
+11 637 1
+11 643 1
+11 644 1
+11 647 1
+11 658 1
+11 659 1
+11 664 1
+11 667 1
+11 668 1
+11 673 1
+11 674 1
+11 675 1
+11 677 1
+11 681 1
+11 684 1
+11 687 1
+11 694 1
+11 700 1
+11 705 1
+11 706 1
+11 707 1
+11 710 1
+11 715 1
+11 717 1
+11 719 1
+11 722 1
+11 723 1
+11 725 1
+11 730 1
+11 733 1
+11 739 1
+11 741 1
+11 743 1
+11 744 1
+11 746 1
+11 748 1
+11 749 1
+11 750 1
+11 756 1
+11 760 1
+11 761 1
+11 762 1
+11 763 1
+11 764 1
+11 765 1
+11 771 1
+11 779 1
+11 791 1
+11 793 1
+11 798 1
+11 802 1
+11 803 1
+11 805 1
+11 806 1
+11 810 1
+11 817 1
+11 822 1
+11 825 1
+11 826 1
+11 829 1
+11 836 1
+11 837 1
+11 838 1
+11 839 1
+11 844 1
+11 849 1
+11 853 1
+11 857 1
+11 859 1
+11 863 1
+11 864 1
+11 866 1
+11 868 1
+11 871 1
+11 873 1
+11 878 1
+11 881 1
+11 882 1
+11 885 1
+11 887 1
+11 893 1
+11 895 1
+11 904 1
+11 907 1
+11 908 1
+11 913 1
+11 918 1
+11 922 1
+11 929 1
+11 932 1
+11 934 1
+11 935 1
+11 936 1
+11 937 1
+11 941 1
+11 942 1
+11 943 1
+11 945 1
+11 946 1
+11 947 1
+11 955 1
+11 956 1
+11 958 1
+11 959 1
+11 960 1
+11 963 1
+11 968 1
+11 971 1
+11 975 1
+11 978 1
+11 982 1
+11 985 1
+11 989 1
+11 993 1
+11 994 1
+11 999 1
+11 1000 1
+11 1006 1
+11 1012 1
+11 1018 1
+11 1022 1
+11 1031 1
+11 1032 1
+11 1034 1
+11 1035 1
+11 1049 1
+11 1055 1
+11 1061 1
+11 1062 1
+11 1075 1
+11 1080 1
+11 1092 1
+11 1097 1
+11 1103 1
+11 1111 1
+11 1124 1
+11 1127 1
+11 1128 1
+11 1137 1
+11 1144 1
+11 1151 1
+11 1154 1
+11 1156 1
+11 1160 1
+11 1164 1
+11 1165 1
+11 1167 1
+11 1168 1
+11 1185 1
+11 1186 1
+11 1190 1
+11 1191 1
+11 1193 1
+11 1196 1
+11 1199 1
+11 1200 1
+11 1201 1
+11 1203 1
+11 1211 1
+11 1218 1
+11 1220 1
+11 1221 1
+11 1222 1
+11 1230 1
+11 1239 1
+11 1241 1
+11 1243 1
+11 1248 1
+11 1250 1
+11 1253 1
+11 1259 1
+11 1260 1
+11 1261 1
+11 1279 1
+11 1282 1
+11 1284 1
+11 1285 1
+11 1286 1
+11 1296 1
+11 1297 1
+11 1305 1
+11 1307 1
+11 1310 1
+11 1319 1
+11 1321 1
+11 1322 1
+11 1326 1
+11 1330 1
+11 1353 1
+11 1360 1
+11 1372 1
+11 1374 1
+11 1375 1
+11 1377 1
+11 1378 1
+11 1382 1
+11 1384 1
+11 1385 1
+11 1389 1
+11 1390 1
+11 1394 1
+11 1396 1
+11 1402 1
+11 1407 1
+11 1411 1
+11 1412 1
+11 1413 1
+11 1418 1
+11 1420 1
+11 1425 1
+11 1428 1
+11 1435 1
+11 1437 1
+11 1439 1
+11 1441 1
+11 1442 1
+11 1444 1
+11 1446 1
+11 1453 1
+11 1464 1
+11 1465 1
+11 1468 1
+11 1471 1
+11 1476 1
+11 1482 1
+11 1484 1
+11 1485 1
+11 1486 1
+11 1487 1
+11 1489 1
+11 1490 1
+11 1492 1
+11 1496 1
+11 1497 1
+11 1501 1
+11 1506 1
+11 1507 1
+11 1513 1
+11 1514 1
+11 1518 1
+11 1520 1
+11 1521 1
+11 1524 1
+11 1525 1
+11 1531 1
+11 1532 1
+11 1533 1
+11 1534 1
+11 1538 1
+11 1542 1
+11 1547 1
+11 1549 1
+11 1550 1
+11 1555 1
+11 1556 1
+11 1557 1
+11 1565 1
+11 1566 1
+11 1583 1
+11 1585 1
+11 1592 1
+11 1608 1
+11 1610 1
+11 1613 1
+11 1619 1
+11 1621 1
+11 1622 1
+11 1628 1
+11 1629 1
+11 1633 1
+11 1637 1
+11 1638 1
+11 1641 1
+11 1646 1
+11 1648 1
+11 1649 1
+11 1652 1
+11 1653 1
+11 1654 1
+11 1657 1
+11 1658 1
+11 1661 1
+11 1662 1
+11 1669 1
+11 1672 1
+11 1679 1
+11 1680 1
+11 1687 1
+11 1688 1
+11 1689 1
+11 1692 1
+11 1697 1
+11 1700 1
+11 1701 1
+11 1706 1
+11 1707 1
+11 1714 1
+11 1716 1
+11 1717 1
+11 1718 1
+11 1726 1
+11 1729 1
+11 1730 1
+11 1732 1
+11 1746 1
+11 1747 1
+11 1749 1
+11 1752 1
+11 1757 1
+11 1758 1
+11 1768 1
+11 1769 1
+11 1771 1
+11 1772 1
+11 1774 1
+11 1780 1
+11 1783 1
+11 1787 1
+11 1788 1
+11 1791 1
+11 1798 1
+11 1802 1
+11 1805 1
+11 1811 1
+11 1816 1
+11 1835 1
+11 1836 1
+11 1842 1
+11 1847 1
+11 1848 1
+11 1849 1
+11 1855 1
+11 1857 1
+11 1858 1
+11 1859 1
+11 1861 1
+11 1864 1
+11 1880 1
+11 1884 1
+11 1888 1
+11 1893 1
+11 1901 1
+11 1903 1
+11 1908 1
+11 1919 1
+11 1920 1
+11 1927 1
+11 1953 1
+11 1956 1
+11 1963 1
+11 1964 1
+11 1965 1
+11 1966 1
+11 1969 1
+11 1973 1
+11 1977 1
+11 1979 1
+11 1983 1
+11 1985 1
+11 1987 1
+11 1990 1
+11 1991 1
+11 1992 1
+11 1997 1
+11 2004 1
+11 2007 1
+11 2014 1
+11 2055 1
+11 2060 1
+11 2062 1
+11 2066 1
+11 2071 1
+11 2073 1
+11 2076 1
+11 2079 1
+11 2085 1
+11 2091 1
+11 2095 1
+11 2097 1
+11 2101 1
+11 2109 1
+11 2114 1
+11 2117 1
+11 2119 1
+11 2128 1
+11 2134 1
+11 2137 1
+11 2144 1
+11 2145 1
+11 2151 1
+11 2157 1
+11 2168 1
+11 2178 1
+11 2181 1
+11 2182 1
+11 2193 1
+11 2202 1
+11 2205 1
+11 2206 1
+11 2210 1
+11 2237 1
+11 2240 1
+11 2241 1
+11 2246 1
+11 2252 1
+11 2253 1
+11 2257 1
+11 2273 1
+11 2289 1
+11 2294 1
+11 2328 1
+11 2329 1
+11 2332 1
+11 2333 1
+11 2339 1
+11 2341 1
+11 2345 1
+11 2350 1
+11 2362 1
+11 2364 1
+11 2381 1
+11 2384 1
+11 2385 1
+11 2397 1
+11 2400 1
+11 2409 1
+11 2410 1
+11 2411 1
+11 2426 1
+11 2435 1
+11 2456 1
+11 2470 1
+11 2475 1
+11 2479 1
+11 2484 1
+11 2485 1
+11 2490 1
+11 2499 1
+11 2504 1
+11 2506 1
+11 2508 1
+11 2517 1
+11 2535 1
+11 2544 1
+11 2565 1
+11 2570 1
+11 2575 1
+11 2579 1
+11 2580 1
+11 2585 1
+11 2587 1
+11 2593 1
+11 2595 1
+11 2604 1
+11 2612 1
+11 2619 1
+11 2625 1
+11 2643 1
+11 2646 1
+11 2653 1
+11 2655 1
+11 2657 1
+11 2665 1
+11 2669 1
+11 2685 1
+11 2686 1
+11 2696 1
+11 2720 1
+11 2727 1
+11 2746 1
+11 2754 1
+11 2760 1
+11 2763 1
+11 2775 1
+11 2777 1
+11 2787 1
+11 2794 1
+11 2811 1
+11 2843 1
+11 2859 1
+11 2871 1
+11 2900 1
+11 2923 1
+11 2932 1
+11 2958 1
+11 2981 1
+11 3002 1
+11 3005 1
+11 3007 1
+11 3010 1
+11 3014 1
+11 3024 1
+11 3026 1
+11 3028 1
+11 3034 1
+11 3059 1
+11 3073 1
+11 3084 1
+11 3092 1
+11 3114 1
+11 3117 1
+11 3125 1
+11 3136 1
+11 3140 1
+11 3144 1
+11 3180 1
+11 3192 1
+11 3258 1
+11 3260 1
+11 3284 1
+11 3291 1
+11 3309 1
+11 3321 1
+11 3334 1
+11 3352 1
+11 3394 1
+11 3404 1
+11 3433 1
+11 3439 1
+11 3443 1
+11 3447 1
+11 3452 1
+11 3453 1
+11 3454 1
+11 3458 1
+11 3463 1
+11 3464 1
+11 3480 1
+11 3529 1
+11 3537 1
+11 3557 1
+11 3562 1
+11 3568 1
+11 3607 1
+11 3615 1
+11 3631 1
+11 3635 1
+11 3645 1
+11 3650 1
+11 3660 1
+11 3661 1
+11 3680 1
+11 3748 1
+11 3755 1
+11 3787 1
+11 3800 1
+11 3806 1
+11 3807 1
+11 3812 1
+11 3830 1
+11 3843 1
+11 3847 1
+11 3871 1
+11 3892 1
+11 3903 1
+11 3926 1
+11 3937 1
+11 3956 1
+11 3958 1
+11 3967 1
+11 3970 1
+11 4011 1
+11 4013 1
+11 4021 1
+11 4024 1
+11 4040 1
+11 4043 1
+11 4044 1
+11 4055 1
+11 4058 1
+11 4065 1
+11 4072 1
+11 4088 1
+11 4103 1
+11 4124 1
+11 4162 1
+11 4179 1
+11 4201 1
+11 4212 1
+11 4231 1
+11 4247 1
+11 4256 1
+11 4261 1
+11 4263 1
+11 4266 1
+11 4269 1
+11 4289 1
+11 4290 1
+11 4297 1
+11 4299 1
+11 4335 1
+11 4384 1
+11 4417 1
+11 4422 1
+11 4424 1
+11 4463 1
+11 4485 1
+11 4510 1
+11 4528 1
+11 4531 1
+11 4547 1
+11 4578 1
+11 4613 1
+11 4661 1
+11 4662 1
+11 4706 1
+11 4709 1
+11 4719 1
+11 4796 1
+11 4808 1
+11 4811 1
+11 4814 1
+11 4820 1
+11 4827 1
+11 4938 1
+11 4962 1
+11 5026 1
+11 5037 1
+11 5055 1
+11 5073 1
+11 5092 1
+11 5100 1
+11 5106 1
+11 5130 1
+11 5132 1
+11 5144 1
+11 5802 1
+11 6170 1
+11 6496 1
+11 6715 1
+11 6739 1
+11 8286 1
+11 8287 1
+11 8290 1
+11 8291 1
+11 8293 1
+12 8 1
+12 28 1
+12 30 1
+12 56 1
+12 72 1
+12 80 1
+12 214 1
+12 219 1
+12 232 1
+12 236 1
+12 250 1
+12 255 1
+12 257 1
+12 259 1
+12 274 1
+12 282 1
+12 286 1
+12 290 1
+12 299 1
+12 349 1
+12 356 1
+12 362 1
+12 390 1
+12 407 1
+12 427 1
+12 428 1
+12 432 1
+12 435 1
+12 538 1
+12 564 1
+12 609 1
+12 631 1
+12 644 1
+12 663 1
+12 668 1
+12 675 1
+12 677 1
+12 697 1
+12 706 1
+12 725 1
+12 748 1
+12 756 1
+12 765 1
+12 793 1
+12 805 1
+12 810 1
+12 822 1
+12 838 1
+12 857 1
+12 937 1
+12 1014 1
+12 1160 1
+12 1241 1
+12 1297 1
+12 1464 1
+12 1573 1
+12 1629 1
+12 1638 1
+12 2252 1
+12 2708 1
+12 3371 1
+12 3843 1
+12 4233 1
+12 8287 1
+12 8291 1
+13 28 1
+13 30 1
+13 178 1
+13 214 1
+13 216 1
+13 232 1
+13 250 1
+13 252 1
+13 271 1
+13 302 1
+13 341 1
+14 3 1
+14 10 1
+14 23 1
+14 28 1
+14 30 1
+14 32 1
+14 49 1
+14 54 1
+14 55 1
+14 56 1
+14 61 1
+14 75 1
+14 95 1
+14 127 1
+14 130 1
+14 140 1
+14 150 1
+14 152 1
+14 178 1
+14 182 1
+14 183 1
+14 192 1
+14 214 1
+14 216 1
+14 219 1
+14 224 1
+14 226 1
+14 236 1
+14 250 1
+14 259 1
+14 261 1
+14 271 1
+14 282 1
+14 299 1
+14 324 1
+14 325 1
+14 338 1
+14 356 1
+14 363 1
+14 368 1
+14 371 1
+14 377 1
+14 378 1
+14 390 1
+14 391 1
+14 394 1
+14 396 1
+14 402 1
+14 421 1
+14 422 1
+14 427 1
+14 440 1
+14 477 1
+14 517 1
+14 524 1
+14 538 1
+14 560 1
+14 564 1
+14 566 1
+14 567 1
+14 581 1
+14 584 1
+14 589 1
+14 609 1
+14 611 1
+14 613 1
+14 616 1
+14 617 1
+14 619 1
+14 626 1
+14 631 1
+14 650 1
+14 656 1
+14 665 1
+14 797 1
+14 968 1
+14 1031 1
+14 1053 1
+14 1080 1
+14 1123 1
+14 1164 1
+14 1259 1
+14 1307 1
+14 1385 1
+14 1496 1
+14 1717 1
+14 1835 1
+14 1842 1
+14 1855 1
+14 1864 1
+14 1927 1
+14 1966 1
+14 2016 1
+14 2066 1
+14 2117 1
+14 2134 1
+14 2193 1
+14 2339 1
+14 2384 1
+14 2470 1
+14 2475 1
+14 2479 1
+14 2565 1
+14 2587 1
+14 2595 1
+14 2643 1
+14 2653 1
+14 3192 1
+14 3562 1
+14 4055 1
+14 4179 1
+14 4247 1
+14 8285 1
+14 8287 1
+15 8 1
+15 23 1
+15 28 1
+15 30 1
+15 32 1
+15 33 1
+15 38 1
+15 49 1
+15 54 1
+15 55 1
+15 56 1
+15 61 1
+15 95 1
+15 105 1
+15 152 1
+15 214 1
+15 299 1
+15 368 1
+15 417 1
+15 477 1
+15 560 1
+15 589 1
+15 600 1
+15 667 1
+15 737 1
+15 756 1
+15 762 1
+15 893 1
+15 974 1
+15 1006 1
+15 1297 1
+15 1717 1
+15 2066 1
+15 2144 1
+15 2229 1
+15 2398 1
+15 2643 1
+15 2651 1
+15 3005 1
+15 3334 1
+15 3755 1
+15 4037 1
+15 4561 1
+15 4600 1
+15 4645 1
+15 4658 1
+15 7632 1
+15 7871 1
+15 8287 1
+15 8292 1
+16 28 1
+16 30 1
+16 637 1
+16 749 1
+16 789 1
+16 817 1
+16 857 1
+16 887 1
+16 982 1
+16 993 1
+16 1186 1
+16 1374 1
+16 1412 1
+16 1580 1
+16 1672 1
+17 3 1
+17 8 1
+17 10 1
+17 28 1
+17 30 1
+17 32 1
+17 33 1
+17 35 1
+17 50 1
+17 54 1
+17 55 1
+17 95 1
+17 108 1
+17 127 1
+17 135 1
+17 183 1
+17 214 1
+17 258 1
+17 261 1
+17 271 1
+17 273 1
+17 282 1
+17 299 1
+17 339 1
+17 356 1
+17 359 1
+17 377 1
+17 378 1
+17 391 1
+17 524 1
+17 590 1
+17 592 1
+17 624 1
+17 656 1
+17 658 1
+17 667 1
+17 675 1
+17 739 1
+17 750 1
+17 756 1
+17 941 1
+17 982 1
+17 1190 1
+17 1218 1
+17 1513 1
+18 30 1
+18 36 1
+18 55 1
+18 144 1
+18 192 1
+18 214 1
+18 308 1
+18 429 1
+18 477 1
+18 549 1
+18 643 1
+18 2570 1
+19 3 1
+19 6 1
+19 23 1
+19 28 1
+19 30 1
+19 33 1
+19 38 1
+19 50 1
+19 54 1
+19 55 1
+19 61 1
+19 89 1
+19 127 1
+19 130 1
+19 132 1
+19 151 1
+19 154 1
+19 163 1
+19 168 1
+19 182 1
+19 183 1
+19 214 1
+19 216 1
+19 219 1
+19 250 1
+19 252 1
+19 257 1
+19 261 1
+19 271 1
+19 274 1
+19 286 1
+19 299 1
+19 371 1
+19 564 1
+19 581 1
+19 584 1
+19 589 1
+19 590 1
+19 592 1
+20 3 1
+20 6 1
+20 19 1
+20 30 1
+20 33 1
+20 34 1
+20 36 1
+20 50 1
+20 54 1
+20 55 1
+20 56 1
+20 61 1
+20 75 1
+20 80 1
+20 89 1
+20 105 1
+20 132 1
+20 135 1
+20 140 1
+20 151 1
+20 153 1
+20 167 1
+20 168 1
+20 182 1
+20 183 1
+20 214 1
+20 216 1
+20 224 1
+20 232 1
+20 243 1
+20 250 1
+20 252 1
+20 255 1
+20 257 1
+20 258 1
+20 261 1
+20 271 1
+20 274 1
+20 282 1
+20 286 1
+20 299 1
+20 306 1
+20 308 1
+20 310 1
+20 321 1
+20 322 1
+20 325 1
+20 339 1
+20 348 1
+20 350 1
+20 363 1
+20 368 1
+20 370 1
+20 371 1
+20 377 1
+20 378 1
+20 379 1
+20 391 1
+20 402 1
+20 405 1
+20 425 1
+20 427 1
+20 429 1
+20 447 1
+20 465 1
+20 477 1
+20 564 1
+20 567 1
+20 590 1
+20 592 1
+20 600 1
+20 606 1
+20 609 1
+20 611 1
+20 624 1
+20 626 1
+20 631 1
+20 636 1
+20 650 1
+20 656 1
+20 657 1
+20 658 1
+20 667 1
+20 673 1
+20 675 1
+20 677 1
+20 681 1
+20 697 1
+20 700 1
+20 704 1
+20 706 1
+20 707 1
+20 722 1
+20 723 1
+20 746 1
+20 749 1
+20 756 1
+20 765 1
+20 803 1
+20 829 1
+20 838 1
+20 853 1
+20 861 1
+20 864 1
+20 896 1
+20 918 1
+20 941 1
+20 943 1
+20 979 1
+20 981 1
+20 982 1
+20 993 1
+20 994 1
+20 1034 1
+20 1044 1
+20 1055 1
+20 1062 1
+20 1075 1
+20 1156 1
+20 1164 1
+20 1167 1
+20 1190 1
+20 1211 1
+20 1218 1
+20 1307 1
+20 1321 1
+20 1352 1
+20 1374 1
+20 1389 1
+20 1396 1
+20 1402 1
+20 1501 1
+20 1513 1
+20 1569 1
+20 1585 1
+20 1597 1
+20 1604 1
+20 1680 1
+20 1692 1
+20 1730 1
+20 1758 1
+20 1774 1
+20 1783 1
+20 1787 1
+20 1855 1
+20 1859 1
+20 1919 1
+20 1965 1
+20 1966 1
+20 2134 1
+20 2165 1
+20 2281 1
+20 2285 1
+20 2324 1
+20 2339 1
+20 2348 1
+20 2411 1
+20 2484 1
+20 2517 1
+20 2565 1
+20 2693 1
+20 2774 1
+20 2775 1
+20 2777 1
+20 2828 1
+20 2877 1
+20 2900 1
+20 3027 1
+20 3136 1
+20 3371 1
+20 3456 1
+20 3516 1
+20 3614 1
+20 3755 1
+20 4179 1
+20 4373 1
+20 5327 1
+20 5714 1
+20 5775 1
+20 5780 1
+20 5814 1
+20 5818 1
+20 6229 1
+20 6262 1
+20 6780 1
+20 7726 1
+20 8288 1
+21 28 1
+21 30 1
+21 35 1
+21 54 1
+21 61 1
+21 75 1
+21 86 1
+21 89 1
+21 105 1
+21 135 1
+21 140 1
+21 144 1
+21 150 1
+21 168 1
+21 183 1
+21 219 1
+21 236 1
+21 243 1
+21 250 1
+21 252 1
+21 271 1
+21 299 1
+21 308 1
+21 334 1
+21 356 1
+21 370 1
+21 422 1
+21 429 1
+21 433 1
+21 439 1
+21 447 1
+21 465 1
+21 488 1
+21 549 1
+21 590 1
+21 592 1
+21 611 1
+21 613 1
+21 637 1
+21 656 1
+21 657 1
+21 664 1
+21 667 1
+21 723 1
+21 725 1
+21 760 1
+21 765 1
+21 789 1
+21 794 1
+21 802 1
+21 837 1
+21 853 1
+21 868 1
+21 871 1
+21 887 1
+21 893 1
+21 908 1
+21 932 1
+21 960 1
+21 963 1
+21 1014 1
+21 1049 1
+21 1190 1
+21 1297 1
+21 1476 1
+21 1707 1
+21 1717 1
+21 1726 1
+21 2085 1
+21 2117 1
+21 2181 1
+21 2202 1
+21 2410 1
+21 2685 1
+21 2727 1
+21 2814 1
+22 30 1
+22 1407 1
+23 29 1
+23 30 1
+23 33 1
+23 38 1
+23 39 1
+23 50 1
+23 55 1
+23 80 1
+23 94 1
+23 127 1
+23 135 1
+23 144 1
+23 151 1
+23 163 1
+23 168 1
+23 175 1
+23 183 1
+23 214 1
+23 236 1
+23 252 1
+23 257 1
+23 271 1
+23 280 1
+23 282 1
+23 299 1
+23 300 1
+23 302 1
+23 304 1
+23 308 1
+23 313 1
+23 325 1
+23 406 1
+23 549 1
+23 586 1
+23 587 1
+23 590 1
+23 601 1
+23 616 1
+23 617 1
+23 656 1
+23 664 1
+23 667 1
+23 670 1
+23 673 1
+23 674 1
+23 700 1
+23 706 1
+23 715 1
+23 725 1
+23 760 1
+23 765 1
+23 794 1
+23 810 1
+23 857 1
+23 881 1
+23 897 1
+23 904 1
+23 906 1
+23 942 1
+23 945 1
+23 972 1
+23 981 1
+23 989 1
+23 1014 1
+23 1029 1
+23 1039 1
+23 1053 1
+23 1061 1
+23 1123 1
+23 1478 1
+23 1538 1
+23 1593 1
+23 1638 1
+23 8288 1
+24 3 1
+24 8 1
+24 15 1
+24 19 1
+24 28 1
+24 30 1
+24 33 1
+24 34 1
+24 35 1
+24 36 1
+24 50 1
+24 54 1
+24 72 1
+24 130 1
+24 132 1
+24 150 1
+24 214 1
+24 228 1
+24 230 1
+24 243 1
+24 255 1
+24 259 1
+24 271 1
+24 280 1
+24 299 1
+24 310 1
+24 311 1
+24 321 1
+24 334 1
+24 348 1
+24 370 1
+24 373 1
+24 378 1
+24 391 1
+24 407 1
+24 415 1
+24 417 1
+24 465 1
+24 545 1
+24 549 1
+24 560 1
+24 579 1
+24 589 1
+24 600 1
+24 626 1
+24 633 1
+24 636 1
+24 643 1
+24 644 1
+24 647 1
+24 663 1
+24 667 1
+24 681 1
+24 696 1
+24 697 1
+24 706 1
+24 707 1
+24 710 1
+24 719 1
+24 722 1
+24 739 1
+24 742 1
+24 750 1
+24 756 1
+24 760 1
+24 762 1
+24 763 1
+24 769 1
+24 803 1
+24 813 1
+24 817 1
+24 829 1
+24 849 1
+24 853 1
+24 856 1
+24 857 1
+24 863 1
+24 887 1
+24 893 1
+24 895 1
+24 908 1
+24 932 1
+24 935 1
+24 945 1
+24 946 1
+24 960 1
+24 993 1
+24 994 1
+24 999 1
+24 1018 1
+24 1034 1
+24 1043 1
+24 1053 1
+24 1075 1
+24 1080 1
+24 1100 1
+24 1111 1
+24 1123 1
+24 1125 1
+24 1156 1
+24 1164 1
+24 1165 1
+24 1186 1
+24 1193 1
+24 1200 1
+24 1234 1
+24 1250 1
+24 1267 1
+24 1284 1
+24 1285 1
+24 1297 1
+24 1310 1
+24 1315 1
+24 1330 1
+24 1353 1
+24 1357 1
+24 1360 1
+24 1416 1
+24 1419 1
+24 1439 1
+24 1442 1
+24 1473 1
+24 1482 1
+24 1497 1
+24 1501 1
+24 1538 1
+24 1542 1
+24 1547 1
+24 1548 1
+24 1549 1
+24 1566 1
+24 1585 1
+24 1608 1
+24 1622 1
+24 1633 1
+24 1641 1
+24 1646 1
+24 1658 1
+24 1669 1
+24 1697 1
+24 1705 1
+24 1717 1
+24 1723 1
+24 1729 1
+24 1734 1
+24 1754 1
+24 1769 1
+24 1772 1
+24 1781 1
+24 1808 1
+24 1814 1
+24 1816 1
+24 1835 1
+24 1836 1
+24 1837 1
+24 1842 1
+24 1855 1
+24 1858 1
+24 1880 1
+24 1893 1
+24 1901 1
+24 1903 1
+24 1927 1
+24 1953 1
+24 1956 1
+24 1963 1
+24 1966 1
+24 1969 1
+24 1977 1
+24 1987 1
+24 2004 1
+24 2055 1
+24 2060 1
+24 2062 1
+24 2066 1
+24 2117 1
+24 2119 1
+24 2137 1
+24 2144 1
+24 2193 1
+24 2209 1
+24 2225 1
+24 2237 1
+24 2264 1
+24 2276 1
+24 2323 1
+24 2328 1
+24 2329 1
+24 2341 1
+24 2345 1
+24 2354 1
+24 2371 1
+24 2375 1
+24 2385 1
+24 2398 1
+24 2504 1
+24 2508 1
+24 2516 1
+24 2542 1
+24 2560 1
+24 2579 1
+24 2585 1
+24 2587 1
+24 2595 1
+24 2612 1
+24 2619 1
+24 2625 1
+24 2660 1
+24 2667 1
+24 2696 1
+24 2697 1
+24 2707 1
+24 2746 1
+24 2754 1
+24 2760 1
+24 2763 1
+24 2815 1
+24 2819 1
+24 2822 1
+24 2830 1
+24 2871 1
+24 2922 1
+24 2926 1
+24 2955 1
+24 2963 1
+24 2999 1
+24 3018 1
+24 3028 1
+24 3089 1
+24 3136 1
+24 3164 1
+24 3192 1
+24 3351 1
+24 3352 1
+24 3408 1
+24 3410 1
+24 3439 1
+24 3443 1
+24 3447 1
+24 3452 1
+24 3456 1
+24 3458 1
+24 3473 1
+24 3537 1
+24 3568 1
+24 3586 1
+24 3607 1
+24 3643 1
+24 3660 1
+24 3661 1
+24 3748 1
+24 3792 1
+24 3800 1
+24 3843 1
+24 3854 1
+24 3898 1
+24 3903 1
+24 3910 1
+24 4040 1
+24 4261 1
+24 4276 1
+24 4299 1
+24 4310 1
+24 4338 1
+24 4349 1
+24 4373 1
+24 4463 1
+24 4485 1
+24 4510 1
+24 4706 1
+24 4709 1
+24 4712 1
+24 4792 1
+24 4796 1
+24 4811 1
+24 4827 1
+24 4944 1
+24 4953 1
+24 4999 1
+24 5026 1
+24 5037 1
+24 5055 1
+24 5123 1
+24 5162 1
+24 5254 1
+24 5327 1
+24 5341 1
+24 5412 1
+24 5423 1
+24 5484 1
+24 5511 1
+24 5596 1
+24 5714 1
+24 5818 1
+24 5863 1
+24 6097 1
+24 6229 1
+24 6272 1
+24 6441 1
+24 6496 1
+24 6566 1
+24 6833 1
+24 6855 1
+24 6869 1
+24 6948 1
+24 6955 1
+24 7119 1
+24 7143 1
+24 7144 1
+54 3 1
+54 28 1
+54 214 1
+54 299 1
+54 356 1
+54 373 1
+54 394 1
+28 3 1
+28 6 1
+28 8 1
+28 19 1
+28 29 1
+28 33 1
+28 34 1
+28 35 1
+28 38 1
+28 49 1
+28 50 1
+28 54 1
+28 55 1
+28 56 1
+28 61 1
+28 75 1
+28 80 1
+28 86 1
+28 94 1
+28 127 1
+28 130 1
+28 132 1
+28 135 1
+28 144 1
+28 147 1
+28 150 1
+28 151 1
+28 152 1
+28 154 1
+28 163 1
+28 178 1
+28 182 1
+28 192 1
+28 214 1
+28 216 1
+28 224 1
+28 226 1
+28 228 1
+28 232 1
+28 236 1
+28 246 1
+28 250 1
+28 252 1
+28 259 1
+28 261 1
+28 271 1
+28 273 1
+28 280 1
+28 282 1
+28 299 1
+28 301 1
+28 302 1
+28 304 1
+28 310 1
+28 313 1
+28 319 1
+28 322 1
+28 325 1
+28 356 1
+28 370 1
+28 391 1
+28 396 1
+28 402 1
+28 405 1
+28 406 1
+28 415 1
+28 428 1
+28 435 1
+28 439 1
+28 488 1
+28 514 1
+28 584 1
+28 587 1
+28 590 1
+28 600 1
+28 613 1
+28 616 1
+28 627 1
+28 631 1
+28 636 1
+28 645 1
+28 656 1
+28 658 1
+28 659 1
+28 667 1
+28 670 1
+28 673 1
+28 675 1
+28 677 1
+28 681 1
+28 687 1
+28 715 1
+28 723 1
+28 725 1
+28 730 1
+28 739 1
+28 741 1
+28 743 1
+28 746 1
+28 748 1
+28 750 1
+28 756 1
+28 789 1
+28 798 1
+28 857 1
+28 859 1
+28 864 1
+28 895 1
+28 934 1
+28 958 1
+28 979 1
+28 991 1
+28 1014 1
+28 1026 1
+28 1030 1
+28 1077 1
+28 1160 1
+28 1186 1
+28 1190 1
+28 1201 1
+28 1286 1
+28 1428 1
+28 1604 1
+28 1608 1
+28 1638 1
+28 1964 1
+28 2470 1
+28 2479 1
+28 2801 1
+28 6251 1
+28 8282 1
+28 8284 1
+28 8285 1
+33 8 1
+33 28 1
+33 38 1
+33 50 1
+33 54 1
+33 56 1
+33 127 1
+33 140 1
+33 144 1
+33 147 1
+33 167 1
+33 178 1
+33 183 1
+33 214 1
+33 396 1
+33 402 1
+33 440 1
+33 538 1
+33 545 1
+33 1144 1
+33 1241 1
+33 1717 1
+33 2119 1
+33 2165 1
+34 3 1
+34 6 1
+34 39 1
+34 54 1
+34 282 1
+36 15 1
+36 28 1
+36 35 1
+36 38 1
+36 50 1
+36 54 1
+36 55 1
+36 80 1
+36 86 1
+36 89 1
+36 152 1
+36 204 1
+36 226 1
+36 228 1
+36 232 1
+36 255 1
+36 271 1
+36 274 1
+36 282 1
+36 299 1
+36 304 1
+36 308 1
+36 310 1
+36 313 1
+36 322 1
+36 325 1
+36 332 1
+36 334 1
+36 348 1
+36 356 1
+36 370 1
+36 373 1
+36 377 1
+36 391 1
+36 394 1
+36 396 1
+36 402 1
+36 417 1
+36 427 1
+36 431 1
+36 439 1
+36 465 1
+36 549 1
+36 560 1
+36 579 1
+36 600 1
+36 626 1
+36 636 1
+36 637 1
+36 643 1
+36 644 1
+36 656 1
+36 663 1
+36 665 1
+36 667 1
+36 681 1
+36 697 1
+36 704 1
+36 707 1
+36 710 1
+36 719 1
+36 722 1
+36 730 1
+36 733 1
+36 737 1
+36 762 1
+36 813 1
+36 817 1
+36 838 1
+36 844 1
+36 849 1
+36 857 1
+36 859 1
+36 861 1
+36 895 1
+36 908 1
+36 922 1
+36 941 1
+36 945 1
+36 958 1
+36 959 1
+36 972 1
+36 975 1
+36 981 1
+36 982 1
+36 993 1
+36 999 1
+36 1023 1
+36 1026 1
+36 1038 1
+36 1075 1
+36 1111 1
+36 1123 1
+36 1125 1
+36 1127 1
+36 1131 1
+36 1166 1
+36 1186 1
+36 1190 1
+36 1193 1
+36 1196 1
+36 1222 1
+36 1234 1
+36 1296 1
+36 1297 1
+36 1307 1
+36 1310 1
+36 1353 1
+36 1357 1
+36 1372 1
+36 1377 1
+36 1378 1
+36 1402 1
+36 1413 1
+36 1416 1
+36 1468 1
+36 1489 1
+36 1506 1
+36 1513 1
+36 1518 1
+36 1524 1
+36 1538 1
+36 1549 1
+36 1555 1
+36 1566 1
+36 1585 1
+36 1608 1
+36 1621 1
+36 1701 1
+36 1707 1
+36 1726 1
+36 1769 1
+36 1783 1
+36 1816 1
+36 1842 1
+36 1848 1
+36 1855 1
+36 1956 1
+36 1964 1
+36 1969 1
+36 1997 1
+36 2066 1
+36 2071 1
+36 2109 1
+36 2117 1
+36 2120 1
+36 2135 1
+36 2145 1
+36 2237 1
+36 2241 1
+36 2297 1
+36 2328 1
+36 2329 1
+36 2381 1
+36 2456 1
+36 2470 1
+36 2485 1
+36 2506 1
+36 2570 1
+36 2579 1
+36 2594 1
+36 2599 1
+36 2619 1
+36 2620 1
+36 2625 1
+36 2651 1
+36 2655 1
+36 2685 1
+36 2689 1
+36 2775 1
+36 2831 1
+36 2834 1
+36 2871 1
+36 3034 1
+36 3089 1
+36 3136 1
+36 3150 1
+36 3192 1
+36 3258 1
+36 3274 1
+36 3334 1
+36 3352 1
+36 3394 1
+36 3443 1
+36 3454 1
+36 3456 1
+36 3480 1
+36 3489 1
+36 3537 1
+36 3562 1
+36 3586 1
+36 3680 1
+36 4065 1
+36 4099 1
+36 4201 1
+36 4303 1
+36 4483 1
+36 4574 1
+36 4578 1
+36 4712 1
+36 4717 1
+36 4781 1
+36 4929 1
+36 5022 1
+36 5144 1
+36 5412 1
+36 5459 1
+36 5529 1
+36 5605 1
+36 5697 1
+36 5714 1
+36 5799 1
+36 5804 1
+36 5822 1
+36 5897 1
+36 6006 1
+36 6044 1
+36 6151 1
+36 6437 1
+36 6496 1
+36 6955 1
+36 7115 1
+36 7289 1
+36 7632 1
+36 7908 1
+36 8174 1
+36 8282 1
+35 3 1
+35 33 1
+35 39 1
+35 50 1
+35 54 1
+35 132 1
+35 135 1
+35 151 1
+35 152 1
+35 153 1
+35 183 1
+35 214 1
+35 226 1
+35 227 1
+35 243 1
+35 257 1
+35 259 1
+35 261 1
+35 271 1
+35 274 1
+35 299 1
+35 300 1
+35 339 1
+35 348 1
+35 356 1
+35 362 1
+35 370 1
+35 373 1
+35 377 1
+35 378 1
+35 379 1
+35 390 1
+35 391 1
+35 394 1
+35 402 1
+35 415 1
+35 422 1
+35 545 1
+35 644 1
+35 647 1
+35 803 1
+35 853 1
+35 907 1
+35 960 1
+35 963 1
+35 971 1
+35 978 1
+35 1023 1
+35 1026 1
+35 1075 1
+35 1127 1
+35 1193 1
+35 1203 1
+35 1297 1
+35 1330 1
+35 1377 1
+35 1389 1
+35 1413 1
+35 1418 1
+35 1439 1
+35 1446 1
+35 1465 1
+35 1468 1
+35 1476 1
+35 1484 1
+37 50 1
+37 54 1
+37 168 1
+37 216 1
+37 252 1
+37 299 1
+37 325 1
+37 370 1
+37 608 1
+37 609 1
+37 656 1
+37 762 1
+37 881 1
+37 2775 1
+37 3456 1
+37 3976 1
+37 4310 1
+37 4735 1
+37 5412 1
+37 5780 1
+38 54 1
+38 55 1
+38 56 1
+38 75 1
+38 152 1
+38 182 1
+38 280 1
+38 302 1
+38 415 1
+38 589 1
+38 609 1
+38 922 1
+38 1836 1
+38 2385 1
+39 6 1
+39 8 1
+39 23 1
+39 28 1
+39 29 1
+39 33 1
+39 35 1
+39 50 1
+39 54 1
+39 80 1
+39 127 1
+39 135 1
+39 147 1
+39 152 1
+39 163 1
+39 168 1
+39 182 1
+39 216 1
+39 252 1
+39 271 1
+39 282 1
+39 299 1
+39 319 1
+39 325 1
+39 341 1
+39 407 1
+39 415 1
+39 549 1
+39 611 1
+39 613 1
+39 628 1
+39 631 1
+39 659 1
+39 706 1
+39 756 1
+39 779 1
+39 793 1
+39 822 1
+39 878 1
+39 1007 1
+39 6123 1
+40 33 1
+40 54 1
+40 55 1
+40 214 1
+40 216 1
+40 243 1
+40 252 1
+40 257 1
+40 273 1
+40 274 1
+40 299 1
+26 3 1
+26 6 1
+26 19 1
+26 23 1
+26 28 1
+26 33 1
+26 34 1
+26 38 1
+26 39 1
+26 50 1
+26 54 1
+26 55 1
+26 56 1
+26 80 1
+26 89 1
+26 93 1
+26 127 1
+26 130 1
+26 132 1
+26 135 1
+26 140 1
+26 144 1
+26 147 1
+26 151 1
+26 152 1
+26 154 1
+26 163 1
+26 167 1
+26 168 1
+26 182 1
+26 183 1
+26 214 1
+26 216 1
+26 219 1
+26 226 1
+26 232 1
+26 236 1
+26 243 1
+26 250 1
+26 252 1
+26 257 1
+26 258 1
+26 261 1
+26 271 1
+26 273 1
+26 274 1
+26 286 1
+26 299 1
+26 300 1
+26 301 1
+26 306 1
+26 310 1
+26 325 1
+26 339 1
+26 341 1
+26 348 1
+26 349 1
+26 356 1
+26 358 1
+26 359 1
+26 362 1
+26 363 1
+26 370 1
+26 371 1
+26 373 1
+26 377 1
+26 378 1
+26 379 1
+26 389 1
+26 390 1
+26 391 1
+26 394 1
+26 396 1
+26 415 1
+26 419 1
+26 421 1
+26 422 1
+26 427 1
+26 431 1
+26 433 1
+26 560 1
+26 564 1
+26 566 1
+26 567 1
+26 581 1
+26 584 1
+26 590 1
+26 636 1
+26 673 1
+26 675 1
+26 681 1
+26 684 1
+26 687 1
+26 756 1
+26 8282 1
+41 3 1
+41 28 1
+41 33 1
+41 54 1
+41 56 1
+41 75 1
+41 140 1
+41 151 1
+41 183 1
+41 226 1
+41 227 1
+41 252 1
+41 271 1
+41 299 1
+41 322 1
+41 339 1
+41 356 1
+41 358 1
+41 377 1
+41 402 1
+41 422 1
+41 681 1
+41 756 1
+41 837 1
+41 857 1
+41 887 1
+41 893 1
+41 922 1
+41 1259 1
+41 1282 1
+42 19 1
+42 23 1
+42 28 1
+42 34 1
+42 50 1
+42 54 1
+42 55 1
+42 56 1
+42 75 1
+42 80 1
+42 105 1
+42 178 1
+42 214 1
+42 219 1
+42 243 1
+42 250 1
+42 252 1
+42 259 1
+42 271 1
+42 274 1
+42 286 1
+42 298 1
+42 299 1
+42 302 1
+42 348 1
+42 356 1
+42 377 1
+42 378 1
+42 391 1
+42 396 1
+42 407 1
+42 415 1
+42 545 1
+42 549 1
+42 564 1
+42 656 1
+42 658 1
+42 710 1
+42 743 1
+42 748 1
+42 756 1
+42 810 1
+42 817 1
+42 823 1
+42 853 1
+42 907 1
+42 908 1
+42 975 1
+42 993 1
+42 1024 1
+42 1026 1
+42 1053 1
+42 1075 1
+42 1123 1
+42 1127 1
+42 1200 1
+42 1234 1
+42 1353 1
+42 1464 1
+42 1465 1
+42 1476 1
+42 1497 1
+42 1548 1
+42 1604 1
+42 1717 1
+42 1783 1
+42 1903 1
+42 1977 1
+42 1997 1
+42 2004 1
+42 2128 1
+42 2157 1
+42 2181 1
+42 2241 1
+42 2475 1
+42 2504 1
+42 2625 1
+42 3026 1
+42 3136 1
+42 3352 1
+42 3408 1
+42 4261 1
+42 4709 1
+42 5423 1
+42 5775 1
+42 6437 1
+42 6458 1
+42 7108 1
+42 8287 1
+43 54 1
+43 182 1
+43 857 1
+43 918 1
+44 15 1
+44 54 1
+44 147 1
+44 154 1
+44 214 1
+44 224 1
+44 259 1
+44 372 1
+44 390 1
+44 391 1
+44 465 1
+44 908 1
+44 947 1
+44 966 1
+44 1111 1
+44 1186 1
+44 1717 1
+44 1855 1
+44 1857 1
+44 1919 1
+44 1920 1
+44 1953 1
+44 1956 1
+44 2066 1
+44 2157 1
+44 2345 1
+44 2508 1
+44 2516 1
+44 2643 1
+44 2652 1
+44 3028 1
+44 3813 1
+44 4687 1
+44 4795 1
+44 4875 1
+44 5055 1
+44 5254 1
+44 5439 1
+44 6262 1
+44 6306 1
+44 6432 1
+44 6437 1
+44 7092 1
+44 8295 1
+45 8 1
+45 54 1
+45 55 1
+45 299 1
+45 871 1
+45 1441 1
+45 1507 1
+45 1513 1
+46 3 1
+46 36 1
+46 54 1
+46 56 1
+46 132 1
+46 150 1
+46 152 1
+46 182 1
+46 204 1
+46 214 1
+46 224 1
+46 252 1
+46 255 1
+46 271 1
+46 280 1
+46 282 1
+46 286 1
+46 300 1
+46 301 1
+46 325 1
+46 348 1
+46 368 1
+46 370 1
+46 371 1
+46 377 1
+46 378 1
+46 379 1
+46 391 1
+46 394 1
+46 396 1
+46 402 1
+46 407 1
+46 428 1
+46 431 1
+46 564 1
+46 566 1
+46 590 1
+46 609 1
+46 624 1
+46 656 1
+46 664 1
+46 681 1
+46 704 1
+46 715 1
+46 749 1
+46 838 1
+46 844 1
+46 857 1
+46 991 1
+46 993 1
+46 1279 1
+46 1425 1
+46 1542 1
+46 1565 1
+46 1593 1
+46 1758 1
+46 3435 1
+46 3506 1
+46 8287 1
+47 3 1
+47 8 1
+47 10 1
+47 19 1
+47 28 1
+47 39 1
+47 50 1
+47 54 1
+47 55 1
+47 56 1
+47 61 1
+47 72 1
+47 80 1
+47 93 1
+47 94 1
+47 127 1
+47 135 1
+47 140 1
+47 151 1
+47 152 1
+47 154 1
+47 163 1
+47 168 1
+47 178 1
+47 182 1
+47 214 1
+47 216 1
+47 226 1
+47 243 1
+47 250 1
+47 252 1
+47 257 1
+47 271 1
+47 274 1
+47 282 1
+47 286 1
+47 290 1
+47 299 1
+47 300 1
+47 302 1
+47 304 1
+47 317 1
+47 322 1
+47 324 1
+47 334 1
+47 356 1
+47 389 1
+47 402 1
+47 405 1
+47 415 1
+47 427 1
+47 428 1
+47 431 1
+47 435 1
+47 447 1
+47 545 1
+47 560 1
+47 609 1
+47 644 1
+47 656 1
+47 664 1
+47 667 1
+47 675 1
+47 704 1
+47 739 1
+47 756 1
+47 761 1
+47 789 1
+47 820 1
+47 844 1
+47 857 1
+47 935 1
+47 958 1
+47 989 1
+47 993 1
+47 1111 1
+47 1186 1
+47 1211 1
+47 1236 1
+47 1248 1
+47 1284 1
+47 1285 1
+47 1286 1
+47 1297 1
+47 1300 1
+47 1307 1
+47 1378 1
+47 1420 1
+47 1453 1
+47 1514 1
+47 1564 1
+47 1573 1
+47 1585 1
+47 1603 1
+47 1717 1
+47 1723 1
+47 1726 1
+47 1787 1
+47 1855 1
+47 1859 1
+47 1884 1
+47 1956 1
+47 1965 1
+47 1966 1
+47 1983 1
+47 2007 1
+47 2062 1
+47 2066 1
+47 2079 1
+47 2091 1
+47 2185 1
+47 2193 1
+47 2240 1
+47 2397 1
+47 2398 1
+47 2409 1
+47 2470 1
+47 2485 1
+47 2506 1
+47 2565 1
+47 2754 1
+47 2777 1
+47 2871 1
+47 2900 1
+47 2955 1
+47 3136 1
+47 3352 1
+47 3631 1
+47 3720 1
+47 3755 1
+47 3803 1
+47 3897 1
+47 3946 1
+47 4037 1
+47 4058 1
+47 4189 1
+47 4256 1
+47 4735 1
+47 5254 1
+47 5412 1
+47 5922 1
+47 6227 1
+47 6875 1
+47 8212 1
+47 8282 1
+47 8294 1
+48 28 1
+48 54 1
+48 86 1
+48 94 1
+48 168 1
+48 214 1
+48 250 1
+48 252 1
+48 271 1
+48 282 1
+48 299 1
+48 310 1
+48 356 1
+48 391 1
+48 421 1
+48 564 1
+48 664 1
+48 817 1
+48 878 1
+48 1211 1
+48 1864 1
+49 28 1
+49 54 1
+49 214 1
+49 363 1
+49 370 1
+49 396 1
+49 517 1
+49 664 1
+49 749 1
+49 762 1
+49 1031 1
+49 1123 1
+49 1211 1
+49 1550 1
+49 2643 1
+50 23 1
+50 28 1
+50 54 1
+50 61 1
+50 154 1
+50 216 1
+50 219 1
+50 250 1
+50 252 1
+50 257 1
+50 261 1
+50 271 1
+50 273 1
+50 299 1
+51 33 1
+51 39 1
+51 54 1
+51 55 1
+51 56 1
+51 72 1
+51 80 1
+51 93 1
+51 175 1
+51 214 1
+51 246 1
+51 271 1
+51 280 1
+51 299 1
+51 325 1
+51 589 1
+51 609 1
+51 611 1
+51 656 1
+51 739 1
+51 750 1
+51 756 1
+51 791 1
+51 893 1
+52 54 1
+53 15 1
+53 28 1
+53 54 1
+53 274 1
+53 806 1
+53 857 1
+53 1744 1
+53 2114 1
+53 2324 1
+53 2535 1
+53 2657 1
+53 2686 1
+53 2774 1
+53 2900 1
+53 3192 1
+53 3276 1
+53 3352 1
+53 3568 1
+53 3646 1
+53 3650 1
+53 3717 1
+53 3755 1
+53 3812 1
+53 4011 1
+53 4088 1
+53 4099 1
+53 4162 1
+53 4183 1
+53 4191 1
+53 4235 1
+53 4335 1
+53 4389 1
+53 4666 1
+53 4735 1
+53 4764 1
+53 5079 1
+53 5640 1
+53 5804 1
+53 5998 1
+29 3 1
+29 8 1
+29 10 1
+29 23 1
+29 28 1
+29 33 1
+29 39 1
+29 50 1
+29 54 1
+29 55 1
+29 56 1
+29 75 1
+29 86 1
+29 93 1
+29 95 1
+29 105 1
+29 127 1
+29 130 1
+29 140 1
+29 147 1
+29 150 1
+29 151 1
+29 152 1
+29 154 1
+29 183 1
+29 214 1
+29 228 1
+29 243 1
+29 246 1
+29 252 1
+29 259 1
+29 261 1
+29 271 1
+29 273 1
+29 274 1
+29 282 1
+29 286 1
+29 299 1
+29 300 1
+29 308 1
+29 313 1
+29 317 1
+29 322 1
+29 348 1
+29 356 1
+29 358 1
+29 362 1
+29 389 1
+29 391 1
+29 394 1
+29 396 1
+29 402 1
+29 406 1
+29 407 1
+29 415 1
+29 428 1
+29 435 1
+29 439 1
+29 524 1
+29 538 1
+29 549 1
+29 587 1
+29 589 1
+29 600 1
+29 604 1
+29 611 1
+29 627 1
+29 656 1
+29 659 1
+29 665 1
+29 667 1
+29 668 1
+29 670 1
+29 673 1
+29 674 1
+29 677 1
+29 681 1
+29 684 1
+29 700 1
+29 704 1
+29 715 1
+29 719 1
+29 722 1
+29 730 1
+29 733 1
+29 739 1
+29 756 1
+29 761 1
+29 789 1
+29 810 1
+29 829 1
+29 837 1
+29 838 1
+29 840 1
+29 857 1
+29 863 1
+29 866 1
+29 868 1
+29 878 1
+29 882 1
+29 893 1
+29 895 1
+29 904 1
+29 918 1
+29 929 1
+29 932 1
+29 934 1
+29 936 1
+29 938 1
+29 942 1
+29 956 1
+29 958 1
+29 966 1
+29 1014 1
+29 1026 1
+29 1053 1
+29 1061 1
+29 1080 1
+29 1131 1
+29 1297 1
+29 1307 1
+29 1548 1
+29 1549 1
+29 1772 1
+29 2252 1
+29 2273 1
+29 2565 1
+29 3643 1
+29 3717 1
+29 3720 1
+29 3843 1
+29 4011 1
+29 4021 1
+29 4088 1
+29 4103 1
+29 4666 1
+29 5404 1
+29 5545 1
+29 5582 1
+29 5922 1
+29 6198 1
+29 6498 1
+29 6503 1
+29 6913 1
+29 6946 1
+29 7040 1
+29 7052 1
+29 7119 1
+29 7295 1
+29 8294 1
+55 6 1
+55 8 1
+55 28 1
+55 29 1
+55 36 1
+55 38 1
+55 56 1
+55 61 1
+55 75 1
+55 80 1
+55 86 1
+55 94 1
+55 135 1
+55 144 1
+55 152 1
+55 214 1
+55 216 1
+55 243 1
+55 250 1
+55 252 1
+55 271 1
+55 282 1
+55 299 1
+55 302 1
+55 304 1
+55 308 1
+55 313 1
+55 317 1
+55 321 1
+55 325 1
+55 348 1
+55 356 1
+55 370 1
+55 373 1
+55 379 1
+55 402 1
+55 407 1
+55 439 1
+55 447 1
+55 488 1
+55 514 1
+55 549 1
+55 673 1
+55 682 1
+55 696 1
+55 697 1
+55 714 1
+55 730 1
+55 733 1
+55 739 1
+55 761 1
+55 784 1
+55 793 1
+55 795 1
+55 918 1
+55 942 1
+55 956 1
+55 958 1
+55 1014 1
+55 1020 1
+55 1030 1
+55 1080 1
+55 1123 1
+55 1432 1
+56 6 1
+56 28 1
+56 49 1
+56 61 1
+56 105 1
+56 152 1
+56 175 1
+56 192 1
+56 214 1
+56 368 1
+56 415 1
+56 515 1
+56 622 1
+56 750 1
+56 762 1
+56 1077 1
+56 1211 1
+56 1549 1
+56 2151 1
+56 2211 1
+56 2323 1
+56 2651 1
+56 8287 1
+56 8290 1
+57 55 1
+57 61 1
+57 228 1
+57 271 1
+57 299 1
+57 415 1
+57 549 1
+57 656 1
+57 673 1
+57 675 1
+57 756 1
+57 789 1
+57 817 1
+58 15 1
+58 23 1
+58 28 1
+58 50 1
+58 55 1
+58 61 1
+58 75 1
+58 80 1
+58 89 1
+58 93 1
+58 94 1
+58 127 1
+58 132 1
+58 144 1
+58 154 1
+58 163 1
+58 167 1
+58 183 1
+58 257 1
+58 271 1
+58 274 1
+58 290 1
+58 299 1
+58 310 1
+58 322 1
+58 325 1
+58 853 1
+58 1186 1
+58 1697 1
+58 1966 1
+58 2345 1
+58 2877 1
+58 5079 1
+58 5254 1
+58 5378 1
+58 5412 1
+58 6044 1
+58 8237 1
+59 3 1
+59 15 1
+59 28 1
+59 33 1
+59 49 1
+59 56 1
+59 61 1
+59 86 1
+59 152 1
+59 167 1
+59 168 1
+59 204 1
+59 214 1
+59 219 1
+59 228 1
+59 252 1
+59 271 1
+59 298 1
+59 370 1
+59 371 1
+59 372 1
+59 377 1
+59 378 1
+59 391 1
+59 407 1
+59 417 1
+59 421 1
+59 425 1
+59 431 1
+59 549 1
+59 564 1
+59 584 1
+59 600 1
+59 643 1
+59 723 1
+59 733 1
+59 763 1
+59 861 1
+59 895 1
+59 928 1
+59 935 1
+59 937 1
+59 959 1
+59 1000 1
+59 1034 1
+59 1125 1
+59 1131 1
+59 1152 1
+59 1201 1
+59 1230 1
+59 1315 1
+59 1357 1
+59 1396 1
+59 1416 1
+59 1464 1
+59 1476 1
+59 1484 1
+59 1595 1
+59 1604 1
+59 1633 1
+59 1781 1
+59 1808 1
+59 1836 1
+59 1842 1
+59 1893 1
+59 1918 1
+59 2062 1
+59 2066 1
+59 2174 1
+59 2345 1
+59 2371 1
+59 2375 1
+59 2397 1
+59 2400 1
+59 2470 1
+59 2547 1
+59 2550 1
+59 2560 1
+59 2724 1
+59 2727 1
+59 2922 1
+59 2946 1
+59 2955 1
+59 2963 1
+59 2966 1
+59 2972 1
+59 2977 1
+59 2979 1
+59 3015 1
+59 3408 1
+59 3807 1
+59 5404 1
+59 5624 1
+59 6166 1
+60 61 1
+60 1374 1
+60 1521 1
+60 1717 1
+60 1726 1
+60 1956 1
+60 2252 1
+60 2625 1
+60 7624 1
+62 6 1
+62 243 1
+62 280 1
+62 363 1
+62 370 1
+62 415 1
+62 606 1
+62 607 1
+62 609 1
+62 611 1
+62 2091 1
+62 2092 1
+62 2095 1
+62 2185 1
+62 2193 1
+62 2247 1
+62 2470 1
+27 6 1
+27 15 1
+27 19 1
+27 28 1
+27 34 1
+27 55 1
+27 93 1
+27 132 1
+27 135 1
+27 140 1
+27 144 1
+27 152 1
+27 153 1
+27 167 1
+27 175 1
+27 182 1
+27 183 1
+27 216 1
+27 219 1
+27 226 1
+27 243 1
+27 271 1
+27 274 1
+27 280 1
+27 282 1
+27 301 1
+27 302 1
+27 306 1
+27 310 1
+27 319 1
+27 325 1
+27 348 1
+27 362 1
+27 370 1
+27 371 1
+27 373 1
+27 377 1
+27 379 1
+27 390 1
+27 394 1
+27 396 1
+27 402 1
+27 422 1
+27 427 1
+27 433 1
+27 435 1
+27 566 1
+27 567 1
+27 584 1
+27 586 1
+27 590 1
+27 604 1
+27 606 1
+27 609 1
+27 613 1
+27 616 1
+27 624 1
+27 627 1
+27 628 1
+27 631 1
+27 636 1
+27 645 1
+27 656 1
+27 664 1
+27 667 1
+27 668 1
+27 670 1
+27 673 1
+27 681 1
+27 684 1
+27 687 1
+27 700 1
+27 719 1
+27 737 1
+27 741 1
+27 743 1
+27 746 1
+27 748 1
+27 866 1
+27 1092 1
+27 2369 1
+27 2398 1
+27 2696 1
+27 2917 1
+27 3456 1
+27 3537 1
+27 3643 1
+27 4044 1
+27 4189 1
+27 4191 1
+27 4335 1
+27 4400 1
+27 4448 1
+27 4715 1
+27 4828 1
+27 5210 1
+27 5254 1
+27 5412 1
+27 5459 1
+27 5743 1
+27 5844 1
+27 6246 1
+63 6 1
+64 6 1
+65 6 1
+65 89 1
+66 6 1
+66 28 1
+66 55 1
+66 56 1
+66 152 1
+66 183 1
+66 282 1
+66 302 1
+66 338 1
+66 359 1
+66 394 1
+66 402 1
+66 600 1
+66 607 1
+66 665 1
+66 756 1
+66 784 1
+66 977 1
+66 1012 1
+66 1026 1
+66 1075 1
+66 1131 1
+66 1193 1
+66 1267 1
+66 1717 1
+66 1729 1
+66 2014 1
+66 2062 1
+66 2117 1
+66 2193 1
+66 2237 1
+66 2470 1
+66 2625 1
+66 2651 1
+66 2799 1
+66 3352 1
+66 3464 1
+66 3680 1
+66 3803 1
+66 4588 1
+66 4687 1
+66 5529 1
+66 5614 1
+66 7961 1
+72 8 1
+72 15 1
+72 28 1
+72 39 1
+72 56 1
+72 89 1
+72 144 1
+72 152 1
+72 178 1
+72 182 1
+72 204 1
+72 226 1
+72 232 1
+72 236 1
+72 243 1
+72 261 1
+72 271 1
+72 282 1
+72 299 1
+72 313 1
+72 321 1
+72 322 1
+72 325 1
+72 341 1
+72 356 1
+72 370 1
+72 371 1
+72 407 1
+72 422 1
+72 427 1
+72 431 1
+72 432 1
+72 435 1
+72 439 1
+72 440 1
+72 514 1
+72 549 1
+72 566 1
+72 567 1
+72 584 1
+72 586 1
+72 589 1
+72 590 1
+72 592 1
+72 600 1
+72 636 1
+72 637 1
+72 659 1
+72 663 1
+72 667 1
+72 697 1
+72 704 1
+72 714 1
+72 719 1
+72 730 1
+72 733 1
+72 739 1
+72 756 1
+72 761 1
+72 762 1
+72 789 1
+72 794 1
+72 802 1
+72 820 1
+72 844 1
+72 857 1
+72 881 1
+72 885 1
+72 895 1
+72 896 1
+72 943 1
+72 946 1
+72 947 1
+72 959 1
+72 966 1
+72 972 1
+72 975 1
+72 989 1
+72 991 1
+72 993 1
+72 1007 1
+72 1023 1
+72 1026 1
+72 1031 1
+72 1035 1
+72 1053 1
+72 1062 1
+72 1123 1
+72 1131 1
+72 1156 1
+72 1193 1
+72 1211 1
+72 1279 1
+72 1310 1
+72 1319 1
+72 1352 1
+72 1378 1
+72 1394 1
+72 1396 1
+72 1538 1
+72 1549 1
+72 1573 1
+72 1597 1
+72 1621 1
+72 1622 1
+72 1637 1
+72 1717 1
+72 1718 1
+72 1842 1
+72 1848 1
+72 1982 1
+72 2066 1
+72 2398 1
+72 2535 1
+72 2565 1
+72 2774 1
+72 2775 1
+72 3136 1
+72 3164 1
+72 3238 1
+72 3276 1
+72 3291 1
+72 3334 1
+72 3352 1
+72 3443 1
+72 3459 1
+72 3479 1
+72 3498 1
+72 3607 1
+72 3970 1
+72 4037 1
+72 4098 1
+72 4099 1
+72 4276 1
+72 4335 1
+72 4994 1
+72 5022 1
+72 5061 1
+72 5079 1
+72 5254 1
+72 5321 1
+72 5459 1
+72 5511 1
+72 5524 1
+72 5683 1
+72 6004 1
+72 6229 1
+72 6437 1
+72 6566 1
+72 6715 1
+72 6774 1
+72 6790 1
+72 6832 1
+72 6833 1
+72 6855 1
+72 6979 1
+72 7050 1
+72 7279 1
+72 7478 1
+72 7620 1
+72 7632 1
+72 8042 1
+72 8128 1
+72 8295 1
+73 3 1
+73 8 1
+73 28 1
+73 75 1
+73 95 1
+73 152 1
+73 214 1
+73 243 1
+73 274 1
+73 299 1
+73 363 1
+73 378 1
+73 394 1
+75 8 1
+75 28 1
+75 32 1
+75 56 1
+75 94 1
+75 152 1
+75 154 1
+75 192 1
+75 246 1
+75 299 1
+75 370 1
+75 514 1
+75 515 1
+75 545 1
+75 549 1
+75 600 1
+75 739 1
+75 756 1
+75 771 1
+75 928 1
+75 1077 1
+75 1186 1
+75 1243 1
+75 1248 1
+75 1861 1
+75 1864 1
+75 1884 1
+75 1956 1
+75 3755 1
+75 8284 1
+75 8285 1
+76 8 1
+76 514 1
+78 8 1
+78 28 1
+78 49 1
+78 56 1
+78 144 1
+78 214 1
+78 258 1
+78 261 1
+78 300 1
+78 302 1
+78 368 1
+78 377 1
+78 378 1
+78 379 1
+78 390 1
+78 391 1
+78 392 1
+78 396 1
+78 415 1
+78 419 1
+78 421 1
+78 422 1
+78 428 1
+78 431 1
+78 433 1
+78 517 1
+78 524 1
+78 566 1
+78 567 1
+78 659 1
+78 793 1
+78 857 1
+78 1192 1
+78 1211 1
+78 1464 1
+78 1513 1
+78 1514 1
+78 1652 1
+78 1654 1
+78 1662 1
+78 8287 1
+79 8 1
+79 29 1
+79 50 1
+79 55 1
+79 75 1
+79 93 1
+79 94 1
+79 153 1
+79 167 1
+79 192 1
+79 214 1
+79 236 1
+79 243 1
+79 252 1
+79 271 1
+79 299 1
+79 302 1
+79 311 1
+79 313 1
+79 341 1
+79 356 1
+79 370 1
+79 391 1
+79 407 1
+79 435 1
+79 477 1
+79 514 1
+79 515 1
+79 600 1
+79 637 1
+79 659 1
+79 697 1
+79 704 1
+79 733 1
+79 756 1
+79 784 1
+79 789 1
+79 817 1
+79 857 1
+79 864 1
+79 875 1
+79 878 1
+79 893 1
+79 930 1
+79 934 1
+79 955 1
+79 958 1
+79 979 1
+79 1014 1
+79 1020 1
+79 1053 1
+79 8284 1
+79 8287 1
+77 8 1
+77 28 1
+77 49 1
+77 108 1
+77 130 1
+77 175 1
+77 214 1
+77 219 1
+77 271 1
+77 299 1
+77 363 1
+77 524 1
+77 604 1
+77 624 1
+77 644 1
+77 700 1
+77 868 1
+77 878 1
+77 1185 1
+77 1193 1
+77 1372 1
+77 1550 1
+77 1563 1
+77 1816 1
+77 3812 1
+80 8 1
+80 29 1
+80 33 1
+80 50 1
+80 55 1
+80 75 1
+80 86 1
+80 144 1
+80 150 1
+80 151 1
+80 168 1
+80 236 1
+80 252 1
+80 255 1
+80 271 1
+80 280 1
+80 282 1
+80 299 1
+80 304 1
+80 310 1
+80 311 1
+80 319 1
+80 322 1
+80 325 1
+80 339 1
+80 356 1
+80 370 1
+80 402 1
+80 433 1
+80 439 1
+80 560 1
+80 590 1
+80 600 1
+80 619 1
+80 631 1
+80 636 1
+80 643 1
+80 656 1
+80 657 1
+80 658 1
+80 664 1
+80 675 1
+80 681 1
+80 684 1
+80 719 1
+80 723 1
+80 725 1
+80 730 1
+80 733 1
+80 739 1
+80 746 1
+80 756 1
+80 779 1
+80 789 1
+80 798 1
+80 817 1
+80 857 1
+80 945 1
+80 1026 1
+81 8 1
+81 28 1
+81 32 1
+81 55 1
+81 93 1
+81 105 1
+81 175 1
+81 192 1
+81 214 1
+81 273 1
+81 299 1
+81 477 1
+81 506 1
+81 517 1
+81 524 1
+81 1157 1
+81 1218 1
+81 8287 1
+83 33 1
+83 371 1
+83 517 1
+83 1384 1
+83 1385 1
+83 1749 1
+83 2963 1
+83 8287 1
+91 33 1
+91 55 1
+67 33 1
+67 56 1
+67 75 1
+67 132 1
+67 153 1
+67 178 1
+67 192 1
+67 214 1
+67 274 1
+67 282 1
+67 299 1
+67 356 1
+67 391 1
+67 405 1
+67 515 1
+67 756 1
+67 2508 1
+84 33 1
+85 33 1
+86 15 1
+86 33 1
+86 35 1
+86 50 1
+86 55 1
+86 56 1
+86 150 1
+86 214 1
+86 228 1
+86 243 1
+86 259 1
+86 271 1
+86 282 1
+86 299 1
+86 304 1
+86 308 1
+86 313 1
+86 325 1
+86 332 1
+86 391 1
+86 405 1
+86 407 1
+86 415 1
+86 428 1
+86 439 1
+86 447 1
+86 538 1
+86 549 1
+86 564 1
+86 600 1
+86 626 1
+86 674 1
+86 696 1
+86 719 1
+86 733 1
+86 750 1
+86 756 1
+86 761 1
+86 762 1
+86 794 1
+86 795 1
+86 820 1
+86 857 1
+86 866 1
+86 878 1
+86 893 1
+86 895 1
+86 908 1
+86 913 1
+86 918 1
+86 932 1
+86 937 1
+86 972 1
+86 981 1
+86 989 1
+86 991 1
+86 1007 1
+86 1014 1
+86 1026 1
+86 1131 1
+86 1186 1
+86 1234 1
+86 1248 1
+86 1297 1
+86 1305 1
+86 1432 1
+86 1514 1
+86 1525 1
+86 1569 1
+86 1585 1
+86 1672 1
+86 1718 1
+86 1835 1
+86 1855 1
+86 1857 1
+86 1859 1
+86 1987 1
+86 2016 1
+86 2128 1
+86 2157 1
+86 2160 1
+86 2354 1
+86 2397 1
+86 2409 1
+86 2570 1
+86 2576 1
+86 2643 1
+86 2754 1
+86 2763 1
+86 2775 1
+86 2799 1
+86 2809 1
+86 2923 1
+86 3050 1
+86 3092 1
+86 3136 1
+86 3310 1
+86 3443 1
+86 3529 1
+86 3537 1
+86 3576 1
+86 3681 1
+86 3897 1
+86 3970 1
+86 4055 1
+86 4099 1
+86 4247 1
+86 4338 1
+86 4687 1
+86 4719 1
+86 4828 1
+86 4962 1
+86 5028 1
+86 5421 1
+86 5449 1
+86 5936 1
+86 6094 1
+86 6327 1
+86 6914 1
+86 6930 1
+86 7553 1
+86 8291 1
+71 19 1
+71 33 1
+71 35 1
+71 50 1
+71 55 1
+71 75 1
+71 80 1
+71 86 1
+71 93 1
+71 94 1
+71 144 1
+71 151 1
+71 168 1
+71 214 1
+71 226 1
+71 228 1
+71 236 1
+71 257 1
+71 271 1
+71 299 1
+71 319 1
+71 356 1
+71 370 1
+71 391 1
+71 402 1
+71 415 1
+71 427 1
+71 435 1
+71 439 1
+71 447 1
+71 549 1
+71 560 1
+71 564 1
+71 600 1
+71 631 1
+71 706 1
+71 762 1
+71 789 1
+71 895 1
+71 908 1
+71 937 1
+71 963 1
+71 971 1
+71 989 1
+71 1014 1
+71 1026 1
+71 1034 1
+71 1248 1
+71 1297 1
+71 1357 1
+71 1453 1
+71 1465 1
+71 1497 1
+71 1513 1
+71 1518 1
+71 1549 1
+71 1573 1
+71 1585 1
+71 1593 1
+71 1636 1
+71 1811 1
+71 1859 1
+71 1915 1
+71 1918 1
+71 1956 1
+71 1966 1
+71 2095 1
+71 2106 1
+71 2114 1
+71 2210 1
+71 2328 1
+71 2398 1
+71 2400 1
+71 2409 1
+71 2535 1
+71 2646 1
+71 2763 1
+71 2775 1
+71 2801 1
+71 2946 1
+71 2972 1
+71 3027 1
+71 3334 1
+71 3352 1
+71 3529 1
+71 3562 1
+71 3576 1
+71 3635 1
+71 3681 1
+71 3800 1
+71 3804 1
+71 3892 1
+71 3897 1
+71 3970 1
+71 4037 1
+71 4735 1
+71 4780 1
+71 5058 1
+71 5079 1
+71 5254 1
+71 5421 1
+71 5449 1
+71 5671 1
+71 5714 1
+71 6094 1
+71 6327 1
+71 6914 1
+71 7809 1
+71 7921 1
+87 8 1
+87 15 1
+87 28 1
+87 29 1
+87 33 1
+87 35 1
+87 36 1
+87 55 1
+87 56 1
+87 72 1
+87 75 1
+87 86 1
+87 150 1
+87 151 1
+87 154 1
+87 183 1
+87 192 1
+87 204 1
+87 259 1
+87 271 1
+87 282 1
+87 290 1
+87 299 1
+87 304 1
+87 313 1
+87 317 1
+87 348 1
+87 363 1
+87 372 1
+87 396 1
+87 407 1
+87 439 1
+87 515 1
+87 545 1
+87 549 1
+87 579 1
+87 600 1
+87 608 1
+87 647 1
+87 656 1
+87 658 1
+87 667 1
+87 696 1
+87 704 1
+87 737 1
+87 756 1
+87 761 1
+87 762 1
+87 765 1
+87 771 1
+87 789 1
+87 837 1
+87 913 1
+87 928 1
+87 932 1
+87 958 1
+87 963 1
+87 978 1
+87 989 1
+87 999 1
+87 1022 1
+87 1026 1
+87 1053 1
+87 1055 1
+87 1092 1
+87 1123 1
+87 1131 1
+87 1193 1
+87 1199 1
+87 1248 1
+87 1279 1
+87 1297 1
+87 1307 1
+87 1330 1
+87 1352 1
+87 1382 1
+87 1411 1
+87 1413 1
+87 1484 1
+87 1549 1
+87 1573 1
+87 1585 1
+87 1604 1
+87 1717 1
+87 1718 1
+87 1847 1
+87 1855 1
+87 1956 1
+87 1965 1
+87 2053 1
+87 2066 1
+87 2256 1
+87 2264 1
+87 2354 1
+87 2398 1
+87 2456 1
+87 2535 1
+87 2565 1
+87 2576 1
+87 2623 1
+87 2754 1
+87 2764 1
+87 2774 1
+87 2790 1
+87 2801 1
+87 2900 1
+87 2925 1
+87 3027 1
+87 3117 1
+87 3192 1
+87 3238 1
+87 3276 1
+87 3334 1
+87 3352 1
+87 3443 1
+87 3453 1
+87 3460 1
+87 3464 1
+87 3473 1
+87 3479 1
+87 3516 1
+87 3873 1
+87 3892 1
+87 3897 1
+87 3912 1
+87 3962 1
+87 4037 1
+87 4078 1
+87 4099 1
+87 4110 1
+87 4124 1
+87 4191 1
+87 4332 1
+87 4338 1
+87 4400 1
+87 4453 1
+87 4485 1
+87 4510 1
+87 4632 1
+87 4687 1
+87 4712 1
+87 4715 1
+87 4735 1
+87 4748 1
+87 5020 1
+87 5022 1
+87 5028 1
+87 5055 1
+87 5072 1
+87 5200 1
+87 5210 1
+87 5254 1
+87 5308 1
+87 5392 1
+87 5412 1
+87 5415 1
+87 5421 1
+87 5439 1
+87 5449 1
+87 5459 1
+87 5484 1
+87 5584 1
+87 5630 1
+87 5683 1
+87 5684 1
+87 5697 1
+87 5732 1
+87 5737 1
+87 5775 1
+87 5790 1
+87 5798 1
+87 5804 1
+87 5963 1
+87 6006 1
+87 6156 1
+87 6174 1
+87 6296 1
+87 6337 1
+87 6400 1
+87 6407 1
+87 6437 1
+87 6441 1
+87 6458 1
+87 6496 1
+87 6553 1
+87 6737 1
+87 6930 1
+87 7381 1
+87 7478 1
+87 7649 1
+87 7662 1
+87 8141 1
+87 8174 1
+87 8212 1
+87 8287 1
+88 33 1
+89 15 1
+89 33 1
+89 35 1
+89 56 1
+89 86 1
+89 151 1
+89 153 1
+89 168 1
+89 243 1
+89 271 1
+89 310 1
+89 545 1
+89 682 1
+89 756 1
+89 1020 1
+89 1026 1
+89 1031 1
+89 1192 1
+89 1270 1
+89 1425 1
+89 1612 1
+89 2144 1
+89 2145 1
+89 2328 1
+89 2657 1
+89 2991 1
+89 3404 1
+89 3921 1
+89 3974 1
+90 15 1
+90 23 1
+90 28 1
+90 29 1
+90 33 1
+90 35 1
+90 39 1
+90 55 1
+90 72 1
+90 75 1
+90 86 1
+90 171 1
+90 204 1
+90 214 1
+90 243 1
+90 252 1
+90 271 1
+90 290 1
+90 308 1
+90 321 1
+90 338 1
+90 407 1
+90 417 1
+90 439 1
+90 477 1
+90 549 1
+90 559 1
+90 560 1
+90 600 1
+90 644 1
+90 733 1
+90 737 1
+90 749 1
+90 750 1
+90 756 1
+90 761 1
+90 820 1
+90 932 1
+90 958 1
+90 994 1
+90 1007 1
+90 1124 1
+90 1128 1
+90 1131 1
+90 1234 1
+90 1305 1
+90 1468 1
+90 1569 1
+90 1596 1
+90 1628 1
+90 1637 1
+90 1638 1
+90 1956 1
+90 2193 1
+90 2384 1
+90 2398 1
+90 2760 1
+90 3014 1
+90 3027 1
+90 3034 1
+90 3309 1
+90 3352 1
+90 3435 1
+90 3897 1
+90 3958 1
+90 4191 1
+90 4335 1
+90 4666 1
+90 4735 1
+90 5412 1
+90 5449 1
+90 8287 1
+93 153 1
+92 93 1
+92 105 1
+92 168 1
+92 300 1
+92 302 1
+82 93 1
+94 3 1
+94 19 1
+94 23 1
+94 28 1
+94 39 1
+94 56 1
+94 80 1
+94 86 1
+94 93 1
+94 127 1
+94 130 1
+94 132 1
+94 147 1
+94 150 1
+94 151 1
+94 152 1
+94 175 1
+94 183 1
+94 214 1
+94 219 1
+94 224 1
+94 243 1
+94 250 1
+94 252 1
+94 257 1
+94 258 1
+94 261 1
+94 271 1
+94 273 1
+94 274 1
+94 282 1
+94 286 1
+94 299 1
+94 301 1
+94 302 1
+94 304 1
+94 322 1
+94 324 1
+94 325 1
+94 348 1
+94 349 1
+94 356 1
+94 370 1
+94 389 1
+94 402 1
+94 405 1
+94 415 1
+94 549 1
+94 613 1
+94 616 1
+94 628 1
+94 631 1
+94 656 1
+94 659 1
+94 663 1
+94 668 1
+94 715 1
+94 739 1
+94 756 1
+94 779 1
+94 789 1
+94 798 1
+94 857 1
+94 859 1
+94 873 1
+94 937 1
+94 1053 1
+94 1123 1
+94 1186 1
+94 1201 1
+94 1243 1
+94 1956 1
+94 2062 1
+94 2128 1
+94 2237 1
+94 2499 1
+94 2643 1
+94 3034 1
+94 3089 1
+94 8282 1
+95 10 1
+95 108 1
+99 10 1
+99 271 1
+99 1498 1
+99 2565 1
+99 3293 1
+99 3371 1
+99 4071 1
+99 5022 1
+99 5055 1
+99 5412 1
+99 5812 1
+99 6560 1
+99 6592 1
+99 6634 1
+99 6737 1
+99 6765 1
+99 6774 1
+99 6918 1
+99 7574 1
+99 7588 1
+99 7632 1
+99 7803 1
+99 8132 1
+99 8237 1
+96 10 1
+96 28 1
+100 10 1
+100 34 1
+100 232 1
+100 378 1
+100 560 1
+98 10 1
+98 56 1
+98 86 1
+98 228 1
+98 514 1
+98 664 1
+98 966 1
+98 3002 1
+31 28 1
+31 49 1
+31 75 1
+31 95 1
+31 230 1
+31 322 1
+31 405 1
+31 506 1
+31 517 1
+31 857 1
+31 1402 1
+31 2348 1
+31 8285 1
+31 8286 1
+31 8287 1
+102 95 1
+102 108 1
+102 813 1
+102 1232 1
+102 1437 1
+103 28 1
+103 75 1
+103 80 1
+103 95 1
+103 144 1
+103 167 1
+103 182 1
+103 192 1
+103 255 1
+103 271 1
+103 299 1
+103 302 1
+103 306 1
+103 370 1
+103 391 1
+103 506 1
+103 579 1
+103 600 1
+103 656 1
+103 657 1
+103 665 1
+103 667 1
+103 681 1
+103 687 1
+103 700 1
+103 719 1
+103 739 1
+103 741 1
+103 746 1
+103 761 1
+103 1669 1
+103 1706 1
+103 1982 1
+103 2014 1
+103 2398 1
+103 2589 1
+103 2667 1
+103 2686 1
+103 2775 1
+103 2851 1
+103 2871 1
+103 2922 1
+103 3537 1
+103 4191 1
+103 4536 1
+103 4666 1
+103 4808 1
+103 4929 1
+103 4944 1
+103 5412 1
+103 5452 1
+103 5503 1
+103 5671 1
+103 5800 1
+103 5822 1
+103 5872 1
+103 6097 1
+103 6327 1
+103 6589 1
+103 6624 1
+103 6665 1
+103 6832 1
+103 6946 1
+103 6967 1
+103 7074 1
+103 7381 1
+103 7553 1
+103 7618 1
+115 95 1
+115 108 1
+115 506 1
+116 95 1
+116 756 1
+104 28 1
+104 55 1
+104 75 1
+104 94 1
+104 95 1
+104 150 1
+104 152 1
+104 178 1
+104 214 1
+104 243 1
+104 252 1
+104 282 1
+104 299 1
+104 302 1
+104 308 1
+104 356 1
+104 368 1
+104 377 1
+104 396 1
+104 477 1
+104 515 1
+104 664 1
+104 667 1
+104 955 1
+104 1077 1
+104 1100 1
+104 1103 1
+104 1192 1
+104 5022 1
+104 8287 1
+105 94 1
+105 95 1
+105 677 1
+106 28 1
+106 55 1
+106 95 1
+106 299 1
+106 579 1
+106 1211 1
+106 1595 1
+106 2211 1
+106 3033 1
+68 8 1
+68 15 1
+68 32 1
+68 56 1
+68 72 1
+68 75 1
+68 95 1
+68 127 1
+68 130 1
+68 271 1
+68 290 1
+68 368 1
+68 379 1
+68 465 1
+68 608 1
+68 650 1
+68 700 1
+68 762 1
+68 771 1
+68 825 1
+68 1026 1
+68 1157 1
+68 1159 1
+68 1239 1
+68 1352 1
+68 1374 1
+68 1437 1
+68 1498 1
+68 1549 1
+68 1592 1
+68 1633 1
+68 1637 1
+68 1646 1
+68 1680 1
+68 1688 1
+68 1706 1
+68 1792 1
+68 1855 1
+68 1919 1
+68 2001 1
+68 2066 1
+68 2072 1
+68 2102 1
+68 2134 1
+68 2160 1
+68 2174 1
+68 2209 1
+68 2237 1
+68 2264 1
+68 2276 1
+68 2307 1
+68 2325 1
+68 2328 1
+68 2338 1
+68 2354 1
+68 2371 1
+68 2440 1
+68 2535 1
+68 2565 1
+68 2576 1
+68 2579 1
+68 2587 1
+68 2593 1
+68 2597 1
+68 2612 1
+68 2618 1
+68 2643 1
+68 2653 1
+68 2654 1
+68 2697 1
+68 2708 1
+68 2760 1
+68 2764 1
+68 2765 1
+68 2774 1
+68 2775 1
+68 2809 1
+68 2814 1
+68 2859 1
+68 2871 1
+68 2877 1
+68 2900 1
+68 2912 1
+68 2951 1
+68 2973 1
+68 3014 1
+68 3018 1
+68 3021 1
+68 3024 1
+68 3026 1
+68 3028 1
+68 3034 1
+68 3050 1
+68 3056 1
+68 3084 1
+68 3089 1
+68 3117 1
+68 3145 1
+68 3150 1
+68 3192 1
+68 3238 1
+68 3258 1
+68 3276 1
+68 3307 1
+68 3313 1
+68 3334 1
+68 3351 1
+68 3352 1
+68 3371 1
+68 3376 1
+68 3435 1
+68 3439 1
+68 3443 1
+68 3454 1
+68 3459 1
+68 3473 1
+68 3489 1
+68 3498 1
+68 3506 1
+68 3537 1
+68 3557 1
+68 3586 1
+68 3607 1
+68 3614 1
+68 3634 1
+68 3635 1
+68 3643 1
+68 3661 1
+68 3691 1
+68 3806 1
+68 3807 1
+68 3816 1
+68 3892 1
+68 3897 1
+68 3946 1
+68 3949 1
+68 3958 1
+68 3980 1
+68 4013 1
+68 4024 1
+68 4037 1
+68 4040 1
+68 4051 1
+68 4055 1
+68 4065 1
+68 4099 1
+68 4111 1
+68 4124 1
+68 4162 1
+68 4179 1
+68 4201 1
+68 4211 1
+68 4212 1
+68 4231 1
+68 4247 1
+68 4290 1
+68 4310 1
+68 4335 1
+68 4338 1
+68 4351 1
+68 4373 1
+68 4453 1
+68 4485 1
+68 4536 1
+68 4574 1
+68 4584 1
+68 4587 1
+68 4588 1
+68 4604 1
+68 4613 1
+68 4631 1
+68 4791 1
+68 4795 1
+68 4828 1
+68 4875 1
+68 4884 1
+68 4896 1
+68 4944 1
+68 4981 1
+68 5002 1
+68 5022 1
+68 5061 1
+68 5079 1
+68 5096 1
+68 5123 1
+68 5179 1
+68 5188 1
+68 5210 1
+68 5226 1
+68 5233 1
+68 5245 1
+68 5254 1
+68 5262 1
+68 5288 1
+68 5323 1
+68 5351 1
+68 5404 1
+68 5412 1
+68 5415 1
+68 5423 1
+68 5430 1
+68 5437 1
+68 5445 1
+68 5449 1
+68 5457 1
+68 5459 1
+68 5463 1
+68 5484 1
+68 5524 1
+68 5527 1
+68 5543 1
+68 5545 1
+68 5605 1
+68 5620 1
+68 5637 1
+68 5639 1
+68 5655 1
+68 5671 1
+68 5680 1
+68 5697 1
+68 5721 1
+68 5732 1
+68 5745 1
+68 5780 1
+68 5806 1
+68 5814 1
+68 5839 1
+68 5848 1
+68 5860 1
+68 5863 1
+68 5886 1
+68 5902 1
+68 5922 1
+68 5925 1
+68 5933 1
+68 5936 1
+68 5972 1
+68 5994 1
+68 6083 1
+68 6097 1
+68 6098 1
+68 6124 1
+68 6130 1
+68 6156 1
+68 6229 1
+68 6262 1
+68 6306 1
+68 6400 1
+68 6407 1
+68 6437 1
+68 6505 1
+68 6599 1
+68 6634 1
+68 6682 1
+68 6774 1
+68 6784 1
+68 6832 1
+68 6914 1
+68 7063 1
+68 7094 1
+68 7115 1
+68 7168 1
+68 7233 1
+68 7341 1
+68 7544 1
+68 7553 1
+68 7620 1
+68 7632 1
+68 7795 1
+68 7839 1
+68 8051 1
+68 8178 1
+68 8287 1
+68 8293 1
+68 8295 1
+117 95 1
+118 95 1
+119 95 1
+107 95 1
+107 477 1
+107 517 1
+107 8287 1
+108 95 1
+108 8283 1
+109 95 1
+109 204 1
+109 290 1
+109 415 1
+109 993 1
+109 1018 1
+109 1074 1
+109 1151 1
+109 1164 1
+109 1199 1
+109 1234 1
+109 1261 1
+109 1297 1
+109 1425 1
+109 1468 1
+109 1521 1
+109 1538 1
+109 1622 1
+109 1628 1
+109 1679 1
+109 1718 1
+109 1758 1
+109 1816 1
+109 1969 1
+109 1982 1
+109 2106 1
+109 2160 1
+109 2273 1
+109 2397 1
+109 2440 1
+109 2511 1
+109 2535 1
+109 3291 1
+109 3310 1
+109 3334 1
+109 3459 1
+109 3614 1
+109 3634 1
+109 3752 1
+109 3792 1
+109 3830 1
+109 3897 1
+109 3962 1
+109 4037 1
+109 4099 1
+109 4361 1
+109 4401 1
+109 4441 1
+109 4483 1
+109 4536 1
+109 4632 1
+109 4687 1
+109 4709 1
+109 4712 1
+109 4715 1
+109 4717 1
+109 4748 1
+109 4786 1
+109 4795 1
+109 4798 1
+109 4940 1
+109 4994 1
+109 5002 1
+109 5022 1
+109 5028 1
+109 5079 1
+109 5096 1
+109 5140 1
+109 5179 1
+109 5188 1
+109 5200 1
+109 5210 1
+109 5254 1
+109 5273 1
+109 5295 1
+109 5321 1
+109 5404 1
+109 5423 1
+109 5465 1
+109 5479 1
+109 5484 1
+109 5524 1
+109 5543 1
+109 5563 1
+109 5596 1
+109 5626 1
+109 5697 1
+109 5714 1
+109 5739 1
+109 5760 1
+109 5798 1
+109 5799 1
+109 5800 1
+109 5802 1
+109 5804 1
+109 5818 1
+109 5819 1
+109 5822 1
+109 5824 1
+109 5827 1
+109 5829 1
+109 5839 1
+109 5871 1
+109 5902 1
+109 5933 1
+109 6001 1
+109 6006 1
+109 6043 1
+109 6097 1
+109 6123 1
+109 6156 1
+109 6174 1
+109 6272 1
+109 6296 1
+109 6306 1
+109 6328 1
+109 6330 1
+109 6344 1
+109 6376 1
+109 6407 1
+109 6417 1
+109 6437 1
+109 6442 1
+109 6458 1
+109 6464 1
+109 6481 1
+109 6505 1
+109 6511 1
+109 6523 1
+109 6528 1
+109 6529 1
+109 6552 1
+109 6555 1
+109 6567 1
+109 6576 1
+109 6596 1
+109 6600 1
+109 6665 1
+109 6699 1
+109 6715 1
+109 6765 1
+109 6770 1
+109 6774 1
+109 6788 1
+109 6832 1
+109 6860 1
+109 6901 1
+109 6913 1
+109 6914 1
+109 6934 1
+109 6946 1
+109 6951 1
+109 6955 1
+109 6979 1
+109 6980 1
+109 7005 1
+109 7021 1
+109 7047 1
+109 7052 1
+109 7063 1
+109 7092 1
+109 7101 1
+109 7115 1
+109 7168 1
+109 7185 1
+109 7225 1
+109 7280 1
+109 7373 1
+109 7393 1
+109 7400 1
+109 7414 1
+109 7553 1
+109 7620 1
+109 7632 1
+109 7649 1
+109 7662 1
+109 7668 1
+109 7694 1
+109 7757 1
+109 7763 1
+109 7788 1
+109 7809 1
+109 7810 1
+109 7908 1
+109 7924 1
+109 7961 1
+109 8042 1
+109 8237 1
+109 8291 1
+109 8297 1
+110 29 1
+110 49 1
+110 95 1
+110 108 1
+110 175 1
+110 228 1
+110 271 1
+110 282 1
+110 304 1
+110 306 1
+110 310 1
+110 313 1
+110 317 1
+110 322 1
+110 429 1
+110 477 1
+110 488 1
+110 506 1
+110 517 1
+110 524 1
+110 613 1
+110 616 1
+110 617 1
+110 622 1
+110 643 1
+110 656 1
+110 658 1
+110 665 1
+110 667 1
+110 670 1
+110 674 1
+110 677 1
+110 682 1
+110 705 1
+110 722 1
+110 730 1
+110 733 1
+110 744 1
+110 789 1
+110 794 1
+110 810 1
+110 837 1
+110 838 1
+110 839 1
+110 844 1
+110 857 1
+110 859 1
+110 863 1
+110 866 1
+110 868 1
+110 881 1
+110 882 1
+110 885 1
+110 893 1
+110 895 1
+110 897 1
+110 904 1
+110 918 1
+110 929 1
+110 930 1
+110 932 1
+110 934 1
+110 936 1
+110 937 1
+110 942 1
+110 945 1
+110 955 1
+110 966 1
+110 972 1
+110 979 1
+110 981 1
+110 989 1
+110 991 1
+110 1007 1
+110 1014 1
+110 1092 1
+110 1191 1
+110 1492 1
+110 1700 1
+110 1836 1
+110 1842 1
+110 1964 1
+110 2193 1
+110 2397 1
+110 2400 1
+110 2426 1
+110 4435 1
+110 4981 1
+110 5079 1
+110 7005 1
+110 7855 1
+110 7862 1
+110 8285 1
+110 8287 1
+110 8288 1
+111 3 1
+111 39 1
+111 80 1
+111 86 1
+111 95 1
+111 192 1
+111 271 1
+111 300 1
+111 306 1
+111 308 1
+111 373 1
+111 377 1
+111 378 1
+111 477 1
+111 517 1
+111 600 1
+111 611 1
+111 636 1
+111 668 1
+111 730 1
+111 838 1
+111 857 1
+111 885 1
+111 895 1
+111 942 1
+111 994 1
+111 995 1
+111 1075 1
+111 1413 1
+120 15 1
+120 28 1
+120 95 1
+120 214 1
+120 299 1
+120 1186 1
+120 1569 1
+120 4795 1
+112 95 1
+121 95 1
+121 350 1
+121 368 1
+121 477 1
+121 524 1
+121 659 1
+121 857 1
+121 8283 1
+121 8285 1
+122 15 1
+122 95 1
+122 152 1
+122 204 1
+122 403 1
+122 417 1
+122 465 1
+122 608 1
+122 737 1
+122 765 1
+122 825 1
+122 856 1
+122 974 1
+122 1026 1
+122 1159 1
+122 1166 1
+122 1239 1
+122 1247 1
+122 1291 1
+122 1297 1
+122 1385 1
+122 1393 1
+122 1419 1
+122 1453 1
+122 1549 1
+122 1637 1
+122 1653 1
+122 1723 1
+122 1729 1
+122 1777 1
+122 1792 1
+122 1837 1
+122 1965 1
+122 1984 1
+122 1990 1
+122 1992 1
+122 2014 1
+122 2066 1
+122 2102 1
+122 2120 1
+122 2135 1
+122 2145 1
+122 2209 1
+122 2237 1
+122 2240 1
+122 2252 1
+122 2256 1
+122 2257 1
+122 2289 1
+122 2322 1
+122 2354 1
+122 2371 1
+122 2375 1
+122 2381 1
+122 2384 1
+122 2398 1
+122 2411 1
+122 2440 1
+122 2456 1
+122 2474 1
+122 2485 1
+122 2506 1
+122 2508 1
+122 2516 1
+122 2517 1
+122 2542 1
+122 2565 1
+122 2585 1
+122 2597 1
+122 2619 1
+122 2623 1
+122 2625 1
+122 2646 1
+122 2651 1
+122 2653 1
+122 2654 1
+122 2657 1
+122 2660 1
+122 2665 1
+122 2667 1
+122 2685 1
+122 2693 1
+122 2697 1
+122 2700 1
+122 2747 1
+122 2768 1
+122 2799 1
+122 2805 1
+122 2809 1
+122 2811 1
+122 2828 1
+122 2834 1
+122 2900 1
+122 2932 1
+122 2955 1
+122 2958 1
+122 2963 1
+122 2966 1
+122 2968 1
+122 2979 1
+122 2981 1
+122 3007 1
+122 3010 1
+122 3014 1
+122 3024 1
+122 3028 1
+122 3029 1
+122 3034 1
+122 3059 1
+122 3084 1
+122 3106 1
+122 3114 1
+122 3117 1
+122 3140 1
+122 3144 1
+122 3148 1
+122 3173 1
+122 3180 1
+122 3192 1
+122 3251 1
+122 3253 1
+122 3258 1
+122 3260 1
+122 3276 1
+122 3291 1
+122 3309 1
+122 3321 1
+122 3352 1
+122 3393 1
+122 3404 1
+122 3435 1
+122 3439 1
+122 3443 1
+122 3453 1
+122 3456 1
+122 3458 1
+122 3480 1
+122 3489 1
+122 3516 1
+122 3520 1
+122 3537 1
+122 3541 1
+122 3568 1
+122 3580 1
+122 3587 1
+122 3615 1
+122 3635 1
+122 3645 1
+122 3646 1
+122 3661 1
+122 3681 1
+122 3772 1
+122 3776 1
+122 3812 1
+122 3843 1
+122 3847 1
+122 3871 1
+122 3887 1
+122 3903 1
+122 3926 1
+122 3958 1
+122 3970 1
+122 3976 1
+122 4013 1
+122 4043 1
+122 4099 1
+122 4117 1
+122 4162 1
+122 4191 1
+122 4201 1
+122 4247 1
+122 4263 1
+122 4266 1
+122 4289 1
+122 4335 1
+122 4365 1
+122 4384 1
+122 4400 1
+122 4417 1
+122 4422 1
+122 4453 1
+122 4463 1
+122 4530 1
+122 4531 1
+122 4578 1
+122 4662 1
+122 4687 1
+122 4712 1
+122 4719 1
+122 4953 1
+122 4964 1
+122 4977 1
+122 4999 1
+122 5155 1
+122 5254 1
+122 5335 1
+122 5392 1
+122 5412 1
+122 5449 1
+122 5454 1
+122 5459 1
+122 5506 1
+122 5509 1
+122 5592 1
+122 5651 1
+122 5790 1
+122 5936 1
+122 5947 1
+122 6498 1
+122 7553 1
+122 7699 1
+122 8293 1
+122 8294 1
+113 8 1
+113 15 1
+113 28 1
+113 29 1
+113 32 1
+113 56 1
+113 75 1
+113 94 1
+113 95 1
+113 132 1
+113 140 1
+113 152 1
+113 214 1
+113 219 1
+113 228 1
+113 243 1
+113 290 1
+113 339 1
+113 370 1
+113 405 1
+113 428 1
+113 439 1
+113 524 1
+113 686 1
+113 722 1
+113 744 1
+113 762 1
+113 817 1
+113 829 1
+113 838 1
+113 849 1
+113 859 1
+113 868 1
+113 893 1
+113 959 1
+113 981 1
+113 1014 1
+113 1186 1
+113 1248 1
+113 1297 1
+113 1413 1
+113 1453 1
+113 1490 1
+113 1513 1
+113 1563 1
+113 1565 1
+113 1597 1
+113 1633 1
+113 1701 1
+113 1717 1
+113 1842 1
+113 1855 1
+113 2157 1
+113 2264 1
+113 2323 1
+113 2339 1
+113 2410 1
+113 2479 1
+113 2508 1
+113 2576 1
+113 2643 1
+113 2754 1
+113 3034 1
+113 3144 1
+113 3238 1
+113 3439 1
+113 3489 1
+113 3537 1
+113 3586 1
+113 3926 1
+113 4037 1
+113 4820 1
+113 4940 1
+113 5002 1
+113 5022 1
+113 5072 1
+113 5178 1
+113 5484 1
+113 5721 1
+113 5886 1
+113 5936 1
+113 6437 1
+113 6555 1
+113 7651 1
+113 7809 1
+113 7839 1
+113 8285 1
+113 8287 1
+113 8292 1
+123 95 1
+124 95 1
+124 108 1
+124 8283 1
+114 95 1
+130 56 1
+130 86 1
+130 152 1
+130 182 1
+130 271 1
+130 356 1
+130 439 1
+130 650 1
+130 656 1
+130 657 1
+130 733 1
+130 895 1
+130 936 1
+126 29 1
+126 55 1
+126 75 1
+126 86 1
+126 130 1
+126 228 1
+126 271 1
+126 321 1
+126 439 1
+126 447 1
+126 696 1
+126 697 1
+126 733 1
+126 742 1
+126 756 1
+126 789 1
+126 913 1
+126 956 1
+126 989 1
+126 1156 1
+126 1186 1
+126 1297 1
+126 1855 1
+126 2576 1
+126 5022 1
+127 3 1
+127 15 1
+127 28 1
+127 35 1
+127 130 1
+127 144 1
+127 152 1
+127 178 1
+127 204 1
+127 228 1
+127 232 1
+127 252 1
+127 259 1
+127 261 1
+127 271 1
+127 282 1
+127 290 1
+127 325 1
+127 332 1
+127 346 1
+127 379 1
+127 402 1
+127 417 1
+127 431 1
+127 435 1
+127 549 1
+127 584 1
+127 601 1
+127 607 1
+127 616 1
+127 650 1
+127 656 1
+127 700 1
+127 737 1
+127 762 1
+127 805 1
+127 849 1
+127 893 1
+127 956 1
+127 974 1
+127 978 1
+127 982 1
+127 1007 1
+127 1014 1
+127 1026 1
+127 1100 1
+127 1157 1
+127 1159 1
+127 1267 1
+127 1297 1
+127 1385 1
+127 1425 1
+127 1464 1
+127 1744 1
+127 1918 1
+127 1956 1
+127 2066 1
+127 2072 1
+127 2145 1
+127 2237 1
+127 2252 1
+127 2290 1
+127 2323 1
+127 2411 1
+127 2565 1
+127 2576 1
+127 2625 1
+127 2643 1
+127 2652 1
+127 2654 1
+127 2685 1
+127 2687 1
+127 2747 1
+127 2754 1
+127 2790 1
+127 2811 1
+127 2877 1
+127 2928 1
+127 2946 1
+127 2963 1
+127 2977 1
+127 2999 1
+127 3007 1
+127 3009 1
+127 3028 1
+127 3034 1
+127 3089 1
+127 3114 1
+127 3117 1
+127 3180 1
+127 3265 1
+127 3291 1
+127 3351 1
+127 3352 1
+127 3443 1
+127 3456 1
+127 3516 1
+127 3520 1
+127 3537 1
+127 3549 1
+127 3562 1
+127 3567 1
+127 3580 1
+127 3587 1
+127 3615 1
+127 3680 1
+127 3713 1
+127 3769 1
+127 3804 1
+127 3897 1
+127 3976 1
+127 4037 1
+127 4179 1
+127 4234 1
+127 4269 1
+127 4373 1
+127 4424 1
+127 4453 1
+127 4735 1
+127 4811 1
+127 4999 1
+127 5254 1
+127 5404 1
+127 5412 1
+127 5449 1
+127 5928 1
+127 6156 1
+127 7012 1
+127 7632 1
+127 8178 1
+127 8293 1
+127 8294 1
+128 28 1
+128 29 1
+128 86 1
+128 127 1
+128 130 1
+128 214 1
+128 216 1
+128 271 1
+128 348 1
+128 356 1
+128 372 1
+128 379 1
+128 407 1
+128 730 1
+128 761 1
+128 813 1
+128 857 1
+128 864 1
+128 873 1
+128 895 1
+128 904 1
+128 937 1
+128 960 1
+128 993 1
+128 1012 1
+128 1164 1
+128 1166 1
+128 1193 1
+128 1199 1
+128 1234 1
+128 1322 1
+128 1416 1
+128 1428 1
+128 1476 1
+128 1485 1
+128 1496 1
+128 1524 1
+128 1538 1
+128 1549 1
+128 1556 1
+128 1557 1
+128 1613 1
+128 1669 1
+128 1705 1
+128 1714 1
+128 1730 1
+128 1780 1
+128 1787 1
+128 1842 1
+128 1855 1
+128 1888 1
+128 1893 1
+128 1918 1
+128 1950 1
+128 1973 1
+128 2062 1
+128 2069 1
+128 2137 1
+128 2276 1
+128 2290 1
+128 2322 1
+128 2340 1
+128 2366 1
+128 2386 1
+128 2470 1
+128 2625 1
+128 2643 1
+128 2651 1
+128 2654 1
+128 2768 1
+128 2877 1
+128 2900 1
+128 2912 1
+128 2966 1
+128 3117 1
+128 3126 1
+128 3680 1
+128 8290 1
+128 8291 1
+128 8292 1
+129 55 1
+129 130 1
+129 299 1
+129 427 1
+132 19 1
+132 35 1
+132 56 1
+132 144 1
+132 152 1
+132 204 1
+132 271 1
+132 299 1
+132 310 1
+132 325 1
+132 370 1
+132 407 1
+132 428 1
+132 549 1
+132 656 1
+132 730 1
+132 756 1
+132 791 1
+132 829 1
+132 1100 1
+132 1151 1
+132 1374 1
+132 1633 1
+132 1861 1
+132 1864 1
+132 1956 1
+132 2643 1
+132 3769 1
+132 5321 1
+133 135 1
+133 144 1
+133 348 1
+133 349 1
+133 362 1
+133 370 1
+133 373 1
+133 391 1
+133 402 1
+133 7632 1
+134 144 1
+134 601 1
+135 144 1
+135 255 1
+135 310 1
+135 394 1
+135 402 1
+135 589 1
+135 656 1
+136 15 1
+136 19 1
+136 56 1
+136 80 1
+136 132 1
+136 144 1
+136 150 1
+136 178 1
+136 204 1
+136 232 1
+136 243 1
+136 258 1
+136 261 1
+136 349 1
+136 356 1
+136 389 1
+136 431 1
+136 440 1
+136 584 1
+136 739 1
+136 761 1
+136 1211 1
+136 1234 1
+136 1493 1
+136 1549 1
+136 1564 1
+136 1622 1
+136 1633 1
+136 1893 1
+136 1918 1
+136 1956 1
+136 1982 1
+136 1984 1
+136 2066 1
+136 2151 1
+136 2398 1
+136 2535 1
+136 3005 1
+136 3164 1
+136 3297 1
+136 3346 1
+136 3897 1
+136 3919 1
+136 4037 1
+136 4099 1
+136 4191 1
+136 4335 1
+136 4412 1
+136 4530 1
+136 4536 1
+136 4713 1
+136 4717 1
+136 4786 1
+136 4795 1
+136 5140 1
+136 5445 1
+136 5482 1
+136 5484 1
+136 5529 1
+136 5596 1
+136 5683 1
+136 5738 1
+136 5739 1
+136 5824 1
+136 5844 1
+136 5871 1
+136 5872 1
+136 5936 1
+136 5950 1
+136 5980 1
+136 6000 1
+136 6006 1
+136 6262 1
+136 6299 1
+136 6330 1
+136 6441 1
+136 6472 1
+136 6498 1
+136 6505 1
+136 6560 1
+136 6628 1
+136 6634 1
+136 6670 1
+136 6707 1
+136 6725 1
+136 6739 1
+136 6777 1
+136 6805 1
+136 6855 1
+136 6913 1
+136 6938 1
+136 6953 1
+136 6997 1
+136 7050 1
+136 7054 1
+136 7301 1
+136 7442 1
+136 7553 1
+136 7620 1
+137 144 1
+138 3 1
+138 19 1
+138 28 1
+138 36 1
+138 55 1
+138 86 1
+138 89 1
+138 132 1
+138 144 1
+138 151 1
+138 153 1
+138 163 1
+138 168 1
+138 224 1
+138 228 1
+138 236 1
+138 250 1
+138 252 1
+138 255 1
+138 259 1
+138 271 1
+138 274 1
+138 282 1
+138 298 1
+138 308 1
+138 317 1
+138 370 1
+138 373 1
+138 439 1
+138 440 1
+138 488 1
+138 560 1
+138 566 1
+138 590 1
+138 592 1
+138 600 1
+138 637 1
+138 656 1
+138 659 1
+138 663 1
+138 668 1
+138 673 1
+138 681 1
+138 719 1
+138 723 1
+138 730 1
+138 746 1
+138 749 1
+138 798 1
+138 806 1
+138 817 1
+138 849 1
+138 857 1
+138 863 1
+138 868 1
+138 871 1
+138 875 1
+138 941 1
+138 971 1
+138 1125 1
+138 1186 1
+138 1190 1
+138 1192 1
+138 1193 1
+138 1375 1
+138 1413 1
+138 1597 1
+138 1718 1
+138 1726 1
+138 1842 1
+138 2777 1
+138 4661 1
+139 3 1
+139 8 1
+139 28 1
+139 49 1
+139 75 1
+139 86 1
+139 144 1
+139 192 1
+139 228 1
+139 246 1
+139 252 1
+139 271 1
+139 282 1
+139 299 1
+139 302 1
+139 322 1
+139 439 1
+139 440 1
+139 611 1
+139 681 1
+139 741 1
+139 743 1
+139 748 1
+139 756 1
+139 760 1
+139 793 1
+139 802 1
+139 806 1
+139 822 1
+139 829 1
+139 849 1
+139 895 1
+139 958 1
+139 1507 1
+139 2790 1
+139 5459 1
+139 8288 1
+140 34 1
+140 39 1
+140 56 1
+140 80 1
+140 135 1
+140 144 1
+140 226 1
+140 258 1
+140 282 1
+140 339 1
+140 341 1
+140 348 1
+140 349 1
+140 356 1
+140 358 1
+140 359 1
+140 363 1
+140 370 1
+140 379 1
+140 389 1
+140 390 1
+140 396 1
+140 402 1
+140 415 1
+140 428 1
+140 431 1
+140 435 1
+140 590 1
+140 592 1
+140 606 1
+141 144 1
+142 34 1
+142 144 1
+142 147 1
+142 182 1
+142 243 1
+142 271 1
+142 299 1
+142 300 1
+142 301 1
+142 302 1
+142 349 1
+142 359 1
+142 363 1
+142 370 1
+142 371 1
+142 389 1
+142 402 1
+142 407 1
+142 432 1
+142 579 1
+142 682 1
+142 700 1
+142 1014 1
+142 1648 1
+142 1661 1
+143 3 1
+143 19 1
+143 28 1
+143 29 1
+143 35 1
+143 36 1
+143 80 1
+143 132 1
+143 135 1
+143 144 1
+143 171 1
+143 182 1
+143 183 1
+143 204 1
+143 214 1
+143 216 1
+143 226 1
+143 250 1
+143 252 1
+143 271 1
+143 274 1
+143 298 1
+143 299 1
+143 301 1
+143 313 1
+143 317 1
+143 334 1
+143 339 1
+143 363 1
+143 370 1
+143 373 1
+143 377 1
+143 378 1
+143 379 1
+143 390 1
+143 391 1
+143 394 1
+143 396 1
+143 402 1
+143 432 1
+143 559 1
+143 566 1
+143 567 1
+143 590 1
+143 633 1
+143 644 1
+143 647 1
+143 697 1
+143 704 1
+143 710 1
+143 762 1
+143 805 1
+143 817 1
+143 871 1
+143 887 1
+143 918 1
+143 960 1
+143 972 1
+143 991 1
+143 995 1
+143 1032 1
+143 1062 1
+143 1075 1
+143 1211 1
+143 1279 1
+143 1297 1
+143 1330 1
+143 1413 1
+143 1439 1
+143 1476 1
+143 1506 1
+143 1569 1
+143 1573 1
+143 1593 1
+143 1893 1
+143 2135 1
+143 2329 1
+143 2341 1
+143 2474 1
+143 2620 1
+143 2625 1
+143 3631 1
+143 3803 1
+143 4037 1
+143 5288 1
+143 5800 1
+143 5822 1
+143 6004 1
+143 6156 1
+143 6600 1
+143 6634 1
+143 6770 1
+143 6784 1
+143 6979 1
+147 28 1
+147 271 1
+147 304 1
+147 310 1
+147 311 1
+147 319 1
+147 682 1
+147 704 1
+147 737 1
+147 794 1
+147 798 1
+147 820 1
+147 937 1
+147 958 1
+147 966 1
+147 993 1
+147 994 1
+147 1007 1
+147 1014 1
+147 1026 1
+147 1137 1
+147 1185 1
+147 1315 1
+147 1357 1
+147 1378 1
+147 1407 1
+147 1453 1
+147 1566 1
+147 1678 1
+147 1705 1
+147 1729 1
+147 1730 1
+147 1754 1
+147 1955 1
+147 2016 1
+147 2095 1
+147 2341 1
+147 2371 1
+147 2485 1
+147 2516 1
+147 2570 1
+147 2579 1
+147 2801 1
+147 2819 1
+147 2955 1
+147 3026 1
+147 3056 1
+147 3059 1
+147 3643 1
+147 3787 1
+147 3970 1
+147 4310 1
+147 4365 1
+147 4384 1
+147 5412 1
+147 5430 1
+147 7092 1
+147 8295 1
+145 147 1
+145 214 1
+145 271 1
+145 391 1
+145 626 1
+145 717 1
+145 769 1
+145 1080 1
+145 1248 1
+145 1297 1
+145 1321 1
+145 1377 1
+145 1484 1
+145 1485 1
+145 1569 1
+145 1633 1
+145 5189 1
+145 6720 1
+146 147 1
+151 28 1
+151 29 1
+151 80 1
+151 86 1
+151 171 1
+151 182 1
+151 228 1
+151 236 1
+151 246 1
+151 271 1
+151 308 1
+151 322 1
+151 338 1
+151 402 1
+151 407 1
+151 549 1
+151 637 1
+151 643 1
+151 659 1
+151 663 1
+151 682 1
+151 707 1
+151 719 1
+151 723 1
+151 733 1
+151 749 1
+151 762 1
+151 806 1
+151 837 1
+151 844 1
+151 857 1
+151 863 1
+151 878 1
+151 887 1
+151 893 1
+151 895 1
+151 897 1
+151 906 1
+151 913 1
+151 918 1
+151 930 1
+151 936 1
+151 938 1
+151 941 1
+151 942 1
+151 945 1
+151 955 1
+151 956 1
+151 958 1
+151 966 1
+151 972 1
+151 989 1
+151 994 1
+151 1123 1
+151 1125 1
+151 1128 1
+151 1140 1
+151 1141 1
+151 1248 1
+151 1416 1
+151 1471 1
+151 1489 1
+151 1520 1
+151 1633 1
+151 1638 1
+151 1648 1
+151 1649 1
+151 1652 1
+151 1654 1
+151 1661 1
+151 1662 1
+151 2508 1
+151 3970 1
+151 8288 1
+149 151 1
+152 28 1
+152 35 1
+152 50 1
+152 55 1
+152 56 1
+152 75 1
+152 182 1
+152 192 1
+152 214 1
+152 252 1
+152 514 1
+152 567 1
+152 581 1
+152 586 1
+152 589 1
+152 656 1
+152 665 1
+152 667 1
+152 677 1
+152 1077 1
+152 8287 1
+153 50 1
+154 15 1
+154 23 1
+154 28 1
+154 29 1
+154 39 1
+154 50 1
+154 80 1
+154 151 1
+154 153 1
+154 168 1
+154 171 1
+154 178 1
+154 204 1
+154 224 1
+154 243 1
+154 252 1
+154 282 1
+154 304 1
+154 306 1
+154 308 1
+154 310 1
+154 322 1
+154 348 1
+154 370 1
+154 377 1
+154 402 1
+154 405 1
+154 407 1
+154 415 1
+154 439 1
+154 549 1
+154 609 1
+154 617 1
+154 636 1
+154 733 1
+154 750 1
+154 795 1
+154 829 1
+154 857 1
+154 895 1
+154 958 1
+154 989 1
+154 1053 1
+154 1123 1
+154 1211 1
+154 1279 1
+154 1297 1
+154 1413 1
+154 1464 1
+154 1514 1
+154 1628 1
+154 1718 1
+154 1956 1
+154 2151 1
+154 2339 1
+154 4310 1
+154 4531 1
+154 4875 1
+154 5886 1
+154 7050 1
+154 8282 1
+155 15 1
+155 50 1
+155 75 1
+155 89 1
+155 105 1
+155 214 1
+155 928 1
+155 2398 1
+155 3459 1
+155 5079 1
+155 5529 1
+155 5745 1
+155 6665 1
+155 6923 1
+155 6993 1
+155 7116 1
+155 7400 1
+155 7493 1
+155 7587 1
+155 7604 1
+155 7647 1
+155 7648 1
+155 7651 1
+155 7652 1
+155 7672 1
+155 7701 1
+155 7921 1
+155 7927 1
+156 50 1
+156 163 1
+156 168 1
+156 259 1
+157 23 1
+157 29 1
+157 50 1
+157 56 1
+157 140 1
+157 182 1
+157 204 1
+157 243 1
+157 271 1
+157 290 1
+157 311 1
+157 313 1
+157 325 1
+157 396 1
+157 407 1
+157 435 1
+157 626 1
+157 663 1
+157 696 1
+157 697 1
+157 704 1
+157 707 1
+157 743 1
+157 756 1
+157 762 1
+157 857 1
+157 885 1
+157 893 1
+157 955 1
+157 966 1
+157 994 1
+157 1014 1
+157 1053 1
+157 1055 1
+157 1114 1
+157 1123 1
+157 1156 1
+157 1166 1
+157 1297 1
+157 1487 1
+157 1556 1
+157 2657 1
+157 2979 1
+157 3506 1
+158 28 1
+158 75 1
+158 152 1
+158 153 1
+158 477 1
+158 514 1
+158 1439 1
+159 153 1
+160 153 1
+161 28 1
+161 55 1
+161 75 1
+161 153 1
+161 154 1
+161 299 1
+161 334 1
+161 677 1
+161 941 1
+161 963 1
+161 978 1
+161 989 1
+161 1127 1
+161 1131 1
+161 1201 1
+161 1232 1
+161 1240 1
+161 1418 1
+161 1425 1
+161 1435 1
+161 1484 1
+161 1585 1
+161 1633 1
+161 1718 1
+161 1754 1
+161 2151 1
+161 2474 1
+161 2579 1
+161 2619 1
+161 2625 1
+161 2801 1
+161 3429 1
+162 89 1
+162 168 1
+162 246 1
+162 300 1
+163 271 1
+163 1284 1
+163 1285 1
+163 1286 1
+163 1726 1
+163 1965 1
+163 2871 1
+163 6691 1
+163 6875 1
+165 39 1
+165 152 1
+165 167 1
+168 299 1
+168 302 1
+168 663 1
+168 742 1
+168 789 1
+168 857 1
+168 875 1
+168 993 1
+168 3027 1
+171 23 1
+171 35 1
+171 227 1
+171 230 1
+171 299 1
+171 432 1
+171 545 1
+171 559 1
+171 575 1
+171 579 1
+171 644 1
+171 663 1
+171 705 1
+171 762 1
+171 803 1
+171 853 1
+171 857 1
+171 887 1
+171 904 1
+171 907 1
+171 930 1
+171 960 1
+171 982 1
+171 1000 1
+171 1022 1
+171 1035 1
+171 1043 1
+171 1062 1
+171 1125 1
+171 1140 1
+171 1152 1
+171 1154 1
+171 1156 1
+171 1186 1
+171 1190 1
+171 1192 1
+171 1193 1
+171 1196 1
+171 1211 1
+171 1218 1
+171 1220 1
+171 1240 1
+171 1241 1
+171 1259 1
+171 1286 1
+171 1297 1
+171 1330 1
+171 1382 1
+171 1389 1
+171 1394 1
+171 1402 1
+171 1413 1
+171 1464 1
+171 1476 1
+171 1484 1
+171 1487 1
+171 1501 1
+171 1524 1
+171 1532 1
+171 1549 1
+171 1556 1
+171 1619 1
+171 1638 1
+171 1689 1
+171 1692 1
+171 1726 1
+171 1746 1
+171 1768 1
+171 1771 1
+171 4689 1
+172 23 1
+172 214 1
+172 246 1
+172 285 1
+172 290 1
+172 391 1
+172 417 1
+172 477 1
+172 743 1
+172 744 1
+172 756 1
+172 761 1
+172 762 1
+172 856 1
+172 873 1
+172 878 1
+172 975 1
+172 993 1
+172 1012 1
+172 1166 1
+172 1211 1
+172 1243 1
+172 1267 1
+172 1297 1
+172 1357 1
+172 1374 1
+172 1384 1
+172 1549 1
+172 1571 1
+172 1633 1
+172 1679 1
+172 1717 1
+172 1734 1
+172 1754 1
+172 1757 1
+172 1792 1
+172 1814 1
+172 1919 1
+172 1972 1
+172 2016 1
+172 2062 1
+172 2066 1
+172 2135 1
+172 2211 1
+172 2225 1
+172 2240 1
+172 2273 1
+172 2297 1
+172 2307 1
+172 2323 1
+172 2324 1
+172 2325 1
+172 2338 1
+172 2345 1
+172 2348 1
+172 2356 1
+172 2385 1
+172 2397 1
+172 2398 1
+172 2411 1
+172 2470 1
+172 2508 1
+172 2510 1
+172 2542 1
+172 2550 1
+172 2576 1
+172 2623 1
+172 2625 1
+172 2651 1
+172 2653 1
+172 2654 1
+172 2660 1
+172 2662 1
+172 2686 1
+172 2693 1
+172 2700 1
+172 2708 1
+172 2724 1
+172 2819 1
+172 2830 1
+172 2859 1
+172 2951 1
+172 2958 1
+172 2966 1
+172 2973 1
+172 3009 1
+172 3018 1
+172 3020 1
+172 3030 1
+172 3089 1
+172 3099 1
+172 3117 1
+172 3126 1
+172 3140 1
+172 3150 1
+172 3164 1
+172 3173 1
+172 3243 1
+172 3251 1
+172 3253 1
+172 3307 1
+172 3338 1
+172 3371 1
+172 3408 1
+172 3435 1
+172 3473 1
+172 3489 1
+172 3506 1
+172 3516 1
+172 3529 1
+172 3580 1
+172 3587 1
+172 3614 1
+172 3670 1
+172 3812 1
+172 3892 1
+172 4798 1
+172 4994 1
+172 6441 1
+172 6498 1
+172 6634 1
+172 8291 1
+172 8293 1
+175 55 1
+173 15 1
+173 35 1
+173 86 1
+173 175 1
+173 214 1
+173 227 1
+173 230 1
+173 259 1
+173 271 1
+173 298 1
+173 299 1
+173 304 1
+173 311 1
+173 313 1
+173 314 1
+173 317 1
+173 321 1
+173 322 1
+173 334 1
+173 346 1
+173 372 1
+173 415 1
+173 432 1
+173 447 1
+173 559 1
+173 560 1
+173 575 1
+173 579 1
+173 587 1
+173 600 1
+173 626 1
+173 644 1
+173 647 1
+173 665 1
+173 691 1
+173 697 1
+173 704 1
+173 733 1
+173 742 1
+173 762 1
+173 763 1
+173 764 1
+173 769 1
+173 771 1
+173 789 1
+173 794 1
+173 803 1
+173 805 1
+173 813 1
+173 817 1
+173 820 1
+173 823 1
+173 836 1
+173 853 1
+173 857 1
+173 861 1
+173 871 1
+173 873 1
+173 887 1
+173 895 1
+173 904 1
+173 907 1
+173 908 1
+173 913 1
+173 918 1
+173 922 1
+173 935 1
+173 937 1
+173 941 1
+173 945 1
+173 946 1
+173 947 1
+173 948 1
+173 955 1
+173 958 1
+173 959 1
+173 960 1
+173 971 1
+173 972 1
+173 975 1
+173 979 1
+173 993 1
+173 995 1
+173 999 1
+173 1000 1
+173 1007 1
+173 1022 1
+173 1023 1
+173 1026 1
+173 1031 1
+173 1032 1
+173 1034 1
+173 1035 1
+173 1053 1
+173 1055 1
+173 1061 1
+173 1075 1
+173 1103 1
+173 1111 1
+173 1123 1
+173 1124 1
+173 1127 1
+173 1137 1
+173 1151 1
+173 1167 1
+173 1168 1
+173 1186 1
+173 1190 1
+173 1193 1
+173 1196 1
+173 1199 1
+173 1200 1
+173 1201 1
+173 1211 1
+173 1218 1
+173 1222 1
+173 1230 1
+173 1234 1
+173 1236 1
+173 1243 1
+173 1248 1
+173 1253 1
+173 1267 1
+173 1279 1
+173 1285 1
+173 1286 1
+173 1296 1
+173 1297 1
+173 1319 1
+173 1322 1
+173 1353 1
+173 1357 1
+173 1360 1
+173 1372 1
+173 1375 1
+173 1377 1
+173 1378 1
+173 1389 1
+173 1394 1
+173 1396 1
+173 1402 1
+173 1407 1
+173 1412 1
+173 1413 1
+173 1428 1
+173 1439 1
+173 1444 1
+173 1446 1
+173 1464 1
+173 1465 1
+173 1468 1
+173 1471 1
+173 1476 1
+173 1482 1
+173 1489 1
+173 1490 1
+173 1496 1
+173 1501 1
+173 1506 1
+173 1514 1
+173 1518 1
+173 1520 1
+173 1524 1
+173 1525 1
+173 1531 1
+173 1534 1
+173 1537 1
+173 1542 1
+173 1547 1
+173 1550 1
+173 1556 1
+173 1563 1
+173 1565 1
+173 1566 1
+173 1580 1
+173 1583 1
+173 1585 1
+173 1587 1
+173 1593 1
+173 1595 1
+173 1603 1
+173 1604 1
+173 1613 1
+173 1618 1
+173 1619 1
+173 1621 1
+173 1628 1
+173 1629 1
+173 1633 1
+173 1638 1
+173 1641 1
+173 1649 1
+173 1652 1
+173 1654 1
+173 1658 1
+173 1661 1
+173 1662 1
+173 1672 1
+173 1689 1
+173 1692 1
+173 1697 1
+173 1701 1
+173 1707 1
+173 1714 1
+173 1717 1
+173 1726 1
+173 1730 1
+173 1732 1
+173 1746 1
+173 1747 1
+173 1752 1
+173 1758 1
+173 1772 1
+173 1774 1
+173 1783 1
+173 1787 1
+173 1788 1
+173 1791 1
+173 1798 1
+173 1802 1
+173 1805 1
+173 1808 1
+173 1811 1
+173 1836 1
+173 1842 1
+173 1848 1
+173 1849 1
+173 1855 1
+173 1880 1
+173 1901 1
+173 1903 1
+173 1908 1
+173 1956 1
+173 1977 1
+173 1983 1
+173 1985 1
+173 1991 1
+173 1997 1
+173 2062 1
+173 2066 1
+173 2071 1
+173 2073 1
+173 2079 1
+173 2085 1
+173 2091 1
+173 2095 1
+173 2097 1
+173 2106 1
+173 2109 1
+173 2119 1
+173 2128 1
+173 2137 1
+173 2145 1
+173 2151 1
+173 2157 1
+173 2165 1
+173 2168 1
+173 2181 1
+173 2193 1
+173 2202 1
+173 2210 1
+173 2211 1
+173 2237 1
+173 2241 1
+173 2246 1
+173 2253 1
+173 2273 1
+173 2276 1
+173 2328 1
+173 2329 1
+173 2333 1
+173 2339 1
+173 2341 1
+173 2345 1
+173 2348 1
+173 2350 1
+173 2381 1
+173 2385 1
+173 2397 1
+173 2400 1
+173 2504 1
+173 2516 1
+173 2774 1
+173 2787 1
+173 2871 1
+173 3002 1
+173 3136 1
+173 3238 1
+173 3408 1
+173 3443 1
+173 3452 1
+173 3456 1
+173 3537 1
+173 3643 1
+173 3830 1
+173 3843 1
+173 3897 1
+173 3910 1
+173 3976 1
+173 4037 1
+173 4124 1
+173 4310 1
+173 4709 1
+173 4828 1
+173 4875 1
+173 5026 1
+173 5028 1
+173 5037 1
+173 5055 1
+173 5100 1
+173 5106 1
+173 5130 1
+173 5254 1
+173 5335 1
+173 5484 1
+173 5511 1
+173 5714 1
+173 5760 1
+173 5799 1
+173 6006 1
+173 6043 1
+173 6098 1
+173 6151 1
+173 6269 1
+173 6414 1
+173 6606 1
+173 6833 1
+173 6994 1
+173 7092 1
+173 7649 1
+173 7809 1
+173 7813 1
+173 8290 1
+173 8291 1
+174 175 1
+74 28 1
+74 29 1
+74 35 1
+74 49 1
+74 55 1
+74 56 1
+74 75 1
+74 86 1
+74 154 1
+74 178 1
+74 228 1
+74 252 1
+74 257 1
+74 271 1
+74 285 1
+74 299 1
+74 304 1
+74 317 1
+74 321 1
+74 334 1
+74 356 1
+74 447 1
+74 488 1
+74 626 1
+74 637 1
+74 643 1
+74 665 1
+74 682 1
+74 710 1
+74 749 1
+74 769 1
+74 784 1
+74 789 1
+74 794 1
+74 803 1
+74 806 1
+74 817 1
+74 863 1
+74 864 1
+74 893 1
+74 895 1
+74 918 1
+74 922 1
+74 937 1
+74 955 1
+74 956 1
+74 958 1
+74 960 1
+74 993 1
+74 995 1
+74 1026 1
+74 1053 1
+74 1111 1
+74 1123 1
+74 1186 1
+74 1190 1
+74 1284 1
+74 1297 1
+74 1330 1
+74 1583 1
+74 1633 1
+74 1811 1
+74 1836 1
+74 1927 1
+74 2004 1
+74 2119 1
+74 2181 1
+74 3117 1
+74 8290 1
+176 19 1
+176 29 1
+176 35 1
+176 154 1
+176 271 1
+176 334 1
+176 432 1
+176 647 1
+176 710 1
+176 805 1
+176 857 1
+176 871 1
+176 922 1
+176 948 1
+176 960 1
+176 1043 1
+176 1123 1
+176 1131 1
+176 1156 1
+176 1160 1
+176 1167 1
+176 1186 1
+176 1190 1
+176 1201 1
+176 1218 1
+176 1222 1
+176 1234 1
+176 1375 1
+176 1413 1
+176 1428 1
+176 1464 1
+176 1465 1
+176 1468 1
+176 1476 1
+176 1520 1
+176 1531 1
+176 1537 1
+176 1593 1
+176 1603 1
+177 56 1
+177 135 1
+177 183 1
+177 214 1
+177 228 1
+177 372 1
+177 427 1
+177 677 1
+177 739 1
+177 820 1
+177 849 1
+177 968 1
+177 972 1
+177 1186 1
+177 1514 1
+177 1592 1
+177 1593 1
+177 1718 1
+177 6496 1
+178 3 1
+178 72 1
+178 182 1
+178 183 1
+178 228 1
+178 271 1
+178 282 1
+178 313 1
+178 371 1
+178 396 1
+178 405 1
+178 429 1
+178 560 1
+178 564 1
+178 590 1
+178 600 1
+178 606 1
+178 616 1
+178 673 1
+178 704 1
+178 719 1
+178 723 1
+178 730 1
+178 741 1
+178 798 1
+178 817 1
+178 829 1
+178 838 1
+178 844 1
+178 866 1
+178 895 1
+178 906 1
+178 958 1
+178 983 1
+178 993 1
+178 994 1
+178 1014 1
+178 1185 1
+178 1482 1
+178 1733 1
+178 1799 1
+178 1893 1
+178 1966 1
+178 2073 1
+178 2145 1
+178 2210 1
+178 2381 1
+178 2398 1
+178 3634 1
+178 3755 1
+178 3897 1
+178 4297 1
+178 4483 1
+178 4578 1
+178 4646 1
+178 4715 1
+178 5412 1
+178 5684 1
+178 5804 1
+178 6006 1
+178 6098 1
+178 7699 1
+178 8288 1
+179 135 1
+179 183 1
+179 301 1
+179 304 1
+179 306 1
+179 308 1
+179 348 1
+179 349 1
+179 407 1
+179 549 1
+179 673 1
+179 739 1
+179 756 1
+179 761 1
+179 829 1
+179 977 1
+179 989 1
+180 3 1
+180 80 1
+180 132 1
+180 135 1
+180 182 1
+180 183 1
+180 216 1
+180 271 1
+180 274 1
+180 299 1
+180 349 1
+180 370 1
+180 402 1
+180 677 1
+180 908 1
+180 1026 1
+180 1031 1
+180 1100 1
+180 1166 1
+180 1203 1
+180 1218 1
+180 1222 1
+180 1284 1
+180 1425 1
+180 1464 1
+180 1476 1
+180 1542 1
+180 1622 1
+180 1701 1
+180 1754 1
+180 1858 1
+180 1956 1
+180 2114 1
+180 2246 1
+180 2325 1
+180 2517 1
+180 2542 1
+180 2597 1
+180 2604 1
+180 2625 1
+180 2643 1
+180 2657 1
+180 2720 1
+180 2727 1
+180 2777 1
+180 3010 1
+180 3089 1
+180 3136 1
+180 3265 1
+180 3480 1
+180 3567 1
+180 3587 1
+180 3681 1
+180 5563 1
+181 183 1
+181 214 1
+181 271 1
+182 56 1
+182 86 1
+182 183 1
+182 204 1
+182 243 1
+182 271 1
+182 299 1
+182 310 1
+182 405 1
+182 407 1
+182 427 1
+182 432 1
+182 590 1
+182 600 1
+182 644 1
+182 647 1
+182 650 1
+182 656 1
+182 659 1
+182 667 1
+182 694 1
+182 723 1
+182 750 1
+182 762 1
+182 805 1
+182 857 1
+182 878 1
+182 895 1
+182 966 1
+182 971 1
+182 972 1
+182 977 1
+182 982 1
+182 993 1
+182 1006 1
+182 1007 1
+182 1026 1
+182 1043 1
+182 1092 1
+182 1127 1
+182 1128 1
+182 1131 1
+182 1151 1
+182 1156 1
+182 1167 1
+182 1186 1
+182 1297 1
+182 1305 1
+182 1357 1
+182 1374 1
+182 1396 1
+182 1416 1
+182 1464 1
+182 1473 1
+182 1484 1
+182 1525 1
+182 1569 1
+182 1718 1
+182 1754 1
+182 1864 1
+182 1919 1
+182 2328 1
+182 2329 1
+182 2625 1
+182 2653 1
+182 2696 1
+182 2697 1
+182 2774 1
+182 2775 1
+182 2777 1
+182 3192 1
+182 3251 1
+182 3253 1
+182 3537 1
+182 3787 1
+182 4037 1
+182 4256 1
+182 6400 1
+182 7620 1
+166 28 1
+166 35 1
+166 75 1
+166 86 1
+166 152 1
+166 171 1
+166 204 1
+166 214 1
+166 243 1
+166 259 1
+166 261 1
+166 271 1
+166 273 1
+166 274 1
+166 290 1
+166 304 1
+166 417 1
+166 439 1
+166 465 1
+166 545 1
+166 647 1
+166 659 1
+166 673 1
+166 733 1
+166 789 1
+166 829 1
+166 837 1
+166 838 1
+166 859 1
+166 897 1
+166 908 1
+166 959 1
+166 1157 1
+166 1211 1
+166 1248 1
+166 1279 1
+166 1297 1
+166 1307 1
+166 1484 1
+166 1493 1
+166 1585 1
+166 1705 1
+166 1935 1
+166 1956 1
+166 1990 1
+166 2066 1
+166 2276 1
+166 2398 1
+166 2411 1
+166 2565 1
+166 2843 1
+166 2877 1
+166 3005 1
+166 3459 1
+166 3562 1
+166 3650 1
+166 3946 1
+166 4037 1
+166 4191 1
+166 4233 1
+166 4463 1
+166 4875 1
+166 5002 1
+166 5210 1
+166 5246 1
+166 5254 1
+166 5288 1
+166 5738 1
+166 5800 1
+166 6004 1
+166 6044 1
+166 6156 1
+166 6305 1
+166 6330 1
+166 6523 1
+166 6560 1
+166 6833 1
+166 6855 1
+166 6945 1
+166 6948 1
+166 7574 1
+166 7695 1
+166 7699 1
+166 7924 1
+166 7961 1
+166 8079 1
+166 8083 1
+166 8132 1
+166 8134 1
+166 8141 1
+166 8163 1
+166 8198 1
+166 8294 1
+185 214 1
+185 321 1
+185 1679 1
+185 2625 1
+194 214 1
+194 259 1
+194 368 1
+194 1497 1
+194 2585 1
+187 28 1
+187 29 1
+187 36 1
+187 86 1
+187 135 1
+187 214 1
+187 228 1
+187 243 1
+187 285 1
+187 322 1
+187 348 1
+187 373 1
+187 394 1
+187 415 1
+187 545 1
+187 600 1
+187 601 1
+187 657 1
+187 658 1
+187 664 1
+187 706 1
+187 733 1
+187 739 1
+187 760 1
+187 761 1
+187 779 1
+187 932 1
+187 977 1
+187 989 1
+187 1151 1
+187 1211 1
+187 1573 1
+187 1638 1
+187 2290 1
+187 2323 1
+187 4384 1
+187 8291 1
+188 214 1
+188 1808 1
+188 2713 1
+32 75 1
+32 214 1
+32 368 1
+32 517 1
+189 214 1
+196 214 1
+190 214 1
+190 370 1
+197 152 1
+197 214 1
+197 259 1
+197 324 1
+197 741 1
+197 1075 1
+197 1080 1
+197 1111 1
+197 1353 1
+197 2060 1
+197 2595 1
+195 214 1
+198 214 1
+199 214 1
+199 579 1
+199 963 1
+199 1186 1
+199 1407 1
+199 1412 1
+199 1471 1
+199 1520 1
+199 1603 1
+199 1633 1
+199 1662 1
+199 2721 1
+199 5671 1
+199 6784 1
+199 7279 1
+199 7442 1
+199 7795 1
+191 214 1
+191 259 1
+191 271 1
+191 372 1
+191 802 1
+191 829 1
+191 959 1
+191 1164 1
+191 1165 1
+191 1842 1
+191 1855 1
+191 1893 1
+191 1969 1
+200 214 1
+201 36 1
+201 55 1
+201 75 1
+201 80 1
+201 214 1
+201 252 1
+201 271 1
+201 282 1
+201 549 1
+201 681 1
+201 705 1
+201 706 1
+201 760 1
+201 817 1
+201 823 1
+201 956 1
+201 1023 1
+201 1026 1
+201 1043 1
+201 1123 1
+201 1186 1
+202 28 1
+202 135 1
+202 214 1
+202 300 1
+202 301 1
+202 427 1
+203 214 1
+203 259 1
+203 299 1
+203 407 1
+203 600 1
+203 829 1
+203 1075 1
+203 1111 1
+203 1717 1
+203 1808 1
+203 1842 1
+203 1855 1
+203 1956 1
+203 2398 1
+203 2456 1
+203 2470 1
+203 2516 1
+203 2542 1
+203 2576 1
+203 2595 1
+203 2660 1
+203 3018 1
+203 3192 1
+203 3352 1
+203 3835 1
+203 3903 1
+203 4276 1
+203 4338 1
+203 5123 1
+203 5254 1
+203 5423 1
+204 214 1
+204 439 1
+204 611 1
+204 756 1
+204 1151 1
+204 1165 1
+204 1608 1
+204 1718 1
+204 1787 1
+204 2151 1
+204 2211 1
+204 3516 1
+205 86 1
+205 140 1
+205 150 1
+205 152 1
+205 214 1
+205 282 1
+205 600 1
+205 613 1
+205 616 1
+205 658 1
+205 659 1
+205 1285 1
+206 214 1
+207 214 1
+208 28 1
+208 214 1
+208 219 1
+208 626 1
+208 771 1
+208 6156 1
+209 214 1
+209 259 1
+209 271 1
+209 626 1
+209 686 1
+209 696 1
+209 697 1
+209 1123 1
+209 1186 1
+209 1190 1
+192 28 1
+192 39 1
+192 56 1
+192 75 1
+192 94 1
+192 214 1
+192 308 1
+192 379 1
+192 406 1
+192 432 1
+192 549 1
+192 586 1
+192 600 1
+192 756 1
+192 857 1
+192 932 1
+192 936 1
+192 8283 1
+192 8287 1
+210 214 1
+125 28 1
+125 29 1
+125 35 1
+125 36 1
+125 55 1
+125 214 1
+125 271 1
+125 299 1
+125 302 1
+125 313 1
+125 317 1
+125 321 1
+125 488 1
+125 517 1
+125 637 1
+125 704 1
+125 710 1
+125 730 1
+125 784 1
+125 937 1
+125 959 1
+125 960 1
+125 1014 1
+125 1167 1
+125 1218 1
+125 1286 1
+125 1966 1
+125 8283 1
+125 8287 1
+216 86 1
+216 321 1
+216 895 1
+216 1418 1
+216 1453 1
+216 3634 1
+216 4735 1
+216 5412 1
+215 28 1
+215 35 1
+215 94 1
+215 178 1
+215 192 1
+215 216 1
+215 252 1
+215 257 1
+215 271 1
+215 282 1
+215 298 1
+215 299 1
+215 306 1
+215 310 1
+215 321 1
+215 332 1
+215 348 1
+215 350 1
+215 368 1
+215 506 1
+215 517 1
+215 559 1
+215 636 1
+215 663 1
+215 684 1
+215 687 1
+215 784 1
+215 836 1
+215 904 1
+215 943 1
+215 956 1
+215 985 1
+215 993 1
+215 994 1
+215 1018 1
+215 1103 1
+215 1124 1
+215 1141 1
+215 1156 1
+215 1186 1
+215 1193 1
+215 1199 1
+215 1261 1
+215 1297 1
+215 1322 1
+215 1374 1
+215 1375 1
+215 1482 1
+215 1487 1
+215 1492 1
+215 1496 1
+215 1514 1
+215 1521 1
+215 1608 1
+215 1610 1
+215 1628 1
+215 1700 1
+215 1726 1
+215 1732 1
+215 1746 1
+215 1747 1
+215 1758 1
+215 1768 1
+215 1771 1
+215 1774 1
+215 1783 1
+215 1788 1
+215 1791 1
+215 1798 1
+215 1802 1
+215 1805 1
+215 1811 1
+215 1842 1
+215 1848 1
+215 1849 1
+215 1903 1
+215 1964 1
+215 1966 1
+215 2195 1
+215 2234 1
+215 2240 1
+215 2241 1
+215 2242 1
+215 2332 1
+215 2378 1
+215 2400 1
+215 2409 1
+215 2499 1
+215 2504 1
+215 2570 1
+215 2619 1
+215 2625 1
+215 2685 1
+215 2736 1
+215 2754 1
+215 2801 1
+215 3755 1
+215 8283 1
+215 8290 1
+215 8291 1
+217 219 1
+221 28 1
+221 135 1
+221 282 1
+221 339 1
+221 341 1
+221 348 1
+221 390 1
+221 402 1
+221 590 1
+221 604 1
+222 28 1
+222 348 1
+222 1151 1
+222 1919 1
+223 3 1
+223 28 1
+223 80 1
+223 226 1
+223 257 1
+223 301 1
+223 325 1
+223 341 1
+223 348 1
+223 356 1
+223 358 1
+223 406 1
+223 415 1
+223 422 1
+223 427 1
+223 590 1
+223 607 1
+223 636 1
+223 882 1
+224 28 1
+224 152 1
+224 271 1
+224 282 1
+224 402 1
+224 407 1
+224 765 1
+224 806 1
+224 857 1
+224 994 1
+224 1633 1
+224 1793 1
+224 2066 1
+225 28 1
+226 28 1
+226 55 1
+226 72 1
+226 298 1
+226 322 1
+226 407 1
+226 432 1
+226 439 1
+226 789 1
+226 937 1
+226 966 1
+226 977 1
+226 989 1
+226 1014 1
+226 1151 1
+226 1152 1
+226 1192 1
+226 1322 1
+226 1497 1
+226 1569 1
+226 1573 1
+226 1997 1
+226 2775 1
+226 2777 1
+226 6437 1
+240 28 1
+240 637 1
+240 857 1
+240 1151 1
+240 1152 1
+227 28 1
+227 35 1
+227 271 1
+227 407 1
+227 1497 1
+228 28 1
+228 282 1
+228 299 1
+228 391 1
+228 415 1
+228 1484 1
+242 28 1
+242 407 1
+243 28 1
+243 250 1
+244 28 1
+244 56 1
+244 1920 1
+244 1973 1
+245 28 1
+245 56 1
+245 243 1
+246 28 1
+247 28 1
+247 232 1
+247 274 1
+247 300 1
+247 341 1
+247 415 1
+247 421 1
+247 422 1
+247 427 1
+247 428 1
+247 435 1
+230 28 1
+230 171 1
+230 298 1
+230 559 1
+230 1610 1
+230 1701 1
+231 28 1
+231 35 1
+231 86 1
+231 94 1
+231 132 1
+231 175 1
+231 178 1
+231 228 1
+231 236 1
+231 255 1
+231 271 1
+231 280 1
+231 299 1
+231 300 1
+231 321 1
+231 379 1
+231 391 1
+231 396 1
+231 402 1
+231 439 1
+231 549 1
+231 560 1
+231 600 1
+231 611 1
+231 613 1
+231 617 1
+231 650 1
+231 656 1
+231 657 1
+231 673 1
+231 686 1
+231 739 1
+231 756 1
+231 956 1
+231 1080 1
+231 1193 1
+231 1396 1
+231 1473 1
+231 1855 1
+231 1861 1
+231 1864 1
+231 2097 1
+231 2398 1
+231 4338 1
+231 5226 1
+231 5263 1
+231 5737 1
+231 5743 1
+231 6930 1
+231 7553 1
+232 28 1
+232 34 1
+232 178 1
+232 228 1
+232 271 1
+232 282 1
+232 402 1
+232 600 1
+232 619 1
+232 665 1
+232 737 1
+232 739 1
+232 742 1
+232 849 1
+232 857 1
+232 960 1
+232 1023 1
+232 1297 1
+232 1563 1
+232 1842 1
+232 1855 1
+232 3192 1
+232 5254 1
+233 28 1
+234 28 1
+235 28 1
+235 271 1
+236 28 1
+236 80 1
+236 94 1
+236 150 1
+236 151 1
+236 178 1
+236 182 1
+236 232 1
+236 257 1
+236 271 1
+236 282 1
+236 300 1
+236 306 1
+236 308 1
+236 310 1
+236 319 1
+236 325 1
+236 348 1
+236 349 1
+236 356 1
+236 406 1
+236 428 1
+236 581 1
+236 586 1
+236 590 1
+236 592 1
+236 600 1
+236 611 1
+236 622 1
+236 636 1
+236 656 1
+236 684 1
+236 725 1
+236 746 1
+236 749 1
+236 844 1
+236 857 1
+236 1679 1
+236 2625 1
+237 28 1
+237 56 1
+237 75 1
+237 178 1
+237 271 1
+237 282 1
+237 373 1
+237 391 1
+237 465 1
+237 560 1
+237 581 1
+237 587 1
+237 636 1
+237 746 1
+237 765 1
+237 1034 1
+237 1315 1
+237 1374 1
+237 1646 1
+237 1798 1
+237 1855 1
+237 1956 1
+237 2102 1
+237 2470 1
+237 2754 1
+237 2763 1
+237 2768 1
+237 2794 1
+237 2805 1
+237 2809 1
+237 2814 1
+237 2828 1
+237 2838 1
+237 3334 1
+237 4037 1
+237 5254 1
+237 6229 1
+237 6417 1
+237 6780 1
+237 7414 1
+237 8121 1
+248 28 1
+238 28 1
+238 358 1
+238 2517 1
+239 28 1
+169 28 1
+169 80 1
+169 257 1
+257 19 1
+257 132 1
+257 271 1
+257 302 1
+257 377 1
+257 937 1
+257 977 1
+257 981 1
+253 257 1
+254 55 1
+254 75 1
+254 105 1
+254 150 1
+254 228 1
+254 246 1
+254 257 1
+254 313 1
+254 677 1
+254 682 1
+254 706 1
+254 715 1
+254 739 1
+254 756 1
+254 857 1
+254 864 1
+254 881 1
+254 895 1
+254 1014 1
+254 1186 1
+254 1190 1
+254 1200 1
+254 1287 1
+254 1612 1
+254 1718 1
+255 29 1
+255 35 1
+255 36 1
+255 56 1
+255 257 1
+255 259 1
+255 271 1
+255 280 1
+255 282 1
+255 299 1
+255 306 1
+255 310 1
+255 317 1
+255 319 1
+255 325 1
+255 371 1
+255 405 1
+255 432 1
+255 439 1
+255 549 1
+255 564 1
+255 567 1
+255 581 1
+255 600 1
+255 606 1
+255 607 1
+255 608 1
+255 624 1
+255 627 1
+255 628 1
+255 631 1
+255 633 1
+255 636 1
+255 637 1
+255 643 1
+255 656 1
+255 657 1
+255 658 1
+255 659 1
+255 667 1
+255 668 1
+255 673 1
+255 675 1
+255 677 1
+255 681 1
+255 697 1
+255 706 1
+255 719 1
+255 723 1
+255 725 1
+255 730 1
+255 739 1
+255 741 1
+255 743 1
+255 746 1
+255 748 1
+255 749 1
+255 756 1
+255 760 1
+255 763 1
+255 765 1
+255 779 1
+255 789 1
+255 798 1
+255 817 1
+255 864 1
+255 878 1
+255 893 1
+255 993 1
+255 1123 1
+255 1166 1
+255 1286 1
+255 1482 1
+255 1487 1
+255 1538 1
+255 1573 1
+255 1893 1
+255 1956 1
+255 1966 1
+255 1992 1
+255 2066 1
+255 2595 1
+255 2625 1
+255 2834 1
+255 2859 1
+255 5073 1
+256 80 1
+256 226 1
+256 257 1
+256 282 1
+256 298 1
+256 626 1
+256 644 1
+256 771 1
+256 1402 1
+256 1701 1
+261 258 1
+261 286 1
+261 339 1
+261 356 1
+261 405 1
+261 606 1
+261 607 1
+261 609 1
+258 261 1
+258 271 1
+258 273 1
+258 1062 1
+258 1360 1
+258 6262 1
+260 258 1
+260 261 1
+260 285 1
+260 1360 1
+260 2576 1
+260 6262 1
+259 29 1
+259 227 1
+259 261 1
+259 271 1
+259 299 1
+259 356 1
+259 432 1
+259 579 1
+259 600 1
+259 626 1
+259 769 1
+259 803 1
+259 817 1
+259 853 1
+259 893 1
+259 959 1
+259 1075 1
+259 1111 1
+259 1203 1
+259 1330 1
+259 1372 1
+259 1375 1
+259 1382 1
+259 1402 1
+259 1473 1
+259 1652 1
+259 1717 1
+259 1808 1
+259 1835 1
+259 1842 1
+259 1855 1
+259 1956 1
+259 2060 1
+259 2181 1
+259 2210 1
+259 2323 1
+259 2506 1
+259 2508 1
+259 2542 1
+259 2660 1
+259 2770 1
+259 3084 1
+259 3192 1
+259 3804 1
+259 3835 1
+259 4110 1
+259 5210 1
+259 5254 1
+259 5714 1
+259 5773 1
+259 5828 1
+259 6833 1
+259 6840 1
+259 7115 1
+259 8141 1
+259 8294 1
+263 80 1
+263 182 1
+263 271 1
+263 282 1
+263 339 1
+263 432 1
+263 733 1
+263 746 1
+263 762 1
+263 893 1
+263 918 1
+263 922 1
+263 979 1
+263 1123 1
+263 1573 1
+263 2210 1
+263 2774 1
+263 3092 1
+263 3106 1
+263 3726 1
+263 5222 1
+263 5584 1
+264 271 1
+265 29 1
+265 32 1
+265 35 1
+265 49 1
+265 75 1
+265 150 1
+265 271 1
+265 282 1
+265 447 1
+265 600 1
+265 675 1
+265 677 1
+265 700 1
+265 737 1
+265 748 1
+265 827 1
+265 1007 1
+265 1131 1
+265 1858 1
+265 2151 1
+265 2369 1
+265 2593 1
+265 3587 1
+265 4065 1
+265 4266 1
+265 5083 1
+265 5254 1
+265 6328 1
+265 6737 1
+265 7478 1
+265 7587 1
+266 271 1
+266 429 1
+266 665 1
+266 715 1
+266 836 1
+266 844 1
+266 935 1
+266 1285 1
+266 1723 1
+266 1726 1
+266 1802 1
+266 2955 1
+266 3680 1
+267 271 1
+268 178 1
+268 271 1
+268 935 1
+269 3 1
+269 86 1
+269 246 1
+269 271 1
+269 321 1
+269 339 1
+269 348 1
+269 396 1
+269 429 1
+269 439 1
+269 440 1
+269 549 1
+269 609 1
+269 697 1
+269 704 1
+269 730 1
+269 789 1
+269 817 1
+269 895 1
+269 972 1
+269 977 1
+269 994 1
+269 1123 1
+269 1151 1
+269 1248 1
+269 1322 1
+269 1661 1
+269 1717 1
+269 1726 1
+269 1811 1
+270 271 1
+270 853 1
+270 935 1
+270 937 1
+270 1284 1
+270 1285 1
+270 1378 1
+270 1585 1
+270 1965 1
+270 2079 1
+270 2485 1
+270 3144 1
+270 4432 1
+270 5106 1
+273 34 1
+273 151 1
+273 258 1
+273 299 1
+273 302 1
+273 348 1
+273 392 1
+276 132 1
+276 243 1
+276 274 1
+276 802 1
+276 849 1
+276 1218 1
+276 1250 1
+277 140 1
+277 274 1
+275 15 1
+275 28 1
+275 75 1
+275 80 1
+275 94 1
+275 152 1
+275 182 1
+275 224 1
+275 274 1
+275 282 1
+275 299 1
+275 356 1
+275 405 1
+275 417 1
+275 590 1
+275 604 1
+275 619 1
+275 650 1
+275 656 1
+275 657 1
+275 664 1
+275 667 1
+275 946 1
+275 1211 1
+275 1357 1
+275 1717 1
+275 1734 1
+275 1792 1
+275 1835 1
+275 1888 1
+275 1918 1
+275 1956 1
+275 1992 1
+275 1997 1
+275 2053 1
+275 2322 1
+275 2323 1
+275 2504 1
+275 2508 1
+275 2576 1
+275 2619 1
+275 2625 1
+275 2654 1
+275 2669 1
+275 2685 1
+275 2790 1
+275 2794 1
+275 2799 1
+275 2828 1
+275 2838 1
+275 2844 1
+275 2972 1
+275 2999 1
+275 3117 1
+275 3650 1
+275 5254 1
+241 132 1
+241 271 1
+241 282 1
+241 325 1
+241 626 1
+241 802 1
+241 864 1
+241 1186 1
+280 15 1
+280 56 1
+280 132 1
+280 152 1
+280 178 1
+280 271 1
+280 290 1
+280 299 1
+280 304 1
+280 308 1
+280 317 1
+280 372 1
+280 407 1
+280 415 1
+280 421 1
+280 422 1
+280 431 1
+280 433 1
+280 447 1
+280 488 1
+280 566 1
+280 567 1
+280 579 1
+280 626 1
+280 667 1
+280 677 1
+280 697 1
+280 719 1
+280 739 1
+280 789 1
+280 794 1
+280 795 1
+280 813 1
+280 817 1
+280 820 1
+280 908 1
+280 966 1
+280 977 1
+280 989 1
+280 991 1
+280 994 1
+280 995 1
+280 1007 1
+280 1012 1
+280 1014 1
+280 1026 1
+280 1043 1
+280 1053 1
+280 1123 1
+280 1151 1
+280 1186 1
+280 1200 1
+280 1250 1
+280 1297 1
+280 1464 1
+280 1585 1
+280 1608 1
+280 1718 1
+280 1723 1
+280 1855 1
+280 1956 1
+280 2004 1
+280 2071 1
+280 2246 1
+280 2398 1
+280 2535 1
+280 2570 1
+280 2579 1
+280 2775 1
+280 2785 1
+280 3089 1
+280 3136 1
+280 4037 1
+280 4808 1
+280 7632 1
+280 8083 1
+282 19 1
+282 34 1
+282 132 1
+282 140 1
+282 204 1
+282 224 1
+282 228 1
+282 230 1
+282 236 1
+282 255 1
+282 280 1
+282 286 1
+282 300 1
+282 428 1
+282 440 1
+282 560 1
+282 564 1
+282 566 1
+282 567 1
+282 579 1
+282 590 1
+282 592 1
+282 604 1
+282 606 1
+282 607 1
+282 609 1
+282 656 1
+282 664 1
+282 675 1
+282 762 1
+282 1201 1
+282 1464 1
+282 1471 1
+282 1496 1
+282 1501 1
+282 1597 1
+282 1603 1
+282 1633 1
+282 1718 1
+283 132 1
+283 771 1
+284 3 1
+284 19 1
+284 132 1
+284 286 1
+284 299 1
+284 358 1
+284 389 1
+285 286 1
+285 763 1
+285 993 1
+285 1884 1
+285 2517 1
+285 2643 1
+287 34 1
+288 34 1
+289 34 1
+291 72 1
+291 299 1
+291 346 1
+291 1297 1
+291 2066 1
+291 2326 1
+291 2328 1
+291 2397 1
+291 2398 1
+291 2517 1
+291 2790 1
+291 2811 1
+291 2958 1
+291 3014 1
+291 3034 1
+291 3352 1
+291 3455 1
+291 3463 1
+291 3635 1
+291 3976 1
+291 4013 1
+291 4179 1
+291 4201 1
+291 4233 1
+291 4261 1
+291 4266 1
+291 4466 1
+291 4661 1
+291 4662 1
+291 4666 1
+291 4719 1
+291 4735 1
+291 4776 1
+291 4780 1
+291 4811 1
+294 299 1
+292 3 1
+292 178 1
+292 299 1
+292 477 1
+292 945 1
+292 1201 1
+293 282 1
+293 299 1
+293 1497 1
+295 56 1
+295 299 1
+295 300 1
+295 1442 1
+295 1444 1
+296 243 1
+296 246 1
+296 299 1
+296 405 1
+296 415 1
+296 560 1
+296 663 1
+296 1123 1
+296 1718 1
+296 8282 1
+297 299 1
+290 35 1
+290 204 1
+290 214 1
+290 271 1
+290 299 1
+290 372 1
+290 633 1
+290 765 1
+290 887 1
+290 908 1
+290 946 1
+290 959 1
+290 974 1
+290 1131 1
+290 1164 1
+290 1165 1
+290 1193 1
+290 1201 1
+290 1211 1
+290 1230 1
+290 1248 1
+290 1284 1
+290 1297 1
+290 1305 1
+290 1378 1
+290 1396 1
+290 1411 1
+290 1468 1
+290 1482 1
+290 1484 1
+290 1514 1
+290 1593 1
+290 1622 1
+290 1706 1
+290 1717 1
+290 1726 1
+290 1734 1
+290 1754 1
+290 1757 1
+290 1774 1
+290 1788 1
+290 1805 1
+290 1836 1
+290 1893 1
+290 1908 1
+290 1918 1
+290 1927 1
+290 1956 1
+290 1966 1
+290 1973 1
+290 1977 1
+290 2004 1
+290 2135 1
+290 2210 1
+290 2225 1
+290 2356 1
+290 2411 1
+290 2474 1
+290 2508 1
+290 2579 1
+290 2654 1
+290 2697 1
+290 2708 1
+290 2871 1
+290 3005 1
+290 3117 1
+290 3408 1
+290 3516 1
+290 4037 1
+290 4983 1
+290 5412 1
+298 299 1
+298 5793 1
+301 362 1
+302 75 1
+302 94 1
+302 349 1
+302 359 1
+302 363 1
+302 370 1
+302 389 1
+302 2289 1
+302 2470 1
+302 3635 1
+302 3724 1
+302 4557 1
+302 8283 1
+249 15 1
+249 28 1
+249 299 1
+249 302 1
+249 700 1
+249 784 1
+249 1006 1
+249 1196 1
+249 1248 1
+249 1485 1
+249 1638 1
+249 1648 1
+249 1652 1
+249 1654 1
+249 2055 1
+303 80 1
+303 94 1
+303 302 1
+304 29 1
+304 86 1
+304 271 1
+304 313 1
+304 317 1
+304 322 1
+304 682 1
+304 696 1
+304 704 1
+304 714 1
+304 741 1
+304 742 1
+304 761 1
+304 763 1
+304 789 1
+304 795 1
+304 810 1
+304 820 1
+304 906 1
+304 907 1
+304 908 1
+304 945 1
+304 963 1
+304 966 1
+304 971 1
+304 972 1
+304 978 1
+304 981 1
+304 989 1
+304 1014 1
+304 1020 1
+304 1023 1
+304 1026 1
+304 1053 1
+304 1123 1
+304 1131 1
+304 1140 1
+304 1154 1
+304 1164 1
+304 1165 1
+304 1248 1
+304 1284 1
+304 1297 1
+304 1319 1
+304 1326 1
+304 1428 1
+304 1439 1
+304 1446 1
+304 1464 1
+304 1468 1
+304 1476 1
+304 1478 1
+304 1514 1
+304 1534 1
+304 1622 1
+304 1652 1
+304 1654 1
+304 1662 1
+304 1717 1
+304 1757 1
+304 1833 1
+304 1858 1
+304 1859 1
+304 1864 1
+304 1884 1
+304 1903 1
+304 1927 1
+304 1950 1
+304 1953 1
+304 1963 1
+304 1966 1
+304 1969 1
+304 1984 1
+304 2151 1
+304 2210 1
+304 2246 1
+304 2276 1
+304 2499 1
+304 3136 1
+306 8 1
+306 29 1
+306 36 1
+306 86 1
+306 204 1
+306 228 1
+306 246 1
+306 255 1
+306 271 1
+306 282 1
+306 298 1
+306 308 1
+306 310 1
+306 311 1
+306 313 1
+306 317 1
+306 319 1
+306 322 1
+306 325 1
+306 332 1
+306 371 1
+306 406 1
+306 407 1
+306 415 1
+306 417 1
+306 429 1
+306 439 1
+306 549 1
+306 566 1
+306 567 1
+306 587 1
+306 600 1
+306 609 1
+306 613 1
+306 619 1
+306 636 1
+306 637 1
+306 643 1
+306 656 1
+306 659 1
+306 664 1
+306 667 1
+306 670 1
+306 673 1
+306 675 1
+306 677 1
+306 681 1
+306 682 1
+306 684 1
+306 687 1
+306 697 1
+306 700 1
+306 704 1
+306 706 1
+306 707 1
+306 714 1
+306 715 1
+306 719 1
+306 722 1
+306 723 1
+306 730 1
+306 733 1
+306 739 1
+306 741 1
+306 742 1
+306 743 1
+306 746 1
+306 748 1
+306 749 1
+306 750 1
+306 756 1
+306 760 1
+306 762 1
+306 765 1
+306 778 1
+306 794 1
+306 795 1
+306 798 1
+306 810 1
+306 817 1
+306 829 1
+306 838 1
+306 857 1
+306 863 1
+306 866 1
+306 868 1
+306 875 1
+306 878 1
+306 881 1
+306 895 1
+306 896 1
+306 903 1
+306 907 1
+306 908 1
+306 913 1
+306 934 1
+306 936 1
+306 938 1
+306 956 1
+306 958 1
+306 960 1
+306 963 1
+306 971 1
+306 972 1
+306 974 1
+306 978 1
+306 979 1
+306 993 1
+306 1007 1
+306 1018 1
+306 1022 1
+306 1026 1
+306 1032 1
+306 1039 1
+306 1043 1
+306 1141 1
+306 1157 1
+306 1166 1
+306 1167 1
+306 1199 1
+306 1200 1
+306 1234 1
+306 1236 1
+306 1253 1
+306 1277 1
+306 1286 1
+306 1297 1
+306 1378 1
+306 1385 1
+306 1394 1
+306 1413 1
+306 1418 1
+306 1428 1
+306 1464 1
+306 1468 1
+306 1473 1
+306 1476 1
+306 1490 1
+306 1492 1
+306 1501 1
+306 1506 1
+306 1518 1
+306 1524 1
+306 1537 1
+306 1538 1
+306 1556 1
+306 1573 1
+306 1585 1
+306 1587 1
+306 1595 1
+306 1633 1
+306 1646 1
+306 1700 1
+306 1701 1
+306 1714 1
+306 1732 1
+306 1935 1
+306 1964 1
+306 1965 1
+306 1984 1
+306 1992 1
+306 2066 1
+306 2079 1
+306 2097 1
+306 2114 1
+306 2144 1
+306 2145 1
+306 2206 1
+306 2209 1
+306 2240 1
+306 2257 1
+306 2276 1
+306 2324 1
+306 2328 1
+306 2485 1
+306 2510 1
+306 2544 1
+306 2565 1
+306 2576 1
+306 2646 1
+306 2653 1
+306 2654 1
+306 2657 1
+306 2660 1
+306 2665 1
+306 2686 1
+306 2693 1
+306 2727 1
+306 2747 1
+306 2754 1
+306 2790 1
+306 2859 1
+306 2900 1
+306 2923 1
+306 2932 1
+306 2973 1
+306 3005 1
+306 3015 1
+306 3021 1
+306 3089 1
+306 3114 1
+306 3117 1
+306 3144 1
+306 3191 1
+306 3291 1
+306 3352 1
+306 3404 1
+306 3408 1
+306 3454 1
+306 3480 1
+306 3529 1
+306 3537 1
+306 3562 1
+306 3567 1
+306 3680 1
+306 3713 1
+306 3720 1
+306 3804 1
+306 3812 1
+306 3847 1
+306 3976 1
+306 4011 1
+306 4041 1
+306 4138 1
+306 4162 1
+306 4290 1
+306 4299 1
+306 4365 1
+306 4661 1
+306 5123 1
+306 5176 1
+306 5182 1
+306 5404 1
+306 5445 1
+306 5457 1
+306 5543 1
+306 5925 1
+306 5928 1
+306 5947 1
+306 5969 1
+306 6029 1
+306 8288 1
+306 8290 1
+306 8294 1
+307 55 1
+307 75 1
+307 322 1
+307 377 1
+307 402 1
+308 15 1
+308 29 1
+308 35 1
+308 36 1
+308 86 1
+308 204 1
+308 228 1
+308 243 1
+308 271 1
+308 299 1
+308 304 1
+308 311 1
+308 313 1
+308 317 1
+308 321 1
+308 322 1
+308 350 1
+308 417 1
+308 425 1
+308 439 1
+308 447 1
+308 465 1
+308 545 1
+308 549 1
+308 579 1
+308 600 1
+308 626 1
+308 643 1
+308 644 1
+308 647 1
+308 663 1
+308 673 1
+308 697 1
+308 704 1
+308 707 1
+308 710 1
+308 730 1
+308 733 1
+308 739 1
+308 746 1
+308 750 1
+308 762 1
+308 789 1
+308 813 1
+308 817 1
+308 838 1
+308 844 1
+308 853 1
+308 857 1
+308 859 1
+308 861 1
+308 878 1
+308 895 1
+308 908 1
+308 913 1
+308 941 1
+308 948 1
+308 958 1
+308 959 1
+308 960 1
+308 972 1
+308 974 1
+308 978 1
+308 982 1
+308 993 1
+308 994 1
+308 999 1
+308 1022 1
+308 1026 1
+308 1034 1
+308 1038 1
+308 1039 1
+308 1055 1
+308 1062 1
+308 1127 1
+308 1131 1
+308 1156 1
+308 1157 1
+308 1167 1
+308 1193 1
+308 1218 1
+308 1248 1
+308 1253 1
+308 1279 1
+308 1297 1
+308 1307 1
+308 1389 1
+308 1402 1
+308 1413 1
+308 1418 1
+308 1464 1
+308 1468 1
+308 1476 1
+308 1484 1
+308 1506 1
+308 1513 1
+308 1525 1
+308 1538 1
+308 1566 1
+308 1585 1
+308 1587 1
+308 1593 1
+308 1604 1
+308 1622 1
+308 1654 1
+308 1661 1
+308 1672 1
+308 1811 1
+308 1847 1
+308 1855 1
+308 1956 1
+308 1966 1
+308 2004 1
+308 2066 1
+308 2157 1
+308 2165 1
+308 2193 1
+308 2297 1
+308 2323 1
+308 2328 1
+308 2329 1
+308 2339 1
+308 2345 1
+308 2409 1
+308 2474 1
+308 2535 1
+308 2774 1
+308 2805 1
+308 2828 1
+308 3005 1
+308 3136 1
+308 3150 1
+308 3443 1
+308 3473 1
+308 3562 1
+308 3976 1
+308 4233 1
+308 4373 1
+308 4687 1
+308 5288 1
+308 5584 1
+308 5714 1
+320 243 1
+320 299 1
+320 317 1
+320 322 1
+320 849 1
+320 1080 1
+320 1186 1
+309 322 1
+310 35 1
+310 36 1
+310 56 1
+310 86 1
+310 171 1
+310 204 1
+310 243 1
+310 271 1
+310 299 1
+310 304 1
+310 308 1
+310 313 1
+310 317 1
+310 322 1
+310 324 1
+310 332 1
+310 338 1
+310 350 1
+310 407 1
+310 429 1
+310 432 1
+310 439 1
+310 447 1
+310 488 1
+310 549 1
+310 587 1
+310 600 1
+310 626 1
+310 633 1
+310 637 1
+310 659 1
+310 665 1
+310 674 1
+310 677 1
+310 682 1
+310 686 1
+310 697 1
+310 704 1
+310 707 1
+310 710 1
+310 719 1
+310 723 1
+310 725 1
+310 730 1
+310 733 1
+310 739 1
+310 742 1
+310 748 1
+310 749 1
+310 756 1
+310 760 1
+310 763 1
+310 765 1
+310 769 1
+310 778 1
+310 779 1
+310 784 1
+310 789 1
+310 794 1
+310 798 1
+310 805 1
+310 806 1
+310 813 1
+310 817 1
+310 844 1
+310 857 1
+310 866 1
+310 868 1
+310 871 1
+310 878 1
+310 893 1
+310 904 1
+310 918 1
+310 922 1
+310 932 1
+310 935 1
+310 936 1
+310 945 1
+310 946 1
+310 947 1
+310 955 1
+310 958 1
+310 966 1
+310 972 1
+310 985 1
+310 989 1
+310 991 1
+310 993 1
+310 994 1
+310 995 1
+310 999 1
+310 1006 1
+310 1014 1
+310 1032 1
+310 1039 1
+310 1061 1
+310 1103 1
+310 1111 1
+310 1123 1
+310 1125 1
+310 1128 1
+310 1131 1
+310 1140 1
+310 1164 1
+310 1166 1
+310 1167 1
+310 1191 1
+310 1193 1
+310 1196 1
+310 1200 1
+310 1201 1
+310 1211 1
+310 1218 1
+310 1222 1
+310 1236 1
+310 1240 1
+310 1250 1
+310 1260 1
+310 1261 1
+310 1267 1
+310 1285 1
+310 1297 1
+310 1319 1
+310 1375 1
+310 1378 1
+310 1407 1
+310 1411 1
+310 1413 1
+310 1428 1
+310 1464 1
+310 1476 1
+310 1487 1
+310 1501 1
+310 1514 1
+310 1518 1
+310 1520 1
+310 1538 1
+310 1573 1
+310 1585 1
+310 1603 1
+310 1619 1
+310 1633 1
+310 1641 1
+310 1646 1
+310 1649 1
+310 1672 1
+310 1717 1
+310 1718 1
+310 1723 1
+310 1726 1
+310 1746 1
+310 1749 1
+310 1754 1
+310 1757 1
+310 1774 1
+310 1842 1
+310 1888 1
+310 1901 1
+310 1903 1
+310 1966 1
+310 1977 1
+310 1979 1
+310 1992 1
+310 2066 1
+310 2079 1
+310 2097 1
+310 2106 1
+310 2117 1
+310 2120 1
+310 2121 1
+310 2128 1
+310 2144 1
+310 2151 1
+310 2174 1
+310 2241 1
+310 2246 1
+310 2257 1
+310 2297 1
+310 2322 1
+310 2325 1
+310 2341 1
+310 2375 1
+310 2381 1
+310 2400 1
+310 2485 1
+310 2535 1
+310 2593 1
+310 2625 1
+310 2643 1
+310 2669 1
+310 2685 1
+310 2693 1
+310 2700 1
+310 2754 1
+310 2794 1
+310 2819 1
+310 2822 1
+310 2834 1
+310 2955 1
+310 3028 1
+310 3034 1
+310 3089 1
+310 3136 1
+310 3251 1
+310 3253 1
+310 3352 1
+310 3408 1
+310 3417 1
+310 3464 1
+310 3473 1
+310 3489 1
+310 3634 1
+310 3643 1
+310 3664 1
+310 3967 1
+310 4471 1
+310 4482 1
+310 4827 1
+310 4828 1
+310 5072 1
+310 5210 1
+310 5222 1
+310 5239 1
+310 5288 1
+310 5524 1
+310 5651 1
+310 5721 1
+310 5753 1
+310 5844 1
+310 6505 1
+311 15 1
+311 29 1
+311 35 1
+311 56 1
+311 72 1
+311 86 1
+311 243 1
+311 259 1
+311 271 1
+311 299 1
+311 304 1
+311 313 1
+311 317 1
+311 321 1
+311 322 1
+311 324 1
+311 407 1
+311 432 1
+311 439 1
+311 447 1
+311 465 1
+311 488 1
+311 506 1
+311 626 1
+311 637 1
+311 643 1
+311 647 1
+311 663 1
+311 674 1
+311 697 1
+311 704 1
+311 705 1
+311 707 1
+311 710 1
+311 722 1
+311 730 1
+311 742 1
+311 762 1
+311 765 1
+311 769 1
+311 784 1
+311 789 1
+311 795 1
+311 805 1
+311 810 1
+311 826 1
+311 844 1
+311 857 1
+311 859 1
+311 861 1
+311 871 1
+311 875 1
+311 878 1
+311 882 1
+311 887 1
+311 893 1
+311 895 1
+311 904 1
+311 907 1
+311 908 1
+311 922 1
+311 930 1
+311 936 1
+311 937 1
+311 941 1
+311 943 1
+311 946 1
+311 955 1
+311 956 1
+311 958 1
+311 971 1
+311 972 1
+311 978 1
+311 981 1
+311 983 1
+311 985 1
+311 989 1
+311 993 1
+311 994 1
+311 995 1
+311 1006 1
+311 1012 1
+311 1014 1
+311 1022 1
+311 1023 1
+311 1026 1
+311 1030 1
+311 1031 1
+311 1034 1
+311 1038 1
+311 1053 1
+311 1055 1
+311 1097 1
+311 1114 1
+311 1123 1
+311 1125 1
+311 1128 1
+311 1151 1
+311 1152 1
+311 1160 1
+311 1164 1
+311 1166 1
+311 1167 1
+311 1186 1
+311 1193 1
+311 1199 1
+311 1200 1
+311 1201 1
+311 1211 1
+311 1222 1
+311 1230 1
+311 1234 1
+311 1236 1
+311 1241 1
+311 1243 1
+311 1261 1
+311 1277 1
+311 1279 1
+311 1284 1
+311 1285 1
+311 1286 1
+311 1297 1
+311 1319 1
+311 1322 1
+311 1326 1
+311 1330 1
+311 1353 1
+311 1357 1
+311 1374 1
+311 1375 1
+311 1377 1
+311 1385 1
+311 1413 1
+311 1418 1
+311 1419 1
+311 1425 1
+311 1428 1
+311 1453 1
+311 1464 1
+311 1465 1
+311 1476 1
+311 1482 1
+311 1484 1
+311 1487 1
+311 1490 1
+311 1492 1
+311 1496 1
+311 1497 1
+311 1514 1
+311 1521 1
+311 1525 1
+311 1534 1
+311 1538 1
+311 1547 1
+311 1549 1
+311 1580 1
+311 1583 1
+311 1585 1
+311 1587 1
+311 1592 1
+311 1593 1
+311 1597 1
+311 1603 1
+311 1608 1
+311 1618 1
+311 1622 1
+311 1633 1
+311 1638 1
+311 1641 1
+311 1649 1
+311 1658 1
+311 1697 1
+311 1700 1
+311 1714 1
+311 1717 1
+311 1729 1
+311 1734 1
+311 1752 1
+311 1754 1
+311 1758 1
+311 1769 1
+311 1772 1
+311 1774 1
+311 1787 1
+311 1814 1
+311 1847 1
+311 1848 1
+311 1861 1
+311 1864 1
+311 1884 1
+311 1888 1
+311 1893 1
+311 1919 1
+311 1956 1
+311 1964 1
+311 1965 1
+311 1966 1
+311 1973 1
+311 1977 1
+311 1992 1
+311 1997 1
+311 2062 1
+311 2071 1
+311 2079 1
+311 2102 1
+311 2106 1
+311 2109 1
+311 2120 1
+311 2128 1
+311 2145 1
+311 2151 1
+311 2206 1
+311 2210 1
+311 2225 1
+311 2241 1
+311 2257 1
+311 2297 1
+311 2322 1
+311 2323 1
+311 2341 1
+311 2381 1
+311 2385 1
+311 2425 1
+311 2456 1
+311 2485 1
+311 2504 1
+311 2535 1
+311 2542 1
+311 2560 1
+311 2565 1
+311 2570 1
+311 2605 1
+311 2625 1
+311 2643 1
+311 2654 1
+311 2655 1
+311 2660 1
+311 2672 1
+311 2708 1
+311 2720 1
+311 2763 1
+311 2775 1
+311 2790 1
+311 2809 1
+311 2830 1
+311 2871 1
+311 2918 1
+311 2940 1
+311 2963 1
+311 2968 1
+311 2973 1
+311 2981 1
+311 2999 1
+311 3007 1
+311 3009 1
+311 3033 1
+311 3034 1
+311 3068 1
+311 3089 1
+311 3117 1
+311 3136 1
+311 3144 1
+311 3238 1
+311 3253 1
+311 3265 1
+311 3334 1
+311 3408 1
+311 3443 1
+311 3456 1
+311 3459 1
+311 3506 1
+311 3755 1
+311 3843 1
+311 3892 1
+311 3969 1
+311 3976 1
+311 4040 1
+311 4072 1
+311 4098 1
+311 4099 1
+311 4435 1
+311 4534 1
+311 4578 1
+311 4650 1
+311 4712 1
+311 4735 1
+311 4884 1
+311 5020 1
+311 5022 1
+311 5179 1
+311 5254 1
+311 5335 1
+311 5404 1
+311 5412 1
+311 5449 1
+311 5463 1
+311 5543 1
+311 5743 1
+311 5897 1
+311 5922 1
+311 6097 1
+311 6151 1
+311 6156 1
+311 6299 1
+311 6306 1
+311 6330 1
+311 6595 1
+311 6715 1
+311 6770 1
+311 6918 1
+311 6979 1
+311 7620 1
+311 7624 1
+311 7632 1
+311 7809 1
+311 7833 1
+311 7839 1
+311 7855 1
+311 8083 1
+311 8290 1
+311 8295 1
+312 8 1
+312 29 1
+312 36 1
+312 86 1
+312 224 1
+312 227 1
+312 228 1
+312 255 1
+312 271 1
+312 282 1
+312 304 1
+312 306 1
+312 308 1
+312 310 1
+312 311 1
+312 313 1
+312 317 1
+312 319 1
+312 321 1
+312 322 1
+312 325 1
+312 332 1
+312 334 1
+312 338 1
+312 406 1
+312 407 1
+312 429 1
+312 432 1
+312 439 1
+312 447 1
+312 488 1
+312 545 1
+312 549 1
+312 575 1
+312 579 1
+312 600 1
+312 624 1
+312 626 1
+312 628 1
+312 631 1
+312 636 1
+312 643 1
+312 644 1
+312 647 1
+312 656 1
+312 657 1
+312 658 1
+312 664 1
+312 667 1
+312 668 1
+312 670 1
+312 673 1
+312 674 1
+312 675 1
+312 677 1
+312 681 1
+312 682 1
+312 684 1
+312 686 1
+312 687 1
+312 691 1
+312 696 1
+312 697 1
+312 700 1
+312 704 1
+312 705 1
+312 706 1
+312 707 1
+312 710 1
+312 715 1
+312 719 1
+312 722 1
+312 723 1
+312 725 1
+312 730 1
+312 733 1
+312 739 1
+312 742 1
+312 743 1
+312 746 1
+312 749 1
+312 750 1
+312 756 1
+312 761 1
+312 769 1
+312 778 1
+312 784 1
+312 789 1
+312 794 1
+312 795 1
+312 798 1
+312 802 1
+312 803 1
+312 805 1
+312 806 1
+312 813 1
+312 817 1
+312 820 1
+312 822 1
+312 837 1
+312 838 1
+312 839 1
+312 844 1
+312 849 1
+312 857 1
+312 861 1
+312 863 1
+312 864 1
+312 866 1
+312 868 1
+312 878 1
+312 881 1
+312 882 1
+312 885 1
+312 887 1
+312 893 1
+312 895 1
+312 897 1
+312 918 1
+312 929 1
+312 932 1
+312 936 1
+312 937 1
+312 941 1
+312 943 1
+312 945 1
+312 948 1
+312 956 1
+312 958 1
+312 959 1
+312 966 1
+312 972 1
+312 977 1
+312 978 1
+312 979 1
+312 981 1
+312 982 1
+312 985 1
+312 989 1
+312 991 1
+312 994 1
+312 995 1
+312 999 1
+312 1006 1
+312 1007 1
+312 1014 1
+312 1023 1
+312 1030 1
+312 1035 1
+312 1039 1
+312 1043 1
+312 1061 1
+312 1062 1
+312 1123 1
+312 1125 1
+312 1127 1
+312 1128 1
+312 1141 1
+312 1144 1
+312 1152 1
+312 1156 1
+312 1164 1
+312 1165 1
+312 1168 1
+312 1186 1
+312 1190 1
+312 1193 1
+312 1196 1
+312 1201 1
+312 1203 1
+312 1211 1
+312 1218 1
+312 1220 1
+312 1221 1
+312 1222 1
+312 1234 1
+312 1241 1
+312 1248 1
+312 1259 1
+312 1279 1
+312 1286 1
+312 1296 1
+312 1297 1
+312 1319 1
+312 1330 1
+312 1375 1
+312 1382 1
+312 1413 1
+312 1418 1
+312 1425 1
+312 1439 1
+312 1446 1
+312 1453 1
+312 1464 1
+312 1468 1
+312 1471 1
+312 1489 1
+312 1492 1
+312 1520 1
+312 1556 1
+312 1573 1
+312 1580 1
+312 1595 1
+312 1603 1
+312 1604 1
+312 1619 1
+312 1638 1
+312 1641 1
+312 1648 1
+312 1649 1
+312 1654 1
+312 1661 1
+312 1672 1
+312 1692 1
+312 1700 1
+312 1701 1
+312 1726 1
+312 1836 1
+312 1842 1
+312 1855 1
+312 1893 1
+312 1953 1
+312 1963 1
+312 1966 1
+312 1969 1
+312 2397 1
+312 2400 1
+313 29 1
+313 35 1
+313 56 1
+313 290 1
+313 322 1
+313 644 1
+313 697 1
+313 704 1
+313 761 1
+313 762 1
+313 795 1
+313 857 1
+313 871 1
+313 941 1
+313 958 1
+313 959 1
+313 974 1
+313 978 1
+313 981 1
+313 999 1
+313 1026 1
+313 1151 1
+313 1211 1
+313 1297 1
+313 1330 1
+313 1377 1
+313 1482 1
+313 1497 1
+313 1538 1
+313 1549 1
+313 1593 1
+313 1597 1
+313 1772 1
+313 1859 1
+313 1918 1
+313 2106 1
+313 2151 1
+313 2157 1
+313 2193 1
+313 2386 1
+313 2411 1
+313 2565 1
+313 2763 1
+313 2790 1
+313 2801 1
+313 2838 1
+313 2871 1
+313 2923 1
+313 3005 1
+313 3117 1
+313 3456 1
+313 3946 1
+313 8290 1
+313 8292 1
+314 322 1
+315 8 1
+315 36 1
+315 72 1
+315 214 1
+315 259 1
+315 299 1
+315 308 1
+315 317 1
+315 322 1
+315 407 1
+315 432 1
+315 488 1
+315 637 1
+315 643 1
+315 659 1
+315 663 1
+315 673 1
+315 674 1
+315 677 1
+315 730 1
+315 741 1
+315 742 1
+315 749 1
+315 765 1
+315 778 1
+315 779 1
+315 793 1
+315 798 1
+315 802 1
+315 806 1
+315 817 1
+315 829 1
+315 838 1
+315 844 1
+315 857 1
+315 863 1
+315 864 1
+315 873 1
+315 878 1
+315 881 1
+315 885 1
+315 893 1
+315 895 1
+315 930 1
+315 942 1
+315 943 1
+315 963 1
+315 985 1
+315 993 1
+315 1038 1
+315 1123 1
+315 1127 1
+315 1156 1
+315 1166 1
+315 1186 1
+315 1201 1
+315 1259 1
+315 1296 1
+315 1321 1
+315 1382 1
+315 1413 1
+315 1593 1
+315 1718 1
+315 1888 1
+315 2014 1
+315 2102 1
+315 2120 1
+315 2135 1
+315 2341 1
+315 2456 1
+315 2470 1
+315 2625 1
+315 2834 1
+315 2963 1
+315 3117 1
+315 4037 1
+315 5683 1
+316 322 1
+316 559 1
+316 1717 1
+305 322 1
+305 659 1
+305 715 1
+305 1014 1
+305 1282 1
+305 5130 1
+305 5412 1
+317 29 1
+317 35 1
+317 36 1
+317 204 1
+317 228 1
+317 271 1
+317 298 1
+317 299 1
+317 304 1
+317 308 1
+317 311 1
+317 313 1
+317 321 1
+317 322 1
+317 334 1
+317 429 1
+317 432 1
+317 439 1
+317 447 1
+317 488 1
+317 545 1
+317 579 1
+317 626 1
+317 637 1
+317 643 1
+317 644 1
+317 647 1
+317 663 1
+317 677 1
+317 682 1
+317 686 1
+317 696 1
+317 697 1
+317 704 1
+317 705 1
+317 707 1
+317 714 1
+317 730 1
+317 741 1
+317 742 1
+317 762 1
+317 769 1
+317 789 1
+317 794 1
+317 795 1
+317 805 1
+317 813 1
+317 820 1
+317 823 1
+317 826 1
+317 838 1
+317 844 1
+317 849 1
+317 853 1
+317 857 1
+317 863 1
+317 864 1
+317 866 1
+317 868 1
+317 871 1
+317 878 1
+317 882 1
+317 887 1
+317 895 1
+317 918 1
+317 929 1
+317 930 1
+317 932 1
+317 934 1
+317 938 1
+317 941 1
+317 948 1
+317 956 1
+317 958 1
+317 960 1
+317 971 1
+317 972 1
+317 979 1
+317 981 1
+317 989 1
+317 991 1
+317 993 1
+317 994 1
+317 995 1
+317 999 1
+317 1007 1
+317 1014 1
+317 1022 1
+317 1023 1
+317 1026 1
+317 1032 1
+317 1039 1
+317 1053 1
+317 1055 1
+317 1062 1
+317 1075 1
+317 1123 1
+317 1125 1
+317 1128 1
+317 1167 1
+317 1190 1
+317 1193 1
+317 1201 1
+317 1234 1
+317 1277 1
+317 1279 1
+317 1286 1
+317 1296 1
+317 1297 1
+317 1377 1
+317 1394 1
+317 1413 1
+317 1428 1
+317 1476 1
+317 1482 1
+317 1490 1
+317 1496 1
+317 1506 1
+317 1518 1
+317 1520 1
+317 1524 1
+317 1538 1
+317 1555 1
+317 1556 1
+317 1573 1
+317 1585 1
+317 1593 1
+317 1603 1
+317 1622 1
+317 1641 1
+317 1661 1
+317 1726 1
+317 1774 1
+317 1783 1
+317 1893 1
+317 2707 1
+317 3136 1
+317 4037 1
+317 5802 1
+317 8288 1
+318 271 1
+318 322 1
+318 1080 1
+319 8 1
+319 15 1
+319 39 1
+319 182 1
+319 204 1
+319 214 1
+319 255 1
+319 271 1
+319 280 1
+319 282 1
+319 290 1
+319 299 1
+319 306 1
+319 310 1
+319 311 1
+319 317 1
+319 322 1
+319 325 1
+319 370 1
+319 371 1
+319 379 1
+319 403 1
+319 405 1
+319 407 1
+319 429 1
+319 439 1
+319 587 1
+319 590 1
+319 592 1
+319 600 1
+319 622 1
+319 627 1
+319 633 1
+319 637 1
+319 647 1
+319 656 1
+319 659 1
+319 670 1
+319 673 1
+319 675 1
+319 704 1
+319 706 1
+319 725 1
+319 730 1
+319 733 1
+319 739 1
+319 741 1
+319 746 1
+319 749 1
+319 762 1
+319 765 1
+319 789 1
+319 798 1
+319 803 1
+319 805 1
+319 813 1
+319 817 1
+319 822 1
+319 826 1
+319 844 1
+319 857 1
+319 878 1
+319 904 1
+319 906 1
+319 907 1
+319 908 1
+319 922 1
+319 936 1
+319 955 1
+319 967 1
+319 971 1
+319 972 1
+319 978 1
+319 981 1
+319 993 1
+319 995 1
+319 1023 1
+319 1026 1
+319 1035 1
+319 1038 1
+319 1103 1
+319 1152 1
+319 1164 1
+319 1167 1
+319 1186 1
+319 1199 1
+319 1200 1
+319 1211 1
+319 1267 1
+319 1296 1
+319 1382 1
+319 1413 1
+319 1464 1
+319 1471 1
+319 1478 1
+319 1482 1
+319 1514 1
+319 1537 1
+319 1566 1
+319 1573 1
+319 1580 1
+319 1587 1
+319 1593 1
+319 1622 1
+319 1669 1
+319 1680 1
+319 1697 1
+319 1723 1
+319 1799 1
+319 1842 1
+319 1908 1
+319 1919 1
+319 1987 1
+319 1991 1
+319 2004 1
+319 2117 1
+319 2145 1
+319 2181 1
+319 2371 1
+319 2535 1
+319 2592 1
+319 2629 1
+319 2660 1
+319 2689 1
+319 2696 1
+319 2774 1
+319 2775 1
+319 2819 1
+319 2925 1
+319 3029 1
+319 3033 1
+319 3192 1
+319 3334 1
+319 3537 1
+319 3547 1
+319 3607 1
+319 3643 1
+319 3691 1
+319 3748 1
+319 3752 1
+319 3796 1
+319 3830 1
+319 3843 1
+319 3854 1
+319 3897 1
+319 3910 1
+319 3958 1
+319 4040 1
+319 4099 1
+319 4103 1
+319 4297 1
+319 4310 1
+319 4335 1
+319 4527 1
+319 4551 1
+319 4587 1
+319 4632 1
+319 4827 1
+319 4828 1
+319 4954 1
+319 4962 1
+319 4994 1
+319 5002 1
+319 5020 1
+319 5026 1
+319 5072 1
+319 5073 1
+319 5075 1
+319 5178 1
+319 5182 1
+319 5226 1
+319 5273 1
+319 5335 1
+319 5423 1
+319 5430 1
+319 5459 1
+319 5545 1
+319 5563 1
+319 5584 1
+319 5806 1
+319 5897 1
+319 6006 1
+319 6097 1
+319 6110 1
+319 6347 1
+319 6442 1
+319 6505 1
+319 6570 1
+319 6715 1
+319 6774 1
+319 6860 1
+319 6913 1
+319 6930 1
+319 7021 1
+319 7910 1
+319 8037 1
+319 8121 1
+319 8163 1
+319 8288 1
+329 80 1
+329 135 1
+329 228 1
+329 282 1
+329 299 1
+329 733 1
+330 80 1
+323 80 1
+324 80 1
+324 135 1
+324 704 1
+324 739 1
+324 742 1
+324 746 1
+324 789 1
+324 817 1
+324 849 1
+324 966 1
+324 1026 1
+324 1413 1
+324 1757 1
+324 1842 1
+326 39 1
+326 80 1
+326 140 1
+326 152 1
+326 243 1
+326 282 1
+326 348 1
+326 407 1
+326 488 1
+326 549 1
+326 616 1
+326 2160 1
+331 80 1
+331 94 1
+331 415 1
+331 3892 1
+327 80 1
+327 232 1
+327 282 1
+327 311 1
+327 857 1
+327 918 1
+327 1053 1
+327 2205 1
+251 32 1
+251 80 1
+251 94 1
+251 299 1
+251 310 1
+251 432 1
+251 719 1
+251 1261 1
+328 75 1
+328 80 1
+328 299 1
+328 325 1
+328 356 1
+328 373 1
+328 626 1
+328 789 1
+328 875 1
+328 966 1
+328 1026 1
+328 1864 1
+328 2999 1
+333 55 1
+333 94 1
+335 15 1
+335 56 1
+335 94 1
+335 151 1
+335 589 1
+335 737 1
+335 839 1
+335 1026 1
+335 1259 1
+335 1282 1
+335 1385 1
+335 1513 1
+335 1573 1
+335 1729 1
+335 2369 1
+335 2506 1
+335 2592 1
+335 2612 1
+335 4037 1
+335 4191 1
+335 4234 1
+335 4365 1
+335 4551 1
+335 4632 1
+335 4709 1
+335 4814 1
+335 4820 1
+335 4994 1
+335 5083 1
+335 5421 1
+335 5482 1
+335 5545 1
+335 5563 1
+335 5584 1
+335 5743 1
+335 5886 1
+335 5887 1
+335 5922 1
+335 6174 1
+335 6634 1
+335 7074 1
+335 7443 1
+335 7497 1
+335 7587 1
+335 7688 1
+335 7795 1
+150 56 1
+150 94 1
+150 178 1
+150 232 1
+150 280 1
+150 371 1
+150 407 1
+150 431 1
+150 566 1
+150 567 1
+150 584 1
+150 587 1
+150 589 1
+150 590 1
+150 592 1
+150 601 1
+150 606 1
+150 607 1
+150 609 1
+150 737 1
+150 1319 1
+150 1385 1
+150 1412 1
+150 3334 1
+150 3568 1
+150 4373 1
+150 4403 1
+150 4536 1
+336 15 1
+336 28 1
+336 75 1
+336 86 1
+336 135 1
+336 151 1
+336 214 1
+336 271 1
+336 310 1
+336 325 1
+336 356 1
+336 371 1
+336 439 1
+336 465 1
+336 590 1
+336 600 1
+336 636 1
+336 941 1
+336 1196 1
+336 1201 1
+336 1385 1
+336 1633 1
+336 2727 1
+336 3238 1
+336 4289 1
+336 5233 1
+336 5412 1
+336 6221 1
+336 6595 1
+336 7450 1
+336 8287 1
+337 135 1
+338 135 1
+339 35 1
+339 36 1
+339 86 1
+339 135 1
+339 140 1
+339 150 1
+339 224 1
+339 226 1
+339 227 1
+339 236 1
+339 243 1
+339 259 1
+339 271 1
+339 282 1
+339 334 1
+339 341 1
+339 373 1
+339 377 1
+339 379 1
+339 394 1
+339 402 1
+339 439 1
+339 549 1
+339 560 1
+339 600 1
+339 609 1
+339 611 1
+339 613 1
+339 616 1
+339 624 1
+339 627 1
+339 628 1
+339 631 1
+339 643 1
+339 644 1
+339 647 1
+339 659 1
+339 665 1
+339 668 1
+339 673 1
+339 675 1
+339 706 1
+339 719 1
+339 725 1
+339 730 1
+339 733 1
+339 741 1
+339 746 1
+339 750 1
+339 762 1
+339 803 1
+339 817 1
+339 822 1
+339 853 1
+339 863 1
+339 881 1
+339 885 1
+339 893 1
+339 895 1
+339 918 1
+339 936 1
+339 941 1
+339 959 1
+339 1053 1
+339 1080 1
+339 1186 1
+339 1296 1
+339 1321 1
+339 1330 1
+339 1485 1
+339 1506 1
+339 1525 1
+339 1717 1
+339 1855 1
+339 2398 1
+339 2651 1
+339 5335 1
+339 5341 1
+339 6043 1
+339 7961 1
+340 86 1
+340 135 1
+340 151 1
+340 178 1
+340 232 1
+340 271 1
+340 282 1
+340 304 1
+340 396 1
+340 407 1
+340 439 1
+340 440 1
+340 564 1
+340 627 1
+340 628 1
+340 656 1
+340 663 1
+340 885 1
+340 918 1
+340 932 1
+340 937 1
+340 945 1
+340 963 1
+340 972 1
+340 985 1
+340 1007 1
+340 1020 1
+340 1413 1
+340 1428 1
+340 1464 1
+341 28 1
+341 135 1
+341 151 1
+341 171 1
+341 259 1
+341 299 1
+341 324 1
+341 348 1
+341 362 1
+341 370 1
+341 396 1
+341 407 1
+341 431 1
+341 659 1
+341 663 1
+341 686 1
+341 710 1
+341 761 1
+341 791 1
+341 829 1
+341 906 1
+341 922 1
+341 937 1
+341 959 1
+341 978 1
+341 985 1
+341 989 1
+341 1007 1
+341 1080 1
+341 1123 1
+341 1140 1
+341 1152 1
+341 1160 1
+341 1186 1
+341 1201 1
+341 1222 1
+341 1266 1
+341 1297 1
+341 1385 1
+341 1771 1
+341 2163 1
+341 2205 1
+341 2242 1
+341 2625 1
+341 2670 1
+341 3755 1
+341 8290 1
+342 55 1
+342 135 1
+343 135 1
+343 282 1
+343 656 1
+343 1261 1
+344 75 1
+344 135 1
+344 348 1
+348 86 1
+348 271 1
+348 325 1
+348 439 1
+348 665 1
+348 686 1
+348 697 1
+348 704 1
+348 769 1
+348 817 1
+348 878 1
+348 941 1
+348 981 1
+348 1022 1
+348 1128 1
+348 1156 1
+348 1418 1
+348 1419 1
+348 2264 1
+348 2501 1
+348 2612 1
+345 39 1
+345 56 1
+345 228 1
+345 282 1
+345 348 1
+345 371 1
+345 567 1
+345 581 1
+345 600 1
+346 214 1
+346 290 1
+346 348 1
+346 403 1
+346 417 1
+346 659 1
+346 682 1
+346 762 1
+346 765 1
+346 853 1
+346 936 1
+346 938 1
+346 942 1
+346 945 1
+346 974 1
+346 1157 1
+346 1166 1
+346 1297 1
+346 1453 1
+346 1564 1
+346 1744 1
+346 1777 1
+346 1915 1
+346 2144 1
+346 2251 1
+346 2252 1
+346 2323 1
+346 2325 1
+346 2326 1
+346 2375 1
+346 2411 1
+346 2416 1
+346 2685 1
+346 2720 1
+346 2721 1
+346 2724 1
+346 2747 1
+346 2805 1
+346 2828 1
+346 2838 1
+346 2859 1
+346 2900 1
+346 2912 1
+346 2918 1
+346 2922 1
+346 2923 1
+346 2926 1
+346 2999 1
+346 3009 1
+346 3034 1
+346 3089 1
+346 3099 1
+346 3104 1
+346 3117 1
+346 3173 1
+346 3180 1
+346 3192 1
+346 3243 1
+346 3309 1
+346 3446 1
+346 3483 1
+346 3520 1
+346 3537 1
+346 3541 1
+346 3557 1
+346 3562 1
+346 3580 1
+346 3646 1
+346 3812 1
+346 3871 1
+346 3887 1
+346 3926 1
+346 3971 1
+346 4266 1
+346 4335 1
+346 4424 1
+346 4661 1
+346 4666 1
+346 4735 1
+346 4811 1
+346 4814 1
+346 4820 1
+346 4822 1
+346 4875 1
+346 6784 1
+346 8293 1
+349 613 1
+356 55 1
+356 214 1
+356 259 1
+356 282 1
+356 299 1
+356 579 1
+356 769 1
+356 993 1
+356 1043 1
+356 1186 1
+356 1375 1
+356 1428 1
+356 1835 1
+356 2210 1
+356 2323 1
+356 2660 1
+356 2770 1
+356 4110 1
+350 356 1
+350 696 1
+351 86 1
+351 325 1
+351 339 1
+351 356 1
+351 439 1
+351 733 1
+351 893 1
+351 2535 1
+351 3946 1
+351 4735 1
+351 5254 1
+355 356 1
+352 75 1
+352 192 1
+352 243 1
+352 325 1
+352 356 1
+352 506 1
+352 756 1
+352 1077 1
+352 8287 1
+353 56 1
+353 152 1
+353 243 1
+353 339 1
+353 356 1
+353 684 1
+357 339 1
+357 358 1
+193 86 1
+193 204 1
+193 228 1
+193 325 1
+193 358 1
+193 402 1
+193 417 1
+193 439 1
+193 465 1
+193 549 1
+193 656 1
+193 733 1
+193 974 1
+193 1186 1
+193 1211 1
+193 1297 1
+193 2066 1
+193 2157 1
+193 3005 1
+193 3034 1
+193 3971 1
+363 362 1
+363 1305 1
+363 2237 1
+362 363 1
+364 75 1
+364 214 1
+364 370 1
+364 658 1
+364 670 1
+364 739 1
+364 1007 1
+364 1267 1
+364 1418 1
+364 2542 1
+364 2777 1
+364 4110 1
+364 6458 1
+364 8287 1
+365 56 1
+365 75 1
+365 152 1
+365 370 1
+365 377 1
+365 391 1
+365 477 1
+365 515 1
+366 28 1
+366 49 1
+366 282 1
+366 299 1
+366 370 1
+366 377 1
+366 379 1
+366 391 1
+366 606 1
+366 645 1
+366 656 1
+366 3976 1
+366 5947 1
+366 8287 1
+369 370 1
+367 75 1
+367 299 1
+367 370 1
+367 2643 1
+367 8287 1
+368 370 1
+371 15 1
+371 29 1
+371 56 1
+371 72 1
+371 86 1
+371 204 1
+371 228 1
+371 255 1
+371 271 1
+371 282 1
+371 299 1
+371 304 1
+371 310 1
+371 313 1
+371 317 1
+371 373 1
+371 432 1
+371 439 1
+371 447 1
+371 567 1
+371 590 1
+371 600 1
+371 627 1
+371 643 1
+371 658 1
+371 659 1
+371 664 1
+371 677 1
+371 686 1
+371 704 1
+371 717 1
+371 730 1
+371 733 1
+371 737 1
+371 739 1
+371 746 1
+371 756 1
+371 762 1
+371 789 1
+371 823 1
+371 844 1
+371 849 1
+371 857 1
+371 868 1
+371 878 1
+371 881 1
+371 882 1
+371 885 1
+371 895 1
+371 897 1
+371 936 1
+371 945 1
+371 958 1
+371 960 1
+371 977 1
+371 991 1
+371 1023 1
+371 1026 1
+371 1031 1
+371 1032 1
+371 1044 1
+371 1053 1
+371 1157 1
+371 1186 1
+371 1196 1
+371 1201 1
+371 1211 1
+371 1222 1
+371 1260 1
+371 1261 1
+371 1297 1
+371 1310 1
+371 1322 1
+371 1396 1
+371 1428 1
+371 1446 1
+371 1468 1
+371 1485 1
+371 1487 1
+371 1573 1
+371 1633 1
+371 1706 1
+371 1726 1
+371 1956 1
+371 1966 1
+371 2145 1
+371 2165 1
+371 2339 1
+371 2398 1
+371 2501 1
+371 2625 1
+371 2643 1
+371 2693 1
+371 2801 1
+371 3352 1
+371 3456 1
+371 3645 1
+371 3755 1
+371 3796 1
+371 3967 1
+371 3976 1
+371 4110 1
+371 4335 1
+371 4338 1
+371 4424 1
+371 4661 1
+371 4735 1
+371 5288 1
+371 5412 1
+371 5459 1
+371 5775 1
+371 6388 1
+371 7277 1
+371 7422 1
+371 7478 1
+371 7795 1
+371 7809 1
+372 373 1
+372 391 1
+372 515 1
+372 8287 1
+374 377 1
+374 419 1
+374 1652 1
+375 377 1
+376 35 1
+376 36 1
+376 86 1
+376 299 1
+376 310 1
+376 311 1
+376 325 1
+376 350 1
+376 377 1
+376 394 1
+376 406 1
+376 636 1
+376 643 1
+376 697 1
+376 706 1
+376 789 1
+376 817 1
+376 977 1
+376 985 1
+376 999 1
+376 1023 1
+376 1026 1
+376 1043 1
+376 1127 1
+376 1167 1
+376 1193 1
+376 1234 1
+376 1330 1
+376 1402 1
+376 1482 1
+376 1518 1
+376 1633 1
+376 1802 1
+376 1992 1
+376 2253 1
+376 2325 1
+376 3150 1
+386 8 1
+386 243 1
+386 310 1
+381 243 1
+381 622 1
+382 243 1
+387 150 1
+387 214 1
+387 243 1
+387 259 1
+387 600 1
+387 756 1
+387 817 1
+387 829 1
+387 1053 1
+387 1123 1
+387 1201 1
+101 28 1
+101 56 1
+101 75 1
+101 108 1
+101 152 1
+101 192 1
+101 243 1
+101 299 1
+101 405 1
+101 477 1
+101 517 1
+101 756 1
+101 761 1
+101 1077 1
+101 1478 1
+101 8287 1
+383 15 1
+383 56 1
+383 140 1
+383 150 1
+383 175 1
+383 182 1
+383 224 1
+383 243 1
+383 246 1
+383 255 1
+383 282 1
+383 428 1
+383 560 1
+383 601 1
+383 611 1
+383 622 1
+383 631 1
+383 659 1
+383 739 1
+383 746 1
+383 756 1
+383 762 1
+383 1166 1
+383 1646 1
+383 2206 1
+383 2297 1
+383 2324 1
+383 2398 1
+383 2411 1
+383 2508 1
+383 2535 1
+383 2674 1
+383 2770 1
+383 3026 1
+383 3089 1
+383 3352 1
+383 3480 1
+383 3529 1
+383 3537 1
+383 3615 1
+383 3680 1
+383 4110 1
+383 4977 1
+383 5254 1
+383 6296 1
+384 243 1
+391 3776 1
+393 394 1
+395 35 1
+395 282 1
+395 321 1
+395 396 1
+395 967 1
+395 1357 1
+395 1384 1
+395 1389 1
+395 1418 1
+395 1506 1
+395 1593 1
+395 1919 1
+395 1956 1
+395 2398 1
+395 2851 1
+395 2963 1
+395 3634 1
+395 4037 1
+395 4175 1
+395 4179 1
+395 4341 1
+395 4709 1
+395 5028 1
+395 5199 1
+395 5479 1
+395 5524 1
+395 5563 1
+395 5596 1
+395 5818 1
+395 5872 1
+395 6227 1
+395 6869 1
+395 6904 1
+395 6934 1
+395 6976 1
+395 7115 1
+395 7414 1
+395 7512 1
+395 7553 1
+395 7795 1
+395 7890 1
+395 8163 1
+397 402 1
+398 402 1
+398 3792 1
+398 5295 1
+398 5543 1
+398 5739 1
+398 6001 1
+398 6890 1
+399 271 1
+399 402 1
+399 560 1
+399 579 1
+399 715 1
+399 1513 1
+400 192 1
+400 243 1
+400 271 1
+400 299 1
+400 321 1
+400 402 1
+400 606 1
+400 686 1
+400 769 1
+400 1044 1
+400 1723 1
+400 8284 1
+401 402 1
+403 75 1
+403 402 1
+403 425 1
+403 739 1
+403 974 1
+403 1166 1
+403 1211 1
+403 1521 1
+403 1705 1
+403 1744 1
+403 1746 1
+403 2053 1
+403 2144 1
+403 2264 1
+403 2416 1
+403 2599 1
+403 2814 1
+403 2834 1
+403 2922 1
+403 2966 1
+404 402 1
+404 403 1
+404 1521 1
+404 1744 1
+404 1746 1
+405 56 1
+405 246 1
+405 271 1
+405 290 1
+405 402 1
+405 637 1
+405 658 1
+405 677 1
+405 697 1
+405 1030 1
+405 1053 1
+405 1277 1
+405 2134 1
+405 2790 1
+405 2859 1
+405 2973 1
+405 3459 1
+405 3680 1
+405 5412 1
+406 178 1
+406 236 1
+406 255 1
+406 282 1
+406 306 1
+406 310 1
+406 319 1
+406 325 1
+406 402 1
+406 440 1
+406 538 1
+406 560 1
+406 636 1
+406 667 1
+406 668 1
+406 670 1
+406 675 1
+406 677 1
+406 681 1
+406 684 1
+406 687 1
+406 756 1
+406 1648 1
+406 1661 1
+406 2369 1
+406 2511 1
+406 2657 1
+406 3631 1
+406 5822 1
+406 6555 1
+406 6624 1
+406 6774 1
+406 6979 1
+406 7094 1
+407 15 1
+407 72 1
+407 204 1
+407 214 1
+407 230 1
+407 285 1
+407 298 1
+407 308 1
+407 372 1
+407 402 1
+407 406 1
+407 415 1
+407 429 1
+407 506 1
+407 579 1
+407 673 1
+407 696 1
+407 697 1
+407 722 1
+407 762 1
+407 763 1
+407 838 1
+407 844 1
+407 887 1
+407 937 1
+407 946 1
+407 958 1
+407 989 1
+407 993 1
+407 1000 1
+407 1014 1
+407 1026 1
+407 1049 1
+407 1111 1
+407 1141 1
+407 1164 1
+407 1199 1
+407 1201 1
+407 1230 1
+407 1236 1
+407 1248 1
+407 1284 1
+407 1285 1
+407 1297 1
+407 1322 1
+407 1407 1
+407 1413 1
+407 1425 1
+407 1471 1
+407 1482 1
+407 1489 1
+407 1492 1
+407 1496 1
+407 1497 1
+407 1525 1
+407 1534 1
+407 1566 1
+407 1573 1
+407 1585 1
+407 1622 1
+407 1629 1
+407 1633 1
+407 1641 1
+407 1648 1
+407 1652 1
+407 1654 1
+407 1658 1
+407 1661 1
+407 1662 1
+407 1718 1
+407 1723 1
+407 1752 1
+407 1758 1
+407 1787 1
+407 1816 1
+407 1835 1
+407 1858 1
+407 1859 1
+407 1884 1
+407 1893 1
+407 1903 1
+407 1908 1
+407 1918 1
+407 1927 1
+407 1953 1
+407 1955 1
+407 1956 1
+407 1963 1
+407 1966 1
+407 1969 1
+407 1973 1
+407 1979 1
+407 1987 1
+407 1991 1
+407 1997 1
+407 2066 1
+407 2073 1
+407 2097 1
+407 2106 1
+407 2120 1
+407 2128 1
+407 2137 1
+407 2151 1
+407 2168 1
+407 2211 1
+407 2264 1
+407 2323 1
+407 2354 1
+407 2398 1
+407 2400 1
+407 2433 1
+407 2517 1
+407 2535 1
+407 2587 1
+407 2594 1
+407 2617 1
+407 2625 1
+407 2693 1
+407 2774 1
+407 2775 1
+407 2811 1
+407 2977 1
+407 3014 1
+407 3020 1
+407 3130 1
+407 3334 1
+407 3580 1
+407 3645 1
+407 3835 1
+407 4037 1
+407 4335 1
+407 4735 1
+407 4846 1
+407 4980 1
+407 5412 1
+407 5484 1
+407 5524 1
+407 5559 1
+407 5568 1
+407 5817 1
+407 6246 1
+407 6770 1
+407 7306 1
+407 8290 1
+407 8293 1
+408 402 1
+409 402 1
+409 875 1
+410 140 1
+410 402 1
+410 407 1
+410 428 1
+410 431 1
+410 433 1
+411 402 1
+413 402 1
+415 35 1
+415 405 1
+415 549 1
+415 1330 1
+414 39 1
+414 415 1
+414 656 1
+325 232 1
+325 282 1
+325 415 1
+325 428 1
+325 560 1
+325 590 1
+325 601 1
+325 606 1
+325 607 1
+325 739 1
+325 1031 1
+325 1211 1
+325 1360 1
+325 1549 1
+325 1688 1
+325 2066 1
+325 2134 1
+325 2348 1
+325 2790 1
+325 2909 1
+325 3352 1
+325 3967 1
+325 4037 1
+325 4233 1
+325 4808 1
+416 226 1
+416 560 1
+417 226 1
+417 422 1
+417 431 1
+417 433 1
+417 435 1
+417 974 1
+417 1297 1
+417 2066 1
+417 3005 1
+418 140 1
+427 259 1
+427 820 1
+427 1384 1
+427 1593 1
+427 4175 1
+427 4179 1
+423 56 1
+423 214 1
+423 427 1
+423 1384 1
+423 1593 1
+423 1747 1
+423 1956 1
+424 310 1
+424 427 1
+424 428 1
+424 838 1
+424 857 1
+424 893 1
+425 204 1
+425 280 1
+425 285 1
+425 407 1
+425 427 1
+425 663 1
+425 1165 1
+425 1493 1
+425 1549 1
+425 1730 1
+425 1777 1
+425 1857 1
+425 1893 1
+425 1982 1
+425 2160 1
+425 2231 1
+425 2433 1
+425 2560 1
+425 2565 1
+425 2576 1
+425 2643 1
+425 2700 1
+425 2708 1
+425 2877 1
+425 2880 1
+425 2951 1
+425 2963 1
+425 3020 1
+425 3030 1
+425 3089 1
+425 3351 1
+425 3580 1
+425 4065 1
+425 4373 1
+425 4530 1
+425 4875 1
+425 5079 1
+425 5233 1
+425 5321 1
+425 5384 1
+425 5404 1
+425 5487 1
+425 5798 1
+425 5800 1
+425 5811 1
+425 5835 1
+425 6241 1
+425 6255 1
+425 6323 1
+425 6337 1
+425 6424 1
+425 6447 1
+425 6599 1
+425 6613 1
+425 6725 1
+425 6770 1
+425 6803 1
+425 6805 1
+425 6809 1
+425 6813 1
+425 6832 1
+425 6833 1
+425 6855 1
+425 6979 1
+425 6982 1
+425 7047 1
+425 7054 1
+425 7108 1
+425 7131 1
+425 7351 1
+425 7422 1
+425 7442 1
+425 7553 1
+425 7587 1
+425 7632 1
+425 7707 1
+425 8291 1
+425 8293 1
+425 8295 1
+426 28 1
+426 32 1
+426 39 1
+426 49 1
+426 56 1
+426 75 1
+426 105 1
+426 151 1
+426 152 1
+426 178 1
+426 182 1
+426 192 1
+426 232 1
+426 236 1
+426 282 1
+426 299 1
+426 322 1
+426 341 1
+426 368 1
+426 427 1
+426 428 1
+426 431 1
+426 433 1
+426 435 1
+426 440 1
+426 477 1
+426 506 1
+426 514 1
+426 515 1
+426 517 1
+426 524 1
+426 538 1
+426 560 1
+426 566 1
+426 567 1
+426 586 1
+426 589 1
+426 592 1
+426 8282 1
+426 8284 1
+426 8287 1
+429 428 1
+429 435 1
+429 837 1
+429 839 1
+429 1049 1
+430 49 1
+430 108 1
+430 151 1
+430 431 1
+430 991 1
+432 36 1
+432 178 1
+432 308 1
+432 310 1
+432 317 1
+432 321 1
+432 332 1
+432 403 1
+432 407 1
+432 429 1
+432 433 1
+432 559 1
+432 618 1
+432 637 1
+432 664 1
+432 665 1
+432 675 1
+432 691 1
+432 697 1
+432 700 1
+432 715 1
+432 719 1
+432 722 1
+432 723 1
+432 743 1
+432 749 1
+432 765 1
+432 769 1
+432 798 1
+432 802 1
+432 813 1
+432 817 1
+432 837 1
+432 839 1
+432 844 1
+432 849 1
+432 861 1
+432 864 1
+432 868 1
+432 895 1
+432 960 1
+432 978 1
+432 993 1
+432 999 1
+432 1031 1
+432 1039 1
+432 1044 1
+432 1049 1
+432 1055 1
+432 1103 1
+432 1186 1
+432 1201 1
+432 1250 1
+432 1285 1
+432 1296 1
+432 1305 1
+432 1378 1
+432 1402 1
+432 1407 1
+432 1446 1
+432 1464 1
+432 1524 1
+432 1531 1
+432 1542 1
+432 1608 1
+432 1621 1
+432 1622 1
+432 1628 1
+432 1648 1
+432 1661 1
+432 1669 1
+432 1706 1
+432 1717 1
+432 1723 1
+432 1746 1
+432 1769 1
+432 1802 1
+432 1808 1
+432 1811 1
+432 1842 1
+432 1858 1
+432 1888 1
+432 1893 1
+432 1927 1
+432 1963 1
+432 1964 1
+432 2066 1
+432 2079 1
+432 2091 1
+432 2117 1
+432 2193 1
+432 2237 1
+432 2251 1
+432 2257 1
+432 2264 1
+432 2329 1
+432 2333 1
+432 2375 1
+432 2485 1
+432 2592 1
+432 2604 1
+432 2643 1
+432 2669 1
+432 2696 1
+432 2819 1
+432 2851 1
+432 2871 1
+432 2932 1
+432 2958 1
+432 2963 1
+432 3002 1
+432 3024 1
+432 3026 1
+432 3027 1
+432 3033 1
+432 3059 1
+432 3148 1
+432 3310 1
+432 3352 1
+432 3408 1
+432 3417 1
+432 3447 1
+432 3480 1
+432 3635 1
+432 3680 1
+432 3796 1
+432 3803 1
+432 4037 1
+432 4055 1
+432 4124 1
+432 4261 1
+432 4400 1
+432 4551 1
+432 4578 1
+432 4587 1
+432 4600 1
+432 4653 1
+432 4666 1
+432 4687 1
+432 4706 1
+432 4827 1
+432 5073 1
+432 5130 1
+432 5222 1
+432 5430 1
+432 5459 1
+432 5466 1
+432 5651 1
+432 5693 1
+432 6227 1
+432 6780 1
+432 6832 1
+432 6875 1
+432 7443 1
+432 7813 1
+432 7862 1
+432 7961 1
+434 435 1
+434 4361 1
+434 5897 1
+434 6832 1
+434 7351 1
+434 7381 1
+436 232 1
+437 232 1
+438 178 1
+412 151 1
+412 178 1
+412 290 1
+412 403 1
+412 560 1
+412 681 1
+412 715 1
+412 838 1
+412 844 1
+412 859 1
+412 868 1
+412 937 1
+412 1151 1
+412 1919 1
+412 2066 1
+412 2120 1
+412 2397 1
+412 2625 1
+412 3130 1
+412 3813 1
+412 5055 1
+439 86 1
+439 178 1
+439 271 1
+439 644 1
+439 733 1
+439 895 1
+439 1192 1
+439 2157 1
+440 28 1
+440 49 1
+440 178 1
+440 236 1
+440 282 1
+440 538 1
+440 560 1
+440 8284 1
+441 178 1
+443 28 1
+447 28 1
+447 75 1
+447 350 1
+447 417 1
+447 514 1
+447 1049 1
+447 1384 1
+447 1997 1
+447 2685 1
+447 3321 1
+447 3352 1
+447 4037 1
+447 4735 1
+447 5384 1
+447 7992 1
+444 28 1
+444 55 1
+451 28 1
+448 28 1
+449 28 1
+449 2209 1
+449 3007 1
+449 3010 1
+449 3548 1
+449 4400 1
+449 4402 1
+449 4735 1
+449 6221 1
+446 28 1
+450 28 1
+211 28 1
+211 517 1
+453 192 1
+454 8 1
+454 28 1
+454 49 1
+454 75 1
+454 192 1
+454 506 1
+454 517 1
+454 524 1
+454 8287 1
+455 28 1
+455 192 1
+455 322 1
+455 1092 1
+456 192 1
+456 817 1
+456 3755 1
+456 4687 1
+456 4981 1
+457 15 1
+457 35 1
+457 56 1
+457 64 1
+457 72 1
+457 155 1
+457 192 1
+457 227 1
+457 271 1
+457 290 1
+457 298 1
+457 299 1
+457 311 1
+457 506 1
+457 545 1
+457 559 1
+457 575 1
+457 587 1
+457 608 1
+457 633 1
+457 643 1
+457 663 1
+457 696 1
+457 697 1
+457 707 1
+457 722 1
+457 737 1
+457 741 1
+457 762 1
+457 763 1
+457 764 1
+457 789 1
+457 810 1
+457 826 1
+457 836 1
+457 856 1
+457 857 1
+457 861 1
+457 871 1
+457 873 1
+457 904 1
+457 908 1
+457 922 1
+457 935 1
+457 941 1
+457 946 1
+457 959 1
+457 960 1
+457 963 1
+457 971 1
+457 975 1
+457 993 1
+457 1000 1
+457 1012 1
+457 1018 1
+457 1022 1
+457 1026 1
+457 1055 1
+457 1061 1
+457 1062 1
+457 1080 1
+457 1103 1
+457 1111 1
+457 1151 1
+457 1157 1
+457 1159 1
+457 1167 1
+457 1193 1
+457 1199 1
+457 1200 1
+457 1201 1
+457 1211 1
+457 1222 1
+457 1230 1
+457 1234 1
+457 1241 1
+457 1247 1
+457 1260 1
+457 1282 1
+457 1284 1
+457 1285 1
+457 1286 1
+457 1297 1
+457 1310 1
+457 1319 1
+457 1322 1
+457 1352 1
+457 1353 1
+457 1357 1
+457 1374 1
+457 1377 1
+457 1378 1
+457 1385 1
+457 1390 1
+457 1394 1
+457 1396 1
+457 1413 1
+457 1416 1
+457 1418 1
+457 1420 1
+457 1482 1
+457 1484 1
+457 1487 1
+457 1490 1
+457 1492 1
+457 1493 1
+457 1496 1
+457 1497 1
+457 1507 1
+457 1514 1
+457 1520 1
+457 1524 1
+457 1531 1
+457 1533 1
+457 1534 1
+457 1537 1
+457 1538 1
+457 1547 1
+457 1549 1
+457 1555 1
+457 1556 1
+457 1563 1
+457 1566 1
+457 1569 1
+457 1573 1
+457 1580 1
+457 1585 1
+457 1593 1
+457 1596 1
+457 1600 1
+457 1604 1
+457 1622 1
+457 1628 1
+457 1633 1
+457 1638 1
+457 1648 1
+457 1654 1
+457 1658 1
+457 1679 1
+457 1680 1
+457 1705 1
+457 1717 1
+457 1726 1
+457 1729 1
+457 1733 1
+457 1734 1
+457 1752 1
+457 1754 1
+457 1757 1
+457 1758 1
+457 1768 1
+457 1772 1
+457 1774 1
+457 1783 1
+457 1788 1
+457 1791 1
+457 1798 1
+457 1799 1
+457 1802 1
+457 1805 1
+457 1811 1
+457 1814 1
+457 1816 1
+457 1835 1
+457 1836 1
+457 1842 1
+457 1848 1
+457 1849 1
+457 1855 1
+457 1859 1
+457 1880 1
+457 1884 1
+457 1888 1
+457 1893 1
+457 1908 1
+457 1915 1
+457 1918 1
+457 1953 1
+457 1966 1
+457 1969 1
+457 1972 1
+457 1973 1
+457 1979 1
+457 1982 1
+457 1987 1
+457 1990 1
+457 1991 1
+457 2001 1
+457 2004 1
+457 2071 1
+457 2091 1
+457 2106 1
+457 2117 1
+457 2120 1
+457 2128 1
+457 2137 1
+457 2144 1
+457 2145 1
+457 2151 1
+457 2157 1
+457 2160 1
+457 2165 1
+457 2209 1
+457 2225 1
+457 2237 1
+457 2240 1
+457 2241 1
+457 2246 1
+457 2252 1
+457 2253 1
+457 2273 1
+457 2277 1
+457 2289 1
+457 2324 1
+457 2328 1
+457 2350 1
+457 2354 1
+457 2356 1
+457 2364 1
+457 2366 1
+457 2397 1
+457 2398 1
+457 2411 1
+457 2416 1
+457 2433 1
+457 2435 1
+457 2440 1
+457 2456 1
+457 2490 1
+457 2504 1
+457 2511 1
+457 2516 1
+457 2517 1
+457 2535 1
+457 2565 1
+457 2576 1
+457 2579 1
+457 2580 1
+457 2605 1
+457 2612 1
+457 2620 1
+457 2625 1
+457 2651 1
+457 2653 1
+457 2654 1
+457 2687 1
+457 2689 1
+457 2693 1
+457 2696 1
+457 2708 1
+457 2727 1
+457 2746 1
+457 2763 1
+457 2764 1
+457 2765 1
+457 2768 1
+457 2774 1
+457 2775 1
+457 2785 1
+457 2811 1
+457 2818 1
+457 2822 1
+457 2831 1
+457 2843 1
+457 2851 1
+457 2859 1
+457 2871 1
+457 2877 1
+457 2900 1
+457 2923 1
+457 2932 1
+457 2958 1
+457 2973 1
+457 2996 1
+457 2999 1
+457 3010 1
+457 3014 1
+457 3020 1
+457 3026 1
+457 3034 1
+457 3059 1
+457 3084 1
+457 3089 1
+457 3106 1
+457 3117 1
+457 3125 1
+457 3136 1
+457 3140 1
+457 3144 1
+457 3192 1
+457 3200 1
+457 3253 1
+457 3274 1
+457 3276 1
+457 3291 1
+457 3321 1
+457 3324 1
+457 3334 1
+457 3352 1
+457 3371 1
+457 3376 1
+457 3394 1
+457 3404 1
+457 3408 1
+457 3409 1
+457 3439 1
+457 3443 1
+457 3447 1
+457 3454 1
+457 3456 1
+457 3459 1
+457 3460 1
+457 3463 1
+457 3464 1
+457 3479 1
+457 3483 1
+457 3498 1
+457 3529 1
+457 3537 1
+457 3557 1
+457 3562 1
+457 3568 1
+457 3586 1
+457 3614 1
+457 3615 1
+457 3634 1
+457 3643 1
+457 3646 1
+457 3660 1
+457 3661 1
+457 3680 1
+457 3691 1
+457 3724 1
+457 3726 1
+457 3755 1
+457 3769 1
+457 3796 1
+457 3803 1
+457 3807 1
+457 3812 1
+457 3830 1
+457 3843 1
+457 3847 1
+457 3849 1
+457 3854 1
+457 3871 1
+457 3887 1
+457 3897 1
+457 3910 1
+457 3911 1
+457 3919 1
+457 3922 1
+457 3956 1
+457 3958 1
+457 3962 1
+457 3976 1
+457 4011 1
+457 4013 1
+457 4037 1
+457 4040 1
+457 4041 1
+457 4044 1
+457 4065 1
+457 4098 1
+457 4099 1
+457 4124 1
+457 4173 1
+457 4191 1
+457 4231 1
+457 4233 1
+457 4247 1
+457 4256 1
+457 4263 1
+457 4269 1
+457 4297 1
+457 4315 1
+457 4335 1
+457 4361 1
+457 4400 1
+457 4401 1
+457 4412 1
+457 4441 1
+457 4448 1
+457 4482 1
+457 4483 1
+457 4488 1
+457 4507 1
+457 4510 1
+457 4527 1
+457 4530 1
+457 4534 1
+457 4536 1
+457 4547 1
+457 4574 1
+457 4587 1
+457 4600 1
+457 4613 1
+457 4621 1
+457 4653 1
+457 4666 1
+457 4687 1
+457 4689 1
+457 4709 1
+457 4712 1
+457 4713 1
+457 4715 1
+457 4717 1
+457 4735 1
+457 4748 1
+457 4764 1
+457 4781 1
+457 4791 1
+457 4792 1
+457 4795 1
+457 4797 1
+457 4798 1
+457 4811 1
+457 4814 1
+457 4820 1
+457 4824 1
+457 4827 1
+457 4828 1
+457 4831 1
+457 4846 1
+457 4875 1
+457 4879 1
+457 4899 1
+457 4929 1
+457 4940 1
+457 4944 1
+457 4953 1
+457 4964 1
+457 4980 1
+457 4986 1
+457 4994 1
+457 4999 1
+457 5002 1
+457 5012 1
+457 5020 1
+457 5022 1
+457 5037 1
+457 5045 1
+457 5055 1
+457 5058 1
+457 5061 1
+457 5072 1
+457 5092 1
+457 5100 1
+457 5121 1
+457 5130 1
+457 5140 1
+457 5148 1
+457 5178 1
+457 5179 1
+457 5188 1
+457 5189 1
+457 5199 1
+457 5200 1
+457 5204 1
+457 5210 1
+457 5222 1
+457 5226 1
+457 5233 1
+457 5239 1
+457 5245 1
+457 5246 1
+457 5254 1
+457 5262 1
+457 5273 1
+457 5285 1
+457 5288 1
+457 5289 1
+457 5295 1
+457 5305 1
+457 5321 1
+457 5335 1
+457 5378 1
+457 5404 1
+457 5412 1
+457 5437 1
+457 5439 1
+457 5449 1
+457 5452 1
+457 5454 1
+457 5459 1
+457 5463 1
+457 5479 1
+457 5482 1
+457 5484 1
+457 5506 1
+457 5513 1
+457 5524 1
+457 5529 1
+457 5543 1
+457 5545 1
+457 5559 1
+457 5563 1
+457 5584 1
+457 5596 1
+457 5614 1
+457 5623 1
+457 5626 1
+457 5630 1
+457 5631 1
+457 5637 1
+457 5638 1
+457 5639 1
+457 5640 1
+457 5651 1
+457 5663 1
+457 5680 1
+457 5683 1
+457 5684 1
+457 5693 1
+457 5697 1
+457 5705 1
+457 5714 1
+457 5721 1
+457 5732 1
+457 5737 1
+457 5738 1
+457 5739 1
+457 5743 1
+457 5753 1
+457 5757 1
+457 5760 1
+457 5775 1
+457 5776 1
+457 5780 1
+457 5792 1
+457 5798 1
+457 5799 1
+457 5800 1
+457 5801 1
+457 5802 1
+457 5804 1
+457 5806 1
+457 5809 1
+457 5811 1
+457 5812 1
+457 5814 1
+457 5817 1
+457 5818 1
+457 5822 1
+457 5827 1
+457 5829 1
+457 5830 1
+457 5832 1
+457 5844 1
+457 5850 1
+457 5860 1
+457 5871 1
+457 5872 1
+457 5886 1
+457 5891 1
+457 5897 1
+457 5902 1
+457 5928 1
+457 5931 1
+457 5932 1
+457 5933 1
+457 5950 1
+457 5969 1
+457 5973 1
+457 5980 1
+457 5991 1
+457 5994 1
+457 5998 1
+457 6001 1
+457 6004 1
+457 6006 1
+457 6009 1
+457 6010 1
+457 6021 1
+457 6032 1
+457 6044 1
+457 6094 1
+457 6097 1
+457 6106 1
+457 6124 1
+457 6149 1
+457 6156 1
+457 6161 1
+457 6166 1
+457 6170 1
+457 6218 1
+457 6221 1
+457 6227 1
+457 6229 1
+457 6243 1
+457 6261 1
+457 6270 1
+457 6272 1
+457 6296 1
+457 6299 1
+457 6302 1
+457 6305 1
+457 6306 1
+457 6323 1
+457 6327 1
+457 6328 1
+457 6334 1
+457 6337 1
+457 6347 1
+457 6376 1
+457 6388 1
+457 6400 1
+457 6407 1
+457 6409 1
+457 6417 1
+457 6422 1
+457 6432 1
+457 6437 1
+457 6441 1
+457 6442 1
+457 6447 1
+457 6458 1
+457 6464 1
+457 6472 1
+457 6474 1
+457 6481 1
+457 6491 1
+457 6496 1
+457 6498 1
+457 6503 1
+457 6505 1
+457 6528 1
+457 6529 1
+457 6552 1
+457 6554 1
+457 6560 1
+457 6571 1
+457 6576 1
+457 6589 1
+457 6594 1
+457 6595 1
+457 6600 1
+457 6606 1
+457 6613 1
+457 6632 1
+457 6634 1
+457 6663 1
+457 6665 1
+457 6668 1
+457 6682 1
+457 6685 1
+457 6686 1
+457 6699 1
+457 6715 1
+457 6720 1
+457 6725 1
+457 6739 1
+457 6770 1
+457 6774 1
+457 6780 1
+457 6783 1
+457 6784 1
+457 6788 1
+457 6803 1
+457 6832 1
+457 6840 1
+457 6860 1
+457 6869 1
+457 6873 1
+457 6875 1
+457 6890 1
+457 6897 1
+457 6901 1
+457 6907 1
+457 6913 1
+457 6930 1
+457 7021 1
+457 7034 1
+457 7050 1
+457 7073 1
+457 7074 1
+457 7092 1
+457 7094 1
+457 7237 1
+457 7238 1
+457 7279 1
+457 7280 1
+457 7341 1
+457 7351 1
+457 7381 1
+457 7389 1
+457 7400 1
+457 7414 1
+457 7450 1
+457 7478 1
+457 7491 1
+457 7529 1
+457 7544 1
+457 7553 1
+457 7561 1
+457 7587 1
+457 7624 1
+457 7649 1
+457 7662 1
+457 7757 1
+457 7791 1
+457 7810 1
+457 7833 1
+457 7835 1
+457 7860 1
+457 7910 1
+457 7924 1
+457 7946 1
+457 7957 1
+457 7961 1
+457 7965 1
+457 7979 1
+457 8037 1
+457 8044 1
+457 8050 1
+457 8051 1
+457 8121 1
+457 8134 1
+457 8141 1
+457 8174 1
+457 8198 1
+457 8209 1
+457 8212 1
+457 8219 1
+457 8224 1
+457 8226 1
+457 8249 1
+457 8290 1
+457 8291 1
+457 8292 1
+457 8293 1
+457 8295 1
+458 105 1
+458 192 1
+458 271 1
+458 1053 1
+460 28 1
+460 75 1
+460 514 1
+461 28 1
+461 75 1
+461 477 1
+461 515 1
+462 28 1
+462 75 1
+462 105 1
+462 8287 1
+463 28 1
+463 32 1
+463 105 1
+463 368 1
+463 517 1
+463 8287 1
+465 514 1
+465 1307 1
+465 1453 1
+465 2508 1
+465 3180 1
+465 3562 1
+465 3717 1
+465 3812 1
+465 3843 1
+465 3937 1
+465 3939 1
+465 3942 1
+465 3967 1
+465 5449 1
+465 8283 1
+465 8284 1
+465 8294 1
+467 32 1
+467 214 1
+467 259 1
+467 368 1
+467 517 1
+467 849 1
+467 893 1
+467 1151 1
+467 1186 1
+467 2625 1
+467 4247 1
+467 6156 1
+468 32 1
+164 35 1
+164 108 1
+164 151 1
+164 590 1
+164 628 1
+164 677 1
+164 1097 1
+164 1234 1
+472 8284 1
+476 477 1
+479 86 1
+479 243 1
+479 477 1
+479 545 1
+479 549 1
+479 686 1
+479 978 1
+479 1026 1
+480 477 1
+481 477 1
+486 8286 1
+473 105 1
+488 86 1
+488 105 1
+488 271 1
+488 549 1
+489 75 1
+489 105 1
+489 514 1
+489 524 1
+489 8287 1
+490 105 1
+492 299 1
+493 299 1
+493 739 1
+493 1718 1
+494 75 1
+494 299 1
+494 8287 1
+497 8 1
+497 152 1
+498 8 1
+498 75 1
+499 8 1
+499 86 1
+499 560 1
+499 626 1
+499 739 1
+499 789 1
+499 802 1
+499 829 1
+499 893 1
+499 999 1
+499 1080 1
+499 1186 1
+499 1193 1
+499 1218 1
+501 322 1
+501 325 1
+501 664 1
+501 704 1
+501 749 1
+501 817 1
+501 887 1
+501 2209 1
+501 2805 1
+501 3473 1
+502 86 1
+502 322 1
+502 417 1
+502 8287 1
+504 49 1
+507 506 1
+513 8 1
+513 514 1
+513 636 1
+513 739 1
+511 514 1
+511 3321 1
+511 8293 1
+509 514 1
+516 517 1
+519 524 1
+520 524 1
+525 524 1
+521 407 1
+521 524 1
+521 1018 1
+521 2257 1
+521 3352 1
+522 524 1
+523 524 1
+445 271 1
+445 524 1
+445 3309 1
+445 4547 1
+527 8287 1
+528 8287 1
+531 8287 1
+530 86 1
+530 243 1
+530 313 1
+530 549 1
+530 733 1
+530 958 1
+530 8287 1
+529 8287 1
+534 55 1
+534 2210 1
+534 2535 1
+534 3800 1
+536 39 1
+536 75 1
+536 368 1
+536 1211 1
+536 3755 1
+539 75 1
+539 3010 1
+540 75 1
+541 49 1
+541 55 1
+541 75 1
+542 15 1
+542 75 1
+542 228 1
+542 243 1
+542 372 1
+542 549 1
+542 2774 1
+543 55 1
+544 55 1
+544 6458 1
+545 35 1
+545 55 1
+545 243 1
+545 299 1
+545 334 1
+545 644 1
+545 647 1
+545 710 1
+545 803 1
+545 960 1
+545 978 1
+545 999 1
+545 1026 1
+545 1296 1
+545 1297 1
+545 1330 1
+545 1402 1
+545 1420 1
+545 2135 1
+545 2708 1
+545 3459 1
+545 6560 1
+545 7620 1
+545 7646 1
+546 55 1
+546 214 1
+546 290 1
+546 372 1
+546 415 1
+546 417 1
+546 665 1
+546 761 1
+546 762 1
+546 763 1
+546 764 1
+546 908 1
+546 937 1
+546 946 1
+546 974 1
+546 1026 1
+546 1034 1
+546 1151 1
+546 1164 1
+546 1165 1
+546 1166 1
+546 1211 1
+546 1230 1
+546 1261 1
+546 1284 1
+546 1297 1
+546 1307 1
+546 1357 1
+546 1407 1
+546 1482 1
+546 1547 1
+546 1571 1
+546 1621 1
+546 1658 1
+546 1680 1
+546 1697 1
+546 1717 1
+546 1734 1
+546 1772 1
+546 1808 1
+546 1816 1
+546 1836 1
+546 1837 1
+546 1842 1
+546 1847 1
+546 1849 1
+546 1858 1
+546 1884 1
+546 1893 1
+546 1901 1
+546 1908 1
+546 1927 1
+546 1935 1
+546 1953 1
+546 1955 1
+546 1956 1
+546 1963 1
+546 1966 1
+546 1969 1
+546 1973 1
+546 1979 1
+546 1982 1
+546 1987 1
+546 1990 1
+546 2055 1
+546 2071 1
+546 2072 1
+546 2073 1
+546 2128 1
+546 2144 1
+546 2145 1
+546 2160 1
+546 2209 1
+546 2210 1
+546 2289 1
+546 2297 1
+546 2385 1
+546 2397 1
+546 2411 1
+546 2440 1
+546 2474 1
+546 2542 1
+546 2544 1
+546 2625 1
+546 2643 1
+546 2660 1
+546 2763 1
+546 2805 1
+546 2859 1
+546 2877 1
+546 3005 1
+546 3136 1
+546 3260 1
+546 3334 1
+546 3352 1
+546 3443 1
+546 3452 1
+546 3479 1
+546 3516 1
+546 3562 1
+546 3614 1
+546 3650 1
+546 3811 1
+546 3946 1
+546 4037 1
+546 4099 1
+546 4173 1
+546 4191 1
+546 4199 1
+546 4424 1
+546 4453 1
+546 4463 1
+546 4536 1
+546 4578 1
+546 4712 1
+546 4719 1
+546 4795 1
+546 5254 1
+546 5273 1
+546 5295 1
+546 5298 1
+546 5484 1
+546 5524 1
+546 5584 1
+546 5605 1
+546 5697 1
+546 5800 1
+546 5807 1
+546 5871 1
+546 6407 1
+546 6421 1
+546 6441 1
+546 6523 1
+546 6553 1
+546 6576 1
+546 6590 1
+546 6715 1
+546 6784 1
+546 6840 1
+546 8290 1
+546 8291 1
+546 8292 1
+551 55 1
+218 55 1
+218 1077 1
+547 55 1
+548 55 1
+549 55 1
+549 243 1
+549 714 1
+549 4256 1
+550 55 1
+552 49 1
+552 1026 1
+560 271 1
+560 440 1
+560 559 1
+560 748 1
+560 750 1
+560 760 1
+560 1080 1
+560 1638 1
+553 259 1
+553 560 1
+553 600 1
+553 626 1
+553 769 1
+553 893 1
+553 1186 1
+553 1211 1
+553 1239 1
+553 1315 1
+553 1808 1
+553 1855 1
+553 2117 1
+553 2654 1
+553 2871 1
+553 3136 1
+553 3408 1
+553 4712 1
+553 5254 1
+553 5466 1
+553 6299 1
+553 7910 1
+554 560 1
+554 1103 1
+554 1566 1
+554 1842 1
+554 2654 1
+554 2697 1
+555 560 1
+555 893 1
+555 1855 1
+556 15 1
+556 35 1
+556 86 1
+556 150 1
+556 224 1
+556 227 1
+556 228 1
+556 230 1
+556 255 1
+556 259 1
+556 271 1
+556 282 1
+556 299 1
+556 321 1
+556 372 1
+556 405 1
+556 407 1
+556 417 1
+556 432 1
+556 439 1
+556 560 1
+556 600 1
+556 611 1
+556 617 1
+556 624 1
+556 626 1
+556 627 1
+556 628 1
+556 631 1
+556 643 1
+556 645 1
+556 650 1
+556 656 1
+556 657 1
+556 658 1
+556 659 1
+556 665 1
+556 667 1
+556 668 1
+556 675 1
+556 686 1
+556 697 1
+556 710 1
+556 722 1
+556 730 1
+556 733 1
+556 769 1
+556 803 1
+556 817 1
+556 829 1
+556 849 1
+556 853 1
+556 857 1
+556 863 1
+556 878 1
+556 893 1
+556 895 1
+556 897 1
+556 945 1
+556 993 1
+556 999 1
+556 1035 1
+556 1044 1
+556 1053 1
+556 1075 1
+556 1111 1
+556 1123 1
+556 1144 1
+556 1164 1
+556 1186 1
+556 1190 1
+556 1193 1
+556 1315 1
+556 1330 1
+556 1353 1
+556 1442 1
+556 1473 1
+556 1497 1
+556 1542 1
+556 1717 1
+556 1729 1
+556 1808 1
+556 1836 1
+556 1842 1
+556 1855 1
+556 1858 1
+556 1893 1
+556 1908 1
+556 1919 1
+556 1927 1
+556 1953 1
+556 1956 1
+556 1963 1
+556 1966 1
+556 1969 1
+556 1973 1
+556 1990 1
+556 2004 1
+556 2542 1
+556 2595 1
+556 2612 1
+556 2623 1
+556 2654 1
+556 2657 1
+556 2805 1
+556 3018 1
+556 3136 1
+556 3192 1
+556 3352 1
+556 3371 1
+556 3408 1
+556 3439 1
+556 3458 1
+556 3537 1
+556 3661 1
+556 4124 1
+556 4276 1
+556 4338 1
+556 4735 1
+556 5412 1
+556 5423 1
+557 560 1
+558 560 1
+559 560 1
+559 1802 1
+559 2076 1
+559 3755 1
+561 56 1
+561 152 1
+561 236 1
+561 282 1
+562 282 1
+563 282 1
+565 282 1
+564 150 1
+564 255 1
+564 282 1
+564 310 1
+564 311 1
+564 604 1
+564 656 1
+564 673 1
+564 730 1
+564 739 1
+564 756 1
+564 761 1
+564 895 1
+564 906 1
+564 4735 1
+567 371 1
+567 584 1
+568 567 1
+569 567 1
+570 56 1
+570 152 1
+570 567 1
+570 581 1
+571 567 1
+572 567 1
+572 1111 1
+572 1717 1
+572 2398 1
+572 3192 1
+573 567 1
+574 151 1
+574 282 1
+574 567 1
+574 587 1
+574 673 1
+575 152 1
+575 765 1
+575 1662 1
+579 152 1
+579 626 1
+579 1127 1
+579 1186 1
+576 152 1
+577 152 1
+578 152 1
+580 182 1
+580 1733 1
+580 2258 1
+580 2381 1
+580 3293 1
+580 3346 1
+580 3664 1
+580 4041 1
+580 4653 1
+580 4709 1
+580 4899 1
+580 4983 1
+580 5103 1
+580 5106 1
+580 5144 1
+580 5500 1
+580 5651 1
+580 6032 1
+580 6043 1
+580 6328 1
+580 6784 1
+580 7092 1
+580 7144 1
+580 7400 1
+580 7587 1
+580 7662 1
+580 7946 1
+580 7961 1
+580 7992 1
+580 8037 1
+583 56 1
+583 86 1
+583 214 1
+583 372 1
+583 628 1
+583 633 1
+583 737 1
+583 762 1
+583 789 1
+583 1026 1
+583 1859 1
+583 2102 1
+583 2398 1
+583 2535 1
+583 2763 1
+583 2775 1
+583 3334 1
+583 3443 1
+583 3576 1
+583 3897 1
+583 4687 1
+583 4977 1
+583 5421 1
+583 5449 1
+583 5671 1
+583 6914 1
+582 56 1
+582 589 1
+582 762 1
+582 1185 1
+582 1688 1
+582 2144 1
+582 2456 1
+582 2760 1
+582 2871 1
+582 3073 1
+582 3321 1
+582 3460 1
+582 3464 1
+582 3557 1
+582 3812 1
+582 3956 1
+582 4040 1
+582 4072 1
+582 4212 1
+582 4261 1
+582 4536 1
+582 4562 1
+582 4584 1
+582 4605 1
+582 4661 1
+582 4662 1
+582 4666 1
+582 4728 1
+582 4735 1
+582 4796 1
+582 4808 1
+582 4811 1
+582 4875 1
+582 5412 1
+584 371 1
+584 590 1
+584 604 1
+584 1600 1
+584 1638 1
+585 310 1
+585 371 1
+585 1307 1
+586 86 1
+586 151 1
+586 243 1
+586 403 1
+586 439 1
+586 616 1
+586 667 1
+586 673 1
+586 677 1
+586 733 1
+586 1080 1
+586 1201 1
+586 3005 1
+587 35 1
+587 589 1
+587 704 1
+587 794 1
+587 922 1
+587 941 1
+587 972 1
+587 991 1
+587 1286 1
+587 1425 1
+587 1439 1
+587 2375 1
+587 2625 1
+587 2877 1
+587 2918 1
+587 2922 1
+587 2926 1
+587 2928 1
+588 35 1
+588 587 1
+588 589 1
+588 859 1
+588 922 1
+588 941 1
+588 947 1
+588 959 1
+588 999 1
+588 1035 1
+588 1193 1
+588 1330 1
+588 1425 1
+588 1439 1
+588 1492 1
+588 1547 1
+588 1836 1
+588 1842 1
+588 1964 1
+588 2062 1
+588 2345 1
+588 2385 1
+590 36 1
+590 282 1
+590 429 1
+590 579 1
+590 829 1
+590 1026 1
+590 1062 1
+590 1375 1
+592 150 1
+592 175 1
+592 224 1
+592 280 1
+592 282 1
+592 606 1
+592 611 1
+592 619 1
+592 624 1
+592 628 1
+592 657 1
+592 863 1
+591 592 1
+591 673 1
+595 39 1
+595 2193 1
+593 39 1
+596 39 1
+594 39 1
+597 86 1
+597 151 1
+598 151 1
+599 151 1
+601 321 1
+601 600 1
+601 803 1
+601 1152 1
+601 1413 1
+601 1468 1
+601 1476 1
+601 2251 1
+601 4234 1
+600 15 1
+600 29 1
+600 35 1
+600 36 1
+600 72 1
+600 86 1
+600 227 1
+600 228 1
+600 243 1
+600 246 1
+600 259 1
+600 271 1
+600 282 1
+600 290 1
+600 299 1
+600 308 1
+600 311 1
+600 313 1
+600 321 1
+600 324 1
+600 350 1
+600 372 1
+600 407 1
+600 417 1
+600 439 1
+600 488 1
+600 549 1
+600 579 1
+600 601 1
+600 626 1
+600 637 1
+600 647 1
+600 665 1
+600 677 1
+600 704 1
+600 706 1
+600 722 1
+600 723 1
+600 730 1
+600 733 1
+600 739 1
+600 742 1
+600 746 1
+600 749 1
+600 750 1
+600 760 1
+600 762 1
+600 763 1
+600 769 1
+600 794 1
+600 798 1
+600 803 1
+600 817 1
+600 829 1
+600 844 1
+600 853 1
+600 856 1
+600 859 1
+600 864 1
+600 866 1
+600 873 1
+600 878 1
+600 885 1
+600 893 1
+600 895 1
+600 907 1
+600 932 1
+600 946 1
+600 960 1
+600 966 1
+600 999 1
+600 1023 1
+600 1026 1
+600 1049 1
+600 1053 1
+600 1075 1
+600 1080 1
+600 1100 1
+600 1103 1
+600 1111 1
+600 1165 1
+600 1186 1
+600 1193 1
+600 1297 1
+600 1310 1
+600 1315 1
+600 1330 1
+600 1352 1
+600 1353 1
+600 1374 1
+600 1377 1
+600 1407 1
+600 1471 1
+600 1473 1
+600 1476 1
+600 1484 1
+600 1497 1
+600 1514 1
+600 1521 1
+600 1548 1
+600 1549 1
+600 1555 1
+600 1564 1
+600 1585 1
+600 1633 1
+600 1661 1
+600 1717 1
+600 1808 1
+600 1835 1
+600 1836 1
+600 1837 1
+600 1842 1
+600 1847 1
+600 1855 1
+600 1884 1
+600 1919 1
+600 1927 1
+600 1956 1
+600 1963 1
+600 1977 1
+600 1979 1
+600 2004 1
+600 2060 1
+600 2066 1
+600 2106 1
+600 2117 1
+600 2210 1
+600 2225 1
+600 2251 1
+600 2256 1
+600 2297 1
+600 2323 1
+600 2328 1
+600 2398 1
+600 2409 1
+600 2475 1
+600 2479 1
+600 2535 1
+600 2542 1
+600 2576 1
+600 2587 1
+600 2593 1
+600 2595 1
+600 2617 1
+600 2625 1
+600 2643 1
+600 2652 1
+600 2660 1
+600 2736 1
+600 2775 1
+600 2851 1
+600 2871 1
+600 3002 1
+600 3009 1
+600 3018 1
+600 3033 1
+600 3034 1
+600 3136 1
+600 3164 1
+600 3192 1
+600 3352 1
+600 3408 1
+600 3443 1
+600 3458 1
+600 3568 1
+600 3681 1
+600 3755 1
+600 3769 1
+600 3804 1
+600 3835 1
+600 3962 1
+600 4037 1
+600 4071 1
+600 4191 1
+600 4276 1
+600 4289 1
+600 4310 1
+600 4338 1
+600 4384 1
+600 4441 1
+600 4510 1
+600 4709 1
+600 5226 1
+600 5254 1
+600 5341 1
+600 5404 1
+600 5423 1
+600 5449 1
+600 5452 1
+600 5484 1
+600 5511 1
+600 5524 1
+600 5543 1
+600 5714 1
+600 5829 1
+600 6004 1
+600 6229 1
+600 6330 1
+600 6560 1
+600 6566 1
+600 6613 1
+600 6739 1
+600 6774 1
+600 6833 1
+600 6855 1
+600 6892 1
+600 6946 1
+600 7050 1
+600 7115 1
+600 7912 1
+600 8042 1
+600 8174 1
+600 8212 1
+600 8219 1
+604 310 1
+604 325 1
+604 600 1
+604 636 1
+604 725 1
+604 746 1
+604 960 1
+604 1377 1
+602 604 1
+605 280 1
+606 280 1
+606 607 1
+606 611 1
+608 609 1
+608 5605 1
+608 6414 1
+610 611 1
+613 1638 1
+613 4078 1
+612 613 1
+616 282 1
+614 549 1
+614 600 1
+614 616 1
+614 659 1
+614 682 1
+614 715 1
+614 798 1
+614 938 1
+614 942 1
+614 945 1
+615 150 1
+615 246 1
+615 255 1
+615 282 1
+615 306 1
+615 319 1
+615 325 1
+615 432 1
+615 587 1
+615 616 1
+615 617 1
+615 622 1
+615 624 1
+615 627 1
+615 628 1
+615 636 1
+615 645 1
+615 650 1
+615 656 1
+615 657 1
+615 664 1
+615 668 1
+615 673 1
+615 675 1
+615 677 1
+615 684 1
+615 687 1
+615 694 1
+615 700 1
+615 719 1
+615 739 1
+615 750 1
+615 756 1
+615 760 1
+615 761 1
+618 282 1
+618 407 1
+618 600 1
+618 619 1
+618 673 1
+618 715 1
+618 844 1
+618 857 1
+618 875 1
+618 895 1
+618 955 1
+495 282 1
+495 622 1
+495 665 1
+495 2014 1
+495 2470 1
+495 4037 1
+620 86 1
+620 175 1
+620 622 1
+620 628 1
+620 643 1
+620 673 1
+620 730 1
+620 739 1
+620 741 1
+620 778 1
+620 881 1
+620 882 1
+620 979 1
+620 8289 1
+621 175 1
+624 627 1
+624 628 1
+625 624 1
+625 2398 1
+625 2774 1
+626 35 1
+626 86 1
+626 259 1
+626 282 1
+626 299 1
+626 432 1
+626 439 1
+626 579 1
+626 600 1
+626 627 1
+626 673 1
+626 707 1
+626 733 1
+626 802 1
+626 803 1
+626 817 1
+626 893 1
+626 960 1
+626 993 1
+626 1000 1
+626 1141 1
+626 1167 1
+626 1186 1
+626 1193 1
+626 1330 1
+626 1425 1
+626 1464 1
+626 1468 1
+626 1855 1
+626 2066 1
+626 3136 1
+628 1154 1
+632 282 1
+633 86 1
+633 171 1
+633 255 1
+633 271 1
+633 282 1
+633 298 1
+633 306 1
+633 310 1
+633 311 1
+633 313 1
+633 319 1
+633 407 1
+633 439 1
+633 600 1
+633 626 1
+633 636 1
+633 644 1
+633 656 1
+633 704 1
+633 706 1
+633 746 1
+633 749 1
+633 760 1
+633 769 1
+633 789 1
+633 798 1
+633 817 1
+633 820 1
+633 857 1
+633 863 1
+633 893 1
+633 906 1
+633 982 1
+633 1020 1
+633 1026 1
+633 1425 1
+633 1573 1
+633 1580 1
+633 1593 1
+633 1859 1
+633 1966 1
+633 2397 1
+633 2474 1
+633 3253 1
+633 3310 1
+633 3607 1
+633 4099 1
+633 4211 1
+633 4534 1
+633 5469 1
+633 5479 1
+633 5773 1
+633 6004 1
+633 6330 1
+633 7587 1
+634 15 1
+634 35 1
+634 214 1
+634 243 1
+634 271 1
+634 282 1
+634 290 1
+634 334 1
+634 417 1
+634 545 1
+634 579 1
+634 608 1
+634 626 1
+634 644 1
+634 647 1
+634 686 1
+634 697 1
+634 705 1
+634 737 1
+634 803 1
+634 813 1
+634 844 1
+634 853 1
+634 887 1
+634 935 1
+634 936 1
+634 938 1
+634 941 1
+634 946 1
+634 948 1
+634 958 1
+634 993 1
+634 999 1
+634 1006 1
+634 1044 1
+634 1061 1
+634 1157 1
+634 1164 1
+634 1186 1
+634 1190 1
+634 1193 1
+634 1196 1
+634 1200 1
+634 1201 1
+634 1218 1
+634 1253 1
+634 1261 1
+634 1284 1
+634 1285 1
+634 1286 1
+634 1296 1
+634 1297 1
+634 1319 1
+634 1321 1
+634 1330 1
+634 1357 1
+634 1378 1
+634 1382 1
+634 1385 1
+634 1389 1
+634 1390 1
+634 1403 1
+634 1476 1
+634 1486 1
+634 1514 1
+634 1537 1
+634 1564 1
+634 1585 1
+634 1688 1
+634 1689 1
+634 1707 1
+634 1717 1
+634 1723 1
+634 1744 1
+634 1757 1
+634 1774 1
+634 1842 1
+634 1965 1
+634 1966 1
+634 1972 1
+634 2071 1
+634 2073 1
+634 2079 1
+634 2225 1
+634 2289 1
+634 2328 1
+634 2440 1
+634 2485 1
+634 2542 1
+634 2565 1
+634 2579 1
+634 2618 1
+634 2625 1
+634 2653 1
+634 2654 1
+634 2774 1
+634 2831 1
+634 2851 1
+634 2871 1
+634 2955 1
+634 3192 1
+634 3276 1
+634 3394 1
+634 3455 1
+634 3456 1
+634 3516 1
+634 3554 1
+634 3580 1
+634 3755 1
+634 3796 1
+634 3803 1
+634 3892 1
+634 4037 1
+634 4041 1
+634 4099 1
+634 4175 1
+634 4290 1
+634 4297 1
+634 4323 1
+634 4400 1
+634 4424 1
+634 4748 1
+634 4929 1
+634 4994 1
+634 5002 1
+634 5103 1
+634 5106 1
+634 5200 1
+634 5233 1
+634 5288 1
+634 5404 1
+634 5437 1
+634 5459 1
+634 5509 1
+634 5524 1
+634 5527 1
+634 5539 1
+634 5543 1
+634 5773 1
+634 5814 1
+634 5818 1
+634 5827 1
+634 5922 1
+634 5925 1
+634 5936 1
+634 5994 1
+634 6148 1
+634 6227 1
+634 6869 1
+634 8288 1
+646 282 1
+646 762 1
+646 810 1
+646 963 1
+646 1385 1
+646 1412 1
+646 1425 1
+646 1484 1
+646 1734 1
+646 1754 1
+646 1781 1
+646 2697 1
+646 2830 1
+646 3089 1
+646 3140 1
+646 3150 1
+646 7862 1
+635 29 1
+635 35 1
+635 204 1
+635 271 1
+635 282 1
+635 285 1
+635 299 1
+635 304 1
+635 317 1
+635 407 1
+635 432 1
+635 587 1
+635 600 1
+635 643 1
+635 656 1
+635 659 1
+635 665 1
+635 704 1
+635 710 1
+635 714 1
+635 722 1
+635 730 1
+635 741 1
+635 779 1
+635 803 1
+635 857 1
+635 863 1
+635 937 1
+635 958 1
+635 982 1
+635 991 1
+635 1012 1
+635 1014 1
+635 1020 1
+635 1026 1
+635 1035 1
+635 1131 1
+635 1160 1
+635 1166 1
+635 1186 1
+635 1193 1
+635 1200 1
+635 1211 1
+635 1296 1
+635 1321 1
+635 1357 1
+635 1437 1
+635 1453 1
+635 1566 1
+635 1621 1
+635 1861 1
+635 1864 1
+635 2066 1
+635 2073 1
+635 2328 1
+635 2341 1
+635 2475 1
+635 2506 1
+635 2660 1
+635 2801 1
+635 3148 1
+635 3307 1
+635 3489 1
+635 3516 1
+635 4201 1
+635 4261 1
+636 271 1
+636 282 1
+636 407 1
+636 432 1
+636 663 1
+636 715 1
+636 739 1
+636 750 1
+636 806 1
+636 1201 1
+636 1524 1
+647 35 1
+647 243 1
+647 282 1
+647 299 1
+647 545 1
+647 587 1
+647 600 1
+647 626 1
+647 739 1
+647 836 1
+647 857 1
+647 985 1
+647 1031 1
+647 1053 1
+647 1123 1
+647 1186 1
+647 1193 1
+647 1218 1
+647 1297 1
+647 1330 1
+647 1378 1
+647 1390 1
+647 1497 1
+647 1547 1
+647 2062 1
+647 2281 1
+647 2322 1
+647 2345 1
+647 2348 1
+647 2350 1
+647 2385 1
+647 2397 1
+637 271 1
+637 282 1
+637 311 1
+637 317 1
+637 742 1
+637 762 1
+637 789 1
+637 838 1
+637 857 1
+637 863 1
+637 937 1
+637 977 1
+637 1014 1
+637 1026 1
+637 1573 1
+637 2237 1
+637 2517 1
+637 2565 1
+637 2651 1
+637 4037 1
+637 4335 1
+637 4712 1
+637 4820 1
+637 5254 1
+637 6833 1
+638 282 1
+640 214 1
+640 282 1
+640 644 1
+640 1186 1
+641 282 1
+641 686 1
+642 282 1
+642 656 1
+642 657 1
+648 150 1
+648 282 1
+643 72 1
+643 282 1
+643 311 1
+643 313 1
+643 600 1
+643 673 1
+643 715 1
+643 719 1
+643 725 1
+643 733 1
+643 746 1
+643 749 1
+643 750 1
+643 756 1
+643 798 1
+643 823 1
+643 866 1
+643 930 1
+643 958 1
+643 972 1
+643 1023 1
+643 1026 1
+643 1053 1
+643 1123 1
+643 1151 1
+643 1259 1
+643 1279 1
+643 1413 1
+643 1534 1
+643 1718 1
+643 1758 1
+643 1919 1
+643 1964 1
+643 2253 1
+643 2654 1
+643 3338 1
+643 3803 1
+643 3871 1
+643 4037 1
+643 4117 1
+643 4179 1
+643 4735 1
+643 6305 1
+643 6400 1
+643 6589 1
+643 6934 1
+644 35 1
+644 86 1
+644 271 1
+644 282 1
+644 313 1
+644 415 1
+644 425 1
+644 439 1
+644 549 1
+644 636 1
+644 677 1
+644 762 1
+644 863 1
+644 908 1
+644 1022 1
+644 1125 1
+644 1360 1
+644 1372 1
+644 1524 1
+644 1585 1
+644 1593 1
+644 2264 1
+644 2790 1
+644 2838 1
+644 2877 1
+644 2922 1
+644 2928 1
+645 29 1
+645 72 1
+645 214 1
+645 271 1
+645 282 1
+645 407 1
+645 659 1
+645 706 1
+645 817 1
+645 857 1
+645 863 1
+645 875 1
+645 1186 1
+645 1919 1
+645 4315 1
+645 6306 1
+649 150 1
+649 282 1
+649 304 1
+649 317 1
+649 407 1
+649 432 1
+649 447 1
+649 549 1
+649 600 1
+649 643 1
+649 650 1
+649 659 1
+649 673 1
+649 705 1
+649 714 1
+649 715 1
+649 719 1
+649 723 1
+649 730 1
+649 741 1
+649 778 1
+649 779 1
+649 789 1
+649 793 1
+649 794 1
+649 798 1
+649 802 1
+649 810 1
+649 820 1
+649 863 1
+649 878 1
+649 881 1
+649 882 1
+649 885 1
+649 995 1
+649 1007 1
+649 1014 1
+649 1186 1
+649 1453 1
+649 2643 1
+650 36 1
+650 214 1
+650 259 1
+650 271 1
+650 290 1
+650 308 1
+650 311 1
+650 332 1
+650 429 1
+650 488 1
+650 637 1
+650 657 1
+650 663 1
+650 667 1
+650 677 1
+650 682 1
+650 700 1
+650 714 1
+650 733 1
+650 748 1
+650 762 1
+650 765 1
+650 779 1
+650 794 1
+650 798 1
+650 806 1
+650 817 1
+650 829 1
+650 853 1
+650 857 1
+650 859 1
+650 868 1
+650 885 1
+650 895 1
+650 922 1
+650 932 1
+650 936 1
+650 955 1
+650 977 1
+650 978 1
+650 982 1
+650 995 1
+650 1020 1
+650 1026 1
+650 1030 1
+650 1053 1
+650 1144 1
+650 1156 1
+650 1186 1
+650 1192 1
+650 1211 1
+650 1267 1
+650 1286 1
+650 1296 1
+650 1297 1
+650 1375 1
+650 1382 1
+650 1413 1
+650 1418 1
+650 1419 1
+650 1453 1
+650 1507 1
+650 1592 1
+650 1608 1
+650 1734 1
+650 1836 1
+650 1997 1
+650 2053 1
+650 2117 1
+650 2128 1
+650 2225 1
+650 2234 1
+650 2323 1
+650 2332 1
+650 2333 1
+650 2339 1
+650 2397 1
+650 2400 1
+650 2425 1
+650 2484 1
+650 2576 1
+650 2587 1
+650 2593 1
+650 2625 1
+650 2655 1
+650 2669 1
+650 2785 1
+650 2830 1
+650 2880 1
+650 2951 1
+650 2955 1
+650 2972 1
+650 2977 1
+650 3034 1
+650 3082 1
+650 3117 1
+650 3130 1
+650 3256 1
+651 656 1
+651 714 1
+655 656 1
+652 549 1
+652 656 1
+653 656 1
+653 958 1
+654 656 1
+657 4110 1
+658 255 1
+658 664 1
+658 667 1
+658 1186 1
+658 1190 1
+658 6458 1
+659 35 1
+659 86 1
+659 204 1
+659 271 1
+659 417 1
+659 439 1
+659 545 1
+659 761 1
+659 857 1
+659 906 1
+659 978 1
+659 1193 1
+659 1297 1
+659 3755 1
+661 658 1
+661 1186 1
+662 658 1
+662 2655 1
+664 749 1
+664 797 1
+664 849 1
+664 906 1
+664 1374 1
+664 1489 1
+664 1513 1
+664 1569 1
+664 1718 1
+664 1864 1
+664 2470 1
+664 2651 1
+664 3755 1
+663 35 1
+663 36 1
+663 56 1
+663 72 1
+663 86 1
+663 171 1
+663 214 1
+663 243 1
+663 259 1
+663 271 1
+663 290 1
+663 299 1
+663 311 1
+663 321 1
+663 407 1
+663 425 1
+663 439 1
+663 600 1
+663 618 1
+663 636 1
+663 637 1
+663 643 1
+663 664 1
+663 667 1
+663 675 1
+663 677 1
+663 682 1
+663 684 1
+663 696 1
+663 697 1
+663 700 1
+663 704 1
+663 707 1
+663 710 1
+663 715 1
+663 719 1
+663 725 1
+663 730 1
+663 737 1
+663 739 1
+663 743 1
+663 746 1
+663 750 1
+663 756 1
+663 760 1
+663 761 1
+663 762 1
+663 769 1
+663 789 1
+663 794 1
+663 798 1
+663 817 1
+663 822 1
+663 844 1
+663 853 1
+663 857 1
+663 864 1
+663 868 1
+663 871 1
+663 875 1
+663 878 1
+663 881 1
+663 887 1
+663 903 1
+663 922 1
+663 929 1
+663 930 1
+663 934 1
+663 936 1
+663 947 1
+663 966 1
+663 971 1
+663 978 1
+663 979 1
+663 985 1
+663 993 1
+663 1007 1
+663 1020 1
+663 1026 1
+663 1043 1
+663 1053 1
+663 1123 1
+663 1125 1
+663 1128 1
+663 1140 1
+663 1166 1
+663 1167 1
+663 1193 1
+663 1211 1
+663 1222 1
+663 1234 1
+663 1241 1
+663 1261 1
+663 1266 1
+663 1270 1
+663 1287 1
+663 1319 1
+663 1360 1
+663 1374 1
+663 1394 1
+663 1496 1
+663 1498 1
+663 1525 1
+663 1538 1
+663 1573 1
+663 1603 1
+663 1661 1
+663 1688 1
+663 1754 1
+663 1769 1
+663 1956 1
+663 1961 1
+663 1966 1
+663 2066 1
+663 2102 1
+663 2135 1
+663 2174 1
+663 2223 1
+663 2242 1
+663 2324 1
+663 2364 1
+663 2381 1
+663 2485 1
+663 2535 1
+663 2560 1
+663 2592 1
+663 2643 1
+663 2700 1
+663 2830 1
+663 3014 1
+663 3084 1
+663 3253 1
+663 3284 1
+663 3452 1
+663 3456 1
+663 3635 1
+663 3661 1
+663 3897 1
+663 3910 1
+663 3962 1
+663 4040 1
+663 4099 1
+663 4269 1
+663 4400 1
+663 4424 1
+663 4480 1
+663 4485 1
+663 4846 1
+663 4980 1
+663 5092 1
+663 5144 1
+663 5204 1
+663 5806 1
+663 5887 1
+663 6123 1
+663 6634 1
+663 6784 1
+663 7809 1
+667 332 1
+667 665 1
+667 1111 1
+667 1193 1
+667 1729 1
+667 1927 1
+667 2135 1
+667 2470 1
+667 2763 1
+667 2958 1
+667 3009 1
+667 3404 1
+667 4037 1
+667 4463 1
+667 4600 1
+667 4687 1
+667 5421 1
+667 6006 1
+667 7553 1
+665 56 1
+665 667 1
+665 1729 1
+665 2470 1
+665 2958 1
+665 3408 1
+665 4687 1
+666 665 1
+666 667 1
+668 3089 1
+668 6897 1
+639 86 1
+639 271 1
+639 313 1
+639 439 1
+639 668 1
+639 674 1
+639 696 1
+639 719 1
+639 749 1
+639 760 1
+639 761 1
+639 794 1
+639 810 1
+639 817 1
+639 823 1
+639 857 1
+639 863 1
+639 941 1
+639 943 1
+639 985 1
+639 989 1
+639 1023 1
+639 1026 1
+639 1030 1
+639 1201 1
+639 1222 1
+639 1277 1
+639 1286 1
+639 1382 1
+639 1453 1
+639 1484 1
+669 670 1
+673 86 1
+673 271 1
+673 407 1
+673 549 1
+673 565 1
+672 673 1
+675 4049 1
+674 86 1
+674 271 1
+674 308 1
+674 310 1
+674 317 1
+674 325 1
+674 406 1
+674 675 1
+674 733 1
+674 749 1
+674 857 1
+674 878 1
+674 895 1
+674 972 1
+674 981 1
+674 1222 1
+677 760 1
+677 817 1
+676 677 1
+678 681 1
+684 756 1
+684 1833 1
+683 684 1
+682 310 1
+682 636 1
+682 684 1
+686 171 1
+686 334 1
+686 338 1
+686 372 1
+686 407 1
+686 644 1
+686 663 1
+686 687 1
+686 710 1
+686 769 1
+686 803 1
+686 805 1
+686 826 1
+686 853 1
+686 861 1
+686 937 1
+686 943 1
+686 948 1
+686 956 1
+686 966 1
+686 971 1
+686 978 1
+686 981 1
+686 985 1
+686 1022 1
+686 1032 1
+686 1035 1
+686 1038 1
+686 1039 1
+686 1043 1
+686 1062 1
+686 1080 1
+686 1128 1
+686 1144 1
+686 1152 1
+686 1160 1
+686 1165 1
+686 1196 1
+686 1203 1
+686 1221 1
+686 1261 1
+686 1277 1
+686 1282 1
+686 1297 1
+686 1372 1
+686 1375 1
+686 1389 1
+686 1402 1
+686 1413 1
+686 1418 1
+686 1420 1
+686 1476 1
+686 1489 1
+686 1514 1
+686 1518 1
+686 1524 1
+686 1533 1
+686 1534 1
+686 1538 1
+686 1600 1
+686 1603 1
+686 1658 1
+686 1717 1
+686 1805 1
+686 1833 1
+686 1836 1
+686 1842 1
+686 1849 1
+686 1861 1
+686 1864 1
+686 1893 1
+686 1903 1
+686 1966 1
+686 1973 1
+686 2397 1
+686 3755 1
+686 5233 1
+686 5524 1
+686 5527 1
+686 6148 1
+686 6151 1
+686 8288 1
+686 8290 1
+688 310 1
+688 743 1
+688 1196 1
+688 3720 1
+688 3967 1
+689 86 1
+689 214 1
+689 259 1
+689 299 1
+689 310 1
+689 439 1
+689 644 1
+689 749 1
+689 789 1
+689 798 1
+689 873 1
+689 1018 1
+689 1039 1
+689 1186 1
+689 1297 1
+689 1307 1
+689 1413 1
+689 1613 1
+689 1787 1
+689 1805 1
+689 1859 1
+689 1864 1
+689 1992 1
+689 2128 1
+689 2157 1
+689 2163 1
+689 2333 1
+689 2397 1
+689 2398 1
+689 2411 1
+689 2517 1
+689 2580 1
+689 2593 1
+689 2643 1
+689 2736 1
+689 3089 1
+689 3173 1
+689 3180 1
+689 3371 1
+689 3393 1
+689 3926 1
+689 4021 1
+689 4666 1
+689 5412 1
+689 5452 1
+689 5637 1
+689 5790 1
+690 310 1
+690 3456 1
+690 4600 1
+691 36 1
+691 306 1
+691 429 1
+691 696 1
+691 817 1
+691 863 1
+691 928 1
+691 937 1
+691 1043 1
+691 1186 1
+691 1199 1
+691 1201 1
+691 1203 1
+691 1236 1
+691 1243 1
+691 1487 1
+691 1622 1
+691 1835 1
+691 1847 1
+691 1888 1
+691 1953 1
+691 1969 1
+691 2117 1
+691 6930 1
+692 306 1
+692 319 1
+692 325 1
+693 694 1
+695 15 1
+695 36 1
+695 56 1
+695 86 1
+695 204 1
+695 271 1
+695 290 1
+695 317 1
+695 324 1
+695 325 1
+695 346 1
+695 372 1
+695 439 1
+695 549 1
+695 600 1
+695 691 1
+695 704 1
+695 730 1
+695 733 1
+695 737 1
+695 756 1
+695 761 1
+695 762 1
+695 769 1
+695 789 1
+695 813 1
+695 863 1
+695 893 1
+695 932 1
+695 958 1
+695 971 1
+695 999 1
+695 1014 1
+695 1123 1
+695 1151 1
+695 1166 1
+695 1211 1
+695 1222 1
+695 1322 1
+695 1374 1
+695 1385 1
+695 1411 1
+695 1497 1
+695 1521 1
+695 1580 1
+695 1585 1
+695 1603 1
+695 1638 1
+695 1657 1
+695 1687 1
+695 1717 1
+695 1718 1
+695 1732 1
+695 1842 1
+695 1855 1
+695 1901 1
+695 1979 1
+695 1983 1
+695 2066 1
+695 2145 1
+695 2151 1
+695 2210 1
+695 2240 1
+695 2252 1
+695 2328 1
+695 2499 1
+695 2506 1
+695 2535 1
+695 2576 1
+695 2585 1
+695 2625 1
+695 2643 1
+695 2654 1
+695 2686 1
+695 2747 1
+695 2777 1
+695 2877 1
+695 2923 1
+695 3007 1
+695 3117 1
+695 3309 1
+695 3352 1
+695 3404 1
+695 3443 1
+695 3516 1
+695 3537 1
+695 3580 1
+695 3607 1
+695 3631 1
+695 3680 1
+695 3807 1
+695 3892 1
+695 3976 1
+695 4011 1
+695 4098 1
+695 4201 1
+695 4269 1
+695 4365 1
+695 4384 1
+695 4480 1
+695 4587 1
+695 4639 1
+695 4712 1
+695 4735 1
+695 4962 1
+695 4999 1
+695 5233 1
+695 5487 1
+695 5760 1
+695 5897 1
+695 6251 1
+695 6262 1
+695 6306 1
+695 6437 1
+695 6634 1
+695 6770 1
+695 7809 1
+695 8292 1
+699 406 1
+699 407 1
+699 647 1
+699 978 1
+699 1222 1
+699 1573 1
+699 1585 1
+699 1966 1
+701 15 1
+701 230 1
+701 432 1
+701 3334 1
+703 714 1
+704 271 1
+704 304 1
+704 308 1
+704 313 1
+704 317 1
+704 346 1
+704 545 1
+704 579 1
+704 647 1
+704 663 1
+704 673 1
+704 714 1
+704 723 1
+704 762 1
+704 765 1
+704 789 1
+704 805 1
+704 857 1
+704 859 1
+704 873 1
+704 908 1
+704 941 1
+704 948 1
+704 974 1
+704 985 1
+704 993 1
+704 999 1
+704 1007 1
+704 1026 1
+704 1034 1
+704 1097 1
+704 1125 1
+704 1166 1
+704 1201 1
+704 1222 1
+704 1241 1
+704 1297 1
+704 1396 1
+704 1413 1
+704 1453 1
+704 1471 1
+704 1501 1
+704 1514 1
+704 1595 1
+704 1603 1
+704 1633 1
+704 1757 1
+704 1787 1
+704 1903 1
+704 1966 1
+704 1987 1
+704 2066 1
+704 2102 1
+704 2106 1
+704 2117 1
+704 2119 1
+704 2181 1
+704 2225 1
+704 2231 1
+704 2341 1
+704 2400 1
+704 2579 1
+704 2593 1
+704 2625 1
+704 2643 1
+704 2655 1
+704 2660 1
+704 2662 1
+704 2708 1
+704 2809 1
+704 2811 1
+704 2814 1
+704 2912 1
+704 3005 1
+704 3028 1
+704 3253 1
+704 3473 1
+704 3680 1
+704 4661 1
+704 5204 1
+704 5412 1
+705 35 1
+705 171 1
+705 317 1
+705 674 1
+705 710 1
+705 714 1
+705 795 1
+705 823 1
+705 857 1
+705 878 1
+705 906 1
+705 922 1
+705 932 1
+705 941 1
+705 943 1
+705 958 1
+705 978 1
+705 981 1
+705 1007 1
+705 1029 1
+705 1062 1
+705 1127 1
+705 1201 1
+705 1222 1
+705 1270 1
+705 1282 1
+705 1413 1
+705 8289 1
+706 35 1
+706 36 1
+706 56 1
+706 259 1
+706 299 1
+706 317 1
+706 407 1
+706 549 1
+706 579 1
+706 600 1
+706 626 1
+706 659 1
+706 663 1
+706 710 1
+706 714 1
+706 741 1
+706 748 1
+706 761 1
+706 765 1
+706 778 1
+706 789 1
+706 803 1
+706 817 1
+706 829 1
+706 836 1
+706 838 1
+706 903 1
+706 913 1
+706 963 1
+706 978 1
+706 993 1
+706 1014 1
+706 1053 1
+706 1080 1
+706 1111 1
+706 1123 1
+706 1186 1
+706 1190 1
+706 1192 1
+706 1193 1
+706 1211 1
+706 1248 1
+706 1279 1
+706 1296 1
+706 1297 1
+706 1321 1
+706 1322 1
+706 1330 1
+706 1374 1
+706 1411 1
+706 1435 1
+706 1442 1
+706 1471 1
+706 1478 1
+706 1486 1
+706 1489 1
+706 1496 1
+706 1501 1
+706 1514 1
+706 1520 1
+706 1569 1
+706 1573 1
+706 1585 1
+706 1593 1
+706 1597 1
+706 1636 1
+706 1649 1
+706 1652 1
+706 1654 1
+706 1661 1
+706 1662 1
+706 1669 1
+706 1672 1
+706 1680 1
+706 1718 1
+706 1772 1
+706 1819 1
+706 1864 1
+706 1884 1
+706 1919 1
+706 1956 1
+706 1984 1
+706 2060 1
+706 2062 1
+706 2157 1
+706 2165 1
+706 2385 1
+706 2397 1
+706 2400 1
+706 2484 1
+706 2625 1
+706 2763 1
+706 2801 1
+706 3755 1
+706 8291 1
+707 35 1
+707 86 1
+707 227 1
+707 271 1
+707 290 1
+707 299 1
+707 311 1
+707 321 1
+707 372 1
+707 407 1
+707 432 1
+707 579 1
+707 626 1
+707 663 1
+707 682 1
+707 696 1
+707 697 1
+707 710 1
+707 714 1
+707 742 1
+707 762 1
+707 769 1
+707 784 1
+707 794 1
+707 795 1
+707 803 1
+707 813 1
+707 826 1
+707 853 1
+707 857 1
+707 861 1
+707 904 1
+707 907 1
+707 928 1
+707 938 1
+707 941 1
+707 945 1
+707 946 1
+707 948 1
+707 956 1
+707 971 1
+707 977 1
+707 978 1
+707 989 1
+707 991 1
+707 994 1
+707 999 1
+707 1007 1
+707 1020 1
+707 1023 1
+707 1026 1
+707 1030 1
+707 1038 1
+707 1039 1
+707 1053 1
+707 1055 1
+707 1061 1
+707 1062 1
+707 1075 1
+707 1123 1
+707 1131 1
+707 1167 1
+707 1190 1
+707 1192 1
+707 1193 1
+707 1201 1
+707 1203 1
+707 1211 1
+707 1234 1
+707 1248 1
+707 1253 1
+707 1261 1
+707 1297 1
+707 1319 1
+707 1330 1
+707 1372 1
+707 1375 1
+707 1377 1
+707 1389 1
+707 1402 1
+707 1428 1
+707 1471 1
+707 1476 1
+707 1484 1
+707 1486 1
+707 1489 1
+707 1490 1
+707 1496 1
+707 1497 1
+707 1506 1
+707 1514 1
+707 1518 1
+707 1521 1
+707 1525 1
+707 1532 1
+707 1537 1
+707 1538 1
+707 1542 1
+707 1556 1
+707 1563 1
+707 1564 1
+707 1573 1
+707 1580 1
+707 1587 1
+707 1593 1
+707 1600 1
+707 1603 1
+707 1608 1
+707 1621 1
+707 1661 1
+707 1662 1
+707 1701 1
+707 1718 1
+707 1726 1
+707 1774 1
+707 1808 1
+707 1842 1
+707 1855 1
+707 2053 1
+707 2625 1
+707 2643 1
+707 2843 1
+707 3136 1
+708 29 1
+708 171 1
+708 204 1
+708 271 1
+708 304 1
+708 311 1
+708 317 1
+708 321 1
+708 334 1
+708 407 1
+708 447 1
+708 545 1
+708 696 1
+708 707 1
+708 714 1
+708 764 1
+708 784 1
+708 789 1
+708 866 1
+708 930 1
+708 937 1
+708 947 1
+708 956 1
+708 958 1
+708 978 1
+708 981 1
+708 991 1
+708 1031 1
+708 1039 1
+708 1092 1
+708 1114 1
+708 1128 1
+708 1140 1
+708 1141 1
+708 1154 1
+708 1156 1
+708 1270 1
+708 1297 1
+708 1888 1
+708 2066 1
+708 2120 1
+708 2193 1
+708 2322 1
+708 2576 1
+708 2768 1
+708 2790 1
+708 2815 1
+708 2818 1
+708 2900 1
+708 2993 1
+708 3473 1
+709 714 1
+710 15 1
+710 35 1
+710 56 1
+710 230 1
+710 243 1
+710 271 1
+710 321 1
+710 407 1
+710 417 1
+710 644 1
+710 663 1
+710 686 1
+710 697 1
+710 704 1
+710 707 1
+710 714 1
+710 762 1
+710 769 1
+710 784 1
+710 789 1
+710 795 1
+710 857 1
+710 861 1
+710 937 1
+710 941 1
+710 955 1
+710 960 1
+710 972 1
+710 979 1
+710 989 1
+710 991 1
+710 993 1
+710 1026 1
+710 1038 1
+710 1043 1
+710 1044 1
+710 1053 1
+710 1055 1
+710 1062 1
+710 1092 1
+710 1100 1
+710 1123 1
+710 1127 1
+710 1141 1
+710 1152 1
+710 1193 1
+710 1199 1
+710 1201 1
+710 1211 1
+710 1230 1
+710 1234 1
+710 1261 1
+710 1267 1
+710 1277 1
+710 1279 1
+710 1286 1
+710 1297 1
+710 1319 1
+710 1360 1
+710 1377 1
+710 1413 1
+710 1428 1
+710 1439 1
+710 1496 1
+710 1514 1
+710 1525 1
+710 1564 1
+710 1585 1
+710 1593 1
+710 1633 1
+710 1648 1
+710 1705 1
+710 1718 1
+710 1734 1
+710 1754 1
+710 1768 1
+710 1774 1
+710 1956 1
+710 1969 1
+710 2117 1
+710 2120 1
+710 2174 1
+710 2225 1
+710 2276 1
+710 2290 1
+710 2339 1
+710 2381 1
+710 2474 1
+710 2542 1
+710 2625 1
+710 2651 1
+710 2657 1
+710 2801 1
+710 2900 1
+710 2923 1
+710 3284 1
+710 3376 1
+710 3456 1
+710 3516 1
+710 3537 1
+710 3671 1
+710 4735 1
+710 5412 1
+710 8289 1
+710 8292 1
+696 587 1
+696 714 1
+696 903 1
+696 930 1
+696 1026 1
+696 1125 1
+711 714 1
+712 304 1
+712 714 1
+712 795 1
+712 978 1
+712 1193 1
+712 1253 1
+712 1428 1
+712 1496 1
+712 1525 1
+712 1555 1
+712 1585 1
+712 1595 1
+712 1603 1
+712 1604 1
+712 1622 1
+712 1697 1
+712 1774 1
+712 1855 1
+712 1927 1
+713 332 1
+713 432 1
+713 714 1
+713 2426 1
+715 35 1
+715 227 1
+715 299 1
+715 334 1
+715 407 1
+715 644 1
+715 647 1
+715 719 1
+715 803 1
+715 857 1
+715 978 1
+715 999 1
+715 1006 1
+715 1062 1
+715 1075 1
+715 1193 1
+715 1221 1
+715 1282 1
+715 1286 1
+715 1296 1
+715 1321 1
+715 1330 1
+715 1637 1
+716 715 1
+717 715 1
+718 715 1
+719 715 1
+719 723 1
+719 1811 1
+719 3808 1
+720 715 1
+721 715 1
+722 36 1
+722 72 1
+722 86 1
+722 204 1
+722 214 1
+722 246 1
+722 290 1
+722 308 1
+722 346 1
+722 403 1
+722 407 1
+722 429 1
+722 439 1
+722 447 1
+722 608 1
+722 637 1
+722 643 1
+722 719 1
+722 723 1
+722 733 1
+722 737 1
+722 739 1
+722 746 1
+722 748 1
+722 760 1
+722 761 1
+722 762 1
+722 763 1
+722 765 1
+722 769 1
+722 784 1
+722 789 1
+722 813 1
+722 817 1
+722 825 1
+722 827 1
+722 839 1
+722 844 1
+722 856 1
+722 857 1
+722 893 1
+722 895 1
+722 897 1
+722 904 1
+722 906 1
+722 908 1
+722 932 1
+722 934 1
+722 935 1
+722 955 1
+722 963 1
+722 974 1
+722 977 1
+722 978 1
+722 989 1
+722 991 1
+722 993 1
+722 1018 1
+722 1026 1
+722 1049 1
+722 1053 1
+722 1127 1
+722 1154 1
+722 1157 1
+722 1164 1
+722 1166 1
+722 1167 1
+722 1186 1
+722 1201 1
+722 1211 1
+722 1218 1
+722 1232 1
+722 1234 1
+722 1236 1
+722 1250 1
+722 1261 1
+722 1267 1
+722 1277 1
+722 1291 1
+722 1297 1
+722 1307 1
+722 1321 1
+722 1357 1
+722 1374 1
+722 1378 1
+722 1385 1
+722 1402 1
+722 1420 1
+722 1441 1
+722 1442 1
+722 1453 1
+722 1473 1
+722 1485 1
+722 1525 1
+722 1534 1
+722 1537 1
+722 1556 1
+722 1566 1
+722 1573 1
+722 1593 1
+722 1596 1
+722 1597 1
+722 1603 1
+722 1612 1
+722 1633 1
+722 1637 1
+722 1641 1
+722 1646 1
+722 1669 1
+722 1705 1
+722 1717 1
+722 1718 1
+722 1733 1
+722 1734 1
+722 1744 1
+722 1754 1
+722 1777 1
+722 1783 1
+722 1805 1
+722 1836 1
+722 1847 1
+722 1849 1
+722 1859 1
+722 1864 1
+722 1918 1
+722 1956 1
+722 1992 1
+722 2053 1
+722 2066 1
+722 2097 1
+722 2101 1
+722 2102 1
+722 2117 1
+722 2120 1
+722 2145 1
+722 2157 1
+722 2234 1
+722 2237 1
+722 2251 1
+722 2252 1
+722 2256 1
+722 2294 1
+722 2326 1
+722 2333 1
+722 2340 1
+722 2375 1
+722 2398 1
+722 2410 1
+722 2411 1
+722 2416 1
+722 2470 1
+722 2501 1
+722 2565 1
+722 2570 1
+722 2571 1
+722 2575 1
+722 2576 1
+722 2579 1
+722 2587 1
+722 2591 1
+722 2607 1
+722 2618 1
+722 2625 1
+722 2629 1
+722 2643 1
+722 2647 1
+722 2651 1
+722 2653 1
+722 2654 1
+722 2662 1
+722 2670 1
+722 2697 1
+722 2707 1
+722 2720 1
+722 2721 1
+722 2727 1
+722 2754 1
+722 2775 1
+722 2777 1
+722 2785 1
+722 2787 1
+722 2790 1
+722 2794 1
+722 2797 1
+722 2799 1
+722 2801 1
+722 2818 1
+722 2821 1
+722 2825 1
+722 2830 1
+722 2838 1
+722 2856 1
+722 2877 1
+722 2880 1
+722 2900 1
+722 2902 1
+722 2917 1
+722 2918 1
+722 2926 1
+722 2940 1
+722 2946 1
+722 2951 1
+722 2968 1
+722 2972 1
+722 2991 1
+722 2993 1
+722 2996 1
+722 3007 1
+722 3018 1
+722 3020 1
+722 3029 1
+722 3033 1
+722 3034 1
+722 3050 1
+722 3056 1
+722 3068 1
+722 3089 1
+722 3117 1
+722 3140 1
+722 3145 1
+722 3173 1
+722 3253 1
+722 3255 1
+722 3258 1
+722 3276 1
+722 3371 1
+722 3393 1
+722 3408 1
+722 3435 1
+722 3443 1
+722 3480 1
+722 3580 1
+722 3609 1
+722 3680 1
+722 3681 1
+722 3755 1
+722 3796 1
+722 3812 1
+722 3897 1
+722 3958 1
+722 4037 1
+722 4103 1
+722 4201 1
+722 4266 1
+722 4735 1
+722 4797 1
+722 4798 1
+722 4820 1
+722 4980 1
+722 5022 1
+722 5263 1
+722 5323 1
+722 5326 1
+722 5341 1
+722 5392 1
+722 5454 1
+722 5484 1
+722 5928 1
+722 6299 1
+722 6432 1
+722 6714 1
+722 6784 1
+722 7553 1
+722 8292 1
+723 719 1
+725 749 1
+725 789 1
+725 849 1
+725 859 1
+725 1006 1
+725 1053 1
+724 725 1
+724 741 1
+724 1935 1
+724 3404 1
+726 739 1
+726 756 1
+727 72 1
+727 214 1
+727 271 1
+727 665 1
+727 737 1
+727 739 1
+727 1186 1
+727 1199 1
+727 1211 1
+727 1497 1
+727 1569 1
+727 1842 1
+727 1861 1
+727 1864 1
+727 1956 1
+727 1961 1
+727 2066 1
+727 2256 1
+727 2323 1
+727 2397 1
+727 2398 1
+727 2643 1
+727 2775 1
+727 2777 1
+727 2877 1
+727 3050 1
+727 3104 1
+727 3433 1
+727 4191 1
+727 4828 1
+727 5412 1
+727 6913 1
+728 600 1
+728 706 1
+728 739 1
+728 756 1
+728 817 1
+729 739 1
+730 35 1
+730 86 1
+730 243 1
+730 271 1
+730 299 1
+730 439 1
+730 600 1
+730 696 1
+730 704 1
+730 733 1
+730 739 1
+730 743 1
+730 749 1
+730 750 1
+730 838 1
+730 857 1
+730 893 1
+730 895 1
+730 955 1
+730 958 1
+730 983 1
+730 989 1
+730 1022 1
+730 1026 1
+730 1031 1
+730 1035 1
+730 1131 1
+730 1140 1
+730 1186 1
+730 1192 1
+730 1435 1
+730 1506 1
+730 2339 1
+730 5412 1
+731 739 1
+732 246 1
+732 549 1
+732 739 1
+732 857 1
+733 86 1
+733 439 1
+733 549 1
+733 739 1
+733 829 1
+733 1026 1
+733 1151 1
+733 1464 1
+737 246 1
+737 659 1
+737 739 1
+737 840 1
+737 938 1
+737 1403 1
+737 1493 1
+737 1823 1
+737 1865 1
+737 1982 1
+737 2381 1
+737 2433 1
+737 2440 1
+737 2565 1
+737 2620 1
+737 2851 1
+737 2940 1
+737 3084 1
+737 3092 1
+737 3106 1
+737 3238 1
+737 3284 1
+737 3452 1
+737 3458 1
+737 3459 1
+737 3568 1
+737 3631 1
+737 3726 1
+737 3792 1
+737 3842 1
+737 3919 1
+737 4037 1
+737 4044 1
+737 4065 1
+737 4071 1
+737 4298 1
+737 4335 1
+737 4401 1
+737 4432 1
+737 4441 1
+737 4632 1
+737 4712 1
+737 4713 1
+737 4791 1
+737 4875 1
+737 4953 1
+737 4983 1
+737 5002 1
+737 5012 1
+737 5028 1
+737 5037 1
+737 5064 1
+737 5096 1
+737 5132 1
+737 5144 1
+737 5148 1
+737 5179 1
+737 5188 1
+737 5199 1
+737 5210 1
+737 5233 1
+737 5239 1
+737 5246 1
+737 5254 1
+737 5273 1
+737 5288 1
+737 5295 1
+737 5321 1
+737 5341 1
+737 5384 1
+737 5404 1
+737 5412 1
+737 5466 1
+737 5529 1
+737 5543 1
+737 5563 1
+737 5582 1
+737 5605 1
+737 5697 1
+737 5738 1
+737 5760 1
+737 5772 1
+737 5800 1
+737 5802 1
+737 5807 1
+737 5814 1
+737 5822 1
+737 5824 1
+737 5827 1
+737 5887 1
+737 5902 1
+737 5922 1
+737 5950 1
+737 6000 1
+737 6001 1
+737 6004 1
+737 6032 1
+737 6044 1
+737 6047 1
+737 6097 1
+737 6123 1
+737 6156 1
+737 6170 1
+737 6221 1
+737 6227 1
+737 6280 1
+737 6299 1
+737 6305 1
+737 6320 1
+737 6323 1
+737 6388 1
+737 6414 1
+737 6417 1
+737 6421 1
+737 6422 1
+737 6442 1
+737 6447 1
+737 6496 1
+737 6523 1
+737 6560 1
+737 6566 1
+737 6567 1
+737 6576 1
+737 6595 1
+737 6596 1
+737 6599 1
+737 6613 1
+737 6618 1
+737 6624 1
+737 6628 1
+737 6634 1
+737 6663 1
+737 6665 1
+737 6700 1
+737 6720 1
+737 6725 1
+737 6736 1
+737 6739 1
+737 6759 1
+737 6765 1
+737 6770 1
+737 6772 1
+737 6780 1
+737 6784 1
+737 6789 1
+737 6803 1
+737 6805 1
+737 6832 1
+737 6855 1
+737 6875 1
+737 6897 1
+737 6913 1
+737 6917 1
+737 6924 1
+737 6930 1
+737 6933 1
+737 6934 1
+737 6945 1
+737 6946 1
+737 6948 1
+737 6953 1
+737 6976 1
+737 6979 1
+737 6993 1
+737 6994 1
+737 7012 1
+737 7047 1
+737 7063 1
+737 7094 1
+737 7115 1
+737 7116 1
+737 7162 1
+737 7185 1
+737 7186 1
+737 7225 1
+737 7233 1
+737 7279 1
+737 7295 1
+737 7323 1
+737 7341 1
+737 7351 1
+737 7373 1
+737 7386 1
+737 7391 1
+737 7397 1
+737 7422 1
+737 7442 1
+737 7449 1
+737 7450 1
+737 7493 1
+737 7517 1
+737 7544 1
+737 7553 1
+737 7567 1
+737 7574 1
+737 7588 1
+737 7593 1
+737 7618 1
+737 7620 1
+737 7632 1
+737 7647 1
+737 7649 1
+737 7651 1
+737 7658 1
+737 7666 1
+737 7669 1
+737 7673 1
+737 7675 1
+737 7694 1
+737 7699 1
+737 7730 1
+737 7778 1
+737 7799 1
+737 7803 1
+737 7819 1
+737 7839 1
+737 7874 1
+737 7921 1
+737 7924 1
+737 7927 1
+737 7961 1
+737 7965 1
+737 8051 1
+737 8134 1
+737 8141 1
+737 8163 1
+737 8168 1
+737 8192 1
+737 8198 1
+737 8204 1
+737 8212 1
+737 8297 1
+738 8 1
+738 86 1
+738 439 1
+738 739 1
+738 748 1
+738 979 1
+738 2276 1
+738 5301 1
+734 739 1
+735 739 1
+742 72 1
+742 86 1
+742 246 1
+742 271 1
+742 298 1
+742 304 1
+742 311 1
+742 317 1
+742 324 1
+742 447 1
+742 643 1
+742 659 1
+742 663 1
+742 682 1
+742 697 1
+742 704 1
+742 707 1
+742 722 1
+742 762 1
+742 769 1
+742 789 1
+742 810 1
+742 817 1
+742 829 1
+742 838 1
+742 857 1
+742 863 1
+742 885 1
+742 893 1
+742 897 1
+742 906 1
+742 941 1
+742 977 1
+742 978 1
+742 993 1
+742 994 1
+742 1006 1
+742 1007 1
+742 1023 1
+742 1026 1
+742 1038 1
+742 1039 1
+742 1053 1
+742 1165 1
+742 1167 1
+742 1200 1
+742 1201 1
+742 1241 1
+742 1310 1
+742 1385 1
+742 1394 1
+742 1413 1
+742 1425 1
+742 1476 1
+742 1983 1
+742 2095 1
+742 2097 1
+742 2435 1
+742 2669 1
+742 2721 1
+742 2940 1
+742 3238 1
+742 3334 1
+742 3352 1
+742 3460 1
+742 3464 1
+742 3568 1
+742 4044 1
+742 4234 1
+742 4261 1
+742 4384 1
+742 4385 1
+742 4386 1
+742 4424 1
+742 4605 1
+742 4820 1
+742 4875 1
+742 5002 1
+742 5073 1
+742 5745 1
+742 6424 1
+742 6624 1
+742 6712 1
+742 6832 1
+742 7214 1
+742 7225 1
+742 7277 1
+742 7662 1
+742 7691 1
+742 7707 1
+742 7795 1
+742 7803 1
+742 7809 1
+744 746 1
+745 746 1
+745 750 1
+748 5210 1
+697 15 1
+697 72 1
+697 271 1
+697 311 1
+697 313 1
+697 321 1
+697 332 1
+697 600 1
+697 643 1
+697 663 1
+697 665 1
+697 682 1
+697 691 1
+697 696 1
+697 704 1
+697 705 1
+697 730 1
+697 742 1
+697 748 1
+697 789 1
+697 794 1
+697 817 1
+697 859 1
+697 875 1
+697 895 1
+697 936 1
+697 941 1
+697 960 1
+697 981 1
+697 982 1
+697 993 1
+697 994 1
+697 1007 1
+697 1014 1
+697 1023 1
+697 1026 1
+697 1032 1
+697 1039 1
+697 1062 1
+697 1092 1
+697 1125 1
+697 1128 1
+697 1141 1
+697 1190 1
+697 1236 1
+697 1253 1
+697 1259 1
+697 1413 1
+697 1473 1
+697 1476 1
+697 1513 1
+697 1548 1
+697 1569 1
+697 1595 1
+697 1636 1
+697 1700 1
+697 1757 1
+697 1836 1
+697 1884 1
+697 1966 1
+697 2116 1
+697 2225 1
+697 2369 1
+697 2397 1
+697 2398 1
+697 2517 1
+697 2535 1
+697 2576 1
+697 2785 1
+697 3106 1
+697 3274 1
+697 3371 1
+697 3393 1
+697 3456 1
+697 3498 1
+697 3631 1
+697 3635 1
+697 3970 1
+697 4037 1
+697 4044 1
+697 4099 1
+697 4212 1
+697 4266 1
+697 4574 1
+697 4661 1
+697 4666 1
+697 4735 1
+697 4820 1
+697 4953 1
+697 4962 1
+697 4964 1
+697 5215 1
+697 5412 1
+697 5449 1
+697 5509 1
+697 5790 1
+697 6784 1
+697 6873 1
+697 7809 1
+697 8044 1
+749 86 1
+749 290 1
+749 407 1
+749 559 1
+749 600 1
+749 697 1
+749 730 1
+749 750 1
+749 789 1
+749 798 1
+749 805 1
+749 817 1
+749 878 1
+749 1039 1
+749 1186 1
+749 1239 1
+749 1310 1
+749 1407 1
+749 1425 1
+749 1629 1
+749 1637 1
+749 1744 1
+749 2225 1
+749 2258 1
+749 2324 1
+749 2328 1
+749 2384 1
+749 2651 1
+749 2654 1
+749 2770 1
+749 2819 1
+749 2951 1
+749 3238 1
+749 3352 1
+749 3417 1
+749 3435 1
+749 3537 1
+749 3607 1
+749 3634 1
+749 3873 1
+749 3892 1
+749 3970 1
+749 4037 1
+749 4124 1
+749 4289 1
+749 4335 1
+749 4400 1
+749 4666 1
+749 4715 1
+749 4953 1
+749 4981 1
+749 5239 1
+749 5254 1
+749 5412 1
+749 5445 1
+749 5584 1
+749 5637 1
+749 6347 1
+749 6498 1
+749 7115 1
+749 7587 1
+749 7618 1
+749 7632 1
+749 7683 1
+749 7778 1
+749 7992 1
+321 35 1
+321 86 1
+321 271 1
+321 308 1
+321 311 1
+321 439 1
+321 488 1
+321 696 1
+321 704 1
+321 750 1
+321 769 1
+321 817 1
+321 895 1
+321 918 1
+321 934 1
+321 938 1
+321 945 1
+321 955 1
+321 958 1
+321 966 1
+321 971 1
+321 972 1
+321 1023 1
+321 1026 1
+321 1053 1
+321 1123 1
+321 1190 1
+751 756 1
+754 56 1
+754 756 1
+752 756 1
+753 756 1
+755 756 1
+760 600 1
+758 760 1
+758 5130 1
+759 35 1
+759 36 1
+759 72 1
+759 86 1
+759 259 1
+759 271 1
+759 299 1
+759 311 1
+759 313 1
+759 317 1
+759 429 1
+759 432 1
+759 600 1
+759 626 1
+759 643 1
+759 659 1
+759 704 1
+759 730 1
+759 760 1
+759 762 1
+759 763 1
+759 769 1
+759 789 1
+759 829 1
+759 857 1
+759 893 1
+759 895 1
+759 897 1
+759 906 1
+759 963 1
+759 972 1
+759 979 1
+759 981 1
+759 995 1
+759 999 1
+759 1014 1
+759 1053 1
+759 1075 1
+759 1080 1
+759 1123 1
+759 1140 1
+759 1186 1
+759 1193 1
+759 1211 1
+759 1230 1
+759 1315 1
+759 1375 1
+759 1416 1
+759 1425 1
+759 1534 1
+759 1580 1
+759 1697 1
+759 1717 1
+759 1842 1
+759 1855 1
+759 1956 1
+759 2398 1
+759 2542 1
+759 2754 1
+759 3136 1
+759 3473 1
+759 3520 1
+759 3537 1
+759 3587 1
+759 3680 1
+759 4191 1
+759 4338 1
+759 4653 1
+759 4666 1
+759 4777 1
+759 5072 1
+759 5321 1
+759 5392 1
+759 5423 1
+759 5430 1
+759 5673 1
+759 8293 1
+761 29 1
+761 204 1
+761 304 1
+761 565 1
+761 989 1
+761 1484 1
+761 2151 1
+761 2398 1
+763 15 1
+763 214 1
+763 579 1
+763 637 1
+763 665 1
+763 733 1
+763 765 1
+763 817 1
+763 820 1
+763 849 1
+763 857 1
+763 893 1
+763 1049 1
+763 1211 1
+763 1267 1
+763 1360 1
+763 1407 1
+763 1464 1
+763 1520 1
+763 1633 1
+763 1717 1
+763 1718 1
+763 1927 1
+763 2095 1
+763 2097 1
+763 2257 1
+763 2294 1
+763 2323 1
+763 2375 1
+763 2398 1
+763 2411 1
+763 2542 1
+763 2560 1
+763 2612 1
+763 2625 1
+763 2643 1
+763 2651 1
+763 2653 1
+763 2754 1
+763 2871 1
+763 2966 1
+763 2977 1
+763 3130 1
+763 3284 1
+763 3352 1
+763 3393 1
+763 3529 1
+763 3664 1
+763 3691 1
+763 3752 1
+763 3806 1
+763 3976 1
+763 4297 1
+763 4335 1
+763 4712 1
+763 4953 1
+763 5037 1
+763 5073 1
+763 5222 1
+763 5288 1
+763 5392 1
+763 5412 1
+763 5430 1
+763 5620 1
+763 5651 1
+763 6262 1
+763 7813 1
+763 7862 1
+764 549 1
+764 600 1
+764 762 1
+764 765 1
+764 946 1
+764 947 1
+764 1154 1
+764 1211 1
+764 1492 1
+764 1700 1
+764 1734 1
+764 1754 1
+764 1772 1
+764 1956 1
+764 1992 1
+764 2071 1
+764 2117 1
+764 2120 1
+764 2174 1
+764 2195 1
+764 2205 1
+764 2294 1
+764 2322 1
+764 2328 1
+764 2501 1
+764 2504 1
+764 2580 1
+764 2585 1
+764 2625 1
+764 3192 1
+764 3276 1
+764 3755 1
+764 4269 1
+764 8290 1
+766 15 1
+766 72 1
+766 86 1
+766 155 1
+766 204 1
+766 271 1
+766 285 1
+766 332 1
+766 346 1
+766 350 1
+766 403 1
+766 417 1
+766 549 1
+766 579 1
+766 600 1
+766 608 1
+766 633 1
+766 644 1
+766 659 1
+766 673 1
+766 706 1
+766 722 1
+766 737 1
+766 741 1
+766 749 1
+766 762 1
+766 765 1
+766 789 1
+766 817 1
+766 825 1
+766 826 1
+766 856 1
+766 857 1
+766 871 1
+766 878 1
+766 908 1
+766 946 1
+766 960 1
+766 967 1
+766 968 1
+766 974 1
+766 978 1
+766 1024 1
+766 1026 1
+766 1031 1
+766 1035 1
+766 1049 1
+766 1100 1
+766 1114 1
+766 1125 1
+766 1157 1
+766 1159 1
+766 1164 1
+766 1166 1
+766 1167 1
+766 1185 1
+766 1186 1
+766 1191 1
+766 1201 1
+766 1211 1
+766 1239 1
+766 1243 1
+766 1247 1
+766 1250 1
+766 1267 1
+766 1286 1
+766 1291 1
+766 1305 1
+766 1307 1
+766 1310 1
+766 1352 1
+766 1357 1
+766 1360 1
+766 1378 1
+766 1384 1
+766 1385 1
+766 1393 1
+766 1403 1
+766 1416 1
+766 1419 1
+766 1428 1
+766 1437 1
+766 1473 1
+766 1492 1
+766 1496 1
+766 1514 1
+766 1538 1
+766 1550 1
+766 1571 1
+766 1585 1
+766 1608 1
+766 1621 1
+766 1622 1
+766 1633 1
+766 1646 1
+766 1653 1
+766 1680 1
+766 1688 1
+766 1705 1
+766 1706 1
+766 1717 1
+766 1723 1
+766 1733 1
+766 1734 1
+766 1754 1
+766 1769 1
+766 1772 1
+766 1774 1
+766 1777 1
+766 1781 1
+766 1799 1
+766 1808 1
+766 1814 1
+766 1836 1
+766 1837 1
+766 1842 1
+766 1847 1
+766 1858 1
+766 1888 1
+766 1893 1
+766 1915 1
+766 1918 1
+766 1919 1
+766 1935 1
+766 1956 1
+766 1964 1
+766 1966 1
+766 1969 1
+766 1971 1
+766 1972 1
+766 1982 1
+766 1984 1
+766 1990 1
+766 1992 1
+766 2001 1
+766 2004 1
+766 2014 1
+766 2016 1
+766 2066 1
+766 2071 1
+766 2076 1
+766 2102 1
+766 2114 1
+766 2116 1
+766 2117 1
+766 2120 1
+766 2134 1
+766 2135 1
+766 2144 1
+766 2145 1
+766 2174 1
+766 2193 1
+766 2209 1
+766 2225 1
+766 2231 1
+766 2237 1
+766 2240 1
+766 2241 1
+766 2251 1
+766 2252 1
+766 2256 1
+766 2257 1
+766 2258 1
+766 2264 1
+766 2276 1
+766 2290 1
+766 2297 1
+766 2307 1
+766 2322 1
+766 2324 1
+766 2325 1
+766 2328 1
+766 2338 1
+766 2354 1
+766 2356 1
+766 2364 1
+766 2371 1
+766 2375 1
+766 2381 1
+766 2384 1
+766 2398 1
+766 2410 1
+766 2433 1
+766 2440 1
+766 2456 1
+766 2474 1
+766 2485 1
+766 2506 1
+766 2507 1
+766 2510 1
+766 2511 1
+766 2516 1
+766 2517 1
+766 2535 1
+766 2542 1
+766 2544 1
+766 2547 1
+766 2550 1
+766 2560 1
+766 2565 1
+766 2576 1
+766 2579 1
+766 2592 1
+766 2593 1
+766 2594 1
+766 2597 1
+766 2599 1
+766 2605 1
+766 2617 1
+766 2619 1
+766 2623 1
+766 2625 1
+766 2646 1
+766 2653 1
+766 2654 1
+766 2658 1
+766 2660 1
+766 2662 1
+766 2667 1
+766 2674 1
+766 2685 1
+766 2689 1
+766 2693 1
+766 2696 1
+766 2697 1
+766 2700 1
+766 2707 1
+766 2713 1
+766 2721 1
+766 2747 1
+766 2754 1
+766 2760 1
+766 2763 1
+766 2764 1
+766 2765 1
+766 2774 1
+766 2775 1
+766 2785 1
+766 2787 1
+766 2790 1
+766 2794 1
+766 2805 1
+766 2809 1
+766 2811 1
+766 2814 1
+766 2815 1
+766 2819 1
+766 2822 1
+766 2828 1
+766 2830 1
+766 2831 1
+766 2834 1
+766 2851 1
+766 2856 1
+766 2859 1
+766 2871 1
+766 2900 1
+766 2909 1
+766 2912 1
+766 2917 1
+766 2922 1
+766 2923 1
+766 2925 1
+766 2932 1
+766 2940 1
+766 2951 1
+766 2955 1
+766 2958 1
+766 2963 1
+766 2968 1
+766 2972 1
+766 2973 1
+766 2981 1
+766 2993 1
+766 2999 1
+766 3000 1
+766 3002 1
+766 3005 1
+766 3009 1
+766 3010 1
+766 3014 1
+766 3015 1
+766 3021 1
+766 3027 1
+766 3029 1
+766 3033 1
+766 3034 1
+766 3050 1
+766 3073 1
+766 3089 1
+766 3092 1
+766 3103 1
+766 3104 1
+766 3114 1
+766 3117 1
+766 3125 1
+766 3140 1
+766 3144 1
+766 3148 1
+766 3150 1
+766 3192 1
+766 3200 1
+766 3238 1
+766 3243 1
+766 3251 1
+766 3253 1
+766 3265 1
+766 3271 1
+766 3274 1
+766 3276 1
+766 3284 1
+766 3291 1
+766 3293 1
+766 3307 1
+766 3309 1
+766 3310 1
+766 3319 1
+766 3320 1
+766 3321 1
+766 3324 1
+766 3334 1
+766 3348 1
+766 3351 1
+766 3352 1
+766 3381 1
+766 3393 1
+766 3394 1
+766 3408 1
+766 3417 1
+766 3433 1
+766 3443 1
+766 3447 1
+766 3452 1
+766 3453 1
+766 3454 1
+766 3455 1
+766 3456 1
+766 3458 1
+766 3459 1
+766 3460 1
+766 3464 1
+766 3473 1
+766 3483 1
+766 3486 1
+766 3489 1
+766 3498 1
+766 3506 1
+766 3516 1
+766 3537 1
+766 3541 1
+766 3547 1
+766 3549 1
+766 3554 1
+766 3555 1
+766 3557 1
+766 3562 1
+766 3580 1
+766 3586 1
+766 3587 1
+766 3607 1
+766 3614 1
+766 3615 1
+766 3616 1
+766 3631 1
+766 3634 1
+766 3635 1
+766 3643 1
+766 3645 1
+766 3646 1
+766 3664 1
+766 3681 1
+766 3691 1
+766 3720 1
+766 3724 1
+766 3726 1
+766 3748 1
+766 3752 1
+766 3769 1
+766 3772 1
+766 3776 1
+766 3787 1
+766 3792 1
+766 3796 1
+766 3803 1
+766 3804 1
+766 3806 1
+766 3812 1
+766 3813 1
+766 3830 1
+766 3835 1
+766 3842 1
+766 3843 1
+766 3854 1
+766 3856 1
+766 3871 1
+766 3873 1
+766 3887 1
+766 3897 1
+766 3898 1
+766 3910 1
+766 3956 1
+766 3958 1
+766 3962 1
+766 3969 1
+766 3976 1
+766 4011 1
+766 4013 1
+766 4040 1
+766 4041 1
+766 4043 1
+766 4044 1
+766 4055 1
+766 4065 1
+766 4072 1
+766 4098 1
+766 4099 1
+766 4103 1
+766 4110 1
+766 4124 1
+766 4134 1
+766 4138 1
+766 4162 1
+766 4175 1
+766 4179 1
+766 4189 1
+766 4191 1
+766 4212 1
+766 4219 1
+766 4247 1
+766 4256 1
+766 4261 1
+766 4263 1
+766 4266 1
+766 4269 1
+766 4289 1
+766 4290 1
+766 4297 1
+766 4298 1
+766 4299 1
+766 4310 1
+766 4315 1
+766 4323 1
+766 4335 1
+766 4338 1
+766 4341 1
+766 4400 1
+766 4422 1
+766 4435 1
+766 4448 1
+766 4453 1
+766 4463 1
+766 4471 1
+766 4480 1
+766 4482 1
+766 4485 1
+766 4488 1
+766 4500 1
+766 4510 1
+766 4527 1
+766 4528 1
+766 4529 1
+766 4530 1
+766 4531 1
+766 4534 1
+766 4547 1
+766 4551 1
+766 4557 1
+766 4578 1
+766 4583 1
+766 4587 1
+766 4588 1
+766 4600 1
+766 4604 1
+766 4613 1
+766 4631 1
+766 4632 1
+766 4646 1
+766 4653 1
+766 4661 1
+766 4662 1
+766 4666 1
+766 4687 1
+766 4689 1
+766 4706 1
+766 4709 1
+766 4712 1
+766 4713 1
+766 4715 1
+766 4717 1
+766 4719 1
+766 4735 1
+766 4748 1
+766 4764 1
+766 4777 1
+766 4780 1
+766 4781 1
+766 4792 1
+766 4795 1
+766 4797 1
+766 4798 1
+766 4808 1
+766 4814 1
+766 4820 1
+766 4824 1
+766 4827 1
+766 4828 1
+766 4846 1
+766 4879 1
+766 4884 1
+766 4899 1
+766 4929 1
+766 4938 1
+766 4944 1
+766 4953 1
+766 4962 1
+766 4964 1
+766 4977 1
+766 4980 1
+766 4981 1
+766 4983 1
+766 4986 1
+766 4994 1
+766 4999 1
+766 5002 1
+766 5022 1
+766 5026 1
+766 5033 1
+766 5037 1
+766 5055 1
+766 5058 1
+766 5061 1
+766 5072 1
+766 5073 1
+766 5075 1
+766 5079 1
+766 5092 1
+766 5096 1
+766 5100 1
+766 5103 1
+766 5106 1
+766 5121 1
+766 5123 1
+766 5130 1
+766 5132 1
+766 5140 1
+766 5144 1
+766 5148 1
+766 5155 1
+766 5178 1
+766 5182 1
+766 5188 1
+766 5189 1
+766 5199 1
+766 5200 1
+766 5204 1
+766 5215 1
+766 5222 1
+766 5226 1
+766 5239 1
+766 5245 1
+766 5254 1
+766 5262 1
+766 5273 1
+766 5323 1
+766 5392 1
+766 5404 1
+766 5412 1
+766 5423 1
+766 5430 1
+766 5432 1
+766 5437 1
+766 5439 1
+766 5445 1
+766 5459 1
+766 5465 1
+766 5466 1
+766 5479 1
+766 5506 1
+766 5509 1
+766 5511 1
+766 5524 1
+766 5527 1
+766 5539 1
+766 5543 1
+766 5545 1
+766 5563 1
+766 5584 1
+766 5596 1
+766 5623 1
+766 5624 1
+766 5626 1
+766 5637 1
+766 5650 1
+766 5651 1
+766 5671 1
+766 5684 1
+766 5693 1
+766 5714 1
+766 5721 1
+766 5732 1
+766 5737 1
+766 5739 1
+766 5743 1
+766 5753 1
+766 5773 1
+766 5775 1
+766 5776 1
+766 5780 1
+766 5790 1
+766 5799 1
+766 5800 1
+766 5802 1
+766 5806 1
+766 5814 1
+766 5817 1
+766 5818 1
+766 5822 1
+766 5827 1
+766 5828 1
+766 5829 1
+766 5835 1
+766 5837 1
+766 5839 1
+766 5844 1
+766 5848 1
+766 5871 1
+766 5872 1
+766 5897 1
+766 5925 1
+766 5932 1
+766 5933 1
+766 5947 1
+766 5950 1
+766 5998 1
+766 6001 1
+766 6004 1
+766 6006 1
+766 6029 1
+766 6032 1
+766 6043 1
+766 6044 1
+766 6098 1
+766 6123 1
+766 6124 1
+766 6151 1
+766 6156 1
+766 6166 1
+766 6170 1
+766 6174 1
+766 6221 1
+766 6227 1
+766 6229 1
+766 6241 1
+766 6243 1
+766 6251 1
+766 6262 1
+766 6272 1
+766 6296 1
+766 6299 1
+766 6327 1
+766 6337 1
+766 6347 1
+766 6414 1
+766 6417 1
+766 6432 1
+766 6437 1
+766 6441 1
+766 6442 1
+766 6458 1
+766 6481 1
+766 6496 1
+766 6501 1
+766 6505 1
+766 6528 1
+766 6554 1
+766 6555 1
+766 6566 1
+766 6570 1
+766 6576 1
+766 6589 1
+766 6594 1
+766 6595 1
+766 6600 1
+766 6624 1
+766 6632 1
+766 6665 1
+766 6699 1
+766 6715 1
+766 6739 1
+766 6770 1
+766 6774 1
+766 6783 1
+766 6784 1
+766 6790 1
+766 6832 1
+766 6860 1
+766 6869 1
+766 6873 1
+766 6901 1
+766 6907 1
+766 6930 1
+766 6934 1
+766 6946 1
+766 6976 1
+766 6980 1
+766 7005 1
+766 7012 1
+766 7021 1
+766 7052 1
+766 7063 1
+766 7092 1
+766 7101 1
+766 7115 1
+766 7116 1
+766 7119 1
+766 7143 1
+766 7144 1
+766 7168 1
+766 7214 1
+766 7237 1
+766 7238 1
+766 7277 1
+766 7280 1
+766 7341 1
+766 7381 1
+766 7400 1
+766 7414 1
+766 7443 1
+766 7450 1
+766 7478 1
+766 7493 1
+766 7510 1
+766 7561 1
+766 7618 1
+766 7624 1
+766 7632 1
+766 7646 1
+766 7649 1
+766 7651 1
+766 7662 1
+766 7683 1
+766 7694 1
+766 7695 1
+766 7699 1
+766 7707 1
+766 7726 1
+766 7757 1
+766 7763 1
+766 7778 1
+766 7788 1
+766 7795 1
+766 7809 1
+766 7813 1
+766 7855 1
+766 7860 1
+766 7862 1
+766 7871 1
+766 7879 1
+766 7882 1
+766 7890 1
+766 7908 1
+766 7910 1
+766 7912 1
+766 7927 1
+766 7946 1
+766 7961 1
+766 7965 1
+766 7979 1
+766 8037 1
+766 8042 1
+766 8073 1
+766 8293 1
+766 8294 1
+762 15 1
+762 271 1
+762 324 1
+762 600 1
+762 626 1
+762 644 1
+762 659 1
+762 663 1
+762 691 1
+762 697 1
+762 704 1
+762 789 1
+762 838 1
+762 881 1
+762 895 1
+762 896 1
+762 930 1
+762 966 1
+762 979 1
+762 993 1
+762 1012 1
+762 1026 1
+762 1029 1
+762 1053 1
+762 1123 1
+762 1186 1
+762 1191 1
+762 1211 1
+762 1222 1
+762 1453 1
+762 1476 1
+762 1569 1
+762 1697 1
+762 1861 1
+762 1864 1
+762 2066 1
+762 2508 1
+762 2651 1
+762 2790 1
+762 3976 1
+762 4875 1
+762 5148 1
+762 5162 1
+762 5902 1
+762 7378 1
+762 7587 1
+762 7620 1
+762 7632 1
+762 7699 1
+762 7809 1
+767 600 1
+768 600 1
+768 1717 1
+769 56 1
+769 171 1
+769 214 1
+769 228 1
+769 259 1
+769 271 1
+769 290 1
+769 298 1
+769 311 1
+769 313 1
+769 314 1
+769 321 1
+769 332 1
+769 338 1
+769 350 1
+769 432 1
+769 447 1
+769 559 1
+769 579 1
+769 600 1
+769 626 1
+769 707 1
+769 710 1
+769 722 1
+769 742 1
+769 749 1
+769 802 1
+769 805 1
+769 813 1
+769 817 1
+769 829 1
+769 868 1
+769 887 1
+769 893 1
+769 904 1
+769 922 1
+769 941 1
+769 948 1
+769 958 1
+769 959 1
+769 960 1
+769 974 1
+769 978 1
+769 993 1
+769 1006 1
+769 1018 1
+769 1026 1
+769 1031 1
+769 1034 1
+769 1043 1
+769 1044 1
+769 1049 1
+769 1053 1
+769 1080 1
+769 1111 1
+769 1123 1
+769 1127 1
+769 1131 1
+769 1137 1
+769 1144 1
+769 1166 1
+769 1167 1
+769 1186 1
+769 1190 1
+769 1193 1
+769 1196 1
+769 1201 1
+769 1211 1
+769 1218 1
+769 1222 1
+769 1248 1
+769 1253 1
+769 1297 1
+769 1315 1
+769 1319 1
+769 1378 1
+769 1396 1
+769 1413 1
+769 1418 1
+769 1428 1
+769 1432 1
+769 1453 1
+769 1465 1
+769 1473 1
+769 1476 1
+769 1566 1
+769 1580 1
+769 1592 1
+769 1597 1
+769 1604 1
+769 1629 1
+769 1633 1
+769 1637 1
+769 1652 1
+769 1717 1
+769 1718 1
+769 1726 1
+769 1787 1
+769 1808 1
+769 1835 1
+769 1836 1
+769 1842 1
+769 1884 1
+769 1919 1
+769 2062 1
+769 2128 1
+769 2193 1
+769 2210 1
+769 2225 1
+769 2231 1
+769 2256 1
+769 2323 1
+769 2328 1
+769 2506 1
+769 2535 1
+769 2542 1
+769 2576 1
+769 2625 1
+769 2651 1
+769 2660 1
+769 2770 1
+769 2775 1
+769 2801 1
+769 2828 1
+769 2963 1
+769 3002 1
+769 3148 1
+769 3251 1
+769 3253 1
+769 3371 1
+769 3408 1
+769 3479 1
+769 3480 1
+769 3554 1
+769 3755 1
+769 4110 1
+769 5210 1
+769 5254 1
+769 5412 1
+769 5804 1
+769 5828 1
+769 6229 1
+769 6840 1
+769 8141 1
+769 8178 1
+769 8294 1
+770 600 1
+770 893 1
+770 897 1
+771 600 1
+771 626 1
+771 893 1
+771 1641 1
+771 1701 1
+771 1726 1
+771 2643 1
+772 600 1
+772 798 1
+772 817 1
+773 549 1
+774 549 1
+736 439 1
+736 549 1
+736 857 1
+736 866 1
+775 549 1
+775 1585 1
+776 549 1
+786 227 1
+786 407 1
+788 15 1
+788 72 1
+788 86 1
+788 204 1
+788 243 1
+788 290 1
+788 311 1
+788 317 1
+788 321 1
+788 407 1
+788 415 1
+788 417 1
+788 439 1
+788 447 1
+788 545 1
+788 643 1
+788 644 1
+788 696 1
+788 697 1
+788 705 1
+788 707 1
+788 733 1
+788 742 1
+788 761 1
+788 762 1
+788 769 1
+788 849 1
+788 859 1
+788 863 1
+788 893 1
+788 895 1
+788 903 1
+788 904 1
+788 930 1
+788 938 1
+788 956 1
+788 959 1
+788 963 1
+788 974 1
+788 978 1
+788 1012 1
+788 1023 1
+788 1039 1
+788 1053 1
+788 1123 1
+788 1131 1
+788 1140 1
+788 1156 1
+788 1157 1
+788 1166 1
+788 1186 1
+788 1240 1
+788 1385 1
+788 1411 1
+788 1453 1
+788 1492 1
+788 1585 1
+788 1587 1
+788 1700 1
+788 1836 1
+788 1859 1
+788 1956 1
+788 1964 1
+788 2062 1
+788 2066 1
+788 2240 1
+788 2397 1
+788 2490 1
+788 2535 1
+788 2576 1
+788 2654 1
+788 2790 1
+788 2877 1
+788 2914 1
+788 3307 1
+788 3338 1
+788 3479 1
+788 3516 1
+788 3614 1
+788 3631 1
+788 3755 1
+788 3873 1
+788 3897 1
+788 3946 1
+788 3971 1
+788 3976 1
+788 4201 1
+788 4453 1
+788 4687 1
+788 4786 1
+788 4795 1
+788 4798 1
+788 4980 1
+788 5200 1
+788 5233 1
+788 5415 1
+788 5620 1
+788 5638 1
+788 5684 1
+788 5709 1
+788 5798 1
+788 5814 1
+788 6255 1
+788 6302 1
+788 6306 1
+788 6334 1
+788 6360 1
+788 6400 1
+788 6407 1
+788 6409 1
+788 6417 1
+788 6422 1
+788 8295 1
+780 407 1
+780 771 1
+781 407 1
+781 673 1
+781 1261 1
+781 1514 1
+781 1564 1
+781 2151 1
+781 2398 1
+781 3755 1
+782 8 1
+782 407 1
+782 659 1
+782 673 1
+782 677 1
+782 749 1
+782 798 1
+782 802 1
+782 817 1
+783 407 1
+784 35 1
+784 56 1
+784 204 1
+784 214 1
+784 230 1
+784 243 1
+784 290 1
+784 299 1
+784 311 1
+784 338 1
+784 346 1
+784 407 1
+784 417 1
+784 425 1
+784 647 1
+784 663 1
+784 665 1
+784 697 1
+784 704 1
+784 705 1
+784 707 1
+784 710 1
+784 762 1
+784 765 1
+784 789 1
+784 810 1
+784 856 1
+784 857 1
+784 904 1
+784 908 1
+784 937 1
+784 946 1
+784 947 1
+784 948 1
+784 963 1
+784 974 1
+784 982 1
+784 985 1
+784 989 1
+784 993 1
+784 999 1
+784 1006 1
+784 1007 1
+784 1014 1
+784 1031 1
+784 1053 1
+784 1080 1
+784 1114 1
+784 1151 1
+784 1160 1
+784 1164 1
+784 1165 1
+784 1166 1
+784 1186 1
+784 1193 1
+784 1199 1
+784 1200 1
+784 1211 1
+784 1222 1
+784 1241 1
+784 1248 1
+784 1259 1
+784 1261 1
+784 1297 1
+784 1360 1
+784 1384 1
+784 1385 1
+784 1411 1
+784 1420 1
+784 1453 1
+784 1464 1
+784 1465 1
+784 1485 1
+784 1513 1
+784 1514 1
+784 1525 1
+784 1534 1
+784 1549 1
+784 1573 1
+784 1585 1
+784 1610 1
+784 1622 1
+784 1633 1
+784 1652 1
+784 1654 1
+784 1662 1
+784 1679 1
+784 1688 1
+784 1706 1
+784 1707 1
+784 1729 1
+784 1749 1
+784 1752 1
+784 1758 1
+784 1769 1
+784 1792 1
+784 1793 1
+784 1814 1
+784 1836 1
+784 1842 1
+784 1849 1
+784 1855 1
+784 1858 1
+784 1864 1
+784 1918 1
+784 1919 1
+784 1964 1
+784 1966 1
+784 1973 1
+784 1987 1
+784 2053 1
+784 2060 1
+784 2062 1
+784 2066 1
+784 2076 1
+784 2091 1
+784 2095 1
+784 2097 1
+784 2106 1
+784 2120 1
+784 2135 1
+784 2144 1
+784 2145 1
+784 2174 1
+784 2211 1
+784 2225 1
+784 2237 1
+784 2256 1
+784 2257 1
+784 2290 1
+784 2297 1
+784 2323 1
+784 2325 1
+784 2328 1
+784 2338 1
+784 2345 1
+784 2348 1
+784 2356 1
+784 2381 1
+784 2397 1
+784 2398 1
+784 2400 1
+784 2411 1
+784 2416 1
+784 2456 1
+784 2470 1
+784 2499 1
+784 2508 1
+784 2535 1
+784 2565 1
+784 2576 1
+784 2579 1
+784 2580 1
+784 2594 1
+784 2597 1
+784 2617 1
+784 2625 1
+784 2643 1
+784 2651 1
+784 2653 1
+784 2654 1
+784 2660 1
+784 2665 1
+784 2685 1
+784 2693 1
+784 2727 1
+784 2746 1
+784 2747 1
+784 2754 1
+784 2763 1
+784 2815 1
+784 2830 1
+784 2859 1
+784 2877 1
+784 2900 1
+784 2951 1
+784 2958 1
+784 2963 1
+784 2973 1
+784 3007 1
+784 3014 1
+784 3020 1
+784 3030 1
+784 3089 1
+784 3117 1
+784 3265 1
+784 3291 1
+784 3307 1
+784 3338 1
+784 3351 1
+784 3352 1
+784 3371 1
+784 3439 1
+784 3443 1
+784 3489 1
+784 3568 1
+784 3587 1
+784 3615 1
+784 3631 1
+784 3650 1
+784 3661 1
+784 3680 1
+784 3720 1
+784 3755 1
+784 3892 1
+784 3976 1
+784 4013 1
+784 4103 1
+784 4179 1
+784 4201 1
+784 4256 1
+784 4263 1
+784 4349 1
+784 4373 1
+784 4384 1
+784 4424 1
+784 4820 1
+784 4875 1
+784 5100 1
+784 8209 1
+784 8290 1
+784 8291 1
+784 8292 1
+784 8293 1
+789 35 1
+789 56 1
+789 72 1
+789 171 1
+789 243 1
+789 259 1
+789 271 1
+789 290 1
+789 299 1
+789 304 1
+789 311 1
+789 313 1
+789 317 1
+789 346 1
+789 407 1
+789 447 1
+789 608 1
+789 637 1
+789 663 1
+789 673 1
+789 697 1
+789 704 1
+789 705 1
+789 710 1
+789 717 1
+789 722 1
+789 730 1
+789 749 1
+789 762 1
+789 769 1
+789 784 1
+789 794 1
+789 795 1
+789 798 1
+789 817 1
+789 844 1
+789 857 1
+789 875 1
+789 887 1
+789 893 1
+789 904 1
+789 930 1
+789 937 1
+789 946 1
+789 947 1
+789 959 1
+789 963 1
+789 971 1
+789 972 1
+789 978 1
+789 985 1
+789 989 1
+789 994 1
+789 999 1
+789 1006 1
+789 1007 1
+789 1014 1
+789 1026 1
+789 1053 1
+789 1061 1
+789 1080 1
+789 1123 1
+789 1151 1
+789 1154 1
+789 1156 1
+789 1159 1
+789 1165 1
+789 1167 1
+789 1186 1
+789 1193 1
+789 1199 1
+789 1200 1
+789 1201 1
+789 1218 1
+789 1220 1
+789 1222 1
+789 1241 1
+789 1243 1
+789 1247 1
+789 1248 1
+789 1266 1
+789 1277 1
+789 1297 1
+789 1310 1
+789 1319 1
+789 1321 1
+789 1322 1
+789 1352 1
+789 1360 1
+789 1374 1
+789 1384 1
+789 1385 1
+789 1390 1
+789 1394 1
+789 1396 1
+789 1413 1
+789 1428 1
+789 1453 1
+789 1468 1
+789 1473 1
+789 1476 1
+789 1497 1
+789 1506 1
+789 1521 1
+789 1525 1
+789 1542 1
+789 1547 1
+789 1549 1
+789 1564 1
+789 1565 1
+789 1585 1
+789 1592 1
+789 1633 1
+789 1638 1
+789 1646 1
+789 1653 1
+789 1657 1
+789 1658 1
+789 1678 1
+789 1680 1
+789 1749 1
+789 1774 1
+789 1780 1
+789 1787 1
+789 1799 1
+789 1805 1
+789 1816 1
+789 1855 1
+789 1888 1
+789 1920 1
+789 1956 1
+789 1966 1
+789 1969 1
+789 1977 1
+789 1979 1
+789 2062 1
+789 2091 1
+789 2102 1
+789 2106 1
+789 2193 1
+789 2210 1
+789 2211 1
+789 2237 1
+789 2240 1
+789 2273 1
+789 2276 1
+789 2281 1
+789 2307 1
+789 2322 1
+789 2326 1
+789 2341 1
+789 2345 1
+789 2350 1
+789 2354 1
+789 2364 1
+789 2381 1
+789 2385 1
+789 2397 1
+789 2398 1
+789 2400 1
+789 2456 1
+789 2507 1
+789 2516 1
+789 2592 1
+789 2593 1
+789 2625 1
+789 2643 1
+789 2669 1
+789 2689 1
+789 2696 1
+789 2754 1
+789 2763 1
+789 2775 1
+789 2777 1
+789 2787 1
+789 2794 1
+789 2809 1
+789 2814 1
+789 2822 1
+789 2831 1
+789 2909 1
+789 3002 1
+789 3027 1
+789 3073 1
+789 3089 1
+789 3092 1
+789 3103 1
+789 3106 1
+789 3191 1
+789 3276 1
+789 3291 1
+789 3334 1
+789 3352 1
+789 3393 1
+789 3417 1
+789 3433 1
+789 3447 1
+789 3452 1
+789 3455 1
+789 3456 1
+789 3458 1
+789 3460 1
+789 3498 1
+789 3537 1
+789 3554 1
+789 3586 1
+789 3607 1
+789 3631 1
+789 3664 1
+789 3748 1
+789 3755 1
+789 3830 1
+789 3843 1
+789 3854 1
+789 3897 1
+789 4037 1
+789 4040 1
+789 4099 1
+789 4103 1
+789 4124 1
+789 4191 1
+789 4212 1
+789 4219 1
+789 4266 1
+789 4297 1
+789 4315 1
+789 4335 1
+789 4338 1
+789 4355 1
+789 4400 1
+789 4441 1
+789 4448 1
+789 4482 1
+789 4527 1
+789 4530 1
+789 4551 1
+789 4587 1
+789 4600 1
+789 4632 1
+789 4687 1
+789 4706 1
+789 4712 1
+789 4715 1
+789 4717 1
+789 4792 1
+789 4797 1
+789 4808 1
+789 4811 1
+789 4814 1
+789 4820 1
+789 4824 1
+789 4827 1
+789 4828 1
+789 4875 1
+789 4929 1
+789 4953 1
+789 4977 1
+789 4999 1
+789 5022 1
+789 5026 1
+789 5055 1
+789 5058 1
+789 5072 1
+789 5073 1
+789 5083 1
+789 5092 1
+789 5100 1
+789 5120 1
+789 5123 1
+789 5130 1
+789 5155 1
+789 5178 1
+789 5182 1
+789 5204 1
+789 5210 1
+789 5222 1
+789 5239 1
+789 5254 1
+789 5288 1
+789 5323 1
+789 5327 1
+789 5335 1
+789 5392 1
+789 5412 1
+789 5430 1
+789 5449 1
+789 5463 1
+789 5470 1
+789 5506 1
+789 5509 1
+789 5511 1
+789 5524 1
+789 5539 1
+789 5543 1
+789 5683 1
+789 5721 1
+789 5743 1
+789 5753 1
+789 5804 1
+789 5817 1
+789 5897 1
+789 5936 1
+789 5994 1
+789 6229 1
+789 6246 1
+789 6262 1
+789 6337 1
+789 6432 1
+789 6481 1
+789 6505 1
+789 6553 1
+789 6606 1
+789 6715 1
+789 6855 1
+789 8290 1
+789 8291 1
+789 8295 1
+785 407 1
+792 733 1
+792 793 1
+791 15 1
+791 35 1
+791 214 1
+791 271 1
+791 647 1
+791 769 1
+791 793 1
+791 794 1
+791 802 1
+791 817 1
+791 959 1
+791 981 1
+791 1022 1
+791 1053 1
+791 1123 1
+791 1193 1
+791 1201 1
+791 1260 1
+791 1270 1
+791 1279 1
+791 1297 1
+791 1428 1
+791 1468 1
+791 1506 1
+791 1597 1
+791 1633 1
+791 1884 1
+791 2535 1
+791 3459 1
+791 4037 1
+791 5079 1
+791 5254 1
+791 5804 1
+791 5811 1
+791 5902 1
+791 5991 1
+791 6417 1
+791 6566 1
+791 6914 1
+791 7899 1
+791 7910 1
+794 86 1
+794 230 1
+794 271 1
+794 407 1
+794 723 1
+794 789 1
+794 795 1
+794 895 1
+794 966 1
+794 982 1
+794 1014 1
+794 1557 1
+794 1564 1
+794 1569 1
+794 1573 1
+794 1633 1
+794 1638 1
+794 3136 1
+795 171 1
+795 243 1
+795 271 1
+795 290 1
+795 304 1
+795 311 1
+795 313 1
+795 317 1
+795 321 1
+795 372 1
+795 447 1
+795 579 1
+795 643 1
+795 704 1
+795 723 1
+795 789 1
+795 794 1
+795 853 1
+795 882 1
+795 887 1
+795 895 1
+795 960 1
+795 963 1
+795 966 1
+795 993 1
+795 999 1
+795 1014 1
+795 1023 1
+795 1034 1
+795 1053 1
+795 1123 1
+795 1167 1
+795 1211 1
+795 1360 1
+795 1413 1
+795 1420 1
+795 1501 1
+795 1524 1
+795 1549 1
+795 1587 1
+795 1595 1
+795 1603 1
+795 1653 1
+795 1692 1
+795 1717 1
+795 1718 1
+795 2053 1
+795 2117 1
+795 2157 1
+795 2210 1
+795 2381 1
+795 2400 1
+795 2775 1
+795 2877 1
+795 2981 1
+795 4037 1
+795 4289 1
+795 4297 1
+795 4384 1
+795 4735 1
+798 978 1
+798 1648 1
+798 1729 1
+798 2289 1
+798 2612 1
+798 3439 1
+798 3568 1
+798 3660 1
+798 3661 1
+798 4349 1
+798 4351 1
+798 4365 1
+798 4373 1
+798 4384 1
+798 4417 1
+798 4424 1
+796 644 1
+796 742 1
+796 797 1
+796 798 1
+796 1031 1
+796 1550 1
+797 324 1
+797 644 1
+797 798 1
+797 817 1
+797 868 1
+802 432 1
+802 769 1
+802 829 1
+802 2643 1
+799 802 1
+800 802 1
+800 829 1
+801 659 1
+801 665 1
+801 749 1
+801 802 1
+801 838 1
+801 2055 1
+803 35 1
+803 659 1
+803 806 1
+803 1420 1
+803 1437 1
+803 1849 1
+804 403 1
+804 749 1
+804 1732 1
+804 1744 1
+804 1746 1
+804 3435 1
+805 35 1
+805 171 1
+805 271 1
+805 290 1
+805 299 1
+805 313 1
+805 579 1
+805 644 1
+805 704 1
+805 710 1
+805 749 1
+805 789 1
+805 813 1
+805 825 1
+805 857 1
+805 871 1
+805 941 1
+805 946 1
+805 948 1
+805 960 1
+805 993 1
+805 994 1
+805 1055 1
+805 1097 1
+805 1103 1
+805 1125 1
+805 1144 1
+805 1164 1
+805 1167 1
+805 1193 1
+805 1201 1
+805 1203 1
+805 1222 1
+805 1230 1
+805 1307 1
+805 1322 1
+805 1374 1
+805 1377 1
+805 1385 1
+805 1390 1
+805 1396 1
+805 1402 1
+805 1413 1
+805 1425 1
+805 1453 1
+805 1468 1
+805 1476 1
+805 1496 1
+805 1497 1
+805 1501 1
+805 1506 1
+805 1514 1
+805 1542 1
+805 1573 1
+805 1580 1
+805 1593 1
+805 1603 1
+805 1604 1
+805 1628 1
+805 1633 1
+805 1658 1
+805 1783 1
+805 1842 1
+805 1847 1
+805 1855 1
+805 1884 1
+805 1956 1
+805 1969 1
+805 2066 1
+805 2106 1
+805 2237 1
+805 2297 1
+805 2398 1
+805 2689 1
+805 2774 1
+805 2811 1
+805 3009 1
+805 3192 1
+805 3291 1
+805 3309 1
+805 3352 1
+805 3435 1
+805 3443 1
+805 3800 1
+805 4289 1
+805 4384 1
+805 5022 1
+805 5605 1
+805 6770 1
+805 7862 1
+807 806 1
+808 8 1
+808 271 1
+808 1043 1
+808 3557 1
+810 35 1
+810 171 1
+810 290 1
+810 299 1
+810 304 1
+810 313 1
+810 324 1
+810 407 1
+810 647 1
+810 704 1
+810 705 1
+810 791 1
+810 805 1
+810 817 1
+810 959 1
+810 977 1
+810 989 1
+810 1007 1
+810 1029 1
+810 1140 1
+810 1186 1
+810 1191 1
+810 1199 1
+810 1218 1
+810 1297 1
+810 1322 1
+810 1514 1
+810 1597 1
+810 1679 1
+810 1716 1
+810 1718 1
+810 1758 1
+810 1793 1
+810 3755 1
+811 817 1
+811 1531 1
+811 1864 1
+812 36 1
+812 817 1
+812 822 1
+813 72 1
+813 86 1
+813 204 1
+813 298 1
+813 332 1
+813 350 1
+813 407 1
+813 432 1
+813 439 1
+813 559 1
+813 579 1
+813 608 1
+813 691 1
+813 704 1
+813 722 1
+813 733 1
+813 762 1
+813 763 1
+813 805 1
+813 817 1
+813 822 1
+813 825 1
+813 859 1
+813 864 1
+813 871 1
+813 878 1
+813 887 1
+813 908 1
+813 937 1
+813 941 1
+813 946 1
+813 947 1
+813 958 1
+813 959 1
+813 968 1
+813 974 1
+813 993 1
+813 994 1
+813 1018 1
+813 1031 1
+813 1035 1
+813 1049 1
+813 1055 1
+813 1097 1
+813 1137 1
+813 1157 1
+813 1166 1
+813 1167 1
+813 1186 1
+813 1193 1
+813 1211 1
+813 1230 1
+813 1239 1
+813 1248 1
+813 1250 1
+813 1253 1
+813 1267 1
+813 1279 1
+813 1284 1
+813 1285 1
+813 1291 1
+813 1296 1
+813 1297 1
+813 1315 1
+813 1319 1
+813 1357 1
+813 1360 1
+813 1374 1
+813 1378 1
+813 1384 1
+813 1385 1
+813 1413 1
+813 1419 1
+813 1428 1
+813 1437 1
+813 1444 1
+813 1471 1
+813 1476 1
+813 1482 1
+813 1492 1
+813 1496 1
+813 1521 1
+813 1525 1
+813 1534 1
+813 1542 1
+813 1547 1
+813 1549 1
+813 1565 1
+813 1566 1
+813 1571 1
+813 1585 1
+813 1597 1
+813 1603 1
+813 1608 1
+813 1646 1
+813 1653 1
+813 1658 1
+813 1661 1
+813 1705 1
+813 1717 1
+813 1723 1
+813 1726 1
+813 1730 1
+813 1734 1
+813 1744 1
+813 1746 1
+813 1754 1
+813 1808 1
+813 1835 1
+813 1836 1
+813 1837 1
+813 1842 1
+813 1847 1
+813 1888 1
+813 1893 1
+813 1908 1
+813 1915 1
+813 1919 1
+813 1927 1
+813 1964 1
+813 1987 1
+813 1990 1
+813 1991 1
+813 1992 1
+813 2016 1
+813 2066 1
+813 2071 1
+813 2073 1
+813 2076 1
+813 2079 1
+813 2128 1
+813 2134 1
+813 2144 1
+813 2174 1
+813 2193 1
+813 2209 1
+813 2210 1
+813 2241 1
+813 2251 1
+813 2252 1
+813 2264 1
+813 2290 1
+813 2297 1
+813 2322 1
+813 2323 1
+813 2324 1
+813 2328 1
+813 2329 1
+813 2354 1
+813 2371 1
+813 2375 1
+813 2384 1
+813 2385 1
+813 2400 1
+813 2410 1
+813 2411 1
+813 2470 1
+813 2475 1
+813 2485 1
+813 2506 1
+813 2510 1
+813 2542 1
+813 2544 1
+813 2560 1
+813 2565 1
+813 2579 1
+813 2593 1
+813 2595 1
+813 2597 1
+813 2619 1
+813 2643 1
+813 2653 1
+813 2654 1
+813 2655 1
+813 2660 1
+813 2665 1
+813 2669 1
+813 2674 1
+813 2687 1
+813 2693 1
+813 2696 1
+813 2707 1
+813 2727 1
+813 2747 1
+813 2763 1
+813 2790 1
+813 2815 1
+813 2819 1
+813 2859 1
+813 2871 1
+813 2925 1
+813 2932 1
+813 2955 1
+813 2958 1
+813 2963 1
+813 2968 1
+813 2973 1
+813 2981 1
+813 2999 1
+813 3005 1
+813 3024 1
+813 3026 1
+813 3029 1
+813 3033 1
+813 3034 1
+813 3059 1
+813 3103 1
+813 3148 1
+813 3173 1
+813 3192 1
+813 3258 1
+813 3276 1
+813 3284 1
+813 3352 1
+813 3394 1
+813 3404 1
+813 3433 1
+813 3473 1
+813 3489 1
+813 3520 1
+813 3537 1
+813 3557 1
+813 3580 1
+813 3587 1
+813 3615 1
+813 3646 1
+813 3650 1
+813 3681 1
+813 3713 1
+813 3724 1
+813 3748 1
+813 3847 1
+813 3854 1
+813 3875 1
+813 3967 1
+813 3976 1
+813 4041 1
+813 4043 1
+813 4055 1
+813 4124 1
+813 4138 1
+813 4162 1
+813 4179 1
+813 4181 1
+813 4256 1
+813 4263 1
+813 4269 1
+813 4289 1
+813 4290 1
+813 4402 1
+813 4578 1
+813 4613 1
+813 4653 1
+813 4712 1
+813 4735 1
+813 4781 1
+813 4828 1
+813 4999 1
+813 5026 1
+813 5092 1
+813 5100 1
+813 5103 1
+813 5123 1
+813 5543 1
+813 5753 1
+813 5848 1
+813 5925 1
+813 6098 1
+813 6124 1
+813 6400 1
+813 8293 1
+813 8294 1
+814 817 1
+814 893 1
+814 979 1
+815 817 1
+815 829 1
+816 15 1
+816 72 1
+816 227 1
+816 304 1
+816 488 1
+816 644 1
+816 742 1
+816 763 1
+816 784 1
+816 797 1
+816 817 1
+816 829 1
+816 871 1
+816 993 1
+816 1193 1
+816 1218 1
+816 1453 1
+816 1497 1
+816 1648 1
+816 1697 1
+816 2339 1
+816 2775 1
+816 3922 1
+816 4289 1
+816 4463 1
+816 5132 1
+816 5254 1
+816 6166 1
+816 6306 1
+822 813 1
+822 1137 1
+822 1315 1
+822 1566 1
+822 1908 1
+822 2016 1
+822 2371 1
+822 3026 1
+822 3537 1
+822 3748 1
+822 3854 1
+819 822 1
+820 559 1
+820 822 1
+820 1123 1
+820 1186 1
+820 1506 1
+820 1514 1
+820 1819 1
+820 1842 1
+820 1918 1
+820 2120 1
+820 2237 1
+820 2240 1
+820 2322 1
+820 2397 1
+820 2400 1
+820 4110 1
+821 822 1
+334 29 1
+334 36 1
+334 56 1
+334 86 1
+334 271 1
+334 313 1
+334 317 1
+334 545 1
+334 643 1
+334 697 1
+334 704 1
+334 741 1
+334 789 1
+334 822 1
+334 829 1
+334 838 1
+334 839 1
+334 849 1
+334 863 1
+334 864 1
+334 885 1
+334 893 1
+334 918 1
+334 932 1
+334 941 1
+334 945 1
+334 955 1
+334 985 1
+334 989 1
+334 1014 1
+334 1023 1
+334 1201 1
+334 1203 1
+334 1218 1
+334 1286 1
+334 1307 1
+334 1413 1
+334 1774 1
+334 2202 1
+334 2329 1
+334 4179 1
+818 822 1
+818 932 1
+823 29 1
+823 243 1
+823 304 1
+823 313 1
+823 439 1
+823 626 1
+823 677 1
+823 686 1
+823 697 1
+823 789 1
+823 955 1
+823 979 1
+823 1026 1
+823 1131 1
+823 3465 1
+824 677 1
+824 1186 1
+826 56 1
+826 204 1
+826 290 1
+826 332 1
+826 372 1
+826 403 1
+826 407 1
+826 415 1
+826 425 1
+826 575 1
+826 633 1
+826 665 1
+826 761 1
+826 765 1
+826 871 1
+826 887 1
+826 908 1
+826 937 1
+826 946 1
+826 948 1
+826 960 1
+826 968 1
+826 993 1
+826 1049 1
+826 1055 1
+826 1061 1
+826 1124 1
+826 1151 1
+826 1154 1
+826 1165 1
+826 1167 1
+826 1168 1
+826 1199 1
+826 1211 1
+826 1230 1
+826 1253 1
+826 1267 1
+826 1279 1
+826 1297 1
+826 1319 1
+826 1322 1
+826 1357 1
+826 1374 1
+826 1377 1
+826 1416 1
+826 1428 1
+826 1437 1
+826 1441 1
+826 1444 1
+826 1471 1
+826 1482 1
+826 1484 1
+826 1487 1
+826 1490 1
+826 1492 1
+826 1496 1
+826 1497 1
+826 1506 1
+826 1507 1
+826 1513 1
+826 1514 1
+826 1518 1
+826 1520 1
+826 1521 1
+826 1531 1
+826 1532 1
+826 1533 1
+826 1534 1
+826 1537 1
+826 1538 1
+826 1556 1
+826 1557 1
+826 1563 1
+826 1565 1
+826 1566 1
+826 1571 1
+826 1573 1
+826 1585 1
+826 1595 1
+826 1596 1
+826 1597 1
+826 1600 1
+826 1604 1
+826 1613 1
+826 1618 1
+826 1619 1
+826 1622 1
+826 1633 1
+826 1636 1
+826 1638 1
+826 1641 1
+826 1653 1
+826 1661 1
+826 1672 1
+826 1679 1
+826 1680 1
+826 1687 1
+826 1705 1
+826 1717 1
+826 1718 1
+826 1723 1
+826 1732 1
+826 1734 1
+826 1749 1
+826 1754 1
+826 1757 1
+826 1768 1
+826 1772 1
+826 1774 1
+826 1781 1
+826 1792 1
+826 1805 1
+826 1814 1
+826 1816 1
+826 1836 1
+826 1837 1
+826 1842 1
+826 1849 1
+826 1880 1
+826 1893 1
+826 1908 1
+826 1918 1
+826 1919 1
+826 1927 1
+826 1953 1
+826 1963 1
+826 1966 1
+826 1970 1
+826 1973 1
+826 1979 1
+826 1984 1
+826 1987 1
+826 1991 1
+826 1992 1
+826 2016 1
+826 2053 1
+826 2055 1
+826 2066 1
+826 2076 1
+826 2101 1
+826 2106 1
+826 2116 1
+826 2120 1
+826 2128 1
+826 2157 1
+826 2174 1
+826 2182 1
+826 2225 1
+826 2231 1
+826 2237 1
+826 2240 1
+826 2242 1
+826 2251 1
+826 2256 1
+826 2294 1
+826 2322 1
+826 2323 1
+826 2325 1
+826 2338 1
+826 2340 1
+826 2341 1
+826 2348 1
+826 2356 1
+826 2371 1
+826 2375 1
+826 2385 1
+826 2400 1
+826 2410 1
+826 2474 1
+826 2490 1
+826 2501 1
+826 2504 1
+826 2542 1
+826 2550 1
+826 2570 1
+826 2571 1
+826 2575 1
+826 2576 1
+826 2580 1
+826 2593 1
+826 2594 1
+826 2617 1
+826 2623 1
+826 2625 1
+826 2629 1
+826 2638 1
+826 2643 1
+826 2651 1
+826 2654 1
+826 2662 1
+826 2670 1
+826 2697 1
+826 2708 1
+826 2713 1
+826 2720 1
+826 2724 1
+826 2785 1
+826 2787 1
+826 2797 1
+826 2805 1
+826 2809 1
+826 2815 1
+826 2819 1
+826 2830 1
+826 2838 1
+826 2856 1
+826 2880 1
+826 2900 1
+826 2912 1
+826 2922 1
+826 2946 1
+826 2955 1
+826 2966 1
+826 2968 1
+826 2972 1
+826 2977 1
+826 2979 1
+826 2999 1
+826 3018 1
+826 3021 1
+826 3029 1
+826 3033 1
+826 3034 1
+826 3056 1
+826 3089 1
+826 3099 1
+826 3105 1
+826 3117 1
+826 3130 1
+826 3136 1
+826 3140 1
+826 3150 1
+826 3235 1
+826 3251 1
+826 3253 1
+826 3258 1
+826 3307 1
+826 3320 1
+826 3338 1
+826 3351 1
+826 3371 1
+826 3408 1
+826 3446 1
+826 3473 1
+826 3489 1
+826 3506 1
+826 3516 1
+826 3755 1
+826 8290 1
+825 15 1
+825 72 1
+825 417 1
+825 465 1
+825 737 1
+825 826 1
+825 827 1
+825 1026 1
+825 1166 1
+825 1307 1
+825 1310 1
+825 1549 1
+825 1680 1
+825 1706 1
+825 1754 1
+825 1769 1
+825 1823 1
+825 2066 1
+825 2102 1
+825 2145 1
+825 2209 1
+825 2237 1
+825 2252 1
+825 2276 1
+825 2285 1
+825 2290 1
+825 2328 1
+825 2398 1
+825 2411 1
+825 2416 1
+825 2456 1
+825 2485 1
+825 2508 1
+825 2516 1
+825 2576 1
+825 2585 1
+825 2619 1
+825 2625 1
+825 2653 1
+825 2660 1
+825 2667 1
+825 2674 1
+825 2686 1
+825 2700 1
+825 2790 1
+825 2794 1
+825 2799 1
+825 2871 1
+825 2917 1
+825 2940 1
+825 2958 1
+825 3024 1
+825 3026 1
+825 3028 1
+825 3084 1
+825 3103 1
+825 3117 1
+825 3125 1
+825 3140 1
+825 3148 1
+825 3192 1
+825 3258 1
+825 3276 1
+825 3321 1
+825 3334 1
+825 3352 1
+825 3447 1
+825 3456 1
+825 3473 1
+825 3537 1
+825 3548 1
+825 3562 1
+825 3568 1
+825 3587 1
+825 3614 1
+825 3631 1
+825 3635 1
+825 3650 1
+825 3660 1
+825 3748 1
+825 3796 1
+825 3800 1
+825 3816 1
+825 3822 1
+825 3835 1
+825 3892 1
+825 3908 1
+825 3910 1
+825 3926 1
+825 3946 1
+825 3969 1
+825 3970 1
+825 3976 1
+825 4024 1
+825 4030 1
+825 4037 1
+825 4043 1
+825 4051 1
+825 4058 1
+825 4099 1
+825 4103 1
+825 4110 1
+825 4124 1
+825 4173 1
+825 4191 1
+825 4261 1
+825 4310 1
+825 4412 1
+825 4417 1
+825 4463 1
+825 4530 1
+825 4551 1
+825 4578 1
+825 4678 1
+825 4687 1
+825 4735 1
+825 4783 1
+825 4820 1
+825 4827 1
+825 4986 1
+825 5020 1
+825 5123 1
+825 5233 1
+825 5262 1
+825 5263 1
+825 5301 1
+825 5351 1
+825 5412 1
+825 5423 1
+825 5426 1
+825 5454 1
+825 5459 1
+825 5484 1
+825 5487 1
+825 5524 1
+825 5527 1
+825 5545 1
+825 5568 1
+825 5592 1
+825 5620 1
+825 5623 1
+825 5640 1
+825 5737 1
+825 5740 1
+825 5743 1
+825 5745 1
+825 5817 1
+825 5828 1
+825 5963 1
+825 6218 1
+825 6229 1
+825 6246 1
+825 6251 1
+825 6327 1
+825 6337 1
+825 6360 1
+825 6590 1
+825 6592 1
+825 6600 1
+825 6628 1
+825 7250 1
+825 7809 1
+825 7839 1
+825 8246 1
+825 8293 1
+830 829 1
+830 993 1
+830 2157 1
+832 407 1
+832 829 1
+832 878 1
+831 829 1
+831 1111 1
+831 1413 1
+831 1811 1
+831 1855 1
+831 1858 1
+831 1927 1
+831 2085 1
+831 2091 1
+831 2095 1
+831 2247 1
+831 5162 1
+835 829 1
+836 429 1
+836 665 1
+836 763 1
+836 765 1
+836 993 1
+836 1428 1
+836 1442 1
+836 1525 1
+836 1621 1
+836 1705 1
+836 1723 1
+836 1734 1
+836 1754 1
+836 1802 1
+836 1805 1
+836 1848 1
+836 1901 1
+836 1997 1
+836 2225 1
+836 2240 1
+836 2256 1
+836 2625 1
+836 2763 1
+836 3026 1
+836 3480 1
+836 3847 1
+837 230 1
+837 839 1
+837 2071 1
+837 6229 1
+838 204 1
+838 230 1
+838 308 1
+838 334 1
+838 417 1
+838 506 1
+838 643 1
+838 730 1
+838 810 1
+838 839 1
+838 844 1
+838 857 1
+838 864 1
+838 866 1
+838 878 1
+838 881 1
+838 882 1
+838 885 1
+838 904 1
+838 932 1
+838 1124 1
+838 1199 1
+838 1322 1
+838 1717 1
+838 1718 1
+838 1732 1
+838 1746 1
+838 1747 1
+838 1752 1
+838 2053 1
+838 2416 1
+838 2799 1
+838 3009 1
+838 3516 1
+838 3548 1
+838 6004 1
+841 56 1
+841 765 1
+841 837 1
+841 1154 1
+841 1291 1
+841 1315 1
+841 1521 1
+841 1653 1
+841 1680 1
+841 1723 1
+841 2014 1
+841 2102 1
+841 2256 1
+841 2323 1
+841 2340 1
+841 2369 1
+841 2375 1
+841 2381 1
+841 2416 1
+841 2516 1
+841 2599 1
+841 2618 1
+841 2625 1
+841 2707 1
+841 2721 1
+841 2754 1
+841 2763 1
+841 2768 1
+841 2770 1
+841 2801 1
+841 2805 1
+841 2814 1
+841 2815 1
+841 2828 1
+841 2844 1
+841 2877 1
+841 2880 1
+841 2918 1
+841 2926 1
+841 2968 1
+841 2993 1
+841 2999 1
+841 3029 1
+841 3034 1
+841 3056 1
+841 3092 1
+841 3251 1
+841 3664 1
+841 3803 1
+841 3914 1
+841 4044 1
+841 4335 1
+841 4645 1
+841 4828 1
+841 4964 1
+841 5132 1
+841 5144 1
+841 5162 1
+841 5204 1
+841 5215 1
+841 5222 1
+840 837 1
+840 3962 1
+840 5002 1
+840 6618 1
+840 6784 1
+840 6790 1
+840 7063 1
+844 299 1
+844 308 1
+844 313 1
+844 432 1
+844 545 1
+844 579 1
+844 637 1
+844 663 1
+844 682 1
+844 730 1
+844 794 1
+844 795 1
+844 805 1
+844 857 1
+844 935 1
+844 936 1
+844 945 1
+844 959 1
+844 966 1
+844 989 1
+844 1007 1
+844 1014 1
+844 1026 1
+844 1043 1
+844 1044 1
+844 1053 1
+844 1125 1
+844 1160 1
+844 1186 1
+844 1218 1
+844 1286 1
+844 1468 1
+844 1629 1
+844 1717 1
+844 1723 1
+844 1726 1
+844 1833 1
+844 1859 1
+844 2409 1
+844 2646 1
+844 3352 1
+844 3645 1
+844 4110 1
+844 4453 1
+844 4666 1
+842 56 1
+842 171 1
+842 290 1
+842 844 1
+842 853 1
+842 935 1
+842 936 1
+842 937 1
+842 945 1
+842 948 1
+842 1124 1
+842 1144 1
+842 1166 1
+842 1284 1
+842 1286 1
+842 1688 1
+842 1706 1
+842 1726 1
+842 1859 1
+842 1966 1
+842 2251 1
+842 2411 1
+842 2485 1
+842 2686 1
+842 2996 1
+842 3018 1
+842 3320 1
+842 3352 1
+842 4055 1
+842 4110 1
+843 844 1
+845 838 1
+847 838 1
+848 228 1
+848 308 1
+848 317 1
+848 643 1
+848 838 1
+848 881 1
+848 882 1
+848 893 1
+851 857 1
+851 1484 1
+854 15 1
+854 72 1
+854 762 1
+854 857 1
+854 863 1
+854 875 1
+854 904 1
+854 968 1
+854 972 1
+854 978 1
+854 981 1
+854 1127 1
+854 1211 1
+854 1297 1
+854 1319 1
+854 1384 1
+854 1385 1
+854 1389 1
+854 1416 1
+854 1420 1
+854 1437 1
+854 1532 1
+854 1538 1
+854 1549 1
+854 1557 1
+854 1564 1
+854 1596 1
+854 1637 1
+854 1672 1
+854 1679 1
+854 1770 1
+854 1836 1
+854 1848 1
+854 1861 1
+854 1864 1
+854 1983 1
+854 2072 1
+854 2091 1
+854 2095 1
+854 2101 1
+854 2112 1
+854 2117 1
+854 2121 1
+854 2135 1
+854 2145 1
+854 2182 1
+854 2206 1
+854 2234 1
+854 2251 1
+854 2297 1
+854 2329 1
+854 2378 1
+854 2411 1
+854 2426 1
+854 2470 1
+854 2484 1
+854 2490 1
+854 2499 1
+854 2565 1
+854 2570 1
+854 2571 1
+854 2589 1
+854 2629 1
+854 2638 1
+854 2651 1
+854 2660 1
+854 2801 1
+854 2825 1
+854 2828 1
+854 2880 1
+854 2963 1
+854 2966 1
+854 3050 1
+854 3238 1
+854 3253 1
+854 3393 1
+854 3439 1
+854 3456 1
+854 3873 1
+854 3976 1
+854 4175 1
+854 4179 1
+854 4385 1
+854 4712 1
+854 4717 1
+854 4792 1
+854 4827 1
+854 4929 1
+854 5200 1
+854 5254 1
+854 5684 1
+854 5994 1
+854 6251 1
+854 6496 1
+854 6715 1
+854 7092 1
+854 7890 1
+854 8174 1
+854 8192 1
+855 857 1
+855 1014 1
+856 825 1
+856 857 1
+856 897 1
+856 1305 1
+856 1307 1
+856 1374 1
+856 1453 1
+856 1521 1
+856 1596 1
+856 1679 1
+856 1814 1
+856 2210 1
+856 2231 1
+856 2252 1
+856 2328 1
+856 2338 1
+856 2411 1
+856 2508 1
+856 2535 1
+856 2542 1
+856 2565 1
+856 2594 1
+856 2619 1
+856 2643 1
+856 2651 1
+856 2660 1
+856 2662 1
+856 2669 1
+856 2674 1
+856 2686 1
+856 2693 1
+856 2700 1
+856 2713 1
+856 2747 1
+856 2754 1
+856 2815 1
+856 2831 1
+856 2900 1
+856 2951 1
+856 2973 1
+856 3018 1
+856 3030 1
+856 3084 1
+856 3089 1
+856 3191 1
+856 3276 1
+856 3307 1
+856 3334 1
+856 3338 1
+856 3348 1
+856 3371 1
+856 3435 1
+856 3446 1
+856 3459 1
+856 3465 1
+856 3506 1
+856 3516 1
+856 3541 1
+856 3670 1
+856 3680 1
+856 3803 1
+856 3849 1
+856 3962 1
+856 4014 1
+856 4037 1
+856 4058 1
+856 4103 1
+856 4110 1
+856 4191 1
+856 4233 1
+856 4361 1
+856 4584 1
+856 4820 1
+856 5002 1
+856 5083 1
+856 5233 1
+856 5511 1
+856 5529 1
+856 6299 1
+856 6347 1
+856 6665 1
+856 6700 1
+856 6720 1
+856 6739 1
+856 6833 1
+856 6855 1
+856 6914 1
+856 6946 1
+856 7351 1
+856 7620 1
+856 7803 1
+852 15 1
+852 86 1
+852 243 1
+852 308 1
+852 417 1
+852 545 1
+852 579 1
+852 762 1
+852 857 1
+852 913 1
+852 989 1
+852 991 1
+852 993 1
+852 1053 1
+852 1211 1
+852 1248 1
+852 1297 1
+852 1471 1
+852 1638 1
+852 1649 1
+852 1654 1
+852 1692 1
+852 2053 1
+852 2066 1
+852 2210 1
+852 2323 1
+852 2535 1
+852 2653 1
+852 3479 1
+852 3755 1
+852 3873 1
+852 3946 1
+852 3976 1
+852 4037 1
+852 4453 1
+852 4687 1
+852 5079 1
+852 6255 1
+852 7632 1
+853 230 1
+853 299 1
+853 317 1
+853 488 1
+853 663 1
+853 674 1
+853 697 1
+853 789 1
+853 857 1
+853 868 1
+853 904 1
+853 985 1
+853 1412 1
+853 1464 1
+853 1726 1
+853 2910 1
+859 86 1
+859 308 1
+859 959 1
+859 1211 1
+859 1297 1
+859 1492 1
+859 1547 1
+859 1700 1
+859 1836 1
+859 1842 1
+859 2062 1
+859 2397 1
+859 2409 1
+860 228 1
+860 308 1
+860 317 1
+860 643 1
+860 730 1
+860 906 1
+860 934 1
+860 955 1
+861 204 1
+861 308 1
+861 579 1
+861 707 1
+861 762 1
+861 941 1
+861 1026 1
+861 1038 1
+861 1253 1
+861 1496 1
+861 1608 1
+861 1859 1
+861 1992 1
+861 2625 1
+861 2685 1
+861 3680 1
+862 637 1
+862 849 1
+862 897 1
+863 637 1
+863 849 1
+863 897 1
+863 906 1
+863 2160 1
+865 15 1
+865 35 1
+865 72 1
+865 86 1
+865 204 1
+865 214 1
+865 228 1
+865 243 1
+865 259 1
+865 271 1
+865 317 1
+865 407 1
+865 417 1
+865 626 1
+865 663 1
+865 665 1
+865 682 1
+865 705 1
+865 730 1
+865 762 1
+865 769 1
+865 784 1
+865 810 1
+865 849 1
+865 857 1
+865 866 1
+865 882 1
+865 893 1
+865 895 1
+865 897 1
+865 929 1
+865 930 1
+865 936 1
+865 942 1
+865 945 1
+865 1026 1
+865 1030 1
+865 1053 1
+865 1080 1
+865 1092 1
+865 1144 1
+865 1156 1
+865 1186 1
+865 1211 1
+865 1222 1
+865 1315 1
+865 1473 1
+865 1497 1
+865 1525 1
+865 1549 1
+865 1563 1
+865 1573 1
+865 1717 1
+865 1808 1
+865 1855 1
+865 2016 1
+865 2060 1
+865 2066 1
+865 2182 1
+865 2210 1
+865 2297 1
+865 2323 1
+865 2398 1
+865 2490 1
+865 2535 1
+865 2542 1
+865 2595 1
+865 2617 1
+865 2625 1
+865 2643 1
+865 2654 1
+865 2660 1
+865 2669 1
+865 2685 1
+865 2687 1
+865 2838 1
+865 2877 1
+865 2880 1
+865 3018 1
+865 3089 1
+865 3291 1
+865 3393 1
+865 3554 1
+865 4021 1
+865 4247 1
+865 4276 1
+865 4846 1
+865 5254 1
+865 5412 1
+865 5423 1
+865 5482 1
+865 5743 1
+865 6328 1
+865 6388 1
+865 6566 1
+865 8292 1
+865 8293 1
+867 868 1
+869 674 1
+869 882 1
+869 941 1
+869 1006 1
+869 1190 1
+869 1191 1
+869 1192 1
+869 1196 1
+869 1547 1
+869 1654 1
+869 2707 1
+870 86 1
+870 171 1
+870 243 1
+870 271 1
+870 298 1
+870 299 1
+870 559 1
+870 579 1
+870 674 1
+870 730 1
+870 733 1
+870 761 1
+870 857 1
+870 861 1
+870 887 1
+870 896 1
+870 993 1
+870 1234 1
+870 1248 1
+870 1279 1
+870 1319 1
+870 1322 1
+870 1428 1
+870 1487 1
+870 1514 1
+870 1520 1
+870 1555 1
+870 1569 1
+870 1573 1
+870 1603 1
+870 1641 1
+870 1654 1
+870 1687 1
+870 1746 1
+870 1768 1
+870 1893 1
+870 1953 1
+870 1966 1
+871 35 1
+871 171 1
+871 214 1
+871 290 1
+871 299 1
+871 311 1
+871 697 1
+871 710 1
+871 717 1
+871 784 1
+871 805 1
+871 826 1
+871 857 1
+871 875 1
+871 941 1
+871 943 1
+871 960 1
+871 971 1
+871 982 1
+871 999 1
+871 1055 1
+871 1062 1
+871 1167 1
+871 1168 1
+871 1193 1
+871 1211 1
+871 1222 1
+871 1241 1
+871 1286 1
+871 1287 1
+871 1377 1
+871 1439 1
+871 1446 1
+871 1453 1
+871 1465 1
+871 1468 1
+871 1471 1
+871 1484 1
+871 1490 1
+871 1506 1
+871 1513 1
+871 1518 1
+871 1524 1
+871 1532 1
+871 1538 1
+871 1612 1
+871 1633 1
+871 1816 1
+871 1859 1
+871 1919 1
+871 1953 1
+871 1966 1
+871 2830 1
+871 2834 1
+871 2990 1
+871 2993 1
+871 2996 1
+871 3023 1
+871 3050 1
+873 643 1
+873 730 1
+873 849 1
+873 875 1
+873 2062 1
+874 875 1
+876 878 1
+877 313 1
+877 878 1
+879 35 1
+879 259 1
+879 432 1
+879 608 1
+879 737 1
+879 810 1
+879 825 1
+879 881 1
+879 1151 1
+879 1166 1
+879 1297 1
+879 1305 1
+879 1382 1
+879 1453 1
+879 1549 1
+879 1744 1
+879 1919 1
+879 1990 1
+879 2072 1
+879 2144 1
+879 2209 1
+879 2237 1
+879 2240 1
+879 2257 1
+879 2297 1
+879 2328 1
+879 2364 1
+879 2381 1
+879 2398 1
+879 2508 1
+879 2517 1
+879 2565 1
+879 2585 1
+879 2612 1
+879 2646 1
+879 2653 1
+879 2655 1
+879 2657 1
+879 2674 1
+879 2746 1
+879 2760 1
+879 2811 1
+879 2859 1
+879 2871 1
+879 2973 1
+879 3014 1
+879 3026 1
+879 3028 1
+879 3059 1
+879 3125 1
+879 3148 1
+879 3180 1
+879 3200 1
+879 3260 1
+879 3276 1
+879 3321 1
+879 3334 1
+879 3352 1
+879 3394 1
+879 3439 1
+879 3443 1
+879 3447 1
+879 3453 1
+879 3454 1
+879 3456 1
+879 3516 1
+879 3537 1
+879 3557 1
+879 3562 1
+879 3568 1
+879 3607 1
+879 3635 1
+879 3643 1
+879 3650 1
+879 3661 1
+879 3680 1
+879 3745 1
+879 3812 1
+879 3843 1
+879 3871 1
+879 3875 1
+879 3892 1
+879 3897 1
+879 3942 1
+879 3956 1
+879 3976 1
+879 4011 1
+879 4040 1
+879 4044 1
+879 4051 1
+879 4124 1
+879 4162 1
+879 4191 1
+879 4212 1
+879 4261 1
+879 4266 1
+879 4290 1
+879 4323 1
+879 4335 1
+879 4359 1
+879 4385 1
+879 4402 1
+879 4448 1
+879 4463 1
+879 4485 1
+879 4528 1
+879 4531 1
+879 4550 1
+879 4578 1
+879 4613 1
+879 4639 1
+879 4661 1
+879 4662 1
+879 4735 1
+879 4814 1
+879 4938 1
+879 4962 1
+879 5295 1
+879 5739 1
+879 5800 1
+879 5829 1
+879 6323 1
+880 881 1
+882 271 1
+882 317 1
+882 897 1
+882 963 1
+882 985 1
+882 1053 1
+882 1569 1
+883 407 1
+883 730 1
+883 1043 1
+885 794 1
+885 937 1
+885 977 1
+885 995 1
+885 1144 1
+885 1556 1
+885 1563 1
+886 407 1
+886 643 1
+886 7699 1
+887 863 1
+888 863 1
+889 863 1
+890 863 1
+891 863 1
+892 893 1
+469 608 1
+469 893 1
+469 1186 1
+469 1717 1
+469 1855 1
+469 1956 1
+469 3408 1
+469 5254 1
+469 5714 1
+469 7131 1
+895 86 1
+895 271 1
+895 741 1
+895 794 1
+895 1569 1
+895 2763 1
+897 227 1
+896 86 1
+896 439 1
+896 696 1
+896 741 1
+896 897 1
+896 1053 1
+896 1123 1
+896 1125 1
+896 1901 1
+896 2499 1
+896 3498 1
+896 3843 1
+896 3856 1
+896 4037 1
+896 4310 1
+896 5254 1
+896 5335 1
+896 5465 1
+896 5563 1
+896 5798 1
+896 6299 1
+896 6780 1
+896 6934 1
+896 6979 1
+896 7094 1
+896 7961 1
+898 86 1
+898 762 1
+898 849 1
+898 897 1
+898 1026 1
+898 2511 1
+898 2764 1
+898 2765 1
+898 4796 1
+898 5412 1
+900 228 1
+900 407 1
+900 1193 1
+900 1323 1
+900 2007 1
+902 849 1
+902 1385 1
+904 35 1
+904 171 1
+904 230 1
+904 259 1
+904 372 1
+904 407 1
+904 506 1
+904 559 1
+904 575 1
+904 587 1
+904 761 1
+904 763 1
+904 797 1
+904 810 1
+904 857 1
+904 928 1
+904 959 1
+904 971 1
+904 982 1
+904 993 1
+904 999 1
+904 1014 1
+904 1031 1
+904 1097 1
+904 1103 1
+904 1127 1
+904 1151 1
+904 1154 1
+904 1160 1
+904 1165 1
+904 1199 1
+904 1211 1
+904 1222 1
+904 1243 1
+904 1261 1
+904 1296 1
+904 1319 1
+904 1322 1
+904 1326 1
+904 1330 1
+904 1374 1
+904 1375 1
+904 1390 1
+904 1442 1
+904 1453 1
+904 1465 1
+904 1471 1
+904 1478 1
+904 1485 1
+904 1486 1
+904 1487 1
+904 1490 1
+904 1496 1
+904 1513 1
+904 1525 1
+904 1542 1
+904 1547 1
+904 1549 1
+904 1610 1
+904 1629 1
+904 1633 1
+904 1649 1
+904 1678 1
+904 1700 1
+904 1716 1
+904 1717 1
+904 1718 1
+904 1732 1
+904 1746 1
+904 1747 1
+904 1749 1
+904 1752 1
+904 1757 1
+904 1758 1
+904 1768 1
+904 1771 1
+904 1774 1
+904 1783 1
+904 1787 1
+904 1788 1
+904 1791 1
+904 1798 1
+904 1819 1
+904 1833 1
+904 1842 1
+904 1847 1
+904 1849 1
+904 1855 1
+904 1857 1
+904 1861 1
+904 1864 1
+904 1918 1
+904 1920 1
+904 1963 1
+904 1973 1
+904 1979 1
+904 1997 1
+904 2145 1
+904 2157 1
+904 2210 1
+904 2253 1
+904 2273 1
+904 2276 1
+904 2281 1
+904 2290 1
+904 2307 1
+904 2322 1
+904 2348 1
+904 2385 1
+904 2397 1
+904 2400 1
+904 2571 1
+904 2604 1
+904 2643 1
+904 2751 1
+904 2754 1
+904 3084 1
+904 3755 1
+904 8291 1
+903 904 1
+905 86 1
+905 906 1
+907 259 1
+907 704 1
+907 733 1
+907 959 1
+907 1734 1
+907 2211 1
+907 2281 1
+907 2470 1
+907 8291 1
+908 439 1
+908 958 1
+908 1297 1
+908 1836 1
+908 1849 1
+908 2763 1
+908 2801 1
+908 3755 1
+908 4735 1
+909 86 1
+909 439 1
+909 938 1
+909 3334 1
+909 5079 1
+909 5233 1
+909 6789 1
+909 6953 1
+909 7407 1
+909 7422 1
+909 7439 1
+909 7478 1
+910 86 1
+910 439 1
+911 86 1
+911 243 1
+911 271 1
+911 304 1
+911 321 1
+911 439 1
+911 447 1
+911 626 1
+911 697 1
+911 704 1
+911 769 1
+911 789 1
+911 794 1
+911 795 1
+911 918 1
+911 932 1
+911 934 1
+911 942 1
+911 958 1
+911 1030 1
+911 1039 1
+911 1044 1
+911 1053 1
+911 1080 1
+911 1123 1
+911 1131 1
+911 1160 1
+912 86 1
+912 214 1
+912 439 1
+912 682 1
+912 929 1
+912 955 1
+912 994 1
+912 1053 1
+912 1123 1
+913 86 1
+913 439 1
+913 2328 1
+914 271 1
+914 304 1
+914 407 1
+914 439 1
+914 989 1
+914 1131 1
+914 2576 1
+923 86 1
+915 86 1
+915 762 1
+915 918 1
+915 1580 1
+915 1717 1
+915 1966 1
+915 2809 1
+916 86 1
+916 559 1
+916 1186 1
+916 1569 1
+917 86 1
+918 86 1
+918 321 1
+918 334 1
+918 665 1
+918 763 1
+918 904 1
+918 985 1
+918 1000 1
+918 1075 1
+918 1261 1
+918 1525 1
+918 1633 1
+918 1717 1
+918 1793 1
+918 1802 1
+918 1927 1
+918 3136 1
+919 86 1
+920 86 1
+920 407 1
+920 545 1
+920 941 1
+920 1026 1
+920 1297 1
+920 1490 1
+920 1669 1
+920 2069 1
+920 2151 1
+921 86 1
+921 545 1
+921 761 1
+921 978 1
+921 1439 1
+921 1484 1
+924 86 1
+787 15 1
+787 86 1
+787 565 1
+787 1018 1
+787 1160 1
+787 1211 1
+787 2060 1
+787 2651 1
+787 3635 1
+787 4103 1
+787 4212 1
+787 8290 1
+927 929 1
+928 579 1
+928 762 1
+928 929 1
+928 1211 1
+928 1236 1
+928 1267 1
+928 1297 1
+928 1439 1
+928 1514 1
+928 1564 1
+928 1687 1
+928 1861 1
+928 1864 1
+928 2066 1
+928 2151 1
+928 2499 1
+928 2501 1
+928 2508 1
+928 2646 1
+928 2707 1
+928 2996 1
+932 665 1
+926 243 1
+926 769 1
+926 932 1
+926 1030 1
+926 1131 1
+926 1141 1
+931 665 1
+931 932 1
+935 290 1
+935 506 1
+935 853 1
+935 936 1
+935 1284 1
+935 1285 1
+935 1286 1
+935 1534 1
+935 1717 1
+935 1723 1
+935 1726 1
+935 1770 1
+935 1859 1
+935 1903 1
+935 1965 1
+935 2079 1
+935 2470 1
+935 2485 1
+935 2880 1
+935 3796 1
+935 5106 1
+935 6875 1
+938 966 1
+938 972 1
+937 271 1
+937 682 1
+937 795 1
+937 938 1
+937 955 1
+937 958 1
+937 977 1
+937 979 1
+937 981 1
+937 983 1
+937 1020 1
+937 1031 1
+937 1053 1
+937 1061 1
+937 1123 1
+937 1127 1
+937 1151 1
+937 1152 1
+937 1156 1
+937 1191 1
+937 1222 1
+937 1240 1
+937 1260 1
+937 1277 1
+937 1284 1
+937 1378 1
+937 1413 1
+937 1453 1
+937 1549 1
+937 1585 1
+937 1621 1
+937 1723 1
+937 1754 1
+937 1781 1
+937 1888 1
+937 1919 1
+937 1956 1
+937 2071 1
+937 2114 1
+937 2251 1
+937 2485 1
+937 2625 1
+937 2955 1
+937 2968 1
+937 3117 1
+937 8288 1
+940 682 1
+941 35 1
+941 56 1
+941 171 1
+941 214 1
+941 227 1
+941 290 1
+941 299 1
+941 311 1
+941 334 1
+941 417 1
+941 579 1
+941 647 1
+941 682 1
+941 691 1
+941 697 1
+941 861 1
+941 907 1
+941 922 1
+941 928 1
+941 971 1
+941 978 1
+941 1034 1
+941 1062 1
+941 1127 1
+941 1151 1
+941 1193 1
+941 1199 1
+941 1201 1
+941 1222 1
+941 1230 1
+941 1234 1
+941 1253 1
+941 1260 1
+941 1279 1
+941 1286 1
+941 1297 1
+941 1319 1
+941 1330 1
+941 1375 1
+941 1411 1
+941 1413 1
+941 1425 1
+941 1428 1
+941 1439 1
+941 1482 1
+941 1484 1
+941 1489 1
+941 1492 1
+941 1496 1
+941 1514 1
+941 1521 1
+941 1538 1
+941 1555 1
+941 1564 1
+941 1580 1
+941 1587 1
+941 1593 1
+941 1596 1
+941 1621 1
+941 1622 1
+941 1700 1
+941 1701 1
+941 1754 1
+941 1768 1
+941 1774 1
+941 1805 1
+941 1816 1
+941 1859 1
+941 1893 1
+941 1969 1
+941 2102 1
+941 2106 1
+941 2120 1
+941 2333 1
+941 2499 1
+941 2618 1
+941 3117 1
+941 3136 1
+941 3164 1
+941 8291 1
+943 35 1
+943 243 1
+943 271 1
+943 299 1
+943 313 1
+943 826 1
+943 918 1
+943 922 1
+943 945 1
+943 955 1
+943 960 1
+943 1023 1
+943 1029 1
+943 1035 1
+943 1164 1
+943 1167 1
+943 1193 1
+943 1234 1
+943 1425 1
+943 1518 1
+943 1538 1
+943 1622 1
+943 1633 1
+943 2071 1
+943 2134 1
+943 2356 1
+943 2654 1
+943 3473 1
+943 4011 1
+943 5412 1
+944 271 1
+944 945 1
+944 1752 1
+944 2332 1
+944 3251 1
+946 35 1
+946 56 1
+946 72 1
+946 204 1
+946 271 1
+946 311 1
+946 334 1
+946 350 1
+946 403 1
+946 579 1
+946 663 1
+946 697 1
+946 704 1
+946 707 1
+946 722 1
+946 744 1
+946 762 1
+946 765 1
+946 857 1
+946 859 1
+946 887 1
+946 937 1
+946 947 1
+946 985 1
+946 993 1
+946 1018 1
+946 1020 1
+946 1031 1
+946 1035 1
+946 1049 1
+946 1062 1
+946 1125 1
+946 1140 1
+946 1166 1
+946 1186 1
+946 1191 1
+946 1192 1
+946 1193 1
+946 1211 1
+946 1218 1
+946 1250 1
+946 1253 1
+946 1259 1
+946 1297 1
+946 1357 1
+946 1360 1
+946 1396 1
+946 1407 1
+946 1412 1
+946 1413 1
+946 1418 1
+946 1521 1
+946 1549 1
+946 1565 1
+946 1585 1
+946 1596 1
+946 1633 1
+946 1653 1
+946 1808 1
+946 1847 1
+946 1888 1
+946 2066 1
+946 2076 1
+946 2083 1
+946 2114 1
+946 2128 1
+946 2137 1
+946 2225 1
+946 2241 1
+946 2290 1
+946 2294 1
+946 2328 1
+946 2333 1
+946 2341 1
+946 2400 1
+946 2426 1
+946 2485 1
+946 2504 1
+946 2508 1
+946 2510 1
+946 2571 1
+946 2575 1
+946 2593 1
+946 2619 1
+946 2653 1
+946 2654 1
+946 2669 1
+946 2670 1
+946 2685 1
+946 2689 1
+946 2697 1
+946 2720 1
+946 2799 1
+946 2801 1
+946 2818 1
+946 2821 1
+946 2828 1
+946 2993 1
+946 2996 1
+946 3026 1
+946 3050 1
+946 3117 1
+946 3253 1
+946 3256 1
+946 3320 1
+946 3404 1
+946 3629 1
+946 4040 1
+946 4179 1
+946 5412 1
+947 271 1
+947 697 1
+947 737 1
+947 764 1
+947 1679 1
+947 2066 1
+947 2237 1
+947 2594 1
+947 2623 1
+947 2625 1
+947 2651 1
+947 2689 1
+947 2713 1
+947 3005 1
+947 3456 1
+947 3549 1
+947 3615 1
+947 4181 1
+947 4247 1
+947 4297 1
+947 4385 1
+947 4400 1
+947 4735 1
+947 4777 1
+947 4796 1
+947 4962 1
+947 5412 1
+948 271 1
+948 324 1
+948 633 1
+948 1156 1
+948 1199 1
+948 1323 1
+948 1419 1
+948 1453 1
+948 1482 1
+948 1534 1
+948 1714 1
+948 1726 1
+948 2137 1
+948 2181 1
+948 2485 1
+948 2516 1
+948 2619 1
+948 2689 1
+948 2815 1
+948 2834 1
+948 3148 1
+948 3243 1
+948 3253 1
+948 4879 1
+948 5083 1
+948 5253 1
+948 6832 1
+948 6907 1
+948 7624 1
+949 56 1
+949 271 1
+949 425 1
+949 1407 1
+949 1573 1
+949 1580 1
+949 2165 1
+949 2322 1
+950 918 1
+950 2001 1
+950 2605 1
+950 4797 1
+950 4994 1
+950 5454 1
+950 5459 1
+950 5757 1
+950 7979 1
+951 918 1
+954 56 1
+954 290 1
+954 407 1
+954 626 1
+954 742 1
+954 857 1
+954 904 1
+954 955 1
+954 985 1
+954 989 1
+954 1131 1
+954 1186 1
+954 1218 1
+954 1261 1
+954 1277 1
+954 1411 1
+954 1453 1
+954 1485 1
+954 1486 1
+954 1564 1
+954 1669 1
+954 1717 1
+954 1718 1
+954 1836 1
+954 1849 1
+954 1861 1
+954 1864 1
+954 2163 1
+954 2205 1
+954 2206 1
+954 2593 1
+954 2619 1
+954 2643 1
+954 8291 1
+956 56 1
+956 271 1
+956 299 1
+956 311 1
+956 321 1
+956 417 1
+956 663 1
+956 686 1
+956 696 1
+956 697 1
+956 722 1
+956 742 1
+956 764 1
+956 765 1
+956 784 1
+956 823 1
+956 857 1
+956 958 1
+956 978 1
+956 993 1
+956 1023 1
+956 1026 1
+956 1031 1
+956 1039 1
+956 1053 1
+956 1123 1
+956 1131 1
+956 1190 1
+956 1613 1
+956 1966 1
+956 2106 1
+956 2210 1
+956 2246 1
+956 2341 1
+956 2504 1
+956 2508 1
+956 2535 1
+956 2669 1
+956 2777 1
+956 3433 1
+956 4201 1
+956 4338 1
+957 304 1
+957 958 1
+957 1023 1
+959 259 1
+959 313 1
+959 545 1
+959 978 1
+959 985 1
+959 1026 1
+959 1186 1
+959 1297 1
+959 1835 1
+959 1836 1
+959 1842 1
+959 3755 1
+960 214 1
+960 313 1
+960 626 1
+960 663 1
+960 696 1
+960 697 1
+960 805 1
+960 1000 1
+960 1034 1
+960 1125 1
+960 1160 1
+960 1322 1
+960 1564 1
+960 1633 1
+960 1781 1
+960 1956 1
+960 2504 1
+960 2542 1
+960 2576 1
+960 2580 1
+960 3136 1
+960 3769 1
+961 966 1
+961 1031 1
+961 1049 1
+961 1701 1
+961 1847 1
+961 1956 1
+961 1964 1
+961 2069 1
+961 2073 1
+961 2128 1
+961 2181 1
+961 2625 1
+961 2660 1
+961 2966 1
+961 8290 1
+961 8291 1
+965 966 1
+962 966 1
+962 1186 1
+962 3456 1
+963 966 1
+963 3473 1
+963 4875 1
+964 966 1
+964 1382 1
+964 1453 1
+964 3634 1
+933 317 1
+933 704 1
+933 789 1
+933 795 1
+933 966 1
+933 999 1
+933 1014 1
+933 1080 1
+933 1103 1
+933 1186 1
+933 1490 1
+933 1514 1
+933 1697 1
+933 1836 1
+933 1842 1
+933 1855 1
+933 1864 1
+933 1966 1
+967 243 1
+967 697 1
+967 742 1
+967 789 1
+967 972 1
+967 3456 1
+967 4037 1
+967 5210 1
+967 5466 1
+967 5819 1
+967 6918 1
+967 6946 1
+967 7620 1
+967 8037 1
+967 8042 1
+967 8044 1
+968 972 1
+968 1384 1
+968 1592 1
+968 7890 1
+968 8174 1
+969 972 1
+969 1389 1
+970 338 1
+970 626 1
+970 784 1
+970 857 1
+970 972 1
+970 1022 1
+970 1144 1
+970 1156 1
+970 1297 1
+970 1518 1
+970 1893 1
+971 35 1
+971 171 1
+971 271 1
+971 290 1
+971 299 1
+971 311 1
+971 317 1
+971 321 1
+971 334 1
+971 663 1
+971 710 1
+971 762 1
+971 789 1
+971 794 1
+971 805 1
+971 810 1
+971 857 1
+971 871 1
+971 904 1
+971 930 1
+971 937 1
+971 941 1
+971 956 1
+971 959 1
+971 972 1
+971 979 1
+971 982 1
+971 1006 1
+971 1014 1
+971 1061 1
+971 1123 1
+971 1131 1
+971 1152 1
+971 1159 1
+971 1167 1
+971 1191 1
+971 1193 1
+971 1199 1
+971 1211 1
+971 1241 1
+971 1260 1
+971 1261 1
+971 1277 1
+971 1284 1
+971 1321 1
+971 1389 1
+971 1428 1
+971 1441 1
+971 1496 1
+971 1501 1
+971 1514 1
+971 1525 1
+971 1538 1
+971 1555 1
+971 1557 1
+971 1573 1
+971 1603 1
+971 1752 1
+971 1758 1
+971 1774 1
+971 1780 1
+971 1802 1
+971 1811 1
+971 1849 1
+971 1920 1
+971 1950 1
+971 1966 1
+971 1973 1
+971 4365 1
+971 5452 1
+971 5936 1
+971 5994 1
+973 977 1
+973 1232 1
+974 15 1
+974 204 1
+974 271 1
+974 417 1
+974 762 1
+974 977 1
+974 978 1
+974 1166 1
+974 1297 1
+974 1385 1
+974 2144 1
+974 2209 1
+974 2237 1
+974 2240 1
+974 2289 1
+974 2328 1
+974 2654 1
+974 2667 1
+974 2747 1
+974 2871 1
+974 3005 1
+974 3443 1
+974 3580 1
+974 3587 1
+974 3769 1
+974 3946 1
+974 3976 1
+974 4037 1
+974 4191 1
+974 4373 1
+974 4384 1
+974 4735 1
+974 4962 1
+974 4981 1
+974 5822 1
+974 8294 1
+975 977 1
+975 993 1
+975 1714 1
+975 1919 1
+975 1997 1
+975 2071 1
+975 2195 1
+975 2211 1
+975 2625 1
+975 2708 1
+975 3205 1
+976 977 1
+980 979 1
+978 35 1
+978 56 1
+978 171 1
+978 214 1
+978 271 1
+978 290 1
+978 304 1
+978 324 1
+978 407 1
+978 415 1
+978 545 1
+978 644 1
+978 761 1
+978 805 1
+978 908 1
+978 956 1
+978 959 1
+978 979 1
+978 989 1
+978 993 1
+978 1012 1
+978 1022 1
+978 1026 1
+978 1029 1
+978 1031 1
+978 1062 1
+978 1080 1
+978 1114 1
+978 1125 1
+978 1156 1
+978 1165 1
+978 1191 1
+978 1192 1
+978 1193 1
+978 1222 1
+978 1234 1
+978 1279 1
+978 1296 1
+978 1297 1
+978 1374 1
+978 1425 1
+978 1432 1
+978 1439 1
+978 1482 1
+978 1484 1
+978 1496 1
+978 1514 1
+978 1564 1
+978 1585 1
+978 1641 1
+978 1661 1
+978 1680 1
+978 1718 1
+978 1847 1
+978 1861 1
+978 1864 1
+978 1956 1
+978 2117 1
+978 2120 1
+978 2151 1
+978 2174 1
+978 2435 1
+978 2625 1
+978 2900 1
+978 3136 1
+981 271 1
+981 304 1
+981 626 1
+981 696 1
+981 697 1
+981 704 1
+981 789 1
+981 857 1
+981 1053 1
+981 1123 1
+981 1164 1
+981 1193 1
+981 1377 1
+981 1497 1
+981 1593 1
+981 1603 1
+982 299 1
+982 338 1
+982 407 1
+982 663 1
+982 705 1
+982 794 1
+982 857 1
+982 887 1
+982 930 1
+982 937 1
+982 1012 1
+982 1035 1
+982 1043 1
+982 1053 1
+982 1123 1
+982 1125 1
+982 1144 1
+982 1152 1
+982 1154 1
+982 1156 1
+982 1186 1
+982 1190 1
+982 1191 1
+982 1192 1
+982 1220 1
+982 1222 1
+982 1241 1
+982 1453 1
+982 1730 1
+982 2151 1
+982 2338 1
+982 2470 1
+982 2625 1
+982 2651 1
+982 2693 1
+982 2708 1
+982 2747 1
+982 2912 1
+982 2951 1
+982 3173 1
+982 3276 1
+982 3615 1
+982 3670 1
+982 4058 1
+982 4191 1
+982 5073 1
+982 5432 1
+983 8288 1
+984 15 1
+984 644 1
+984 704 1
+984 789 1
+984 995 1
+984 1261 1
+984 5210 1
+985 35 1
+985 704 1
+985 789 1
+985 857 1
+985 1193 1
+985 5210 1
+986 35 1
+986 72 1
+986 171 1
+986 290 1
+986 332 1
+986 334 1
+986 626 1
+986 704 1
+986 722 1
+986 789 1
+986 791 1
+986 805 1
+986 922 1
+986 946 1
+986 948 1
+986 960 1
+986 978 1
+986 985 1
+986 993 1
+986 1035 1
+986 1062 1
+986 1140 1
+986 1151 1
+986 1166 1
+986 1186 1
+986 1191 1
+986 1192 1
+986 1201 1
+986 1203 1
+986 1211 1
+986 1240 1
+986 1241 1
+986 1266 1
+986 1270 1
+986 1277 1
+986 1286 1
+986 1287 1
+986 1297 1
+986 1307 1
+986 1453 1
+986 1464 1
+986 1482 1
+986 1484 1
+986 1532 1
+986 1549 1
+986 1573 1
+986 1679 1
+986 1730 1
+986 1734 1
+986 1758 1
+986 1842 1
+986 1861 1
+986 1864 1
+986 1966 1
+986 2066 1
+986 2117 1
+986 2163 1
+986 2237 1
+986 2251 1
+986 2256 1
+986 2322 1
+986 2328 1
+986 2341 1
+986 2348 1
+986 2397 1
+986 2594 1
+986 2625 1
+986 2763 1
+986 2856 1
+986 2871 1
+986 3307 1
+986 3348 1
+986 3456 1
+986 3970 1
+986 4365 1
+986 8290 1
+986 8291 1
+988 204 1
+988 290 1
+988 332 1
+988 417 1
+988 465 1
+988 633 1
+988 722 1
+988 737 1
+988 762 1
+988 856 1
+988 859 1
+988 922 1
+988 959 1
+988 974 1
+988 982 1
+988 989 1
+988 1018 1
+988 1049 1
+988 1100 1
+988 1157 1
+988 1166 1
+988 1185 1
+988 1186 1
+988 1250 1
+988 1267 1
+988 1291 1
+988 1297 1
+988 1305 1
+988 1307 1
+988 1357 1
+988 1393 1
+988 1416 1
+988 1437 1
+988 1453 1
+988 1492 1
+988 1549 1
+988 1571 1
+988 1608 1
+988 1633 1
+988 1679 1
+988 1688 1
+988 1700 1
+988 1706 1
+988 1734 1
+988 1744 1
+988 1754 1
+988 1769 1
+988 1777 1
+988 1781 1
+988 1792 1
+988 1814 1
+988 1835 1
+988 1837 1
+988 1842 1
+988 1919 1
+988 1964 1
+988 1982 1
+988 2016 1
+988 2066 1
+988 2097 1
+988 2114 1
+988 2116 1
+988 2117 1
+988 2120 1
+988 2134 1
+988 2135 1
+988 2145 1
+988 2209 1
+988 2210 1
+988 2225 1
+988 2231 1
+988 2237 1
+988 2240 1
+988 2251 1
+988 2252 1
+988 2256 1
+988 2257 1
+988 2290 1
+988 2297 1
+988 2322 1
+988 2323 1
+988 2324 1
+988 2325 1
+988 2328 1
+988 2338 1
+988 2356 1
+988 2371 1
+988 2400 1
+988 2411 1
+988 2416 1
+988 2435 1
+988 2474 1
+988 2479 1
+988 2485 1
+988 2490 1
+988 2510 1
+988 2517 1
+988 2535 1
+988 2542 1
+988 2544 1
+988 2550 1
+988 2565 1
+988 2576 1
+988 2585 1
+988 2587 1
+988 2593 1
+988 2594 1
+988 2595 1
+988 2597 1
+988 2612 1
+988 2617 1
+988 2619 1
+988 2623 1
+988 2625 1
+988 2646 1
+988 2651 1
+988 2653 1
+988 2654 1
+988 2655 1
+988 2657 1
+988 2660 1
+988 2662 1
+988 2667 1
+988 2674 1
+988 2686 1
+988 2693 1
+988 2697 1
+988 2700 1
+988 2708 1
+988 2713 1
+988 2727 1
+988 2746 1
+988 2747 1
+988 2754 1
+988 2760 1
+988 2799 1
+988 2819 1
+988 2830 1
+988 2856 1
+988 2900 1
+988 2912 1
+988 2918 1
+988 2923 1
+988 2951 1
+988 2958 1
+988 2972 1
+988 2973 1
+988 2974 1
+988 2991 1
+988 2999 1
+988 3005 1
+988 3007 1
+988 3009 1
+988 3010 1
+988 3018 1
+988 3020 1
+988 3021 1
+988 3024 1
+988 3026 1
+988 3028 1
+988 3029 1
+988 3030 1
+988 3033 1
+988 3034 1
+988 3056 1
+988 3059 1
+988 3084 1
+988 3089 1
+988 3099 1
+988 3114 1
+988 3126 1
+988 3140 1
+988 3148 1
+988 3150 1
+988 3164 1
+988 3173 1
+988 3180 1
+988 3235 1
+988 3243 1
+988 3251 1
+988 3253 1
+988 3255 1
+988 3258 1
+988 3260 1
+988 3265 1
+988 3276 1
+988 3284 1
+988 3293 1
+988 3307 1
+988 3324 1
+988 3338 1
+988 3348 1
+988 3351 1
+988 3352 1
+988 3371 1
+988 3376 1
+988 3404 1
+988 3408 1
+988 3435 1
+988 3439 1
+988 3454 1
+988 3473 1
+988 3480 1
+988 3489 1
+988 3506 1
+988 3529 1
+988 3537 1
+988 3538 1
+988 3541 1
+988 3547 1
+988 3548 1
+988 3557 1
+988 3567 1
+988 3580 1
+988 3587 1
+988 3645 1
+988 3670 1
+988 3680 1
+988 3681 1
+988 3745 1
+988 3769 1
+988 3800 1
+988 3804 1
+988 3807 1
+988 3809 1
+988 3812 1
+988 3825 1
+988 3847 1
+988 3849 1
+988 3871 1
+988 3892 1
+988 3903 1
+988 3926 1
+988 3937 1
+988 3970 1
+988 4013 1
+988 4037 1
+988 4256 1
+988 4290 1
+988 4384 1
+988 4401 1
+988 4432 1
+988 4578 1
+988 4735 1
+988 4962 1
+988 4999 1
+988 5022 1
+988 5210 1
+988 5417 1
+988 5605 1
+988 5614 1
+988 5819 1
+988 5887 1
+988 6044 1
+988 6618 1
+988 6634 1
+988 6737 1
+988 6759 1
+988 6946 1
+988 6980 1
+988 7050 1
+988 7233 1
+988 7391 1
+988 7620 1
+988 7810 1
+988 7835 1
+988 7908 1
+988 7910 1
+988 8037 1
+988 8042 1
+988 8051 1
+988 8073 1
+988 8083 1
+988 8121 1
+988 8122 1
+988 8124 1
+988 8128 1
+988 8130 1
+988 8134 1
+988 8141 1
+988 8163 1
+988 8168 1
+988 8174 1
+988 8178 1
+988 8192 1
+988 8198 1
+988 8209 1
+988 8212 1
+988 8219 1
+988 8224 1
+988 8237 1
+988 8293 1
+987 304 1
+987 989 1
+990 991 1
+992 794 1
+993 35 1
+993 56 1
+993 171 1
+993 214 1
+993 298 1
+993 299 1
+993 304 1
+993 311 1
+993 317 1
+993 334 1
+993 403 1
+993 415 1
+993 506 1
+993 579 1
+993 587 1
+993 626 1
+993 663 1
+993 697 1
+993 722 1
+993 761 1
+993 762 1
+993 765 1
+993 789 1
+993 805 1
+993 813 1
+993 826 1
+993 836 1
+993 857 1
+993 871 1
+993 873 1
+993 887 1
+993 908 1
+993 935 1
+993 937 1
+993 946 1
+993 947 1
+993 948 1
+993 956 1
+993 959 1
+993 975 1
+993 978 1
+993 995 1
+993 999 1
+993 1000 1
+993 1014 1
+993 1022 1
+993 1026 1
+993 1031 1
+993 1035 1
+993 1061 1
+993 1097 1
+993 1103 1
+993 1111 1
+993 1125 1
+993 1151 1
+993 1164 1
+993 1165 1
+993 1166 1
+993 1167 1
+993 1168 1
+993 1190 1
+993 1200 1
+993 1201 1
+993 1203 1
+993 1211 1
+993 1222 1
+993 1230 1
+993 1234 1
+993 1236 1
+993 1239 1
+993 1243 1
+993 1261 1
+993 1279 1
+993 1284 1
+993 1285 1
+993 1286 1
+993 1297 1
+993 1319 1
+993 1330 1
+993 1374 1
+993 1377 1
+993 1378 1
+993 1382 1
+993 1393 1
+993 1394 1
+993 1407 1
+993 1413 1
+993 1416 1
+993 1420 1
+993 1425 1
+993 1428 1
+993 1437 1
+993 1444 1
+993 1464 1
+993 1471 1
+993 1476 1
+993 1482 1
+993 1489 1
+993 1492 1
+993 1496 1
+993 1501 1
+993 1506 1
+993 1514 1
+993 1520 1
+993 1533 1
+993 1534 1
+993 1537 1
+993 1538 1
+993 1542 1
+993 1547 1
+993 1549 1
+993 1555 1
+993 1556 1
+993 1557 1
+993 1565 1
+993 1566 1
+993 1573 1
+993 1580 1
+993 1583 1
+993 1585 1
+993 1587 1
+993 1603 1
+993 1608 1
+993 1621 1
+993 1622 1
+993 1629 1
+993 1633 1
+993 1637 1
+993 1641 1
+993 1646 1
+993 1661 1
+993 1679 1
+993 1689 1
+993 1697 1
+993 1700 1
+993 1707 1
+993 1717 1
+993 1726 1
+993 1730 1
+993 1749 1
+993 1758 1
+993 1768 1
+993 1772 1
+993 1774 1
+993 1787 1
+993 1788 1
+993 1802 1
+993 1808 1
+993 1811 1
+993 1814 1
+993 1835 1
+993 1836 1
+993 1842 1
+993 1847 1
+993 1848 1
+993 1880 1
+993 1888 1
+993 1901 1
+993 1903 1
+993 1908 1
+993 1919 1
+993 1963 1
+993 1965 1
+993 1966 1
+993 1969 1
+993 1987 1
+993 1991 1
+993 1997 1
+993 2062 1
+993 2066 1
+993 2069 1
+993 2071 1
+993 2073 1
+993 2097 1
+993 2102 1
+993 2106 1
+993 2117 1
+993 2119 1
+993 2120 1
+993 2128 1
+993 2134 1
+993 2137 1
+993 2157 1
+993 2168 1
+993 2195 1
+993 2211 1
+993 2225 1
+993 2246 1
+993 2323 1
+993 2324 1
+993 2328 1
+993 2329 1
+993 2341 1
+993 2345 1
+993 2386 1
+993 2400 1
+993 2475 1
+993 2479 1
+993 2504 1
+993 2570 1
+993 2580 1
+993 2619 1
+993 2625 1
+993 2654 1
+993 2655 1
+993 2685 1
+993 2686 1
+993 2693 1
+993 2708 1
+993 2763 1
+993 2805 1
+993 2814 1
+993 2815 1
+993 2828 1
+993 2834 1
+993 2859 1
+993 2972 1
+993 3014 1
+993 3117 1
+993 3130 1
+993 3136 1
+993 3352 1
+993 3537 1
+993 3800 1
+993 3888 1
+993 3926 1
+993 3970 1
+993 4256 1
+993 4365 1
+993 4424 1
+993 5064 1
+993 5100 1
+993 5210 1
+993 5543 1
+993 6498 1
+993 7063 1
+993 7961 1
+993 8290 1
+994 15 1
+994 35 1
+994 304 1
+994 311 1
+994 321 1
+994 663 1
+994 696 1
+994 697 1
+994 707 1
+994 710 1
+994 742 1
+994 762 1
+994 789 1
+994 805 1
+994 995 1
+994 1007 1
+994 1023 1
+994 1026 1
+994 1039 1
+994 1160 1
+994 1193 1
+994 1259 1
+994 1297 1
+994 1393 1
+994 1549 1
+994 1633 1
+994 1706 1
+994 1859 1
+994 2114 1
+994 2209 1
+994 2328 1
+994 2625 1
+994 2654 1
+994 2775 1
+994 2856 1
+994 3030 1
+994 3192 1
+994 3529 1
+994 3537 1
+994 3885 1
+994 3892 1
+994 4013 1
+994 4384 1
+994 4953 1
+994 5412 1
+996 15 1
+996 56 1
+996 204 1
+996 259 1
+996 290 1
+996 332 1
+996 334 1
+996 346 1
+996 350 1
+996 403 1
+996 425 1
+996 587 1
+996 608 1
+996 633 1
+996 644 1
+996 647 1
+996 722 1
+996 762 1
+996 764 1
+996 765 1
+996 810 1
+996 813 1
+996 820 1
+996 859 1
+996 907 1
+996 946 1
+996 947 1
+996 959 1
+996 968 1
+996 971 1
+996 1018 1
+996 1035 1
+996 1049 1
+996 1061 1
+996 1100 1
+996 1166 1
+996 1185 1
+996 1186 1
+996 1203 1
+996 1211 1
+996 1234 1
+996 1243 1
+996 1247 1
+996 1250 1
+996 1267 1
+996 1291 1
+996 1296 1
+996 1297 1
+996 1353 1
+996 1357 1
+996 1375 1
+996 1378 1
+996 1384 1
+996 1389 1
+996 1393 1
+996 1394 1
+996 1402 1
+996 1412 1
+996 1413 1
+996 1416 1
+996 1419 1
+996 1435 1
+996 1444 1
+996 1453 1
+996 1471 1
+996 1472 1
+996 1473 1
+996 1521 1
+996 1542 1
+996 1547 1
+996 1565 1
+996 1571 1
+996 1592 1
+996 1608 1
+996 1613 1
+996 1621 1
+996 1633 1
+996 1637 1
+996 1638 1
+996 1646 1
+996 1648 1
+996 1653 1
+996 1678 1
+996 1705 1
+996 1723 1
+996 1729 1
+996 1734 1
+996 1749 1
+996 1783 1
+996 1792 1
+996 1814 1
+996 1823 1
+996 1835 1
+996 1847 1
+996 1848 1
+996 1888 1
+996 1919 1
+996 1956 1
+996 1964 1
+996 1977 1
+996 1982 1
+996 1992 1
+996 1997 1
+996 2014 1
+996 2062 1
+996 2066 1
+996 2071 1
+996 2091 1
+996 2095 1
+996 2102 1
+996 2116 1
+996 2120 1
+996 2128 1
+996 2135 1
+996 2145 1
+996 2174 1
+996 2182 1
+996 2209 1
+996 2210 1
+996 2225 1
+996 2231 1
+996 2240 1
+996 2241 1
+996 2246 1
+996 2251 1
+996 2253 1
+996 2273 1
+996 2281 1
+996 2323 1
+996 2324 1
+996 2329 1
+996 2332 1
+996 2333 1
+996 2339 1
+996 2345 1
+996 2348 1
+996 2354 1
+996 2356 1
+996 2371 1
+996 2375 1
+996 2385 1
+996 2397 1
+996 2398 1
+996 2400 1
+996 2411 1
+996 2435 1
+996 2470 1
+996 2479 1
+996 2510 1
+996 2516 1
+996 2517 1
+996 2542 1
+996 2550 1
+996 2570 1
+996 2576 1
+996 2579 1
+996 2580 1
+996 2587 1
+996 2591 1
+996 2593 1
+996 2620 1
+996 2625 1
+996 2651 1
+996 2653 1
+996 2654 1
+996 2657 1
+996 2665 1
+996 2669 1
+996 2685 1
+996 2693 1
+996 2707 1
+996 2708 1
+996 2713 1
+996 2754 1
+996 2763 1
+996 2764 1
+996 2768 1
+996 2774 1
+996 2775 1
+996 2785 1
+996 2787 1
+996 2794 1
+996 2801 1
+996 2805 1
+996 2809 1
+996 2815 1
+996 2819 1
+996 2828 1
+996 2834 1
+996 2856 1
+996 2923 1
+996 2951 1
+996 2963 1
+996 2968 1
+996 3027 1
+996 3029 1
+996 3089 1
+996 3103 1
+996 3106 1
+996 3117 1
+996 3140 1
+996 3148 1
+996 3192 1
+996 3238 1
+996 3253 1
+996 3274 1
+996 3309 1
+996 3393 1
+996 3408 1
+996 3456 1
+996 3479 1
+996 3489 1
+996 3537 1
+996 3554 1
+996 3557 1
+996 3562 1
+996 3796 1
+996 3806 1
+996 3813 1
+996 3897 1
+996 3958 1
+996 4055 1
+996 4098 1
+996 4179 1
+996 4234 1
+996 4266 1
+996 4289 1
+996 4315 1
+996 4323 1
+996 4335 1
+996 4384 1
+996 4400 1
+996 4424 1
+996 4448 1
+996 4510 1
+996 4530 1
+996 4574 1
+996 4600 1
+996 4661 1
+996 4666 1
+996 4712 1
+996 4735 1
+996 4797 1
+996 4820 1
+996 4875 1
+996 4929 1
+996 4964 1
+996 5022 1
+996 5079 1
+996 5162 1
+996 5233 1
+996 5254 1
+996 5263 1
+996 5288 1
+996 5335 1
+996 5392 1
+996 5412 1
+996 5423 1
+996 5449 1
+996 5452 1
+996 5454 1
+996 5463 1
+996 5484 1
+996 5506 1
+996 5509 1
+996 5568 1
+996 5637 1
+996 5650 1
+996 5651 1
+996 5683 1
+996 5784 1
+996 5790 1
+996 5828 1
+996 5863 1
+996 5994 1
+996 6246 1
+996 6262 1
+996 6306 1
+996 6400 1
+996 6432 1
+996 6437 1
+996 6441 1
+996 6498 1
+996 6566 1
+996 6599 1
+996 6714 1
+996 6780 1
+996 7047 1
+996 7092 1
+996 7094 1
+996 7108 1
+996 7373 1
+996 7620 1
+996 8290 1
+996 8291 1
+996 8292 1
+996 8293 1
+998 243 1
+998 372 1
+998 579 1
+998 663 1
+998 686 1
+998 696 1
+998 697 1
+998 789 1
+998 913 1
+998 956 1
+998 971 1
+998 1014 1
+998 1053 1
+998 1123 1
+998 1152 1
+998 1186 1
+998 1248 1
+998 1322 1
+998 1442 1
+998 1476 1
+998 1489 1
+998 1597 1
+998 1603 1
+998 1652 1
+998 1654 1
+998 1661 1
+998 1662 1
+998 1717 1
+998 1956 1
+998 2381 1
+1005 789 1
+1005 813 1
+1005 1234 1
+1005 1497 1
+1005 1573 1
+999 432 1
+999 789 1
+999 959 1
+999 1014 1
+1000 290 1
+1000 317 1
+1000 403 1
+1000 765 1
+1000 789 1
+1000 896 1
+1000 960 1
+1000 968 1
+1000 1014 1
+1000 1018 1
+1000 1103 1
+1000 1154 1
+1000 1253 1
+1000 1428 1
+1000 1501 1
+1000 1525 1
+1000 1600 1
+1000 1734 1
+1000 1754 1
+1000 1781 1
+1000 1835 1
+1000 1918 1
+1000 2120 1
+1000 2240 1
+1000 2264 1
+1000 2328 1
+1000 2332 1
+1000 2410 1
+1000 2470 1
+1000 2499 1
+1000 2517 1
+1000 2550 1
+1000 2570 1
+1000 2571 1
+1000 2575 1
+1000 2579 1
+1000 2593 1
+1000 2830 1
+1000 2834 1
+1000 2877 1
+1000 3015 1
+1000 3089 1
+1000 3140 1
+1000 3150 1
+1000 3191 1
+1000 3334 1
+1000 3586 1
+1000 4527 1
+1000 5176 1
+1000 5527 1
+1000 5624 1
+1000 5798 1
+1000 5936 1
+1000 5963 1
+1000 5973 1
+1000 6027 1
+1000 6029 1
+1000 6148 1
+1000 6946 1
+1000 7436 1
+1006 35 1
+1006 171 1
+1006 214 1
+1006 227 1
+1006 230 1
+1006 259 1
+1006 298 1
+1006 314 1
+1006 338 1
+1006 432 1
+1006 579 1
+1006 686 1
+1006 696 1
+1006 762 1
+1006 789 1
+1006 803 1
+1006 805 1
+1006 813 1
+1006 836 1
+1006 857 1
+1006 861 1
+1006 871 1
+1006 904 1
+1006 935 1
+1006 937 1
+1006 941 1
+1006 948 1
+1006 956 1
+1006 960 1
+1006 963 1
+1006 975 1
+1006 982 1
+1006 994 1
+1006 1007 1
+1006 1014 1
+1006 1023 1
+1006 1026 1
+1006 1029 1
+1006 1030 1
+1006 1032 1
+1006 1034 1
+1006 1039 1
+1006 1043 1
+1006 1075 1
+1006 1080 1
+1006 1141 1
+1006 1144 1
+1006 1156 1
+1006 1167 1
+1006 1200 1
+1006 1203 1
+1006 1220 1
+1006 1221 1
+1006 1222 1
+1006 1234 1
+1006 1248 1
+1006 1286 1
+1006 1297 1
+1006 1326 1
+1006 1330 1
+1006 1375 1
+1006 1389 1
+1006 1394 1
+1006 1396 1
+1006 1402 1
+1006 1412 1
+1006 1413 1
+1006 1418 1
+1006 1432 1
+1006 1441 1
+1006 1444 1
+1006 1453 1
+1006 1465 1
+1006 1468 1
+1006 1487 1
+1006 1496 1
+1006 1506 1
+1006 1514 1
+1006 1518 1
+1006 1524 1
+1006 1534 1
+1006 1538 1
+1006 1547 1
+1006 1555 1
+1006 1556 1
+1006 1573 1
+1006 1583 1
+1006 1585 1
+1006 1587 1
+1006 1593 1
+1006 1595 1
+1006 1597 1
+1006 1600 1
+1006 1603 1
+1006 1610 1
+1006 1613 1
+1006 1718 1
+1006 1747 1
+1006 1774 1
+1006 1783 1
+1006 1787 1
+1006 1788 1
+1006 1793 1
+1006 1798 1
+1006 1836 1
+1006 1848 1
+1006 1857 1
+1006 1893 1
+1006 1920 1
+1006 1950 1
+1006 1953 1
+1006 1983 1
+1006 1984 1
+1006 1985 1
+1006 2066 1
+1006 2073 1
+1006 2085 1
+1006 2097 1
+1006 2128 1
+1006 2178 1
+1006 2181 1
+1006 2202 1
+1006 2231 1
+1006 2324 1
+1006 2341 1
+1006 2435 1
+1006 2579 1
+1006 2580 1
+1006 2651 1
+1006 2763 1
+1006 2912 1
+1006 3034 1
+1006 3136 1
+1006 3568 1
+1006 4037 1
+1006 4422 1
+1006 4510 1
+1006 4983 1
+1001 789 1
+1002 789 1
+1003 290 1
+1003 663 1
+1003 789 1
+1003 857 1
+1003 946 1
+1003 1230 1
+1003 1319 1
+1003 1374 1
+1003 1880 1
+1003 1956 1
+1003 1966 1
+1003 2504 1
+1003 2851 1
+1003 4071 1
+1003 5543 1
+1003 7073 1
+1003 7115 1
+1003 7699 1
+1004 789 1
+1004 4335 1
+1004 4846 1
+1004 5178 1
+1004 5305 1
+1004 5543 1
+1004 5545 1
+1004 6302 1
+1004 6306 1
+1004 6334 1
+1004 6414 1
+1004 6441 1
+1008 304 1
+1008 1026 1
+1008 4037 1
+1008 4875 1
+1008 5254 1
+1008 5714 1
+1008 6682 1
+1008 6714 1
+1011 447 1
+1011 1031 1
+1011 2193 1
+1011 2210 1
+1011 3321 1
+1011 4365 1
+1012 447 1
+1012 1218 1
+1012 2247 1
+1012 2571 1
+1012 2991 1
+1012 3301 1
+1012 4373 1
+1013 243 1
+1013 259 1
+1013 271 1
+1013 626 1
+1013 644 1
+1013 762 1
+1013 769 1
+1013 857 1
+1013 930 1
+1013 937 1
+1013 985 1
+1013 1014 1
+1013 1044 1
+1013 1053 1
+1013 1080 1
+1013 1140 1
+1013 1144 1
+1013 1154 1
+1013 1186 1
+1013 1260 1
+1013 1382 1
+1013 1396 1
+1013 3164 1
+1016 565 1
+1017 565 1
+1018 565 1
+1018 2237 1
+1018 4335 1
+1018 4728 1
+1018 5623 1
+1019 565 1
+1009 271 1
+1009 299 1
+1009 311 1
+1009 314 1
+1009 332 1
+1009 334 1
+1009 707 1
+1009 948 1
+1009 994 1
+1009 1023 1
+1009 1026 1
+1009 1043 1
+1009 1125 1
+1009 1164 1
+1009 1165 1
+1009 1203 1
+1009 1402 1
+1009 1412 1
+1009 1425 1
+1009 1439 1
+1009 1442 1
+1009 1464 1
+1009 1486 1
+1009 1514 1
+1009 1811 1
+1009 1858 1
+1009 1893 1
+1009 1920 1
+1009 1927 1
+1009 1963 1
+1009 1966 1
+1009 2202 1
+1009 2328 1
+1009 2597 1
+1009 2674 1
+1009 3148 1
+1009 3529 1
+1009 4263 1
+1009 6029 1
+1009 6251 1
+1009 6417 1
+1009 6665 1
+1009 7225 1
+1009 7400 1
+1021 1026 1
+1022 35 1
+1022 243 1
+1022 545 1
+1022 663 1
+1022 978 1
+1022 1026 1
+1022 1053 1
+1022 1055 1
+1022 1123 1
+1022 1131 1
+1022 1156 1
+1022 1167 1
+1022 1377 1
+1022 1484 1
+1023 311 1
+1023 332 1
+1023 722 1
+1023 742 1
+1023 1026 1
+1023 1167 1
+1023 1201 1
+1023 1492 1
+1023 1700 1
+1024 290 1
+1024 425 1
+1024 626 1
+1024 697 1
+1024 825 1
+1024 1026 1
+1024 1279 1
+1024 1291 1
+1024 1305 1
+1024 1307 1
+1024 1549 1
+1024 1592 1
+1024 1637 1
+1024 1641 1
+1024 2264 1
+1024 2384 1
+1024 2506 1
+1024 2625 1
+1024 2657 1
+1024 2696 1
+1024 2785 1
+1024 2805 1
+1024 2828 1
+1024 2830 1
+1024 2977 1
+1024 3009 1
+1024 3029 1
+1024 3033 1
+1024 3034 1
+1024 3125 1
+1024 3145 1
+1024 3150 1
+1024 3164 1
+1024 3408 1
+1024 3433 1
+1024 3748 1
+1024 4162 1
+1024 4510 1
+1024 4706 1
+1024 4735 1
+1024 5055 1
+1025 1026 1
+1027 311 1
+1027 321 1
+1027 697 1
+1027 1023 1
+1027 1039 1
+1027 5631 1
+1028 271 1
+1028 626 1
+1028 697 1
+1028 1030 1
+1028 1053 1
+1028 1123 1
+1028 1186 1
+1029 35 1
+1029 171 1
+1029 227 1
+1029 243 1
+1029 271 1
+1029 299 1
+1029 311 1
+1029 314 1
+1029 321 1
+1029 432 1
+1029 579 1
+1029 626 1
+1029 686 1
+1029 691 1
+1029 697 1
+1029 705 1
+1029 707 1
+1029 742 1
+1029 761 1
+1029 762 1
+1029 769 1
+1029 771 1
+1029 784 1
+1029 803 1
+1029 805 1
+1029 810 1
+1029 813 1
+1029 853 1
+1029 871 1
+1029 913 1
+1029 941 1
+1029 956 1
+1029 960 1
+1029 963 1
+1029 971 1
+1029 978 1
+1029 982 1
+1029 999 1
+1029 1000 1
+1029 1006 1
+1029 1030 1
+1029 1032 1
+1029 1038 1
+1029 1039 1
+1029 1044 1
+1029 1053 1
+1029 1055 1
+1029 1061 1
+1029 1062 1
+1029 1075 1
+1029 1080 1
+1029 1092 1
+1029 1103 1
+1029 1114 1
+1029 1123 1
+1029 1128 1
+1029 1131 1
+1029 1144 1
+1029 1154 1
+1029 1160 1
+1029 1186 1
+1029 1190 1
+1029 1193 1
+1029 1196 1
+1029 1201 1
+1029 1211 1
+1029 1218 1
+1029 1220 1
+1029 1222 1
+1029 1261 1
+1029 1279 1
+1029 1297 1
+1029 1319 1
+1029 1321 1
+1029 1330 1
+1029 1372 1
+1029 1375 1
+1029 1377 1
+1029 1382 1
+1029 1394 1
+1029 1396 1
+1029 1402 1
+1029 1413 1
+1029 1418 1
+1029 1420 1
+1029 1428 1
+1029 1439 1
+1029 1441 1
+1029 1446 1
+1029 1453 1
+1029 1464 1
+1029 1468 1
+1029 1471 1
+1029 1476 1
+1029 1484 1
+1029 1485 1
+1029 1486 1
+1029 1487 1
+1029 1490 1
+1029 1496 1
+1029 1497 1
+1029 1506 1
+1029 1507 1
+1029 1513 1
+1029 1520 1
+1029 1524 1
+1029 1531 1
+1029 1533 1
+1029 1537 1
+1029 1538 1
+1029 1555 1
+1029 1556 1
+1029 1557 1
+1029 1573 1
+1029 1580 1
+1029 1587 1
+1029 1654 1
+1029 1661 1
+1029 1662 1
+1029 1679 1
+1029 1758 1
+1029 1768 1
+1029 1774 1
+1029 1780 1
+1029 1783 1
+1029 1787 1
+1029 1788 1
+1029 1791 1
+1029 1798 1
+1029 1802 1
+1029 1811 1
+1029 2625 1
+1029 2843 1
+1029 3755 1
+1029 8289 1
+1031 311 1
+1031 1012 1
+1031 1154 1
+1031 1186 1
+1031 1297 1
+1031 1492 1
+1031 1549 1
+1031 1621 1
+1031 1835 1
+1031 1842 1
+1031 1888 1
+1031 2339 1
+1031 2490 1
+1031 2550 1
+1031 2585 1
+1031 2619 1
+1031 3104 1
+1031 3351 1
+1031 3650 1
+1032 311 1
+1032 647 1
+1032 663 1
+1032 857 1
+1032 978 1
+1032 993 1
+1032 1039 1
+1032 1243 1
+1032 1267 1
+1032 1357 1
+1032 1413 1
+1032 1482 1
+1032 1506 1
+1032 1520 1
+1032 1556 1
+1032 1603 1
+1032 1622 1
+1032 1658 1
+1032 1680 1
+1032 1997 1
+1032 2128 1
+1032 2328 1
+1032 2909 1
+1032 2912 1
+1032 3024 1
+1032 3089 1
+1032 3136 1
+1032 3253 1
+1032 3352 1
+1032 3587 1
+1032 3720 1
+1032 3787 1
+1032 4037 1
+1032 4191 1
+1032 4712 1
+1032 5222 1
+1032 5683 1
+1032 6774 1
+1032 6833 1
+1033 271 1
+1033 311 1
+1033 626 1
+1033 956 1
+1033 1053 1
+1033 1123 1
+1034 15 1
+1034 271 1
+1034 311 1
+1034 321 1
+1034 372 1
+1034 417 1
+1034 579 1
+1034 857 1
+1034 907 1
+1034 974 1
+1034 1043 1
+1034 1062 1
+1034 1141 1
+1034 1164 1
+1034 1186 1
+1034 1201 1
+1034 1218 1
+1034 1253 1
+1034 1297 1
+1034 1319 1
+1034 1322 1
+1034 1482 1
+1034 1484 1
+1034 1585 1
+1034 1595 1
+1034 1603 1
+1034 1718 1
+1034 2508 1
+1034 2612 1
+1034 2775 1
+1034 3005 1
+1034 3680 1
+1034 4828 1
+1035 742 1
+1035 947 1
+1035 1190 1
+1035 1547 1
+1035 2062 1
+1035 2341 1
+1035 2350 1
+1035 2499 1
+1035 2547 1
+1035 2697 1
+1035 2963 1
+1035 5817 1
+1039 407 1
+1039 989 1
+1039 1482 1
+1039 1585 1
+1039 2157 1
+1039 2685 1
+1037 15 1
+1037 204 1
+1037 230 1
+1037 415 1
+1037 417 1
+1037 686 1
+1037 722 1
+1037 761 1
+1037 859 1
+1037 908 1
+1037 946 1
+1037 947 1
+1037 960 1
+1037 1026 1
+1037 1039 1
+1037 1144 1
+1037 1167 1
+1037 1297 1
+1037 1353 1
+1037 1374 1
+1037 1378 1
+1037 1437 1
+1037 1514 1
+1037 1520 1
+1037 1549 1
+1037 1571 1
+1037 1585 1
+1037 1592 1
+1037 1613 1
+1037 1622 1
+1037 1633 1
+1037 1648 1
+1037 1734 1
+1037 1744 1
+1037 1758 1
+1037 1783 1
+1037 1918 1
+1037 1966 1
+1037 1982 1
+1037 2066 1
+1037 2137 1
+1037 2160 1
+1037 2165 1
+1037 2210 1
+1037 2225 1
+1037 2323 1
+1037 2338 1
+1037 2339 1
+1037 2398 1
+1037 2411 1
+1037 2506 1
+1037 2535 1
+1037 2625 1
+1037 2654 1
+1037 2665 1
+1037 2877 1
+1037 2966 1
+1037 3014 1
+1037 3030 1
+1037 3130 1
+1037 3253 1
+1037 3334 1
+1037 3459 1
+1037 3516 1
+1037 3724 1
+1037 3843 1
+1037 4037 1
+1037 4266 1
+1037 4335 1
+1037 4510 1
+1037 4875 1
+1037 5022 1
+1037 5079 1
+1037 5484 1
+1037 5671 1
+1037 5902 1
+1037 5963 1
+1037 6299 1
+1037 6634 1
+1037 6720 1
+1037 6833 1
+1037 6855 1
+1037 7225 1
+1037 7620 1
+1037 7632 1
+1037 8290 1
+1038 271 1
+1038 545 1
+1038 707 1
+1038 710 1
+1038 1039 1
+1038 1618 1
+1040 1038 1
+1041 15 1
+1041 896 1
+1041 913 1
+1041 1026 1
+1041 1038 1
+1041 1199 1
+1041 1319 1
+1041 1514 1
+1041 1585 1
+1041 1758 1
+1041 2276 1
+1041 2277 1
+1041 2510 1
+1041 2516 1
+1041 2535 1
+1041 2747 1
+1041 2790 1
+1041 3417 1
+1041 3586 1
+1041 3956 1
+1041 4103 1
+1041 4127 1
+1041 4453 1
+1041 4468 1
+1041 4587 1
+1041 4796 1
+1041 4828 1
+1041 4875 1
+1041 5022 1
+1041 5262 1
+1041 5285 1
+1041 5308 1
+1041 5309 1
+1041 5326 1
+1041 5404 1
+1041 5638 1
+1041 5693 1
+1041 5697 1
+1041 5743 1
+1041 5790 1
+1041 5928 1
+1041 6124 1
+1041 6262 1
+1041 6270 1
+1041 6311 1
+1041 6715 1
+1041 6934 1
+1041 6979 1
+1041 7052 1
+1042 332 1
+1042 769 1
+1042 856 1
+1042 1043 1
+1042 1100 1
+1042 1137 1
+1042 1267 1
+1042 1297 1
+1042 1384 1
+1042 1396 1
+1042 1407 1
+1042 1592 1
+1042 1744 1
+1042 1835 1
+1042 1842 1
+1042 1992 1
+1042 2073 1
+1042 2109 1
+1042 2231 1
+1042 2256 1
+1042 2470 1
+1042 2504 1
+1042 2643 1
+1042 2665 1
+1042 2669 1
+1042 2763 1
+1042 2785 1
+1042 2801 1
+1042 2877 1
+1042 2880 1
+1042 2951 1
+1042 2963 1
+1042 4412 1
+1042 4653 1
+1042 5155 1
+1042 5254 1
+1042 5799 1
+1042 6560 1
+1042 6595 1
+1042 6686 1
+1042 7073 1
+1043 350 1
+1043 372 1
+1043 762 1
+1043 763 1
+1043 769 1
+1043 1186 1
+1043 1396 1
+1043 1465 1
+1043 1658 1
+1043 1717 1
+1043 1734 1
+1043 1835 1
+1043 2660 1
+1043 2787 1
+1043 3338 1
+1043 3351 1
+1043 4424 1
+1043 4953 1
+1043 7073 1
+1043 7115 1
+1043 8290 1
+1044 769 1
+1044 941 1
+1044 1049 1
+1044 1218 1
+1044 1465 1
+1044 2114 1
+1044 2686 1
+1044 3926 1
+1044 5055 1
+1045 769 1
+1046 407 1
+1046 432 1
+1046 647 1
+1046 663 1
+1046 710 1
+1046 769 1
+1046 810 1
+1046 971 1
+1046 978 1
+1046 1156 1
+1046 1167 1
+1046 1193 1
+1046 1222 1
+1046 1234 1
+1046 1319 1
+1046 1321 1
+1046 1326 1
+1046 1394 1
+1046 1425 1
+1046 1428 1
+1046 1476 1
+1046 1486 1
+1046 1537 1
+1046 1580 1
+1047 769 1
+1048 769 1
+1048 3479 1
+1049 769 1
+1049 1044 1
+1049 1465 1
+1050 35 1
+1050 372 1
+1050 575 1
+1050 697 1
+1050 956 1
+1050 960 1
+1050 975 1
+1050 1022 1
+1050 1053 1
+1050 1123 1
+1050 1154 1
+1050 1193 1
+1050 1199 1
+1050 1203 1
+1050 1284 1
+1050 1357 1
+1050 1378 1
+1050 1407 1
+1050 1441 1
+1050 1549 1
+1050 1714 1
+1050 1726 1
+1050 1758 1
+1050 1793 1
+1050 1802 1
+1050 1855 1
+1050 1920 1
+1050 1927 1
+1050 1963 1
+1050 1966 1
+1050 2053 1
+1050 2101 1
+1050 2210 1
+1050 2211 1
+1050 2253 1
+1050 2264 1
+1050 2398 1
+1050 2565 1
+1050 2617 1
+1050 2651 1
+1050 2708 1
+1050 2777 1
+1050 3251 1
+1050 8290 1
+1052 321 1
+1052 1053 1
+1052 1123 1
+1052 1781 1
+1051 15 1
+1051 290 1
+1051 644 1
+1051 762 1
+1051 938 1
+1051 968 1
+1051 1053 1
+1051 1123 1
+1051 1164 1
+1051 1186 1
+1051 1384 1
+1051 1385 1
+1051 1416 1
+1051 1420 1
+1051 1592 1
+1051 1629 1
+1051 1633 1
+1051 1662 1
+1051 1680 1
+1051 2109 1
+1051 2135 1
+1051 2285 1
+1051 2398 1
+1051 2470 1
+1051 2485 1
+1051 2579 1
+1051 2660 1
+1051 2851 1
+1051 2963 1
+1051 3180 1
+1051 3439 1
+1051 3480 1
+1051 4175 1
+1051 4179 1
+1051 4453 1
+1051 4827 1
+1051 4953 1
+1051 5022 1
+1051 5335 1
+1051 6496 1
+1051 6498 1
+1051 6955 1
+1051 7778 1
+1051 7890 1
+1051 8174 1
+1051 8192 1
+1055 15 1
+1055 56 1
+1055 204 1
+1055 214 1
+1055 227 1
+1055 259 1
+1055 290 1
+1055 298 1
+1055 321 1
+1055 417 1
+1055 432 1
+1055 579 1
+1055 691 1
+1055 697 1
+1055 737 1
+1055 761 1
+1055 762 1
+1055 771 1
+1055 826 1
+1055 871 1
+1055 896 1
+1055 908 1
+1055 913 1
+1055 928 1
+1055 948 1
+1055 959 1
+1055 960 1
+1055 978 1
+1055 993 1
+1055 1034 1
+1055 1075 1
+1055 1092 1
+1055 1157 1
+1055 1193 1
+1055 1201 1
+1055 1211 1
+1055 1236 1
+1055 1247 1
+1055 1248 1
+1055 1261 1
+1055 1279 1
+1055 1297 1
+1055 1322 1
+1055 1360 1
+1055 1375 1
+1055 1382 1
+1055 1411 1
+1055 1428 1
+1055 1437 1
+1055 1439 1
+1055 1468 1
+1055 1471 1
+1055 1476 1
+1055 1478 1
+1055 1482 1
+1055 1484 1
+1055 1489 1
+1055 1493 1
+1055 1496 1
+1055 1514 1
+1055 1531 1
+1055 1538 1
+1055 1549 1
+1055 1555 1
+1055 1564 1
+1055 1569 1
+1055 1573 1
+1055 1585 1
+1055 1587 1
+1055 1593 1
+1055 1597 1
+1055 1622 1
+1055 1633 1
+1055 1638 1
+1055 1648 1
+1055 1649 1
+1055 1652 1
+1055 1654 1
+1055 1661 1
+1055 1662 1
+1055 1679 1
+1055 1687 1
+1055 1700 1
+1055 1744 1
+1055 1752 1
+1055 1758 1
+1055 1768 1
+1055 1774 1
+1055 1811 1
+1055 1823 1
+1055 1849 1
+1055 1857 1
+1055 1864 1
+1055 1918 1
+1055 1935 1
+1055 1956 1
+1055 1982 1
+1055 1990 1
+1055 2106 1
+1055 2144 1
+1055 2151 1
+1055 2157 1
+1055 2285 1
+1055 2323 1
+1055 2328 1
+1055 2339 1
+1055 2341 1
+1055 2398 1
+1055 2411 1
+1055 2416 1
+1055 2504 1
+1055 2535 1
+1055 2565 1
+1055 2576 1
+1055 2580 1
+1055 2620 1
+1055 2625 1
+1055 2654 1
+1055 2747 1
+1055 2774 1
+1055 2775 1
+1055 2790 1
+1055 2877 1
+1055 2900 1
+1055 2902 1
+1055 2923 1
+1055 2963 1
+1055 3005 1
+1055 3014 1
+1055 3084 1
+1055 3089 1
+1055 3103 1
+1055 3117 1
+1055 3136 1
+1055 3140 1
+1055 3192 1
+1055 3276 1
+1055 3291 1
+1055 3483 1
+1055 3516 1
+1055 3520 1
+1055 3541 1
+1055 3554 1
+1055 3580 1
+1055 3755 1
+1055 3976 1
+1055 4037 1
+1055 4058 1
+1055 4099 1
+1055 4175 1
+1055 4191 1
+1055 4290 1
+1055 4530 1
+1055 4536 1
+1055 4735 1
+1055 4797 1
+1055 4811 1
+1055 4820 1
+1055 4875 1
+1055 5002 1
+1055 5022 1
+1055 5123 1
+1055 5148 1
+1055 5254 1
+1055 5288 1
+1055 5412 1
+1055 5683 1
+1055 5714 1
+1055 5780 1
+1055 5790 1
+1055 5863 1
+1055 5902 1
+1055 5963 1
+1055 5994 1
+1055 6004 1
+1055 6306 1
+1055 6328 1
+1055 6347 1
+1055 6523 1
+1055 6566 1
+1055 6599 1
+1055 6665 1
+1055 6720 1
+1055 6739 1
+1055 6979 1
+1055 7047 1
+1055 7478 1
+1055 7497 1
+1055 7544 1
+1055 7553 1
+1055 7683 1
+1055 7699 1
+1055 7707 1
+1055 7726 1
+1055 7910 1
+1055 8294 1
+1058 784 1
+1059 784 1
+1059 2470 1
+1060 784 1
+1061 937 1
+1061 1390 1
+1062 35 1
+1062 227 1
+1062 271 1
+1062 321 1
+1062 403 1
+1062 432 1
+1062 644 1
+1062 647 1
+1062 663 1
+1062 705 1
+1062 707 1
+1062 710 1
+1062 722 1
+1062 763 1
+1062 764 1
+1062 765 1
+1062 803 1
+1062 836 1
+1062 853 1
+1062 922 1
+1062 935 1
+1062 941 1
+1062 943 1
+1062 946 1
+1062 947 1
+1062 959 1
+1062 975 1
+1062 982 1
+1062 993 1
+1062 994 1
+1062 999 1
+1062 1035 1
+1062 1125 1
+1062 1152 1
+1062 1164 1
+1062 1185 1
+1062 1190 1
+1062 1193 1
+1062 1201 1
+1062 1203 1
+1062 1221 1
+1062 1230 1
+1062 1243 1
+1062 1250 1
+1062 1259 1
+1062 1266 1
+1062 1267 1
+1062 1282 1
+1062 1286 1
+1062 1291 1
+1062 1296 1
+1062 1330 1
+1062 1357 1
+1062 1374 1
+1062 1416 1
+1062 1418 1
+1062 1419 1
+1062 1425 1
+1062 1444 1
+1062 1492 1
+1062 1521 1
+1062 1534 1
+1062 1566 1
+1062 1583 1
+1062 1621 1
+1062 1633 1
+1062 1658 1
+1062 1688 1
+1062 1700 1
+1062 1705 1
+1062 1706 1
+1062 1714 1
+1062 1723 1
+1062 1734 1
+1062 1754 1
+1062 1772 1
+1062 1808 1
+1062 1814 1
+1062 1816 1
+1062 1835 1
+1062 1836 1
+1062 1848 1
+1062 1858 1
+1062 1888 1
+1062 1893 1
+1062 1901 1
+1062 1964 1
+1062 1985 1
+1062 1992 1
+1062 2071 1
+1062 2085 1
+1062 2117 1
+1062 2120 1
+1062 2128 1
+1062 2134 1
+1062 2144 1
+1062 2174 1
+1062 2178 1
+1062 2225 1
+1062 2240 1
+1062 2241 1
+1062 2251 1
+1062 2256 1
+1062 2322 1
+1062 2328 1
+1062 2329 1
+1062 2333 1
+1062 2341 1
+1062 2400 1
+1062 2411 1
+1062 2435 1
+1062 2474 1
+1062 2475 1
+1062 2485 1
+1062 2510 1
+1062 2579 1
+1062 2587 1
+1062 2593 1
+1062 2594 1
+1062 2653 1
+1062 2657 1
+1062 2685 1
+1062 2697 1
+1062 2707 1
+1062 2727 1
+1062 2746 1
+1062 2828 1
+1062 2830 1
+1062 2834 1
+1062 2932 1
+1062 2968 1
+1062 3005 1
+1062 3021 1
+1062 3024 1
+1062 3026 1
+1062 3029 1
+1062 3030 1
+1062 3033 1
+1062 3059 1
+1062 3117 1
+1062 3192 1
+1062 3307 1
+1062 3351 1
+1062 3352 1
+1062 3394 1
+1062 3404 1
+1062 3529 1
+1062 3645 1
+1062 3812 1
+1062 3956 1
+1062 4011 1
+1062 4256 1
+1062 4263 1
+1062 4269 1
+1062 4531 1
+1062 8291 1
+1063 35 1
+1063 243 1
+1063 299 1
+1063 971 1
+1063 1167 1
+1063 1465 1
+1063 1603 1
+1063 1799 1
+1063 1901 1
+1063 2145 1
+1063 2381 1
+1063 2658 1
+1063 3089 1
+1063 3103 1
+1063 3456 1
+1063 3568 1
+1063 3873 1
+1063 4717 1
+1063 5037 1
+1063 5273 1
+1063 5671 1
+1063 5680 1
+1063 5844 1
+1063 6006 1
+1063 6123 1
+1063 6832 1
+1063 7021 1
+1063 7052 1
+1063 7908 1
+1064 15 1
+1064 243 1
+1064 857 1
+1064 1200 1
+1064 1201 1
+1064 1476 1
+1064 1654 1
+1064 1680 1
+1064 2225 1
+1064 2333 1
+1064 3034 1
+1064 3803 1
+1064 3822 1
+1064 4212 1
+1064 6243 1
+1064 6589 1
+1067 243 1
+1067 8290 1
+1065 243 1
+1065 1186 1
+1065 1218 1
+1065 1849 1
+1065 1857 1
+1065 2328 1
+1065 4011 1
+1066 243 1
+1066 271 1
+1066 1044 1
+1066 1131 1
+1066 2339 1
+1070 1044 1
+1071 1044 1
+1072 1044 1
+872 271 1
+872 465 1
+872 686 1
+872 974 1
+872 993 1
+872 1044 1
+872 1164 1
+872 1166 1
+872 1279 1
+872 1413 1
+872 1489 1
+872 1648 1
+872 1653 1
+872 1654 1
+872 1662 1
+872 1672 1
+872 1689 1
+872 1730 1
+872 1780 1
+872 1811 1
+872 1857 1
+872 2073 1
+872 2225 1
+872 2264 1
+872 2770 1
+872 2856 1
+872 3136 1
+872 3587 1
+872 5499 1
+1074 686 1
+1074 994 1
+1074 1222 1
+1074 1321 1
+1074 1352 1
+1074 1823 1
+1074 1972 1
+1074 2160 1
+1074 2273 1
+1074 2285 1
+1074 2433 1
+1074 2440 1
+1074 2914 1
+1074 3291 1
+1074 3634 1
+1074 3792 1
+1074 3830 1
+1074 3842 1
+1074 3919 1
+1074 4065 1
+1074 4099 1
+1074 4412 1
+1074 4507 1
+1074 4709 1
+1074 4712 1
+1074 4713 1
+1074 4717 1
+1074 4791 1
+1074 4994 1
+1074 5002 1
+1074 5037 1
+1074 5140 1
+1074 5188 1
+1074 5254 1
+1074 5524 1
+1074 5563 1
+1074 5584 1
+1074 5596 1
+1074 5626 1
+1074 5714 1
+1074 5739 1
+1074 5799 1
+1074 5818 1
+1074 5824 1
+1074 5827 1
+1074 5829 1
+1074 5871 1
+1074 5950 1
+1074 6004 1
+1074 6156 1
+1074 6170 1
+1074 6221 1
+1074 6299 1
+1074 6327 1
+1074 6347 1
+1074 6409 1
+1074 6424 1
+1074 6441 1
+1074 6474 1
+1074 6481 1
+1074 6491 1
+1074 6496 1
+1074 6498 1
+1074 6501 1
+1074 6505 1
+1074 6528 1
+1074 6529 1
+1074 6554 1
+1074 6560 1
+1074 6570 1
+1074 6592 1
+1074 6595 1
+1074 6599 1
+1074 6600 1
+1074 6613 1
+1074 6632 1
+1074 6663 1
+1074 6665 1
+1074 6670 1
+1074 6699 1
+1074 6700 1
+1074 6725 1
+1074 6739 1
+1074 6755 1
+1074 6769 1
+1074 6770 1
+1074 6788 1
+1074 6850 1
+1074 6860 1
+1074 6869 1
+1074 6873 1
+1074 6890 1
+1074 6892 1
+1074 6897 1
+1074 6930 1
+1075 15 1
+1075 35 1
+1075 227 1
+1075 259 1
+1075 324 1
+1075 407 1
+1075 432 1
+1075 579 1
+1075 665 1
+1075 686 1
+1075 763 1
+1075 825 1
+1075 853 1
+1075 907 1
+1075 971 1
+1075 1018 1
+1075 1080 1
+1075 1111 1
+1075 1127 1
+1075 1140 1
+1075 1157 1
+1075 1165 1
+1075 1203 1
+1075 1330 1
+1075 1353 1
+1075 1372 1
+1075 1375 1
+1075 1418 1
+1075 1420 1
+1075 1425 1
+1075 1473 1
+1075 1476 1
+1075 1525 1
+1075 1537 1
+1075 1548 1
+1075 1622 1
+1075 1717 1
+1075 1802 1
+1075 1842 1
+1075 1858 1
+1075 1893 1
+1075 1927 1
+1075 1953 1
+1075 2137 1
+1075 2237 1
+1075 2354 1
+1075 2398 1
+1075 2470 1
+1075 2593 1
+1075 2595 1
+1075 2653 1
+1075 3018 1
+1075 3034 1
+1075 3192 1
+1075 3243 1
+1075 3321 1
+1075 3352 1
+1075 3650 1
+1075 4055 1
+1075 4110 1
+1075 4179 1
+1075 4276 1
+1075 4448 1
+1075 4666 1
+1075 5254 1
+1075 5341 1
+1075 5423 1
+1075 5452 1
+1075 5484 1
+1075 5511 1
+1075 5624 1
+1075 6229 1
+1075 6388 1
+1075 7131 1
+1084 271 1
+1084 338 1
+1084 626 1
+1084 1080 1
+1084 2210 1
+1078 259 1
+1078 271 1
+1078 626 1
+1078 1075 1
+1078 1193 1
+1079 271 1
+1079 5925 1
+1080 271 1
+1080 959 1
+1080 1836 1
+1080 1842 1
+1080 1855 1
+1081 271 1
+1082 271 1
+1082 1506 1
+1082 1903 1
+1082 2708 1
+1083 271 1
+1083 1783 1
+1085 214 1
+1085 259 1
+1085 626 1
+1085 1842 1
+1086 579 1
+1086 626 1
+1086 665 1
+1086 1151 1
+1086 1152 1
+1086 1464 1
+1086 1991 1
+1086 2097 1
+1089 259 1
+1089 626 1
+1089 873 1
+1089 1000 1
+1089 1152 1
+1089 1717 1
+1089 1842 1
+1089 1855 1
+1087 626 1
+1087 5254 1
+1088 626 1
+1093 1080 1
+1093 1842 1
+1094 1080 1
+1094 1842 1
+1095 959 1
+1095 1080 1
+1095 1103 1
+1095 1542 1
+1095 1833 1
+1095 1836 1
+1095 1842 1
+1095 1855 1
+1095 2504 1
+1095 2697 1
+1096 1080 1
+1097 15 1
+1097 56 1
+1097 204 1
+1097 417 1
+1097 737 1
+1097 762 1
+1097 805 1
+1097 856 1
+1097 941 1
+1097 993 1
+1097 1049 1
+1097 1080 1
+1097 1193 1
+1097 1201 1
+1097 1211 1
+1097 1239 1
+1097 1247 1
+1097 1297 1
+1097 1393 1
+1097 1428 1
+1097 1437 1
+1097 1521 1
+1097 1549 1
+1097 1564 1
+1097 1573 1
+1097 1595 1
+1097 1633 1
+1097 1637 1
+1097 1700 1
+1097 1808 1
+1097 1814 1
+1097 1919 1
+1097 2066 1
+1097 2102 1
+1097 2174 1
+1097 2256 1
+1097 2323 1
+1097 2328 1
+1097 2366 1
+1097 2381 1
+1097 2470 1
+1097 2479 1
+1097 2516 1
+1097 2570 1
+1097 2576 1
+1097 2594 1
+1097 2625 1
+1097 2651 1
+1097 2653 1
+1097 2685 1
+1097 2768 1
+1097 2794 1
+1097 2801 1
+1097 2830 1
+1097 2958 1
+1097 2972 1
+1097 3014 1
+1097 3020 1
+1097 3027 1
+1097 3030 1
+1097 3033 1
+1097 3089 1
+1097 3117 1
+1097 3155 1
+1097 3192 1
+1097 3274 1
+1097 3309 1
+1097 3352 1
+1097 3393 1
+1097 3443 1
+1097 3456 1
+1097 3554 1
+1097 3562 1
+1097 3580 1
+1097 3926 1
+1097 4124 1
+1097 4247 1
+1097 4256 1
+1097 4310 1
+1097 4335 1
+1097 4530 1
+1097 4735 1
+1097 4953 1
+1097 5412 1
+1097 5449 1
+1097 5452 1
+1097 5743 1
+1097 7450 1
+1098 56 1
+1098 285 1
+1098 350 1
+1098 722 1
+1098 764 1
+1098 859 1
+1098 946 1
+1098 947 1
+1098 959 1
+1098 967 1
+1098 993 1
+1098 1018 1
+1098 1026 1
+1098 1049 1
+1098 1080 1
+1098 1103 1
+1098 1166 1
+1098 1186 1
+1098 1291 1
+1098 1315 1
+1098 1357 1
+1098 1378 1
+1098 1407 1
+1098 1419 1
+1098 1492 1
+1098 1514 1
+1098 1521 1
+1098 1542 1
+1098 1549 1
+1098 1565 1
+1098 1583 1
+1098 1608 1
+1098 1613 1
+1098 1633 1
+1098 1646 1
+1098 1653 1
+1098 1700 1
+1098 1714 1
+1098 1730 1
+1098 1734 1
+1098 1754 1
+1098 1772 1
+1098 1781 1
+1098 1783 1
+1098 1808 1
+1098 1814 1
+1098 1833 1
+1098 1835 1
+1098 1836 1
+1098 1837 1
+1098 1847 1
+1098 1848 1
+1098 1855 1
+1098 1859 1
+1098 1888 1
+1098 1893 1
+1098 1919 1
+1098 1956 1
+1098 1963 1
+1098 1964 1
+1098 1969 1
+1098 1973 1
+1098 1982 1
+1098 1991 1
+1098 1992 1
+1098 1997 1
+1098 2016 1
+1098 2062 1
+1098 2066 1
+1098 2071 1
+1098 2072 1
+1098 2079 1
+1098 2095 1
+1098 2102 1
+1098 2106 1
+1098 2109 1
+1098 2114 1
+1098 2117 1
+1098 2120 1
+1098 2128 1
+1098 2174 1
+1098 2178 1
+1098 2181 1
+1098 2193 1
+1098 2225 1
+1098 2240 1
+1098 2241 1
+1098 2251 1
+1098 2256 1
+1098 2264 1
+1098 2294 1
+1098 2297 1
+1098 2322 1
+1098 2332 1
+1098 2338 1
+1098 2341 1
+1098 2375 1
+1098 2385 1
+1098 2400 1
+1098 2410 1
+1098 2435 1
+1098 2474 1
+1098 2504 1
+1098 2542 1
+1098 2560 1
+1098 2565 1
+1098 2570 1
+1098 2576 1
+1098 2579 1
+1098 2585 1
+1098 2589 1
+1098 2593 1
+1098 2594 1
+1098 2620 1
+1098 2625 1
+1098 2650 1
+1098 2651 1
+1098 2654 1
+1098 2658 1
+1098 2669 1
+1098 2672 1
+1098 2685 1
+1098 2697 1
+1098 2707 1
+1098 2721 1
+1098 2781 1
+1098 2785 1
+1098 2794 1
+1098 2805 1
+1098 2814 1
+1098 2828 1
+1098 2851 1
+1098 2940 1
+1098 2963 1
+1098 2968 1
+1098 2973 1
+1098 3005 1
+1098 3018 1
+1098 3029 1
+1098 3030 1
+1098 3033 1
+1098 3034 1
+1098 3084 1
+1098 3117 1
+1098 3130 1
+1098 3150 1
+1098 3238 1
+1098 3253 1
+1098 3265 1
+1098 3297 1
+1098 3310 1
+1098 3346 1
+1098 3351 1
+1098 3408 1
+1098 3435 1
+1098 3459 1
+1098 3473 1
+1098 3489 1
+1098 3529 1
+1098 3537 1
+1098 3580 1
+1098 3726 1
+1098 4037 1
+1098 4401 1
+1098 4483 1
+1098 4632 1
+1098 4666 1
+1098 4764 1
+1098 4940 1
+1098 4981 1
+1098 5002 1
+1098 5020 1
+1098 5079 1
+1098 5246 1
+1098 5289 1
+1098 5321 1
+1098 5415 1
+1098 5432 1
+1098 5466 1
+1098 5582 1
+1098 5614 1
+1098 5697 1
+1098 5738 1
+1098 5760 1
+1098 5772 1
+1098 5773 1
+1098 5776 1
+1098 5800 1
+1098 5806 1
+1098 5807 1
+1098 5811 1
+1098 5812 1
+1098 5814 1
+1098 5819 1
+1098 5822 1
+1098 5829 1
+1098 5897 1
+1098 5932 1
+1098 5998 1
+1098 6004 1
+1098 6032 1
+1098 6043 1
+1098 6097 1
+1098 6123 1
+1098 6151 1
+1098 6170 1
+1098 6241 1
+1098 6270 1
+1098 6296 1
+1098 6299 1
+1098 6305 1
+1098 6306 1
+1098 6323 1
+1098 6327 1
+1098 6330 1
+1098 6334 1
+1098 6424 1
+1098 6555 1
+1098 6560 1
+1098 6568 1
+1098 6624 1
+1098 6665 1
+1098 6712 1
+1098 6714 1
+1098 6736 1
+1098 6739 1
+1098 6765 1
+1098 6783 1
+1098 6784 1
+1098 6789 1
+1098 6790 1
+1098 6806 1
+1098 6855 1
+1098 6860 1
+1098 6913 1
+1098 6914 1
+1098 6917 1
+1098 6934 1
+1098 6938 1
+1098 6946 1
+1098 6953 1
+1098 6955 1
+1098 6967 1
+1098 6976 1
+1098 6979 1
+1098 6980 1
+1098 6982 1
+1098 7012 1
+1098 7021 1
+1098 7047 1
+1098 7050 1
+1098 7052 1
+1098 7059 1
+1098 7060 1
+1098 7063 1
+1098 7092 1
+1098 7094 1
+1098 7108 1
+1098 7110 1
+1098 7120 1
+1098 7131 1
+1098 7186 1
+1098 7201 1
+1098 7233 1
+1098 7262 1
+1098 7277 1
+1098 7323 1
+1098 7351 1
+1098 7378 1
+1098 7381 1
+1098 7386 1
+1098 7391 1
+1098 7397 1
+1098 7414 1
+1098 7478 1
+1098 7553 1
+1098 7574 1
+1098 7587 1
+1098 7618 1
+1098 7620 1
+1098 7634 1
+1098 7646 1
+1098 7647 1
+1098 7651 1
+1098 7662 1
+1098 7666 1
+1098 7675 1
+1098 7701 1
+1098 7707 1
+1098 7726 1
+1098 7763 1
+1098 7810 1
+1098 7819 1
+1098 7833 1
+1098 7839 1
+1098 7874 1
+1098 7879 1
+1098 7924 1
+1098 8002 1
+1098 8050 1
+1098 8141 1
+1098 8168 1
+1098 8246 1
+1098 8290 1
+1098 8291 1
+1103 993 1
+1103 1080 1
+1103 1211 1
+1103 1842 1
+1103 2504 1
+1103 2517 1
+1103 2570 1
+1103 2708 1
+1103 2946 1
+1099 559 1
+1099 1080 1
+1099 1103 1
+1099 1297 1
+1099 1542 1
+1099 1836 1
+1099 1842 1
+1099 1855 1
+1104 1080 1
+1100 1080 1
+1100 2657 1
+1105 1080 1
+1105 1836 1
+1105 2654 1
+1106 15 1
+1106 1080 1
+1101 1080 1
+1107 1080 1
+1108 1080 1
+1109 1080 1
+1110 1080 1
+1111 15 1
+1111 72 1
+1111 259 1
+1111 299 1
+1111 432 1
+1111 722 1
+1111 803 1
+1111 922 1
+1111 959 1
+1111 993 1
+1111 999 1
+1111 1075 1
+1111 1080 1
+1111 1193 1
+1111 1196 1
+1111 1241 1
+1111 1243 1
+1111 1247 1
+1111 1330 1
+1111 1353 1
+1111 1542 1
+1111 1548 1
+1111 1583 1
+1111 1717 1
+1111 1836 1
+1111 1842 1
+1111 1855 1
+1111 1927 1
+1111 1977 1
+1111 1997 1
+1111 2060 1
+1111 2062 1
+1111 2066 1
+1111 2073 1
+1111 2085 1
+1111 2106 1
+1111 2323 1
+1111 2354 1
+1111 2398 1
+1111 2400 1
+1111 2822 1
+1111 2925 1
+1111 3084 1
+1111 3192 1
+1111 3352 1
+1111 3897 1
+1111 4065 1
+1111 4191 1
+1111 4247 1
+1111 4310 1
+1111 4400 1
+1111 5178 1
+1111 5254 1
+1111 5263 1
+1111 5392 1
+1111 5412 1
+1111 5423 1
+1111 5524 1
+1111 5543 1
+1111 5683 1
+1112 1080 1
+1113 1075 1
+1113 1080 1
+1113 1855 1
+1113 2398 1
+1113 3352 1
+1113 3835 1
+1102 1080 1
+1102 1103 1
+1102 1411 1
+1102 1836 1
+1102 1837 1
+1102 1842 1
+1102 1855 1
+1102 1903 1
+1102 2144 1
+1102 2479 1
+1102 2570 1
+1102 2625 1
+1102 2654 1
+1102 3173 1
+1102 3276 1
+1114 171 1
+1114 230 1
+1114 299 1
+1114 334 1
+1114 663 1
+1114 665 1
+1114 705 1
+1114 710 1
+1114 853 1
+1114 922 1
+1114 941 1
+1114 971 1
+1114 978 1
+1114 985 1
+1114 989 1
+1114 1062 1
+1114 1140 1
+1114 1144 1
+1114 1160 1
+1114 1192 1
+1114 1193 1
+1114 1201 1
+1114 1211 1
+1114 1220 1
+1114 1221 1
+1114 1222 1
+1114 1261 1
+1114 1270 1
+1114 1286 1
+1114 1321 1
+1114 1322 1
+1114 1330 1
+1114 1394 1
+1114 1413 1
+1114 1718 1
+1114 1752 1
+1114 1770 1
+1114 1787 1
+1114 2416 1
+1432 1697 1
+1115 1432 1
+1120 1123 1
+1124 350 1
+1124 696 1
+1124 859 1
+1124 993 1
+1124 1031 1
+1124 1492 1
+1124 1564 1
+1124 1772 1
+1124 1888 1
+1124 1992 1
+1124 2062 1
+1124 2117 1
+1124 2128 1
+1124 2151 1
+1124 2168 1
+1124 2195 1
+1124 2205 1
+1124 2579 1
+1124 2625 1
+1124 2685 1
+1125 72 1
+1125 171 1
+1125 214 1
+1125 407 1
+1125 608 1
+1125 663 1
+1125 696 1
+1125 737 1
+1125 805 1
+1125 810 1
+1125 930 1
+1125 960 1
+1125 993 1
+1125 1140 1
+1125 1154 1
+1125 1211 1
+1125 1287 1
+1125 1492 1
+1125 1564 1
+1125 1585 1
+1125 1772 1
+1125 1783 1
+1125 1919 1
+1125 1992 1
+1125 2066 1
+1125 2151 1
+1125 2195 1
+1125 2398 1
+1125 2504 1
+1125 2625 1
+1125 3473 1
+1125 3516 1
+1125 3769 1
+1125 3796 1
+1125 4578 1
+1125 4735 1
+1125 6665 1
+1126 214 1
+1126 696 1
+1128 35 1
+1128 1140 1
+1128 1279 1
+1128 1476 1
+1128 1525 1
+1128 1564 1
+1128 1569 1
+1128 1641 1
+1128 1799 1
+1128 1859 1
+1128 2968 1
+1128 4424 1
+1128 5449 1
+1127 35 1
+1127 465 1
+1127 559 1
+1127 579 1
+1127 665 1
+1127 691 1
+1127 941 1
+1127 1049 1
+1127 1128 1
+1127 1165 1
+1127 1166 1
+1127 1199 1
+1127 1297 1
+1127 1319 1
+1127 1357 1
+1127 1384 1
+1127 1416 1
+1127 1482 1
+1127 1489 1
+1127 1496 1
+1127 1507 1
+1127 1525 1
+1127 1593 1
+1127 1604 1
+1127 1610 1
+1127 1621 1
+1127 1633 1
+1127 1652 1
+1127 1653 1
+1127 1658 1
+1127 1662 1
+1127 1672 1
+1127 1701 1
+1127 1706 1
+1127 1734 1
+1127 1754 1
+1127 1758 1
+1127 1842 1
+1127 2062 1
+1127 2076 1
+1127 2135 1
+1127 2145 1
+1127 2348 1
+1127 2350 1
+1127 2516 1
+1127 2707 1
+1127 2787 1
+1127 2851 1
+1127 2871 1
+1127 2963 1
+1127 3030 1
+1127 3084 1
+1127 3352 1
+1127 3404 1
+1127 3489 1
+1127 4179 1
+1127 4297 1
+1127 4587 1
+1127 4776 1
+1127 5037 1
+1127 5055 1
+1127 5335 1
+1129 171 1
+1129 214 1
+1129 290 1
+1129 415 1
+1129 545 1
+1129 691 1
+1129 761 1
+1129 762 1
+1129 813 1
+1129 887 1
+1129 913 1
+1129 941 1
+1129 959 1
+1129 960 1
+1129 978 1
+1129 993 1
+1129 1022 1
+1129 1029 1
+1129 1031 1
+1129 1074 1
+1129 1131 1
+1129 1156 1
+1129 1167 1
+1129 1211 1
+1129 1234 1
+1129 1241 1
+1129 1248 1
+1129 1261 1
+1129 1286 1
+1129 1297 1
+1129 1321 1
+1129 1377 1
+1129 1407 1
+1129 1420 1
+1129 1428 1
+1129 1478 1
+1129 1489 1
+1129 1497 1
+1129 1514 1
+1129 1537 1
+1129 1538 1
+1129 1556 1
+1129 1557 1
+1129 1563 1
+1129 1569 1
+1129 1573 1
+1129 1580 1
+1129 1585 1
+1129 1618 1
+1129 1622 1
+1129 1689 1
+1129 1774 1
+1129 1861 1
+1129 2151 1
+1129 2157 1
+1129 2160 1
+1129 2397 1
+1129 2576 1
+1129 2790 1
+1129 2877 1
+1129 3140 1
+1129 3755 1
+1130 1131 1
+1132 56 1
+1132 204 1
+1132 259 1
+1132 338 1
+1132 425 1
+1132 665 1
+1132 971 1
+1132 993 1
+1132 1193 1
+1132 1396 1
+1132 1413 1
+1132 1637 1
+1132 1729 1
+1132 1864 1
+1132 1903 1
+1132 2014 1
+1132 2016 1
+1132 2101 1
+1132 2237 1
+1132 2257 1
+1132 2290 1
+1132 2354 1
+1132 2398 1
+1132 2411 1
+1132 2440 1
+1132 2456 1
+1132 2470 1
+1132 2651 1
+1132 2787 1
+1132 2801 1
+1132 2946 1
+1132 3027 1
+1132 3173 1
+1132 3238 1
+1132 3352 1
+1132 3443 1
+1132 3871 1
+1132 3897 1
+1132 4037 1
+1132 4044 1
+1132 4117 1
+1132 4424 1
+1132 4687 1
+1132 5335 1
+1132 5404 1
+1132 5421 1
+1132 5449 1
+1132 5902 1
+1132 6306 1
+1132 6560 1
+1132 6914 1
+1132 6979 1
+1132 7108 1
+1132 7378 1
+1132 7553 1
+1132 7620 1
+1132 7699 1
+1133 15 1
+1133 72 1
+1133 171 1
+1133 230 1
+1133 298 1
+1133 299 1
+1133 346 1
+1133 545 1
+1133 608 1
+1133 633 1
+1133 663 1
+1133 737 1
+1133 761 1
+1133 762 1
+1133 805 1
+1133 825 1
+1133 896 1
+1133 913 1
+1133 922 1
+1133 989 1
+1133 1012 1
+1133 1022 1
+1133 1026 1
+1133 1029 1
+1133 1055 1
+1133 1140 1
+1133 1156 1
+1133 1157 1
+1133 1159 1
+1133 1165 1
+1133 1185 1
+1133 1186 1
+1133 1190 1
+1133 1211 1
+1133 1222 1
+1133 1239 1
+1133 1240 1
+1133 1248 1
+1133 1266 1
+1133 1282 1
+1133 1296 1
+1133 1297 1
+1133 1305 1
+1133 1310 1
+1133 1360 1
+1133 1385 1
+1133 1464 1
+1133 1476 1
+1133 1484 1
+1133 1490 1
+1133 1549 1
+1133 1555 1
+1133 1587 1
+1133 1619 1
+1133 1622 1
+1133 1661 1
+1133 1679 1
+1133 1680 1
+1133 1688 1
+1133 1718 1
+1133 1729 1
+1133 1733 1
+1133 1752 1
+1133 1772 1
+1133 1780 1
+1133 1791 1
+1133 1799 1
+1133 1836 1
+1133 1859 1
+1133 1984 1
+1133 1990 1
+1133 2014 1
+1133 2066 1
+1133 2129 1
+1133 2134 1
+1133 2144 1
+1133 2145 1
+1133 2151 1
+1133 2210 1
+1133 2229 1
+1133 2240 1
+1133 2276 1
+1133 2289 1
+1133 2326 1
+1133 2328 1
+1133 2333 1
+1133 2364 1
+1133 2398 1
+1133 2456 1
+1133 2474 1
+1133 2490 1
+1133 2506 1
+1133 2507 1
+1133 2517 1
+1133 2576 1
+1133 2599 1
+1133 2612 1
+1133 2625 1
+1133 2646 1
+1133 2651 1
+1133 2653 1
+1133 2696 1
+1133 2697 1
+1133 2700 1
+1133 2760 1
+1133 2765 1
+1133 2775 1
+1133 2787 1
+1133 2790 1
+1133 2811 1
+1133 2830 1
+1133 2859 1
+1133 2871 1
+1133 2900 1
+1133 2909 1
+1133 2925 1
+1133 2932 1
+1133 2958 1
+1133 2968 1
+1133 2981 1
+1133 3002 1
+1133 3007 1
+1133 3014 1
+1133 3034 1
+1133 3073 1
+1133 3089 1
+1133 3125 1
+1133 3136 1
+1133 3140 1
+1133 3144 1
+1133 3191 1
+1133 3192 1
+1133 3238 1
+1133 3253 1
+1133 3276 1
+1133 3284 1
+1133 3309 1
+1133 3321 1
+1133 3334 1
+1133 3346 1
+1133 3352 1
+1133 3376 1
+1133 3394 1
+1133 3433 1
+1133 3439 1
+1133 3443 1
+1133 3447 1
+1133 3452 1
+1133 3453 1
+1133 3454 1
+1133 3455 1
+1133 3456 1
+1133 3458 1
+1133 3460 1
+1133 3464 1
+1133 3498 1
+1133 3537 1
+1133 3554 1
+1133 3557 1
+1133 3568 1
+1133 3586 1
+1133 3607 1
+1133 3615 1
+1133 3631 1
+1133 3635 1
+1133 3643 1
+1133 3645 1
+1133 3660 1
+1133 3661 1
+1133 3664 1
+1133 3691 1
+1133 3724 1
+1133 3748 1
+1133 3787 1
+1133 3796 1
+1133 3806 1
+1133 3812 1
+1133 3813 1
+1133 3835 1
+1133 3843 1
+1133 3854 1
+1133 3873 1
+1133 3898 1
+1133 3912 1
+1133 3922 1
+1133 3956 1
+1133 3958 1
+1133 3976 1
+1133 4011 1
+1133 4037 1
+1133 4040 1
+1133 4041 1
+1133 4044 1
+1133 4047 1
+1133 4051 1
+1133 4055 1
+1133 4065 1
+1133 4072 1
+1133 4103 1
+1133 4110 1
+1133 4124 1
+1133 4127 1
+1133 4138 1
+1133 4175 1
+1133 4188 1
+1133 4189 1
+1133 4191 1
+1133 4199 1
+1133 4212 1
+1133 4233 1
+1133 4235 1
+1133 4247 1
+1133 4254 1
+1133 4256 1
+1133 4261 1
+1133 4263 1
+1133 4266 1
+1133 4269 1
+1133 4289 1
+1133 4290 1
+1133 4297 1
+1133 4298 1
+1133 4299 1
+1133 4310 1
+1133 4311 1
+1133 4323 1
+1133 4331 1
+1133 4335 1
+1133 4349 1
+1133 4351 1
+1133 4355 1
+1133 4359 1
+1133 4365 1
+1133 4373 1
+1133 4384 1
+1133 4385 1
+1133 4400 1
+1133 4402 1
+1133 4403 1
+1133 4412 1
+1133 4417 1
+1133 4422 1
+1133 4424 1
+1133 4448 1
+1133 4463 1
+1133 4466 1
+1133 4468 1
+1133 4482 1
+1133 4485 1
+1133 4500 1
+1133 4510 1
+1133 4527 1
+1133 4528 1
+1133 4529 1
+1133 4531 1
+1133 4534 1
+1133 4551 1
+1133 4557 1
+1133 4558 1
+1133 4562 1
+1133 4574 1
+1133 4578 1
+1133 4584 1
+1133 4587 1
+1133 4588 1
+1133 4600 1
+1133 4620 1
+1133 4621 1
+1133 4631 1
+1133 4646 1
+1133 4648 1
+1133 4662 1
+1133 4666 1
+1133 4677 1
+1133 4706 1
+1133 4713 1
+1133 4719 1
+1133 4728 1
+1133 4735 1
+1133 4776 1
+1133 4781 1
+1133 4792 1
+1133 4796 1
+1133 4797 1
+1133 4808 1
+1133 4811 1
+1133 4814 1
+1133 4820 1
+1133 4822 1
+1133 4824 1
+1133 4827 1
+1133 4828 1
+1133 4831 1
+1133 4846 1
+1133 4875 1
+1133 4929 1
+1133 4938 1
+1133 4942 1
+1133 4946 1
+1133 4953 1
+1133 4962 1
+1133 4983 1
+1133 4999 1
+1133 5020 1
+1133 5022 1
+1133 5026 1
+1133 5043 1
+1133 5044 1
+1133 5045 1
+1133 5055 1
+1133 5058 1
+1133 5061 1
+1133 5073 1
+1133 5083 1
+1133 5092 1
+1133 5100 1
+1133 5103 1
+1133 5106 1
+1133 5121 1
+1133 5123 1
+1133 5176 1
+1133 5179 1
+1133 5182 1
+1133 5189 1
+1133 5204 1
+1133 5222 1
+1133 5233 1
+1133 5254 1
+1133 5262 1
+1133 5263 1
+1133 5288 1
+1133 5301 1
+1133 5335 1
+1133 5392 1
+1133 5404 1
+1133 5412 1
+1133 5437 1
+1133 5482 1
+1133 5484 1
+1133 5527 1
+1133 5543 1
+1133 5545 1
+1133 5559 1
+1133 5563 1
+1133 5568 1
+1133 5605 1
+1133 5624 1
+1133 5630 1
+1133 5635 1
+1133 5637 1
+1133 5638 1
+1133 5640 1
+1133 5680 1
+1133 5753 1
+1133 5773 1
+1133 5775 1
+1133 5780 1
+1133 5812 1
+1133 5817 1
+1133 5848 1
+1133 5863 1
+1133 5886 1
+1133 5925 1
+1133 5928 1
+1133 5936 1
+1133 5947 1
+1133 5963 1
+1133 5972 1
+1133 5973 1
+1133 5977 1
+1133 5980 1
+1133 5994 1
+1133 6004 1
+1133 6009 1
+1133 6021 1
+1133 6029 1
+1133 6094 1
+1133 6098 1
+1133 6124 1
+1133 6148 1
+1133 6161 1
+1133 6166 1
+1133 6226 1
+1133 6229 1
+1133 6246 1
+1133 6262 1
+1133 6334 1
+1133 6833 1
+1133 7040 1
+1133 7092 1
+1133 7833 1
+1133 7890 1
+1133 7910 1
+1133 8002 1
+1133 8051 1
+1133 8134 1
+1133 8290 1
+1133 8294 1
+1133 8295 1
+1134 989 1
+1134 1297 1
+1134 3005 1
+1135 171 1
+1135 204 1
+1135 299 1
+1135 332 1
+1135 334 1
+1135 407 1
+1135 545 1
+1135 579 1
+1135 644 1
+1135 647 1
+1135 710 1
+1135 722 1
+1135 765 1
+1135 805 1
+1135 813 1
+1135 836 1
+1135 887 1
+1135 908 1
+1135 922 1
+1135 937 1
+1135 943 1
+1135 960 1
+1135 971 1
+1135 975 1
+1135 978 1
+1135 989 1
+1135 993 1
+1135 999 1
+1135 1014 1
+1135 1049 1
+1135 1097 1
+1135 1140 1
+1135 1152 1
+1135 1164 1
+1135 1199 1
+1135 1201 1
+1135 1203 1
+1135 1211 1
+1135 1234 1
+1135 1253 1
+1135 1267 1
+1135 1279 1
+1135 1284 1
+1135 1286 1
+1135 1322 1
+1135 1330 1
+1135 1357 1
+1135 1378 1
+1135 1413 1
+1135 1416 1
+1135 1418 1
+1135 1428 1
+1135 1439 1
+1135 1464 1
+1135 1468 1
+1135 1476 1
+1135 1490 1
+1135 1492 1
+1135 1496 1
+1135 1501 1
+1135 1534 1
+1135 1555 1
+1135 1580 1
+1135 1585 1
+1135 1646 1
+1135 1664 1
+1135 1700 1
+1135 1717 1
+1135 1752 1
+1135 1758 1
+1135 1774 1
+1135 1781 1
+1135 1792 1
+1135 1808 1
+1135 1814 1
+1135 1836 1
+1135 1847 1
+1135 1858 1
+1135 1918 1
+1135 1963 1
+1135 1965 1
+1135 1966 1
+1135 1977 1
+1135 1997 1
+1135 2073 1
+1135 2076 1
+1135 2102 1
+1135 2128 1
+1135 2135 1
+1135 2225 1
+1135 2240 1
+1135 2246 1
+1135 2256 1
+1135 2276 1
+1135 2322 1
+1135 2323 1
+1135 2410 1
+1135 2435 1
+1135 2475 1
+1135 2504 1
+1135 2547 1
+1135 2587 1
+1135 2593 1
+1135 2617 1
+1135 2625 1
+1135 2685 1
+1135 2724 1
+1135 2794 1
+1135 2814 1
+1135 2922 1
+1135 2955 1
+1135 3034 1
+1135 3056 1
+1135 3130 1
+1135 3253 1
+1137 56 1
+1137 64 1
+1137 72 1
+1137 259 1
+1137 285 1
+1137 298 1
+1137 350 1
+1137 432 1
+1137 579 1
+1137 644 1
+1137 763 1
+1137 813 1
+1137 887 1
+1137 959 1
+1137 963 1
+1137 978 1
+1137 994 1
+1137 1049 1
+1137 1103 1
+1137 1127 1
+1137 1140 1
+1137 1200 1
+1137 1203 1
+1137 1221 1
+1137 1230 1
+1137 1261 1
+1137 1284 1
+1137 1286 1
+1137 1297 1
+1137 1357 1
+1137 1372 1
+1137 1374 1
+1137 1375 1
+1137 1378 1
+1137 1394 1
+1137 1407 1
+1137 1413 1
+1137 1416 1
+1137 1418 1
+1137 1428 1
+1137 1435 1
+1137 1437 1
+1137 1441 1
+1137 1464 1
+1137 1465 1
+1137 1514 1
+1137 1521 1
+1137 1524 1
+1137 1534 1
+1137 1549 1
+1137 1564 1
+1137 1566 1
+1137 1585 1
+1137 1592 1
+1137 1608 1
+1137 1637 1
+1137 1646 1
+1137 1700 1
+1137 1706 1
+1137 1723 1
+1137 1734 1
+1137 1754 1
+1137 1772 1
+1137 1781 1
+1137 1842 1
+1137 1858 1
+1137 1903 1
+1137 1908 1
+1137 1919 1
+1137 1956 1
+1137 1991 1
+1137 2071 1
+1137 2073 1
+1137 2101 1
+1137 2112 1
+1137 2128 1
+1137 2165 1
+1137 2205 1
+1137 2241 1
+1137 2328 1
+1137 2340 1
+1137 2354 1
+1137 2371 1
+1137 2410 1
+1137 2485 1
+1137 2490 1
+1137 2510 1
+1137 2593 1
+1137 2594 1
+1137 2653 1
+1137 2696 1
+1137 2697 1
+1137 2724 1
+1137 2754 1
+1137 2763 1
+1137 2768 1
+1137 2777 1
+1137 2781 1
+1137 2785 1
+1137 2805 1
+1137 2814 1
+1137 2825 1
+1137 2828 1
+1137 2830 1
+1137 2838 1
+1137 2900 1
+1137 2958 1
+1137 3026 1
+1137 3033 1
+1137 3059 1
+1137 3117 1
+1137 3192 1
+1137 3265 1
+1137 3537 1
+1137 3615 1
+1137 3643 1
+1137 3748 1
+1137 3755 1
+1137 3796 1
+1137 3854 1
+1137 3898 1
+1137 4041 1
+1137 4099 1
+1137 4162 1
+1137 4256 1
+1137 4323 1
+1137 4335 1
+1137 4365 1
+1137 4653 1
+1137 4712 1
+1137 4827 1
+1137 5026 1
+1137 5141 1
+1137 5285 1
+1137 5527 1
+1138 407 1
+1138 805 1
+1138 994 1
+1139 994 1
+1139 1043 1
+1141 545 1
+1141 1193 1
+1142 15 1
+1142 299 1
+1142 417 1
+1142 425 1
+1142 579 1
+1142 705 1
+1142 762 1
+1142 871 1
+1142 960 1
+1142 978 1
+1142 993 1
+1142 1043 1
+1142 1097 1
+1142 1166 1
+1142 1167 1
+1142 1186 1
+1142 1201 1
+1142 1248 1
+1142 1297 1
+1142 1322 1
+1142 1357 1
+1142 1476 1
+1142 1525 1
+1142 1592 1
+1142 1597 1
+1142 1603 1
+1142 1689 1
+1142 1956 1
+1142 2117 1
+1142 2328 1
+1142 2345 1
+1142 2381 1
+1142 2398 1
+1142 2510 1
+1142 2576 1
+1142 2580 1
+1142 2781 1
+1142 3516 1
+1142 3680 1
+1142 4110 1
+1142 4400 1
+1142 4631 1
+1142 5886 1
+1142 7073 1
+1142 7115 1
+1142 7168 1
+1142 7277 1
+1142 7839 1
+1143 56 1
+1143 372 1
+1143 579 1
+1143 968 1
+1143 1043 1
+1143 1186 1
+1143 1307 1
+1143 1416 1
+1143 1621 1
+1143 1888 1
+1143 2062 1
+1143 2479 1
+1143 2599 1
+1143 2963 1
+1144 941 1
+1144 1006 1
+1144 1125 1
+1144 1190 1
+1144 1196 1
+1144 1218 1
+1144 4037 1
+1068 1125 1
+1068 1322 1
+1068 1534 1
+1145 1125 1
+1145 1186 1
+1146 663 1
+1147 663 1
+1147 2830 1
+1147 3480 1
+1148 407 1
+1150 1152 1
+1150 1319 1
+1150 1484 1
+1150 1583 1
+1150 1622 1
+1150 2594 1
+1150 3136 1
+1150 4011 1
+1151 15 1
+1151 56 1
+1151 72 1
+1151 204 1
+1151 214 1
+1151 230 1
+1151 290 1
+1151 332 1
+1151 346 1
+1151 350 1
+1151 372 1
+1151 403 1
+1151 415 1
+1151 417 1
+1151 465 1
+1151 587 1
+1151 608 1
+1151 722 1
+1151 737 1
+1151 761 1
+1151 762 1
+1151 763 1
+1151 764 1
+1151 765 1
+1151 836 1
+1151 859 1
+1151 871 1
+1151 904 1
+1151 908 1
+1151 937 1
+1151 947 1
+1151 967 1
+1151 968 1
+1151 974 1
+1151 975 1
+1151 993 1
+1151 1000 1
+1151 1026 1
+1151 1032 1
+1151 1035 1
+1151 1049 1
+1151 1061 1
+1151 1097 1
+1151 1103 1
+1151 1111 1
+1151 1137 1
+1151 1152 1
+1151 1164 1
+1151 1166 1
+1151 1185 1
+1151 1186 1
+1151 1191 1
+1151 1200 1
+1151 1201 1
+1151 1211 1
+1151 1230 1
+1151 1234 1
+1151 1236 1
+1151 1239 1
+1151 1243 1
+1151 1248 1
+1151 1250 1
+1151 1279 1
+1151 1284 1
+1151 1285 1
+1151 1297 1
+1151 1319 1
+1151 1322 1
+1151 1323 1
+1151 1352 1
+1151 1353 1
+1151 1357 1
+1151 1374 1
+1151 1378 1
+1151 1393 1
+1151 1407 1
+1151 1416 1
+1151 1428 1
+1151 1437 1
+1151 1444 1
+1151 1464 1
+1151 1473 1
+1151 1482 1
+1151 1485 1
+1151 1487 1
+1151 1492 1
+1151 1496 1
+1151 1521 1
+1151 1537 1
+1151 1542 1
+1151 1547 1
+1151 1549 1
+1151 1550 1
+1151 1555 1
+1151 1565 1
+1151 1566 1
+1151 1571 1
+1151 1583 1
+1151 1585 1
+1151 1592 1
+1151 1597 1
+1151 1603 1
+1151 1608 1
+1151 1613 1
+1151 1621 1
+1151 1622 1
+1151 1633 1
+1151 1646 1
+1151 1680 1
+1151 1697 1
+1151 1700 1
+1151 1705 1
+1151 1707 1
+1151 1714 1
+1151 1717 1
+1151 1723 1
+1151 1730 1
+1151 1732 1
+1151 1733 1
+1151 1746 1
+1151 1747 1
+1151 1749 1
+1151 1752 1
+1151 1754 1
+1151 1757 1
+1151 1758 1
+1151 1768 1
+1151 1769 1
+1151 1770 1
+1151 1772 1
+1151 1774 1
+1151 1781 1
+1151 1783 1
+1151 1788 1
+1151 1791 1
+1151 1808 1
+1151 1814 1
+1151 1816 1
+1151 1835 1
+1151 1836 1
+1151 1842 1
+1151 1847 1
+1151 1848 1
+1151 1888 1
+1151 1893 1
+1151 1918 1
+1151 1919 1
+1151 1956 1
+1151 1961 1
+1151 1964 1
+1151 1965 1
+1151 1969 1
+1151 1977 1
+1151 1979 1
+1151 1983 1
+1151 1985 1
+1151 1991 1
+1151 1992 1
+1151 1997 1
+1151 2001 1
+1151 2004 1
+1151 2014 1
+1151 2016 1
+1151 2062 1
+1151 2066 1
+1151 2071 1
+1151 2073 1
+1151 2085 1
+1151 2091 1
+1151 2095 1
+1151 2097 1
+1151 2106 1
+1151 2114 1
+1151 2116 1
+1151 2117 1
+1151 2119 1
+1151 2120 1
+1151 2128 1
+1151 2135 1
+1151 2137 1
+1151 2145 1
+1151 2151 1
+1151 2157 1
+1151 2160 1
+1151 2165 1
+1151 2174 1
+1151 2181 1
+1151 2193 1
+1151 2202 1
+1151 2206 1
+1151 2209 1
+1151 2210 1
+1151 2211 1
+1151 2225 1
+1151 2229 1
+1151 2240 1
+1151 2241 1
+1151 2246 1
+1151 2251 1
+1151 2253 1
+1151 2257 1
+1151 2258 1
+1151 2264 1
+1151 2273 1
+1151 2297 1
+1151 2322 1
+1151 2323 1
+1151 2324 1
+1151 2328 1
+1151 2329 1
+1151 2332 1
+1151 2333 1
+1151 2341 1
+1151 2345 1
+1151 2350 1
+1151 2354 1
+1151 2369 1
+1151 2381 1
+1151 2385 1
+1151 2397 1
+1151 2398 1
+1151 2410 1
+1151 2433 1
+1151 2435 1
+1151 2456 1
+1151 2470 1
+1151 2475 1
+1151 2479 1
+1151 2485 1
+1151 2504 1
+1151 2506 1
+1151 2507 1
+1151 2510 1
+1151 2516 1
+1151 2535 1
+1151 2542 1
+1151 2547 1
+1151 2570 1
+1151 2576 1
+1151 2579 1
+1151 2587 1
+1151 2592 1
+1151 2593 1
+1151 2594 1
+1151 2604 1
+1151 2623 1
+1151 2625 1
+1151 2643 1
+1151 2654 1
+1151 2660 1
+1151 2665 1
+1151 2667 1
+1151 2669 1
+1151 2685 1
+1151 2686 1
+1151 2697 1
+1151 2700 1
+1151 2707 1
+1151 2713 1
+1151 2747 1
+1151 2754 1
+1151 2763 1
+1151 2768 1
+1151 2775 1
+1151 2805 1
+1151 2809 1
+1151 2815 1
+1151 2828 1
+1151 2830 1
+1151 2834 1
+1151 2851 1
+1151 2856 1
+1151 2871 1
+1151 2940 1
+1151 2963 1
+1151 2999 1
+1151 3002 1
+1151 3005 1
+1151 3009 1
+1151 3024 1
+1151 3026 1
+1151 3027 1
+1151 3028 1
+1151 3033 1
+1151 3034 1
+1151 3089 1
+1151 3092 1
+1151 3114 1
+1151 3117 1
+1151 3136 1
+1151 3144 1
+1151 3192 1
+1151 3238 1
+1151 3251 1
+1151 3253 1
+1151 3274 1
+1151 3309 1
+1151 3310 1
+1151 3338 1
+1151 3352 1
+1151 3381 1
+1151 3443 1
+1151 3452 1
+1151 3456 1
+1151 3473 1
+1151 3480 1
+1151 3489 1
+1151 3498 1
+1151 3537 1
+1151 3643 1
+1151 3680 1
+1151 3726 1
+1151 3752 1
+1151 3792 1
+1151 3796 1
+1151 3807 1
+1151 3842 1
+1151 3885 1
+1151 3892 1
+1151 3897 1
+1151 3903 1
+1151 3926 1
+1151 3937 1
+1151 3962 1
+1151 3976 1
+1151 4011 1
+1151 4037 1
+1151 4044 1
+1151 4065 1
+1151 4071 1
+1151 4099 1
+1151 4103 1
+1151 4124 1
+1151 4179 1
+1151 4191 1
+1151 4212 1
+1151 4234 1
+1151 4247 1
+1151 4310 1
+1151 4335 1
+1151 4338 1
+1151 4384 1
+1151 4422 1
+1151 4435 1
+1151 4510 1
+1151 4530 1
+1151 4531 1
+1151 4534 1
+1151 4551 1
+1151 4653 1
+1151 4706 1
+1151 4712 1
+1151 4781 1
+1151 4792 1
+1151 4828 1
+1151 4875 1
+1151 4899 1
+1151 4954 1
+1151 4964 1
+1151 4981 1
+1151 4986 1
+1151 5028 1
+1151 5061 1
+1151 5100 1
+1151 5121 1
+1151 5178 1
+1151 5182 1
+1151 5188 1
+1151 5226 1
+1151 5254 1
+1151 5273 1
+1151 5289 1
+1151 5423 1
+1151 5430 1
+1151 5437 1
+1151 5445 1
+1151 5454 1
+1151 5459 1
+1151 5509 1
+1151 5524 1
+1151 5529 1
+1151 5545 1
+1151 5584 1
+1151 5650 1
+1151 5693 1
+1151 5714 1
+1151 5721 1
+1151 5743 1
+1151 5775 1
+1151 5776 1
+1151 5818 1
+1151 5822 1
+1151 5828 1
+1151 5839 1
+1151 5848 1
+1151 5872 1
+1151 5897 1
+1151 5933 1
+1151 5947 1
+1151 6006 1
+1151 6032 1
+1151 6043 1
+1151 6094 1
+1151 6124 1
+1151 6151 1
+1151 6156 1
+1151 6166 1
+1151 6174 1
+1151 6226 1
+1151 6229 1
+1151 6327 1
+1151 6328 1
+1151 6337 1
+1151 6414 1
+1151 6437 1
+1151 6458 1
+1151 6481 1
+1151 6496 1
+1151 6523 1
+1151 6528 1
+1151 6552 1
+1151 6555 1
+1151 6560 1
+1151 6589 1
+1151 6594 1
+1151 6600 1
+1151 6632 1
+1151 6714 1
+1151 6715 1
+1151 6784 1
+1151 6832 1
+1151 6869 1
+1151 6873 1
+1151 6897 1
+1151 6914 1
+1151 6955 1
+1151 7005 1
+1151 7012 1
+1151 7021 1
+1151 7050 1
+1151 7063 1
+1151 7092 1
+1151 7115 1
+1151 7119 1
+1151 7143 1
+1151 7144 1
+1151 7277 1
+1151 7280 1
+1151 7341 1
+1151 7414 1
+1151 7587 1
+1151 7649 1
+1151 7763 1
+1151 7788 1
+1151 7795 1
+1151 7809 1
+1151 7813 1
+1151 7835 1
+1151 7855 1
+1151 7862 1
+1151 7871 1
+1151 7879 1
+1151 7882 1
+1151 7890 1
+1151 7910 1
+1151 7912 1
+1151 7927 1
+1151 7946 1
+1151 7961 1
+1151 8290 1
+1151 8291 1
+1151 8292 1
+1154 2770 1
+1154 2781 1
+1156 762 1
+1156 1022 1
+1156 2409 1
+1156 3130 1
+1155 1156 1
+1157 930 1
+1157 1156 1
+1158 1156 1
+922 35 1
+922 204 1
+922 259 1
+922 290 1
+922 299 1
+922 334 1
+922 407 1
+922 415 1
+922 579 1
+922 587 1
+922 647 1
+922 691 1
+922 710 1
+922 761 1
+922 762 1
+922 763 1
+922 803 1
+922 826 1
+922 861 1
+922 871 1
+922 887 1
+922 904 1
+922 908 1
+922 913 1
+922 928 1
+922 930 1
+922 937 1
+922 941 1
+922 943 1
+922 946 1
+922 974 1
+922 978 1
+922 982 1
+922 993 1
+922 1000 1
+922 1014 1
+922 1022 1
+922 1029 1
+922 1031 1
+922 1034 1
+922 1035 1
+922 1055 1
+922 1062 1
+922 1103 1
+922 1111 1
+922 1137 1
+922 1151 1
+922 1154 1
+922 1156 1
+922 1160 1
+922 1164 1
+922 1165 1
+922 1167 1
+922 1186 1
+922 1193 1
+922 1200 1
+922 1201 1
+922 1203 1
+922 1211 1
+922 1220 1
+922 1222 1
+922 1230 1
+922 1234 1
+922 1236 1
+922 1241 1
+922 1243 1
+922 1248 1
+922 1253 1
+922 1261 1
+922 1266 1
+922 1279 1
+922 1284 1
+922 1286 1
+922 1296 1
+922 1297 1
+922 1319 1
+922 1321 1
+922 1322 1
+922 1330 1
+922 1377 1
+922 1413 1
+922 1425 1
+922 1428 1
+922 1439 1
+922 1441 1
+922 1482 1
+922 1484 1
+922 1486 1
+922 1490 1
+922 1496 1
+922 1497 1
+922 1501 1
+922 1506 1
+922 1514 1
+922 1520 1
+922 1525 1
+922 1538 1
+922 1549 1
+922 1550 1
+922 1555 1
+922 1557 1
+922 1564 1
+922 1565 1
+922 1573 1
+922 1580 1
+922 1585 1
+922 1587 1
+922 1593 1
+922 1595 1
+922 1597 1
+922 1610 1
+922 1618 1
+922 1621 1
+922 1622 1
+922 1633 1
+922 1654 1
+922 1661 1
+922 1687 1
+922 1718 1
+922 1768 1
+922 1772 1
+922 1774 1
+922 1787 1
+922 1805 1
+922 1816 1
+922 1842 1
+922 1849 1
+922 1855 1
+922 1857 1
+922 1859 1
+922 1880 1
+922 1893 1
+922 1927 1
+922 1963 1
+922 1965 1
+922 1969 1
+922 1973 1
+922 1979 1
+922 1997 1
+922 2004 1
+922 2066 1
+922 2106 1
+922 2157 1
+922 2411 1
+922 2923 1
+922 3005 1
+922 3136 1
+922 3807 1
+922 8290 1
+1159 930 1
+1159 1165 1
+1161 930 1
+1160 35 1
+1160 171 1
+1160 227 1
+1160 299 1
+1160 334 1
+1160 432 1
+1160 810 1
+1160 853 1
+1160 930 1
+1160 941 1
+1160 971 1
+1160 978 1
+1160 1022 1
+1160 1167 1
+1160 1193 1
+1160 1201 1
+1160 1330 1
+1160 1372 1
+1160 1382 1
+1160 1394 1
+1160 1396 1
+1160 1413 1
+1160 1425 1
+1160 1476 1
+1164 15 1
+1164 290 1
+1164 299 1
+1164 407 1
+1164 665 1
+1164 761 1
+1164 857 1
+1164 908 1
+1164 993 1
+1164 1211 1
+1164 1261 1
+1164 1266 1
+1164 1513 1
+1164 1514 1
+1164 1549 1
+1164 1569 1
+1164 1573 1
+1164 1653 1
+1164 1658 1
+1164 1707 1
+1164 1816 1
+1164 1918 1
+1164 1956 1
+1164 1966 1
+1164 2076 1
+1164 2114 1
+1164 2157 1
+1164 2385 1
+1164 2535 1
+1164 3238 1
+1164 3755 1
+1164 3873 1
+1164 4099 1
+1164 5412 1
+1164 5479 1
+1164 6006 1
+1164 6424 1
+1164 7386 1
+1164 7809 1
+1165 857 1
+1165 871 1
+1165 993 1
+1165 1014 1
+1165 1261 1
+1165 1679 1
+1165 1956 1
+1165 2066 1
+1165 2328 1
+1165 2340 1
+1165 2398 1
+1165 2707 1
+1165 4037 1
+1166 15 1
+1166 56 1
+1166 72 1
+1166 204 1
+1166 214 1
+1166 222 1
+1166 285 1
+1166 290 1
+1166 332 1
+1166 346 1
+1166 350 1
+1166 372 1
+1166 403 1
+1166 417 1
+1166 608 1
+1166 633 1
+1166 665 1
+1166 737 1
+1166 741 1
+1166 761 1
+1166 762 1
+1166 763 1
+1166 764 1
+1166 765 1
+1166 825 1
+1166 840 1
+1166 856 1
+1166 857 1
+1166 873 1
+1166 887 1
+1166 896 1
+1166 946 1
+1166 959 1
+1166 978 1
+1166 993 1
+1166 1031 1
+1166 1049 1
+1166 1061 1
+1166 1097 1
+1166 1140 1
+1166 1151 1
+1166 1157 1
+1166 1159 1
+1166 1164 1
+1166 1165 1
+1166 1185 1
+1166 1186 1
+1166 1199 1
+1166 1200 1
+1166 1211 1
+1166 1230 1
+1166 1243 1
+1166 1250 1
+1166 1284 1
+1166 1285 1
+1166 1291 1
+1166 1297 1
+1166 1305 1
+1166 1307 1
+1166 1315 1
+1166 1322 1
+1166 1323 1
+1166 1352 1
+1166 1357 1
+1166 1374 1
+1166 1378 1
+1166 1384 1
+1166 1385 1
+1166 1393 1
+1166 1411 1
+1166 1416 1
+1166 1419 1
+1166 1437 1
+1166 1453 1
+1166 1473 1
+1166 1482 1
+1166 1492 1
+1166 1521 1
+1166 1547 1
+1166 1548 1
+1166 1549 1
+1166 1566 1
+1166 1571 1
+1166 1585 1
+1166 1592 1
+1166 1622 1
+1166 1633 1
+1166 1637 1
+1166 1653 1
+1166 1678 1
+1166 1679 1
+1166 1680 1
+1166 1688 1
+1166 1697 1
+1166 1705 1
+1166 1717 1
+1166 1734 1
+1166 1744 1
+1166 1747 1
+1166 1749 1
+1166 1754 1
+1166 1757 1
+1166 1772 1
+1166 1781 1
+1166 1783 1
+1166 1787 1
+1166 1791 1
+1166 1799 1
+1166 1814 1
+1166 1816 1
+1166 1823 1
+1166 1836 1
+1166 1842 1
+1166 1847 1
+1166 1849 1
+1166 1855 1
+1166 1857 1
+1166 1880 1
+1166 1884 1
+1166 1888 1
+1166 1901 1
+1166 1919 1
+1166 1920 1
+1166 1956 1
+1166 1961 1
+1166 1963 1
+1166 1964 1
+1166 1966 1
+1166 1972 1
+1166 1973 1
+1166 1977 1
+1166 1982 1
+1166 1983 1
+1166 1984 1
+1166 1985 1
+1166 1987 1
+1166 1990 1
+1166 1992 1
+1166 1997 1
+1166 2004 1
+1166 2007 1
+1166 2014 1
+1166 2053 1
+1166 2055 1
+1166 2062 1
+1166 2066 1
+1166 2076 1
+1166 2102 1
+1166 2109 1
+1166 2114 1
+1166 2117 1
+1166 2119 1
+1166 2120 1
+1166 2128 1
+1166 2129 1
+1166 2134 1
+1166 2135 1
+1166 2145 1
+1166 2157 1
+1166 2163 1
+1166 2165 1
+1166 2174 1
+1166 2178 1
+1166 2193 1
+1166 2205 1
+1166 2209 1
+1166 2210 1
+1166 2211 1
+1166 2223 1
+1166 2225 1
+1166 2231 1
+1166 2237 1
+1166 2240 1
+1166 2251 1
+1166 2256 1
+1166 2257 1
+1166 2258 1
+1166 2264 1
+1166 2273 1
+1166 2276 1
+1166 2281 1
+1166 2285 1
+1166 2289 1
+1166 2290 1
+1166 2297 1
+1166 2322 1
+1166 2323 1
+1166 2324 1
+1166 2328 1
+1166 2333 1
+1166 2338 1
+1166 2341 1
+1166 2345 1
+1166 2348 1
+1166 2354 1
+1166 2362 1
+1166 2364 1
+1166 2371 1
+1166 2375 1
+1166 2376 1
+1166 2381 1
+1166 2384 1
+1166 2398 1
+1166 2400 1
+1166 2409 1
+1166 2411 1
+1166 2416 1
+1166 2433 1
+1166 2470 1
+1166 2474 1
+1166 2485 1
+1166 2490 1
+1166 2501 1
+1166 2508 1
+1166 2510 1
+1166 2516 1
+1166 2517 1
+1166 2535 1
+1166 2542 1
+1166 2550 1
+1166 2565 1
+1166 2570 1
+1166 2575 1
+1166 2576 1
+1166 2593 1
+1166 2594 1
+1166 2597 1
+1166 2604 1
+1166 2619 1
+1166 2623 1
+1166 2625 1
+1166 2643 1
+1166 2646 1
+1166 2650 1
+1166 2651 1
+1166 2653 1
+1166 2654 1
+1166 2658 1
+1166 2660 1
+1166 2662 1
+1166 2665 1
+1166 2669 1
+1166 2674 1
+1166 2685 1
+1166 2686 1
+1166 2693 1
+1166 2700 1
+1166 2708 1
+1166 2721 1
+1166 2724 1
+1166 2736 1
+1166 2747 1
+1166 2754 1
+1166 2763 1
+1166 2774 1
+1166 2775 1
+1166 2785 1
+1166 2787 1
+1166 2790 1
+1166 2794 1
+1166 2801 1
+1166 2811 1
+1166 2819 1
+1166 2828 1
+1166 2830 1
+1166 2834 1
+1166 2838 1
+1166 2856 1
+1166 2871 1
+1166 2877 1
+1166 2880 1
+1166 2900 1
+1166 2902 1
+1166 2912 1
+1166 2918 1
+1166 2940 1
+1166 2951 1
+1166 2958 1
+1166 2968 1
+1166 2972 1
+1166 2973 1
+1166 2977 1
+1166 2991 1
+1166 3002 1
+1166 3007 1
+1166 3014 1
+1166 3018 1
+1166 3021 1
+1166 3026 1
+1166 3030 1
+1166 3033 1
+1166 3034 1
+1166 3056 1
+1166 3084 1
+1166 3089 1
+1166 3092 1
+1166 3099 1
+1166 3106 1
+1166 3117 1
+1166 3126 1
+1166 3136 1
+1166 3140 1
+1166 3145 1
+1166 3150 1
+1166 3155 1
+1166 3164 1
+1166 3173 1
+1166 3191 1
+1166 3192 1
+1166 3238 1
+1166 3251 1
+1166 3253 1
+1166 3255 1
+1166 3258 1
+1166 3260 1
+1166 3265 1
+1166 3266 1
+1166 3291 1
+1166 3307 1
+1166 3309 1
+1166 3320 1
+1166 3334 1
+1166 3338 1
+1166 3348 1
+1166 3352 1
+1166 3371 1
+1166 3393 1
+1166 3394 1
+1166 3408 1
+1166 3433 1
+1166 3435 1
+1166 3439 1
+1166 3446 1
+1166 3452 1
+1166 3454 1
+1166 3456 1
+1166 3460 1
+1166 3473 1
+1166 3479 1
+1166 3480 1
+1166 3483 1
+1166 3486 1
+1166 3489 1
+1166 3498 1
+1166 3506 1
+1166 3516 1
+1166 3537 1
+1166 3538 1
+1166 3541 1
+1166 3554 1
+1166 3557 1
+1166 3562 1
+1166 3580 1
+1166 3586 1
+1166 3587 1
+1166 3607 1
+1166 3615 1
+1166 3631 1
+1166 3635 1
+1166 3643 1
+1166 3650 1
+1166 3724 1
+1166 3755 1
+1166 3796 1
+1166 3803 1
+1166 3807 1
+1166 3812 1
+1166 3813 1
+1166 3830 1
+1166 3843 1
+1166 3873 1
+1166 3885 1
+1166 3887 1
+1166 3892 1
+1166 3893 1
+1166 3897 1
+1166 3910 1
+1166 3926 1
+1166 3937 1
+1166 3958 1
+1166 3967 1
+1166 3976 1
+1166 4011 1
+1166 4037 1
+1166 4040 1
+1166 4041 1
+1166 4058 1
+1166 4065 1
+1166 4098 1
+1166 4099 1
+1166 4103 1
+1166 4110 1
+1166 4124 1
+1166 4127 1
+1166 4134 1
+1166 4189 1
+1166 4191 1
+1166 4201 1
+1166 4247 1
+1166 4256 1
+1166 4266 1
+1166 4276 1
+1166 4290 1
+1166 4297 1
+1166 4298 1
+1166 4299 1
+1166 4315 1
+1166 4335 1
+1166 4355 1
+1166 4361 1
+1166 4384 1
+1166 4412 1
+1166 4417 1
+1166 4463 1
+1166 4480 1
+1166 4483 1
+1166 4510 1
+1166 4527 1
+1166 4530 1
+1166 4536 1
+1166 4547 1
+1166 4666 1
+1166 4712 1
+1166 4717 1
+1166 4719 1
+1166 4735 1
+1166 4748 1
+1166 4781 1
+1166 4797 1
+1166 4808 1
+1166 4811 1
+1166 4820 1
+1166 4828 1
+1166 4846 1
+1166 4875 1
+1166 4953 1
+1166 4981 1
+1166 5002 1
+1166 5012 1
+1166 5020 1
+1166 5022 1
+1166 5079 1
+1166 5083 1
+1166 5100 1
+1166 5132 1
+1166 5148 1
+1166 5162 1
+1166 5179 1
+1166 5188 1
+1166 5210 1
+1166 5233 1
+1166 5254 1
+1166 5263 1
+1166 5273 1
+1166 5285 1
+1166 5288 1
+1166 5301 1
+1166 5305 1
+1166 5309 1
+1166 5321 1
+1166 5327 1
+1166 5384 1
+1166 5392 1
+1166 5404 1
+1166 5412 1
+1166 5415 1
+1166 5423 1
+1166 5430 1
+1166 5449 1
+1166 5452 1
+1166 5454 1
+1166 5482 1
+1166 5484 1
+1166 5509 1
+1166 5524 1
+1166 5529 1
+1166 5582 1
+1166 5626 1
+1166 5638 1
+1166 5697 1
+1166 5714 1
+1166 5721 1
+1166 5743 1
+1166 5772 1
+1166 5773 1
+1166 5780 1
+1166 5784 1
+1166 5790 1
+1166 5798 1
+1166 5800 1
+1166 5806 1
+1166 5811 1
+1166 5814 1
+1166 5824 1
+1166 5828 1
+1166 5860 1
+1166 5863 1
+1166 5872 1
+1166 5922 1
+1166 5928 1
+1166 5932 1
+1166 5936 1
+1166 5963 1
+1166 5980 1
+1166 5994 1
+1166 5998 1
+1166 6000 1
+1166 6004 1
+1166 6006 1
+1166 6023 1
+1166 6094 1
+1166 6098 1
+1166 6148 1
+1166 6151 1
+1166 6156 1
+1166 6164 1
+1166 6198 1
+1166 6218 1
+1166 6221 1
+1166 6246 1
+1166 6251 1
+1166 6255 1
+1166 6262 1
+1166 6270 1
+1166 6299 1
+1166 6305 1
+1166 6306 1
+1166 6327 1
+1166 6330 1
+1166 6334 1
+1166 6337 1
+1166 6388 1
+1166 6400 1
+1166 6407 1
+1166 6414 1
+1166 6432 1
+1166 6437 1
+1166 6441 1
+1166 6496 1
+1166 6498 1
+1166 6503 1
+1166 6505 1
+1166 6523 1
+1166 6560 1
+1166 6570 1
+1166 6589 1
+1166 6599 1
+1166 6634 1
+1166 6665 1
+1166 6700 1
+1166 6714 1
+1166 6715 1
+1166 6720 1
+1166 6784 1
+1166 6789 1
+1166 6832 1
+1166 6855 1
+1166 6914 1
+1166 6918 1
+1166 6934 1
+1166 6946 1
+1166 6948 1
+1166 6953 1
+1166 6979 1
+1166 6982 1
+1166 6994 1
+1166 7047 1
+1166 7052 1
+1166 7059 1
+1166 7092 1
+1166 7094 1
+1166 7108 1
+1166 7168 1
+1166 7279 1
+1166 7280 1
+1166 7373 1
+1166 7442 1
+1166 7553 1
+1166 7620 1
+1166 7662 1
+1166 7699 1
+1166 7707 1
+1166 7726 1
+1166 7803 1
+1166 7809 1
+1166 7839 1
+1166 7908 1
+1166 7946 1
+1166 7992 1
+1166 8083 1
+1166 8122 1
+1166 8134 1
+1166 8290 1
+1166 8291 1
+1166 8292 1
+1166 8293 1
+1166 8294 1
+1166 8295 1
+1166 8297 1
+1167 35 1
+1167 56 1
+1167 171 1
+1167 290 1
+1167 299 1
+1167 407 1
+1167 506 1
+1167 710 1
+1167 717 1
+1167 762 1
+1167 805 1
+1167 810 1
+1167 826 1
+1167 857 1
+1167 871 1
+1167 873 1
+1167 904 1
+1167 908 1
+1167 922 1
+1167 963 1
+1167 971 1
+1167 978 1
+1167 982 1
+1167 985 1
+1167 993 1
+1167 1022 1
+1167 1035 1
+1167 1151 1
+1167 1160 1
+1167 1164 1
+1167 1186 1
+1167 1190 1
+1167 1192 1
+1167 1193 1
+1167 1200 1
+1167 1201 1
+1167 1211 1
+1167 1220 1
+1167 1230 1
+1167 1234 1
+1167 1241 1
+1167 1253 1
+1167 1261 1
+1167 1270 1
+1167 1277 1
+1167 1286 1
+1167 1321 1
+1167 1322 1
+1167 1330 1
+1167 1357 1
+1167 1411 1
+1167 1413 1
+1167 1428 1
+1167 1453 1
+1167 1471 1
+1167 1476 1
+1167 1478 1
+1167 1482 1
+1167 1484 1
+1167 1487 1
+1167 1489 1
+1167 1492 1
+1167 1496 1
+1167 1497 1
+1167 1498 1
+1167 1501 1
+1167 1514 1
+1167 1538 1
+1167 1563 1
+1167 1580 1
+1167 1585 1
+1167 1593 1
+1167 1600 1
+1167 1603 1
+1167 1608 1
+1167 1612 1
+1167 1618 1
+1167 1633 1
+1167 1641 1
+1167 1661 1
+1167 1678 1
+1167 1718 1
+1167 1730 1
+1167 1754 1
+1167 1774 1
+1167 1780 1
+1167 1793 1
+1167 1805 1
+1167 1835 1
+1167 1842 1
+1167 1859 1
+1167 1861 1
+1167 1864 1
+1167 1888 1
+1167 1893 1
+1167 1920 1
+1167 1956 1
+1167 1963 1
+1167 2004 1
+1167 2069 1
+1167 2106 1
+1167 2114 1
+1167 2128 1
+1167 2157 1
+1167 2182 1
+1167 2210 1
+1167 2225 1
+1167 2256 1
+1167 2322 1
+1167 2323 1
+1167 2397 1
+1167 2411 1
+1167 2470 1
+1167 2499 1
+1167 2565 1
+1167 2575 1
+1167 2585 1
+1167 2619 1
+1167 2625 1
+1167 2647 1
+1167 2650 1
+1167 2651 1
+1167 2662 1
+1167 2665 1
+1167 2685 1
+1167 2686 1
+1167 2754 1
+1167 2770 1
+1167 2834 1
+1167 2838 1
+1167 2877 1
+1167 2880 1
+1167 2900 1
+1167 2966 1
+1167 3028 1
+1167 3033 1
+1167 3130 1
+1167 3164 1
+1167 3200 1
+1167 3253 1
+1167 3334 1
+1167 3352 1
+1167 3408 1
+1167 3446 1
+1167 3541 1
+1167 3650 1
+1167 3720 1
+1167 3755 1
+1167 3835 1
+1167 3976 1
+1167 4110 1
+1167 4365 1
+1167 4735 1
+1167 4875 1
+1167 5545 1
+1167 5963 1
+1167 8292 1
+1167 8293 1
+1177 1186 1
+1168 1014 1
+1168 1186 1
+1168 1816 1
+1168 2178 1
+1168 3660 1
+1178 1186 1
+1179 15 1
+1179 214 1
+1179 1186 1
+1179 1464 1
+1179 2508 1
+1179 3443 1
+1179 4463 1
+1179 4719 1
+1179 5254 1
+1179 8192 1
+1169 350 1
+1169 407 1
+1169 856 1
+1169 1061 1
+1169 1186 1
+1169 1633 1
+1169 1847 1
+1169 2091 1
+1169 2117 1
+1169 2366 1
+1169 2508 1
+1169 2576 1
+1169 2594 1
+1169 2619 1
+1169 2625 1
+1169 2643 1
+1169 2754 1
+1169 2951 1
+1169 3020 1
+1169 3307 1
+1169 3338 1
+1169 3408 1
+1169 3807 1
+1169 3871 1
+1169 4999 1
+1169 5423 1
+1169 5449 1
+1169 5936 1
+1169 5973 1
+1170 1186 1
+1170 1190 1
+1180 1186 1
+1171 1186 1
+1090 943 1
+1090 1186 1
+1172 1186 1
+1173 1186 1
+1174 1186 1
+1175 1186 1
+1182 299 1
+1182 922 1
+1182 941 1
+1182 1006 1
+1182 1186 1
+1182 1222 1
+1182 1240 1
+1183 425 1
+1183 1186 1
+1183 1389 1
+1183 1592 1
+1183 1653 1
+1183 1808 1
+1183 2754 1
+1183 2922 1
+1183 2955 1
+1185 56 1
+1185 407 1
+1185 665 1
+1185 762 1
+1185 771 1
+1185 797 1
+1185 937 1
+1185 963 1
+1185 1151 1
+1185 1167 1
+1185 1186 1
+1185 1199 1
+1185 1321 1
+1185 1322 1
+1185 1525 1
+1185 1585 1
+1185 1633 1
+1185 1648 1
+1185 1662 1
+1185 1717 1
+1185 1718 1
+1185 1752 1
+1185 1758 1
+1185 1780 1
+1185 1805 1
+1185 1842 1
+1185 1849 1
+1185 1855 1
+1185 1859 1
+1185 1861 1
+1185 1864 1
+1185 1973 1
+1185 2004 1
+1185 2237 1
+1185 2801 1
+1185 3136 1
+1185 3309 1
+1185 3443 1
+1185 3958 1
+1185 4875 1
+1185 6790 1
+1185 7040 1
+1185 8293 1
+1176 1186 1
+1190 15 1
+1190 417 1
+1190 974 1
+1190 1496 1
+1187 1035 1
+1187 1190 1
+1187 1191 1
+1188 1190 1
+1188 1453 1
+1189 1190 1
+1193 15 1
+1193 35 1
+1193 72 1
+1193 290 1
+1193 762 1
+1193 859 1
+1193 871 1
+1193 887 1
+1193 928 1
+1193 959 1
+1193 1031 1
+1193 1062 1
+1193 1192 1
+1193 1259 1
+1193 1260 1
+1193 1261 1
+1193 1297 1
+1193 1323 1
+1193 1518 1
+1193 1595 1
+1193 1661 1
+1193 1669 1
+1193 1798 1
+1193 2160 1
+1193 2328 1
+1193 2470 1
+1193 3755 1
+1193 4037 1
+1193 4463 1
+1193 5002 1
+1193 6560 1
+1196 737 1
+1196 1864 1
+1196 3050 1
+1196 3193 1
+1196 3346 1
+1196 3557 1
+1196 3645 1
+1196 3769 1
+1196 4110 1
+1194 1196 1
+1195 259 1
+1195 805 1
+1195 1006 1
+1195 1196 1
+1195 1218 1
+1197 1006 1
+1197 1201 1
+1197 1222 1
+1198 285 1
+1198 1006 1
+1198 2565 1
+1198 2593 1
+1199 922 1
+1199 941 1
+1200 56 1
+1200 290 1
+1200 403 1
+1200 633 1
+1200 765 1
+1200 856 1
+1200 941 1
+1200 993 1
+1200 1166 1
+1200 1167 1
+1200 1267 1
+1200 1393 1
+1200 1413 1
+1200 1416 1
+1200 1419 1
+1200 1453 1
+1200 1592 1
+1200 1633 1
+1200 1637 1
+1200 1679 1
+1200 1723 1
+1200 1754 1
+1200 1781 1
+1200 1792 1
+1200 1814 1
+1200 1919 1
+1200 1956 1
+1200 2053 1
+1200 2066 1
+1200 2102 1
+1200 2116 1
+1200 2120 1
+1200 2135 1
+1200 2174 1
+1200 2225 1
+1200 2231 1
+1200 2251 1
+1200 2264 1
+1200 2297 1
+1200 2322 1
+1200 2340 1
+1200 2371 1
+1200 2375 1
+1200 2416 1
+1200 2474 1
+1200 2550 1
+1200 2593 1
+1200 2599 1
+1200 2617 1
+1200 2618 1
+1200 2625 1
+1200 2647 1
+1200 2651 1
+1200 2654 1
+1200 2660 1
+1200 2697 1
+1200 2713 1
+1200 2724 1
+1200 2754 1
+1200 2768 1
+1200 2785 1
+1200 2787 1
+1200 2794 1
+1200 2805 1
+1200 2809 1
+1200 2814 1
+1200 2828 1
+1200 2830 1
+1200 2834 1
+1200 2838 1
+1200 2856 1
+1200 2877 1
+1200 2880 1
+1200 2912 1
+1200 2918 1
+1200 2922 1
+1200 2951 1
+1200 3021 1
+1200 3030 1
+1200 3033 1
+1200 3034 1
+1200 3089 1
+1200 3099 1
+1200 3126 1
+1200 3138 1
+1200 3140 1
+1200 3145 1
+1200 3150 1
+1200 3164 1
+1200 3238 1
+1200 3243 1
+1200 3251 1
+1200 3253 1
+1200 3265 1
+1200 3455 1
+1200 3456 1
+1200 3976 1
+1200 4534 1
+1200 4796 1
+1200 5022 1
+1200 5073 1
+1200 5404 1
+1200 5412 1
+1200 6306 1
+1200 7707 1
+1200 7879 1
+1200 8293 1
+1201 35 1
+1201 298 1
+1201 545 1
+1201 644 1
+1201 941 1
+1201 978 1
+1201 982 1
+1201 1193 1
+1201 1200 1
+1201 1222 1
+1201 1253 1
+1201 1259 1
+1201 1260 1
+1201 1261 1
+1201 1319 1
+1201 1322 1
+1201 1394 1
+1201 1396 1
+1201 1413 1
+1201 1425 1
+1201 1428 1
+1201 1476 1
+1201 1482 1
+1201 1487 1
+1201 1489 1
+1201 1496 1
+1201 1497 1
+1201 1514 1
+1201 1580 1
+1201 1593 1
+1201 1603 1
+1201 1718 1
+1201 1726 1
+1201 1780 1
+1201 2066 1
+1202 56 1
+1202 559 1
+1202 587 1
+1202 722 1
+1202 871 1
+1202 887 1
+1202 904 1
+1202 907 1
+1202 941 1
+1202 1000 1
+1202 1032 1
+1202 1111 1
+1202 1151 1
+1202 1186 1
+1202 1200 1
+1202 1201 1
+1202 1250 1
+1202 1253 1
+1202 1284 1
+1202 1291 1
+1202 1297 1
+1202 1353 1
+1202 1407 1
+1202 1428 1
+1202 1482 1
+1202 1489 1
+1202 1492 1
+1202 1514 1
+1202 1525 1
+1202 1531 1
+1202 1547 1
+1202 1555 1
+1202 1580 1
+1202 1585 1
+1202 1597 1
+1202 1604 1
+1202 1608 1
+1202 1622 1
+1202 1661 1
+1202 1697 1
+1202 1700 1
+1202 1701 1
+1202 1717 1
+1202 1752 1
+1202 1758 1
+1202 1793 1
+1202 1847 1
+1202 1861 1
+1202 1864 1
+1202 1893 1
+1202 1919 1
+1202 1927 1
+1202 1997 1
+1202 2053 1
+1202 2066 1
+1202 2181 1
+1202 2251 1
+1202 2504 1
+1202 2625 1
+1202 2968 1
+1202 3018 1
+1202 3033 1
+1202 3034 1
+1202 3136 1
+1202 8290 1
+1202 8291 1
+1203 334 1
+1203 887 1
+1203 941 1
+1203 963 1
+1203 1165 1
+1203 1199 1
+1203 1291 1
+1203 1307 1
+1203 1326 1
+1203 1357 1
+1203 1549 1
+1203 1633 1
+1203 1679 1
+1203 1692 1
+1203 1697 1
+1203 1855 1
+1203 1979 1
+1203 2055 1
+1203 2168 1
+1203 2356 1
+1203 2400 1
+1203 2499 1
+1204 171 1
+1204 290 1
+1204 432 1
+1204 710 1
+1204 803 1
+1204 853 1
+1204 922 1
+1204 941 1
+1204 943 1
+1204 1199 1
+1204 1201 1
+1204 1220 1
+1204 1222 1
+1204 1234 1
+1204 1259 1
+1204 1261 1
+1204 1267 1
+1204 1286 1
+1204 1305 1
+1204 1330 1
+1204 1372 1
+1204 1375 1
+1204 1394 1
+1204 1402 1
+1204 1618 1
+1204 1633 1
+1204 1648 1
+1204 1662 1
+1204 1679 1
+1204 2231 1
+1204 2325 1
+1204 2364 1
+1204 2651 1
+1204 2662 1
+1204 2696 1
+1204 2700 1
+1204 2713 1
+1204 2951 1
+1204 3002 1
+1204 3030 1
+1204 3276 1
+1204 3338 1
+1204 3433 1
+1204 3447 1
+1204 3452 1
+1204 3458 1
+1204 3537 1
+1204 3755 1
+1204 3843 1
+1204 3854 1
+1204 4037 1
+1204 4191 1
+1204 4335 1
+1204 4529 1
+1204 4792 1
+1204 4938 1
+1204 5026 1
+1204 5045 1
+1204 5199 1
+1204 6299 1
+1204 6980 1
+1205 941 1
+1206 941 1
+1207 941 1
+1207 1062 1
+1207 1193 1
+1207 1211 1
+1207 1277 1
+1207 1489 1
+1207 1633 1
+1207 1652 1
+1207 1662 1
+1207 1680 1
+1207 2323 1
+1207 2398 1
+1207 2490 1
+1207 3050 1
+1207 3056 1
+1207 3291 1
+1207 4099 1
+1207 4748 1
+1207 4994 1
+1207 5262 1
+1207 5479 1
+1207 5620 1
+1207 5626 1
+1207 5640 1
+1207 5832 1
+1207 8295 1
+1208 941 1
+1209 941 1
+1210 35 1
+1210 56 1
+1210 72 1
+1210 204 1
+1210 230 1
+1210 298 1
+1210 334 1
+1210 350 1
+1210 372 1
+1210 403 1
+1210 633 1
+1210 644 1
+1210 722 1
+1210 737 1
+1210 762 1
+1210 763 1
+1210 764 1
+1210 765 1
+1210 803 1
+1210 840 1
+1210 935 1
+1210 937 1
+1210 941 1
+1210 947 1
+1210 993 1
+1210 999 1
+1210 1000 1
+1210 1034 1
+1210 1035 1
+1210 1049 1
+1210 1061 1
+1210 1103 1
+1210 1111 1
+1210 1127 1
+1210 1137 1
+1210 1164 1
+1210 1166 1
+1210 1185 1
+1210 1186 1
+1210 1193 1
+1210 1203 1
+1210 1222 1
+1210 1230 1
+1210 1243 1
+1210 1284 1
+1210 1286 1
+1210 1297 1
+1210 1319 1
+1210 1330 1
+1210 1352 1
+1210 1353 1
+1210 1357 1
+1210 1374 1
+1210 1377 1
+1210 1378 1
+1210 1384 1
+1210 1389 1
+1210 1393 1
+1210 1394 1
+1210 1396 1
+1210 1402 1
+1210 1407 1
+1210 1412 1
+1210 1413 1
+1210 1416 1
+1210 1418 1
+1210 1420 1
+1210 1425 1
+1210 1492 1
+1210 1514 1
+1210 1534 1
+1210 1547 1
+1210 1549 1
+1210 1565 1
+1210 1585 1
+1210 1592 1
+1210 1608 1
+1210 1658 1
+1210 1678 1
+1210 1707 1
+1210 1717 1
+1210 1730 1
+1210 1744 1
+1210 1749 1
+1210 1754 1
+1210 1758 1
+1210 1772 1
+1210 1777 1
+1210 1783 1
+1210 1787 1
+1210 1792 1
+1210 1814 1
+1210 1848 1
+1210 1855 1
+1210 1880 1
+1210 1893 1
+1210 1903 1
+1210 1908 1
+1210 1919 1
+1210 1964 1
+1210 1965 1
+1210 1966 1
+1210 1991 1
+1210 1992 1
+1210 2062 1
+1210 2066 1
+1210 2073 1
+1210 2076 1
+1210 2079 1
+1210 2085 1
+1210 2091 1
+1210 2095 1
+1210 2097 1
+1210 2109 1
+1210 2117 1
+1210 2120 1
+1210 2128 1
+1210 2135 1
+1210 2157 1
+1210 2165 1
+1210 2168 1
+1210 2181 1
+1210 2193 1
+1210 2210 1
+1210 2211 1
+1210 2240 1
+1210 2253 1
+1210 2273 1
+1210 2281 1
+1210 2297 1
+1210 2322 1
+1210 2324 1
+1210 2345 1
+1210 2364 1
+1210 2398 1
+1210 2400 1
+1210 2411 1
+1210 2470 1
+1210 2475 1
+1210 2504 1
+1210 2508 1
+1210 2510 1
+1210 2516 1
+1210 2535 1
+1210 2565 1
+1210 2570 1
+1210 2579 1
+1210 2587 1
+1210 2593 1
+1210 2604 1
+1210 2625 1
+1210 2654 1
+1210 2657 1
+1210 2660 1
+1210 2669 1
+1210 2685 1
+1210 2697 1
+1210 2713 1
+1210 2785 1
+1210 2805 1
+1210 2834 1
+1210 2851 1
+1210 3020 1
+1210 3027 1
+1210 3089 1
+1210 3148 1
+1210 3251 1
+1210 3253 1
+1210 3284 1
+1210 3351 1
+1210 3456 1
+1210 3479 1
+1210 3537 1
+1210 3557 1
+1210 3580 1
+1210 3586 1
+1210 3587 1
+1210 3634 1
+1210 3670 1
+1210 3807 1
+1210 3926 1
+1210 3958 1
+1210 3976 1
+1210 4037 1
+1210 4289 1
+1210 4290 1
+1210 4400 1
+1210 4424 1
+1210 4795 1
+1210 4798 1
+1210 4846 1
+1210 5073 1
+1210 5100 1
+1210 5254 1
+1210 5288 1
+1210 5423 1
+1210 5430 1
+1210 5524 1
+1210 5563 1
+1210 5799 1
+1210 5804 1
+1210 5818 1
+1210 5822 1
+1210 5994 1
+1210 6004 1
+1210 6305 1
+1210 6330 1
+1210 6334 1
+1210 6337 1
+1210 6498 1
+1210 6560 1
+1210 6715 1
+1210 6790 1
+1210 6860 1
+1210 6901 1
+1210 6930 1
+1210 6934 1
+1210 8292 1
+1211 171 1
+1211 285 1
+1211 290 1
+1211 506 1
+1211 579 1
+1211 665 1
+1211 710 1
+1211 761 1
+1211 762 1
+1211 908 1
+1211 941 1
+1211 993 1
+1211 1018 1
+1211 1031 1
+1211 1151 1
+1211 1193 1
+1211 1253 1
+1211 1261 1
+1211 1267 1
+1211 1279 1
+1211 1286 1
+1211 1372 1
+1211 1375 1
+1211 1413 1
+1211 1435 1
+1211 1471 1
+1211 1496 1
+1211 1514 1
+1211 1521 1
+1211 1585 1
+1211 1648 1
+1211 1661 1
+1211 1678 1
+1211 1680 1
+1211 1701 1
+1211 1705 1
+1211 1772 1
+1211 1780 1
+1211 1787 1
+1211 1798 1
+1211 1808 1
+1211 1814 1
+1211 1819 1
+1211 1836 1
+1211 1842 1
+1211 1849 1
+1211 1956 1
+1211 1966 1
+1211 2007 1
+1211 2062 1
+1211 2066 1
+1211 2101 1
+1211 2106 1
+1211 2128 1
+1211 2151 1
+1211 2157 1
+1211 2174 1
+1211 2193 1
+1211 2195 1
+1211 2225 1
+1211 2328 1
+1211 2397 1
+1211 2474 1
+1211 2508 1
+1211 2535 1
+1211 2643 1
+1211 2653 1
+1211 2763 1
+1211 2877 1
+1211 2922 1
+1211 2923 1
+1211 3117 1
+1211 3265 1
+1211 3720 1
+1211 4051 1
+1211 4138 1
+1211 4256 1
+1211 8290 1
+1211 8294 1
+1212 941 1
+1212 1211 1
+1212 2323 1
+1212 2625 1
+1213 941 1
+1214 922 1
+1214 941 1
+1215 15 1
+1215 72 1
+1215 762 1
+1215 896 1
+1215 941 1
+1215 947 1
+1215 1026 1
+1215 1035 1
+1215 1186 1
+1215 1211 1
+1215 1297 1
+1215 1357 1
+1215 1492 1
+1215 1521 1
+1215 1534 1
+1215 1549 1
+1215 1621 1
+1215 1633 1
+1215 1734 1
+1215 1754 1
+1215 1847 1
+1215 1859 1
+1215 1880 1
+1215 1919 1
+1215 1953 1
+1215 2066 1
+1215 2117 1
+1215 2264 1
+1215 2285 1
+1215 2323 1
+1215 2356 1
+1215 2400 1
+1215 2426 1
+1215 2504 1
+1215 2535 1
+1215 2593 1
+1215 2594 1
+1215 2604 1
+1215 2625 1
+1215 2643 1
+1215 2736 1
+1215 3089 1
+1215 3130 1
+1215 3265 1
+1215 3291 1
+1215 3297 1
+1215 3334 1
+1215 3376 1
+1215 3410 1
+1215 3873 1
+1215 5079 1
+1215 5179 1
+1215 5886 1
+1215 5936 1
+1215 6094 1
+1215 6161 1
+1215 6437 1
+1215 6523 1
+1215 7131 1
+1215 7168 1
+1215 7544 1
+1215 7620 1
+1215 7632 1
+1215 7699 1
+1215 7835 1
+1216 941 1
+1219 1220 1
+1221 545 1
+1221 587 1
+1221 633 1
+1221 765 1
+1221 791 1
+1221 803 1
+1221 887 1
+1221 907 1
+1221 908 1
+1221 978 1
+1221 1035 1
+1221 1137 1
+1221 1164 1
+1221 1193 1
+1221 1203 1
+1221 1222 1
+1221 1236 1
+1221 1253 1
+1221 1259 1
+1221 1282 1
+1221 1284 1
+1221 1296 1
+1221 1321 1
+1221 1375 1
+1221 1378 1
+1221 1390 1
+1221 1394 1
+1221 1396 1
+1221 1413 1
+1221 1425 1
+1221 1439 1
+1221 1492 1
+1221 1518 1
+1221 1524 1
+1221 1538 1
+1221 1566 1
+1221 1571 1
+1221 1585 1
+1221 1587 1
+1221 1603 1
+1221 1608 1
+1221 1688 1
+1221 1754 1
+1221 1774 1
+1221 1814 1
+1221 1847 1
+1221 1858 1
+1221 1888 1
+1221 1927 1
+1221 1963 1
+1221 1966 1
+1221 2097 1
+1221 2168 1
+1221 2174 1
+1221 2210 1
+1221 2225 1
+1221 2241 1
+1221 2290 1
+1221 2324 1
+1221 2356 1
+1221 2579 1
+1221 2585 1
+1221 2667 1
+1221 2685 1
+1221 2707 1
+1221 2834 1
+1221 2922 1
+1221 3007 1
+1221 3021 1
+1221 3024 1
+1221 3099 1
+1221 3251 1
+1221 3253 1
+1221 3351 1
+1221 3807 1
+1221 3903 1
+1221 3956 1
+1223 922 1
+1224 922 1
+1225 922 1
+1226 922 1
+1227 922 1
+1228 15 1
+1228 922 1
+1228 978 1
+1228 1956 1
+1228 2625 1
+1228 2651 1
+1228 2685 1
+1228 2940 1
+1228 4299 1
+1228 4463 1
+1228 4735 1
+1229 922 1
+1230 290 1
+1230 710 1
+1230 763 1
+1230 922 1
+1230 993 1
+1230 1062 1
+1230 1164 1
+1230 1167 1
+1230 1234 1
+1230 1243 1
+1230 1286 1
+1230 1297 1
+1230 1437 1
+1230 1514 1
+1230 1564 1
+1230 1587 1
+1230 1621 1
+1230 1700 1
+1230 1701 1
+1230 1774 1
+1230 1814 1
+1230 1837 1
+1230 1880 1
+1230 1893 1
+1230 1908 1
+1230 1953 1
+1230 1969 1
+1230 1987 1
+1230 2066 1
+1230 2117 1
+1230 2333 1
+1230 2400 1
+1230 3117 1
+1231 922 1
+1232 922 1
+1233 761 1
+1233 826 1
+1233 907 1
+1233 922 1
+1233 937 1
+1233 1024 1
+1233 1151 1
+1233 1321 1
+1233 1326 1
+1233 1439 1
+1233 1441 1
+1233 1485 1
+1233 1490 1
+1233 2066 1
+1234 35 1
+1234 171 1
+1234 299 1
+1234 545 1
+1234 922 1
+1234 943 1
+1234 978 1
+1234 1167 1
+1234 1193 1
+1234 1277 1
+1234 1297 1
+1234 1428 1
+1234 1464 1
+1234 1538 1
+1234 1580 1
+1234 1587 1
+1235 35 1
+1235 227 1
+1235 299 1
+1235 717 1
+1235 762 1
+1235 922 1
+1235 963 1
+1235 1127 1
+1235 1193 1
+1235 1203 1
+1235 1326 1
+1235 1330 1
+1235 1389 1
+1235 1412 1
+1235 1413 1
+1235 1418 1
+1235 1420 1
+1235 1425 1
+1235 1464 1
+1235 3755 1
+1239 922 1
+1236 290 1
+1236 407 1
+1236 425 1
+1236 763 1
+1236 871 1
+1236 922 1
+1236 928 1
+1236 948 1
+1236 960 1
+1236 971 1
+1236 993 1
+1236 1000 1
+1236 1035 1
+1236 1103 1
+1236 1164 1
+1236 1166 1
+1236 1167 1
+1236 1168 1
+1236 1199 1
+1236 1201 1
+1236 1203 1
+1236 1211 1
+1236 1221 1
+1236 1230 1
+1236 1234 1
+1236 1253 1
+1236 1261 1
+1236 1279 1
+1236 1291 1
+1236 1297 1
+1236 1319 1
+1236 1357 1
+1236 1378 1
+1236 1390 1
+1236 1394 1
+1236 1425 1
+1236 1428 1
+1236 1439 1
+1236 1453 1
+1236 1471 1
+1236 1478 1
+1236 1482 1
+1236 1484 1
+1236 1489 1
+1236 1492 1
+1236 1496 1
+1236 1514 1
+1236 1518 1
+1236 1520 1
+1236 1521 1
+1236 1525 1
+1236 1538 1
+1236 1549 1
+1236 1555 1
+1236 1593 1
+1236 1600 1
+1236 1603 1
+1236 1610 1
+1236 1618 1
+1236 1622 1
+1236 1633 1
+1236 1641 1
+1236 1661 1
+1236 1701 1
+1236 1734 1
+1236 1754 1
+1236 1783 1
+1236 1808 1
+1236 1816 1
+1236 1847 1
+1236 1893 1
+1236 1918 1
+1236 1965 1
+1236 1966 1
+1236 1973 1
+1236 2066 1
+1236 2097 1
+1236 2120 1
+1236 2151 1
+1236 2251 1
+1236 2257 1
+1236 2328 1
+1236 2338 1
+1236 2504 1
+1236 2560 1
+1236 2585 1
+1236 2593 1
+1236 2594 1
+1236 2625 1
+1236 2685 1
+1236 2727 1
+1236 2746 1
+1236 2981 1
+1236 2999 1
+1236 3005 1
+1236 3030 1
+1236 3117 1
+1236 3276 1
+1236 3615 1
+1236 3807 1
+1236 4263 1
+1236 4365 1
+1236 4463 1
+1237 35 1
+1237 922 1
+1237 1193 1
+1237 1232 1
+1237 1260 1
+1237 1439 1
+1238 922 1
+1243 1201 1
+1243 1593 1
+1243 1718 1
+1243 2128 1
+1243 8290 1
+1241 35 1
+1241 230 1
+1241 871 1
+1241 974 1
+1241 978 1
+1241 982 1
+1241 1201 1
+1241 1234 1
+1241 1261 1
+1241 1286 1
+1241 1297 1
+1241 1319 1
+1241 1330 1
+1241 1484 1
+1241 1514 1
+1241 1549 1
+1241 1618 1
+1241 1633 1
+1241 1661 1
+1241 1758 1
+1241 1956 1
+1241 1973 1
+1241 2066 1
+1241 2210 1
+1241 2510 1
+1241 2594 1
+1241 3005 1
+1241 3084 1
+1241 3260 1
+1241 3755 1
+1241 3800 1
+1241 3903 1
+1241 4536 1
+1241 4735 1
+1241 6869 1
+1242 72 1
+1242 985 1
+1242 1199 1
+1242 1201 1
+1242 1241 1
+1242 1261 1
+1242 1286 1
+1242 1322 1
+1242 1496 1
+1242 1555 1
+1242 2685 1
+1244 805 1
+1244 6262 1
+1245 334 1
+1245 545 1
+1245 644 1
+1245 805 1
+1245 982 1
+1245 1062 1
+1245 1221 1
+1245 1241 1
+1245 1259 1
+1245 1286 1
+1246 545 1
+1246 644 1
+1246 805 1
+1246 943 1
+1246 1266 1
+1246 1286 1
+1246 1484 1
+1246 1979 1
+1247 15 1
+1247 204 1
+1247 298 1
+1247 407 1
+1247 425 1
+1247 633 1
+1247 762 1
+1247 765 1
+1247 805 1
+1247 960 1
+1247 971 1
+1247 993 1
+1247 1049 1
+1247 1097 1
+1247 1166 1
+1247 1167 1
+1247 1201 1
+1247 1253 1
+1247 1297 1
+1247 1319 1
+1247 1357 1
+1247 1374 1
+1247 1385 1
+1247 1407 1
+1247 1428 1
+1247 1441 1
+1247 1453 1
+1247 1468 1
+1247 1482 1
+1247 1484 1
+1247 1514 1
+1247 1580 1
+1247 1585 1
+1247 1633 1
+1247 1662 1
+1247 1754 1
+1247 1757 1
+1247 1847 1
+1247 2145 1
+1247 2251 1
+1247 2257 1
+1247 2324 1
+1247 2328 1
+1247 2398 1
+1247 2570 1
+1247 2620 1
+1247 2625 1
+1247 2657 1
+1247 2774 1
+1247 2775 1
+1247 2871 1
+1247 3002 1
+1247 3106 1
+1247 3171 1
+1247 3352 1
+1247 3393 1
+1247 3454 1
+1247 3473 1
+1247 3537 1
+1247 3843 1
+1247 3873 1
+1247 4189 1
+1247 4299 1
+1247 4384 1
+1247 4534 1
+1247 4780 1
+1247 4953 1
+1247 5189 1
+1247 5239 1
+1247 5321 1
+1247 5449 1
+1247 5545 1
+1247 5584 1
+1247 5817 1
+1247 5928 1
+1247 6417 1
+1247 8249 1
+1248 171 1
+1248 545 1
+1248 928 1
+1248 1160 1
+1248 1221 1
+1248 1236 1
+1248 1241 1
+1248 1266 1
+1248 1297 1
+1248 1402 1
+1248 1412 1
+1248 1425 1
+1248 1428 1
+1248 1484 1
+1248 1525 1
+1248 1587 1
+1248 1649 1
+1248 2066 1
+1248 2151 1
+1248 2328 1
+1248 3562 1
+1253 64 1
+1253 171 1
+1253 204 1
+1253 314 1
+1253 717 1
+1253 761 1
+1253 861 1
+1253 978 1
+1253 993 1
+1253 1022 1
+1253 1164 1
+1253 1199 1
+1253 1297 1
+1253 1382 1
+1253 1411 1
+1253 1428 1
+1253 1501 1
+1253 1513 1
+1253 1566 1
+1253 1596 1
+1253 1597 1
+1253 1600 1
+1253 1610 1
+1253 1636 1
+1253 1652 1
+1253 1679 1
+1253 1718 1
+1253 1729 1
+1253 1752 1
+1253 1787 1
+1253 1788 1
+1253 1833 1
+1253 1842 1
+1253 1847 1
+1253 1884 1
+1253 1956 1
+1253 2071 1
+1253 2381 1
+1253 2770 1
+1253 2797 1
+1253 2801 1
+1253 3033 1
+1253 3274 1
+1253 3393 1
+1253 3443 1
+1253 3456 1
+1253 4103 1
+1253 4234 1
+1253 4510 1
+1253 5828 1
+1253 8290 1
+1252 171 1
+1252 1241 1
+1254 1062 1
+1255 1062 1
+1256 1062 1
+1257 1062 1
+1258 1062 1
+1259 35 1
+1259 227 1
+1259 334 1
+1259 791 1
+1259 853 1
+1259 943 1
+1259 1062 1
+1259 1075 1
+1259 1166 1
+1259 1193 1
+1259 1221 1
+1259 1296 1
+1259 1297 1
+1259 1372 1
+1259 1389 1
+1259 1394 1
+1259 1413 1
+1259 1571 1
+1259 1633 1
+1259 2209 1
+1259 2338 1
+1259 2411 1
+1259 2542 1
+1259 2565 1
+1259 2587 1
+1259 2623 1
+1259 2657 1
+1259 2660 1
+1259 2693 1
+1259 2727 1
+1259 2790 1
+1259 2828 1
+1259 2900 1
+1259 3005 1
+1259 3408 1
+1259 3410 1
+1259 3429 1
+1259 3435 1
+1259 3446 1
+1259 3473 1
+1259 3489 1
+1259 3506 1
+1259 3529 1
+1259 3680 1
+1259 8293 1
+1261 298 1
+1261 407 1
+1261 763 1
+1261 1165 1
+1261 1514 1
+1261 1819 1
+1261 1859 1
+1261 3755 1
+1260 1241 1
+1260 1261 1
+1262 982 1
+1262 1444 1
+1264 1241 1
+1267 579 1
+1267 665 1
+1267 722 1
+1267 763 1
+1267 935 1
+1267 968 1
+1267 993 1
+1267 1018 1
+1267 1103 1
+1267 1211 1
+1267 1250 1
+1267 1259 1
+1267 1285 1
+1267 1319 1
+1267 1357 1
+1267 1496 1
+1267 1514 1
+1267 1521 1
+1267 1534 1
+1267 1566 1
+1267 1608 1
+1267 1672 1
+1267 1700 1
+1267 1707 1
+1267 1717 1
+1267 1791 1
+1267 1811 1
+1267 1835 1
+1267 1908 1
+1267 1964 1
+1267 1965 1
+1267 2014 1
+1267 2016 1
+1267 2085 1
+1267 2097 1
+1267 2135 1
+1267 2251 1
+1267 2371 1
+1267 2504 1
+1267 2560 1
+1267 2570 1
+1267 2579 1
+1267 2619 1
+1267 2660 1
+1267 2707 1
+1267 2746 1
+1267 2819 1
+1267 2831 1
+1267 2856 1
+1267 2955 1
+1267 2963 1
+1267 2968 1
+1267 2999 1
+1267 3033 1
+1267 3456 1
+1267 3800 1
+1267 3970 1
+1267 4600 1
+1267 4938 1
+1267 6170 1
+1267 6496 1
+1268 1259 1
+1269 1259 1
+1271 943 1
+1271 1282 1
+1272 1277 1
+1273 1277 1
+1274 1277 1
+1275 1277 1
+1278 35 1
+1278 259 1
+1278 290 1
+1278 299 1
+1278 644 1
+1278 710 1
+1278 717 1
+1278 810 1
+1278 853 1
+1278 907 1
+1278 960 1
+1278 963 1
+1278 971 1
+1278 978 1
+1278 985 1
+1278 993 1
+1278 1127 1
+1278 1167 1
+1278 1193 1
+1278 1201 1
+1278 1203 1
+1278 1211 1
+1278 1230 1
+1278 1234 1
+1278 1253 1
+1278 1277 1
+1278 1279 1
+1278 1286 1
+1278 1287 1
+1278 1297 1
+1278 1319 1
+1278 1321 1
+1278 1326 1
+1278 1382 1
+1278 1412 1
+1278 1413 1
+1278 1418 1
+1278 1420 1
+1278 1425 1
+1278 1428 1
+1278 1435 1
+1278 1437 1
+1278 1439 1
+1278 1441 1
+1278 1446 1
+1278 1464 1
+1278 1468 1
+1278 1471 1
+1278 1476 1
+1278 1484 1
+1278 1485 1
+1278 1486 1
+1278 1490 1
+1278 1496 1
+1278 1532 1
+1278 1538 1
+1278 1563 1
+1278 1580 1
+1278 1618 1
+1278 1622 1
+1278 1633 1
+1278 1648 1
+1278 1772 1
+1278 1774 1
+1278 1808 1
+1278 1816 1
+1278 1893 1
+1278 1918 1
+1278 4365 1
+1276 1277 1
+1279 35 1
+1279 171 1
+1279 204 1
+1279 227 1
+1279 259 1
+1279 290 1
+1279 332 1
+1279 417 1
+1279 575 1
+1279 579 1
+1279 644 1
+1279 710 1
+1279 717 1
+1279 762 1
+1279 771 1
+1279 813 1
+1279 826 1
+1279 871 1
+1279 887 1
+1279 907 1
+1279 948 1
+1279 959 1
+1279 960 1
+1279 971 1
+1279 978 1
+1279 1000 1
+1279 1022 1
+1279 1032 1
+1279 1055 1
+1279 1075 1
+1279 1154 1
+1279 1166 1
+1279 1167 1
+1279 1185 1
+1279 1201 1
+1279 1211 1
+1279 1234 1
+1279 1236 1
+1279 1248 1
+1279 1253 1
+1279 1267 1
+1279 1277 1
+1279 1286 1
+1279 1297 1
+1279 1319 1
+1279 1321 1
+1279 1326 1
+1279 1357 1
+1279 1377 1
+1279 1425 1
+1279 1428 1
+1279 1441 1
+1279 1446 1
+1279 1453 1
+1279 1464 1
+1279 1468 1
+1279 1471 1
+1279 1472 1
+1279 1484 1
+1279 1485 1
+1279 1489 1
+1279 1490 1
+1279 1496 1
+1279 1506 1
+1279 1507 1
+1279 1513 1
+1279 1518 1
+1279 1520 1
+1279 1524 1
+1279 1525 1
+1279 1531 1
+1279 1538 1
+1279 1549 1
+1279 1555 1
+1279 1563 1
+1279 1573 1
+1279 1580 1
+1279 1587 1
+1279 1595 1
+1279 1597 1
+1279 1608 1
+1279 1610 1
+1279 1618 1
+1279 1619 1
+1279 1629 1
+1279 1633 1
+1279 1638 1
+1279 1641 1
+1279 1649 1
+1279 1652 1
+1279 1654 1
+1279 1661 1
+1279 1662 1
+1279 1672 1
+1279 1716 1
+1279 1726 1
+1279 1732 1
+1279 1768 1
+1279 1774 1
+1279 1780 1
+1279 1787 1
+1279 1847 1
+1279 2062 1
+1279 2341 1
+1279 2345 1
+1279 2371 1
+1279 2385 1
+1279 2400 1
+1279 2504 1
+1279 2535 1
+1279 2587 1
+1279 2654 1
+1279 2655 1
+1279 2674 1
+1279 2819 1
+1279 2843 1
+1279 2963 1
+1279 2973 1
+1279 3005 1
+1279 3009 1
+1279 3253 1
+1279 3892 1
+1279 3956 1
+1279 4013 1
+1280 290 1
+1280 1277 1
+1280 2251 1
+1280 4341 1
+1282 1154 1
+1282 1384 1
+1282 2340 1
+1282 2410 1
+1282 2618 1
+1282 2763 1
+1282 2777 1
+1282 3557 1
+1281 946 1
+1281 993 1
+1281 1031 1
+1281 1282 1
+1281 1464 1
+1281 1489 1
+1281 1707 1
+1281 1772 1
+1281 1888 1
+1281 1893 1
+1286 35 1
+1286 72 1
+1286 299 1
+1286 737 1
+1286 765 1
+1286 853 1
+1286 935 1
+1286 1193 1
+1286 1230 1
+1286 1284 1
+1286 1285 1
+1286 1394 1
+1286 1403 1
+1286 1413 1
+1286 1420 1
+1286 1688 1
+1286 1706 1
+1286 1901 1
+1286 1903 1
+1286 1965 1
+1286 2079 1
+1286 2145 1
+1286 2193 1
+1286 2206 1
+1286 2398 1
+1286 2425 1
+1286 2456 1
+1286 2547 1
+1286 2619 1
+1286 2625 1
+1286 2651 1
+1286 2657 1
+1286 2686 1
+1286 2851 1
+1286 2856 1
+1286 2871 1
+1286 2955 1
+1286 2956 1
+1286 3309 1
+1286 3352 1
+1286 3454 1
+1286 3456 1
+1286 3464 1
+1286 3537 1
+1286 3643 1
+1286 3680 1
+1286 3755 1
+1286 4055 1
+1286 4127 1
+1286 4432 1
+1286 4529 1
+1286 4613 1
+1286 4646 1
+1286 4662 1
+1286 5002 1
+1286 5106 1
+1286 5459 1
+1286 5757 1
+1286 5818 1
+1286 5844 1
+1286 5925 1
+1286 6032 1
+1286 6227 1
+1286 6875 1
+1286 7553 1
+1284 935 1
+1284 937 1
+1284 1151 1
+1284 1285 1
+1284 1286 1
+1284 1534 1
+1284 1585 1
+1284 1688 1
+1284 1697 1
+1284 1723 1
+1284 1726 1
+1284 1859 1
+1284 1965 1
+1284 1966 1
+1284 1983 1
+1284 1987 1
+1284 2007 1
+1284 2079 1
+1284 2955 1
+1284 6875 1
+1285 15 1
+1285 72 1
+1285 290 1
+1285 579 1
+1285 853 1
+1285 993 1
+1285 1286 1
+1285 1305 1
+1285 1378 1
+1285 1688 1
+1285 1723 1
+1285 1726 1
+1285 1956 1
+1285 1965 1
+1285 2066 1
+1285 2079 1
+1285 2398 1
+1285 2485 1
+1285 2871 1
+1285 2955 1
+1285 3005 1
+1285 3009 1
+1285 3898 1
+1285 4463 1
+1285 4600 1
+1285 4687 1
+1285 5020 1
+1285 5684 1
+1285 5760 1
+1285 5818 1
+1285 7839 1
+1290 545 1
+1290 762 1
+1290 871 1
+1290 963 1
+1290 978 1
+1290 985 1
+1290 1167 1
+1290 1234 1
+1290 1297 1
+1290 1330 1
+1290 1377 1
+1290 1439 1
+1290 1497 1
+1290 1518 1
+1290 1573 1
+1290 1580 1
+1291 35 1
+1291 871 1
+1291 985 1
+1291 993 1
+1291 1193 1
+1291 1203 1
+1291 1261 1
+1291 1330 1
+1291 1357 1
+1291 1375 1
+1291 1377 1
+1291 1402 1
+1291 1497 1
+1291 1506 1
+1291 1549 1
+1291 1814 1
+1291 1977 1
+1291 2102 1
+1291 2106 1
+1291 2251 1
+1291 2256 1
+1291 2297 1
+1291 2474 1
+1291 2485 1
+1291 2594 1
+1291 2815 1
+1291 2972 1
+1291 2999 1
+1291 3014 1
+1291 3021 1
+1291 3473 1
+1291 3885 1
+1291 3887 1
+1291 4719 1
+1292 35 1
+1292 259 1
+1292 299 1
+1292 432 1
+1292 985 1
+1292 1193 1
+1292 1402 1
+1293 407 1
+1293 810 1
+1293 826 1
+1293 871 1
+1293 907 1
+1293 960 1
+1293 963 1
+1293 971 1
+1293 985 1
+1293 1031 1
+1293 1165 1
+1293 1167 1
+1293 1297 1
+1293 1319 1
+1293 1330 1
+1293 1377 1
+1293 1464 1
+1293 1484 1
+1293 1485 1
+1293 1486 1
+1293 1507 1
+1293 1513 1
+1293 1531 1
+1293 1532 1
+1293 1542 1
+1293 1842 1
+1293 1855 1
+1293 2193 1
+1293 2294 1
+1293 2665 1
+1293 2843 1
+1293 2877 1
+1293 2880 1
+1294 545 1
+1295 545 1
+1296 545 1
+1296 813 1
+1296 1035 1
+1296 1315 1
+1296 2195 1
+1296 2625 1
+1296 3026 1
+1296 3192 1
+1296 3537 1
+1297 35 1
+1297 204 1
+1297 290 1
+1297 417 1
+1297 465 1
+1297 545 1
+1297 647 1
+1297 710 1
+1297 762 1
+1297 859 1
+1297 959 1
+1297 974 1
+1297 978 1
+1297 1029 1
+1297 1166 1
+1297 1186 1
+1297 1193 1
+1297 1211 1
+1297 1234 1
+1297 1248 1
+1297 1261 1
+1297 1330 1
+1297 1439 1
+1297 1464 1
+1297 1484 1
+1297 1514 1
+1297 1564 1
+1297 1585 1
+1297 1633 1
+1297 1679 1
+1297 1705 1
+1297 1836 1
+1297 1847 1
+1297 1918 1
+1297 1964 1
+1297 2053 1
+1297 2069 1
+1297 2072 1
+1297 2145 1
+1297 2210 1
+1297 2256 1
+1297 2297 1
+1297 2322 1
+1297 2323 1
+1297 2398 1
+1297 2411 1
+1297 2474 1
+1297 2499 1
+1297 2508 1
+1297 2517 1
+1297 2535 1
+1297 2576 1
+1297 2585 1
+1297 2647 1
+1297 2653 1
+1297 2697 1
+1297 2727 1
+1297 2877 1
+1297 2900 1
+1297 2918 1
+1297 2923 1
+1297 2966 1
+1297 3005 1
+1297 3024 1
+1297 3029 1
+1297 3034 1
+1297 3084 1
+1297 3140 1
+1297 3276 1
+1297 3376 1
+1297 3516 1
+1297 3580 1
+1297 3755 1
+1297 3800 1
+1297 3946 1
+1297 8293 1
+1298 978 1
+1299 791 1
+1299 1442 1
+1299 1485 1
+1299 1525 1
+1299 1855 1
+1301 334 1
+1301 1203 1
+1301 1307 1
+1302 334 1
+1303 334 1
+1304 334 1
+1305 35 1
+1305 56 1
+1305 204 1
+1305 214 1
+1305 290 1
+1305 314 1
+1305 334 1
+1305 403 1
+1305 425 1
+1305 608 1
+1305 633 1
+1305 647 1
+1305 691 1
+1305 762 1
+1305 765 1
+1305 803 1
+1305 810 1
+1305 813 1
+1305 825 1
+1305 826 1
+1305 853 1
+1305 856 1
+1305 861 1
+1305 948 1
+1305 999 1
+1305 1022 1
+1305 1100 1
+1305 1127 1
+1305 1154 1
+1305 1157 1
+1305 1166 1
+1305 1167 1
+1305 1201 1
+1305 1211 1
+1305 1234 1
+1305 1239 1
+1305 1291 1
+1305 1296 1
+1305 1297 1
+1305 1315 1
+1305 1321 1
+1305 1330 1
+1305 1357 1
+1305 1389 1
+1305 1393 1
+1305 1403 1
+1305 1413 1
+1305 1416 1
+1305 1419 1
+1305 1453 1
+1305 1486 1
+1305 1490 1
+1305 1498 1
+1305 1556 1
+1305 1563 1
+1305 1571 1
+1305 1587 1
+1305 1592 1
+1305 1593 1
+1305 1595 1
+1305 1596 1
+1305 1600 1
+1305 1603 1
+1305 1604 1
+1305 1608 1
+1305 1633 1
+1305 1637 1
+1305 1646 1
+1305 1648 1
+1305 1653 1
+1305 1679 1
+1305 1723 1
+1305 1734 1
+1305 1754 1
+1305 1769 1
+1305 1777 1
+1305 1781 1
+1305 1792 1
+1305 1808 1
+1305 1814 1
+1305 1915 1
+1305 1918 1
+1305 1919 1
+1305 1935 1
+1305 1956 1
+1305 2016 1
+1305 2102 1
+1305 2114 1
+1305 2116 1
+1305 2120 1
+1305 2135 1
+1305 2144 1
+1305 2174 1
+1305 2209 1
+1305 2225 1
+1305 2231 1
+1305 2251 1
+1305 2252 1
+1305 2256 1
+1305 2257 1
+1305 2264 1
+1305 2290 1
+1305 2294 1
+1305 2297 1
+1305 2322 1
+1305 2323 1
+1305 2324 1
+1305 2325 1
+1305 2338 1
+1305 2366 1
+1305 2371 1
+1305 2410 1
+1305 2411 1
+1305 2416 1
+1305 2470 1
+1305 2474 1
+1305 2485 1
+1305 2501 1
+1305 2510 1
+1305 2542 1
+1305 2544 1
+1305 2547 1
+1305 2550 1
+1305 2560 1
+1305 2565 1
+1305 2576 1
+1305 2593 1
+1305 2594 1
+1305 2597 1
+1305 2599 1
+1305 2617 1
+1305 2619 1
+1305 2623 1
+1305 2625 1
+1305 2646 1
+1305 2654 1
+1305 2657 1
+1305 2662 1
+1305 2667 1
+1305 2674 1
+1305 2686 1
+1305 2693 1
+1305 2696 1
+1305 2697 1
+1305 2700 1
+1305 2707 1
+1305 2708 1
+1305 2713 1
+1305 2720 1
+1305 2721 1
+1305 2724 1
+1305 2727 1
+1305 2746 1
+1305 2747 1
+1305 2754 1
+1305 2763 1
+1305 2768 1
+1305 2770 1
+1305 2777 1
+1305 2794 1
+1305 2799 1
+1305 2805 1
+1305 2809 1
+1305 2814 1
+1305 2815 1
+1305 2819 1
+1305 2828 1
+1305 2830 1
+1305 2834 1
+1305 2877 1
+1305 2880 1
+1305 2900 1
+1305 2902 1
+1305 2912 1
+1305 2946 1
+1305 2951 1
+1305 2955 1
+1305 2958 1
+1305 2963 1
+1305 2966 1
+1305 2968 1
+1305 2972 1
+1305 2973 1
+1305 2977 1
+1305 2981 1
+1305 2993 1
+1305 2999 1
+1305 3005 1
+1305 3007 1
+1305 3009 1
+1305 3010 1
+1305 3018 1
+1305 3021 1
+1305 3024 1
+1305 3028 1
+1305 3029 1
+1305 3030 1
+1305 3033 1
+1305 3050 1
+1305 3056 1
+1305 3059 1
+1305 3073 1
+1305 3084 1
+1305 3089 1
+1305 3099 1
+1305 3114 1
+1305 3117 1
+1305 3126 1
+1305 3140 1
+1305 3148 1
+1305 3150 1
+1305 3164 1
+1305 3173 1
+1305 3193 1
+1305 3200 1
+1305 3243 1
+1305 3251 1
+1305 3253 1
+1305 3258 1
+1305 3260 1
+1305 3265 1
+1305 3276 1
+1305 3307 1
+1305 3324 1
+1305 3338 1
+1305 3351 1
+1305 3352 1
+1305 3371 1
+1305 3404 1
+1305 3408 1
+1305 3435 1
+1305 3461 1
+1305 3473 1
+1305 3480 1
+1305 3483 1
+1305 3489 1
+1305 3506 1
+1305 3516 1
+1305 3529 1
+1305 3538 1
+1305 3541 1
+1305 3548 1
+1305 3557 1
+1305 3567 1
+1305 3580 1
+1305 3587 1
+1305 3631 1
+1305 3646 1
+1305 3670 1
+1305 3680 1
+1305 3681 1
+1305 3713 1
+1305 3717 1
+1305 3769 1
+1305 3772 1
+1305 3800 1
+1305 3803 1
+1305 3804 1
+1305 3807 1
+1305 3812 1
+1305 3847 1
+1305 3887 1
+1305 3903 1
+1305 3946 1
+1305 3973 1
+1305 4043 1
+1305 4051 1
+1305 4055 1
+1305 4088 1
+1305 4162 1
+1305 4181 1
+1305 4188 1
+1305 4199 1
+1305 4233 1
+1305 4263 1
+1305 4266 1
+1305 4373 1
+1305 4529 1
+1305 4578 1
+1305 4588 1
+1305 4938 1
+1305 4953 1
+1305 4993 1
+1305 5155 1
+1305 5239 1
+1305 5404 1
+1305 5739 1
+1305 7108 1
+1305 8292 1
+1305 8293 1
+1306 298 1
+1306 334 1
+1306 813 1
+1306 907 1
+1306 1203 1
+1306 1234 1
+1306 1253 1
+1306 1307 1
+1306 1476 1
+1306 1484 1
+1306 1514 1
+1306 1726 1
+1306 1808 1
+1306 2375 1
+1306 2707 1
+1306 2922 1
+1306 3059 1
+1306 3404 1
+1306 3680 1
+1306 3867 1
+1308 644 1
+1308 1413 1
+1308 1425 1
+1308 1816 1
+1309 644 1
+1313 644 1
+1310 644 1
+1310 4827 1
+1311 644 1
+1311 1372 1
+1312 644 1
+1314 1296 1
+1315 904 1
+1315 1296 1
+1315 1566 1
+1315 1842 1
+1315 1908 1
+1315 2195 1
+1316 904 1
+1316 993 1
+1316 1296 1
+1316 1836 1
+1316 1842 1
+1316 1908 1
+1316 3192 1
+1317 1296 1
+1318 959 1
+1318 1296 1
+1319 204 1
+1319 230 1
+1319 290 1
+1319 314 1
+1319 407 1
+1319 415 1
+1319 417 1
+1319 506 1
+1319 579 1
+1319 691 1
+1319 717 1
+1319 762 1
+1319 764 1
+1319 813 1
+1319 907 1
+1319 908 1
+1319 946 1
+1319 948 1
+1319 959 1
+1319 971 1
+1319 974 1
+1319 978 1
+1319 993 1
+1319 1014 1
+1319 1035 1
+1319 1103 1
+1319 1127 1
+1319 1151 1
+1319 1154 1
+1319 1164 1
+1319 1165 1
+1319 1166 1
+1319 1200 1
+1319 1201 1
+1319 1203 1
+1319 1211 1
+1319 1236 1
+1319 1253 1
+1319 1261 1
+1319 1267 1
+1319 1279 1
+1319 1296 1
+1319 1322 1
+1319 1326 1
+1319 1357 1
+1319 1374 1
+1319 1382 1
+1319 1402 1
+1319 1418 1
+1319 1420 1
+1319 1428 1
+1319 1439 1
+1319 1446 1
+1319 1453 1
+1319 1465 1
+1319 1468 1
+1319 1482 1
+1319 1487 1
+1319 1492 1
+1319 1496 1
+1319 1521 1
+1319 1531 1
+1319 1537 1
+1319 1538 1
+1319 1549 1
+1319 1556 1
+1319 1566 1
+1319 1569 1
+1319 1573 1
+1319 1585 1
+1319 1593 1
+1319 1595 1
+1319 1596 1
+1319 1603 1
+1319 1604 1
+1319 1608 1
+1319 1618 1
+1319 1622 1
+1319 1628 1
+1319 1633 1
+1319 1638 1
+1319 1641 1
+1319 1648 1
+1319 1654 1
+1319 1658 1
+1319 1678 1
+1319 1680 1
+1319 1697 1
+1319 1700 1
+1319 1706 1
+1319 1714 1
+1319 1729 1
+1319 1734 1
+1319 1754 1
+1319 1758 1
+1319 1768 1
+1319 1772 1
+1319 1774 1
+1319 1793 1
+1319 1802 1
+1319 1805 1
+1319 1808 1
+1319 1814 1
+1319 1816 1
+1319 1849 1
+1319 1855 1
+1319 1880 1
+1319 1888 1
+1319 1893 1
+1319 1918 1
+1319 1919 1
+1319 1927 1
+1319 1953 1
+1319 1956 1
+1319 1966 1
+1319 1969 1
+1319 1973 1
+1319 1987 1
+1319 1992 1
+1319 2066 1
+1319 2073 1
+1319 2095 1
+1319 2097 1
+1319 2106 1
+1319 2117 1
+1319 2119 1
+1319 2128 1
+1319 2145 1
+1319 2151 1
+1319 2160 1
+1319 2231 1
+1319 2240 1
+1319 2307 1
+1319 2322 1
+1319 2328 1
+1319 2398 1
+1319 2474 1
+1319 2506 1
+1319 2542 1
+1319 2565 1
+1319 2593 1
+1319 2625 1
+1319 2653 1
+1319 2662 1
+1319 2693 1
+1319 2727 1
+1319 2746 1
+1319 2754 1
+1319 2859 1
+1319 2900 1
+1319 2923 1
+1319 2958 1
+1319 3005 1
+1319 3014 1
+1319 3021 1
+1319 3024 1
+1319 3033 1
+1319 3117 1
+1319 3130 1
+1319 3136 1
+1319 3237 1
+1319 3253 1
+1319 3265 1
+1319 3276 1
+1319 3307 1
+1319 3338 1
+1319 3473 1
+1319 3650 1
+1319 3726 1
+1319 3755 1
+1319 3787 1
+1319 3871 1
+1319 3967 1
+1319 4162 1
+1319 4323 1
+1319 4528 1
+1319 5288 1
+1319 6496 1
+1319 6789 1
+1319 8290 1
+1319 8291 1
+1320 417 1
+1320 647 1
+1320 2508 1
+1320 3005 1
+1320 4980 1
+1320 5288 1
+1322 710 1
+1322 946 1
+1322 960 1
+1322 993 1
+1322 1267 1
+1322 1418 1
+1322 1497 1
+1322 1633 1
+1322 2400 1
+1322 2785 1
+1322 2809 1
+1322 2922 1
+1324 1029 1
+1327 299 1
+1328 299 1
+1328 665 1
+1325 299 1
+1329 299 1
+1329 1633 1
+1329 1638 1
+1326 56 1
+1326 299 1
+1326 1322 1
+1326 1439 1
+1326 1893 1
+1326 2004 1
+1331 35 1
+1331 959 1
+1331 1193 1
+1331 2160 1
+1331 3755 1
+1331 5902 1
+1332 35 1
+1333 999 1
+1333 1111 1
+1334 1193 1
+1335 290 1
+1335 579 1
+1335 761 1
+1335 762 1
+1335 935 1
+1335 971 1
+1335 1000 1
+1335 1097 1
+1335 1127 1
+1335 1151 1
+1335 1193 1
+1335 1250 1
+1335 1253 1
+1335 1285 1
+1335 1297 1
+1335 1322 1
+1335 1326 1
+1335 1374 1
+1335 1384 1
+1335 1412 1
+1335 1420 1
+1335 1425 1
+1335 1428 1
+1335 1442 1
+1335 1453 1
+1335 1521 1
+1335 1555 1
+1335 1610 1
+1335 1618 1
+1335 1628 1
+1335 1638 1
+1335 1672 1
+1335 1680 1
+1335 1716 1
+1335 1726 1
+1335 1732 1
+1335 1770 1
+1335 1772 1
+1335 1798 1
+1335 1835 1
+1335 1848 1
+1335 1861 1
+1335 1864 1
+1335 1992 1
+1335 2076 1
+1335 2165 1
+1335 2168 1
+1335 2178 1
+1335 2322 1
+1335 2329 1
+1335 2504 1
+1335 2517 1
+1335 2605 1
+1335 2625 1
+1335 3459 1
+1335 4536 1
+1335 5305 1
+1335 5651 1
+1335 5680 1
+1335 5683 1
+1335 5828 1
+1335 5850 1
+1336 665 1
+1336 1193 1
+1336 2014 1
+1336 2091 1
+1336 2237 1
+1336 2470 1
+1336 3792 1
+1336 4687 1
+1337 1193 1
+1338 1193 1
+1338 1407 1
+1338 1412 1
+1339 993 1
+1339 1193 1
+1339 1585 1
+1339 1593 1
+1339 1956 1
+1340 665 1
+1340 1193 1
+1340 2470 1
+1341 1193 1
+1341 2470 1
+1342 1193 1
+1342 1564 1
+1342 2470 1
+1342 3352 1
+1343 1193 1
+1343 2398 1
+1344 1193 1
+1344 1260 1
+1345 1193 1
+1346 1193 1
+1346 1412 1
+1346 4795 1
+1349 259 1
+1349 1977 1
+1350 259 1
+1350 372 1
+1350 407 1
+1350 415 1
+1350 559 1
+1350 579 1
+1350 763 1
+1350 826 1
+1350 908 1
+1350 947 1
+1350 993 1
+1350 1000 1
+1350 1022 1
+1350 1035 1
+1350 1103 1
+1350 1124 1
+1350 1151 1
+1350 1164 1
+1350 1165 1
+1350 1167 1
+1350 1199 1
+1350 1201 1
+1350 1211 1
+1350 1230 1
+1350 1248 1
+1350 1253 1
+1350 1261 1
+1350 1279 1
+1350 1285 1
+1350 1297 1
+1350 1319 1
+1350 1322 1
+1350 1389 1
+1350 1411 1
+1350 1428 1
+1350 1482 1
+1350 1487 1
+1350 1489 1
+1350 1490 1
+1350 1492 1
+1350 1496 1
+1350 1506 1
+1350 1514 1
+1350 1520 1
+1350 1533 1
+1350 1534 1
+1350 1538 1
+1350 1547 1
+1350 1555 1
+1350 1566 1
+1350 1585 1
+1350 1596 1
+1350 1597 1
+1350 1608 1
+1350 1610 1
+1350 1619 1
+1350 1621 1
+1350 1622 1
+1350 1628 1
+1350 1633 1
+1350 1638 1
+1350 1649 1
+1350 1652 1
+1350 1657 1
+1350 1658 1
+1350 1661 1
+1350 1662 1
+1350 1672 1
+1350 1678 1
+1350 1680 1
+1350 1700 1
+1350 1701 1
+1350 1717 1
+1350 1718 1
+1350 1726 1
+1350 1732 1
+1350 1757 1
+1350 1758 1
+1350 1768 1
+1350 1774 1
+1350 1783 1
+1350 1788 1
+1350 1791 1
+1350 1793 1
+1350 1798 1
+1350 1802 1
+1350 1805 1
+1350 1811 1
+1350 1816 1
+1350 1836 1
+1350 1842 1
+1350 1849 1
+1350 1855 1
+1350 1858 1
+1350 1859 1
+1350 1884 1
+1350 1901 1
+1350 1903 1
+1350 1908 1
+1350 1953 1
+1350 1963 1
+1350 1966 1
+1350 1969 1
+1350 1973 1
+1350 2062 1
+1350 2117 1
+1350 2151 1
+1350 2157 1
+1350 2178 1
+1350 2240 1
+1350 2285 1
+1350 2322 1
+1350 2378 1
+1350 2400 1
+1350 3755 1
+1350 8290 1
+1350 8291 1
+1351 259 1
+1352 230 1
+1352 259 1
+1352 285 1
+1352 298 1
+1352 314 1
+1352 372 1
+1352 559 1
+1352 717 1
+1352 761 1
+1352 763 1
+1352 887 1
+1352 904 1
+1352 908 1
+1352 928 1
+1352 937 1
+1352 963 1
+1352 971 1
+1352 993 1
+1352 1000 1
+1352 1014 1
+1352 1103 1
+1352 1111 1
+1352 1124 1
+1352 1164 1
+1352 1199 1
+1352 1200 1
+1352 1201 1
+1352 1211 1
+1352 1230 1
+1352 1234 1
+1352 1236 1
+1352 1248 1
+1352 1253 1
+1352 1261 1
+1352 1284 1
+1352 1285 1
+1352 1297 1
+1352 1319 1
+1352 1396 1
+1352 1411 1
+1352 1420 1
+1352 1428 1
+1352 1453 1
+1352 1478 1
+1352 1482 1
+1352 1487 1
+1352 1489 1
+1352 1496 1
+1352 1497 1
+1352 1514 1
+1352 1531 1
+1352 1534 1
+1352 1555 1
+1352 1556 1
+1352 1566 1
+1352 1573 1
+1352 1580 1
+1352 1583 1
+1352 1585 1
+1352 1603 1
+1352 1608 1
+1352 1618 1
+1352 1622 1
+1352 1628 1
+1352 1629 1
+1352 1638 1
+1352 1649 1
+1352 1658 1
+1352 1661 1
+1352 1679 1
+1352 1697 1
+1352 1714 1
+1352 1717 1
+1352 1726 1
+1352 1746 1
+1352 1747 1
+1352 1752 1
+1352 1757 1
+1352 1758 1
+1352 1770 1
+1352 1774 1
+1352 1780 1
+1352 1783 1
+1352 1787 1
+1352 1791 1
+1352 1802 1
+1352 1805 1
+1352 1811 1
+1352 1816 1
+1352 1842 1
+1352 1849 1
+1352 1858 1
+1352 1859 1
+1352 1864 1
+1352 1893 1
+1352 1908 1
+1352 1920 1
+1352 1927 1
+1352 1956 1
+1352 1963 1
+1352 1966 1
+1352 1969 1
+1352 1973 1
+1352 1979 1
+1352 1985 1
+1352 1987 1
+1352 2004 1
+1352 2055 1
+1352 2060 1
+1352 2066 1
+1352 2073 1
+1352 2106 1
+1352 2119 1
+1352 2137 1
+1352 2151 1
+1352 2157 1
+1352 2165 1
+1352 2181 1
+1352 2211 1
+1352 3136 1
+1352 8290 1
+1359 15 1
+1359 259 1
+1359 7168 1
+1353 259 1
+1353 1075 1
+1353 1111 1
+1353 1473 1
+1353 1548 1
+1353 1783 1
+1353 1836 1
+1353 1848 1
+1353 1977 1
+1353 1997 1
+1353 2071 1
+1353 2181 1
+1353 2276 1
+1353 2354 1
+1353 2398 1
+1353 2542 1
+1353 2595 1
+1353 3192 1
+1353 3352 1
+1353 3408 1
+1353 3458 1
+1353 3835 1
+1353 3976 1
+1353 4276 1
+1353 4338 1
+1353 5254 1
+1353 5341 1
+1353 5423 1
+1353 5511 1
+1353 7131 1
+1360 259 1
+1360 285 1
+1360 290 1
+1360 762 1
+1360 763 1
+1360 856 1
+1360 1864 1
+1360 2550 1
+1360 2625 1
+1360 2654 1
+1360 2877 1
+1360 2951 1
+1360 3020 1
+1360 3089 1
+1360 3117 1
+1360 3140 1
+1360 3150 1
+1360 4044 1
+1360 4189 1
+1360 4953 1
+1360 5412 1
+1360 6262 1
+1354 259 1
+1354 1297 1
+1354 1372 1
+1354 1411 1
+1354 2411 1
+1354 2770 1
+1354 3136 1
+1354 3769 1
+1355 259 1
+1355 1412 1
+1355 2066 1
+1361 259 1
+1356 259 1
+1356 290 1
+1356 960 1
+1356 1322 1
+1356 1493 1
+1356 1595 1
+1356 1638 1
+1356 1718 1
+1356 1732 1
+1356 1780 1
+1356 1842 1
+1356 1855 1
+1356 2416 1
+1356 3020 1
+1356 3346 1
+1356 3813 1
+1356 4201 1
+1356 4373 1
+1356 6388 1
+1356 6770 1
+1362 259 1
+1362 771 1
+1362 1701 1
+1362 2643 1
+1357 259 1
+1357 285 1
+1357 298 1
+1357 403 1
+1357 417 1
+1357 425 1
+1357 579 1
+1357 762 1
+1357 813 1
+1357 871 1
+1357 887 1
+1357 907 1
+1357 960 1
+1357 963 1
+1357 971 1
+1357 1022 1
+1357 1032 1
+1357 1127 1
+1357 1164 1
+1357 1166 1
+1357 1167 1
+1357 1201 1
+1357 1203 1
+1357 1230 1
+1357 1234 1
+1357 1236 1
+1357 1253 1
+1357 1279 1
+1357 1291 1
+1357 1319 1
+1357 1322 1
+1357 1352 1
+1357 1377 1
+1357 1428 1
+1357 1439 1
+1357 1468 1
+1357 1471 1
+1357 1476 1
+1357 1482 1
+1357 1496 1
+1357 1497 1
+1357 1513 1
+1357 1514 1
+1357 1518 1
+1357 1525 1
+1357 1538 1
+1357 1571 1
+1357 1580 1
+1357 1585 1
+1357 1593 1
+1357 1603 1
+1357 1604 1
+1357 1619 1
+1357 1622 1
+1357 1641 1
+1357 1649 1
+1357 1661 1
+1357 1672 1
+1357 1679 1
+1357 1701 1
+1357 1726 1
+1357 1734 1
+1357 1747 1
+1357 1758 1
+1357 1774 1
+1357 1792 1
+1357 1808 1
+1357 1814 1
+1357 1859 1
+1357 1956 1
+1357 1963 1
+1357 1966 1
+1357 2102 1
+1357 2264 1
+1357 2328 1
+1357 2371 1
+1357 2560 1
+1357 2593 1
+1357 2674 1
+1357 2727 1
+1357 2763 1
+1357 2794 1
+1357 2968 1
+1357 3033 1
+1357 3117 1
+1357 3130 1
+1357 3192 1
+1357 3265 1
+1357 3276 1
+1357 4256 1
+1357 5950 1
+1358 259 1
+1358 407 1
+1358 959 1
+1358 1307 1
+1358 1497 1
+1358 1549 1
+1358 1836 1
+1358 1842 1
+1358 1855 1
+1358 2354 1
+1358 2398 1
+1358 2654 1
+1358 3755 1
+1358 4037 1
+1358 4884 1
+1358 5028 1
+1358 5484 1
+1358 7478 1
+1365 432 1
+1365 1075 1
+1365 2774 1
+1365 3238 1
+1365 6790 1
+1365 6914 1
+1365 7795 1
+1366 1075 1
+1367 204 1
+1367 285 1
+1367 417 1
+1367 432 1
+1367 810 1
+1367 856 1
+1367 959 1
+1367 974 1
+1367 1100 1
+1367 1157 1
+1367 1186 1
+1367 1297 1
+1367 1402 1
+1367 1538 1
+1367 1571 1
+1367 1679 1
+1367 2144 1
+1367 2290 1
+1367 2324 1
+1367 2398 1
+1367 2542 1
+1367 2565 1
+1367 2576 1
+1367 2623 1
+1367 2653 1
+1367 2660 1
+1367 2667 1
+1367 2674 1
+1367 2819 1
+1367 2973 1
+1367 3173 1
+1367 3348 1
+1367 3371 1
+1367 3465 1
+1367 3506 1
+1367 3520 1
+1367 3537 1
+1367 3548 1
+1367 3587 1
+1367 3609 1
+1368 407 1
+1368 771 1
+1368 959 1
+1368 1186 1
+1368 1261 1
+1368 1542 1
+1368 1622 1
+1368 1816 1
+1368 1842 1
+1368 1855 1
+1368 1859 1
+1368 1893 1
+1368 1927 1
+1368 1987 1
+1368 2210 1
+1368 2325 1
+1368 2397 1
+1368 2474 1
+1368 2565 1
+1368 2654 1
+1368 2662 1
+1368 3243 1
+1368 3265 1
+1368 3307 1
+1368 3557 1
+1368 3646 1
+1368 3717 1
+1368 3755 1
+1368 3772 1
+1368 3785 1
+1368 3843 1
+1368 4043 1
+1368 4051 1
+1369 3755 1
+1370 3755 1
+1375 1793 1
+1375 4098 1
+1375 4480 1
+1375 5886 1
+1373 762 1
+1373 1248 1
+1373 1375 1
+1373 1435 1
+1374 56 1
+1374 72 1
+1374 171 1
+1374 204 1
+1374 230 1
+1374 285 1
+1374 290 1
+1374 298 1
+1374 407 1
+1374 425 1
+1374 559 1
+1374 579 1
+1374 608 1
+1374 633 1
+1374 665 1
+1374 737 1
+1374 762 1
+1374 765 1
+1374 826 1
+1374 840 1
+1374 856 1
+1374 896 1
+1374 904 1
+1374 959 1
+1374 967 1
+1374 974 1
+1374 1022 1
+1374 1034 1
+1374 1049 1
+1374 1103 1
+1374 1111 1
+1374 1127 1
+1374 1151 1
+1374 1165 1
+1374 1166 1
+1374 1167 1
+1374 1191 1
+1374 1199 1
+1374 1247 1
+1374 1253 1
+1374 1267 1
+1374 1285 1
+1374 1297 1
+1374 1322 1
+1374 1353 1
+1374 1375 1
+1374 1384 1
+1374 1393 1
+1374 1403 1
+1374 1411 1
+1374 1419 1
+1374 1464 1
+1374 1473 1
+1374 1506 1
+1374 1521 1
+1374 1534 1
+1374 1549 1
+1374 1573 1
+1374 1580 1
+1374 1585 1
+1374 1633 1
+1374 1637 1
+1374 1646 1
+1374 1648 1
+1374 1653 1
+1374 1679 1
+1374 1680 1
+1374 1705 1
+1374 1717 1
+1374 1730 1
+1374 1733 1
+1374 1746 1
+1374 1749 1
+1374 1757 1
+1374 1772 1
+1374 1774 1
+1374 1788 1
+1374 1792 1
+1374 1799 1
+1374 1805 1
+1374 1808 1
+1374 1814 1
+1374 1847 1
+1374 1849 1
+1374 1855 1
+1374 1858 1
+1374 1865 1
+1374 1888 1
+1374 1903 1
+1374 1918 1
+1374 1919 1
+1374 1956 1
+1374 1973 1
+1374 1982 1
+1374 1990 1
+1374 1991 1
+1374 2001 1
+1374 2066 1
+1374 2071 1
+1374 2095 1
+1374 2102 1
+1374 2106 1
+1374 2109 1
+1374 2116 1
+1374 2117 1
+1374 2120 1
+1374 2121 1
+1374 2135 1
+1374 2137 1
+1374 2145 1
+1374 2151 1
+1374 2157 1
+1374 2168 1
+1374 2174 1
+1374 2181 1
+1374 2193 1
+1374 2202 1
+1374 2223 1
+1374 2225 1
+1374 2246 1
+1374 2253 1
+1374 2257 1
+1374 2258 1
+1374 2264 1
+1374 2273 1
+1374 2307 1
+1374 2322 1
+1374 2323 1
+1374 2325 1
+1374 2338 1
+1374 2354 1
+1374 2369 1
+1374 2375 1
+1374 2397 1
+1374 2398 1
+1374 2410 1
+1374 2470 1
+1374 2485 1
+1374 2490 1
+1374 2508 1
+1374 2516 1
+1374 2535 1
+1374 2547 1
+1374 2560 1
+1374 2565 1
+1374 2576 1
+1374 2585 1
+1374 2593 1
+1374 2623 1
+1374 2625 1
+1374 2643 1
+1374 2654 1
+1374 2658 1
+1374 2665 1
+1374 2685 1
+1374 2687 1
+1374 2713 1
+1374 2747 1
+1374 2754 1
+1374 2763 1
+1374 2764 1
+1374 2768 1
+1374 2775 1
+1374 2785 1
+1374 2787 1
+1374 2794 1
+1374 2805 1
+1374 2809 1
+1374 2814 1
+1374 2822 1
+1374 2825 1
+1374 2828 1
+1374 2830 1
+1374 2831 1
+1374 2834 1
+1374 2838 1
+1374 2859 1
+1374 2877 1
+1374 2909 1
+1374 2912 1
+1374 2922 1
+1374 2928 1
+1374 2955 1
+1374 2963 1
+1374 2966 1
+1374 2977 1
+1374 3005 1
+1374 3018 1
+1374 3020 1
+1374 3030 1
+1374 3084 1
+1374 3089 1
+1374 3114 1
+1374 3117 1
+1374 3136 1
+1374 3164 1
+1374 3238 1
+1374 3243 1
+1374 3251 1
+1374 3258 1
+1374 3260 1
+1374 3265 1
+1374 3274 1
+1374 3276 1
+1374 3293 1
+1374 3297 1
+1374 3307 1
+1374 3310 1
+1374 3334 1
+1374 3338 1
+1374 3348 1
+1374 3351 1
+1374 3352 1
+1374 3371 1
+1374 3381 1
+1374 3393 1
+1374 3408 1
+1374 3417 1
+1374 3435 1
+1374 3456 1
+1374 3459 1
+1374 3506 1
+1374 3529 1
+1374 3554 1
+1374 3562 1
+1374 3631 1
+1374 3720 1
+1374 3726 1
+1374 3752 1
+1374 3755 1
+1374 3830 1
+1374 3843 1
+1374 3871 1
+1374 3887 1
+1374 3897 1
+1374 3910 1
+1374 3958 1
+1374 3962 1
+1374 3973 1
+1374 3976 1
+1374 4037 1
+1374 4055 1
+1374 4071 1
+1374 4098 1
+1374 4099 1
+1374 4110 1
+1374 4124 1
+1374 4179 1
+1374 4191 1
+1374 4233 1
+1374 4247 1
+1374 4269 1
+1374 4276 1
+1374 4310 1
+1374 4335 1
+1374 4338 1
+1374 4341 1
+1374 4361 1
+1374 4435 1
+1374 4448 1
+1374 4530 1
+1374 4534 1
+1374 4536 1
+1374 4600 1
+1374 4632 1
+1374 4653 1
+1374 4666 1
+1374 4712 1
+1374 4777 1
+1374 4797 1
+1374 4846 1
+1374 4875 1
+1374 4964 1
+1374 4977 1
+1374 4981 1
+1374 5002 1
+1374 5012 1
+1374 5020 1
+1374 5022 1
+1374 5028 1
+1374 5072 1
+1374 5079 1
+1374 5083 1
+1374 5092 1
+1374 5123 1
+1374 5148 1
+1374 5155 1
+1374 5162 1
+1374 5176 1
+1374 5189 1
+1374 5199 1
+1374 5210 1
+1374 5233 1
+1374 5246 1
+1374 5254 1
+1374 5263 1
+1374 5288 1
+1374 5301 1
+1374 5321 1
+1374 5323 1
+1374 5335 1
+1374 5341 1
+1374 5384 1
+1374 5392 1
+1374 5404 1
+1374 5412 1
+1374 5423 1
+1374 5445 1
+1374 5449 1
+1374 5452 1
+1374 5454 1
+1374 5463 1
+1374 5465 1
+1374 5482 1
+1374 5484 1
+1374 5500 1
+1374 5509 1
+1374 5511 1
+1374 5529 1
+1374 5539 1
+1374 5568 1
+1374 5605 1
+1374 5637 1
+1374 5671 1
+1374 5683 1
+1374 5693 1
+1374 5697 1
+1374 5714 1
+1374 5721 1
+1374 5732 1
+1374 5737 1
+1374 5743 1
+1374 5760 1
+1374 5773 1
+1374 5780 1
+1374 5790 1
+1374 5807 1
+1374 5814 1
+1374 5817 1
+1374 5828 1
+1374 5837 1
+1374 5839 1
+1374 5844 1
+1374 5871 1
+1374 5886 1
+1374 5891 1
+1374 5897 1
+1374 5902 1
+1374 5922 1
+1374 5933 1
+1374 5947 1
+1374 6004 1
+1374 6032 1
+1374 6043 1
+1374 6044 1
+1374 6151 1
+1374 6174 1
+1374 6241 1
+1374 6299 1
+1374 6320 1
+1374 6330 1
+1374 6347 1
+1374 6414 1
+1374 6496 1
+1374 6523 1
+1374 6555 1
+1374 6560 1
+1374 6624 1
+1374 6634 1
+1374 6774 1
+1374 6783 1
+1374 6784 1
+1374 6789 1
+1374 6790 1
+1374 6803 1
+1374 6850 1
+1374 6855 1
+1374 6875 1
+1374 6914 1
+1374 6918 1
+1374 6934 1
+1374 6946 1
+1374 6980 1
+1374 7005 1
+1374 7021 1
+1374 7047 1
+1374 7052 1
+1374 7054 1
+1374 7059 1
+1374 7088 1
+1374 7092 1
+1374 7094 1
+1374 7108 1
+1374 7120 1
+1374 7131 1
+1374 7214 1
+1374 7225 1
+1374 7233 1
+1374 7237 1
+1374 7277 1
+1374 7280 1
+1374 7295 1
+1374 7301 1
+1374 7351 1
+1374 7373 1
+1374 7378 1
+1374 7386 1
+1374 7391 1
+1374 7400 1
+1374 7443 1
+1374 7510 1
+1374 7512 1
+1374 7529 1
+1374 7544 1
+1374 7553 1
+1374 7561 1
+1374 7587 1
+1374 7620 1
+1374 7632 1
+1374 7646 1
+1374 7649 1
+1374 7651 1
+1374 7683 1
+1374 7699 1
+1374 7707 1
+1374 7726 1
+1374 7757 1
+1374 7763 1
+1374 7788 1
+1374 7795 1
+1374 7803 1
+1374 7809 1
+1374 7813 1
+1374 7839 1
+1374 7855 1
+1374 7860 1
+1374 7862 1
+1374 7871 1
+1374 7879 1
+1374 7882 1
+1374 7890 1
+1374 7908 1
+1374 7910 1
+1374 7912 1
+1374 7979 1
+1374 7992 1
+1374 8002 1
+1374 8037 1
+1374 8083 1
+1374 8121 1
+1374 8122 1
+1374 8128 1
+1374 8163 1
+1374 8168 1
+1374 8174 1
+1374 8192 1
+1374 8198 1
+1374 8290 1
+1374 8292 1
+1374 8293 1
+1374 8294 1
+1374 8297 1
+1382 1100 1
+1382 1211 1
+1382 1297 1
+1382 1453 1
+1382 1777 1
+1382 2257 1
+1382 2397 1
+1382 2411 1
+1382 2485 1
+1382 2654 1
+1382 2657 1
+1382 2727 1
+1382 3005 1
+1382 3480 1
+1382 3646 1
+1382 3745 1
+1382 3875 1
+1376 1382 1
+1377 407 1
+1377 826 1
+1377 871 1
+1377 960 1
+1377 1022 1
+1377 1034 1
+1377 1164 1
+1377 1168 1
+1377 1234 1
+1377 1253 1
+1377 1279 1
+1377 1297 1
+1377 1382 1
+1377 1396 1
+1377 1402 1
+1377 1484 1
+1377 1490 1
+1377 1496 1
+1377 1514 1
+1377 1518 1
+1377 1569 1
+1377 1597 1
+1377 1652 1
+1377 1661 1
+1377 1774 1
+1377 1783 1
+1377 1805 1
+1377 1819 1
+1377 1842 1
+1377 1966 1
+1377 2580 1
+1377 3755 1
+1377 5412 1
+1378 762 1
+1378 935 1
+1378 1284 1
+1378 1382 1
+1378 1453 1
+1378 1723 1
+1378 1726 1
+1378 1965 1
+1378 1966 1
+1378 1977 1
+1378 2071 1
+1378 2079 1
+1378 2246 1
+1378 2371 1
+1379 1382 1
+1380 214 1
+1380 230 1
+1380 717 1
+1380 762 1
+1380 871 1
+1380 928 1
+1380 963 1
+1380 971 1
+1380 974 1
+1380 975 1
+1380 993 1
+1380 1031 1
+1380 1127 1
+1380 1140 1
+1380 1167 1
+1380 1201 1
+1380 1203 1
+1380 1234 1
+1380 1253 1
+1380 1297 1
+1380 1319 1
+1380 1374 1
+1380 1377 1
+1380 1382 1
+1380 1402 1
+1380 1407 1
+1380 1413 1
+1380 1418 1
+1380 1420 1
+1380 1425 1
+1380 1439 1
+1380 1453 1
+1380 1464 1
+1380 1468 1
+1380 1471 1
+1380 1476 1
+1380 1487 1
+1380 1492 1
+1380 1513 1
+1380 1518 1
+1380 1538 1
+1380 1547 1
+1380 1573 1
+1380 1621 1
+1380 1638 1
+1380 1705 1
+1380 1754 1
+1380 1772 1
+1380 1774 1
+1380 1787 1
+1380 1792 1
+1380 1956 1
+1380 2062 1
+1380 2066 1
+1380 2073 1
+1380 2117 1
+1380 2119 1
+1380 2151 1
+1380 2193 1
+1380 2400 1
+1380 2517 1
+1380 2625 1
+1380 8292 1
+1381 813 1
+1381 913 1
+1381 948 1
+1381 993 1
+1381 1014 1
+1381 1164 1
+1381 1253 1
+1381 1297 1
+1381 1315 1
+1381 1378 1
+1381 1382 1
+1381 1453 1
+1381 1482 1
+1381 1514 1
+1381 1566 1
+1381 1610 1
+1381 1613 1
+1381 1622 1
+1381 1662 1
+1381 1688 1
+1381 1705 1
+1381 1780 1
+1381 1805 1
+1381 1908 1
+1381 1992 1
+1381 2016 1
+1381 2066 1
+1381 2137 1
+1381 2165 1
+1381 2371 1
+1381 2378 1
+1381 2398 1
+1381 2485 1
+1381 2560 1
+1381 2653 1
+1381 2696 1
+1381 2697 1
+1381 2880 1
+1381 2966 1
+1381 3026 1
+1381 3059 1
+1381 3144 1
+1381 3173 1
+1381 3192 1
+1381 3537 1
+1381 3634 1
+1381 3748 1
+1381 3755 1
+1381 3897 1
+1381 5026 1
+1381 5323 1
+1381 6347 1
+1383 1384 1
+1383 1389 1
+1383 2963 1
+1383 4179 1
+1384 56 1
+1384 762 1
+1384 1049 1
+1384 1154 1
+1384 1374 1
+1384 1389 1
+1384 1416 1
+1384 1549 1
+1384 1564 1
+1384 1593 1
+1384 1837 1
+1384 1847 1
+1384 1956 1
+1384 2542 1
+1384 2565 1
+1384 2653 1
+1384 2655 1
+1384 2660 1
+1384 2686 1
+1384 2727 1
+1384 2751 1
+1384 2809 1
+1384 2814 1
+1384 2828 1
+1384 3180 1
+1384 3258 1
+1384 3489 1
+1384 3506 1
+1384 3537 1
+1384 3587 1
+1384 3717 1
+1384 3755 1
+1384 4021 1
+1384 4049 1
+1384 4110 1
+1384 4179 1
+1384 8293 1
+1385 579 1
+1385 1389 1
+1385 1593 1
+1385 2323 1
+1385 2612 1
+1385 2999 1
+1385 3164 1
+1385 3238 1
+1385 3319 1
+1385 3346 1
+1385 3439 1
+1385 4037 1
+1385 4071 1
+1385 4099 1
+1385 4179 1
+1385 4781 1
+1385 4884 1
+1385 4999 1
+1385 5012 1
+1385 5022 1
+1385 5200 1
+1385 5233 1
+1385 5614 1
+1385 6004 1
+1385 6299 1
+1385 6833 1
+1385 7092 1
+1385 7279 1
+1385 7351 1
+1385 7478 1
+1385 7694 1
+1385 7699 1
+1385 7890 1
+1385 7992 1
+1385 8002 1
+1386 298 1
+1386 559 1
+1386 579 1
+1386 761 1
+1386 763 1
+1386 771 1
+1386 813 1
+1386 836 1
+1386 887 1
+1386 928 1
+1386 935 1
+1386 937 1
+1386 948 1
+1386 960 1
+1386 975 1
+1386 1127 1
+1386 1164 1
+1386 1203 1
+1386 1211 1
+1386 1236 1
+1386 1248 1
+1386 1253 1
+1386 1353 1
+1386 1389 1
+1386 1413 1
+1386 1420 1
+1386 1425 1
+1386 1428 1
+1386 1444 1
+1386 1482 1
+1386 1489 1
+1386 1496 1
+1386 1518 1
+1386 1525 1
+1386 1534 1
+1386 1555 1
+1386 1566 1
+1386 1585 1
+1386 1595 1
+1386 1622 1
+1386 1641 1
+1386 1649 1
+1386 1717 1
+1386 1772 1
+1386 1774 1
+1386 1791 1
+1386 1805 1
+1386 1842 1
+1386 1848 1
+1386 1858 1
+1386 1893 1
+1386 1901 1
+1386 1903 1
+1386 1927 1
+1386 1953 1
+1386 1966 1
+1386 1973 1
+1386 2071 1
+1386 2085 1
+1386 2205 1
+1386 2241 1
+1387 1389 1
+1388 1384 1
+1388 1389 1
+1394 887 1
+1394 960 1
+1394 1167 1
+1394 1390 1
+1394 1437 1
+1394 1464 1
+1394 1472 1
+1394 1496 1
+1394 1758 1
+1390 290 1
+1390 417 1
+1390 762 1
+1390 1186 1
+1390 1211 1
+1390 1297 1
+1390 1377 1
+1390 1394 1
+1390 1420 1
+1390 1679 1
+1390 1705 1
+1390 1992 1
+1390 2151 1
+1390 2174 1
+1390 2264 1
+1390 2297 1
+1390 2322 1
+1390 2323 1
+1390 2325 1
+1390 2599 1
+1390 2654 1
+1390 2665 1
+1390 2707 1
+1390 2721 1
+1390 2844 1
+1390 2880 1
+1390 3009 1
+1390 3018 1
+1390 3020 1
+1390 3099 1
+1390 3516 1
+1390 3755 1
+1391 1394 1
+1392 1394 1
+1392 1525 1
+1393 1394 1
+1393 2575 1
+1393 5263 1
+1393 5484 1
+1395 15 1
+1395 171 1
+1395 204 1
+1395 298 1
+1395 332 1
+1395 403 1
+1395 407 1
+1395 579 1
+1395 587 1
+1395 722 1
+1395 762 1
+1395 763 1
+1395 836 1
+1395 840 1
+1395 861 1
+1395 904 1
+1395 935 1
+1395 946 1
+1395 947 1
+1395 959 1
+1395 975 1
+1395 978 1
+1395 993 1
+1395 1018 1
+1395 1031 1
+1395 1035 1
+1395 1049 1
+1395 1111 1
+1395 1164 1
+1395 1168 1
+1395 1186 1
+1395 1200 1
+1395 1201 1
+1395 1236 1
+1395 1243 1
+1395 1248 1
+1395 1250 1
+1395 1253 1
+1395 1267 1
+1395 1284 1
+1395 1285 1
+1395 1291 1
+1395 1297 1
+1395 1319 1
+1395 1322 1
+1395 1353 1
+1395 1357 1
+1395 1378 1
+1395 1384 1
+1395 1390 1
+1395 1396 1
+1395 1407 1
+1395 1419 1
+1395 1428 1
+1395 1444 1
+1395 1453 1
+1395 1471 1
+1395 1482 1
+1395 1492 1
+1395 1501 1
+1395 1514 1
+1395 1534 1
+1395 1538 1
+1395 1547 1
+1395 1550 1
+1395 1555 1
+1395 1566 1
+1395 1580 1
+1395 1583 1
+1395 1597 1
+1395 1603 1
+1395 1604 1
+1395 1608 1
+1395 1613 1
+1395 1618 1
+1395 1621 1
+1395 1628 1
+1395 1641 1
+1395 1669 1
+1395 1697 1
+1395 1700 1
+1395 1701 1
+1395 1705 1
+1395 1714 1
+1395 1723 1
+1395 1729 1
+1395 1730 1
+1395 1734 1
+1395 1754 1
+1395 1781 1
+1395 1792 1
+1395 1798 1
+1395 1811 1
+1395 1816 1
+1395 1836 1
+1395 1842 1
+1395 1847 1
+1395 1848 1
+1395 1849 1
+1395 1858 1
+1395 1859 1
+1395 1880 1
+1395 1901 1
+1395 1903 1
+1395 1927 1
+1395 1964 1
+1395 1965 1
+1395 1966 1
+1395 1969 1
+1395 1973 1
+1395 1979 1
+1395 1983 1
+1395 1985 1
+1395 1987 1
+1395 1992 1
+1395 1997 1
+1395 2062 1
+1395 2066 1
+1395 2071 1
+1395 2072 1
+1395 2076 1
+1395 2085 1
+1395 2097 1
+1395 2106 1
+1395 2109 1
+1395 2114 1
+1395 2117 1
+1395 2120 1
+1395 2137 1
+1395 2145 1
+1395 2151 1
+1395 2168 1
+1395 2174 1
+1395 2178 1
+1395 2181 1
+1395 2193 1
+1395 2202 1
+1395 2225 1
+1395 2240 1
+1395 2241 1
+1395 2246 1
+1395 2251 1
+1395 2264 1
+1395 2297 1
+1395 2322 1
+1395 2328 1
+1395 2329 1
+1395 2333 1
+1395 2341 1
+1395 2356 1
+1395 2385 1
+1395 2397 1
+1395 2400 1
+1395 2410 1
+1395 2435 1
+1395 2456 1
+1395 2516 1
+1395 2547 1
+1395 2560 1
+1395 2576 1
+1395 2579 1
+1395 2625 1
+1395 2667 1
+1395 2685 1
+1395 2686 1
+1395 2697 1
+1395 2707 1
+1395 2760 1
+1395 2763 1
+1395 2794 1
+1395 2805 1
+1395 2830 1
+1395 2834 1
+1395 2856 1
+1395 2955 1
+1395 2963 1
+1395 3026 1
+1395 3029 1
+1395 3033 1
+1395 3059 1
+1395 3136 1
+1395 3150 1
+1395 3192 1
+1395 3265 1
+1395 3404 1
+1395 3892 1
+1395 3970 1
+1395 4110 1
+1395 4117 1
+1395 4261 1
+1395 4263 1
+1395 4600 1
+1395 4706 1
+1395 5445 1
+1395 6227 1
+1395 6229 1
+1395 6790 1
+1395 7649 1
+1395 8293 1
+1397 1402 1
+1398 1402 1
+1399 1402 1
+1400 1402 1
+1400 1633 1
+1400 1849 1
+1401 1402 1
+1401 5103 1
+1401 6347 1
+1403 1199 1
+1403 1412 1
+1403 2079 1
+1404 1412 1
+1405 1412 1
+1411 1412 1
+1406 1411 1
+1406 1412 1
+1407 993 1
+1407 1412 1
+1407 1772 1
+1408 1412 1
+1409 1412 1
+1410 1412 1
+1416 1127 1
+1416 1384 1
+1416 1633 1
+1416 2109 1
+1416 2307 1
+1416 2426 1
+1416 2576 1
+1416 2700 1
+1416 3020 1
+1416 3030 1
+1416 3140 1
+1416 3309 1
+1416 5384 1
+1420 761 1
+1420 1322 1
+1420 1525 1
+1420 1587 1
+1420 1633 1
+1420 1638 1
+1420 1654 1
+1420 1752 1
+1420 1780 1
+1420 2151 1
+1420 2165 1
+1420 2211 1
+1419 350 1
+1419 1049 1
+1419 1111 1
+1419 1291 1
+1419 1323 1
+1419 1384 1
+1419 1420 1
+1419 1521 1
+1419 1564 1
+1419 1992 1
+1419 2114 1
+1419 2157 1
+1419 2256 1
+1419 2277 1
+1419 2294 1
+1419 2297 1
+1419 2323 1
+1419 2338 1
+1419 2366 1
+1419 2576 1
+1419 2617 1
+1419 2623 1
+1419 2657 1
+1419 2665 1
+1419 2669 1
+1419 2670 1
+1419 2685 1
+1419 2720 1
+1419 2736 1
+1419 2815 1
+1419 3029 1
+1419 3056 1
+1419 3253 1
+1419 3408 1
+1419 3473 1
+1419 3489 1
+1419 3516 1
+1419 3548 1
+1419 3807 1
+1419 5732 1
+1419 8293 1
+1421 1411 1
+1421 1425 1
+1422 1425 1
+1423 826 1
+1423 960 1
+1423 1425 1
+1423 1569 1
+1423 1573 1
+1423 1648 1
+1423 1864 1
+1423 2843 1
+1424 826 1
+1424 871 1
+1424 887 1
+1424 907 1
+1424 1164 1
+1424 1167 1
+1424 1201 1
+1424 1234 1
+1424 1236 1
+1424 1291 1
+1424 1297 1
+1424 1357 1
+1424 1377 1
+1424 1416 1
+1424 1425 1
+1424 1428 1
+1424 1464 1
+1424 1478 1
+1424 1482 1
+1424 1484 1
+1424 1485 1
+1424 1549 1
+1424 1556 1
+1424 1563 1
+1424 1593 1
+1424 1595 1
+1424 1600 1
+1424 1603 1
+1424 1608 1
+1424 1618 1
+1424 1622 1
+1424 1792 1
+1424 1814 1
+1424 1919 1
+1424 1927 1
+1424 1966 1
+1424 1973 1
+1424 2073 1
+1424 2225 1
+1424 2251 1
+1424 2356 1
+1424 2371 1
+1424 2411 1
+1424 2501 1
+1424 2625 1
+1424 2819 1
+1424 3117 1
+1424 3126 1
+1424 3130 1
+1424 3155 1
+1424 3243 1
+1424 3453 1
+1426 1203 1
+1427 1203 1
+1427 1307 1
+1428 64 1
+1428 290 1
+1428 298 1
+1428 415 1
+1428 506 1
+1428 559 1
+1428 579 1
+1428 665 1
+1428 765 1
+1428 836 1
+1428 873 1
+1428 887 1
+1428 904 1
+1428 908 1
+1428 935 1
+1428 937 1
+1428 975 1
+1428 993 1
+1428 1000 1
+1428 1034 1
+1428 1103 1
+1428 1111 1
+1428 1124 1
+1428 1137 1
+1428 1151 1
+1428 1157 1
+1428 1164 1
+1428 1199 1
+1428 1200 1
+1428 1203 1
+1428 1211 1
+1428 1248 1
+1428 1279 1
+1428 1284 1
+1428 1291 1
+1428 1297 1
+1428 1319 1
+1428 1322 1
+1428 1326 1
+1428 1357 1
+1428 1374 1
+1428 1378 1
+1428 1390 1
+1428 1407 1
+1428 1444 1
+1428 1471 1
+1428 1482 1
+1428 1489 1
+1428 1496 1
+1428 1514 1
+1428 1520 1
+1428 1521 1
+1428 1534 1
+1428 1549 1
+1428 1555 1
+1428 1566 1
+1428 1583 1
+1428 1585 1
+1428 1613 1
+1428 1619 1
+1428 1622 1
+1428 1628 1
+1428 1629 1
+1428 1633 1
+1428 1636 1
+1428 1648 1
+1428 1649 1
+1428 1654 1
+1428 1661 1
+1428 1662 1
+1428 1672 1
+1428 1679 1
+1428 1680 1
+1428 1697 1
+1428 1701 1
+1428 1714 1
+1428 1717 1
+1428 1726 1
+1428 1734 1
+1428 1746 1
+1428 1747 1
+1428 1752 1
+1428 1754 1
+1428 1757 1
+1428 1758 1
+1428 1772 1
+1428 1774 1
+1428 1781 1
+1428 1787 1
+1428 1788 1
+1428 1791 1
+1428 1793 1
+1428 1798 1
+1428 1802 1
+1428 1805 1
+1428 1811 1
+1428 1816 1
+1428 1848 1
+1428 1849 1
+1428 1858 1
+1428 1859 1
+1428 1880 1
+1428 1893 1
+1428 1901 1
+1428 1903 1
+1428 1919 1
+1428 1927 1
+1428 1956 1
+1428 1963 1
+1428 1965 1
+1428 1966 1
+1428 1969 1
+1428 1973 1
+1428 1979 1
+1428 1983 1
+1428 1985 1
+1428 1987 1
+1428 2004 1
+1428 2007 1
+1428 2060 1
+1428 2066 1
+1428 2073 1
+1428 2085 1
+1428 2091 1
+1428 2095 1
+1428 2106 1
+1428 2114 1
+1428 2119 1
+1428 2121 1
+1428 2137 1
+1428 2151 1
+1428 2165 1
+1428 2168 1
+1428 2202 1
+1428 2210 1
+1428 2211 1
+1428 2252 1
+1428 2256 1
+1428 2276 1
+1428 2290 1
+1428 2324 1
+1428 2328 1
+1428 2333 1
+1428 2411 1
+1428 2499 1
+1428 2506 1
+1428 2510 1
+1428 2550 1
+1428 2593 1
+1428 2617 1
+1428 2625 1
+1428 2629 1
+1428 2679 1
+1428 2685 1
+1428 2693 1
+1428 2805 1
+1428 2859 1
+1428 2871 1
+1428 2932 1
+1428 2958 1
+1428 2973 1
+1428 3005 1
+1428 3021 1
+1428 3033 1
+1428 3080 1
+1428 3104 1
+1428 3117 1
+1428 3136 1
+1428 3192 1
+1428 3258 1
+1428 3717 1
+1428 3811 1
+1428 3835 1
+1428 3843 1
+1428 3970 1
+1428 4055 1
+1428 4179 1
+1428 4349 1
+1428 4706 1
+1428 4875 1
+1428 5002 1
+1428 7005 1
+1428 8290 1
+1429 963 1
+1429 1203 1
+1429 1319 1
+1430 1203 1
+1430 1307 1
+1431 1203 1
+1433 1428 1
+1434 1435 1
+1434 1439 1
+1436 963 1
+1184 56 1
+1184 72 1
+1184 204 1
+1184 214 1
+1184 403 1
+1184 765 1
+1184 963 1
+1184 1018 1
+1184 1166 1
+1184 1167 1
+1184 1186 1
+1184 1211 1
+1184 1284 1
+1184 1319 1
+1184 1357 1
+1184 1374 1
+1184 1496 1
+1184 1497 1
+1184 1538 1
+1184 1564 1
+1184 1585 1
+1184 1705 1
+1184 1718 1
+1184 1808 1
+1184 1835 1
+1184 1842 1
+1184 1855 1
+1184 1956 1
+1184 1984 1
+1184 2053 1
+1184 2066 1
+1184 2120 1
+1184 2145 1
+1184 2151 1
+1184 2157 1
+1184 2322 1
+1184 2340 1
+1184 2375 1
+1184 2411 1
+1184 2504 1
+1184 2517 1
+1184 2599 1
+1184 2643 1
+1184 2777 1
+1184 2781 1
+1184 2787 1
+1184 2797 1
+1184 2801 1
+1184 2811 1
+1184 2834 1
+1184 2877 1
+1184 2922 1
+1184 2926 1
+1184 2963 1
+1184 3034 1
+1184 3309 1
+1184 3352 1
+1184 3443 1
+1184 3453 1
+1184 3455 1
+1184 3635 1
+1184 4011 1
+1184 4037 1
+1184 4040 1
+1184 4212 1
+1184 4261 1
+1184 4613 1
+1184 4631 1
+1184 4648 1
+1184 4661 1
+1184 4719 1
+1184 4735 1
+1184 4796 1
+1184 4797 1
+1184 4809 1
+1184 5412 1
+1184 6098 1
+1184 8290 1
+1184 8292 1
+1438 1326 1
+1440 978 1
+1439 928 1
+1439 978 1
+1439 1234 1
+1439 1236 1
+1439 1319 1
+1439 1484 1
+1439 1518 1
+1439 1538 1
+1439 1814 1
+1441 407 1
+1441 761 1
+1441 871 1
+1441 904 1
+1441 937 1
+1441 946 1
+1441 978 1
+1441 993 1
+1441 1031 1
+1441 1103 1
+1441 1186 1
+1441 1199 1
+1441 1201 1
+1441 1253 1
+1441 1261 1
+1441 1297 1
+1441 1428 1
+1441 1486 1
+1441 1514 1
+1441 1525 1
+1441 1610 1
+1441 1612 1
+1441 1638 1
+1441 1662 1
+1441 1752 1
+1441 1757 1
+1441 1768 1
+1441 1780 1
+1441 1783 1
+1441 1787 1
+1441 1991 1
+1441 2062 1
+1441 2073 1
+1441 2097 1
+1441 2101 1
+1441 2106 1
+1441 2242 1
+1441 2348 1
+1441 2397 1
+1441 8290 1
+1441 8291 1
+1446 1442 1
+1446 1444 1
+1446 3371 1
+1442 64 1
+1442 314 1
+1442 813 1
+1442 993 1
+1442 1000 1
+1442 1234 1
+1442 1297 1
+1442 1319 1
+1442 1428 1
+1442 1444 1
+1442 1446 1
+1442 1487 1
+1442 1496 1
+1442 1525 1
+1442 1538 1
+1442 1555 1
+1442 1774 1
+1442 1780 1
+1442 1787 1
+1442 1864 1
+1443 971 1
+1443 1319 1
+1443 1446 1
+1444 1442 1
+1444 1446 1
+1445 1446 1
+1447 1234 1
+1447 1428 1
+1447 1439 1
+1447 1490 1
+1447 1593 1
+1447 1618 1
+1447 1641 1
+1448 1319 1
+1449 1319 1
+1450 1319 1
+1451 1319 1
+1451 1322 1
+1451 1618 1
+1452 1453 1
+1454 1464 1
+1455 1464 1
+1456 1464 1
+1457 813 1
+1457 1464 1
+1457 2371 1
+1457 2696 1
+1457 3748 1
+1458 1464 1
+1459 1464 1
+1460 1464 1
+1461 1464 1
+1462 56 1
+1462 204 1
+1462 230 1
+1462 771 1
+1462 960 1
+1462 1012 1
+1462 1165 1
+1462 1186 1
+1462 1261 1
+1462 1377 1
+1462 1411 1
+1462 1428 1
+1462 1464 1
+1462 1497 1
+1462 1549 1
+1462 1569 1
+1462 1633 1
+1462 1701 1
+1462 1717 1
+1462 1842 1
+1462 1849 1
+1462 1864 1
+1462 1919 1
+1462 1920 1
+1462 2066 1
+1462 2128 1
+1462 2165 1
+1462 2285 1
+1462 2328 1
+1462 2398 1
+1462 2490 1
+1462 2508 1
+1462 2535 1
+1462 2544 1
+1462 2625 1
+1462 2643 1
+1462 2809 1
+1462 3456 1
+1462 4233 1
+1462 4247 1
+1462 5412 1
+1462 5449 1
+1462 5780 1
+1462 5828 1
+1462 5872 1
+1462 5963 1
+1462 5994 1
+1462 8293 1
+1463 403 1
+1463 762 1
+1463 765 1
+1463 1035 1
+1463 1279 1
+1463 1284 1
+1463 1464 1
+1463 1484 1
+1463 1596 1
+1463 1653 1
+1463 1808 1
+1463 1893 1
+1463 1992 1
+1463 2264 1
+1463 2542 1
+1463 2565 1
+1463 2585 1
+1463 2794 1
+1463 2963 1
+1463 3136 1
+1463 3144 1
+1463 3892 1
+1463 4219 1
+1463 4453 1
+1463 4944 1
+1463 5822 1
+1465 214 1
+1465 1049 1
+1465 1186 1
+1465 1357 1
+1465 1798 1
+1465 2323 1
+1465 2508 1
+1465 2542 1
+1468 290 1
+1468 346 1
+1468 762 1
+1468 1201 1
+1468 1385 1
+1468 1471 1
+1468 1476 1
+1468 2264 1
+1468 2397 1
+1468 2456 1
+1468 2646 1
+1468 3089 1
+1468 3645 1
+1468 4103 1
+1468 4212 1
+1468 4424 1
+1468 4796 1
+1468 4808 1
+1468 4814 1
+1468 4827 1
+1466 407 1
+1466 960 1
+1466 1055 1
+1466 1211 1
+1466 1319 1
+1466 1377 1
+1466 1428 1
+1466 1468 1
+1466 1476 1
+1466 1538 1
+1466 1593 1
+1466 1597 1
+1466 1633 1
+1466 1701 1
+1466 1718 1
+1466 2073 1
+1466 2264 1
+1466 2328 1
+1466 2329 1
+1466 2669 1
+1466 2764 1
+1466 3089 1
+1466 4247 1
+1466 4964 1
+1467 971 1
+1467 1230 1
+1467 1261 1
+1467 1441 1
+1467 1468 1
+1467 1497 1
+1467 2516 1
+1467 3664 1
+1467 4964 1
+1467 5144 1
+1467 5204 1
+1469 290 1
+1469 971 1
+1469 1603 1
+1469 1608 1
+1469 1672 1
+1469 3171 1
+1469 3755 1
+1470 15 1
+1470 56 1
+1470 72 1
+1470 290 1
+1470 737 1
+1470 762 1
+1470 871 1
+1470 887 1
+1470 904 1
+1470 946 1
+1470 959 1
+1470 971 1
+1470 974 1
+1470 1151 1
+1470 1164 1
+1470 1166 1
+1470 1167 1
+1470 1211 1
+1470 1234 1
+1470 1243 1
+1470 1247 1
+1470 1261 1
+1470 1297 1
+1470 1310 1
+1470 1319 1
+1470 1374 1
+1470 1385 1
+1470 1428 1
+1470 1471 1
+1470 1476 1
+1470 1482 1
+1470 1484 1
+1470 1487 1
+1470 1492 1
+1470 1496 1
+1470 1501 1
+1470 1555 1
+1470 1585 1
+1470 1603 1
+1470 1622 1
+1470 1641 1
+1470 1658 1
+1470 1661 1
+1470 1700 1
+1470 1701 1
+1470 1744 1
+1470 1774 1
+1470 1799 1
+1470 1816 1
+1470 1836 1
+1470 1857 1
+1470 1893 1
+1470 1918 1
+1470 1956 1
+1470 1966 1
+1470 1969 1
+1470 1977 1
+1470 2135 1
+1470 2144 1
+1470 2209 1
+1470 2252 1
+1470 2328 1
+1470 2354 1
+1470 2364 1
+1470 2381 1
+1470 2398 1
+1470 2411 1
+1470 2535 1
+1470 2576 1
+1470 2579 1
+1470 2592 1
+1470 2620 1
+1470 2625 1
+1470 2653 1
+1470 2662 1
+1470 2747 1
+1470 2768 1
+1470 2775 1
+1470 2790 1
+1470 2877 1
+1470 2923 1
+1470 3002 1
+1470 3005 1
+1470 3010 1
+1470 3089 1
+1470 3117 1
+1470 3130 1
+1470 3253 1
+1470 3276 1
+1470 3285 1
+1470 3346 1
+1470 3376 1
+1470 3393 1
+1470 3452 1
+1470 3456 1
+1470 3458 1
+1470 3473 1
+1470 3479 1
+1470 3498 1
+1470 3516 1
+1470 3537 1
+1470 3580 1
+1470 3587 1
+1470 3607 1
+1470 3614 1
+1470 3813 1
+1470 3897 1
+1470 3910 1
+1470 4013 1
+1470 4099 1
+1470 4124 1
+1470 4191 1
+1470 4297 1
+1470 4335 1
+1470 4400 1
+1470 4645 1
+1470 4687 1
+1470 4712 1
+1470 4735 1
+1470 4792 1
+1470 4795 1
+1470 4797 1
+1470 4983 1
+1470 5055 1
+1470 5130 1
+1470 5204 1
+1470 5210 1
+1470 5412 1
+1470 5439 1
+1470 5449 1
+1470 5527 1
+1470 5626 1
+1470 5706 1
+1470 5714 1
+1470 5798 1
+1470 6004 1
+1470 6006 1
+1470 6156 1
+1470 6229 1
+1470 6246 1
+1470 6251 1
+1470 6262 1
+1470 6306 1
+1470 6327 1
+1470 6328 1
+1470 6334 1
+1470 6337 1
+1470 6417 1
+1470 6432 1
+1470 6458 1
+1470 6474 1
+1470 6552 1
+1470 7092 1
+1470 7553 1
+1470 8292 1
+1470 8295 1
+1471 56 1
+1471 204 1
+1471 214 1
+1471 425 1
+1471 579 1
+1471 762 1
+1471 861 1
+1471 871 1
+1471 904 1
+1471 907 1
+1471 948 1
+1471 960 1
+1471 971 1
+1471 1026 1
+1471 1034 1
+1471 1167 1
+1471 1199 1
+1471 1211 1
+1471 1234 1
+1471 1248 1
+1471 1253 1
+1471 1279 1
+1471 1297 1
+1471 1322 1
+1471 1489 1
+1471 1490 1
+1471 1501 1
+1471 1514 1
+1471 1532 1
+1471 1556 1
+1471 1581 1
+1471 1603 1
+1471 1612 1
+1471 1628 1
+1471 1636 1
+1471 1641 1
+1471 1661 1
+1471 1672 1
+1471 1701 1
+1471 1726 1
+1471 1752 1
+1471 1758 1
+1471 1768 1
+1471 1880 1
+1471 1884 1
+1471 1956 1
+1471 2072 1
+1471 2160 1
+1471 2499 1
+1471 2535 1
+1471 3180 1
+1471 3238 1
+1471 3334 1
+1471 3456 1
+1471 3459 1
+1471 4037 1
+1471 4201 1
+1471 4263 1
+1471 4536 1
+1471 5012 1
+1471 5022 1
+1471 5079 1
+1471 5246 1
+1471 5596 1
+1471 5697 1
+1471 5897 1
+1471 5963 1
+1471 6272 1
+1471 6299 1
+1471 6720 1
+1471 6765 1
+1471 7855 1
+1472 907 1
+1473 204 1
+1473 372 1
+1473 403 1
+1473 425 1
+1473 579 1
+1473 665 1
+1473 763 1
+1473 856 1
+1473 907 1
+1473 908 1
+1473 913 1
+1473 960 1
+1473 993 1
+1473 1026 1
+1473 1111 1
+1473 1164 1
+1473 1166 1
+1473 1211 1
+1473 1279 1
+1473 1284 1
+1473 1357 1
+1473 1374 1
+1473 1419 1
+1473 1428 1
+1473 1487 1
+1473 1608 1
+1473 1646 1
+1473 1679 1
+1473 1688 1
+1473 1692 1
+1473 1697 1
+1473 1730 1
+1473 1747 1
+1473 1754 1
+1473 1780 1
+1473 1783 1
+1473 1793 1
+1473 1805 1
+1473 1836 1
+1473 1842 1
+1473 1855 1
+1473 1859 1
+1473 1880 1
+1473 1893 1
+1473 1919 1
+1473 1953 1
+1473 1963 1
+1473 1979 1
+1473 2004 1
+1473 2007 1
+1473 2060 1
+1473 2097 1
+1473 2102 1
+1473 2174 1
+1473 2225 1
+1473 2289 1
+1473 2375 1
+1473 2475 1
+1473 2499 1
+1473 2504 1
+1473 2560 1
+1473 2763 1
+1473 2790 1
+1473 2828 1
+1473 2871 1
+1473 2966 1
+1473 3136 1
+1473 3253 1
+1473 3408 1
+1473 3439 1
+1473 3473 1
+1473 3680 1
+1473 3903 1
+1473 3970 1
+1473 4071 1
+1473 4110 1
+1473 4266 1
+1473 4338 1
+1473 4706 1
+1473 4709 1
+1473 4719 1
+1473 4814 1
+1473 4827 1
+1473 5254 1
+1473 5445 1
+1473 5714 1
+1473 6833 1
+1473 7092 1
+1473 7115 1
+1473 7890 1
+1473 8002 1
+1474 907 1
+1474 2657 1
+1480 372 1
+1480 763 1
+1480 896 1
+1480 993 1
+1480 1000 1
+1480 1103 1
+1480 1165 1
+1480 1230 1
+1480 1253 1
+1480 1284 1
+1480 1407 1
+1480 1484 1
+1480 1492 1
+1480 1514 1
+1480 1534 1
+1480 1585 1
+1480 1622 1
+1480 1628 1
+1480 1633 1
+1480 1658 1
+1480 1700 1
+1480 1717 1
+1480 1758 1
+1480 1772 1
+1480 1780 1
+1480 1788 1
+1480 1791 1
+1480 1798 1
+1480 1802 1
+1480 1805 1
+1480 1811 1
+1480 1816 1
+1480 1842 1
+1480 1849 1
+1480 1859 1
+1480 1893 1
+1480 1901 1
+1480 1908 1
+1480 1979 1
+1480 1987 1
+1480 1992 1
+1480 2128 1
+1480 5614 1
+1480 8290 1
+1481 1484 1
+1482 415 1
+1482 908 1
+1482 1034 1
+1482 1035 1
+1482 1151 1
+1482 1164 1
+1482 1200 1
+1482 1297 1
+1482 1484 1
+1482 1496 1
+1482 1514 1
+1482 1547 1
+1482 1580 1
+1482 1585 1
+1482 1621 1
+1482 1622 1
+1482 1697 1
+1482 1701 1
+1482 1805 1
+1482 1816 1
+1482 1893 1
+1482 1903 1
+1482 1953 1
+1482 1966 1
+1482 1969 1
+1482 2066 1
+1483 290 1
+1483 579 1
+1483 771 1
+1483 813 1
+1483 826 1
+1483 871 1
+1483 887 1
+1483 960 1
+1483 1055 1
+1483 1167 1
+1483 1211 1
+1483 1234 1
+1483 1261 1
+1483 1279 1
+1483 1297 1
+1483 1377 1
+1483 1411 1
+1483 1428 1
+1483 1484 1
+1483 1487 1
+1483 1490 1
+1483 1496 1
+1483 1497 1
+1483 1507 1
+1483 1514 1
+1483 1525 1
+1483 1537 1
+1483 1538 1
+1483 1555 1
+1483 1573 1
+1483 1580 1
+1483 1595 1
+1483 1633 1
+1483 1649 1
+1483 1716 1
+1483 1717 1
+1483 1726 1
+1483 1758 1
+1483 1768 1
+1483 1774 1
+1483 1791 1
+1483 1798 1
+1483 1802 1
+1483 1805 1
+1483 1811 1
+1483 1842 1
+1483 1849 1
+1483 1859 1
+1483 1893 1
+1483 2843 1
+1483 3755 1
+1483 5500 1
+1488 1297 1
+1487 171 1
+1487 230 1
+1487 298 1
+1487 372 1
+1487 407 1
+1487 559 1
+1487 575 1
+1487 579 1
+1487 763 1
+1487 887 1
+1487 904 1
+1487 913 1
+1487 928 1
+1487 935 1
+1487 1034 1
+1487 1124 1
+1487 1165 1
+1487 1168 1
+1487 1199 1
+1487 1201 1
+1487 1211 1
+1487 1248 1
+1487 1253 1
+1487 1279 1
+1487 1297 1
+1487 1319 1
+1487 1322 1
+1487 1428 1
+1487 1442 1
+1487 1471 1
+1487 1489 1
+1487 1501 1
+1487 1520 1
+1487 1525 1
+1487 1534 1
+1487 1549 1
+1487 1610 1
+1487 1618 1
+1487 1619 1
+1487 1622 1
+1487 1629 1
+1487 1633 1
+1487 1638 1
+1487 1641 1
+1487 1648 1
+1487 1654 1
+1487 1658 1
+1487 1661 1
+1487 1662 1
+1487 1669 1
+1487 1672 1
+1487 1679 1
+1487 1689 1
+1487 1692 1
+1487 1701 1
+1487 1707 1
+1487 1718 1
+1487 1726 1
+1487 1732 1
+1487 1746 1
+1487 1747 1
+1487 1752 1
+1487 1757 1
+1487 1816 1
+1487 1836 1
+1487 1847 1
+1487 1855 1
+1487 1857 1
+1487 1858 1
+1487 1893 1
+1487 1901 1
+1487 1903 1
+1487 1908 1
+1487 1953 1
+1487 1969 1
+1487 1973 1
+1487 1979 1
+1487 1987 1
+1487 1991 1
+1487 2069 1
+1487 2073 1
+1487 2325 1
+1487 2338 1
+1487 2356 1
+1487 2474 1
+1487 2475 1
+1487 2565 1
+1487 2576 1
+1487 2593 1
+1487 2594 1
+1487 2619 1
+1487 2623 1
+1487 2625 1
+1487 2638 1
+1487 2643 1
+1487 2651 1
+1487 2665 1
+1487 2669 1
+1487 2700 1
+1487 2912 1
+1487 3020 1
+1487 3021 1
+1487 3030 1
+1487 3130 1
+1487 3265 1
+1487 3307 1
+1487 3338 1
+1487 3348 1
+1487 3351 1
+1487 3371 1
+1487 3376 1
+1487 3408 1
+1487 3435 1
+1487 3473 1
+1487 3489 1
+1487 8290 1
+1487 8293 1
+1489 204 1
+1489 407 1
+1489 579 1
+1489 797 1
+1489 993 1
+1489 1103 1
+1489 1140 1
+1489 1164 1
+1489 1167 1
+1489 1201 1
+1489 1234 1
+1489 1236 1
+1489 1253 1
+1489 1279 1
+1489 1297 1
+1489 1307 1
+1489 1374 1
+1489 1428 1
+1489 1482 1
+1489 1487 1
+1489 1490 1
+1489 1514 1
+1489 1520 1
+1489 1538 1
+1489 1555 1
+1489 1563 1
+1489 1573 1
+1489 1583 1
+1489 1593 1
+1489 1596 1
+1489 1600 1
+1489 1608 1
+1489 1621 1
+1489 1622 1
+1489 1653 1
+1489 1657 1
+1489 1662 1
+1489 1680 1
+1489 1700 1
+1489 1701 1
+1489 1768 1
+1489 1772 1
+1489 1816 1
+1489 1847 1
+1489 1855 1
+1489 1857 1
+1489 1893 1
+1489 1953 1
+1489 1969 1
+1489 1984 1
+1489 1997 1
+1489 2007 1
+1489 2055 1
+1489 2060 1
+1489 2062 1
+1489 2066 1
+1489 2182 1
+1489 2256 1
+1489 2281 1
+1489 2322 1
+1489 2345 1
+1489 2516 1
+1489 2570 1
+1489 8291 1
+1492 72 1
+1492 171 1
+1492 230 1
+1492 298 1
+1492 575 1
+1492 579 1
+1492 691 1
+1492 763 1
+1492 764 1
+1492 826 1
+1492 861 1
+1492 871 1
+1492 887 1
+1492 935 1
+1492 937 1
+1492 948 1
+1492 993 1
+1492 1000 1
+1492 1022 1
+1492 1032 1
+1492 1034 1
+1492 1035 1
+1492 1055 1
+1492 1103 1
+1492 1151 1
+1492 1164 1
+1492 1167 1
+1492 1168 1
+1492 1199 1
+1492 1200 1
+1492 1201 1
+1492 1211 1
+1492 1230 1
+1492 1236 1
+1492 1253 1
+1492 1279 1
+1492 1284 1
+1492 1297 1
+1492 1319 1
+1492 1377 1
+1492 1407 1
+1492 1428 1
+1492 1487 1
+1492 1489 1
+1492 1496 1
+1492 1506 1
+1492 1518 1
+1492 1520 1
+1492 1525 1
+1492 1534 1
+1492 1537 1
+1492 1538 1
+1492 1550 1
+1492 1555 1
+1492 1580 1
+1492 1585 1
+1492 1587 1
+1492 1593 1
+1492 1595 1
+1492 1597 1
+1492 1600 1
+1492 1603 1
+1492 1618 1
+1492 1619 1
+1492 1621 1
+1492 1622 1
+1492 1633 1
+1492 1641 1
+1492 1649 1
+1492 1652 1
+1492 1654 1
+1492 1658 1
+1492 1661 1
+1492 1689 1
+1492 1692 1
+1492 1700 1
+1492 1701 1
+1492 1726 1
+1492 1734 1
+1492 1747 1
+1492 1754 1
+1492 1772 1
+1492 1774 1
+1492 1783 1
+1492 1814 1
+1492 1816 1
+1492 1847 1
+1492 1858 1
+1492 1880 1
+1492 1888 1
+1492 1893 1
+1492 1901 1
+1492 1903 1
+1492 1908 1
+1492 1918 1
+1492 1919 1
+1492 1927 1
+1492 1966 1
+1492 1969 1
+1492 1987 1
+1492 1992 1
+1492 1997 1
+1492 2066 1
+1492 2073 1
+1492 2106 1
+1492 2128 1
+1492 2178 1
+1492 2225 1
+1492 2251 1
+1492 2256 1
+1492 2322 1
+1492 2328 1
+1492 2341 1
+1492 2384 1
+1492 2411 1
+1492 2474 1
+1492 2504 1
+1492 2585 1
+1492 2593 1
+1492 2595 1
+1492 2612 1
+1492 2618 1
+1492 2619 1
+1492 2653 1
+1492 2700 1
+1492 2713 1
+1492 2746 1
+1492 2830 1
+1492 2859 1
+1492 2912 1
+1492 2958 1
+1492 2981 1
+1492 3005 1
+1492 3020 1
+1492 3033 1
+1492 3117 1
+1492 3253 1
+1492 3258 1
+1492 3307 1
+1492 3338 1
+1492 3537 1
+1492 3568 1
+1492 3645 1
+1492 3897 1
+1492 4021 1
+1492 4037 1
+1492 4040 1
+1492 4043 1
+1492 4162 1
+1492 4422 1
+1492 4715 1
+1492 4735 1
+1492 4811 1
+1492 4964 1
+1492 5412 1
+1492 5844 1
+1492 8290 1
+1493 1167 1
+1494 1167 1
+1495 1164 1
+1495 1167 1
+1495 1201 1
+1495 1482 1
+1495 1514 1
+1495 1734 1
+1495 1816 1
+1495 1893 1
+1495 1973 1
+1495 2651 1
+1496 15 1
+1496 230 1
+1496 285 1
+1496 417 1
+1496 506 1
+1496 579 1
+1496 633 1
+1496 722 1
+1496 762 1
+1496 763 1
+1496 764 1
+1496 765 1
+1496 825 1
+1496 887 1
+1496 908 1
+1496 913 1
+1496 946 1
+1496 993 1
+1496 1000 1
+1496 1035 1
+1496 1097 1
+1496 1103 1
+1496 1151 1
+1496 1164 1
+1496 1166 1
+1496 1167 1
+1496 1186 1
+1496 1199 1
+1496 1200 1
+1496 1201 1
+1496 1211 1
+1496 1230 1
+1496 1248 1
+1496 1253 1
+1496 1261 1
+1496 1267 1
+1496 1279 1
+1496 1297 1
+1496 1307 1
+1496 1319 1
+1496 1322 1
+1496 1353 1
+1496 1357 1
+1496 1360 1
+1496 1377 1
+1496 1393 1
+1496 1416 1
+1496 1428 1
+1496 1482 1
+1496 1487 1
+1496 1492 1
+1496 1501 1
+1496 1514 1
+1496 1521 1
+1496 1555 1
+1496 1571 1
+1496 1585 1
+1496 1593 1
+1496 1603 1
+1496 1610 1
+1496 1618 1
+1496 1621 1
+1496 1622 1
+1496 1633 1
+1496 1646 1
+1496 1648 1
+1496 1653 1
+1496 1654 1
+1496 1658 1
+1496 1697 1
+1496 1700 1
+1496 1701 1
+1496 1718 1
+1496 1726 1
+1496 1734 1
+1496 1754 1
+1496 1772 1
+1496 1774 1
+1496 1780 1
+1496 1783 1
+1496 1791 1
+1496 1798 1
+1496 1808 1
+1496 1814 1
+1496 1816 1
+1496 1836 1
+1496 1842 1
+1496 1847 1
+1496 1849 1
+1496 1859 1
+1496 1880 1
+1496 1884 1
+1496 1893 1
+1496 1903 1
+1496 1908 1
+1496 1919 1
+1496 1953 1
+1496 1956 1
+1496 1966 1
+1496 1969 1
+1496 1973 1
+1496 1992 1
+1496 2001 1
+1496 2066 1
+1496 2071 1
+1496 2073 1
+1496 2114 1
+1496 2116 1
+1496 2117 1
+1496 2120 1
+1496 2121 1
+1496 2145 1
+1496 2211 1
+1496 2225 1
+1496 2241 1
+1496 2251 1
+1496 2256 1
+1496 2297 1
+1496 2324 1
+1496 2328 1
+1496 2381 1
+1496 2398 1
+1496 2410 1
+1496 2474 1
+1496 2504 1
+1496 2506 1
+1496 2510 1
+1496 2579 1
+1496 2585 1
+1496 2593 1
+1496 2594 1
+1496 2595 1
+1496 2597 1
+1496 2605 1
+1496 2618 1
+1496 2625 1
+1496 2646 1
+1496 2657 1
+1496 2660 1
+1496 2667 1
+1496 2685 1
+1496 2708 1
+1496 2713 1
+1496 2727 1
+1496 2746 1
+1496 2747 1
+1496 2794 1
+1496 2819 1
+1496 2856 1
+1496 2871 1
+1496 2877 1
+1496 2900 1
+1496 2923 1
+1496 2981 1
+1496 2996 1
+1496 3005 1
+1496 3007 1
+1496 3033 1
+1496 3136 1
+1496 3243 1
+1496 3251 1
+1496 3253 1
+1496 3258 1
+1496 3276 1
+1496 3371 1
+1496 3408 1
+1496 3456 1
+1496 3473 1
+1496 3489 1
+1496 3562 1
+1496 3586 1
+1496 3772 1
+1496 3830 1
+1496 3892 1
+1496 4040 1
+1496 4071 1
+1496 4099 1
+1496 4191 1
+1496 4261 1
+1496 4310 1
+1496 4400 1
+1496 4402 1
+1496 4411 1
+1496 4463 1
+1496 4709 1
+1496 4735 1
+1496 4875 1
+1496 5055 1
+1496 5106 1
+1496 5178 1
+1496 5210 1
+1496 5239 1
+1496 5288 1
+1496 5412 1
+1496 5452 1
+1496 5459 1
+1496 5484 1
+1496 5732 1
+1496 5863 1
+1496 5947 1
+1496 6458 1
+1496 6553 1
+1496 6914 1
+1496 7005 1
+1496 7632 1
+1496 7839 1
+1496 7890 1
+1496 8290 1
+1496 8291 1
+1496 8294 1
+1497 15 1
+1497 346 1
+1497 771 1
+1497 959 1
+1497 1167 1
+1497 1201 1
+1497 1234 1
+1497 1297 1
+1497 1322 1
+1497 1531 1
+1497 1538 1
+1497 1550 1
+1497 1556 1
+1497 1573 1
+1497 1580 1
+1497 1593 1
+1497 1956 1
+1497 2145 1
+1497 2151 1
+1497 2157 1
+1497 2297 1
+1497 2763 1
+1497 3020 1
+1497 4735 1
+1497 4875 1
+1497 5254 1
+1497 6229 1
+1497 8292 1
+1498 762 1
+1498 1167 1
+1498 3238 1
+1498 3456 1
+1498 4191 1
+1498 7651 1
+1499 56 1
+1499 1167 1
+1499 1497 1
+1499 1547 1
+1499 1573 1
+1499 1580 1
+1499 1597 1
+1499 1612 1
+1499 1658 1
+1499 1774 1
+1499 1956 1
+1499 2794 1
+1500 56 1
+1500 204 1
+1500 214 1
+1500 506 1
+1500 608 1
+1500 633 1
+1500 737 1
+1500 859 1
+1500 960 1
+1500 1097 1
+1500 1151 1
+1500 1167 1
+1500 1199 1
+1500 1297 1
+1500 1315 1
+1500 1497 1
+1500 1538 1
+1500 1569 1
+1500 1612 1
+1500 1717 1
+1500 1718 1
+1500 1956 1
+1500 2134 1
+1500 2174 1
+1500 2210 1
+1500 2240 1
+1500 2256 1
+1500 2323 1
+1500 2397 1
+1500 2508 1
+1500 2604 1
+1500 2625 1
+1500 2660 1
+1500 2777 1
+1500 2794 1
+1500 2801 1
+1500 2871 1
+1500 3018 1
+1500 3117 1
+1500 3193 1
+1500 3480 1
+1500 3615 1
+1500 4098 1
+1500 4138 1
+1500 4191 1
+1500 4299 1
+1500 4735 1
+1500 5253 1
+1501 64 1
+1501 407 1
+1501 506 1
+1501 762 1
+1501 871 1
+1501 904 1
+1501 946 1
+1501 993 1
+1501 1000 1
+1501 1103 1
+1501 1167 1
+1501 1261 1
+1501 1322 1
+1501 1437 1
+1501 1471 1
+1501 1496 1
+1501 1514 1
+1501 1564 1
+1501 1633 1
+1501 1687 1
+1501 1772 1
+1501 1787 1
+1501 1788 1
+1501 1793 1
+1501 1811 1
+1501 1861 1
+1501 1864 1
+1501 2225 1
+1501 2290 1
+1501 2397 1
+1501 2550 1
+1501 2651 1
+1501 2662 1
+1501 2951 1
+1501 3089 1
+1501 3117 1
+1501 3140 1
+1501 3171 1
+1506 290 1
+1506 559 1
+1506 771 1
+1506 974 1
+1506 993 1
+1506 1032 1
+1506 1297 1
+1506 1385 1
+1506 1489 1
+1506 1497 1
+1506 1520 1
+1506 1524 1
+1506 1531 1
+1506 1556 1
+1506 1649 1
+1506 1652 1
+1506 1654 1
+1506 1662 1
+1506 1672 1
+1506 1679 1
+1506 1680 1
+1506 1717 1
+1506 1849 1
+1506 1880 1
+1506 2062 1
+1506 2135 1
+1506 2160 1
+1506 2333 1
+1506 2504 1
+1506 2654 1
+1506 2674 1
+1506 2912 1
+1506 3020 1
+1506 3253 1
+1506 3276 1
+1506 3976 1
+1506 4349 1
+1506 4953 1
+1506 5683 1
+1506 6296 1
+1506 8134 1
+1502 1234 1
+1502 1506 1
+1503 1506 1
+1503 1563 1
+1503 1638 1
+1504 1506 1
+1504 1513 1
+1504 1533 1
+1504 1633 1
+1504 2231 1
+1504 2651 1
+1505 935 1
+1505 1506 1
+1505 1717 1
+1505 1893 1
+1507 2062 1
+1507 6576 1
+1511 1377 1
+1510 771 1
+1510 871 1
+1510 960 1
+1510 1032 1
+1510 1234 1
+1510 1377 1
+1510 1441 1
+1510 1497 1
+1510 1513 1
+1510 1518 1
+1510 1524 1
+1510 1531 1
+1510 1538 1
+1510 1556 1
+1510 1563 1
+1510 2843 1
+1512 1513 1
+1515 1441 1
+1516 1441 1
+1517 1441 1
+1519 1032 1
+1520 1018 1
+1520 1032 1
+1520 1253 1
+1521 298 1
+1521 403 1
+1521 579 1
+1521 871 1
+1521 904 1
+1521 937 1
+1521 993 1
+1521 1000 1
+1521 1049 1
+1521 1097 1
+1521 1111 1
+1521 1151 1
+1521 1166 1
+1521 1199 1
+1521 1201 1
+1521 1211 1
+1521 1230 1
+1521 1261 1
+1521 1267 1
+1521 1279 1
+1521 1319 1
+1521 1323 1
+1521 1374 1
+1521 1411 1
+1521 1419 1
+1521 1482 1
+1521 1487 1
+1521 1492 1
+1521 1496 1
+1521 1514 1
+1521 1583 1
+1521 1585 1
+1521 1608 1
+1521 1621 1
+1521 1633 1
+1521 1679 1
+1521 1700 1
+1521 1706 1
+1521 1714 1
+1521 1744 1
+1521 1746 1
+1521 1747 1
+1521 1768 1
+1521 1772 1
+1521 1780 1
+1521 1787 1
+1521 1791 1
+1521 1808 1
+1521 1814 1
+1521 1836 1
+1521 1842 1
+1521 1888 1
+1521 1893 1
+1521 1919 1
+1521 1964 1
+1521 1992 1
+1521 1997 1
+1521 2062 1
+1521 2066 1
+1521 2117 1
+1521 2120 1
+1521 2128 1
+1521 2174 1
+1521 2178 1
+1521 2225 1
+1521 2241 1
+1521 2297 1
+1521 2328 1
+1521 2341 1
+1521 2375 1
+1521 2385 1
+1521 2397 1
+1521 2400 1
+1521 2474 1
+1521 2485 1
+1521 2506 1
+1521 2510 1
+1521 2547 1
+1521 2594 1
+1521 2625 1
+1521 2653 1
+1521 2685 1
+1521 2727 1
+1521 2746 1
+1521 2814 1
+1521 2834 1
+1521 2958 1
+1521 3005 1
+1521 3014 1
+1521 3024 1
+1521 3117 1
+1521 3136 1
+1521 3253 1
+1521 3265 1
+1521 3307 1
+1521 3404 1
+1521 3755 1
+1521 4055 1
+1521 8291 1
+1522 15 1
+1522 290 1
+1522 332 1
+1522 415 1
+1522 465 1
+1522 608 1
+1522 741 1
+1522 762 1
+1522 763 1
+1522 871 1
+1522 947 1
+1522 993 1
+1522 1103 1
+1522 1151 1
+1522 1211 1
+1522 1261 1
+1522 1297 1
+1522 1374 1
+1522 1385 1
+1522 1514 1
+1522 1521 1
+1522 1534 1
+1522 1592 1
+1522 1628 1
+1522 1637 1
+1522 1688 1
+1522 1700 1
+1522 1754 1
+1522 1758 1
+1522 1777 1
+1522 1780 1
+1522 1791 1
+1522 1814 1
+1522 1842 1
+1522 1857 1
+1522 1880 1
+1522 1893 1
+1522 1903 1
+1522 1956 1
+1522 1990 1
+1522 2062 1
+1522 2066 1
+1522 2145 1
+1522 2210 1
+1522 2297 1
+1522 2328 1
+1522 2329 1
+1522 2339 1
+1522 2345 1
+1522 2397 1
+1522 2398 1
+1522 2426 1
+1522 2433 1
+1522 2470 1
+1522 2490 1
+1522 2499 1
+1522 2508 1
+1522 2510 1
+1522 2517 1
+1522 2550 1
+1522 2565 1
+1522 2570 1
+1522 2580 1
+1522 2585 1
+1522 2593 1
+1522 2595 1
+1522 2599 1
+1522 2618 1
+1522 2619 1
+1522 2625 1
+1522 2643 1
+1522 2651 1
+1522 2653 1
+1522 2654 1
+1522 2665 1
+1522 2667 1
+1522 2746 1
+1522 2754 1
+1522 2834 1
+1522 2973 1
+1522 2981 1
+1522 2999 1
+1522 3059 1
+1522 3084 1
+1522 3089 1
+1522 3125 1
+1522 3130 1
+1522 3260 1
+1522 3291 1
+1522 3297 1
+1522 3346 1
+1522 3404 1
+1522 3455 1
+1522 3463 1
+1522 3473 1
+1522 3480 1
+1522 3520 1
+1522 3631 1
+1522 3670 1
+1522 3724 1
+1522 3800 1
+1522 3804 1
+1522 3806 1
+1522 3807 1
+1522 3809 1
+1522 3812 1
+1522 3847 1
+1522 3856 1
+1522 3887 1
+1522 3903 1
+1522 3922 1
+1522 3937 1
+1522 3956 1
+1522 3971 1
+1522 3976 1
+1522 4011 1
+1522 4012 1
+1522 4072 1
+1522 4110 1
+1522 4138 1
+1522 4179 1
+1522 4234 1
+1522 4247 1
+1522 4256 1
+1522 4263 1
+1522 4400 1
+1522 4424 1
+1522 4453 1
+1522 4463 1
+1522 4510 1
+1522 4588 1
+1522 4735 1
+1522 5288 1
+1522 5301 1
+1522 5321 1
+1522 5925 1
+1522 5928 1
+1522 6327 1
+1522 6462 1
+1524 1692 1
+1524 3473 1
+1524 5321 1
+1524 5683 1
+1523 1524 1
+1527 960 1
+1525 298 1
+1525 579 1
+1525 665 1
+1525 763 1
+1525 904 1
+1525 960 1
+1525 1000 1
+1525 1103 1
+1525 1199 1
+1525 1248 1
+1525 1253 1
+1525 1261 1
+1525 1279 1
+1525 1322 1
+1525 1428 1
+1525 1442 1
+1525 1487 1
+1525 1489 1
+1525 1514 1
+1525 1520 1
+1525 1628 1
+1525 1633 1
+1525 1649 1
+1525 1652 1
+1525 1654 1
+1525 1669 1
+1525 1717 1
+1525 1780 1
+1525 1788 1
+1525 1791 1
+1525 1793 1
+1525 1798 1
+1525 1802 1
+1525 1811 1
+1525 3136 1
+1526 904 1
+1526 960 1
+1526 1279 1
+1526 1411 1
+1528 1531 1
+1538 15 1
+1538 298 1
+1538 372 1
+1538 415 1
+1538 506 1
+1538 559 1
+1538 691 1
+1538 904 1
+1538 928 1
+1538 937 1
+1538 1000 1
+1538 1103 1
+1538 1124 1
+1538 1165 1
+1538 1199 1
+1538 1201 1
+1538 1236 1
+1538 1248 1
+1538 1253 1
+1538 1297 1
+1538 1319 1
+1538 1322 1
+1538 1428 1
+1538 1482 1
+1538 1487 1
+1538 1489 1
+1538 1492 1
+1538 1496 1
+1538 1514 1
+1538 1534 1
+1538 1555 1
+1538 1564 1
+1538 1610 1
+1538 1618 1
+1538 1622 1
+1538 1697 1
+1538 1700 1
+1538 1701 1
+1538 1726 1
+1538 1732 1
+1538 1734 1
+1538 1746 1
+1538 1747 1
+1538 1752 1
+1538 1768 1
+1538 1774 1
+1538 1802 1
+1538 1805 1
+1538 1811 1
+1538 1816 1
+1538 1836 1
+1538 1855 1
+1538 1858 1
+1538 1893 1
+1538 1918 1
+1538 1935 1
+1538 1953 1
+1538 1969 1
+1538 1973 1
+1538 2066 1
+1538 2120 1
+1538 2256 1
+1538 2410 1
+1538 2411 1
+1538 2510 1
+1538 2535 1
+1538 2594 1
+1538 2618 1
+1538 2643 1
+1538 2653 1
+1538 2665 1
+1538 2774 1
+1538 2877 1
+1538 3005 1
+1538 3155 1
+1538 3260 1
+1538 3580 1
+1538 3755 1
+1538 4021 1
+1538 4037 1
+1538 8290 1
+1534 230 1
+1534 1538 1
+1535 1538 1
+1535 1604 1
+1536 1538 1
+1537 56 1
+1537 737 1
+1537 762 1
+1537 856 1
+1537 1151 1
+1537 1164 1
+1537 1211 1
+1537 1234 1
+1537 1291 1
+1537 1357 1
+1537 1407 1
+1537 1492 1
+1537 1514 1
+1537 1538 1
+1537 1549 1
+1537 1622 1
+1537 1729 1
+1537 1734 1
+1537 1754 1
+1537 1808 1
+1537 1814 1
+1537 1816 1
+1537 1919 1
+1537 1966 1
+1537 1969 1
+1537 2066 1
+1537 2145 1
+1537 2174 1
+1537 2240 1
+1537 2256 1
+1537 2289 1
+1537 2508 1
+1537 2560 1
+1537 2593 1
+1537 2625 1
+1537 2655 1
+1537 2693 1
+1537 2707 1
+1537 2713 1
+1537 2746 1
+1537 2790 1
+1537 2871 1
+1537 2963 1
+1537 3005 1
+1537 3024 1
+1537 3027 1
+1537 3033 1
+1537 3140 1
+1537 3260 1
+1537 3276 1
+1537 3334 1
+1537 3433 1
+1537 3439 1
+1537 3454 1
+1537 3568 1
+1537 3812 1
+1537 3897 1
+1537 3956 1
+1537 4011 1
+1537 4021 1
+1537 4335 1
+1537 4528 1
+1537 4536 1
+1537 4551 1
+1537 4578 1
+1537 4735 1
+1537 5226 1
+1537 5412 1
+1539 771 1
+1539 6560 1
+1539 7673 1
+1539 7855 1
+1539 7912 1
+1540 771 1
+1541 771 1
+1543 771 1
+1545 771 1
+1546 771 1
+1542 15 1
+1542 332 1
+1542 722 1
+1542 737 1
+1542 762 1
+1542 771 1
+1542 859 1
+1542 873 1
+1542 959 1
+1542 967 1
+1542 993 1
+1542 1035 1
+1542 1103 1
+1542 1111 1
+1542 1159 1
+1542 1185 1
+1542 1234 1
+1542 1319 1
+1542 1353 1
+1542 1385 1
+1542 1473 1
+1542 1492 1
+1542 1549 1
+1542 1565 1
+1542 1608 1
+1542 1628 1
+1542 1648 1
+1542 1700 1
+1542 1783 1
+1542 1798 1
+1542 1799 1
+1542 1823 1
+1542 1833 1
+1542 1836 1
+1542 1842 1
+1542 1855 1
+1542 1859 1
+1542 1893 1
+1542 1919 1
+1542 1920 1
+1542 1972 1
+1542 1997 1
+1542 2071 1
+1542 2129 1
+1542 2193 1
+1542 2240 1
+1542 2276 1
+1542 2333 1
+1542 2348 1
+1542 2354 1
+1542 2364 1
+1542 2384 1
+1542 2385 1
+1542 2423 1
+1542 2507 1
+1542 2516 1
+1542 2595 1
+1542 2646 1
+1542 2654 1
+1542 2658 1
+1542 2689 1
+1542 2746 1
+1542 2822 1
+1542 2871 1
+1542 2909 1
+1542 2940 1
+1542 2973 1
+1542 3007 1
+1542 3014 1
+1542 3015 1
+1542 3026 1
+1542 3027 1
+1542 3089 1
+1542 3092 1
+1542 3238 1
+1542 3291 1
+1542 3293 1
+1542 3310 1
+1542 3321 1
+1542 3334 1
+1542 3381 1
+1542 3417 1
+1542 3443 1
+1542 3456 1
+1542 3460 1
+1542 3463 1
+1542 3498 1
+1542 3537 1
+1542 3554 1
+1542 3586 1
+1542 3634 1
+1542 3645 1
+1542 3776 1
+1542 3803 1
+1542 3809 1
+1542 3873 1
+1542 3892 1
+1542 3897 1
+1542 3910 1
+1542 3967 1
+1542 3976 1
+1542 4011 1
+1542 4012 1
+1542 4037 1
+1542 4043 1
+1542 4124 1
+1542 4127 1
+1542 4191 1
+1542 4233 1
+1542 4247 1
+1542 4297 1
+1542 4310 1
+1542 4338 1
+1542 4422 1
+1542 4448 1
+1542 4483 1
+1542 4485 1
+1542 4527 1
+1542 4534 1
+1542 4547 1
+1542 4578 1
+1542 4587 1
+1542 4613 1
+1542 4645 1
+1542 4646 1
+1542 4661 1
+1542 4666 1
+1542 4712 1
+1542 4715 1
+1542 4717 1
+1542 4748 1
+1542 4781 1
+1542 4828 1
+1542 4846 1
+1542 4899 1
+1542 4981 1
+1542 4994 1
+1542 5002 1
+1542 5061 1
+1542 5072 1
+1542 5079 1
+1542 5092 1
+1542 5103 1
+1542 5115 1
+1542 5123 1
+1542 5140 1
+1542 5144 1
+1542 5155 1
+1542 5178 1
+1542 5200 1
+1542 5226 1
+1542 5239 1
+1542 5262 1
+1542 5301 1
+1542 5308 1
+1542 5323 1
+1542 5327 1
+1542 5335 1
+1542 5341 1
+1542 5404 1
+1542 5415 1
+1542 5437 1
+1542 5479 1
+1542 5482 1
+1542 5511 1
+1542 5524 1
+1542 5527 1
+1542 5543 1
+1542 5545 1
+1542 5563 1
+1542 5624 1
+1542 5697 1
+1542 5714 1
+1542 5739 1
+1542 5743 1
+1542 5760 1
+1542 5780 1
+1542 5798 1
+1542 5799 1
+1542 5800 1
+1542 5850 1
+1542 5886 1
+1542 5891 1
+1542 5925 1
+1542 5928 1
+1542 5933 1
+1542 5947 1
+1542 6009 1
+1542 6029 1
+1542 6059 1
+1542 6083 1
+1542 6096 1
+1542 6097 1
+1542 6098 1
+1542 6123 1
+1542 6124 1
+1542 6166 1
+1542 6227 1
+1542 6229 1
+1542 6241 1
+1542 6243 1
+1542 6246 1
+1542 6261 1
+1542 6328 1
+1542 6417 1
+1542 6447 1
+1542 6481 1
+1542 6496 1
+1542 6505 1
+1542 6528 1
+1542 6555 1
+1542 6570 1
+1542 6576 1
+1542 6589 1
+1542 6594 1
+1542 6595 1
+1542 6624 1
+1542 6634 1
+1542 6832 1
+1542 6914 1
+1542 6955 1
+1542 7012 1
+1542 7021 1
+1542 7052 1
+1542 7074 1
+1542 7115 1
+1542 7279 1
+1542 7301 1
+1542 7381 1
+1542 7414 1
+1542 7449 1
+1542 7478 1
+1542 7649 1
+1542 7662 1
+1542 7691 1
+1542 7757 1
+1542 7763 1
+1542 7795 1
+1542 7809 1
+1542 7855 1
+1542 7862 1
+1542 7927 1
+1542 7946 1
+1542 8290 1
+1552 15 1
+1552 56 1
+1552 285 1
+1552 407 1
+1552 417 1
+1552 761 1
+1552 935 1
+1552 968 1
+1552 993 1
+1552 1012 1
+1552 1014 1
+1552 1049 1
+1552 1239 1
+1552 1284 1
+1552 1285 1
+1552 1291 1
+1552 1297 1
+1552 1411 1
+1552 1482 1
+1552 1489 1
+1552 1497 1
+1552 1534 1
+1552 1549 1
+1552 1566 1
+1552 1628 1
+1552 1633 1
+1552 1646 1
+1552 1700 1
+1552 1707 1
+1552 1717 1
+1552 1734 1
+1552 1783 1
+1552 1788 1
+1552 1808 1
+1552 1836 1
+1552 1842 1
+1552 1849 1
+1552 1858 1
+1552 1880 1
+1552 1893 1
+1552 1908 1
+1552 1956 1
+1552 1973 1
+1552 1991 1
+1552 2066 1
+1552 2073 1
+1552 2106 1
+1552 2114 1
+1552 2116 1
+1552 2134 1
+1552 2151 1
+1552 2157 1
+1552 2195 1
+1552 2323 1
+1552 2354 1
+1552 2504 1
+1552 2508 1
+1552 2535 1
+1552 2576 1
+1552 2579 1
+1552 2593 1
+1552 2594 1
+1552 2604 1
+1552 2617 1
+1552 2625 1
+1552 2651 1
+1552 2775 1
+1552 2834 1
+1552 3014 1
+1552 3130 1
+1552 3324 1
+1552 3607 1
+1552 3631 1
+1552 4024 1
+1552 4037 1
+1552 4254 1
+1552 4266 1
+1552 4335 1
+1552 4735 1
+1552 4846 1
+1552 5412 1
+1553 56 1
+1553 1154 1
+1553 1428 1
+1553 1482 1
+1553 1497 1
+1553 1514 1
+1553 1525 1
+1553 1600 1
+1553 1608 1
+1553 1680 1
+1553 1758 1
+1553 1780 1
+1553 1788 1
+1553 1816 1
+1553 1956 1
+1553 2323 1
+1553 2504 1
+1553 2781 1
+1553 2825 1
+1553 3568 1
+1547 722 1
+1547 887 1
+1547 913 1
+1547 968 1
+1547 993 1
+1547 1097 1
+1547 1374 1
+1547 1482 1
+1547 1492 1
+1547 1497 1
+1547 1549 1
+1547 1573 1
+1547 1593 1
+1547 1956 1
+1547 1966 1
+1547 2066 1
+1547 2117 1
+1547 2475 1
+1547 2593 1
+1547 2607 1
+1547 2625 1
+1547 2629 1
+1547 2651 1
+1547 2669 1
+1547 2768 1
+1547 2805 1
+1547 3253 1
+1547 8290 1
+1548 1497 1
+1548 4875 1
+1548 5254 1
+1548 6555 1
+1549 15 1
+1549 56 1
+1549 64 1
+1549 171 1
+1549 204 1
+1549 214 1
+1549 290 1
+1549 298 1
+1549 332 1
+1549 350 1
+1549 407 1
+1549 417 1
+1549 465 1
+1549 506 1
+1549 525 1
+1549 579 1
+1549 633 1
+1549 722 1
+1549 737 1
+1549 761 1
+1549 762 1
+1549 763 1
+1549 764 1
+1549 765 1
+1549 825 1
+1549 840 1
+1549 856 1
+1549 859 1
+1549 887 1
+1549 896 1
+1549 904 1
+1549 908 1
+1549 935 1
+1549 937 1
+1549 946 1
+1549 947 1
+1549 959 1
+1549 974 1
+1549 975 1
+1549 993 1
+1549 1000 1
+1549 1018 1
+1549 1031 1
+1549 1034 1
+1549 1035 1
+1549 1049 1
+1549 1061 1
+1549 1097 1
+1549 1100 1
+1549 1103 1
+1549 1111 1
+1549 1137 1
+1549 1140 1
+1549 1151 1
+1549 1154 1
+1549 1157 1
+1549 1164 1
+1549 1165 1
+1549 1166 1
+1549 1186 1
+1549 1199 1
+1549 1201 1
+1549 1211 1
+1549 1230 1
+1549 1243 1
+1549 1247 1
+1549 1248 1
+1549 1261 1
+1549 1267 1
+1549 1279 1
+1549 1284 1
+1549 1285 1
+1549 1291 1
+1549 1297 1
+1549 1307 1
+1549 1315 1
+1549 1319 1
+1549 1322 1
+1549 1352 1
+1549 1353 1
+1549 1357 1
+1549 1360 1
+1549 1374 1
+1549 1378 1
+1549 1385 1
+1549 1390 1
+1549 1407 1
+1549 1411 1
+1549 1416 1
+1549 1419 1
+1549 1428 1
+1549 1441 1
+1549 1453 1
+1549 1471 1
+1549 1473 1
+1549 1482 1
+1549 1487 1
+1549 1489 1
+1549 1492 1
+1549 1496 1
+1549 1497 1
+1549 1501 1
+1549 1510 1
+1549 1514 1
+1549 1521 1
+1549 1534 1
+1549 1547 1
+1549 1555 1
+1549 1565 1
+1549 1566 1
+1549 1571 1
+1549 1580 1
+1549 1583 1
+1549 1585 1
+1549 1592 1
+1549 1597 1
+1549 1603 1
+1549 1608 1
+1549 1613 1
+1549 1618 1
+1549 1619 1
+1549 1621 1
+1549 1622 1
+1549 1628 1
+1549 1633 1
+1549 1641 1
+1549 1646 1
+1549 1648 1
+1549 1653 1
+1549 1658 1
+1549 1661 1
+1549 1672 1
+1549 1678 1
+1549 1679 1
+1549 1680 1
+1549 1688 1
+1549 1697 1
+1549 1700 1
+1549 1701 1
+1549 1705 1
+1549 1706 1
+1549 1714 1
+1549 1716 1
+1549 1717 1
+1549 1723 1
+1549 1726 1
+1549 1729 1
+1549 1730 1
+1549 1732 1
+1549 1733 1
+1549 1734 1
+1549 1744 1
+1549 1746 1
+1549 1747 1
+1549 1749 1
+1549 1754 1
+1549 1757 1
+1549 1768 1
+1549 1772 1
+1549 1774 1
+1549 1777 1
+1549 1780 1
+1549 1781 1
+1549 1783 1
+1549 1787 1
+1549 1792 1
+1549 1793 1
+1549 1798 1
+1549 1799 1
+1549 1802 1
+1549 1805 1
+1549 1808 1
+1549 1814 1
+1549 1816 1
+1549 1819 1
+1549 1836 1
+1549 1842 1
+1549 1847 1
+1549 1849 1
+1549 1857 1
+1549 1858 1
+1549 1859 1
+1549 1880 1
+1549 1888 1
+1549 1893 1
+1549 1903 1
+1549 1908 1
+1549 1918 1
+1549 1919 1
+1549 1927 1
+1549 1953 1
+1549 1956 1
+1549 1963 1
+1549 1964 1
+1549 1965 1
+1549 1966 1
+1549 1969 1
+1549 1973 1
+1549 1977 1
+1549 1979 1
+1549 1982 1
+1549 1984 1
+1549 1985 1
+1549 1987 1
+1549 1990 1
+1549 1992 1
+1549 1997 1
+1549 2001 1
+1549 2007 1
+1549 2016 1
+1549 2062 1
+1549 2066 1
+1549 2071 1
+1549 2072 1
+1549 2073 1
+1549 2076 1
+1549 2085 1
+1549 2091 1
+1549 2097 1
+1549 2102 1
+1549 2114 1
+1549 2116 1
+1549 2117 1
+1549 2120 1
+1549 2128 1
+1549 2134 1
+1549 2135 1
+1549 2144 1
+1549 2145 1
+1549 2151 1
+1549 2157 1
+1549 2165 1
+1549 2168 1
+1549 2174 1
+1549 2178 1
+1549 2181 1
+1549 2193 1
+1549 2209 1
+1549 2211 1
+1549 2225 1
+1549 2231 1
+1549 2233 1
+1549 2237 1
+1549 2240 1
+1549 2241 1
+1549 2242 1
+1549 2251 1
+1549 2252 1
+1549 2256 1
+1549 2257 1
+1549 2258 1
+1549 2264 1
+1549 2273 1
+1549 2276 1
+1549 2277 1
+1549 2281 1
+1549 2285 1
+1549 2290 1
+1549 2294 1
+1549 2297 1
+1549 2307 1
+1549 2322 1
+1549 2323 1
+1549 2324 1
+1549 2326 1
+1549 2328 1
+1549 2329 1
+1549 2333 1
+1549 2338 1
+1549 2339 1
+1549 2341 1
+1549 2348 1
+1549 2350 1
+1549 2354 1
+1549 2356 1
+1549 2366 1
+1549 2371 1
+1549 2375 1
+1549 2384 1
+1549 2385 1
+1549 2397 1
+1549 2398 1
+1549 2400 1
+1549 2410 1
+1549 2411 1
+1549 2435 1
+1549 2440 1
+1549 2456 1
+1549 2470 1
+1549 2474 1
+1549 2475 1
+1549 2485 1
+1549 2504 1
+1549 2506 1
+1549 2507 1
+1549 2508 1
+1549 2510 1
+1549 2516 1
+1549 2542 1
+1549 2544 1
+1549 2547 1
+1549 2550 1
+1549 2560 1
+1549 2565 1
+1549 2571 1
+1549 2575 1
+1549 2576 1
+1549 2579 1
+1549 2580 1
+1549 2585 1
+1549 2587 1
+1549 2589 1
+1549 2593 1
+1549 2594 1
+1549 2597 1
+1549 2599 1
+1549 2604 1
+1549 2605 1
+1549 2607 1
+1549 2618 1
+1549 2619 1
+1549 2623 1
+1549 2625 1
+1549 2629 1
+1549 2643 1
+1549 2650 1
+1549 2651 1
+1549 2653 1
+1549 2654 1
+1549 2655 1
+1549 2657 1
+1549 2660 1
+1549 2662 1
+1549 2665 1
+1549 2667 1
+1549 2669 1
+1549 2670 1
+1549 2685 1
+1549 2686 1
+1549 2687 1
+1549 2693 1
+1549 2697 1
+1549 2700 1
+1549 2707 1
+1549 2713 1
+1549 2721 1
+1549 2727 1
+1549 2746 1
+1549 2747 1
+1549 2754 1
+1549 2760 1
+1549 2763 1
+1549 2765 1
+1549 2774 1
+1549 2785 1
+1549 2787 1
+1549 2790 1
+1549 2794 1
+1549 2809 1
+1549 2814 1
+1549 2815 1
+1549 2819 1
+1549 2828 1
+1549 2830 1
+1549 2859 1
+1549 2871 1
+1549 2880 1
+1549 2900 1
+1549 2918 1
+1549 2922 1
+1549 2932 1
+1549 2946 1
+1549 2951 1
+1549 2955 1
+1549 2958 1
+1549 2963 1
+1549 2966 1
+1549 2968 1
+1549 2972 1
+1549 2973 1
+1549 2977 1
+1549 2981 1
+1549 2999 1
+1549 3005 1
+1549 3007 1
+1549 3009 1
+1549 3010 1
+1549 3024 1
+1549 3026 1
+1549 3027 1
+1549 3028 1
+1549 3029 1
+1549 3030 1
+1549 3033 1
+1549 3034 1
+1549 3059 1
+1549 3080 1
+1549 3084 1
+1549 3089 1
+1549 3103 1
+1549 3104 1
+1549 3117 1
+1549 3130 1
+1549 3136 1
+1549 3138 1
+1549 3140 1
+1549 3144 1
+1549 3148 1
+1549 3150 1
+1549 3164 1
+1549 3192 1
+1549 3251 1
+1549 3253 1
+1549 3258 1
+1549 3260 1
+1549 3265 1
+1549 3274 1
+1549 3307 1
+1549 3334 1
+1549 3338 1
+1549 3351 1
+1549 3352 1
+1549 3393 1
+1549 3394 1
+1549 3404 1
+1549 3408 1
+1549 3439 1
+1549 3443 1
+1549 3453 1
+1549 3454 1
+1549 3456 1
+1549 3459 1
+1549 3463 1
+1549 3473 1
+1549 3480 1
+1549 3489 1
+1549 3498 1
+1549 3529 1
+1549 3537 1
+1549 3541 1
+1549 3562 1
+1549 3568 1
+1549 3580 1
+1549 3587 1
+1549 3615 1
+1549 3631 1
+1549 3634 1
+1549 3643 1
+1549 3650 1
+1549 3661 1
+1549 3680 1
+1549 3691 1
+1549 3720 1
+1549 3745 1
+1549 3755 1
+1549 3787 1
+1549 3796 1
+1549 3800 1
+1549 3803 1
+1549 3804 1
+1549 3807 1
+1549 3812 1
+1549 3813 1
+1549 3835 1
+1549 3842 1
+1549 3847 1
+1549 3880 1
+1549 3892 1
+1549 3897 1
+1549 3903 1
+1549 3912 1
+1549 3926 1
+1549 3939 1
+1549 3970 1
+1549 4009 1
+1549 4011 1
+1549 4013 1
+1549 4021 1
+1549 4037 1
+1549 4041 1
+1549 4055 1
+1549 4099 1
+1549 4103 1
+1549 4117 1
+1549 4162 1
+1549 4179 1
+1549 4189 1
+1549 4191 1
+1549 4211 1
+1549 4247 1
+1549 4256 1
+1549 4261 1
+1549 4263 1
+1549 4266 1
+1549 4272 1
+1549 4276 1
+1549 4289 1
+1549 4290 1
+1549 4299 1
+1549 4303 1
+1549 4310 1
+1549 4323 1
+1549 4335 1
+1549 4338 1
+1549 4349 1
+1549 4400 1
+1549 4448 1
+1549 4463 1
+1549 4468 1
+1549 4527 1
+1549 4528 1
+1549 4530 1
+1549 4536 1
+1549 4574 1
+1549 4578 1
+1549 4587 1
+1549 4600 1
+1549 4632 1
+1549 4646 1
+1549 4653 1
+1549 4661 1
+1549 4666 1
+1549 4712 1
+1549 4719 1
+1549 4776 1
+1549 4797 1
+1549 4811 1
+1549 4875 1
+1549 5020 1
+1549 5061 1
+1549 5073 1
+1549 5100 1
+1549 5123 1
+1549 5155 1
+1549 5200 1
+1549 5215 1
+1549 5254 1
+1549 5285 1
+1549 5288 1
+1549 5305 1
+1549 5312 1
+1549 5341 1
+1549 5384 1
+1549 5412 1
+1549 5430 1
+1549 5445 1
+1549 5449 1
+1549 5452 1
+1549 5454 1
+1549 5459 1
+1549 5482 1
+1549 5484 1
+1549 5524 1
+1549 5563 1
+1549 5637 1
+1549 5683 1
+1549 5693 1
+1549 5697 1
+1549 5714 1
+1549 5721 1
+1549 5732 1
+1549 5775 1
+1549 5776 1
+1549 5817 1
+1549 5822 1
+1549 5844 1
+1549 5872 1
+1549 5897 1
+1549 5947 1
+1549 6097 1
+1549 6123 1
+1549 6299 1
+1549 6442 1
+1549 6624 1
+1549 6634 1
+1549 6774 1
+1549 6790 1
+1549 6832 1
+1549 6897 1
+1549 6979 1
+1549 7115 1
+1549 7168 1
+1549 7185 1
+1549 7237 1
+1549 7478 1
+1549 7510 1
+1549 8293 1
+1550 608 1
+1550 1031 1
+1550 1157 1
+1550 1385 1
+1550 1497 1
+1550 1549 1
+1550 1596 1
+1550 1729 1
+1550 1990 1
+1550 2129 1
+1550 2289 1
+1550 2328 1
+1550 2516 1
+1550 2612 1
+1550 2871 1
+1550 3007 1
+1550 3117 1
+1550 3180 1
+1550 3192 1
+1550 3352 1
+1550 3394 1
+1550 3439 1
+1550 3443 1
+1550 3568 1
+1550 3650 1
+1550 3660 1
+1550 3661 1
+1550 3800 1
+1550 3812 1
+1550 3903 1
+1550 3958 1
+1550 4021 1
+1550 4191 1
+1550 4256 1
+1550 4290 1
+1550 4323 1
+1550 4349 1
+1550 4365 1
+1550 4373 1
+1550 4384 1
+1550 4424 1
+1550 4613 1
+1551 1497 1
+1555 204 1
+1555 350 1
+1555 407 1
+1555 415 1
+1555 506 1
+1555 579 1
+1555 813 1
+1555 887 1
+1555 904 1
+1555 913 1
+1555 937 1
+1555 948 1
+1555 993 1
+1555 1034 1
+1555 1097 1
+1555 1164 1
+1555 1165 1
+1555 1230 1
+1555 1234 1
+1555 1236 1
+1555 1261 1
+1555 1297 1
+1555 1319 1
+1555 1428 1
+1555 1482 1
+1555 1487 1
+1555 1489 1
+1555 1492 1
+1555 1496 1
+1555 1514 1
+1555 1556 1
+1555 1557 1
+1555 1563 1
+1555 1587 1
+1555 1597 1
+1555 1608 1
+1555 1622 1
+1555 1629 1
+1555 1633 1
+1555 1636 1
+1555 1641 1
+1555 1658 1
+1555 1672 1
+1555 1679 1
+1555 1689 1
+1555 1692 1
+1555 1697 1
+1555 1700 1
+1555 1701 1
+1555 1718 1
+1555 1768 1
+1555 1774 1
+1555 1780 1
+1555 1802 1
+1555 1805 1
+1555 1816 1
+1555 1842 1
+1555 1847 1
+1555 1861 1
+1555 1864 1
+1555 1893 1
+1555 1901 1
+1555 1903 1
+1555 1908 1
+1555 1966 1
+1555 1969 1
+1555 1973 1
+1555 2066 1
+1555 2117 1
+1555 2206 1
+1555 2264 1
+1555 2490 1
+1555 2604 1
+1555 2625 1
+1555 2665 1
+1555 2809 1
+1555 3136 1
+1555 8290 1
+1555 8292 1
+1554 1556 1
+1554 1563 1
+1554 4310 1
+1554 4875 1
+1554 5543 1
+1554 6094 1
+1558 1563 1
+1559 1563 1
+1560 1049 1
+1560 1563 1
+1560 3933 1
+1565 813 1
+1565 993 1
+1565 1211 1
+1565 1749 1
+1565 1798 1
+1565 2329 1
+1565 2385 1
+1565 7862 1
+1566 741 1
+1566 761 1
+1566 813 1
+1566 937 1
+1566 993 1
+1566 1097 1
+1566 1315 1
+1566 1378 1
+1566 1453 1
+1566 1628 1
+1566 1705 1
+1566 1734 1
+1566 1847 1
+1566 1855 1
+1566 1903 1
+1566 1908 1
+1566 2071 1
+1566 2073 1
+1566 2079 1
+1566 2117 1
+1566 2246 1
+1566 2328 1
+1566 2371 1
+1566 2485 1
+1566 2560 1
+1566 2580 1
+1566 2593 1
+1566 2638 1
+1566 2653 1
+1566 2665 1
+1566 2685 1
+1566 2696 1
+1566 2801 1
+1566 2877 1
+1566 2946 1
+1566 3026 1
+1566 3033 1
+1566 3059 1
+1566 3173 1
+1566 3192 1
+1566 3537 1
+1566 3748 1
+1566 3854 1
+1566 4256 1
+1566 5026 1
+1566 8290 1
+1568 1277 1
+1569 1718 1
+1569 1793 1
+1569 3136 1
+1570 1569 1
+1570 2385 1
+1570 3136 1
+1570 3164 1
+1572 1569 1
+1572 1581 1
+1574 1537 1
+1575 1537 1
+1576 8288 1
+1578 1580 1
+1579 1580 1
+1581 8292 1
+1010 314 1
+1010 948 1
+1010 3148 1
+1010 6029 1
+1010 6417 1
+1010 7400 1
+1582 314 1
+1582 993 1
+1582 1199 1
+1582 1211 1
+1582 1253 1
+1582 1279 1
+1582 1428 1
+1582 1521 1
+1582 1654 1
+1582 1679 1
+1582 1718 1
+1582 1752 1
+1582 1774 1
+1583 290 1
+1583 314 1
+1583 465 1
+1583 762 1
+1583 764 1
+1583 993 1
+1583 1097 1
+1583 1111 1
+1583 1154 1
+1583 1166 1
+1583 1211 1
+1583 1236 1
+1583 1374 1
+1583 1411 1
+1583 1428 1
+1583 1437 1
+1583 1482 1
+1583 1492 1
+1583 1542 1
+1583 1549 1
+1583 1600 1
+1583 1604 1
+1583 1608 1
+1583 1619 1
+1583 1621 1
+1583 1633 1
+1583 1637 1
+1583 1706 1
+1583 1754 1
+1583 1757 1
+1583 1787 1
+1583 1842 1
+1583 1919 1
+1583 1956 1
+1583 1965 1
+1583 1987 1
+1583 2053 1
+1583 2073 1
+1583 2117 1
+1583 2174 1
+1583 2202 1
+1583 2225 1
+1583 2231 1
+1583 2241 1
+1583 2256 1
+1583 2273 1
+1583 2297 1
+1583 2323 1
+1583 2470 1
+1583 2474 1
+1583 2550 1
+1583 2560 1
+1583 2565 1
+1583 2594 1
+1583 2599 1
+1583 2618 1
+1583 2625 1
+1583 2643 1
+1583 2654 1
+1583 2660 1
+1583 2665 1
+1583 2669 1
+1583 2670 1
+1583 2697 1
+1583 2700 1
+1583 2707 1
+1583 2721 1
+1583 2754 1
+1583 2763 1
+1583 2785 1
+1583 2794 1
+1583 2828 1
+1583 2830 1
+1583 2880 1
+1583 2900 1
+1583 2955 1
+1583 2968 1
+1583 2991 1
+1583 3034 1
+1583 3130 1
+1583 3145 1
+1583 3251 1
+1583 3253 1
+1583 3265 1
+1583 3351 1
+1583 3489 1
+1583 3650 1
+1587 171 1
+1587 1248 1
+1587 1585 1
+1587 1718 1
+1587 8294 1
+1584 1587 1
+1585 204 1
+1585 214 1
+1585 290 1
+1585 415 1
+1585 425 1
+1585 762 1
+1585 908 1
+1585 913 1
+1585 935 1
+1585 959 1
+1585 1031 1
+1585 1035 1
+1585 1097 1
+1585 1151 1
+1585 1164 1
+1585 1165 1
+1585 1211 1
+1585 1243 1
+1585 1248 1
+1585 1279 1
+1585 1284 1
+1585 1297 1
+1585 1378 1
+1585 1384 1
+1585 1482 1
+1585 1492 1
+1585 1520 1
+1585 1547 1
+1585 1564 1
+1585 1587 1
+1585 1618 1
+1585 1622 1
+1585 1641 1
+1585 1646 1
+1585 1654 1
+1585 1661 1
+1585 1672 1
+1585 1679 1
+1585 1697 1
+1585 1700 1
+1585 1723 1
+1585 1726 1
+1585 1754 1
+1585 1772 1
+1585 1787 1
+1585 1811 1
+1585 1836 1
+1585 1847 1
+1585 1855 1
+1585 1857 1
+1585 1858 1
+1585 1888 1
+1585 1903 1
+1585 1966 1
+1585 1969 1
+1585 1973 1
+1585 1979 1
+1585 2053 1
+1585 2066 1
+1585 2076 1
+1585 2079 1
+1585 2091 1
+1585 2114 1
+1585 2117 1
+1585 2145 1
+1585 2193 1
+1585 2210 1
+1585 2252 1
+1585 2329 1
+1585 2356 1
+1585 2371 1
+1585 2385 1
+1585 2397 1
+1585 2398 1
+1585 2400 1
+1585 2410 1
+1585 2411 1
+1585 2433 1
+1585 2508 1
+1585 2542 1
+1585 2560 1
+1585 2604 1
+1585 2763 1
+1585 2830 1
+1585 2838 1
+1585 2859 1
+1585 2877 1
+1585 2880 1
+1585 3005 1
+1585 3136 1
+1585 3200 1
+1585 3348 1
+1585 3473 1
+1585 3520 1
+1585 3580 1
+1585 3615 1
+1585 3807 1
+1585 4138 1
+1585 4179 1
+1585 4269 1
+1585 8291 1
+1585 8297 1
+1588 948 1
+1589 861 1
+1589 913 1
+1589 948 1
+1589 1201 1
+1589 1236 1
+1589 1261 1
+1589 1428 1
+1589 1596 1
+1589 1600 1
+1589 1603 1
+1589 1612 1
+1589 1638 1
+1589 1679 1
+1590 1593 1
+1591 1593 1
+1592 425 1
+1592 993 1
+1592 1186 1
+1592 1384 1
+1592 1416 1
+1592 1489 1
+1592 1593 1
+1592 1792 1
+1592 1837 1
+1592 2073 1
+1592 2109 1
+1592 2157 1
+1592 2165 1
+1592 2174 1
+1592 2470 1
+1592 2501 1
+1592 2625 1
+1592 2654 1
+1592 2794 1
+1592 2856 1
+1592 2963 1
+1592 3034 1
+1592 3089 1
+1592 3117 1
+1592 3140 1
+1592 3164 1
+1592 3516 1
+1592 4179 1
+1592 4953 1
+1592 5055 1
+1594 171 1
+1594 285 1
+1594 298 1
+1594 372 1
+1594 559 1
+1594 575 1
+1594 579 1
+1594 762 1
+1594 763 1
+1594 825 1
+1594 887 1
+1594 904 1
+1594 913 1
+1594 935 1
+1594 937 1
+1594 975 1
+1594 993 1
+1594 1034 1
+1594 1103 1
+1594 1124 1
+1594 1164 1
+1594 1168 1
+1594 1211 1
+1594 1230 1
+1594 1236 1
+1594 1248 1
+1594 1253 1
+1594 1279 1
+1594 1297 1
+1594 1319 1
+1594 1374 1
+1594 1428 1
+1594 1442 1
+1594 1471 1
+1594 1482 1
+1594 1487 1
+1594 1489 1
+1594 1496 1
+1594 1514 1
+1594 1534 1
+1594 1549 1
+1594 1555 1
+1594 1566 1
+1594 1585 1
+1594 1595 1
+1594 1610 1
+1594 1619 1
+1594 1622 1
+1594 1628 1
+1594 1629 1
+1594 1638 1
+1594 1641 1
+1594 1649 1
+1594 1652 1
+1594 1654 1
+1594 1658 1
+1594 1661 1
+1594 1662 1
+1594 1669 1
+1594 1689 1
+1594 1692 1
+1594 1697 1
+1594 1701 1
+1594 1707 1
+1594 1714 1
+1594 1717 1
+1594 1718 1
+1594 1726 1
+1594 1732 1
+1594 1746 1
+1594 1747 1
+1594 1752 1
+1594 1758 1
+1594 1770 1
+1594 1774 1
+1594 1783 1
+1594 1788 1
+1594 1791 1
+1594 1802 1
+1594 1836 1
+1594 1855 1
+1594 1858 1
+1594 1859 1
+1594 1880 1
+1594 1888 1
+1594 1893 1
+1594 1901 1
+1594 1903 1
+1594 1919 1
+1594 1963 1
+1594 1966 1
+1594 1969 1
+1594 1977 1
+1594 1979 1
+1594 2062 1
+1594 2066 1
+1594 2097 1
+1594 2135 1
+1594 2174 1
+1594 2193 1
+1594 2375 1
+1594 2485 1
+1594 2504 1
+1594 2794 1
+1594 2922 1
+1594 2968 1
+1594 2972 1
+1594 3117 1
+1594 3136 1
+1594 3192 1
+1594 3253 1
+1594 4179 1
+1594 4480 1
+1594 8290 1
+1596 633 1
+1596 1199 1
+1596 1201 1
+1596 1319 1
+1596 1550 1
+1596 1597 1
+1596 1633 1
+1596 1772 1
+1596 2117 1
+1596 2120 1
+1596 2325 1
+1596 2328 1
+1596 2474 1
+1596 2485 1
+1596 2565 1
+1596 2625 1
+1596 2693 1
+1596 2958 1
+1596 3117 1
+1596 3265 1
+1596 3276 1
+1596 3284 1
+1596 3352 1
+1596 3562 1
+1596 3842 1
+1596 4012 1
+1596 4043 1
+1596 4055 1
+1596 4256 1
+1599 1489 1
+1599 1600 1
+1599 1774 1
+1603 15 1
+1603 1018 1
+1603 1243 1
+1603 1835 1
+1603 2240 1
+1603 2332 1
+1603 2435 1
+1603 2571 1
+1603 2579 1
+1603 3479 1
+1603 5233 1
+1603 5254 1
+1603 6334 1
+1603 6400 1
+1603 6407 1
+1603 6422 1
+1571 56 1
+1571 975 1
+1571 1031 1
+1571 1035 1
+1571 1200 1
+1571 1279 1
+1571 1297 1
+1571 1357 1
+1571 1482 1
+1571 1510 1
+1571 1514 1
+1571 1585 1
+1571 1603 1
+1571 1621 1
+1571 1638 1
+1571 1652 1
+1571 1661 1
+1571 1956 1
+1571 1992 1
+1571 2066 1
+1571 2071 1
+1571 2348 1
+1571 3136 1
+1571 3473 1
+1601 861 1
+1601 1428 1
+1601 1603 1
+1601 5714 1
+1602 1603 1
+1604 1253 1
+1604 1603 1
+1604 2917 1
+1604 3136 1
+1605 559 1
+1605 691 1
+1605 1168 1
+1605 1199 1
+1605 1253 1
+1605 1442 1
+1605 1520 1
+1605 1525 1
+1605 1654 1
+1605 1657 1
+1606 861 1
+1606 1927 1
+1606 3291 1
+1607 861 1
+1607 1661 1
+1608 15 1
+1608 214 1
+1608 230 1
+1608 285 1
+1608 290 1
+1608 298 1
+1608 332 1
+1608 350 1
+1608 403 1
+1608 407 1
+1608 415 1
+1608 506 1
+1608 559 1
+1608 575 1
+1608 587 1
+1608 633 1
+1608 665 1
+1608 737 1
+1608 761 1
+1608 762 1
+1608 763 1
+1608 765 1
+1608 836 1
+1608 859 1
+1608 887 1
+1608 904 1
+1608 908 1
+1608 913 1
+1608 937 1
+1608 947 1
+1608 959 1
+1608 968 1
+1608 975 1
+1608 993 1
+1608 1000 1
+1608 1031 1
+1608 1034 1
+1608 1035 1
+1608 1049 1
+1608 1061 1
+1608 1097 1
+1608 1103 1
+1608 1111 1
+1608 1124 1
+1608 1137 1
+1608 1140 1
+1608 1151 1
+1608 1165 1
+1608 1168 1
+1608 1186 1
+1608 1199 1
+1608 1201 1
+1608 1211 1
+1608 1230 1
+1608 1243 1
+1608 1248 1
+1608 1250 1
+1608 1253 1
+1608 1261 1
+1608 1267 1
+1608 1279 1
+1608 1284 1
+1608 1291 1
+1608 1297 1
+1608 1307 1
+1608 1319 1
+1608 1322 1
+1608 1353 1
+1608 1357 1
+1608 1374 1
+1608 1378 1
+1608 1384 1
+1608 1390 1
+1608 1393 1
+1608 1407 1
+1608 1416 1
+1608 1419 1
+1608 1428 1
+1608 1442 1
+1608 1444 1
+1608 1453 1
+1608 1471 1
+1608 1482 1
+1608 1489 1
+1608 1492 1
+1608 1514 1
+1608 1520 1
+1608 1521 1
+1608 1525 1
+1608 1534 1
+1608 1542 1
+1608 1549 1
+1608 1565 1
+1608 1566 1
+1608 1583 1
+1608 1585 1
+1608 1592 1
+1608 1604 1
+1608 1610 1
+1608 1612 1
+1608 1613 1
+1608 1619 1
+1608 1621 1
+1608 1622 1
+1608 1628 1
+1608 1629 1
+1608 1633 1
+1608 1641 1
+1608 1648 1
+1608 1649 1
+1608 1654 1
+1608 1662 1
+1608 1669 1
+1608 1672 1
+1608 1678 1
+1608 1687 1
+1608 1689 1
+1608 1692 1
+1608 1700 1
+1608 1701 1
+1608 1707 1
+1608 1714 1
+1608 1717 1
+1608 1718 1
+1608 1723 1
+1608 1730 1
+1608 1732 1
+1608 1734 1
+1608 1746 1
+1608 1747 1
+1608 1749 1
+1608 1752 1
+1608 1754 1
+1608 1757 1
+1608 1758 1
+1608 1772 1
+1608 1781 1
+1608 1787 1
+1608 1788 1
+1608 1791 1
+1608 1792 1
+1608 1798 1
+1608 1802 1
+1608 1808 1
+1608 1811 1
+1608 1814 1
+1608 1816 1
+1608 1835 1
+1608 1842 1
+1608 1847 1
+1608 1848 1
+1608 1855 1
+1608 1857 1
+1608 1858 1
+1608 1888 1
+1608 1893 1
+1608 1901 1
+1608 1903 1
+1608 1908 1
+1608 1918 1
+1608 1919 1
+1608 1927 1
+1608 1956 1
+1608 1963 1
+1608 1964 1
+1608 1965 1
+1608 1969 1
+1608 1973 1
+1608 1977 1
+1608 1979 1
+1608 1983 1
+1608 1985 1
+1608 1987 1
+1608 1991 1
+1608 1992 1
+1608 1997 1
+1608 2004 1
+1608 2060 1
+1608 2066 1
+1608 2071 1
+1608 2072 1
+1608 2073 1
+1608 2076 1
+1608 2079 1
+1608 2083 1
+1608 2091 1
+1608 2097 1
+1608 2101 1
+1608 2109 1
+1608 2116 1
+1608 2117 1
+1608 2119 1
+1608 2120 1
+1608 2121 1
+1608 2128 1
+1608 2135 1
+1608 2137 1
+1608 2145 1
+1608 2157 1
+1608 2160 1
+1608 2163 1
+1608 2165 1
+1608 2168 1
+1608 2174 1
+1608 2178 1
+1608 2181 1
+1608 2193 1
+1608 2195 1
+1608 2205 1
+1608 2210 1
+1608 2225 1
+1608 2231 1
+1608 2240 1
+1608 2242 1
+1608 2246 1
+1608 2251 1
+1608 2253 1
+1608 2256 1
+1608 2264 1
+1608 2273 1
+1608 2285 1
+1608 2290 1
+1608 2297 1
+1608 2322 1
+1608 2323 1
+1608 2325 1
+1608 2328 1
+1608 2329 1
+1608 2333 1
+1608 2339 1
+1608 2341 1
+1608 2345 1
+1608 2348 1
+1608 2350 1
+1608 2354 1
+1608 2356 1
+1608 2371 1
+1608 2385 1
+1608 2397 1
+1608 2398 1
+1608 2400 1
+1608 2411 1
+1608 2435 1
+1608 2475 1
+1608 2504 1
+1608 2508 1
+1608 2517 1
+1608 2550 1
+1608 2560 1
+1608 2565 1
+1608 2576 1
+1608 2579 1
+1608 2580 1
+1608 2585 1
+1608 2587 1
+1608 2593 1
+1608 2594 1
+1608 2604 1
+1608 2617 1
+1608 2625 1
+1608 2643 1
+1608 2653 1
+1608 2654 1
+1608 2662 1
+1608 2669 1
+1608 2685 1
+1608 2697 1
+1608 2707 1
+1608 2721 1
+1608 2747 1
+1608 2754 1
+1608 2763 1
+1608 2794 1
+1608 2805 1
+1608 2814 1
+1608 2815 1
+1608 2828 1
+1608 2830 1
+1608 2834 1
+1608 2856 1
+1608 2871 1
+1608 2951 1
+1608 2972 1
+1608 2981 1
+1608 2996 1
+1608 2999 1
+1608 3021 1
+1608 3029 1
+1608 3030 1
+1608 3034 1
+1608 3089 1
+1608 3099 1
+1608 3117 1
+1608 3136 1
+1608 3150 1
+1608 3180 1
+1608 3192 1
+1608 3251 1
+1608 3253 1
+1608 3260 1
+1608 3265 1
+1608 3307 1
+1608 3338 1
+1608 3351 1
+1608 3352 1
+1608 3371 1
+1608 3394 1
+1608 3435 1
+1608 3459 1
+1608 3520 1
+1608 3547 1
+1608 3562 1
+1608 3646 1
+1608 3796 1
+1608 3804 1
+1608 3812 1
+1608 3813 1
+1608 3843 1
+1608 3871 1
+1608 3887 1
+1608 3926 1
+1608 3946 1
+1608 4011 1
+1608 4021 1
+1608 4037 1
+1608 4065 1
+1608 4162 1
+1608 4234 1
+1608 4247 1
+1608 4256 1
+1608 4290 1
+1608 4338 1
+1608 4361 1
+1608 4365 1
+1608 4384 1
+1608 4530 1
+1608 4531 1
+1608 4604 1
+1608 4712 1
+1608 4795 1
+1608 5083 1
+1608 5100 1
+1608 5288 1
+1608 5335 1
+1608 5545 1
+1608 5714 1
+1608 5822 1
+1608 5897 1
+1608 6246 1
+1608 6770 1
+1608 6774 1
+1608 7882 1
+1608 8291 1
+1608 8293 1
+1608 8294 1
+1609 1201 1
+1610 1201 1
+1610 1211 1
+1610 1236 1
+1610 1253 1
+1610 1297 1
+1610 1428 1
+1610 1496 1
+1610 1555 1
+1610 1641 1
+1610 1726 1
+1610 1747 1
+1610 1903 1
+1611 1596 1
+1612 1211 1
+1612 1982 1
+1612 2565 1
+1612 3346 1
+1612 4134 1
+1612 4507 1
+1612 4666 1
+1612 4713 1
+1612 5012 1
+1612 5210 1
+1612 5246 1
+1612 5378 1
+1612 5384 1
+1612 5582 1
+1612 5772 1
+1612 5811 1
+1612 5814 1
+1612 5932 1
+1612 5969 1
+1612 5998 1
+1612 6097 1
+1612 6270 1
+1612 6347 1
+1612 6414 1
+1612 6555 1
+1612 6560 1
+1612 6624 1
+1612 6634 1
+1612 6780 1
+1612 6783 1
+1612 6832 1
+1612 6833 1
+1612 6901 1
+1612 6918 1
+1612 6934 1
+1612 6946 1
+1612 6993 1
+1612 7040 1
+1612 7042 1
+1612 7052 1
+1612 7074 1
+1612 7094 1
+1612 7162 1
+1612 7262 1
+1612 7277 1
+1612 7280 1
+1612 7306 1
+1612 7517 1
+1612 7544 1
+1612 7726 1
+1612 7763 1
+1612 7788 1
+1612 7791 1
+1612 7803 1
+1612 7810 1
+1612 8037 1
+1612 8042 1
+1612 8044 1
+1612 8050 1
+1612 8134 1
+1612 8149 1
+1612 8198 1
+1612 8212 1
+1612 8219 1
+1612 8224 1
+1612 8235 1
+1612 8237 1
+1612 8249 1
+1613 763 1
+1613 1236 1
+1613 1496 1
+1613 1520 1
+1613 1610 1
+1613 1903 1
+1613 2223 1
+1613 2790 1
+1613 2940 1
+1613 3443 1
+1613 4103 1
+1613 4798 1
+1613 7839 1
+1613 8148 1
+1613 8290 1
+1614 15 1
+1614 204 1
+1614 214 1
+1614 372 1
+1614 579 1
+1614 665 1
+1614 762 1
+1614 763 1
+1614 836 1
+1614 993 1
+1614 1000 1
+1614 1211 1
+1614 1236 1
+1614 1267 1
+1614 1279 1
+1614 1322 1
+1614 1357 1
+1614 1374 1
+1614 1442 1
+1614 1514 1
+1614 1525 1
+1614 1549 1
+1614 1583 1
+1614 1592 1
+1614 1621 1
+1614 1622 1
+1614 1628 1
+1614 1669 1
+1614 1717 1
+1614 1734 1
+1614 1774 1
+1614 1780 1
+1614 1787 1
+1614 1802 1
+1614 1805 1
+1614 1811 1
+1614 1814 1
+1614 1842 1
+1614 1848 1
+1614 1857 1
+1614 1859 1
+1614 1893 1
+1614 1903 1
+1614 1919 1
+1614 1987 1
+1614 1992 1
+1614 2071 1
+1614 2205 1
+1614 2225 1
+1614 2256 1
+1614 2297 1
+1614 2328 1
+1614 2348 1
+1614 2410 1
+1614 2456 1
+1614 2547 1
+1614 2625 1
+1614 2654 1
+1614 2760 1
+1614 2777 1
+1614 2856 1
+1614 3034 1
+1614 3136 1
+1614 3253 1
+1614 3680 1
+1614 4037 1
+1614 4335 1
+1614 4600 1
+1614 4706 1
+1614 4735 1
+1614 5022 1
+1614 5341 1
+1614 5848 1
+1615 56 1
+1615 64 1
+1615 171 1
+1615 230 1
+1615 285 1
+1615 290 1
+1615 298 1
+1615 372 1
+1615 407 1
+1615 415 1
+1615 506 1
+1615 559 1
+1615 575 1
+1615 579 1
+1615 665 1
+1615 761 1
+1615 763 1
+1615 887 1
+1615 908 1
+1615 913 1
+1615 928 1
+1615 935 1
+1615 937 1
+1615 946 1
+1615 993 1
+1615 1000 1
+1615 1034 1
+1615 1103 1
+1615 1124 1
+1615 1137 1
+1615 1151 1
+1615 1164 1
+1615 1168 1
+1615 1199 1
+1615 1200 1
+1615 1211 1
+1615 1230 1
+1615 1248 1
+1615 1253 1
+1615 1279 1
+1615 1285 1
+1615 1297 1
+1615 1319 1
+1615 1322 1
+1615 1407 1
+1615 1411 1
+1615 1428 1
+1615 1442 1
+1615 1471 1
+1615 1482 1
+1615 1487 1
+1615 1489 1
+1615 1496 1
+1615 1501 1
+1615 1514 1
+1615 1520 1
+1615 1525 1
+1615 1534 1
+1615 1549 1
+1615 1550 1
+1615 1555 1
+1615 1566 1
+1615 1585 1
+1615 1618 1
+1615 1619 1
+1615 1622 1
+1615 1628 1
+1615 1633 1
+1615 1636 1
+1615 1638 1
+1615 1641 1
+1615 1648 1
+1615 1649 1
+1615 1652 1
+1615 1654 1
+1615 1657 1
+1615 1658 1
+1615 1661 1
+1615 1662 1
+1615 1669 1
+1615 1672 1
+1615 1679 1
+1615 1680 1
+1615 1689 1
+1615 1697 1
+1615 1707 1
+1615 1716 1
+1615 1717 1
+1615 1726 1
+1615 1730 1
+1615 1732 1
+1615 1746 1
+1615 1747 1
+1615 1752 1
+1615 1757 1
+1615 1758 1
+1615 1768 1
+1615 1770 1
+1615 1772 1
+1615 1774 1
+1615 1780 1
+1615 1787 1
+1615 1788 1
+1615 1791 1
+1615 1798 1
+1615 1802 1
+1615 1805 1
+1615 1811 1
+1615 1816 1
+1615 1849 1
+1615 1855 1
+1615 1857 1
+1615 1858 1
+1615 1859 1
+1615 1864 1
+1615 1880 1
+1615 1893 1
+1615 1901 1
+1615 1903 1
+1615 1908 1
+1615 1920 1
+1615 1927 1
+1615 1953 1
+1615 1955 1
+1615 1956 1
+1615 1963 1
+1615 1965 1
+1615 1966 1
+1615 1969 1
+1615 1973 1
+1615 1979 1
+1615 1983 1
+1615 1984 1
+1615 1987 1
+1615 1991 1
+1615 2007 1
+1615 2055 1
+1615 2066 1
+1615 2069 1
+1615 2073 1
+1615 2079 1
+1615 2083 1
+1615 2095 1
+1615 2097 1
+1615 2101 1
+1615 2106 1
+1615 2109 1
+1615 2112 1
+1615 2114 1
+1615 2119 1
+1615 2121 1
+1615 2137 1
+1615 2151 1
+1615 2163 1
+1615 2165 1
+1615 2168 1
+1615 2174 1
+1615 2178 1
+1615 2181 1
+1615 2350 1
+1615 3136 1
+1615 8290 1
+1616 928 1
+1617 1618 1
+1530 72 1
+1530 1428 1
+1530 1566 1
+1530 1835 1
+1530 1859 1
+1530 4632 1
+1530 5226 1
+1530 5459 1
+1530 5828 1
+1530 8141 1
+1530 8178 1
+1619 1297 1
+1619 1428 1
+1619 1487 1
+1619 1726 1
+1620 1428 1
+1621 836 1
+1621 946 1
+1621 947 1
+1621 993 1
+1621 1031 1
+1621 1035 1
+1621 1049 1
+1621 1111 1
+1621 1211 1
+1621 1353 1
+1621 1378 1
+1621 1428 1
+1621 1444 1
+1621 1492 1
+1621 1514 1
+1621 1521 1
+1621 1583 1
+1621 1622 1
+1621 1697 1
+1621 1700 1
+1621 1714 1
+1621 1729 1
+1621 1734 1
+1621 1749 1
+1621 1754 1
+1621 1783 1
+1621 1808 1
+1621 1816 1
+1621 1842 1
+1621 1858 1
+1621 1880 1
+1621 1888 1
+1621 1901 1
+1621 1919 1
+1621 1979 1
+1621 1985 1
+1621 1987 1
+1621 2071 1
+1621 2120 1
+1621 2128 1
+1621 2174 1
+1621 2205 1
+1621 2210 1
+1621 2211 1
+1621 2240 1
+1621 2246 1
+1621 2273 1
+1621 2322 1
+1621 2328 1
+1621 2329 1
+1621 2341 1
+1621 2474 1
+1621 2565 1
+1621 2593 1
+1621 2625 1
+1621 2646 1
+1621 2651 1
+1621 2763 1
+1621 3084 1
+1621 3117 1
+1621 3238 1
+1621 3265 1
+1621 3456 1
+1621 3568 1
+1621 3645 1
+1621 4072 1
+1621 4191 1
+1621 4290 1
+1621 4578 1
+1621 4811 1
+1621 5466 1
+1621 5655 1
+1621 5739 1
+1621 5839 1
+1621 7021 1
+1621 7052 1
+1621 7386 1
+1621 7620 1
+1621 8121 1
+1621 8290 1
+1622 15 1
+1622 415 1
+1622 1034 1
+1622 1279 1
+1622 1297 1
+1622 1357 1
+1622 1428 1
+1622 1482 1
+1622 1487 1
+1622 1492 1
+1622 1496 1
+1622 1514 1
+1622 1549 1
+1622 1585 1
+1622 1700 1
+1622 1701 1
+1622 1772 1
+1622 1788 1
+1622 1816 1
+1622 1893 1
+1622 1935 1
+1622 1953 1
+1622 1966 1
+1622 1973 1
+1622 1992 1
+1622 2285 1
+1622 2328 1
+1622 2378 1
+1622 2474 1
+1622 2506 1
+1622 2508 1
+1622 2565 1
+1622 2594 1
+1622 2727 1
+1622 2746 1
+1622 2830 1
+1622 2859 1
+1622 2923 1
+1622 2958 1
+1622 3005 1
+1622 3068 1
+1622 3117 1
+1622 3136 1
+1622 3265 1
+1622 3580 1
+1622 3680 1
+1622 3792 1
+1622 4578 1
+1622 4795 1
+1622 6327 1
+1623 407 1
+1623 737 1
+1623 761 1
+1623 887 1
+1623 993 1
+1623 1014 1
+1623 1049 1
+1623 1357 1
+1623 1428 1
+1623 1487 1
+1623 1555 1
+1623 1565 1
+1623 1893 1
+1623 1966 1
+1623 2323 1
+1623 2341 1
+1623 2345 1
+1623 2593 1
+1623 2625 1
+1623 2685 1
+1623 2693 1
+1623 2851 1
+1623 2966 1
+1623 3140 1
+1623 3291 1
+1623 3580 1
+1623 3629 1
+1623 3634 1
+1623 3812 1
+1623 4037 1
+1623 4335 1
+1623 4717 1
+1623 4811 1
+1623 5130 1
+1623 5140 1
+1623 5479 1
+1623 5928 1
+1623 6496 1
+1623 8290 1
+1625 1525 1
+1625 2763 1
+1627 1525 1
+1626 1525 1
+1626 3650 1
+1628 1297 1
+1628 1471 1
+1628 1514 1
+1628 1542 1
+1628 1629 1
+1628 1669 1
+1628 1811 1
+1628 1858 1
+1628 1859 1
+1628 2128 1
+1628 2193 1
+1628 8290 1
+1630 1279 1
+1630 1633 1
+1631 904 1
+1631 1165 1
+1631 1168 1
+1631 1610 1
+1631 1633 1
+1631 1758 1
+1632 1471 1
+1632 1633 1
+1632 1661 1
+1634 797 1
+1635 797 1
+1636 2499 1
+1638 1103 1
+1638 1637 1
+1638 1661 1
+1637 1638 1
+1639 935 1
+1639 1186 1
+1639 1284 1
+1639 1378 1
+1639 1473 1
+1639 1592 1
+1639 1621 1
+1639 1637 1
+1639 1638 1
+1639 1783 1
+1639 1858 1
+1639 2016 1
+1639 2071 1
+1639 2079 1
+1639 2091 1
+1639 2095 1
+1639 2237 1
+1639 2241 1
+1639 2485 1
+1639 2651 1
+1639 2686 1
+1639 2775 1
+1639 2955 1
+1639 3291 1
+1639 3371 1
+1639 3417 1
+1639 3631 1
+1639 3680 1
+1639 3792 1
+1639 4748 1
+1639 5072 1
+1639 5083 1
+1639 5162 1
+1639 5189 1
+1639 5335 1
+1639 5693 1
+1641 1035 1
+1641 1489 1
+1642 1489 1
+1643 1489 1
+1644 15 1
+1644 56 1
+1644 230 1
+1644 737 1
+1644 762 1
+1644 1049 1
+1644 1186 1
+1644 1297 1
+1644 1384 1
+1644 1489 1
+1644 1521 1
+1644 1661 1
+1644 1717 1
+1644 1787 1
+1644 1842 1
+1644 1859 1
+1644 1956 1
+1644 1997 1
+1644 2004 1
+1644 2091 1
+1644 2097 1
+1644 2165 1
+1644 2211 1
+1644 2237 1
+1644 2332 1
+1644 2398 1
+1644 2535 1
+1644 2565 1
+1644 2651 1
+1644 2774 1
+1644 2801 1
+1644 3238 1
+1644 3334 1
+1644 3976 1
+1644 4600 1
+1644 5210 1
+1644 5412 1
+1644 5680 1
+1644 5902 1
+1644 6414 1
+1644 6437 1
+1644 6498 1
+1644 6599 1
+1644 6765 1
+1644 6914 1
+1644 7699 1
+1644 7839 1
+1644 8290 1
+1645 1648 1
+1645 5886 1
+1646 1199 1
+1646 1585 1
+1646 1648 1
+1646 2339 1
+1646 2768 1
+1650 887 1
+1651 1652 1
+1653 1654 1
+1653 2814 1
+1655 1520 1
+1656 1520 1
+1661 15 1
+1661 415 1
+1661 974 1
+1661 1026 1
+1661 1211 1
+1661 1297 1
+1661 1305 1
+1661 1754 1
+1661 1808 1
+1661 1859 1
+1661 1953 1
+1661 1966 1
+1661 2066 1
+1661 2069 1
+1661 2102 1
+1661 2151 1
+1661 2210 1
+1661 2328 1
+1661 2398 1
+1661 2433 1
+1661 2490 1
+1661 2535 1
+1661 2565 1
+1661 2658 1
+1661 2912 1
+1661 2923 1
+1661 2940 1
+1661 3144 1
+1661 3145 1
+1661 3253 1
+1661 3276 1
+1661 3408 1
+1661 3443 1
+1661 3447 1
+1661 3456 1
+1661 3548 1
+1661 3635 1
+1661 3645 1
+1661 3962 1
+1661 4037 1
+1661 4191 1
+1661 4269 1
+1661 4323 1
+1661 4402 1
+1661 4453 1
+1661 4482 1
+1661 4580 1
+1661 4687 1
+1661 4791 1
+1661 5022 1
+1661 5092 1
+1661 5148 1
+1661 5215 1
+1661 5605 1
+1661 5651 1
+1661 5811 1
+1661 5817 1
+1661 6218 1
+1661 6296 1
+1661 6323 1
+1661 6600 1
+1661 6855 1
+1661 7092 1
+1661 7497 1
+1661 7924 1
+1661 8293 1
+1658 1661 1
+1658 1697 1
+1658 2053 1
+1658 2297 1
+1658 2787 1
+1658 2838 1
+1658 2877 1
+1658 5055 1
+1658 7871 1
+1659 1661 1
+1660 1661 1
+1662 856 1
+1662 1124 1
+1662 1718 1
+1662 1903 1
+1662 3235 1
+1662 5239 1
+1564 290 1
+1564 764 1
+1564 1353 1
+1564 1390 1
+1564 1496 1
+1564 1555 1
+1564 1622 1
+1564 1679 1
+1564 1687 1
+1564 1700 1
+1564 1701 1
+1564 1772 1
+1564 1783 1
+1564 1805 1
+1564 1893 1
+1564 1953 1
+1564 1969 1
+1564 1992 1
+1564 2151 1
+1564 2178 1
+1564 2398 1
+1564 2594 1
+1564 2618 1
+1564 2713 1
+1564 3030 1
+1564 3755 1
+1564 8290 1
+1663 1564 1
+1664 579 1
+1664 1888 1
+1664 2535 1
+1665 1471 1
+1666 1471 1
+1667 737 1
+1667 1049 1
+1667 1628 1
+1667 1669 1
+1667 1680 1
+1667 1802 1
+1667 1835 1
+1667 1849 1
+1667 1857 1
+1667 1859 1
+1667 2328 1
+1667 2516 1
+1667 2580 1
+1667 2587 1
+1667 2763 1
+1667 3014 1
+1667 3276 1
+1667 3447 1
+1667 3537 1
+1667 3796 1
+1667 3897 1
+1667 4310 1
+1667 4341 1
+1667 4536 1
+1667 4547 1
+1667 5020 1
+1667 5022 1
+1667 5064 1
+1667 5079 1
+1667 5103 1
+1667 5178 1
+1667 5301 1
+1667 5404 1
+1667 5465 1
+1667 5529 1
+1667 5543 1
+1667 5605 1
+1667 5614 1
+1667 5620 1
+1667 5737 1
+1667 5760 1
+1667 5844 1
+1667 5872 1
+1667 6164 1
+1667 6302 1
+1667 6306 1
+1667 6566 1
+1667 6923 1
+1667 7378 1
+1667 7491 1
+1667 7553 1
+1667 7795 1
+1667 8019 1
+1667 8134 1
+1667 8198 1
+1668 1186 1
+1668 1669 1
+1668 1816 1
+1668 2091 1
+1668 2685 1
+1670 913 1
+1670 1124 1
+1670 1374 1
+1670 1390 1
+1670 1646 1
+1670 1847 1
+1670 1956 1
+1670 1997 1
+1670 2117 1
+1670 2120 1
+1670 2145 1
+1670 2165 1
+1670 2240 1
+1670 2294 1
+1670 2763 1
+1670 2787 1
+1670 2797 1
+1670 8290 1
+1671 913 1
+1647 417 1
+1647 1211 1
+1647 1279 1
+1647 1548 1
+1647 2144 1
+1647 2252 1
+1647 2535 1
+1647 3005 1
+1647 3587 1
+1647 3967 1
+1647 4037 1
+1647 4072 1
+1647 4191 1
+1647 4315 1
+1647 4796 1
+1647 5226 1
+1647 5412 1
+1647 6784 1
+1647 7131 1
+1674 72 1
+1674 633 1
+1674 1250 1
+1674 1279 1
+1674 2587 1
+1674 5524 1
+1674 5732 1
+1674 7005 1
+1675 1279 1
+1675 1956 1
+1676 1279 1
+1677 1199 1
+1677 1279 1
+1678 1211 1
+1678 1977 1
+1678 4654 1
+1680 3813 1
+1680 4315 1
+1680 4373 1
+1680 5222 1
+1681 1442 1
+1681 2506 1
+1682 1442 1
+1683 1641 1
+1683 1802 1
+1685 1641 1
+1684 403 1
+1684 1416 1
+1684 1641 1
+1684 1653 1
+1684 2102 1
+1684 2225 1
+1684 2322 1
+1684 2625 1
+1684 2651 1
+1686 1501 1
+1687 1501 1
+1687 2151 1
+1687 3125 1
+1687 3806 1
+1687 4528 1
+1687 4811 1
+1689 1031 1
+1689 1787 1
+1692 372 1
+1692 1514 1
+1692 2877 1
+1690 1692 1
+1690 2877 1
+1691 372 1
+1691 425 1
+1691 967 1
+1691 1049 1
+1691 1191 1
+1691 1416 1
+1691 1492 1
+1691 1566 1
+1691 1622 1
+1691 1692 1
+1691 1723 1
+1691 1769 1
+1691 1836 1
+1691 1842 1
+1691 1908 1
+1691 1919 1
+1691 2117 1
+1691 2323 1
+1691 2328 1
+1691 2593 1
+1691 2657 1
+1691 2754 1
+1691 2775 1
+1691 2871 1
+1691 2909 1
+1691 2922 1
+1691 3000 1
+1691 3033 1
+1691 3150 1
+1691 3309 1
+1691 3338 1
+1691 3352 1
+1691 3489 1
+1691 3562 1
+1691 3807 1
+1691 4043 1
+1691 4247 1
+1691 4435 1
+1691 4981 1
+1691 5100 1
+1691 5178 1
+1691 5254 1
+1691 5463 1
+1691 5714 1
+1691 6151 1
+1691 6555 1
+1691 6914 1
+1691 7115 1
+1691 7862 1
+1691 7871 1
+1693 935 1
+1693 993 1
+1693 1566 1
+1693 1610 1
+1693 2062 1
+1693 2073 1
+1701 15 1
+1701 56 1
+1701 72 1
+1701 214 1
+1701 608 1
+1701 737 1
+1701 1026 1
+1701 1031 1
+1701 1035 1
+1701 1186 1
+1701 1360 1
+1701 1416 1
+1701 1473 1
+1701 1549 1
+1701 1621 1
+1701 1648 1
+1701 1700 1
+1701 1723 1
+1701 1734 1
+1701 1754 1
+1701 1847 1
+1701 1888 1
+1701 1919 1
+1701 1997 1
+1701 2120 1
+1701 2322 1
+1701 2328 1
+1701 2354 1
+1701 2381 1
+1701 2398 1
+1701 2440 1
+1701 2535 1
+1701 2585 1
+1701 2594 1
+1701 2595 1
+1701 2620 1
+1701 2625 1
+1701 2643 1
+1701 2686 1
+1701 2828 1
+1701 2973 1
+1701 2981 1
+1701 3002 1
+1701 3026 1
+1701 3029 1
+1701 3089 1
+1701 3238 1
+1701 3253 1
+1701 3260 1
+1701 3458 1
+1701 3516 1
+1701 3537 1
+1701 3586 1
+1701 3897 1
+1701 4037 1
+1701 4041 1
+1701 4071 1
+1701 4110 1
+1701 4276 1
+1701 4310 1
+1701 4338 1
+1701 4373 1
+1701 4483 1
+1701 4527 1
+1701 4551 1
+1701 4574 1
+1701 4578 1
+1701 4600 1
+1701 4709 1
+1701 4712 1
+1701 4715 1
+1701 4735 1
+1701 4795 1
+1701 4828 1
+1701 4899 1
+1701 5028 1
+1701 5079 1
+1701 5123 1
+1701 5148 1
+1701 5155 1
+1701 5188 1
+1701 5210 1
+1701 5226 1
+1701 5233 1
+1701 5254 1
+1701 5412 1
+1701 5445 1
+1701 5543 1
+1701 5584 1
+1701 5638 1
+1701 5671 1
+1701 5680 1
+1701 5714 1
+1701 5775 1
+1701 5828 1
+1701 6098 1
+1701 6156 1
+1701 6221 1
+1701 6229 1
+1701 6414 1
+1701 6496 1
+1701 6624 1
+1701 6723 1
+1701 6770 1
+1701 6833 1
+1701 6869 1
+1701 7131 1
+1701 7381 1
+1701 7763 1
+1701 7795 1
+1701 7855 1
+1701 7946 1
+1694 1701 1
+1695 1701 1
+1696 56 1
+1696 1622 1
+1696 1701 1
+1696 1893 1
+1697 15 1
+1697 285 1
+1697 608 1
+1697 633 1
+1697 762 1
+1697 873 1
+1697 993 1
+1697 1164 1
+1697 1186 1
+1697 1247 1
+1697 1385 1
+1697 1555 1
+1697 1633 1
+1697 1701 1
+1697 1808 1
+1697 1842 1
+1697 1849 1
+1697 1855 1
+1697 1859 1
+1697 1880 1
+1697 1935 1
+1697 1966 1
+1697 2072 1
+1697 2101 1
+1697 2182 1
+1697 2237 1
+1697 2252 1
+1697 2258 1
+1697 2328 1
+1697 2384 1
+1697 2397 1
+1697 2411 1
+1697 2484 1
+1697 2501 1
+1697 2508 1
+1697 2516 1
+1697 2535 1
+1697 2552 1
+1697 2576 1
+1697 2580 1
+1697 2643 1
+1697 2774 1
+1697 2790 1
+1697 2801 1
+1697 2838 1
+1697 2877 1
+1697 2923 1
+1697 3136 1
+1697 3164 1
+1697 3251 1
+1697 3408 1
+1697 3456 1
+1697 3473 1
+1697 3480 1
+1697 3681 1
+1697 3970 1
+1697 4349 1
+1697 4373 1
+1697 4530 1
+1697 4687 1
+1697 5176 1
+1697 5178 1
+1697 5335 1
+1697 5412 1
+1697 5449 1
+1697 5714 1
+1697 5732 1
+1697 5773 1
+1697 5817 1
+1697 6255 1
+1698 1701 1
+1699 1701 1
+1700 290 1
+1700 415 1
+1700 425 1
+1700 762 1
+1700 778 1
+1700 908 1
+1700 937 1
+1700 978 1
+1700 993 1
+1700 1012 1
+1700 1151 1
+1700 1297 1
+1700 1353 1
+1700 1385 1
+1700 1482 1
+1700 1496 1
+1700 1521 1
+1700 1555 1
+1700 1564 1
+1700 1585 1
+1700 1622 1
+1700 1697 1
+1700 1701 1
+1700 1714 1
+1700 1770 1
+1700 1772 1
+1700 1787 1
+1700 1816 1
+1700 1847 1
+1700 1893 1
+1700 1918 1
+1700 1953 1
+1700 1969 1
+1700 1985 1
+1700 1992 1
+1700 2066 1
+1700 2071 1
+1700 2073 1
+1700 2076 1
+1700 2117 1
+1700 2120 1
+1700 2128 1
+1700 2151 1
+1700 2178 1
+1700 2202 1
+1700 2244 1
+1700 2256 1
+1700 2322 1
+1700 2340 1
+1700 2366 1
+1700 2411 1
+1700 2416 1
+1700 2565 1
+1700 2571 1
+1700 2575 1
+1700 2579 1
+1700 2580 1
+1700 2585 1
+1700 2589 1
+1700 2607 1
+1700 2618 1
+1700 2638 1
+1700 2643 1
+1700 2646 1
+1700 2650 1
+1700 2665 1
+1700 2669 1
+1700 2751 1
+1700 2777 1
+1700 2781 1
+1700 2785 1
+1700 2794 1
+1700 2797 1
+1700 2801 1
+1700 2809 1
+1700 2814 1
+1700 2880 1
+1700 2946 1
+1700 3050 1
+1700 3136 1
+1700 3256 1
+1700 3276 1
+1700 3463 1
+1700 3616 1
+1700 3976 1
+1700 4191 1
+1700 4231 1
+1700 4441 1
+1700 4453 1
+1700 4735 1
+1700 5092 1
+1700 5886 1
+1700 8290 1
+1711 230 1
+1711 1151 1
+1711 1211 1
+1711 1697 1
+1711 1855 1
+1711 1956 1
+1711 2210 1
+1711 2328 1
+1711 3136 1
+1703 230 1
+1704 230 1
+1705 214 1
+1705 230 1
+1705 403 1
+1705 765 1
+1705 946 1
+1705 1297 1
+1705 1419 1
+1705 1542 1
+1705 1565 1
+1705 1566 1
+1705 1596 1
+1705 1707 1
+1705 1723 1
+1705 1808 1
+1705 1888 1
+1705 1919 1
+1705 2071 1
+1705 2102 1
+1705 2120 1
+1705 2241 1
+1705 2251 1
+1705 2256 1
+1705 2264 1
+1705 2322 1
+1705 2323 1
+1705 2375 1
+1705 2547 1
+1705 2560 1
+1705 2599 1
+1705 2707 1
+1705 2721 1
+1705 2805 1
+1705 2814 1
+1705 2815 1
+1705 2828 1
+1705 2834 1
+1705 2902 1
+1705 2922 1
+1705 2946 1
+1705 2955 1
+1705 2963 1
+1705 2968 1
+1705 2972 1
+1705 2993 1
+1705 2999 1
+1705 3029 1
+1705 3033 1
+1706 230 1
+1706 1705 1
+1706 2114 1
+1706 2955 1
+1707 72 1
+1707 230 1
+1707 993 1
+1707 1186 1
+1707 1211 1
+1707 1267 1
+1707 1285 1
+1707 1297 1
+1707 1384 1
+1707 1678 1
+1707 1697 1
+1707 1705 1
+1707 1723 1
+1707 1888 1
+1707 1977 1
+1707 2076 1
+1707 2116 1
+1707 2181 1
+1707 2362 1
+1707 2371 1
+1707 2398 1
+1707 2485 1
+1707 2570 1
+1707 2594 1
+1707 2790 1
+1707 2794 1
+1707 2805 1
+1707 2871 1
+1707 2955 1
+1707 3251 1
+1707 4055 1
+1707 4578 1
+1707 5465 1
+1707 7632 1
+1708 230 1
+1709 230 1
+1709 1031 1
+1709 1297 1
+1709 2409 1
+1709 2643 1
+1709 2794 1
+1710 230 1
+1712 1319 1
+1713 1319 1
+1714 993 1
+1714 1319 1
+1714 2137 1
+1714 2504 1
+1714 5335 1
+1715 1718 1
+1716 372 1
+1716 904 1
+1716 1718 1
+1716 1747 1
+1716 1920 1
+1716 2470 1
+1717 15 1
+1717 56 1
+1717 72 1
+1717 204 1
+1717 214 1
+1717 372 1
+1717 415 1
+1717 665 1
+1717 722 1
+1717 762 1
+1717 935 1
+1717 993 1
+1717 1164 1
+1717 1166 1
+1717 1185 1
+1717 1211 1
+1717 1261 1
+1717 1284 1
+1717 1297 1
+1717 1322 1
+1717 1357 1
+1717 1482 1
+1717 1585 1
+1717 1622 1
+1717 1658 1
+1717 1697 1
+1717 1718 1
+1717 1744 1
+1717 1752 1
+1717 1855 1
+1717 1858 1
+1717 1918 1
+1717 1956 1
+1717 1969 1
+1717 1973 1
+1717 1979 1
+1717 1987 1
+1717 2004 1
+1717 2053 1
+1717 2062 1
+1717 2066 1
+1717 2128 1
+1717 2157 1
+1717 2210 1
+1717 2281 1
+1717 2328 1
+1717 2339 1
+1717 2381 1
+1717 2397 1
+1717 2398 1
+1717 2411 1
+1717 2508 1
+1717 2535 1
+1717 2570 1
+1717 2575 1
+1717 2593 1
+1717 2625 1
+1717 2669 1
+1717 2674 1
+1717 2736 1
+1717 2754 1
+1717 2811 1
+1717 2877 1
+1717 2999 1
+1717 3007 1
+1717 3029 1
+1717 3136 1
+1717 3144 1
+1717 3321 1
+1717 3338 1
+1717 3352 1
+1717 3447 1
+1717 3498 1
+1717 3516 1
+1717 3587 1
+1717 3607 1
+1717 3614 1
+1717 3680 1
+1717 3873 1
+1717 3976 1
+1717 4037 1
+1717 4453 1
+1717 4735 1
+1717 5022 1
+1717 5254 1
+1717 5341 1
+1717 5780 1
+1717 6306 1
+1717 6337 1
+1717 6400 1
+1717 6599 1
+1717 7168 1
+1717 8083 1
+1717 8292 1
+1717 8294 1
+1717 8295 1
+1719 1031 1
+1719 1496 1
+1719 1596 1
+1719 1622 1
+1719 1726 1
+1719 1772 1
+1719 1965 1
+1719 2289 1
+1719 3117 1
+1719 4712 1
+1720 935 1
+1720 1285 1
+1720 1378 1
+1720 1453 1
+1720 1726 1
+1720 1965 1
+1720 2485 1
+1720 5103 1
+1720 5106 1
+1720 5922 1
+1720 5925 1
+1720 6227 1
+1720 6327 1
+1720 7860 1
+1721 1726 1
+1722 737 1
+1722 935 1
+1722 1378 1
+1722 1403 1
+1722 1726 1
+1722 1808 1
+1722 2079 1
+1722 5106 1
+1722 5563 1
+1722 5818 1
+1722 5925 1
+1722 6151 1
+1722 6227 1
+1722 7587 1
+1723 1726 1
+1688 825 1
+1688 935 1
+1688 1285 1
+1688 1378 1
+1688 1453 1
+1688 1723 1
+1688 1726 1
+1688 1965 1
+1688 1966 1
+1688 2485 1
+1688 2653 1
+1688 2871 1
+1688 2955 1
+1688 3144 1
+1688 3192 1
+1688 3537 1
+1688 4162 1
+1688 4179 1
+1688 4827 1
+1688 5106 1
+1688 5798 1
+1688 6227 1
+1688 6496 1
+1688 6739 1
+1688 8174 1
+1724 1726 1
+1725 1726 1
+1728 1716 1
+1729 214 1
+1729 1124 1
+1729 1200 1
+1729 1353 1
+1729 1754 1
+1729 1857 1
+1729 1888 1
+1729 1893 1
+1729 2014 1
+1729 2264 1
+1729 2348 1
+1729 2470 1
+1729 2535 1
+1729 2580 1
+1729 2856 1
+1729 3084 1
+1729 3265 1
+1729 4037 1
+1729 8290 1
+1732 559 1
+1732 904 1
+1732 1416 1
+1732 1487 1
+1732 1492 1
+1732 1730 1
+1732 1772 1
+1732 1805 1
+1732 1811 1
+1732 1893 1
+1732 1908 1
+1732 1956 1
+1732 2256 1
+1732 2474 1
+1732 2594 1
+1732 2651 1
+1732 2955 1
+1732 3307 1
+1730 15 1
+1730 425 1
+1730 559 1
+1730 762 1
+1730 993 1
+1730 1026 1
+1730 1166 1
+1730 1211 1
+1730 1549 1
+1730 1565 1
+1730 1732 1
+1730 1772 1
+1730 1859 1
+1730 2016 1
+1730 2072 1
+1730 2109 1
+1730 2246 1
+1730 2323 1
+1730 2328 1
+1730 2339 1
+1730 2348 1
+1730 2385 1
+1730 2397 1
+1730 2398 1
+1730 2400 1
+1730 2576 1
+1730 2579 1
+1730 2625 1
+1730 2643 1
+1730 2763 1
+1730 2871 1
+1730 3050 1
+1730 3253 1
+1730 3443 1
+1730 3804 1
+1730 3970 1
+1730 3976 1
+1730 4037 1
+1730 4110 1
+1730 4191 1
+1730 4199 1
+1730 4384 1
+1730 4735 1
+1730 6094 1
+1730 8294 1
+1731 1732 1
+1733 15 1
+1733 298 1
+1733 1247 1
+1733 1352 1
+1733 1482 1
+1733 1514 1
+1733 1549 1
+1733 1799 1
+1733 1816 1
+1733 1966 1
+1733 2364 1
+1733 2516 1
+1733 2651 1
+1733 2657 1
+1733 3015 1
+1733 3073 1
+1733 3089 1
+1733 3238 1
+1733 3334 1
+1733 3352 1
+1733 3433 1
+1733 3607 1
+1733 3970 1
+1733 4099 1
+1733 4335 1
+1733 4735 1
+1733 4786 1
+1733 4875 1
+1733 5210 1
+1733 5254 1
+1733 5449 1
+1733 5527 1
+1733 5714 1
+1733 5936 1
+1733 6337 1
+1733 6347 1
+1733 6481 1
+1733 6774 1
+1733 7143 1
+1733 7620 1
+1733 7632 1
+1733 7699 1
+1734 290 1
+1734 465 1
+1734 764 1
+1734 908 1
+1734 1151 1
+1734 1211 1
+1734 1322 1
+1734 1357 1
+1734 1378 1
+1734 1453 1
+1734 1521 1
+1734 1585 1
+1734 1633 1
+1734 1754 1
+1734 1808 1
+1734 1893 1
+1734 1918 1
+1734 1969 1
+1734 2066 1
+1734 2128 1
+1734 2241 1
+1734 2246 1
+1734 2328 1
+1734 2354 1
+1734 2398 1
+1734 2474 1
+1734 2485 1
+1734 2508 1
+1734 2535 1
+1734 2593 1
+1734 2595 1
+1734 2625 1
+1734 2696 1
+1734 2727 1
+1734 2912 1
+1734 3258 1
+1734 3265 1
+1734 3473 1
+1734 3537 1
+1734 4037 1
+1734 4043 1
+1734 4310 1
+1734 4335 1
+1734 4875 1
+1734 4929 1
+1734 4954 1
+1734 5002 1
+1734 5178 1
+1734 5233 1
+1734 5697 1
+1734 6462 1
+1734 6553 1
+1734 7632 1
+1734 7651 1
+1734 7961 1
+1735 1322 1
+1736 1199 1
+1737 1199 1
+1737 2799 1
+1737 3376 1
+1737 5178 1
+1737 5301 1
+1737 5624 1
+1737 5760 1
+1737 6098 1
+1737 6340 1
+1740 1199 1
+1738 1199 1
+1738 1811 1
+1738 2085 1
+1739 1199 1
+1741 214 1
+1741 1199 1
+1741 1419 1
+1741 1496 1
+1741 1723 1
+1741 2174 1
+1741 2322 1
+1741 2501 1
+1741 2877 1
+1746 1378 1
+1746 1744 1
+1746 1788 1
+1746 1848 1
+1746 1893 1
+1746 2237 1
+1746 8291 1
+1742 935 1
+1742 1411 1
+1742 1746 1
+1742 1780 1
+1742 1859 1
+1742 1901 1
+1743 1746 1
+1744 1297 1
+1744 1746 1
+1744 2508 1
+1744 2657 1
+1744 2900 1
+1744 3024 1
+1744 3435 1
+1744 3776 1
+1745 1746 1
+1747 2479 1
+1747 3452 1
+1747 3480 1
+1748 350 1
+1748 1026 1
+1748 1307 1
+1748 1453 1
+1748 1521 1
+1748 1549 1
+1748 1592 1
+1748 1637 1
+1748 1646 1
+1748 1747 1
+1748 1984 1
+1748 2237 1
+1748 2264 1
+1748 2398 1
+1748 2456 1
+1748 2506 1
+1748 2517 1
+1748 2565 1
+1748 2643 1
+1748 2665 1
+1748 2669 1
+1748 2774 1
+1748 2923 1
+1748 3009 1
+1748 3026 1
+1748 3030 1
+1748 3117 1
+1748 3191 1
+1748 3310 1
+1748 3334 1
+1748 3376 1
+1748 3394 1
+1748 3443 1
+1748 3452 1
+1748 3480 1
+1748 3548 1
+1748 3562 1
+1748 3635 1
+1748 3661 1
+1748 3755 1
+1748 3976 1
+1748 4013 1
+1748 4037 1
+1748 4103 1
+1748 4110 1
+1748 4179 1
+1748 4189 1
+1748 4191 1
+1748 4199 1
+1748 4351 1
+1748 4424 1
+1748 4463 1
+1748 4480 1
+1748 4500 1
+1748 4588 1
+1748 4605 1
+1748 4797 1
+1748 4815 1
+1748 5100 1
+1748 5115 1
+1748 5738 1
+1748 5817 1
+1748 5887 1
+1748 6006 1
+1748 6123 1
+1748 6320 1
+1748 6442 1
+1748 6634 1
+1748 6993 1
+1748 7386 1
+1748 7809 1
+1748 7890 1
+1748 7946 1
+1748 8249 1
+1748 8275 1
+1748 8291 1
+1749 64 1
+1749 856 1
+1749 859 1
+1749 904 1
+1749 1097 1
+1749 1297 1
+1749 1565 1
+1749 1633 1
+1749 1646 1
+1749 1783 1
+1749 1918 1
+1749 1919 1
+1749 1997 1
+1749 2062 1
+1749 2072 1
+1749 2145 1
+1749 2210 1
+1749 2231 1
+1749 2285 1
+1749 2329 1
+1749 2338 1
+1749 2398 1
+1749 2470 1
+1749 2490 1
+1749 2508 1
+1749 2576 1
+1749 2594 1
+1749 2604 1
+1749 2625 1
+1749 2643 1
+1749 2651 1
+1749 2653 1
+1749 2654 1
+1749 2662 1
+1749 2674 1
+1749 2700 1
+1749 2707 1
+1749 2713 1
+1749 2747 1
+1749 2754 1
+1749 2763 1
+1749 2859 1
+1749 2877 1
+1749 2912 1
+1749 2951 1
+1749 2991 1
+1749 2993 1
+1749 3020 1
+1749 3030 1
+1749 3033 1
+1749 3130 1
+1749 3173 1
+1749 3243 1
+1749 3260 1
+1749 3307 1
+1749 3435 1
+1749 3483 1
+1749 3516 1
+1749 3538 1
+1749 3562 1
+1749 3670 1
+1749 3755 1
+1749 3843 1
+1749 3926 1
+1749 3937 1
+1749 4021 1
+1749 8290 1
+1749 8293 1
+1758 1788 1
+1758 1802 1
+1753 1758 1
+1754 407 1
+1754 762 1
+1754 1185 1
+1754 1211 1
+1754 1496 1
+1754 1658 1
+1754 1729 1
+1754 1758 1
+1754 1893 1
+1754 1918 1
+1754 1956 1
+1754 2066 1
+1754 2117 1
+1754 2211 1
+1754 2240 1
+1754 2251 1
+1754 2345 1
+1754 2456 1
+1754 2625 1
+1754 2801 1
+1754 3371 1
+1754 3787 1
+1754 3958 1
+1755 1758 1
+1756 332 1
+1756 372 1
+1756 587 1
+1756 722 1
+1756 744 1
+1756 763 1
+1756 859 1
+1756 908 1
+1756 937 1
+1756 946 1
+1756 959 1
+1756 968 1
+1756 1000 1
+1756 1018 1
+1756 1061 1
+1756 1103 1
+1756 1186 1
+1756 1200 1
+1756 1230 1
+1756 1250 1
+1756 1261 1
+1756 1297 1
+1756 1315 1
+1756 1353 1
+1756 1390 1
+1756 1411 1
+1756 1492 1
+1756 1514 1
+1756 1534 1
+1756 1547 1
+1756 1550 1
+1756 1608 1
+1756 1622 1
+1756 1628 1
+1756 1658 1
+1756 1697 1
+1756 1700 1
+1756 1717 1
+1756 1749 1
+1756 1758 1
+1756 1780 1
+1756 1783 1
+1756 1787 1
+1756 1788 1
+1756 1791 1
+1756 1798 1
+1756 1802 1
+1756 1805 1
+1756 1811 1
+1756 1816 1
+1756 1835 1
+1756 1836 1
+1756 1842 1
+1756 1849 1
+1756 1859 1
+1756 1888 1
+1756 1901 1
+1756 1903 1
+1756 1908 1
+1756 1918 1
+1756 1964 1
+1756 1973 1
+1756 1977 1
+1756 2062 1
+1756 2071 1
+1756 2073 1
+1756 2145 1
+1756 2193 1
+1756 2240 1
+1756 2246 1
+1756 2253 1
+1756 2273 1
+1756 2332 1
+1756 2385 1
+1756 2397 1
+1756 2400 1
+1756 2426 1
+1756 2435 1
+1756 2470 1
+1756 2479 1
+1756 2517 1
+1756 2547 1
+1756 2560 1
+1756 2579 1
+1756 2955 1
+1756 2963 1
+1756 2966 1
+1756 2972 1
+1756 2977 1
+1757 993 1
+1757 1137 1
+1757 1628 1
+1757 1730 1
+1757 1758 1
+1757 1783 1
+1757 1788 1
+1757 1791 1
+1757 1849 1
+1757 1855 1
+1757 1857 1
+1757 1920 1
+1757 1973 1
+1757 2106 1
+1757 2151 1
+1757 8290 1
+1760 559 1
+1761 559 1
+1761 1770 1
+1762 559 1
+1762 1000 1
+1762 1493 1
+1762 1496 1
+1762 1555 1
+1762 1774 1
+1762 2160 1
+1762 2620 1
+1762 3297 1
+1762 3830 1
+1762 4065 1
+1762 4412 1
+1762 4441 1
+1762 4709 1
+1762 4712 1
+1762 4713 1
+1762 5254 1
+1762 5321 1
+1762 5596 1
+1762 5714 1
+1762 5811 1
+1762 5829 1
+1762 5871 1
+1762 6004 1
+1762 6221 1
+1762 6299 1
+1762 6347 1
+1762 6388 1
+1762 6560 1
+1762 6613 1
+1762 6632 1
+1762 6665 1
+1762 6699 1
+1762 6700 1
+1762 6725 1
+1762 6755 1
+1762 6770 1
+1762 6777 1
+1762 6788 1
+1762 6809 1
+1762 6832 1
+1762 6833 1
+1762 6850 1
+1762 7047 1
+1762 7647 1
+1762 8002 1
+1762 8297 1
+1763 1687 1
+1764 1564 1
+1764 1811 1
+1765 1407 1
+1765 1487 1
+1765 1849 1
+1765 1983 1
+1766 332 1
+1766 722 1
+1766 947 1
+1766 1018 1
+1766 1250 1
+1766 1297 1
+1766 1374 1
+1766 1496 1
+1766 1700 1
+1766 1768 1
+1766 1791 1
+1766 1835 1
+1766 1842 1
+1766 1964 1
+1766 2062 1
+1766 2182 1
+1766 2240 1
+1766 2290 1
+1766 2345 1
+1766 2397 1
+1766 2435 1
+1766 2470 1
+1766 2490 1
+1766 2517 1
+1766 2777 1
+1766 2955 1
+1766 8290 1
+1767 15 1
+1767 407 1
+1767 608 1
+1767 762 1
+1767 937 1
+1767 993 1
+1767 1097 1
+1767 1151 1
+1767 1164 1
+1767 1165 1
+1767 1200 1
+1767 1473 1
+1767 1496 1
+1767 1534 1
+1767 1628 1
+1767 1706 1
+1767 1768 1
+1767 1772 1
+1767 1774 1
+1767 1777 1
+1767 1780 1
+1767 1802 1
+1767 1811 1
+1767 1847 1
+1767 1915 1
+1767 1918 1
+1767 1919 1
+1767 2066 1
+1767 2097 1
+1767 2114 1
+1767 2209 1
+1767 2237 1
+1767 2256 1
+1767 2277 1
+1767 2328 1
+1767 2340 1
+1767 2381 1
+1767 2398 1
+1767 2411 1
+1767 2547 1
+1767 2576 1
+1767 2585 1
+1767 2620 1
+1767 2625 1
+1767 2654 1
+1767 2678 1
+1767 2686 1
+1767 2727 1
+1767 2775 1
+1767 2781 1
+1767 2794 1
+1767 2797 1
+1767 2809 1
+1767 2834 1
+1767 2900 1
+1767 2909 1
+1767 2932 1
+1767 2946 1
+1767 2955 1
+1767 2963 1
+1767 2991 1
+1767 3029 1
+1767 3033 1
+1767 3200 1
+1767 3291 1
+1767 3334 1
+1767 3338 1
+1767 3352 1
+1767 3408 1
+1767 3446 1
+1767 3473 1
+1767 3480 1
+1767 3541 1
+1767 3680 1
+1767 3803 1
+1767 3807 1
+1767 3813 1
+1767 3847 1
+1767 3926 1
+1767 3937 1
+1767 3946 1
+1767 4037 1
+1767 4110 1
+1767 4138 1
+1767 4191 1
+1767 4247 1
+1767 4290 1
+1767 4453 1
+1767 4828 1
+1767 5100 1
+1767 5233 1
+1767 5254 1
+1767 5714 1
+1767 6437 1
+1767 6496 1
+1767 7131 1
+1767 8293 1
+1770 1771 1
+1769 214 1
+1769 403 1
+1769 415 1
+1769 765 1
+1769 993 1
+1769 1151 1
+1769 1164 1
+1769 1211 1
+1769 1261 1
+1769 1284 1
+1769 1416 1
+1769 1549 1
+1769 1585 1
+1769 1680 1
+1769 1754 1
+1769 1770 1
+1769 1781 1
+1769 1965 1
+1769 1966 1
+1769 2102 1
+1769 2117 1
+1769 2120 1
+1769 2253 1
+1769 2371 1
+1769 2479 1
+1769 2504 1
+1769 2516 1
+1769 2517 1
+1769 2535 1
+1769 2547 1
+1769 2560 1
+1769 2571 1
+1769 2580 1
+1769 2587 1
+1769 2593 1
+1769 2617 1
+1769 2619 1
+1769 2625 1
+1769 2643 1
+1769 2654 1
+1769 2655 1
+1769 2697 1
+1769 2774 1
+1769 2785 1
+1769 2794 1
+1769 2828 1
+1769 2922 1
+1769 2968 1
+1769 3027 1
+1769 3117 1
+1769 3125 1
+1769 3253 1
+1769 3352 1
+1769 3376 1
+1769 3537 1
+1769 3615 1
+1769 3803 1
+1769 3898 1
+1769 4040 1
+1769 4043 1
+1769 4361 1
+1769 4712 1
+1769 5327 1
+1769 5680 1
+1769 6441 1
+1769 7478 1
+1769 7683 1
+1772 56 1
+1772 285 1
+1772 332 1
+1772 763 1
+1772 764 1
+1772 836 1
+1772 937 1
+1772 959 1
+1772 993 1
+1772 1012 1
+1772 1031 1
+1772 1103 1
+1772 1111 1
+1772 1137 1
+1772 1151 1
+1772 1164 1
+1772 1186 1
+1772 1243 1
+1772 1261 1
+1772 1297 1
+1772 1374 1
+1772 1378 1
+1772 1407 1
+1772 1492 1
+1772 1496 1
+1772 1514 1
+1772 1521 1
+1772 1549 1
+1772 1550 1
+1772 1555 1
+1772 1564 1
+1772 1585 1
+1772 1621 1
+1772 1622 1
+1772 1637 1
+1772 1646 1
+1772 1700 1
+1772 1723 1
+1772 1730 1
+1772 1757 1
+1772 1774 1
+1772 1780 1
+1772 1783 1
+1772 1787 1
+1772 1791 1
+1772 1798 1
+1772 1805 1
+1772 1811 1
+1772 1836 1
+1772 1842 1
+1772 1847 1
+1772 1859 1
+1772 1861 1
+1772 1864 1
+1772 1880 1
+1772 1884 1
+1772 1888 1
+1772 1893 1
+1772 1903 1
+1772 1918 1
+1772 1927 1
+1772 1955 1
+1772 1956 1
+1772 1964 1
+1772 1966 1
+1772 1977 1
+1772 1987 1
+1772 1992 1
+1772 1997 1
+1772 2066 1
+1772 2069 1
+1772 2071 1
+1772 2083 1
+1772 2095 1
+1772 2101 1
+1772 2106 1
+1772 2112 1
+1772 2117 1
+1772 2120 1
+1772 2121 1
+1772 2128 1
+1772 2151 1
+1772 2157 1
+1772 2168 1
+1772 2174 1
+1772 2178 1
+1772 2210 1
+1772 2246 1
+1772 2264 1
+1772 2294 1
+1772 2329 1
+1772 2333 1
+1772 2339 1
+1772 2341 1
+1772 2348 1
+1772 2397 1
+1772 2400 1
+1772 2409 1
+1772 2410 1
+1772 2423 1
+1772 2425 1
+1772 2490 1
+1772 2501 1
+1772 2504 1
+1772 2535 1
+1772 2580 1
+1772 2618 1
+1772 2619 1
+1772 2625 1
+1772 2638 1
+1772 2647 1
+1772 2670 1
+1772 2685 1
+1772 2720 1
+1772 2777 1
+1772 2785 1
+1772 2794 1
+1772 2797 1
+1772 2798 1
+1772 2801 1
+1772 2814 1
+1772 2877 1
+1772 2880 1
+1772 3024 1
+1772 3136 1
+1772 3258 1
+1772 3260 1
+1772 3650 1
+1772 3755 1
+1772 3812 1
+1772 3922 1
+1772 3933 1
+1772 3967 1
+1772 3970 1
+1772 3999 1
+1772 4021 1
+1772 4024 1
+1772 8290 1
+1772 8291 1
+1772 8292 1
+1772 8293 1
+1759 290 1
+1759 1411 1
+1759 1514 1
+1759 1780 1
+1759 1966 1
+1773 1774 1
+1777 2625 1
+1775 1777 1
+1778 1164 1
+1778 1780 1
+1778 1791 1
+1778 1819 1
+1778 1884 1
+1778 1920 1
+1778 1955 1
+1778 1966 1
+1781 1000 1
+1781 2114 1
+1781 2410 1
+1781 2507 1
+1781 2625 1
+1781 2657 1
+1782 1000 1
+1782 1781 1
+1751 15 1
+1751 56 1
+1751 204 1
+1751 214 1
+1751 290 1
+1751 417 1
+1751 608 1
+1751 665 1
+1751 1103 1
+1751 1549 1
+1751 1717 1
+1751 1730 1
+1751 1734 1
+1751 1787 1
+1751 1979 1
+1751 2016 1
+1751 2211 1
+1751 2252 1
+1751 2508 1
+1751 2535 1
+1751 2625 1
+1751 2651 1
+1751 2654 1
+1751 2951 1
+1751 3018 1
+1751 3180 1
+1751 3260 1
+1751 3307 1
+1751 3338 1
+1751 3371 1
+1751 3812 1
+1751 3887 1
+1751 3926 1
+1751 3937 1
+1751 4021 1
+1783 15 1
+1783 204 1
+1783 761 1
+1783 764 1
+1783 947 1
+1783 974 1
+1783 1035 1
+1783 1103 1
+1783 1353 1
+1783 1411 1
+1783 1416 1
+1783 1492 1
+1783 1542 1
+1783 1621 1
+1783 1700 1
+1783 1749 1
+1783 1754 1
+1783 1903 1
+1783 1918 1
+1783 1992 1
+1783 1997 1
+1783 2062 1
+1783 2066 1
+1783 2071 1
+1783 2120 1
+1783 2237 1
+1783 2241 1
+1783 2246 1
+1783 2251 1
+1783 2322 1
+1783 2398 1
+1783 2410 1
+1783 2474 1
+1783 2510 1
+1783 2585 1
+1783 2594 1
+1783 2618 1
+1783 2625 1
+1783 2653 1
+1783 2713 1
+1783 2746 1
+1783 2790 1
+1783 2805 1
+1783 3005 1
+1783 3030 1
+1783 3130 1
+1783 3260 1
+1783 3307 1
+1783 3464 1
+1783 3537 1
+1783 3562 1
+1783 3580 1
+1783 3748 1
+1783 4811 1
+1783 6148 1
+1783 6553 1
+1783 8290 1
+1784 1103 1
+1785 1103 1
+1789 1658 1
+1789 1783 1
+1789 1920 1
+1789 2144 1
+1789 2251 1
+1789 2787 1
+1789 3796 1
+1789 5452 1
+1789 5824 1
+1789 7833 1
+1789 7871 1
+1790 1791 1
+1790 2814 1
+1792 56 1
+1792 761 1
+1792 993 1
+1792 1034 1
+1792 1261 1
+1792 1284 1
+1792 1374 1
+1792 1521 1
+1792 1757 1
+1792 1787 1
+1792 1793 1
+1792 1805 1
+1792 1842 1
+1792 1857 1
+1792 1858 1
+1792 1861 1
+1792 1864 1
+1792 1908 1
+1792 1920 1
+1792 1973 1
+1792 1987 1
+1792 2055 1
+1792 2060 1
+1792 2073 1
+1792 2095 1
+1792 2157 1
+1792 2625 1
+1792 2754 1
+1792 2777 1
+1792 2801 1
+1792 8290 1
+1795 1157 1
+1795 1166 1
+1795 1357 1
+1795 1416 1
+1795 1453 1
+1795 1549 1
+1795 1571 1
+1795 1633 1
+1795 1717 1
+1795 1798 1
+1795 1805 1
+1795 1814 1
+1795 1919 1
+1795 2016 1
+1795 2210 1
+1795 2251 1
+1795 2290 1
+1795 2324 1
+1795 2364 1
+1795 2510 1
+1795 2542 1
+1795 2700 1
+1795 2747 1
+1795 2809 1
+1795 2811 1
+1795 2819 1
+1795 2912 1
+1795 2973 1
+1795 3020 1
+1795 3258 1
+1795 3265 1
+1795 3284 1
+1795 3352 1
+1795 3393 1
+1795 3408 1
+1795 3439 1
+1795 3843 1
+1795 4043 1
+1795 5073 1
+1795 5083 1
+1795 5092 1
+1795 5773 1
+1795 5814 1
+1795 7186 1
+679 214 1
+679 407 1
+679 1798 1
+1796 1798 1
+1796 1982 1
+1796 2160 1
+1796 2440 1
+1796 3459 1
+1796 3614 1
+1796 3897 1
+1796 4099 1
+1796 4483 1
+1796 4536 1
+1796 4717 1
+1796 4748 1
+1796 4795 1
+1796 5200 1
+1796 5210 1
+1796 5254 1
+1796 5273 1
+1796 5524 1
+1796 5684 1
+1796 5697 1
+1796 5739 1
+1796 5814 1
+1796 5871 1
+1796 5980 1
+1796 6221 1
+1796 6270 1
+1796 6305 1
+1796 6327 1
+1796 6505 1
+1796 6552 1
+1796 6560 1
+1796 6736 1
+1796 6739 1
+1796 6774 1
+1796 6832 1
+1796 7094 1
+1796 7168 1
+1796 8297 1
+1797 1798 1
+1799 1357 1
+1799 1628 1
+1799 1966 1
+1799 2223 1
+1799 2516 1
+1799 2535 1
+1799 2565 1
+1799 2576 1
+1799 2655 1
+1799 2697 1
+1799 2790 1
+1799 2912 1
+1799 3452 1
+1799 3456 1
+1799 3498 1
+1799 3796 1
+1799 3803 1
+1799 3830 1
+1799 3969 1
+1799 3970 1
+1799 4043 1
+1799 4058 1
+1799 4662 1
+1799 4735 1
+1799 4792 1
+1799 4981 1
+1799 5178 1
+1799 5412 1
+1799 5459 1
+1799 5463 1
+1799 5545 1
+1799 5563 1
+1799 5569 1
+1799 5684 1
+1799 5693 1
+1799 5798 1
+1799 5804 1
+1799 5814 1
+1799 5950 1
+1799 6044 1
+1799 6221 1
+1799 6555 1
+1799 6595 1
+1799 6665 1
+1799 6715 1
+1799 7012 1
+1799 7809 1
+1799 7908 1
+1800 15 1
+1800 993 1
+1800 1111 1
+1800 1151 1
+1800 1186 1
+1800 1493 1
+1800 1628 1
+1800 1787 1
+1800 1836 1
+1800 1842 1
+1800 1858 1
+1800 1908 1
+1800 2246 1
+1800 2479 1
+1800 2774 1
+1800 4175 1
+1800 6334 1
+1800 6496 1
+1800 6715 1
+1800 8291 1
+1811 722 1
+1811 762 1
+1811 859 1
+1811 1031 1
+1811 1097 1
+1811 1267 1
+1811 1297 1
+1811 1352 1
+1811 1393 1
+1811 1473 1
+1811 1633 1
+1811 1648 1
+1811 1973 1
+1811 2001 1
+1811 2114 1
+1811 2160 1
+1811 2240 1
+1811 2332 1
+1811 2371 1
+1811 2625 1
+1811 2643 1
+1811 2651 1
+1811 2654 1
+1811 2693 1
+1811 3238 1
+1811 3266 1
+1811 3307 1
+1811 3629 1
+1811 3634 1
+1811 4349 1
+1811 4536 1
+1811 4574 1
+1811 4632 1
+1811 5028 1
+1811 5445 1
+1811 5891 1
+1811 6151 1
+1811 6328 1
+1811 6699 1
+1811 7092 1
+1811 7280 1
+1811 7587 1
+1811 7910 1
+1803 762 1
+1803 859 1
+1803 974 1
+1803 993 1
+1803 1164 1
+1803 1549 1
+1803 1613 1
+1803 1811 1
+1803 1842 1
+1803 1919 1
+1803 2071 1
+1803 2109 1
+1803 2168 1
+1803 2697 1
+1803 3002 1
+1803 3537 1
+1803 4297 1
+1803 6226 1
+1803 8290 1
+1804 1811 1
+1805 1811 1
+1805 1893 1
+1806 1811 1
+1807 1811 1
+1807 2354 1
+1807 3059 1
+1807 3796 1
+1807 4247 1
+1807 4653 1
+1807 5484 1
+1807 5511 1
+1808 72 1
+1808 465 1
+1808 722 1
+1808 762 1
+1808 765 1
+1808 946 1
+1808 993 1
+1808 1049 1
+1808 1097 1
+1808 1111 1
+1808 1164 1
+1808 1230 1
+1808 1284 1
+1808 1285 1
+1808 1353 1
+1808 1378 1
+1808 1384 1
+1808 1385 1
+1808 1407 1
+1808 1419 1
+1808 1482 1
+1808 1492 1
+1808 1514 1
+1808 1521 1
+1808 1549 1
+1808 1564 1
+1808 1566 1
+1808 1585 1
+1808 1608 1
+1808 1621 1
+1808 1622 1
+1808 1680 1
+1808 1700 1
+1808 1705 1
+1808 1717 1
+1808 1723 1
+1808 1734 1
+1808 1772 1
+1808 1783 1
+1808 1805 1
+1808 1811 1
+1808 1816 1
+1808 1847 1
+1808 1888 1
+1808 1919 1
+1808 1927 1
+1808 1969 1
+1808 1977 1
+1808 1992 1
+1808 2004 1
+1808 2066 1
+1808 2106 1
+1808 2117 1
+1808 2120 1
+1808 2121 1
+1808 2145 1
+1808 2157 1
+1808 2174 1
+1808 2195 1
+1808 2234 1
+1808 2256 1
+1808 2297 1
+1808 2328 1
+1808 2375 1
+1808 2385 1
+1808 2410 1
+1808 2475 1
+1808 2485 1
+1808 2510 1
+1808 2517 1
+1808 2535 1
+1808 2542 1
+1808 2547 1
+1808 2560 1
+1808 2576 1
+1808 2579 1
+1808 2587 1
+1808 2589 1
+1808 2591 1
+1808 2595 1
+1808 2599 1
+1808 2604 1
+1808 2605 1
+1808 2629 1
+1808 2645 1
+1808 2646 1
+1808 2651 1
+1808 2652 1
+1808 2669 1
+1808 2708 1
+1808 2751 1
+1808 2794 1
+1808 2834 1
+1808 2900 1
+1808 2922 1
+1808 2955 1
+1808 2963 1
+1808 3028 1
+1808 3130 1
+1808 3136 1
+1808 3320 1
+1808 3352 1
+1808 3404 1
+1808 3408 1
+1808 3498 1
+1808 3516 1
+1808 3976 1
+1808 4103 1
+1808 4124 1
+1808 4191 1
+1808 4256 1
+1808 4338 1
+1808 4453 1
+1808 4735 1
+1808 5215 1
+1808 5254 1
+1808 5271 1
+1808 5296 1
+1808 5459 1
+1808 5482 1
+1808 5683 1
+1808 5714 1
+1808 5721 1
+1808 5947 1
+1808 5969 1
+1808 5980 1
+1808 8290 1
+1808 8291 1
+1808 8293 1
+1809 1811 1
+1809 1859 1
+1810 1811 1
+1812 1261 1
+1812 1842 1
+1812 1855 1
+1812 3371 1
+1813 465 1
+1813 825 1
+1813 1261 1
+1813 1549 1
+1813 1688 1
+1813 1842 1
+1813 2144 1
+1813 2145 1
+1813 2210 1
+1813 2535 1
+1813 2655 1
+1813 2746 1
+1813 2760 1
+1813 2871 1
+1813 3014 1
+1813 3024 1
+1813 3026 1
+1813 3028 1
+1813 3034 1
+1813 3117 1
+1813 3125 1
+1813 3144 1
+1813 3260 1
+1813 3321 1
+1813 3439 1
+1813 3453 1
+1813 3454 1
+1813 3557 1
+1813 3800 1
+1813 3812 1
+1813 3956 1
+1813 3967 1
+1813 4011 1
+1813 4021 1
+1813 4024 1
+1813 4051 1
+1813 4072 1
+1813 4531 1
+1813 4552 1
+1813 4578 1
+1813 7279 1
+1814 290 1
+1814 737 1
+1814 762 1
+1814 856 1
+1814 993 1
+1814 1261 1
+1814 1291 1
+1814 1315 1
+1814 1357 1
+1814 1393 1
+1814 1416 1
+1814 1596 1
+1814 1734 1
+1814 1754 1
+1814 1781 1
+1814 1919 1
+1814 2001 1
+1814 2134 1
+1814 2225 1
+1814 2251 1
+1814 2256 1
+1814 2276 1
+1814 2323 1
+1814 2440 1
+1814 2547 1
+1814 2550 1
+1814 2560 1
+1814 2593 1
+1814 2594 1
+1814 2620 1
+1814 2625 1
+1814 2651 1
+1814 2653 1
+1814 2654 1
+1814 2657 1
+1814 2660 1
+1814 2697 1
+1814 2707 1
+1814 2721 1
+1814 2724 1
+1814 2775 1
+1814 2815 1
+1814 2830 1
+1814 2856 1
+1814 2900 1
+1814 2955 1
+1814 2963 1
+1814 2966 1
+1814 2968 1
+1814 2972 1
+1814 2977 1
+1814 2979 1
+1814 2981 1
+1814 2991 1
+1814 2993 1
+1814 2999 1
+1814 3029 1
+1814 3033 1
+1814 3034 1
+1814 3050 1
+1814 3056 1
+1814 3099 1
+1814 3117 1
+1814 3130 1
+1814 3140 1
+1814 3150 1
+1814 3253 1
+1814 3291 1
+1814 3334 1
+1814 3456 1
+1814 3459 1
+1814 3516 1
+1814 3645 1
+1814 3720 1
+1814 3842 1
+1814 4117 1
+1814 4299 1
+1814 4422 1
+1814 4777 1
+1814 4944 1
+1814 5210 1
+1814 5305 1
+1814 5412 1
+1814 5454 1
+1814 5737 1
+1814 5798 1
+1814 5819 1
+1814 5902 1
+1814 6001 1
+1814 6004 1
+1814 6023 1
+1814 6124 1
+1814 6421 1
+1814 6462 1
+1814 6566 1
+1814 7168 1
+1814 7553 1
+1814 7699 1
+1814 8186 1
+1814 8192 1
+1814 8219 1
+1814 8224 1
+1814 8237 1
+1814 8293 1
+1814 8294 1
+1816 1151 1
+1816 1482 1
+1816 2066 1
+1816 2256 1
+1816 2625 1
+1816 3755 1
+1816 4335 1
+1816 5146 1
+1816 7620 1
+1816 8290 1
+1820 56 1
+1820 204 1
+1820 290 1
+1820 350 1
+1820 425 1
+1820 762 1
+1820 946 1
+1820 993 1
+1820 1097 1
+1820 1166 1
+1820 1211 1
+1820 1267 1
+1820 1291 1
+1820 1297 1
+1820 1357 1
+1820 1374 1
+1820 1419 1
+1820 1492 1
+1820 1514 1
+1820 1521 1
+1820 1621 1
+1820 1633 1
+1820 1646 1
+1820 1653 1
+1820 1734 1
+1820 1754 1
+1820 1792 1
+1820 1808 1
+1820 1814 1
+1820 1888 1
+1820 1918 1
+1820 1919 1
+1820 1956 1
+1820 1992 1
+1820 2053 1
+1820 2062 1
+1820 2102 1
+1820 2117 1
+1820 2120 1
+1820 2128 1
+1820 2225 1
+1820 2231 1
+1820 2256 1
+1820 2290 1
+1820 2297 1
+1820 2322 1
+1820 2323 1
+1820 2328 1
+1820 2333 1
+1820 2338 1
+1820 2366 1
+1820 2400 1
+1820 2411 1
+1820 2426 1
+1820 2499 1
+1820 2508 1
+1820 2510 1
+1820 2585 1
+1820 2593 1
+1820 2594 1
+1820 2599 1
+1820 2625 1
+1820 2643 1
+1820 2645 1
+1820 2654 1
+1820 2660 1
+1820 2665 1
+1820 2685 1
+1820 2686 1
+1820 2693 1
+1820 2697 1
+1820 2727 1
+1820 2736 1
+1820 2754 1
+1820 2814 1
+1820 2838 1
+1820 2856 1
+1820 2963 1
+1820 2991 1
+1820 3089 1
+1820 3117 1
+1820 3253 1
+1820 3276 1
+1820 3404 1
+1820 3557 1
+1820 3650 1
+1820 3807 1
+1820 3892 1
+1820 3903 1
+1820 8292 1
+1821 1514 1
+1821 1633 1
+1821 3117 1
+1821 3516 1
+1821 3548 1
+1821 3669 1
+1821 8291 1
+1822 407 1
+1822 1164 1
+1822 1230 1
+1822 1514 1
+1822 1585 1
+1822 1880 1
+1822 1893 1
+1822 1903 1
+1822 1908 1
+1822 1966 1
+1822 2073 1
+1823 737 1
+1823 763 1
+1823 765 1
+1823 935 1
+1823 1035 1
+1823 1353 1
+1823 1444 1
+1823 1498 1
+1823 1514 1
+1823 1717 1
+1823 1749 1
+1823 1805 1
+1823 1842 1
+1823 1855 1
+1823 1858 1
+1823 1893 1
+1823 1953 1
+1823 1956 1
+1823 1963 1
+1823 2128 1
+1823 2381 1
+1823 2511 1
+1823 2565 1
+1823 2822 1
+1823 3456 1
+1823 3460 1
+1823 3830 1
+1823 4065 1
+1823 4247 1
+1823 4315 1
+1823 4587 1
+1823 4600 1
+1823 4706 1
+1823 4824 1
+1823 5130 1
+1823 5188 1
+1823 5262 1
+1823 5423 1
+1823 5439 1
+1823 5651 1
+1823 5804 1
+1823 5819 1
+1823 6170 1
+1823 6272 1
+1823 6715 1
+1823 6860 1
+1823 6979 1
+1823 7116 1
+1823 7707 1
+1825 1842 1
+1826 1842 1
+1827 1842 1
+1827 2856 1
+347 407 1
+347 1165 1
+347 1842 1
+347 1855 1
+347 1920 1
+347 1950 1
+347 1953 1
+347 1956 1
+1835 15 1
+1835 762 1
+1835 959 1
+1835 974 1
+1835 1012 1
+1835 1035 1
+1835 1186 1
+1835 1200 1
+1835 1211 1
+1835 1315 1
+1835 1374 1
+1835 1407 1
+1835 1416 1
+1835 1492 1
+1835 1592 1
+1835 1792 1
+1835 1842 1
+1835 1918 1
+1835 2066 1
+1835 2160 1
+1835 2210 1
+1835 2240 1
+1835 2297 1
+1835 2322 1
+1835 2323 1
+1835 2398 1
+1835 2504 1
+1835 2506 1
+1835 2508 1
+1835 2535 1
+1835 2542 1
+1835 2547 1
+1835 2560 1
+1835 2576 1
+1835 2587 1
+1835 2625 1
+1835 2660 1
+1835 2707 1
+1835 2754 1
+1835 2770 1
+1835 2828 1
+1835 2830 1
+1835 2834 1
+1835 2993 1
+1835 2996 1
+1835 3002 1
+1835 3148 1
+1835 3352 1
+1835 3456 1
+1835 3458 1
+1835 3892 1
+1835 4110 1
+1835 4247 1
+1835 4338 1
+1835 4424 1
+1835 4468 1
+1835 4632 1
+1835 5100 1
+1835 5210 1
+1835 5254 1
+1835 5714 1
+1835 5799 1
+1835 5828 1
+1835 6000 1
+1835 6229 1
+1835 6437 1
+1835 6634 1
+1835 6833 1
+1835 6840 1
+1835 6930 1
+1835 7115 1
+1835 8141 1
+1835 8294 1
+1836 214 1
+1836 407 1
+1836 722 1
+1836 859 1
+1836 908 1
+1836 959 1
+1836 1151 1
+1836 1165 1
+1836 1211 1
+1836 1297 1
+1836 1585 1
+1836 1608 1
+1836 1622 1
+1836 1842 1
+1836 1956 1
+1836 2193 1
+1828 1842 1
+1828 1849 1
+1837 290 1
+1837 836 1
+1837 993 1
+1837 1137 1
+1837 1315 1
+1837 1407 1
+1837 1542 1
+1837 1566 1
+1837 1754 1
+1837 1842 1
+1837 1919 1
+1837 2060 1
+1837 2073 1
+1837 2076 1
+1837 2091 1
+1837 2119 1
+1837 2168 1
+1837 2205 1
+1837 2251 1
+1837 2371 1
+1837 2593 1
+1837 2617 1
+1837 2654 1
+1837 2697 1
+1837 2963 1
+1837 3033 1
+1837 3034 1
+1837 3104 1
+1829 1717 1
+1829 1842 1
+1838 761 1
+1838 764 1
+1838 825 1
+1838 836 1
+1838 908 1
+1838 937 1
+1838 993 1
+1838 1137 1
+1838 1239 1
+1838 1285 1
+1838 1407 1
+1838 1585 1
+1838 1622 1
+1838 1707 1
+1838 1714 1
+1838 1730 1
+1838 1757 1
+1838 1772 1
+1838 1842 1
+1838 1849 1
+1838 1893 1
+1838 1953 1
+1838 1969 1
+1838 1973 1
+1838 1991 1
+1838 1992 1
+1838 2060 1
+1838 2066 1
+1838 2071 1
+1838 2073 1
+1838 2079 1
+1838 2095 1
+1838 2097 1
+1838 2101 1
+1838 2106 1
+1838 2109 1
+1838 2112 1
+1838 2128 1
+1838 2151 1
+1838 2157 1
+1838 2168 1
+1838 2178 1
+1838 2210 1
+1838 2859 1
+1838 2958 1
+1838 3258 1
+1838 3562 1
+1838 3631 1
+1838 3787 1
+1838 4013 1
+1838 4088 1
+1838 4110 1
+1838 4201 1
+1838 4233 1
+1838 8290 1
+1838 8293 1
+1838 8294 1
+1830 1542 1
+1830 1842 1
+1830 1855 1
+1831 1542 1
+1831 1842 1
+1831 1855 1
+1832 1805 1
+1832 1842 1
+1832 2210 1
+1832 2746 1
+1832 2819 1
+1832 8293 1
+1833 1842 1
+1833 1855 1
+1833 2112 1
+1833 2654 1
+1833 3164 1
+1833 4247 1
+1834 1842 1
+1839 1842 1
+1840 1842 1
+1840 1855 1
+1841 1842 1
+1849 1211 1
+1844 1849 1
+1845 1849 1
+1846 1849 1
+1847 15 1
+1847 285 1
+1847 761 1
+1847 959 1
+1847 993 1
+1847 1411 1
+1847 1787 1
+1847 1849 1
+1847 1893 1
+1847 1903 1
+1847 1908 1
+1847 1953 1
+1847 1973 1
+1847 2066 1
+1847 2178 1
+1847 2324 1
+1847 2354 1
+1847 2398 1
+1847 2510 1
+1847 2625 1
+1847 2693 1
+1847 2747 1
+1847 2790 1
+1847 2973 1
+1847 3103 1
+1847 3130 1
+1847 3460 1
+1847 3897 1
+1847 3910 1
+1847 4099 1
+1847 4191 1
+1847 4400 1
+1847 4712 1
+1847 4735 1
+1847 4811 1
+1847 5132 1
+1847 5188 1
+1847 5208 1
+1847 5254 1
+1847 5392 1
+1847 5412 1
+1847 5449 1
+1847 5827 1
+1847 6552 1
+1847 6566 1
+1847 7146 1
+1847 7168 1
+1852 1849 1
+1848 204 1
+1848 762 1
+1848 836 1
+1848 1211 1
+1848 1787 1
+1848 1849 1
+1848 2053 1
+1848 2062 1
+1848 2102 1
+1848 2256 1
+1848 2328 1
+1848 2754 1
+1848 2763 1
+1848 2880 1
+1848 3089 1
+1848 3680 1
+1853 1849 1
+1859 3443 1
+1859 4037 1
+1859 4071 1
+1855 1111 1
+1855 1622 1
+1855 1697 1
+1855 1859 1
+1855 1893 1
+1855 1927 1
+1855 1956 1
+1855 1963 1
+1855 2237 1
+1855 2856 1
+1855 3136 1
+1855 3408 1
+1856 1859 1
+1857 407 1
+1857 1230 1
+1857 1859 1
+1857 2307 1
+1857 2785 1
+1857 2787 1
+1857 8290 1
+1857 8291 1
+1858 1859 1
+1860 1859 1
+1862 290 1
+1862 1864 1
+1865 1411 1
+1865 4666 1
+1865 5814 1
+1865 6560 1
+1865 7052 1
+1865 7386 1
+1866 1411 1
+1867 1411 1
+1867 1865 1
+1868 764 1
+1868 836 1
+1868 975 1
+1868 1378 1
+1868 1411 1
+1868 1444 1
+1868 1583 1
+1868 1613 1
+1868 1714 1
+1868 1749 1
+1868 1783 1
+1868 1787 1
+1868 1848 1
+1868 1985 1
+1868 2071 1
+1868 2085 1
+1868 2091 1
+1868 2128 1
+1868 2210 1
+1868 2211 1
+1868 2241 1
+1868 2253 1
+1869 1717 1
+1869 2062 1
+1869 3680 1
+1870 1717 1
+1874 1026 1
+1874 1717 1
+1874 3192 1
+1874 3835 1
+1874 4276 1
+1874 5254 1
+1874 5452 1
+1874 5511 1
+1874 6229 1
+1875 56 1
+1875 204 1
+1875 1166 1
+1875 1393 1
+1875 1705 1
+1875 1717 1
+1875 1730 1
+1875 1837 1
+1875 2102 1
+1875 2174 1
+1875 2225 1
+1875 2256 1
+1875 2264 1
+1875 2565 1
+1875 2619 1
+1875 2625 1
+1875 2686 1
+1875 2693 1
+1875 2794 1
+1875 2809 1
+1875 2825 1
+1875 2828 1
+1875 2928 1
+1875 2996 1
+1875 3029 1
+1875 3130 1
+1875 3193 1
+1875 3410 1
+1875 3717 1
+1875 3903 1
+1875 4269 1
+1875 4289 1
+1875 4735 1
+1871 1717 1
+1872 935 1
+1872 1297 1
+1872 1717 1
+1872 2485 1
+1872 3529 1
+1876 1111 1
+1876 1717 1
+1876 5254 1
+1873 1717 1
+1879 1880 1
+1879 2120 1
+1879 3885 1
+1879 5002 1
+1879 5423 1
+1879 6123 1
+1879 6305 1
+1879 6417 1
+1879 6442 1
+1879 6765 1
+1879 7414 1
+1879 7422 1
+1879 7624 1
+1881 935 1
+1882 935 1
+1883 935 1
+1885 407 1
+1885 762 1
+1885 765 1
+1885 856 1
+1885 1097 1
+1885 1297 1
+1885 1357 1
+1885 1482 1
+1885 1534 1
+1885 1549 1
+1885 1777 1
+1885 1893 1
+1885 1908 1
+1885 2016 1
+1885 2102 1
+1885 2114 1
+1885 2135 1
+1885 2210 1
+1885 2225 1
+1885 2231 1
+1885 2256 1
+1885 2257 1
+1885 2322 1
+1885 2475 1
+1885 2485 1
+1885 2535 1
+1885 2587 1
+1885 2593 1
+1885 2617 1
+1885 2619 1
+1885 2625 1
+1885 2655 1
+1885 2657 1
+1885 2697 1
+1885 2713 1
+1885 2809 1
+1885 2932 1
+1885 3130 1
+1885 3136 1
+1885 3155 1
+1885 3404 1
+1885 3453 1
+1885 3650 1
+1885 3892 1
+1886 1211 1
+1886 1697 1
+1886 1893 1
+1886 2091 1
+1887 763 1
+1887 1893 1
+1888 764 1
+1888 873 1
+1888 978 1
+1888 993 1
+1888 1031 1
+1888 1243 1
+1888 1613 1
+1888 1646 1
+1888 1893 1
+1888 1956 1
+1888 1977 1
+1888 2102 1
+1888 2128 1
+1888 2145 1
+1888 2157 1
+1888 2163 1
+1888 2205 1
+1888 2210 1
+1888 2211 1
+1888 2253 1
+1888 2276 1
+1888 2323 1
+1888 2329 1
+1888 2339 1
+1888 2341 1
+1888 2350 1
+1888 2410 1
+1888 2781 1
+1888 2794 1
+1888 3843 1
+1888 4043 1
+1888 4055 1
+1888 5321 1
+1888 5412 1
+1888 8290 1
+1888 8291 1
+1889 1893 1
+1891 415 1
+1891 762 1
+1891 993 1
+1891 1049 1
+1891 1097 1
+1891 1186 1
+1891 1211 1
+1891 1230 1
+1891 1250 1
+1891 1384 1
+1891 1633 1
+1891 1678 1
+1891 1893 1
+1891 1992 1
+1891 2102 1
+1891 2195 1
+1891 2205 1
+1891 2504 1
+1891 2580 1
+1891 2618 1
+1891 2619 1
+1891 2625 1
+1891 2724 1
+1891 2770 1
+1891 2923 1
+1891 2977 1
+1891 3568 1
+1891 3807 1
+1891 3976 1
+1891 4021 1
+1891 4256 1
+1891 5083 1
+1891 5144 1
+1891 5539 1
+1891 5784 1
+1891 8293 1
+1892 407 1
+1892 1893 1
+1892 1953 1
+1892 1963 1
+1892 1969 1
+1894 1534 1
+1895 1534 1
+1896 285 1
+1896 290 1
+1896 403 1
+1896 836 1
+1896 947 1
+1896 1035 1
+1896 1211 1
+1896 1297 1
+1896 1315 1
+1896 1374 1
+1896 1390 1
+1896 1498 1
+1896 1534 1
+1896 1549 1
+1896 1956 1
+1896 2066 1
+1896 2109 1
+1896 2144 1
+1896 2324 1
+1896 2345 1
+1896 2348 1
+1896 2516 1
+1896 2576 1
+1896 2650 1
+1896 2651 1
+1896 2696 1
+1896 2700 1
+1896 2805 1
+1896 3021 1
+1896 3092 1
+1896 3099 1
+1896 3117 1
+1896 3253 1
+1896 3309 1
+1896 3435 1
+1896 3748 1
+1896 3807 1
+1896 3887 1
+1896 4037 1
+1896 4266 1
+1896 4536 1
+1896 4547 1
+1896 6001 1
+1896 6327 1
+1896 6699 1
+1896 7144 1
+1896 7553 1
+1896 7707 1
+1896 8237 1
+1896 8290 1
+1896 8293 1
+1897 763 1
+1901 3847 1
+1899 1165 1
+1899 1230 1
+1899 1284 1
+1899 1901 1
+1899 2066 1
+1899 3516 1
+1900 1901 1
+1902 1903 1
+1908 993 1
+1908 1137 1
+1908 1164 1
+1908 1315 1
+1908 1566 1
+1908 1858 1
+1908 1927 1
+1908 1963 1
+1908 2333 1
+1905 1908 1
+1906 1908 1
+1907 1908 1
+1909 1908 1
+1911 1908 1
+1912 1908 1
+1912 3026 1
+1912 3059 1
+1913 1908 1
+1914 1658 1
+1914 5445 1
+1915 15 1
+1915 1658 1
+1915 2237 1
+1915 2354 1
+1915 2398 1
+1915 2516 1
+1915 2535 1
+1915 3089 1
+1915 3456 1
+1915 4310 1
+1915 4587 1
+1915 4875 1
+1915 5083 1
+1915 5100 1
+1915 5106 1
+1915 5121 1
+1915 5148 1
+1915 5200 1
+1915 5233 1
+1915 5262 1
+1915 5412 1
+1915 5459 1
+1915 5487 1
+1915 5527 1
+1915 5543 1
+1915 5891 1
+1915 6148 1
+1915 6161 1
+1915 6246 1
+1915 6251 1
+1915 6306 1
+1915 6328 1
+1915 8295 1
+1916 1658 1
+1917 1658 1
+1918 764 1
+1918 1211 1
+1918 1297 1
+1918 1492 1
+1918 1542 1
+1918 1565 1
+1918 1700 1
+1918 1920 1
+1918 1977 1
+1918 1992 1
+1918 2062 1
+1918 2066 1
+1918 2117 1
+1918 2322 1
+1918 2411 1
+1918 2958 1
+1918 3005 1
+1918 3014 1
+1918 3200 1
+1918 4072 1
+1919 56 1
+1919 214 1
+1919 290 1
+1919 332 1
+1919 403 1
+1919 407 1
+1919 415 1
+1919 587 1
+1919 665 1
+1919 764 1
+1919 765 1
+1919 836 1
+1919 859 1
+1919 908 1
+1919 937 1
+1919 946 1
+1919 947 1
+1919 959 1
+1919 975 1
+1919 1061 1
+1919 1151 1
+1919 1200 1
+1919 1211 1
+1919 1243 1
+1919 1284 1
+1919 1353 1
+1919 1374 1
+1919 1378 1
+1919 1390 1
+1919 1419 1
+1919 1482 1
+1919 1521 1
+1919 1542 1
+1919 1547 1
+1919 1550 1
+1919 1566 1
+1919 1583 1
+1919 1585 1
+1919 1608 1
+1919 1613 1
+1919 1622 1
+1919 1697 1
+1919 1714 1
+1919 1734 1
+1919 1749 1
+1919 1757 1
+1919 1783 1
+1919 1787 1
+1919 1816 1
+1919 1836 1
+1919 1842 1
+1919 1848 1
+1919 1888 1
+1919 1920 1
+1919 1964 1
+1919 1973 1
+1919 1977 1
+1919 1979 1
+1919 1983 1
+1919 1985 1
+1919 1987 1
+1919 1997 1
+1919 2007 1
+1919 2055 1
+1919 2060 1
+1919 2062 1
+1919 2066 1
+1919 2069 1
+1919 2071 1
+1919 2073 1
+1919 2085 1
+1919 2091 1
+1919 2119 1
+1919 2120 1
+1919 2137 1
+1919 2145 1
+1919 2157 1
+1919 2205 1
+1919 2210 1
+1919 2211 1
+1919 2241 1
+1919 2246 1
+1919 2251 1
+1919 2253 1
+1919 2264 1
+1919 2273 1
+1919 2285 1
+1919 2290 1
+1919 2345 1
+1919 2385 1
+1919 2397 1
+1919 2400 1
+1919 2411 1
+1919 2470 1
+1919 2479 1
+1919 2593 1
+1919 2617 1
+1919 2625 1
+1919 2763 1
+1919 2768 1
+1919 2805 1
+1919 2828 1
+1919 2830 1
+1919 2834 1
+1919 2946 1
+1919 2977 1
+1919 3033 1
+1919 3034 1
+1919 3099 1
+1919 3117 1
+1919 3136 1
+1919 8291 1
+1921 1230 1
+1922 72 1
+1922 188 1
+1922 204 1
+1922 285 1
+1922 290 1
+1922 425 1
+1922 465 1
+1922 587 1
+1922 608 1
+1922 633 1
+1922 741 1
+1922 762 1
+1922 827 1
+1922 856 1
+1922 946 1
+1922 1097 1
+1922 1154 1
+1922 1230 1
+1922 1267 1
+1922 1291 1
+1922 1353 1
+1922 1357 1
+1922 1393 1
+1922 1416 1
+1922 1419 1
+1922 1493 1
+1922 1521 1
+1922 1549 1
+1922 1571 1
+1922 1633 1
+1922 1679 1
+1922 1705 1
+1922 1706 1
+1922 1717 1
+1922 1723 1
+1922 1734 1
+1922 1754 1
+1922 1781 1
+1922 1792 1
+1922 1808 1
+1922 1814 1
+1922 1837 1
+1922 1847 1
+1922 1888 1
+1922 1919 1
+1922 1984 1
+1922 1992 1
+1922 2053 1
+1922 2116 1
+1922 2117 1
+1922 2135 1
+1922 2145 1
+1922 2174 1
+1922 2202 1
+1922 2225 1
+1922 2231 1
+1922 2251 1
+1922 2256 1
+1922 2273 1
+1922 2276 1
+1922 2294 1
+1922 2322 1
+1922 2323 1
+1922 2325 1
+1922 2356 1
+1922 2364 1
+1922 2371 1
+1922 2375 1
+1922 2381 1
+1922 2398 1
+1922 2411 1
+1922 2416 1
+1922 2426 1
+1922 2470 1
+1922 2474 1
+1922 2475 1
+1922 2501 1
+1922 2508 1
+1922 2516 1
+1922 2542 1
+1922 2544 1
+1922 2547 1
+1922 2550 1
+1922 2576 1
+1922 2585 1
+1922 2587 1
+1922 2593 1
+1922 2594 1
+1922 2599 1
+1922 2604 1
+1922 2607 1
+1922 2617 1
+1922 2618 1
+1922 2623 1
+1922 2625 1
+1922 2646 1
+1922 2647 1
+1922 2650 1
+1922 2654 1
+1922 2665 1
+1922 2669 1
+1922 2670 1
+1922 2697 1
+1922 2707 1
+1922 2708 1
+1922 2713 1
+1922 2721 1
+1922 2724 1
+1922 2751 1
+1922 2754 1
+1922 2787 1
+1922 2790 1
+1922 2815 1
+1922 2819 1
+1922 2838 1
+1922 2856 1
+1922 2880 1
+1922 2900 1
+1922 2902 1
+1922 2918 1
+1922 2922 1
+1922 2926 1
+1922 2928 1
+1922 2946 1
+1922 2951 1
+1922 2955 1
+1922 2963 1
+1922 2966 1
+1922 2996 1
+1922 3002 1
+1922 3007 1
+1922 3018 1
+1922 3020 1
+1922 3021 1
+1922 3024 1
+1922 3026 1
+1922 3028 1
+1922 3029 1
+1922 3030 1
+1922 3050 1
+1922 3056 1
+1922 3059 1
+1922 3082 1
+1922 3084 1
+1922 3089 1
+1922 3099 1
+1922 3117 1
+1922 3126 1
+1922 3140 1
+1922 3145 1
+1922 3150 1
+1922 3155 1
+1922 3164 1
+1922 3201 1
+1922 3243 1
+1922 3251 1
+1922 3253 1
+1922 3255 1
+1922 3260 1
+1922 3265 1
+1922 3284 1
+1922 3307 1
+1922 3324 1
+1922 3338 1
+1922 3351 1
+1922 3352 1
+1922 3404 1
+1922 3408 1
+1922 3435 1
+1922 3446 1
+1922 3452 1
+1922 3456 1
+1922 3473 1
+1922 3483 1
+1922 3486 1
+1922 3516 1
+1922 3537 1
+1922 3650 1
+1922 3812 1
+1922 3813 1
+1922 3830 1
+1922 3843 1
+1922 3871 1
+1922 3887 1
+1922 3892 1
+1922 3937 1
+1922 3946 1
+1922 4124 1
+1922 4297 1
+1922 4828 1
+1922 4983 1
+1922 5026 1
+1922 5055 1
+1922 5073 1
+1922 5083 1
+1922 5092 1
+1922 5106 1
+1922 5115 1
+1922 5130 1
+1922 5132 1
+1922 5305 1
+1922 7289 1
+1922 8292 1
+1922 8293 1
+1923 1111 1
+1923 1855 1
+1924 15 1
+1924 1855 1
+1924 3352 1
+1924 3835 1
+1924 6789 1
+1925 762 1
+1925 974 1
+1925 975 1
+1925 1111 1
+1925 1542 1
+1925 1633 1
+1925 1717 1
+1925 1836 1
+1925 1842 1
+1925 1855 1
+1925 1977 1
+1925 1983 1
+1925 2004 1
+1925 2165 1
+1925 2328 1
+1925 2651 1
+1925 2654 1
+1925 3018 1
+1925 3136 1
+1925 3408 1
+1925 3587 1
+1925 5511 1
+1928 1111 1
+1928 1855 1
+1928 1927 1
+1928 2060 1
+1928 2066 1
+1928 2654 1
+1928 3408 1
+1890 1855 1
+1926 1855 1
+1927 665 1
+1927 1855 1
+1929 1855 1
+1930 1855 1
+1931 1186 1
+1931 1353 1
+1931 1542 1
+1931 1842 1
+1931 1855 1
+1931 1888 1
+1931 1927 1
+1931 1964 1
+1931 1997 1
+1931 2654 1
+1931 2871 1
+1931 3408 1
+1931 3755 1
+1931 6227 1
+1931 8212 1
+1937 1026 1
+1937 1473 1
+1937 1548 1
+1937 1855 1
+1937 3084 1
+1937 3192 1
+1937 3456 1
+1937 4276 1
+1937 5254 1
+1937 5341 1
+1937 5423 1
+1937 5511 1
+1937 6009 1
+1932 1855 1
+1933 1855 1
+1938 1855 1
+1934 1855 1
+1935 1548 1
+1935 1855 1
+1935 2565 1
+1935 3192 1
+1935 3352 1
+1935 3830 1
+1935 5254 1
+1939 1855 1
+1940 1186 1
+1940 1835 1
+1940 1855 1
+1940 2323 1
+1940 2830 1
+1941 1857 1
+1943 407 1
+1943 2285 1
+1943 2625 1
+1944 407 1
+1944 1956 1
+1945 407 1
+1945 1816 1
+1946 1157 1
+1946 1165 1
+1946 4191 1
+1946 4323 1
+1947 1165 1
+1947 2210 1
+1947 2328 1
+1947 2565 1
+1947 2727 1
+1947 2900 1
+1947 2923 1
+1947 3117 1
+1947 3276 1
+1947 3541 1
+1947 3562 1
+1947 3800 1
+1947 3887 1
+1947 3892 1
+1947 4031 1
+1948 1165 1
+1948 1186 1
+1948 1608 1
+1948 1621 1
+1948 1918 1
+1948 1956 1
+1948 2004 1
+1948 2069 1
+1948 2114 1
+1948 2157 1
+1948 2378 1
+1948 2386 1
+1948 2470 1
+1948 2625 1
+827 1953 1
+827 3024 1
+827 3946 1
+1951 1953 1
+1951 2117 1
+1951 2128 1
+1951 2195 1
+1951 2257 1
+1951 2297 1
+1951 2324 1
+1951 2435 1
+1951 2485 1
+1951 2565 1
+1951 2625 1
+1951 2653 1
+1951 2657 1
+1951 2686 1
+1951 2819 1
+1951 2973 1
+1951 3010 1
+1951 3114 1
+1951 3352 1
+1951 3408 1
+1951 3480 1
+1951 3549 1
+1951 3615 1
+1951 3769 1
+1951 4994 1
+1951 5423 1
+1951 6481 1
+1951 6505 1
+1951 6632 1
+1955 2340 1
+1958 1963 1
+1959 1963 1
+1960 1963 1
+1961 1963 1
+1961 2354 1
+1961 2654 1
+1961 4247 1
+1961 5484 1
+1962 56 1
+1962 285 1
+1962 993 1
+1962 1151 1
+1962 1164 1
+1962 1200 1
+1962 1284 1
+1962 1407 1
+1962 1482 1
+1962 1550 1
+1962 1622 1
+1962 1697 1
+1962 1757 1
+1962 1787 1
+1962 1816 1
+1962 1858 1
+1962 1927 1
+1962 1963 1
+1962 1966 1
+1962 1969 1
+1962 1973 1
+1962 1979 1
+1962 1987 1
+1962 2095 1
+1962 2106 1
+1962 2151 1
+1962 2157 1
+1962 2165 1
+1962 2211 1
+1962 3136 1
+1962 8290 1
+1966 290 1
+1966 937 1
+1966 1285 1
+1966 1378 1
+1966 1585 1
+1966 1706 1
+1966 1723 1
+1966 1965 1
+1966 1977 1
+1966 2079 1
+1966 2485 1
+1966 2508 1
+1966 2686 1
+1966 2775 1
+1966 2955 1
+1966 4055 1
+1966 7961 1
+1966 8149 1
+1964 765 1
+1964 1966 1
+1964 2375 1
+1964 2485 1
+1964 2511 1
+1964 2764 1
+1964 2765 1
+1964 2794 1
+1964 2966 1
+1964 4666 1
+1964 4719 1
+1964 6621 1
+1964 6762 1
+1965 937 1
+1965 993 1
+1965 1284 1
+1965 1285 1
+1965 1378 1
+1965 1566 1
+1965 1966 1
+1965 2079 1
+1965 2137 1
+1967 665 1
+1967 873 1
+1967 974 1
+1967 1267 1
+1967 1285 1
+1967 1416 1
+1967 1723 1
+1967 1734 1
+1967 1754 1
+1967 1858 1
+1967 1969 1
+1967 1990 1
+1967 2178 1
+1967 2209 1
+1967 2252 1
+1967 2371 1
+1967 2485 1
+1967 2595 1
+1967 2597 1
+1967 2693 1
+1967 2708 1
+1967 2746 1
+1967 2973 1
+1967 3117 1
+1967 3140 1
+1967 3260 1
+1967 3520 1
+1967 3537 1
+1967 3580 1
+1967 3587 1
+1967 8290 1
+1968 665 1
+1968 1969 1
+1972 204 1
+1972 417 1
+1972 465 1
+1972 608 1
+1972 825 1
+1972 974 1
+1972 1159 1
+1972 1166 1
+1972 1211 1
+1972 1239 1
+1972 1247 1
+1972 1267 1
+1972 1291 1
+1972 1297 1
+1972 1307 1
+1972 1315 1
+1972 1357 1
+1972 1416 1
+1972 1549 1
+1972 1571 1
+1972 1596 1
+1972 1633 1
+1972 1706 1
+1972 1734 1
+1972 1754 1
+1972 1781 1
+1972 1792 1
+1972 1799 1
+1972 1823 1
+1972 1918 1
+1972 1973 1
+1972 2016 1
+1972 2062 1
+1972 2114 1
+1972 2209 1
+1972 2210 1
+1972 2225 1
+1972 2252 1
+1972 2256 1
+1972 2257 1
+1972 2285 1
+1972 2290 1
+1972 2297 1
+1972 2323 1
+1972 2324 1
+1972 2325 1
+1972 2338 1
+1972 2356 1
+1972 2371 1
+1972 2384 1
+1972 2398 1
+1972 2474 1
+1972 2485 1
+1972 2506 1
+1972 2508 1
+1972 2510 1
+1972 2535 1
+1972 2542 1
+1972 2544 1
+1972 2550 1
+1972 2560 1
+1972 2576 1
+1972 2585 1
+1972 2594 1
+1972 2595 1
+1972 2597 1
+1972 2619 1
+1972 2620 1
+1972 2623 1
+1972 2625 1
+1972 2651 1
+1972 2653 1
+1972 2654 1
+1972 2655 1
+1972 2657 1
+1972 2660 1
+1972 2667 1
+1972 2674 1
+1972 2686 1
+1972 2693 1
+1972 2697 1
+1972 2700 1
+1972 2707 1
+1972 2727 1
+1972 2746 1
+1972 2747 1
+1972 2815 1
+1972 2819 1
+1972 2830 1
+1972 2909 1
+1972 2955 1
+1972 2958 1
+1972 2966 1
+1972 2968 1
+1972 2972 1
+1972 2981 1
+1972 2999 1
+1972 3005 1
+1972 3007 1
+1972 3009 1
+1972 3024 1
+1972 3026 1
+1972 3027 1
+1972 3028 1
+1972 3029 1
+1972 3030 1
+1972 3059 1
+1972 3084 1
+1972 3089 1
+1972 3114 1
+1972 3117 1
+1972 3140 1
+1972 3148 1
+1972 3150 1
+1972 3173 1
+1972 3180 1
+1972 3260 1
+1972 3307 1
+1972 3338 1
+1972 3352 1
+1972 3371 1
+1972 3404 1
+1972 3408 1
+1972 3417 1
+1972 3456 1
+1972 3473 1
+1972 3480 1
+1972 3489 1
+1972 3516 1
+1972 3529 1
+1972 3562 1
+1972 3580 1
+1972 3587 1
+1972 3650 1
+1972 3680 1
+1972 3800 1
+1972 3807 1
+1972 3842 1
+1972 3843 1
+1972 3847 1
+1972 3892 1
+1972 3903 1
+1972 3970 1
+1972 4041 1
+1972 4043 1
+1972 4055 1
+1972 4110 1
+1972 4162 1
+1972 4179 1
+1972 4201 1
+1972 4448 1
+1972 4600 1
+1972 4604 1
+1972 4712 1
+1972 4713 1
+1972 4795 1
+1972 4929 1
+1972 5155 1
+1972 5188 1
+1972 5273 1
+1972 5323 1
+1972 5327 1
+1972 5341 1
+1972 5430 1
+1972 5439 1
+1972 5449 1
+1972 5463 1
+1972 5584 1
+1972 5626 1
+1972 5827 1
+1972 6006 1
+1972 6437 1
+1972 6441 1
+1972 6458 1
+1972 6501 1
+1972 6552 1
+1972 6589 1
+1972 6594 1
+1972 6600 1
+1972 8293 1
+1972 8294 1
+1975 1284 1
+1976 974 1
+1976 1284 1
+1976 1285 1
+1976 1977 1
+1976 2470 1
+1976 2955 1
+1977 859 1
+1977 993 1
+1977 1018 1
+1977 1031 1
+1977 1035 1
+1977 1111 1
+1977 1243 1
+1977 1284 1
+1977 1353 1
+1977 1378 1
+1977 1482 1
+1977 1565 1
+1977 1608 1
+1977 1621 1
+1977 1707 1
+1977 1772 1
+1977 1836 1
+1977 1888 1
+1977 1997 1
+1977 2004 1
+1977 2062 1
+1977 2076 1
+1977 2145 1
+1977 2240 1
+1977 2246 1
+1977 2329 1
+1977 2332 1
+1977 2339 1
+1977 2341 1
+1977 2362 1
+1977 2385 1
+1977 2593 1
+1977 2685 1
+1977 8291 1
+1978 1284 1
+1979 15 1
+1979 762 1
+1952 1482 1
+1952 1622 1
+1952 1816 1
+1980 947 1
+1980 993 1
+1980 1482 1
+1980 1492 1
+1980 1585 1
+1980 1622 1
+1980 1700 1
+1980 1772 1
+1980 1777 1
+1980 1816 1
+1980 1835 1
+1980 1842 1
+1980 1888 1
+1980 1956 1
+1980 1964 1
+1980 2073 1
+1980 2128 1
+1980 2145 1
+1980 2174 1
+1980 2240 1
+1980 2241 1
+1980 2329 1
+1980 2338 1
+1980 2341 1
+1980 2375 1
+1980 2400 1
+1980 2504 1
+1980 2547 1
+1980 2560 1
+1980 2565 1
+1980 2587 1
+1980 2623 1
+1980 2625 1
+1980 2685 1
+1980 2794 1
+1980 2825 1
+1980 2922 1
+1980 2993 1
+1980 3005 1
+1980 3029 1
+1980 3117 1
+1980 3321 1
+1980 3352 1
+1980 3557 1
+1980 3660 1
+1980 4335 1
+1980 4662 1
+1981 1816 1
+1981 2799 1
+1982 214 1
+1982 1211 1
+1982 1250 1
+1982 1267 1
+1982 1816 1
+1982 2004 1
+1982 2062 1
+1982 3459 1
+1982 3792 1
+1982 3919 1
+1982 4536 1
+1982 5002 1
+1982 5037 1
+1982 5188 1
+1982 5288 1
+1982 5839 1
+1982 6270 1
+1982 6305 1
+1982 6327 1
+1982 6388 1
+1982 6712 1
+1982 6869 1
+1982 6948 1
+1982 6994 1
+1982 7553 1
+1982 7620 1
+1982 7658 1
+1982 7839 1
+1982 7961 1
+1984 2252 1
+1984 2871 1
+1984 3887 1
+1984 4011 1
+1984 4191 1
+1984 4875 1
+1984 5817 1
+1985 762 1
+1985 946 1
+1985 959 1
+1985 993 1
+1985 1166 1
+1985 1357 1
+1985 1390 1
+1985 1482 1
+1985 1492 1
+1985 1549 1
+1985 1621 1
+1985 1622 1
+1985 1633 1
+1985 1700 1
+1985 1734 1
+1985 1749 1
+1985 1754 1
+1985 1888 1
+1985 1919 1
+1985 1987 1
+1985 1992 1
+1985 1997 1
+1985 2062 1
+1985 2117 1
+1985 2128 1
+1985 2157 1
+1985 2209 1
+1985 2231 1
+1985 2241 1
+1985 2276 1
+1985 2323 1
+1985 2328 1
+1985 2516 1
+1985 2623 1
+1985 2625 1
+1985 2643 1
+1985 2646 1
+1985 2655 1
+1985 2674 1
+1985 2828 1
+1985 2830 1
+1985 2834 1
+1985 3099 1
+1985 3253 1
+1985 3307 1
+1985 3404 1
+1985 3443 1
+1985 3460 1
+1985 3464 1
+1985 3650 1
+1985 3956 1
+1985 4485 1
+1985 4735 1
+1985 4808 1
+1985 5817 1
+1985 8290 1
+1986 761 1
+1986 908 1
+1986 993 1
+1986 1585 1
+1986 1772 1
+1986 1787 1
+1986 1835 1
+1986 1888 1
+1986 1985 1
+1986 1987 1
+1986 2145 1
+1986 2193 1
+1986 2211 1
+1986 2504 1
+1986 4037 1
+1986 4110 1
+1986 4735 1
+1988 1622 1
+1989 1622 1
+1990 1074 1
+1990 1239 1
+1990 1352 1
+1990 1385 1
+1990 1549 1
+1990 1622 1
+1990 2066 1
+1990 2324 1
+1990 2398 1
+1990 2565 1
+1990 2693 1
+1990 3007 1
+1990 3562 1
+1990 3646 1
+1990 3785 1
+1990 3830 1
+1990 3919 1
+1990 4065 1
+1990 4233 1
+1990 4384 1
+1990 4709 1
+1990 4712 1
+1990 4735 1
+1990 5037 1
+1990 5188 1
+1990 5210 1
+1990 5285 1
+1990 5950 1
+1990 6501 1
+1990 6552 1
+1990 6570 1
+1990 6599 1
+1990 6613 1
+1990 6707 1
+1990 6739 1
+1990 8294 1
+1991 56 1
+1991 350 1
+1991 403 1
+1991 425 1
+1991 633 1
+1991 765 1
+1991 993 1
+1991 1049 1
+1991 1267 1
+1991 1291 1
+1991 1374 1
+1991 1384 1
+1991 1419 1
+1991 1482 1
+1991 1521 1
+1991 1622 1
+1991 1633 1
+1991 1637 1
+1991 1646 1
+1991 1653 1
+1991 1705 1
+1991 1723 1
+1991 1734 1
+1991 1754 1
+1991 1792 1
+1991 1808 1
+1991 1814 1
+1991 1842 1
+1991 1956 1
+1991 1992 1
+1991 2097 1
+1991 2102 1
+1991 2120 1
+1991 2174 1
+1991 2225 1
+1991 2256 1
+1991 2264 1
+1991 2322 1
+1991 2375 1
+1991 2410 1
+1991 2547 1
+1991 2593 1
+1991 2599 1
+1991 2625 1
+1991 2665 1
+1991 2685 1
+1991 2707 1
+1991 2768 1
+1991 2777 1
+1991 2794 1
+1991 2805 1
+1991 2809 1
+1991 2814 1
+1991 2828 1
+1991 2830 1
+1991 2834 1
+1991 2856 1
+1991 2922 1
+1991 2955 1
+1991 2963 1
+1991 2968 1
+1991 3130 1
+1991 3140 1
+1991 3150 1
+1991 3251 1
+1991 3253 1
+1992 56 1
+1992 764 1
+1992 937 1
+1992 1384 1
+1992 1492 1
+1992 1622 1
+1992 1700 1
+1992 1808 1
+1992 2117 1
+1992 2120 1
+1992 2128 1
+1992 2504 1
+1992 2594 1
+1992 2625 1
+1992 2665 1
+1992 3253 1
+1993 946 1
+1993 1622 1
+1993 3059 1
+1994 1151 1
+1995 1151 1
+1995 1919 1
+1995 7497 1
+1996 1151 1
+1997 56 1
+1997 332 1
+1997 415 1
+1997 587 1
+1997 665 1
+1997 761 1
+1997 764 1
+1997 836 1
+1997 873 1
+1997 937 1
+1997 947 1
+1997 968 1
+1997 975 1
+1997 1018 1
+1997 1031 1
+1997 1035 1
+1997 1061 1
+1997 1097 1
+1997 1111 1
+1997 1137 1
+1997 1151 1
+1997 1186 1
+1997 1285 1
+1997 1297 1
+1997 1353 1
+1997 1378 1
+1997 1407 1
+1997 1482 1
+1997 1492 1
+1997 1542 1
+1997 1547 1
+1997 1585 1
+1997 1608 1
+1997 1613 1
+1997 1621 1
+1997 1697 1
+1997 1700 1
+1997 1707 1
+1997 1717 1
+1997 1730 1
+1997 1749 1
+1997 1757 1
+1997 1772 1
+1997 1783 1
+1997 1787 1
+1997 1835 1
+1997 1842 1
+1997 1848 1
+1997 1919 1
+1997 1965 1
+1997 1977 1
+1997 1991 1
+1997 2004 1
+1997 2062 1
+1997 2066 1
+1997 2071 1
+1997 2073 1
+1997 2079 1
+1997 2085 1
+1997 2095 1
+1997 2097 1
+1997 2106 1
+1997 2109 1
+1997 2117 1
+1997 2119 1
+1997 2128 1
+1997 2151 1
+1997 2157 1
+1997 2165 1
+1997 2168 1
+1997 2178 1
+1997 2181 1
+1997 2202 1
+1997 2210 1
+1997 2240 1
+1997 2241 1
+1997 2246 1
+1997 2273 1
+1997 2332 1
+1997 2435 1
+1997 2475 1
+1997 2504 1
+1997 2579 1
+1997 2587 1
+1997 2593 1
+1997 2604 1
+1997 3136 1
+1997 8290 1
+1794 1018 1
+1794 1166 1
+1794 1393 1
+1794 1482 1
+1794 1633 1
+1794 1706 1
+1794 1814 1
+1794 1847 1
+1794 1919 1
+1794 2071 1
+1794 2135 1
+1794 2225 1
+1794 2246 1
+1794 2251 1
+1794 2297 1
+1794 2324 1
+1794 2375 1
+1794 2475 1
+1794 2565 1
+1794 2580 1
+1794 2625 1
+1794 2794 1
+1794 2828 1
+1794 3034 1
+1794 3892 1
+1794 3970 1
+2000 1482 1
+2001 415 1
+2001 764 1
+2001 1159 1
+2001 1482 1
+2001 1492 1
+2001 1700 1
+2001 1783 1
+2001 1991 1
+2001 2004 1
+2001 2071 1
+2001 2241 1
+2001 2625 1
+2001 3089 1
+2001 3191 1
+2001 3393 1
+2001 3554 1
+2001 3897 1
+2001 3910 1
+2001 3976 1
+2001 4355 1
+2001 4361 1
+2001 4448 1
+2001 4666 1
+2001 5022 1
+2001 5392 1
+2001 5452 1
+2001 5459 1
+2001 5568 1
+2001 5651 1
+2001 5828 1
+2001 5863 1
+2001 5886 1
+2001 5963 1
+2001 5994 1
+2001 6029 1
+2001 7012 1
+2001 8042 1
+2001 8121 1
+2001 8290 1
+2002 2004 1
+2005 415 1
+2008 665 1
+2009 350 1
+2009 665 1
+2009 762 1
+2009 946 1
+2009 1026 1
+2009 1166 1
+2009 1211 1
+2009 1267 1
+2009 1357 1
+2009 1707 1
+2009 1717 1
+2009 1835 1
+2009 1918 1
+2009 1964 1
+2009 1992 1
+2009 2014 1
+2009 2083 1
+2009 2091 1
+2009 2135 1
+2009 2174 1
+2009 2193 1
+2009 2237 1
+2009 2257 1
+2009 2297 1
+2009 2328 1
+2009 2456 1
+2009 2470 1
+2009 2485 1
+2009 2504 1
+2009 2516 1
+2009 2599 1
+2009 2646 1
+2009 2651 1
+2009 2660 1
+2009 2669 1
+2009 2809 1
+2009 2830 1
+2009 3033 1
+2009 3173 1
+2009 3251 1
+2009 3334 1
+2009 3352 1
+2009 3408 1
+2009 3443 1
+2009 3455 1
+2009 3460 1
+2009 3464 1
+2009 3473 1
+2009 3680 1
+2009 3755 1
+2009 3871 1
+2009 4037 1
+2009 4289 1
+2009 4687 1
+2009 4811 1
+2009 4828 1
+2009 5028 1
+2009 5162 1
+2009 5341 1
+2009 5421 1
+2009 6624 1
+2009 7279 1
+2009 7553 1
+2040 665 1
+2010 665 1
+2010 2095 1
+2010 2101 1
+2010 2470 1
+2010 2658 1
+2010 3310 1
+2010 3352 1
+2010 4687 1
+2010 5020 1
+2010 5079 1
+2010 5301 1
+2010 5466 1
+2010 5529 1
+2010 5839 1
+2010 5933 1
+2010 6320 1
+2010 6523 1
+2010 6560 1
+2010 7021 1
+2010 7277 1
+2010 7443 1
+2010 7694 1
+2010 7726 1
+2010 7795 1
+2010 7803 1
+2010 7946 1
+2010 7992 1
+2011 665 1
+2011 4687 1
+2011 5162 1
+2012 665 1
+2012 2014 1
+2012 2135 1
+2013 665 1
+2042 665 1
+2042 2470 1
+2014 665 1
+2014 1267 1
+2014 2095 1
+2014 2135 1
+2014 2237 1
+2014 2253 1
+2014 2470 1
+2014 2909 1
+2014 3452 1
+2014 3607 1
+2015 665 1
+2016 15 1
+2016 417 1
+2016 665 1
+2016 1315 1
+2016 2237 1
+2016 2371 1
+2016 2643 1
+2016 2653 1
+2016 2697 1
+2016 3026 1
+2016 3059 1
+2016 3748 1
+2016 3892 1
+2017 665 1
+2018 665 1
+2018 2470 1
+2019 665 1
+2020 665 1
+2021 665 1
+2044 665 1
+2044 2470 1
+2023 665 1
+2024 665 1
+2025 665 1
+2026 665 1
+2027 665 1
+2045 665 1
+2029 665 1
+2029 2135 1
+2030 665 1
+2031 665 1
+2032 665 1
+2033 72 1
+2033 665 1
+2033 1026 1
+2033 1473 1
+2033 1548 1
+2033 2398 1
+2033 2542 1
+2033 2654 1
+2033 3084 1
+2033 3192 1
+2033 3352 1
+2033 3408 1
+2033 3835 1
+2033 4276 1
+2033 4338 1
+2033 4510 1
+2033 5123 1
+2033 5254 1
+2033 5341 1
+2033 5452 1
+2033 5484 1
+2033 5511 1
+2034 665 1
+2035 665 1
+2036 665 1
+2036 2470 1
+2037 665 1
+2037 2643 1
+2037 5103 1
+2037 5140 1
+2037 5524 1
+2037 5543 1
+2037 6111 1
+2037 6481 1
+698 665 1
+698 2066 1
+698 2323 1
+698 2508 1
+698 2595 1
+698 2653 1
+698 2966 1
+698 3117 1
+698 3260 1
+698 4110 1
+698 4216 1
+2038 665 1
+2038 1031 1
+2038 2341 1
+2038 2350 1
+2038 2877 1
+2049 974 1
+2049 1697 1
+2049 2657 1
+2050 1697 1
+2050 1730 1
+2050 2322 1
+2050 4335 1
+2051 1697 1
+2052 946 1
+2052 968 1
+2052 993 1
+2052 1097 1
+2052 1186 1
+2052 1697 1
+2052 1717 1
+2052 1835 1
+2052 2117 1
+2052 2193 1
+2052 2246 1
+2052 2475 1
+2052 2570 1
+2052 8291 1
+2053 1200 1
+2054 1564 1
+2054 2055 1
+2054 2066 1
+2056 1550 1
+2057 1550 1
+2058 1550 1
+2059 2060 1
+2059 2576 1
+2059 6907 1
+2059 6980 1
+2061 765 1
+2061 1585 1
+2061 1646 1
+2061 1888 1
+2062 72 1
+2062 285 1
+2062 332 1
+2062 587 1
+2062 722 1
+2062 761 1
+2062 764 1
+2062 836 1
+2062 873 1
+2062 937 1
+2062 946 1
+2062 947 1
+2062 959 1
+2062 975 1
+2062 993 1
+2062 1031 1
+2062 1035 1
+2062 1061 1
+2062 1111 1
+2062 1166 1
+2062 1243 1
+2062 1267 1
+2062 1285 1
+2062 1297 1
+2062 1353 1
+2062 1378 1
+2062 1444 1
+2062 1492 1
+2062 1542 1
+2062 1565 1
+2062 1566 1
+2062 1583 1
+2062 1585 1
+2062 1613 1
+2062 1621 1
+2062 1633 1
+2062 1678 1
+2062 1700 1
+2062 1707 1
+2062 1714 1
+2062 1717 1
+2062 1749 1
+2062 1754 1
+2062 1757 1
+2062 1772 1
+2062 1783 1
+2062 1836 1
+2062 1842 1
+2062 1848 1
+2062 1888 1
+2062 1919 1
+2062 1965 1
+2062 1977 1
+2062 1985 1
+2062 1991 1
+2062 1997 1
+2062 2066 1
+2062 2071 1
+2062 2073 1
+2062 2079 1
+2062 2085 1
+2062 2091 1
+2062 2095 1
+2062 2097 1
+2062 2109 1
+2062 2114 1
+2062 2119 1
+2062 2121 1
+2062 2128 1
+2062 2137 1
+2062 2145 1
+2062 2151 1
+2062 2157 1
+2062 2165 1
+2062 2168 1
+2062 2178 1
+2062 2181 1
+2062 2182 1
+2062 2193 1
+2062 2195 1
+2062 2202 1
+2062 2205 1
+2062 2206 1
+2062 2210 1
+2062 2211 1
+2062 2241 1
+2062 2246 1
+2062 2253 1
+2062 2273 1
+2062 2277 1
+2062 2285 1
+2062 2297 1
+2062 2322 1
+2062 2325 1
+2062 2328 1
+2062 2329 1
+2062 2333 1
+2062 2339 1
+2062 2341 1
+2062 2350 1
+2062 2381 1
+2062 2385 1
+2062 2397 1
+2062 2400 1
+2062 2593 1
+2062 2594 1
+2062 2625 1
+2062 2651 1
+2062 2654 1
+2062 2693 1
+2062 2877 1
+2062 2923 1
+2062 3007 1
+2062 3014 1
+2062 3117 1
+2062 3192 1
+2062 3265 1
+2062 3803 1
+2062 7478 1
+2062 8290 1
+2062 8291 1
+2063 937 1
+2063 1186 1
+2063 1285 1
+2063 1378 1
+2063 1564 1
+2063 1585 1
+2063 1707 1
+2063 1730 1
+2063 1835 1
+2063 1965 1
+2063 1977 1
+2063 2079 1
+2063 2101 1
+2063 2117 1
+2063 2425 1
+2063 2470 1
+2063 2475 1
+2063 2593 1
+2063 2625 1
+2063 2643 1
+2063 2685 1
+2064 2066 1
+2064 4191 1
+2065 465 1
+2065 633 1
+2065 959 1
+2065 993 1
+2065 1111 1
+2065 1166 1
+2065 1297 1
+2065 1315 1
+2065 1323 1
+2065 1549 1
+2065 1633 1
+2065 1772 1
+2065 1808 1
+2065 1842 1
+2065 1919 1
+2065 1956 1
+2065 2066 1
+2065 2225 1
+2065 2240 1
+2065 2328 1
+2065 2385 1
+2065 2508 1
+2065 2542 1
+2065 2619 1
+2065 2623 1
+2065 2660 1
+2065 2736 1
+2065 2871 1
+2065 3002 1
+2065 3018 1
+2065 3130 1
+2065 3164 1
+2065 3192 1
+2065 3253 1
+2065 3260 1
+2065 3291 1
+2065 3443 1
+2065 3454 1
+2065 3456 1
+2065 3458 1
+2065 3587 1
+2065 3769 1
+2065 3843 1
+2065 3970 1
+2065 4138 1
+2065 4338 1
+2065 5100 1
+2065 5254 1
+2065 6566 1
+2065 8290 1
+2069 1049 1
+2069 1250 1
+2069 1323 1
+2069 1608 1
+2069 1717 1
+2069 1964 1
+2069 2076 1
+2069 2339 1
+2069 2470 1
+2069 2475 1
+2069 2570 1
+2069 2571 1
+2069 2580 1
+2069 2587 1
+2069 2593 1
+2069 2685 1
+2069 2946 1
+2068 1783 1
+2068 2069 1
+2068 2242 1
+2068 4981 1
+2071 1378 1
+2071 1992 1
+2071 2066 1
+2071 2073 1
+2071 2145 1
+2071 2211 1
+2071 2625 1
+2070 2073 1
+2072 56 1
+2072 285 1
+2072 332 1
+2072 350 1
+2072 722 1
+2072 859 1
+2072 873 1
+2072 946 1
+2072 947 1
+2072 959 1
+2072 993 1
+2072 1012 1
+2072 1018 1
+2072 1031 1
+2072 1035 1
+2072 1049 1
+2072 1097 1
+2072 1137 1
+2072 1186 1
+2072 1250 1
+2072 1285 1
+2072 1291 1
+2072 1297 1
+2072 1374 1
+2072 1378 1
+2072 1384 1
+2072 1390 1
+2072 1419 1
+2072 1444 1
+2072 1492 1
+2072 1521 1
+2072 1542 1
+2072 1547 1
+2072 1583 1
+2072 1592 1
+2072 1596 1
+2072 1608 1
+2072 1621 1
+2072 1637 1
+2072 1646 1
+2072 1653 1
+2072 1700 1
+2072 1707 1
+2072 1717 1
+2072 1723 1
+2072 1730 1
+2072 1749 1
+2072 1757 1
+2072 1772 1
+2072 1787 1
+2072 1808 1
+2072 1835 1
+2072 1836 1
+2072 1842 1
+2072 1847 1
+2072 1848 1
+2072 1888 1
+2072 1918 1
+2072 1956 1
+2072 1964 1
+2072 1977 1
+2072 1985 1
+2072 1991 1
+2072 1997 1
+2072 2062 1
+2072 2073 1
+2072 2091 1
+2072 2097 1
+2072 2102 1
+2072 2106 1
+2072 2117 1
+2072 2128 1
+2072 2137 1
+2072 2151 1
+2072 2157 1
+2072 2178 1
+2072 2193 1
+2072 2210 1
+2072 2240 1
+2072 2256 1
+2072 2264 1
+2072 2322 1
+2072 2323 1
+2072 2397 1
+2072 2400 1
+2072 2410 1
+2072 2426 1
+2072 2470 1
+2072 2475 1
+2072 2479 1
+2072 2517 1
+2072 2560 1
+2072 2571 1
+2072 2593 1
+2072 2599 1
+2072 2604 1
+2072 2618 1
+2072 2619 1
+2072 2625 1
+2072 2643 1
+2072 2665 1
+2072 2669 1
+2072 2707 1
+2072 2721 1
+2072 2754 1
+2072 2777 1
+2072 2785 1
+2072 2787 1
+2072 2794 1
+2072 2801 1
+2072 2809 1
+2072 2814 1
+2072 2815 1
+2072 2834 1
+2072 2838 1
+2072 2968 1
+2072 2999 1
+2072 3029 1
+2072 3033 1
+2072 8290 1
+2072 8291 1
+2077 1991 1
+2081 1707 1
+2082 1707 1
+2083 2322 1
+2083 3548 1
+2095 2182 1
+2095 2185 1
+2095 2193 1
+2095 2470 1
+2095 2504 1
+2095 5162 1
+2084 1997 1
+2084 2085 1
+2084 2091 1
+2084 2092 1
+2084 2095 1
+2084 2185 1
+2084 2244 1
+2084 2247 1
+2084 2470 1
+2084 5200 1
+2085 968 1
+2085 1018 1
+2085 1049 1
+2085 1111 1
+2085 1250 1
+2085 1419 1
+2085 1521 1
+2085 1608 1
+2085 1792 1
+2085 1835 1
+2085 1919 1
+2085 1992 1
+2085 2076 1
+2085 2091 1
+2085 2095 1
+2085 2117 1
+2085 2128 1
+2085 2264 1
+2085 2322 1
+2085 2332 1
+2085 2400 1
+2085 2435 1
+2085 2504 1
+2085 2579 1
+2085 2593 1
+2085 2685 1
+2085 2834 1
+2085 5162 1
+2086 2095 1
+2087 2095 1
+2088 1997 1
+2088 2085 1
+2088 2091 1
+2088 2095 1
+2088 2112 1
+2088 2470 1
+2089 2095 1
+2090 2095 1
+2091 1307 1
+2091 1836 1
+2091 2095 1
+2091 2193 1
+2091 2210 1
+2091 2328 1
+2091 2470 1
+2091 2643 1
+2092 2085 1
+2092 2091 1
+2092 2095 1
+2092 2185 1
+2092 2247 1
+2092 2470 1
+2092 5162 1
+2093 285 1
+2093 350 1
+2093 993 1
+2093 1049 1
+2093 1097 1
+2093 1186 1
+2093 1250 1
+2093 1315 1
+2093 1374 1
+2093 1416 1
+2093 1564 1
+2093 1566 1
+2093 1608 1
+2093 1717 1
+2093 1772 1
+2093 1792 1
+2093 1835 1
+2093 1847 1
+2093 1964 1
+2093 1992 1
+2093 2095 1
+2093 2117 1
+2093 2119 1
+2093 2137 1
+2093 2157 1
+2093 2174 1
+2093 2240 1
+2093 2323 1
+2093 2435 1
+2093 2470 1
+2093 2475 1
+2093 2547 1
+2093 2560 1
+2093 2579 1
+2093 2587 1
+2093 2593 1
+2093 2604 1
+2093 2607 1
+2093 2625 1
+2093 2643 1
+2093 2685 1
+2093 2707 1
+2093 2720 1
+2093 2790 1
+2093 2830 1
+2093 2922 1
+2093 2966 1
+2093 2972 1
+2093 3029 1
+2093 3106 1
+2093 3117 1
+2093 3253 1
+2093 3351 1
+2093 4709 1
+2093 7979 1
+2096 1730 1
+2096 5799 1
+2097 993 1
+2097 1012 1
+2097 1018 1
+2097 2182 1
+2097 2422 1
+2097 2490 1
+2097 2607 1
+2100 2101 1
+2099 1297 1
+2099 1353 1
+2099 1547 1
+2099 1565 1
+2099 1700 1
+2099 1997 1
+2099 2062 1
+2099 2085 1
+2099 2091 1
+2099 2092 1
+2099 2101 1
+2099 2182 1
+2099 2185 1
+2099 2193 1
+2099 2244 1
+2099 2247 1
+2099 2290 1
+2099 2348 1
+2099 2385 1
+2099 2470 1
+2099 2504 1
+2099 8290 1
+2102 285 1
+2102 762 1
+2102 778 1
+2102 825 1
+2102 993 1
+2102 1012 1
+2102 1166 1
+2102 1211 1
+2102 1243 1
+2102 1291 1
+2102 1416 1
+2102 1473 1
+2102 1492 1
+2102 1549 1
+2102 1596 1
+2102 1633 1
+2102 1769 1
+2102 1777 1
+2102 1808 1
+2102 2106 1
+2102 2323 1
+2102 2328 1
+2102 2474 1
+2102 2535 1
+2102 2542 1
+2102 2565 1
+2102 2576 1
+2102 2594 1
+2102 2638 1
+2102 2707 1
+2102 2790 1
+2102 2815 1
+2102 2968 1
+2102 3080 1
+2102 3171 1
+2102 3843 1
+2102 3912 1
+2102 3976 1
+2102 4335 1
+2102 4351 1
+2102 5176 1
+2102 5459 1
+2102 5683 1
+2102 5780 1
+2102 5947 1
+2104 1407 1
+2104 2106 1
+2103 1035 1
+2103 2106 1
+2105 761 1
+2105 873 1
+2105 1111 1
+2105 2106 1
+2105 2157 1
+2105 2174 1
+2105 2206 1
+2105 2231 1
+2105 3114 1
+2105 3681 1
+2105 8290 1
+2109 762 1
+2109 1186 1
+2109 1211 1
+2109 1453 1
+2109 1744 1
+2109 2066 1
+2109 2210 1
+2109 2350 1
+2109 2354 1
+2109 2398 1
+2109 2411 1
+2109 2508 1
+2109 2516 1
+2109 2535 1
+2109 2565 1
+2109 2775 1
+2109 2859 1
+2109 3007 1
+2109 3117 1
+2109 3192 1
+2109 3393 1
+2109 3394 1
+2109 3443 1
+2109 3480 1
+2109 3489 1
+2109 3562 1
+2109 3843 1
+2109 3926 1
+2109 3946 1
+2109 4021 1
+2109 4044 1
+2109 4201 1
+2109 4234 1
+2109 4247 1
+2109 4266 1
+2109 4338 1
+2109 4424 1
+2109 4463 1
+2109 4510 1
+2109 4536 1
+2109 4661 1
+2109 4666 1
+2109 4735 1
+2109 5100 1
+2109 5327 1
+2109 5392 1
+2109 5790 1
+2108 1186 1
+2108 2109 1
+2108 2625 1
+2108 2651 1
+2110 762 1
+2110 1407 1
+2110 7890 1
+2111 1407 1
+2111 1688 1
+2111 2871 1
+2111 3030 1
+2112 2185 1
+2114 290 1
+2114 1291 1
+2114 1706 1
+2114 1734 1
+2114 1754 1
+2114 1777 1
+2114 1781 1
+2114 1919 1
+2114 1965 1
+2114 2016 1
+2114 2251 1
+2114 2323 1
+2114 2585 1
+2114 2593 1
+2114 2617 1
+2114 2625 1
+2114 2727 1
+2114 2815 1
+2114 2830 1
+2114 2968 1
+2114 2993 1
+2114 2999 1
+2114 3007 1
+2114 3026 1
+2114 3028 1
+2114 3029 1
+2114 3034 1
+2114 3050 1
+2114 3056 1
+2114 3059 1
+2114 3068 1
+2114 3084 1
+2114 3099 1
+2114 3117 1
+2114 3140 1
+2114 3404 1
+2114 3576 1
+2114 3680 1
+2114 3970 1
+2115 1186 1
+2115 1211 1
+2115 1285 1
+2115 1310 1
+2115 1835 1
+2115 1965 1
+2115 2210 1
+2115 2576 1
+2115 2645 1
+2115 2785 1
+2115 2871 1
+2115 4574 1
+2115 5459 1
+2115 5721 1
+2115 5828 1
+2115 6094 1
+2116 350 1
+2116 587 1
+2116 1166 1
+2116 1723 1
+2116 1888 1
+2116 1977 1
+2116 2114 1
+2116 2117 1
+2116 2206 1
+2116 2234 1
+2116 2256 1
+2116 2273 1
+2116 2504 1
+2116 2579 1
+2116 2721 1
+2116 2794 1
+2116 3005 1
+2116 3034 1
+2116 3529 1
+2116 3804 1
+2119 765 1
+2119 856 1
+2119 1814 1
+2119 2625 1
+2119 3251 1
+2117 204 1
+2117 968 1
+2117 993 1
+2117 1049 1
+2117 2066 1
+2117 2119 1
+2117 2182 1
+2117 2364 1
+2117 2375 1
+2117 2398 1
+2117 2456 1
+2117 2470 1
+2117 2504 1
+2117 2517 1
+2117 2535 1
+2117 2966 1
+2117 4037 1
+2117 4735 1
+2117 4808 1
+2117 4811 1
+2117 4820 1
+2117 4827 1
+2117 4875 1
+2118 350 1
+2118 417 1
+2118 737 1
+2118 764 1
+2118 765 1
+2118 968 1
+2118 993 1
+2118 1018 1
+2118 1049 1
+2118 1097 1
+2118 1239 1
+2118 1285 1
+2118 1492 1
+2118 1547 1
+2118 1565 1
+2118 1566 1
+2118 1571 1
+2118 1633 1
+2118 1646 1
+2118 1700 1
+2118 1714 1
+2118 1769 1
+2118 1772 1
+2118 1792 1
+2118 1847 1
+2118 1888 1
+2118 1919 1
+2118 2071 1
+2118 2114 1
+2118 2119 1
+2118 2128 1
+2118 2209 1
+2118 2240 1
+2118 2246 1
+2118 2256 1
+2118 2323 1
+2118 2324 1
+2118 2328 1
+2118 2332 1
+2118 2338 1
+2118 2345 1
+2118 2381 1
+2118 2385 1
+2118 2400 1
+2118 2435 1
+2118 2456 1
+2118 2511 1
+2118 2550 1
+2118 2579 1
+2118 2580 1
+2118 2585 1
+2118 2587 1
+2118 2594 1
+2118 2617 1
+2118 2651 1
+2118 2653 1
+2118 2655 1
+2118 2657 1
+2118 2667 1
+2118 2685 1
+2118 2693 1
+2118 2696 1
+2118 2707 1
+2118 2727 1
+2118 2774 1
+2118 2775 1
+2118 2777 1
+2118 2805 1
+2118 2811 1
+2118 2822 1
+2118 2828 1
+2118 2851 1
+2118 2856 1
+2118 2900 1
+2118 2909 1
+2118 2958 1
+2118 2966 1
+2118 2968 1
+2118 2977 1
+2118 2999 1
+2118 3125 1
+2118 3253 1
+2118 3351 1
+2118 3352 1
+2118 3408 1
+2118 3417 1
+2118 3433 1
+2118 3439 1
+2118 3454 1
+2118 3580 1
+2118 3607 1
+2118 3752 1
+2118 3806 1
+2118 3812 1
+2118 3892 1
+2118 3898 1
+2118 3939 1
+2118 4037 1
+2118 4201 1
+2118 4297 1
+2118 4299 1
+2118 4400 1
+2118 4448 1
+2118 4463 1
+2118 4735 1
+2118 5092 1
+2118 5130 1
+2118 5412 1
+2118 5459 1
+2118 5524 1
+2118 5605 1
+2118 5886 1
+2118 8290 1
+2121 1111 1
+2120 332 1
+2120 417 1
+2120 737 1
+2120 764 1
+2120 765 1
+2120 975 1
+2120 993 1
+2120 1012 1
+2120 1024 1
+2120 1049 1
+2120 1140 1
+2120 1166 1
+2120 1353 1
+2120 1492 1
+2120 1549 1
+2120 1596 1
+2120 1608 1
+2120 1621 1
+2120 1700 1
+2120 1714 1
+2120 1772 1
+2120 1781 1
+2120 1783 1
+2120 1842 1
+2120 1848 1
+2120 1997 1
+2120 2001 1
+2120 2071 1
+2120 2117 1
+2120 2121 1
+2120 2128 1
+2120 2145 1
+2120 2165 1
+2120 2195 1
+2120 2205 1
+2120 2206 1
+2120 2211 1
+2120 2225 1
+2120 2234 1
+2120 2242 1
+2120 2246 1
+2120 2276 1
+2120 2281 1
+2120 2285 1
+2120 2290 1
+2120 2307 1
+2120 2323 1
+2120 2325 1
+2120 2328 1
+2120 2329 1
+2120 2333 1
+2120 2350 1
+2120 2426 1
+2120 2484 1
+2120 2501 1
+2120 2504 1
+2120 2517 1
+2120 2575 1
+2120 2579 1
+2120 2589 1
+2120 2591 1
+2120 2594 1
+2120 2607 1
+2120 2619 1
+2120 2625 1
+2120 2650 1
+2120 2657 1
+2120 2667 1
+2120 2720 1
+2120 2724 1
+2120 2751 1
+2120 2774 1
+2120 2781 1
+2120 2797 1
+2120 2799 1
+2120 2811 1
+2120 2834 1
+2120 2900 1
+2120 2902 1
+2120 2926 1
+2120 2974 1
+2120 2979 1
+2120 2996 1
+2120 3056 1
+2120 3068 1
+2120 3082 1
+2120 3089 1
+2120 3104 1
+2120 3126 1
+2120 3193 1
+2120 3243 1
+2120 3258 1
+2120 3320 1
+2120 3324 1
+2120 3409 1
+2120 3429 1
+2120 3459 1
+2120 3480 1
+2120 3538 1
+2120 3548 1
+2120 3835 1
+2120 4179 1
+2120 4261 1
+2120 4466 1
+2120 4536 1
+2120 4735 1
+2120 4780 1
+2120 5072 1
+2120 5079 1
+2120 5412 1
+2120 5638 1
+2120 6321 1
+2120 6388 1
+2120 6980 1
+2120 7146 1
+2120 7277 1
+2120 7323 1
+2120 7632 1
+2120 7839 1
+2120 7994 1
+2120 8225 1
+2120 8290 1
+2125 1566 1
+2125 1836 1
+2125 2145 1
+2126 993 1
+2127 15 1
+2127 993 1
+2127 2625 1
+2128 764 1
+2128 993 1
+2128 1992 1
+2129 978 1
+2129 993 1
+2129 1990 1
+2129 2144 1
+2129 2210 1
+2129 2328 1
+2129 2398 1
+2129 2565 1
+2129 2625 1
+2129 2657 1
+2129 3024 1
+2129 3026 1
+2129 3034 1
+2129 3144 1
+2129 3404 1
+2129 3439 1
+2129 3454 1
+2129 3529 1
+2129 3557 1
+2129 3568 1
+2129 3645 1
+2129 3724 1
+2129 3800 1
+2129 3812 1
+2129 3903 1
+2129 3958 1
+2129 4049 1
+2129 4138 1
+2129 4234 1
+2129 4290 1
+2129 4299 1
+2129 4335 1
+2129 4424 1
+2129 4463 1
+2129 4510 1
+2129 4528 1
+2129 4531 1
+2129 4547 1
+2129 4578 1
+2129 4735 1
+2129 4808 1
+2129 5891 1
+2129 8293 1
+2129 8294 1
+2130 290 1
+2130 993 1
+2130 1646 1
+2130 1723 1
+2130 1977 1
+2130 2375 1
+2130 2470 1
+2130 2955 1
+2131 993 1
+2132 993 1
+2133 56 1
+2133 214 1
+2133 332 1
+2133 350 1
+2133 403 1
+2133 722 1
+2133 765 1
+2133 859 1
+2133 946 1
+2133 947 1
+2133 959 1
+2133 968 1
+2133 993 1
+2133 1018 1
+2133 1031 1
+2133 1035 1
+2133 1049 1
+2133 1097 1
+2133 1186 1
+2133 1211 1
+2133 1243 1
+2133 1250 1
+2133 1291 1
+2133 1297 1
+2133 1374 1
+2133 1384 1
+2133 1390 1
+2133 1419 1
+2133 1492 1
+2133 1521 1
+2133 1547 1
+2133 1565 1
+2133 1596 1
+2133 1608 1
+2133 1621 1
+2133 1637 1
+2133 1646 1
+2133 1653 1
+2133 1700 1
+2133 1705 1
+2133 1717 1
+2133 1723 1
+2133 1772 1
+2133 1808 1
+2133 1835 1
+2133 1836 1
+2133 1842 1
+2133 1847 1
+2133 1888 1
+2133 1918 1
+2133 1956 1
+2133 1964 1
+2133 1977 1
+2133 1992 1
+2133 2062 1
+2133 2076 1
+2133 2102 1
+2133 2117 1
+2133 2120 1
+2133 2174 1
+2133 2193 1
+2133 2240 1
+2133 2322 1
+2133 2323 1
+2133 2329 1
+2133 2332 1
+2133 2340 1
+2133 2341 1
+2133 2345 1
+2133 2350 1
+2133 2375 1
+2133 2385 1
+2133 2397 1
+2133 2400 1
+2133 2410 1
+2133 2425 1
+2133 2435 1
+2133 2470 1
+2133 2475 1
+2133 2479 1
+2133 2490 1
+2133 2504 1
+2133 2547 1
+2133 2560 1
+2133 2570 1
+2133 2579 1
+2133 2580 1
+2133 2587 1
+2133 2593 1
+2133 2599 1
+2133 2604 1
+2133 2619 1
+2133 2625 1
+2133 2643 1
+2133 2646 1
+2133 2665 1
+2133 2669 1
+2133 2685 1
+2133 2707 1
+2133 2720 1
+2133 2721 1
+2133 2754 1
+2133 2768 1
+2133 2777 1
+2133 2781 1
+2133 2794 1
+2133 2797 1
+2133 2805 1
+2133 2809 1
+2133 2814 1
+2133 2815 1
+2133 2828 1
+2133 2834 1
+2133 2838 1
+2133 2877 1
+2133 2880 1
+2133 2922 1
+2133 2926 1
+2133 2955 1
+2133 2963 1
+2133 2968 1
+2133 2972 1
+2133 2979 1
+2133 2993 1
+2133 2999 1
+2133 3029 1
+2133 3755 1
+2133 8290 1
+2133 8291 1
+2134 993 1
+2134 1990 1
+2134 2144 1
+2134 2328 1
+2134 3125 1
+2134 3192 1
+2134 4191 1
+2134 4256 1
+2134 4289 1
+2134 4290 1
+2134 4299 1
+2134 4323 1
+2134 4365 1
+2134 4386 1
+2135 15 1
+2135 737 1
+2135 741 1
+2135 762 1
+2135 825 1
+2135 993 1
+2135 1247 1
+2135 1267 1
+2135 1297 1
+2135 1419 1
+2135 1453 1
+2135 1473 1
+2135 1633 1
+2135 1729 1
+2135 1792 1
+2135 1837 1
+2135 1972 1
+2135 1982 1
+2135 2014 1
+2135 2117 1
+2135 2120 1
+2135 2145 1
+2135 2174 1
+2135 2225 1
+2135 2251 1
+2135 2256 1
+2135 2289 1
+2135 2322 1
+2135 2323 1
+2135 2324 1
+2135 2328 1
+2135 2375 1
+2135 2381 1
+2135 2398 1
+2135 2433 1
+2135 2456 1
+2135 2470 1
+2135 2485 1
+2135 2508 1
+2135 2516 1
+2135 2517 1
+2135 2535 1
+2135 2560 1
+2135 2565 1
+2135 2594 1
+2135 2625 1
+2135 2651 1
+2135 2654 1
+2135 2657 1
+2135 2658 1
+2135 2693 1
+2135 2707 1
+2135 2747 1
+2135 2763 1
+2135 2774 1
+2135 2775 1
+2135 2790 1
+2135 2794 1
+2135 2830 1
+2135 2844 1
+2135 2851 1
+2135 2900 1
+2135 2909 1
+2135 2912 1
+2135 2963 1
+2135 3010 1
+2135 3020 1
+2135 3033 1
+2135 3034 1
+2135 3089 1
+2135 3117 1
+2135 3126 1
+2135 3237 1
+2135 3238 1
+2135 3253 1
+2135 3276 1
+2135 3321 1
+2135 3338 1
+2135 3352 1
+2135 3371 1
+2135 3393 1
+2135 3452 1
+2135 3456 1
+2135 3480 1
+2135 3537 1
+2135 3568 1
+2135 3614 1
+2135 3691 1
+2135 3724 1
+2135 3748 1
+2135 3787 1
+2135 3792 1
+2135 3807 1
+2135 3873 1
+2135 3880 1
+2135 3887 1
+2135 4037 1
+2135 4099 1
+2135 4124 1
+2135 4179 1
+2135 4191 1
+2135 4234 1
+2135 4266 1
+2135 4335 1
+2135 4448 1
+2135 4463 1
+2135 4530 1
+2135 4534 1
+2135 4536 1
+2135 4604 1
+2135 4661 1
+2135 4712 1
+2135 4735 1
+2135 4748 1
+2135 4777 1
+2135 4811 1
+2135 4820 1
+2135 4827 1
+2135 4846 1
+2135 4899 1
+2135 4953 1
+2135 5002 1
+2135 5100 1
+2135 5155 1
+2135 5222 1
+2135 5254 1
+2135 5404 1
+2135 5412 1
+2135 5449 1
+2135 5454 1
+2135 5459 1
+2135 5463 1
+2135 5484 1
+2135 5539 1
+2135 5568 1
+2135 5651 1
+2135 5683 1
+2135 5743 1
+2135 5963 1
+2135 6218 1
+2135 6262 1
+2135 6337 1
+2135 6496 1
+2135 7587 1
+2135 7632 1
+2135 7908 1
+2136 2137 1
+2138 1285 1
+2139 285 1
+2139 2151 1
+2139 8290 1
+2141 1772 1
+2141 2151 1
+2142 1186 1
+2142 2151 1
+2143 2151 1
+2144 15 1
+2144 417 1
+2144 737 1
+2144 2151 1
+2144 2210 1
+2144 2328 1
+2144 2398 1
+2144 2653 1
+2144 3454 1
+2144 3456 1
+2144 3459 1
+2144 3660 1
+2144 3720 1
+2144 4037 1
+2144 4051 1
+2144 4218 1
+2144 4266 1
+2144 4349 1
+2144 4687 1
+2144 4735 1
+2144 5285 1
+2144 7632 1
+2144 8294 1
+2145 204 1
+2145 737 1
+2145 947 1
+2145 974 1
+2145 1166 1
+2145 1549 1
+2145 1608 1
+2145 1637 1
+2145 1653 1
+2145 1679 1
+2145 1705 1
+2145 1734 1
+2145 1814 1
+2145 1847 1
+2145 1888 1
+2145 1982 1
+2145 2066 1
+2145 2120 1
+2145 2144 1
+2145 2151 1
+2145 2210 1
+2145 2258 1
+2145 2289 1
+2145 2297 1
+2145 2323 1
+2145 2328 1
+2145 2356 1
+2145 2364 1
+2145 2375 1
+2145 2398 1
+2145 2411 1
+2145 2456 1
+2145 2504 1
+2145 2516 1
+2145 2535 1
+2145 2565 1
+2145 2594 1
+2145 2620 1
+2145 2651 1
+2145 2747 1
+2145 2774 1
+2145 2775 1
+2145 2790 1
+2145 2794 1
+2145 2811 1
+2145 2822 1
+2145 2831 1
+2145 2871 1
+2145 2912 1
+2145 2922 1
+2145 2981 1
+2145 3002 1
+2145 3005 1
+2145 3024 1
+2145 3084 1
+2145 3125 1
+2145 3130 1
+2145 3140 1
+2145 3260 1
+2145 3265 1
+2145 3291 1
+2145 3320 1
+2145 3334 1
+2145 3338 1
+2145 3376 1
+2145 3393 1
+2145 3439 1
+2145 3473 1
+2145 3537 1
+2145 3587 1
+2145 3631 1
+2145 3645 1
+2145 3664 1
+2145 3787 1
+2145 3800 1
+2145 3807 1
+2145 3843 1
+2145 3873 1
+2145 3903 1
+2145 4037 1
+2145 4191 1
+2145 4234 1
+2145 4266 1
+2145 4289 1
+2145 4335 1
+2145 4384 1
+2145 4400 1
+2145 4424 1
+2145 4485 1
+2145 4574 1
+2145 4587 1
+2145 4687 1
+2145 4735 1
+2145 4792 1
+2145 4798 1
+2145 4827 1
+2145 4875 1
+2145 4953 1
+2145 5020 1
+2145 5058 1
+2145 5079 1
+2145 5092 1
+2145 5130 1
+2145 5200 1
+2145 5210 1
+2145 5226 1
+2145 5254 1
+2145 5273 1
+2145 5288 1
+2145 5404 1
+2145 5412 1
+2145 5463 1
+2145 5543 1
+2145 5563 1
+2145 5800 1
+2145 5811 1
+2145 5827 1
+2145 5828 1
+2145 5837 1
+2145 5902 1
+2145 6006 1
+2145 6096 1
+2145 6097 1
+2145 6166 1
+2145 6221 1
+2145 6299 1
+2145 6330 1
+2145 6414 1
+2145 6437 1
+2145 6441 1
+2145 6498 1
+2145 6554 1
+2145 6634 1
+2145 6784 1
+2145 6855 1
+2145 6901 1
+2145 7279 1
+2145 7632 1
+2145 7651 1
+2145 7699 1
+2145 7757 1
+2145 7924 1
+2145 8290 1
+2145 8293 1
+2145 8297 1
+2146 2151 1
+2147 2151 1
+2148 2151 1
+2149 975 1
+2149 2151 1
+2150 2151 1
+2152 1757 1
+2152 2085 1
+2152 2165 1
+2152 2181 1
+2156 761 1
+2156 762 1
+2156 946 1
+2156 1012 1
+2156 1035 1
+2156 1061 1
+2156 1140 1
+2156 1353 1
+2156 1492 1
+2156 1549 1
+2156 1608 1
+2156 1621 1
+2156 1678 1
+2156 1700 1
+2156 1772 1
+2156 1888 1
+2156 1992 1
+2156 2071 1
+2156 2157 1
+2156 2165 1
+2156 2182 1
+2156 2195 1
+2156 2205 1
+2156 2211 1
+2156 2233 1
+2156 2241 1
+2156 2294 1
+2156 2329 1
+2156 2362 1
+2156 2378 1
+2156 2484 1
+2156 2490 1
+2156 2499 1
+2156 2517 1
+2156 2580 1
+2156 2589 1
+2156 2670 1
+2156 2736 1
+2156 3745 1
+2156 8290 1
+2156 8291 1
+2155 2157 1
+2159 764 1
+2159 1140 1
+2159 1444 1
+2159 1749 1
+2159 1783 1
+2159 1848 1
+2159 1888 1
+2159 1919 1
+2159 1997 1
+2159 2071 1
+2159 2091 1
+2159 2128 1
+2159 2145 1
+2159 2210 1
+2159 2241 1
+2159 2246 1
+2159 2253 1
+2159 8290 1
+2160 15 1
+2160 761 1
+2160 762 1
+2160 1297 1
+2160 1416 1
+2160 1549 1
+2160 2066 1
+2160 2328 1
+2160 2371 1
+2160 2398 1
+2160 2470 1
+2160 2508 1
+2160 2535 1
+2160 2900 1
+2160 3089 1
+2160 3140 1
+2160 3145 1
+2160 3150 1
+2160 3164 1
+2160 3253 1
+2160 3562 1
+2160 3776 1
+2160 3812 1
+2160 5254 1
+2160 5829 1
+2160 8290 1
+2161 761 1
+2161 2409 1
+2161 8290 1
+2163 761 1
+2163 873 1
+2164 761 1
+2168 350 1
+2168 2174 1
+2168 2977 1
+2167 2168 1
+2169 946 1
+2169 1031 1
+2169 1035 1
+2169 1211 1
+2169 1374 1
+2169 1390 1
+2169 1521 1
+2169 1621 1
+2169 1705 1
+2169 1772 1
+2169 1836 1
+2169 1842 1
+2169 1888 1
+2169 1977 1
+2169 1997 1
+2169 2117 1
+2169 2120 1
+2169 2174 1
+2169 2202 1
+2169 2241 1
+2169 2246 1
+2169 2285 1
+2169 2294 1
+2169 2322 1
+2169 2329 1
+2169 2580 1
+2169 2669 1
+2169 2685 1
+2169 2902 1
+2169 8290 1
+2169 8291 1
+2169 8292 1
+2170 1772 1
+2170 2544 1
+2171 1297 1
+2171 1679 1
+2171 1772 1
+2171 2416 1
+2171 2651 1
+2171 2660 1
+2171 2708 1
+2171 2754 1
+2171 2790 1
+2171 3021 1
+2171 3030 1
+2171 3307 1
+2171 3319 1
+2171 3338 1
+2171 3351 1
+2171 4713 1
+2172 15 1
+2172 332 1
+2172 873 1
+2172 968 1
+2172 1111 1
+2172 1250 1
+2172 1384 1
+2172 1608 1
+2172 1772 1
+2172 1956 1
+2172 1964 1
+2172 2163 1
+2172 2479 1
+2172 2484 1
+2172 2535 1
+2172 2570 1
+2172 2685 1
+2172 2777 1
+2172 2794 1
+2172 2801 1
+2172 2877 1
+2172 3034 1
+2172 3479 1
+2172 3614 1
+2172 3897 1
+2172 4037 1
+2172 4980 1
+2172 6328 1
+2172 6407 1
+2173 1772 1
+2174 214 1
+2174 1154 1
+2174 1353 1
+2174 1374 1
+2174 1564 1
+2174 1583 1
+2174 1592 1
+2174 1621 1
+2174 1808 1
+2174 2066 1
+2174 2102 1
+2174 2120 1
+2174 2160 1
+2174 2210 1
+2174 2256 1
+2174 2276 1
+2174 2328 1
+2174 2332 1
+2174 2339 1
+2174 2410 1
+2174 2411 1
+2174 2435 1
+2174 2470 1
+2174 2504 1
+2174 2570 1
+2174 2576 1
+2174 2585 1
+2174 2594 1
+2174 2607 1
+2174 2618 1
+2174 2619 1
+2174 2620 1
+2174 2625 1
+2174 2651 1
+2174 2751 1
+2174 2754 1
+2174 2770 1
+2174 2775 1
+2174 2777 1
+2174 2801 1
+2174 2809 1
+2174 2821 1
+2174 2825 1
+2174 2828 1
+2174 2838 1
+2174 2877 1
+2174 2928 1
+2174 2946 1
+2174 2955 1
+2174 3007 1
+2174 3030 1
+2174 3155 1
+2174 3253 1
+2174 3351 1
+2174 3439 1
+2174 3486 1
+2174 3516 1
+2174 3903 1
+2174 4231 1
+2174 4269 1
+2174 4687 1
+2174 5626 1
+2174 6498 1
+2174 7620 1
+2174 8291 1
+2175 2163 1
+2176 762 1
+2176 856 1
+2176 873 1
+2176 1211 1
+2176 1792 1
+2176 2205 1
+2176 2237 1
+2176 2322 1
+2176 2411 1
+2176 2651 1
+2176 2654 1
+2176 2662 1
+2176 2700 1
+2176 2856 1
+2176 3099 1
+2176 3164 1
+2176 3307 1
+2177 873 1
+2177 2991 1
+2177 2993 1
+2178 15 1
+2178 2285 1
+2178 2625 1
+2181 2475 1
+2181 4983 1
+2179 2181 1
+2180 2181 1
+2182 2185 1
+2183 2185 1
+2184 2085 1
+2184 2185 1
+2184 2264 1
+2186 741 1
+2186 1026 1
+2186 1111 1
+2186 1291 1
+2186 1315 1
+2186 1403 1
+2186 1419 1
+2186 1705 1
+2186 1769 1
+2186 1808 1
+2186 1918 1
+2186 1919 1
+2186 2174 1
+2186 2209 1
+2186 2264 1
+2186 2375 1
+2186 2547 1
+2186 2599 1
+2186 2665 1
+2186 2727 1
+2186 2747 1
+2186 2775 1
+2186 2814 1
+2186 2922 1
+2186 2963 1
+2186 2968 1
+2186 2977 1
+2186 2979 1
+2186 2999 1
+2186 3021 1
+2186 3029 1
+2186 3089 1
+2186 3148 1
+2186 3192 1
+2186 3238 1
+2186 3321 1
+2186 3351 1
+2186 3352 1
+2186 3408 1
+2186 3607 1
+2186 3969 1
+2186 4269 1
+2186 4338 1
+2186 4574 1
+2186 4604 1
+2186 4828 1
+2186 5103 1
+2186 5199 1
+2186 5404 1
+2186 5423 1
+2186 5584 1
+2186 5680 1
+2186 5848 1
+2186 6006 1
+2186 6098 1
+2186 6229 1
+2186 6299 1
+2186 6832 1
+2186 6913 1
+2186 7073 1
+2186 7108 1
+2187 1111 1
+2188 1111 1
+2188 1548 1
+2188 5254 1
+2189 1111 1
+2190 1111 1
+2191 1111 1
+2192 1315 1
+2192 2195 1
+2192 6914 1
+2192 7131 1
+2192 7803 1
+2193 1031 1
+2193 1211 1
+2193 1297 1
+2193 1492 1
+2193 1836 1
+2193 1935 1
+2193 2062 1
+2193 2195 1
+2193 2240 1
+2193 2398 1
+2193 2991 1
+2193 3811 1
+2194 2145 1
+2194 2195 1
+2194 2242 1
+2196 2085 1
+2196 4179 1
+2196 7890 1
+2197 859 1
+2197 1835 1
+2197 2085 1
+2197 2470 1
+2198 2085 1
+2198 2091 1
+2198 2247 1
+2199 2085 1
+2200 2202 1
+2200 2504 1
+2201 2202 1
+2203 975 1
+2204 975 1
+2206 1097 1
+2206 1154 1
+2206 1374 1
+2206 1608 1
+2206 1956 1
+2206 2233 1
+2206 2234 1
+2206 2340 1
+2206 2411 1
+2206 2499 1
+2206 2504 1
+2206 2672 1
+2206 2720 1
+2206 2777 1
+2209 204 1
+2209 350 1
+2209 974 1
+2209 1166 1
+2209 1357 1
+2209 1416 1
+2209 1564 1
+2209 1633 1
+2209 1646 1
+2209 1653 1
+2209 1787 1
+2209 2120 1
+2209 2252 1
+2209 2338 1
+2209 2410 1
+2209 2504 1
+2209 2542 1
+2209 2594 1
+2209 2657 1
+2209 2720 1
+2209 2805 1
+2209 2819 1
+2209 2900 1
+2209 3018 1
+2209 3020 1
+2209 3148 1
+2209 3201 1
+2209 3473 1
+2209 3489 1
+2209 3580 1
+2209 3587 1
+2210 1061 1
+2210 1140 1
+2210 1749 1
+2210 1787 1
+2210 2066 1
+2210 2211 1
+2210 2246 1
+2210 2253 1
+2210 2544 1
+2210 2790 1
+2210 3084 1
+2210 3394 1
+2210 3562 1
+2210 4013 1
+2210 4233 1
+2210 4735 1
+2210 5412 1
+2212 1985 1
+2213 1985 1
+2214 1985 1
+2214 1997 1
+2214 3136 1
+2215 1211 1
+2215 1444 1
+2215 1714 1
+2215 2397 1
+2215 2456 1
+2215 2470 1
+2215 3018 1
+2215 3027 1
+2215 3334 1
+2215 3792 1
+2215 4384 1
+2215 4735 1
+2215 5463 1
+2215 6296 1
+2215 7108 1
+2216 1714 1
+2217 825 1
+2217 1714 1
+2217 3125 1
+2217 3276 1
+2217 3562 1
+2217 3568 1
+2217 3785 1
+2217 3787 1
+2217 4384 1
+2217 5426 1
+2217 5631 1
+2218 1444 1
+2219 1444 1
+2221 1613 1
+2222 1613 1
+2223 1613 1
+2223 2398 1
+2223 2547 1
+2223 3084 1
+2223 3125 1
+2223 3720 1
+2223 3892 1
+2223 4071 1
+2223 4401 1
+2223 4798 1
+2223 5022 1
+2223 7553 1
+2223 8033 1
+2223 8148 1
+2223 8294 1
+2224 2102 1
+2224 2128 1
+2224 2625 1
+2225 15 1
+2225 764 1
+2225 856 1
+2225 1049 1
+2225 1492 1
+2225 1564 1
+2225 1700 1
+2225 1992 1
+2225 2071 1
+2225 2117 1
+2225 2128 1
+2225 2135 1
+2225 2145 1
+2225 2323 1
+2225 2328 1
+2225 2474 1
+2225 2625 1
+2225 2651 1
+2225 2775 1
+2225 2856 1
+2225 2951 1
+2225 3007 1
+2225 3020 1
+2225 3034 1
+2225 3089 1
+2225 3238 1
+2225 3253 1
+2225 3265 1
+2225 3452 1
+2225 3755 1
+2225 5022 1
+2225 5335 1
+2225 5412 1
+2225 8168 1
+2226 1018 1
+2226 1166 1
+2226 1374 1
+2226 1571 1
+2226 2128 1
+2226 2456 1
+2226 2504 1
+2226 2517 1
+2226 2790 1
+2226 3253 1
+2226 3352 1
+2226 3459 1
+2226 3607 1
+2226 4037 1
+2226 4266 1
+2226 4661 1
+2226 4827 1
+2226 5773 1
+2226 5800 1
+2226 6299 1
+2226 6330 1
+2226 6523 1
+2226 6634 1
+2226 7890 1
+2226 7924 1
+2226 7961 1
+2226 8168 1
+2226 8291 1
+2227 1808 1
+2227 2071 1
+2227 2128 1
+2227 2375 1
+2234 825 1
+2234 1267 1
+2234 2116 1
+2234 2285 1
+2234 2654 1
+2234 2724 1
+2234 2856 1
+2234 2900 1
+2234 3089 1
+2234 3145 1
+2234 3150 1
+2234 3313 1
+2234 3321 1
+2234 8293 1
+2228 2234 1
+2230 214 1
+2230 332 1
+2230 417 1
+2230 744 1
+2230 1297 1
+2230 1419 1
+2230 1608 1
+2230 1633 1
+2230 1700 1
+2230 1792 1
+2230 1808 1
+2230 1847 1
+2230 1964 1
+2230 2117 1
+2230 2120 1
+2230 2135 1
+2230 2182 1
+2230 2231 1
+2230 2234 1
+2230 2240 1
+2230 2256 1
+2230 2375 1
+2230 2411 1
+2230 2484 1
+2230 2504 1
+2230 2585 1
+2230 2591 1
+2230 2594 1
+2230 2619 1
+2230 2625 1
+2230 2638 1
+2230 2651 1
+2230 2654 1
+2230 2685 1
+2230 2794 1
+2230 2926 1
+2230 2996 1
+2230 3005 1
+2230 3033 1
+2230 3059 1
+2230 3080 1
+2230 3084 1
+2230 3104 1
+2230 3130 1
+2230 3320 1
+2230 3541 1
+2230 3623 1
+2230 3680 1
+2230 3875 1
+2231 15 1
+2231 332 1
+2231 744 1
+2231 968 1
+2231 1012 1
+2231 1018 1
+2231 1186 1
+2231 1250 1
+2231 1492 1
+2231 1596 1
+2231 1608 1
+2231 1637 1
+2231 1706 1
+2231 1835 1
+2231 1964 1
+2231 2117 1
+2231 2182 1
+2231 2234 1
+2231 2294 1
+2231 2332 1
+2231 2340 1
+2231 2366 1
+2231 2400 1
+2231 2426 1
+2231 2435 1
+2231 2490 1
+2231 2499 1
+2231 2504 1
+2231 2517 1
+2231 2570 1
+2231 2571 1
+2231 2575 1
+2231 2579 1
+2231 2587 1
+2231 2589 1
+2231 2591 1
+2231 2594 1
+2231 2604 1
+2231 2607 1
+2231 2618 1
+2231 2629 1
+2231 2643 1
+2231 2650 1
+2231 2657 1
+2231 2670 1
+2231 2720 1
+2231 2736 1
+2231 2801 1
+2231 2818 1
+2231 2821 1
+2231 2825 1
+2231 2918 1
+2231 2977 1
+2231 2979 1
+2231 3030 1
+2231 3050 1
+2231 3056 1
+2231 3068 1
+2231 3104 1
+2231 3171 1
+2231 3201 1
+2231 3614 1
+2231 3976 1
+2231 5412 1
+2231 5963 1
+2231 6251 1
+2229 285 1
+2229 350 1
+2229 633 1
+2229 762 1
+2229 856 1
+2229 968 1
+2229 974 1
+2229 1097 1
+2229 1157 1
+2229 1166 1
+2229 1186 1
+2229 1250 1
+2229 1267 1
+2229 1357 1
+2229 1385 1
+2229 1393 1
+2229 1416 1
+2229 1437 1
+2229 1549 1
+2229 1564 1
+2229 1679 1
+2229 1717 1
+2229 1729 1
+2229 1734 1
+2229 1754 1
+2229 1792 1
+2229 1814 1
+2229 1835 1
+2229 1990 1
+2229 2116 1
+2229 2117 1
+2229 2129 1
+2229 2135 1
+2229 2209 1
+2229 2225 1
+2229 2231 1
+2229 2234 1
+2229 2237 1
+2229 2252 1
+2229 2289 1
+2229 2325 1
+2229 2328 1
+2229 2356 1
+2229 2371 1
+2229 2416 1
+2229 2474 1
+2229 2475 1
+2229 2504 1
+2229 2517 1
+2229 2550 1
+2229 2565 1
+2229 2570 1
+2229 2571 1
+2229 2575 1
+2229 2579 1
+2229 2580 1
+2229 2587 1
+2229 2589 1
+2229 2591 1
+2229 2593 1
+2229 2594 1
+2229 2597 1
+2229 2604 1
+2229 2607 1
+2229 2612 1
+2229 2625 1
+2229 2629 1
+2229 2646 1
+2229 2651 1
+2229 2654 1
+2229 2662 1
+2229 2674 1
+2229 2697 1
+2229 2700 1
+2229 2708 1
+2229 2713 1
+2229 2720 1
+2229 2724 1
+2229 2754 1
+2229 2830 1
+2229 2856 1
+2229 2900 1
+2229 2912 1
+2229 2951 1
+2229 3018 1
+2229 3020 1
+2229 3021 1
+2229 3030 1
+2229 3089 1
+2229 3126 1
+2229 3140 1
+2229 3144 1
+2229 3145 1
+2229 3148 1
+2229 3150 1
+2229 3155 1
+2229 3164 1
+2229 3173 1
+2229 3192 1
+2229 3235 1
+2229 3243 1
+2229 3251 1
+2229 3253 1
+2229 3265 1
+2229 3276 1
+2229 3307 1
+2229 3319 1
+2229 3320 1
+2229 3324 1
+2229 3338 1
+2229 3346 1
+2229 3348 1
+2229 3351 1
+2229 3371 1
+2229 3376 1
+2229 3394 1
+2229 3408 1
+2229 3520 1
+2229 3537 1
+2229 3568 1
+2229 3580 1
+2229 3587 1
+2229 3645 1
+2229 3660 1
+2229 3661 1
+2229 3813 1
+2229 4191 1
+2229 4234 1
+2229 4256 1
+2229 4289 1
+2229 4290 1
+2229 4297 1
+2229 4323 1
+2229 4349 1
+2229 4365 1
+2229 4373 1
+2229 4384 1
+2229 4385 1
+2229 4402 1
+2229 4411 1
+2229 4417 1
+2229 4422 1
+2229 4424 1
+2232 332 1
+2232 1956 1
+2232 2234 1
+2232 2425 1
+2232 2426 1
+2232 2589 1
+2232 2591 1
+2232 2618 1
+2232 2629 1
+2232 2647 1
+2232 2720 1
+2232 2781 1
+2233 56 1
+2233 332 1
+2233 859 1
+2233 959 1
+2233 968 1
+2233 1035 1
+2233 1097 1
+2233 1186 1
+2233 1250 1
+2233 1492 1
+2233 1547 1
+2233 1608 1
+2233 1717 1
+2233 1919 1
+2233 1956 1
+2233 2117 1
+2233 2193 1
+2233 2234 1
+2233 2251 1
+2233 2332 1
+2233 2345 1
+2233 2385 1
+2233 2400 1
+2233 2475 1
+2233 2504 1
+2233 2575 1
+2233 2587 1
+2233 2593 1
+2233 2604 1
+2233 2625 1
+2233 2801 1
+2233 2809 1
+2233 3033 1
+2233 3056 1
+2233 3238 1
+2233 7695 1
+2235 1783 1
+2236 633 1
+2236 762 1
+2236 764 1
+2236 856 1
+2236 946 1
+2236 1061 1
+2236 1267 1
+2236 1291 1
+2236 1357 1
+2236 1393 1
+2236 1416 1
+2236 1679 1
+2236 1734 1
+2236 1754 1
+2236 1781 1
+2236 1783 1
+2236 1792 1
+2236 1814 1
+2236 1848 1
+2236 1919 1
+2236 2071 1
+2236 2116 1
+2236 2135 1
+2236 2145 1
+2236 2225 1
+2236 2231 1
+2236 2241 1
+2236 2246 1
+2236 2251 1
+2236 2256 1
+2236 2273 1
+2236 2323 1
+2236 2325 1
+2236 2356 1
+2236 2411 1
+2236 2474 1
+2236 2550 1
+2236 2593 1
+2236 2625 1
+2236 2651 1
+2236 2654 1
+2236 2662 1
+2236 2697 1
+2236 2700 1
+2236 2708 1
+2236 2713 1
+2236 2721 1
+2236 2724 1
+2236 2754 1
+2236 2830 1
+2236 2856 1
+2236 2900 1
+2236 2912 1
+2236 2951 1
+2236 2966 1
+2236 2968 1
+2236 3020 1
+2236 3030 1
+2236 3033 1
+2236 3034 1
+2236 3089 1
+2236 3099 1
+2236 3117 1
+2236 3126 1
+2236 3140 1
+2236 3145 1
+2236 3150 1
+2236 3164 1
+2236 3243 1
+2236 3251 1
+2236 3253 1
+2236 3258 1
+2236 3265 1
+2236 3320 1
+2236 8291 1
+2237 15 1
+2237 204 1
+2237 465 1
+2237 608 1
+2237 737 1
+2237 762 1
+2237 974 1
+2237 1166 1
+2237 1185 1
+2237 1291 1
+2237 1297 1
+2237 1305 1
+2237 1315 1
+2237 1357 1
+2237 1416 1
+2237 1549 1
+2237 1633 1
+2237 1637 1
+2237 1688 1
+2237 1706 1
+2237 1729 1
+2237 1734 1
+2237 1744 1
+2237 1754 1
+2237 1769 1
+2237 1781 1
+2237 1919 1
+2237 1990 1
+2237 2014 1
+2237 2016 1
+2237 2091 1
+2237 2114 1
+2237 2134 1
+2237 2144 1
+2237 2145 1
+2237 2182 1
+2237 2209 1
+2237 2251 1
+2237 2252 1
+2237 2256 1
+2237 2257 1
+2237 2276 1
+2237 2289 1
+2237 2290 1
+2237 2297 1
+2237 2324 1
+2237 2328 1
+2237 2381 1
+2237 2398 1
+2237 2456 1
+2237 2470 1
+2237 2485 1
+2237 2510 1
+2237 2517 1
+2237 2535 1
+2237 2544 1
+2237 2550 1
+2237 2565 1
+2237 2576 1
+2237 2585 1
+2237 2592 1
+2237 2593 1
+2237 2594 1
+2237 2595 1
+2237 2612 1
+2237 2619 1
+2237 2646 1
+2237 2651 1
+2237 2654 1
+2237 2657 1
+2237 2660 1
+2237 2667 1
+2237 2674 1
+2237 2686 1
+2237 2693 1
+2237 2696 1
+2237 2697 1
+2237 2700 1
+2237 2707 1
+2237 2746 1
+2237 2747 1
+2237 2760 1
+2237 2790 1
+2237 2811 1
+2237 2815 1
+2237 2819 1
+2237 2830 1
+2237 2831 1
+2237 2871 1
+2237 2909 1
+2237 2932 1
+2237 2955 1
+2237 2968 1
+2237 2973 1
+2237 2996 1
+2237 2999 1
+2237 3005 1
+2237 3010 1
+2237 3014 1
+2237 3021 1
+2237 3024 1
+2237 3026 1
+2237 3028 1
+2237 3029 1
+2237 3033 1
+2237 3034 1
+2237 3059 1
+2237 3084 1
+2237 3089 1
+2237 3114 1
+2237 3117 1
+2237 3125 1
+2237 3140 1
+2237 3144 1
+2237 3148 1
+2237 3150 1
+2237 3164 1
+2237 3192 1
+2237 3260 1
+2237 3284 1
+2237 3291 1
+2237 3307 1
+2237 3309 1
+2237 3321 1
+2237 3334 1
+2237 3338 1
+2237 3352 1
+2237 3394 1
+2237 3404 1
+2237 3408 1
+2237 3417 1
+2237 3433 1
+2237 3439 1
+2237 3443 1
+2237 3447 1
+2237 3453 1
+2237 3454 1
+2237 3456 1
+2237 3464 1
+2237 3480 1
+2237 3498 1
+2237 3529 1
+2237 3537 1
+2237 3541 1
+2237 3557 1
+2237 3568 1
+2237 3580 1
+2237 3615 1
+2237 3635 1
+2237 3643 1
+2237 3645 1
+2237 3650 1
+2237 3660 1
+2237 3661 1
+2237 3680 1
+2237 3748 1
+2237 3800 1
+2237 3807 1
+2237 3812 1
+2237 3847 1
+2237 3871 1
+2237 3887 1
+2237 3892 1
+2237 3903 1
+2237 3956 1
+2237 3958 1
+2237 3970 1
+2237 4011 1
+2237 4040 1
+2237 4044 1
+2237 4072 1
+2237 4103 1
+2237 4124 1
+2237 4191 1
+2237 4212 1
+2237 4234 1
+2237 4256 1
+2237 4261 1
+2237 4263 1
+2237 4266 1
+2237 4269 1
+2237 4276 1
+2237 4289 1
+2237 4290 1
+2237 4299 1
+2237 4335 1
+2237 4365 1
+2237 4384 1
+2237 4417 1
+2237 4422 1
+2237 4424 1
+2237 4448 1
+2237 4453 1
+2237 4463 1
+2237 4485 1
+2237 4510 1
+2237 4528 1
+2237 4551 1
+2237 4574 1
+2237 4578 1
+2237 4600 1
+2237 4613 1
+2237 4653 1
+2237 4661 1
+2237 4662 1
+2237 4666 1
+2237 4687 1
+2237 4719 1
+2237 4735 1
+2237 4781 1
+2237 4796 1
+2237 4808 1
+2237 4811 1
+2237 4814 1
+2237 4824 1
+2237 4827 1
+2237 4828 1
+2237 4938 1
+2237 4962 1
+2237 5061 1
+2237 5092 1
+2237 5100 1
+2237 5130 1
+2237 5155 1
+2237 5162 1
+2237 5178 1
+2237 5262 1
+2237 5412 1
+2237 5430 1
+2237 5449 1
+2237 5459 1
+2237 5482 1
+2237 5509 1
+2237 5511 1
+2237 5640 1
+2237 5844 1
+2237 5848 1
+2237 5886 1
+2237 6229 1
+2237 6624 1
+2237 8293 1
+2238 2091 1
+2241 1097 1
+2241 1186 1
+2241 1353 1
+2241 1492 1
+2241 1621 1
+2241 1700 1
+2241 1888 1
+2241 1992 1
+2241 1997 1
+2241 2117 1
+2241 2504 1
+2241 2587 1
+2241 2604 1
+2241 2665 1
+2239 2241 1
+2240 15 1
+2240 204 1
+2240 285 1
+2240 737 1
+2240 856 1
+2240 947 1
+2240 974 1
+2240 1018 1
+2240 1026 1
+2240 1031 1
+2240 1074 1
+2240 1186 1
+2240 1243 1
+2240 1297 1
+2240 1307 1
+2240 1393 1
+2240 1492 1
+2240 1549 1
+2240 1565 1
+2240 1608 1
+2240 1633 1
+2240 1842 1
+2240 1888 1
+2240 2066 1
+2240 2071 1
+2240 2102 1
+2240 2117 1
+2240 2120 1
+2240 2160 1
+2240 2174 1
+2240 2209 1
+2240 2237 1
+2240 2241 1
+2240 2256 1
+2240 2285 1
+2240 2322 1
+2240 2325 1
+2240 2328 1
+2240 2341 1
+2240 2356 1
+2240 2362 1
+2240 2398 1
+2240 2409 1
+2240 2435 1
+2240 2499 1
+2240 2504 1
+2240 2535 1
+2240 2575 1
+2240 2591 1
+2240 2594 1
+2240 2625 1
+2240 2651 1
+2240 2657 1
+2240 2665 1
+2240 2746 1
+2240 2951 1
+2240 3005 1
+2240 3014 1
+2240 3020 1
+2240 3024 1
+2240 3030 1
+2240 3130 1
+2240 3238 1
+2240 3260 1
+2240 3408 1
+2240 3580 1
+2240 3615 1
+2240 3796 1
+2240 3842 1
+2240 3962 1
+2240 3976 1
+2240 4037 1
+2240 4065 1
+2240 4099 1
+2240 4183 1
+2240 4256 1
+2240 4351 1
+2240 4471 1
+2240 4528 1
+2240 4536 1
+2240 4981 1
+2240 5079 1
+2240 5254 1
+2240 5321 1
+2240 5524 1
+2240 5605 1
+2240 5814 1
+2240 5827 1
+2240 5871 1
+2240 6327 1
+2240 6337 1
+2240 6567 1
+2240 6576 1
+2240 6634 1
+2240 6774 1
+2240 6832 1
+2240 6913 1
+2240 7517 1
+2240 7620 1
+2240 7651 1
+2240 7662 1
+2240 7992 1
+2240 8083 1
+2240 8168 1
+2240 8290 1
+2240 8291 1
+2240 8293 1
+2240 8294 1
+2242 1140 1
+2242 1749 1
+2242 1848 1
+2041 1140 1
+2041 1378 1
+2041 2595 1
+2041 2654 1
+2041 3352 1
+2041 3408 1
+2243 2242 1
+2246 1919 1
+2246 2210 1
+2246 2323 1
+2246 2535 1
+2246 3130 1
+2246 4735 1
+2246 5412 1
+2246 5714 1
+2249 946 1
+2249 1353 1
+2249 1403 1
+2249 1565 1
+2249 1608 1
+2249 2071 1
+2249 2145 1
+2249 2281 1
+2249 2322 1
+2249 2338 1
+2249 2397 1
+2249 2400 1
+2249 2618 1
+2249 2625 1
+2249 2754 1
+2249 2851 1
+2249 3291 1
+2249 3346 1
+2249 3348 1
+2249 3479 1
+2249 3726 1
+2249 4361 1
+2249 5199 1
+2249 5233 1
+2249 5378 1
+2249 5404 1
+2249 5432 1
+2249 5439 1
+2249 5582 1
+2249 6299 1
+2249 6417 1
+2249 6503 1
+2249 6599 1
+2249 6736 1
+2249 6913 1
+2249 6976 1
+2249 7295 1
+2249 7301 1
+2250 2071 1
+2250 2246 1
+2250 8291 1
+2251 587 1
+2251 856 1
+2251 1061 1
+2251 1542 1
+2251 1679 1
+2251 1977 1
+2251 2071 1
+2251 2231 1
+2251 2332 1
+2251 2435 1
+2251 2625 1
+2251 2651 1
+2251 2654 1
+2251 2707 1
+2251 2721 1
+2251 2814 1
+2251 2815 1
+2251 2968 1
+2251 2972 1
+2251 2977 1
+2251 2999 1
+2251 3020 1
+2251 3056 1
+2251 3265 1
+2251 8291 1
+2252 825 1
+2252 1549 1
+2252 1744 1
+2252 2251 1
+2252 2253 1
+2252 2422 1
+2252 2585 1
+2252 2652 1
+2252 2654 1
+2252 2674 1
+2252 2693 1
+2252 2747 1
+2252 3005 1
+2252 3026 1
+2252 3461 1
+2252 3520 1
+2252 3576 1
+2252 3629 1
+2252 3745 1
+2252 3811 1
+2252 3946 1
+2252 3970 1
+2254 946 1
+2254 1847 1
+2254 1888 1
+2254 1992 1
+2254 2504 1
+2254 2805 1
+2255 722 1
+2255 859 1
+2255 946 1
+2255 947 1
+2255 959 1
+2255 1031 1
+2255 1243 1
+2255 1291 1
+2255 1390 1
+2255 1492 1
+2255 1547 1
+2255 1565 1
+2255 1700 1
+2255 1836 1
+2255 1842 1
+2255 1888 1
+2255 1919 1
+2255 1964 1
+2255 2193 1
+2255 2290 1
+2255 2323 1
+2255 2333 1
+2255 2350 1
+2255 2385 1
+2255 2397 1
+2255 2400 1
+2255 2560 1
+2255 2707 1
+2255 2815 1
+2255 2963 1
+2255 2999 1
+2256 15 1
+2256 56 1
+2256 214 1
+2256 350 1
+2256 403 1
+2256 425 1
+2256 741 1
+2256 765 1
+2256 778 1
+2256 827 1
+2256 946 1
+2256 968 1
+2256 1012 1
+2256 1049 1
+2256 1100 1
+2256 1291 1
+2256 1297 1
+2256 1374 1
+2256 1384 1
+2256 1419 1
+2256 1521 1
+2256 1549 1
+2256 1564 1
+2256 1565 1
+2256 1592 1
+2256 1596 1
+2256 1608 1
+2256 1637 1
+2256 1646 1
+2256 1653 1
+2256 1705 1
+2256 1723 1
+2256 1744 1
+2256 1777 1
+2256 1808 1
+2256 1814 1
+2256 1847 1
+2256 1918 1
+2256 1935 1
+2256 1990 1
+2256 1992 1
+2256 2053 1
+2256 2066 1
+2256 2072 1
+2256 2076 1
+2256 2102 1
+2256 2117 1
+2256 2120 1
+2256 2134 1
+2256 2145 1
+2256 2174 1
+2256 2225 1
+2256 2240 1
+2256 2264 1
+2256 2294 1
+2256 2307 1
+2256 2322 1
+2256 2329 1
+2256 2340 1
+2256 2341 1
+2256 2375 1
+2256 2410 1
+2256 2411 1
+2256 2416 1
+2256 2435 1
+2256 2475 1
+2256 2501 1
+2256 2504 1
+2256 2516 1
+2256 2517 1
+2256 2535 1
+2256 2544 1
+2256 2547 1
+2256 2560 1
+2256 2579 1
+2256 2587 1
+2256 2591 1
+2256 2593 1
+2256 2594 1
+2256 2599 1
+2256 2619 1
+2256 2625 1
+2256 2647 1
+2256 2650 1
+2256 2651 1
+2256 2652 1
+2256 2654 1
+2256 2657 1
+2256 2667 1
+2256 2669 1
+2256 2670 1
+2256 2685 1
+2256 2687 1
+2256 2707 1
+2256 2720 1
+2256 2736 1
+2256 2747 1
+2256 2751 1
+2256 2754 1
+2256 2763 1
+2256 2770 1
+2256 2774 1
+2256 2777 1
+2256 2781 1
+2256 2785 1
+2256 2787 1
+2256 2790 1
+2256 2794 1
+2256 2797 1
+2256 2799 1
+2256 2805 1
+2256 2809 1
+2256 2814 1
+2256 2815 1
+2256 2818 1
+2256 2821 1
+2256 2825 1
+2256 2828 1
+2256 2844 1
+2256 2859 1
+2256 2877 1
+2256 2900 1
+2256 2902 1
+2256 2918 1
+2256 2922 1
+2256 2926 1
+2256 2928 1
+2256 2955 1
+2256 2958 1
+2256 2963 1
+2256 2974 1
+2256 2979 1
+2256 2993 1
+2256 2999 1
+2256 3005 1
+2256 3023 1
+2256 3028 1
+2256 3030 1
+2256 3089 1
+2256 3117 1
+2256 3200 1
+2256 3243 1
+2256 3253 1
+2256 3256 1
+2256 3258 1
+2256 3266 1
+2256 3276 1
+2256 3291 1
+2256 3301 1
+2256 3324 1
+2256 3338 1
+2256 3352 1
+2256 3371 1
+2256 3376 1
+2256 3404 1
+2256 3409 1
+2256 3410 1
+2256 3429 1
+2256 3435 1
+2256 3443 1
+2256 3446 1
+2256 3456 1
+2256 3461 1
+2256 3473 1
+2256 3479 1
+2256 3483 1
+2256 3486 1
+2256 3489 1
+2256 3520 1
+2256 3547 1
+2256 3555 1
+2256 3562 1
+2256 3576 1
+2256 3587 1
+2256 3609 1
+2256 3614 1
+2256 3616 1
+2256 3635 1
+2256 3643 1
+2256 3646 1
+2256 3670 1
+2256 3720 1
+2256 3737 1
+2256 3769 1
+2256 3776 1
+2256 3785 1
+2256 3787 1
+2256 3800 1
+2256 3803 1
+2256 3811 1
+2256 3822 1
+2256 3849 1
+2256 3871 1
+2256 3893 1
+2256 3897 1
+2256 3973 1
+2256 3980 1
+2256 4037 1
+2256 4041 1
+2256 4047 1
+2256 4051 1
+2256 4055 1
+2256 4078 1
+2256 4110 1
+2256 4111 1
+2256 4173 1
+2256 4179 1
+2256 4181 1
+2256 4201 1
+2256 4218 1
+2256 4231 1
+2256 4247 1
+2256 4335 1
+2256 4400 1
+2256 4677 1
+2256 4678 1
+2256 4735 1
+2256 4780 1
+2256 4795 1
+2256 4797 1
+2256 4798 1
+2256 4809 1
+2256 4811 1
+2256 4946 1
+2256 5178 1
+2256 5200 1
+2256 5233 1
+2256 5412 1
+2256 5423 1
+2256 5457 1
+2256 5638 1
+2256 5709 1
+2256 6029 1
+2256 6296 1
+2256 6302 1
+2256 6306 1
+2256 6328 1
+2256 6334 1
+2256 6337 1
+2256 6388 1
+2256 6409 1
+2256 6422 1
+2256 6432 1
+2256 6806 1
+2256 8291 1
+2256 8293 1
+2256 8294 1
+2257 737 1
+2257 765 1
+2257 1018 1
+2257 1166 1
+2257 1734 1
+2257 1823 1
+2257 1919 1
+2257 2120 1
+2257 2135 1
+2257 2144 1
+2257 2145 1
+2257 2225 1
+2257 2246 1
+2257 2381 1
+2257 2397 1
+2257 2440 1
+2257 2544 1
+2257 2576 1
+2257 2593 1
+2257 2667 1
+2257 2686 1
+2257 2708 1
+2257 2764 1
+2257 3117 1
+2257 3253 1
+2257 3291 1
+2257 3321 1
+2257 3352 1
+2257 3408 1
+2257 3435 1
+2257 3439 1
+2257 3464 1
+2257 3465 1
+2257 3473 1
+2257 3680 1
+2257 3796 1
+2257 3885 1
+2257 3892 1
+2257 4191 1
+2257 4719 1
+2257 4827 1
+2257 4938 1
+2257 5072 1
+2257 5239 1
+2257 5459 1
+2257 5506 1
+2257 5651 1
+2257 5732 1
+2257 5806 1
+2258 762 1
+2258 1026 1
+2258 1166 1
+2258 1297 1
+2258 1549 1
+2258 1648 1
+2258 1733 1
+2258 1842 1
+2258 2066 1
+2258 2145 1
+2258 2246 1
+2258 2328 1
+2258 2411 1
+2258 2456 1
+2258 2508 1
+2258 2511 1
+2258 2565 1
+2258 2576 1
+2258 2605 1
+2258 2625 1
+2258 2727 1
+2258 2760 1
+2258 2774 1
+2258 2775 1
+2258 2859 1
+2258 2871 1
+2258 2981 1
+2258 3089 1
+2258 3200 1
+2258 3253 1
+2258 3321 1
+2258 3334 1
+2258 3480 1
+2258 3568 1
+2258 3586 1
+2258 3631 1
+2258 3873 1
+2258 3970 1
+2258 4011 1
+2258 4037 1
+2258 4043 1
+2258 4349 1
+2258 4510 1
+2258 4666 1
+2258 4712 1
+2258 4715 1
+2258 4781 1
+2258 4980 1
+2258 4994 1
+2258 5072 1
+2258 5121 1
+2258 5182 1
+2258 5199 1
+2258 5200 1
+2258 5226 1
+2258 5233 1
+2258 5273 1
+2258 5437 1
+2258 5466 1
+2258 5482 1
+2258 5693 1
+2258 5721 1
+2258 5732 1
+2258 5753 1
+2258 5760 1
+2258 5773 1
+2258 5784 1
+2258 5790 1
+2258 5798 1
+2258 5804 1
+2258 5828 1
+2258 5863 1
+2258 5891 1
+2258 5925 1
+2258 5947 1
+2258 5963 1
+2258 6124 1
+2258 6229 1
+2258 6251 1
+2258 6328 1
+2258 6330 1
+2258 6414 1
+2258 6571 1
+2258 6595 1
+2258 6790 1
+2258 7119 1
+2258 7143 1
+2258 7373 1
+2258 7422 1
+2258 7478 1
+2258 7810 1
+2258 7946 1
+2258 8083 1
+2258 8198 1
+2258 8294 1
+2259 2246 1
+2260 8291 1
+2261 8291 1
+2262 8291 1
+2153 2594 1
+2153 2625 1
+2153 7168 1
+2153 8291 1
+2264 1024 1
+2264 1049 1
+2264 1186 1
+2264 1353 1
+2264 1357 1
+2264 1403 1
+2264 1473 1
+2264 1549 1
+2264 1653 1
+2264 1729 1
+2264 1961 1
+2264 2328 1
+2264 2381 1
+2264 2385 1
+2264 2433 1
+2264 2654 1
+2264 2697 1
+2264 2774 1
+2264 2775 1
+2264 2794 1
+2264 2834 1
+2264 2856 1
+2264 3293 1
+2264 3352 1
+2264 3456 1
+2264 3660 1
+2264 3691 1
+2264 3843 1
+2264 3926 1
+2264 3937 1
+2264 3942 1
+2264 3958 1
+2264 4124 1
+2264 4234 1
+2264 4247 1
+2264 4261 1
+2264 4417 1
+2264 4510 1
+2264 4530 1
+2264 4706 1
+2264 4712 1
+2264 4797 1
+2264 5100 1
+2264 5254 1
+2264 5289 1
+2264 5454 1
+2264 5714 1
+2264 5775 1
+2264 6029 1
+2264 6243 1
+2264 6458 1
+2264 6554 1
+2264 6594 1
+2264 6714 1
+2264 6784 1
+2264 6833 1
+2264 7115 1
+2264 7620 1
+2266 587 1
+2267 2273 1
+2268 2273 1
+2269 2273 1
+2269 3348 1
+2270 2273 1
+2274 332 1
+2274 425 1
+2274 722 1
+2274 744 1
+2274 856 1
+2274 859 1
+2274 947 1
+2274 1012 1
+2274 1018 1
+2274 1250 1
+2274 1267 1
+2274 1437 1
+2274 1492 1
+2274 1608 1
+2274 1700 1
+2274 1835 1
+2274 1888 1
+2274 1919 1
+2274 1964 1
+2274 2117 1
+2274 2135 1
+2274 2145 1
+2274 2182 1
+2274 2240 1
+2274 2307 1
+2274 2329 1
+2274 2332 1
+2274 2385 1
+2274 2411 1
+2274 2423 1
+2274 2425 1
+2274 2426 1
+2274 2435 1
+2274 2484 1
+2274 2490 1
+2274 2571 1
+2274 2575 1
+2274 2579 1
+2274 2580 1
+2274 2625 1
+2274 2654 1
+2274 2946 1
+2274 3080 1
+2274 3130 1
+2274 3155 1
+2274 3193 1
+2274 3235 1
+2274 5936 1
+2276 15 1
+2276 72 1
+2276 840 1
+2276 896 1
+2276 1026 1
+2276 2398 1
+2276 2433 1
+2276 3334 1
+2276 3459 1
+2276 3614 1
+2276 3897 1
+2276 4110 1
+2276 4298 1
+2276 4400 1
+2276 4795 1
+2276 5254 1
+2276 5393 1
+2276 5638 1
+2276 5963 1
+2276 5969 1
+2276 5973 1
+2276 6004 1
+2276 6156 1
+2276 6422 1
+2276 6725 1
+2276 6739 1
+2276 6803 1
+2276 7059 1
+2276 7478 1
+2276 7490 1
+2276 7632 1
+2276 7839 1
+2277 2354 1
+2277 3089 1
+2277 3643 1
+2277 4335 1
+2277 5412 1
+2277 6813 1
+2277 8175 1
+2277 8291 1
+2278 2276 1
+2278 2917 1
+2278 5543 1
+2278 8291 1
+2280 1664 1
+2281 2193 1
+2281 2625 1
+2282 1542 1
+2282 1997 1
+2282 2285 1
+2282 2397 1
+2282 8290 1
+2283 1542 1
+2286 1035 1
+2286 1297 1
+2286 1492 1
+2286 1621 1
+2286 1700 1
+2286 1997 1
+2285 1393 1
+2285 1633 1
+2285 1679 1
+2285 1997 1
+2285 2135 1
+2285 2210 1
+2285 2231 1
+2285 2398 1
+2285 2485 1
+2285 2592 1
+2285 2625 1
+2285 2713 1
+2285 3258 1
+2285 3321 1
+2285 3371 1
+2285 3408 1
+2285 7478 1
+2287 1492 1
+2287 1997 1
+2287 2504 1
+2287 2968 1
+2290 204 1
+2290 825 1
+2290 827 1
+2290 974 1
+2290 1100 1
+2290 1157 1
+2290 1166 1
+2290 1297 1
+2290 1307 1
+2290 1385 1
+2290 1549 1
+2290 1744 1
+2290 1777 1
+2290 1990 1
+2290 2114 1
+2290 2144 1
+2290 2209 1
+2290 2210 1
+2290 2252 1
+2290 2257 1
+2290 2289 1
+2290 2297 1
+2290 2324 1
+2290 2411 1
+2290 2485 1
+2290 2510 1
+2290 2535 1
+2290 2565 1
+2290 2595 1
+2290 2597 1
+2290 2619 1
+2290 2651 1
+2290 2652 1
+2290 2653 1
+2290 2654 1
+2290 2655 1
+2290 2657 1
+2290 2660 1
+2290 2667 1
+2290 2674 1
+2290 2686 1
+2290 2687 1
+2290 2693 1
+2290 2727 1
+2290 2746 1
+2290 2747 1
+2290 2819 1
+2290 2900 1
+2290 2923 1
+2290 2973 1
+2290 2974 1
+2290 3005 1
+2290 3007 1
+2290 3009 1
+2290 3010 1
+2290 3024 1
+2290 3059 1
+2290 3114 1
+2290 3117 1
+2290 3148 1
+2290 3173 1
+2290 3200 1
+2290 3258 1
+2290 3260 1
+2290 3301 1
+2290 3404 1
+2290 3480 1
+2290 3516 1
+2290 3520 1
+2290 3529 1
+2290 3537 1
+2290 3541 1
+2290 3547 1
+2290 3548 1
+2290 3556 1
+2290 3557 1
+2290 3567 1
+2290 3568 1
+2290 3580 1
+2290 3587 1
+2290 3609 1
+2290 3629 1
+2290 3646 1
+2290 3670 1
+2290 3671 1
+2290 3680 1
+2290 3681 1
+2290 3717 1
+2290 3720 1
+2290 3737 1
+2290 3745 1
+2290 3769 1
+2290 3772 1
+2290 3800 1
+2290 3803 1
+2290 3807 1
+2290 3809 1
+2290 3811 1
+2290 3812 1
+2290 3822 1
+2290 3843 1
+2290 3847 1
+2290 3849 1
+2290 3867 1
+2290 3887 1
+2290 3892 1
+2290 3903 1
+2290 3946 1
+2290 3970 1
+2290 3973 1
+2290 3980 1
+2290 4011 1
+2290 4021 1
+2290 4088 1
+2290 4110 1
+2290 4191 1
+2290 4384 1
+2290 4402 1
+2290 6055 1
+2290 8293 1
+2288 2290 1
+2289 1385 1
+2289 1888 1
+2289 1977 1
+2289 2237 1
+2289 2290 1
+2289 2364 1
+2289 2504 1
+2289 2669 1
+2289 2811 1
+2289 3117 1
+2289 3352 1
+2289 3568 1
+2289 4124 1
+2289 4876 1
+2291 1977 1
+2292 1977 1
+2265 1977 1
+2293 1888 1
+2293 1977 1
+2294 1977 1
+2294 2619 1
+2294 2625 1
+2294 2638 1
+2294 2665 1
+2294 2856 1
+2294 2990 1
+2294 5254 1
+2294 6229 1
+2295 1888 1
+2295 5963 1
+2296 214 1
+2296 1888 1
+2297 15 1
+2297 204 1
+2297 214 1
+2297 332 1
+2297 417 1
+2297 425 1
+2297 465 1
+2297 608 1
+2297 737 1
+2297 825 1
+2297 1166 1
+2297 1267 1
+2297 1297 1
+2297 1307 1
+2297 1315 1
+2297 1357 1
+2297 1374 1
+2297 1384 1
+2297 1416 1
+2297 1571 1
+2297 1633 1
+2297 1700 1
+2297 1723 1
+2297 1734 1
+2297 1754 1
+2297 1792 1
+2297 1814 1
+2297 1847 1
+2297 1888 1
+2297 1956 1
+2297 1990 1
+2297 2066 1
+2297 2072 1
+2297 2117 1
+2297 2134 1
+2297 2144 1
+2297 2145 1
+2297 2174 1
+2297 2193 1
+2297 2209 1
+2297 2210 1
+2297 2225 1
+2297 2240 1
+2297 2290 1
+2297 2328 1
+2297 2333 1
+2297 2338 1
+2297 2398 1
+2297 2440 1
+2297 2456 1
+2297 2474 1
+2297 2485 1
+2297 2504 1
+2297 2506 1
+2297 2508 1
+2297 2510 1
+2297 2535 1
+2297 2542 1
+2297 2547 1
+2297 2570 1
+2297 2594 1
+2297 2619 1
+2297 2625 1
+2297 2651 1
+2297 2654 1
+2297 2657 1
+2297 2660 1
+2297 2667 1
+2297 2685 1
+2297 2693 1
+2297 2727 1
+2297 2746 1
+2297 2774 1
+2297 2775 1
+2297 2794 1
+2297 2797 1
+2297 2801 1
+2297 2856 1
+2297 2859 1
+2297 2871 1
+2297 2958 1
+2297 3005 1
+2297 3009 1
+2297 3014 1
+2297 3020 1
+2297 3024 1
+2297 3026 1
+2297 3033 1
+2297 3034 1
+2297 3059 1
+2297 3089 1
+2297 3150 1
+2297 3192 1
+2297 3253 1
+2297 3258 1
+2297 3260 1
+2297 3265 1
+2297 3307 1
+2297 3338 1
+2297 3352 1
+2297 3435 1
+2297 3454 1
+2297 3456 1
+2297 3473 1
+2297 3489 1
+2297 3516 1
+2297 3529 1
+2297 3537 1
+2297 3562 1
+2297 3568 1
+2297 3576 1
+2297 3587 1
+2297 3607 1
+2297 3615 1
+2297 3650 1
+2297 3661 1
+2297 3770 1
+2297 3807 1
+2297 3926 1
+2297 3946 1
+2297 3976 1
+2297 4013 1
+2297 4021 1
+2297 4055 1
+2297 4099 1
+2297 4103 1
+2297 4124 1
+2297 4162 1
+2297 4179 1
+2297 4191 1
+2297 4233 1
+2297 4263 1
+2297 4269 1
+2297 4299 1
+2297 4338 1
+2297 4400 1
+2297 4453 1
+2297 4510 1
+2297 4528 1
+2297 4578 1
+2297 4604 1
+2297 4687 1
+2297 4706 1
+2297 4811 1
+2297 4981 1
+2297 4983 1
+2297 5055 1
+2297 5061 1
+2297 5412 1
+2297 5584 1
+2297 5714 1
+2297 5828 1
+2297 6337 1
+2297 6437 1
+2297 6442 1
+2297 6566 1
+2297 6914 1
+2297 6979 1
+2297 7168 1
+2297 7341 1
+2297 7587 1
+2297 7632 1
+2297 8209 1
+2297 8293 1
+2298 1012 1
+2298 1211 1
+2298 1385 1
+2298 1792 1
+2298 1837 1
+2298 1888 1
+2298 1964 1
+2298 2129 1
+2298 2289 1
+2298 2328 1
+2298 2501 1
+2298 2504 1
+2298 2535 1
+2298 2547 1
+2298 2560 1
+2298 2575 1
+2298 2646 1
+2298 2654 1
+2298 2794 1
+2298 2797 1
+2298 2900 1
+2298 2926 1
+2298 2932 1
+2298 2993 1
+2298 3028 1
+2298 3117 1
+2298 3144 1
+2298 3145 1
+2298 3235 1
+2298 3253 1
+2298 3276 1
+2298 3291 1
+2298 3352 1
+2298 3483 1
+2298 3660 1
+2298 3724 1
+2298 3806 1
+2298 4031 1
+2298 4199 1
+2298 4201 1
+2298 4231 1
+2298 4269 1
+2298 4289 1
+2298 4297 1
+2298 4349 1
+2298 4365 1
+2298 4417 1
+2298 4424 1
+2299 56 1
+2299 856 1
+2299 1390 1
+2299 1549 1
+2299 2120 1
+2299 2251 1
+2299 2256 1
+2299 2322 1
+2299 2328 1
+2299 2398 1
+2299 2410 1
+2299 2485 1
+2299 2547 1
+2299 2560 1
+2299 2565 1
+2299 2585 1
+2299 2619 1
+2299 2620 1
+2299 2625 1
+2299 2651 1
+2299 2665 1
+2299 2687 1
+2299 2700 1
+2299 2746 1
+2299 2754 1
+2299 2794 1
+2299 2809 1
+2299 2851 1
+2299 2909 1
+2299 2972 1
+2299 2999 1
+2299 3026 1
+2299 3030 1
+2299 3117 1
+2299 3251 1
+2299 3265 1
+2299 3351 1
+2299 3459 1
+2299 3541 1
+2299 3580 1
+2299 3615 1
+2299 3892 1
+2299 3903 1
+2299 4024 1
+2299 4044 1
+2299 4138 1
+2299 4448 1
+2299 4587 1
+2299 4824 1
+2299 5148 1
+2299 5215 1
+2299 5226 1
+2299 5246 1
+2299 5323 1
+2299 5714 1
+2299 5814 1
+2299 5827 1
+2299 5829 1
+2299 6032 1
+2299 6832 1
+2299 7021 1
+2299 7092 1
+2299 8083 1
+2299 8174 1
+2299 8178 1
+2299 8192 1
+2299 8294 1
+2300 1390 1
+2301 1390 1
+2302 1390 1
+2304 2305 1
+2307 2585 1
+2307 2746 1
+2307 3024 1
+2307 3117 1
+2307 3616 1
+2307 3650 1
+2307 4024 1
+2308 2285 1
+2310 2285 1
+2311 2285 1
+2312 2285 1
+2313 2285 1
+2314 1297 1
+2314 2285 1
+2314 8293 1
+2315 2285 1
+2309 2285 1
+2309 3321 1
+2309 8293 1
+2316 2285 1
+2316 5375 1
+2316 8293 1
+2317 2285 1
+2317 8293 1
+2318 2285 1
+2318 8293 1
+2319 2285 1
+2319 2325 1
+2319 8293 1
+2320 2285 1
+2320 8293 1
+2321 2285 1
+2321 5375 1
+2321 8293 1
+2322 332 1
+2322 1031 1
+2322 1297 1
+2322 1547 1
+2322 1621 1
+2322 1700 1
+2322 1835 1
+2322 1992 1
+2322 2182 1
+2322 2289 1
+2322 2350 1
+2322 2504 1
+2322 2619 1
+2322 2625 1
+2322 2643 1
+2322 2814 1
+2322 3645 1
+2322 4349 1
+2322 6227 1
+2323 15 1
+2323 72 1
+2323 204 1
+2323 290 1
+2323 346 1
+2323 417 1
+2323 608 1
+2323 737 1
+2323 827 1
+2323 959 1
+2323 1157 1
+2323 1243 1
+2323 1297 1
+2323 1307 1
+2323 1385 1
+2323 1492 1
+2323 1549 1
+2323 1571 1
+2323 1633 1
+2323 1729 1
+2323 1744 1
+2323 1777 1
+2323 1836 1
+2323 1847 1
+2323 1935 1
+2323 1984 1
+2323 1990 1
+2323 2066 1
+2323 2114 1
+2323 2174 1
+2323 2193 1
+2323 2210 1
+2323 2225 1
+2323 2240 1
+2323 2252 1
+2323 2297 1
+2323 2369 1
+2323 2398 1
+2323 2411 1
+2323 2416 1
+2323 2485 1
+2323 2516 1
+2323 2535 1
+2323 2565 1
+2323 2576 1
+2323 2580 1
+2323 2585 1
+2323 2594 1
+2323 2625 1
+2323 2651 1
+2323 2653 1
+2323 2654 1
+2323 2657 1
+2323 2660 1
+2323 2746 1
+2323 2747 1
+2323 2794 1
+2323 2815 1
+2323 2838 1
+2323 2859 1
+2323 2900 1
+2323 2923 1
+2323 2958 1
+2323 3005 1
+2323 3007 1
+2323 3014 1
+2323 3018 1
+2323 3020 1
+2323 3028 1
+2323 3103 1
+2323 3130 1
+2323 3243 1
+2323 3260 1
+2323 3352 1
+2323 3371 1
+2323 3443 1
+2323 3456 1
+2323 3480 1
+2323 3516 1
+2323 3541 1
+2323 3562 1
+2323 3580 1
+2323 3724 1
+2323 3803 1
+2323 3847 1
+2323 3871 1
+2323 3897 1
+2323 3926 1
+2323 3937 1
+2323 3942 1
+2323 3946 1
+2323 4011 1
+2323 4103 1
+2323 4179 1
+2323 4191 1
+2323 4385 1
+2323 4400 1
+2323 4510 1
+2323 4531 1
+2323 4687 1
+2323 4820 1
+2323 5079 1
+2323 5412 1
+2323 5415 1
+2323 5449 1
+2323 5799 1
+2323 5817 1
+2323 6255 1
+2323 7277 1
+2323 8294 1
+2323 8295 1
+2324 1565 1
+2324 2485 1
+2324 2535 1
+2326 204 1
+2326 285 1
+2326 417 1
+2326 608 1
+2326 762 1
+2326 825 1
+2326 827 1
+2326 974 1
+2326 1031 1
+2326 1100 1
+2326 1140 1
+2326 1157 1
+2326 1166 1
+2326 1239 1
+2326 1297 1
+2326 1307 1
+2326 1310 1
+2326 1385 1
+2326 1453 1
+2326 1549 1
+2326 1571 1
+2326 1621 1
+2326 1633 1
+2326 1688 1
+2326 1706 1
+2326 1729 1
+2326 1744 1
+2326 1769 1
+2326 1777 1
+2326 1935 1
+2326 1990 1
+2326 2016 1
+2326 2066 1
+2326 2114 1
+2326 2129 1
+2326 2134 1
+2326 2144 1
+2326 2145 1
+2326 2209 1
+2326 2210 1
+2326 2252 1
+2326 2257 1
+2326 2289 1
+2326 2290 1
+2326 2297 1
+2326 2307 1
+2326 2324 1
+2326 2325 1
+2326 2328 1
+2326 2329 1
+2326 2338 1
+2326 2339 1
+2326 2341 1
+2326 2348 1
+2326 2350 1
+2326 2356 1
+2326 2384 1
+2326 2398 1
+2326 2411 1
+2326 2416 1
+2326 2433 1
+2326 2485 1
+2326 2506 1
+2326 2508 1
+2326 2510 1
+2326 2516 1
+2326 2535 1
+2326 2542 1
+2326 2544 1
+2326 2565 1
+2326 2576 1
+2326 2585 1
+2326 2592 1
+2326 2594 1
+2326 2595 1
+2326 2597 1
+2326 2612 1
+2326 2619 1
+2326 2623 1
+2326 2646 1
+2326 2653 1
+2326 2654 1
+2326 2655 1
+2326 2657 1
+2326 2660 1
+2326 2667 1
+2326 2674 1
+2326 2686 1
+2326 2687 1
+2326 2693 1
+2326 2727 1
+2326 2746 1
+2326 2747 1
+2326 2790 1
+2326 2799 1
+2326 2819 1
+2326 2859 1
+2326 2871 1
+2326 2900 1
+2326 2918 1
+2326 2923 1
+2326 2932 1
+2326 2958 1
+2326 2973 1
+2326 2981 1
+2326 3005 1
+2326 3007 1
+2326 3009 1
+2326 3010 1
+2326 3020 1
+2326 3021 1
+2326 3024 1
+2326 3026 1
+2326 3028 1
+2326 3030 1
+2326 3059 1
+2326 3084 1
+2326 3114 1
+2326 3117 1
+2326 3148 1
+2326 3173 1
+2326 3180 1
+2326 3192 1
+2326 3200 1
+2326 3258 1
+2326 3260 1
+2326 3276 1
+2326 3291 1
+2326 3307 1
+2326 3313 1
+2326 3338 1
+2326 3346 1
+2326 3348 1
+2326 3351 1
+2326 3352 1
+2326 3371 1
+2326 3376 1
+2326 3404 1
+2326 3408 1
+2326 3435 1
+2326 3439 1
+2326 3443 1
+2326 3446 1
+2326 3455 1
+2326 3460 1
+2326 3473 1
+2326 3480 1
+2326 3483 1
+2326 3486 1
+2326 3489 1
+2326 3506 1
+2326 3516 1
+2326 3520 1
+2326 3529 1
+2326 3537 1
+2326 3538 1
+2326 3541 1
+2326 3548 1
+2326 3557 1
+2326 3562 1
+2326 3567 1
+2326 3568 1
+2326 3580 1
+2326 3587 1
+2326 3615 1
+2326 3616 1
+2326 3629 1
+2326 3631 1
+2326 3645 1
+2326 3646 1
+2326 3650 1
+2326 3660 1
+2326 3661 1
+2326 3670 1
+2326 3680 1
+2326 3681 1
+2326 3717 1
+2326 3720 1
+2326 3745 1
+2326 3769 1
+2326 3787 1
+2326 3800 1
+2326 3804 1
+2326 3807 1
+2326 3812 1
+2326 3813 1
+2326 3843 1
+2326 3847 1
+2326 3871 1
+2326 3887 1
+2326 3892 1
+2326 3898 1
+2326 3903 1
+2326 3921 1
+2326 3926 1
+2326 3933 1
+2326 3937 1
+2326 3967 1
+2326 3970 1
+2326 3976 1
+2326 4011 1
+2326 4013 1
+2326 4021 1
+2326 4024 1
+2326 4031 1
+2326 4043 1
+2326 4055 1
+2326 4058 1
+2326 4110 1
+2326 4117 1
+2326 4124 1
+2326 4138 1
+2326 4162 1
+2326 4173 1
+2326 4179 1
+2326 4181 1
+2326 4183 1
+2326 4188 1
+2326 4189 1
+2326 4191 1
+2326 4201 1
+2326 4233 1
+2326 4235 1
+2326 4247 1
+2326 4256 1
+2326 4263 1
+2326 4269 1
+2326 4290 1
+2326 4297 1
+2326 4298 1
+2326 4323 1
+2326 4349 1
+2326 4373 1
+2326 4384 1
+2326 4402 1
+2326 4411 1
+2326 4417 1
+2326 4424 1
+2326 4468 1
+2326 4480 1
+2326 4500 1
+2326 4578 1
+2326 4735 1
+2326 4811 1
+2326 4938 1
+2326 4962 1
+2326 5083 1
+2326 5092 1
+2326 5100 1
+2326 5106 1
+2326 8293 1
+2326 8294 1
+2328 332 1
+2328 350 1
+2328 403 1
+2328 465 1
+2328 722 1
+2328 744 1
+2328 765 1
+2328 825 1
+2328 859 1
+2328 947 1
+2328 959 1
+2328 968 1
+2328 974 1
+2328 978 1
+2328 1012 1
+2328 1018 1
+2328 1035 1
+2328 1049 1
+2328 1097 1
+2328 1166 1
+2328 1186 1
+2328 1211 1
+2328 1239 1
+2328 1297 1
+2328 1384 1
+2328 1492 1
+2328 1521 1
+2328 1547 1
+2328 1549 1
+2328 1564 1
+2328 1608 1
+2328 1621 1
+2328 1637 1
+2328 1646 1
+2328 1653 1
+2328 1700 1
+2328 1723 1
+2328 1808 1
+2328 1835 1
+2328 1836 1
+2328 1842 1
+2328 1847 1
+2328 1956 1
+2328 1964 1
+2328 1990 1
+2328 1992 1
+2328 2053 1
+2328 2062 1
+2328 2066 1
+2328 2076 1
+2328 2117 1
+2328 2120 1
+2328 2134 1
+2328 2160 1
+2328 2174 1
+2328 2193 1
+2328 2209 1
+2328 2210 1
+2328 2240 1
+2328 2252 1
+2328 2257 1
+2328 2264 1
+2328 2297 1
+2328 2322 1
+2328 2324 1
+2328 2329 1
+2328 2332 1
+2328 2341 1
+2328 2345 1
+2328 2350 1
+2328 2385 1
+2328 2397 1
+2328 2400 1
+2328 2410 1
+2328 2411 1
+2328 2435 1
+2328 2470 1
+2328 2475 1
+2328 2479 1
+2328 2485 1
+2328 2504 1
+2328 2506 1
+2328 2508 1
+2328 2510 1
+2328 2517 1
+2328 2535 1
+2328 2544 1
+2328 2547 1
+2328 2565 1
+2328 2570 1
+2328 2579 1
+2328 2585 1
+2328 2587 1
+2328 2593 1
+2328 2595 1
+2328 2597 1
+2328 2599 1
+2328 2604 1
+2328 2619 1
+2328 2620 1
+2328 2643 1
+2328 2652 1
+2328 2653 1
+2328 2654 1
+2328 2657 1
+2328 2660 1
+2328 2665 1
+2328 2667 1
+2328 2669 1
+2328 2685 1
+2328 2693 1
+2328 2707 1
+2328 2727 1
+2328 2746 1
+2328 2747 1
+2328 2754 1
+2328 2763 1
+2328 2768 1
+2328 2774 1
+2328 2781 1
+2328 2794 1
+2328 2805 1
+2328 2809 1
+2328 2814 1
+2328 2818 1
+2328 2821 1
+2328 2825 1
+2328 2834 1
+2328 2877 1
+2328 2932 1
+2328 2958 1
+2328 2973 1
+2328 2981 1
+2328 3005 1
+2328 3010 1
+2328 3014 1
+2328 3024 1
+2328 3026 1
+2328 3028 1
+2328 3034 1
+2328 3114 1
+2328 3148 1
+2328 3192 1
+2328 3258 1
+2328 3260 1
+2328 3291 1
+2328 3352 1
+2328 3394 1
+2328 3459 1
+2328 3479 1
+2328 3480 1
+2328 3529 1
+2328 3537 1
+2328 3562 1
+2328 3568 1
+2328 3587 1
+2328 3607 1
+2328 3615 1
+2328 3629 1
+2328 3650 1
+2328 3661 1
+2328 3670 1
+2328 3713 1
+2328 3769 1
+2328 3800 1
+2328 3892 1
+2328 3903 1
+2328 3926 1
+2328 3970 1
+2328 4021 1
+2328 4037 1
+2328 4043 1
+2328 4065 1
+2328 4099 1
+2328 4134 1
+2328 4162 1
+2328 4247 1
+2328 4256 1
+2328 4269 1
+2328 4323 1
+2328 4483 1
+2328 4604 1
+2328 4709 1
+2328 4712 1
+2328 4717 1
+2328 4791 1
+2328 4795 1
+2328 4994 1
+2328 5188 1
+2328 5524 1
+2328 5697 1
+2328 5714 1
+2328 5800 1
+2328 5806 1
+2328 5814 1
+2328 5822 1
+2328 5829 1
+2328 5902 1
+2328 6123 1
+2328 6296 1
+2328 6327 1
+2328 6347 1
+2328 6576 1
+2328 6665 1
+2328 6770 1
+2328 6774 1
+2328 6783 1
+2328 6832 1
+2328 7131 1
+2328 7400 1
+2328 7414 1
+2328 7553 1
+2328 8291 1
+2328 8293 1
+2328 8294 1
+2330 2333 1
+2330 6914 1
+1561 2333 1
+2331 2333 1
+2331 5714 1
+2332 633 1
+2332 968 1
+2332 1012 1
+2332 1018 1
+2332 1049 1
+2332 1250 1
+2332 1835 1
+2332 2116 1
+2332 2333 1
+2332 2411 1
+2332 2416 1
+2332 2589 1
+2332 2591 1
+2332 2594 1
+2332 2625 1
+2332 2651 1
+2332 2653 1
+2332 2657 1
+2332 2708 1
+2332 2754 1
+2332 2912 1
+2332 3018 1
+2332 3020 1
+2332 3251 1
+2332 3253 1
+2332 3319 1
+2332 3320 1
+2332 3324 1
+2332 3408 1
+2332 3409 1
+2332 3410 1
+2332 3429 1
+2332 3548 1
+2332 3556 1
+2332 3562 1
+2332 8293 1
+2334 2339 1
+2335 2339 1
+2336 2339 1
+2337 2339 1
+2340 56 1
+2340 2341 1
+2340 2593 1
+2340 2809 1
+2342 1211 1
+2342 1918 1
+2342 2345 1
+2342 2651 1
+2342 4191 1
+2343 1250 1
+2343 1992 1
+2343 2345 1
+2343 2589 1
+2343 2591 1
+2343 2643 1
+2343 2650 1
+2344 2345 1
+2349 2350 1
+2349 2625 1
+2351 1031 1
+2352 1031 1
+2352 3117 1
+2354 1031 1
+2353 1031 1
+2272 56 1
+2272 959 1
+2272 1031 1
+2272 1166 1
+2272 1211 1
+2272 1297 1
+2272 1492 1
+2272 1521 1
+2272 1633 1
+2272 1653 1
+2272 1700 1
+2272 1792 1
+2272 1992 1
+2272 2117 1
+2272 2120 1
+2272 2193 1
+2272 2225 1
+2272 2385 1
+2272 2398 1
+2272 2400 1
+2272 2576 1
+2272 2593 1
+2272 2619 1
+2272 2625 1
+2272 2643 1
+2272 2651 1
+2272 2654 1
+2272 2785 1
+2272 2877 1
+2272 3034 1
+2272 3089 1
+2357 947 1
+2357 1035 1
+2357 1267 1
+2357 1492 1
+2357 1521 1
+2357 1547 1
+2357 1700 1
+2357 1754 1
+2357 1964 1
+2357 2625 1
+2357 3755 1
+2357 8290 1
+2359 1621 1
+2359 3265 1
+2360 1621 1
+2360 2653 1
+2360 3005 1
+2361 2362 1
+2363 1035 1
+2363 1315 1
+2363 1393 1
+2363 2193 1
+2364 762 1
+2364 1035 1
+2364 1679 1
+2364 2290 1
+2364 2440 1
+2364 2660 1
+2364 2667 1
+2364 2819 1
+2364 2923 1
+2364 3538 1
+2364 3809 1
+2364 3885 1
+2364 4037 1
+2364 4424 1
+2365 15 1
+2365 762 1
+2365 856 1
+2365 1035 1
+2365 1297 1
+2365 1357 1
+2365 1453 1
+2365 1521 1
+2365 1571 1
+2365 1705 1
+2365 1706 1
+2365 1754 1
+2365 1792 1
+2365 1992 1
+2365 2053 1
+2365 2066 1
+2365 2174 1
+2365 2252 1
+2365 2256 1
+2365 2297 1
+2365 2328 1
+2365 2385 1
+2365 2411 1
+2365 2510 1
+2365 2593 1
+2365 2594 1
+2365 2599 1
+2365 2618 1
+2365 2646 1
+2365 2651 1
+2365 2657 1
+2365 2660 1
+2365 2665 1
+2365 2685 1
+2365 2727 1
+2365 2746 1
+2365 2754 1
+2365 2775 1
+2365 2801 1
+2365 2856 1
+2365 2859 1
+2365 2951 1
+2365 3005 1
+2365 3009 1
+2365 3020 1
+2365 3028 1
+2365 3030 1
+2365 3117 1
+2365 3180 1
+2365 3253 1
+2365 3260 1
+2365 3291 1
+2365 3443 1
+2365 3516 1
+2365 3580 1
+2365 3680 1
+2365 3812 1
+2365 3958 1
+2365 4013 1
+2365 4021 1
+2365 4031 1
+2365 4071 1
+2365 4099 1
+2365 4110 1
+2365 4510 1
+2365 4528 1
+2365 4530 1
+2365 4536 1
+2365 4719 1
+2365 4735 1
+2365 5285 1
+2365 5671 1
+2365 5721 1
+2365 5773 1
+2365 5775 1
+2365 5780 1
+2365 8002 1
+2366 1097 1
+2366 1374 1
+2366 1835 1
+2366 2625 1
+2366 2643 1
+2366 2665 1
+2366 2736 1
+2367 1097 1
+2367 2475 1
+2367 2579 1
+2367 2587 1
+2367 2593 1
+2367 2604 1
+2367 2625 1
+2367 2643 1
+2368 15 1
+2368 290 1
+2368 1097 1
+2368 2508 1
+2368 2560 1
+2368 2565 1
+2368 2594 1
+2368 2599 1
+2368 2760 1
+2368 3018 1
+2368 3021 1
+2368 3117 1
+2368 3307 1
+2368 3351 1
+2368 3352 1
+2368 3371 1
+2368 3443 1
+2338 1964 1
+2338 2323 1
+2338 2504 1
+2338 2508 1
+2338 2654 1
+2338 3348 1
+2369 15 1
+2369 332 1
+2369 737 1
+2369 840 1
+2369 896 1
+2369 1026 1
+2369 1352 1
+2369 1493 1
+2369 1799 1
+2369 1964 1
+2369 1982 1
+2369 2014 1
+2369 2160 1
+2369 2276 1
+2369 2354 1
+2369 2364 1
+2369 2398 1
+2369 2411 1
+2369 2552 1
+2369 2785 1
+2369 2787 1
+2369 2822 1
+2369 2909 1
+2369 3002 1
+2369 3106 1
+2369 3238 1
+2369 3334 1
+2369 3393 1
+2369 3417 1
+2369 3447 1
+2369 3456 1
+2369 3459 1
+2369 3498 1
+2369 3541 1
+2369 3554 1
+2369 3634 1
+2369 3643 1
+2369 3755 1
+2369 3796 1
+2369 3808 1
+2369 3813 1
+2369 3830 1
+2369 3897 1
+2369 3898 1
+2369 3910 1
+2369 3976 1
+2369 4037 1
+2369 4124 1
+2369 4191 1
+2369 4219 1
+2369 4276 1
+2369 4297 1
+2369 4310 1
+2369 4315 1
+2369 4401 1
+2369 4432 1
+2369 4448 1
+2369 4507 1
+2369 4530 1
+2369 4536 1
+2369 4547 1
+2369 4587 1
+2369 4712 1
+2369 4791 1
+2369 4795 1
+2369 4824 1
+2369 4828 1
+2369 4875 1
+2369 4929 1
+2369 4964 1
+2369 4977 1
+2369 4983 1
+2369 5020 1
+2369 5022 1
+2369 5037 1
+2369 5055 1
+2369 5079 1
+2369 5083 1
+2369 5123 1
+2369 5148 1
+2369 5176 1
+2369 5179 1
+2369 5182 1
+2369 5189 1
+2369 5208 1
+2369 5210 1
+2369 5215 1
+2369 5226 1
+2369 5231 1
+2369 5233 1
+2369 5254 1
+2369 5255 1
+2369 5303 1
+2369 5305 1
+2369 5321 1
+2369 5327 1
+2369 5375 1
+2369 5404 1
+2369 5412 1
+2369 5415 1
+2369 5452 1
+2369 5454 1
+2369 5457 1
+2369 5467 1
+2369 5484 1
+2369 5545 1
+2369 5563 1
+2369 5564 1
+2369 5584 1
+2369 5605 1
+2369 5624 1
+2369 5638 1
+2369 5664 1
+2369 5673 1
+2369 5680 1
+2369 5714 1
+2369 5739 1
+2369 5745 1
+2369 5775 1
+2369 5799 1
+2369 5811 1
+2369 5886 1
+2369 5902 1
+2369 5963 1
+2369 5977 1
+2369 6001 1
+2369 6041 1
+2369 6044 1
+2369 6107 1
+2369 6111 1
+2369 6156 1
+2369 6166 1
+2369 6227 1
+2369 6235 1
+2369 6306 1
+2369 6327 1
+2369 6328 1
+2369 6414 1
+2369 6447 1
+2369 6458 1
+2369 6523 1
+2369 6566 1
+2369 6571 1
+2369 6576 1
+2369 6596 1
+2369 6632 1
+2369 6634 1
+2369 6665 1
+2369 6720 1
+2369 6725 1
+2369 6736 1
+2369 6765 1
+2369 6789 1
+2369 6875 1
+2369 6955 1
+2369 7047 1
+2369 7050 1
+2369 7052 1
+2369 7088 1
+2369 7092 1
+2369 7116 1
+2369 7131 1
+2369 7146 1
+2369 7168 1
+2369 7214 1
+2369 7238 1
+2369 7279 1
+2369 7386 1
+2369 7389 1
+2369 7512 1
+2369 7553 1
+2369 7620 1
+2369 7632 1
+2369 7649 1
+2369 7666 1
+2369 7810 1
+2369 7839 1
+2369 7855 1
+2369 7860 1
+2369 7862 1
+2369 7871 1
+2369 7908 1
+2369 7924 1
+2369 7928 1
+2369 8002 1
+2369 8083 1
+2369 8212 1
+2369 8224 1
+2369 8295 1
+2370 1964 1
+2370 2484 1
+2371 214 1
+2371 722 1
+2371 762 1
+2371 856 1
+2371 959 1
+2371 1012 1
+2371 1166 1
+2371 1186 1
+2371 1211 1
+2371 1250 1
+2371 1267 1
+2371 1291 1
+2371 1297 1
+2371 1315 1
+2371 1357 1
+2371 1416 1
+2371 1437 1
+2371 1453 1
+2371 1492 1
+2371 1596 1
+2371 1705 1
+2371 1734 1
+2371 1754 1
+2371 1781 1
+2371 1792 1
+2371 1808 1
+2371 1814 1
+2371 1837 1
+2371 1847 1
+2371 1918 1
+2371 1919 1
+2371 1964 1
+2371 2053 1
+2371 2117 1
+2371 2174 1
+2371 2225 1
+2371 2251 1
+2371 2256 1
+2371 2264 1
+2371 2323 1
+2371 2324 1
+2371 2354 1
+2371 2375 1
+2371 2400 1
+2371 2411 1
+2371 2416 1
+2371 2426 1
+2371 2470 1
+2371 2485 1
+2371 2504 1
+2371 2517 1
+2371 2547 1
+2371 2550 1
+2371 2560 1
+2371 2565 1
+2371 2579 1
+2371 2587 1
+2371 2593 1
+2371 2625 1
+2371 2646 1
+2371 2653 1
+2371 2654 1
+2371 2657 1
+2371 2662 1
+2371 2696 1
+2371 2697 1
+2371 2707 1
+2371 2724 1
+2371 2815 1
+2371 2830 1
+2371 2856 1
+2371 2877 1
+2371 2880 1
+2371 2900 1
+2371 2902 1
+2371 2918 1
+2371 2922 1
+2371 2926 1
+2371 2955 1
+2371 2963 1
+2371 2968 1
+2371 2972 1
+2371 2973 1
+2371 2977 1
+2371 2979 1
+2371 2993 1
+2371 2996 1
+2371 2999 1
+2371 3007 1
+2371 3026 1
+2371 3029 1
+2371 3033 1
+2371 3034 1
+2371 3056 1
+2371 3059 1
+2371 3068 1
+2371 3080 1
+2371 3104 1
+2371 3117 1
+2371 3126 1
+2371 3140 1
+2371 3144 1
+2371 3150 1
+2371 3164 1
+2371 3173 1
+2371 3192 1
+2371 3235 1
+2371 3237 1
+2371 3516 1
+2371 3537 1
+2371 3634 1
+2371 3748 1
+2371 3796 1
+2371 3887 1
+2371 4124 1
+2371 4256 1
+2371 4323 1
+2371 4361 1
+2371 4653 1
+2371 4964 1
+2371 5412 1
+2371 5459 1
+2371 7561 1
+2371 7632 1
+2372 1700 1
+2372 1835 1
+2372 1964 1
+2372 2182 1
+2372 2470 1
+2372 2479 1
+2372 2517 1
+2374 1964 1
+2375 741 1
+2375 762 1
+2375 765 1
+2375 1018 1
+2375 1049 1
+2375 1157 1
+2375 1185 1
+2375 1186 1
+2375 1250 1
+2375 1384 1
+2375 1419 1
+2375 1521 1
+2375 1564 1
+2375 1608 1
+2375 1637 1
+2375 1653 1
+2375 1688 1
+2375 1918 1
+2375 1964 1
+2375 2066 1
+2375 2120 1
+2375 2240 1
+2375 2256 1
+2375 2470 1
+2375 2479 1
+2375 2504 1
+2375 2565 1
+2375 2579 1
+2375 2599 1
+2375 2612 1
+2375 2685 1
+2375 2828 1
+2375 2880 1
+2375 3192 1
+2375 3394 1
+2375 3724 1
+2375 4289 1
+2375 4331 1
+2375 4365 1
+2375 4384 1
+2375 4500 1
+2375 4528 1
+2375 4712 1
+2375 4875 1
+2375 5233 1
+2375 5415 1
+2375 5568 1
+2375 6004 1
+2375 6441 1
+2376 290 1
+2376 1374 1
+2376 1964 1
+2376 2066 1
+2376 2237 1
+2376 2240 1
+2376 2398 1
+2376 2474 1
+2376 2535 1
+2376 2594 1
+2376 2620 1
+2376 3005 1
+2376 3024 1
+2376 3117 1
+2376 3755 1
+2376 4191 1
+2376 5233 1
+2376 5262 1
+2376 5482 1
+2376 5822 1
+2376 6006 1
+2376 6218 1
+2376 6437 1
+2376 6441 1
+2376 6774 1
+2376 8246 1
+2378 2062 1
+2378 2400 1
+2378 2504 1
+2378 2571 1
+2381 762 1
+2381 1297 1
+2381 1385 1
+2381 1549 1
+2381 1680 1
+2381 1956 1
+2381 2062 1
+2381 2066 1
+2381 2117 1
+2381 2252 1
+2381 2297 1
+2381 2323 1
+2381 2398 1
+2381 2508 1
+2381 2516 1
+2381 2535 1
+2381 2570 1
+2381 2625 1
+2381 2643 1
+2381 2651 1
+2381 2790 1
+2381 3007 1
+2381 3034 1
+2381 3089 1
+2381 3192 1
+2381 3334 1
+2381 3352 1
+2381 3394 1
+2381 3443 1
+2381 3456 1
+2381 3459 1
+2381 3479 1
+2381 3607 1
+2381 3631 1
+2381 3720 1
+2381 3892 1
+2381 3976 1
+2381 4013 1
+2381 4037 1
+2381 4110 1
+2381 4191 1
+2381 4201 1
+2381 4247 1
+2381 4269 1
+2381 4315 1
+2381 4335 1
+2381 4453 1
+2381 4547 1
+2381 4687 1
+2381 4735 1
+2381 4875 1
+2381 4977 1
+2381 5020 1
+2381 5079 1
+2381 5254 1
+2381 5449 1
+2381 5452 1
+2381 5697 1
+2381 5721 1
+2381 5743 1
+2381 5799 1
+2381 6330 1
+2381 6400 1
+2381 6498 1
+2381 6613 1
+2381 6665 1
+2381 6720 1
+2381 6833 1
+2381 7961 1
+2381 8292 1
+2381 8294 1
+2379 762 1
+2379 1307 1
+2379 1688 1
+2379 1744 1
+2379 1777 1
+2379 2062 1
+2379 2114 1
+2379 2134 1
+2379 2257 1
+2379 2328 1
+2379 2397 1
+2379 2411 1
+2379 2485 1
+2379 2516 1
+2379 2565 1
+2379 2859 1
+2379 2900 1
+2379 2923 1
+2379 2932 1
+2379 2958 1
+2379 2981 1
+2379 3005 1
+2379 3099 1
+2379 3192 1
+2379 3200 1
+2379 3291 1
+2379 3480 1
+2379 3483 1
+2379 3541 1
+2379 3615 1
+2379 3631 1
+2379 3772 1
+2379 3787 1
+2379 4013 1
+2379 4110 1
+2379 4162 1
+2379 4179 1
+2379 4201 1
+2379 4233 1
+2379 4247 1
+2379 4269 1
+2379 4480 1
+2379 4552 1
+2379 4557 1
+2379 5631 1
+2380 2062 1
+2382 1297 1
+2384 15 1
+2384 72 1
+2384 1166 1
+2384 1315 1
+2384 1385 1
+2384 1416 1
+2384 2237 1
+2384 2256 1
+2384 2328 1
+2384 2354 1
+2384 2371 1
+2384 2385 1
+2384 2398 1
+2384 2416 1
+2384 2511 1
+2384 2516 1
+2384 2565 1
+2384 2625 1
+2384 2760 1
+2384 2822 1
+2384 2871 1
+2384 2909 1
+2384 3007 1
+2384 3028 1
+2384 3192 1
+2384 3238 1
+2384 3291 1
+2384 3321 1
+2384 3417 1
+2384 3435 1
+2384 3443 1
+2384 3498 1
+2384 3516 1
+2384 3631 1
+2384 3787 1
+2384 3796 1
+2384 3871 1
+2384 3976 1
+2384 4037 1
+2384 4099 1
+2384 4201 1
+2384 4233 1
+2384 4247 1
+2384 4289 1
+2384 4536 1
+2384 4600 1
+2384 4687 1
+2384 4781 1
+2384 4797 1
+2384 4828 1
+2384 4999 1
+2384 5022 1
+2384 5061 1
+2384 5079 1
+2384 5106 1
+2384 5162 1
+2384 5226 1
+2384 5341 1
+2384 5459 1
+2384 5482 1
+2384 5511 1
+2384 5637 1
+2384 5651 1
+2384 5693 1
+2384 5753 1
+2384 5775 1
+2384 5790 1
+2384 6029 1
+2384 6624 1
+2384 7694 1
+2384 7946 1
+2384 8293 1
+2387 72 1
+2387 737 1
+2387 762 1
+2387 1648 1
+2387 1680 1
+2387 2193 1
+2387 2354 1
+2387 2398 1
+2387 2470 1
+2387 2775 1
+2387 2822 1
+2387 2909 1
+2387 3014 1
+2387 3089 1
+2387 3274 1
+2387 3417 1
+2387 3456 1
+2387 3460 1
+2387 3554 1
+2387 3643 1
+2387 3724 1
+2387 3796 1
+2387 3897 1
+2387 3910 1
+2387 3958 1
+2387 4098 1
+2387 4276 1
+2387 4315 1
+2387 4335 1
+2387 4400 1
+2387 4448 1
+2387 4574 1
+2387 4587 1
+2387 4600 1
+2387 4653 1
+2387 4712 1
+2387 4828 1
+2387 4846 1
+2387 4875 1
+2387 4964 1
+2387 5061 1
+2387 5189 1
+2387 5204 1
+2387 5226 1
+2387 5239 1
+2387 5263 1
+2387 5341 1
+2387 5354 1
+2387 5392 1
+2387 5404 1
+2387 5412 1
+2387 5430 1
+2387 5449 1
+2387 5511 1
+2387 5527 1
+2387 5559 1
+2387 5780 1
+2387 5848 1
+2387 5886 1
+2387 5925 1
+2387 5936 1
+2387 5994 1
+2387 6148 1
+2387 7143 1
+2387 7144 1
+2387 7561 1
+2388 2193 1
+2389 2193 1
+2390 2193 1
+2390 2506 1
+2392 2397 1
+2391 2397 1
+2394 2397 1
+2395 2397 1
+2396 2397 1
+2393 1836 1
+2393 2332 1
+2393 2397 1
+2393 2484 1
+2398 72 1
+2398 465 1
+2398 968 1
+2398 974 1
+2398 1012 1
+2398 1250 1
+2398 1549 1
+2398 1571 1
+2398 1706 1
+2398 1734 1
+2398 1847 1
+2398 2144 1
+2398 2209 1
+2398 2210 1
+2398 2297 1
+2398 2326 1
+2398 2400 1
+2398 2504 1
+2398 2506 1
+2398 2516 1
+2398 2585 1
+2398 2597 1
+2398 2619 1
+2398 2625 1
+2398 2638 1
+2398 2651 1
+2398 2655 1
+2398 2660 1
+2398 2686 1
+2398 2746 1
+2398 2790 1
+2398 2871 1
+2398 3024 1
+2398 3026 1
+2398 3084 1
+2398 3117 1
+2398 3130 1
+2398 3180 1
+2398 3260 1
+2398 3352 1
+2398 3443 1
+2398 3454 1
+2398 3516 1
+2398 3555 1
+2398 3580 1
+2398 3609 1
+2398 3650 1
+2398 3720 1
+2398 3800 1
+2398 3892 1
+2398 3903 1
+2398 3926 1
+2398 3937 1
+2398 3970 1
+2398 3976 1
+2398 4191 1
+2398 4528 1
+2398 4578 1
+2398 4735 1
+2398 4811 1
+2398 5412 1
+2398 8293 1
+2399 1700 1
+2399 2400 1
+2401 1323 1
+2402 1100 1
+2402 1323 1
+2403 1842 1
+2403 2542 1
+2404 1842 1
+2405 1842 1
+2406 1842 1
+2406 2356 1
+2407 332 1
+2407 722 1
+2407 1608 1
+2407 1842 1
+2410 15 1
+2410 737 1
+2410 1492 1
+2410 1700 1
+2410 1799 1
+2410 2507 1
+2410 2576 1
+2410 2794 1
+2410 2825 1
+2410 3027 1
+2410 3456 1
+2410 3586 1
+2410 3962 1
+2410 4071 1
+2410 4098 1
+2410 4310 1
+2410 4400 1
+2410 4929 1
+2410 5079 1
+2410 5178 1
+2410 5392 1
+2410 5412 1
+2410 5415 1
+2410 5459 1
+2410 5524 1
+2410 5539 1
+2410 5721 1
+2410 5743 1
+2410 5994 1
+2410 6151 1
+2410 6414 1
+2410 7632 1
+2410 7839 1
+2410 7910 1
+2306 1049 1
+2306 1492 1
+2306 2504 1
+2306 2643 1
+2411 417 1
+2411 465 1
+2411 825 1
+2411 974 1
+2411 1140 1
+2411 1166 1
+2411 1297 1
+2411 1385 1
+2411 1419 1
+2411 1453 1
+2411 1492 1
+2411 1571 1
+2411 1596 1
+2411 1633 1
+2411 1680 1
+2411 1700 1
+2411 1754 1
+2411 1777 1
+2411 1915 1
+2411 1918 1
+2411 1919 1
+2411 1935 1
+2411 1990 1
+2411 1992 1
+2411 2016 1
+2411 2066 1
+2411 2114 1
+2411 2120 1
+2411 2129 1
+2411 2144 1
+2411 2209 1
+2411 2210 1
+2411 2251 1
+2411 2252 1
+2411 2256 1
+2411 2290 1
+2411 2307 1
+2411 2325 1
+2411 2375 1
+2411 2433 1
+2411 2474 1
+2411 2510 1
+2411 2535 1
+2411 2544 1
+2411 2560 1
+2411 2576 1
+2411 2585 1
+2411 2595 1
+2411 2653 1
+2411 2654 1
+2411 2657 1
+2411 2660 1
+2411 2667 1
+2411 2674 1
+2411 2686 1
+2411 2687 1
+2411 2708 1
+2411 2713 1
+2411 2724 1
+2411 2727 1
+2411 2746 1
+2411 2777 1
+2411 2790 1
+2411 2794 1
+2411 2797 1
+2411 2799 1
+2411 2809 1
+2411 2859 1
+2411 2900 1
+2411 2955 1
+2411 2958 1
+2411 2974 1
+2411 3005 1
+2411 3014 1
+2411 3024 1
+2411 3028 1
+2411 3029 1
+2411 3030 1
+2411 3034 1
+2411 3050 1
+2411 3084 1
+2411 3089 1
+2411 3104 1
+2411 3117 1
+2411 3126 1
+2411 3140 1
+2411 3148 1
+2411 3253 1
+2411 3291 1
+2411 3307 1
+2411 3319 1
+2411 3324 1
+2411 3338 1
+2411 3376 1
+2411 3408 1
+2411 3439 1
+2411 3446 1
+2411 3473 1
+2411 3483 1
+2411 3486 1
+2411 3489 1
+2411 3506 1
+2411 3529 1
+2411 3537 1
+2411 3538 1
+2411 3548 1
+2411 3580 1
+2411 3587 1
+2411 3609 1
+2411 3615 1
+2411 3635 1
+2411 3645 1
+2411 3650 1
+2411 3669 1
+2411 3680 1
+2411 3681 1
+2411 3772 1
+2411 3893 1
+2411 3898 1
+2411 3967 1
+2411 4011 1
+2411 4021 1
+2411 4024 1
+2411 4051 1
+2411 4110 1
+2411 4124 1
+2411 4218 1
+2411 4231 1
+2411 4233 1
+2411 4247 1
+2411 4299 1
+2411 4323 1
+2411 4386 1
+2411 4412 1
+2411 4500 1
+2411 4531 1
+2411 4547 1
+2411 5484 1
+2411 7304 1
+2411 8293 1
+2411 8294 1
+2412 1492 1
+2412 2504 1
+2412 6243 1
+2413 1492 1
+2413 2747 1
+2414 1700 1
+2414 1865 1
+2414 1956 1
+2414 2625 1
+2414 2643 1
+2414 6788 1
+2416 332 1
+2416 762 1
+2416 1012 1
+2416 1018 1
+2416 1211 1
+2416 1291 1
+2416 1633 1
+2416 1723 1
+2416 1835 1
+2416 2120 1
+2416 2323 1
+2416 2375 1
+2416 2426 1
+2416 2580 1
+2416 2647 1
+2416 2708 1
+2416 2721 1
+2416 2763 1
+2416 2781 1
+2416 2902 1
+2416 2926 1
+2416 2946 1
+2416 2966 1
+2416 2968 1
+2416 2993 1
+2416 3029 1
+2416 3068 1
+2416 3080 1
+2416 3099 1
+2416 3150 1
+2416 3251 1
+2416 3276 1
+2416 3338 1
+2416 3348 1
+2416 3371 1
+2416 3587 1
+2416 8291 1
+2417 290 1
+2417 332 1
+2417 2643 1
+2417 2721 1
+2417 2991 1
+2417 6628 1
+2417 7168 1
+2418 332 1
+2113 1154 1
+2113 2420 1
+2113 2625 1
+2113 2685 1
+2113 2880 1
+2113 4072 1
+2113 7561 1
+2419 2420 1
+2424 2425 1
+2428 859 1
+2429 859 1
+2429 2323 1
+2427 859 1
+2427 1608 1
+2427 2237 1
+2427 2240 1
+2427 2416 1
+2427 2470 1
+2427 2629 1
+2427 2880 1
+2427 3479 1
+2427 4687 1
+2427 6417 1
+2435 56 1
+2435 1211 1
+2435 1297 1
+2435 1374 1
+2435 1564 1
+2435 1592 1
+2435 1633 1
+2435 1637 1
+2435 1646 1
+2435 1723 1
+2435 1956 1
+2435 1992 1
+2435 2117 1
+2435 2174 1
+2435 2231 1
+2435 2240 1
+2435 2256 1
+2435 2340 1
+2435 2490 1
+2435 2587 1
+2435 2594 1
+2435 2618 1
+2435 2625 1
+2435 2654 1
+2435 2657 1
+2435 2754 1
+2435 2770 1
+2435 2781 1
+2435 2794 1
+2435 2801 1
+2435 2809 1
+2435 2900 1
+2435 3030 1
+2435 3034 1
+2435 3089 1
+2433 2435 1
+2433 3439 1
+2434 2435 1
+2434 2963 1
+2437 2470 1
+2437 4687 1
+2373 2135 1
+2373 2470 1
+2438 2470 1
+2462 1250 1
+2462 1608 1
+2462 2182 1
+2462 2470 1
+2463 2470 1
+2439 2470 1
+2440 15 1
+2440 465 1
+2440 737 1
+2440 896 1
+2440 1982 1
+2440 2237 1
+2440 2257 1
+2440 2470 1
+2440 2654 1
+2440 3007 1
+2440 3026 1
+2440 3034 1
+2440 3084 1
+2440 3238 1
+2440 3321 1
+2440 3334 1
+2440 3352 1
+2440 3456 1
+2440 3643 1
+2440 3664 1
+2440 3892 1
+2440 3962 1
+2440 3976 1
+2440 4099 1
+2440 4191 1
+2440 4261 1
+2440 4400 1
+2440 4646 1
+2440 4687 1
+2440 4712 1
+2440 4735 1
+2440 4827 1
+2440 4828 1
+2440 4875 1
+2440 4981 1
+2440 5210 1
+2440 5335 1
+2440 5412 1
+2440 5584 1
+2440 5605 1
+2440 5760 1
+2440 5819 1
+2440 6111 1
+2440 6414 1
+2440 6699 1
+2440 6918 1
+2440 7050 1
+2440 7620 1
+2440 7908 1
+2440 7927 1
+2441 2470 1
+2442 2470 1
+2443 2470 1
+2444 2237 1
+2444 2384 1
+2444 2470 1
+2444 4037 1
+2444 4600 1
+2444 5022 1
+2445 2470 1
+2446 2470 1
+2094 2470 1
+2447 2470 1
+2448 2470 1
+2449 2470 1
+2450 2470 1
+2451 2470 1
+2451 4687 1
+2452 1026 1
+2452 1982 1
+2452 2470 1
+2452 4037 1
+2452 4341 1
+2452 4361 1
+2452 4401 1
+2452 4875 1
+2452 5079 1
+2452 5179 1
+2452 5233 1
+2452 5378 1
+2452 5432 1
+2452 5800 1
+2452 5811 1
+2452 5814 1
+2452 5839 1
+2452 5902 1
+2452 6123 1
+2452 6280 1
+2452 6417 1
+2452 6555 1
+2452 6772 1
+2452 6784 1
+2452 6832 1
+2452 7005 1
+2452 7047 1
+2452 7050 1
+2452 7116 1
+2452 7225 1
+2452 7351 1
+2452 7393 1
+2452 7414 1
+2452 7553 1
+2452 7587 1
+2452 7632 1
+2452 7662 1
+2452 7683 1
+2452 7701 1
+2452 7924 1
+2452 8044 1
+2452 8174 1
+2453 2470 1
+2454 2470 1
+2455 2470 1
+2456 72 1
+2456 2285 1
+2456 2440 1
+2456 2470 1
+2456 2504 1
+2456 3238 1
+2456 3498 1
+2456 3607 1
+2456 3842 1
+2456 3873 1
+2456 4037 1
+2456 4531 1
+2456 4689 1
+2456 4735 1
+2456 4781 1
+2456 4981 1
+2456 4983 1
+2456 5028 1
+2456 5273 1
+2456 5671 1
+2456 5760 1
+2456 6414 1
+2456 6437 1
+2456 6458 1
+2456 6570 1
+2456 6576 1
+2456 6589 1
+2456 6770 1
+2456 7115 1
+2456 7624 1
+2456 7912 1
+2465 2470 1
+2457 2470 1
+2466 2470 1
+2458 2237 1
+2458 2470 1
+2458 5210 1
+2458 5902 1
+2458 6442 1
+2458 6600 1
+2459 2470 1
+2460 2470 1
+2461 2470 1
+2475 3026 1
+2475 4261 1
+2471 2475 1
+2472 56 1
+2472 214 1
+2472 350 1
+2472 633 1
+2472 765 1
+2472 856 1
+2472 1049 1
+2472 1154 1
+2472 1267 1
+2472 1315 1
+2472 1357 1
+2472 1393 1
+2472 1416 1
+2472 1419 1
+2472 1437 1
+2472 1521 1
+2472 1549 1
+2472 1592 1
+2472 1637 1
+2472 1705 1
+2472 1723 1
+2472 1734 1
+2472 1754 1
+2472 1781 1
+2472 1808 1
+2472 1918 1
+2472 2076 1
+2472 2102 1
+2472 2116 1
+2472 2120 1
+2472 2174 1
+2472 2225 1
+2472 2237 1
+2472 2264 1
+2472 2322 1
+2472 2323 1
+2472 2375 1
+2472 2470 1
+2472 2475 1
+2472 2547 1
+2472 2550 1
+2472 2560 1
+2472 2593 1
+2472 2599 1
+2472 2618 1
+2472 2662 1
+2472 2685 1
+2472 2697 1
+2472 2707 1
+2472 2713 1
+2472 2754 1
+2472 2763 1
+2472 2768 1
+2472 2770 1
+2472 2805 1
+2472 2809 1
+2472 2814 1
+2472 2815 1
+2472 2828 1
+2472 2830 1
+2472 2834 1
+2472 2877 1
+2472 2922 1
+2472 2946 1
+2472 2955 1
+2472 2963 1
+2472 2999 1
+2472 3089 1
+2472 3099 1
+2472 3117 1
+2472 3150 1
+2472 3164 1
+2472 3251 1
+2472 8291 1
+2472 8293 1
+2473 290 1
+2473 350 1
+2473 403 1
+2473 633 1
+2473 765 1
+2473 856 1
+2473 1049 1
+2473 1267 1
+2473 1291 1
+2473 1315 1
+2473 1374 1
+2473 1384 1
+2473 1393 1
+2473 1419 1
+2473 1521 1
+2473 1596 1
+2473 1637 1
+2473 1646 1
+2473 1653 1
+2473 1688 1
+2473 1705 1
+2473 1723 1
+2473 1734 1
+2473 1754 1
+2473 1781 1
+2473 1792 1
+2473 1808 1
+2473 1814 1
+2473 1847 1
+2473 1918 1
+2473 1919 1
+2473 1956 1
+2473 1992 1
+2473 2102 1
+2473 2116 1
+2473 2117 1
+2473 2120 1
+2473 2135 1
+2473 2174 1
+2473 2225 1
+2473 2251 1
+2473 2256 1
+2473 2264 1
+2473 2322 1
+2473 2371 1
+2473 2375 1
+2473 2410 1
+2473 2416 1
+2473 2475 1
+2473 2547 1
+2473 2560 1
+2473 2593 1
+2473 2599 1
+2473 2625 1
+2473 2662 1
+2473 2669 1
+2473 2685 1
+2473 2697 1
+2473 2707 1
+2473 2713 1
+2473 2721 1
+2473 2724 1
+2473 2751 1
+2473 2754 1
+2473 2763 1
+2473 2768 1
+2473 2794 1
+2473 2805 1
+2473 2809 1
+2473 2814 1
+2473 2815 1
+2473 2818 1
+2473 2821 1
+2473 2825 1
+2473 2828 1
+2473 2830 1
+2473 2834 1
+2473 2856 1
+2473 2900 1
+2473 2902 1
+2473 2918 1
+2473 2922 1
+2473 2926 1
+2473 2955 1
+2473 2963 1
+2473 2968 1
+2473 2979 1
+2473 2993 1
+2473 2999 1
+2473 3029 1
+2473 3033 1
+2473 3050 1
+2473 3056 1
+2473 3068 1
+2473 3099 1
+2473 3126 1
+2473 3145 1
+2473 3251 1
+2473 3253 1
+2473 3812 1
+2473 4528 1
+2473 4531 1
+2473 8291 1
+2476 290 1
+2476 1291 1
+2476 1357 1
+2476 1416 1
+2476 1705 1
+2476 1734 1
+2476 1754 1
+2476 1919 1
+2476 2225 1
+2476 2264 1
+2476 2323 1
+2476 2411 1
+2476 2416 1
+2476 2479 1
+2476 2550 1
+2476 2593 1
+2476 2617 1
+2476 2707 1
+2476 2724 1
+2476 2815 1
+2476 2830 1
+2476 2856 1
+2476 2900 1
+2476 2918 1
+2476 2968 1
+2476 2999 1
+2476 3029 1
+2476 3033 1
+2476 3034 1
+2476 3056 1
+2476 3068 1
+2476 3099 1
+2476 3140 1
+2476 3145 1
+2476 3150 1
+2477 2479 1
+2478 2120 1
+2478 2252 1
+2478 2479 1
+2478 2499 1
+2478 2650 1
+2478 8292 1
+2480 1608 1
+2480 2369 1
+2480 3320 1
+2480 4315 1
+2480 4536 1
+2480 4735 1
+2480 5936 1
+2481 155 1
+2481 1608 1
+2481 3293 1
+2481 4536 1
+2481 4632 1
+2481 6634 1
+2481 6955 1
+2481 7649 1
+2482 1250 1
+2482 1608 1
+2482 2570 1
+2485 204 1
+2485 290 1
+2485 417 1
+2485 465 1
+2485 737 1
+2485 762 1
+2485 765 1
+2485 825 1
+2485 856 1
+2485 896 1
+2485 974 1
+2485 1166 1
+2485 1185 1
+2485 1239 1
+2485 1267 1
+2485 1291 1
+2485 1307 1
+2485 1315 1
+2485 1357 1
+2485 1360 1
+2485 1393 1
+2485 1403 1
+2485 1453 1
+2485 1473 1
+2485 1549 1
+2485 1571 1
+2485 1596 1
+2485 1637 1
+2485 1648 1
+2485 1688 1
+2485 1705 1
+2485 1723 1
+2485 1729 1
+2485 1754 1
+2485 1769 1
+2485 1792 1
+2485 1808 1
+2485 1982 1
+2485 1984 1
+2485 1990 1
+2485 2014 1
+2485 2016 1
+2485 2066 1
+2485 2114 1
+2485 2116 1
+2485 2120 1
+2485 2135 1
+2485 2145 1
+2485 2174 1
+2485 2225 1
+2485 2237 1
+2485 2256 1
+2485 2257 1
+2485 2289 1
+2485 2297 1
+2485 2323 1
+2485 2325 1
+2485 2328 1
+2485 2364 1
+2485 2371 1
+2485 2375 1
+2485 2384 1
+2485 2398 1
+2485 2411 1
+2485 2433 1
+2485 2456 1
+2485 2484 1
+2485 2506 1
+2485 2508 1
+2485 2510 1
+2485 2511 1
+2485 2542 1
+2485 2547 1
+2485 2550 1
+2485 2560 1
+2485 2565 1
+2485 2576 1
+2485 2585 1
+2485 2593 1
+2485 2594 1
+2485 2595 1
+2485 2597 1
+2485 2605 1
+2485 2619 1
+2485 2625 1
+2485 2646 1
+2485 2647 1
+2485 2653 1
+2485 2654 1
+2485 2655 1
+2485 2657 1
+2485 2660 1
+2485 2667 1
+2485 2674 1
+2485 2686 1
+2485 2696 1
+2485 2700 1
+2485 2713 1
+2485 2727 1
+2485 2746 1
+2485 2747 1
+2485 2819 1
+2485 2830 1
+2485 2831 1
+2485 2856 1
+2485 2871 1
+2485 2877 1
+2485 2900 1
+2485 2902 1
+2485 2909 1
+2485 2918 1
+2485 2923 1
+2485 2928 1
+2485 2940 1
+2485 2955 1
+2485 2958 1
+2485 2966 1
+2485 2972 1
+2485 2993 1
+2485 3005 1
+2485 3007 1
+2485 3009 1
+2485 3010 1
+2485 3014 1
+2485 3018 1
+2485 3020 1
+2485 3024 1
+2485 3026 1
+2485 3027 1
+2485 3028 1
+2485 3029 1
+2485 3034 1
+2485 3056 1
+2485 3059 1
+2485 3073 1
+2485 3089 1
+2485 3103 1
+2485 3114 1
+2485 3117 1
+2485 3125 1
+2485 3144 1
+2485 3145 1
+2485 3148 1
+2485 3164 1
+2485 3173 1
+2485 3192 1
+2485 3238 1
+2485 3243 1
+2485 3258 1
+2485 3260 1
+2485 3274 1
+2485 3309 1
+2485 3319 1
+2485 3321 1
+2485 3324 1
+2485 3351 1
+2485 3352 1
+2485 3371 1
+2485 3393 1
+2485 3404 1
+2485 3409 1
+2485 3417 1
+2485 3443 1
+2485 3452 1
+2485 3458 1
+2485 3459 1
+2485 3473 1
+2485 3480 1
+2485 3489 1
+2485 3498 1
+2485 3516 1
+2485 3529 1
+2485 3537 1
+2485 3557 1
+2485 3562 1
+2485 3568 1
+2485 3580 1
+2485 3587 1
+2485 3615 1
+2485 3645 1
+2485 3650 1
+2485 3660 1
+2485 3680 1
+2485 3748 1
+2485 3752 1
+2485 3796 1
+2485 3800 1
+2485 3854 1
+2485 3873 1
+2485 3892 1
+2485 3897 1
+2485 3903 1
+2485 3970 1
+2485 4011 1
+2485 4013 1
+2485 4037 1
+2485 4040 1
+2485 4055 1
+2485 4071 1
+2485 4099 1
+2485 4124 1
+2485 4162 1
+2485 4175 1
+2485 4179 1
+2485 4181 1
+2485 4191 1
+2485 4212 1
+2485 4247 1
+2485 4256 1
+2485 4266 1
+2485 4290 1
+2485 4338 1
+2485 4361 1
+2485 4384 1
+2485 4432 1
+2485 4485 1
+2485 4510 1
+2485 4536 1
+2485 4574 1
+2485 4578 1
+2485 4600 1
+2485 4613 1
+2485 4653 1
+2485 4666 1
+2485 4712 1
+2485 4781 1
+2485 4814 1
+2485 4827 1
+2485 4828 1
+2485 4899 1
+2485 4938 1
+2485 4964 1
+2485 4977 1
+2485 5002 1
+2485 5020 1
+2485 5022 1
+2485 5026 1
+2485 5028 1
+2485 5061 1
+2485 5096 1
+2485 5100 1
+2485 5103 1
+2485 5106 1
+2485 5144 1
+2485 5178 1
+2485 5189 1
+2485 5233 1
+2485 5254 1
+2485 5289 1
+2485 5323 1
+2485 5404 1
+2485 5412 1
+2485 5430 1
+2485 5445 1
+2485 5452 1
+2485 5454 1
+2485 5459 1
+2485 5482 1
+2485 5484 1
+2485 5506 1
+2485 5509 1
+2485 5529 1
+2485 5543 1
+2485 5584 1
+2485 5637 1
+2485 5640 1
+2485 5651 1
+2485 5683 1
+2485 5693 1
+2485 5721 1
+2485 5790 1
+2485 5804 1
+2485 5806 1
+2485 5818 1
+2485 5872 1
+2485 5902 1
+2485 5922 1
+2485 5925 1
+2485 5932 1
+2485 6032 1
+2485 6043 1
+2485 6123 1
+2485 6124 1
+2485 6148 1
+2485 6151 1
+2485 6227 1
+2485 6229 1
+2485 6327 1
+2485 6347 1
+2485 6417 1
+2485 6523 1
+2485 6560 1
+2485 6600 1
+2485 6780 1
+2485 6832 1
+2485 6875 1
+2485 6897 1
+2485 6914 1
+2485 6934 1
+2485 6976 1
+2485 7092 1
+2485 7351 1
+2485 7400 1
+2485 7422 1
+2485 7478 1
+2485 7510 1
+2485 7561 1
+2485 7620 1
+2485 7624 1
+2485 7649 1
+2485 7795 1
+2485 7809 1
+2485 7833 1
+2485 7855 1
+2485 7862 1
+2485 7890 1
+2485 7927 1
+2485 7961 1
+2485 7965 1
+2485 8163 1
+2485 8174 1
+2485 8192 1
+2485 8212 1
+2485 8295 1
+2487 2240 1
+2488 825 1
+2488 1166 1
+2488 1633 1
+2488 1769 1
+2488 1919 1
+2488 2102 1
+2488 2120 1
+2488 2144 1
+2488 2145 1
+2488 2240 1
+2488 2328 1
+2488 2625 1
+2488 2912 1
+2488 3018 1
+2488 3607 1
+2488 3873 1
+2488 3892 1
+2488 4072 1
+2488 4201 1
+2488 4646 1
+2488 4827 1
+2489 2490 1
+2491 2182 1
+2492 2182 1
+2493 2182 1
+2493 3291 1
+2493 3634 1
+2493 4748 1
+2493 6474 1
+2493 6505 1
+2494 2182 1
+2495 2182 1
+2496 2182 1
+2496 4261 1
+2497 1166 1
+2497 1211 1
+2497 1744 1
+2497 1814 1
+2497 2117 1
+2497 2120 1
+2497 2174 1
+2497 2225 1
+2497 2256 1
+2497 2297 1
+2497 2485 1
+2497 2499 1
+2497 2501 1
+2497 2510 1
+2497 2593 1
+2497 2594 1
+2497 2625 1
+2497 2657 1
+2497 2662 1
+2497 2685 1
+2497 2693 1
+2497 2720 1
+2497 3010 1
+2497 3050 1
+2497 3089 1
+2497 3104 1
+2497 3193 1
+2497 3255 1
+2497 3258 1
+2497 3265 1
+2497 3324 1
+2497 3489 1
+2497 3529 1
+2497 3547 1
+2497 3548 1
+2497 3629 1
+2497 3745 1
+2497 3772 1
+2500 2501 1
+2500 2591 1
+2500 2629 1
+2502 214 1
+2502 1018 1
+2502 1186 1
+2502 1549 1
+2502 1835 1
+2502 2174 1
+2502 2297 1
+2502 2323 1
+2502 2506 1
+2502 2542 1
+2502 2576 1
+2502 2655 1
+2502 2660 1
+2502 2770 1
+2502 2918 1
+2502 3002 1
+2502 3018 1
+2502 3408 1
+2502 3459 1
+2502 4110 1
+2502 5210 1
+2502 5254 1
+2502 5773 1
+2502 5828 1
+2502 6634 1
+2502 6833 1
+2502 7054 1
+2502 7115 1
+2502 8141 1
+2502 8178 1
+2503 1835 1
+2503 2607 1
+2504 15 1
+2504 737 1
+2504 762 1
+2504 825 1
+2504 1185 1
+2504 1453 1
+2504 1769 1
+2504 1799 1
+2504 1835 1
+2504 2066 1
+2504 2144 1
+2504 2252 1
+2504 2256 1
+2504 2297 1
+2504 2323 1
+2504 2328 1
+2504 2338 1
+2504 2354 1
+2504 2364 1
+2504 2381 1
+2504 2398 1
+2504 2508 1
+2504 2542 1
+2504 2544 1
+2504 2547 1
+2504 2576 1
+2504 2585 1
+2504 2605 1
+2504 2619 1
+2504 2655 1
+2504 2660 1
+2504 2775 1
+2504 2794 1
+2504 2830 1
+2504 2940 1
+2504 3002 1
+2504 3009 1
+2504 3020 1
+2504 3034 1
+2504 3050 1
+2504 3068 1
+2504 3084 1
+2504 3092 1
+2504 3117 1
+2504 3443 1
+2504 3452 1
+2504 3454 1
+2504 3456 1
+2504 3568 1
+2504 3607 1
+2504 3650 1
+2504 3720 1
+2504 3800 1
+2504 3843 1
+2504 3892 1
+2504 3903 1
+2504 3926 1
+2504 3956 1
+2504 3971 1
+2504 4024 1
+2504 4037 1
+2504 4043 1
+2504 4099 1
+2504 4191 1
+2504 4256 1
+2504 4263 1
+2504 4400 1
+2504 4485 1
+2504 4827 1
+2504 4846 1
+2504 4875 1
+2504 4953 1
+2504 4962 1
+2504 4981 1
+2504 4999 1
+2504 5079 1
+2504 5092 1
+2504 5189 1
+2504 5233 1
+2504 5412 1
+2504 5449 1
+2504 5484 1
+2504 5527 1
+2504 5828 1
+2504 5886 1
+2504 6006 1
+2504 6094 1
+2504 6123 1
+2504 6124 1
+2504 6156 1
+2504 6296 1
+2504 6560 1
+2504 6770 1
+2504 6918 1
+2504 7092 1
+2504 7839 1
+2504 7908 1
+2504 7924 1
+2504 8174 1
+2504 8296 1
+2505 1835 1
+2506 350 1
+2506 1186 1
+2506 1706 1
+2506 1835 1
+2506 2016 1
+2506 2066 1
+2506 2145 1
+2506 2251 1
+2506 2323 1
+2506 2474 1
+2506 2535 1
+2506 2657 1
+2506 2658 1
+2506 2727 1
+2506 2774 1
+2506 2859 1
+2506 2871 1
+2506 2932 1
+2506 3014 1
+2506 3443 1
+2506 3479 1
+2506 3480 1
+2506 3541 1
+2506 3631 1
+2506 3892 1
+2506 4011 1
+2506 4013 1
+2506 4055 1
+2506 4124 1
+2506 4289 1
+2506 4412 1
+2506 4510 1
+2506 4983 1
+2506 5055 1
+2506 5200 1
+2506 5208 1
+2506 5311 1
+2506 6306 1
+2506 6347 1
+2506 6422 1
+2506 6634 1
+2506 6759 1
+2506 6979 1
+2506 7778 1
+2506 7860 1
+2506 7979 1
+2507 15 1
+2507 633 1
+2507 765 1
+2507 1297 1
+2507 1352 1
+2507 1357 1
+2507 1393 1
+2507 1416 1
+2507 1633 1
+2507 1646 1
+2507 1781 1
+2507 1814 1
+2507 1835 1
+2507 1847 1
+2507 1919 1
+2507 1992 1
+2507 2102 1
+2507 2116 1
+2507 2117 1
+2507 2120 1
+2507 2135 1
+2507 2225 1
+2507 2231 1
+2507 2264 1
+2507 2322 1
+2507 2324 1
+2507 2325 1
+2507 2356 1
+2507 2375 1
+2507 2410 1
+2507 2474 1
+2507 2504 1
+2507 2510 1
+2507 2576 1
+2507 2593 1
+2507 2594 1
+2507 2617 1
+2507 2625 1
+2507 2651 1
+2507 2693 1
+2507 2713 1
+2507 2724 1
+2507 2794 1
+2507 2805 1
+2507 2828 1
+2507 2834 1
+2507 2844 1
+2507 2856 1
+2507 2912 1
+2507 2928 1
+2507 2955 1
+2507 2963 1
+2507 2973 1
+2507 3005 1
+2507 3015 1
+2507 3021 1
+2507 3033 1
+2507 3034 1
+2507 3251 1
+2507 3253 1
+2507 3265 1
+2507 3307 1
+2507 3351 1
+2507 3408 1
+2507 5254 1
+2507 5262 1
+2507 5445 1
+2507 5624 1
+2507 6164 1
+2508 214 1
+2508 290 1
+2508 1374 1
+2508 1835 1
+2508 2323 1
+2508 2470 1
+2508 2542 1
+2508 2625 1
+2508 2669 1
+2508 3562 1
+2508 3892 1
+2508 5083 1
+2508 6004 1
+2509 1374 1
+2509 1384 1
+2509 1835 1
+2509 2340 1
+2509 2619 1
+2509 2625 1
+2509 2638 1
+2509 2685 1
+2509 2720 1
+2509 2770 1
+2509 2801 1
+2510 403 1
+2510 765 1
+2510 1166 1
+2510 1186 1
+2510 1250 1
+2510 1267 1
+2510 1297 1
+2510 1416 1
+2510 1437 1
+2510 1633 1
+2510 1648 1
+2510 1653 1
+2510 1792 1
+2510 1808 1
+2510 1814 1
+2510 1847 1
+2510 1992 1
+2510 2102 1
+2510 2117 1
+2510 2120 1
+2510 2134 1
+2510 2174 1
+2510 2231 1
+2510 2294 1
+2510 2328 1
+2510 2371 1
+2510 2410 1
+2510 2474 1
+2510 2485 1
+2510 2504 1
+2510 2542 1
+2510 2565 1
+2510 2587 1
+2510 2593 1
+2510 2594 1
+2510 2617 1
+2510 2625 1
+2510 2651 1
+2510 2654 1
+2510 2660 1
+2510 2674 1
+2510 2693 1
+2510 2700 1
+2510 2707 1
+2510 2727 1
+2510 2754 1
+2510 2794 1
+2510 2801 1
+2510 2805 1
+2510 2828 1
+2510 2834 1
+2510 2999 1
+2510 3005 1
+2510 3030 1
+2510 3034 1
+2510 3130 1
+2510 3253 1
+2510 3265 1
+2510 3276 1
+2510 3394 1
+2510 3404 1
+2510 3489 1
+2510 3516 1
+2510 3529 1
+2510 3557 1
+2510 4124 1
+2510 4256 1
+2510 5412 1
+2511 1018 1
+2511 1026 1
+2511 3084 1
+2511 3238 1
+2511 6241 1
+2511 7647 1
+2511 7649 1
+2511 7688 1
+2517 1310 1
+2517 1918 1
+2517 2117 1
+2517 2120 1
+2517 2996 1
+2512 2517 1
+2514 2517 1
+2513 2517 1
+2515 2517 1
+2516 2517 1
+2516 2576 1
+2516 2579 1
+2516 2587 1
+2516 2605 1
+2516 2657 1
+2516 2912 1
+2516 3026 1
+2516 3265 1
+2516 3456 1
+2516 3479 1
+2516 3664 1
+2516 3680 1
+2516 3792 1
+2516 3892 1
+2516 3976 1
+2516 4574 1
+2516 4706 1
+2516 4808 1
+2516 4875 1
+2516 5037 1
+2516 5130 1
+2516 5245 1
+2516 5273 1
+2516 5459 1
+2516 5463 1
+2516 5605 1
+2516 5683 1
+2516 5697 1
+2516 5743 1
+2516 5814 1
+2516 5827 1
+2516 5844 1
+2516 5863 1
+2516 5926 1
+2516 5931 1
+2516 5947 1
+2516 6009 1
+2516 6481 1
+2516 6532 1
+2516 6589 1
+2516 6634 1
+2516 8128 1
+2516 8295 1
+2518 1186 1
+2518 2510 1
+2518 3024 1
+2518 7115 1
+2519 1186 1
+2355 1186 1
+2520 1186 1
+2530 1186 1
+2531 1186 1
+2531 2256 1
+2521 1186 1
+2522 1186 1
+2523 968 1
+2523 1186 1
+2523 2999 1
+2523 4175 1
+2523 7890 1
+2534 1186 1
+2526 1186 1
+2527 1186 1
+2527 2625 1
+2528 1186 1
+2535 15 1
+2535 204 1
+2535 1186 1
+2535 1453 1
+2535 1549 1
+2535 2066 1
+2535 2145 1
+2535 2160 1
+2535 2240 1
+2535 2326 1
+2535 2354 1
+2535 2381 1
+2535 2775 1
+2535 2790 1
+2535 2805 1
+2535 2981 1
+2535 3103 1
+2535 3309 1
+2535 3352 1
+2535 3443 1
+2535 3454 1
+2535 3456 1
+2535 3458 1
+2535 3607 1
+2535 3643 1
+2535 3897 1
+2535 3976 1
+2535 4040 1
+2535 4044 1
+2535 4098 1
+2535 4219 1
+2535 4233 1
+2535 4335 1
+2535 4480 1
+2535 4808 1
+2535 5020 1
+2535 5100 1
+2535 5123 1
+2535 5254 1
+2535 5335 1
+2535 5375 1
+2535 5412 1
+2535 5683 1
+2535 5817 1
+2535 6156 1
+2535 6832 1
+2535 8293 1
+2536 1186 1
+2537 1186 1
+2538 1186 1
+2529 1186 1
+2540 1186 1
+1181 1186 1
+2541 204 1
+2541 290 1
+2541 762 1
+2541 974 1
+2541 1211 1
+2541 1297 1
+2541 1549 1
+2541 1754 1
+2541 1918 1
+2541 2144 1
+2541 2251 1
+2541 2256 1
+2541 2323 1
+2541 2398 1
+2541 2504 1
+2541 2617 1
+2541 2625 1
+2541 2651 1
+2541 2708 1
+2541 2724 1
+2541 2799 1
+2541 2818 1
+2541 2821 1
+2541 2926 1
+2541 2963 1
+2541 2991 1
+2541 3029 1
+2541 3050 1
+2541 3068 1
+2541 3082 1
+2541 3089 1
+2541 3099 1
+2541 3307 1
+2541 3348 1
+2541 3408 1
+2541 3946 1
+2541 8293 1
+2542 72 1
+2542 204 1
+2542 403 1
+2542 417 1
+2542 765 1
+2542 1100 1
+2542 1267 1
+2542 1297 1
+2542 1307 1
+2542 1453 1
+2542 1549 1
+2542 1637 1
+2542 1723 1
+2542 1956 1
+2542 1990 1
+2542 2016 1
+2542 2066 1
+2542 2102 1
+2542 2120 1
+2542 2145 1
+2542 2174 1
+2542 2225 1
+2542 2231 1
+2542 2252 1
+2542 2264 1
+2542 2290 1
+2542 2297 1
+2542 2323 1
+2542 2328 1
+2542 2356 1
+2542 2398 1
+2542 2456 1
+2542 2504 1
+2542 2508 1
+2542 2576 1
+2542 2597 1
+2542 2599 1
+2542 2623 1
+2542 2660 1
+2542 2693 1
+2542 2707 1
+2542 2746 1
+2542 2768 1
+2542 2787 1
+2542 2805 1
+2542 2819 1
+2542 2828 1
+2542 2834 1
+2542 2859 1
+2542 2871 1
+2542 2968 1
+2542 3018 1
+2542 3021 1
+2542 3028 1
+2542 3260 1
+2542 3291 1
+2542 3301 1
+2542 3371 1
+2542 3408 1
+2542 3435 1
+2542 3443 1
+2542 3473 1
+2542 3580 1
+2542 3587 1
+2542 3804 1
+2542 3812 1
+2542 3847 1
+2542 3871 1
+2542 3903 1
+2542 3926 1
+2542 3946 1
+2542 3976 1
+2542 4013 1
+2542 4138 1
+2542 4175 1
+2542 4191 1
+2542 4233 1
+2542 4247 1
+2542 4261 1
+2542 4338 1
+2542 4361 1
+2542 4463 1
+2542 4510 1
+2542 4604 1
+2542 4687 1
+2542 4735 1
+2542 4981 1
+2542 5584 1
+2542 5714 1
+2542 5828 1
+2542 5902 1
+2542 6229 1
+2542 8294 1
+2543 2504 1
+2498 2504 1
+2545 2504 1
+2545 2508 1
+2545 3026 1
+2545 3480 1
+2545 5671 1
+2545 6437 1
+2545 6458 1
+2546 968 1
+2546 1357 1
+2546 1416 1
+2546 1419 1
+2546 1549 1
+2546 1633 1
+2546 1734 1
+2546 1956 1
+2546 2066 1
+2546 2102 1
+2546 2145 1
+2546 2174 1
+2546 2297 1
+2546 2322 1
+2546 2338 1
+2546 2340 1
+2546 2504 1
+2546 2542 1
+2546 2570 1
+2546 2576 1
+2546 2579 1
+2546 2638 1
+2546 2654 1
+2546 2660 1
+2546 2665 1
+2546 2674 1
+2546 2693 1
+2546 2794 1
+2546 2801 1
+2546 2828 1
+2546 2900 1
+2546 3034 1
+2546 3443 1
+2546 3567 1
+2547 204 1
+2547 762 1
+2547 1357 1
+2547 1437 1
+2547 1549 1
+2547 1596 1
+2547 1679 1
+2547 1777 1
+2547 1792 1
+2547 1808 1
+2547 2209 1
+2547 2290 1
+2547 2297 1
+2547 2325 1
+2547 2328 1
+2547 2371 1
+2547 2398 1
+2547 2411 1
+2547 2440 1
+2547 2474 1
+2547 2485 1
+2547 2504 1
+2547 2542 1
+2547 2560 1
+2547 2576 1
+2547 2625 1
+2547 2646 1
+2547 2653 1
+2547 2654 1
+2547 2660 1
+2547 2662 1
+2547 2667 1
+2547 2674 1
+2547 2687 1
+2547 2724 1
+2547 2768 1
+2547 2777 1
+2547 2790 1
+2547 2794 1
+2547 2797 1
+2547 2799 1
+2547 2819 1
+2547 2900 1
+2547 2912 1
+2547 2914 1
+2547 2946 1
+2547 2972 1
+2547 2991 1
+2547 2993 1
+2547 2996 1
+2547 3014 1
+2547 3034 1
+2547 3050 1
+2547 3056 1
+2547 3068 1
+2547 3089 1
+2547 3099 1
+2547 3126 1
+2547 3150 1
+2547 3235 1
+2547 3253 1
+2547 3276 1
+2547 3352 1
+2547 3439 1
+2547 3443 1
+2547 3516 1
+2547 3557 1
+2547 3580 1
+2547 3587 1
+2547 3650 1
+2547 3976 1
+2547 4021 1
+2547 4124 1
+2547 4199 1
+2547 4266 1
+2547 4297 1
+2547 4349 1
+2547 4402 1
+2547 4453 1
+2547 4662 1
+2547 4687 1
+2547 4706 1
+2547 4715 1
+2547 4719 1
+2547 4735 1
+2547 4798 1
+2547 4811 1
+2547 4875 1
+2547 5072 1
+2547 5073 1
+2547 5487 1
+2547 5524 1
+2547 5543 1
+2547 5638 1
+2547 6098 1
+2547 6337 1
+2547 6407 1
+2547 6435 1
+2547 6481 1
+2547 6566 1
+2547 6699 1
+2547 7115 1
+2547 8293 1
+2547 8294 1
+2547 8295 1
+2548 1847 1
+2548 2117 1
+2548 2144 1
+2548 2504 1
+2548 2585 1
+2548 2646 1
+2548 2657 1
+2548 2794 1
+2548 2923 1
+2548 3005 1
+2548 3568 1
+2548 3645 1
+2549 290 1
+2549 762 1
+2549 1211 1
+2549 1357 1
+2549 1648 1
+2549 1734 1
+2549 1754 1
+2549 1808 1
+2549 1918 1
+2549 1919 1
+2549 1956 1
+2549 2251 1
+2549 2256 1
+2549 2323 1
+2549 2371 1
+2549 2474 1
+2549 2504 1
+2549 2510 1
+2549 2565 1
+2549 2576 1
+2549 2585 1
+2549 2593 1
+2549 2727 1
+2549 2746 1
+2549 2877 1
+2549 2923 1
+2549 2932 1
+2549 2955 1
+2549 2958 1
+2549 2963 1
+2549 3002 1
+2549 3005 1
+2549 3007 1
+2549 3024 1
+2549 3029 1
+2549 3033 1
+2549 3117 1
+2549 3238 1
+2549 3615 1
+2549 3650 1
+2549 3752 1
+2549 3812 1
+2549 3937 1
+2549 4037 1
+2549 4482 1
+2549 4531 1
+2549 4536 1
+2549 4587 1
+2549 4777 1
+2549 4797 1
+2549 4814 1
+2549 4929 1
+2549 5022 1
+2549 5079 1
+2549 5263 1
+2549 5301 1
+2549 5412 1
+2549 5459 1
+2549 5527 1
+2549 5651 1
+2549 5743 1
+2549 5773 1
+2549 5784 1
+2549 5790 1
+2549 5828 1
+2549 5928 1
+2549 6914 1
+2549 7092 1
+2549 7131 1
+2549 7803 1
+2550 765 1
+2550 1357 1
+2550 1416 1
+2550 1437 1
+2550 1549 1
+2550 1717 1
+2550 1956 1
+2550 2116 1
+2550 2174 1
+2550 2233 1
+2550 2264 1
+2550 2371 1
+2550 2501 1
+2550 2504 1
+2550 2579 1
+2550 2589 1
+2550 2591 1
+2550 2697 1
+2550 2794 1
+2550 2797 1
+2550 2834 1
+2550 2902 1
+2550 2918 1
+2550 3164 1
+2550 3171 1
+2550 8291 1
+2552 2504 1
+2552 4828 1
+2552 6094 1
+2552 6124 1
+2552 7005 1
+2551 1211 1
+2551 2504 1
+899 403 1
+899 1592 1
+899 1637 1
+899 1646 1
+899 1653 1
+899 1723 1
+899 1956 1
+899 2120 1
+899 2225 1
+899 2410 1
+899 2618 1
+899 2754 1
+899 2768 1
+899 2777 1
+899 2794 1
+899 2801 1
+899 2805 1
+899 2809 1
+899 2814 1
+899 2818 1
+899 2821 1
+899 2828 1
+899 2834 1
+899 8292 1
+2555 765 1
+2555 1653 1
+2555 1956 1
+2555 2102 1
+2555 2120 1
+2555 2322 1
+2555 2410 1
+2555 2794 1
+2555 2801 1
+2555 2809 1
+2555 2828 1
+2555 8292 1
+2556 1956 1
+2566 15 1
+2566 762 1
+2566 1374 1
+2566 1549 1
+2566 1792 1
+2566 1956 1
+2566 2066 1
+2566 2102 1
+2566 2354 1
+2566 2535 1
+2566 2595 1
+2566 2654 1
+2566 2660 1
+2566 2674 1
+2566 2900 1
+2566 2972 1
+2566 3320 1
+2566 3348 1
+2566 3394 1
+2566 3479 1
+2566 3529 1
+2566 3562 1
+2566 3843 1
+2566 4138 1
+2566 4191 1
+2566 4201 1
+2566 4335 1
+2566 4712 1
+2566 4994 1
+2566 5130 1
+2566 6464 1
+2566 8292 1
+2557 56 1
+2557 214 1
+2557 403 1
+2557 765 1
+2557 1154 1
+2557 1310 1
+2557 1315 1
+2557 1419 1
+2557 1596 1
+2557 1637 1
+2557 1646 1
+2557 1705 1
+2557 1723 1
+2557 1769 1
+2557 1918 1
+2557 1956 1
+2557 2053 1
+2557 2102 1
+2557 2120 1
+2557 2174 1
+2557 2264 1
+2557 2322 1
+2557 2323 1
+2557 2340 1
+2557 2411 1
+2557 2416 1
+2557 2470 1
+2557 2547 1
+2557 2560 1
+2557 2599 1
+2557 2618 1
+2557 2707 1
+2557 2763 1
+2557 2768 1
+2557 2770 1
+2557 2777 1
+2557 2781 1
+2557 2785 1
+2557 2794 1
+2557 2797 1
+2557 2801 1
+2557 2805 1
+2557 2809 1
+2557 2814 1
+2557 2815 1
+2557 2828 1
+2557 2834 1
+2557 2871 1
+2557 2877 1
+2557 2880 1
+2557 2918 1
+2557 2922 1
+2557 2955 1
+2557 2963 1
+2557 2966 1
+2557 2972 1
+2557 2977 1
+2557 2979 1
+2557 2996 1
+2557 2999 1
+2557 3014 1
+2557 3276 1
+2557 3443 1
+2557 3607 1
+2557 3643 1
+2557 3854 1
+2557 3898 1
+2557 3958 1
+2557 4220 1
+2557 4298 1
+2557 4551 1
+2557 4613 1
+2557 4792 1
+2557 4953 1
+2557 4999 1
+2557 8290 1
+2557 8292 1
+2469 350 1
+2469 1956 1
+2469 2794 1
+2567 15 1
+2567 1211 1
+2567 1956 1
+2567 2398 1
+2567 8292 1
+2558 1956 1
+2558 3020 1
+2559 214 1
+2559 290 1
+2559 403 1
+2559 417 1
+2559 633 1
+2559 762 1
+2559 765 1
+2559 974 1
+2559 1166 1
+2559 1211 1
+2559 1291 1
+2559 1297 1
+2559 1385 1
+2559 1729 1
+2559 1734 1
+2559 1744 1
+2559 1754 1
+2559 1792 1
+2559 1814 1
+2559 1847 1
+2559 1956 1
+2559 1961 1
+2559 2053 1
+2559 2066 1
+2559 2120 1
+2559 2225 1
+2559 2252 1
+2559 2256 1
+2559 2289 1
+2559 2290 1
+2559 2324 1
+2559 2356 1
+2559 2398 1
+2559 2411 1
+2559 2470 1
+2559 2508 1
+2559 2510 1
+2559 2542 1
+2559 2565 1
+2559 2617 1
+2559 2625 1
+2559 2651 1
+2559 2654 1
+2559 2662 1
+2559 2674 1
+2559 2721 1
+2559 2785 1
+2559 2794 1
+2559 2805 1
+2559 2809 1
+2559 2828 1
+2559 2856 1
+2559 2859 1
+2559 2951 1
+2559 2958 1
+2559 2968 1
+2559 3029 1
+2559 3034 1
+2559 3117 1
+2559 3140 1
+2559 3148 1
+2559 3173 1
+2559 3253 1
+2559 3307 1
+2559 3371 1
+2559 3394 1
+2559 3516 1
+2559 3562 1
+2559 3568 1
+2559 3580 1
+2559 3629 1
+2559 3680 1
+2559 4051 1
+2559 4110 1
+2559 4201 1
+2559 4290 1
+2559 4365 1
+2559 4384 1
+2559 4453 1
+2559 4463 1
+2559 8292 1
+2559 8294 1
+2560 204 1
+2560 290 1
+2560 346 1
+2560 417 1
+2560 825 1
+2560 827 1
+2560 856 1
+2560 1024 1
+2560 1026 1
+2560 1157 1
+2560 1211 1
+2560 1239 1
+2560 1291 1
+2560 1297 1
+2560 1305 1
+2560 1307 1
+2560 1360 1
+2560 1549 1
+2560 1571 1
+2560 1596 1
+2560 1744 1
+2560 1754 1
+2560 1777 1
+2560 1915 1
+2560 1956 1
+2560 2016 1
+2560 2066 1
+2560 2114 1
+2560 2129 1
+2560 2144 1
+2560 2210 1
+2560 2231 1
+2560 2252 1
+2560 2256 1
+2560 2323 1
+2560 2324 1
+2560 2340 1
+2560 2398 1
+2560 2411 1
+2560 2485 1
+2560 2508 1
+2560 2565 1
+2560 2593 1
+2560 2595 1
+2560 2597 1
+2560 2617 1
+2560 2619 1
+2560 2646 1
+2560 2653 1
+2560 2654 1
+2560 2655 1
+2560 2686 1
+2560 2708 1
+2560 2727 1
+2560 2794 1
+2560 2799 1
+2560 2809 1
+2560 2859 1
+2560 2912 1
+2560 2917 1
+2560 2918 1
+2560 2923 1
+2560 2926 1
+2560 2951 1
+2560 2963 1
+2560 2968 1
+2560 2972 1
+2560 2979 1
+2560 2993 1
+2560 2996 1
+2560 2999 1
+2560 3009 1
+2560 3024 1
+2560 3034 1
+2560 3050 1
+2560 3056 1
+2560 3073 1
+2560 3084 1
+2560 3089 1
+2560 3099 1
+2560 3114 1
+2560 3140 1
+2560 3145 1
+2560 3164 1
+2560 3173 1
+2560 3180 1
+2560 3238 1
+2560 3253 1
+2560 3276 1
+2560 3291 1
+2560 3310 1
+2560 3346 1
+2560 3394 1
+2560 3417 1
+2560 3439 1
+2560 3473 1
+2560 3480 1
+2560 3506 1
+2560 3516 1
+2560 3520 1
+2560 3537 1
+2560 3557 1
+2560 3567 1
+2560 3580 1
+2560 3615 1
+2560 3646 1
+2560 3650 1
+2560 3661 1
+2560 3670 1
+2560 3681 1
+2560 3717 1
+2560 3770 1
+2560 3803 1
+2560 3812 1
+2560 3843 1
+2560 3847 1
+2560 3926 1
+2560 3937 1
+2560 3949 1
+2560 3967 1
+2560 4012 1
+2560 4021 1
+2560 4044 1
+2560 4138 1
+2560 4189 1
+2560 4191 1
+2560 4201 1
+2560 4233 1
+2560 4256 1
+2560 4289 1
+2560 4290 1
+2560 4298 1
+2560 4311 1
+2560 4323 1
+2560 4341 1
+2560 4365 1
+2560 4384 1
+2560 4507 1
+2560 4706 1
+2560 4811 1
+2560 4999 1
+2560 5096 1
+2560 5148 1
+2560 5341 1
+2560 5406 1
+2560 5671 1
+2560 6043 1
+2560 6320 1
+2560 6330 1
+2560 6422 1
+2560 6523 1
+2560 6560 1
+2560 6665 1
+2560 6918 1
+2560 6980 1
+2560 7052 1
+2560 7059 1
+2560 7277 1
+2560 7400 1
+2560 7443 1
+2560 7544 1
+2560 7587 1
+2560 7647 1
+2560 7648 1
+2560 7649 1
+2560 7651 1
+2560 7652 1
+2560 7694 1
+2560 7695 1
+2560 7699 1
+2560 7707 1
+2560 7726 1
+2560 7778 1
+2560 7788 1
+2560 7795 1
+2560 7803 1
+2560 7809 1
+2560 7813 1
+2560 7965 1
+2560 8293 1
+2561 1956 1
+2561 2809 1
+2562 1956 1
+2562 5254 1
+2563 1956 1
+2563 2777 1
+2564 15 1
+2564 72 1
+2564 204 1
+2564 608 1
+2564 737 1
+2564 974 1
+2564 1315 1
+2564 1352 1
+2564 1473 1
+2564 1799 1
+2564 1956 1
+2564 2066 1
+2564 2134 1
+2564 2237 1
+2564 2324 1
+2564 2456 1
+2564 2508 1
+2564 2576 1
+2564 2657 1
+2564 2660 1
+2564 2693 1
+2564 2940 1
+2564 2981 1
+2564 3027 1
+2564 3164 1
+2564 3371 1
+2564 3456 1
+2564 3537 1
+2564 3635 1
+2564 3680 1
+2564 3720 1
+2564 3830 1
+2564 4099 1
+2564 4191 1
+2564 4247 1
+2564 4297 1
+2564 4338 1
+2564 4712 1
+2564 4953 1
+2564 5239 1
+2564 5637 1
+2564 5714 1
+2564 5848 1
+2564 6328 1
+2564 6337 1
+2564 6437 1
+2564 6442 1
+2564 6600 1
+2564 6833 1
+2564 6897 1
+2565 56 1
+2565 155 1
+2565 204 1
+2565 214 1
+2565 285 1
+2565 290 1
+2565 346 1
+2565 403 1
+2565 417 1
+2565 425 1
+2565 465 1
+2565 633 1
+2565 737 1
+2565 762 1
+2565 765 1
+2565 825 1
+2565 827 1
+2565 840 1
+2565 856 1
+2565 938 1
+2565 967 1
+2565 974 1
+2565 1024 1
+2565 1026 1
+2565 1100 1
+2565 1154 1
+2565 1157 1
+2565 1166 1
+2565 1185 1
+2565 1191 1
+2565 1211 1
+2565 1239 1
+2565 1247 1
+2565 1267 1
+2565 1291 1
+2565 1297 1
+2565 1305 1
+2565 1307 1
+2565 1310 1
+2565 1315 1
+2565 1357 1
+2565 1360 1
+2565 1374 1
+2565 1384 1
+2565 1385 1
+2565 1393 1
+2565 1403 1
+2565 1416 1
+2565 1419 1
+2565 1437 1
+2565 1493 1
+2565 1498 1
+2565 1548 1
+2565 1549 1
+2565 1571 1
+2565 1596 1
+2565 1633 1
+2565 1637 1
+2565 1646 1
+2565 1653 1
+2565 1679 1
+2565 1680 1
+2565 1688 1
+2565 1705 1
+2565 1706 1
+2565 1723 1
+2565 1729 1
+2565 1734 1
+2565 1744 1
+2565 1754 1
+2565 1769 1
+2565 1777 1
+2565 1781 1
+2565 1792 1
+2565 1799 1
+2565 1808 1
+2565 1814 1
+2565 1865 1
+2565 1915 1
+2565 1918 1
+2565 1919 1
+2565 1935 1
+2565 1956 1
+2565 1982 1
+2565 1990 1
+2565 2014 1
+2565 2016 1
+2565 2053 1
+2565 2066 1
+2565 2102 1
+2565 2114 1
+2565 2116 1
+2565 2120 1
+2565 2133 1
+2565 2134 1
+2565 2135 1
+2565 2144 1
+2565 2145 1
+2565 2160 1
+2565 2174 1
+2565 2209 1
+2565 2210 1
+2565 2223 1
+2565 2225 1
+2565 2231 1
+2565 2237 1
+2565 2240 1
+2565 2251 1
+2565 2252 1
+2565 2256 1
+2565 2257 1
+2565 2258 1
+2565 2264 1
+2565 2289 1
+2565 2290 1
+2565 2297 1
+2565 2307 1
+2565 2322 1
+2565 2323 1
+2565 2324 1
+2565 2325 1
+2565 2328 1
+2565 2338 1
+2565 2354 1
+2565 2356 1
+2565 2364 1
+2565 2369 1
+2565 2371 1
+2565 2375 1
+2565 2381 1
+2565 2384 1
+2565 2386 1
+2565 2398 1
+2565 2410 1
+2565 2411 1
+2565 2416 1
+2565 2426 1
+2565 2433 1
+2565 2456 1
+2565 2470 1
+2565 2474 1
+2565 2485 1
+2565 2501 1
+2565 2506 1
+2565 2508 1
+2565 2510 1
+2565 2511 1
+2565 2516 1
+2565 2517 1
+2565 2535 1
+2565 2542 1
+2565 2544 1
+2565 2547 1
+2565 2550 1
+2565 2560 1
+2565 2576 1
+2565 2585 1
+2565 2592 1
+2565 2593 1
+2565 2594 1
+2565 2595 1
+2565 2597 1
+2565 2599 1
+2565 2605 1
+2565 2612 1
+2565 2617 1
+2565 2623 1
+2565 2625 1
+2565 2646 1
+2565 2647 1
+2565 2651 1
+2565 2652 1
+2565 2653 1
+2565 2654 1
+2565 2655 1
+2565 2657 1
+2565 2658 1
+2565 2660 1
+2565 2662 1
+2565 2667 1
+2565 2674 1
+2565 2686 1
+2565 2687 1
+2565 2689 1
+2565 2693 1
+2565 2696 1
+2565 2697 1
+2565 2700 1
+2565 2707 1
+2565 2708 1
+2565 2713 1
+2565 2721 1
+2565 2724 1
+2565 2727 1
+2565 2746 1
+2565 2747 1
+2565 2754 1
+2565 2763 1
+2565 2764 1
+2565 2768 1
+2565 2770 1
+2565 2775 1
+2565 2777 1
+2565 2785 1
+2565 2787 1
+2565 2790 1
+2565 2794 1
+2565 2799 1
+2565 2805 1
+2565 2809 1
+2565 2811 1
+2565 2814 1
+2565 2815 1
+2565 2819 1
+2565 2822 1
+2565 2825 1
+2565 2828 1
+2565 2830 1
+2565 2831 1
+2565 2834 1
+2565 2838 1
+2565 2844 1
+2565 2851 1
+2565 2856 1
+2565 2859 1
+2565 2871 1
+2565 2877 1
+2565 2880 1
+2565 2900 1
+2565 2902 1
+2565 2909 1
+2565 2912 1
+2565 2917 1
+2565 2918 1
+2565 2922 1
+2565 2923 1
+2565 2926 1
+2565 2932 1
+2565 2940 1
+2565 2946 1
+2565 2951 1
+2565 2955 1
+2565 2958 1
+2565 2963 1
+2565 2966 1
+2565 2968 1
+2565 2972 1
+2565 2973 1
+2565 2974 1
+2565 2977 1
+2565 2979 1
+2565 2981 1
+2565 2991 1
+2565 2993 1
+2565 2999 1
+2565 3000 1
+2565 3002 1
+2565 3005 1
+2565 3007 1
+2565 3009 1
+2565 3010 1
+2565 3018 1
+2565 3020 1
+2565 3021 1
+2565 3024 1
+2565 3026 1
+2565 3027 1
+2565 3028 1
+2565 3029 1
+2565 3030 1
+2565 3033 1
+2565 3034 1
+2565 3050 1
+2565 3056 1
+2565 3059 1
+2565 3068 1
+2565 3073 1
+2565 3084 1
+2565 3089 1
+2565 3092 1
+2565 3099 1
+2565 3103 1
+2565 3106 1
+2565 3114 1
+2565 3117 1
+2565 3125 1
+2565 3126 1
+2565 3140 1
+2565 3144 1
+2565 3145 1
+2565 3148 1
+2565 3150 1
+2565 3164 1
+2565 3173 1
+2565 3192 1
+2565 3200 1
+2565 3235 1
+2565 3238 1
+2565 3243 1
+2565 3251 1
+2565 3253 1
+2565 3258 1
+2565 3260 1
+2565 3265 1
+2565 3276 1
+2565 3284 1
+2565 3293 1
+2565 3297 1
+2565 3307 1
+2565 3309 1
+2565 3310 1
+2565 3313 1
+2565 3319 1
+2565 3320 1
+2565 3321 1
+2565 3324 1
+2565 3334 1
+2565 3338 1
+2565 3346 1
+2565 3348 1
+2565 3351 1
+2565 3352 1
+2565 3371 1
+2565 3381 1
+2565 3393 1
+2565 3394 1
+2565 3404 1
+2565 3408 1
+2565 3417 1
+2565 3435 1
+2565 3439 1
+2565 3443 1
+2565 3447 1
+2565 3452 1
+2565 3453 1
+2565 3454 1
+2565 3455 1
+2565 3456 1
+2565 3458 1
+2565 3459 1
+2565 3460 1
+2565 3461 1
+2565 3464 1
+2565 3473 1
+2565 3480 1
+2565 3483 1
+2565 3486 1
+2565 3489 1
+2565 3506 1
+2565 3516 1
+2565 3520 1
+2565 3529 1
+2565 3537 1
+2565 3538 1
+2565 3541 1
+2565 3547 1
+2565 3548 1
+2565 3557 1
+2565 3562 1
+2565 3567 1
+2565 3568 1
+2565 3576 1
+2565 3580 1
+2565 3587 1
+2565 3607 1
+2565 3609 1
+2565 3615 1
+2565 3631 1
+2565 3635 1
+2565 3643 1
+2565 3645 1
+2565 3646 1
+2565 3650 1
+2565 3660 1
+2565 3661 1
+2565 3664 1
+2565 3670 1
+2565 3680 1
+2565 3681 1
+2565 3691 1
+2565 3717 1
+2565 3720 1
+2565 3726 1
+2565 3748 1
+2565 3752 1
+2565 3769 1
+2565 3770 1
+2565 3787 1
+2565 3792 1
+2565 3796 1
+2565 3803 1
+2565 3804 1
+2565 3806 1
+2565 3807 1
+2565 3812 1
+2565 3813 1
+2565 3816 1
+2565 3843 1
+2565 3847 1
+2565 3849 1
+2565 3854 1
+2565 3856 1
+2565 3867 1
+2565 3871 1
+2565 3885 1
+2565 3887 1
+2565 3892 1
+2565 3893 1
+2565 3898 1
+2565 3903 1
+2565 3910 1
+2565 3926 1
+2565 3937 1
+2565 3946 1
+2565 3956 1
+2565 3958 1
+2565 3962 1
+2565 3967 1
+2565 3969 1
+2565 3976 1
+2565 4011 1
+2565 4013 1
+2565 4021 1
+2565 4024 1
+2565 4031 1
+2565 4037 1
+2565 4040 1
+2565 4043 1
+2565 4044 1
+2565 4051 1
+2565 4055 1
+2565 4058 1
+2565 4065 1
+2565 4071 1
+2565 4072 1
+2565 4088 1
+2565 4098 1
+2565 4103 1
+2565 4110 1
+2565 4117 1
+2565 4124 1
+2565 4127 1
+2565 4134 1
+2565 4138 1
+2565 4162 1
+2565 4179 1
+2565 4189 1
+2565 4191 1
+2565 4199 1
+2565 4201 1
+2565 4212 1
+2565 4231 1
+2565 4233 1
+2565 4234 1
+2565 4247 1
+2565 4256 1
+2565 4261 1
+2565 4263 1
+2565 4266 1
+2565 4269 1
+2565 4289 1
+2565 4290 1
+2565 4297 1
+2565 4298 1
+2565 4299 1
+2565 4315 1
+2565 4331 1
+2565 4335 1
+2565 4341 1
+2565 4349 1
+2565 4355 1
+2565 4361 1
+2565 4365 1
+2565 4373 1
+2565 4384 1
+2565 4385 1
+2565 4386 1
+2565 4400 1
+2565 4401 1
+2565 4412 1
+2565 4417 1
+2565 4422 1
+2565 4424 1
+2565 4432 1
+2565 4435 1
+2565 4448 1
+2565 4453 1
+2565 4463 1
+2565 4468 1
+2565 4482 1
+2565 4485 1
+2565 4488 1
+2565 4500 1
+2565 4507 1
+2565 4510 1
+2565 4528 1
+2565 4530 1
+2565 4531 1
+2565 4536 1
+2565 4547 1
+2565 4551 1
+2565 4557 1
+2565 4558 1
+2565 4562 1
+2565 4578 1
+2565 4583 1
+2565 4587 1
+2565 4588 1
+2565 4600 1
+2565 4605 1
+2565 4613 1
+2565 4620 1
+2565 4631 1
+2565 4632 1
+2565 4646 1
+2565 4648 1
+2565 4653 1
+2565 4661 1
+2565 4662 1
+2565 4666 1
+2565 4706 1
+2565 4709 1
+2565 4713 1
+2565 4719 1
+2565 4735 1
+2565 4764 1
+2565 4777 1
+2565 4778 1
+2565 4780 1
+2565 4792 1
+2565 4796 1
+2565 4808 1
+2565 4811 1
+2565 4814 1
+2565 4820 1
+2565 4824 1
+2565 4827 1
+2565 4846 1
+2565 4875 1
+2565 4884 1
+2565 4929 1
+2565 4938 1
+2565 4940 1
+2565 4944 1
+2565 4953 1
+2565 4964 1
+2565 4981 1
+2565 4983 1
+2565 4986 1
+2565 4999 1
+2565 5002 1
+2565 5012 1
+2565 5020 1
+2565 5022 1
+2565 5026 1
+2565 5028 1
+2565 5037 1
+2565 5055 1
+2565 5058 1
+2565 5073 1
+2565 5079 1
+2565 5092 1
+2565 5096 1
+2565 5100 1
+2565 5106 1
+2565 5130 1
+2565 5132 1
+2565 5144 1
+2565 5148 1
+2565 5162 1
+2565 5179 1
+2565 5189 1
+2565 5199 1
+2565 5204 1
+2565 5210 1
+2565 5215 1
+2565 5222 1
+2565 5233 1
+2565 5239 1
+2565 5245 1
+2565 5246 1
+2565 5288 1
+2565 5289 1
+2565 5295 1
+2565 5321 1
+2565 5335 1
+2565 5341 1
+2565 5364 1
+2565 5378 1
+2565 5384 1
+2565 5392 1
+2565 5404 1
+2565 5406 1
+2565 5412 1
+2565 5421 1
+2565 5423 1
+2565 5430 1
+2565 5432 1
+2565 5449 1
+2565 5452 1
+2565 5454 1
+2565 5459 1
+2565 5465 1
+2565 5466 1
+2565 5484 1
+2565 5500 1
+2565 5506 1
+2565 5509 1
+2565 5511 1
+2565 5524 1
+2565 5529 1
+2565 5539 1
+2565 5543 1
+2565 5545 1
+2565 5559 1
+2565 5563 1
+2565 5568 1
+2565 5582 1
+2565 5592 1
+2565 5596 1
+2565 5605 1
+2565 5614 1
+2565 5637 1
+2565 5640 1
+2565 5650 1
+2565 5651 1
+2565 5671 1
+2565 5683 1
+2565 5693 1
+2565 5697 1
+2565 5714 1
+2565 5739 1
+2565 5760 1
+2565 5772 1
+2565 5773 1
+2565 5776 1
+2565 5800 1
+2565 5802 1
+2565 5806 1
+2565 5807 1
+2565 5811 1
+2565 5812 1
+2565 5814 1
+2565 5817 1
+2565 5818 1
+2565 5822 1
+2565 5829 1
+2565 5835 1
+2565 5839 1
+2565 5871 1
+2565 5872 1
+2565 5887 1
+2565 5897 1
+2565 5902 1
+2565 5922 1
+2565 5932 1
+2565 5933 1
+2565 5998 1
+2565 6000 1
+2565 6004 1
+2565 6032 1
+2565 6043 1
+2565 6044 1
+2565 6097 1
+2565 6123 1
+2565 6151 1
+2565 6174 1
+2565 6198 1
+2565 6227 1
+2565 6241 1
+2565 6243 1
+2565 6270 1
+2565 6272 1
+2565 6299 1
+2565 6305 1
+2565 6320 1
+2565 6327 1
+2565 6330 1
+2565 6347 1
+2565 6388 1
+2565 6414 1
+2565 6417 1
+2565 6422 1
+2565 6424 1
+2565 6442 1
+2565 6496 1
+2565 6503 1
+2565 6523 1
+2565 6555 1
+2565 6560 1
+2565 6596 1
+2565 6613 1
+2565 6618 1
+2565 6624 1
+2565 6634 1
+2565 6665 1
+2565 6712 1
+2565 6714 1
+2565 6720 1
+2565 6736 1
+2565 6737 1
+2565 6759 1
+2565 6765 1
+2565 6770 1
+2565 6774 1
+2565 6780 1
+2565 6783 1
+2565 6789 1
+2565 6790 1
+2565 6832 1
+2565 6833 1
+2565 6850 1
+2565 6855 1
+2565 6860 1
+2565 6869 1
+2565 6873 1
+2565 6875 1
+2565 6897 1
+2565 6901 1
+2565 6907 1
+2565 6913 1
+2565 6914 1
+2565 6918 1
+2565 6923 1
+2565 6930 1
+2565 6933 1
+2565 6934 1
+2565 6942 1
+2565 6945 1
+2565 6946 1
+2565 6948 1
+2565 6953 1
+2565 6955 1
+2565 6976 1
+2565 6979 1
+2565 6980 1
+2565 6982 1
+2565 6993 1
+2565 6994 1
+2565 7005 1
+2565 7012 1
+2565 7021 1
+2565 7047 1
+2565 7050 1
+2565 7052 1
+2565 7054 1
+2565 7059 1
+2565 7063 1
+2565 7073 1
+2565 7088 1
+2565 7092 1
+2565 7094 1
+2565 7101 1
+2565 7108 1
+2565 7110 1
+2565 7115 1
+2565 7116 1
+2565 7119 1
+2565 7120 1
+2565 7131 1
+2565 7143 1
+2565 7144 1
+2565 7186 1
+2565 7201 1
+2565 7214 1
+2565 7225 1
+2565 7233 1
+2565 7237 1
+2565 7238 1
+2565 7277 1
+2565 7279 1
+2565 7280 1
+2565 7295 1
+2565 7301 1
+2565 7319 1
+2565 7341 1
+2565 7351 1
+2565 7362 1
+2565 7373 1
+2565 7378 1
+2565 7381 1
+2565 7386 1
+2565 7389 1
+2565 7391 1
+2565 7400 1
+2565 7414 1
+2565 7422 1
+2565 7442 1
+2565 7443 1
+2565 7450 1
+2565 7478 1
+2565 7497 1
+2565 7510 1
+2565 7512 1
+2565 7517 1
+2565 7529 1
+2565 7544 1
+2565 7553 1
+2565 7561 1
+2565 7567 1
+2565 7574 1
+2565 7587 1
+2565 7588 1
+2565 7593 1
+2565 7618 1
+2565 7620 1
+2565 7624 1
+2565 7632 1
+2565 7634 1
+2565 7646 1
+2565 7649 1
+2565 7651 1
+2565 7658 1
+2565 7662 1
+2565 7666 1
+2565 7668 1
+2565 7673 1
+2565 7683 1
+2565 7694 1
+2565 7695 1
+2565 7699 1
+2565 7701 1
+2565 7707 1
+2565 7726 1
+2565 7757 1
+2565 7763 1
+2565 7778 1
+2565 7788 1
+2565 7791 1
+2565 7795 1
+2565 7799 1
+2565 7803 1
+2565 7809 1
+2565 7810 1
+2565 7813 1
+2565 7819 1
+2565 7833 1
+2565 7835 1
+2565 7839 1
+2565 7855 1
+2565 7857 1
+2565 7860 1
+2565 7862 1
+2565 7871 1
+2565 7879 1
+2565 7882 1
+2565 7890 1
+2565 7908 1
+2565 7910 1
+2565 7912 1
+2565 7921 1
+2565 7924 1
+2565 7927 1
+2565 7928 1
+2565 7946 1
+2565 7961 1
+2565 7965 1
+2565 7979 1
+2565 7992 1
+2565 7994 1
+2565 7996 1
+2565 8037 1
+2565 8042 1
+2565 8044 1
+2565 8051 1
+2565 8068 1
+2565 8073 1
+2565 8083 1
+2565 8121 1
+2565 8122 1
+2565 8124 1
+2565 8128 1
+2565 8130 1
+2565 8132 1
+2565 8134 1
+2565 8141 1
+2565 8148 1
+2565 8163 1
+2565 8168 1
+2565 8169 1
+2565 8174 1
+2565 8178 1
+2565 8192 1
+2565 8198 1
+2565 8209 1
+2565 8212 1
+2565 8219 1
+2565 8224 1
+2565 8237 1
+2565 8249 1
+2565 8292 1
+2565 8293 1
+2565 8294 1
+2570 1717 1
+2569 56 1
+2569 1049 1
+2569 1374 1
+2569 2294 1
+2569 2570 1
+2572 1935 1
+2572 2575 1
+2572 2579 1
+2572 2587 1
+2572 2607 1
+2572 2629 1
+2572 4051 1
+2573 2575 1
+2574 2575 1
+2574 2625 1
+2576 56 1
+2576 765 1
+2576 974 1
+2576 1159 1
+2576 1166 1
+2576 1211 1
+2576 1297 1
+2576 1315 1
+2576 1357 1
+2576 1416 1
+2576 1633 1
+2576 1679 1
+2576 1680 1
+2576 1688 1
+2576 1705 1
+2576 1781 1
+2576 1865 1
+2576 1919 1
+2576 2001 1
+2576 2053 1
+2576 2102 1
+2576 2144 1
+2576 2160 1
+2576 2174 1
+2576 2231 1
+2576 2251 1
+2576 2285 1
+2576 2324 1
+2576 2338 1
+2576 2354 1
+2576 2375 1
+2576 2381 1
+2576 2398 1
+2576 2411 1
+2576 2416 1
+2576 2470 1
+2576 2474 1
+2576 2507 1
+2576 2542 1
+2576 2579 1
+2576 2592 1
+2576 2594 1
+2576 2620 1
+2576 2625 1
+2576 2646 1
+2576 2651 1
+2576 2654 1
+2576 2660 1
+2576 2662 1
+2576 2674 1
+2576 2687 1
+2576 2689 1
+2576 2693 1
+2576 2697 1
+2576 2700 1
+2576 2713 1
+2576 2724 1
+2576 2760 1
+2576 2765 1
+2576 2768 1
+2576 2805 1
+2576 2809 1
+2576 2814 1
+2576 2822 1
+2576 2825 1
+2576 2828 1
+2576 2871 1
+2576 2877 1
+2576 2880 1
+2576 2912 1
+2576 2918 1
+2576 2926 1
+2576 2973 1
+2576 3005 1
+2576 3021 1
+2576 3033 1
+2576 3084 1
+2576 3089 1
+2576 3092 1
+2576 3099 1
+2576 3106 1
+2576 3117 1
+2576 3125 1
+2576 3148 1
+2576 3256 1
+2576 3265 1
+2576 3274 1
+2576 3307 1
+2576 3408 1
+2576 3443 1
+2576 3473 1
+2576 3489 1
+2576 3516 1
+2576 3643 1
+2576 3670 1
+2576 3769 1
+2576 3813 1
+2576 3956 1
+2576 3958 1
+2576 3962 1
+2576 4037 1
+2576 4065 1
+2576 4071 1
+2576 4072 1
+2576 4298 1
+2576 4536 1
+2576 4613 1
+2576 4797 1
+2576 4981 1
+2576 5148 1
+2576 5210 1
+2576 5245 1
+2576 5254 1
+2576 5301 1
+2576 5305 1
+2576 5459 1
+2576 5605 1
+2576 5713 1
+2576 5721 1
+2576 5732 1
+2576 5739 1
+2576 5802 1
+2576 5814 1
+2576 5819 1
+2576 6029 1
+2576 6044 1
+2576 6174 1
+2576 6320 1
+2576 6437 1
+2576 6523 1
+2576 6552 1
+2576 6918 1
+2576 6980 1
+2576 7052 1
+2576 7120 1
+2576 7443 1
+2576 7620 1
+2576 7699 1
+2576 7757 1
+2576 7763 1
+2576 7809 1
+2576 7871 1
+2576 7882 1
+2576 7910 1
+2576 8293 1
+2576 8295 1
+2577 2579 1
+2577 2580 1
+2578 765 1
+2578 1646 1
+2578 1653 1
+2578 1717 1
+2578 2117 1
+2578 2323 1
+2578 2410 1
+2578 2579 1
+2578 2587 1
+2578 2617 1
+2578 2625 1
+2578 3130 1
+2587 72 1
+2587 2576 1
+2587 2617 1
+2587 2625 1
+2587 2775 1
+2587 3568 1
+2587 4349 1
+2587 4661 1
+2587 5226 1
+2587 5459 1
+2587 5524 1
+2587 5684 1
+2581 2587 1
+2582 2587 1
+2583 2587 1
+2583 2625 1
+2584 2587 1
+2585 15 1
+2585 762 1
+2585 1549 1
+2585 2066 1
+2585 2120 1
+2585 2160 1
+2585 2210 1
+2585 2252 1
+2585 2328 1
+2585 2338 1
+2585 2398 1
+2585 2535 1
+2585 2544 1
+2585 2587 1
+2585 2594 1
+2585 2625 1
+2585 2651 1
+2585 2653 1
+2585 2746 1
+2585 2790 1
+2585 2958 1
+2585 3005 1
+2585 3024 1
+2585 3028 1
+2585 3030 1
+2585 3089 1
+2585 3117 1
+2585 3192 1
+2585 3260 1
+2585 3276 1
+2585 3351 1
+2585 3394 1
+2585 3439 1
+2585 3454 1
+2585 3537 1
+2585 3562 1
+2585 3580 1
+2585 3615 1
+2585 3645 1
+2585 3842 1
+2585 3873 1
+2585 3892 1
+2585 3976 1
+2585 4013 1
+2585 4021 1
+2585 4037 1
+2585 4191 1
+2585 4448 1
+2585 4528 1
+2585 4574 1
+2585 4735 1
+2585 5121 1
+2585 5273 1
+2585 5288 1
+2585 5412 1
+2585 5891 1
+2585 6124 1
+2585 7168 1
+2585 8293 1
+2585 8294 1
+2586 2587 1
+2586 2643 1
+2592 1799 1
+2592 2117 1
+2592 2237 1
+2592 2375 1
+2592 2416 1
+2592 2928 1
+2592 4098 1
+2592 4191 1
+2592 4587 1
+2592 4625 1
+2592 4846 1
+2592 5123 1
+2592 5484 1
+2593 56 1
+2593 350 1
+2593 765 1
+2593 1049 1
+2593 1374 1
+2593 1521 1
+2593 1734 1
+2593 1754 1
+2593 1847 1
+2593 2102 1
+2593 2117 1
+2593 2294 1
+2593 2322 1
+2593 2328 1
+2593 2411 1
+2593 2625 1
+2593 2654 1
+2593 2693 1
+2593 2727 1
+2593 2751 1
+2593 2801 1
+2593 2805 1
+2593 2809 1
+2593 2844 1
+2593 2902 1
+2593 2958 1
+2593 2990 1
+2593 3026 1
+2593 3082 1
+2593 3117 1
+2593 3650 1
+2593 8292 1
+2594 15 1
+2594 417 1
+2594 465 1
+2594 737 1
+2594 856 1
+2594 974 1
+2594 1166 1
+2594 1297 1
+2594 1847 1
+2594 2001 1
+2594 2066 1
+2594 2117 1
+2594 2120 1
+2594 2174 1
+2594 2256 1
+2594 2264 1
+2594 2322 1
+2594 2398 1
+2594 2410 1
+2594 2501 1
+2594 2544 1
+2594 2576 1
+2594 2585 1
+2594 2619 1
+2594 2625 1
+2594 2665 1
+2594 2700 1
+2594 2746 1
+2594 2751 1
+2594 2797 1
+2594 2831 1
+2594 2958 1
+2594 3005 1
+2594 3030 1
+2594 3082 1
+2594 3089 1
+2594 3104 1
+2594 3130 1
+2594 3321 1
+2594 3439 1
+2594 3562 1
+2594 3580 1
+2594 4021 1
+2594 4124 1
+2594 5412 1
+2595 15 1
+2595 608 1
+2595 1297 1
+2595 1357 1
+2595 1548 1
+2595 1808 1
+2595 2117 1
+2595 2134 1
+2595 2174 1
+2595 2237 1
+2595 2264 1
+2595 2276 1
+2595 2328 1
+2595 2354 1
+2595 2398 1
+2595 2516 1
+2595 2560 1
+2595 2585 1
+2595 2625 1
+2595 2657 1
+2595 2665 1
+2595 2746 1
+2595 2794 1
+2595 3034 1
+2595 3089 1
+2595 3117 1
+2595 3258 1
+2595 3352 1
+2595 3443 1
+2595 3456 1
+2595 3537 1
+2595 3586 1
+2595 3615 1
+2595 3650 1
+2595 4030 1
+2595 4049 1
+2595 4162 1
+2595 4179 1
+2595 4276 1
+2595 4338 1
+2595 4875 1
+2595 5178 1
+2595 5254 1
+2595 5484 1
+2595 5760 1
+2595 6006 1
+2595 6437 1
+2595 7362 1
+2595 7478 1
+2596 765 1
+2596 1646 1
+2596 2117 1
+2596 2593 1
+2596 2625 1
+2596 2643 1
+2596 2790 1
+2596 2805 1
+2596 3073 1
+2596 3276 1
+2596 3284 1
+2596 4536 1
+2596 4735 1
+2597 2117 1
+2597 3145 1
+2598 1847 1
+2598 1992 1
+2598 2117 1
+2598 2251 1
+2598 2593 1
+2598 2625 1
+2598 2643 1
+2474 56 1
+2474 204 1
+2474 290 1
+2474 403 1
+2474 417 1
+2474 425 1
+2474 633 1
+2474 737 1
+2474 762 1
+2474 765 1
+2474 1049 1
+2474 1267 1
+2474 1291 1
+2474 1307 1
+2474 1357 1
+2474 1374 1
+2474 1384 1
+2474 1393 1
+2474 1416 1
+2474 1419 1
+2474 1549 1
+2474 1592 1
+2474 1646 1
+2474 1705 1
+2474 1723 1
+2474 1734 1
+2474 1754 1
+2474 1781 1
+2474 1792 1
+2474 1808 1
+2474 1814 1
+2474 1847 1
+2474 1919 1
+2474 1992 1
+2474 2066 1
+2474 2116 1
+2474 2117 1
+2474 2120 1
+2474 2135 1
+2474 2145 1
+2474 2174 1
+2474 2210 1
+2474 2225 1
+2474 2229 1
+2474 2231 1
+2474 2240 1
+2474 2251 1
+2474 2256 1
+2474 2264 1
+2474 2294 1
+2474 2297 1
+2474 2322 1
+2474 2328 1
+2474 2340 1
+2474 2371 1
+2474 2375 1
+2474 2398 1
+2474 2410 1
+2474 2501 1
+2474 2506 1
+2474 2547 1
+2474 2550 1
+2474 2576 1
+2474 2593 1
+2474 2594 1
+2474 2599 1
+2474 2617 1
+2474 2618 1
+2474 2619 1
+2474 2625 1
+2474 2638 1
+2474 2646 1
+2474 2650 1
+2474 2651 1
+2474 2654 1
+2474 2662 1
+2474 2665 1
+2474 2669 1
+2474 2670 1
+2474 2685 1
+2474 2697 1
+2474 2707 1
+2474 2721 1
+2474 2736 1
+2474 2763 1
+2474 2774 1
+2474 2794 1
+2474 2805 1
+2474 2809 1
+2474 2811 1
+2474 2814 1
+2474 2815 1
+2474 2825 1
+2474 2828 1
+2474 2830 1
+2474 2834 1
+2474 2856 1
+2474 2877 1
+2474 2902 1
+2474 2912 1
+2474 2922 1
+2474 2928 1
+2474 2951 1
+2474 2955 1
+2474 2963 1
+2474 2968 1
+2474 2993 1
+2474 3007 1
+2474 3024 1
+2474 3029 1
+2474 3033 1
+2474 3034 1
+2474 3068 1
+2474 3117 1
+2474 3251 1
+2474 3253 1
+2474 3258 1
+2474 3265 1
+2474 3443 1
+2474 3562 1
+2474 3631 1
+2474 3755 1
+2474 3898 1
+2474 4013 1
+2474 4021 1
+2474 4051 1
+2474 4055 1
+2474 4058 1
+2474 4078 1
+2474 4124 1
+2474 4191 1
+2474 4261 1
+2474 4266 1
+2474 4510 1
+2474 4735 1
+2474 5055 1
+2474 5200 1
+2474 5311 1
+2474 5539 1
+2474 6347 1
+2474 7168 1
+2474 8294 1
+2599 417 1
+2599 762 1
+2599 2117 1
+2599 2665 1
+2599 3009 1
+2599 4400 1
+2599 5412 1
+2599 6251 1
+2599 7632 1
+2603 2604 1
+2605 403 1
+2605 1166 1
+2605 1297 1
+2605 1688 1
+2605 1808 1
+2605 1992 1
+2605 2001 1
+2605 2120 1
+2605 2144 1
+2605 2174 1
+2605 2251 1
+2605 2323 1
+2605 2381 1
+2605 2516 1
+2605 2542 1
+2605 2547 1
+2605 2576 1
+2605 2594 1
+2605 2620 1
+2605 2625 1
+2605 2707 1
+2605 2871 1
+2605 2922 1
+2605 2963 1
+2605 2996 1
+2605 3029 1
+2605 3033 1
+2605 3104 1
+2605 3251 1
+2605 3376 1
+2605 3417 1
+2605 3489 1
+2605 3568 1
+2605 3643 1
+2605 3660 1
+2605 3807 1
+2605 3812 1
+2605 3856 1
+2605 4191 1
+2605 4335 1
+2605 4483 1
+2605 4653 1
+2605 4986 1
+2605 5106 1
+2605 5188 1
+2605 5189 1
+2605 5226 1
+2605 5301 1
+2605 5321 1
+2605 5404 1
+2605 5449 1
+2605 5459 1
+2605 5624 1
+2605 5637 1
+2605 5650 1
+2605 5651 1
+2605 5693 1
+2605 5713 1
+2605 5721 1
+2605 6006 1
+2605 6080 1
+2605 6501 1
+2605 6552 1
+2605 6600 1
+2606 2625 1
+2607 2625 1
+2608 765 1
+2608 1419 1
+2608 1723 1
+2608 2174 1
+2608 2264 1
+2608 2322 1
+2608 2366 1
+2608 2410 1
+2608 2470 1
+2608 2560 1
+2608 2625 1
+2608 2814 1
+2608 2828 1
+2608 2979 1
+2609 2620 1
+2609 2625 1
+2609 2720 1
+2609 2805 1
+2609 3002 1
+2609 4482 1
+2609 4712 1
+2610 2625 1
+2611 2323 1
+2611 2535 1
+2611 2617 1
+2611 2625 1
+2611 3130 1
+2611 4037 1
+2611 4261 1
+2612 737 1
+2612 765 1
+2612 1291 1
+2612 1297 1
+2612 1548 1
+2612 2323 1
+2612 2375 1
+2612 2398 1
+2612 2516 1
+2612 2565 1
+2612 2593 1
+2612 2594 1
+2612 2625 1
+2612 2877 1
+2612 2900 1
+2612 2912 1
+2612 2922 1
+2612 3408 1
+2612 3439 1
+2612 3454 1
+2612 3458 1
+2612 3555 1
+2612 3587 1
+2612 3813 1
+2612 3897 1
+2612 3958 1
+2612 4290 1
+2612 5387 1
+2612 8293 1
+2613 737 1
+2613 762 1
+2613 1777 1
+2613 2114 1
+2613 2237 1
+2613 2535 1
+2613 2625 1
+2613 2674 1
+2613 2686 1
+2613 2727 1
+2613 2790 1
+2613 2811 1
+2613 2900 1
+2613 3059 1
+2613 3480 1
+2613 3541 1
+2613 3803 1
+2613 3807 1
+2613 3976 1
+2613 4191 1
+2613 4201 1
+2613 4808 1
+2613 4828 1
+2613 5484 1
+2613 6098 1
+2614 2625 1
+2614 3130 1
+2614 3680 1
+2614 3847 1
+2614 3849 1
+2615 2625 1
+2615 3130 1
+2616 2625 1
+2617 15 1
+2617 765 1
+2617 1646 1
+2617 1653 1
+2617 1918 1
+2617 2102 1
+2617 2231 1
+2617 2323 1
+2617 2410 1
+2617 2535 1
+2617 2625 1
+2617 2667 1
+2617 2697 1
+2617 2775 1
+2617 2794 1
+2617 2814 1
+2617 3029 1
+2617 3117 1
+2617 3130 1
+2617 3580 1
+2617 4037 1
+2617 4980 1
+2618 762 1
+2618 856 1
+2618 974 1
+2618 1166 1
+2618 1267 1
+2618 1549 1
+2618 1734 1
+2618 1814 1
+2618 1847 1
+2618 1992 1
+2618 2066 1
+2618 2120 1
+2618 2174 1
+2618 2209 1
+2618 2231 1
+2618 2240 1
+2618 2252 1
+2618 2256 1
+2618 2375 1
+2618 2410 1
+2618 2510 1
+2618 2585 1
+2618 2594 1
+2618 2625 1
+2618 2646 1
+2618 2651 1
+2618 2653 1
+2618 2657 1
+2618 2660 1
+2618 2665 1
+2618 2669 1
+2618 2713 1
+2618 2746 1
+2618 2747 1
+2618 2751 1
+2618 2790 1
+2618 2958 1
+2618 2973 1
+2618 3030 1
+2618 3130 1
+2618 3148 1
+2618 3164 1
+2618 3260 1
+2618 3307 1
+2618 3473 1
+2618 3562 1
+2618 3755 1
+2618 3974 1
+2618 4014 1
+2618 4191 1
+2618 4796 1
+2618 8293 1
+2618 8294 1
+2623 15 1
+2623 204 1
+2623 350 1
+2623 403 1
+2623 406 1
+2623 737 1
+2623 741 1
+2623 1297 1
+2623 1453 1
+2623 1571 1
+2623 1633 1
+2623 1919 1
+2623 2209 1
+2623 2257 1
+2623 2324 1
+2623 2375 1
+2623 2398 1
+2623 2416 1
+2623 2501 1
+2623 2535 1
+2623 2565 1
+2623 2585 1
+2623 2597 1
+2623 2620 1
+2623 2625 1
+2623 2652 1
+2623 2653 1
+2623 2667 1
+2623 2746 1
+2623 2799 1
+2623 2838 1
+2623 2900 1
+2623 2918 1
+2623 2926 1
+2623 2996 1
+2623 3024 1
+2623 3253 1
+2623 3255 1
+2623 3258 1
+2623 3284 1
+2623 3320 1
+2623 3324 1
+2623 3516 1
+2623 3547 1
+2623 3549 1
+2623 3586 1
+2623 3615 1
+2623 3772 1
+2623 3856 1
+2623 3867 1
+2623 3892 1
+2623 3914 1
+2623 3921 1
+2623 3933 1
+2623 4011 1
+2623 4012 1
+2623 4037 1
+2623 4098 1
+2623 4124 1
+2623 4138 1
+2623 4254 1
+2623 4298 1
+2623 4315 1
+2623 4338 1
+2623 4385 1
+2623 4527 1
+2623 4529 1
+2623 4666 1
+2623 4687 1
+2623 4777 1
+2623 4875 1
+2623 5002 1
+2623 5083 1
+2623 5121 1
+2623 5176 1
+2623 5210 1
+2623 5233 1
+2623 5240 1
+2623 5254 1
+2623 5412 1
+2623 5415 1
+2623 5457 1
+2623 5484 1
+2623 5524 1
+2623 5533 1
+2623 5559 1
+2623 5568 1
+2623 5605 1
+2623 5630 1
+2623 5705 1
+2623 5772 1
+2623 5817 1
+2623 5936 1
+2623 5956 1
+2623 5972 1
+2623 6094 1
+2623 6109 1
+2623 6124 1
+2623 6130 1
+2623 6261 1
+2623 6279 1
+2623 6306 1
+2623 6311 1
+2623 6447 1
+2623 6523 1
+2623 6555 1
+2623 6994 1
+2623 8293 1
+2619 15 1
+2619 825 1
+2619 1357 1
+2619 1416 1
+2619 1549 1
+2619 1754 1
+2619 1781 1
+2619 1808 1
+2619 1847 1
+2619 1982 1
+2619 2328 1
+2619 2371 1
+2619 2474 1
+2619 2485 1
+2619 2535 1
+2619 2547 1
+2619 2560 1
+2619 2585 1
+2619 2625 1
+2619 2657 1
+2619 2665 1
+2619 2697 1
+2619 2963 1
+2619 2972 1
+2619 3028 1
+2619 3084 1
+2619 3103 1
+2619 3164 1
+2619 3671 1
+2619 3752 1
+2619 3800 1
+2619 3962 1
+2619 4712 1
+2619 5079 1
+2619 5563 1
+2619 6784 1
+2619 6790 1
+2619 6914 1
+2619 6955 1
+2619 6980 1
+2619 7021 1
+2619 7040 1
+2619 7092 1
+2619 7277 1
+2619 7381 1
+2619 7809 1
+2620 1564 1
+2620 2120 1
+2620 2294 1
+2620 2550 1
+2620 2576 1
+2620 2594 1
+2620 2618 1
+2620 2625 1
+2620 2665 1
+2620 3193 1
+2620 3919 1
+2620 5254 1
+2620 5800 1
+2620 5829 1
+2620 5871 1
+2620 6305 1
+2620 6388 1
+2620 6555 1
+2620 6560 1
+2620 6765 1
+2620 6833 1
+2620 6850 1
+2620 6901 1
+2620 7040 1
+2627 1717 1
+2626 1374 1
+2626 1717 1
+2626 2763 1
+2630 2593 1
+2630 2968 1
+2631 2593 1
+2632 2593 1
+2633 2643 1
+1863 2643 1
+2634 2643 1
+2635 2643 1
+2636 2643 1
+2637 2643 1
+2639 2643 1
+2640 2643 1
+2638 2643 1
+2641 2643 1
+2642 2643 1
+2645 3192 1
+2645 3394 1
+2645 3439 1
+2645 4191 1
+2645 4218 1
+2645 4289 1
+2645 4351 1
+2644 2645 1
+2628 1847 1
+2646 425 1
+2646 765 1
+2646 1049 1
+2646 1291 1
+2646 1437 1
+2646 1596 1
+2646 1734 1
+2646 1808 1
+2646 1823 1
+2646 1847 1
+2646 2120 1
+2646 2256 1
+2646 2366 1
+2646 2547 1
+2646 2560 1
+2646 2593 1
+2646 2617 1
+2646 2620 1
+2646 2625 1
+2646 2665 1
+2646 2720 1
+2646 2721 1
+2646 2830 1
+2646 2877 1
+2646 2963 1
+2646 2968 1
+2646 2972 1
+2646 2979 1
+2646 2993 1
+2646 3029 1
+2646 3056 1
+2646 3099 1
+2646 3144 1
+2646 3307 1
+2646 3473 1
+2646 3645 1
+2646 4422 1
+2646 6599 1
+2646 8293 1
+2647 56 1
+2647 214 1
+2647 1291 1
+2647 1521 1
+2647 1564 1
+2647 1646 1
+2647 1847 1
+2647 1992 1
+2647 2053 1
+2647 2174 1
+2647 2264 1
+2647 2416 1
+2647 2470 1
+2647 2501 1
+2647 2797 1
+2647 2814 1
+2647 2902 1
+2647 3755 1
+2648 2365 1
+2649 2650 1
+2651 15 1
+2651 204 1
+2651 285 1
+2651 290 1
+2651 403 1
+2651 417 1
+2651 465 1
+2651 608 1
+2651 737 1
+2651 762 1
+2651 825 1
+2651 856 1
+2651 974 1
+2651 1140 1
+2651 1166 1
+2651 1185 1
+2651 1297 1
+2651 1305 1
+2651 1360 1
+2651 1385 1
+2651 1416 1
+2651 1437 1
+2651 1453 1
+2651 1549 1
+2651 1571 1
+2651 1688 1
+2651 1706 1
+2651 1729 1
+2651 1744 1
+2651 1754 1
+2651 1769 1
+2651 1777 1
+2651 1918 1
+2651 1935 1
+2651 1990 1
+2651 2001 1
+2651 2016 1
+2651 2066 1
+2651 2144 1
+2651 2145 1
+2651 2174 1
+2651 2209 1
+2651 2225 1
+2651 2231 1
+2651 2240 1
+2651 2252 1
+2651 2256 1
+2651 2257 1
+2651 2289 1
+2651 2290 1
+2651 2322 1
+2651 2324 1
+2651 2328 1
+2651 2338 1
+2651 2375 1
+2651 2384 1
+2651 2398 1
+2651 2411 1
+2651 2416 1
+2651 2499 1
+2651 2506 1
+2651 2510 1
+2651 2517 1
+2651 2535 1
+2651 2542 1
+2651 2544 1
+2651 2565 1
+2651 2576 1
+2651 2585 1
+2651 2594 1
+2651 2597 1
+2651 2612 1
+2651 2619 1
+2651 2623 1
+2651 2625 1
+2651 2652 1
+2651 2653 1
+2651 2657 1
+2651 2660 1
+2651 2662 1
+2651 2665 1
+2651 2667 1
+2651 2686 1
+2651 2693 1
+2651 2707 1
+2651 2713 1
+2651 2727 1
+2651 2746 1
+2651 2747 1
+2651 2760 1
+2651 2811 1
+2651 2814 1
+2651 2819 1
+2651 2838 1
+2651 2871 1
+2651 2900 1
+2651 2918 1
+2651 2958 1
+2651 2973 1
+2651 2981 1
+2651 3005 1
+2651 3007 1
+2651 3009 1
+2651 3010 1
+2651 3020 1
+2651 3021 1
+2651 3024 1
+2651 3026 1
+2651 3028 1
+2651 3029 1
+2651 3030 1
+2651 3059 1
+2651 3084 1
+2651 3114 1
+2651 3117 1
+2651 3125 1
+2651 3130 1
+2651 3140 1
+2651 3144 1
+2651 3148 1
+2651 3180 1
+2651 3200 1
+2651 3235 1
+2651 3251 1
+2651 3253 1
+2651 3258 1
+2651 3260 1
+2651 3276 1
+2651 3284 1
+2651 3301 1
+2651 3309 1
+2651 3321 1
+2651 3334 1
+2651 3346 1
+2651 3351 1
+2651 3352 1
+2651 3394 1
+2651 3404 1
+2651 3408 1
+2651 3409 1
+2651 3410 1
+2651 3433 1
+2651 3435 1
+2651 3439 1
+2651 3446 1
+2651 3453 1
+2651 3454 1
+2651 3473 1
+2651 3483 1
+2651 3486 1
+2651 3489 1
+2651 3506 1
+2651 3516 1
+2651 3541 1
+2651 3547 1
+2651 3548 1
+2651 3562 1
+2651 3567 1
+2651 3576 1
+2651 3580 1
+2651 3607 1
+2651 3609 1
+2651 3615 1
+2651 3629 1
+2651 3631 1
+2651 3635 1
+2651 3645 1
+2651 3650 1
+2651 3661 1
+2651 3680 1
+2651 3681 1
+2651 3691 1
+2651 3769 1
+2651 3772 1
+2651 3785 1
+2651 3787 1
+2651 3800 1
+2651 3803 1
+2651 3807 1
+2651 3809 1
+2651 3811 1
+2651 3822 1
+2651 3825 1
+2651 3847 1
+2651 3849 1
+2651 3854 1
+2651 3856 1
+2651 3867 1
+2651 3871 1
+2651 3887 1
+2651 3898 1
+2651 3903 1
+2651 3910 1
+2651 3911 1
+2651 3914 1
+2651 3926 1
+2651 3933 1
+2651 3956 1
+2651 3958 1
+2651 3967 1
+2651 4013 1
+2651 4030 1
+2651 4037 1
+2651 4043 1
+2651 4047 1
+2651 4051 1
+2651 4055 1
+2651 4072 1
+2651 4103 1
+2651 4110 1
+2651 4111 1
+2651 4162 1
+2651 4179 1
+2651 4181 1
+2651 4191 1
+2651 4201 1
+2651 4211 1
+2651 4231 1
+2651 4247 1
+2651 4254 1
+2651 4256 1
+2651 4261 1
+2651 4263 1
+2651 4266 1
+2651 4269 1
+2651 4290 1
+2651 4299 1
+2651 4365 1
+2651 4400 1
+2651 4422 1
+2651 4424 1
+2651 4448 1
+2651 4453 1
+2651 4463 1
+2651 4485 1
+2651 4530 1
+2651 4536 1
+2651 4547 1
+2651 4551 1
+2651 4578 1
+2651 4620 1
+2651 4646 1
+2651 4648 1
+2651 4662 1
+2651 4735 1
+2651 4778 1
+2651 4780 1
+2651 4792 1
+2651 4797 1
+2651 4827 1
+2651 4899 1
+2651 4938 1
+2651 4962 1
+2651 4993 1
+2651 4999 1
+2651 5079 1
+2651 5092 1
+2651 5100 1
+2651 5130 1
+2651 5412 1
+2651 5445 1
+2651 5775 1
+2651 5780 1
+2651 5819 1
+2651 5844 1
+2651 5848 1
+2651 7632 1
+2651 8293 1
+2651 8294 1
+2653 204 1
+2653 417 1
+2653 608 1
+2653 737 1
+2653 778 1
+2653 825 1
+2653 1166 1
+2653 1267 1
+2653 1297 1
+2653 1307 1
+2653 1453 1
+2653 1549 1
+2653 1688 1
+2653 1734 1
+2653 1915 1
+2653 2016 1
+2653 2066 1
+2653 2144 1
+2653 2206 1
+2653 2209 1
+2653 2237 1
+2653 2252 1
+2653 2257 1
+2653 2328 1
+2653 2354 1
+2653 2371 1
+2653 2398 1
+2653 2411 1
+2653 2485 1
+2653 2535 1
+2653 2544 1
+2653 2565 1
+2653 2576 1
+2653 2585 1
+2653 2594 1
+2653 2619 1
+2653 2625 1
+2653 2652 1
+2653 2654 1
+2653 2657 1
+2653 2660 1
+2653 2674 1
+2653 2686 1
+2653 2693 1
+2653 2696 1
+2653 2727 1
+2653 2747 1
+2653 2871 1
+2653 2909 1
+2653 2918 1
+2653 2958 1
+2653 3005 1
+2653 3007 1
+2653 3009 1
+2653 3024 1
+2653 3026 1
+2653 3028 1
+2653 3059 1
+2653 3084 1
+2653 3114 1
+2653 3117 1
+2653 3125 1
+2653 3173 1
+2653 3192 1
+2653 3260 1
+2653 3276 1
+2653 3301 1
+2653 3404 1
+2653 3435 1
+2653 3439 1
+2653 3443 1
+2653 3454 1
+2653 3456 1
+2653 3461 1
+2653 3480 1
+2653 3483 1
+2653 3516 1
+2653 3529 1
+2653 3537 1
+2653 3548 1
+2653 3568 1
+2653 3580 1
+2653 3587 1
+2653 3609 1
+2653 3615 1
+2653 3634 1
+2653 3645 1
+2653 3650 1
+2653 3680 1
+2653 3748 1
+2653 3772 1
+2653 3800 1
+2653 3807 1
+2653 3813 1
+2653 3854 1
+2653 3875 1
+2653 3903 1
+2653 3939 1
+2653 3970 1
+2653 4043 1
+2653 4124 1
+2653 4162 1
+2653 4179 1
+2653 4183 1
+2653 4191 1
+2653 4256 1
+2653 4299 1
+2653 4510 1
+2653 4578 1
+2653 4827 1
+2653 5026 1
+2653 5817 1
+2653 8294 1
+2655 15 1
+2655 72 1
+2655 762 1
+2655 896 1
+2655 1159 1
+2655 1211 1
+2655 1307 1
+2655 1315 1
+2655 1792 1
+2655 2210 1
+2655 2326 1
+2655 2371 1
+2655 2560 1
+2655 2652 1
+2655 2660 1
+2655 2775 1
+2655 2981 1
+2655 3023 1
+2655 3089 1
+2655 3321 1
+2655 3334 1
+2655 3352 1
+2655 3443 1
+2655 3452 1
+2655 3835 1
+2655 4037 1
+2655 4040 1
+2655 4201 1
+2655 4687 1
+2655 4712 1
+2655 4735 1
+2655 4795 1
+2655 4827 1
+2655 5079 1
+2655 5233 1
+2655 5412 1
+2655 5423 1
+2655 5449 1
+2655 5624 1
+2655 5684 1
+2655 6006 1
+2655 6337 1
+2655 6422 1
+2655 6441 1
+2655 6498 1
+2655 6543 1
+2655 6715 1
+2655 7063 1
+2655 8293 1
+2656 2652 1
+2657 15 1
+2657 204 1
+2657 974 1
+2657 1297 1
+2657 1352 1
+2657 1935 1
+2657 2252 1
+2657 2257 1
+2657 2297 1
+2657 2324 1
+2657 2411 1
+2657 2485 1
+2657 2576 1
+2657 2625 1
+2657 2652 1
+2657 2654 1
+2657 2693 1
+2657 2727 1
+2657 2747 1
+2657 2790 1
+2657 3005 1
+2657 3018 1
+2657 3084 1
+2657 3130 1
+2657 3173 1
+2657 3180 1
+2657 3260 1
+2657 3276 1
+2657 3404 1
+2657 3516 1
+2657 3562 1
+2657 3567 1
+2657 3568 1
+2657 3580 1
+2657 3645 1
+2657 3811 1
+2657 3914 1
+2657 4298 1
+2657 4299 1
+2657 4500 1
+2657 4717 1
+2657 4953 1
+2657 5254 1
+2657 5273 1
+2658 72 1
+2658 155 1
+2658 204 1
+2658 346 1
+2658 417 1
+2658 762 1
+2658 967 1
+2658 1024 1
+2658 1100 1
+2658 1157 1
+2658 1166 1
+2658 1185 1
+2658 1305 1
+2658 1385 1
+2658 1498 1
+2658 1680 1
+2658 1688 1
+2658 1729 1
+2658 1744 1
+2658 1769 1
+2658 1777 1
+2658 1915 1
+2658 1982 1
+2658 1990 1
+2658 2014 1
+2658 2114 1
+2658 2129 1
+2658 2144 1
+2658 2209 1
+2658 2240 1
+2658 2252 1
+2658 2257 1
+2658 2290 1
+2658 2297 1
+2658 2324 1
+2658 2326 1
+2658 2364 1
+2658 2411 1
+2658 2433 1
+2658 2485 1
+2658 2516 1
+2658 2517 1
+2658 2565 1
+2658 2592 1
+2658 2652 1
+2658 2653 1
+2658 2654 1
+2658 2657 1
+2658 2674 1
+2658 2686 1
+2658 2687 1
+2658 2689 1
+2658 2693 1
+2658 2696 1
+2658 2727 1
+2658 2747 1
+2658 2760 1
+2658 2799 1
+2658 2900 1
+2658 2923 1
+2658 2940 1
+2658 2973 1
+2658 3000 1
+2658 3002 1
+2658 3005 1
+2658 3010 1
+2658 3014 1
+2658 3092 1
+2658 3106 1
+2658 3114 1
+2658 3173 1
+2658 3200 1
+2658 3276 1
+2658 3297 1
+2658 3309 1
+2658 3334 1
+2658 3346 1
+2658 3352 1
+2658 3394 1
+2658 3443 1
+2658 3452 1
+2658 3453 1
+2658 3454 1
+2658 3459 1
+2658 3464 1
+2658 3537 1
+2658 3541 1
+2658 3557 1
+2658 3580 1
+2658 3587 1
+2658 3609 1
+2658 3643 1
+2658 3646 1
+2658 3660 1
+2658 3661 1
+2658 3664 1
+2658 3681 1
+2658 3691 1
+2658 3713 1
+2658 3724 1
+2658 3745 1
+2658 3752 1
+2658 3769 1
+2658 3772 1
+2658 3806 1
+2658 3807 1
+2658 3812 1
+2658 3847 1
+2658 3849 1
+2658 3885 1
+2658 3956 1
+2658 3958 1
+2658 3962 1
+2658 3969 1
+2658 3976 1
+2658 4011 1
+2658 4021 1
+2658 4037 1
+2658 4044 1
+2658 4047 1
+2658 4071 1
+2658 4072 1
+2658 4124 1
+2658 4127 1
+2658 4138 1
+2658 4191 1
+2658 4289 1
+2658 4297 1
+2658 4311 1
+2658 4315 1
+2658 4331 1
+2658 4335 1
+2658 4373 1
+2658 4386 1
+2658 4401 1
+2658 4402 1
+2658 4417 1
+2658 4424 1
+2658 4435 1
+2658 4453 1
+2658 4463 1
+2658 4471 1
+2658 4480 1
+2658 4482 1
+2658 4510 1
+2658 4529 1
+2658 4531 1
+2658 4588 1
+2658 4620 1
+2658 4632 1
+2658 4645 1
+2658 4650 1
+2658 4654 1
+2658 4713 1
+2658 4717 1
+2658 4735 1
+2658 4811 1
+2658 4820 1
+2658 4824 1
+2658 4828 1
+2658 4875 1
+2658 4879 1
+2658 4942 1
+2658 4962 1
+2658 4964 1
+2658 4981 1
+2658 4983 1
+2658 5020 1
+2658 5022 1
+2658 5026 1
+2658 5028 1
+2658 5044 1
+2658 5045 1
+2658 5058 1
+2658 5083 1
+2658 5092 1
+2658 5096 1
+2658 5106 1
+2658 5130 1
+2658 5132 1
+2658 5144 1
+2658 5162 1
+2658 5179 1
+2658 5204 1
+2658 5208 1
+2658 5210 1
+2658 5215 1
+2658 5222 1
+2658 5233 1
+2658 5239 1
+2658 5245 1
+2658 5246 1
+2658 5260 1
+2658 5288 1
+2658 5289 1
+2658 5378 1
+2658 5406 1
+2658 5466 1
+2658 5500 1
+2658 5529 1
+2658 5800 1
+2658 5806 1
+2658 5811 1
+2658 5812 1
+2658 5817 1
+2658 5835 1
+2658 5872 1
+2658 5887 1
+2658 5897 1
+2658 5933 1
+2658 6000 1
+2658 6032 1
+2658 6043 1
+2658 6044 1
+2658 6151 1
+2658 6174 1
+2658 6243 1
+2658 6414 1
+2658 6417 1
+2658 6422 1
+2658 6442 1
+2658 6523 1
+2658 6555 1
+2658 6596 1
+2658 6634 1
+2658 6665 1
+2658 6737 1
+2658 6907 1
+2658 6946 1
+2658 6976 1
+2658 6979 1
+2658 7005 1
+2658 7012 1
+2658 7021 1
+2658 7054 1
+2658 7063 1
+2658 7088 1
+2658 7092 1
+2658 7116 1
+2658 7131 1
+2658 7233 1
+2658 7237 1
+2658 7279 1
+2658 7341 1
+2658 7351 1
+2658 7373 1
+2658 7378 1
+2658 7381 1
+2658 7391 1
+2658 7400 1
+2658 7414 1
+2658 7422 1
+2658 7436 1
+2658 7442 1
+2658 7450 1
+2658 7478 1
+2658 7497 1
+2658 7510 1
+2658 7512 1
+2658 7529 1
+2658 7553 1
+2658 7561 1
+2658 7587 1
+2658 7620 1
+2658 7624 1
+2658 7647 1
+2658 7648 1
+2658 7651 1
+2658 7652 1
+2658 7683 1
+2658 7694 1
+2658 7695 1
+2658 7699 1
+2658 7707 1
+2658 7726 1
+2658 7778 1
+2658 7810 1
+2658 7813 1
+2658 7835 1
+2658 7855 1
+2658 7860 1
+2658 7862 1
+2658 7871 1
+2658 7879 1
+2658 7882 1
+2658 7890 1
+2658 7899 1
+2658 7910 1
+2658 7912 1
+2658 7927 1
+2658 7946 1
+2658 7961 1
+2658 7965 1
+2658 7979 1
+2658 8024 1
+2658 8037 1
+2658 8042 1
+2658 8044 1
+2658 8134 1
+2658 8163 1
+2658 8168 1
+2658 8169 1
+2658 8178 1
+2658 8209 1
+2658 8212 1
+2658 8219 1
+2658 8237 1
+2659 417 1
+2659 1744 1
+2659 1990 1
+2659 2066 1
+2659 2652 1
+2659 2655 1
+2659 2674 1
+2659 2687 1
+2659 2859 1
+2659 3005 1
+2659 3670 1
+2659 4024 1
+2665 2251 1
+2665 2256 1
+2665 2322 1
+2665 2410 1
+2665 2973 1
+2665 3351 1
+2661 2665 1
+2662 2256 1
+2662 2665 1
+2663 2076 1
+2663 2665 1
+2664 2665 1
+2668 2669 1
+2671 2294 1
+2672 350 1
+2672 1049 1
+2672 1374 1
+2672 1384 1
+2672 1419 1
+2672 1521 1
+2672 1564 1
+2672 1992 1
+2672 2076 1
+2672 2294 1
+2672 2366 1
+2672 2685 1
+2672 2720 1
+2673 2294 1
+2674 633 1
+2674 825 1
+2674 856 1
+2674 1166 1
+2674 1267 1
+2674 1291 1
+2674 1297 1
+2674 1305 1
+2674 1357 1
+2674 1393 1
+2674 1416 1
+2674 1549 1
+2674 1571 1
+2674 1734 1
+2674 1754 1
+2674 1814 1
+2674 1992 1
+2674 2016 1
+2674 2114 1
+2674 2116 1
+2674 2209 1
+2674 2225 1
+2674 2231 1
+2674 2251 1
+2674 2252 1
+2674 2290 1
+2674 2297 1
+2674 2324 1
+2674 2356 1
+2674 2371 1
+2674 2474 1
+2674 2485 1
+2674 2535 1
+2674 2542 1
+2674 2550 1
+2674 2560 1
+2674 2565 1
+2674 2576 1
+2674 2597 1
+2674 2619 1
+2674 2623 1
+2674 2625 1
+2674 2651 1
+2674 2654 1
+2674 2660 1
+2674 2686 1
+2674 2693 1
+2674 2697 1
+2674 2700 1
+2674 2708 1
+2674 2713 1
+2674 2775 1
+2674 2785 1
+2674 2819 1
+2674 2830 1
+2674 2851 1
+2674 2912 1
+2674 2918 1
+2674 2973 1
+2674 3007 1
+2674 3024 1
+2674 3026 1
+2674 3029 1
+2674 3034 1
+2674 3056 1
+2674 3068 1
+2674 3099 1
+2674 3114 1
+2674 3148 1
+2674 3164 1
+2674 3251 1
+2674 3253 1
+2674 3265 1
+2674 3320 1
+2674 3371 1
+2674 3404 1
+2674 3456 1
+2674 3480 1
+2674 3562 1
+2674 3650 1
+2674 3717 1
+2674 3812 1
+2674 3903 1
+2674 3946 1
+2674 3970 1
+2674 4014 1
+2674 4021 1
+2674 4335 1
+2674 5002 1
+2674 5176 1
+2674 5288 1
+2674 5312 1
+2674 5430 1
+2674 5743 1
+2674 5804 1
+2674 5828 1
+2674 5936 1
+2674 6501 1
+2674 6599 1
+2674 7073 1
+2674 7381 1
+2674 8293 1
+2674 8295 1
+2675 1992 1
+2676 214 1
+2676 350 1
+2676 1154 1
+2676 1374 1
+2676 1992 1
+2676 2366 1
+2676 2618 1
+2677 840 1
+2677 1549 1
+2677 1982 1
+2677 1992 1
+2677 2565 1
+2677 3809 1
+2677 4536 1
+2677 4666 1
+2677 4944 1
+2677 5563 1
+2677 5697 1
+2677 5739 1
+2677 5773 1
+2677 5800 1
+2677 5807 1
+2677 5822 1
+2677 5922 1
+2677 5932 1
+2677 5998 1
+2677 6097 1
+2677 6123 1
+2677 6272 1
+2677 6327 1
+2677 6330 1
+2677 6555 1
+2677 6624 1
+2677 6736 1
+2677 6790 1
+2677 6832 1
+2677 6913 1
+2677 6930 1
+2677 6946 1
+2677 6953 1
+2677 6979 1
+2677 7040 1
+2677 7052 1
+2677 7060 1
+2677 7073 1
+2677 7074 1
+2677 7301 1
+2680 896 1
+2680 2076 1
+2680 4530 1
+2680 5103 1
+2680 5254 1
+2680 5454 1
+2682 2685 1
+2683 1357 1
+2683 2322 1
+2683 2323 1
+2683 2651 1
+2683 2685 1
+2683 2700 1
+2683 2828 1
+2683 3126 1
+2683 3235 1
+2683 3243 1
+2683 3285 1
+2683 4587 1
+2683 5305 1
+2684 2685 1
+2708 346 1
+2708 2651 1
+2708 3002 1
+2708 3030 1
+2708 4037 1
+2708 4719 1
+2708 4735 1
+2708 4820 1
+2708 5083 1
+2699 608 1
+2699 633 1
+2699 1416 1
+2699 1706 1
+2699 1744 1
+2699 1935 1
+2699 2116 1
+2699 2210 1
+2699 2252 1
+2699 2325 1
+2699 2326 1
+2699 2565 1
+2699 2653 1
+2699 2655 1
+2699 2657 1
+2699 2660 1
+2699 2662 1
+2699 2667 1
+2699 2708 1
+2699 2713 1
+2699 2727 1
+2699 2871 1
+2699 2900 1
+2699 2973 1
+2699 3009 1
+2699 3018 1
+2699 3024 1
+2699 3026 1
+2699 3059 1
+2699 3084 1
+2699 3106 1
+2699 3117 1
+2699 3148 1
+2699 3251 1
+2699 3253 1
+2699 3260 1
+2699 3265 1
+2699 3284 1
+2699 3320 1
+2699 3348 1
+2699 3352 1
+2699 3404 1
+2699 3417 1
+2699 3460 1
+2699 3473 1
+2699 3480 1
+2699 3483 1
+2699 3489 1
+2699 3580 1
+2699 3587 1
+2699 3650 1
+2699 3681 1
+2699 3804 1
+2699 3812 1
+2699 3871 1
+2699 3887 1
+2699 3910 1
+2699 3946 1
+2699 4040 1
+2699 4043 1
+2699 4212 1
+2699 4219 1
+2699 4266 1
+2699 4365 1
+2699 4466 1
+2699 4709 1
+2699 4735 1
+2699 4796 1
+2699 4797 1
+2699 5092 1
+2699 5100 1
+2699 5123 1
+2699 5335 1
+2699 6458 1
+2700 204 1
+2700 285 1
+2700 465 1
+2700 608 1
+2700 778 1
+2700 825 1
+2700 974 1
+2700 1100 1
+2700 1157 1
+2700 1166 1
+2700 1239 1
+2700 1297 1
+2700 1453 1
+2700 1571 1
+2700 1633 1
+2700 1679 1
+2700 1706 1
+2700 1744 1
+2700 1777 1
+2700 1935 1
+2700 1990 1
+2700 2016 1
+2700 2114 1
+2700 2134 1
+2700 2209 1
+2700 2210 1
+2700 2252 1
+2700 2257 1
+2700 2290 1
+2700 2297 1
+2700 2324 1
+2700 2325 1
+2700 2328 1
+2700 2338 1
+2700 2384 1
+2700 2411 1
+2700 2416 1
+2700 2485 1
+2700 2506 1
+2700 2510 1
+2700 2535 1
+2700 2542 1
+2700 2544 1
+2700 2585 1
+2700 2594 1
+2700 2595 1
+2700 2597 1
+2700 2612 1
+2700 2619 1
+2700 2623 1
+2700 2625 1
+2700 2653 1
+2700 2654 1
+2700 2655 1
+2700 2657 1
+2700 2660 1
+2700 2667 1
+2700 2674 1
+2700 2686 1
+2700 2693 1
+2700 2708 1
+2700 2713 1
+2700 2727 1
+2700 2746 1
+2700 2747 1
+2700 2799 1
+2700 2819 1
+2700 2859 1
+2700 2912 1
+2700 2923 1
+2700 2932 1
+2700 2958 1
+2700 2973 1
+2700 2974 1
+2700 2981 1
+2700 3005 1
+2700 3007 1
+2700 3009 1
+2700 3010 1
+2700 3018 1
+2700 3020 1
+2700 3021 1
+2700 3024 1
+2700 3026 1
+2700 3028 1
+2700 3030 1
+2700 3059 1
+2700 3084 1
+2700 3114 1
+2700 3117 1
+2700 3148 1
+2700 3173 1
+2700 3180 1
+2700 3251 1
+2700 3258 1
+2700 3260 1
+2700 3276 1
+2700 3291 1
+2700 3307 1
+2700 3313 1
+2700 3319 1
+2700 3320 1
+2700 3324 1
+2700 3338 1
+2700 3352 1
+2700 3394 1
+2700 3404 1
+2700 3408 1
+2700 3410 1
+2700 3473 1
+2700 3480 1
+2700 3483 1
+2700 3489 1
+2700 3506 1
+2700 3516 1
+2700 3520 1
+2700 3529 1
+2700 3538 1
+2700 3548 1
+2700 3556 1
+2700 3557 1
+2700 3580 1
+2700 3587 1
+2700 3609 1
+2700 3615 1
+2700 3631 1
+2700 3646 1
+2700 3661 1
+2700 3680 1
+2700 3681 1
+2700 3717 1
+2700 3787 1
+2700 3800 1
+2700 3804 1
+2700 3807 1
+2700 3812 1
+2700 3816 1
+2700 3843 1
+2700 3887 1
+2700 3892 1
+2700 3898 1
+2700 3903 1
+2700 3926 1
+2700 3970 1
+2700 3971 1
+2700 4011 1
+2700 4024 1
+2700 4031 1
+2700 4043 1
+2700 4055 1
+2700 4088 1
+2700 4103 1
+2700 4110 1
+2700 4111 1
+2700 4138 1
+2700 4162 1
+2700 4173 1
+2700 4179 1
+2700 4191 1
+2700 4201 1
+2700 4233 1
+2700 4256 1
+2700 4263 1
+2700 4269 1
+2700 4290 1
+2700 4323 1
+2700 4331 1
+2700 8294 1
+2701 204 1
+2701 1633 1
+2701 2174 1
+2701 2225 1
+2701 2264 1
+2701 2325 1
+2701 2356 1
+2701 2371 1
+2701 2398 1
+2701 2416 1
+2701 2542 1
+2701 2576 1
+2701 2594 1
+2701 2651 1
+2701 2654 1
+2701 2708 1
+2701 3030 1
+2701 3265 1
+2701 3338 1
+2686 204 1
+2686 417 1
+2686 465 1
+2686 633 1
+2686 762 1
+2686 825 1
+2686 856 1
+2686 896 1
+2686 1159 1
+2686 1166 1
+2686 1267 1
+2686 1297 1
+2686 1357 1
+2686 1393 1
+2686 1416 1
+2686 1437 1
+2686 1571 1
+2686 1679 1
+2686 1688 1
+2686 1777 1
+2686 1792 1
+2686 1814 1
+2686 2016 1
+2686 2116 1
+2686 2135 1
+2686 2225 1
+2686 2231 1
+2686 2237 1
+2686 2285 1
+2686 2290 1
+2686 2297 1
+2686 2325 1
+2686 2328 1
+2686 2338 1
+2686 2356 1
+2686 2416 1
+2686 2426 1
+2686 2485 1
+2686 2510 1
+2686 2542 1
+2686 2550 1
+2686 2565 1
+2686 2576 1
+2686 2585 1
+2686 2594 1
+2686 2619 1
+2686 2620 1
+2686 2623 1
+2686 2625 1
+2686 2651 1
+2686 2653 1
+2686 2654 1
+2686 2657 1
+2686 2660 1
+2686 2662 1
+2686 2667 1
+2686 2697 1
+2686 2700 1
+2686 2708 1
+2686 2713 1
+2686 2724 1
+2686 2754 1
+2686 2790 1
+2686 2799 1
+2686 2819 1
+2686 2851 1
+2686 2856 1
+2686 2900 1
+2686 2912 1
+2686 2918 1
+2686 2951 1
+2686 3007 1
+2686 3009 1
+2686 3018 1
+2686 3020 1
+2686 3021 1
+2686 3028 1
+2686 3030 1
+2686 3089 1
+2686 3117 1
+2686 3126 1
+2686 3140 1
+2686 3145 1
+2686 3150 1
+2686 3164 1
+2686 3191 1
+2686 3193 1
+2686 3235 1
+2686 3243 1
+2686 3251 1
+2686 3265 1
+2686 3285 1
+2686 3307 1
+2686 3319 1
+2686 3334 1
+2686 3338 1
+2686 3348 1
+2686 3351 1
+2686 3371 1
+2686 3376 1
+2686 3408 1
+2686 3435 1
+2686 3439 1
+2686 3459 1
+2686 3465 1
+2686 3473 1
+2686 3489 1
+2686 3506 1
+2686 3516 1
+2686 3520 1
+2686 3538 1
+2686 3547 1
+2686 3614 1
+2686 3643 1
+2686 3646 1
+2686 3670 1
+2686 3671 1
+2686 3681 1
+2686 3769 1
+2686 3785 1
+2686 3804 1
+2686 3843 1
+2686 3903 1
+2686 3922 1
+2686 3926 1
+2686 4041 1
+2686 4175 1
+2686 4276 1
+2686 4310 1
+2686 4335 1
+2686 4483 1
+2686 4621 1
+2686 4715 1
+2686 4717 1
+2686 4735 1
+2686 4828 1
+2686 4999 1
+2686 5123 1
+2686 5176 1
+2686 5479 1
+2686 5524 1
+2686 5543 1
+2686 5925 1
+2686 5936 1
+2686 5977 1
+2686 5980 1
+2686 5994 1
+2686 6105 1
+2686 6111 1
+2686 6337 1
+2686 6360 1
+2686 6414 1
+2686 6417 1
+2686 6422 1
+2686 8293 1
+2686 8295 1
+2687 1633 1
+2687 2338 1
+2687 2651 1
+2687 2657 1
+2687 2662 1
+2687 2708 1
+2687 2754 1
+2687 3307 1
+2687 3319 1
+2687 3324 1
+2687 3348 1
+2687 3371 1
+2687 3548 1
+2702 72 1
+2702 204 1
+2702 290 1
+2702 425 1
+2702 1385 1
+2702 1437 1
+2702 1633 1
+2702 1680 1
+2702 1734 1
+2702 2135 1
+2702 2225 1
+2702 2251 1
+2702 2323 1
+2702 2338 1
+2702 2381 1
+2702 2398 1
+2702 2516 1
+2702 2565 1
+2702 2576 1
+2702 2592 1
+2702 2651 1
+2702 2708 1
+2702 2775 1
+2702 2830 1
+2702 2856 1
+2702 2880 1
+2702 2900 1
+2702 2928 1
+2702 2977 1
+2702 2979 1
+2702 2991 1
+2702 3018 1
+2702 3089 1
+2702 3099 1
+2702 3117 1
+2702 3140 1
+2702 3150 1
+2702 3164 1
+2702 3265 1
+2702 3276 1
+2702 3307 1
+2702 3319 1
+2702 3338 1
+2702 3351 1
+2702 3371 1
+2702 3408 1
+2702 3456 1
+2702 3459 1
+2702 3516 1
+2702 3537 1
+2702 3538 1
+2702 3755 1
+2702 3796 1
+2702 3813 1
+2702 3843 1
+2702 3976 1
+2702 4099 1
+2702 4127 1
+2702 4247 1
+2702 4276 1
+2702 4310 1
+2702 4547 1
+2702 4574 1
+2702 4953 1
+2702 4983 1
+2702 5044 1
+2702 5055 1
+2702 5092 1
+2702 5103 1
+2702 5204 1
+2702 5222 1
+2702 5285 1
+2702 5457 1
+2702 5484 1
+2702 5683 1
+2702 5705 1
+2702 5828 1
+2702 5863 1
+2702 5936 1
+2702 6124 1
+2703 204 1
+2703 285 1
+2703 633 1
+2703 856 1
+2703 1393 1
+2703 1571 1
+2703 1633 1
+2703 1679 1
+2703 1814 1
+2703 2016 1
+2703 2116 1
+2703 2135 1
+2703 2225 1
+2703 2231 1
+2703 2290 1
+2703 2297 1
+2703 2325 1
+2703 2338 1
+2703 2356 1
+2703 2398 1
+2703 2411 1
+2703 2416 1
+2703 2474 1
+2703 2542 1
+2703 2565 1
+2703 2576 1
+2703 2594 1
+2703 2623 1
+2703 2625 1
+2703 2651 1
+2703 2660 1
+2703 2700 1
+2703 2708 1
+2703 2713 1
+2703 2754 1
+2703 2819 1
+2703 2912 1
+2703 2951 1
+2703 3020 1
+2703 3021 1
+2703 3030 1
+2703 3251 1
+2703 3253 1
+2703 3265 1
+2703 3307 1
+2703 3319 1
+2703 3320 1
+2703 3324 1
+2703 3338 1
+2703 3351 1
+2703 3371 1
+2703 3376 1
+2703 3408 1
+2703 3409 1
+2703 3410 1
+2703 3429 1
+2703 3473 1
+2703 3489 1
+2703 3516 1
+2703 3538 1
+2703 8293 1
+2688 72 1
+2688 204 1
+2688 285 1
+2688 290 1
+2688 346 1
+2688 417 1
+2688 465 1
+2688 608 1
+2688 633 1
+2688 737 1
+2688 762 1
+2688 825 1
+2688 856 1
+2688 896 1
+2688 974 1
+2688 978 1
+2688 1024 1
+2688 1026 1
+2688 1100 1
+2688 1159 1
+2688 1166 1
+2688 1185 1
+2688 1239 1
+2688 1247 1
+2688 1267 1
+2688 1297 1
+2688 1305 1
+2688 1310 1
+2688 1352 1
+2688 1357 1
+2688 1360 1
+2688 1385 1
+2688 1393 1
+2688 1416 1
+2688 1437 1
+2688 1453 1
+2688 1473 1
+2688 1549 1
+2688 1571 1
+2688 1633 1
+2688 1648 1
+2688 1679 1
+2688 1680 1
+2688 1688 1
+2688 1706 1
+2688 1733 1
+2688 1734 1
+2688 1744 1
+2688 1754 1
+2688 1769 1
+2688 1777 1
+2688 1781 1
+2688 1792 1
+2688 1799 1
+2688 1814 1
+2688 1823 1
+2688 1919 1
+2688 1935 1
+2688 1961 1
+2688 1982 1
+2688 1984 1
+2688 2001 1
+2688 2014 1
+2688 2016 1
+2688 2066 1
+2688 2114 1
+2688 2116 1
+2688 2134 1
+2688 2135 1
+2688 2144 1
+2688 2145 1
+2688 2209 1
+2688 2210 1
+2688 2225 1
+2688 2231 1
+2688 2237 1
+2688 2240 1
+2688 2251 1
+2688 2252 1
+2688 2256 1
+2688 2257 1
+2688 2258 1
+2688 2276 1
+2688 2289 1
+2688 2290 1
+2688 2297 1
+2688 2307 1
+2688 2324 1
+2688 2325 1
+2688 2326 1
+2688 2328 1
+2688 2338 1
+2688 2354 1
+2688 2356 1
+2688 2364 1
+2688 2369 1
+2688 2371 1
+2688 2381 1
+2688 2384 1
+2688 2386 1
+2688 2398 1
+2688 2411 1
+2688 2433 1
+2688 2440 1
+2688 2456 1
+2688 2474 1
+2688 2485 1
+2688 2490 1
+2688 2507 1
+2688 2508 1
+2688 2510 1
+2688 2516 1
+2688 2535 1
+2688 2542 1
+2688 2544 1
+2688 2550 1
+2688 2565 1
+2688 2576 1
+2688 2585 1
+2688 2592 1
+2688 2593 1
+2688 2594 1
+2688 2595 1
+2688 2597 1
+2688 2605 1
+2688 2612 1
+2688 2617 1
+2688 2619 1
+2688 2620 1
+2688 2623 1
+2688 2625 1
+2688 2646 1
+2688 2651 1
+2688 2653 1
+2688 2654 1
+2688 2655 1
+2688 2657 1
+2688 2660 1
+2688 2662 1
+2688 2667 1
+2688 2674 1
+2688 2686 1
+2688 2687 1
+2688 2693 1
+2688 2696 1
+2688 2697 1
+2688 2700 1
+2688 2708 1
+2688 2713 1
+2688 2724 1
+2688 2727 1
+2688 2746 1
+2688 2747 1
+2688 2754 1
+2688 2760 1
+2688 2764 1
+2688 2765 1
+2688 2774 1
+2688 2775 1
+2688 2785 1
+2688 2787 1
+2688 2790 1
+2688 2799 1
+2688 2819 1
+2688 2822 1
+2688 2830 1
+2688 2831 1
+2688 2856 1
+2688 2859 1
+2688 2871 1
+2688 2900 1
+2688 2909 1
+2688 2912 1
+2688 2918 1
+2688 2923 1
+2688 2925 1
+2688 2932 1
+2688 2951 1
+2688 2958 1
+2688 2973 1
+2688 2974 1
+2688 2981 1
+2688 3002 1
+2688 3005 1
+2688 3007 1
+2688 3009 1
+2688 3010 1
+2688 3014 1
+2688 3015 1
+2688 3020 1
+2688 3021 1
+2688 3024 1
+2688 3026 1
+2688 3027 1
+2688 3028 1
+2688 3030 1
+2688 3033 1
+2688 3034 1
+2688 3050 1
+2688 3059 1
+2688 3080 1
+2688 3084 1
+2688 3089 1
+2688 3092 1
+2688 3099 1
+2688 3103 1
+2688 3104 1
+2688 3114 1
+2688 3125 1
+2688 3130 1
+2688 3140 1
+2688 3144 1
+2688 3145 1
+2688 3148 1
+2688 3150 1
+2688 3155 1
+2688 3164 1
+2688 3173 1
+2688 3191 1
+2688 3192 1
+2688 3200 1
+2688 3243 1
+2688 3251 1
+2688 3253 1
+2688 3258 1
+2688 3260 1
+2688 3265 1
+2688 3271 1
+2688 3276 1
+2688 3284 1
+2688 3285 1
+2688 3291 1
+2688 3307 1
+2688 3309 1
+2688 3319 1
+2688 3320 1
+2688 3321 1
+2688 3324 1
+2688 3334 1
+2688 3338 1
+2688 3351 1
+2688 3352 1
+2688 3376 1
+2688 3393 1
+2688 3394 1
+2688 3404 1
+2688 3408 1
+2688 3417 1
+2688 3439 1
+2688 3443 1
+2688 3447 1
+2688 3452 1
+2688 3453 1
+2688 3454 1
+2688 3456 1
+2688 3458 1
+2688 3459 1
+2688 3460 1
+2688 3463 1
+2688 3473 1
+2688 3479 1
+2688 3480 1
+2688 3483 1
+2688 3489 1
+2688 3498 1
+2688 3506 1
+2688 3516 1
+2688 3520 1
+2688 3529 1
+2688 3537 1
+2688 3538 1
+2688 3541 1
+2688 3547 1
+2688 3548 1
+2688 3549 1
+2688 3554 1
+2688 3555 1
+2688 3557 1
+2688 3562 1
+2688 3568 1
+2688 3576 1
+2688 3580 1
+2688 3586 1
+2688 3587 1
+2688 3607 1
+2688 3609 1
+2688 3614 1
+2688 3615 1
+2688 3616 1
+2688 3631 1
+2688 3634 1
+2688 3635 1
+2688 3643 1
+2688 3645 1
+2688 3646 1
+2688 3661 1
+2688 3664 1
+2688 3670 1
+2688 3680 1
+2688 3681 1
+2688 3691 1
+2688 3720 1
+2688 3724 1
+2688 3748 1
+2688 3769 1
+2688 3772 1
+2688 3792 1
+2688 3796 1
+2688 3800 1
+2688 3803 1
+2688 3804 1
+2688 3806 1
+2688 3807 1
+2688 3812 1
+2688 3813 1
+2688 3835 1
+2688 3843 1
+2688 3847 1
+2688 3849 1
+2688 3854 1
+2688 3873 1
+2688 3888 1
+2688 3892 1
+2688 3897 1
+2688 3898 1
+2688 3903 1
+2688 3910 1
+2688 3919 1
+2688 3922 1
+2688 3926 1
+2688 3933 1
+2688 3937 1
+2688 3956 1
+2688 3958 1
+2688 3970 1
+2688 3973 1
+2688 3976 1
+2688 4011 1
+2688 4012 1
+2688 4013 1
+2688 4021 1
+2688 4037 1
+2688 4041 1
+2688 4044 1
+2688 4055 1
+2688 4098 1
+2688 4099 1
+2688 4103 1
+2688 4110 1
+2688 4124 1
+2688 4162 1
+2688 4173 1
+2688 4175 1
+2688 4179 1
+2688 4191 1
+2688 4212 1
+2688 4219 1
+2688 4233 1
+2688 4247 1
+2688 4256 1
+2688 4261 1
+2688 4263 1
+2688 4266 1
+2688 4269 1
+2688 4276 1
+2688 4297 1
+2688 4298 1
+2688 4299 1
+2688 4310 1
+2688 4315 1
+2688 4335 1
+2688 4338 1
+2688 4355 1
+2688 4373 1
+2688 4384 1
+2688 4400 1
+2688 4417 1
+2688 4424 1
+2688 4448 1
+2688 4453 1
+2688 4463 1
+2688 4468 1
+2688 4480 1
+2688 4482 1
+2688 4485 1
+2688 4488 1
+2688 4500 1
+2688 4510 1
+2688 4527 1
+2688 4528 1
+2688 4529 1
+2688 4530 1
+2688 4531 1
+2688 4534 1
+2688 4536 1
+2688 4547 1
+2688 4551 1
+2688 4552 1
+2688 4557 1
+2688 4558 1
+2688 4574 1
+2688 4578 1
+2688 4583 1
+2688 4587 1
+2688 4588 1
+2688 4600 1
+2688 4604 1
+2688 4620 1
+2688 4645 1
+2688 4646 1
+2688 4650 1
+2688 4653 1
+2688 4661 1
+2688 4662 1
+2688 4677 1
+2688 4687 1
+2688 4689 1
+2688 4706 1
+2688 4709 1
+2688 4712 1
+2688 4713 1
+2688 4715 1
+2688 4717 1
+2688 4719 1
+2688 4764 1
+2688 4781 1
+2688 4792 1
+2688 4795 1
+2688 4796 1
+2688 4798 1
+2688 4808 1
+2688 4811 1
+2688 4814 1
+2688 4815 1
+2688 4820 1
+2688 4822 1
+2688 4824 1
+2688 4827 1
+2688 4828 1
+2688 4846 1
+2688 4875 1
+2688 4899 1
+2688 4929 1
+2688 4953 1
+2688 4954 1
+2688 4962 1
+2688 4964 1
+2688 4977 1
+2688 4983 1
+2688 4986 1
+2688 4993 1
+2688 4999 1
+2688 5026 1
+2688 5055 1
+2688 5061 1
+2688 5072 1
+2688 5073 1
+2688 5092 1
+2688 5100 1
+2688 5103 1
+2688 5106 1
+2688 5115 1
+2688 5123 1
+2688 5130 1
+2688 5132 1
+2688 5141 1
+2688 5144 1
+2688 5155 1
+2688 5162 1
+2688 5176 1
+2688 5178 1
+2688 5179 1
+2688 5182 1
+2688 5188 1
+2688 5189 1
+2688 5200 1
+2688 5204 1
+2688 5215 1
+2688 5222 1
+2688 5226 1
+2688 5231 1
+2688 5239 1
+2688 5254 1
+2688 5262 1
+2688 5263 1
+2688 5273 1
+2688 5285 1
+2688 5288 1
+2688 5295 1
+2688 5305 1
+2688 5308 1
+2688 5321 1
+2688 5323 1
+2688 5327 1
+2688 5335 1
+2688 5341 1
+2688 5368 1
+2688 5392 1
+2688 5404 1
+2688 5412 1
+2688 5423 1
+2688 5426 1
+2688 5430 1
+2688 5437 1
+2688 5445 1
+2688 5449 1
+2688 5452 1
+2688 5454 1
+2688 5457 1
+2688 5459 1
+2688 5470 1
+2688 5484 1
+2688 5506 1
+2688 5509 1
+2688 5513 1
+2688 5514 1
+2688 5524 1
+2688 5527 1
+2688 5539 1
+2688 5543 1
+2688 5545 1
+2688 5559 1
+2688 5563 1
+2688 5596 1
+2688 5620 1
+2688 5624 1
+2688 5626 1
+2688 5630 1
+2688 5637 1
+2688 5638 1
+2688 5639 1
+2688 5640 1
+2688 5651 1
+2688 5683 1
+2688 5693 1
+2688 5697 1
+2688 5732 1
+2688 5737 1
+2688 5739 1
+2688 5743 1
+2688 5753 1
+2688 5756 1
+2688 5775 1
+2688 5780 1
+2688 5784 1
+2688 5790 1
+2688 5800 1
+2688 5814 1
+2688 5817 1
+2688 5824 1
+2688 5827 1
+2688 5828 1
+2688 5829 1
+2688 5837 1
+2688 5844 1
+2688 5848 1
+2688 5860 1
+2688 5863 1
+2688 5871 1
+2688 5872 1
+2688 5886 1
+2688 5891 1
+2688 5925 1
+2688 5928 1
+2688 5950 1
+2688 5994 1
+2688 6023 1
+2688 6029 1
+2688 6047 1
+2688 6094 1
+2688 6124 1
+2688 6156 1
+2688 6161 1
+2688 6166 1
+2688 6221 1
+2688 6226 1
+2688 6227 1
+2688 6229 1
+2688 6246 1
+2688 6251 1
+2688 6262 1
+2688 6272 1
+2688 6296 1
+2688 6302 1
+2688 6306 1
+2688 6334 1
+2688 6337 1
+2688 6407 1
+2688 6417 1
+2688 6458 1
+2688 6501 1
+2688 6505 1
+2688 6529 1
+2688 6560 1
+2688 6576 1
+2688 6589 1
+2688 6595 1
+2688 6599 1
+2688 6600 1
+2688 6624 1
+2688 6632 1
+2688 6665 1
+2688 6700 1
+2688 6739 1
+2688 6777 1
+2688 6783 1
+2688 6803 1
+2688 6809 1
+2688 6833 1
+2688 6850 1
+2688 6855 1
+2688 6869 1
+2688 6873 1
+2688 6897 1
+2688 6901 1
+2688 8293 1
+2688 8294 1
+2688 8295 1
+2704 290 1
+2704 633 1
+2704 856 1
+2704 1157 1
+2704 1267 1
+2704 1393 1
+2704 1437 1
+2704 1723 1
+2704 1754 1
+2704 1814 1
+2704 1837 1
+2704 1919 1
+2704 2135 1
+2704 2225 1
+2704 2231 1
+2704 2237 1
+2704 2251 1
+2704 2256 1
+2704 2324 1
+2704 2325 1
+2704 2356 1
+2704 2371 1
+2704 2375 1
+2704 2411 1
+2704 2416 1
+2704 2516 1
+2704 2550 1
+2704 2576 1
+2704 2585 1
+2704 2625 1
+2704 2654 1
+2704 2662 1
+2704 2693 1
+2704 2697 1
+2704 2708 1
+2704 2724 1
+2704 2838 1
+2704 2856 1
+2704 2900 1
+2704 2918 1
+2704 2926 1
+2704 2951 1
+2704 2991 1
+2704 2993 1
+2704 3033 1
+2704 3034 1
+2704 3056 1
+2704 3099 1
+2704 3104 1
+2704 3117 1
+2704 3126 1
+2704 3140 1
+2704 3145 1
+2704 3150 1
+2704 3155 1
+2704 3164 1
+2704 3235 1
+2704 3243 1
+2704 3251 1
+2704 3265 1
+2704 3307 1
+2704 3320 1
+2704 3324 1
+2704 3348 1
+2704 3538 1
+2704 3650 1
+2704 4263 1
+2704 4574 1
+2704 4648 1
+2704 5072 1
+2704 5445 1
+2704 5482 1
+2704 5693 1
+2704 5850 1
+2704 6229 1
+2660 72 1
+2660 204 1
+2660 285 1
+2660 417 1
+2660 633 1
+2660 737 1
+2660 762 1
+2660 825 1
+2660 856 1
+2660 1140 1
+2660 1157 1
+2660 1166 1
+2660 1267 1
+2660 1360 1
+2660 1393 1
+2660 1633 1
+2660 1734 1
+2660 1744 1
+2660 1754 1
+2660 1781 1
+2660 1814 1
+2660 1990 1
+2660 2066 1
+2660 2114 1
+2660 2116 1
+2660 2135 1
+2660 2144 1
+2660 2145 1
+2660 2210 1
+2660 2231 1
+2660 2252 1
+2660 2323 1
+2660 2324 1
+2660 2325 1
+2660 2328 1
+2660 2356 1
+2660 2381 1
+2660 2398 1
+2660 2411 1
+2660 2474 1
+2660 2485 1
+2660 2506 1
+2660 2510 1
+2660 2516 1
+2660 2542 1
+2660 2550 1
+2660 2576 1
+2660 2592 1
+2660 2593 1
+2660 2594 1
+2660 2597 1
+2660 2605 1
+2660 2625 1
+2660 2651 1
+2660 2653 1
+2660 2654 1
+2660 2657 1
+2660 2686 1
+2660 2693 1
+2660 2697 1
+2660 2708 1
+2660 2713 1
+2660 2747 1
+2660 2754 1
+2660 2787 1
+2660 2819 1
+2660 2830 1
+2660 2831 1
+2660 2856 1
+2660 2871 1
+2660 2900 1
+2660 2912 1
+2660 2918 1
+2660 2951 1
+2660 3005 1
+2660 3010 1
+2660 3014 1
+2660 3018 1
+2660 3020 1
+2660 3027 1
+2660 3030 1
+2660 3089 1
+2660 3114 1
+2660 3125 1
+2660 3150 1
+2660 3192 1
+2660 3235 1
+2660 3251 1
+2660 3265 1
+2660 3285 1
+2660 3291 1
+2660 3320 1
+2660 3324 1
+2660 3352 1
+2660 3394 1
+2660 3408 1
+2660 3410 1
+2660 3435 1
+2660 3439 1
+2660 3443 1
+2660 3459 1
+2660 3464 1
+2660 3473 1
+2660 3480 1
+2660 3506 1
+2660 3516 1
+2660 3529 1
+2660 3537 1
+2660 3541 1
+2660 3580 1
+2660 3587 1
+2660 3607 1
+2660 3670 1
+2660 3752 1
+2660 3807 1
+2660 3843 1
+2660 3871 1
+2660 3873 1
+2660 3887 1
+2660 4044 1
+2660 4110 1
+2660 4261 1
+2660 4365 1
+2660 4373 1
+2660 4424 1
+2660 4463 1
+2660 4485 1
+2660 4510 1
+2660 4528 1
+2660 4574 1
+2660 4613 1
+2660 4712 1
+2660 4717 1
+2660 4792 1
+2660 4797 1
+2660 4980 1
+2660 5020 1
+2660 5123 1
+2660 5182 1
+2660 5210 1
+2660 5254 1
+2660 5423 1
+2660 5459 1
+2660 5482 1
+2660 5683 1
+2660 5732 1
+2660 5773 1
+2660 5790 1
+2660 5828 1
+2660 5837 1
+2660 5863 1
+2660 6262 1
+2660 6417 1
+2660 6553 1
+2660 6594 1
+2660 6833 1
+2660 6840 1
+2660 6869 1
+2660 6873 1
+2660 7063 1
+2660 7115 1
+2660 7809 1
+2660 7855 1
+2660 8141 1
+2689 737 1
+2689 1297 1
+2689 1799 1
+2689 2257 1
+2689 2325 1
+2689 2398 1
+2689 2485 1
+2689 2657 1
+2689 2700 1
+2689 2708 1
+2689 2958 1
+2689 3010 1
+2689 3024 1
+2689 3089 1
+2689 3265 1
+2689 3284 1
+2689 3456 1
+2689 3529 1
+2689 3812 1
+2689 3946 1
+2689 4138 1
+2689 4247 1
+2689 4435 1
+2689 5055 1
+2689 5092 1
+2689 5100 1
+2689 5155 1
+2689 5253 1
+2689 5412 1
+2689 5452 1
+2689 5454 1
+2689 5650 1
+2689 5886 1
+2689 5891 1
+2689 6833 1
+2689 7874 1
+2689 7910 1
+2689 7961 1
+2667 15 1
+2667 633 1
+2667 737 1
+2667 1159 1
+2667 1548 1
+2667 1799 1
+2667 2276 1
+2667 2325 1
+2667 2398 1
+2667 2474 1
+2667 2507 1
+2667 2651 1
+2667 2708 1
+2667 2764 1
+2667 2765 1
+2667 2774 1
+2667 2831 1
+2667 2914 1
+2667 2925 1
+2667 3015 1
+2667 3089 1
+2667 3092 1
+2667 3106 1
+2667 3191 1
+2667 3265 1
+2667 3393 1
+2667 3456 1
+2667 3479 1
+2667 3554 1
+2667 3586 1
+2667 3614 1
+2667 3643 1
+2667 3691 1
+2667 3897 1
+2667 4041 1
+2667 4175 1
+2667 4191 1
+2667 4247 1
+2667 4276 1
+2667 4310 1
+2667 4483 1
+2667 4600 1
+2667 4666 1
+2667 4687 1
+2667 4712 1
+2667 4715 1
+2667 4781 1
+2667 4786 1
+2667 4795 1
+2667 4798 1
+2667 4828 1
+2667 4846 1
+2667 4929 1
+2667 4964 1
+2667 4980 1
+2667 5103 1
+2667 5121 1
+2667 5123 1
+2667 5176 1
+2667 5179 1
+2667 5189 1
+2667 5200 1
+2667 5233 1
+2667 5239 1
+2667 5245 1
+2667 5301 1
+2667 5437 1
+2667 5439 1
+2667 5449 1
+2667 5452 1
+2667 5463 1
+2667 5482 1
+2667 5484 1
+2667 5506 1
+2667 5509 1
+2667 5511 1
+2667 5524 1
+2667 5527 1
+2667 5543 1
+2667 5545 1
+2667 5563 1
+2667 5564 1
+2667 5568 1
+2667 5620 1
+2667 5624 1
+2667 5630 1
+2667 5635 1
+2667 5638 1
+2667 5684 1
+2667 5738 1
+2667 5753 1
+2667 5798 1
+2667 5804 1
+2667 5886 1
+2667 5891 1
+2667 5936 1
+2667 5963 1
+2667 5994 1
+2667 6006 1
+2667 6029 1
+2667 6078 1
+2667 6094 1
+2667 6096 1
+2667 6098 1
+2667 6105 1
+2667 6111 1
+2667 6124 1
+2667 6148 1
+2667 6151 1
+2667 6166 1
+2667 6218 1
+2667 6229 1
+2667 6327 1
+2667 6328 1
+2667 6334 1
+2667 6337 1
+2667 6360 1
+2667 6388 1
+2667 6400 1
+2667 6407 1
+2667 6409 1
+2667 6414 1
+2667 6422 1
+2667 6432 1
+2667 6437 1
+2667 6441 1
+2690 633 1
+2690 856 1
+2690 1267 1
+2690 1357 1
+2690 1679 1
+2690 1754 1
+2690 1814 1
+2690 2116 1
+2690 2225 1
+2690 2231 1
+2690 2325 1
+2690 2356 1
+2690 2550 1
+2690 2593 1
+2690 2625 1
+2690 2651 1
+2690 2654 1
+2690 2662 1
+2690 2708 1
+2690 2713 1
+2690 3117 1
+2690 3164 1
+2690 3253 1
+2690 3255 1
+2690 3258 1
+2690 3435 1
+2691 1297 1
+2691 1357 1
+2691 1799 1
+2691 1961 1
+2691 2134 1
+2691 2324 1
+2691 2328 1
+2691 2398 1
+2691 2485 1
+2691 2508 1
+2691 2535 1
+2691 2565 1
+2691 2576 1
+2691 2625 1
+2691 2658 1
+2691 2660 1
+2691 2700 1
+2691 2708 1
+2691 2727 1
+2691 2859 1
+2691 2871 1
+2691 2912 1
+2691 2958 1
+2691 3014 1
+2691 3092 1
+2691 3103 1
+2691 3106 1
+2691 3117 1
+2691 3125 1
+2691 3130 1
+2691 3291 1
+2691 3352 1
+2691 3568 1
+2691 3892 1
+2691 3976 1
+2691 4098 1
+2691 4510 1
+2691 4527 1
+2691 5404 1
+2691 5459 1
+2691 5757 1
+2691 5817 1
+2691 5828 1
+2691 8293 1
+2692 1393 1
+2692 1633 1
+2692 2135 1
+2692 2325 1
+2692 2338 1
+2692 2576 1
+2692 2625 1
+2692 2651 1
+2692 2700 1
+2692 2708 1
+2692 2713 1
+2692 2951 1
+2692 3030 1
+2692 3265 1
+2692 3307 1
+2692 3324 1
+2692 3338 1
+2692 3408 1
+2692 8293 1
+2693 15 1
+2693 204 1
+2693 285 1
+2693 417 1
+2693 737 1
+2693 856 1
+2693 896 1
+2693 1024 1
+2693 1026 1
+2693 1166 1
+2693 1239 1
+2693 1310 1
+2693 1416 1
+2693 1549 1
+2693 1571 1
+2693 1633 1
+2693 1744 1
+2693 1792 1
+2693 1990 1
+2693 2066 1
+2693 2134 1
+2693 2209 1
+2693 2252 1
+2693 2289 1
+2693 2290 1
+2693 2297 1
+2693 2324 1
+2693 2328 1
+2693 2354 1
+2693 2371 1
+2693 2381 1
+2693 2411 1
+2693 2416 1
+2693 2426 1
+2693 2433 1
+2693 2485 1
+2693 2510 1
+2693 2516 1
+2693 2542 1
+2693 2550 1
+2693 2576 1
+2693 2585 1
+2693 2594 1
+2693 2597 1
+2693 2625 1
+2693 2651 1
+2693 2653 1
+2693 2654 1
+2693 2657 1
+2693 2667 1
+2693 2708 1
+2693 2747 1
+2693 2774 1
+2693 2787 1
+2693 2819 1
+2693 2822 1
+2693 2831 1
+2693 2932 1
+2693 2958 1
+2693 2973 1
+2693 3002 1
+2693 3005 1
+2693 3007 1
+2693 3009 1
+2693 3010 1
+2693 3014 1
+2693 3018 1
+2693 3021 1
+2693 3030 1
+2693 3092 1
+2693 3106 1
+2693 3114 1
+2693 3117 1
+2693 3148 1
+2693 3351 1
+2693 3352 1
+2693 3371 1
+2693 3408 1
+2693 3435 1
+2693 3439 1
+2693 3443 1
+2693 3447 1
+2693 3456 1
+2693 3459 1
+2693 3473 1
+2693 3516 1
+2693 3529 1
+2693 3537 1
+2693 3549 1
+2693 3562 1
+2693 3568 1
+2693 3580 1
+2693 3587 1
+2693 3607 1
+2693 3615 1
+2693 3643 1
+2693 3660 1
+2693 3664 1
+2693 3792 1
+2693 3813 1
+2693 3843 1
+2693 3910 1
+2693 4037 1
+2693 4134 1
+2693 4179 1
+2693 4191 1
+2693 4201 1
+2693 4247 1
+2693 4263 1
+2693 4276 1
+2693 4290 1
+2693 4448 1
+2693 4547 1
+2693 4687 1
+2693 4709 1
+2693 4735 1
+2693 4811 1
+2693 4953 1
+2693 4980 1
+2693 5026 1
+2693 5130 1
+2693 5144 1
+2693 5200 1
+2693 5204 1
+2693 5254 1
+2693 5375 1
+2693 5449 1
+2693 5543 1
+2693 5714 1
+2693 5739 1
+2693 5780 1
+2693 5804 1
+2693 5818 1
+2693 5891 1
+2693 5936 1
+2693 6004 1
+2693 6330 1
+2693 6347 1
+2693 6496 1
+2693 6566 1
+2693 6595 1
+2693 6613 1
+2693 6790 1
+2693 6855 1
+2693 6869 1
+2693 6901 1
+2693 6955 1
+2693 8293 1
+2693 8295 1
+2705 2708 1
+2706 856 1
+2706 1814 1
+2706 2325 1
+2706 2565 1
+2706 2597 1
+2706 2700 1
+2706 2708 1
+2706 2973 1
+2706 3007 1
+2706 3243 1
+2706 3307 1
+2706 3324 1
+2706 3352 1
+2706 3408 1
+2706 3489 1
+2706 3537 1
+2706 3587 1
+2706 8293 1
+2694 417 1
+2694 2398 1
+2694 2474 1
+2694 2592 1
+2694 2651 1
+2694 2708 1
+2694 2790 1
+2694 3334 1
+2694 3456 1
+2694 4191 1
+2694 4735 1
+2694 5295 1
+2694 5335 1
+2694 5412 1
+2694 5605 1
+2694 7618 1
+2694 7620 1
+2694 7862 1
+2695 2325 1
+2695 2651 1
+2695 2653 1
+2695 2667 1
+2695 2708 1
+2695 3720 1
+2695 8294 1
+2696 633 1
+2696 737 1
+2696 762 1
+2696 856 1
+2696 1185 1
+2696 1267 1
+2696 1393 1
+2696 1688 1
+2696 1799 1
+2696 2135 1
+2696 2144 1
+2696 2225 1
+2696 2237 1
+2696 2325 1
+2696 2328 1
+2696 2354 1
+2696 2356 1
+2696 2485 1
+2696 2576 1
+2696 2625 1
+2696 2651 1
+2696 2653 1
+2696 2708 1
+2696 2713 1
+2696 2790 1
+2696 2909 1
+2696 2912 1
+2696 3020 1
+2696 3021 1
+2696 3026 1
+2696 3059 1
+2696 3125 1
+2696 3144 1
+2696 3173 1
+2696 3192 1
+2696 3251 1
+2696 3274 1
+2696 3320 1
+2696 3324 1
+2696 3338 1
+2696 3352 1
+2696 3435 1
+2696 3456 1
+2696 3537 1
+2696 3568 1
+2696 3661 1
+2696 3748 1
+2696 3796 1
+2696 3854 1
+2696 4099 1
+2696 4124 1
+2696 4191 1
+2696 4256 1
+2696 4261 1
+2696 4335 1
+2696 4411 1
+2696 4578 1
+2696 4653 1
+2696 4662 1
+2696 5026 1
+2696 5452 1
+2696 5459 1
+2696 5743 1
+2696 6148 1
+2697 974 1
+2697 1297 1
+2697 1549 1
+2697 1633 1
+2697 1769 1
+2697 2066 1
+2697 2134 1
+2697 2144 1
+2697 2231 1
+2697 2323 1
+2697 2326 1
+2697 2328 1
+2697 2411 1
+2697 2535 1
+2697 2544 1
+2697 2565 1
+2697 2585 1
+2697 2619 1
+2697 2625 1
+2697 2654 1
+2697 2657 1
+2697 2708 1
+2697 2775 1
+2697 2790 1
+2697 2900 1
+2697 2996 1
+2697 3005 1
+2697 3024 1
+2697 3026 1
+2697 3030 1
+2697 3084 1
+2697 3192 1
+2697 3253 1
+2697 3260 1
+2697 3537 1
+2697 3562 1
+2697 3615 1
+2697 3635 1
+2697 3650 1
+2697 4055 1
+2697 4124 1
+2697 4247 1
+2697 4256 1
+2697 4290 1
+2697 6976 1
+2698 1633 1
+2698 2144 1
+2698 2297 1
+2698 2325 1
+2698 2356 1
+2698 2651 1
+2698 2660 1
+2698 2700 1
+2698 2708 1
+2698 2799 1
+2698 3009 1
+2698 3020 1
+2698 3030 1
+2698 3516 1
+2698 3548 1
+2709 1564 1
+2711 762 1
+2711 1166 1
+2711 1564 1
+2711 1990 1
+2711 2144 1
+2711 2307 1
+2711 2506 1
+2711 2660 1
+2711 3089 1
+2711 3537 1
+2711 3548 1
+2711 3549 1
+2711 3822 1
+2715 1384 1
+2715 4179 1
+2716 1384 1
+2717 1384 1
+2718 1384 1
+2719 765 1
+2719 1049 1
+2719 1549 1
+2719 1637 1
+2719 1729 1
+2719 1808 1
+2719 2134 1
+2719 2252 1
+2719 2328 1
+2719 2544 1
+2719 2594 1
+2719 2653 1
+2719 2720 1
+2719 2958 1
+2719 3180 1
+2719 3307 1
+2719 3351 1
+2719 3562 1
+2719 4162 1
+2719 4323 1
+2719 8293 1
+2721 1049 1
+2721 2963 1
+2722 1049 1
+2723 1049 1
+2724 1049 1
+2724 1777 1
+2724 2973 1
+2724 2974 1
+2724 3200 1
+2724 3439 1
+2724 3629 1
+2724 3772 1
+2724 3804 1
+2724 3847 1
+2725 1049 1
+2727 737 1
+2727 1211 1
+2727 1357 1
+2727 1521 1
+2727 1754 1
+2727 1918 1
+2727 2251 1
+2727 2289 1
+2727 2297 1
+2727 2328 1
+2727 2474 1
+2727 2485 1
+2727 2510 1
+2727 2585 1
+2727 2593 1
+2727 2653 1
+2727 2958 1
+2727 3007 1
+2727 3014 1
+2727 3028 1
+2727 3265 1
+2727 3276 1
+2727 3404 1
+2727 3456 1
+2727 3516 1
+2727 3529 1
+2727 4099 1
+2727 4162 1
+2727 4256 1
+2727 4323 1
+2727 4400 1
+2727 4551 1
+2727 5254 1
+2728 1154 1
+2728 1521 1
+2728 8291 1
+2730 1374 1
+2730 3755 1
+2731 3755 1
+2733 2206 1
+2733 2237 1
+2733 3755 1
+2729 3755 1
+2734 3755 1
+2736 1374 1
+2737 290 1
+2737 856 1
+2737 1374 1
+2737 2135 1
+2737 2398 1
+2737 2651 1
+2737 3089 1
+2737 3106 1
+2737 3253 1
+2737 3309 1
+2737 3443 1
+2737 3516 1
+2737 4510 1
+2737 4820 1
+2737 5073 1
+2737 5288 1
+2738 1374 1
+2738 5179 1
+2738 7423 1
+2739 1374 1
+2740 403 1
+2740 765 1
+2740 1154 1
+2740 1374 1
+2740 1637 1
+2740 1646 1
+2740 1653 1
+2740 2102 1
+2740 2120 1
+2740 2410 1
+2740 2560 1
+2740 2618 1
+2740 2693 1
+2740 2754 1
+2740 2768 1
+2740 2785 1
+2740 2805 1
+2740 2809 1
+2740 2814 1
+2740 2828 1
+2740 2834 1
+2740 2922 1
+2740 2973 1
+2740 3200 1
+2740 3520 1
+2740 3803 1
+2740 3804 1
+2740 3807 1
+2741 2736 1
+2744 15 1
+2744 72 1
+2744 896 1
+2744 1026 1
+2744 1154 1
+2744 1637 1
+2744 2416 1
+2744 2490 1
+2744 2535 1
+2744 2618 1
+2744 2781 1
+2744 2785 1
+2744 2787 1
+2744 2918 1
+2744 4175 1
+2744 4335 1
+2744 4574 1
+2744 4709 1
+2744 5020 1
+2744 5254 1
+2744 5263 1
+2744 5482 1
+2744 5511 1
+2744 5639 1
+2744 5640 1
+2744 5683 1
+2744 5784 1
+2744 5860 1
+2744 5872 1
+2744 5936 1
+2744 5973 1
+2744 5994 1
+2744 6006 1
+2744 6021 1
+2744 6094 1
+2744 6148 1
+2744 6229 1
+2744 6246 1
+2744 6251 1
+2747 974 1
+2747 1100 1
+2747 1297 1
+2747 1729 1
+2747 1744 1
+2747 2145 1
+2747 2257 1
+2747 2289 1
+2747 2290 1
+2747 2328 1
+2747 2411 1
+2747 2485 1
+2747 2510 1
+2747 2565 1
+2747 2585 1
+2747 2618 1
+2747 2625 1
+2747 2651 1
+2747 2654 1
+2747 2657 1
+2747 2674 1
+2747 2687 1
+2747 2693 1
+2747 2746 1
+2747 2900 1
+2747 2923 1
+2747 2973 1
+2747 2974 1
+2747 3005 1
+2747 3007 1
+2747 3010 1
+2747 3024 1
+2747 3026 1
+2747 3114 1
+2747 3117 1
+2747 3125 1
+2747 3148 1
+2747 3200 1
+2747 3258 1
+2747 3260 1
+2747 3265 1
+2747 3291 1
+2747 3320 1
+2747 3352 1
+2747 3394 1
+2747 3404 1
+2747 3439 1
+2747 3480 1
+2747 3483 1
+2747 3516 1
+2747 3529 1
+2747 3568 1
+2747 3576 1
+2747 3580 1
+2747 3650 1
+2747 3670 1
+2747 3680 1
+2747 3681 1
+2747 3769 1
+2747 3772 1
+2747 3776 1
+2747 3785 1
+2747 3800 1
+2747 3807 1
+2747 3892 1
+2747 4021 1
+2747 4051 1
+2747 4191 1
+2747 4199 1
+2747 4233 1
+2747 4247 1
+2747 4365 1
+2747 4384 1
+2747 4402 1
+2747 4480 1
+2747 4485 1
+2747 4735 1
+2747 4811 1
+2747 5144 1
+2746 825 1
+2746 1549 1
+2746 2066 1
+2746 2102 1
+2746 2256 1
+2746 2328 1
+2746 2340 1
+2746 2474 1
+2746 2585 1
+2746 2594 1
+2746 2595 1
+2746 2618 1
+2746 2651 1
+2746 2781 1
+2746 2814 1
+2746 2825 1
+2746 2844 1
+2746 2923 1
+2746 2958 1
+2746 3171 1
+2746 3265 1
+2746 3562 1
+2746 3843 1
+2746 4021 1
+2746 4528 1
+2748 1637 1
+2749 1637 1
+2752 15 1
+2752 290 1
+2752 1744 1
+2752 2398 1
+2752 2754 1
+2752 3456 1
+2752 5254 1
+2753 2754 1
+2755 8291 1
+2757 56 1
+2757 1653 1
+2757 2102 1
+2757 2654 1
+2757 2770 1
+2759 2763 1
+2760 15 1
+2760 72 1
+2760 1385 1
+2760 2066 1
+2760 2145 1
+2760 2258 1
+2760 2398 1
+2760 2516 1
+2760 2763 1
+2760 3787 1
+2760 4099 1
+2760 4600 1
+2760 4828 1
+2760 5002 1
+2760 5083 1
+2760 5100 1
+2760 5311 1
+2760 5412 1
+2760 5449 1
+2760 5482 1
+2760 5784 1
+2760 5828 1
+2760 5850 1
+2761 2763 1
+2762 762 1
+2762 2654 1
+2762 2763 1
+2764 1646 1
+2765 762 1
+2765 765 1
+2765 1646 1
+2765 1729 1
+2765 2144 1
+2765 2257 1
+2765 2273 1
+2765 2511 1
+2765 2544 1
+2765 2612 1
+2765 2764 1
+2765 2819 1
+2765 2859 1
+2765 3117 1
+2765 3634 1
+2765 3897 1
+2765 4600 1
+2765 4719 1
+2765 4875 1
+2765 5341 1
+2765 5452 1
+2765 5482 1
+2765 5584 1
+2765 5973 1
+2765 6227 1
+2765 6441 1
+2765 7047 1
+2765 7649 1
+2765 7965 1
+2766 1646 1
+2767 1646 1
+2768 425 1
+2768 1291 1
+2768 1419 1
+2768 1596 1
+2768 1646 1
+2768 1705 1
+2768 1723 1
+2768 1808 1
+2768 2053 1
+2768 2120 1
+2768 2174 1
+2768 2264 1
+2768 2323 1
+2768 2375 1
+2768 2416 1
+2768 2542 1
+2768 2547 1
+2768 2560 1
+2768 2599 1
+2768 2646 1
+2768 2707 1
+2768 2721 1
+2768 2799 1
+2768 2805 1
+2768 2809 1
+2768 2815 1
+2768 2834 1
+2768 2877 1
+2768 2902 1
+2768 2918 1
+2768 2922 1
+2768 2926 1
+2768 2928 1
+2768 2946 1
+2768 2963 1
+2768 2968 1
+2768 2972 1
+2768 2979 1
+2768 2990 1
+2768 2999 1
+2770 4110 1
+2771 2770 1
+2769 2770 1
+2772 1592 1
+2773 1592 1
+2774 15 1
+2774 1297 1
+2774 1310 1
+2774 1403 1
+2774 1416 1
+2774 1592 1
+2774 1705 1
+2774 1706 1
+2774 1918 1
+2774 2114 1
+2774 2323 1
+2774 2328 1
+2774 2474 1
+2774 2506 1
+2774 2535 1
+2774 2660 1
+2774 2775 1
+2774 2801 1
+2774 3084 1
+2774 3089 1
+2774 3238 1
+2774 3309 1
+2774 3456 1
+2774 3480 1
+2774 3897 1
+2774 3976 1
+2774 4055 1
+2774 4071 1
+2774 4110 1
+2774 4261 1
+2774 4646 1
+2774 4735 1
+2774 5079 1
+2774 5121 1
+2774 5123 1
+2774 5262 1
+2774 5529 1
+2774 5624 1
+2774 5828 1
+2774 6006 1
+2774 6347 1
+2774 6437 1
+2774 6832 1
+2774 7510 1
+2774 7632 1
+2774 7795 1
+2775 15 1
+2775 1633 1
+2775 1799 1
+2775 2120 1
+2775 2174 1
+2775 2285 1
+2775 2297 1
+2775 2328 1
+2775 2410 1
+2775 2440 1
+2775 2576 1
+2775 2660 1
+2775 2777 1
+2775 2871 1
+2775 3034 1
+2775 3089 1
+2775 3352 1
+2775 3394 1
+2775 3443 1
+2775 3456 1
+2775 3568 1
+2775 4191 1
+2775 4266 1
+2775 4384 1
+2775 4604 1
+2775 4689 1
+2775 4717 1
+2775 4981 1
+2775 5100 1
+2775 5123 1
+2775 5182 1
+2775 5273 1
+2775 5412 1
+2775 5886 1
+2775 6437 1
+2776 2777 1
+2778 155 1
+2778 214 1
+2778 425 1
+2778 762 1
+2778 1211 1
+2778 2053 1
+2778 2416 1
+2778 2433 1
+2778 2781 1
+2778 2787 1
+2778 2801 1
+2778 2821 1
+2778 2877 1
+2778 2880 1
+2778 2946 1
+2778 2972 1
+2778 3724 1
+2778 4173 1
+2778 4510 1
+2778 5323 1
+2778 5683 1
+2778 5812 1
+2779 2781 1
+2780 2560 1
+2780 2781 1
+2780 2972 1
+2785 5423 1
+2782 2785 1
+2783 2785 1
+2784 2785 1
+2787 2517 1
+2787 3307 1
+2787 4072 1
+2787 4162 1
+2786 2787 1
+2788 403 1
+2788 2102 1
+2788 2410 1
+2788 2801 1
+2789 1211 1
+2789 2257 1
+2789 2794 1
+2790 15 1
+2790 204 1
+2790 417 1
+2790 465 1
+2790 633 1
+2790 741 1
+2790 762 1
+2790 827 1
+2790 856 1
+2790 974 1
+2790 1166 1
+2790 1297 1
+2790 1357 1
+2790 1453 1
+2790 1549 1
+2790 1571 1
+2790 1633 1
+2790 1706 1
+2790 1744 1
+2790 1754 1
+2790 1777 1
+2790 1814 1
+2790 1935 1
+2790 1982 1
+2790 1984 1
+2790 1990 1
+2790 2114 1
+2790 2116 1
+2790 2120 1
+2790 2135 1
+2790 2144 1
+2790 2160 1
+2790 2174 1
+2790 2209 1
+2790 2231 1
+2790 2256 1
+2790 2297 1
+2790 2322 1
+2790 2324 1
+2790 2326 1
+2790 2398 1
+2790 2411 1
+2790 2440 1
+2790 2474 1
+2790 2510 1
+2790 2516 1
+2790 2535 1
+2790 2542 1
+2790 2544 1
+2790 2576 1
+2790 2585 1
+2790 2593 1
+2790 2594 1
+2790 2625 1
+2790 2646 1
+2790 2651 1
+2790 2654 1
+2790 2657 1
+2790 2660 1
+2790 2662 1
+2790 2687 1
+2790 2693 1
+2790 2697 1
+2790 2700 1
+2790 2713 1
+2790 2747 1
+2790 2794 1
+2790 2838 1
+2790 2856 1
+2790 2900 1
+2790 2912 1
+2790 2918 1
+2790 2951 1
+2790 2973 1
+2790 3005 1
+2790 3009 1
+2790 3021 1
+2790 3024 1
+2790 3028 1
+2790 3030 1
+2790 3036 1
+2790 3059 1
+2790 3084 1
+2790 3089 1
+2790 3114 1
+2790 3117 1
+2790 3125 1
+2790 3130 1
+2790 3155 1
+2790 3173 1
+2790 3180 1
+2790 3253 1
+2790 3260 1
+2790 3265 1
+2790 3301 1
+2790 3307 1
+2790 3324 1
+2790 3334 1
+2790 3348 1
+2790 3352 1
+2790 3376 1
+2790 3404 1
+2790 3408 1
+2790 3439 1
+2790 3443 1
+2790 3446 1
+2790 3459 1
+2790 3464 1
+2790 3473 1
+2790 3480 1
+2790 3483 1
+2790 3486 1
+2790 3516 1
+2790 3520 1
+2790 3537 1
+2790 3548 1
+2790 3549 1
+2790 3555 1
+2790 3576 1
+2790 3580 1
+2790 3609 1
+2790 3650 1
+2790 3670 1
+2790 3680 1
+2790 3681 1
+2790 3785 1
+2790 3800 1
+2790 3803 1
+2790 3807 1
+2790 3809 1
+2790 3856 1
+2790 3893 1
+2790 3897 1
+2790 3914 1
+2790 3921 1
+2790 3946 1
+2790 3958 1
+2790 3967 1
+2790 3970 1
+2790 3980 1
+2790 4124 1
+2790 4191 1
+2790 4212 1
+2790 4400 1
+2790 4448 1
+2790 4466 1
+2790 4536 1
+2790 4558 1
+2790 4578 1
+2790 4778 1
+2790 4811 1
+2790 4875 1
+2790 5130 1
+2790 5254 1
+2790 5263 1
+2790 5323 1
+2790 5404 1
+2790 5412 1
+2790 5423 1
+2790 5449 1
+2790 5487 1
+2790 5697 1
+2790 6235 1
+2790 6246 1
+2790 6255 1
+2790 6330 1
+2790 6388 1
+2790 6833 1
+2790 6869 1
+2790 6945 1
+2790 6953 1
+2790 7040 1
+2790 8293 1
+2791 425 1
+2791 1166 1
+2791 1297 1
+2791 1808 1
+2791 1918 1
+2791 2297 1
+2791 2375 1
+2791 2411 1
+2791 2547 1
+2791 2794 1
+2791 2877 1
+2791 2955 1
+2791 2963 1
+2791 3473 1
+2791 8293 1
+2792 403 1
+2792 765 1
+2792 1419 1
+2792 1723 1
+2792 2120 1
+2792 2174 1
+2792 2264 1
+2792 2375 1
+2792 2599 1
+2792 2625 1
+2792 2651 1
+2792 2794 1
+2792 2834 1
+2792 2880 1
+2792 2922 1
+2792 3007 1
+2792 3976 1
+2792 4040 1
+2793 2576 1
+2793 2794 1
+2793 4335 1
+2793 4828 1
+2793 5178 1
+2793 7073 1
+2796 1211 1
+2796 1808 1
+2796 2416 1
+2796 2797 1
+2796 2946 1
+2796 2955 1
+2796 3056 1
+2796 4037 1
+2802 765 1
+2802 2354 1
+2802 2535 1
+2802 2805 1
+2802 4875 1
+2802 4964 1
+2802 5484 1
+2802 5524 1
+2802 6023 1
+2803 2805 1
+2804 974 1
+2804 2209 1
+2804 2252 1
+2804 2597 1
+2804 2653 1
+2804 2667 1
+2804 2674 1
+2804 2747 1
+2804 2799 1
+2804 2805 1
+2804 3148 1
+2804 3260 1
+2804 3537 1
+2804 3580 1
+2804 3587 1
+2804 4055 1
+2807 2535 1
+2807 2617 1
+2807 2625 1
+2807 2809 1
+2807 4037 1
+2808 2398 1
+2808 2809 1
+2811 2066 1
+2811 2398 1
+2811 2433 1
+2811 3456 1
+2811 3562 1
+2811 3607 1
+2811 4037 1
+2811 4218 1
+2811 4315 1
+2811 4335 1
+2811 4500 1
+2811 4583 1
+2811 4605 1
+2811 4831 1
+2811 4929 1
+2811 5412 1
+2811 5459 1
+2811 6634 1
+2811 7604 1
+2813 2814 1
+2544 15 1
+2544 2328 1
+2544 2790 1
+2544 2814 1
+2544 3014 1
+2544 3352 1
+2544 3568 1
+2544 3615 1
+2544 5321 1
+2544 5624 1
+2544 7553 1
+2815 1291 1
+2815 1633 1
+2815 1734 1
+2815 2102 1
+2815 2322 1
+2815 2323 1
+2815 2619 1
+2815 2625 1
+2815 2693 1
+2815 2996 1
+2815 3029 1
+2818 2821 1
+2817 2818 1
+2817 2821 1
+2819 1549 1
+2819 1633 1
+2819 2016 1
+2819 2619 1
+2819 2660 1
+2819 2821 1
+2819 2825 1
+2819 3018 1
+2819 3251 1
+2819 3410 1
+2819 3439 1
+2819 3516 1
+2819 3548 1
+2819 3623 1
+2819 3903 1
+2819 4536 1
+2819 4600 1
+2819 6780 1
+2822 214 1
+2822 403 1
+2822 737 1
+2822 762 1
+2822 765 1
+2822 856 1
+2822 1211 1
+2822 1291 1
+2822 1723 1
+2822 1935 1
+2822 2114 1
+2822 2174 1
+2822 2256 1
+2822 2322 1
+2822 2323 1
+2822 2354 1
+2822 2416 1
+2822 2535 1
+2822 2625 1
+2822 2654 1
+2822 2707 1
+2822 2834 1
+2822 2856 1
+2822 2880 1
+2822 2900 1
+2822 2902 1
+2822 2923 1
+2822 2968 1
+2822 2991 1
+2822 3029 1
+2822 3033 1
+2822 3050 1
+2822 3056 1
+2822 3059 1
+2822 3068 1
+2822 3404 1
+2822 3847 1
+2822 4021 1
+2822 4124 1
+2822 5412 1
+2822 5928 1
+2822 5963 1
+2822 8292 1
+2823 2825 1
+2654 285 1
+2654 417 1
+2654 762 1
+2654 825 1
+2654 827 1
+2654 1267 1
+2654 1291 1
+2654 1297 1
+2654 1357 1
+2654 1416 1
+2654 1453 1
+2654 1549 1
+2654 1679 1
+2654 1744 1
+2654 1781 1
+2654 1792 1
+2654 1915 1
+2654 1935 1
+2654 1990 1
+2654 2053 1
+2654 2116 1
+2654 2144 1
+2654 2210 1
+2654 2252 1
+2654 2297 1
+2654 2307 1
+2654 2324 1
+2654 2371 1
+2654 2411 1
+2654 2416 1
+2654 2470 1
+2654 2485 1
+2654 2508 1
+2654 2510 1
+2654 2535 1
+2654 2550 1
+2654 2576 1
+2654 2585 1
+2654 2625 1
+2654 2653 1
+2654 2657 1
+2654 2662 1
+2654 2667 1
+2654 2674 1
+2654 2686 1
+2654 2693 1
+2654 2697 1
+2654 2713 1
+2654 2724 1
+2654 2746 1
+2654 2819 1
+2654 2825 1
+2654 2856 1
+2654 2859 1
+2654 2900 1
+2654 2902 1
+2654 2958 1
+2654 2996 1
+2654 3005 1
+2654 3007 1
+2654 3010 1
+2654 3026 1
+2654 3056 1
+2654 3089 1
+2654 3109 1
+2654 3126 1
+2654 3140 1
+2654 3148 1
+2654 3171 1
+2654 3180 1
+2654 3193 1
+2654 3253 1
+2654 3255 1
+2654 3258 1
+2654 3313 1
+2654 3352 1
+2654 3404 1
+2654 3446 1
+2654 3486 1
+2654 3529 1
+2654 3537 1
+2654 3541 1
+2654 3556 1
+2654 3562 1
+2654 3567 1
+2654 3650 1
+2654 3670 1
+2654 3681 1
+2654 3717 1
+2654 3769 1
+2654 3800 1
+2654 3822 1
+2654 3867 1
+2654 3898 1
+2654 3922 1
+2654 3926 1
+2654 3973 1
+2654 4013 1
+2654 4021 1
+2654 4110 1
+2654 4111 1
+2654 4117 1
+2654 4233 1
+2654 8294 1
+2824 2825 1
+2826 765 1
+2758 765 1
+2758 1679 1
+2827 765 1
+2799 1777 1
+2799 2565 1
+2799 2686 1
+2799 2923 1
+2799 3200 1
+2799 3483 1
+2799 3680 1
+2799 3847 1
+2830 1723 1
+2830 2120 1
+2830 2323 1
+2830 2547 1
+2830 2560 1
+2830 2877 1
+2834 2072 1
+2834 3117 1
+2834 3726 1
+2834 5793 1
+2834 6784 1
+2831 425 1
+2831 1166 1
+2831 1972 1
+2831 2001 1
+2831 2256 1
+2831 2328 1
+2831 2381 1
+2831 2474 1
+2831 2594 1
+2831 2619 1
+2831 2620 1
+2831 2625 1
+2831 2674 1
+2831 2834 1
+2831 2912 1
+2831 2972 1
+2831 3103 1
+2831 3480 1
+2831 3529 1
+2831 3631 1
+2831 3813 1
+2831 3958 1
+2831 4310 1
+2831 4531 1
+2831 4578 1
+2831 4846 1
+2831 5079 1
+2831 5144 1
+2831 5262 1
+2831 5454 1
+2831 5459 1
+2831 5605 1
+2831 5827 1
+2831 5928 1
+2831 6124 1
+2831 6913 1
+2831 7908 1
+2831 7910 1
+2831 7912 1
+2832 762 1
+2832 1360 1
+2832 1596 1
+2832 1984 1
+2832 2323 1
+2832 2811 1
+2832 2834 1
+2832 2932 1
+2832 2979 1
+2832 3029 1
+2832 3099 1
+2832 3125 1
+2832 3144 1
+2832 3352 1
+2832 3439 1
+2832 3443 1
+2832 3568 1
+2832 3645 1
+2832 3650 1
+2832 3812 1
+2832 3835 1
+2832 4037 1
+2832 4191 1
+2832 4234 1
+2832 4264 1
+2832 4289 1
+2832 4297 1
+2832 4299 1
+2832 4349 1
+2832 4351 1
+2832 4373 1
+2832 4384 1
+2832 4422 1
+2832 4424 1
+2832 4463 1
+2832 4468 1
+2832 4480 1
+2832 4485 1
+2832 4529 1
+2832 4588 1
+2832 4631 1
+2832 4713 1
+2832 4728 1
+2832 4735 1
+2832 4780 1
+2832 4783 1
+2832 4814 1
+2832 4820 1
+2832 4875 1
+2832 4953 1
+2833 1419 1
+2833 1549 1
+2833 2371 1
+2833 2834 1
+2833 2880 1
+2833 3969 1
+2833 7561 1
+2835 8292 1
+2838 1211 1
+2838 1297 1
+2838 1419 1
+2838 1633 1
+2838 2290 1
+2838 2535 1
+2838 2585 1
+2838 2593 1
+2838 2619 1
+2838 2657 1
+2838 2660 1
+2838 2727 1
+2838 2746 1
+2838 2923 1
+2838 2958 1
+2838 2999 1
+2838 3117 1
+2838 3516 1
+2838 3587 1
+2838 3776 1
+2838 3892 1
+2839 1419 1
+2839 3334 1
+2839 6417 1
+2839 6442 1
+2839 7422 1
+2840 1419 1
+2840 1808 1
+2840 2174 1
+2840 2256 1
+2840 2264 1
+2840 2375 1
+2840 2470 1
+2840 2501 1
+2840 2599 1
+2840 2646 1
+2840 2877 1
+2840 2922 1
+2840 2972 1
+2840 2993 1
+2844 2880 1
+2844 2902 1
+2845 1211 1
+2845 1723 1
+2845 2955 1
+2846 1723 1
+2847 1723 1
+2848 1723 1
+2849 1723 1
+2850 1723 1
+2851 15 1
+2851 737 1
+2851 967 1
+2851 1723 1
+2851 1754 1
+2851 2356 1
+2851 2485 1
+2851 2506 1
+2851 2508 1
+2851 2535 1
+2851 2774 1
+2851 2856 1
+2851 2871 1
+2851 2955 1
+2851 3015 1
+2851 3144 1
+2851 3643 1
+2851 3796 1
+2851 4037 1
+2851 4335 1
+2851 4432 1
+2851 4940 1
+2851 5022 1
+2851 5037 1
+2851 5254 1
+2851 5288 1
+2851 5412 1
+2851 5445 1
+2851 5449 1
+2851 5922 1
+2851 6006 1
+2851 6337 1
+2851 6437 1
+2851 6442 1
+2851 6725 1
+2851 6832 1
+2851 6850 1
+2851 6875 1
+2851 6955 1
+2851 6980 1
+2851 7553 1
+2851 7871 1
+2851 7912 1
+2851 8212 1
+2852 1723 1
+2852 2775 1
+2853 1723 1
+2855 1360 1
+2855 2225 1
+2855 2264 1
+2855 2764 1
+2855 2774 1
+2855 2856 1
+2855 3276 1
+2855 3842 1
+2855 5100 1
+2855 5210 1
+2855 5697 1
+2855 6330 1
+2855 6552 1
+2855 6594 1
+2855 6790 1
+2855 6979 1
+2856 2264 1
+2856 2662 1
+2856 3089 1
+2856 3126 1
+2856 3243 1
+2857 2264 1
+2858 2264 1
+2858 2516 1
+2858 2963 1
+2859 608 1
+2859 741 1
+2859 762 1
+2859 778 1
+2859 825 1
+2859 1157 1
+2859 1239 1
+2859 1307 1
+2859 1453 1
+2859 1769 1
+2859 1777 1
+2859 2014 1
+2859 2144 1
+2859 2145 1
+2859 2237 1
+2859 2264 1
+2859 2307 1
+2859 2328 1
+2859 2398 1
+2859 2485 1
+2859 2506 1
+2859 2508 1
+2859 2516 1
+2859 2517 1
+2859 2542 1
+2859 2565 1
+2859 2585 1
+2859 2619 1
+2859 2746 1
+2859 2775 1
+2859 2790 1
+2859 2871 1
+2859 2900 1
+2859 2958 1
+2859 2981 1
+2859 3007 1
+2859 3024 1
+2859 3028 1
+2859 3034 1
+2859 3073 1
+2859 3144 1
+2859 3155 1
+2859 3200 1
+2859 3258 1
+2859 3260 1
+2859 3291 1
+2859 3320 1
+2859 3321 1
+2859 3352 1
+2859 3404 1
+2859 3408 1
+2859 3439 1
+2859 3443 1
+2859 3453 1
+2859 3454 1
+2859 3473 1
+2859 3486 1
+2859 3489 1
+2859 3557 1
+2859 3562 1
+2859 3568 1
+2859 3615 1
+2859 3645 1
+2859 3650 1
+2859 3717 1
+2859 3724 1
+2859 3748 1
+2859 3803 1
+2859 3812 1
+2859 3843 1
+2859 3856 1
+2859 3871 1
+2859 3903 1
+2859 3914 1
+2859 3921 1
+2859 3922 1
+2859 3933 1
+2859 3937 1
+2859 3942 1
+2859 3946 1
+2859 3973 1
+2859 3976 1
+2859 3980 1
+2859 4011 1
+2859 4024 1
+2859 4030 1
+2859 4031 1
+2859 4037 1
+2859 4043 1
+2859 4044 1
+2859 4051 1
+2859 4055 1
+2859 4088 1
+2859 4103 1
+2859 4110 1
+2859 4111 1
+2859 4162 1
+2859 4171 1
+2859 4173 1
+2859 4179 1
+2859 4183 1
+2859 4191 1
+2859 4234 1
+2859 4256 1
+2859 4290 1
+2859 4297 1
+2859 4331 1
+2859 4332 1
+2859 4335 1
+2859 4351 1
+2859 4365 1
+2859 4373 1
+2859 4384 1
+2859 4385 1
+2859 4386 1
+2859 4402 1
+2859 4412 1
+2859 4463 1
+2859 4468 1
+2859 4500 1
+2859 4510 1
+2859 4528 1
+2859 4531 1
+2859 4552 1
+2859 4557 1
+2859 4588 1
+2859 4613 1
+2859 4631 1
+2859 4648 1
+2859 4661 1
+2859 4677 1
+2859 4719 1
+2859 4728 1
+2859 4780 1
+2859 4811 1
+2859 4820 1
+2859 4831 1
+2859 8293 1
+2859 8294 1
+2860 214 1
+2860 1919 1
+2860 2542 1
+2860 2623 1
+2860 3018 1
+2866 214 1
+2866 1211 1
+2866 1705 1
+2866 2053 1
+2866 2470 1
+2866 2877 1
+2867 214 1
+2867 3027 1
+2867 4536 1
+2861 214 1
+2868 214 1
+2869 214 1
+2862 214 1
+2862 2470 1
+2862 2880 1
+2862 2926 1
+2863 214 1
+2863 2470 1
+2863 2877 1
+2863 2880 1
+2863 2902 1
+2870 214 1
+2871 72 1
+2871 204 1
+2871 214 1
+2871 290 1
+2871 465 1
+2871 608 1
+2871 633 1
+2871 737 1
+2871 762 1
+2871 825 1
+2871 827 1
+2871 856 1
+2871 1157 1
+2871 1211 1
+2871 1239 1
+2871 1267 1
+2871 1297 1
+2871 1307 1
+2871 1310 1
+2871 1315 1
+2871 1357 1
+2871 1360 1
+2871 1385 1
+2871 1393 1
+2871 1416 1
+2871 1453 1
+2871 1548 1
+2871 1571 1
+2871 1596 1
+2871 1679 1
+2871 1680 1
+2871 1688 1
+2871 1706 1
+2871 1769 1
+2871 1777 1
+2871 1781 1
+2871 1814 1
+2871 1918 1
+2871 1919 1
+2871 1984 1
+2871 2016 1
+2871 2066 1
+2871 2116 1
+2871 2134 1
+2871 2135 1
+2871 2145 1
+2871 2210 1
+2871 2225 1
+2871 2231 1
+2871 2240 1
+2871 2251 1
+2871 2252 1
+2871 2256 1
+2871 2257 1
+2871 2290 1
+2871 2297 1
+2871 2323 1
+2871 2325 1
+2871 2328 1
+2871 2364 1
+2871 2369 1
+2871 2371 1
+2871 2381 1
+2871 2384 1
+2871 2386 1
+2871 2398 1
+2871 2411 1
+2871 2456 1
+2871 2470 1
+2871 2474 1
+2871 2485 1
+2871 2506 1
+2871 2516 1
+2871 2544 1
+2871 2550 1
+2871 2552 1
+2871 2560 1
+2871 2585 1
+2871 2592 1
+2871 2595 1
+2871 2612 1
+2871 2617 1
+2871 2619 1
+2871 2625 1
+2871 2651 1
+2871 2653 1
+2871 2655 1
+2871 2657 1
+2871 2662 1
+2871 2689 1
+2871 2696 1
+2871 2697 1
+2871 2700 1
+2871 2707 1
+2871 2713 1
+2871 2724 1
+2871 2746 1
+2871 2775 1
+2871 2790 1
+2871 2815 1
+2871 2819 1
+2871 2880 1
+2871 2900 1
+2871 2902 1
+2871 2912 1
+2871 2932 1
+2871 2951 1
+2871 2955 1
+2871 2958 1
+2871 2963 1
+2871 2966 1
+2871 2972 1
+2871 2977 1
+2871 2979 1
+2871 2981 1
+2871 2993 1
+2871 2996 1
+2871 2999 1
+2871 3005 1
+2871 3007 1
+2871 3010 1
+2871 3014 1
+2871 3020 1
+2871 3024 1
+2871 3026 1
+2871 3028 1
+2871 3029 1
+2871 3030 1
+2871 3033 1
+2871 3034 1
+2871 3050 1
+2871 3056 1
+2871 3073 1
+2871 3080 1
+2871 3084 1
+2871 3089 1
+2871 3092 1
+2871 3106 1
+2871 3114 1
+2871 3117 1
+2871 3126 1
+2871 3140 1
+2871 3145 1
+2871 3150 1
+2871 3164 1
+2871 3192 1
+2871 3243 1
+2871 3251 1
+2871 3253 1
+2871 3258 1
+2871 3260 1
+2871 3276 1
+2871 3284 1
+2871 3291 1
+2871 3309 1
+2871 3313 1
+2871 3338 1
+2871 3352 1
+2871 3393 1
+2871 3439 1
+2871 3443 1
+2871 3447 1
+2871 3452 1
+2871 3455 1
+2871 3456 1
+2871 3537 1
+2871 3557 1
+2871 3562 1
+2871 3568 1
+2871 3615 1
+2871 3643 1
+2871 3650 1
+2871 3661 1
+2871 3717 1
+2871 3720 1
+2871 3748 1
+2871 3755 1
+2871 3796 1
+2871 3803 1
+2871 3806 1
+2871 3812 1
+2871 3813 1
+2871 3816 1
+2871 3843 1
+2871 3847 1
+2871 3854 1
+2871 3871 1
+2871 3887 1
+2871 3892 1
+2871 3897 1
+2871 3898 1
+2871 3903 1
+2871 3926 1
+2871 3937 1
+2871 3946 1
+2871 3949 1
+2871 3967 1
+2871 3970 1
+2871 4011 1
+2871 4013 1
+2871 4021 1
+2871 4024 1
+2871 4030 1
+2871 4037 1
+2871 4043 1
+2871 4049 1
+2871 4051 1
+2871 4055 1
+2871 4088 1
+2871 4103 1
+2871 4110 1
+2871 4127 1
+2871 4138 1
+2871 4162 1
+2871 4173 1
+2871 4179 1
+2871 4181 1
+2871 4183 1
+2871 4189 1
+2871 4191 1
+2871 4212 1
+2871 4256 1
+2871 4261 1
+2871 4263 1
+2871 4266 1
+2871 4269 1
+2871 4297 1
+2871 4298 1
+2871 4315 1
+2871 4335 1
+2871 4338 1
+2871 4400 1
+2871 4466 1
+2871 4468 1
+2871 4482 1
+2871 4510 1
+2871 4529 1
+2871 4534 1
+2871 4547 1
+2871 4551 1
+2871 4587 1
+2871 4588 1
+2871 4661 1
+2871 4662 1
+2871 4666 1
+2871 4706 1
+2871 4719 1
+2871 4777 1
+2871 4780 1
+2871 4792 1
+2871 4820 1
+2871 4824 1
+2871 4827 1
+2871 4929 1
+2871 4953 1
+2871 4962 1
+2871 4964 1
+2871 4999 1
+2871 5022 1
+2871 5026 1
+2871 5055 1
+2871 5073 1
+2871 5106 1
+2871 5130 1
+2871 5132 1
+2871 5144 1
+2871 5162 1
+2871 5204 1
+2871 5210 1
+2871 5222 1
+2871 5285 1
+2871 5288 1
+2871 5308 1
+2871 5509 1
+2871 5539 1
+2871 5563 1
+2871 5651 1
+2871 5737 1
+2871 5775 1
+2871 5817 1
+2871 8293 1
+2871 8294 1
+2864 214 1
+2865 214 1
+2865 2599 1
+2872 214 1
+2872 290 1
+2872 465 1
+2872 608 1
+2872 762 1
+2872 778 1
+2872 1211 1
+2872 1297 1
+2872 1307 1
+2872 1393 1
+2872 1437 1
+2872 1453 1
+2872 1549 1
+2872 1679 1
+2872 1705 1
+2872 1706 1
+2872 1915 1
+2872 2114 1
+2872 2135 1
+2872 2225 1
+2872 2323 1
+2872 2470 1
+2872 2506 1
+2872 2508 1
+2872 2535 1
+2872 2544 1
+2872 2619 1
+2872 2625 1
+2872 2651 1
+2872 2653 1
+2872 2697 1
+2872 2721 1
+2872 2727 1
+2872 2746 1
+2872 2790 1
+2872 2838 1
+2872 2877 1
+2872 2918 1
+2872 2979 1
+2872 2981 1
+2872 3005 1
+2872 3007 1
+2872 3024 1
+2872 3028 1
+2872 3084 1
+2872 3145 1
+2872 3180 1
+2872 3243 1
+2872 3253 1
+2872 3258 1
+2872 3260 1
+2872 3313 1
+2872 3338 1
+2872 3557 1
+2872 3562 1
+2872 3681 1
+2872 3717 1
+2872 3720 1
+2872 3800 1
+2872 3803 1
+2872 3807 1
+2872 3816 1
+2872 3843 1
+2872 3847 1
+2872 3871 1
+2872 3892 1
+2872 3903 1
+2872 3926 1
+2872 3937 1
+2872 3946 1
+2872 3967 1
+2872 3970 1
+2872 3973 1
+2872 4011 1
+2872 4021 1
+2872 4024 1
+2872 4031 1
+2872 4043 1
+2872 4051 1
+2872 4055 1
+2872 4088 1
+2872 4103 1
+2872 4110 1
+2872 4117 1
+2872 4162 1
+2872 8293 1
+2872 8294 1
+2875 1393 1
+2875 2625 1
+2875 2877 1
+2875 3307 1
+2875 3351 1
+2875 5020 1
+2876 2877 1
+2880 1453 1
+2880 2686 1
+2879 2880 1
+2881 2880 1
+2882 2880 1
+2883 856 1
+2883 1211 1
+2883 1416 1
+2883 1799 1
+2883 2277 1
+2883 2323 1
+2883 2662 1
+2883 2822 1
+2883 2880 1
+2883 2968 1
+2883 3021 1
+2883 3103 1
+2883 3274 1
+2883 3408 1
+2883 3755 1
+2883 3897 1
+2883 4068 1
+2883 4098 1
+2883 4211 1
+2883 4247 1
+2883 4310 1
+2883 4448 1
+2883 5020 1
+2883 5226 1
+2883 5387 1
+2883 5559 1
+2883 5640 1
+2883 5947 1
+2884 2880 1
+2885 1315 1
+2885 2323 1
+2885 2880 1
+2885 2972 1
+2885 2977 1
+2467 2470 1
+2467 3871 1
+2467 6221 1
+2467 8293 1
+2896 2470 1
+2568 1808 1
+2568 2470 1
+2568 3453 1
+2568 3835 1
+2886 2470 1
+2886 3238 1
+2886 7694 1
+2887 2470 1
+2888 2470 1
+2464 2470 1
+2889 737 1
+2889 2398 1
+2889 2470 1
+2889 3027 1
+2889 3459 1
+2889 4653 1
+2889 4687 1
+2889 4712 1
+2889 4899 1
+2889 5155 1
+2889 5430 1
+2889 5449 1
+2889 5925 1
+2889 6790 1
+2890 2470 1
+2891 2470 1
+2892 2470 1
+2893 2470 1
+2894 2470 1
+2895 2470 1
+2898 2174 1
+2898 2297 1
+2901 290 1
+2901 2174 1
+2901 2625 1
+2901 3068 1
+2899 2174 1
+2900 204 1
+2900 285 1
+2900 290 1
+2900 974 1
+2900 1267 1
+2900 1297 1
+2900 1549 1
+2900 1571 1
+2900 1633 1
+2900 1705 1
+2900 1706 1
+2900 1754 1
+2900 1918 1
+2900 2066 1
+2900 2134 1
+2900 2174 1
+2900 2593 1
+2900 2594 1
+2900 2625 1
+2900 2651 1
+2900 2654 1
+2900 2657 1
+2900 2790 1
+2900 2815 1
+2900 2922 1
+2900 3089 1
+2900 3253 1
+2900 3650 1
+2900 4247 1
+2905 2053 1
+2905 3830 1
+2905 5254 1
+2905 6613 1
+2903 1679 1
+2903 2053 1
+2903 2398 1
+2903 2625 1
+2903 3956 1
+2903 4735 1
+2903 4796 1
+2903 5404 1
+2904 1211 1
+2904 1357 1
+2904 1416 1
+2904 1549 1
+2904 1734 1
+2904 1754 1
+2904 1918 1
+2904 1919 1
+2904 2053 1
+2904 2323 1
+2904 2411 1
+2904 2565 1
+2904 2593 1
+2904 2999 1
+2904 3104 1
+2904 3117 1
+2904 3164 1
+2904 3265 1
+2906 554 1
+2906 2654 1
+2906 2910 1
+2906 3059 1
+2906 3084 1
+2906 3352 1
+2907 2398 1
+2907 2910 1
+2907 3352 1
+2907 4605 1
+2907 7632 1
+2907 7809 1
+2908 2535 1
+2908 2542 1
+2908 2623 1
+2908 2910 1
+2908 3018 1
+2908 5233 1
+2908 5753 1
+2908 6004 1
+2908 6251 1
+2908 7301 1
+2908 7620 1
+2908 7632 1
+2909 737 1
+2909 1310 1
+2909 1754 1
+2909 2135 1
+2909 2237 1
+2909 2384 1
+2909 2398 1
+2909 2485 1
+2909 2516 1
+2909 2535 1
+2909 2625 1
+2909 2651 1
+2909 2654 1
+2909 2657 1
+2909 2697 1
+2909 2910 1
+2909 3033 1
+2909 3125 1
+2909 3130 1
+2909 3144 1
+2909 3260 1
+2909 3352 1
+2909 3417 1
+2909 3443 1
+2909 3456 1
+2909 3643 1
+2909 3726 1
+2909 3835 1
+2909 3897 1
+2909 3910 1
+2909 3976 1
+2909 4124 1
+2909 4191 1
+2909 4310 1
+2909 4335 1
+2909 4528 1
+2909 4534 1
+2909 4587 1
+2909 4653 1
+2909 4712 1
+2909 4735 1
+2909 5123 1
+2909 5155 1
+2909 5189 1
+2909 5222 1
+2909 5387 1
+2909 5412 1
+2909 5470 1
+2909 5640 1
+2909 5651 1
+2909 5886 1
+2909 5969 1
+2909 6594 1
+2909 6774 1
+2909 6832 1
+2909 7168 1
+2909 8294 1
+2912 1357 1
+2912 1393 1
+2912 1416 1
+2912 1734 1
+2912 1754 1
+2912 1769 1
+2912 1919 1
+2912 2072 1
+2912 2135 1
+2912 2231 1
+2912 2251 1
+2912 2325 1
+2912 2356 1
+2912 2371 1
+2912 2416 1
+2912 2456 1
+2912 2474 1
+2912 2576 1
+2912 2593 1
+2912 2625 1
+2912 2654 1
+2912 2724 1
+2912 2900 1
+2912 3020 1
+2912 3021 1
+2912 3033 1
+2912 3034 1
+2912 3099 1
+2912 3104 1
+2912 3265 1
+2912 4037 1
+2912 4233 1
+2912 4463 1
+2913 417 1
+2913 1305 1
+2913 1705 1
+2913 2066 1
+2913 2375 1
+2913 2398 1
+2913 2416 1
+2913 2918 1
+2913 2922 1
+2913 3005 1
+2913 5697 1
+2916 1705 1
+2917 1705 1
+2917 4735 1
+2918 1705 1
+2918 2375 1
+2918 2922 1
+2919 1211 1
+2919 1705 1
+2921 2918 1
+2923 1211 1
+2923 1297 1
+2923 1734 1
+2923 2252 1
+2923 2256 1
+2923 2307 1
+2923 2328 1
+2923 2375 1
+2923 2411 1
+2923 2474 1
+2923 2485 1
+2923 2535 1
+2923 2585 1
+2923 2653 1
+2923 2657 1
+2923 2746 1
+2923 2972 1
+2923 2979 1
+2923 2990 1
+2923 3020 1
+2923 3026 1
+2923 3028 1
+2923 3117 1
+2923 3265 1
+2923 3291 1
+2923 3394 1
+2923 3454 1
+2923 3516 1
+2923 3537 1
+2923 3568 1
+2923 3629 1
+2923 3646 1
+2923 3680 1
+2923 3724 1
+2923 4547 1
+2924 2375 1
+2924 2928 1
+2925 425 1
+2925 1211 1
+2925 1596 1
+2925 1808 1
+2925 1918 1
+2925 2547 1
+2925 2625 1
+2925 2646 1
+2925 2651 1
+2925 2877 1
+2925 2926 1
+2925 2946 1
+2925 2955 1
+2925 2956 1
+2925 2972 1
+2925 2977 1
+2925 2979 1
+2925 3265 1
+2925 8178 1
+2928 2877 1
+2929 2877 1
+2930 2877 1
+2932 15 1
+2932 762 1
+2932 1157 1
+2932 1211 1
+2932 1297 1
+2932 1549 1
+2932 1648 1
+2932 1688 1
+2932 1777 1
+2932 1918 1
+2932 2145 1
+2932 2328 1
+2932 2485 1
+2932 2547 1
+2932 2565 1
+2932 2594 1
+2932 2651 1
+2932 2667 1
+2932 2877 1
+2932 2955 1
+2932 2958 1
+2932 3028 1
+2932 3059 1
+2932 3140 1
+2932 3192 1
+2932 3291 1
+2932 3321 1
+2932 3394 1
+2932 3417 1
+2932 3439 1
+2932 3454 1
+2932 3480 1
+2932 3537 1
+2932 3557 1
+2932 3568 1
+2932 3615 1
+2932 3635 1
+2932 3646 1
+2932 3661 1
+2932 3724 1
+2932 3812 1
+2932 3969 1
+2932 3976 1
+2932 4065 1
+2932 4191 1
+2932 4231 1
+2932 4235 1
+2932 4254 1
+2932 4261 1
+2932 4266 1
+2932 4272 1
+2932 4323 1
+2932 4365 1
+2932 4373 1
+2932 4463 1
+2932 4661 1
+2932 4735 1
+2932 4814 1
+2932 4875 1
+2932 5103 1
+2932 5828 1
+2932 7301 1
+2931 2877 1
+2931 7316 1
+2933 1211 1
+2933 2724 1
+2933 2877 1
+2933 2946 1
+2933 3068 1
+2933 3253 1
+2935 425 1
+2935 1808 1
+2935 2517 1
+2935 2646 1
+2935 2811 1
+2935 2871 1
+2935 3002 1
+2935 3321 1
+2935 3447 1
+2935 3452 1
+2935 3455 1
+2935 3537 1
+2935 3607 1
+2935 3835 1
+2935 3854 1
+2935 3958 1
+2935 4124 1
+2935 4298 1
+2935 4466 1
+2935 4588 1
+2935 4613 1
+2935 4661 1
+2935 4662 1
+2935 4719 1
+2935 4735 1
+2935 4792 1
+2935 4797 1
+2935 4815 1
+2935 4938 1
+2935 4962 1
+2935 4983 1
+2935 4999 1
+2935 5055 1
+2935 5058 1
+2935 5083 1
+2935 5092 1
+2914 1754 1
+2914 1808 1
+2914 2963 1
+2914 4792 1
+2939 1211 1
+2939 1633 1
+2939 2411 1
+2939 2657 1
+2939 2707 1
+2939 3529 1
+2939 3669 1
+2938 1211 1
+2940 15 1
+2940 285 1
+2940 290 1
+2940 417 1
+2940 762 1
+2940 825 1
+2940 938 1
+2940 1026 1
+2940 1157 1
+2940 1166 1
+2940 1211 1
+2940 1352 1
+2940 1571 1
+2940 1633 1
+2940 1744 1
+2940 1919 1
+2940 1990 1
+2940 2016 1
+2940 2114 1
+2940 2135 1
+2940 2210 1
+2940 2240 1
+2940 2251 1
+2940 2273 1
+2940 2290 1
+2940 2297 1
+2940 2324 1
+2940 2325 1
+2940 2338 1
+2940 2433 1
+2940 2485 1
+2940 2510 1
+2940 2565 1
+2940 2576 1
+2940 2593 1
+2940 2594 1
+2940 2619 1
+2940 2623 1
+2940 2625 1
+2940 2653 1
+2940 2657 1
+2940 2660 1
+2940 2667 1
+2940 2693 1
+2940 2700 1
+2940 2727 1
+2940 2851 1
+2940 2912 1
+2940 2932 1
+2940 2958 1
+2940 2973 1
+2940 2974 1
+2940 2977 1
+2940 3005 1
+2940 3009 1
+2940 3026 1
+2940 3028 1
+2940 3056 1
+2940 3114 1
+2940 3117 1
+2940 3148 1
+2940 3238 1
+2940 3266 1
+2940 3291 1
+2940 3307 1
+2940 3351 1
+2940 3404 1
+2940 3408 1
+2940 3480 1
+2940 3489 1
+2940 3557 1
+2940 3681 1
+2940 3769 1
+2940 3772 1
+2940 3792 1
+2940 3800 1
+2940 3803 1
+2940 3804 1
+2940 3807 1
+2940 3847 1
+2940 3892 1
+2940 3897 1
+2940 4049 1
+2940 4055 1
+2940 4134 1
+2940 4162 1
+2940 4173 1
+2940 4179 1
+2940 4201 1
+2940 4218 1
+2940 4485 1
+2940 4980 1
+2940 5020 1
+2940 5079 1
+2940 5179 1
+2940 5233 1
+2940 5298 1
+2940 5626 1
+2940 5806 1
+2940 5872 1
+2940 5950 1
+2940 5969 1
+2940 6000 1
+2940 6004 1
+2940 6306 1
+2940 6462 1
+2940 6496 1
+2940 6505 1
+2940 6595 1
+2940 6600 1
+2940 6682 1
+2940 6755 1
+2940 6780 1
+2940 6784 1
+2940 6897 1
+2940 7012 1
+2940 7116 1
+2940 7162 1
+2940 7254 1
+2940 7277 1
+2940 7301 1
+2940 7389 1
+2940 7618 1
+2941 974 1
+2941 1211 1
+2941 2535 1
+2941 2693 1
+2941 2747 1
+2941 3549 1
+2941 3609 1
+2941 3970 1
+2941 5058 1
+2941 7054 1
+2941 8141 1
+2936 1211 1
+2936 2815 1
+2936 2946 1
+2936 2999 1
+2936 3148 1
+2936 5902 1
+2936 7517 1
+2936 8186 1
+2944 2946 1
+2945 2946 1
+2947 1291 1
+2947 2485 1
+2947 2547 1
+2947 2660 1
+2947 2968 1
+2947 3029 1
+2947 3253 1
+2947 3352 1
+2947 3489 1
+2947 4043 1
+2948 762 1
+2948 1357 1
+2948 1416 1
+2948 1437 1
+2948 1734 1
+2948 1754 1
+2948 1781 1
+2948 2251 1
+2948 2371 1
+2948 2547 1
+2948 2550 1
+2948 2593 1
+2948 2654 1
+2948 2697 1
+2948 2830 1
+2948 2856 1
+2948 2900 1
+2948 3033 1
+2948 3089 1
+2948 3117 1
+2948 3130 1
+2948 3140 1
+2948 3150 1
+2948 3164 1
+2948 3193 1
+2948 8293 1
+2949 2547 1
+2950 1315 1
+2950 1596 1
+2950 2323 1
+2950 2547 1
+2950 2560 1
+2950 2707 1
+2950 2815 1
+2950 2963 1
+2950 2966 1
+2950 2972 1
+2950 2977 1
+2950 2993 1
+2950 2999 1
+2951 72 1
+2951 1185 1
+2951 1385 1
+2951 2145 1
+2951 2297 1
+2951 2547 1
+2951 2576 1
+2951 2625 1
+2951 2660 1
+2951 2760 1
+2951 2790 1
+2951 3014 1
+2951 3489 1
+2951 3615 1
+2951 3976 1
+2951 4297 1
+2951 4411 1
+2951 4463 1
+2951 4531 1
+2952 2955 1
+2953 290 1
+2953 1688 1
+2953 1706 1
+2953 2338 1
+2953 2371 1
+2953 2485 1
+2953 2654 1
+2953 2871 1
+2953 2955 1
+2953 5106 1
+2954 2955 1
+2957 1918 1
+2958 1026 1
+2958 1267 1
+2958 1918 1
+2958 2066 1
+2958 2134 1
+2958 2225 1
+2958 2256 1
+2958 2323 1
+2958 2328 1
+2958 2411 1
+2958 2474 1
+2958 2510 1
+2958 2585 1
+2958 2594 1
+2958 2625 1
+2958 2646 1
+2958 2727 1
+2958 2746 1
+2958 2790 1
+2958 2830 1
+2958 2856 1
+2958 3005 1
+2958 3084 1
+2958 3089 1
+2958 3117 1
+2958 3125 1
+2958 3265 1
+2958 3291 1
+2958 3352 1
+2958 3394 1
+2958 3439 1
+2958 3516 1
+2958 3645 1
+2958 3650 1
+2958 3892 1
+2958 3898 1
+2958 3903 1
+2958 4256 1
+2958 4290 1
+2958 4299 1
+2958 4400 1
+2958 4528 1
+2958 4530 1
+2958 4735 1
+2958 5412 1
+2958 5772 1
+2958 7620 1
+2960 2963 1
+2961 2963 1
+2962 2963 1
+2964 633 1
+2964 825 1
+2964 856 1
+2964 1140 1
+2964 1239 1
+2964 1267 1
+2964 1305 1
+2964 1307 1
+2964 1360 1
+2964 1385 1
+2964 1437 1
+2964 1734 1
+2964 1919 1
+2964 2066 1
+2964 2134 1
+2964 2210 1
+2964 2225 1
+2964 2237 1
+2964 2256 1
+2964 2384 1
+2964 2595 1
+2964 2651 1
+2964 2653 1
+2964 2654 1
+2964 2655 1
+2964 2662 1
+2964 2746 1
+2964 2859 1
+2964 2932 1
+2964 2951 1
+2964 2958 1
+2964 2966 1
+2964 2981 1
+2964 3021 1
+2964 3033 1
+2964 3034 1
+2964 3192 1
+2964 3251 1
+2964 3258 1
+2964 3265 1
+2964 3291 1
+2964 3307 1
+2964 3309 1
+2964 3320 1
+2964 3321 1
+2964 3351 1
+2964 3394 1
+2964 3408 1
+2964 3453 1
+2964 3615 1
+2964 4011 1
+2964 4013 1
+2964 4021 1
+2964 4043 1
+2964 4055 1
+2964 4110 1
+2964 4162 1
+2964 4179 1
+2964 4201 1
+2964 4216 1
+2964 4247 1
+2964 4256 1
+2964 4263 1
+2964 4269 1
+2964 4289 1
+2964 4290 1
+2964 4424 1
+2964 4646 1
+2964 8293 1
+2964 8294 1
+2965 2966 1
+2965 2993 1
+2967 417 1
+2967 762 1
+2967 825 1
+2967 974 1
+2967 1157 1
+2967 1166 1
+2967 1239 1
+2967 1297 1
+2967 1305 1
+2967 1307 1
+2967 1310 1
+2967 1315 1
+2967 1549 1
+2967 1571 1
+2967 1688 1
+2967 1729 1
+2967 1734 1
+2967 1754 1
+2967 1769 1
+2967 1984 1
+2967 2014 1
+2967 2016 1
+2967 2066 1
+2967 2114 1
+2967 2129 1
+2967 2134 1
+2967 2144 1
+2967 2145 1
+2967 2209 1
+2967 2210 1
+2967 2237 1
+2967 2240 1
+2967 2252 1
+2967 2256 1
+2967 2257 1
+2967 2290 1
+2967 2297 1
+2967 2325 1
+2967 2326 1
+2967 2328 1
+2967 2354 1
+2967 2356 1
+2967 2364 1
+2967 2371 1
+2967 2381 1
+2967 2384 1
+2967 2398 1
+2967 2411 1
+2967 2433 1
+2967 2456 1
+2967 2474 1
+2967 2485 1
+2967 2506 1
+2967 2516 1
+2967 2517 1
+2967 2565 1
+2967 2576 1
+2967 2595 1
+2967 2597 1
+2967 2612 1
+2967 2646 1
+2967 2653 1
+2967 2654 1
+2967 2655 1
+2967 2657 1
+2967 2660 1
+2967 2674 1
+2967 2693 1
+2967 2696 1
+2967 2697 1
+2967 2707 1
+2967 2760 1
+2967 2775 1
+2967 2787 1
+2967 2790 1
+2967 2859 1
+2967 2871 1
+2967 2900 1
+2967 2912 1
+2967 2918 1
+2967 2932 1
+2967 2958 1
+2967 2966 1
+2967 2968 1
+2967 2981 1
+2967 3002 1
+2967 3005 1
+2967 3007 1
+2967 3009 1
+2967 3010 1
+2967 3014 1
+2967 3026 1
+2967 3029 1
+2967 3034 1
+2967 3059 1
+2967 3073 1
+2967 3117 1
+2967 3140 1
+2967 3148 1
+2967 3173 1
+2967 3192 1
+2967 3258 1
+2967 3265 1
+2967 3276 1
+2967 3284 1
+2967 3291 1
+2967 3309 1
+2967 3321 1
+2967 3334 1
+2967 3346 1
+2967 3351 1
+2967 3352 1
+2967 3394 1
+2967 3404 1
+2967 3435 1
+2967 3439 1
+2967 3447 1
+2967 3453 1
+2967 3455 1
+2967 3456 1
+2967 3458 1
+2967 3463 1
+2967 3479 1
+2967 3520 1
+2967 3529 1
+2967 3538 1
+2967 3562 1
+2967 3568 1
+2967 3580 1
+2967 3587 1
+2967 3607 1
+2967 3609 1
+2967 3615 1
+2967 3631 1
+2967 3635 1
+2967 3643 1
+2967 3660 1
+2967 3680 1
+2967 3691 1
+2967 3717 1
+2967 3724 1
+2967 3748 1
+2967 3787 1
+2967 3796 1
+2967 3806 1
+2967 3813 1
+2967 3843 1
+2967 3847 1
+2967 3854 1
+2967 3871 1
+2967 3903 1
+2967 3912 1
+2967 3956 1
+2967 3958 1
+2967 3976 1
+2967 4011 1
+2967 4013 1
+2967 4021 1
+2967 4024 1
+2967 4037 1
+2967 4040 1
+2967 4043 1
+2967 4044 1
+2967 4055 1
+2967 4086 1
+2967 4088 1
+2967 4099 1
+2967 4103 1
+2967 4110 1
+2967 4117 1
+2967 4124 1
+2967 4138 1
+2967 4162 1
+2967 4179 1
+2967 4181 1
+2967 4191 1
+2967 4201 1
+2967 4212 1
+2967 4219 1
+2967 4220 1
+2967 4233 1
+2967 4234 1
+2967 4247 1
+2967 4256 1
+2967 4261 1
+2967 4263 1
+2967 4266 1
+2967 4269 1
+2967 4289 1
+2967 4290 1
+2967 4297 1
+2967 4335 1
+2967 4422 1
+2967 4453 1
+2967 4471 1
+2967 4485 1
+2967 4510 1
+2967 4551 1
+2967 4574 1
+2967 4578 1
+2967 4600 1
+2967 4613 1
+2967 4653 1
+2967 4661 1
+2967 4662 1
+2967 4666 1
+2967 4706 1
+2967 4719 1
+2967 4735 1
+2967 4792 1
+2967 4796 1
+2967 4811 1
+2967 4814 1
+2967 4827 1
+2967 4828 1
+2967 4938 1
+2967 4953 1
+2967 4962 1
+2967 4999 1
+2967 5026 1
+2967 5055 1
+2967 5058 1
+2967 5073 1
+2967 5083 1
+2967 5092 1
+2967 5100 1
+2967 5106 1
+2967 5130 1
+2967 5132 1
+2967 5176 1
+2967 5445 1
+2967 5459 1
+2967 5511 1
+2967 6148 1
+2967 6306 1
+2967 6400 1
+2967 8293 1
+2967 8294 1
+2968 465 1
+2968 762 1
+2968 1166 1
+2968 1357 1
+2968 1416 1
+2968 1633 1
+2968 1679 1
+2968 1754 1
+2968 1982 1
+2968 2135 1
+2968 2225 1
+2968 2251 1
+2968 2258 1
+2968 2297 1
+2968 2542 1
+2968 2576 1
+2968 2605 1
+2968 2653 1
+2968 2658 1
+2968 2697 1
+2968 2785 1
+2968 2966 1
+2968 3026 1
+2968 3089 1
+2968 3117 1
+2968 3265 1
+2968 3276 1
+2968 3293 1
+2968 3338 1
+2968 3394 1
+2968 3454 1
+2968 3456 1
+2968 3473 1
+2968 3489 1
+2968 3516 1
+2968 3557 1
+2968 3562 1
+2968 3650 1
+2968 3724 1
+2968 4124 1
+2968 4173 1
+2968 4179 1
+2968 4191 1
+2968 4234 1
+2968 4349 1
+2968 4735 1
+2968 4983 1
+2968 5072 1
+2968 5073 1
+2968 5148 1
+2968 5459 1
+2968 5582 1
+2968 7620 1
+2968 7699 1
+2968 7908 1
+2972 15 1
+2972 222 1
+2972 406 1
+2972 608 1
+2972 737 1
+2972 778 1
+2972 825 1
+2972 896 1
+2972 1159 1
+2972 1239 1
+2972 1247 1
+2972 1305 1
+2972 1310 1
+2972 1360 1
+2972 1549 1
+2972 1680 1
+2972 1688 1
+2972 1733 1
+2972 1769 1
+2972 1799 1
+2972 1972 1
+2972 1990 1
+2972 2001 1
+2972 2134 1
+2972 2144 1
+2972 2145 1
+2972 2237 1
+2972 2240 1
+2972 2273 1
+2972 2328 1
+2972 2364 1
+2972 2369 1
+2972 2381 1
+2972 2440 1
+2972 2507 1
+2972 2511 1
+2972 2517 1
+2972 2552 1
+2972 2565 1
+2972 2576 1
+2972 2592 1
+2972 2605 1
+2972 2612 1
+2972 2619 1
+2972 2646 1
+2972 2653 1
+2972 2689 1
+2972 2696 1
+2972 2746 1
+2972 2760 1
+2972 2787 1
+2972 2811 1
+2972 2822 1
+2972 2831 1
+2972 2859 1
+2972 2871 1
+2972 2909 1
+2972 2914 1
+2972 2932 1
+2972 2958 1
+2972 2973 1
+2972 2981 1
+2972 3002 1
+2972 3027 1
+2972 3028 1
+2972 3089 1
+2972 3092 1
+2972 3103 1
+2972 3125 1
+2972 3140 1
+2972 3144 1
+2972 3192 1
+2972 3258 1
+2972 3274 1
+2972 3291 1
+2972 3320 1
+2972 3321 1
+2972 3334 1
+2972 3352 1
+2972 3376 1
+2972 3417 1
+2972 3433 1
+2972 3439 1
+2972 3447 1
+2972 3452 1
+2972 3453 1
+2972 3454 1
+2972 3456 1
+2972 3460 1
+2972 3479 1
+2972 3498 1
+2972 3537 1
+2972 3557 1
+2972 3562 1
+2972 3568 1
+2972 3607 1
+2972 3615 1
+2972 3634 1
+2972 3635 1
+2972 3645 1
+2972 3650 1
+2972 3661 1
+2972 3664 1
+2972 3691 1
+2972 3720 1
+2972 3748 1
+2972 3755 1
+2972 3796 1
+2972 3800 1
+2972 3816 1
+2972 3835 1
+2972 3843 1
+2972 3854 1
+2972 3873 1
+2972 3885 1
+2972 3898 1
+2972 3903 1
+2972 3910 1
+2972 3919 1
+2972 3926 1
+2972 3946 1
+2972 3956 1
+2972 3958 1
+2972 3967 1
+2972 3973 1
+2972 4012 1
+2972 4030 1
+2972 4031 1
+2972 4037 1
+2972 4040 1
+2972 4043 1
+2972 4044 1
+2972 4047 1
+2972 4055 1
+2972 4058 1
+2972 4099 1
+2972 4103 1
+2972 4124 1
+2972 4162 1
+2972 4173 1
+2972 4175 1
+2972 4212 1
+2972 4219 1
+2972 4247 1
+2972 4261 1
+2972 4263 1
+2972 4266 1
+2972 4269 1
+2972 4297 1
+2972 4298 1
+2972 4299 1
+2972 4315 1
+2972 4331 1
+2972 4335 1
+2972 4338 1
+2972 4351 1
+2972 4361 1
+2972 4400 1
+2972 4411 1
+2972 4412 1
+2972 4422 1
+2972 4448 1
+2972 4453 1
+2972 4468 1
+2972 4482 1
+2972 4485 1
+2972 4500 1
+2972 4507 1
+2972 4527 1
+2972 4528 1
+2972 4529 1
+2972 4534 1
+2972 4536 1
+2972 4547 1
+2972 4551 1
+2972 4562 1
+2972 4578 1
+2972 4587 1
+2972 4600 1
+2972 4604 1
+2972 4613 1
+2972 4625 1
+2972 4631 1
+2972 4653 1
+2972 4661 1
+2972 4662 1
+2972 4666 1
+2972 4689 1
+2972 4706 1
+2972 4712 1
+2972 4717 1
+2972 4719 1
+2972 4735 1
+2972 4748 1
+2972 4780 1
+2972 4792 1
+2972 4795 1
+2972 4796 1
+2972 4797 1
+2972 4811 1
+2972 4814 1
+2972 4815 1
+2972 4824 1
+2972 4827 1
+2972 4828 1
+2972 4831 1
+2972 4846 1
+2972 4866 1
+2972 4899 1
+2972 4929 1
+2972 4934 1
+2972 4938 1
+2972 4964 1
+2972 4986 1
+2972 4987 1
+2972 4992 1
+2972 4999 1
+2972 5026 1
+2972 5055 1
+2972 5061 1
+2972 5073 1
+2972 5092 1
+2972 5100 1
+2972 5106 1
+2972 5130 1
+2972 5132 1
+2972 5140 1
+2972 5144 1
+2972 5155 1
+2972 5176 1
+2972 5178 1
+2972 5199 1
+2972 5204 1
+2972 5208 1
+2972 5210 1
+2972 5222 1
+2972 5226 1
+2972 5233 1
+2972 5239 1
+2972 5245 1
+2972 5254 1
+2972 5262 1
+2972 5273 1
+2972 5295 1
+2972 5298 1
+2972 5305 1
+2972 5326 1
+2972 5335 1
+2972 5387 1
+2972 5392 1
+2972 5404 1
+2972 5412 1
+2972 5415 1
+2972 5423 1
+2972 5430 1
+2972 5449 1
+2972 5459 1
+2972 5463 1
+2972 5467 1
+2972 5484 1
+2972 5506 1
+2972 5513 1
+2972 5524 1
+2972 5545 1
+2972 5559 1
+2972 5563 1
+2972 5626 1
+2972 5637 1
+2972 5638 1
+2972 5639 1
+2972 5663 1
+2972 5693 1
+2972 5694 1
+2972 5697 1
+2972 5705 1
+2972 5721 1
+2972 5732 1
+2972 5737 1
+2972 5738 1
+2972 5743 1
+2972 5756 1
+2972 5757 1
+2972 5775 1
+2972 5776 1
+2972 5814 1
+2972 5817 1
+2972 5818 1
+2972 5822 1
+2972 5844 1
+2972 5848 1
+2972 5969 1
+2972 5977 1
+2972 5980 1
+2972 5991 1
+2972 6097 1
+2972 6166 1
+2972 6170 1
+2972 6235 1
+2972 6246 1
+2972 6251 1
+2972 6272 1
+2972 6311 1
+2972 6330 1
+2972 6414 1
+2972 6435 1
+2972 6441 1
+2972 6458 1
+2972 6462 1
+2972 6472 1
+2972 6474 1
+2972 6481 1
+2972 6491 1
+2972 6498 1
+2972 6501 1
+2972 6503 1
+2972 6505 1
+2972 6511 1
+2972 6528 1
+2972 6543 1
+2972 6554 1
+2972 6555 1
+2972 6560 1
+2972 6566 1
+2972 6570 1
+2972 6576 1
+2972 6589 1
+2972 6594 1
+2972 6596 1
+2972 6600 1
+2972 6611 1
+2972 6632 1
+2972 6670 1
+2972 6699 1
+2972 6736 1
+2972 6765 1
+2972 6774 1
+2972 6855 1
+2972 6860 1
+2972 6869 1
+2972 6930 1
+2972 6942 1
+2972 6946 1
+2972 6955 1
+2972 6982 1
+2972 6994 1
+2972 7023 1
+2972 7074 1
+2972 7101 1
+2972 7115 1
+2972 7116 1
+2972 7119 1
+2972 7162 1
+2972 7185 1
+2972 7186 1
+2972 7734 1
+2972 8294 1
+2972 8295 1
+2971 2972 1
+2969 2655 1
+2969 2972 1
+2969 3028 1
+2970 2972 1
+2974 762 1
+2974 1915 1
+2974 2565 1
+2974 2775 1
+2974 2977 1
+2974 2981 1
+2974 3099 1
+2974 3480 1
+2974 3562 1
+2974 3720 1
+2974 4051 1
+2974 4110 1
+2974 4173 1
+2974 5743 1
+2974 8293 1
+2978 856 1
+2978 2237 1
+2978 2830 1
+2978 2977 1
+2978 3155 1
+2978 3164 1
+2980 2560 1
+2982 1596 1
+2983 1493 1
+2983 1596 1
+2983 1982 1
+2983 3014 1
+2983 4127 1
+2983 4335 1
+2983 4432 1
+2983 4940 1
+2983 5022 1
+2983 5058 1
+2983 5738 1
+2983 6618 1
+2983 6634 1
+2983 6720 1
+2983 6737 1
+2983 7391 1
+2983 7791 1
+2983 7810 1
+2983 7833 1
+2983 8051 1
+2983 8168 1
+2983 8178 1
+2983 8192 1
+2983 8198 1
+2983 8212 1
+2983 8224 1
+2983 8237 1
+2983 8249 1
+2985 1315 1
+2985 2016 1
+2985 3748 1
+2985 6347 1
+2986 1315 1
+2986 2371 1
+2986 3537 1
+2987 1315 1
+2987 1357 1
+2987 1734 1
+2987 1754 1
+2987 2371 1
+2987 2830 1
+2987 3089 1
+2987 3126 1
+2987 3130 1
+2988 737 1
+2988 1191 1
+2988 1315 1
+2988 1473 1
+2988 1493 1
+2988 2016 1
+2988 2252 1
+2988 2257 1
+2988 2328 1
+2988 2485 1
+2988 2565 1
+2988 2592 1
+2988 2653 1
+2988 2654 1
+2988 2657 1
+2988 2696 1
+2988 2819 1
+2988 3026 1
+2988 3059 1
+2988 3173 1
+2988 3192 1
+2988 3404 1
+2988 3537 1
+2988 3615 1
+2988 3772 1
+2988 3796 1
+2988 3847 1
+2988 3873 1
+2988 3897 1
+2988 4041 1
+2988 4256 1
+2988 4310 1
+2988 4335 1
+2988 4483 1
+2988 4488 1
+2988 4600 1
+2988 4653 1
+2988 4687 1
+2988 4717 1
+2988 4884 1
+2988 5058 1
+2988 5092 1
+2988 5178 1
+2988 5226 1
+2988 5262 1
+2988 5445 1
+2988 5459 1
+2988 5487 1
+2988 5511 1
+2988 5651 1
+2988 5684 1
+2988 5775 1
+2988 6148 1
+2988 6400 1
+2988 6832 1
+2989 1315 1
+2989 2371 1
+2989 2565 1
+2989 3026 1
+2989 3059 1
+2989 3173 1
+2989 3192 1
+2989 3854 1
+2989 4256 1
+2989 4999 1
+2993 2991 1
+2991 2066 1
+2991 2958 1
+2991 2993 1
+2991 3562 1
+2991 3615 1
+2991 3787 1
+2991 4179 1
+2992 2993 1
+2994 2237 1
+2994 2707 1
+2994 2993 1
+2995 2323 1
+2995 2324 1
+2995 2617 1
+2995 2993 1
+2995 3029 1
+2995 3056 1
+2995 3537 1
+2995 3567 1
+2995 4645 1
+2995 5215 1
+2998 974 1
+2998 2323 1
+2998 2830 1
+2999 825 1
+2999 1633 1
+2999 2323 1
+2999 2625 1
+2999 2822 1
+2999 3635 1
+2999 4191 1
+3007 290 1
+3007 465 1
+3007 896 1
+3007 2251 1
+3007 2323 1
+3007 2398 1
+3007 2653 1
+3007 3903 1
+3007 3914 1
+3007 4191 1
+3007 4219 1
+3007 5106 1
+3007 5484 1
+3007 5563 1
+3007 5683 1
+3000 72 1
+3000 285 1
+3000 1166 1
+3000 1633 1
+3000 1744 1
+3000 2114 1
+3000 2144 1
+3000 2225 1
+3000 2323 1
+3000 2411 1
+3000 2660 1
+3000 2662 1
+3000 2724 1
+3000 2819 1
+3000 2856 1
+3000 3021 1
+3000 3144 1
+3000 3276 1
+3000 3301 1
+3000 3307 1
+3000 3320 1
+3000 3408 1
+3000 3456 1
+3000 3568 1
+3000 3830 1
+3000 3919 1
+3000 4748 1
+3000 4994 1
+3000 5123 1
+3000 5178 1
+3000 5182 1
+3000 5210 1
+3000 5311 1
+3000 5800 1
+3000 5802 1
+3000 5806 1
+3000 5811 1
+3000 6424 1
+3000 6599 1
+3000 6715 1
+3000 6832 1
+3000 6840 1
+3000 8297 1
+3001 2323 1
+3001 2485 1
+3001 2542 1
+3001 2654 1
+3001 3192 1
+3001 3352 1
+3001 3408 1
+3002 2323 1
+3002 2364 1
+3002 3456 1
+3002 5123 1
+3002 5412 1
+3008 2323 1
+3003 2323 1
+3009 204 1
+3009 417 1
+3009 762 1
+3009 974 1
+3009 1385 1
+3009 1733 1
+3009 2145 1
+3009 2252 1
+3009 2290 1
+3009 2297 1
+3009 2323 1
+3009 2328 1
+3009 2433 1
+3009 2508 1
+3009 2565 1
+3009 2576 1
+3009 2585 1
+3009 2653 1
+3009 2660 1
+3009 2667 1
+3009 2693 1
+3009 2765 1
+3009 2774 1
+3009 3103 1
+3009 3140 1
+3009 3144 1
+3009 3148 1
+3009 3276 1
+3009 3547 1
+3009 3614 1
+3009 3643 1
+3009 3650 1
+3009 3724 1
+3009 3812 1
+3009 4338 1
+3009 4365 1
+3009 4373 1
+3009 4384 1
+3009 4400 1
+3009 4422 1
+3009 4510 1
+3009 4528 1
+3009 4529 1
+3009 4578 1
+3009 4666 1
+3009 5072 1
+3009 5182 1
+3009 5524 1
+3009 5543 1
+3009 5756 1
+3009 6417 1
+3004 15 1
+3004 2323 1
+3004 3443 1
+3005 290 1
+3005 417 1
+3005 974 1
+3005 1307 1
+3005 1357 1
+3005 1549 1
+3005 2066 1
+3005 2210 1
+3005 2256 1
+3005 2297 1
+3005 2323 1
+3005 2474 1
+3005 2576 1
+3005 2585 1
+3005 2594 1
+3005 2625 1
+3005 2654 1
+3005 2700 1
+3005 3024 1
+3005 3030 1
+3005 3260 1
+3005 3265 1
+3005 3319 1
+3005 3435 1
+3005 3529 1
+3005 3562 1
+3005 3580 1
+3005 4021 1
+3006 290 1
+3006 762 1
+3006 856 1
+3006 1267 1
+3006 1291 1
+3006 1792 1
+3006 1814 1
+3006 2225 1
+3006 2256 1
+3006 2323 1
+3006 2325 1
+3006 2356 1
+3006 2371 1
+3006 2594 1
+3006 2617 1
+3006 2654 1
+3006 2662 1
+3006 2707 1
+3006 2721 1
+3006 2856 1
+3006 2968 1
+3006 2991 1
+3006 2999 1
+3006 3020 1
+3006 3021 1
+3006 3029 1
+3006 3030 1
+3006 3050 1
+3006 3068 1
+3006 3338 1
+3006 3351 1
+3010 465 1
+3010 608 1
+3010 825 1
+3010 974 1
+3010 1166 1
+3010 1291 1
+3010 1297 1
+3010 1307 1
+3010 1549 1
+3010 1633 1
+3010 1706 1
+3010 1734 1
+3010 1744 1
+3010 1754 1
+3010 1799 1
+3010 1915 1
+3010 1990 1
+3010 2135 1
+3010 2160 1
+3010 2209 1
+3010 2251 1
+3010 2252 1
+3010 2257 1
+3010 2297 1
+3010 2324 1
+3010 2325 1
+3010 2326 1
+3010 2356 1
+3010 2411 1
+3010 2485 1
+3010 2510 1
+3010 2544 1
+3010 2565 1
+3010 2597 1
+3010 2653 1
+3010 2654 1
+3010 2657 1
+3010 2660 1
+3010 2667 1
+3010 2674 1
+3010 2693 1
+3010 2697 1
+3010 2707 1
+3010 2721 1
+3010 2727 1
+3010 2747 1
+3010 2799 1
+3010 2815 1
+3010 2973 1
+3010 2974 1
+3010 2999 1
+3010 3005 1
+3010 3007 1
+3010 3009 1
+3010 3024 1
+3010 3026 1
+3010 3028 1
+3010 3030 1
+3010 3033 1
+3010 3059 1
+3010 3084 1
+3010 3089 1
+3010 3103 1
+3010 3114 1
+3010 3117 1
+3010 3148 1
+3010 3173 1
+3010 3251 1
+3010 3265 1
+3010 3307 1
+3010 3338 1
+3010 3351 1
+3010 3352 1
+3010 3371 1
+3010 3404 1
+3010 3408 1
+3010 3435 1
+3010 3473 1
+3010 3480 1
+3010 3483 1
+3010 3520 1
+3010 3529 1
+3010 3537 1
+3010 3549 1
+3010 3557 1
+3010 3580 1
+3010 3587 1
+3010 3609 1
+3010 3629 1
+3010 3650 1
+3010 3670 1
+3010 3680 1
+3010 3717 1
+3010 3769 1
+3010 3772 1
+3010 3776 1
+3010 3807 1
+3010 3847 1
+3010 3871 1
+3010 3887 1
+3010 3892 1
+3010 3903 1
+3010 3937 1
+3010 4400 1
+3010 4712 1
+3010 4764 1
+3010 5022 1
+3010 5072 1
+3010 5130 1
+3010 5222 1
+3010 5412 1
+3010 5445 1
+3010 5449 1
+3010 5596 1
+3010 5780 1
+3010 5829 1
+3010 5871 1
+3010 6347 1
+3010 6441 1
+3010 6770 1
+3010 6783 1
+3010 8293 1
+3010 8294 1
+3011 2815 1
+3012 2999 1
+3013 2999 1
+2707 290 1
+2707 825 1
+2707 856 1
+2707 1239 1
+2707 1357 1
+2707 1385 1
+2707 1437 1
+2707 1473 1
+2707 1549 1
+2707 1633 1
+2707 1679 1
+2707 1733 1
+2707 1814 1
+2707 1919 1
+2707 2066 1
+2707 2225 1
+2707 2237 1
+2707 2251 1
+2707 2289 1
+2707 2325 1
+2707 2328 1
+2707 2338 1
+2707 2356 1
+2707 2364 1
+2707 2384 1
+2707 2398 1
+2707 2474 1
+2707 2516 1
+2707 2535 1
+2707 2565 1
+2707 2593 1
+2707 2594 1
+2707 2617 1
+2707 2619 1
+2707 2625 1
+2707 2646 1
+2707 2653 1
+2707 2662 1
+2707 2787 1
+2707 2856 1
+2707 2912 1
+2707 2958 1
+2707 2981 1
+2707 3002 1
+2707 3015 1
+2707 3020 1
+2707 3024 1
+2707 3033 1
+2707 3034 1
+2707 3073 1
+2707 3130 1
+2707 3144 1
+2707 3180 1
+2707 3258 1
+2707 3284 1
+2707 3351 1
+2707 3408 1
+2707 3439 1
+2707 3455 1
+2707 3516 1
+2707 3537 1
+2707 3568 1
+2707 3645 1
+2707 3650 1
+2707 3970 1
+2707 3973 1
+2707 4037 1
+2707 4043 1
+2707 4055 1
+2707 4088 1
+2707 4110 1
+2707 4117 1
+2707 4124 1
+2707 4179 1
+2707 4189 1
+2707 4289 1
+2707 4297 1
+2707 4335 1
+2707 4338 1
+2707 4365 1
+2707 4417 1
+2707 4422 1
+2707 4463 1
+2707 4534 1
+2707 4899 1
+2707 5055 1
+2707 5073 1
+2707 5226 1
+2707 5404 1
+2707 5432 1
+2707 5445 1
+2707 5459 1
+2707 5582 1
+2707 5637 1
+2707 5705 1
+2707 5721 1
+2707 5737 1
+2707 5775 1
+2707 6784 1
+2707 6913 1
+2707 6976 1
+2707 7301 1
+2707 7647 1
+3015 1473 1
+3015 1733 1
+3015 2001 1
+3015 2258 1
+3015 2328 1
+3015 2398 1
+3015 2707 1
+3015 3020 1
+3015 3274 1
+3015 3498 1
+3015 4037 1
+3015 4335 1
+3015 4338 1
+3015 4534 1
+3015 4536 1
+3015 4797 1
+3015 4828 1
+3015 4899 1
+3015 4980 1
+3015 5226 1
+3015 5263 1
+3015 5439 1
+3015 5445 1
+3015 5459 1
+3015 5524 1
+3015 5630 1
+3015 5638 1
+3015 5732 1
+3015 5756 1
+3015 5775 1
+3015 5780 1
+3015 5814 1
+3015 5830 1
+3015 5844 1
+3015 5926 1
+3015 5931 1
+3015 5947 1
+3015 5972 1
+3015 6010 1
+3015 6481 1
+3015 6594 1
+3015 6723 1
+3015 6784 1
+3015 6869 1
+3016 2657 1
+3016 2707 1
+3017 1291 1
+3017 2256 1
+3017 2707 1
+3018 1357 1
+3018 1754 1
+3018 1919 1
+3018 2256 1
+3018 2565 1
+3018 2623 1
+3018 2653 1
+3018 2707 1
+3018 2973 1
+3018 3034 1
+3018 3084 1
+3018 3099 1
+3018 3140 1
+3018 3371 1
+3018 3408 1
+3018 3537 1
+3018 3557 1
+3018 3680 1
+3018 3806 1
+3019 2707 1
+3020 633 1
+3020 856 1
+3020 1267 1
+3020 1357 1
+3020 1393 1
+3020 1416 1
+3020 1633 1
+3020 1679 1
+3020 1734 1
+3020 1754 1
+3020 1781 1
+3020 1792 1
+3020 1814 1
+3020 2116 1
+3020 2135 1
+3020 2225 1
+3020 2231 1
+3020 2325 1
+3020 2328 1
+3020 2356 1
+3020 2371 1
+3020 2474 1
+3020 2576 1
+3020 2593 1
+3020 2594 1
+3020 2623 1
+3020 2625 1
+3020 2651 1
+3020 2697 1
+3020 2700 1
+3020 2707 1
+3020 2713 1
+3020 2830 1
+3020 2856 1
+3020 2900 1
+3020 2912 1
+3020 2951 1
+3020 3021 1
+3020 3030 1
+3020 3089 1
+3020 3099 1
+3020 3130 1
+3020 3243 1
+3020 3251 1
+3020 3253 1
+3020 3265 1
+3020 3338 1
+3020 3363 1
+3020 3371 1
+3020 3376 1
+3020 3516 1
+3020 8293 1
+3021 285 1
+3021 1473 1
+3021 2325 1
+3021 2707 1
+3021 4071 1
+3021 6481 1
+3021 7890 1
+3022 2707 1
+3024 633 1
+3024 1166 1
+3024 1291 1
+3024 1297 1
+3024 1307 1
+3024 1453 1
+3024 1754 1
+3024 2066 1
+3024 2135 1
+3024 2225 1
+3024 2231 1
+3024 2307 1
+3024 2411 1
+3024 2485 1
+3024 2510 1
+3024 2542 1
+3024 2585 1
+3024 2594 1
+3024 2625 1
+3024 2651 1
+3024 2653 1
+3024 2660 1
+3024 2667 1
+3024 2746 1
+3024 2747 1
+3024 2900 1
+3024 2923 1
+3024 2958 1
+3024 2973 1
+3024 3005 1
+3024 3029 1
+3024 3109 1
+3024 3114 1
+3024 3117 1
+3024 3253 1
+3024 3265 1
+3024 3284 1
+3024 3307 1
+3024 3351 1
+3024 3408 1
+3024 3562 1
+3024 3580 1
+3024 3650 1
+3024 3748 1
+3024 3898 1
+3024 4173 1
+3024 4256 1
+3024 4578 1
+3024 4735 1
+3024 5697 1
+3024 5817 1
+3024 6599 1
+3025 290 1
+3025 1919 1
+3025 2237 1
+3025 2721 1
+3026 72 1
+3026 290 1
+3026 608 1
+3026 737 1
+3026 825 1
+3026 856 1
+3026 974 1
+3026 1157 1
+3026 1247 1
+3026 1297 1
+3026 1307 1
+3026 1357 1
+3026 1385 1
+3026 1437 1
+3026 1548 1
+3026 1633 1
+3026 1688 1
+3026 1706 1
+3026 1729 1
+3026 1754 1
+3026 1792 1
+3026 1799 1
+3026 1814 1
+3026 1919 1
+3026 2016 1
+3026 2066 1
+3026 2134 1
+3026 2135 1
+3026 2145 1
+3026 2209 1
+3026 2225 1
+3026 2237 1
+3026 2251 1
+3026 2252 1
+3026 2307 1
+3026 2324 1
+3026 2328 1
+3026 2338 1
+3026 2354 1
+3026 2371 1
+3026 2384 1
+3026 2411 1
+3026 2485 1
+3026 2508 1
+3026 2510 1
+3026 2516 1
+3026 2535 1
+3026 2544 1
+3026 2550 1
+3026 2565 1
+3026 2592 1
+3026 2595 1
+3026 2625 1
+3026 2651 1
+3026 2653 1
+3026 2654 1
+3026 2660 1
+3026 2667 1
+3026 2674 1
+3026 2686 1
+3026 2693 1
+3026 2696 1
+3026 2697 1
+3026 2700 1
+3026 2721 1
+3026 2747 1
+3026 2760 1
+3026 2775 1
+3026 2819 1
+3026 2859 1
+3026 2871 1
+3026 2932 1
+3026 2958 1
+3026 2973 1
+3026 3007 1
+3026 3014 1
+3026 3024 1
+3026 3027 1
+3026 3028 1
+3026 3029 1
+3026 3033 1
+3026 3050 1
+3026 3059 1
+3026 3073 1
+3026 3084 1
+3026 3092 1
+3026 3103 1
+3026 3106 1
+3026 3117 1
+3026 3144 1
+3026 3148 1
+3026 3173 1
+3026 3180 1
+3026 3192 1
+3026 3200 1
+3026 3258 1
+3026 3260 1
+3026 3265 1
+3026 3276 1
+3026 3313 1
+3026 3324 1
+3026 3352 1
+3026 3404 1
+3026 3443 1
+3026 3452 1
+3026 3454 1
+3026 3456 1
+3026 3480 1
+3026 3529 1
+3026 3537 1
+3026 3548 1
+3026 3562 1
+3026 3568 1
+3026 3587 1
+3026 3607 1
+3026 3615 1
+3026 3635 1
+3026 3643 1
+3026 3645 1
+3026 3650 1
+3026 3680 1
+3026 3720 1
+3026 3724 1
+3026 3748 1
+3026 3813 1
+3026 3843 1
+3026 3847 1
+3026 3854 1
+3026 3875 1
+3026 3892 1
+3026 3897 1
+3026 3903 1
+3026 3910 1
+3026 4011 1
+3026 4024 1
+3026 4031 1
+3026 4043 1
+3026 4051 1
+3026 4124 1
+3026 4162 1
+3026 4181 1
+3026 4183 1
+3026 4189 1
+3026 4191 1
+3026 4201 1
+3026 4234 1
+3026 4256 1
+3026 4261 1
+3026 4323 1
+3026 4335 1
+3026 4349 1
+3026 4384 1
+3026 4448 1
+3026 4453 1
+3026 4480 1
+3026 4510 1
+3026 4531 1
+3026 4536 1
+3026 4547 1
+3026 4578 1
+3026 4587 1
+3026 4600 1
+3026 4706 1
+3026 4712 1
+3026 4827 1
+3026 4962 1
+3026 4983 1
+3026 4999 1
+3026 5026 1
+3026 5055 1
+3026 5123 1
+3026 5130 1
+3026 5412 1
+3026 5452 1
+3026 8293 1
+3029 3027 1
+3029 5179 1
+3027 15 1
+3027 737 1
+3027 1310 1
+3027 1549 1
+3027 2456 1
+3027 2576 1
+3027 2774 1
+3027 2831 1
+3027 3029 1
+3027 3089 1
+3027 3456 1
+3027 3922 1
+3027 3976 1
+3027 4247 1
+3027 4310 1
+3027 4335 1
+3027 4536 1
+3027 4574 1
+3027 4712 1
+3027 4781 1
+3027 4808 1
+3027 5079 1
+3027 5178 1
+3027 5210 1
+3027 5457 1
+3027 5697 1
+3027 5863 1
+3027 5871 1
+3027 6044 1
+3027 6124 1
+3027 6441 1
+3027 6458 1
+3027 6498 1
+3027 6554 1
+3027 6576 1
+3027 6600 1
+3027 6948 1
+3027 7450 1
+3027 7478 1
+3028 72 1
+3028 417 1
+3028 465 1
+3028 525 1
+3028 608 1
+3028 737 1
+3028 762 1
+3028 825 1
+3028 978 1
+3028 1024 1
+3028 1166 1
+3028 1393 1
+3028 1633 1
+3028 1679 1
+3028 1814 1
+3028 1961 1
+3028 2145 1
+3028 2209 1
+3028 2210 1
+3028 2231 1
+3028 2237 1
+3028 2252 1
+3028 2256 1
+3028 2257 1
+3028 2297 1
+3028 2326 1
+3028 2328 1
+3028 2371 1
+3028 2398 1
+3028 2426 1
+3028 2485 1
+3028 2510 1
+3028 2535 1
+3028 2550 1
+3028 2576 1
+3028 2585 1
+3028 2619 1
+3028 2623 1
+3028 2625 1
+3028 2651 1
+3028 2653 1
+3028 2654 1
+3028 2657 1
+3028 2660 1
+3028 2674 1
+3028 2686 1
+3028 2687 1
+3028 2693 1
+3028 2799 1
+3028 2859 1
+3028 2871 1
+3028 2923 1
+3028 2958 1
+3028 2974 1
+3028 3007 1
+3028 3009 1
+3028 3026 1
+3028 3029 1
+3028 3084 1
+3028 3089 1
+3028 3130 1
+3028 3251 1
+3028 3258 1
+3028 3265 1
+3028 3271 1
+3028 3285 1
+3028 3319 1
+3028 3351 1
+3028 3352 1
+3028 3439 1
+3028 3454 1
+3028 3456 1
+3028 3473 1
+3028 3480 1
+3028 3529 1
+3028 3557 1
+3028 3567 1
+3028 3568 1
+3028 3576 1
+3028 3580 1
+3028 3614 1
+3028 3616 1
+3028 3629 1
+3028 3634 1
+3028 3635 1
+3028 3650 1
+3028 3661 1
+3028 3670 1
+3028 3776 1
+3028 3785 1
+3028 3880 1
+3028 3892 1
+3028 3897 1
+3028 3898 1
+3028 3903 1
+3028 3914 1
+3028 3922 1
+3028 3956 1
+3028 3974 1
+3028 4011 1
+3028 4078 1
+3028 4099 1
+3028 4124 1
+3028 4138 1
+3028 4189 1
+3028 4191 1
+3028 4201 1
+3028 4216 1
+3028 4218 1
+3028 4220 1
+3028 4231 1
+3028 4256 1
+3028 4297 1
+3028 4310 1
+3028 4331 1
+3028 4335 1
+3028 4384 1
+3028 4385 1
+3028 4403 1
+3028 4468 1
+3028 4485 1
+3028 4507 1
+3028 4510 1
+3028 4529 1
+3028 4550 1
+3028 4551 1
+3028 4552 1
+3028 4557 1
+3028 4578 1
+3028 4584 1
+3028 4631 1
+3028 4639 1
+3028 4648 1
+3028 4650 1
+3028 4677 1
+3028 4678 1
+3028 4684 1
+3028 4715 1
+3028 4777 1
+3028 4778 1
+3028 4779 1
+3028 4780 1
+3028 4783 1
+3028 4822 1
+3028 4828 1
+3028 4831 1
+3028 4875 1
+3028 4887 1
+3028 4962 1
+3028 4964 1
+3028 4983 1
+3028 4987 1
+3028 4999 1
+3028 5043 1
+3028 5083 1
+3028 5146 1
+3028 5267 1
+3028 5350 1
+3028 5412 1
+3028 5415 1
+3028 5442 1
+3028 5459 1
+3028 5467 1
+3028 5638 1
+3028 5697 1
+3028 5738 1
+3028 5928 1
+3028 5936 1
+3028 6009 1
+3028 6098 1
+3028 6130 1
+3028 6261 1
+3028 6302 1
+3028 6306 1
+3028 6311 1
+3028 6321 1
+3028 6340 1
+3028 6376 1
+3028 6409 1
+3028 6427 1
+3028 6462 1
+3028 6474 1
+3028 6475 1
+3028 6529 1
+3028 6668 1
+3028 6670 1
+3028 6685 1
+3028 6686 1
+3028 8294 1
+3031 204 1
+3031 417 1
+3031 974 1
+3031 1166 1
+3031 1267 1
+3031 1297 1
+3031 1571 1
+3031 1633 1
+3031 1734 1
+3031 1754 1
+3031 2016 1
+3031 2206 1
+3031 2231 1
+3031 2371 1
+3031 2398 1
+3031 2485 1
+3031 2542 1
+3031 2565 1
+3031 2576 1
+3031 2594 1
+3031 2625 1
+3031 2651 1
+3031 2653 1
+3031 2654 1
+3031 2657 1
+3031 2660 1
+3031 2662 1
+3031 2693 1
+3031 2697 1
+3031 2900 1
+3031 2912 1
+3031 2918 1
+3031 3005 1
+3031 3018 1
+3031 3130 1
+3031 3145 1
+3031 3150 1
+3031 3173 1
+3031 3200 1
+3031 3265 1
+3031 3351 1
+3031 3408 1
+3031 3435 1
+3031 3439 1
+3031 3516 1
+3031 3537 1
+3031 3567 1
+3031 3580 1
+3031 3803 1
+3031 3847 1
+3032 15 1
+3032 72 1
+3032 737 1
+3032 762 1
+3032 856 1
+3032 967 1
+3032 978 1
+3032 1140 1
+3032 1157 1
+3032 1166 1
+3032 1239 1
+3032 1297 1
+3032 1385 1
+3032 1453 1
+3032 1680 1
+3032 1744 1
+3032 1777 1
+3032 1792 1
+3032 1799 1
+3032 1823 1
+3032 1915 1
+3032 2066 1
+3032 2134 1
+3032 2135 1
+3032 2252 1
+3032 2257 1
+3032 2285 1
+3032 2289 1
+3032 2290 1
+3032 2326 1
+3032 2328 1
+3032 2354 1
+3032 2398 1
+3032 2411 1
+3032 2485 1
+3032 2508 1
+3032 2516 1
+3032 2550 1
+3032 2565 1
+3032 2576 1
+3032 2585 1
+3032 2592 1
+3032 2594 1
+3032 2651 1
+3032 2657 1
+3032 2662 1
+3032 2674 1
+3032 2687 1
+3032 2713 1
+3032 2724 1
+3032 2747 1
+3032 2754 1
+3032 2775 1
+3032 2790 1
+3032 2811 1
+3032 2859 1
+3032 2900 1
+3032 2912 1
+3032 2923 1
+3032 3005 1
+3032 3020 1
+3032 3026 1
+3032 3027 1
+3032 3089 1
+3032 3106 1
+3032 3140 1
+3032 3145 1
+3032 3173 1
+3032 3180 1
+3032 3192 1
+3032 3200 1
+3032 3238 1
+3032 3276 1
+3032 3291 1
+3032 3297 1
+3032 3301 1
+3032 3346 1
+3032 3352 1
+3032 3393 1
+3032 3394 1
+3032 3439 1
+3032 3452 1
+3032 3453 1
+3032 3454 1
+3032 3455 1
+3032 3456 1
+3032 3458 1
+3032 3516 1
+3032 3520 1
+3032 3541 1
+3032 3557 1
+3032 3567 1
+3032 3568 1
+3032 3587 1
+3032 3615 1
+3032 3635 1
+3032 3645 1
+3032 3670 1
+3032 3681 1
+3032 3724 1
+3032 3787 1
+3032 3803 1
+3032 3813 1
+3032 3843 1
+3032 3871 1
+3032 3885 1
+3032 3887 1
+3032 3897 1
+3032 3910 1
+3032 3926 1
+3032 3937 1
+3032 3946 1
+3032 3958 1
+3032 4013 1
+3032 4065 1
+3032 4138 1
+3032 4179 1
+3032 4191 1
+3032 4233 1
+3032 4247 1
+3032 4266 1
+3032 4269 1
+3032 4289 1
+3032 4290 1
+3032 4297 1
+3032 4298 1
+3032 4299 1
+3032 4323 1
+3032 4373 1
+3032 4384 1
+3032 4386 1
+3032 4402 1
+3032 4417 1
+3032 4424 1
+3032 4432 1
+3032 4453 1
+3032 4463 1
+3032 4466 1
+3032 4471 1
+3032 4483 1
+3032 4510 1
+3032 4528 1
+3032 4530 1
+3032 4536 1
+3032 4588 1
+3032 4653 1
+3032 4661 1
+3032 4666 1
+3032 4712 1
+3032 4717 1
+3032 4780 1
+3032 4791 1
+3032 4795 1
+3032 4846 1
+3032 4953 1
+3032 4981 1
+3032 5020 1
+3032 5022 1
+3032 5178 1
+3032 5254 1
+3032 5262 1
+3032 5323 1
+3032 5327 1
+3032 5335 1
+3032 5426 1
+3032 5430 1
+3032 5449 1
+3032 5452 1
+3032 5524 1
+3032 5529 1
+3032 5626 1
+3032 5650 1
+3032 5651 1
+3032 5697 1
+3032 5776 1
+3032 5799 1
+3032 5822 1
+3032 5828 1
+3032 5863 1
+3032 5922 1
+3032 5932 1
+3032 6001 1
+3032 6148 1
+3032 6151 1
+3032 6156 1
+3032 6170 1
+3032 6218 1
+3032 6251 1
+3032 6272 1
+3032 6334 1
+3032 6337 1
+3032 6347 1
+3032 6388 1
+3032 6432 1
+3032 6437 1
+3032 6501 1
+3032 6566 1
+3032 6599 1
+3032 6600 1
+3032 6737 1
+3032 6759 1
+3032 6770 1
+3032 6774 1
+3032 6784 1
+3032 6833 1
+3032 6897 1
+3032 6918 1
+3032 7054 1
+3032 7120 1
+3032 7378 1
+3032 7478 1
+3032 7574 1
+3032 7587 1
+3032 7620 1
+3032 8083 1
+3032 8297 1
+3033 204 1
+3033 417 1
+3033 762 1
+3033 1166 1
+3033 1357 1
+3033 1393 1
+3033 1571 1
+3033 1734 1
+3033 1781 1
+3033 2016 1
+3033 2135 1
+3033 2251 1
+3033 2289 1
+3033 2290 1
+3033 2297 1
+3033 2328 1
+3033 2371 1
+3033 2474 1
+3033 2485 1
+3033 2550 1
+3033 2593 1
+3033 2653 1
+3033 2654 1
+3033 2657 1
+3033 2674 1
+3033 2693 1
+3033 2697 1
+3033 2819 1
+3033 2830 1
+3033 2856 1
+3033 2859 1
+3033 2912 1
+3033 2958 1
+3033 3024 1
+3033 3026 1
+3033 3059 1
+3033 3089 1
+3033 3150 1
+3033 3164 1
+3033 3443 1
+3033 3568 1
+3033 3580 1
+3033 3650 1
+3033 4510 1
+3033 4735 1
+3034 762 1
+3034 978 1
+3034 1157 1
+3034 1297 1
+3034 1360 1
+3034 2145 1
+3034 2231 1
+3034 2237 1
+3034 2328 1
+3034 2398 1
+3034 2440 1
+3034 2625 1
+3034 2871 1
+3034 2912 1
+3034 3005 1
+3034 3014 1
+3034 3089 1
+3034 3092 1
+3034 3106 1
+3034 3309 1
+3034 3321 1
+3034 3443 1
+3034 3568 1
+3034 3615 1
+3034 3661 1
+3034 3724 1
+3034 4037 1
+3034 4124 1
+3034 4212 1
+3034 4453 1
+3034 4463 1
+3034 4510 1
+3034 4528 1
+3034 4531 1
+3034 4735 1
+3034 5100 1
+3034 5412 1
+3034 5790 1
+3035 1352 1
+3035 1385 1
+3035 2237 1
+3035 2912 1
+3035 3417 1
+3035 3830 1
+3035 3871 1
+3035 4600 1
+3035 5162 1
+3035 5200 1
+3035 5222 1
+3035 5412 1
+3035 5482 1
+2713 204 1
+2713 285 1
+2713 417 1
+2713 465 1
+2713 825 1
+2713 827 1
+2713 978 1
+2713 1100 1
+2713 1157 1
+2713 1166 1
+2713 1239 1
+2713 1297 1
+2713 1307 1
+2713 1385 1
+2713 1453 1
+2713 1549 1
+2713 1571 1
+2713 1633 1
+2713 1679 1
+2713 1706 1
+2713 1729 1
+2713 1777 1
+2713 1990 1
+2713 2016 1
+2713 2066 1
+2713 2134 1
+2713 2144 1
+2713 2209 1
+2713 2210 1
+2713 2252 1
+2713 2257 1
+2713 2289 1
+2713 2290 1
+2713 2297 1
+2713 2307 1
+2713 2324 1
+2713 2325 1
+2713 2328 1
+2713 2338 1
+2713 2356 1
+2713 2384 1
+2713 2398 1
+2713 2411 1
+2713 2416 1
+2713 2474 1
+2713 2485 1
+2713 2506 1
+2713 2508 1
+2713 2510 1
+2713 2516 1
+2713 2535 1
+2713 2542 1
+2713 2544 1
+2713 2565 1
+2713 2576 1
+2713 2585 1
+2713 2594 1
+2713 2595 1
+2713 2597 1
+2713 2612 1
+2713 2619 1
+2713 2623 1
+2713 2625 1
+2713 2646 1
+2713 2651 1
+2713 2653 1
+2713 2654 1
+2713 2655 1
+2713 2657 1
+2713 2660 1
+2713 2667 1
+2713 2674 1
+2713 2693 1
+2713 2746 1
+2713 2747 1
+2713 2754 1
+2713 2799 1
+2713 2819 1
+2713 2859 1
+2713 2912 1
+2713 2918 1
+2713 2932 1
+2713 2958 1
+2713 2973 1
+2713 2974 1
+2713 2981 1
+2713 3005 1
+2713 3007 1
+2713 3009 1
+2713 3021 1
+2713 3024 1
+2713 3026 1
+2713 3028 1
+2713 3030 1
+2713 3059 1
+2713 3084 1
+2713 3117 1
+2713 3125 1
+2713 3144 1
+2713 3148 1
+2713 3173 1
+2713 3180 1
+2713 3192 1
+2713 3258 1
+2713 3260 1
+2713 3265 1
+2713 3276 1
+2713 3291 1
+2713 3307 1
+2713 3338 1
+2713 3351 1
+2713 3352 1
+2713 3371 1
+2713 3394 1
+2713 3404 1
+2713 3408 1
+2713 3439 1
+2713 3480 1
+2713 3483 1
+2713 3506 1
+2713 3516 1
+2713 3520 1
+2713 3529 1
+2713 3548 1
+2713 3557 1
+2713 3562 1
+2713 3568 1
+2713 3576 1
+2713 3580 1
+2713 3587 1
+2713 3615 1
+2713 3629 1
+2713 3645 1
+2713 3646 1
+2713 3650 1
+2713 3660 1
+2713 3661 1
+2713 3670 1
+2713 3717 1
+2713 3720 1
+2713 3787 1
+2713 3800 1
+2713 3812 1
+2713 3813 1
+2713 3843 1
+2713 3871 1
+2713 3887 1
+2713 3892 1
+2713 3898 1
+2713 3903 1
+2713 3926 1
+2713 3937 1
+2713 3946 1
+2713 3970 1
+2713 3971 1
+2713 3973 1
+2713 3980 1
+2713 4011 1
+2713 4013 1
+2713 4021 1
+2713 4043 1
+2713 4051 1
+2713 4055 1
+2713 4088 1
+2713 4138 1
+2713 4162 1
+2713 4171 1
+2713 4173 1
+2713 4179 1
+2713 4181 1
+2713 4191 1
+2713 4199 1
+2713 4201 1
+2713 4233 1
+2713 4234 1
+2713 4247 1
+2713 4256 1
+2713 4263 1
+2713 4269 1
+2713 4289 1
+2713 4297 1
+2713 4299 1
+2713 4323 1
+2713 4349 1
+2713 4365 1
+2713 4373 1
+2713 4384 1
+2713 4402 1
+2713 4412 1
+2713 4417 1
+2713 4422 1
+2713 4424 1
+2713 4453 1
+2713 4463 1
+2713 4485 1
+2713 4510 1
+2713 5721 1
+2713 5732 1
+2713 8293 1
+2713 8294 1
+3037 1166 1
+3037 2256 1
+3037 2651 1
+3037 2991 1
+3037 3021 1
+3037 3089 1
+3037 3580 1
+3038 2256 1
+3039 1297 1
+3039 1633 1
+3039 2256 1
+3039 2328 1
+3039 2398 1
+3039 2585 1
+3039 2594 1
+3039 2625 1
+3039 2651 1
+3039 2660 1
+3039 2958 1
+3039 3005 1
+3039 3130 1
+3039 3260 1
+3040 762 1
+3040 1498 1
+3040 2256 1
+3040 3021 1
+3040 3576 1
+3040 3970 1
+3040 4689 1
+3041 15 1
+3041 1416 1
+3041 2256 1
+3041 2371 1
+3041 2440 1
+3041 2542 1
+3041 2576 1
+3041 2594 1
+3041 2697 1
+3041 3030 1
+3041 3140 1
+3041 3150 1
+3041 4098 1
+3041 4483 1
+3042 2256 1
+3043 2256 1
+3044 2256 1
+3044 2474 1
+3044 2900 1
+3044 3117 1
+3044 3265 1
+3044 3516 1
+3048 3050 1
+3049 2593 1
+3049 2617 1
+3049 3033 1
+3049 3034 1
+3049 3050 1
+3049 3099 1
+3046 1633 1
+3046 2251 1
+3046 2411 1
+3046 2724 1
+3046 2923 1
+3046 3018 1
+3046 3050 1
+3046 3489 1
+3046 3646 1
+3046 8293 1
+3056 1393 1
+3056 1493 1
+3056 1571 1
+3056 1744 1
+3056 1919 1
+3056 2114 1
+3056 2144 1
+3056 2209 1
+3056 2251 1
+3056 2290 1
+3056 2411 1
+3056 2416 1
+3056 2485 1
+3056 2593 1
+3056 2594 1
+3056 2623 1
+3056 2625 1
+3056 2653 1
+3056 2657 1
+3056 2667 1
+3056 2687 1
+3056 2819 1
+3056 2973 1
+3056 3002 1
+3056 3009 1
+3056 3033 1
+3056 3034 1
+3056 3099 1
+3056 3104 1
+3056 3148 1
+3056 3265 1
+3056 3307 1
+3056 3338 1
+3056 3404 1
+3056 3460 1
+3056 3516 1
+3056 3520 1
+3056 3548 1
+3056 3567 1
+3056 3587 1
+3056 3803 1
+3056 3958 1
+3056 5045 1
+3056 6595 1
+3051 3056 1
+3052 3056 1
+3053 204 1
+3053 1297 1
+3053 1633 1
+3053 2474 1
+3053 2651 1
+3053 2653 1
+3053 3056 1
+3053 3117 1
+3053 3516 1
+3054 3056 1
+3055 465 1
+3055 608 1
+3055 1297 1
+3055 1549 1
+3055 1633 1
+3055 1754 1
+3055 2114 1
+3055 2209 1
+3055 2231 1
+3055 2257 1
+3055 2585 1
+3055 2619 1
+3055 2651 1
+3055 2653 1
+3055 2654 1
+3055 2667 1
+3055 2674 1
+3055 2693 1
+3055 2746 1
+3055 2799 1
+3055 2900 1
+3055 3005 1
+3055 3009 1
+3055 3010 1
+3055 3024 1
+3055 3026 1
+3055 3028 1
+3055 3034 1
+3055 3056 1
+3055 3059 1
+3055 3148 1
+3055 3180 1
+3055 3243 1
+3055 3251 1
+3055 3253 1
+3055 3258 1
+3055 3320 1
+3055 3446 1
+3055 3473 1
+3055 3480 1
+3055 3489 1
+3055 3587 1
+3055 3629 1
+3055 3650 1
+3055 3812 1
+3055 3888 1
+3055 3903 1
+3055 3937 1
+3055 3942 1
+3055 3967 1
+3055 3971 1
+3055 8293 1
+3057 608 1
+3057 840 1
+3057 1166 1
+3057 1357 1
+3057 1473 1
+3057 1571 1
+3057 1990 1
+3057 2016 1
+3057 2516 1
+3057 2653 1
+3057 2747 1
+3057 2790 1
+3057 2822 1
+3057 3007 1
+3057 3024 1
+3057 3106 1
+3057 3148 1
+3057 3173 1
+3057 3276 1
+3057 3352 1
+3057 3443 1
+3057 3456 1
+3057 3587 1
+3057 3787 1
+3057 3969 1
+3057 4071 1
+3057 4110 1
+3057 4124 1
+3057 4247 1
+3057 4261 1
+3057 4266 1
+3057 4587 1
+3057 4600 1
+3057 4706 1
+3057 4709 1
+3057 5055 1
+3057 5775 1
+3057 6780 1
+3057 6833 1
+3057 6979 1
+3057 7073 1
+3057 7092 1
+3057 7301 1
+3057 7649 1
+3057 7833 1
+3057 7890 1
+3057 7979 1
+3057 8174 1
+3059 1437 1
+3059 1453 1
+3059 1734 1
+3059 1754 1
+3059 1837 1
+3059 1919 1
+3059 2016 1
+3059 2237 1
+3059 2251 1
+3059 2328 1
+3059 2371 1
+3059 2474 1
+3059 2485 1
+3059 2506 1
+3059 2593 1
+3059 2625 1
+3059 2651 1
+3059 2653 1
+3059 2696 1
+3059 2697 1
+3059 3026 1
+3059 3033 1
+3059 3173 1
+3059 3192 1
+3059 3265 1
+3059 3537 1
+3059 3748 1
+3059 3854 1
+3059 4124 1
+3059 4256 1
+3059 5026 1
+3059 6347 1
+3047 1781 1
+3047 1792 1
+3047 1919 1
+3047 2251 1
+3047 2411 1
+3047 2991 1
+3047 3033 1
+3047 3034 1
+3047 3068 1
+3047 3099 1
+3047 3117 1
+3047 8293 1
+3060 1919 1
+3060 2014 1
+3060 2251 1
+3060 3033 1
+2356 465 1
+2356 825 1
+2356 974 1
+2356 1166 1
+2356 1706 1
+2356 1734 1
+2356 2114 1
+2356 2134 1
+2356 2210 1
+2356 2289 1
+2356 2324 1
+2356 2328 1
+2356 2510 1
+2356 2544 1
+2356 2565 1
+2356 2585 1
+2356 2594 1
+2356 2595 1
+2356 2654 1
+2356 2655 1
+2356 2657 1
+2356 2662 1
+2356 2693 1
+2356 2727 1
+2356 2746 1
+2356 2923 1
+2356 2932 1
+2356 2958 1
+2356 2973 1
+2356 3005 1
+2356 3007 1
+2356 3024 1
+2356 3026 1
+2356 3028 1
+2356 3033 1
+2356 3084 1
+2356 3117 1
+2356 3140 1
+2356 3258 1
+2356 3352 1
+2356 3454 1
+2356 3615 1
+2356 3650 1
+2356 3800 1
+2356 3843 1
+2356 3887 1
+2356 3892 1
+2356 3903 1
+2356 3926 1
+2356 3937 1
+2356 4011 1
+2356 4021 1
+2356 4043 1
+2356 4179 1
+2356 4269 1
+2356 4290 1
+2356 4528 1
+3061 3033 1
+3061 3164 1
+3062 633 1
+3062 762 1
+3062 856 1
+3062 1267 1
+3062 1393 1
+3062 1416 1
+3062 1437 1
+3062 1734 1
+3062 1754 1
+3062 1781 1
+3062 1792 1
+3062 1814 1
+3062 1919 1
+3062 2116 1
+3062 2135 1
+3062 2225 1
+3062 2231 1
+3062 2371 1
+3062 2474 1
+3062 2485 1
+3062 2593 1
+3062 2651 1
+3062 2654 1
+3062 2662 1
+3062 2697 1
+3062 2713 1
+3062 2724 1
+3062 2830 1
+3062 2856 1
+3062 2900 1
+3062 2951 1
+3062 3033 1
+3062 3089 1
+3062 3126 1
+3062 3140 1
+3062 3150 1
+3062 3155 1
+3062 3235 1
+3062 3243 1
+3062 3251 1
+3062 3253 1
+3062 3258 1
+2976 1777 1
+2976 2617 1
+2976 2974 1
+2976 3463 1
+2976 3541 1
+2976 3888 1
+2976 4037 1
+3066 290 1
+3070 2991 1
+3070 3164 1
+3071 2251 1
+3072 1357 1
+3072 1393 1
+3072 1416 1
+3072 1754 1
+3072 1781 1
+3072 1792 1
+3072 1919 1
+3072 2135 1
+3072 2251 1
+3072 2325 1
+3072 2356 1
+3072 2371 1
+3072 2550 1
+3072 2597 1
+3072 2623 1
+3072 2625 1
+3072 2654 1
+3072 2662 1
+3072 2697 1
+3072 2724 1
+3072 2727 1
+3072 2856 1
+3072 3117 1
+3072 4712 1
+3072 8293 1
+3073 1310 1
+3073 1498 1
+3073 2066 1
+3073 2251 1
+3073 2364 1
+3073 2485 1
+3073 2506 1
+3073 2510 1
+3073 2594 1
+3073 2625 1
+3073 2651 1
+3073 2657 1
+3073 2660 1
+3073 2819 1
+3073 2981 1
+3073 3002 1
+3073 3021 1
+3073 3034 1
+3073 3130 1
+3073 3456 1
+3073 3726 1
+3073 3892 1
+3073 3969 1
+3073 4043 1
+3073 4706 1
+3073 4796 1
+3073 4820 1
+3073 4827 1
+3073 5412 1
+3073 5897 1
+3073 6907 1
+3073 6918 1
+3073 7290 1
+3073 7632 1
+3074 2251 1
+3075 1754 1
+3075 2251 1
+3076 2251 1
+3077 1919 1
+3077 2411 1
+3077 3034 1
+3077 3099 1
+3078 2411 1
+3063 3082 1
+3063 3807 1
+3063 7735 1
+3081 1157 1
+3081 1633 1
+3081 1754 1
+3081 1919 1
+3081 2066 1
+3081 2135 1
+3081 2565 1
+3081 2593 1
+3081 2594 1
+3081 2625 1
+3081 2724 1
+3081 2958 1
+3081 3082 1
+3081 3117 1
+3081 3480 1
+3081 3516 1
+3081 3607 1
+3081 4191 1
+3081 4777 1
+3081 5936 1
+3083 2593 1
+3083 3034 1
+3084 465 1
+3084 1297 1
+3084 1777 1
+3084 1915 1
+3084 1935 1
+3084 2114 1
+3084 2160 1
+3084 2210 1
+3084 2398 1
+3084 2411 1
+3084 2485 1
+3084 2585 1
+3084 2593 1
+3084 2657 1
+3084 2727 1
+3084 2746 1
+3084 2790 1
+3084 3005 1
+3084 3026 1
+3084 3059 1
+3084 3089 1
+3084 3117 1
+3084 3334 1
+3084 3352 1
+3084 3381 1
+3084 3404 1
+3084 3480 1
+3084 3537 1
+3084 3555 1
+3084 3557 1
+3084 3562 1
+3084 3568 1
+3084 3646 1
+3084 3680 1
+3084 3717 1
+3084 3720 1
+3084 3752 1
+3084 3776 1
+3084 3803 1
+3084 3807 1
+3084 3847 1
+3084 3892 1
+3084 3903 1
+3084 4735 1
+3084 5079 1
+3084 5254 1
+3084 5818 1
+3084 6043 1
+3084 6560 1
+3084 6833 1
+3084 6869 1
+3084 6980 1
+3084 7277 1
+3084 7280 1
+3084 7443 1
+3084 7620 1
+3084 7649 1
+3084 7788 1
+3084 7803 1
+3084 7809 1
+3084 8293 1
+3084 8294 1
+3085 3034 1
+3086 2775 1
+3086 3034 1
+3086 3099 1
+3086 3458 1
+3086 3607 1
+3086 4191 1
+3086 4338 1
+3086 5026 1
+3087 2016 1
+3087 2354 1
+3087 2371 1
+3087 2696 1
+3087 2697 1
+3087 3034 1
+3087 3089 1
+3087 3748 1
+3088 15 1
+3088 737 1
+3088 1026 1
+3088 1100 1
+3088 1157 1
+3088 1297 1
+3088 2066 1
+3088 2225 1
+3088 2237 1
+3088 2398 1
+3088 2506 1
+3088 2508 1
+3088 2923 1
+3088 3005 1
+3088 3007 1
+3088 3034 1
+3088 3089 1
+3088 4037 1
+3088 4432 1
+3088 4687 1
+3088 5064 1
+3088 5254 1
+3088 5285 1
+3088 5452 1
+3088 5738 1
+3088 6156 1
+3088 6407 1
+3088 6634 1
+3088 6699 1
+3088 7389 1
+3088 7810 1
+3088 7879 1
+3088 8124 1
+3088 8174 1
+3088 8192 1
+3088 8198 1
+3088 8237 1
+3089 1437 1
+3089 1754 1
+3089 2625 1
+3089 3034 1
+3090 2371 1
+3090 2485 1
+3090 2727 1
+3090 2871 1
+3090 3034 1
+3090 3456 1
+3090 4201 1
+3090 4341 1
+3090 4717 1
+3090 5335 1
+3090 6530 1
+3090 6784 1
+3091 3034 1
+3092 633 1
+3092 737 1
+3092 1024 1
+3092 1769 1
+3092 1814 1
+3092 2135 1
+3092 2225 1
+3092 2369 1
+3092 2433 1
+3092 2576 1
+3092 2625 1
+3092 2654 1
+3092 2689 1
+3092 2697 1
+3092 2700 1
+3092 2713 1
+3092 2765 1
+3092 2831 1
+3092 3027 1
+3092 3034 1
+3092 3251 1
+3092 3258 1
+3092 3456 1
+3092 3726 1
+3092 3796 1
+3092 3910 1
+3092 4037 1
+3092 4099 1
+3092 4124 1
+3092 4191 1
+3092 4201 1
+3092 4276 1
+3092 4315 1
+3092 4400 1
+3092 4448 1
+3092 4468 1
+3092 4534 1
+3092 4536 1
+3092 4587 1
+3092 4712 1
+3092 4715 1
+3092 4781 1
+3092 4795 1
+3092 4875 1
+3092 4884 1
+3092 4962 1
+3092 5123 1
+3092 5144 1
+3092 5176 1
+3092 5178 1
+3092 5226 1
+3092 5239 1
+3092 5245 1
+3092 5246 1
+3092 5263 1
+3092 5309 1
+3092 5412 1
+3092 5457 1
+3092 5459 1
+3092 5465 1
+3092 5484 1
+3092 5506 1
+3092 5705 1
+3092 5714 1
+3092 5775 1
+3092 5817 1
+3092 5928 1
+3092 5931 1
+3092 5963 1
+3092 6306 1
+3092 6600 1
+3092 6774 1
+3092 7092 1
+3092 7146 1
+3092 7168 1
+3092 7699 1
+3092 7855 1
+3092 8134 1
+3092 8141 1
+3092 8295 1
+3092 8296 1
+3093 3099 1
+3094 1549 1
+3094 3089 1
+3094 3099 1
+3094 3537 1
+3094 4600 1
+3097 3099 1
+3098 633 1
+3098 762 1
+3098 1393 1
+3098 1416 1
+3098 1679 1
+3098 1754 1
+3098 1781 1
+3098 1814 1
+3098 2116 1
+3098 2135 1
+3098 2225 1
+3098 2231 1
+3098 2371 1
+3098 2625 1
+3098 2651 1
+3098 2654 1
+3098 2662 1
+3098 2697 1
+3098 2700 1
+3098 2713 1
+3098 2724 1
+3098 2856 1
+3098 2900 1
+3098 2951 1
+3098 3020 1
+3098 3089 1
+3098 3099 1
+3098 3126 1
+3098 3140 1
+3098 3145 1
+3098 3150 1
+3098 3164 1
+3098 3243 1
+3098 3251 1
+3098 3253 1
+3098 3265 1
+3098 3285 1
+3095 285 1
+3095 633 1
+3095 856 1
+3095 1267 1
+3095 1357 1
+3095 1393 1
+3095 1437 1
+3095 1679 1
+3095 1734 1
+3095 1754 1
+3095 1781 1
+3095 1814 1
+3095 1837 1
+3095 2116 1
+3095 2135 1
+3095 2225 1
+3095 2231 1
+3095 2371 1
+3095 2565 1
+3095 2625 1
+3095 2713 1
+3095 2724 1
+3095 2830 1
+3095 2900 1
+3095 2951 1
+3095 3018 1
+3095 3099 1
+3095 3126 1
+3095 3140 1
+3095 3243 1
+3095 3251 1
+3095 3253 1
+3095 3285 1
+3095 3307 1
+3095 3371 1
+3095 3376 1
+3095 3410 1
+3096 2542 1
+3096 2697 1
+3096 3099 1
+3101 1919 1
+3101 2072 1
+3102 3104 1
+3103 1688 1
+3103 2822 1
+3103 3104 1
+3103 4485 1
+3103 4552 1
+3106 1357 1
+3106 1403 1
+3106 4709 1
+3106 6458 1
+3106 7108 1
+3107 1357 1
+3107 1453 1
+3107 2210 1
+3107 2297 1
+3107 2485 1
+3107 2535 1
+3107 2653 1
+3107 2932 1
+3107 3660 1
+3107 4365 1
+2842 204 1
+2842 285 1
+2842 417 1
+2842 825 1
+2842 978 1
+2842 1157 1
+2842 1166 1
+2842 1357 1
+2842 1385 1
+2842 1453 1
+2842 1549 1
+2842 1571 1
+2842 1633 1
+2842 1679 1
+2842 1744 1
+2842 1754 1
+2842 1919 1
+2842 1990 1
+2842 2016 1
+2842 2066 1
+2842 2135 1
+2842 2144 1
+2842 2209 1
+2842 2231 1
+2842 2252 1
+2842 2290 1
+2842 2297 1
+2842 2324 1
+2842 2328 1
+2842 2356 1
+2842 2398 1
+2842 2416 1
+2842 2474 1
+2842 2485 1
+2842 2508 1
+2842 2510 1
+2842 2542 1
+2842 2565 1
+2842 2576 1
+2842 2594 1
+2842 2597 1
+2842 2619 1
+2842 2623 1
+2842 2625 1
+2842 2646 1
+2842 2651 1
+2842 2653 1
+2842 2654 1
+2842 2660 1
+2842 2667 1
+2842 2674 1
+2842 2687 1
+2842 2693 1
+2842 2700 1
+2842 2746 1
+2842 2747 1
+2842 2799 1
+2842 2819 1
+2842 2830 1
+2842 2859 1
+2842 2923 1
+2842 2951 1
+2842 2958 1
+2842 2973 1
+2842 3005 1
+2842 3009 1
+2842 3010 1
+2842 3020 1
+2842 3024 1
+2842 3028 1
+2842 3114 1
+2842 3117 1
+2842 3148 1
+2842 3192 1
+2842 3193 1
+2842 3253 1
+2842 3258 1
+2842 3260 1
+2842 3265 1
+2842 3276 1
+2842 3291 1
+2842 3320 1
+2842 3346 1
+2842 3351 1
+2842 3394 1
+2842 3408 1
+2842 3410 1
+2842 3429 1
+2842 3435 1
+2842 3439 1
+2842 3473 1
+2842 3486 1
+2842 3489 1
+2842 3506 1
+2842 3520 1
+2842 3538 1
+2842 3580 1
+2842 3587 1
+2842 3617 1
+2842 3645 1
+2842 3681 1
+2842 3720 1
+2842 3737 1
+2842 3800 1
+2842 3812 1
+2842 3908 1
+2842 3937 1
+2842 3939 1
+2842 3970 1
+2842 4011 1
+2842 4021 1
+2842 4138 1
+2842 4173 1
+2842 4179 1
+2842 4191 1
+2842 4234 1
+2842 4256 1
+2842 4269 1
+2842 4349 1
+2842 4384 1
+2842 4453 1
+2842 4485 1
+2842 8293 1
+2842 8294 1
+3108 1267 1
+3108 1357 1
+3108 1416 1
+3108 2016 1
+3108 2237 1
+3108 2654 1
+3108 2697 1
+3108 4485 1
+3109 737 1
+3109 1734 1
+3109 4040 1
+3109 4219 1
+3109 4400 1
+3109 4401 1
+3109 4402 1
+3109 4584 1
+3109 8227 1
+3110 1297 1
+3110 1734 1
+3110 2328 1
+3110 2369 1
+3110 2381 1
+3110 2594 1
+3110 3028 1
+3110 3103 1
+3110 3117 1
+3110 3352 1
+3110 3439 1
+3110 3615 1
+3110 3635 1
+3110 3800 1
+3110 3897 1
+3110 3903 1
+3110 4587 1
+3110 4645 1
+3110 5130 1
+3110 5459 1
+3110 5743 1
+3111 1734 1
+3112 3117 1
+3113 3117 1
+2003 762 1
+2003 938 1
+2003 1267 1
+2003 1297 1
+2003 1633 1
+2003 1679 1
+2003 1814 1
+2003 2231 1
+2003 2307 1
+2003 2325 1
+2003 2338 1
+2003 2411 1
+2003 2508 1
+2003 2516 1
+2003 2565 1
+2003 2623 1
+2003 2625 1
+2003 2651 1
+2003 2657 1
+2003 2727 1
+2003 2775 1
+2003 2923 1
+2003 2973 1
+2003 3007 1
+2003 3018 1
+2003 3026 1
+2003 3084 1
+2003 3092 1
+2003 3117 1
+2003 3243 1
+2003 3253 1
+2003 3265 1
+2003 3276 1
+2003 3324 1
+2003 3352 1
+2003 3371 1
+2003 3408 1
+2003 3480 1
+2003 3607 1
+2003 3681 1
+2003 3849 1
+2003 3892 1
+2003 3926 1
+2003 4037 1
+2003 4531 1
+2003 4828 1
+2003 5022 1
+2003 5144 1
+2003 5605 1
+2003 5801 1
+2003 5819 1
+2003 6044 1
+2003 6097 1
+2003 6634 1
+2003 6918 1
+2003 7233 1
+2003 7279 1
+2003 7301 1
+2003 7440 1
+2003 7620 1
+2003 7860 1
+2003 8192 1
+2003 8209 1
+3114 3117 1
+3115 2565 1
+3115 2576 1
+3115 3117 1
+3115 3291 1
+3115 4037 1
+3118 1919 1
+3118 2830 1
+3119 2625 1
+3119 2830 1
+3119 3408 1
+3120 285 1
+3120 2474 1
+3120 2594 1
+3120 2687 1
+3120 2830 1
+3120 3324 1
+3120 3520 1
+3120 3807 1
+3123 1679 1
+3123 3020 1
+3123 3130 1
+3124 2625 1
+3124 3130 1
+3125 856 1
+3125 1792 1
+3125 1814 1
+3125 2325 1
+3125 2485 1
+3125 2576 1
+3125 2594 1
+3125 2625 1
+3125 2651 1
+3125 2657 1
+3125 2687 1
+3125 2747 1
+3125 3005 1
+3125 3130 1
+3125 3253 1
+3125 3265 1
+3126 3130 1
+3127 465 1
+3127 2411 1
+3127 2576 1
+3127 2585 1
+3127 2625 1
+3127 2657 1
+3127 2674 1
+3127 2693 1
+3127 3028 1
+3127 3130 1
+3127 3541 1
+3127 3557 1
+3127 3646 1
+3127 3701 1
+3127 3903 1
+3128 3130 1
+3129 2625 1
+3129 3130 1
+3131 3136 1
+3132 3136 1
+3132 3164 1
+3132 5254 1
+3135 3136 1
+3133 3136 1
+3134 3136 1
+3137 3138 1
+3137 3140 1
+3137 3454 1
+3137 4578 1
+3140 3201 1
+3140 4011 1
+3143 2900 1
+3142 1744 1
+3142 1982 1
+3142 2592 1
+3142 2654 1
+3142 2658 1
+3142 2900 1
+3142 3005 1
+3142 3293 1
+3142 3433 1
+3142 3681 1
+3142 4335 1
+3142 4432 1
+3142 4940 1
+3142 4964 1
+3142 5141 1
+3142 5210 1
+3142 5378 1
+3142 5738 1
+3142 5812 1
+3142 5925 1
+3142 6618 1
+3142 6634 1
+3142 6737 1
+3142 6759 1
+3142 6875 1
+3142 6918 1
+3142 6946 1
+3142 7389 1
+3142 7391 1
+3142 7553 1
+3142 7620 1
+3142 7791 1
+3142 7810 1
+3142 7928 1
+3142 7992 1
+3142 7996 1
+3142 8042 1
+3142 8051 1
+3142 8124 1
+3142 8134 1
+3142 8178 1
+3142 8192 1
+3142 8198 1
+3142 8209 1
+3142 8212 1
+3142 8219 1
+3142 8237 1
+3142 8249 1
+3142 8293 1
+3144 204 1
+3144 778 1
+3144 1157 1
+3144 1166 1
+3144 1453 1
+3144 1633 1
+3144 1679 1
+3144 1688 1
+3144 1729 1
+3144 1777 1
+3144 1792 1
+3144 1837 1
+3144 2016 1
+3144 2209 1
+3144 2237 1
+3144 2290 1
+3144 2307 1
+3144 2324 1
+3144 2338 1
+3144 2356 1
+3144 2371 1
+3144 2456 1
+3144 2485 1
+3144 2508 1
+3144 2510 1
+3144 2535 1
+3144 2594 1
+3144 2619 1
+3144 2625 1
+3144 2654 1
+3144 2657 1
+3144 2660 1
+3144 2686 1
+3144 2693 1
+3144 2700 1
+3144 2713 1
+3144 2819 1
+3144 2856 1
+3144 2871 1
+3144 2900 1
+3144 2923 1
+3144 2973 1
+3144 2974 1
+3144 3014 1
+3144 3018 1
+3144 3021 1
+3144 3026 1
+3144 3028 1
+3144 3059 1
+3144 3106 1
+3144 3148 1
+3144 3193 1
+3144 3235 1
+3144 3243 1
+3144 3251 1
+3144 3265 1
+3144 3338 1
+3144 3351 1
+3144 3352 1
+3144 3404 1
+3144 3408 1
+3144 3439 1
+3144 3443 1
+3144 3446 1
+3144 3454 1
+3144 3473 1
+3144 3480 1
+3144 3483 1
+3144 3486 1
+3144 3529 1
+3144 3557 1
+3144 3567 1
+3144 3568 1
+3144 3650 1
+3144 3660 1
+3144 3661 1
+3144 3670 1
+3144 3680 1
+3144 3681 1
+3144 3812 1
+3144 3926 1
+3144 4021 1
+3144 4040 1
+3144 4212 1
+3144 4261 1
+3144 4373 1
+3144 4531 1
+3144 4578 1
+3145 1688 1
+3145 2145 1
+3145 2240 1
+3145 2328 1
+3145 3034 1
+3145 3089 1
+3145 3125 1
+3145 3140 1
+3145 3309 1
+3145 3352 1
+3145 3443 1
+3145 3958 1
+3145 4263 1
+3145 4297 1
+3145 4299 1
+3145 4735 1
+3145 5233 1
+3145 5790 1
+3146 2697 1
+3147 974 1
+3147 2066 1
+3147 2225 1
+3147 2585 1
+3147 2697 1
+3147 4055 1
+3148 204 1
+3148 417 1
+3148 1166 1
+3148 1473 1
+3148 1549 1
+3148 1919 1
+3148 1990 1
+3148 2297 1
+3148 2328 1
+3148 2398 1
+3148 2654 1
+3148 2667 1
+3148 2674 1
+3148 2697 1
+3148 2819 1
+3148 3371 1
+3148 3480 1
+3148 3489 1
+3148 3516 1
+3148 3562 1
+3148 3650 1
+3148 4011 1
+3148 4055 1
+3148 4233 1
+3148 4263 1
+3148 4266 1
+3150 15 1
+3150 2066 1
+3150 2651 1
+3150 2654 1
+3150 2774 1
+3150 4098 1
+3150 4099 1
+3150 5043 1
+3150 5828 1
+3150 5980 1
+3149 3150 1
+3151 2724 1
+3152 2724 1
+3153 1781 1
+3154 1781 1
+3156 1416 1
+3158 3164 1
+3159 856 1
+3159 2237 1
+3159 2625 1
+3159 2654 1
+3159 3164 1
+3159 3192 1
+3159 3748 1
+3159 4247 1
+3159 8293 1
+3160 15 1
+3160 3164 1
+3162 2654 1
+3162 2662 1
+3162 3164 1
+3163 3164 1
+3165 2550 1
+3166 2550 1
+3167 2550 1
+3169 762 1
+3168 72 1
+3168 762 1
+3168 825 1
+3168 1185 1
+3168 1307 1
+3168 1453 1
+3168 1777 1
+3168 2129 1
+3168 2289 1
+3168 2328 1
+3168 2398 1
+3168 2508 1
+3168 2576 1
+3168 2625 1
+3168 2646 1
+3168 2653 1
+3168 2654 1
+3168 2655 1
+3168 2760 1
+3168 2859 1
+3168 2958 1
+3168 3007 1
+3168 3020 1
+3168 3117 1
+3168 3180 1
+3168 3192 1
+3168 3260 1
+3168 3291 1
+3168 3309 1
+3168 3334 1
+3168 3346 1
+3168 3352 1
+3168 3394 1
+3168 3439 1
+3168 3463 1
+3168 3516 1
+3168 3557 1
+3168 3562 1
+3168 3568 1
+3168 3615 1
+3168 3631 1
+3168 3650 1
+3168 3720 1
+3168 3787 1
+3168 3806 1
+3168 3812 1
+3168 3843 1
+3168 3897 1
+3168 3926 1
+3168 3937 1
+3168 3946 1
+3168 3956 1
+3168 3958 1
+3168 4013 1
+3168 4021 1
+3168 4088 1
+3168 4103 1
+3168 4110 1
+3168 4179 1
+3168 4191 1
+3168 4254 1
+3168 4290 1
+3168 4323 1
+3168 4365 1
+3168 4384 1
+3168 4386 1
+3168 4424 1
+3168 4463 1
+3168 4510 1
+3168 4613 1
+3168 4666 1
+3168 4735 1
+3168 4811 1
+3168 4820 1
+3168 5412 1
+3168 5454 1
+3168 5790 1
+3168 8293 1
+3168 8294 1
+3171 2657 1
+3172 465 1
+3172 1385 1
+3172 2371 1
+3172 2775 1
+3172 3007 1
+3172 3028 1
+3172 3180 1
+3172 3276 1
+3172 3458 1
+3172 3664 1
+3172 3903 1
+3172 4645 1
+3172 4964 1
+3173 2371 1
+3173 2974 1
+3173 3192 1
+3173 3529 1
+3173 3537 1
+3173 4191 1
+3173 4256 1
+3174 2371 1
+3175 827 1
+3175 1453 1
+3175 1549 1
+3175 1777 1
+3175 2257 1
+3175 2371 1
+3175 2411 1
+3175 2485 1
+3175 2508 1
+3175 2565 1
+3175 2595 1
+3175 2619 1
+3175 2653 1
+3175 2657 1
+3175 2696 1
+3175 2727 1
+3175 3024 1
+3175 3026 1
+3175 3059 1
+3175 3260 1
+3175 3461 1
+3175 3483 1
+3175 3529 1
+3175 3537 1
+3175 3541 1
+3175 3847 1
+3175 3892 1
+3175 3903 1
+3175 3926 1
+3175 3937 1
+3175 3967 1
+3175 3970 1
+3175 3973 1
+3175 4021 1
+3175 4529 1
+3175 4653 1
+3175 4666 1
+3175 4827 1
+3175 4831 1
+3175 5026 1
+3175 5423 1
+3176 72 1
+3176 2371 1
+3176 3796 1
+3176 5511 1
+3176 6148 1
+3176 6400 1
+3180 285 1
+3180 1267 1
+3180 1633 1
+3180 1744 1
+3180 1990 1
+3180 2225 1
+3180 2290 1
+3180 2297 1
+3180 2324 1
+3180 2328 1
+3180 2510 1
+3180 2542 1
+3180 2654 1
+3180 2660 1
+3180 2746 1
+3180 2856 1
+3180 2958 1
+3180 3489 1
+3180 3506 1
+3180 3516 1
+3180 3529 1
+3180 3537 1
+3180 3670 1
+3180 3812 1
+3181 1799 1
+3181 2654 1
+3181 4600 1
+3190 1548 1
+3190 2354 1
+3190 2398 1
+3190 2654 1
+3190 3084 1
+3190 3192 1
+3190 3352 1
+3190 3408 1
+3190 4276 1
+3190 5254 1
+3182 2654 1
+3183 2651 1
+3183 2654 1
+3184 2654 1
+3185 2654 1
+3185 4124 1
+3186 2654 1
+3187 2654 1
+3188 417 1
+3188 1297 1
+3188 1706 1
+3188 2328 1
+3188 2565 1
+3188 2654 1
+3188 2687 1
+3188 3028 1
+3188 3117 1
+3188 3319 1
+3188 3555 1
+3188 3567 1
+3188 3623 1
+3188 3629 1
+3188 3871 1
+3188 4234 1
+3188 4256 1
+3188 4424 1
+3188 4466 1
+3188 4528 1
+3189 204 1
+3189 417 1
+3189 1297 1
+3189 1633 1
+3189 2066 1
+3189 2576 1
+3189 2654 1
+3189 3371 1
+3189 3587 1
+3189 4384 1
+3192 608 1
+3192 825 1
+3192 827 1
+3192 1305 1
+3192 1307 1
+3192 1453 1
+3192 1729 1
+3192 1837 1
+3192 1990 1
+3192 2016 1
+3192 2072 1
+3192 2210 1
+3192 2297 1
+3192 2325 1
+3192 2485 1
+3192 2510 1
+3192 2585 1
+3192 2594 1
+3192 2653 1
+3192 2655 1
+3192 2660 1
+3192 2687 1
+3192 2693 1
+3192 2696 1
+3192 2831 1
+3192 2871 1
+3192 3024 1
+3192 3026 1
+3192 3059 1
+3192 3092 1
+3192 3258 1
+3192 3404 1
+3192 3439 1
+3192 3454 1
+3192 3461 1
+3192 3489 1
+3192 3537 1
+3192 3615 1
+3192 3650 1
+3192 3717 1
+3192 3748 1
+3192 3843 1
+3192 4011 1
+3192 4021 1
+3192 4124 1
+3192 4173 1
+3192 4179 1
+3192 4189 1
+3192 4256 1
+3192 4600 1
+3192 4646 1
+3192 4820 1
+3192 4983 1
+3192 5026 1
+3192 5452 1
+3192 8294 1
+3194 3195 1
+3191 95 1
+3191 737 1
+3191 1247 1
+3191 2277 1
+3191 2354 1
+3191 2398 1
+3191 2822 1
+3191 2831 1
+3191 2856 1
+3191 3002 1
+3191 3027 1
+3191 3103 1
+3191 3274 1
+3191 3393 1
+3191 3417 1
+3191 3456 1
+3191 3460 1
+3191 3691 1
+3191 3897 1
+3191 3910 1
+3191 4098 1
+3191 4099 1
+3191 4191 1
+3191 4219 1
+3191 4247 1
+3191 4315 1
+3191 4400 1
+3191 4530 1
+3191 4587 1
+3191 4600 1
+3191 4666 1
+3191 4712 1
+3191 4824 1
+3191 4846 1
+3191 4964 1
+3191 4977 1
+3191 4986 1
+3191 5073 1
+3191 5226 1
+3191 5233 1
+3191 5288 1
+3191 5321 1
+3191 5323 1
+3191 5335 1
+3191 5341 1
+3191 5387 1
+3191 5392 1
+3191 5412 1
+3191 5415 1
+3191 5430 1
+3191 5449 1
+3191 5459 1
+3191 5463 1
+3191 5465 1
+3191 5484 1
+3191 5539 1
+3191 5545 1
+3191 5568 1
+3191 5592 1
+3191 5635 1
+3191 5637 1
+3191 5640 1
+3191 5651 1
+3191 5683 1
+3191 5693 1
+3191 5737 1
+3191 5743 1
+3191 5775 1
+3196 856 1
+3196 1571 1
+3196 1915 1
+3196 2257 1
+3196 2485 1
+3196 2585 1
+3196 2651 1
+3196 2657 1
+3196 2700 1
+3196 2727 1
+3196 2856 1
+3196 2923 1
+3196 3059 1
+3196 3404 1
+3196 3473 1
+3196 3480 1
+3196 3529 1
+3196 3646 1
+3196 3650 1
+3196 3804 1
+3196 3926 1
+3196 3937 1
+3197 1267 1
+3197 2856 1
+3197 3717 1
+3197 4021 1
+3198 2856 1
+3199 825 1
+3199 1267 1
+3199 1729 1
+3199 2135 1
+3199 2237 1
+3199 2338 1
+3199 2485 1
+3199 2612 1
+3199 2856 1
+3199 3028 1
+3199 3253 1
+3199 3307 1
+3199 3926 1
+3200 1024 1
+3200 1990 1
+3200 2114 1
+3200 2411 1
+3200 2565 1
+3200 2856 1
+3200 3114 1
+3200 3615 1
+3202 204 1
+3202 2576 1
+3202 2597 1
+3202 2651 1
+3202 2662 1
+3202 2700 1
+3202 3516 1
+3202 4373 1
+3203 2662 1
+3204 2662 1
+3206 1437 1
+3207 1437 1
+3208 2237 1
+3208 2384 1
+3208 3321 1
+3208 3871 1
+3208 4600 1
+3208 4999 1
+3209 856 1
+3209 1267 1
+3209 1385 1
+3209 1679 1
+3209 2225 1
+3209 2237 1
+3209 2290 1
+3209 2576 1
+3209 2625 1
+3209 2657 1
+3209 2660 1
+3209 2689 1
+3209 2700 1
+3209 3005 1
+3209 3235 1
+3209 3319 1
+3209 3351 1
+3209 3447 1
+3209 3473 1
+3209 3489 1
+3209 3520 1
+3209 3691 1
+3209 3804 1
+3209 3976 1
+3209 4124 1
+3209 4315 1
+3209 4338 1
+3209 4482 1
+3209 4587 1
+3209 4792 1
+3209 4824 1
+3209 5026 1
+3209 5058 1
+3209 5072 1
+3209 5182 1
+3209 5233 1
+3209 5756 1
+3209 5757 1
+3209 5947 1
+3209 5973 1
+3209 8293 1
+3212 2237 1
+3213 2237 1
+3215 2237 1
+3214 2237 1
+3216 2237 1
+3216 8293 1
+3210 2237 1
+3210 4037 1
+3210 4792 1
+3217 2237 1
+532 2237 1
+3219 2237 1
+3220 2237 1
+3221 2237 1
+1509 2237 1
+3211 2237 1
+3211 3408 1
+3218 2237 1
+3222 2237 1
+3223 2237 1
+3224 2237 1
+3225 1267 1
+3225 1633 1
+3225 1814 1
+3225 2225 1
+3225 2328 1
+3225 2456 1
+3225 2625 1
+3225 3020 1
+3225 3192 1
+3225 3516 1
+3225 3615 1
+3225 4103 1
+3225 4256 1
+3226 1267 1
+3227 737 1
+3227 1026 1
+3227 1267 1
+3227 1982 1
+3227 2651 1
+3227 2790 1
+3227 2819 1
+3227 3089 1
+3227 4191 1
+3227 4261 1
+3227 4536 1
+3227 4983 1
+3227 5140 1
+3227 5288 1
+3227 5301 1
+3227 5822 1
+3227 7587 1
+3227 7810 1
+3227 7862 1
+3228 1267 1
+3235 8293 1
+3229 3235 1
+3230 3235 1
+3231 3235 1
+3232 3235 1
+3234 3235 1
+3233 2285 1
+3233 3235 1
+3233 8293 1
+3238 1688 1
+3238 2225 1
+3238 2342 1
+3238 2381 1
+3238 2511 1
+3238 2516 1
+3238 2774 1
+3238 3084 1
+3238 3334 1
+3238 3456 1
+3238 4071 1
+3238 4562 1
+3238 4712 1
+3238 4824 1
+3238 5100 1
+3238 5210 1
+3238 5233 1
+3238 5484 1
+3238 5814 1
+3238 5839 1
+3238 6327 1
+3238 6833 1
+3238 7624 1
+3238 7632 1
+3238 7809 1
+3238 7839 1
+3238 7855 1
+3238 8174 1
+3239 856 1
+3239 1706 1
+3239 3555 1
+3240 3243 1
+3241 3243 1
+3242 1919 1
+3242 2576 1
+3242 3243 1
+3242 3253 1
+3242 3809 1
+3242 5697 1
+3244 3245 1
+3246 633 1
+3246 5222 1
+3247 633 1
+3247 5773 1
+3248 633 1
+3249 633 1
+3249 4247 1
+3249 4263 1
+3250 2625 1
+3250 2700 1
+3250 3251 1
+3252 608 1
+3252 825 1
+3252 1297 1
+3252 2134 1
+3252 2209 1
+3252 2324 1
+3252 2338 1
+3252 2485 1
+3252 2510 1
+3252 2542 1
+3252 2585 1
+3252 2594 1
+3252 2595 1
+3252 2625 1
+3252 2653 1
+3252 2655 1
+3252 2674 1
+3252 2693 1
+3252 2700 1
+3252 2727 1
+3252 3009 1
+3252 3024 1
+3252 3028 1
+3252 3059 1
+3252 3253 1
+3252 3258 1
+3252 3352 1
+3252 3404 1
+3252 3439 1
+3252 3480 1
+3252 3516 1
+3252 3562 1
+3252 3587 1
+3252 3650 1
+3252 3903 1
+3252 4011 1
+3252 4055 1
+3255 15 1
+3255 2625 1
+3255 3408 1
+3256 1549 1
+3256 2066 1
+3256 2364 1
+3256 2398 1
+3256 2411 1
+3256 2594 1
+3256 2746 1
+3256 2790 1
+3256 3020 1
+3256 3021 1
+3256 3276 1
+3256 3483 1
+3256 3650 1
+3256 3717 1
+3256 3769 1
+3256 4011 1
+3256 4953 1
+3256 5412 1
+3256 5423 1
+3257 2116 1
+3258 15 1
+3258 608 1
+3258 827 1
+3258 974 1
+3258 1157 1
+3258 1166 1
+3258 1297 1
+3258 1688 1
+3258 1777 1
+3258 1915 1
+3258 1935 1
+3258 2145 1
+3258 2328 1
+3258 2356 1
+3258 2398 1
+3258 2516 1
+3258 2535 1
+3258 2565 1
+3258 2625 1
+3258 2654 1
+3258 2657 1
+3258 2660 1
+3258 2674 1
+3258 2686 1
+3258 2727 1
+3258 2775 1
+3258 2871 1
+3258 2900 1
+3258 2923 1
+3258 3005 1
+3258 3015 1
+3258 3030 1
+3258 3034 1
+3258 3117 1
+3258 3173 1
+3258 3192 1
+3258 3200 1
+3258 3260 1
+3258 3274 1
+3258 3276 1
+3258 3291 1
+3258 3307 1
+3258 3351 1
+3258 3352 1
+3258 3404 1
+3258 3454 1
+3258 3480 1
+3258 3520 1
+3258 3541 1
+3258 3547 1
+3258 3557 1
+3258 3568 1
+3258 3587 1
+3258 3615 1
+3258 3643 1
+3258 3646 1
+3258 3660 1
+3258 3787 1
+3258 3804 1
+3258 3806 1
+3258 3807 1
+3258 3811 1
+3258 3812 1
+3258 3847 1
+3258 3856 1
+3258 3903 1
+3258 3967 1
+3258 4011 1
+3258 4013 1
+3258 4037 1
+3258 4055 1
+3258 4098 1
+3258 4183 1
+3258 4191 1
+3258 4201 1
+3258 4233 1
+3258 4338 1
+3258 4424 1
+3258 4453 1
+3258 4463 1
+3258 4480 1
+3258 4510 1
+3258 4531 1
+3258 5022 1
+3258 5120 1
+3258 5130 1
+3258 5412 1
+3258 5524 1
+3258 5824 1
+3258 5902 1
+3258 6097 1
+3258 6897 1
+3258 6979 1
+3258 6980 1
+3258 8293 1
+3263 3265 1
+3264 3265 1
+3259 15 1
+3259 3265 1
+3260 1549 1
+3260 1919 1
+3260 2576 1
+3260 2594 1
+3260 2625 1
+3260 2651 1
+3260 3030 1
+3260 3265 1
+3261 3265 1
+3262 2297 1
+3262 2565 1
+3262 2651 1
+3262 2660 1
+3262 3034 1
+3262 3265 1
+3262 3480 1
+3262 3489 1
+3262 3807 1
+3267 2951 1
+3268 2625 1
+3268 2651 1
+212 2625 1
+3269 15 1
+3269 2625 1
+3269 4037 1
+3270 2625 1
+3270 5254 1
+3271 1688 1
+3271 2625 1
+2624 2625 1
+3272 2625 1
+3272 3030 1
+3280 2594 1
+3280 2625 1
+3280 3307 1
+3281 2625 1
+3273 2625 1
+3274 72 1
+3274 155 1
+3274 762 1
+3274 1548 1
+3274 1549 1
+3274 2398 1
+3274 2516 1
+3274 2576 1
+3274 2620 1
+3274 2625 1
+3274 2790 1
+3274 2811 1
+3274 2851 1
+3274 3015 1
+3274 3084 1
+3274 3238 1
+3274 3352 1
+3274 3447 1
+3274 3454 1
+3274 3460 1
+3274 3537 1
+3274 3635 1
+3274 3835 1
+3274 3956 1
+3274 3962 1
+3274 4037 1
+3274 4065 1
+3274 4098 1
+3274 4099 1
+3274 4266 1
+3274 4448 1
+3274 4466 1
+3274 4483 1
+3274 4485 1
+3274 4547 1
+3274 4562 1
+3274 4574 1
+3274 4578 1
+3274 4717 1
+3274 4719 1
+3274 4735 1
+3274 4791 1
+3274 4796 1
+3274 4828 1
+3274 4899 1
+3274 5022 1
+3274 5028 1
+3274 5079 1
+3274 5123 1
+3274 5144 1
+3274 5226 1
+3274 5245 1
+3274 5262 1
+3274 5421 1
+3274 5423 1
+3274 5459 1
+3274 5527 1
+3274 5620 1
+3274 5947 1
+3274 6043 1
+3274 6305 1
+3274 6421 1
+3274 6560 1
+3274 7021 1
+3274 7092 1
+3274 7277 1
+3274 7351 1
+3274 7763 1
+3274 7809 1
+3275 1166 1
+3275 1297 1
+3275 1571 1
+3275 2594 1
+3275 2625 1
+3275 2657 1
+3275 3117 1
+3275 3410 1
+3275 3417 1
+3275 3516 1
+3275 3892 1
+3275 5459 1
+3275 5650 1
+3275 5683 1
+3276 1140 1
+3276 1157 1
+3276 1307 1
+3276 1549 1
+3276 1990 1
+3276 2072 1
+3276 2134 1
+3276 2210 1
+3276 2240 1
+3276 2297 1
+3276 2328 1
+3276 2416 1
+3276 2485 1
+3276 2510 1
+3276 2565 1
+3276 2595 1
+3276 2612 1
+3276 2623 1
+3276 2625 1
+3276 2653 1
+3276 2655 1
+3276 2667 1
+3276 2727 1
+3276 2746 1
+3276 2923 1
+3276 2958 1
+3276 3007 1
+3276 3014 1
+3276 3021 1
+3276 3024 1
+3276 3026 1
+3276 3028 1
+3276 3034 1
+3276 3117 1
+3276 3173 1
+3276 3180 1
+3276 3258 1
+3276 3291 1
+3276 3338 1
+3276 3376 1
+3276 3394 1
+3276 3404 1
+3276 3435 1
+3276 3439 1
+3276 3443 1
+3276 3529 1
+3276 3562 1
+3276 3615 1
+3276 3650 1
+3276 3661 1
+3276 3681 1
+3276 3717 1
+3276 3843 1
+3276 3912 1
+3276 3967 1
+3276 4011 1
+3276 4021 1
+3276 4024 1
+3276 4051 1
+3276 4055 1
+3276 4110 1
+3276 4138 1
+3276 4162 1
+3276 4181 1
+3276 4191 1
+3276 4216 1
+3276 4233 1
+3276 4256 1
+3276 4269 1
+3276 4289 1
+3276 4290 1
+3276 4323 1
+3276 4613 1
+3276 4631 1
+3276 4661 1
+3276 4820 1
+3276 5026 1
+3276 8293 1
+3276 8294 1
+3277 2625 1
+3278 1633 1
+3278 2625 1
+3279 1679 1
+3279 2625 1
+3285 3307 1
+3284 15 1
+3284 2623 1
+3284 3024 1
+3284 3089 1
+3284 3285 1
+3284 3506 1
+3284 3516 1
+3284 3556 1
+3284 3557 1
+3284 3785 1
+3284 3871 1
+3284 3939 1
+3284 3942 1
+3284 3946 1
+3284 3970 1
+3284 3973 1
+3284 4171 1
+3284 4173 1
+3284 4557 1
+3284 4712 1
+3288 3020 1
+3291 465 1
+3291 1166 1
+3291 1633 1
+3291 1679 1
+3291 1744 1
+3291 2240 1
+3291 2290 1
+3291 2326 1
+3291 2328 1
+3291 2356 1
+3291 2517 1
+3291 2565 1
+3291 2595 1
+3291 2619 1
+3291 2623 1
+3291 2660 1
+3291 2687 1
+3291 2727 1
+3291 2819 1
+3291 2900 1
+3291 2923 1
+3291 2958 1
+3291 2973 1
+3291 3014 1
+3291 3059 1
+3291 3089 1
+3291 3334 1
+3291 3351 1
+3291 3352 1
+3291 3439 1
+3291 3506 1
+3291 3516 1
+3291 3562 1
+3291 3587 1
+3291 3787 1
+3291 3807 1
+3291 3970 1
+3291 4011 1
+3291 4013 1
+3291 4162 1
+3291 4365 1
+3291 4385 1
+3291 4424 1
+3291 4531 1
+3291 4578 1
+3291 4712 1
+3291 4713 1
+3291 4735 1
+3291 4786 1
+3291 4999 1
+3291 5509 1
+3291 5543 1
+3291 6148 1
+3291 6151 1
+3291 6246 1
+3291 6432 1
+3291 8293 1
+3291 8295 1
+3292 1679 1
+3292 3291 1
+3292 3631 1
+3292 3956 1
+3292 4201 1
+3292 5002 1
+3292 5200 1
+3292 5404 1
+3294 1679 1
+3296 2576 1
+3296 3307 1
+3297 1633 1
+3297 2114 1
+3297 2210 1
+3297 2338 1
+3297 2356 1
+3297 2565 1
+3297 2655 1
+3297 2958 1
+3297 3007 1
+3297 3021 1
+3297 3117 1
+3297 3238 1
+3297 3258 1
+3297 3307 1
+3297 3351 1
+3297 3371 1
+3297 3408 1
+3297 3498 1
+3297 3717 1
+3297 3871 1
+3297 4071 1
+3297 4384 1
+3297 4401 1
+3297 4940 1
+3297 5179 1
+3297 5262 1
+3297 5404 1
+3297 5529 1
+3297 6032 1
+3297 6414 1
+3297 6596 1
+3297 6618 1
+3297 6634 1
+3297 6759 1
+3297 6918 1
+3297 7021 1
+3297 7059 1
+3297 7063 1
+3297 7092 1
+3297 7397 1
+3297 7620 1
+3297 7860 1
+3297 7910 1
+3297 7961 1
+3297 8037 1
+3297 8044 1
+3297 8073 1
+3297 8083 1
+3297 8122 1
+3297 8141 1
+3297 8293 1
+3298 3307 1
+3299 3307 1
+3300 2594 1
+3300 3021 1
+3300 3307 1
+3300 3338 1
+3300 3351 1
+3301 1297 1
+3301 2114 1
+3301 2657 1
+3301 2674 1
+3301 3026 1
+3301 3059 1
+3301 3307 1
+3301 3404 1
+3301 3483 1
+3301 3576 1
+3301 3680 1
+3301 3847 1
+3301 3871 1
+3301 3887 1
+3301 3892 1
+3302 3307 1
+3303 3307 1
+1529 3307 1
+1529 3755 1
+3304 285 1
+3304 1633 1
+3304 1744 1
+3304 2257 1
+3304 2297 1
+3304 2338 1
+3304 2411 1
+3304 2485 1
+3304 2542 1
+3304 2565 1
+3304 2623 1
+3304 2657 1
+3304 2693 1
+3304 2790 1
+3304 3005 1
+3304 3010 1
+3304 3018 1
+3304 3114 1
+3304 3173 1
+3304 3307 1
+3304 3371 1
+3304 3408 1
+3304 3435 1
+3304 3439 1
+3304 3473 1
+3304 3516 1
+3304 3529 1
+3304 3557 1
+3304 3580 1
+3304 3646 1
+3304 8293 1
+3305 285 1
+3305 2565 1
+3305 3018 1
+3305 3307 1
+3305 4796 1
+3309 1297 1
+3309 2474 1
+3309 4298 1
+3309 5721 1
+3310 1191 1
+3310 2356 1
+3310 2474 1
+3310 2658 1
+3310 4875 1
+3310 5529 1
+3310 6043 1
+3310 6151 1
+3310 6523 1
+3310 6560 1
+3310 6634 1
+3310 6780 1
+3310 6784 1
+3310 7063 1
+3310 7391 1
+3310 7587 1
+3310 8051 1
+3310 8212 1
+3311 2474 1
+3312 2651 1
+3313 1777 1
+3313 2328 1
+3313 2651 1
+3313 3720 1
+3313 3816 1
+3282 2651 1
+3282 2747 1
+3282 2790 1
+3282 2923 1
+3282 3635 1
+3314 2651 1
+3315 1247 1
+3315 2258 1
+3315 2585 1
+3315 2651 1
+3315 2859 1
+3315 2958 1
+3315 3260 1
+3315 4191 1
+3315 4587 1
+3315 4613 1
+3315 5457 1
+3315 5529 1
+3315 6001 1
+3290 737 1
+3290 1385 1
+3290 1571 1
+3290 1688 1
+3290 1706 1
+3290 2237 1
+3290 2252 1
+3290 2290 1
+3290 2325 1
+3290 2485 1
+3290 2510 1
+3290 2535 1
+3290 2585 1
+3290 2594 1
+3290 2595 1
+3290 2597 1
+3290 2651 1
+3290 2746 1
+3290 2747 1
+3290 2831 1
+3290 3117 1
+3290 3351 1
+3290 3352 1
+3290 3489 1
+3290 3587 1
+3290 3650 1
+3290 3926 1
+3290 4037 1
+3290 4040 1
+3290 4212 1
+3290 4531 1
+3290 4587 1
+3290 4824 1
+3290 5539 1
+3290 5563 1
+3290 8293 1
+3318 2651 1
+3316 2398 1
+3316 2651 1
+3316 5605 1
+3317 825 1
+3317 2134 1
+3317 2210 1
+3317 2328 1
+3317 2508 1
+3317 2535 1
+3317 2619 1
+3317 2651 1
+3317 2746 1
+3317 3024 1
+3317 3260 1
+3317 3439 1
+3317 3568 1
+3317 3661 1
+3317 3800 1
+3320 3946 1
+3320 5806 1
+3320 6714 1
+3320 7442 1
+3320 8295 1
+2325 3320 1
+2325 3321 1
+3321 2237 1
+3321 2325 1
+3321 3084 1
+3321 3238 1
+3321 3417 1
+3321 3456 1
+3321 3691 1
+3321 4110 1
+3321 4124 1
+3321 4191 1
+3321 4600 1
+3321 4964 1
+3321 4999 1
+3321 5073 1
+3321 5412 1
+3321 5479 1
+3321 7493 1
+3321 7694 1
+3322 2325 1
+3323 2325 1
+3323 8293 1
+3325 417 1
+3325 762 1
+3325 2290 1
+3325 2356 1
+3325 2653 1
+3325 2667 1
+3326 825 1
+3326 1688 1
+3326 1984 1
+3326 2356 1
+3326 2653 1
+3326 2871 1
+3326 2958 1
+3326 3014 1
+3326 3021 1
+3326 3030 1
+3326 3192 1
+3326 3443 1
+3326 3898 1
+3326 4162 1
+3326 4662 1
+3326 4735 1
+3326 4827 1
+3326 5817 1
+3335 3030 1
+3331 3030 1
+3332 3030 1
+3333 417 1
+3333 1571 1
+3333 1744 1
+3333 2290 1
+3333 2485 1
+3333 2657 1
+3333 2660 1
+3333 2674 1
+3333 3030 1
+3333 3148 1
+3333 3371 1
+3333 3587 1
+3333 3681 1
+3333 5226 1
+3333 5482 1
+3334 1571 1
+3334 2398 1
+3334 2646 1
+3334 3030 1
+3334 3394 1
+3334 3645 1
+3334 3812 1
+3334 4191 1
+3334 4290 1
+3334 4299 1
+3334 5233 1
+3334 7381 1
+3334 7632 1
+3338 1633 1
+3338 2114 1
+3338 3408 1
+3339 2594 1
+3340 1297 1
+3340 2594 1
+3340 5254 1
+3340 6148 1
+3341 2594 1
+3342 2594 1
+3343 1297 1
+3343 1706 1
+3343 2209 1
+3343 2510 1
+3343 2585 1
+3343 2594 1
+3343 2974 1
+3343 3005 1
+3343 3028 1
+3343 3117 1
+3343 3541 1
+3343 3772 1
+3343 3888 1
+3344 2594 1
+3345 204 1
+3345 737 1
+3345 1571 1
+3345 1633 1
+3345 2145 1
+3345 2297 1
+3345 2398 1
+3345 2440 1
+3345 2542 1
+3345 2623 1
+3345 2660 1
+3345 2819 1
+3345 3021 1
+3345 3408 1
+3345 3473 1
+3345 3586 1
+3345 4175 1
+3345 4709 1
+3345 4964 1
+3345 5037 1
+3345 5123 1
+3345 5182 1
+3345 5254 1
+3345 5459 1
+3345 5596 1
+3345 5775 1
+3345 5784 1
+3345 5925 1
+3345 6458 1
+3345 6496 1
+3345 6498 1
+3345 6528 1
+3345 6570 1
+3345 6600 1
+3345 6632 1
+3346 2657 1
+3346 3021 1
+3346 3454 1
+3346 4507 1
+3346 4735 1
+3348 1026 1
+3348 3334 1
+3348 3351 1
+3348 3459 1
+3348 4037 1
+3348 5233 1
+3348 5246 1
+3348 5432 1
+3348 5806 1
+3348 6006 1
+3348 6299 1
+3348 6330 1
+3348 6334 1
+3348 6472 1
+3348 6498 1
+3348 6511 1
+3348 6571 1
+3348 6634 1
+3348 6755 1
+3348 7092 1
+3348 7442 1
+3348 7588 1
+3348 7809 1
+3348 8044 1
+3348 8297 1
+3349 1571 1
+3349 2016 1
+3349 2209 1
+3349 2252 1
+3349 2597 1
+3349 2667 1
+3349 3351 1
+3349 3580 1
+3349 3587 1
+3350 737 1
+3350 1360 1
+3350 2144 1
+3350 2145 1
+3350 2237 1
+3350 2398 1
+3350 2585 1
+3350 2619 1
+3350 2831 1
+3350 2871 1
+3350 3002 1
+3350 3027 1
+3350 3028 1
+3350 3034 1
+3350 3103 1
+3350 3117 1
+3350 3144 1
+3350 3260 1
+3350 3321 1
+3350 3334 1
+3350 3351 1
+3350 3352 1
+3350 3443 1
+3350 3447 1
+3350 3452 1
+3350 3453 1
+3350 3454 1
+3350 3464 1
+3350 3489 1
+3350 3516 1
+3350 3615 1
+3350 3635 1
+3350 3660 1
+3350 3748 1
+3350 3812 1
+3350 3843 1
+3350 3897 1
+3350 3903 1
+3350 3956 1
+3350 3958 1
+3350 4044 1
+3350 4261 1
+3350 4299 1
+3350 4448 1
+3350 4485 1
+3350 4510 1
+3350 4528 1
+3350 4587 1
+3350 4653 1
+3350 4662 1
+3350 4706 1
+3350 4827 1
+3350 4846 1
+3350 4962 1
+3350 5189 1
+3352 72 1
+3352 285 1
+3352 417 1
+3352 465 1
+3352 608 1
+3352 762 1
+3352 825 1
+3352 827 1
+3352 974 1
+3352 1140 1
+3352 1166 1
+3352 1185 1
+3352 1239 1
+3352 1247 1
+3352 1297 1
+3352 1307 1
+3352 1310 1
+3352 1385 1
+3352 1453 1
+3352 1549 1
+3352 1571 1
+3352 1633 1
+3352 1680 1
+3352 1688 1
+3352 1706 1
+3352 1729 1
+3352 1769 1
+3352 1799 1
+3352 1990 1
+3352 2066 1
+3352 2114 1
+3352 2134 1
+3352 2144 1
+3352 2145 1
+3352 2240 1
+3352 2252 1
+3352 2257 1
+3352 2289 1
+3352 2297 1
+3352 2324 1
+3352 2326 1
+3352 2328 1
+3352 2338 1
+3352 2354 1
+3352 2369 1
+3352 2381 1
+3352 2384 1
+3352 2398 1
+3352 2411 1
+3352 2433 1
+3352 2485 1
+3352 2506 1
+3352 2510 1
+3352 2516 1
+3352 2517 1
+3352 2535 1
+3352 2544 1
+3352 2565 1
+3352 2576 1
+3352 2592 1
+3352 2595 1
+3352 2619 1
+3352 2646 1
+3352 2653 1
+3352 2654 1
+3352 2655 1
+3352 2657 1
+3352 2660 1
+3352 2667 1
+3352 2674 1
+3352 2687 1
+3352 2689 1
+3352 2693 1
+3352 2696 1
+3352 2727 1
+3352 2746 1
+3352 2747 1
+3352 2760 1
+3352 2775 1
+3352 2785 1
+3352 2787 1
+3352 2790 1
+3352 2819 1
+3352 2822 1
+3352 2859 1
+3352 2871 1
+3352 2900 1
+3352 2909 1
+3352 2932 1
+3352 2958 1
+3352 2973 1
+3352 2981 1
+3352 3005 1
+3352 3007 1
+3352 3009 1
+3352 3014 1
+3352 3024 1
+3352 3026 1
+3352 3027 1
+3352 3028 1
+3352 3059 1
+3352 3084 1
+3352 3089 1
+3352 3092 1
+3352 3103 1
+3352 3106 1
+3352 3114 1
+3352 3117 1
+3352 3125 1
+3352 3140 1
+3352 3144 1
+3352 3173 1
+3352 3180 1
+3352 3192 1
+3352 3258 1
+3352 3260 1
+3352 3276 1
+3352 3291 1
+3352 3309 1
+3352 3313 1
+3352 3346 1
+3352 3394 1
+3352 3404 1
+3352 3408 1
+3352 3417 1
+3352 3435 1
+3352 3443 1
+3352 3447 1
+3352 3452 1
+3352 3454 1
+3352 3455 1
+3352 3456 1
+3352 3464 1
+3352 3483 1
+3352 3516 1
+3352 3529 1
+3352 3537 1
+3352 3557 1
+3352 3562 1
+3352 3567 1
+3352 3568 1
+3352 3607 1
+3352 3615 1
+3352 3631 1
+3352 3635 1
+3352 3643 1
+3352 3645 1
+3352 3650 1
+3352 3660 1
+3352 3661 1
+3352 3664 1
+3352 3670 1
+3352 3680 1
+3352 3691 1
+3352 3717 1
+3352 3724 1
+3352 3800 1
+3352 3808 1
+3352 3812 1
+3352 3813 1
+3352 3835 1
+3352 3843 1
+3352 3847 1
+3352 3887 1
+3352 3892 1
+3352 3897 1
+3352 3903 1
+3352 3910 1
+3352 3921 1
+3352 3926 1
+3352 3937 1
+3352 3958 1
+3352 3967 1
+3352 3970 1
+3352 3976 1
+3352 3999 1
+3352 4011 1
+3352 4013 1
+3352 4021 1
+3352 4024 1
+3352 4037 1
+3352 4040 1
+3352 4043 1
+3352 4051 1
+3352 4055 1
+3352 4058 1
+3352 4088 1
+3352 4110 1
+3352 4124 1
+3352 4138 1
+3352 4162 1
+3352 4179 1
+3352 4181 1
+3352 4191 1
+3352 4201 1
+3352 4212 1
+3352 4233 1
+3352 4234 1
+3352 4247 1
+3352 4256 1
+3352 4263 1
+3352 4266 1
+3352 4269 1
+3352 4289 1
+3352 4290 1
+3352 4299 1
+3352 4315 1
+3352 4323 1
+3352 4335 1
+3352 4349 1
+3352 4355 1
+3352 4365 1
+3352 4373 1
+3352 4384 1
+3352 4400 1
+3352 4412 1
+3352 4417 1
+3352 4422 1
+3352 4424 1
+3352 4448 1
+3352 4471 1
+3352 4480 1
+3352 4482 1
+3352 4485 1
+3352 4510 1
+3352 4528 1
+3352 4531 1
+3352 4536 1
+3352 4547 1
+3352 4551 1
+3352 4587 1
+3352 4613 1
+3352 4666 1
+3352 4712 1
+3352 4717 1
+3352 4719 1
+3352 4735 1
+3352 4824 1
+3352 4827 1
+3352 4828 1
+3352 4866 1
+3352 4929 1
+3352 4953 1
+3352 4962 1
+3352 4964 1
+3352 4999 1
+3352 5083 1
+3352 5092 1
+3352 5123 1
+3352 5130 1
+3352 5132 1
+3352 5162 1
+3352 5204 1
+3352 5222 1
+3352 5233 1
+3352 5239 1
+3352 5288 1
+3352 5308 1
+3352 5323 1
+3352 5327 1
+3352 5335 1
+3352 5341 1
+3352 5364 1
+3352 5392 1
+3352 5412 1
+3352 5423 1
+3352 5430 1
+3352 5449 1
+3352 5457 1
+3352 5467 1
+3352 5817 1
+3352 8293 1
+3352 8294 1
+3353 2565 1
+3354 1823 1
+3354 2565 1
+3354 3371 1
+3354 4791 1
+3354 4796 1
+3355 3348 1
+3355 5432 1
+3355 8044 1
+3360 3348 1
+3356 3348 1
+3357 3348 1
+3357 3769 1
+3358 3348 1
+3359 3348 1
+3306 1297 1
+3306 2535 1
+3306 3348 1
+3306 3376 1
+3306 3645 1
+3306 4349 1
+3306 4453 1
+3361 2338 1
+3361 3348 1
+3362 3348 1
+3368 3371 1
+3369 3371 1
+3370 3371 1
+3366 72 1
+3366 1024 1
+3366 1140 1
+3366 1919 1
+3366 1961 1
+3366 2328 1
+3366 2364 1
+3366 2433 1
+3366 2507 1
+3366 2535 1
+3366 2565 1
+3366 2576 1
+3366 2657 1
+3366 2775 1
+3366 3014 1
+3366 3027 1
+3366 3334 1
+3366 3352 1
+3366 3371 1
+3366 3456 1
+3366 3937 1
+3366 3976 1
+3366 4124 1
+3366 4127 1
+3366 4175 1
+3366 4199 1
+3366 4272 1
+3366 4298 1
+3366 4310 1
+3366 4331 1
+3366 4335 1
+3366 4365 1
+3366 4386 1
+3366 4448 1
+3366 4466 1
+3366 4500 1
+3366 4574 1
+3366 4712 1
+3366 4777 1
+3366 4875 1
+3366 5020 1
+3366 5210 1
+3366 5233 1
+3366 5308 1
+3366 5311 1
+3366 5449 1
+3366 5454 1
+3366 5459 1
+3366 5511 1
+3366 5527 1
+3366 5637 1
+3366 5693 1
+3366 5817 1
+3366 5936 1
+3366 5963 1
+3366 5969 1
+3366 6027 1
+3366 6105 1
+3366 6306 1
+3366 6421 1
+3366 6914 1
+3366 7115 1
+3366 8295 1
+3367 3371 1
+3367 4263 1
+3367 7400 1
+3373 1157 1
+3373 2328 1
+3373 2746 1
+3373 2981 1
+3373 3192 1
+3373 3615 1
+3373 4162 1
+3373 4179 1
+3373 4191 1
+3373 4263 1
+3373 4269 1
+3373 4323 1
+3374 3376 1
+3374 3489 1
+3374 3516 1
+3374 4534 1
+3375 737 1
+3375 1915 1
+3375 2290 1
+3375 2328 1
+3375 2411 1
+3375 2485 1
+3375 2510 1
+3375 2542 1
+3375 2544 1
+3375 2585 1
+3375 2653 1
+3375 2657 1
+3375 2727 1
+3375 2746 1
+3375 2859 1
+3375 2923 1
+3375 2958 1
+3375 3005 1
+3375 3026 1
+3375 3260 1
+3375 3276 1
+3375 3334 1
+3375 3376 1
+3375 3464 1
+3375 3516 1
+3375 3520 1
+3375 3557 1
+3375 3562 1
+3375 3615 1
+3375 3629 1
+3375 3645 1
+3375 3680 1
+3375 3898 1
+3375 3903 1
+3375 3974 1
+3375 4299 1
+3375 4385 1
+3375 4528 1
+3375 4536 1
+3375 4977 1
+3375 5285 1
+3375 5421 1
+3375 5743 1
+3377 2297 1
+3377 2654 1
+3377 3489 1
+3377 3587 1
+3378 72 1
+3378 737 1
+3378 762 1
+3378 896 1
+3378 1297 1
+3378 1385 1
+3378 1961 1
+3378 2160 1
+3378 2297 1
+3378 2384 1
+3378 2398 1
+3378 2411 1
+3378 2456 1
+3378 2485 1
+3378 2657 1
+3378 3321 1
+3378 3352 1
+3378 3417 1
+3378 3443 1
+3378 3452 1
+3378 3562 1
+3378 3635 1
+3378 3720 1
+3378 3854 1
+3378 4055 1
+3378 4099 1
+3378 4162 1
+3378 4179 1
+3378 4463 1
+3378 4510 1
+3378 4600 1
+3378 4735 1
+3378 4781 1
+3378 4846 1
+3378 5022 1
+3378 5178 1
+3378 5412 1
+3378 5459 1
+3378 5503 1
+3378 6934 1
+3378 7694 1
+3379 417 1
+3379 974 1
+3379 1571 1
+3379 1633 1
+3379 2016 1
+3379 2209 1
+3379 2252 1
+3379 2290 1
+3379 2297 1
+3379 2576 1
+3379 2597 1
+3379 2653 1
+3379 2660 1
+3379 2667 1
+3379 3009 1
+3379 3334 1
+3379 3473 1
+3379 3489 1
+3379 3516 1
+3380 72 1
+3380 204 1
+3380 1157 1
+3380 1166 1
+3380 1982 1
+3380 2290 1
+3380 2297 1
+3380 2324 1
+3380 2328 1
+3380 2411 1
+3380 2485 1
+3380 2510 1
+3380 2576 1
+3380 2585 1
+3380 2654 1
+3380 2657 1
+3380 2660 1
+3380 2727 1
+3380 2790 1
+3380 3005 1
+3380 3148 1
+3380 3173 1
+3380 3276 1
+3380 3408 1
+3380 3409 1
+3380 3439 1
+3380 3506 1
+3380 3516 1
+3380 3520 1
+3380 3615 1
+3380 3623 1
+3380 3769 1
+3380 4795 1
+3380 5002 1
+3380 5378 1
+3380 6918 1
+3380 6946 1
+3380 7809 1
+3380 8042 1
+3380 8051 1
+3380 8209 1
+3380 8219 1
+3381 15 1
+3381 1403 1
+3381 1571 1
+3381 1823 1
+3381 2016 1
+3381 2290 1
+3381 2297 1
+3381 2433 1
+3381 2511 1
+3381 2542 1
+3381 2623 1
+3381 2774 1
+3381 2785 1
+3381 2819 1
+3381 2851 1
+3381 2940 1
+3381 3000 1
+3381 3238 1
+3381 3346 1
+3381 3489 1
+3381 3631 1
+3381 3634 1
+3381 3726 1
+3381 3792 1
+3381 3803 1
+3381 3873 1
+3381 3969 1
+3381 4488 1
+3381 4536 1
+3381 4666 1
+3381 4709 1
+3381 4713 1
+3381 4764 1
+3381 4884 1
+3381 4944 1
+3381 4980 1
+3381 5002 1
+3381 5012 1
+3381 5022 1
+3381 5028 1
+3381 5188 1
+3381 5199 1
+3381 5200 1
+3381 5254 1
+3381 5288 1
+3381 5289 1
+3381 5295 1
+3381 5335 1
+3381 5384 1
+3381 5432 1
+3381 5465 1
+3381 5484 1
+3381 5524 1
+3381 5543 1
+3381 5563 1
+3381 5582 1
+3381 5596 1
+3381 5697 1
+3381 5714 1
+3381 5739 1
+3381 5760 1
+3381 5776 1
+3381 5798 1
+3381 5800 1
+3381 5804 1
+3381 5806 1
+3381 5814 1
+3381 5818 1
+3381 5819 1
+3381 5822 1
+3381 5827 1
+3381 5835 1
+3381 5871 1
+3381 5872 1
+3381 5897 1
+3381 5902 1
+3381 5922 1
+3381 5932 1
+3381 5998 1
+3381 6000 1
+3381 6097 1
+3381 6123 1
+3381 6156 1
+3381 6170 1
+3381 6218 1
+3381 6221 1
+3381 6227 1
+3381 6243 1
+3381 6262 1
+3381 6272 1
+3381 6305 1
+3381 6306 1
+3381 6328 1
+3381 6334 1
+3381 6347 1
+3381 6414 1
+3381 6417 1
+3381 6432 1
+3381 6441 1
+3381 6442 1
+3381 6498 1
+3381 6501 1
+3381 6566 1
+3381 6594 1
+3381 6595 1
+3381 6599 1
+3381 6600 1
+3381 6624 1
+3381 6632 1
+3381 6634 1
+3381 6699 1
+3381 6712 1
+3381 6715 1
+3381 6720 1
+3381 6736 1
+3381 6770 1
+3381 6774 1
+3381 6783 1
+3381 6784 1
+3381 6790 1
+3381 6832 1
+3381 6855 1
+3381 6860 1
+3381 6869 1
+3381 6873 1
+3381 6897 1
+3381 6901 1
+3381 6907 1
+3381 6913 1
+3381 6918 1
+3381 6930 1
+3381 6934 1
+3381 6945 1
+3381 6948 1
+3381 6955 1
+3381 6976 1
+3381 7021 1
+3381 7052 1
+3381 7073 1
+3381 7088 1
+3381 7094 1
+3381 7101 1
+3381 7108 1
+3381 7115 1
+3381 7119 1
+3381 7143 1
+3381 7144 1
+3381 7214 1
+3381 7237 1
+3381 7279 1
+3381 7280 1
+3381 7295 1
+3381 7301 1
+3381 7373 1
+3381 7378 1
+3381 7381 1
+3381 7414 1
+3381 7422 1
+3381 7443 1
+3381 7450 1
+3381 7478 1
+3381 7510 1
+3381 7512 1
+3381 7529 1
+3381 7618 1
+3381 7624 1
+3381 7632 1
+3381 7646 1
+3381 7647 1
+3381 7651 1
+3381 7662 1
+3381 7694 1
+3381 7695 1
+3381 7726 1
+3381 7757 1
+3381 7788 1
+3381 7899 1
+3381 8083 1
+3381 8122 1
+3381 8134 1
+3382 2297 1
+3383 2297 1
+3383 2653 1
+3384 2297 1
+3384 2398 1
+3384 3580 1
+3385 2297 1
+3388 15 1
+3388 737 1
+3388 762 1
+3388 1159 1
+3388 1633 1
+3388 1919 1
+3388 2565 1
+3388 2646 1
+3388 2657 1
+3388 2871 1
+3388 3352 1
+3388 3645 1
+3388 3835 1
+3388 4179 1
+3388 4510 1
+3389 1633 1
+3389 5210 1
+3391 417 1
+3391 1633 1
+3391 2508 1
+3391 2660 1
+3392 827 1
+3392 1239 1
+3392 1297 1
+3392 1549 1
+3392 1633 1
+3392 2066 1
+3392 2324 1
+3392 2510 1
+3392 2544 1
+3392 2576 1
+3392 2585 1
+3392 2619 1
+3392 2657 1
+3392 2822 1
+3392 3024 1
+3392 3084 1
+3392 3284 1
+3392 3454 1
+3392 3529 1
+3392 3555 1
+3392 3650 1
+3392 3769 1
+3392 3800 1
+3392 3816 1
+3392 3892 1
+3392 3910 1
+3392 3967 1
+3392 3970 1
+3392 3980 1
+3392 4583 1
+3392 5092 1
+3392 5605 1
+3392 7620 1
+3393 1633 1
+3393 3752 1
+3393 4335 1
+3393 5459 1
+3393 5683 1
+3393 5897 1
+3393 5998 1
+3393 6044 1
+3393 6774 1
+3393 7946 1
+3394 465 1
+3394 737 1
+3394 762 1
+3394 778 1
+3394 825 1
+3394 827 1
+3394 974 1
+3394 1297 1
+3394 1305 1
+3394 1549 1
+3394 1633 1
+3394 1688 1
+3394 1706 1
+3394 1729 1
+3394 1777 1
+3394 1915 1
+3394 1990 1
+3394 2066 1
+3394 2129 1
+3394 2144 1
+3394 2209 1
+3394 2237 1
+3394 2252 1
+3394 2257 1
+3394 2324 1
+3394 2326 1
+3394 2328 1
+3394 2381 1
+3394 2398 1
+3394 2411 1
+3394 2485 1
+3394 2508 1
+3394 2510 1
+3394 2565 1
+3394 2576 1
+3394 2585 1
+3394 2646 1
+3394 2653 1
+3394 2654 1
+3394 2657 1
+3394 2660 1
+3394 2687 1
+3394 2693 1
+3394 2727 1
+3394 2746 1
+3394 2747 1
+3394 2775 1
+3394 2790 1
+3394 2799 1
+3394 2900 1
+3394 2923 1
+3394 2932 1
+3394 2958 1
+3394 2974 1
+3394 3005 1
+3394 3010 1
+3394 3014 1
+3394 3027 1
+3394 3084 1
+3394 3103 1
+3394 3117 1
+3394 3125 1
+3394 3144 1
+3394 3173 1
+3394 3180 1
+3394 3260 1
+3394 3276 1
+3394 3291 1
+3394 3301 1
+3394 3334 1
+3394 3352 1
+3394 3404 1
+3394 3409 1
+3394 3410 1
+3394 3439 1
+3394 3446 1
+3394 3447 1
+3394 3453 1
+3394 3454 1
+3394 3455 1
+3394 3456 1
+3394 3473 1
+3394 3480 1
+3394 3483 1
+3394 3516 1
+3394 3529 1
+3394 3537 1
+3394 3541 1
+3394 3548 1
+3394 3562 1
+3394 3568 1
+3394 3615 1
+3394 3629 1
+3394 3634 1
+3394 3635 1
+3394 3645 1
+3394 3650 1
+3394 3660 1
+3394 3671 1
+3394 3681 1
+3394 3737 1
+3394 3745 1
+3394 3769 1
+3394 3772 1
+3394 3776 1
+3394 3785 1
+3394 3800 1
+3394 3811 1
+3394 3812 1
+3394 3813 1
+3394 3822 1
+3394 3867 1
+3394 3898 1
+3394 3903 1
+3394 3914 1
+3394 3922 1
+3394 3926 1
+3394 3942 1
+3394 3958 1
+3394 3974 1
+3394 4011 1
+3394 4021 1
+3394 4031 1
+3394 4124 1
+3394 4189 1
+3394 4191 1
+3394 4256 1
+3394 4289 1
+3394 4290 1
+3394 4297 1
+3394 4299 1
+3394 4315 1
+3394 4373 1
+3394 4385 1
+3394 4386 1
+3394 4400 1
+3394 4402 1
+3394 4424 1
+3394 4528 1
+3394 4536 1
+3394 4578 1
+3394 4719 1
+3394 4735 1
+3394 4783 1
+3394 4811 1
+3394 5130 1
+3394 5189 1
+3394 5204 1
+3394 5301 1
+3394 5412 1
+3394 5417 1
+3394 5564 1
+3394 5882 1
+3394 5891 1
+3394 7620 1
+3394 8294 1
+3395 3018 1
+3396 2016 1
+3396 3018 1
+3397 2654 1
+3397 3018 1
+3397 3408 1
+3398 3018 1
+3399 3018 1
+3399 3408 1
+3399 4181 1
+3400 3018 1
+3401 3018 1
+3403 3018 1
+3403 3408 1
+3403 5254 1
+3402 608 1
+3402 762 1
+3402 1157 1
+3402 1185 1
+3402 1305 1
+3402 1310 1
+3402 1549 1
+3402 1688 1
+3402 1729 1
+3402 1744 1
+3402 1990 1
+3402 2237 1
+3402 2252 1
+3402 2324 1
+3402 2364 1
+3402 2369 1
+3402 2381 1
+3402 2398 1
+3402 2516 1
+3402 2517 1
+3402 2595 1
+3402 2623 1
+3402 2646 1
+3402 2653 1
+3402 2654 1
+3402 2689 1
+3402 2760 1
+3402 2775 1
+3402 2799 1
+3402 2819 1
+3402 2822 1
+3402 2831 1
+3402 3002 1
+3402 3014 1
+3402 3018 1
+3402 3027 1
+3402 3034 1
+3402 3092 1
+3402 3103 1
+3402 3106 1
+3402 3144 1
+3402 3180 1
+3402 3276 1
+3402 3321 1
+3402 3334 1
+3402 3352 1
+3402 3394 1
+3402 3433 1
+3402 3439 1
+3402 3443 1
+3402 3452 1
+3402 3453 1
+3402 3454 1
+3402 3455 1
+3402 3460 1
+3402 3464 1
+3402 3489 1
+3402 3516 1
+3402 3537 1
+3402 3607 1
+3402 3635 1
+3402 3645 1
+3402 3660 1
+3402 3664 1
+3402 3720 1
+3402 3724 1
+3402 3748 1
+3402 3843 1
+3402 3910 1
+3402 3946 1
+3402 3956 1
+3402 3958 1
+3402 3962 1
+3402 4011 1
+3402 4021 1
+3402 4037 1
+3402 4044 1
+3402 4124 1
+3402 4199 1
+3402 4261 1
+3402 4266 1
+3402 4297 1
+3402 4299 1
+3402 4335 1
+3402 4349 1
+3402 4400 1
+3402 4453 1
+3402 4463 1
+3402 4480 1
+3402 4485 1
+3402 4547 1
+3402 4578 1
+3402 4600 1
+3402 4613 1
+3402 4661 1
+3402 4666 1
+3402 4719 1
+3402 4735 1
+3402 4792 1
+3402 4796 1
+3402 4808 1
+3402 4820 1
+3402 4827 1
+3402 4828 1
+3402 4953 1
+3402 5026 1
+3402 5033 1
+3402 5083 1
+3402 5092 1
+3402 5100 1
+3402 5106 1
+3402 5130 1
+3402 5204 1
+3402 5222 1
+3402 5335 1
+3402 5392 1
+3402 5412 1
+3402 5449 1
+3402 5463 1
+3402 5506 1
+3402 5817 1
+3402 6032 1
+3036 2653 1
+3036 2660 1
+3036 2819 1
+3036 3009 1
+3036 3516 1
+3036 3592 1
+3036 8293 1
+3404 465 1
+3404 737 1
+3404 896 1
+3404 1159 1
+3404 1297 1
+3404 1688 1
+3404 1799 1
+3404 2114 1
+3404 2257 1
+3404 2276 1
+3404 2290 1
+3404 2324 1
+3404 2485 1
+3404 2585 1
+3404 2623 1
+3404 2654 1
+3404 2657 1
+3404 2667 1
+3404 2693 1
+3404 2727 1
+3404 2747 1
+3404 2819 1
+3404 2822 1
+3404 2909 1
+3404 2973 1
+3404 3010 1
+3404 3027 1
+3404 3059 1
+3404 3089 1
+3404 3103 1
+3404 3114 1
+3404 3148 1
+3404 3191 1
+3404 3238 1
+3404 3352 1
+3404 3408 1
+3404 3417 1
+3404 3454 1
+3404 3480 1
+3404 3489 1
+3404 3529 1
+3404 3548 1
+3404 3586 1
+3404 3587 1
+3404 3643 1
+3404 3650 1
+3404 3680 1
+3404 3792 1
+3404 3808 1
+3404 3897 1
+3404 3903 1
+3404 3910 1
+3404 3922 1
+3404 4041 1
+3404 4138 1
+3404 4175 1
+3404 4289 1
+3404 4310 1
+3404 4448 1
+3404 4482 1
+3404 4527 1
+3404 4712 1
+3404 4884 1
+3404 4940 1
+3404 5100 1
+3404 5106 1
+3404 5255 1
+3404 5323 1
+3404 5341 1
+3404 5375 1
+3404 5430 1
+3404 5439 1
+3404 5465 1
+3404 5482 1
+3404 5732 1
+3404 5839 1
+3404 5844 1
+3404 5886 1
+3404 5891 1
+3404 5947 1
+3404 5994 1
+3404 6029 1
+3404 6307 1
+3404 6555 1
+3404 7092 1
+3404 7624 1
+3404 7833 1
+3404 8263 1
+3404 8293 1
+3405 3408 1
+3390 72 1
+3390 1360 1
+3390 1473 1
+3390 2001 1
+3390 2258 1
+3390 2338 1
+3390 2364 1
+3390 2398 1
+3390 2516 1
+3390 2576 1
+3390 2605 1
+3390 2696 1
+3390 2822 1
+3390 3073 1
+3390 3274 1
+3390 3291 1
+3390 3321 1
+3390 3393 1
+3390 3408 1
+3390 3417 1
+3390 3435 1
+3390 3460 1
+3390 3537 1
+3390 3748 1
+3390 3796 1
+3390 3854 1
+3390 3910 1
+3390 3958 1
+3390 4124 1
+3390 4335 1
+3390 4338 1
+3390 4530 1
+3390 4653 1
+3390 4706 1
+3390 4827 1
+3390 4899 1
+3390 4964 1
+3390 4986 1
+3390 4993 1
+3390 5072 1
+3390 5123 1
+3390 5226 1
+3390 5263 1
+3390 5321 1
+3390 5335 1
+3390 5388 1
+3390 5454 1
+3390 5459 1
+3390 5511 1
+3390 5592 1
+3390 5637 1
+3390 5640 1
+3390 5651 1
+3390 5693 1
+3390 5705 1
+3390 5732 1
+3390 5737 1
+3390 5743 1
+3390 5756 1
+3390 5775 1
+3407 3408 1
+3406 3352 1
+3406 3408 1
+3406 3541 1
+3406 4587 1
+3409 3752 1
+3411 285 1
+3412 285 1
+3422 2485 1
+3422 2660 1
+3422 8293 1
+3423 8293 1
+3416 8293 1
+3424 8293 1
+3425 5375 1
+3425 8293 1
+3418 8293 1
+3417 762 1
+3417 1688 1
+3417 2134 1
+3417 2237 1
+3417 2257 1
+3417 2354 1
+3417 2411 1
+3417 2565 1
+3417 2597 1
+3417 2653 1
+3417 2657 1
+3417 2822 1
+3417 2909 1
+3417 2932 1
+3417 3173 1
+3417 3321 1
+3417 3404 1
+3417 3447 1
+3417 3460 1
+3417 3871 1
+3417 3910 1
+3417 4037 1
+3417 4181 1
+3417 4310 1
+3417 4448 1
+3417 4983 1
+3417 5026 1
+3417 5335 1
+3417 5341 1
+3417 8293 1
+3426 8293 1
+3434 2338 1
+3433 2338 1
+3433 2775 1
+3433 2811 1
+3433 3321 1
+3433 3352 1
+3433 4212 1
+3433 4661 1
+3433 4875 1
+3433 4962 1
+3435 1744 1
+3435 2384 1
+3435 3999 1
+3435 4510 1
+3436 2576 1
+3437 2576 1
+3440 2576 1
+3441 2576 1
+3441 3946 1
+3443 15 1
+3443 762 1
+3443 1961 1
+3443 2328 1
+3443 2456 1
+3443 2508 1
+3443 2565 1
+3443 2576 1
+3443 2693 1
+3443 2799 1
+3443 3026 1
+3443 3456 1
+3443 3720 1
+3443 3724 1
+3443 3813 1
+3443 3875 1
+3443 4234 1
+3443 4531 1
+3443 5022 1
+3443 5079 1
+3438 2576 1
+3444 2252 1
+3444 2576 1
+3445 15 1
+3445 72 1
+3445 1549 1
+3445 2381 1
+3445 2398 1
+3445 2535 1
+3445 2576 1
+3445 2775 1
+3445 3439 1
+3445 3443 1
+3445 4011 1
+3445 4247 1
+3445 4335 1
+3445 4422 1
+3445 4712 1
+3445 4797 1
+3445 5100 1
+3445 5182 1
+3445 5947 1
+3445 5963 1
+3445 6784 1
+3439 417 1
+3439 825 1
+3439 974 1
+3439 1166 1
+3439 1239 1
+3439 1352 1
+3439 1385 1
+3439 1571 1
+3439 2016 1
+3439 2144 1
+3439 2206 1
+3439 2209 1
+3439 2210 1
+3439 2290 1
+3439 2324 1
+3439 2440 1
+3439 2510 1
+3439 2576 1
+3439 2585 1
+3439 2597 1
+3439 2619 1
+3439 2620 1
+3439 2653 1
+3439 2655 1
+3439 2657 1
+3439 2667 1
+3439 2674 1
+3439 2693 1
+3439 2747 1
+3439 2819 1
+3439 2871 1
+3439 2932 1
+3439 3009 1
+3439 3026 1
+3439 3084 1
+3439 3140 1
+3439 3148 1
+3439 3258 1
+3439 3260 1
+3439 3276 1
+3439 3291 1
+3439 3334 1
+3439 3456 1
+3439 3461 1
+3439 3473 1
+3439 3516 1
+3439 3538 1
+3439 3548 1
+3439 3556 1
+3439 3567 1
+3439 3587 1
+3439 3631 1
+3439 3650 1
+3439 3670 1
+3439 3885 1
+3439 3898 1
+3439 4011 1
+3439 4021 1
+3439 4024 1
+3439 4088 1
+3439 4110 1
+3439 4124 1
+3439 4216 1
+3439 4220 1
+3439 4269 1
+3439 4351 1
+3439 4365 1
+3439 4402 1
+3439 4403 1
+3439 4510 1
+3439 4531 1
+3439 4536 1
+3439 4712 1
+3439 5188 1
+3439 5210 1
+3439 5254 1
+3439 5412 1
+3439 5827 1
+3439 6501 1
+3439 6600 1
+3439 6632 1
+3439 6634 1
+3439 6663 1
+3439 6699 1
+3439 6860 1
+3439 6930 1
+3439 7632 1
+3439 8295 1
+3447 737 1
+3447 1305 1
+3447 1310 1
+3447 1549 1
+3447 1688 1
+3447 1799 1
+3447 1823 1
+3447 2237 1
+3447 2258 1
+3447 2285 1
+3447 2326 1
+3447 2328 1
+3447 2354 1
+3447 2364 1
+3447 2369 1
+3447 2456 1
+3447 2576 1
+3447 2592 1
+3447 2605 1
+3447 2658 1
+3447 2774 1
+3447 2775 1
+3447 2822 1
+3447 2831 1
+3447 2871 1
+3447 3014 1
+3447 3015 1
+3447 3027 1
+3447 3034 1
+3447 3089 1
+3447 3092 1
+3447 3103 1
+3447 3238 1
+3447 3274 1
+3447 3276 1
+3447 3291 1
+3447 3297 1
+3447 3309 1
+3447 3321 1
+3447 3334 1
+3447 3352 1
+3447 3376 1
+3447 3417 1
+3447 3452 1
+3447 3453 1
+3447 3455 1
+3447 3456 1
+3447 3458 1
+3447 3459 1
+3447 3464 1
+3447 3479 1
+3447 3537 1
+3447 3635 1
+3447 3664 1
+3447 3752 1
+3447 3796 1
+3447 3843 1
+3447 3897 1
+3447 3898 1
+3447 3910 1
+3447 3911 1
+3447 3958 1
+3447 4011 1
+3447 4037 1
+3447 4040 1
+3447 4041 1
+3447 4044 1
+3447 4065 1
+3447 4099 1
+3447 4124 1
+3447 4127 1
+3447 4189 1
+3447 4191 1
+3447 4212 1
+3447 4261 1
+3447 4266 1
+3447 4298 1
+3447 4310 1
+3447 4335 1
+3447 4355 1
+3447 4361 1
+3447 4400 1
+3447 4448 1
+3447 4483 1
+3447 4529 1
+3447 4530 1
+3447 4547 1
+3447 4551 1
+3447 4574 1
+3447 4587 1
+3447 4588 1
+3447 4653 1
+3447 4654 1
+3447 4661 1
+3447 4662 1
+3447 4666 1
+3447 4677 1
+3447 4678 1
+3447 4687 1
+3447 4712 1
+3447 4713 1
+3447 4715 1
+3447 4717 1
+3447 4735 1
+3447 4776 1
+3447 4777 1
+3447 4778 1
+3447 4780 1
+3447 4783 1
+3447 4792 1
+3447 4795 1
+3447 4796 1
+3447 4797 1
+3447 4814 1
+3447 4815 1
+3447 4827 1
+3447 4828 1
+3447 4846 1
+3447 4879 1
+3447 4934 1
+3447 4953 1
+3447 4954 1
+3447 4962 1
+3447 4964 1
+3447 4977 1
+3447 4983 1
+3447 4986 1
+3447 4994 1
+3447 4999 1
+3447 5002 1
+3447 5020 1
+3447 5043 1
+3447 5044 1
+3447 5055 1
+3447 5058 1
+3447 5061 1
+3447 5079 1
+3447 5106 1
+3447 5123 1
+3447 5144 1
+3447 5162 1
+3447 5178 1
+3447 5179 1
+3447 5188 1
+3447 5189 1
+3447 5200 1
+3447 5204 1
+3447 5226 1
+3447 5255 1
+3447 5262 1
+3447 5273 1
+3447 5288 1
+3447 5295 1
+3447 5305 1
+3447 5308 1
+3447 5312 1
+3447 5323 1
+3447 5341 1
+3447 5364 1
+3447 5368 1
+3447 5375 1
+3447 5417 1
+3447 5432 1
+3447 5449 1
+3447 5459 1
+3447 5463 1
+3447 5479 1
+3447 5506 1
+3447 5524 1
+3447 5529 1
+3447 5543 1
+3447 5563 1
+3447 5596 1
+3447 5605 1
+3447 5620 1
+3447 5637 1
+3447 5640 1
+3447 5680 1
+3447 5683 1
+3447 5697 1
+3447 5705 1
+3447 5737 1
+3447 5743 1
+3447 5760 1
+3447 5775 1
+3447 5800 1
+3447 5804 1
+3447 5811 1
+3447 5814 1
+3447 5818 1
+3447 5819 1
+3447 5827 1
+3447 5829 1
+3447 5844 1
+3447 5871 1
+3447 5886 1
+3447 5932 1
+3447 5973 1
+3447 5998 1
+3447 6044 1
+3447 6083 1
+3447 6097 1
+3447 6105 1
+3447 6109 1
+3447 6148 1
+3447 6218 1
+3447 6225 1
+3447 6241 1
+3447 6246 1
+3447 6255 1
+3447 6261 1
+3447 6262 1
+3447 6270 1
+3447 6272 1
+3447 6299 1
+3447 6305 1
+3447 6306 1
+3447 6327 1
+3447 6330 1
+3447 6337 1
+3447 6360 1
+3447 6414 1
+3447 6474 1
+3447 6481 1
+3447 6501 1
+3447 6505 1
+3447 6555 1
+3447 6576 1
+3447 6600 1
+3447 6606 1
+3447 6618 1
+3447 6634 1
+3447 6714 1
+3447 6720 1
+3447 6724 1
+3447 6736 1
+3447 6765 1
+3447 6784 1
+3447 6832 1
+3447 6873 1
+3447 6907 1
+3447 6913 1
+3447 6914 1
+3447 6920 1
+3447 6934 1
+3447 6946 1
+3447 6953 1
+3447 6955 1
+3447 6979 1
+3447 6997 1
+3447 7012 1
+3447 7021 1
+3447 7052 1
+3447 7092 1
+3447 7101 1
+3447 7108 1
+3447 7144 1
+3447 7186 1
+3447 7222 1
+3447 7262 1
+3447 7290 1
+3447 7351 1
+3447 7381 1
+3447 7414 1
+3447 7510 1
+3447 7662 1
+3447 7694 1
+3447 7813 1
+3447 7833 1
+3447 7961 1
+3447 8295 1
+3448 1688 1
+3448 3464 1
+3448 4578 1
+3449 15 1
+3449 72 1
+3449 222 1
+3449 346 1
+3449 608 1
+3449 737 1
+3449 762 1
+3449 896 1
+3449 1159 1
+3449 1185 1
+3449 1247 1
+3449 1310 1
+3449 1360 1
+3449 1473 1
+3449 1648 1
+3449 1680 1
+3449 1688 1
+3449 1733 1
+3449 1769 1
+3449 1799 1
+3449 2001 1
+3449 2014 1
+3449 2144 1
+3449 2145 1
+3449 2237 1
+3449 2240 1
+3449 2258 1
+3449 2276 1
+3449 2354 1
+3449 2369 1
+3449 2381 1
+3449 2398 1
+3449 2456 1
+3449 2490 1
+3449 2507 1
+3449 2516 1
+3449 2517 1
+3449 2576 1
+3449 2592 1
+3449 2605 1
+3449 2646 1
+3449 2689 1
+3449 2696 1
+3449 2760 1
+3449 2764 1
+3449 2765 1
+3449 2774 1
+3449 2775 1
+3449 2787 1
+3449 2790 1
+3449 2811 1
+3449 2822 1
+3449 2831 1
+3449 2851 1
+3449 2871 1
+3449 2909 1
+3449 2917 1
+3449 2925 1
+3449 3002 1
+3449 3014 1
+3449 3015 1
+3449 3027 1
+3449 3034 1
+3449 3073 1
+3449 3089 1
+3449 3092 1
+3449 3103 1
+3449 3106 1
+3449 3125 1
+3449 3140 1
+3449 3144 1
+3449 3274 1
+3449 3276 1
+3449 3284 1
+3449 3309 1
+3449 3321 1
+3449 3334 1
+3449 3352 1
+3449 3417 1
+3449 3433 1
+3449 3443 1
+3449 3447 1
+3449 3452 1
+3449 3453 1
+3449 3454 1
+3449 3456 1
+3449 3458 1
+3449 3460 1
+3449 3464 1
+3449 3479 1
+3449 3498 1
+3449 3537 1
+3449 3557 1
+3449 3607 1
+3449 3614 1
+3449 3635 1
+3449 3643 1
+3449 3645 1
+3449 3664 1
+3449 3726 1
+3449 3748 1
+3449 3792 1
+3449 3796 1
+3449 3806 1
+3449 3812 1
+3449 3813 1
+3449 3835 1
+3449 3843 1
+3449 3854 1
+3449 3873 1
+3449 3897 1
+3449 3898 1
+3449 3910 1
+3449 3958 1
+3449 3976 1
+3449 4011 1
+3449 4037 1
+3449 4040 1
+3449 4041 1
+3449 4044 1
+3449 4072 1
+3449 4098 1
+3449 4099 1
+3449 4103 1
+3449 4124 1
+3449 4127 1
+3449 4175 1
+3449 4189 1
+3449 4191 1
+3449 4212 1
+3449 4247 1
+3449 4261 1
+3449 4297 1
+3449 4299 1
+3449 4310 1
+3449 4315 1
+3449 4335 1
+3449 4338 1
+3449 4400 1
+3449 4422 1
+3449 4448 1
+3449 4453 1
+3449 4463 1
+3449 4466 1
+3449 4482 1
+3449 4483 1
+3449 4485 1
+3449 4527 1
+3449 4528 1
+3449 4530 1
+3449 4531 1
+3449 4534 1
+3449 4536 1
+3449 4547 1
+3449 4551 1
+3449 4574 1
+3449 4587 1
+3449 4600 1
+3449 4613 1
+3449 4631 1
+3449 4646 1
+3449 4653 1
+3449 4661 1
+3449 4662 1
+3449 4666 1
+3449 4687 1
+3449 4706 1
+3449 4712 1
+3449 4715 1
+3449 4717 1
+3449 4719 1
+3449 4735 1
+3449 4776 1
+3449 4777 1
+3449 4781 1
+3449 4792 1
+3449 4795 1
+3449 4796 1
+3449 4797 1
+3449 4798 1
+3449 4808 1
+3449 4811 1
+3449 4814 1
+3449 4820 1
+3449 4824 1
+3449 4827 1
+3449 4828 1
+3449 4846 1
+3449 4875 1
+3449 4929 1
+3449 4938 1
+3449 4953 1
+3449 4962 1
+3449 4964 1
+3449 4980 1
+3449 4986 1
+3449 4999 1
+3449 5020 1
+3449 5026 1
+3449 5044 1
+3449 5055 1
+3449 5058 1
+3449 5061 1
+3449 5072 1
+3449 5073 1
+3449 5083 1
+3449 5092 1
+3449 5100 1
+3449 5103 1
+3449 5106 1
+3449 5123 1
+3449 5130 1
+3449 5132 1
+3449 5144 1
+3449 5155 1
+3449 5162 1
+3449 5178 1
+3449 5179 1
+3449 5182 1
+3449 5189 1
+3449 5204 1
+3449 5215 1
+3449 5222 1
+3449 5226 1
+3449 5239 1
+3449 5262 1
+3449 5288 1
+3449 5301 1
+3449 5305 1
+3449 5327 1
+3449 5335 1
+3449 5341 1
+3449 5392 1
+3449 5404 1
+3449 5412 1
+3449 5415 1
+3449 5417 1
+3449 5423 1
+3449 5430 1
+3449 5432 1
+3449 5437 1
+3449 5439 1
+3449 5445 1
+3449 5449 1
+3449 5452 1
+3449 5454 1
+3449 5459 1
+3449 5463 1
+3449 5506 1
+3449 5509 1
+3449 5511 1
+3449 5524 1
+3449 5527 1
+3449 5539 1
+3449 5543 1
+3449 5545 1
+3449 5559 1
+3449 5568 1
+3449 5584 1
+3449 5624 1
+3449 5637 1
+3449 5638 1
+3449 5640 1
+3449 5650 1
+3449 5651 1
+3449 5680 1
+3449 5683 1
+3449 5684 1
+3449 5693 1
+3449 5732 1
+3449 5737 1
+3449 5743 1
+3449 5753 1
+3449 5775 1
+3449 5780 1
+3449 5790 1
+3449 5798 1
+3449 5804 1
+3449 5814 1
+3449 5828 1
+3449 5837 1
+3449 5844 1
+3449 5848 1
+3449 5850 1
+3449 5863 1
+3449 5886 1
+3449 5891 1
+3449 5925 1
+3449 5928 1
+3449 5936 1
+3449 5947 1
+3449 5973 1
+3449 5994 1
+3449 6006 1
+3449 6029 1
+3449 6098 1
+3449 6124 1
+3449 6164 1
+3449 6166 1
+3449 6218 1
+3449 6229 1
+3449 6246 1
+3449 6251 1
+3449 6262 1
+3449 6296 1
+3449 6306 1
+3449 6328 1
+3449 6337 1
+3449 6400 1
+3449 6432 1
+3449 6576 1
+3449 6869 1
+3449 7757 1
+3449 8295 1
+3450 1185 1
+3450 1688 1
+3450 1984 1
+3450 2144 1
+3450 2240 1
+3450 2760 1
+3450 2871 1
+3450 3014 1
+3450 3034 1
+3450 3140 1
+3450 3443 1
+3450 3454 1
+3450 3464 1
+3450 3557 1
+3450 3645 1
+3450 3812 1
+3450 3956 1
+3450 3958 1
+3450 3976 1
+3450 4011 1
+3450 4072 1
+3450 4528 1
+3450 4531 1
+3450 4578 1
+3450 4613 1
+3450 4646 1
+3450 5817 1
+3451 978 1
+3451 1140 1
+3451 1185 1
+3451 1360 1
+3451 1385 1
+3451 1729 1
+3451 1984 1
+3451 2066 1
+3451 2129 1
+3451 2144 1
+3451 2289 1
+3451 2326 1
+3451 2456 1
+3451 2506 1
+3451 2517 1
+3451 2565 1
+3451 2612 1
+3451 2653 1
+3451 2811 1
+3451 2871 1
+3451 2932 1
+3451 2958 1
+3451 2981 1
+3451 3014 1
+3451 3073 1
+3451 3140 1
+3451 3144 1
+3451 3309 1
+3451 3321 1
+3451 3346 1
+3451 3439 1
+3451 3453 1
+3451 3454 1
+3451 3460 1
+3451 3464 1
+3451 3635 1
+3451 3645 1
+3451 3660 1
+3451 3813 1
+3451 3835 1
+3451 3912 1
+3451 3956 1
+3451 3958 1
+3451 4040 1
+3451 4043 1
+3451 4055 1
+3451 4103 1
+3451 4110 1
+3451 4162 1
+3451 4179 1
+3451 4191 1
+3451 4201 1
+3451 4212 1
+3451 4216 1
+3451 4231 1
+3451 4234 1
+3451 4235 1
+3451 4254 1
+3451 4263 1
+3451 4266 1
+3451 4269 1
+3451 4289 1
+3451 4297 1
+3451 4311 1
+3451 4323 1
+3451 4331 1
+3451 4332 1
+3451 4335 1
+3451 4349 1
+3451 4365 1
+3451 4373 1
+3451 4384 1
+3451 4385 1
+3451 4386 1
+3451 4402 1
+3451 4403 1
+3451 4417 1
+3451 4422 1
+3451 4466 1
+3451 4471 1
+3451 4557 1
+3451 4661 1
+3451 4662 1
+3451 4666 1
+3451 4684 1
+3451 4735 1
+3451 4776 1
+3451 4778 1
+3451 4780 1
+3451 4796 1
+3451 4797 1
+3451 4808 1
+3451 4811 1
+3451 4822 1
+3451 4827 1
+3451 4831 1
+3451 4875 1
+3451 8294 1
+3452 15 1
+3452 737 1
+3452 762 1
+3452 896 1
+3452 1024 1
+3452 1305 1
+3452 1310 1
+3452 1360 1
+3452 1403 1
+3452 1473 1
+3452 1688 1
+3452 1769 1
+3452 1799 1
+3452 2237 1
+3452 2240 1
+3452 2328 1
+3452 2354 1
+3452 2381 1
+3452 2456 1
+3452 2516 1
+3452 2535 1
+3452 2565 1
+3452 2605 1
+3452 2696 1
+3452 2760 1
+3452 2765 1
+3452 2787 1
+3452 2790 1
+3452 2831 1
+3452 2871 1
+3452 3073 1
+3452 3092 1
+3452 3103 1
+3452 3125 1
+3452 3274 1
+3452 3321 1
+3452 3352 1
+3452 3417 1
+3452 3433 1
+3452 3439 1
+3452 3443 1
+3452 3447 1
+3452 3453 1
+3452 3455 1
+3452 3456 1
+3452 3464 1
+3452 3498 1
+3452 3537 1
+3452 3586 1
+3452 3635 1
+3452 3643 1
+3452 3748 1
+3452 3796 1
+3452 3812 1
+3452 3813 1
+3452 3854 1
+3452 3910 1
+3452 3958 1
+3452 4040 1
+3452 4099 1
+3452 4111 1
+3452 4124 1
+3452 4175 1
+3452 4179 1
+3452 4191 1
+3452 4201 1
+3452 4212 1
+3452 4266 1
+3452 4297 1
+3452 4298 1
+3452 4310 1
+3452 4349 1
+3452 4400 1
+3452 4402 1
+3452 4424 1
+3452 4480 1
+3452 4527 1
+3452 4528 1
+3452 4530 1
+3452 4534 1
+3452 4551 1
+3452 4588 1
+3452 4600 1
+3452 4653 1
+3452 4661 1
+3452 4706 1
+3452 4712 1
+3452 4719 1
+3452 4792 1
+3452 4811 1
+3452 4815 1
+3452 4827 1
+3452 4875 1
+3452 4929 1
+3452 4938 1
+3452 4942 1
+3452 4964 1
+3452 4987 1
+3452 4999 1
+3452 5020 1
+3452 5055 1
+3452 5061 1
+3452 5083 1
+3452 5092 1
+3452 5106 1
+3452 5121 1
+3452 5132 1
+3452 5155 1
+3452 5162 1
+3452 5178 1
+3452 5288 1
+3452 5301 1
+3452 5335 1
+3452 5375 1
+3452 5392 1
+3452 5412 1
+3452 5449 1
+3452 5454 1
+3452 5459 1
+3452 5539 1
+3452 5592 1
+3452 5620 1
+3452 5651 1
+3452 5693 1
+3452 5753 1
+3452 5790 1
+3452 5844 1
+3452 5947 1
+3452 5963 1
+3452 5994 1
+3452 6006 1
+3453 15 1
+3453 72 1
+3453 346 1
+3453 406 1
+3453 608 1
+3453 737 1
+3453 1024 1
+3453 1026 1
+3453 1185 1
+3453 1247 1
+3453 1305 1
+3453 1310 1
+3453 1360 1
+3453 1385 1
+3453 1473 1
+3453 1549 1
+3453 1680 1
+3453 1688 1
+3453 1733 1
+3453 1769 1
+3453 1799 1
+3453 1972 1
+3453 2001 1
+3453 2144 1
+3453 2145 1
+3453 2237 1
+3453 2240 1
+3453 2258 1
+3453 2326 1
+3453 2354 1
+3453 2364 1
+3453 2369 1
+3453 2381 1
+3453 2398 1
+3453 2433 1
+3453 2440 1
+3453 2456 1
+3453 2516 1
+3453 2517 1
+3453 2565 1
+3453 2576 1
+3453 2592 1
+3453 2605 1
+3453 2646 1
+3453 2689 1
+3453 2696 1
+3453 2760 1
+3453 2765 1
+3453 2775 1
+3453 2785 1
+3453 2790 1
+3453 2811 1
+3453 2822 1
+3453 2831 1
+3453 2871 1
+3453 2909 1
+3453 3002 1
+3453 3014 1
+3453 3027 1
+3453 3034 1
+3453 3073 1
+3453 3089 1
+3453 3092 1
+3453 3103 1
+3453 3106 1
+3453 3125 1
+3453 3140 1
+3453 3144 1
+3453 3238 1
+3453 3274 1
+3453 3284 1
+3453 3291 1
+3453 3309 1
+3453 3321 1
+3453 3334 1
+3453 3352 1
+3453 3393 1
+3453 3417 1
+3453 3433 1
+3453 3443 1
+3453 3447 1
+3453 3452 1
+3453 3454 1
+3453 3456 1
+3453 3459 1
+3453 3460 1
+3453 3464 1
+3453 3479 1
+3453 3537 1
+3453 3557 1
+3453 3568 1
+3453 3607 1
+3453 3635 1
+3453 3643 1
+3453 3691 1
+3453 3748 1
+3453 3796 1
+3453 3806 1
+3453 3812 1
+3453 3813 1
+3453 3835 1
+3453 3843 1
+3453 3854 1
+3453 3897 1
+3453 3898 1
+3453 3910 1
+3453 3911 1
+3453 3956 1
+3453 3958 1
+3453 4011 1
+3453 4037 1
+3453 4040 1
+3453 4041 1
+3453 4044 1
+3453 4065 1
+3453 4068 1
+3453 4072 1
+3453 4098 1
+3453 4099 1
+3453 4103 1
+3453 4124 1
+3453 4191 1
+3453 4212 1
+3453 4219 1
+3453 4261 1
+3453 4266 1
+3453 4297 1
+3453 4298 1
+3453 4299 1
+3453 4310 1
+3453 4315 1
+3453 4335 1
+3453 4338 1
+3453 4355 1
+3453 4400 1
+3453 4417 1
+3453 4448 1
+3453 4463 1
+3453 4466 1
+3453 4468 1
+3453 4482 1
+3453 4485 1
+3453 4488 1
+3453 4528 1
+3453 4530 1
+3453 4531 1
+3453 4536 1
+3453 4547 1
+3453 4551 1
+3453 4574 1
+3453 4578 1
+3453 4587 1
+3453 4600 1
+3453 4613 1
+3453 4653 1
+3453 4661 1
+3453 4662 1
+3453 4677 1
+3453 4678 1
+3453 4706 1
+3453 4709 1
+3453 4712 1
+3453 4717 1
+3453 4719 1
+3453 4728 1
+3453 4735 1
+3453 4748 1
+3453 4776 1
+3453 4792 1
+3453 4795 1
+3453 4796 1
+3453 4797 1
+3453 4808 1
+3453 4811 1
+3453 4814 1
+3453 4822 1
+3453 4824 1
+3453 4827 1
+3453 4828 1
+3453 4831 1
+3453 4875 1
+3453 4879 1
+3453 4880 1
+3453 4899 1
+3453 4929 1
+3453 4938 1
+3453 4962 1
+3453 4964 1
+3453 4980 1
+3453 4981 1
+3453 4983 1
+3453 4986 1
+3453 4999 1
+3453 5020 1
+3453 5022 1
+3453 5026 1
+3453 5028 1
+3453 5033 1
+3453 5044 1
+3453 5055 1
+3453 5058 1
+3453 5061 1
+3453 5072 1
+3453 5073 1
+3453 5079 1
+3453 5092 1
+3453 5100 1
+3453 5106 1
+3453 5130 1
+3453 5140 1
+3453 5141 1
+3453 5144 1
+3453 5162 1
+3453 5176 1
+3453 5178 1
+3453 5182 1
+3453 5188 1
+3453 5189 1
+3453 5200 1
+3453 5204 1
+3453 5208 1
+3453 5210 1
+3453 5215 1
+3453 5222 1
+3453 5226 1
+3453 5233 1
+3453 5239 1
+3453 5254 1
+3453 5263 1
+3453 5273 1
+3453 5306 1
+3453 5311 1
+3453 5323 1
+3453 5335 1
+3453 5341 1
+3453 5354 1
+3453 5375 1
+3453 5392 1
+3453 5393 1
+3453 5412 1
+3453 5415 1
+3453 5430 1
+3453 5445 1
+3453 5454 1
+3453 5457 1
+3453 5459 1
+3453 5463 1
+3453 5467 1
+3453 5471 1
+3453 5484 1
+3453 5506 1
+3453 5524 1
+3453 5539 1
+3453 5543 1
+3453 5605 1
+3453 5637 1
+3453 5638 1
+3453 5650 1
+3453 5651 1
+3453 5680 1
+3453 5693 1
+3453 5714 1
+3453 5721 1
+3453 5737 1
+3453 5739 1
+3453 5743 1
+3453 5775 1
+3453 5780 1
+3453 5784 1
+3453 5800 1
+3453 5802 1
+3453 5804 1
+3453 5811 1
+3453 5817 1
+3453 5822 1
+3453 5827 1
+3453 5829 1
+3453 5844 1
+3453 5871 1
+3453 5886 1
+3453 5891 1
+3453 5991 1
+3453 6006 1
+3453 6041 1
+3453 6054 1
+3453 6272 1
+3453 6296 1
+3453 6323 1
+3453 6347 1
+3453 6481 1
+3453 6496 1
+3453 6505 1
+3453 6528 1
+3453 6553 1
+3453 6554 1
+3453 6567 1
+3453 6571 1
+3453 6606 1
+3453 6663 1
+3453 6699 1
+3453 6724 1
+3453 6725 1
+3453 6770 1
+3453 6777 1
+3453 6805 1
+3453 6809 1
+3453 6826 1
+3453 6832 1
+3453 6875 1
+3453 6979 1
+3453 7225 1
+3453 7238 1
+3453 7553 1
+3453 7620 1
+3453 7624 1
+3453 7632 1
+3453 7908 1
+3453 8042 1
+3453 8128 1
+3454 608 1
+3454 737 1
+3454 762 1
+3454 825 1
+3454 1185 1
+3454 1239 1
+3454 1305 1
+3454 1307 1
+3454 1310 1
+3454 1385 1
+3454 1549 1
+3454 1688 1
+3454 1706 1
+3454 1729 1
+3454 1769 1
+3454 1984 1
+3454 1990 1
+3454 2014 1
+3454 2129 1
+3454 2134 1
+3454 2144 1
+3454 2210 1
+3454 2237 1
+3454 2289 1
+3454 2328 1
+3454 2384 1
+3454 2398 1
+3454 2456 1
+3454 2506 1
+3454 2517 1
+3454 2535 1
+3454 2565 1
+3454 2595 1
+3454 2612 1
+3454 2619 1
+3454 2653 1
+3454 2657 1
+3454 2693 1
+3454 2760 1
+3454 2775 1
+3454 2790 1
+3454 2811 1
+3454 2859 1
+3454 2871 1
+3454 2917 1
+3454 2932 1
+3454 2958 1
+3454 2981 1
+3454 3028 1
+3454 3084 1
+3454 3117 1
+3454 3125 1
+3454 3180 1
+3454 3260 1
+3454 3276 1
+3454 3313 1
+3454 3321 1
+3454 3334 1
+3454 3352 1
+3454 3394 1
+3454 3433 1
+3454 3439 1
+3454 3443 1
+3454 3447 1
+3454 3452 1
+3454 3455 1
+3454 3464 1
+3454 3537 1
+3454 3557 1
+3454 3568 1
+3454 3615 1
+3454 3635 1
+3454 3643 1
+3454 3645 1
+3454 3660 1
+3454 3680 1
+3454 3724 1
+3454 3806 1
+3454 3813 1
+3454 3843 1
+3454 3854 1
+3454 3887 1
+3454 3898 1
+3454 3912 1
+3454 3922 1
+3454 3926 1
+3454 3937 1
+3454 3956 1
+3454 3958 1
+3454 3976 1
+3454 4011 1
+3454 4013 1
+3454 4037 1
+3454 4040 1
+3454 4043 1
+3454 4044 1
+3454 4049 1
+3454 4058 1
+3454 4072 1
+3454 4103 1
+3454 4111 1
+3454 4124 1
+3454 4138 1
+3454 4162 1
+3454 4179 1
+3454 4188 1
+3454 4191 1
+3454 4212 1
+3454 4261 1
+3454 4263 1
+3454 4269 1
+3454 4289 1
+3454 4290 1
+3454 4297 1
+3454 4299 1
+3454 4311 1
+3454 4331 1
+3454 4335 1
+3454 4384 1
+3454 4412 1
+3454 4424 1
+3454 4463 1
+3454 4485 1
+3454 4510 1
+3454 4528 1
+3454 4531 1
+3454 4551 1
+3454 4557 1
+3454 4578 1
+3454 4613 1
+3454 4661 1
+3454 4662 1
+3454 4666 1
+3454 4719 1
+3454 4735 1
+3454 4796 1
+3454 4808 1
+3454 4811 1
+3454 4814 1
+3454 4822 1
+3454 4875 1
+3454 4938 1
+3454 4953 1
+3454 4999 1
+3454 5026 1
+3454 5055 1
+3454 8293 1
+3454 8294 1
+3455 1024 1
+3455 1185 1
+3455 1305 1
+3455 1310 1
+3455 1680 1
+3455 1769 1
+3455 2014 1
+3455 2144 1
+3455 2145 1
+3455 2326 1
+3455 2364 1
+3455 2516 1
+3455 2517 1
+3455 2696 1
+3455 2775 1
+3455 2787 1
+3455 2790 1
+3455 2871 1
+3455 3002 1
+3455 3034 1
+3455 3073 1
+3455 3276 1
+3455 3284 1
+3455 3321 1
+3455 3334 1
+3455 3433 1
+3455 3443 1
+3455 3447 1
+3455 3453 1
+3455 3460 1
+3455 3464 1
+3455 3537 1
+3455 3643 1
+3455 3748 1
+3455 3843 1
+3455 3898 1
+3455 3911 1
+3455 3958 1
+3455 4044 1
+3455 4072 1
+3455 4124 1
+3455 4189 1
+3455 4191 1
+3455 4212 1
+3455 4297 1
+3455 4547 1
+3455 4551 1
+3455 4588 1
+3455 4646 1
+3455 4661 1
+3455 4666 1
+3455 4735 1
+3455 4792 1
+3455 4797 1
+3455 4820 1
+3455 4828 1
+3455 4938 1
+3455 4942 1
+3455 4953 1
+3455 4962 1
+3455 4987 1
+3455 5026 1
+3455 5055 1
+3455 5073 1
+3455 5083 1
+3455 5092 1
+3455 5100 1
+3455 5817 1
+3456 15 1
+3456 608 1
+3456 737 1
+3456 1305 1
+3456 1310 1
+3456 1352 1
+3456 1360 1
+3456 1385 1
+3456 1498 1
+3456 1549 1
+3456 1688 1
+3456 1729 1
+3456 1769 1
+3456 1799 1
+3456 1961 1
+3456 1982 1
+3456 1990 1
+3456 2001 1
+3456 2014 1
+3456 2144 1
+3456 2145 1
+3456 2240 1
+3456 2276 1
+3456 2289 1
+3456 2328 1
+3456 2354 1
+3456 2364 1
+3456 2369 1
+3456 2381 1
+3456 2386 1
+3456 2398 1
+3456 2433 1
+3456 2440 1
+3456 2456 1
+3456 2516 1
+3456 2565 1
+3456 2576 1
+3456 2592 1
+3456 2612 1
+3456 2658 1
+3456 2689 1
+3456 2696 1
+3456 2760 1
+3456 2775 1
+3456 2787 1
+3456 2811 1
+3456 2822 1
+3456 2831 1
+3456 2871 1
+3456 3014 1
+3456 3027 1
+3456 3034 1
+3456 3089 1
+3456 3092 1
+3456 3103 1
+3456 3125 1
+3456 3140 1
+3456 3144 1
+3456 3192 1
+3456 3238 1
+3456 3274 1
+3456 3291 1
+3456 3321 1
+3456 3352 1
+3456 3417 1
+3456 3433 1
+3456 3439 1
+3456 3443 1
+3456 3447 1
+3456 3452 1
+3456 3453 1
+3456 3454 1
+3456 3458 1
+3456 3459 1
+3456 3460 1
+3456 3464 1
+3456 3498 1
+3456 3537 1
+3456 3568 1
+3456 3607 1
+3456 3635 1
+3456 3645 1
+3456 3660 1
+3456 3661 1
+3456 3664 1
+3456 3691 1
+3456 3748 1
+3456 3792 1
+3456 3796 1
+3456 3806 1
+3456 3812 1
+3456 3843 1
+3456 3873 1
+3456 3897 1
+3456 3910 1
+3456 3958 1
+3456 4011 1
+3456 4041 1
+3456 4044 1
+3456 4047 1
+3456 4072 1
+3456 4099 1
+3456 4124 1
+3456 4138 1
+3456 4191 1
+3456 4256 1
+3456 4263 1
+3456 4269 1
+3456 4289 1
+3456 4290 1
+3456 4297 1
+3456 4299 1
+3456 4310 1
+3456 4338 1
+3456 4351 1
+3456 4361 1
+3456 4384 1
+3456 4385 1
+3456 4400 1
+3456 4402 1
+3456 4417 1
+3456 4422 1
+3456 4424 1
+3456 4448 1
+3456 4453 1
+3456 4463 1
+3456 4483 1
+3456 4485 1
+3456 4510 1
+3456 4531 1
+3456 4536 1
+3456 4557 1
+3456 4574 1
+3456 4578 1
+3456 4587 1
+3456 4588 1
+3456 4600 1
+3456 4605 1
+3456 4613 1
+3456 4653 1
+3456 4706 1
+3456 4709 1
+3456 4712 1
+3456 4715 1
+3456 4719 1
+3456 4735 1
+3456 4792 1
+3456 4795 1
+3456 4798 1
+3456 4827 1
+3456 4828 1
+3456 4899 1
+3456 4929 1
+3456 4938 1
+3456 4962 1
+3456 4964 1
+3456 4980 1
+3456 4999 1
+3456 5002 1
+3456 5020 1
+3456 5026 1
+3456 5028 1
+3456 5033 1
+3456 5055 1
+3456 5079 1
+3456 5092 1
+3456 5100 1
+3456 5106 1
+3456 5123 1
+3456 5130 1
+3456 5132 1
+3456 5144 1
+3456 5155 1
+3456 5176 1
+3456 5178 1
+3456 5188 1
+3456 5200 1
+3456 5204 1
+3456 5210 1
+3456 5226 1
+3456 5246 1
+3456 5254 1
+3456 5295 1
+3456 5335 1
+3456 5412 1
+3456 5421 1
+3456 5430 1
+3456 5449 1
+3456 5459 1
+3456 5499 1
+3456 5524 1
+3456 5543 1
+3456 5596 1
+3456 5605 1
+3456 5639 1
+3456 5640 1
+3456 5684 1
+3456 5697 1
+3456 5714 1
+3456 5739 1
+3456 5743 1
+3456 5760 1
+3456 5775 1
+3456 5800 1
+3456 5822 1
+3456 5827 1
+3456 5828 1
+3456 5829 1
+3456 5839 1
+3456 5844 1
+3456 5848 1
+3456 5897 1
+3456 5902 1
+3456 5947 1
+3456 6098 1
+3456 6328 1
+3456 6337 1
+3456 6437 1
+3456 6458 1
+3456 6481 1
+3456 6496 1
+3456 6498 1
+3456 6523 1
+3456 6560 1
+3456 6595 1
+3456 6736 1
+3456 6832 1
+3456 6869 1
+3456 6907 1
+3456 7168 1
+3456 7214 1
+3456 7225 1
+3456 7393 1
+3456 7400 1
+3456 7414 1
+3456 7450 1
+3456 7553 1
+3456 7620 1
+3456 8174 1
+3456 8192 1
+3456 8295 1
+3457 608 1
+3457 896 1
+3457 1024 1
+3457 1157 1
+3457 1191 1
+3457 1297 1
+3457 1305 1
+3457 1360 1
+3457 1385 1
+3457 1498 1
+3457 1688 1
+3457 1706 1
+3457 1729 1
+3457 1799 1
+3457 1915 1
+3457 1972 1
+3457 2066 1
+3457 2114 1
+3457 2129 1
+3457 2144 1
+3457 2160 1
+3457 2257 1
+3457 2289 1
+3457 2326 1
+3457 2364 1
+3457 2369 1
+3457 2381 1
+3457 2398 1
+3457 2485 1
+3457 2516 1
+3457 2565 1
+3457 2612 1
+3457 2619 1
+3457 2654 1
+3457 2657 1
+3457 2686 1
+3457 2775 1
+3457 2787 1
+3457 2790 1
+3457 2799 1
+3457 2811 1
+3457 2822 1
+3457 2851 1
+3457 2871 1
+3457 2900 1
+3457 2923 1
+3457 3002 1
+3457 3027 1
+3457 3028 1
+3457 3073 1
+3457 3084 1
+3457 3092 1
+3457 3103 1
+3457 3117 1
+3457 3125 1
+3457 3140 1
+3457 3144 1
+3457 3192 1
+3457 3276 1
+3457 3297 1
+3457 3352 1
+3457 3404 1
+3457 3417 1
+3457 3433 1
+3457 3455 1
+3457 3461 1
+3457 3464 1
+3457 3537 1
+3457 3541 1
+3457 3547 1
+3457 3555 1
+3457 3568 1
+3457 3607 1
+3457 3609 1
+3457 3634 1
+3457 3650 1
+3457 3661 1
+3457 3680 1
+3457 3726 1
+3457 3785 1
+3457 3812 1
+3457 3843 1
+3457 3856 1
+3457 3871 1
+3457 3887 1
+3457 3892 1
+3457 3946 1
+3457 3970 1
+3457 3973 1
+3457 4124 1
+3457 4199 1
+3457 4290 1
+3457 4298 1
+3457 4315 1
+3457 4323 1
+3457 4335 1
+3457 4417 1
+3457 4422 1
+3457 4466 1
+3457 4468 1
+3457 4510 1
+3457 4529 1
+3457 4536 1
+3457 4552 1
+3457 4557 1
+3457 4558 1
+3457 4562 1
+3457 4583 1
+3457 4648 1
+3457 4706 1
+3457 4719 1
+3457 4778 1
+3457 4781 1
+3457 4815 1
+3457 4822 1
+3457 4827 1
+3457 4828 1
+3457 4875 1
+3457 4879 1
+3457 4938 1
+3457 4992 1
+3457 5026 1
+3457 5044 1
+3457 5073 1
+3457 5092 1
+3457 5115 1
+3457 5176 1
+3457 5179 1
+3457 5215 1
+3457 5239 1
+3457 5288 1
+3457 5289 1
+3457 5327 1
+3457 5341 1
+3457 5415 1
+3457 5426 1
+3457 5430 1
+3457 5432 1
+3457 5437 1
+3457 5467 1
+3457 5479 1
+3457 5500 1
+3457 5514 1
+3457 5527 1
+3457 5753 1
+3457 5800 1
+3457 5827 1
+3457 6004 1
+3457 6041 1
+3457 6123 1
+3457 6235 1
+3457 6505 1
+3457 6529 1
+3457 6543 1
+3457 6686 1
+3457 6833 1
+3457 6914 1
+3457 7115 1
+3457 7131 1
+3457 7237 1
+3457 7306 1
+3457 7400 1
+3457 7442 1
+3457 7478 1
+3457 7561 1
+3457 7587 1
+3458 15 1
+3458 737 1
+3458 896 1
+3458 1024 1
+3458 1473 1
+3458 1744 1
+3458 1984 1
+3458 2114 1
+3458 2257 1
+3458 2485 1
+3458 2508 1
+3458 2510 1
+3458 2654 1
+3458 2657 1
+3458 2686 1
+3458 2727 1
+3458 2871 1
+3458 2923 1
+3458 2958 1
+3458 3002 1
+3458 3005 1
+3458 3026 1
+3458 3191 1
+3458 3301 1
+3458 3447 1
+3458 3453 1
+3458 3454 1
+3458 3456 1
+3458 3464 1
+3458 3480 1
+3458 3498 1
+3458 3520 1
+3458 3529 1
+3458 3537 1
+3458 3586 1
+3458 3634 1
+3458 3843 1
+3458 3847 1
+3458 3873 1
+3458 3887 1
+3458 3892 1
+3458 3897 1
+3458 3903 1
+3458 3976 1
+3458 4041 1
+3458 4055 1
+3458 4162 1
+3458 4179 1
+3458 4338 1
+3458 4483 1
+3458 4547 1
+3458 4551 1
+3458 4795 1
+3458 4828 1
+3458 5002 1
+3458 5055 1
+3458 5073 1
+3458 5083 1
+3458 5412 1
+3458 5421 1
+3458 5499 1
+3458 5804 1
+3458 5897 1
+3458 5947 1
+3458 5963 1
+3458 6337 1
+3458 7618 1
+3458 7855 1
+3458 7961 1
+3459 15 1
+3459 896 1
+3459 1549 1
+3459 1799 1
+3459 2276 1
+3459 2398 1
+3459 2440 1
+3459 2516 1
+3459 2765 1
+3459 2925 1
+3459 3015 1
+3459 3027 1
+3459 3089 1
+3459 3103 1
+3459 3456 1
+3459 3464 1
+3459 3643 1
+3459 3830 1
+3459 3897 1
+3459 3898 1
+3459 3910 1
+3459 3976 1
+3459 4041 1
+3459 4099 1
+3459 4310 1
+3459 4355 1
+3459 4400 1
+3459 4448 1
+3459 4574 1
+3459 4600 1
+3459 4653 1
+3459 4712 1
+3459 4764 1
+3459 4875 1
+3459 4929 1
+3459 4986 1
+3459 5061 1
+3459 5103 1
+3459 5144 1
+3459 5155 1
+3459 5178 1
+3459 5199 1
+3459 5226 1
+3459 5254 1
+3459 5262 1
+3459 5301 1
+3459 5305 1
+3459 5321 1
+3459 5363 1
+3459 5393 1
+3459 5415 1
+3459 5437 1
+3459 5449 1
+3459 5484 1
+3459 5506 1
+3459 5524 1
+3459 5559 1
+3459 5596 1
+3459 5624 1
+3459 5635 1
+3459 5638 1
+3459 5739 1
+3459 5780 1
+3459 5809 1
+3459 5811 1
+3459 5830 1
+3459 5839 1
+3459 5844 1
+3459 5871 1
+3459 5886 1
+3459 5950 1
+3459 5980 1
+3459 6029 1
+3459 6078 1
+3459 6106 1
+3459 6124 1
+3459 6198 1
+3459 6221 1
+3459 6272 1
+3459 6299 1
+3459 6432 1
+3459 6441 1
+3459 6481 1
+3459 6576 1
+3459 6606 1
+3459 6665 1
+3459 6699 1
+3459 6832 1
+3459 6869 1
+3459 7116 1
+3459 7301 1
+3459 7809 1
+3460 2326 1
+3460 3238 1
+3460 3464 1
+3460 3830 1
+3460 4463 1
+3460 4662 1
+3460 4791 1
+3460 4875 1
+3460 5073 1
+3460 5083 1
+3460 5178 1
+3460 5210 1
+3460 5289 1
+3460 5596 1
+3460 5819 1
+3460 5829 1
+3460 6347 1
+3460 7131 1
+3460 7510 1
+3460 7855 1
+3460 7879 1
+3460 7908 1
+3461 72 1
+3461 222 1
+3461 1185 1
+3461 1247 1
+3461 1548 1
+3461 1984 1
+3461 2066 1
+3461 2144 1
+3461 2252 1
+3461 2277 1
+3461 2326 1
+3461 2398 1
+3461 2552 1
+3461 2760 1
+3461 2787 1
+3461 2811 1
+3461 2917 1
+3461 3034 1
+3461 3073 1
+3461 3089 1
+3461 3140 1
+3461 3271 1
+3461 3321 1
+3461 3447 1
+3461 3454 1
+3461 3455 1
+3461 3456 1
+3461 3464 1
+3461 3557 1
+3461 3607 1
+3461 3631 1
+3461 3643 1
+3461 3755 1
+3461 3796 1
+3461 3835 1
+3461 3898 1
+3461 3956 1
+3461 4011 1
+3461 4037 1
+3461 4040 1
+3461 4044 1
+3461 4055 1
+3461 4072 1
+3461 4098 1
+3461 4099 1
+3461 4110 1
+3461 4191 1
+3461 4256 1
+3461 4266 1
+3461 4269 1
+3461 4297 1
+3461 4335 1
+3461 4529 1
+3461 4536 1
+3461 4578 1
+3461 4587 1
+3461 4613 1
+3461 4625 1
+3461 4631 1
+3461 4646 1
+3461 4648 1
+3461 4650 1
+3461 4658 1
+3461 4666 1
+3461 4677 1
+3461 4678 1
+3461 4713 1
+3461 4777 1
+3461 4778 1
+3461 4779 1
+3461 4795 1
+3461 4808 1
+3461 4809 1
+3461 4811 1
+3461 4815 1
+3461 4828 1
+3461 4875 1
+3461 4964 1
+3461 4977 1
+3461 4986 1
+3461 5075 1
+3461 5189 1
+3461 5215 1
+3461 5321 1
+3461 5449 1
+3461 5452 1
+3461 5454 1
+3461 5457 1
+3461 5463 1
+3461 5539 1
+3461 5559 1
+3461 5563 1
+3461 5568 1
+3461 5592 1
+3461 5620 1
+3461 5651 1
+3461 5680 1
+3461 5683 1
+3461 5693 1
+3461 8295 1
+3461 8296 1
+3462 72 1
+3462 1157 1
+3462 1185 1
+3462 1305 1
+3462 1352 1
+3462 1473 1
+3462 1548 1
+3462 1984 1
+3462 2014 1
+3462 2144 1
+3462 2326 1
+3462 2354 1
+3462 2398 1
+3462 2456 1
+3462 2696 1
+3462 2760 1
+3462 2822 1
+3462 2871 1
+3462 3014 1
+3462 3192 1
+3462 3352 1
+3462 3433 1
+3462 3443 1
+3462 3464 1
+3462 3557 1
+3462 3956 1
+3462 3958 1
+3462 4011 1
+3462 4037 1
+3462 4040 1
+3462 4044 1
+3462 4072 1
+3462 4124 1
+3462 4189 1
+3462 4212 1
+3462 4266 1
+3462 4338 1
+3462 4466 1
+3462 4510 1
+3462 4613 1
+3462 4712 1
+3462 4776 1
+3462 4796 1
+3462 4811 1
+3462 4962 1
+3462 5254 1
+3462 5484 1
+3462 5511 1
+3462 5817 1
+3462 6156 1
+3462 6501 1
+3462 6632 1
+3462 6634 1
+3462 7478 1
+3463 1185 1
+3463 1360 1
+3463 1688 1
+3463 2592 1
+3463 2790 1
+3463 2811 1
+3463 2871 1
+3463 3014 1
+3463 3027 1
+3463 3034 1
+3463 3073 1
+3463 3106 1
+3463 3125 1
+3463 3140 1
+3463 3144 1
+3463 3321 1
+3463 3334 1
+3463 3352 1
+3463 3443 1
+3463 3454 1
+3463 3464 1
+3463 3635 1
+3463 3664 1
+3463 3748 1
+3463 3806 1
+3463 3812 1
+3463 3958 1
+3463 4011 1
+3463 4040 1
+3463 4072 1
+3463 4199 1
+3463 4212 1
+3463 4261 1
+3463 4266 1
+3463 4466 1
+3463 4485 1
+3463 4510 1
+3463 4528 1
+3463 4531 1
+3463 4551 1
+3463 4578 1
+3463 4613 1
+3463 4662 1
+3463 4706 1
+3463 4719 1
+3463 4735 1
+3463 4796 1
+3463 4808 1
+3463 4811 1
+3463 4814 1
+3463 4820 1
+3463 4827 1
+3463 5106 1
+3463 5204 1
+3463 5239 1
+3463 5817 1
+3465 3258 1
+3465 3459 1
+3465 5301 1
+3466 1166 1
+3466 1352 1
+3466 1549 1
+3466 2209 1
+3466 2535 1
+3466 3459 1
+3466 3473 1
+3466 3680 1
+3466 3969 1
+3466 4037 1
+3466 4735 1
+3466 4986 1
+3466 5020 1
+3466 5073 1
+3466 5301 1
+3466 6606 1
+3466 7088 1
+3467 3473 1
+3468 2324 1
+3468 3473 1
+3468 3489 1
+3469 737 1
+3469 825 1
+3469 1166 1
+3469 2535 1
+3469 2686 1
+3469 3028 1
+3469 3073 1
+3469 3084 1
+3469 3192 1
+3469 3433 1
+3469 3452 1
+3469 3473 1
+3469 3529 1
+3469 3567 1
+3469 3587 1
+3469 3615 1
+3469 3804 1
+3469 4201 1
+3469 4335 1
+3469 4485 1
+3469 4827 1
+3469 5844 1
+3469 6262 1
+3470 825 1
+3470 974 1
+3470 1166 1
+3470 1744 1
+3470 2209 1
+3470 2252 1
+3470 2597 1
+3470 2623 1
+3470 2654 1
+3470 2667 1
+3470 2674 1
+3470 2693 1
+3470 2973 1
+3470 3148 1
+3470 3173 1
+3470 3473 1
+3470 3489 1
+3470 3580 1
+3470 3587 1
+3470 3670 1
+3470 8293 1
+3472 1305 1
+3472 2237 1
+3472 2285 1
+3472 2440 1
+3472 2775 1
+3472 2811 1
+3472 3352 1
+3472 3460 1
+3472 3473 1
+3472 3635 1
+3472 4037 1
+3472 4534 1
+3472 4654 1
+3472 4999 1
+3472 5083 1
+3471 3473 1
+3471 4037 1
+3475 2790 1
+3479 72 1
+3479 1157 1
+3479 1166 1
+3479 1307 1
+3479 1729 1
+3479 1744 1
+3479 1990 1
+3479 2066 1
+3479 2134 1
+3479 2237 1
+3479 2328 1
+3479 2364 1
+3479 2369 1
+3479 2499 1
+3479 2516 1
+3479 2612 1
+3479 2619 1
+3479 2646 1
+3479 2653 1
+3479 2657 1
+3479 2667 1
+3479 2687 1
+3479 2932 1
+3479 2958 1
+3479 2981 1
+3479 3002 1
+3479 3005 1
+3479 3009 1
+3479 3027 1
+3479 3073 1
+3479 3084 1
+3479 3089 1
+3479 3125 1
+3479 3192 1
+3479 3276 1
+3479 3321 1
+3479 3334 1
+3479 3352 1
+3479 3417 1
+3479 3439 1
+3479 3456 1
+3479 3537 1
+3479 3538 1
+3479 3568 1
+3479 3580 1
+3479 3587 1
+3479 3615 1
+3479 3631 1
+3479 3661 1
+3479 3691 1
+3479 3748 1
+3479 3843 1
+3479 3958 1
+3479 4013 1
+3479 4037 1
+3479 4040 1
+3479 4041 1
+3479 4065 1
+3479 4138 1
+3479 4191 1
+3479 4233 1
+3479 4263 1
+3479 4269 1
+3479 4289 1
+3479 4299 1
+3479 4323 1
+3479 4332 1
+3479 4335 1
+3479 4351 1
+3479 4365 1
+3479 4385 1
+3479 4422 1
+3479 4480 1
+3479 4483 1
+3479 4485 1
+3479 4574 1
+3479 4600 1
+3479 4661 1
+3479 4662 1
+3479 4814 1
+3479 4827 1
+3479 4828 1
+3479 4875 1
+3479 4929 1
+3479 4938 1
+3479 4999 1
+3479 5130 1
+3479 5459 1
+3479 5482 1
+3479 5513 1
+3479 5637 1
+3479 5693 1
+3479 5732 1
+3479 5737 1
+3479 5743 1
+3479 5844 1
+3479 5872 1
+3479 5963 1
+3479 6098 1
+3479 6124 1
+3479 6218 1
+3479 6739 1
+3480 978 1
+3480 1915 1
+3480 2506 1
+3480 2654 1
+3480 2657 1
+3480 2660 1
+3480 2687 1
+3480 2727 1
+3480 2775 1
+3480 2973 1
+3480 3007 1
+3480 3352 1
+3480 3458 1
+3480 3541 1
+3480 3650 1
+3480 3681 1
+3480 4201 1
+3480 4735 1
+3481 1297 1
+3481 2290 1
+3481 2324 1
+3481 2485 1
+3481 2653 1
+3481 2660 1
+3481 2686 1
+3481 2687 1
+3481 2799 1
+3481 3059 1
+3481 3117 1
+3481 3480 1
+3481 3538 1
+3481 3737 1
+3481 3807 1
+3481 3867 1
+3481 3914 1
+3482 825 1
+3482 974 1
+3482 1100 1
+3482 1297 1
+3482 2209 1
+3482 2252 1
+3482 2257 1
+3482 2324 1
+3482 2485 1
+3482 2506 1
+3482 2597 1
+3482 2654 1
+3482 2667 1
+3482 2687 1
+3482 2973 1
+3482 2974 1
+3482 3010 1
+3482 3028 1
+3482 3114 1
+3482 3480 1
+3482 3769 1
+3482 3772 1
+3482 4191 1
+3482 4290 1
+3483 1247 1
+3483 1990 1
+3483 2144 1
+3483 2209 1
+3483 2654 1
+3483 2657 1
+3483 2674 1
+3483 2687 1
+3483 2831 1
+3483 3026 1
+3483 3276 1
+3483 3393 1
+3483 3417 1
+3483 3634 1
+3483 3897 1
+3483 5263 1
+3483 5430 1
+3483 5484 1
+3483 5545 1
+3483 6251 1
+3477 827 1
+3477 1706 1
+3477 2209 1
+3477 2210 1
+3477 2252 1
+3477 2257 1
+3477 2411 1
+3477 2485 1
+3477 2508 1
+3477 2510 1
+3477 2535 1
+3477 2565 1
+3477 2585 1
+3477 2595 1
+3477 2597 1
+3477 2619 1
+3477 2623 1
+3477 2653 1
+3477 2654 1
+3477 2674 1
+3477 2687 1
+3477 2727 1
+3477 2746 1
+3477 2747 1
+3477 3005 1
+3477 3010 1
+3477 3024 1
+3477 3117 1
+3477 3173 1
+3477 3260 1
+3477 3404 1
+3477 3506 1
+3477 3529 1
+3477 3557 1
+3477 3587 1
+3477 3646 1
+3477 3650 1
+3477 3681 1
+3477 3800 1
+3477 3812 1
+3477 3816 1
+3477 3843 1
+3477 3847 1
+3477 3937 1
+3477 3946 1
+3477 3967 1
+3477 3970 1
+3477 3971 1
+3477 3973 1
+3477 3980 1
+3477 4021 1
+3477 4024 1
+3477 8294 1
+3478 1159 1
+3478 1239 1
+3478 1297 1
+3478 1473 1
+3478 2001 1
+3478 2511 1
+3478 2687 1
+3478 2693 1
+3478 2775 1
+3478 3089 1
+3478 3394 1
+3478 3479 1
+3478 3586 1
+3478 3873 1
+3478 3958 1
+3478 4138 1
+3478 4179 1
+3478 4289 1
+3478 4338 1
+3478 4527 1
+3478 4781 1
+3478 4797 1
+3478 4828 1
+3478 5179 1
+3478 5226 1
+3478 5288 1
+3478 5335 1
+3478 5454 1
+3478 5543 1
+3478 5732 1
+3478 5775 1
+3478 5799 1
+3478 5814 1
+3478 5829 1
+3478 5850 1
+3478 5994 1
+3478 6006 1
+3478 6124 1
+3478 6227 1
+3478 6458 1
+3478 6918 1
+3478 7115 1
+3487 3489 1
+3488 465 1
+3488 608 1
+3488 1157 1
+3488 1473 1
+3488 1706 1
+3488 2066 1
+3488 2328 1
+3488 2506 1
+3488 2655 1
+3488 3084 1
+3488 3117 1
+3488 3489 1
+3488 3892 1
+3488 3967 1
+3488 4055 1
+3488 4365 1
+3492 2285 1
+3492 5814 1
+3492 8293 1
+3493 8293 1
+3490 3321 1
+3490 8293 1
+3494 8293 1
+3495 2285 1
+3495 5375 1
+3495 8293 1
+3427 8293 1
+3496 2144 1
+3496 2542 1
+3496 2623 1
+3496 2660 1
+3496 2859 1
+3496 3258 1
+3496 3562 1
+3496 4485 1
+3496 4531 1
+3496 8293 1
+3491 2285 1
+3491 8293 1
+2524 1688 1
+2524 2508 1
+2524 2693 1
+2524 3946 1
+2524 5246 1
+2524 7803 1
+2524 8293 1
+3497 8293 1
+3498 346 1
+3498 608 1
+3498 737 1
+3498 896 1
+3498 1385 1
+3498 1473 1
+3498 1571 1
+3498 1799 1
+3498 2001 1
+3498 2237 1
+3498 2290 1
+3498 2326 1
+3498 2381 1
+3498 2398 1
+3498 2456 1
+3498 2490 1
+3498 2516 1
+3498 2535 1
+3498 2605 1
+3498 2775 1
+3498 2909 1
+3498 3014 1
+3498 3015 1
+3498 3089 1
+3498 3180 1
+3498 3238 1
+3498 3297 1
+3498 3309 1
+3498 3352 1
+3498 3393 1
+3498 3443 1
+3498 3452 1
+3498 3456 1
+3498 3460 1
+3498 3586 1
+3498 3631 1
+3498 3755 1
+3498 3796 1
+3498 3835 1
+3498 3897 1
+3498 3910 1
+3498 3969 1
+3498 4037 1
+3498 4040 1
+3498 4099 1
+3498 4335 1
+3498 4448 1
+3498 4530 1
+3498 4534 1
+3498 4536 1
+3498 4587 1
+3498 4600 1
+3498 4653 1
+3498 4666 1
+3498 4712 1
+3498 4735 1
+3498 4811 1
+3498 4846 1
+3498 4899 1
+3498 4953 1
+3498 4977 1
+3498 4986 1
+3498 5022 1
+3498 5061 1
+3498 5072 1
+3498 5155 1
+3498 5189 1
+3498 5254 1
+3498 5285 1
+3498 5412 1
+3498 5423 1
+3498 5449 1
+3498 5452 1
+3498 5454 1
+3498 5459 1
+3498 5463 1
+3498 5482 1
+3498 5509 1
+3498 5524 1
+3498 5527 1
+3498 5637 1
+3498 5651 1
+3498 5683 1
+3498 5693 1
+3498 5721 1
+3498 5743 1
+3498 5753 1
+3498 5780 1
+3498 5790 1
+3498 5828 1
+3498 5837 1
+3498 5844 1
+3498 5863 1
+3498 5902 1
+3498 5936 1
+3498 5991 1
+3498 5994 1
+3498 6098 1
+3498 6299 1
+3498 6328 1
+3498 6918 1
+3498 7054 1
+3498 7478 1
+3498 7553 1
+3498 7587 1
+3498 7632 1
+3498 7726 1
+3498 7882 1
+3498 7961 1
+3498 8044 1
+3498 8083 1
+3498 8178 1
+3498 8293 1
+3498 8294 1
+3499 2285 1
+3499 7803 1
+3499 8293 1
+3500 8293 1
+3504 2623 1
+3509 2542 1
+3510 3516 1
+3515 3516 1
+3515 3538 1
+3515 3587 1
+3511 3516 1
+3512 1706 1
+3512 2209 1
+3512 2328 1
+3512 2485 1
+3512 2510 1
+3512 2653 1
+3512 2799 1
+3512 2981 1
+3512 3516 1
+3513 204 1
+3513 2660 1
+3513 3009 1
+3513 3516 1
+3514 3516 1
+3518 1297 1
+3518 2398 1
+3518 2657 1
+3518 3005 1
+3518 3720 1
+3518 8294 1
+3519 737 1
+3519 1549 1
+3519 2134 1
+3519 2145 1
+3519 2237 1
+3519 2328 1
+3519 2398 1
+3519 2485 1
+3519 2516 1
+3519 2565 1
+3519 2576 1
+3519 2585 1
+3519 2595 1
+3519 2619 1
+3519 2657 1
+3519 2686 1
+3519 2693 1
+3519 2746 1
+3519 2831 1
+3519 2871 1
+3519 3007 1
+3519 3024 1
+3519 3026 1
+3519 3028 1
+3519 3084 1
+3519 3092 1
+3519 3117 1
+3519 3258 1
+3519 3291 1
+3519 3352 1
+3519 3443 1
+3519 3456 1
+3519 3529 1
+3519 3568 1
+3519 3615 1
+3519 3661 1
+3519 3796 1
+3519 3800 1
+3519 3892 1
+3519 4191 1
+3519 4247 1
+3519 4263 1
+3519 4400 1
+3519 4448 1
+3519 4587 1
+3519 4600 1
+3519 5144 1
+3519 5459 1
+3520 3529 1
+3521 15 1
+3521 825 1
+3521 2066 1
+3521 2328 1
+3521 2485 1
+3521 2535 1
+3521 2790 1
+3521 2940 1
+3521 3005 1
+3521 3117 1
+3521 3125 1
+3521 3258 1
+3521 3291 1
+3521 3334 1
+3521 3443 1
+3521 3498 1
+3521 3529 1
+3521 3568 1
+3521 3969 1
+3521 4384 1
+3521 4453 1
+3521 4482 1
+3521 4485 1
+3521 4735 1
+3521 5844 1
+3521 5886 1
+3521 6328 1
+3521 7632 1
+3521 7757 1
+3522 15 1
+3522 2001 1
+3522 2134 1
+3522 2328 1
+3522 2364 1
+3522 2384 1
+3522 2398 1
+3522 2565 1
+3522 2851 1
+3522 2958 1
+3522 3192 1
+3522 3291 1
+3522 3334 1
+3522 3393 1
+3522 3394 1
+3522 3447 1
+3522 3453 1
+3522 3455 1
+3522 3456 1
+3522 3529 1
+3522 3554 1
+3522 3557 1
+3522 3650 1
+3522 3691 1
+3522 3806 1
+3522 3910 1
+3522 3976 1
+3522 4044 1
+3522 4124 1
+3522 4441 1
+3522 4510 1
+3522 4551 1
+3522 4552 1
+3522 4558 1
+3522 4584 1
+3522 4620 1
+3522 4631 1
+3522 4661 1
+3522 4824 1
+3522 4831 1
+3522 4875 1
+3522 5020 1
+3522 5073 1
+3522 5179 1
+3522 5233 1
+3522 5254 1
+3522 5305 1
+3522 5375 1
+3522 5454 1
+3522 5457 1
+3522 5511 1
+3522 5543 1
+3522 5630 1
+3522 5639 1
+3522 5640 1
+3522 5683 1
+3522 5697 1
+3522 5790 1
+3522 5818 1
+3522 5902 1
+3522 5963 1
+3522 5994 1
+3522 6124 1
+3522 6148 1
+3522 6246 1
+3522 6306 1
+3522 6327 1
+3522 6553 1
+3522 6634 1
+3522 6770 1
+3522 7225 1
+3523 1100 1
+3523 1297 1
+3523 1744 1
+3523 1915 1
+3523 2257 1
+3523 2324 1
+3523 2411 1
+3523 2485 1
+3523 2510 1
+3523 2654 1
+3523 2657 1
+3523 2693 1
+3523 2727 1
+3523 2747 1
+3523 2973 1
+3523 3005 1
+3523 3010 1
+3523 3109 1
+3523 3114 1
+3523 3148 1
+3523 3520 1
+3523 3529 1
+3523 3670 1
+3523 3681 1
+3523 3769 1
+3523 3776 1
+3523 3804 1
+3523 3807 1
+3524 3529 1
+3525 1297 1
+3525 1935 1
+3525 2114 1
+3525 2510 1
+3525 2657 1
+3525 2923 1
+3525 3005 1
+3525 3059 1
+3525 3200 1
+3525 3404 1
+3525 3529 1
+3525 3541 1
+3525 3680 1
+3525 3772 1
+3525 3807 1
+3525 6855 1
+3526 1706 1
+3526 2411 1
+3526 2485 1
+3526 2654 1
+3526 3529 1
+3526 3887 1
+3527 465 1
+3527 608 1
+3527 778 1
+3527 827 1
+3527 840 1
+3527 1297 1
+3527 1403 1
+3527 1453 1
+3527 1706 1
+3527 1777 1
+3527 1915 1
+3527 2114 1
+3527 2257 1
+3527 2411 1
+3527 2485 1
+3527 2508 1
+3527 2544 1
+3527 2565 1
+3527 2585 1
+3527 2619 1
+3527 2657 1
+3527 2686 1
+3527 2727 1
+3527 2785 1
+3527 3007 1
+3527 3010 1
+3527 3024 1
+3527 3026 1
+3527 3028 1
+3527 3059 1
+3527 3084 1
+3527 3117 1
+3527 3200 1
+3527 3260 1
+3527 3352 1
+3527 3480 1
+3527 3483 1
+3527 3529 1
+3527 3576 1
+3527 3631 1
+3527 3646 1
+3527 3650 1
+3527 3772 1
+3527 3803 1
+3527 3804 1
+3527 3812 1
+3527 3822 1
+3527 3871 1
+3527 3887 1
+3527 3892 1
+3527 3893 1
+3527 3903 1
+3527 3926 1
+3527 3933 1
+3527 3937 1
+3527 3946 1
+3527 3967 1
+3527 5012 1
+3527 5288 1
+3527 5484 1
+3527 6560 1
+3527 6994 1
+3527 7108 1
+3527 7214 1
+3386 204 1
+3386 974 1
+3386 1166 1
+3386 2066 1
+3386 2398 1
+3386 3005 1
+3386 3028 1
+3386 3089 1
+3386 3117 1
+3386 3456 1
+3386 3892 1
+3386 5100 1
+3530 204 1
+3530 2660 1
+3530 4349 1
+3531 2290 1
+3532 2290 1
+3532 2727 1
+3532 2747 1
+3532 2974 1
+3532 3548 1
+3535 2016 1
+3535 2653 1
+3535 4994 1
+3535 6148 1
+3535 6437 1
+3536 417 1
+3536 2016 1
+3536 2660 1
+3536 2667 1
+3536 2799 1
+3536 3520 1
+3538 4687 1
+3538 6720 1
+3539 2508 1
+3539 2660 1
+3540 2595 1
+3540 2660 1
+3540 3717 1
+3540 4349 1
+3541 762 1
+3541 825 1
+3541 1239 1
+3541 1453 1
+3541 1915 1
+3541 1935 1
+3541 2066 1
+3541 2114 1
+3541 2145 1
+3541 2210 1
+3541 2307 1
+3541 2506 1
+3541 2508 1
+3541 2544 1
+3541 2565 1
+3541 2585 1
+3541 2595 1
+3541 2646 1
+3541 2653 1
+3541 2655 1
+3541 2657 1
+3541 2660 1
+3541 2667 1
+3541 2686 1
+3541 2727 1
+3541 2746 1
+3541 2859 1
+3541 2900 1
+3541 2923 1
+3541 2958 1
+3541 3005 1
+3541 3007 1
+3541 3026 1
+3541 3028 1
+3541 3059 1
+3541 3084 1
+3541 3117 1
+3541 3200 1
+3541 3260 1
+3541 3276 1
+3541 3394 1
+3541 3404 1
+3541 3454 1
+3541 3480 1
+3541 3562 1
+3541 3576 1
+3541 3616 1
+3541 3645 1
+3541 3650 1
+3541 3680 1
+3541 3803 1
+3541 3807 1
+3541 3809 1
+3541 3812 1
+3541 3847 1
+3541 3849 1
+3541 3871 1
+3541 3887 1
+3541 3888 1
+3541 3892 1
+3541 3893 1
+3541 3903 1
+3541 3922 1
+3541 3926 1
+3541 3933 1
+3541 3937 1
+3541 3942 1
+3541 3967 1
+3541 4011 1
+3541 4021 1
+3541 4024 1
+3541 4049 1
+3541 4055 1
+3541 4110 1
+3541 4162 1
+3541 4179 1
+3541 4191 1
+3541 4256 1
+3541 4417 1
+3541 4424 1
+3541 4578 1
+3542 2485 1
+3542 2660 1
+3542 3453 1
+3542 4011 1
+3542 5058 1
+3543 2657 1
+3543 2660 1
+3543 3548 1
+3508 417 1
+3508 1166 1
+3508 1297 1
+3508 2328 1
+3508 2535 1
+3508 2660 1
+3508 2900 1
+3508 3026 1
+3508 3680 1
+3508 4735 1
+3508 6496 1
+3544 2657 1
+3544 2660 1
+3544 2799 1
+3544 3276 1
+3544 3609 1
+3544 3646 1
+3544 3937 1
+3545 2660 1
+3545 7890 1
+3550 417 1
+3551 417 1
+3552 417 1
+3553 417 1
+3553 2252 1
+3553 2597 1
+3553 2653 1
+3553 2654 1
+3553 3276 1
+3553 3587 1
+3553 3670 1
+3554 15 1
+3554 2958 1
+3554 3009 1
+3554 4373 1
+3554 5705 1
+3554 7839 1
+3555 465 1
+3555 1935 1
+3555 2324 1
+3555 2328 1
+3555 2667 1
+3555 2693 1
+3555 2746 1
+3555 2973 1
+3555 3009 1
+3555 3024 1
+3555 3026 1
+3555 3537 1
+3555 3887 1
+3555 3892 1
+3556 1680 1
+3556 1915 1
+3556 2114 1
+3556 2686 1
+3556 2727 1
+3556 3200 1
+3556 3276 1
+3556 3541 1
+3556 3680 1
+3556 3804 1
+3556 3807 1
+3556 3892 1
+3556 5204 1
+3556 5222 1
+3557 2257 1
+3557 2799 1
+3557 3028 1
+3557 3084 1
+3557 3615 1
+3557 3645 1
+3557 3871 1
+3557 4199 1
+3557 4558 1
+3557 4562 1
+3558 2799 1
+3560 1297 1
+3560 2516 1
+3560 2565 1
+3560 2597 1
+3560 2653 1
+3560 2667 1
+3560 2923 1
+3560 3125 1
+3560 3320 1
+3560 3803 1
+3560 3843 1
+3560 4299 1
+3560 4402 1
+3560 4463 1
+3560 4481 1
+3560 4485 1
+3561 1935 1
+3561 2667 1
+3561 3562 1
+3561 3856 1
+3562 465 1
+3562 825 1
+3562 974 1
+3562 1166 1
+3562 1297 1
+3562 1549 1
+3562 1935 1
+3562 1990 1
+3562 2066 1
+3562 2210 1
+3562 2328 1
+3562 2506 1
+3562 2585 1
+3562 2619 1
+3562 2657 1
+3562 2667 1
+3562 2674 1
+3562 2727 1
+3562 2746 1
+3562 2958 1
+3562 2973 1
+3562 3005 1
+3562 3024 1
+3562 3260 1
+3562 3537 1
+3562 3541 1
+3562 3580 1
+3562 3650 1
+3562 3800 1
+3562 3807 1
+3562 3822 1
+3562 3892 1
+3562 3970 1
+3562 4021 1
+3562 4124 1
+3562 4191 1
+3562 4256 1
+3562 6832 1
+3562 7632 1
+3562 8294 1
+3563 2667 1
+3563 4341 1
+3563 5479 1
+3564 2667 1
+3564 3480 1
+3565 2667 1
+3566 2667 1
+3567 2324 1
+3567 2384 1
+3567 2485 1
+3567 2565 1
+3567 2595 1
+3567 2619 1
+3567 2654 1
+3567 2657 1
+3567 2667 1
+3567 2981 1
+3567 3148 1
+3567 3670 1
+3567 3671 1
+3567 3680 1
+3567 3717 1
+3567 4043 1
+3567 4335 1
+3567 4929 1
+3568 15 1
+3568 608 1
+3568 737 1
+3568 825 1
+3568 827 1
+3568 1185 1
+3568 1239 1
+3568 1307 1
+3568 1453 1
+3568 1688 1
+3568 1990 1
+3568 2066 1
+3568 2134 1
+3568 2257 1
+3568 2328 1
+3568 2384 1
+3568 2398 1
+3568 2485 1
+3568 2506 1
+3568 2516 1
+3568 2576 1
+3568 2585 1
+3568 2612 1
+3568 2653 1
+3568 2657 1
+3568 2760 1
+3568 2822 1
+3568 2831 1
+3568 2859 1
+3568 2871 1
+3568 2900 1
+3568 2932 1
+3568 2958 1
+3568 2981 1
+3568 3010 1
+3568 3015 1
+3568 3103 1
+3568 3114 1
+3568 3125 1
+3568 3192 1
+3568 3258 1
+3568 3321 1
+3568 3334 1
+3568 3352 1
+3568 3394 1
+3568 3417 1
+3568 3439 1
+3568 3443 1
+3568 3454 1
+3568 3456 1
+3568 3460 1
+3568 3463 1
+3568 3479 1
+3568 3537 1
+3568 3557 1
+3568 3562 1
+3568 3615 1
+3568 3635 1
+3568 3645 1
+3568 3660 1
+3568 3661 1
+3568 3720 1
+3568 3787 1
+3568 3796 1
+3568 3800 1
+3568 3812 1
+3568 3813 1
+3568 3843 1
+3568 3897 1
+3568 3910 1
+3568 3946 1
+3568 3949 1
+3568 3970 1
+3568 3973 1
+3568 4011 1
+3568 4013 1
+3568 4021 1
+3568 4030 1
+3568 4040 1
+3568 4043 1
+3568 4047 1
+3568 4049 1
+3568 4051 1
+3568 4055 1
+3568 4072 1
+3568 4078 1
+3568 4088 1
+3568 4098 1
+3568 4103 1
+3568 4110 1
+3568 4124 1
+3568 4138 1
+3568 4162 1
+3568 4171 1
+3568 4173 1
+3568 4179 1
+3568 4189 1
+3568 4191 1
+3568 4201 1
+3568 4233 1
+3568 4235 1
+3568 4256 1
+3568 4261 1
+3568 4263 1
+3568 4265 1
+3568 4269 1
+3568 4289 1
+3568 4297 1
+3568 4299 1
+3568 4323 1
+3568 4335 1
+3568 4373 1
+3568 4417 1
+3568 4448 1
+3568 4483 1
+3568 4530 1
+3568 4536 1
+3568 4547 1
+3568 4551 1
+3568 4578 1
+3568 4605 1
+3568 4653 1
+3568 4662 1
+3568 4706 1
+3568 4712 1
+3568 4735 1
+3568 4811 1
+3568 4953 1
+3568 4999 1
+3568 5130 1
+3568 5146 1
+3568 5176 1
+3568 5200 1
+3568 5254 1
+3568 5262 1
+3568 5404 1
+3568 5459 1
+3568 5484 1
+3568 5509 1
+3568 5620 1
+3568 5757 1
+3568 5844 1
+3568 5848 1
+3568 5863 1
+3568 5928 1
+3568 6162 1
+3568 8294 1
+3569 1297 1
+3569 1453 1
+3569 1549 1
+3569 1777 1
+3569 2114 1
+3569 2210 1
+3569 2485 1
+3569 2508 1
+3569 2565 1
+3569 2653 1
+3569 2654 1
+3569 2657 1
+3569 2693 1
+3569 2747 1
+3569 2900 1
+3569 3026 1
+3569 3059 1
+3569 3148 1
+3569 3173 1
+3569 3200 1
+3569 3352 1
+3569 3537 1
+3569 3541 1
+3569 3557 1
+3569 3580 1
+3569 3646 1
+3569 3650 1
+3569 3680 1
+3569 3720 1
+3569 3803 1
+3569 3804 1
+3569 3807 1
+3569 3871 1
+3569 3926 1
+3569 3937 1
+3569 3946 1
+3569 4021 1
+3569 4043 1
+3569 4653 1
+3569 5484 1
+3569 5814 1
+3569 6347 1
+3576 2252 1
+3576 3026 1
+3576 3970 1
+3576 6855 1
+3577 2252 1
+3579 3580 1
+3579 4181 1
+3578 3580 1
+3578 3708 1
+3587 1026 1
+3587 1166 1
+3587 2324 1
+3587 2674 1
+3587 3459 1
+3587 4488 1
+3587 5022 1
+3587 6328 1
+3587 6388 1
+3587 6850 1
+3587 6855 1
+3587 6869 1
+3587 7567 1
+3587 7708 1
+3587 8178 1
+3581 3587 1
+3582 3587 1
+3583 1915 1
+3583 2657 1
+3583 2747 1
+3583 3587 1
+3584 3587 1
+3585 3587 1
+3585 6505 1
+3586 155 1
+3586 1026 1
+3586 2160 1
+3586 2658 1
+3586 2774 1
+3586 2940 1
+3586 3084 1
+3586 3238 1
+3586 3291 1
+3586 3293 1
+3586 3334 1
+3586 3498 1
+3586 3587 1
+3586 3634 1
+3586 3770 1
+3586 3830 1
+3586 3873 1
+3586 3897 1
+3586 3962 1
+3586 4037 1
+3586 4065 1
+3586 4099 1
+3586 4218 1
+3586 4310 1
+3586 4401 1
+3586 4435 1
+3586 4441 1
+3586 4483 1
+3586 4632 1
+3586 4687 1
+3586 4709 1
+3586 4712 1
+3586 4748 1
+3586 4795 1
+3586 4828 1
+3586 4875 1
+3586 4981 1
+3586 4994 1
+3586 5020 1
+3586 5022 1
+3586 5037 1
+3586 5079 1
+3586 5103 1
+3586 5123 1
+3586 5178 1
+3586 5188 1
+3586 5199 1
+3586 5200 1
+3586 5210 1
+3586 5254 1
+3586 5298 1
+3586 5335 1
+3586 5423 1
+3586 5479 1
+3586 5484 1
+3586 5524 1
+3586 5527 1
+3586 5543 1
+3586 5563 1
+3586 5605 1
+3586 5624 1
+3586 5638 1
+3586 5684 1
+3586 5714 1
+3586 5739 1
+3586 5753 1
+3586 5760 1
+3586 5799 1
+3586 5800 1
+3586 5804 1
+3586 5806 1
+3586 5811 1
+3586 5814 1
+3586 5819 1
+3586 5827 1
+3586 5839 1
+3586 5872 1
+3586 5886 1
+3586 5902 1
+3586 5972 1
+3586 5980 1
+3586 6032 1
+3586 6043 1
+3586 6044 1
+3586 6123 1
+3586 6226 1
+3586 6227 1
+3586 6251 1
+3586 6270 1
+3586 6272 1
+3586 6296 1
+3586 6311 1
+3586 6327 1
+3586 6344 1
+3586 6407 1
+3586 6414 1
+3586 6427 1
+3586 6464 1
+3586 6481 1
+3586 6501 1
+3586 6505 1
+3586 6555 1
+3586 6613 1
+3586 6665 1
+3586 6680 1
+3586 6715 1
+3586 6770 1
+3586 6780 1
+3586 6784 1
+3586 6832 1
+3586 6833 1
+3586 6875 1
+3586 6907 1
+3586 6913 1
+3586 6914 1
+3586 6930 1
+3586 6934 1
+3586 6942 1
+3586 6976 1
+3586 6979 1
+3586 7012 1
+3586 7021 1
+3586 7050 1
+3586 7063 1
+3586 7092 1
+3586 7110 1
+3586 7119 1
+3586 7143 1
+3586 7144 1
+3586 7168 1
+3586 7185 1
+3586 7237 1
+3586 7301 1
+3586 7351 1
+3586 7381 1
+3586 7400 1
+3586 7414 1
+3586 7436 1
+3586 7553 1
+3586 7587 1
+3586 7632 1
+3586 7651 1
+3586 7662 1
+3586 7726 1
+3586 7795 1
+3586 7809 1
+3586 7835 1
+3586 7874 1
+3586 7921 1
+3586 7961 1
+3586 7979 1
+3586 8042 1
+3586 8051 1
+3586 8121 1
+3586 8128 1
+3586 8295 1
+3589 2510 1
+3589 2657 1
+3589 2923 1
+3589 3276 1
+3589 3681 1
+3528 1166 1
+3528 1297 1
+3528 2257 1
+3528 2411 1
+3528 2565 1
+3528 2654 1
+3528 2923 1
+3528 2973 1
+3528 3024 1
+3528 3276 1
+3528 3737 1
+3528 3745 1
+3528 3804 1
+3591 2517 1
+3591 2787 1
+3591 3014 1
+3591 3334 1
+3591 3352 1
+3591 3454 1
+3591 3568 1
+3591 3615 1
+3591 3645 1
+3591 4299 1
+3591 4480 1
+3591 4578 1
+3591 8294 1
+3590 3591 1
+3593 554 1
+3593 1403 1
+3593 1961 1
+3593 2237 1
+3593 2354 1
+3593 2654 1
+3593 2822 1
+3593 2851 1
+3593 3456 1
+3593 3726 1
+3593 3803 1
+3593 4037 1
+3593 4247 1
+3593 4884 1
+3593 4999 1
+3593 5384 1
+3593 5404 1
+3593 5452 1
+3593 5680 1
+3593 5776 1
+3593 5848 1
+3593 6736 1
+3593 7101 1
+3593 7115 1
+3593 7143 1
+3593 7144 1
+3594 554 1
+3594 2384 1
+3598 2354 1
+3598 2654 1
+3598 3173 1
+3598 3192 1
+3595 3173 1
+3595 3537 1
+3599 3173 1
+3600 1166 1
+3600 2674 1
+3600 3173 1
+3600 3650 1
+3600 4219 1
+3600 5430 1
+3600 5811 1
+3600 6123 1
+3600 6417 1
+3600 6946 1
+3600 7279 1
+3600 7478 1
+3601 15 1
+3601 346 1
+3601 737 1
+3601 974 1
+3601 1026 1
+3601 1799 1
+3601 2001 1
+3601 2276 1
+3601 2324 1
+3601 2369 1
+3601 2398 1
+3601 2657 1
+3601 2696 1
+3601 2774 1
+3601 3027 1
+3601 3089 1
+3601 3173 1
+3601 3334 1
+3601 3459 1
+3601 3645 1
+3601 3646 1
+3601 3748 1
+3601 3785 1
+3601 3830 1
+3601 3897 1
+3601 3958 1
+3601 4037 1
+3601 4138 1
+3601 4191 1
+3601 4216 1
+3601 4297 1
+3601 4310 1
+3601 4400 1
+3601 4530 1
+3601 4578 1
+3601 4795 1
+3601 4797 1
+3601 4820 1
+3601 4977 1
+3601 5189 1
+3601 5392 1
+3601 5412 1
+3601 5680 1
+3601 5721 1
+3601 5732 1
+3601 5737 1
+3601 5743 1
+3601 6156 1
+3601 6251 1
+3601 7620 1
+3601 7632 1
+3601 7699 1
+3596 3173 1
+3597 2066 1
+3597 2328 1
+3597 2485 1
+3597 2565 1
+3597 2696 1
+3597 2747 1
+3597 3010 1
+3597 3026 1
+3597 3059 1
+3597 3173 1
+3597 3192 1
+3597 3404 1
+3597 3681 1
+3602 1166 1
+3603 1166 1
+3603 1305 1
+3603 1310 1
+3603 2237 1
+3603 2917 1
+3603 3002 1
+3603 3433 1
+3603 3803 1
+3603 4044 1
+3603 4189 1
+3603 4792 1
+3603 5254 1
+3605 974 1
+3606 974 1
+3607 15 1
+3607 762 1
+3607 974 1
+3607 2145 1
+3607 2237 1
+3607 2328 1
+3607 2516 1
+3607 2535 1
+3607 2851 1
+3607 3352 1
+3607 3456 1
+3607 4037 1
+3607 4781 1
+3607 4953 1
+3607 5022 1
+3607 5233 1
+3607 5543 1
+3607 5684 1
+3607 6327 1
+3607 6715 1
+3607 6770 1
+3607 6833 1
+3607 7143 1
+3607 7168 1
+3610 1744 1
+3610 2674 1
+3610 2747 1
+3610 3148 1
+3611 1297 1
+3611 1744 1
+3611 2257 1
+3611 2324 1
+3611 2411 1
+3611 2485 1
+3611 2510 1
+3611 2654 1
+3611 2657 1
+3611 2674 1
+3611 2693 1
+3611 2923 1
+3611 2973 1
+3611 3005 1
+3611 3059 1
+3611 3114 1
+3611 3148 1
+3611 3404 1
+3611 3680 1
+3611 3737 1
+3611 3769 1
+3611 3847 1
+3613 3616 1
+3614 465 1
+3614 608 1
+3614 737 1
+3614 896 1
+3614 1024 1
+3614 1100 1
+3614 1157 1
+3614 1159 1
+3614 1247 1
+3614 1297 1
+3614 1310 1
+3614 1473 1
+3614 1648 1
+3614 1733 1
+3614 1769 1
+3614 1799 1
+3614 1984 1
+3614 1990 1
+3614 2001 1
+3614 2066 1
+3614 2145 1
+3614 2257 1
+3614 2258 1
+3614 2276 1
+3614 2328 1
+3614 2364 1
+3614 2381 1
+3614 2507 1
+3614 2508 1
+3614 2516 1
+3614 2535 1
+3614 2576 1
+3614 2592 1
+3614 2605 1
+3614 2689 1
+3614 2727 1
+3614 2764 1
+3614 2765 1
+3614 2775 1
+3614 2787 1
+3614 2790 1
+3614 2822 1
+3614 2831 1
+3614 2859 1
+3614 2909 1
+3614 2923 1
+3614 2958 1
+3614 3002 1
+3614 3027 1
+3614 3034 1
+3614 3089 1
+3614 3103 1
+3614 3106 1
+3614 3192 1
+3614 3238 1
+3614 3274 1
+3614 3276 1
+3614 3284 1
+3614 3291 1
+3614 3309 1
+3614 3352 1
+3614 3393 1
+3614 3394 1
+3614 3417 1
+3614 3443 1
+3614 3447 1
+3614 3452 1
+3614 3455 1
+3614 3456 1
+3614 3458 1
+3614 3459 1
+3614 3460 1
+3614 3537 1
+3614 3554 1
+3614 3557 1
+3614 3562 1
+3614 3568 1
+3614 3586 1
+3614 3607 1
+3614 3616 1
+3614 3634 1
+3614 3643 1
+3614 3691 1
+3614 3776 1
+3614 3796 1
+3614 3843 1
+3614 3854 1
+3614 3897 1
+3614 3898 1
+3614 3910 1
+3614 3921 1
+3614 3958 1
+3614 4013 1
+3614 4037 1
+3614 4055 1
+3614 4065 1
+3614 4068 1
+3614 4110 1
+3614 4124 1
+3614 4162 1
+3614 4191 1
+3614 4201 1
+3614 4233 1
+3614 4256 1
+3614 4290 1
+3614 4297 1
+3614 4298 1
+3614 4310 1
+3614 4315 1
+3614 4335 1
+3614 4338 1
+3614 4400 1
+3614 4422 1
+3614 4448 1
+3614 4482 1
+3614 4483 1
+3614 4500 1
+3614 4510 1
+3614 4527 1
+3614 4530 1
+3614 4534 1
+3614 4551 1
+3614 4574 1
+3614 4587 1
+3614 4600 1
+3614 4653 1
+3614 4654 1
+3614 4666 1
+3614 4712 1
+3614 4715 1
+3614 4781 1
+3614 4792 1
+3614 4824 1
+3614 4828 1
+3614 4846 1
+3614 4929 1
+3614 4938 1
+3614 4953 1
+3614 4962 1
+3614 4999 1
+3614 5022 1
+3614 5026 1
+3614 5044 1
+3614 5055 1
+3614 5072 1
+3614 5073 1
+3614 5079 1
+3614 5083 1
+3614 5092 1
+3614 5100 1
+3614 5103 1
+3614 5106 1
+3614 5121 1
+3614 5123 1
+3614 5155 1
+3614 5178 1
+3614 5182 1
+3614 5222 1
+3614 5226 1
+3614 5239 1
+3614 5245 1
+3614 5326 1
+3614 5335 1
+3614 5387 1
+3614 5412 1
+3614 5430 1
+3614 5454 1
+3614 5459 1
+3614 5463 1
+3614 5509 1
+3614 5513 1
+3614 5524 1
+3614 5543 1
+3614 5563 1
+3614 5596 1
+3614 5637 1
+3614 5680 1
+3614 5684 1
+3614 5693 1
+3614 5714 1
+3614 5732 1
+3614 5737 1
+3614 5739 1
+3614 5743 1
+3614 5753 1
+3614 5775 1
+3614 5798 1
+3614 5802 1
+3614 5804 1
+3614 5818 1
+3614 5828 1
+3614 5837 1
+3614 5844 1
+3614 5848 1
+3614 5922 1
+3614 5925 1
+3614 5947 1
+3614 6006 1
+3614 6124 1
+3614 6227 1
+3614 6229 1
+3614 6327 1
+3614 6715 1
+3614 6875 1
+3614 7092 1
+3615 465 1
+3615 762 1
+3615 778 1
+3615 825 1
+3615 827 1
+3615 1297 1
+3615 1307 1
+3615 1453 1
+3615 1549 1
+3615 1688 1
+3615 1706 1
+3615 1729 1
+3615 1769 1
+3615 1915 1
+3615 1990 1
+3615 2066 1
+3615 2144 1
+3615 2145 1
+3615 2237 1
+3615 2240 1
+3615 2252 1
+3615 2307 1
+3615 2328 1
+3615 2381 1
+3615 2398 1
+3615 2411 1
+3615 2508 1
+3615 2516 1
+3615 2535 1
+3615 2544 1
+3615 2592 1
+3615 2595 1
+3615 2619 1
+3615 2646 1
+3615 2653 1
+3615 2655 1
+3615 2657 1
+3615 2686 1
+3615 2746 1
+3615 2760 1
+3615 2859 1
+3615 2871 1
+3615 2932 1
+3615 2981 1
+3615 3007 1
+3615 3024 1
+3615 3026 1
+3615 3059 1
+3615 3117 1
+3615 3125 1
+3615 3140 1
+3615 3180 1
+3615 3192 1
+3615 3200 1
+3615 3258 1
+3615 3260 1
+3615 3291 1
+3615 3352 1
+3615 3394 1
+3615 3404 1
+3615 3439 1
+3615 3443 1
+3615 3452 1
+3615 3453 1
+3615 3455 1
+3615 3456 1
+3615 3483 1
+3615 3541 1
+3615 3557 1
+3615 3562 1
+3615 3568 1
+3615 3607 1
+3615 3616 1
+3615 3635 1
+3615 3645 1
+3615 3650 1
+3615 3660 1
+3615 3664 1
+3615 3691 1
+3615 3720 1
+3615 3796 1
+3615 3803 1
+3615 3804 1
+3615 3806 1
+3615 3807 1
+3615 3812 1
+3615 3822 1
+3615 3843 1
+3615 3847 1
+3615 3887 1
+3615 3893 1
+3615 3903 1
+3615 3910 1
+3615 3926 1
+3615 3933 1
+3615 3937 1
+3615 3946 1
+3615 3956 1
+3615 3967 1
+3615 3969 1
+3615 3970 1
+3615 3980 1
+3615 3999 1
+3615 4013 1
+3615 4024 1
+3615 4043 1
+3615 4044 1
+3615 4055 1
+3615 4098 1
+3615 4111 1
+3615 4124 1
+3615 4179 1
+3615 4233 1
+3615 4256 1
+3615 4263 1
+3615 4269 1
+3615 4289 1
+3615 4290 1
+3615 4299 1
+3615 4349 1
+3615 4365 1
+3615 4384 1
+3615 4417 1
+3615 4422 1
+3615 4424 1
+3615 4463 1
+3615 4480 1
+3615 4485 1
+3615 4531 1
+3615 4547 1
+3615 4578 1
+3615 4587 1
+3615 4666 1
+3615 4798 1
+3615 4953 1
+3615 5121 1
+3615 5130 1
+3615 5132 1
+3615 5210 1
+3615 5804 1
+3615 5817 1
+3615 7683 1
+3615 8293 1
+3615 8294 1
+3618 3148 1
+3619 3148 1
+3620 1157 1
+3621 1157 1
+3622 465 1
+3622 1157 1
+3622 1706 1
+3622 1744 1
+3622 2257 1
+3622 2485 1
+3622 2510 1
+3622 2544 1
+3622 2585 1
+3622 2657 1
+3622 2727 1
+3622 2747 1
+3622 3024 1
+3622 3026 1
+3622 3028 1
+3622 3059 1
+3622 3084 1
+3622 3352 1
+3622 3480 1
+3622 3650 1
+3622 3892 1
+3622 3903 1
+3624 72 1
+3624 825 1
+3624 1247 1
+3624 1473 1
+3624 1733 1
+3624 1744 1
+3624 1990 1
+3624 2210 1
+3624 2237 1
+3624 2240 1
+3624 2485 1
+3624 2516 1
+3624 2544 1
+3624 2565 1
+3624 2595 1
+3624 2619 1
+3624 2653 1
+3624 2655 1
+3624 2657 1
+3624 2746 1
+3624 2831 1
+3624 2871 1
+3624 2900 1
+3624 2909 1
+3624 2973 1
+3624 2981 1
+3624 3007 1
+3624 3024 1
+3624 3026 1
+3624 3125 1
+3624 3274 1
+3624 3334 1
+3624 3404 1
+3624 3461 1
+3624 3568 1
+3624 3660 1
+3624 3800 1
+3624 3811 1
+3624 3892 1
+3624 3999 1
+3624 4021 1
+3624 4024 1
+3624 4031 1
+3624 4043 1
+3624 4110 1
+3624 4162 1
+3624 4191 1
+3624 4290 1
+3624 4299 1
+3624 4335 1
+3624 4359 1
+3624 4384 1
+3624 4422 1
+3624 4448 1
+3624 4485 1
+3624 4528 1
+3624 4529 1
+3624 4587 1
+3624 4946 1
+3624 5459 1
+3624 5545 1
+3624 5637 1
+3624 5684 1
+3624 5980 1
+3625 1239 1
+3625 3520 1
+3625 4013 1
+3625 4201 1
+3629 2727 1
+3629 3010 1
+3629 3114 1
+3629 3537 1
+3604 2923 1
+3604 3629 1
+3628 3629 1
+3630 465 1
+3630 1297 1
+3630 1729 1
+3630 1990 1
+3630 2066 1
+3630 2240 1
+3630 2276 1
+3630 2398 1
+3630 2585 1
+3630 2612 1
+3630 2657 1
+3630 2746 1
+3630 2923 1
+3630 2958 1
+3630 3005 1
+3630 3024 1
+3630 3117 1
+3630 3439 1
+3630 3454 1
+3630 3562 1
+3630 3650 1
+3630 3660 1
+3630 3661 1
+3630 3812 1
+3630 3898 1
+3630 3946 1
+3630 3973 1
+3630 4021 1
+3630 4299 1
+3630 4373 1
+3630 4510 1
+3630 4531 1
+3631 15 1
+3631 72 1
+3631 737 1
+3631 762 1
+3631 978 1
+3631 1307 1
+3631 1549 1
+3631 2066 1
+3631 2145 1
+3631 2258 1
+3631 2328 1
+3631 2364 1
+3631 2369 1
+3631 2381 1
+3631 2398 1
+3631 2433 1
+3631 2517 1
+3631 2535 1
+3631 2544 1
+3631 2619 1
+3631 2653 1
+3631 2790 1
+3631 2859 1
+3631 3007 1
+3631 3026 1
+3631 3084 1
+3631 3180 1
+3631 3192 1
+3631 3258 1
+3631 3276 1
+3631 3313 1
+3631 3352 1
+3631 3452 1
+3631 3456 1
+3631 3463 1
+3631 3562 1
+3631 3568 1
+3631 3615 1
+3631 3650 1
+3631 3660 1
+3631 3787 1
+3631 3812 1
+3631 3813 1
+3631 3816 1
+3631 3871 1
+3631 3910 1
+3631 3914 1
+3631 3937 1
+3631 3946 1
+3631 3967 1
+3631 3973 1
+3631 4011 1
+3631 4024 1
+3631 4037 1
+3631 4099 1
+3631 4103 1
+3631 4117 1
+3631 4173 1
+3631 4179 1
+3631 4181 1
+3631 4199 1
+3631 4231 1
+3631 4233 1
+3631 4290 1
+3631 4297 1
+3631 4335 1
+3631 4349 1
+3631 4424 1
+3631 4510 1
+3631 4550 1
+3631 4661 1
+3631 4735 1
+3631 4846 1
+3631 5022 1
+3631 5055 1
+3631 5072 1
+3631 5254 1
+3631 5392 1
+3631 5412 1
+3631 5449 1
+3631 5509 1
+3631 5539 1
+3631 5568 1
+3631 5592 1
+3631 5817 1
+3631 6004 1
+3631 6918 1
+3631 7391 1
+3631 7553 1
+3631 8293 1
+3631 8295 1
+3632 3650 1
+3633 608 1
+3633 1549 1
+3633 1777 1
+3633 1915 1
+3633 2066 1
+3633 2114 1
+3633 2252 1
+3633 2384 1
+3633 2411 1
+3633 2508 1
+3633 2565 1
+3633 2585 1
+3633 2657 1
+3633 2746 1
+3633 2923 1
+3633 3028 1
+3633 3117 1
+3633 3260 1
+3633 3480 1
+3633 3557 1
+3633 3576 1
+3633 3650 1
+3633 3680 1
+3633 3720 1
+3633 3800 1
+3633 3803 1
+3633 3804 1
+3633 3807 1
+3633 3812 1
+3633 3822 1
+3633 3871 1
+3633 3887 1
+3633 3893 1
+3633 3898 1
+3633 3926 1
+3633 3933 1
+3633 3946 1
+3633 4011 1
+3633 4013 1
+3633 4021 1
+3633 4110 1
+3633 4162 1
+3633 4173 1
+3633 4181 1
+3633 4201 1
+3633 4349 1
+3633 5404 1
+3633 8294 1
+3634 737 1
+3634 1159 1
+3634 1799 1
+3634 1982 1
+3634 2240 1
+3634 2276 1
+3634 2398 1
+3634 2490 1
+3634 2764 1
+3634 2831 1
+3634 3089 1
+3634 3144 1
+3634 3352 1
+3634 3393 1
+3634 3394 1
+3634 3443 1
+3634 3456 1
+3634 3635 1
+3634 3643 1
+3634 3650 1
+3634 3755 1
+3634 3897 1
+3634 3976 1
+3634 4098 1
+3634 4099 1
+3634 4191 1
+3634 4212 1
+3634 4247 1
+3634 4323 1
+3634 4335 1
+3634 4361 1
+3634 4384 1
+3634 4448 1
+3634 4530 1
+3634 4574 1
+3634 4587 1
+3634 4646 1
+3634 4666 1
+3634 4712 1
+3634 4781 1
+3634 4846 1
+3634 4964 1
+3634 5002 1
+3634 5022 1
+3634 5028 1
+3634 5155 1
+3634 5210 1
+3634 5233 1
+3634 5323 1
+3634 5423 1
+3634 5449 1
+3634 5463 1
+3634 5509 1
+3634 5513 1
+3634 5683 1
+3634 5773 1
+3634 5800 1
+3634 5806 1
+3634 5812 1
+3634 5817 1
+3634 5863 1
+3634 5886 1
+3634 5925 1
+3634 5928 1
+3634 5994 1
+3634 6094 1
+3634 6218 1
+3634 6251 1
+3634 6262 1
+3634 6337 1
+3634 6400 1
+3634 6441 1
+3634 6481 1
+3634 6784 1
+3634 6875 1
+3634 6976 1
+3634 7295 1
+3634 7301 1
+3634 7561 1
+3634 7965 1
+3634 8141 1
+3634 8295 1
+3635 608 1
+3635 827 1
+3635 1157 1
+3635 1453 1
+3635 1729 1
+3635 2066 1
+3635 2129 1
+3635 2289 1
+3635 2328 1
+3635 2535 1
+3635 2595 1
+3635 2655 1
+3635 2746 1
+3635 2760 1
+3635 2932 1
+3635 2958 1
+3635 3007 1
+3635 3117 1
+3635 3180 1
+3635 3192 1
+3635 3276 1
+3635 3291 1
+3635 3352 1
+3635 3394 1
+3635 3439 1
+3635 3454 1
+3635 3562 1
+3635 3568 1
+3635 3615 1
+3635 3631 1
+3635 3650 1
+3635 3660 1
+3635 3787 1
+3635 3813 1
+3635 3926 1
+3635 3933 1
+3635 3937 1
+3635 3967 1
+3635 3970 1
+3635 3980 1
+3635 4013 1
+3635 4138 1
+3635 4191 1
+3635 4201 1
+3635 4233 1
+3635 4247 1
+3635 4256 1
+3635 4265 1
+3635 4290 1
+3635 4297 1
+3635 4311 1
+3635 4331 1
+3635 4332 1
+3635 4373 1
+3635 4384 1
+3635 4386 1
+3635 4402 1
+3635 4403 1
+3635 4453 1
+3635 4875 1
+3635 6243 1
+3635 7054 1
+3635 7378 1
+3636 1453 1
+3636 2508 1
+3636 2576 1
+3636 2774 1
+3636 3276 1
+3636 3646 1
+3636 3650 1
+3636 3926 1
+3636 3937 1
+3636 4953 1
+3636 5254 1
+3637 2592 1
+3637 3117 1
+3637 3650 1
+3637 3910 1
+3638 3650 1
+3639 762 1
+3639 1777 1
+3639 2760 1
+3639 2871 1
+3639 3026 1
+3639 3144 1
+3639 3309 1
+3639 3537 1
+3639 3650 1
+3639 4261 1
+3639 4662 1
+3639 5055 1
+3640 3650 1
+3641 15 1
+3641 72 1
+3641 465 1
+3641 737 1
+3641 762 1
+3641 825 1
+3641 1026 1
+3641 1060 1
+3641 1307 1
+3641 1385 1
+3641 1549 1
+3641 1680 1
+3641 1688 1
+3641 1769 1
+3641 2066 1
+3641 2134 1
+3641 2144 1
+3641 2145 1
+3641 2160 1
+3641 2210 1
+3641 2276 1
+3641 2307 1
+3641 2326 1
+3641 2328 1
+3641 2398 1
+3641 2433 1
+3641 2507 1
+3641 2516 1
+3641 2544 1
+3641 2565 1
+3641 2576 1
+3641 2653 1
+3641 2696 1
+3641 2746 1
+3641 2790 1
+3641 2822 1
+3641 2831 1
+3641 2851 1
+3641 2859 1
+3641 2900 1
+3641 2909 1
+3641 2917 1
+3641 2925 1
+3641 2958 1
+3641 3002 1
+3641 3014 1
+3641 3024 1
+3641 3026 1
+3641 3027 1
+3641 3059 1
+3641 3084 1
+3641 3089 1
+3641 3103 1
+3641 3117 1
+3641 3191 1
+3641 3192 1
+3641 3238 1
+3641 3258 1
+3641 3260 1
+3641 3334 1
+3641 3352 1
+3641 3393 1
+3641 3404 1
+3641 3417 1
+3641 3439 1
+3641 3454 1
+3641 3456 1
+3641 3459 1
+3641 3460 1
+3641 3537 1
+3641 3562 1
+3641 3568 1
+3641 3607 1
+3641 3615 1
+3641 3631 1
+3641 3643 1
+3641 3650 1
+3641 3720 1
+3641 3724 1
+3641 3748 1
+3641 3792 1
+3641 3796 1
+3641 3800 1
+3641 3813 1
+3641 3854 1
+3641 3897 1
+3641 3898 1
+3641 3946 1
+3641 3962 1
+3641 3969 1
+3641 4021 1
+3641 4037 1
+3641 4044 1
+3641 4065 1
+3641 4099 1
+3641 4110 1
+3641 4124 1
+3641 4162 1
+3641 4171 1
+3641 4173 1
+3641 4179 1
+3641 4191 1
+3641 4247 1
+3641 4254 1
+3641 4269 1
+3641 4297 1
+3641 4298 1
+3641 4310 1
+3641 4335 1
+3641 4349 1
+3641 4400 1
+3641 4488 1
+3641 4536 1
+3641 4547 1
+3641 4587 1
+3641 4600 1
+3641 4632 1
+3641 4645 1
+3641 4653 1
+3641 4662 1
+3641 4687 1
+3641 4709 1
+3641 4712 1
+3641 4713 1
+3641 4764 1
+3641 4781 1
+3641 4795 1
+3641 4811 1
+3641 4828 1
+3641 4846 1
+3641 4884 1
+3641 4929 1
+3641 4962 1
+3641 4977 1
+3641 5022 1
+3641 5033 1
+3641 5037 1
+3641 5073 1
+3641 5079 1
+3641 5103 1
+3641 5121 1
+3641 5182 1
+3641 5189 1
+3641 5295 1
+3641 5321 1
+3641 5327 1
+3641 5335 1
+3641 5404 1
+3641 5412 1
+3641 5415 1
+3641 5437 1
+3641 5439 1
+3641 5449 1
+3641 5452 1
+3641 5454 1
+3641 5459 1
+3641 5484 1
+3641 5506 1
+3641 5524 1
+3641 5527 1
+3641 5543 1
+3641 5563 1
+3641 5596 1
+3641 5605 1
+3641 5693 1
+3641 5697 1
+3641 5714 1
+3641 5739 1
+3641 5743 1
+3641 5753 1
+3641 5800 1
+3641 5802 1
+3641 5811 1
+3641 5818 1
+3641 5829 1
+3641 5848 1
+3641 5871 1
+3641 5977 1
+3641 6004 1
+3641 6098 1
+3641 6105 1
+3641 6107 1
+3641 6123 1
+3641 6124 1
+3641 6148 1
+3641 6227 1
+3641 6229 1
+3641 6272 1
+3641 6347 1
+3641 6417 1
+3641 6464 1
+3641 6498 1
+3641 6560 1
+3641 6613 1
+3641 6739 1
+3641 6770 1
+3641 6777 1
+3641 6783 1
+3641 6805 1
+3641 6855 1
+3641 6860 1
+3641 6869 1
+3641 6897 1
+3641 6901 1
+3641 6930 1
+3641 6934 1
+3641 6948 1
+3641 6955 1
+3641 7092 1
+3641 7108 1
+3641 7632 1
+3641 8294 1
+3642 15 1
+3642 72 1
+3642 155 1
+3642 465 1
+3642 778 1
+3642 840 1
+3642 896 1
+3642 1159 1
+3642 1239 1
+3642 1352 1
+3642 1473 1
+3642 1493 1
+3642 1548 1
+3642 1648 1
+3642 1733 1
+3642 1823 1
+3642 1972 1
+3642 1982 1
+3642 2001 1
+3642 2160 1
+3642 2276 1
+3642 2277 1
+3642 2285 1
+3642 2398 1
+3642 2433 1
+3642 2440 1
+3642 2490 1
+3642 2507 1
+3642 2535 1
+3642 2576 1
+3642 2605 1
+3642 2620 1
+3642 2658 1
+3642 2765 1
+3642 2774 1
+3642 2775 1
+3642 2914 1
+3642 2925 1
+3642 3084 1
+3642 3089 1
+3642 3191 1
+3642 3238 1
+3642 3274 1
+3642 3291 1
+3642 3334 1
+3642 3346 1
+3642 3459 1
+3642 3479 1
+3642 3498 1
+3642 3586 1
+3642 3614 1
+3642 3634 1
+3642 3643 1
+3642 3650 1
+3642 3792 1
+3642 3796 1
+3642 3807 1
+3642 3830 1
+3642 3842 1
+3642 3873 1
+3642 3897 1
+3642 3919 1
+3642 3922 1
+3642 3937 1
+3642 3969 1
+3642 3976 1
+3642 4037 1
+3642 4041 1
+3642 4065 1
+3642 4099 1
+3642 4134 1
+3642 4175 1
+3642 4201 1
+3642 4247 1
+3642 4276 1
+3642 4310 1
+3642 4338 1
+3642 4361 1
+3642 4483 1
+3642 4488 1
+3642 4527 1
+3642 4530 1
+3642 4534 1
+3642 4536 1
+3642 4574 1
+3642 4604 1
+3642 4689 1
+3642 4709 1
+3642 4712 1
+3642 4713 1
+3642 4715 1
+3642 4717 1
+3642 4748 1
+3642 4764 1
+3642 4781 1
+3642 4786 1
+3642 4791 1
+3642 4795 1
+3642 4797 1
+3642 4798 1
+3642 4828 1
+3642 4875 1
+3642 4899 1
+3642 4980 1
+3642 5002 1
+3642 5012 1
+3642 5020 1
+3642 5022 1
+3642 5037 1
+3642 5061 1
+3642 5072 1
+3642 5079 1
+3642 5103 1
+3642 5121 1
+3642 5123 1
+3642 5140 1
+3642 5176 1
+3642 5178 1
+3642 5179 1
+3642 5182 1
+3642 5188 1
+3642 5200 1
+3642 5210 1
+3642 5226 1
+3642 5233 1
+3642 5254 1
+3642 5262 1
+3642 5263 1
+3642 5273 1
+3642 5288 1
+3642 5295 1
+3642 5301 1
+3642 5305 1
+3642 5321 1
+3642 5335 1
+3642 5384 1
+3642 5404 1
+3642 5415 1
+3642 5423 1
+3642 5437 1
+3642 5439 1
+3642 5459 1
+3642 5479 1
+3642 5482 1
+3642 5487 1
+3642 5499 1
+3642 5524 1
+3642 5527 1
+3642 5529 1
+3642 5543 1
+3642 5545 1
+3642 5559 1
+3642 5563 1
+3642 5582 1
+3642 5584 1
+3642 5596 1
+3642 5624 1
+3642 5626 1
+3642 5630 1
+3642 5638 1
+3642 5640 1
+3642 5663 1
+3642 5680 1
+3642 5683 1
+3642 5693 1
+3642 5705 1
+3642 5713 1
+3642 5714 1
+3642 5721 1
+3642 5732 1
+3642 5737 1
+3642 5739 1
+3642 5743 1
+3642 5745 1
+3642 5753 1
+3642 5756 1
+3642 5760 1
+3642 5773 1
+3642 5775 1
+3642 5780 1
+3642 5784 1
+3642 5790 1
+3642 5799 1
+3642 5800 1
+3642 5802 1
+3642 5804 1
+3642 5814 1
+3642 5818 1
+3642 5824 1
+3642 5827 1
+3642 5828 1
+3642 5829 1
+3642 5837 1
+3642 5844 1
+3642 5848 1
+3642 5860 1
+3642 5871 1
+3642 5872 1
+3642 5886 1
+3642 5891 1
+3642 5902 1
+3642 5925 1
+3642 5928 1
+3642 5936 1
+3642 5947 1
+3642 5950 1
+3642 5963 1
+3642 5972 1
+3642 5973 1
+3642 5977 1
+3642 5980 1
+3642 5991 1
+3642 5994 1
+3642 6001 1
+3642 6004 1
+3642 6006 1
+3642 6021 1
+3642 6029 1
+3642 6080 1
+3642 6094 1
+3642 6098 1
+3642 6105 1
+3642 6107 1
+3642 6109 1
+3642 6111 1
+3642 6124 1
+3642 6130 1
+3642 6148 1
+3642 6151 1
+3642 6156 1
+3642 6161 1
+3642 6166 1
+3642 6170 1
+3642 6218 1
+3642 6221 1
+3642 6226 1
+3642 6229 1
+3642 6246 1
+3642 6251 1
+3642 6255 1
+3642 6262 1
+3642 6269 1
+3642 6296 1
+3642 6299 1
+3642 6305 1
+3642 6306 1
+3642 6323 1
+3642 6327 1
+3642 6328 1
+3642 6330 1
+3642 6334 1
+3642 6337 1
+3642 6340 1
+3642 6344 1
+3642 6347 1
+3642 6388 1
+3642 6400 1
+3642 6409 1
+3642 6414 1
+3642 6417 1
+3642 6422 1
+3642 6424 1
+3642 6435 1
+3642 6437 1
+3642 6441 1
+3642 6458 1
+3642 6462 1
+3642 6474 1
+3642 6475 1
+3642 6481 1
+3642 6496 1
+3642 6501 1
+3642 6503 1
+3642 6505 1
+3642 6523 1
+3642 6528 1
+3642 6552 1
+3642 6553 1
+3642 6554 1
+3642 6560 1
+3642 6566 1
+3642 6570 1
+3642 6571 1
+3642 6576 1
+3642 6589 1
+3642 6590 1
+3642 6592 1
+3642 6594 1
+3642 6595 1
+3642 6599 1
+3642 6600 1
+3642 6613 1
+3642 6624 1
+3642 6628 1
+3642 6632 1
+3642 6634 1
+3642 6663 1
+3642 6665 1
+3642 6699 1
+3642 6700 1
+3642 6714 1
+3642 6715 1
+3642 6720 1
+3642 6721 1
+3642 6736 1
+3642 6739 1
+3642 6765 1
+3642 6770 1
+3642 6774 1
+3642 6783 1
+3642 6789 1
+3642 6803 1
+3642 6832 1
+3642 6833 1
+3642 6850 1
+3642 6855 1
+3642 6860 1
+3642 6869 1
+3642 6873 1
+3642 6897 1
+3642 6901 1
+3642 6913 1
+3642 6914 1
+3642 6918 1
+3642 6924 1
+3642 6930 1
+3642 6934 1
+3642 6946 1
+3642 6948 1
+3642 6953 1
+3642 6994 1
+3642 7040 1
+3642 7047 1
+3642 7050 1
+3642 7052 1
+3642 7054 1
+3642 7092 1
+3642 7094 1
+3642 7108 1
+3642 7115 1
+3642 7131 1
+3642 7168 1
+3642 7185 1
+3642 7201 1
+3642 7225 1
+3642 7233 1
+3642 7295 1
+3642 7304 1
+3642 7351 1
+3642 7373 1
+3642 7378 1
+3642 7442 1
+3642 7478 1
+3642 7497 1
+3642 7510 1
+3642 7553 1
+3642 7587 1
+3642 7620 1
+3642 7632 1
+3642 7809 1
+3642 7839 1
+3642 8295 1
+3643 15 1
+3643 72 1
+3643 608 1
+3643 737 1
+3643 1385 1
+3643 1473 1
+3643 2144 1
+3643 2276 1
+3643 2354 1
+3643 2398 1
+3643 2605 1
+3643 2619 1
+3643 2790 1
+3643 3024 1
+3643 3089 1
+3643 3260 1
+3643 3321 1
+3643 3417 1
+3643 3461 1
+3643 3634 1
+3643 3645 1
+3643 3650 1
+3643 3748 1
+3643 3796 1
+3643 3800 1
+3643 3946 1
+3643 3956 1
+3643 3967 1
+3643 3970 1
+3643 4041 1
+3643 4191 1
+3643 4297 1
+3643 4298 1
+3643 4310 1
+3643 4530 1
+3643 4578 1
+3643 4712 1
+3643 4899 1
+3643 5103 1
+3643 5226 1
+3643 5452 1
+3643 5743 1
+3643 6029 1
+3643 6765 1
+3645 737 1
+3645 825 1
+3645 827 1
+3645 978 1
+3645 1239 1
+3645 2066 1
+3645 2210 1
+3645 2289 1
+3645 2328 1
+3645 2646 1
+3645 2653 1
+3645 2746 1
+3645 2859 1
+3645 2958 1
+3645 3125 1
+3645 3144 1
+3645 3260 1
+3645 3291 1
+3645 3439 1
+3645 3562 1
+3645 3568 1
+3645 3650 1
+3645 3720 1
+3645 3816 1
+3645 3970 1
+3645 4021 1
+3645 4110 1
+3645 4162 1
+3645 4179 1
+3645 4263 1
+3645 4299 1
+3645 4365 1
+3645 4373 1
+3645 4403 1
+3645 4417 1
+3645 4422 1
+3645 4463 1
+3645 4510 1
+3645 4528 1
+3645 4531 1
+3649 3650 1
+3646 825 1
+3646 1777 1
+3646 2210 1
+3646 2657 1
+3646 2958 1
+3646 2981 1
+3646 3650 1
+3646 4021 1
+3646 8294 1
+3647 465 1
+3647 1453 1
+3647 1706 1
+3647 2585 1
+3647 3007 1
+3647 3024 1
+3647 3028 1
+3647 3260 1
+3647 3352 1
+3647 3650 1
+3647 3903 1
+3647 3926 1
+3647 3937 1
+3651 3537 1
+3652 3537 1
+3654 2324 1
+3653 2324 1
+3653 2693 1
+3655 825 1
+3655 2324 1
+3655 2693 1
+3655 3002 1
+3655 4103 1
+3655 4110 1
+3655 5055 1
+3655 6918 1
+3655 8294 1
+3656 2693 1
+3656 4072 1
+3656 5288 1
+3657 2693 1
+3658 737 1
+3658 1239 1
+3658 1729 1
+3658 2237 1
+3658 2257 1
+3658 2328 1
+3658 2485 1
+3658 2510 1
+3658 2585 1
+3658 2620 1
+3658 2693 1
+3658 2774 1
+3658 2909 1
+3658 2932 1
+3658 3005 1
+3658 3089 1
+3658 3192 1
+3658 3352 1
+3658 3417 1
+3658 3537 1
+3658 3568 1
+3658 3664 1
+3658 3796 1
+3658 4191 1
+3658 4448 1
+3658 4666 1
+3658 4781 1
+3658 5140 1
+3658 5148 1
+3658 5335 1
+3658 5341 1
+3658 5459 1
+3658 5509 1
+3658 5651 1
+3658 5799 1
+3658 6227 1
+3658 6624 1
+3658 6790 1
+3658 7512 1
+3659 465 1
+3659 825 1
+3659 978 1
+3659 1385 1
+3659 1706 1
+3659 1729 1
+3659 2066 1
+3659 2289 1
+3659 2307 1
+3659 2544 1
+3659 2585 1
+3659 2727 1
+3659 2859 1
+3659 2958 1
+3659 3026 1
+3659 3028 1
+3659 3059 1
+3659 3084 1
+3659 3117 1
+3659 3352 1
+3659 3394 1
+3659 3404 1
+3659 3568 1
+3659 3660 1
+3659 3871 1
+3659 3887 1
+3659 3892 1
+3659 3912 1
+3659 3914 1
+3659 3922 1
+3659 4188 1
+3659 4263 1
+3659 4289 1
+3659 4297 1
+3659 4411 1
+3659 4417 1
+3659 4424 1
+3659 8293 1
+3660 762 1
+3660 1157 1
+3660 1307 1
+3660 1385 1
+3660 1453 1
+3660 1769 1
+3660 1777 1
+3660 1990 1
+3660 2066 1
+3660 2252 1
+3660 2289 1
+3660 2508 1
+3660 2516 1
+3660 2535 1
+3660 2544 1
+3660 2565 1
+3660 2619 1
+3660 2653 1
+3660 2654 1
+3660 2696 1
+3660 2900 1
+3660 2923 1
+3660 2958 1
+3660 3002 1
+3660 3117 1
+3660 3144 1
+3660 3180 1
+3660 3260 1
+3660 3276 1
+3660 3291 1
+3660 3352 1
+3660 3394 1
+3660 3447 1
+3660 3463 1
+3660 3557 1
+3660 3562 1
+3660 3568 1
+3660 3607 1
+3660 3615 1
+3660 3631 1
+3660 3645 1
+3660 3646 1
+3660 3720 1
+3660 3724 1
+3660 3804 1
+3660 3806 1
+3660 3813 1
+3660 3854 1
+3660 3887 1
+3660 3967 1
+3660 4013 1
+3660 4021 1
+3660 4037 1
+3660 4051 1
+3660 4088 1
+3660 4110 1
+3660 4124 1
+3660 4138 1
+3660 4181 1
+3660 4191 1
+3660 4201 1
+3660 4234 1
+3660 4247 1
+3660 4256 1
+3660 4289 1
+3660 4297 1
+3660 4299 1
+3660 4349 1
+3660 4365 1
+3660 4373 1
+3660 4384 1
+3660 4422 1
+3660 4424 1
+3660 4453 1
+3660 4463 1
+3660 4485 1
+3660 4510 1
+3660 4528 1
+3660 4531 1
+3660 4820 1
+3660 4938 1
+3660 4953 1
+3660 4983 1
+3660 5092 1
+3660 5130 1
+3660 5132 1
+3660 8294 1
+3661 825 1
+3661 978 1
+3661 1453 1
+3661 1706 1
+3661 1729 1
+3661 2066 1
+3661 2134 1
+3661 2210 1
+3661 2328 1
+3661 2619 1
+3661 2746 1
+3661 2923 1
+3661 3007 1
+3661 3024 1
+3661 3026 1
+3661 3180 1
+3661 3192 1
+3661 3200 1
+3661 3260 1
+3661 3352 1
+3661 3463 1
+3661 3555 1
+3661 3562 1
+3661 3568 1
+3661 3615 1
+3661 3631 1
+3661 3812 1
+3661 3871 1
+3661 3903 1
+3661 3926 1
+3661 3937 1
+3661 3967 1
+3661 4043 1
+3661 4289 1
+3661 4359 1
+3661 4365 1
+3662 3352 1
+3662 4335 1
+3662 6299 1
+3662 6330 1
+3662 6334 1
+3662 6634 1
+3662 6914 1
+3662 7021 1
+3662 7512 1
+3662 7924 1
+3663 3352 1
+3664 3352 1
+3665 1385 1
+3665 1680 1
+3665 1982 1
+3665 2223 1
+3665 2535 1
+3665 2658 1
+3665 3028 1
+3665 3352 1
+3665 3459 1
+3665 3691 1
+3665 4507 1
+3665 4536 1
+3665 5233 1
+3665 5288 1
+3665 6330 1
+3665 6422 1
+3665 6790 1
+3665 6946 1
+3665 7553 1
+3665 8044 1
+3666 222 1
+3666 346 1
+3666 737 1
+3666 762 1
+3666 1159 1
+3666 1185 1
+3666 1247 1
+3666 1453 1
+3666 1548 1
+3666 1549 1
+3666 1648 1
+3666 1680 1
+3666 1729 1
+3666 1799 1
+3666 2134 1
+3666 2144 1
+3666 2210 1
+3666 2240 1
+3666 2252 1
+3666 2307 1
+3666 2326 1
+3666 2328 1
+3666 2369 1
+3666 2398 1
+3666 2456 1
+3666 2490 1
+3666 2506 1
+3666 2517 1
+3666 2535 1
+3666 2544 1
+3666 2655 1
+3666 2775 1
+3666 2831 1
+3666 2859 1
+3666 2871 1
+3666 2900 1
+3666 2932 1
+3666 2981 1
+3666 3024 1
+3666 3026 1
+3666 3089 1
+3666 3106 1
+3666 3180 1
+3666 3191 1
+3666 3192 1
+3666 3260 1
+3666 3274 1
+3666 3284 1
+3666 3352 1
+3666 3393 1
+3666 3394 1
+3666 3452 1
+3666 3454 1
+3666 3456 1
+3666 3460 1
+3666 3483 1
+3666 3554 1
+3666 3557 1
+3666 3562 1
+3666 3568 1
+3666 3586 1
+3666 3615 1
+3666 3660 1
+3666 3661 1
+3666 3812 1
+3666 3813 1
+3666 3843 1
+3666 3897 1
+3666 3910 1
+3666 3942 1
+3666 3946 1
+3666 3958 1
+3666 3976 1
+3666 4011 1
+3666 4037 1
+3666 4055 1
+3666 4078 1
+3666 4098 1
+3666 4099 1
+3666 4110 1
+3666 4124 1
+3666 4179 1
+3666 4191 1
+3666 4219 1
+3666 4256 1
+3666 4266 1
+3666 4272 1
+3666 4331 1
+3666 4384 1
+3666 4422 1
+3666 4448 1
+3666 4466 1
+3666 4530 1
+3666 4534 1
+3666 4536 1
+3666 4547 1
+3666 4600 1
+3666 4653 1
+3666 4661 1
+3666 4666 1
+3666 4712 1
+3666 4777 1
+3666 4780 1
+3666 4811 1
+3666 4814 1
+3666 4828 1
+3666 4899 1
+3666 4977 1
+3666 4986 1
+3666 5100 1
+3666 5130 1
+3666 5189 1
+3666 5233 1
+3666 5239 1
+3666 5288 1
+3666 5305 1
+3666 5323 1
+3666 5327 1
+3666 5335 1
+3666 5430 1
+3666 5445 1
+3666 5449 1
+3666 5459 1
+3666 5463 1
+3666 5484 1
+3666 5506 1
+3666 5509 1
+3666 5511 1
+3666 5568 1
+3666 5592 1
+3666 5650 1
+3666 5683 1
+3666 5694 1
+3666 5743 1
+3666 5790 1
+3666 5817 1
+3666 5828 1
+3666 5863 1
+3666 5936 1
+3666 5947 1
+3666 5994 1
+3666 6098 1
+3666 8294 1
+3666 8295 1
+3667 2066 1
+3667 3117 1
+3667 3276 1
+3667 3352 1
+3667 3971 1
+3667 4201 1
+3668 3669 1
+3673 2398 1
+3673 2510 1
+3673 4315 1
+3673 4547 1
+3673 5204 1
+3674 2747 1
+3674 3557 1
+3675 2747 1
+3676 2747 1
+3677 1305 1
+3677 2747 1
+3678 1777 1
+3678 1915 1
+3678 1935 1
+3678 2114 1
+3678 2565 1
+3678 2686 1
+3678 2727 1
+3678 2923 1
+3678 3059 1
+3678 3404 1
+3678 3480 1
+3678 3483 1
+3678 3680 1
+3678 3822 1
+3678 3847 1
+3678 3856 1
+3678 3871 1
+3681 2654 1
+3682 778 1
+3682 825 1
+3682 827 1
+3682 1140 1
+3682 1157 1
+3682 1239 1
+3682 1307 1
+3682 1453 1
+3682 1549 1
+3682 1744 1
+3682 1777 1
+3682 1915 1
+3682 1935 1
+3682 2066 1
+3682 2114 1
+3682 2328 1
+3682 2433 1
+3682 2508 1
+3682 2565 1
+3682 2619 1
+3682 2653 1
+3682 2655 1
+3682 2657 1
+3682 2686 1
+3682 2859 1
+3682 2900 1
+3682 2981 1
+3682 3024 1
+3682 3180 1
+3682 3260 1
+3682 3276 1
+3682 3291 1
+3682 3394 1
+3682 3404 1
+3682 3463 1
+3682 3483 1
+3682 3541 1
+3682 3562 1
+3682 3681 1
+3682 3769 1
+3682 3772 1
+3682 3787 1
+3682 3800 1
+3682 3803 1
+3682 3806 1
+3682 3813 1
+3682 3816 1
+3682 3847 1
+3682 3871 1
+3682 3887 1
+3682 3898 1
+3682 3926 1
+3682 3933 1
+3682 3937 1
+3682 3942 1
+3682 3946 1
+3682 3967 1
+3682 3970 1
+3682 3980 1
+3682 4024 1
+3682 4088 1
+3682 4110 1
+3682 4162 1
+3682 4173 1
+3682 4181 1
+3682 4201 1
+3682 4233 1
+3682 4247 1
+3682 4256 1
+3682 4269 1
+3682 4289 1
+3682 4323 1
+3682 4331 1
+3682 4351 1
+3682 4373 1
+3683 2398 1
+3683 2654 1
+3683 4037 1
+3683 4884 1
+3683 5246 1
+3683 7478 1
+3684 2654 1
+3685 2237 1
+3685 2654 1
+3686 2384 1
+3686 2654 1
+3686 3871 1
+3692 72 1
+3692 1473 1
+3692 2398 1
+3692 2654 1
+3692 4338 1
+3692 5423 1
+3692 5452 1
+3692 5484 1
+3687 2654 1
+3688 15 1
+3688 1385 1
+3688 2289 1
+3688 2654 1
+3689 2654 1
+3689 3352 1
+3690 2654 1
+3691 1140 1
+3691 1191 1
+3691 1307 1
+3691 1473 1
+3691 1799 1
+3691 2289 1
+3691 2398 1
+3691 2654 1
+3691 2658 1
+3691 2689 1
+3691 2822 1
+3691 3106 1
+3691 3238 1
+3691 3301 1
+3691 3352 1
+3691 3394 1
+3691 3452 1
+3691 3456 1
+3691 3480 1
+3691 3537 1
+3691 3557 1
+3691 3568 1
+3691 3615 1
+3691 3634 1
+3691 3769 1
+3691 3792 1
+3691 3832 1
+3691 3847 1
+3691 3885 1
+3691 3969 1
+3691 4011 1
+3691 4037 1
+3691 4044 1
+3691 4124 1
+3691 4191 1
+3691 4201 1
+3691 4218 1
+3691 4233 1
+3691 4234 1
+3691 4310 1
+3691 4335 1
+3691 4359 1
+3691 4424 1
+3691 4448 1
+3691 4481 1
+3691 4820 1
+3691 4944 1
+3691 5020 1
+3691 5141 1
+3691 5208 1
+3691 5271 1
+3691 5288 1
+3691 5295 1
+3691 5298 1
+3691 5335 1
+3691 5404 1
+3691 5449 1
+3691 5459 1
+3691 5481 1
+3691 5513 1
+3691 5529 1
+3691 5568 1
+3691 5739 1
+3691 5760 1
+3691 5800 1
+3691 5835 1
+3691 5902 1
+3691 5963 1
+3691 6032 1
+3691 6305 1
+3691 6498 1
+3691 6665 1
+3691 6833 1
+3691 6897 1
+3691 6917 1
+3691 6934 1
+3691 6938 1
+3691 6945 1
+3691 7042 1
+3691 7047 1
+3691 7054 1
+3691 7110 1
+3691 7161 1
+3691 7186 1
+3691 7306 1
+3691 7378 1
+3691 7387 1
+3691 7422 1
+3691 7423 1
+3691 7440 1
+3691 7450 1
+3691 7497 1
+3691 7587 1
+3691 7632 1
+3691 7809 1
+3693 2654 1
+3694 2654 1
+3695 2654 1
+3696 2654 1
+3697 2654 1
+3698 2654 1
+3700 3645 1
+3700 3701 1
+3702 1744 1
+3703 1744 1
+3704 1744 1
+3705 1549 1
+3705 1744 1
+3705 3804 1
+3706 1744 1
+3707 1744 1
+3709 465 1
+3709 1990 1
+3709 2585 1
+3709 3026 1
+3709 3404 1
+3709 4037 1
+3709 6595 1
+2067 3114 1
+2067 6914 1
+2067 7763 1
+3711 3713 1
+3712 3713 1
+3714 1239 1
+3714 2066 1
+3714 2384 1
+3714 2653 1
+3714 2859 1
+3714 2958 1
+3714 3010 1
+3714 3258 1
+3714 3562 1
+3714 4043 1
+3714 4055 1
+3714 4058 1
+3714 4162 1
+3714 4179 1
+3714 8294 1
+3715 3010 1
+3717 3010 1
+3718 3005 1
+3719 1549 1
+3719 2958 1
+3719 3005 1
+3719 3117 1
+3719 3260 1
+3719 3394 1
+3719 3541 1
+3719 3562 1
+3719 3645 1
+3719 4013 1
+3719 4021 1
+3719 4191 1
+3719 4290 1
+3719 4299 1
+3723 762 1
+3723 1297 1
+3723 2508 1
+3723 3459 1
+3723 5412 1
+3723 7587 1
+3723 7632 1
+3724 465 1
+3724 608 1
+3724 825 1
+3724 978 1
+3724 1140 1
+3724 1239 1
+3724 1297 1
+3724 1307 1
+3724 1385 1
+3724 1453 1
+3724 1729 1
+3724 1990 1
+3724 2066 1
+3724 2134 1
+3724 2210 1
+3724 2289 1
+3724 2328 1
+3724 2508 1
+3724 2516 1
+3724 2544 1
+3724 2565 1
+3724 2585 1
+3724 2595 1
+3724 2612 1
+3724 2646 1
+3724 2653 1
+3724 2746 1
+3724 2859 1
+3724 2900 1
+3724 2932 1
+3724 2958 1
+3724 2981 1
+3724 3026 1
+3724 3059 1
+3724 3117 1
+3724 3125 1
+3724 3144 1
+3724 3192 1
+3724 3258 1
+3724 3291 1
+3724 3313 1
+3724 3346 1
+3724 3439 1
+3724 3483 1
+3724 3555 1
+3724 3562 1
+3724 3568 1
+3724 3615 1
+3724 3645 1
+3724 3660 1
+3724 3661 1
+3724 3787 1
+3724 3800 1
+3724 3816 1
+3724 3867 1
+3724 3914 1
+3724 3926 1
+3724 3933 1
+3724 3937 1
+3724 3946 1
+3724 4013 1
+3724 4021 1
+3724 4024 1
+3724 4031 1
+3724 4043 1
+3724 4051 1
+3724 4055 1
+3724 4110 1
+3724 4138 1
+3724 4162 1
+3724 4179 1
+3724 4181 1
+3724 4183 1
+3724 4201 1
+3724 4233 1
+3724 4234 1
+3724 4247 1
+3724 4254 1
+3724 4256 1
+3724 4263 1
+3724 4269 1
+3724 4289 1
+3724 4299 1
+3724 4349 1
+3724 4373 1
+3724 4384 1
+3724 4412 1
+3724 4422 1
+3724 4424 1
+3724 4463 1
+3724 4480 1
+3724 4485 1
+3724 4510 1
+3722 1297 1
+3722 5773 1
+3733 1297 1
+3571 15 1
+3571 1297 1
+3571 1403 1
+3571 1453 1
+3571 1688 1
+3571 2328 1
+3571 2398 1
+3571 2485 1
+3571 2653 1
+3571 2851 1
+3571 2871 1
+3571 2981 1
+3571 3059 1
+3571 3144 1
+3571 3586 1
+3571 3634 1
+3571 3643 1
+3571 3897 1
+3571 3926 1
+3571 4289 1
+3571 4310 1
+3571 4335 1
+3571 4463 1
+3571 5028 1
+3571 5103 1
+3571 5106 1
+3571 5210 1
+3571 5288 1
+3571 5799 1
+3571 5801 1
+3571 5814 1
+3571 5818 1
+3571 5872 1
+3571 5922 1
+3571 5925 1
+3571 6044 1
+3571 6227 1
+3571 6327 1
+3571 6875 1
+3571 6976 1
+3571 6979 1
+3571 7233 1
+3571 7553 1
+3571 7809 1
+3571 7908 1
+3725 1297 1
+3725 2411 1
+3725 2657 1
+3725 4528 1
+3726 1297 1
+3726 2655 1
+3726 3092 1
+3727 1297 1
+3728 15 1
+3728 737 1
+3728 762 1
+3728 1024 1
+3728 1297 1
+3728 1307 1
+3728 1385 1
+3728 1453 1
+3728 1473 1
+3728 1549 1
+3728 2001 1
+3728 2066 1
+3728 2398 1
+3728 2506 1
+3728 2508 1
+3728 2516 1
+3728 2774 1
+3728 2785 1
+3728 2909 1
+3728 2917 1
+3728 3034 1
+3728 3089 1
+3728 3106 1
+3728 3192 1
+3728 3276 1
+3728 3352 1
+3728 3456 1
+3728 3458 1
+3728 3720 1
+3728 3724 1
+3728 3843 1
+3728 3887 1
+3728 3946 1
+3728 3976 1
+3728 4037 1
+3728 4099 1
+3728 4110 1
+3728 4175 1
+3728 4201 1
+3728 4220 1
+3728 4261 1
+3728 4289 1
+3728 4335 1
+3728 4349 1
+3728 4400 1
+3728 4417 1
+3728 4463 1
+3728 4480 1
+3728 4536 1
+3728 4587 1
+3728 4600 1
+3728 4709 1
+3728 4712 1
+3728 4719 1
+3728 4735 1
+3728 4777 1
+3728 4797 1
+3728 4808 1
+3728 4875 1
+3728 4977 1
+3728 4983 1
+3728 5020 1
+3728 5083 1
+3728 5100 1
+3728 5176 1
+3728 5233 1
+3728 5327 1
+3728 5341 1
+3728 5412 1
+3728 5417 1
+3728 5430 1
+3728 5449 1
+3728 5506 1
+3728 5524 1
+3728 5775 1
+3728 5780 1
+3728 5828 1
+3728 5936 1
+3728 5994 1
+3728 6347 1
+3728 7855 1
+3728 7912 1
+3728 8294 1
+3728 8295 1
+3728 8296 1
+3729 1297 1
+3729 1307 1
+3729 1990 1
+3729 2066 1
+3729 2328 1
+3729 2775 1
+3729 2790 1
+3729 3562 1
+3729 4191 1
+3729 4811 1
+3729 5484 1
+3735 1297 1
+3735 1549 1
+3735 2210 1
+3730 1297 1
+3731 1297 1
+3731 1915 1
+3731 2411 1
+3731 2727 1
+3731 2974 1
+3731 3200 1
+3731 3480 1
+3731 3557 1
+3731 3646 1
+3731 3803 1
+3731 3804 1
+3731 3807 1
+3731 3822 1
+3731 4453 1
+3731 4480 1
+3742 1100 1
+3742 3443 1
+3742 3976 1
+3743 737 1
+3743 1100 1
+3743 1385 1
+3743 3443 1
+3743 3456 1
+3743 4297 1
+3743 4796 1
+3743 4962 1
+3743 5123 1
+3743 5133 1
+3744 3024 1
+3744 3745 1
+3746 2485 1
+3747 2485 1
+3747 3334 1
+3747 5790 1
+3747 6737 1
+3748 1688 1
+3748 2289 1
+3748 2354 1
+3748 2485 1
+3748 2516 1
+3748 2653 1
+3748 2696 1
+3748 2790 1
+3748 2871 1
+3748 2958 1
+3748 3026 1
+3748 3059 1
+3748 3192 1
+3748 3452 1
+3748 3456 1
+3748 3537 1
+3748 3796 1
+3748 3812 1
+3748 3854 1
+3748 4072 1
+3748 4124 1
+3748 4256 1
+3748 4261 1
+3748 4299 1
+3748 4557 1
+3748 4653 1
+3748 4677 1
+3748 4712 1
+3748 5026 1
+3748 5848 1
+3749 737 1
+3749 2485 1
+3749 2871 1
+3749 4037 1
+3750 2485 1
+3750 3007 1
+3751 15 1
+3751 2485 1
+3751 2619 1
+3751 3028 1
+3751 3946 1
+3751 4310 1
+3751 5178 1
+3751 5210 1
+3751 6337 1
+3751 8037 1
+3751 8295 1
+3752 2328 1
+3752 2485 1
+3752 2619 1
+3752 2871 1
+3752 3615 1
+3752 3962 1
+3752 4179 1
+3752 5412 1
+3752 5605 1
+3752 6241 1
+3752 7063 1
+3752 7662 1
+3752 7908 1
+3752 8073 1
+3752 8192 1
+3753 2485 1
+3754 2485 1
+3754 2565 1
+3754 2657 1
+3754 3026 1
+3754 3059 1
+3754 3800 1
+3679 2657 1
+3679 5886 1
+3757 2657 1
+3720 825 1
+3720 2066 1
+3720 2210 1
+3720 2657 1
+3720 3260 1
+3720 3562 1
+3720 3568 1
+3720 3615 1
+3720 4030 1
+3720 4183 1
+3720 8294 1
+3758 2657 1
+3759 2657 1
+3760 2657 1
+3761 2535 1
+3761 2657 1
+3762 2657 1
+3762 2900 1
+3762 2923 1
+3762 3394 1
+3762 3912 1
+3762 4323 1
+3762 4453 1
+3762 5288 1
+3763 2657 1
+3763 3452 1
+3763 3933 1
+3764 1549 1
+3764 2657 1
+3764 3769 1
+3764 5807 1
+3764 5922 1
+3764 6330 1
+3764 6790 1
+3764 6953 1
+3764 6955 1
+3764 6979 1
+3765 2411 1
+3766 2411 1
+3766 2790 1
+3766 3028 1
+3766 3034 1
+3766 3271 1
+3766 3453 1
+3766 3480 1
+3766 4646 1
+3766 4735 1
+3767 1385 1
+3767 2066 1
+3767 2210 1
+3767 2411 1
+3767 2565 1
+3767 3117 1
+3767 3192 1
+3767 3394 1
+3767 4110 1
+3767 4173 1
+3767 4384 1
+3767 4385 1
+3767 4403 1
+3767 4510 1
+3767 4529 1
+3767 8293 1
+3770 1403 1
+3770 1549 1
+3770 2210 1
+3770 2535 1
+3770 2746 1
+3770 2851 1
+3770 3180 1
+3770 3346 1
+3770 3769 1
+3770 3800 1
+3770 3808 1
+3770 4037 1
+3770 5432 1
+3770 5582 1
+3770 6503 1
+3770 6560 1
+3770 6736 1
+3770 6784 1
+3770 7214 1
+3770 7222 1
+3770 7295 1
+3770 7946 1
+3772 6930 1
+3771 3480 1
+3771 3643 1
+3771 3772 1
+3774 3776 1
+3775 2923 1
+3775 2958 1
+3775 3024 1
+3775 3180 1
+3775 3394 1
+3775 3720 1
+3775 3776 1
+3775 3970 1
+3775 3974 1
+3775 4218 1
+3775 6979 1
+3775 8294 1
+3777 1385 1
+3777 3568 1
+3777 3646 1
+3777 4297 1
+3777 4373 1
+3777 4384 1
+3777 4402 1
+3777 4413 1
+3777 4417 1
+3777 4424 1
+3777 5239 1
+3779 1024 1
+3779 3480 1
+3780 3480 1
+3780 3887 1
+3780 4110 1
+3781 3480 1
+3782 762 1
+3782 3480 1
+3782 4256 1
+3784 3480 1
+3783 3480 1
+3785 737 1
+3785 2398 1
+3785 2411 1
+3785 2565 1
+3785 2958 1
+3785 2981 1
+3785 3026 1
+3785 3276 1
+3785 3483 1
+3785 3562 1
+3785 4179 1
+3785 4189 1
+3785 4199 1
+3785 4666 1
+3785 4846 1
+3785 5200 1
+3785 5484 1
+3785 5693 1
+3786 15 1
+3786 608 1
+3786 737 1
+3786 825 1
+3786 1159 1
+3786 1453 1
+3786 1549 1
+3786 1777 1
+3786 2001 1
+3786 2066 1
+3786 2252 1
+3786 2258 1
+3786 2273 1
+3786 2277 1
+3786 2354 1
+3786 2398 1
+3786 2535 1
+3786 2576 1
+3786 2605 1
+3786 2746 1
+3786 2774 1
+3786 2958 1
+3786 3089 1
+3786 3260 1
+3786 3334 1
+3786 3456 1
+3786 3541 1
+3786 3562 1
+3786 3631 1
+3786 3897 1
+3786 3910 1
+3786 3946 1
+3786 3958 1
+3786 3967 1
+3786 4013 1
+3786 4037 1
+3786 4098 1
+3786 4127 1
+3786 4173 1
+3786 4191 1
+3786 4201 1
+3786 4310 1
+3786 4335 1
+3786 4530 1
+3786 4536 1
+3786 4574 1
+3786 4666 1
+3786 4712 1
+3786 4777 1
+3786 4795 1
+3786 4797 1
+3786 4964 1
+3786 5002 1
+3786 5020 1
+3786 5072 1
+3786 5155 1
+3786 5253 1
+3786 5254 1
+3786 5285 1
+3786 5288 1
+3786 5321 1
+3786 5341 1
+3786 5412 1
+3786 5423 1
+3786 5445 1
+3786 5452 1
+3786 5454 1
+3786 5463 1
+3786 5503 1
+3786 5514 1
+3786 5533 1
+3786 5545 1
+3786 5559 1
+3786 5624 1
+3786 5630 1
+3786 5651 1
+3786 5663 1
+3786 5683 1
+3786 5705 1
+3786 5721 1
+3786 5737 1
+3786 5760 1
+3786 5778 1
+3786 5780 1
+3786 5790 1
+3786 5828 1
+3786 5863 1
+3786 5936 1
+3786 5963 1
+3786 5973 1
+3786 6262 1
+3786 6311 1
+3786 6337 1
+3786 6567 1
+3786 6833 1
+3786 7632 1
+3786 8134 1
+3786 8293 1
+3786 8295 1
+2975 2974 1
+2975 3541 1
+3791 2974 1
+3787 15 1
+3787 72 1
+3787 155 1
+3787 346 1
+3787 737 1
+3787 762 1
+3787 1185 1
+3787 1305 1
+3787 1310 1
+3787 1360 1
+3787 1549 1
+3787 1680 1
+3787 1799 1
+3787 1982 1
+3787 2014 1
+3787 2129 1
+3787 2134 1
+3787 2145 1
+3787 2237 1
+3787 2252 1
+3787 2258 1
+3787 2326 1
+3787 2328 1
+3787 2354 1
+3787 2369 1
+3787 2398 1
+3787 2456 1
+3787 2506 1
+3787 2516 1
+3787 2517 1
+3787 2535 1
+3787 2565 1
+3787 2612 1
+3787 2619 1
+3787 2653 1
+3787 2658 1
+3787 2696 1
+3787 2727 1
+3787 2774 1
+3787 2785 1
+3787 2790 1
+3787 2871 1
+3787 2909 1
+3787 2958 1
+3787 3007 1
+3787 3014 1
+3787 3034 1
+3787 3073 1
+3787 3084 1
+3787 3089 1
+3787 3140 1
+3787 3191 1
+3787 3192 1
+3787 3260 1
+3787 3276 1
+3787 3291 1
+3787 3309 1
+3787 3321 1
+3787 3334 1
+3787 3346 1
+3787 3352 1
+3787 3393 1
+3787 3394 1
+3787 3439 1
+3787 3443 1
+3787 3454 1
+3787 3455 1
+3787 3456 1
+3787 3459 1
+3787 3460 1
+3787 3479 1
+3787 3537 1
+3787 3554 1
+3787 3557 1
+3787 3568 1
+3787 3631 1
+3787 3724 1
+3787 3748 1
+3787 3796 1
+3787 3813 1
+3787 3885 1
+3787 3897 1
+3787 3910 1
+3787 3958 1
+3787 3976 1
+3787 4011 1
+3787 4037 1
+3787 4040 1
+3787 4055 1
+3787 4099 1
+3787 4103 1
+3787 4124 1
+3787 4191 1
+3787 4247 1
+3787 4263 1
+3787 4266 1
+3787 4290 1
+3787 4315 1
+3787 4335 1
+3787 4349 1
+3787 4361 1
+3787 4365 1
+3787 4384 1
+3787 4400 1
+3787 4483 1
+3787 4530 1
+3787 4536 1
+3787 4551 1
+3787 4578 1
+3787 4613 1
+3787 4661 1
+3787 4666 1
+3787 4712 1
+3787 4713 1
+3787 4715 1
+3787 4735 1
+3787 4776 1
+3787 4777 1
+3787 4796 1
+3787 4797 1
+3787 4808 1
+3787 4811 1
+3787 4814 1
+3787 4820 1
+3787 4827 1
+3787 4828 1
+3787 4846 1
+3787 4875 1
+3787 4942 1
+3787 4953 1
+3787 4962 1
+3787 4977 1
+3787 4980 1
+3787 4999 1
+3787 5002 1
+3787 5022 1
+3787 5028 1
+3787 5055 1
+3787 5083 1
+3787 5148 1
+3787 5162 1
+3787 5233 1
+3787 5254 1
+3787 5263 1
+3787 5288 1
+3787 5305 1
+3787 5321 1
+3787 5327 1
+3787 5378 1
+3787 5392 1
+3787 5412 1
+3787 5415 1
+3787 5445 1
+3787 5449 1
+3787 5452 1
+3787 5454 1
+3787 5457 1
+3787 5482 1
+3787 5484 1
+3787 5529 1
+3787 5568 1
+3787 5582 1
+3787 5683 1
+3787 5684 1
+3787 5760 1
+3787 5784 1
+3787 5790 1
+3787 5798 1
+3787 5800 1
+3787 5804 1
+3787 5811 1
+3787 5814 1
+3787 5817 1
+3787 5828 1
+3787 5863 1
+3787 5902 1
+3787 5936 1
+3787 5963 1
+3787 5973 1
+3787 5994 1
+3787 6044 1
+3787 6156 1
+3787 6246 1
+3787 6251 1
+3787 6255 1
+3787 6262 1
+3787 6305 1
+3787 6306 1
+3787 6320 1
+3787 6328 1
+3787 6347 1
+3787 6388 1
+3787 6400 1
+3787 6560 1
+3787 6613 1
+3787 6634 1
+3787 6720 1
+3787 6934 1
+3787 6948 1
+3787 6979 1
+3787 7047 1
+3787 7054 1
+3787 7225 1
+3787 7277 1
+3787 7280 1
+3787 7378 1
+3787 7391 1
+3787 7422 1
+3787 7478 1
+3787 7497 1
+3787 7517 1
+3787 7529 1
+3787 7544 1
+3787 7553 1
+3787 7587 1
+3787 7620 1
+3787 7632 1
+3787 7699 1
+3787 7726 1
+3787 7788 1
+3787 7810 1
+3787 7899 1
+3787 7908 1
+3787 8083 1
+3787 8122 1
+3787 8124 1
+3787 8134 1
+3787 8141 1
+3787 8219 1
+3787 8224 1
+3787 8237 1
+3787 8295 1
+3792 72 1
+3792 762 1
+3792 2516 1
+3792 2727 1
+3792 3034 1
+3792 3238 1
+3792 3276 1
+3792 3456 1
+3792 4335 1
+3792 4578 1
+3792 4717 1
+3792 4828 1
+3792 4938 1
+3792 4999 1
+3792 5083 1
+3792 5215 1
+3792 5295 1
+3792 5484 1
+3792 5509 1
+3792 5714 1
+3792 6296 1
+3792 6305 1
+3792 6337 1
+3792 6347 1
+3792 6832 1
+3792 7073 1
+3792 8297 1
+3796 737 1
+3796 762 1
+3796 1648 1
+3796 1688 1
+3796 1733 1
+3796 1769 1
+3796 2144 1
+3796 2145 1
+3796 2237 1
+3796 2364 1
+3796 2381 1
+3796 2398 1
+3796 2516 1
+3796 2576 1
+3796 2592 1
+3796 2760 1
+3796 2775 1
+3796 2787 1
+3796 2811 1
+3796 2871 1
+3796 3002 1
+3796 3014 1
+3796 3034 1
+3796 3092 1
+3796 3274 1
+3796 3276 1
+3796 3284 1
+3796 3321 1
+3796 3352 1
+3796 3433 1
+3796 3447 1
+3796 3452 1
+3796 3453 1
+3796 3537 1
+3796 3568 1
+3796 3607 1
+3796 3615 1
+3796 3635 1
+3796 3664 1
+3796 3691 1
+3796 3724 1
+3796 3748 1
+3796 3755 1
+3796 3797 1
+3796 3813 1
+3796 3843 1
+3796 3854 1
+3796 3976 1
+3796 4040 1
+3796 4099 1
+3796 4124 1
+3796 4127 1
+3796 4191 1
+3796 4212 1
+3796 4261 1
+3796 4266 1
+3796 4297 1
+3796 4335 1
+3796 4482 1
+3796 4528 1
+3796 4531 1
+3796 4534 1
+3796 4547 1
+3796 4562 1
+3796 4574 1
+3796 4578 1
+3796 4587 1
+3796 4613 1
+3796 4653 1
+3796 4661 1
+3796 4666 1
+3796 4719 1
+3796 4735 1
+3796 4778 1
+3796 4792 1
+3796 4796 1
+3796 4814 1
+3796 4824 1
+3796 4827 1
+3796 4899 1
+3796 5020 1
+3796 5026 1
+3796 5055 1
+3796 5058 1
+3796 5061 1
+3796 5072 1
+3796 5073 1
+3796 5083 1
+3796 5092 1
+3796 5100 1
+3796 5106 1
+3796 5123 1
+3796 5130 1
+3796 5144 1
+3796 5182 1
+3796 5204 1
+3796 5226 1
+3796 5239 1
+3796 5301 1
+3796 5459 1
+3796 5683 1
+3796 5693 1
+3796 5737 1
+3796 5743 1
+3796 5775 1
+3796 5780 1
+3796 5828 1
+3796 5844 1
+3796 5848 1
+3796 5886 1
+3796 5891 1
+3796 5947 1
+3796 5963 1
+3795 3797 1
+3794 15 1
+3794 72 1
+3794 737 1
+3794 1769 1
+3794 2129 1
+3794 2237 1
+3794 2354 1
+3794 2456 1
+3794 2565 1
+3794 2592 1
+3794 2612 1
+3794 2696 1
+3794 3092 1
+3794 3284 1
+3794 3433 1
+3794 3443 1
+3794 3453 1
+3794 3537 1
+3794 3568 1
+3794 3748 1
+3794 3796 1
+3794 3797 1
+3794 3854 1
+3794 4189 1
+3794 4191 1
+3794 4247 1
+3794 4297 1
+3794 4335 1
+3794 4338 1
+3794 4361 1
+3794 4653 1
+3794 4712 1
+3794 4938 1
+3794 4953 1
+3794 5026 1
+3794 5072 1
+3794 5392 1
+3794 5423 1
+3794 5484 1
+3794 5511 1
+3794 5753 1
+3794 5818 1
+3794 5848 1
+3794 6148 1
+3794 6347 1
+3794 6832 1
+3798 465 1
+3798 825 1
+3798 1239 1
+3798 1688 1
+3798 2066 1
+3798 2210 1
+3798 2328 1
+3798 2508 1
+3798 2535 1
+3798 2859 1
+3798 3007 1
+3798 3028 1
+3798 3117 1
+3798 3180 1
+3798 3260 1
+3798 3586 1
+3798 3887 1
+3798 3969 1
+3798 4051 1
+3798 4485 1
+3798 5155 1
+3798 5178 1
+3798 6875 1
+3799 465 1
+3799 2585 1
+3799 3007 1
+3799 3028 1
+3799 3892 1
+3799 3903 1
+3800 3028 1
+3800 3454 1
+3800 3568 1
+3803 1060 1
+3803 1769 1
+3803 3748 1
+3803 4212 1
+3803 4551 1
+3803 4792 1
+3803 4797 1
+3803 4962 1
+3803 7101 1
+3803 7115 1
+3801 3803 1
+3802 465 1
+3802 3024 1
+3802 3084 1
+3802 3803 1
+3802 3892 1
+3802 3922 1
+3802 3926 1
+3802 3937 1
+3804 2066 1
+3804 2506 1
+3804 4021 1
+3804 4201 1
+3804 8294 1
+3805 3807 1
+3806 15 1
+3806 465 1
+3806 608 1
+3806 1473 1
+3806 1548 1
+3806 2134 1
+3806 2398 1
+3806 2565 1
+3806 2612 1
+3806 2775 1
+3806 2790 1
+3806 2871 1
+3806 3024 1
+3806 3144 1
+3806 3192 1
+3806 3291 1
+3806 3352 1
+3806 3447 1
+3806 3458 1
+3806 3554 1
+3806 3643 1
+3806 3807 1
+3806 3835 1
+3806 4041 1
+3806 4098 1
+3806 4138 1
+3806 4191 1
+3806 4263 1
+3806 4290 1
+3806 4299 1
+3806 4417 1
+3806 4463 1
+3806 4964 1
+3806 5072 1
+3806 5123 1
+3806 5327 1
+3806 5392 1
+3806 5423 1
+3806 5484 1
+3806 5511 1
+3806 5543 1
+3806 5639 1
+3806 5814 1
+3806 6566 1
+3806 6606 1
+3809 6634 1
+3809 8042 1
+3810 3811 1
+3812 15 1
+3812 825 1
+3812 1307 1
+3812 2145 1
+3812 2506 1
+3812 2595 1
+3812 2655 1
+3812 2746 1
+3812 2811 1
+3812 2822 1
+3812 2871 1
+3812 2909 1
+3812 2958 1
+3812 2981 1
+3812 3014 1
+3812 3024 1
+3812 3089 1
+3812 3125 1
+3812 3180 1
+3812 3258 1
+3812 3320 1
+3812 3352 1
+3812 3417 1
+3812 3717 1
+3812 3720 1
+3812 3816 1
+3812 3967 1
+3812 3976 1
+3812 4011 1
+3812 4012 1
+3812 4021 1
+3812 4024 1
+3812 4031 1
+3812 4043 1
+3812 4049 1
+3812 4051 1
+3812 4072 1
+3812 4088 1
+3812 4117 1
+3812 4448 1
+3812 4468 1
+3812 4578 1
+3812 4587 1
+3812 4600 1
+3812 4735 1
+3812 4811 1
+3812 5684 1
+3812 6337 1
+3812 6759 1
+3812 6946 1
+3812 8042 1
+3812 8293 1
+3812 8294 1
+3813 15 1
+3813 737 1
+3813 896 1
+3813 1307 1
+3813 2134 1
+3813 2258 1
+3813 2289 1
+3813 2381 1
+3813 2398 1
+3813 2516 1
+3813 2565 1
+3813 2605 1
+3813 2646 1
+3813 2653 1
+3813 2775 1
+3813 2831 1
+3813 3144 1
+3813 3192 1
+3813 3276 1
+3813 3313 1
+3813 3334 1
+3813 3346 1
+3813 3352 1
+3813 3394 1
+3813 3456 1
+3813 3537 1
+3813 3562 1
+3813 3568 1
+3813 3615 1
+3813 3645 1
+3813 3660 1
+3813 3661 1
+3813 3717 1
+3813 3724 1
+3813 3816 1
+3813 3873 1
+3813 3962 1
+3813 4012 1
+3813 4024 1
+3813 4031 1
+3813 4037 1
+3813 4055 1
+3813 4088 1
+3813 4138 1
+3813 4162 1
+3813 4179 1
+3813 4191 1
+3813 4256 1
+3813 4263 1
+3813 4269 1
+3813 4323 1
+3813 4335 1
+3813 4349 1
+3813 4359 1
+3813 4384 1
+3813 4424 1
+3813 4463 1
+3813 4480 1
+3813 4534 1
+3813 4536 1
+3813 4797 1
+3813 4964 1
+3813 5079 1
+3813 5106 1
+3813 5115 1
+3813 5132 1
+3813 5133 1
+3813 5146 1
+3813 5254 1
+3813 5404 1
+3813 5445 1
+3813 5454 1
+3813 5459 1
+3813 5527 1
+3813 5592 1
+3813 5683 1
+3813 5721 1
+3813 5739 1
+3813 5743 1
+3813 5780 1
+3813 5863 1
+3813 5882 1
+3813 5922 1
+3813 5963 1
+3813 6123 1
+3813 6156 1
+3813 6762 1
+3813 6832 1
+3813 6833 1
+3813 6914 1
+3813 7168 1
+3813 7632 1
+3813 7839 1
+3813 8294 1
+3814 825 1
+3814 1239 1
+3814 1307 1
+3814 2210 1
+3814 2252 1
+3814 2506 1
+3814 2653 1
+3814 2746 1
+3814 2859 1
+3814 2958 1
+3814 2981 1
+3814 3125 1
+3814 3144 1
+3814 3180 1
+3814 3258 1
+3814 3260 1
+3814 3313 1
+3814 3320 1
+3814 3346 1
+3814 3568 1
+3814 3615 1
+3814 3720 1
+3814 3800 1
+3814 3816 1
+3814 3822 1
+3814 3843 1
+3814 3967 1
+3814 4021 1
+3814 4024 1
+3814 4030 1
+3814 4031 1
+3814 4043 1
+3814 4051 1
+3814 4055 1
+3814 4088 1
+3814 4103 1
+3814 4110 1
+3814 4162 1
+3814 4173 1
+3814 4181 1
+3814 4269 1
+3814 4299 1
+3814 4386 1
+3814 4402 1
+3814 6624 1
+3814 8293 1
+3814 8294 1
+3815 465 1
+3815 2014 1
+3815 2114 1
+3815 2210 1
+3815 2276 1
+3815 2506 1
+3815 2544 1
+3815 2595 1
+3815 2655 1
+3815 3024 1
+3815 3260 1
+3815 3717 1
+3815 3812 1
+3815 3816 1
+3815 3922 1
+3815 4011 1
+3815 4021 1
+3815 4024 1
+3815 5721 1
+3815 5732 1
+3817 3200 1
+3823 3541 1
+3823 4735 1
+3824 3541 1
+3827 2900 1
+3827 4110 1
+3829 1935 1
+3830 15 1
+3830 737 1
+3830 1549 1
+3830 1935 1
+3830 2240 1
+3830 2516 1
+3830 2565 1
+3830 3014 1
+3830 3321 1
+3830 3456 1
+3830 3911 1
+3830 4191 1
+3830 4735 1
+3830 4796 1
+3830 5073 1
+3830 5100 1
+3830 5412 1
+3830 5463 1
+3830 5479 1
+3830 6098 1
+3821 1935 1
+3821 3007 1
+3832 1935 1
+3833 1935 1
+3833 2923 1
+3833 3892 1
+3834 2114 1
+3835 346 1
+3835 1799 1
+3835 2114 1
+3835 2354 1
+3835 2398 1
+3835 2456 1
+3835 3321 1
+3835 3334 1
+3835 3970 1
+3835 4037 1
+3835 4040 1
+3835 4044 1
+3835 4266 1
+3835 4335 1
+3835 4466 1
+3835 4588 1
+3835 4661 1
+3835 4706 1
+3835 4712 1
+3835 4795 1
+3835 4796 1
+3835 4797 1
+3835 4808 1
+3835 4814 1
+3835 4827 1
+3835 4962 1
+3835 5020 1
+3835 5335 1
+3835 5341 1
+3835 5430 1
+3835 5449 1
+3835 5454 1
+3835 5650 1
+3835 5922 1
+3835 6532 1
+3836 2114 1
+3837 2114 1
+3841 2923 1
+3839 2328 1
+3839 2544 1
+3839 2923 1
+3839 3014 1
+3839 3562 1
+3840 2923 1
+3842 608 1
+3842 778 1
+3842 1453 1
+3842 2508 1
+3842 2619 1
+3842 2923 1
+3842 3007 1
+3842 3024 1
+3842 3260 1
+3842 3404 1
+3842 3812 1
+3842 3926 1
+3842 3937 1
+3842 3946 1
+3842 3970 1
+3843 762 1
+3843 2565 1
+3843 3276 1
+3843 3443 1
+3843 3453 1
+3843 3455 1
+3843 3458 1
+3843 3847 1
+3843 3958 1
+3843 4266 1
+3843 4335 1
+3843 4448 1
+3843 4620 1
+3843 4792 1
+3843 4811 1
+3843 4820 1
+3843 5043 1
+3843 5058 1
+3844 3847 1
+3845 3554 1
+3845 3847 1
+3845 3887 1
+3845 4011 1
+3845 4315 1
+3845 4712 1
+3845 4824 1
+3845 5288 1
+3848 3849 1
+3850 2565 1
+3850 2655 1
+3851 2565 1
+3851 4138 1
+3854 15 1
+3854 737 1
+3854 1352 1
+3854 1473 1
+3854 1688 1
+3854 2066 1
+3854 2134 1
+3854 2237 1
+3854 2258 1
+3854 2328 1
+3854 2364 1
+3854 2398 1
+3854 2433 1
+3854 2516 1
+3854 2619 1
+3854 2653 1
+3854 2696 1
+3854 2764 1
+3854 2871 1
+3854 3024 1
+3854 3026 1
+3854 3034 1
+3854 3059 1
+3854 3089 1
+3854 3192 1
+3854 3238 1
+3854 3274 1
+3854 3276 1
+3854 3352 1
+3854 3404 1
+3854 3443 1
+3854 3447 1
+3854 3452 1
+3854 3456 1
+3854 3498 1
+3854 3537 1
+3854 3562 1
+3854 3607 1
+3854 3643 1
+3854 3748 1
+3854 3796 1
+3854 3813 1
+3854 3958 1
+3854 4040 1
+3854 4099 1
+3854 4124 1
+3854 4191 1
+3854 4199 1
+3854 4256 1
+3854 4297 1
+3854 4335 1
+3854 4485 1
+3854 4510 1
+3854 4530 1
+3854 4547 1
+3854 4578 1
+3854 4653 1
+3854 4706 1
+3854 4712 1
+3854 4814 1
+3854 4827 1
+3854 4828 1
+3854 4846 1
+3854 4884 1
+3854 4999 1
+3854 5026 1
+3854 5055 1
+3854 5061 1
+3854 5072 1
+3854 5285 1
+3854 5301 1
+3854 5412 1
+3854 5430 1
+3854 5445 1
+3854 5459 1
+3854 5463 1
+3854 5637 1
+3854 5651 1
+3854 5737 1
+3854 6098 1
+3854 6148 1
+3854 6699 1
+3855 1157 1
+3855 3404 1
+3855 3483 1
+3855 3615 1
+3855 4011 1
+3855 4335 1
+3858 3059 1
+3862 3059 1
+3862 3562 1
+3863 3026 1
+3863 3059 1
+3863 3192 1
+3863 3537 1
+3863 5308 1
+3864 3059 1
+3865 3059 1
+3865 4138 1
+3871 2237 1
+3871 2384 1
+3871 3321 1
+3871 4999 1
+3871 5162 1
+3869 2237 1
+3869 2384 1
+3869 3871 1
+3869 4600 1
+3869 4999 1
+3870 3871 1
+3870 3888 1
+3872 1307 1
+3872 2066 1
+3872 2210 1
+3872 2237 1
+3872 2328 1
+3872 2384 1
+3872 3321 1
+3872 3871 1
+3872 4162 1
+3872 4179 1
+3872 4269 1
+3872 4365 1
+3872 4999 1
+3872 5384 1
+3872 7553 1
+3873 3084 1
+3873 4712 1
+3873 5563 1
+3873 8038 1
+3648 608 1
+3648 778 1
+3648 827 1
+3648 3026 1
+3648 3084 1
+3648 3117 1
+3648 3483 1
+3648 3576 1
+3648 3887 1
+3876 3026 1
+3876 3117 1
+3876 4645 1
+3878 3117 1
+3877 737 1
+3877 1310 1
+3877 3117 1
+3877 3643 1
+3877 3792 1
+3877 3976 1
+3877 4266 1
+3877 5295 1
+3877 5484 1
+3877 5683 1
+3877 5772 1
+3877 6784 1
+3877 7092 1
+3881 3026 1
+3881 4335 1
+3882 1706 1
+3883 3483 1
+3885 3887 1
+3885 5466 1
+3886 3887 1
+3888 3892 1
+3889 3892 1
+3889 5499 1
+3890 1548 1
+3890 3892 1
+3890 4110 1
+3891 3892 1
+3894 3576 1
+3895 2307 1
+3897 2307 1
+3897 2565 1
+3897 3568 1
+3897 3898 1
+3897 4199 1
+3897 4335 1
+3897 4485 1
+3897 4551 1
+3897 4792 1
+3896 2307 1
+3900 3903 1
+3900 5818 1
+3900 5925 1
+3901 3903 1
+3902 737 1
+3902 1984 1
+3902 2144 1
+3902 2145 1
+3902 2326 1
+3902 2398 1
+3902 2517 1
+3902 2760 1
+3902 2790 1
+3902 3014 1
+3902 3034 1
+3902 3321 1
+3902 3352 1
+3902 3453 1
+3902 3455 1
+3902 3456 1
+3902 3460 1
+3902 3635 1
+3902 3835 1
+3902 3903 1
+3902 3956 1
+3902 3958 1
+3902 3976 1
+3902 4011 1
+3902 4212 1
+3902 4220 1
+3902 4261 1
+3902 4266 1
+3902 4466 1
+3902 4613 1
+3902 4646 1
+3902 4648 1
+3902 4661 1
+3902 4662 1
+3902 4666 1
+3902 4677 1
+3902 4735 1
+3902 4776 1
+3902 4778 1
+3902 4780 1
+3902 4797 1
+3902 4811 1
+3902 4815 1
+3904 2544 1
+3905 2289 1
+3905 2544 1
+3906 2544 1
+3907 2544 1
+3909 465 1
+3910 465 1
+3910 1026 1
+3910 2535 1
+3910 3334 1
+3910 3352 1
+3910 3456 1
+3910 3976 1
+3910 4037 1
+3910 4401 1
+3910 4735 1
+3910 5020 1
+3910 5022 1
+3910 5079 1
+3910 5123 1
+3910 5179 1
+3910 5254 1
+3910 5588 1
+3910 5773 1
+3910 5780 1
+3910 5799 1
+3910 6270 1
+3910 6628 1
+3910 6634 1
+3910 6897 1
+3910 6918 1
+3910 6946 1
+3910 7047 1
+3910 7094 1
+3910 7108 1
+3910 7478 1
+3910 7587 1
+3910 7620 1
+3910 8295 1
+3911 465 1
+3911 3643 1
+3912 465 1
+3912 2134 1
+3912 2508 1
+3912 2585 1
+3912 2746 1
+3912 2838 1
+3912 2932 1
+3912 3291 1
+3912 3615 1
+3912 3787 1
+3912 3937 1
+3912 4231 1
+3912 4247 1
+3912 4263 1
+3912 4269 1
+3912 4323 1
+3912 8293 1
+3916 72 1
+3916 2328 1
+3916 2585 1
+3916 2871 1
+3916 2958 1
+3916 3274 1
+3916 3586 1
+3916 3755 1
+3916 3796 1
+3916 4041 1
+3916 4099 1
+3916 4335 1
+3916 4536 1
+3916 4653 1
+3916 4709 1
+3916 4797 1
+3916 4875 1
+3916 4899 1
+3916 5020 1
+3916 5079 1
+3916 5176 1
+3916 5233 1
+3916 5285 1
+3916 5454 1
+3916 5459 1
+3916 5524 1
+3916 5605 1
+3916 5630 1
+3916 5639 1
+3916 5705 1
+3916 5714 1
+3916 5775 1
+3916 6083 1
+3916 6105 1
+3916 6123 1
+3916 6124 1
+3916 6555 1
+3916 6914 1
+3916 7063 1
+3916 7225 1
+3916 7620 1
+3916 7961 1
+3917 1729 1
+3917 1990 1
+3917 2014 1
+3917 2237 1
+3917 2328 1
+3917 2440 1
+3917 2456 1
+3917 2585 1
+3917 2646 1
+3917 3125 1
+3917 3144 1
+3917 3352 1
+3917 3568 1
+3917 3645 1
+3917 3787 1
+3917 3806 1
+3917 4201 1
+3917 4263 1
+3917 4384 1
+3917 4422 1
+3917 4485 1
+3917 4500 1
+3917 4687 1
+3917 4706 1
+3917 4735 1
+3917 4977 1
+3917 4999 1
+3917 5449 1
+3917 7553 1
+3918 2585 1
+3918 4335 1
+3918 5559 1
+3918 8294 1
+3919 1680 1
+3919 2585 1
+3919 3024 1
+3919 3614 1
+3919 4315 1
+3919 4547 1
+3919 4587 1
+3919 4687 1
+3919 4717 1
+3919 4795 1
+3919 5121 1
+3919 5188 1
+3919 5222 1
+3919 5288 1
+3919 6628 1
+3920 2585 1
+3920 2785 1
+3920 2871 1
+3920 2981 1
+3920 3787 1
+3920 6299 1
+3922 3191 1
+3922 4661 1
+3922 4779 1
+3922 5412 1
+3922 5947 1
+3922 6299 1
+3922 7295 1
+3923 1453 1
+3924 1453 1
+3924 2210 1
+3924 2508 1
+3924 3949 1
+3924 3967 1
+3925 1453 1
+3925 2653 1
+3925 3144 1
+3925 3634 1
+3925 3897 1
+3925 5210 1
+3925 8295 1
+3927 2508 1
+3928 2328 1
+3928 2508 1
+3929 2508 1
+3929 4875 1
+3930 15 1
+3930 2398 1
+3930 2508 1
+3930 4719 1
+3930 4875 1
+3931 2508 1
+3932 2508 1
+3932 4055 1
+3932 5626 1
+3932 6458 1
+3935 3937 1
+3936 3937 1
+3941 3942 1
+3943 608 1
+3944 608 1
+3947 2746 1
+3947 2958 1
+3947 3946 1
+3945 3946 1
+3945 4266 1
+3948 2134 1
+3948 2565 1
+3948 2619 1
+3948 2646 1
+3948 3144 1
+3948 3180 1
+3948 3260 1
+3948 3291 1
+3948 3631 1
+3948 3645 1
+3948 3720 1
+3948 3787 1
+3948 3812 1
+3948 3946 1
+3948 3970 1
+3948 4013 1
+3948 4110 1
+3948 4117 1
+3948 4138 1
+3948 4201 1
+3948 4233 1
+3948 4234 1
+3948 4247 1
+3948 4263 1
+3948 4297 1
+3948 8294 1
+3949 827 1
+3949 1239 1
+3949 2210 1
+3949 2384 1
+3949 2506 1
+3949 2595 1
+3949 2653 1
+3949 2655 1
+3949 2746 1
+3949 2859 1
+3949 2958 1
+3949 3258 1
+3949 3260 1
+3949 3562 1
+3949 3717 1
+3949 3720 1
+3949 3800 1
+3949 3812 1
+3949 3843 1
+3949 3967 1
+3949 3970 1
+3949 3980 1
+3949 4011 1
+3949 4021 1
+3949 4043 1
+3949 4055 1
+3949 4058 1
+3949 4162 1
+3949 4179 1
+3949 8294 1
+3952 3024 1
+3953 3024 1
+3954 3024 1
+3954 3260 1
+3955 3024 1
+3955 3720 1
+3955 4233 1
+3956 15 1
+3956 737 1
+3956 1157 1
+3956 1307 1
+3956 1549 1
+3956 1990 1
+3956 2066 1
+3956 2145 1
+3956 2160 1
+3956 2276 1
+3956 2364 1
+3956 2398 1
+3956 2535 1
+3956 2576 1
+3956 2760 1
+3956 2859 1
+3956 2900 1
+3956 2917 1
+3956 3024 1
+3956 3089 1
+3956 3180 1
+3956 3276 1
+3956 3320 1
+3956 3439 1
+3956 3452 1
+3956 3454 1
+3956 3455 1
+3956 3456 1
+3956 3461 1
+3956 3537 1
+3956 3568 1
+3956 3643 1
+3956 3645 1
+3956 3898 1
+3956 3958 1
+3956 3971 1
+3956 3976 1
+3956 3980 1
+3956 4011 1
+3956 4024 1
+3956 4031 1
+3956 4044 1
+3956 4072 1
+3956 4098 1
+3956 4124 1
+3956 4138 1
+3956 4219 1
+3956 4261 1
+3956 4290 1
+3956 4310 1
+3956 4323 1
+3956 4335 1
+3956 4365 1
+3956 4384 1
+3956 4402 1
+3956 4463 1
+3956 4468 1
+3956 4528 1
+3956 4531 1
+3956 4578 1
+3956 4795 1
+3956 4814 1
+3956 4831 1
+3956 4983 1
+3956 5022 1
+3956 5100 1
+3956 5130 1
+3956 5210 1
+3956 5321 1
+3956 5412 1
+3956 5484 1
+3956 5499 1
+3956 5539 1
+3956 5697 1
+3956 5775 1
+3956 5804 1
+3956 5871 1
+3956 5886 1
+3956 6337 1
+3956 6505 1
+3956 6570 1
+3956 6833 1
+3956 7063 1
+3956 7632 1
+3956 7651 1
+3958 2619 1
+3958 3897 1
+3958 4072 1
+3958 4099 1
+3958 4269 1
+3958 4485 1
+3958 4531 1
+3958 4689 1
+3958 5301 1
+3958 5605 1
+3958 5928 1
+3958 6123 1
+3958 6554 1
+3958 6774 1
+3958 7908 1
+3959 2535 1
+3959 2619 1
+3960 15 1
+3960 608 1
+3960 1473 1
+3960 2398 1
+3960 2516 1
+3960 2535 1
+3960 2619 1
+3960 2831 1
+3960 3806 1
+3960 4041 1
+3960 4099 1
+3960 4191 1
+3960 4453 1
+3960 5072 1
+3960 5254 1
+3960 5327 1
+3960 5392 1
+3960 5412 1
+3960 5423 1
+3960 5484 1
+3960 5543 1
+3960 5640 1
+3960 6560 1
+3961 1549 1
+3961 2210 1
+3961 2252 1
+3961 2535 1
+3961 2595 1
+3961 2619 1
+3961 2655 1
+3961 2746 1
+3961 3180 1
+3961 3800 1
+3961 3970 1
+3961 4011 1
+3961 4021 1
+3961 4024 1
+3961 4103 1
+3961 4110 1
+3962 2859 1
+3962 3260 1
+3962 4557 1
+3962 4886 1
+3964 3260 1
+3965 737 1
+3965 825 1
+3965 1549 1
+3965 1688 1
+3965 1769 1
+3965 2134 1
+3965 2144 1
+3965 2328 1
+3965 2398 1
+3965 2499 1
+3965 2535 1
+3965 2576 1
+3965 2646 1
+3965 2653 1
+3965 2774 1
+3965 2790 1
+3965 3027 1
+3965 3073 1
+3965 3260 1
+3965 3297 1
+3965 3321 1
+3965 3334 1
+3965 3352 1
+3965 3394 1
+3965 3454 1
+3965 3463 1
+3965 3568 1
+3965 3615 1
+3965 3645 1
+3965 3752 1
+3965 3969 1
+3965 3976 1
+3965 4065 1
+3965 4071 1
+3965 4191 1
+3965 4269 1
+3965 4299 1
+3965 4578 1
+3965 4687 1
+3965 4827 1
+3965 4875 1
+3965 5022 1
+3965 5079 1
+3965 5130 1
+3965 5178 1
+3965 5233 1
+3965 5288 1
+3965 5321 1
+3965 5437 1
+3965 5524 1
+3965 5527 1
+3965 5605 1
+3965 5802 1
+3965 5819 1
+3965 5822 1
+3965 5902 1
+3965 5932 1
+3965 5947 1
+3965 6006 1
+3965 6043 1
+3965 6044 1
+3965 6124 1
+3965 6148 1
+3965 6156 1
+3965 6174 1
+3965 6270 1
+3965 6306 1
+3965 6344 1
+3965 6414 1
+3965 6496 1
+3965 6552 1
+3965 6566 1
+3965 6832 1
+3965 6976 1
+3965 7101 1
+3965 7225 1
+3965 7422 1
+3965 7620 1
+3965 7632 1
+3965 7707 1
+3965 7788 1
+3965 7809 1
+3965 7961 1
+3965 8134 1
+3965 8168 1
+3965 8174 1
+3965 8209 1
+3965 8237 1
+3965 8294 1
+3963 3260 1
+3966 3967 1
+3957 3970 1
+3968 3970 1
+3969 15 1
+3969 72 1
+3969 737 1
+3969 1305 1
+3969 1385 1
+3969 1403 1
+3969 1680 1
+3969 1729 1
+3969 1799 1
+3969 2240 1
+3969 2328 1
+3969 2354 1
+3969 2433 1
+3969 2535 1
+3969 2565 1
+3969 2689 1
+3969 2774 1
+3969 2785 1
+3969 2790 1
+3969 2822 1
+3969 2940 1
+3969 3103 1
+3969 3125 1
+3969 3144 1
+3969 3291 1
+3969 3334 1
+3969 3346 1
+3969 3352 1
+3969 3452 1
+3969 3456 1
+3969 3537 1
+3969 3607 1
+3969 3615 1
+3969 3635 1
+3969 3661 1
+3969 3785 1
+3969 3835 1
+3969 3854 1
+3969 3897 1
+3969 3910 1
+3969 3970 1
+3969 4037 1
+3969 4040 1
+3969 4138 1
+3969 4191 1
+3969 4261 1
+3969 4266 1
+3969 4323 1
+3969 4331 1
+3969 4480 1
+3969 4485 1
+3969 4536 1
+3969 4587 1
+3969 4645 1
+3969 4662 1
+3969 4666 1
+3969 4706 1
+3969 4712 1
+3969 4719 1
+3969 4780 1
+3969 4792 1
+3969 4796 1
+3969 4809 1
+3969 4875 1
+3969 4940 1
+3969 4962 1
+3969 5012 1
+3969 5026 1
+3969 5058 1
+3969 5182 1
+3969 5231 1
+3969 5323 1
+3969 5351 1
+3969 5412 1
+3969 5484 1
+3969 5969 1
+3969 6481 1
+3969 6496 1
+3969 6665 1
+3969 6715 1
+3969 6721 1
+3969 6860 1
+3969 7040 1
+3969 7062 1
+3969 7214 1
+3969 7316 1
+3969 7553 1
+3969 7620 1
+3969 7624 1
+3969 7833 1
+3971 2535 1
+3971 3192 1
+3971 3458 1
+3971 3661 1
+3971 4098 1
+3971 5123 1
+3971 5524 1
+3973 1140 1
+3973 2134 1
+3973 2328 1
+3973 2859 1
+3973 2900 1
+3973 2932 1
+3973 3192 1
+3973 3276 1
+3973 3291 1
+3973 3394 1
+3973 3562 1
+3973 3615 1
+3973 3717 1
+3973 3787 1
+3973 3813 1
+3973 3898 1
+3973 4055 1
+3973 4138 1
+3973 4162 1
+3973 4179 1
+3973 4181 1
+3973 4191 1
+3973 4201 1
+3973 4216 1
+3973 4256 1
+3973 4263 1
+3973 4269 1
+3973 4272 1
+3973 4289 1
+3973 4290 1
+3973 4303 1
+3973 4311 1
+3973 4331 1
+3976 15 1
+3976 72 1
+3976 346 1
+3976 406 1
+3976 737 1
+3976 762 1
+3976 978 1
+3976 1305 1
+3976 1310 1
+3976 1549 1
+3976 1648 1
+3976 1984 1
+3976 2001 1
+3976 2144 1
+3976 2240 1
+3976 2276 1
+3976 2354 1
+3976 2364 1
+3976 2369 1
+3976 2398 1
+3976 2517 1
+3976 2535 1
+3976 2565 1
+3976 2589 1
+3976 2775 1
+3976 2790 1
+3976 2871 1
+3976 3014 1
+3976 3034 1
+3976 3089 1
+3976 3180 1
+3976 3271 1
+3976 3276 1
+3976 3334 1
+3976 3352 1
+3976 3455 1
+3976 3456 1
+3976 3459 1
+3976 3537 1
+3976 3643 1
+3976 3792 1
+3976 3796 1
+3976 3830 1
+3976 3897 1
+3976 3958 1
+3976 4037 1
+3976 4040 1
+3976 4110 1
+3976 4124 1
+3976 4127 1
+3976 4189 1
+3976 4191 1
+3976 4211 1
+3976 4212 1
+3976 4219 1
+3976 4220 1
+3976 4298 1
+3976 4335 1
+3976 4338 1
+3976 4401 1
+3976 4402 1
+3976 4500 1
+3976 4529 1
+3976 4536 1
+3976 4547 1
+3976 4551 1
+3976 4558 1
+3976 4562 1
+3976 4583 1
+3976 4584 1
+3976 4588 1
+3976 4621 1
+3976 4631 1
+3976 4650 1
+3976 4678 1
+3976 4684 1
+3976 4712 1
+3976 4717 1
+3976 4735 1
+3976 4776 1
+3976 4777 1
+3976 4780 1
+3976 4811 1
+3976 4828 1
+3976 4875 1
+3976 4954 1
+3976 4966 1
+3976 4977 1
+3976 5002 1
+3976 5020 1
+3976 5045 1
+3976 5075 1
+3976 5083 1
+3976 5123 1
+3976 5141 1
+3976 5199 1
+3976 5215 1
+3976 5233 1
+3976 5260 1
+3976 5267 1
+3976 5271 1
+3976 5285 1
+3976 5296 1
+3976 5303 1
+3976 5306 1
+3976 5327 1
+3976 5341 1
+3976 5364 1
+3976 5387 1
+3976 5388 1
+3976 5430 1
+3976 5463 1
+3976 5465 1
+3976 5481 1
+3976 5484 1
+3976 5509 1
+3976 5623 1
+3976 5635 1
+3976 5639 1
+3976 5664 1
+3976 5697 1
+3976 5800 1
+3976 5817 1
+3976 5860 1
+3976 5872 1
+3976 5886 1
+3976 5936 1
+3976 6009 1
+3976 6059 1
+3976 6083 1
+3976 6097 1
+3976 6098 1
+3976 6109 1
+3976 6130 1
+3976 6164 1
+3976 6257 1
+3976 6261 1
+3976 6269 1
+3976 6278 1
+3976 6755 1
+3976 6997 1
+3976 7185 1
+3976 7201 1
+3976 8295 1
+3976 8296 1
+3977 15 1
+3977 2066 1
+3977 2144 1
+3977 2398 1
+3977 2790 1
+3977 3562 1
+3977 3645 1
+3977 3720 1
+3977 3800 1
+3977 4030 1
+3977 4191 1
+3977 4256 1
+3977 4578 1
+3977 8294 1
+3978 3800 1
+3978 5818 1
+3979 2535 1
+3979 3800 1
+3979 4011 1
+3980 2328 1
+3980 4373 1
+3981 2535 1
+3987 2535 1
+3982 15 1
+3982 737 1
+3982 2276 1
+3982 2398 1
+3982 2535 1
+3982 2775 1
+3982 3089 1
+3982 3352 1
+3982 3456 1
+3982 3910 1
+3982 4037 1
+3982 4099 1
+3982 5079 1
+3982 5412 1
+3982 5902 1
+3982 6097 1
+3982 6337 1
+3982 6869 1
+3982 7115 1
+3982 7809 1
+3989 2535 1
+3989 5404 1
+3983 2535 1
+3983 4534 1
+3983 5452 1
+3983 7908 1
+3984 2535 1
+3984 4037 1
+3990 2535 1
+3985 15 1
+3985 1239 1
+3985 1498 1
+3985 2066 1
+3985 2511 1
+3985 2535 1
+3985 2655 1
+3985 2775 1
+3985 2811 1
+3985 2958 1
+3985 3140 1
+3985 3291 1
+3985 3454 1
+3985 3460 1
+3985 3498 1
+3985 3631 1
+3985 3634 1
+3985 3635 1
+3985 3830 1
+3985 4021 1
+3985 4037 1
+3985 4261 1
+3985 4335 1
+3985 4578 1
+3985 4661 1
+3985 4781 1
+3985 5002 1
+3985 5928 1
+3985 6296 1
+3985 6496 1
+3985 6553 1
+3985 7855 1
+3986 2535 1
+3991 1549 1
+3991 3320 1
+3991 3562 1
+3991 4024 1
+3991 4666 1
+3991 8293 1
+3991 8294 1
+3992 1549 1
+3992 4463 1
+3997 2746 1
+3998 2746 1
+3998 3664 1
+3999 2595 1
+3999 2746 1
+4000 2210 1
+4000 2746 1
+4000 3843 1
+4000 8293 1
+4001 737 1
+4001 1385 1
+4001 1729 1
+4001 1990 1
+4001 2145 1
+4001 2289 1
+4001 2746 1
+4001 3321 1
+4001 3394 1
+4001 3454 1
+4001 3568 1
+4001 3660 1
+4001 3976 1
+4001 4021 1
+4001 4037 1
+4001 4040 1
+4001 4127 1
+4001 4191 1
+4001 4219 1
+4001 4220 1
+4001 4261 1
+4001 4365 1
+4001 4536 1
+4001 4662 1
+4001 4678 1
+4001 4719 1
+4001 4811 1
+4001 4994 1
+3898 2746 1
+3898 2859 1
+4005 2595 1
+4006 2210 1
+4006 2655 1
+4007 2134 1
+4007 2210 1
+4007 2433 1
+4007 2655 1
+4007 2859 1
+4007 2900 1
+4007 3192 1
+4007 3258 1
+4007 3394 1
+4007 3562 1
+4007 3843 1
+4007 4043 1
+4007 4269 1
+4007 4290 1
+4007 8294 1
+4008 15 1
+4008 2655 1
+4008 3089 1
+4008 3276 1
+4008 4448 1
+4008 4780 1
+4008 5484 1
+4010 4011 1
+4013 15 1
+4013 346 1
+4013 896 1
+4013 1680 1
+4013 2066 1
+4013 2369 1
+4013 2535 1
+4013 2565 1
+4013 2909 1
+4013 4014 1
+4013 4138 1
+4013 4315 1
+4013 4712 1
+4013 5123 1
+4013 5215 1
+4013 5288 1
+4013 5412 1
+4013 5829 1
+4013 5863 1
+4013 6218 1
+4013 6789 1
+4016 2210 1
+4016 2384 1
+4015 15 1
+4015 2210 1
+4019 4021 1
+4019 4024 1
+4020 2328 1
+4020 2981 1
+4020 3192 1
+4020 4021 1
+4020 4256 1
+4020 4263 1
+4024 3898 1
+4024 4986 1
+4023 840 1
+4023 3720 1
+4023 4024 1
+4025 8293 1
+4026 3313 1
+4026 8293 1
+4027 2129 1
+4027 4162 1
+4027 4179 1
+4027 4384 1
+4027 4402 1
+4027 8293 1
+4028 8293 1
+4034 2072 1
+4034 3717 1
+4034 3843 1
+4034 4043 1
+4035 3717 1
+4036 15 1
+4036 155 1
+4036 825 1
+4036 1159 1
+4036 1239 1
+4036 1247 1
+4036 1305 1
+4036 1307 1
+4036 1310 1
+4036 1648 1
+4036 1769 1
+4036 2001 1
+4036 2066 1
+4036 2134 1
+4036 2258 1
+4036 2364 1
+4036 2384 1
+4036 2440 1
+4036 2506 1
+4036 2516 1
+4036 2576 1
+4036 2605 1
+4036 2653 1
+4036 2696 1
+4036 2775 1
+4036 2787 1
+4036 2831 1
+4036 2859 1
+4036 2958 1
+4036 2981 1
+4036 3000 1
+4036 3027 1
+4036 3103 1
+4036 3274 1
+4036 3276 1
+4036 3293 1
+4036 3352 1
+4036 3443 1
+4036 3456 1
+4036 3458 1
+4036 3562 1
+4036 3586 1
+4036 3607 1
+4036 3631 1
+4036 3717 1
+4036 3720 1
+4036 3796 1
+4036 3873 1
+4036 3885 1
+4036 3958 1
+4036 3969 1
+4036 4037 1
+4036 4088 1
+4036 4099 1
+4036 4138 1
+4036 4162 1
+4036 4175 1
+4036 4233 1
+4036 4335 1
+4036 4338 1
+4036 4341 1
+4036 4488 1
+4036 4530 1
+4036 4574 1
+4036 4600 1
+4036 4653 1
+4036 4712 1
+4036 4792 1
+4036 4797 1
+4036 4808 1
+4036 4929 1
+4036 4938 1
+4036 4953 1
+4036 4962 1
+4036 4981 1
+4036 4986 1
+4036 5022 1
+4036 5028 1
+4036 5037 1
+4036 5061 1
+4036 5072 1
+4036 5083 1
+4036 5189 1
+4036 5254 1
+4036 5288 1
+4036 5404 1
+4036 5423 1
+4036 5430 1
+4036 5445 1
+4036 5449 1
+4036 5452 1
+4036 5454 1
+4036 5459 1
+4036 5506 1
+4036 5509 1
+4036 5529 1
+4036 5543 1
+4036 5605 1
+4036 5614 1
+4036 5637 1
+4036 5650 1
+4036 5651 1
+4036 5680 1
+4036 5683 1
+4036 5693 1
+4036 5732 1
+4036 5737 1
+4036 5743 1
+4036 5780 1
+4036 5790 1
+4036 5814 1
+4036 5819 1
+4036 5827 1
+4036 5828 1
+4036 5835 1
+4036 5897 1
+4036 5925 1
+4036 5928 1
+4036 5936 1
+4036 5994 1
+4036 6044 1
+4036 6123 1
+4036 6148 1
+4036 6229 1
+4036 6417 1
+4036 6437 1
+4036 6566 1
+4036 6665 1
+4036 6780 1
+4036 6869 1
+4036 6907 1
+4036 6918 1
+4036 6946 1
+4036 7101 1
+4036 7381 1
+4036 7400 1
+4036 7414 1
+4036 7587 1
+4036 7620 1
+4036 7699 1
+4036 7860 1
+4036 8037 1
+4036 8042 1
+4036 8073 1
+4036 8128 1
+4036 8198 1
+4036 8294 1
+4037 15 1
+4037 825 1
+4037 1385 1
+4037 2014 1
+4037 2958 1
+4037 3498 1
+4037 3717 1
+4037 4138 1
+4037 4256 1
+4037 4402 1
+4037 5226 1
+4037 5693 1
+4037 6124 1
+4037 7699 1
+4037 8294 1
+4038 4043 1
+4040 15 1
+4040 72 1
+4040 737 1
+4040 967 1
+4040 1403 1
+4040 1688 1
+4040 1982 1
+4040 2144 1
+4040 2145 1
+4040 2237 1
+4040 2240 1
+4040 2277 1
+4040 2506 1
+4040 2535 1
+4040 2576 1
+4040 2605 1
+4040 2765 1
+4040 2790 1
+4040 2871 1
+4040 3089 1
+4040 3106 1
+4040 3321 1
+4040 3334 1
+4040 3352 1
+4040 3381 1
+4040 3454 1
+4040 3562 1
+4040 3586 1
+4040 3615 1
+4040 3635 1
+4040 3643 1
+4040 3748 1
+4040 3755 1
+4040 3796 1
+4040 3812 1
+4040 3910 1
+4040 3976 1
+4040 4011 1
+4040 4037 1
+4040 4043 1
+4040 4219 1
+4040 4266 1
+4040 4400 1
+4040 4401 1
+4040 4402 1
+4040 4529 1
+4040 4531 1
+4040 4578 1
+4040 4584 1
+4040 4678 1
+4040 4706 1
+4040 4735 1
+4040 4776 1
+4040 4778 1
+4040 4780 1
+4040 4811 1
+4040 4814 1
+4040 4827 1
+4040 4875 1
+4040 4966 1
+4040 4981 1
+4040 5020 1
+4040 5064 1
+4040 5123 1
+4040 5178 1
+4040 5288 1
+4040 5323 1
+4040 5404 1
+4040 5459 1
+4040 5559 1
+4040 5563 1
+4040 5693 1
+4040 5732 1
+4040 5743 1
+4040 5745 1
+4040 5757 1
+4040 5839 1
+4040 5991 1
+4040 6043 1
+4040 6269 1
+4040 6278 1
+4040 6709 1
+4040 6914 1
+4040 6934 1
+4040 6980 1
+4040 7005 1
+4040 7233 1
+4040 7280 1
+4040 7351 1
+4040 7443 1
+4040 7662 1
+4040 7788 1
+4040 7809 1
+4040 7871 1
+4040 8051 1
+4040 8174 1
+4040 8192 1
+4040 8198 1
+4040 8204 1
+4040 8212 1
+4040 8219 1
+4040 8224 1
+4040 8226 1
+4040 8294 1
+4039 825 1
+4039 2384 1
+4039 2653 1
+4039 2981 1
+4039 3562 1
+4039 4043 1
+4039 4055 1
+4039 4110 1
+4039 4162 1
+4041 15 1
+4041 737 1
+4041 1247 1
+4041 1972 1
+4041 2354 1
+4041 2381 1
+4041 3015 1
+4041 3089 1
+4041 3103 1
+4041 3276 1
+4041 3458 1
+4041 3460 1
+4041 3498 1
+4041 3554 1
+4041 3634 1
+4041 3643 1
+4041 3691 1
+4041 3796 1
+4041 3897 1
+4041 4043 1
+4041 4099 1
+4041 4124 1
+4041 4266 1
+4041 4298 1
+4041 4335 1
+4041 4355 1
+4041 4530 1
+4041 4653 1
+4041 4687 1
+4041 4712 1
+4041 4715 1
+4041 4719 1
+4041 4780 1
+4041 4792 1
+4041 4795 1
+4041 4827 1
+4041 4899 1
+4041 4938 1
+4041 4964 1
+4041 4987 1
+4041 5121 1
+4041 5141 1
+4041 5178 1
+4041 5200 1
+4041 5204 1
+4041 5210 1
+4041 5233 1
+4041 5239 1
+4041 5262 1
+4041 5375 1
+4041 5412 1
+4041 5439 1
+4041 5459 1
+4041 5559 1
+4041 5624 1
+4041 5650 1
+4041 5737 1
+4041 5829 1
+4041 5844 1
+4041 5886 1
+4041 5925 1
+4041 6098 1
+4041 6124 1
+4041 6255 1
+4041 6306 1
+4041 6337 1
+4041 6400 1
+4041 6739 1
+4042 825 1
+4042 1239 1
+4042 2066 1
+4042 2384 1
+4042 2653 1
+4042 2859 1
+4042 2932 1
+4042 2958 1
+4042 2981 1
+4042 3291 1
+4042 3615 1
+4042 3631 1
+4042 3787 1
+4042 4013 1
+4042 4043 1
+4042 4055 1
+4042 4162 1
+4042 4179 1
+4042 4201 1
+4042 4233 1
+4042 4247 1
+2981 15 1
+2981 608 1
+2981 737 1
+2981 1549 1
+2981 1799 1
+2981 1990 1
+2981 2145 1
+2981 2328 1
+2981 2653 1
+2981 2658 1
+2981 3238 1
+2981 3309 1
+2981 3321 1
+2981 3381 1
+2981 3447 1
+2981 3456 1
+2981 3460 1
+2981 3537 1
+2981 3568 1
+2981 3897 1
+2981 3910 1
+2981 4037 1
+2981 4043 1
+2981 4124 1
+2981 4162 1
+2981 4661 1
+2981 4662 1
+2981 5022 1
+2981 5073 1
+2981 5179 1
+2981 5430 1
+2981 5432 1
+2981 5459 1
+2981 5463 1
+2981 5886 1
+2981 5969 1
+2981 6555 1
+2981 6774 1
+2981 7120 1
+2981 7149 1
+2981 7381 1
+2981 7632 1
+2981 7778 1
+2981 8295 1
+4044 346 1
+4044 1305 1
+4044 1360 1
+4044 1688 1
+4044 1769 1
+4044 1961 1
+4044 1984 1
+4044 2145 1
+4044 2237 1
+4044 2240 1
+4044 2364 1
+4044 2398 1
+4044 2811 1
+4044 2871 1
+4044 2917 1
+4044 3014 1
+4044 3073 1
+4044 3089 1
+4044 3271 1
+4044 3321 1
+4044 3334 1
+4044 3352 1
+4044 3433 1
+4044 3447 1
+4044 3452 1
+4044 3453 1
+4044 3454 1
+4044 3455 1
+4044 3460 1
+4044 3537 1
+4044 3607 1
+4044 3724 1
+4044 3835 1
+4044 3843 1
+4044 3854 1
+4044 3898 1
+4044 3976 1
+4044 4011 1
+4044 4040 1
+4044 4047 1
+4044 4078 1
+4044 4191 1
+4044 4199 1
+4044 4216 1
+4044 4218 1
+4044 4219 1
+4044 4261 1
+4044 4266 1
+4044 4297 1
+4044 4335 1
+4044 4466 1
+4044 4468 1
+4044 4485 1
+4044 4529 1
+4044 4531 1
+4044 4551 1
+4044 4552 1
+4044 4557 1
+4044 4562 1
+4044 4578 1
+4044 4583 1
+4044 4588 1
+4044 4605 1
+4044 4613 1
+4044 4631 1
+4044 4639 1
+4044 4646 1
+4044 4648 1
+4044 4650 1
+4044 4666 1
+4044 4677 1
+4044 4678 1
+4044 4713 1
+4044 4719 1
+4044 4728 1
+4044 4778 1
+4044 4779 1
+4044 4780 1
+4044 4796 1
+4044 4809 1
+4044 4831 1
+4044 4875 1
+4044 4887 1
+4044 4938 1
+4044 4962 1
+4044 4987 1
+4044 4991 1
+4044 4993 1
+4044 5058 1
+4045 15 1
+4045 1159 1
+4045 1305 1
+4045 1310 1
+4045 1352 1
+4045 1360 1
+4045 1403 1
+4045 1473 1
+4045 1648 1
+4045 1680 1
+4045 1688 1
+4045 1733 1
+4045 1769 1
+4045 1972 1
+4045 2144 1
+4045 2145 1
+4045 2237 1
+4045 2240 1
+4045 2276 1
+4045 2364 1
+4045 2381 1
+4045 2433 1
+4045 2440 1
+4045 2456 1
+4045 2507 1
+4045 2511 1
+4045 2516 1
+4045 2517 1
+4045 2565 1
+4045 2592 1
+4045 2689 1
+4045 2696 1
+4045 2765 1
+4045 2775 1
+4045 2785 1
+4045 2787 1
+4045 2811 1
+4045 2851 1
+4045 2871 1
+4045 2925 1
+4045 3002 1
+4045 3015 1
+4045 3034 1
+4045 3073 1
+4045 3089 1
+4045 3092 1
+4045 3106 1
+4045 3125 1
+4045 3140 1
+4045 3144 1
+4045 3284 1
+4045 3291 1
+4045 3309 1
+4045 3321 1
+4045 3352 1
+4045 3433 1
+4045 3447 1
+4045 3452 1
+4045 3453 1
+4045 3455 1
+4045 3498 1
+4045 3537 1
+4045 3586 1
+4045 3607 1
+4045 3614 1
+4045 3635 1
+4045 3643 1
+4045 3645 1
+4045 3664 1
+4045 3724 1
+4045 3726 1
+4045 3748 1
+4045 3785 1
+4045 3796 1
+4045 3803 1
+4045 3806 1
+4045 3812 1
+4045 3843 1
+4045 3854 1
+4045 3873 1
+4045 3897 1
+4045 3898 1
+4045 3919 1
+4045 3956 1
+4045 3958 1
+4045 4037 1
+4045 4040 1
+4045 4041 1
+4045 4047 1
+4045 4072 1
+4045 4099 1
+4045 4103 1
+4045 4124 1
+4045 4175 1
+4045 4212 1
+4045 4261 1
+4045 4266 1
+4045 4297 1
+4045 4299 1
+4045 4310 1
+4045 4315 1
+4045 4338 1
+4045 4417 1
+4045 4453 1
+4045 4463 1
+4045 4485 1
+4045 4500 1
+4045 4510 1
+4045 4521 1
+4045 4527 1
+4045 4528 1
+4045 4534 1
+4045 4536 1
+4045 4547 1
+4045 4551 1
+4045 4552 1
+4045 4574 1
+4045 4578 1
+4045 4588 1
+4045 4613 1
+4045 4646 1
+4045 4661 1
+4045 4666 1
+4045 4687 1
+4045 4689 1
+4045 4706 1
+4045 4712 1
+4045 4715 1
+4045 4717 1
+4045 4719 1
+4045 4748 1
+4045 4781 1
+4045 4792 1
+4045 4795 1
+4045 4796 1
+4045 4798 1
+4045 4808 1
+4045 4811 1
+4045 4814 1
+4045 4827 1
+4045 4828 1
+4045 4879 1
+4045 4899 1
+4045 4938 1
+4045 4944 1
+4045 4953 1
+4045 4994 1
+4045 4999 1
+4045 5002 1
+4045 5026 1
+4045 5055 1
+4045 5061 1
+4045 5072 1
+4045 5073 1
+4045 5092 1
+4045 5100 1
+4045 5103 1
+4045 5106 1
+4045 5121 1
+4045 5123 1
+4045 5130 1
+4045 5132 1
+4045 5140 1
+4045 5144 1
+4045 5182 1
+4045 5188 1
+4045 5204 1
+4045 5215 1
+4045 5222 1
+4045 5226 1
+4045 5262 1
+4045 5273 1
+4045 5288 1
+4045 5301 1
+4045 5404 1
+4045 5437 1
+4045 5439 1
+4045 5445 1
+4045 5479 1
+4045 5484 1
+4045 5524 1
+4045 5527 1
+4045 5543 1
+4045 5545 1
+4045 5563 1
+4045 5584 1
+4045 5624 1
+4045 5680 1
+4045 5684 1
+4045 5739 1
+4045 5753 1
+4045 5773 1
+4045 5775 1
+4045 5776 1
+4045 5780 1
+4045 5790 1
+4045 5799 1
+4045 5814 1
+4045 5818 1
+4045 5822 1
+4045 5827 1
+4045 5844 1
+4045 5848 1
+4045 5886 1
+4045 5891 1
+4045 5925 1
+4045 5928 1
+4045 5932 1
+4045 5947 1
+4045 5998 1
+4045 6006 1
+4045 6029 1
+4045 6097 1
+4045 6098 1
+4045 6124 1
+4045 6148 1
+4045 6156 1
+4045 6166 1
+4045 6229 1
+4045 6327 1
+4045 6337 1
+4045 6432 1
+4045 6437 1
+4045 6441 1
+4045 6481 1
+4045 6496 1
+4045 6501 1
+4045 6505 1
+4045 6528 1
+4045 6552 1
+4045 6553 1
+4045 6554 1
+4045 6566 1
+4045 6570 1
+4045 6576 1
+4045 6589 1
+4045 6594 1
+4045 6600 1
+4045 6624 1
+4045 6632 1
+4045 6699 1
+4045 6725 1
+4045 6765 1
+4045 6774 1
+4045 6790 1
+4045 6901 1
+4045 6930 1
+4045 7073 1
+4045 7101 1
+4045 7108 1
+4045 7115 1
+4045 7119 1
+4045 7143 1
+4045 7144 1
+4045 7162 1
+4045 7214 1
+4045 8295 1
+4046 840 1
+4046 1026 1
+4046 1403 1
+4046 1769 1
+4046 2326 1
+4046 2342 1
+4046 2511 1
+4046 2517 1
+4046 2565 1
+4046 2785 1
+4046 2787 1
+4046 2790 1
+4046 2871 1
+4046 3002 1
+4046 3276 1
+4046 3334 1
+4046 3346 1
+4046 3352 1
+4046 3452 1
+4046 3453 1
+4046 3458 1
+4046 3459 1
+4046 3748 1
+4046 3835 1
+4046 3885 1
+4046 3958 1
+4046 4011 1
+4046 4037 1
+4046 4040 1
+4046 4047 1
+4046 4103 1
+4046 4189 1
+4046 4212 1
+4046 4298 1
+4046 4361 1
+4046 4558 1
+4046 4661 1
+4046 4666 1
+4046 4678 1
+4046 4706 1
+4046 4811 1
+4046 4820 1
+4046 4875 1
+4046 4929 1
+4046 4993 1
+4046 4999 1
+4046 5012 1
+4046 5083 1
+4046 5233 1
+4046 5288 1
+4046 5289 1
+4046 5384 1
+4046 5432 1
+4046 5484 1
+4046 5500 1
+4046 5582 1
+4046 5773 1
+4046 5801 1
+4046 5811 1
+4046 5814 1
+4046 5902 1
+4046 6241 1
+4046 6270 1
+4046 6320 1
+4046 6414 1
+4046 6523 1
+4046 6560 1
+4046 6596 1
+4046 6634 1
+4046 6714 1
+4046 6736 1
+4046 6917 1
+4046 6980 1
+4046 6994 1
+4046 7088 1
+4046 7092 1
+4046 7108 1
+4046 7168 1
+4046 7185 1
+4046 7254 1
+4046 7257 1
+4046 7295 1
+4046 7373 1
+4046 7381 1
+4046 7400 1
+4046 7620 1
+4046 7675 1
+4046 7683 1
+4046 7890 1
+4048 4049 1
+4051 4510 1
+4050 4051 1
+4053 2384 1
+4053 2506 1
+4055 2506 1
+4055 5106 1
+4055 6347 1
+4056 1024 1
+4056 1157 1
+4056 1385 1
+4056 2506 1
+4056 2787 1
+4056 2790 1
+4056 2871 1
+4056 3106 1
+4056 3452 1
+4056 3458 1
+4056 3835 1
+4056 4055 1
+4056 4110 1
+4056 4162 1
+4056 4234 1
+4056 4424 1
+4056 4453 1
+4056 4463 1
+4056 4808 1
+4056 4820 1
+4056 5055 1
+4056 5963 1
+4056 8294 1
+4057 2506 1
+4059 2398 1
+4059 2775 1
+4059 3562 1
+4059 5760 1
+4061 3562 1
+4062 1990 1
+4062 3125 1
+4062 3562 1
+4062 4578 1
+4063 737 1
+4063 1990 1
+4063 2144 1
+4063 2917 1
+4063 2925 1
+4063 3125 1
+4063 3447 1
+4063 3454 1
+4063 3562 1
+4063 3568 1
+4063 3645 1
+4063 4072 1
+4063 4191 1
+4063 4299 1
+4063 4310 1
+4063 4335 1
+4063 4689 1
+4063 4735 1
+4063 5123 1
+4063 5178 1
+4063 5262 1
+4063 5412 1
+4063 5545 1
+4063 5697 1
+4063 6098 1
+4063 6305 1
+4063 6634 1
+4077 608 1
+4077 737 1
+4077 762 1
+4077 1247 1
+4077 1305 1
+4077 1799 1
+4077 2014 1
+4077 2145 1
+4077 2237 1
+4077 2328 1
+4077 2354 1
+4077 2364 1
+4077 2381 1
+4077 2517 1
+4077 2565 1
+4077 2592 1
+4077 2653 1
+4077 2696 1
+4077 2811 1
+4077 2822 1
+4077 2831 1
+4077 3027 1
+4077 3034 1
+4077 3092 1
+4077 3103 1
+4077 3334 1
+4077 3352 1
+4077 3433 1
+4077 3447 1
+4077 3454 1
+4077 3456 1
+4077 3460 1
+4077 3537 1
+4077 3562 1
+4077 3568 1
+4077 3635 1
+4077 3645 1
+4077 3812 1
+4077 3813 1
+4077 3897 1
+4077 3910 1
+4077 4044 1
+4077 4191 1
+4077 4247 1
+4077 4266 1
+4077 4297 1
+4077 4384 1
+4077 4400 1
+4077 4448 1
+4077 4463 1
+4077 4480 1
+4077 4528 1
+4077 4529 1
+4077 4547 1
+4077 4613 1
+4077 4666 1
+4077 4712 1
+4077 4735 1
+4077 4811 1
+4077 4828 1
+4077 4929 1
+4077 4964 1
+4077 4977 1
+4077 5100 1
+4077 5106 1
+4077 5130 1
+4077 5132 1
+4077 5155 1
+4077 5204 1
+4077 5222 1
+4077 5308 1
+4077 5392 1
+4077 5412 1
+4077 5430 1
+4077 5449 1
+4077 5463 1
+4077 5513 1
+4078 1239 1
+4078 3562 1
+4064 3562 1
+4065 762 1
+4065 825 1
+4065 896 1
+4065 1185 1
+4065 1239 1
+4065 1305 1
+4065 1310 1
+4065 1688 1
+4065 1729 1
+4065 1769 1
+4065 1990 1
+4065 2014 1
+4065 2129 1
+4065 2134 1
+4065 2144 1
+4065 2289 1
+4065 2328 1
+4065 2565 1
+4065 2612 1
+4065 2620 1
+4065 2646 1
+4065 2653 1
+4065 2760 1
+4065 2775 1
+4065 2787 1
+4065 2859 1
+4065 2871 1
+4065 2932 1
+4065 2958 1
+4065 2981 1
+4065 3002 1
+4065 3015 1
+4065 3125 1
+4065 3140 1
+4065 3144 1
+4065 3309 1
+4065 3346 1
+4065 3433 1
+4065 3439 1
+4065 3443 1
+4065 3447 1
+4065 3452 1
+4065 3453 1
+4065 3454 1
+4065 3562 1
+4065 3568 1
+4065 3607 1
+4065 3615 1
+4065 3634 1
+4065 3643 1
+4065 3645 1
+4065 3661 1
+4065 3724 1
+4065 3792 1
+4065 3809 1
+4065 3830 1
+4065 3843 1
+4065 3854 1
+4065 3873 1
+4065 3898 1
+4065 3956 1
+4065 3958 1
+4065 4011 1
+4065 4013 1
+4065 4055 1
+4065 4072 1
+4065 4162 1
+4065 4179 1
+4065 4181 1
+4065 4201 1
+4065 4216 1
+4065 4218 1
+4065 4263 1
+4065 4269 1
+4065 4290 1
+4065 4299 1
+4065 4331 1
+4065 4365 1
+4065 4373 1
+4065 4402 1
+4065 4417 1
+4065 4422 1
+4065 4424 1
+4065 4453 1
+4065 4463 1
+4065 4468 1
+4065 4485 1
+4065 4510 1
+4065 4529 1
+4065 4531 1
+4065 4536 1
+4065 4551 1
+4065 4578 1
+4065 4604 1
+4065 4613 1
+4065 4620 1
+4065 4666 1
+4065 4713 1
+4065 4791 1
+4065 4792 1
+4065 4938 1
+4065 4962 1
+4065 4999 1
+4065 5026 1
+4065 5037 1
+4065 5178 1
+4065 5263 1
+4065 5415 1
+4065 5543 1
+4065 5584 1
+4065 5624 1
+4065 5760 1
+4065 5800 1
+4065 5871 1
+4065 5932 1
+4065 5950 1
+4065 5998 1
+4065 6004 1
+4065 6097 1
+4065 6323 1
+4065 6528 1
+4065 6560 1
+4065 6699 1
+4065 6770 1
+4065 6803 1
+4065 6832 1
+4065 6946 1
+4065 7052 1
+4065 7094 1
+4065 7280 1
+4065 7351 1
+4066 3352 1
+4066 3439 1
+4066 3562 1
+4066 3568 1
+4066 4480 1
+4067 3562 1
+4068 2066 1
+4068 3346 1
+4068 3562 1
+4068 4323 1
+4068 4448 1
+4068 4528 1
+4069 3562 1
+4079 3562 1
+4079 4055 1
+4079 4179 1
+4079 4181 1
+4070 72 1
+4070 222 1
+4070 896 1
+4070 1159 1
+4070 1305 1
+4070 1385 1
+4070 1648 1
+4070 1680 1
+4070 1733 1
+4070 2001 1
+4070 2258 1
+4070 2354 1
+4070 2364 1
+4070 2516 1
+4070 2565 1
+4070 2576 1
+4070 2605 1
+4070 2646 1
+4070 2653 1
+4070 2775 1
+4070 2822 1
+4070 2859 1
+4070 2909 1
+4070 2917 1
+4070 2958 1
+4070 2981 1
+4070 3092 1
+4070 3103 1
+4070 3106 1
+4070 3144 1
+4070 3274 1
+4070 3276 1
+4070 3284 1
+4070 3417 1
+4070 3455 1
+4070 3458 1
+4070 3562 1
+4070 3586 1
+4070 3691 1
+4070 3796 1
+4070 3808 1
+4070 3958 1
+4070 4044 1
+4070 4127 1
+4070 4175 1
+4070 4189 1
+4070 4276 1
+4070 4297 1
+4070 4299 1
+4070 4335 1
+4070 4338 1
+4070 4400 1
+4070 4417 1
+4070 4422 1
+4070 4424 1
+4070 4448 1
+4070 4453 1
+4070 4463 1
+4070 4468 1
+4070 4480 1
+4070 4482 1
+4070 4530 1
+4070 4534 1
+4070 4536 1
+4070 4547 1
+4070 4587 1
+4070 4645 1
+4070 4797 1
+4070 4828 1
+4070 4899 1
+4070 5020 1
+4070 5026 1
+4070 5055 1
+4070 5061 1
+4070 5083 1
+4070 5100 1
+4070 5106 1
+4070 5182 1
+4070 5204 1
+4070 5222 1
+4070 5226 1
+4070 5245 1
+4070 5263 1
+4070 5288 1
+4070 5305 1
+4070 5308 1
+4070 5321 1
+4070 5323 1
+4070 5327 1
+4070 5341 1
+4070 5445 1
+4070 5449 1
+4070 5454 1
+4070 5459 1
+4070 5543 1
+4070 5683 1
+4070 5693 1
+4070 5706 1
+4070 5721 1
+4070 5732 1
+4070 5737 1
+4070 5756 1
+4070 5775 1
+4070 5784 1
+4070 5790 1
+4070 5828 1
+4070 5863 1
+4070 5872 1
+4070 5936 1
+4070 5963 1
+4070 5994 1
+4071 15 1
+4071 1473 1
+4071 2507 1
+4071 2822 1
+4071 3192 1
+4071 3460 1
+4071 3562 1
+4071 3910 1
+4071 4483 1
+4071 5412 1
+4071 5684 1
+4071 5775 1
+4071 6296 1
+4071 6930 1
+4071 7092 1
+4071 7553 1
+4071 7632 1
+4072 72 1
+4072 346 1
+4072 762 1
+4072 1549 1
+4072 1769 1
+4072 2237 1
+4072 2240 1
+4072 2326 1
+4072 2696 1
+4072 2760 1
+4072 2790 1
+4072 2859 1
+4072 3334 1
+4072 3352 1
+4072 3557 1
+4072 3562 1
+4072 3643 1
+4072 3812 1
+4072 3898 1
+4072 4191 1
+4072 4298 1
+4072 4335 1
+4072 4578 1
+4072 4588 1
+4072 4621 1
+4072 4735 1
+4072 4811 1
+4072 4820 1
+4072 4938 1
+4073 15 1
+4073 72 1
+4073 825 1
+4073 896 1
+4073 1239 1
+4073 1307 1
+4073 1972 1
+4073 1990 1
+4073 2134 1
+4073 2144 1
+4073 2276 1
+4073 2381 1
+4073 2386 1
+4073 2398 1
+4073 2516 1
+4073 2535 1
+4073 2592 1
+4073 2653 1
+4073 2765 1
+4073 2775 1
+4073 2790 1
+4073 2811 1
+4073 2859 1
+4073 2871 1
+4073 3014 1
+4073 3191 1
+4073 3192 1
+4073 3274 1
+4073 3284 1
+4073 3443 1
+4073 3447 1
+4073 3452 1
+4073 3453 1
+4073 3454 1
+4073 3455 1
+4073 3456 1
+4073 3537 1
+4073 3562 1
+4073 3614 1
+4073 3634 1
+4073 3643 1
+4073 3645 1
+4073 3724 1
+4073 3796 1
+4073 3808 1
+4073 3835 1
+4073 3854 1
+4073 3897 1
+4073 4041 1
+4073 4068 1
+4073 4099 1
+4073 4124 1
+4073 4181 1
+4073 4189 1
+4073 4191 1
+4073 4199 1
+4073 4211 1
+4073 4256 1
+4073 4266 1
+4073 4297 1
+4073 4298 1
+4073 4310 1
+4073 4315 1
+4073 4323 1
+4073 4400 1
+4073 4448 1
+4073 4530 1
+4073 4547 1
+4073 4551 1
+4073 4687 1
+4073 4735 1
+4073 4776 1
+4073 4824 1
+4073 4828 1
+4073 4929 1
+4073 4964 1
+4073 5061 1
+4073 5130 1
+4073 5140 1
+4073 5178 1
+4073 5189 1
+4073 5200 1
+4073 5226 1
+4073 5233 1
+4073 5255 1
+4073 5263 1
+4073 5274 1
+4073 5312 1
+4073 5412 1
+4073 5430 1
+4073 5452 1
+4073 5457 1
+4073 5467 1
+4073 5470 1
+4073 5637 1
+4073 5651 1
+4073 5891 1
+4073 6098 1
+4073 6105 1
+4073 6218 1
+4073 6327 1
+4073 6360 1
+4073 6388 1
+4073 6400 1
+4073 6417 1
+4073 6422 1
+4073 6424 1
+4073 6437 1
+4073 6472 1
+4073 6474 1
+4073 6481 1
+4073 6498 1
+4073 6505 1
+4073 6553 1
+4073 6570 1
+4074 1157 1
+4074 1385 1
+4074 1729 1
+4074 1990 1
+4074 2066 1
+4074 2129 1
+4074 2328 1
+4074 2565 1
+4074 2653 1
+4074 2696 1
+4074 2760 1
+4074 2859 1
+4074 2871 1
+4074 2958 1
+4074 3276 1
+4074 3346 1
+4074 3439 1
+4074 3562 1
+4074 3645 1
+4074 3660 1
+4074 3661 1
+4074 3664 1
+4074 4011 1
+4074 4138 1
+4074 4191 1
+4074 4199 1
+4074 4297 1
+4074 4323 1
+4074 4384 1
+4074 4402 1
+4074 4417 1
+4074 4424 1
+4074 4547 1
+4075 3562 1
+4080 3720 1
+4083 8294 1
+4082 1385 1
+4082 2398 1
+4082 3456 1
+4082 3897 1
+4082 5182 1
+4082 5245 1
+4082 5463 1
+4082 5680 1
+4082 5784 1
+4082 5790 1
+4082 5837 1
+4082 5848 1
+4082 5863 1
+4082 5963 1
+4082 8294 1
+4085 4086 1
+4089 1307 1
+4089 3309 1
+4089 3453 1
+4090 1307 1
+4091 1307 1
+4092 1307 1
+4095 825 1
+4095 4110 1
+4096 825 1
+4097 825 1
+4098 825 1
+4098 3568 1
+4098 3897 1
+4098 4201 1
+4098 4218 1
+4098 4266 1
+4098 4269 1
+4098 4485 1
+4100 825 1
+4099 15 1
+4099 72 1
+4099 346 1
+4099 737 1
+4099 825 1
+4099 1026 1
+4099 1385 1
+4099 1548 1
+4099 1549 1
+4099 1984 1
+4099 2160 1
+4099 2240 1
+4099 2258 1
+4099 2326 1
+4099 2354 1
+4099 2369 1
+4099 2398 1
+4099 2516 1
+4099 2535 1
+4099 2592 1
+4099 2774 1
+4099 2775 1
+4099 2790 1
+4099 2925 1
+4099 3089 1
+4099 3092 1
+4099 3191 1
+4099 3238 1
+4099 3271 1
+4099 3274 1
+4099 3291 1
+4099 3334 1
+4099 3417 1
+4099 3452 1
+4099 3453 1
+4099 3455 1
+4099 3456 1
+4099 3459 1
+4099 3460 1
+4099 3498 1
+4099 3634 1
+4099 3635 1
+4099 3643 1
+4099 3755 1
+4099 3796 1
+4099 3830 1
+4099 3843 1
+4099 3897 1
+4099 3910 1
+4099 3958 1
+4099 4041 1
+4099 4110 1
+4099 4233 1
+4099 4335 1
+4099 4355 1
+4099 4361 1
+4099 4466 1
+4099 4483 1
+4099 4530 1
+4099 4536 1
+4099 4547 1
+4099 4645 1
+4099 4661 1
+4099 4662 1
+4099 4666 1
+4099 4677 1
+4099 4712 1
+4099 4713 1
+4099 4715 1
+4099 4728 1
+4099 4776 1
+4099 4778 1
+4099 4780 1
+4099 4781 1
+4099 4811 1
+4099 4822 1
+4099 4828 1
+4099 4831 1
+4099 4846 1
+4099 4875 1
+4099 4884 1
+4099 4899 1
+4099 4977 1
+4099 4993 1
+4099 5022 1
+4099 5028 1
+4099 5033 1
+4099 5058 1
+4099 5083 1
+4099 5100 1
+4099 5123 1
+4099 5176 1
+4099 5178 1
+4099 5188 1
+4099 5189 1
+4099 5204 1
+4099 5208 1
+4099 5210 1
+4099 5215 1
+4099 5226 1
+4099 5233 1
+4099 5262 1
+4099 5263 1
+4099 5321 1
+4099 5412 1
+4099 5423 1
+4099 5449 1
+4099 5459 1
+4099 5463 1
+4099 5484 1
+4099 5524 1
+4099 5527 1
+4099 5545 1
+4099 5563 1
+4099 5605 1
+4099 5624 1
+4099 5637 1
+4099 5671 1
+4099 5680 1
+4099 5684 1
+4099 5697 1
+4099 5714 1
+4099 5743 1
+4099 5760 1
+4099 5800 1
+4099 5818 1
+4099 5827 1
+4099 5828 1
+4099 5871 1
+4099 5886 1
+4099 5897 1
+4099 5902 1
+4099 6006 1
+4099 6123 1
+4099 6124 1
+4099 6299 1
+4099 6306 1
+4099 6437 1
+4099 6481 1
+4099 6505 1
+4099 6566 1
+4099 6596 1
+4099 6714 1
+4099 6770 1
+4099 6789 1
+4099 6890 1
+4099 6913 1
+4099 6934 1
+4099 6951 1
+4099 6979 1
+4099 7092 1
+4099 7553 1
+4099 7632 1
+4099 8178 1
+4099 8295 1
+4103 4798 1
+4110 5055 1
+4110 6914 1
+4110 7553 1
+4110 7803 1
+4108 4110 1
+4104 2354 1
+4104 3352 1
+4104 4110 1
+4105 4110 1
+4109 4110 1
+4106 4110 1
+4107 4110 1
+4111 1140 1
+4111 2871 1
+4111 3125 1
+4111 3463 1
+4111 3645 1
+4111 4173 1
+4111 4216 1
+4111 4256 1
+4111 4263 1
+4111 4269 1
+4111 4290 1
+4111 4297 1
+4111 4331 1
+4111 4422 1
+4111 4424 1
+4111 4453 1
+4116 2160 1
+4116 2398 1
+4116 3002 1
+4116 3755 1
+4116 4037 1
+4116 4117 1
+4116 4796 1
+4116 4820 1
+4116 5484 1
+4116 7050 1
+4116 7632 1
+4116 8168 1
+4119 1239 1
+4119 2958 1
+4119 2981 1
+4119 3352 1
+4119 4110 1
+4119 4706 1
+4120 1239 1
+4120 2328 1
+4120 2958 1
+4121 978 1
+4121 2328 1
+4076 15 1
+4076 72 1
+4076 346 1
+4076 762 1
+4076 852 1
+4076 1159 1
+4076 1239 1
+4076 1984 1
+4076 2066 1
+4076 2134 1
+4076 2144 1
+4076 2160 1
+4076 2328 1
+4076 2381 1
+4076 2398 1
+4076 2433 1
+4076 2456 1
+4076 2516 1
+4076 2535 1
+4076 2696 1
+4076 2790 1
+4076 2859 1
+4076 2932 1
+4076 2958 1
+4076 3276 1
+4076 3291 1
+4076 3321 1
+4076 3334 1
+4076 3352 1
+4076 3394 1
+4076 3454 1
+4076 3456 1
+4076 3463 1
+4076 3615 1
+4076 3631 1
+4076 3748 1
+4076 3787 1
+4076 3813 1
+4076 3898 1
+4076 3912 1
+4076 3976 1
+4076 4013 1
+4076 4037 1
+4076 4103 1
+4076 4138 1
+4076 4179 1
+4076 4201 1
+4076 4212 1
+4076 4218 1
+4076 4233 1
+4076 4247 1
+4076 4256 1
+4076 4263 1
+4076 4266 1
+4076 4269 1
+4076 4290 1
+4076 4335 1
+4076 4480 1
+4076 4662 1
+4076 4719 1
+4076 4735 1
+4076 4776 1
+4076 4796 1
+4076 4797 1
+4076 4808 1
+4076 4811 1
+4076 4814 1
+4076 4828 1
+4076 5072 1
+4076 5100 1
+4076 5106 1
+4076 5115 1
+4076 5130 1
+4076 5132 1
+4076 5176 1
+4076 5210 1
+4076 5285 1
+4076 5592 1
+4076 5640 1
+4076 5804 1
+4076 6634 1
+4076 6720 1
+4076 6770 1
+4076 6858 1
+4076 6914 1
+4076 7063 1
+4122 2328 1
+4123 1157 1
+4123 1239 1
+4123 2066 1
+4123 2134 1
+4123 2289 1
+4123 2328 1
+4123 2612 1
+4123 2790 1
+4123 2811 1
+4123 3291 1
+4123 3394 1
+4123 3463 1
+4123 3615 1
+4123 3631 1
+4123 4013 1
+4123 4072 1
+4123 4179 1
+4123 4247 1
+4123 4256 1
+4123 4263 1
+4123 4269 1
+4123 4323 1
+4123 4402 1
+4123 4578 1
+4123 4735 1
+4124 15 1
+4124 72 1
+4124 737 1
+4124 762 1
+4124 978 1
+4124 1157 1
+4124 1239 1
+4124 1549 1
+4124 1990 1
+4124 2066 1
+4124 2072 1
+4124 2129 1
+4124 2134 1
+4124 2229 1
+4124 2289 1
+4124 2326 1
+4124 2328 1
+4124 2364 1
+4124 2499 1
+4124 2565 1
+4124 2612 1
+4124 2790 1
+4124 2811 1
+4124 2900 1
+4124 3276 1
+4124 3352 1
+4124 3394 1
+4124 3439 1
+4124 3447 1
+4124 3463 1
+4124 3537 1
+4124 3568 1
+4124 3615 1
+4124 3631 1
+4124 3660 1
+4124 3724 1
+4124 4037 1
+4124 4138 1
+4124 4191 1
+4124 4201 1
+4124 4220 1
+4124 4247 1
+4124 4290 1
+4124 4323 1
+4124 4332 1
+4124 4365 1
+4124 4385 1
+4124 4424 1
+4124 5022 1
+4124 7478 1
+4125 2328 1
+4125 4055 1
+4126 2328 1
+4126 6624 1
+4127 762 1
+4127 1984 1
+4127 2066 1
+4127 2134 1
+4127 2144 1
+4127 2237 1
+4127 2240 1
+4127 2328 1
+4127 2369 1
+4127 2381 1
+4127 2398 1
+4127 2871 1
+4127 3014 1
+4127 3192 1
+4127 3276 1
+4127 3291 1
+4127 3443 1
+4127 3447 1
+4127 3452 1
+4127 3631 1
+4127 3724 1
+4127 3787 1
+4127 3812 1
+4127 3976 1
+4127 4011 1
+4127 4040 1
+4127 4044 1
+4127 4191 1
+4127 4256 1
+4127 4298 1
+4127 4402 1
+4127 4424 1
+4127 4463 1
+4127 4528 1
+4127 4531 1
+4127 4578 1
+4127 4811 1
+4127 4938 1
+4127 4999 1
+4127 5055 1
+4127 5058 1
+4128 1239 1
+4128 2066 1
+4128 2328 1
+4128 2932 1
+4128 2958 1
+4128 3192 1
+4128 3291 1
+4128 4237 1
+4128 4256 1
+4129 2328 1
+4129 7688 1
+4130 2328 1
+4130 4983 1
+4131 2328 1
+4132 2328 1
+4133 2328 1
+4133 3956 1
+4134 2328 1
+4134 6600 1
+4135 2328 1
+4135 2958 1
+4136 1157 1
+4136 2134 1
+4136 2328 1
+4136 2932 1
+4136 3192 1
+4136 3291 1
+4136 3394 1
+4136 3615 1
+4136 3631 1
+4136 3787 1
+4136 3813 1
+4136 3976 1
+4136 4013 1
+4136 4138 1
+4136 4201 1
+4136 4216 1
+4136 4233 1
+4136 4247 1
+4136 4256 1
+4136 4263 1
+4136 4269 1
+4136 4290 1
+4136 4323 1
+4136 5301 1
+4136 5928 1
+4136 5947 1
+4137 2328 1
+4137 3192 1
+4137 3568 1
+4137 4256 1
+4137 4289 1
+4137 4323 1
+4137 4402 1
+4138 608 1
+4138 737 1
+4138 1239 1
+4138 1990 1
+4138 2001 1
+4138 2289 1
+4138 2328 1
+4138 2398 1
+4138 2516 1
+4138 2565 1
+4138 2612 1
+4138 2646 1
+4138 2764 1
+4138 2831 1
+4138 2859 1
+4138 2932 1
+4138 3125 1
+4138 3144 1
+4138 3192 1
+4138 3274 1
+4138 3439 1
+4138 3456 1
+4138 3568 1
+4138 3645 1
+4138 3785 1
+4138 3958 1
+4138 4013 1
+4138 4191 1
+4138 4231 1
+4138 4234 1
+4138 4254 1
+4138 4256 1
+4138 4289 1
+4138 4290 1
+4138 4299 1
+4138 4335 1
+4138 4417 1
+4138 4422 1
+4138 4424 1
+4138 4453 1
+4138 4463 1
+4138 4466 1
+4138 4480 1
+4138 4485 1
+4138 4500 1
+4138 4530 1
+4138 4600 1
+4138 4653 1
+4138 4666 1
+4138 4797 1
+4138 4929 1
+4138 4964 1
+4138 4986 1
+4138 5155 1
+4138 5189 1
+4138 5484 1
+4138 5506 1
+4138 5509 1
+4138 5568 1
+4138 5637 1
+4138 5650 1
+4138 5651 1
+4138 5732 1
+4138 5737 1
+4139 2328 1
+4140 1024 1
+4140 2328 1
+4140 4201 1
+4140 5064 1
+4140 5605 1
+4140 5614 1
+4140 6715 1
+4140 6739 1
+4140 7233 1
+4140 8168 1
+4140 8174 1
+4140 8192 1
+4141 1990 1
+4141 2328 1
+4141 3125 1
+4141 3568 1
+4141 4299 1
+4142 1688 1
+4142 1729 1
+4142 1990 1
+4142 2240 1
+4142 2328 1
+4142 2517 1
+4142 2565 1
+4142 2612 1
+4142 2646 1
+4142 3034 1
+4142 3125 1
+4142 3144 1
+4142 3192 1
+4142 3309 1
+4142 3352 1
+4142 3394 1
+4142 3439 1
+4142 3453 1
+4142 3460 1
+4142 3635 1
+4142 3645 1
+4142 3660 1
+4142 3661 1
+4142 4256 1
+4142 4289 1
+4142 4290 1
+4142 4299 1
+4142 4359 1
+4142 4402 1
+4142 4422 1
+4142 4424 1
+4142 4480 1
+4142 4558 1
+4142 4646 1
+4142 4713 1
+4142 4735 1
+4142 5301 1
+4143 2328 1
+4144 15 1
+4144 406 1
+4144 762 1
+4144 896 1
+4144 1026 1
+4144 1157 1
+4144 1305 1
+4144 1352 1
+4144 1385 1
+4144 1680 1
+4144 2066 1
+4144 2145 1
+4144 2160 1
+4144 2328 1
+4144 2354 1
+4144 2398 1
+4144 2490 1
+4144 2774 1
+4144 2775 1
+4144 2790 1
+4144 2859 1
+4144 2958 1
+4144 3191 1
+4144 3393 1
+4144 3394 1
+4144 3447 1
+4144 3455 1
+4144 3498 1
+4144 3586 1
+4144 3812 1
+4144 3813 1
+4144 3976 1
+4144 4037 1
+4144 4065 1
+4144 4138 1
+4144 4175 1
+4144 4179 1
+4144 4191 1
+4144 4218 1
+4144 4256 1
+4144 4289 1
+4144 4335 1
+4144 4795 1
+4144 4797 1
+4144 4983 1
+4144 5020 1
+4144 5144 1
+4144 5210 1
+4144 5245 1
+4144 5254 1
+4144 5263 1
+4144 5301 1
+4144 5321 1
+4144 5392 1
+4144 5449 1
+4144 5457 1
+4144 5463 1
+4144 5626 1
+4144 5721 1
+4144 5732 1
+4144 5743 1
+4144 5850 1
+4144 5863 1
+4144 5886 1
+4144 5928 1
+4144 6006 1
+4144 6221 1
+4144 6246 1
+4144 6255 1
+4144 6262 1
+4144 6296 1
+4144 6299 1
+4144 6323 1
+4144 6328 1
+4144 6634 1
+4144 6725 1
+4145 2328 1
+4145 5061 1
+4146 2328 1
+4147 2328 1
+4147 4463 1
+4148 1990 1
+4148 2289 1
+4148 2328 1
+4148 4349 1
+4148 4403 1
+4148 4411 1
+4149 2328 1
+4149 3089 1
+4150 291 1
+4150 346 1
+4150 1548 1
+4150 1680 1
+4150 2328 1
+4150 2775 1
+4150 3073 1
+4150 3334 1
+4150 3352 1
+4150 3748 1
+4150 3835 1
+4150 3976 1
+4150 4191 1
+4150 4531 1
+4150 4735 1
+4150 4875 1
+4151 762 1
+4151 1185 1
+4151 1549 1
+4151 1688 1
+4151 1769 1
+4151 1799 1
+4151 2144 1
+4151 2145 1
+4151 2328 1
+4151 2381 1
+4151 2516 1
+4151 2592 1
+4151 2696 1
+4151 2760 1
+4151 2775 1
+4151 2871 1
+4151 3027 1
+4151 3034 1
+4151 3073 1
+4151 3125 1
+4151 3144 1
+4151 3238 1
+4151 3321 1
+4151 3352 1
+4151 3443 1
+4151 3447 1
+4151 3453 1
+4151 3454 1
+4151 3456 1
+4151 3537 1
+4151 3568 1
+4151 3586 1
+4151 3615 1
+4151 3643 1
+4151 3645 1
+4151 3660 1
+4151 3664 1
+4151 3796 1
+4151 3843 1
+4151 3897 1
+4151 4011 1
+4151 4040 1
+4151 4072 1
+4151 4124 1
+4151 4234 1
+4151 4247 1
+4151 4400 1
+4151 4422 1
+4151 4463 1
+4151 4531 1
+4151 4558 1
+4151 4562 1
+4151 4578 1
+4151 4587 1
+4151 4600 1
+4151 4613 1
+4151 4662 1
+4151 4666 1
+4151 4712 1
+4151 4827 1
+4151 5055 1
+4151 5100 1
+4151 5115 1
+4151 5144 1
+4151 5188 1
+4151 5254 1
+4151 5459 1
+4151 5637 1
+4151 5714 1
+4151 5743 1
+4151 5799 1
+4151 5817 1
+4151 5818 1
+4151 5844 1
+4151 6166 1
+4151 6306 1
+4151 6523 1
+4151 6600 1
+4151 6914 1
+4151 7115 1
+4151 7280 1
+4151 7443 1
+4151 7553 1
+4151 7862 1
+4152 737 1
+4152 762 1
+4152 1688 1
+4152 2145 1
+4152 2328 1
+4152 2381 1
+4152 2433 1
+4152 2565 1
+4152 2592 1
+4152 2646 1
+4152 2790 1
+4152 2871 1
+4152 3014 1
+4152 3125 1
+4152 3144 1
+4152 3352 1
+4152 3439 1
+4152 3443 1
+4152 3453 1
+4152 3454 1
+4152 3568 1
+4152 3615 1
+4152 3660 1
+4152 3724 1
+4152 3806 1
+4152 3843 1
+4152 4011 1
+4152 4044 1
+4152 4233 1
+4152 4234 1
+4152 4266 1
+4152 4297 1
+4152 4298 1
+4152 4335 1
+4152 4351 1
+4152 4424 1
+4152 4485 1
+4152 4531 1
+4152 4562 1
+4152 4613 1
+4152 4666 1
+4152 4820 1
+4152 5144 1
+4153 2328 1
+4154 2328 1
+4159 2653 1
+4159 4220 1
+4162 2134 1
+4162 3452 1
+4162 4201 1
+4162 4263 1
+4162 4269 1
+4162 4289 1
+4162 4290 1
+4162 4709 1
+4162 4981 1
+4162 5037 1
+4162 5055 1
+4162 6496 1
+4162 7620 1
+4162 7632 1
+4162 7871 1
+4162 7912 1
+4163 4055 1
+4163 4162 1
+4164 4162 1
+4164 4341 1
+4164 6907 1
+4165 4055 1
+4166 4055 1
+4155 1239 1
+4155 2066 1
+4155 2958 1
+4155 3615 1
+4155 4055 1
+4167 4168 1
+4169 1239 1
+4169 4216 1
+4169 4265 1
+4169 5233 1
+4169 6613 1
+4169 6789 1
+4169 6832 1
+4169 7262 1
+4169 7351 1
+4170 4171 1
+4174 4179 1
+4175 15 1
+4175 3498 1
+4175 4179 1
+4175 4712 1
+4175 5233 1
+4175 6006 1
+4175 6148 1
+4175 6498 1
+4176 4179 1
+4177 4179 1
+4178 4179 1
+4178 4191 1
+4178 4351 1
+4180 4181 1
+3819 2134 1
+3819 2859 1
+3819 2958 1
+3819 3631 1
+3819 3787 1
+3819 4013 1
+3819 4181 1
+3819 4233 1
+3819 4235 1
+3819 4424 1
+4184 2859 1
+4185 2859 1
+4186 291 1
+4186 2859 1
+4186 3334 1
+4186 4191 1
+4186 4827 1
+4186 5445 1
+4187 1310 1
+4187 1360 1
+4187 2576 1
+4187 2859 1
+4187 4037 1
+4187 4531 1
+4187 6006 1
+4187 6422 1
+4187 7908 1
+4189 737 1
+4189 1990 1
+4189 2066 1
+4189 3192 1
+4189 3394 1
+4189 3643 1
+4189 4298 1
+4189 4315 1
+4189 4557 1
+4189 4666 1
+4189 5288 1
+4190 15 1
+4190 2066 1
+4194 2066 1
+4194 4485 1
+4191 737 1
+4191 2066 1
+4191 2134 1
+4191 2144 1
+4191 2398 1
+4191 3125 1
+4191 3334 1
+4191 3456 1
+4191 4138 1
+4191 4400 1
+4191 4531 1
+4191 4557 1
+4191 4558 1
+4191 4987 1
+4191 5002 1
+4191 5274 1
+4191 5412 1
+4191 5848 1
+4191 6323 1
+4191 7632 1
+4192 2066 1
+4192 5012 1
+4192 5484 1
+4192 5998 1
+4192 6736 1
+4192 6873 1
+4192 7094 1
+4195 2066 1
+4197 762 1
+4197 3144 1
+4197 3615 1
+4197 4013 1
+4197 4199 1
+4197 4412 1
+4197 4551 1
+4198 3898 1
+4199 1961 1
+4199 2144 1
+4199 2433 1
+4199 3787 1
+4199 3898 1
+4199 4233 1
+4199 4247 1
+4199 4463 1
+4201 2134 1
+4201 4216 1
+4200 1498 1
+4200 4040 1
+4200 4201 1
+4200 6634 1
+4200 7144 1
+4207 4201 1
+4208 4201 1
+4208 4247 1
+4202 4201 1
+4203 4201 1
+4204 4201 1
+4204 5204 1
+3995 896 1
+3995 2276 1
+3995 2516 1
+3995 2535 1
+3995 3015 1
+3995 3089 1
+3995 3394 1
+3995 3456 1
+3995 3479 1
+3995 3498 1
+3995 3586 1
+3995 3634 1
+3995 3796 1
+3995 3897 1
+3995 4041 1
+3995 4098 1
+3995 4099 1
+3995 4201 1
+3995 4310 1
+3995 4335 1
+3995 4448 1
+3995 4482 1
+3995 4547 1
+3995 4574 1
+3995 4587 1
+3995 4645 1
+3995 4653 1
+3995 4712 1
+3995 4715 1
+3995 4824 1
+3995 4828 1
+3995 4846 1
+3995 4899 1
+3995 4964 1
+3995 5061 1
+3995 5144 1
+3995 5155 1
+3995 5178 1
+3995 5188 1
+3995 5200 1
+3995 5204 1
+3995 5273 1
+3995 5321 1
+3995 5437 1
+3995 5457 1
+3995 5459 1
+3995 5637 1
+3995 5680 1
+3995 5743 1
+3995 5757 1
+3995 5780 1
+3995 5827 1
+3995 5848 1
+3995 5886 1
+3995 5891 1
+3995 5947 1
+3995 6576 1
+4209 4201 1
+4205 4037 1
+4205 4201 1
+4205 4297 1
+4205 4335 1
+4205 5963 1
+4210 4201 1
+4206 4201 1
+4211 346 1
+4211 978 1
+4211 1385 1
+4211 1729 1
+4211 1990 1
+4211 2289 1
+4211 2326 1
+4211 2456 1
+4211 2516 1
+4211 2565 1
+4211 2646 1
+4211 2696 1
+4211 2790 1
+4211 2811 1
+4211 2940 1
+4211 3291 1
+4211 3321 1
+4211 3334 1
+4211 3352 1
+4211 3439 1
+4211 3455 1
+4211 3460 1
+4211 3537 1
+4211 3568 1
+4211 3635 1
+4211 3661 1
+4211 3796 1
+4211 3813 1
+4211 4037 1
+4211 4040 1
+4211 4191 1
+4211 4212 1
+4211 4234 1
+4211 4261 1
+4211 4297 1
+4211 4335 1
+4211 4373 1
+4211 4385 1
+4211 4386 1
+4211 4402 1
+4211 4417 1
+4211 4471 1
+4211 4661 1
+4211 4662 1
+4211 4666 1
+4211 4706 1
+4211 4719 1
+4211 4735 1
+4211 4780 1
+4211 4796 1
+4211 4811 1
+4211 4827 1
+4211 5055 1
+4211 5073 1
+4211 5083 1
+4211 5092 1
+4211 5199 1
+4211 5233 1
+4211 5445 1
+4211 5800 1
+4211 7237 1
+4211 7295 1
+4211 7362 1
+4211 7478 1
+4211 7553 1
+4212 72 1
+4212 737 1
+4212 2145 1
+4212 2237 1
+4212 2289 1
+4212 2516 1
+4212 2775 1
+4212 2785 1
+4212 2917 1
+4212 3433 1
+4212 3439 1
+4212 3443 1
+4212 3447 1
+4212 3452 1
+4212 3456 1
+4212 3537 1
+4212 3808 1
+4212 4040 1
+4212 4103 1
+4212 4124 1
+4212 4191 1
+4212 4448 1
+4212 4483 1
+4212 4529 1
+4212 4547 1
+4212 4551 1
+4212 4587 1
+4212 4631 1
+4212 4639 1
+4212 4666 1
+4212 4777 1
+4212 4780 1
+4212 4798 1
+4212 4815 1
+4212 4875 1
+4212 4983 1
+4212 4999 1
+4212 5123 1
+4212 5130 1
+4212 5178 1
+4212 5210 1
+4212 5245 1
+4212 5255 1
+4212 5271 1
+4212 5311 1
+4212 5326 1
+4212 5350 1
+4212 5362 1
+4212 5375 1
+4212 5635 1
+4212 5737 1
+4212 5740 1
+4212 6571 1
+4215 2612 1
+4215 3439 1
+4213 3439 1
+4213 4191 1
+4213 4365 1
+4214 2129 1
+4214 3144 1
+4214 3439 1
+4214 3568 1
+4214 3645 1
+4214 4138 1
+4214 4234 1
+4214 4422 1
+4214 4424 1
+4216 3140 1
+4217 4218 1
+4219 762 1
+4219 1024 1
+4219 1305 1
+4219 1680 1
+4219 1769 1
+4219 2144 1
+4219 2145 1
+4219 2240 1
+4219 2354 1
+4219 2364 1
+4219 2369 1
+4219 2381 1
+4219 2433 1
+4219 2456 1
+4219 2516 1
+4219 2517 1
+4219 2592 1
+4219 2696 1
+4219 2760 1
+4219 2790 1
+4219 2811 1
+4219 2822 1
+4219 2831 1
+4219 2871 1
+4219 3002 1
+4219 3014 1
+4219 3092 1
+4219 3106 1
+4219 3284 1
+4219 3309 1
+4219 3321 1
+4219 3334 1
+4219 3352 1
+4219 3433 1
+4219 3443 1
+4219 3453 1
+4219 3456 1
+4219 3607 1
+4219 3635 1
+4219 3643 1
+4219 3691 1
+4219 3748 1
+4219 3813 1
+4219 3835 1
+4219 3843 1
+4219 3897 1
+4219 3898 1
+4219 3956 1
+4219 3958 1
+4219 3976 1
+4219 4011 1
+4219 4037 1
+4219 4040 1
+4219 4044 1
+4219 4103 1
+4219 4124 1
+4219 4189 1
+4219 4212 1
+4219 4261 1
+4219 4266 1
+4219 4297 1
+4219 4335 1
+4219 4400 1
+4219 4401 1
+4219 4528 1
+4219 4529 1
+4219 4547 1
+4219 4578 1
+4219 4600 1
+4219 4613 1
+4219 4620 1
+4219 4661 1
+4219 4662 1
+4219 4678 1
+4219 4706 1
+4219 4713 1
+4219 4717 1
+4219 4719 1
+4219 4728 1
+4219 4735 1
+4219 4776 1
+4219 4792 1
+4219 4796 1
+4219 4808 1
+4219 4811 1
+4219 4814 1
+4219 4820 1
+4219 4827 1
+4219 4828 1
+4219 4929 1
+4219 4962 1
+4219 4964 1
+4219 4987 1
+4219 5022 1
+4219 5026 1
+4219 5073 1
+4219 5092 1
+4219 5106 1
+4219 5130 1
+4219 5132 1
+4219 5144 1
+4219 5162 1
+4219 5204 1
+4219 5208 1
+4219 5239 1
+4219 5301 1
+4219 5323 1
+4219 5459 1
+4219 5559 1
+4219 5800 1
+4219 5817 1
+4219 8296 1
+4220 2240 1
+4220 3443 1
+4220 3976 1
+4222 762 1
+4222 1305 1
+4222 1648 1
+4222 1688 1
+4222 2145 1
+4222 2240 1
+4222 2354 1
+4222 2381 1
+4222 2398 1
+4222 2433 1
+4222 2516 1
+4222 2790 1
+4222 2871 1
+4222 3125 1
+4222 3140 1
+4222 3274 1
+4222 3352 1
+4222 3635 1
+4222 3724 1
+4222 3806 1
+4222 3812 1
+4222 3922 1
+4222 3962 1
+4222 3976 1
+4222 4199 1
+4222 4335 1
+4222 4463 1
+4222 4510 1
+4222 4528 1
+4222 4536 1
+4222 4578 1
+4222 4646 1
+4222 4666 1
+4222 5083 1
+4222 5120 1
+4222 5132 1
+4222 5179 1
+4222 5204 1
+4222 5790 1
+4222 5817 1
+4222 7924 1
+4223 1157 1
+4223 2240 1
+4223 2326 1
+4223 3443 1
+4223 3976 1
+4223 4138 1
+4223 5850 1
+4224 1984 1
+4224 2240 1
+4224 2517 1
+4224 2790 1
+4224 3309 1
+4224 3352 1
+4224 3635 1
+4224 4040 1
+4224 4266 1
+4224 4605 1
+4224 4661 1
+4224 4735 1
+4224 4776 1
+4224 4811 1
+4224 5022 1
+4224 6875 1
+4224 7620 1
+4221 2240 1
+4221 2535 1
+4221 3014 1
+4221 3238 1
+4221 3274 1
+4221 3284 1
+4221 3447 1
+4221 3459 1
+4221 3796 1
+4221 4037 1
+4221 4099 1
+4221 4134 1
+4221 4323 1
+4221 4483 1
+4221 4536 1
+4221 4547 1
+4221 4653 1
+4221 4828 1
+4221 4977 1
+4221 5002 1
+4221 5200 1
+4221 5226 1
+4221 5254 1
+4221 5295 1
+4221 5459 1
+4221 5484 1
+4221 5714 1
+4221 5818 1
+4221 5871 1
+4221 6001 1
+4221 6032 1
+4221 6124 1
+4221 6720 1
+4221 6774 1
+4221 6840 1
+4221 6869 1
+4221 6934 1
+4221 7063 1
+4221 7510 1
+4221 7699 1
+4221 7778 1
+4221 8295 1
+4225 2240 1
+4228 3615 1
+4228 4138 1
+4228 4231 1
+4231 3615 1
+4233 3284 1
+4233 5204 1
+4232 4233 1
+4232 4485 1
+4232 4561 1
+4234 2289 1
+4234 4233 1
+4234 4424 1
+4093 4235 1
+4236 4237 1
+4009 1024 1
+4009 3631 1
+4238 3631 1
+4240 4247 1
+4243 4247 1
+4244 4247 1
+4241 4247 1
+4242 4247 1
+4245 2516 1
+4245 4247 1
+4246 4247 1
+4248 3291 1
+4249 2932 1
+4250 2144 1
+4250 2932 1
+4251 2932 1
+4252 2811 1
+4252 2932 1
+4252 4040 1
+4252 4124 1
+4252 4299 1
+4229 2134 1
+4229 3463 1
+4229 4263 1
+4229 4269 1
+4255 1305 1
+4255 2134 1
+4255 2917 1
+4255 3854 1
+4255 4138 1
+4255 4263 1
+4255 4266 1
+4255 4297 1
+4255 4962 1
+4257 3463 1
+4257 6417 1
+4263 5445 1
+4259 4263 1
+4260 4263 1
+4261 1385 1
+4261 1688 1
+4261 2289 1
+4261 2456 1
+4261 3276 1
+4261 3334 1
+4261 3447 1
+4261 3537 1
+4261 3568 1
+4261 4040 1
+4261 4072 1
+4261 4212 1
+4261 4263 1
+4261 4266 1
+4261 4531 1
+4261 4661 1
+4261 4662 1
+4261 4677 1
+4261 4709 1
+4261 4719 1
+4261 4796 1
+4261 4811 1
+4261 5026 1
+4261 5055 1
+4269 4335 1
+4269 4661 1
+4269 5404 1
+4266 1157 1
+4266 1473 1
+4266 3352 1
+4266 3660 1
+4266 4040 1
+4266 4269 1
+4266 4687 1
+4266 4735 1
+4266 5061 1
+4266 5780 1
+4266 6833 1
+4267 4269 1
+4275 2696 1
+4275 3192 1
+4275 3537 1
+4275 3748 1
+4275 5026 1
+4273 1157 1
+4273 2398 1
+4273 2433 1
+4273 2612 1
+4273 3014 1
+4273 3192 1
+4273 3276 1
+4273 3454 1
+4273 3568 1
+4273 4256 1
+4273 4299 1
+4273 4349 1
+4273 4373 1
+4273 4384 1
+4273 4578 1
+4273 4613 1
+4273 4709 1
+4273 5626 1
+4273 6170 1
+4273 6613 1
+4273 6715 1
+4273 6788 1
+4273 7315 1
+4276 737 1
+4276 896 1
+4276 1247 1
+4276 1473 1
+4276 1548 1
+4276 1733 1
+4276 2001 1
+4276 2258 1
+4276 2507 1
+4276 2516 1
+4276 2592 1
+4276 2605 1
+4276 2822 1
+4276 2831 1
+4276 2909 1
+4276 3027 1
+4276 3089 1
+4276 3092 1
+4276 3192 1
+4276 3352 1
+4276 3417 1
+4276 3456 1
+4276 3460 1
+4276 3586 1
+4276 3643 1
+4276 3664 1
+4276 3796 1
+4276 3910 1
+4276 3958 1
+4276 4041 1
+4276 4247 1
+4276 4338 1
+4276 4400 1
+4276 4527 1
+4276 4547 1
+4276 4600 1
+4276 4929 1
+4276 4964 1
+4276 5072 1
+4276 5144 1
+4276 5189 1
+4276 5204 1
+4276 5226 1
+4276 5423 1
+4276 5430 1
+4276 5568 1
+4276 5637 1
+4276 5651 1
+4276 5737 1
+4276 5743 1
+4276 5775 1
+4276 6229 1
+213 3192 1
+4277 3192 1
+4274 3192 1
+4278 3192 1
+4279 3192 1
+4280 3192 1
+4282 3334 1
+4282 4037 1
+4282 4256 1
+4282 4335 1
+4282 4588 1
+4282 4796 1
+4283 4256 1
+4284 4256 1
+4285 4256 1
+4285 4962 1
+4290 3394 1
+4290 4531 1
+4291 4037 1
+4291 4290 1
+4291 6009 1
+4291 6306 1
+4292 737 1
+4292 2398 1
+4292 3568 1
+4292 4290 1
+4295 2369 1
+4295 2565 1
+4295 3125 1
+4295 3284 1
+4295 3645 1
+4295 3796 1
+4295 3813 1
+4295 4189 1
+4295 4297 1
+4295 4299 1
+4295 4500 1
+4295 4536 1
+4295 4828 1
+4295 5100 1
+4295 5144 1
+4295 5459 1
+4295 5743 1
+4296 4299 1
+4297 15 1
+4297 737 1
+4297 2276 1
+4297 2354 1
+4297 2398 1
+4297 2440 1
+4297 2535 1
+4297 3089 1
+4297 3125 1
+4297 3334 1
+4297 3645 1
+4297 3691 1
+4297 3898 1
+4297 4191 1
+4297 4299 1
+4297 4315 1
+4297 4400 1
+4297 4528 1
+4297 4712 1
+4297 4717 1
+4297 4735 1
+4297 4795 1
+4297 5002 1
+4297 5254 1
+4297 5412 1
+4297 5415 1
+4297 5463 1
+4297 5499 1
+4297 5543 1
+4297 5811 1
+4297 5818 1
+4297 5819 1
+4297 5839 1
+4297 5871 1
+4297 6699 1
+4297 7168 1
+4297 7620 1
+4297 7632 1
+4298 737 1
+4298 3125 1
+4298 3643 1
+4298 4189 1
+4298 4191 1
+4298 4261 1
+4298 4299 1
+4298 4827 1
+4298 5285 1
+4304 1157 1
+4305 1157 1
+4308 608 1
+4308 1157 1
+4308 1548 1
+4308 4191 1
+4308 5140 1
+4308 5162 1
+4308 5543 1
+4306 1157 1
+4307 1157 1
+4307 4349 1
+4307 5817 1
+4312 3447 1
+4312 3568 1
+4312 3645 1
+4312 4578 1
+4312 4728 1
+4313 978 1
+4313 1385 1
+4313 2433 1
+4313 3568 1
+4313 4510 1
+4314 15 1
+4314 3568 1
+4314 5928 1
+4314 6594 1
+4315 15 1
+4315 762 1
+4315 1024 1
+4315 1385 1
+4315 1680 1
+4315 1729 1
+4315 2289 1
+4315 2364 1
+4315 2381 1
+4315 2398 1
+4315 2871 1
+4315 3568 1
+4315 3645 1
+4315 3660 1
+4315 3748 1
+4315 4189 1
+4315 4191 1
+4315 4297 1
+4315 4373 1
+4315 4402 1
+4315 4654 1
+4315 4666 1
+4315 4735 1
+4315 4820 1
+4315 4964 1
+4315 4983 1
+4315 5033 1
+4315 5412 1
+4315 5449 1
+4316 3447 1
+4316 3452 1
+4316 3568 1
+4316 3843 1
+4316 4011 1
+4316 4191 1
+4316 4335 1
+4316 4987 1
+4317 3454 1
+4317 3568 1
+4317 4402 1
+4318 3568 1
+4318 4191 1
+4318 6914 1
+4319 737 1
+4319 3568 1
+4319 5412 1
+4319 5484 1
+4320 3568 1
+4320 4417 1
+4321 3568 1
+4324 1185 1
+4324 1385 1
+4324 2565 1
+4324 3140 1
+4324 3309 1
+4324 3660 1
+4324 4384 1
+4324 4402 1
+4325 2565 1
+4325 4384 1
+4325 4424 1
+4326 2433 1
+4326 2565 1
+4326 3089 1
+4326 4797 1
+4326 5714 1
+4326 5994 1
+4326 6869 1
+4327 2565 1
+4327 4528 1
+4328 2565 1
+4329 762 1
+4329 2516 1
+4329 2565 1
+4329 3092 1
+4329 3724 1
+4329 4219 1
+4329 4463 1
+4329 4666 1
+4329 4712 1
+4329 4735 1
+4329 4828 1
+4329 5106 1
+4331 3634 1
+4331 6174 1
+4338 72 1
+4338 95 1
+4338 608 1
+4338 1026 1
+4338 1473 1
+4338 2001 1
+4338 2354 1
+4338 2398 1
+4338 2535 1
+4338 2775 1
+4338 3084 1
+4338 3291 1
+4338 3352 1
+4338 3458 1
+4338 3459 1
+4338 3537 1
+4338 3554 1
+4338 3607 1
+4338 4037 1
+4338 4191 1
+4338 4600 1
+4338 4709 1
+4338 4712 1
+4338 5045 1
+4338 5254 1
+4338 5412 1
+4338 5423 1
+4338 5449 1
+4338 5563 1
+4338 5714 1
+4338 6004 1
+4338 6229 1
+4338 6422 1
+4338 6566 1
+4338 6613 1
+4338 6739 1
+4338 6789 1
+4338 6833 1
+4338 6855 1
+4338 8295 1
+4333 4191 1
+4333 5412 1
+4334 4191 1
+4335 737 1
+4335 1074 1
+4335 2398 1
+4335 2535 1
+4335 2785 1
+4335 3084 1
+4335 3813 1
+4335 4191 1
+4335 4448 1
+4335 4485 1
+4335 4529 1
+4335 4578 1
+4335 4645 1
+4335 4653 1
+4335 4735 1
+4335 4846 1
+4335 4981 1
+4335 5028 1
+4335 5033 1
+4335 5037 1
+4335 5079 1
+4335 5121 1
+4335 5144 1
+4335 5273 1
+4335 5412 1
+4335 5671 1
+4335 6414 1
+4335 6980 1
+4335 7021 1
+4335 7632 1
+4335 7908 1
+4335 8297 1
+4336 4191 1
+4337 4191 1
+4345 4349 1
+4345 4875 1
+4346 4349 1
+4340 4349 1
+4342 1024 1
+4342 2592 1
+4342 2917 1
+4342 3898 1
+4342 4037 1
+4342 4212 1
+4342 4349 1
+4342 4365 1
+4342 5073 1
+4342 5092 1
+4341 4349 1
+4343 762 1
+4343 1823 1
+4343 4349 1
+4343 5527 1
+4343 6006 1
+4343 6594 1
+4343 6897 1
+4347 967 1
+4347 2223 1
+4347 3554 1
+4347 3806 1
+4347 3962 1
+4347 4037 1
+4347 4349 1
+4347 4435 1
+4347 4507 1
+4347 4613 1
+4347 4983 1
+4347 5064 1
+4347 5246 1
+4347 5466 1
+4347 5819 1
+4347 5933 1
+4347 6032 1
+4347 6174 1
+4347 6330 1
+4347 6414 1
+4347 6422 1
+4347 6914 1
+4347 6918 1
+4347 7021 1
+4347 7063 1
+4347 7341 1
+4347 7517 1
+4347 7574 1
+4347 7620 1
+4347 7701 1
+4347 7778 1
+4347 7879 1
+4347 7908 1
+4347 7924 1
+4347 7927 1
+4347 7946 1
+4347 7952 1
+4347 7961 1
+4347 7979 1
+4347 7992 1
+4347 7994 1
+4347 7996 1
+4347 8042 1
+4347 8079 1
+4347 8090 1
+4347 8121 1
+4347 8128 1
+4347 8130 1
+4347 8134 1
+4347 8168 1
+4347 8169 1
+4347 8174 1
+4347 8198 1
+4347 8212 1
+4347 8224 1
+4344 4349 1
+4344 4373 1
+4344 4384 1
+4348 4349 1
+4351 1990 1
+4351 3724 1
+4351 4510 1
+4351 4531 1
+4352 1990 1
+4353 15 1
+4353 72 1
+4353 737 1
+4353 1247 1
+4353 1799 1
+4353 1990 1
+4353 2001 1
+4353 2258 1
+4353 2354 1
+4353 2398 1
+4353 2516 1
+4353 2822 1
+4353 2831 1
+4353 3015 1
+4353 3027 1
+4353 3417 1
+4353 3456 1
+4353 3634 1
+4353 3897 1
+4353 3910 1
+4353 3976 1
+4353 4037 1
+4353 4071 1
+4353 4099 1
+4353 4127 1
+4353 4310 1
+4353 4335 1
+4353 4338 1
+4353 4400 1
+4353 4448 1
+4353 4587 1
+4353 4600 1
+4353 4713 1
+4353 4828 1
+4353 4846 1
+4353 5020 1
+4353 5155 1
+4353 5178 1
+4353 5189 1
+4353 5226 1
+4353 5262 1
+4353 5288 1
+4353 5326 1
+4353 5327 1
+4353 5335 1
+4353 5387 1
+4353 5392 1
+4353 5412 1
+4353 5423 1
+4353 5445 1
+4353 5449 1
+4353 5454 1
+4353 5459 1
+4353 5482 1
+4353 5484 1
+4353 5506 1
+4353 5509 1
+4353 5514 1
+4353 5539 1
+4353 5637 1
+4353 5683 1
+4353 5693 1
+4353 5713 1
+4353 5732 1
+4353 5743 1
+4353 5775 1
+4353 5844 1
+4353 5886 1
+4353 5925 1
+4353 6229 1
+4353 6262 1
+4353 6296 1
+4353 6328 1
+4353 6634 1
+4353 6780 1
+4353 7092 1
+4353 7301 1
+4353 7809 1
+4353 7910 1
+4353 7961 1
+4354 1990 1
+4354 3284 1
+4354 3443 1
+4354 3452 1
+4354 4335 1
+4354 5100 1
+4355 1733 1
+4355 2001 1
+4355 2014 1
+4355 2364 1
+4355 2822 1
+4355 2831 1
+4355 2902 1
+4355 3089 1
+4355 3092 1
+4355 3352 1
+4355 3417 1
+4355 3447 1
+4355 3453 1
+4355 3455 1
+4355 3459 1
+4355 3537 1
+4355 3634 1
+4355 3661 1
+4355 3796 1
+4355 3843 1
+4355 3897 1
+4355 3910 1
+4355 4400 1
+4355 4448 1
+4355 4483 1
+4355 4530 1
+4355 4531 1
+4355 4600 1
+4355 4653 1
+4355 4654 1
+4355 4748 1
+4355 4953 1
+4355 5020 1
+4355 5155 1
+4355 5176 1
+4355 5204 1
+4355 5215 1
+4355 5323 1
+4355 5341 1
+4355 5412 1
+4355 5415 1
+4355 5459 1
+4355 5509 1
+4355 5713 1
+4355 5737 1
+4355 5775 1
+4355 5778 1
+4355 5780 1
+4355 5784 1
+4355 8295 1
+4357 3661 1
+4358 2612 1
+4360 4365 1
+4361 4365 1
+4361 4666 1
+4361 5288 1
+4361 6946 1
+4361 7115 1
+4361 7201 1
+4364 762 1
+4364 1185 1
+4364 2354 1
+4364 2433 1
+4364 2774 1
+4364 3014 1
+4364 3309 1
+4364 3346 1
+4364 3443 1
+4364 3453 1
+4364 3456 1
+4364 3554 1
+4364 3873 1
+4364 3958 1
+4364 4037 1
+4364 4361 1
+4364 4365 1
+4364 4400 1
+4364 4432 1
+4364 4528 1
+4364 4578 1
+4364 5045 1
+4364 5083 1
+4364 5199 1
+4364 5233 1
+4364 5288 1
+4364 5335 1
+4364 5392 1
+4364 5511 1
+4364 5817 1
+4364 6246 1
+4364 6422 1
+4364 6553 1
+4364 6634 1
+4364 6737 1
+4364 6855 1
+4364 6979 1
+4364 7351 1
+4364 7924 1
+4362 4365 1
+4363 608 1
+4363 2398 1
+4363 2516 1
+4363 2871 1
+4363 3106 1
+4363 3291 1
+4363 3321 1
+4363 3352 1
+4363 3458 1
+4363 3796 1
+4363 3806 1
+4363 3835 1
+4363 4041 1
+4363 4099 1
+4363 4191 1
+4363 4365 1
+4363 4453 1
+4363 4463 1
+4363 4666 1
+4363 5524 1
+4363 5543 1
+4363 5592 1
+4366 1729 1
+4366 4687 1
+2028 1729 1
+4368 4373 1
+4369 4373 1
+4369 4632 1
+4371 762 1
+4371 3125 1
+4371 4219 1
+4371 4373 1
+4371 4557 1
+4371 5100 1
+4370 4373 1
+4372 4373 1
+4375 3660 1
+4375 4099 1
+4375 4384 1
+4377 2145 1
+4377 2871 1
+4377 2917 1
+4377 3034 1
+4377 3334 1
+4377 3958 1
+4377 4044 1
+4377 4384 1
+4377 4661 1
+4377 4719 1
+4377 4875 1
+4378 4384 1
+4383 2223 1
+4383 4384 1
+4383 4401 1
+4383 5807 1
+4379 1688 1
+4379 2516 1
+4379 2871 1
+4379 4384 1
+4379 4661 1
+4380 4384 1
+4381 4384 1
+4382 4384 1
+4393 4402 1
+4394 4402 1
+4399 4402 1
+4322 4402 1
+4395 4402 1
+4395 6736 1
+4395 6755 1
+4400 3976 1
+4400 4040 1
+4400 4219 1
+4400 4402 1
+4400 5412 1
+4396 4402 1
+4397 4402 1
+4398 4040 1
+4398 4400 1
+4398 4401 1
+4398 4402 1
+4398 5925 1
+4398 7092 1
+4398 7544 1
+4398 7561 1
+4398 7757 1
+4404 2289 1
+4408 1385 1
+4405 1385 1
+4412 2398 1
+4412 4417 1
+4414 4417 1
+4415 762 1
+4415 1305 1
+4415 1360 1
+4415 2237 1
+4415 2696 1
+4415 2871 1
+4415 3073 1
+4415 3433 1
+4415 3748 1
+4415 4037 1
+4415 4220 1
+4415 4335 1
+4415 4417 1
+4415 4557 1
+4415 4588 1
+4415 4706 1
+4415 4820 1
+4416 72 1
+4416 1026 1
+4416 2535 1
+4416 3084 1
+4416 4037 1
+4416 4338 1
+4416 4417 1
+4416 5254 1
+4416 5543 1
+4416 5714 1
+4416 6229 1
+4422 840 1
+4422 2646 1
+4422 3293 1
+4422 3645 1
+4422 4037 1
+4422 4424 1
+4422 4453 1
+4422 4875 1
+4422 5829 1
+4422 5922 1
+4422 5963 1
+4422 5969 1
+4422 7108 1
+4422 7517 1
+4422 7620 1
+4423 4424 1
+4425 4297 1
+4425 6334 1
+4426 2696 1
+4426 2871 1
+4426 4613 1
+4426 4666 1
+4426 4828 1
+4427 2871 1
+4428 2364 1
+4428 2381 1
+4428 2871 1
+4428 3537 1
+4428 4037 1
+4428 4044 1
+4428 4124 1
+4428 4297 1
+4428 4938 1
+4428 5092 1
+4428 5222 1
+4428 5848 1
+4429 1688 1
+4429 2386 1
+4429 2517 1
+4429 2871 1
+4429 3812 1
+4429 3854 1
+4429 4335 1
+4429 4468 1
+4429 4485 1
+4429 4531 1
+4429 4557 1
+4429 4661 1
+4430 2871 1
+4430 3014 1
+4430 3443 1
+4430 3958 1
+4430 4620 1
+4430 4621 1
+4431 2144 1
+4431 2871 1
+4431 4261 1
+4431 5288 1
+4432 2851 1
+4432 2871 1
+4432 3796 1
+4432 5103 1
+4432 5814 1
+4432 5818 1
+4432 5925 1
+4432 8212 1
+4433 762 1
+4433 1185 1
+4433 1688 1
+4433 2871 1
+4433 3125 1
+4433 3321 1
+4433 3454 1
+4433 3557 1
+4433 3812 1
+4433 3956 1
+4433 4011 1
+4433 4072 1
+4433 4261 1
+4433 4529 1
+4433 4531 1
+4433 4551 1
+4433 4552 1
+4433 4557 1
+4433 4558 1
+4433 4562 1
+4433 4661 1
+4433 4662 1
+4433 4666 1
+4433 5404 1
+4434 2871 1
+4434 4827 1
+4435 2871 1
+4435 4666 1
+4435 6770 1
+4436 2871 1
+4436 3958 1
+4437 840 1
+4437 1185 1
+4437 2517 1
+4437 2565 1
+4437 2811 1
+4437 2851 1
+4437 2871 1
+4437 3014 1
+4437 3034 1
+4437 3140 1
+4437 3238 1
+4437 3309 1
+4437 3321 1
+4437 3455 1
+4437 3459 1
+4437 3460 1
+4437 3557 1
+4437 3635 1
+4437 3958 1
+4437 4011 1
+4437 4261 1
+4437 4266 1
+4437 4468 1
+4437 4536 1
+4437 4578 1
+4437 4613 1
+4437 4646 1
+4437 4661 1
+4437 4666 1
+4437 4719 1
+4437 4875 1
+4437 5199 1
+4437 5289 1
+4437 5432 1
+4437 5582 1
+4437 5697 1
+4437 5775 1
+4437 5776 1
+4437 5806 1
+4437 5897 1
+4437 5932 1
+4437 6097 1
+4437 6123 1
+4437 6299 1
+4437 6305 1
+4437 6330 1
+4437 6442 1
+4437 6523 1
+4437 6624 1
+4437 6634 1
+4437 6736 1
+4437 6789 1
+4437 6907 1
+4437 6945 1
+4437 6946 1
+4437 6955 1
+4437 6976 1
+4437 6979 1
+4437 7052 1
+4437 7073 1
+4437 7115 1
+4437 7119 1
+4437 7237 1
+4437 7295 1
+4437 7301 1
+4437 7351 1
+4437 7373 1
+4437 7587 1
+4437 7620 1
+4437 7839 1
+4438 15 1
+4438 2871 1
+4438 4040 1
+4438 4400 1
+4438 5204 1
+4438 6257 1
+4439 2871 1
+4440 2144 1
+4440 2871 1
+4440 3014 1
+4440 3956 1
+4440 3958 1
+4440 4613 1
+4441 15 1
+4441 967 1
+4441 1191 1
+4441 1247 1
+4441 1769 1
+4441 1972 1
+4441 1982 1
+4441 2354 1
+4441 2364 1
+4441 2517 1
+4441 2592 1
+4441 2689 1
+4441 2775 1
+4441 2787 1
+4441 2790 1
+4441 2811 1
+4441 2822 1
+4441 2871 1
+4441 2909 1
+4441 3002 1
+4441 3092 1
+4441 3103 1
+4441 3106 1
+4441 3238 1
+4441 3309 1
+4441 3310 1
+4441 3334 1
+4441 3381 1
+4441 3393 1
+4441 3417 1
+4441 3433 1
+4441 3443 1
+4441 3447 1
+4441 3452 1
+4441 3453 1
+4441 3455 1
+4441 3458 1
+4441 3479 1
+4441 3537 1
+4441 3614 1
+4441 3634 1
+4441 3635 1
+4441 3664 1
+4441 3691 1
+4441 3752 1
+4441 3813 1
+4441 3843 1
+4441 3897 1
+4441 3898 1
+4441 3956 1
+4441 3958 1
+4441 3976 1
+4441 4011 1
+4441 4037 1
+4441 4071 1
+4441 4099 1
+4441 4124 1
+4441 4219 1
+4441 4297 1
+4441 4310 1
+4441 4315 1
+4441 4341 1
+4441 4400 1
+4441 4401 1
+4441 4435 1
+4441 4448 1
+4441 4482 1
+4441 4483 1
+4441 4547 1
+4441 4551 1
+4441 4574 1
+4441 4613 1
+4441 4620 1
+4441 4687 1
+4441 4689 1
+4441 4712 1
+4441 4715 1
+4441 4717 1
+4441 4719 1
+4441 4735 1
+4441 4798 1
+4441 4814 1
+4441 4827 1
+4441 4828 1
+4441 4938 1
+4441 4953 1
+4441 4962 1
+4441 4964 1
+4441 4980 1
+4441 4981 1
+4441 4994 1
+4441 4999 1
+4441 5002 1
+4441 5022 1
+4441 5028 1
+4441 5055 1
+4441 5073 1
+4441 5092 1
+4441 5100 1
+4441 5106 1
+4441 5123 1
+4441 5130 1
+4441 5132 1
+4441 5140 1
+4441 5144 1
+4441 5148 1
+4441 5200 1
+4441 5204 1
+4441 5239 1
+4441 5323 1
+4441 5378 1
+4441 5404 1
+4441 5412 1
+4441 5421 1
+4441 5423 1
+4441 5439 1
+4441 5445 1
+4441 5630 1
+4441 5671 1
+4441 5684 1
+4441 5780 1
+4441 5798 1
+4441 5799 1
+4441 5804 1
+4441 5812 1
+4441 5837 1
+4441 5844 1
+4441 5848 1
+4441 5863 1
+4441 5928 1
+4441 5947 1
+4441 6006 1
+4441 6032 1
+4441 6043 1
+4441 6098 1
+4441 6151 1
+4441 6162 1
+4441 6174 1
+4441 6328 1
+4441 6334 1
+4441 6337 1
+4441 6414 1
+4441 6437 1
+4441 6458 1
+4441 6505 1
+4441 6523 1
+4441 6528 1
+4441 6554 1
+4441 6555 1
+4441 6570 1
+4441 6576 1
+4441 6634 1
+4441 6712 1
+4441 6934 1
+4441 6980 1
+4441 7005 1
+4441 7012 1
+4441 7021 1
+4441 7108 1
+4441 7116 1
+4441 7238 1
+4441 7277 1
+4441 7279 1
+4441 7280 1
+4441 7443 1
+4441 7449 1
+4441 7544 1
+4441 7553 1
+4441 7618 1
+4441 7620 1
+4441 7624 1
+4441 7632 1
+4441 7646 1
+4441 7649 1
+4441 7662 1
+4441 7683 1
+4441 7695 1
+4441 7699 1
+4441 7707 1
+4441 7726 1
+4441 7763 1
+4441 7788 1
+4441 7795 1
+4441 7803 1
+4441 7809 1
+4441 7810 1
+4441 7813 1
+4441 7855 1
+4441 7862 1
+4441 7879 1
+4441 7882 1
+4441 7890 1
+4441 7912 1
+4441 7927 1
+4441 8051 1
+4441 8174 1
+4441 8192 1
+4441 8198 1
+4441 8209 1
+4441 8212 1
+4441 8219 1
+4441 8237 1
+4442 1360 1
+4442 2381 1
+4442 2516 1
+4442 2871 1
+4442 2909 1
+4442 3014 1
+4442 3456 1
+4442 4266 1
+4442 4297 1
+4442 4600 1
+4442 4706 1
+4442 4717 1
+4442 4815 1
+4442 4875 1
+4442 5073 1
+4442 5092 1
+4442 5100 1
+4442 5204 1
+4443 2516 1
+4443 2871 1
+4443 3352 1
+4443 4276 1
+4443 4735 1
+4443 5179 1
+4443 5799 1
+4444 2871 1
+4445 2871 1
+4446 2871 1
+4446 4661 1
+4447 72 1
+4447 2456 1
+4447 2871 1
+4447 3084 1
+4447 5002 1
+4447 5818 1
+4447 5860 1
+4447 5872 1
+4447 5925 1
+4447 6422 1
+4447 7553 1
+4447 7561 1
+4447 7862 1
+4447 7912 1
+4448 762 1
+4448 2144 1
+4448 2145 1
+4448 2398 1
+4448 2433 1
+4448 2822 1
+4448 2871 1
+4448 2909 1
+4448 3014 1
+4448 3140 1
+4448 3321 1
+4448 3417 1
+4448 3453 1
+4448 3460 1
+4448 3664 1
+4448 3812 1
+4448 3910 1
+4448 4127 1
+4448 4355 1
+4448 4400 1
+4448 4529 1
+4448 4531 1
+4448 4536 1
+4448 4547 1
+4448 4578 1
+4448 4587 1
+4448 4648 1
+4448 4717 1
+4448 4828 1
+4448 5144 1
+4448 5162 1
+4448 5308 1
+4448 5309 1
+4448 5312 1
+4448 5335 1
+4448 5412 1
+4449 4453 1
+4451 1352 1
+4451 1473 1
+4451 3334 1
+4451 4453 1
+4451 4510 1
+4451 6833 1
+4451 7092 1
+4451 7115 1
+4451 7862 1
+4452 4453 1
+4450 4453 1
+4454 3645 1
+4455 840 1
+4455 3334 1
+4455 3459 1
+4455 3645 1
+4455 4037 1
+4455 4044 1
+4455 4297 1
+4455 4529 1
+4455 4536 1
+4455 4539 1
+4455 4578 1
+4455 4631 1
+4455 4987 1
+4455 5178 1
+4455 5274 1
+4455 5288 1
+4455 5306 1
+4455 6270 1
+4455 6327 1
+4455 6832 1
+4455 7108 1
+4455 7632 1
+4456 3645 1
+4456 5028 1
+4456 5671 1
+4456 7351 1
+4457 3645 1
+4458 4220 1
+4458 4463 1
+4459 2144 1
+4459 3748 1
+4459 4463 1
+4459 5404 1
+4460 4463 1
+4460 4531 1
+4461 4199 1
+4461 4463 1
+2047 4463 1
+4462 4463 1
+4464 4422 1
+4465 2433 1
+4465 3144 1
+4465 4422 1
+4465 4552 1
+4467 4234 1
+4468 222 1
+4468 1688 1
+4468 2258 1
+4468 3456 1
+4468 4011 1
+4468 4234 1
+4468 4448 1
+4468 4557 1
+4468 4977 1
+4468 5020 1
+4468 5215 1
+4468 5245 1
+4468 5271 1
+4468 5321 1
+4468 5545 1
+4468 5592 1
+4468 6529 1
+4468 8295 1
+4469 3144 1
+4471 3664 1
+4471 4712 1
+4470 4471 1
+4473 4480 1
+4474 3453 1
+4474 4480 1
+4477 4261 1
+4477 4480 1
+4476 525 1
+4476 4191 1
+4476 4480 1
+4476 4777 1
+4476 5064 1
+4476 5233 1
+4476 5311 1
+4476 5457 1
+4476 5539 1
+4476 5926 1
+4476 6055 1
+4476 6596 1
+4476 7908 1
+4476 8139 1
+4476 8225 1
+4476 8246 1
+4478 4480 1
+4475 4480 1
+4479 4480 1
+4485 3453 1
+4485 3454 1
+4485 3635 1
+4485 4040 1
+4485 4335 1
+4485 4661 1
+4485 4712 1
+4485 4792 1
+4485 4876 1
+4485 5563 1
+4485 7292 1
+4485 7809 1
+4482 4037 1
+4482 4485 1
+4482 4587 1
+4482 4712 1
+4482 5239 1
+4482 5298 1
+4482 5563 1
+4483 15 1
+4483 1305 1
+4483 1498 1
+4483 1648 1
+4483 2276 1
+4483 2354 1
+4483 2364 1
+4483 2381 1
+4483 2386 1
+4483 2592 1
+4483 2658 1
+4483 2689 1
+4483 2765 1
+4483 3089 1
+4483 3238 1
+4483 3274 1
+4483 3291 1
+4483 3352 1
+4483 3447 1
+4483 3459 1
+4483 3479 1
+4483 3537 1
+4483 3691 1
+4483 3796 1
+4483 3962 1
+4483 4037 1
+4483 4071 1
+4483 4099 1
+4483 4110 1
+4483 4191 1
+4483 4310 1
+4483 4485 1
+4483 4500 1
+4483 4547 1
+4483 4587 1
+4483 4653 1
+4483 4712 1
+4483 4715 1
+4483 4748 1
+4483 4795 1
+4483 4797 1
+4483 4828 1
+4483 4929 1
+4483 4940 1
+4483 4986 1
+4483 4993 1
+4483 5002 1
+4483 5055 1
+4483 5058 1
+4483 5079 1
+4483 5123 1
+4483 5148 1
+4483 5155 1
+4483 5179 1
+4483 5188 1
+4483 5200 1
+4483 5204 1
+4483 5239 1
+4483 5254 1
+4483 5262 1
+4483 5296 1
+4483 5301 1
+4483 5426 1
+4483 5459 1
+4483 5467 1
+4483 5484 1
+4483 5509 1
+4483 5524 1
+4483 5527 1
+4483 5529 1
+4483 5545 1
+4483 5563 1
+4483 5592 1
+4483 5596 1
+4483 5614 1
+4483 5620 1
+4483 5684 1
+4483 5706 1
+4483 5739 1
+4483 5743 1
+4483 5745 1
+4483 5753 1
+4483 5760 1
+4483 5790 1
+4483 5799 1
+4483 5800 1
+4483 5802 1
+4483 5804 1
+4483 5806 1
+4483 5811 1
+4483 5829 1
+4483 5839 1
+4483 5863 1
+4483 5871 1
+4483 5977 1
+4483 5994 1
+4483 6027 1
+4483 6080 1
+4483 6107 1
+4483 6151 1
+4483 6166 1
+4483 6221 1
+4483 6225 1
+4483 6243 1
+4483 6269 1
+4483 6360 1
+4483 6417 1
+4483 6481 1
+4483 6505 1
+4483 6555 1
+4483 6596 1
+4483 6618 1
+4483 6634 1
+4483 6665 1
+4483 6715 1
+4483 6720 1
+4483 6724 1
+4483 6725 1
+4483 6739 1
+4483 6774 1
+4483 6784 1
+4483 6873 1
+4483 6914 1
+4483 6934 1
+4483 6946 1
+4483 6955 1
+4483 6979 1
+4483 7012 1
+4483 7021 1
+4483 7092 1
+4483 7237 1
+4483 7280 1
+4483 7289 1
+4483 7373 1
+4483 7381 1
+4483 7414 1
+4483 7553 1
+4483 7624 1
+4483 7632 1
+4483 7651 1
+4483 7662 1
+4483 7694 1
+4483 7809 1
+4483 7833 1
+4483 7862 1
+4483 7890 1
+4483 7961 1
+4483 8042 1
+4483 8128 1
+4483 8163 1
+4483 8174 1
+4483 8209 1
+4483 8295 1
+4493 762 1
+4486 72 1
+4486 762 1
+4486 1549 1
+4486 2145 1
+4486 2552 1
+4486 3352 1
+4486 3417 1
+4486 3443 1
+4486 3456 1
+4486 3808 1
+4486 3897 1
+4486 4536 1
+4486 4587 1
+4486 4631 1
+4486 4796 1
+4486 4879 1
+4486 5233 1
+4486 5255 1
+4486 5620 1
+4486 5726 1
+4494 762 1
+4495 762 1
+4488 15 1
+4488 737 1
+4488 762 1
+4488 1352 1
+4488 1498 1
+4488 2145 1
+4488 2440 1
+4488 2535 1
+4488 2658 1
+4488 2689 1
+4488 3014 1
+4488 3084 1
+4488 3238 1
+4488 3352 1
+4488 3443 1
+4488 3456 1
+4488 4099 1
+4488 4310 1
+4488 4400 1
+4488 4530 1
+4488 4795 1
+4488 4808 1
+4488 4875 1
+4488 5037 1
+4488 5200 1
+4488 5210 1
+4488 5288 1
+4488 5392 1
+4488 5412 1
+4488 5655 1
+4488 5743 1
+4488 5800 1
+4488 5817 1
+4488 5819 1
+4488 5955 1
+4488 5969 1
+4488 5980 1
+4488 6123 1
+4488 6156 1
+4488 6376 1
+4488 6571 1
+4488 6618 1
+4488 6634 1
+4488 6918 1
+4488 7021 1
+4488 7050 1
+4488 7238 1
+4488 7833 1
+4488 7908 1
+4488 7924 1
+4489 72 1
+4489 762 1
+4489 2535 1
+4489 2775 1
+4489 3238 1
+4489 3456 1
+4489 3498 1
+4489 4037 1
+4489 4191 1
+4489 4661 1
+4489 4811 1
+4489 4828 1
+4489 5254 1
+4489 5412 1
+4489 6334 1
+4490 762 1
+4496 762 1
+4496 2775 1
+4496 7351 1
+4491 762 1
+4497 762 1
+4500 2433 1
+4500 4199 1
+4504 3125 1
+4504 3443 1
+4502 3125 1
+4502 3664 1
+4503 3125 1
+4507 3806 1
+4507 6634 1
+4492 3806 1
+4492 4510 1
+4508 3806 1
+4509 1688 1
+4509 2364 1
+4509 2381 1
+4509 3537 1
+4509 3806 1
+4509 4297 1
+4509 5073 1
+4509 5092 1
+4509 5100 1
+4509 5106 1
+4509 5204 1
+4511 1984 1
+4511 2326 1
+4511 2790 1
+4511 3443 1
+4511 3453 1
+4511 3724 1
+4511 3835 1
+4511 4103 1
+4511 4110 1
+4511 4212 1
+4511 4266 1
+4511 4661 1
+4511 4719 1
+4511 4735 1
+4511 4808 1
+4498 3724 1
+4516 4199 1
+4523 2433 1
+4524 15 1
+4524 4335 1
+4524 4500 1
+4524 4875 1
+4524 5210 1
+4524 5773 1
+4524 6000 1
+4524 7144 1
+4524 7279 1
+4526 3843 1
+4526 4528 1
+4526 4529 1
+4526 4983 1
+4526 4991 1
+4527 525 1
+4527 2342 1
+4527 2369 1
+4527 3537 1
+4527 4528 1
+4527 4536 1
+4527 4645 1
+4527 4748 1
+4527 5044 1
+4527 5083 1
+4527 5130 1
+4527 5176 1
+4527 6755 1
+4527 7257 1
+4531 2398 1
+4531 2760 1
+4531 2775 1
+4531 3140 1
+4531 3352 1
+4531 3454 1
+4531 3557 1
+4531 3956 1
+4531 4219 1
+4531 4578 1
+4531 4583 1
+4531 4584 1
+4531 4588 1
+4531 4735 1
+4530 15 1
+4530 896 1
+4530 3897 1
+4530 4531 1
+4530 4678 1
+4530 4780 1
+4530 5412 1
+4530 5743 1
+4530 7632 1
+4533 4531 1
+4533 5323 1
+4533 5341 1
+4534 737 1
+4534 2516 1
+4534 3352 1
+4534 3456 1
+4534 3498 1
+4534 3796 1
+4534 4040 1
+4534 4191 1
+4534 4531 1
+4534 4648 1
+4534 4712 1
+4534 4796 1
+4534 5178 1
+4534 5545 1
+4534 5623 1
+4534 6914 1
+4534 7005 1
+4534 7879 1
+4534 8178 1
+4535 1688 1
+4535 3537 1
+4535 3812 1
+4535 4531 1
+4535 4578 1
+4536 1026 1
+4536 1733 1
+4536 1982 1
+4536 2258 1
+4536 2364 1
+4536 2381 1
+4536 2398 1
+4536 2790 1
+4536 2831 1
+4536 2917 1
+4536 3000 1
+4536 3276 1
+4536 3284 1
+4536 3334 1
+4536 3393 1
+4536 3447 1
+4536 3459 1
+4536 3643 1
+4536 3813 1
+4536 3854 1
+4536 3898 1
+4536 3922 1
+4536 4191 1
+4536 4219 1
+4536 4297 1
+4536 4298 1
+4536 4335 1
+4536 4338 1
+4536 4529 1
+4536 4530 1
+4536 4531 1
+4536 4557 1
+4536 4578 1
+4536 4653 1
+4536 4666 1
+4536 4792 1
+4536 4795 1
+4536 4899 1
+4536 4953 1
+4536 4962 1
+4536 4964 1
+4536 4983 1
+4536 4986 1
+4536 4993 1
+4536 4999 1
+4536 5022 1
+4536 5037 1
+4536 5043 1
+4536 5044 1
+4536 5045 1
+4536 5055 1
+4536 5058 1
+4536 5072 1
+4536 5073 1
+4536 5100 1
+4536 5189 1
+4536 5226 1
+4536 5254 1
+4536 5412 1
+4536 5500 1
+4536 5529 1
+4536 5539 1
+4536 5563 1
+4536 5650 1
+4536 5655 1
+4536 5694 1
+4536 5743 1
+4536 5775 1
+4536 5802 1
+4536 6004 1
+4536 6596 1
+4536 6714 1
+4536 6720 1
+4536 6790 1
+4536 6907 1
+4536 7054 1
+4536 7168 1
+4536 7378 1
+4536 7553 1
+4536 7632 1
+4536 7649 1
+4538 3812 1
+4540 4541 1
+4542 2914 1
+4542 3334 1
+4542 3897 1
+4542 4544 1
+4542 4786 1
+4542 6006 1
+4542 6422 1
+4542 7434 1
+4542 8083 1
+4543 2398 1
+4543 4544 1
+4545 1688 1
+4547 1688 1
+4547 1769 1
+4547 2014 1
+4547 2144 1
+4547 2145 1
+4547 2760 1
+4547 2775 1
+4547 3014 1
+4547 3140 1
+4547 3276 1
+4547 3447 1
+4547 3453 1
+4547 3454 1
+4547 3458 1
+4547 3460 1
+4547 3537 1
+4547 3796 1
+4547 3854 1
+4547 3956 1
+4547 3958 1
+4547 4037 1
+4547 4044 1
+4547 4072 1
+4547 4189 1
+4547 4298 1
+4547 4557 1
+4547 4613 1
+4547 4648 1
+4547 4666 1
+4547 4735 1
+4547 4792 1
+4547 4828 1
+4547 4875 1
+4547 4938 1
+4547 4946 1
+4547 4953 1
+4547 4962 1
+4547 4999 1
+4547 5044 1
+4547 5055 1
+4547 5058 1
+4547 5083 1
+4547 5115 1
+4547 5144 1
+4547 5459 1
+4550 95 1
+4550 608 1
+4550 737 1
+4550 1247 1
+4550 1549 1
+4550 1733 1
+4550 1799 1
+4550 2258 1
+4550 2354 1
+4550 2398 1
+4550 2516 1
+4550 2764 1
+4550 2822 1
+4550 2831 1
+4550 3027 1
+4550 3089 1
+4550 3092 1
+4550 3103 1
+4550 3393 1
+4550 3417 1
+4550 3456 1
+4550 3459 1
+4550 3460 1
+4550 3897 1
+4550 3910 1
+4550 4037 1
+4550 4099 1
+4550 4191 1
+4550 4247 1
+4550 4335 1
+4550 4355 1
+4550 4400 1
+4550 4448 1
+4550 4530 1
+4550 4600 1
+4550 4653 1
+4550 4666 1
+4550 4712 1
+4550 4846 1
+4550 4929 1
+4550 4964 1
+4550 4986 1
+4550 5037 1
+4550 5072 1
+4550 5123 1
+4550 5155 1
+4550 5189 1
+4550 5262 1
+4550 5321 1
+4550 5323 1
+4550 5335 1
+4550 5341 1
+4550 5364 1
+4550 5392 1
+4550 5412 1
+4550 5423 1
+4550 5430 1
+4550 5434 1
+4550 5452 1
+4550 5463 1
+4550 5465 1
+4550 5467 1
+4550 5484 1
+4550 5506 1
+4550 5509 1
+4550 5511 1
+4550 5514 1
+4550 5539 1
+4550 5545 1
+4550 5559 1
+4550 5568 1
+4550 5569 1
+4550 5570 1
+4550 5592 1
+4550 5637 1
+4550 5639 1
+4550 5650 1
+4550 5651 1
+4550 5683 1
+4550 5705 1
+4550 5817 1
+4550 5891 1
+4550 5963 1
+4550 6029 1
+4550 6251 1
+4550 6255 1
+4550 6305 1
+4550 6330 1
+4550 6523 1
+4550 6600 1
+4550 6707 1
+4550 6765 1
+4550 6938 1
+4550 6945 1
+4550 6948 1
+4550 6953 1
+4550 6955 1
+4550 6979 1
+4550 6982 1
+4550 8295 1
+4557 2276 1
+4557 2507 1
+4557 3586 1
+4557 3643 1
+4557 4041 1
+4557 4310 1
+4557 4338 1
+4557 4527 1
+4557 5072 1
+4557 5182 1
+4557 5226 1
+4557 5445 1
+4557 5524 1
+4557 5743 1
+4557 5780 1
+4557 6029 1
+4553 3334 1
+4553 4557 1
+4553 5392 1
+4554 4557 1
+4555 4557 1
+4556 4557 1
+4558 7757 1
+4560 4561 1
+4560 4661 1
+4560 4828 1
+4563 2364 1
+4563 3092 1
+4563 3140 1
+4563 3454 1
+4563 3554 1
+4563 3843 1
+4563 3898 1
+4563 4828 1
+4563 5092 1
+4563 5130 1
+4563 5132 1
+4564 72 1
+4564 737 1
+4564 2145 1
+4564 2326 1
+4564 2398 1
+4564 2535 1
+4564 2790 1
+4564 2811 1
+4564 3140 1
+4564 3276 1
+4564 3334 1
+4564 3352 1
+4564 3443 1
+4564 3454 1
+4564 3643 1
+4564 3796 1
+4564 3898 1
+4564 3956 1
+4564 3976 1
+4564 4072 1
+4564 4191 1
+4564 4297 1
+4564 4315 1
+4564 4335 1
+4564 4448 1
+4564 4578 1
+4564 4613 1
+4564 4735 1
+4564 4811 1
+4564 4929 1
+4564 5002 1
+4564 5452 1
+4564 5459 1
+4565 3454 1
+4565 4578 1
+4566 3454 1
+4566 4110 1
+4566 4400 1
+4567 2790 1
+4567 3454 1
+4568 3454 1
+4569 3140 1
+4574 346 1
+4574 1305 1
+4574 1310 1
+4574 2354 1
+4574 2398 1
+4574 2516 1
+4574 2620 1
+4574 3084 1
+4574 3334 1
+4574 3455 1
+4574 3456 1
+4574 3586 1
+4574 3748 1
+4574 3897 1
+4574 3919 1
+4574 4037 1
+4574 4103 1
+4574 4191 1
+4574 4247 1
+4574 4578 1
+4574 4781 1
+4574 4811 1
+4574 4846 1
+4574 4875 1
+4574 5079 1
+4574 5179 1
+4574 5182 1
+4574 5301 1
+4574 5412 1
+4574 5459 1
+4574 5828 1
+4574 5963 1
+4574 6044 1
+4574 6262 1
+4574 6305 1
+4574 6337 1
+4574 6624 1
+4574 6709 1
+4574 7632 1
+4574 7839 1
+4575 4578 1
+4575 4735 1
+4576 15 1
+4576 3447 1
+4576 3897 1
+4576 3919 1
+4576 4448 1
+4576 4530 1
+4576 4536 1
+4576 4578 1
+4576 4977 1
+4576 5463 1
+4577 4072 1
+4577 4578 1
+4581 1185 1
+4581 3433 1
+4581 4297 1
+4582 2381 1
+4582 2398 1
+4582 3014 1
+4582 4583 1
+4582 4728 1
+4586 2790 1
+4586 3352 1
+4586 4072 1
+4586 4335 1
+4586 4466 1
+4586 4778 1
+4586 4779 1
+4586 4780 1
+4586 5683 1
+4587 15 1
+4587 2145 1
+4587 2535 1
+4587 2592 1
+4587 3452 1
+4587 3453 1
+4587 3498 1
+4587 3537 1
+4587 3634 1
+4587 3748 1
+4587 3835 1
+4587 3873 1
+4587 4072 1
+4587 4212 1
+4587 4261 1
+4587 4448 1
+4587 4483 1
+4587 4662 1
+4587 4792 1
+4587 4828 1
+4587 4953 1
+4587 4999 1
+4587 5130 1
+4587 5350 1
+4587 5844 1
+4587 5947 1
+4587 6566 1
+4588 2326 1
+4588 3014 1
+4588 3352 1
+4588 3443 1
+4588 3460 1
+4588 3958 1
+4588 4072 1
+4588 4261 1
+4588 4266 1
+4588 4661 1
+4588 4719 1
+4592 1961 1
+4592 2775 1
+4592 4037 1
+4592 4808 1
+4592 5026 1
+4592 5133 1
+4593 1961 1
+4594 2144 1
+4595 2144 1
+4595 3453 1
+4595 4468 1
+4596 2144 1
+4597 2144 1
+4598 15 1
+4598 1026 1
+4598 2160 1
+4598 2440 1
+4598 3334 1
+4598 3352 1
+4598 3459 1
+4598 3498 1
+4598 3755 1
+4598 3885 1
+4598 3956 1
+4598 4011 1
+4598 4099 1
+4598 4211 1
+4598 4401 1
+4598 4536 1
+4598 4875 1
+4598 5002 1
+4598 5028 1
+4598 5072 1
+4598 5096 1
+4598 5121 1
+4598 5178 1
+4598 5179 1
+4598 5263 1
+4598 5301 1
+4598 5404 1
+4598 5415 1
+4598 5482 1
+4598 5527 1
+4598 5584 1
+4598 5697 1
+4598 5705 1
+4598 5756 1
+4598 5773 1
+4598 5776 1
+4598 5784 1
+4598 5790 1
+4598 5800 1
+4598 5824 1
+4598 5829 1
+4598 5839 1
+4598 5863 1
+4598 5871 1
+4598 5902 1
+4598 6080 1
+4598 6105 1
+4598 6151 1
+4598 6156 1
+4598 6246 1
+4598 6261 1
+4598 6270 1
+4598 6299 1
+4598 6327 1
+4598 6400 1
+4598 6523 1
+4598 6599 1
+4598 6634 1
+4598 6700 1
+4598 6715 1
+4598 6720 1
+4598 6739 1
+4598 6765 1
+4598 6855 1
+4598 7225 1
+4598 7279 1
+4598 7478 1
+4598 7553 1
+4598 7620 1
+4598 7757 1
+4598 7839 1
+4599 3956 1
+4600 15 1
+4600 2237 1
+4600 2760 1
+4600 2822 1
+4600 4041 1
+4600 4400 1
+4600 4781 1
+4600 4792 1
+4600 4846 1
+4600 4999 1
+4600 5189 1
+4600 5341 1
+4600 5445 1
+4600 5482 1
+4600 6229 1
+4602 2760 1
+4602 5445 1
+4601 2760 1
+4603 4605 1
+4604 4605 1
+4604 4712 1
+4604 5188 1
+4604 6532 1
+4604 6560 1
+4604 6621 1
+4604 7624 1
+4608 3958 1
+4607 3958 1
+4609 3443 1
+4609 3958 1
+2841 72 1
+4611 72 1
+4612 4613 1
+4615 3014 1
+4616 3014 1
+4616 3089 1
+4616 3238 1
+4616 4037 1
+4616 5799 1
+4616 6930 1
+4616 7632 1
+4617 3014 1
+4618 3014 1
+4618 3034 1
+4618 3453 1
+4618 4646 1
+4619 4620 1
+4622 3443 1
+4623 3352 1
+4623 3443 1
+4624 3443 1
+4624 4037 1
+4625 72 1
+4625 3103 1
+4625 3443 1
+4625 3796 1
+4629 3443 1
+4626 2775 1
+4626 3443 1
+4626 3456 1
+4626 3796 1
+4626 6780 1
+4627 3443 1
+4630 15 1
+4630 3976 1
+4630 4037 1
+4630 5254 1
+4487 406 1
+4487 1680 1
+4487 2354 1
+4487 2369 1
+4487 2516 1
+4487 2775 1
+4487 2917 1
+4487 3089 1
+4487 3456 1
+4487 3897 1
+4487 3976 1
+4487 4191 1
+4487 4551 1
+4487 4587 1
+4487 4666 1
+4487 4735 1
+4487 4964 1
+4487 4977 1
+4487 4991 1
+4487 5115 1
+4487 5208 1
+4487 5215 1
+4487 5298 1
+4487 5301 1
+4487 5306 1
+4487 5392 1
+4487 5412 1
+4487 5484 1
+4487 5563 1
+4487 5564 1
+4487 5817 1
+4631 5545 1
+4632 155 1
+4632 967 1
+4632 1159 1
+4632 1385 1
+4632 1473 1
+4632 1498 1
+4632 1548 1
+4632 1680 1
+4632 1799 1
+4632 1823 1
+4632 2223 1
+4632 2276 1
+4632 2285 1
+4632 2369 1
+4632 2490 1
+4632 2535 1
+4632 2658 1
+4632 2689 1
+4632 2774 1
+4632 2909 1
+4632 2925 1
+4632 2940 1
+4632 3000 1
+4632 3084 1
+4632 3106 1
+4632 3191 1
+4632 3393 1
+4632 3447 1
+4632 3460 1
+4632 3479 1
+4632 3498 1
+4632 3554 1
+4632 3586 1
+4632 3643 1
+4632 3752 1
+4632 3770 1
+4632 3796 1
+4632 3843 1
+4632 3873 1
+4632 3885 1
+4632 3910 1
+4632 3958 1
+4632 4011 1
+4632 4037 1
+4632 4040 1
+4632 4041 1
+4632 4071 1
+4632 4099 1
+4632 4103 1
+4632 4124 1
+4632 4175 1
+4632 4212 1
+4632 4261 1
+4632 4276 1
+4632 4297 1
+4632 4310 1
+4632 4315 1
+4632 4338 1
+4632 4355 1
+4632 4361 1
+4632 4412 1
+4632 4435 1
+4632 4482 1
+4632 4483 1
+4632 4534 1
+4632 4574 1
+4632 4588 1
+4632 4621 1
+4632 4653 1
+4632 4666 1
+4632 4715 1
+4632 4792 1
+4632 4797 1
+4632 4798 1
+4632 4808 1
+4632 4814 1
+4632 4828 1
+4632 4846 1
+4632 4940 1
+4632 4964 1
+4632 4980 1
+4632 4994 1
+4632 5002 1
+4632 5012 1
+4632 5020 1
+4632 5022 1
+4632 5079 1
+4632 5083 1
+4632 5092 1
+4632 5100 1
+4632 5121 1
+4632 5123 1
+4632 5148 1
+4632 5178 1
+4632 5189 1
+4632 5200 1
+4632 5215 1
+4632 5222 1
+4632 5233 1
+4632 5262 1
+4632 5288 1
+4632 5327 1
+4632 5335 1
+4632 5404 1
+4632 5423 1
+4632 5437 1
+4632 5439 1
+4632 5457 1
+4632 5466 1
+4632 5484 1
+4632 5487 1
+4632 5524 1
+4632 5529 1
+4632 5539 1
+4632 5559 1
+4632 5568 1
+4632 5671 1
+4632 5683 1
+4632 5684 1
+4632 5693 1
+4632 5743 1
+4632 5753 1
+4632 5760 1
+4632 5780 1
+4632 5798 1
+4632 5800 1
+4632 5804 1
+4632 5807 1
+4632 5819 1
+4632 5827 1
+4632 5872 1
+4632 5886 1
+4632 5891 1
+4632 5933 1
+4632 5936 1
+4632 5947 1
+4632 6006 1
+4632 6043 1
+4632 6097 1
+4632 6124 1
+4632 6151 1
+4632 6156 1
+4632 6166 1
+4632 6174 1
+4632 6218 1
+4632 6227 1
+4632 6246 1
+4632 6251 1
+4632 6255 1
+4632 6262 1
+4632 6299 1
+4632 6305 1
+4632 6306 1
+4632 6327 1
+4632 6328 1
+4632 6414 1
+4632 6422 1
+4632 6432 1
+4632 6437 1
+4632 6441 1
+4632 6458 1
+4632 6474 1
+4632 6481 1
+4632 6498 1
+4632 6523 1
+4632 6555 1
+4632 6589 1
+4632 6595 1
+4632 6599 1
+4632 6618 1
+4632 6634 1
+4632 6665 1
+4632 6737 1
+4632 6780 1
+4632 6860 1
+4632 6875 1
+4632 6914 1
+4632 6933 1
+4632 6934 1
+4632 6946 1
+4632 6948 1
+4632 6955 1
+4632 6976 1
+4632 6979 1
+4632 7005 1
+4632 7021 1
+4632 7052 1
+4632 7073 1
+4632 7092 1
+4632 7094 1
+4632 7143 1
+4632 7295 1
+4632 7341 1
+4632 7351 1
+4632 7373 1
+4632 7381 1
+4632 7391 1
+4632 7510 1
+4632 7587 1
+4632 7618 1
+4632 7620 1
+4632 7624 1
+4632 7646 1
+4632 7647 1
+4632 7695 1
+4632 7699 1
+4632 7726 1
+4632 7795 1
+4632 7803 1
+4632 7809 1
+4632 7810 1
+4632 7813 1
+4632 7833 1
+4632 7839 1
+4632 7855 1
+4632 7871 1
+4632 7882 1
+4632 7908 1
+4632 7912 1
+4632 7961 1
+4632 8073 1
+4632 8122 1
+4632 8163 1
+4632 8174 1
+4632 8192 1
+4632 8209 1
+4632 8237 1
+4632 8295 1
+4633 2456 1
+4633 2517 1
+4633 3748 1
+4633 3835 1
+4633 4011 1
+4633 4044 1
+4633 4103 1
+4633 4212 1
+4633 4261 1
+4633 4666 1
+4633 4706 1
+4633 4814 1
+4636 4468 1
+4638 4639 1
+4640 1984 1
+4640 5817 1
+4641 1984 1
+4644 3034 1
+4645 4646 1
+4649 3309 1
+4651 3453 1
+4651 3835 1
+4652 2516 1
+4652 3453 1
+4652 4530 1
+4652 4653 1
+4652 5020 1
+4652 5144 1
+4652 5335 1
+4652 5543 1
+4653 1385 1
+4653 1680 1
+4653 1799 1
+4653 2354 1
+4653 2386 1
+4653 2398 1
+4653 2516 1
+4653 2552 1
+4653 2592 1
+4653 2605 1
+4653 2689 1
+4653 2822 1
+4653 2831 1
+4653 2909 1
+4653 3089 1
+4653 3106 1
+4653 3276 1
+4653 3291 1
+4653 3393 1
+4653 3417 1
+4653 3447 1
+4653 3453 1
+4653 3455 1
+4653 3456 1
+4653 3459 1
+4653 3460 1
+4653 3537 1
+4653 3664 1
+4653 3691 1
+4653 3755 1
+4653 3796 1
+4653 3897 1
+4653 3910 1
+4653 4041 1
+4653 4098 1
+4653 4127 1
+4653 4191 1
+4653 4315 1
+4653 4335 1
+4653 4355 1
+4653 4400 1
+4653 4448 1
+4653 4468 1
+4653 4482 1
+4653 4530 1
+4653 4536 1
+4653 4547 1
+4653 4574 1
+4653 4587 1
+4653 4600 1
+4653 4625 1
+4653 4631 1
+4653 4632 1
+4653 4645 1
+4653 4661 1
+4653 4748 1
+4653 4777 1
+4653 4795 1
+4653 4828 1
+4653 4866 1
+4653 4964 1
+4653 4977 1
+4653 4983 1
+4653 4994 1
+4653 5020 1
+4653 5123 1
+4653 5141 1
+4653 5146 1
+4653 5162 1
+4653 5189 1
+4653 5200 1
+4653 5204 1
+4653 5208 1
+4653 5210 1
+4653 5215 1
+4653 5222 1
+4653 5226 1
+4653 5255 1
+4653 5260 1
+4653 5305 1
+4653 5308 1
+4653 5309 1
+4653 5326 1
+4653 5327 1
+4653 5351 1
+4653 5354 1
+4653 5363 1
+4653 5392 1
+4653 5393 1
+4653 5423 1
+4653 5454 1
+4653 5459 1
+4653 5463 1
+4653 5484 1
+4653 5509 1
+4653 5545 1
+4653 5563 1
+4653 5564 1
+4653 5569 1
+4653 5620 1
+4653 5623 1
+4653 5630 1
+4653 5635 1
+4653 5637 1
+4653 5650 1
+4653 5663 1
+4653 5680 1
+4653 5737 1
+4653 5743 1
+4653 5844 1
+4653 6164 1
+4653 6441 1
+4653 6505 1
+4653 8295 1
+4654 3453 1
+4654 6148 1
+4655 3321 1
+4655 3453 1
+4635 4220 1
+4659 2237 1
+4659 3321 1
+4659 4999 1
+4660 3321 1
+4661 2517 1
+4661 2811 1
+4661 3321 1
+4661 3635 1
+4661 3796 1
+4661 4037 1
+4661 4261 1
+4661 4335 1
+4661 4547 1
+4661 4662 1
+4661 4719 1
+4661 5459 1
+4661 5563 1
+4661 5596 1
+4661 5804 1
+4661 5822 1
+4661 6555 1
+4661 7855 1
+4661 7882 1
+4662 72 1
+4662 346 1
+4662 1549 1
+4662 1769 1
+4662 2398 1
+4662 2576 1
+4662 2917 1
+4662 3073 1
+4662 3238 1
+4662 3276 1
+4662 3321 1
+4662 3334 1
+4662 3460 1
+4662 3631 1
+4662 3796 1
+4662 3835 1
+4662 4037 1
+4662 4044 1
+4662 4099 1
+4662 4361 1
+4662 4536 1
+4662 4666 1
+4662 4780 1
+4662 4797 1
+4662 4820 1
+4662 4953 1
+4662 4962 1
+4662 5083 1
+4662 5123 1
+4662 5452 1
+4662 5454 1
+4662 5459 1
+4662 5693 1
+4662 5760 1
+4662 5897 1
+4662 5925 1
+4662 5947 1
+4662 5963 1
+4662 6624 1
+4662 6665 1
+4662 6774 1
+4662 6946 1
+4662 7073 1
+4662 7143 1
+4662 7620 1
+4662 7699 1
+4663 1305 1
+4663 2917 1
+4663 3321 1
+4663 3748 1
+4663 4037 1
+4663 4191 1
+4663 4335 1
+4663 4588 1
+4663 4661 1
+4663 4999 1
+4664 2145 1
+4664 2456 1
+4664 4666 1
+4664 4706 1
+4664 4712 1
+4664 4735 1
+4647 15 1
+4647 2145 1
+4647 2326 1
+4647 2565 1
+4647 2696 1
+4647 3433 1
+4647 3447 1
+4647 3456 1
+4647 5123 1
+4647 5412 1
+4647 6907 1
+4665 737 1
+4665 1360 1
+4665 2145 1
+4665 3417 1
+4665 3460 1
+4665 3537 1
+4665 3748 1
+4665 4814 1
+4665 5305 1
+4666 840 1
+4666 3089 1
+4666 3293 1
+4666 3958 1
+4666 4037 1
+4666 4247 1
+4666 4687 1
+4666 5482 1
+4666 5506 1
+4666 5850 1
+4666 6780 1
+4666 7012 1
+4666 7063 1
+4666 7860 1
+4666 7908 1
+4666 7912 1
+4666 7961 1
+4666 7992 1
+4666 8002 1
+4666 8042 1
+4666 8043 1
+4666 8044 1
+4666 8073 1
+4666 8083 1
+4672 4666 1
+4672 4875 1
+4667 4666 1
+4673 1352 1
+4673 1823 1
+4673 1972 1
+4673 2440 1
+4673 2535 1
+4673 2620 1
+4673 2774 1
+4673 2914 1
+4673 3284 1
+4673 3291 1
+4673 3614 1
+4673 3634 1
+4673 3842 1
+4673 3897 1
+4673 3919 1
+4673 4099 1
+4673 4219 1
+4673 4483 1
+4673 4587 1
+4673 4604 1
+4673 4654 1
+4673 4666 1
+4673 4677 1
+4673 4687 1
+4673 4689 1
+4673 4712 1
+4673 4715 1
+4673 4717 1
+4673 4748 1
+4673 4786 1
+4673 4791 1
+4673 4795 1
+4673 4798 1
+4673 4980 1
+4673 4994 1
+4673 5083 1
+4673 5092 1
+4673 5106 1
+4673 5140 1
+4673 5188 1
+4673 5200 1
+4673 5210 1
+4673 5215 1
+4673 5233 1
+4673 5273 1
+4673 5423 1
+4673 5439 1
+4673 5479 1
+4673 5584 1
+4673 5626 1
+4673 5638 1
+4673 5684 1
+4673 5738 1
+4673 5798 1
+4673 5799 1
+4673 5804 1
+4673 5827 1
+4673 5980 1
+4673 6006 1
+4673 6156 1
+4673 6218 1
+4673 6327 1
+4673 6328 1
+4673 6334 1
+4673 6337 1
+4673 6340 1
+4673 6388 1
+4673 6407 1
+4673 6409 1
+4673 6424 1
+4673 6432 1
+4673 6441 1
+4673 6458 1
+4673 6474 1
+4673 6481 1
+4673 6498 1
+4673 6501 1
+4673 6505 1
+4673 6528 1
+4673 6529 1
+4673 6552 1
+4673 6554 1
+4673 6567 1
+4673 6570 1
+4673 6571 1
+4673 6576 1
+4673 6589 1
+4673 6590 1
+4673 6594 1
+4673 6595 1
+4673 6599 1
+4673 6600 1
+4673 6628 1
+4673 6632 1
+4673 6634 1
+4673 6685 1
+4668 4666 1
+4669 938 1
+4669 3334 1
+4669 3796 1
+4669 4037 1
+4669 4529 1
+4669 4666 1
+4669 5800 1
+4669 5801 1
+4669 6442 1
+4669 6736 1
+4669 6913 1
+4669 6953 1
+4669 7254 1
+4670 4666 1
+4671 2398 1
+4671 2456 1
+4671 3554 1
+4671 4625 1
+4671 4666 1
+4671 5100 1
+4671 5459 1
+4674 3460 1
+4674 4666 1
+4674 8212 1
+4681 1305 1
+4681 1498 1
+4681 2223 1
+4681 2326 1
+4681 2696 1
+4681 2917 1
+4681 3297 1
+4681 3334 1
+4681 3460 1
+4681 3748 1
+4681 4037 1
+4681 4298 1
+4681 4588 1
+4681 4792 1
+4681 4811 1
+4681 4962 1
+4681 4993 1
+4681 5055 1
+4681 7092 1
+4681 7992 1
+4683 3460 1
+4682 1310 1
+4682 1769 1
+4682 2790 1
+4682 2811 1
+4682 3460 1
+4682 3635 1
+4682 3854 1
+4682 3898 1
+4682 4261 1
+4682 4298 1
+4682 4551 1
+4682 4661 1
+4682 4953 1
+4682 4999 1
+4686 406 1
+4686 1159 1
+4686 1305 1
+4686 1385 1
+4686 1680 1
+4686 2354 1
+4686 2369 1
+4686 2381 1
+4686 2398 1
+4686 2516 1
+4686 2689 1
+4686 2775 1
+4686 3089 1
+4686 3456 1
+4686 3554 1
+4686 3664 1
+4686 3691 1
+4686 3885 1
+4686 3897 1
+4686 3976 1
+4686 4037 1
+4686 4191 1
+4686 4338 1
+4686 4441 1
+4686 4534 1
+4686 4587 1
+4686 4645 1
+4686 4653 1
+4686 4661 1
+4686 4717 1
+4686 4964 1
+4686 5020 1
+4686 5083 1
+4686 5092 1
+4686 5100 1
+4686 5106 1
+4686 5130 1
+4686 5155 1
+4686 5210 1
+4686 5233 1
+4686 5295 1
+4686 5308 1
+4686 5387 1
+4686 5392 1
+4686 5404 1
+4686 5412 1
+4686 5415 1
+4686 5449 1
+4686 5452 1
+4686 5454 1
+4686 5463 1
+4686 5484 1
+4686 5683 1
+4686 5705 1
+4686 5743 1
+4686 5928 1
+4686 8295 1
+4687 2014 1
+4687 2237 1
+4687 2285 1
+4687 2440 1
+4687 2456 1
+4687 3479 1
+4687 4266 1
+4687 4335 1
+4687 4588 1
+4687 4661 1
+4687 4706 1
+4687 4735 1
+4687 4824 1
+4687 4983 1
+4687 5176 1
+4687 5254 1
+4687 5543 1
+4687 5824 1
+4687 6400 1
+4687 6498 1
+4687 6599 1
+4687 6613 1
+4687 6789 1
+4688 346 1
+4688 1305 1
+4688 1310 1
+4688 1360 1
+4688 1769 1
+4688 2014 1
+4688 2237 1
+4688 2326 1
+4688 2456 1
+4688 2696 1
+4688 2775 1
+4688 2787 1
+4688 2811 1
+4688 3002 1
+4688 3073 1
+4688 3276 1
+4688 3334 1
+4688 3352 1
+4688 3433 1
+4688 3447 1
+4688 3452 1
+4688 3458 1
+4688 3607 1
+4688 3635 1
+4688 3643 1
+4688 3748 1
+4688 3843 1
+4688 3854 1
+4688 3898 1
+4688 4037 1
+4688 4040 1
+4688 4044 1
+4688 4103 1
+4688 4189 1
+4688 4212 1
+4688 4261 1
+4688 4266 1
+4688 4335 1
+4688 4551 1
+4688 4661 1
+4688 4662 1
+4688 4706 1
+4688 4719 1
+4688 4735 1
+4688 4776 1
+4688 4792 1
+4688 4796 1
+4688 4808 1
+4688 4811 1
+4688 4814 1
+4688 4820 1
+4688 4827 1
+4688 4938 1
+4688 4942 1
+4688 4953 1
+4688 4962 1
+4688 4983 1
+4688 4999 1
+4688 5026 1
+4689 4661 1
+4693 4261 1
+4693 5162 1
+4692 4261 1
+4694 4261 1
+4695 4261 1
+4696 4261 1
+4697 4261 1
+4698 4261 1
+4699 4261 1
+4700 4261 1
+4701 4261 1
+4702 4261 1
+4703 4261 1
+4704 4261 1
+4705 3334 1
+4705 4261 1
+4705 4728 1
+4706 4261 1
+4706 4266 1
+4706 4792 1
+4707 4261 1
+4708 4261 1
+4709 1473 1
+4709 3106 1
+4709 3456 1
+4709 3586 1
+4709 3796 1
+4709 4071 1
+4709 4261 1
+4709 4338 1
+4709 4981 1
+4709 5037 1
+4709 5055 1
+4709 5459 1
+4709 5524 1
+4709 5684 1
+4709 5775 1
+4709 6123 1
+4709 6458 1
+4709 7119 1
+4709 7510 1
+4709 7871 1
+4709 7874 1
+4709 7890 1
+4709 7912 1
+4709 7961 1
+4709 7979 1
+4710 3910 1
+4710 4261 1
+4710 4706 1
+4710 4735 1
+4710 4824 1
+4710 4875 1
+4710 5100 1
+4710 5239 1
+4711 4261 1
+4714 737 1
+4714 4719 1
+4714 5775 1
+4715 3103 1
+4715 4298 1
+4715 4341 1
+4715 4400 1
+4715 4719 1
+4715 4964 1
+4715 5020 1
+4715 5321 1
+4715 5457 1
+4715 5790 1
+4715 5844 1
+4716 4719 1
+2621 2160 1
+2621 4719 1
+2621 5305 1
+2621 5412 1
+2621 6023 1
+2621 6481 1
+2621 6770 1
+2621 6789 1
+4717 737 1
+4717 896 1
+4717 967 1
+4717 2381 1
+4717 2456 1
+4717 2516 1
+4717 2565 1
+4717 2658 1
+4717 2831 1
+4717 3084 1
+4717 3089 1
+4717 3293 1
+4717 3334 1
+4717 3459 1
+4717 3796 1
+4717 3842 1
+4717 4099 1
+4717 4310 1
+4717 4448 1
+4717 4483 1
+4717 4536 1
+4717 4587 1
+4717 4666 1
+4717 4712 1
+4717 4719 1
+4717 4748 1
+4717 4764 1
+4717 4798 1
+4717 4814 1
+4717 4828 1
+4717 4899 1
+4717 5123 1
+4717 5178 1
+4717 5254 1
+4717 5273 1
+4717 5439 1
+4717 5463 1
+4717 5524 1
+4717 5596 1
+4717 5624 1
+4717 5650 1
+4717 5697 1
+4717 5743 1
+4717 5760 1
+4717 5829 1
+4717 5972 1
+4717 6059 1
+4717 6083 1
+4717 6221 1
+4717 6272 1
+4717 6553 1
+4717 6555 1
+4717 6560 1
+4717 6576 1
+4717 6832 1
+4717 6979 1
+4717 7131 1
+4717 7277 1
+4717 7381 1
+4717 7618 1
+4717 7620 1
+4717 7961 1
+4718 1680 1
+4718 1799 1
+4718 2001 1
+4718 2354 1
+4718 2689 1
+4718 2785 1
+4718 2822 1
+4718 2909 1
+4718 3089 1
+4718 3103 1
+4718 3456 1
+4718 3460 1
+4718 3691 1
+4718 3796 1
+4718 3910 1
+4718 4041 1
+4718 4175 1
+4718 4315 1
+4718 4482 1
+4718 4653 1
+4718 4719 1
+4718 4964 1
+4718 5026 1
+4718 5033 1
+4718 5123 1
+4718 5204 1
+4718 5222 1
+4718 5231 1
+4718 5239 1
+4718 5260 1
+4718 5267 1
+4718 5305 1
+4718 5306 1
+4718 5341 1
+4718 5354 1
+4718 5375 1
+4718 5415 1
+4718 5434 1
+4718 5449 1
+4718 5459 1
+4718 5564 1
+4718 5620 1
+4718 5630 1
+4718 5743 1
+4718 5844 1
+4718 5886 1
+4721 2790 1
+4721 5817 1
+4720 2790 1
+4712 15 1
+4712 737 1
+4712 967 1
+4712 1026 1
+4712 1310 1
+4712 1352 1
+4712 1799 1
+4712 1982 1
+4712 2364 1
+4712 2398 1
+4712 2535 1
+4712 2565 1
+4712 2774 1
+4712 2831 1
+4712 2851 1
+4712 2909 1
+4712 3015 1
+4712 3089 1
+4712 3238 1
+4712 3334 1
+4712 3459 1
+4712 3635 1
+4712 3643 1
+4712 3726 1
+4712 3755 1
+4712 3873 1
+4712 3885 1
+4712 3897 1
+4712 3910 1
+4712 4037 1
+4712 4175 1
+4712 4247 1
+4712 4310 1
+4712 4335 1
+4712 4361 1
+4712 4483 1
+4712 4534 1
+4712 4574 1
+4712 4717 1
+4712 4735 1
+4712 4791 1
+4712 4795 1
+4712 4828 1
+4712 4846 1
+4712 4875 1
+4712 4987 1
+4712 5002 1
+4712 5028 1
+4712 5123 1
+4712 5155 1
+4712 5178 1
+4712 5189 1
+4712 5233 1
+4712 5254 1
+4712 5288 1
+4712 5449 1
+4712 5452 1
+4712 5459 1
+4712 5463 1
+4712 5524 1
+4712 5527 1
+4712 5543 1
+4712 5545 1
+4712 5638 1
+4712 5651 1
+4712 5743 1
+4712 5753 1
+4712 5776 1
+4712 5800 1
+4712 5811 1
+4712 5936 1
+4712 5950 1
+4712 6006 1
+4712 6027 1
+4712 6123 1
+4712 6255 1
+4712 6262 1
+4712 6269 1
+4712 6270 1
+4712 6306 1
+4712 6328 1
+4712 6330 1
+4712 6334 1
+4712 6337 1
+4712 6407 1
+4712 6498 1
+4712 6501 1
+4712 6560 1
+4712 6566 1
+4712 6606 1
+4712 6715 1
+4712 6789 1
+4712 6803 1
+4712 6833 1
+4712 6855 1
+4712 6860 1
+4712 6942 1
+4712 6955 1
+4712 6967 1
+4712 6994 1
+4712 7047 1
+4712 7054 1
+4712 7088 1
+4712 7092 1
+4712 7144 1
+4712 7168 1
+4712 7214 1
+4712 7225 1
+4712 7237 1
+4712 7279 1
+4712 7373 1
+4712 7422 1
+4712 7478 1
+4712 7553 1
+4712 7587 1
+4712 7632 1
+4712 7673 1
+4712 7699 1
+4712 7707 1
+4712 8295 1
+4712 8297 1
+4723 3635 1
+4725 1305 1
+4725 1310 1
+4725 1769 1
+4725 2381 1
+4725 2456 1
+4725 2592 1
+4725 2787 1
+4725 2811 1
+4725 3002 1
+4725 3284 1
+4725 3334 1
+4725 3452 1
+4725 3664 1
+4725 3813 1
+4725 3843 1
+4725 3898 1
+4725 4037 1
+4725 4040 1
+4725 4044 1
+4725 4103 1
+4725 4547 1
+4725 4551 1
+4725 4796 1
+4725 4808 1
+4725 4875 1
+4725 4983 1
+4725 5073 1
+4725 5075 1
+4725 5092 1
+4725 5106 1
+4725 5115 1
+4725 5130 1
+4725 5132 1
+4725 5144 1
+4725 5204 1
+4725 6503 1
+4726 1680 1
+4726 2369 1
+4726 3027 1
+4726 3106 1
+4726 3459 1
+4726 3910 1
+4726 4219 1
+4726 4315 1
+4726 4448 1
+4726 4468 1
+4726 4587 1
+4726 4728 1
+4726 4820 1
+4726 4824 1
+4726 5222 1
+4727 4728 1
+4733 2517 1
+4733 4335 1
+4733 4735 1
+4733 5947 1
+4736 4735 1
+4675 4735 1
+4742 3352 1
+4742 4735 1
+4737 3830 1
+4737 4735 1
+4737 5838 1
+4738 4735 1
+4739 15 1
+4739 1473 1
+4739 2456 1
+4739 3310 1
+4739 4335 1
+4739 4600 1
+4739 4706 1
+4739 4735 1
+4739 5028 1
+4739 5863 1
+4739 7478 1
+4743 4735 1
+4743 4875 1
+4745 15 1
+4745 4735 1
+4740 4735 1
+4744 4335 1
+4744 4735 1
+4746 1548 1
+4746 3002 1
+4746 3276 1
+4746 3352 1
+4746 3458 1
+4746 3537 1
+4746 3835 1
+4746 3854 1
+4746 4124 1
+4746 4654 1
+4746 4735 1
+4746 4792 1
+4746 4983 1
+4746 5178 1
+4746 5484 1
+4746 5760 1
+4746 6296 1
+4746 6311 1
+4741 3002 1
+4741 4735 1
+4741 4828 1
+4749 3748 1
+4749 4706 1
+4749 4820 1
+4750 2696 1
+4750 3748 1
+4750 6124 1
+4751 2775 1
+4751 3352 1
+4751 3748 1
+4751 5083 1
+4754 3748 1
+4752 3748 1
+4753 3748 1
+4755 4266 1
+4756 72 1
+4756 1305 1
+4756 1680 1
+4756 2001 1
+4756 2014 1
+4756 2326 1
+4756 2354 1
+4756 2369 1
+4756 2398 1
+4756 2456 1
+4756 2576 1
+4756 3334 1
+4756 3691 1
+4756 3755 1
+4756 3958 1
+4756 3976 1
+4756 4037 1
+4756 4266 1
+4756 4335 1
+4756 4588 1
+4756 4653 1
+4756 4776 1
+4756 4796 1
+4756 4942 1
+4756 4964 1
+4756 5058 1
+4756 5083 1
+4756 5092 1
+4756 5233 1
+4756 5457 1
+4756 5459 1
+4756 5737 1
+4756 5760 1
+4756 6560 1
+4757 2456 1
+4757 4040 1
+4757 4266 1
+4757 4808 1
+4757 4811 1
+4757 4814 1
+4759 3835 1
+4748 1305 1
+4748 1310 1
+4748 1972 1
+4748 2326 1
+4748 2364 1
+4748 2398 1
+4748 2822 1
+4748 3284 1
+4748 3835 1
+4748 3898 1
+4748 3910 1
+4748 3976 1
+4748 4298 1
+4748 4468 1
+4748 4500 1
+4748 4507 1
+4748 4527 1
+4748 4776 1
+4748 4987 1
+4748 5176 1
+4748 5182 1
+4748 5204 1
+4748 5301 1
+4748 5323 1
+4748 5335 1
+4748 5354 1
+4748 5364 1
+4748 5430 1
+4748 5514 1
+4748 5640 1
+4748 5991 1
+4748 6009 1
+4748 6334 1
+4748 6571 1
+4748 6590 1
+4748 6594 1
+4748 6599 1
+4748 6739 1
+4760 1305 1
+4760 2014 1
+4760 3352 1
+4760 3911 1
+4760 5055 1
+4760 7110 1
+4760 7119 1
+4761 3352 1
+4762 3352 1
+4763 3352 1
+4764 2398 1
+4764 3000 1
+4764 3084 1
+4764 3089 1
+4764 3293 1
+4764 3352 1
+4764 3459 1
+4764 3631 1
+4764 3796 1
+4764 3873 1
+4764 4037 1
+4764 4488 1
+4764 4536 1
+4764 4547 1
+4764 4712 1
+4764 4717 1
+4764 4875 1
+4764 5022 1
+4764 5106 1
+4764 5123 1
+4764 5200 1
+4764 5254 1
+4764 5273 1
+4764 5454 1
+4764 5479 1
+4764 5484 1
+4764 5543 1
+4764 5721 1
+4764 5800 1
+4764 5801 1
+4764 5818 1
+4764 5844 1
+4764 5947 1
+4764 6006 1
+4764 6043 1
+4764 6123 1
+4764 6221 1
+4764 6229 1
+4764 6243 1
+4764 6442 1
+4764 6560 1
+4764 6665 1
+4764 6715 1
+4764 6784 1
+4764 6832 1
+4764 6901 1
+4764 7092 1
+4764 7143 1
+4764 7233 1
+4764 7279 1
+4764 7373 1
+4764 7662 1
+4764 7908 1
+4765 1548 1
+4765 2354 1
+4765 3352 1
+4765 4588 1
+4771 3352 1
+4771 7277 1
+4771 8174 1
+4766 3352 1
+4773 4776 1
+4774 346 1
+4774 2326 1
+4774 2456 1
+4774 4040 1
+4774 4103 1
+4774 4212 1
+4774 4776 1
+4774 4796 1
+4774 4808 1
+4774 4811 1
+4774 4814 1
+4774 4827 1
+4774 4831 1
+4778 4780 1
+4777 4778 1
+4777 5285 1
+4781 15 1
+4781 737 1
+4781 896 1
+4781 1352 1
+4781 1385 1
+4781 1865 1
+4781 1982 1
+4781 2276 1
+4781 2456 1
+4781 2516 1
+4781 3089 1
+4781 3274 1
+4781 3498 1
+4781 3873 1
+4781 4335 1
+4781 4574 1
+4781 4999 1
+4781 5028 1
+4781 5178 1
+4781 5479 1
+4781 5484 1
+4781 5624 1
+4781 5828 1
+4781 6124 1
+4781 6246 1
+4781 6458 1
+4781 7012 1
+4782 2456 1
+4782 4953 1
+4796 737 1
+4796 1548 1
+4796 4534 1
+4796 5226 1
+4785 4796 1
+4786 4791 1
+4786 4796 1
+4786 7879 1
+4787 4796 1
+4788 3460 1
+4788 4551 1
+4788 4764 1
+4788 4791 1
+4788 4796 1
+4788 5829 1
+4788 6032 1
+4788 6388 1
+4788 6618 1
+4788 6737 1
+4788 6783 1
+4788 6833 1
+4788 7021 1
+4788 7389 1
+4788 7649 1
+4788 7857 1
+4788 7879 1
+4788 7910 1
+4788 7912 1
+4788 7924 1
+4789 4796 1
+4789 7879 1
+4790 4796 1
+4791 4796 1
+4792 737 1
+4792 2273 1
+4792 2565 1
+4792 3084 1
+4792 3447 1
+4792 3796 1
+4792 3962 1
+4792 4009 1
+4792 4400 1
+4792 4507 1
+4792 4653 1
+4792 4666 1
+4792 4706 1
+4792 4777 1
+4792 4796 1
+4792 4981 1
+4792 5020 1
+4792 5022 1
+4792 5028 1
+4792 5079 1
+4792 5148 1
+4792 5254 1
+4792 5273 1
+4792 5298 1
+4792 5326 1
+4792 5459 1
+4792 5465 1
+4792 5466 1
+4792 5524 1
+4792 5605 1
+4792 5732 1
+4792 5739 1
+4792 5745 1
+4792 5756 1
+4792 5829 1
+4792 5871 1
+4792 5969 1
+4792 6032 1
+4792 6044 1
+4792 6124 1
+4792 6421 1
+4792 6560 1
+4792 6634 1
+4792 6665 1
+4792 6700 1
+4792 6783 1
+4792 6832 1
+4792 6869 1
+4792 6938 1
+4792 7092 1
+4792 7185 1
+4792 7280 1
+4792 7414 1
+4792 7574 1
+4792 7632 1
+4792 7788 1
+4792 7809 1
+4792 7899 1
+4792 7908 1
+4792 7909 1
+4792 7946 1
+4792 8079 1
+4793 4796 1
+4793 6869 1
+4794 4796 1
+4798 2223 1
+4798 4103 1
+4798 4212 1
+4798 5807 1
+4799 4212 1
+4799 4798 1
+4800 4040 1
+4803 4808 1
+4804 4808 1
+4805 4808 1
+4805 4814 1
+4806 4808 1
+4807 4808 1
+4810 4811 1
+4814 1360 1
+4814 2364 1
+4814 3455 1
+4814 3854 1
+4814 3897 1
+4814 4189 1
+4814 4777 1
+4814 4797 1
+4814 4827 1
+4814 4938 1
+4814 4962 1
+4814 4993 1
+4814 4999 1
+4814 5199 1
+4814 5226 1
+4814 5459 1
+4814 6422 1
+4814 6503 1
+4814 7295 1
+4814 7301 1
+4813 155 1
+4813 608 1
+4813 737 1
+4813 967 1
+4813 1310 1
+4813 1352 1
+4813 1823 1
+4813 1972 1
+4813 2440 1
+4813 2764 1
+4813 2831 1
+4813 3456 1
+4813 3479 1
+4813 3498 1
+4813 3614 1
+4813 3842 1
+4813 3897 1
+4813 4099 1
+4813 4587 1
+4813 4632 1
+4813 4687 1
+4813 4689 1
+4813 4709 1
+4813 4713 1
+4813 4748 1
+4813 4795 1
+4813 4814 1
+4813 4846 1
+4813 4994 1
+4813 5037 1
+4813 5140 1
+4813 5200 1
+4813 5204 1
+4813 5439 1
+4813 5479 1
+4813 5626 1
+4813 5799 1
+4813 6006 1
+4813 6441 1
+4813 6458 1
+4813 6481 1
+4813 6498 1
+4813 6505 1
+4813 6576 1
+4813 6589 1
+4813 6715 1
+4816 1360 1
+4817 1360 1
+4818 737 1
+4818 1305 1
+4818 1680 1
+4818 2237 1
+4818 2354 1
+4818 2364 1
+4818 2516 1
+4818 2917 1
+4818 3002 1
+4818 3092 1
+4818 3334 1
+4818 3455 1
+4818 3796 1
+4818 4044 1
+4818 4124 1
+4818 4191 1
+4818 4219 1
+4818 4820 1
+4818 4938 1
+4818 4983 1
+4818 5022 1
+4818 5058 1
+4818 5162 1
+4818 5375 1
+4818 5484 1
+4818 5790 1
+4818 5814 1
+4818 6306 1
+4819 4820 1
+4821 346 1
+4821 5162 1
+4823 4706 1
+4824 72 1
+4824 608 1
+4824 737 1
+4824 1473 1
+4824 1648 1
+4824 1733 1
+4824 1799 1
+4824 2001 1
+4824 2276 1
+4824 2277 1
+4824 2342 1
+4824 2364 1
+4824 2398 1
+4824 2516 1
+4824 2576 1
+4824 2605 1
+4824 2775 1
+4824 2831 1
+4824 2925 1
+4824 3089 1
+4824 3274 1
+4824 3456 1
+4824 3459 1
+4824 3537 1
+4824 3586 1
+4824 3755 1
+4824 3958 1
+4824 4099 1
+4824 4310 1
+4824 4335 1
+4824 4338 1
+4824 4500 1
+4824 4534 1
+4824 4574 1
+4824 4600 1
+4824 4653 1
+4824 4706 1
+4824 4777 1
+4824 4781 1
+4824 4792 1
+4824 4795 1
+4824 4797 1
+4824 4828 1
+4824 4899 1
+4824 4929 1
+4824 4981 1
+4824 4986 1
+4824 5020 1
+4824 5072 1
+4824 5079 1
+4824 5103 1
+4824 5123 1
+4824 5133 1
+4824 5155 1
+4824 5182 1
+4824 5215 1
+4824 5226 1
+4824 5285 1
+4824 5288 1
+4824 5289 1
+4824 5296 1
+4824 5301 1
+4824 5310 1
+4824 5321 1
+4824 5432 1
+4824 5459 1
+4824 5506 1
+4824 5513 1
+4824 5527 1
+4824 5639 1
+4824 5650 1
+4824 5651 1
+4824 5680 1
+4824 5693 1
+4824 5706 1
+4824 5721 1
+4824 5732 1
+4824 5737 1
+4824 5743 1
+4824 5745 1
+4824 5753 1
+4824 5775 1
+4824 5780 1
+4824 5828 1
+4824 5837 1
+4824 5844 1
+4824 5848 1
+4824 5886 1
+4824 5891 1
+4824 5902 1
+4824 5925 1
+4824 5947 1
+4824 5991 1
+4824 6006 1
+4824 6098 1
+4824 6124 1
+4824 6720 1
+4824 6784 1
+4824 6913 1
+4824 6976 1
+4824 8042 1
+4825 4706 1
+4825 5775 1
+4827 4828 1
+4826 4827 1
+4829 737 1
+4829 1247 1
+4829 1680 1
+4829 1799 1
+4829 2364 1
+4829 2689 1
+4829 2785 1
+4829 2822 1
+4829 2909 1
+4829 3027 1
+4829 3089 1
+4829 3103 1
+4829 3417 1
+4829 3456 1
+4829 3459 1
+4829 3460 1
+4829 3691 1
+4829 3792 1
+4829 3910 1
+4829 3962 1
+4829 4124 1
+4829 4127 1
+4829 4315 1
+4829 4400 1
+4829 4448 1
+4829 4482 1
+4829 4587 1
+4829 4600 1
+4829 4712 1
+4829 4824 1
+4829 4831 1
+4829 4866 1
+4829 4929 1
+4829 5002 1
+4829 5079 1
+4829 5083 1
+4829 5092 1
+4829 5155 1
+4829 5176 1
+4829 5245 1
+4829 5288 1
+4829 5295 1
+4829 5326 1
+4829 5327 1
+4829 5335 1
+4829 5341 1
+4829 5392 1
+4829 5412 1
+4829 5423 1
+4829 5430 1
+4829 5442 1
+4829 5449 1
+4829 5452 1
+4829 5457 1
+4829 5465 1
+4829 5467 1
+4829 5506 1
+4829 5543 1
+4829 5739 1
+4829 5800 1
+4829 5802 1
+4829 5818 1
+4829 5839 1
+4829 5933 1
+4829 6156 1
+4829 6170 1
+4829 6388 1
+4829 6560 1
+4829 6699 1
+4829 6720 1
+4829 6755 1
+4829 6788 1
+4829 6856 1
+4829 6873 1
+4829 6892 1
+4829 7012 1
+4829 7624 1
+4829 7946 1
+4830 4831 1
+4832 2237 1
+4832 2775 1
+4832 4037 1
+4832 4361 1
+4832 4991 1
+4832 6503 1
+4832 7478 1
+4857 2237 1
+4833 2237 1
+4833 2354 1
+4833 4037 1
+4833 4124 1
+4833 6595 1
+4833 6790 1
+4834 2237 1
+4835 2237 1
+4836 2237 1
+4837 2237 1
+4837 3498 1
+4838 2237 1
+4838 4600 1
+4839 2237 1
+4840 1385 1
+4840 2237 1
+4840 4600 1
+4840 5482 1
+4858 2237 1
+4841 2237 1
+4842 2237 1
+4842 4999 1
+4843 1473 1
+4843 2237 1
+4843 2354 1
+4843 2398 1
+4843 2565 1
+4843 3084 1
+4843 4037 1
+4843 4247 1
+4843 4335 1
+4843 4600 1
+4843 4879 1
+4843 4977 1
+4843 5254 1
+4843 5423 1
+4843 5449 1
+4843 5452 1
+4843 5484 1
+4843 5511 1
+4843 5651 1
+4843 5714 1
+4843 5828 1
+4843 5850 1
+4843 6790 1
+4843 7478 1
+4844 2237 1
+4844 4600 1
+4859 1310 1
+4859 1680 1
+4859 2237 1
+4859 2381 1
+4859 2516 1
+4859 2689 1
+4859 2775 1
+4859 3092 1
+4859 3276 1
+4859 3447 1
+4859 3452 1
+4859 3537 1
+4859 3607 1
+4859 3854 1
+4859 3898 1
+4859 4124 1
+4859 4191 1
+4859 4547 1
+4859 4551 1
+4859 4717 1
+4859 4792 1
+4859 4828 1
+4859 4953 1
+4859 4999 1
+4859 5026 1
+4859 5055 1
+4859 5106 1
+4859 5130 1
+4859 5144 1
+4859 5222 1
+4860 2237 1
+4860 4875 1
+4845 2237 1
+4846 737 1
+4846 2237 1
+4846 2381 1
+4846 2398 1
+4846 2592 1
+4846 3456 1
+4846 3664 1
+4846 3691 1
+4846 4189 1
+4846 4191 1
+4846 4335 1
+4846 4400 1
+4846 4448 1
+4846 4587 1
+4846 4600 1
+4846 4632 1
+4846 4653 1
+4846 4824 1
+4846 4828 1
+4846 4964 1
+4846 5092 1
+4846 5106 1
+4846 5115 1
+4846 5141 1
+4846 5189 1
+4846 5239 1
+4846 5341 1
+4846 5484 1
+4846 5511 1
+4846 5513 1
+4846 5545 1
+4846 5563 1
+4846 5568 1
+4846 5592 1
+4847 2237 1
+4848 2237 1
+4849 2237 1
+4849 4600 1
+4850 2237 1
+4850 4600 1
+4850 4999 1
+4861 2237 1
+4862 1026 1
+4862 2237 1
+4862 4276 1
+4862 5254 1
+4851 2237 1
+4851 4600 1
+4851 4846 1
+4852 2237 1
+4852 3498 1
+4852 5178 1
+4863 2237 1
+4853 1305 1
+4853 1352 1
+4853 2237 1
+4853 4588 1
+4853 5162 1
+4854 2237 1
+4854 4600 1
+4855 2237 1
+4855 3334 1
+4856 2237 1
+4856 3755 1
+4856 5651 1
+4866 3073 1
+4866 3433 1
+4867 4875 1
+4868 4875 1
+4873 4875 1
+4801 4875 1
+4871 4875 1
+4869 4875 1
+4874 2620 1
+4874 4875 1
+4874 5210 1
+4870 1548 1
+4870 4875 1
+4872 4875 1
+4879 1026 1
+4879 2565 1
+4879 2940 1
+4879 3334 1
+4879 3459 1
+4879 3537 1
+4879 3885 1
+4879 4219 1
+4879 4341 1
+4879 4887 1
+4879 5289 1
+4879 5760 1
+4879 5806 1
+4879 5835 1
+4879 5872 1
+4879 6243 1
+4879 6665 1
+4879 6907 1
+4879 7279 1
+4879 7362 1
+4879 7378 1
+4879 7386 1
+4879 7397 1
+4879 7414 1
+4879 7553 1
+4879 7557 1
+4879 7561 1
+4879 7587 1
+4881 3334 1
+4881 4530 1
+4881 4795 1
+4881 4977 1
+4882 3334 1
+4882 4037 1
+4882 5817 1
+4883 3334 1
+4883 5596 1
+4883 5714 1
+4883 6770 1
+4883 6833 1
+4884 3334 1
+4884 4037 1
+4884 7632 1
+4884 7882 1
+4885 3334 1
+4885 3447 1
+4885 3455 1
+4885 4983 1
+4889 4588 1
+4889 7809 1
+4890 4588 1
+4891 1305 1
+4891 2696 1
+4891 3433 1
+4891 4037 1
+4891 4335 1
+4891 4588 1
+4891 4942 1
+4893 1305 1
+4893 2014 1
+4893 2696 1
+4893 3433 1
+4893 4044 1
+4894 1305 1
+4894 2364 1
+4894 2689 1
+4894 2696 1
+4894 2764 1
+4894 2822 1
+4894 2925 1
+4894 3015 1
+4894 3274 1
+4894 3276 1
+4894 3796 1
+4894 3808 1
+4894 3873 1
+4894 4041 1
+4894 4044 1
+4894 4099 1
+4894 4191 1
+4894 4310 1
+4894 4335 1
+4894 4448 1
+4894 4483 1
+4894 4600 1
+4894 4653 1
+4894 4786 1
+4894 4828 1
+4894 4846 1
+4894 4964 1
+4894 4993 1
+4894 5083 1
+4894 5121 1
+4894 5123 1
+4894 5189 1
+4894 5210 1
+4894 5215 1
+4894 5323 1
+4894 5335 1
+4894 5375 1
+4894 5415 1
+4894 5459 1
+4894 5467 1
+4894 5469 1
+4894 5482 1
+4894 5539 1
+4894 5543 1
+4894 5563 1
+4894 5569 1
+4894 5570 1
+4894 5620 1
+4894 5640 1
+4894 5713 1
+4894 5799 1
+4894 5844 1
+4894 5872 1
+4894 5969 1
+4894 5972 1
+4894 6027 1
+4894 6029 1
+4894 6088 1
+4894 6130 1
+4894 6161 1
+4894 6225 1
+4894 6226 1
+4894 6246 1
+4894 6255 1
+4894 6261 1
+4894 6269 1
+4894 6302 1
+4894 6321 1
+4894 6340 1
+4894 6417 1
+4894 6424 1
+4894 6435 1
+4894 6474 1
+4894 6529 1
+4894 6592 1
+4894 6686 1
+4894 7362 1
+4894 8295 1
+4894 8296 1
+4898 1769 1
+4898 2014 1
+4898 3276 1
+4898 3854 1
+4898 4987 1
+4898 4993 1
+4898 4999 1
+4898 5044 1
+4898 5368 1
+4898 5392 1
+4898 5434 1
+4899 15 1
+4899 608 1
+4899 1648 1
+4899 1680 1
+4899 1733 1
+4899 1799 1
+4899 1972 1
+4899 2001 1
+4899 2014 1
+4899 2276 1
+4899 2364 1
+4899 2369 1
+4899 2381 1
+4899 2398 1
+4899 2440 1
+4899 2516 1
+4899 2576 1
+4899 2592 1
+4899 2689 1
+4899 2774 1
+4899 2822 1
+4899 2831 1
+4899 2909 1
+4899 2940 1
+4899 3002 1
+4899 3027 1
+4899 3084 1
+4899 3089 1
+4899 3092 1
+4899 3103 1
+4899 3238 1
+4899 3274 1
+4899 3284 1
+4899 3393 1
+4899 3417 1
+4899 3456 1
+4899 3460 1
+4899 3537 1
+4899 3586 1
+4899 3634 1
+4899 3643 1
+4899 3664 1
+4899 3691 1
+4899 3796 1
+4899 3813 1
+4899 3842 1
+4899 3843 1
+4899 3897 1
+4899 3910 1
+4899 4041 1
+4899 4098 1
+4899 4099 1
+4899 4124 1
+4899 4219 1
+4899 4247 1
+4899 4297 1
+4899 4310 1
+4899 4315 1
+4899 4335 1
+4899 4361 1
+4899 4400 1
+4899 4448 1
+4899 4482 1
+4899 4483 1
+4899 4534 1
+4899 4547 1
+4899 4574 1
+4899 4587 1
+4899 4600 1
+4899 4654 1
+4899 4689 1
+4899 4717 1
+4899 4748 1
+4899 4781 1
+4899 4824 1
+4899 4828 1
+4899 4929 1
+4899 4980 1
+4899 4986 1
+4899 4994 1
+4899 5055 1
+4899 5061 1
+4899 5072 1
+4899 5073 1
+4899 5092 1
+4899 5100 1
+4899 5103 1
+4899 5106 1
+4899 5123 1
+4899 5130 1
+4899 5132 1
+4899 5140 1
+4899 5144 1
+4899 5155 1
+4899 5162 1
+4899 5178 1
+4899 5182 1
+4899 5189 1
+4899 5199 1
+4899 5200 1
+4899 5204 1
+4899 5222 1
+4899 5233 1
+4899 5239 1
+4899 5245 1
+4899 5262 1
+4899 5301 1
+4899 5323 1
+4899 5327 1
+4899 5341 1
+4899 5392 1
+4899 5430 1
+4899 5437 1
+4899 5445 1
+4899 5449 1
+4899 5452 1
+4899 5459 1
+4899 5463 1
+4899 5479 1
+4899 5484 1
+4899 5545 1
+4899 5568 1
+4899 5626 1
+4899 5637 1
+4899 5680 1
+4899 5693 1
+4899 5743 1
+4899 5753 1
+4899 5775 1
+4899 5780 1
+4899 5799 1
+4899 5812 1
+4899 5819 1
+4899 5827 1
+4899 5844 1
+4899 5863 1
+4899 5886 1
+4899 5897 1
+4899 5925 1
+4899 5947 1
+4899 5963 1
+4899 6004 1
+4899 6006 1
+4899 6029 1
+4899 6098 1
+4899 6124 1
+4899 6246 1
+4899 6251 1
+4899 6299 1
+4899 6327 1
+4899 6328 1
+4899 6441 1
+4899 6458 1
+4899 6481 1
+4899 6498 1
+4899 6554 1
+4899 6715 1
+4899 6739 1
+4899 6832 1
+4899 6946 1
+4899 7373 1
+4899 7381 1
+4899 7809 1
+4899 7810 1
+4899 7860 1
+4899 7890 1
+4899 8042 1
+4899 8044 1
+4899 8128 1
+4900 2014 1
+4901 2014 1
+4901 4962 1
+4903 15 1
+4903 4037 1
+4904 15 1
+4904 4037 1
+4905 4037 1
+4923 2160 1
+4923 4037 1
+4923 6094 1
+4906 15 1
+4906 4037 1
+4908 4037 1
+4924 3015 1
+4924 4037 1
+4924 4536 1
+4924 4875 1
+4924 5079 1
+4924 5262 1
+4924 5404 1
+4924 5545 1
+4924 6251 1
+4924 6913 1
+4909 1648 1
+4909 4037 1
+4910 4037 1
+4910 4687 1
+4911 4037 1
+4912 15 1
+4912 4037 1
+4913 4037 1
+4914 15 1
+4914 4037 1
+4915 4037 1
+4915 5200 1
+4915 5404 1
+4915 6503 1
+4915 7414 1
+4915 8224 1
+4916 4037 1
+4917 4037 1
+4918 4037 1
+4925 4037 1
+4925 6714 1
+4919 4037 1
+4920 4037 1
+4920 7992 1
+4926 155 1
+4926 3962 1
+4926 4037 1
+4926 5760 1
+4926 6634 1
+4926 7050 1
+4926 8174 1
+4921 4037 1
+4922 15 1
+4922 4037 1
+4929 2381 1
+4929 2516 1
+4929 3456 1
+4929 4219 1
+4929 4536 1
+4929 5083 1
+4929 5120 1
+4929 5144 1
+4929 5417 1
+4931 3433 1
+4932 1305 1
+4932 3433 1
+4933 15 1
+4933 3433 1
+4933 6774 1
+4934 2398 1
+4934 2433 1
+4934 3456 1
+4934 4335 1
+4934 6784 1
+4934 8028 1
+4935 4335 1
+4936 4335 1
+4936 5144 1
+4937 1305 1
+4937 1310 1
+4937 2787 1
+4937 3002 1
+4937 3537 1
+4937 3854 1
+4937 3898 1
+4937 4124 1
+4937 4191 1
+4937 4298 1
+4937 4792 1
+4937 4938 1
+4937 4953 1
+4937 4993 1
+4937 4999 1
+4937 5026 1
+4937 5055 1
+4943 737 1
+4943 1024 1
+4943 2381 1
+4943 2851 1
+4943 3537 1
+4943 3726 1
+4943 3813 1
+4943 3962 1
+4943 4037 1
+4943 4044 1
+4943 4124 1
+4943 4297 1
+4943 4938 1
+4943 4962 1
+4943 5092 1
+4943 5100 1
+4943 5432 1
+4943 6784 1
+4943 6832 1
+4943 6913 1
+4943 6914 1
+4943 6976 1
+4943 6980 1
+4943 7063 1
+4943 7092 1
+4943 7301 1
+4943 7961 1
+4943 8121 1
+4943 8128 1
+4943 8134 1
+4943 8192 1
+4945 4044 1
+4944 3898 1
+4944 4044 1
+4944 4986 1
+4944 7839 1
+4947 2364 1
+4947 3276 1
+4947 3284 1
+4947 3537 1
+4947 3643 1
+4947 4124 1
+4947 5026 1
+4947 5055 1
+4947 5058 1
+4947 5073 1
+4948 15 1
+4948 608 1
+4948 737 1
+4948 967 1
+4948 1191 1
+4948 1310 1
+4948 1385 1
+4948 1473 1
+4948 1498 1
+4948 1680 1
+4948 1799 1
+4948 1982 1
+4948 2001 1
+4948 2354 1
+4948 2364 1
+4948 2369 1
+4948 2381 1
+4948 2398 1
+4948 2576 1
+4948 2592 1
+4948 2605 1
+4948 2658 1
+4948 2689 1
+4948 2764 1
+4948 2785 1
+4948 2787 1
+4948 2822 1
+4948 2831 1
+4948 2909 1
+4948 3002 1
+4948 3015 1
+4948 3027 1
+4948 3089 1
+4948 3092 1
+4948 3103 1
+4948 3106 1
+4948 3238 1
+4948 3274 1
+4948 3276 1
+4948 3284 1
+4948 3393 1
+4948 3417 1
+4948 3447 1
+4948 3452 1
+4948 3455 1
+4948 3456 1
+4948 3459 1
+4948 3460 1
+4948 3537 1
+4948 3554 1
+4948 3607 1
+4948 3664 1
+4948 3691 1
+4948 3752 1
+4948 3796 1
+4948 3813 1
+4948 3843 1
+4948 3897 1
+4948 3910 1
+4948 3976 1
+4948 4071 1
+4948 4124 1
+4948 4191 1
+4948 4247 1
+4948 4297 1
+4948 4315 1
+4948 4335 1
+4948 4338 1
+4948 4400 1
+4948 4401 1
+4948 4432 1
+4948 4435 1
+4948 4448 1
+4948 4482 1
+4948 4547 1
+4948 4587 1
+4948 4600 1
+4948 4653 1
+4948 4666 1
+4948 4712 1
+4948 4792 1
+4948 4797 1
+4948 4824 1
+4948 4828 1
+4948 4846 1
+4948 4929 1
+4948 4940 1
+4948 4964 1
+4948 4980 1
+4948 4981 1
+4948 4983 1
+4948 5020 1
+4948 5026 1
+4948 5028 1
+4948 5055 1
+4948 5072 1
+4948 5092 1
+4948 5096 1
+4948 5100 1
+4948 5106 1
+4948 5130 1
+4948 5144 1
+4948 5148 1
+4948 5162 1
+4948 5189 1
+4948 5200 1
+4948 5204 1
+4948 5210 1
+4948 5215 1
+4948 5222 1
+4948 5226 1
+4948 5239 1
+4948 5255 1
+4948 5263 1
+4948 5288 1
+4948 5311 1
+4948 5321 1
+4948 5326 1
+4948 5327 1
+4948 5335 1
+4948 5378 1
+4948 5388 1
+4948 5392 1
+4948 5412 1
+4948 5423 1
+4948 5426 1
+4948 5430 1
+4948 5449 1
+4948 5454 1
+4948 5459 1
+4948 5463 1
+4948 5465 1
+4948 5484 1
+4948 5506 1
+4948 5509 1
+4948 5568 1
+4948 5605 1
+4948 5620 1
+4948 5671 1
+4948 5721 1
+4948 5732 1
+4948 5737 1
+4948 5743 1
+4948 5773 1
+4948 5800 1
+4948 5806 1
+4948 5812 1
+4948 5817 1
+4948 5819 1
+4948 5839 1
+4948 5844 1
+4948 5872 1
+4948 5925 1
+4948 6044 1
+4948 6151 1
+4948 6320 1
+4948 6481 1
+4948 6555 1
+4948 6618 1
+4948 6634 1
+4948 6665 1
+4948 6737 1
+4948 6780 1
+4948 6875 1
+4948 6907 1
+4948 6914 1
+4948 6946 1
+4948 7005 1
+4948 7052 1
+4948 7054 1
+4948 7092 1
+4948 7233 1
+4948 7238 1
+4948 7279 1
+4948 7341 1
+4948 7389 1
+4948 7391 1
+4948 7400 1
+4948 7414 1
+4948 7443 1
+4948 7510 1
+4948 7561 1
+4948 7632 1
+4948 7694 1
+4948 7695 1
+4948 7726 1
+4948 7778 1
+4948 7810 1
+4948 7833 1
+4948 7855 1
+4948 7860 1
+4948 7862 1
+4948 7871 1
+4948 7882 1
+4948 7890 1
+4948 7924 1
+4948 7965 1
+4948 7979 1
+4948 8037 1
+4948 8042 1
+4948 8044 1
+4948 8051 1
+4948 8122 1
+4948 8124 1
+4948 8128 1
+4948 8163 1
+4948 8168 1
+4948 8178 1
+4948 8186 1
+4948 8192 1
+4948 8209 1
+4948 8212 1
+4948 8219 1
+4948 8237 1
+4950 2917 1
+4951 2917 1
+4952 4600 1
+4952 4938 1
+4952 4953 1
+4957 4189 1
+4960 1972 1
+4960 3291 1
+4960 4748 1
+4960 4962 1
+4960 5799 1
+4960 6006 1
+4960 6437 1
+4960 6505 1
+4963 1024 1
+4963 1310 1
+4963 1769 1
+4963 3455 1
+4963 3537 1
+4963 3691 1
+4963 3854 1
+4963 3898 1
+4963 4547 1
+4963 4938 1
+4963 4993 1
+4963 5092 1
+4963 5144 1
+4964 737 1
+4964 2364 1
+4964 2369 1
+4964 2398 1
+4964 2516 1
+4964 3015 1
+4964 3089 1
+4964 3284 1
+4964 3393 1
+4964 3447 1
+4964 3537 1
+4964 3586 1
+4964 3631 1
+4964 3664 1
+4964 3796 1
+4964 3854 1
+4964 3910 1
+4964 4037 1
+4964 4124 1
+4964 4297 1
+4964 4310 1
+4964 4448 1
+4964 4574 1
+4964 4604 1
+4964 4653 1
+4964 4715 1
+4964 5055 1
+4964 5073 1
+4964 5092 1
+4964 5100 1
+4964 5106 1
+4964 5200 1
+4964 5204 1
+4964 5222 1
+4964 5262 1
+4964 5273 1
+4964 5321 1
+4964 5404 1
+4964 5412 1
+4964 5459 1
+4964 5524 1
+4964 5760 1
+4964 5819 1
+4964 5844 1
+4964 5886 1
+4964 5969 1
+4964 6010 1
+4964 6059 1
+4964 6407 1
+4964 6414 1
+4964 6682 1
+4964 6755 1
+4964 6770 1
+4964 7023 1
+4964 7101 1
+4964 7149 1
+4964 7204 1
+4964 7214 1
+4964 7243 1
+4964 7908 1
+4965 3854 1
+4966 1385 1
+4966 1680 1
+4966 1865 1
+4966 2398 1
+4966 2576 1
+4966 2689 1
+4966 2764 1
+4966 3854 1
+4966 4297 1
+4966 4536 1
+4966 4797 1
+4966 5002 1
+4966 5072 1
+4966 5083 1
+4966 5106 1
+4966 5144 1
+4966 5162 1
+4966 5335 1
+4966 5459 1
+4966 5592 1
+4966 5683 1
+4966 6472 1
+4966 7047 1
+4966 7624 1
+4966 7699 1
+4967 15 1
+4967 608 1
+4967 737 1
+4967 840 1
+4967 896 1
+4967 1074 1
+4967 1159 1
+4967 1247 1
+4967 1352 1
+4967 1403 1
+4967 1473 1
+4967 1549 1
+4967 1648 1
+4967 1733 1
+4967 1799 1
+4967 1972 1
+4967 2001 1
+4967 2160 1
+4967 2258 1
+4967 2273 1
+4967 2276 1
+4967 2364 1
+4967 2381 1
+4967 2398 1
+4967 2433 1
+4967 2440 1
+4967 2490 1
+4967 2507 1
+4967 2511 1
+4967 2516 1
+4967 2565 1
+4967 2576 1
+4967 2592 1
+4967 2605 1
+4967 2620 1
+4967 2689 1
+4967 2764 1
+4967 2765 1
+4967 2774 1
+4967 2775 1
+4967 2785 1
+4967 2822 1
+4967 2831 1
+4967 2909 1
+4967 2925 1
+4967 3002 1
+4967 3015 1
+4967 3027 1
+4967 3089 1
+4967 3092 1
+4967 3103 1
+4967 3191 1
+4967 3238 1
+4967 3274 1
+4967 3291 1
+4967 3376 1
+4967 3393 1
+4967 3417 1
+4967 3456 1
+4967 3459 1
+4967 3460 1
+4967 3479 1
+4967 3498 1
+4967 3537 1
+4967 3586 1
+4967 3614 1
+4967 3631 1
+4967 3634 1
+4967 3643 1
+4967 3664 1
+4967 3691 1
+4967 3755 1
+4967 3792 1
+4967 3796 1
+4967 3803 1
+4967 3813 1
+4967 3830 1
+4967 3842 1
+4967 3843 1
+4967 3854 1
+4967 3873 1
+4967 3897 1
+4967 3910 1
+4967 3919 1
+4967 3958 1
+4967 4009 1
+4967 4037 1
+4967 4041 1
+4967 4065 1
+4967 4099 1
+4967 4124 1
+4967 4127 1
+4967 4134 1
+4967 4175 1
+4967 4247 1
+4967 4297 1
+4967 4310 1
+4967 4315 1
+4967 4335 1
+4967 4338 1
+4967 4355 1
+4967 4400 1
+4967 4448 1
+4967 4482 1
+4967 4483 1
+4967 4488 1
+4967 4500 1
+4967 4527 1
+4967 4530 1
+4967 4534 1
+4967 4536 1
+4967 4547 1
+4967 4574 1
+4967 4587 1
+4967 4600 1
+4967 4604 1
+4967 4625 1
+4967 4653 1
+4967 4666 1
+4967 4687 1
+4967 4689 1
+4967 4709 1
+4967 4712 1
+4967 4713 1
+4967 4715 1
+4967 4717 1
+4967 4748 1
+4967 4764 1
+4967 4781 1
+4967 4791 1
+4967 4795 1
+4967 4798 1
+4967 4824 1
+4967 4828 1
+4967 4846 1
+4967 4899 1
+4967 4929 1
+4967 4944 1
+4967 4964 1
+4967 4980 1
+4967 4986 1
+4967 4994 1
+4967 4999 1
+4967 5002 1
+4967 5020 1
+4967 5026 1
+4967 5037 1
+4967 5055 1
+4967 5058 1
+4967 5061 1
+4967 5072 1
+4967 5073 1
+4967 5083 1
+4967 5092 1
+4967 5100 1
+4967 5103 1
+4967 5106 1
+4967 5121 1
+4967 5123 1
+4967 5130 1
+4967 5140 1
+4967 5141 1
+4967 5144 1
+4967 5155 1
+4967 5176 1
+4967 5178 1
+4967 5179 1
+4967 5182 1
+4967 5188 1
+4967 5189 1
+4967 5200 1
+4967 5204 1
+4967 5210 1
+4967 5222 1
+4967 5226 1
+4967 5239 1
+4967 5254 1
+4967 5262 1
+4967 5273 1
+4967 5301 1
+4967 5335 1
+4967 5387 1
+4967 5392 1
+4967 5393 1
+4967 5404 1
+4967 5412 1
+4967 5423 1
+4967 5430 1
+4967 5432 1
+4967 5437 1
+4967 5439 1
+4967 5445 1
+4967 5459 1
+4967 5463 1
+4967 5465 1
+4967 5467 1
+4967 5479 1
+4967 5506 1
+4967 5509 1
+4967 5513 1
+4967 5514 1
+4967 5524 1
+4967 5527 1
+4967 5543 1
+4967 5545 1
+4967 5563 1
+4967 5568 1
+4967 5584 1
+4967 5596 1
+4967 5620 1
+4967 5623 1
+4967 5624 1
+4967 5637 1
+4967 5650 1
+4967 5651 1
+4967 5663 1
+4967 5680 1
+4967 5684 1
+4967 5693 1
+4967 5697 1
+4967 5705 1
+4967 5714 1
+4967 5721 1
+4967 5732 1
+4967 5737 1
+4967 5739 1
+4967 5743 1
+4967 5753 1
+4967 5775 1
+4967 5776 1
+4967 5780 1
+4967 5790 1
+4967 5792 1
+4967 5798 1
+4967 5799 1
+4967 5802 1
+4967 5804 1
+4967 5807 1
+4967 5814 1
+4967 5818 1
+4967 5822 1
+4967 5827 1
+4967 5828 1
+4967 5829 1
+4967 5837 1
+4967 5844 1
+4967 5848 1
+4967 5863 1
+4967 5871 1
+4967 5880 1
+4967 5886 1
+4967 5891 1
+4967 5922 1
+4967 5925 1
+4967 5926 1
+4967 5928 1
+4967 5932 1
+4967 5936 1
+4967 5947 1
+4967 5955 1
+4967 5969 1
+4967 5972 1
+4967 5991 1
+4967 5994 1
+4967 5998 1
+4967 6001 1
+4967 6006 1
+4967 6029 1
+4967 6047 1
+4967 6078 1
+4967 6083 1
+4967 6096 1
+4967 6097 1
+4967 6098 1
+4967 6106 1
+4967 6110 1
+4967 6124 1
+4967 6148 1
+4967 6156 1
+4967 6166 1
+4967 6170 1
+4967 6218 1
+4967 6221 1
+4967 6225 1
+4967 6226 1
+4967 6227 1
+4967 6229 1
+4967 6235 1
+4967 6246 1
+4967 6251 1
+4967 6257 1
+4967 6272 1
+4967 6296 1
+4967 6327 1
+4967 6328 1
+4967 6330 1
+4967 6337 1
+4967 6407 1
+4967 6409 1
+4967 6432 1
+4967 6437 1
+4967 6441 1
+4967 6458 1
+4967 6481 1
+4967 6496 1
+4967 6501 1
+4967 6505 1
+4967 6523 1
+4967 6528 1
+4967 6552 1
+4967 6554 1
+4967 6560 1
+4967 6570 1
+4967 6589 1
+4967 6594 1
+4967 6595 1
+4967 6599 1
+4967 6600 1
+4967 6606 1
+4967 6624 1
+4967 6632 1
+4967 6634 1
+4967 6661 1
+4967 6668 1
+4967 6682 1
+4967 6699 1
+4967 6715 1
+4967 6720 1
+4967 6721 1
+4967 6725 1
+4967 6770 1
+4967 6774 1
+4967 6777 1
+4967 6783 1
+4967 6784 1
+4967 6790 1
+4967 6806 1
+4967 6860 1
+4967 6869 1
+4967 6873 1
+4967 6897 1
+4967 6901 1
+4967 6920 1
+4967 6930 1
+4967 6945 1
+4967 6946 1
+4967 6950 1
+4967 6955 1
+4967 6976 1
+4967 7021 1
+4967 7101 1
+4967 7115 1
+4967 7119 1
+4967 7143 1
+4967 7144 1
+4967 7168 1
+4967 7214 1
+4967 7561 1
+4967 7927 1
+4967 8295 1
+4967 8296 1
+4938 737 1
+4938 2822 1
+4938 3417 1
+4938 4600 1
+4938 5162 1
+4938 5222 1
+4938 5323 1
+4938 5341 1
+4938 5412 1
+4938 5452 1
+4938 5506 1
+4938 5511 1
+4969 1769 1
+4970 15 1
+4970 1769 1
+4970 2822 1
+4970 4482 1
+4970 4875 1
+4970 6098 1
+4970 6229 1
+4970 6437 1
+4971 1769 1
+4972 1769 1
+4972 4298 1
+4973 1769 1
+4973 3002 1
+4973 3452 1
+4973 3537 1
+4973 3843 1
+4973 3898 1
+4973 4124 1
+4973 4654 1
+4974 737 1
+4974 1769 1
+4974 2576 1
+4974 2689 1
+4974 3002 1
+4974 3027 1
+4974 3089 1
+4974 3284 1
+4974 3447 1
+4974 3537 1
+4974 3586 1
+4974 3796 1
+4974 3843 1
+4974 3897 1
+4974 4310 1
+4974 4315 1
+4974 4574 1
+4974 4587 1
+4974 4653 1
+4974 4828 1
+4974 4929 1
+4974 5055 1
+4974 5123 1
+4974 5130 1
+4974 5144 1
+4974 5204 1
+4974 5215 1
+4974 5239 1
+4974 5351 1
+4974 5463 1
+4974 5524 1
+4974 5638 1
+4974 5743 1
+4974 5775 1
+4974 5844 1
+4974 5872 1
+4974 5886 1
+4974 6665 1
+4974 6832 1
+4974 6913 1
+4974 7414 1
+4974 7624 1
+4974 7642 1
+4974 7803 1
+4975 1024 1
+4975 3455 1
+4976 1024 1
+4976 2354 1
+4976 2364 1
+4976 3089 1
+4976 3843 1
+4976 3898 1
+4976 3976 1
+4976 4041 1
+4976 4099 1
+4976 4191 1
+4976 4310 1
+4976 4482 1
+4976 4574 1
+4976 4587 1
+4976 4824 1
+4976 4828 1
+4976 4999 1
+4976 5100 1
+4976 5215 1
+4976 5680 1
+4976 5886 1
+4976 6041 1
+4976 6505 1
+2346 1024 1
+2346 2764 1
+2346 6661 1
+2346 7965 1
+4978 1310 1
+4979 1310 1
+4980 1310 1
+4980 2398 1
+4980 2516 1
+4980 2774 1
+4980 3274 1
+4980 4099 1
+4980 4335 1
+4980 4777 1
+4980 5020 1
+4980 5178 1
+4980 5285 1
+4980 5543 1
+4980 5637 1
+4980 5639 1
+4980 5651 1
+4980 8295 1
+4981 1310 1
+4981 1385 1
+4981 1982 1
+4981 2001 1
+4981 2398 1
+4981 2440 1
+4981 2658 1
+4981 2689 1
+4981 2787 1
+4981 2909 1
+4981 3084 1
+4981 3586 1
+4981 3752 1
+4981 3962 1
+4981 4037 1
+4981 4191 1
+4981 4335 1
+4981 4587 1
+4981 4604 1
+4981 4712 1
+4981 4983 1
+4981 5002 1
+4981 5037 1
+4981 5073 1
+4981 5079 1
+4981 5188 1
+4981 5430 1
+4981 5584 1
+4981 5605 1
+4981 5671 1
+4981 5714 1
+4981 5807 1
+4981 5947 1
+4981 6151 1
+4981 6555 1
+4981 6560 1
+4981 6725 1
+4981 6774 1
+4981 6790 1
+4981 6979 1
+4981 7021 1
+4981 7063 1
+4981 7092 1
+4981 7341 1
+4981 7510 1
+4981 7553 1
+4981 7587 1
+4981 7833 1
+4981 7862 1
+4981 7879 1
+4981 7882 1
+4981 7908 1
+4981 7961 1
+4982 72 1
+4982 608 1
+4982 1310 1
+4982 1385 1
+4982 2398 1
+4982 2516 1
+4982 2775 1
+4982 3092 1
+4982 3106 1
+4982 3393 1
+4982 3455 1
+4982 3537 1
+4982 3755 1
+4982 3796 1
+4982 3813 1
+4982 3897 1
+4982 4099 1
+4982 4247 1
+4982 4335 1
+4982 4536 1
+4982 4653 1
+4982 4654 1
+4982 4712 1
+4982 4828 1
+4982 4846 1
+4982 4964 1
+4982 4983 1
+4982 5058 1
+4982 5083 1
+4982 5092 1
+4982 5100 1
+4982 5115 1
+4982 5144 1
+4982 5222 1
+4982 5254 1
+4982 5288 1
+4982 5321 1
+4982 5327 1
+4982 5454 1
+4982 5459 1
+4982 5511 1
+4982 5539 1
+4982 5817 1
+4977 1310 1
+4977 2369 1
+4977 3607 1
+4983 1310 1
+4983 4981 1
+4983 7860 1
+4983 7862 1
+4985 3898 1
+4986 3898 1
+4988 15 1
+4988 72 1
+4988 608 1
+4988 737 1
+4988 2276 1
+4988 2490 1
+4988 2516 1
+4988 2592 1
+4988 4247 1
+4988 4310 1
+4988 4551 1
+4988 5026 1
+4988 5092 1
+4988 5106 1
+4988 5178 1
+4988 5404 1
+4988 5459 1
+4988 5790 1
+4988 5994 1
+4988 6246 1
+4988 6424 1
+4988 6918 1
+4988 7632 1
+4989 1982 1
+4989 3447 1
+4989 3458 1
+4989 4298 1
+4989 5697 1
+4989 6262 1
+4989 6946 1
+4993 2386 1
+4993 4124 1
+4993 4297 1
+4993 5144 1
+4992 3002 1
+4992 4632 1
+4992 4993 1
+4992 7279 1
+4994 2589 1
+4994 3015 1
+4994 3634 1
+4994 4191 1
+4994 5199 1
+4994 5524 1
+4994 5760 1
+4994 5800 1
+4994 5897 1
+4994 6043 1
+4994 6299 1
+4994 6832 1
+4994 6869 1
+4994 7381 1
+4994 7414 1
+4994 7649 1
+4994 7803 1
+4994 7809 1
+4994 7813 1
+4995 4191 1
+4996 4191 1
+4864 4587 1
+4864 4632 1
+4864 4999 1
+4864 5902 1
+5000 4792 1
+5001 4792 1
+5002 72 1
+5002 737 1
+5002 840 1
+5002 1403 1
+5002 1549 1
+5002 1680 1
+5002 2276 1
+5002 2398 1
+5002 2511 1
+5002 2565 1
+5002 2851 1
+5002 2940 1
+5002 3456 1
+5002 3459 1
+5002 3631 1
+5002 3634 1
+5002 3643 1
+5002 3796 1
+5002 3803 1
+5002 3842 1
+5002 3897 1
+5002 4037 1
+5002 4041 1
+5002 4310 1
+5002 4315 1
+5002 4400 1
+5002 4448 1
+5002 4483 1
+5002 4536 1
+5002 4604 1
+5002 4632 1
+5002 4653 1
+5002 4709 1
+5002 4713 1
+5002 4792 1
+5002 4964 1
+5002 4966 1
+5002 4981 1
+5002 4992 1
+5002 5037 1
+5002 5061 1
+5002 5144 1
+5002 5148 1
+5002 5182 1
+5002 5188 1
+5002 5189 1
+5002 5199 1
+5002 5204 1
+5002 5210 1
+5002 5233 1
+5002 5239 1
+5002 5254 1
+5002 5263 1
+5002 5273 1
+5002 5393 1
+5002 5404 1
+5002 5432 1
+5002 5459 1
+5002 5484 1
+5002 5584 1
+5002 5721 1
+5002 5737 1
+5002 5773 1
+5002 5800 1
+5002 5802 1
+5002 5806 1
+5002 5814 1
+5002 5822 1
+5002 5827 1
+5002 5844 1
+5002 5872 1
+5002 5925 1
+5002 6047 1
+5002 6123 1
+5002 6124 1
+5002 6198 1
+5002 6221 1
+5002 6296 1
+5002 6327 1
+5002 6481 1
+5002 6501 1
+5002 6552 1
+5002 6555 1
+5002 6594 1
+5002 6600 1
+5002 6618 1
+5002 6628 1
+5002 6665 1
+5002 6715 1
+5002 6720 1
+5002 6774 1
+5002 6784 1
+5002 6832 1
+5002 6914 1
+5002 6946 1
+5002 6948 1
+5002 6979 1
+5002 6980 1
+5002 7052 1
+5002 7092 1
+5002 7115 1
+5002 7119 1
+5002 7143 1
+5002 7144 1
+5002 7186 1
+5002 7301 1
+5002 7373 1
+5002 7414 1
+5002 7442 1
+5002 7553 1
+5002 7620 1
+5002 7652 1
+5002 7662 1
+5002 7763 1
+5002 7809 1
+5003 2775 1
+5003 3607 1
+5005 3607 1
+4897 3458 1
+5006 72 1
+5006 1385 1
+5006 1680 1
+5006 2342 1
+5006 2369 1
+5006 2516 1
+5006 2775 1
+5006 3456 1
+5006 3458 1
+5006 3459 1
+5006 3796 1
+5006 4124 1
+5006 4219 1
+5006 4335 1
+5006 4536 1
+5006 4547 1
+5006 4797 1
+5006 4828 1
+5006 4964 1
+5006 5083 1
+5006 5132 1
+5006 5208 1
+5006 5210 1
+5006 5215 1
+5006 5288 1
+5006 5412 1
+5006 5459 1
+5006 5743 1
+5008 608 1
+5008 737 1
+5008 2369 1
+5008 2516 1
+5008 2775 1
+5008 2831 1
+5008 3089 1
+5008 3447 1
+5008 3456 1
+5008 3813 1
+5008 4068 1
+5008 4191 1
+5008 4587 1
+5008 4983 1
+5008 5073 1
+5008 5083 1
+5008 5130 1
+5008 5144 1
+5008 5189 1
+5008 5303 1
+5008 5323 1
+5008 5449 1
+5008 5484 1
+5008 5928 1
+5008 5973 1
+5008 5977 1
+5008 5980 1
+5009 2592 1
+5009 2822 1
+5009 3027 1
+5009 3106 1
+5009 3447 1
+5009 4547 1
+5009 4899 1
+5009 5026 1
+5009 5130 1
+5009 5222 1
+5009 5239 1
+5009 5524 1
+5009 5848 1
+5009 6855 1
+5010 3447 1
+5010 4037 1
+5010 5079 1
+5010 7857 1
+5011 3447 1
+5011 3796 1
+5011 4099 1
+5011 4191 1
+5011 4687 1
+5011 4977 1
+5011 5254 1
+5011 5285 1
+5011 5506 1
+5011 5584 1
+5012 2398 1
+5012 2764 1
+5012 3393 1
+5012 3417 1
+5012 3447 1
+5012 4124 1
+5012 4335 1
+5012 4666 1
+5012 4964 1
+5012 4983 1
+5012 5568 1
+5012 5640 1
+5012 6441 1
+5012 6613 1
+5013 525 1
+5013 3027 1
+5013 3447 1
+5013 4448 1
+5013 4587 1
+5013 5288 1
+5013 5449 1
+5016 2775 1
+5016 4071 1
+5016 5100 1
+5016 5162 1
+5016 5509 1
+5016 5529 1
+5016 5950 1
+5016 6914 1
+5016 7092 1
+5016 7890 1
+5017 72 1
+5017 2775 1
+5017 4099 1
+5017 4335 1
+5017 5012 1
+5017 5020 1
+5017 5233 1
+5017 5254 1
+5017 5683 1
+5018 2775 1
+5022 1074 1
+5022 1493 1
+5022 1549 1
+5022 1823 1
+5022 1982 1
+5022 2160 1
+5022 2285 1
+5022 2433 1
+5022 2490 1
+5022 2535 1
+5022 2620 1
+5022 2774 1
+5022 2914 1
+5022 3015 1
+5022 3191 1
+5022 3291 1
+5022 3459 1
+5022 3479 1
+5022 3614 1
+5022 3830 1
+5022 3842 1
+5022 3873 1
+5022 3897 1
+5022 3919 1
+5022 3922 1
+5022 4065 1
+5022 4099 1
+5022 4134 1
+5022 4441 1
+5022 4488 1
+5022 4507 1
+5022 4574 1
+5022 4604 1
+5022 4687 1
+5022 4689 1
+5022 4709 1
+5022 4748 1
+5022 4791 1
+5022 4795 1
+5022 4875 1
+5022 4994 1
+5022 5020 1
+5022 5037 1
+5022 5121 1
+5022 5140 1
+5022 5178 1
+5022 5179 1
+5022 5182 1
+5022 5188 1
+5022 5210 1
+5022 5233 1
+5022 5254 1
+5022 5262 1
+5022 5263 1
+5022 5301 1
+5022 5335 1
+5022 5404 1
+5022 5415 1
+5022 5423 1
+5022 5439 1
+5022 5482 1
+5022 5487 1
+5022 5524 1
+5022 5543 1
+5022 5545 1
+5022 5563 1
+5022 5624 1
+5022 5626 1
+5022 5638 1
+5022 5684 1
+5022 5697 1
+5022 5738 1
+5022 5739 1
+5022 5753 1
+5022 5760 1
+5022 5798 1
+5022 5799 1
+5022 5807 1
+5022 5809 1
+5022 5814 1
+5022 5818 1
+5022 5824 1
+5022 5829 1
+5022 5863 1
+5022 5886 1
+5022 5891 1
+5022 5936 1
+5022 5947 1
+5022 5950 1
+5022 5963 1
+5022 5973 1
+5022 5977 1
+5022 6001 1
+5022 6006 1
+5022 6023 1
+5022 6094 1
+5022 6148 1
+5022 6151 1
+5022 6161 1
+5022 6164 1
+5022 6170 1
+5022 6218 1
+5022 6229 1
+5022 6246 1
+5022 6251 1
+5022 6255 1
+5022 6262 1
+5022 6305 1
+5022 6327 1
+5022 6330 1
+5022 6334 1
+5022 6337 1
+5022 6347 1
+5022 6388 1
+5022 6407 1
+5022 6409 1
+5022 6417 1
+5022 6424 1
+5022 6432 1
+5022 6441 1
+5022 6474 1
+5022 6498 1
+5022 6501 1
+5022 6511 1
+5022 6523 1
+5022 6528 1
+5022 6552 1
+5022 6553 1
+5022 6554 1
+5022 6555 1
+5022 6566 1
+5022 6571 1
+5022 6576 1
+5022 6594 1
+5022 6595 1
+5022 6599 1
+5022 6600 1
+5022 6628 1
+5022 6632 1
+5022 6634 1
+5022 6661 1
+5022 6663 1
+5022 6665 1
+5022 6715 1
+5022 6720 1
+5022 6725 1
+5022 6755 1
+5022 6765 1
+5022 6769 1
+5022 6770 1
+5022 6783 1
+5022 6788 1
+5022 6789 1
+5022 6790 1
+5022 6803 1
+5022 6833 1
+5022 6850 1
+5022 6855 1
+5022 6860 1
+5022 6890 1
+5022 6897 1
+5022 6930 1
+5022 6933 1
+5022 6934 1
+5022 6938 1
+5022 6945 1
+5022 6948 1
+5022 6953 1
+5022 6955 1
+5022 6979 1
+5022 8295 1
+5022 8297 1
+5019 5022 1
+5020 72 1
+5020 95 1
+5020 896 1
+5020 1026 1
+5020 1247 1
+5020 1385 1
+5020 1548 1
+5020 1549 1
+5020 1680 1
+5020 1799 1
+5020 1982 1
+5020 2276 1
+5020 2354 1
+5020 2381 1
+5020 2398 1
+5020 2516 1
+5020 2565 1
+5020 2620 1
+5020 2785 1
+5020 2822 1
+5020 2902 1
+5020 3027 1
+5020 3089 1
+5020 3103 1
+5020 3106 1
+5020 3191 1
+5020 3334 1
+5020 3393 1
+5020 3417 1
+5020 3456 1
+5020 3459 1
+5020 3460 1
+5020 3554 1
+5020 3643 1
+5020 3755 1
+5020 3808 1
+5020 3897 1
+5020 3910 1
+5020 3919 1
+5020 3976 1
+5020 4068 1
+5020 4335 1
+5020 4400 1
+5020 4441 1
+5020 4482 1
+5020 4500 1
+5020 4530 1
+5020 4653 1
+5020 4666 1
+5020 4777 1
+5020 4824 1
+5020 4875 1
+5020 4929 1
+5020 4964 1
+5020 4977 1
+5020 5022 1
+5020 5073 1
+5020 5075 1
+5020 5130 1
+5020 5148 1
+5020 5162 1
+5020 5176 1
+5020 5178 1
+5020 5204 1
+5020 5208 1
+5020 5233 1
+5020 5240 1
+5020 5245 1
+5020 5255 1
+5020 5271 1
+5020 5285 1
+5020 5288 1
+5020 5296 1
+5020 5308 1
+5020 5312 1
+5020 5321 1
+5020 5323 1
+5020 5327 1
+5020 5335 1
+5020 5341 1
+5020 5350 1
+5020 5368 1
+5020 5375 1
+5020 5392 1
+5020 5412 1
+5020 5415 1
+5020 5417 1
+5020 5423 1
+5020 5430 1
+5020 5449 1
+5020 5452 1
+5020 5463 1
+5020 5484 1
+5020 5506 1
+5020 5509 1
+5020 5511 1
+5020 5513 1
+5020 5543 1
+5020 5545 1
+5020 5559 1
+5020 5563 1
+5020 5592 1
+5020 5620 1
+5020 5630 1
+5020 5638 1
+5020 5640 1
+5020 5651 1
+5020 5697 1
+5020 5706 1
+5020 5740 1
+5020 5760 1
+5020 5772 1
+5020 5817 1
+5020 5850 1
+5020 5860 1
+5020 5872 1
+5020 5936 1
+5020 5963 1
+5020 6059 1
+5020 6080 1
+5020 6094 1
+5020 6148 1
+5020 6229 1
+5020 6251 1
+5020 6278 1
+5020 6311 1
+5020 6327 1
+5020 6334 1
+5020 6400 1
+5020 6414 1
+5020 6422 1
+5020 6725 1
+5020 6994 1
+5020 7050 1
+5020 7168 1
+5020 7478 1
+5020 7553 1
+5020 7632 1
+5020 8295 1
+5024 3537 1
+5024 5026 1
+5024 6148 1
+5024 7092 1
+5028 3238 1
+5028 3452 1
+5028 3897 1
+5028 3962 1
+5028 4037 1
+5028 4361 1
+5028 4653 1
+5028 4781 1
+5028 4981 1
+5028 4986 1
+5028 5022 1
+5028 5079 1
+5028 5254 1
+5028 5605 1
+5028 5614 1
+5028 5671 1
+5028 5814 1
+5028 5839 1
+5028 6006 1
+5028 6023 1
+5028 6218 1
+5028 6334 1
+5028 6409 1
+5028 6414 1
+5028 6498 1
+5028 6665 1
+5028 6762 1
+5028 6784 1
+5028 6907 1
+5028 7047 1
+5028 7052 1
+5028 7092 1
+5028 7115 1
+5028 7116 1
+5028 7618 1
+5028 7620 1
+5028 7632 1
+5028 7683 1
+5028 7809 1
+5028 7908 1
+5028 8073 1
+5028 8083 1
+5028 8124 1
+5029 608 1
+5029 737 1
+5029 2785 1
+5029 2822 1
+5029 3027 1
+5029 3103 1
+5029 3417 1
+5029 3452 1
+5029 3456 1
+5029 3796 1
+5029 3910 1
+5029 4099 1
+5029 4400 1
+5029 4600 1
+5029 4653 1
+5029 4712 1
+5029 4929 1
+5029 5155 1
+5029 5323 1
+5029 5327 1
+5029 5423 1
+5029 5430 1
+5029 5449 1
+5029 5459 1
+5029 5484 1
+5029 5511 1
+5031 4983 1
+5032 3334 1
+5032 4983 1
+5035 2787 1
+5036 2787 1
+5036 3537 1
+5036 4124 1
+5036 4654 1
+5037 15 1
+5037 2787 1
+5037 3089 1
+5037 3334 1
+5037 3459 1
+5037 3796 1
+5037 4530 1
+5037 4536 1
+5037 4712 1
+5037 5055 1
+5037 5123 1
+5037 5295 1
+5037 5563 1
+5037 5605 1
+5037 5680 1
+5037 5743 1
+5037 7871 1
+5037 7908 1
+5038 840 1
+5038 3002 1
+5038 5928 1
+5038 6004 1
+5038 6632 1
+5039 2364 1
+5039 3002 1
+5039 3284 1
+5039 3455 1
+5039 3537 1
+5039 4297 1
+5039 5073 1
+5040 3002 1
+5040 3027 1
+5040 3537 1
+5043 3284 1
+5043 5092 1
+5046 4124 1
+5046 4191 1
+5047 4124 1
+5048 4124 1
+5048 4488 1
+5048 5233 1
+5048 5524 1
+5048 6855 1
+5048 6869 1
+5051 3084 1
+5051 4175 1
+5051 5055 1
+5051 5775 1
+5051 7855 1
+5051 7862 1
+5051 7890 1
+5051 7979 1
+5052 5055 1
+5053 2511 1
+5053 2774 1
+5053 2940 1
+5053 3238 1
+5053 3498 1
+5053 3969 1
+5053 4037 1
+5053 4175 1
+5053 4335 1
+5053 4632 1
+5053 4884 1
+5053 4981 1
+5053 5022 1
+5053 5028 1
+5053 5055 1
+5053 5079 1
+5053 5262 1
+5053 5671 1
+5053 5760 1
+5053 5775 1
+5053 5835 1
+5053 5897 1
+5053 5933 1
+5053 6043 1
+5053 6123 1
+5053 6151 1
+5053 6229 1
+5053 6299 1
+5053 6337 1
+5053 6496 1
+5053 6712 1
+5053 6780 1
+5053 6832 1
+5053 6897 1
+5053 6907 1
+5053 6934 1
+5053 6955 1
+5053 6980 1
+5053 7088 1
+5053 7116 1
+5053 7381 1
+5053 7561 1
+5053 7587 1
+5053 7620 1
+5053 7624 1
+5053 7632 1
+5053 7651 1
+5053 7662 1
+5053 7871 1
+5053 7890 1
+5053 7908 1
+5053 8174 1
+5054 5055 1
+5054 7119 1
+5057 5058 1
+5059 840 1
+5059 3346 1
+5059 3537 1
+5059 3726 1
+5059 3809 1
+5059 4666 1
+5059 5384 1
+5059 5432 1
+5059 5922 1
+5059 5932 1
+5059 6097 1
+5059 6634 1
+5059 6784 1
+5059 6913 1
+5059 6946 1
+5059 7040 1
+5059 7052 1
+5059 7074 1
+5059 7094 1
+5059 7110 1
+5059 7143 1
+5059 7289 1
+5059 7290 1
+5059 7301 1
+5059 7306 1
+5059 7318 1
+5060 3537 1
+5060 4653 1
+5060 8174 1
+5061 2386 1
+5061 3537 1
+5061 4527 1
+5061 4786 1
+5061 5215 1
+5061 5499 1
+5061 5543 1
+5061 5684 1
+5061 5760 1
+5061 5850 1
+5061 5950 1
+5061 6360 1
+5061 6407 1
+5062 3537 1
+5063 3537 1
+5064 4654 1
+5065 4654 1
+5069 737 1
+5069 2364 1
+5069 4127 1
+5069 4866 1
+5069 5002 1
+5067 2364 1
+5067 6720 1
+5068 2364 1
+5068 2940 1
+5068 3455 1
+5068 4712 1
+5068 5096 1
+5068 5452 1
+5068 5454 1
+5068 7381 1
+5068 7908 1
+5068 8124 1
+5071 4297 1
+5072 3498 1
+5072 5073 1
+5072 6174 1
+5077 3284 1
+5078 3284 1
+5078 5130 1
+5078 5341 1
+5079 15 1
+5079 737 1
+5079 1074 1
+5079 1247 1
+5079 1352 1
+5079 1473 1
+5079 1549 1
+5079 1680 1
+5079 1799 1
+5079 1972 1
+5079 1982 1
+5079 2001 1
+5079 2273 1
+5079 2276 1
+5079 2285 1
+5079 2369 1
+5079 2381 1
+5079 2398 1
+5079 2433 1
+5079 2440 1
+5079 2516 1
+5079 2535 1
+5079 2565 1
+5079 2576 1
+5079 2605 1
+5079 2774 1
+5079 2831 1
+5079 2902 1
+5079 2909 1
+5079 3015 1
+5079 3084 1
+5079 3089 1
+5079 3103 1
+5079 3191 1
+5079 3284 1
+5079 3291 1
+5079 3297 1
+5079 3334 1
+5079 3346 1
+5079 3417 1
+5079 3456 1
+5079 3459 1
+5079 3460 1
+5079 3479 1
+5079 3498 1
+5079 3586 1
+5079 3614 1
+5079 3634 1
+5079 3643 1
+5079 3691 1
+5079 3755 1
+5079 3792 1
+5079 3796 1
+5079 3830 1
+5079 3842 1
+5079 3897 1
+5079 3919 1
+5079 3976 1
+5079 4041 1
+5079 4065 1
+5079 4098 1
+5079 4099 1
+5079 4134 1
+5079 4218 1
+5079 4219 1
+5079 4247 1
+5079 4310 1
+5079 4335 1
+5079 4338 1
+5079 4361 1
+5079 4400 1
+5079 4401 1
+5079 4448 1
+5079 4468 1
+5079 4483 1
+5079 4527 1
+5079 4530 1
+5079 4534 1
+5079 4536 1
+5079 4547 1
+5079 4574 1
+5079 4587 1
+5079 4625 1
+5079 4631 1
+5079 4653 1
+5079 4666 1
+5079 4687 1
+5079 4712 1
+5079 4715 1
+5079 4717 1
+5079 4748 1
+5079 4777 1
+5079 4795 1
+5079 4798 1
+5079 4824 1
+5079 4828 1
+5079 4846 1
+5079 4875 1
+5079 4899 1
+5079 4929 1
+5079 4940 1
+5079 4944 1
+5079 4964 1
+5079 4980 1
+5079 4981 1
+5079 4983 1
+5079 4986 1
+5079 4994 1
+5079 5002 1
+5079 5020 1
+5079 5037 1
+5079 5061 1
+5079 5100 1
+5079 5121 1
+5079 5123 1
+5079 5130 1
+5079 5133 1
+5079 5144 1
+5079 5145 1
+5079 5148 1
+5079 5176 1
+5079 5178 1
+5079 5188 1
+5079 5189 1
+5079 5199 1
+5079 5200 1
+5079 5204 1
+5079 5208 1
+5079 5215 1
+5079 5226 1
+5079 5233 1
+5079 5254 1
+5079 5262 1
+5079 5263 1
+5079 5273 1
+5079 5289 1
+5079 5301 1
+5079 5306 1
+5079 5310 1
+5079 5321 1
+5079 5327 1
+5079 5335 1
+5079 5368 1
+5079 5393 1
+5079 5404 1
+5079 5415 1
+5079 5437 1
+5079 5439 1
+5079 5449 1
+5079 5454 1
+5079 5459 1
+5079 5466 1
+5079 5499 1
+5079 5506 1
+5079 5524 1
+5079 5527 1
+5079 5539 1
+5079 5543 1
+5079 5545 1
+5079 5563 1
+5079 5568 1
+5079 5570 1
+5079 5584 1
+5079 5588 1
+5079 5596 1
+5079 5624 1
+5079 5637 1
+5079 5638 1
+5079 5664 1
+5079 5684 1
+5079 5693 1
+5079 5697 1
+5079 5709 1
+5079 5714 1
+5079 5732 1
+5079 5737 1
+5079 5739 1
+5079 5743 1
+5079 5756 1
+5079 5760 1
+5079 5775 1
+5079 5780 1
+5079 5798 1
+5079 5799 1
+5079 5801 1
+5079 5802 1
+5079 5811 1
+5079 5812 1
+5079 5814 1
+5079 5817 1
+5079 5824 1
+5079 5827 1
+5079 5828 1
+5079 5829 1
+5079 5837 1
+5079 5844 1
+5079 5871 1
+5079 5872 1
+5079 5886 1
+5079 5891 1
+5079 5902 1
+5079 5947 1
+5079 5950 1
+5079 6006 1
+5079 6098 1
+5079 6124 1
+5079 6156 1
+5079 6170 1
+5079 6221 1
+5079 6272 1
+5079 6299 1
+5079 6306 1
+5079 6320 1
+5079 6323 1
+5079 6328 1
+5079 6337 1
+5079 6347 1
+5079 6360 1
+5079 6388 1
+5079 6417 1
+5079 6422 1
+5079 6427 1
+5079 6432 1
+5079 6437 1
+5079 6481 1
+5079 6505 1
+5079 6523 1
+5079 6552 1
+5079 6555 1
+5079 6560 1
+5079 6566 1
+5079 6576 1
+5079 6594 1
+5079 6618 1
+5079 6632 1
+5079 6665 1
+5079 6699 1
+5079 6714 1
+5079 6715 1
+5079 6720 1
+5079 6736 1
+5079 6739 1
+5079 6765 1
+5079 6774 1
+5079 6778 1
+5079 6784 1
+5079 6832 1
+5079 6833 1
+5079 6855 1
+5079 6897 1
+5079 6913 1
+5079 6934 1
+5079 6946 1
+5079 6948 1
+5079 6976 1
+5079 7047 1
+5079 7108 1
+5079 7238 1
+5079 7295 1
+5079 7319 1
+5079 7478 1
+5079 7553 1
+5079 7632 1
+5079 7699 1
+5079 7810 1
+5079 7839 1
+5079 7924 1
+5079 8002 1
+5079 8224 1
+5079 8277 1
+5079 8295 1
+5080 3284 1
+5080 5096 1
+5080 5651 1
+5081 2398 1
+5081 3284 1
+5081 4247 1
+5081 5083 1
+5081 5484 1
+5084 5083 1
+5085 4828 1
+5085 5083 1
+5085 5115 1
+5085 5880 1
+5086 5092 1
+5087 5092 1
+5088 5092 1
+5089 15 1
+5089 3479 1
+5089 3897 1
+5089 4795 1
+5089 4980 1
+5089 5092 1
+5089 5262 1
+5089 6328 1
+5090 1403 1
+5090 5092 1
+5090 5459 1
+5091 5092 1
+5095 3792 1
+5095 5100 1
+5095 5295 1
+5096 4310 1
+5096 5072 1
+5096 5100 1
+5096 5327 1
+5096 5412 1
+5096 5683 1
+5096 5973 1
+5096 6044 1
+5096 6174 1
+5096 6442 1
+5096 7238 1
+5096 7833 1
+5096 7910 1
+5096 8209 1
+5097 5100 1
+5099 15 1
+5099 737 1
+5099 1026 1
+5099 2831 1
+5099 2925 1
+5099 3459 1
+5099 4191 1
+5099 4276 1
+5099 4335 1
+5099 4587 1
+5099 5100 1
+5099 5239 1
+5099 5640 1
+5099 7604 1
+5098 5100 1
+5098 6784 1
+5106 1403 1
+5106 1680 1
+5106 1982 1
+5106 2822 1
+5106 2851 1
+5106 3103 1
+5106 3643 1
+5106 4037 1
+5106 4335 1
+5106 4400 1
+5106 4983 1
+5106 5022 1
+5106 5103 1
+5106 5210 1
+5106 5412 1
+5106 5459 1
+5106 5543 1
+5106 5664 1
+5106 5922 1
+5106 5925 1
+5106 6000 1
+5106 6227 1
+5106 6832 1
+5106 6875 1
+5106 6980 1
+5106 7280 1
+5106 7297 1
+5106 7365 1
+5106 7397 1
+5106 7803 1
+5106 8169 1
+5106 8212 1
+5106 8219 1
+5102 737 1
+5102 1403 1
+5102 2565 1
+5102 2765 1
+5102 2785 1
+5102 3238 1
+5102 3293 1
+5102 3459 1
+5102 3643 1
+5102 4037 1
+5102 4041 1
+5102 4507 1
+5102 4875 1
+5102 5012 1
+5102 5022 1
+5102 5028 1
+5102 5079 1
+5102 5103 1
+5102 5106 1
+5102 5182 1
+5102 5188 1
+5102 5210 1
+5102 5254 1
+5102 5288 1
+5102 5484 1
+5102 5605 1
+5102 5773 1
+5102 5812 1
+5102 5814 1
+5102 5818 1
+5102 5922 1
+5102 5936 1
+5102 6029 1
+5102 6227 1
+5102 6330 1
+5102 6442 1
+5102 6552 1
+5102 6681 1
+5102 6875 1
+5102 6918 1
+5102 6980 1
+5102 7115 1
+5102 7168 1
+5102 7201 1
+5102 7225 1
+5102 7280 1
+5102 7553 1
+5102 7561 1
+5102 7618 1
+5102 7620 1
+5102 7908 1
+5102 8141 1
+5102 8163 1
+5102 8212 1
+5103 1498 1
+5103 1823 1
+5103 2774 1
+5103 2785 1
+5103 2851 1
+5103 3238 1
+5103 3614 1
+5103 3631 1
+5103 3634 1
+5103 3873 1
+5103 3897 1
+5103 4037 1
+5103 4071 1
+5103 4134 1
+5103 4361 1
+5103 4401 1
+5103 4435 1
+5103 4483 1
+5103 4536 1
+5103 4604 1
+5103 4666 1
+5103 4709 1
+5103 4717 1
+5103 4884 1
+5103 5002 1
+5103 5022 1
+5103 5028 1
+5103 5064 1
+5103 5079 1
+5103 5106 1
+5103 5148 1
+5103 5178 1
+5103 5465 1
+5103 5524 1
+5103 5529 1
+5103 5584 1
+5103 5605 1
+5103 5624 1
+5103 5671 1
+5103 5714 1
+5103 5799 1
+5103 5804 1
+5103 5814 1
+5103 5839 1
+5103 5922 1
+5103 6006 1
+5103 6032 1
+5103 6097 1
+5103 6227 1
+5103 6306 1
+5103 6320 1
+5103 6327 1
+5103 6400 1
+5103 6417 1
+5103 6441 1
+5103 6442 1
+5103 6501 1
+5103 6503 1
+5103 6523 1
+5103 6554 1
+5103 6555 1
+5103 6566 1
+5103 6599 1
+5103 6600 1
+5103 6624 1
+5103 6634 1
+5103 6720 1
+5103 6780 1
+5103 6790 1
+5103 6832 1
+5103 6833 1
+5103 6869 1
+5103 6875 1
+5103 6897 1
+5103 6914 1
+5103 7005 1
+5103 7052 1
+5103 7073 1
+5103 7074 1
+5103 7092 1
+5103 7108 1
+5103 7115 1
+5103 7116 1
+5103 7225 1
+5103 7233 1
+5103 7237 1
+5103 7280 1
+5103 7295 1
+5103 7386 1
+5103 7391 1
+5103 7414 1
+5103 7443 1
+5103 7510 1
+5103 7512 1
+5103 7529 1
+5103 7544 1
+5103 7553 1
+5103 7587 1
+5103 7618 1
+5103 7620 1
+5103 7624 1
+5103 7647 1
+5103 7649 1
+5103 7651 1
+5103 7694 1
+5103 7726 1
+5103 7810 1
+5103 7813 1
+5103 7835 1
+5103 7862 1
+5103 7890 1
+5103 7912 1
+5103 7992 1
+5103 8002 1
+5103 8051 1
+5103 8083 1
+5103 8122 1
+5103 8128 1
+5103 8141 1
+5103 8163 1
+5103 8168 1
+5103 8174 1
+5103 8178 1
+5103 8192 1
+5103 8212 1
+5103 8219 1
+5103 8224 1
+5104 1473 1
+5104 5106 1
+5104 6151 1
+5105 5106 1
+5109 2516 1
+5111 2381 1
+5111 2516 1
+5111 3334 1
+5111 3813 1
+5111 4536 1
+5111 4828 1
+5111 5130 1
+5110 15 1
+5110 1247 1
+5110 1680 1
+5110 2354 1
+5110 2369 1
+5110 2381 1
+5110 2386 1
+5110 2516 1
+5110 2592 1
+5110 2785 1
+5110 2822 1
+5110 2909 1
+5110 3092 1
+5110 3103 1
+5110 3417 1
+5110 3460 1
+5110 3479 1
+5110 3498 1
+5110 3614 1
+5110 3664 1
+5110 3813 1
+5110 3873 1
+5110 3897 1
+5110 3910 1
+5110 3976 1
+5110 4400 1
+5110 4448 1
+5110 4483 1
+5110 4547 1
+5110 4645 1
+5110 4687 1
+5110 4712 1
+5110 4715 1
+5110 4717 1
+5110 4795 1
+5110 4798 1
+5110 4828 1
+5110 4964 1
+5110 5123 1
+5110 5130 1
+5110 5132 1
+5110 5144 1
+5110 5162 1
+5110 5176 1
+5110 5178 1
+5110 5182 1
+5110 5204 1
+5110 5210 1
+5110 5215 1
+5110 5222 1
+5110 5262 1
+5110 5263 1
+5110 5301 1
+5110 5323 1
+5110 5327 1
+5110 5335 1
+5110 5341 1
+5110 5392 1
+5110 5412 1
+5110 5415 1
+5110 5423 1
+5110 5430 1
+5110 5439 1
+5110 5457 1
+5110 5487 1
+5110 5545 1
+5110 5684 1
+5110 5798 1
+5110 5802 1
+5110 5804 1
+5110 5886 1
+5110 5891 1
+5110 5925 1
+5110 5928 1
+5110 5947 1
+5110 5963 1
+5110 6246 1
+5110 6251 1
+5110 6255 1
+5110 6337 1
+5110 6388 1
+5110 6400 1
+5110 6417 1
+5110 6422 1
+5112 2516 1
+5114 967 1
+5114 5115 1
+5114 7386 1
+5114 7908 1
+4828 15 1
+4828 95 1
+4828 608 1
+4828 737 1
+4828 840 1
+4828 896 1
+4828 1385 1
+4828 1549 1
+4828 1982 1
+4828 2273 1
+4828 2516 1
+4828 2565 1
+4828 2774 1
+4828 2822 1
+4828 2925 1
+4828 3089 1
+4828 3238 1
+4828 3291 1
+4828 3346 1
+4828 3586 1
+4828 3752 1
+4828 3792 1
+4828 3796 1
+4828 3873 1
+4828 3976 1
+4828 4098 1
+4828 4099 1
+4828 4448 1
+4828 4482 1
+4828 4488 1
+4828 4530 1
+4828 4621 1
+4828 4666 1
+4828 4712 1
+4828 4717 1
+4828 4748 1
+4828 4764 1
+4828 4791 1
+4828 4795 1
+4828 4797 1
+4828 4944 1
+4828 5020 1
+4828 5123 1
+4828 5155 1
+4828 5178 1
+4828 5239 1
+4828 5262 1
+4828 5263 1
+4828 5321 1
+4828 5326 1
+4828 5335 1
+4828 5404 1
+4828 5415 1
+4828 5434 1
+4828 5439 1
+4828 5449 1
+4828 5452 1
+4828 5457 1
+4828 5465 1
+4828 5470 1
+4828 5481 1
+4828 5506 1
+4828 5524 1
+4828 5545 1
+4828 5563 1
+4828 5564 1
+4828 5596 1
+4828 5623 1
+4828 5663 1
+4828 5665 1
+4828 5697 1
+4828 5714 1
+4828 5738 1
+4828 5739 1
+4828 5757 1
+4828 5806 1
+4828 5811 1
+4828 5818 1
+4828 5829 1
+4828 5871 1
+4828 5872 1
+4828 5922 1
+4828 5936 1
+4828 5955 1
+4828 5963 1
+4828 5969 1
+4828 5973 1
+4828 5977 1
+4828 5980 1
+4828 5991 1
+4828 6001 1
+4828 6004 1
+4828 6021 1
+4828 6023 1
+4828 6041 1
+4828 6044 1
+4828 6054 1
+4828 6094 1
+4828 6098 1
+4828 6106 1
+4828 6161 1
+4828 6162 1
+4828 6218 1
+4828 6262 1
+4828 6272 1
+4828 6305 1
+4828 6327 1
+4828 6330 1
+4828 6337 1
+4828 6347 1
+4828 6388 1
+4828 6422 1
+4828 6424 1
+4828 6432 1
+4828 6435 1
+4828 6464 1
+4828 6472 1
+4828 6474 1
+4828 6481 1
+4828 6503 1
+4828 6532 1
+4828 6555 1
+4828 6567 1
+4828 6613 1
+4828 6624 1
+4828 6628 1
+4828 6665 1
+4828 6721 1
+4828 6725 1
+4828 6765 1
+4828 6783 1
+4828 6790 1
+4828 6803 1
+4828 6813 1
+4828 6832 1
+4828 6850 1
+4828 6855 1
+4828 6860 1
+4828 6869 1
+4828 6901 1
+4828 6913 1
+4828 6930 1
+4828 6938 1
+4828 6942 1
+4828 6953 1
+4828 6955 1
+4828 6979 1
+4828 6982 1
+4828 6994 1
+4828 7040 1
+4828 7052 1
+4828 7074 1
+4828 7315 1
+4828 7373 1
+4828 7386 1
+4828 7414 1
+4828 7553 1
+4828 7587 1
+4828 7593 1
+4828 7604 1
+4828 7634 1
+4828 7899 1
+4828 7979 1
+4828 7992 1
+4828 8249 1
+4828 8277 1
+4828 8295 1
+4828 8296 1
+5116 4828 1
+5117 3092 1
+5117 4828 1
+5118 72 1
+5118 1799 1
+5118 2001 1
+5118 2381 1
+5118 2386 1
+5118 3027 1
+5118 3092 1
+5118 4797 1
+5118 5020 1
+5118 5412 1
+5118 5459 1
+5118 5683 1
+5118 5743 1
+5119 737 1
+5119 1799 1
+5119 2381 1
+5119 2398 1
+5119 2592 1
+5119 2764 1
+5119 3092 1
+5119 3664 1
+5119 3813 1
+5119 4247 1
+5119 4547 1
+5119 4964 1
+5119 5130 1
+5119 5132 1
+5119 5144 1
+5119 5204 1
+5119 5222 1
+5119 5463 1
+5121 15 1
+5121 2160 1
+5121 3089 1
+5121 4715 1
+5121 5130 1
+5121 5301 1
+5121 5902 1
+5121 6296 1
+5121 6599 1
+5122 5130 1
+5123 15 1
+5123 896 1
+5123 1159 1
+5123 2160 1
+5123 2276 1
+5123 2398 1
+5123 2490 1
+5123 2535 1
+5123 2774 1
+5123 2775 1
+5123 2909 1
+5123 3015 1
+5123 3456 1
+5123 3586 1
+5123 3634 1
+5123 3873 1
+5123 3910 1
+5123 4037 1
+5123 4041 1
+5123 4065 1
+5123 4099 1
+5123 4175 1
+5123 4310 1
+5123 4335 1
+5123 4338 1
+5123 4534 1
+5123 4536 1
+5123 4574 1
+5123 4712 1
+5123 4795 1
+5123 5020 1
+5123 5130 1
+5123 5178 1
+5123 5182 1
+5123 5226 1
+5123 5233 1
+5123 5412 1
+5123 5449 1
+5123 5459 1
+5123 5466 1
+5123 5543 1
+5123 5568 1
+5123 5624 1
+5123 5671 1
+5123 5684 1
+5123 5737 1
+5123 5760 1
+5123 5775 1
+5123 5799 1
+5123 5814 1
+5123 5824 1
+5123 5891 1
+5123 6124 1
+5123 6299 1
+5123 6306 1
+5123 6323 1
+5123 6337 1
+5123 6422 1
+5123 6498 1
+5123 6566 1
+5123 6715 1
+5123 6784 1
+5123 7168 1
+5123 7632 1
+5123 7691 1
+5123 7699 1
+5123 7726 1
+5123 7809 1
+5123 7860 1
+5127 5130 1
+5128 5130 1
+5129 5130 1
+5124 5130 1
+5125 840 1
+5125 1385 1
+5125 2273 1
+5125 2386 1
+5125 2490 1
+5125 2774 1
+5125 3479 1
+5125 3634 1
+5125 4037 1
+5125 4483 1
+5125 4507 1
+5125 4534 1
+5125 4687 1
+5125 4781 1
+5125 4797 1
+5125 4828 1
+5125 4875 1
+5125 5130 1
+5125 5144 1
+5125 5178 1
+5125 5179 1
+5125 5245 1
+5125 5327 1
+5125 5341 1
+5125 5445 1
+5125 5482 1
+5125 5484 1
+5125 5524 1
+5125 5680 1
+5125 5753 1
+5125 5790 1
+5125 5828 1
+5125 5837 1
+5125 5850 1
+5125 5863 1
+5125 5936 1
+5125 5963 1
+5125 6006 1
+5125 6148 1
+5125 6151 1
+5125 6162 1
+5125 6229 1
+5125 6246 1
+5125 6251 1
+5125 6296 1
+5125 6306 1
+5125 6498 1
+5125 6528 1
+5125 6555 1
+5125 6634 1
+5125 6714 1
+5125 6855 1
+5125 7062 1
+5125 7094 1
+5050 2354 1
+5050 3092 1
+5050 4247 1
+5050 4587 1
+5050 4653 1
+5050 5020 1
+5050 5130 1
+5050 5200 1
+5050 5452 1
+5050 5484 1
+5050 6337 1
+5126 3092 1
+5126 5130 1
+5126 5144 1
+5135 3092 1
+5136 4536 1
+5138 5144 1
+5139 1385 1
+5139 2765 1
+5139 3191 1
+5139 3643 1
+5139 3976 1
+5139 4547 1
+5139 4645 1
+5139 5144 1
+5139 5182 1
+5139 5886 1
+5139 5963 1
+5140 1352 1
+5140 1493 1
+5140 1823 1
+5140 2273 1
+5140 2369 1
+5140 2440 1
+5140 2592 1
+5140 2620 1
+5140 2689 1
+5140 3106 1
+5140 3291 1
+5140 3634 1
+5140 3691 1
+5140 3910 1
+5140 4037 1
+5140 4448 1
+5140 4482 1
+5140 4547 1
+5140 4574 1
+5140 4604 1
+5140 4689 1
+5140 4712 1
+5140 4717 1
+5140 4748 1
+5140 4824 1
+5140 5144 1
+5140 5188 1
+5140 5239 1
+5140 5245 1
+5140 5273 1
+5140 5295 1
+5140 5457 1
+5140 5584 1
+5140 5827 1
+5140 5844 1
+5140 5886 1
+5140 5963 1
+5140 6505 1
+5140 6528 1
+5140 6552 1
+5140 6554 1
+5140 6566 1
+5140 6570 1
+5140 6576 1
+5140 6589 1
+5140 6594 1
+5140 6599 1
+5140 6600 1
+5140 7378 1
+5140 7587 1
+5140 7810 1
+5141 5144 1
+5142 2592 1
+5142 4448 1
+5142 4653 1
+5142 5144 1
+5150 15 1
+5150 2398 1
+5150 2576 1
+5150 3897 1
+5150 4400 1
+5150 4530 1
+5150 4536 1
+5150 4547 1
+5150 5254 1
+5150 5459 1
+5150 5680 1
+5150 5743 1
+5150 5775 1
+5151 3456 1
+5151 4645 1
+5151 5430 1
+5152 2369 1
+5152 4645 1
+5152 5204 1
+5152 5215 1
+5153 4645 1
+5153 5188 1
+5153 5437 1
+5153 5753 1
+5153 5963 1
+5154 3664 1
+5154 4645 1
+5154 5162 1
+5155 222 1
+5155 1680 1
+5155 2689 1
+5155 2822 1
+5155 2909 1
+5155 3106 1
+5155 3691 1
+5155 4315 1
+5155 4400 1
+5155 4448 1
+5155 4468 1
+5155 4482 1
+5155 4645 1
+5155 4712 1
+5155 5162 1
+5155 5231 1
+5155 5239 1
+5155 5240 1
+5155 5260 1
+5155 5311 1
+5155 5363 1
+5155 5392 1
+5155 5393 1
+5155 5430 1
+5162 1352 1
+5162 4600 1
+5162 4666 1
+5162 7553 1
+5162 7928 1
+5158 5162 1
+5159 5162 1
+5160 2285 1
+5160 2620 1
+5160 3897 1
+5160 4929 1
+5160 5155 1
+5160 5162 1
+5160 5210 1
+5160 5392 1
+5160 5452 1
+5160 5506 1
+5160 5511 1
+5160 5709 1
+5161 5162 1
+5167 5162 1
+5163 5162 1
+5164 5162 1
+5164 5872 1
+5166 15 1
+5166 1352 1
+5166 1549 1
+5166 3084 1
+5166 3238 1
+5166 3456 1
+5166 3643 1
+5166 3873 1
+5166 3962 1
+5166 4037 1
+5166 4071 1
+5166 4310 1
+5166 4361 1
+5166 4600 1
+5166 4604 1
+5166 4709 1
+5166 4781 1
+5166 4981 1
+5166 5079 1
+5166 5096 1
+5166 5148 1
+5166 5162 1
+5166 5254 1
+5166 5524 1
+5166 5563 1
+5166 5697 1
+5166 5714 1
+5166 5806 1
+5166 5814 1
+5166 6123 1
+5166 6330 1
+5166 6496 1
+5166 6555 1
+5166 6606 1
+5166 6613 1
+5166 6832 1
+5166 6897 1
+5166 6930 1
+5166 6979 1
+5166 7021 1
+5166 7063 1
+5166 7092 1
+5166 7119 1
+5166 7131 1
+5166 7620 1
+5166 7908 1
+5166 7961 1
+5166 7965 1
+5171 737 1
+5171 1799 1
+5171 2258 1
+5171 2764 1
+5171 3089 1
+5171 3498 1
+5171 3634 1
+5171 3643 1
+5171 3796 1
+5171 3897 1
+5171 4041 1
+5171 4099 1
+5171 4191 1
+5171 4310 1
+5171 4335 1
+5171 4483 1
+5171 4574 1
+5171 4653 1
+5171 4712 1
+5171 4795 1
+5171 4846 1
+5171 4964 1
+5171 4994 1
+5171 5188 1
+5171 5189 1
+5171 5262 1
+5171 5263 1
+5171 5459 1
+5171 5543 1
+5171 5637 1
+5171 5775 1
+5171 5844 1
+5171 5886 1
+5171 6098 1
+5171 6164 1
+5171 6221 1
+5171 6327 1
+5171 6481 1
+5171 6576 1
+5171 6720 1
+5171 6739 1
+5172 72 1
+5172 3238 1
+5172 3274 1
+5172 3456 1
+5172 3498 1
+5172 3755 1
+5172 3796 1
+5172 4099 1
+5172 4310 1
+5172 4335 1
+5172 4781 1
+5172 5020 1
+5172 5028 1
+5172 5079 1
+5172 5178 1
+5172 5421 1
+5172 5459 1
+5172 5780 1
+5172 5828 1
+5172 5832 1
+5172 5963 1
+5172 5972 1
+5172 6006 1
+5172 6979 1
+5172 7092 1
+5172 7553 1
+5172 7871 1
+5172 8178 1
+5172 8186 1
+5173 155 1
+5173 840 1
+5173 938 1
+5173 1026 1
+5173 1982 1
+5173 2565 1
+5173 2775 1
+5173 3334 1
+5173 3346 1
+5173 3459 1
+5173 3631 1
+5173 3796 1
+5173 3809 1
+5173 3885 1
+5173 3962 1
+5173 3969 1
+5173 4037 1
+5173 4099 1
+5173 4247 1
+5173 4432 1
+5173 4536 1
+5173 4764 1
+5173 4875 1
+5173 4940 1
+5173 5012 1
+5173 5148 1
+5173 5179 1
+5173 5199 1
+5173 5210 1
+5173 5233 1
+5173 5285 1
+5173 5384 1
+5173 5404 1
+5173 5421 1
+5173 5465 1
+5173 5484 1
+5173 5500 1
+5173 5529 1
+5173 5640 1
+5173 5683 1
+5173 5714 1
+5173 5738 1
+5173 5772 1
+5173 5773 1
+5173 5784 1
+5173 5790 1
+5173 5800 1
+5173 5806 1
+5173 5812 1
+5173 5839 1
+5173 5902 1
+5173 5922 1
+5173 5969 1
+5173 5998 1
+5173 6000 1
+5173 6156 1
+5173 6270 1
+5173 6299 1
+5173 6323 1
+5173 6327 1
+5173 6414 1
+5173 6523 1
+5173 6555 1
+5173 6560 1
+5173 6634 1
+5173 6665 1
+5173 6681 1
+5173 6714 1
+5173 6736 1
+5173 6777 1
+5173 6789 1
+5173 6806 1
+5173 6832 1
+5173 6907 1
+5173 6918 1
+5173 6946 1
+5173 6976 1
+5173 6979 1
+5173 7040 1
+5173 7050 1
+5173 7052 1
+5173 7054 1
+5173 7060 1
+5173 7073 1
+5173 7074 1
+5173 7092 1
+5173 7108 1
+5173 7119 1
+5173 7146 1
+5173 7225 1
+5173 7238 1
+5173 7279 1
+5173 7295 1
+5173 7301 1
+5173 7351 1
+5173 7373 1
+5173 7378 1
+5173 7389 1
+5173 7400 1
+5173 7414 1
+5173 7422 1
+5173 7497 1
+5173 7512 1
+5173 7529 1
+5173 7553 1
+5173 7620 1
+5173 7632 1
+5173 7647 1
+5173 7810 1
+5173 7839 1
+5173 7921 1
+5173 7924 1
+5173 7946 1
+5173 8051 1
+5173 8128 1
+5173 8134 1
+5173 8174 1
+5173 8178 1
+5173 8198 1
+5173 8204 1
+5173 8209 1
+5173 8224 1
+5174 2398 1
+5174 3796 1
+5174 4041 1
+5174 4653 1
+5174 4712 1
+5174 5200 1
+5175 72 1
+5175 737 1
+5175 2398 1
+5175 2516 1
+5175 2576 1
+5175 2764 1
+5175 2831 1
+5175 3393 1
+5175 3796 1
+5175 4098 1
+5175 4099 1
+5175 4191 1
+5175 4247 1
+5175 4335 1
+5175 4530 1
+5175 4534 1
+5175 4536 1
+5175 4653 1
+5175 4666 1
+5175 4797 1
+5175 4846 1
+5175 4899 1
+5175 4964 1
+5175 5189 1
+5175 5452 1
+5175 5454 1
+5175 5459 1
+5175 5484 1
+5175 5568 1
+5175 5650 1
+5175 5651 1
+5175 5721 1
+5175 5743 1
+5175 5775 1
+5175 5790 1
+4795 737 1
+4795 1403 1
+4795 1498 1
+4795 1982 1
+4795 2276 1
+4795 2511 1
+4795 2658 1
+4795 3634 1
+4795 3752 1
+4795 3796 1
+4795 3842 1
+4795 3897 1
+4795 3922 1
+4795 4037 1
+4795 4401 1
+4795 4432 1
+4795 4500 1
+4795 4536 1
+4795 4653 1
+4795 4666 1
+4795 4929 1
+4795 5012 1
+4795 5079 1
+4795 5096 1
+4795 5123 1
+4795 5200 1
+4795 5210 1
+4795 5254 1
+4795 5288 1
+4795 5392 1
+4795 5406 1
+4795 5439 1
+4795 5459 1
+4795 5545 1
+4795 5773 1
+4795 5814 1
+4795 5839 1
+4795 5872 1
+4795 5891 1
+4795 5933 1
+4795 5950 1
+4795 6032 1
+4795 6151 1
+4795 6218 1
+4795 6270 1
+4795 6302 1
+4795 6328 1
+4795 6337 1
+4795 6407 1
+4795 6432 1
+4795 6474 1
+4795 6628 1
+4795 6634 1
+4795 6736 1
+4795 6913 1
+4795 6914 1
+4795 6979 1
+4795 6980 1
+4795 7012 1
+4795 7023 1
+4795 7074 1
+4795 7101 1
+4795 7108 1
+4795 7257 1
+4795 7351 1
+4795 7391 1
+4795 7699 1
+4795 7809 1
+4795 7839 1
+4795 7860 1
+4795 7992 1
+4795 8224 1
+4795 8295 1
+5176 72 1
+5176 95 1
+5176 525 1
+5176 608 1
+5176 737 1
+5176 896 1
+5176 1159 1
+5176 1247 1
+5176 1473 1
+5176 1548 1
+5176 1733 1
+5176 1799 1
+5176 2001 1
+5176 2258 1
+5176 2276 1
+5176 2398 1
+5176 2507 1
+5176 2516 1
+5176 2552 1
+5176 2576 1
+5176 2605 1
+5176 2764 1
+5176 2765 1
+5176 2822 1
+5176 2831 1
+5176 3027 1
+5176 3089 1
+5176 3103 1
+5176 3191 1
+5176 3274 1
+5176 3393 1
+5176 3456 1
+5176 3459 1
+5176 3460 1
+5176 3586 1
+5176 3643 1
+5176 3755 1
+5176 3796 1
+5176 3897 1
+5176 3958 1
+5176 4041 1
+5176 4098 1
+5176 4099 1
+5176 4127 1
+5176 4191 1
+5176 4247 1
+5176 4276 1
+5176 4310 1
+5176 4335 1
+5176 4338 1
+5176 4400 1
+5176 4527 1
+5176 4530 1
+5176 4534 1
+5176 4536 1
+5176 4587 1
+5176 4600 1
+5176 4631 1
+5176 4653 1
+5176 4666 1
+5176 4712 1
+5176 4777 1
+5176 4797 1
+5176 4846 1
+5176 4899 1
+5176 4929 1
+5176 4964 1
+5176 4977 1
+5176 4986 1
+5176 5020 1
+5176 5072 1
+5176 5103 1
+5176 5123 1
+5176 5155 1
+5176 5182 1
+5176 5189 1
+5176 5226 1
+5176 5263 1
+5176 5285 1
+5176 5296 1
+5176 5301 1
+5176 5308 1
+5176 5321 1
+5176 5326 1
+5176 5392 1
+5176 5412 1
+5176 5423 1
+5176 5426 1
+5176 5430 1
+5176 5449 1
+5176 5452 1
+5176 5454 1
+5176 5459 1
+5176 5463 1
+5176 5482 1
+5176 5484 1
+5176 5506 1
+5176 5509 1
+5176 5511 1
+5176 5513 1
+5176 5524 1
+5176 5539 1
+5176 5543 1
+5176 5545 1
+5176 5559 1
+5176 5563 1
+5176 5568 1
+5176 5592 1
+5176 5637 1
+5176 5639 1
+5176 5640 1
+5176 5650 1
+5176 5651 1
+5176 5683 1
+5176 5693 1
+5176 5705 1
+5176 5721 1
+5176 5732 1
+5176 5737 1
+5176 5743 1
+5176 5756 1
+5176 5757 1
+5176 5760 1
+5176 5775 1
+5176 5780 1
+5176 5872 1
+5176 5886 1
+5176 5891 1
+5176 5925 1
+5176 5928 1
+5176 5936 1
+5176 5947 1
+5176 5963 1
+5176 5973 1
+5176 5994 1
+5176 6029 1
+5176 6078 1
+5176 8295 1
+5176 8296 1
+5177 15 1
+5177 1026 1
+5177 1648 1
+5177 1972 1
+5177 1982 1
+5177 2620 1
+5177 2925 1
+5177 3084 1
+5177 3089 1
+5177 3191 1
+5177 3459 1
+5177 3586 1
+5177 3614 1
+5177 3634 1
+5177 3796 1
+5177 3897 1
+5177 3919 1
+5177 3976 1
+5177 4310 1
+5177 4483 1
+5177 4536 1
+5177 4709 1
+5177 4712 1
+5177 4715 1
+5177 4717 1
+5177 4781 1
+5177 4791 1
+5177 4795 1
+5177 4798 1
+5177 4828 1
+5177 4981 1
+5177 4994 1
+5177 5002 1
+5177 5079 1
+5177 5123 1
+5177 5140 1
+5177 5178 1
+5177 5179 1
+5177 5188 1
+5177 5246 1
+5177 5254 1
+5177 5262 1
+5177 5423 1
+5177 5437 1
+5177 5439 1
+5177 5457 1
+5177 5524 1
+5177 5527 1
+5177 5545 1
+5177 5630 1
+5177 5697 1
+5177 5709 1
+5177 5714 1
+5177 5798 1
+5177 5800 1
+5177 5804 1
+5177 5809 1
+5177 5827 1
+5177 5839 1
+5177 5871 1
+5177 5947 1
+5177 5950 1
+5177 5963 1
+5177 5969 1
+5177 5994 1
+5177 6006 1
+5177 6023 1
+5177 6059 1
+5177 6094 1
+5177 6105 1
+5177 6124 1
+5177 6148 1
+5177 6164 1
+5177 6166 1
+5177 6221 1
+5177 6229 1
+5177 6251 1
+5177 6262 1
+5177 6296 1
+5177 6306 1
+5177 6437 1
+5177 6441 1
+5177 6481 1
+5177 6505 1
+5177 6523 1
+5177 6528 1
+5177 6560 1
+5177 6576 1
+5177 6613 1
+5177 6621 1
+5177 6665 1
+5177 6707 1
+5177 6774 1
+5177 6934 1
+5177 6979 1
+5177 7414 1
+5177 7620 1
+5177 7632 1
+5177 7910 1
+5177 8295 1
+5177 8297 1
+5178 2925 1
+5178 3796 1
+5178 3919 1
+5178 4310 1
+5178 4828 1
+5178 4986 1
+5178 5096 1
+5178 5543 1
+5178 5753 1
+5178 5811 1
+5178 6098 1
+5178 6124 1
+5178 6156 1
+5178 6170 1
+5178 6496 1
+5178 6665 1
+5178 6686 1
+5178 6715 1
+5178 7910 1
+4310 15 1
+4310 72 1
+4310 737 1
+4310 938 1
+4310 1159 1
+4310 1191 1
+4310 1352 1
+4310 1403 1
+4310 1473 1
+4310 1799 1
+4310 1865 1
+4310 2001 1
+4310 2160 1
+4310 2258 1
+4310 2276 1
+4310 2285 1
+4310 2354 1
+4310 2398 1
+4310 2440 1
+4310 2490 1
+4310 2507 1
+4310 2516 1
+4310 2576 1
+4310 2605 1
+4310 2620 1
+4310 2774 1
+4310 2775 1
+4310 2822 1
+4310 2831 1
+4310 2851 1
+4310 2909 1
+4310 2925 1
+4310 3000 1
+4310 3027 1
+4310 3084 1
+4310 3089 1
+4310 3238 1
+4310 3274 1
+4310 3291 1
+4310 3417 1
+4310 3456 1
+4310 3459 1
+4310 3586 1
+4310 3614 1
+4310 3634 1
+4310 3643 1
+4310 3691 1
+4310 3752 1
+4310 3755 1
+4310 3796 1
+4310 3830 1
+4310 3897 1
+4310 3919 1
+4310 3976 1
+4310 4037 1
+4310 4041 1
+4310 4071 1
+4310 4098 1
+4310 4099 1
+4310 4127 1
+4310 4175 1
+4310 4191 1
+4310 4247 1
+4310 4315 1
+4310 4338 1
+4310 4341 1
+4310 4400 1
+4310 4448 1
+4310 4483 1
+4310 4527 1
+4310 4530 1
+4310 4534 1
+4310 4536 1
+4310 4574 1
+4310 4587 1
+4310 4600 1
+4310 4632 1
+4310 4653 1
+4310 4666 1
+4310 4687 1
+4310 4709 1
+4310 4712 1
+4310 4715 1
+4310 4717 1
+4310 4748 1
+4310 4777 1
+4310 4781 1
+4310 4791 1
+4310 4795 1
+4310 4824 1
+4310 4828 1
+4310 4846 1
+4310 4875 1
+4310 4899 1
+4310 4929 1
+4310 4980 1
+4310 4981 1
+4310 4983 1
+4310 4986 1
+4310 5002 1
+4310 5020 1
+4310 5028 1
+4310 5061 1
+4310 5072 1
+4310 5096 1
+4310 5123 1
+4310 5155 1
+4310 5176 1
+4310 5178 1
+4310 5179 1
+4310 5182 1
+4310 5188 1
+4310 5189 1
+4310 5199 1
+4310 5200 1
+4310 5226 1
+4310 5233 1
+4310 5254 1
+4310 5262 1
+4310 5273 1
+4310 5285 1
+4310 5288 1
+4310 5301 1
+4310 5308 1
+4310 5311 1
+4310 5321 1
+4310 5323 1
+4310 5327 1
+4310 5335 1
+4310 5341 1
+4310 5404 1
+4310 5412 1
+4310 5417 1
+4310 5423 1
+4310 5439 1
+4310 5445 1
+4310 5449 1
+4310 5452 1
+4310 5459 1
+4310 5463 1
+4310 5482 1
+4310 5484 1
+4310 5499 1
+4310 5506 1
+4310 5509 1
+4310 5514 1
+4310 5524 1
+4310 5527 1
+4310 5539 1
+4310 5543 1
+4310 5563 1
+4310 5584 1
+4310 5592 1
+4310 5620 1
+4310 5624 1
+4310 5637 1
+4310 5651 1
+4310 5673 1
+4310 5680 1
+4310 5683 1
+4310 5684 1
+4310 5697 1
+4310 5721 1
+4310 5732 1
+4310 5739 1
+4310 5743 1
+4310 5760 1
+4310 5775 1
+4310 5798 1
+4310 5800 1
+4310 5804 1
+4310 5806 1
+4310 5807 1
+4310 5811 1
+4310 5814 1
+4310 5818 1
+4310 5822 1
+4310 5824 1
+4310 5839 1
+4310 5844 1
+4310 5848 1
+4310 5871 1
+4310 5872 1
+4310 5886 1
+4310 5902 1
+4310 5928 1
+4310 5932 1
+4310 5936 1
+4310 5947 1
+4310 5973 1
+4310 5994 1
+4310 5998 1
+4310 6000 1
+4310 6001 1
+4310 6006 1
+4310 6027 1
+4310 6032 1
+4310 6043 1
+4310 6044 1
+4310 6097 1
+4310 6098 1
+4310 6105 1
+4310 6123 1
+4310 6124 1
+4310 6151 1
+4310 6156 1
+4310 6243 1
+4310 6296 1
+4310 6299 1
+4310 6327 1
+4310 6328 1
+4310 6337 1
+4310 6400 1
+4310 6414 1
+4310 6432 1
+4310 6437 1
+4310 6481 1
+4310 6505 1
+4310 6523 1
+4310 6555 1
+4310 6566 1
+4310 6567 1
+4310 6570 1
+4310 6576 1
+4310 6613 1
+4310 6665 1
+4310 6715 1
+4310 6720 1
+4310 6774 1
+4310 6784 1
+4310 6832 1
+4310 6833 1
+4310 6860 1
+4310 6869 1
+4310 6907 1
+4310 6913 1
+4310 6945 1
+4310 6946 1
+4310 6979 1
+4310 6980 1
+4310 7012 1
+4310 7021 1
+4310 7052 1
+4310 7054 1
+4310 7063 1
+4310 7073 1
+4310 7094 1
+4310 7101 1
+4310 7115 1
+4310 7116 1
+4310 7119 1
+4310 7143 1
+4310 7144 1
+4310 7168 1
+4310 7214 1
+4310 7237 1
+4310 7238 1
+4310 7277 1
+4310 7351 1
+4310 7378 1
+4310 7381 1
+4310 7386 1
+4310 7400 1
+4310 7450 1
+4310 7497 1
+4310 7587 1
+4310 7618 1
+4310 7620 1
+4310 7651 1
+4310 7653 1
+4310 7699 1
+4310 7707 1
+4310 7778 1
+4310 7795 1
+4310 7813 1
+4310 7927 1
+4310 7961 1
+4310 8297 1
+5179 15 1
+5179 155 1
+5179 737 1
+5179 1473 1
+5179 1549 1
+5179 1733 1
+5179 1982 1
+5179 2001 1
+5179 2160 1
+5179 2258 1
+5179 2276 1
+5179 2376 1
+5179 2398 1
+5179 2535 1
+5179 2565 1
+5179 2576 1
+5179 2605 1
+5179 2620 1
+5179 2764 1
+5179 2765 1
+5179 2774 1
+5179 2851 1
+5179 2925 1
+5179 3000 1
+5179 3084 1
+5179 3238 1
+5179 3274 1
+5179 3459 1
+5179 3479 1
+5179 3614 1
+5179 3631 1
+5179 3643 1
+5179 3792 1
+5179 3796 1
+5179 3803 1
+5179 3873 1
+5179 3897 1
+5179 3919 1
+5179 3958 1
+5179 3969 1
+5179 4037 1
+5179 4041 1
+5179 4071 1
+5179 4247 1
+5179 4276 1
+5179 4310 1
+5179 4335 1
+5179 4338 1
+5179 4361 1
+5179 4483 1
+5179 4530 1
+5179 4534 1
+5179 4536 1
+5179 4600 1
+5179 4653 1
+5179 4666 1
+5179 4687 1
+5179 4712 1
+5179 4715 1
+5179 4781 1
+5179 4795 1
+5179 4797 1
+5179 4798 1
+5179 4828 1
+5179 4846 1
+5179 4875 1
+5179 4899 1
+5179 4964 1
+5179 4980 1
+5179 5002 1
+5179 5012 1
+5179 5020 1
+5179 5022 1
+5179 5072 1
+5179 5079 1
+5179 5103 1
+5179 5121 1
+5179 5178 1
+5179 5188 1
+5179 5200 1
+5179 5210 1
+5179 5226 1
+5179 5233 1
+5179 5254 1
+5179 5263 1
+5179 5285 1
+5179 5288 1
+5179 5335 1
+5179 5404 1
+5179 5423 1
+5179 5437 1
+5179 5439 1
+5179 5445 1
+5179 5454 1
+5179 5459 1
+5179 5487 1
+5179 5509 1
+5179 5524 1
+5179 5527 1
+5179 5529 1
+5179 5543 1
+5179 5563 1
+5179 5568 1
+5179 5592 1
+5179 5620 1
+5179 5637 1
+5179 5640 1
+5179 5683 1
+5179 5684 1
+5179 5693 1
+5179 5697 1
+5179 5721 1
+5179 5732 1
+5179 5737 1
+5179 5738 1
+5179 5739 1
+5179 5743 1
+5179 5753 1
+5179 5756 1
+5179 5760 1
+5179 5775 1
+5179 5776 1
+5179 5778 1
+5179 5798 1
+5179 5800 1
+5179 5802 1
+5179 5804 1
+5179 5807 1
+5179 5814 1
+5179 5871 1
+5179 5902 1
+5179 5969 1
+5179 5994 1
+5179 5998 1
+5179 6001 1
+5179 6023 1
+5179 6029 1
+5179 6078 1
+5179 6098 1
+5179 6111 1
+5179 6123 1
+5179 6124 1
+5179 6148 1
+5179 6151 1
+5179 6156 1
+5179 6170 1
+5179 6221 1
+5179 6229 1
+5179 6246 1
+5179 6251 1
+5179 6255 1
+5179 6262 1
+5179 6270 1
+5179 6272 1
+5179 6296 1
+5179 6299 1
+5179 6305 1
+5179 6306 1
+5179 6327 1
+5179 6328 1
+5179 6330 1
+5179 6334 1
+5179 6337 1
+5179 6388 1
+5179 6400 1
+5179 6407 1
+5179 6414 1
+5179 6432 1
+5179 6523 1
+5179 6560 1
+5179 6599 1
+5179 6600 1
+5179 6618 1
+5179 6634 1
+5179 6665 1
+5179 6714 1
+5179 6715 1
+5179 6765 1
+5179 6784 1
+5179 6832 1
+5179 6855 1
+5179 6860 1
+5179 6907 1
+5179 6913 1
+5179 6918 1
+5179 6945 1
+5179 6946 1
+5179 6948 1
+5179 6979 1
+5179 6982 1
+5179 7047 1
+5179 7054 1
+5179 7088 1
+5179 7092 1
+5179 7144 1
+5179 7233 1
+5179 7237 1
+5179 7250 1
+5179 7373 1
+5179 7517 1
+5179 7544 1
+5179 7553 1
+5179 7587 1
+5179 7620 1
+5179 7632 1
+5179 7642 1
+5179 7646 1
+5179 7662 1
+5179 7683 1
+5179 7699 1
+5179 7839 1
+5179 8044 1
+5179 8083 1
+5179 8124 1
+5179 8134 1
+5179 8141 1
+5179 8295 1
+5180 896 1
+5180 1473 1
+5180 1648 1
+5180 1733 1
+5180 2001 1
+5180 2258 1
+5180 2354 1
+5180 2507 1
+5180 2576 1
+5180 2605 1
+5180 2765 1
+5180 2775 1
+5180 3089 1
+5180 3274 1
+5180 3586 1
+5180 3643 1
+5180 3796 1
+5180 4041 1
+5180 4527 1
+5180 4534 1
+5180 4536 1
+5180 4574 1
+5180 4795 1
+5180 5061 1
+5180 5123 1
+5180 5176 1
+5180 5182 1
+5180 5226 1
+5180 5445 1
+5180 5454 1
+5180 5459 1
+5180 5482 1
+5180 5680 1
+5180 5693 1
+5180 5743 1
+5180 5775 1
+5180 5780 1
+5180 5790 1
+5180 5837 1
+5180 5844 1
+5180 5848 1
+5180 5863 1
+5180 5886 1
+5180 5891 1
+5180 5925 1
+5180 5928 1
+5180 5947 1
+5180 5963 1
+5180 5994 1
+5181 1352 1
+5181 2398 1
+5181 2516 1
+5181 2552 1
+5181 2605 1
+5181 2764 1
+5181 2831 1
+5181 3456 1
+5181 3796 1
+5181 3897 1
+5181 3919 1
+5181 4098 1
+5181 4247 1
+5181 4335 1
+5181 4574 1
+5181 4600 1
+5181 4631 1
+5181 4653 1
+5181 4797 1
+5181 5188 1
+5181 5210 1
+5181 5254 1
+5181 5296 1
+5181 5321 1
+5181 5459 1
+5181 5482 1
+5181 5484 1
+5181 5568 1
+5181 5588 1
+5181 5651 1
+5181 5680 1
+5181 5693 1
+5181 5784 1
+5181 5827 1
+5181 5837 1
+5181 5844 1
+5181 5848 1
+5181 5863 1
+5181 6437 1
+5181 6566 1
+5181 8295 1
+5182 896 1
+5182 3498 1
+5182 3796 1
+5182 4099 1
+5182 4534 1
+5182 4846 1
+5182 5123 1
+5182 5262 1
+5182 5263 1
+5182 5568 1
+5182 5743 1
+5182 5828 1
+5182 5848 1
+5182 5863 1
+5183 3796 1
+5184 608 1
+5184 737 1
+5184 1247 1
+5184 1733 1
+5184 1799 1
+5184 2258 1
+5184 2276 1
+5184 2398 1
+5184 2516 1
+5184 2576 1
+5184 2605 1
+5184 2764 1
+5184 2822 1
+5184 2831 1
+5184 3027 1
+5184 3089 1
+5184 3103 1
+5184 3393 1
+5184 3417 1
+5184 3456 1
+5184 3460 1
+5184 3643 1
+5184 3796 1
+5184 3897 1
+5184 3910 1
+5184 4041 1
+5184 4098 1
+5184 4191 1
+5184 4247 1
+5184 4315 1
+5184 4400 1
+5184 4448 1
+5184 4482 1
+5184 4587 1
+5184 4600 1
+5184 4653 1
+5184 4777 1
+5184 4824 1
+5184 4846 1
+5184 4899 1
+5184 4929 1
+5184 4964 1
+5184 4986 1
+5184 5020 1
+5184 5155 1
+5184 5189 1
+5184 5335 1
+5184 5392 1
+5184 5412 1
+5184 5430 1
+5184 5449 1
+5184 5459 1
+5184 5463 1
+5184 5506 1
+5184 5509 1
+5184 5559 1
+5184 5564 1
+5184 5568 1
+5184 5623 1
+5184 5637 1
+5184 5650 1
+5184 5651 1
+5184 5693 1
+5184 5743 1
+5184 5775 1
+5184 5891 1
+5184 5925 1
+5184 5947 1
+5185 967 1
+5185 1352 1
+5185 1972 1
+5185 2160 1
+5185 2273 1
+5185 2277 1
+5185 2433 1
+5185 2535 1
+5185 2605 1
+5185 2774 1
+5185 3015 1
+5185 3238 1
+5185 3291 1
+5185 3334 1
+5185 3614 1
+5185 3634 1
+5185 3792 1
+5185 3796 1
+5185 3830 1
+5185 3873 1
+5185 3897 1
+5185 3919 1
+5185 4065 1
+5185 4099 1
+5185 4134 1
+5185 4335 1
+5185 4483 1
+5185 4488 1
+5185 4709 1
+5185 4712 1
+5185 4713 1
+5185 4715 1
+5185 4748 1
+5185 4764 1
+5185 4795 1
+5185 4798 1
+5185 4828 1
+5185 4875 1
+5185 4980 1
+5185 4986 1
+5185 5002 1
+5185 5020 1
+5185 5022 1
+5185 5037 1
+5185 5123 1
+5185 5178 1
+5185 5188 1
+5185 5200 1
+5185 5254 1
+5185 5295 1
+5185 5321 1
+5185 5378 1
+5185 5439 1
+5185 5459 1
+5185 5479 1
+5185 5524 1
+5185 5527 1
+5185 5543 1
+5185 5563 1
+5185 5596 1
+5185 5605 1
+5185 5614 1
+5185 5683 1
+5185 5684 1
+5185 5697 1
+5185 5714 1
+5185 5753 1
+5185 5760 1
+5185 5798 1
+5185 5799 1
+5185 5800 1
+5185 5802 1
+5185 5804 1
+5185 5818 1
+5185 5827 1
+5185 5829 1
+5185 5871 1
+5185 5897 1
+5185 5925 1
+5185 5947 1
+5185 6001 1
+5185 6004 1
+5185 6006 1
+5185 6124 1
+5185 6156 1
+5185 6170 1
+5185 6218 1
+5185 6221 1
+5185 6227 1
+5185 6229 1
+5185 6251 1
+5185 6272 1
+5185 6299 1
+5185 6305 1
+5185 6306 1
+5185 6323 1
+5185 6327 1
+5185 6328 1
+5185 6347 1
+5185 6388 1
+5185 6432 1
+5185 6447 1
+5185 6458 1
+5185 6481 1
+5185 6491 1
+5185 6496 1
+5185 6501 1
+5185 6505 1
+5185 6560 1
+5185 6595 1
+5185 6600 1
+5185 6613 1
+5185 6632 1
+5185 6665 1
+5185 6699 1
+5185 6720 1
+5185 6739 1
+5185 6755 1
+5185 6765 1
+5185 6770 1
+5185 6777 1
+5185 6783 1
+5185 6784 1
+5185 6788 1
+5185 6789 1
+5185 6803 1
+5185 6806 1
+5185 6832 1
+5185 6833 1
+5185 6850 1
+5185 6855 1
+5185 6860 1
+5185 6869 1
+5185 6873 1
+5185 6897 1
+5185 6930 1
+5185 6933 1
+5185 6934 1
+5185 6938 1
+5185 6945 1
+5185 6946 1
+5185 6948 1
+5185 6953 1
+5185 6955 1
+5185 6967 1
+5185 7301 1
+5185 7351 1
+5185 7414 1
+5185 8128 1
+5185 8219 1
+5185 8237 1
+5185 8297 1
+5186 3796 1
+5186 4944 1
+5187 1473 1
+5187 1648 1
+5187 2398 1
+5187 2490 1
+5187 3796 1
+5187 4530 1
+5187 4536 1
+5187 4574 1
+5187 5061 1
+5187 5123 1
+5187 5301 1
+5187 5321 1
+5187 5457 1
+5187 5459 1
+5187 5482 1
+5187 5637 1
+5187 5640 1
+5187 5651 1
+5187 5680 1
+5187 5721 1
+5187 5775 1
+5187 5784 1
+5187 5828 1
+5187 5844 1
+5187 5848 1
+5187 5860 1
+5187 5863 1
+5187 5886 1
+5187 5891 1
+5187 5925 1
+5187 5928 1
+5188 737 1
+5188 1352 1
+5188 1473 1
+5188 1549 1
+5188 1648 1
+5188 1733 1
+5188 1823 1
+5188 1972 1
+5188 2160 1
+5188 2258 1
+5188 2398 1
+5188 2433 1
+5188 2440 1
+5188 2511 1
+5188 2516 1
+5188 2535 1
+5188 2605 1
+5188 2764 1
+5188 2775 1
+5188 2785 1
+5188 2831 1
+5188 3238 1
+5188 3274 1
+5188 3291 1
+5188 3393 1
+5188 3456 1
+5188 3459 1
+5188 3631 1
+5188 3634 1
+5188 3792 1
+5188 3796 1
+5188 3803 1
+5188 3830 1
+5188 3842 1
+5188 4037 1
+5188 4065 1
+5188 4099 1
+5188 4247 1
+5188 4338 1
+5188 4483 1
+5188 4488 1
+5188 4530 1
+5188 4534 1
+5188 4536 1
+5188 4574 1
+5188 4600 1
+5188 4604 1
+5188 4653 1
+5188 4666 1
+5188 4689 1
+5188 4709 1
+5188 4712 1
+5188 4713 1
+5188 4717 1
+5188 4748 1
+5188 4764 1
+5188 4777 1
+5188 4795 1
+5188 4797 1
+5188 4846 1
+5188 4899 1
+5188 4929 1
+5188 4944 1
+5188 4964 1
+5188 4981 1
+5188 4986 1
+5188 4994 1
+5188 5002 1
+5188 5037 1
+5188 5061 1
+5188 5072 1
+5188 5140 1
+5188 5179 1
+5188 5189 1
+5188 5199 1
+5188 5200 1
+5188 5226 1
+5188 5254 1
+5188 5263 1
+5188 5273 1
+5188 5288 1
+5188 5321 1
+5188 5445 1
+5188 5454 1
+5188 5459 1
+5188 5479 1
+5188 5506 1
+5188 5509 1
+5188 5524 1
+5188 5543 1
+5188 5563 1
+5188 5568 1
+5188 5584 1
+5188 5592 1
+5188 5596 1
+5188 5626 1
+5188 5637 1
+5188 5640 1
+5188 5650 1
+5188 5651 1
+5188 5680 1
+5188 5684 1
+5188 5693 1
+5188 5697 1
+5188 5714 1
+5188 5732 1
+5188 5737 1
+5188 5739 1
+5188 5743 1
+5188 5775 1
+5188 5776 1
+5188 5780 1
+5188 5790 1
+5188 5798 1
+5188 5799 1
+5188 5802 1
+5188 5804 1
+5188 5814 1
+5188 5818 1
+5188 5822 1
+5188 5827 1
+5188 5828 1
+5188 5829 1
+5188 5837 1
+5188 5844 1
+5188 5848 1
+5188 5863 1
+5188 5871 1
+5188 5886 1
+5188 5891 1
+5188 5897 1
+5188 5922 1
+5188 5925 1
+5188 5932 1
+5188 5998 1
+5188 6001 1
+5188 6004 1
+5188 6097 1
+5188 6156 1
+5188 6170 1
+5188 6221 1
+5188 6227 1
+5188 6262 1
+5188 6272 1
+5188 6299 1
+5188 6305 1
+5188 6306 1
+5188 6327 1
+5188 6328 1
+5188 6330 1
+5188 6458 1
+5188 6496 1
+5188 6501 1
+5188 6503 1
+5188 6528 1
+5188 6552 1
+5188 6554 1
+5188 6555 1
+5188 6560 1
+5188 6566 1
+5188 6570 1
+5188 6576 1
+5188 6589 1
+5188 6594 1
+5188 6600 1
+5188 6613 1
+5188 6624 1
+5188 6632 1
+5188 6665 1
+5188 6699 1
+5188 6715 1
+5188 6770 1
+5188 6774 1
+5188 6783 1
+5188 6784 1
+5188 6790 1
+5188 6803 1
+5188 6832 1
+5188 6833 1
+5188 6855 1
+5188 6860 1
+5188 6869 1
+5188 6873 1
+5188 6897 1
+5188 6901 1
+5188 6913 1
+5188 6918 1
+5188 6930 1
+5188 6945 1
+5188 6955 1
+5188 6976 1
+5188 7063 1
+5188 7073 1
+5188 7092 1
+5188 7101 1
+5188 7115 1
+5188 7119 1
+5188 7143 1
+5188 7144 1
+5188 7168 1
+5188 7233 1
+5188 7301 1
+5188 7553 1
+5188 7695 1
+5188 7788 1
+5188 7795 1
+5188 7835 1
+5188 7961 1
+5188 7979 1
+5188 8192 1
+5188 8295 1
+5189 15 1
+5189 72 1
+5189 95 1
+5189 608 1
+5189 737 1
+5189 896 1
+5189 1247 1
+5189 1498 1
+5189 1548 1
+5189 1549 1
+5189 1799 1
+5189 1823 1
+5189 1972 1
+5189 2001 1
+5189 2160 1
+5189 2258 1
+5189 2276 1
+5189 2277 1
+5189 2354 1
+5189 2398 1
+5189 2516 1
+5189 2535 1
+5189 2552 1
+5189 2576 1
+5189 2605 1
+5189 2620 1
+5189 2764 1
+5189 2774 1
+5189 2822 1
+5189 2831 1
+5189 2909 1
+5189 2914 1
+5189 2925 1
+5189 3015 1
+5189 3027 1
+5189 3084 1
+5189 3089 1
+5189 3103 1
+5189 3191 1
+5189 3238 1
+5189 3274 1
+5189 3334 1
+5189 3417 1
+5189 3456 1
+5189 3459 1
+5189 3460 1
+5189 3498 1
+5189 3586 1
+5189 3634 1
+5189 3755 1
+5189 3796 1
+5189 3803 1
+5189 3842 1
+5189 3873 1
+5189 3885 1
+5189 3897 1
+5189 3910 1
+5189 3958 1
+5189 3962 1
+5189 3976 1
+5189 4037 1
+5189 4098 1
+5189 4099 1
+5189 4175 1
+5189 4191 1
+5189 4247 1
+5189 4310 1
+5189 4335 1
+5189 4338 1
+5189 4341 1
+5189 4361 1
+5189 4400 1
+5189 4441 1
+5189 4448 1
+5189 4483 1
+5189 4500 1
+5189 4534 1
+5189 4574 1
+5189 4587 1
+5189 4600 1
+5189 4631 1
+5189 4653 1
+5189 4687 1
+5189 4712 1
+5189 4717 1
+5189 4777 1
+5189 4781 1
+5189 4795 1
+5189 4797 1
+5189 4798 1
+5189 4824 1
+5189 4828 1
+5189 4875 1
+5189 4929 1
+5189 4940 1
+5189 4964 1
+5189 4986 1
+5189 5022 1
+5189 5079 1
+5189 5096 1
+5189 5103 1
+5189 5121 1
+5189 5123 1
+5189 5140 1
+5189 5155 1
+5189 5176 1
+5189 5178 1
+5189 5182 1
+5189 5200 1
+5189 5226 1
+5189 5233 1
+5189 5262 1
+5189 5285 1
+5189 5288 1
+5189 5289 1
+5189 5296 1
+5189 5301 1
+5189 5305 1
+5189 5321 1
+5189 5326 1
+5189 5327 1
+5189 5335 1
+5189 5341 1
+5189 5351 1
+5189 5387 1
+5189 5392 1
+5189 5404 1
+5189 5412 1
+5189 5417 1
+5189 5423 1
+5189 5426 1
+5189 5430 1
+5189 5437 1
+5189 5445 1
+5189 5449 1
+5189 5454 1
+5189 5457 1
+5189 5459 1
+5189 5463 1
+5189 5465 1
+5189 5466 1
+5189 5467 1
+5189 5471 1
+5189 5481 1
+5189 5487 1
+5189 5506 1
+5189 5509 1
+5189 5513 1
+5189 5514 1
+5189 5524 1
+5189 5529 1
+5189 5543 1
+5189 5545 1
+5189 5559 1
+5189 5563 1
+5189 5564 1
+5189 5568 1
+5189 5588 1
+5189 5592 1
+5189 5596 1
+5189 5620 1
+5189 5624 1
+5189 5626 1
+5189 5630 1
+5189 5637 1
+5189 5638 1
+5189 5639 1
+5189 5640 1
+5189 5651 1
+5189 5680 1
+5189 5683 1
+5189 5684 1
+5189 5693 1
+5189 5697 1
+5189 5705 1
+5189 5737 1
+5189 5738 1
+5189 5743 1
+5189 5745 1
+5189 5753 1
+5189 5754 1
+5189 5756 1
+5189 5760 1
+5189 5775 1
+5189 5798 1
+5189 5799 1
+5189 5800 1
+5189 5804 1
+5189 5806 1
+5189 5809 1
+5189 5812 1
+5189 5817 1
+5189 5819 1
+5189 5824 1
+5189 5829 1
+5189 5830 1
+5189 5837 1
+5189 5839 1
+5189 5844 1
+5189 5863 1
+5189 5872 1
+5189 5886 1
+5189 5891 1
+5189 5925 1
+5189 5928 1
+5189 5936 1
+5189 5947 1
+5189 5969 1
+5189 5972 1
+5189 5973 1
+5189 5977 1
+5189 5980 1
+5189 5991 1
+5189 5994 1
+5189 6004 1
+5189 6006 1
+5189 6023 1
+5189 6044 1
+5189 6059 1
+5189 6078 1
+5189 6094 1
+5189 6098 1
+5189 6105 1
+5189 6111 1
+5189 6123 1
+5189 6124 1
+5189 6148 1
+5189 6166 1
+5189 6218 1
+5189 6226 1
+5189 6229 1
+5189 6246 1
+5189 6251 1
+5189 6261 1
+5189 6262 1
+5189 6269 1
+5189 6278 1
+5189 6296 1
+5189 6302 1
+5189 6305 1
+5189 6306 1
+5189 6327 1
+5189 6330 1
+5189 6334 1
+5189 6337 1
+5189 6360 1
+5189 6417 1
+5189 6437 1
+5189 6441 1
+5189 6458 1
+5189 6474 1
+5189 6481 1
+5189 6523 1
+5189 6553 1
+5189 6555 1
+5189 6560 1
+5189 6566 1
+5189 6594 1
+5189 6606 1
+5189 6613 1
+5189 6618 1
+5189 6634 1
+5189 6665 1
+5189 6715 1
+5189 6774 1
+5189 6784 1
+5189 6832 1
+5189 6855 1
+5189 6897 1
+5189 6913 1
+5189 6918 1
+5189 6946 1
+5189 6979 1
+5189 6994 1
+5189 7021 1
+5189 7050 1
+5189 7052 1
+5189 7059 1
+5189 7092 1
+5189 7094 1
+5189 7101 1
+5189 7115 1
+5189 7120 1
+5189 7131 1
+5189 7214 1
+5189 7289 1
+5189 7323 1
+5189 7373 1
+5189 7378 1
+5189 7414 1
+5189 7478 1
+5189 7498 1
+5189 7510 1
+5189 7553 1
+5189 7618 1
+5189 7620 1
+5189 7624 1
+5189 7632 1
+5189 7662 1
+5189 7683 1
+5189 7695 1
+5189 7699 1
+5189 7701 1
+5189 7809 1
+5189 7813 1
+5189 7913 1
+5189 8132 1
+5189 8209 1
+5189 8224 1
+5189 8249 1
+5189 8295 1
+5189 8296 1
+5190 95 1
+5190 608 1
+5190 737 1
+5190 1648 1
+5190 1799 1
+5190 2001 1
+5190 2258 1
+5190 2398 1
+5190 2516 1
+5190 2576 1
+5190 2605 1
+5190 2764 1
+5190 2831 1
+5190 2909 1
+5190 3027 1
+5190 3103 1
+5190 3274 1
+5190 3417 1
+5190 3456 1
+5190 3796 1
+5190 4099 1
+5190 4191 1
+5190 4247 1
+5190 4335 1
+5190 4355 1
+5190 4400 1
+5190 4448 1
+5190 4587 1
+5190 4600 1
+5190 4653 1
+5190 4666 1
+5190 4712 1
+5190 4824 1
+5190 4846 1
+5190 4929 1
+5190 4964 1
+5190 4986 1
+5190 5123 1
+5190 5155 1
+5190 5182 1
+5190 5189 1
+5190 5321 1
+5190 5335 1
+5190 5341 1
+5190 5387 1
+5190 5392 1
+5190 5412 1
+5190 5423 1
+5190 5430 1
+5190 5454 1
+5190 5459 1
+5190 5463 1
+5190 5465 1
+5190 5467 1
+5190 5469 1
+5190 5470 1
+5190 5481 1
+5190 5506 1
+5190 5511 1
+5190 5513 1
+5190 5514 1
+5190 5539 1
+5190 5568 1
+5190 5592 1
+5190 5620 1
+5190 5623 1
+5190 5635 1
+5190 5637 1
+5190 5639 1
+5190 5640 1
+5190 5650 1
+5190 5651 1
+5190 5683 1
+5190 5693 1
+5190 5817 1
+5190 5828 1
+5190 5963 1
+5190 6700 1
+5190 8295 1
+5190 8296 1
+5191 1473 1
+5191 2764 1
+5191 3554 1
+5191 3796 1
+5191 4099 1
+5191 4338 1
+5191 4846 1
+5191 5020 1
+5191 5392 1
+5191 5423 1
+5192 3796 1
+5194 4483 1
+5194 4653 1
+5194 5072 1
+5194 5178 1
+5194 5204 1
+5194 5457 1
+5194 6023 1
+5194 6262 1
+5194 6737 1
+5194 8295 1
+5195 1385 1
+5195 1680 1
+5195 3106 1
+5195 5204 1
+5196 15 1
+5196 1972 1
+5196 2001 1
+5196 2774 1
+5196 3238 1
+5196 3885 1
+5196 3897 1
+5196 4315 1
+5196 4875 1
+5196 4964 1
+5196 5079 1
+5196 5178 1
+5196 5204 1
+5196 5254 1
+5196 5289 1
+5196 5543 1
+5196 5802 1
+5196 5804 1
+5196 5871 1
+5196 5963 1
+5196 6166 1
+5196 6251 1
+5196 6505 1
+5196 6665 1
+5196 6809 1
+5196 6832 1
+5196 6850 1
+5196 7279 1
+5196 7414 1
+5196 7561 1
+5196 7632 1
+5196 7646 1
+5197 4964 1
+5197 5204 1
+5197 6004 1
+5198 2354 1
+5198 2398 1
+5198 2689 1
+5198 3456 1
+5198 5123 1
+5198 5204 1
+5199 1823 1
+5199 2535 1
+5199 2658 1
+5199 2940 1
+5199 4483 1
+5199 4875 1
+5199 5200 1
+5199 5204 1
+5199 5459 1
+5199 5819 1
+5199 5829 1
+5199 6422 1
+5199 6560 1
+5199 6599 1
+5199 7012 1
+5199 7279 1
+5199 7378 1
+5199 7587 1
+5199 7647 1
+5199 7649 1
+5199 7669 1
+5199 7809 1
+5200 3897 1
+5200 4432 1
+5200 4448 1
+5200 4587 1
+5200 4632 1
+5200 4824 1
+5200 5204 1
+5200 5215 1
+5200 5412 1
+5200 5463 1
+5200 5465 1
+5200 5897 1
+5200 6979 1
+5200 7021 1
+5200 7553 1
+5201 4335 1
+5201 5079 1
+5201 5204 1
+5201 5208 1
+5201 5378 1
+5201 5412 1
+5201 5459 1
+5201 6665 1
+5201 6980 1
+5201 7021 1
+5201 7478 1
+5201 7498 1
+5201 7520 1
+5201 7632 1
+5201 7855 1
+5202 3460 1
+5202 5204 1
+5203 737 1
+5203 1799 1
+5203 3027 1
+5203 3417 1
+5203 4191 1
+5203 4400 1
+5203 4587 1
+5203 4653 1
+5203 4929 1
+5203 5020 1
+5203 5200 1
+5203 5204 1
+5203 5434 1
+5203 5463 1
+5203 6950 1
+5207 2592 1
+5207 2909 1
+5207 3089 1
+5207 4191 1
+5207 4631 1
+5207 5200 1
+5207 5233 1
+5207 5465 1
+5207 5814 1
+5207 5925 1
+5207 5947 1
+5207 5972 1
+5207 6302 1
+5209 5210 1
+5215 15 1
+5215 3634 1
+5215 4310 1
+5215 5200 1
+5215 6832 1
+5215 7279 1
+5215 7414 1
+5215 7553 1
+5213 5215 1
+5214 5215 1
+5216 5141 1
+5217 2369 1
+5217 3238 1
+5217 3631 1
+5217 4335 1
+5217 4448 1
+5217 4536 1
+5217 4712 1
+5217 5020 1
+5217 5123 1
+5217 5178 1
+5217 5245 1
+5217 5404 1
+5217 5459 1
+5217 5743 1
+5217 5760 1
+5217 6299 1
+5217 6442 1
+5217 6634 1
+5217 6832 1
+5217 6907 1
+5217 6934 1
+5222 5479 1
+5218 5222 1
+5219 5222 1
+5220 5222 1
+5221 5222 1
+5224 5231 1
+5226 4037 1
+5226 4310 1
+5226 4828 1
+5226 5079 1
+5226 5123 1
+5226 5231 1
+5226 5262 1
+5226 5605 1
+5226 5671 1
+5226 5680 1
+5226 5886 1
+5226 5947 1
+5226 5972 1
+5226 6634 1
+5226 7726 1
+5226 7910 1
+5226 8058 1
+5227 5231 1
+5228 5231 1
+5225 5231 1
+5229 5231 1
+5230 5231 1
+5233 737 1
+5233 1385 1
+5233 1680 1
+5233 2909 1
+5233 2940 1
+5233 3027 1
+5233 3103 1
+5233 3106 1
+5233 3393 1
+5233 3897 1
+5233 4071 1
+5233 4127 1
+5233 5239 1
+5233 5288 1
+5233 5430 1
+5233 5818 1
+5233 6004 1
+5233 6044 1
+5233 6780 1
+5233 6914 1
+5233 7092 1
+5233 7301 1
+5233 7862 1
+5233 7890 1
+5232 1385 1
+5232 1680 1
+5239 5305 1
+5238 1385 1
+5238 3459 1
+5238 5239 1
+5242 5245 1
+5244 5245 1
+5241 5245 1
+5241 8051 1
+5243 1247 1
+5243 1385 1
+5243 3027 1
+5243 3103 1
+5243 3459 1
+5243 3897 1
+5243 4127 1
+5243 4315 1
+5243 4400 1
+5243 4587 1
+5243 4824 1
+5243 5245 1
+5243 5288 1
+5243 5308 1
+5243 5392 1
+5243 5423 1
+5243 5430 1
+5243 5809 1
+5243 8295 1
+5246 1026 1
+5246 1352 1
+5246 1982 1
+5246 2276 1
+5246 2354 1
+5246 2620 1
+5246 2822 1
+5246 3089 1
+5246 3191 1
+5246 3459 1
+5246 3586 1
+5246 3643 1
+5246 3910 1
+5246 4041 1
+5246 4361 1
+5246 4400 1
+5246 4687 1
+5246 4712 1
+5246 5182 1
+5246 5245 1
+5246 5255 1
+5246 5260 1
+5246 5392 1
+5246 5393 1
+5246 5467 1
+5246 5524 1
+5246 5543 1
+5246 5582 1
+5246 5620 1
+5246 5756 1
+5246 5827 1
+5246 5839 1
+5246 5963 1
+5246 5991 1
+5246 6029 1
+5246 6109 1
+5246 6596 1
+5246 6599 1
+5246 6832 1
+5246 6976 1
+5246 6993 1
+5246 7301 1
+5246 7620 1
+5246 8148 1
+5250 737 1
+5250 1247 1
+5250 2398 1
+5250 2764 1
+5250 2785 1
+5250 3106 1
+5250 3755 1
+5250 4098 1
+5250 4191 1
+5250 5412 1
+5250 5484 1
+5250 5539 1
+5250 5559 1
+5250 5620 1
+5247 3106 1
+5247 6737 1
+5248 3106 1
+5248 6458 1
+5249 3106 1
+5252 5253 1
+5251 5253 1
+5254 840 1
+5254 896 1
+5254 2160 1
+5254 2398 1
+5254 2689 1
+5254 3089 1
+5254 4191 1
+5254 4361 1
+5254 4536 1
+5254 4713 1
+5254 4717 1
+5254 5178 1
+5254 5321 1
+5254 5412 1
+5254 5714 1
+5254 5807 1
+5254 5822 1
+5254 5839 1
+5254 6299 1
+5254 6496 1
+5254 6566 1
+5254 6628 1
+5254 6707 1
+5254 6765 1
+5254 6832 1
+5254 6840 1
+5254 6860 1
+5254 6946 1
+5254 7144 1
+5254 7620 1
+5254 7632 1
+5254 7835 1
+5254 7890 1
+5255 2689 1
+5255 3417 1
+5255 3460 1
+5255 4448 1
+5255 4587 1
+5255 5323 1
+5255 5640 1
+5255 6255 1
+5261 1385 1
+5261 3691 1
+5262 15 1
+5262 1159 1
+5262 1473 1
+5262 2490 1
+5262 2914 1
+5262 3089 1
+5262 3191 1
+5262 3643 1
+5262 3691 1
+5262 3922 1
+5262 4211 1
+5262 4310 1
+5262 4527 1
+5262 4574 1
+5262 4625 1
+5262 4717 1
+5262 4828 1
+5262 5020 1
+5262 5123 1
+5262 5178 1
+5262 5200 1
+5262 5254 1
+5262 5301 1
+5262 5308 1
+5262 5404 1
+5262 5459 1
+5262 5482 1
+5262 5524 1
+5262 5527 1
+5262 5596 1
+5262 5680 1
+5262 5713 1
+5262 5754 1
+5262 5756 1
+5262 5809 1
+5262 5814 1
+5262 5828 1
+5262 5837 1
+5262 5848 1
+5262 5850 1
+5262 5863 1
+5262 5872 1
+5262 5936 1
+5262 5947 1
+5262 5972 1
+5262 5973 1
+5262 5977 1
+5262 5980 1
+5262 5994 1
+5262 6021 1
+5262 6041 1
+5262 6096 1
+5262 6098 1
+5262 6246 1
+5262 6262 1
+5262 6306 1
+5262 6553 1
+5262 6570 1
+5262 7707 1
+5263 15 1
+5263 896 1
+5263 1159 1
+5263 1473 1
+5263 2258 1
+5263 2277 1
+5263 2354 1
+5263 2398 1
+5263 2490 1
+5263 2507 1
+5263 2516 1
+5263 2576 1
+5263 2605 1
+5263 2765 1
+5263 2775 1
+5263 2785 1
+5263 2831 1
+5263 3027 1
+5263 3089 1
+5263 3191 1
+5263 3274 1
+5263 3393 1
+5263 3691 1
+5263 3922 1
+5263 4041 1
+5263 4098 1
+5263 4335 1
+5263 4338 1
+5263 4448 1
+5263 4527 1
+5263 4530 1
+5263 4536 1
+5263 4587 1
+5263 4600 1
+5263 4666 1
+5263 4777 1
+5263 4795 1
+5263 4797 1
+5263 4824 1
+5263 4964 1
+5263 4986 1
+5263 5182 1
+5263 5226 1
+5263 5305 1
+5263 5321 1
+5263 5445 1
+5263 5449 1
+5263 5454 1
+5263 5482 1
+5263 5499 1
+5263 5568 1
+5263 5592 1
+5263 5620 1
+5263 5637 1
+5263 5640 1
+5263 5650 1
+5263 5693 1
+5263 5705 1
+5263 5721 1
+5263 5743 1
+5263 5756 1
+5263 5784 1
+5263 5790 1
+5263 5828 1
+5263 5837 1
+5263 5844 1
+5263 5848 1
+5263 5850 1
+5263 5860 1
+5263 5863 1
+5263 5872 1
+5263 5886 1
+5263 5963 1
+5263 5973 1
+5263 5994 1
+4407 1385 1
+5265 1385 1
+5267 3460 1
+5267 4335 1
+5275 4315 1
+5275 5210 1
+5276 1498 1
+5276 4315 1
+5276 4713 1
+5276 5079 1
+5276 5614 1
+5276 6044 1
+5276 6123 1
+5276 6156 1
+5276 6833 1
+5277 4315 1
+5278 4315 1
+5280 5288 1
+5281 5288 1
+5282 3089 1
+5282 4400 1
+5282 5288 1
+5282 5449 1
+5283 2398 1
+5283 5288 1
+5287 5288 1
+5284 5288 1
+5284 5412 1
+5285 608 1
+5285 737 1
+5285 2398 1
+5285 2516 1
+5285 4191 1
+5285 4335 1
+5285 4448 1
+5285 4530 1
+5285 4536 1
+5285 4587 1
+5285 4977 1
+5285 5155 1
+5285 5189 1
+5285 5255 1
+5285 5288 1
+5285 5312 1
+5285 5452 1
+5285 5506 1
+5285 5637 1
+5285 5651 1
+5285 6765 1
+5286 2822 1
+5286 3417 1
+5286 3460 1
+5286 3910 1
+5286 5288 1
+5286 5335 1
+5286 5375 1
+5286 5415 1
+5286 5426 1
+5286 5442 1
+5289 4824 1
+5289 4980 1
+5289 5233 1
+5289 5592 1
+5289 6004 1
+5289 7092 1
+5290 4824 1
+5291 4824 1
+5294 3417 1
+5295 2398 1
+5295 2785 1
+5295 3417 1
+5295 4191 1
+5295 4400 1
+5295 4530 1
+5295 4536 1
+5295 4777 1
+5295 4977 1
+5295 5079 1
+5295 5199 1
+5295 5210 1
+5295 5321 1
+5295 5506 1
+5295 5780 1
+5295 5839 1
+5295 6599 1
+5295 7225 1
+5295 7620 1
+5295 7632 1
+5295 7809 1
+5295 7839 1
+5296 1799 1
+5296 2354 1
+5296 2822 1
+5296 3089 1
+5296 3103 1
+5296 3417 1
+5296 3554 1
+5296 3634 1
+5296 3910 1
+5296 4400 1
+5296 4712 1
+5296 4929 1
+5296 5155 1
+5296 5323 1
+5296 5680 1
+5296 5732 1
+5299 4587 1
+5300 4587 1
+5301 15 1
+5301 2276 1
+5301 2285 1
+5301 2605 1
+5301 2620 1
+5301 2940 1
+5301 3089 1
+5301 3498 1
+5301 3643 1
+5301 3873 1
+5301 4310 1
+5301 4483 1
+5301 4527 1
+5301 4574 1
+5301 4653 1
+5301 4717 1
+5301 4748 1
+5301 4875 1
+5301 4994 1
+5301 5121 1
+5301 5179 1
+5301 5188 1
+5301 5233 1
+5301 5273 1
+5301 5404 1
+5301 5454 1
+5301 5459 1
+5301 5479 1
+5301 5527 1
+5301 5596 1
+5301 5624 1
+5301 5630 1
+5301 5680 1
+5301 5753 1
+5301 5804 1
+5301 5806 1
+5301 5827 1
+5301 5897 1
+5301 6094 1
+5301 6098 1
+5301 6123 1
+5301 6124 1
+5301 6148 1
+5301 6151 1
+5301 6218 1
+5301 6229 1
+5301 6498 1
+5301 6503 1
+5301 6505 1
+5301 6599 1
+5301 6714 1
+5301 6715 1
+5301 6739 1
+5301 6789 1
+5301 6860 1
+5301 7131 1
+5301 7351 1
+5301 7373 1
+5301 7381 1
+5301 7422 1
+5301 8295 1
+5306 7092 1
+5312 737 1
+5312 2398 1
+5312 2516 1
+5312 4335 1
+5312 4653 1
+5312 4846 1
+5312 5189 1
+5312 5305 1
+5312 5568 1
+5313 1473 1
+5313 3027 1
+5313 3456 1
+5313 4191 1
+5313 4448 1
+5313 4600 1
+5313 4977 1
+5313 5155 1
+5313 5412 1
+5313 5484 1
+5313 5775 1
+5313 5780 1
+5314 4448 1
+5315 4448 1
+5316 2831 1
+5316 3089 1
+5316 3456 1
+5316 3586 1
+5316 3634 1
+5316 3643 1
+5316 4191 1
+5316 4448 1
+5316 4574 1
+5316 4709 1
+5316 4712 1
+5316 4715 1
+5316 5140 1
+5316 5387 1
+5316 5459 1
+5316 5563 1
+5316 5714 1
+5316 5844 1
+5316 6496 1
+5316 6774 1
+5316 6913 1
+5316 7021 1
+5316 7662 1
+5316 8168 1
+5317 608 1
+5317 1548 1
+5317 2398 1
+5317 2775 1
+5317 4098 1
+5317 4191 1
+5317 4448 1
+5317 4536 1
+5317 5020 1
+5317 5123 1
+5317 5254 1
+5317 5326 1
+5317 5327 1
+5317 5423 1
+5317 5459 1
+5317 5511 1
+5317 5543 1
+5317 5780 1
+5320 2909 1
+5320 3027 1
+5320 3456 1
+5320 4037 1
+5320 5028 1
+5320 5199 1
+5320 5326 1
+5320 5387 1
+5320 5514 1
+5320 5533 1
+5320 5743 1
+5321 15 1
+5321 896 1
+5321 1648 1
+5321 2398 1
+5321 2909 1
+5321 3191 1
+5321 4191 1
+5321 4335 1
+5321 5188 1
+5321 5189 1
+5321 5233 1
+5321 5254 1
+5321 5263 1
+5321 5301 1
+5321 5326 1
+5321 5327 1
+5321 5341 1
+5321 5449 1
+5321 5482 1
+5321 5484 1
+5321 5487 1
+5321 5624 1
+5321 5683 1
+5321 5693 1
+5321 5860 1
+5321 5872 1
+5321 5963 1
+5321 5973 1
+5321 5994 1
+5321 6023 1
+5321 6255 1
+5321 6632 1
+5322 2909 1
+5323 3459 1
+5323 3897 1
+5323 8295 1
+5324 608 1
+5324 2354 1
+5324 3191 1
+5324 3393 1
+5324 3456 1
+5324 4929 1
+5324 5323 1
+5324 5327 1
+5324 5392 1
+5324 5637 1
+5324 5638 1
+5324 5947 1
+5324 5973 1
+5324 5980 1
+5324 5994 1
+5324 8295 1
+5328 5327 1
+5329 5327 1
+5329 5335 1
+5330 5327 1
+5333 3460 1
+5333 3910 1
+5333 5335 1
+5332 5335 1
+5332 5412 1
+5332 5459 1
+5332 5891 1
+5332 6328 1
+5332 6833 1
+5334 2785 1
+5334 4797 1
+5334 5301 1
+5334 5335 1
+5334 5449 1
+5334 5454 1
+5334 5721 1
+5341 5254 1
+5341 7961 1
+5336 4875 1
+5336 5341 1
+5336 5412 1
+5339 3456 1
+5339 3976 1
+5339 4191 1
+5339 5123 1
+5339 5341 1
+5339 5484 1
+5339 5524 1
+5339 5683 1
+5339 6023 1
+5339 6255 1
+5337 5341 1
+5342 2354 1
+5342 2658 1
+5342 3586 1
+5342 4310 1
+5342 4632 1
+5342 5096 1
+5342 5176 1
+5342 5179 1
+5342 5459 1
+5342 5524 1
+5342 5693 1
+5342 5705 1
+5342 5721 1
+5342 5886 1
+5342 6043 1
+5342 6618 1
+5342 6913 1
+5342 6979 1
+5342 7012 1
+5342 7021 1
+5342 7063 1
+5342 7632 1
+5342 7647 1
+5342 7726 1
+5342 7778 1
+5342 7809 1
+5342 7921 1
+5342 8174 1
+5342 8209 1
+5342 8297 1
+5343 2354 1
+5343 3586 1
+5344 2354 1
+5344 3027 1
+5344 4653 1
+5345 2354 1
+5346 2354 1
+5347 2354 1
+5347 5423 1
+5348 2354 1
+5352 737 1
+5352 3460 1
+5352 5176 1
+5353 3460 1
+5355 5354 1
+4591 3910 1
+4591 4712 1
+5356 3910 1
+5357 3910 1
+5358 3910 1
+5264 3554 1
+5264 4536 1
+5264 5061 1
+5264 5176 1
+5264 5463 1
+5264 5817 1
+5264 5828 1
+5360 15 1
+5360 72 1
+5360 608 1
+5360 3027 1
+5360 4191 1
+5360 5072 1
+5360 5123 1
+5360 5392 1
+5360 5412 1
+5360 5430 1
+5360 5543 1
+5360 5559 1
+5360 6251 1
+5360 6474 1
+5360 6567 1
+5361 3191 1
+5361 3393 1
+5361 5123 1
+5361 5963 1
+5361 5980 1
+5361 5994 1
+5365 2822 1
+5366 2822 1
+5366 5459 1
+5367 2822 1
+5370 5375 1
+5371 5375 1
+5372 5375 1
+5373 5375 1
+5374 5375 1
+5376 2785 1
+5377 2785 1
+5378 2785 1
+5378 4037 1
+5378 4401 1
+5378 4507 1
+5378 5432 1
+5378 5812 1
+5378 6044 1
+5378 6737 1
+5378 6780 1
+5378 6946 1
+5378 7050 1
+5378 8042 1
+5378 8044 1
+5378 8209 1
+5378 8219 1
+5378 8224 1
+5378 8237 1
+5380 4400 1
+5380 5392 1
+5381 4400 1
+5381 5263 1
+5381 5392 1
+5381 5963 1
+5382 737 1
+5382 2258 1
+5382 2398 1
+5382 2764 1
+5382 3027 1
+5382 3103 1
+5382 3456 1
+5382 4098 1
+5382 4400 1
+5382 4666 1
+5382 4846 1
+5382 4929 1
+5382 5155 1
+5382 5182 1
+5382 5189 1
+5382 5430 1
+5382 5449 1
+5382 5509 1
+5382 5568 1
+5384 1247 1
+5384 4400 1
+5385 4400 1
+5386 3027 1
+5386 4400 1
+5386 7512 1
+5387 4400 1
+5390 5392 1
+5390 5423 1
+5391 15 1
+5391 1247 1
+5391 1549 1
+5391 1982 1
+5391 2258 1
+5391 2516 1
+5391 3027 1
+5391 3084 1
+5391 3334 1
+5391 3498 1
+5391 4530 1
+5391 4536 1
+5391 4687 1
+5391 4712 1
+5391 5178 1
+5391 5189 1
+5391 5285 1
+5391 5392 1
+5391 5449 1
+5391 5459 1
+5391 5529 1
+5391 5640 1
+5391 5683 1
+5391 5684 1
+5391 5697 1
+5391 5922 1
+5391 6218 1
+5391 6400 1
+5391 6414 1
+5391 6523 1
+5391 6624 1
+5391 6712 1
+5391 6790 1
+5391 6979 1
+5391 7040 1
+5391 7073 1
+5391 7809 1
+5395 3103 1
+5404 2398 1
+5404 2535 1
+5404 3334 1
+5404 4276 1
+5404 4310 1
+5404 4335 1
+5404 4361 1
+5404 4536 1
+5404 4846 1
+5404 4875 1
+5404 5020 1
+5404 5072 1
+5404 5189 1
+5404 5200 1
+5404 5233 1
+5404 5254 1
+5404 5412 1
+5404 5454 1
+5404 5482 1
+5404 5487 1
+5404 5527 1
+5404 5757 1
+5404 5784 1
+5404 5790 1
+5404 5902 1
+5404 6023 1
+5404 6094 1
+5404 6156 1
+5404 6255 1
+5404 6299 1
+5404 6388 1
+5404 6714 1
+5404 6715 1
+5404 6833 1
+5404 7295 1
+5404 7620 1
+5404 7646 1
+5404 7699 1
+5404 8198 1
+5404 8249 1
+5397 5412 1
+5398 5412 1
+5398 5714 1
+5405 608 1
+5405 3456 1
+5405 4977 1
+5405 5412 1
+5399 896 1
+5399 3089 1
+5399 3643 1
+5399 4041 1
+5399 4310 1
+5399 5412 1
+5399 5524 1
+5399 6029 1
+5400 4600 1
+5400 5178 1
+5400 5412 1
+5400 5683 1
+5401 5412 1
+5401 6976 1
+5401 7301 1
+5406 5412 1
+5413 5414 1
+5415 5423 1
+5416 5417 1
+5423 2376 1
+5423 2535 1
+5423 2774 1
+5423 2940 1
+5423 3479 1
+5423 3614 1
+5423 3897 1
+5423 4099 1
+5423 4361 1
+5423 4483 1
+5423 4687 1
+5423 4715 1
+5423 4786 1
+5423 4795 1
+5423 4798 1
+5423 4980 1
+5423 4994 1
+5423 5179 1
+5423 5200 1
+5423 5273 1
+5423 5584 1
+5423 5638 1
+5423 5684 1
+5423 5709 1
+5423 5798 1
+5423 5799 1
+5423 5804 1
+5423 6000 1
+5423 6006 1
+5423 6306 1
+5423 6328 1
+5423 6334 1
+5423 6337 1
+5423 6388 1
+5423 6409 1
+5423 6432 1
+5423 6441 1
+5423 6474 1
+5423 6481 1
+5423 6496 1
+5423 6530 1
+5423 6570 1
+5423 6789 1
+5423 6832 1
+5423 6953 1
+5423 7381 1
+5423 7646 1
+5423 7809 1
+5418 5423 1
+5424 5254 1
+5424 5423 1
+5419 2001 1
+5419 4534 1
+5419 4781 1
+5419 5072 1
+5419 5301 1
+5419 5423 1
+5419 5705 1
+5419 5737 1
+5419 5775 1
+5421 3456 1
+5421 4500 1
+5421 4777 1
+5421 5423 1
+5422 5423 1
+5430 3830 1
+5430 4712 1
+5430 4748 1
+5430 5254 1
+5430 6156 1
+5430 6833 1
+5427 15 1
+5427 896 1
+5427 1159 1
+5427 2001 1
+5427 2925 1
+5427 3089 1
+5427 3393 1
+5427 3586 1
+5427 3873 1
+5427 3976 1
+5427 4041 1
+5427 4098 1
+5427 4191 1
+5427 4310 1
+5427 4653 1
+5427 4828 1
+5427 4964 1
+5427 5178 1
+5427 5262 1
+5427 5321 1
+5427 5335 1
+5427 5430 1
+5427 5459 1
+5427 5524 1
+5427 5527 1
+5427 5543 1
+5427 5640 1
+5427 5844 1
+5427 5848 1
+5427 5891 1
+5427 5928 1
+5427 5947 1
+5427 6023 1
+5427 6080 1
+5427 6096 1
+5427 6105 1
+5427 8295 1
+5428 1799 1
+5428 4712 1
+5428 5430 1
+5429 5430 1
+5431 1247 1
+5432 1247 1
+5432 5378 1
+5432 6682 1
+5432 6784 1
+5435 3897 1
+5436 3027 1
+5437 2490 1
+5437 2507 1
+5437 2765 1
+5437 2925 1
+5437 3027 1
+5437 3586 1
+5437 4041 1
+5437 4527 1
+5437 4574 1
+5437 4828 1
+5437 5123 1
+5437 5182 1
+5437 5680 1
+5437 5828 1
+5437 5844 1
+5437 5848 1
+5437 5863 1
+5437 5886 1
+5437 5891 1
+5437 5925 1
+5437 5928 1
+5437 5947 1
+5437 5973 1
+5437 6009 1
+5437 6029 1
+5437 6098 1
+5438 3027 1
+5439 1982 1
+5439 2273 1
+5439 2914 1
+5439 3027 1
+5439 3459 1
+5439 3792 1
+5439 3873 1
+5439 3897 1
+5439 4401 1
+5439 4441 1
+5439 4488 1
+5439 4687 1
+5439 4748 1
+5439 4786 1
+5439 4791 1
+5439 4795 1
+5439 5002 1
+5439 5140 1
+5439 5321 1
+5439 5543 1
+5439 5563 1
+5439 5596 1
+5439 5626 1
+5439 5738 1
+5439 5739 1
+5439 5773 1
+5439 5799 1
+5439 5800 1
+5439 5818 1
+5439 5829 1
+5439 5998 1
+5439 6001 1
+5439 6006 1
+5439 6097 1
+5439 6156 1
+5439 6218 1
+5439 6255 1
+5439 6261 1
+5439 6327 1
+5439 6330 1
+5439 6388 1
+5439 6400 1
+5439 6409 1
+5439 6422 1
+5439 6424 1
+5439 6437 1
+5439 6441 1
+5439 6458 1
+5439 6462 1
+5439 6474 1
+5439 6481 1
+5439 6498 1
+5439 6530 1
+5439 6560 1
+5439 6567 1
+5439 6686 1
+5439 6707 1
+5439 6715 1
+5439 6783 1
+5439 6788 1
+5439 6790 1
+5439 6855 1
+5439 6858 1
+5439 6920 1
+5439 6930 1
+5439 7060 1
+5440 3027 1
+5440 6462 1
+5445 155 1
+5445 967 1
+5445 1026 1
+5445 1549 1
+5445 2507 1
+5445 2851 1
+5445 3000 1
+5445 3015 1
+5445 3238 1
+5445 3334 1
+5445 3381 1
+5445 3885 1
+5445 3969 1
+5445 4361 1
+5445 4875 1
+5445 4940 1
+5445 5022 1
+5445 5061 1
+5445 5079 1
+5445 5289 1
+5445 5305 1
+5445 5321 1
+5445 5437 1
+5445 5449 1
+5445 5482 1
+5445 5524 1
+5445 5643 1
+5445 5828 1
+5445 5839 1
+5445 5850 1
+5445 5891 1
+5445 5947 1
+5445 6094 1
+5445 6161 1
+5445 6555 1
+5445 6560 1
+5445 6665 1
+5445 6715 1
+5445 6914 1
+5445 6979 1
+5445 7021 1
+5445 7047 1
+5445 7059 1
+5445 7088 1
+5445 7131 1
+5445 7146 1
+5445 7277 1
+5445 7280 1
+5445 7301 1
+5445 7315 1
+5445 7359 1
+5445 7393 1
+5445 7449 1
+5445 7553 1
+5445 7620 1
+5445 7634 1
+5445 7651 1
+5445 7699 1
+5445 7707 1
+5445 7803 1
+5445 7860 1
+5445 7927 1
+5445 8038 1
+5446 155 1
+5446 967 1
+5446 3015 1
+5446 3885 1
+5446 4361 1
+5446 5200 1
+5446 5289 1
+5446 5321 1
+5446 5445 1
+5446 5449 1
+5446 5465 1
+5446 5806 1
+5446 6320 1
+5446 6914 1
+5446 7047 1
+5446 7088 1
+5446 7279 1
+5446 7478 1
+5446 7512 1
+5446 7553 1
+5446 7620 1
+5446 7699 1
+5446 7809 1
+5446 7946 1
+5446 8050 1
+5446 8174 1
+5447 5449 1
+5447 5623 1
+5448 4687 1
+5448 5233 1
+5448 5449 1
+5452 3554 1
+5452 3634 1
+5452 4335 1
+5452 4530 1
+5452 4712 1
+5452 4875 1
+5452 5037 1
+5452 5226 1
+5452 5596 1
+5452 5680 1
+5452 5739 1
+5452 5822 1
+5452 6388 1
+5452 6860 1
+5452 7073 1
+5452 7115 1
+5452 8295 1
+5454 3958 1
+5454 4191 1
+5454 4335 1
+5454 4361 1
+5454 4530 1
+5454 4712 1
+5454 4981 1
+5454 5452 1
+5454 5459 1
+5454 5563 1
+5454 5605 1
+5454 5680 1
+5454 5743 1
+5454 6634 1
+5454 6832 1
+5454 7373 1
+5454 7381 1
+5454 7908 1
+5454 7910 1
+5456 4712 1
+5456 6833 1
+5455 2398 1
+5455 3089 1
+5455 4247 1
+5455 4712 1
+5455 5155 1
+5455 5482 1
+5455 6576 1
+5455 6600 1
+5457 1799 1
+5457 2276 1
+5457 2277 1
+5457 2490 1
+5457 2774 1
+5457 3089 1
+5457 3191 1
+5457 3498 1
+5457 4041 1
+5457 4310 1
+5457 4795 1
+5457 4875 1
+5457 5262 1
+5457 5263 1
+5457 5301 1
+5457 5487 1
+5457 5564 1
+5457 5620 1
+5457 5624 1
+5457 5637 1
+5457 5638 1
+5457 5683 1
+5457 5697 1
+5457 5757 1
+5457 5760 1
+5457 5780 1
+5457 5792 1
+5457 5828 1
+5457 5891 1
+5457 5969 1
+5457 5972 1
+5457 5973 1
+5457 6021 1
+5457 6078 1
+5457 6080 1
+5457 6096 1
+5457 6098 1
+5457 6149 1
+5457 6251 1
+5457 6261 1
+5457 6302 1
+5457 6388 1
+5457 6435 1
+5457 8295 1
+5460 5463 1
+5461 5463 1
+5466 5387 1
+5466 6634 1
+5468 1548 1
+5468 1799 1
+5468 3456 1
+5468 4191 1
+5468 5484 1
+5468 5506 1
+5468 5509 1
+5468 5511 1
+5468 5513 1
+5468 5514 1
+5472 1473 1
+5472 3752 1
+5472 3962 1
+5472 4574 1
+5472 4846 1
+5472 5022 1
+5472 5028 1
+5472 5155 1
+5472 5452 1
+5472 5863 1
+5472 6123 1
+5472 6458 1
+5472 7073 1
+5472 7510 1
+5472 7809 1
+5472 7961 1
+5473 5155 1
+5474 2831 1
+5474 3554 1
+5474 4041 1
+5474 4191 1
+5474 4600 1
+5474 4653 1
+5474 5484 1
+5474 5539 1
+5475 608 1
+5475 6414 1
+5476 608 1
+5477 4929 1
+5478 737 1
+5478 3456 1
+5478 4600 1
+5478 4929 1
+5478 4964 1
+5478 5509 1
+5478 5568 1
+5478 5650 1
+5478 5886 1
+5480 4929 1
+5480 4964 1
+5480 5484 1
+5479 15 1
+5479 2490 1
+5479 2535 1
+5479 3238 1
+5479 4037 1
+5479 4276 1
+5479 4574 1
+5479 4884 1
+5479 4929 1
+5479 5148 1
+5479 5182 1
+5479 5233 1
+5479 5454 1
+5479 5529 1
+5479 5543 1
+5479 5582 1
+5479 5683 1
+5479 5693 1
+5479 5773 1
+5479 5863 1
+5479 5886 1
+5479 6560 1
+5479 6832 1
+5479 6948 1
+5479 7620 1
+5479 7632 1
+5479 7809 1
+5479 8134 1
+5482 737 1
+5482 840 1
+5482 2831 1
+5482 4600 1
+5482 4653 1
+5482 5189 1
+5482 5445 1
+5482 5828 1
+5482 5850 1
+5482 6229 1
+5482 6790 1
+5482 8212 1
+5483 4600 1
+5484 15 1
+5484 737 1
+5484 3089 1
+5484 3459 1
+5484 3586 1
+5484 3755 1
+5484 4041 1
+5484 4099 1
+5484 4310 1
+5484 4600 1
+5484 4653 1
+5484 4781 1
+5484 4980 1
+5484 5020 1
+5484 5178 1
+5484 5459 1
+5484 5563 1
+5484 5780 1
+5484 6044 1
+5484 6124 1
+5484 6790 1
+5484 7092 1
+5485 1159 1
+5485 1473 1
+5485 1548 1
+5485 3238 1
+5485 4037 1
+5485 4099 1
+5485 4310 1
+5485 4600 1
+5485 5022 1
+5485 5176 1
+5485 5178 1
+5485 5484 1
+5485 5539 1
+5485 5673 1
+5485 5886 1
+5485 6044 1
+5485 6784 1
+5485 6914 1
+5485 7092 1
+5485 7386 1
+5485 8296 1
+5486 4600 1
+5487 15 1
+5487 1026 1
+5487 2001 1
+5487 2535 1
+5487 2764 1
+5487 2831 1
+5487 3393 1
+5487 3873 1
+5487 4071 1
+5487 4335 1
+5487 4435 1
+5487 4600 1
+5487 4666 1
+5487 4846 1
+5487 4981 1
+5487 5079 1
+5487 5262 1
+5487 5445 1
+5487 5500 1
+5487 5545 1
+5487 5569 1
+5487 5570 1
+5487 5683 1
+5487 5994 1
+5487 6161 1
+5487 6166 1
+5487 6246 1
+5487 6914 1
+5487 7839 1
+5487 7924 1
+5488 4600 1
+5489 1473 1
+5489 4071 1
+5489 4600 1
+5489 5780 1
+5489 5812 1
+5489 6833 1
+5489 6869 1
+5489 7092 1
+5489 7115 1
+5489 7553 1
+5489 7890 1
+5489 8051 1
+5490 4600 1
+5491 4600 1
+5494 4977 1
+5495 2001 1
+5495 4191 1
+5495 4977 1
+5495 5737 1
+5496 4977 1
+5462 737 1
+5462 1548 1
+5462 1733 1
+5462 2398 1
+5462 2552 1
+5462 2831 1
+5462 3456 1
+5462 4631 1
+5462 4977 1
+5462 5484 1
+5462 5511 1
+5462 5513 1
+5462 5545 1
+5462 5559 1
+5462 5563 1
+5462 5592 1
+5462 5620 1
+5462 5780 1
+5462 8296 1
+5497 4977 1
+5499 2398 1
+5499 4666 1
+5499 5452 1
+5501 1548 1
+5501 5452 1
+5501 7478 1
+5500 5452 1
+5504 5301 1
+5504 5506 1
+5505 5506 1
+5507 5509 1
+5508 5509 1
+5511 4335 1
+5511 5693 1
+5511 8198 1
+5510 5511 1
+5512 3456 1
+5512 5511 1
+5515 72 1
+5515 737 1
+5515 2398 1
+5515 4098 1
+5515 4191 1
+5515 4666 1
+5515 5650 1
+5516 4191 1
+5516 5285 1
+5517 4191 1
+5518 4191 1
+5519 4191 1
+5520 3643 1
+5520 4191 1
+5521 737 1
+5521 3456 1
+5521 4191 1
+5522 4191 1
+5523 4191 1
+5524 155 1
+5524 840 1
+5524 896 1
+5524 967 1
+5524 1026 1
+5524 1191 1
+5524 1403 1
+5524 1498 1
+5524 1549 1
+5524 1972 1
+5524 1982 1
+5524 2160 1
+5524 2273 1
+5524 2433 1
+5524 2440 1
+5524 2565 1
+5524 2658 1
+5524 2774 1
+5524 2785 1
+5524 2851 1
+5524 2925 1
+5524 2940 1
+5524 3000 1
+5524 3015 1
+5524 3084 1
+5524 3089 1
+5524 3238 1
+5524 3291 1
+5524 3293 1
+5524 3310 1
+5524 3334 1
+5524 3346 1
+5524 3381 1
+5524 3459 1
+5524 3498 1
+5524 3586 1
+5524 3631 1
+5524 3634 1
+5524 3726 1
+5524 3752 1
+5524 3792 1
+5524 3803 1
+5524 3809 1
+5524 3830 1
+5524 3842 1
+5524 3873 1
+5524 3885 1
+5524 3897 1
+5524 3919 1
+5524 3962 1
+5524 4037 1
+5524 4065 1
+5524 4071 1
+5524 4099 1
+5524 4134 1
+5524 4191 1
+5524 4310 1
+5524 4341 1
+5524 4361 1
+5524 4432 1
+5524 4435 1
+5524 4483 1
+5524 4488 1
+5524 4507 1
+5524 4536 1
+5524 4604 1
+5524 4632 1
+5524 4666 1
+5524 4689 1
+5524 4709 1
+5524 4712 1
+5524 4713 1
+5524 4715 1
+5524 4717 1
+5524 4748 1
+5524 4764 1
+5524 4781 1
+5524 4798 1
+5524 4828 1
+5524 4875 1
+5524 4944 1
+5524 4980 1
+5524 4981 1
+5524 4983 1
+5524 4994 1
+5524 5002 1
+5524 5012 1
+5524 5020 1
+5524 5022 1
+5524 5028 1
+5524 5037 1
+5524 5079 1
+5524 5096 1
+5524 5121 1
+5524 5140 1
+5524 5148 1
+5524 5178 1
+5524 5179 1
+5524 5188 1
+5524 5199 1
+5524 5200 1
+5524 5210 1
+5524 5233 1
+5524 5246 1
+5524 5254 1
+5524 5262 1
+5524 5273 1
+5524 5288 1
+5524 5289 1
+5524 5295 1
+5524 5301 1
+5524 5335 1
+5524 5378 1
+5524 5384 1
+5524 5393 1
+5524 5404 1
+5524 5406 1
+5524 5423 1
+5524 5439 1
+5524 5459 1
+5524 5465 1
+5524 5466 1
+5524 5479 1
+5524 5484 1
+5524 5500 1
+5524 5527 1
+5524 5529 1
+5524 5543 1
+5524 5563 1
+5524 5582 1
+5524 5584 1
+5524 5596 1
+5524 5605 1
+5524 5614 1
+5524 5626 1
+5524 5671 1
+5524 5684 1
+5524 5697 1
+5524 5714 1
+5524 5739 1
+5524 5760 1
+5524 5773 1
+5524 5776 1
+5524 5800 1
+5524 5802 1
+5524 5804 1
+5524 5811 1
+5524 5812 1
+5524 5814 1
+5524 5818 1
+5524 5819 1
+5524 5822 1
+5524 5827 1
+5524 5829 1
+5524 5835 1
+5524 5839 1
+5524 5871 1
+5524 5872 1
+5524 5886 1
+5524 5897 1
+5524 5902 1
+5524 5922 1
+5524 5932 1
+5524 5933 1
+5524 5947 1
+5524 5998 1
+5524 6001 1
+5524 6004 1
+5524 6006 1
+5524 6032 1
+5524 6043 1
+5524 6044 1
+5524 6078 1
+5524 6097 1
+5524 6098 1
+5524 6111 1
+5524 6123 1
+5524 6124 1
+5524 6151 1
+5524 6156 1
+5524 6162 1
+5524 6166 1
+5524 6170 1
+5524 6174 1
+5524 6221 1
+5524 6227 1
+5524 6241 1
+5524 6243 1
+5524 6251 1
+5524 6270 1
+5524 6272 1
+5524 6296 1
+5524 6299 1
+5524 6305 1
+5524 6306 1
+5524 6320 1
+5524 6327 1
+5524 6328 1
+5524 6330 1
+5524 6337 1
+5524 6347 1
+5524 6388 1
+5524 6407 1
+5524 6414 1
+5524 6417 1
+5524 6422 1
+5524 6437 1
+5524 6441 1
+5524 6458 1
+5524 6481 1
+5524 6496 1
+5524 6501 1
+5524 6503 1
+5524 6505 1
+5524 6523 1
+5524 6528 1
+5524 6552 1
+5524 6554 1
+5524 6555 1
+5524 6560 1
+5524 6566 1
+5524 6570 1
+5524 6576 1
+5524 6589 1
+5524 6594 1
+5524 6600 1
+5524 6613 1
+5524 6618 1
+5524 6624 1
+5524 6632 1
+5524 6634 1
+5524 6665 1
+5524 6699 1
+5524 6712 1
+5524 6714 1
+5524 6715 1
+5524 6736 1
+5524 6765 1
+5524 6770 1
+5524 6774 1
+5524 6780 1
+5524 6784 1
+5524 6789 1
+5524 6790 1
+5524 6832 1
+5524 6833 1
+5524 6850 1
+5524 6855 1
+5524 6860 1
+5524 6869 1
+5524 6873 1
+5524 6875 1
+5524 6892 1
+5524 6897 1
+5524 6901 1
+5524 6907 1
+5524 6913 1
+5524 6914 1
+5524 6918 1
+5524 6930 1
+5524 6934 1
+5524 6945 1
+5524 6946 1
+5524 6955 1
+5524 6976 1
+5524 6979 1
+5524 6980 1
+5524 6993 1
+5524 7005 1
+5524 7012 1
+5524 7021 1
+5524 7040 1
+5524 7047 1
+5524 7050 1
+5524 7052 1
+5524 7054 1
+5524 7059 1
+5524 7063 1
+5524 7073 1
+5524 7074 1
+5524 7088 1
+5524 7092 1
+5524 7094 1
+5524 7101 1
+5524 7108 1
+5524 7115 1
+5524 7119 1
+5524 7131 1
+5524 7143 1
+5524 7162 1
+5524 7168 1
+5524 7185 1
+5524 7186 1
+5524 7214 1
+5524 7225 1
+5524 7233 1
+5524 7237 1
+5524 7277 1
+5524 7279 1
+5524 7280 1
+5524 7295 1
+5524 7301 1
+5524 7304 1
+5524 7341 1
+5524 7351 1
+5524 7362 1
+5524 7373 1
+5524 7378 1
+5524 7381 1
+5524 7386 1
+5524 7391 1
+5524 7393 1
+5524 7400 1
+5524 7414 1
+5524 7422 1
+5524 7436 1
+5524 7442 1
+5524 7443 1
+5524 7450 1
+5524 7478 1
+5524 7497 1
+5524 7510 1
+5524 7512 1
+5524 7529 1
+5524 7544 1
+5524 7553 1
+5524 7557 1
+5524 7587 1
+5524 7588 1
+5524 7618 1
+5524 7620 1
+5524 7624 1
+5524 7632 1
+5524 7646 1
+5524 7649 1
+5524 7651 1
+5524 7662 1
+5524 7683 1
+5524 7694 1
+5524 7695 1
+5524 7699 1
+5524 7707 1
+5524 7726 1
+5524 7740 1
+5524 7757 1
+5524 7763 1
+5524 7788 1
+5524 7795 1
+5524 7809 1
+5524 7810 1
+5524 7833 1
+5524 7835 1
+5524 7839 1
+5524 7855 1
+5524 7860 1
+5524 7862 1
+5524 7871 1
+5524 7874 1
+5524 7879 1
+5524 7882 1
+5524 7890 1
+5524 7899 1
+5524 7908 1
+5524 7910 1
+5524 7924 1
+5524 7927 1
+5524 7961 1
+5524 7979 1
+5524 7992 1
+5524 8037 1
+5524 8042 1
+5524 8044 1
+5524 8121 1
+5524 8122 1
+5524 8124 1
+5524 8128 1
+5524 8134 1
+5524 8141 1
+5524 8163 1
+5524 8168 1
+5524 8169 1
+5524 8174 1
+5524 8178 1
+5524 8192 1
+5524 8209 1
+5524 8219 1
+5524 8224 1
+5524 8295 1
+5524 8297 1
+5525 4191 1
+5526 737 1
+5526 2398 1
+5526 3459 1
+5526 3803 1
+5526 4191 1
+5526 5254 1
+5527 4191 1
+5527 4689 1
+5530 4191 1
+5531 15 1
+5531 72 1
+5531 155 1
+5531 737 1
+5531 840 1
+5531 896 1
+5531 1026 1
+5531 1159 1
+5531 1352 1
+5531 1403 1
+5531 1473 1
+5531 1548 1
+5531 1549 1
+5531 1823 1
+5531 1972 1
+5531 1982 1
+5531 2001 1
+5531 2160 1
+5531 2273 1
+5531 2276 1
+5531 2285 1
+5531 2433 1
+5531 2440 1
+5531 2565 1
+5531 2774 1
+5531 2914 1
+5531 2925 1
+5531 2940 1
+5531 3000 1
+5531 3015 1
+5531 3089 1
+5531 3274 1
+5531 3291 1
+5531 3393 1
+5531 3459 1
+5531 3479 1
+5531 3631 1
+5531 3634 1
+5531 3792 1
+5531 3803 1
+5531 3842 1
+5531 3873 1
+5531 3885 1
+5531 3897 1
+5531 3919 1
+5531 3969 1
+5531 3976 1
+5531 4037 1
+5531 4065 1
+5531 4099 1
+5531 4134 1
+5531 4175 1
+5531 4191 1
+5531 4310 1
+5531 4335 1
+5531 4341 1
+5531 4412 1
+5531 4441 1
+5531 4488 1
+5531 4530 1
+5531 4534 1
+5531 4536 1
+5531 4604 1
+5531 4632 1
+5531 4689 1
+5531 4709 1
+5531 4712 1
+5531 4713 1
+5531 4748 1
+5531 4764 1
+5531 4781 1
+5531 4791 1
+5531 4828 1
+5531 4875 1
+5531 4884 1
+5531 4899 1
+5531 4994 1
+5531 5002 1
+5531 5012 1
+5531 5103 1
+5531 5121 1
+5531 5123 1
+5531 5140 1
+5531 5178 1
+5531 5179 1
+5531 5188 1
+5531 5199 1
+5531 5210 1
+5531 5226 1
+5531 5233 1
+5531 5254 1
+5531 5262 1
+5531 5273 1
+5531 5288 1
+5531 5295 1
+5531 5301 1
+5531 5321 1
+5531 5335 1
+5531 5384 1
+5531 5404 1
+5531 5423 1
+5531 5437 1
+5531 5454 1
+5531 5459 1
+5531 5479 1
+5531 5487 1
+5531 5524 1
+5531 5527 1
+5531 5543 1
+5531 5563 1
+5531 5584 1
+5531 5596 1
+5531 5624 1
+5531 5637 1
+5531 5683 1
+5531 5714 1
+5531 5732 1
+5531 5739 1
+5531 5753 1
+5531 5760 1
+5531 5775 1
+5531 5776 1
+5531 5780 1
+5531 5799 1
+5531 5800 1
+5531 5802 1
+5531 5804 1
+5531 5806 1
+5531 5814 1
+5531 5818 1
+5531 5827 1
+5531 5829 1
+5531 5871 1
+5531 5886 1
+5531 5897 1
+5531 5947 1
+5531 5963 1
+5531 5994 1
+5531 6000 1
+5531 6001 1
+5531 6004 1
+5531 6006 1
+5531 6041 1
+5531 6054 1
+5531 6098 1
+5531 6124 1
+5531 6148 1
+5531 6151 1
+5531 6156 1
+5531 6170 1
+5531 6218 1
+5531 6243 1
+5531 6246 1
+5531 6251 1
+5531 6255 1
+5531 6262 1
+5531 6272 1
+5531 6296 1
+5531 6299 1
+5531 6305 1
+5531 6306 1
+5531 6327 1
+5531 6330 1
+5531 6347 1
+5531 6388 1
+5531 6400 1
+5531 6414 1
+5531 6417 1
+5531 6437 1
+5531 6441 1
+5531 6442 1
+5531 6458 1
+5531 6481 1
+5531 6496 1
+5531 6498 1
+5531 6501 1
+5531 6503 1
+5531 6505 1
+5531 6528 1
+5531 6552 1
+5531 6553 1
+5531 6560 1
+5531 6566 1
+5531 6567 1
+5531 6576 1
+5531 6589 1
+5531 6594 1
+5531 6599 1
+5531 6600 1
+5531 6613 1
+5531 6632 1
+5531 6634 1
+5531 6665 1
+5531 6699 1
+5531 6715 1
+5531 6720 1
+5531 6721 1
+5531 6723 1
+5531 6736 1
+5531 6770 1
+5531 6774 1
+5531 6777 1
+5531 6783 1
+5531 6790 1
+5531 6803 1
+5531 6832 1
+5531 6833 1
+5531 6850 1
+5531 6855 1
+5531 6860 1
+5531 6869 1
+5531 6897 1
+5531 6901 1
+5531 6907 1
+5531 6913 1
+5531 6930 1
+5531 6933 1
+5531 6946 1
+5531 7052 1
+5531 7054 1
+5531 7073 1
+5531 7088 1
+5531 7094 1
+5531 7108 1
+5531 7115 1
+5531 7143 1
+5531 7149 1
+5531 7279 1
+5531 7351 1
+5531 7373 1
+5531 7378 1
+5531 7397 1
+5531 7414 1
+5531 7422 1
+5531 7450 1
+5531 7478 1
+5531 7510 1
+5531 7512 1
+5531 7553 1
+5531 7561 1
+5531 7587 1
+5531 8295 1
+5531 8297 1
+5528 4191 1
+5528 4335 1
+5528 4500 1
+5528 4777 1
+5528 5020 1
+5528 5640 1
+5532 15 1
+5532 72 1
+5532 737 1
+5532 1352 1
+5532 1549 1
+5532 2285 1
+5532 2535 1
+5532 3291 1
+5532 3976 1
+5532 4191 1
+5532 4276 1
+5532 4335 1
+5532 5254 1
+5532 5295 1
+5532 5772 1
+5532 5780 1
+5532 6004 1
+5532 6156 1
+5532 6229 1
+5532 6302 1
+5532 6566 1
+5532 6774 1
+5532 6832 1
+5532 6833 1
+5532 6869 1
+5532 8295 1
+5534 15 1
+5534 737 1
+5534 2831 1
+5534 3643 1
+5534 3976 1
+5534 4653 1
+5534 5178 1
+5534 5459 1
+5534 5637 1
+5534 5638 1
+5534 5775 1
+5534 5882 1
+5534 5991 1
+5534 8295 1
+5535 2831 1
+5536 72 1
+5536 2831 1
+5536 5020 1
+5537 2831 1
+5193 2440 1
+5193 3376 1
+5193 3634 1
+5193 3919 1
+5193 4335 1
+5193 4712 1
+5193 4717 1
+5193 5188 1
+5193 5482 1
+5193 5539 1
+5193 5863 1
+5193 5872 1
+5193 6347 1
+5193 6498 1
+5193 6505 1
+5193 6553 1
+5193 6595 1
+5193 6806 1
+5540 1548 1
+5540 5459 1
+5540 6330 1
+5541 1548 1
+5542 3456 1
+5543 15 1
+5543 737 1
+5543 1159 1
+5543 1549 1
+5543 2276 1
+5543 2507 1
+5543 2511 1
+5543 2535 1
+5543 2565 1
+5543 2589 1
+5543 2658 1
+5543 2765 1
+5543 2774 1
+5543 2851 1
+5543 2925 1
+5543 2940 1
+5543 3015 1
+5543 3089 1
+5543 3334 1
+5543 3456 1
+5543 3459 1
+5543 3498 1
+5543 3586 1
+5543 3634 1
+5543 3643 1
+5543 3792 1
+5543 3830 1
+5543 3873 1
+5543 3962 1
+5543 4037 1
+5543 4041 1
+5543 4065 1
+5543 4134 1
+5543 4310 1
+5543 4483 1
+5543 4488 1
+5543 4527 1
+5543 4715 1
+5543 4764 1
+5543 4781 1
+5543 4828 1
+5543 4944 1
+5543 4980 1
+5543 5061 1
+5543 5079 1
+5543 5096 1
+5543 5103 1
+5543 5121 1
+5543 5123 1
+5543 5178 1
+5543 5182 1
+5543 5199 1
+5543 5200 1
+5543 5233 1
+5543 5262 1
+5543 5273 1
+5543 5295 1
+5543 5335 1
+5543 5384 1
+5543 5423 1
+5543 5437 1
+5543 5524 1
+5543 5527 1
+5543 5545 1
+5543 5563 1
+5543 5596 1
+5543 5624 1
+5543 5684 1
+5543 5697 1
+5543 5739 1
+5543 5753 1
+5543 5798 1
+5543 5800 1
+5543 5804 1
+5543 5806 1
+5543 5807 1
+5543 5818 1
+5543 5822 1
+5543 5872 1
+5543 5897 1
+5543 5925 1
+5543 5947 1
+5543 5998 1
+5543 6001 1
+5543 6029 1
+5543 6098 1
+5543 6123 1
+5543 6124 1
+5543 6148 1
+5543 6166 1
+5543 6227 1
+5543 6246 1
+5543 6251 1
+5543 6272 1
+5543 6296 1
+5543 6299 1
+5543 6305 1
+5543 6306 1
+5543 6328 1
+5543 6330 1
+5543 6337 1
+5543 6555 1
+5543 6570 1
+5543 6589 1
+5543 6594 1
+5543 6624 1
+5543 6736 1
+5543 6774 1
+5543 6784 1
+5543 6790 1
+5543 6832 1
+5543 6855 1
+5543 6860 1
+5543 6869 1
+5543 6873 1
+5543 6897 1
+5543 6901 1
+5543 6930 1
+5543 6945 1
+5543 6953 1
+5543 6955 1
+5543 6979 1
+5543 6982 1
+5543 7040 1
+5543 7063 1
+5543 7092 1
+5543 7101 1
+5543 7119 1
+5543 7131 1
+5543 7143 1
+5543 7279 1
+5543 7373 1
+5543 7414 1
+5543 7478 1
+5543 7510 1
+5543 7961 1
+5543 7979 1
+5544 3456 1
+5544 5500 1
+5544 5545 1
+5544 5559 1
+5548 5484 1
+5549 4037 1
+5549 5020 1
+5549 5178 1
+5549 5254 1
+5549 5484 1
+5549 5714 1
+5549 6156 1
+5549 6229 1
+5549 6770 1
+5549 6790 1
+5550 4037 1
+5550 4310 1
+5550 4689 1
+5550 5178 1
+5550 5484 1
+5550 5563 1
+5550 5998 1
+5550 6044 1
+5550 6946 1
+5550 7908 1
+5550 8037 1
+5551 5459 1
+5551 5484 1
+5551 5963 1
+5551 6481 1
+5551 6634 1
+5551 7391 1
+5551 7624 1
+5551 7924 1
+5554 5484 1
+5552 1473 1
+5552 3238 1
+5552 4338 1
+5552 4687 1
+5552 5484 1
+5552 5780 1
+5552 6833 1
+5552 6869 1
+5553 2258 1
+5553 2490 1
+5553 3293 1
+5553 3792 1
+5553 4037 1
+5553 4071 1
+5553 4099 1
+5553 4335 1
+5553 4338 1
+5553 4653 1
+5553 5037 1
+5553 5072 1
+5553 5096 1
+5553 5178 1
+5553 5233 1
+5553 5335 1
+5553 5484 1
+5553 5524 1
+5553 5563 1
+5553 5637 1
+5553 5693 1
+5553 5863 1
+5553 5887 1
+5553 5963 1
+5553 6004 1
+5553 6006 1
+5553 6151 1
+5553 6306 1
+5553 6496 1
+5553 6624 1
+5553 6634 1
+5553 6759 1
+5553 6780 1
+5553 6860 1
+5553 6914 1
+5553 6930 1
+5553 6979 1
+5553 7119 1
+5553 7386 1
+5553 7813 1
+5553 7908 1
+5553 7965 1
+5553 7979 1
+5553 8121 1
+5553 8124 1
+5553 8134 1
+5555 5484 1
+5558 5545 1
+5558 5559 1
+5558 5705 1
+5563 3873 1
+5563 7882 1
+5561 5563 1
+5562 2277 1
+5562 3274 1
+5562 3897 1
+5562 4335 1
+5562 4530 1
+5562 4875 1
+5562 5189 1
+5562 5404 1
+5562 5527 1
+5562 5563 1
+5562 5568 1
+5562 5683 1
+5562 6156 1
+5565 5020 1
+5565 5188 1
+5565 5189 1
+5566 5189 1
+5567 5568 1
+5569 5020 1
+5571 4666 1
+5572 4666 1
+5573 4666 1
+5577 2398 1
+5577 4098 1
+5577 4335 1
+5577 4846 1
+5577 4964 1
+5577 5592 1
+5577 5620 1
+5577 5963 1
+5576 4846 1
+5578 2764 1
+5579 2764 1
+5579 3897 1
+5580 2764 1
+5580 6924 1
+5581 2764 1
+5581 2765 1
+5582 1549 1
+5582 1972 1
+5582 2160 1
+5582 2276 1
+5582 2433 1
+5582 2764 1
+5582 2774 1
+5582 2785 1
+5582 2851 1
+5582 2925 1
+5582 3015 1
+5582 3291 1
+5582 3498 1
+5582 3631 1
+5582 3634 1
+5582 3643 1
+5582 3803 1
+5582 3830 1
+5582 4037 1
+5582 4065 1
+5582 4099 1
+5582 4310 1
+5582 4536 1
+5582 4666 1
+5582 4709 1
+5582 4713 1
+5582 4717 1
+5582 4748 1
+5582 4795 1
+5582 4944 1
+5582 4964 1
+5582 4980 1
+5582 4994 1
+5582 5002 1
+5582 5037 1
+5582 5140 1
+5582 5200 1
+5582 5288 1
+5582 5384 1
+5582 5432 1
+5582 5439 1
+5582 5479 1
+5582 5543 1
+5582 5545 1
+5582 5624 1
+5582 5626 1
+5582 5714 1
+5582 5776 1
+5582 5799 1
+5582 5802 1
+5582 5822 1
+5582 5824 1
+5582 5829 1
+5582 5922 1
+5582 5932 1
+5582 5998 1
+5582 6004 1
+5582 6006 1
+5582 6097 1
+5582 6166 1
+5582 6170 1
+5582 6218 1
+5582 6221 1
+5582 6299 1
+5582 6327 1
+5582 6328 1
+5582 6334 1
+5582 6347 1
+5582 6432 1
+5582 6437 1
+5582 6441 1
+5582 6458 1
+5582 6481 1
+5582 6496 1
+5582 6505 1
+5582 6528 1
+5582 6554 1
+5582 6566 1
+5582 6570 1
+5582 6576 1
+5582 6613 1
+5582 6624 1
+5582 6634 1
+5582 6665 1
+5582 6699 1
+5582 6715 1
+5582 6720 1
+5582 6739 1
+5582 6774 1
+5582 6783 1
+5582 6784 1
+5582 6833 1
+5582 6855 1
+5582 6913 1
+5582 6955 1
+5582 6976 1
+5582 7073 1
+5582 7108 1
+5582 7119 1
+5582 7143 1
+5582 7144 1
+5582 7214 1
+5582 7301 1
+5582 7306 1
+5582 8297 1
+5583 2764 1
+5583 2765 1
+5584 15 1
+5584 737 1
+5584 2398 1
+5584 2440 1
+5584 2620 1
+5584 2764 1
+5584 4964 1
+5584 4983 1
+5584 5254 1
+5584 5321 1
+5584 6156 1
+5584 6576 1
+5587 5588 1
+5589 15 1
+5589 896 1
+5589 3873 1
+5589 3897 1
+5589 4964 1
+5589 5233 1
+5589 5459 1
+5589 5697 1
+5589 6218 1
+5589 6246 1
+5589 6296 1
+5591 15 1
+5591 2398 1
+5591 2774 1
+5591 2775 1
+5591 2914 1
+5591 3291 1
+5591 4335 1
+5591 4687 1
+5591 5254 1
+5591 5487 1
+5591 5592 1
+5591 5684 1
+5591 5799 1
+5591 5814 1
+5591 6023 1
+5591 6218 1
+5591 6246 1
+5591 6262 1
+5591 6306 1
+5591 6334 1
+5591 6388 1
+5591 6400 1
+5591 6409 1
+5591 6414 1
+5591 6417 1
+5591 6432 1
+5591 6566 1
+5594 4098 1
+5596 3631 1
+5596 4098 1
+5596 4134 1
+5596 5103 1
+5596 5459 1
+5596 5563 1
+5596 5697 1
+5596 5738 1
+5596 5800 1
+5596 5822 1
+5596 5850 1
+5596 5871 1
+5596 5886 1
+5596 5991 1
+5596 6059 1
+5596 6078 1
+5596 6407 1
+5596 6496 1
+5596 6543 1
+5596 6668 1
+5596 6685 1
+5596 6723 1
+5596 6725 1
+5596 6783 1
+5596 6813 1
+5596 7052 1
+5596 7108 1
+5596 7359 1
+5596 7520 1
+5596 8295 1
+5595 4098 1
+5598 4247 1
+5599 4247 1
+5600 1473 1
+5600 2258 1
+5600 2535 1
+5600 3897 1
+5600 4099 1
+5600 4247 1
+5600 4500 1
+5600 6029 1
+5601 2398 1
+5601 4247 1
+5602 4247 1
+5603 4247 1
+5603 4500 1
+5603 4797 1
+5604 2398 1
+5604 5226 1
+5604 5623 1
+5604 5871 1
+5604 6305 1
+5604 6765 1
+5604 6945 1
+5605 15 1
+5605 2398 1
+5605 3334 1
+5605 4536 1
+5605 4981 1
+5605 5028 1
+5605 5037 1
+5605 6840 1
+5605 7632 1
+5605 7862 1
+5605 7908 1
+5606 737 1
+5606 1473 1
+5606 1648 1
+5606 2398 1
+5606 2576 1
+5606 2605 1
+5606 4335 1
+5606 4534 1
+5606 4574 1
+5606 4899 1
+5606 5061 1
+5606 5072 1
+5606 5321 1
+5606 5445 1
+5606 5459 1
+5606 5680 1
+5606 5683 1
+5606 5745 1
+5606 5775 1
+5606 5780 1
+5606 5828 1
+5606 5830 1
+5606 5832 1
+5606 5837 1
+5606 5844 1
+5606 5848 1
+5606 5872 1
+5606 5969 1
+5607 2398 1
+5608 2398 1
+5608 2516 1
+5608 2535 1
+5608 3755 1
+5608 3897 1
+5608 4099 1
+5608 4795 1
+5608 4986 1
+5608 5301 1
+5608 5335 1
+5608 5638 1
+5608 5651 1
+5608 5664 1
+5608 5683 1
+5608 6124 1
+5608 6783 1
+5612 15 1
+5612 737 1
+5612 1549 1
+5612 1982 1
+5612 2160 1
+5612 2276 1
+5612 2398 1
+5612 2440 1
+5612 2535 1
+5612 2620 1
+5612 2775 1
+5612 3084 1
+5612 3291 1
+5612 3297 1
+5612 3459 1
+5612 3634 1
+5612 3643 1
+5612 3958 1
+5612 3962 1
+5612 4099 1
+5612 4134 1
+5612 4276 1
+5612 4530 1
+5612 4536 1
+5612 4687 1
+5612 4798 1
+5612 4828 1
+5612 4986 1
+5612 5002 1
+5612 5022 1
+5612 5179 1
+5612 5226 1
+5612 5233 1
+5612 5254 1
+5612 5295 1
+5612 5335 1
+5612 5404 1
+5612 5524 1
+5612 5584 1
+5612 5680 1
+5612 5693 1
+5612 5697 1
+5612 5757 1
+5612 5828 1
+5612 5848 1
+5612 5863 1
+5612 6006 1
+5612 6098 1
+5612 6148 1
+5612 6170 1
+5612 6328 1
+5612 6337 1
+5612 6441 1
+5612 6528 1
+5612 6553 1
+5612 6560 1
+5612 6600 1
+5612 6715 1
+5612 6720 1
+5612 6739 1
+5612 6948 1
+5612 6979 1
+5612 7683 1
+5612 7961 1
+5612 8178 1
+5612 8295 1
+5609 2398 1
+5610 15 1
+5610 2398 1
+5611 2398 1
+5613 2398 1
+5614 2398 1
+5614 3293 1
+5614 4037 1
+5614 4335 1
+5614 4940 1
+5614 6780 1
+5614 7924 1
+5615 2398 1
+5615 4037 1
+5615 7908 1
+5616 1403 1
+5616 1473 1
+5616 2398 1
+5616 2775 1
+5616 4037 1
+5616 4338 1
+5616 4712 1
+5616 5254 1
+5616 5404 1
+5616 5732 1
+5616 5760 1
+5616 6229 1
+5616 6560 1
+5616 7108 1
+5616 7214 1
+5617 15 1
+5617 72 1
+5617 1026 1
+5617 2398 1
+5617 2565 1
+5617 3459 1
+5617 3755 1
+5617 3976 1
+5617 4781 1
+5617 5020 1
+5617 5022 1
+5617 5176 1
+5617 5233 1
+5617 5772 1
+5617 5780 1
+5617 5800 1
+5617 6044 1
+5617 6110 1
+5617 6246 1
+5617 6595 1
+5617 7553 1
+5617 7632 1
+5620 737 1
+5620 3346 1
+5620 3459 1
+5620 3755 1
+5620 5459 1
+5620 7092 1
+5620 7688 1
+5623 4335 1
+5623 4653 1
+5622 4777 1
+5622 5623 1
+5396 3089 1
+5396 3755 1
+5396 4500 1
+5396 4536 1
+5396 4625 1
+5396 4777 1
+5396 5200 1
+5396 5301 1
+5396 5623 1
+5396 5680 1
+5396 5838 1
+5396 5947 1
+5627 4777 1
+5627 5321 1
+5627 5454 1
+5624 15 1
+5624 896 1
+5624 1159 1
+5624 2440 1
+5624 2507 1
+5624 3191 1
+5624 3293 1
+5624 3586 1
+5624 3922 1
+5624 4625 1
+5624 4717 1
+5624 5321 1
+5624 5445 1
+5624 5527 1
+5624 5626 1
+5624 5713 1
+5624 5778 1
+5624 5782 1
+5624 5809 1
+5624 5848 1
+5624 5928 1
+5624 5994 1
+5624 6027 1
+5624 6044 1
+5624 6098 1
+5624 6148 1
+5624 6600 1
+5624 8295 1
+5625 5321 1
+5626 4335 1
+5626 4798 1
+5626 5072 1
+5626 5321 1
+5628 5321 1
+5629 5321 1
+5630 15 1
+5630 2516 1
+5630 3015 1
+5630 3498 1
+5630 4653 1
+5630 4712 1
+5630 4748 1
+5630 4781 1
+5630 5121 1
+5630 5178 1
+5630 5254 1
+5630 5262 1
+5630 5263 1
+5630 5543 1
+5630 5563 1
+5630 5739 1
+5630 5760 1
+5630 5824 1
+5630 6161 1
+5630 6164 1
+5630 6166 1
+5630 6221 1
+5630 6235 1
+5630 6246 1
+5630 6251 1
+5630 6255 1
+5630 6269 1
+5630 6278 1
+5630 6306 1
+5630 6441 1
+5630 6505 1
+5630 6665 1
+5630 6860 1
+5630 6901 1
+5630 6930 1
+5630 7131 1
+5633 3393 1
+5640 3976 1
+5640 5963 1
+5639 2258 1
+5639 4335 1
+5639 5454 1
+5639 5640 1
+5644 15 1
+5644 896 1
+5644 2273 1
+5644 2516 1
+5644 3976 1
+5644 4276 1
+5644 4335 1
+5644 4795 1
+5644 5233 1
+5644 5335 1
+5644 5439 1
+5644 5524 1
+5644 5543 1
+5644 5863 1
+5644 5936 1
+5644 6251 1
+5644 6255 1
+5644 6262 1
+5644 6306 1
+5644 6417 1
+5644 8295 1
+5636 4777 1
+5645 4777 1
+5646 5639 1
+5646 6953 1
+5650 1191 1
+5650 6088 1
+5648 5650 1
+5649 5650 1
+5649 5683 1
+5651 5061 1
+5652 4500 1
+5653 4500 1
+5655 938 1
+5655 2160 1
+5655 2276 1
+5655 2511 1
+5655 3084 1
+5655 3089 1
+5655 3334 1
+5655 3586 1
+5655 3643 1
+5655 3976 1
+5655 4009 1
+5655 4310 1
+5655 4361 1
+5655 4507 1
+5655 4653 1
+5655 4712 1
+5655 4717 1
+5655 4786 1
+5655 4791 1
+5655 5002 1
+5655 5012 1
+5655 5103 1
+5655 5179 1
+5655 5199 1
+5655 5200 1
+5655 5254 1
+5655 5273 1
+5655 5289 1
+5655 5295 1
+5655 5393 1
+5655 5543 1
+5655 5684 1
+5655 5697 1
+5655 5709 1
+5655 5714 1
+5655 5738 1
+5655 5806 1
+5655 5822 1
+5655 5829 1
+5655 5844 1
+5655 5863 1
+5655 5887 1
+5655 5932 1
+5655 5950 1
+5655 5972 1
+5655 6004 1
+5655 6032 1
+5655 6105 1
+5655 6124 1
+5655 6149 1
+5655 6156 1
+5655 6161 1
+5655 6198 1
+5655 6226 1
+5655 6235 1
+5655 6269 1
+5655 6299 1
+5655 6302 1
+5655 6327 1
+5655 6340 1
+5655 6407 1
+5655 6424 1
+5655 6462 1
+5655 6464 1
+5655 6491 1
+5655 6505 1
+5655 6523 1
+5655 6530 1
+5655 6555 1
+5655 6567 1
+5655 6590 1
+5655 6699 1
+5655 6725 1
+5655 6736 1
+5655 6755 1
+5655 6790 1
+5655 6809 1
+5655 6832 1
+5655 6833 1
+5655 6923 1
+5655 6976 1
+5655 6994 1
+5655 7047 1
+5655 7050 1
+5655 7063 1
+5655 7116 1
+5655 7146 1
+5655 7214 1
+5655 7222 1
+5655 7237 1
+5655 7243 1
+5655 7246 1
+5655 7254 1
+5655 7257 1
+5655 7262 1
+5655 7273 1
+5655 7279 1
+5655 7289 1
+5655 7304 1
+5655 7306 1
+5655 7315 1
+5655 7316 1
+5655 7359 1
+5655 7362 1
+5655 7373 1
+5655 7378 1
+5655 7386 1
+5655 7440 1
+5655 7498 1
+5655 7510 1
+5655 7529 1
+5655 7534 1
+5655 7544 1
+5655 7557 1
+5655 7588 1
+5655 7620 1
+5655 7632 1
+5655 7642 1
+5655 7648 1
+5655 7653 1
+5655 7666 1
+5655 7668 1
+5655 7669 1
+5655 7673 1
+5655 7675 1
+5655 7688 1
+5655 7695 1
+5655 7730 1
+5655 7734 1
+5655 7763 1
+5655 7839 1
+5655 7994 1
+5655 8079 1
+5655 8121 1
+5655 8132 1
+5655 8169 1
+5655 8224 1
+5655 8225 1
+5655 8249 1
+5656 2276 1
+5656 4653 1
+5656 5838 1
+5656 6826 1
+5656 7359 1
+5657 4653 1
+5657 5254 1
+5658 4335 1
+5658 4653 1
+5658 5233 1
+5658 5812 1
+5658 5936 1
+5658 6029 1
+5658 6334 1
+5658 6980 1
+5658 7699 1
+5658 7726 1
+5659 4653 1
+5660 4653 1
+5660 5799 1
+5661 4530 1
+5661 4653 1
+5661 5683 1
+5662 5182 1
+5662 5663 1
+5662 5886 1
+5662 5963 1
+5668 4335 1
+5668 5178 1
+5668 5404 1
+5668 5963 1
+5647 2576 1
+5647 3976 1
+5647 4335 1
+5647 5123 1
+5647 5285 1
+5647 5301 1
+5647 5683 1
+5647 5706 1
+5666 15 1
+5666 72 1
+5666 4335 1
+5666 6004 1
+5666 6560 1
+5667 4335 1
+5667 4507 1
+5667 5969 1
+5667 8124 1
+5667 8128 1
+5669 4335 1
+5670 4099 1
+5670 4335 1
+5671 3770 1
+5671 4335 1
+5671 6979 1
+5674 4986 1
+5675 72 1
+5675 1733 1
+5675 3958 1
+5675 4530 1
+5675 4574 1
+5675 4986 1
+5675 5072 1
+5675 5459 1
+5676 3755 1
+5678 5679 1
+5680 3089 1
+5680 4530 1
+5680 4795 1
+5680 5694 1
+5682 5683 1
+5684 2258 1
+5684 2276 1
+5684 3089 1
+5684 3191 1
+5684 3976 1
+5684 4175 1
+5684 4338 1
+5684 4483 1
+5684 5072 1
+5684 5176 1
+5684 5182 1
+5684 5524 1
+5684 5743 1
+5684 5798 1
+5684 5936 1
+5684 5947 1
+5684 6306 1
+5684 6328 1
+5686 3962 1
+5686 4099 1
+5686 8198 1
+5685 4099 1
+5687 4099 1
+5688 4099 1
+5689 5693 1
+5690 5693 1
+5691 15 1
+5691 72 1
+5691 1648 1
+5691 1733 1
+5691 2001 1
+5691 2490 1
+5691 2775 1
+5691 3015 1
+5691 3089 1
+5691 3191 1
+5691 3459 1
+5691 3643 1
+5691 3922 1
+5691 4211 1
+5691 4483 1
+5691 4534 1
+5691 4797 1
+5691 5020 1
+5691 5061 1
+5691 5123 1
+5691 5263 1
+5691 5301 1
+5691 5437 1
+5691 5445 1
+5691 5457 1
+5691 5482 1
+5691 5527 1
+5691 5693 1
+5691 5743 1
+5691 5753 1
+5691 5780 1
+5691 5784 1
+5691 5790 1
+5691 5828 1
+5691 5830 1
+5691 5837 1
+5691 5844 1
+5691 5848 1
+5691 5860 1
+5691 5863 1
+5691 5872 1
+5691 5886 1
+5691 5891 1
+5691 6124 1
+5691 6148 1
+5691 6151 1
+5691 6255 1
+5691 6571 1
+5691 8295 1
+5692 1549 1
+5692 3803 1
+5692 4338 1
+5692 4536 1
+5692 5288 1
+5692 5693 1
+5692 5773 1
+5692 5922 1
+5692 5998 1
+5692 6299 1
+5692 6327 1
+5692 6560 1
+5692 6624 1
+5692 6634 1
+5692 6661 1
+5692 6765 1
+5692 6784 1
+5692 6855 1
+5692 6892 1
+5692 6913 1
+5692 7143 1
+5695 72 1
+5698 72 1
+5696 15 1
+5696 72 1
+5696 1972 1
+5696 2535 1
+5696 2774 1
+5696 2914 1
+5696 3291 1
+5696 3479 1
+5696 3873 1
+5696 4099 1
+5696 4604 1
+5696 4712 1
+5696 4715 1
+5696 4781 1
+5696 4980 1
+5696 4994 1
+5696 5002 1
+5696 5121 1
+5696 5178 1
+5696 5200 1
+5696 5233 1
+5696 5254 1
+5696 5437 1
+5696 5439 1
+5696 5479 1
+5696 5487 1
+5696 5527 1
+5696 5624 1
+5696 5626 1
+5696 5804 1
+5696 5824 1
+5696 6004 1
+5696 6124 1
+5696 6161 1
+5696 6229 1
+5696 6255 1
+5696 6299 1
+5696 6306 1
+5696 6432 1
+5696 6441 1
+5696 6458 1
+5696 6496 1
+5696 6599 1
+5696 6613 1
+5696 6634 1
+5696 6665 1
+5696 6700 1
+5696 6720 1
+5696 6739 1
+5696 8295 1
+5697 72 1
+5697 1026 1
+5697 1352 1
+5697 1549 1
+5697 1648 1
+5697 1972 1
+5697 1982 1
+5697 2160 1
+5697 2273 1
+5697 2433 1
+5697 2440 1
+5697 2490 1
+5697 2507 1
+5697 2565 1
+5697 2620 1
+5697 2774 1
+5697 2785 1
+5697 3084 1
+5697 3089 1
+5697 3191 1
+5697 3334 1
+5697 3459 1
+5697 3479 1
+5697 3498 1
+5697 3586 1
+5697 3614 1
+5697 3631 1
+5697 3634 1
+5697 3792 1
+5697 3803 1
+5697 3830 1
+5697 3842 1
+5697 3873 1
+5697 3897 1
+5697 3919 1
+5697 3976 1
+5697 4037 1
+5697 4065 1
+5697 4099 1
+5697 4134 1
+5697 4175 1
+5697 4338 1
+5697 4401 1
+5697 4412 1
+5697 4483 1
+5697 4488 1
+5697 4527 1
+5697 4536 1
+5697 4574 1
+5697 4604 1
+5697 4666 1
+5697 4687 1
+5697 4689 1
+5697 4709 1
+5697 4712 1
+5697 4713 1
+5697 4717 1
+5697 4748 1
+5697 4764 1
+5697 4791 1
+5697 4795 1
+5697 4798 1
+5697 4944 1
+5697 4980 1
+5697 4994 1
+5697 5002 1
+5697 5022 1
+5697 5037 1
+5697 5072 1
+5697 5079 1
+5697 5123 1
+5697 5176 1
+5697 5178 1
+5697 5182 1
+5697 5188 1
+5697 5199 1
+5697 5200 1
+5697 5210 1
+5697 5226 1
+5697 5233 1
+5697 5254 1
+5697 5262 1
+5697 5273 1
+5697 5288 1
+5697 5295 1
+5697 5301 1
+5697 5321 1
+5697 5423 1
+5697 5439 1
+5697 5457 1
+5697 5479 1
+5697 5484 1
+5697 5524 1
+5697 5543 1
+5697 5563 1
+5697 5584 1
+5697 5596 1
+5697 5605 1
+5697 5620 1
+5697 5626 1
+5697 5638 1
+5697 5684 1
+5697 5714 1
+5697 5738 1
+5697 5739 1
+5697 5743 1
+5697 5773 1
+5697 5776 1
+5697 5798 1
+5697 5799 1
+5697 5800 1
+5697 5802 1
+5697 5804 1
+5697 5807 1
+5697 5814 1
+5697 5818 1
+5697 5819 1
+5697 5822 1
+5697 5827 1
+5697 5828 1
+5697 5829 1
+5697 5837 1
+5697 5844 1
+5697 5848 1
+5697 5860 1
+5697 5863 1
+5697 5871 1
+5697 5872 1
+5697 5886 1
+5697 5891 1
+5697 5925 1
+5697 5926 1
+5697 5928 1
+5697 5932 1
+5697 5947 1
+5697 5963 1
+5697 5969 1
+5697 5991 1
+5697 5994 1
+5697 5998 1
+5697 6001 1
+5697 6006 1
+5697 6021 1
+5697 6156 1
+5697 6170 1
+5697 6218 1
+5697 6221 1
+5697 6227 1
+5697 6246 1
+5697 6251 1
+5697 6255 1
+5697 6262 1
+5697 6270 1
+5697 6272 1
+5697 6296 1
+5697 6302 1
+5697 6305 1
+5697 6306 1
+5697 6311 1
+5697 6323 1
+5697 6327 1
+5697 6328 1
+5697 6330 1
+5697 6334 1
+5697 6337 1
+5697 6347 1
+5697 6400 1
+5697 6417 1
+5697 6432 1
+5697 6437 1
+5697 6441 1
+5697 6458 1
+5697 6474 1
+5697 6481 1
+5697 6496 1
+5697 6501 1
+5697 6505 1
+5697 6511 1
+5697 6523 1
+5697 6528 1
+5697 6532 1
+5697 6552 1
+5697 6554 1
+5697 6560 1
+5697 6570 1
+5697 6576 1
+5697 6595 1
+5697 6613 1
+5697 6624 1
+5697 6632 1
+5697 6634 1
+5697 6663 1
+5697 6665 1
+5697 6668 1
+5697 6699 1
+5697 6707 1
+5697 6715 1
+5697 6739 1
+5697 6765 1
+5697 6770 1
+5697 6774 1
+5697 6783 1
+5697 6790 1
+5697 6803 1
+5697 6855 1
+5697 6860 1
+5697 6869 1
+5697 6873 1
+5697 6897 1
+5697 6901 1
+5697 6930 1
+5697 6955 1
+5697 6979 1
+5697 6994 1
+5697 7052 1
+5697 7094 1
+5697 7101 1
+5697 7115 1
+5697 7119 1
+5697 7144 1
+5697 7185 1
+5697 7214 1
+5697 7362 1
+5697 7393 1
+5697 7553 1
+5697 7620 1
+5697 7810 1
+5697 7908 1
+5697 8121 1
+5697 8124 1
+5702 967 1
+5702 3238 1
+5702 3634 1
+5702 3726 1
+5702 5028 1
+5702 5210 1
+5702 5454 1
+5702 5897 1
+5702 5963 1
+5702 7855 1
+5703 5454 1
+5705 5301 1
+5705 5947 1
+5705 6021 1
+5704 3089 1
+5704 4828 1
+5704 5705 1
+5704 6226 1
+5708 3191 1
+5708 4483 1
+5708 5254 1
+5708 5459 1
+5708 5524 1
+5708 5697 1
+5708 8042 1
+5707 5123 1
+5707 5459 1
+5707 5891 1
+5707 5925 1
+5709 3919 1
+5709 5140 1
+5709 5459 1
+5709 5799 1
+5709 5811 1
+5709 5950 1
+5709 6427 1
+5709 6472 1
+5709 6529 1
+5709 6566 1
+5709 6707 1
+5710 5459 1
+5711 5459 1
+5712 5459 1
+5713 5459 1
+5714 15 1
+5714 896 1
+5714 1352 1
+5714 1473 1
+5714 1549 1
+5714 2576 1
+5714 2774 1
+5714 2851 1
+5714 3334 1
+5714 3586 1
+5714 3643 1
+5714 3792 1
+5714 3897 1
+5714 4041 1
+5714 4099 1
+5714 4175 1
+5714 4687 1
+5714 4715 1
+5714 4981 1
+5714 5072 1
+5714 5200 1
+5714 5226 1
+5714 5459 1
+5714 5543 1
+5714 5684 1
+5714 5743 1
+5714 5760 1
+5714 5798 1
+5714 5799 1
+5714 5804 1
+5714 5818 1
+5714 5828 1
+5714 6124 1
+5714 6156 1
+5714 6229 1
+5714 6328 1
+5714 6337 1
+5714 6437 1
+5714 6458 1
+5714 6481 1
+5714 6833 1
+5714 6930 1
+5714 7115 1
+5714 7168 1
+5717 2576 1
+5718 3274 1
+5721 840 1
+5721 3873 1
+5721 4037 1
+5721 5262 1
+5721 5776 1
+5721 6414 1
+5721 7115 1
+5721 7119 1
+5721 7143 1
+5721 7144 1
+5720 5263 1
+5720 5721 1
+5720 6783 1
+5722 5263 1
+5722 5721 1
+5722 5737 1
+5729 5732 1
+5730 5732 1
+5731 5732 1
+5731 6528 1
+5733 2001 1
+5735 5737 1
+5738 840 1
+5738 4536 1
+5738 5022 1
+5738 5263 1
+5738 5822 1
+5738 6624 1
+5738 6774 1
+5738 6875 1
+5738 7040 1
+5738 7391 1
+5738 7740 1
+5738 8163 1
+5738 8168 1
+5738 8192 1
+5739 2273 1
+5739 2440 1
+5739 2507 1
+5739 2765 1
+5739 3015 1
+5739 3459 1
+5739 3643 1
+5739 3792 1
+5739 3897 1
+5739 3919 1
+5739 3976 1
+5739 4748 1
+5739 4828 1
+5739 4875 1
+5739 5210 1
+5739 5254 1
+5739 5262 1
+5739 5263 1
+5739 5524 1
+5739 5527 1
+5739 5543 1
+5739 5563 1
+5739 5800 1
+5739 5802 1
+5739 5829 1
+5739 5848 1
+5739 5871 1
+5739 5872 1
+5739 5947 1
+5739 6023 1
+5739 6162 1
+5739 6328 1
+5739 6424 1
+5739 6435 1
+5739 6554 1
+5739 6624 1
+5739 6686 1
+5739 6765 1
+5739 6774 1
+5739 6777 1
+5739 6833 1
+5739 6869 1
+5739 6892 1
+5739 6901 1
+5739 6934 1
+5741 15 1
+5741 1982 1
+5741 5020 1
+5741 5254 1
+5741 5301 1
+5741 5321 1
+5741 5543 1
+5741 5743 1
+5741 5936 1
+5741 6618 1
+5741 7295 1
+5741 7620 1
+5741 8224 1
+4418 5745 1
+5744 5745 1
+5746 4338 1
+5750 15 1
+5750 4338 1
+5750 5415 1
+5750 5437 1
+5747 4338 1
+5747 5799 1
+5748 4338 1
+5749 4338 1
+5749 5457 1
+5751 5072 1
+5752 5072 1
+5753 4712 1
+5753 5072 1
+5753 6528 1
+5753 6554 1
+5755 5756 1
+5757 6218 1
+5760 4310 1
+5760 6299 1
+5760 6832 1
+5761 1733 1
+5761 3334 1
+5761 5226 1
+5761 5305 1
+5761 5780 1
+5761 5784 1
+5761 5800 1
+5761 6736 1
+5761 7279 1
+5763 1473 1
+5763 4041 1
+5763 5775 1
+5763 6699 1
+5764 1473 1
+5765 1473 1
+5766 5767 1
+5768 15 1
+5768 4534 1
+5768 4791 1
+5768 5178 1
+5768 5262 1
+5768 5415 1
+5768 6251 1
+5768 6576 1
+5768 6599 1
+5768 7391 1
+5768 7620 1
+5768 8178 1
+5768 8295 1
+5769 5123 1
+5769 5226 1
+5769 6299 1
+5769 6634 1
+5770 3586 1
+5770 5178 1
+5770 5226 1
+5770 5784 1
+5770 5891 1
+5770 5963 1
+5775 1191 1
+5775 2785 1
+5775 3297 1
+5775 3334 1
+5775 3459 1
+5775 3631 1
+5775 3752 1
+5775 4037 1
+5775 4071 1
+5775 4435 1
+5775 4709 1
+5775 5012 1
+5775 5079 1
+5775 5288 1
+5775 5529 1
+5775 5773 1
+5775 5800 1
+5775 5902 1
+5775 6270 1
+5775 6347 1
+5775 6458 1
+5775 6914 1
+5775 6934 1
+5775 6946 1
+5775 7115 1
+5775 7277 1
+5775 7378 1
+5775 7510 1
+5775 7632 1
+5775 7813 1
+5775 7835 1
+5775 7855 1
+5775 7862 1
+5775 7871 1
+5775 7874 1
+5775 7882 1
+5775 7890 1
+5775 7912 1
+5775 7927 1
+5775 7979 1
+5775 7992 1
+5775 8122 1
+5771 3459 1
+5771 4632 1
+5771 5760 1
+5771 5773 1
+5771 5775 1
+5771 6634 1
+5771 7054 1
+5771 8141 1
+5771 8178 1
+5772 1493 1
+5772 3459 1
+5772 4536 1
+5772 5020 1
+5772 5288 1
+5772 5775 1
+5772 5800 1
+5772 5811 1
+5772 5829 1
+5772 6001 1
+5772 6004 1
+5772 6299 1
+5772 6560 1
+5772 6890 1
+5772 7168 1
+5773 840 1
+5773 1982 1
+5773 2511 1
+5773 2565 1
+5773 2589 1
+5773 3238 1
+5773 3334 1
+5773 3459 1
+5773 3803 1
+5773 4037 1
+5773 4361 1
+5773 4944 1
+5773 4992 1
+5773 5002 1
+5773 5079 1
+5773 5288 1
+5773 5295 1
+5773 5384 1
+5773 5643 1
+5773 5745 1
+5773 5760 1
+5773 5772 1
+5773 5775 1
+5773 5800 1
+5773 5811 1
+5773 5814 1
+5773 5828 1
+5773 5922 1
+5773 5932 1
+5773 6000 1
+5773 6097 1
+5773 6227 1
+5773 6272 1
+5773 6327 1
+5773 6330 1
+5773 6388 1
+5773 6414 1
+5773 6555 1
+5773 6560 1
+5773 6624 1
+5773 6634 1
+5773 6774 1
+5773 6850 1
+5773 6855 1
+5773 6873 1
+5773 6913 1
+5773 6914 1
+5773 6934 1
+5773 6955 1
+5773 6976 1
+5773 6982 1
+5773 7021 1
+5773 7040 1
+5773 7047 1
+5773 7059 1
+5773 7092 1
+5773 7094 1
+5773 7101 1
+5773 7119 1
+5773 7120 1
+5773 7143 1
+5773 7144 1
+5773 7162 1
+5773 7185 1
+5773 7315 1
+5773 7414 1
+5773 7436 1
+5773 7593 1
+5773 7632 1
+5773 7662 1
+5773 7668 1
+5773 7839 1
+5773 7855 1
+5773 7890 1
+5773 7924 1
+5774 5775 1
+5776 4899 1
+5776 4992 1
+5776 5872 1
+5776 5998 1
+5776 6023 1
+5776 6262 1
+5776 6306 1
+5776 7149 1
+5776 7237 1
+5776 7391 1
+5776 7529 1
+5776 7553 1
+5776 7701 1
+5776 8295 1
+5781 5445 1
+5784 5925 1
+5783 15 1
+5783 2775 1
+5783 3089 1
+5783 3191 1
+5783 4041 1
+5783 4310 1
+5783 4527 1
+5783 4574 1
+5783 5061 1
+5783 5178 1
+5783 5404 1
+5783 5457 1
+5783 5543 1
+5783 5784 1
+5783 5844 1
+5783 5848 1
+5783 5863 1
+5783 5928 1
+5783 5936 1
+5783 5994 1
+5783 6124 1
+5783 6148 1
+5783 6255 1
+5785 2775 1
+5785 5061 1
+5786 2775 1
+5787 15 1
+5787 896 1
+5787 1159 1
+5787 1648 1
+5787 2276 1
+5787 2775 1
+5787 2925 1
+5787 3089 1
+5787 3498 1
+5787 4041 1
+5787 4276 1
+5787 4310 1
+5787 4781 1
+5787 4828 1
+5787 4875 1
+5787 5103 1
+5787 5179 1
+5787 5182 1
+5787 5301 1
+5787 5524 1
+5787 5527 1
+5787 5543 1
+5787 5624 1
+5787 5753 1
+5787 5928 1
+5787 5947 1
+5787 5963 1
+5787 5972 1
+5787 6098 1
+5787 6124 1
+5787 6166 1
+5787 6229 1
+5790 7699 1
+5788 5790 1
+5788 5802 1
+5788 6023 1
+5788 6447 1
+5788 6715 1
+5789 5790 1
+5794 4625 1
+5796 15 1
+5796 896 1
+5796 1026 1
+5796 1074 1
+5796 1159 1
+5796 1498 1
+5796 1549 1
+5796 1982 1
+5796 2160 1
+5796 2276 1
+5796 2440 1
+5796 2535 1
+5796 2565 1
+5796 2658 1
+5796 2774 1
+5796 2851 1
+5796 2925 1
+5796 2940 1
+5796 3015 1
+5796 3084 1
+5796 3089 1
+5796 3238 1
+5796 3291 1
+5796 3334 1
+5796 3459 1
+5796 3498 1
+5796 3586 1
+5796 3614 1
+5796 3634 1
+5796 3643 1
+5796 3792 1
+5796 3803 1
+5796 3830 1
+5796 3842 1
+5796 3897 1
+5796 4037 1
+5796 4041 1
+5796 4065 1
+5796 4099 1
+5796 4134 1
+5796 4310 1
+5796 4361 1
+5796 4483 1
+5796 4488 1
+5796 4527 1
+5796 4536 1
+5796 4604 1
+5796 4689 1
+5796 4709 1
+5796 4712 1
+5796 4715 1
+5796 4717 1
+5796 4748 1
+5796 4764 1
+5796 4795 1
+5796 4828 1
+5796 4875 1
+5796 4981 1
+5796 4983 1
+5796 4994 1
+5796 5002 1
+5796 5022 1
+5796 5028 1
+5796 5037 1
+5796 5103 1
+5796 5121 1
+5796 5140 1
+5796 5178 1
+5796 5179 1
+5796 5200 1
+5796 5210 1
+5796 5246 1
+5796 5254 1
+5796 5262 1
+5796 5273 1
+5796 5288 1
+5796 5295 1
+5796 5298 1
+5796 5321 1
+5796 5404 1
+5796 5465 1
+5796 5484 1
+5796 5524 1
+5796 5543 1
+5796 5563 1
+5796 5584 1
+5796 5596 1
+5796 5605 1
+5796 5655 1
+5796 5684 1
+5796 5714 1
+5796 5739 1
+5796 5760 1
+5796 5772 1
+5796 5800 1
+5796 5802 1
+5796 5804 1
+5796 5807 1
+5796 5814 1
+5796 5818 1
+5796 5822 1
+5796 5827 1
+5796 5829 1
+5796 5871 1
+5796 5897 1
+5796 5902 1
+5796 5928 1
+5796 5936 1
+5796 6001 1
+5796 6006 1
+5796 6032 1
+5796 6055 1
+5796 6098 1
+5796 6105 1
+5796 6110 1
+5796 6123 1
+5796 6124 1
+5796 6148 1
+5796 6156 1
+5796 6218 1
+5796 6227 1
+5796 6229 1
+5796 6270 1
+5796 6272 1
+5796 6299 1
+5796 6327 1
+5796 6347 1
+5796 6388 1
+5796 6400 1
+5796 6407 1
+5796 6414 1
+5796 6442 1
+5796 6481 1
+5796 6496 1
+5796 6498 1
+5796 6501 1
+5796 6505 1
+5796 6528 1
+5796 6552 1
+5796 6555 1
+5796 6560 1
+5796 6566 1
+5796 6567 1
+5796 6570 1
+5796 6576 1
+5796 6599 1
+5796 6600 1
+5796 6665 1
+5796 6715 1
+5796 6739 1
+5796 6770 1
+5796 6774 1
+5796 6783 1
+5796 6784 1
+5796 6832 1
+5796 6833 1
+5796 6860 1
+5796 6869 1
+5796 6875 1
+5796 6890 1
+5796 6897 1
+5796 6901 1
+5796 6913 1
+5796 6934 1
+5796 6953 1
+5796 6955 1
+5796 6976 1
+5796 6980 1
+5796 7005 1
+5796 7021 1
+5796 7063 1
+5796 7092 1
+5796 7115 1
+5796 7225 1
+5796 7279 1
+5796 7301 1
+5796 7351 1
+5796 7381 1
+5796 7414 1
+5796 7443 1
+5796 7553 1
+5796 7561 1
+5796 7567 1
+5796 7620 1
+5796 7632 1
+5796 7651 1
+5796 7757 1
+5796 7871 1
+5796 7908 1
+5796 7961 1
+5796 8121 1
+5797 3634 1
+5797 3897 1
+5797 6501 1
+5798 3346 1
+5798 3897 1
+5798 4715 1
+5798 4795 1
+5798 4798 1
+5798 5638 1
+5798 5684 1
+5798 5804 1
+5798 6261 1
+5798 6337 1
+5798 6409 1
+5798 6427 1
+5799 2914 1
+5799 3479 1
+5799 3614 1
+5799 3897 1
+5799 4715 1
+5799 4786 1
+5799 4795 1
+5799 4798 1
+5799 4980 1
+5799 5200 1
+5799 5439 1
+5799 5626 1
+5799 5638 1
+5799 6006 1
+5799 6218 1
+5799 6296 1
+5799 6327 1
+5799 6388 1
+5799 6407 1
+5799 6432 1
+5799 6435 1
+5799 6437 1
+5799 6618 1
+5800 840 1
+5800 938 1
+5800 1026 1
+5800 1191 1
+5800 1403 1
+5800 1498 1
+5800 1982 1
+5800 2565 1
+5800 2589 1
+5800 2658 1
+5800 2785 1
+5800 3000 1
+5800 3084 1
+5800 3238 1
+5800 3297 1
+5800 3310 1
+5800 3346 1
+5800 3381 1
+5800 3792 1
+5800 3830 1
+5800 3897 1
+5800 3962 1
+5800 4037 1
+5800 4065 1
+5800 4134 1
+5800 4218 1
+5800 4310 1
+5800 4666 1
+5800 4712 1
+5800 4764 1
+5800 4791 1
+5800 4884 1
+5800 4934 1
+5800 4940 1
+5800 4944 1
+5800 4983 1
+5800 5002 1
+5800 5012 1
+5800 5022 1
+5800 5096 1
+5800 5179 1
+5800 5199 1
+5800 5210 1
+5800 5233 1
+5800 5421 1
+5800 5432 1
+5800 5465 1
+5800 5466 1
+5800 5524 1
+5800 5529 1
+5800 5582 1
+5800 5596 1
+5800 5655 1
+5800 5671 1
+5800 5697 1
+5800 5739 1
+5800 5760 1
+5800 5802 1
+5800 5806 1
+5800 5807 1
+5800 5812 1
+5800 5814 1
+5800 5818 1
+5800 5819 1
+5800 5822 1
+5800 5824 1
+5800 5827 1
+5800 5835 1
+5800 5839 1
+5800 5871 1
+5800 5897 1
+5800 5932 1
+5800 5933 1
+5800 5998 1
+5800 6000 1
+5800 6001 1
+5800 6032 1
+5800 6043 1
+5800 6097 1
+5800 6123 1
+5800 6156 1
+5800 6174 1
+5800 6221 1
+5800 6227 1
+5800 6243 1
+5800 6270 1
+5800 6272 1
+5800 6299 1
+5800 6305 1
+5800 6307 1
+5800 6327 1
+5800 6330 1
+5800 6347 1
+5800 6388 1
+5800 6414 1
+5800 6417 1
+5800 6424 1
+5800 6441 1
+5800 6442 1
+5800 6447 1
+5800 6523 1
+5800 6555 1
+5800 6560 1
+5800 6595 1
+5800 6618 1
+5800 6624 1
+5800 6628 1
+5800 6632 1
+5800 6634 1
+5800 6665 1
+5800 6712 1
+5800 6715 1
+5800 6725 1
+5800 6736 1
+5800 6737 1
+5800 6769 1
+5800 6774 1
+5800 6780 1
+5800 6783 1
+5800 6784 1
+5800 6789 1
+5800 6790 1
+5800 6806 1
+5800 6832 1
+5800 6860 1
+5800 6869 1
+5800 6873 1
+5800 6890 1
+5800 6892 1
+5800 6907 1
+5800 6913 1
+5800 6914 1
+5800 6918 1
+5800 6924 1
+5800 6934 1
+5800 6938 1
+5800 6946 1
+5800 6950 1
+5800 6953 1
+5800 6967 1
+5800 6976 1
+5800 6979 1
+5800 6980 1
+5800 6982 1
+5800 6993 1
+5800 6994 1
+5800 7040 1
+5800 7047 1
+5800 7050 1
+5800 7052 1
+5800 7060 1
+5800 7063 1
+5800 7073 1
+5800 7092 1
+5800 7101 1
+5800 7110 1
+5800 7116 1
+5800 7119 1
+5800 7120 1
+5800 7144 1
+5800 7162 1
+5800 7185 1
+5800 7201 1
+5800 7214 1
+5800 7238 1
+5800 7262 1
+5800 7277 1
+5800 7280 1
+5800 7295 1
+5800 7341 1
+5800 7351 1
+5800 7373 1
+5800 7389 1
+5800 7400 1
+5800 7422 1
+5800 7443 1
+5800 7491 1
+5800 7493 1
+5800 7520 1
+5800 7529 1
+5800 7544 1
+5800 7553 1
+5800 7561 1
+5800 7574 1
+5800 7583 1
+5800 7587 1
+5800 7588 1
+5800 7620 1
+5800 7646 1
+5800 7651 1
+5800 7694 1
+5800 7699 1
+5800 7726 1
+5800 7763 1
+5800 7795 1
+5800 7809 1
+5800 7810 1
+5800 7833 1
+5800 7874 1
+5800 7882 1
+5800 7924 1
+5800 7979 1
+5800 7992 1
+5800 7996 1
+5800 8002 1
+5800 8024 1
+5800 8042 1
+5800 8083 1
+5800 8090 1
+5800 8121 1
+5800 8122 1
+5800 8124 1
+5800 8134 1
+5800 8163 1
+5800 8168 1
+5800 8178 1
+5800 8192 1
+5800 8219 1
+5800 8246 1
+5800 8249 1
+5800 8271 1
+5800 8297 1
+5801 3897 1
+5801 5817 1
+5802 155 1
+5802 840 1
+5802 938 1
+5802 967 1
+5802 1026 1
+5802 1352 1
+5802 1403 1
+5802 1498 1
+5802 1823 1
+5802 1972 1
+5802 1982 1
+5802 2433 1
+5802 2440 1
+5802 2511 1
+5802 2565 1
+5802 2589 1
+5802 2620 1
+5802 2658 1
+5802 2785 1
+5802 2851 1
+5802 2914 1
+5802 2940 1
+5802 3291 1
+5802 3293 1
+5802 3297 1
+5802 3310 1
+5802 3334 1
+5802 3346 1
+5802 3381 1
+5802 3459 1
+5802 3614 1
+5802 3631 1
+5802 3634 1
+5802 3726 1
+5802 3752 1
+5802 3803 1
+5802 3830 1
+5802 3842 1
+5802 3885 1
+5802 3897 1
+5802 3919 1
+5802 3962 1
+5802 3969 1
+5802 4037 1
+5802 4065 1
+5802 4071 1
+5802 4099 1
+5802 4341 1
+5802 4361 1
+5802 4401 1
+5802 4435 1
+5802 4483 1
+5802 4488 1
+5802 4507 1
+5802 4536 1
+5802 4604 1
+5802 4632 1
+5802 4666 1
+5802 4689 1
+5802 4709 1
+5802 4712 1
+5802 4713 1
+5802 4717 1
+5802 4748 1
+5802 4764 1
+5802 4786 1
+5802 4791 1
+5802 4795 1
+5802 4798 1
+5802 4875 1
+5802 4879 1
+5802 4884 1
+5802 4944 1
+5802 4966 1
+5802 4980 1
+5802 4981 1
+5802 4983 1
+5802 4992 1
+5802 4994 1
+5802 5002 1
+5802 5012 1
+5802 5022 1
+5802 5028 1
+5802 5037 1
+5802 5079 1
+5802 5096 1
+5802 5140 1
+5802 5148 1
+5802 5179 1
+5802 5188 1
+5802 5199 1
+5802 5200 1
+5802 5210 1
+5802 5233 1
+5802 5254 1
+5802 5273 1
+5802 5288 1
+5802 5289 1
+5802 5384 1
+5802 5393 1
+5802 5404 1
+5802 5406 1
+5802 5432 1
+5802 5465 1
+5802 5466 1
+5802 5479 1
+5802 5484 1
+5802 5500 1
+5802 5524 1
+5802 5543 1
+5802 5582 1
+5802 5584 1
+5802 5596 1
+5802 5605 1
+5802 5614 1
+5802 5638 1
+5802 5671 1
+5802 5697 1
+5802 5714 1
+5802 5738 1
+5802 5739 1
+5802 5760 1
+5802 5773 1
+5802 5776 1
+5802 5798 1
+5802 5799 1
+5802 5800 1
+5802 5804 1
+5802 5806 1
+5802 5807 1
+5802 5811 1
+5802 5814 1
+5802 5819 1
+5802 5822 1
+5802 5824 1
+5802 5827 1
+5802 5829 1
+5802 5835 1
+5802 5839 1
+5802 5871 1
+5802 5872 1
+5802 5887 1
+5802 5897 1
+5802 5902 1
+5802 5932 1
+5802 5980 1
+5802 5998 1
+5802 6000 1
+5802 6004 1
+5802 6006 1
+5802 6032 1
+5802 6043 1
+5802 6047 1
+5802 6123 1
+5802 6151 1
+5802 6156 1
+5802 6170 1
+5802 6174 1
+5802 6198 1
+5802 6218 1
+5802 6227 1
+5802 6243 1
+5802 6270 1
+5802 6272 1
+5802 6299 1
+5802 6306 1
+5802 6320 1
+5802 6323 1
+5802 6327 1
+5802 6330 1
+5802 6334 1
+5802 6360 1
+5802 6388 1
+5802 6400 1
+5802 6407 1
+5802 6409 1
+5802 6414 1
+5802 6417 1
+5802 6424 1
+5802 6435 1
+5802 6437 1
+5802 6441 1
+5802 6442 1
+5802 6447 1
+5802 6458 1
+5802 6462 1
+5802 6464 1
+5802 6472 1
+5802 6474 1
+5802 6481 1
+5802 6491 1
+5802 6496 1
+5802 6501 1
+5802 6503 1
+5802 6505 1
+5802 6511 1
+5802 6523 1
+5802 6528 1
+5802 6530 1
+5802 6553 1
+5802 6554 1
+5802 6555 1
+5802 6560 1
+5802 6570 1
+5802 6576 1
+5802 6589 1
+5802 6590 1
+5802 6592 1
+5802 6594 1
+5802 6600 1
+5802 6606 1
+5802 6613 1
+5802 6618 1
+5802 6624 1
+5802 6628 1
+5802 6632 1
+5802 6634 1
+5802 6663 1
+5802 6665 1
+5802 6686 1
+5802 6699 1
+5802 6712 1
+5802 6714 1
+5802 6715 1
+5802 6725 1
+5802 6736 1
+5802 6739 1
+5802 6765 1
+5802 6770 1
+5802 6774 1
+5802 6777 1
+5802 6780 1
+5802 6784 1
+5802 6789 1
+5802 6803 1
+5802 6806 1
+5802 6809 1
+5802 6832 1
+5802 6850 1
+5802 6860 1
+5802 6869 1
+5802 6873 1
+5802 6875 1
+5802 6901 1
+5802 6907 1
+5802 6913 1
+5802 6914 1
+5802 6934 1
+5802 6938 1
+5802 6942 1
+5802 6945 1
+5802 6946 1
+5802 6948 1
+5802 6953 1
+5802 6955 1
+5802 6967 1
+5802 6976 1
+5802 6979 1
+5802 6980 1
+5802 6993 1
+5802 6994 1
+5802 7005 1
+5802 7012 1
+5802 7021 1
+5802 7040 1
+5802 7052 1
+5802 7059 1
+5802 7060 1
+5802 7063 1
+5802 7073 1
+5802 7088 1
+5802 7092 1
+5802 7094 1
+5802 7101 1
+5802 7108 1
+5802 7110 1
+5802 7115 1
+5802 7116 1
+5802 7119 1
+5802 7131 1
+5802 7143 1
+5802 7144 1
+5802 7168 1
+5802 7186 1
+5802 7214 1
+5802 7225 1
+5802 7233 1
+5802 7237 1
+5802 7246 1
+5802 7277 1
+5802 7279 1
+5802 7280 1
+5802 7295 1
+5802 7301 1
+5802 7304 1
+5802 7351 1
+5802 7362 1
+5802 7373 1
+5802 7378 1
+5802 7381 1
+5802 7391 1
+5802 7397 1
+5802 7400 1
+5802 7414 1
+5802 7422 1
+5802 7436 1
+5802 7442 1
+5802 7443 1
+5802 7449 1
+5802 7450 1
+5802 7478 1
+5802 7491 1
+5802 7497 1
+5802 7510 1
+5802 7512 1
+5802 7529 1
+5802 7544 1
+5802 7553 1
+5802 7557 1
+5802 7561 1
+5802 7587 1
+5802 7593 1
+5802 7618 1
+5802 7620 1
+5802 7624 1
+5802 7632 1
+5802 7646 1
+5802 7647 1
+5802 7649 1
+5802 7651 1
+5802 7652 1
+5802 7662 1
+5802 7666 1
+5802 7673 1
+5802 7694 1
+5802 7707 1
+5802 7726 1
+5802 7757 1
+5802 7763 1
+5802 7778 1
+5802 7788 1
+5802 7795 1
+5802 7809 1
+5802 7813 1
+5802 7819 1
+5802 7839 1
+5802 7855 1
+5802 7860 1
+5802 7862 1
+5802 7879 1
+5802 7882 1
+5802 7890 1
+5802 7908 1
+5802 7910 1
+5802 7924 1
+5802 7927 1
+5802 7946 1
+5802 7961 1
+5802 7965 1
+5802 7979 1
+5802 7992 1
+5802 7994 1
+5802 8002 1
+5802 8037 1
+5802 8042 1
+5802 8044 1
+5802 8051 1
+5802 8083 1
+5802 8090 1
+5802 8122 1
+5802 8124 1
+5802 8128 1
+5802 8132 1
+5802 8148 1
+5802 8163 1
+5802 8168 1
+5802 8174 1
+5802 8178 1
+5802 8192 1
+5802 8198 1
+5802 8209 1
+5802 8212 1
+5802 8219 1
+5802 8225 1
+5802 8297 1
+5803 3634 1
+5803 3897 1
+5806 1026 1
+5806 2565 1
+5806 3873 1
+5806 3885 1
+5806 3897 1
+5806 4037 1
+5806 4361 1
+5806 4795 1
+5806 4966 1
+5806 5022 1
+5806 5210 1
+5806 5233 1
+5806 5289 1
+5806 5335 1
+5806 5393 1
+5806 5406 1
+5806 5421 1
+5806 5800 1
+5806 5811 1
+5806 5872 1
+5806 5902 1
+5806 6006 1
+5806 6243 1
+5806 6296 1
+5806 6299 1
+5806 6302 1
+5806 6306 1
+5806 6327 1
+5806 6424 1
+5806 6441 1
+5806 6665 1
+5806 6686 1
+5806 6724 1
+5806 6737 1
+5806 6739 1
+5806 6756 1
+5806 6772 1
+5806 6777 1
+5806 6789 1
+5806 6907 1
+5806 6923 1
+5806 6980 1
+5806 7092 1
+5806 7225 1
+5806 7279 1
+5806 7295 1
+5806 7315 1
+5806 7319 1
+5806 7341 1
+5806 7373 1
+5806 7381 1
+5806 7400 1
+5806 7414 1
+5806 7422 1
+5806 7439 1
+5806 7497 1
+5806 7498 1
+5806 7510 1
+5806 7520 1
+5806 7529 1
+5806 7533 1
+5806 7553 1
+5806 7574 1
+5806 7583 1
+5806 7587 1
+5806 7620 1
+5806 7653 1
+5806 7688 1
+5806 7691 1
+5806 7730 1
+5806 7734 1
+5806 7735 1
+5806 7788 1
+5806 7809 1
+5806 7857 1
+5806 7882 1
+5806 7913 1
+5806 8002 1
+5806 8073 1
+5806 8128 1
+5806 8224 1
+5806 8275 1
+5806 8295 1
+5804 2276 1
+5804 3000 1
+5804 3897 1
+5804 4483 1
+5804 4574 1
+5804 4712 1
+5804 4715 1
+5804 4828 1
+5804 5457 1
+5804 5524 1
+5804 5563 1
+5804 5801 1
+5804 5871 1
+5804 5928 1
+5804 5956 1
+5804 5973 1
+5804 6006 1
+5804 6458 1
+5804 6600 1
+5804 6634 1
+5804 6661 1
+5804 6765 1
+5804 6784 1
+5804 6914 1
+5804 7021 1
+5804 7115 1
+5804 7116 1
+5804 7204 1
+5804 7243 1
+5804 7386 1
+5804 7648 1
+5804 7862 1
+5804 7874 1
+5805 15 1
+5805 1972 1
+5805 3897 1
+5805 5423 1
+5805 5479 1
+5805 5487 1
+5805 5527 1
+5805 5738 1
+5805 5799 1
+5805 5980 1
+5805 6023 1
+5805 6148 1
+5805 6251 1
+5805 6424 1
+5805 6462 1
+5805 6501 1
+5807 15 1
+5807 840 1
+5807 2940 1
+5807 3334 1
+5807 3803 1
+5807 3897 1
+5807 4934 1
+5807 5384 1
+5807 5584 1
+5807 5776 1
+5807 5922 1
+5807 6001 1
+5807 6004 1
+5807 6327 1
+5807 6417 1
+5807 6552 1
+5807 6765 1
+5807 6805 1
+5807 6897 1
+5807 7094 1
+5807 7101 1
+5807 7115 1
+5807 7116 1
+5807 7434 1
+5807 7440 1
+5807 7498 1
+5807 7534 1
+5808 3479 1
+5808 3897 1
+5808 4687 1
+5808 5200 1
+5808 5684 1
+5808 5804 1
+5809 2276 1
+5809 3191 1
+5809 3897 1
+5809 4875 1
+5809 5543 1
+5809 5697 1
+5809 5753 1
+5809 5814 1
+5809 5936 1
+5809 5977 1
+5809 5980 1
+5809 5994 1
+5809 6094 1
+5809 6105 1
+5809 6110 1
+5809 6124 1
+5809 6148 1
+5809 6218 1
+5809 6296 1
+5809 6306 1
+5809 6328 1
+5810 15 1
+5810 2440 1
+5810 2535 1
+5810 3084 1
+5810 3291 1
+5810 3873 1
+5810 3897 1
+5810 4037 1
+5810 4604 1
+5810 4712 1
+5810 4791 1
+5810 5022 1
+5810 5037 1
+5810 5233 1
+5810 5254 1
+5810 6006 1
+5810 6156 1
+5810 6311 1
+5810 6328 1
+5810 6337 1
+5810 6442 1
+5810 6600 1
+5810 6715 1
+5810 6869 1
+5810 6907 1
+5810 7054 1
+5810 7237 1
+5810 7620 1
+5810 7809 1
+5811 840 1
+5811 1403 1
+5811 1982 1
+5811 2785 1
+5811 3334 1
+5811 3726 1
+5811 3830 1
+5811 3897 1
+5811 4361 1
+5811 4412 1
+5811 4488 1
+5811 4536 1
+5811 4713 1
+5811 4748 1
+5811 4791 1
+5811 5012 1
+5811 5140 1
+5811 5210 1
+5811 5295 1
+5811 5563 1
+5811 5582 1
+5811 5739 1
+5811 5760 1
+5811 5800 1
+5811 5801 1
+5811 5818 1
+5811 5902 1
+5811 5950 1
+5811 6001 1
+5811 6123 1
+5811 6198 1
+5811 6299 1
+5811 6305 1
+5811 6330 1
+5811 6388 1
+5811 6414 1
+5811 6432 1
+5811 6441 1
+5811 6472 1
+5811 6491 1
+5811 6498 1
+5811 6511 1
+5811 6523 1
+5811 6530 1
+5811 6554 1
+5811 6560 1
+5811 6566 1
+5811 6613 1
+5811 6624 1
+5811 6634 1
+5811 6725 1
+5811 6736 1
+5811 6765 1
+5811 6832 1
+5811 6833 1
+5811 6850 1
+5811 6855 1
+5811 6860 1
+5811 6869 1
+5811 6901 1
+5811 6930 1
+5811 6934 1
+5811 6945 1
+5811 6950 1
+5811 6953 1
+5811 6979 1
+5811 6994 1
+5811 7108 1
+5811 7149 1
+5811 7254 1
+5811 7295 1
+5811 7304 1
+5811 7351 1
+5811 7381 1
+5811 7407 1
+5811 7414 1
+5811 7423 1
+5811 7434 1
+5811 8295 1
+5812 2535 1
+5812 3291 1
+5812 3459 1
+5812 3479 1
+5812 3614 1
+5812 3634 1
+5812 3897 1
+5812 4099 1
+5812 4687 1
+5812 4980 1
+5812 5022 1
+5812 5200 1
+5812 5295 1
+5812 5415 1
+5812 5423 1
+5812 5545 1
+5812 5626 1
+5812 5697 1
+5812 5760 1
+5812 5800 1
+5812 5814 1
+5812 5818 1
+5812 6001 1
+5812 6023 1
+5812 6161 1
+5812 6218 1
+5812 6246 1
+5812 6251 1
+5812 6262 1
+5812 6296 1
+5812 6328 1
+5812 6330 1
+5812 6458 1
+5812 6498 1
+5812 6560 1
+5812 6618 1
+5812 6784 1
+5812 6855 1
+5812 6901 1
+5812 6979 1
+5812 8295 1
+5813 3897 1
+5813 6417 1
+5814 1403 1
+5814 1549 1
+5814 2160 1
+5814 2276 1
+5814 2535 1
+5814 2851 1
+5814 2940 1
+5814 3084 1
+5814 3089 1
+5814 3238 1
+5814 3293 1
+5814 3459 1
+5814 3770 1
+5814 3830 1
+5814 3897 1
+5814 3919 1
+5814 3962 1
+5814 4037 1
+5814 4310 1
+5814 4401 1
+5814 4432 1
+5814 4536 1
+5814 4709 1
+5814 4712 1
+5814 4791 1
+5814 4940 1
+5814 5002 1
+5814 5020 1
+5814 5028 1
+5814 5037 1
+5814 5064 1
+5814 5079 1
+5814 5096 1
+5814 5188 1
+5814 5200 1
+5814 5210 1
+5814 5254 1
+5814 5262 1
+5814 5288 1
+5814 5432 1
+5814 5524 1
+5814 5543 1
+5814 5605 1
+5814 5714 1
+5814 5738 1
+5814 5739 1
+5814 5760 1
+5814 5800 1
+5814 5802 1
+5814 5806 1
+5814 5811 1
+5814 5812 1
+5814 5818 1
+5814 5827 1
+5814 5835 1
+5814 5863 1
+5814 5871 1
+5814 5887 1
+5814 5891 1
+5814 5897 1
+5814 5902 1
+5814 5932 1
+5814 5950 1
+5814 5973 1
+5814 5998 1
+5814 6004 1
+5814 6032 1
+5814 6105 1
+5814 6123 1
+5814 6156 1
+5814 6221 1
+5814 6299 1
+5814 6327 1
+5814 6340 1
+5814 6409 1
+5814 6417 1
+5814 6422 1
+5814 6437 1
+5814 6498 1
+5814 6560 1
+5814 6618 1
+5814 6634 1
+5814 6665 1
+5814 6699 1
+5814 6714 1
+5814 6715 1
+5814 6759 1
+5814 6774 1
+5814 6780 1
+5814 6784 1
+5814 6790 1
+5814 6806 1
+5814 6832 1
+5814 6855 1
+5814 6869 1
+5814 6913 1
+5814 6914 1
+5814 6917 1
+5814 6924 1
+5814 6946 1
+5814 6967 1
+5814 6979 1
+5814 6980 1
+5814 6982 1
+5814 6987 1
+5814 7012 1
+5814 7021 1
+5814 7063 1
+5814 7092 1
+5814 7110 1
+5814 7116 1
+5814 7225 1
+5814 7233 1
+5814 7237 1
+5814 7280 1
+5814 7414 1
+5814 7434 1
+5814 7508 1
+5814 7544 1
+5814 7553 1
+5814 7587 1
+5814 7593 1
+5814 7618 1
+5814 7620 1
+5814 7632 1
+5814 7651 1
+5814 7699 1
+5814 7757 1
+5814 7795 1
+5814 7809 1
+5814 7833 1
+5814 7835 1
+5814 7857 1
+5814 7860 1
+5814 7874 1
+5814 7928 1
+5814 7961 1
+5814 8002 1
+5814 8058 1
+5814 8134 1
+5814 8192 1
+5814 8246 1
+5814 8295 1
+5814 8297 1
+5815 3897 1
+5815 5798 1
+5815 6871 1
+5815 7510 1
+5815 8002 1
+5816 1026 1
+5816 1549 1
+5816 1972 1
+5816 1982 1
+5816 2160 1
+5816 2273 1
+5816 2285 1
+5816 2440 1
+5816 2535 1
+5816 2565 1
+5816 2774 1
+5816 2851 1
+5816 3291 1
+5816 3334 1
+5816 3459 1
+5816 3479 1
+5816 3634 1
+5816 3726 1
+5816 3792 1
+5816 3842 1
+5816 3897 1
+5816 4037 1
+5816 4099 1
+5816 4361 1
+5816 4536 1
+5816 4604 1
+5816 4666 1
+5816 4687 1
+5816 4689 1
+5816 4715 1
+5816 4944 1
+5816 5012 1
+5816 5079 1
+5816 5233 1
+5816 5254 1
+5816 5273 1
+5816 5295 1
+5816 5321 1
+5816 5423 1
+5816 5584 1
+5816 5697 1
+5816 5798 1
+5816 5902 1
+5816 6000 1
+5816 6004 1
+5816 6006 1
+5816 6221 1
+5816 6246 1
+5816 6306 1
+5816 6330 1
+5816 6432 1
+5816 6441 1
+5816 6498 1
+5816 6505 1
+5816 6528 1
+5816 6553 1
+5816 6554 1
+5816 6566 1
+5816 6570 1
+5816 6576 1
+5816 6599 1
+5816 6600 1
+5816 6624 1
+5816 6634 1
+5816 6700 1
+5816 6736 1
+5816 6803 1
+5816 6832 1
+5816 6855 1
+5816 6948 1
+5816 6955 1
+5816 7094 1
+5816 7115 1
+5816 7168 1
+5816 7279 1
+5816 7422 1
+5816 7478 1
+5816 7510 1
+5816 7553 1
+5816 7632 1
+5816 7683 1
+5816 7809 1
+5816 8295 1
+5816 8297 1
+5817 1026 1
+5817 1074 1
+5817 1549 1
+5817 1982 1
+5817 2160 1
+5817 2433 1
+5817 2511 1
+5817 2535 1
+5817 3291 1
+5817 3459 1
+5817 3631 1
+5817 3897 1
+5817 3976 1
+5817 4134 1
+5817 4361 1
+5817 4483 1
+5817 4632 1
+5817 4687 1
+5817 4791 1
+5817 4795 1
+5817 4798 1
+5817 4828 1
+5817 4980 1
+5817 5002 1
+5817 5020 1
+5817 5176 1
+5817 5254 1
+5817 5288 1
+5817 5321 1
+5817 5404 1
+5817 5421 1
+5817 5484 1
+5817 5524 1
+5817 5697 1
+5817 5709 1
+5817 5800 1
+5817 5811 1
+5817 5814 1
+5817 5886 1
+5817 5922 1
+5817 5950 1
+5817 5963 1
+5817 5973 1
+5817 6255 1
+5817 6299 1
+5817 6305 1
+5817 6327 1
+5817 6330 1
+5817 6337 1
+5817 6414 1
+5817 6481 1
+5817 6503 1
+5817 6523 1
+5817 6596 1
+5817 6606 1
+5817 6720 1
+5817 6765 1
+5817 6832 1
+5817 6855 1
+5817 6953 1
+5817 6955 1
+5817 6976 1
+5817 6979 1
+5817 6980 1
+5817 7023 1
+5817 7143 1
+5817 7168 1
+5817 7185 1
+5817 7186 1
+5817 7295 1
+5817 7301 1
+5817 7351 1
+5817 7373 1
+5817 7553 1
+5817 8297 1
+5818 15 1
+5818 2285 1
+5818 3015 1
+5818 3459 1
+5818 3479 1
+5818 3498 1
+5818 3614 1
+5818 3792 1
+5818 3873 1
+5818 3897 1
+5818 4099 1
+5818 4401 1
+5818 4432 1
+5818 4483 1
+5818 4488 1
+5818 4536 1
+5818 4689 1
+5818 4713 1
+5818 4764 1
+5818 4798 1
+5818 5178 1
+5818 5233 1
+5818 5262 1
+5818 5263 1
+5818 5273 1
+5818 5295 1
+5818 5321 1
+5818 5335 1
+5818 5415 1
+5818 5423 1
+5818 5487 1
+5818 5543 1
+5818 5624 1
+5818 5626 1
+5818 5760 1
+5818 5798 1
+5818 5804 1
+5818 5814 1
+5818 5829 1
+5818 5871 1
+5818 6004 1
+5818 6023 1
+5818 6166 1
+5818 6246 1
+5818 6251 1
+5818 6255 1
+5818 6262 1
+5818 6296 1
+5818 6306 1
+5818 6327 1
+5818 6337 1
+5818 6347 1
+5818 6388 1
+5818 6400 1
+5818 6441 1
+5818 6458 1
+5818 6576 1
+5818 6599 1
+5818 6613 1
+5818 6833 1
+5818 6850 1
+5818 6869 1
+5818 6873 1
+5818 6875 1
+5818 7791 1
+5818 8249 1
+5818 8295 1
+5819 15 1
+5819 896 1
+5819 1074 1
+5819 1493 1
+5819 1648 1
+5819 1823 1
+5819 1982 1
+5819 2276 1
+5819 2440 1
+5819 2507 1
+5819 3089 1
+5819 3498 1
+5819 3586 1
+5819 3634 1
+5819 3643 1
+5819 3830 1
+5819 3842 1
+5819 3897 1
+5819 3922 1
+5819 4041 1
+5819 4175 1
+5819 4310 1
+5819 4527 1
+5819 4689 1
+5819 4940 1
+5819 4994 1
+5819 5037 1
+5819 5140 1
+5819 5178 1
+5819 5254 1
+5819 5273 1
+5819 5301 1
+5819 5378 1
+5819 5404 1
+5819 5457 1
+5819 5482 1
+5819 5545 1
+5819 5753 1
+5819 5828 1
+5819 5832 1
+5819 5880 1
+5819 5886 1
+5819 6004 1
+5819 6098 1
+5819 6110 1
+5819 6432 1
+5819 6441 1
+5819 6505 1
+5819 6511 1
+5819 6589 1
+5819 6632 1
+5819 6780 1
+5819 6980 1
+5819 7238 1
+5819 7400 1
+5819 7553 1
+5819 7620 1
+5819 7833 1
+5819 7908 1
+5819 8037 1
+5819 8121 1
+5820 3381 1
+5820 3897 1
+5820 4981 1
+5820 4983 1
+5820 5839 1
+5820 6241 1
+5820 6414 1
+5820 6523 1
+5820 6596 1
+5820 6712 1
+5820 7280 1
+5820 7393 1
+5820 7449 1
+5820 7707 1
+5820 7757 1
+5820 7763 1
+5820 7788 1
+5820 7809 1
+5820 7839 1
+5820 7921 1
+5821 155 1
+5821 1352 1
+5821 2160 1
+5821 2285 1
+5821 2440 1
+5821 2565 1
+5821 2851 1
+5821 3897 1
+5821 4065 1
+5821 4361 1
+5821 4709 1
+5821 4712 1
+5821 4748 1
+5821 5254 1
+5821 5872 1
+5821 5902 1
+5821 6006 1
+5821 6458 1
+5821 6505 1
+5821 6590 1
+5821 6594 1
+5821 7478 1
+5822 1972 1
+5822 2160 1
+5822 2285 1
+5822 2440 1
+5822 2940 1
+5822 3291 1
+5822 3334 1
+5822 3346 1
+5822 3459 1
+5822 3634 1
+5822 3873 1
+5822 3897 1
+5822 3919 1
+5822 3962 1
+5822 4341 1
+5822 4361 1
+5822 4786 1
+5822 4791 1
+5822 4994 1
+5822 5002 1
+5822 5079 1
+5822 5178 1
+5822 5188 1
+5822 5199 1
+5822 5210 1
+5822 5254 1
+5822 5289 1
+5822 5421 1
+5822 5432 1
+5822 5466 1
+5822 5524 1
+5822 5563 1
+5822 5596 1
+5822 5799 1
+5822 5800 1
+5822 5819 1
+5822 5829 1
+5822 5839 1
+5822 5872 1
+5822 5902 1
+5822 5980 1
+5822 5998 1
+5822 6006 1
+5822 6043 1
+5822 6044 1
+5822 6097 1
+5822 6174 1
+5822 6251 1
+5822 6299 1
+5822 6347 1
+5822 6424 1
+5822 6432 1
+5822 6435 1
+5822 6437 1
+5822 6503 1
+5822 6505 1
+5822 6552 1
+5822 6613 1
+5822 6632 1
+5822 6634 1
+5822 6663 1
+5822 6774 1
+5822 6789 1
+5822 6832 1
+5822 6855 1
+5822 6869 1
+5822 6913 1
+5822 6923 1
+5822 6934 1
+5822 7063 1
+5822 7168 1
+5822 7225 1
+5822 7237 1
+5822 7238 1
+5822 7295 1
+5822 7301 1
+5822 7315 1
+5822 7351 1
+5822 7381 1
+5822 7386 1
+5822 7414 1
+5822 7422 1
+5822 7510 1
+5822 7632 1
+5822 7646 1
+5822 7649 1
+5822 7651 1
+5822 7662 1
+5822 7683 1
+5822 7690 1
+5822 7699 1
+5822 7809 1
+5822 7813 1
+5822 7833 1
+5822 7835 1
+5822 7912 1
+5822 8275 1
+5822 8295 1
+5823 2774 1
+5823 3897 1
+5823 4412 1
+5823 4875 1
+5823 4983 1
+5823 5254 1
+5823 5798 1
+5823 6417 1
+5823 6432 1
+5823 6437 1
+5823 6441 1
+5823 7478 1
+5824 1648 1
+5824 1982 1
+5824 2565 1
+5824 3792 1
+5824 4037 1
+5824 4536 1
+5824 5182 1
+5824 5295 1
+5824 5543 1
+5824 5563 1
+5824 5739 1
+5824 5773 1
+5824 5800 1
+5824 5814 1
+5824 5818 1
+5824 5828 1
+5824 5830 1
+5824 5848 1
+5824 5925 1
+5824 5926 1
+5824 5928 1
+5824 5963 1
+5824 6001 1
+5824 6004 1
+5824 6246 1
+5824 6299 1
+5824 6323 1
+5824 6491 1
+5824 6555 1
+5824 6560 1
+5824 6624 1
+5824 6665 1
+5824 6715 1
+5824 6790 1
+5824 6855 1
+5824 6892 1
+5824 6901 1
+5824 6930 1
+5824 6946 1
+5824 6994 1
+5824 7052 1
+5827 4175 1
+5827 5037 1
+5827 5123 1
+5827 5254 1
+5827 5404 1
+5827 5563 1
+5827 5605 1
+5827 5680 1
+5827 5828 1
+5827 6123 1
+5827 6327 1
+5827 6913 1
+5827 7143 1
+5827 7277 1
+5827 7662 1
+5829 5123 1
+5829 5262 1
+5829 5301 1
+5829 5415 1
+5829 5527 1
+5829 5545 1
+5829 5680 1
+5829 5830 1
+5829 5891 1
+5829 6148 1
+5829 6246 1
+5829 8295 1
+5837 5963 1
+5833 5837 1
+5834 3191 1
+5834 3643 1
+5834 5753 1
+5834 5837 1
+5834 6029 1
+5834 6094 1
+5839 1352 1
+5839 3459 1
+5839 4795 1
+5839 4828 1
+5839 5188 1
+5839 5210 1
+5839 5254 1
+5839 5262 1
+5839 5301 1
+5839 5439 1
+5839 5457 1
+5839 5524 1
+5839 5827 1
+5839 5829 1
+5839 5838 1
+5839 5871 1
+5839 5950 1
+5839 5963 1
+5839 5980 1
+5839 6123 1
+5839 6161 1
+5839 6417 1
+5839 6424 1
+5839 6432 1
+5839 6442 1
+5839 6458 1
+5839 6501 1
+5839 6505 1
+5839 6523 1
+5839 6600 1
+5839 6618 1
+5839 6634 1
+5839 6663 1
+5839 6712 1
+5839 6934 1
+5839 7092 1
+5839 7620 1
+5839 7632 1
+5839 7649 1
+5839 7653 1
+5839 7662 1
+5842 5305 1
+5840 5305 1
+5841 5305 1
+5836 3089 1
+5836 3586 1
+5836 4310 1
+5836 5482 1
+5836 5624 1
+5836 5844 1
+5836 5886 1
+5836 5991 1
+5836 6094 1
+5836 6148 1
+5836 8295 1
+5846 5680 1
+5846 5848 1
+5846 5850 1
+5852 5680 1
+5853 5680 1
+5854 5680 1
+3788 4574 1
+3788 7809 1
+5855 15 1
+5855 3498 1
+5855 4574 1
+5855 5123 1
+5855 5482 1
+5855 5543 1
+5855 5624 1
+5855 5891 1
+5856 4574 1
+5857 15 1
+5857 896 1
+5857 938 1
+5857 1026 1
+5857 1403 1
+5857 2276 1
+5857 2285 1
+5857 2535 1
+5857 2765 1
+5857 2851 1
+5857 3089 1
+5857 3334 1
+5857 3459 1
+5857 3586 1
+5857 3634 1
+5857 3643 1
+5857 3976 1
+5857 4041 1
+5857 4099 1
+5857 4310 1
+5857 4361 1
+5857 4401 1
+5857 4432 1
+5857 4574 1
+5857 4604 1
+5857 4712 1
+5857 4875 1
+5857 4879 1
+5857 4981 1
+5857 4994 1
+5857 5022 1
+5857 5028 1
+5857 5103 1
+5857 5188 1
+5857 5200 1
+5857 5210 1
+5857 5273 1
+5857 5321 1
+5857 5421 1
+5857 5524 1
+5857 5543 1
+5857 5563 1
+5857 5584 1
+5857 5714 1
+5857 5799 1
+5857 5806 1
+5857 5818 1
+5857 5827 1
+5857 5886 1
+5857 5891 1
+5857 5922 1
+5857 5950 1
+5857 5969 1
+5857 6000 1
+5857 6094 1
+5857 6098 1
+5857 6227 1
+5857 6272 1
+5857 6305 1
+5857 6327 1
+5857 6458 1
+5857 6481 1
+5857 6496 1
+5857 6501 1
+5857 6552 1
+5857 6560 1
+5857 6566 1
+5857 6570 1
+5857 6576 1
+5857 6594 1
+5857 6632 1
+5857 6634 1
+5857 6790 1
+5857 6875 1
+5857 6901 1
+5857 6914 1
+5857 6933 1
+5857 6946 1
+5857 6948 1
+5857 7063 1
+5857 7351 1
+5857 7510 1
+5857 7553 1
+5857 7561 1
+5857 7632 1
+5857 7699 1
+5857 7908 1
+5857 7961 1
+5857 8163 1
+5857 8178 1
+5857 8212 1
+5857 8295 1
+5859 1493 1
+5859 3830 1
+5859 4401 1
+5859 4940 1
+5859 5246 1
+5859 5860 1
+5859 5891 1
+5859 5969 1
+5859 6762 1
+5859 7791 1
+5859 8042 1
+5859 8044 1
+5859 8141 1
+5859 8224 1
+5859 8246 1
+5859 8249 1
+5861 5482 1
+5861 5863 1
+5862 15 1
+5862 896 1
+5862 1352 1
+5862 1549 1
+5862 3089 1
+5862 3976 1
+5862 4175 1
+5862 4712 1
+5862 4828 1
+5862 5188 1
+5862 5254 1
+5862 5524 1
+5862 5863 1
+5862 5886 1
+5862 5891 1
+5862 5936 1
+5862 6124 1
+5862 6156 1
+5862 6272 1
+5862 6501 1
+5862 6632 1
+5862 6945 1
+5862 6955 1
+5862 8295 1
+5864 2490 1
+5866 2490 1
+5868 2490 1
+5868 5482 1
+5868 5925 1
+5872 4341 1
+5872 4632 1
+5872 5289 1
+5872 5378 1
+5872 5605 1
+5872 5806 1
+5872 5812 1
+5872 6523 1
+5872 6618 1
+5872 6634 1
+5872 6665 1
+5872 6875 1
+5872 6907 1
+5872 7116 1
+5872 7506 1
+5872 7510 1
+5872 7553 1
+5872 7561 1
+5872 7587 1
+5872 7618 1
+5872 7624 1
+5872 7908 1
+5872 8163 1
+5872 8174 1
+5872 8192 1
+5872 8212 1
+5872 8249 1
+5873 3376 1
+5873 5123 1
+5873 5457 1
+5873 5482 1
+5873 5886 1
+5873 5891 1
+5874 5482 1
+5875 5482 1
+5876 5482 1
+5877 5123 1
+5877 5301 1
+5877 5482 1
+5877 5886 1
+5877 5891 1
+5877 5925 1
+5877 5928 1
+5878 5482 1
+5883 3586 1
+5883 5886 1
+5884 5123 1
+5884 5886 1
+5885 5886 1
+5885 5891 1
+5885 5963 1
+5887 5891 1
+5888 5891 1
+5889 5891 1
+5890 15 1
+5890 5697 1
+5890 5891 1
+5890 5963 1
+5890 6400 1
+5590 15 1
+5590 4037 1
+5590 4687 1
+5590 5817 1
+5590 7879 1
+5892 4037 1
+5892 5817 1
+5895 3461 1
+5896 3922 1
+5896 5182 1
+5896 5499 1
+5896 5529 1
+5896 6422 1
+5896 6474 1
+5896 6993 1
+5896 7047 1
+5896 7707 1
+5896 7803 1
+5897 5499 1
+5897 6634 1
+5899 5123 1
+5899 5457 1
+5902 5123 1
+5070 5096 1
+5070 5123 1
+5070 7778 1
+5070 7961 1
+5903 5123 1
+4767 15 1
+4767 2535 1
+4767 2565 1
+4767 2620 1
+4767 5254 1
+4767 5301 1
+4767 5543 1
+4767 5963 1
+4767 6006 1
+4767 6566 1
+4767 6715 1
+4767 6832 1
+4767 7092 1
+4767 8163 1
+5907 5301 1
+5911 5301 1
+5911 5928 1
+5908 15 1
+5908 2535 1
+5908 3334 1
+5908 5254 1
+5908 5298 1
+5908 5301 1
+5908 5812 1
+5908 6004 1
+5908 6595 1
+5908 6770 1
+5908 6942 1
+5908 7050 1
+5908 7238 1
+5908 7389 1
+5908 7553 1
+5908 7632 1
+5908 7810 1
+5908 8224 1
+5908 8237 1
+5909 5301 1
+5909 5928 1
+5913 15 1
+5913 3976 1
+5913 4037 1
+5913 4041 1
+5913 8128 1
+5915 967 1
+5915 1191 1
+5915 3310 1
+5915 3381 1
+5915 3752 1
+5915 3976 1
+5915 4071 1
+5915 4435 1
+5915 4981 1
+5915 5524 1
+5915 5529 1
+5915 5839 1
+5915 5928 1
+5915 5933 1
+5915 6021 1
+5915 6043 1
+5915 6151 1
+5915 6523 1
+5915 6555 1
+5915 6560 1
+5915 6596 1
+5915 6914 1
+5915 7005 1
+5915 7012 1
+5915 7052 1
+5915 7092 1
+5915 7277 1
+5915 7280 1
+5915 7386 1
+5915 7443 1
+5915 7449 1
+5915 7649 1
+5915 7694 1
+5915 7701 1
+5915 7726 1
+5915 7763 1
+5915 7788 1
+5915 7795 1
+5915 7803 1
+5915 7809 1
+5915 7813 1
+5915 7819 1
+5915 7839 1
+5915 7855 1
+5915 7862 1
+5915 7871 1
+5915 7882 1
+5915 7890 1
+5915 7909 1
+5915 7910 1
+5915 7912 1
+5915 7924 1
+5916 15 1
+5916 3976 1
+5916 5182 1
+5916 5925 1
+5916 5936 1
+5916 5947 1
+5916 5963 1
+5916 6599 1
+5916 8295 1
+4927 3976 1
+5914 3976 1
+5914 5335 1
+5871 896 1
+5871 1982 1
+5871 2440 1
+5871 3084 1
+5871 3089 1
+5871 3191 1
+5871 3334 1
+5871 3459 1
+5871 3643 1
+5871 3976 1
+5871 4310 1
+5871 4536 1
+5871 4712 1
+5871 4795 1
+5871 4875 1
+5871 5079 1
+5871 5176 1
+5871 5178 1
+5871 5182 1
+5871 5254 1
+5871 5262 1
+5871 5273 1
+5871 5295 1
+5871 5457 1
+5871 5524 1
+5871 5527 1
+5871 5543 1
+5871 5596 1
+5871 5697 1
+5871 5739 1
+5871 5800 1
+5871 5811 1
+5871 5827 1
+5871 5829 1
+5871 5839 1
+5871 5947 1
+5871 6272 1
+5871 6523 1
+5871 6576 1
+5871 6699 1
+5871 6720 1
+5871 6774 1
+5871 6832 1
+5871 6980 1
+5871 7225 1
+5871 7553 1
+5871 7587 1
+5871 7620 1
+5871 7632 1
+5871 8295 1
+5917 3976 1
+5919 4037 1
+5919 5925 1
+5920 1191 1
+5920 4435 1
+5920 5925 1
+5920 6044 1
+5920 6780 1
+5920 6918 1
+5920 6946 1
+5920 7517 1
+5920 8042 1
+5920 8134 1
+5921 4037 1
+5921 5925 1
+5921 6327 1
+5921 6330 1
+5922 2851 1
+5922 4432 1
+5922 5103 1
+5922 5925 1
+5922 6875 1
+5922 7561 1
+5922 7860 1
+5923 4037 1
+5923 5925 1
+5923 6227 1
+5924 5925 1
+5928 3459 1
+5928 5246 1
+5928 5936 1
+5928 7620 1
+5927 3293 1
+5927 4037 1
+5927 5210 1
+5927 5928 1
+5927 6634 1
+5927 7544 1
+5927 7588 1
+5927 7882 1
+5927 8051 1
+5927 8128 1
+5930 3089 1
+5930 5176 1
+5930 5931 1
+5932 896 1
+5932 3089 1
+5932 3459 1
+5932 4310 1
+5932 4828 1
+5932 4875 1
+5932 5002 1
+5932 5121 1
+5932 5254 1
+5932 5437 1
+5932 5479 1
+5932 5487 1
+5932 5524 1
+5932 5563 1
+5932 5624 1
+5932 5684 1
+5932 5799 1
+5932 5824 1
+5932 5871 1
+5932 5872 1
+5932 5998 1
+5932 6330 1
+5932 6407 1
+5932 6523 1
+5932 6560 1
+5932 6566 1
+5932 6599 1
+5932 6665 1
+5932 6789 1
+5932 6832 1
+5932 7101 1
+5932 7225 1
+5932 8295 1
+5933 3089 1
+5933 4791 1
+5933 4875 1
+5933 5254 1
+5934 896 1
+5934 1352 1
+5934 2276 1
+5934 2535 1
+5934 3089 1
+5934 3291 1
+5934 3873 1
+5934 3919 1
+5934 4065 1
+5934 4604 1
+5934 4781 1
+5934 4828 1
+5934 5037 1
+5934 5210 1
+5934 5273 1
+5934 5437 1
+5934 5527 1
+5934 5543 1
+5934 5620 1
+5934 5630 1
+5934 5753 1
+5934 5800 1
+5934 5802 1
+5934 5871 1
+5934 5947 1
+5934 6021 1
+5934 6111 1
+5934 6156 1
+5934 6166 1
+5934 6340 1
+5934 6409 1
+5934 6600 1
+5934 6613 1
+5934 6665 1
+5934 6699 1
+5934 6715 1
+5934 6805 1
+5934 6850 1
+5934 6855 1
+5934 6869 1
+5934 6901 1
+5934 7651 1
+5935 3089 1
+5935 3873 1
+5935 4310 1
+5935 5178 1
+5935 5487 1
+5935 5543 1
+5935 5545 1
+5935 5972 1
+5935 6161 1
+5935 6226 1
+5935 6235 1
+5936 3089 1
+5936 4175 1
+5937 3089 1
+5938 896 1
+5938 3089 1
+5942 896 1
+5942 3089 1
+5942 5936 1
+5942 5994 1
+5939 3089 1
+5939 3191 1
+5939 5994 1
+5940 1026 1
+5940 2774 1
+5940 3089 1
+5940 4175 1
+5940 5254 1
+5940 6006 1
+5940 6098 1
+5940 6496 1
+5940 7115 1
+5940 7632 1
+5940 7890 1
+5940 8174 1
+5940 8192 1
+5941 3089 1
+5944 5947 1
+5945 896 1
+5945 2765 1
+5945 4875 1
+5945 5179 1
+5945 5527 1
+5945 5947 1
+5945 5963 1
+5945 6094 1
+5945 6098 1
+5946 5182 1
+5946 5947 1
+5946 5963 1
+5946 8130 1
+5950 5457 1
+5950 6004 1
+5950 6634 1
+5950 6725 1
+5952 2440 1
+5952 3885 1
+5952 5079 1
+5952 5182 1
+5952 5697 1
+5952 5963 1
+5952 6414 1
+5952 7237 1
+5952 7238 1
+5952 7378 1
+5952 7620 1
+5952 7632 1
+5952 7839 1
+5952 7946 1
+5962 5963 1
+5962 5973 1
+5964 5963 1
+5958 5487 1
+5958 5963 1
+5958 6720 1
+5966 5335 1
+5966 5772 1
+5966 5963 1
+5966 6023 1
+5966 6946 1
+5966 7052 1
+5966 8219 1
+5959 5963 1
+5960 3191 1
+5960 5963 1
+5960 6094 1
+5960 6124 1
+5093 5963 1
+5961 3614 1
+5961 4310 1
+5961 4483 1
+5961 4798 1
+5961 4828 1
+5961 5188 1
+5961 5626 1
+5961 5804 1
+5961 5963 1
+5961 5991 1
+5961 6088 1
+5969 4435 1
+5969 6417 1
+5969 7092 1
+5969 7649 1
+5969 7835 1
+5970 5971 1
+5972 5263 1
+5972 6424 1
+5980 3634 1
+5980 5897 1
+5980 5969 1
+5980 6532 1
+5980 6553 1
+5980 6595 1
+5980 6634 1
+5980 6714 1
+5981 3586 1
+5981 4099 1
+5981 4483 1
+5981 5479 1
+5981 5584 1
+5981 5799 1
+5982 3586 1
+5982 6833 1
+5982 7961 1
+5982 8178 1
+5983 3586 1
+5984 896 1
+5984 3334 1
+5984 3586 1
+5984 4310 1
+5984 4791 1
+5984 5233 1
+5984 5524 1
+5984 5950 1
+5984 6323 1
+5984 7553 1
+5985 3586 1
+5986 3586 1
+5987 3586 1
+5988 3586 1
+5988 7131 1
+5988 7279 1
+5988 7478 1
+5989 3586 1
+5990 3586 1
+5992 5994 1
+5993 15 1
+5993 4037 1
+5993 5994 1
+5997 896 1
+5997 6791 1
+5998 896 1
+5998 1026 1
+5998 1352 1
+5998 2511 1
+5998 2565 1
+5998 2620 1
+5998 3291 1
+5998 3381 1
+5998 3634 1
+5998 3803 1
+5998 3962 1
+5998 4536 1
+5998 4604 1
+5998 4666 1
+5998 4712 1
+5998 4717 1
+5998 4748 1
+5998 4791 1
+5998 4944 1
+5998 4994 1
+5998 5002 1
+5998 5022 1
+5998 5140 1
+5998 5148 1
+5998 5179 1
+5998 5210 1
+5998 5254 1
+5998 5273 1
+5998 5404 1
+5998 5439 1
+5998 5773 1
+5998 5776 1
+5998 5799 1
+5998 5800 1
+5998 5806 1
+5998 5814 1
+5998 5822 1
+5998 5835 1
+5998 5922 1
+5998 5932 1
+5998 5936 1
+5998 6006 1
+5998 6097 1
+5998 6123 1
+5998 6327 1
+5998 6505 1
+5998 6552 1
+5998 6554 1
+5998 6570 1
+5998 6595 1
+5998 6600 1
+5998 6618 1
+5998 6632 1
+5998 6634 1
+5998 6665 1
+5998 6774 1
+5998 6914 1
+5998 6934 1
+5998 6946 1
+5998 7052 1
+5998 7092 1
+5998 7101 1
+5998 7115 1
+5998 7119 1
+5998 7143 1
+5998 7225 1
+5998 7279 1
+5998 7280 1
+5998 7389 1
+5998 7443 1
+5998 7510 1
+5998 7553 1
+5998 7707 1
+5998 7795 1
+5998 7833 1
+5998 7839 1
+5998 7871 1
+5998 7890 1
+5998 7924 1
+5998 7961 1
+5998 8168 1
+5967 896 1
+5999 896 1
+5999 1982 1
+5999 3084 1
+5999 3334 1
+5999 3459 1
+5999 4037 1
+5999 5079 1
+5999 5254 1
+5999 5620 1
+5999 6044 1
+5999 6246 1
+5999 6496 1
+5999 6553 1
+5999 6774 1
+5999 6833 1
+5999 7054 1
+5999 7620 1
+5999 7632 1
+5999 7803 1
+5999 7979 1
+6000 896 1
+6000 3084 1
+6000 5022 1
+6000 6270 1
+6000 6709 1
+6000 7168 1
+6000 7632 1
+6000 8124 1
+6000 8134 1
+6000 8276 1
+6005 1159 1
+6003 1159 1
+6006 1159 1
+6006 1498 1
+6006 2433 1
+6006 2440 1
+6006 2535 1
+6006 2620 1
+6006 3631 1
+6006 3962 1
+6006 4037 1
+6006 4483 1
+6006 4709 1
+6006 4712 1
+6006 4748 1
+6006 4983 1
+6006 5020 1
+6006 5022 1
+6006 5079 1
+6006 5254 1
+6006 5404 1
+6006 5596 1
+6006 5684 1
+6006 5714 1
+6006 5776 1
+6006 5799 1
+6006 5804 1
+6006 5812 1
+6006 5932 1
+6006 6156 1
+6006 6272 1
+6006 6320 1
+6006 6323 1
+6006 6327 1
+6006 6334 1
+6006 6437 1
+6006 6441 1
+6006 6458 1
+6006 6481 1
+6006 6496 1
+6006 6505 1
+6006 6576 1
+6006 6613 1
+6006 6634 1
+6006 6641 1
+6006 6700 1
+6006 6783 1
+6006 6907 1
+6006 6914 1
+6006 6918 1
+6006 6945 1
+6006 7052 1
+6006 7092 1
+6006 7108 1
+6006 7233 1
+6006 7279 1
+6006 7280 1
+6006 7341 1
+6006 7422 1
+6006 7443 1
+6006 7478 1
+6006 7510 1
+6006 7553 1
+6006 7699 1
+6006 7803 1
+6006 7810 1
+6006 7979 1
+6006 7992 1
+6006 8209 1
+6006 8224 1
+6004 1159 1
+6004 2940 1
+6004 5233 1
+6004 5484 1
+6004 5529 1
+6004 6832 1
+6007 1159 1
+6007 3498 1
+6007 5103 1
+6007 6080 1
+6007 6094 1
+6007 6496 1
+6013 4175 1
+6013 6496 1
+6013 7890 1
+4409 4175 1
+4409 6043 1
+4409 6306 1
+4409 6496 1
+4409 7890 1
+4409 7924 1
+4409 8275 1
+6014 4175 1
+6015 4175 1
+6015 6496 1
+6015 7890 1
+6016 3238 1
+6016 4071 1
+6016 4175 1
+6016 6496 1
+6016 6780 1
+6016 6914 1
+6016 7092 1
+6016 7833 1
+6016 8134 1
+6016 8174 1
+6017 2774 1
+6017 4175 1
+6018 4175 1
+6019 4175 1
+6020 15 1
+6020 3015 1
+6020 3498 1
+6020 3873 1
+6020 4310 1
+6020 4435 1
+6020 4940 1
+6020 5079 1
+6020 5178 1
+6020 5262 1
+6020 5529 1
+6020 5545 1
+6020 5624 1
+6020 5671 1
+6020 6021 1
+6020 6166 1
+6020 6226 1
+6020 6255 1
+6020 6980 1
+6020 7052 1
+6020 7092 1
+6020 7277 1
+6020 7280 1
+6020 7443 1
+6020 7763 1
+6024 15 1
+6024 2160 1
+6024 2433 1
+6024 2658 1
+6024 3334 1
+6024 3459 1
+6024 3634 1
+6024 4037 1
+6024 4712 1
+6024 5335 1
+6024 5902 1
+6024 5936 1
+6024 6218 1
+6024 6251 1
+6024 6337 1
+6024 7131 1
+6024 8295 1
+6022 5936 1
+6023 1972 1
+6023 3479 1
+6023 4715 1
+6023 4786 1
+6023 4994 1
+6023 5233 1
+6023 5263 1
+6023 5415 1
+6023 5439 1
+6023 5479 1
+6023 5638 1
+6023 5799 1
+6023 5814 1
+6023 5936 1
+6023 6006 1
+6023 6161 1
+6023 6218 1
+6023 6261 1
+6023 6327 1
+6023 6407 1
+6023 6417 1
+6023 6432 1
+6023 6435 1
+6023 6437 1
+6023 6441 1
+6023 6462 1
+6023 6474 1
+6023 6481 1
+6023 6511 1
+6023 6528 1
+6002 6025 1
+6026 2765 1
+6026 3334 1
+6026 6682 1
+6028 3643 1
+6030 4041 1
+6031 4041 1
+6031 4875 1
+6032 1403 1
+6032 1549 1
+6032 1982 1
+6032 2565 1
+6032 2658 1
+6032 2851 1
+6032 3726 1
+6032 4037 1
+6032 4041 1
+6032 4071 1
+6032 4361 1
+6032 4432 1
+6032 4709 1
+6032 4764 1
+6032 4944 1
+6032 4981 1
+6032 5002 1
+6032 5148 1
+6032 5199 1
+6032 5210 1
+6032 5246 1
+6032 5529 1
+6032 5543 1
+6032 5563 1
+6032 5739 1
+6032 5800 1
+6032 5806 1
+6032 6006 1
+6032 6097 1
+6032 6123 1
+6032 6243 1
+6032 6327 1
+6032 6328 1
+6032 6347 1
+6032 6414 1
+6032 6442 1
+6032 6529 1
+6032 6555 1
+6032 6618 1
+6032 6634 1
+6032 6665 1
+6032 6700 1
+6032 6736 1
+6032 6765 1
+6032 6769 1
+6032 6774 1
+6032 6784 1
+6032 6832 1
+6032 6875 1
+6032 6901 1
+6032 6913 1
+6032 6918 1
+6032 6930 1
+6032 6946 1
+6032 6955 1
+6032 6980 1
+6032 7050 1
+6032 7063 1
+6032 7092 1
+6032 7116 1
+6032 7131 1
+6032 7201 1
+6032 7233 1
+6032 7238 1
+6032 7280 1
+6032 7295 1
+6032 7351 1
+6032 7386 1
+6032 7397 1
+6032 7400 1
+6032 7544 1
+6032 7553 1
+6032 7618 1
+6032 7833 1
+6032 7839 1
+6032 7908 1
+6032 7921 1
+6032 8042 1
+6032 8121 1
+6032 8192 1
+5978 4041 1
+6033 4041 1
+6034 4041 1
+6036 4041 1
+6037 4041 1
+6035 4041 1
+6029 7699 1
+6029 7890 1
+6038 2440 1
+6038 4748 1
+6038 5188 1
+6038 5829 1
+6038 6029 1
+6038 6634 1
+6039 6029 1
+6042 2276 1
+6043 2276 1
+6043 2658 1
+6043 3015 1
+6043 3084 1
+6043 3310 1
+6043 3498 1
+6043 3962 1
+6043 4310 1
+6043 4341 1
+6043 4781 1
+6043 4828 1
+6043 4981 1
+6043 5103 1
+6043 5121 1
+6043 5210 1
+6043 5262 1
+6043 5437 1
+6043 5524 1
+6043 5543 1
+6043 5545 1
+6043 5624 1
+6043 6124 1
+6043 6148 1
+6043 6523 1
+6043 6560 1
+6043 7092 1
+6043 7280 1
+6043 7400 1
+6043 7443 1
+6043 7544 1
+6043 7694 1
+6043 7726 1
+6043 7757 1
+6043 7788 1
+6043 7795 1
+6043 7839 1
+6043 7961 1
+6043 8037 1
+6043 8174 1
+6044 4310 1
+6044 5484 1
+6045 3334 1
+6045 4310 1
+6045 5773 1
+6045 6041 1
+6045 6946 1
+6045 7378 1
+6045 7553 1
+6046 4310 1
+6046 6044 1
+6047 4310 1
+6047 4488 1
+6047 4713 1
+6047 5800 1
+6048 4310 1
+6049 4310 1
+6049 5210 1
+6049 5811 1
+6050 4310 1
+6051 4310 1
+6052 4310 1
+6053 4310 1
+6056 6059 1
+6057 6059 1
+6058 6059 1
+6060 5543 1
+6061 5543 1
+6062 5543 1
+6062 6098 1
+6063 5543 1
+6064 3919 1
+6064 5543 1
+6064 6780 1
+6064 7517 1
+6066 5524 1
+6070 4828 1
+6070 5524 1
+6070 6098 1
+6071 5524 1
+6071 7632 1
+6071 7803 1
+6072 1498 1
+6072 2223 1
+6072 2658 1
+6072 3293 1
+6072 3297 1
+6072 4037 1
+6072 4507 1
+6072 4940 1
+6072 4983 1
+6072 5246 1
+6072 5421 1
+6072 5524 1
+6072 5529 1
+6072 5614 1
+6072 5806 1
+6072 5818 1
+6072 5819 1
+6072 6004 1
+6072 6044 1
+6072 6241 1
+6072 6422 1
+6072 6634 1
+6072 6914 1
+6072 6946 1
+6072 7047 1
+6072 7092 1
+6072 7225 1
+6072 7544 1
+6072 7620 1
+6072 7707 1
+6072 7778 1
+6072 7833 1
+6072 7890 1
+6072 7908 1
+6072 7910 1
+6072 7924 1
+6072 7927 1
+6072 7946 1
+6072 7979 1
+6072 7992 1
+6072 8002 1
+6072 8037 1
+6072 8042 1
+6072 8044 1
+6072 8068 1
+6072 8073 1
+6072 8083 1
+6072 8122 1
+6072 8128 1
+6072 8141 1
+6072 8163 1
+6072 8168 1
+6072 8212 1
+6072 8224 1
+6067 5524 1
+6068 15 1
+6068 2925 1
+6068 3498 1
+6068 3634 1
+6068 3962 1
+6068 4037 1
+6068 4781 1
+6068 4828 1
+6068 4875 1
+6068 5179 1
+6068 5210 1
+6068 5421 1
+6068 5524 1
+6068 5624 1
+6068 5753 1
+6068 5922 1
+6068 6094 1
+6068 6098 1
+6068 6124 1
+6068 6151 1
+6068 6166 1
+6068 6174 1
+6068 6334 1
+6068 6414 1
+6068 6498 1
+6068 6875 1
+6068 7092 1
+6068 7280 1
+6068 7620 1
+6068 7879 1
+6068 7927 1
+6068 8134 1
+6069 4875 1
+6069 5404 1
+6069 5524 1
+6069 6148 1
+6069 6161 1
+6073 5103 1
+6074 5103 1
+6075 15 1
+6075 3015 1
+6075 3498 1
+6075 3873 1
+6075 4781 1
+6075 4828 1
+6075 4875 1
+6075 5103 1
+6075 5121 1
+6075 5178 1
+6075 5262 1
+6075 5437 1
+6075 5527 1
+6075 5545 1
+6075 5624 1
+6075 5753 1
+6075 5936 1
+6075 6124 1
+6077 6078 1
+6079 6080 1
+6081 5543 1
+6081 5596 1
+6081 6083 1
+6082 2535 1
+6082 2914 1
+6082 3084 1
+6082 4065 1
+6082 4441 1
+6082 5002 1
+6082 5079 1
+6082 5210 1
+6082 5714 1
+6082 5799 1
+6082 6083 1
+6082 6424 1
+6082 6496 1
+6082 6553 1
+6082 6571 1
+6082 6707 1
+6082 6720 1
+6082 6833 1
+6089 6090 1
+6091 4828 1
+6092 4828 1
+6093 2785 1
+6093 4536 1
+6093 4828 1
+6093 6505 1
+6093 6790 1
+6098 7306 1
+6097 2160 1
+6097 3498 1
+6097 4099 1
+6097 5079 1
+6097 5199 1
+6097 5806 1
+6097 5814 1
+6097 5872 1
+6097 5998 1
+6097 6006 1
+6097 6098 1
+6097 6123 1
+6097 6299 1
+6097 6323 1
+6097 6414 1
+6097 6496 1
+6097 6715 1
+6097 6832 1
+6097 7063 1
+6097 7101 1
+6097 7144 1
+6097 7214 1
+6097 7295 1
+6097 7478 1
+6097 7632 1
+6097 7651 1
+6094 4604 1
+6094 4781 1
+6094 5121 1
+6094 5423 1
+6094 5527 1
+6094 5584 1
+6094 5753 1
+6094 5814 1
+6094 6098 1
+6094 6124 1
+6094 6229 1
+6100 6101 1
+6108 5121 1
+6108 5437 1
+6108 5753 1
+6108 6229 1
+6110 6246 1
+6116 4875 1
+6116 5487 1
+6112 4875 1
+6113 4875 1
+6114 4875 1
+6114 4981 1
+6118 2620 1
+6118 4781 1
+6119 4037 1
+6119 4781 1
+6119 5624 1
+6120 4781 1
+6121 4781 1
+6121 5814 1
+6126 5262 1
+6126 5404 1
+6126 5829 1
+6126 6004 1
+6126 6006 1
+6126 6094 1
+6126 6148 1
+6126 6229 1
+6126 6432 1
+6126 6437 1
+6126 6441 1
+6129 6094 1
+6128 6094 1
+6128 6151 1
+6127 5028 1
+6127 5671 1
+6127 6094 1
+6130 6161 1
+6001 15 1
+6001 5121 1
+6001 5871 1
+6001 6327 1
+6001 6596 1
+6133 5037 1
+6133 5121 1
+6133 5437 1
+6133 5545 1
+6134 5121 1
+6134 5254 1
+6134 5423 1
+6134 5814 1
+6134 6296 1
+6134 6306 1
+6134 6739 1
+6135 5121 1
+6135 6161 1
+6141 6148 1
+6142 6148 1
+6143 6148 1
+6144 6148 1
+6145 6148 1
+6146 2535 1
+6146 3614 1
+6146 5178 1
+6146 5545 1
+6146 5804 1
+6146 6006 1
+6146 6148 1
+6146 6337 1
+6146 6571 1
+6147 6148 1
+6151 3498 1
+6151 4037 1
+6151 5022 1
+6151 5624 1
+6151 6618 1
+6151 6780 1
+6151 6832 1
+6151 7301 1
+6151 7587 1
+6151 7620 1
+6151 7624 1
+6151 7632 1
+6151 8134 1
+6150 6151 1
+6152 5437 1
+6153 5437 1
+6155 5404 1
+6158 5404 1
+6156 15 1
+6156 967 1
+6156 2774 1
+6156 3015 1
+6156 4632 1
+6156 4687 1
+6156 5404 1
+6156 5439 1
+6156 5624 1
+6156 5671 1
+6156 5697 1
+6156 5714 1
+6156 5798 1
+6156 6006 1
+6156 6166 1
+6156 6218 1
+6156 6221 1
+6156 6328 1
+6156 6417 1
+6156 6422 1
+6156 6432 1
+6156 7131 1
+6157 15 1
+6157 5404 1
+6157 6164 1
+6160 15 1
+6160 4037 1
+6160 6161 1
+6165 4134 1
+6165 6166 1
+6165 6554 1
+6165 6606 1
+6168 5624 1
+6169 3291 1
+6169 5624 1
+6169 6855 1
+6170 4134 1
+6170 5037 1
+6170 5188 1
+6170 5584 1
+6170 5624 1
+6170 5824 1
+6170 5871 1
+6170 6251 1
+6170 6311 1
+6170 6552 1
+6170 6596 1
+6170 6599 1
+6170 6628 1
+6170 6663 1
+6174 2658 1
+6174 3238 1
+6174 3498 1
+6174 3962 1
+6174 4940 1
+6174 5022 1
+6174 5079 1
+6174 5818 1
+6174 6832 1
+6174 7839 1
+6175 3498 1
+6176 3498 1
+6176 5415 1
+6176 5545 1
+6177 3498 1
+6177 6934 1
+6178 15 1
+6179 15 1
+6179 2440 1
+6179 4065 1
+6179 5584 1
+6179 6496 1
+6179 6897 1
+6179 7788 1
+6180 15 1
+6180 6907 1
+6180 7478 1
+6196 15 1
+6196 2535 1
+6197 15 1
+6197 4980 1
+6181 15 1
+6182 15 1
+6182 4875 1
+6182 6006 1
+6183 15 1
+6184 15 1
+6184 5822 1
+6185 15 1
+6186 15 1
+6187 15 1
+388 15 1
+6188 15 1
+6198 15 1
+6198 2620 1
+6198 3459 1
+6198 4992 1
+6198 5524 1
+6198 5822 1
+6198 5829 1
+6198 6560 1
+6198 6789 1
+6198 6790 1
+6198 6832 1
+6198 6979 1
+6198 7351 1
+6198 7414 1
+6199 15 1
+6200 15 1
+6200 4037 1
+6200 5178 1
+6200 5262 1
+6200 5484 1
+6200 6246 1
+6201 15 1
+6201 2535 1
+6202 15 1
+6202 4037 1
+6202 8134 1
+6203 15 1
+6204 15 1
+6204 1549 1
+6204 5233 1
+6204 5543 1
+6204 5563 1
+6204 5697 1
+6204 5800 1
+6204 5818 1
+6204 6330 1
+6204 6901 1
+6204 6930 1
+6204 8295 1
+6190 15 1
+6190 5254 1
+6190 6833 1
+6205 15 1
+6206 15 1
+6207 15 1
+6207 2535 1
+6207 4099 1
+6207 4687 1
+6191 15 1
+6192 15 1
+6192 6262 1
+6208 15 1
+6208 5254 1
+6208 6805 1
+6193 15 1
+6212 4435 1
+6212 5545 1
+6212 7835 1
+6213 5545 1
+6213 5824 1
+6213 6229 1
+6214 5545 1
+6215 5545 1
+6216 4099 1
+6216 5626 1
+6216 6458 1
+6216 6481 1
+6216 7624 1
+6217 1352 1
+6217 2620 1
+6217 3291 1
+6217 3792 1
+6217 3842 1
+6217 3919 1
+6217 4065 1
+6217 4099 1
+6217 4709 1
+6217 4712 1
+6217 5210 1
+6217 5254 1
+6217 5273 1
+6217 5584 1
+6217 5626 1
+6217 6156 1
+6217 6327 1
+6217 6388 1
+6217 6441 1
+6217 6458 1
+6217 6496 1
+6217 6498 1
+6217 6552 1
+6217 6566 1
+6217 6594 1
+6217 6599 1
+6217 6600 1
+6217 6665 1
+6217 6720 1
+6217 6725 1
+6217 6783 1
+6218 840 1
+6218 1026 1
+6218 1982 1
+6218 3334 1
+6218 3459 1
+6218 3962 1
+6218 4037 1
+6218 4401 1
+6218 4536 1
+6218 4712 1
+6218 4795 1
+6218 4798 1
+6218 4940 1
+6218 4981 1
+6218 4994 1
+6218 5022 1
+6218 5079 1
+6218 5210 1
+6218 5254 1
+6218 5605 1
+6218 5626 1
+6218 5798 1
+6218 5799 1
+6218 5806 1
+6218 5807 1
+6218 5811 1
+6218 5814 1
+6218 5897 1
+6218 5902 1
+6218 6006 1
+6218 6032 1
+6218 6043 1
+6218 6299 1
+6218 6327 1
+6218 6432 1
+6218 6555 1
+6218 6594 1
+6218 6634 1
+6218 6784 1
+6218 6913 1
+6218 6914 1
+6218 7063 1
+6218 7092 1
+6218 7168 1
+6218 7553 1
+6218 7587 1
+6218 7620 1
+6218 7632 1
+6218 7809 1
+6218 7835 1
+6218 7910 1
+6218 7961 1
+6218 8121 1
+6219 5626 1
+6219 5950 1
+6219 6170 1
+6219 6723 1
+6220 3634 1
+6220 3803 1
+6220 4713 1
+6220 4717 1
+6220 5012 1
+6220 5177 1
+6220 5178 1
+6220 5254 1
+6220 5335 1
+6220 5384 1
+6220 5479 1
+6220 6006 1
+6220 6262 1
+6220 6299 1
+6220 6634 1
+6220 6715 1
+6220 8246 1
+6220 8297 1
+6224 5262 1
+6221 938 1
+6221 3297 1
+6221 3962 1
+6221 4037 1
+6221 4071 1
+6221 4341 1
+6221 5254 1
+6221 5262 1
+6221 5529 1
+6221 5605 1
+6221 5643 1
+6221 5738 1
+6221 5760 1
+6221 5814 1
+6221 5835 1
+6221 6296 1
+6221 6306 1
+6221 6613 1
+6221 6715 1
+6221 6780 1
+6221 7050 1
+6221 7059 1
+6221 7092 1
+6221 7414 1
+6221 7478 1
+6221 7517 1
+6221 7561 1
+6221 7620 1
+6221 7632 1
+6221 7809 1
+6221 7839 1
+6222 5262 1
+6223 2285 1
+6223 2440 1
+6223 2620 1
+6223 4717 1
+6223 4791 1
+6223 5233 1
+6223 5254 1
+6223 5262 1
+6223 5684 1
+6223 6006 1
+6223 6156 1
+6223 6306 1
+6223 6388 1
+6223 6437 1
+6223 6554 1
+6223 6570 1
+6223 6632 1
+6229 840 1
+6229 3238 1
+6229 4037 1
+6229 5012 1
+6229 5543 1
+6229 5714 1
+6229 6227 1
+6229 6330 1
+6229 6566 1
+6229 6714 1
+6229 6784 1
+6229 6833 1
+6229 7092 1
+6229 7301 1
+6229 7478 1
+6229 7544 1
+6229 7649 1
+6229 7946 1
+6229 8212 1
+6227 6229 1
+6227 8212 1
+6230 6229 1
+6230 6407 1
+6228 6229 1
+6232 5263 1
+6232 5804 1
+6232 6218 1
+6236 5415 1
+6239 3873 1
+6239 5760 1
+6239 6218 1
+6239 6306 1
+6239 6432 1
+6240 3873 1
+6241 1026 1
+6241 1403 1
+6241 2565 1
+6241 2851 1
+6241 3238 1
+6241 3291 1
+6241 3634 1
+6241 3873 1
+6241 3962 1
+6241 3969 1
+6241 4341 1
+6241 4507 1
+6241 4632 1
+6241 4983 1
+6241 5002 1
+6241 5178 1
+6241 5289 1
+6241 5393 1
+6241 5465 1
+6241 5563 1
+6241 5671 1
+6241 5760 1
+6241 5806 1
+6241 5814 1
+6241 5822 1
+6241 5872 1
+6241 6097 1
+6241 6123 1
+6241 6299 1
+6241 6417 1
+6241 6424 1
+6241 6442 1
+6241 6496 1
+6241 6505 1
+6241 6555 1
+6241 6665 1
+6241 6715 1
+6241 6784 1
+6241 6790 1
+6241 6832 1
+6241 6860 1
+6241 6976 1
+6241 7021 1
+6241 7052 1
+6241 7059 1
+6241 7092 1
+6241 7116 1
+6241 7237 1
+6241 7277 1
+6241 7280 1
+6241 7362 1
+6241 7381 1
+6241 7400 1
+6241 7414 1
+6241 7443 1
+6241 7497 1
+6241 7561 1
+6241 7590 1
+6241 7593 1
+6241 7604 1
+6241 7620 1
+6241 7632 1
+6241 7651 1
+6241 7662 1
+6241 7694 1
+6241 7695 1
+6241 7763 1
+6241 7819 1
+6241 7855 1
+6241 7908 1
+6241 7961 1
+6241 8042 1
+6241 8051 1
+6241 8212 1
+6241 8219 1
+6242 3873 1
+6242 5524 1
+6242 6251 1
+6242 6892 1
+6242 6930 1
+6244 6246 1
+6245 2565 1
+6245 5465 1
+6245 5487 1
+6245 6023 1
+6245 6246 1
+6245 7116 1
+6245 7587 1
+6245 7632 1
+6243 2160 1
+6243 3752 1
+6243 4483 1
+6243 4604 1
+6243 4712 1
+6243 5002 1
+6243 5079 1
+6243 5254 1
+6243 5484 1
+6243 5739 1
+6243 5800 1
+6243 5829 1
+6243 5839 1
+6243 5871 1
+6243 5872 1
+6243 5902 1
+6243 5998 1
+6243 6000 1
+6243 6123 1
+6243 6246 1
+6243 6414 1
+6243 6501 1
+6243 6606 1
+6243 6628 1
+6243 6634 1
+6243 6665 1
+6243 6700 1
+6243 6774 1
+6243 6832 1
+6243 7092 1
+6243 7414 1
+6243 7632 1
+6243 7699 1
+6243 7809 1
+6243 8297 1
+6247 5178 1
+6248 1972 1
+6248 3634 1
+6248 4536 1
+6248 4717 1
+6248 5178 1
+6248 5233 1
+6248 5335 1
+6248 6337 1
+6248 6554 1
+6248 6570 1
+6252 6255 1
+6252 7813 1
+6253 6255 1
+6254 6255 1
+6258 6259 1
+6262 5200 1
+6263 5335 1
+6263 5423 1
+6263 6023 1
+6263 6262 1
+6264 6262 1
+6265 6262 1
+6266 6267 1
+6270 1982 1
+6270 2851 1
+6270 2914 1
+6270 3291 1
+6270 3334 1
+6270 3346 1
+6270 3459 1
+6270 3634 1
+6270 3803 1
+6270 3885 1
+6270 4009 1
+6270 4037 1
+6270 4099 1
+6270 4134 1
+6270 4218 1
+6270 4361 1
+6270 4507 1
+6270 4687 1
+6270 4944 1
+6270 5012 1
+6270 5233 1
+6270 5288 1
+6270 5524 1
+6270 5543 1
+6270 5563 1
+6270 5697 1
+6270 5714 1
+6270 5739 1
+6270 5773 1
+6270 5799 1
+6270 5800 1
+6270 5811 1
+6270 5814 1
+6270 5829 1
+6270 5932 1
+6270 5980 1
+6270 6001 1
+6270 6006 1
+6270 6097 1
+6270 6123 1
+6270 6198 1
+6270 6272 1
+6270 6299 1
+6270 6305 1
+6270 6327 1
+6270 6328 1
+6270 6417 1
+6270 6424 1
+6270 6441 1
+6270 6462 1
+6270 6464 1
+6270 6474 1
+6270 6496 1
+6270 6503 1
+6270 6505 1
+6270 6560 1
+6270 6596 1
+6270 6714 1
+6270 6736 1
+6270 6765 1
+6270 6770 1
+6270 6772 1
+6270 6789 1
+6270 6832 1
+6270 6869 1
+6270 6873 1
+6270 6901 1
+6270 6913 1
+6270 6930 1
+6270 6942 1
+6270 6946 1
+6270 6953 1
+6270 6955 1
+6270 6979 1
+6270 6994 1
+6270 7161 1
+6270 7185 1
+6270 7257 1
+6270 7304 1
+6270 7319 1
+6270 7323 1
+6270 7341 1
+6270 7351 1
+6270 7381 1
+6270 7397 1
+6270 7414 1
+6270 7442 1
+6270 8295 1
+6271 2440 1
+6271 4715 1
+6271 5188 1
+6271 5200 1
+6271 5799 1
+6271 6505 1
+6271 6571 1
+6271 6634 1
+6271 6809 1
+6271 6813 1
+6271 8295 1
+6272 1403 1
+6272 1549 1
+6272 1823 1
+6272 1982 1
+6272 2160 1
+6272 2440 1
+6272 2620 1
+6272 3334 1
+6272 3459 1
+6272 3634 1
+6272 4099 1
+6272 4361 1
+6272 4536 1
+6272 4666 1
+6272 4717 1
+6272 4940 1
+6272 4944 1
+6272 5020 1
+6272 5079 1
+6272 5188 1
+6272 5210 1
+6272 5233 1
+6272 5254 1
+6272 5543 1
+6272 5596 1
+6272 5697 1
+6272 5739 1
+6272 5800 1
+6272 5806 1
+6272 5811 1
+6272 5819 1
+6272 5822 1
+6272 5827 1
+6272 5839 1
+6272 5871 1
+6272 5902 1
+6272 5933 1
+6272 6000 1
+6272 6043 1
+6272 6047 1
+6272 6097 1
+6272 6123 1
+6272 6305 1
+6272 6501 1
+6272 6523 1
+6272 6554 1
+6272 6606 1
+6272 6634 1
+6272 6665 1
+6272 6714 1
+6272 6736 1
+6272 6774 1
+6272 6832 1
+6272 6914 1
+6272 6946 1
+6272 6955 1
+6272 6976 1
+6272 6979 1
+6272 7052 1
+6272 7092 1
+6272 7279 1
+6272 7414 1
+6272 7478 1
+6272 7510 1
+6272 7553 1
+6272 7620 1
+6272 7632 1
+6272 7662 1
+6272 7699 1
+6272 7839 1
+6272 7882 1
+6272 7908 1
+6272 7924 1
+6272 8051 1
+6272 8073 1
+6272 8295 1
+6273 8295 1
+6274 1026 1
+6274 3459 1
+6274 6032 1
+6274 6044 1
+6274 7649 1
+6274 7788 1
+6274 7835 1
+6274 7992 1
+6274 8295 1
+6275 8295 1
+6276 8295 1
+6282 5335 1
+6280 938 1
+6280 1403 1
+6280 2565 1
+6280 2851 1
+6280 2940 1
+6280 3334 1
+6280 3726 1
+6280 3885 1
+6280 4361 1
+6280 4884 1
+6280 5028 1
+6280 5199 1
+6280 5233 1
+6280 5289 1
+6280 5335 1
+6280 5404 1
+6280 5760 1
+6280 5773 1
+6280 5800 1
+6280 5806 1
+6280 5897 1
+6280 5902 1
+6280 6123 1
+6280 6299 1
+6280 6442 1
+6280 6503 1
+6280 6736 1
+6280 6789 1
+6280 6832 1
+6280 6946 1
+6280 7054 1
+6280 7088 1
+6280 7116 1
+6280 7131 1
+6280 7279 1
+6280 7295 1
+6280 7351 1
+6280 7362 1
+6280 7373 1
+6280 7378 1
+6280 7381 1
+6280 7414 1
+6280 7442 1
+6280 7450 1
+6280 7478 1
+6280 7497 1
+6280 7512 1
+6280 7529 1
+6280 7587 1
+6280 7618 1
+6280 7620 1
+6280 7632 1
+6281 5335 1
+6286 2535 1
+6286 4483 1
+6286 5423 1
+6287 5423 1
+6288 5423 1
+6291 6296 1
+6292 6296 1
+6293 6296 1
+6294 6296 1
+6297 6296 1
+6295 2565 1
+6295 5814 1
+6295 6296 1
+6299 840 1
+6299 1026 1
+6299 1493 1
+6299 2160 1
+6299 2535 1
+6299 2565 1
+6299 2774 1
+6299 3238 1
+6299 3334 1
+6299 4361 1
+6299 4536 1
+6299 4713 1
+6299 4798 1
+6299 5020 1
+6299 5199 1
+6299 5421 1
+6299 5524 1
+6299 5582 1
+6299 5596 1
+6299 5697 1
+6299 5760 1
+6299 5773 1
+6299 5776 1
+6299 5802 1
+6299 5804 1
+6299 5806 1
+6299 5814 1
+6299 5829 1
+6299 5897 1
+6299 6006 1
+6299 6097 1
+6299 6170 1
+6299 6198 1
+6299 6218 1
+6299 6270 1
+6299 6305 1
+6299 6306 1
+6299 6330 1
+6299 6334 1
+6299 6337 1
+6299 6400 1
+6299 6414 1
+6299 6417 1
+6299 6496 1
+6299 6505 1
+6299 6523 1
+6299 6555 1
+6299 6596 1
+6299 6624 1
+6299 6634 1
+6299 6665 1
+6299 6714 1
+6299 6715 1
+6299 6720 1
+6299 6736 1
+6299 6739 1
+6299 6755 1
+6299 6783 1
+6299 6784 1
+6299 6788 1
+6299 6789 1
+6299 6832 1
+6299 6833 1
+6299 6901 1
+6299 6907 1
+6299 6934 1
+6299 6953 1
+6299 6979 1
+6299 7185 1
+6299 7295 1
+6299 7351 1
+6299 7359 1
+6299 7553 1
+6299 7587 1
+6299 7620 1
+6299 7632 1
+6299 7688 1
+6299 8297 1
+6301 6302 1
+6304 6306 1
+6305 840 1
+6305 1493 1
+6305 1549 1
+6305 1972 1
+6305 1982 1
+6305 2160 1
+6305 2285 1
+6305 2433 1
+6305 2440 1
+6305 2511 1
+6305 2620 1
+6305 2785 1
+6305 2851 1
+6305 2914 1
+6305 3084 1
+6305 3291 1
+6305 3297 1
+6305 3310 1
+6305 3459 1
+6305 3479 1
+6305 3631 1
+6305 3634 1
+6305 3770 1
+6305 3803 1
+6305 3842 1
+6305 3885 1
+6305 3919 1
+6305 4037 1
+6305 4099 1
+6305 4361 1
+6305 4412 1
+6305 4441 1
+6305 4507 1
+6305 4687 1
+6305 4709 1
+6305 4712 1
+6305 4713 1
+6305 4717 1
+6305 4764 1
+6305 4786 1
+6305 4795 1
+6305 4994 1
+6305 5002 1
+6305 5022 1
+6305 5037 1
+6305 5079 1
+6305 5140 1
+6305 5179 1
+6305 5188 1
+6305 5199 1
+6305 5210 1
+6305 5233 1
+6305 5246 1
+6305 5254 1
+6305 5273 1
+6305 5288 1
+6305 5321 1
+6305 5404 1
+6305 5479 1
+6305 5524 1
+6305 5543 1
+6305 5563 1
+6305 5584 1
+6305 5596 1
+6305 5605 1
+6305 5614 1
+6305 5697 1
+6305 5714 1
+6305 5738 1
+6305 5739 1
+6305 5760 1
+6305 5773 1
+6305 5799 1
+6305 5801 1
+6305 5814 1
+6305 5824 1
+6305 5827 1
+6305 5829 1
+6305 5887 1
+6305 5922 1
+6305 5933 1
+6305 5950 1
+6305 5980 1
+6305 5998 1
+6305 6004 1
+6305 6006 1
+6305 6032 1
+6305 6044 1
+6305 6047 1
+6305 6156 1
+6305 6170 1
+6305 6218 1
+6305 6221 1
+6305 6227 1
+6305 6299 1
+6305 6306 1
+6305 6311 1
+6305 6323 1
+6305 6327 1
+6305 6330 1
+6305 6347 1
+6305 6388 1
+6305 6414 1
+6305 6417 1
+6305 6424 1
+6305 6441 1
+6305 6458 1
+6305 6462 1
+6305 6474 1
+6305 6481 1
+6305 6498 1
+6305 6503 1
+6305 6505 1
+6305 6511 1
+6305 6523 1
+6305 6528 1
+6305 6529 1
+6305 6532 1
+6305 6543 1
+6305 6552 1
+6305 6553 1
+6305 6560 1
+6305 6566 1
+6305 6589 1
+6305 6590 1
+6305 6594 1
+6305 6595 1
+6305 6599 1
+6305 6613 1
+6305 6624 1
+6305 6632 1
+6305 6634 1
+6305 6665 1
+6305 6699 1
+6305 6700 1
+6305 6714 1
+6305 6715 1
+6305 6720 1
+6305 6725 1
+6305 6759 1
+6305 6770 1
+6305 6777 1
+6305 6780 1
+6305 6783 1
+6305 6784 1
+6305 6789 1
+6305 6790 1
+6305 6803 1
+6305 6850 1
+6305 6855 1
+6305 6860 1
+6305 6875 1
+6305 6918 1
+6305 6930 1
+6305 6934 1
+6305 6979 1
+6305 6994 1
+6305 7073 1
+6305 7108 1
+6305 7144 1
+6305 7233 1
+6305 7277 1
+6305 7279 1
+6305 7295 1
+6305 7301 1
+6305 7373 1
+6305 7378 1
+6305 7491 1
+6305 7517 1
+6305 7544 1
+6305 7553 1
+6305 7620 1
+6305 7778 1
+6305 7795 1
+6305 7810 1
+6305 7860 1
+6305 7874 1
+6305 7913 1
+6305 7928 1
+6305 7965 1
+6305 8037 1
+6305 8043 1
+6305 8044 1
+6305 8128 1
+6305 8134 1
+6305 8139 1
+6305 8141 1
+6305 8149 1
+6305 8219 1
+6305 8297 1
+6311 7047 1
+6312 4798 1
+6312 5233 1
+6312 6334 1
+6313 5233 1
+6313 6004 1
+6314 1823 1
+6314 2620 1
+6314 4791 1
+6314 5210 1
+6314 5233 1
+6314 6156 1
+6314 6501 1
+6314 6663 1
+6314 6765 1
+6314 8002 1
+6315 5233 1
+6319 4791 1
+6319 5233 1
+6320 3291 1
+6320 3969 1
+6320 4715 1
+6320 5079 1
+6320 5563 1
+6320 5804 1
+6320 6006 1
+6320 6321 1
+6320 6388 1
+6320 6414 1
+6320 6505 1
+6320 6530 1
+6320 6809 1
+6320 6869 1
+6320 6873 1
+6320 7092 1
+6320 7214 1
+6320 7225 1
+6320 7237 1
+6320 7646 1
+6320 7809 1
+6320 7979 1
+6320 8168 1
+6323 1972 1
+6323 2851 1
+6323 3291 1
+6323 3334 1
+6323 3459 1
+6323 4134 1
+6323 4483 1
+6323 4764 1
+6323 5200 1
+6323 5233 1
+6323 5254 1
+6323 5432 1
+6323 5524 1
+6323 5543 1
+6323 5563 1
+6323 5596 1
+6323 5614 1
+6323 5697 1
+6323 5739 1
+6323 5800 1
+6323 5811 1
+6323 5829 1
+6323 5902 1
+6323 6327 1
+6323 6417 1
+6323 6481 1
+6323 6505 1
+6323 6528 1
+6323 6555 1
+6323 6783 1
+6323 6784 1
+6323 6789 1
+6323 6832 1
+6323 6869 1
+6323 6930 1
+6323 6976 1
+6323 6979 1
+6323 7378 1
+6323 7381 1
+6323 7414 1
+6323 7510 1
+6323 7553 1
+6323 7620 1
+6323 7839 1
+6132 5200 1
+6132 6950 1
+6317 2774 1
+6317 3479 1
+6317 4980 1
+6317 5200 1
+6317 6432 1
+6324 2774 1
+6324 3614 1
+6324 4712 1
+6324 4798 1
+6324 5200 1
+6324 5584 1
+6325 4483 1
+6325 5200 1
+6325 5254 1
+6325 6595 1
+6325 6979 1
+6326 4483 1
+6326 5200 1
+6334 3792 1
+6334 5233 1
+6334 6006 1
+6334 6330 1
+6330 6334 1
+6331 6156 1
+6331 6334 1
+6331 8134 1
+6332 6334 1
+6333 6334 1
+6333 7965 1
+6339 6218 1
+6339 6328 1
+6339 6340 1
+6344 1352 1
+6344 5827 1
+6346 1549 1
+6346 2774 1
+6346 3792 1
+6346 3919 1
+6346 4604 1
+6346 5002 1
+6346 5295 1
+6346 5596 1
+6346 6004 1
+6346 6554 1
+6346 6560 1
+6346 6624 1
+6346 6739 1
+6346 6777 1
+6346 6789 1
+6346 6869 1
+6346 7052 1
+6347 2774 1
+6347 4709 1
+6347 5289 1
+6347 5773 1
+6347 6006 1
+6347 6496 1
+6347 7862 1
+6347 7912 1
+6347 7979 1
+6347 8174 1
+6347 8192 1
+6348 2774 1
+6349 2774 1
+6350 2774 1
+4406 2535 1
+5995 2535 1
+5995 4687 1
+6355 2535 1
+6356 2535 1
+6356 5714 1
+6359 1352 1
+6359 1549 1
+6359 2433 1
+6359 3726 1
+6359 3792 1
+6359 3830 1
+6359 4037 1
+6359 4065 1
+6359 4488 1
+6359 4536 1
+6359 4604 1
+6359 4712 1
+6359 4713 1
+6359 4715 1
+6359 4764 1
+6359 4791 1
+6359 4980 1
+6359 5002 1
+6359 5037 1
+6359 5079 1
+6359 5188 1
+6359 5199 1
+6359 5254 1
+6359 5295 1
+6359 5524 1
+6359 5563 1
+6359 5596 1
+6359 5697 1
+6359 5714 1
+6359 5739 1
+6359 5802 1
+6359 5814 1
+6359 5822 1
+6359 5827 1
+6359 5829 1
+6359 5871 1
+6359 6001 1
+6359 6097 1
+6359 6170 1
+6359 6221 1
+6359 6227 1
+6359 6272 1
+6359 6299 1
+6359 6327 1
+6359 6347 1
+6359 6388 1
+6359 6491 1
+6359 6496 1
+6359 6501 1
+6359 6503 1
+6359 6555 1
+6359 6560 1
+6359 6600 1
+6359 6624 1
+6359 6634 1
+6359 6665 1
+6359 6699 1
+6359 6720 1
+6359 6739 1
+6359 6765 1
+6359 6772 1
+6359 6774 1
+6359 6784 1
+6359 6832 1
+6359 6840 1
+6359 6855 1
+6359 6860 1
+6359 6869 1
+6359 6873 1
+6359 6901 1
+6359 6913 1
+6359 6930 1
+6359 6934 1
+6359 6976 1
+6359 7073 1
+6359 7108 1
+6359 7214 1
+6359 7246 1
+6359 7257 1
+6359 7961 1
+6359 8297 1
+6360 840 1
+6360 3346 1
+6360 3479 1
+6360 3614 1
+6360 3809 1
+6360 4037 1
+6360 4687 1
+6360 4715 1
+6360 4798 1
+6360 4980 1
+6360 5012 1
+6360 5384 1
+6360 5484 1
+6360 5798 1
+6360 5804 1
+6360 5922 1
+6360 6218 1
+6360 6327 1
+6360 6337 1
+6360 6388 1
+6360 6414 1
+6360 6417 1
+6360 6560 1
+6360 6736 1
+6360 6994 1
+6360 7054 1
+6360 7073 1
+6360 7074 1
+6360 7108 1
+6360 7119 1
+6360 7143 1
+6360 7144 1
+6360 7214 1
+6360 7323 1
+6360 7442 1
+6298 4798 1
+6298 5254 1
+6298 5709 1
+6298 6328 1
+6298 6400 1
+6298 6409 1
+6298 7632 1
+6366 6328 1
+6351 6218 1
+6371 6218 1
+6374 5804 1
+6375 5804 1
+6377 3459 1
+6377 4713 1
+6377 4764 1
+6377 5288 1
+6377 5321 1
+6377 5596 1
+6377 5798 1
+6377 5829 1
+6377 5871 1
+6377 6347 1
+6377 6388 1
+6377 6665 1
+6377 6770 1
+6377 6783 1
+6377 6833 1
+6377 6850 1
+6377 6855 1
+6378 5798 1
+6378 6739 1
+6379 4798 1
+6380 2223 1
+6380 4401 1
+6380 4798 1
+6380 6897 1
+6381 2433 1
+6381 4798 1
+6381 6850 1
+6327 840 1
+6327 1403 1
+6327 1823 1
+6327 1982 1
+6327 2285 1
+6327 2620 1
+6327 2785 1
+6327 2851 1
+6327 3346 1
+6327 3459 1
+6327 3631 1
+6327 3726 1
+6327 3792 1
+6327 3803 1
+6327 3809 1
+6327 4037 1
+6327 4441 1
+6327 4536 1
+6327 4689 1
+6327 4712 1
+6327 4713 1
+6327 4786 1
+6327 4798 1
+6327 4944 1
+6327 5002 1
+6327 5012 1
+6327 5188 1
+6327 5199 1
+6327 5210 1
+6327 5254 1
+6327 5288 1
+6327 5295 1
+6327 5384 1
+6327 5404 1
+6327 5479 1
+6327 5484 1
+6327 5582 1
+6327 5697 1
+6327 5714 1
+6327 5772 1
+6327 5773 1
+6327 5776 1
+6327 5800 1
+6327 5807 1
+6327 5814 1
+6327 5818 1
+6327 5822 1
+6327 5824 1
+6327 5827 1
+6327 5829 1
+6327 5922 1
+6327 5932 1
+6327 5998 1
+6327 6001 1
+6327 6006 1
+6327 6097 1
+6327 6270 1
+6327 6299 1
+6327 6323 1
+6327 6347 1
+6327 6388 1
+6327 6414 1
+6327 6432 1
+6327 6437 1
+6327 6462 1
+6327 6501 1
+6327 6503 1
+6327 6560 1
+6327 6595 1
+6327 6624 1
+6327 6634 1
+6327 6665 1
+6327 6670 1
+6327 6715 1
+6327 6720 1
+6327 6724 1
+6327 6736 1
+6327 6765 1
+6327 6783 1
+6327 6784 1
+6327 6805 1
+6327 6832 1
+6327 6833 1
+6327 6869 1
+6327 6873 1
+6327 6901 1
+6327 6913 1
+6327 6917 1
+6327 6976 1
+6327 6979 1
+6327 6994 1
+6327 7040 1
+6327 7074 1
+6327 7094 1
+6327 7101 1
+6327 7108 1
+6327 7115 1
+6327 7119 1
+6327 7143 1
+6327 7144 1
+6327 7168 1
+6327 7214 1
+6327 7215 1
+6327 7246 1
+6327 7295 1
+6327 7319 1
+6327 7323 1
+6327 8297 1
+6383 967 1
+6383 4483 1
+6383 7855 1
+6387 6388 1
+5965 4037 1
+5965 5254 1
+5965 6337 1
+6389 6337 1
+6391 6400 1
+6392 6400 1
+6393 6400 1
+6394 1972 1
+6394 3634 1
+6394 4994 1
+6394 6006 1
+6394 6400 1
+6394 6529 1
+6394 6571 1
+6394 6634 1
+6399 6400 1
+6395 6400 1
+6396 6400 1
+6397 6400 1
+6398 4507 1
+6398 4709 1
+6398 5002 1
+6398 5714 1
+6398 5814 1
+6398 5871 1
+6398 6270 1
+6398 6400 1
+6398 6555 1
+6398 6770 1
+6398 6774 1
+6398 6833 1
+6398 6850 1
+6398 6869 1
+6398 6892 1
+6398 6955 1
+6398 7040 1
+6398 7185 1
+6398 7225 1
+6398 7243 1
+6398 7254 1
+6398 7553 1
+6398 7620 1
+6398 7763 1
+6398 8073 1
+6398 8224 1
+6398 8235 1
+6398 8249 1
+6398 8297 1
+6406 6407 1
+6406 6770 1
+6408 6409 1
+6408 7144 1
+6408 7149 1
+6410 4687 1
+6411 4687 1
+6412 4687 1
+6413 4687 1
+6414 2565 1
+6414 4037 1
+6414 5022 1
+6414 5582 1
+6414 6560 1
+6414 6567 1
+6414 6571 1
+6414 6634 1
+6414 6913 1
+6414 6914 1
+6414 6918 1
+6414 7021 1
+6414 7116 1
+6414 7553 1
+6414 7574 1
+6414 7587 1
+6414 7620 1
+6414 7632 1
+6414 7839 1
+6414 7874 1
+6414 8178 1
+6415 2620 1
+6415 6417 1
+6415 7054 1
+6415 7510 1
+6416 6327 1
+6416 6417 1
+6422 4712 1
+6422 5020 1
+6422 5697 1
+6422 5822 1
+6422 6560 1
+6422 6634 1
+6422 6762 1
+6422 6770 1
+6422 6983 1
+6422 7063 1
+6422 7809 1
+6421 1982 1
+6421 3084 1
+6421 3919 1
+6421 5210 1
+6421 5295 1
+6421 5543 1
+6421 5697 1
+6421 5807 1
+6421 5829 1
+6421 5839 1
+6421 5922 1
+6421 6001 1
+6421 6388 1
+6421 6422 1
+6421 6523 1
+6421 6634 1
+6421 6670 1
+6421 6805 1
+6421 6934 1
+6421 6993 1
+6421 7393 1
+6421 7701 1
+6421 7928 1
+6423 5738 1
+6424 5738 1
+6424 6481 1
+6426 6427 1
+6429 5439 1
+6428 1972 1
+6428 5439 1
+6428 6498 1
+6430 6432 1
+6431 6432 1
+6436 6004 1
+6436 6437 1
+6436 6803 1
+6439 6441 1
+6440 4099 1
+6440 5254 1
+6440 6441 1
+6442 3238 1
+6442 6006 1
+6442 7567 1
+6442 7620 1
+6443 1026 1
+6443 2160 1
+6443 2433 1
+6443 2565 1
+6443 2620 1
+6443 2785 1
+6443 2851 1
+6443 3084 1
+6443 3238 1
+6443 3310 1
+6443 3334 1
+6443 3459 1
+6443 4037 1
+6443 4071 1
+6443 4099 1
+6443 4134 1
+6443 4361 1
+6443 5002 1
+6443 5020 1
+6443 5022 1
+6443 5210 1
+6443 5233 1
+6443 5254 1
+6443 5321 1
+6443 5697 1
+6443 5800 1
+6443 5902 1
+6443 5932 1
+6443 6006 1
+6443 6151 1
+6443 6156 1
+6443 6270 1
+6443 6299 1
+6443 6320 1
+6443 6388 1
+6443 6523 1
+6443 6560 1
+6443 6600 1
+6443 6634 1
+6443 6789 1
+6443 6832 1
+6443 6855 1
+6443 6913 1
+6443 6914 1
+6443 6918 1
+6443 7050 1
+6443 7054 1
+6443 7108 1
+6443 7115 1
+6443 7131 1
+6443 7168 1
+6443 7214 1
+6443 7238 1
+6443 7301 1
+6443 7510 1
+6443 7517 1
+6443 7553 1
+6443 7587 1
+6443 7620 1
+6443 7632 1
+6443 7646 1
+6443 7699 1
+6443 7788 1
+6443 7795 1
+6443 7833 1
+6443 7890 1
+6443 7924 1
+6443 8134 1
+6443 8141 1
+6443 8224 1
+6444 6006 1
+6448 6006 1
+6445 4037 1
+6445 5933 1
+6445 6006 1
+6445 6914 1
+6445 7855 1
+6445 7912 1
+6445 7927 1
+850 1026 1
+850 6006 1
+850 7400 1
+850 7632 1
+6446 6006 1
+6447 1352 1
+6447 4099 1
+6447 4712 1
+6447 5824 1
+6447 6006 1
+6447 6170 1
+6447 6474 1
+6447 6481 1
+6447 6498 1
+6447 6501 1
+6447 6554 1
+6447 6594 1
+6458 1352 1
+6458 2160 1
+6458 4037 1
+6458 4099 1
+6458 4488 1
+6458 4709 1
+6458 5028 1
+6458 5273 1
+6458 5543 1
+6458 5760 1
+6458 5818 1
+6458 6000 1
+6458 6004 1
+6458 6330 1
+6458 6600 1
+6458 6606 1
+6458 6613 1
+6458 6670 1
+6458 6869 1
+6458 6907 1
+6458 6930 1
+6458 7073 1
+6458 7108 1
+6458 7115 1
+6458 7225 1
+6458 7386 1
+6458 7855 1
+6458 8163 1
+6450 6458 1
+6451 6458 1
+6452 6458 1
+6452 8297 1
+6453 6458 1
+6454 6458 1
+6455 6458 1
+6456 5714 1
+6456 6458 1
+6456 6930 1
+6457 6458 1
+6457 8141 1
+6459 6458 1
+6459 7108 1
+6461 155 1
+6461 967 1
+6461 2565 1
+6461 4361 1
+6461 6327 1
+6461 6715 1
+6462 1972 1
+6462 6327 1
+6462 6511 1
+6466 6424 1
+6467 1352 1
+6467 2620 1
+6467 4712 1
+6467 4717 1
+6467 4994 1
+6467 5254 1
+6467 6156 1
+6467 6424 1
+6468 6424 1
+6469 2620 1
+6469 6424 1
+6470 6472 1
+6471 1982 1
+6471 6472 1
+6471 6511 1
+6471 6790 1
+6471 7040 1
+6474 7649 1
+6477 4099 1
+6479 2620 1
+6479 3459 1
+6479 3634 1
+6479 4037 1
+6479 4099 1
+6479 5254 1
+6479 5273 1
+6479 5714 1
+6479 6000 1
+6479 6004 1
+6479 6552 1
+6479 6566 1
+6479 6595 1
+6478 4099 1
+6480 6481 1
+6483 2160 1
+6483 2620 1
+6483 3291 1
+6483 4441 1
+6483 4791 1
+6483 5002 1
+6483 5254 1
+6483 5827 1
+6483 5950 1
+6483 6156 1
+6483 6299 1
+6483 6496 1
+6483 6560 1
+6483 6595 1
+6483 6599 1
+6483 6606 1
+6483 6621 1
+6483 6628 1
+6483 6632 1
+6483 6661 1
+6483 6668 1
+6483 6707 1
+6483 6720 1
+6483 6721 1
+6483 6723 1
+6483 6755 1
+6483 6789 1
+6483 8297 1
+6484 2851 1
+6484 3238 1
+6484 5822 1
+6484 5998 1
+6484 6496 1
+6484 7021 1
+6484 7092 1
+6484 7890 1
+6484 8174 1
+6484 8192 1
+6485 6496 1
+6486 840 1
+6486 1403 1
+6486 2511 1
+6486 2851 1
+6486 2940 1
+6486 3726 1
+6486 3919 1
+6486 4218 1
+6486 4791 1
+6486 4879 1
+6486 4944 1
+6486 4966 1
+6486 4992 1
+6486 5002 1
+6486 5233 1
+6486 5254 1
+6486 5273 1
+6486 5289 1
+6486 5393 1
+6486 5404 1
+6486 5432 1
+6486 5524 1
+6486 5582 1
+6486 5596 1
+6486 5739 1
+6486 5773 1
+6486 5800 1
+6486 5806 1
+6486 5811 1
+6486 5814 1
+6486 5872 1
+6486 5998 1
+6486 6000 1
+6486 6097 1
+6486 6123 1
+6486 6323 1
+6486 6327 1
+6486 6496 1
+6486 6503 1
+6486 6555 1
+6486 6560 1
+6486 6600 1
+6486 6606 1
+6486 6624 1
+6486 6634 1
+6486 6665 1
+6486 6715 1
+6486 6725 1
+6486 6736 1
+6486 6765 1
+6486 6774 1
+6486 6784 1
+6486 6832 1
+6486 6873 1
+6486 6907 1
+6486 6913 1
+6486 6976 1
+6486 6994 1
+6486 7023 1
+6486 7108 1
+6486 7143 1
+6486 7162 1
+6486 7185 1
+6486 7214 1
+6486 7237 1
+6486 7246 1
+6486 7301 1
+6486 7304 1
+6486 7306 1
+6486 7315 1
+6486 7365 1
+6486 7381 1
+6486 7386 1
+6486 7391 1
+6486 7400 1
+6486 7414 1
+6486 7436 1
+6486 7439 1
+6486 7491 1
+6486 7529 1
+6486 7553 1
+6486 7587 1
+6486 7588 1
+6486 7620 1
+6486 7632 1
+6487 5037 1
+6487 5802 1
+6487 6496 1
+6487 6755 1
+6488 2160 1
+6488 2620 1
+6488 3459 1
+6488 3634 1
+6488 4713 1
+6488 4717 1
+6488 5210 1
+6488 5254 1
+6488 5524 1
+6488 5739 1
+6488 5800 1
+6488 5871 1
+6488 6170 1
+6488 6327 1
+6488 6496 1
+6488 6560 1
+6488 6628 1
+6488 6634 1
+6488 6770 1
+6488 6869 1
+6488 6873 1
+6488 6982 1
+6489 6330 1
+6489 6496 1
+6490 6496 1
+6490 6790 1
+6491 5002 1
+6491 5802 1
+6491 5824 1
+6491 6496 1
+6492 5802 1
+6492 6496 1
+6493 6496 1
+6494 1549 1
+6494 2160 1
+6494 2940 1
+6494 3084 1
+6494 3238 1
+6494 3381 1
+6494 3459 1
+6494 3631 1
+6494 3752 1
+6494 3792 1
+6494 4065 1
+6494 4071 1
+6494 4709 1
+6494 4875 1
+6494 4884 1
+6494 4940 1
+6494 4983 1
+6494 5002 1
+6494 5022 1
+6494 5028 1
+6494 5079 1
+6494 5179 1
+6494 5233 1
+6494 5254 1
+6494 5393 1
+6494 5524 1
+6494 5529 1
+6494 5543 1
+6494 5596 1
+6494 5714 1
+6494 5760 1
+6494 5799 1
+6494 5800 1
+6494 5806 1
+6494 5811 1
+6494 5814 1
+6494 5897 1
+6494 5922 1
+6494 6004 1
+6494 6032 1
+6494 6305 1
+6494 6320 1
+6494 6330 1
+6494 6496 1
+6494 6523 1
+6494 6555 1
+6494 6596 1
+6494 6759 1
+6494 6765 1
+6494 6790 1
+6494 6832 1
+6494 6833 1
+6494 6860 1
+6494 6873 1
+6494 6892 1
+6494 6897 1
+6494 6914 1
+6494 6920 1
+6494 6933 1
+6494 6938 1
+6494 6946 1
+6494 6955 1
+6494 6979 1
+6494 6982 1
+6494 6993 1
+6494 7023 1
+6494 7047 1
+6494 7052 1
+6494 7054 1
+6494 7059 1
+6494 7092 1
+6494 7101 1
+6494 7115 1
+6494 7279 1
+6494 7280 1
+6494 7301 1
+6494 7319 1
+6494 7351 1
+6494 7362 1
+6494 7373 1
+6494 7386 1
+6494 7400 1
+6494 7414 1
+6494 7443 1
+6494 7618 1
+6494 7620 1
+6494 7624 1
+6494 7642 1
+6494 7653 1
+6494 7688 1
+6494 7695 1
+6494 7763 1
+6494 7799 1
+6494 7833 1
+6494 7871 1
+6494 7890 1
+6494 7979 1
+6494 7996 1
+6494 8019 1
+6494 8025 1
+6494 8174 1
+6495 6496 1
+6495 7316 1
+6497 6498 1
+6500 2160 1
+6500 3792 1
+6500 5714 1
+6500 5799 1
+6500 6004 1
+6500 6566 1
+6500 6930 1
+6500 7301 1
+6501 3334 1
+6501 3459 1
+6501 3842 1
+6501 4507 1
+6501 5079 1
+6501 5210 1
+6501 5254 1
+6501 5321 1
+6501 5543 1
+6501 5739 1
+6501 5799 1
+6501 5827 1
+6501 6004 1
+6501 6599 1
+6501 6803 1
+6501 6897 1
+6501 6918 1
+6502 3238 1
+6502 4981 1
+6502 5022 1
+6502 5799 1
+6502 6044 1
+6502 6914 1
+6502 7115 1
+6502 7624 1
+6502 7879 1
+6502 7961 1
+6502 8134 1
+6502 8174 1
+6503 3634 1
+6503 5799 1
+6503 6221 1
+6503 6554 1
+6504 1972 1
+6504 4604 1
+6504 4994 1
+6504 5479 1
+6504 5827 1
+6504 6505 1
+6504 6600 1
+6506 5140 1
+6507 5140 1
+6508 5140 1
+6509 5140 1
+6510 1823 1
+6510 2160 1
+6510 3084 1
+6510 3293 1
+6510 3297 1
+6510 3346 1
+6510 3459 1
+6510 4709 1
+6510 4713 1
+6510 4875 1
+6510 4994 1
+6510 5002 1
+6510 5020 1
+6510 5022 1
+6510 5179 1
+6510 5254 1
+6510 5384 1
+6510 5465 1
+6510 5800 1
+6510 6000 1
+6510 6347 1
+6510 6388 1
+6510 6511 1
+6510 6523 1
+6510 6560 1
+6510 6566 1
+6510 6599 1
+6510 6665 1
+6510 6720 1
+6510 6725 1
+6510 6736 1
+6510 6765 1
+6510 6789 1
+6510 6803 1
+6510 6809 1
+6510 6832 1
+6510 6833 1
+6510 6850 1
+6510 6913 1
+6510 6934 1
+6510 6946 1
+6510 7052 1
+6510 7351 1
+6510 7442 1
+6510 7544 1
+6510 7553 1
+6510 7587 1
+6510 7620 1
+6510 7647 1
+6510 7694 1
+6510 7707 1
+6510 7795 1
+6510 7835 1
+6510 8134 1
+6513 4994 1
+6514 4994 1
+6515 4994 1
+6516 5479 1
+6517 1972 1
+6517 4713 1
+6518 1403 1
+6518 2589 1
+6518 2851 1
+6518 3459 1
+6518 3631 1
+6518 3885 1
+6518 4748 1
+6518 4875 1
+6518 4884 1
+6518 5002 1
+6518 5199 1
+6518 5814 1
+6518 5872 1
+6518 5922 1
+6518 5998 1
+6518 6032 1
+6518 6097 1
+6518 6327 1
+6518 6442 1
+6518 6634 1
+6518 6665 1
+6518 6784 1
+6518 6832 1
+6518 6976 1
+6518 6980 1
+6518 6994 1
+6518 7021 1
+6518 7052 1
+6518 7092 1
+6518 7277 1
+6518 7279 1
+6518 7422 1
+6518 7553 1
+6519 2433 1
+6520 2433 1
+6520 7280 1
+6521 2433 1
+6522 1493 1
+6522 2160 1
+6522 2433 1
+6522 4488 1
+6522 4536 1
+6522 4713 1
+6522 4764 1
+6522 5254 1
+6522 5321 1
+6522 5596 1
+6522 5829 1
+6522 5871 1
+6522 6004 1
+6522 6323 1
+6522 6347 1
+6522 6388 1
+6522 6560 1
+6522 6770 1
+6522 6777 1
+6522 6783 1
+6522 6789 1
+6522 6803 1
+6522 6809 1
+6522 6813 1
+6522 6833 1
+6522 6840 1
+6522 6855 1
+6522 6869 1
+6522 6873 1
+6523 1549 1
+6523 2433 1
+6523 3084 1
+6523 3334 1
+6523 3459 1
+6523 3962 1
+6523 4037 1
+6523 4507 1
+6523 4536 1
+6523 5079 1
+6523 5148 1
+6523 5524 1
+6523 5543 1
+6523 5655 1
+6523 5697 1
+6523 5714 1
+6523 5800 1
+6523 5839 1
+6523 5902 1
+6523 5932 1
+6523 6305 1
+6523 6330 1
+6523 6555 1
+6523 6634 1
+6523 6774 1
+6523 6832 1
+6523 6934 1
+6523 6948 1
+6523 6976 1
+6523 7115 1
+6523 7414 1
+6523 7620 1
+6523 7839 1
+6524 2433 1
+6524 5807 1
+6524 6914 1
+6524 7063 1
+6524 7478 1
+6524 7910 1
+6524 7992 1
+6524 8178 1
+6525 840 1
+6525 2433 1
+6525 2565 1
+6525 4536 1
+6525 4713 1
+6525 5543 1
+6525 5811 1
+6525 5829 1
+6525 6004 1
+6525 6414 1
+6525 6613 1
+6525 6634 1
+6525 6790 1
+6525 6803 1
+6525 6979 1
+6525 7119 1
+6525 8297 1
+6526 2160 1
+6526 2433 1
+6526 5321 1
+6526 5829 1
+6526 5871 1
+6526 6004 1
+6526 6323 1
+6526 6770 1
+6526 6783 1
+6526 6805 1
+6526 6840 1
+6527 6528 1
+6460 967 1
+6460 1498 1
+6460 2440 1
+6460 2620 1
+6460 3291 1
+6460 3334 1
+6460 3962 1
+6460 4689 1
+6460 4717 1
+6460 4875 1
+6460 4966 1
+6460 4981 1
+6460 5020 1
+6460 5079 1
+6460 5179 1
+6460 5188 1
+6460 5643 1
+6460 5800 1
+6460 5819 1
+6460 5839 1
+6460 5950 1
+6460 6032 1
+6460 6529 1
+6460 6553 1
+6460 6554 1
+6460 6555 1
+6460 6560 1
+6460 6567 1
+6460 6596 1
+6460 6699 1
+6460 6759 1
+6460 6946 1
+6460 6993 1
+6460 7021 1
+6460 7092 1
+6460 7277 1
+6460 7386 1
+6460 7414 1
+6460 7442 1
+6460 7491 1
+6460 7497 1
+6460 7498 1
+6460 7701 1
+6460 7765 1
+6460 7799 1
+6460 7803 1
+6460 7809 1
+6460 7835 1
+6460 7857 1
+6460 7910 1
+6460 7912 1
+6460 7921 1
+6460 7924 1
+6460 7952 1
+6460 7994 1
+6460 7996 1
+6460 8019 1
+6460 8042 1
+6533 4791 1
+6534 4791 1
+6537 1823 1
+6537 4791 1
+6537 6567 1
+6537 6599 1
+6537 6606 1
+6535 4791 1
+6538 2285 1
+6538 3459 1
+6538 4791 1
+6538 5179 1
+6538 5563 1
+6538 5902 1
+6538 6004 1
+6538 6388 1
+6538 6665 1
+6538 6769 1
+6538 6789 1
+6538 6850 1
+6538 6918 1
+6538 7116 1
+6538 7529 1
+6538 7620 1
+6538 7632 1
+6538 7819 1
+6538 8132 1
+6538 8141 1
+6538 8148 1
+6539 4791 1
+6536 4791 1
+6536 7879 1
+6541 4507 1
+6542 4507 1
+6544 3634 1
+6545 3634 1
+6545 4709 1
+6545 6156 1
+6545 6595 1
+6545 6663 1
+6546 3634 1
+6546 4709 1
+6547 3634 1
+6548 2940 1
+6548 3634 1
+6548 3842 1
+6548 4071 1
+6548 6442 1
+6548 7092 1
+6548 7381 1
+6548 7544 1
+6548 7553 1
+6548 7788 1
+6550 1498 1
+6550 4401 1
+6550 5079 1
+6550 5812 1
+6550 6553 1
+6550 7238 1
+6550 7553 1
+6550 7927 1
+6550 8249 1
+6555 2589 1
+6555 2785 1
+6555 2851 1
+6555 3381 1
+6555 3459 1
+6555 4361 1
+6555 4632 1
+6555 5002 1
+6555 5079 1
+6555 5199 1
+6555 5760 1
+6555 5811 1
+6555 5814 1
+6555 6004 1
+6555 6299 1
+6555 6523 1
+6555 6554 1
+6555 6560 1
+6555 6566 1
+6555 6699 1
+6555 6772 1
+6555 6832 1
+6555 7092 1
+6555 7146 1
+6555 7214 1
+6555 7225 1
+6555 7243 1
+6555 7351 1
+6555 7414 1
+6555 7434 1
+6555 7553 1
+6555 7632 1
+6555 7651 1
+6555 7726 1
+6555 7809 1
+5273 3334 1
+5273 3459 1
+5273 4536 1
+5273 4717 1
+5273 4764 1
+5273 5079 1
+5273 5254 1
+5273 5295 1
+5273 5596 1
+5273 7021 1
+5273 7632 1
+5273 7839 1
+6560 840 1
+6560 3084 1
+6560 3459 1
+6560 4401 1
+6560 4435 1
+6560 4713 1
+6560 4717 1
+6560 5079 1
+6560 5199 1
+6560 5233 1
+6560 5404 1
+6560 5776 1
+6560 5800 1
+6560 5811 1
+6560 5818 1
+6560 5839 1
+6560 5932 1
+6560 6123 1
+6560 6198 1
+6560 6327 1
+6560 6523 1
+6560 6596 1
+6560 6736 1
+6560 6770 1
+6560 6789 1
+6560 6832 1
+6560 6913 1
+6560 6946 1
+6560 6976 1
+6560 6980 1
+6560 6994 1
+6560 7092 1
+6560 7214 1
+6560 7381 1
+6560 7386 1
+6560 7414 1
+6560 7553 1
+6560 7632 1
+6560 7701 1
+6560 7757 1
+6560 7813 1
+6560 7833 1
+6560 8192 1
+6561 967 1
+6561 4604 1
+6561 4717 1
+6565 6566 1
+6123 3334 1
+6123 3459 1
+6123 4488 1
+6123 5524 1
+6123 5563 1
+6123 5697 1
+6123 5760 1
+6123 5822 1
+6123 5871 1
+6123 5902 1
+6123 6568 1
+6123 6774 1
+6123 6784 1
+6123 6832 1
+6123 7185 1
+6123 7204 1
+6123 7254 1
+6123 7381 1
+6123 7414 1
+6123 7439 1
+6123 7497 1
+6123 7498 1
+6123 7624 1
+6123 7632 1
+6570 5872 1
+6570 7301 1
+6570 7795 1
+6570 7908 1
+6572 4689 1
+6573 4689 1
+6574 6576 1
+6575 6576 1
+6563 1493 1
+6563 1982 1
+6563 2440 1
+6563 2565 1
+6563 3803 1
+6563 3962 1
+6563 4037 1
+6563 4361 1
+6563 4536 1
+6563 4875 1
+6563 4981 1
+6563 5002 1
+6563 5079 1
+6563 5254 1
+6563 5421 1
+6563 5465 1
+6563 5714 1
+6563 5739 1
+6563 5745 1
+6563 5773 1
+6563 5814 1
+6563 5897 1
+6563 5902 1
+6563 6097 1
+6563 6123 1
+6563 6299 1
+6563 6305 1
+6563 6327 1
+6563 6414 1
+6563 6634 1
+6563 6832 1
+6563 6860 1
+6563 6873 1
+6563 6907 1
+6563 6934 1
+6563 6946 1
+6563 6979 1
+6563 6982 1
+6563 6994 1
+6563 7052 1
+6563 7054 1
+6563 7108 1
+6563 7144 1
+6563 7214 1
+6563 7233 1
+6563 7279 1
+6563 7378 1
+6563 7436 1
+6563 7618 1
+6563 7620 1
+6563 7646 1
+6563 7651 1
+6563 7757 1
+6563 7778 1
+6563 7809 1
+6563 7839 1
+6563 7840 1
+6563 7927 1
+6577 2160 1
+6577 2440 1
+6577 4134 1
+6577 5254 1
+6577 5524 1
+6577 6227 1
+6577 6699 1
+6577 6897 1
+6577 6934 1
+6577 8297 1
+6578 2285 1
+6579 2285 1
+6580 2285 1
+6586 2285 1
+6581 2285 1
+6582 2285 1
+6583 2285 1
+6587 2285 1
+6584 2285 1
+6588 2285 1
+6585 2285 1
+6592 6323 1
+6552 1026 1
+6552 3334 1
+6552 3459 1
+6552 4071 1
+6552 4944 1
+6552 5002 1
+6552 5022 1
+6552 5079 1
+6552 5254 1
+6552 5295 1
+6552 5839 1
+6552 5998 1
+6552 6221 1
+6552 6243 1
+6552 6327 1
+6552 6523 1
+6552 6594 1
+6552 6832 1
+6552 6979 1
+6552 7050 1
+6552 7052 1
+6552 7168 1
+6552 7323 1
+6552 7414 1
+6552 7620 1
+6552 7632 1
+6552 7699 1
+6552 7809 1
+6552 8121 1
+6595 1026 1
+6595 4712 1
+6595 5020 1
+6595 5295 1
+6595 5596 1
+6595 6594 1
+6595 6715 1
+6595 6832 1
+6595 6948 1
+6595 7279 1
+6595 7414 1
+6595 7632 1
+6596 967 1
+6596 1191 1
+6596 1498 1
+6596 1865 1
+6596 1982 1
+6596 2223 1
+6596 2565 1
+6596 2658 1
+6596 3238 1
+6596 3293 1
+6596 3297 1
+6596 3310 1
+6596 3334 1
+6596 3381 1
+6596 3752 1
+6596 3962 1
+6596 4037 1
+6596 4071 1
+6596 4401 1
+6596 4432 1
+6596 4435 1
+6596 4507 1
+6596 4604 1
+6596 4712 1
+6596 4884 1
+6596 4940 1
+6596 4981 1
+6596 4983 1
+6596 5002 1
+6596 5028 1
+6596 5064 1
+6596 5079 1
+6596 5096 1
+6596 5148 1
+6596 5179 1
+6596 5199 1
+6596 5246 1
+6596 5378 1
+6596 5421 1
+6596 5465 1
+6596 5466 1
+6596 5529 1
+6596 5596 1
+6596 5605 1
+6596 5643 1
+6596 5671 1
+6596 5738 1
+6596 5812 1
+6596 5839 1
+6596 5871 1
+6596 5933 1
+6596 5969 1
+6596 6032 1
+6596 6151 1
+6596 6174 1
+6596 6241 1
+6596 6299 1
+6596 6320 1
+6596 6422 1
+6596 6503 1
+6596 6523 1
+6596 6555 1
+6596 6560 1
+6596 6618 1
+6596 6634 1
+6596 6712 1
+6596 6759 1
+6596 6774 1
+6596 6783 1
+6596 6789 1
+6596 6875 1
+6596 6913 1
+6596 6914 1
+6596 6918 1
+6596 6934 1
+6596 6946 1
+6596 6980 1
+6596 6993 1
+6596 7005 1
+6596 7012 1
+6596 7021 1
+6596 7047 1
+6596 7059 1
+6596 7063 1
+6596 7092 1
+6596 7094 1
+6596 7116 1
+6596 7120 1
+6596 7225 1
+6596 7233 1
+6596 7238 1
+6596 7277 1
+6596 7280 1
+6596 7341 1
+6596 7351 1
+6596 7386 1
+6596 7389 1
+6596 7391 1
+6596 7397 1
+6596 7443 1
+6596 7544 1
+6596 7553 1
+6596 7574 1
+6596 7587 1
+6596 7618 1
+6596 7620 1
+6596 7624 1
+6596 7632 1
+6596 7646 1
+6596 7647 1
+6596 7648 1
+6596 7649 1
+6596 7651 1
+6596 7652 1
+6596 7662 1
+6596 7668 1
+6596 7683 1
+6596 7688 1
+6596 7694 1
+6596 7695 1
+6596 7699 1
+6596 7707 1
+6596 7726 1
+6596 7730 1
+6596 7757 1
+6596 7763 1
+6596 7778 1
+6596 7788 1
+6596 7791 1
+6596 7795 1
+6596 7803 1
+6596 7809 1
+6596 7810 1
+6596 7833 1
+6596 7835 1
+6596 7839 1
+6596 7855 1
+6596 7862 1
+6596 7871 1
+6596 7879 1
+6596 7882 1
+6596 7890 1
+6596 7908 1
+6596 7910 1
+6596 7912 1
+6596 7913 1
+6596 7921 1
+6596 7924 1
+6596 7946 1
+6596 7952 1
+6596 7961 1
+6596 7965 1
+6596 7979 1
+6596 8002 1
+6596 8050 1
+6596 8051 1
+6596 8073 1
+6596 8083 1
+6596 8090 1
+6596 8121 1
+6596 8122 1
+6596 8124 1
+6596 8128 1
+6596 8130 1
+6596 8163 1
+6596 8168 1
+6596 8169 1
+6596 8174 1
+6596 8178 1
+6596 8186 1
+6596 8192 1
+6596 8198 1
+6596 8209 1
+6596 8212 1
+6596 8219 1
+6596 8237 1
+6596 8249 1
+6598 1403 1
+6598 5002 1
+6598 5543 1
+6598 5902 1
+6598 6599 1
+6598 7855 1
+6601 6600 1
+6602 6600 1
+6603 6600 1
+6604 6600 1
+6605 1352 1
+6605 2620 1
+6605 4712 1
+6605 5210 1
+6605 5950 1
+6605 6156 1
+6605 6501 1
+6605 6600 1
+6605 6632 1
+6605 6634 1
+6607 1352 1
+6607 4712 1
+6607 5827 1
+6607 6047 1
+6608 2160 1
+6608 3830 1
+6608 4065 1
+6608 4441 1
+6608 4709 1
+6608 5188 1
+6608 5254 1
+6608 5818 1
+6608 5824 1
+6608 5827 1
+6608 5829 1
+6608 5871 1
+6608 5950 1
+6608 6323 1
+6608 6665 1
+6608 6707 1
+6608 6770 1
+6608 6778 1
+6612 5012 1
+6612 6305 1
+6612 6330 1
+6612 6765 1
+6612 6938 1
+6612 6953 1
+6612 7115 1
+6618 840 1
+6618 2565 1
+6618 2785 1
+6618 3293 1
+6618 3297 1
+6618 3803 1
+6618 4037 1
+6618 4666 1
+6618 4934 1
+6618 4940 1
+6618 4944 1
+6618 4992 1
+6618 5002 1
+6618 5012 1
+6618 5022 1
+6618 5179 1
+6618 5210 1
+6618 5233 1
+6618 5246 1
+6618 5432 1
+6618 5465 1
+6618 5524 1
+6618 5543 1
+6618 5697 1
+6618 5773 1
+6618 5776 1
+6618 5800 1
+6618 5806 1
+6618 5807 1
+6618 5812 1
+6618 5814 1
+6618 5822 1
+6618 5932 1
+6618 5998 1
+6618 6000 1
+6618 6001 1
+6618 6097 1
+6618 6123 1
+6618 6270 1
+6618 6272 1
+6618 6305 1
+6618 6320 1
+6618 6327 1
+6618 6634 1
+6618 6765 1
+6618 6780 1
+6618 6784 1
+6618 6832 1
+6618 6860 1
+6618 6913 1
+6618 6924 1
+6618 6946 1
+6618 6955 1
+6618 6994 1
+6618 7040 1
+6618 7073 1
+6618 7094 1
+6618 7101 1
+6618 7115 1
+6618 7116 1
+6618 7119 1
+6618 7131 1
+6618 7144 1
+6618 7161 1
+6618 7238 1
+6618 7243 1
+6618 7262 1
+6618 7279 1
+6618 7280 1
+6618 7306 1
+6618 7318 1
+6618 7381 1
+6618 7389 1
+6618 7414 1
+6618 7490 1
+6618 7529 1
+6618 7533 1
+6618 7553 1
+6618 7561 1
+6618 7604 1
+6618 7620 1
+6618 7632 1
+6618 7683 1
+6618 7765 1
+6618 7810 1
+6618 7833 1
+6618 7961 1
+6618 8121 1
+6618 8130 1
+6618 8169 1
+6618 8276 1
+6619 155 1
+6619 1403 1
+6619 2511 1
+6619 2589 1
+6619 2851 1
+6619 2940 1
+6619 3334 1
+6619 3346 1
+6619 3726 1
+6619 4218 1
+6619 4361 1
+6619 4536 1
+6619 4666 1
+6619 4944 1
+6619 5002 1
+6619 5012 1
+6619 5020 1
+6619 5233 1
+6619 5298 1
+6619 5404 1
+6619 5421 1
+6619 5432 1
+6619 5465 1
+6619 5524 1
+6619 5760 1
+6619 5773 1
+6619 5800 1
+6619 5806 1
+6619 5811 1
+6619 5814 1
+6619 5822 1
+6619 5872 1
+6619 5897 1
+6619 5932 1
+6619 5969 1
+6619 5998 1
+6619 6097 1
+6619 6123 1
+6619 6227 1
+6619 6243 1
+6619 6272 1
+6619 6299 1
+6619 6305 1
+6619 6327 1
+6619 6330 1
+6619 6417 1
+6619 6442 1
+6619 6555 1
+6619 6596 1
+6619 6634 1
+6619 6765 1
+6619 6774 1
+6619 6784 1
+6619 6789 1
+6619 6832 1
+6619 6855 1
+6619 6897 1
+6619 6913 1
+6619 6930 1
+6619 6934 1
+6619 6946 1
+6619 6955 1
+6619 6976 1
+6619 7092 1
+6619 7101 1
+6619 7108 1
+6619 7115 1
+6619 7116 1
+6619 7144 1
+6619 7162 1
+6619 7185 1
+6619 7186 1
+6619 7214 1
+6619 7237 1
+6619 7279 1
+6619 7295 1
+6619 7306 1
+6619 7315 1
+6619 7323 1
+6619 7341 1
+6619 7362 1
+6619 7373 1
+6619 7381 1
+6619 7386 1
+6619 7387 1
+6619 7397 1
+6619 7400 1
+6619 7414 1
+6619 7423 1
+6619 7436 1
+6619 7439 1
+6619 7440 1
+6619 7508 1
+6619 7510 1
+6619 7529 1
+6619 7553 1
+6619 7593 1
+6619 7624 1
+6619 7632 1
+6619 7642 1
+6619 7648 1
+6619 7651 1
+6619 7658 1
+6619 7662 1
+6613 3809 1
+6613 4037 1
+6613 4666 1
+6613 5384 1
+6613 6305 1
+6613 6414 1
+6613 6948 1
+6613 7587 1
+6613 7620 1
+6614 4037 1
+6614 6305 1
+6615 1403 1
+6615 1549 1
+6615 1865 1
+6615 1982 1
+6615 2160 1
+6615 2511 1
+6615 2565 1
+6615 2785 1
+6615 2851 1
+6615 2940 1
+6615 3310 1
+6615 3334 1
+6615 3346 1
+6615 3381 1
+6615 3459 1
+6615 3631 1
+6615 3726 1
+6615 3792 1
+6615 3809 1
+6615 3885 1
+6615 4037 1
+6615 4218 1
+6615 4361 1
+6615 4488 1
+6615 4536 1
+6615 4666 1
+6615 4713 1
+6615 4764 1
+6615 4944 1
+6615 4992 1
+6615 5012 1
+6615 5148 1
+6615 5199 1
+6615 5233 1
+6615 5288 1
+6615 5295 1
+6615 5321 1
+6615 5384 1
+6615 5404 1
+6615 5432 1
+6615 5484 1
+6615 5543 1
+6615 5563 1
+6615 5582 1
+6615 5596 1
+6615 5671 1
+6615 5697 1
+6615 5739 1
+6615 5760 1
+6615 5773 1
+6615 5776 1
+6615 5800 1
+6615 5807 1
+6615 5811 1
+6615 5814 1
+6615 5818 1
+6615 5822 1
+6615 5829 1
+6615 5871 1
+6615 5897 1
+6615 5922 1
+6615 6001 1
+6615 6004 1
+6615 6097 1
+6615 6123 1
+6615 6198 1
+6615 6270 1
+6615 6272 1
+6615 6299 1
+6615 6305 1
+6615 6327 1
+6615 6330 1
+6615 6347 1
+6615 6388 1
+6615 6414 1
+6615 6417 1
+6615 6442 1
+6615 6503 1
+6615 6523 1
+6615 6555 1
+6615 6560 1
+6615 6624 1
+6615 6714 1
+6615 6736 1
+6615 6765 1
+6615 6770 1
+6615 6772 1
+6615 6774 1
+6615 6783 1
+6615 6784 1
+6615 6789 1
+6615 6790 1
+6615 6832 1
+6615 6833 1
+6615 6850 1
+6615 6855 1
+6615 6869 1
+6615 6873 1
+6615 6890 1
+6615 6892 1
+6615 6901 1
+6615 6913 1
+6615 6930 1
+6615 6945 1
+6615 6946 1
+6615 6955 1
+6615 6976 1
+6615 6979 1
+6615 6980 1
+6615 6994 1
+6615 7040 1
+6615 7052 1
+6615 7059 1
+6615 7062 1
+6615 7073 1
+6615 7101 1
+6615 7108 1
+6615 7115 1
+6615 7119 1
+6615 7131 1
+6615 7143 1
+6615 7144 1
+6615 7168 1
+6615 7185 1
+6615 7186 1
+6615 7201 1
+6615 7214 1
+6615 7243 1
+6615 7279 1
+6615 7280 1
+6615 7295 1
+6615 7301 1
+6615 7304 1
+6615 7306 1
+6615 7315 1
+6615 7319 1
+6615 7351 1
+6615 7362 1
+6615 7373 1
+6615 7381 1
+6615 7386 1
+6615 7397 1
+6615 7414 1
+6615 7422 1
+6615 7423 1
+6615 7436 1
+6615 7439 1
+6615 7442 1
+6615 7443 1
+6615 7449 1
+6615 7450 1
+6615 7478 1
+6615 7544 1
+6615 7695 1
+6615 7699 1
+6615 7707 1
+6615 7726 1
+6615 7740 1
+6615 7757 1
+6615 7763 1
+6616 2565 1
+6616 4037 1
+6616 4536 1
+6616 5012 1
+6616 5404 1
+6616 5500 1
+6616 5697 1
+6616 5922 1
+6616 6305 1
+6616 6330 1
+6616 6414 1
+6616 6560 1
+6616 6714 1
+6616 6897 1
+6616 6934 1
+6616 7040 1
+6616 7301 1
+6616 7557 1
+6617 6305 1
+6622 2851 1
+6622 3346 1
+6622 6623 1
+6622 6736 1
+6622 7146 1
+6624 967 1
+6624 1191 1
+6624 1403 1
+6624 1498 1
+6624 2511 1
+6624 2565 1
+6624 2620 1
+6624 2658 1
+6624 2851 1
+6624 2940 1
+6624 3000 1
+6624 3238 1
+6624 3293 1
+6624 3310 1
+6624 3381 1
+6624 3459 1
+6624 3631 1
+6624 3726 1
+6624 3752 1
+6624 3885 1
+6624 3962 1
+6624 3969 1
+6624 4037 1
+6624 4071 1
+6624 4341 1
+6624 4361 1
+6624 4435 1
+6624 4632 1
+6624 4981 1
+6624 5002 1
+6624 5028 1
+6624 5148 1
+6624 5288 1
+6624 5289 1
+6624 5404 1
+6624 5432 1
+6624 5465 1
+6624 5605 1
+6624 5614 1
+6624 5671 1
+6624 5760 1
+6624 5800 1
+6624 5806 1
+6624 5835 1
+6624 5839 1
+6624 5872 1
+6624 5897 1
+6624 5902 1
+6624 5933 1
+6624 6032 1
+6624 6043 1
+6624 6044 1
+6624 6123 1
+6624 6151 1
+6624 6174 1
+6624 6241 1
+6624 6243 1
+6624 6299 1
+6624 6414 1
+6624 6442 1
+6624 6555 1
+6624 6560 1
+6624 6665 1
+6624 6712 1
+6624 6780 1
+6624 6832 1
+6624 6907 1
+6624 6913 1
+6624 6914 1
+6624 6918 1
+6624 6934 1
+6624 6946 1
+6624 6980 1
+6624 7005 1
+6624 7012 1
+6624 7047 1
+6624 7052 1
+6624 7054 1
+6624 7092 1
+6624 7131 1
+6624 7225 1
+6624 7237 1
+6624 7277 1
+6624 7280 1
+6624 7378 1
+6624 7381 1
+6624 7400 1
+6624 7414 1
+6624 7443 1
+6624 7450 1
+6624 7478 1
+6624 7510 1
+6624 7512 1
+6624 7529 1
+6624 7533 1
+6624 7544 1
+6624 7561 1
+6624 7587 1
+6624 7618 1
+6624 7620 1
+6624 7624 1
+6624 7632 1
+6624 7646 1
+6624 7649 1
+6624 7651 1
+6624 7662 1
+6624 7683 1
+6624 7694 1
+6624 7695 1
+6624 7757 1
+6624 7763 1
+6624 7799 1
+6624 7803 1
+6624 7809 1
+6624 7813 1
+6624 7839 1
+6624 7855 1
+6624 7860 1
+6624 7862 1
+6624 7871 1
+6624 7882 1
+6624 7890 1
+6624 7908 1
+6624 7910 1
+6624 7912 1
+6624 7927 1
+6624 7946 1
+6624 7992 1
+6624 8037 1
+6624 8042 1
+6624 8044 1
+6624 8121 1
+6624 8122 1
+6624 8124 1
+6624 8128 1
+6625 2620 1
+6625 6227 1
+6625 6634 1
+6627 155 1
+6627 1982 1
+6627 2620 1
+6627 3346 1
+6627 3459 1
+6627 4065 1
+6627 4361 1
+6627 4412 1
+6627 4536 1
+6627 4632 1
+6627 4712 1
+6627 5028 1
+6627 5210 1
+6627 5254 1
+6627 5465 1
+6627 5484 1
+6627 5543 1
+6627 5760 1
+6627 5773 1
+6627 5835 1
+6627 5922 1
+6627 5950 1
+6627 6004 1
+6627 6330 1
+6627 6424 1
+6627 6503 1
+6627 6595 1
+6627 6634 1
+6627 6663 1
+6627 6790 1
+6627 6809 1
+6627 6833 1
+6627 6840 1
+6627 6850 1
+6627 6855 1
+6627 6946 1
+6627 6953 1
+6627 6979 1
+6627 7054 1
+6627 7062 1
+6627 7094 1
+6627 7115 1
+6627 7378 1
+6627 7529 1
+6627 7587 1
+6627 7588 1
+6627 7620 1
+6627 7910 1
+6627 8141 1
+6627 8178 1
+6626 2620 1
+6626 4712 1
+6626 5002 1
+6626 6221 1
+6626 6595 1
+6626 6634 1
+6626 6665 1
+6626 6682 1
+6626 6715 1
+6630 3919 1
+5943 6421 1
+6634 6946 1
+6634 8042 1
+6634 8163 1
+6636 4037 1
+6636 6634 1
+6633 6634 1
+6635 3752 1
+6635 5543 1
+6635 6634 1
+6635 6784 1
+6635 6913 1
+6635 7047 1
+6635 7478 1
+6635 7662 1
+6635 7699 1
+6639 6641 1
+6643 4037 1
+6643 5254 1
+6644 5254 1
+6645 5254 1
+6645 5714 1
+6646 4037 1
+6646 5254 1
+6646 7301 1
+6646 7478 1
+6647 5254 1
+6655 3346 1
+6655 5254 1
+6655 6624 1
+6655 6665 1
+6655 6784 1
+6655 7301 1
+6655 7478 1
+6648 1026 1
+6648 5254 1
+6648 7050 1
+6649 3792 1
+6649 4037 1
+6649 4134 1
+6649 4488 1
+6649 4944 1
+6649 5254 1
+6649 5524 1
+6649 5543 1
+6649 5563 1
+6649 5596 1
+6649 5739 1
+6649 5760 1
+6649 5818 1
+6649 5932 1
+6649 5998 1
+6649 6227 1
+6649 6272 1
+6649 6784 1
+6649 6855 1
+6649 6860 1
+6649 6869 1
+6649 6873 1
+6649 6901 1
+6649 6930 1
+6649 6934 1
+6649 7110 1
+6650 5254 1
+6651 5254 1
+6652 5254 1
+6653 5254 1
+6654 5254 1
+6656 5255 1
+6657 3293 1
+6657 3962 1
+6657 4712 1
+6657 5839 1
+6657 6715 1
+6657 6774 1
+6657 7279 1
+6657 7840 1
+6657 7961 1
+6657 8128 1
+6657 8132 1
+6658 4712 1
+6658 4875 1
+6658 5563 1
+6658 6780 1
+6658 6833 1
+6609 840 1
+6609 1549 1
+6609 4536 1
+6609 5210 1
+6609 5298 1
+6609 6327 1
+6609 6965 1
+6660 6661 1
+6551 5524 1
+6551 5950 1
+6665 1498 1
+6665 2658 1
+6665 2785 1
+6665 3631 1
+6665 3830 1
+6665 4065 1
+6665 4412 1
+6665 4441 1
+6665 4884 1
+6665 5028 1
+6665 5037 1
+6665 5288 1
+6665 5465 1
+6665 5697 1
+6665 5824 1
+6665 5950 1
+6665 6221 1
+6665 6503 1
+6665 6699 1
+6665 6715 1
+6665 6833 1
+6665 7101 1
+6665 7108 1
+6665 7116 1
+6665 7214 1
+6665 7618 1
+6665 7620 1
+6665 7624 1
+6665 8028 1
+6666 5950 1
+6666 6221 1
+6666 6299 1
+6666 6595 1
+6666 6699 1
+6666 6715 1
+6671 5760 1
+6671 6156 1
+6671 6832 1
+6671 7131 1
+6672 6156 1
+6673 6156 1
+6674 6156 1
+6675 6156 1
+6676 2658 1
+6676 5079 1
+6676 5738 1
+6676 6156 1
+6676 7092 1
+6676 7620 1
+6677 6156 1
+6678 6156 1
+6679 6156 1
+6683 6682 1
+6683 6685 1
+6683 6686 1
+6684 6685 1
+6687 6691 1
+6688 6691 1
+6689 6691 1
+6690 6691 1
+6695 4412 1
+6695 7632 1
+6696 4412 1
+6696 6770 1
+6697 6699 1
+6698 6699 1
+6701 6700 1
+6702 1403 1
+6702 3334 1
+6702 4944 1
+6702 5079 1
+6702 5839 1
+6702 5872 1
+6702 6555 1
+6702 6700 1
+6702 7225 1
+6702 7381 1
+6703 6221 1
+6705 5824 1
+6706 5002 1
+6706 5824 1
+6706 8297 1
+6710 737 1
+6710 6715 1
+6711 967 1
+6711 3803 1
+6711 6299 1
+6711 6715 1
+6711 7063 1
+6711 7115 1
+6711 7119 1
+6712 4764 1
+6712 5148 1
+6712 5671 1
+6712 6414 1
+6712 6442 1
+6712 6715 1
+6712 6933 1
+6712 7443 1
+6712 7544 1
+6712 7675 1
+6712 7795 1
+3293 840 1
+3293 5289 1
+3293 5605 1
+3293 5614 1
+3293 5969 1
+3293 6665 1
+3293 6715 1
+3293 6955 1
+3293 7620 1
+3293 7908 1
+6713 155 1
+6713 967 1
+6713 6715 1
+6713 7092 1
+6714 155 1
+6714 1026 1
+6714 1403 1
+6714 2565 1
+6714 2785 1
+6714 2851 1
+6714 2940 1
+6714 3334 1
+6714 3346 1
+6714 3459 1
+6714 3631 1
+6714 3726 1
+6714 3809 1
+6714 3885 1
+6714 4361 1
+6714 4632 1
+6714 4713 1
+6714 4875 1
+6714 4884 1
+6714 5002 1
+6714 5028 1
+6714 5199 1
+6714 5233 1
+6714 5289 1
+6714 5321 1
+6714 5404 1
+6714 5421 1
+6714 5432 1
+6714 5582 1
+6714 5596 1
+6714 5714 1
+6714 5745 1
+6714 5760 1
+6714 5800 1
+6714 5806 1
+6714 5822 1
+6714 5835 1
+6714 5872 1
+6714 5897 1
+6714 5902 1
+6714 6000 1
+6714 6097 1
+6714 6123 1
+6714 6243 1
+6714 6299 1
+6714 6417 1
+6714 6442 1
+6714 6503 1
+6714 6523 1
+6714 6560 1
+6714 6665 1
+6714 6715 1
+6714 6736 1
+6714 6770 1
+6714 6774 1
+6714 6784 1
+6714 6789 1
+6714 6803 1
+6714 6832 1
+6714 6833 1
+6714 6913 1
+6714 6934 1
+6714 6946 1
+6714 6976 1
+6714 7052 1
+6714 7054 1
+6714 7074 1
+6714 7088 1
+6714 7131 1
+6714 7214 1
+6714 7237 1
+6714 7262 1
+6714 7279 1
+6714 7295 1
+6714 7301 1
+6714 7315 1
+6714 7351 1
+6714 7365 1
+6714 7373 1
+6714 7378 1
+6714 7381 1
+6714 7414 1
+6714 7422 1
+6714 7423 1
+6714 7442 1
+6714 7450 1
+6714 7478 1
+6714 7491 1
+6714 7497 1
+6714 7510 1
+6714 7512 1
+6714 7520 1
+6714 7553 1
+6714 7561 1
+6714 7618 1
+6714 7620 1
+6714 7632 1
+6714 7646 1
+6714 7651 1
+6714 7662 1
+6718 6720 1
+6717 2160 1
+6717 6720 1
+6717 6778 1
+6717 6869 1
+6719 2940 1
+6719 6004 1
+6719 6720 1
+6727 5002 1
+6728 5002 1
+6611 2785 1
+6611 3459 1
+6611 5020 1
+6611 5543 1
+6611 5563 1
+6611 5739 1
+6611 5969 1
+6611 6270 1
+6611 6327 1
+6611 6414 1
+6611 6784 1
+6611 6913 1
+6611 6930 1
+6611 7101 1
+6611 7215 1
+6729 6665 1
+6730 6665 1
+6731 6665 1
+6732 6665 1
+6734 5802 1
+6734 7632 1
+6735 6739 1
+6736 1982 1
+6736 4401 1
+6736 4488 1
+6736 4536 1
+6736 4764 1
+6736 5321 1
+6736 5543 1
+6736 5596 1
+6736 5655 1
+6736 5697 1
+6736 5739 1
+6736 5800 1
+6736 5818 1
+6736 5839 1
+6736 5871 1
+6736 6001 1
+6736 6347 1
+6736 6422 1
+6736 6739 1
+6736 6774 1
+6736 6783 1
+6736 6788 1
+6736 6832 1
+6736 6833 1
+6736 6850 1
+6736 6860 1
+6736 6869 1
+6736 6873 1
+6736 6892 1
+6736 6901 1
+6736 6930 1
+6736 7021 1
+6736 7620 1
+6737 6739 1
+6738 6739 1
+6744 2160 1
+6744 8297 1
+6745 8297 1
+6746 6736 1
+6746 8297 1
+6749 6491 1
+6751 1493 1
+6751 6757 1
+6726 1493 1
+6726 5596 1
+6726 5800 1
+6726 5829 1
+6726 6001 1
+6726 6004 1
+6726 6323 1
+6726 6347 1
+6726 6770 1
+6726 6833 1
+6726 6850 1
+6726 6869 1
+6752 5037 1
+6753 2160 1
+6753 5037 1
+6753 6442 1
+6753 6890 1
+6755 6503 1
+6755 6774 1
+4401 2223 1
+4401 5022 1
+4401 5605 1
+4401 6897 1
+4401 7393 1
+4401 8033 1
+4401 8073 1
+4401 8139 1
+4401 8227 1
+6758 1498 1
+6758 3830 1
+6758 5871 1
+6758 6123 1
+6758 6243 1
+6758 7279 1
+6758 7407 1
+6758 7478 1
+6758 7632 1
+6758 8121 1
+6760 3830 1
+6760 6618 1
+6759 155 1
+6759 3830 1
+6759 7669 1
+6761 3830 1
+6764 4709 1
+6765 4709 1
+6766 155 1
+6766 3459 1
+6766 3885 1
+6766 4361 1
+6766 4401 1
+6766 4709 1
+6766 5432 1
+6766 5835 1
+6766 6347 1
+6766 7185 1
+6766 7306 1
+6766 7378 1
+6766 7512 1
+6766 7520 1
+6766 7561 1
+6766 7583 1
+6766 7587 1
+6766 7624 1
+6766 7695 1
+6766 7763 1
+6766 8051 1
+6766 8224 1
+6767 4709 1
+6767 6004 1
+6768 6613 1
+6770 5543 1
+6770 5806 1
+6770 5871 1
+6770 7050 1
+6770 7063 1
+6770 7961 1
+6771 5871 1
+6771 6833 1
+6772 155 1
+6772 1982 1
+6772 3084 1
+6772 3346 1
+6772 3885 1
+6772 4134 1
+6772 4488 1
+6772 4507 1
+6772 4940 1
+6772 4983 1
+6772 5020 1
+6772 5179 1
+6772 5199 1
+6772 5233 1
+6772 5321 1
+6772 5432 1
+6772 5524 1
+6772 5563 1
+6772 5596 1
+6772 5714 1
+6772 5739 1
+6772 5773 1
+6772 5800 1
+6772 5806 1
+6772 5818 1
+6772 5819 1
+6772 5829 1
+6772 5871 1
+6772 5872 1
+6772 6000 1
+6772 6001 1
+6772 6032 1
+6772 6123 1
+6772 6198 1
+6772 6327 1
+6772 6388 1
+6772 6417 1
+6772 6555 1
+6772 6596 1
+6772 6618 1
+6772 6783 1
+6772 6789 1
+6772 6803 1
+6772 6806 1
+6772 6809 1
+6772 6832 1
+6772 6833 1
+6772 6850 1
+6772 6901 1
+6772 6913 1
+6772 6914 1
+6772 6946 1
+6772 6976 1
+6772 6979 1
+6772 6980 1
+6772 7012 1
+6772 7021 1
+6772 7185 1
+6772 7225 1
+6772 7279 1
+6772 7289 1
+6772 7306 1
+6772 7423 1
+6772 7497 1
+6772 7553 1
+6772 7620 1
+6772 7632 1
+6772 7642 1
+6772 7662 1
+6772 7791 1
+6772 7835 1
+6772 7862 1
+6772 8019 1
+6772 8021 1
+6772 8083 1
+6772 8169 1
+6772 8178 1
+6775 5871 1
+6775 6770 1
+6775 7632 1
+6773 5871 1
+6774 1982 1
+6774 3084 1
+6774 4981 1
+6774 4983 1
+6774 5079 1
+6774 5148 1
+6774 5739 1
+6774 5814 1
+6774 5839 1
+6774 5871 1
+6774 6123 1
+6774 6243 1
+6774 6272 1
+6774 6618 1
+6774 6832 1
+6774 6913 1
+6774 6993 1
+6774 7005 1
+6774 7021 1
+6774 7386 1
+6774 7414 1
+6774 7553 1
+6774 7620 1
+6774 7810 1
+6779 5484 1
+6779 6004 1
+6779 7478 1
+6780 4071 1
+6780 5671 1
+6780 5819 1
+6780 6004 1
+6780 7813 1
+6780 7890 1
+6781 2160 1
+6781 4764 1
+6781 5697 1
+6781 6004 1
+6781 6523 1
+6781 6789 1
+6781 6833 1
+6781 6979 1
+6782 6004 1
+6783 5596 1
+6783 5829 1
+6783 6004 1
+6783 6323 1
+6784 840 1
+6784 2658 1
+6784 3459 1
+6784 3792 1
+6784 3885 1
+6784 5002 1
+6784 5028 1
+6784 5079 1
+6784 5199 1
+6784 5484 1
+6784 5596 1
+6784 5800 1
+6784 5806 1
+6784 5818 1
+6784 5839 1
+6784 5902 1
+6784 6000 1
+6784 6004 1
+6784 6414 1
+6784 6634 1
+6784 6790 1
+6784 6855 1
+6784 6860 1
+6784 6901 1
+6784 6913 1
+6784 6920 1
+6784 6934 1
+6784 6942 1
+6784 7054 1
+6784 7088 1
+6784 7092 1
+6784 7131 1
+6784 7279 1
+6784 7414 1
+6784 7422 1
+6784 7442 1
+6784 7450 1
+6784 7497 1
+6784 7512 1
+6784 7620 1
+6784 7651 1
+6784 7992 1
+6787 6788 1
+6789 4361 1
+6789 5199 1
+6789 5800 1
+6789 6299 1
+6789 6417 1
+6789 6634 1
+6789 6832 1
+6789 7295 1
+6789 7414 1
+6789 7442 1
+6789 7449 1
+6790 840 1
+6790 1549 1
+6790 1982 1
+6790 2565 1
+6790 3459 1
+6790 4536 1
+6790 5822 1
+6790 6323 1
+6790 6330 1
+6790 6555 1
+6790 6624 1
+6793 2160 1
+6794 2160 1
+6795 2160 1
+6795 6044 1
+6797 5714 1
+6798 5714 1
+6800 5714 1
+6801 3752 1
+6801 5714 1
+6801 5773 1
+6801 7050 1
+6801 7414 1
+6801 8174 1
+6802 6755 1
+6802 6803 1
+6802 7243 1
+6804 6770 1
+6804 6805 1
+6804 6907 1
+6804 7237 1
+6804 7414 1
+6804 7561 1
+6809 6001 1
+6809 8249 1
+6808 6809 1
+6807 6809 1
+6810 6770 1
+6812 6770 1
+6812 7662 1
+6811 6770 1
+6813 5596 1
+6815 5288 1
+6815 5321 1
+6815 6388 1
+6815 6783 1
+6816 5321 1
+6818 5529 1
+6818 6347 1
+6819 6347 1
+5269 6347 1
+6821 5829 1
+6822 5818 1
+6822 5829 1
+6824 5829 1
+6776 5800 1
+6776 5829 1
+6776 6855 1
+6828 4713 1
+6829 4536 1
+6829 4713 1
+6829 6330 1
+6829 6833 1
+6833 5404 1
+6834 4037 1
+6834 6833 1
+6835 6833 1
+6836 6833 1
+6837 4764 1
+6841 5210 1
+6841 5596 1
+6842 5596 1
+6843 5596 1
+6844 5596 1
+6845 6832 1
+6845 6850 1
+6846 5563 1
+6846 6388 1
+6846 6850 1
+6846 6855 1
+6846 6860 1
+6846 6930 1
+6848 2565 1
+6848 4361 1
+6848 5020 1
+6848 5800 1
+6848 6327 1
+6848 6774 1
+6848 6784 1
+6848 6850 1
+6848 6869 1
+6848 6901 1
+6848 6913 1
+6848 7074 1
+6848 7101 1
+6848 7143 1
+6847 6850 1
+6852 6388 1
+6855 2565 1
+6855 3084 1
+6855 5079 1
+6855 5524 1
+6855 5773 1
+6855 5814 1
+6855 6634 1
+6855 6832 1
+6855 7005 1
+6855 7094 1
+6855 7185 1
+6855 7757 1
+6855 8042 1
+6855 8128 1
+6854 6855 1
+6859 4037 1
+6859 5022 1
+6859 5524 1
+6859 5776 1
+6859 6272 1
+6859 6634 1
+6859 6860 1
+6859 8037 1
+6859 8163 1
+6859 8204 1
+6859 8226 1
+6620 840 1
+6620 1403 1
+6620 1549 1
+6620 1982 1
+6620 2511 1
+6620 2565 1
+6620 2785 1
+6620 2851 1
+6620 3346 1
+6620 3459 1
+6620 3631 1
+6620 3726 1
+6620 3792 1
+6620 3803 1
+6620 3809 1
+6620 4037 1
+6620 4134 1
+6620 4536 1
+6620 4666 1
+6620 4944 1
+6620 4992 1
+6620 5012 1
+6620 5288 1
+6620 5295 1
+6620 5384 1
+6620 5404 1
+6620 5432 1
+6620 5484 1
+6620 5524 1
+6620 5543 1
+6620 5563 1
+6620 5582 1
+6620 5697 1
+6620 5739 1
+6620 5773 1
+6620 5776 1
+6620 5800 1
+6620 5807 1
+6620 5811 1
+6620 5814 1
+6620 5818 1
+6620 5822 1
+6620 5922 1
+6620 5932 1
+6620 5998 1
+6620 6097 1
+6620 6227 1
+6620 6270 1
+6620 6272 1
+6620 6327 1
+6620 6414 1
+6620 6523 1
+6620 6560 1
+6620 6624 1
+6620 6634 1
+6620 6736 1
+6620 6774 1
+6620 6784 1
+6620 6790 1
+6620 6832 1
+6620 6860 1
+6620 6873 1
+6620 6897 1
+6620 6901 1
+6620 6930 1
+6620 6942 1
+6620 6945 1
+6620 6946 1
+6620 6948 1
+6620 6955 1
+6620 6976 1
+6620 6982 1
+6620 7040 1
+6620 7052 1
+6620 7073 1
+6620 7074 1
+6620 7094 1
+6620 7101 1
+6620 7108 1
+6620 7115 1
+6620 7119 1
+6620 7143 1
+6620 7144 1
+6620 7168 1
+6620 7185 1
+6620 7186 1
+6620 7201 1
+6620 7214 1
+6620 7257 1
+6620 7301 1
+6620 7304 1
+6620 7306 1
+6620 7632 1
+6861 3792 1
+6861 6930 1
+6862 3792 1
+6863 3792 1
+6863 4037 1
+6864 3792 1
+6864 6327 1
+6866 3238 1
+6866 3792 1
+6866 7695 1
+6866 7979 1
+6867 4488 1
+6867 5543 1
+6867 5800 1
+6867 6001 1
+6867 7373 1
+6869 7214 1
+6865 3459 1
+6865 4009 1
+6865 5543 1
+6865 5563 1
+6865 5739 1
+6865 5800 1
+6865 5811 1
+6865 5818 1
+6865 6001 1
+6865 6560 1
+6865 6618 1
+6865 6832 1
+6865 6869 1
+6865 6901 1
+6865 6913 1
+6865 6930 1
+6865 7021 1
+6865 7074 1
+6865 7620 1
+6870 5800 1
+6870 6869 1
+6870 6873 1
+6875 4432 1
+6875 5289 1
+6875 5818 1
+6875 5922 1
+6875 6032 1
+6875 6442 1
+6875 6634 1
+6875 6980 1
+6875 7443 1
+6875 7553 1
+6875 7561 1
+6875 7965 1
+6875 8168 1
+6875 8174 1
+6875 8212 1
+6876 5818 1
+6877 5818 1
+6878 5818 1
+6880 6327 1
+6880 6560 1
+6881 6560 1
+6883 5776 1
+6883 6001 1
+6883 6327 1
+6883 6523 1
+6884 6001 1
+6885 3334 1
+6885 4037 1
+6885 5079 1
+6885 5404 1
+6885 5671 1
+6885 6001 1
+6885 6307 1
+6885 6442 1
+6885 6560 1
+6885 6634 1
+6885 6784 1
+6885 7050 1
+6885 7422 1
+6885 7553 1
+6885 7620 1
+6885 7646 1
+6885 7707 1
+6885 8168 1
+6885 8249 1
+6747 4037 1
+6747 5773 1
+6747 6001 1
+6747 6414 1
+6886 840 1
+6886 3803 1
+6886 4037 1
+6886 6001 1
+6886 6097 1
+6886 6790 1
+6886 7143 1
+5410 5295 1
+6895 5563 1
+6895 6032 1
+6895 6097 1
+6895 6832 1
+6895 6897 1
+6895 7809 1
+6896 4134 1
+6896 5543 1
+6896 6897 1
+6896 6934 1
+6899 5800 1
+6899 6774 1
+6900 2658 1
+6900 3297 1
+6900 3334 1
+6900 3459 1
+6900 4037 1
+6900 4536 1
+6900 4632 1
+6900 4875 1
+6900 5022 1
+6900 5210 1
+6900 5378 1
+6900 5524 1
+6900 5605 1
+6900 5800 1
+6900 5811 1
+6900 5902 1
+6900 6330 1
+6900 6560 1
+6900 6918 1
+6900 6945 1
+6900 7088 1
+6900 7092 1
+6900 7131 1
+6900 7279 1
+6900 7422 1
+6900 7478 1
+6900 7553 1
+6900 7620 1
+6900 7961 1
+6900 8121 1
+6900 8134 1
+6902 2511 1
+6902 2851 1
+6902 3334 1
+6902 3752 1
+6902 4037 1
+6902 4875 1
+6902 5179 1
+6902 5288 1
+6902 5289 1
+6902 5563 1
+6902 5614 1
+6902 5739 1
+6902 5773 1
+6902 5872 1
+6902 5887 1
+6902 6241 1
+6902 6901 1
+6902 6914 1
+6902 7092 1
+6902 7237 1
+6902 7400 1
+6902 7436 1
+6902 7520 1
+6902 7553 1
+6902 7683 1
+6902 7928 1
+6902 8073 1
+6902 8121 1
+6903 6904 1
+6913 840 1
+6913 2511 1
+6913 2565 1
+6913 2785 1
+6913 3631 1
+6913 3803 1
+6913 4037 1
+6913 4361 1
+6913 4536 1
+6913 4666 1
+6913 4944 1
+6913 5484 1
+6913 5772 1
+6913 5773 1
+6913 5776 1
+6913 5814 1
+6913 5822 1
+6913 5932 1
+6913 5969 1
+6913 5998 1
+6913 6270 1
+6913 6327 1
+6913 6330 1
+6913 6555 1
+6913 6624 1
+6913 6634 1
+6913 6714 1
+6913 6736 1
+6913 6774 1
+6913 6784 1
+6913 6832 1
+6913 6917 1
+6913 6946 1
+6913 7052 1
+6913 7073 1
+6913 7074 1
+6913 7101 1
+6913 7108 1
+6913 7119 1
+6913 7143 1
+6913 7149 1
+6913 7168 1
+6913 7185 1
+6913 7214 1
+6905 5484 1
+6914 155 1
+6914 938 1
+6914 2658 1
+6914 2851 1
+6914 3297 1
+6914 3346 1
+6914 3459 1
+6914 3885 1
+6914 3962 1
+6914 4361 1
+6914 4632 1
+6914 4875 1
+6914 4940 1
+6914 4966 1
+6914 5012 1
+6914 5022 1
+6914 5179 1
+6914 5288 1
+6914 5404 1
+6914 5406 1
+6914 5484 1
+6914 5500 1
+6914 5529 1
+6914 5582 1
+6914 5605 1
+6914 5671 1
+6914 5760 1
+6914 5773 1
+6914 5800 1
+6914 5806 1
+6914 5835 1
+6914 5839 1
+6914 5872 1
+6914 5998 1
+6914 6000 1
+6914 6123 1
+6914 6243 1
+6914 6270 1
+6914 6320 1
+6914 6417 1
+6914 6503 1
+6914 6555 1
+6914 6560 1
+6914 6618 1
+6914 6634 1
+6914 6665 1
+6914 6714 1
+6914 6736 1
+6914 6780 1
+6914 6784 1
+6914 6832 1
+6914 6913 1
+6914 6946 1
+6914 6979 1
+6914 6993 1
+6914 7012 1
+6914 7052 1
+6914 7054 1
+6914 7063 1
+6914 7088 1
+6914 7092 1
+6914 7131 1
+6914 7225 1
+6914 7243 1
+6914 7246 1
+6914 7277 1
+6914 7295 1
+6914 7306 1
+6914 7351 1
+6914 7359 1
+6914 7373 1
+6914 7378 1
+6914 7414 1
+6914 7422 1
+6914 7442 1
+6914 7478 1
+6914 7491 1
+6914 7497 1
+6914 7510 1
+6914 7512 1
+6914 7544 1
+6914 7553 1
+6914 7587 1
+6914 7757 1
+6914 7788 1
+6914 7803 1
+6914 7810 1
+6914 7833 1
+6914 7862 1
+6914 7890 1
+6914 7921 1
+6914 7924 1
+6914 7927 1
+6914 8134 1
+6914 8141 1
+6915 5384 1
+6915 5484 1
+6906 1403 1
+6906 2511 1
+6906 2851 1
+6906 2940 1
+6906 3346 1
+6906 3631 1
+6906 3726 1
+6906 4037 1
+6906 4361 1
+6906 5012 1
+6906 5199 1
+6906 5288 1
+6906 5404 1
+6906 5432 1
+6906 5484 1
+6906 5582 1
+6906 5760 1
+6906 5773 1
+6906 5776 1
+6906 5814 1
+6906 5897 1
+6906 6123 1
+6906 6299 1
+6906 6327 1
+6906 6414 1
+6906 6417 1
+6906 6503 1
+6906 6634 1
+6906 6714 1
+6906 6736 1
+6906 6784 1
+6906 6789 1
+6906 6832 1
+6906 6913 1
+6906 6976 1
+6906 7101 1
+6906 7108 1
+6906 7115 1
+6906 7119 1
+6906 7143 1
+6906 7144 1
+6906 7185 1
+6906 7186 1
+6906 7214 1
+6906 7295 1
+6906 7301 1
+6906 7306 1
+6906 7351 1
+6906 7381 1
+6907 155 1
+6907 840 1
+6907 938 1
+6907 967 1
+6907 1191 1
+6907 1403 1
+6907 1498 1
+6907 2223 1
+6907 2511 1
+6907 2658 1
+6907 2785 1
+6907 2851 1
+6907 3000 1
+6907 3084 1
+6907 3238 1
+6907 3293 1
+6907 3297 1
+6907 3310 1
+6907 3346 1
+6907 3381 1
+6907 3631 1
+6907 3726 1
+6907 3752 1
+6907 3885 1
+6907 3962 1
+6907 3969 1
+6907 4037 1
+6907 4071 1
+6907 4341 1
+6907 4361 1
+6907 4401 1
+6907 4432 1
+6907 4632 1
+6907 4875 1
+6907 4879 1
+6907 4944 1
+6907 4983 1
+6907 5002 1
+6907 5022 1
+6907 5028 1
+6907 5064 1
+6907 5079 1
+6907 5148 1
+6907 5179 1
+6907 5199 1
+6907 5210 1
+6907 5233 1
+6907 5288 1
+6907 5378 1
+6907 5404 1
+6907 5421 1
+6907 5432 1
+6907 5465 1
+6907 5466 1
+6907 5484 1
+6907 5500 1
+6907 5529 1
+6907 5582 1
+6907 5605 1
+6907 5760 1
+6907 5773 1
+6907 5776 1
+6907 5800 1
+6907 5806 1
+6907 5812 1
+6907 5814 1
+6907 5835 1
+6907 5839 1
+6907 5872 1
+6907 5897 1
+6907 5902 1
+6907 6000 1
+6907 6043 1
+6907 6044 1
+6907 6123 1
+6907 6241 1
+6907 6243 1
+6907 6299 1
+6907 6320 1
+6907 6414 1
+6907 6417 1
+6907 6442 1
+6907 6503 1
+6907 6523 1
+6907 6555 1
+6907 6560 1
+6907 6618 1
+6907 6634 1
+6907 6665 1
+6907 6712 1
+6907 6714 1
+6907 6780 1
+6907 6784 1
+6907 6789 1
+6907 6832 1
+6907 6875 1
+6907 6913 1
+6907 6914 1
+6907 6918 1
+6907 6934 1
+6907 6946 1
+6907 6976 1
+6907 6979 1
+6907 6994 1
+6907 7005 1
+6907 7012 1
+6907 7021 1
+6907 7052 1
+6907 7054 1
+6907 7063 1
+6907 7092 1
+6907 7101 1
+6907 7108 1
+6907 7116 1
+6907 7131 1
+6907 7144 1
+6907 7214 1
+6907 7225 1
+6907 7233 1
+6907 7237 1
+6907 7254 1
+6907 7279 1
+6907 7280 1
+6907 7359 1
+6907 7373 1
+6907 7378 1
+6907 7381 1
+6907 7386 1
+6907 7389 1
+6907 7391 1
+6907 7400 1
+6907 7414 1
+6907 7423 1
+6907 7478 1
+6907 7497 1
+6907 7510 1
+6907 7529 1
+6907 7553 1
+6907 7561 1
+6907 7618 1
+6907 7620 1
+6907 7624 1
+6907 7632 1
+6907 7646 1
+6907 7647 1
+6907 7649 1
+6907 7651 1
+6907 7652 1
+6907 7662 1
+6907 7683 1
+6907 7688 1
+6907 7694 1
+6907 7695 1
+6907 7707 1
+6907 7726 1
+6907 7757 1
+6907 7763 1
+6907 7788 1
+6907 7795 1
+6907 7803 1
+6907 7809 1
+6907 7813 1
+6907 7835 1
+6907 7860 1
+6907 7874 1
+6907 7879 1
+6907 7882 1
+6907 7908 1
+6907 7912 1
+6907 7924 1
+6907 7961 1
+6907 7965 1
+6907 7992 1
+6907 8042 1
+6907 8044 1
+6907 8083 1
+6907 8090 1
+6907 8121 1
+6907 8122 1
+6907 8128 1
+6907 8134 1
+6907 8141 1
+6907 8163 1
+6907 8168 1
+6907 8169 1
+6907 8174 1
+6907 8178 1
+6907 8192 1
+6907 8209 1
+6907 8219 1
+6907 8237 1
+6908 5484 1
+6909 5484 1
+2415 5012 1
+2415 5484 1
+2415 5814 1
+2415 6560 1
+6910 5484 1
+6916 155 1
+6916 1026 1
+6916 1403 1
+6916 2658 1
+6916 3334 1
+6916 3459 1
+6916 3770 1
+6916 4037 1
+6916 4507 1
+6916 4875 1
+6916 4884 1
+6916 4940 1
+6916 5179 1
+6916 5289 1
+6916 5406 1
+6916 5484 1
+6916 5582 1
+6916 5806 1
+6916 5872 1
+6916 6000 1
+6916 6330 1
+6916 6503 1
+6916 6618 1
+6916 6907 1
+6916 6914 1
+6916 6946 1
+6916 6980 1
+6916 7108 1
+6916 7131 1
+6916 7225 1
+6916 7237 1
+6916 7279 1
+6916 7351 1
+6916 7442 1
+6916 7450 1
+6916 7553 1
+6916 7574 1
+6916 7587 1
+6916 7620 1
+6916 7642 1
+6916 7740 1
+6916 7757 1
+6916 7788 1
+6916 8002 1
+6916 8090 1
+6916 8128 1
+6916 8134 1
+6916 8168 1
+6916 8178 1
+6916 8219 1
+6916 8224 1
+6916 8226 1
+6916 8235 1
+6916 8275 1
+6917 5484 1
+6917 6634 1
+6917 6994 1
+6911 5484 1
+6911 5582 1
+6911 6714 1
+6911 6774 1
+6911 6976 1
+6912 1549 1
+6912 5484 1
+6912 6790 1
+6918 3297 1
+6918 3334 1
+6918 3631 1
+6918 3962 1
+6918 4435 1
+6918 5179 1
+6918 5233 1
+6918 5404 1
+6918 5466 1
+6918 5484 1
+6918 6442 1
+6918 6560 1
+6918 6780 1
+6918 6907 1
+6918 7021 1
+6918 7050 1
+6918 7054 1
+6918 7092 1
+6918 7108 1
+6918 7214 1
+6918 7400 1
+6918 7414 1
+6918 7553 1
+6918 7604 1
+6918 7632 1
+6918 7778 1
+6918 7927 1
+6918 7965 1
+6918 7979 1
+6921 5543 1
+6922 5543 1
+6923 5289 1
+6923 5739 1
+6924 1498 1
+6924 5739 1
+6924 6044 1
+6924 6555 1
+6924 6907 1
+6924 7092 1
+6924 7131 1
+6924 7389 1
+6924 7588 1
+6924 7757 1
+6924 7840 1
+6924 7927 1
+6924 8050 1
+6924 8174 1
+6924 8224 1
+6924 8237 1
+6926 6227 1
+6927 6227 1
+6928 5563 1
+6929 6930 1
+6934 155 1
+6934 1865 1
+6934 2565 1
+6934 2785 1
+6934 2940 1
+6934 3238 1
+6934 3334 1
+6934 3459 1
+6934 4009 1
+6934 4037 1
+6934 4361 1
+6934 4884 1
+6934 4940 1
+6934 4944 1
+6934 5012 1
+6934 5233 1
+6934 5404 1
+6934 5524 1
+6934 5529 1
+6934 5582 1
+6934 5800 1
+6934 5806 1
+6934 5872 1
+6934 5922 1
+6934 5998 1
+6934 6000 1
+6934 6097 1
+6934 6270 1
+6934 6503 1
+6934 6560 1
+6934 6618 1
+6934 6624 1
+6934 6634 1
+6934 6665 1
+6934 6736 1
+6934 6765 1
+6934 6784 1
+6934 6832 1
+6934 6907 1
+6934 6913 1
+6934 6914 1
+6934 6946 1
+6934 6955 1
+6934 6993 1
+6934 7052 1
+6934 7054 1
+6934 7115 1
+6934 7119 1
+6934 7120 1
+6934 7186 1
+6934 7214 1
+6934 7262 1
+6934 7277 1
+6934 7378 1
+6934 7381 1
+6934 7400 1
+6934 7497 1
+6934 7512 1
+6934 7529 1
+6934 7561 1
+6934 7587 1
+6934 7620 1
+6934 7683 1
+6934 7795 1
+6934 7803 1
+6935 5524 1
+6935 6272 1
+6936 5524 1
+6938 4134 1
+6938 6934 1
+6938 7992 1
+6938 8019 1
+6940 4134 1
+6941 155 1
+6941 840 1
+6941 1026 1
+6941 1549 1
+6941 2851 1
+6941 3000 1
+6941 3238 1
+6941 3459 1
+6941 3726 1
+6941 3969 1
+6941 4037 1
+6941 4134 1
+6941 4341 1
+6941 4507 1
+6941 4940 1
+6941 5012 1
+6941 5022 1
+6941 5028 1
+6941 5432 1
+6941 5529 1
+6941 5745 1
+6941 5819 1
+6941 5835 1
+6941 6241 1
+6941 6327 1
+6941 6555 1
+6941 6560 1
+6941 6634 1
+6941 6665 1
+6941 6765 1
+6941 6784 1
+6941 6907 1
+6941 6913 1
+6941 6923 1
+6941 6976 1
+6941 7047 1
+6941 7052 1
+6941 7054 1
+6941 7131 1
+6941 7225 1
+6941 7280 1
+6941 7301 1
+6941 7378 1
+6941 7386 1
+6941 7400 1
+6941 7553 1
+6941 7557 1
+6941 7561 1
+6941 7587 1
+6941 7618 1
+6941 7620 1
+6941 7624 1
+6941 7632 1
+6941 7809 1
+6941 7810 1
+6941 7819 1
+6941 7833 1
+5529 840 1
+5529 1982 1
+5529 3459 1
+5529 3631 1
+5529 4071 1
+5529 4134 1
+5529 5022 1
+5529 5079 1
+5529 5210 1
+5529 5289 1
+5529 5465 1
+5529 5819 1
+5529 5839 1
+5529 5998 1
+5529 6044 1
+5529 6327 1
+5529 6330 1
+5529 6560 1
+5529 6955 1
+5529 6979 1
+5529 7074 1
+5529 7092 1
+5529 7144 1
+5529 7214 1
+5529 7443 1
+5529 7510 1
+5529 7553 1
+5529 7618 1
+5529 7649 1
+5529 7699 1
+5529 7803 1
+5529 7809 1
+5529 7813 1
+5529 7860 1
+5529 7890 1
+5529 7908 1
+5529 7921 1
+5529 7927 1
+5529 8168 1
+6943 5020 1
+6945 4536 1
+6945 4875 1
+6945 5012 1
+6945 5811 1
+6945 5872 1
+6945 6000 1
+6945 6414 1
+6945 6560 1
+6945 6634 1
+6945 7052 1
+6945 7054 1
+6945 7094 1
+6945 7119 1
+6945 7529 1
+6945 7544 1
+6945 7587 1
+6945 7763 1
+6945 8028 1
+6949 1982 1
+6949 6765 1
+6949 6790 1
+6949 6955 1
+6949 6979 1
+6947 6765 1
+6953 6955 1
+6954 6330 1
+6954 6955 1
+6954 6982 1
+6951 967 1
+6951 1498 1
+6951 1549 1
+6951 1982 1
+6951 2658 1
+6951 3084 1
+6951 3459 1
+6951 4401 1
+6951 4432 1
+6951 4507 1
+6951 4940 1
+6951 4983 1
+6951 5079 1
+6951 5643 1
+6951 5697 1
+6951 5738 1
+6951 6422 1
+6951 6555 1
+6951 6560 1
+6951 6979 1
+6951 6980 1
+6951 6993 1
+6951 7005 1
+6951 7021 1
+6951 7050 1
+6951 7092 1
+6951 7386 1
+6951 7393 1
+6951 7553 1
+6951 7636 1
+6951 7666 1
+6951 7778 1
+6951 7810 1
+6951 7819 1
+6951 7839 1
+6951 7881 1
+6951 7899 1
+6951 7921 1
+6951 7924 1
+6951 7991 1
+6951 8002 1
+6951 8007 1
+6951 8037 1
+6951 8042 1
+6951 8079 1
+6951 8204 1
+6951 8249 1
+6959 4536 1
+6959 5697 1
+6959 5839 1
+6959 6243 1
+6959 7295 1
+6692 5288 1
+6692 5697 1
+6692 7021 1
+6692 7092 1
+6692 7927 1
+6692 7979 1
+6958 5697 1
+6958 7060 1
+6960 5697 1
+6961 5697 1
+6961 6993 1
+6962 5697 1
+6963 5697 1
+6968 6523 1
+6969 6523 1
+6316 3084 1
+6316 3459 1
+6316 4037 1
+6316 5199 1
+6316 6123 1
+6316 6327 1
+6316 6330 1
+6316 6555 1
+6316 6665 1
+6316 6832 1
+6316 6907 1
+6316 6917 1
+6316 7052 1
+6316 7054 1
+6316 7092 1
+6316 7237 1
+6316 7378 1
+6316 7529 1
+6316 7553 1
+6971 1403 1
+6971 3459 1
+6971 4009 1
+6971 5199 1
+6971 6784 1
+6971 7295 1
+6972 3459 1
+6974 3459 1
+6974 6330 1
+6975 3334 1
+6975 3459 1
+6975 3962 1
+6975 4037 1
+6975 5801 1
+6975 6414 1
+6975 6784 1
+6975 6790 1
+6975 7110 1
+6975 7119 1
+6976 1026 1
+6976 2511 1
+6976 2851 1
+6976 3334 1
+6976 3459 1
+6976 4037 1
+6976 4361 1
+6976 4944 1
+6976 4981 1
+6976 5002 1
+6976 5079 1
+6976 5233 1
+6976 5582 1
+6976 5605 1
+6976 5776 1
+6976 5800 1
+6976 5822 1
+6976 6043 1
+6976 6097 1
+6976 6503 1
+6976 6774 1
+6976 6784 1
+6976 6914 1
+6976 6918 1
+6976 7073 1
+6976 7092 1
+6976 7101 1
+6976 7115 1
+6976 7119 1
+6976 7143 1
+6976 7214 1
+6976 7400 1
+6976 7510 1
+6976 7553 1
+6976 7649 1
+6976 7788 1
+6976 7795 1
+6976 7839 1
+6976 7871 1
+6976 7890 1
+6976 7908 1
+6978 6979 1
+6981 6982 1
+6984 840 1
+6984 4536 1
+6984 6330 1
+6984 6555 1
+6984 6790 1
+6984 7040 1
+6984 7052 1
+6985 6330 1
+6990 1982 1
+6991 840 1
+6991 1982 1
+6991 2565 1
+6991 3809 1
+6991 4361 1
+6991 4536 1
+6991 4666 1
+6991 5012 1
+6991 5199 1
+6991 5288 1
+6991 6198 1
+6991 6736 1
+6991 6789 1
+6991 7040 1
+6991 7052 1
+6991 7108 1
+6991 7295 1
+6991 7323 1
+6993 967 1
+6993 1191 1
+6993 1982 1
+6993 3084 1
+6993 3310 1
+6993 3381 1
+6993 3752 1
+6993 3885 1
+6993 3962 1
+6993 4071 1
+6993 4435 1
+6993 4632 1
+6993 4875 1
+6993 4981 1
+6993 5079 1
+6993 5199 1
+6993 5466 1
+6993 5643 1
+6993 5655 1
+6993 5806 1
+6993 5839 1
+6993 5872 1
+6993 5902 1
+6993 5933 1
+6993 6000 1
+6993 6032 1
+6993 6043 1
+6993 6151 1
+6993 6174 1
+6993 6243 1
+6993 6414 1
+6993 6447 1
+6993 6555 1
+6993 6560 1
+6993 6596 1
+6993 6624 1
+6993 6774 1
+6993 6784 1
+6993 6790 1
+6993 6913 1
+6993 6914 1
+6993 6976 1
+6993 6979 1
+6993 6980 1
+6993 7005 1
+6993 7012 1
+6993 7021 1
+6993 7063 1
+6993 7092 1
+6993 7237 1
+6993 7277 1
+6993 7279 1
+6993 7280 1
+6993 7295 1
+6993 7301 1
+6993 7414 1
+6993 7442 1
+6993 7649 1
+6993 7701 1
+6993 7757 1
+6993 7763 1
+6993 7788 1
+6993 7795 1
+6993 7803 1
+6993 7809 1
+6993 7810 1
+6993 7813 1
+6993 7835 1
+6993 7855 1
+6993 7862 1
+6993 7871 1
+6993 7879 1
+6993 7882 1
+6993 7890 1
+6993 7899 1
+6993 7910 1
+6993 7912 1
+6993 7927 1
+6993 7946 1
+6993 7952 1
+6993 7961 1
+6995 6790 1
+6996 6997 1
+6998 6774 1
+6999 6774 1
+7000 6774 1
+7001 6774 1
+7002 6774 1
+7002 7620 1
+7003 6774 1
+7004 6774 1
+7005 3962 1
+7005 4037 1
+7005 5210 1
+7005 6032 1
+7005 6043 1
+7005 6634 1
+7005 6774 1
+7005 6914 1
+7005 7553 1
+7005 7620 1
+7005 7757 1
+7005 7763 1
+7005 7788 1
+7006 6774 1
+7007 6774 1
+7008 6774 1
+7009 6774 1
+7010 6774 1
+7011 2565 1
+7011 4536 1
+7011 6774 1
+7012 2658 1
+7012 6043 1
+7012 6774 1
+7012 6784 1
+7012 6913 1
+7012 6914 1
+7012 7021 1
+7012 7414 1
+7012 7910 1
+7012 7961 1
+7013 6774 1
+7014 6774 1
+7014 7021 1
+7015 6774 1
+7016 6774 1
+7017 6774 1
+7018 6774 1
+7019 4981 1
+7019 6774 1
+7019 7021 1
+7019 7862 1
+7020 6774 1
+7020 6780 1
+7020 6832 1
+7021 2658 1
+7021 4981 1
+7021 5079 1
+7021 5096 1
+7021 5466 1
+7021 5800 1
+7021 5806 1
+7021 5872 1
+7021 6123 1
+7021 6774 1
+7021 7386 1
+7021 7414 1
+7021 7813 1
+7021 8121 1
+7021 8149 1
+7022 6774 1
+7023 3346 1
+7023 5772 1
+7023 6560 1
+7023 6774 1
+7023 7052 1
+7023 7215 1
+7023 7222 1
+7023 7246 1
+7024 5814 1
+7024 6774 1
+7024 6913 1
+7025 6774 1
+7026 3297 1
+7026 5096 1
+7026 5148 1
+7026 5210 1
+7026 6774 1
+7026 6918 1
+7026 6979 1
+7026 7021 1
+7026 7047 1
+7026 7116 1
+7026 7587 1
+7026 7965 1
+7026 8083 1
+7027 6774 1
+7028 6774 1
+7029 5079 1
+7029 6774 1
+7031 7033 1
+7032 7033 1
+7035 4536 1
+7035 6624 1
+7036 4536 1
+7036 7040 1
+7037 4536 1
+7041 7042 1
+7043 5378 1
+7043 6634 1
+7043 7059 1
+7043 7238 1
+7043 7553 1
+7043 7707 1
+7043 7735 1
+7043 7763 1
+7043 7833 1
+7043 8219 1
+7043 8226 1
+7043 8235 1
+7043 8249 1
+7043 8275 1
+7044 4940 1
+7044 7059 1
+7044 7803 1
+7051 7059 1
+7052 155 1
+7052 840 1
+7052 967 1
+7052 1191 1
+7052 1403 1
+7052 2565 1
+7052 2851 1
+7052 2940 1
+7052 3238 1
+7052 3459 1
+7052 3726 1
+7052 3752 1
+7052 3803 1
+7052 3962 1
+7052 3969 1
+7052 4071 1
+7052 4341 1
+7052 4361 1
+7052 4435 1
+7052 4632 1
+7052 4875 1
+7052 4884 1
+7052 4934 1
+7052 4981 1
+7052 5002 1
+7052 5022 1
+7052 5028 1
+7052 5199 1
+7052 5233 1
+7052 5289 1
+7052 5404 1
+7052 5406 1
+7052 5421 1
+7052 5465 1
+7052 5466 1
+7052 5605 1
+7052 5738 1
+7052 5760 1
+7052 5776 1
+7052 5800 1
+7052 5806 1
+7052 5835 1
+7052 5839 1
+7052 5872 1
+7052 5897 1
+7052 5932 1
+7052 5933 1
+7052 5998 1
+7052 6000 1
+7052 6032 1
+7052 6097 1
+7052 6151 1
+7052 6174 1
+7052 6241 1
+7052 6243 1
+7052 6414 1
+7052 6555 1
+7052 6665 1
+7052 6712 1
+7052 6714 1
+7052 6736 1
+7052 6789 1
+7052 6832 1
+7052 6875 1
+7052 6907 1
+7052 6914 1
+7052 6923 1
+7052 6924 1
+7052 6934 1
+7052 6953 1
+7052 6979 1
+7052 7005 1
+7052 7012 1
+7052 7021 1
+7052 7047 1
+7052 7054 1
+7052 7059 1
+7052 7063 1
+7052 7088 1
+7052 7092 1
+7052 7094 1
+7052 7101 1
+7052 7108 1
+7052 7115 1
+7052 7116 1
+7052 7119 1
+7052 7143 1
+7052 7144 1
+7052 7146 1
+7052 7225 1
+7052 7233 1
+7052 7237 1
+7052 7279 1
+7052 7301 1
+7052 7341 1
+7052 7351 1
+7052 7362 1
+7052 7378 1
+7052 7381 1
+7052 7391 1
+7052 7400 1
+7052 7450 1
+7052 7478 1
+7052 7491 1
+7052 7497 1
+7052 7510 1
+7052 7512 1
+7052 7529 1
+7052 7544 1
+7052 7553 1
+7052 7561 1
+7052 7587 1
+7052 7593 1
+7052 7618 1
+7052 7620 1
+7052 7624 1
+7052 7632 1
+7052 7646 1
+7052 7647 1
+7052 7651 1
+7052 7662 1
+7052 7666 1
+7052 7683 1
+7052 7694 1
+7052 7695 1
+7052 7699 1
+7052 7707 1
+7052 7835 1
+7052 7855 1
+7052 7862 1
+7052 7871 1
+7052 7879 1
+7052 7890 1
+7052 7910 1
+7052 7912 1
+7052 7927 1
+7052 7946 1
+7052 7961 1
+7052 8163 1
+7052 8168 1
+7052 8178 1
+7052 8192 1
+7045 967 1
+7045 1498 1
+7045 3238 1
+7045 3381 1
+7045 5148 1
+7045 5671 1
+7045 5760 1
+7045 6241 1
+7045 6320 1
+7045 6414 1
+7045 6523 1
+7045 6712 1
+7045 6789 1
+7045 6934 1
+7045 6980 1
+7045 7021 1
+7045 7047 1
+7045 7052 1
+7045 7059 1
+7045 7280 1
+7045 7295 1
+7045 7443 1
+7045 7497 1
+7045 7544 1
+7045 7618 1
+7045 7620 1
+7045 7624 1
+7045 7662 1
+7045 7683 1
+7045 7694 1
+7045 7695 1
+7045 7699 1
+7045 7726 1
+7045 7757 1
+7045 7763 1
+7045 7882 1
+7053 3084 1
+7053 3297 1
+7053 3459 1
+7053 4401 1
+7053 4940 1
+7053 5148 1
+7053 5210 1
+7053 5246 1
+7053 5378 1
+7053 5671 1
+7053 5887 1
+7053 6307 1
+7053 6422 1
+7053 6618 1
+7053 6634 1
+7053 6914 1
+7053 6993 1
+7053 7047 1
+7053 7059 1
+7053 7225 1
+7053 7378 1
+7053 7389 1
+7053 7517 1
+7053 7553 1
+7053 7699 1
+7053 7791 1
+7053 8043 1
+7053 8083 1
+7053 8134 1
+7053 8224 1
+7053 8235 1
+7054 155 1
+7054 1026 1
+7054 3000 1
+7054 3238 1
+7054 3459 1
+7054 4884 1
+7054 5002 1
+7054 5393 1
+7054 5421 1
+7054 5500 1
+7054 5902 1
+7054 6424 1
+7054 6712 1
+7054 6907 1
+7054 6934 1
+7054 7052 1
+7054 7059 1
+7054 7116 1
+7054 7225 1
+7054 7316 1
+7054 7378 1
+7054 7510 1
+7054 7553 1
+7054 7557 1
+7054 7561 1
+7054 7583 1
+7054 7587 1
+7054 7593 1
+7054 7604 1
+7054 7620 1
+7054 7632 1
+7054 7646 1
+7054 7648 1
+7054 7651 1
+7054 7652 1
+7054 7673 1
+7054 7688 1
+7054 7695 1
+7054 7699 1
+7054 7809 1
+7046 3238 1
+7046 3334 1
+7046 3459 1
+7046 4884 1
+7046 5465 1
+7046 5800 1
+7046 6712 1
+7046 7047 1
+7046 7052 1
+7046 7059 1
+7046 7225 1
+7046 7414 1
+7046 7553 1
+7046 7557 1
+7046 7561 1
+7046 7620 1
+7046 7642 1
+7046 7646 1
+7046 7662 1
+7046 7688 1
+7046 7695 1
+7047 1191 1
+7047 1498 1
+7047 1865 1
+7047 1982 1
+7047 2223 1
+7047 2658 1
+7047 3238 1
+7047 3293 1
+7047 3297 1
+7047 3381 1
+7047 3962 1
+7047 4037 1
+7047 4071 1
+7047 4401 1
+7047 4432 1
+7047 4435 1
+7047 4507 1
+7047 4981 1
+7047 4983 1
+7047 5022 1
+7047 5079 1
+7047 5096 1
+7047 5148 1
+7047 5179 1
+7047 5210 1
+7047 5246 1
+7047 5378 1
+7047 5421 1
+7047 5466 1
+7047 5529 1
+7047 5605 1
+7047 5614 1
+7047 5643 1
+7047 5671 1
+7047 5738 1
+7047 5812 1
+7047 5819 1
+7047 5839 1
+7047 5887 1
+7047 5933 1
+7047 6032 1
+7047 6043 1
+7047 6044 1
+7047 6151 1
+7047 6174 1
+7047 6320 1
+7047 6414 1
+7047 6422 1
+7047 6523 1
+7047 6555 1
+7047 6560 1
+7047 6618 1
+7047 6634 1
+7047 6712 1
+7047 6737 1
+7047 6759 1
+7047 6780 1
+7047 6875 1
+7047 6914 1
+7047 6918 1
+7047 6934 1
+7047 6946 1
+7047 6979 1
+7047 6980 1
+7047 6993 1
+7047 7021 1
+7047 7052 1
+7047 7059 1
+7047 7063 1
+7047 7092 1
+7047 7120 1
+7047 7233 1
+7047 7277 1
+7047 7280 1
+7047 7341 1
+7047 7386 1
+7047 7389 1
+7047 7391 1
+7047 7443 1
+7047 7544 1
+7047 7553 1
+7047 7620 1
+7047 7634 1
+7047 7646 1
+7047 7649 1
+7047 7651 1
+7047 7662 1
+7047 7683 1
+7047 7694 1
+7047 7695 1
+7047 7699 1
+7047 7707 1
+7047 7726 1
+7047 7763 1
+7047 7778 1
+7047 7788 1
+7047 7795 1
+7047 7803 1
+7047 7809 1
+7047 7810 1
+7047 7813 1
+7047 7833 1
+7047 7835 1
+7047 7839 1
+7047 7855 1
+7047 7860 1
+7047 7862 1
+7047 7871 1
+7047 7874 1
+7047 7879 1
+7047 7882 1
+7047 7890 1
+7047 7908 1
+7047 7912 1
+7047 7921 1
+7047 7924 1
+7047 7927 1
+7047 7946 1
+7047 7961 1
+7047 7965 1
+7047 7979 1
+7047 7991 1
+7047 7992 1
+7047 7994 1
+7047 7996 1
+7047 8002 1
+7047 8033 1
+7047 8037 1
+7047 8042 1
+7047 8044 1
+7047 8051 1
+7047 8073 1
+7047 8079 1
+7047 8121 1
+7047 8122 1
+7047 8124 1
+7047 8128 1
+7047 8132 1
+7047 8134 1
+7047 8139 1
+7047 8141 1
+7047 8163 1
+7047 8168 1
+7047 8174 1
+7047 8178 1
+7047 8192 1
+7047 8198 1
+7047 8204 1
+7047 8209 1
+7047 8212 1
+7047 8224 1
+7047 8225 1
+7047 8226 1
+7047 8235 1
+7047 8237 1
+7047 8246 1
+7047 8249 1
+7047 8263 1
+7047 8275 1
+7047 8276 1
+7047 8277 1
+7055 155 1
+7055 967 1
+7055 1498 1
+7055 3000 1
+7055 3238 1
+7055 3381 1
+7055 3459 1
+7055 3752 1
+7055 3885 1
+7055 3969 1
+7055 4341 1
+7055 4632 1
+7055 4875 1
+7055 4983 1
+7055 5002 1
+7055 5022 1
+7055 5028 1
+7055 5079 1
+7055 5096 1
+7055 5148 1
+7055 5289 1
+7055 5465 1
+7055 5605 1
+7055 5671 1
+7055 5800 1
+7055 5806 1
+7055 5835 1
+7055 5839 1
+7055 5872 1
+7055 5902 1
+7055 5933 1
+7055 6151 1
+7055 6241 1
+7055 6243 1
+7055 6442 1
+7055 6523 1
+7055 6634 1
+7055 6665 1
+7055 6712 1
+7055 6907 1
+7055 6934 1
+7055 6946 1
+7055 6980 1
+7055 7005 1
+7055 7012 1
+7055 7021 1
+7055 7047 1
+7055 7052 1
+7055 7059 1
+7055 7063 1
+7055 7088 1
+7055 7131 1
+7055 7237 1
+7055 7277 1
+7055 7279 1
+7055 7400 1
+7055 7414 1
+7055 7443 1
+7055 7450 1
+7055 7478 1
+7055 7510 1
+7055 7512 1
+7055 7561 1
+7055 7593 1
+7055 7618 1
+7055 7620 1
+7055 7624 1
+7055 7632 1
+7055 7634 1
+7055 7642 1
+7055 7646 1
+7055 7649 1
+7055 7651 1
+7055 7662 1
+7055 7683 1
+7055 7694 1
+7055 7695 1
+7055 7699 1
+7055 7707 1
+7055 7726 1
+7055 7757 1
+7055 7763 1
+7055 7778 1
+7055 7788 1
+7055 7795 1
+7055 7809 1
+7055 7813 1
+7055 7835 1
+7055 7871 1
+7055 7882 1
+7055 7910 1
+7055 7946 1
+7055 7965 1
+7055 7979 1
+7055 7992 1
+7055 8051 1
+7055 8174 1
+7055 8192 1
+7048 7059 1
+7056 1982 1
+7056 2565 1
+7056 3381 1
+7056 4983 1
+7056 5064 1
+7056 5148 1
+7056 5179 1
+7056 5671 1
+7056 5738 1
+7056 5839 1
+7056 6320 1
+7056 6523 1
+7056 6560 1
+7056 6980 1
+7056 6993 1
+7056 7052 1
+7056 7059 1
+7056 7116 1
+7056 7233 1
+7056 7277 1
+7056 7280 1
+7056 7443 1
+7056 7544 1
+7056 7618 1
+7056 7620 1
+7056 7666 1
+7056 7694 1
+7056 7726 1
+7056 7757 1
+7056 7763 1
+7056 7795 1
+7056 7803 1
+7056 7809 1
+7056 7839 1
+7056 7979 1
+7056 8209 1
+7056 8226 1
+7049 1191 1
+7049 3310 1
+7049 3381 1
+7049 4435 1
+7049 5096 1
+7049 5148 1
+7049 5466 1
+7049 5529 1
+7049 5671 1
+7049 6151 1
+7049 6555 1
+7049 6980 1
+7049 7005 1
+7049 7059 1
+7049 7277 1
+7049 7280 1
+7049 7443 1
+7049 7694 1
+7049 7757 1
+7049 7763 1
+7049 7788 1
+7049 7795 1
+7049 7803 1
+7049 7809 1
+7049 7855 1
+7049 7862 1
+7049 7871 1
+7057 155 1
+7057 1498 1
+7057 1982 1
+7057 2565 1
+7057 3000 1
+7057 3084 1
+7057 3297 1
+7057 3334 1
+7057 3459 1
+7057 3885 1
+7057 3962 1
+7057 3969 1
+7057 4037 1
+7057 4071 1
+7057 4341 1
+7057 4401 1
+7057 4632 1
+7057 4875 1
+7057 4940 1
+7057 4981 1
+7057 4983 1
+7057 5002 1
+7057 5022 1
+7057 5079 1
+7057 5210 1
+7057 5289 1
+7057 5406 1
+7057 5466 1
+7057 5500 1
+7057 5529 1
+7057 5800 1
+7057 5806 1
+7057 5812 1
+7057 5819 1
+7057 5835 1
+7057 5839 1
+7057 5872 1
+7057 5902 1
+7057 5933 1
+7057 6000 1
+7057 6032 1
+7057 6043 1
+7057 6044 1
+7057 6123 1
+7057 6151 1
+7057 6174 1
+7057 6241 1
+7057 6243 1
+7057 6320 1
+7057 6414 1
+7057 6417 1
+7057 6442 1
+7057 6555 1
+7057 6560 1
+7057 6596 1
+7057 6618 1
+7057 6634 1
+7057 6665 1
+7057 6875 1
+7057 6907 1
+7057 6914 1
+7057 6918 1
+7057 6924 1
+7057 6934 1
+7057 6946 1
+7057 6979 1
+7057 6980 1
+7057 6993 1
+7057 7005 1
+7057 7047 1
+7057 7050 1
+7057 7052 1
+7057 7054 1
+7057 7059 1
+7057 7063 1
+7057 7088 1
+7057 7092 1
+7057 7131 1
+7057 7225 1
+7057 7233 1
+7057 7237 1
+7057 7238 1
+7057 7279 1
+7057 7280 1
+7057 7378 1
+7057 7386 1
+7057 7400 1
+7057 7442 1
+7057 7478 1
+7057 7497 1
+7057 7510 1
+7057 7512 1
+7057 7529 1
+7057 7544 1
+7057 7561 1
+7057 7587 1
+7057 7620 1
+7057 7647 1
+7057 7699 1
+7057 7707 1
+7057 7763 1
+7057 7788 1
+7057 7809 1
+7057 7810 1
+7057 7833 1
+7057 7839 1
+7057 7908 1
+7057 7924 1
+7057 7961 1
+7057 7965 1
+7057 8051 1
+7057 8083 1
+7057 8121 1
+7057 8134 1
+7057 8168 1
+7057 8209 1
+7057 8224 1
+7057 8237 1
+7030 5822 1
+7030 6327 1
+7061 5822 1
+7061 6123 1
+7061 6832 1
+7062 1982 1
+7062 6634 1
+7062 7050 1
+7062 7620 1
+7063 840 1
+7063 2565 1
+7063 3238 1
+7063 5800 1
+7063 6123 1
+7063 6555 1
+7063 6784 1
+7063 6832 1
+7063 6907 1
+7063 6913 1
+7063 6914 1
+7063 7414 1
+7063 7510 1
+7063 7553 1
+7063 7620 1
+7063 7961 1
+7064 2565 1
+7064 6097 1
+7064 6946 1
+7065 2565 1
+7038 840 1
+7038 3809 1
+7038 4944 1
+7038 5772 1
+7038 6097 1
+7038 6327 1
+7038 6634 1
+7072 7073 1
+7070 7073 1
+7070 7115 1
+7071 7073 1
+7071 7092 1
+7071 7115 1
+7071 7414 1
+7079 4666 1
+7080 1982 1
+7080 2511 1
+7080 2658 1
+7080 3084 1
+7080 3297 1
+7080 3381 1
+7080 3459 1
+7080 3885 1
+7080 3962 1
+7080 4666 1
+7080 4944 1
+7080 4983 1
+7080 5002 1
+7080 5012 1
+7080 5022 1
+7080 5199 1
+7080 5210 1
+7080 5288 1
+7080 5773 1
+7080 5800 1
+7080 5806 1
+7080 5819 1
+7080 5872 1
+7080 5902 1
+7080 5933 1
+7080 6000 1
+7080 6243 1
+7080 6270 1
+7080 6320 1
+7080 6555 1
+7080 6560 1
+7080 6736 1
+7080 6759 1
+7080 6946 1
+7080 6979 1
+7080 6980 1
+7080 7108 1
+7080 7185 1
+7080 7225 1
+7080 7277 1
+7080 7279 1
+7080 7280 1
+7080 7295 1
+7080 7301 1
+7080 7414 1
+7080 7442 1
+7080 7449 1
+7080 7478 1
+7080 7497 1
+7080 7510 1
+7080 7529 1
+7080 7574 1
+7080 7620 1
+7080 7624 1
+7080 7647 1
+7080 7666 1
+7080 7688 1
+7080 7797 1
+7080 7813 1
+7080 7871 1
+7080 7879 1
+7080 7882 1
+7080 7924 1
+7080 7927 1
+7080 7928 1
+7080 7965 1
+7080 8130 1
+7080 8163 1
+7080 8168 1
+7080 8174 1
+7082 4944 1
+6946 938 1
+6946 1026 1
+6946 2940 1
+6946 3238 1
+6946 4341 1
+6946 4632 1
+6946 4879 1
+6946 4884 1
+6946 4934 1
+6946 4992 1
+6946 5002 1
+6946 5028 1
+6946 5179 1
+6946 5289 1
+6946 5393 1
+6946 5421 1
+6946 5745 1
+6946 5800 1
+6946 6032 1
+6946 6417 1
+6946 6424 1
+6946 6634 1
+6946 6665 1
+6946 6780 1
+6946 6924 1
+6946 7116 1
+6946 7120 1
+6946 7225 1
+6946 7362 1
+6946 7378 1
+6946 7386 1
+6946 7391 1
+6946 7397 1
+6946 7423 1
+6946 7434 1
+6946 7436 1
+6946 7440 1
+6946 7442 1
+6946 7574 1
+6946 7587 1
+6946 7590 1
+6946 7604 1
+6946 7620 1
+6946 7642 1
+6946 7648 1
+6946 7652 1
+6946 7653 1
+6946 7666 1
+6946 7668 1
+6946 7669 1
+6946 7683 1
+6946 7688 1
+6946 7701 1
+6946 7809 1
+6946 7857 1
+6946 7928 1
+6946 7952 1
+6946 7992 1
+6946 7994 1
+6946 7996 1
+6946 8007 1
+6946 8019 1
+6946 8025 1
+6946 8090 1
+6946 8121 1
+6946 8128 1
+6946 8130 1
+6946 8169 1
+7085 6946 1
+7087 6946 1
+7087 7699 1
+7086 938 1
+7086 1403 1
+7086 1498 1
+7086 1982 1
+7086 2658 1
+7086 2851 1
+7086 3293 1
+7086 3297 1
+7086 3346 1
+7086 3726 1
+7086 4037 1
+7086 4071 1
+7086 4401 1
+7086 4432 1
+7086 4632 1
+7086 4875 1
+7086 4940 1
+7086 4966 1
+7086 4983 1
+7086 5022 1
+7086 5096 1
+7086 5210 1
+7086 5246 1
+7086 5289 1
+7086 5378 1
+7086 5404 1
+7086 5406 1
+7086 5432 1
+7086 5605 1
+7086 5614 1
+7086 5738 1
+7086 5800 1
+7086 5806 1
+7086 5812 1
+7086 5819 1
+7086 5839 1
+7086 5872 1
+7086 5902 1
+7086 5933 1
+7086 6000 1
+7086 6044 1
+7086 6174 1
+7086 6243 1
+7086 6422 1
+7086 6442 1
+7086 6523 1
+7086 6618 1
+7086 6634 1
+7086 6665 1
+7086 6736 1
+7086 6737 1
+7086 6759 1
+7086 6780 1
+7086 6784 1
+7086 6875 1
+7086 6907 1
+7086 6918 1
+7086 6946 1
+7086 7021 1
+7086 7047 1
+7086 7088 1
+7086 7094 1
+7086 7108 1
+7086 7131 1
+7086 7233 1
+7086 7237 1
+7086 7238 1
+7086 7243 1
+7086 7279 1
+7086 7341 1
+7086 7378 1
+7086 7389 1
+7086 7391 1
+7086 7414 1
+7086 7422 1
+7086 7450 1
+7086 7478 1
+7086 7491 1
+7086 7497 1
+7086 7510 1
+7086 7512 1
+7086 7517 1
+7086 7529 1
+7086 7553 1
+7086 7561 1
+7086 7620 1
+7086 7646 1
+7086 7810 1
+7086 7833 1
+7086 7835 1
+7086 7855 1
+7086 7860 1
+7086 7882 1
+7086 7908 1
+7086 7910 1
+7086 7912 1
+7086 7924 1
+7086 7946 1
+7086 7965 1
+7086 7979 1
+7086 7992 1
+7086 8037 1
+7086 8042 1
+7086 8044 1
+7086 8051 1
+7086 8073 1
+7086 8083 1
+7086 8121 1
+7086 8124 1
+7086 8128 1
+7086 8134 1
+7086 8141 1
+7086 8149 1
+7086 8163 1
+7086 8168 1
+7086 8174 1
+7086 8192 1
+7086 8198 1
+7086 8209 1
+7086 8212 1
+7086 8219 1
+7086 8224 1
+7086 8237 1
+7084 6946 1
+7088 4940 1
+7088 6097 1
+7088 7533 1
+7088 7632 1
+7088 7699 1
+7090 155 1
+7090 1026 1
+7090 2565 1
+7090 3459 1
+7090 3803 1
+7090 5002 1
+7090 7054 1
+7090 7225 1
+7090 7378 1
+7090 7529 1
+7090 7553 1
+7092 1026 1
+7092 1191 1
+7092 1403 1
+7092 1982 1
+7092 2785 1
+7092 2851 1
+7092 3310 1
+7092 3346 1
+7092 3459 1
+7092 3726 1
+7092 3885 1
+7092 3962 1
+7092 3969 1
+7092 4037 1
+7092 4071 1
+7092 4341 1
+7092 4507 1
+7092 4632 1
+7092 5002 1
+7092 5022 1
+7092 5079 1
+7092 5179 1
+7092 5210 1
+7092 5288 1
+7092 5289 1
+7092 5529 1
+7092 5671 1
+7092 5745 1
+7092 5773 1
+7092 5800 1
+7092 5835 1
+7092 5872 1
+7092 5902 1
+7092 5998 1
+7092 6000 1
+7092 6032 1
+7092 6043 1
+7092 6044 1
+7092 6243 1
+7092 6327 1
+7092 6414 1
+7092 6422 1
+7092 6523 1
+7092 6560 1
+7092 6618 1
+7092 6665 1
+7092 6736 1
+7092 6755 1
+7092 6784 1
+7092 6832 1
+7092 6914 1
+7092 6980 1
+7092 7005 1
+7092 7052 1
+7092 7131 1
+7092 7144 1
+7092 7162 1
+7092 7185 1
+7092 7214 1
+7092 7225 1
+7092 7237 1
+7092 7243 1
+7092 7280 1
+7092 7301 1
+7092 7378 1
+7092 7389 1
+7092 7400 1
+7092 7414 1
+7092 7443 1
+7092 7510 1
+7092 7553 1
+7092 7557 1
+7092 7561 1
+7092 7587 1
+7092 7618 1
+7092 7624 1
+7092 7632 1
+7092 7649 1
+7092 7651 1
+7092 7662 1
+7092 7788 1
+7092 7795 1
+7092 7809 1
+7092 7833 1
+7092 7835 1
+7092 7890 1
+7092 7924 1
+7092 7952 1
+7092 7961 1
+7092 8033 1
+7092 8068 1
+7092 8121 1
+7092 8168 1
+5015 3293 1
+5015 4940 1
+5015 5002 1
+5015 5199 1
+5015 5760 1
+5015 6044 1
+5015 6299 1
+5015 6422 1
+5015 6634 1
+5015 6979 1
+5015 7620 1
+5015 7646 1
+5015 7810 1
+5015 8122 1
+7089 6634 1
+7089 7301 1
+7096 3459 1
+7096 5773 1
+7096 6634 1
+7096 7054 1
+7096 7529 1
+7095 6634 1
+7098 7101 1
+7099 2785 1
+7099 3631 1
+7099 5288 1
+7099 5393 1
+7099 5582 1
+7099 5760 1
+7099 5814 1
+7099 5897 1
+7099 6270 1
+7099 6414 1
+7099 6560 1
+7099 6714 1
+7099 6907 1
+7099 6913 1
+7099 6976 1
+7099 7101 1
+7099 7214 1
+7099 7400 1
+7100 4037 1
+7100 5012 1
+7100 5384 1
+7100 5432 1
+7100 5582 1
+7100 6327 1
+7100 6414 1
+7100 6913 1
+7100 6976 1
+7100 7101 1
+7100 7115 1
+7100 7119 1
+7100 7143 1
+7100 7144 1
+7100 7301 1
+7103 7108 1
+7104 1403 1
+7104 2785 1
+7104 2851 1
+7104 3631 1
+7104 3726 1
+7104 5002 1
+7104 5404 1
+7104 5432 1
+7104 6665 1
+7104 6784 1
+7104 6913 1
+7104 6976 1
+7104 7108 1
+7104 7214 1
+7104 7301 1
+7106 2785 1
+7106 2851 1
+7106 3726 1
+7106 7108 1
+7107 7108 1
+7107 7273 1
+7109 7115 1
+7109 7510 1
+7110 3885 1
+7110 5384 1
+7110 6414 1
+7110 7092 1
+7110 7115 1
+7111 7115 1
+7112 7115 1
+7113 3334 1
+7113 3752 1
+7113 5233 1
+7113 5466 1
+7113 6422 1
+7113 6946 1
+7113 7115 1
+7113 7237 1
+7113 7439 1
+7113 7529 1
+7113 7587 1
+7113 7961 1
+7114 7115 1
+7116 4875 1
+7118 7119 1
+7117 4037 1
+7117 4632 1
+7117 6327 1
+7117 6994 1
+7117 7119 1
+7117 7143 1
+7117 7144 1
+7120 1865 1
+7120 3238 1
+7120 3381 1
+7120 5776 1
+7120 6241 1
+7120 6320 1
+7120 6560 1
+7120 6712 1
+7120 7047 1
+7120 7386 1
+7120 7544 1
+7120 7634 1
+7120 7651 1
+7120 7683 1
+7120 7695 1
+7120 7699 1
+7120 7707 1
+7120 7809 1
+7121 4361 1
+7121 5776 1
+7121 5800 1
+7121 5969 1
+7121 6714 1
+7121 6832 1
+7121 7279 1
+7123 5384 1
+7122 5384 1
+7124 4037 1
+7125 4037 1
+7127 4037 1
+7127 7301 1
+7128 4037 1
+7128 6784 1
+7129 4037 1
+7129 5500 1
+7129 5897 1
+7129 6299 1
+7129 6784 1
+7129 6832 1
+7129 6993 1
+7129 7290 1
+7129 7587 1
+7129 7666 1
+7129 7763 1
+7136 4037 1
+7136 4884 1
+7130 4037 1
+7130 5773 1
+7137 4037 1
+7131 967 1
+7131 2658 1
+7131 3238 1
+7131 3962 1
+7131 4037 1
+7131 4940 1
+7131 5773 1
+7131 6032 1
+7131 6123 1
+7131 6442 1
+7131 6555 1
+7131 6832 1
+7131 6907 1
+7131 6914 1
+7131 7021 1
+7131 7092 1
+7131 7280 1
+7131 7414 1
+7131 7553 1
+7131 7587 1
+7131 7809 1
+7131 7833 1
+7131 7871 1
+7131 7910 1
+7126 2511 1
+7126 4037 1
+7126 5773 1
+7132 2851 1
+7132 3238 1
+7132 4037 1
+7132 5002 1
+7132 5839 1
+7132 5872 1
+7132 6043 1
+7132 6123 1
+7132 6555 1
+7132 6784 1
+7132 6832 1
+7132 6913 1
+7132 6914 1
+7132 7021 1
+7132 7052 1
+7132 7063 1
+7132 7131 1
+7132 7257 1
+7132 7280 1
+7132 7304 1
+7132 7306 1
+7132 7362 1
+7132 7407 1
+7132 7423 1
+7132 7561 1
+7132 7567 1
+7132 7666 1
+7132 7809 1
+7132 7961 1
+7132 8121 1
+7133 4037 1
+7138 4037 1
+7138 7214 1
+7134 4037 1
+7134 7373 1
+7134 7587 1
+7139 2851 1
+7139 4037 1
+7139 7214 1
+7140 4037 1
+7135 4037 1
+6986 7143 1
+7142 2511 1
+7142 5773 1
+7142 7143 1
+7142 7144 1
+7145 7144 1
+7146 7144 1
+7151 6414 1
+7153 5022 1
+7153 5671 1
+7153 5887 1
+7153 5897 1
+7153 5969 1
+7153 6327 1
+7153 6907 1
+7153 6914 1
+7153 7373 1
+7153 8134 1
+7153 8141 1
+7153 8148 1
+7154 6327 1
+7155 6327 1
+7156 6327 1
+7157 6327 1
+7160 6327 1
+7158 6327 1
+7159 6327 1
+6994 1403 1
+6994 2851 1
+6994 3726 1
+6994 5432 1
+6994 5582 1
+6994 5969 1
+6994 6560 1
+6994 6634 1
+6994 6714 1
+6994 6736 1
+6994 6784 1
+6994 6913 1
+6994 7161 1
+6994 7214 1
+6994 7222 1
+6994 7250 1
+6994 7289 1
+6994 7290 1
+6994 7301 1
+7163 7162 1
+7163 7254 1
+7164 3962 1
+7164 5012 1
+7164 5179 1
+7164 6789 1
+7165 1026 1
+7165 7050 1
+7165 7168 1
+7166 7168 1
+7167 7168 1
+7172 2511 1
+7172 7649 1
+7173 2511 1
+7173 5819 1
+7174 5773 1
+7175 5773 1
+7175 7131 1
+7178 5773 1
+7178 7587 1
+7179 5773 1
+7179 7131 1
+7176 5773 1
+7176 7116 1
+7176 7185 1
+7176 7620 1
+7177 5773 1
+7183 5179 1
+7183 5529 1
+7183 5814 1
+7183 6665 1
+7183 6914 1
+7183 6980 1
+7183 7225 1
+7183 7924 1
+7183 8186 1
+7184 3631 1
+7184 7185 1
+7187 3631 1
+7188 1403 1
+7188 3631 1
+7188 3726 1
+7188 4361 1
+7188 5811 1
+7188 6299 1
+7188 6596 1
+7188 6789 1
+7188 6832 1
+7188 6976 1
+7188 7315 1
+7188 7351 1
+7188 7386 1
+7188 7397 1
+7189 3631 1
+7189 5760 1
+7189 8174 1
+7190 7191 1
+7192 5288 1
+7193 5288 1
+6889 5288 1
+6889 7233 1
+6889 7701 1
+6889 7921 1
+6889 7928 1
+7194 7195 1
+7197 2785 1
+7198 2785 1
+7198 4037 1
+7198 4401 1
+7198 7707 1
+7198 8219 1
+7198 8224 1
+7198 8225 1
+7198 8226 1
+7203 6270 1
+7205 7023 1
+7206 7023 1
+7210 7214 1
+7211 7214 1
+7212 7214 1
+7217 6994 1
+7219 1919 1
+7218 1919 1
+7220 5404 1
+7221 5404 1
+7222 1403 1
+7223 6665 1
+7225 155 1
+7225 1026 1
+7225 1982 1
+7225 2658 1
+7225 3084 1
+7225 3310 1
+7225 3459 1
+7225 4071 1
+7225 4966 1
+7225 5022 1
+7225 5079 1
+7225 5406 1
+7225 5655 1
+7225 5800 1
+7225 5806 1
+7225 5819 1
+7225 5839 1
+7225 5872 1
+7225 5902 1
+7225 6000 1
+7225 6032 1
+7225 6320 1
+7225 6555 1
+7225 6596 1
+7225 6665 1
+7225 6914 1
+7225 6979 1
+7225 7092 1
+7225 7237 1
+7225 7378 1
+7225 7386 1
+7225 7400 1
+7225 7449 1
+7225 7508 1
+7225 7510 1
+7225 7529 1
+7225 7553 1
+7225 7620 1
+7225 7632 1
+7225 7652 1
+7225 7662 1
+7225 7699 1
+7225 7707 1
+7225 7730 1
+7225 7835 1
+7225 7924 1
+7225 8192 1
+7226 5835 1
+7226 6665 1
+7226 7553 1
+7226 7557 1
+7227 155 1
+7227 1026 1
+7227 3962 1
+7227 5872 1
+7227 6555 1
+7227 6665 1
+7227 6923 1
+7227 7225 1
+7227 7277 1
+7227 7533 1
+7227 7587 1
+7227 7910 1
+7228 2565 1
+7228 4884 1
+7228 6665 1
+7228 7225 1
+7228 7561 1
+7228 7620 1
+7228 7662 1
+7229 1026 1
+7229 4341 1
+7229 5835 1
+7229 6665 1
+7229 7400 1
+7229 7553 1
+7229 7557 1
+5143 1026 1
+5143 1403 1
+5143 2851 1
+5143 3726 1
+5143 5806 1
+5143 6665 1
+5143 6736 1
+5143 6907 1
+5143 6913 1
+5143 7225 1
+5143 7246 1
+5143 7250 1
+5143 7273 1
+5143 7289 1
+5143 7557 1
+5143 7651 1
+7230 4884 1
+7230 5806 1
+7230 6665 1
+7230 7632 1
+7231 155 1
+7231 938 1
+7231 967 1
+7231 1026 1
+7231 2565 1
+7231 3000 1
+7231 3084 1
+7231 3238 1
+7231 3310 1
+7231 3381 1
+7231 3752 1
+7231 3885 1
+7231 3962 1
+7231 4071 1
+7231 4341 1
+7231 4435 1
+7231 4632 1
+7231 4879 1
+7231 4884 1
+7231 4981 1
+7231 5028 1
+7231 5079 1
+7231 5148 1
+7231 5289 1
+7231 5465 1
+7231 5500 1
+7231 5529 1
+7231 5671 1
+7231 5800 1
+7231 5806 1
+7231 5839 1
+7231 5872 1
+7231 5902 1
+7231 6000 1
+7231 6043 1
+7231 6151 1
+7231 6174 1
+7231 6241 1
+7231 6243 1
+7231 6523 1
+7231 6560 1
+7231 6665 1
+7231 6712 1
+7231 6907 1
+7231 6914 1
+7231 6934 1
+7231 6980 1
+7231 7005 1
+7231 7047 1
+7231 7052 1
+7231 7054 1
+7231 7116 1
+7231 7131 1
+7231 7225 1
+7231 7237 1
+7231 7277 1
+7231 7279 1
+7231 7280 1
+7231 7386 1
+7231 7400 1
+7231 7414 1
+7231 7443 1
+7231 7450 1
+7231 7478 1
+7231 7490 1
+7231 7498 1
+7231 7510 1
+7231 7544 1
+7231 7587 1
+7231 7593 1
+7231 7604 1
+7231 7618 1
+7231 7620 1
+7231 7624 1
+7231 7632 1
+7231 7642 1
+7231 7646 1
+7231 7649 1
+7231 7651 1
+7231 7658 1
+7231 7662 1
+7231 7673 1
+7231 7683 1
+7231 7694 1
+7231 7695 1
+7231 7699 1
+7231 7707 1
+7231 7726 1
+7231 7757 1
+7231 7763 1
+7231 7788 1
+7231 7795 1
+7231 7809 1
+7231 7813 1
+7231 7855 1
+7231 7862 1
+7231 7871 1
+7231 7879 1
+7231 7882 1
+7231 7890 1
+7231 7921 1
+7232 6907 1
+7233 5179 1
+7233 5760 1
+7233 5811 1
+7233 5872 1
+7233 6123 1
+7233 6447 1
+7233 6907 1
+7233 6946 1
+7233 7386 1
+7233 7389 1
+7233 7407 1
+7233 7422 1
+7233 7529 1
+7233 7683 1
+7233 7809 1
+7233 7860 1
+7233 7992 1
+7233 8083 1
+7233 8121 1
+7233 8134 1
+7233 8174 1
+7233 8192 1
+7234 6907 1
+7235 6907 1
+7236 1026 1
+7236 2658 1
+7236 3084 1
+7236 4632 1
+7236 4884 1
+7236 5002 1
+7236 5079 1
+7236 5148 1
+7236 5500 1
+7236 6032 1
+7236 6907 1
+7236 6993 1
+7236 7088 1
+7236 7378 1
+7236 7478 1
+7236 7529 1
+7236 7553 1
+7236 7588 1
+7236 7620 1
+7236 7632 1
+7236 7662 1
+7236 7695 1
+7236 7699 1
+7237 938 1
+7237 5064 1
+7237 5738 1
+7237 5800 1
+7237 6243 1
+7237 6907 1
+7237 7050 1
+7237 7233 1
+7237 7391 1
+7237 7498 1
+7237 7529 1
+7237 8051 1
+7237 8192 1
+7237 8198 1
+7237 8224 1
+7238 4432 1
+7238 4884 1
+7238 6618 1
+7238 6907 1
+7238 7233 1
+7238 7620 1
+7238 7624 1
+7238 7833 1
+7238 8212 1
+7239 3000 1
+7239 3969 1
+7239 4632 1
+7239 4875 1
+7239 4884 1
+7239 5806 1
+7239 5872 1
+7239 6000 1
+7239 6243 1
+7239 6907 1
+7239 7054 1
+7239 7116 1
+7239 7131 1
+7239 7237 1
+7239 7279 1
+7239 7478 1
+7239 7497 1
+7239 7553 1
+7239 7561 1
+7239 7587 1
+7239 7620 1
+7240 1403 1
+7241 938 1
+7241 1403 1
+7241 3346 1
+7241 4432 1
+7241 5028 1
+7241 5800 1
+7241 5806 1
+7241 5872 1
+7241 6032 1
+7241 6123 1
+7241 6784 1
+7241 6832 1
+7241 6875 1
+7241 6913 1
+7241 6914 1
+7241 6976 1
+7241 7238 1
+7241 7279 1
+7241 7373 1
+7241 7561 1
+7241 7791 1
+7243 7763 1
+7245 6736 1
+7251 2851 1
+7252 2851 1
+7253 2851 1
+7253 4037 1
+7253 7871 1
+7253 7912 1
+7255 5801 1
+7262 155 1
+7262 3381 1
+7262 3969 1
+7262 5500 1
+7262 5529 1
+7262 5835 1
+7262 7054 1
+7262 7400 1
+7262 7557 1
+7262 7757 1
+7262 7763 1
+7260 7262 1
+7260 7301 1
+7260 7478 1
+7265 6784 1
+7266 1982 1
+7266 5432 1
+7266 6555 1
+7266 6634 1
+7266 6714 1
+7266 6784 1
+7267 6784 1
+7268 6784 1
+7269 6784 1
+7270 5210 1
+7270 5897 1
+7270 6442 1
+7270 6784 1
+7270 7763 1
+7271 4037 1
+7271 6714 1
+7271 6784 1
+7276 6913 1
+7276 7021 1
+7276 7052 1
+7276 7740 1
+7276 7763 1
+7277 3334 1
+7277 6913 1
+7277 7493 1
+7277 8121 1
+7278 6832 1
+7278 6913 1
+7278 6953 1
+7278 7414 1
+7279 2658 1
+7279 3000 1
+7279 5812 1
+7279 6555 1
+7279 6618 1
+7279 6913 1
+7279 7012 1
+7279 7054 1
+7279 7225 1
+7279 7237 1
+7279 7280 1
+7279 7443 1
+7279 7587 1
+7279 7588 1
+7279 7694 1
+7279 7726 1
+7279 7910 1
+7279 8163 1
+7279 8192 1
+7280 1026 1
+7280 2223 1
+7280 2658 1
+7280 3238 1
+7280 3293 1
+7280 3297 1
+7280 3310 1
+7280 3381 1
+7280 3752 1
+7280 3962 1
+7280 4071 1
+7280 4401 1
+7280 4432 1
+7280 4507 1
+7280 4981 1
+7280 4983 1
+7280 5079 1
+7280 5096 1
+7280 5179 1
+7280 5233 1
+7280 5466 1
+7280 5529 1
+7280 5605 1
+7280 5806 1
+7280 5812 1
+7280 5819 1
+7280 5839 1
+7280 6032 1
+7280 6043 1
+7280 6044 1
+7280 6151 1
+7280 6241 1
+7280 6299 1
+7280 6422 1
+7280 6555 1
+7280 6560 1
+7280 6618 1
+7280 6737 1
+7280 6780 1
+7280 6875 1
+7280 6913 1
+7280 6918 1
+7280 6924 1
+7280 6946 1
+7280 7005 1
+7280 7021 1
+7280 7063 1
+7280 7092 1
+7280 7225 1
+7280 7233 1
+7280 7277 1
+7280 7386 1
+7280 7393 1
+7280 7440 1
+7280 7443 1
+7280 7588 1
+7280 7590 1
+7280 7620 1
+7280 7649 1
+7280 7652 1
+7280 7662 1
+7280 7666 1
+7280 7668 1
+7280 7669 1
+7280 7683 1
+7280 7691 1
+7280 7699 1
+7280 7740 1
+7280 7757 1
+7280 7763 1
+7280 7778 1
+7280 7788 1
+7280 7795 1
+7280 7809 1
+7280 7813 1
+7280 7833 1
+7280 7908 1
+7280 7910 1
+7280 7961 1
+7280 7965 1
+7280 7994 1
+7280 7996 1
+7280 8002 1
+7280 8042 1
+7280 8121 1
+7280 8124 1
+7280 8141 1
+7280 8174 1
+7280 8209 1
+7282 5378 1
+7282 5432 1
+7283 5432 1
+7284 5378 1
+7284 5432 1
+7285 5432 1
+7286 5432 1
+7287 5432 1
+7291 7292 1
+7293 6299 1
+7293 6714 1
+7293 6976 1
+7293 7301 1
+5949 5582 1
+5949 6976 1
+5949 7301 1
+7296 6976 1
+7295 4071 1
+7295 5179 1
+7295 5199 1
+7295 5887 1
+7295 6299 1
+7295 6914 1
+7295 6976 1
+7295 6980 1
+7295 7277 1
+7295 7301 1
+7295 7386 1
+7295 7924 1
+7295 8249 1
+7301 2223 1
+7301 2658 1
+7301 4071 1
+7301 4983 1
+7301 5819 1
+7301 6044 1
+7301 6320 1
+7301 6523 1
+7301 6634 1
+7301 6759 1
+7301 6832 1
+7301 6914 1
+7301 6918 1
+7301 6946 1
+7301 7052 1
+7301 7092 1
+7301 7694 1
+7301 7707 1
+7301 7757 1
+7301 7833 1
+7301 7871 1
+7301 7890 1
+7301 7908 1
+7301 7979 1
+7301 7992 1
+7301 8044 1
+7301 8079 1
+7298 5079 1
+7298 7301 1
+7299 7301 1
+7300 7301 1
+7302 7092 1
+7302 7301 1
+7305 6714 1
+7171 4632 1
+7171 5079 1
+7171 6714 1
+7171 7092 1
+7171 7553 1
+7171 7632 1
+7171 7662 1
+7171 7809 1
+7171 8043 1
+7309 5969 1
+7310 5969 1
+7317 5199 1
+7317 5760 1
+7317 5897 1
+7317 6198 1
+7317 6424 1
+7317 6503 1
+7317 6596 1
+7317 6832 1
+7317 7146 1
+7317 7295 1
+7317 7318 1
+7317 7323 1
+7317 7341 1
+7317 7351 1
+7317 7387 1
+7320 7319 1
+7294 155 1
+7294 1026 1
+7294 1982 1
+7294 3084 1
+7294 3334 1
+7294 3459 1
+7294 3962 1
+7294 4940 1
+7294 4983 1
+7294 5002 1
+7294 5079 1
+7294 5148 1
+7294 5179 1
+7294 5199 1
+7294 5246 1
+7294 5605 1
+7294 5655 1
+7294 5800 1
+7294 5806 1
+7294 5811 1
+7294 5839 1
+7294 6032 1
+7294 6243 1
+7294 6414 1
+7294 6523 1
+7294 6555 1
+7294 6618 1
+7294 6832 1
+7294 6979 1
+7294 6993 1
+7294 7225 1
+7294 7393 1
+7294 7400 1
+7294 7414 1
+7294 7510 1
+7294 7620 1
+7294 7632 1
+7294 7651 1
+7294 8121 1
+7326 5199 1
+7327 4361 1
+7327 5199 1
+7327 6299 1
+7327 6503 1
+7327 6832 1
+7327 7295 1
+7281 5671 1
+7281 5760 1
+7281 5902 1
+7281 6299 1
+7281 6503 1
+7281 7277 1
+7281 7295 1
+7281 7510 1
+7281 7529 1
+7281 7632 1
+7281 7795 1
+7281 7809 1
+7329 6832 1
+7329 7295 1
+7333 7295 1
+7330 5872 1
+7330 7295 1
+7332 6299 1
+7335 3962 1
+7335 5002 1
+7335 5210 1
+7335 5760 1
+7335 6299 1
+7335 6424 1
+7335 6503 1
+7335 6555 1
+7335 6789 1
+7335 6832 1
+7335 7381 1
+7335 7414 1
+7335 7791 1
+7335 7833 1
+7335 8276 1
+7336 6299 1
+7337 6299 1
+7341 5806 1
+7341 7414 1
+7342 4361 1
+7345 4361 1
+7343 3238 1
+7343 3334 1
+7343 4361 1
+7343 5233 1
+7343 5806 1
+7343 6832 1
+7343 6914 1
+7343 7414 1
+7343 7788 1
+7343 7809 1
+7343 7927 1
+7343 8134 1
+7344 155 1
+7344 967 1
+7344 4361 1
+7347 6832 1
+7348 6832 1
+7348 7561 1
+7349 6832 1
+7350 155 1
+7350 2940 1
+7350 4940 1
+7350 4981 1
+7350 5800 1
+7350 5806 1
+7350 5872 1
+7350 6243 1
+7350 6320 1
+7350 6618 1
+7350 6832 1
+7350 7381 1
+7350 7414 1
+7350 7553 1
+7350 7561 1
+7350 7618 1
+7350 7624 1
+7350 7695 1
+7350 7726 1
+7350 7809 1
+7350 8224 1
+7351 5897 1
+7351 6832 1
+7352 3310 1
+7352 3334 1
+7352 3459 1
+7352 5079 1
+7352 5148 1
+7352 5835 1
+7352 6447 1
+7352 6832 1
+7352 6980 1
+7352 7092 1
+7352 7378 1
+7352 7386 1
+7352 7544 1
+7352 7740 1
+7352 7809 1
+7353 6832 1
+7354 5800 1
+7354 6832 1
+7354 7351 1
+7354 7478 1
+7355 6832 1
+7360 7351 1
+7362 2565 1
+7362 2940 1
+7362 4884 1
+7362 5233 1
+7362 7116 1
+7362 7381 1
+7362 7587 1
+7362 7618 1
+7363 6789 1
+7365 6596 1
+7371 7373 1
+7371 7567 1
+7374 5760 1
+7377 5760 1
+7379 1026 1
+7379 4632 1
+7379 5289 1
+7379 7088 1
+7379 7237 1
+7379 7381 1
+7379 7529 1
+7378 155 1
+7378 1982 1
+7378 2565 1
+7378 3084 1
+7378 3334 1
+7378 3962 1
+7378 4037 1
+7378 5022 1
+7378 5079 1
+7378 5465 1
+7378 5605 1
+7378 5800 1
+7378 5806 1
+7378 5872 1
+7378 6044 1
+7378 6417 1
+7378 6422 1
+7378 6523 1
+7378 6918 1
+7378 6946 1
+7378 6980 1
+7378 7050 1
+7378 7225 1
+7378 7277 1
+7378 7381 1
+7378 7386 1
+7378 7553 1
+7378 7587 1
+7378 7620 1
+7378 7632 1
+7378 7757 1
+7378 7795 1
+7378 7803 1
+7378 7813 1
+7378 7908 1
+7378 8051 1
+7378 8124 1
+7378 8198 1
+7380 6123 1
+7380 7279 1
+7380 7381 1
+7357 1982 1
+7357 5233 1
+7357 7233 1
+7357 7391 1
+7357 7553 1
+7357 7924 1
+7357 8174 1
+7357 8204 1
+7357 8219 1
+7199 5233 1
+7199 7632 1
+7382 5233 1
+7383 2940 1
+7383 5233 1
+7387 3962 1
+7387 7553 1
+7387 7809 1
+7387 7921 1
+7386 4401 1
+7386 4940 1
+7386 5022 1
+7386 5378 1
+7386 5421 1
+7386 6422 1
+7386 6618 1
+7386 7021 1
+7386 7280 1
+7386 7387 1
+7386 7434 1
+7386 7553 1
+7386 7567 1
+7386 7620 1
+7386 7649 1
+7386 7791 1
+7386 7803 1
+7386 7809 1
+7386 7813 1
+7386 7833 1
+7386 7857 1
+7386 7882 1
+7386 8249 1
+7386 8275 1
+7386 8277 1
+7389 2940 1
+7389 7450 1
+7390 1865 1
+7390 2658 1
+7390 2940 1
+7390 3238 1
+7390 3962 1
+7390 5179 1
+7390 5671 1
+7390 5872 1
+7390 6424 1
+7390 6555 1
+7390 7047 1
+7390 7063 1
+7390 7225 1
+7390 7280 1
+7390 7423 1
+7390 7442 1
+7390 7443 1
+7390 7620 1
+7390 7632 1
+7390 7646 1
+7390 7647 1
+7390 7651 1
+7390 7809 1
+7390 7961 1
+7391 1982 1
+7391 2223 1
+7391 2658 1
+7391 2940 1
+7391 4401 1
+7391 4940 1
+7391 4983 1
+7391 5022 1
+7391 5179 1
+7391 5210 1
+7391 5246 1
+7391 5393 1
+7391 5466 1
+7391 6032 1
+7391 6422 1
+7391 6523 1
+7391 6634 1
+7391 6737 1
+7391 6993 1
+7391 7047 1
+7391 7050 1
+7391 7052 1
+7391 7120 1
+7391 7233 1
+7391 7237 1
+7391 7341 1
+7391 7443 1
+7391 7529 1
+7391 7544 1
+7391 7553 1
+7391 7604 1
+7391 7620 1
+7391 7649 1
+7391 7683 1
+7391 7726 1
+7391 7809 1
+7391 7835 1
+7391 7862 1
+7391 7921 1
+7391 7924 1
+7391 7965 1
+7391 7992 1
+7391 8019 1
+7391 8051 1
+7391 8122 1
+7391 8174 1
+7391 8192 1
+7391 8198 1
+7391 8209 1
+7391 8212 1
+7391 8224 1
+7391 8249 1
+7392 2940 1
+7321 2940 1
+7321 3293 1
+7321 7389 1
+7394 3293 1
+7394 5643 1
+7394 6424 1
+7394 7063 1
+7394 7620 1
+7400 3885 1
+7400 4940 1
+7400 5022 1
+7400 5079 1
+7400 5806 1
+7400 5839 1
+7400 6032 1
+7400 6123 1
+7400 6417 1
+7400 7225 1
+7400 7414 1
+7400 7450 1
+7400 7553 1
+7400 7632 1
+7400 7662 1
+7170 6123 1
+7401 5872 1
+7401 6123 1
+7401 7510 1
+7402 3334 1
+7402 6123 1
+7402 6241 1
+7402 6712 1
+7402 7632 1
+7403 6123 1
+7404 6123 1
+7405 3962 1
+7405 4037 1
+7405 5028 1
+7405 5096 1
+7405 5605 1
+7405 6123 1
+7405 6875 1
+7405 6946 1
+7405 6980 1
+7405 7050 1
+7405 7063 1
+7405 7443 1
+7405 7618 1
+7405 7624 1
+7405 7763 1
+7405 7835 1
+7405 7927 1
+7405 8163 1
+7407 6946 1
+7409 1982 1
+7409 3334 1
+7409 5002 1
+7409 5811 1
+7409 5839 1
+7409 7052 1
+7409 7553 1
+7409 7632 1
+7409 7646 1
+7409 7839 1
+7393 5002 1
+7393 5378 1
+7393 5839 1
+7393 7092 1
+7393 7225 1
+7393 7414 1
+7393 7553 1
+7393 7651 1
+7393 7662 1
+7393 7695 1
+7393 7840 1
+7393 8237 1
+7413 7279 1
+7413 7414 1
+7416 6417 1
+7417 5902 1
+7417 6442 1
+7418 4981 1
+7418 6442 1
+7419 6442 1
+7420 6442 1
+7421 1982 1
+7421 4037 1
+7421 4940 1
+7421 7238 1
+7421 7279 1
+7421 7422 1
+7421 7979 1
+7421 8163 1
+7421 8192 1
+7424 3334 1
+7424 4037 1
+7424 5605 1
+7424 7908 1
+7425 3334 1
+7425 4037 1
+7425 4940 1
+7425 6780 1
+7425 6946 1
+7425 7553 1
+7425 7649 1
+7426 3000 1
+7426 3334 1
+7427 3334 1
+7428 3334 1
+7428 3459 1
+7429 3334 1
+7430 3334 1
+7431 3334 1
+7441 4341 1
+7441 7442 1
+7441 8168 1
+7443 2658 1
+7443 3962 1
+7443 5800 1
+7443 6043 1
+7443 6414 1
+7443 7092 1
+7443 7280 1
+7443 7809 1
+7443 7882 1
+7443 8192 1
+7444 7450 1
+7444 7620 1
+7444 7632 1
+6139 7450 1
+7448 7450 1
+7445 7450 1
+7446 7450 1
+7447 7450 1
+7449 1982 1
+7449 3297 1
+7449 3752 1
+7449 3962 1
+7449 4507 1
+7449 4940 1
+7449 5079 1
+7449 5378 1
+7449 5614 1
+7449 5643 1
+7449 5812 1
+7449 5872 1
+7449 5887 1
+7449 5902 1
+7449 6422 1
+7449 6759 1
+7449 7021 1
+7449 7277 1
+7449 7279 1
+7449 7341 1
+7449 7393 1
+7449 7450 1
+7449 7508 1
+7449 7553 1
+7449 7574 1
+7449 7642 1
+7449 7649 1
+7449 7740 1
+7449 7839 1
+7449 7921 1
+7449 7979 1
+7449 8042 1
+7449 8073 1
+7449 8090 1
+7449 8134 1
+7449 8174 1
+7449 8186 1
+7449 8219 1
+7449 8224 1
+7451 7131 1
+7452 4037 1
+7452 6914 1
+7452 7131 1
+7453 7131 1
+7181 4037 1
+7181 7131 1
+7180 4037 1
+7180 6914 1
+7180 7131 1
+7180 7803 1
+7454 7131 1
+7455 7131 1
+7455 7237 1
+7455 7510 1
+7455 7529 1
+7456 7131 1
+7457 7131 1
+7458 7131 1
+7459 7131 1
+7461 7131 1
+7462 7131 1
+7465 7467 1
+7466 7467 1
+7473 7478 1
+7474 7478 1
+7468 7478 1
+7469 7478 1
+7476 7478 1
+7476 7512 1
+7477 7478 1
+7470 7478 1
+4532 5096 1
+4532 5179 1
+4532 6979 1
+4532 7478 1
+4532 7862 1
+4532 7921 1
+4532 7961 1
+4532 8174 1
+7480 7279 1
+7481 7279 1
+7482 6243 1
+7483 6243 1
+7484 5806 1
+7484 5872 1
+7484 5902 1
+7485 6000 1
+7486 6000 1
+7487 6000 1
+7490 2223 1
+7490 3238 1
+7490 3310 1
+7490 3381 1
+7490 4507 1
+7490 5002 1
+7490 5028 1
+7490 5421 1
+7490 5605 1
+7490 5969 1
+7490 6424 1
+7490 6560 1
+7490 6712 1
+7490 6780 1
+7490 6934 1
+7490 6993 1
+7490 7280 1
+7490 7618 1
+7490 7647 1
+7490 7662 1
+7490 7695 1
+7490 7699 1
+7490 7992 1
+7490 8007 1
+7490 8025 1
+7490 8083 1
+7490 8128 1
+7492 4875 1
+7492 7378 1
+7492 7624 1
+7493 4875 1
+7493 5421 1
+7493 7225 1
+7493 7646 1
+7494 7495 1
+7501 5289 1
+7502 5289 1
+7502 7544 1
+7502 7553 1
+7503 5289 1
+7505 5902 1
+7509 7510 1
+7471 2658 1
+7471 3084 1
+7471 6914 1
+7471 7237 1
+7471 7512 1
+7471 7632 1
+7471 7649 1
+7471 7946 1
+7471 7965 1
+7511 3752 1
+7511 4037 1
+7511 4981 1
+7511 4983 1
+7511 5614 1
+7511 6043 1
+7511 6780 1
+7511 6946 1
+7511 7021 1
+7511 7512 1
+7511 7620 1
+7511 7707 1
+7511 7810 1
+7511 7813 1
+7511 7890 1
+7511 8044 1
+7514 155 1
+7514 4879 1
+7514 7088 1
+7515 7088 1
+7513 7088 1
+7517 3293 1
+7517 7493 1
+7518 4037 1
+7518 4632 1
+7518 7620 1
+7520 6174 1
+7520 7624 1
+7520 7649 1
+7376 3459 1
+7376 4435 1
+7376 7063 1
+7376 7237 1
+7522 737 1
+7523 737 1
+7524 737 1
+7525 737 1
+7527 7529 1
+7528 7529 1
+7531 7054 1
+7538 7378 1
+7540 7378 1
+7535 7378 1
+7536 7378 1
+7537 7378 1
+7544 1982 1
+7544 5671 1
+7544 6032 1
+7544 6555 1
+7544 7005 1
+7544 7092 1
+7544 7553 1
+7544 7788 1
+7544 7813 1
+7544 7924 1
+7544 8226 1
+7549 3459 1
+7549 7553 1
+7545 7553 1
+7546 5028 1
+7546 5421 1
+7546 7553 1
+7550 7553 1
+7554 3459 1
+7554 5835 1
+7554 7624 1
+7563 4341 1
+7564 2565 1
+7564 2658 1
+7564 3238 1
+7564 3293 1
+7564 4037 1
+7564 4341 1
+7564 5002 1
+7564 5028 1
+7564 5465 1
+7564 5605 1
+7564 5614 1
+7564 6044 1
+7564 6712 1
+7564 6934 1
+7564 6946 1
+7564 7587 1
+7564 7618 1
+7564 7624 1
+7564 7646 1
+7564 7662 1
+7564 7860 1
+7564 7908 1
+7564 8042 1
+7564 8044 1
+7564 8051 1
+7564 8073 1
+7564 8121 1
+7564 8124 1
+7564 8128 1
+7564 8168 1
+7564 8219 1
+7415 1026 1
+7415 5079 1
+7415 6914 1
+7415 7225 1
+7415 7400 1
+7415 7632 1
+7150 5839 1
+7150 6555 1
+7150 6914 1
+7150 7005 1
+7150 7021 1
+7150 7052 1
+7150 7280 1
+7150 7400 1
+7150 7649 1
+7150 7683 1
+7565 1026 1
+7565 7400 1
+7565 7587 1
+7569 155 1
+7569 2565 1
+7569 7618 1
+7569 7624 1
+7570 155 1
+7570 5096 1
+7570 7778 1
+7571 155 1
+7572 155 1
+7576 1026 1
+7577 1026 1
+7578 967 1
+7578 1026 1
+7578 1498 1
+7578 3962 1
+7578 4037 1
+7578 4071 1
+7578 4435 1
+7578 4981 1
+7578 5020 1
+7578 5022 1
+7578 5079 1
+7578 5096 1
+7578 5378 1
+7578 5605 1
+7578 5812 1
+7578 6618 1
+7578 6918 1
+7578 6946 1
+7578 6979 1
+7578 7005 1
+7578 7092 1
+7578 7833 1
+7578 7855 1
+7578 7908 1
+7578 8122 1
+7578 8163 1
+7578 8165 1
+7578 8174 1
+7579 1026 1
+7579 3310 1
+7579 5210 1
+7579 5529 1
+7579 6914 1
+7579 7050 1
+7579 7620 1
+7579 7788 1
+7579 7795 1
+7580 1026 1
+7580 2565 1
+7580 4884 1
+7580 5002 1
+7580 5421 1
+7580 5500 1
+7580 6424 1
+7580 6712 1
+7580 6934 1
+7580 7116 1
+7580 7225 1
+7580 7587 1
+7580 7620 1
+7580 7647 1
+7580 7651 1
+7580 7658 1
+7580 7662 1
+7580 7666 1
+7580 7673 1
+7581 1026 1
+7585 7587 1
+7586 3084 1
+7586 3238 1
+7586 7587 1
+7586 7683 1
+7586 7757 1
+7586 7763 1
+7586 7809 1
+7588 5079 1
+7588 6174 1
+7588 7116 1
+7588 7391 1
+7588 7604 1
+7588 7618 1
+7588 7624 1
+7588 8141 1
+7593 7225 1
+7593 7618 1
+7593 7624 1
+7594 3293 1
+7594 5819 1
+7594 7225 1
+7594 8083 1
+7595 7225 1
+7597 4037 1
+7597 4884 1
+7597 7225 1
+7597 7620 1
+7598 3238 1
+7598 3752 1
+7598 3962 1
+7598 4884 1
+7598 4981 1
+7598 5028 1
+7598 5421 1
+7598 5466 1
+7598 5529 1
+7598 5839 1
+7598 6043 1
+7598 6151 1
+7598 6241 1
+7598 6555 1
+7598 6712 1
+7598 6914 1
+7598 6934 1
+7598 7047 1
+7598 7116 1
+7598 7225 1
+7598 7386 1
+7598 7588 1
+7598 7632 1
+7598 7649 1
+7598 7683 1
+7598 7694 1
+7598 7695 1
+7598 7699 1
+7598 7809 1
+7598 7862 1
+7598 7890 1
+7598 7913 1
+7598 7924 1
+7599 7225 1
+7600 7225 1
+7602 5500 1
+7605 2565 1
+7605 3752 1
+7605 7924 1
+5910 2565 1
+7608 4884 1
+7608 5210 1
+7610 4884 1
+7611 4884 1
+7613 4884 1
+7609 7620 1
+7609 7839 1
+7614 1191 1
+7614 3084 1
+7614 3238 1
+7614 3310 1
+7614 3752 1
+7614 3962 1
+7614 5002 1
+7614 5028 1
+7614 5079 1
+7614 5179 1
+7614 5466 1
+7614 5529 1
+7614 5839 1
+7614 6032 1
+7614 6151 1
+7614 6174 1
+7614 6241 1
+7614 6320 1
+7614 6422 1
+7614 6523 1
+7614 6555 1
+7614 6560 1
+7614 6914 1
+7614 7047 1
+7614 7092 1
+7614 7386 1
+7614 7544 1
+7614 7620 1
+7614 7624 1
+7614 7632 1
+7614 7658 1
+7614 7707 1
+7614 7726 1
+7614 7795 1
+7614 7809 1
+7614 7819 1
+7614 7874 1
+7614 7879 1
+7614 7952 1
+7615 7620 1
+7616 7620 1
+7617 7620 1
+7618 6523 1
+7618 7092 1
+7618 7620 1
+7619 7620 1
+7623 5028 1
+7623 5465 1
+7623 7647 1
+7625 5028 1
+7625 6634 1
+7625 7050 1
+7625 7632 1
+7625 7803 1
+7625 7924 1
+7626 5028 1
+7050 5839 1
+7050 6634 1
+7050 7120 1
+7050 7632 1
+7050 7839 1
+7630 7632 1
+7629 7632 1
+7634 7021 1
+7639 6280 1
+7638 6280 1
+7601 5002 1
+7601 7646 1
+7601 7653 1
+7642 5179 1
+7644 7646 1
+7645 7646 1
+7648 7391 1
+7647 6934 1
+7647 7662 1
+7647 7666 1
+7647 7668 1
+7649 3238 1
+7649 5210 1
+7649 5529 1
+7649 5839 1
+7649 6044 1
+7649 6979 1
+7649 7052 1
+7649 7443 1
+7649 7651 1
+7649 7965 1
+7653 7986 1
+7659 967 1
+7659 3962 1
+7659 6712 1
+7659 6934 1
+7659 7662 1
+7659 7855 1
+7660 7662 1
+7650 1498 1
+7650 7662 1
+7661 3381 1
+7661 7280 1
+7661 7662 1
+7661 7757 1
+7663 3238 1
+7664 3238 1
+7665 3238 1
+7665 4432 1
+7665 7047 1
+7665 7683 1
+7665 7695 1
+7665 7810 1
+7666 6320 1
+7666 6555 1
+7666 6759 1
+7666 6924 1
+7666 6946 1
+7666 6980 1
+7666 7012 1
+7666 7277 1
+7666 7397 1
+7666 7669 1
+7666 7691 1
+7666 7699 1
+7666 7701 1
+7666 8121 1
+7670 6712 1
+7675 1498 1
+7675 1982 1
+7675 2223 1
+7675 2658 1
+7675 3770 1
+7675 4983 1
+7675 5020 1
+7675 5096 1
+7675 5179 1
+7675 5378 1
+7675 6422 1
+7675 6618 1
+7675 6759 1
+7675 6946 1
+7675 7021 1
+7675 7386 1
+7675 7397 1
+7675 7666 1
+7675 7778 1
+7675 7979 1
+7675 7994 1
+7675 7996 1
+7675 8002 1
+7675 8192 1
+7675 8212 1
+7676 4940 1
+7676 6737 1
+7676 7047 1
+7676 7238 1
+7676 8178 1
+7677 4037 1
+7677 4940 1
+7677 5022 1
+7677 6875 1
+7677 7047 1
+7677 7238 1
+7677 7517 1
+7677 7924 1
+7677 7928 1
+7677 7992 1
+7677 8038 1
+7677 8224 1
+7678 4940 1
+7678 7047 1
+7679 3084 1
+7679 5022 1
+7679 5079 1
+7679 5148 1
+7679 5529 1
+7679 5605 1
+7679 5643 1
+7679 6151 1
+7679 6241 1
+7679 6555 1
+7679 6634 1
+7679 6875 1
+7679 7021 1
+7679 7238 1
+7679 7277 1
+7679 7280 1
+7679 7391 1
+7679 7443 1
+7679 7694 1
+7679 7695 1
+7679 7699 1
+7679 7809 1
+7679 7813 1
+7679 7855 1
+7679 8219 1
+7679 8235 1
+7682 1191 1
+7682 3297 1
+7682 4037 1
+7682 4507 1
+7682 5020 1
+7682 5148 1
+7682 5210 1
+7682 5529 1
+7682 5643 1
+7682 6422 1
+7682 6560 1
+7682 6759 1
+7682 6875 1
+7682 6914 1
+7682 6946 1
+7682 6979 1
+7682 7092 1
+7682 7386 1
+7682 7574 1
+7682 7620 1
+7682 7683 1
+7682 7839 1
+7682 7862 1
+7682 7874 1
+7682 7881 1
+7682 7910 1
+7682 7927 1
+7682 7928 1
+7682 7952 1
+7682 7961 1
+7682 8038 1
+7682 8128 1
+7682 8132 1
+7682 8148 1
+7682 8169 1
+7682 8209 1
+7684 7120 1
+7684 7683 1
+7685 4401 1
+7685 5179 1
+7685 6618 1
+7685 6634 1
+7685 7391 1
+7685 7683 1
+7685 7757 1
+7685 7908 1
+7685 8037 1
+7685 8124 1
+7685 8174 1
+7685 8198 1
+7685 8219 1
+7687 6560 1
+7687 7120 1
+7687 7683 1
+7686 7120 1
+7686 7683 1
+7691 3752 1
+7691 3962 1
+7691 4071 1
+7691 4983 1
+7691 5179 1
+7691 5933 1
+7691 6032 1
+7691 6946 1
+7691 7063 1
+7691 7092 1
+7691 7694 1
+7691 7778 1
+7691 7835 1
+7691 7855 1
+7691 7862 1
+7691 7871 1
+7691 7946 1
+7691 7961 1
+7691 7979 1
+7695 3381 1
+7695 6151 1
+7695 8224 1
+7696 7695 1
+7696 7707 1
+7696 7810 1
+7696 8019 1
+7697 3962 1
+7697 5179 1
+7697 6634 1
+7697 6980 1
+7697 7120 1
+7697 7277 1
+7697 7443 1
+7697 7588 1
+7697 7649 1
+7697 7695 1
+7697 7734 1
+7697 7740 1
+7697 7763 1
+7697 7803 1
+7697 7809 1
+7697 7908 1
+7697 8079 1
+7697 8132 1
+7697 8168 1
+7698 7699 1
+7701 6320 1
+7701 6980 1
+7701 7588 1
+7703 5179 1
+7703 7707 1
+7704 7707 1
+7705 7707 1
+7706 5671 1
+7706 7707 1
+7715 6523 1
+7716 5839 1
+7716 6523 1
+7719 4071 1
+7719 6523 1
+7719 6914 1
+7719 7763 1
+6367 6523 1
+6367 8141 1
+7717 5839 1
+7717 6523 1
+7720 6924 1
+7721 1865 1
+7724 1865 1
+7724 7544 1
+7726 3310 1
+7726 7809 1
+7726 7961 1
+7728 7726 1
+7728 7763 1
+7727 1982 1
+7727 3962 1
+7727 4037 1
+7727 4071 1
+7727 4981 1
+7727 4983 1
+7727 5022 1
+7727 5246 1
+7727 5839 1
+7727 6032 1
+7727 6634 1
+7727 6946 1
+7727 6979 1
+7727 7233 1
+7727 7238 1
+7727 7341 1
+7727 7391 1
+7727 7553 1
+7727 7620 1
+7727 7726 1
+7727 7835 1
+7727 7871 1
+7727 7910 1
+7727 7921 1
+7727 7965 1
+7727 7992 1
+7727 8002 1
+7727 8024 1
+7727 8122 1
+7727 8174 1
+7729 7730 1
+7732 7734 1
+7733 1982 1
+7733 2658 1
+7733 3962 1
+7733 4037 1
+7733 4401 1
+7733 4432 1
+7733 4940 1
+7733 4981 1
+7733 5022 1
+7733 5064 1
+7733 5079 1
+7733 5246 1
+7733 5605 1
+7733 5812 1
+7733 6032 1
+7733 6414 1
+7733 6422 1
+7733 6555 1
+7733 6618 1
+7733 6634 1
+7733 6914 1
+7733 6946 1
+7733 6979 1
+7733 7005 1
+7733 7021 1
+7733 7050 1
+7733 7063 1
+7733 7092 1
+7733 7120 1
+7733 7389 1
+7733 7553 1
+7733 7620 1
+7733 7666 1
+7733 7734 1
+7733 7791 1
+7733 7809 1
+7733 7810 1
+7733 7833 1
+7733 7839 1
+7733 7862 1
+7733 7910 1
+7733 8051 1
+7733 8121 1
+7733 8174 1
+7733 8198 1
+7736 7120 1
+7736 7757 1
+7737 5671 1
+7738 3084 1
+7738 5148 1
+7738 5671 1
+7738 7277 1
+7738 7795 1
+7738 7839 1
+7740 6980 1
+7741 5148 1
+7741 6980 1
+7741 7757 1
+7741 7763 1
+7742 6980 1
+7743 2223 1
+7743 4037 1
+7743 4507 1
+7743 4940 1
+7743 5179 1
+7743 6422 1
+7743 6914 1
+7743 6980 1
+7743 7005 1
+7743 7757 1
+7743 7992 1
+7743 8168 1
+7743 8169 1
+7744 967 1
+7744 1982 1
+7744 3310 1
+7744 3381 1
+7744 3770 1
+7744 3962 1
+7744 4037 1
+7744 4401 1
+7744 4432 1
+7744 4940 1
+7744 4983 1
+7744 5022 1
+7744 5079 1
+7744 5179 1
+7744 5738 1
+7744 5812 1
+7744 5819 1
+7744 5839 1
+7744 5933 1
+7744 6555 1
+7744 6618 1
+7744 6634 1
+7744 6914 1
+7744 6918 1
+7744 6979 1
+7744 7021 1
+7744 7092 1
+7744 7238 1
+7744 7449 1
+7744 7544 1
+7744 7553 1
+7744 7620 1
+7744 7740 1
+7744 7803 1
+7744 7809 1
+7744 7810 1
+7744 7890 1
+7744 7910 1
+7744 7924 1
+7744 7961 1
+7744 7979 1
+7744 8051 1
+7744 8121 1
+7744 8174 1
+7744 8178 1
+7744 8209 1
+7744 8219 1
+7744 8225 1
+7744 8249 1
+7744 8263 1
+7745 5148 1
+7747 4981 1
+7747 5148 1
+7747 5179 1
+7747 5839 1
+7747 6993 1
+7747 7277 1
+7747 7795 1
+7747 7809 1
+7750 4940 1
+7750 7757 1
+7751 7757 1
+7752 7005 1
+7752 7757 1
+7753 7005 1
+7753 7757 1
+7755 1982 1
+7755 5064 1
+7755 5079 1
+7755 5529 1
+7755 6043 1
+7755 6044 1
+7755 6560 1
+7755 6634 1
+7755 7277 1
+7755 7386 1
+7755 7620 1
+7755 7757 1
+7755 7803 1
+7756 7005 1
+7756 7757 1
+7758 7763 1
+7759 4981 1
+7759 4983 1
+7759 7763 1
+7759 7961 1
+7760 7763 1
+7761 7763 1
+7762 7763 1
+7766 1191 1
+7766 3310 1
+7766 4435 1
+7766 5529 1
+7766 6151 1
+7766 6555 1
+7766 7005 1
+7766 7788 1
+7766 7803 1
+7766 7809 1
+7766 7855 1
+7766 7862 1
+7766 7871 1
+7767 7277 1
+7767 7280 1
+7768 1498 1
+7768 3752 1
+7768 3962 1
+7768 6174 1
+7768 6414 1
+7768 7021 1
+7768 7393 1
+7768 7879 1
+7768 7882 1
+7768 7890 1
+7768 7927 1
+7769 967 1
+7769 3752 1
+7769 3962 1
+7769 4071 1
+7769 5933 1
+7769 6032 1
+7769 6174 1
+7769 6414 1
+7769 7012 1
+7769 7021 1
+7769 7871 1
+7769 7879 1
+7769 7882 1
+7769 7890 1
+7769 7908 1
+7769 7910 1
+7769 7912 1
+7769 7927 1
+7769 7946 1
+7770 5933 1
+7770 6174 1
+7771 5079 1
+7771 7778 1
+7771 7928 1
+7772 1982 1
+7772 4432 1
+7772 5064 1
+7772 5179 1
+7772 5378 1
+7772 7233 1
+7772 7389 1
+7772 7778 1
+7772 7791 1
+7772 7833 1
+7772 8073 1
+7772 8134 1
+7772 8174 1
+7772 8178 1
+7772 8192 1
+7772 8204 1
+7772 8212 1
+7772 8237 1
+7772 8249 1
+7772 8276 1
+7773 7778 1
+7774 1498 1
+7774 1982 1
+7774 3293 1
+7774 4037 1
+7774 5022 1
+7774 5210 1
+7774 5605 1
+7774 5738 1
+7774 5819 1
+7774 6044 1
+7774 6780 1
+7774 6875 1
+7774 6918 1
+7774 7233 1
+7774 7391 1
+7774 7574 1
+7774 7778 1
+7774 7860 1
+7774 7908 1
+7774 7965 1
+7774 7992 1
+7774 8037 1
+7774 8042 1
+7774 8051 1
+7774 8073 1
+7774 8121 1
+7774 8122 1
+7774 8128 1
+7774 8134 1
+7774 8168 1
+7774 8174 1
+7774 8178 1
+7774 8192 1
+7774 8209 1
+7774 8212 1
+7775 2658 1
+7775 5096 1
+7775 5179 1
+7775 5210 1
+7775 5819 1
+7775 5839 1
+7775 6422 1
+7775 7341 1
+7775 7553 1
+7775 7778 1
+7775 7965 1
+7777 7778 1
+7779 6560 1
+7779 7835 1
+7780 6560 1
+7780 7788 1
+7780 7803 1
+7781 6560 1
+7782 6560 1
+7783 6560 1
+7789 7277 1
+7790 5022 1
+7790 6634 1
+7790 7277 1
+7790 7803 1
+7791 5079 1
+7791 6414 1
+7791 7005 1
+7791 7277 1
+7792 6032 1
+7792 6555 1
+7792 7012 1
+7792 7021 1
+7792 7277 1
+7792 7835 1
+7792 7927 1
+7796 7795 1
+7800 7803 1
+7804 7803 1
+7801 7803 1
+7805 7803 1
+7802 7803 1
+7806 5529 1
+7806 5839 1
+7808 3084 1
+7808 3752 1
+7808 3770 1
+7808 3962 1
+7808 4037 1
+7808 5079 1
+7808 5096 1
+7808 6634 1
+7808 6914 1
+7808 7809 1
+7808 8124 1
+7808 8174 1
+7810 1982 1
+7810 2223 1
+7810 6737 1
+7810 6875 1
+7810 6993 1
+7810 7620 1
+7810 7979 1
+7810 8174 1
+7810 8224 1
+7812 6043 1
+7812 7092 1
+7812 7649 1
+7812 7839 1
+7812 7890 1
+7812 7899 1
+7814 7386 1
+7815 7386 1
+7815 7620 1
+7818 2223 1
+7818 3752 1
+7818 4071 1
+7818 5022 1
+7818 5079 1
+7818 5096 1
+7818 5210 1
+7818 5643 1
+7818 6946 1
+7818 6979 1
+7818 7819 1
+7818 7871 1
+7818 7874 1
+7818 7912 1
+7818 7946 1
+7818 7952 1
+7818 7961 1
+7818 8007 1
+7818 8024 1
+7818 8025 1
+7818 8042 1
+7818 8083 1
+7818 8134 1
+7821 7649 1
+7822 7649 1
+6709 5064 1
+6709 5210 1
+7826 6709 1
+7827 6709 1
+7828 6709 1
+7829 6044 1
+7829 6555 1
+7829 7092 1
+7829 7879 1
+7830 7092 1
+7831 7092 1
+7831 7393 1
+7832 7092 1
+7833 6914 1
+7833 7092 1
+7833 7238 1
+7833 7890 1
+7834 7092 1
+7836 7092 1
+7835 4435 1
+7835 5179 1
+7835 7092 1
+7837 5079 1
+7837 7839 1
+7841 5839 1
+7842 4981 1
+7842 5079 1
+7843 4983 1
+7843 5079 1
+7844 5079 1
+7845 5079 1
+7845 8121 1
+7848 5079 1
+7849 6555 1
+7852 6555 1
+7850 6555 1
+7851 6555 1
+6638 6555 1
+7853 7855 1
+7853 8178 1
+7854 7855 1
+7856 4432 1
+7856 4435 1
+7856 5605 1
+7856 7835 1
+7856 8121 1
+7856 8168 1
+7856 8192 1
+7754 7005 1
+7862 1982 1
+7862 3293 1
+7862 4037 1
+7862 5210 1
+7862 5605 1
+7862 7860 1
+7862 8024 1
+7862 8042 1
+7862 8043 1
+7862 8174 1
+7862 8192 1
+7860 4983 1
+7860 7862 1
+7863 4981 1
+7864 4981 1
+7864 4983 1
+7865 2658 1
+7865 3293 1
+7865 4981 1
+7865 5022 1
+7865 5096 1
+7865 5179 1
+7865 5378 1
+7865 6044 1
+7865 6618 1
+7865 7021 1
+7865 7063 1
+7865 7233 1
+7865 7238 1
+7865 7517 1
+7865 7620 1
+7865 7835 1
+7865 7882 1
+7865 7908 1
+7865 7961 1
+7865 8042 1
+7865 8051 1
+7865 8163 1
+7865 8212 1
+7865 8275 1
+7866 967 1
+7867 7871 1
+7868 7871 1
+7870 7871 1
+7873 4071 1
+7873 5179 1
+7873 6914 1
+7873 7910 1
+7873 7927 1
+7873 7979 1
+7874 4071 1
+7874 6914 1
+7874 7890 1
+7874 7927 1
+7875 6447 1
+7875 7012 1
+7877 4037 1
+7877 4507 1
+7877 4940 1
+7877 7233 1
+7877 7879 1
+7877 7927 1
+7878 7879 1
+7882 1498 1
+7882 2658 1
+7882 3752 1
+7882 3962 1
+7882 4940 1
+7882 5096 1
+7882 6414 1
+7882 6618 1
+7882 7021 1
+7882 7910 1
+7882 8033 1
+7885 4037 1
+7885 5605 1
+7885 6875 1
+7885 7691 1
+7885 7882 1
+7885 7928 1
+7883 7882 1
+7884 1982 1
+7884 4401 1
+7884 7553 1
+7884 7620 1
+7884 7882 1
+7886 7890 1
+7887 7890 1
+7888 7890 1
+7889 7890 1
+7891 6914 1
+7892 6914 1
+7893 6914 1
+7893 8174 1
+7372 6914 1
+7894 6914 1
+7900 4037 1
+7900 4507 1
+7900 5064 1
+7900 5210 1
+7900 5246 1
+7900 5605 1
+7900 5819 1
+7900 6918 1
+7900 6946 1
+7900 7391 1
+7900 7517 1
+7900 7574 1
+7900 7620 1
+7900 7860 1
+7900 7908 1
+7900 8037 1
+7900 8042 1
+7900 8044 1
+7900 8083 1
+7900 8121 1
+7900 8122 1
+7900 8128 1
+7900 8134 1
+7900 8163 1
+7900 8168 1
+7900 8169 1
+7900 8192 1
+7901 1982 1
+7901 4037 1
+7901 4401 1
+7901 4432 1
+7901 5210 1
+7901 5378 1
+7901 5605 1
+7901 5812 1
+7901 6044 1
+7901 6618 1
+7901 6634 1
+7901 6737 1
+7901 6875 1
+7901 6918 1
+7901 6946 1
+7901 7233 1
+7901 7391 1
+7901 7553 1
+7901 7860 1
+7901 7908 1
+7901 7979 1
+7901 8037 1
+7901 8042 1
+7901 8051 1
+7901 8174 1
+7901 8192 1
+7901 8209 1
+7901 8212 1
+7901 8219 1
+7901 8224 1
+7902 1498 1
+7902 1982 1
+7902 2658 1
+7902 3293 1
+7902 4432 1
+7902 5605 1
+7902 6737 1
+7902 6875 1
+7902 6946 1
+7902 7233 1
+7902 7391 1
+7902 7908 1
+7902 8042 1
+7902 8051 1
+7902 8128 1
+7902 8132 1
+7902 8148 1
+7902 8163 1
+7902 8192 1
+7902 8209 1
+7902 8224 1
+7903 4037 1
+7903 5022 1
+7903 7908 1
+7903 8174 1
+7904 2658 1
+7904 6634 1
+7904 7391 1
+7904 7908 1
+7904 7912 1
+7904 7927 1
+7905 7908 1
+7906 1982 1
+7906 4037 1
+7906 4401 1
+7906 5887 1
+7906 7050 1
+7906 7553 1
+7906 7908 1
+7906 8212 1
+7906 8219 1
+7906 8224 1
+7907 4983 1
+7907 5022 1
+7907 5179 1
+7907 7620 1
+7907 7908 1
+7907 7979 1
+7907 7992 1
+7907 8002 1
+7907 8083 1
+7907 8163 1
+7907 8168 1
+7907 8178 1
+7910 3962 1
+7910 6044 1
+7910 7012 1
+7910 7912 1
+7911 7912 1
+7869 7912 1
+7914 5933 1
+7915 3962 1
+7916 3962 1
+7916 7012 1
+7919 4940 1
+7919 7012 1
+7919 7921 1
+7920 7921 1
+7922 7927 1
+7923 7927 1
+7924 6634 1
+7924 7927 1
+7925 7927 1
+7928 6634 1
+7928 7233 1
+7928 8178 1
+7930 5179 1
+7929 4037 1
+7929 5179 1
+7929 6044 1
+7929 6634 1
+7932 5179 1
+7932 8168 1
+7933 4037 1
+7933 5179 1
+7933 5210 1
+7933 6875 1
+7931 5179 1
+7931 6979 1
+7934 5179 1
+7935 5179 1
+7937 7021 1
+7938 6634 1
+7938 7021 1
+7939 7021 1
+7940 7021 1
+7941 7021 1
+7942 7021 1
+7944 7012 1
+7945 5022 1
+7945 5605 1
+7945 7620 1
+7945 7946 1
+7945 8192 1
+7948 5096 1
+7948 7910 1
+7949 7910 1
+7950 7910 1
+7953 5466 1
+7954 7835 1
+7955 7835 1
+7956 7835 1
+7959 7961 1
+7960 7961 1
+7964 2223 1
+7964 5020 1
+7964 5022 1
+7964 5096 1
+7964 5210 1
+7964 5819 1
+7964 6618 1
+7964 7620 1
+7964 7965 1
+7964 8024 1
+7964 8122 1
+7966 6422 1
+7968 6422 1
+7968 6634 1
+7968 7553 1
+7969 6422 1
+7969 7928 1
+7967 6422 1
+7967 7553 1
+7967 7810 1
+7967 8249 1
+7970 6422 1
+7972 7973 1
+7974 5096 1
+7975 5096 1
+7976 5096 1
+7978 7979 1
+7980 1498 1
+7980 2223 1
+7980 2658 1
+7980 3297 1
+7980 5022 1
+7980 5246 1
+7980 5887 1
+7980 6759 1
+7980 7860 1
+7980 7979 1
+7980 7992 1
+7980 8044 1
+7980 8068 1
+7980 8132 1
+7980 8134 1
+7981 7982 1
+7985 2658 1
+7993 4037 1
+7993 7992 1
+7995 7996 1
+7998 8002 1
+7999 8002 1
+8000 8002 1
+8001 8002 1
+8005 2223 1
+8005 4401 1
+8006 8007 1
+8009 6044 1
+8010 6044 1
+8010 8042 1
+8011 6044 1
+8012 4037 1
+8012 5210 1
+8012 6044 1
+8012 6946 1
+8012 7860 1
+8012 8042 1
+8012 8044 1
+8013 6044 1
+8014 8015 1
+8021 8051 1
+8020 8021 1
+8027 8028 1
+8035 6946 1
+8037 8246 1
+8036 4940 1
+8036 5605 1
+8036 5614 1
+8036 6780 1
+8036 6875 1
+8036 7233 1
+8036 7238 1
+8036 7391 1
+8036 7553 1
+8036 7810 1
+8036 7860 1
+8036 8037 1
+8036 8121 1
+8036 8124 1
+8036 8128 1
+8036 8163 1
+8036 8168 1
+8036 8174 1
+8036 8192 1
+8042 6634 1
+8040 8042 1
+8041 5605 1
+8041 7620 1
+8041 8042 1
+8045 5812 1
+8045 6307 1
+8045 6634 1
+8045 7389 1
+8045 8235 1
+8045 8246 1
+8045 8271 1
+8046 4401 1
+8046 4432 1
+8046 4940 1
+8046 5378 1
+8046 5812 1
+8046 6618 1
+8046 7389 1
+8046 7553 1
+8046 7791 1
+8046 7810 1
+8046 7924 1
+8046 8051 1
+8046 8212 1
+8046 8246 1
+8046 8249 1
+8046 8263 1
+8047 1982 1
+8047 4401 1
+8047 4432 1
+8047 4940 1
+8047 5378 1
+8047 5812 1
+8047 6618 1
+8047 6634 1
+8047 6737 1
+8047 7233 1
+8047 7238 1
+8047 7389 1
+8047 7810 1
+8047 7833 1
+8047 8051 1
+8047 8219 1
+8047 8224 1
+8047 8237 1
+8047 8249 1
+8047 8276 1
+8048 5378 1
+8048 5812 1
+8048 8235 1
+8049 5812 1
+8051 5378 1
+8051 5812 1
+8051 7553 1
+8051 7791 1
+8051 8219 1
+8051 8237 1
+8051 8246 1
+8051 8249 1
+8052 5812 1
+8053 4940 1
+8053 5022 1
+8053 5378 1
+8053 5614 1
+8053 5812 1
+8053 6780 1
+8053 7050 1
+8053 7391 1
+8053 7553 1
+8053 7791 1
+8053 7810 1
+8053 7924 1
+8053 8178 1
+8053 8209 1
+8053 8219 1
+8053 8224 1
+8053 8235 1
+8053 8237 1
+8053 8249 1
+8053 8263 1
+8054 5812 1
+8054 6634 1
+8055 7860 1
+8056 7860 1
+8057 7860 1
+8060 3293 1
+8060 6875 1
+8060 8121 1
+8060 8168 1
+8060 8192 1
+8061 3293 1
+8061 4037 1
+8061 4940 1
+8061 5022 1
+8061 7553 1
+8062 5210 1
+8063 5210 1
+8063 8121 1
+8063 8192 1
+8064 5210 1
+8065 5210 1
+8066 4037 1
+8066 5022 1
+8066 5210 1
+8069 5819 1
+8069 6780 1
+8069 7620 1
+8069 7924 1
+8070 5819 1
+8071 5819 1
+8072 5819 1
+8074 8076 1
+8075 8076 1
+8077 6918 1
+8077 8079 1
+8080 8083 1
+8081 8083 1
+8023 6780 1
+8084 6780 1
+8085 4401 1
+8085 4432 1
+8085 4940 1
+8085 5022 1
+8085 5614 1
+8085 6618 1
+8085 6634 1
+8085 6780 1
+8085 7050 1
+8085 7391 1
+8085 7553 1
+8085 7924 1
+8085 8163 1
+8085 8174 1
+8085 8192 1
+8085 8198 1
+8086 6780 1
+8087 6780 1
+8088 1982 1
+8088 8089 1
+8091 5022 1
+8092 4037 1
+8092 5022 1
+8092 8192 1
+8092 8198 1
+8092 8219 1
+8093 5022 1
+8094 5022 1
+8094 7928 1
+8094 8275 1
+8094 8276 1
+8095 5022 1
+8096 5022 1
+8098 4037 1
+8099 4037 1
+8100 4037 1
+8101 4037 1
+8102 4037 1
+8108 4037 1
+8103 4037 1
+8104 4037 1
+8105 4037 1
+8111 4037 1
+8111 7620 1
+8112 4037 1
+8112 8141 1
+8106 4037 1
+8107 4037 1
+8107 4432 1
+8107 4940 1
+8107 5378 1
+8107 6618 1
+8107 6634 1
+8107 7553 1
+8107 7791 1
+8107 7833 1
+8107 7924 1
+8107 8141 1
+8107 8192 1
+8107 8249 1
+8114 4037 1
+8115 4037 1
+8109 4037 1
+8110 4037 1
+8118 8121 1
+8119 8121 1
+8120 8121 1
+8126 4507 1
+8131 8132 1
+8131 8148 1
+8133 7517 1
+8134 7553 1
+8135 8134 1
+8138 8134 1
+8136 8134 1
+8097 7620 1
+8097 8134 1
+8137 8134 1
+8140 8141 1
+8142 8141 1
+8144 8141 1
+8145 7928 1
+8145 8141 1
+8146 5246 1
+8146 8148 1
+8147 8148 1
+8152 1982 1
+8152 4940 1
+8152 5605 1
+8152 6618 1
+8152 7233 1
+8152 7553 1
+8152 7620 1
+8152 7924 1
+8152 8209 1
+8152 8212 1
+8153 5605 1
+8155 7620 1
+8156 4940 1
+8156 6618 1
+8156 7620 1
+8156 7810 1
+8156 8192 1
+8158 7620 1
+8159 7620 1
+8157 6634 1
+8157 7620 1
+8161 8163 1
+8162 5064 1
+8162 5738 1
+8162 7391 1
+8162 8163 1
+8162 8168 1
+8162 8174 1
+8162 8178 1
+8162 8192 1
+8162 8198 1
+8166 6875 1
+8167 6875 1
+8170 8174 1
+8171 7233 1
+8171 8174 1
+8171 8192 1
+8172 8174 1
+8173 1982 1
+8173 5738 1
+8173 7233 1
+8173 7391 1
+8173 8174 1
+8173 8192 1
+8173 8198 1
+8177 8178 1
+7472 8178 1
+8179 8178 1
+8184 8178 1
+8180 8178 1
+8181 8178 1
+8182 8178 1
+8183 8178 1
+8187 7391 1
+8189 5064 1
+8189 5738 1
+8189 7553 1
+8189 8276 1
+7861 5738 1
+7861 7233 1
+8190 4940 1
+8190 7238 1
+8190 7924 1
+8190 8192 1
+8193 7553 1
+8193 8192 1
+8194 8192 1
+8195 8192 1
+8196 8198 1
+8197 8198 1
+8199 5064 1
+8202 7233 1
+8203 7233 1
+8206 7233 1
+8204 7233 1
+8204 8212 1
+8205 7233 1
+8211 4401 1
+8211 4432 1
+8211 6618 1
+8211 6737 1
+8211 7238 1
+8211 7389 1
+8211 7810 1
+8211 8051 1
+8211 8212 1
+8211 8237 1
+8211 8249 1
+8213 1982 1
+8215 8051 1
+8216 8051 1
+8221 8219 1
+8222 4401 1
+8222 6634 1
+8222 7553 1
+8222 7924 1
+8222 8224 1
+8222 8249 1
+8050 4432 1
+8050 4940 1
+8050 6618 1
+8050 6737 1
+8050 7238 1
+8050 7833 1
+8050 8246 1
+8050 8249 1
+8050 8263 1
+8227 4401 1
+8231 5378 1
+8232 5378 1
+8233 5378 1
+8236 8237 1
+8214 7553 1
+8238 7553 1
+8241 4432 1
+8241 4940 1
+8242 4432 1
+8243 4432 1
+8243 6307 1
+8243 6618 1
+8243 6634 1
+8243 6924 1
+8243 8263 1
+8244 7050 1
+8245 7050 1
+8248 8249 1
+8229 8249 1
+8251 6618 1
+8252 6634 1
+8253 6634 1
+8254 6634 1
+8255 6634 1
+8256 6634 1
+8260 6737 1
+8261 6737 1
+8262 7389 1
+8263 4940 1
+8263 7389 1
+8264 7238 1
+8265 7238 1
+8266 7238 1
+7637 7833 1
+8270 4940 1
+8270 7833 1
+8271 7833 1
+8272 4940 1
+8273 4940 1
+8150 8275 1
+8150 8276 1
+8274 8275 1
+0 0 0
diff --git a/examples/det.C b/examples/det.C
index afa2334..aa42961 100644
--- a/examples/det.C
+++ b/examples/det.C
@@ -27,13 +27,12 @@
\ingroup examples
*/
-//#include "linbox-config.h"
+#include <linbox/linbox-config.h>
#include <iostream>
-#include "linbox/field/modular.h"
-#include "linbox/blackbox/sparse.h"
-#include "linbox/solutions/det.h"
-#include "linbox/util/matrix-stream.h"
+#include <linbox/ring/modular.h>
+#include <linbox/matrix/sparse-matrix.h>
+#include <linbox/solutions/det.h>
using namespace LinBox;
using namespace std;
@@ -54,7 +53,7 @@ int main (int argc, char **argv)
// For a small integer matrix test, do "det data/mat2S".
// It is a 2 by 2 matrix with determinant = -2.
- typedef PID_integer Integers;
+ typedef Givaro::ZRing<Integer> Integers;
Integers ZZ;
ifstream input (argv[1]);
@@ -62,8 +61,7 @@ int main (int argc, char **argv)
{ cerr << "Error opening matrix file " << argv[1] << endl;
return -1;
}
- MatrixStream< Integers> ms ( ZZ, input );
- BlasMatrix<Integers> A(ms);
+ DenseMatrix<Integers> A(ZZ); A.read(input);
cout << "Matrix is " << A.rowdim() << " by " << A.coldim() << endl;
Integers::Element det_A;
@@ -74,7 +72,7 @@ int main (int argc, char **argv)
}
if (argc == 3) {
- typedef Modular<double> Field;
+ typedef Givaro::Modular<double> Field;
double q = atof(argv[2]);
Field F(q);
@@ -83,8 +81,7 @@ int main (int argc, char **argv)
{ cerr << "Error opening matrix file " << argv[1] << endl;
return -1;
}
- MatrixStream< Field > ms ( F, input );
- SparseMatrix<Field> B (ms);
+ SparseMatrix<Field> B (F); B.read(input);
cout << "Matrix is " << B.rowdim() << " by " << B.coldim() << endl;
Field::Element det_B;
diff --git a/examples/dot-product.C b/examples/dot-product.C
index 601a862..bacd55a 100644
--- a/examples/dot-product.C
+++ b/examples/dot-product.C
@@ -35,18 +35,18 @@
* required time.
*/
-#include "linbox/linbox-config.h"
+#include <linbox/linbox-config.h>
#include <iostream>
-#include "linbox/field/modular.h"
-#include "linbox/vector/vector-domain.h"
-#include "linbox/vector/stream.h"
-#include "linbox/util/commentator.h"
+#include <linbox/ring/modular.h>
+#include <linbox/vector/vector-domain.h>
+#include <linbox/vector/stream.h>
+#include <linbox/util/commentator.h>
using namespace LinBox;
-typedef Modular<uint32_t> Field;
+typedef Givaro::Modular<uint32_t> Field;
/// no command line args
int main (int argc, char **argv)
@@ -60,11 +60,11 @@ int main (int argc, char **argv)
commentator().setMaxDepth (1);
commentator().setReportStream (std::cout);
- Field F (q);
+ Field F (q); Field::RandIter gen(F);
- RandomDenseStream<Field, Vector<Field>::Dense> factory1 (F, n);
- RandomSparseStream<Field, Vector<Field>::SparseSeq> factory2 (F, p, n);
- RandomSparseStream<Field, Vector<Field>::SparsePar> factory3 (F, p, n);
+ RandomDenseStream<Field, Vector<Field>::Dense> factory1 (F, gen, n);
+ RandomSparseStream<Field, Vector<Field>::SparseSeq> factory2 (F, gen, p, n);
+ RandomSparseStream<Field, Vector<Field>::SparsePar> factory3 (F, gen, p, n);
Vector<Field>::Dense v1 (n), v2 (n);
Vector<Field>::SparseSeq v3;
diff --git a/examples/doubledet.C b/examples/doubledet.C
index aaf8fa3..3543bed 100644
--- a/examples/doubledet.C
+++ b/examples/doubledet.C
@@ -28,13 +28,14 @@
* @brief computes doubleDet.
*/
+#include <linbox/linbox-config.h>
#include <iostream>
-#include "linbox/linbox-config.h"
-#include "linbox/field/PID-integer.h"
-#include "linbox/util/matrix-stream.h"
-#include "linbox/solutions/det.h"
-#include "linbox/algorithms/double-det.h"
+#include <givaro/zring.h>
+#include <linbox/linbox-config.h>
+#include <linbox/util/matrix-stream.h>
+#include <linbox/solutions/det.h>
+#include <linbox/algorithms/double-det.h>
using namespace LinBox;
@@ -46,15 +47,15 @@ int main (int argc, char **argv)
// commentator().setMaxDepth (-1);
// commentator().setReportStream (std::cerr);
- PID_integer ZZ;
+ Givaro::ZRing<Integer> ZZ;
ifstream input (argv[1]);
if (!input)
{ cerr << "Error opening matrix file " << argv[1] << endl;
return -1;
}
- MatrixStream <PID_integer> ms (ZZ, input);
- BlasMatrix <PID_integer> A (ms);
+ MatrixStream <Givaro::ZRing<Integer> > ms (ZZ, input);
+ DenseMatrix <Givaro::ZRing<Integer> > A (ms);
cout << "Matrix is " << A.rowdim() << " by " << A.coldim() << endl;
if (A.rowdim() != A.coldim() + 1){
@@ -75,7 +76,7 @@ int main (int argc, char **argv)
// Check solution
size_t n = A.coldim();
- BlasMatrix<PID_integer> B (ZZ, n, n);
+ DenseMatrix<Givaro::ZRing<Integer> > B (ZZ, n, n);
for (size_t i=0; i<n-1; ++i)
for (size_t j=0; j<n; ++j)
B.setEntry (i,j,A.getEntry(i,j));
@@ -104,11 +105,10 @@ int main (int argc, char **argv)
return 0 ;
}
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
// Local Variables:
// mode: C++
// tab-width: 8
// indent-tabs-mode: nil
// c-basic-offset: 8
// End:
-
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/examples/echelon.C b/examples/echelon.C
index 501c648..aad107c 100644
--- a/examples/echelon.C
+++ b/examples/echelon.C
@@ -28,11 +28,12 @@
\ingroup examples
*/
+#include <linbox/linbox-config.h>
+
#include <iostream>
-#include "linbox/field/modular.h"
-#include "linbox/util/matrix-stream.h"
-#include "linbox/algorithms/echelon-form.h"
+#include <linbox/ring/modular.h>
+#include <linbox/algorithms/echelon-form.h>
#include <fflas-ffpack/ffpack/ffpack.h>
using namespace LinBox;
@@ -47,42 +48,46 @@ int main (int argc, char **argv)
ifstream input (argv[1]);
if (!input) { cerr << "Error opening matrix file " << argv[1] << endl; return -1; }
- typedef Modular<double> Field;
+ typedef Givaro::Modular<double> Field;
double q = atof(argv[2]);
Field F(q);
- MatrixStream<Field> ms(F,input);
- BlasMatrix<Field> A(ms);
- BlasMatrix<Field> E(F,A.rowdim(),A.coldim());
+ DenseMatrix<Field> A(F);
+ A.read(input);
+ DenseMatrix<Field> E(F,A.rowdim(),A.coldim());
cout << "A is " << A.rowdim() << " by " << A.coldim() << endl;
cout << A << std::endl;
- EchelonFormDomain<Modular<double> > EFD (F);
+ EchelonFormDomain<Givaro::Modular<double> > EFD (F);
EFD.rowReducedEchelon(E,A);
#ifdef COMPARE_FFPACK
- BlasMatrix<Field> G(A);
+ DenseMatrix<Field> G(A);
size_t * P = new size_t[G.coldim()];
size_t * Q = new size_t[G.rowdim()];
- size_t r = (size_t)FFPACK::ReducedRowEchelonForm (F, G.rowdim(), G.coldim(), G.getWritePointer(), G.coldim(), P, Q,false);
+ /* size_t r = (size_t)*/
+ FFPACK::ReducedRowEchelonForm (F, G.rowdim(), G.coldim(), G.getWritePointer(), G.coldim(), P, Q,false);
if (G.coldim() <20)
G.write(cerr<<"FFPACK::Echelon = "<<endl)<<endl;
+ delete[] P ;
+ delete[] Q ;
+
#endif
if (E.coldim() <20)
E.write(cerr<<"LinBox::Echelon = "<<endl)<<endl;
+
return 0;
}
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
// Local Variables:
// mode: C++
// tab-width: 8
// indent-tabs-mode: nil
// c-basic-offset: 8
// End:
-
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/examples/fields/Makefile.am b/examples/fields/Makefile.am
index 2a9c752..7d14f2f 100644
--- a/examples/fields/Makefile.am
+++ b/examples/fields/Makefile.am
@@ -19,7 +19,7 @@
# ========LICENCE========
#/
-AM_CPPFLAGS=-I$(top_srcdir)
+# AM_CPPFLAGS=-I$(top_srcdir)
EXTRA_PROGRAMS = \
ex-fields \
@@ -29,9 +29,9 @@ EXTRA_PROGRAMS = \
#AM_CPPFLAGS=$(GMP_CFLAGS) $(NTL_CFLAGS) -DEXAMPLE_DATADIR=\"$(srcdir)/data\"
#LDADD = $(top_builddir)/linbox/liblinbox.a $(GMP_LIBS) $(NTL_LIBS)
AM_CXXFLAGS = @DEFAULT_CFLAGS@ -DLinBoxSrcOnly
-AM_CPPFLAGS+= -DLinBoxSrcOnly $(GMP_CFLAGS) $(NTL_CFLAGS) \
+AM_CPPFLAGS+= -DLinBoxSrcOnly $(NTL_CFLAGS) \
-DEXAMPLE_DATADIR=\"$(srcdir)/data\"
-LDADD = $(GMP_LIBS) $(NTL_LIBS) -lgivaro -lclapack -lcblas -latlas $(LDFLAGS)
+LDADD = $(NTL_LIBS) $(LDFLAGS)
ex_fields_SOURCES = ex-fields.C
ex_fields_archetype_SOURCES = ex-fields-archetype.C
diff --git a/examples/fields/Makefile.in b/examples/fields/Makefile.in
deleted file mode 100644
index 87f9b3e..0000000
--- a/examples/fields/Makefile.in
+++ /dev/null
@@ -1,584 +0,0 @@
-# Makefile.in generated by automake 1.11.5 from Makefile.am.
-# @configure_input@
-
-# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software
-# Foundation, Inc.
-# This Makefile.in is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
-# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
-# PARTICULAR PURPOSE.
-
- at SET_MAKE@
-
-# Copyright (c) 2010 the LinBox group
-# This file is part of LinBox
-# ========LICENCE========
-# This file is part of the library LinBox.
-#
-# LinBox is free software: you can redistribute it and/or modify
-# it under the terms of the GNU Lesser General Public
-# License as published by the Free Software Foundation; either
-# version 2.1 of the License, or (at your option) any later version.
-#
-# This library 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
-# Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public
-# License along with this library; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
-# ========LICENCE========
-#/
-VPATH = @srcdir@
-am__make_dryrun = \
- { \
- am__dry=no; \
- case $$MAKEFLAGS in \
- *\\[\ \ ]*) \
- echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \
- | grep '^AM OK$$' >/dev/null || am__dry=yes;; \
- *) \
- for am__flg in $$MAKEFLAGS; do \
- case $$am__flg in \
- *=*|--*) ;; \
- *n*) am__dry=yes; break;; \
- esac; \
- done;; \
- esac; \
- test $$am__dry = yes; \
- }
-pkgdatadir = $(datadir)/@PACKAGE@
-pkgincludedir = $(includedir)/@PACKAGE@
-pkglibdir = $(libdir)/@PACKAGE@
-pkglibexecdir = $(libexecdir)/@PACKAGE@
-am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
-install_sh_DATA = $(install_sh) -c -m 644
-install_sh_PROGRAM = $(install_sh) -c
-install_sh_SCRIPT = $(install_sh) -c
-INSTALL_HEADER = $(INSTALL_DATA)
-transform = $(program_transform_name)
-NORMAL_INSTALL = :
-PRE_INSTALL = :
-POST_INSTALL = :
-NORMAL_UNINSTALL = :
-PRE_UNINSTALL = :
-POST_UNINSTALL = :
-build_triplet = @build@
-host_triplet = @host@
-EXTRA_PROGRAMS = ex-fields$(EXEEXT) ex-fields-archetype$(EXEEXT) \
- modular-int$(EXEEXT)
-subdir = examples/fields
-DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in
-ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-am__aclocal_m4_deps = $(top_srcdir)/macros/aclocal-include.m4 \
- $(top_srcdir)/macros/config-header.m4 \
- $(top_srcdir)/macros/debug.m4 \
- $(top_srcdir)/macros/expat-check.m4 \
- $(top_srcdir)/macros/fflas-ffpack-check.m4 \
- $(top_srcdir)/macros/fplll-check.m4 \
- $(top_srcdir)/macros/givaro-check.m4 \
- $(top_srcdir)/macros/gmp-check.m4 \
- $(top_srcdir)/macros/iml-check.m4 \
- $(top_srcdir)/macros/lapack-check.m4 \
- $(top_srcdir)/macros/libtool.m4 \
- $(top_srcdir)/macros/lidia-check.m4 \
- $(top_srcdir)/macros/linbox-benchmark.m4 \
- $(top_srcdir)/macros/linbox-doc.m4 \
- $(top_srcdir)/macros/linbox-misc.m4 \
- $(top_srcdir)/macros/linbox-opt.m4 \
- $(top_srcdir)/macros/ltoptions.m4 \
- $(top_srcdir)/macros/ltsugar.m4 \
- $(top_srcdir)/macros/ltversion.m4 \
- $(top_srcdir)/macros/lt~obsolete.m4 \
- $(top_srcdir)/macros/m4ri-check.m4 \
- $(top_srcdir)/macros/m4rie-check.m4 \
- $(top_srcdir)/macros/maple-check.m4 \
- $(top_srcdir)/macros/mpfr-check.m4 \
- $(top_srcdir)/macros/ntl-check.m4 \
- $(top_srcdir)/macros/saclib-check.m4 \
- $(top_srcdir)/macros/sage-check.m4 $(top_srcdir)/configure.ac
-am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
- $(ACLOCAL_M4)
-mkinstalldirs = $(install_sh) -d
-CONFIG_HEADER = $(top_builddir)/config.h
-CONFIG_CLEAN_FILES =
-CONFIG_CLEAN_VPATH_FILES =
-am_ex_fields_OBJECTS = ex-fields.$(OBJEXT)
-ex_fields_OBJECTS = $(am_ex_fields_OBJECTS)
-ex_fields_LDADD = $(LDADD)
-am__DEPENDENCIES_1 =
-ex_fields_DEPENDENCIES = $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1)
-am_ex_fields_archetype_OBJECTS = ex-fields-archetype.$(OBJEXT)
-ex_fields_archetype_OBJECTS = $(am_ex_fields_archetype_OBJECTS)
-ex_fields_archetype_LDADD = $(LDADD)
-ex_fields_archetype_DEPENDENCIES = $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1)
-am_modular_int_OBJECTS = modular-int.$(OBJEXT)
-modular_int_OBJECTS = $(am_modular_int_OBJECTS)
-modular_int_LDADD = $(LDADD)
-modular_int_DEPENDENCIES = $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1)
-DEFAULT_INCLUDES = -I. at am__isrc@ -I$(top_builddir)
-depcomp =
-am__depfiles_maybe =
-CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
- $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
-LTCXXCOMPILE = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
- --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
- $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
-CXXLD = $(CXX)
-CXXLINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
- --mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \
- $(LDFLAGS) -o $@
-SOURCES = $(ex_fields_SOURCES) $(ex_fields_archetype_SOURCES) \
- $(modular_int_SOURCES)
-DIST_SOURCES = $(ex_fields_SOURCES) $(ex_fields_archetype_SOURCES) \
- $(modular_int_SOURCES)
-am__can_run_installinfo = \
- case $$AM_UPDATE_INFO_DIR in \
- n|no|NO) false;; \
- *) (install-info --version) >/dev/null 2>&1;; \
- esac
-ETAGS = etags
-CTAGS = ctags
-DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
-ACLOCAL = @ACLOCAL@
-AMTAR = @AMTAR@
-AR = @AR@
-AUTOCONF = @AUTOCONF@
-AUTOHEADER = @AUTOHEADER@
-AUTOMAKE = @AUTOMAKE@
-AWK = @AWK@
-BLAS_CFLAGS = @BLAS_CFLAGS@
-BLAS_LIBS = @BLAS_LIBS@
-CC = @CC@
-CCNAM = @CCNAM@
-CFLAGS = @CFLAGS@
-CPPFLAGS = @CPPFLAGS@
-CXX = @CXX@
-CXXCPP = @CXXCPP@
-CXXFLAGS = @CXXFLAGS@
-CYGPATH_W = @CYGPATH_W@
-DBG = @DBG@
-DEBUG_CFLAGS = @DEBUG_CFLAGS@
-DEFAULT_CFLAGS = @DEFAULT_CFLAGS@
-DEFS = @DEFS@
-DLLTOOL = @DLLTOOL@
-DSYMUTIL = @DSYMUTIL@
-DUMPBIN = @DUMPBIN@
-ECHO_C = @ECHO_C@
-ECHO_N = @ECHO_N@
-ECHO_T = @ECHO_T@
-EGREP = @EGREP@
-EXEEXT = @EXEEXT@
-EXPAT_CFLAGS = @EXPAT_CFLAGS@
-EXPAT_LIBS = @EXPAT_LIBS@
-FFLAS_FFPACK_CFLAGS = @FFLAS_FFPACK_CFLAGS@
-FFLAS_FFPACK_LIBS = @FFLAS_FFPACK_LIBS@
-FFLAS_FFPACK_LOC = @FFLAS_FFPACK_LOC@
-FGREP = @FGREP@
-FPLLL_CFLAGS = @FPLLL_CFLAGS@
-FPLLL_LIBS = @FPLLL_LIBS@
-GIVARO_CFLAGS = @GIVARO_CFLAGS@
-GIVARO_LIBS = @GIVARO_LIBS@
-GMP_CFLAGS = @GMP_CFLAGS@
-GMP_LIBS = @GMP_LIBS@
-GMP_VERSION = @GMP_VERSION@
-GREP = @GREP@
-IML_CFLAGS = @IML_CFLAGS@
-IML_LIBS = @IML_LIBS@
-INSTALL = @INSTALL@
-INSTALL_DATA = @INSTALL_DATA@
-INSTALL_PROGRAM = @INSTALL_PROGRAM@
-INSTALL_SCRIPT = @INSTALL_SCRIPT@
-INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
-LD = @LD@
-LDFLAGS = @LDFLAGS@
-LIBOBJS = @LIBOBJS@
-LIBS = @LIBS@
-LIBTOOL = @LIBTOOL@
-LIDIA_CFLAGS = @LIDIA_CFLAGS@
-LIDIA_LIBS = @LIDIA_LIBS@
-LINBOX_BENCH_PATH = @LINBOX_BENCH_PATH@
-LINBOX_DOC_PATH = @LINBOX_DOC_PATH@
-LIPO = @LIPO@
-LN_S = @LN_S@
-LTLIBOBJS = @LTLIBOBJS@
-M4RIE_CFLAGS = @M4RIE_CFLAGS@
-M4RIE_LIBS = @M4RIE_LIBS@
-M4RI_CFLAGS = @M4RI_CFLAGS@
-M4RI_LIBS = @M4RI_LIBS@
-MAINT = @MAINT@
-MAKEINFO = @MAKEINFO@
-MANIFEST_TOOL = @MANIFEST_TOOL@
-MAPLE_CFLAGS = @MAPLE_CFLAGS@
-MAPLE_HOME = @MAPLE_HOME@
-MAPLE_LIBS = @MAPLE_LIBS@
-MAPLE_VERSION = @MAPLE_VERSION@
-MKDIR_P = @MKDIR_P@
-MPFR_CFLAGS = @MPFR_CFLAGS@
-MPFR_LIBS = @MPFR_LIBS@
-NM = @NM@
-NMEDIT = @NMEDIT@
-NTL_CFLAGS = @NTL_CFLAGS@
-NTL_LIBS = @NTL_LIBS@
-OBJDUMP = @OBJDUMP@
-OBJEXT = @OBJEXT@
-OTOOL = @OTOOL@
-OTOOL64 = @OTOOL64@
-PACKAGE = @PACKAGE@
-PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
-PACKAGE_NAME = @PACKAGE_NAME@
-PACKAGE_STRING = @PACKAGE_STRING@
-PACKAGE_TARNAME = @PACKAGE_TARNAME@
-PACKAGE_URL = @PACKAGE_URL@
-PACKAGE_VERSION = @PACKAGE_VERSION@
-PATH_SEPARATOR = @PATH_SEPARATOR@
-PROF = @PROF@
-RANLIB = @RANLIB@
-RM = @RM@
-SACLIB_CFLAGS = @SACLIB_CFLAGS@
-SACLIB_LIBS = @SACLIB_LIBS@
-SED = @SED@
-SET_MAKE = @SET_MAKE@
-SHELL = @SHELL@
-STRIP = @STRIP@
-TESTS_CFLAGS = @TESTS_CFLAGS@
-VERSION = @VERSION@
-WARN = @WARN@
-abs_builddir = @abs_builddir@
-abs_srcdir = @abs_srcdir@
-abs_top_builddir = @abs_top_builddir@
-abs_top_srcdir = @abs_top_srcdir@
-ac_ct_AR = @ac_ct_AR@
-ac_ct_CC = @ac_ct_CC@
-ac_ct_CXX = @ac_ct_CXX@
-ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
-am__leading_dot = @am__leading_dot@
-am__tar = @am__tar@
-am__untar = @am__untar@
-bindir = @bindir@
-build = @build@
-build_alias = @build_alias@
-build_cpu = @build_cpu@
-build_os = @build_os@
-build_vendor = @build_vendor@
-builddir = @builddir@
-datadir = @datadir@
-datarootdir = @datarootdir@
-docdir = @docdir@
-dvidir = @dvidir@
-exec_prefix = @exec_prefix@
-host = @host@
-host_alias = @host_alias@
-host_cpu = @host_cpu@
-host_os = @host_os@
-host_vendor = @host_vendor@
-htmldir = @htmldir@
-includedir = @includedir@
-infodir = @infodir@
-install_sh = @install_sh@
-libdir = @libdir@
-libexecdir = @libexecdir@
-localedir = @localedir@
-localstatedir = @localstatedir@
-mandir = @mandir@
-mkdir_p = @mkdir_p@
-oldincludedir = @oldincludedir@
-pdfdir = @pdfdir@
-prefix = @prefix@
-program_transform_name = @program_transform_name@
-psdir = @psdir@
-sbindir = @sbindir@
-sharedstatedir = @sharedstatedir@
-srcdir = @srcdir@
-sysconfdir = @sysconfdir@
-target_alias = @target_alias@
-top_build_prefix = @top_build_prefix@
-top_builddir = @top_builddir@
-top_srcdir = @top_srcdir@
-AM_CPPFLAGS = -I$(top_srcdir) -DLinBoxSrcOnly $(GMP_CFLAGS) \
- $(NTL_CFLAGS) -DEXAMPLE_DATADIR=\"$(srcdir)/data\"
-
-#AM_CPPFLAGS=$(GMP_CFLAGS) $(NTL_CFLAGS) -DEXAMPLE_DATADIR=\"$(srcdir)/data\"
-#LDADD = $(top_builddir)/linbox/liblinbox.a $(GMP_LIBS) $(NTL_LIBS)
-AM_CXXFLAGS = @DEFAULT_CFLAGS@ -DLinBoxSrcOnly
-LDADD = $(GMP_LIBS) $(NTL_LIBS) -lgivaro -lclapack -lcblas -latlas $(LDFLAGS)
-ex_fields_SOURCES = ex-fields.C
-ex_fields_archetype_SOURCES = ex-fields-archetype.C
-modular_int_SOURCES = modular-int.C
-all: all-am
-
-.SUFFIXES:
-.SUFFIXES: .C .lo .o .obj
-$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps)
- @for dep in $?; do \
- case '$(am__configure_deps)' in \
- *$$dep*) \
- ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
- && { if test -f $@; then exit 0; else break; fi; }; \
- exit 1;; \
- esac; \
- done; \
- echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu --ignore-deps examples/fields/Makefile'; \
- $(am__cd) $(top_srcdir) && \
- $(AUTOMAKE) --gnu --ignore-deps examples/fields/Makefile
-.PRECIOUS: Makefile
-Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
- @case '$?' in \
- *config.status*) \
- cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
- *) \
- echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
- cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
- esac;
-
-$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
- cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-
-$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
- cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
- cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-$(am__aclocal_m4_deps):
-ex-fields$(EXEEXT): $(ex_fields_OBJECTS) $(ex_fields_DEPENDENCIES) $(EXTRA_ex_fields_DEPENDENCIES)
- @rm -f ex-fields$(EXEEXT)
- $(CXXLINK) $(ex_fields_OBJECTS) $(ex_fields_LDADD) $(LIBS)
-ex-fields-archetype$(EXEEXT): $(ex_fields_archetype_OBJECTS) $(ex_fields_archetype_DEPENDENCIES) $(EXTRA_ex_fields_archetype_DEPENDENCIES)
- @rm -f ex-fields-archetype$(EXEEXT)
- $(CXXLINK) $(ex_fields_archetype_OBJECTS) $(ex_fields_archetype_LDADD) $(LIBS)
-modular-int$(EXEEXT): $(modular_int_OBJECTS) $(modular_int_DEPENDENCIES) $(EXTRA_modular_int_DEPENDENCIES)
- @rm -f modular-int$(EXEEXT)
- $(CXXLINK) $(modular_int_OBJECTS) $(modular_int_LDADD) $(LIBS)
-
-mostlyclean-compile:
- -rm -f *.$(OBJEXT)
-
-distclean-compile:
- -rm -f *.tab.c
-
-.C.o:
- $(CXXCOMPILE) -c -o $@ $<
-
-.C.obj:
- $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
-
-.C.lo:
- $(LTCXXCOMPILE) -c -o $@ $<
-
-mostlyclean-libtool:
- -rm -f *.lo
-
-clean-libtool:
- -rm -rf .libs _libs
-
-ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
- list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
- unique=`for i in $$list; do \
- if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
- done | \
- $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
- END { if (nonempty) { for (i in files) print i; }; }'`; \
- mkid -fID $$unique
-tags: TAGS
-
-TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
- $(TAGS_FILES) $(LISP)
- set x; \
- here=`pwd`; \
- list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
- unique=`for i in $$list; do \
- if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
- done | \
- $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
- END { if (nonempty) { for (i in files) print i; }; }'`; \
- shift; \
- if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
- test -n "$$unique" || unique=$$empty_fix; \
- if test $$# -gt 0; then \
- $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
- "$$@" $$unique; \
- else \
- $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
- $$unique; \
- fi; \
- fi
-ctags: CTAGS
-CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
- $(TAGS_FILES) $(LISP)
- list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
- unique=`for i in $$list; do \
- if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
- done | \
- $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
- END { if (nonempty) { for (i in files) print i; }; }'`; \
- test -z "$(CTAGS_ARGS)$$unique" \
- || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
- $$unique
-
-GTAGS:
- here=`$(am__cd) $(top_builddir) && pwd` \
- && $(am__cd) $(top_srcdir) \
- && gtags -i $(GTAGS_ARGS) "$$here"
-
-distclean-tags:
- -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
-
-distdir: $(DISTFILES)
- @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
- topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
- list='$(DISTFILES)'; \
- dist_files=`for file in $$list; do echo $$file; done | \
- sed -e "s|^$$srcdirstrip/||;t" \
- -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
- case $$dist_files in \
- */*) $(MKDIR_P) `echo "$$dist_files" | \
- sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
- sort -u` ;; \
- esac; \
- for file in $$dist_files; do \
- if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
- if test -d $$d/$$file; then \
- dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
- if test -d "$(distdir)/$$file"; then \
- find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
- fi; \
- if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
- cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
- find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
- fi; \
- cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
- else \
- test -f "$(distdir)/$$file" \
- || cp -p $$d/$$file "$(distdir)/$$file" \
- || exit 1; \
- fi; \
- done
-check-am: all-am
-check: check-am
-all-am: Makefile
-installdirs:
-install: install-am
-install-exec: install-exec-am
-install-data: install-data-am
-uninstall: uninstall-am
-
-install-am: all-am
- @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
-
-installcheck: installcheck-am
-install-strip:
- if test -z '$(STRIP)'; then \
- $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
- install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
- install; \
- else \
- $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
- install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
- "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
- fi
-mostlyclean-generic:
-
-clean-generic:
-
-distclean-generic:
- -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
- -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
-
-maintainer-clean-generic:
- @echo "This command is intended for maintainers to use"
- @echo "it deletes files that may require special tools to rebuild."
-clean: clean-am
-
-clean-am: clean-generic clean-libtool mostlyclean-am
-
-distclean: distclean-am
- -rm -f Makefile
-distclean-am: clean-am distclean-compile distclean-generic \
- distclean-tags
-
-dvi: dvi-am
-
-dvi-am:
-
-html: html-am
-
-html-am:
-
-info: info-am
-
-info-am:
-
-install-data-am:
-
-install-dvi: install-dvi-am
-
-install-dvi-am:
-
-install-exec-am:
-
-install-html: install-html-am
-
-install-html-am:
-
-install-info: install-info-am
-
-install-info-am:
-
-install-man:
-
-install-pdf: install-pdf-am
-
-install-pdf-am:
-
-install-ps: install-ps-am
-
-install-ps-am:
-
-installcheck-am:
-
-maintainer-clean: maintainer-clean-am
- -rm -f Makefile
-maintainer-clean-am: distclean-am maintainer-clean-generic
-
-mostlyclean: mostlyclean-am
-
-mostlyclean-am: mostlyclean-compile mostlyclean-generic \
- mostlyclean-libtool
-
-pdf: pdf-am
-
-pdf-am:
-
-ps: ps-am
-
-ps-am:
-
-uninstall-am:
-
-.MAKE: install-am install-strip
-
-.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \
- clean-libtool ctags distclean distclean-compile \
- distclean-generic distclean-libtool distclean-tags distdir dvi \
- dvi-am html html-am info info-am install install-am \
- install-data install-data-am install-dvi install-dvi-am \
- install-exec install-exec-am install-html install-html-am \
- install-info install-info-am install-man install-pdf \
- install-pdf-am install-ps install-ps-am install-strip \
- installcheck installcheck-am installdirs maintainer-clean \
- maintainer-clean-generic mostlyclean mostlyclean-compile \
- mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
- tags uninstall uninstall-am
-
-
-# Tell versions [3.59,3.63) of GNU make to not export all variables.
-# Otherwise a system limit (for SysV at least) may be exceeded.
-.NOEXPORT:
diff --git a/examples/fields/ex-fields-archetype.C b/examples/fields/ex-fields-archetype.C
index febb2d0..3dcd42c 100644
--- a/examples/fields/ex-fields-archetype.C
+++ b/examples/fields/ex-fields-archetype.C
@@ -72,12 +72,12 @@ int main() {
/* The field objects "K_o" and "Q_o" are constructed as in previous examples
*/
- // UnparametricField<NTL::RR> Q_o;
+ // Givaro::ZRing<NTL::RR> Q_o;
NTL_RR Q_o ;
NTL::RR::SetPrecision(400);
NTL::RR::SetOutputPrecision(50);
- // UnparametricField<NTL::zz_p> K_o;
+ // Givaro::ZRing<NTL::zz_p> K_o;
NTL::zz_p::init(553);
NTL_zz_p K_o ;
diff --git a/examples/fields/ex-fields.C b/examples/fields/ex-fields.C
index c0d2b17..b478546 100644
--- a/examples/fields/ex-fields.C
+++ b/examples/fields/ex-fields.C
@@ -71,21 +71,21 @@ int main()
/* Using the parameterized domain capabilities, several domains
* representing integers modulo may be used simultaneously. */
- Modular<uint32_t> D(3), K(7);
+ Givaro::Modular<uint32_t> D(3), K(7);
divide_ex(D); divide_ex(K);
// NTL arbitrary precision real field
// (Could be parameterized by the precision)
- // UnparametricField<NTL::RR> K2;
+ // Givaro::ZRing<NTL::RR> K2;
NTL_RR K2 ;
NTL::RR::SetPrecision(500);
NTL::RR::SetOutputPrecision(50);
// NTL modulo p field
- //UnparametricField<NTL::zz_p> K2;
+ //Givaro::ZRing<NTL::zz_p> K2;
//NTL::zz_p::init(553);
divide_ex(K2);
diff --git a/examples/fields/modular-int.C b/examples/fields/modular-int.C
index 9395470..cae45e7 100644
--- a/examples/fields/modular-int.C
+++ b/examples/fields/modular-int.C
@@ -23,7 +23,7 @@
*/
/** \file examples/fields/modular-int.C
- \brief Example of arithmetic in the Modular<int> finite field.
+ \brief Example of arithmetic in the Givaro::Modular<int> finite field.
*/
//by Zhendong wan wan at udel.edu
@@ -36,10 +36,10 @@
int main (int argc, char **argv)
{
/* construct the Z/101Z field */
- LinBox::Modular<int> F(101);
+ Givaro::Modular<int> F(101);
/* declare local variable a, b, c, x, y*/
- LinBox::Modular<int>::Element a, b, c, x, y;
+ Givaro::Modular<int>::Element a, b, c, x, y;
// initializtion
F.init(a, 92);
diff --git a/examples/find-invariant-factors.C b/examples/find-invariant-factors.C
new file mode 100644
index 0000000..58cb207
--- /dev/null
+++ b/examples/find-invariant-factors.C
@@ -0,0 +1,79 @@
+#include "linbox/linbox-config.h"
+
+#include <iostream>
+#include <vector>
+//#include <omp.h>
+
+//#define LINBOX_USES_OMP 1
+#include "linbox/ring/modular.h"
+#include "linbox/matrix/sparse-matrix.h"
+#include "linbox/matrix/dense-matrix.h"
+#include "linbox/matrix/matrix-domain.h"
+
+#include "linbox/algorithms/coppersmith-invariant-factors.h"
+
+// Computes the invariant factors of a sparse matrix (given in Matrix Market Format)
+// Effectively times: TPL_omp, BlockCoppersmithDomain and KannanBachem
+
+using namespace LinBox;
+
+typedef Givaro::Modular<double> Field;
+typedef typename Field::Element Element;
+typedef SparseMatrix<Field, SparseMatrixFormat::TPL> SparseMat;
+//typedef SparseMatrix<Field, SparseMatrixFormat::TPL_omp> SparseMat;
+
+typedef CoppersmithInvariantFactors<Field,SparseMat> FactorDomain;
+typedef typename FactorDomain::PolyDom PolyDom;
+typedef typename FactorDomain::PolyRing PolyRing;
+typedef DenseVector<PolyRing> FactorVector;
+
+int main(int argc, char** argv)
+{
+ int earlyTerm = 10;
+ int p = 97, b = 3;
+ std::string mFname,oFname;
+
+ static Argument args[] = {
+ { 'p', "-p P", "Set the field GF(p)", TYPE_INT, &p},
+ { 't', "-t T", "Early term threshold", TYPE_INT, &earlyTerm},
+ { 'b', "-b B", "Blocking factor", TYPE_INT, &b},
+ { 'm', "-m M", "Name of file for matrix M", TYPE_STR, &mFname},
+ { 'o', "-o O", "Name of file for output", TYPE_STR, &oFname},
+ END_OF_ARGUMENTS
+ };
+
+ parseArguments(argc,argv,args);
+
+ Field F(p);
+ SparseMat M(F);
+
+ {
+ std::ifstream iF(mFname);
+ M.read(iF);
+ M.finalize();
+ iF.close();
+ }
+
+ std::cout << "Finished reading" << std::endl;
+
+ PolyDom PD(F,"x");
+ PolyRing R(PD);
+ FactorVector factorList(R);
+ FactorDomain CIF(F,M,b);
+
+ size_t numFactors=CIF.computeFactors(factorList,earlyTerm);
+ std::cout << "Finished computing factors" << std::endl;
+
+ {
+ std::ofstream out(oFname);
+ for (size_t i=0;i<numFactors;++i) {
+ R.write(out,factorList[i]);
+ out << std::endl;
+ }
+ out.close();
+ }
+
+ return 0;
+}
+
+
diff --git a/examples/gf3-invariant-factors.C b/examples/gf3-invariant-factors.C
new file mode 100644
index 0000000..8201d81
--- /dev/null
+++ b/examples/gf3-invariant-factors.C
@@ -0,0 +1,122 @@
+#include "linbox/linbox-config.h"
+
+#include <iostream>
+#include <vector>
+#include <omp.h>
+
+#define LINBOX_USES_OMP 1
+
+
+#include "linbox/blackbox/pascal.h"
+
+#include "linbox/ring/modular.h"
+#include "linbox/matrix/sparse-matrix.h"
+#include "linbox/matrix/dense-matrix.h"
+#include "linbox/matrix/matrix-domain.h"
+#include "linbox/matrix/sliced3.h"
+#include "linbox/algorithms/coppersmith-invariant-factors.h"
+
+using namespace LinBox;
+
+template<class Field>
+std::istream& readVector(std::istream& is,
+ const Field& F,
+ std::vector<typename Field::Element>& out)
+{
+ char c;
+ is >> std::ws;
+ is >> c;
+ linbox_check(c=='[');
+ is >> std::ws;
+ out.clear();
+ c=is.peek();
+ while (is.good() && (c != ']')) {
+ typename Field::Element d;
+ F.read(is,d);
+ out.push_back(d);
+ is >> std::ws;
+ c=is.peek();
+ }
+ return is;
+}
+
+typedef SlicedField<Givaro::Modular<int64_t>,uint64_t> Field;
+typedef typename Field::Element Element;
+typedef PascalBlackbox<Field> SparseMat;
+
+typedef CoppersmithInvariantFactors<Field,SparseMat,Givaro::Modular<int64_t> > FactorDomain;
+typedef typename FactorDomain::PolyDom PolyDom;
+typedef typename FactorDomain::PolyRing PolyRing;
+typedef DenseVector<PolyRing> FactorVector;
+
+int main(int argc, char** argv)
+{
+ int earlyTerm;
+ int b;
+ std::string mFname,oFname;
+
+ static Argument args[] = {
+ { 't', "-t T", "Early term threshold", TYPE_INT, &earlyTerm},
+ { 'b', "-b B", "Blocking factor", TYPE_INT, &b},
+ { 'm', "-m M", "Name of file for coefficients", TYPE_STR, &mFname},
+ { 'o', "-o O", "Name of file for output", TYPE_STR, &oFname},
+ END_OF_ARGUMENTS
+ };
+
+ parseArguments(argc,argv,args);
+
+ Field F(3);
+ std::vector<Element> coeffs;
+ {
+ std::ifstream iF(mFname);
+ readVector(iF,F,coeffs);
+ iF.close();
+ }
+ int n=coeffs.size();
+ coeffs.resize(2*n);
+ SparseMat M(n,n,coeffs,F);
+
+#if 0
+ {
+ MatrixDomain<Field> MD;
+ typename MatrixDomain<Field>::OwnMatrix I(F,n,n),O(F,n,n);
+ for (int i=0;i<n;++i)
+ for (int j=0;j<n;++j)
+ I.setEntry(i,j,i==j?1:0);
+ M.applyLeft(O,I);
+ for (int i=0;i<n;++i) {
+ for (int j=0;j<n;++j) {
+ Element d;
+ O.getEntry(d,i,j);
+ std::cout << (int)d;
+ }
+ std::cout << std::endl;
+ }
+ }
+#else
+ std::cout << "Finished reading" << std::endl;
+
+ PolyDom PD(F,"x");
+ PolyRing R(PD);
+ FactorVector factorList(R);
+ FactorDomain CIF(F,M,b);
+
+ size_t numFactors=CIF.computeFactors(factorList,earlyTerm);
+ std::cout << "Finished computing factors" << std::endl;
+
+ {
+ std::ofstream out(oFname);
+ for (size_t i=0;i<numFactors;++i) {
+ R.write(out,factorList[i]);
+ out << std::endl;
+ }
+ out.close();
+ }
+#endif
+ return 0;
+}
+
+
+
+
+
diff --git a/examples/graph-charpoly.C b/examples/graph-charpoly.C
index 306fb18..756cc1c 100644
--- a/examples/graph-charpoly.C
+++ b/examples/graph-charpoly.C
@@ -29,13 +29,15 @@
* Example for Pr G. Royle.
*/
+#include <linbox/linbox-config.h>
+
#include <iostream>
-#include "linbox/blackbox/zero-one.h"
-#include "linbox/field/PID-integer.h"
-#include "linbox/solutions/charpoly.h"
-#include "linbox/ring/givaro-polynomial.h"
-#include "linbox/solutions/methods.h"
+#include <linbox/blackbox/zero-one.h>
+#include <givaro/zring.h>
+#include <linbox/solutions/charpoly.h>
+#include <linbox/ring/givaro-polynomial.h>
+#include <linbox/solutions/methods.h>
using namespace std;
using namespace LinBox;
@@ -45,7 +47,7 @@ void printPolynomial(const Field& F, const Polynomial& P)
{
int n= (int) P.size()-1;
for (int i=0;i<n;++i)
- cout<<P[i]<<" ";
+ cout<<P[(size_t)i]<<" ";
cout<<endl;
if (n==1){
cout<<"X";
@@ -55,8 +57,8 @@ void printPolynomial(const Field& F, const Polynomial& P)
else{
cout<<"X^"<<n;
for ( int i=n-1; i>1; --i)
- if (!F.isZero(P[i]))
- F.write(cout<<((P[i]>0)?"+":""),P[i])<<"*X^"<<i;
+ if (!F.isZero(P[(size_t)i]))
+ F.write(cout<<((P[(size_t)i]>0)?"+":""),P[(size_t)i])<<"*X^"<<i;
if ( P[1] != 0)
F.write(cout<<((P[1]>0)?"+":""),P[1])<<"*X";
if ( P[0] != 0)
@@ -65,8 +67,8 @@ void printPolynomial(const Field& F, const Polynomial& P)
}
-typedef ZeroOne<PID_integer> Matrix;
-typedef GivPolynomialRing<PID_integer, Givaro::Dense> IntPolRing;
+typedef ZeroOne<Givaro::ZRing<Integer> > Matrix;
+typedef GivPolynomialRing<Givaro::ZRing<Integer>, Givaro::Dense> IntPolRing;
int main (int argc, char **argv)
{
@@ -85,8 +87,8 @@ int main (int argc, char **argv)
return -1;
}
- //UnparametricField<integer> ZZ;
- PID_integer ZZ;
+ //Givaro::ZRing<integer> ZZ;
+ Givaro::ZRing<Integer> ZZ;
Matrix A(ZZ);
A.read (input);
commentator().report(1, BRIEF_REPORT)<< "A is " << A.rowdim() << " by " << A.coldim() << endl;
diff --git a/examples/grid_reduce.C b/examples/grid_reduce.C
new file mode 100644
index 0000000..a512e29
--- /dev/null
+++ b/examples/grid_reduce.C
@@ -0,0 +1,451 @@
+
+/*
+ * examples/grid_reduce.C
+ *
+ * Copyright (C) 2008, 2010 A. Urbanska
+ ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ * ========LICENCE========
+ */
+
+/*! @file examples/grid_reduce.C
+ * @example examples/grid_reduce.C
+ * @ingroup examples
+ * @brief undocumented
+ */
+
+#include <iostream>
+#include <sstream>
+#include<fstream>
+
+#include <linbox/linbox-config.h>
+#include <givaro/modular.h>
+#include <linbox/util/timer.h>
+#include <linbox/matrix/grid.h>
+
+using namespace LinBox;
+
+int main(int argc, char* argv[])
+{
+
+ srand(time(NULL));
+
+ if (argc < 5) {
+
+ std::cout << "usage: " << argv[0] << " alg m n S source format " << std::endl << std::endl;
+
+ std::cout << "alg = `adaptive', `ilio', `local', or `2local', " << std::endl
+ << "m is modulus (ignored by 2local, adaptive), "
+ << "n is matrix order, " << std::endl
+ << "S is reduced rows size" << std::endl
+ << "source is `random', `random-rough', `fib', `tref', or a filename " << std::endl
+ << "format is `dense' or `sparse' (if matrix from a file)" << std::endl
+ << "compile with -DBIG if you want big integers used." << std::endl;
+
+ return 0;
+ }
+
+ std::string algo = argv[1];
+
+ // int m = atoi(argv[2]);
+
+ // int n = atoi(argv[3]);
+
+ int S = atoi(argv[4]);
+ std::string src = argv[5];
+ // std::string file = src;
+
+ // std::string format = (argc >= 6 ? argv[5] : "");
+
+ UserTimer T, TT;
+
+ std::string out(src);
+ out=out+"z";
+ if (algo == "reduceT") out=out+"T";
+
+ typedef Givaro::ZRing<Integer> Ints;
+ //typedef Givaro::ModularBalanced<int> Ints;
+ //typedef Givaro::Modular<int> Ints;
+ //Ints Z(m);
+ Ints Z;
+
+ integer p;
+ std::cout << "Computation modulo " << Z.characteristic(p) << "" << std::endl<<std::flush;
+
+ std::ifstream in (src.c_str(), std::ios::in);
+ std::ofstream os (out.c_str(), std::ios::out);
+
+ std::vector<int> mC;
+ std::vector<int> mR;
+#if 0
+ ifstream mRow ("mR2", ios::in);
+ char c='['; mRow >> c; std::cout << c;
+ while (c!='[') {
+ mRow >> c;
+ std::cout << c;
+ }
+ int mark;
+ while( mRow >> mark) {
+ mC.push_back(mark);
+ }
+ mRow.close();
+ mRow.open("mC2", ios::in) ;
+ c='['; mRow >> c; std::cout << c;
+ while (c!='[') {
+ mRow >> c;
+ std::cout << c;
+ }
+ for (int i=0; i< mC.size(); ++i) {
+ mRow >> mark;
+ if(mark==1) mC[i] = mark;
+ }
+#endif
+ std::cout << src << "" << std::endl<< std::flush ;
+ TT.clear();
+ TT.start();
+ Grid<Ints, Ints::Element> A(Z,in, mR, mC);
+ TT.stop();
+ std::cout << "Reading the matrix in ";
+ TT.print(std::cout);
+ std::cout << " seconds" << std::endl << std::flush;
+
+ int rank =0;
+ TT.clear();
+ TT.start();
+ A.reduce(rank, S, mR, mC, os);
+ TT.stop();
+ std::cout << "Reducing the matrix in ";
+ TT.print(std::cout);
+ std::cout << " seconds" << std::endl << std::flush;
+
+ std::cout << "The rank is " << rank << "" << std::endl << std::flush;
+ A.write(os);
+ //std::cout << "mR: \n[";
+ //for (int i=0; i < mR.size() ; ++i) {
+ // std::cout << mR[i] << " ";
+ //}
+ os << "mC: \n[";
+ for (int i=0; i < mC.size() ; ++i) {
+ os << mC[i] << " ";
+ }
+ os << "]" << std::endl;
+ os << "mR: \n[";
+ for (int i=0; i < mR.size() ; ++i) {
+ os<< mR[i] << " ";
+ }
+ os <<std::endl <<std::flush;
+
+
+ int matrix=1;
+ TT.clear();
+ TT.start();
+ while (matrix+1 < argc-5) {//argc - "grid-reduce reduce m n S", while takes 2 matrices
+ TT.stop();
+ std::cout << "Time other:";
+ TT.print(std::cout);
+ std::cout << "seconds" << std::endl << std::flush;
+ TT.clear();
+ TT.start();
+ //mC = mR; //mR plays the role of mC
+ mC.resize(0);
+ char c='['; in >> c; std::cout << c;
+ while (c!='[') {
+ in >> c;
+ std::cout << c;
+ }
+ TT.stop();
+ std::cout << "Time vector exchange in";
+ TT.print(std::cout);
+ std::cout << "seconds" << std::endl << std::flush;
+ TT.clear();
+ TT.start();
+ std::cout << "reading additional columns" << std::endl << std::flush;
+ for (int i=0; i < mR.size(); ++i) {
+ int mark;
+ in >> mark;
+ if (mR[i]!=1) mR[i] = mark;
+ //if (mark>0) std::cout << mark << " ";
+ }
+ std::cout << "columns read in ";
+ TT.stop();
+ TT.print(std::cout);
+ std::cout << "seconds" << std::endl << std::flush;
+
+ std::cout << "Time file preparation in";
+ TT.clear();
+ TT.start();
+ in.close();
+ src = argv[5+matrix];
+ std::cout << src << "" << std::endl << std::flush;
+ std::string out3(src);
+ out3= out3+"z";
+ if (algo == "reduceT") out3=out3+"T";
+ //++matrix;
+ in.open(src.c_str(), std::ios::in);
+ os.close();
+ os.open(out3.c_str(), std::ios::out);
+ TT.stop();
+ TT.print(std::cout);
+ std::cout << "seconds" << std::endl << std::flush;
+ TT.clear();
+ TT.start();
+ A.read(Z,in, mC, mR);
+ //Grid<Ints, Ints::Element> A2(Z,in, mR, mC);
+ TT.stop();
+ std::cout << "Reading the matrix in ";
+ TT.print(std::cout);
+ std::cout << " seconds" << std::endl << std::flush;
+
+ rank =0;
+ TT.clear();
+ TT.start();
+ if (matrix==1) A.reduce(rank, 1000000*S, mC, mR, os); //22(1,9)
+ if (matrix==9) A.reduce(rank, 1000000*S, mC, mR, os); //22(1,9)
+ if (matrix==7) A.reduce(rank, 4.7*S, mC, mR, os); //20(3,7)change1.6
+ if (matrix==5) A.reduce(rank, 1000000*S, mC, mR, os); //18(5,5)change3
+ //if (matrix==1) A.reduce(rank, S,mC,mR,os);
+ else A.reduce(rank, S, mC, mR, os);
+ TT.stop();
+ std::cout << "Reducing the matrix in ";
+ TT.print(std::cout);
+ std::cout << " seconds" << std::endl << std::flush;
+
+ std::cout << "The rank is " << rank << "" << std::endl << std::flush;
+ TT.clear();
+ TT.start();
+ A.write(os);
+ TT.stop();
+ std::cout << "Writing the matrix in ";
+ TT.print(std::cout);
+ std::cout << " seconds" << std::endl << std::flush;
+
+ TT.clear();
+ TT.start();
+ os << "mC:\n[";
+ for (int i=0; i < mR.size() ; ++i) {
+ os << mR[i] << " ";
+ }
+ os << "" << std::endl;
+ os << "mR: \n[";
+ for (int i=0; i < mC.size() ; ++i) {
+ os<< mC[i] << " ";
+ }
+ os <<std::endl <<std::flush;
+ TT.stop();
+ std::cout << "Writing mC vector in ";
+ TT.print(std::cout);
+ std::cout << " seconds" << std::endl << std::flush;
+
+ //mC = mR;
+ mR.resize(0);
+ c='['; in >> c; std::cout << c;
+ while (c!='[') {
+ in >> c;
+ std::cout << c;
+ }
+ TT.stop();
+ std::cout << "Time vector exchange in";
+ TT.print(std::cout);
+ std::cout << "seconds" << std::endl << std::flush;
+ TT.clear();
+ TT.start();
+ std::cout << "reading additional columns" << std::endl << std::flush;
+ for (int i=0; i < mC.size(); ++i) {
+ int mark;
+ in >> mark;
+ if (mC[i]!=1) mC[i] = mark;
+ //if (mark>0) std::cout << mark << " ";
+ }
+ std::cout << "columns read in ";
+ TT.stop();
+ TT.print(std::cout);
+ std::cout << "seconds" << std::endl << std::flush;
+
+ std::cout << "Time file preparation in";
+ TT.clear();
+ TT.start();
+ in.close();
+ src = argv[6+matrix];
+ std::cout << src << "" << std::endl << std::flush;
+ std::string out4(src);
+ out4= out4+"z";
+ if (algo == "reduceT") out4=out4+"T";
+ matrix+=2;
+ in.open(src.c_str(), std::ios::in);
+ os.close();
+ os.open(out4.c_str(), std::ios::out);
+ TT.stop();
+ TT.print(std::cout);
+ std::cout << "seconds" << std::endl << std::flush;
+ TT.clear();
+ TT.start();
+
+ A.read(Z,in, mR, mC);
+ //Grid<Ints, Ints::Element> A2(Z,in, mR, mC);
+ TT.stop();
+ std::cout << "Reading the matrix in ";
+ TT.print(std::cout);
+ std::cout << " seconds" << std::endl << std::flush;
+
+ int rank =0;
+ TT.clear();
+ TT.start();
+ if (matrix==3) A.reduce(rank, 6.8*S, mR, mC, os); //21(3,9)
+ if (matrix==9) A.reduce(rank, 6.8*S, mR, mC, os); //21(3,9)
+ if (matrix==7) A.reduce(rank, 4.6*S, mR, mC, os); //19(5,7)nochange1.6
+ A.reduce(rank, S, mR, mC, os);
+ TT.stop();
+ std::cout << "Reducing the matrix in ";
+ TT.print(std::cout);
+ std::cout << " seconds" << std::endl << std::flush;
+
+ std::cout << "The rank is " << rank << "" << std::endl << std::flush;
+ TT.clear();
+ TT.start();
+ A.write(os);
+ TT.stop();
+ std::cout << "Writing the matrix in ";
+ TT.print(std::cout);
+ std::cout << " seconds" << std::endl << std::flush;
+
+ TT.clear();
+ TT.start();
+ os << "mC:\n[";
+ for (int i=0; i < mC.size() ; ++i) {
+ os << mC[i] << " ";
+ }
+ os << "" << std::endl;
+ os << "mR: \n[";
+ for (int i=0; i < mR.size() ; ++i) {
+ os<< mR[i] << " ";
+ }
+ os <<std::endl <<std::flush;
+ TT.stop();
+ std::cout << "Writing mC vector in ";
+ TT.print(std::cout);
+ std::cout << " seconds" << std::endl << std::flush;
+
+ TT.clear();
+ TT.start();
+ }
+
+ if (matrix < argc-5) {
+ TT.stop();
+ std::cout << "Time other:";
+ TT.print(std::cout);
+ std::cout << "seconds" << std::endl << std::flush;
+ TT.clear();
+ TT.start();
+ //mC = mR; //mR plays the role of mC
+ mC.resize(0);
+ char c='['; in >> c; std::cout << c;
+ while (c!='[') {
+ in >> c;
+ std::cout << c;
+ }
+ TT.stop();
+ std::cout << "Time vector exchange in";
+ TT.print(std::cout);
+ std::cout << "seconds" << std::endl << std::flush;
+ TT.clear();
+ TT.start();
+ std::cout << "reading additional columns" << std::endl << std::flush;
+ for (int i=0; i < mR.size(); ++i) {
+ int mark;
+ in >> mark;
+ if (mR[i]!=1) mR[i] = mark;
+ //if (mark>0) std::cout << mark << " ";
+ }
+ std::cout << "columns read in ";
+ TT.stop();
+ TT.print(std::cout);
+ std::cout << "seconds" << std::endl << std::flush;
+
+ std::cout << "Time file preparation in";
+ TT.clear();
+ TT.start();
+ in.close();
+ src = argv[5+matrix];
+ std::cout << src << "" << std::endl << std::flush;
+ std::string out2(src);
+ out2= out2+"z";
+ if (algo == "reduceT") out2=out2+"T";
+ //++matrix;
+ in.open(src.c_str(), std::ios::in);
+ os.close();
+ os.open(out2.c_str(), std::ios::out);
+ TT.stop();
+ TT.print(std::cout);
+ std::cout << "seconds" << std::endl << std::flush;
+ TT.clear();
+ TT.start();
+ A.read(Z,in, mC, mR);
+ //Grid<Ints, Ints::Element> A2(Z,in, mR, mC);
+ TT.stop();
+ std::cout << "Reading the matrix in ";
+ TT.print(std::cout);
+ std::cout << " seconds" << std::endl << std::flush;
+
+ int rank =0;
+ TT.clear();
+ TT.start();
+ A.reduce(rank, S, mC, mR, os);
+ TT.stop();
+ std::cout << "Reducing the matrix in ";
+ TT.print(std::cout);
+ std::cout << " seconds" << std::endl << std::flush;
+
+ std::cout << "The rank is " << rank << "" << std::endl << std::flush;
+ TT.clear();
+ TT.start();
+ A.write(os);
+ TT.stop();
+ std::cout << "Writing the matrix in ";
+ TT.print(std::cout);
+ std::cout << " seconds" << std::endl << std::flush;
+
+ TT.clear();
+ TT.start();
+ os << "mC:\n[";
+ for (int i=0; i < mR.size() ; ++i) {
+ os << mR[i] << " ";
+ }
+ os << "" << std::endl;
+ os << "mC: \n[";
+ for (int i=0; i < mC.size() ; ++i) {
+ os<< mC[i] << " ";
+ }
+ os <<std::endl <<std::flush;
+ TT.stop();
+ std::cout << "Writing mC vector in ";
+ TT.print(std::cout);
+ std::cout << " seconds" << std::endl << std::flush;
+
+ }
+ TT.stop();
+
+ return 0 ;
+}
+
+
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/examples/iliopoulos2.C b/examples/iliopoulos2.C
new file mode 100644
index 0000000..cc91d31
--- /dev/null
+++ b/examples/iliopoulos2.C
@@ -0,0 +1,137 @@
+/* linbox/algorithms/coppersmith-invariant-factors.h
+ * Copyright (C) 2015 Gavin Harrison
+ *
+ * Written by Gavin Harrison <gavin.har at gmail.com>
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ * ========LICENCE========
+ */
+
+#include "linbox/linbox-config.h"
+
+#include <iostream>
+#include <vector>
+
+#include "linbox/ring/modular.h"
+#include "linbox/matrix/dense-matrix.h"
+#include "linbox/matrix/matrix-domain.h"
+#include "linbox/matrix/random-matrix.h"
+
+#include "linbox/algorithms/smith-form-iliopoulos2.h"
+
+#include <givaro/zring.h>
+
+using namespace LinBox;
+using namespace Givaro;
+
+typedef ZRing<Integer> Field;
+typedef typename ZRing<Integer>::Element Element;
+typedef IliopoulosDomain<Field> IliopoulosDom;
+typedef MatrixDomain<Field> Domain;
+typedef typename Domain::OwnMatrix Matrix;
+typedef typename Field::RandIter RandIter;
+typedef RandomDenseMatrix<RandIter, Field> RandomMatrix;
+
+Field Z;
+Domain MD(Z);
+RandIter RI(Z);
+RandomMatrix RDM(Z, RI);
+IliopoulosDom ID(Z);
+
+void printMatrix(Matrix &A) {
+ size_t m = A.rowdim();
+ size_t n = A.coldim();
+
+ std::cout << "matrix(ZZ, " << m << "," << n << ", [" << std::endl;
+ for (size_t i = 0; i < m; i++) {
+ Element tmp;
+ Z.write(std::cout << "[", A.getEntry(tmp, i, 0));
+ for (size_t j = 1; j < n; j++) {
+ Z.write(std::cout << ", ", A.getEntry(tmp, i, j));
+ }
+ std::cout << "]," << std::endl;
+ }
+ std::cout << "])" << std::endl;
+}
+
+void randomL(Matrix &L) {
+ size_t n = L.rowdim();
+
+ RDM.random(L);
+
+ for (size_t i = 0; i < n; i++) {
+ L.setEntry(i, i, Z.one);
+
+ for (size_t j = i+1; j < n; j++) {
+ L.setEntry(i, j, Z.zero);
+ }
+ }
+}
+
+void randomU(Matrix &U) {
+ size_t n = U.rowdim();
+
+ RDM.random(U);
+
+ for (size_t i = 0; i < n; i++) {
+ U.setEntry(i, i, Z.one);
+
+ for (size_t j = 0; j < i; j++) {
+ U.setEntry(i, j, Z.zero);
+ }
+ }
+}
+
+int main(int argc, char** argv)
+{
+ Matrix A(Z, 4, 4);
+
+ //RDM.random(A);
+ A.setEntry(0,0,Integer(2));
+ A.setEntry(1,1,Integer(6));
+ A.setEntry(2,2,Integer(12));
+ printMatrix(A);
+
+ Matrix L1(Z, 4, 4);
+ randomL(L1);
+
+ Matrix U1(Z, 4, 4);
+ randomU(U1);
+
+ Matrix L2(Z, 4, 4);
+ randomL(L2);
+
+ Matrix U2(Z, 4, 4);
+ randomU(U2);
+
+ Matrix B(Z, 4, 4);
+
+ MD.mul(B, U1, A);
+ MD.leftMulin(B, L1);
+ MD.rightMulin(B, U2);
+ MD.rightMulin(B, L2);
+
+ printMatrix(B);
+
+ ID.smithFormIn(B, Integer(2 * 6 * 12));
+ printMatrix(B);
+
+ return 0;
+}
+
+
diff --git a/examples/integer-mul.C b/examples/integer-mul.C
new file mode 100644
index 0000000..8abe2d9
--- /dev/null
+++ b/examples/integer-mul.C
@@ -0,0 +1,71 @@
+/*
+ * examples/integer-mul.C
+ *
+ * Copyright (C) 2002, 2005, 2010 G Villard, D. Saunders
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ * ========LICENCE========
+ */
+
+/** \file examples/integer-mul.C
+ * @example examples/integer-mul.C
+ * \author Gilles Villard
+ * \brief The LinBox arbitrary precision integer type illustrated.
+ * \ingroup examples
+ *
+ * The class `integer' is a wrapper of <a href=http://gmplib.org>GMP</a> integers.
+ */
+
+// ---------------------------------------------
+#include <iostream>
+#include <fstream>
+// ---------------------------------------------
+
+#include <linbox/linbox-config.h>
+
+// Use of Gmp based LinBox integers
+#include <linbox/integer.h>
+
+using namespace LinBox;
+using namespace std;
+
+// ---------------------------------------------
+
+/// no command line args. Prompts for two integers.
+int main()
+{
+
+ integer a,b;
+
+ cout << "1st integer > ";
+ cin >> a;
+ cout << "2nd integer > ";
+ cin >> b;
+
+ cout << "The product " << a*b << "\n";
+
+ return 0;
+}
+
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+
diff --git a/examples/invariant-factors.C b/examples/invariant-factors.C
new file mode 100644
index 0000000..2f182a1
--- /dev/null
+++ b/examples/invariant-factors.C
@@ -0,0 +1,137 @@
+/* linbox/algorithms/coppersmith-invariant-factors.h
+ * Copyright (C) 2015 Gavin Harrison
+ *
+ * Written by Gavin Harrison <gavin.har at gmail.com>
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ * ========LICENCE========
+ */
+
+#include "linbox/linbox-config.h"
+
+#include <iostream>
+#include <vector>
+
+#include "linbox/ring/modular.h"
+#include "linbox/matrix/sparse-matrix.h"
+#include "linbox/matrix/dense-matrix.h"
+#include "linbox/matrix/matrix-domain.h"
+#include "linbox/blackbox/transpose.h"
+#include "linbox/blackbox/compose.h"
+
+#include "linbox/algorithms/invariant-factors.h"
+
+using namespace LinBox;
+
+typedef Givaro::Modular<double> Field;
+typedef typename Field::Element Element;
+typedef SparseMatrix<Field, SparseMatrixFormat::CSR> SparseMat;
+
+typedef InvariantFactors<Field,SparseMat> FactorDomain;
+typedef typename FactorDomain::PolyDom PolyDom;
+typedef typename FactorDomain::PolyRing PolyRing;
+typedef DenseVector<PolyRing> FactorVector;
+
+int main(int argc, char** argv)
+{
+ int earlyTerm;
+ int p = 99991, b = 30, r = 3, t = 5;
+ std::string mFname = "jumat",oFname="";
+
+ static Argument args[] = {
+ { 'p', "-p P", "Set the field GF(p)", TYPE_INT, &p},
+ { 'e', "-e E", "Early term threshold", TYPE_INT, &earlyTerm},
+ { 'b', "-b B", "Blocking factor", TYPE_INT, &b},
+ { 't', "-t T", "First blocking factor", TYPE_INT, &t},
+ { 'r', "-r R", "R-th factor used as mod for iliopoulos", TYPE_INT, &r},
+ { 'm', "-m M", "Name of file for matrix M", TYPE_STR, &mFname},
+ { 'o', "-o O", "Name of file for output", TYPE_STR, &oFname},
+ END_OF_ARGUMENTS
+ };
+
+ parseArguments(argc,argv,args);
+
+ Field F(p);
+ SparseMat M(F);
+
+ {
+ std::ifstream iF(mFname);
+ M.read(iF);
+ M.finalize();
+ iF.close();
+ }
+
+ std::cout << "Finished reading, dimension " << M.rowdim() << "x" << M.coldim() << ", nnz " << M.size() << std::endl;
+
+ PolyDom PD(F,"x");
+ PolyRing R(PD);
+ FactorVector List1(R), List2(R), factorList(R);
+ FactorDomain CIF(F, R);
+
+#if 1
+ CIF.solve(factorList, M, b, t, r, earlyTerm);
+#else
+ // from solve in invariant-factors.h
+ // Compute first b1 factors
+ CIF.computeFactors(List1, M, t, earlyTerm);
+
+ std::cout << "Finished computing early factors" << std::endl;
+ {
+ for (int i = List1.size()-1; i >= 0; i--) {
+ std::cout << PD.degree(List1[i]) << ", ";
+ }
+ std::cout << std::endl;
+ }
+
+ // get r-th factor
+ PolyRing::Element d; R.assign(d, List1[t - r]);
+
+ // Compute factors mod r-th factor
+ CIF.computeFactors(List2, M, d, b, earlyTerm);
+
+ // Fill in zeros before r-th factor with r-th factor
+ for (int i = 0; i < b - r; i++) {
+ if (R.isZero(List2[i])) R.assign(List2[i], d);
+ }
+
+ // Fill in remaining factors with original values
+ factorList.resize(b);
+ for (int i = 0; i < r; i++)
+ factorList[i] = List1[t-1-i];
+ for (int i = r; i < b; i++)
+ factorList[i] = List2[b-1-i];
+#endif
+ std::cout << "Finished computing factors" << std::endl;
+ for (size_t i = 0; i<factorList.size(); i++)
+ std::cout << PD.degree(factorList[i]) << ", ";
+ std::cout << std::endl;
+
+ if (oFname.size() > 0)
+ {
+ std::ofstream out(oFname);
+ for (size_t i = 0; i<factorList.size(); i++) {
+ R.write(out,factorList[i]);
+ out << std::endl;
+ }
+ out.close();
+ }
+
+ return 0;
+}
+
+
diff --git a/examples/makefile.mpi b/examples/makefile.mpi
new file mode 100644
index 0000000..3baa418
--- /dev/null
+++ b/examples/makefile.mpi
@@ -0,0 +1,66 @@
+# Makefile for LinBox's examples/ directory
+
+###########################################
+# this section constructed at configure time (sets compiler, flags, header locations, library locations)
+
+# basic terms
+compiler=g++
+# MPICH
+# mpicompiler=mpicxx -D__LINBOX_HAVE_MPI
+# LAM/MPI
+mpicompiler=mpiCC -D__LINBOX_HAVE_MPI
+flags=-g -Wall -DLinBoxSrcOnly
+linboxincludes=-I..
+
+# package headers locations. The default is to look in /usr/include and /usr/local/include
+gmpincludes=
+blasincludes=
+ntlincludes=
+givaroincludes=
+
+# package library locations. Default is to look in /usr/lib and /usr/local/lib
+gmplibdir=
+blaslibdir=
+ntllibdir=
+givarolibdir=
+
+###########################################
+# Below this point the makefile is fixed.
+###########################################
+
+# add flags so linker can get the libfilename right
+gmplibs=$(gmplibdir) -lgmp -lgmpxx
+blaslibs=$(blaslibdir) -lcblas -llapack -latlas
+ntllibs=$(ntllibdir) -lntl
+givarolibs=$(givarolibdir) -lgivaro
+
+includes=-I. $(linboxincludes) $(gmpincludes) $(blasincludes) $(ntlincludes) $(givaroincludes)
+libs=$(gmplibs) $(blaslibs) $(ntllibs) $(givarolibs)
+
+###########################################
+# rules to make targets
+
+# generic rule for any test program
+%:%.C
+ $(compiler) $(flags) $*.C -o $* $(includes) $(libs)
+
+# particular rule for some program using different setup from the generic one
+test-rank: test-rank.C test-generic.h # dependence on linbox sources also wanted
+ g++ test-rank.C -o test-rank $(blasincludes) $(blaslibs)
+
+minpoly: minpoly.C ../linbox/solutions/methods.h ../linbox/solutions/minpoly.h ../linbox/algorithms/cra-domain.h
+ $(mpicompiler) $(flags) minpoly.C -o minpoly $(includes) $(libs)
+
+mpidet: mpidet.C ../linbox/solutions/methods.h ../linbox/solutions/det.h ../linbox/algorithms/cra-domain.h
+ $(mpicompiler) $(flags) mpidet.C -o mpidet $(includes) $(libs)
+
+mpidet2: mpidet bigmat
+ ./bigmat 200 > file
+ mpiexec C ./mpidet file
+ rm file bigmat
+
+run: minpoly file
+ mpirun -np 1 ./minpoly file
+
+clean:
+ rm mpidet minpoly test-det test-bitonic-sort test-rank a.out *.o
diff --git a/examples/map-sparse-test.C b/examples/map-sparse-test.C
new file mode 100644
index 0000000..9bdf017
--- /dev/null
+++ b/examples/map-sparse-test.C
@@ -0,0 +1,55 @@
+#include "examples/map-sparse.h"
+#include <tests/test-common.h> //bb: is this supposed to be installed ?
+
+using namespace LinBox;
+
+// why this test here ?
+int main(int argc, char* argv[])
+{
+ typedef Givaro::Modular<double> Field;
+ typedef Field::Element Element;
+ int q=65537;
+ int n=10;
+
+ static Argument args[] = {
+ { 'n', "-n N", "Set dimension of test matrices to NxN.", TYPE_INT, &n },
+ { 'q', "-q Q", "Operate over the \"field\" GF(Q) [1].", TYPE_INTEGER, &q },
+ //{ 's', "-s S", "Sparse matrices with density S.", TYPE_DOUBLE, &sparsity },
+ END_OF_ARGUMENTS
+ };
+
+ parseArguments (argc, argv, args);
+
+ srand ((unsigned)time (NULL));
+ Field F (q);
+ MapSparse<Field> ms(F,n,n);
+ Element d;
+ for (int i=0;i<n;++i) {
+ F.assign(d,F.one);
+ ms.setEntry(i,i,d);
+ F.init(d,2);
+ ms.setEntry(n-1-i,i,d);
+ }
+ F.init(d,2);
+ ms.addCol(d,1,3);
+ F.assign(d,F.one);
+ ms.addCol(d,3,1);
+ F.init(d,2);
+ ms.timesRow(d,3);
+ F.init(d,3);
+ ms.timesCol(d,1);
+ ms.swapRows(4,5);
+ ms.swapCols(1,8);
+ if (n <= 30) ms.print(std::cerr);
+ std::cerr << ms.nnz() << std::endl;
+
+ ms.randomSim(5*n);
+ if (n <= 30) ms.print(std::cerr);
+ std::cerr << ms.nnz() << std::endl;
+ ms.randomEquiv(n*n/2);
+ if (n <= 30) ms.print(std::cerr);
+ std::cerr << ms.nnz() << std::endl;
+
+ ms.write(std::cerr);
+ return 0;
+}
diff --git a/examples/map-sparse.h b/examples/map-sparse.h
new file mode 100644
index 0000000..7ab4c46
--- /dev/null
+++ b/examples/map-sparse.h
@@ -0,0 +1,200 @@
+/* Copyright (C) 2013 LinBox
+ * Written by AJS <stachnik at udel.edu>
+ *
+ *
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ * ========LICENCE========
+ */
+
+/*! @file examples/map-sparse.h
+ * @ingroup examples
+ * @brief
+ */
+
+#ifndef __LINBOX_MAP_SPARSE_H
+#define __LINBOX_MAP_SPARSE_H
+
+#include <stdlib.h>
+#include <fstream>
+#include <map>
+#include <iostream>
+
+#include <linbox/linbox-config.h>
+#include <linbox/util/debug.h>
+#include <linbox/util/field-axpy.h>
+#include <linbox/blackbox/blackbox-interface.h>
+#include <linbox/field/hom.h>
+
+
+namespace LinBox
+{
+
+template<class Field_>
+class MapSparseIF {
+public:
+ typedef Field_ Field;
+ typedef typename Field::Element Element;
+ typedef size_t Index;
+
+ virtual ~MapSparseIF() {};
+
+ virtual void setEntry(Index i, Index j, const Element& e) =0;
+
+ virtual const Element& getEntry(Index i, Index j) const =0;
+
+protected:
+ typedef std::map<Index,Element> VectorType;
+ typedef typename VectorType::iterator VectorIt;
+ typedef typename VectorType::const_iterator VectorConstIt;
+ typedef std::map<Index,VectorType> MapType;
+ typedef typename MapType::iterator MapIt;
+ typedef typename MapType::const_iterator MapConstIt;
+
+
+};
+
+template<class Field_>
+class MapSparse : public MapSparseIF<Field_> {
+public:
+ typedef Field_ Field;
+ typedef typename Field::Element Element;
+ typedef size_t Index;
+ typedef std::map<Index,Element> VectorType;
+ typedef typename VectorType::iterator VectorIt;
+ typedef typename VectorType::const_iterator VectorConstIt;
+ typedef std::map<Index,VectorType> MapType;
+ typedef typename MapType::iterator MapIt;
+ typedef typename MapType::const_iterator MapConstIt;
+
+ MapSparse();
+
+ MapSparse(const Field& F, Index r, Index c);
+
+ MapSparse(const MapSparse& M);
+
+ void init(const Field& F, Index r, Index c);
+
+ void shape(Index r, Index c);
+
+ MapSparse& operator=(const MapSparse& M);
+
+ ~MapSparse();
+
+ Index rowdim() const;
+
+ Index coldim() const;
+
+ const Field& field() const;
+
+ void setEntry(Index i, Index j, const Element& e);
+
+ const Element& getEntry(Index i, Index j) const;
+
+ bool verify();
+
+ //forall r: A_{i,r}<-A_{i,r}+k*A_{j,r}
+ void addRow(const Element& k, Index i, Index j);
+
+ //forall r: A_{r,i}<-A_{r,i}+k*A_{r,j}
+ void addCol(const Element& k, Index i, Index j);
+
+ //forall r: A_{i,r}<-k*A_{i,r}
+ void timesRow(const Element& k, Index i);
+
+ //forall r: A_{r,j}<-k*A_{r,j}
+ void timesCol(const Element& k, Index j);
+
+ void swapRows(Index i, Index j);
+
+ void swapCols(Index i, Index j);
+
+ void scaleMat(const Element& k);
+
+ void transpose();
+
+ Index nnz() const;
+
+ // A -> A' = SAS^{-1}, and A' has about nnz nonzero entries.
+ void randomSim(Index nnz, int seed = 0);
+
+ // A -> A' = UAV, with U and V nonsingular, and A' has about nnz nonzero entries.
+ void randomEquiv(Index nnz, int seed = 0);
+
+ bool areEqual(MapSparse<Field_> rhs) const;
+
+ std::istream& read(std::istream& in);
+
+ std::ostream& print(std::ostream& out) const;
+
+ std::ostream& write(std::ostream& out) const;
+
+ template<class Matrix>
+ void copy(Matrix& mat) const;
+
+ template<class Matrix>
+ void copyFrom(Matrix& mat);
+
+ template<class Vector>
+ void toVector(Vector& vec) const;
+
+ template<class Vector>
+ void fromVector(const Vector& vec, Index r, Index c);
+
+ static void generateCompanion(MapSparse<Field>& mat,std::vector<Element>& coeffs);
+
+ static void generateDenseRandMat(MapSparse<Field_>& mat, int q);
+
+ static void generateRandMat(MapSparse<Field>& mat, int nnz, int q);
+
+ static void generateScaledIdent(MapSparse<Field>& mat, int alpha);
+
+ static void generateSparseNonSingular(MapSparse<Field>& mat, int approxNNZ, int seed=0);
+
+protected:
+
+ static int randRange(int start, int end);
+
+ MatrixDomain<Field> MD_;
+
+ MapType rowMap_;
+
+ MapType colMap_;
+
+ Index numCols_;
+
+ Index numRows_;
+
+ Index nnz_;
+
+ Element zero_;
+};
+
+}
+
+#include <examples/map-sparse.inl>
+
+#endif // __LINBOX_MAP_SPARSE_H
+
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/examples/map-sparse.inl b/examples/map-sparse.inl
new file mode 100644
index 0000000..2500380
--- /dev/null
+++ b/examples/map-sparse.inl
@@ -0,0 +1,594 @@
+/* Copyright (C) 2013 LinBox
+ * Written by AJS <stachnik at udel.edu>
+ *
+ *
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ * ========LICENCE========
+ */
+
+/*! @file examples/map-sparse.inl
+ * @ingroup examples
+ * @brief
+ */
+
+#ifndef __LINBOX_MAP_SPARSE_INL
+#define __LINBOX_MAP_SPARSE_INL
+
+#include <stdlib.h>
+#include <fstream>
+#include <sstream>
+#include <set>
+#include <utility>
+#include <linbox/util/matrix-stream.h>
+
+namespace LinBox
+{
+
+template<class Field_>
+MapSparse<Field_>::MapSparse() : MD_(Field_()),numCols_(0), numRows_(0), nnz_(0) {}
+
+template<class Field_>
+MapSparse<Field_>::MapSparse(const Field& F, Index r, Index c):
+ MD_(F), numCols_(c), numRows_(r), nnz_(0) {F.assign(zero_,F.zero);}
+
+template<class Field_>
+void MapSparse<Field_>::init(const Field& F, Index r, Index c) {
+ MD_=F;
+ F.assign(zero_,F.zero);
+ shape(r,c);
+}
+
+template<class Field_>
+void MapSparse<Field_>::shape(Index r, Index c) {
+ rowMap_.clear();
+ colMap_.clear();
+ numRows_=r;
+ numCols_=c;
+ nnz_=0;
+}
+
+template<class Field_>
+template<class Vector>
+void MapSparse<Field_>::fromVector(const Vector& vec, Index r, Index c) {
+ shape(r,c);
+ if (numCols_==1) {
+ for (Index i=0;i<numRows_;++i) {
+ setEntry(i,0,vec[i]);
+ }
+ } else {
+ for (Index j=0;j<numCols_;++j) {
+ setEntry(0,j,vec[j]);
+ }
+ }
+}
+
+template<class Field_>
+MapSparse<Field_>::MapSparse(const MapSparse& M):
+ MD_(M.field()),
+ rowMap_(M.rowMap_), colMap_(M.colMap_),
+ numCols_(M.numCols_), numRows_(M.numRows_),
+ nnz_(M.nnz_), zero_(M.zero_) {}
+
+template<class Field_>
+MapSparse<Field_>& MapSparse<Field_>::operator=(const MapSparse<Field_>& rhs)
+{
+ if (rhs==this) return;
+ MD_.init(rhs.MD_);
+ numCols_=rhs.numCols_;
+ numRows_=rhs.numRows_;
+ rowMap_=rhs.rowMap_;
+ colMap_=rhs.colMap_;
+ nnz_=rhs.nnz_;
+ zero_=rhs.zero_;
+
+ return *this;
+}
+
+template<class Field_>
+MapSparse<Field_>::~MapSparse() {}
+
+template<class Field_>
+const Field_& MapSparse<Field_>::field() const
+{
+ return MD_.field();
+}
+
+template<class Field_>
+bool MapSparse<Field_>::verify()
+{
+ for (int i=0;i<rowdim();++i) {
+ for (int j=0;j<coldim();++j) {
+ Element d=zero_;
+ MapConstIt row=rowMap_.find(i);
+ if (row != rowMap_.end()) {
+ VectorConstIt entry=(row->second).find(j);
+ if (entry != (row->second.end())) {
+ d=entry->second;
+ }
+ }
+ Element e=zero_;
+ MapConstIt col=colMap_.find(j);
+ if (col != colMap_.end()) {
+ VectorConstIt entry=(col->second).find(i);
+ if (entry != (col->second.end())) {
+ e=entry->second;
+ }
+ }
+ if (d!=e) {
+ return false;
+ }
+ }
+ }
+ return true;
+}
+
+template<class Field_>
+void MapSparse<Field_>::setEntry(Index i, Index j, const Element& e)
+{
+ VectorIt it=rowMap_[i].find(j);
+ if (it != rowMap_[i].end()) {
+ --nnz_;
+ rowMap_[i].erase(it);
+ VectorIt colIt=colMap_[j].find(i);
+ colMap_[j].erase(colIt);
+ }
+
+ if (!field().isZero(e)) {
+ ++nnz_;
+ rowMap_[i][j]=e;
+ colMap_[j][i]=e;
+ }
+}
+
+template<class Field_> const typename MapSparse<Field_>::Element&
+MapSparse<Field_>::getEntry(Index i, Index j) const
+{
+ MapConstIt row=rowMap_.find(i);
+ if (row != rowMap_.end()) {
+ VectorConstIt entry=(row->second).find(j);
+ if (entry != (row->second.end())) {
+ return (entry->second);
+ }
+ }
+ return zero_;
+}
+
+//forall r: A_{i,r}<-A_{i,r}+k*A_{j,r}
+template<class Field_>
+void MapSparse<Field_>::addRow(const Element& k, Index i, Index j)
+{
+ MapIt rowJ=rowMap_.find(j);
+ if (rowJ != rowMap_.end()) {
+ for (VectorIt it=rowJ->second.begin();it!=rowJ->second.end();++it) {
+ Index col=it->first;
+ Element d=getEntry(i,col);
+ field().axpyin(d,k,it->second);
+ setEntry(i,col,d);
+ }
+ }
+}
+
+//forall r: A_{r,i}<-A_{r,i}+k*A_{r,j}
+template<class Field_>
+void MapSparse<Field_>::addCol(const Element& k, Index i, Index j)
+{
+ MapIt colJ=colMap_.find(j);
+ if (colJ != colMap_.end()) {
+ for (VectorIt it=colJ->second.begin();it!=colJ->second.end();++it) {
+ Index row=it->first;
+ Element d = getEntry(row,i);
+ field().axpyin(d,k,it->second);
+ setEntry(row,i,d);
+ }
+ }
+}
+
+//forall r: A_{i,r}<-k*A_{i,r}
+template<class Field_>
+void MapSparse<Field_>::timesRow(const Element& k, Index i)
+{
+ linbox_check(!(field().isZero(k)));
+
+ MapIt row=rowMap_.find(i);
+ if (row != rowMap_.end()) {
+ for (VectorIt it=row->second.begin();it!=row->second.end();++it) {
+ Index col=it->first;
+ field().mulin(rowMap_[i][col],k);
+ field().mulin(colMap_[col][i],k);
+ }
+ }
+}
+
+//forall r: A_{r,j}<-k*A_{r,j}
+template<class Field_>
+void MapSparse<Field_>::timesCol(const Element& k, Index j)
+{
+ linbox_check(!(field().isZero(k)));
+
+ MapIt col=colMap_.find(j);
+ if (col != colMap_.end()) {
+ for (VectorIt it=col->second.begin();it!=col->second.end();++it) {
+ Index row=it->first;
+ field().mulin(rowMap_[row][j],k);
+ field().mulin(colMap_[j][row],k);
+ }
+ }
+}
+
+template<class Field_>
+void MapSparse<Field_>::swapRows(Index i, Index j)
+{
+ VectorType oldRowI=rowMap_[i];
+ VectorType oldRowJ=rowMap_[j];
+
+ rowMap_[i].clear();
+ rowMap_[j].clear();
+
+ for (VectorIt it=oldRowI.begin();it!=oldRowI.end();++it) {
+ Index col=it->first;
+ colMap_[col].erase(colMap_[col].find(i));
+ }
+
+ for (VectorIt it=oldRowJ.begin();it!=oldRowJ.end();++it) {
+ Index col=it->first;
+ colMap_[col].erase(colMap_[col].find(j));
+ }
+
+ for (VectorIt it=oldRowI.begin();it!=oldRowI.end();++it) {
+ Index col=it->first;
+ rowMap_[j][col]=oldRowI[col];
+ colMap_[col][j]=oldRowI[col];
+ }
+
+ for (VectorIt it=oldRowJ.begin();it!=oldRowJ.end();++it) {
+ Index col=it->first;
+ rowMap_[i][col]=oldRowJ[col];
+ colMap_[col][i]=oldRowJ[col];
+ }
+}
+
+template<class Field_>
+void MapSparse<Field_>::swapCols(Index i, Index j)
+{
+ VectorType oldColI=colMap_[i];
+ VectorType oldColJ=colMap_[j];
+
+ colMap_[i].clear();
+ colMap_[j].clear();
+
+ for (VectorIt it=oldColI.begin();it!=oldColI.end();++it) {
+ Index row=it->first;
+ rowMap_[row].erase(rowMap_[row].find(i));
+ }
+
+ for (VectorIt it=oldColJ.begin();it!=oldColJ.end();++it) {
+ Index row=it->first;
+ rowMap_[row].erase(rowMap_[row].find(j));
+ }
+
+ for (VectorIt it=oldColI.begin();it!=oldColI.end();++it) {
+ Index row=it->first;
+ colMap_[j][row]=oldColI[row];
+ rowMap_[row][j]=oldColI[row];
+ }
+
+ for (VectorIt it=oldColJ.begin();it!=oldColJ.end();++it) {
+ Index row=it->first;
+ colMap_[i][row]=oldColJ[row];
+ rowMap_[row][i]=oldColJ[row];
+ }
+}
+
+template<class Field_>
+typename MapSparse<Field_>::Index MapSparse<Field_>::nnz() const
+{
+ return nnz_;
+}
+
+// A -> A' = SAS^{-1}, and A' has about nnz nonzero entries.
+template<class Field_>
+void MapSparse<Field_>::randomSim(Index nz, int seed)
+{ typename Field::Element a;
+ Index i,j;
+ MersenneTwister ri;
+ typename Field::RandIter r(field(),0, seed);
+ //if (seed != 0) { ri.setSeed(seed); r.setSeed(seed); }
+ if (seed != 0)
+ { ri.setSeed(seed);
+ // ridiculous constructor only seeding!
+ typename Field::RandIter s(field(), 0, seed);
+ r = s;
+ }
+ while (nnz() < nz)
+ { field().nonzerorandom(r,a);
+ i = ri.randomIntRange(0, rowdim()); j = ri.randomIntRange(0, coldim());
+ addCol(a, i, j);
+ //std::cout << nnz() << std::endl;
+ field().negin(a);
+ addRow(a, i, j);
+ }
+}
+
+// A -> A' = UAV, with U and V nonsingular, and A' has about nnz nonzero entries.
+template<class Field_>
+void MapSparse<Field_>::randomEquiv(Index nz, int seed)
+{ typename Field::Element a;
+ Index i,j;
+ MersenneTwister ri;
+ typename Field::RandIter r(field(),0,seed);
+ if (seed != 0)
+ { ri.setSeed(seed);
+ // ridiculous seeding!
+ typename Field::RandIter s(field(), 0, seed);
+ r = s;
+ }
+ bool flip = true;
+ int count=0;
+ while (nnz() < nz)
+ { r.nonzerorandom(a);
+ i = ri.randomIntRange(0, rowdim()); j = ri.randomIntRange(0, coldim());
+ if (i!=j){
+ if (flip) addCol(a, i, j);
+ else addRow(a, i, j);
+ flip = not flip;
+ }
+ ++count;
+ }
+}
+
+template<class Field_>
+std::ostream& MapSparse<Field_>::print(std::ostream& out) const
+{
+ for (Index i=0;i<numRows_;++i) {
+ for (Index j=0;j<numCols_;++j) {
+ field().write(out,getEntry(i,j));
+ if (j != (numCols_-1)) {
+ out << " ";
+ }
+ }
+ out << std::endl;
+ }
+ return out;
+}
+
+template<class Field_>
+std::ostream& MapSparse<Field_>::write(std::ostream& out) const
+{
+ out << "%%MatrixMarket matrix coordinate integer general" << std::endl;
+ out << "% written from a LinBox MapSparse" << std::endl;
+ out << numRows_ << " " << numCols_ << " " << nnz_ << std::endl;
+ //for (Index i = 0; i < numRows_; ++i)
+ for (MapConstIt p = rowMap_.begin(); p != rowMap_.end(); ++p)
+ for (VectorConstIt rp = p->second.begin(); rp != p->second.end(); ++rp)
+ field().write(out << 1+p->first << " " << 1+rp->first << " ", rp->second) << std::endl;
+ out << std::endl;
+ return out;
+}
+
+template<class Field_>
+std::istream& MapSparse<Field_>::read(std::istream& in) {
+ Index r,c;
+ Element d;
+ field().init(d);
+ MatrixStream<Field> ms(field(),in);
+ ms.getDimensions(r,c);
+ shape(r,c);
+ while (ms.nextTriple(r,c,d)) setEntry(r,c,d);
+ return in;
+}
+
+template<class Field_>
+typename MapSparse<Field_>::Index MapSparse<Field_>::rowdim() const
+{
+ return numRows_;
+}
+
+template<class Field_>
+typename MapSparse<Field_>::Index MapSparse<Field_>::coldim() const
+{
+ return numCols_;
+}
+
+template<class Field_>
+void MapSparse<Field_>::transpose()
+{
+ rowMap_.swap(colMap_);
+ int temp=numCols_;numCols_=numRows_;numRows_=temp;
+}
+
+template<class Field_>
+template<class Matrix>
+void MapSparse<Field_>::copy(Matrix& mat) const
+{
+ std::stringstream ss;
+ write(ss);
+ mat.read(ss);
+ mat.finalize();
+}
+
+template<class Field_>
+template<class Matrix>
+void MapSparse<Field_>::copyFrom(Matrix& mat)
+{
+ std::stringstream ss;
+ mat.write(ss);
+ read(ss);
+}
+
+template<class Field_>
+template<class Vector>
+void MapSparse<Field_>::toVector(Vector& vec) const
+{
+ if (numCols_ == 1) {
+ for (Index i=0;i<numRows_;++i) {
+ vec[i]=getEntry(i,0);
+ }
+ } else {
+ for (Index j=0;j<numCols_;++j) {
+ vec[j]=getEntry(0,j);
+ }
+ }
+}
+
+template<class Field_>
+void MapSparse<Field_>::scaleMat(const Element& k)
+{
+ for (size_t i=0;i<numRows_;++i) {
+ timesRow(k,i);
+ }
+}
+
+template<class Field_>
+bool MapSparse<Field_>::areEqual(MapSparse<Field_> rhs) const
+{
+ if (rhs.numCols_ != numCols_) {
+ return false;
+ }
+ if (rhs.numRows_ != numRows_) {
+ return false;
+ }
+ if (nnz_ != rhs.nnz_) {
+ return false;
+ }
+
+ for (MapConstIt rowIt=rowMap_.begin();rowIt!=rowMap_.end();++rowIt) {
+ for (VectorConstIt eltIt=rowIt->second.begin();eltIt!=rowIt->second.end();++eltIt) {
+ if (eltIt->second != rhs.getEntry(rowIt->first,eltIt->first)) {
+ return false;
+ }
+ }
+ }
+ return true;
+}
+
+template<class Field>
+void MapSparse<Field>::generateDenseRandMat(MapSparse<Field>& mat, int q)
+{
+ typedef typename Field::Element Element;
+
+ size_t m=mat.rowdim(),n=mat.coldim();
+ Element d;
+
+ for (size_t i=0;i<m;++i) {
+ for (size_t j=0;j<n;++j) {
+ mat.field().init(d,randRange(0,q));
+ mat.setEntry(i,j,d);
+ }
+ }
+}
+
+template<class Field>
+void MapSparse<Field>::generateRandMat(MapSparse<Field>& mat, int nnz, int q)
+{
+ typedef typename Field::Element Element;
+
+ size_t m=mat.rowdim(),n=mat.coldim();
+ Element d;
+
+ typedef std::pair<size_t,size_t> CoordPair;
+ typedef std::set<CoordPair> PairSet;
+ PairSet pairs;
+
+ for(int i = 0; i < (int)nnz; ++i) {
+ size_t row,col;
+ do {
+ row = randRange(0,(int)m);
+ col = randRange(0,(int)n);
+ } while (pairs.count(CoordPair(row,col))!=0);
+
+ mat.field().init(d, randRange(1,q));
+ mat.setEntry(row,col,d);
+ pairs.insert(CoordPair(row,col));
+ }
+}
+
+template<class Field>
+void MapSparse<Field>::generateScaledIdent(MapSparse<Field>& mat, int alpha)
+{
+ typedef typename Field::Element Element;
+ size_t m=mat.rowdim(),n=mat.coldim();
+ size_t minDim=(m<n)?m:n;
+ Element d;
+ mat.field().init(d,alpha);
+
+ for (size_t i=0;i<minDim;++i) {
+ mat.setEntry(i,i,d);
+ }
+}
+
+template<class Field>
+void MapSparse<Field>::generateSparseNonSingular(MapSparse<Field>& mat, int approxNNZ, int seed)
+{
+ typedef typename Field::Element Element;
+ int n=mat.rowdim();
+ linbox_check(mat.rowdim()==mat.coldim());
+
+ typename Field::RandIter r(mat.field(),0,seed);
+
+ Element d;
+
+ for (int i=0;i<n;++i) {
+ r.nonzerorandom(d);
+ mat.setEntry(i,i,d);
+ }
+
+ mat.randomEquiv(approxNNZ,seed);
+}
+
+template<class Field>
+void MapSparse<Field>::generateCompanion(MapSparse<Field>& mat,std::vector<typename Field::Element>& coeffs)
+{
+ typedef typename Field::Element Element;
+ int n=mat.rowdim();
+ linbox_check(mat.rowdim()==mat.coldim());
+
+ typename Field::RandIter r(mat.field());
+
+ Element d;
+ mat.field().init(d,1);
+ for (int i=1;i<n;++i) {
+ mat.setEntry(i,i-1,d);
+ }
+ for (int i=0;i<n;++i) {
+ mat.setEntry(i,n-1,coeffs[i]);
+ }
+}
+
+template<class Field>
+int MapSparse<Field>::randRange(int start, int end)
+{
+ double rval = rand();
+ static const double NORMALIZING_CONSTANT = 1.0/(1.0+RAND_MAX);
+ double normedRVal = rval*NORMALIZING_CONSTANT;
+ double rangeSize = end-start;
+ int offset = (int)(rangeSize*normedRVal);
+ return start+offset;
+}
+
+}
+
+#endif // __LINBOX_MAP_SPARSE_INL
+
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/examples/minpoly.C b/examples/minpoly.C
index 8505948..7893e1b 100644
--- a/examples/minpoly.C
+++ b/examples/minpoly.C
@@ -27,21 +27,23 @@
\brief Minimal polynomial of a sparse matrix.
\ingroup examples
*/
+#include <linbox/linbox-config.h>
#include <iostream>
+//! @bug this should be elsewhere
template <class Field, class Polynomial>
void printPolynomial (const Field &F, const Polynomial &v)
{
for (int i = (int)v.size () ; i-- ; ) {
- F.write (std::cout, v[i]);
+ F.write (std::cout, v[(size_t)i]);
if (i > 0)
std::cout << " x^" << i << " + ";
}
std::cout << std::endl;
}
-#include "linbox/field/modular.h"
-#include "linbox/blackbox/sparse.h"
-#include "linbox/solutions/minpoly.h"
+#include <linbox/ring/modular.h>
+#include <linbox/matrix/sparse-matrix.h>
+#include <linbox/solutions/minpoly.h>
using namespace LinBox;
using namespace std;
@@ -75,14 +77,21 @@ int main (int argc, char **argv)
M.communicatorp(&C);
#endif
- PID_integer ZZ;
- SparseMatrix<PID_integer> A (ZZ);
+ Givaro::ZRing<Integer> ZZ;
+ SparseMatrix<Givaro::ZRing<Integer>> A (ZZ);
A.read (input);
+ /*
+ typedef SparseMatrix<Givaro::ZRing<Integer>> SpMat;
+ SpMat B (ZZ);
+ B.read (input);
+ Transpose<SpMat> BT(B);
+ Compose<SpMat, Transpose<SpMat> > A(B,BT);
+ */
if(process == 0)
cout << "A is " << A.rowdim() << " by " << A.coldim() << endl;
- vector<PID_integer::Element> m_A;
+ DenseVector<Givaro::ZRing<Integer> > m_A(ZZ);
minpoly (m_A, A, M);
if(process == 0){
@@ -99,14 +108,14 @@ int main (int argc, char **argv)
}
else{
- typedef Modular<double> Field;
+ typedef Givaro::Modular<double> Field;
double q = atof(argv[2]);
Field F(q);
SparseMatrix<Field> B (F);
B.read (input);
cout << "B is " << B.rowdim() << " by " << B.coldim() << endl;
- vector<Field::Element> m_B;
+ DenseVector<Field> m_B(F);
minpoly (m_B, B);
cout << "Minimal Polynomial is ";
@@ -121,11 +130,10 @@ int main (int argc, char **argv)
return 0;
}
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
// Local Variables:
// mode: C++
// tab-width: 8
// indent-tabs-mode: nil
// c-basic-offset: 8
// End:
-
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/examples/mpidet.C b/examples/mpidet.C
new file mode 100644
index 0000000..27a4bbf
--- /dev/null
+++ b/examples/mpidet.C
@@ -0,0 +1,101 @@
+
+/*
+ * examples/mpidet.C
+ *
+ * Copyright (C) 2006, 2010 B Youse, D Saunders
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ * ========LICENCE========
+ */
+
+/**\file examples/mpidet.C
+ * @example examples/mpidet.C
+ \brief Determinant of sparse matrix over Z or Zp.
+ \ingroup examples
+ */
+
+#include <iostream>
+#include <string>
+
+#include <linbox/ring/modular.h>
+#include <linbox/matrix/sparse-matrix.h>
+#include <linbox/solutions/det.h>
+#include <linbox/util/matrix-stream.h>
+
+using namespace LinBox;
+using namespace std;
+
+int main (int argc, char **argv)
+{
+#ifdef __LINBOX_HAVE_MPI
+ if (argc < 2) {
+ cerr << "Usage: det <matrix-file-in-supported-format>" << endl;
+ return -1;
+ }
+ // ex: ./det [matrix-file]
+ else{
+ // For a small integer matrix test, do "make mpidet2 -f makefile.mpi"
+
+ // set up parallel code object
+ Communicator *Cptr = NULL;
+ Cptr = new Communicator(&argc, &argv);
+
+ typedef Givaro::ZRing<Integer> Integers;
+ Integers ZZ;
+
+ ifstream input (argv[1]);
+ if (!input)
+ { cerr << "Error opening matrix file " << argv[1] << endl;
+ return -1;
+ }
+
+ SparseMatrix<Integers>A(ZZ);
+ A.read(input);
+ if(!Cptr->rank()){
+ cout << "A is " << A.rowdim() << " by " << A.coldim() << endl;
+ cout << "Beginning parallel computation with " << Cptr->size()
+ << " processes." << endl;
+ }
+
+ Integers::Element det_A;
+
+ // call parallel det with cra
+ cra_det(det_A, A, RingCategories::IntegerTag(), Method::Hybrid(*Cptr), Cptr);
+
+ // if parent process, report the determinant
+ if(!Cptr->rank()){
+ cout << "Determinant is ";
+ ZZ.write(cout, det_A) << endl;
+ }
+ // tie up parallel loose ends if necessary
+ MPI_Finalize();
+ }
+ return 0;
+#else
+ cerr << "Compile with -D__LINBOX_HAVE_MPI" << endl;
+ return -1 ;
+#endif
+}
+
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+
diff --git a/examples/nullspacebasis.C b/examples/nullspacebasis.C
new file mode 100644
index 0000000..1b99753
--- /dev/null
+++ b/examples/nullspacebasis.C
@@ -0,0 +1,68 @@
+/*
+ * examples/nullspacebasis.C
+ *
+ * Copyright (C) 2014 J-G. Dumas
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ * ========LICENCE========
+ */
+
+/**\file examples/nullspacebasis.C
+ * @example examples/nullspacebasis.C
+ \brief NullSpace of sparse matrix over GFq.
+ \brief nullspace is allocated m \times n.
+ \ingroup examples
+ */
+
+#include <iostream>
+#include "linbox/matrix/dense-matrix.h"
+#include <givaro/gfq.h>
+#include "linbox/algorithms/gauss.h"
+
+using namespace LinBox;
+
+int main (int argc, char **argv)
+{
+
+ if ( argc < 2 || argc > 4) {
+ std::cerr << "Usage to get a random null space basis over GF(p,k): <matrix-file-in-SMS-format> p [k]" << std::endl;
+ return -1;
+ }
+
+ std::ifstream input (argv[1]);
+ if (!input) { std::cerr << "Error opening matrix file " << argv[1] << std::endl; return -1; }
+
+ //typedef Givaro::Modular<int> Field;
+ typedef Givaro::GFqDom<int64_t> Field;
+ Field F(atoi(argv[2]),argc>3?atoi(argv[3]):1);
+ SparseMatrix<Field, SparseMatrixFormat::SparseSeq > B (F);
+ B.read (input);
+ std::cout << "B is " << B.rowdim() << " by " << B.coldim() << std::endl;
+
+ DenseMatrix<Field> NullSpace(F,B.coldim(),B.coldim());
+ GaussDomain<Field> GD(F);
+
+ GD.nullspacebasisin(NullSpace, B);
+
+ NullSpace.write( std::cerr << "X:=", Tag::FileFormat::Maple ) << ';' << std::endl;
+
+ std::cerr << "NullsSpace dimensions:" << NullSpace.rowdim() << 'x' << NullSpace.coldim() << std::endl;
+
+ return 0;
+
+
+}
diff --git a/examples/nullspacebasis_rank.C b/examples/nullspacebasis_rank.C
new file mode 100644
index 0000000..e78c1dd
--- /dev/null
+++ b/examples/nullspacebasis_rank.C
@@ -0,0 +1,91 @@
+/*
+ * examples/nullspacebasis_rank.C
+ *
+ * Copyright (C) 2014 J-G. Dumas
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ * ========LICENCE========
+ */
+
+/**\file examples/nullspacebasis_rank.C
+ * @example examples/nullspacebasis_rank.C
+ \brief NullSpace of sparse matrix over GFq.
+ \brief nullspace is allocated rank \times n.
+ \ingroup examples
+ */
+
+#include <givaro/gfq.h>
+#include <iostream>
+#include "linbox/matrix/dense-matrix.h"
+#include "linbox/algorithms/gauss.h"
+
+using namespace LinBox;
+
+int main (int argc, char **argv)
+{
+ if ( argc < 2 || argc > 4) {
+ std::cerr << "Usage to get a random null space basis over GF(p,k): <matrix-file-in-SMS-format> p [k]" << std::endl;
+ return -1;
+ }
+
+ std::ifstream input (argv[1]);
+ if (!input) {
+ std::cerr << "Error opening matrix file " << argv[1] << std::endl;
+ return -1;
+ }
+ int pVal = atoi(argv[2]);
+
+
+ //typedef Givaro::Modular<int> Field;
+ typedef Givaro::GFqDom<int64_t> Field;
+ Field F(pVal, argc>3?atoi(argv[3]):1);
+ SparseMatrix<Field, SparseMatrixFormat::SparseSeq > A (F);
+ A.read (input);
+ std::cout << "A is " << A.rowdim() << " by " << A.coldim() << std::endl;
+
+ GaussDomain<Field> GD(F);
+
+ typename Field::Element Det;
+ unsigned long Rank;
+ size_t Ni(A.rowdim()),Nj(A.coldim());
+
+ Permutation<Field> P((int)Nj,F);
+
+ GD.InPlaceLinearPivoting(Rank, Det, A, P, Ni, Nj );
+
+ for(size_t i=0; i< Ni; ++i) {
+ if (A[i].size() == 0) {
+ size_t j(i);
+ if (nextnonzero(j,Ni,A)) {
+ A[i] = A[j];
+ A[j].resize(0);
+ }
+ else {
+ break;
+ }
+ }
+ }
+ size_t nullity = A.coldim()-Rank;
+ DenseMatrix<Field> NullSpace(F,A.coldim(),nullity);
+ GD.nullspacebasis(NullSpace, Rank, A, P);
+
+ NullSpace.write( std::cerr << "X:=", Tag::FileFormat::Maple ) << ';' << std::endl;
+
+ std::cerr << "NullsSpace dimensions:" << NullSpace.rowdim() << 'x' << NullSpace.coldim() << std::endl;
+
+ return 0;
+}
diff --git a/examples/omp_block_rank.C b/examples/omp_block_rank.C
new file mode 100644
index 0000000..9c3939d
--- /dev/null
+++ b/examples/omp_block_rank.C
@@ -0,0 +1,574 @@
+/*
+ * examples/omp_block_rank.C
+ *
+ * Copyright (C) 2010 J-G Dumas
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ * ========LICENCE========
+
+ * This file is part of LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation, either version 2 of
+ * the License, or (at your option) any later version.
+ *
+ * LinBox 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 Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with LinBox. If not, see
+ * <http://www.gnu.org/licenses/>.
+ */
+
+/*! @file examples/omp_block_rank.C
+ * @example examples/omp_block_rank.C
+ * @ingroup examples
+ * @brief Block Wiedemann Rank with OpenMP
+ */
+
+#include <linbox/linbox-config.h>
+
+
+#include <iostream>
+#include <fstream>
+#include <omp.h>
+
+#define __GIVARO_USE_OPENMP
+
+#include <givaro/givtimer.h>
+#include <givaro/givpoly1crt.h>
+#include <linbox/integer.h>
+
+
+#ifndef __LINBOX_USE_OPENMP
+#error "you have to compile this example with openmp enabled"
+#endif
+
+
+// **********************************************************
+// Variable globale pour fixer le g�n�rateurs des FFT primes
+struct FFTSeeder {
+ unsigned long seed;
+ FFTSeeder(unsigned long s=0) : seed(s) {}
+ void setseed(unsigned long s=0) { seed=s; }
+ unsigned long operator()() const { return this->seed; }
+};
+FFTSeeder FFTgenerator;
+#define FFT_PRIME_SEED FFTgenerator()
+// **********************************************************
+
+
+#include <linbox/field/givaro.h>
+#define LINBOX_EXTENSION_DEGREE_MAX 20
+#include <linbox/field/givaro.h>
+#include <linbox/ring/modular.h>
+#include <linbox/blackbox/zero-one.h>
+#include <linbox/blackbox/diagonal.h>
+#include <linbox/solutions/rank.h>
+#include <linbox/solutions/trace.h>
+#include <linbox/util/matrix-stream.h>
+#include <linbox/algorithms/sigma-basis.h>
+#include <linbox/algorithms/block-massey-domain.h>
+
+template<class Field>
+void extractLeftSigma(const Field &F,
+ std::vector<LinBox::DenseMatrix<Field> > &S,
+ std::vector<LinBox::DenseMatrix<Field> >&SigmaBase,
+ std::vector<size_t> &defect,
+ size_t block)
+{
+
+ typedef typename Field::Element Element;
+ LinBox::DenseMatrixDomain<Field> _BMD(F);
+ // take the block rows which have lowest defect
+ // compute permutation such that first block rows have lowest defect
+ std::vector<size_t> Perm(2*block);
+ for (size_t i=0;i<2*block;++i)
+ Perm[i]=i;
+ for (size_t i=0;i<2*block;++i) {
+ size_t idx_min=i;
+ for (size_t j=i+1;j<2*block;++j)
+ if (defect[j]< defect[idx_min])
+ idx_min=j;
+ std::swap(defect[i],defect[idx_min]);
+ Perm[i]=idx_min;
+ }
+ LinBox::BlasPermutation<size_t> BPerm(Perm);
+
+ // Apply BPerm to the Sigma Base
+ for (size_t i=0;i<SigmaBase.size();++i)
+ _BMD.mulin_right(BPerm,SigmaBase[i]);
+
+ size_t max=defect[0];
+ for (size_t i=0;i<block;++i)
+ if (defect[i] > max)
+ max=defect[i];
+
+ // prepare S to receive the sigma base
+ const LinBox::DenseMatrix<Field> Zero(F,block,block);
+ S.resize(max+1, Zero);
+
+ // extract the sigma base
+ //for (size_t k=0;k<S.size();++k){
+ // for(size_t i=0;i<block;++i)
+ // for (size_t j=0;j<block;++j)
+ // S[k].setEntry(i,j, SigmaBase[k].getEntry(i,j));
+ //}
+
+ // extract the reverse sigma base
+ for(size_t i=0;i<block;++i)
+ for (size_t j=0;j<=defect[i];++j){
+ for (size_t k=0;k<block;++k)
+ S[defect[i]-j].setEntry(i,k, SigmaBase[j].getEntry(i,k));
+
+ }
+
+
+}
+
+template<class Field>
+void write_sigma(const Field &F, const char* name, const std::vector<LinBox::DenseMatrix<Field> > & P)
+{
+ size_t m,n;
+ m = P[0].rowdim();
+ n = P[0].coldim();
+ std::cerr<<name<<":=[";
+ for (size_t k=0;k<P.size()-1;++k){
+ std::cerr<<"Matrix([";
+ for (size_t i=0;i<m-1;++i){
+ std::cerr<<"[";
+ for (size_t j=0;j<n-1;++j)
+ F.write(std::cerr,P[k].getEntry(i,j))<<",";
+ F.write(std::cerr, P[k].getEntry(i,n-1))<<"] , ";
+ }
+ std::cerr<<"[";
+ for (size_t j=0;j<n-1;++j)
+ F.write(std::cerr,P[k].getEntry(m-1,j))<<",";
+ F.write(std::cerr, P[k].getEntry(m-1,n-1))<<"]]) , ";
+ }
+
+ std::cerr<<"Matrix([";
+ for (size_t i=0;i<m-1;++i){
+ std::cerr<<"[";
+ for (size_t j=0;j<n-1;++j)
+ F.write(std::cerr,P[P.size()-1].getEntry(i,j))<<",";
+ F.write(std::cerr, P[P.size()-1].getEntry(i,n-1))<<"] , ";
+ }
+ std::cerr<<"[";
+ for (size_t j=0;j<n-1;++j)
+ F.write(std::cerr,P[P.size()-1].getEntry(m-1,j))<<",";
+ F.write(std::cerr, P[P.size()-1].getEntry(m-1,n-1))<<"]])]; \n";
+}
+
+
+template<class Container, class Field>
+void scalarmulin(Container& C, const Field& F, const typename Field::Element& x)
+{
+ for(typename Container::Iterator it=C.Begin();it!=C.End();++it)
+ F.mulin(*it, x);
+}
+
+template<class Container1, class Field, class Container2>
+void contaddin(Container1& C, const Field& F, const Container2& V)
+{
+ typename Container1::Iterator cit=C.Begin();
+ typename Container2::ConstIterator vit=V.Begin();
+ for( ; cit!=C.End(); ++cit, ++vit)
+ F.addin(*cit, *vit);
+}
+
+template<class Field, class Array, class Matrix>
+void EvalPolyMat(Array& EvalDets, const Field& F, const LinBox::DenseMatrixDomain<Field>& D, const std::vector<Matrix>& matminpol, const Array& Points)
+{
+ const long nump = Points.size();
+ std::cerr << "num procs: " << omp_get_num_procs() << std::endl;
+ std::cerr << "max threads: " << omp_get_max_threads() << std::endl;
+ std::cerr << "eval points: " << nump << std::endl;
+#pragma omp parallel for schedule(static)
+ for(int i=0; i<nump; ++i) {
+ const long degree = matminpol.size()-1;
+ Matrix mat=matminpol[degree];
+ for(int j=(int)degree-1;j>=0;--j) {
+ scalarmulin(mat, F, Points[i]);
+ contaddin(mat, F, matminpol[j]);
+ }
+ EvalDets[i] = D.det(mat);
+ }
+
+ // for(int i=0; i<nump; ++i) {
+ // std::cerr << Points[i] << "\t: " << EvalDets[i] << std::endl;
+ // }
+}
+
+#include <linbox/algorithms/whisart_trace.h>
+
+
+using namespace Givaro;
+
+
+template<class Field>
+int OMP_BLOCK_RANK_main (const Field& F, int argc, char **argv)
+{
+ LinBox::commentator().setMaxDetailLevel (-1);
+ LinBox::commentator().setMaxDepth (-1);
+ LinBox::commentator().setReportStream (std::cerr);
+
+ OMPTimer chrono1,chrono2,chrono3,chrono4; chrono1.clear(); chrono2.clear(); chrono3.clear(); chrono4.clear();
+
+ Integer c; F.cardinality(c);
+ unsigned long seed = (argc>4?atoi(argv[4]):0);
+ FFTgenerator.setseed(seed);
+
+ typename Field::RandIter generator (F,c,seed);
+ LinBox::VectorDomain<Field> VD(F);
+
+ std::ifstream input (argv[1]);
+ LinBox::MatrixStream<Field> ms( F, input );
+ typedef LinBox::SparseMatrix<Field, LinBox::SparseMatrixFormat::SparseSeq > Blackbox;
+ typedef LinBox::DenseMatrix<Field> Block_t;
+
+ Blackbox B (ms);
+
+ std::cerr << "B is " << B.rowdim() << " by " << B.coldim() << std::endl;
+ long M = B.rowdim() ;
+ long N = B.coldim();
+ long R = (M<N?M:N);
+ long S = (M>N?M:N);
+
+ int nb = (argc>3 ? atoi(argv[3]) : omp_get_max_threads() );
+ std::cerr << "block size: " << nb << std::endl;
+
+ chrono1.start();
+ std::vector< std::vector< typename Field::Element > > LV(nb);
+ for (typename std::vector< std::vector< typename Field::Element > >::iterator it = LV.begin(); it != LV.end(); ++it) {
+ it->resize(R);
+ for(typename std::vector<typename Field::Element>::iterator vit=it->begin(); vit != it->end(); ++vit)
+ generator.random( *vit );
+ // VD.write(output, *it) << std::endl;
+ }
+
+ Block_t LM(F, nb, R);
+ for (size_t i=0; i < LM.rowdim(); ++i) {
+ for (size_t j=0; j < LM.coldim(); ++j) {
+ LM.setEntry(i,j, LV[i][j]);
+ }
+ }
+
+ chrono1.stop();
+
+ std::cerr << "Generated " << nb << ' ' << R << "-vectors" << std::endl;
+ std::cerr << chrono1 << std::endl;
+
+ chrono2.start();
+
+ typedef LinBox::DenseMatrix<Field> Matrix;
+ typedef std::vector<Matrix> Polynomial;
+
+
+ const Matrix SigmaZero(F, 2*nb,2*nb);
+ const Matrix SerieZero(F, 2*nb,nb);
+
+ long d = 4+(R<<1)/nb;
+
+ // define the serie and the sigmabase
+ Polynomial Serie(d, SerieZero);
+ Polynomial Sigma(d, SigmaZero);
+
+
+ LinBox::DenseVector<Field> d1(F,S);
+ for (int i = 0; i < S; i++)
+ do generator.random (d1[i]); while (F.isZero (d1[i]));
+ LinBox::Diagonal<Field> D1 (d1);
+ LinBox::DenseVector<Field> d2(F,R);
+ for (int i = 0; i < R; i++)
+ do generator.random (d2[i]); while (F.isZero (d2[i]));
+ LinBox::Diagonal<Field> D2 (d2);
+
+ std::cerr << "num procs: " << omp_get_num_procs() << std::endl;
+ std::cerr << "max threads: " << omp_get_max_threads() << std::endl;
+
+ if (M>N) {
+#pragma omp parallel for firstprivate(B) schedule(static)
+ for(int j=0; j<nb; ++j) {
+ std::vector< typename Field::Element > v(S),u(S),w(R);
+ std::vector< typename Field::Element > colonne(nb);
+
+ LM.apply(colonne, LV[j]);
+ for(int i=0;i<nb;++i)
+ Serie[0].setEntry(i,j,colonne[i]);
+
+ for(int k=1;k<d;++k) {
+ // BlackBox Apply
+ D2.apply(w,LV[j]);
+ B.apply(v,w);
+ D1.apply(u,v);
+ B.applyTranspose(w,u);
+ D2.apply(LV[j],w);
+
+ // Dot products
+ LM.apply(colonne, LV[j]);
+ for(int i=0;i<nb;++i)
+ Serie[k].setEntry(i,j,colonne[i]);
+ }
+ std::cerr << "Thread[" << omp_get_thread_num() << "]: Done BTB-Serie[k][" << j << ']' << std::endl;
+ }
+ }
+ else {
+#pragma omp parallel for firstprivate(B) schedule(static)
+ for(int j=0; j<nb; ++j) {
+ std::vector< typename Field::Element > v(S),u(S),w(R);
+ std::vector< typename Field::Element > colonne(nb);
+
+ LM.apply(colonne, LV[j]);
+ for(int i=0;i<nb;++i)
+ Serie[0].setEntry(i,j,colonne[i]);
+
+ for(int k=1;k<d;++k) {
+ // BlackBox Apply
+ D2.apply(w,LV[j]);
+ B.applyTranspose(v,w);
+ D1.apply(u,v);
+ B.apply(w,u);
+ D2.apply(LV[j],w);
+
+ // Dot products
+ LM.apply(colonne, LV[j]);
+ for(int i=0;i<nb;++i)
+ Serie[k].setEntry(i,j,colonne[i]);
+
+ }
+ std::cerr << "Thread[" << omp_get_thread_num() << "]: Done BBT-Serie[k][" << j << ']' << std::endl;
+
+ }
+ }
+
+ chrono2.stop();
+ std::cerr << "Computed a degree " << d << ' ' << nb << 'x' << nb << "-series" << std::endl;
+ std::cerr << chrono2 << std::endl;
+ // write_sigma(F, "serie", Serie);
+
+ chrono3.start();
+ // append Identity to the serie
+ for (int i=0;i<nb;++i)
+ F.assign(Serie[0].refEntry(nb+i,i), F.one);
+
+ // define defect
+ std::vector<size_t> defect(2*nb,0);
+ for (int i=nb;i<2*nb;++i){
+ defect[i]=1;
+ }
+
+
+ LinBox::SigmaBasis<Field> SB(F, Serie);
+ std::cerr<<"blockminpoly computation... ";
+ SB.PM_Basis(Sigma, Serie, d-1, defect);
+ std::cerr<<"done\n";
+ // write_sigma(F, "serie", Serie);
+ // write_sigma(F, "sigma", Sigma);
+
+ std::cerr<<"extracting bminpoly... ";
+ std::vector<Matrix> LS2;
+ extractLeftSigma(F, LS2, Sigma, defect, nb);
+ std::cerr<<"done with size: " << LS2.size() << std::endl;
+ std::cerr<<"Rank of the highest degree coefficient...";
+ unsigned long rdeg;
+ LinBox::DenseMatrixDomain<Field> D(F);
+ rdeg = D.rank(LS2[LS2.size()-1]);
+ typename Field::Element d0,de;
+ d0 = D.det(LS2[0]);
+ de = D.det(LS2[LS2.size()-2]);
+
+ if( ! ( F.isZero(d0) || F.isZero(de) ) )
+ {
+ int rank = (int) ((LS2.size()-2)*(LS2[0].rowdim())+rdeg);
+
+ chrono3.stop();
+ std::cerr<<"is " << rdeg << ", done.\n";
+ std::cerr << "Estimated rank: " << rank << std::endl;
+ }
+ else {
+ chrono3.stop();
+ std::cerr<< "\n*** WARNING *** Insufficient information, interpolation required. You might also try again with a larger field.\n";
+ F.write(std::cerr<< "det(bm[0]): ", d0) << std::endl;
+ std::cerr<< "rk(bm[0]): " << D.rank(LS2[0])<< std::endl;
+ F.write(std::cerr<< "det(bm[" << (LS2.size()-2) << "]): ", de) << std::endl;
+ std::cerr<< "rk(bm[" << (LS2.size()-2) << "]): "<< D.rank(LS2[LS2.size()-2]) << std::endl;
+ std::cerr<< "rk(bm[" << (LS2.size()-1) << "]): "<< rdeg << std::endl;
+ long def=0;
+ if (F.isZero(d0)) ++def;
+ if (F.isZero(de)) ++def;
+ int rank = (int) ((LS2.size()-2-def)*(LS2[0].rowdim())+rdeg);
+ std::cerr<< "*** VERY ROUGH *** rank approximation " << rank << std::endl;
+ }
+ std::cerr << "recursive PMBasis CPU time (s) : " << chrono3.usertime() << std::endl<<std::endl;
+ std::cerr << chrono3 << std::endl;
+
+ chrono4.start();
+
+
+ std::cerr<<"Interpolation of matrix minpoly determinant ...";
+
+ // write_sigma(F, "bminpoly", LS2);
+
+ typedef Poly1CRT< LinBox::Field> PolyCRT;
+ typedef typename PolyCRT::array_T VScal;
+
+ VScal EvalPoints( LS2.size()*nb );
+ for(typename VScal::iterator itp = EvalPoints.begin(); itp != EvalPoints.end(); ++itp) {
+ do {
+ do generator.random (*itp); while (F.isZero (*itp));
+ } while ( (std::find(EvalPoints.begin(), itp, *itp) != itp)) ;
+ }
+
+ VScal EvalDets( EvalPoints.size() );
+ EvalPolyMat(EvalDets, F, D, LS2, EvalPoints);
+
+
+ PolyCRT Interpolator(F, EvalPoints, "Y");
+ typename PolyCRT::Element Determinant;
+
+ Interpolator.RnsToRing(Determinant, EvalDets);
+ chrono4.stop();
+
+ std::cerr << "done\n";
+
+
+ // Interpolator.write(std::cerr << "Determinant of MinPoly: ", Determinant) << std::endl;
+
+ Degree deg; Interpolator.getpolydom().degree(deg, Determinant);
+ Degree val; Interpolator.getpolydom().val(val, Determinant);
+
+
+ F.write(std::cerr, Determinant[0]) << " + ";
+ if (val > 0) F.write(std::cerr<< "... + ", Determinant[val.value()]) << "Y^" << val << " + ";
+ std::cerr << "... + ";
+ if (Determinant.size() >= 2) {
+ F.write(std::cerr, Determinant[Determinant.size()-2]) << "Y^" << (deg-1) << " + ";
+ }
+ F.write(std::cerr, Determinant[Determinant.size()-1]) << "Y^" << deg << std::endl;
+
+
+ typename Field::Element t, p2; F.assign(p2, F.zero);
+ if (Determinant.size() >= 2) {
+ F.neg(p2, Determinant[ Determinant.size()-2]);
+ F.divin(p2, Determinant[ Determinant.size()-1]);
+ }
+
+ if (M>N) {
+ typedef LinBox::Transpose<Blackbox> AT_BB;
+ typedef LinBox::Compose< LinBox::Diagonal<Field>, AT_BB > DAT_BB ;
+ typedef LinBox::Compose< DAT_BB, LinBox::Diagonal<Field> > DATD_BB;
+ typedef LinBox::Compose< DATD_BB, Blackbox> DATDA_BB;
+ typedef LinBox::Compose< DATDA_BB, LinBox::Diagonal<Field> > DATDAD_BB;
+
+ AT_BB AT(&B);
+ DAT_BB B1(&D2, &AT); // B1 = D2 B^T
+ DATD_BB B2(&B1, &D1); // B2 = B1 D1 = D2 B^T D1
+ DATDA_BB B3(&B2, &B); // B3 = B2 B = D2 B^T D1 B
+ DATDAD_BB B4(&B3, &D2); // B4 = B3 D2 = D2 B^T D1 B D2
+ std::cerr << "B4: " << B4.rowdim() << "x" << B4.coldim() << std::endl;
+
+ // trace(t, B4);
+ LinBox::WhisartTraceTranspose(t, F, D2, B, D1);
+
+ F.write(std::cerr << "Trace D2 B^T D1 B D2: ", t) << std::endl;
+
+ }
+ else {
+ typedef LinBox::Compose< LinBox::Diagonal<Field>, Blackbox > DA_BB;
+ typedef LinBox::Compose< DA_BB, LinBox::Diagonal<Field> > DAD_BB;
+ typedef LinBox::Transpose<Blackbox> AT_BB;
+ typedef LinBox::Compose< DAD_BB, AT_BB> DADAT_BB;
+ typedef LinBox::Compose< DADAT_BB, LinBox::Diagonal<Field> > DADATD_BB;
+
+ DA_BB B1(&D2, &B); // B1 = D2 B
+ DAD_BB B2(&B1, &D1); // B2 = B1 D1 = D2 B D1
+ AT_BB AT(&B);
+ DADAT_BB B3(&B2, &AT); // B3 = B2 B^T= D2 B D1 B^T
+ DADATD_BB B4(&B3, &D2); // B4 = B3 D2 = D2 B D1 B^T D2
+ std::cerr << "B4: " << B4.rowdim() << "x" << B4.coldim() << std::endl;
+
+ // trace(t, B4);
+ LinBox::WhisartTrace(t, F, D2, B, D1);
+
+ F.write(std::cerr << "Trace D2 B D1 B^T D2: ", t) << std::endl;
+ }
+
+ if (! F.areEqual( t, p2 )) {
+ std::cerr << "*** FAILURE (" << (deg-val) << ") ***" << std::endl;
+ F.write(std::cerr << "Trace: ", t) << std::endl;
+ F.write(std::cerr << "Minpo: ", p2) << std::endl;
+ }
+ else {
+ // std::cerr << "Degree - valuation: " << (deg-val) << std::endl;
+ std::cerr << "MONTE CARLO RANK: " << (deg-val) << std::endl;
+ }
+ std::cerr << chrono4 << std::endl;
+
+
+
+ std::cerr << "Rank |\t Time-genvect\t Time-seq\t Time-SB\t Time-Interp |\t Total-Time" << std::endl;
+ std::cout << (deg-val) << std::scientific << std::setprecision(3)
+ << " |\t" << chrono1.usertime()
+ << '\t' << chrono2.usertime()
+ << '\t' << chrono3.usertime()
+ << '\t' << chrono4.usertime()
+ << " |\t" << (chrono1.usertime()+chrono2.usertime()+chrono3.usertime()+chrono4.usertime())
+ << std::endl;
+ return 0;
+}
+
+
+int main (int argc, char **argv)
+{
+ // argv[1]: matrix file name
+ // argv[2]: [optional] field characteristic (default 65521)
+ // argv[3]: [optional] block size (default omp_max_threads)
+ // argv[4]: [optional] random generator seed
+
+ int c = (argc>2 ? atoi(argv[2]) : 65521);
+ unsigned long extend = (unsigned long)FF_EXPONENT_MAX(c,(int)LINBOX_EXTENSION_DEGREE_MAX);
+ if (extend > 1) {
+ std::cerr << "*** WARNING *** would be best using an extension field of degree " << extend << std::endl;
+ }
+#if 0
+ if (extend > 1) {
+ typedef LinBox::Givaro::GFq Field;
+ Field EF( (unsigned long)c, extend);
+ EF.write(std::cerr << "Using an extension field ") << std::endl;
+ return OMP_BLOCK_RANK_main(EF,argc,argv);
+ }
+#endif
+ // else {
+ typedef Givaro::Modular<double> Field;
+ Field F(c);
+ return OMP_BLOCK_RANK_main(F,argc,argv);
+ // }
+
+}
+
+
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/examples/omp_smithvalence.C b/examples/omp_smithvalence.C
new file mode 100644
index 0000000..1c4033d
--- /dev/null
+++ b/examples/omp_smithvalence.C
@@ -0,0 +1,236 @@
+/*
+ * examples/omp_smithvalence.C
+ * Copyright (c) Linbox
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ * ========LICENCE========
+ */
+
+/**\file examples/omp_smithvalence.C
+ * @example examples/omp_smithvalence.C
+ \brief Valence of sparse matrix over Z or Zp.
+ \ingroup examples
+ */
+#ifndef DISABLE_COMMENTATOR
+#define DISABLE_COMMENTATOR
+#endif
+
+#include <iostream>
+#include <omp.h>
+#include "smithvalence.h"
+using namespace LinBox;
+
+int main (int argc, char **argv)
+{
+ // commentator().setMaxDetailLevel (-1);
+ // commentator().setMaxDepth (-1);
+ // commentator().setReportStream (std::cerr);
+
+
+ if (argc < 2 || argc > 4) {
+ std::cerr << "Usage: omp_smithvalence <matrix-file-in-supported-format> [-ata|-aat|valence] [coprime]" << std::endl;
+ std::cerr << " Optional parameters valence and coprime are integers." << std::endl;
+ std::cerr << " Prime factors of valence will be used for local computation." << std::endl;
+ std::cerr << " coprime will be used for overall rank computation." << std::endl;
+ return -1;
+ }
+
+ std::ifstream input (argv[1]);
+ if (!input) { std::cerr << "Error opening matrix file " << argv[1] << std::endl; return -1; }
+
+ Givaro::ZRing<Integer> ZZ;
+ MatrixStream< Givaro::ZRing<Integer> > ms( ZZ, input );
+ typedef SparseMatrix<Givaro::ZRing<Integer>> Blackbox;
+ Blackbox A (ms);
+ input.close();
+
+ std::cout << "A is " << A.rowdim() << " by " << A.coldim() << std::endl;
+
+ Givaro::ZRing<Integer>::Element val_A;
+
+ LinBox::Timer chrono; chrono.start();
+ if (argc >= 3) {
+ Transpose<Blackbox> T(&A);
+ if (strcmp(argv[2],"-ata") == 0) {
+ Compose< Transpose<Blackbox>, Blackbox > C (&T, &A);
+ std::cout << "A^T A is " << C.rowdim() << " by " << C.coldim() << std::endl;
+ valence(val_A, C);
+ }
+ else if (strcmp(argv[2],"-aat") == 0) {
+ Compose< Blackbox, Transpose<Blackbox> > C (&A, &T);
+ std::cout << "A A^T is " << C.rowdim() << " by " << C.coldim() << std::endl;
+ valence(val_A, C);
+ }
+ else {
+ std::cout << "Suppose primes are contained in " << argv[2] << std::endl;
+ val_A = LinBox::Integer(argv[2]);
+ }
+ }
+ else {
+ if (A.rowdim() != A.coldim()) {
+ std::cerr << "Valence works only on square matrices, try either to change the dimension in the matrix file, or to compute the valence of A A^T or A^T A, via the -aat or -ata options." << std::endl;
+ exit(0);
+ }
+ else
+ valence (val_A, A);
+ }
+
+ std::cout << "Valence is " << val_A << std::endl;
+
+ std::vector<Givaro::Integer> Moduli;
+ std::vector<size_t> exponents;
+ Givaro::IntFactorDom<> FTD;
+
+ typedef std::pair<Givaro::Integer,unsigned long> PairIntRk;
+ std::vector< PairIntRk > smith;
+
+
+Givaro::Integer coprimeV=2;
+ if (argc >= 4) {
+ coprimeV =Givaro::Integer(argv[3]);
+ }
+ while ( gcd(val_A,coprimeV) > 1 ) {
+ FTD.nextprimein(coprimeV);
+ }
+
+ if (argc >= 4) {
+ std::cout << "Suppose " << argv[3] << " is coprime with Smith form" << std::endl;
+ }
+
+ std::cout << "Integer rank: " << std::endl;
+
+ unsigned long coprimeR; LRank(coprimeR, argv[1], coprimeV);
+ smith.push_back(PairIntRk(coprimeV, coprimeR));
+ // std::cerr << "Rank mod " << coprimeV << " is " << coprimeR << std::endl;
+
+ std::cout << "Some factors (50000 factoring loop bound): ";
+ FTD.set(Moduli, exponents, val_A, 50000);
+ std::vector<size_t>::const_iterator eit=exponents.begin();
+ for(std::vector<Givaro::Integer>::const_iterator mit=Moduli.begin();
+ mit != Moduli.end(); ++mit,++eit)
+ std::cout << *mit << '^' << *eit << ' ';
+ std::cout << std::endl;
+
+ std::vector<Givaro::Integer> SmithDiagonal(coprimeR,Givaro::Integer(1));
+
+ std::cout << "num procs: " << omp_get_num_procs() << std::endl;
+ std::cout << "max threads: " << omp_get_max_threads() << std::endl;
+#pragma omp parallel for shared(SmithDiagonal, Moduli, coprimeR)
+ for(size_t j=0; j<Moduli.size(); ++j) {
+ unsigned long r; LRank(r, argv[1], Moduli[j]);
+ std::cerr << "Rank mod " << Moduli[j] << " is " << r << " on thread: " << omp_get_thread_num() << std::endl;
+ smith.push_back(PairIntRk( Moduli[j], r));
+ for(size_t i=r; i < coprimeR; ++i)
+ SmithDiagonal[i] *= Moduli[j];
+ }
+
+
+ /*
+ for(std::vector<Givaro::Integer>::const_iterator mit=Moduli.begin();
+ mit != Moduli.end(); ++mit) {
+ unsigned long r; LRank(r, argv[1], *mit);
+ std::cerr << "Rank mod " << *mit << " is " << r << std::endl;
+ smith.push_back(PairIntRk(*mit, r));
+ for(size_t i=r; i < coprimeR; ++i)
+ SmithDiagonal[i] *= *mit;
+ }
+ */
+
+ eit=exponents.begin();
+ std::vector<PairIntRk>::const_iterator sit=smith.begin();
+ for( ++sit; sit != smith.end(); ++sit, ++eit) {
+ if (sit->second != coprimeR) {
+ std::vector<size_t> ranks;
+ ranks.push_back(sit->second);
+ size_t effexp;
+ if (*eit > 1) {
+ if (sit->first == 2)
+ PRankPowerOfTwo(ranks, effexp, argv[1], *eit, coprimeR);
+ else
+ PRank(ranks, effexp, argv[1], sit->first, *eit, coprimeR);
+ }
+ else {
+ // if (sit->first == 2)
+ PRank(ranks, effexp, argv[1], sit->first, 2, coprimeR);
+ // else
+ // PRank(ranks, effexp, argv[1], sit->first, 2, coprimeR);
+ }
+ if (ranks.size() == 1) ranks.push_back(coprimeR);
+
+ if (effexp < *eit) {
+ for(size_t expo = effexp<<1; ranks.back() < coprimeR; expo<<=1) {
+ if (sit->first == 2)
+ PRankIntegerPowerOfTwo(ranks, argv[1], expo, coprimeR);
+ else
+ PRankInteger(ranks, argv[1], sit->first, expo, coprimeR);
+ }
+ } else {
+
+ for(size_t expo = (*eit)<<1; ranks.back() < coprimeR; expo<<=1) {
+ if (sit->first == 2)
+ PRankPowerOfTwo(ranks, effexp, argv[1], expo, coprimeR);
+ else
+ PRank(ranks, effexp, argv[1], sit->first, expo, coprimeR);
+ if (ranks.size() < expo) {
+ std::cerr << "It seems we need a larger prime power, it will take longer ..." << std::endl;
+ // break;
+ if (sit->first == 2)
+ PRankIntegerPowerOfTwo(ranks, argv[1], expo, coprimeR);
+ else
+ PRankInteger(ranks, argv[1], sit->first, expo, coprimeR);
+ }
+ }
+ }
+
+ std::vector<size_t>::const_iterator rit=ranks.begin();
+// unsigned long modrank = *rit;
+ for(++rit; rit!= ranks.end(); ++rit) {
+ if ((*rit)>= coprimeR) break;
+ for(size_t i=(*rit); i < coprimeR; ++i)
+ SmithDiagonal[i] *= sit->first;
+// modrank = *rit;
+ }
+ }
+ }
+
+Givaro::Integer si=1;
+ size_t num=0;
+ for( std::vector<Givaro::Integer>::const_iterator dit=SmithDiagonal.begin();
+ dit != SmithDiagonal.end(); ++dit) {
+ if (*dit == si) ++num;
+ else {
+ std::cerr << '[' << si << ',' << num << "] ";
+ num=1;
+ si = *dit;
+ }
+ }
+ std::cerr << '[' << si << ',' << num << "] " << std::endl;
+ chrono.stop();
+ std::cerr << chrono << std::endl;
+
+
+ return 0;
+}
+
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+
diff --git a/examples/poly-smith.C b/examples/poly-smith.C
new file mode 100644
index 0000000..76fe940
--- /dev/null
+++ b/examples/poly-smith.C
@@ -0,0 +1,141 @@
+#include <linbox/linbox-config.h>
+#include <iostream>
+#include <fstream>
+#include <sstream>
+#include <string>
+#include <map>
+
+
+#include <linbox/util/commentator.h>
+#include <linbox/ring/modular.h>
+#include <linbox/vector/stream.h>
+#include <linbox/matrix/matrix-domain.h>
+#include <linbox/matrix/dense-matrix.h>
+
+#include <linbox/algorithms/blackbox-block-container.h>
+#include <linbox/algorithms/block-coppersmith-domain.h>
+
+#include <givaro/givtimer.h>
+#include <givaro/modular.h>
+#include <givaro/givpoly1.h>
+#include <linbox/ring/givaro-poly.h>
+#include <linbox/algorithms/smith-form-textbook.h>
+#include <linbox/algorithms/smith-form-kannan-bachem.h>
+
+using namespace LinBox;
+using namespace std;
+
+/// Prints out a matrix in maple format
+template<class MatrixDom, class Matrix>
+void printMatrix(MatrixDom MD, Matrix A)
+{
+ typename MatrixDom::Field::Element tmp;
+
+ cout << "<";
+ for (size_t i = 0; i < A.rowdim(); i++)
+ {
+ if (i != 0)
+ cout << ",";
+
+ MD.field().write(cout << "<", A.getEntry(tmp, i, 0));
+ for (size_t j = 1; j < A.coldim(); j++)
+ {
+ MD.field().write(cout << "|", A.getEntry(tmp, i, j));
+ }
+ cout << ">";
+ }
+ cout << ">" << endl;
+}
+
+/// Prints a vector as a list
+template<class Field, class Vector>
+void printVector(Field F, Vector S)
+{
+ F.write(cout << "[", S[0]);
+ for (size_t i = 1; i < S.size(); i++)
+ F.write(cout << ",", S[i]);
+ cout << "]" << endl;
+}
+
+/// Makes vector polynomials monic
+template<class PolyDom, class Vector>
+void normalize(PolyDom &PD, Vector &S)
+{
+ typedef typename PolyDom::Type_t Scalar;
+
+ for (size_t i = 0; i < S.size(); i++)
+ {
+ Scalar lcoef;
+ PD.leadcoef(lcoef, S[i]);
+ PD.divin(S[i], lcoef);
+ }
+}
+
+int main(int argc, char **argv)
+{
+ typedef Givaro::Modular<int32_t> BaseDom;
+ typedef Givaro::Poly1Dom<BaseDom, Givaro::Dense> PolyDom;
+ typedef GivaroPoly<PolyDom> Field;
+ typedef MatrixDomain<Field> MatrixDom;
+ typedef DenseMatrix<Field> Matrix;
+
+ if (argc < 4)
+ {
+ cout << "Generates a random GF(p)^(n-by-n) with polynomial coefficients with degree=d" << endl;
+ cout << "Use: ./polysmith <p> <n> <d>" << endl;
+ return 1;
+ }
+
+ int p = atoi(argv[1]);
+ int n = atoi(argv[2]);
+ int d = atoi(argv[3]);
+
+ BaseDom BD(p);
+ PolyDom PD(BD, "x");
+ Field F(PD);
+ MatrixDom MD(F);
+
+ Matrix M(F, n, n);
+
+ GivaroPolyRandIter<Field> Rand(F);
+
+ for (int i = 0; i < n; i++)
+ {
+ for (int j = 0; j < n; j++)
+ {
+ Field::Element tmp;
+ Rand.random(tmp, Givaro::Degree(d));
+ M.setEntry(i, j, tmp);
+ }
+ }
+
+ printMatrix(MD, M);
+
+ // Text Book SF Domain
+ // Comment out this block if things are getting too slow
+ SmithFormTextbookDomain<MatrixDom> SFD(MD);
+ DenseVector<Field> S1(F, n, F.zero);
+
+ Givaro::Timer t1;
+ t1.start();
+ SFD.solve(S1, M);
+ t1.stop();
+ normalize(PD, S1);
+ printVector(F, S1);
+
+ // Kannan-Bachem w/ Chou-Collins Improvement Domain
+ SmithFormKannanBachemDomain<MatrixDom> SFKB(MD);
+ DenseVector<Field> S2(F, n, F.zero);
+
+ Givaro::Timer t2;
+ t2.start();
+ SFKB.solve(S2, M);
+ t2.stop();
+ normalize(PD, S2);
+ printVector(F, S2);
+
+ cout << "SFD: " << n << " " << p << " " << d << " " << t1.usertime() << endl;
+ cout << "SFK: " << n << " " << p << " " << d << " " << t2.usertime() << endl;
+
+ return 0;
+}
diff --git a/examples/power_rank.C b/examples/power_rank.C
new file mode 100644
index 0000000..13df397
--- /dev/null
+++ b/examples/power_rank.C
@@ -0,0 +1,117 @@
+
+/*
+ * examples/power_rank.C
+ *
+ * Copyright (C) 2005, 2010 J-G Dumas
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ * ========LICENCE========
+ */
+
+/** \file examples/power_rank.C
+ * @example examples/power_rank.C
+ \brief Rank of sparse matrix over Z or Zp.
+ \ingroup examples
+ */
+#include <linbox/linbox-config.h>
+
+#include <iostream>
+
+#include <givaro/modular.h>
+#include <linbox/matrix/sparse-matrix.h>
+#include <linbox/algorithms/smith-form-sparseelim-local.h>
+
+using namespace LinBox;
+using namespace std;
+
+
+template<typename Base>
+int tmain (int argc, char **argv)
+{
+ commentator().setMaxDetailLevel (-1);
+ commentator().setMaxDepth (-1);
+ commentator().setReportStream (std::cerr);
+
+ ifstream input (argv[1]);
+ if (!input) { cerr << "Error opening matrix file: " << argv[1] << endl; return -1; }
+
+ Base p; Givaro::Caster(p,Givaro::Integer(argv[2]));
+ Base q; Givaro::Caster(q,Givaro::Integer(argv[3]));
+ typedef Givaro::Modular<Base> Field;
+ Field F(q);
+ MatrixStream<Field> ms( F, input );
+ SparseMatrix<Field, SparseMatrixFormat::SparseSeq > B (ms);
+ cout << "B is " << B.rowdim() << " by " << B.coldim() << endl;
+ if (B.rowdim() <= 20 && B.coldim() <= 20) B.write(cout) << endl;
+
+ // using Sparse Elimination
+ PowerGaussDomain< Field > PGD( F );
+ std::vector<std::pair<size_t,Base> > local;
+
+ Givaro::Timer tq; tq.clear(); tq.start();
+ PGD(local, B, q, p);
+ tq.stop();
+
+
+ F.write(std::cout << "Local Smith Form ") << " : " << std::endl << '(';
+ for (auto ip = local.begin(); ip != local.end(); ++ip)
+ std::cout << ip->first << " " << ip->second << ", ";
+ cout << ")" << endl;
+
+
+ std::cerr << tq << std::endl;
+
+ return 0;
+}
+
+int main(int argc, char ** argv) {
+ if (argc < 4 || argc > 5) {
+ cerr << "Usage: rank <matrix-file-in-supported-format> <prime> <prime-power> [<method>]" << endl; return -1; }
+
+ Givaro::Integer q(argv[3]);
+ size_t method( argc>4? atoi(argv[4]) : 0);
+ const size_t logq( (size_t)ceil(logtwo(q)) );
+
+ if ( (method == 1) || ( (method==0) && (logq<63) ) ) {
+ return tmain<int64_t>(argc,argv);
+ } else {
+ if ( (method == 2) ) {
+ return tmain<Givaro::Integer>(argc,argv);
+ } else {
+ if (! method) method = (size_t)std::max(6., ceil(log(logq)/log(2.)) );
+ switch (method) {
+ case 6: return tmain<RecInt::ruint<6>>(argc,argv);
+ case 7: return tmain<RecInt::ruint<7>>(argc,argv);
+ case 8: return tmain<RecInt::ruint<8>>(argc,argv);
+ case 9: return tmain<RecInt::ruint<9>>(argc,argv);
+ case 10: return tmain<RecInt::ruint<10>>(argc,argv);
+ case 11: return tmain<RecInt::ruint<11>>(argc,argv);
+ }
+ }
+ }
+
+ return 0;
+}
+
+
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/examples/poweroftwo_ranks.C b/examples/poweroftwo_ranks.C
new file mode 100644
index 0000000..c73bf8e
--- /dev/null
+++ b/examples/poweroftwo_ranks.C
@@ -0,0 +1,110 @@
+/* examples/poweroftwo_ranks.C
+ *
+ * Copyright (C) 2012 LinBox
+ * Written by J-G Dumas
+ * Time-stamp: <29 Mar 16 15:58:16 Jean-Guillaume.Dumas at imag.fr>
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ * ========LICENCE========
+ */
+
+/** \file examples/poweroftwo_ranks.C
+ * @example examples/poweroftwo_ranks.C
+ \brief Ranks of sparse matrix modulo 2^k
+ \ingroup examples
+ */
+#include <linbox/linbox-config.h>
+
+#include <iostream>
+
+#include <givaro/modular.h>
+#include <linbox/matrix/sparse-matrix.h>
+#include <linbox/algorithms/smith-form-sparseelim-poweroftwo.h>
+
+using namespace LinBox;
+using namespace std;
+
+template<class Int_type, class Ring_type = Givaro::ZRing<Int_type> >
+void runpoweroftworank(ifstream& input, const size_t exponent) {
+ typedef std::vector<std::pair<size_t,Int_type> > Smith_t;
+ typedef Ring_type Ring; // signed ?
+ Smith_t local;
+ Ring R;
+ LinBox::MatrixStream<Ring> ms( R, input );
+ LinBox::SparseMatrix<Ring, LinBox::SparseMatrixFormat::SparseSeq > A (ms);
+
+ input.close();
+ LinBox::PowerGaussDomainPowerOfTwo< Int_type > PGD;
+
+ cout << "B is " << A.rowdim() << " by " << A.coldim() << endl;
+// R.write(std::cerr << "Last entry: ", A.getEntry(A.rowdim()-1,A.coldim()-1)) << std::endl;
+
+ Givaro::Timer tim;
+ tim.clear(); tim.start();
+ PGD(local, A, exponent);
+ tim.stop();
+
+ R.write(std::cout << "Local Smith Form ") << " : " << std::endl << '(';
+ for (auto p = local.begin(); p != local.end(); ++p)
+ std::cout << '[' << p->second << ',' << p->first << "] ";
+ cout << ')' << endl;
+
+ std::cerr << tim << std::endl;
+}
+
+int main (int argc, char **argv) {
+ commentator().setMaxDetailLevel (-1);
+ commentator().setMaxDepth (-1);
+ commentator().setReportStream (std::cerr);
+
+ if (argc < 3 || argc > 4)
+ { cerr << "Usage: rank <matrix-file-in-supported-format> <power of two exponent> [<method>]" << endl; return -1; }
+
+ ifstream input (argv[1]);
+ if (!input) { cerr << "Error opening matrix file: " << argv[1] << endl; return -1; }
+ size_t method( argc>3? atoi(argv[3]): 0 );
+
+ Givaro::Timer tim;
+ size_t exponent = atoi(argv[2]);
+ if ((method == 2) || ((method == 0) && (exponent >= (1<<10))) ) {
+ runpoweroftworank<Givaro::Integer>(input, exponent);
+ } else {
+ if ((method == 1) || ((method == 0) && (exponent < 64)) ) {
+ runpoweroftworank<uint64_t, Givaro::ZRing<int64_t> >(input, exponent);
+ } else {
+ switch (method) {
+ case 6: runpoweroftworank<RecInt::ruint<6>>(input, exponent); break;
+ case 7: runpoweroftworank<RecInt::ruint<7>>(input, exponent); break;
+ case 8: runpoweroftworank<RecInt::ruint<8>>(input, exponent); break;
+ case 9: runpoweroftworank<RecInt::ruint<9>>(input, exponent); break;
+ case 10: runpoweroftworank<RecInt::ruint<10>>(input, exponent); break;
+ case 11: runpoweroftworank<RecInt::ruint<11>>(input, exponent); break;
+ }
+ }
+ }
+
+ std::cerr << tim << std::endl;
+ return 0;
+}
+
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/examples/qchar.C b/examples/qchar.C
new file mode 100644
index 0000000..854864b
--- /dev/null
+++ b/examples/qchar.C
@@ -0,0 +1,548 @@
+
+/*
+ * examples/qchar.C
+ *
+ * Copyright (C) 2007, 2010 A. Urbanska
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ * ========LICENCE========
+ */
+
+/*! @file examples/qchar.C
+ * @example examples/qchar.C
+ * @ingroup examples
+ * @brief Undocumented.
+ */
+
+#include <givaro/modular.h>
+#include <linbox/field/gmp-rational.h>
+#include <linbox/matrix/dense-matrix.h>
+#include <linbox/matrix/sparse-matrix.h>
+#include <linbox/solutions/charpoly.h>
+#include <linbox/solutions/minpoly.h>
+#include <linbox/ring/givaro-polynomial.h>
+#include <linbox/element/givaro-polynomial.h>
+
+using namespace LinBox;
+using namespace std;
+
+typedef Givaro::ZRing<Integer> Integers;
+typedef Integers::Element Integer;
+typedef Givaro::Modular<double > Field;
+typedef Field::Element Element;
+typedef Vector<Integers>::Dense DVector;
+typedef GMPRationalField Rationals;
+typedef Rationals::Element Quotient;
+typedef DenseMatrix<Integers > Blackbox;
+typedef SparseMatrix<Rationals > RBlackbox;
+
+//#define _LB_CONT_FR
+
+typedef UserTimer myTimer;
+
+myTimer tRationalModular;
+
+template <class Field, class Polynomial>
+std::ostream& printPolynomial (std::ostream& out, const Field &F, const Polynomial &v)
+{
+ for (int i = v.size () - 1; i >= 0; i--) {
+ F.write (out, v[i]);
+ if (i > 0)
+ out << " X^" << i << " + ";
+ out << "\n";
+ }
+ return out;
+}
+
+template <class Blackbox, class MyMethod>
+struct PrecRationalModularCharpoly {
+ const Blackbox &A;
+ const MyMethod &M;
+ const Integer ≺
+
+ PrecRationalModularCharpoly(const Integer& detPrec, const Blackbox& b, const MyMethod& n) :
+ prec(detPrec), A(b), M(n)
+ {}
+
+ template<typename Polynomial, typename Field>
+ Polynomial& operator()(Polynomial& P, const Field& F) const
+ {
+
+ typedef typename Blackbox::template rebind<Field>::other FBlackbox;
+ FBlackbox * Ap;
+
+ tRationalModular.clear();
+ tRationalModular.start();
+ MatrixHom::map(Ap, A, F);
+ tRationalModular.stop();
+ //minpoly(P, *Ap, typename FieldTraits<Field>::categoryTag(), M);
+ charpoly( P, *Ap, typename FieldTraits<Field>::categoryTag(), M);
+ //minpolySymmetric(P, *Ap, typename FieldTraits<Field>::categoryTag(), M);
+ integer p;
+ F.characteristic(p);
+ cout<<"Valence "<<p<<" = P[P.size()-1]" << P[P.size(0)-1] << " R-M time " ;
+ tRationalModular.print(cout);
+ cout << "\n" ;
+
+ typename Field::Element fprec;
+ F.init(fprec, prec);
+ //printPolynomial (std::cout, F, P);
+ delete Ap;
+
+ for (int i=0; i < P.size(); ++i)
+ F.mulin(P[i],fprec);
+ //std::cout<<"prec*Det(A) mod "<<p<<" = P[0]" << P[0] << "\n";
+ return P;
+ }
+};
+
+template <class Blackbox, class MyMethod>
+struct PrecRationalModularMinpoly {
+ const Blackbox &A;
+ const MyMethod &M;
+ const DVector ≺
+
+
+ PrecRationalModularMinpoly(const DVector& detPrec, const Blackbox& b, const MyMethod& n) :
+ prec(detPrec), A(b), M(n)
+ {}
+
+ template<typename Polynomial, typename Field>
+ Polynomial& operator()(Polynomial& P, const Field& F) const
+ {
+
+ typedef typename Blackbox::template rebind<Field>::other FBlackbox;
+ FBlackbox * Ap;
+
+ tRationalModular.clear();
+ tRationalModular.start();
+ MatrixHom::map(Ap, A, F);
+ tRationalModular.stop();
+ //minpoly(P, *Ap, typename FieldTraits<Field>::categoryTag(), M);
+ //charpoly( P, *Ap, typename FieldTraits<Field>::categoryTag(), M);
+ minpolySymmetric(P, *Ap, typename FieldTraits<Field>::categoryTag(), M);
+ integer p;
+ F.characteristic(p);
+ //cout<<"Det(A) mod "<<p<<" = P[0]" << P[0] << " R-M time " ;
+ cout<<"Valence "<<p<<" = P[P.size()-1]" << P[P.size()-1] << " R-M time " ;
+ tRationalModular.print(cout);
+ cout << "\n" ;
+
+ typename Field::Element fprec;
+ //F.init(fprec, prec);
+ //printPolynomial (std::cout, F, P);
+ delete Ap;
+
+ for (int i=0; i < P.size()-1; ++i) {
+ F.init(fprec, prec[i]);
+ F.mulin(P[i],fprec);
+ }
+ //std::cout<<"prec*Det(A) mod "<<p<<" = P[0]" << P[0] << "\n";
+ //printPolynomial(cout,F,P);
+ return P;
+ }
+};
+
+
+void continuedFractionIn(double x,Integer& num, Integer& den, double epsi,const size_t s, Integer den_bound);
+template <class RMatrix>
+void generate_precRatMat(string& filename, RMatrix& M, DVector& den, Integer& denPrec);
+void i_vti_v(RBlackbox& Res, DenseMatrix<Rationals >& M, DVector& den, Integer& detPrec);
+
+int main (int argc, char** argv)
+{
+
+ if ((argc < 3) || (argc > 4) ) {
+ cout << "Usage: qchar n matrix" << endl;
+ return -1;
+ }
+
+ size_t n = atoi(argv[1]);
+ cout << "Matrix size " << n<< endl;
+ string filename;
+ filename=argv[2];
+
+ Integers Z;
+ Rationals Q;
+
+ Integer detPrec = 1;
+ Integer detNum;
+ Integer detDen;
+
+ Blackbox DM(Z,n,n);
+ DenseMatrix<Rationals > In(Q,n,n);
+ RBlackbox M(Q,n,n);
+ DVector V(n,1);
+
+ // generate_precRatMat(filename, In, V, detPrec);
+ //i_vti_v(M,In, V, detPrec);
+ generate_precRatMat(filename, M, V, detPrec);
+ cout << "detPrec is " << detPrec << "\n";
+ typedef GivPolynomialRing<Integers,Dense> IntPolRing;
+ IntPolRing::Element c_A;
+
+ Integer max = 1,min=0;
+ for (int i=0; i < n; ++i) {
+ for (int j=0; j < n; ++j) {
+ Integer a;
+ Q.convert(a,M.getEntry(i,j));
+ // cerr<<"it="<<(*it)<<endl;
+ if (max < a)
+ max = a;
+ if (min > a)
+ min = a;
+ }
+ }
+ if (max<-min)
+ max=-min;
+ else max = max+1;
+ double hadamarcp = (double)n/2.0*(log(double(n))+2*log(double(max))+0.21163275)/log(2.0);
+
+
+ cout << "had" << hadamarcp << "\n";
+ cout << "had2" << (Integer)hadamarcp*detPrec << "\n";
+
+ RandomPrimeIterator genprime( 26-(int)ceil(log((double)M.rowdim())*0.7213475205));
+ ChineseRemainder< EarlyMultipCRA<Field > > cra(3UL);
+ typedef Method::Hybrid MyMethod;
+ MyMethod Met;
+ //PrecRationalModularCharpoly <RBlackbox ,MyMethod> iteration (detPrec, M, Met);
+ PrecRationalModularMinpoly< RBlackbox ,MyMethod> iteration(V, M, Met);
+ cra (c_A, iteration, genprime);
+ printPolynomial(cout, Z, c_A);
+
+ return 0 ;
+}
+
+/* for a rational number num/den construct a continued fraction approximation:
+ - with den bounded by den_bound
+ AND - number of steps bounded by s
+ NEW fraction replaces num/den
+ */
+
+void continuedFractionIn(Integer& num, Integer& den, double epsi,const size_t s, Integer den_bound)
+{
+ //den_bound = 100;
+ Integer a=num;
+ Integer b=den;
+ Integer t;
+ //double y;
+ Integer f[s];
+ f[0] = a/b;// y = f[0];
+ int i=1;
+ while (1) //abs(y-x)>=epsi)
+ {
+ //cout << "a :" << a << " b: " << b << "\n";
+ t = a%b;
+ a = b;
+ b = t;
+ f[i] = a/b;
+ //y = (double)f[i];
+ num = 1;
+ den = f[i];
+ for (int j=i-1; j > 0; --j) {
+ Integer tmp = num;
+ num = den;
+ den = f[j]*den+tmp;
+ //y = (double)f[j]+1/y;
+ }
+ //y = (double)f[0]+1/y;
+ num = den*f[0]+num;
+ if (den >= den_bound) break;
+ ++i;
+ if (i >= s) {
+ break;
+ }
+ }
+}
+
+void i_vti_v(RBlackbox& Res, DenseMatrix<Rationals >& M, DVector& den, Integer& detPrec)
+{
+ detPrec=1;
+ Rationals Q;
+ int n = M.coldim();
+ //DVector denV(n,1);
+ for (int i=0; i < den.size();++i) den[i]=1;
+ for (int i=0; i < n; ++i) {
+ for (int j=0; j <=i ; ++j) {
+ Integer q_num =0;
+ Integer q_den =1;
+ for (int k=0; k < n; ++k) {
+ Integer deno_ik, nume_ik, deno_jk, nume_jk, deno, nume;
+ Q.get_den (deno_ik, M.getEntry(k,i));
+ Q.get_num (nume_ik, M.getEntry(k,i));
+ Q.get_den (deno_jk, M.getEntry(k,j));
+ Q.get_num (nume_jk, M.getEntry(k,j));
+
+ if (i==k) {
+ nume_ik = deno_ik-nume_ik;
+ }
+ else {
+ nume_ik = -nume_ik;
+ }
+
+ if (j==k) {
+ nume_jk = deno_jk-nume_jk;
+ }
+ else {
+ nume_jk = -nume_jk;
+ }
+ //cout << nume_ik << nume_jk;
+
+ deno = deno_ik*deno_jk;
+ nume = nume_ik*nume_jk;
+ //cout << q_num << "/" << q_den << " " ;
+ //cout << nume << "/" << deno << " " ;
+ if (deno==q_den) q_num+=nume;
+ else {
+ if (nume != 0) {
+ Integer g = gcd(q_den, deno);
+ q_num = q_num*deno/g+nume*q_den/g;
+ q_den = q_den*deno/g;
+ }
+ }
+ //cout << q_num << "/" << q_den << " " ;
+ }
+ if (q_num != 0) {
+ Quotient q(q_num,q_den);
+ if (i!=j) {
+ den[i]=lcm(den[i], q_den);
+ den[j]=lcm(den[j], q_den);
+ Res.setEntry(i,j,q);
+ Res.setEntry(j,i,q);
+ cout << i << " " << j << " " << q_num << "/" << q_den << "\n";
+ cout << j << " " << i << " " << q_num << "/" << q_den << "\n";
+ }
+ else {
+ den[i]=lcm(den[i], q_den);
+ Res.setEntry(i,j,q);
+ cout << i << " " << j << " " << q_num << "/" << q_den << "\n";
+ }
+ }
+ }
+ }
+ Integer d = 1;
+ for (int i=0; i < den.size(); ++i) {
+ detPrec *=den[i];
+ d = lcm(d, den[i]);
+ }
+ den[den.size()-1]=d;
+ for (int i=den.size()-2; i >=0; --i) {
+ den[i]=d*den[i+1];
+ }
+
+}
+
+template <class RMatrix>
+void generate_precRatMat(string& filename, RMatrix& M, DVector& den, Integer& denPrec)
+{
+ int prec=10;
+ denPrec = 1;
+ ifstream is(filename.c_str(), std::ios::in);
+ int m,n;
+ char c;
+ is >> m >> n;
+ do is >> c; while (isspace (c));
+ if ((m > M.rowdim()) || (n > M.coldim())) {
+ cout << m << " " << n << " " ;
+ cout << "Wrong matrix size\n";
+ return;
+ }
+
+ cout << "Reading matrix\n";
+
+ den.resize(m,1);
+ while (1) {//! @todo temp fix
+#if 0
+ while (is >> m) //temp fix
+ if (m==0) break;//temp fix
+#endif
+ is >> m;//temp fix
+ is >> n;
+#if 0
+ cout << m << n << "\n";
+ long double x;
+ is >> x;
+#endif
+ char xstr[500];
+ char numstr[500];
+#if 0
+ cout << x << " ";
+ sprintf(xstr, "%100f", x);
+ cout << xstr << " " ;
+ is >> c; int i=0;
+ while (c!= '\n') {
+ xstr[i]=c;
+ ++i;
+ is >> c;
+ if (i>=199) {
+ xstr[i]=0;
+ break;
+ }
+ }
+ is >> c;
+#endif
+ is.getline(xstr,500);
+
+ Integer ten=1;
+ if (strchr(xstr, '/') != NULL) {
+ //cout << "xstr " << xstr << "\n";
+ //! @bug non reentrant strtok
+ strcpy(numstr, strtok(xstr, "/"));
+ char tenstr[500];
+ strcpy(tenstr, strtok(NULL, "/"));
+ if (prec < strlen(tenstr)) {
+ int cut = strlen(tenstr)-prec;
+ tenstr[prec]=0;
+ //c = numstr[strlen(numstr)-2];
+ numstr[strlen(numstr)-cut]=0;//temp round down
+ }
+ Integer tmp(tenstr);
+ ten = tmp;
+ //cout << numstr << "/" << ten << "\n";
+ }
+ else
+ {
+
+ // cout << "xstr" << xstr << " " ;
+ int i=0;
+ int j=0;
+ c=xstr[i]; ++i;
+ while (isspace (c)) {
+ if (i >=strlen(xstr)) break;
+ c=xstr[i];
+ ++i;
+ }
+ if (c=='-') {
+ numstr[j]=c;++j;
+ if (i < strlen(xstr)) {
+ c = xstr[i];
+ ++i;
+ }
+ }
+ if (c=='0') {
+ //cout << "zero";
+ if (i < strlen(xstr)) {
+ c = xstr[i];
+ ++i;
+ }
+ } //else cout << " not 0" << c;
+ while (strchr("0123456789",c) != NULL) {
+ //cout << "number";
+ numstr[j]=c; ++j;
+ if (i >=strlen(xstr)) break;
+ c=xstr[i];
+ ++i;
+ }
+ if (c=='.') {
+ if (i < strlen(xstr)) {
+ c = xstr[i];
+ //cout << "c" << c ;
+ ++i;
+ while (strchr("0123456789",c) != NULL) {
+ numstr[j]=c;++j;
+ if (i >=strlen(xstr)) break;
+ c=xstr[i];
+ ++i;
+ }
+ }
+ else {
+ cout << "wrong number format at .";
+ break;
+ }
+ }
+ numstr[j]=0;
+ //cout << "num" << numstr << " " ;
+
+ size_t dplaces=0;
+ int exp=0;
+ j=0;
+ c = xstr[j]; ++j;
+ while (c != '.') {
+ if (j >= strlen(xstr)) break;
+ c = xstr[j];
+ ++j;
+ }
+ if (j < strlen(xstr)) {
+ c = xstr[j]; ++j;
+ while (c != 'e') {
+ ++dplaces;
+ ten *= 10;
+ if (j >= strlen(xstr)) break;
+ c = xstr[j];
+ ++j;
+ }
+ }
+ if (j < strlen(xstr)) {
+ sscanf(xstr+j, "%d", &exp);
+ j=j-2;c = xstr[j];
+ while (c=='0') {
+ ten/=10;
+ --j;
+ c = xstr[j];
+ }
+ }
+
+ dplaces -=exp;
+ if (exp > 0) {
+ for (int i=0; i < exp; ++i) ten /=10;
+ }
+ else if (exp < 0) {
+ for (int i=0; i < exp; ++i) ten *=10;
+ }
+ //double nume = x * (double)ten;
+ }
+ Integer num (numstr);
+ Integer g;
+
+#ifdef _LB_CONT_FR
+ double epsi = 1/(double)ten*10;
+ size_t s=10;
+ continuedFractionIn(num, ten, epsi, s, ten);
+#endif
+ //cout << m << " " << n << " " << num << "/" << ten << "\n";
+ g = gcd(num,ten);
+ //g =1;
+ Quotient q(num/g,ten/g);
+ if ((m==0)&&(n==0)&&(num==0)) break;//temp fix
+ //M.setEntry(m-1,n-1,q);//temp fix
+ M.setEntry(m,n,q);
+ den[m-1] = lcm(den[m-1],ten/g);
+ }
+ Integer d = 1;
+ for (int i=0; i < den.size(); ++i) {
+ denPrec *=den[i];
+ d = lcm(d, den[i]);
+ }
+ den[den.size()-1]=d;
+ cout << d << "\n";
+ for (int i=den.size()-2; i >=0; --i) {
+ den[i]=d*den[i+1];
+ cout << den[i] << "\n";
+ }
+}
+
+#undef _LB_CONT_FR
+
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+
diff --git a/examples/rank.C b/examples/rank.C
index 4ea16e2..f65dbab 100644
--- a/examples/rank.C
+++ b/examples/rank.C
@@ -28,16 +28,19 @@
\ingroup examples
*/
+#include <linbox/linbox-config.h>
#include <iostream>
#include <sstream>
+#include <givaro/givrational.h>
-#include "linbox/field/modular.h"
-#include "linbox/field/gf2.h"
-#include "linbox/blackbox/sparse.h"
-#include "linbox/blackbox/zero-one.h"
-#include "linbox/solutions/rank.h"
-#include "linbox/util/matrix-stream.h"
-#include "linbox/field/givaro.h"
+#include <linbox/ring/modular.h>
+#include <linbox/field/gf2.h>
+#include <linbox/matrix/sparse-matrix.h>
+#include <linbox/blackbox/zero-one.h>
+#include <linbox/solutions/rank.h>
+#include <linbox/util/matrix-stream.h>
+
+#define SP_STOR SparseMatrixFormat::SparseSeq
using namespace LinBox;
@@ -61,75 +64,57 @@ int main (int argc, char **argv)
long unsigned int r;
- if (argc == 2) { // rank over the rational numbers.
+ Givaro::QField<Givaro::Rational> ZZ;
+ LinBox::Timer tim ; tim.clear() ; tim.start();
+ MatrixStream<Givaro::QField<Givaro::Rational>> ms( ZZ, input );
+ SparseMatrix<Givaro::QField<Givaro::Rational>, SP_STOR> A ( ms );
+ tim.stop();
+ std::cout << "matrix is " << A.rowdim() << " by " << A.coldim() << " (" << tim << ")" << std::endl;
+ tim.clear() ; tim.start();
+
+ if (argc == 2) { // rank over the rational numbers.
/* We could pick a random prime and work mod that prime, But
* the point here is that the rank function in solutions/
* handles that issue. Our matrix here is an integer or
* rational matrix and our concept is that we are getting the
* rank of that matrix by some blackbox magic inside linbox.
*/
- LinBox::GivaroRational ZZ;
- MatrixStream<GivaroRational> ms( ZZ, input );
- SparseMatrix<GivaroRational> A ( ms );
- std::cout << "A is " << A.rowdim() << " by " << A.coldim() << std::endl;
-
LinBox::rank (r, A);
}
+
if (argc == 3) { // rank mod a prime
- /*
- //for prime greater than wordsize:
- stringstream qstr(argv[2]);
- integer q;
- qstr >> q;
- typedef Modular<integer> Field;
- */
- /*
- //to use doubles, prime < 2^{23}
- double q = atof(argv[2]);
- typedef Modular<double> Field;
- */
- //to use ints, prime < 2^{31}
- int32_t q = atoi(argv[2]);
- typedef Modular<int32_t> Field;
+ uint32_t q = atoi(argv[2]);
+ if (q == 0) {
+ std::cerr << "second argument should be a non-zero integer or missing\n";
+ return -1;
+ }
+ typedef Givaro::Modular<double> Field;
Field F(q);
- MatrixStream<Field> ms( F, input );
- SparseMatrix<Field, Vector<Field>::SparseSeq > B (ms);
- std::cout << "B is " << B.rowdim() << " by " << B.coldim() << std::endl;
- if (B.rowdim() <= 20 && B.coldim() <= 20) B.write(std::cout) << std::endl;
+ if (q > F.maxCardinality()) {
+ std::cerr << "your number is too big for this field" << std::endl;
+ return -1 ;
+ }
+
+ SparseMatrix<Field, SP_STOR > B (F, A.rowdim(), A.coldim());// modular image of A
+ MatrixHom::map(B, A);
+ std::cout << "matrix is " << B.rowdim() << " by " << B.coldim() << std::endl;
+ //if (B.rowdim() <= 20 && B.coldim() <= 20) B.write(std::cout) << std::endl;
// Using the adaptive LinBox Solution
LinBox::rank(r,B);
-
- // using BlackBoxes
-#if 0 /* too bad */
- Method::Blackbox MBB;
- MBB.certificate(true);
- Linbox::rank(r, B, MBB);
-#endif
-
- // using in place Sparse Elimination with linear pivoting
-
-#if 0 /* too bad */
- Method::SparseElimination SE;
- SE.strategy(Specifier::PIVOT_LINEAR);
- rankin (r, B, SE);
- if (B.rowdim() <= 20 && B.coldim() <= 20) B.write(std::cout) << std::endl;
-#endif
-
-
}
+ tim.stop();
- std::cout << "Rank is " << r << std::endl;
+ std::cout << "Rank is " << r << " (" << tim << " )" << std::endl;
return 0;
}
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
// Local Variables:
// mode: C++
// tab-width: 8
// indent-tabs-mode: nil
// c-basic-offset: 8
// End:
-
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/examples/rr.C b/examples/rr.C
new file mode 100644
index 0000000..8dee961
--- /dev/null
+++ b/examples/rr.C
@@ -0,0 +1,99 @@
+
+/*
+ * examples/rr.C
+ *
+ * Copyright (C) 2008, 2010 A. Urbanska
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ * ========LICENCE========
+ */
+
+/*! @file examples/rr.C
+ * @example examples/rr.C
+ * @ingroup examples
+ * @brief Rational Reconstruction.
+ */
+
+#include <iostream>
+
+#include <linbox/integer.h>
+#include <givaro/zring.h>
+#include <linbox/algorithms/rational-reconstruction-base.h>
+
+#include <linbox/util/matrix-stream.h>
+#include <linbox/util/timer.h>
+
+using namespace LinBox;
+using namespace std;
+
+typedef Givaro::ZRing<Integer> Ints;
+//typedef Ints::Element Integer;
+
+int main (int argc, char **argv)
+{
+ srand48( time(NULL) );
+
+ integer a,b;
+ integer x(1);
+ integer m(1);
+
+ x = x*rand()*rand()*rand()*rand()*rand()*rand();
+ m = m*rand()*rand()*rand()*rand()*rand()*rand()*rand()*rand();
+
+ if (x > m) {integer t=x; x=m; m=t;}
+
+ cout << "Searching a,b: a =" << x << "b mod " << m << endl << flush;
+ cout << "size of m" << m.bitsize() << endl << flush;
+
+ Ints Z;
+ WangClassicRationalReconstruction<Ints> RRB(Z,true,false);
+ //RationalReconstruction<Ints, WangClassicRationalReconstruction<Ints> > RR(RRB);
+ //RationalReconstruction<Ints, MaxQClassicRationalReconstruction<Ints> > RR(Z);
+ //RationalReconstruction<Ints, WangFastRationalReconstruction<Ints> > RR(Z);
+ RationalReconstruction<Ints, MaxQFastRationalReconstruction<Ints> > RR(Z);
+
+ LinBox::UserTimer t;
+ t.clear();
+ t.start();
+
+ for (int i=0; i < 1 ; ++i) {
+ if (RR.reconstructRational(a,b,x,m,5)) {
+ cout << "Found a,b: "<< a <<"=" << x << "x" << b << " mod " << m << endl << flush;
+ cout << "Does agree with bounds\n";
+ }
+ else {
+ cout << "Found a,b: "<< a <<"=" << x << "x" << b << " mod " << m << endl << flush;
+ cout << "Does not agree with bounds\n";
+ }
+ }
+ t.stop();
+ cout << "Time:";
+ t.print(cout);
+ cout << endl;
+
+ return 0 ;
+
+}
+
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+
diff --git a/examples/samplebb.C b/examples/samplebb.C
new file mode 100644
index 0000000..e198ecc
--- /dev/null
+++ b/examples/samplebb.C
@@ -0,0 +1,277 @@
+
+/*
+ * examples/samplebb.C
+ *
+ * Copyright (C) 2005, 2010 D Saunders
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ * ========LICENCE========
+ */
+
+/** \file examples/samplebb.C
+ * @example examples/samplebb.C
+ * \ingroup examples
+ * \brief generate an example matrix with specified frobenius form.
+ *
+ * samplebb takes options and any number of argument triples denoting companion
+ * matrix blocks.
+ * For example, the call "samplebb -r 7 2 3 a3 1 1" generates a sparsely
+ * randomized matrix (because of the '-r' option) matrix which is similar
+ * (because of the two triples '7 2 3' and 'a2 1 1') to a direct sum of 3
+ * companion matrices for (x-7)^2 plus one companion matrix for x^3 + x + 2, the
+ * polynomial denoted by 'a3'.
+ *
+ * In general, in the first position of each triple 'aK' denotes the polynomial
+ * x^k + x + K-1 and a number n denotes the polynomial x-n. The second number
+ * in the triple specifies a power of the polynomial and the third specifies how
+ * many companion matrix blocks for that power of that polynomial.
+ *
+ * Possible options are
+ * -r lightly randomized similarity transform, matrix remains sparse.
+ * -R fully randomized similarity transform, matrix becomes dense.
+ *
+ * The matrix is written to standard out in SMS format (triples).
+ *
+ * For some other examples:
+ * "samplebb 1 1 2 2 1 2 4 1 2 12 1 1 0 1 1" is a 8 by 8 diagonal matrix in smith form,
+ * diag(1,1,2,2,4,4,12,0)
+ *
+ */
+
+#include <iostream>
+#include <string>
+#include <list>
+#include <vector>
+#include <linbox/blackbox/direct-sum.h>
+#include <linbox/blackbox/companion.h>
+#include <linbox/algorithms/matrix-hom.h>
+#include <linbox/ring/ntl.h>
+#include <NTL/ZZX.h>
+#include <linbox/vector/blas-vector.h>
+
+using std::string;
+using std::list;
+using LinBox::Companion;
+using LinBox::DirectSum;
+using LinBox::DenseMatrix;
+using LinBox::NTL_ZZ;
+using NTL::ZZX;
+
+
+void stripOptions(int& acp, char* avp[], string& opts, const int ac, char** av)
+{
+ acp = 0;
+ for (int i = 1; i < ac; ++i)
+ {
+ //std::cout << av[i] << " ";
+ if (av[i][0] == '-') {
+ for (const char* j = av[i]+1; *j != 0; ++j)
+ opts.push_back(*j);
+ }
+
+ else {
+ avp[acp] = av[i];
+ ++acp;
+ }
+ }
+}
+
+template <class List, class Ring>
+void augmentBB(List& L, char* code, int e, int k, const Ring& R)
+{
+ typedef typename Ring::Element Int;
+ Int a;
+ ZZX p;
+
+ // build poly p
+
+ if ( *code != 'a') // build linear poly
+ {
+ R.init(a, -atoi(code));
+ p += ZZX(0, a);
+ p += ZZX(1, R.one);
+ }
+ else // build long poly
+ {
+ int n = atoi(code+1);
+ R.init(a, n-1);
+ p += ZZX(n, R.one);
+ p += ZZX(1, R.one);
+ p += ZZX(0, a);
+ }
+
+ //std::cout << "(code, e, k) =(" << code << ", " << e << ", " << k << ")" << std::endl;
+ //std::cout << "Correspoding poly: " << p << std::endl;
+ // compute q = p^e
+ ZZX q(0, R.one);
+ for(int i = 0; i < e; ++i) q *= p;
+ //std::cout <<"Polynomial: " << q << std::endl;
+
+ LinBox::DenseVector<Ring> v(R,deg(q)+1);
+ for (int i = 0; i < v.size(); ++i) v[i] = coeff(q, i);
+
+ // companion matrix of q
+ Companion<Ring>* C = new Companion<Ring>(R, v);
+ for(int i = 0; i < k; ++i) L.push_back(C);
+
+}
+
+template < class Ring >
+void scramble(DenseMatrix<Ring>& M)
+{
+
+ Ring R = M.field();
+
+ int N,n = M.rowdim(); // number of random basic row and col ops.
+ N = 2*n;
+
+ for (int k = 0; k < N; ++k) {
+
+ int i = rand()%M.rowdim();
+
+ int j = rand()%M.coldim();
+
+ if (i == j) continue;
+
+ // M*i += alpha M*j and Mj* -= alpha Mi*
+
+ typename Ring::Element alpha, beta, x;
+ R.init(alpha, rand()%5 - 2);
+ R.neg(beta, alpha);
+
+ for (size_t l = 0; l < M.rowdim(); ++l) if (!R.isZero(alpha)) {
+ R.mul(x, alpha, M[l][j]);
+ R.addin(M[l][i], x);
+ }
+
+
+ for (size_t l = 0; l < M.rowdim(); ++l) if (!R.isZero(alpha)) {
+ R.mul(x, beta, M[i][l]);
+ R.addin(M[j][l], x);
+ }
+ }
+
+ /*
+ std::ofstream out("matrix", std::ios::out);
+
+ //M. write(std::cout);
+
+ out << n << " " << n << "\n";
+
+ for (int i = 0; i < n; ++ i) {
+
+ for ( int j = 0; j < n; ++ j) {
+
+ R. write(out, M[i][j]);
+
+ out << " ";
+ }
+
+ out << "\n";
+
+ }
+ */
+
+}
+
+template <class Matrix>
+void printMatrix (const Matrix& A)
+{
+ int m = A. rowdim();
+ int n = A. coldim();
+ typedef typename Matrix::Field Ring;
+ typedef typename Ring::Element Element;
+ const Ring &r = A.field();
+ LinBox::DenseVector<Ring> x(r,m), y(r,n);
+
+ std::cout << m << " " << n << " M" << std::endl;
+ typename LinBox::DenseVector<Ring>::iterator y_p;
+ for (int i = 0; i < m; ++ i) {
+ r. assign (x[i], r.one);
+ A. applyTranspose(y, x);
+ for(y_p = y. begin(); y_p != y. end(); ++ y_p)
+ if (! r.isZero(*y_p))
+ std::cout << i+1 << " " << y_p - y.begin() + 1 << " " << *y_p << std::endl;
+ r. assign (x[i], r.zero);
+ }
+ std::cout << "0 0 0" << std::endl;
+}
+
+
+int main(int ac, char* av[])
+{
+ if (ac < 2)
+ { std::cout << "usage: " << av[0] <<
+ " options block-groups." << std::endl;
+ std::cout << av[0] << " -r 1 2 3 a4 1 1" << std::endl;
+ std::cout <<
+ "for lightly randomized matrix similar to direct sum of 3 copies of companion " << std::endl
+ << "matrix of (x-1)^2 and one copy of companion matrix of (x^4 + x + 3)^1." << std::endl;
+ }
+
+ typedef NTL_ZZ Ring;
+ Ring Z;
+ typedef Companion<Ring> BB;
+ int acp; char* avp[ac];
+ string opts;
+ stripOptions(acp, avp, opts, ac, av);
+ //std::cout << "number of triples: " << acp << std::endl;
+ //for (int i = 0; i < acp; ++ i)
+ // std::cout << avp[i];
+ //std::cout << std::endl;
+ //std::cout << "Begin to ....\n";
+ list<BB*> L;
+
+ for (int i = 0; i < acp; i += 3)
+ augmentBB(L, avp[i], atoi(avp[i+1]), atoi(avp[i+2]), Z);
+
+ DirectSum<BB> A(L);
+ //std::cout <<"Option: " << opts.c_str() << std::endl;
+
+ if (opts.size() >= 1)
+ { if (opts[0] == 'r')
+ {
+ // into sparse matrix, then 3n row ops with corresponding col ops
+ DenseMatrix<Ring> B(Z,A.rowdim(), A.coldim());
+ //MatrixDomain<Ring> MD(Z);
+ LinBox::MatrixHom::map (B, A);
+
+ scramble(B);
+ printMatrix(B);
+ // delete B;
+ }
+
+ if (opts[0] == 'R') { throw LinBox::NotImplementedYet(); }
+ // into dense matrix, then many row ops
+ //...
+
+ }
+ else {
+ printMatrix (A);
+ }
+
+ return 0 ;
+}
+
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+
diff --git a/examples/smith.C b/examples/smith.C
index fb852af..f359bb4 100644
--- a/examples/smith.C
+++ b/examples/smith.C
@@ -47,6 +47,8 @@
This example was used during the design process of the adaptive algorithm.
*/
+#include <linbox/linbox-config.h>
+
#include <iostream>
#include <string>
#include <vector>
@@ -55,18 +57,17 @@
using namespace std;
-#include "linbox/field/modular.h"
-#include "linbox/blackbox/sparse.h"
-#include "linbox/algorithms/smith-form-sparseelim-local.h"
+#include <linbox/ring/modular.h>
+#include <linbox/matrix/sparse-matrix.h>
+#include <linbox/algorithms/smith-form-sparseelim-local.h>
-#include "linbox/util/timer.h"
+#include <linbox/util/timer.h>
-#include "linbox/field/unparametric.h"
-#include "linbox/field/local2_32.h"
-#include "linbox/field/PIR-modular-int32.h"
-#include "linbox/algorithms/smith-form-local.h"
-#include "linbox/algorithms/smith-form-iliopoulos.h"
-#include "linbox/algorithms/smith-form-adaptive.h"
+#include <linbox/ring/local2_32.h>
+#include <linbox/ring/PIR-modular-int32.h>
+#include <linbox/algorithms/smith-form-local.h>
+#include <linbox/algorithms/smith-form-iliopoulos.h>
+#include <linbox/algorithms/smith-form-adaptive.h>
using namespace LinBox;
@@ -74,7 +75,7 @@ using namespace LinBox;
template<class PIR>
-void Mat(BlasMatrix<PIR>& M, PIR& R, int n,
+void Mat(DenseMatrix<PIR>& M, PIR& R, int n,
string src, string file, string format);
template<class I1, class Lp> void distinct (I1 a, I1 b, Lp& c);
@@ -100,7 +101,7 @@ int main(int argc, char* argv[])
string algo = argv[1];
- int m = atoi(argv[2]);
+ unsigned long m = atoi(argv[2]);
int n = atoi(argv[3]);
@@ -114,11 +115,16 @@ int main(int argc, char* argv[])
if (algo == "adaptive")
{
- typedef PID_integer Ints;
+ typedef Givaro::ZRing<Integer> Ints;
Ints Z;
- BlasMatrix<Ints> M(Z);
- Mat(M, Z, n, src, file, format);
- vector<integer> v(n);
+ DenseMatrix<Ints> M(Z);
+
+ std::ifstream input (file);
+ //MatrixStream<Ints> ms(Z, input);
+ M.read(input);
+ //Mat(M, Z, n, src, file, format);
+
+ DenseVector<Givaro::ZRing<Integer> > v(Z,(size_t)n);
T.start();
SmithFormAdaptive::smithForm(v, M);
T.stop();
@@ -137,9 +143,9 @@ int main(int argc, char* argv[])
}
else if (algo == "ilio") {
- PIR R(m);
+ PIR R( (int32_t)m);
- BlasMatrix<PIR> M(R);
+ DenseMatrix<PIR> M(R);
Mat(M, R, n, src, file, format);
@@ -154,7 +160,7 @@ int main(int argc, char* argv[])
List L;
for (size_t i = 0; i < M.rowdim(); ++i)
- L.push_back(M[(int)i][i]);
+ L.push_back(M[(size_t)i][(size_t)i]);
list<pair<PIR::Element, size_t> > p;
@@ -172,13 +178,13 @@ int main(int argc, char* argv[])
else if (algo == "local") { // m must be a prime power
if (format == "sparse" ) {
- typedef Modular<int32_t> Field;
+ typedef Givaro::Modular<int32_t> Field;
Field F(m);
std::ifstream input (argv[4]);
if (!input) { std::cerr << "Error opening matrix file: " << argv[1] << std::endl; return -1; }
MatrixStream<Field> ms( F, input );
- SparseMatrix<Field, Vector<Field>::SparseSeq > B (ms);
+ SparseMatrix<Field, SparseMatrixFormat::SparseSeq > B (ms);
std::cout << "B is " << B.rowdim() << " by " << B.coldim() << std::endl;
if (B.rowdim() <= 20 && B.coldim() <= 20) B.write(std::cout) << std::endl;
@@ -186,19 +192,19 @@ int main(int argc, char* argv[])
Integer p(m), im(m);
// Should better ask user to give the prime !!!
- for(unsigned int k = 2; ( ( ! Givaro::probab_prime(p) ) && (p > 1) ); ++k)
- Givaro::root( p, im, k );
+ Givaro::IntPrimeDom IPD;
+ for(unsigned int k = 2; ( ( ! IPD.isprime(p) ) && (p > 1) ); ++k)
+ Givaro::root( p, im, k );
- // using Sparse Elimination
+ // using Sparse Elimination
LinBox::PowerGaussDomain< Field > PGD( F );
- std::vector<std::pair<size_t,size_t> > local;
+ std::vector<std::pair<size_t,Field::Element> > local;
- PGD(local, B, m, (int)p);
+ PGD(local, B, (int32_t)m, (int32_t)p);
typedef list< Field::Element > List;
List L;
- for ( std::vector<std::pair<size_t,size_t> >::iterator
- p_it = local.begin(); p_it != local.end(); ++p_it) {
+ for ( auto p_it = local.begin(); p_it != local.end(); ++p_it) {
for(size_t i = 0; i < (size_t) p_it->first; ++i)
L.push_back((Field::Element)p_it->second);
}
@@ -219,9 +225,9 @@ int main(int argc, char* argv[])
}
else {
- PIR R(m);
+ PIR R( (int32_t)m);
- BlasMatrix<PIR> M(R);
+ DenseMatrix<PIR> M(R);
Mat(M, R, n, src, file, format);
@@ -255,7 +261,7 @@ int main(int argc, char* argv[])
Local2_32 R;
- BlasMatrix<Local2_32> M(R);
+ DenseMatrix<Local2_32> M(R);
Mat(M, R, n, src, file, format);
@@ -298,7 +304,7 @@ int main(int argc, char* argv[])
}
template < class Ring >
-void scramble(BlasMatrix<Ring>& M)
+void scramble(DenseMatrix<Ring>& M)
{
Ring R = M.field();
@@ -323,15 +329,15 @@ void scramble(BlasMatrix<Ring>& M)
if (a)
- R.subin(M[(int)l][i], M[(int)l][j]);
+ R.subin(M[(size_t)l][(size_t)i], M[(size_t)l][(size_t)j]);
else
- R.addin(M[(int)l][i], M[(int)l][j]);
+ R.addin(M[(size_t)l][(size_t)i], M[(size_t)l][(size_t)j]);
//K.axpy(c, M.getEntry(l, i), x, M.getEntry(l, j));
//M.setEntry(l, i, c);
- }
+ }
//a = rand()%2;
@@ -339,10 +345,10 @@ void scramble(BlasMatrix<Ring>& M)
if (a)
- R.subin(M[i][l], M[j][l]);
+ R.subin(M[(size_t)i][l], M[(size_t)j][l]);
else
- R.addin(M[i][l], M[j][l]);
+ R.addin(M[(size_t)i][l], M[(size_t)j][l]);
}
}
@@ -354,14 +360,14 @@ void scramble(BlasMatrix<Ring>& M)
for ( int j = 0; j < n; ++ j) {
- R. write(out, M[i][j]);
+ R. write(out, M[(size_t)i][(size_t)j]);
out << " ";
}
out << "\n";
- }
+ }
//}
}
@@ -370,9 +376,8 @@ void scramble(BlasMatrix<Ring>& M)
// This mat will have s, near sqrt(n), distinct invariant factors,
// each repeated twice), involving the s primes 101, 103, ...
template <class PIR>
-void RandomRoughMat(BlasMatrix<PIR>& M, PIR& R, int n) {
- typename PIR::Element zero; R.init(zero, 0);
- M.resize(n, n, zero);
+void RandomRoughMat(DenseMatrix<PIR>& M, PIR& R, int n) {
+ M.resize((size_t)n, (size_t)n, R.zero);
if (n > 10000) {cerr << "n too big" << endl; exit(-1);}
int jth_factor[130] =
{2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67,
@@ -389,8 +394,8 @@ void RandomRoughMat(BlasMatrix<PIR>& M, PIR& R, int n) {
{
typename PIR::Element v; R.init(v, jth_factor[25+j]);
for (int k = j ; k > 0 && i < n ; --k)
- { M[i][i] = v; ++i;
- if (i < n) {M[i][i] = v; ++i;}
+ { M[(size_t)i][(size_t)i] = v; ++i;
+ if (i < n) {M[(size_t)i][(size_t)i] = v; ++i;}
}
}
scramble(M);
@@ -399,13 +404,12 @@ void RandomRoughMat(BlasMatrix<PIR>& M, PIR& R, int n) {
// This mat will have the same nontrivial invariant factors as
// diag(1,2,3,5,8, ... 999, 0, 1, 2, ...).
template <class PIR>
-void RandomFromDiagMat(BlasMatrix<PIR>& M, PIR& R, int n) {
- typename PIR::Element zero; R.init(zero, 0);
- M.resize(n, n, zero);
+void RandomFromDiagMat(DenseMatrix<PIR>& M, PIR& R, int n) {
+ M.resize((size_t)n,(size_t) n, R.zero);
for (int i= 0 ; i < n; ++i)
- R.init(M[i][i], i % 1000 + 1);
+ R.init(M[(size_t)i][(size_t)i], i % 1000 + 1);
scramble(M);
}
@@ -417,13 +421,12 @@ void RandomFromDiagMat(BlasMatrix<PIR>& M, PIR& R, int n) {
// where fib(1) = 1, fib(2) = 2. But note that, depending on n,
// the last block may be truncated, thus repeating an earlier fibonacci number.
template <class PIR>
-void RandomFibMat(BlasMatrix<PIR>& M, PIR& R, int n) {
- typename PIR::Element zero; R.init(zero, 0);
- M.resize(n, n, zero);
+void RandomFibMat(DenseMatrix<PIR>& M, PIR& R, int n) {
+ M.resize((size_t)n,(size_t) n, R.zero);
- typename PIR::Element one; R.init(one, 1);
+ typename PIR::Element pmone; R.assign(pmone, R.one);
- for (int i= 0 ; i < n; ++i) M[i][i] = one;
+ for (int i= 0 ; i < n; ++i) M[(size_t)i][(size_t)i] = R.one;
int j = 1, k = 0;
@@ -431,18 +434,18 @@ void RandomFibMat(BlasMatrix<PIR>& M, PIR& R, int n) {
if ( i == k) {
- M[i][i+1] = zero;
+ M[(size_t)i][(size_t)i+1] = R.zero;
k += ++j;
}
else {
- M[i][i+1] = one;
+ M[(size_t)i][(size_t)i+1] = pmone;
- R.negin(one);
+ R.negin(pmone);
}
- R.neg(M[i+1][i], M[i][i+1]);
+ R.neg(M[(size_t)i+1][(size_t)i], M[(size_t)i][(size_t)i+1]);
}
scramble(M);
}
@@ -453,9 +456,8 @@ void RandomFibMat(BlasMatrix<PIR>& M, PIR& R, int n) {
// Trefethen's challenge #7 mat (primes on diag, 1's on 2^e bands).
template <class PIR>
-void TrefMat(BlasMatrix<PIR>& M, PIR& R, int n) {
- typename PIR::Element zero; R.init(zero, 0);
- M.resize(n, n, zero);
+void TrefMat(DenseMatrix<PIR>& M, PIR& R, int n) {
+ M.resize((size_t)n, (size_t)n, R.zero);
std::vector<int> power2;
@@ -472,17 +474,17 @@ void TrefMat(BlasMatrix<PIR>& M, PIR& R, int n) {
for ( i = 0; i < n; ++ i)
- in >> M[i][i];
+ in >> M[(size_t)i][(size_t)i];
std::vector<int>::iterator p;
for ( i = 0; i < n; ++ i) {
for ( p = power2. begin(); (p != power2. end()) && (*p <= i); ++ p)
- M[i][i - *p] = 1;
+ M[(size_t)i][(size_t)(i - *p)] = 1;
for ( p = power2. begin(); (p != power2. end()) && (*p < n - i); ++ p)
- M[i][i + *p] = 1;
+ M[(size_t)i][(size_t)(i + *p)] = 1;
}
}
@@ -496,8 +498,8 @@ struct pwrlist
}
integer operator[](int e)
{
- for (int i = (int)m.size(); i <= e; ++i) m.push_back(m[1]*m[i-1]);
- return m[e];
+ for (int i = (int)m.size(); i <= e; ++i) m.push_back(m[1]*m[(size_t)i-1]);
+ return m[(size_t)e];
}
};
@@ -520,7 +522,7 @@ num& qread(num& Val, pwrlist& M, istream& in)
}
template <class PIR>
-void KratMat(BlasMatrix<PIR>& M, PIR& R, int q, istream& in)
+void KratMat(DenseMatrix<PIR>& M, PIR& R, int q, istream& in)
{
pwrlist pwrs(q);
for (unsigned int i = 0; i < M.rowdim(); ++ i)
@@ -528,14 +530,16 @@ void KratMat(BlasMatrix<PIR>& M, PIR& R, int q, istream& in)
for ( unsigned int j = 0; j < M.coldim(); ++ j) {
int Val;
qread(Val, pwrs, in);
- R. init (M[i][j], Val);
+ R. init (M[(size_t)i][(size_t)j], Val);
}
}
///// end krat ////////////////////////////
+//! @bug this already exists elsewhere
template<class I1, class Lp>
void distinct (I1 a, I1 b, Lp& c)
-{ typename I1::value_type e;
+{
+ typename iterator_traits<I1>::value_type e;
size_t count = 0;
if (a != b) {e = *a; ++a; count = 1;}
else return;
@@ -577,10 +581,9 @@ void display(I b, I e)
Also "tref" and file with format "kdense"
*/
template <class PIR>
-void Mat(BlasMatrix<PIR>& M, PIR& R, int n,
+void Mat(DenseMatrix<PIR>& M, PIR& R, int n,
string src, string file, string format) {
- typename PIR::Element zero; R.init(zero, 0);
if (src == "random-rough") RandomRoughMat(M, R, n);
else if (src == "random") RandomFromDiagMat(M, R, n);
@@ -599,7 +602,7 @@ void Mat(BlasMatrix<PIR>& M, PIR& R, int n,
in >> rdim >> cdim;
- M. resize (rdim, cdim);
+ M. resize ((size_t)rdim, (size_t)cdim);
integer Val;
@@ -611,7 +614,7 @@ void Mat(BlasMatrix<PIR>& M, PIR& R, int n,
in >> Val;
- R. init (M[i][j], Val);
+ R. init (M[(size_t)i][(size_t)j], Val);
}
}
@@ -634,7 +637,7 @@ void Mat(BlasMatrix<PIR>& M, PIR& R, int n,
if ( i == 0) break;
- R. init (M[i-1][j-1], val);
+ R. init (M[(size_t)i-1][(size_t)j-1], val);
} while (true);
diff --git a/examples/smithvalence.C b/examples/smithvalence.C
index 110d3d9..4487684 100644
--- a/examples/smithvalence.C
+++ b/examples/smithvalence.C
@@ -26,7 +26,8 @@
\brief Valence of sparse matrix over Z or Zp.
\ingroup examples
*/
-//#include "linbox-config.h"
+#include <linbox/linbox-config.h>
+
#include <iostream>
#include "smithvalence.h"
@@ -35,28 +36,33 @@ using namespace LinBox;
int main (int argc, char **argv)
{
- // commentator().setMaxDetailLevel (-1);
- // commentator().setMaxDepth (-1);
- // commentator().setReportStream (std::cerr);
-
+ commentator().setMaxDetailLevel (-1);
+ commentator().setMaxDepth (-1);
+ commentator().setReportStream (std::cerr);
+
if (argc < 2 || argc > 4) {
- std::cerr << "Usage: valence <matrix-file-in-supported-format> [-ata|-aat|valence] [coprime]" << std::endl;
+ std::cerr << "Usage: smithvalence <matrix-file-in-supported-format> [-ata|-aat|valence] [coprime]" << std::endl;
+ std::cerr << " Optional parameters valence and coprime are integers." << std::endl;
+ std::cerr << " Prime factors of valence will be used for local computation." << std::endl;
+ std::cerr << " coprime will be used for overall rank computation." << std::endl;
+
+
return -1;
}
std::ifstream input (argv[1]);
if (!input) { std::cerr << "Error opening matrix file " << argv[1] << std::endl; return -1; }
- PID_integer ZZ;
- MatrixStream< PID_integer > ms( ZZ, input );
- typedef SparseMatrix<PID_integer> Blackbox;
+ Givaro::ZRing<Integer> ZZ;
+ MatrixStream< Givaro::ZRing<Integer> > ms( ZZ, input );
+ typedef SparseMatrix<Givaro::ZRing<Integer> > Blackbox;
Blackbox A (ms);
input.close();
std::cout << "A is " << A.rowdim() << " by " << A.coldim() << std::endl;
- PID_integer::Element val_A;
+ Givaro::ZRing<Integer>::Element val_A;
Givaro::Timer chrono; chrono.start();
if (argc >= 3) {
@@ -164,7 +170,7 @@ int main (int argc, char **argv)
}
}
}
-
+
std::vector<size_t>::const_iterator rit=ranks.begin();
// unsigned long modrank = *rit;
for(++rit; rit!= ranks.end(); ++rit) {
@@ -182,7 +188,8 @@ int main (int argc, char **argv)
dit != SmithDiagonal.end(); ++dit) {
if (*dit == si) ++num;
else {
- std::cerr << '[' << si << ',' << num << "] ";
+ if (num > 0)
+ std::cerr << '[' << si << ',' << num << "] ";
num=1;
si = *dit;
}
diff --git a/examples/smithvalence.h b/examples/smithvalence.h
index 4305d89..91cdc0d 100644
--- a/examples/smithvalence.h
+++ b/examples/smithvalence.h
@@ -22,23 +22,24 @@
/**\file examples/smithvalence.h
* @example examples/smithvalence.h
- \brief Valence of sparse matrix over Z or Zp.
- \ingroup examples
- */
-
+ \brief Valence of sparse matrix over Z or Zp.
+ \ingroup examples
+ */
+
+#include <givaro/modular.h>
#include <givaro/givintnumtheo.h>
-#include "linbox/field/gf2.h"
-#include "linbox/field/modular.h"
-#include "linbox/field/givaro.h"
-#include "linbox/field/field-traits.h"
-#include "linbox/blackbox/transpose.h"
-#include "linbox/blackbox/compose.h"
-#include "linbox/blackbox/sparse.h"
-#include "linbox/solutions/rank.h"
-#include "linbox/solutions/valence.h"
-#include "linbox/algorithms/smith-form-sparseelim-local.h"
-#include "linbox/util/matrix-stream.h"
-#include "linbox/util/timer.h"
+
+#include <givaro/gf2.h>
+#include <linbox/field/field-traits.h>
+#include <linbox/blackbox/transpose.h>
+#include <linbox/blackbox/compose.h>
+#include <linbox/matrix/sparse-matrix.h>
+#include <linbox/solutions/rank.h>
+#include <linbox/solutions/valence.h>
+#include <linbox/algorithms/smith-form-sparseelim-local.h>
+#include <linbox/util/matrix-stream.h>
+#include <linbox/util/timer.h>
+#include <linbox/util/error.h>
template<class Field>
@@ -46,7 +47,7 @@ unsigned long& TempLRank(unsigned long& r, char * filename, const Field& F)
{
std::ifstream input(filename);
LinBox::MatrixStream< Field > msf( F, input );
- LinBox::SparseMatrix<Field,typename LinBox::Vector<Field>::SparseSeq> FA(msf);
+ LinBox::SparseMatrix<Field,LinBox::SparseMatrixFormat::SparseSeq> FA(msf);
input.close();
LinBox::Timer tim; tim.start();
LinBox::rankin(r, FA);
@@ -71,36 +72,36 @@ unsigned long& TempLRank(unsigned long& r, char * filename, const LinBox::GF2& F
unsigned long& LRank(unsigned long& r, char * filename,Givaro::Integer p)
{
-Givaro::Integer maxmod16; LinBox::FieldTraits<LinBox::GivaroZpz<Givaro::Std16> >::maxModulus(maxmod16);
-Givaro::Integer maxmod32; LinBox::FieldTraits<LinBox::GivaroZpz<Givaro::Std32> >::maxModulus(maxmod32);
-Givaro::Integer maxmod53; LinBox::FieldTraits<LinBox::Modular<double> >::maxModulus(maxmod53);
-Givaro::Integer maxmod64; LinBox::FieldTraits<LinBox::GivaroZpz<Givaro::Std64> >::maxModulus(maxmod64);
+ Givaro::Integer maxmod16; LinBox::FieldTraits<Givaro::Modular<int16_t> >::maxModulus(maxmod16);
+ Givaro::Integer maxmod32; LinBox::FieldTraits<Givaro::Modular<int32_t> >::maxModulus(maxmod32);
+ Givaro::Integer maxmod53; LinBox::FieldTraits<Givaro::Modular<double> >::maxModulus(maxmod53);
+ Givaro::Integer maxmod64; LinBox::FieldTraits<Givaro::Modular<int64_t> >::maxModulus(maxmod64);
if (p == 2) {
LinBox::GF2 F2;
return TempLRank(r, filename, F2);
}
else if (p <= maxmod16) {
- typedef LinBox::GivaroZpz<Givaro::Std16> Field;
+ typedef Givaro::Modular<int16_t> Field;
Field F(p);
return TempLRank(r, filename, F);
}
else if (p <= maxmod32) {
- typedef LinBox::GivaroZpz<Givaro::Std32> Field;
+ typedef Givaro::Modular<int32_t> Field;
Field F(p);
return TempLRank(r, filename, F);
}
else if (p <= maxmod53) {
- typedef LinBox::Modular<double> Field;
+ typedef Givaro::Modular<double> Field;
Field F(p);
return TempLRank(r, filename, F);
}
else if (p <= maxmod64) {
- typedef LinBox::GivaroZpz<Givaro::Std64> Field;
+ typedef Givaro::Modular<int64_t> Field;
Field F(p);
return TempLRank(r, filename, F);
}
else {
- typedef LinBox::GivaroZpz<Givaro::Integer> Field;
+ typedef Givaro::Modular<Givaro::Integer> Field;
Field F(p);
return TempLRank(r, filename, F);
}
@@ -109,33 +110,33 @@ Givaro::Integer maxmod64; LinBox::FieldTraits<LinBox::GivaroZpz<Givaro::Std64> >
std::vector<size_t>& PRank(std::vector<size_t>& ranks, size_t& effective_exponent, char * filename,Givaro::Integer p, size_t e, size_t intr)
{
- effective_exponent = e;
- Givaro::Integer maxmod;
- LinBox::FieldTraits<LinBox::GivaroZpz<Givaro::Std64> >::maxModulus(maxmod);
+ effective_exponent = e;
+ Givaro::Integer maxmod;
+ LinBox::FieldTraits<Givaro::Modular<int64_t> >::maxModulus(maxmod);
if (p <= maxmod) {
- typedef LinBox::GivaroZpz<Givaro::Std64> Ring;
+ typedef Givaro::Modular<int64_t> Ring;
int64_t lp(p);
- Givaro::Integer q = pow(p,e); int64_t lq(q);
+ Givaro::Integer q = pow(p,e); int64_t lq(q);
if (q >Givaro::Integer(lq)) {
std::cerr << "Power rank might need extra large composite (" << p << '^' << e << ")." << std::endl;
- // << "Such a large composite is not yet implemented ..." << std::endl;
- q = p; lq = (int64_t)q;
- for(effective_exponent=1; q == Givaro::Integer(lq); ++effective_exponent) {
- q *= p; lq = (int64_t)q;
+ q = p;
+ for(effective_exponent=1; q <= Ring::maxCardinality(); ++effective_exponent) {
+ q *= p;
}
- q/=p; --effective_exponent; lq = (int64_t)q;
+ q/=p; --effective_exponent;
+ lq = (int64_t)q;
std::cerr << "First trying: " << lq << " (=" << p << '^' << effective_exponent << ", without further warning this will be sufficient)." << std::endl;
}
Ring F(lq);
std::ifstream input(filename);
LinBox::MatrixStream<Ring> ms( F, input );
- LinBox::SparseMatrix<Ring, LinBox::Vector<Ring>::SparseSeq > A (ms);
+ LinBox::SparseMatrix<Ring,LinBox::SparseMatrixFormat::SparseSeq > A (ms);
input.close();
LinBox::PowerGaussDomain< Ring > PGD( F );
- LinBox::Timer tim; tim.clear(); tim.start();
+ LinBox::Timer tim; tim.clear(); tim.start();
PGD.prime_power_rankin( lq, lp, ranks, A, A.rowdim(), A.coldim(), std::vector<size_t>());
- tim.stop();
+ tim.stop();
F.write(std::cerr << "Ranks over ") << " are " ;
for(std::vector<size_t>::const_iterator rit=ranks.begin(); rit != ranks.end(); ++rit)
std::cerr << *rit << ' ';
@@ -149,74 +150,81 @@ std::vector<size_t>& PRank(std::vector<size_t>& ranks, size_t& effective_exponen
return ranks;
}
-#include "linbox/algorithms/smith-form-sparseelim-poweroftwo.h"
+#include <linbox/algorithms/smith-form-sparseelim-poweroftwo.h>
std::vector<size_t>& PRankPowerOfTwo(std::vector<size_t>& ranks, size_t& effective_exponent, char * filename, size_t e, size_t intr)
{
- effective_exponent = e;
- typedef uint64_t RingElements;
- if (e > 63) {
- std::cerr << "Power rank power of two might need extra large composite (2^" << e << ")." << std::endl;
- std::cerr << "First trying: 63, without further warning this will be sufficient)." << std::endl;
- effective_exponent = 63;
- }
-
- std::ifstream input(filename);
- typedef LinBox::UnparametricField<int64_t> Ring;
- Ring F;
- LinBox::MatrixStream<Ring> ms( F, input );
- LinBox::SparseMatrix<Ring, LinBox::Vector<Ring>::SparseSeq > A (ms);
- input.close();
- LinBox::PowerGaussDomainPowerOfTwo< uint64_t > PGD;
-
- LinBox::Timer tim; tim.clear(); tim.start();
- PGD.prime_power_rankin( effective_exponent, ranks, A, A.rowdim(), A.coldim(), std::vector<size_t>());
- tim.stop();
- std::cerr << "Ranks over 2^" << effective_exponent << " are " ;
- for(std::vector<size_t>::const_iterator rit=ranks.begin(); rit != ranks.end(); ++rit)
- std::cerr << *rit << ' ';
- std::cerr << ' ' << tim << std::endl;
- return ranks;
+ effective_exponent = e;
+ if (e > 63) {
+ std::cerr << "Power rank power of two might need extra large composite (2^" << e << ")." << std::endl;
+ std::cerr << "First trying: 63, without further warning this will be sufficient)." << std::endl;
+ effective_exponent = 63;
+ }
+
+ std::ifstream input(filename);
+ typedef Givaro::ZRing<int64_t> Ring;
+ Ring F;
+ LinBox::MatrixStream<Ring> ms( F, input );
+ LinBox::SparseMatrix<Ring,LinBox::SparseMatrixFormat::SparseSeq > A (ms);
+ input.close();
+ LinBox::PowerGaussDomainPowerOfTwo< uint64_t > PGD;
+
+ LinBox::Timer tim; tim.clear(); tim.start();
+ PGD.prime_power_rankin( effective_exponent, ranks, A, A.rowdim(), A.coldim(), std::vector<size_t>());
+ tim.stop();
+ std::cerr << "Ranks over 2^" << effective_exponent << " are " ;
+ for(std::vector<size_t>::const_iterator rit=ranks.begin(); rit != ranks.end(); ++rit)
+ std::cerr << *rit << ' ';
+ std::cerr << ' ' << tim << std::endl;
+ return ranks;
}
std::vector<size_t>& PRankInteger(std::vector<size_t>& ranks, char * filename,Givaro::Integer p, size_t e, size_t intr)
{
- typedef LinBox::GivaroZpz<Givaro::Integer> Ring;
- Givaro::Integer q = pow(p,e);
- Ring F(q);
- std::ifstream input(filename);
- LinBox::MatrixStream<Ring> ms( F, input );
- LinBox::SparseMatrix<Ring, LinBox::Vector<Ring>::SparseSeq > A (ms);
- input.close();
- LinBox::PowerGaussDomain< Ring > PGD( F );
-
- LinBox::Timer tim; tim.clear(); tim.start();
- PGD.prime_power_rankin( q, p, ranks, A, A.rowdim(), A.coldim(), std::vector<size_t>());
- tim.stop();
- F.write(std::cerr << "Ranks over ") << " are " ;
- for(std::vector<size_t>::const_iterator rit=ranks.begin(); rit != ranks.end(); ++rit)
- std::cerr << *rit << ' ';
- std::cerr << ' ' << tim << std::endl;
- return ranks;
+ typedef Givaro::Modular<Givaro::Integer> Ring;
+ Givaro::Integer q = pow(p,e);
+ Ring F(q);
+ std::ifstream input(filename);
+ LinBox::MatrixStream<Ring> ms( F, input );
+ LinBox::SparseMatrix<Ring,LinBox::SparseMatrixFormat::SparseSeq > A (ms);
+ input.close();
+ LinBox::PowerGaussDomain< Ring > PGD( F );
+
+ LinBox::Timer tim; tim.clear(); tim.start();
+ PGD.prime_power_rankin( q, p, ranks, A, A.rowdim(), A.coldim(), std::vector<size_t>());
+ tim.stop();
+ F.write(std::cerr << "Ranks over ") << " are " ;
+ for(std::vector<size_t>::const_iterator rit=ranks.begin(); rit != ranks.end(); ++rit)
+ std::cerr << *rit << ' ';
+ std::cerr << ' ' << tim << std::endl;
+ return ranks;
}
std::vector<size_t>& PRankIntegerPowerOfTwo(std::vector<size_t>& ranks, char * filename, size_t e, size_t intr)
{
- typedef LinBox::PID_integer Ring;
- Ring ZZ;
- std::ifstream input(filename);
- LinBox::MatrixStream<Ring> ms( ZZ, input );
- LinBox::SparseMatrix<Ring, LinBox::Vector<Ring>::SparseSeq > A (ms);
- input.close();
- LinBox::PowerGaussDomainPowerOfTwo< Givaro::Integer > PGD;
-
- LinBox::Timer tim; tim.clear(); tim.start();
- PGD.prime_power_rankin( e, ranks, A, A.rowdim(), A.coldim(), std::vector<size_t>());
- tim.stop();
- std::cerr << "Ranks over 2^" << e << " are " ;
- for(std::vector<size_t>::const_iterator rit=ranks.begin(); rit != ranks.end(); ++rit)
- std::cerr << *rit << ' ';
- std::cerr << ' ' << tim << std::endl;
- return ranks;
+ typedef Givaro::ZRing<Givaro::Integer> Ring;
+ Ring ZZ;
+ std::ifstream input(filename);
+ LinBox::MatrixStream<Ring> ms( ZZ, input );
+ LinBox::SparseMatrix<Ring,LinBox::SparseMatrixFormat::SparseSeq > A (ms);
+ input.close();
+ LinBox::PowerGaussDomainPowerOfTwo< Givaro::Integer > PGD;
+
+ LinBox::Timer tim; tim.clear(); tim.start();
+ PGD.prime_power_rankin( e, ranks, A, A.rowdim(), A.coldim(), std::vector<size_t>());
+ tim.stop();
+ std::cerr << "Ranks over 2^" << e << " are " ;
+ for(std::vector<size_t>::const_iterator rit=ranks.begin(); rit != ranks.end(); ++rit)
+ std::cerr << *rit << ' ';
+ std::cerr << ' ' << tim << std::endl;
+ return ranks;
}
+
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/examples/solve.C b/examples/solve.C
index 87fe6e4..b7d0dd8 100644
--- a/examples/solve.C
+++ b/examples/solve.C
@@ -28,13 +28,16 @@
* @example examples/solve.C
*/
+#include <linbox/linbox-config.h>
+
#include <iostream>
-#include "linbox/field/modular.h"
-#include "linbox/blackbox/sparse.h"
-#include "linbox/solutions/solve.h"
-#include "linbox/util/matrix-stream.h"
-#include "linbox/solutions/methods.h"
+#include <givaro/modular.h>
+#include <givaro/zring.h>
+#include <linbox/matrix/sparse-matrix.h>
+#include <linbox/solutions/solve.h>
+#include <linbox/util/matrix-stream.h>
+#include <linbox/solutions/methods.h>
using namespace LinBox;
using namespace std;
@@ -88,38 +91,36 @@ int main (int argc, char **argv)
if (ModComp) {
-
- typedef Modular<double> Field;
+ cout<<"Computation is done over Z/("<<atoi(argv[ModComp])<<")"<<endl;
+ typedef Givaro::Modular<double> Field;
double q = atof(argv[ModComp]);
+ typedef DenseVector<Field> DenseVector ;
Field F(q);
MatrixStream< Field > ms ( F, input );
SparseMatrix<Field> A (ms); // A.write(std::cout);
cout << "A is " << A.rowdim() << " by " << A.coldim() << endl;
-
- std::vector<Field::Element> X( A.coldim()),B(A.rowdim());
+ if (A.rowdim() <= 20 && A.coldim() <= 20) A.write(std::cerr << "A:=",Tag::FileFormat::Maple) << ';' << std::endl;
+ DenseVector X(F, A.coldim()),B(F, A.rowdim());
if (createB) {
- cerr << "Creating a random {-1,1} vector " << endl;
- std::vector<Field::Element> U( A.coldim() );
- for(std::vector<Field::Element>::iterator it=U.begin();
+ cerr << "Creating a random {-1,1} vector U, B is AU (to have a consistent system)" << endl;
+ DenseVector U(F, A.coldim() );
+ for(DenseVector::iterator it=U.begin();
it != U.end(); ++it)
if (drand48() <0.5)
- F.init(*it,-1);
+ F.assign(*it,F.mOne);
else
- F.init(*it,1);
+ F.assign(*it,F.one);
A.apply(B,U);
}
else {
- for(std::vector<Field::Element>::iterator it=B.begin();
+ for(DenseVector::iterator it=B.begin();
it != B.end(); ++it)
- invect >> *it;
+ F.read(invect,*it);
}
// A.write(std::cout << "A: ") << std::endl;
- std::cout << "B is [";
- for(std::vector<Field::Element>::const_iterator it=B.begin();it != B.end(); ++it)
- F.write(cout, *it) << " ";
- std::cout << "]" << std::endl;
+ std::cout << "B is " << B << std::endl;
Timer chrono;
@@ -131,7 +132,7 @@ int main (int argc, char **argv)
chrono.stop();
std::cout << "(Sparse Gauss) Solution is [";
- for(std::vector<Field::Element>::const_iterator it=X.begin();it != X.end(); ++it)
+ for(DenseVector::const_iterator it=X.begin();it != X.end(); ++it)
F.write(cout, *it) << " ";
std::cout << "]" << std::endl;
std::cout << "CPU time (seconds): " << chrono.usertime() << std::endl<<std::endl;;
@@ -143,7 +144,7 @@ int main (int argc, char **argv)
chrono.stop();
std::cout << "(BlasElimination) Solution is [";
- for(std::vector<Field::Element>::const_iterator it=X.begin();it != X.end(); ++it)
+ for(DenseVector::const_iterator it=X.begin();it != X.end(); ++it)
F.write(cout, *it) << " ";
std::cout << "]" << std::endl;
std::cout << "CPU time (seconds): " << chrono.usertime() << std::endl<< std::endl;
@@ -156,7 +157,7 @@ int main (int argc, char **argv)
chrono.stop();
std::cout << "(Wiedemann) Solution is [";
- for(std::vector<Field::Element>::const_iterator it=X.begin();it != X.end(); ++it)
+ for(DenseVector::const_iterator it=X.begin();it != X.end(); ++it)
F.write(cout, *it) << " ";
std::cout << "]" << std::endl;
std::cout << "CPU time (seconds): " << chrono.usertime() << std::endl<<std::endl;;
@@ -169,7 +170,7 @@ int main (int argc, char **argv)
chrono.stop();
std::cout << "(Lanczos) Solution is [";
- for(std::vector<Field::Element>::const_iterator it=X.begin();it != X.end(); ++it)
+ for(DenseVector::const_iterator it=X.begin();it != X.end(); ++it)
F.write(cout, *it) << " ";
std::cout << "]" << std::endl;
std::cout << "CPU time (seconds): " << chrono.usertime() << std::endl<< std::endl;
@@ -185,7 +186,7 @@ int main (int argc, char **argv)
chrono.stop();
std::cout << "(Block Lanczos) Solution is [";
- for(std::vector<Field::Element>::const_iterator it=X.begin();it != X.end(); ++it)
+ for(DenseVector::const_iterator it=X.begin();it != X.end(); ++it)
F.write(cout, *it) << " ";
std::cout << "]" << std::endl;
std::cout << "CPU time (seconds): " << chrono.usertime() << std::endl<< std::endl;
@@ -193,79 +194,80 @@ int main (int argc, char **argv)
}
else {
-
- PID_integer ZZ;
- MatrixStream< PID_integer > ms( ZZ, input );
- SparseMatrix<PID_integer> A (ms);
- PID_integer::Element d;
+ cout<<"Computation is done over Q"<<endl;
+ Givaro::ZRing<Integer> ZZ;
+ typedef DenseVector<Givaro::ZRing<Integer> > DenseVector ;
+ MatrixStream< Givaro::ZRing<Integer> > ms( ZZ, input );
+ SparseMatrix<Givaro::ZRing<Integer> > A (ms);
+ Givaro::ZRing<Integer>::Element d;
std::cout << "A is " << A.rowdim() << " by " << A.coldim() << std::endl;
-
- std::vector<PID_integer::Element> X( A.coldim()),B(A.rowdim());
+ if (A.rowdim() <= 20 && A.coldim() <= 20) A.write(std::cerr << "A:=",Tag::FileFormat::Maple) << ';' << std::endl;
+ DenseVector X(ZZ, A.coldim()),B(ZZ, A.rowdim());
if (createB) {
- cerr << "Creating a random {-1,1} vector " << endl;
- for(std::vector<PID_integer::Element>::iterator it=B.begin();
- it != B.end(); ++it)
+ cerr << "Creating a random {-1,1} vector U, B is AU" << endl;
+ DenseVector U(ZZ, A.coldim() );
+ for(DenseVector::iterator it=U.begin();
+ it != U.end(); ++it)
if (drand48() <0.5)
*it = -1;
else
*it = 1;
+ A.apply(B,U);
}
else {
- for(std::vector<PID_integer::Element>::iterator it=B.begin();
+ for(DenseVector::iterator it=B.begin();
it != B.end(); ++it)
invect >> *it;
}
- std::cout << "B is [";
- for(std::vector<PID_integer::Element>::const_iterator it=B.begin();
- it != B.end(); ++it)
- ZZ.write(cout, *it) << " ";
- std::cout << "]" << std::endl;
+ std::cout << "B is " << B << std::endl;
Timer chrono;
- // Wiedemann
- std::cout << "Wiedemann" << std::endl;
- chrono.start();
- solve (X, d, A, B, Method::Wiedemann());
- chrono.stop();
-
- std::cout << "(Wiedemann) Solution is [";
- for(std::vector<PID_integer::Element>::const_iterator it=X.begin();it != X.end(); ++it)
- ZZ.write(cout, *it) << " ";
- std::cout << "] / ";
- ZZ.write(std::cout, d) << std::endl;
- std::cout << "CPU time (seconds): " << chrono.usertime() << std::endl;
-
// BlasElimination
- std::cout << "BlasElimination" << std::endl;
+ std::cout << "BlasElimination" << std::endl;
+ chrono.start();
+ solve (X, d, A, B, Method::BlasElimination());
+ chrono.stop();
+
+ std::cout << "(BlasElimination) Solution is [";
+ for(DenseVector::const_iterator it=X.begin();it != X.end(); ++it)
+ ZZ.write(cout, *it) << " ";
+ std::cout << "] / ";
+ ZZ.write(std::cout, d)<< std::endl;
+ std::cout << "CPU time (seconds): " << chrono.usertime() << std::endl;
+
+ // Sparse Elimination
+ std::cout << "Sparse Elimination" << std::endl;
chrono.start();
- solve (X, d, A, B, Method::BlasElimination());
+ solve (X, d, A, B, Method::SparseElimination());
chrono.stop();
- std::cout << "(BlasElimination) Solution is [";
- for(std::vector<PID_integer::Element>::const_iterator it=X.begin();it != X.end(); ++it)
+ std::cout << "(SparseElimination) Solution is [";
+ for(DenseVector::const_iterator it=X.begin();it != X.end(); ++it)
ZZ.write(cout, *it) << " ";
std::cout << "] / ";
ZZ.write(std::cout, d)<< std::endl;
std::cout << "CPU time (seconds): " << chrono.usertime() << std::endl;
- // Sparse Elimination
- std::cout << "Sparse Elimination" << std::endl;
+ // Wiedemann
+ std::cout << "Wiedemann" << std::endl;
chrono.start();
- solve (X, d, A, B, Method::SparseElimination());
+ solve (X, d, A, B, Method::Wiedemann());
chrono.stop();
- std::cout << "(SparseElimination) Solution is [";
- for(std::vector<PID_integer::Element>::const_iterator it=X.begin();it != X.end(); ++it)
+ std::cout << "(Wiedemann) Solution is [";
+ for(DenseVector::const_iterator it=X.begin();it != X.end(); ++it)
ZZ.write(cout, *it) << " ";
std::cout << "] / ";
- ZZ.write(std::cout, d)<< std::endl;
+ ZZ.write(std::cout, d) << std::endl;
std::cout << "CPU time (seconds): " << chrono.usertime() << std::endl;
+
+
#if 0
// Lanczos
std::cout << "Lanczos" << std::endl;
@@ -274,7 +276,7 @@ int main (int argc, char **argv)
chrono.stop();
std::cout << "(Lanczos) Solution is [";
- for(std::vector<PID_integer::Element>::const_iterator it=X.begin();it != X.end(); ++it)
+ for(DenseVector::const_iterator it=X.begin();it != X.end(); ++it)
ZZ.write(cout, *it) << " ";
std::cout << "] / ";
ZZ.write(std::cout, d) << std::endl;
@@ -289,7 +291,7 @@ int main (int argc, char **argv)
chrono.stop();
std::cout << "(Block Lanczos) Solution is [";
- for(std::vector<PID_integer::Element>::const_iterator it=X.begin();it != X.end(); ++it)
+ for(DenseVector::const_iterator it=X.begin();it != X.end(); ++it)
ZZ.write(cout, *it) << " ";
std::cout << "] / ";
ZZ.write(std::cout, d) << std::endl;
@@ -300,11 +302,10 @@ int main (int argc, char **argv)
return 0;
}
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
// Local Variables:
// mode: C++
// tab-width: 8
// indent-tabs-mode: nil
// c-basic-offset: 8
// End:
-
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/examples/solver/Makefile.am b/examples/solver/Makefile.am
new file mode 100644
index 0000000..d1bebb9
--- /dev/null
+++ b/examples/solver/Makefile.am
@@ -0,0 +1,38 @@
+# Copyright (c) 2010 the LinBox group
+# This file is part of LinBox
+# ========LICENCE========
+# This file is part of the library LinBox.
+#
+# LinBox is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+#
+# This library 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
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+# ========LICENCE========
+#/
+
+INCLUDES=-I$(top_srcdir)
+
+AM_CPPFLAGS=-g $(NTL_CFLAGS) $(ATLAS_CFLAGS)
+LDADD = $(top_builddir)/linbox/liblinbox.la $(NTL_LIBS) $(ATLAS_LIBS) $(LDFLAGS)
+
+EXTRA_PROGRAMS=t-rdisolve
+
+t_rdisolve_SOURCES = \
+ t-rdisolve.C
+
+# no /bin if LinBox is uncompiled
+#LINBOX_BIN=$(LINBOX)/bin
+LINBOX_BIN=$(bindir)
+
+# for compilation of new examples
+%:%.C
+ $(CXX) $(CPPFLAGS) $*.C -o $* $(shell $(LINBOX_BIN)/linbox-config --cflags --libs) $(LDADD)
diff --git a/examples/solver/t-rdisolve.C b/examples/solver/t-rdisolve.C
new file mode 100644
index 0000000..bc6811d
--- /dev/null
+++ b/examples/solver/t-rdisolve.C
@@ -0,0 +1,529 @@
+/*
+ * examples/solver/t-rdisolve.C
+ *
+ * Copyright (C) 2004, 2005, 2010 D. Pritchard, P. Giorgi
+ *
+ * This file is part of LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation, either version 2 of
+ * the License, or (at your option) any later version.
+ *
+ * LinBox 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 Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with LinBox. If not, see
+ * <http://www.gnu.org/licenses/>.
+ */
+
+/* linbox/examples/solver/t-rdisolve.C
+ * demo, testing, time-comparison of certified rational/diophantine system solver
+ *
+ * Written by David Pritchard <daveagp at mit.edu>
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ * ========LICENCE========
+ */
+
+#define LIFTING_PROGRESS
+#define RSTIMING
+
+#include "givaro/modular.h"
+#include "givaro/zring.h"
+#include "linbox/blackbox/diagonal.h"
+#include "linbox/algorithms/rational-solver.h"
+#include "linbox/algorithms/vector-fraction.h"
+#include "linbox/algorithms/diophantine-solver.h"
+#include <iostream>
+#include <fstream>
+#include "linbox/randiter/random-prime.h"
+
+#include "linbox/field/unparametric.h"
+#include "givaro/zring.h"
+#include "linbox/field/ntl.h"
+
+#include "linbox/field/archetype.h"
+//#include "linbox/field/givaro.h"
+#include "linbox/vector/vector-domain.h"
+
+#include <vector>
+
+#include "linbox/field/archetype.h"
+#include "linbox/vector/vector-domain.h"
+
+// #include "linbox/../tests/test-common.C"
+using namespace std;
+using namespace LinBox;
+
+#define random_01() ((double)rand() / ((double)(RAND_MAX)+1))
+
+int n = 5;
+int c = 5;
+int defaultPrime = 0;
+int primeBits = 14; // note: should be <= 15 to use Givaro::Modular<Log16>
+int numPrimes = 1;
+bool useDeterm = true;
+bool useRandom = false;
+bool useDiophantine = false;
+int printStuff = 0;
+int showTiming = 0;
+
+bool useFiles = false;
+bool sparseMatrix = false;
+integer eBoundCmd = 1000;
+double singularProportion = 0;
+bool inconsistent = false;
+
+int useTimer = true;
+int entrySeed = 12345;
+int trials = 1;
+
+int destroyColumns = 0;
+
+bool testPidDouble = false;
+
+int levelAsInt = (int)SL_CERTIFIED;
+
+static Argument args[] = {
+ { 'n', 0, "Row dimension of test matrix", TYPE_INT, &n },
+ { 'c', 0, "Column dimension of test matrix (c<=0 => c=n)", TYPE_INT, &c },
+ { 'm', 0, "Try solving with up to m primes", TYPE_INT, &numPrimes },
+ { 'q', 0, "Solve first over the field Z/qZ (0: pick randomly)", TYPE_INT, &defaultPrime },
+ { 'g', 0, "Subsequently generate primes that are g bits long", TYPE_INT, &primeBits },
+ { 'r', 0, "Set random solving on/off", TYPE_BOOL, &useRandom },
+ { 'd', 0, "Set deterministic solving on/off", TYPE_BOOL, &useDeterm },
+ { 'z', 0, "Set diophantine solving on/off", TYPE_BOOL, &useDiophantine },
+ { 'p', 0, "Print lots of detail, tree levels (0,1,2,3)", TYPE_INT, &printStuff },
+ { 'f', 0, "Read space-separated data from files td-{A, b}.txt?", TYPE_BOOL, &useFiles},
+ { 's', 0, "(If f=0N) Say td-A.txt is in sparse format", TYPE_BOOL, &sparseMatrix},
+ { 'b', 0, "(If f=OFF) Entry bound is (-b, b]", TYPE_INTEGER, &eBoundCmd},
+ { 'x', 0, "(If f=OFF) Make roughly x*n dependant rows", TYPE_DOUBLE, &singularProportion},
+ { 'i', 0, "(If f=OFF) Force inconsistent system", TYPE_BOOL, &inconsistent},
+ { 't', 0, "(If f=OFF) Randomize with timer?", TYPE_BOOL, &useTimer},
+ { 'w', 0, "(If f=OFF, t=OFF) Randomize with seed w", TYPE_INT, &entrySeed},
+ { 'e', 0, "Test PID_double", TYPE_BOOL, &testPidDouble},
+ { 'k', 0, "Repeat trials k times", TYPE_INT, &trials},
+ { 'l', 0, "Level: 0=Monte Carlo, 1=Las Vegas, 2=Certified", TYPE_INT, &levelAsInt},
+ { 'o', 0, "Set o columns to zero at random", TYPE_INT, &destroyColumns}
+}; // 7 more options (yu vs jah) and the whole alphabet is covered
+
+int trialCount=0;
+integer* Aentries;
+integer* bentries;
+
+template <class Ring, class Field>
+int test()
+{
+ trialCount++;
+
+ typedef typename Ring::Element RingElement;
+
+ Ring R;
+ VectorDomain<Ring> VD (R);
+ typedef typename Vector<Ring>::Dense Vector;
+ typedef DenseMatrix<Ring> Matrix;
+ Matrix A(R, n, c);
+ MatrixDomain<Ring> MD(R);
+ typedef typename Ring::Element Integer;
+ Vector b(n);
+
+ if (sparseMatrix) {
+ // reading A from td-A.txt file
+ ifstream inA, inb;
+ inA.open("td-A.txt");
+ A.read(inA);
+ cout << "Matrix is sparse with n="<<A.rowdim()<<" rows by c="<<A.coldim()<<" columns\n";
+ n = (int) A.rowdim();
+ c = (int) A.coldim();
+ inA.close();
+ // reading b from td-b.txt
+ b.resize(n);
+ inb.open("td-b.txt");
+ for (int i=0; i<n; i++)
+ inb >> b[i];
+ inb.close();
+ }
+ else {
+ // reading A from Aentrie vector
+ for (int i=0; i<n; i++)
+ for (int j=0; j<c; j++)
+ R.init(A[i][j], Aentries[i*c+j]);
+ // reading b from bentry vector
+ typename Vector::iterator bi=b.begin();
+ for (int i=0; bi!=b.end(); bi++, i++)
+ R.init(*bi, bentries[i]);
+ }
+
+
+ if (trialCount==1 && (printStuff>2)) {cout << "b:\n"; VD.write(cout, b);}
+
+ if (trialCount==1 && (printStuff>2)) {cout << "\nA:\n"; A.write(cout);}
+
+ Field F(defaultPrime>0 ? defaultPrime : 2);
+ cout << "Testing with Z of type '";
+ R.write(cout);
+ cout<<"' and Z/pZ of type '";
+ F.write(cout)<<"'"<<endl;
+
+ typedef RationalSolver<Ring, Field, class RandomPrime, DixonTraits> QSolver;
+ typedef DiophantineSolver<QSolver> ZSolver;
+
+ //typedef std::vector<std::pair<RingElement, RingElement> > FractionVector;
+ typedef VectorFraction<Ring> FractionVector;
+ FractionVector x(R,c);
+ int result=0;
+ SolverLevel level = (SolverLevel)levelAsInt;
+
+ for (int iteration=0; iteration<3; iteration++) {
+ if (iteration==0 && !useDeterm) continue;
+ if (iteration==1 && !useRandom) continue;
+ if (iteration==2 && !useDiophantine) continue;
+
+ // no more cleaning
+#if 0
+ //clear x
+ for (FractionVector::Dense::iterator i=x.begin(); i!=x.end(); i++) {
+ R.assign(i->first, R.zero);
+ R.assign(i->second, R.zero);
+ }
+#endif
+
+ QSolver* rsolver;
+ if (defaultPrime == 0)
+ rsolver = new QSolver(R, LinBox::RandomPrime(primeBits));
+ else
+ rsolver = new QSolver(defaultPrime, R, LinBox::RandomPrime(primeBits));
+
+ ZSolver zsolver(*rsolver);
+ SolverReturnStatus s;
+
+ if (iteration==0) {
+ cout << "Solving deterministically.\n";
+ s = zsolver.solve(x.numer, x.denom, A, b, numPrimes, level);
+ }
+ else if (iteration==1) {
+ cout << "Solving randomly.\n";
+ s = zsolver.randomSolve(x.numer, x.denom, A, b, numPrimes, level);
+ }
+ else {
+ cout << "Solving diophantically.\n";
+ s = zsolver.diophantineSolve(x.numer, x.denom, A, b, numPrimes, level);
+ }
+ cout << "solverReturnStatus: " << solverReturnString[(int)s] << "\n";
+
+#ifdef RSTIMING
+ rsolver->reportTimes(cout);
+#endif
+ if (s == SS_OK) {
+ VectorFraction<Ring> red(x);
+
+ if (printStuff > 0) {
+ if (useDiophantine){
+ cout<<"Number of system solved : "<<zsolver.numSolutionsNeeded<<endl;
+ cout<<"Number of system failed : "<<zsolver.numFailedCallsToSolver<<endl;
+ cout<<"Number of system revelant : "<<zsolver.numRevelantSolutions<<endl;
+
+ }
+ cout<<"Reduced solution: ";
+ integer tmp;
+ size_t maxbits=0;
+ for (int i=0;i<n;++i){
+ R.convert(tmp,x.numer[i]);
+ maxbits=(maxbits > tmp.bitsize() ? maxbits: tmp.bitsize());
+ }
+ R.convert(tmp,x.denom);
+ cout<<"numerators hold over "<<maxbits<<" bits and denominators hold over "<<tmp.bitsize()<<" bits\n";
+ }
+ if (printStuff > 1) {
+ if (useFiles){
+ ofstream out("td-x.txt");
+ out<< "Reduced solution: ";
+ red.write(out) << "\n";
+ out.close();
+ }
+ else{
+ cout << "Reduced solution: ";
+ red.write(cout) << "\n";
+ }
+ }
+ Vector LHS(n), RHS(b);
+ // check that Ax = b, if it thought it was okay
+ MD.vectorMul(LHS, A, red.numer);
+ VD.mulin(RHS, red.denom);
+ if (VD.areEqual(LHS, RHS))
+ cout << "Ax=b : Yes" << endl;
+ else {
+ cout << "Ax=b : No" << endl;
+ if (level >= SL_LASVEGAS)
+ cout << "ERROR: Las Vegas or Certified solver should never return wrong answer" << endl;
+ }
+
+ if (iteration==2 && level == SL_CERTIFIED) {
+ // check certificate of minimality z
+ // should satisfy that zA is integral, and den(z.b) == den(y)
+
+ Integer dp, tmp, denzb;
+ VectorFraction<Ring> z(zsolver.lastCertificate);
+ R.assign(dp, R.zero);
+ typename Vector::iterator zi = z.numer.begin();
+ typename Vector::iterator bi = b.begin();
+ for (; bi != b.end(); bi++, zi++)
+ R.addin(dp, R.mul(tmp, *bi, *zi));
+
+ R.gcd(denzb, dp, z.denom);
+ R.div(denzb, z.denom, denzb);
+
+ VectorFraction<Ring> tmpvf(x);
+ bool certified = R.areEqual(denzb, tmpvf.denom);
+ if (!certified)
+ cout << "ERROR Failed den(z.b) == den(y)" << endl;
+
+ bool certified2 = true;
+ Integer* nza = new Integer[c]; //z.numer * A
+ for (int i=0; i<c; i++) R.assign(nza[i], R.zero);
+ for (int i=0; i<n; i++)
+ for (int j=0; j<c; j++)
+ R.addin(nza[j], R.mul(tmp, z.numer[i], A[i][j]));
+ for (int i=0; i<c; i++)
+ certified2 &= R.isDivisor(nza[i], z.denom);
+ if (!certified2)
+ cout << "ERROR Failed zA integral" << endl;
+
+ if (certified && certified2)
+ cout << "Solution is certified correctly as having minimal denominator." << endl;
+ }
+ }
+ else if (s==SS_INCONSISTENT && level == SL_CERTIFIED) {
+ cout << "About to check certificate of inconsistency";
+ VectorFraction<Ring> cert(zsolver.lastCertificate);
+ if (printStuff > 1) {
+ cout << ": ";
+ cert.write(cout);
+ }
+ cout << endl;
+ std::vector<Integer> certA(c);
+ if (R.isZero(cert.denom))
+ cout << "ERROR: Zero denom in inc-certificate. May not have been generated." << endl;
+
+ Integer certb, tmp;
+
+ for (int i=0; i<c; i++) R.assign(certA[i], R.zero);
+ R.assign(certb, R.zero);
+
+ for (int i=0; i<n; i++)
+ for (int j=0; j<c; j++)
+ R.addin(certA[j], R.mul(tmp, cert.numer[i], A[i][j]));
+ for (int i=0; i<n; i++)
+ R.addin(certb, R.mul(tmp, cert.numer[i], b[i]));
+
+ bool certifies1 = true; //check certificate
+ if (R.isZero(certb)) {
+ cout << "ERROR: Product of certificate . b is zero!" << endl;
+ certifies1 = false;
+ }
+ bool certifies2 = true;
+ for (size_t i=0; certifies2 && i<A.rowdim(); i++)
+ if (!certifies2) {
+ certifies2 = false;
+ cout << "ERROR: entry " << i << " of certificate . A is nonzero" << endl;
+ }
+ if (certifies1 && certifies2)
+ cout << "System is certified correctly as inconsistent." << endl;
+ }
+ delete rsolver;
+ }
+ return result;
+
+};
+
+template <class Field>
+int fieldTest()
+{
+ return
+ 0
+ //+test<NTL_ZZ, Field>()
+ +test<Givaro::ZRing<Integer>, Field>()
+ //+(testPidDouble?test<PID_double, Field>():0)
+ // */
+ ;
+};
+
+void testAllFields()
+{
+ //fieldTest<Givaro::Modular<Log16> >();
+ //fieldTest<NTL_zz_p>();
+
+ //fieldTest<Givaro::Modular<int16_t> >();
+
+ //fieldTest<Givaro::Modular<int> >();
+ fieldTest<Givaro::Modular<double> >();
+
+
+ //fieldTest<Givaro::Modular<int32_t> >(); //broken?
+ //fieldTest<Givaro::Modular<int64_t> >(); //broken?
+ //fieldTest<Givaro::GFq>(); //broken?
+
+ //fieldTest<Givaro::Montgomery>(); // appears to be broken in current build
+ //fieldTest<NTL_ZZ_p>(); // appears to be broken in current build
+ //fieldTest<Givaro::Modular<integer> >();
+
+ // */
+ // this takes a long time to compile with all fields
+ // so comment out unused ones when debugging
+}
+
+void genTestData()
+{
+ bool* auxRow = new bool[n];
+ int auxRows = 0;
+ for (int i=0; i<n; i++) {
+ auxRow[i] = (random_01() <= singularProportion);
+ if (auxRow[i]) auxRows++;
+ }
+ cout << "at least " << auxRows << " dependent rows" << endl;
+
+ if (inconsistent && auxRows == 0)
+ { auxRows++; auxRow[(int)(random_01()*n)] = true; }
+
+ integer eBound(eBoundCmd);
+ if (auxRows > 0 && auxRows < n)
+ eBound /= (n-auxRows);
+ if (eBound == 0) {
+ cout << "WARNING: 'b' dropped to 0. Changed to 1, try increasing 'b'." << endl;
+ eBound = 1;
+ }
+
+ Givaro::ZRing<Integer> Z;
+ Givaro::ZRing<Integer>::RandIter ri(Z, 2*eBound,entrySeed); //for some reason this iterator tends to give numbers with
+ //large common factors, so we perturb the data a bit
+ bool notRandomEnough = (eBound >> 64) > 0;
+ double bigStuff = ((long long)1)<<25;
+ for (int i=0; i<n; i++) {
+ ri.random(bentries[i]);
+ bentries[i] -= eBound-1;
+ if (notRandomEnough) bentries[i] += static_cast<int>((random_01()-0.5)*bigStuff);
+ }
+
+ for (int i=0; i<n*c; i++) {
+ ri.random(Aentries[i]);
+ Aentries[i] -= eBound-1;
+ if (notRandomEnough) Aentries[i] += static_cast<int>((random_01()-0.5)*bigStuff);
+ }
+
+ int whichInconsistent = (int)(random_01()*auxRows);
+ //make singular rows
+ for (int i=0; i<n; i++)
+ if (auxRow[i]) {
+ for (int j=0; j<c; j++) Aentries[c*i+j] = 0;
+ bentries[i] = 0;
+ for (int k=0; k<n; k++)
+ if (!auxRow[k]) {
+ int m = (int)(random_01()*2)*2 - 1;
+ for (int j=0; j<c; j++)
+ Aentries[c*i+j] += Aentries[c*k+j]*m;
+ bentries[i] += bentries[k]*m;
+ }
+ if (inconsistent) {
+ if (whichInconsistent == 0)
+ bentries[i] += (int)(random_01()*2)*2 - 1;
+ whichInconsistent--;
+ }
+ }
+ delete[] auxRow ;
+ trialCount = 0; //so new data get printed
+
+ int columnsToDestroy = destroyColumns;
+ if (columnsToDestroy > c) {
+ cout << "WARNING, o > c. Lowering o." << endl;
+ columnsToDestroy = c;
+ }
+
+ for (int i=0; i<c; i++) {
+ if (random_01()*(c-i-1) < columnsToDestroy) {
+ for (int j=0; j<n; j++)
+ Aentries[c*j+i] = 0;
+ columnsToDestroy--;
+ }
+ }
+}
+
+int main (int argc, char **argv)
+{
+ parseArguments (argc, argv, args, true);
+
+ if (useTimer) {
+ entrySeed = static_cast<unsigned>(time(NULL));
+ useTimer = false;
+ }
+
+ writeCommandString (cout, args, argv[0]);
+
+ if (c <= 0) c += n;
+ if (c <= 0) {
+ cout << "WARNING, c <= -n; resulting column dimension changed from nonpositive value to 1" << endl;
+ c = 1;
+ }
+ if (!sparseMatrix)
+ cout << "Matrix is dense with n="<<n<<" rows by c="<<c<<" columns\n";
+
+ cout << "Seed: " << entrySeed <<"\n";
+ srand(entrySeed);
+
+ Aentries = new integer[n*c];
+ bentries = new integer[n];
+
+ if (useFiles && !sparseMatrix) {
+
+ ifstream in, in2;
+ in.open("td-b.txt");
+ for (int i=0; i<n; i++)
+ in >> bentries[i];
+ in.close();
+ in2.open("td-A.txt");
+ for (int i=0; i<n*c; i++)
+ in2 >> Aentries[i];
+ in2.close();
+ }
+
+ for (int j=0; j < trials; j++) {
+ if (!useFiles) genTestData();
+ testAllFields();
+ cout << "finished trial " << (j+1) << " of " << trials << endl;
+ }
+
+ delete[] Aentries;
+ delete[] bentries;
+
+ return 0;
+}
+
+//! @todo come up with better test data, so can have a big singular matrix of all 0..9
+//! @todo change "probability of dependence" to "set X dependent rows"
+//! @bug fixme : seems to not work for n >= 10000
+
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/examples/sparseelimdet.C b/examples/sparseelimdet.C
index c990188..9a61e29 100644
--- a/examples/sparseelimdet.C
+++ b/examples/sparseelimdet.C
@@ -26,19 +26,19 @@
\brief Gaussian elimination determinant of sparse matrix over Z or Zp.
\ingroup examples
*/
-//#include "linbox-config.h"
+
+#include <linbox/linbox-config.h>
#include <iostream>
#include <vector>
#include <utility>
-#include "linbox/field/modular.h"
-#include "linbox/field/gf2.h"
-#include "linbox/blackbox/sparse.h"
-#include "linbox/blackbox/zero-one.h"
-#include "linbox/solutions/rank.h"
-#include "linbox/solutions/det.h"
-#include "linbox/util/matrix-stream.h"
+#include <linbox/ring/modular.h>
+#include <linbox/field/gf2.h>
+#include <linbox/matrix/sparse-matrix.h>
+#include <linbox/blackbox/zero-one.h>
+#include <linbox/solutions/rank.h>
+#include <linbox/solutions/det.h>
using namespace LinBox;
using namespace std;
@@ -59,38 +59,40 @@ int main (int argc, char **argv)
if (argc == 2) { // determinant over the integers.
- PID_integer ZZ;
- PID_integer::Element d;
- MatrixStream<PID_integer> ms( ZZ, input );
- SparseMatrix<PID_integer, Vector<PID_integer>::SparseSeq > A ( ms );
+ Givaro::ZRing<Integer> ZZ;
+ SparseMatrix<Givaro::ZRing<Integer> > A ( ZZ );
+ A.read(input);
cout << "A is " << A.rowdim() << " by " << A.coldim() << endl;
SE.strategy(Specifier::PIVOT_LINEAR);
+ Givaro::ZRing<Integer>::Element d;
det (d, A, SE);
ZZ.write(cout << "Determinant is ", d) << endl;
}
- if (argc == 3) {
+ if (argc == 3) { // determinant over a finite field
+ typedef Givaro::Modular<double> Field;
double q = atof(argv[2]);
- typedef Modular<double> Field;
- Field::Element d;
Field F(q);
- MatrixStream<Field> ms( F, input );
- SparseMatrix<Field, Vector<Field>::SparseSeq > B (ms);
+ SparseMatrix<Field> B (F);
+ B.read(input);
cout << "B is " << B.rowdim() << " by " << B.coldim() << endl;
if (B.rowdim() <= 20 && B.coldim() <= 20) B.write(cout) << endl;
-
- SE.strategy(Specifier::PIVOT_NONE);
// using Sparse Elimination
+ SE.strategy(Specifier::PIVOT_NONE);
+ Field::Element d;
det (d, B, SE);
- if (B.rowdim() <= 20 && B.coldim() <= 20) B.write(cout) << endl;
+
+ if (B.rowdim() <= 20 && B.coldim() <= 20)
+ B.write(cout) << endl;
F.write(cout << "Determinant is ", d) << endl;
- SE.strategy(Specifier::PIVOT_LINEAR);
// using Sparse Elimination with reordering
+ SE.strategy(Specifier::PIVOT_LINEAR);
detin (d, B, SE);
- if (B.rowdim() <= 20 && B.coldim() <= 20) B.write(cout) << endl;
+ if (B.rowdim() <= 20 && B.coldim() <= 20)
+ B.write(cout) << endl;
F.write(cout << "Determinant is ", d) << endl;
@@ -99,11 +101,10 @@ int main (int argc, char **argv)
return 0;
}
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
// Local Variables:
// mode: C++
// tab-width: 8
// indent-tabs-mode: nil
// c-basic-offset: 8
// End:
-
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/examples/sparseelimrank.C b/examples/sparseelimrank.C
index 5d3f49b..61ab60d 100644
--- a/examples/sparseelimrank.C
+++ b/examples/sparseelimrank.C
@@ -26,19 +26,21 @@
\brief Gaussian elimination Rank of sparse matrix over Z or Zp.
\ingroup examples
*/
-//#include "linbox-config.h"
+
+#include <linbox/linbox-config.h>
#include <iostream>
#include <vector>
#include <utility>
+#include <givaro/zring.h>
+#include <givaro/givrational.h>
-#include "linbox/field/modular.h"
-#include "linbox/field/gf2.h"
-#include "linbox/blackbox/sparse.h"
-#include "linbox/blackbox/zero-one.h"
-#include "linbox/solutions/rank.h"
-#include "linbox/util/matrix-stream.h"
-#include "linbox/field/givaro.h"
+#include <givaro/modular.h>
+#include <linbox/field/gf2.h>
+#include <linbox/matrix/sparse-matrix.h>
+#include <linbox/blackbox/zero-one.h>
+#include <linbox/solutions/rank.h>
+#include <linbox/util/matrix-stream.h>
using namespace LinBox;
using namespace std;
@@ -48,6 +50,7 @@ int main (int argc, char **argv)
commentator().setMaxDetailLevel (-1);
commentator().setMaxDepth (-1);
commentator().setReportStream (std::cerr);
+ commentator().setBriefReportStream (std::cout);
if (argc < 2 || argc > 3)
{ cerr << "Usage: rank <matrix-file-in-supported-format> [<p>]" << endl; return -1; }
@@ -64,37 +67,40 @@ int main (int argc, char **argv)
is an integer matrix and our concept is that we are getting the rank of that
matrix by some blackbox magic inside linbox.
*/
- LinBox::GivaroRational ZZ;
- MatrixStream<GivaroRational> ms( ZZ, input );
- SparseMatrix<GivaroRational> A ( ms );
+ Givaro::QField<Givaro::Rational> QQ;
+ MatrixStream<Givaro::QField<Givaro::Rational>> ms( QQ, input );
+ SparseMatrix<Givaro::QField<Givaro::Rational>, SparseMatrixFormat::SparseSeq > A ( ms );
+ if (A.rowdim() <= 20 && A.coldim() <= 20) A.write(std::cerr << "A:=",Tag::FileFormat::Maple) << ';' << std::endl;
+
+
cout << "A is " << A.rowdim() << " by " << A.coldim() << endl;
LinBox::rank (r, A, Method::SparseElimination() );
- cout << "Rank is " << r << endl;
+ cout << "Z Rank is " << r << endl;
}
if (argc == 3) {
double q = atof(argv[2]);
- typedef Modular<double> Field;
+ typedef Givaro::Modular<double> Field;
Field F(q);
MatrixStream<Field> ms( F, input );
- SparseMatrix<Field, Vector<Field>::SparseSeq > B (ms);
+ SparseMatrix<Field, SparseMatrixFormat::SparseSeq > B (ms);
cout << "B is " << B.rowdim() << " by " << B.coldim() << endl;
if (B.rowdim() <= 20 && B.coldim() <= 20) B.write(cout) << endl;
Method::SparseElimination SE;
- SE.strategy(Specifier::PIVOT_NONE);
- // using Sparse Elimination
- LinBox::rank (r, B, SE);
- if (B.rowdim() <= 20 && B.coldim() <= 20) B.write(cout) << endl;
- cout << "Rank is " << r << endl;
+// SE.strategy(Specifier::PIVOT_NONE);
+// // using Sparse Elimination
+// LinBox::rank (r, B, SE);
+// if (B.rowdim() <= 20 && B.coldim() <= 20) B.write(cout) << endl;
+// cout << "Rank is " << r << endl;
SE.strategy(Specifier::PIVOT_LINEAR);
// using Sparse Elimination
- LinBox::rank (r, B, SE);
+ LinBox::rankin (r, B, SE);
if (B.rowdim() <= 20 && B.coldim() <= 20) B.write(cout) << endl;
- cout << "Rank is " << r << endl;
+ F.write(cout << "Rank is " << r << " over ") << endl;
}
diff --git a/examples/test.sh b/examples/test.sh
new file mode 100755
index 0000000..5ec2367
--- /dev/null
+++ b/examples/test.sh
@@ -0,0 +1,32 @@
+#!/bin/bash
+
+# written by Brice Boyer (briceboyer) <boyer.brice at gmail.com>
+# part of LinBox, see COPYING
+
+set -o nounset # Treat unset variables as an error
+
+fail() {
+ echo "fail"
+}
+
+success() {
+ echo "ok"
+}
+
+
+pass="true"
+
+echo -n "check rank ... "
+rank_cmd="Rank\sis\s"
+./rank data/test.matrix 7 > linbox-tmp.data
+result=`cat linbox-tmp.data | grep ${rank_cmd} | sed 's/'"$rank_cmd"'\([0-9]*\).*/\1/'`
+[ "$result" -eq "9" ] && success || { fail ; pass="false" ; }
+
+echo -n "check rank ... "
+./rank data/test.matrix > linbox-tmp.data
+result=`cat linbox-tmp.data | grep ${rank_cmd} | sed 's/'"$rank_cmd"'\([0-9]*\).*/\1/'`
+[ "$result" -eq "10" ] && success || { fail ; pass="false" ; }
+
+
+[ "$pass" == "true" ] && { success ; exit 0 ;} || { fail ; exit 1 ;};
+
diff --git a/examples/valence.C b/examples/valence.C
index 400ef88..e566480 100644
--- a/examples/valence.C
+++ b/examples/valence.C
@@ -26,15 +26,16 @@
* \ingroup examples
* @example examples/valence.C
*/
-//#include "linbox-config.h"
+#include <linbox/linbox-config.h>
+
#include <iostream>
-#include "linbox/field/modular.h"
-#include "linbox/blackbox/transpose.h"
-#include "linbox/blackbox/compose.h"
-#include "linbox/blackbox/sparse.h"
-#include "linbox/solutions/valence.h"
-#include "linbox/util/matrix-stream.h"
+#include <linbox/ring/modular.h>
+#include <linbox/blackbox/transpose.h>
+#include <linbox/blackbox/compose.h>
+#include <linbox/matrix/sparse-matrix.h>
+#include <linbox/solutions/valence.h>
+#include <linbox/util/matrix-stream.h>
using namespace LinBox;
@@ -53,14 +54,14 @@ int main (int argc, char **argv)
std::ifstream input (argv[1]);
if (!input) { std::cerr << "Error opening matrix file " << argv[1] << std::endl; return -1; }
- PID_integer ZZ;
- MatrixStream< PID_integer > ms( ZZ, input );
- typedef SparseMatrix<PID_integer> Blackbox;
+ Givaro::ZRing<Integer> ZZ;
+ MatrixStream< Givaro::ZRing<Integer> > ms( ZZ, input );
+ typedef SparseMatrix<Givaro::ZRing<Integer> > Blackbox;
Blackbox A (ms);
std::cout << "A is " << A.rowdim() << " by " << A.coldim() << std::endl;
- PID_integer::Element val_A;
+ Givaro::ZRing<Integer>::Element val_A;
if (argc == 3) {
@@ -90,11 +91,10 @@ int main (int argc, char **argv)
return 0;
}
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
// Local Variables:
// mode: C++
// tab-width: 8
// indent-tabs-mode: nil
// c-basic-offset: 8
// End:
-
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/incremente-versions b/incremente-versions
new file mode 100755
index 0000000..414388b
--- /dev/null
+++ b/incremente-versions
@@ -0,0 +1,115 @@
+#!/bin/csh -f
+# Copyright(c) 2011 LinBox
+# Copyright(c)'1994-2009 by The Givaro group
+# Imported and modified from Givaro's by Brice Boyer (briceboyer) <boyer.brice at gmail.com>
+# see the COPYING file for more details.
+
+
+set conf = configure.ac
+set ver = Makefile.am
+
+#verbatim second argument of AC_INIT
+set verb = `grep ^AC_INIT $conf | cut -d',' -f2`
+#removes spaces and brackets
+set vern = `echo "$verb" | sed 's/ //g;s/\[//;s/\]//'`
+echo "Current version is $vern."
+
+echo -n "Increment library version ? (y/n)"
+set answ = $<
+if ("$answ" == "y") then
+ set line = `fgrep -n ^AC_INIT $conf | cut -d':' -f1` #gets the line
+ set macro = `echo "$vern" | cut -d'.' -f1` #a version number is macro.minor.micro
+ set minor = `echo "$vern" | cut -d'.' -f2`
+ set micro = `echo "$vern" | cut -d'.' -f3`
+ set tmpfile = `mktemp` #tempfile
+ set sedfile = `mktemp` #temp sed file
+ set pmicro = `echo $micro`
+ @ pmicro ++
+ set pminor = `echo $minor`
+ @ pminor ++
+ set pmacro = `echo $macro`
+ @ pmacro ++
+ echo "Increment micro revision number ($vern -> $macro.$minor.$pmicro) ? press '0' "
+ echo "Increment minor revision number ($vern -> $macro.$pminor.0) ? press '1' "
+ echo -n "Increment macro revision number ($vern -> $pmacro.0.0) ? press '2' "
+ set increm = $<
+ switch ($increm)
+ case 0:
+ set newv = "[$macro.$minor.$pmicro]"
+ breaksw
+ case 1:
+ set newv = "[$macro.$pminor.0]"
+ breaksw
+ case 2:
+ set newv = "[$pmacro.0.0]"
+ breaksw
+ default:
+ set newv = "$verb"
+ echo "'$increm' read. Not incrementing anything."
+ breaksw
+ endsw
+
+ #replacing [ ] and . with escaped version for sed would understand them as 'operators'
+ echo "$line s/$verb/$newv/" | sed 's/\./\\\./g;s/\[/\\\[/g;s/\]/\\\]/g' > $sedfile
+ sed -f $sedfile $conf > $tmpfile
+ #clean up
+ \rm -f $sedfile
+ #diff for changes
+ diff -u0 $conf $tmpfile
+ #if something was changed, confirm incrementation :
+ if ("$newv" != "$verb") then
+ echo -n "Confirmation of incrementation ? (yes/no)"
+ set answ = $<
+ set backupconf = $conf.back$$
+ if ("$answ" == "yes") then
+ \cp -p $conf $backupconf
+ echo "Back-up of $conf made in $backupconf. Now overwriting $conf."
+ \mv -f $tmpfile $conf
+ else
+ echo "'$answ' read. Not incrementing anything."
+ \rm -f $tmpfile
+ exit 0 ;
+ endif
+ #now change Makefile accordingly
+ echo -n "Incrementing Makefile revision accordingly"
+ set tmpfile = `mktemp` #tempfile
+ set sedfile = `mktemp` #tempfile
+ switch ($increm)
+ case 0:
+ echo -n "s/VERSION.*/VERSION=$macro.$minor.$pmicro/" >> $sedfile
+ breaksw
+ case 1:
+ echo "s/VERSION.*/VERSION=$macro.$pminor.0/" > $sedfile
+ breaksw
+ case 2:
+ echo "s/VERSION.*/VERSION=$pmacro.0.0/" > $sedfile
+ breaksw
+ default:
+ echo "Something abnormal happened"
+ exit 1
+ breaksw
+ endsw
+ sed -f $sedfile $ver > $tmpfile
+ \rm -f $sedfile
+ diff -u0 $ver $tmpfile
+ echo -n "Confirmation of incrementation ? (yes/no) "
+ set answ = $<
+ if ("$answ" == "yes") then
+ \mv -f $tmpfile $ver
+ echo " your old $conf is destroyed..."
+ \rm -f $backupconf
+ else
+ echo "'$answ' read. Not incrementing anything."
+ echo " your old $conf is restored..."
+ \rm -f $tmpfile
+ \mv -f $backupconf $conf
+ exit 0
+ endif
+
+ endif
+else
+ echo "'$answ' read. Not doing anything."
+endif
+
+exit 0
+
diff --git a/interfaces/Makefile.in b/interfaces/Makefile.in
deleted file mode 100644
index 7e2d2ff..0000000
--- a/interfaces/Makefile.in
+++ /dev/null
@@ -1,665 +0,0 @@
-# Makefile.in generated by automake 1.11.5 from Makefile.am.
-# @configure_input@
-
-# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software
-# Foundation, Inc.
-# This Makefile.in is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
-# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
-# PARTICULAR PURPOSE.
-
- at SET_MAKE@
-
-# Copyright (c) 2010 the LinBox group
-# ========LICENCE========
-# This file is part of the library LinBox.
-#
-# LinBox is free software: you can redistribute it and/or modify
-# it under the terms of the GNU Lesser General Public
-# License as published by the Free Software Foundation; either
-# version 2.1 of the License, or (at your option) any later version.
-#
-# This library 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
-# Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public
-# License along with this library; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
-# ========LICENCE========
-VPATH = @srcdir@
-am__make_dryrun = \
- { \
- am__dry=no; \
- case $$MAKEFLAGS in \
- *\\[\ \ ]*) \
- echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \
- | grep '^AM OK$$' >/dev/null || am__dry=yes;; \
- *) \
- for am__flg in $$MAKEFLAGS; do \
- case $$am__flg in \
- *=*|--*) ;; \
- *n*) am__dry=yes; break;; \
- esac; \
- done;; \
- esac; \
- test $$am__dry = yes; \
- }
-pkgdatadir = $(datadir)/@PACKAGE@
-pkgincludedir = $(includedir)/@PACKAGE@
-pkglibdir = $(libdir)/@PACKAGE@
-pkglibexecdir = $(libexecdir)/@PACKAGE@
-am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
-install_sh_DATA = $(install_sh) -c -m 644
-install_sh_PROGRAM = $(install_sh) -c
-install_sh_SCRIPT = $(install_sh) -c
-INSTALL_HEADER = $(INSTALL_DATA)
-transform = $(program_transform_name)
-NORMAL_INSTALL = :
-PRE_INSTALL = :
-POST_INSTALL = :
-NORMAL_UNINSTALL = :
-PRE_UNINSTALL = :
-POST_UNINSTALL = :
-build_triplet = @build@
-host_triplet = @host@
-subdir = interfaces
-DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in
-ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-am__aclocal_m4_deps = $(top_srcdir)/macros/aclocal-include.m4 \
- $(top_srcdir)/macros/config-header.m4 \
- $(top_srcdir)/macros/debug.m4 \
- $(top_srcdir)/macros/expat-check.m4 \
- $(top_srcdir)/macros/fflas-ffpack-check.m4 \
- $(top_srcdir)/macros/fplll-check.m4 \
- $(top_srcdir)/macros/givaro-check.m4 \
- $(top_srcdir)/macros/gmp-check.m4 \
- $(top_srcdir)/macros/iml-check.m4 \
- $(top_srcdir)/macros/lapack-check.m4 \
- $(top_srcdir)/macros/libtool.m4 \
- $(top_srcdir)/macros/lidia-check.m4 \
- $(top_srcdir)/macros/linbox-benchmark.m4 \
- $(top_srcdir)/macros/linbox-doc.m4 \
- $(top_srcdir)/macros/linbox-misc.m4 \
- $(top_srcdir)/macros/linbox-opt.m4 \
- $(top_srcdir)/macros/ltoptions.m4 \
- $(top_srcdir)/macros/ltsugar.m4 \
- $(top_srcdir)/macros/ltversion.m4 \
- $(top_srcdir)/macros/lt~obsolete.m4 \
- $(top_srcdir)/macros/m4ri-check.m4 \
- $(top_srcdir)/macros/m4rie-check.m4 \
- $(top_srcdir)/macros/maple-check.m4 \
- $(top_srcdir)/macros/mpfr-check.m4 \
- $(top_srcdir)/macros/ntl-check.m4 \
- $(top_srcdir)/macros/saclib-check.m4 \
- $(top_srcdir)/macros/sage-check.m4 $(top_srcdir)/configure.ac
-am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
- $(ACLOCAL_M4)
-mkinstalldirs = $(install_sh) -d
-CONFIG_HEADER = $(top_builddir)/config.h
-CONFIG_CLEAN_FILES =
-CONFIG_CLEAN_VPATH_FILES =
-depcomp =
-am__depfiles_maybe =
-SOURCES =
-DIST_SOURCES =
-RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \
- html-recursive info-recursive install-data-recursive \
- install-dvi-recursive install-exec-recursive \
- install-html-recursive install-info-recursive \
- install-pdf-recursive install-ps-recursive install-recursive \
- installcheck-recursive installdirs-recursive pdf-recursive \
- ps-recursive uninstall-recursive
-am__can_run_installinfo = \
- case $$AM_UPDATE_INFO_DIR in \
- n|no|NO) false;; \
- *) (install-info --version) >/dev/null 2>&1;; \
- esac
-RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \
- distclean-recursive maintainer-clean-recursive
-AM_RECURSIVE_TARGETS = $(RECURSIVE_TARGETS:-recursive=) \
- $(RECURSIVE_CLEAN_TARGETS:-recursive=) tags TAGS ctags CTAGS \
- distdir
-ETAGS = etags
-CTAGS = ctags
-DIST_SUBDIRS = $(SUBDIRS)
-DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
-am__relativize = \
- dir0=`pwd`; \
- sed_first='s,^\([^/]*\)/.*$$,\1,'; \
- sed_rest='s,^[^/]*/*,,'; \
- sed_last='s,^.*/\([^/]*\)$$,\1,'; \
- sed_butlast='s,/*[^/]*$$,,'; \
- while test -n "$$dir1"; do \
- first=`echo "$$dir1" | sed -e "$$sed_first"`; \
- if test "$$first" != "."; then \
- if test "$$first" = ".."; then \
- dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \
- dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \
- else \
- first2=`echo "$$dir2" | sed -e "$$sed_first"`; \
- if test "$$first2" = "$$first"; then \
- dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \
- else \
- dir2="../$$dir2"; \
- fi; \
- dir0="$$dir0"/"$$first"; \
- fi; \
- fi; \
- dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \
- done; \
- reldir="$$dir2"
-ACLOCAL = @ACLOCAL@
-AMTAR = @AMTAR@
-AR = @AR@
-AUTOCONF = @AUTOCONF@
-AUTOHEADER = @AUTOHEADER@
-AUTOMAKE = @AUTOMAKE@
-AWK = @AWK@
-BLAS_CFLAGS = @BLAS_CFLAGS@
-BLAS_LIBS = @BLAS_LIBS@
-CC = @CC@
-CCNAM = @CCNAM@
-CFLAGS = @CFLAGS@
-CPPFLAGS = @CPPFLAGS@
-CXX = @CXX@
-CXXCPP = @CXXCPP@
-CXXFLAGS = @CXXFLAGS@
-CYGPATH_W = @CYGPATH_W@
-DBG = @DBG@
-DEBUG_CFLAGS = @DEBUG_CFLAGS@
-DEFAULT_CFLAGS = @DEFAULT_CFLAGS@
-DEFS = @DEFS@
-DLLTOOL = @DLLTOOL@
-DSYMUTIL = @DSYMUTIL@
-DUMPBIN = @DUMPBIN@
-ECHO_C = @ECHO_C@
-ECHO_N = @ECHO_N@
-ECHO_T = @ECHO_T@
-EGREP = @EGREP@
-EXEEXT = @EXEEXT@
-EXPAT_CFLAGS = @EXPAT_CFLAGS@
-EXPAT_LIBS = @EXPAT_LIBS@
-FFLAS_FFPACK_CFLAGS = @FFLAS_FFPACK_CFLAGS@
-FFLAS_FFPACK_LIBS = @FFLAS_FFPACK_LIBS@
-FFLAS_FFPACK_LOC = @FFLAS_FFPACK_LOC@
-FGREP = @FGREP@
-FPLLL_CFLAGS = @FPLLL_CFLAGS@
-FPLLL_LIBS = @FPLLL_LIBS@
-GIVARO_CFLAGS = @GIVARO_CFLAGS@
-GIVARO_LIBS = @GIVARO_LIBS@
-GMP_CFLAGS = @GMP_CFLAGS@
-GMP_LIBS = @GMP_LIBS@
-GMP_VERSION = @GMP_VERSION@
-GREP = @GREP@
-IML_CFLAGS = @IML_CFLAGS@
-IML_LIBS = @IML_LIBS@
-INSTALL = @INSTALL@
-INSTALL_DATA = @INSTALL_DATA@
-INSTALL_PROGRAM = @INSTALL_PROGRAM@
-INSTALL_SCRIPT = @INSTALL_SCRIPT@
-INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
-LD = @LD@
-LDFLAGS = @LDFLAGS@
-LIBOBJS = @LIBOBJS@
-LIBS = @LIBS@
-LIBTOOL = @LIBTOOL@
-LIDIA_CFLAGS = @LIDIA_CFLAGS@
-LIDIA_LIBS = @LIDIA_LIBS@
-LINBOX_BENCH_PATH = @LINBOX_BENCH_PATH@
-LINBOX_DOC_PATH = @LINBOX_DOC_PATH@
-LIPO = @LIPO@
-LN_S = @LN_S@
-LTLIBOBJS = @LTLIBOBJS@
-M4RIE_CFLAGS = @M4RIE_CFLAGS@
-M4RIE_LIBS = @M4RIE_LIBS@
-M4RI_CFLAGS = @M4RI_CFLAGS@
-M4RI_LIBS = @M4RI_LIBS@
-MAINT = @MAINT@
-MAKEINFO = @MAKEINFO@
-MANIFEST_TOOL = @MANIFEST_TOOL@
-MAPLE_CFLAGS = @MAPLE_CFLAGS@
-MAPLE_HOME = @MAPLE_HOME@
-MAPLE_LIBS = @MAPLE_LIBS@
-MAPLE_VERSION = @MAPLE_VERSION@
-MKDIR_P = @MKDIR_P@
-MPFR_CFLAGS = @MPFR_CFLAGS@
-MPFR_LIBS = @MPFR_LIBS@
-NM = @NM@
-NMEDIT = @NMEDIT@
-NTL_CFLAGS = @NTL_CFLAGS@
-NTL_LIBS = @NTL_LIBS@
-OBJDUMP = @OBJDUMP@
-OBJEXT = @OBJEXT@
-OTOOL = @OTOOL@
-OTOOL64 = @OTOOL64@
-PACKAGE = @PACKAGE@
-PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
-PACKAGE_NAME = @PACKAGE_NAME@
-PACKAGE_STRING = @PACKAGE_STRING@
-PACKAGE_TARNAME = @PACKAGE_TARNAME@
-PACKAGE_URL = @PACKAGE_URL@
-PACKAGE_VERSION = @PACKAGE_VERSION@
-PATH_SEPARATOR = @PATH_SEPARATOR@
-PROF = @PROF@
-RANLIB = @RANLIB@
-RM = @RM@
-SACLIB_CFLAGS = @SACLIB_CFLAGS@
-SACLIB_LIBS = @SACLIB_LIBS@
-SED = @SED@
-SET_MAKE = @SET_MAKE@
-SHELL = @SHELL@
-STRIP = @STRIP@
-TESTS_CFLAGS = @TESTS_CFLAGS@
-VERSION = @VERSION@
-WARN = @WARN@
-abs_builddir = @abs_builddir@
-abs_srcdir = @abs_srcdir@
-abs_top_builddir = @abs_top_builddir@
-abs_top_srcdir = @abs_top_srcdir@
-ac_ct_AR = @ac_ct_AR@
-ac_ct_CC = @ac_ct_CC@
-ac_ct_CXX = @ac_ct_CXX@
-ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
-am__leading_dot = @am__leading_dot@
-am__tar = @am__tar@
-am__untar = @am__untar@
-bindir = @bindir@
-build = @build@
-build_alias = @build_alias@
-build_cpu = @build_cpu@
-build_os = @build_os@
-build_vendor = @build_vendor@
-builddir = @builddir@
-datadir = @datadir@
-datarootdir = @datarootdir@
-docdir = @docdir@
-dvidir = @dvidir@
-exec_prefix = @exec_prefix@
-host = @host@
-host_alias = @host_alias@
-host_cpu = @host_cpu@
-host_os = @host_os@
-host_vendor = @host_vendor@
-htmldir = @htmldir@
-includedir = @includedir@
-infodir = @infodir@
-install_sh = @install_sh@
-libdir = @libdir@
-libexecdir = @libexecdir@
-localedir = @localedir@
-localstatedir = @localstatedir@
-mandir = @mandir@
-mkdir_p = @mkdir_p@
-oldincludedir = @oldincludedir@
-pdfdir = @pdfdir@
-prefix = @prefix@
-program_transform_name = @program_transform_name@
-psdir = @psdir@
-sbindir = @sbindir@
-sharedstatedir = @sharedstatedir@
-srcdir = @srcdir@
-sysconfdir = @sysconfdir@
-target_alias = @target_alias@
-top_build_prefix = @top_build_prefix@
-top_builddir = @top_builddir@
-top_srcdir = @top_srcdir@
-SUBDIRS = driver kaapi maple sage
-all: all-recursive
-
-.SUFFIXES:
-$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps)
- @for dep in $?; do \
- case '$(am__configure_deps)' in \
- *$$dep*) \
- ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
- && { if test -f $@; then exit 0; else break; fi; }; \
- exit 1;; \
- esac; \
- done; \
- echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu --ignore-deps interfaces/Makefile'; \
- $(am__cd) $(top_srcdir) && \
- $(AUTOMAKE) --gnu --ignore-deps interfaces/Makefile
-.PRECIOUS: Makefile
-Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
- @case '$?' in \
- *config.status*) \
- cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
- *) \
- echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
- cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
- esac;
-
-$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
- cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-
-$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
- cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
- cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-$(am__aclocal_m4_deps):
-
-mostlyclean-libtool:
- -rm -f *.lo
-
-clean-libtool:
- -rm -rf .libs _libs
-
-# This directory's subdirectories are mostly independent; you can cd
-# into them and run `make' without going through this Makefile.
-# To change the values of `make' variables: instead of editing Makefiles,
-# (1) if the variable is set in `config.status', edit `config.status'
-# (which will cause the Makefiles to be regenerated when you run `make');
-# (2) otherwise, pass the desired values on the `make' command line.
-$(RECURSIVE_TARGETS):
- @fail= failcom='exit 1'; \
- for f in x $$MAKEFLAGS; do \
- case $$f in \
- *=* | --[!k]*);; \
- *k*) failcom='fail=yes';; \
- esac; \
- done; \
- dot_seen=no; \
- target=`echo $@ | sed s/-recursive//`; \
- list='$(SUBDIRS)'; for subdir in $$list; do \
- echo "Making $$target in $$subdir"; \
- if test "$$subdir" = "."; then \
- dot_seen=yes; \
- local_target="$$target-am"; \
- else \
- local_target="$$target"; \
- fi; \
- ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
- || eval $$failcom; \
- done; \
- if test "$$dot_seen" = "no"; then \
- $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \
- fi; test -z "$$fail"
-
-$(RECURSIVE_CLEAN_TARGETS):
- @fail= failcom='exit 1'; \
- for f in x $$MAKEFLAGS; do \
- case $$f in \
- *=* | --[!k]*);; \
- *k*) failcom='fail=yes';; \
- esac; \
- done; \
- dot_seen=no; \
- case "$@" in \
- distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \
- *) list='$(SUBDIRS)' ;; \
- esac; \
- rev=''; for subdir in $$list; do \
- if test "$$subdir" = "."; then :; else \
- rev="$$subdir $$rev"; \
- fi; \
- done; \
- rev="$$rev ."; \
- target=`echo $@ | sed s/-recursive//`; \
- for subdir in $$rev; do \
- echo "Making $$target in $$subdir"; \
- if test "$$subdir" = "."; then \
- local_target="$$target-am"; \
- else \
- local_target="$$target"; \
- fi; \
- ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
- || eval $$failcom; \
- done && test -z "$$fail"
-tags-recursive:
- list='$(SUBDIRS)'; for subdir in $$list; do \
- test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \
- done
-ctags-recursive:
- list='$(SUBDIRS)'; for subdir in $$list; do \
- test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \
- done
-
-ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
- list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
- unique=`for i in $$list; do \
- if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
- done | \
- $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
- END { if (nonempty) { for (i in files) print i; }; }'`; \
- mkid -fID $$unique
-tags: TAGS
-
-TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
- $(TAGS_FILES) $(LISP)
- set x; \
- here=`pwd`; \
- if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \
- include_option=--etags-include; \
- empty_fix=.; \
- else \
- include_option=--include; \
- empty_fix=; \
- fi; \
- list='$(SUBDIRS)'; for subdir in $$list; do \
- if test "$$subdir" = .; then :; else \
- test ! -f $$subdir/TAGS || \
- set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \
- fi; \
- done; \
- list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
- unique=`for i in $$list; do \
- if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
- done | \
- $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
- END { if (nonempty) { for (i in files) print i; }; }'`; \
- shift; \
- if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
- test -n "$$unique" || unique=$$empty_fix; \
- if test $$# -gt 0; then \
- $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
- "$$@" $$unique; \
- else \
- $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
- $$unique; \
- fi; \
- fi
-ctags: CTAGS
-CTAGS: ctags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
- $(TAGS_FILES) $(LISP)
- list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
- unique=`for i in $$list; do \
- if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
- done | \
- $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
- END { if (nonempty) { for (i in files) print i; }; }'`; \
- test -z "$(CTAGS_ARGS)$$unique" \
- || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
- $$unique
-
-GTAGS:
- here=`$(am__cd) $(top_builddir) && pwd` \
- && $(am__cd) $(top_srcdir) \
- && gtags -i $(GTAGS_ARGS) "$$here"
-
-distclean-tags:
- -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
-
-distdir: $(DISTFILES)
- @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
- topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
- list='$(DISTFILES)'; \
- dist_files=`for file in $$list; do echo $$file; done | \
- sed -e "s|^$$srcdirstrip/||;t" \
- -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
- case $$dist_files in \
- */*) $(MKDIR_P) `echo "$$dist_files" | \
- sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
- sort -u` ;; \
- esac; \
- for file in $$dist_files; do \
- if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
- if test -d $$d/$$file; then \
- dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
- if test -d "$(distdir)/$$file"; then \
- find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
- fi; \
- if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
- cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
- find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
- fi; \
- cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
- else \
- test -f "$(distdir)/$$file" \
- || cp -p $$d/$$file "$(distdir)/$$file" \
- || exit 1; \
- fi; \
- done
- @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \
- if test "$$subdir" = .; then :; else \
- $(am__make_dryrun) \
- || test -d "$(distdir)/$$subdir" \
- || $(MKDIR_P) "$(distdir)/$$subdir" \
- || exit 1; \
- dir1=$$subdir; dir2="$(distdir)/$$subdir"; \
- $(am__relativize); \
- new_distdir=$$reldir; \
- dir1=$$subdir; dir2="$(top_distdir)"; \
- $(am__relativize); \
- new_top_distdir=$$reldir; \
- echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \
- echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \
- ($(am__cd) $$subdir && \
- $(MAKE) $(AM_MAKEFLAGS) \
- top_distdir="$$new_top_distdir" \
- distdir="$$new_distdir" \
- am__remove_distdir=: \
- am__skip_length_check=: \
- am__skip_mode_fix=: \
- distdir) \
- || exit 1; \
- fi; \
- done
-check-am: all-am
-check: check-recursive
-all-am: Makefile
-installdirs: installdirs-recursive
-installdirs-am:
-install: install-recursive
-install-exec: install-exec-recursive
-install-data: install-data-recursive
-uninstall: uninstall-recursive
-
-install-am: all-am
- @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
-
-installcheck: installcheck-recursive
-install-strip:
- if test -z '$(STRIP)'; then \
- $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
- install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
- install; \
- else \
- $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
- install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
- "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
- fi
-mostlyclean-generic:
-
-clean-generic:
-
-distclean-generic:
- -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
- -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
-
-maintainer-clean-generic:
- @echo "This command is intended for maintainers to use"
- @echo "it deletes files that may require special tools to rebuild."
-clean: clean-recursive
-
-clean-am: clean-generic clean-libtool mostlyclean-am
-
-distclean: distclean-recursive
- -rm -f Makefile
-distclean-am: clean-am distclean-generic distclean-tags
-
-dvi: dvi-recursive
-
-dvi-am:
-
-html: html-recursive
-
-html-am:
-
-info: info-recursive
-
-info-am:
-
-install-data-am:
-
-install-dvi: install-dvi-recursive
-
-install-dvi-am:
-
-install-exec-am:
-
-install-html: install-html-recursive
-
-install-html-am:
-
-install-info: install-info-recursive
-
-install-info-am:
-
-install-man:
-
-install-pdf: install-pdf-recursive
-
-install-pdf-am:
-
-install-ps: install-ps-recursive
-
-install-ps-am:
-
-installcheck-am:
-
-maintainer-clean: maintainer-clean-recursive
- -rm -f Makefile
-maintainer-clean-am: distclean-am maintainer-clean-generic
-
-mostlyclean: mostlyclean-recursive
-
-mostlyclean-am: mostlyclean-generic mostlyclean-libtool
-
-pdf: pdf-recursive
-
-pdf-am:
-
-ps: ps-recursive
-
-ps-am:
-
-uninstall-am:
-
-.MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) ctags-recursive \
- install-am install-strip tags-recursive
-
-.PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \
- all all-am check check-am clean clean-generic clean-libtool \
- ctags ctags-recursive distclean distclean-generic \
- distclean-libtool distclean-tags distdir dvi dvi-am html \
- html-am info info-am install install-am install-data \
- install-data-am install-dvi install-dvi-am install-exec \
- install-exec-am install-html install-html-am install-info \
- install-info-am install-man install-pdf install-pdf-am \
- install-ps install-ps-am install-strip installcheck \
- installcheck-am installdirs installdirs-am maintainer-clean \
- maintainer-clean-generic mostlyclean mostlyclean-generic \
- mostlyclean-libtool pdf pdf-am ps ps-am tags tags-recursive \
- uninstall uninstall-am
-
-
-# Tell versions [3.59,3.63) of GNU make to not export all variables.
-# Otherwise a system limit (for SysV at least) may be exceeded.
-.NOEXPORT:
diff --git a/interfaces/driver/Makefile.am b/interfaces/driver/Makefile.am
index 8779c20..4c4e947 100644
--- a/interfaces/driver/Makefile.am
+++ b/interfaces/driver/Makefile.am
@@ -22,13 +22,13 @@ pkgincludesubdir=$(includedir)/interfaces/driver
AM_CPPFLAGS=-I$(top_srcdir) -I. -I../../linbox
-AM_CXXFLAGS = @DEFAULT_CFLAGS@ -DDISABLE_COMMENTATOR $(GMP_CFLAGS) $(FFLAS_FFPACK_CFLAGS) $(BLAS_CFLAGS) $(GIVARO_CFLAGS)
+AM_CXXFLAGS = @DEFAULT_CFLAGS@ -DDISABLE_COMMENTATOR
#ifdef HAVE_NTL
AM_CXXFLAGS +=$(NTL_CFLAGS)
#endif
-#LDADD= $(GMP_LIBS) $(NTL_LIBS) $(BLAS_LIBS) $(MAPLE_LIBS) $(GIVARO_LIBS) "../../linbox/liblinbox.la -z muldefs"
+#LDADD= $(GMP_LIBS) $(NTL_LIBS) $(MAPLE_LIBS) "../../linbox/liblinbox.la -z muldefs"
lib_LTLIBRARIES=liblbdriver.la
@@ -46,7 +46,7 @@ liblbdriver_la_SOURCES= lb-element.C \
# \
# lb-solve.C
-liblbdriver_la_LDFLAGS=$(GIVARO_LIBS) $(GMP_LIBS) $(NTL_LIBS) $(BLAS_LIBS) $(LDFLAGS) $(top_srcdir)/linbox/liblinbox.la -Wl,-zmuldefs
+liblbdriver_la_LDFLAGS= $(NTL_LIBS) $(LDFLAGS) $(top_srcdir)/linbox/liblinbox.la -Wl,-zmuldefs
diff --git a/interfaces/driver/Makefile.in b/interfaces/driver/Makefile.in
deleted file mode 100644
index 8580dd8..0000000
--- a/interfaces/driver/Makefile.in
+++ /dev/null
@@ -1,730 +0,0 @@
-# Makefile.in generated by automake 1.11.5 from Makefile.am.
-# @configure_input@
-
-# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software
-# Foundation, Inc.
-# This Makefile.in is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
-# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
-# PARTICULAR PURPOSE.
-
- at SET_MAKE@
-
-# Copyright (c) 2010 the LinBox group
-#========LICENCE========
-# This file is part of the library LinBox.
-#
-# LinBox is free software: you can redistribute it and/or modify
-# it under the terms of the GNU Lesser General Public
-# License as published by the Free Software Foundation; either
-# version 2.1 of the License, or (at your option) any later version.
-#
-# This library 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
-# Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public
-# License along with this library; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
-# ========LICENCE========
-
-
-VPATH = @srcdir@
-am__make_dryrun = \
- { \
- am__dry=no; \
- case $$MAKEFLAGS in \
- *\\[\ \ ]*) \
- echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \
- | grep '^AM OK$$' >/dev/null || am__dry=yes;; \
- *) \
- for am__flg in $$MAKEFLAGS; do \
- case $$am__flg in \
- *=*|--*) ;; \
- *n*) am__dry=yes; break;; \
- esac; \
- done;; \
- esac; \
- test $$am__dry = yes; \
- }
-pkgdatadir = $(datadir)/@PACKAGE@
-pkgincludedir = $(includedir)/@PACKAGE@
-pkglibdir = $(libdir)/@PACKAGE@
-pkglibexecdir = $(libexecdir)/@PACKAGE@
-am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
-install_sh_DATA = $(install_sh) -c -m 644
-install_sh_PROGRAM = $(install_sh) -c
-install_sh_SCRIPT = $(install_sh) -c
-INSTALL_HEADER = $(INSTALL_DATA)
-transform = $(program_transform_name)
-NORMAL_INSTALL = :
-PRE_INSTALL = :
-POST_INSTALL = :
-NORMAL_UNINSTALL = :
-PRE_UNINSTALL = :
-POST_UNINSTALL = :
-build_triplet = @build@
-host_triplet = @host@
-subdir = interfaces/driver
-DIST_COMMON = $(am__pkginclude_HEADERS_DIST) $(srcdir)/Makefile.am \
- $(srcdir)/Makefile.in
-ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-am__aclocal_m4_deps = $(top_srcdir)/macros/aclocal-include.m4 \
- $(top_srcdir)/macros/config-header.m4 \
- $(top_srcdir)/macros/debug.m4 \
- $(top_srcdir)/macros/expat-check.m4 \
- $(top_srcdir)/macros/fflas-ffpack-check.m4 \
- $(top_srcdir)/macros/fplll-check.m4 \
- $(top_srcdir)/macros/givaro-check.m4 \
- $(top_srcdir)/macros/gmp-check.m4 \
- $(top_srcdir)/macros/iml-check.m4 \
- $(top_srcdir)/macros/lapack-check.m4 \
- $(top_srcdir)/macros/libtool.m4 \
- $(top_srcdir)/macros/lidia-check.m4 \
- $(top_srcdir)/macros/linbox-benchmark.m4 \
- $(top_srcdir)/macros/linbox-doc.m4 \
- $(top_srcdir)/macros/linbox-misc.m4 \
- $(top_srcdir)/macros/linbox-opt.m4 \
- $(top_srcdir)/macros/ltoptions.m4 \
- $(top_srcdir)/macros/ltsugar.m4 \
- $(top_srcdir)/macros/ltversion.m4 \
- $(top_srcdir)/macros/lt~obsolete.m4 \
- $(top_srcdir)/macros/m4ri-check.m4 \
- $(top_srcdir)/macros/m4rie-check.m4 \
- $(top_srcdir)/macros/maple-check.m4 \
- $(top_srcdir)/macros/mpfr-check.m4 \
- $(top_srcdir)/macros/ntl-check.m4 \
- $(top_srcdir)/macros/saclib-check.m4 \
- $(top_srcdir)/macros/sage-check.m4 $(top_srcdir)/configure.ac
-am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
- $(ACLOCAL_M4)
-mkinstalldirs = $(install_sh) -d
-CONFIG_HEADER = $(top_builddir)/config.h
-CONFIG_CLEAN_FILES =
-CONFIG_CLEAN_VPATH_FILES =
-am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
-am__vpath_adj = case $$p in \
- $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
- *) f=$$p;; \
- esac;
-am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
-am__install_max = 40
-am__nobase_strip_setup = \
- srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
-am__nobase_strip = \
- for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
-am__nobase_list = $(am__nobase_strip_setup); \
- for p in $$list; do echo "$$p $$p"; done | \
- sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
- $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
- if (++n[$$2] == $(am__install_max)) \
- { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
- END { for (dir in files) print dir, files[dir] }'
-am__base_list = \
- sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
- sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
-am__uninstall_files_from_dir = { \
- test -z "$$files" \
- || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \
- || { echo " ( cd '$$dir' && rm -f" $$files ")"; \
- $(am__cd) "$$dir" && rm -f $$files; }; \
- }
-am__installdirs = "$(DESTDIR)$(libdir)" "$(DESTDIR)$(pkgincludedir)"
-LTLIBRARIES = $(lib_LTLIBRARIES)
-liblbdriver_la_LIBADD =
-am__liblbdriver_la_SOURCES_DIST = lb-element.C lb-domain.C lb-vector.C \
- lb-polynomial.C lb-det.C lb-rank.C lb-garbage.C lb-minpoly.C \
- lb-blackbox.C lb-charpoly.C
- at LINBOX_COMPILE_DRIVERS_TRUE@am_liblbdriver_la_OBJECTS = \
- at LINBOX_COMPILE_DRIVERS_TRUE@ lb-element.lo lb-domain.lo \
- at LINBOX_COMPILE_DRIVERS_TRUE@ lb-vector.lo lb-polynomial.lo \
- at LINBOX_COMPILE_DRIVERS_TRUE@ lb-det.lo lb-rank.lo \
- at LINBOX_COMPILE_DRIVERS_TRUE@ lb-garbage.lo lb-minpoly.lo \
- at LINBOX_COMPILE_DRIVERS_TRUE@ lb-blackbox.lo lb-charpoly.lo
-liblbdriver_la_OBJECTS = $(am_liblbdriver_la_OBJECTS)
-liblbdriver_la_LINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) \
- $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \
- $(CXXFLAGS) $(liblbdriver_la_LDFLAGS) $(LDFLAGS) -o $@
- at LINBOX_COMPILE_DRIVERS_TRUE@am_liblbdriver_la_rpath = -rpath \
- at LINBOX_COMPILE_DRIVERS_TRUE@ $(libdir)
-DEFAULT_INCLUDES = -I. at am__isrc@ -I$(top_builddir)
-depcomp =
-am__depfiles_maybe =
-CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
- $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
-LTCXXCOMPILE = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
- --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
- $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
-CXXLD = $(CXX)
-CXXLINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
- --mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \
- $(LDFLAGS) -o $@
-SOURCES = $(liblbdriver_la_SOURCES)
-DIST_SOURCES = $(am__liblbdriver_la_SOURCES_DIST)
-am__can_run_installinfo = \
- case $$AM_UPDATE_INFO_DIR in \
- n|no|NO) false;; \
- *) (install-info --version) >/dev/null 2>&1;; \
- esac
-am__pkginclude_HEADERS_DIST = lb-driver.h lb-blackbox-abstract.h \
- lb-blackbox-type.h lb-domain-function.h \
- lb-element-collection.h lb-polynomial.h lb-vector-data.h \
- lb-blackbox-collection.h lb-charpoly.h lb-domain-functor.h \
- lb-element-data.h lb-rank.h lb-vector-function.h \
- lb-blackbox-data.h lb-det.h lb-domain.h lb-element.h \
- lb-solve.h lb-vector-functor.h lb-blackbox-function.h \
- lb-domain-abstract.h lb-domain-type.h lb-garbage.h \
- lb-utilities.h lb-vector.h lb-blackbox-functor.h \
- lb-domain-collection.h lb-interface.h lb-vector-abstract.h \
- lb-vector-type.h lb-blackbox.h lb-domain-data.h \
- lb-element-abstract.h lb-minpoly.h lb-vector-collection.h
-HEADERS = $(pkginclude_HEADERS)
-ETAGS = etags
-CTAGS = ctags
-DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
-ACLOCAL = @ACLOCAL@
-AMTAR = @AMTAR@
-AR = @AR@
-AUTOCONF = @AUTOCONF@
-AUTOHEADER = @AUTOHEADER@
-AUTOMAKE = @AUTOMAKE@
-AWK = @AWK@
-BLAS_CFLAGS = @BLAS_CFLAGS@
-BLAS_LIBS = @BLAS_LIBS@
-CC = @CC@
-CCNAM = @CCNAM@
-CFLAGS = @CFLAGS@
-CPPFLAGS = @CPPFLAGS@
-CXX = @CXX@
-CXXCPP = @CXXCPP@
-CXXFLAGS = @CXXFLAGS@
-CYGPATH_W = @CYGPATH_W@
-DBG = @DBG@
-DEBUG_CFLAGS = @DEBUG_CFLAGS@
-DEFAULT_CFLAGS = @DEFAULT_CFLAGS@
-DEFS = @DEFS@
-DLLTOOL = @DLLTOOL@
-DSYMUTIL = @DSYMUTIL@
-DUMPBIN = @DUMPBIN@
-ECHO_C = @ECHO_C@
-ECHO_N = @ECHO_N@
-ECHO_T = @ECHO_T@
-EGREP = @EGREP@
-EXEEXT = @EXEEXT@
-EXPAT_CFLAGS = @EXPAT_CFLAGS@
-EXPAT_LIBS = @EXPAT_LIBS@
-FFLAS_FFPACK_CFLAGS = @FFLAS_FFPACK_CFLAGS@
-FFLAS_FFPACK_LIBS = @FFLAS_FFPACK_LIBS@
-FFLAS_FFPACK_LOC = @FFLAS_FFPACK_LOC@
-FGREP = @FGREP@
-FPLLL_CFLAGS = @FPLLL_CFLAGS@
-FPLLL_LIBS = @FPLLL_LIBS@
-GIVARO_CFLAGS = @GIVARO_CFLAGS@
-GIVARO_LIBS = @GIVARO_LIBS@
-GMP_CFLAGS = @GMP_CFLAGS@
-GMP_LIBS = @GMP_LIBS@
-GMP_VERSION = @GMP_VERSION@
-GREP = @GREP@
-IML_CFLAGS = @IML_CFLAGS@
-IML_LIBS = @IML_LIBS@
-INSTALL = @INSTALL@
-INSTALL_DATA = @INSTALL_DATA@
-INSTALL_PROGRAM = @INSTALL_PROGRAM@
-INSTALL_SCRIPT = @INSTALL_SCRIPT@
-INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
-LD = @LD@
-LDFLAGS = @LDFLAGS@
-LIBOBJS = @LIBOBJS@
-LIBS = @LIBS@
-LIBTOOL = @LIBTOOL@
-LIDIA_CFLAGS = @LIDIA_CFLAGS@
-LIDIA_LIBS = @LIDIA_LIBS@
-LINBOX_BENCH_PATH = @LINBOX_BENCH_PATH@
-LINBOX_DOC_PATH = @LINBOX_DOC_PATH@
-LIPO = @LIPO@
-LN_S = @LN_S@
-LTLIBOBJS = @LTLIBOBJS@
-M4RIE_CFLAGS = @M4RIE_CFLAGS@
-M4RIE_LIBS = @M4RIE_LIBS@
-M4RI_CFLAGS = @M4RI_CFLAGS@
-M4RI_LIBS = @M4RI_LIBS@
-MAINT = @MAINT@
-MAKEINFO = @MAKEINFO@
-MANIFEST_TOOL = @MANIFEST_TOOL@
-MAPLE_CFLAGS = @MAPLE_CFLAGS@
-MAPLE_HOME = @MAPLE_HOME@
-MAPLE_LIBS = @MAPLE_LIBS@
-MAPLE_VERSION = @MAPLE_VERSION@
-MKDIR_P = @MKDIR_P@
-MPFR_CFLAGS = @MPFR_CFLAGS@
-MPFR_LIBS = @MPFR_LIBS@
-NM = @NM@
-NMEDIT = @NMEDIT@
-NTL_CFLAGS = @NTL_CFLAGS@
-NTL_LIBS = @NTL_LIBS@
-OBJDUMP = @OBJDUMP@
-OBJEXT = @OBJEXT@
-OTOOL = @OTOOL@
-OTOOL64 = @OTOOL64@
-PACKAGE = @PACKAGE@
-PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
-PACKAGE_NAME = @PACKAGE_NAME@
-PACKAGE_STRING = @PACKAGE_STRING@
-PACKAGE_TARNAME = @PACKAGE_TARNAME@
-PACKAGE_URL = @PACKAGE_URL@
-PACKAGE_VERSION = @PACKAGE_VERSION@
-PATH_SEPARATOR = @PATH_SEPARATOR@
-PROF = @PROF@
-RANLIB = @RANLIB@
-RM = @RM@
-SACLIB_CFLAGS = @SACLIB_CFLAGS@
-SACLIB_LIBS = @SACLIB_LIBS@
-SED = @SED@
-SET_MAKE = @SET_MAKE@
-SHELL = @SHELL@
-STRIP = @STRIP@
-TESTS_CFLAGS = @TESTS_CFLAGS@
-VERSION = @VERSION@
-WARN = @WARN@
-abs_builddir = @abs_builddir@
-abs_srcdir = @abs_srcdir@
-abs_top_builddir = @abs_top_builddir@
-abs_top_srcdir = @abs_top_srcdir@
-ac_ct_AR = @ac_ct_AR@
-ac_ct_CC = @ac_ct_CC@
-ac_ct_CXX = @ac_ct_CXX@
-ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
-am__leading_dot = @am__leading_dot@
-am__tar = @am__tar@
-am__untar = @am__untar@
-bindir = @bindir@
-build = @build@
-build_alias = @build_alias@
-build_cpu = @build_cpu@
-build_os = @build_os@
-build_vendor = @build_vendor@
-builddir = @builddir@
-datadir = @datadir@
-datarootdir = @datarootdir@
-docdir = @docdir@
-dvidir = @dvidir@
-exec_prefix = @exec_prefix@
-host = @host@
-host_alias = @host_alias@
-host_cpu = @host_cpu@
-host_os = @host_os@
-host_vendor = @host_vendor@
-htmldir = @htmldir@
-includedir = @includedir@
-infodir = @infodir@
-install_sh = @install_sh@
-libdir = @libdir@
-libexecdir = @libexecdir@
-localedir = @localedir@
-localstatedir = @localstatedir@
-mandir = @mandir@
-mkdir_p = @mkdir_p@
-oldincludedir = @oldincludedir@
-pdfdir = @pdfdir@
-prefix = @prefix@
-program_transform_name = @program_transform_name@
-psdir = @psdir@
-sbindir = @sbindir@
-sharedstatedir = @sharedstatedir@
-srcdir = @srcdir@
-sysconfdir = @sysconfdir@
-target_alias = @target_alias@
-top_build_prefix = @top_build_prefix@
-top_builddir = @top_builddir@
-top_srcdir = @top_srcdir@
- at LINBOX_COMPILE_DRIVERS_TRUE@pkgincludesubdir = $(includedir)/interfaces/driver
- at LINBOX_COMPILE_DRIVERS_TRUE@AM_CPPFLAGS = -I$(top_srcdir) -I. -I../../linbox
-
-#ifdef HAVE_NTL
- at LINBOX_COMPILE_DRIVERS_TRUE@AM_CXXFLAGS = @DEFAULT_CFLAGS@ \
- at LINBOX_COMPILE_DRIVERS_TRUE@ -DDISABLE_COMMENTATOR \
- at LINBOX_COMPILE_DRIVERS_TRUE@ $(GMP_CFLAGS) \
- at LINBOX_COMPILE_DRIVERS_TRUE@ $(FFLAS_FFPACK_CFLAGS) \
- at LINBOX_COMPILE_DRIVERS_TRUE@ $(BLAS_CFLAGS) $(GIVARO_CFLAGS) \
- at LINBOX_COMPILE_DRIVERS_TRUE@ $(NTL_CFLAGS)
-#endif
-
-#LDADD= $(GMP_LIBS) $(NTL_LIBS) $(BLAS_LIBS) $(MAPLE_LIBS) $(GIVARO_LIBS) "../../linbox/liblinbox.la -z muldefs"
- at LINBOX_COMPILE_DRIVERS_TRUE@lib_LTLIBRARIES = liblbdriver.la
- at LINBOX_COMPILE_DRIVERS_TRUE@liblbdriver_la_SOURCES = lb-element.C \
- at LINBOX_COMPILE_DRIVERS_TRUE@ lb-domain.C \
- at LINBOX_COMPILE_DRIVERS_TRUE@ lb-vector.C \
- at LINBOX_COMPILE_DRIVERS_TRUE@ lb-polynomial.C \
- at LINBOX_COMPILE_DRIVERS_TRUE@ lb-det.C \
- at LINBOX_COMPILE_DRIVERS_TRUE@ lb-rank.C \
- at LINBOX_COMPILE_DRIVERS_TRUE@ lb-garbage.C \
- at LINBOX_COMPILE_DRIVERS_TRUE@ lb-minpoly.C \
- at LINBOX_COMPILE_DRIVERS_TRUE@ lb-blackbox.C \
- at LINBOX_COMPILE_DRIVERS_TRUE@ lb-charpoly.C
-
-# \
-# # lb-solve.C
- at LINBOX_COMPILE_DRIVERS_TRUE@liblbdriver_la_LDFLAGS = $(GIVARO_LIBS) $(GMP_LIBS) $(NTL_LIBS) $(BLAS_LIBS) $(LDFLAGS) $(top_srcdir)/linbox/liblinbox.la -Wl,-zmuldefs
- at LINBOX_COMPILE_DRIVERS_TRUE@pkginclude_HEADERS = \
- at LINBOX_COMPILE_DRIVERS_TRUE@ lb-driver.h \
- at LINBOX_COMPILE_DRIVERS_TRUE@ lb-blackbox-abstract.h \
- at LINBOX_COMPILE_DRIVERS_TRUE@ lb-blackbox-type.h \
- at LINBOX_COMPILE_DRIVERS_TRUE@ lb-domain-function.h \
- at LINBOX_COMPILE_DRIVERS_TRUE@ lb-element-collection.h \
- at LINBOX_COMPILE_DRIVERS_TRUE@ lb-polynomial.h \
- at LINBOX_COMPILE_DRIVERS_TRUE@ lb-vector-data.h \
- at LINBOX_COMPILE_DRIVERS_TRUE@ lb-blackbox-collection.h \
- at LINBOX_COMPILE_DRIVERS_TRUE@ lb-charpoly.h \
- at LINBOX_COMPILE_DRIVERS_TRUE@ lb-domain-functor.h \
- at LINBOX_COMPILE_DRIVERS_TRUE@ lb-element-data.h \
- at LINBOX_COMPILE_DRIVERS_TRUE@ lb-rank.h \
- at LINBOX_COMPILE_DRIVERS_TRUE@ lb-vector-function.h \
- at LINBOX_COMPILE_DRIVERS_TRUE@ lb-blackbox-data.h \
- at LINBOX_COMPILE_DRIVERS_TRUE@ lb-det.h \
- at LINBOX_COMPILE_DRIVERS_TRUE@ lb-domain.h \
- at LINBOX_COMPILE_DRIVERS_TRUE@ lb-element.h \
- at LINBOX_COMPILE_DRIVERS_TRUE@ lb-solve.h \
- at LINBOX_COMPILE_DRIVERS_TRUE@ lb-vector-functor.h \
- at LINBOX_COMPILE_DRIVERS_TRUE@ lb-blackbox-function.h \
- at LINBOX_COMPILE_DRIVERS_TRUE@ lb-domain-abstract.h \
- at LINBOX_COMPILE_DRIVERS_TRUE@ lb-domain-type.h \
- at LINBOX_COMPILE_DRIVERS_TRUE@ lb-garbage.h \
- at LINBOX_COMPILE_DRIVERS_TRUE@ lb-utilities.h \
- at LINBOX_COMPILE_DRIVERS_TRUE@ lb-vector.h \
- at LINBOX_COMPILE_DRIVERS_TRUE@ lb-blackbox-functor.h \
- at LINBOX_COMPILE_DRIVERS_TRUE@ lb-domain-collection.h \
- at LINBOX_COMPILE_DRIVERS_TRUE@ lb-interface.h \
- at LINBOX_COMPILE_DRIVERS_TRUE@ lb-vector-abstract.h \
- at LINBOX_COMPILE_DRIVERS_TRUE@ lb-vector-type.h \
- at LINBOX_COMPILE_DRIVERS_TRUE@ lb-blackbox.h \
- at LINBOX_COMPILE_DRIVERS_TRUE@ lb-domain-data.h \
- at LINBOX_COMPILE_DRIVERS_TRUE@ lb-element-abstract.h \
- at LINBOX_COMPILE_DRIVERS_TRUE@ lb-minpoly.h \
- at LINBOX_COMPILE_DRIVERS_TRUE@ lb-vector-collection.h
-
-all: all-am
-
-.SUFFIXES:
-.SUFFIXES: .C .lo .o .obj
-$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps)
- @for dep in $?; do \
- case '$(am__configure_deps)' in \
- *$$dep*) \
- ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
- && { if test -f $@; then exit 0; else break; fi; }; \
- exit 1;; \
- esac; \
- done; \
- echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu --ignore-deps interfaces/driver/Makefile'; \
- $(am__cd) $(top_srcdir) && \
- $(AUTOMAKE) --gnu --ignore-deps interfaces/driver/Makefile
-.PRECIOUS: Makefile
-Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
- @case '$?' in \
- *config.status*) \
- cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
- *) \
- echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
- cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
- esac;
-
-$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
- cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-
-$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
- cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
- cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-$(am__aclocal_m4_deps):
-install-libLTLIBRARIES: $(lib_LTLIBRARIES)
- @$(NORMAL_INSTALL)
- @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \
- list2=; for p in $$list; do \
- if test -f $$p; then \
- list2="$$list2 $$p"; \
- else :; fi; \
- done; \
- test -z "$$list2" || { \
- echo " $(MKDIR_P) '$(DESTDIR)$(libdir)'"; \
- $(MKDIR_P) "$(DESTDIR)$(libdir)" || exit 1; \
- echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(libdir)'"; \
- $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(libdir)"; \
- }
-
-uninstall-libLTLIBRARIES:
- @$(NORMAL_UNINSTALL)
- @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \
- for p in $$list; do \
- $(am__strip_dir) \
- echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(libdir)/$$f'"; \
- $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(libdir)/$$f"; \
- done
-
-clean-libLTLIBRARIES:
- -test -z "$(lib_LTLIBRARIES)" || rm -f $(lib_LTLIBRARIES)
- @list='$(lib_LTLIBRARIES)'; for p in $$list; do \
- dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \
- test "$$dir" != "$$p" || dir=.; \
- echo "rm -f \"$${dir}/so_locations\""; \
- rm -f "$${dir}/so_locations"; \
- done
-liblbdriver.la: $(liblbdriver_la_OBJECTS) $(liblbdriver_la_DEPENDENCIES) $(EXTRA_liblbdriver_la_DEPENDENCIES)
- $(liblbdriver_la_LINK) $(am_liblbdriver_la_rpath) $(liblbdriver_la_OBJECTS) $(liblbdriver_la_LIBADD) $(LIBS)
-
-mostlyclean-compile:
- -rm -f *.$(OBJEXT)
-
-distclean-compile:
- -rm -f *.tab.c
-
-.C.o:
- $(CXXCOMPILE) -c -o $@ $<
-
-.C.obj:
- $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
-
-.C.lo:
- $(LTCXXCOMPILE) -c -o $@ $<
-
-mostlyclean-libtool:
- -rm -f *.lo
-
-clean-libtool:
- -rm -rf .libs _libs
-install-pkgincludeHEADERS: $(pkginclude_HEADERS)
- @$(NORMAL_INSTALL)
- @list='$(pkginclude_HEADERS)'; test -n "$(pkgincludedir)" || list=; \
- if test -n "$$list"; then \
- echo " $(MKDIR_P) '$(DESTDIR)$(pkgincludedir)'"; \
- $(MKDIR_P) "$(DESTDIR)$(pkgincludedir)" || exit 1; \
- fi; \
- for p in $$list; do \
- if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
- echo "$$d$$p"; \
- done | $(am__base_list) | \
- while read files; do \
- echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(pkgincludedir)'"; \
- $(INSTALL_HEADER) $$files "$(DESTDIR)$(pkgincludedir)" || exit $$?; \
- done
-
-uninstall-pkgincludeHEADERS:
- @$(NORMAL_UNINSTALL)
- @list='$(pkginclude_HEADERS)'; test -n "$(pkgincludedir)" || list=; \
- files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
- dir='$(DESTDIR)$(pkgincludedir)'; $(am__uninstall_files_from_dir)
-
-ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
- list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
- unique=`for i in $$list; do \
- if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
- done | \
- $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
- END { if (nonempty) { for (i in files) print i; }; }'`; \
- mkid -fID $$unique
-tags: TAGS
-
-TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
- $(TAGS_FILES) $(LISP)
- set x; \
- here=`pwd`; \
- list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
- unique=`for i in $$list; do \
- if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
- done | \
- $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
- END { if (nonempty) { for (i in files) print i; }; }'`; \
- shift; \
- if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
- test -n "$$unique" || unique=$$empty_fix; \
- if test $$# -gt 0; then \
- $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
- "$$@" $$unique; \
- else \
- $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
- $$unique; \
- fi; \
- fi
-ctags: CTAGS
-CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
- $(TAGS_FILES) $(LISP)
- list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
- unique=`for i in $$list; do \
- if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
- done | \
- $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
- END { if (nonempty) { for (i in files) print i; }; }'`; \
- test -z "$(CTAGS_ARGS)$$unique" \
- || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
- $$unique
-
-GTAGS:
- here=`$(am__cd) $(top_builddir) && pwd` \
- && $(am__cd) $(top_srcdir) \
- && gtags -i $(GTAGS_ARGS) "$$here"
-
-distclean-tags:
- -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
-
-distdir: $(DISTFILES)
- @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
- topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
- list='$(DISTFILES)'; \
- dist_files=`for file in $$list; do echo $$file; done | \
- sed -e "s|^$$srcdirstrip/||;t" \
- -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
- case $$dist_files in \
- */*) $(MKDIR_P) `echo "$$dist_files" | \
- sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
- sort -u` ;; \
- esac; \
- for file in $$dist_files; do \
- if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
- if test -d $$d/$$file; then \
- dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
- if test -d "$(distdir)/$$file"; then \
- find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
- fi; \
- if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
- cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
- find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
- fi; \
- cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
- else \
- test -f "$(distdir)/$$file" \
- || cp -p $$d/$$file "$(distdir)/$$file" \
- || exit 1; \
- fi; \
- done
-check-am: all-am
-check: check-am
-all-am: Makefile $(LTLIBRARIES) $(HEADERS)
-installdirs:
- for dir in "$(DESTDIR)$(libdir)" "$(DESTDIR)$(pkgincludedir)"; do \
- test -z "$$dir" || $(MKDIR_P) "$$dir"; \
- done
-install: install-am
-install-exec: install-exec-am
-install-data: install-data-am
-uninstall: uninstall-am
-
-install-am: all-am
- @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
-
-installcheck: installcheck-am
-install-strip:
- if test -z '$(STRIP)'; then \
- $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
- install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
- install; \
- else \
- $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
- install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
- "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
- fi
-mostlyclean-generic:
-
-clean-generic:
-
-distclean-generic:
- -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
- -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
-
-maintainer-clean-generic:
- @echo "This command is intended for maintainers to use"
- @echo "it deletes files that may require special tools to rebuild."
-clean: clean-am
-
-clean-am: clean-generic clean-libLTLIBRARIES clean-libtool \
- mostlyclean-am
-
-distclean: distclean-am
- -rm -f Makefile
-distclean-am: clean-am distclean-compile distclean-generic \
- distclean-tags
-
-dvi: dvi-am
-
-dvi-am:
-
-html: html-am
-
-html-am:
-
-info: info-am
-
-info-am:
-
-install-data-am: install-pkgincludeHEADERS
-
-install-dvi: install-dvi-am
-
-install-dvi-am:
-
-install-exec-am: install-libLTLIBRARIES
-
-install-html: install-html-am
-
-install-html-am:
-
-install-info: install-info-am
-
-install-info-am:
-
-install-man:
-
-install-pdf: install-pdf-am
-
-install-pdf-am:
-
-install-ps: install-ps-am
-
-install-ps-am:
-
-installcheck-am:
-
-maintainer-clean: maintainer-clean-am
- -rm -f Makefile
-maintainer-clean-am: distclean-am maintainer-clean-generic
-
-mostlyclean: mostlyclean-am
-
-mostlyclean-am: mostlyclean-compile mostlyclean-generic \
- mostlyclean-libtool
-
-pdf: pdf-am
-
-pdf-am:
-
-ps: ps-am
-
-ps-am:
-
-uninstall-am: uninstall-libLTLIBRARIES uninstall-pkgincludeHEADERS
-
-.MAKE: install-am install-strip
-
-.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \
- clean-libLTLIBRARIES clean-libtool ctags distclean \
- distclean-compile distclean-generic distclean-libtool \
- distclean-tags distdir dvi dvi-am html html-am info info-am \
- install install-am install-data install-data-am install-dvi \
- install-dvi-am install-exec install-exec-am install-html \
- install-html-am install-info install-info-am \
- install-libLTLIBRARIES install-man install-pdf install-pdf-am \
- install-pkgincludeHEADERS install-ps install-ps-am \
- install-strip installcheck installcheck-am installdirs \
- maintainer-clean maintainer-clean-generic mostlyclean \
- mostlyclean-compile mostlyclean-generic mostlyclean-libtool \
- pdf pdf-am ps ps-am tags uninstall uninstall-am \
- uninstall-libLTLIBRARIES uninstall-pkgincludeHEADERS
-
-
-# Tell versions [3.59,3.63) of GNU make to not export all variables.
-# Otherwise a system limit (for SysV at least) may be exceeded.
-.NOEXPORT:
diff --git a/interfaces/driver/compile-readme.txt b/interfaces/driver/compile-readme.txt
new file mode 100644
index 0000000..62bded3
--- /dev/null
+++ b/interfaces/driver/compile-readme.txt
@@ -0,0 +1,4 @@
+CAREFUL
+
+with IA64, all libraries used in the link edition need to be compiled with the option -fPIC -DPIC
+this is mandatory to provide a dynamic library.
\ No newline at end of file
diff --git a/interfaces/driver/lb-blackbox-data.h b/interfaces/driver/lb-blackbox-data.h
index 8ccefe9..f565b73 100644
--- a/interfaces/driver/lb-blackbox-data.h
+++ b/interfaces/driver/lb-blackbox-data.h
@@ -25,7 +25,7 @@
#ifndef __LINBOX_lb_blackbox_data_H
#define __LINBOX_lb_blackbox_data_H
-#include "linbox/blackbox/sparse.h"
+#include "linbox/matrix/sparse-matrix.h"
#include "linbox/util/matrix-stream.h"
#include <map>
#include <utility>
@@ -148,7 +148,8 @@ public:
{
Blackbox<DomainSource> *B_source= static_cast<Blackbox<DomainSource> * > (ptr);
Blackbox<DomainTarget> *B_target = NULL; /* was not init't */
- typename Blackbox<DomainSource>::template rebind<DomainTarget>()(*B_target, *B_source, *D);
+// typename Blackbox<DomainSource>::template rebind<DomainTarget>()(*B_target, *B_source, *D);
+ typename Blackbox<DomainSource>::template rebind<DomainTarget>()(*B_target, *B_source);
delete B_source;
ptr = B_target;
}
diff --git a/interfaces/driver/lb-blackbox-functor.h b/interfaces/driver/lb-blackbox-functor.h
index 16c55b6..1848e35 100644
--- a/interfaces/driver/lb-blackbox-functor.h
+++ b/interfaces/driver/lb-blackbox-functor.h
@@ -53,7 +53,7 @@ public:
* Macro for automatic code generation *
***************************************/
#define LB_BLACKBOX_VISIT(B) \
-void visit(const B &d){apply(d);}
+void visit(const B &d){this->apply(d);}
/**********************************************************************************
diff --git a/interfaces/driver/lb-blackbox-type.h b/interfaces/driver/lb-blackbox-type.h
index 9e95062..1e4d518 100644
--- a/interfaces/driver/lb-blackbox-type.h
+++ b/interfaces/driver/lb-blackbox-type.h
@@ -25,7 +25,7 @@
#ifndef __LINBOX_lb_blackbox_type_H
#define __LINBOX_lb_blackbox_type_H
-#include <linbox/matrix/blas-matrix.h>
+#include <linbox/matrix/dense-matrix.h>
/****************************************
* Define the list of all Blackbox Type *
diff --git a/interfaces/driver/lb-blackbox.C b/interfaces/driver/lb-blackbox.C
index bb1cdf5..94f272e 100644
--- a/interfaces/driver/lb-blackbox.C
+++ b/interfaces/driver/lb-blackbox.C
@@ -25,7 +25,7 @@
#ifndef __LINBOX_lb_blackbox_C
#define __LINBOX_lb_blackbox_C
-#include "linbox-config.h"
+#include "linbox/linbox-config.h"
#include <lb-blackbox.h>
#include <lb-blackbox-function.h>
diff --git a/interfaces/driver/lb-charpoly.C b/interfaces/driver/lb-charpoly.C
index 5406907..df803bc 100644
--- a/interfaces/driver/lb-charpoly.C
+++ b/interfaces/driver/lb-charpoly.C
@@ -27,9 +27,7 @@
#include "linbox/solutions/charpoly.h"
-#ifdef __LINBOX_HAVE_GIVARO
#include "linbox/ring/givaro-polynomial.h"
-#endif
#include <lb-charpoly.h>
@@ -55,7 +53,7 @@ public:
void operator() (Result &res, Blackbox *B) const {
typedef typename Blackbox::Field Field;
typedef typename Field::Element Element;
-#ifdef __LINBOX_HAVE_GIVARO
+
// use givpolynomial du to non genericity of charpoly over integer
typename LinBox::GivPolynomialRing<Field, Givaro::Dense>::Element pol;
LinBox::charpoly(pol, *B, meth);
@@ -65,10 +63,6 @@ public:
phi->resize(pol.size());
for (size_t i=0; i< pol.size(); ++i)
B->field().assign((*phi)[i], pol[i]);
-#else
- throw lb_runtime_error("LinBox ERROR: charpoly computation requires Givaro library, computation impossible)\n");
-#endif
-
}
};
diff --git a/interfaces/driver/lb-det.C b/interfaces/driver/lb-det.C
index 552c68d..a87c36a 100644
--- a/interfaces/driver/lb-det.C
+++ b/interfaces/driver/lb-det.C
@@ -25,7 +25,7 @@
#ifndef __LINBOX_lb_det_C
#define __LINBOX_lb_det_C
-#include "linbox-config.h"
+#include "linbox/linbox-config.h"
#include "linbox/solutions/det.h"
#include <lb-det.h>
diff --git a/interfaces/driver/lb-domain-data.h b/interfaces/driver/lb-domain-data.h
index 058cf34..b9267b9 100644
--- a/interfaces/driver/lb-domain-data.h
+++ b/interfaces/driver/lb-domain-data.h
@@ -26,7 +26,7 @@
#define __LINBOX_lb_domain_data_H
-#include "linbox-config.h"
+#include "linbox/linbox-config.h"
#include "linbox/integer.h"
#include "linbox/field/field-traits.h"
diff --git a/interfaces/driver/lb-domain-functor.h b/interfaces/driver/lb-domain-functor.h
index 2cca757..f7c1554 100644
--- a/interfaces/driver/lb-domain-functor.h
+++ b/interfaces/driver/lb-domain-functor.h
@@ -52,7 +52,7 @@ public:
* Macro for automatic code generation *
***************************************/
#define LB_DOMAIN_VISIT(D) \
-void visit(const DomainEnvelope<D> &d){apply(d);}
+void visit(const DomainEnvelope<D> &d){this->apply(d);}
/*******************************************************************************
diff --git a/interfaces/driver/lb-domain-type.h b/interfaces/driver/lb-domain-type.h
index 0386e45..f7cc73e 100644
--- a/interfaces/driver/lb-domain-type.h
+++ b/interfaces/driver/lb-domain-type.h
@@ -25,16 +25,13 @@
#ifndef __LINBOX_lb_domain_type_H
#define __LINBOX_lb_domain_type_H
-#include "linbox/field/modular.h"
-#include "linbox/field/PID-integer.h"
+#include "linbox/ring/modular.h"
+#include "givaro/zring.h"
#include "linbox/field/gmp-rational.h"
+#include "linbox/field/givaro.h"
#ifdef __LINBOX_HAVE_NTL
-#include "linbox/field/ntl.h"
-#endif
-
-#ifdef __LINBOX_HAVE_GIVARO
-#include "linbox/field/givaro.h"
+#include "linbox/ring/ntl.h"
#endif
/**************************************
@@ -44,12 +41,12 @@
#define __LINBOX_MINIMIZE_DOMAIN
#define __LINBOX_DOMAIN_ONLY
-typedef LinBoxTypelist < LinBox::Modular<double> , LinBoxDumbType> DL1;
-typedef LinBoxTypelist < LinBox::PID_integer , DL1> DL2;
+typedef LinBoxTypelist < Givaro::Modular<double> , LinBoxDumbType> DL1;
+typedef LinBoxTypelist < LinBox::Givaro::ZRing<Integer> , DL1> DL2;
typedef LinBoxTypelist < LinBox::GMPRationalField , DL2> DL3;
-typedef LinBoxTypelist < LinBox::Modular<int32_t> , DL3> DL4;
-typedef LinBoxTypelist < LinBox::Modular<int64_t> , DL4> DL5;
-typedef LinBoxTypelist < LinBox::Modular<LinBox::integer> , DL5> DL6;
+typedef LinBoxTypelist < Givaro::Modular<int32_t> , DL3> DL4;
+typedef LinBoxTypelist < LinBox::Givaro::Modular<int64_t> , DL4> DL5;
+typedef LinBoxTypelist < Givaro::Modular<LinBox::integer> , DL5> DL6;
#ifdef __LINBOX_MINIMIZE_DOMAIN
typedef DL3 linbox_domain_list;
@@ -71,17 +68,13 @@ typedef DN3 ntl_domain_list;
typedef LinBoxDumbType ntl_domain_list;
#endif
-#ifdef __LINBOX_HAVE_GIVARO
-typedef LinBoxTypelist < LinBox::GivaroGfq, LinBoxDumbType> DG1;
-typedef LinBoxTypelist < LinBox::GivaroZpz< Givaro::Std32>, DG1> DG2;
+typedef LinBoxTypelist < LinBox::Givaro::GFq, LinBoxDumbType> DG1;
+typedef LinBoxTypelist < Givaro::Modular< int32_t>, DG1> DG2;
#ifdef __LINBOX_MINIMIZE_DOMAIN
typedef DG1 givaro_domain_list;
#else
typedef DG2 givaro_domain_list;
#endif
-#else
-typedef LinBoxDumbType givaro_domain_list;
-#endif
// define DomainList to be the list of all domains
#ifdef __LINBOX_DOMAIN_ONLY
@@ -100,13 +93,13 @@ typedef LinBoxTL::Append< linbox_domain_list, LinBoxTL::Append< ntl_domain_list,
extern Domain_Factory linbox_domain;
void UpdateDomain(){
- linbox_domain.add("linbox_field_dbl" , constructDomain<LinBox::Modular<double> >);
+ linbox_domain.add("linbox_field_dbl" , constructDomain<Givaro::Modular<double> >);
linbox_domain.add("linbox_field_rational" , constructDomain<LinBox::GMPRationalField>);
- linbox_domain.add("linbox_ring_integer" , constructDomain<LinBox::PID_integer>);
+ linbox_domain.add("linbox_ring_integer" , constructDomain<LinBox::Givaro::ZRing<Integer> >);
#ifndef __LINBOX_MINIMIZE_DOMAIN
- linbox_domain.add("linbox_field_32" , constructDomain<LinBox::Modular<int32_t> >);
- linbox_domain.add("linbox_field_64" , constructDomain<LinBox::Modular<int64_t> >);
- linbox_domain.add("linbox_field_mp" , constructDomain<LinBox::Modular<LinBox::integer> >);
+ linbox_domain.add("linbox_field_32" , constructDomain<Givaro::Modular<int32_t> >);
+ linbox_domain.add("linbox_field_64" , constructDomain<LinBox::Givaro::Modular<int64_t> >);
+ linbox_domain.add("linbox_field_mp" , constructDomain<Givaro::Modular<LinBox::integer> >);
#endif
#ifdef __LINBOX_HAVE_NTL
linbox_domain.add("ntl_field_ZZ_p" , constructDomain<LinBox::NTL_ZZ_p>);
@@ -115,11 +108,10 @@ void UpdateDomain(){
linbox_domain.add("ntl_ring_integer" , constructDomain<LinBox::NTL_ZZ>);
#endif
#endif
-#ifdef __LINBOX_HAVE_GIVARO
- linbox_domain.add("givaro_field_gfq" , constructDomain<LinBox::GivaroGfq>);
+
+ linbox_domain.add("givaro_field_gfq" , constructDomain<LinBox::Givaro::GFq>);
#ifndef __LINBOX_MINIMIZE_DOMAIN
- linbox_domain.add("givaro_field_32" , constructDomain<LinBox::GivaroZpz< Givaro::Std32> >);
-#endif
+ linbox_domain.add("givaro_field_32" , constructDomain<Givaro::Modular< int32_t> >);
#endif
}
diff --git a/interfaces/driver/lb-solve.C b/interfaces/driver/lb-solve.C
new file mode 100644
index 0000000..c624353
--- /dev/null
+++ b/interfaces/driver/lb-solve.C
@@ -0,0 +1,234 @@
+/* lb-solve.C
+ * Copyright (C) 2005 Pascal Giorgi
+ *
+ * Written by Pascal Giorgi <pgiorgi at uwaterloo.ca>
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ * ========LICENCE========
+ */
+
+#ifndef __LINBOX_lb_solve_C
+#define __LINBOX_lb_solve_C
+
+#include "linbox/solutions/solve.h"
+
+#include <lb-solve.h>
+#include <lb-blackbox-function.h>
+#include <lb-vector-function.h>
+#include <lb-blackbox.h>
+#include <lb-vector.h>
+#include <lb-domain.h>
+#include <lb-garbage.h>
+
+
+extern BlackboxTable blackbox_hashtable;
+extern VectorTable vector_hashtable;
+extern const char* current_rational_field;
+
+/****************************************************************
+ * Functor interface to launch LinBox solving *
+ * deal with different API and avoid different type compilation *
+ ****************************************************************/
+
+// generic version to handle different type compilation
+template<class ResultElement, class BlackboxElement, class VectorElement, class DomainCategory>
+class LaunchSolveFunctor {
+public:
+ template<class Result, class Blackbox, class Vector, class Method>
+ inline void operator()(Result &s, Blackbox *B, Vector *v, const Method &m) const {
+ throw lb_runtime_error("LinBox ERROR: incompatible domain in solving");// throw an exception for incompatible data type
+ }
+};
+
+// specialization to launch LinBox solving using standard API
+template<class Element, class DomainCategory>
+class LaunchSolveFunctor<Element, Element, Element, DomainCategory>{
+public:
+ template<class Result, class Blackbox, class Vector, class Method>
+ inline void operator()(Result &s, Blackbox *B, Vector *v, const Method &m) const {
+ LinBox::solve(s, *B, *v, m);
+ }
+};
+
+
+// specialization to launch LinBox solving using integer solving API (output is a GMPRational)
+template<class Element>
+class LaunchSolveFunctor<Element, Element, Element, LinBox::RingCategories::IntegerTag >{
+public:
+ template<class Result, class Blackbox, class Vector, class Method>
+ inline void operator()(Result &s, Blackbox *B, Vector *v, const Method &m) const {
+ //LinBox::solve(s, *B, *v, m);
+ //not yet handled
+ throw lb_runtime_error("LinBox ERROR: integer system solving with same vector type is not yet handled");
+ }
+};
+
+
+// specialization to launch LinBox solving using integer solving API (output is a GMPRational)
+template<class Element>
+class LaunchSolveFunctor<LinBox::GMPRationalElement, Element, Element, LinBox::RingCategories::IntegerTag >{
+public:
+ template<class Result, class Blackbox, class Vector, class Method>
+ inline void operator()(Result &s, Blackbox *B, Vector *v, const Method &m) const {
+ LinBox::solve(s, *B, *v, m);
+ }
+};
+
+
+/**********************************************************************
+ * Partial Solving linear system Functor according to a blackbox type *
+ **********************************************************************/
+
+template<class Blackbox, class Method>
+class SolvePartialFunctor{
+protected:
+ Blackbox *_BB;
+ const Method &meth;
+public:
+
+ SolvePartialFunctor (Blackbox *B, const Method &m) : _BB(B), meth(m) {}
+
+ template<class Vector>
+ void operator()(const VectorKey& Vkey, Vector *res) const {
+ VectorTable::iterator it = vector_hashtable.find(Vkey);
+ if (it == vector_hashtable.end())
+ throw lb_runtime_error("LinBox ERROR: right hand side vector does not exist (solving impossible)\n");
+
+ SolvePartialFunctor<Blackbox, Method> fct(_BB, meth);
+ VectorFunction::call(*res, Vkey, fct);
+ }
+
+ template<class Vector, class Result>
+ void operator() (Result &res, Vector *v) const {
+ typedef typename Blackbox::Field::Element BElement;
+ typedef typename Vector::value_type VElement;
+ typedef typename Result::value_type RElement;
+ typedef typename LinBox::FieldTraits<typename Blackbox::Field>::categoryTag categoryTag;
+ LaunchSolveFunctor<RElement, BElement, VElement, categoryTag>()(res, _BB, v, meth);
+ }
+};
+
+
+
+/**********************************************************
+ * Modify the vector Result if it is integer computation *
+ * and vector result is not define over a rational domain *
+ **********************************************************/
+template<class Category>
+class MutateVector{
+public:
+ void operator()(VectorAbstract *v){}
+};
+
+template<>
+class MutateVector<LinBox::RingCategories::IntegerTag>{
+public:
+ void operator()(VectorAbstract *v){
+ const DomainKey *k= &createDomain(0, current_rational_field);
+ v->rebind(*k);
+ deleteDomain(*k);
+ }
+};
+
+
+class MutateVectorFunctor{
+public:
+ template<class Domain>
+ void operator()(VectorAbstract *&v, Domain *D) const {
+ MutateVector<typename LinBox::FieldTraits<Domain>::categoryTag>()(v);
+ }
+};
+
+
+void modifyResultVector(const VectorKey &key){
+ VectorTable::iterator it = vector_hashtable.find(key);
+ if (it == vector_hashtable.end())
+ throw lb_runtime_error("LinBox ERROR: result vector does not exist (solving impossible)\n");
+
+ const DomainKey *Dkey = &(it->second->getDomainKey());
+ MutateVectorFunctor Fct;
+ DomainFunction::call(it->second, *Dkey, Fct);
+}
+
+
+/*****************************************
+ * Generic Solving linear system Functor *
+ *****************************************/
+
+template<typename Method = LinBox::Method::Hybrid >
+class SolveFunctor{
+protected:
+ const VectorKey &_Vkey;
+ Method meth;
+public:
+ SolveFunctor(const VectorKey &Vkey, Method m =Method()) : _Vkey(Vkey), meth(m) {}
+
+ template<class Blackbox, class Result>
+ inline void operator()(Result &res, Blackbox *B) const {
+ SolvePartialFunctor<Blackbox, Method> fct(B, meth);
+ VectorFunction::call(res, _Vkey, fct);
+ }
+};
+
+
+/***********************************************************
+ * API for solving linear systems *
+ * vector solution is returned through a given vector key *
+ ***********************************************************/
+
+void lb_solve(const VectorKey &res, const BlackboxKey &Bkey, const VectorKey &Vkey) {
+ SolveFunctor<> fct(res);
+ modifyResultVector(res);
+ BlackboxFunction::call(Vkey, Bkey, fct);
+}
+
+/*****************************************************
+ * API for solving linear systems *
+ * vector solution is returned through a vector key *
+ *****************************************************/
+
+const VectorKey& lb_solve(const BlackboxKey &Bkey, const VectorKey &Vkey) {
+
+ BlackboxTable::iterator it = blackbox_hashtable.find(Bkey);
+ if (it == blackbox_hashtable.end())
+ throw lb_runtime_error("LinBox ERROR: blackbox does not exist (solving impossible)\n");
+ const DomainKey *Dkey = &it->second->getDomainKey();
+
+ std::pair<size_t,size_t> dim;
+ dim = getBlackboxDimension(Bkey);
+ size_t coldim = dim.second;
+
+ //const VectorKey *res = ©Vector(Vkey);
+ const VectorKey *res = &createVector(*Dkey, coldim);
+
+ lb_solve(*res, Bkey, Vkey);
+ return *res;
+}
+
+
+
+#endif
+
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+
diff --git a/interfaces/driver/lb-vector-data.h b/interfaces/driver/lb-vector-data.h
index 49f77ee..4779b0c 100644
--- a/interfaces/driver/lb-vector-data.h
+++ b/interfaces/driver/lb-vector-data.h
@@ -229,9 +229,7 @@ public:
template<class Domain>
void operator()(void *&res, Domain *D) const
{
- typename Domain::Element zero;
- D->init(zero, 0UL);
- res = new Vector<typename Domain::Element, Alloc<typename Domain::Element> >(_dim, zero);
+ res = new Vector<typename Domain::Element, Alloc<typename Domain::Element> >(_dim, D->zero);
}
};
diff --git a/interfaces/driver/lb-vector-functor.h b/interfaces/driver/lb-vector-functor.h
index 8fdf872..5b4a768 100644
--- a/interfaces/driver/lb-vector-functor.h
+++ b/interfaces/driver/lb-vector-functor.h
@@ -54,7 +54,7 @@ public:
* Macro for automatic code generation *
***************************************/
#define LB_VECTOR_VISIT(B) \
- void visit(const B &d){apply(d);}
+ void visit(const B &d){this->apply(d);}
/**********************************************************************************
diff --git a/interfaces/driver/lb-vector.C b/interfaces/driver/lb-vector.C
index c79a5cf..0be32dd 100644
--- a/interfaces/driver/lb-vector.C
+++ b/interfaces/driver/lb-vector.C
@@ -25,7 +25,7 @@
#ifndef __LINBOX_lb_vector_C
#define __LINBOX_lb_vector_C
-#include "linbox-config.h"
+#include "linbox/linbox-config.h"
#include <lb-vector.h>
#include <lb-vector-function.h>
diff --git a/interfaces/kaapi/Makefile.in b/interfaces/kaapi/Makefile.in
deleted file mode 100644
index 0b6d84b..0000000
--- a/interfaces/kaapi/Makefile.in
+++ /dev/null
@@ -1,574 +0,0 @@
-# Makefile.in generated by automake 1.11.5 from Makefile.am.
-# @configure_input@
-
-# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software
-# Foundation, Inc.
-# This Makefile.in is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
-# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
-# PARTICULAR PURPOSE.
-
- at SET_MAKE@
-
-# Copyright (c) 2010 the LinBox group
-# ========LICENCE========
-# This file is part of the library LinBox.
-#
-# LinBox is free software: you can redistribute it and/or modify
-# it under the terms of the GNU Lesser General Public
-# License as published by the Free Software Foundation; either
-# version 2.1 of the License, or (at your option) any later version.
-#
-# This library 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
-# Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public
-# License along with this library; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
-# ========LICENCE========
-
-VPATH = @srcdir@
-am__make_dryrun = \
- { \
- am__dry=no; \
- case $$MAKEFLAGS in \
- *\\[\ \ ]*) \
- echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \
- | grep '^AM OK$$' >/dev/null || am__dry=yes;; \
- *) \
- for am__flg in $$MAKEFLAGS; do \
- case $$am__flg in \
- *=*|--*) ;; \
- *n*) am__dry=yes; break;; \
- esac; \
- done;; \
- esac; \
- test $$am__dry = yes; \
- }
-pkgdatadir = $(datadir)/@PACKAGE@
-pkgincludedir = $(includedir)/@PACKAGE@
-pkglibdir = $(libdir)/@PACKAGE@
-pkglibexecdir = $(libexecdir)/@PACKAGE@
-am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
-install_sh_DATA = $(install_sh) -c -m 644
-install_sh_PROGRAM = $(install_sh) -c
-install_sh_SCRIPT = $(install_sh) -c
-INSTALL_HEADER = $(INSTALL_DATA)
-transform = $(program_transform_name)
-NORMAL_INSTALL = :
-PRE_INSTALL = :
-POST_INSTALL = :
-NORMAL_UNINSTALL = :
-PRE_UNINSTALL = :
-POST_UNINSTALL = :
-build_triplet = @build@
-host_triplet = @host@
-subdir = interfaces/kaapi
-DIST_COMMON = $(pkgincludesub_HEADERS) $(srcdir)/Makefile.am \
- $(srcdir)/Makefile.in
-ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-am__aclocal_m4_deps = $(top_srcdir)/macros/aclocal-include.m4 \
- $(top_srcdir)/macros/config-header.m4 \
- $(top_srcdir)/macros/debug.m4 \
- $(top_srcdir)/macros/expat-check.m4 \
- $(top_srcdir)/macros/fflas-ffpack-check.m4 \
- $(top_srcdir)/macros/fplll-check.m4 \
- $(top_srcdir)/macros/givaro-check.m4 \
- $(top_srcdir)/macros/gmp-check.m4 \
- $(top_srcdir)/macros/iml-check.m4 \
- $(top_srcdir)/macros/lapack-check.m4 \
- $(top_srcdir)/macros/libtool.m4 \
- $(top_srcdir)/macros/lidia-check.m4 \
- $(top_srcdir)/macros/linbox-benchmark.m4 \
- $(top_srcdir)/macros/linbox-doc.m4 \
- $(top_srcdir)/macros/linbox-misc.m4 \
- $(top_srcdir)/macros/linbox-opt.m4 \
- $(top_srcdir)/macros/ltoptions.m4 \
- $(top_srcdir)/macros/ltsugar.m4 \
- $(top_srcdir)/macros/ltversion.m4 \
- $(top_srcdir)/macros/lt~obsolete.m4 \
- $(top_srcdir)/macros/m4ri-check.m4 \
- $(top_srcdir)/macros/m4rie-check.m4 \
- $(top_srcdir)/macros/maple-check.m4 \
- $(top_srcdir)/macros/mpfr-check.m4 \
- $(top_srcdir)/macros/ntl-check.m4 \
- $(top_srcdir)/macros/saclib-check.m4 \
- $(top_srcdir)/macros/sage-check.m4 $(top_srcdir)/configure.ac
-am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
- $(ACLOCAL_M4)
-mkinstalldirs = $(install_sh) -d
-CONFIG_HEADER = $(top_builddir)/config.h
-CONFIG_CLEAN_FILES =
-CONFIG_CLEAN_VPATH_FILES =
-depcomp =
-am__depfiles_maybe =
-SOURCES =
-DIST_SOURCES =
-am__can_run_installinfo = \
- case $$AM_UPDATE_INFO_DIR in \
- n|no|NO) false;; \
- *) (install-info --version) >/dev/null 2>&1;; \
- esac
-am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
-am__vpath_adj = case $$p in \
- $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
- *) f=$$p;; \
- esac;
-am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
-am__install_max = 40
-am__nobase_strip_setup = \
- srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
-am__nobase_strip = \
- for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
-am__nobase_list = $(am__nobase_strip_setup); \
- for p in $$list; do echo "$$p $$p"; done | \
- sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
- $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
- if (++n[$$2] == $(am__install_max)) \
- { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
- END { for (dir in files) print dir, files[dir] }'
-am__base_list = \
- sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
- sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
-am__uninstall_files_from_dir = { \
- test -z "$$files" \
- || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \
- || { echo " ( cd '$$dir' && rm -f" $$files ")"; \
- $(am__cd) "$$dir" && rm -f $$files; }; \
- }
-am__installdirs = "$(DESTDIR)$(pkgincludesubdir)"
-HEADERS = $(pkgincludesub_HEADERS)
-ETAGS = etags
-CTAGS = ctags
-DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
-ACLOCAL = @ACLOCAL@
-AMTAR = @AMTAR@
-AR = @AR@
-AUTOCONF = @AUTOCONF@
-AUTOHEADER = @AUTOHEADER@
-AUTOMAKE = @AUTOMAKE@
-AWK = @AWK@
-BLAS_CFLAGS = @BLAS_CFLAGS@
-BLAS_LIBS = @BLAS_LIBS@
-CC = @CC@
-CCNAM = @CCNAM@
-CFLAGS = @CFLAGS@
-CPPFLAGS = @CPPFLAGS@
-CXX = @CXX@
-CXXCPP = @CXXCPP@
-CXXFLAGS = @CXXFLAGS@
-CYGPATH_W = @CYGPATH_W@
-DBG = @DBG@
-DEBUG_CFLAGS = @DEBUG_CFLAGS@
-DEFAULT_CFLAGS = @DEFAULT_CFLAGS@
-DEFS = @DEFS@
-DLLTOOL = @DLLTOOL@
-DSYMUTIL = @DSYMUTIL@
-DUMPBIN = @DUMPBIN@
-ECHO_C = @ECHO_C@
-ECHO_N = @ECHO_N@
-ECHO_T = @ECHO_T@
-EGREP = @EGREP@
-EXEEXT = @EXEEXT@
-EXPAT_CFLAGS = @EXPAT_CFLAGS@
-EXPAT_LIBS = @EXPAT_LIBS@
-FFLAS_FFPACK_CFLAGS = @FFLAS_FFPACK_CFLAGS@
-FFLAS_FFPACK_LIBS = @FFLAS_FFPACK_LIBS@
-FFLAS_FFPACK_LOC = @FFLAS_FFPACK_LOC@
-FGREP = @FGREP@
-FPLLL_CFLAGS = @FPLLL_CFLAGS@
-FPLLL_LIBS = @FPLLL_LIBS@
-GIVARO_CFLAGS = @GIVARO_CFLAGS@
-GIVARO_LIBS = @GIVARO_LIBS@
-GMP_CFLAGS = @GMP_CFLAGS@
-GMP_LIBS = @GMP_LIBS@
-GMP_VERSION = @GMP_VERSION@
-GREP = @GREP@
-IML_CFLAGS = @IML_CFLAGS@
-IML_LIBS = @IML_LIBS@
-INSTALL = @INSTALL@
-INSTALL_DATA = @INSTALL_DATA@
-INSTALL_PROGRAM = @INSTALL_PROGRAM@
-INSTALL_SCRIPT = @INSTALL_SCRIPT@
-INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
-LD = @LD@
-LDFLAGS = @LDFLAGS@
-LIBOBJS = @LIBOBJS@
-LIBS = @LIBS@
-LIBTOOL = @LIBTOOL@
-LIDIA_CFLAGS = @LIDIA_CFLAGS@
-LIDIA_LIBS = @LIDIA_LIBS@
-LINBOX_BENCH_PATH = @LINBOX_BENCH_PATH@
-LINBOX_DOC_PATH = @LINBOX_DOC_PATH@
-LIPO = @LIPO@
-LN_S = @LN_S@
-LTLIBOBJS = @LTLIBOBJS@
-M4RIE_CFLAGS = @M4RIE_CFLAGS@
-M4RIE_LIBS = @M4RIE_LIBS@
-M4RI_CFLAGS = @M4RI_CFLAGS@
-M4RI_LIBS = @M4RI_LIBS@
-MAINT = @MAINT@
-MAKEINFO = @MAKEINFO@
-MANIFEST_TOOL = @MANIFEST_TOOL@
-MAPLE_CFLAGS = @MAPLE_CFLAGS@
-MAPLE_HOME = @MAPLE_HOME@
-MAPLE_LIBS = @MAPLE_LIBS@
-MAPLE_VERSION = @MAPLE_VERSION@
-MKDIR_P = @MKDIR_P@
-MPFR_CFLAGS = @MPFR_CFLAGS@
-MPFR_LIBS = @MPFR_LIBS@
-NM = @NM@
-NMEDIT = @NMEDIT@
-NTL_CFLAGS = @NTL_CFLAGS@
-NTL_LIBS = @NTL_LIBS@
-OBJDUMP = @OBJDUMP@
-OBJEXT = @OBJEXT@
-OTOOL = @OTOOL@
-OTOOL64 = @OTOOL64@
-PACKAGE = @PACKAGE@
-PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
-PACKAGE_NAME = @PACKAGE_NAME@
-PACKAGE_STRING = @PACKAGE_STRING@
-PACKAGE_TARNAME = @PACKAGE_TARNAME@
-PACKAGE_URL = @PACKAGE_URL@
-PACKAGE_VERSION = @PACKAGE_VERSION@
-PATH_SEPARATOR = @PATH_SEPARATOR@
-PROF = @PROF@
-RANLIB = @RANLIB@
-RM = @RM@
-SACLIB_CFLAGS = @SACLIB_CFLAGS@
-SACLIB_LIBS = @SACLIB_LIBS@
-SED = @SED@
-SET_MAKE = @SET_MAKE@
-SHELL = @SHELL@
-STRIP = @STRIP@
-TESTS_CFLAGS = @TESTS_CFLAGS@
-VERSION = @VERSION@
-WARN = @WARN@
-abs_builddir = @abs_builddir@
-abs_srcdir = @abs_srcdir@
-abs_top_builddir = @abs_top_builddir@
-abs_top_srcdir = @abs_top_srcdir@
-ac_ct_AR = @ac_ct_AR@
-ac_ct_CC = @ac_ct_CC@
-ac_ct_CXX = @ac_ct_CXX@
-ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
-am__leading_dot = @am__leading_dot@
-am__tar = @am__tar@
-am__untar = @am__untar@
-bindir = @bindir@
-build = @build@
-build_alias = @build_alias@
-build_cpu = @build_cpu@
-build_os = @build_os@
-build_vendor = @build_vendor@
-builddir = @builddir@
-datadir = @datadir@
-datarootdir = @datarootdir@
-docdir = @docdir@
-dvidir = @dvidir@
-exec_prefix = @exec_prefix@
-host = @host@
-host_alias = @host_alias@
-host_cpu = @host_cpu@
-host_os = @host_os@
-host_vendor = @host_vendor@
-htmldir = @htmldir@
-includedir = @includedir@
-infodir = @infodir@
-install_sh = @install_sh@
-libdir = @libdir@
-libexecdir = @libexecdir@
-localedir = @localedir@
-localstatedir = @localstatedir@
-mandir = @mandir@
-mkdir_p = @mkdir_p@
-oldincludedir = @oldincludedir@
-pdfdir = @pdfdir@
-prefix = @prefix@
-program_transform_name = @program_transform_name@
-psdir = @psdir@
-sbindir = @sbindir@
-sharedstatedir = @sharedstatedir@
-srcdir = @srcdir@
-sysconfdir = @sysconfdir@
-target_alias = @target_alias@
-top_build_prefix = @top_build_prefix@
-top_builddir = @top_builddir@
-top_srcdir = @top_srcdir@
-pkgincludesubdir = $(pkgincludedir)/kaapi
-pkgincludesub_HEADERS = \
-communicate.h
-
-all: all-am
-
-.SUFFIXES:
-$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps)
- @for dep in $?; do \
- case '$(am__configure_deps)' in \
- *$$dep*) \
- ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
- && { if test -f $@; then exit 0; else break; fi; }; \
- exit 1;; \
- esac; \
- done; \
- echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu --ignore-deps interfaces/kaapi/Makefile'; \
- $(am__cd) $(top_srcdir) && \
- $(AUTOMAKE) --gnu --ignore-deps interfaces/kaapi/Makefile
-.PRECIOUS: Makefile
-Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
- @case '$?' in \
- *config.status*) \
- cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
- *) \
- echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
- cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
- esac;
-
-$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
- cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-
-$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
- cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
- cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-$(am__aclocal_m4_deps):
-
-mostlyclean-libtool:
- -rm -f *.lo
-
-clean-libtool:
- -rm -rf .libs _libs
-install-pkgincludesubHEADERS: $(pkgincludesub_HEADERS)
- @$(NORMAL_INSTALL)
- @list='$(pkgincludesub_HEADERS)'; test -n "$(pkgincludesubdir)" || list=; \
- if test -n "$$list"; then \
- echo " $(MKDIR_P) '$(DESTDIR)$(pkgincludesubdir)'"; \
- $(MKDIR_P) "$(DESTDIR)$(pkgincludesubdir)" || exit 1; \
- fi; \
- for p in $$list; do \
- if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
- echo "$$d$$p"; \
- done | $(am__base_list) | \
- while read files; do \
- echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(pkgincludesubdir)'"; \
- $(INSTALL_HEADER) $$files "$(DESTDIR)$(pkgincludesubdir)" || exit $$?; \
- done
-
-uninstall-pkgincludesubHEADERS:
- @$(NORMAL_UNINSTALL)
- @list='$(pkgincludesub_HEADERS)'; test -n "$(pkgincludesubdir)" || list=; \
- files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
- dir='$(DESTDIR)$(pkgincludesubdir)'; $(am__uninstall_files_from_dir)
-
-ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
- list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
- unique=`for i in $$list; do \
- if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
- done | \
- $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
- END { if (nonempty) { for (i in files) print i; }; }'`; \
- mkid -fID $$unique
-tags: TAGS
-
-TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
- $(TAGS_FILES) $(LISP)
- set x; \
- here=`pwd`; \
- list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
- unique=`for i in $$list; do \
- if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
- done | \
- $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
- END { if (nonempty) { for (i in files) print i; }; }'`; \
- shift; \
- if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
- test -n "$$unique" || unique=$$empty_fix; \
- if test $$# -gt 0; then \
- $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
- "$$@" $$unique; \
- else \
- $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
- $$unique; \
- fi; \
- fi
-ctags: CTAGS
-CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
- $(TAGS_FILES) $(LISP)
- list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
- unique=`for i in $$list; do \
- if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
- done | \
- $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
- END { if (nonempty) { for (i in files) print i; }; }'`; \
- test -z "$(CTAGS_ARGS)$$unique" \
- || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
- $$unique
-
-GTAGS:
- here=`$(am__cd) $(top_builddir) && pwd` \
- && $(am__cd) $(top_srcdir) \
- && gtags -i $(GTAGS_ARGS) "$$here"
-
-distclean-tags:
- -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
-
-distdir: $(DISTFILES)
- @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
- topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
- list='$(DISTFILES)'; \
- dist_files=`for file in $$list; do echo $$file; done | \
- sed -e "s|^$$srcdirstrip/||;t" \
- -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
- case $$dist_files in \
- */*) $(MKDIR_P) `echo "$$dist_files" | \
- sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
- sort -u` ;; \
- esac; \
- for file in $$dist_files; do \
- if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
- if test -d $$d/$$file; then \
- dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
- if test -d "$(distdir)/$$file"; then \
- find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
- fi; \
- if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
- cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
- find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
- fi; \
- cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
- else \
- test -f "$(distdir)/$$file" \
- || cp -p $$d/$$file "$(distdir)/$$file" \
- || exit 1; \
- fi; \
- done
-check-am: all-am
-check: check-am
-all-am: Makefile $(HEADERS)
-installdirs:
- for dir in "$(DESTDIR)$(pkgincludesubdir)"; do \
- test -z "$$dir" || $(MKDIR_P) "$$dir"; \
- done
-install: install-am
-install-exec: install-exec-am
-install-data: install-data-am
-uninstall: uninstall-am
-
-install-am: all-am
- @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
-
-installcheck: installcheck-am
-install-strip:
- if test -z '$(STRIP)'; then \
- $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
- install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
- install; \
- else \
- $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
- install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
- "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
- fi
-mostlyclean-generic:
-
-clean-generic:
-
-distclean-generic:
- -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
- -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
-
-maintainer-clean-generic:
- @echo "This command is intended for maintainers to use"
- @echo "it deletes files that may require special tools to rebuild."
-clean: clean-am
-
-clean-am: clean-generic clean-libtool mostlyclean-am
-
-distclean: distclean-am
- -rm -f Makefile
-distclean-am: clean-am distclean-generic distclean-tags
-
-dvi: dvi-am
-
-dvi-am:
-
-html: html-am
-
-html-am:
-
-info: info-am
-
-info-am:
-
-install-data-am: install-pkgincludesubHEADERS
-
-install-dvi: install-dvi-am
-
-install-dvi-am:
-
-install-exec-am:
-
-install-html: install-html-am
-
-install-html-am:
-
-install-info: install-info-am
-
-install-info-am:
-
-install-man:
-
-install-pdf: install-pdf-am
-
-install-pdf-am:
-
-install-ps: install-ps-am
-
-install-ps-am:
-
-installcheck-am:
-
-maintainer-clean: maintainer-clean-am
- -rm -f Makefile
-maintainer-clean-am: distclean-am maintainer-clean-generic
-
-mostlyclean: mostlyclean-am
-
-mostlyclean-am: mostlyclean-generic mostlyclean-libtool
-
-pdf: pdf-am
-
-pdf-am:
-
-ps: ps-am
-
-ps-am:
-
-uninstall-am: uninstall-pkgincludesubHEADERS
-
-.MAKE: install-am install-strip
-
-.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \
- clean-libtool ctags distclean distclean-generic \
- distclean-libtool distclean-tags distdir dvi dvi-am html \
- html-am info info-am install install-am install-data \
- install-data-am install-dvi install-dvi-am install-exec \
- install-exec-am install-html install-html-am install-info \
- install-info-am install-man install-pdf install-pdf-am \
- install-pkgincludesubHEADERS install-ps install-ps-am \
- install-strip installcheck installcheck-am installdirs \
- maintainer-clean maintainer-clean-generic mostlyclean \
- mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
- tags uninstall uninstall-am uninstall-pkgincludesubHEADERS
-
-
-# Tell versions [3.59,3.63) of GNU make to not export all variables.
-# Otherwise a system limit (for SysV at least) may be exceeded.
-.NOEXPORT:
diff --git a/interfaces/kaapi/communicate.h b/interfaces/kaapi/communicate.h
index 543e8a9..452df50 100644
--- a/interfaces/kaapi/communicate.h
+++ b/interfaces/kaapi/communicate.h
@@ -28,8 +28,8 @@
#include <athapascan-1>
#include "linbox/integer.h"
-#include "linbox/field/modular-double.h"
-#include "linbox/matrix/sparse.h"
+#include "linbox/ring/modular-double.h"
+#include "linbox/matrix/sparse-matrix.h"
/*
* gmp integers
@@ -65,7 +65,7 @@ namespace kaapi
* double specialization
*/
template <>
- struct Modular<double> : LinBox::Modular<double>
+ struct Givaro::Modular<double> : Givaro::Modular<double>
{
const double& get_modulus() const { return this->modulus; }
const unsigned long& get_lmodulus() const { return this->lmodulus; }
@@ -75,13 +75,13 @@ namespace kaapi
} //namespace
-a1::OStream& operator<<( a1::OStream& out, const LinBox::Modular<double>& m)
+a1::OStream& operator<<( a1::OStream& out, const Givaro::Modular<double>& m)
{
const kaapi::Modular<double>* m_tmp = static_cast<const kaapi::Modular<double>*>(&m);
return out << m_tmp->get_modulus() << m_tmp->get_lmodulus() ;
}
-a1::IStream& operator>>( a1::IStream& in, LinBox::Modular<double>& m)
+a1::IStream& operator>>( a1::IStream& in, Givaro::Modular<double>& m)
{
kaapi::Modular<double>* m_tmp = static_cast<kaapi::Modular<double>*>(&m);
return in >> m_tmp->get_modulus() >> m_tmp->get_lmodulus() ;
diff --git a/interfaces/maple-old/Makefile.am b/interfaces/maple-old/Makefile.am
new file mode 100644
index 0000000..871571d
--- /dev/null
+++ b/interfaces/maple-old/Makefile.am
@@ -0,0 +1,37 @@
+# Copyright (c) 2010 the LinBox group
+# ========LICENCE========
+# This file is part of the library LinBox.
+#
+# LinBox is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+#
+# This library 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
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+# ========LICENCE========
+
+
+
+INCLUDES=-I$(top_srcdir)
+
+AM_CPPFLAGS= $(NTL_CFLAGS) $(ATLAS_CFLAGS) $(MAPLE_CFLAGS)
+
+EXTRA_DIST = lbmaple.C lbmaple.mpl.head lbmaple.mpl.tail Makefile.in.1 Makefile.in.2 demonstration.mws
+
+lib_LTLIBRARIES=liblbmaple.la liblbmapleffpack.la
+
+liblbmaple_la_SOURCES=lbmaple.C
+liblbmaple_la_LDFLAGS=$(top_builddir)/linbox/liblinbox.la $(NTL_LIBS) $(MAPLE_LIBS)
+
+liblbmapleffpack_la_SOURCES=lbmaple-ffpack.C
+liblbmapleffpack_la_LDFLAGS=$(top_builddir)/linbox/liblinbox.la $(ATLAS_LIBS) $(NTL_LIBS) $(MAPLE_LIBS)
+
+install-data-local:
+ $(INSTALL_DATA) lbmaple.mpl $(libdir)/lbmaple.mpl
diff --git a/interfaces/maple-old/Makefile.in.1 b/interfaces/maple-old/Makefile.in.1
new file mode 100644
index 0000000..94c4518
--- /dev/null
+++ b/interfaces/maple-old/Makefile.in.1
@@ -0,0 +1,232 @@
+# Makefile.in generated automatically by automake 1.5 from Makefile.am.
+
+# Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001
+# Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+ at SET_MAKE@
+
+SHELL = @SHELL@
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+prefix = @prefix@
+exec_prefix = @exec_prefix@
+
+bindir = @bindir@
+sbindir = @sbindir@
+libexecdir = @libexecdir@
+datadir = @datadir@
+sysconfdir = @sysconfdir@
+sharedstatedir = @sharedstatedir@
+localstatedir = @localstatedir@
+libdir = @libdir@
+infodir = @infodir@
+mandir = @mandir@
+includedir = @includedir@
+oldincludedir = /usr/include
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+top_builddir = ../..
+
+ACLOCAL = @ACLOCAL@
+AUTOCONF = @AUTOCONF@
+AUTOMAKE = @AUTOMAKE@
+AUTOHEADER = @AUTOHEADER@
+
+INSTALL = @INSTALL@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = @program_transform_name@
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+host_alias = @host_alias@
+host_triplet = @host@
+AMTAR = @AMTAR@
+AS = @AS@
+AWK = @AWK@
+CC = @CC@
+CXX = @CXX@
+CXXFLAGS = @CXXFLAGS@
+DEPDIR = @DEPDIR@
+DLLTOOL = @DLLTOOL@
+DOCPLUSPLUS_SUBDIRS = @DOCPLUSPLUS_SUBDIRS@
+ECHO = @ECHO@
+EXEEXT = @EXEEXT@
+GIVARO_CFLAGS = @GIVARO_CFLAGS@
+GIVARO_LIBS = @GIVARO_LIBS@
+GMP_CFLAGS = @GMP_CFLAGS@
+GMP_LIBS = @GMP_LIBS@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+LIBTOOL = @LIBTOOL@
+LIDIA_CFLAGS = @LIDIA_CFLAGS@
+LIDIA_LIBS = @LIDIA_LIBS@
+LN_S = @LN_S@
+MAINT = @MAINT@
+MAPLE_BUILD_LOC = @MAPLE_BUILD_LOC@
+MAPLE_INCLUDES = @MAPLE_INCLUDES@
+MAPLE_LIBS = @MAPLE_LIBS@
+NTL_CFLAGS = @NTL_CFLAGS@
+NTL_LIBS = @NTL_LIBS@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+PACKAGE = @PACKAGE@
+RANLIB = @RANLIB@
+SACLIB_CFLAGS = @SACLIB_CFLAGS@
+SACLIB_LIBS = @SACLIB_LIBS@
+STRIP = @STRIP@
+VERSION = @VERSION@
+am__include = @am__include@
+am__quote = @am__quote@
+install_sh = @install_sh@
+
+INCLUDES = -I$(top_srcdir)
+
+AM_CPPFLAGS = $(GMP_CFLAGS) $(NTL_CFLAGS) @MAPLE_INCLUDES@
+LDADD = $(top_builddir)/linbox/liblinbox.la $(GMP_LIBS) $(NTL_LIBS)
+EXTRA_DIST = lbmaple.C lbmaple.mpl.head lbmaple.mpl.tail Makefile.in.1 Makefile.in.2 \
+ demonstration.mws
+
+subdir = interfaces/maple
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = $(top_builddir)/linbox-config.h
+CONFIG_CLEAN_FILES =
+DIST_SOURCES =
+DIST_COMMON = Makefile.am Makefile.in
+all: all-am
+
+.SUFFIXES:
+
+mostlyclean-libtool:
+ -rm -f *.lo
+
+clean-libtool:
+ -rm -rf .libs _libs
+
+distclean-libtool:
+ -rm -f libtool
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4)
+ cd $(top_srcdir) && \
+ $(AUTOMAKE) --gnu interfaces/maple/Makefile
+Makefile: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.in $(top_builddir)/config.status
+ cd $(top_builddir) && \
+ CONFIG_HEADERS= CONFIG_LINKS= \
+ CONFIG_FILES=$(subdir)/$@ $(SHELL) ./config.status
+uninstall-info-am:
+tags: TAGS
+TAGS:
+
+
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+
+top_distdir = ../..
+distdir = $(top_distdir)/$(PACKAGE)-$(VERSION)
+
+distdir: $(DISTFILES)
+ @for file in $(DISTFILES); do \
+ if test -f $$file; then d=.; else d=$(srcdir); fi; \
+ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
+ if test "$$dir" != "$$file" && test "$$dir" != "."; then \
+ $(mkinstalldirs) "$(distdir)/$$dir"; \
+ fi; \
+ if test -d $$d/$$file; then \
+ cp -pR $$d/$$file $(distdir) \
+ || exit 1; \
+ else \
+ test -f $(distdir)/$$file \
+ || cp -p $$d/$$file $(distdir)/$$file \
+ || exit 1; \
+ fi; \
+ done
+check-am: all-am
+check: check-am
+all-am: Makefile
+
+installdirs:
+
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+ @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ `test -z '$(STRIP)' || \
+ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+ -rm -f Makefile $(CONFIG_CLEAN_FILES) stamp-h stamp-h[0-9]*
+
+maintainer-clean-generic:
+ @echo "This command is intended for maintainers to use"
+ @echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-generic clean-libtool mostlyclean-am
+
+distclean: distclean-am
+
+distclean-am: clean-am distclean-generic distclean-libtool
+
+dvi: dvi-am
+
+dvi-am:
+
+info: info-am
+
+info-am:
+
+install-data-am:
+
+install-exec-am:
+
+install-info: install-info-am
+
+install-man:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-generic mostlyclean-libtool
+
+uninstall-am: uninstall-info-am
+
+.PHONY: all all-am check check-am clean clean-generic clean-libtool \
+ distclean distclean-generic distclean-libtool distdir dvi \
+ dvi-am info info-am install install-am install-data \
+ install-data-am install-exec install-exec-am install-info \
+ install-info-am install-man install-strip installcheck \
+ installcheck-am installdirs maintainer-clean \
+ maintainer-clean-generic mostlyclean mostlyclean-generic \
+ mostlyclean-libtool uninstall uninstall-am uninstall-info-am
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/interfaces/maple-old/Makefile.in.2 b/interfaces/maple-old/Makefile.in.2
new file mode 100644
index 0000000..29acf37
--- /dev/null
+++ b/interfaces/maple-old/Makefile.in.2
@@ -0,0 +1,372 @@
+# Makefile.in generated by automake 1.6.3 from Makefile.am.
+# @configure_input@
+
+# Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002
+# Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+ at SET_MAKE@
+SHELL = @SHELL@
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+prefix = @prefix@
+exec_prefix = @exec_prefix@
+
+bindir = @bindir@
+sbindir = @sbindir@
+libexecdir = @libexecdir@
+datadir = @datadir@
+sysconfdir = @sysconfdir@
+sharedstatedir = @sharedstatedir@
+localstatedir = @localstatedir@
+libdir = @libdir@
+infodir = @infodir@
+mandir = @mandir@
+includedir = @includedir@
+oldincludedir = /usr/include
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+top_builddir = ../..
+
+ACLOCAL = @ACLOCAL@
+AUTOCONF = @AUTOCONF@
+AUTOMAKE = @AUTOMAKE@
+AUTOHEADER = @AUTOHEADER@
+
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+INSTALL = @INSTALL@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_DATA = @INSTALL_DATA@
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = @program_transform_name@
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+host_alias = @host_alias@
+host_triplet = @host@
+
+EXEEXT = @EXEEXT@
+OBJEXT = @OBJEXT@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+AMTAR = @AMTAR@
+AS = @AS@
+AWK = @AWK@
+CC = @CC@
+CXX = @CXX@
+CXXFLAGS = @CXXFLAGS@
+DEPDIR = @DEPDIR@
+DLLTOOL = @DLLTOOL@
+DOCPLUSPLUS_SUBDIRS = @DOCPLUSPLUS_SUBDIRS@
+ECHO = @ECHO@
+GIVARO_CFLAGS = @GIVARO_CFLAGS@
+GIVARO_LIBS = @GIVARO_LIBS@
+GMP_CFLAGS = @GMP_CFLAGS@
+GMP_LIBS = @GMP_LIBS@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+LB_LOC = @LB_LOC@
+LIBTOOL = @LIBTOOL@
+LIDIA_CFLAGS = @LIDIA_CFLAGS@
+LIDIA_LIBS = @LIDIA_LIBS@
+LN_S = @LN_S@
+MAINT = @MAINT@
+MAPLE_INCLUDES = @MAPLE_INCLUDES@
+MAPLE_LIBS = @MAPLE_LIBS@
+NTL_CFLAGS = @NTL_CFLAGS@
+NTL_LIBS = @NTL_LIBS@
+OBJDUMP = @OBJDUMP@
+PACKAGE = @PACKAGE@
+RANLIB = @RANLIB@
+SACLIB_CFLAGS = @SACLIB_CFLAGS@
+SACLIB_LIBS = @SACLIB_LIBS@
+STRIP = @STRIP@
+TEX_SUBDIRS = @TEX_SUBDIRS@
+VERSION = @VERSION@
+am__include = @am__include@
+am__quote = @am__quote@
+install_sh = @install_sh@
+INCLUDES = -I$(top_srcdir)
+
+AM_CPPFLAGS = $(GMP_CFLAGS) $(NTL_CFLAGS) @MAPLE_INCLUDES@
+LDADD = $(top_builddir)/linbox/liblinbox.la $(GMP_LIBS) $(NTL_LIBS)
+EXTRA_DIST = lbmaple.C lbmaple.mpl.head lbmaple.mpl.tail Makefile.in.1 Makefile.in.2 \
+ demonstration.mws
+
+
+mapledir = $(libdir)
+maple_LTLIBRARIES = liblbmaple.la
+liblbmaple_la_SOURCES = lbmaple.C
+liblbmaple_la_INCLUDES = @LB_LOC@/linbox/blackbox/triplesbb.h
+liblbmaple_la_LDFLAGS = @MAPLE_LIBS@ -module
+subdir = interfaces/maple
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = $(top_builddir)/linbox-config.h
+CONFIG_CLEAN_FILES =
+LTLIBRARIES = $(maple_LTLIBRARIES)
+
+liblbmaple_la_LIBADD =
+am_liblbmaple_la_OBJECTS = lbmaple.lo
+liblbmaple_la_OBJECTS = $(am_liblbmaple_la_OBJECTS)
+
+DEFS = @DEFS@
+DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir)
+CPPFLAGS = @CPPFLAGS@
+LDFLAGS = @LDFLAGS@
+LIBS = @LIBS@
+depcomp = $(SHELL) $(top_srcdir)/depcomp
+am__depfiles_maybe = depfiles
+ at AMDEP_TRUE@DEP_FILES = ./$(DEPDIR)/lbmaple.Plo
+CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
+ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
+LTCXXCOMPILE = $(LIBTOOL) --mode=compile $(CXX) $(DEFS) \
+ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+ $(AM_CXXFLAGS) $(CXXFLAGS)
+CXXLD = $(CXX)
+CXXLINK = $(LIBTOOL) --mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) \
+ $(AM_LDFLAGS) $(LDFLAGS) -o $@
+DIST_SOURCES = $(liblbmaple_la_SOURCES)
+DIST_COMMON = Makefile.am Makefile.in
+SOURCES = $(liblbmaple_la_SOURCES)
+
+all: all-am
+
+.SUFFIXES:
+.SUFFIXES: .C .lo .o .obj
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4)
+ cd $(top_srcdir) && \
+ $(AUTOMAKE) --gnu interfaces/maple/Makefile
+Makefile: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.in $(top_builddir)/config.status
+ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)
+mapleLTLIBRARIES_INSTALL = $(INSTALL)
+install-mapleLTLIBRARIES: $(maple_LTLIBRARIES)
+ @$(NORMAL_INSTALL)
+ $(mkinstalldirs) $(DESTDIR)$(mapledir)
+ @list='$(maple_LTLIBRARIES)'; for p in $$list; do \
+ if test -f $$p; then \
+ f="`echo $$p | sed -e 's|^.*/||'`"; \
+ echo " $(LIBTOOL) --mode=install $(mapleLTLIBRARIES_INSTALL) $(INSTALL_STRIP_FLAG) $$p $(DESTDIR)$(mapledir)/$$f"; \
+ $(LIBTOOL) --mode=install $(mapleLTLIBRARIES_INSTALL) $(INSTALL_STRIP_FLAG) $$p $(DESTDIR)$(mapledir)/$$f; \
+ else :; fi; \
+ done
+
+uninstall-mapleLTLIBRARIES:
+ @$(NORMAL_UNINSTALL)
+ @list='$(maple_LTLIBRARIES)'; for p in $$list; do \
+ p="`echo $$p | sed -e 's|^.*/||'`"; \
+ echo " $(LIBTOOL) --mode=uninstall rm -f $(DESTDIR)$(mapledir)/$$p"; \
+ $(LIBTOOL) --mode=uninstall rm -f $(DESTDIR)$(mapledir)/$$p; \
+ done
+
+clean-mapleLTLIBRARIES:
+ -test -z "$(maple_LTLIBRARIES)" || rm -f $(maple_LTLIBRARIES)
+ @list='$(maple_LTLIBRARIES)'; for p in $$list; do \
+ dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \
+ test -z "$dir" && dir=.; \
+ echo "rm -f \"$${dir}/so_locations\""; \
+ rm -f "$${dir}/so_locations"; \
+ done
+liblbmaple.la: $(liblbmaple_la_OBJECTS) $(liblbmaple_la_DEPENDENCIES)
+ $(CXXLINK) -rpath $(mapledir) $(liblbmaple_la_LDFLAGS) $(liblbmaple_la_OBJECTS) $(liblbmaple_la_LIBADD) $(LIBS)
+
+mostlyclean-compile:
+ -rm -f *.$(OBJEXT) core *.core
+
+distclean-compile:
+ -rm -f *.tab.c
+
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/lbmaple.Plo at am__quote@
+
+distclean-depend:
+ -rm -rf ./$(DEPDIR)
+
+.C.o:
+ at AMDEP_TRUE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@ depfile='$(DEPDIR)/$*.Po' tmpdepfile='$(DEPDIR)/$*.TPo' @AMDEPBACKSLASH@
+ at AMDEP_TRUE@ $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ $(CXXCOMPILE) -c -o $@ `test -f '$<' || echo '$(srcdir)/'`$<
+
+.C.obj:
+ at AMDEP_TRUE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@ depfile='$(DEPDIR)/$*.Po' tmpdepfile='$(DEPDIR)/$*.TPo' @AMDEPBACKSLASH@
+ at AMDEP_TRUE@ $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ $(CXXCOMPILE) -c -o $@ `cygpath -w $<`
+
+.C.lo:
+ at AMDEP_TRUE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@ depfile='$(DEPDIR)/$*.Plo' tmpdepfile='$(DEPDIR)/$*.TPlo' @AMDEPBACKSLASH@
+ at AMDEP_TRUE@ $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ $(LTCXXCOMPILE) -c -o $@ `test -f '$<' || echo '$(srcdir)/'`$<
+CXXDEPMODE = @CXXDEPMODE@
+
+mostlyclean-libtool:
+ -rm -f *.lo
+
+clean-libtool:
+ -rm -rf .libs _libs
+
+distclean-libtool:
+ -rm -f libtool
+uninstall-info-am:
+
+ETAGS = etags
+ETAGSFLAGS =
+
+tags: TAGS
+
+ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ mkid -fID $$unique
+
+TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
+ $(TAGS_FILES) $(LISP)
+ tags=; \
+ here=`pwd`; \
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ test -z "$(ETAGS_ARGS)$$tags$$unique" \
+ || $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ $$tags $$unique
+
+GTAGS:
+ here=`$(am__cd) $(top_builddir) && pwd` \
+ && cd $(top_srcdir) \
+ && gtags -i $(GTAGS_ARGS) $$here
+
+distclean-tags:
+ -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+
+top_distdir = ../..
+distdir = $(top_distdir)/$(PACKAGE)-$(VERSION)
+
+distdir: $(DISTFILES)
+ @list='$(DISTFILES)'; for file in $$list; do \
+ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
+ if test "$$dir" != "$$file" && test "$$dir" != "."; then \
+ dir="/$$dir"; \
+ $(mkinstalldirs) "$(distdir)$$dir"; \
+ else \
+ dir=''; \
+ fi; \
+ if test -d $$d/$$file; then \
+ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+ fi; \
+ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+ else \
+ test -f $(distdir)/$$file \
+ || cp -p $$d/$$file $(distdir)/$$file \
+ || exit 1; \
+ fi; \
+ done
+check-am: all-am
+check: check-am
+all-am: Makefile $(LTLIBRARIES)
+
+installdirs:
+ $(mkinstalldirs) $(DESTDIR)$(mapledir)
+
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+ @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ INSTALL_STRIP_FLAG=-s \
+ `test -z '$(STRIP)' || \
+ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+ -rm -f Makefile $(CONFIG_CLEAN_FILES)
+
+maintainer-clean-generic:
+ @echo "This command is intended for maintainers to use"
+ @echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-generic clean-libtool clean-mapleLTLIBRARIES \
+ mostlyclean-am
+
+distclean: distclean-am
+
+distclean-am: clean-am distclean-compile distclean-depend \
+ distclean-generic distclean-libtool distclean-tags
+
+dvi: dvi-am
+
+dvi-am:
+
+info: info-am
+
+info-am:
+
+install-data-am: install-mapleLTLIBRARIES
+
+install-exec-am:
+
+install-info: install-info-am
+
+install-man:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic \
+ mostlyclean-libtool
+
+uninstall-am: uninstall-info-am uninstall-mapleLTLIBRARIES
+
+.PHONY: GTAGS all all-am check check-am clean clean-generic \
+ clean-libtool clean-mapleLTLIBRARIES distclean \
+ distclean-compile distclean-depend distclean-generic \
+ distclean-libtool distclean-tags distdir dvi dvi-am info \
+ info-am install install-am install-data install-data-am \
+ install-exec install-exec-am install-info install-info-am \
+ install-man install-mapleLTLIBRARIES install-strip installcheck \
+ installcheck-am installdirs maintainer-clean \
+ maintainer-clean-generic mostlyclean mostlyclean-compile \
+ mostlyclean-generic mostlyclean-libtool tags uninstall \
+ uninstall-am uninstall-info-am uninstall-mapleLTLIBRARIES
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/interfaces/maple-old/README b/interfaces/maple-old/README
new file mode 100644
index 0000000..a1b591a
--- /dev/null
+++ b/interfaces/maple-old/README
@@ -0,0 +1,75 @@
+LinBox/Maple Interface - version 1.0
+2-3-2003
+
+1. What is it:
+ This is an interface between the LinBox library of functions and
+utilities for the Maple computer algebra system. It allows you to call
+LinBox functions from a Maple session. It is currently under
+development by Rich Seagraves at the University of Delaware. Any ideas or
+suggestions are more than welcome. The package is made up of a small library
+that wraps LinBox functions, and a Maple module called LinBox that contains all
+procedures and external calling definitions.
+
+
+2. Requirements:
+ The interface requires the following packges:
+ I. Maple v6.0 or greater
+ II. LinBox
+ III. GMP v3.2 or greater (for LinBox)
+ IV. unix make utility
+ V. A UNIX other than Solaris (see "But I have Solaris you
+ insensitive CLOD!!!!" below).
+
+ It is recommended you have the following
+ I. Maple v7.0 or later
+ II. g++ 3.0 or later (compiler on which this library was tested).
+ III. GNU make utility (gmake).
+
+
+3. Availability:
+ The interface is currently distributed as part of the LinBox package,
+available through CVS. Please goto http://www.linalg.org/developer.html
+for information about getting the latest version of LinBox. (Note - at
+present, the Maple interface is not available through the latest LinBox
+beta release, v0.3b. It should be available when the next beta release of
+LinBox comes out. Stay on the look-out and keep your fingers crossed!)
+The interface is available in the interfaces/maple directory of the
+LinBox distribution.
+
+4. But I have Solaris you insensitive CLOD!!!!
+ At the moment, the package has been tested under Linux and
+theoretically will work on other Unix variant systems.
+Both LinBox and this interface has had some trouble building on Solaris,
+and at present Solaris doesnot support a build feature that this interface
+needs. If someone has had extensive experience with Solaris and would like
+to help out with this, I'd be more than happy toi recieve that help.
+
+5. Installation:
+ The interface consists of a shared object file and a plain text
+script defining a module called LinBox. To create the Maple interface to
+LinBox, re-run LinBox's configure script with the following additional
+arguements:
+
+ --with-maple-prefix=MPFX --enable-shared
+
+where MPFX is the directory of a working maple installation. Then rebuild
+LinBox with
+ make; make install
+and the interface will be built in LinBox's lib/ directory.
+
+6. Usage:
+ The build system will compile a shared object generate is called
+lbmaple.mpl. In Maple, type
+
+'read("/directory/you/install/to/lib/lbmaple.mpl");'
+
+(where /directory/you/install/to is LinBox's installation path) to get the
+module. Also, in the interfaces/maple directory in LinBox is a file called
+demonstration.mws which contains a demonstrational maple worksheet.
+
+7. Wow, this interface is horrible. What's wrong with you? :-)
+ If you really think it's that bad, why not email me and show me how
+it's done right? I always love help.
+
+8. Contact
+ You can contact the author, Rich Seagraves, at <seagrave at cis.udel.edu>
diff --git a/interfaces/maple-old/demonstration.mws b/interfaces/maple-old/demonstration.mws
new file mode 100644
index 0000000..9731e2f
--- /dev/null
+++ b/interfaces/maple-old/demonstration.mws
@@ -0,0 +1,291 @@
+{VERSION 5 0 "IBM INTEL LINUX" "5.0" }
+{USTYLETAB {CSTYLE "Maple Input" -1 0 "Courier" 0 1 255 0 0 1 0 1 0 0
+1 0 0 0 0 1 }{CSTYLE "2D Math" -1 2 "Times" 0 1 0 0 0 0 0 0 2 0 0 0 0
+0 0 1 }{CSTYLE "2D Output" 2 20 "" 0 1 0 0 255 1 0 0 0 0 0 0 0 0 0 1 }
+{CSTYLE "" -1 256 "itc avant garde" 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 }
+{CSTYLE "" -1 257 "lucida bright" 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 }
+{CSTYLE "" -1 258 "interface user" 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 }
+{CSTYLE "" -1 259 "screen" 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 }{CSTYLE "
+" -1 260 "terminal" 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 }{CSTYLE "" -1
+261 "" 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 }{CSTYLE "" -1 262 "" 0 1 0 0
+0 0 1 0 0 0 0 0 0 0 0 0 }{CSTYLE "" -1 263 "" 0 1 0 0 0 0 0 1 0 0 0 0
+0 0 0 0 }{CSTYLE "" -1 264 "" 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 }
+{CSTYLE "" -1 265 "" 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 }{CSTYLE "" -1
+266 "" 0 1 0 0 0 0 1 1 0 0 0 0 0 0 0 0 }{CSTYLE "" -1 267 "" 0 1 0 0
+0 0 0 1 0 0 0 0 0 0 0 0 }{CSTYLE "" -1 268 "" 1 14 0 0 0 0 0 1 0 0 0
+0 0 0 0 0 }{CSTYLE "" -1 269 "" 1 14 0 0 0 0 0 0 0 0 0 0 0 0 0 0 }
+{CSTYLE "" -1 270 "" 1 14 0 0 0 0 0 0 0 0 0 0 0 0 0 0 }{CSTYLE "" -1
+271 "" 0 24 0 0 0 0 0 1 0 0 0 0 0 0 0 0 }{CSTYLE "" -1 272 "" 1 18 0
+0 0 0 0 0 0 0 0 0 0 0 0 0 }{CSTYLE "" -1 273 "" 1 18 0 0 0 0 0 2 0 0
+0 0 0 0 0 0 }{CSTYLE "" -1 274 "" 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 }
+{CSTYLE "" -1 275 "" 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 }{CSTYLE "" -1
+276 "" 1 18 0 0 0 0 0 1 0 0 0 0 0 0 0 0 }{CSTYLE "" -1 277 "" 0 1 0 0
+0 0 0 1 0 0 0 0 0 0 0 0 }{CSTYLE "" -1 278 "" 1 18 0 0 0 0 0 0 0 0 0
+0 0 0 0 0 }{CSTYLE "" -1 279 "" 1 18 0 0 0 0 0 1 0 0 0 0 0 0 0 0 }
+{CSTYLE "" -1 280 "" 1 18 0 0 0 0 0 0 0 0 0 0 0 0 0 0 }{PSTYLE "Normal
+" -1 0 1 {CSTYLE "" -1 -1 "" 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 }0 0 0
+-1 -1 -1 0 0 0 0 0 0 -1 0 }{PSTYLE "Maple Output" 0 11 1 {CSTYLE ""
+-1 -1 "" 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 }3 3 0 -1 -1 -1 0 0 0 0 0 0
+-1 0 }{PSTYLE "" 11 12 1 {CSTYLE "" -1 -1 "" 0 1 0 0 0 0 0 0 0 0 0 0
+0 0 0 0 }1 0 0 -1 -1 -1 0 0 0 0 0 0 -1 0 }{PSTYLE "Title" 0 18 1
+{CSTYLE "" -1 -1 "" 1 18 0 0 0 0 0 1 1 0 0 0 0 0 0 0 }3 0 0 -1 12 12
+0 0 0 0 0 0 19 0 }{PSTYLE "Author" 0 19 1 {CSTYLE "" -1 -1 "" 0 1 0 0
+0 0 0 0 0 0 0 0 0 0 0 0 }3 0 0 -1 8 8 0 0 0 0 0 0 -1 0 }{PSTYLE "" 0
+256 1 {CSTYLE "" -1 -1 "" 1 18 0 0 0 0 0 0 0 0 0 0 0 0 0 0 }0 0 0 -1
+-1 -1 0 0 0 0 0 0 -1 0 }{PSTYLE "" 0 257 1 {CSTYLE "" -1 -1 "" 0 1 0
+0 0 0 0 1 0 0 0 0 0 0 0 0 }0 0 0 -1 -1 -1 0 0 0 0 0 0 -1 0 }}
+{SECT 0 {EXCHG {PARA 18 "" 0 "" {TEXT -1 0 "" }{TEXT 256 28 "Maple Lin
+Box Interface, v0.5" }}{PARA 0 "" 0 "" {TEXT -1 0 "" }}{PARA 19 "" 0 "
+" {TEXT -1 17 "by Rich Seagraves" }}}{EXCHG {PARA 0 "" 0 "" {TEXT -1
+271 "This interface is the fruits of a summer research project. It is
+ meant to demonstrate a practical application of the LinBox suite of u
+tilities and functions. It is currently distributed as an extra compo
+nent of the LinBox development package. Please see http://www.lin" }
+{TEXT 264 0 "" }{TEXT -1 65 "alg.org to find out how to get a copy of \+
+this package using CVS " }}}{EXCHG {PARA 0 "" 0 "" {TEXT -1 259 "LinB
+ox is a set of libraries meant to provide fast symbolic solutions to p
+roblems in Linear Algebra. Currently it provides solutions to 3 class
+es of problems: Rank calculations, Determinant calculations, and the \+
+computation of a Matrix's Minimal Polynomial." }{TEXT 257 0 "" }{TEXT
+258 0 "" }{TEXT 259 0 "" }{TEXT 260 0 "" }}}{EXCHG {PARA 0 "" 0 ""
+{TEXT -1 0 "" }{TEXT 261 31 "Installing the LinBox interface" }}{PARA
+0 "" 0 "" {TEXT -1 335 "The interface is composed of a comiled library
+ of code that wraps linbox code, and a maple script that provides Mapl
+e access to this code. To compile the library and create the script, \+
+the linbox package must be compiled with the maple option activated. \+
+For information on this, see the README file in the interfaces/maple \+
+directory" }}}{EXCHG {PARA 0 "" 0 "" {TEXT -1 0 "" }{TEXT 262 0 "" }
+{TEXT -1 0 "" }{TEXT 263 24 "Activating the interface" }}{PARA 0 "" 0
+"" {TEXT -1 353 "Once installation is complete, the shared object \"li
+blbmaple.so\" and the maple script \"lbmaple.mpl\" will be in the $pre
+fix/lib directory, where $prefix is the prefix you specified when you \+
+installed LinBox . If you want to move the interface to a different d
+irectory, the lbmaple.mpl file will need to be edited. Instructions f
+or this are in the file." }}{PARA 0 "" 0 "" {TEXT -1 0 "" }}{PARA 0 "
+" 0 "" {TEXT -1 145 "To activate the interface, read in the script usi
+ng the following command (change $dir to the directory the interface i
+s currently installed in):" }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0
+25 "read(\"$dir/lbmaple.mpl\");" }}{PARA 11 "" 1 "" {XPPMATH 20 "6#7)%
+(LBapplyG%1LBapplyTransposeG%&LBdetG%*LBminpolyG%'LBrankG%)LinBoxBBG%(
+LinBoxVG" }}}{EXCHG {PARA 0 "" 0 "" {TEXT -1 40 "The module LinBox sho
+uld be activated. " }}}{EXCHG {PARA 0 "" 0 "" {TEXT -1 0 "" }{TEXT
+265 0 "" }{TEXT 266 0 "" }{TEXT 267 19 "Using the interface" }{TEXT
+-1 0 "" }}{PARA 0 "" 0 "" {TEXT -1 48 "The LinBox interface defines tw
+o new data types:" }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 11 "LinBox
+BB();" }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 10 "LinBoxV();" }}}
+{EXCHG {PARA 0 "" 0 "" {TEXT -1 228 "LinBoxBB is a Matrix BlackBox typ
+e, while LinBoxV is a vector type. They can be initialized with: \n \+
+ 1) A ready made Matrix or Vector\n \+
+ 2) Dimensions and an initalization procedure" }}{PARA 0 "
+" 0 "" {TEXT -1 54 " 3) A list (LinBoxV type o
+nly)" }}{PARA 0 "" 0 "" {TEXT -1 0 "" }}{PARA 0 "" 0 "" {TEXT -1 238 "
+For these data types, matrix or vector data is stored in the external
+ code so that multiple data conversions between Maple data types and e
+xternal code types are un-necessary. Each object stores a handle to a
+ particular external type. " }}{PARA 0 "" 0 "" {TEXT -1 0 "" }}{PARA
+0 "" 0 "" {TEXT -1 45 "The interface also defines several functions:"
+}}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 9 "LBrank();" }}}{EXCHG
+{PARA 0 "> " 0 "" {MPLTEXT 1 0 8 "LBdet();" }}}{EXCHG {PARA 0 "> " 0 "
+" {MPLTEXT 1 0 12 "LBminpoly();" }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT
+1 0 10 "LBapply();" }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 19 "LBapp
+lyTranspose();" }}}{EXCHG {PARA 0 "" 0 "" {TEXT -1 175 "By default, th
+ese functions expect to take the LinBox BlackBox and Vector types as i
+nput. They can take native Maple types, but convert these two the Lin
+Box types on the fly." }}}{EXCHG {PARA 0 "" 0 "" {TEXT 269 0 "" }
+{TEXT 268 27 "Creating a BlackBox object\n" }{TEXT -1 214 "The easiest
+ way to declare a BlackBox matrix is to give the matrix a procedure an
+d dimensions. Here is a simple procedure that puts 1's on every \"eve
+n\" diagonal ( abs( i-j) = 0 mod 2), and i+1 on the main diagonal" }}}
+{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 14 "f := proc(i,j)" }}{PARA 0 ">
+ " 0 "" {MPLTEXT 1 0 30 " if abs(i-j) mod 2 = 0 then 1" }}{PARA 0 "> \+
+" 0 "" {MPLTEXT 1 0 8 " else 0" }}{PARA 0 "> " 0 "" {MPLTEXT 1 0 5 " \+
+ fi;" }}{PARA 0 "> " 0 "" {MPLTEXT 1 0 9 "end proc;" }}{PARA 11 "" 1 "
+" {XPPMATH 20 "6#>%\"fGf*6$%\"iG%\"jG6\"F)F)@%/-%$modG6$-%$absG6#,&9$
+\"\"\"9%!\"\"\"\"#\"\"!F4F8F)F)F)" }}}{EXCHG {PARA 0 "" 0 "" {TEXT -1
+171 "Say we want to create a 500x500 BlackBox matrix with this form. \+
+For this test, let's say we use the 30th prime. To create the Blackbo
+x, we would make the following call:" }}}{EXCHG {PARA 0 "> " 0 ""
+{MPLTEXT 1 0 43 "Diag1s := LinBoxBB(ithprime(30),500,500,f);" }}{PARA
+12 "" 1 "" {XPPMATH 20 "6#>%'Diag1sG`6$%*getMatrixG%$keyGb6#%+thismodu
+leG6#%)destructG6#/%'unloadGF-6$%*getMatrixG%$keyG6\"6#QDMaple~Contain
+er~for~LinBox~blackboxF4F46*%\"kG%\"kG%(ExToMapG%(ExToMapG%-lbXgetMatr
+ixG%-lbXgetMatrixG%.lbXkillMatrixG%.lbXkillMatrixG%,_m145668688G6#%)de
+structG" }}}{EXCHG {PARA 0 "" 0 "" {TEXT -1 148 "Diag1s becomes a LinB
+oxBB. If you wanted to get a copy of the Matrix stored within the ext
+ernal code, you can call the LinBoxBB method getMatrix()." }}}{EXCHG
+{PARA 0 "> " 0 "" {MPLTEXT 1 0 25 "M := Diag1s:-getMatrix();" }}{PARA
+11 "" 1 "" {XPPMATH 20 "6#>%\"MG-%'RTABLEG6*\"*g%R\\8%)anythingG%'Matr
+ixG%.Fortran_orderG7\"\"\"#;\"\"\"\"$+&F." }}}{EXCHG {PARA 0 "" 0 ""
+{TEXT -1 118 "Notice that you can also create a LinBoxBB object from a
+ pre-created Matrix. In this case, let's use the 60th, prime:" }}}
+{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 36 "Diag2s := LinBoxBB(ithprime(
+60), M);" }}{PARA 12 "" 1 "" {XPPMATH 20 "6#>%'Diag2sG`6$%*getMatrixG%
+$keyGb6#%+thismoduleG6#%)destructG6#/%'unloadGF-6$%*getMatrixG%$keyG6
+\"6#QDMaple~Container~for~LinBox~blackboxF4F46*%\"kG%\"kG%(ExToMapG%(E
+xToMapG%-lbXgetMatrixG%-lbXgetMatrixG%.lbXkillMatrixG%.lbXkillMatrixG6
+\"6#%)destructG" }}}{EXCHG {PARA 0 "" 0 "" {TEXT -1 2 "or" }}}{EXCHG
+{PARA 0 "> " 0 "" {MPLTEXT 1 0 69 "Diag3s := LinBoxBB(ithprime(60), Ma
+trix(500,500, f, storage=sparse));" }}{PARA 12 "" 1 "" {XPPMATH 20 "6#
+>%'Diag3sG`6$%*getMatrixG%$keyGb6#%+thismoduleG6#%)destructG6#/%'unloa
+dGF-6$%*getMatrixG%$keyG6\"6#QDMaple~Container~for~LinBox~blackboxF4F4
+6*%\"kG%\"kG%(ExToMapG%(ExToMapG%-lbXgetMatrixG%-lbXgetMatrixG%.lbXkil
+lMatrixG%.lbXkillMatrixG6\"6#%)destructG" }}}{EXCHG {PARA 0 "" 0 ""
+{TEXT -1 348 "Notice that the Matrix used to initalize Diag3s had the \+
+option \"storage=sparse\" set. This is a requirement of all Maple Mat
+rix's used to create LinBox Blackbox types (and in general a good idea
+, as LinBox works best with Sparse Matrices. Note that any Maple Matr
+ix returned by the getMatrix() method is declared to have sparse stora
+ge by default." }}}{EXCHG {PARA 256 "" 0 "" {TEXT -1 0 "" }{TEXT 270
+0 "" }{TEXT 271 56 "LinBox Algorithm functions - LBrank, LBdet and LBm
+inpoly" }}{PARA 0 "" 0 "" {TEXT -1 410 "Now that we've demonstrated th
+e basic blackbox type, we can call LinBox functions on them. At the p
+resent, the LinBox project supports fast, probabilistic computation of
+ three aspects of a Matrix: it's Rank, it's Determinant, and it's Min
+imal Polynomial.\n\nLet's say I wanted to calculate the rank of the di
+agonal Matrix I created in the previous section. To do so, I would us
+e the LBrank command as follows:" }}}{EXCHG {PARA 0 "> " 0 ""
+{MPLTEXT 1 0 23 "LinBox[LBrank](Diag1s);" }}{PARA 11 "" 1 "" {XPPMATH
+20 "6#\"\"#" }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 0 "" }}}{EXCHG
+{PARA 0 "" 0 "" {TEXT -1 73 "Let's compare that to the rank computed b
+y Maple's LinearAlgebra package:" }}}{EXCHG {PARA 0 "> " 0 ""
+{MPLTEXT 1 0 76 "LinearAlgebra[Rank](Matrix(500,500,f, storage=sparse,
+ datatype=integer[4]));" }}{PARA 11 "" 1 "" {XPPMATH 20 "6#\"\"#" }}}
+{EXCHG {PARA 0 "" 0 "" {TEXT -1 199 "The same result. Notice that bot
+h functions gave the same result, as the rank of a Matrix is independa
+nt of the entries the field over which the Matrix's entries are. Noti
+ce the timing differece - " }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0
+21 "time(LBrank(Diag1s));" }}{PARA 11 "" 1 "" {XPPMATH 20 "6#$\"$2\"!
+\"$" }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 61 "M := Matrix(500,500,
+ f, storage=sparse, datatype=integer[4]);" }}{PARA 11 "" 1 ""
+{XPPMATH 20 "6#>%\"MG-%'RTABLEG6+\"*[XuX\"&%(integerG6#\"\"%%'MatrixG%
+'sparseG%.Fortran_orderG7\"\"\"#;\"\"\"\"$+&F2" }}}{EXCHG {PARA 0 "> \+
+" 0 "" {MPLTEXT 1 0 29 "time(LinearAlgebra[Rank](M));" }}{PARA 11 ""
+1 "" {XPPMATH 20 "6#$\"'X%R(!\"$" }}}{EXCHG {PARA 0 "" 0 "" {TEXT -1
+105 "Now let's look at computing the Determinant of a Matrix. This is
+ done with the LBdet command as follows:" }}}{EXCHG {PARA 0 "> " 0 ""
+{MPLTEXT 1 0 14 "LBdet(Diag1s);" }}{PARA 11 "" 1 "" {XPPMATH 20 "6#\"
+\"!" }}}{EXCHG {PARA 0 "" 0 "" {TEXT -1 74 "Compare that to the Determ
+inant computed by Maple's LinearAlgebra package:" }}}{EXCHG {PARA 0 ">
+ " 0 "" {MPLTEXT 1 0 30 "LinearAlgebra[Determinant](M);" }}{PARA 11 "
+" 1 "" {XPPMATH 20 "6#\"\"!" }}}{EXCHG {PARA 0 "" 0 "" {TEXT -1 289 "N
+otice that though they both return the same number, they haven't retur
+ned the same answer. While the LinearAlgebra package's Determinant fu
+nction returns the absolute Determinant, LinBox's determinant function
+ returns the Givaro::Modular Determinant. The same is true of the Minimal Pol
+ynomial:" }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 20 "LBminpoly(Diag1
+s,x);" }}{PARA 11 "" 1 "" {XPPMATH 20 "6#,&*&\"#*)\"\"\"%\"xGF&F&*$)F'
+\"\"#F&F&" }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 76 "LinearAlgebra[
+MinimalPolynomial](M,x); # best leave this running over-night\n" }}}
+{EXCHG {PARA 0 "" 0 "" {TEXT -1 142 "You can also call LBminpoly witho
+ut a symbolic argument, in which case you will recieve a Maple list of
+ the coefficients, lowest degree first:" }}}{EXCHG {PARA 0 "> " 0 ""
+{MPLTEXT 1 0 19 "LBminpoly(Diag1s);\n" }}{PARA 11 "" 1 "" {XPPMATH 20
+"6#7%\"\"!\"#*)\"\"\"" }}}{EXCHG {PARA 0 "" 0 "" {TEXT -1 137 "Notice \+
+that the LinBox functions can be called on Maple Matrix types as well.
+ When doing so, you provide the prime specifying the field:" }}}
+{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 24 "LBrank(ithprime(30), M);" }}
+{PARA 11 "" 1 "" {XPPMATH 20 "6#\"\"#" }}}{EXCHG {PARA 0 "> " 0 ""
+{MPLTEXT 1 0 23 "LBdet(ithprime(30), M);" }}{PARA 11 "" 1 "" {XPPMATH
+20 "6#\"\"!" }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 27 "LBminpoly(it
+hprime(30), M);" }{TEXT -1 0 "" }}{PARA 11 "" 1 "" {XPPMATH 20 "6#7%\"
+\"!\"#*)\"\"\"" }}}{EXCHG {PARA 0 "" 0 "" {TEXT -1 103 "In these cases
+, a blackbox type is created in the background and used without return
+ing a handle to it." }}}{EXCHG {PARA 257 "" 0 "" {TEXT -1 0 "" }{TEXT
+272 20 "Using LinBox Vectors" }{TEXT 273 0 "" }}{PARA 0 "" 0 "" {TEXT
+-1 0 "" }{TEXT 274 0 "" }{TEXT -1 138 "Just as a type is given to hand
+le Blackbox matrices, a type has also been given to handle external Ve
+ctor types. This is the LinBoV type:" }}}{EXCHG {PARA 0 "> " 0 ""
+{MPLTEXT 1 0 54 "V := LinBoxV(500, i-> if isprime(i) then 1 else 0 fi)
+;" }}{PARA 12 "" 1 "" {XPPMATH 20 "6#>%\"VG`6$%*getVectorG%$keyGb6#%+t
+hismoduleG6#%)destructG6#/%'unloadGF-6$%*getVectorG%$keyG6\"6#QBMaple~
+container~for~LinBox~VectorF4F46*%\"kG%\"kG%.lbXkillVectorG%.lbXkillVe
+ctorG%(ExToMapG%(ExToMapG%-lbXgetVectorG%-lbXgetVectorG%,_m135564960G6
+#%)destructG" }}}{EXCHG {PARA 0 "" 0 "" {TEXT -1 146 "These vectors ar
+e stored in external code and accessed via a key stored in the LinBoxV
+ type. The LinBoxV type can be created using the following:" }}}
+{EXCHG {PARA 0 "" 0 "" {TEXT -1 44 "A length variable and procedure (s
+ee above)," }}}{EXCHG {PARA 0 "" 0 "" {TEXT -1 18 "A ready-made list:
+" }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 41 "f := i -> if isprime(i)
+ then 1 else 0 fi;" }}{PARA 11 "" 1 "" {XPPMATH 20 "6#>%\"fGf*6#%\"iG6
+\"6$%)operatorG%&arrowGF(@%-%(isprimeG6#9$\"\"\"\"\"!F(F(F(" }}}
+{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 36 "V := LinBoxV([seq(f(i), i=1.
+.500)]);" }{TEXT -1 0 "" }}{PARA 12 "" 1 "" {XPPMATH 20 "6#>%\"VG`6$%*
+getVectorG%$keyGb6#%+thismoduleG6#%)destructG6#/%'unloadGF-6$%*getVect
+orG%$keyG6\"6#QBMaple~container~for~LinBox~VectorF4F46*%\"kG%\"kG%.lbX
+killVectorG%.lbXkillVectorG%(ExToMapG%(ExToMapG%-lbXgetVectorG%-lbXget
+VectorG6\"6#%)destructG" }}}{EXCHG {PARA 0 "" 0 "" {TEXT -1 35 "and A \+
+ready-made Maple Vector type:" }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1
+0 83 "V := LinBoxV(Vector(500, i-> if isprime(i) then 1 else 0 fi, dat
+atype=integer[4]));" }}{PARA 12 "" 1 "" {XPPMATH 20 "6#>%\"VG`6$%*getV
+ectorG%$keyGb6#%+thismoduleG6#%)destructG6#/%'unloadGF-6$%*getVectorG%
+$keyG6\"6#QBMaple~container~for~LinBox~VectorF4F46*%\"kG%\"kG%.lbXkill
+VectorG%.lbXkillVectorG%(ExToMapG%(ExToMapG%-lbXgetVectorG%-lbXgetVect
+orG%,_m135778512G6#%)destructG" }}}{EXCHG {PARA 0 "" 0 "" {TEXT -1
+167 "Notice in the last it is required that datatype=integer[4] be spe
+cified. The LinBoxV type includes a method that returns a ready made \+
+Maple Vector called getVector():" }}}{EXCHG {PARA 0 "> " 0 ""
+{MPLTEXT 1 0 20 "x := V:-getVector();" }}{PARA 11 "" 1 "" {XPPMATH 20
+"6#>%\"xG-%'RTABLEG6*\"*Cb5N\"%)anythingG&%'VectorG6#%'columnG%,rectan
+gularG%.Fortran_orderG7\"\"\"\";F1\"$+&" }}}{EXCHG {PARA 0 "" 0 ""
+{TEXT -1 45 "x can now be used to check the contents of V;" }}}{EXCHG
+{PARA 0 "" 0 "" {TEXT -1 0 "" }{TEXT 275 0 "" }{TEXT 276 28 "LBapply a
+nd LBapplyTranspose" }}{PARA 0 "" 0 "" {TEXT -1 0 "" }{TEXT 277 0 "" }
+{TEXT -1 227 "The LBapply and LBapplyTranspose functions can be used t
+o apply a Blackbox Matrix to an external Vector. LBapply and LBapplyT
+ranpose corresponds to the apply and applyTranspose functions in the B
+lackboxArchetype. For example:" }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT
+1 0 25 "V1 := LBapply(Diag1s, V);" }}{PARA 12 "" 1 "" {XPPMATH 20 "6#>
+%#V1G`6$%*getVectorG%$keyGb6#%+thismoduleG6#%)destructG6#/%'unloadGF-6
+$%*getVectorG%$keyG6\"6#QBMaple~container~for~LinBox~VectorF4F46*%\"kG
+%\"kG%.lbXkillVectorG%.lbXkillVectorG%(ExToMapG%(ExToMapG%-lbXgetVecto
+rG%-lbXgetVectorG%,_m135779332G6#%)destructG" }}}{EXCHG {PARA 0 "> "
+0 "" {MPLTEXT 1 0 35 "V1T := LBapplyTranspose(Diag1s, V);" }}{PARA 12
+"" 1 "" {XPPMATH 20 "6#>%$V1TG`6$%*getVectorG%$keyGb6#%+thismoduleG6#%
+)destructG6#/%'unloadGF-6$%*getVectorG%$keyG6\"6#QBMaple~container~for
+~LinBox~VectorF4F46*%\"kG%\"kG%.lbXkillVectorG%.lbXkillVectorG%(ExToMa
+pG%(ExToMapG%-lbXgetVectorG%-lbXgetVectorG%-_m1095974244G6#%)destructG
+" }}}{EXCHG {PARA 0 "" 0 "" {TEXT -1 243 "As you can see, these functi
+ons return another LinBoxV type. As with the other functions in the L
+inBox interface, LBapply and LBapplyTranspose can take Maple Matrix an
+d Vector types (or a mix of LinBox and Maple types) as input. For exa
+mple:" }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 34 "V2 := LBapply(ithp
+rime(30), M, V);" }}{PARA 12 "" 1 "" {XPPMATH 20 "6#>%#V2G`6$%*getVect
+orG%$keyGb6#%+thismoduleG6#%)destructG6#/%'unloadGF-6$%*getVectorG%$ke
+yG6\"6#QBMaple~container~for~LinBox~VectorF4F46*%\"kG%\"kG%.lbXkillVec
+torG%.lbXkillVectorG%(ExToMapG%(ExToMapG%-lbXgetVectorG%-lbXgetVectorG
+%-_m1095975044G6#%)destructG" }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1
+0 102 "V3 := LBapplyTranspose(Diag1s, Vector(500, i -> if isprime(i) t
+hen 1 else 0 fi, datatype=integer[4]));" }}{PARA 11 "" 1 "" {XPPMATH
+20 "6#>%#V3G-%'RTABLEG6*\"*OECN\"%)anythingG&%'VectorG6#%'columnG%,rec
+tangularG%.Fortran_orderG7\"\"\"\";F1\"$+&" }}}{EXCHG {PARA 0 "> " 0 "
+" {MPLTEXT 1 0 76 "vm := Vector(500, i -> if isprime(i) then 1 else 0 \+
+fi, datatype=integer[4]);" }}{PARA 11 "" 1 "" {XPPMATH 20 "6#>%#vmG-%'
+RTABLEG6*\"*O5CN\"&%(integerG6#\"\"%&%'VectorG6#%'columnG%,rectangular
+G%.Fortran_orderG7\"\"\"\";F4\"$+&" }}}{EXCHG {PARA 0 "> " 0 ""
+{MPLTEXT 1 0 44 "V4 := LBapplyTranspose(ithprime(30), M, vm);" }}
+{PARA 11 "" 1 "" {XPPMATH 20 "6#>%#V4G-%'RTABLEG6*\"*#*pLN\"%)anything
+G&%'VectorG6#%'columnG%,rectangularG%.Fortran_orderG7\"\"\"\";F1\"$+&
+" }}}{EXCHG {PARA 0 "" 0 "" {TEXT -1 221 "Notice in the last example, \+
+the answer comes back as a Maple Vector rather than a LinBoxV type. F
+Or the LBApply and LBApplyTranspose functions, if all the inputs are M
+aple types, all the outputs will also be Maple types." }}}{EXCHG
+{PARA 0 "" 0 "" {TEXT -1 226 "As always, when using a Maple Matrix wit
+h a LinBox function, firsty give a prime that specifies the field of t
+he Matrix. These functions could be used to create low-level LinBox p
+rocedures in Maple, were the user so inclined." }}}{EXCHG {PARA 0 ""
+0 "" {TEXT -1 0 "" }{TEXT 278 0 "" }{TEXT 279 19 "Further Development
+" }{TEXT 280 0 "" }{TEXT -1 0 "" }}{PARA 0 "" 0 "" {TEXT -1 186 "As wi
+th all aspects of the LinBox project, this module is currently under d
+evelopment. To aide in the development of LinBox algorithms in Maple,
+ under works are the following functions:" }}}{EXCHG {PARA 0 "" 0 ""
+{TEXT -1 96 "LBdiag(prime, n) - Returns a blackbox object representing
+ a diagonal Matrix with random entries." }}}{EXCHG {PARA 0 "" 0 ""
+{TEXT -1 89 "LBcompose(M1, M2) - Returns a blackbox object represeting
+ the composition of two Matrices" }}}{EXCHG {PARA 0 "" 0 "" {TEXT -1
+82 "LBtranspose(M1) - Returns a blackbox object representing the trans
+pose of a Matrix" }}}{EXCHG {PARA 0 "" 0 "" {TEXT -1 256 "The develope
+r is currently accepting ideas, suggestions and angry flames. If you \+
+have any constructive criticism, you can reach Rich Seagraves at seagr
+ave at cis.udel.edu. Otherwise, messages pointed to /dev/null will be ju
+st fine :-). Thank you very much." }}}}{MARK "5 0 0" 10 }{VIEWOPTS 1
+1 0 1 1 1803 1 1 1 1 }{PAGENUMBERS 0 1 2 33 1 1 }
diff --git a/interfaces/maple-old/lbffpack.mpl b/interfaces/maple-old/lbffpack.mpl
new file mode 100644
index 0000000..d89e076
--- /dev/null
+++ b/interfaces/maple-old/lbffpack.mpl
@@ -0,0 +1,165 @@
+FFPACK:=module()
+ export LBMultiply,LBAddMultiply,LSPFactor,LQUPFactor,LBRank,LBDeterminant,LBInverse;
+ local fgemm,lsp,lbrank,lbdeterminant,lbinverse,create,libname;
+ option package, load=create, unload=gc;
+ description "Maple interface to FFPACK package";
+
+
+ create := proc()
+ libname :="/home/pgiorgi/Library/src/linbox/interfaces/maple/.libs/liblbmapleffpack.so";
+ fgemm:=define_external('fgemm',MAPLE,LIB=libname);
+ lsp:=define_external('lsp',MAPLE,LIB=libname);
+ lbrank:=define_external('rank',MAPLE,LIB=libname);
+ lbdeterminant:=define_external('determinant',MAPLE,LIB=libname);
+ lbinverse:=define_external('inverse',MAPLE,LIB=libname);
+
+ end proc;
+
+ create();
+
+
+ LBMultiply:=proc()
+ # calls are :
+ # LBMultiply(p,A,B) -> return A*B mod p
+ # LBMultiply(p,alpha,A,B) -> return alpha.A*B mod p
+ # LBMultiply(p,A,B,C) -> return C:= A*B mod p
+ # LBMultiply(p,alpha,A,B,C) -> return C:= alpha.A*B mod p
+
+ local m,n,k1,k2,alpha,C,a,b;
+
+ if (type(args[2],Matrix)) then
+ alpha:=1;
+ m,k1 := LinearAlgebra:-Dimension(args[2]);
+ k2,n := LinearAlgebra:-Dimension(args[3]);
+ a:=2;b:=3;
+
+ elif (type(args[2],numeric)) then
+ alpha:=args[2];
+ m,k1 := LinearAlgebra:-Dimension(args[3]);
+ k2,n := LinearAlgebra:-Dimension(args[4]);
+ a:=3:b:=4;
+ else
+ error " 2nd argument should be either a Matrix or a numeric value";
+
+ end if;
+
+ if (k1<> k2) then
+ error "Dimensions don't match",k1,k2;
+ end if;
+
+
+ if (nargs <b+1) then
+ C:=LinearAlgebra:-Modular:-Create(args[1],m,n,float[8]);
+ fgemm(args[1],m,n,k1,alpha,args[a],args[b],0,C);
+ else
+ fgemm(args[1],m,n,k1,alpha,args[a],args[b],0,args[b+1]);
+ end if;
+
+ end proc;
+
+
+ LBAddMultiply:=proc()
+ # calls are:
+ # LBAddMultiply(p,alpha,A,B,beta,C) -> return C:= beta.C+alpha.A*B mod p
+
+ local m,n,k1,k2,m1,n1;
+
+ m,k1:= LinearAlgebra:-Dimension(args[3]);
+ k2,n:= LinearAlgebra:-Dimension(args[4]);
+ m1,n1:= LinearAlgebra:-Dimension(args[6]);
+
+
+
+ if ((k1<>k2) or ( m1<> m) or (n1 <> n)) then
+ error "Dimensions don't match";
+ end if;
+
+ fgemm(args[1],m,n,k1,args[2],args[3],args[4],args[5],args[6]);
+
+
+ end proc;
+
+
+ LSPFactor:=proc()
+ # calls are:
+ # LSPFactor(p,A) -> return A,P ; A:=[LSP] mod p (L is lower part of A , S is upper part of A)
+ # LSPFactor(p,A,perm) -> return A,perm; A:=[LSP],perm:=P
+
+ local m,n,P;
+ m,n:= LinearAlgebra:-Dimension(args[2]);
+
+ if (nargs <3) then
+ P:=rtable(1..n,subtype=Vector[column],datatype=integer[4],order=C_order);
+ #P:=Vector[column](1..n);
+ lsp(args[1],m,n,args[2],P,1);
+ return args[2],P;
+ else
+ lsp(args[1],m,n,args[2],args[3],1);
+ return args[2],args[3];
+ end if;
+
+ end proc;
+
+
+ LQUPFactor:=proc()
+ # calls are:
+ # LQUPFactor(p,A) -> return A,Q,P ; A:=[LQUP] mod p (L is lower part of A in compress form, U is upper part of A)
+ # LQUPFactor(p,A,perm1,perm2) -> return A,perm1,perm2; A:=[LSP],perm:=P
+
+ local m,n,P,Q;
+ m,n:= LinearAlgebra:-Dimension(args[2]);
+
+ if (nargs <3) then
+ Q:=rtable(1..m,subtype=Vector[column],datatype=integer[4],order=C_order);
+ P:=rtable(1..n,subtype=Vector[column],datatype=integer[4],order=C_order);
+ lsp(args[1],m,n,args[2],P,2,Q);
+ return args[2],P,Q;
+ else
+ lsp(args[1],m,n,args[2],args[3],2,args[4]);
+ return args[2],args[3],args[4];
+ end if;
+
+ end proc;
+
+ LBRank:=proc()
+ # calls are:
+ # LBRank(p,A) return rank(A mod p)
+
+ local m,n;
+ m,n:= LinearAlgebra:-Dimension(args[2]);
+ lbrank(args[1],m,n,args[2]);
+
+ end proc;
+
+ LBDeterminant:=proc()
+ # calls are:
+ # LBDeterminant(p,A) return determinant(A) mod p
+ local m,n;
+ m,n:= LinearAlgebra:-Dimension(args[2]);
+ lbdeterminant(args[1],m,n,args[2]);
+
+ end proc;
+
+
+ LBInverse:=proc()
+ # calls are:
+ # LBInverse(p,A) return A^(-1) mod p
+ # LBInverse(p,A,X) return X:=A^(-1) mod p
+
+ local m,n,X;
+ m,n:= LinearAlgebra:-Dimension(args[2]);
+ if (m<>n) then error "matrix should be square"; end if;
+
+ if (nargs <3) then
+ X:=LinearAlgebra:-Modular:-Create(args[1],m,m,float[8]);
+ lbinverse(args[1],m,args[2],X);
+ else
+ lbinverse(args[1],m,args[2],args[3]);
+ end if;
+
+ end proc;
+
+
+
+
+end module;
diff --git a/interfaces/maple-old/lbmaple-ffpack.C b/interfaces/maple-old/lbmaple-ffpack.C
new file mode 100644
index 0000000..c3b7e6f
--- /dev/null
+++ b/interfaces/maple-old/lbmaple-ffpack.C
@@ -0,0 +1,444 @@
+/* Copyright (C) LinBox
+ *
+ *
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ * ========LICENCE========
+ */
+
+
+
+
+//#define DEBUG 3
+
+
+#include "linbox/field/modular.h"
+#include "linbox/field/givaro-zpz.h"
+#include "fflas-ffpack/fflas/fflas.h"
+#include "fflas-ffpack/ffpack/ffpack.h"
+#include "maplec.h"
+
+using namespace LinBox;
+
+typedef Givaro::Modular<double> Field;
+//typedef Givaro::Modular<int32_t> Field;
+typedef Field::Element Element;
+
+
+extern "C"
+{
+
+
+ ALGEB fgemm(MKernelVector kv, ALGEB* argv )
+ {
+
+ /* expect arguments in following order:
+ 1- p (int prime)
+ 2- m (int)
+ 3- n (int)
+ 4- k (int)
+ 5- alpha (int)
+ 6- A (matrix)
+ 7- B (matrix)
+ 8- beta (int)
+ 9- C (matrix)
+ */
+
+ //MaplePrintf(kv,"Givaro::Modular Matrix Mutiplication using LinBox library\n");
+
+ int p,m,n,k,alpha,beta;
+ p = MapleToInteger32(kv,(ALGEB)argv[1]);
+ m = MapleToInteger32(kv,(ALGEB)argv[2]);
+ n = MapleToInteger32(kv,(ALGEB)argv[3]);
+ k = MapleToInteger32(kv,(ALGEB)argv[4]);
+ alpha = MapleToInteger32(kv,(ALGEB)argv[5]);
+ beta = MapleToInteger32(kv,(ALGEB)argv[8]);
+
+ Field F(p);
+ Element a,b;
+ F.init(a,alpha);
+ F.init(b,beta);
+ Element *A, *B, *C;
+
+ ALGEB Matrix;
+ RTableSettings settings;
+
+ // Check that argument 6,7,9 are float[8] rtable and return a pointer on it
+ Matrix = (ALGEB)argv[6];
+ RTableGetSettings(kv,&settings,Matrix);
+ if( settings.data_type != RTABLE_FLOAT64
+ || settings.storage != RTABLE_RECT
+ || !IsMapleNULL(kv,settings.index_functions) )
+ {
+ MaplePrintf(kv,"Making a copy \n");
+ /* not the format we wanted -- make a copy */
+ settings.data_type = RTABLE_FLOAT64;
+ settings.storage = RTABLE_RECT;
+ settings.index_functions = ToMapleNULL(kv);
+ settings.foreign = FALSE;
+ Matrix = RTableCopy(kv,&settings,Matrix);
+ }
+ A = (Element*)RTableDataBlock(kv,Matrix);
+ //Ae=new Element[m*k];
+ //for (int i=0;i<m*k;i++)
+ // *(Ae+i)=*(A+i);
+
+ Matrix = (ALGEB)argv[7];
+ RTableGetSettings(kv,&settings,Matrix);
+ if( settings.data_type != RTABLE_FLOAT64
+ || settings.storage != RTABLE_RECT
+ || !IsMapleNULL(kv,settings.index_functions) )
+ {
+ MaplePrintf(kv,"Making a copy \n");
+ /* not the format we wanted -- make a copy */
+ settings.data_type = RTABLE_FLOAT64;
+ settings.storage = RTABLE_RECT;
+ settings.index_functions = ToMapleNULL(kv);
+ settings.foreign = FALSE;
+ Matrix = RTableCopy(kv,&settings,Matrix);
+ }
+ B = (Element*)RTableDataBlock(kv,Matrix);
+ //Be=new Element[k*n];
+ //for (int i=0;i<k*n;i++)
+ // *(Be+i)=*(B+i);
+
+ Matrix = (ALGEB)argv[9];
+ RTableGetSettings(kv,&settings,Matrix);
+ if( settings.data_type != RTABLE_FLOAT64
+ || settings.storage != RTABLE_RECT
+ || !IsMapleNULL(kv,settings.index_functions) )
+ {
+ MaplePrintf(kv,"Making a copy \n");
+ /* not the format we wanted -- make a copy */
+ settings.data_type = RTABLE_FLOAT64;
+ settings.storage = RTABLE_RECT;
+ settings.index_functions = ToMapleNULL(kv);
+ settings.foreign = FALSE;
+ Matrix = RTableCopy(kv,&settings,Matrix);
+ }
+ C = (Element*)RTableDataBlock(kv,Matrix);
+
+ //Ce=new Element[m*n];
+ FFLAS::fgemm(F,FFLAS::FflasNoTrans,FFLAS::FflasNoTrans,m,n,k,a,A,k,B,n,b,C,n);
+
+ Matrix = (ALGEB)argv[9];
+ RTableGetSettings(kv,&settings,Matrix);
+ switch (settings.data_type) {
+
+ case RTABLE_FLOAT64:
+ break;
+
+ case RTABLE_INTEGER32:
+ MaplePrintf(kv,"Converting the result to int[4]\n");
+ int* Ce;
+ Ce= (int *)RTableDataBlock(kv,Matrix);
+ for (int i=0;i<m*n;i++)
+ *(Ce+i)= (int) *(C+i);
+ break;
+
+ case RTABLE_DAG:
+ MaplePrintf(kv,"Converting the result to maple int\n");
+ ALGEB* Cee;
+ Cee= (ALGEB *)RTableDataBlock(kv,Matrix);
+ for (int i=0;i<m*n;i++)
+ *(Cee+i)= ToMapleInteger(kv,(long)*(C+i));
+ break;
+ }
+
+
+
+ return Matrix;
+
+ }
+}
+
+
+extern "C" {
+
+ ALGEB lsp(MKernelVector kv, ALGEB* argv )
+ {
+
+ /* expect arguments in following order:
+ 1- p (int prime)
+ 2- m (int)
+ 3- n (int)
+ 4- A (matrix)
+ 5- P (vector)
+ 6- k (method: k=1 -> LSP : k=2 -> LQUP)
+ 7- Q (vector) only needed when k=2
+
+ */
+
+ int p=MapleToInteger32(kv,argv[1]);
+ int m,n,k;
+ m=MapleToInteger32(kv,(ALGEB)argv[2]);
+ n=MapleToInteger32(kv,(ALGEB)argv[3]);
+ k=MapleToInteger32(kv,(ALGEB)argv[6]);
+
+ Field F(p);
+
+
+ ALGEB Matrix,OutMatrix,Perm1,Perm2;
+ RTableSettings settings,oldsettings;
+
+ Matrix = (ALGEB)argv[4];
+ RTableGetSettings(kv,&settings,Matrix);
+ if( settings.data_type != RTABLE_FLOAT64
+ || settings.storage != RTABLE_RECT
+ || !IsMapleNULL(kv,settings.index_functions) )
+ {
+ RTableGetSettings(kv,&oldsettings,Matrix);
+ MaplePrintf(kv,"Making a copy \n");
+ /* not the format we wanted -- make a copy */
+ settings.data_type = RTABLE_FLOAT64;
+ settings.storage = RTABLE_RECT;
+ settings.index_functions = ToMapleNULL(kv);
+ settings.foreign = FALSE;
+ Matrix = RTableCopy(kv,&settings,Matrix);
+ }
+
+ Element *TMP1= (Element*) RTableDataBlock(kv,Matrix);
+
+ Perm1= (ALGEB)argv[5];
+ RTableGetSettings(kv,&settings,Perm1);
+
+
+ size_t *TMP2= (size_t*) RTableDataBlock(kv,Perm1);
+
+ if (k == 2) {
+ Perm2= (ALGEB) argv[7];
+ size_t *TMP3= (size_t*) RTableDataBlock(kv,Perm2);
+ FFPACK::LUdivine( F, FFLAS::FflasNonUnit, m, n, TMP1, n, TMP2, FFPACK::FfpackLQUP,TMP3);
+ }
+ else{
+ FFPACK::LUdivine( F, FFLAS::FflasNonUnit, m, n, TMP1, n, TMP2, FFPACK::FfpackLSP);
+ }
+
+
+
+ OutMatrix = (ALGEB)argv[4];
+
+ switch (settings.data_type) {
+
+ case RTABLE_FLOAT64:
+ OutMatrix=Matrix;
+ break;
+
+ case RTABLE_INTEGER32:
+ MaplePrintf(kv,"Converting the result to int[4]\n");
+ OutMatrix = RTableCopy(kv,&oldsettings,Matrix);
+ break;
+
+ case RTABLE_DAG:
+ MaplePrintf(kv,"Converting the result to maple int\n");
+ OutMatrix = RTableCopy(kv,&oldsettings,Matrix);
+ break;
+ }
+
+
+ return OutMatrix;
+ }
+
+}
+
+extern "C" {
+
+ ALGEB rank(MKernelVector kv, ALGEB* argv )
+ {
+ /* expect arguments in following order:
+ 1- p (int prime)
+ 2- m (int)
+ 3- n (int)
+ 4- A (matrix)
+ */
+
+ int p=MapleToInteger32(kv,argv[1]);
+ int m,n;
+ m=MapleToInteger32(kv,(ALGEB)argv[2]);
+ n=MapleToInteger32(kv,(ALGEB)argv[3]);
+
+ Field F(p);
+ Element *A;
+
+ RTableSettings settings;
+ ALGEB Matrix = (ALGEB)argv[4];
+
+ RTableGetSettings(kv,&settings,Matrix);
+ if( settings.data_type != RTABLE_FLOAT64
+ || settings.storage != RTABLE_RECT
+ || !IsMapleNULL(kv,settings.index_functions) )
+ {
+ MaplePrintf(kv,"Making a copy \n");
+
+
+
+ /* not the format we wanted -- make a copy */
+ settings.data_type = RTABLE_FLOAT64;
+ settings.storage = RTABLE_RECT;
+ settings.index_functions = ToMapleNULL(kv);
+ settings.foreign = FALSE;
+ Matrix = RTableCopy(kv,&settings,Matrix);
+ }
+ A= (Element*) RTableDataBlock(kv,Matrix);
+
+ int rank=FFPACK::Rank(F,m,n,A,n);
+
+ return ToMapleInteger(kv,rank);
+ }
+}
+
+
+
+extern "C" {
+
+ ALGEB determinant(MKernelVector kv, ALGEB* argv )
+ {
+ /* expect arguments in following order:
+ 1- p (int prime)
+ 2- m (int)
+ 3- n (int)
+ 4- A (matrix)
+ */
+
+ int p=MapleToInteger32(kv,argv[1]);
+ int m,n;
+ m=MapleToInteger32(kv,(ALGEB)argv[2]);
+ n=MapleToInteger32(kv,(ALGEB)argv[3]);
+
+ Field F(p);
+ Element *A;
+
+ RTableSettings settings;
+ ALGEB Matrix = (ALGEB)argv[4];
+
+ RTableGetSettings(kv,&settings,Matrix);
+ if( settings.data_type != RTABLE_FLOAT64
+ || settings.storage != RTABLE_RECT
+ || !IsMapleNULL(kv,settings.index_functions) )
+ {
+ MaplePrintf(kv,"Making a copy \n");
+ /* not the format we wanted -- make a copy */
+ settings.data_type = RTABLE_FLOAT64;
+ settings.storage = RTABLE_RECT;
+ settings.index_functions = ToMapleNULL(kv);
+ settings.foreign = FALSE;
+ Matrix = RTableCopy(kv,&settings,Matrix);
+ }
+ A= (Element*) RTableDataBlock(kv,Matrix);
+
+ Element d=FFPACK::Det(F,m,n,A,n);
+
+ return ToMapleInteger(kv,long(d));
+ }
+}
+
+
+extern "C" {
+
+ ALGEB inverse(MKernelVector kv, ALGEB* argv )
+ {
+ /* expect arguments in following order:
+ 1- p (int prime)
+ 2- m (int)
+ 3- A (matrix)
+ 4- X (matrix)
+ */
+
+ int p=MapleToInteger32(kv,argv[1]);
+ int m;
+ m=MapleToInteger32(kv,(ALGEB)argv[2]);
+
+ Field F(p);
+ Element *A,*X;
+
+ RTableSettings settings;
+ ALGEB Matrix;
+
+ Matrix= (ALGEB)argv[3];
+ RTableGetSettings(kv,&settings,Matrix);
+ if( settings.data_type != RTABLE_FLOAT64
+ || settings.storage != RTABLE_RECT
+ || !IsMapleNULL(kv,settings.index_functions) )
+ {
+ MaplePrintf(kv,"Making a copy \n");
+ /* not the format we wanted -- make a copy */
+ settings.data_type = RTABLE_FLOAT64;
+ settings.storage = RTABLE_RECT;
+ settings.index_functions = ToMapleNULL(kv);
+ settings.foreign = FALSE;
+ Matrix = RTableCopy(kv,&settings,Matrix);
+ }
+ A= (Element*) RTableDataBlock(kv,Matrix);
+
+
+ Matrix= (ALGEB)argv[4];
+ RTableGetSettings(kv,&settings,Matrix);
+ if( settings.data_type != RTABLE_FLOAT64
+ || settings.storage != RTABLE_RECT
+ || !IsMapleNULL(kv,settings.index_functions) )
+ {
+ MaplePrintf(kv,"Making a copy \n");
+ /* not the format we wanted -- make a copy */
+ settings.data_type = RTABLE_FLOAT64;
+ settings.storage = RTABLE_RECT;
+ settings.index_functions = ToMapleNULL(kv);
+ settings.foreign = FALSE;
+ Matrix = RTableCopy(kv,&settings,Matrix);
+ }
+ X= (Element*) RTableDataBlock(kv,Matrix);
+
+ FFPACK::Invert(F,m,A,m,X,m);
+
+ Matrix = (ALGEB)argv[4];
+ RTableGetSettings(kv,&settings,Matrix);
+ switch (settings.data_type) {
+
+ case RTABLE_FLOAT64:
+ break;
+
+ case RTABLE_INTEGER32:
+ MaplePrintf(kv,"Converting the result to int[4]\n");
+ int* Ae;
+ Ae= (int *)RTableDataBlock(kv,Matrix);
+ for (int i=0;i<m*m;i++)
+ *(Ae+i)= (int) *(X+i);
+ break;
+
+ case RTABLE_DAG:
+ MaplePrintf(kv,"Converting the result to maple int\n");
+ ALGEB* Cee;
+ Cee= (ALGEB *)RTableDataBlock(kv,Matrix);
+ for (int i=0;i<m*m;i++)
+ *(Cee+i)= ToMapleInteger(kv,(long)*(X+i));
+ break;
+ }
+
+ return Matrix;
+ }
+}
+
+
+
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+
diff --git a/interfaces/maple-old/lbmaple.C b/interfaces/maple-old/lbmaple.C
new file mode 100644
index 0000000..4a2c467
--- /dev/null
+++ b/interfaces/maple-old/lbmaple.C
@@ -0,0 +1,1441 @@
+/* Copyright (C) LinBox
+ *
+ *
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ * ========LICENCE========
+ */
+
+
+#include "linbox/field/modular.h"
+#include "linbox/integer.h" // <- Wrapper for gmp BIG int support
+// #include "linbox/field/integer.h" <- When linbox supports computations
+// over the whole integers
+#include "linbox/blackbox/triplesbb.h" // Special blackbox for this interface
+#include "linbox/solutions/rank.h"
+#include "linbox/solutions/det.h"
+#include "linbox/solutions/minpoly.h"
+// #include "linbox/solutions/ssolve.h" <- When linbox supports System solver
+
+#include <vector>
+#include <map>
+#include <utility>
+#include <cstring>
+#include <cstdio>
+
+#include "maplec.h"
+
+using LinBox::integer;
+typedef std::vector<long> Vectorl;
+typedef std::vector<integer> VectorI;
+typedef LinBox::TriplesBB<Givaro::Modular<long> > TriplesBBi;
+typedef LinBox::TriplesBB<Givaro::Modular<integer> > TriplesBBI;
+
+/* Type references: Used to identify the type of object pointed to by
+ * elements in the hash table.
+ * Types: BlackBoxi - Black Box matrix, single-word size entries
+ * Class: LinBox::TriplesBB<Givaro::Modular<long>, std::vector<long> > (TriplesBBi)
+ * BlackBoxI - Black Box matrix, multi-word size entries
+ * Class: LinBox::TriplesBB<Givaro::Modular<integer>, std::vector<integer> > (TriplesBBI)
+ * SmallV - STL vector, single-word size entries
+ * Class: std::vector<long> (Vectorl)
+ * LargeV - STL vector, multi-word size entries
+ * Class: std::vector<integer> (VectorI)
+ */
+
+const int BlackBoxi = 1;
+const int BlackBoxI = 2;
+const int SmallV = 3;
+const int LargeV = 4;
+
+extern "C"
+{
+ ALGEB End(MKernelVector kv, ALGEB* args);
+ ALGEB initBB(MKernelVector kv, ALGEB* args);
+ ALGEB getMatrix(MKernelVector kv, ALGEB* args);
+ ALGEB killMatrix(MKernelVector kv, ALGEB* args);
+ ALGEB initV(MKernelVector kv, ALGEB* args);
+ ALGEB getVector(MKernelVector kv, ALGEB* args);
+ ALGEB killVector(MKernelVector kv, ALGEB* args);
+ ALGEB apply(MKernelVector kv, ALGEB* args);
+ ALGEB applyT(MKernelVector kv, ALGEB* args);
+ ALGEB rank(MKernelVector kv, ALGEB* args);
+ ALGEB det(MKernelVector kv, ALGEB* args);
+ ALGEB minpoly(MKernelVector kv, ALGEB* args);
+ // ALGEB ssolve(MKernelVector kv, ALGEB* args);
+}
+
+ALGEB & LiToM(MKernelVector &, const integer &, ALGEB &);
+integer & MtoLI(MKernelVector &, integer &, const ALGEB &);
+
+std::map<int,void*> hashTable;
+std::map<int, int> typeTable;
+
+
+/* End -- LBmaple back-end module "destructor". Cleans up all external data
+ * when the LBmaple module goes out of scope and is garbage collected.
+ * Pre-Condition: attached maple module has gone out of scope and is
+ * garbage collected.
+ * Post-Condition: all dynamically allocated data is freed
+ */
+
+extern "C"
+{
+ ALGEB End(MKernelVector kv, ALGEB* args)
+ {
+ /* Four types of objects stored in memory */
+
+ TriplesBBi* BBip;
+ TriplesBBI* BBIp;
+ Vectorl* Vip;
+ VectorI* VIp;
+
+ std::map<int,int>::iterator f_i;
+ std::map<int,void*>::iterator h_i;
+
+ // For each object in the hashTable . . .
+ for( h_i = hashTable.begin(); h_i != hashTable.end(); ++h_i) {
+
+ // Find the objects type and switch appropriately. . .
+ f_i = typeTable.find(h_i->first);
+ switch( f_i->second ) {
+
+ // In each case, delete the object pointed to
+ case BlackBoxi:
+ BBip = (TriplesBBi*) h_i->second;
+ delete BBip;
+ break;
+
+ case BlackBoxI:
+ BBIp = (TriplesBBI*) h_i->second;
+ delete BBIp;
+ break;
+
+ case SmallV:
+ Vip = (std::vector<long> *) h_i->second;
+ delete Vip;
+ break;
+
+ case LargeV:
+ VIp = ( std::vector<integer> *) h_i->second;
+ delete VIp;
+ break;
+
+ /* Of course there are more cases to follow */
+ }
+
+ }
+ // When all objects are deleted, return
+ return ToMapleNULL(kv);
+ }
+}
+
+/* initBB - Backend "constructor" for Maple BlackBox objects. Takes as input 3 types of objects
+ * from Maple: A Maple NAG sparse Matrix, 3 vectors defining a word-size entry matrix, or
+ * 3 vectors defining a multi-word size entry matrix
+ * Declares the object in dynamic memory and hashes into hashTable and typeTable
+ * using the key supplied by Maple.
+ * Pre-Condition: Called from Maple to create blackbox type
+ * Post-Condition: Blackbox object exists in dynamic memory, can be called upon with key
+ * supplied by Maple
+ */
+
+extern "C"
+{
+ ALGEB initBB(MKernelVector kv, ALGEB* args)
+ {
+
+ // First get flag and key
+ // IN this c
+ int flag = MapleToInteger32(kv,args[1]), key = MapleToInteger32(kv,args[2]);
+ size_t m, n, nonzeros, i;
+
+ // perform an intial search to see if the key is stored in memory. If so, return the key,
+ // the object already exists
+
+ // Otherwise, switch on the type
+ switch(flag) {
+
+ // The first type is the Maple NAG sparse matrix. It is passed straight into the routine
+ // the prime is passed first, then the object. All pertinant data can be lifted using
+ // Maple's extensive rtable API
+ case 1: {
+ long p;
+ int *data;
+ NAG_INT *rowP, *colP;
+ TriplesBBi* In;
+
+ p = MapleToInteger32(kv, args[3]);
+ m = RTableUpperBound(kv, args[4], 1);
+ n = RTableUpperBound(kv, args[4], 2);
+ nonzeros = RTableNumElements(kv, args[4]);
+
+ // Get pointers to the data
+ rowP = RTableSparseIndexRow(kv,args[4],1);
+ colP = RTableSparseIndexRow(kv, args[4],2);
+ data = (int*) RTableDataBlock(kv,args[4]);
+
+ // Declare a new object on the heap
+ Givaro::Modular<long> modF(p);
+ In = new TriplesBBi(modF, m, n, nonzeros);
+
+ // Add each entry
+ for(i = 0; i < nonzeros; ++i) {
+ In->addEntry( data[i], rowP[i], colP[i]);
+ }
+
+ // hash the pointer into the hasTable, the type into the typeTable using the key
+ hashTable.insert(std::pair<int,void*>(key, In));
+ typeTable.insert(std::pair<int,int>( key, BlackBoxi ));
+ }
+ break;
+
+
+ // In the second case, the user either A) Created a BlackBox from an existing sparse
+ // matrix in Maple, or created a Matrix by passing in parameters and a procedure
+ // In either case, the data is formatted in Maple, and a number of parameters are passed
+ // to this routine.
+ // First is the prime, then the row list, then the column list, the entry list, followed
+ // by the rows, columns, and number of non-zero entries.
+ case 2: {
+ long p;
+ TriplesBBi* In;
+
+ p = MapleToInteger32(kv, args[3]);
+ m = (size_t) MapleToInteger32(kv,args[7]);
+ n = (size_t) MapleToInteger32(kv,args[8]);
+ nonzeros = (size_t) MapleToInteger32(kv,args[9]);
+
+ // Declares field and blackbox
+ Givaro::Modular<long> modF(p);
+ In = new TriplesBBi(modF, m, n, nonzeros);
+ // Populates blackbox w/ entries
+ for(i = 1; i <= nonzeros; i++) {
+ In->addEntry( MapleToInteger32(kv, MapleListSelect(kv, args[4], i)), MapleToInteger32(kv, MapleListSelect(kv, args[5], i)), MapleToInteger32(kv, MapleListSelect(kv, args[6], i)));
+ }
+
+ hashTable.insert(std::pair<int,void*>(key, (void*) In));
+ typeTable.insert(std::pair<int,int>(key, BlackBoxi));
+ }
+ break;
+
+
+ // In this case, a sparse Matrix was input, or a matrix was created w/ a procedure, but
+ // the matrix is defined by a multi-word size prime. Data is passed in the order
+ // mentioned for case #2 above. Notice that the function calls the MtoLI function
+ // to convert into a gmp integer
+ case 3:{
+ integer blank, iPrime;
+ VectorI Elements;
+ TriplesBBI* In;
+
+ iPrime = MtoLI(kv, iPrime, args[3]);
+ m = (size_t) MapleToInteger32(kv,args[7]);
+ n = (size_t) MapleToInteger32(kv,args[8]);
+ nonzeros = (size_t) MapleToInteger32(kv,args[9]);
+
+ // Declare Field and blackbox
+ Givaro::Modular<integer> modF(iPrime);
+ In = new TriplesBBI(modF, m, n, nonzeros);
+ for(i = 1; i <= nonzeros; i++) {
+ In->addEntry( MtoLI(kv, blank, MapleListSelect(kv, args[4],i)), MapleToInteger32(kv, MapleListSelect(kv, args[5], i)), MapleToInteger32(kv, MapleListSelect(kv, args[6], i)));
+ }
+
+ hashTable.insert(std::pair<int,void*>(key, In));
+ typeTable.insert(std::pair<int,int>(key,BlackBoxI));
+ }
+ break;
+
+
+ // In case some weird operation is requested, just bail.
+ default:
+ MapleRaiseError(kv, "ERROR! Confused by request. No action performed.");
+ break;
+ }
+
+ return ToMapleNULL(kv);
+ }
+}
+
+
+
+
+
+/* initV - Backend "constructor" for LBmaple vector type.
+ * Can create either a wordsize entry
+ * vector, or a multi-precision vector (distinction made by entry size flag passed
+ * from Maple). Declares the object in dynamic memory and hashes into hashTable and typeTable
+ * using the key supplied by Maple.
+ * Pre-Condition: Called from Maple with initialized data in a correct format
+ * Post-Condition: Blackbox object exists in dynamic memory, can be called upon with key
+ * supplied by Maple
+ */
+
+extern "C" {
+ ALGEB initV(MKernelVector kv, ALGEB* args)
+ {
+
+ // First get the flag and key to use. The flag indicates what type of object was passed in
+ // the key what key it should be hashed against
+ int flag = MapleToInteger32(kv,args[1]), key = MapleToInteger32(kv,args[2]), length, index, i, j, L;
+ std::vector<long>* vP;
+ std::vector<integer>* VP;
+ integer blank;
+
+
+ // Performs a quick table check to see if the Vector has already been
+ // created. If so, simply return it
+ std::map<int,void*>::iterator h_i = hashTable.find(key);
+ if( h_i != hashTable.end() ) {
+ return ToMapleInteger(kv, (long) key);
+ }
+
+ // A few good choices
+ switch( flag ) {
+
+ // For this case, a complete maple list of single-word size entries is passed
+ // in that will be translated (1-1) into an STL vector and hased in.
+ case 1:
+ // First get the vector length
+ length = MapleToInteger32(kv, args[4]);
+
+ // dynamically allocate the new object, and reserve space in memory for savings
+ vP = new std::vector<long>;
+ vP->reserve(length);
+
+ // initialize entries and hash into hashTable
+ for(i = 1; i <= length; i++) {
+ vP->push_back( MapleToInteger32(kv, MapleListSelect(kv, args[3], (M_INT) i)));
+ }
+ hashTable.insert(std::pair<int, void*>(key, vP));
+ break;
+
+ // For thsi case, a complete maple list of multi-word sized entries is passed
+ // in that will be translate (1-1) into an STL vector and hashed in.
+ case 2:
+ length = MapleToInteger32(kv, args[4]);
+ VP = new std::vector<integer>;
+ VP->reserve(length);
+ for(i = 1; i <= length; i++) {
+ VP->push_back( MtoLI(kv, blank, MapleListSelect(kv, args[3], (M_INT) i)));
+ }
+
+ hashTable.insert(std::pair<int,void*>(key, VP));
+ break;
+
+
+ // In this case, the vector passed in was parsed into a two lists, the first containing
+ // the data entries, the second containing the indice in which this entry goes. Each of
+ // these entries are single word integers
+ case SmallV:
+
+ // Initialzie variables, get length and first indice
+ i = 1; j = 1;
+ length = MapleToInteger32(kv, args[5]);
+ L = MapleToInteger32(kv, args[6]);
+
+
+ // For speed, ensures only 1 memory management adjustment in creation
+ vP = new std::vector<long>;
+ vP->reserve(L);
+ for( ; i <= length; ++i) {
+
+ index = MapleToInteger32(kv, MapleListSelect(kv, args[3], i));
+
+ // All lists are passed back in sparse form, so just add zeros
+ // until you get to the correct index
+ while(j < index) {
+ vP->push_back(0L);
+ ++j;
+ }
+
+ // Add the nonzero entry
+ vP->push_back( (long) MapleToInteger32(kv,MapleListSelect(kv,args[4], i)));
+
+ // ++index
+ ++j;
+ }
+
+
+ // Now populate the rest of V with 0's
+ for(i = index + 1 ; i <= L; ++i)
+ vP->push_back( 0L );
+
+ hashTable.insert(std::pair<int,void*>(key, vP));
+ break;
+
+ // Multi-word integer case. As above, 2 sparse lists are passed in. The first contains
+ // all the non-zero entries. The second contains the indice of each element.
+ case LargeV:
+
+ i = 1; j = 1;
+ length = MapleToInteger32(kv,args[5]);
+ L = MapleToInteger32(kv, args[6]);
+
+ VP = new std::vector<integer>;
+ VP->reserve(L );
+ for( ; i <= length; ++i ) {
+
+ index = MapleToInteger32(kv, MapleListSelect(kv, args[3], i));
+
+
+ while(j < index) {
+ VP->push_back( integer(0) );
+ ++j;
+ }
+
+ // Add a nonzero entry
+ VP->push_back( MtoLI(kv, blank, MapleListSelect(kv,args[4], i) ));
+
+ ++j;
+ // ++index :-)
+ index = MapleToInteger32(kv,MapleListSelect(kv,args[3],i));
+ }
+
+ for( ; i <= L; ++i)
+ VP->push_back( integer(0) );
+
+
+ hashTable.insert(std::pair<int,void*>(key, VP));
+ break;
+
+ // In case a weird action is performed, just bail out
+ default:
+ MapleRaiseError(kv,"ERROR! Confused by request. Bailing out.");
+
+ }
+
+ // Corrects for list cases. Ensures that the "flag" variable is either 3 or 4, so it will
+ // properly correspond to the type settings in the type table
+ // insert the type in the typeTable
+ if(flag < 3) flag += 2;
+
+ typeTable.insert(std::pair<int,int>(key,flag));
+ return ToMapleNULL(kv);
+ }
+}
+
+
+
+
+
+
+/* killMatrix - BackEnd "destructor" for a Maple blackbox element that goes out of scope.
+ * Deletes the blackbox.
+ * Pre-condition: The object hashed to by key is an active BlackBox matrix.
+ * Post-condition: The BlackBox matrix hashed to by key is freed
+ */
+
+
+extern "C"
+{
+ ALGEB killMatrix(MKernelVector kv, ALGEB* args)
+ {
+ char err[] = "ERROR! Associated blackbox object does not exist!";
+ int key = MapleToInteger32(kv,args[1]), flag;
+
+ // Gets the type in question
+ std::map<int,int>::iterator i = typeTable.find(key);
+
+ // If the associated object code is not there, we have a problem. Bail.
+ if( i == typeTable.end() )
+ MapleRaiseError(kv,err);
+
+ // Otherwise we're good
+ flag = i->second;
+
+ // Erase the entry from the typeTable
+ typeTable.erase(key);
+
+ // hash out the pointer
+ std::map<int, void*>::iterator h_i = hashTable.find(key);
+ if( h_i != hashTable.end() ) {
+
+ switch( flag ) { // Free the data, whatever it is
+ case BlackBoxi:{
+ TriplesBBi* ptr = (TriplesBBi*) h_i->second;
+ delete ptr;
+ }
+ break;
+
+ case BlackBoxI: {
+ TriplesBBI* ptr = (TriplesBBI*) h_i->second;
+ delete ptr;
+ }
+ break;
+
+ }
+
+ // remove the pointer and bail
+ hashTable.erase(key);
+ }
+
+ return ToMapleNULL(kv);
+ }
+}
+
+
+
+
+
+
+/* killVector - Backend "destructor" for a linbox vector object in Maple. Takes as input a key to the
+ * data. Frees up dynamic memory and removes the object from the hash tables
+ * Pre-Condition: key is a key to a valid vector object
+ * Post-Condition: Dynamic memory is freed and the object is removed from the hash tables.
+ */
+
+extern "C"
+{
+ ALGEB killVector(MKernelVector kv, ALGEB* args)
+ {
+ // Gets the key
+ int key = MapleToInteger32(kv, args[1]), flag;
+ char err[] = "ERROR! Associated Vector object does not exist!";
+
+ // Checks to see if the object is there. If not, bail
+ std::map<int,int>::iterator f_i = typeTable.find(key);
+ if( f_i == typeTable.end() )
+ MapleRaiseError( kv, err);
+
+ // We're good otherwise
+ flag = f_i->second;
+
+ // In case the flag is there but the data isn't
+ typeTable.erase(key);
+
+ // Get ahold of the data
+ std::map<int,void*>::iterator h_i = hashTable.find(key);
+ if( h_i != hashTable.end() ) {
+
+ // Switch according to the vector type, small or large
+ switch( flag) {
+
+ case SmallV: {
+ Vectorl* ptr = (Vectorl*) h_i->second;
+ delete ptr;
+ }
+ break;
+
+ case LargeV: {
+ VectorI* ptr = (VectorI*) h_i->second;
+ delete ptr;
+ }
+ break;
+
+ }
+
+ hashTable.erase(key);
+ }
+
+ // Do nothing if it isn't in there
+ return ToMapleNULL(kv);
+ }
+}
+
+
+
+
+
+
+
+/* getMatrix - Returns an rtable object initialized with the data from the blackbox. This is a bit
+ * of a hack, as the differences between Maple versions becomes an issue. There are two methods:
+ * 1) (if using Maple 7) use string tools to build a string that embodies the proper command to
+ * declare an rtable object, and invoke this command with the MapleEvalStatement() function, or
+ * 2) use Maple's RTable API to create a new RTable object (this works in Maple 8, and I'm
+ * presuming Maple 6 and 5. Special thanks to tech support at Maple Soft for informing me that in
+ * maple 7, the RTableCreate() function has been disabled).
+ * Pre-Condition: The key provided by the call hashes to a valid BlackBox object
+ * Post-Condition: An RTable object initialized with the entries of the Black Box is returned to Maple
+ */
+
+extern "C"
+{
+ ALGEB getMatrix(MKernelVector kv, ALGEB* args)
+ {
+ // Get the key
+ int key = MapleToInteger32(kv,args[1]), flag;
+ char err[] = "ERROR! The associated BlackBox object does not exist!";
+ M_INT index[2], bound[4];
+ RTableData d;
+ ALGEB rtable, blank;
+ RTableSettings s;
+ std::vector<size_t> Row, Col;
+ std::vector<size_t>::const_iterator r_i, c_i;
+ char MapleStatement[100] = "rtable(1..";
+
+
+ // Get the data type of the blackbox
+ std::map<int,int>::iterator f_i = typeTable.find(key);
+ if( f_i == typeTable.end() ) // In case the blackbox isn't there
+ MapleRaiseError(kv,err);
+ flag = f_i->second; // Otherwise, get the blackbox type
+
+ // Check that the data is there
+ std::map<int,void*>::iterator h_i = hashTable.find(key);
+ if(h_i != hashTable.end() ) {
+
+ // Switch according to mode - regular or "special fix" mode
+ switch( MapleToInteger32(kv, args[3])) {
+
+ case 1: // This is the Maple 7 case, "special fix" mode
+ // Use the EvalMapleStatement() to call the rtable constructor in the
+ // Maple environment
+
+ // Switch according to the type
+ switch(flag) {
+ case BlackBoxi:{ // For single word entry matrices
+
+ // Extract the necessary data
+ TriplesBBi* BB = (TriplesBBi*) h_i->second;
+ Vectorl Data = BB->getData();
+ Row = BB->getRows();
+ Col = BB->getCols();
+ Vectorl::const_iterator d_i;
+
+ // Builds the statement that will be used in the Maple 7 callback
+
+ sprintf(MapleStatement + strlen(MapleStatement), "%d", BB->rowdim() );
+ strcat(MapleStatement, ",1..");
+
+ sprintf(MapleStatement + strlen(MapleStatement), "%d", BB->coldim() );
+ strcat(MapleStatement, ", subtype=Matrix, storage=sparse);");
+
+ // Perform the callback
+ rtable = kv->evalMapleStatement(MapleStatement);
+
+ // Insert each non-zero entry
+ for(d_i = Data.begin(), r_i = Row.begin(), c_i = Col.begin(); r_i != Row.end(); ++d_i, ++c_i, ++r_i) {
+ index[0] = *r_i; index[1] = *c_i;
+ d.dag = ToMapleInteger(kv, *d_i); // d is a union, dag is the
+ // ALGEB union field
+ RTableAssign(kv, rtable, index, d);
+ }
+ }
+ break;
+
+ case BlackBoxI: { // For multi-word size matrix types
+ TriplesBBI* BB = (TriplesBBI*) h_i->second;
+ VectorI Data = BB->getData();
+ VectorI::const_iterator d_i;
+
+ // Build and execute the Maple callback
+ sprintf(MapleStatement + strlen(MapleStatement), "%d", BB->rowdim() );
+ strcat(MapleStatement, ", 1..");
+ sprintf(MapleStatement + strlen(MapleStatement), "%d", BB->coldim() );
+ strcat(MapleStatement, ", subtype=Matrix, storage=sparse);");
+ rtable = kv->evalMapleStatement(MapleStatement);
+
+ for(d_i = Data.begin(), r_i = Row.begin(), c_i = Col.begin(); r_i != Row.end(); ++d_i, ++r_i, ++c_i) {
+ index[0] = *r_i; index[1] = *c_i;
+
+ // * Okay, here's how this line works. Basically,
+ // * in order to set the entries of this RTable to
+ // * multi-precision integers, I have to first use my own conversion
+ // * method, LiToM, to convert the integer entry to a ALGEB structure,
+ // * then do a callback into Maple that calls the ExToM procedure,
+ // * which converts the results of LiToM into a Maple multi-precision
+ // * integer. At the moment, this is the best idea I've got as to
+ // * how to convert a GMP integer into a Maple representation in one shot.
+ // *
+
+ d.dag = EvalMapleProc(kv,args[2],1,LiToM(kv, *d_i, blank));
+ RTableAssign(kv, rtable, index, d);
+ }
+ }
+ break;
+
+ // In this case the object is not a BlackBox type
+ default:
+ MapleRaiseError(kv,err);
+ break;
+ }
+ break;
+
+ case 2: // Okay, here is the normal case.
+ // Use RTableCreate to create a Maple rtable object
+
+ kv->rtableGetDefaults(&s);
+ // Get default settings - set datatype to Maple,
+ // DAGTAG to anything
+
+ s.subtype = RTABLE_MATRIX; // Subtype set to Matrix
+ s.storage = RTABLE_SPARSE; // Storage set to sparse
+ s.num_dimensions = 2; // What do you think this means :-)
+ bound[0] = bound[2] = 1; // Set the lower bounds of each dimension to 0, which for maple is 1
+
+ switch(flag) { // Switch on data type
+
+ case BlackBoxi:{ // word size entry Matrix
+ TriplesBBi* BB = (TriplesBBi*) h_i->second;
+ Vectorl Data = BB->getData();
+ Row = BB->getRows();
+ Col = BB->getCols();
+ Vectorl::const_iterator d_i;
+
+ bound[1] = BB->rowdim();
+ bound[3] = BB->coldim();
+ rtable = kv->rtableCreate(&s, NULL, bound); // This is the RTableCreate function, it's
+ // just the one that works
+
+ // Assign all the non-zero rows
+ for( d_i = Data.begin(), r_i = Row.begin(), c_i = Col.begin(); r_i != Row.end(); ++d_i, ++c_i, ++r_i) {
+ index[0] = *r_i; index[1] = *c_i;
+ d.dag = ToMapleInteger(kv, *d_i); // d is a union, dag is the
+ // ALGEB union field
+ RTableAssign(kv, rtable, index, d);
+ }
+ }
+ break;
+
+ case BlackBoxI: { // For multi-word entry Matrices
+ TriplesBBI* BB = (TriplesBBI*) h_i->second;
+ VectorI Data = BB->getData();
+
+ // Setup the Create() call
+ VectorI::const_iterator d_i;
+ Row = BB->getRows();
+ Col = BB->getCols();
+ bound[1] = BB->rowdim();
+ bound[3] = BB->coldim();
+ rtable = kv->rtableCreate(&s, NULL, bound); // Create an empty RTable
+
+ // Populate the RTable using the callback method described below
+ for(d_i = Data.begin(), r_i = Row.begin(), c_i = Col.begin(); r_i != Row.end(); ++d_i, ++r_i, ++c_i) {
+ index[0] = *r_i; index[1] = *c_i;
+
+ // * Okay, here's how this line works. Basically,
+ // * in order to set the entries of this RTable to
+ // * multi-precision integers, I have to first use my own conversion
+ // * method, LiToM, to convert the integer entry to a ALGEB structure,
+ // * then do a callback into Maple that calls the ExToM procedure,
+ // * which converts the results of LiToM into a Maple multi-precision
+ // * integer. At the moment, this is the best idea I've got as to
+ // * how to convert a GMP integer into a Maple representation in one shot.
+
+ d.dag = EvalMapleProc(kv,args[2],1,LiToM(kv, *d_i, blank));
+ RTableAssign(kv, rtable, index, d);
+ }
+ }
+ break;
+ }
+ }
+ }
+ else
+ MapleRaiseError(kv,err);
+
+ return rtable;
+ }
+}
+
+
+
+
+
+/* getVector - Returns a Maple vector initalized with the data from the LinBox vector. As above,
+ * is a hack in order to support two differing versions in Maple. Normally, would use the RTableCreate()
+ * function to properly create the Vector, but in Maple7 this isn't supported. The code is essentially
+ * the same as above, accept that we are building a vector rather than a Matrix
+ * Pre-Condition: the key provided hashes to a viable vector object in the hashTable
+ * Post-Condition: A properly initalized vector object is returned to maple
+ */
+
+extern "C"
+{
+ ALGEB getVector(MKernelVector kv, ALGEB* args)
+ {
+ // Get the key, declare variables
+ int key = MapleToInteger32(kv,args[1]), flag;
+ char err[] = "ERROR! The associated Vector object does not exist!";
+ M_INT index, bound[2];
+ RTableData d;
+ RTableSettings s;
+ ALGEB rtable, blank;
+ char MapleStatement[100] = "rtable(1..";
+
+
+ // Check to see if the object pointed to by key is in the type table. If not, panic
+ std::map<int,int>::iterator f_i = typeTable.find(key);
+ if(f_i == typeTable.end() ) {
+ MapleRaiseError(kv, err);
+ }
+
+ // Otherwise, we have our object
+ flag = f_i->second;
+
+ // Get a pointer to the actual data
+ std::map<int,void*>::iterator h_i = hashTable.find(key);
+ if(h_i != hashTable.end() ) {
+
+ // Diverge over whether we are using maple 7 or 8 ( and 5 & 6)
+ // in Maple, arg 3 is a flag indicating which method to use
+ switch( MapleToInteger32(kv, args[3])) {
+
+ // In this case, Maple 7 is being used, we have to construct a call using "EvalMapleStatement()"
+ // to call the RTable constructor
+ case 1:
+
+ switch(flag) {
+ case SmallV:{
+ // Get the vector
+ Vectorl* V = (Vectorl*) h_i->second;
+ Vectorl::const_iterator V_i;
+
+ // Create the Maple object
+ sprintf(MapleStatement + strlen(MapleStatement), "%d", V->size() );
+ strcat(MapleStatement, ", subtype=Vector[column], storage=sparse)");
+ rtable = kv->evalMapleStatement(MapleStatement);
+
+ // populate the Maple vector w/ the entries from V above
+ for(index = 1, V_i = V->begin(); V_i != V->end(); ++V_i, ++index) {
+ d.dag = ToMapleInteger(kv, *V_i); // d is a union, dag is the
+ // ALGEB union field
+ RTableAssign(kv, rtable, &index, d);
+ }
+ }
+ break;
+
+ case LargeV: {
+ // This part works the same way as above
+ VectorI* V = (VectorI*) h_i->second;
+ VectorI::const_iterator V_i;
+ sprintf(MapleStatement + strlen(MapleStatement), "%d", V->size() );
+ strcat(MapleStatement, ",subtype=Vector[column], storage=sparse)");
+ rtable = kv->evalMapleStatement(MapleStatement);
+
+ // Use maple callback to call the procedure from Maple that translates a gmp integer
+ // into a large maple integer. Then put this into the Maple vector
+ for(index = 1, V_i = V->begin(); V_i != V->end(); ++V_i, ++index) {
+
+ /* Okay, here's how this line works. Basically,
+ * in order to set the entries of this RTable to
+ * multi-precision integers, I have to first use my own conversion
+ * method, LiToM, to convert the integer entry to a ALGEB structure,
+ * then do a callback into Maple that calls the ExToM procedure,
+ * which converts the results of LiToM into a Maple multi-precision
+ * integer. At the moment, this is the best idea I've got as to
+ * how to convert a GMP integer into a Maple representation in one shot.
+ */
+
+ d.dag = EvalMapleProc(kv,args[2],1,LiToM(kv, *V_i, blank));
+ RTableAssign(kv, rtable, &index, d);
+ }
+ }
+ break;
+
+ default:
+ MapleRaiseError(kv, err);
+ break;
+ }
+ break;
+
+ // In this case, use the simpler RTableCreate function, rather than building a string
+ // that must be parsed by maple
+
+ case 2:
+
+ kv->rtableGetDefaults(&s); // Get default settings - set datatype to Maple,
+ // DAGTAG to anything
+ s.subtype = 2; // Subtype set to column vector
+ s.storage = 4; // Storage set to rectangular
+ s.num_dimensions = 1; // What do you think this means :-)
+ bound[0] = 1; // Set the lower bounds of each dimension to 0
+
+ switch(flag) {// Switch on data type of vector
+ case SmallV:{ // single word integer entry vector
+ Vectorl* V = (Vectorl*) h_i->second;
+ Vectorl::const_iterator V_i;
+ bound[1] = V->size();
+ rtable = kv->rtableCreate(&s, NULL, bound); // Create the Maple vector
+
+ for(index = 1, V_i = V->begin(); V_i != V->end(); ++V_i, ++index) {
+ d.dag = ToMapleInteger(kv, *V_i); // d is a union, dag is the
+ // ALGEB union field
+ RTableAssign(kv, rtable, &index, d);
+ }
+ }
+ break;
+
+ case LargeV: { // Same as above for multi-word integer entry vector
+ VectorI* V = (VectorI*) h_i->second;
+ VectorI::const_iterator V_i;
+ bound[1] = V->size();
+ rtable = kv->rtableCreate(&s, NULL, bound);
+
+ for(index = 1, V_i = V->begin(); V_i != V->end(); ++V_i, ++index) {
+
+
+ /* Okay, here's how this line works. Basically,
+ * in order to set the entries of this RTable to
+ * multi-precision integers, I have to first use my own conversion
+ * method, LiToM, to convert the integer entry to a ALGEB structure,
+ * then do a callback into Maple that calls the ExToM procedure,
+ * which converts the results of LiToM into a Maple multi-precision
+ * integer. At the moment, this is the best idea I've got as to
+ * how to convert a GMP integer into a Maple representation in one shot.
+ */
+
+ d.dag = EvalMapleProc(kv,args[2],1,LiToM(kv, *V_i, blank));
+ RTableAssign(kv, rtable, &index, d);
+ }
+ }
+ break;
+
+ default:
+ MapleRaiseError(kv, err);
+ break;
+ }
+ break; // breaks case 2.
+ // This was causing a wicked error :-)
+
+
+ default:
+ MapleRaiseError(kv, err);
+ break;
+
+ }
+ }
+ else {
+ MapleRaiseError(kv, err);
+ }
+
+ return rtable;
+ }
+}
+
+
+
+
+
+
+/* apply - Application function, Takes a Blackbox A and Vector X and performs the apply Ax.
+ * There's alot of code here that essentially leads to simply calling the BlackBox's apply routine,
+ * but there is alot that can go wrong with this call.
+ * Pre-Condition: BlackBox & Vector objects exist in the hashtable; Blackbox data-type can handle
+ * size of vector (ie - not trying to apply a large entry vector to a small entry Matrix
+ * Post-Condition: New Vector is produced, put into hash table for future calls, access key returned
+ * to Maple
+ */
+
+extern "C"
+{
+ ALGEB apply(MKernelVector kv, ALGEB* args)
+ {
+ // There are probably a million better random number generators, but for the moment I use this one
+ int BBKey = MapleToInteger32(kv,args[1]), VKey = MapleToInteger32(kv,args[2]), bflag, vflag, nKey;
+ VectorI *tempIV, newV;
+ Vectorl *tempiV, *vp;
+ char MisMatchErr[] = "ERROR! The Vector elements are not in the field of the Matrix!";
+ char BBnoFind[] = "ERROR! The associated Blackbox object does not exist!";
+ char VectnoFind[] = "ERROR! The associated Vector object does not exist!";
+
+ std::map<int,int>::iterator f_i;
+ std::map<int, void*>::iterator h_i;
+
+ // Get the random key from Maple
+ nKey = MapleToInteger32(kv, args[3]);
+
+ // Hash out the blackbox type
+ f_i = typeTable.find(BBKey);
+ if( f_i == typeTable.end() )
+ MapleRaiseError(kv, BBnoFind);
+ else
+ bflag = f_i->second;
+
+ // Hash out the vector type
+ f_i = typeTable.find(VKey);
+ if( f_i == typeTable.end() )
+ MapleRaiseError(kv, VectnoFind);
+ else
+ vflag = f_i->second;
+
+ // check that there isn't a type mismatch
+ if( bflag == BlackBoxi && vflag == LargeV)
+ // If this comes up, it means we have a large int vector, and a small int blackbox. Bad
+ MapleRaiseError(kv, MisMatchErr);
+ else if( bflag == BlackBoxI && vflag == SmallV) {
+
+ // If this comes up, it means we have a small int vector, and a large int blackbox. Not fatal.
+ h_i = hashTable.find(BBKey);
+ if( h_i == hashTable.end() )
+ MapleRaiseError(kv, BBnoFind);
+ TriplesBBI* BB = (TriplesBBI*) h_i->second;
+
+ h_i = hashTable.find(VKey);
+ if(h_i == hashTable.end() )
+ MapleRaiseError(kv, VectnoFind);
+
+ vp = (Vectorl*) h_i->second;
+
+ // Converts the small vector into a large vector
+ // Note, the reserve ensures there will only be at most one reallocation neccessary
+ newV.reserve(vp->size() );
+ for(Vectorl::iterator i = vp->begin(); i != vp->end(); ++i)
+ newV.push_back(integer(*i));
+
+ // Puts tempIV on the stack, so that it will persist. Also, set the correct size
+ tempIV = new VectorI;
+ tempIV->resize( BB->coldim() );
+
+ // Perform the apply
+ BB->apply( *tempIV, newV);
+ hashTable.insert(std::pair<int,void*>(nKey, tempIV));
+ typeTable.insert(std::pair<int,int>(nKey, LargeV));
+
+ }
+ else { // In this case, the types match (single word integer matrix w/ single word integer vector,
+ // or multi-word entry w/ multi-word entry. This simplifies the code a good bit
+
+ switch( bflag) {
+
+ case BlackBoxi: {
+
+ // Get the BlackBox
+ h_i = hashTable.find(BBKey);
+ if( h_i == hashTable.end() )
+ MapleRaiseError(kv, BBnoFind);
+ TriplesBBi* BB = (TriplesBBi*) h_i->second;
+
+ // Get the Vector
+ h_i = hashTable.find(VKey);
+ if( h_i == hashTable.end() )
+ MapleRaiseError(kv, VectnoFind);
+ vp = (Vectorl*) h_i->second;
+
+ // Perform the apply. Note, sets the temp vector's size to the columnar dimension
+ tempiV = new Vectorl;
+ tempiV->resize( BB->coldim() );
+ BB->apply(*tempiV, *vp);
+
+ // Hash the results
+ hashTable.insert(std::pair<int, void*>(nKey, tempiV));
+ typeTable.insert(std::pair<int,int>(nKey,SmallV));
+ }
+ break;
+
+ case BlackBoxI: {
+
+ // Get the BlackBox
+ h_i = hashTable.find(BBKey);
+ if( h_i == hashTable.end() )
+ MapleRaiseError(kv, BBnoFind );
+ TriplesBBI* BB = (TriplesBBI*) h_i->second;
+
+ // Get the vector
+ h_i = hashTable.find(VKey);
+ if( h_i == hashTable.end() )
+ MapleRaiseError(kv, VectnoFind );
+ VectorI* Vp = (VectorI*) h_i->second;
+
+ // Perform the apply
+ tempIV = new VectorI;
+ tempIV->resize( BB->coldim() );
+ BB->apply( *tempIV, *Vp);
+
+ // Hash in the results
+ hashTable.insert(std::pair<int,void*>(nKey, tempIV));
+ typeTable.insert(std::pair<int,int>(nKey,LargeV));
+ }
+ break;
+ }
+ }
+
+ // If you get to this point, something has been hashed in, so return the key
+ return ToMapleInteger(kv, (long) nKey);
+ }
+}
+
+
+
+
+/* applyT - Application function. Takes a Blackbox A and Vector X and performs the transpose apply,
+ * Atx. There's alot of code here that essentially leads to simply calling the BlackBox's apply routine,
+ * but there is alot that can go wrong with this call.
+ * Pre-Condition: BlackBox & Vector objects exist in the hashtable; Blackbox data-type can handle
+ * size of vector (ie - not trying to apply a large entry vector to a small entry Matrix
+ * Post-Condition: New Vector is produced, put into hash table for future calls, access key returned
+ * to Maple
+ */
+
+extern "C"
+{
+ ALGEB applyT(MKernelVector kv, ALGEB* args)
+ {
+
+ int BBKey = MapleToInteger32(kv,args[1]), VKey = MapleToInteger32(kv,args[2]), bflag, vflag, nKey;
+ char misMatchErr[] = "ERROR! Vector not in field of blackbox!";
+ char BBnoFindErr[] = "ERROR! The associated blackbox object does not exist!";
+ char VectNoFindErr[] = "ERROR! The associated vector object does not exist!";
+ VectorI *tempIV, newV;
+ Vectorl *tempiV, *vp;
+
+ std::map<int,int>::iterator f_i;
+ std::map<int, void*>::iterator h_i;
+
+
+ // Creates the new key
+ nKey = MapleToInteger32(kv, args[3]);
+
+ // Hash out the blackbox type
+ f_i = typeTable.find(BBKey);
+ if( f_i == typeTable.end() )
+ MapleRaiseError(kv,BBnoFindErr);
+ else
+ bflag = f_i->second;
+
+ // Hash out the vector type
+ f_i = typeTable.find(VKey);
+ if( f_i == typeTable.end() )
+ MapleRaiseError(kv,VectNoFindErr);
+ else
+ vflag = f_i->second;
+
+ // check that there isn't a type mismatch
+ if( bflag == BlackBoxi && vflag == LargeV)
+ // If this comes up, it means we have a large int vector, and a small int blackbox. Bad
+ MapleRaiseError(kv, misMatchErr);
+ else if( bflag == BlackBoxI && vflag == SmallV) {
+
+ // If this comes up, it means we have a small int vector, and a large int blackbox. Not fatal.
+
+
+ // Bail if data can't be found
+ h_i = hashTable.find(BBKey);
+ if( h_i == hashTable.end() )
+ MapleRaiseError(kv, BBnoFindErr);
+ TriplesBBI* BB = (TriplesBBI*) h_i->second;
+
+ h_i = hashTable.find(VKey);
+ if(h_i == hashTable.end() )
+ MapleRaiseError(kv, VectNoFindErr);
+
+ // Build a large entry vector and populate it with the converted data from the small entry vector
+ vp = (Vectorl*) h_i->second;
+ newV.reserve( vp->size() );
+ for(Vectorl::iterator i = vp->begin(); i != vp->end(); ++i)
+ newV.push_back(integer(*i));
+
+ // Puts tempIV on the stack, so that it will persist
+ tempIV = new VectorI;
+ tempIV->resize( BB->rowdim() );
+
+ // Perform the apply
+ BB->applyTranspose( *tempIV, newV);
+ hashTable.insert(std::pair<int,void*>(nKey, tempIV));
+ typeTable.insert(std::pair<int,int>(nKey, LargeV));
+
+ }
+ else { // For types that match (small Blackbox w/ small Vector or large blackbox w/ large vector)
+
+ switch( bflag) {
+
+ case BlackBoxi: {
+
+ // Get the BlackBox
+ h_i = hashTable.find(BBKey);
+ if( h_i == hashTable.end() )
+ MapleRaiseError(kv, BBnoFindErr);
+ TriplesBBi* BB = (TriplesBBi*) h_i->second;
+
+ // Get the Vector
+ h_i = hashTable.find(VKey);
+ if( h_i == hashTable.end() )
+ MapleRaiseError(kv, VectNoFindErr);
+ vp = (Vectorl*) h_i->second;
+
+ // Perform the apply
+ tempiV = new Vectorl;
+ tempiV->resize( BB->rowdim() );
+ BB->applyTranspose( *tempiV, *vp);
+
+ // Hash the results
+ hashTable.insert(std::pair<int, void*>(nKey, tempiV));
+ typeTable.insert(std::pair<int,int>(nKey,SmallV));
+ }
+ break;
+
+ case BlackBoxI: {
+
+ // Get the BlackBox
+ h_i = hashTable.find(BBKey);
+ if( h_i == hashTable.end() )
+ MapleRaiseError(kv, BBnoFindErr);
+ TriplesBBI* BB = (TriplesBBI*) h_i->second;
+
+ // Get the vector
+ h_i = hashTable.find(VKey);
+ if( h_i == hashTable.end() )
+ MapleRaiseError(kv, VectNoFindErr);
+ VectorI* Vp = (VectorI*) h_i->second;
+
+ // Perform the apply
+ tempIV = new VectorI;
+ tempIV->resize( BB->rowdim() );
+ BB->applyTranspose( *tempIV, *Vp);
+
+ // Hash in the results
+ hashTable.insert(std::pair<int,void*>(nKey, tempIV));
+ typeTable.insert(std::pair<int,int>(nKey,LargeV));
+ }
+ break;
+ }
+ }
+
+ // If you get to this point, something has been hashed in, so return the key
+ return ToMapleInteger(kv, (long) nKey);
+ }
+}
+
+
+
+
+
+/* rank - one of the three main "solution" functions, computes the rank of a BlackBox in the hash table
+ * Rank is computed using the rank function from the linbox repository
+ * Pre-Condition: key provided hashes to a valid blackbox object
+ * Post-Condition: the rank is returned to maple as an int
+ */
+
+extern "C"
+{
+ ALGEB rank(MKernelVector kv, ALGEB* args)
+ {
+ int key = MapleToInteger32(kv,args[1]), flag;
+ unsigned long result;
+ char err[] = "ERROR! Associated blackbox object does not exist!";
+ TriplesBBi* BBi;
+ TriplesBBI* BBI;
+
+ std::map<int,int>::iterator f_i = typeTable.find(key);
+ std::map<int,void*>::iterator h_i;
+
+ if(f_i == typeTable.end() )
+ MapleRaiseError(kv,err);
+ else
+ flag = f_i->second;
+
+
+ h_i = hashTable.find(key);
+ if( h_i != hashTable.end() ) {
+ switch( flag ) {
+ case BlackBoxi:
+ BBi = (TriplesBBi*) h_i->second;
+ return ToMapleInteger(kv, LinBox::rank(result, *BBi, BBi->field() ) ); // <- actual computation starts
+ break; // here :-)
+
+ case BlackBoxI:
+ BBI = (TriplesBBI*) h_i->second;
+ return ToMapleInteger(kv,LinBox::rank(result, *BBI, BBI->field() ));
+ break;
+ }
+ }
+ else
+ MapleRaiseError(kv,err);
+ }
+}
+
+
+/* det - Another major "application" function, this computes the determinant of the blackbox mod the
+ * prime using the LinBox determinant methods, of which I know very little. Look at the
+ * documentation in the solutions directory for more details.
+ * Pre-condition: Key hashes to a valid BlackBox object
+ * Post-condition: The modular determinant of the blackbox is returned as a maple integer
+ */
+
+extern "C"
+{
+ ALGEB det(MKernelVector kv, ALGEB* args)
+ {
+ char err[] = "ERROR! Associated blackbox object does not exist!";
+ int key = MapleToInteger32(kv,args[1]), flag;
+ std::map<int,int>::iterator f_i;
+ std::map<int,void*>::iterator h_i;
+ long resulti;
+ integer resultI;
+ ALGEB blank;
+ TriplesBBi *BBi;
+ TriplesBBI *BBI;
+
+
+ // Get the blackbox
+ f_i = typeTable.find(key);
+ if( f_i == typeTable.end() )
+ MapleRaiseError(kv,err);
+ else
+ flag = f_i->second;
+
+ // If it's there
+ h_i = hashTable.find(key);
+ if( h_i != hashTable.end() ) {
+
+ switch( flag ) { // switch on the type
+ case BlackBoxi:
+ BBi = (TriplesBBi*) h_i->second;
+ return ToMapleInteger(kv, LinBox::det(resulti, *BBi, BBi->field() ) );
+ break;
+
+ case BlackBoxI:
+ BBI = (TriplesBBI*) h_i->second;
+ return LiToM(kv, LinBox::det(resultI, *BBI, BBI->field() ), blank);
+
+ break;
+ }
+ }
+ else
+ MapleRaiseError(kv, err);
+ }
+}
+
+
+
+
+
+/* minpoly - Compute the minimal polynomial of the BlackBox matrix using linbox's minpoly solution.
+ * I have no clue how it works, just that it does. This one is slightly more complicated than the
+ * other two above
+ * Pre-condition: Key maps to a valid BlackBox object in the hashTable
+ * Post-condition: A Maple list of the polynomial coefficients, lowest degree first, is returned
+ */
+
+extern "C"
+{
+ALGEB minpoly(MKernelVector kv, ALGEB* args)
+ {
+ int i;
+ ALGEB retlist, blank;
+ char err[] = "ERROR! Associated blackbox object does not exist!";
+ int key = MapleToInteger32(kv,args[1]), flag;
+ std::map<int,int>::iterator f_i;
+ std::map<int,void*>::iterator h_i;
+
+ // Get the data from the hash table
+ f_i = typeTable.find(key);
+ if( f_i == typeTable.end() )
+ MapleRaiseError(kv,err);
+ else
+ flag = f_i->second;
+
+
+ h_i = hashTable.find(key);
+ if(h_i != hashTable.end() ) { // We've got data
+ switch( flag ) {
+ // Getting the minimal polynomial is rather complicated, so both instances of this code were
+ // wrapped up inside a block, to cut down at the clutter at the top of this function.
+ // First declares a vector of the proper type and casts the pointer. Then computes the minimal
+ // polynomial. It then builds the proper Maple list structure for this application.
+
+
+ case BlackBoxi: {
+ Vectorl mpreturn;
+ Vectorl::iterator mp_i;
+ TriplesBBi* BB = (TriplesBBi*) h_i->second;
+ LinBox::minpoly( mpreturn, *BB, BB->field() );
+ retlist = MapleListAlloc(kv, mpreturn.size() );
+ for(i = 1, mp_i = mpreturn.begin(); mp_i != mpreturn.end(); ++mp_i, ++i)
+ MapleListAssign(kv, retlist, i, ToMapleInteger(kv, *mp_i));
+ }
+ break;
+
+ case BlackBoxI: {
+ VectorI mpreturn;
+ VectorI::iterator mp_i;
+ TriplesBBI* BB = (TriplesBBI*) h_i->second;
+ LinBox::minpoly( mpreturn, *BB, BB->field() );
+ retlist = MapleListAlloc(kv, mpreturn.size());
+ for(i = 1, mp_i = mpreturn.begin(); mp_i != mpreturn.end(); ++mp_i, ++i)
+ MapleListAssign(kv, retlist, i, LiToM(kv, *mp_i, blank));
+
+ }
+ break;
+ }
+ }
+ else
+ MapleRaiseError(kv,err);
+
+ return retlist;
+
+ }
+}
+
+/* LiToM - Converts from a GMP integer to a Maple list of word-size chunks
+ * these chunks are passed back into Maple and converted by into maple represented integers
+ * Pre-Condition: In is an initialized GMP number, Out can be initialized (or re-initialized)
+ * Post-Condition: Out is an initalized maple integer containing the value of In
+ */
+
+ALGEB & LiToM(MKernelVector & kv, const integer & In, ALGEB & Out)
+{
+ // If we get lucky, this thing fits in one word, which is good, so we just
+ // straight convert it
+ if(In.size() == 1)
+ Out = ToMapleInteger(kv, Integer2long(In) );
+ else {
+ // Otherwise, create a list, and for each entry, add a word-sized chunk.
+ Out = MapleListAlloc(kv, In.size() );
+ for(size_t i = 1; i <= In.size(); ++i)
+ MapleListAssign(kv,Out,i,ToMapleInteger(kv,In[i-1]));
+ }
+
+ // Return the result for redundancy
+ return Out;
+}
+
+/* MtoLI - conversion between long integers passed from maple into gmp integers
+ * Uses Horners method.
+ * Pre-Condition: Out is un-initialized (or can be re-initialized), In is either an int or a
+ * list
+ * Post-Condition: Out contains a GMP version of In.
+ */
+
+
+integer & MtoLI(MKernelVector & kv, integer & Out, const ALGEB &In)
+{
+ // We just need 1 base. By default, Maple breaks all integers of a certain size up into
+ // mod 10000 chunks. The chunks are put into a maple list, and then passed into code
+ static integer base(10000);
+ int num, i;
+
+ // This could be an int
+ if( IsMapleInteger32(kv,In) )
+ // if so, just convert it
+ Out = integer(MapleToInteger32(kv, In));
+ else {
+ // else, get the number of chunks, and convert the highest chunk of In
+ num = MapleToInteger32(kv, MapleListSelect(kv, In, 1) );
+ Out = integer(MapleToInteger32(kv, MapleListSelect(kv,In, num) ) );
+
+ for(i = num - 1; i > 1; --i) {
+ // For each additional chunk, multiply Out by the base, and add in the new chunk
+ Out *= base;
+ Out += MapleToInteger32(kv, MapleListSelect( kv, In, i));
+ }
+ }
+
+ // redundant
+ return Out;
+}
+
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+
diff --git a/interfaces/maple-old/lbmaple.mpl.head b/interfaces/maple-old/lbmaple.mpl.head
new file mode 100644
index 0000000..ccb46ac
--- /dev/null
+++ b/interfaces/maple-old/lbmaple.mpl.head
@@ -0,0 +1,11 @@
+module LinBox()
+ local create, destroy, lbXapply, lbXapplyT, lbXinitBB, lbXinitV,
+ lbXrank, lbXdet, lbXmp, lbXssolve, lbXstart1, lbXstart2,
+ lbXend, lbXgetMatrix, lbXkillMatrix, lbXgetVector, lbXkillVector, lbXgetEntryVector, lbXgetEntryMatrix, ExToMap, MapToEx, libname, ObjKeyCount;
+ export LinBoxBB, LBrank, LBdet, LBminpoly, LBapply, LBapplyTranspose, LinBoxV; # LBDiag, LBSolve;
+ option package, load=create, unload=destroy;
+ description "Maple interface to LinBox methods & functions";
+
+ create := proc()
+ global `type/LinBoxBB`, `type/LinBoxV`;
+ libname :=
\ No newline at end of file
diff --git a/interfaces/maple-old/lbmaple.mpl.tail b/interfaces/maple-old/lbmaple.mpl.tail
new file mode 100644
index 0000000..393eb02
--- /dev/null
+++ b/interfaces/maple-old/lbmaple.mpl.tail
@@ -0,0 +1,377 @@
+ lbXend := define_external('End', MAPLE,LIB=libname);
+ lbXapply := define_external('apply', MAPLE,LIB=libname);
+ lbXapplyT := define_external('applyT', MAPLE,LIB=libname);
+ lbXinitV := define_external('initV', MAPLE,LIB=libname);
+# lbXdiag := define_external('diag', MAPLE,LIB=libname);
+ lbXinitBB := define_external('initBB', MAPLE,LIB=libname);
+ lbXrank := define_external('rank',MAPLE,LIB=libname);
+ lbXdet := define_external('det', MAPLE,LIB=libname);
+ lbXmp := define_external('minpoly', MAPLE,LIB=libname);
+# lbXssolve := define_external('ssolve', MAPLE,LIB=libname);
+ lbXgetMatrix := define_external('getMatrix', MAPLE,LIB=libname);
+ lbXgetVector := define_external('getVector',MAPLE,LIB=libname);
+ lbXkillMatrix := define_external('killMatrix', MAPLE,LIB=libname);
+ lbXkillVector := define_external('killVector', MAPLE,LIB=libname);
+# lbXgetEntryVector := define_external('getEntryVector',MAPLE,LIB=libname);
+# lbXgetEntryMatrix := define_external('getEntryMatrix',MAPLE,LIB=libname);
+ `type/LinBoxBB` := `module`(getMatrix) ;
+ `type/LinBoxV` := `module`(getVector) ;
+ ObjKeyCount := 0;
+ end proc;
+
+ create();
+
+ destroy := proc()
+ lbXend();
+ end proc;
+
+ ExToMap := proc()
+ local b0, s, r, A, i;
+ if type(args[1], integer) then
+ args[1];
+ else
+ A := args[1];
+ s := A[nops(A)];
+ b0 := 2^kernelopts(wordsize);
+ for i from nops(A) - 1 to 1 do
+ s := s * b0 + A[i];
+ od;
+ s
+ fi;
+ end proc;
+
+ MapToEx := proc(num::integer)
+ local r;
+ if num < kernelopts(maximmediate) then
+ num;
+ else
+ r := [disassemble(addressof(num))];
+ subsop(1=nops(r),r);
+ fi;
+ end proc;
+
+ LinBoxBB := proc( )
+ local k, f, D, R, C, rows, cols, s, nnz, M, p, check;
+
+ if type(args[1], posint) then
+ if nargs = 1 then
+ k := args[1];
+ elif type(args[2], posint) and type(args[3], posint) and type(args[4], procedure) then
+ p := args[1];
+ rows := args[2];
+ cols := args[3];
+ ObjKeyCount := ObjKeyCount + 1;
+ k := ObjKeyCount;
+ check := x -> evalb(rhs(x) <> 0);
+ s := select(check, {seq(seq( (i,j)=apply(args[4],i,j), i=1..rows),j=1..cols)} ); # Pick out all the non-zero's
+ nnz := nops(s);
+ D := [seq(rhs(s[i]),i=1..nnz)];
+ R := [seq(lhs(s[i])[1], i=1..nnz)];
+ C := [seq(lhs(s[i])[2], i=1..nnz)];
+ lbXinitBB(2, k, p, D, R, C, rows, cols, nnz);
+
+ elif type(args[2], Matrix) then
+ ObjKeyCount := ObjKeyCount + 1;
+ k := ObjKeyCount;
+ M := args[2]; p := args[1];
+ # if p = 0 then
+ # ... insert special code for integer ring
+ # computation, as opposed to finite field computation
+ if op(3,M)[1] = 'datatype=integer[4]' then
+ lbXinitBB(1, k, p, M);
+ elif p < kernelopts(maximmediate) then
+ s := op(2,M);
+ nnz := nops(s);
+ rows := op(1,M)[1]; cols := op(1,M)[2];
+ D := [seq(rhs(s[i]),i=1..nnz)];
+ R := [seq(lhs(s[i])[1],i=1..nnz)];
+ C := [seq(lhs(s[i])[2],i=1..nnz)];
+ lbXinitBB(2, k, p, D, R, C, rows, cols, nnz);
+ else
+ s := op(2,M);
+ nnz := nops(s);
+ rows := op(1,M)[1]; cols := op(1,M)[2];
+ D := [seq(MapToEx(rhs(s[i])),i=1..nnz)];
+ R := [seq(lhs(s[i])[1],i=1..nnz)];
+ C := [seq(lhs(s[i])[2],i=1..nnz)];
+ lbXinitBB(3, k, MapToEx(p), D, R, C, rows, cols, nnz);
+ fi;
+ else
+ error "Wrong number or type of parameters!";
+ fi;
+ else
+ error "Wrong number or type of parameters!";
+ fi;
+
+ module()
+ local destruct;
+ export getMatrix, key; # getEntry
+ option unload = destruct;
+ description "Maple Container for LinBox blackbox";
+
+ key := k;
+
+ getMatrix := proc()
+ # Implents difference between Maple 7 & 6(8)
+ # Many thanks to MapleSoft for pointing out the need for a workaround
+ # for Maple v7
+ # If you are running v7, run the "exceptional" function
+ # otherwise, run the normal function
+ if `Maple 7` = substring(kernelopts(version),1..7) then lbXgetMatrix(k, ExToMap , 1);
+ else lbXgetMatrix(k, ExToMap , 2);
+ fi;
+ end proc;
+
+# getEntry := proc(i::posint, j::posint)
+# lbXgetEntryMatrix(key, i, j);
+# end proc;
+
+ destruct := proc()
+ lbXkillMatrix(k):
+ end proc;
+
+ end module
+
+ end proc;
+
+ LinBoxV := proc()
+ local k, index, L, mode, V, p, t, i, f;
+ if type(args[1], posint) then # two possibilities: Vector from
+ # a existing vector (key), or
+ # build one from a proc
+ if nargs = 1 then
+ k := args[1];
+ elif type(args[2], 'procedure') then
+
+
+ ObjKeyCount := ObjKeyCount + 1;
+ k := ObjKeyCount;
+ mode := 1;
+ f := args[2];
+ p := proc(n)
+ local r;
+ r := MapToEx(apply(f, n));
+ if type(r, list) then mode := 2; fi;
+ r
+ end proc;
+
+
+
+ L := [seq(p(t), t=1..args[1])];
+ lbXinitV(mode, k, L, args[1]);
+ else
+ error "Wrong number or type of parameters!";
+ end if;
+ elif type(args[1], Vector) then # No key, we're translating from a vector
+ ObjKeyCount := ObjKeyCount + 1;
+ k := ObjKeyCount;
+ V := args[1];
+ p := proc(n)
+ local r;
+ r := MapToEx(rhs(n));
+ if type(r,list) then mode := 4; fi;
+ r
+ end proc;
+
+ mode := 3;
+ t := sort(op(table(op(2,V))), (x,y)->( lhs(x) < lhs(y) ) );
+ index := map(lhs, t);
+ L := map(p, t);
+ lbXinitV(mode, k, index, L, nops(index), op(1,V) );
+
+ elif type( args[1], list) then
+ ObjKeyCount := ObjKeyCount + 1;
+
+ k := ObjKeyCount;
+ lbXinitV(1,k, args[1], nops(args[1]) );
+
+
+ else
+ error "Wrong number or type of parameters!";
+ fi;
+
+ module()
+ local destruct;
+ export getVector, key; #getEntry
+ description "Maple container for LinBox Vector";
+ option unload = destruct;
+
+ key := k;
+
+ destruct := proc()
+ lbXkillVector(key);
+ end proc;
+
+# getEntry := proc(i::posint)
+# lbXgetEntryVector(key, i);
+# end proc;
+
+ getVector := proc()
+ # Once again, split b/c of difference between Maple 7 and 6(8)
+ # For maple 7, run the special getMatrix function
+ # otherwise, run the normal function
+ if `Maple 7` = substring(kernelopts(version),1..7) then lbXgetVector(key, ExToMap, 1);
+ else lbXgetVector(key, ExToMap, 2);
+ fi;
+ end proc;
+
+ end module
+ end proc;
+
+
+ LBapply := proc()
+ local M, V, R, f;
+
+ # if Matrix is not LinBox BB, make it so
+ if type(args[1], posint) and type(args[2], Matrix) then
+ if type(args[3], Vector) then
+ M := LinBoxBB(args[1], args[2]);
+ V := LinBoxV(args[3]);
+ f := 1;
+ elif type(args[3], LinBoxV) then
+ M := LinBoxBB(args[1], args[2]);
+ V := args[3];
+ f := 2;
+ else
+ error "Wrong number or type of parameters!";
+ fi;
+
+ elif type(args[1], LinBoxBB) then
+ M := args[1];
+ if type(args[2], Vector) then
+ V := LinBoxV(args[2]);
+ f := 1;
+ elif type(args[2], LinBoxV) then
+ V := args[2];
+ f := 2;
+ fi;
+ else
+ error "Wrong number or type of parameters!";
+ fi;
+
+
+ ObjKeyCount := ObjKeyCount + 1;
+
+ lbXapply(M:-key, V:-key, ObjKeyCount );
+
+ if f = 1 then # if the user sends the vector
+ # as a maple type, return
+ # as that type
+ R := LinBoxV(ObjKeyCount);
+ R:-getVector()
+ else
+ LinBoxV(ObjKeyCount)
+ end if;
+ end proc;
+
+ LBapplyTranspose := proc()
+ local M, V, R, f;
+
+ if type(args[1], posint) and type(args[2], Matrix) then
+ if type(args[3], Vector) then
+ M := LinBoxBB(args[1], args[2]);
+ V := LinBoxV(args[3]);
+ f := 1;
+ elif type(args[3], LinBoxV) then
+ M := LinBoxBB(args[1], args[2]);
+ V := args[3];
+ f := 2;
+ else
+ error "Wrong number or type of parameters!";
+ fi;
+ elif type(args[1], LinBoxBB) then
+ M := args[1];
+ if type(args[2], Vector) then
+ V := LinBoxV(args[2]);
+ f := 1;
+ elif type(args[2], LinBoxV) then
+ V := args[2];
+ f := 2;
+ else
+ error "Wrong number or type of parameters!";
+ fi;
+ else
+ error "Wrong number or type of paramters!";
+ fi;
+
+
+ ObjKeyCount := ObjKeyCount + 1;
+ lbXapplyT(M:-key, V:-key, ObjKeyCount );
+
+ if f = 1 then # if the user sends the vector
+ # as a maple type, return
+ # as that type
+ R := LinBoxV(ObjKeyCount);
+ R:-getVector();
+ else
+ LinBoxV(ObjKeyCount);
+ fi;
+ end proc;
+
+ LBrank := proc()
+ local M;
+ if type(args[1], LinBoxBB) then
+ M := args[1];
+ elif type(args[1], posint) and type(args[2], Matrix) then
+ M := LinBoxBB(args[1], args[2]);
+ else
+ error "Wrong number or type of parameters!";
+ fi;
+
+ lbXrank(M:-key);
+ end proc;
+
+ LBdet := proc()
+ local M;
+ if type(args[1], LinBoxBB) then
+ M := args[1];
+ elif type(args[1], posint) and type(args[2], Matrix) then
+ M := LinBoxBB(args[1], args[2]);
+ else
+ error "Wrong number or type of parameters!";
+ fi;
+
+ lbXdet(M:-key);
+ end proc;
+
+ # minpoly function. If no variable name is given, then a list
+ # containg the coefficients in sorted order, from degree lowest to
+ # highest is returned (note this is a dense coefficient vector, there
+ # are zeros here
+
+ LBminpoly := proc()
+ local L, i, x, M;
+ if type(args[1], LinBoxBB) then
+ M := args[1];
+ if nargs = 1 then
+ x := true;
+ elif nargs = 2 and type(args[2],name) then
+ x := args[2];
+ else
+ error "Wrong number or type of parameters!";
+ fi;
+ elif type(args[1],posint) and type(args[2], Matrix) then
+ M := LinBoxBB(args[1], args[2]);
+ if nargs = 2 then
+ x := true;
+ elif nargs = 3 and type(args[3], name) then
+ x := args[3];
+ else
+ error "Wrong number or type of parameters!";
+ fi;
+ else
+ error "Wrong number or type of parameters!";
+ fi;
+
+ L := lbXmp(M:-key);
+ L := [seq(ExToMap(L[i]),i=1..nops(L))];
+ if type(x, boolean) then
+ L
+ else
+ add(ExToMap(L[i])*x^(i-1),i=1..nops(L))
+ end if;
+ end proc;
+
+end module:
+
+with(LinBox);
diff --git a/interfaces/maple/Makefile.am b/interfaces/maple/Makefile.am
index d23032c..b68cf9c 100644
--- a/interfaces/maple/Makefile.am
+++ b/interfaces/maple/Makefile.am
@@ -24,13 +24,13 @@ pkgincludesubdir=$(includedir)/interfaces/maple/new
AM_CPPFLAGS =-I$(top_srcdir) -I. -I../../linbox
-AM_CXXFLAGS = @DEFAULT_CFLAGS@ -DDISABLE_COMMENTATOR -I../driver $(GMP_CFLAGS) $(NTL_CFLAGS) $(ATLAS_CFLAGS) $(FFLAS_FFPACK_CFLAGS) $(MAPLE_CFLAGS) $(GIVARO_CFLAGS)
+AM_CXXFLAGS = @DEFAULT_CFLAGS@ -DDISABLE_COMMENTATOR -I../driver $(NTL_CFLAGS) $(MAPLE_CFLAGS)
lib_LTLIBRARIES=liblbmaple.la
liblbmaple_la_SOURCES= lb-maple.C
-liblbmaple_la_LDFLAGS=$(GIVARO_LIBS) $(GMP_LIBS) $(NTL_LIBS) $(BLAS_LIBS) $(MAPLE_LIBS) $(top_srcdir)/interfaces/driver/liblbdriver.la -Wl,-zmuldefs $(LDFLAGS)
+liblbmaple_la_LDFLAGS= $(NTL_LIBS) $(MAPLE_LIBS) $(top_srcdir)/interfaces/driver/liblbdriver.la -Wl,-zmuldefs $(LDFLAGS)
pkginclude_HEADERS =lb-maple.h lb-maple-utilities.h
diff --git a/interfaces/maple/Makefile.in b/interfaces/maple/Makefile.in
deleted file mode 100644
index eea2fcb..0000000
--- a/interfaces/maple/Makefile.in
+++ /dev/null
@@ -1,665 +0,0 @@
-# Makefile.in generated by automake 1.11.5 from Makefile.am.
-# @configure_input@
-
-# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software
-# Foundation, Inc.
-# This Makefile.in is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
-# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
-# PARTICULAR PURPOSE.
-
- at SET_MAKE@
-
-# Copyright (c) 2010 the LinBox group
-# ========LICENCE========
-# This file is part of the library LinBox.
-#
-# LinBox is free software: you can redistribute it and/or modify
-# it under the terms of the GNU Lesser General Public
-# License as published by the Free Software Foundation; either
-# version 2.1 of the License, or (at your option) any later version.
-#
-# This library 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
-# Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public
-# License along with this library; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
-# ========LICENCE========
-
-
-VPATH = @srcdir@
-am__make_dryrun = \
- { \
- am__dry=no; \
- case $$MAKEFLAGS in \
- *\\[\ \ ]*) \
- echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \
- | grep '^AM OK$$' >/dev/null || am__dry=yes;; \
- *) \
- for am__flg in $$MAKEFLAGS; do \
- case $$am__flg in \
- *=*|--*) ;; \
- *n*) am__dry=yes; break;; \
- esac; \
- done;; \
- esac; \
- test $$am__dry = yes; \
- }
-pkgdatadir = $(datadir)/@PACKAGE@
-pkgincludedir = $(includedir)/@PACKAGE@
-pkglibdir = $(libdir)/@PACKAGE@
-pkglibexecdir = $(libexecdir)/@PACKAGE@
-am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
-install_sh_DATA = $(install_sh) -c -m 644
-install_sh_PROGRAM = $(install_sh) -c
-install_sh_SCRIPT = $(install_sh) -c
-INSTALL_HEADER = $(INSTALL_DATA)
-transform = $(program_transform_name)
-NORMAL_INSTALL = :
-PRE_INSTALL = :
-POST_INSTALL = :
-NORMAL_UNINSTALL = :
-PRE_UNINSTALL = :
-POST_UNINSTALL = :
-build_triplet = @build@
-host_triplet = @host@
-subdir = interfaces/maple
-DIST_COMMON = $(am__pkginclude_HEADERS_DIST) $(srcdir)/Makefile.am \
- $(srcdir)/Makefile.in
-ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-am__aclocal_m4_deps = $(top_srcdir)/macros/aclocal-include.m4 \
- $(top_srcdir)/macros/config-header.m4 \
- $(top_srcdir)/macros/debug.m4 \
- $(top_srcdir)/macros/expat-check.m4 \
- $(top_srcdir)/macros/fflas-ffpack-check.m4 \
- $(top_srcdir)/macros/fplll-check.m4 \
- $(top_srcdir)/macros/givaro-check.m4 \
- $(top_srcdir)/macros/gmp-check.m4 \
- $(top_srcdir)/macros/iml-check.m4 \
- $(top_srcdir)/macros/lapack-check.m4 \
- $(top_srcdir)/macros/libtool.m4 \
- $(top_srcdir)/macros/lidia-check.m4 \
- $(top_srcdir)/macros/linbox-benchmark.m4 \
- $(top_srcdir)/macros/linbox-doc.m4 \
- $(top_srcdir)/macros/linbox-misc.m4 \
- $(top_srcdir)/macros/linbox-opt.m4 \
- $(top_srcdir)/macros/ltoptions.m4 \
- $(top_srcdir)/macros/ltsugar.m4 \
- $(top_srcdir)/macros/ltversion.m4 \
- $(top_srcdir)/macros/lt~obsolete.m4 \
- $(top_srcdir)/macros/m4ri-check.m4 \
- $(top_srcdir)/macros/m4rie-check.m4 \
- $(top_srcdir)/macros/maple-check.m4 \
- $(top_srcdir)/macros/mpfr-check.m4 \
- $(top_srcdir)/macros/ntl-check.m4 \
- $(top_srcdir)/macros/saclib-check.m4 \
- $(top_srcdir)/macros/sage-check.m4 $(top_srcdir)/configure.ac
-am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
- $(ACLOCAL_M4)
-mkinstalldirs = $(install_sh) -d
-CONFIG_HEADER = $(top_builddir)/config.h
-CONFIG_CLEAN_FILES =
-CONFIG_CLEAN_VPATH_FILES =
-am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
-am__vpath_adj = case $$p in \
- $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
- *) f=$$p;; \
- esac;
-am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
-am__install_max = 40
-am__nobase_strip_setup = \
- srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
-am__nobase_strip = \
- for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
-am__nobase_list = $(am__nobase_strip_setup); \
- for p in $$list; do echo "$$p $$p"; done | \
- sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
- $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
- if (++n[$$2] == $(am__install_max)) \
- { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
- END { for (dir in files) print dir, files[dir] }'
-am__base_list = \
- sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
- sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
-am__uninstall_files_from_dir = { \
- test -z "$$files" \
- || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \
- || { echo " ( cd '$$dir' && rm -f" $$files ")"; \
- $(am__cd) "$$dir" && rm -f $$files; }; \
- }
-am__installdirs = "$(DESTDIR)$(libdir)" "$(DESTDIR)$(pkgincludedir)"
-LTLIBRARIES = $(lib_LTLIBRARIES)
-liblbmaple_la_LIBADD =
-am__liblbmaple_la_SOURCES_DIST = lb-maple.C
- at LINBOX_HAVE_MAPLE_TRUE@am_liblbmaple_la_OBJECTS = lb-maple.lo
-liblbmaple_la_OBJECTS = $(am_liblbmaple_la_OBJECTS)
-liblbmaple_la_LINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) \
- $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \
- $(CXXFLAGS) $(liblbmaple_la_LDFLAGS) $(LDFLAGS) -o $@
- at LINBOX_HAVE_MAPLE_TRUE@am_liblbmaple_la_rpath = -rpath $(libdir)
-DEFAULT_INCLUDES = -I. at am__isrc@ -I$(top_builddir)
-depcomp =
-am__depfiles_maybe =
-CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
- $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
-LTCXXCOMPILE = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
- --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
- $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
-CXXLD = $(CXX)
-CXXLINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
- --mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \
- $(LDFLAGS) -o $@
-SOURCES = $(liblbmaple_la_SOURCES)
-DIST_SOURCES = $(am__liblbmaple_la_SOURCES_DIST)
-am__can_run_installinfo = \
- case $$AM_UPDATE_INFO_DIR in \
- n|no|NO) false;; \
- *) (install-info --version) >/dev/null 2>&1;; \
- esac
-am__pkginclude_HEADERS_DIST = lb-maple.h lb-maple-utilities.h
-HEADERS = $(pkginclude_HEADERS)
-ETAGS = etags
-CTAGS = ctags
-DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
-ACLOCAL = @ACLOCAL@
-AMTAR = @AMTAR@
-AR = @AR@
-AUTOCONF = @AUTOCONF@
-AUTOHEADER = @AUTOHEADER@
-AUTOMAKE = @AUTOMAKE@
-AWK = @AWK@
-BLAS_CFLAGS = @BLAS_CFLAGS@
-BLAS_LIBS = @BLAS_LIBS@
-CC = @CC@
-CCNAM = @CCNAM@
-CFLAGS = @CFLAGS@
-CPPFLAGS = @CPPFLAGS@
-CXX = @CXX@
-CXXCPP = @CXXCPP@
-CXXFLAGS = @CXXFLAGS@
-CYGPATH_W = @CYGPATH_W@
-DBG = @DBG@
-DEBUG_CFLAGS = @DEBUG_CFLAGS@
-DEFAULT_CFLAGS = @DEFAULT_CFLAGS@
-DEFS = @DEFS@
-DLLTOOL = @DLLTOOL@
-DSYMUTIL = @DSYMUTIL@
-DUMPBIN = @DUMPBIN@
-ECHO_C = @ECHO_C@
-ECHO_N = @ECHO_N@
-ECHO_T = @ECHO_T@
-EGREP = @EGREP@
-EXEEXT = @EXEEXT@
-EXPAT_CFLAGS = @EXPAT_CFLAGS@
-EXPAT_LIBS = @EXPAT_LIBS@
-FFLAS_FFPACK_CFLAGS = @FFLAS_FFPACK_CFLAGS@
-FFLAS_FFPACK_LIBS = @FFLAS_FFPACK_LIBS@
-FFLAS_FFPACK_LOC = @FFLAS_FFPACK_LOC@
-FGREP = @FGREP@
-FPLLL_CFLAGS = @FPLLL_CFLAGS@
-FPLLL_LIBS = @FPLLL_LIBS@
-GIVARO_CFLAGS = @GIVARO_CFLAGS@
-GIVARO_LIBS = @GIVARO_LIBS@
-GMP_CFLAGS = @GMP_CFLAGS@
-GMP_LIBS = @GMP_LIBS@
-GMP_VERSION = @GMP_VERSION@
-GREP = @GREP@
-IML_CFLAGS = @IML_CFLAGS@
-IML_LIBS = @IML_LIBS@
-INSTALL = @INSTALL@
-INSTALL_DATA = @INSTALL_DATA@
-INSTALL_PROGRAM = @INSTALL_PROGRAM@
-INSTALL_SCRIPT = @INSTALL_SCRIPT@
-INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
-LD = @LD@
-LDFLAGS = @LDFLAGS@
-LIBOBJS = @LIBOBJS@
-LIBS = @LIBS@
-LIBTOOL = @LIBTOOL@
-LIDIA_CFLAGS = @LIDIA_CFLAGS@
-LIDIA_LIBS = @LIDIA_LIBS@
-LINBOX_BENCH_PATH = @LINBOX_BENCH_PATH@
-LINBOX_DOC_PATH = @LINBOX_DOC_PATH@
-LIPO = @LIPO@
-LN_S = @LN_S@
-LTLIBOBJS = @LTLIBOBJS@
-M4RIE_CFLAGS = @M4RIE_CFLAGS@
-M4RIE_LIBS = @M4RIE_LIBS@
-M4RI_CFLAGS = @M4RI_CFLAGS@
-M4RI_LIBS = @M4RI_LIBS@
-MAINT = @MAINT@
-MAKEINFO = @MAKEINFO@
-MANIFEST_TOOL = @MANIFEST_TOOL@
-MAPLE_CFLAGS = @MAPLE_CFLAGS@
-MAPLE_HOME = @MAPLE_HOME@
-MAPLE_LIBS = @MAPLE_LIBS@
-MAPLE_VERSION = @MAPLE_VERSION@
-MKDIR_P = @MKDIR_P@
-MPFR_CFLAGS = @MPFR_CFLAGS@
-MPFR_LIBS = @MPFR_LIBS@
-NM = @NM@
-NMEDIT = @NMEDIT@
-NTL_CFLAGS = @NTL_CFLAGS@
-NTL_LIBS = @NTL_LIBS@
-OBJDUMP = @OBJDUMP@
-OBJEXT = @OBJEXT@
-OTOOL = @OTOOL@
-OTOOL64 = @OTOOL64@
-PACKAGE = @PACKAGE@
-PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
-PACKAGE_NAME = @PACKAGE_NAME@
-PACKAGE_STRING = @PACKAGE_STRING@
-PACKAGE_TARNAME = @PACKAGE_TARNAME@
-PACKAGE_URL = @PACKAGE_URL@
-PACKAGE_VERSION = @PACKAGE_VERSION@
-PATH_SEPARATOR = @PATH_SEPARATOR@
-PROF = @PROF@
-RANLIB = @RANLIB@
-RM = @RM@
-SACLIB_CFLAGS = @SACLIB_CFLAGS@
-SACLIB_LIBS = @SACLIB_LIBS@
-SED = @SED@
-SET_MAKE = @SET_MAKE@
-SHELL = @SHELL@
-STRIP = @STRIP@
-TESTS_CFLAGS = @TESTS_CFLAGS@
-VERSION = @VERSION@
-WARN = @WARN@
-abs_builddir = @abs_builddir@
-abs_srcdir = @abs_srcdir@
-abs_top_builddir = @abs_top_builddir@
-abs_top_srcdir = @abs_top_srcdir@
-ac_ct_AR = @ac_ct_AR@
-ac_ct_CC = @ac_ct_CC@
-ac_ct_CXX = @ac_ct_CXX@
-ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
-am__leading_dot = @am__leading_dot@
-am__tar = @am__tar@
-am__untar = @am__untar@
-bindir = @bindir@
-build = @build@
-build_alias = @build_alias@
-build_cpu = @build_cpu@
-build_os = @build_os@
-build_vendor = @build_vendor@
-builddir = @builddir@
-datadir = @datadir@
-datarootdir = @datarootdir@
-docdir = @docdir@
-dvidir = @dvidir@
-exec_prefix = @exec_prefix@
-host = @host@
-host_alias = @host_alias@
-host_cpu = @host_cpu@
-host_os = @host_os@
-host_vendor = @host_vendor@
-htmldir = @htmldir@
-includedir = @includedir@
-infodir = @infodir@
-install_sh = @install_sh@
-libdir = @libdir@
-libexecdir = @libexecdir@
-localedir = @localedir@
-localstatedir = @localstatedir@
-mandir = @mandir@
-mkdir_p = @mkdir_p@
-oldincludedir = @oldincludedir@
-pdfdir = @pdfdir@
-prefix = @prefix@
-program_transform_name = @program_transform_name@
-psdir = @psdir@
-sbindir = @sbindir@
-sharedstatedir = @sharedstatedir@
-srcdir = @srcdir@
-sysconfdir = @sysconfdir@
-target_alias = @target_alias@
-top_build_prefix = @top_build_prefix@
-top_builddir = @top_builddir@
-top_srcdir = @top_srcdir@
- at LINBOX_HAVE_MAPLE_TRUE@pkgincludesubdir = $(includedir)/interfaces/maple/new
- at LINBOX_HAVE_MAPLE_TRUE@AM_CPPFLAGS = -I$(top_srcdir) -I. -I../../linbox
- at LINBOX_HAVE_MAPLE_TRUE@AM_CXXFLAGS = @DEFAULT_CFLAGS@ -DDISABLE_COMMENTATOR -I../driver $(GMP_CFLAGS) $(NTL_CFLAGS) $(ATLAS_CFLAGS) $(FFLAS_FFPACK_CFLAGS) $(MAPLE_CFLAGS) $(GIVARO_CFLAGS)
- at LINBOX_HAVE_MAPLE_TRUE@lib_LTLIBRARIES = liblbmaple.la
- at LINBOX_HAVE_MAPLE_TRUE@liblbmaple_la_SOURCES = lb-maple.C
- at LINBOX_HAVE_MAPLE_TRUE@liblbmaple_la_LDFLAGS = $(GIVARO_LIBS) $(GMP_LIBS) $(NTL_LIBS) $(BLAS_LIBS) $(MAPLE_LIBS) $(top_srcdir)/interfaces/driver/liblbdriver.la -Wl,-zmuldefs $(LDFLAGS)
- at LINBOX_HAVE_MAPLE_TRUE@pkginclude_HEADERS = lb-maple.h lb-maple-utilities.h
-all: all-am
-
-.SUFFIXES:
-.SUFFIXES: .C .lo .o .obj
-$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps)
- @for dep in $?; do \
- case '$(am__configure_deps)' in \
- *$$dep*) \
- ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
- && { if test -f $@; then exit 0; else break; fi; }; \
- exit 1;; \
- esac; \
- done; \
- echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu --ignore-deps interfaces/maple/Makefile'; \
- $(am__cd) $(top_srcdir) && \
- $(AUTOMAKE) --gnu --ignore-deps interfaces/maple/Makefile
-.PRECIOUS: Makefile
-Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
- @case '$?' in \
- *config.status*) \
- cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
- *) \
- echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
- cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
- esac;
-
-$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
- cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-
-$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
- cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
- cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-$(am__aclocal_m4_deps):
-install-libLTLIBRARIES: $(lib_LTLIBRARIES)
- @$(NORMAL_INSTALL)
- @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \
- list2=; for p in $$list; do \
- if test -f $$p; then \
- list2="$$list2 $$p"; \
- else :; fi; \
- done; \
- test -z "$$list2" || { \
- echo " $(MKDIR_P) '$(DESTDIR)$(libdir)'"; \
- $(MKDIR_P) "$(DESTDIR)$(libdir)" || exit 1; \
- echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(libdir)'"; \
- $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(libdir)"; \
- }
-
-uninstall-libLTLIBRARIES:
- @$(NORMAL_UNINSTALL)
- @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \
- for p in $$list; do \
- $(am__strip_dir) \
- echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(libdir)/$$f'"; \
- $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(libdir)/$$f"; \
- done
-
-clean-libLTLIBRARIES:
- -test -z "$(lib_LTLIBRARIES)" || rm -f $(lib_LTLIBRARIES)
- @list='$(lib_LTLIBRARIES)'; for p in $$list; do \
- dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \
- test "$$dir" != "$$p" || dir=.; \
- echo "rm -f \"$${dir}/so_locations\""; \
- rm -f "$${dir}/so_locations"; \
- done
-liblbmaple.la: $(liblbmaple_la_OBJECTS) $(liblbmaple_la_DEPENDENCIES) $(EXTRA_liblbmaple_la_DEPENDENCIES)
- $(liblbmaple_la_LINK) $(am_liblbmaple_la_rpath) $(liblbmaple_la_OBJECTS) $(liblbmaple_la_LIBADD) $(LIBS)
-
-mostlyclean-compile:
- -rm -f *.$(OBJEXT)
-
-distclean-compile:
- -rm -f *.tab.c
-
-.C.o:
- $(CXXCOMPILE) -c -o $@ $<
-
-.C.obj:
- $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
-
-.C.lo:
- $(LTCXXCOMPILE) -c -o $@ $<
-
-mostlyclean-libtool:
- -rm -f *.lo
-
-clean-libtool:
- -rm -rf .libs _libs
-install-pkgincludeHEADERS: $(pkginclude_HEADERS)
- @$(NORMAL_INSTALL)
- @list='$(pkginclude_HEADERS)'; test -n "$(pkgincludedir)" || list=; \
- if test -n "$$list"; then \
- echo " $(MKDIR_P) '$(DESTDIR)$(pkgincludedir)'"; \
- $(MKDIR_P) "$(DESTDIR)$(pkgincludedir)" || exit 1; \
- fi; \
- for p in $$list; do \
- if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
- echo "$$d$$p"; \
- done | $(am__base_list) | \
- while read files; do \
- echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(pkgincludedir)'"; \
- $(INSTALL_HEADER) $$files "$(DESTDIR)$(pkgincludedir)" || exit $$?; \
- done
-
-uninstall-pkgincludeHEADERS:
- @$(NORMAL_UNINSTALL)
- @list='$(pkginclude_HEADERS)'; test -n "$(pkgincludedir)" || list=; \
- files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
- dir='$(DESTDIR)$(pkgincludedir)'; $(am__uninstall_files_from_dir)
-
-ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
- list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
- unique=`for i in $$list; do \
- if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
- done | \
- $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
- END { if (nonempty) { for (i in files) print i; }; }'`; \
- mkid -fID $$unique
-tags: TAGS
-
-TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
- $(TAGS_FILES) $(LISP)
- set x; \
- here=`pwd`; \
- list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
- unique=`for i in $$list; do \
- if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
- done | \
- $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
- END { if (nonempty) { for (i in files) print i; }; }'`; \
- shift; \
- if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
- test -n "$$unique" || unique=$$empty_fix; \
- if test $$# -gt 0; then \
- $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
- "$$@" $$unique; \
- else \
- $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
- $$unique; \
- fi; \
- fi
-ctags: CTAGS
-CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
- $(TAGS_FILES) $(LISP)
- list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
- unique=`for i in $$list; do \
- if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
- done | \
- $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
- END { if (nonempty) { for (i in files) print i; }; }'`; \
- test -z "$(CTAGS_ARGS)$$unique" \
- || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
- $$unique
-
-GTAGS:
- here=`$(am__cd) $(top_builddir) && pwd` \
- && $(am__cd) $(top_srcdir) \
- && gtags -i $(GTAGS_ARGS) "$$here"
-
-distclean-tags:
- -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
-
-distdir: $(DISTFILES)
- @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
- topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
- list='$(DISTFILES)'; \
- dist_files=`for file in $$list; do echo $$file; done | \
- sed -e "s|^$$srcdirstrip/||;t" \
- -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
- case $$dist_files in \
- */*) $(MKDIR_P) `echo "$$dist_files" | \
- sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
- sort -u` ;; \
- esac; \
- for file in $$dist_files; do \
- if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
- if test -d $$d/$$file; then \
- dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
- if test -d "$(distdir)/$$file"; then \
- find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
- fi; \
- if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
- cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
- find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
- fi; \
- cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
- else \
- test -f "$(distdir)/$$file" \
- || cp -p $$d/$$file "$(distdir)/$$file" \
- || exit 1; \
- fi; \
- done
-check-am: all-am
-check: check-am
-all-am: Makefile $(LTLIBRARIES) $(HEADERS)
-installdirs:
- for dir in "$(DESTDIR)$(libdir)" "$(DESTDIR)$(pkgincludedir)"; do \
- test -z "$$dir" || $(MKDIR_P) "$$dir"; \
- done
-install: install-am
-install-exec: install-exec-am
-install-data: install-data-am
-uninstall: uninstall-am
-
-install-am: all-am
- @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
-
-installcheck: installcheck-am
-install-strip:
- if test -z '$(STRIP)'; then \
- $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
- install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
- install; \
- else \
- $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
- install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
- "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
- fi
-mostlyclean-generic:
-
-clean-generic:
-
-distclean-generic:
- -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
- -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
-
-maintainer-clean-generic:
- @echo "This command is intended for maintainers to use"
- @echo "it deletes files that may require special tools to rebuild."
- at LINBOX_HAVE_MAPLE_FALSE@install-data-local:
- at LINBOX_HAVE_MAPLE_FALSE@install-data-hook:
-clean: clean-am
-
-clean-am: clean-generic clean-libLTLIBRARIES clean-libtool \
- mostlyclean-am
-
-distclean: distclean-am
- -rm -f Makefile
-distclean-am: clean-am distclean-compile distclean-generic \
- distclean-tags
-
-dvi: dvi-am
-
-dvi-am:
-
-html: html-am
-
-html-am:
-
-info: info-am
-
-info-am:
-
-install-data-am: install-data-local install-pkgincludeHEADERS
- @$(NORMAL_INSTALL)
- $(MAKE) $(AM_MAKEFLAGS) install-data-hook
-install-dvi: install-dvi-am
-
-install-dvi-am:
-
-install-exec-am: install-libLTLIBRARIES
-
-install-html: install-html-am
-
-install-html-am:
-
-install-info: install-info-am
-
-install-info-am:
-
-install-man:
-
-install-pdf: install-pdf-am
-
-install-pdf-am:
-
-install-ps: install-ps-am
-
-install-ps-am:
-
-installcheck-am:
-
-maintainer-clean: maintainer-clean-am
- -rm -f Makefile
-maintainer-clean-am: distclean-am maintainer-clean-generic
-
-mostlyclean: mostlyclean-am
-
-mostlyclean-am: mostlyclean-compile mostlyclean-generic \
- mostlyclean-libtool
-
-pdf: pdf-am
-
-pdf-am:
-
-ps: ps-am
-
-ps-am:
-
-uninstall-am: uninstall-libLTLIBRARIES uninstall-pkgincludeHEADERS
-
-.MAKE: install-am install-data-am install-strip
-
-.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \
- clean-libLTLIBRARIES clean-libtool ctags distclean \
- distclean-compile distclean-generic distclean-libtool \
- distclean-tags distdir dvi dvi-am html html-am info info-am \
- install install-am install-data install-data-am \
- install-data-hook install-data-local install-dvi \
- install-dvi-am install-exec install-exec-am install-html \
- install-html-am install-info install-info-am \
- install-libLTLIBRARIES install-man install-pdf install-pdf-am \
- install-pkgincludeHEADERS install-ps install-ps-am \
- install-strip installcheck installcheck-am installdirs \
- maintainer-clean maintainer-clean-generic mostlyclean \
- mostlyclean-compile mostlyclean-generic mostlyclean-libtool \
- pdf pdf-am ps ps-am tags uninstall uninstall-am \
- uninstall-libLTLIBRARIES uninstall-pkgincludeHEADERS
-
-
- at LINBOX_HAVE_MAPLE_TRUE@install-data-local:
- at LINBOX_HAVE_MAPLE_TRUE@ sh lb-maple-path.sh "$(libdir)/liblbmaple.so"
- at LINBOX_HAVE_MAPLE_TRUE@ $(INSTALL_DATA) lb-maple.mpl $(libdir)/lb-maple.mpl
-
- at LINBOX_HAVE_MAPLE_TRUE@install-data-hook:
- at LINBOX_HAVE_MAPLE_TRUE@ cd $(libdir) && \
- at LINBOX_HAVE_MAPLE_TRUE@ $(MAPLE_HOME)/bin/maple lb-maple.mpl 2>&1 > /dev/null
-
-# Tell versions [3.59,3.63) of GNU make to not export all variables.
-# Otherwise a system limit (for SysV at least) may be exceeded.
-.NOEXPORT:
diff --git a/interfaces/maple/lb-maple-path.pl b/interfaces/maple/lb-maple-path.pl
new file mode 100644
index 0000000..5df3c80
--- /dev/null
+++ b/interfaces/maple/lb-maple-path.pl
@@ -0,0 +1,4 @@
+#!/usr/bin/perl
+
+$sentence=
+s/lbpathvalue/lbpath:=$ARGV[1];
\ No newline at end of file
diff --git a/interfaces/maple/lb-maple-path.sh b/interfaces/maple/lb-maple-path.sh
new file mode 100644
index 0000000..062e309
--- /dev/null
+++ b/interfaces/maple/lb-maple-path.sh
@@ -0,0 +1,7 @@
+#!/usr/bin/sh
+
+if test -r "lb-maple.mpl.bak"; then
+ mv lb-maple.mpl.bak lb-maple.mpl
+fi
+
+sed -e "s|lbpathvalue|lbpath:=\"$1\";|" -i.bak lb-maple.mpl
\ No newline at end of file
diff --git a/interfaces/maple/lb-maple-utilities.h b/interfaces/maple/lb-maple-utilities.h
index e85cba1..b4bab2f 100644
--- a/interfaces/maple/lb-maple-utilities.h
+++ b/interfaces/maple/lb-maple-utilities.h
@@ -26,7 +26,7 @@
#ifndef __LINBOX_lb_maple_utilities_H
#define __LINBOX_lb_maple_utilities_H
-#include "linbox-config.h"
+#include "linbox/linbox-config.h"
#include <lb-driver.h>
extern "C" {
#include <gmp.h>
diff --git a/interfaces/maple/lb-maple.mpl.bak b/interfaces/maple/lb-maple.mpl.bak
new file mode 100755
index 0000000..91c8a4c
--- /dev/null
+++ b/interfaces/maple/lb-maple.mpl.bak
@@ -0,0 +1,320 @@
+LinBox:= module()
+ description "Maple interface for LinBox library version 1.0 by Pascal Giorgi (LinBox project - www.linal.org)";
+ local lbpath, lbInit, lbEnd, lbStart, lbStop:
+ export lbDeterminant, lbRank, lbMinpoly, lbCharpoly, lbSolve, Dev:
+ option package, load=lbInit, unload=lbEnd:
+
+ lbpathvalue
+
+ #############################################################
+ # Function to initialize LinBox driver and LinBox interface #
+ #############################################################
+ lbStart := define_external('lbStart' , MAPLE, LIB=lbpath);
+ lbStop := define_external('lbStop' , MAPLE, LIB=lbpath);
+
+
+ lbInit := proc() printf(" LinBox/Maple Interface Package beta version 1.0 \n by Pascal Giorgi (pascal.giorgi at univ-perp.fr)\n");
+ lbStart();
+ end proc;
+ lbEnd := proc() end proc;#lbStop();end proc;
+
+
+#####################################################################
+############# Definition of the low level submodule ################
+#####################################################################
+
+ Dev:= module()
+ description "low level interface for direct LinBox object manipulation";
+ local lbInit, lbEnd;
+ export lbDataInfo,lbStart, lbStop,
+ lbElement, lbDomain, lbBlackbox, lbVector,
+ lbSetPrimeField, lbSetRationalField, lbSetIntegerRing,
+ lbCopyBlackbox, lbBlackboxDimension, lbSetBlackboxAtRandom, lbRebindBlackbox, lbWriteBlackbox, lbSetBlackbox,
+ lbCopyVector, lbVectorDimension, lbSetVectorAtRandom, lbRebindVector, lbWriteVector, lbSetVector,
+ lbWritePolynomial,
+ lbDeterminant, lbRank, lbMinpoly, lbCharpoly, lbSolve,
+ lbConvertElement, lbConvertBlackbox, lbConvertVector, lbConvertPolynomial,
+ lbCopy, lbWrite, lbDimension, lbRebind, lbRandom:
+ option package, load=lbInit, unload=lbEnd:
+
+
+ #############################################################
+ # Function to initialize LinBox driver and LinBox interface #
+ #############################################################
+ lbStart := define_external('lbStart' , MAPLE, LIB=lbpath);
+ lbStop := define_external('lbStop' , MAPLE, LIB=lbpath);
+
+ ######################################################
+ # Function to get information from the LinBox driver #
+ ######################################################
+ lbDataInfo := define_external('lbDataInfo', MAPLE, LIB=lbpath);
+
+
+ ########################################
+ # Function to set the LinBox data type #
+ ########################################
+ lbSetPrimeField := define_external('lbSetPrimeField' , MAPLE, LIB=lbpath);
+ lbSetRationalField := define_external('lbSetRationalField' , MAPLE, LIB=lbpath);
+ lbSetIntegerRing := define_external('lbSetIntegerRing' , MAPLE, LIB=lbpath);
+ lbSetBlackbox := define_external('lbSetBlackbox' , MAPLE, LIB=lbpath);
+ lbSetVector := define_external('lbSetVector' , MAPLE, LIB=lbpath);
+
+
+ ###############################################
+ # Function to create LinBox object from Maple #
+ ###############################################
+ lbElement := define_external('lbCreateElement' , MAPLE, LIB=lbpath);
+ lbDomain := define_external('lbCreateDomain' , MAPLE, LIB=lbpath);
+ lbBlackbox := define_external('lbCreateBlackbox' , MAPLE, LIB=lbpath);
+ lbVector := define_external('lbCreateVector' , MAPLE, LIB=lbpath);
+
+
+ #######################################
+ # Function for LinBox blackbox object #
+ #######################################
+ lbCopyBlackbox := define_external('lbCopyBlackbox' , MAPLE, LIB=lbpath);
+ lbBlackboxDimension := define_external('lbGetBlackboxDimension' , MAPLE, LIB=lbpath);
+ lbSetBlackboxAtRandom := define_external('lbSetBlackboxAtRandom' , MAPLE, LIB=lbpath);
+ lbRebindBlackbox := define_external('lbRebindBlackbox' , MAPLE, LIB=lbpath);
+ lbWriteBlackbox := define_external('lbWriteBlackbox' , MAPLE, LIB=lbpath);
+
+
+ #####################################
+ # Function for LinBox vector object #
+ #####################################
+ lbCopyVector := define_external('lbCopyVector' , MAPLE, LIB=lbpath);
+ lbVectorDimension := define_external('lbGetVectorDimension' , MAPLE, LIB=lbpath);
+ lbSetVectorAtRandom := define_external('lbSetVectorAtRandom' , MAPLE, LIB=lbpath);
+ lbRebindVector := define_external('lbRebindVector' , MAPLE, LIB=lbpath);
+ lbWriteVector := define_external('lbWriteVector' , MAPLE, LIB=lbpath);
+
+ #########################################
+ # Function for LinBox polynomial object #
+ #########################################
+ lbWritePolynomial := define_external('lbWritePolynomial' , MAPLE, LIB=lbpath);
+
+ ##############################
+ # Available LinBox solutions #
+ ##############################
+ lbDeterminant := define_external('lbDeterminant' , MAPLE, LIB=lbpath);
+ lbRank := define_external('lbRank' , MAPLE, LIB=lbpath);
+ lbMinpoly := define_external('lbMinpoly' , MAPLE, LIB=lbpath);
+ lbCharpoly := define_external('lbCharpoly' , MAPLE, LIB=lbpath);
+ lbSolve := define_external('lbSolve' , MAPLE, LIB=lbpath);
+
+
+ ##################################################
+ # Conversion from LinBox object to Maple Objects #
+ ##################################################
+ lbConvertElement := define_external('lbConvertElement' , MAPLE, LIB=lbpath);
+ lbConvertBlackbox := define_external('lbConvertBlackbox' , MAPLE, LIB=lbpath);
+ lbConvertVector := define_external('lbConvertVector' , MAPLE, LIB=lbpath);
+ lbConvertPolynomial := define_external('lbConvertPolynomial' , MAPLE, LIB=lbpath);
+
+ ####################
+ # Higher level API #
+ ####################
+ lbCopy := define_external('lbCopy' , MAPLE, LIB=lbpath);
+ lbWrite := define_external('lbWrite' , MAPLE, LIB=lbpath);
+ lbDimension := define_external('lbDimension' , MAPLE, LIB=lbpath);
+ lbRebind := define_external('lbRebind' , MAPLE, LIB=lbpath);
+ lbRandom := define_external('lbRandom' , MAPLE, LIB=lbpath);
+
+ end module:
+
+##############################################################
+############# end of the low level submodule ################
+##############################################################
+
+
+###################################################################
+############# definition of the high level module ################
+###################################################################
+
+
+ ################################################
+ # Determinant computation from a Maple Matrix #
+ ################################################
+ lbDeterminant := proc()
+ local d, A, det, t;
+ if (type(args[1], integer)) then
+ if (type(args[2], Matrix)) then
+ t := time();
+ A := Dev:-lbBlackbox(args[1], args[2]);
+ t:= time()-t;
+ else
+ error("invalid argument",args[2], "must be a Matrix");
+ end if;
+ elif (type(args[1], Matrix)) then
+ t := time();
+ A := Dev:-lbBlackbox(args[1]);
+ t:= time()-t;
+ else
+ error("invalid argument",args[1], "must be a Matrix");
+ end if;
+ d := Dev:-lbDeterminant(A);
+ det := Dev:-lbConvertElement(d);
+ if (printlevel>1) then
+ print("conversion time:",t);
+ end if;
+ return det;
+ end;
+
+ ########################################
+ # Rank computation from a Maple matrix #
+ ########################################
+ lbRank := proc()
+ local A,t;
+ if (type(args[1], integer)) then
+ if (type(args[2], Matrix)) then
+ t := time();
+ A:=Dev:-lbBlackbox(args[1], args[2]);
+ t:=time()-t;
+ else
+ error("invalid argument",args[2], "must be a Matrix");
+ end if;
+ elif (type(args[1], Matrix)) then
+ t := time();
+ A := Dev:-lbBlackbox(args[1]);
+ t:=time()-t;
+ else
+ error("invalid argument",args[1], "must be a Matrix");
+ end if;
+ if (printlevel>1) then
+ print("conversion time:",t);
+ end if;
+ return Dev:-lbRank(A);
+ end;
+
+ ######################################################
+ # Minimal polynomial computation from a Maple matrix #
+ ######################################################
+ lbMinpoly := proc()
+ local A, p, symb,t;
+ if (type(args[1], integer)) then
+ if (type(args[2], Matrix)) then
+ if (type(args[3], name)) then
+ t:=time();
+ A:=Dev:-lbBlackbox(args[1], args[2]);
+ t:=time()-t;
+ symb:=args[3];
+ else
+ error("invalid argument",args[3], "must be a name");
+ end if;
+ else
+ error("invalid argument",args[2], "must be a Matrix");
+ end if;
+ elif (type(args[1], Matrix)) then
+ if (type(args[2], name)) then
+ t:=time();
+ A := Dev:-lbBlackbox(args[1]);
+ t:=time()-t;
+ symb:=args[2];
+ else
+ error("invalid argument",args[2], "must be a name");
+ end if
+ else
+ error("invalid argument",args[1], "must be a Matrix");
+ end if;
+ p:= Dev:-lbMinpoly(A);
+ if (printlevel>1) then
+ print("conversion time:",t);
+ end if;
+ return Dev:-lbConvertPolynomial(p,symb);
+ end;
+
+ #############################################################
+ # Characteristic polynomial computation from a Maple matrix #
+ #############################################################
+ lbCharpoly := proc()
+ local A, p, symb,t;
+ if (type(args[1], integer)) then
+ if (type(args[2], Matrix)) then
+ if (type(args[3], name)) then
+ t:=time();
+ A:=Dev:-lbBlackbox(args[1], args[2]);
+ t:=time()-t;
+ symb:=args[3];
+ else
+ error("invalid argument",args[3], "must be a name");
+ end if;
+ else
+ error("invalid argument",args[2], "must be a Matrix");
+ end if;
+ elif (type(args[1], Matrix)) then
+ if (type(args[2], name)) then
+ t:=time();
+ A := Dev:-lbBlackbox(args[1]);
+ t:=time()-t;
+ symb:=args[2];
+ else
+ error("invalid argument",args[2], "must be a name");
+ end if
+ else
+ error("invalid argument",args[1], "must be a Matrix");
+ end if;
+ p:= Dev:-lbCharpoly(A);
+ if (printlevel>1) then
+ print("conversion time:",t);
+ end if;
+ return Dev:-lbConvertPolynomial(p,symb);
+ end;
+
+ #############################################################
+ # Linear system solving from Maple matrix and Maple Vector #
+ #############################################################
+ lbSolve := proc()
+ local A,b,x,y,t;
+ if (type(args[1], integer)) then
+ if (type(args[2], Matrix)) then
+ if (type(args[3], Vector)) then
+ t:=time();
+ A:=Dev:-lbBlackbox(args[1], args[2]);
+ b:=Dev:-lbVector(args[1], args[3]);
+ t:=time()-t;
+ else
+ error("invalid argument",args[3], "must be a Vector");
+ fi;
+ else
+ error("invalid argument",args[2], "must be a Matrix");
+ fi;
+ elif (type(args[1], Matrix)) then
+ if (type(args[2], Vector)) then
+ t:=time();
+ A:=Dev:-lbBlackbox(args[1]);
+ b:=Dev:-lbVector(args[2]);
+ t:=time()-t;
+ else
+ error("invalid argument",args[2], "must be a Vector");
+ fi;
+ else
+ error("invalid argument",args[1], "must be a Matrix");
+ fi;
+ x:= Dev:-lbSolve(A,b);
+ y:=Dev:-lbConvertVector(x);
+ if (printlevel>1) then
+ print("conversion time:",t);
+ end if;
+ return y;
+ end;
+end module:
+
+
+save_linbox:=proc(repo)
+ global savelibname,libname:
+ if (FileTools[Exists](cat(repo,"/maple.lib"))) then
+ fremove(cat(repo,"/maple.lib"));
+ fremove(cat(repo,"/maple.ind"));
+# fremove(cat(repo,"/maple.hdb"));
+ rmdir(repo);
+ fi:
+ if (not(FileTools[Exists](repo))) then mkdir(repo);fi:
+ march( 'create',repo, 1000 ):
+ savelibname := repo: libname := savelibname, libname:
+ savelib('LinBox'):
+end:
+
+save_linbox("LinBoxMaple");
+
+
+
diff --git a/interfaces/maple/linbox-demonstration-good.mw b/interfaces/maple/linbox-demonstration-good.mw
new file mode 100755
index 0000000..e93cb5b
--- /dev/null
+++ b/interfaces/maple/linbox-demonstration-good.mw
@@ -0,0 +1,2248 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<Worksheet>
+<Version major="7" minor="0"/>
+<Label-Scheme value="2" prefix=""/>
+<View-Properties presentation="false"></View-Properties>
+<MapleNet-Properties warnlevel="3" longdelim="true" plotoptions="" echo="1" errorcursor="false" elisiontermsthreshold="10000" elisiontermsbefore="100" errorbreak="1" prettyprint="3" prompt="> " latexwidth="6.0" useclientjvm="true" ansi="false" screenheight="25" labelwidth="20" plotdevice="inline" typesetting="standard" displayprecision="-1" indentamount="4" elisiondigitsthreshold="10000" quiet="false" plotoutput="terminal" rtablesize="10" preplot="" showassumed="1" plotdriver="openviz [...]
+<Styles><Font name="Heading 4" background="[255,255,255]" bold="false" executable="false" family="Serif" foreground="[0,0,0]" italic="true" opaque="false" readonly="false" size="12" subscript="false" superscript="false" underline="false"/>
+<Font name="Ordered List 5" background="[255,255,255]" bold="false" executable="false" family="Times New Roman" foreground="[0,0,0]" italic="false" opaque="false" readonly="false" size="12" subscript="false" superscript="false" underline="false"/>
+<Font name="Ordered List 1" background="[255,255,255]" bold="false" executable="false" family="Times New Roman" foreground="[0,0,0]" italic="false" opaque="false" readonly="false" size="12" subscript="false" superscript="false" underline="false"/>
+<Font name="Text Output" background="[255,255,255]" bold="false" executable="false" family="Monospaced" foreground="[0,0,255]" italic="false" opaque="false" readonly="true" size="12" subscript="false" superscript="false" underline="false"/>
+<Font name="Bullet Item" background="[255,255,255]" bold="false" executable="false" family="Times New Roman" foreground="[0,0,0]" italic="false" opaque="false" readonly="false" size="12" subscript="false" superscript="false" underline="false"/>
+<Font name="Author" background="[255,255,255]" bold="false" executable="false" family="Times New Roman" foreground="[0,0,0]" italic="false" opaque="false" readonly="false" size="12" subscript="false" superscript="false" underline="false"/>
+<Font name="Text" background="[255,255,255]" bold="false" executable="false" family="Times New Roman" foreground="[0,0,0]" italic="false" opaque="false" readonly="false" size="12" subscript="false" superscript="false" underline="false"/>
+<Font name="Diagnostic" background="[255,255,255]" bold="false" executable="false" family="Monospaced" foreground="[40,120,40]" italic="false" opaque="false" readonly="true" size="12" subscript="false" superscript="false" underline="false"/>
+<Font name="Heading 2" background="[255,255,255]" bold="true" executable="false" family="Serif" foreground="[0,0,0]" italic="false" opaque="false" readonly="false" size="16" subscript="false" superscript="false" underline="false"/>
+<Font name="Page Number" background="[255,255,255]" bold="false" executable="false" family="Times New Roman" foreground="[0,0,0]" italic="false" opaque="false" readonly="false" size="10" subscript="false" superscript="false" underline="false"/>
+<Font name="Ordered List 3" background="[255,255,255]" bold="false" executable="false" family="Times New Roman" foreground="[0,0,0]" italic="false" opaque="false" readonly="false" size="12" subscript="false" superscript="false" underline="false"/>
+<Font name="Maple Plot" background="[255,255,255]" bold="false" executable="false" family="Times New Roman" foreground="[0,0,0]" italic="false" opaque="false" readonly="false" size="12" subscript="false" superscript="false" underline="false"/>
+<Font name="Normal" background="[255,255,255]" bold="false" executable="false" family="Times New Roman" foreground="[0,0,0]" italic="false" opaque="false" readonly="false" size="12" subscript="false" superscript="false" underline="false"/>
+<Font name="Maple Input" background="[255,255,255]" bold="true" executable="true" family="Monospaced" foreground="[255,0,0]" italic="false" opaque="false" readonly="false" size="12" subscript="false" superscript="false" underline="false"/>
+<Font name="2D Output" background="[255,255,255]" bold="false" executable="false" family="Times New Roman" foreground="[0,0,255]" italic="false" opaque="false" readonly="true" size="12" subscript="false" superscript="false" underline="false"/>
+<Font name="Dictionary Hyperlink" background="[255,255,255]" bold="false" executable="false" family="Serif" foreground="[147,0,15]" italic="false" opaque="false" readonly="false" size="12" subscript="false" superscript="false" underline="true"/>
+<Font name="Dash Item" background="[255,255,255]" bold="false" executable="false" family="Times New Roman" foreground="[0,0,0]" italic="false" opaque="false" readonly="false" size="12" subscript="false" superscript="false" underline="false"/>
+<Font name="Heading 3" background="[255,255,255]" bold="true" executable="false" family="Serif" foreground="[0,0,0]" italic="true" opaque="false" readonly="false" size="14" subscript="false" superscript="false" underline="false"/>
+<Font name="Ordered List 4" background="[255,255,255]" bold="false" executable="false" family="Times New Roman" foreground="[0,0,0]" italic="false" opaque="false" readonly="false" size="12" subscript="false" superscript="false" underline="false"/>
+<Font name="Maple Output" background="[255,255,255]" bold="false" executable="false" family="Times New Roman" foreground="[0,0,0]" italic="false" opaque="false" readonly="false" size="12" subscript="false" superscript="false" underline="false"/>
+<Font name="2D Input" background="[255,255,255]" bold="false" executable="true" family="Times New Roman" foreground="[0,0,0]" italic="false" opaque="false" readonly="false" size="12" subscript="false" superscript="false" underline="false"/>
+<Font name="Line Printed Output" background="[255,255,255]" bold="false" executable="false" family="Monospaced" foreground="[0,0,255]" italic="false" opaque="false" readonly="true" size="12" subscript="false" superscript="false" underline="false"/>
+<Font name="List Item" background="[255,255,255]" bold="false" executable="false" family="Times New Roman" foreground="[0,0,0]" italic="false" opaque="false" readonly="false" size="12" subscript="false" superscript="false" underline="false"/>
+<Font name="Maple Input Placeholder" background="[255,255,255]" bold="true" executable="true" family="Monospaced" foreground="[200,0,200]" italic="false" opaque="false" readonly="false" size="12" subscript="false" superscript="false" underline="false"/>
+<Font name="2D Math" background="[255,255,255]" bold="false" executable="false" family="Times New Roman" foreground="[0,0,0]" italic="false" opaque="false" readonly="false" size="12" subscript="false" superscript="false" underline="false"/>
+<Font name="Error" background="[255,255,255]" bold="false" executable="false" family="Monospaced" foreground="[255,0,255]" italic="false" opaque="false" readonly="true" size="12" subscript="false" superscript="false" underline="false"/>
+<Font name="Warning" background="[255,255,255]" bold="false" executable="false" family="Monospaced" foreground="[0,0,255]" italic="false" opaque="false" readonly="true" size="12" subscript="false" superscript="false" underline="false"/>
+<Font name="Heading 1" background="[255,255,255]" bold="true" executable="false" family="Serif" foreground="[0,0,0]" italic="false" opaque="false" readonly="false" size="18" subscript="false" superscript="false" underline="false"/>
+<Font name="Title" background="[255,255,255]" bold="true" executable="false" family="Times New Roman" foreground="[0,0,0]" italic="false" opaque="false" readonly="false" size="18" subscript="false" superscript="false" underline="false"/>
+<Font name="Ordered List 2" background="[255,255,255]" bold="false" executable="false" family="Times New Roman" foreground="[0,0,0]" italic="false" opaque="false" readonly="false" size="12" subscript="false" superscript="false" underline="false"/>
+<Font name="Hyperlink" background="[255,255,255]" bold="false" executable="false" family="Serif" foreground="[0,128,128]" italic="false" opaque="false" readonly="false" size="12" subscript="false" superscript="false" underline="true"/>
+<Layout name="Ordered List 5" alignment="left" bullet="ROMAN" firstindent="0" leftmargin="144" rightmargin="0" linespacing="0.0" spaceabove="3" spacebelow="3" linebreak="space" pagebreak-before="false" initial="-1"/>
+<Layout name="Heading 4" alignment="left" bullet="none" firstindent="0" leftmargin="0" rightmargin="0" linespacing="0.0" spaceabove="0" spacebelow="0" linebreak="space" pagebreak-before="false" initial="0"/>
+<Layout name="Text Output" alignment="left" bullet="none" firstindent="0" leftmargin="0" rightmargin="0" linespacing="0.0" spaceabove="0" spacebelow="0" linebreak="newline" pagebreak-before="false" initial="0"/>
+<Layout name="Ordered List 1" alignment="left" bullet="numeric" firstindent="0" leftmargin="0" rightmargin="0" linespacing="0.0" spaceabove="3" spacebelow="3" linebreak="space" pagebreak-before="false" initial="-1"/>
+<Layout name="Bullet Item" alignment="left" bullet="dot" firstindent="0" leftmargin="0" rightmargin="0" linespacing="0.0" spaceabove="3" spacebelow="3" linebreak="space" pagebreak-before="false" initial="0"/>
+<Layout name="Author" alignment="centred" bullet="none" firstindent="0" leftmargin="0" rightmargin="0" linespacing="0.0" spaceabove="8" spacebelow="8" linebreak="space" pagebreak-before="false" initial="0"/>
+<Layout name="Dash Item" alignment="left" bullet="dash" firstindent="0" leftmargin="0" rightmargin="0" linespacing="0.0" spaceabove="3" spacebelow="3" linebreak="space" pagebreak-before="false" initial="0"/>
+<Layout name="Heading 3" alignment="left" bullet="none" firstindent="0" leftmargin="0" rightmargin="0" linespacing="0.0" spaceabove="0" spacebelow="0" linebreak="space" pagebreak-before="false" initial="0"/>
+<Layout name="Diagnostic" alignment="left" bullet="none" firstindent="0" leftmargin="0" rightmargin="0" linespacing="0.0" spaceabove="0" spacebelow="0" linebreak="any" pagebreak-before="false" initial="0"/>
+<Layout name="Ordered List 4" alignment="left" bullet="ALPHABETIC" firstindent="0" leftmargin="108" rightmargin="0" linespacing="0.0" spaceabove="3" spacebelow="3" linebreak="space" pagebreak-before="false" initial="-1"/>
+<Layout name="Maple Output" alignment="centred" bullet="none" firstindent="0" leftmargin="0" rightmargin="0" linespacing="0.3" spaceabove="0" spacebelow="0" linebreak="space" pagebreak-before="false" initial="0"/>
+<Layout name="List Item" alignment="left" bullet="indent" firstindent="0" leftmargin="0" rightmargin="0" linespacing="0.0" spaceabove="3" spacebelow="3" linebreak="space" pagebreak-before="false" initial="0"/>
+<Layout name="Line Printed Output" alignment="left" bullet="none" firstindent="0" leftmargin="0" rightmargin="0" linespacing="0.0" spaceabove="0" spacebelow="0" linebreak="any" pagebreak-before="false" initial="0"/>
+<Layout name="Heading 2" alignment="left" bullet="none" firstindent="0" leftmargin="0" rightmargin="0" linespacing="0.0" spaceabove="8" spacebelow="2" linebreak="space" pagebreak-before="false" initial="0"/>
+<Layout name="Ordered List 3" alignment="left" bullet="roman" firstindent="0" leftmargin="72" rightmargin="0" linespacing="0.0" spaceabove="3" spacebelow="3" linebreak="space" pagebreak-before="false" initial="-1"/>
+<Layout name="Error" alignment="left" bullet="none" firstindent="0" leftmargin="0" rightmargin="0" linespacing="0.0" spaceabove="0" spacebelow="0" linebreak="space" pagebreak-before="false" initial="0"/>
+<Layout name="Maple Plot" alignment="centred" bullet="none" firstindent="0" leftmargin="0" rightmargin="0" linespacing="0.0" spaceabove="0" spacebelow="0" linebreak="space" pagebreak-before="false" initial="0"/>
+<Layout name="Warning" alignment="left" bullet="none" firstindent="0" leftmargin="0" rightmargin="0" linespacing="0.0" spaceabove="0" spacebelow="0" linebreak="space" pagebreak-before="false" initial="0"/>
+<Layout name="Heading 1" alignment="left" bullet="none" firstindent="0" leftmargin="0" rightmargin="0" linespacing="0.0" spaceabove="8" spacebelow="4" linebreak="space" pagebreak-before="false" initial="0"/>
+<Layout name="Title" alignment="centred" bullet="none" firstindent="0" leftmargin="0" rightmargin="0" linespacing="0.0" spaceabove="12" spacebelow="12" linebreak="space" pagebreak-before="false" initial="0"/>
+<Layout name="Ordered List 2" alignment="left" bullet="alphabetic" firstindent="0" leftmargin="36" rightmargin="0" linespacing="0.0" spaceabove="3" spacebelow="3" linebreak="space" pagebreak-before="false" initial="-1"/>
+<Layout name="Normal" alignment="left" bullet="none" firstindent="0" leftmargin="0" rightmargin="0" linespacing="0.0" spaceabove="0" spacebelow="0" linebreak="space" pagebreak-before="false" initial="0"/>
+<Pencil-style name="Pencil 3" pen-color="[0,0,0]" pen-height="3.0" pen-width="3.0" pen-opacity="1.0"/>
+<Pencil-style name="Pencil 1" pen-color="[0,0,0]" pen-height="1.0" pen-width="1.0" pen-opacity="1.0"/>
+<Pencil-style name="Pencil 5" pen-color="[255,0,0]" pen-height="5.0" pen-width="5.0" pen-opacity="1.0"/>
+<Pencil-style name="Pencil 2" pen-color="[0,0,255]" pen-height="1.0" pen-width="1.0" pen-opacity="1.0"/>
+<Pencil-style name="Pencil 4" pen-color="[0,0,255]" pen-height="3.0" pen-width="3.0" pen-opacity="1.0"/>
+<Highlighter-style name="Highlighter 2" pen-color="[255,204,0]" pen-height="14.0" pen-width="14.0" pen-opacity="0.8"/>
+<Highlighter-style name="Highlighter 4" pen-color="[0,255,255]" pen-height="32.0" pen-width="32.0" pen-opacity="0.8"/>
+<Highlighter-style name="Highlighter 3" pen-color="[51,255,0]" pen-height="24.0" pen-width="24.0" pen-opacity="0.8"/>
+<Highlighter-style name="Highlighter 1" pen-color="[255,153,255]" pen-height="12.0" pen-width="8.0" pen-opacity="0.8"/>
+<Highlighter-style name="Highlighter 5" pen-color="[255,255,0]" pen-height="48.0" pen-width="48.0" pen-opacity="0.8"/>
+</Styles>
+<Task-table>
+ <Task-category name="<default>">
+ </Task-category>
+</Task-table>
+<Group labelreference="L7" drawlabel="true">
+<Input>
+<Text-field style="Text" family="Lucida Bright" size="24" layout="Normal" alignment="centred"><Font family="Lucida Bright" size="24">LinBox Interface beta version 0.1</Font></Text-field>
+<Text-field style="Text" family="Lucida Bright" size="24" layout="Normal" alignment="centred"><Font family="Lucida Bright" size="24">demonstration</Font></Text-field>
+<Text-field style="Text" family="Lucida Bright" size="18" layout="Normal" alignment="centred"><Font family="Lucida Bright" size="18">by Pascal Giorgi</Font></Text-field>
+<Text-field style="Text" family="Lucida Bright" size="18" layout="Normal" alignment="centred"></Text-field>
+<Text-field style="Text" family="Lucida Bright" size="18" layout="Normal" alignment="centred"></Text-field>
+<Text-field style="Text" family="Lucida Bright" size="18" layout="Normal" alignment="centred"></Text-field>
+<Text-field style="Text" family="Lucida Bright" size="18" layout="Normal" alignment="centred"></Text-field>
+</Input>
+</Group>
+<Group labelreference="L118" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">restart;</Text-field>
+</Input>
+</Group>
+<Section collapsed="true" MultipleChoiceAnswerIndex="-1" MultipleChoiceRandomizeChoices="false" TrueFalseAnswerIndex="-1" EssayAnswerRows="5" EssayAnswerColumns="60"><Title>
+<Text-field style="Heading 1" layout="Heading 1">Available through Maple module</Text-field></Title>
+<Group labelreference="L10" drawlabel="true">
+<Input>
+<Text-field style="Text" layout="Normal"></Text-field>
+</Input>
+</Group>
+<Group labelreference="L11" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">with(LinBox);</Text-field>
+</Input>
+<Output>
+<Text-field style="Line Printed Output" layout="Line Printed Output"> LinBox/Maple Interface Package beta version 0.1
+ by Pascal Giorgi (pgiorgi at uwaterloo.ca)</Text-field>
+</Output>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtb0dGJTYzUSJbRigvJSVmb3JtR1EncHJlZml4RigvJSZmZW5jZUdRJXRydWVGKC8lKnNlcGFyYXRvckdRJmZhbHNlRigvJSdsc3BhY2VHUS50aGlubWF0aHNwYWNlRigvJSdyc3BhY2VHRjsvJSlzdHJldGNoeUdGNS8lKnN5bW1ldHJpY0dGOC8lKG1heHNpemVHUSlpbmZpbml0eUYoLyUobWluc2l6ZUdRIjFGKC8lKGxhcmdlb3BHRjgvJS5tb3ZhYmxlbGltaXRzR0Y4LyUnYWNjZW50R0Y4LyUwZm9udF9zdHlsZV9uY [...]
+</Output>
+</Group>
+<Group labelreference="L16" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal"></Text-field>
+</Input>
+</Group>
+<Group labelreference="L13" drawlabel="true">
+<Input>
+<Text-field style="Text" size="18" layout="Normal"><Font size="16">comparison with LinearAlgebra package</Font></Text-field>
+</Input>
+</Group>
+<Group labelreference="L14" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">with(LinearAlgebra);</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtb0dGJTYzUSJbRigvJSVmb3JtR1EncHJlZml4RigvJSZmZW5jZUdRJXRydWVGKC8lKnNlcGFyYXRvckdRJmZhbHNlRigvJSdsc3BhY2VHUS50aGlubWF0aHNwYWNlRigvJSdyc3BhY2VHRjsvJSlzdHJldGNoeUdGNS8lKnN5bW1ldHJpY0dGOC8lKG1heHNpemVHUSlpbmZpbml0eUYoLyUobWluc2l6ZUdRIjFGKC8lKGxhcmdlb3BHRjgvJS5tb3ZhYmxlbGltaXRzR0Y4LyUnYWNjZW50R0Y4LyUwZm9udF9zdHlsZV9uY [...]
+</Output>
+</Group>
+<Group labelreference="L15" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal"></Text-field>
+</Input>
+</Group>
+</Section>
+<Section collapsed="true" MultipleChoiceAnswerIndex="-1" MultipleChoiceRandomizeChoices="false" TrueFalseAnswerIndex="-1" EssayAnswerRows="5" EssayAnswerColumns="60"><Title>
+<Text-field style="Heading 1" layout="Heading 1">High level of the interface </Text-field></Title>
+<Group labelreference="L8" drawlabel="true">
+<Input>
+<Text-field style="Text" layout="Normal"></Text-field>
+<Text-field style="Text" size="16" layout="Normal"><Font size="16">Call LinBox functionnalities directly on Maple objects.</Font></Text-field>
+<Text-field style="Text" layout="Normal"></Text-field>
+</Input>
+</Group>
+<Section collapsed="true" MultipleChoiceAnswerIndex="-1" MultipleChoiceRandomizeChoices="false" TrueFalseAnswerIndex="-1" EssayAnswerRows="5" EssayAnswerColumns="60"><Title>
+<Text-field style="Heading 2" layout="Heading 2">Computation over the integers</Text-field></Title>
+<Text-field style="Text" layout="Normal"></Text-field>
+<Group labelreference="L227" drawlabel="true">
+<Input>
+<Text-field style="Text" layout="Normal"></Text-field>
+</Input>
+</Group>
+<Section collapsed="true" MultipleChoiceAnswerIndex="-1" MultipleChoiceRandomizeChoices="false" TrueFalseAnswerIndex="-1" EssayAnswerRows="5" EssayAnswerColumns="60"><Title>
+<Text-field style="Heading 3" layout="Heading 3">Determinant</Text-field></Title>
+<Group labelreference="L17" drawlabel="true">
+<Input>
+<Text-field style="Text" layout="Normal"></Text-field>
+</Input>
+</Group>
+<Group labelreference="L228" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">n:=100;gen:=rand(0..10);</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtaUdGJTY5USJuRigvJSdmYW1pbHlHUTBUaW1lc35OZXd+Um9tYW5GKC8lJXNpemVHUSMxMkYoLyUlYm9sZEdRJmZhbHNlRigvJSdpdGFsaWNHUSV0cnVlRigvJSp1bmRlcmxpbmVHRjgvJSpzdWJzY3JpcHRHRjgvJSxzdXBlcnNjcmlwdEdGOC8lK2ZvcmVncm91bmRHUSpbMCwwLDI1NV1GKC8lK2JhY2tncm91bmRHUS5bMjU1LDI1NSwyNTVdRigvJSdvcGFxdWVHRjgvJStleGVjdXRhYmxlR0Y4LyUpcmVhZG9ubHlHR [...]
+</Output>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtaUdGJTY5USRnZW5GKC8lJ2ZhbWlseUdRMFRpbWVzfk5ld35Sb21hbkYoLyUlc2l6ZUdRIzEyRigvJSVib2xkR1EmZmFsc2VGKC8lJ2l0YWxpY0dRJXRydWVGKC8lKnVuZGVybGluZUdGOC8lKnN1YnNjcmlwdEdGOC8lLHN1cGVyc2NyaXB0R0Y4LyUrZm9yZWdyb3VuZEdRKlswLDAsMjU1XUYoLyUrYmFja2dyb3VuZEdRLlsyNTUsMjU1LDI1NV1GKC8lJ29wYXF1ZUdGOC8lK2V4ZWN1dGFibGVHRjgvJSlyZWFkb25se [...]
+</Output>
+</Group>
+<Group labelreference="L229" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">A:=Matrix(n,gen);</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzYlLUkjbWlHRiQ2OVEiQUYnLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRicvJSVzaXplR1EjMTJGJy8lJWJvbGRHUSZmYWxzZUYnLyUnaXRhbGljR1EldHJ1ZUYnLyUqdW5kZXJsaW5lR0Y3LyUqc3Vic2NyaXB0R0Y3LyUsc3VwZXJzY3JpcHRHRjcvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRicvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYnLyUnb3BhcXVlR0Y3LyUrZXhlY3V0YWJsZUdGNy8lKXJlYWRvbmx5R0Y6L [...]
+</Output>
+</Group>
+<Group labelreference="L29" drawlabel="true">
+<Input>
+<Text-field style="Text" layout="Normal"> <Font size="16">Maple determinant</Font></Text-field>
+<Text-field style="Text" layout="Normal"></Text-field>
+</Input>
+</Group>
+<Group labelreference="L27" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">Determinant(A);</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSNtbkc2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGKDY5UV1zMTMxNTQyMTA5NjUyNDk5ODEwNDIyNzczOTQ5NjE2NjQzMzE5MTU2Mzc3NzMzNjAxNzQ5ODU1OTgzNzk3NDY0Njk1MTI3MTQ5NDk4NDIzMTg4MTg1ODgyMTI3Mzg0MzE3NzgwMDI3MDA2NDUzODIxMTk4NzYxNTc2Mzc4NDY1NTY4MkYoLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRigvJSVzaXplR1EjMTJGKC8lJWJvbGRHUSZmYWxzZUYoLyUnaXRhbGljR0Y1LyUqdW5kZXJsaW5lR0Y1LyUqc3Vic2NyaXB0R0Y1LyUsc [...]
+</Output>
+</Group>
+<Group labelreference="L30" drawlabel="true">
+<Input>
+<Text-field style="Text" layout="Normal"> </Text-field>
+<Text-field style="Text" layout="Normal"><Font size="16">LinBox determinant</Font></Text-field>
+<Text-field style="Text" layout="Normal"></Text-field>
+</Input>
+</Group>
+<Group labelreference="L28" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">lbDeterminant(A);</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtc0dGJTYjUTFjb252ZXJzaW9ufnRpbWU6RigtSSNtb0dGJTYzUSIsRigvJSVmb3JtR1EmaW5maXhGKC8lJmZlbmNlR1EmZmFsc2VGKC8lKnNlcGFyYXRvckdRJXRydWVGKC8lJ2xzcGFjZUdRJDBlbUYoLyUncnNwYWNlR1EzdmVyeXRoaWNrbWF0aHNwYWNlRigvJSlzdHJldGNoeUdGOS8lKnN5bW1ldHJpY0dGOS8lKG1heHNpemVHUSlpbmZpbml0eUYoLyUobWluc2l6ZUdRIjFGKC8lKGxhcmdlb3BHRjkvJS5tb3ZhY [...]
+</Output>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSNtbkc2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGKDY5UV1zMTMxNTQyMTA5NjUyNDk5ODEwNDIyNzczOTQ5NjE2NjQzMzE5MTU2Mzc3NzMzNjAxNzQ5ODU1OTgzNzk3NDY0Njk1MTI3MTQ5NDk4NDIzMTg4MTg1ODgyMTI3Mzg0MzE3NzgwMDI3MDA2NDUzODIxMTk4NzYxNTc2Mzc4NDY1NTY4MkYoLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRigvJSVzaXplR1EjMTJGKC8lJWJvbGRHUSZmYWxzZUYoLyUnaXRhbGljR0Y1LyUqdW5kZXJsaW5lR0Y1LyUqc3Vic2NyaXB0R0Y1LyUsc [...]
+</Output>
+</Group>
+<Group labelreference="L32" drawlabel="true">
+<Input>
+<Text-field style="Text" layout="Normal"></Text-field>
+<Text-field style="Text" layout="Normal"><Font size="16">Timing comparison</Font></Text-field>
+<Text-field style="Text" layout="Normal"></Text-field>
+</Input>
+</Group>
+<Group labelreference="L31" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">t1:=time(Determinant(A));</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtaUdGJTY5USN0MUYoLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRigvJSVzaXplR1EjMTJGKC8lJWJvbGRHUSZmYWxzZUYoLyUnaXRhbGljR1EldHJ1ZUYoLyUqdW5kZXJsaW5lR0Y4LyUqc3Vic2NyaXB0R0Y4LyUsc3VwZXJzY3JpcHRHRjgvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRigvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYoLyUnb3BhcXVlR0Y4LyUrZXhlY3V0YWJsZUdGOC8lKXJlYWRvbmx5R [...]
+</Output>
+</Group>
+<Group labelreference="L33" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">t2:=time(lbDeterminant(A));</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtc0dGJTYjUTFjb252ZXJzaW9ufnRpbWU6RigtSSNtb0dGJTYzUSIsRigvJSVmb3JtR1EmaW5maXhGKC8lJmZlbmNlR1EmZmFsc2VGKC8lKnNlcGFyYXRvckdRJXRydWVGKC8lJ2xzcGFjZUdRJDBlbUYoLyUncnNwYWNlR1EzdmVyeXRoaWNrbWF0aHNwYWNlRigvJSlzdHJldGNoeUdGOS8lKnN5bW1ldHJpY0dGOS8lKG1heHNpemVHUSlpbmZpbml0eUYoLyUobWluc2l6ZUdRIjFGKC8lKGxhcmdlb3BHRjkvJS5tb3ZhY [...]
+</Output>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtaUdGJTY5USN0MkYoLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRigvJSVzaXplR1EjMTJGKC8lJWJvbGRHUSZmYWxzZUYoLyUnaXRhbGljR1EldHJ1ZUYoLyUqdW5kZXJsaW5lR0Y4LyUqc3Vic2NyaXB0R0Y4LyUsc3VwZXJzY3JpcHRHRjgvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRigvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYoLyUnb3BhcXVlR0Y4LyUrZXhlY3V0YWJsZUdGOC8lKXJlYWRvbmx5R [...]
+</Output>
+</Group>
+<Group labelreference="L34" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">t1/t2;</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSNtbkc2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGKDY5USw3LjM2NTI2OTQ2MUYoLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRigvJSVzaXplR1EjMTJGKC8lJWJvbGRHUSZmYWxzZUYoLyUnaXRhbGljR0Y1LyUqdW5kZXJsaW5lR0Y1LyUqc3Vic2NyaXB0R0Y1LyUsc3VwZXJzY3JpcHRHRjUvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRigvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYoLyUnb3BhcXVlR0Y1LyUrZXhlY3V0YWJsZUdGNS8lKXJlYWRvbmx5R1EldHJ1ZUYoL [...]
+</Output>
+</Group>
+<Group labelreference="L35" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">B:=Matrix(200,gen);</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzYlLUkjbWlHRiQ2OVEiQkYnLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRicvJSVzaXplR1EjMTJGJy8lJWJvbGRHUSZmYWxzZUYnLyUnaXRhbGljR1EldHJ1ZUYnLyUqdW5kZXJsaW5lR0Y3LyUqc3Vic2NyaXB0R0Y3LyUsc3VwZXJzY3JpcHRHRjcvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRicvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYnLyUnb3BhcXVlR0Y3LyUrZXhlY3V0YWJsZUdGNy8lKXJlYWRvbmx5R0Y6L [...]
+</Output>
+</Group>
+<Group labelreference="L37" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">t1:=time(Determinant(B));</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtaUdGJTY5USN0MUYoLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRigvJSVzaXplR1EjMTJGKC8lJWJvbGRHUSZmYWxzZUYoLyUnaXRhbGljR1EldHJ1ZUYoLyUqdW5kZXJsaW5lR0Y4LyUqc3Vic2NyaXB0R0Y4LyUsc3VwZXJzY3JpcHRHRjgvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRigvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYoLyUnb3BhcXVlR0Y4LyUrZXhlY3V0YWJsZUdGOC8lKXJlYWRvbmx5R [...]
+</Output>
+</Group>
+<Group labelreference="L38" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">t2:=time(lbDeterminant(B));</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtc0dGJTYjUTFjb252ZXJzaW9ufnRpbWU6RigtSSNtb0dGJTYzUSIsRigvJSVmb3JtR1EmaW5maXhGKC8lJmZlbmNlR1EmZmFsc2VGKC8lKnNlcGFyYXRvckdRJXRydWVGKC8lJ2xzcGFjZUdRJDBlbUYoLyUncnNwYWNlR1EzdmVyeXRoaWNrbWF0aHNwYWNlRigvJSlzdHJldGNoeUdGOS8lKnN5bW1ldHJpY0dGOS8lKG1heHNpemVHUSlpbmZpbml0eUYoLyUobWluc2l6ZUdRIjFGKC8lKGxhcmdlb3BHRjkvJS5tb3ZhY [...]
+</Output>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtaUdGJTY5USN0MkYoLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRigvJSVzaXplR1EjMTJGKC8lJWJvbGRHUSZmYWxzZUYoLyUnaXRhbGljR1EldHJ1ZUYoLyUqdW5kZXJsaW5lR0Y4LyUqc3Vic2NyaXB0R0Y4LyUsc3VwZXJzY3JpcHRHRjgvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRigvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYoLyUnb3BhcXVlR0Y4LyUrZXhlY3V0YWJsZUdGOC8lKXJlYWRvbmx5R [...]
+</Output>
+</Group>
+<Group labelreference="L39" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">t1/t2;</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSNtbkc2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGKDY5USwxNC40MTQ0NzM2OEYoLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRigvJSVzaXplR1EjMTJGKC8lJWJvbGRHUSZmYWxzZUYoLyUnaXRhbGljR0Y1LyUqdW5kZXJsaW5lR0Y1LyUqc3Vic2NyaXB0R0Y1LyUsc3VwZXJzY3JpcHRHRjUvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRigvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYoLyUnb3BhcXVlR0Y1LyUrZXhlY3V0YWJsZUdGNS8lKXJlYWRvbmx5R1EldHJ1ZUYoL [...]
+</Output>
+</Group>
+<Group labelreference="L36" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal"></Text-field>
+</Input>
+</Group>
+</Section>
+<Section collapsed="true" MultipleChoiceAnswerIndex="-1" MultipleChoiceRandomizeChoices="false" TrueFalseAnswerIndex="-1" EssayAnswerRows="5" EssayAnswerColumns="60"><Title>
+<Text-field style="Heading 3" layout="Heading 3">Rank</Text-field></Title>
+<Group labelreference="L232" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">n:=100;gen:=rand(0..10);</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtaUdGJTY5USJuRigvJSdmYW1pbHlHUTBUaW1lc35OZXd+Um9tYW5GKC8lJXNpemVHUSMxMkYoLyUlYm9sZEdRJmZhbHNlRigvJSdpdGFsaWNHUSV0cnVlRigvJSp1bmRlcmxpbmVHRjgvJSpzdWJzY3JpcHRHRjgvJSxzdXBlcnNjcmlwdEdGOC8lK2ZvcmVncm91bmRHUSpbMCwwLDI1NV1GKC8lK2JhY2tncm91bmRHUS5bMjU1LDI1NSwyNTVdRigvJSdvcGFxdWVHRjgvJStleGVjdXRhYmxlR0Y4LyUpcmVhZG9ubHlHR [...]
+</Output>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtaUdGJTY5USRnZW5GKC8lJ2ZhbWlseUdRMFRpbWVzfk5ld35Sb21hbkYoLyUlc2l6ZUdRIzEyRigvJSVib2xkR1EmZmFsc2VGKC8lJ2l0YWxpY0dRJXRydWVGKC8lKnVuZGVybGluZUdGOC8lKnN1YnNjcmlwdEdGOC8lLHN1cGVyc2NyaXB0R0Y4LyUrZm9yZWdyb3VuZEdRKlswLDAsMjU1XUYoLyUrYmFja2dyb3VuZEdRLlsyNTUsMjU1LDI1NV1GKC8lJ29wYXF1ZUdGOC8lK2V4ZWN1dGFibGVHRjgvJSlyZWFkb25se [...]
+</Output>
+</Group>
+<Group labelreference="L231" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">A:=Matrix(n,gen);</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzYlLUkjbWlHRiQ2OVEiQUYnLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRicvJSVzaXplR1EjMTJGJy8lJWJvbGRHUSZmYWxzZUYnLyUnaXRhbGljR1EldHJ1ZUYnLyUqdW5kZXJsaW5lR0Y3LyUqc3Vic2NyaXB0R0Y3LyUsc3VwZXJzY3JpcHRHRjcvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRicvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYnLyUnb3BhcXVlR0Y3LyUrZXhlY3V0YWJsZUdGNy8lKXJlYWRvbmx5R0Y6L [...]
+</Output>
+</Group>
+<Group labelreference="L18" drawlabel="true">
+<Input>
+<Text-field style="Text" layout="Normal"></Text-field>
+</Input>
+</Group>
+<Group labelreference="L40" drawlabel="true">
+<Input>
+<Text-field style="Text" layout="Normal"><Font size="16">Maple rank</Font></Text-field>
+<Text-field style="Text" layout="Normal"></Text-field>
+</Input>
+</Group>
+<Group labelreference="L41" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">Rank(A);</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSNtbkc2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGKDY5USQxMDBGKC8lJ2ZhbWlseUdRMFRpbWVzfk5ld35Sb21hbkYoLyUlc2l6ZUdRIzEyRigvJSVib2xkR1EmZmFsc2VGKC8lJ2l0YWxpY0dGNS8lKnVuZGVybGluZUdGNS8lKnN1YnNjcmlwdEdGNS8lLHN1cGVyc2NyaXB0R0Y1LyUrZm9yZWdyb3VuZEdRKlswLDAsMjU1XUYoLyUrYmFja2dyb3VuZEdRLlsyNTUsMjU1LDI1NV1GKC8lJ29wYXF1ZUdGNS8lK2V4ZWN1dGFibGVHRjUvJSlyZWFkb25seUdRJXRydWVGKC8lKWNvbXBvc [...]
+</Output>
+</Group>
+<Group labelreference="L42" drawlabel="true">
+<Input>
+<Text-field style="Text" layout="Normal"></Text-field>
+<Text-field style="Text" layout="Normal"><Font size="18">LinBox rank</Font></Text-field>
+<Text-field style="Text" layout="Normal"></Text-field>
+</Input>
+</Group>
+<Group labelreference="L43" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">lbRank(A);</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtc0dGJTYjUTFjb252ZXJzaW9ufnRpbWU6RigtSSNtb0dGJTYzUSIsRigvJSVmb3JtR1EmaW5maXhGKC8lJmZlbmNlR1EmZmFsc2VGKC8lKnNlcGFyYXRvckdRJXRydWVGKC8lJ2xzcGFjZUdRJDBlbUYoLyUncnNwYWNlR1EzdmVyeXRoaWNrbWF0aHNwYWNlRigvJSlzdHJldGNoeUdGOS8lKnN5bW1ldHJpY0dGOS8lKG1heHNpemVHUSlpbmZpbml0eUYoLyUobWluc2l6ZUdRIjFGKC8lKGxhcmdlb3BHRjkvJS5tb3ZhY [...]
+</Output>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSNtbkc2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGKDY5USQxMDBGKC8lJ2ZhbWlseUdRMFRpbWVzfk5ld35Sb21hbkYoLyUlc2l6ZUdRIzEyRigvJSVib2xkR1EmZmFsc2VGKC8lJ2l0YWxpY0dGNS8lKnVuZGVybGluZUdGNS8lKnN1YnNjcmlwdEdGNS8lLHN1cGVyc2NyaXB0R0Y1LyUrZm9yZWdyb3VuZEdRKlswLDAsMjU1XUYoLyUrYmFja2dyb3VuZEdRLlsyNTUsMjU1LDI1NV1GKC8lJ29wYXF1ZUdGNS8lK2V4ZWN1dGFibGVHRjUvJSlyZWFkb25seUdRJXRydWVGKC8lKWNvbXBvc [...]
+</Output>
+</Group>
+<Group labelreference="L44" drawlabel="true">
+<Input>
+<Text-field style="Text" layout="Normal"></Text-field>
+<Text-field style="Text" layout="Normal"><Font size="16">Timing comparison</Font></Text-field>
+<Text-field style="Text" layout="Normal"></Text-field>
+</Input>
+</Group>
+<Group labelreference="L174" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">t1:=time(Rank(A));</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtaUdGJTY5USN0MUYoLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRigvJSVzaXplR1EjMTJGKC8lJWJvbGRHUSZmYWxzZUYoLyUnaXRhbGljR1EldHJ1ZUYoLyUqdW5kZXJsaW5lR0Y4LyUqc3Vic2NyaXB0R0Y4LyUsc3VwZXJzY3JpcHRHRjgvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRigvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYoLyUnb3BhcXVlR0Y4LyUrZXhlY3V0YWJsZUdGOC8lKXJlYWRvbmx5R [...]
+</Output>
+</Group>
+<Group labelreference="L178" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">t2:=time(lbRank(A));</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtc0dGJTYjUTFjb252ZXJzaW9ufnRpbWU6RigtSSNtb0dGJTYzUSIsRigvJSVmb3JtR1EmaW5maXhGKC8lJmZlbmNlR1EmZmFsc2VGKC8lKnNlcGFyYXRvckdRJXRydWVGKC8lJ2xzcGFjZUdRJDBlbUYoLyUncnNwYWNlR1EzdmVyeXRoaWNrbWF0aHNwYWNlRigvJSlzdHJldGNoeUdGOS8lKnN5bW1ldHJpY0dGOS8lKG1heHNpemVHUSlpbmZpbml0eUYoLyUobWluc2l6ZUdRIjFGKC8lKGxhcmdlb3BHRjkvJS5tb3ZhY [...]
+</Output>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtaUdGJTY5USN0MkYoLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRigvJSVzaXplR1EjMTJGKC8lJWJvbGRHUSZmYWxzZUYoLyUnaXRhbGljR1EldHJ1ZUYoLyUqdW5kZXJsaW5lR0Y4LyUqc3Vic2NyaXB0R0Y4LyUsc3VwZXJzY3JpcHRHRjgvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRigvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYoLyUnb3BhcXVlR0Y4LyUrZXhlY3V0YWJsZUdGOC8lKXJlYWRvbmx5R [...]
+</Output>
+</Group>
+<Group labelreference="L179" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">t1/t2;</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSNtbkc2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGKDY5USwyNy40ODc4MDQ4OEYoLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRigvJSVzaXplR1EjMTJGKC8lJWJvbGRHUSZmYWxzZUYoLyUnaXRhbGljR0Y1LyUqdW5kZXJsaW5lR0Y1LyUqc3Vic2NyaXB0R0Y1LyUsc3VwZXJzY3JpcHRHRjUvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRigvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYoLyUnb3BhcXVlR0Y1LyUrZXhlY3V0YWJsZUdGNS8lKXJlYWRvbmx5R1EldHJ1ZUYoL [...]
+</Output>
+</Group>
+<Group labelreference="L176" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">B:=Matrix(200,gen);</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzYlLUkjbWlHRiQ2OVEiQkYnLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRicvJSVzaXplR1EjMTJGJy8lJWJvbGRHUSZmYWxzZUYnLyUnaXRhbGljR1EldHJ1ZUYnLyUqdW5kZXJsaW5lR0Y3LyUqc3Vic2NyaXB0R0Y3LyUsc3VwZXJzY3JpcHRHRjcvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRicvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYnLyUnb3BhcXVlR0Y3LyUrZXhlY3V0YWJsZUdGNy8lKXJlYWRvbmx5R0Y6L [...]
+</Output>
+</Group>
+<Group labelreference="L177" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">t1:=time(Rank(B));</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtaUdGJTY5USN0MUYoLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRigvJSVzaXplR1EjMTJGKC8lJWJvbGRHUSZmYWxzZUYoLyUnaXRhbGljR1EldHJ1ZUYoLyUqdW5kZXJsaW5lR0Y4LyUqc3Vic2NyaXB0R0Y4LyUsc3VwZXJzY3JpcHRHRjgvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRigvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYoLyUnb3BhcXVlR0Y4LyUrZXhlY3V0YWJsZUdGOC8lKXJlYWRvbmx5R [...]
+</Output>
+</Group>
+<Group labelreference="L175" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">t2:time(lbRank(B));</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtc0dGJTYjUTFjb252ZXJzaW9ufnRpbWU6RigtSSNtb0dGJTYzUSIsRigvJSVmb3JtR1EmaW5maXhGKC8lJmZlbmNlR1EmZmFsc2VGKC8lKnNlcGFyYXRvckdRJXRydWVGKC8lJ2xzcGFjZUdRJDBlbUYoLyUncnNwYWNlR1EzdmVyeXRoaWNrbWF0aHNwYWNlRigvJSlzdHJldGNoeUdGOS8lKnN5bW1ldHJpY0dGOS8lKG1heHNpemVHUSlpbmZpbml0eUYoLyUobWluc2l6ZUdRIjFGKC8lKGxhcmdlb3BHRjkvJS5tb3ZhY [...]
+</Output>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSNtbkc2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGKDY5USYwLjMwMEYoLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRigvJSVzaXplR1EjMTJGKC8lJWJvbGRHUSZmYWxzZUYoLyUnaXRhbGljR0Y1LyUqdW5kZXJsaW5lR0Y1LyUqc3Vic2NyaXB0R0Y1LyUsc3VwZXJzY3JpcHRHRjUvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRigvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYoLyUnb3BhcXVlR0Y1LyUrZXhlY3V0YWJsZUdGNS8lKXJlYWRvbmx5R1EldHJ1ZUYoLyUpY29tc [...]
+</Output>
+</Group>
+<Group labelreference="L181" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">t1/t2;</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSNtbkc2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGKDY5USwzMDAuMzE3MDczMkYoLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRigvJSVzaXplR1EjMTJGKC8lJWJvbGRHUSZmYWxzZUYoLyUnaXRhbGljR0Y1LyUqdW5kZXJsaW5lR0Y1LyUqc3Vic2NyaXB0R0Y1LyUsc3VwZXJzY3JpcHRHRjUvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRigvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYoLyUnb3BhcXVlR0Y1LyUrZXhlY3V0YWJsZUdGNS8lKXJlYWRvbmx5R1EldHJ1ZUYoL [...]
+</Output>
+</Group>
+<Group labelreference="L180" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal"></Text-field>
+</Input>
+</Group>
+</Section>
+<Section collapsed="true" MultipleChoiceAnswerIndex="-1" MultipleChoiceRandomizeChoices="false" TrueFalseAnswerIndex="-1" EssayAnswerRows="5" EssayAnswerColumns="60"><Title>
+<Text-field style="Heading 3" layout="Heading 3">Minimal Polynomial</Text-field></Title>
+<Group labelreference="L235" drawlabel="true">
+<Input>
+<Text-field style="Text" layout="Normal"></Text-field>
+</Input>
+</Group>
+<Group labelreference="L234" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">n:=20;gen:=rand(0..10);</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtaUdGJTY5USJuRigvJSdmYW1pbHlHUTBUaW1lc35OZXd+Um9tYW5GKC8lJXNpemVHUSMxMkYoLyUlYm9sZEdRJmZhbHNlRigvJSdpdGFsaWNHUSV0cnVlRigvJSp1bmRlcmxpbmVHRjgvJSpzdWJzY3JpcHRHRjgvJSxzdXBlcnNjcmlwdEdGOC8lK2ZvcmVncm91bmRHUSpbMCwwLDI1NV1GKC8lK2JhY2tncm91bmRHUS5bMjU1LDI1NSwyNTVdRigvJSdvcGFxdWVHRjgvJStleGVjdXRhYmxlR0Y4LyUpcmVhZG9ubHlHR [...]
+</Output>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtaUdGJTY5USRnZW5GKC8lJ2ZhbWlseUdRMFRpbWVzfk5ld35Sb21hbkYoLyUlc2l6ZUdRIzEyRigvJSVib2xkR1EmZmFsc2VGKC8lJ2l0YWxpY0dRJXRydWVGKC8lKnVuZGVybGluZUdGOC8lKnN1YnNjcmlwdEdGOC8lLHN1cGVyc2NyaXB0R0Y4LyUrZm9yZWdyb3VuZEdRKlswLDAsMjU1XUYoLyUrYmFja2dyb3VuZEdRLlsyNTUsMjU1LDI1NV1GKC8lJ29wYXF1ZUdGOC8lK2V4ZWN1dGFibGVHRjgvJSlyZWFkb25se [...]
+</Output>
+</Group>
+<Group labelreference="L233" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">A:=Matrix(n,gen);</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzYlLUkjbWlHRiQ2OVEiQUYnLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRicvJSVzaXplR1EjMTJGJy8lJWJvbGRHUSZmYWxzZUYnLyUnaXRhbGljR1EldHJ1ZUYnLyUqdW5kZXJsaW5lR0Y3LyUqc3Vic2NyaXB0R0Y3LyUsc3VwZXJzY3JpcHRHRjcvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRicvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYnLyUnb3BhcXVlR0Y3LyUrZXhlY3V0YWJsZUdGNy8lKXJlYWRvbmx5R0Y6L [...]
+</Output>
+</Group>
+<Group labelreference="L185" drawlabel="true">
+<Input>
+<Text-field style="Text" layout="Normal"></Text-field>
+</Input>
+</Group>
+<Group labelreference="L226" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal"></Text-field>
+</Input>
+</Group>
+<Group labelreference="L183" drawlabel="true">
+<Input>
+<Text-field style="Text" layout="Normal"><Font size="16">Maple minimal polynomial</Font></Text-field>
+<Text-field style="Text" layout="Normal"></Text-field>
+</Input>
+</Group>
+<Group labelreference="L188" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">MinimalPolynomial(A,'x');</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNkwtSSNtb0dGJTYzUSomdW1pbnVzMDtGKC8lJWZvcm1HUSdwcmVmaXhGKC8lJmZlbmNlR1EmZmFsc2VGKC8lKnNlcGFyYXRvckdGNS8lJ2xzcGFjZUdRJDBlbUYoLyUncnNwYWNlR0Y6LyUpc3RyZXRjaHlHRjUvJSpzeW1tZXRyaWNHRjUvJShtYXhzaXplR1EpaW5maW5pdHlGKC8lKG1pbnNpemVHUSIxRigvJShsYXJnZW9wR0Y1LyUubW92YWJsZWxpbWl0c0dGNS8lJ2FjY2VudEdGNS8lMGZvbnRfc3R5bGVfbmFtZUdRKjJEf [...]
+</Output>
+</Group>
+<Group labelreference="L184" drawlabel="true">
+<Input>
+<Text-field style="Text" layout="Normal"></Text-field>
+<Text-field style="Text" layout="Normal"><Font size="16">LinBox minimal polynomial</Font></Text-field>
+<Text-field style="Text" layout="Normal"></Text-field>
+</Input>
+</Group>
+<Group labelreference="L194" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">lbMinpoly(A,'x');</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtc0dGJTYjUTFjb252ZXJzaW9ufnRpbWU6RigtSSNtb0dGJTYzUSIsRigvJSVmb3JtR1EmaW5maXhGKC8lJmZlbmNlR1EmZmFsc2VGKC8lKnNlcGFyYXRvckdRJXRydWVGKC8lJ2xzcGFjZUdRJDBlbUYoLyUncnNwYWNlR1EzdmVyeXRoaWNrbWF0aHNwYWNlRigvJSlzdHJldGNoeUdGOS8lKnN5bW1ldHJpY0dGOS8lKG1heHNpemVHUSlpbmZpbml0eUYoLyUobWluc2l6ZUdRIjFGKC8lKGxhcmdlb3BHRjkvJS5tb3ZhY [...]
+</Output>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNkwtSSNtb0dGJTYzUSomdW1pbnVzMDtGKC8lJWZvcm1HUSdwcmVmaXhGKC8lJmZlbmNlR1EmZmFsc2VGKC8lKnNlcGFyYXRvckdGNS8lJ2xzcGFjZUdRJDBlbUYoLyUncnNwYWNlR0Y6LyUpc3RyZXRjaHlHRjUvJSpzeW1tZXRyaWNHRjUvJShtYXhzaXplR1EpaW5maW5pdHlGKC8lKG1pbnNpemVHUSIxRigvJShsYXJnZW9wR0Y1LyUubW92YWJsZWxpbWl0c0dGNS8lJ2FjY2VudEdGNS8lMGZvbnRfc3R5bGVfbmFtZUdRKjJEf [...]
+</Output>
+</Group>
+<Group labelreference="L192" drawlabel="true">
+<Input>
+<Text-field style="Text" layout="Normal"></Text-field>
+<Text-field style="Text" layout="Normal"><Font size="16">Timing comparison</Font></Text-field>
+<Text-field style="Text" layout="Normal"></Text-field>
+</Input>
+</Group>
+<Group labelreference="L187" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">t1:=time(MinimalPolynomial(A,'x'));</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtaUdGJTY5USN0MUYoLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRigvJSVzaXplR1EjMTJGKC8lJWJvbGRHUSZmYWxzZUYoLyUnaXRhbGljR1EldHJ1ZUYoLyUqdW5kZXJsaW5lR0Y4LyUqc3Vic2NyaXB0R0Y4LyUsc3VwZXJzY3JpcHRHRjgvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRigvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYoLyUnb3BhcXVlR0Y4LyUrZXhlY3V0YWJsZUdGOC8lKXJlYWRvbmx5R [...]
+</Output>
+</Group>
+<Group labelreference="L186" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">t2:time(lbMinpoly(A,'x'));</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtc0dGJTYjUTFjb252ZXJzaW9ufnRpbWU6RigtSSNtb0dGJTYzUSIsRigvJSVmb3JtR1EmaW5maXhGKC8lJmZlbmNlR1EmZmFsc2VGKC8lKnNlcGFyYXRvckdRJXRydWVGKC8lJ2xzcGFjZUdRJDBlbUYoLyUncnNwYWNlR1EzdmVyeXRoaWNrbWF0aHNwYWNlRigvJSlzdHJldGNoeUdGOS8lKnN5bW1ldHJpY0dGOS8lKG1heHNpemVHUSlpbmZpbml0eUYoLyUobWluc2l6ZUdRIjFGKC8lKGxhcmdlb3BHRjkvJS5tb3ZhY [...]
+</Output>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSNtbkc2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGKDY5USYwLjAwN0YoLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRigvJSVzaXplR1EjMTJGKC8lJWJvbGRHUSZmYWxzZUYoLyUnaXRhbGljR0Y1LyUqdW5kZXJsaW5lR0Y1LyUqc3Vic2NyaXB0R0Y1LyUsc3VwZXJzY3JpcHRHRjUvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRigvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYoLyUnb3BhcXVlR0Y1LyUrZXhlY3V0YWJsZUdGNS8lKXJlYWRvbmx5R1EldHJ1ZUYoLyUpY29tc [...]
+</Output>
+</Group>
+<Group labelreference="L191" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">t1/t2;</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSNtbkc2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGKDY5USw0Ni45NzU2MDk3NkYoLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRigvJSVzaXplR1EjMTJGKC8lJWJvbGRHUSZmYWxzZUYoLyUnaXRhbGljR0Y1LyUqdW5kZXJsaW5lR0Y1LyUqc3Vic2NyaXB0R0Y1LyUsc3VwZXJzY3JpcHRHRjUvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRigvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYoLyUnb3BhcXVlR0Y1LyUrZXhlY3V0YWJsZUdGNS8lKXJlYWRvbmx5R1EldHJ1ZUYoL [...]
+</Output>
+</Group>
+<Group labelreference="L189" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal"></Text-field>
+</Input>
+</Group>
+</Section>
+<Section collapsed="true" MultipleChoiceAnswerIndex="-1" MultipleChoiceRandomizeChoices="false" TrueFalseAnswerIndex="-1" EssayAnswerRows="5" EssayAnswerColumns="60"><Title>
+<Text-field style="Heading 3" layout="Heading 3">Characteristic Polynomial</Text-field></Title>
+<Group labelreference="L199" drawlabel="true">
+<Input>
+<Text-field style="Text" layout="Normal"></Text-field>
+</Input>
+</Group>
+<Group labelreference="L237" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">n:=20;gen:=rand(0..10);</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtaUdGJTY5USJuRigvJSdmYW1pbHlHUTBUaW1lc35OZXd+Um9tYW5GKC8lJXNpemVHUSMxMkYoLyUlYm9sZEdRJmZhbHNlRigvJSdpdGFsaWNHUSV0cnVlRigvJSp1bmRlcmxpbmVHRjgvJSpzdWJzY3JpcHRHRjgvJSxzdXBlcnNjcmlwdEdGOC8lK2ZvcmVncm91bmRHUSpbMCwwLDI1NV1GKC8lK2JhY2tncm91bmRHUS5bMjU1LDI1NSwyNTVdRigvJSdvcGFxdWVHRjgvJStleGVjdXRhYmxlR0Y4LyUpcmVhZG9ubHlHR [...]
+</Output>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtaUdGJTY5USRnZW5GKC8lJ2ZhbWlseUdRMFRpbWVzfk5ld35Sb21hbkYoLyUlc2l6ZUdRIzEyRigvJSVib2xkR1EmZmFsc2VGKC8lJ2l0YWxpY0dRJXRydWVGKC8lKnVuZGVybGluZUdGOC8lKnN1YnNjcmlwdEdGOC8lLHN1cGVyc2NyaXB0R0Y4LyUrZm9yZWdyb3VuZEdRKlswLDAsMjU1XUYoLyUrYmFja2dyb3VuZEdRLlsyNTUsMjU1LDI1NV1GKC8lJ29wYXF1ZUdGOC8lK2V4ZWN1dGFibGVHRjgvJSlyZWFkb25se [...]
+</Output>
+</Group>
+<Group labelreference="L236" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">A:=Matrix(n,gen);</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzYlLUkjbWlHRiQ2OVEiQUYnLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRicvJSVzaXplR1EjMTJGJy8lJWJvbGRHUSZmYWxzZUYnLyUnaXRhbGljR1EldHJ1ZUYnLyUqdW5kZXJsaW5lR0Y3LyUqc3Vic2NyaXB0R0Y3LyUsc3VwZXJzY3JpcHRHRjcvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRicvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYnLyUnb3BhcXVlR0Y3LyUrZXhlY3V0YWJsZUdGNy8lKXJlYWRvbmx5R0Y6L [...]
+</Output>
+</Group>
+<Group labelreference="L199" drawlabel="true">
+<Input>
+<Text-field style="Text" layout="Normal"></Text-field>
+</Input>
+</Group>
+<Group labelreference="L197" drawlabel="true">
+<Input>
+<Text-field style="Text" layout="Normal"><Font size="16">Maple characteristic polynomial</Font></Text-field>
+<Text-field style="Text" layout="Normal"></Text-field>
+</Input>
+</Group>
+<Group labelreference="L202" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">CharacteristicPolynomial(A,'x');</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNkstRiQ2Iy1JJW1zdXBHRiU2JS1JI21pR0YlNjlRInhGKC8lJ2ZhbWlseUdRMFRpbWVzfk5ld35Sb21hbkYoLyUlc2l6ZUdRIzEyRigvJSVib2xkR1EmZmFsc2VGKC8lJ2l0YWxpY0dRJXRydWVGKC8lKnVuZGVybGluZUdGPS8lKnN1YnNjcmlwdEdGPS8lLHN1cGVyc2NyaXB0R0Y9LyUrZm9yZWdyb3VuZEdRKlswLDAsMjU1XUYoLyUrYmFja2dyb3VuZEdRLlsyNTUsMjU1LDI1NV1GKC8lJ29wYXF1ZUdGPS8lK2V4ZWN1dGFib [...]
+</Output>
+</Group>
+<Group labelreference="L198" drawlabel="true">
+<Input>
+<Text-field style="Text" layout="Normal"></Text-field>
+<Text-field style="Text" layout="Normal"><Font size="16">LinBox characteristic polynomial</Font></Text-field>
+<Text-field style="Text" layout="Normal"></Text-field>
+</Input>
+</Group>
+<Group labelreference="L208" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">lbCharpoly(A,'x');</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtc0dGJTYjUTFjb252ZXJzaW9ufnRpbWU6RigtSSNtb0dGJTYzUSIsRigvJSVmb3JtR1EmaW5maXhGKC8lJmZlbmNlR1EmZmFsc2VGKC8lKnNlcGFyYXRvckdRJXRydWVGKC8lJ2xzcGFjZUdRJDBlbUYoLyUncnNwYWNlR1EzdmVyeXRoaWNrbWF0aHNwYWNlRigvJSlzdHJldGNoeUdGOS8lKnN5bW1ldHJpY0dGOS8lKG1heHNpemVHUSlpbmZpbml0eUYoLyUobWluc2l6ZUdRIjFGKC8lKGxhcmdlb3BHRjkvJS5tb3ZhY [...]
+</Output>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNkstRiQ2Iy1JJW1zdXBHRiU2JS1JI21pR0YlNjlRInhGKC8lJ2ZhbWlseUdRMFRpbWVzfk5ld35Sb21hbkYoLyUlc2l6ZUdRIzEyRigvJSVib2xkR1EmZmFsc2VGKC8lJ2l0YWxpY0dRJXRydWVGKC8lKnVuZGVybGluZUdGPS8lKnN1YnNjcmlwdEdGPS8lLHN1cGVyc2NyaXB0R0Y9LyUrZm9yZWdyb3VuZEdRKlswLDAsMjU1XUYoLyUrYmFja2dyb3VuZEdRLlsyNTUsMjU1LDI1NV1GKC8lJ29wYXF1ZUdGPS8lK2V4ZWN1dGFib [...]
+</Output>
+</Group>
+<Group labelreference="L206" drawlabel="true">
+<Input>
+<Text-field style="Text" layout="Normal"></Text-field>
+<Text-field style="Text" layout="Normal"><Font size="16">Timing comparison</Font></Text-field>
+<Text-field style="Text" layout="Normal"></Text-field>
+</Input>
+</Group>
+<Group labelreference="L201" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">t1:=time(CharacteristicPolynomial(A,'x'));</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtaUdGJTY5USN0MUYoLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRigvJSVzaXplR1EjMTJGKC8lJWJvbGRHUSZmYWxzZUYoLyUnaXRhbGljR1EldHJ1ZUYoLyUqdW5kZXJsaW5lR0Y4LyUqc3Vic2NyaXB0R0Y4LyUsc3VwZXJzY3JpcHRHRjgvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRigvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYoLyUnb3BhcXVlR0Y4LyUrZXhlY3V0YWJsZUdGOC8lKXJlYWRvbmx5R [...]
+</Output>
+</Group>
+<Group labelreference="L200" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">t2:=time(lbCharpoly(A,'x'));</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtc0dGJTYjUTFjb252ZXJzaW9ufnRpbWU6RigtSSNtb0dGJTYzUSIsRigvJSVmb3JtR1EmaW5maXhGKC8lJmZlbmNlR1EmZmFsc2VGKC8lKnNlcGFyYXRvckdRJXRydWVGKC8lJ2xzcGFjZUdRJDBlbUYoLyUncnNwYWNlR1EzdmVyeXRoaWNrbWF0aHNwYWNlRigvJSlzdHJldGNoeUdGOS8lKnN5bW1ldHJpY0dGOS8lKG1heHNpemVHUSlpbmZpbml0eUYoLyUobWluc2l6ZUdRIjFGKC8lKGxhcmdlb3BHRjkvJS5tb3ZhY [...]
+</Output>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtaUdGJTY5USN0MkYoLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRigvJSVzaXplR1EjMTJGKC8lJWJvbGRHUSZmYWxzZUYoLyUnaXRhbGljR1EldHJ1ZUYoLyUqdW5kZXJsaW5lR0Y4LyUqc3Vic2NyaXB0R0Y4LyUsc3VwZXJzY3JpcHRHRjgvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRigvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYoLyUnb3BhcXVlR0Y4LyUrZXhlY3V0YWJsZUdGOC8lKXJlYWRvbmx5R [...]
+</Output>
+</Group>
+<Group labelreference="L205" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">t1/t2;</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSNtbkc2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGKDY5USwxNy4wMDAwMDAwMEYoLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRigvJSVzaXplR1EjMTJGKC8lJWJvbGRHUSZmYWxzZUYoLyUnaXRhbGljR0Y1LyUqdW5kZXJsaW5lR0Y1LyUqc3Vic2NyaXB0R0Y1LyUsc3VwZXJzY3JpcHRHRjUvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRigvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYoLyUnb3BhcXVlR0Y1LyUrZXhlY3V0YWJsZUdGNS8lKXJlYWRvbmx5R1EldHJ1ZUYoL [...]
+</Output>
+</Group>
+<Group labelreference="L207" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">B:=Matrix(50,gen);</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzYlLUkjbWlHRiQ2OVEiQkYnLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRicvJSVzaXplR1EjMTJGJy8lJWJvbGRHUSZmYWxzZUYnLyUnaXRhbGljR1EldHJ1ZUYnLyUqdW5kZXJsaW5lR0Y3LyUqc3Vic2NyaXB0R0Y3LyUsc3VwZXJzY3JpcHRHRjcvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRicvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYnLyUnb3BhcXVlR0Y3LyUrZXhlY3V0YWJsZUdGNy8lKXJlYWRvbmx5R0Y6L [...]
+</Output>
+</Group>
+<Group labelreference="L203" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">CharacteristicPolynomial(B,'x');</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNmJxLUkjbW9HRiU2M1EqJnVtaW51czA7RigvJSVmb3JtR1EncHJlZml4RigvJSZmZW5jZUdRJmZhbHNlRigvJSpzZXBhcmF0b3JHRjUvJSdsc3BhY2VHUSQwZW1GKC8lJ3JzcGFjZUdGOi8lKXN0cmV0Y2h5R0Y1LyUqc3ltbWV0cmljR0Y1LyUobWF4c2l6ZUdRKWluZmluaXR5RigvJShtaW5zaXplR1EiMUYoLyUobGFyZ2VvcEdGNS8lLm1vdmFibGVsaW1pdHNHRjUvJSdhY2NlbnRHRjUvJTBmb250X3N0eWxlX25hbWVHUSoyR [...]
+</Output>
+</Group>
+<Group labelreference="L238" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">lbCharpoly(B,'x');</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtc0dGJTYjUTFjb252ZXJzaW9ufnRpbWU6RigtSSNtb0dGJTYzUSIsRigvJSVmb3JtR1EmaW5maXhGKC8lJmZlbmNlR1EmZmFsc2VGKC8lKnNlcGFyYXRvckdRJXRydWVGKC8lJ2xzcGFjZUdRJDBlbUYoLyUncnNwYWNlR1EzdmVyeXRoaWNrbWF0aHNwYWNlRigvJSlzdHJldGNoeUdGOS8lKnN5bW1ldHJpY0dGOS8lKG1heHNpemVHUSlpbmZpbml0eUYoLyUobWluc2l6ZUdRIjFGKC8lKGxhcmdlb3BHRjkvJS5tb3ZhY [...]
+</Output>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNmJxLUkjbW9HRiU2M1EqJnVtaW51czA7RigvJSVmb3JtR1EncHJlZml4RigvJSZmZW5jZUdRJmZhbHNlRigvJSpzZXBhcmF0b3JHRjUvJSdsc3BhY2VHUSQwZW1GKC8lJ3JzcGFjZUdGOi8lKXN0cmV0Y2h5R0Y1LyUqc3ltbWV0cmljR0Y1LyUobWF4c2l6ZUdRKWluZmluaXR5RigvJShtaW5zaXplR1EiMUYoLyUobGFyZ2VvcEdGNS8lLm1vdmFibGVsaW1pdHNHRjUvJSdhY2NlbnRHRjUvJTBmb250X3N0eWxlX25hbWVHUSoyR [...]
+</Output>
+</Group>
+<Group labelreference="L241" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">t1:=time(CharacteristicPolynomial(B,'x'));</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtaUdGJTY5USN0MUYoLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRigvJSVzaXplR1EjMTJGKC8lJWJvbGRHUSZmYWxzZUYoLyUnaXRhbGljR1EldHJ1ZUYoLyUqdW5kZXJsaW5lR0Y4LyUqc3Vic2NyaXB0R0Y4LyUsc3VwZXJzY3JpcHRHRjgvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRigvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYoLyUnb3BhcXVlR0Y4LyUrZXhlY3V0YWJsZUdGOC8lKXJlYWRvbmx5R [...]
+</Output>
+</Group>
+<Group labelreference="L242" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">t2:time(lbCharpoly(B,'x'));</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtc0dGJTYjUTFjb252ZXJzaW9ufnRpbWU6RigtSSNtb0dGJTYzUSIsRigvJSVmb3JtR1EmaW5maXhGKC8lJmZlbmNlR1EmZmFsc2VGKC8lKnNlcGFyYXRvckdRJXRydWVGKC8lJ2xzcGFjZUdRJDBlbUYoLyUncnNwYWNlR1EzdmVyeXRoaWNrbWF0aHNwYWNlRigvJSlzdHJldGNoeUdGOS8lKnN5bW1ldHJpY0dGOS8lKG1heHNpemVHUSlpbmZpbml0eUYoLyUobWluc2l6ZUdRIjFGKC8lKGxhcmdlb3BHRjkvJS5tb3ZhY [...]
+</Output>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSNtbkc2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGKDY5USYwLjA4MkYoLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRigvJSVzaXplR1EjMTJGKC8lJWJvbGRHUSZmYWxzZUYoLyUnaXRhbGljR0Y1LyUqdW5kZXJsaW5lR0Y1LyUqc3Vic2NyaXB0R0Y1LyUsc3VwZXJzY3JpcHRHRjUvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRigvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYoLyUnb3BhcXVlR0Y1LyUrZXhlY3V0YWJsZUdGNS8lKXJlYWRvbmx5R1EldHJ1ZUYoLyUpY29tc [...]
+</Output>
+</Group>
+<Group labelreference="L240" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">t1/t2;</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSNtbkc2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGKDY5USw3NzYuNTAwMDAwMEYoLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRigvJSVzaXplR1EjMTJGKC8lJWJvbGRHUSZmYWxzZUYoLyUnaXRhbGljR0Y1LyUqdW5kZXJsaW5lR0Y1LyUqc3Vic2NyaXB0R0Y1LyUsc3VwZXJzY3JpcHRHRjUvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRigvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYoLyUnb3BhcXVlR0Y1LyUrZXhlY3V0YWJsZUdGNS8lKXJlYWRvbmx5R1EldHJ1ZUYoL [...]
+</Output>
+</Group>
+<Group labelreference="L239" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal"></Text-field>
+</Input>
+</Group>
+</Section>
+<Section collapsed="true" MultipleChoiceAnswerIndex="-1" MultipleChoiceRandomizeChoices="false" TrueFalseAnswerIndex="-1" EssayAnswerRows="5" EssayAnswerColumns="60"><Title>
+<Text-field style="Heading 3" layout="Heading 3">Linear System Solving</Text-field></Title>
+<Text-field style="Text" layout="Normal"></Text-field>
+<Group labelreference="L244" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">n:=200;gen:=rand(0..10);</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtaUdGJTY5USJuRigvJSdmYW1pbHlHUTBUaW1lc35OZXd+Um9tYW5GKC8lJXNpemVHUSMxMkYoLyUlYm9sZEdRJmZhbHNlRigvJSdpdGFsaWNHUSV0cnVlRigvJSp1bmRlcmxpbmVHRjgvJSpzdWJzY3JpcHRHRjgvJSxzdXBlcnNjcmlwdEdGOC8lK2ZvcmVncm91bmRHUSpbMCwwLDI1NV1GKC8lK2JhY2tncm91bmRHUS5bMjU1LDI1NSwyNTVdRigvJSdvcGFxdWVHRjgvJStleGVjdXRhYmxlR0Y4LyUpcmVhZG9ubHlHR [...]
+</Output>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtaUdGJTY5USRnZW5GKC8lJ2ZhbWlseUdRMFRpbWVzfk5ld35Sb21hbkYoLyUlc2l6ZUdRIzEyRigvJSVib2xkR1EmZmFsc2VGKC8lJ2l0YWxpY0dRJXRydWVGKC8lKnVuZGVybGluZUdGOC8lKnN1YnNjcmlwdEdGOC8lLHN1cGVyc2NyaXB0R0Y4LyUrZm9yZWdyb3VuZEdRKlswLDAsMjU1XUYoLyUrYmFja2dyb3VuZEdRLlsyNTUsMjU1LDI1NV1GKC8lJ29wYXF1ZUdGOC8lK2V4ZWN1dGFibGVHRjgvJSlyZWFkb25se [...]
+</Output>
+</Group>
+<Group labelreference="L243" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">A:=Matrix(n,gen);b:=Vector(n,gen);</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzYlLUkjbWlHRiQ2OVEiQUYnLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRicvJSVzaXplR1EjMTJGJy8lJWJvbGRHUSZmYWxzZUYnLyUnaXRhbGljR1EldHJ1ZUYnLyUqdW5kZXJsaW5lR0Y3LyUqc3Vic2NyaXB0R0Y3LyUsc3VwZXJzY3JpcHRHRjcvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRicvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYnLyUnb3BhcXVlR0Y3LyUrZXhlY3V0YWJsZUdGNy8lKXJlYWRvbmx5R0Y6L [...]
+</Output>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzYlLUkjbWlHRiQ2OVEiYkYnLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRicvJSVzaXplR1EjMTJGJy8lJWJvbGRHUSZmYWxzZUYnLyUnaXRhbGljR1EldHJ1ZUYnLyUqdW5kZXJsaW5lR0Y3LyUqc3Vic2NyaXB0R0Y3LyUsc3VwZXJzY3JpcHRHRjcvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRicvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYnLyUnb3BhcXVlR0Y3LyUrZXhlY3V0YWJsZUdGNy8lKXJlYWRvbmx5R0Y6L [...]
+</Output>
+</Group>
+<Group labelreference="L245" drawlabel="true">
+<Input>
+<Text-field style="Text" layout="Normal"></Text-field>
+</Input>
+</Group>
+<Group labelreference="L213" drawlabel="true">
+<Input>
+<Text-field style="Text" layout="Normal"></Text-field>
+</Input>
+</Group>
+<Group labelreference="L211" drawlabel="true">
+<Input>
+<Text-field style="Text" layout="Normal"><Font size="16">Maple linear system solving</Font></Text-field>
+<Text-field style="Text" layout="Normal"></Text-field>
+</Input>
+</Group>
+<Group labelreference="L216" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">x1:=LinearSolve(A,b, method=modular);x1[1];</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzYlLUkjbWlHRiQ2OVEjeDFGJy8lJ2ZhbWlseUdRMFRpbWVzfk5ld35Sb21hbkYnLyUlc2l6ZUdRIzEyRicvJSVib2xkR1EmZmFsc2VGJy8lJ2l0YWxpY0dRJXRydWVGJy8lKnVuZGVybGluZUdGNy8lKnN1YnNjcmlwdEdGNy8lLHN1cGVyc2NyaXB0R0Y3LyUrZm9yZWdyb3VuZEdRKlswLDAsMjU1XUYnLyUrYmFja2dyb3VuZEdRLlsyNTUsMjU1LDI1NV1GJy8lJ29wYXF1ZUdGNy8lK2V4ZWN1dGFibGVHRjcvJSlyZWFkb25seUdGO [...]
+</Output>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSZtZnJhY0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGKDYqLUkjbW5HRiU2OVFhXWwmbWludXM7NTI3NDE2MTU0NzUxOTUxMDIzMTE3MTU1OTY4NjczNTQ2NDg0MjE2MzA0MTM3MTk5MjE2OTM0MDkxODcxNTUxMTg3Mjg4MjA0MDg4NjE5MjIwNDczNjMxNDQ1NTEwOTI5ODE4MDU0NzM3MDg3Mjc4NTk3MDUzNzYxNzg3MTQ3ODU1MjQxNTM2NzU0NDYxMTE1MTE1OTgxOTMxNzM5NzU4MTk3MTkwNDYxNjAzNDAxMDA4MzEzNjI4MDkyNTQzOTg0MjY0MzY3NTEyNjA0Mzg4NDk5NDM4ODU0M [...]
+</Output>
+</Group>
+<Group labelreference="L212" drawlabel="true">
+<Input>
+<Text-field style="Text" layout="Normal"></Text-field>
+<Text-field style="Text" layout="Normal"><Font size="16">LinBox linear system solving</Font></Text-field>
+<Text-field style="Text" layout="Normal"></Text-field>
+</Input>
+</Group>
+<Group labelreference="L222" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">x2:=lbSolve(A,b);x2[1];</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtc0dGJTYjUTFjb252ZXJzaW9ufnRpbWU6RigtSSNtb0dGJTYzUSIsRigvJSVmb3JtR1EmaW5maXhGKC8lJmZlbmNlR1EmZmFsc2VGKC8lKnNlcGFyYXRvckdRJXRydWVGKC8lJ2xzcGFjZUdRJDBlbUYoLyUncnNwYWNlR1EzdmVyeXRoaWNrbWF0aHNwYWNlRigvJSlzdHJldGNoeUdGOS8lKnN5bW1ldHJpY0dGOS8lKG1heHNpemVHUSlpbmZpbml0eUYoLyUobWluc2l6ZUdRIjFGKC8lKGxhcmdlb3BHRjkvJS5tb3ZhY [...]
+</Output>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzYlLUkjbWlHRiQ2OVEjeDJGJy8lJ2ZhbWlseUdRMFRpbWVzfk5ld35Sb21hbkYnLyUlc2l6ZUdRIzEyRicvJSVib2xkR1EmZmFsc2VGJy8lJ2l0YWxpY0dRJXRydWVGJy8lKnVuZGVybGluZUdGNy8lKnN1YnNjcmlwdEdGNy8lLHN1cGVyc2NyaXB0R0Y3LyUrZm9yZWdyb3VuZEdRKlswLDAsMjU1XUYnLyUrYmFja2dyb3VuZEdRLlsyNTUsMjU1LDI1NV1GJy8lJ29wYXF1ZUdGNy8lK2V4ZWN1dGFibGVHRjcvJSlyZWFkb25seUdGO [...]
+</Output>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSZtZnJhY0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGKDYqLUkjbW5HRiU2OVFhXWwmbWludXM7NTI3NDE2MTU0NzUxOTUxMDIzMTE3MTU1OTY4NjczNTQ2NDg0MjE2MzA0MTM3MTk5MjE2OTM0MDkxODcxNTUxMTg3Mjg4MjA0MDg4NjE5MjIwNDczNjMxNDQ1NTEwOTI5ODE4MDU0NzM3MDg3Mjc4NTk3MDUzNzYxNzg3MTQ3ODU1MjQxNTM2NzU0NDYxMTE1MTE1OTgxOTMxNzM5NzU4MTk3MTkwNDYxNjAzNDAxMDA4MzEzNjI4MDkyNTQzOTg0MjY0MzY3NTEyNjA0Mzg4NDk5NDM4ODU0M [...]
+</Output>
+</Group>
+<Group labelreference="L246" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal"></Text-field>
+</Input>
+</Group>
+<Group labelreference="L247" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal"></Text-field>
+</Input>
+</Group>
+<Group labelreference="L220" drawlabel="true">
+<Input>
+<Text-field style="Text" layout="Normal"></Text-field>
+<Text-field style="Text" layout="Normal"><Font size="16">Timing comparison</Font></Text-field>
+<Text-field style="Text" layout="Normal"></Text-field>
+</Input>
+</Group>
+<Group labelreference="L215" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">t1:=time(LinearSolve(A,b,method=modular));</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtaUdGJTY5USN0MUYoLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRigvJSVzaXplR1EjMTJGKC8lJWJvbGRHUSZmYWxzZUYoLyUnaXRhbGljR1EldHJ1ZUYoLyUqdW5kZXJsaW5lR0Y4LyUqc3Vic2NyaXB0R0Y4LyUsc3VwZXJzY3JpcHRHRjgvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRigvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYoLyUnb3BhcXVlR0Y4LyUrZXhlY3V0YWJsZUdGOC8lKXJlYWRvbmx5R [...]
+</Output>
+</Group>
+<Group labelreference="L214" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">t2:=time(lbSolve(A,b));</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtc0dGJTYjUTFjb252ZXJzaW9ufnRpbWU6RigtSSNtb0dGJTYzUSIsRigvJSVmb3JtR1EmaW5maXhGKC8lJmZlbmNlR1EmZmFsc2VGKC8lKnNlcGFyYXRvckdRJXRydWVGKC8lJ2xzcGFjZUdRJDBlbUYoLyUncnNwYWNlR1EzdmVyeXRoaWNrbWF0aHNwYWNlRigvJSlzdHJldGNoeUdGOS8lKnN5bW1ldHJpY0dGOS8lKG1heHNpemVHUSlpbmZpbml0eUYoLyUobWluc2l6ZUdRIjFGKC8lKGxhcmdlb3BHRjkvJS5tb3ZhY [...]
+</Output>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtaUdGJTY5USN0MkYoLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRigvJSVzaXplR1EjMTJGKC8lJWJvbGRHUSZmYWxzZUYoLyUnaXRhbGljR1EldHJ1ZUYoLyUqdW5kZXJsaW5lR0Y4LyUqc3Vic2NyaXB0R0Y4LyUsc3VwZXJzY3JpcHRHRjgvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRigvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYoLyUnb3BhcXVlR0Y4LyUrZXhlY3V0YWJsZUdGOC8lKXJlYWRvbmx5R [...]
+</Output>
+</Group>
+<Group labelreference="L219" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">t1/t2;</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSNtbkc2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGKDY5USwxNC4yODE3MzM3NUYoLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRigvJSVzaXplR1EjMTJGKC8lJWJvbGRHUSZmYWxzZUYoLyUnaXRhbGljR0Y1LyUqdW5kZXJsaW5lR0Y1LyUqc3Vic2NyaXB0R0Y1LyUsc3VwZXJzY3JpcHRHRjUvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRigvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYoLyUnb3BhcXVlR0Y1LyUrZXhlY3V0YWJsZUdGNS8lKXJlYWRvbmx5R1EldHJ1ZUYoL [...]
+</Output>
+</Group>
+<Group labelreference="L221" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">n:=300;B:=Matrix(n,gen);b1:=Vector(n,gen);</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtaUdGJTY5USJuRigvJSdmYW1pbHlHUTBUaW1lc35OZXd+Um9tYW5GKC8lJXNpemVHUSMxMkYoLyUlYm9sZEdRJmZhbHNlRigvJSdpdGFsaWNHUSV0cnVlRigvJSp1bmRlcmxpbmVHRjgvJSpzdWJzY3JpcHRHRjgvJSxzdXBlcnNjcmlwdEdGOC8lK2ZvcmVncm91bmRHUSpbMCwwLDI1NV1GKC8lK2JhY2tncm91bmRHUS5bMjU1LDI1NSwyNTVdRigvJSdvcGFxdWVHRjgvJStleGVjdXRhYmxlR0Y4LyUpcmVhZG9ubHlHR [...]
+</Output>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzYlLUkjbWlHRiQ2OVEiQkYnLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRicvJSVzaXplR1EjMTJGJy8lJWJvbGRHUSZmYWxzZUYnLyUnaXRhbGljR1EldHJ1ZUYnLyUqdW5kZXJsaW5lR0Y3LyUqc3Vic2NyaXB0R0Y3LyUsc3VwZXJzY3JpcHRHRjcvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRicvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYnLyUnb3BhcXVlR0Y3LyUrZXhlY3V0YWJsZUdGNy8lKXJlYWRvbmx5R0Y6L [...]
+</Output>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzYlLUkjbWlHRiQ2OVEjYjFGJy8lJ2ZhbWlseUdRMFRpbWVzfk5ld35Sb21hbkYnLyUlc2l6ZUdRIzEyRicvJSVib2xkR1EmZmFsc2VGJy8lJ2l0YWxpY0dRJXRydWVGJy8lKnVuZGVybGluZUdGNy8lKnN1YnNjcmlwdEdGNy8lLHN1cGVyc2NyaXB0R0Y3LyUrZm9yZWdyb3VuZEdRKlswLDAsMjU1XUYnLyUrYmFja2dyb3VuZEdRLlsyNTUsMjU1LDI1NV1GJy8lJ29wYXF1ZUdGNy8lK2V4ZWN1dGFibGVHRjcvJSlyZWFkb25seUdGO [...]
+</Output>
+</Group>
+<Group labelreference="L223" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">t1:=time(LinearSolve(B,b1, method=modular));</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtaUdGJTY5USN0MUYoLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRigvJSVzaXplR1EjMTJGKC8lJWJvbGRHUSZmYWxzZUYoLyUnaXRhbGljR1EldHJ1ZUYoLyUqdW5kZXJsaW5lR0Y4LyUqc3Vic2NyaXB0R0Y4LyUsc3VwZXJzY3JpcHRHRjgvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRigvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYoLyUnb3BhcXVlR0Y4LyUrZXhlY3V0YWJsZUdGOC8lKXJlYWRvbmx5R [...]
+</Output>
+</Group>
+<Group labelreference="L218" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">t2:time(lbSolve(B,b1));</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtc0dGJTYjUTFjb252ZXJzaW9ufnRpbWU6RigtSSNtb0dGJTYzUSIsRigvJSVmb3JtR1EmaW5maXhGKC8lJmZlbmNlR1EmZmFsc2VGKC8lKnNlcGFyYXRvckdRJXRydWVGKC8lJ2xzcGFjZUdRJDBlbUYoLyUncnNwYWNlR1EzdmVyeXRoaWNrbWF0aHNwYWNlRigvJSlzdHJldGNoeUdGOS8lKnN5bW1ldHJpY0dGOS8lKG1heHNpemVHUSlpbmZpbml0eUYoLyUobWluc2l6ZUdRIjFGKC8lKGxhcmdlb3BHRjkvJS5tb3ZhY [...]
+</Output>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSNtbkc2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGKDY5USYwLjgwNUYoLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRigvJSVzaXplR1EjMTJGKC8lJWJvbGRHUSZmYWxzZUYoLyUnaXRhbGljR0Y1LyUqdW5kZXJsaW5lR0Y1LyUqc3Vic2NyaXB0R0Y1LyUsc3VwZXJzY3JpcHRHRjUvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRigvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYoLyUnb3BhcXVlR0Y1LyUrZXhlY3V0YWJsZUdGNS8lKXJlYWRvbmx5R1EldHJ1ZUYoLyUpY29tc [...]
+</Output>
+</Group>
+<Group labelreference="L224" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">t1/t2;</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSNtbkc2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGKDY5USw0My4zNzQ2MTMwMEYoLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRigvJSVzaXplR1EjMTJGKC8lJWJvbGRHUSZmYWxzZUYoLyUnaXRhbGljR0Y1LyUqdW5kZXJsaW5lR0Y1LyUqc3Vic2NyaXB0R0Y1LyUsc3VwZXJzY3JpcHRHRjUvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRigvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYoLyUnb3BhcXVlR0Y1LyUrZXhlY3V0YWJsZUdGNS8lKXJlYWRvbmx5R1EldHJ1ZUYoL [...]
+</Output>
+</Group>
+<Group labelreference="L217" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal"></Text-field>
+</Input>
+</Group>
+</Section>
+<Group labelreference="L182" drawlabel="true">
+<Input>
+<Text-field style="Text" layout="Normal"></Text-field>
+</Input>
+</Group>
+</Section>
+<Section collapsed="true" MultipleChoiceAnswerIndex="-1" MultipleChoiceRandomizeChoices="false" TrueFalseAnswerIndex="-1" EssayAnswerRows="5" EssayAnswerColumns="60"><Title>
+<Text-field style="Heading 2" layout="Heading 2">Computation over finite fields</Text-field></Title>
+<Text-field style="Text" layout="Normal"></Text-field>
+<Group labelreference="L285" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">restart():with(LinBox):with(LinearAlgebra):</Text-field>
+</Input>
+</Group>
+<Section collapsed="true" MultipleChoiceAnswerIndex="-1" MultipleChoiceRandomizeChoices="false" TrueFalseAnswerIndex="-1" EssayAnswerRows="5" EssayAnswerColumns="60"><Title>
+<Text-field style="Heading 3" layout="Heading 3">Determinant</Text-field></Title>
+<Group labelreference="L130" drawlabel="true">
+<Input>
+<Text-field style="Text" layout="Normal"></Text-field>
+</Input>
+</Group>
+<Group labelreference="L256" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">n:=1000;p:=17;gen:=rand(0..p-1);</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtaUdGJTY5USJuRigvJSdmYW1pbHlHUTBUaW1lc35OZXd+Um9tYW5GKC8lJXNpemVHUSMxMkYoLyUlYm9sZEdRJmZhbHNlRigvJSdpdGFsaWNHUSV0cnVlRigvJSp1bmRlcmxpbmVHRjgvJSpzdWJzY3JpcHRHRjgvJSxzdXBlcnNjcmlwdEdGOC8lK2ZvcmVncm91bmRHUSpbMCwwLDI1NV1GKC8lK2JhY2tncm91bmRHUS5bMjU1LDI1NSwyNTVdRigvJSdvcGFxdWVHRjgvJStleGVjdXRhYmxlR0Y4LyUpcmVhZG9ubHlHR [...]
+</Output>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtaUdGJTY5USJwRigvJSdmYW1pbHlHUTBUaW1lc35OZXd+Um9tYW5GKC8lJXNpemVHUSMxMkYoLyUlYm9sZEdRJmZhbHNlRigvJSdpdGFsaWNHUSV0cnVlRigvJSp1bmRlcmxpbmVHRjgvJSpzdWJzY3JpcHRHRjgvJSxzdXBlcnNjcmlwdEdGOC8lK2ZvcmVncm91bmRHUSpbMCwwLDI1NV1GKC8lK2JhY2tncm91bmRHUS5bMjU1LDI1NSwyNTVdRigvJSdvcGFxdWVHRjgvJStleGVjdXRhYmxlR0Y4LyUpcmVhZG9ubHlHR [...]
+</Output>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtaUdGJTY5USRnZW5GKC8lJ2ZhbWlseUdRMFRpbWVzfk5ld35Sb21hbkYoLyUlc2l6ZUdRIzEyRigvJSVib2xkR1EmZmFsc2VGKC8lJ2l0YWxpY0dRJXRydWVGKC8lKnVuZGVybGluZUdGOC8lKnN1YnNjcmlwdEdGOC8lLHN1cGVyc2NyaXB0R0Y4LyUrZm9yZWdyb3VuZEdRKlswLDAsMjU1XUYoLyUrYmFja2dyb3VuZEdRLlsyNTUsMjU1LDI1NV1GKC8lJ29wYXF1ZUdGOC8lK2V4ZWN1dGFibGVHRjgvJSlyZWFkb25se [...]
+</Output>
+</Group>
+<Group labelreference="L257" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">A:=Matrix(n,gen,datatype=integer[4]);B:=Modular:-Mod(p,A, integer[4]);</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzYlLUkjbWlHRiQ2OVEiQUYnLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRicvJSVzaXplR1EjMTJGJy8lJWJvbGRHUSZmYWxzZUYnLyUnaXRhbGljR1EldHJ1ZUYnLyUqdW5kZXJsaW5lR0Y3LyUqc3Vic2NyaXB0R0Y3LyUsc3VwZXJzY3JpcHRHRjcvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRicvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYnLyUnb3BhcXVlR0Y3LyUrZXhlY3V0YWJsZUdGNy8lKXJlYWRvbmx5R0Y6L [...]
+</Output>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzYlLUkjbWlHRiQ2OVEiQkYnLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRicvJSVzaXplR1EjMTJGJy8lJWJvbGRHUSZmYWxzZUYnLyUnaXRhbGljR1EldHJ1ZUYnLyUqdW5kZXJsaW5lR0Y3LyUqc3Vic2NyaXB0R0Y3LyUsc3VwZXJzY3JpcHRHRjcvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRicvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYnLyUnb3BhcXVlR0Y3LyUrZXhlY3V0YWJsZUdGNy8lKXJlYWRvbmx5R0Y6L [...]
+</Output>
+</Group>
+<Group labelreference="L255" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal"></Text-field>
+</Input>
+</Group>
+<Group labelreference="L128" drawlabel="true">
+<Input>
+<Text-field style="Text" layout="Normal"> <Font size="16">Maple determinant</Font></Text-field>
+<Text-field style="Text" layout="Normal"></Text-field>
+</Input>
+</Group>
+<Group labelreference="L148" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">Modular:-Determinant(p,B);</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSNtbkc2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGKDY5USMxMkYoLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRigvJSVzaXplR1EjMTJGKC8lJWJvbGRHUSZmYWxzZUYoLyUnaXRhbGljR0Y1LyUqdW5kZXJsaW5lR0Y1LyUqc3Vic2NyaXB0R0Y1LyUsc3VwZXJzY3JpcHRHRjUvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRigvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYoLyUnb3BhcXVlR0Y1LyUrZXhlY3V0YWJsZUdGNS8lKXJlYWRvbmx5R1EldHJ1ZUYoLyUpY29tcG9zZ [...]
+</Output>
+</Group>
+<Group labelreference="L151" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">Determinant(A,method=modular[p]);</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSNtbkc2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGKDY5USMxMkYoLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRigvJSVzaXplR1EjMTJGKC8lJWJvbGRHUSZmYWxzZUYoLyUnaXRhbGljR0Y1LyUqdW5kZXJsaW5lR0Y1LyUqc3Vic2NyaXB0R0Y1LyUsc3VwZXJzY3JpcHRHRjUvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRigvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYoLyUnb3BhcXVlR0Y1LyUrZXhlY3V0YWJsZUdGNS8lKXJlYWRvbmx5R1EldHJ1ZUYoLyUpY29tcG9zZ [...]
+</Output>
+</Group>
+<Group labelreference="L152" drawlabel="true">
+<Input>
+<Text-field style="Text" layout="Normal"> </Text-field>
+<Text-field style="Text" layout="Normal"><Font size="16">LinBox determinant</Font></Text-field>
+<Text-field style="Text" layout="Normal"></Text-field>
+</Input>
+</Group>
+<Group labelreference="L122" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">lbDeterminant(p, A);</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtc0dGJTYjUTFjb252ZXJzaW9ufnRpbWU6RigtSSNtb0dGJTYzUSIsRigvJSVmb3JtR1EmaW5maXhGKC8lJmZlbmNlR1EmZmFsc2VGKC8lKnNlcGFyYXRvckdRJXRydWVGKC8lJ2xzcGFjZUdRJDBlbUYoLyUncnNwYWNlR1EzdmVyeXRoaWNrbWF0aHNwYWNlRigvJSlzdHJldGNoeUdGOS8lKnN5bW1ldHJpY0dGOS8lKG1heHNpemVHUSlpbmZpbml0eUYoLyUobWluc2l6ZUdRIjFGKC8lKGxhcmdlb3BHRjkvJS5tb3ZhY [...]
+</Output>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSNtbkc2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGKDY5USMxMkYoLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRigvJSVzaXplR1EjMTJGKC8lJWJvbGRHUSZmYWxzZUYoLyUnaXRhbGljR0Y1LyUqdW5kZXJsaW5lR0Y1LyUqc3Vic2NyaXB0R0Y1LyUsc3VwZXJzY3JpcHRHRjUvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRigvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYoLyUnb3BhcXVlR0Y1LyUrZXhlY3V0YWJsZUdGNS8lKXJlYWRvbmx5R1EldHJ1ZUYoLyUpY29tcG9zZ [...]
+</Output>
+</Group>
+<Group labelreference="L141" drawlabel="true">
+<Input>
+<Text-field style="Text" layout="Normal"></Text-field>
+<Text-field style="Text" layout="Normal"><Font size="16">Timing comparison</Font></Text-field>
+<Text-field style="Text" layout="Normal"></Text-field>
+</Input>
+</Group>
+<Group labelreference="L131" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">t1:=time(Modular:-Determinant(p,B));</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtaUdGJTY5USN0MUYoLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRigvJSVzaXplR1EjMTJGKC8lJWJvbGRHUSZmYWxzZUYoLyUnaXRhbGljR1EldHJ1ZUYoLyUqdW5kZXJsaW5lR0Y4LyUqc3Vic2NyaXB0R0Y4LyUsc3VwZXJzY3JpcHRHRjgvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRigvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYoLyUnb3BhcXVlR0Y4LyUrZXhlY3V0YWJsZUdGOC8lKXJlYWRvbmx5R [...]
+</Output>
+</Group>
+<Group labelreference="L168" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">t2:=time(Determinant(A,method=modular[p]));</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtaUdGJTY5USN0MkYoLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRigvJSVzaXplR1EjMTJGKC8lJWJvbGRHUSZmYWxzZUYoLyUnaXRhbGljR1EldHJ1ZUYoLyUqdW5kZXJsaW5lR0Y4LyUqc3Vic2NyaXB0R0Y4LyUsc3VwZXJzY3JpcHRHRjgvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRigvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYoLyUnb3BhcXVlR0Y4LyUrZXhlY3V0YWJsZUdGOC8lKXJlYWRvbmx5R [...]
+</Output>
+</Group>
+<Group labelreference="L138" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">t3:=time(lbDeterminant(p,A));</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtc0dGJTYjUTFjb252ZXJzaW9ufnRpbWU6RigtSSNtb0dGJTYzUSIsRigvJSVmb3JtR1EmaW5maXhGKC8lJmZlbmNlR1EmZmFsc2VGKC8lKnNlcGFyYXRvckdRJXRydWVGKC8lJ2xzcGFjZUdRJDBlbUYoLyUncnNwYWNlR1EzdmVyeXRoaWNrbWF0aHNwYWNlRigvJSlzdHJldGNoeUdGOS8lKnN5bW1ldHJpY0dGOS8lKG1heHNpemVHUSlpbmZpbml0eUYoLyUobWluc2l6ZUdRIjFGKC8lKGxhcmdlb3BHRjkvJS5tb3ZhY [...]
+</Output>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtaUdGJTY5USN0M0YoLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRigvJSVzaXplR1EjMTJGKC8lJWJvbGRHUSZmYWxzZUYoLyUnaXRhbGljR1EldHJ1ZUYoLyUqdW5kZXJsaW5lR0Y4LyUqc3Vic2NyaXB0R0Y4LyUsc3VwZXJzY3JpcHRHRjgvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRigvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYoLyUnb3BhcXVlR0Y4LyUrZXhlY3V0YWJsZUdGOC8lKXJlYWRvbmx5R [...]
+</Output>
+</Group>
+<Group labelreference="L153" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">t1/t3;t2/t3; </Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSNtbkc2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGKDY5USwxLjM4NTUyNjMxNkYoLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRigvJSVzaXplR1EjMTJGKC8lJWJvbGRHUSZmYWxzZUYoLyUnaXRhbGljR0Y1LyUqdW5kZXJsaW5lR0Y1LyUqc3Vic2NyaXB0R0Y1LyUsc3VwZXJzY3JpcHRHRjUvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRigvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYoLyUnb3BhcXVlR0Y1LyUrZXhlY3V0YWJsZUdGNS8lKXJlYWRvbmx5R1EldHJ1ZUYoL [...]
+</Output>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSNtbkc2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGKDY5USwyLjA5NDczNjg0MkYoLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRigvJSVzaXplR1EjMTJGKC8lJWJvbGRHUSZmYWxzZUYoLyUnaXRhbGljR0Y1LyUqdW5kZXJsaW5lR0Y1LyUqc3Vic2NyaXB0R0Y1LyUsc3VwZXJzY3JpcHRHRjUvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRigvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYoLyUnb3BhcXVlR0Y1LyUrZXhlY3V0YWJsZUdGNS8lKXJlYWRvbmx5R1EldHJ1ZUYoL [...]
+</Output>
+</Group>
+<Group labelreference="L140" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal"></Text-field>
+</Input>
+</Group>
+<Group labelreference="L150" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal"></Text-field>
+</Input>
+</Group>
+</Section>
+<Section collapsed="true" MultipleChoiceAnswerIndex="-1" MultipleChoiceRandomizeChoices="false" TrueFalseAnswerIndex="-1" EssayAnswerRows="5" EssayAnswerColumns="60"><Title>
+<Text-field style="Heading 3" layout="Heading 3">Rank</Text-field></Title>
+<Group labelreference="L123" drawlabel="true">
+<Input>
+<Text-field style="Text" layout="Normal"></Text-field>
+</Input>
+</Group>
+<Group labelreference="L346" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">restart():with(LinBox):with(LinearAlgebra):</Text-field>
+</Input>
+</Group>
+<Group labelreference="L259" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">n:=1000;p:=17;gen:=rand(0..p-1);</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtaUdGJTY5USJuRigvJSdmYW1pbHlHUTBUaW1lc35OZXd+Um9tYW5GKC8lJXNpemVHUSMxMkYoLyUlYm9sZEdRJmZhbHNlRigvJSdpdGFsaWNHUSV0cnVlRigvJSp1bmRlcmxpbmVHRjgvJSpzdWJzY3JpcHRHRjgvJSxzdXBlcnNjcmlwdEdGOC8lK2ZvcmVncm91bmRHUSpbMCwwLDI1NV1GKC8lK2JhY2tncm91bmRHUS5bMjU1LDI1NSwyNTVdRigvJSdvcGFxdWVHRjgvJStleGVjdXRhYmxlR0Y4LyUpcmVhZG9ubHlHR [...]
+</Output>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtaUdGJTY5USJwRigvJSdmYW1pbHlHUTBUaW1lc35OZXd+Um9tYW5GKC8lJXNpemVHUSMxMkYoLyUlYm9sZEdRJmZhbHNlRigvJSdpdGFsaWNHUSV0cnVlRigvJSp1bmRlcmxpbmVHRjgvJSpzdWJzY3JpcHRHRjgvJSxzdXBlcnNjcmlwdEdGOC8lK2ZvcmVncm91bmRHUSpbMCwwLDI1NV1GKC8lK2JhY2tncm91bmRHUS5bMjU1LDI1NSwyNTVdRigvJSdvcGFxdWVHRjgvJStleGVjdXRhYmxlR0Y4LyUpcmVhZG9ubHlHR [...]
+</Output>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtaUdGJTY5USRnZW5GKC8lJ2ZhbWlseUdRMFRpbWVzfk5ld35Sb21hbkYoLyUlc2l6ZUdRIzEyRigvJSVib2xkR1EmZmFsc2VGKC8lJ2l0YWxpY0dRJXRydWVGKC8lKnVuZGVybGluZUdGOC8lKnN1YnNjcmlwdEdGOC8lLHN1cGVyc2NyaXB0R0Y4LyUrZm9yZWdyb3VuZEdRKlswLDAsMjU1XUYoLyUrYmFja2dyb3VuZEdRLlsyNTUsMjU1LDI1NV1GKC8lJ29wYXF1ZUdGOC8lK2V4ZWN1dGFibGVHRjgvJSlyZWFkb25se [...]
+</Output>
+</Group>
+<Group labelreference="L260" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">A:=Matrix(n,gen,datatype=integer[4]);B:=Modular:-Mod(p,A, integer[4]);</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzYlLUkjbWlHRiQ2OVEiQUYnLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRicvJSVzaXplR1EjMTJGJy8lJWJvbGRHUSZmYWxzZUYnLyUnaXRhbGljR1EldHJ1ZUYnLyUqdW5kZXJsaW5lR0Y3LyUqc3Vic2NyaXB0R0Y3LyUsc3VwZXJzY3JpcHRHRjcvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRicvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYnLyUnb3BhcXVlR0Y3LyUrZXhlY3V0YWJsZUdGNy8lKXJlYWRvbmx5R0Y6L [...]
+</Output>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzYlLUkjbWlHRiQ2OVEiQkYnLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRicvJSVzaXplR1EjMTJGJy8lJWJvbGRHUSZmYWxzZUYnLyUnaXRhbGljR1EldHJ1ZUYnLyUqdW5kZXJsaW5lR0Y3LyUqc3Vic2NyaXB0R0Y3LyUsc3VwZXJzY3JpcHRHRjcvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRicvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYnLyUnb3BhcXVlR0Y3LyUrZXhlY3V0YWJsZUdGNy8lKXJlYWRvbmx5R0Y6L [...]
+</Output>
+</Group>
+<Group labelreference="L258" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal"></Text-field>
+</Input>
+</Group>
+<Group labelreference="L162" drawlabel="true">
+<Input>
+<Text-field style="Text" layout="Normal"><Font size="16">Maple rank</Font></Text-field>
+<Text-field style="Text" layout="Normal"></Text-field>
+</Input>
+</Group>
+<Group labelreference="L137" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">Modular:-Rank(p,B);</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSNtbkc2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGKDY5USUxMDAwRigvJSdmYW1pbHlHUTBUaW1lc35OZXd+Um9tYW5GKC8lJXNpemVHUSMxMkYoLyUlYm9sZEdRJmZhbHNlRigvJSdpdGFsaWNHRjUvJSp1bmRlcmxpbmVHRjUvJSpzdWJzY3JpcHRHRjUvJSxzdXBlcnNjcmlwdEdGNS8lK2ZvcmVncm91bmRHUSpbMCwwLDI1NV1GKC8lK2JhY2tncm91bmRHUS5bMjU1LDI1NSwyNTVdRigvJSdvcGFxdWVHRjUvJStleGVjdXRhYmxlR0Y1LyUpcmVhZG9ubHlHUSV0cnVlRigvJSljb21wb [...]
+</Output>
+</Group>
+<Group labelreference="L127" drawlabel="true">
+<Input>
+<Text-field style="Text" layout="Normal"></Text-field>
+<Text-field style="Text" layout="Normal"><Font size="16">LinBox rank</Font></Text-field>
+<Text-field style="Text" layout="Normal"></Text-field>
+</Input>
+</Group>
+<Group labelreference="L134" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">lbRank(p, A);</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtc0dGJTYjUTFjb252ZXJzaW9ufnRpbWU6RigtSSNtb0dGJTYzUSIsRigvJSVmb3JtR1EmaW5maXhGKC8lJmZlbmNlR1EmZmFsc2VGKC8lKnNlcGFyYXRvckdRJXRydWVGKC8lJ2xzcGFjZUdRJDBlbUYoLyUncnNwYWNlR1EzdmVyeXRoaWNrbWF0aHNwYWNlRigvJSlzdHJldGNoeUdGOS8lKnN5bW1ldHJpY0dGOS8lKG1heHNpemVHUSlpbmZpbml0eUYoLyUobWluc2l6ZUdRIjFGKC8lKGxhcmdlb3BHRjkvJS5tb3ZhY [...]
+</Output>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSNtbkc2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGKDY5USUxMDAwRigvJSdmYW1pbHlHUTBUaW1lc35OZXd+Um9tYW5GKC8lJXNpemVHUSMxMkYoLyUlYm9sZEdRJmZhbHNlRigvJSdpdGFsaWNHRjUvJSp1bmRlcmxpbmVHRjUvJSpzdWJzY3JpcHRHRjUvJSxzdXBlcnNjcmlwdEdGNS8lK2ZvcmVncm91bmRHUSpbMCwwLDI1NV1GKC8lK2JhY2tncm91bmRHUS5bMjU1LDI1NSwyNTVdRigvJSdvcGFxdWVHRjUvJStleGVjdXRhYmxlR0Y1LyUpcmVhZG9ubHlHUSV0cnVlRigvJSljb21wb [...]
+</Output>
+</Group>
+<Group labelreference="L167" drawlabel="true">
+<Input>
+<Text-field style="Text" layout="Normal"></Text-field>
+<Text-field style="Text" layout="Normal"><Font size="16">Timing comparison</Font></Text-field>
+<Text-field style="Text" layout="Normal"></Text-field>
+</Input>
+</Group>
+<Group labelreference="L249" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">t1:=time(Modular:-Rank(p,B));</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtaUdGJTY5USN0MUYoLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRigvJSVzaXplR1EjMTJGKC8lJWJvbGRHUSZmYWxzZUYoLyUnaXRhbGljR1EldHJ1ZUYoLyUqdW5kZXJsaW5lR0Y4LyUqc3Vic2NyaXB0R0Y4LyUsc3VwZXJzY3JpcHRHRjgvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRigvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYoLyUnb3BhcXVlR0Y4LyUrZXhlY3V0YWJsZUdGOC8lKXJlYWRvbmx5R [...]
+</Output>
+</Group>
+<Group labelreference="L250" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">t2:=time(lbRank(p,A));</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtc0dGJTYjUTFjb252ZXJzaW9ufnRpbWU6RigtSSNtb0dGJTYzUSIsRigvJSVmb3JtR1EmaW5maXhGKC8lJmZlbmNlR1EmZmFsc2VGKC8lKnNlcGFyYXRvckdRJXRydWVGKC8lJ2xzcGFjZUdRJDBlbUYoLyUncnNwYWNlR1EzdmVyeXRoaWNrbWF0aHNwYWNlRigvJSlzdHJldGNoeUdGOS8lKnN5bW1ldHJpY0dGOS8lKG1heHNpemVHUSlpbmZpbml0eUYoLyUobWluc2l6ZUdRIjFGKC8lKGxhcmdlb3BHRjkvJS5tb3ZhY [...]
+</Output>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtaUdGJTY5USN0MkYoLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRigvJSVzaXplR1EjMTJGKC8lJWJvbGRHUSZmYWxzZUYoLyUnaXRhbGljR1EldHJ1ZUYoLyUqdW5kZXJsaW5lR0Y4LyUqc3Vic2NyaXB0R0Y4LyUsc3VwZXJzY3JpcHRHRjgvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRigvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYoLyUnb3BhcXVlR0Y4LyUrZXhlY3V0YWJsZUdGOC8lKXJlYWRvbmx5R [...]
+</Output>
+</Group>
+<Group labelreference="L251" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">t1/t2;</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSNtbkc2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGKDY5US0wLjg2MzgzMTgyMDRGKC8lJ2ZhbWlseUdRMFRpbWVzfk5ld35Sb21hbkYoLyUlc2l6ZUdRIzEyRigvJSVib2xkR1EmZmFsc2VGKC8lJ2l0YWxpY0dGNS8lKnVuZGVybGluZUdGNS8lKnN1YnNjcmlwdEdGNS8lLHN1cGVyc2NyaXB0R0Y1LyUrZm9yZWdyb3VuZEdRKlswLDAsMjU1XUYoLyUrYmFja2dyb3VuZEdRLlsyNTUsMjU1LDI1NV1GKC8lJ29wYXF1ZUdGNS8lK2V4ZWN1dGFibGVHRjUvJSlyZWFkb25seUdRJXRydWVGK [...]
+</Output>
+</Group>
+<Group labelreference="L121" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal"></Text-field>
+</Input>
+</Group>
+</Section>
+<Section collapsed="true" MultipleChoiceAnswerIndex="-1" MultipleChoiceRandomizeChoices="false" TrueFalseAnswerIndex="-1" EssayAnswerRows="5" EssayAnswerColumns="60"><Title>
+<Text-field style="Heading 3" layout="Heading 3">Minimal Polynomial</Text-field></Title>
+<Group labelreference="L132" drawlabel="true">
+<Input>
+<Text-field style="Text" layout="Normal"></Text-field>
+</Input>
+</Group>
+<Group labelreference="L347" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">restart():with(LinBox):with(LinearAlgebra):</Text-field>
+</Input>
+</Group>
+<Group labelreference="L262" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">n:=500;p:=17;gen:=rand(0..p-1);</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtaUdGJTY5USJuRigvJSdmYW1pbHlHUTBUaW1lc35OZXd+Um9tYW5GKC8lJXNpemVHUSMxMkYoLyUlYm9sZEdRJmZhbHNlRigvJSdpdGFsaWNHUSV0cnVlRigvJSp1bmRlcmxpbmVHRjgvJSpzdWJzY3JpcHRHRjgvJSxzdXBlcnNjcmlwdEdGOC8lK2ZvcmVncm91bmRHUSpbMCwwLDI1NV1GKC8lK2JhY2tncm91bmRHUS5bMjU1LDI1NSwyNTVdRigvJSdvcGFxdWVHRjgvJStleGVjdXRhYmxlR0Y4LyUpcmVhZG9ubHlHR [...]
+</Output>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtaUdGJTY5USJwRigvJSdmYW1pbHlHUTBUaW1lc35OZXd+Um9tYW5GKC8lJXNpemVHUSMxMkYoLyUlYm9sZEdRJmZhbHNlRigvJSdpdGFsaWNHUSV0cnVlRigvJSp1bmRlcmxpbmVHRjgvJSpzdWJzY3JpcHRHRjgvJSxzdXBlcnNjcmlwdEdGOC8lK2ZvcmVncm91bmRHUSpbMCwwLDI1NV1GKC8lK2JhY2tncm91bmRHUS5bMjU1LDI1NSwyNTVdRigvJSdvcGFxdWVHRjgvJStleGVjdXRhYmxlR0Y4LyUpcmVhZG9ubHlHR [...]
+</Output>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtaUdGJTY5USRnZW5GKC8lJ2ZhbWlseUdRMFRpbWVzfk5ld35Sb21hbkYoLyUlc2l6ZUdRIzEyRigvJSVib2xkR1EmZmFsc2VGKC8lJ2l0YWxpY0dRJXRydWVGKC8lKnVuZGVybGluZUdGOC8lKnN1YnNjcmlwdEdGOC8lLHN1cGVyc2NyaXB0R0Y4LyUrZm9yZWdyb3VuZEdRKlswLDAsMjU1XUYoLyUrYmFja2dyb3VuZEdRLlsyNTUsMjU1LDI1NV1GKC8lJ29wYXF1ZUdGOC8lK2V4ZWN1dGFibGVHRjgvJSlyZWFkb25se [...]
+</Output>
+</Group>
+<Group labelreference="L263" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">A:=Matrix(n,gen,datatype=integer[4]);</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzYlLUkjbWlHRiQ2OVEiQUYnLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRicvJSVzaXplR1EjMTJGJy8lJWJvbGRHUSZmYWxzZUYnLyUnaXRhbGljR1EldHJ1ZUYnLyUqdW5kZXJsaW5lR0Y3LyUqc3Vic2NyaXB0R0Y3LyUsc3VwZXJzY3JpcHRHRjcvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRicvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYnLyUnb3BhcXVlR0Y3LyUrZXhlY3V0YWJsZUdGNy8lKXJlYWRvbmx5R0Y6L [...]
+</Output>
+</Group>
+<Group labelreference="L261" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal"></Text-field>
+</Input>
+</Group>
+<Group labelreference="L145" drawlabel="true">
+<Input>
+<Text-field style="Text" layout="Normal"><Font size="16">Maple minimal polynomial</Font></Text-field>
+<Text-field style="Text" layout="Normal"></Text-field>
+</Input>
+</Group>
+<Group labelreference="L254" drawlabel="true">
+<Input>
+<Text-field style="Text" layout="Normal"> <Font bold="true" italic="true" size="14">doesn't exist in Givaro::Modular Package</Font></Text-field>
+</Input>
+</Group>
+<Group labelreference="L136" drawlabel="true">
+<Input>
+<Text-field style="Text" layout="Normal"></Text-field>
+<Text-field style="Text" layout="Normal"><Font size="16">LinBox minimal polynomial</Font></Text-field>
+<Text-field style="Text" layout="Normal"></Text-field>
+</Input>
+</Group>
+<Group labelreference="L166" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">lbMinpoly(p,A,'x');</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtc0dGJTYjUTFjb252ZXJzaW9ufnRpbWU6RigtSSNtb0dGJTYzUSIsRigvJSVmb3JtR1EmaW5maXhGKC8lJmZlbmNlR1EmZmFsc2VGKC8lKnNlcGFyYXRvckdRJXRydWVGKC8lJ2xzcGFjZUdRJDBlbUYoLyUncnNwYWNlR1EzdmVyeXRoaWNrbWF0aHNwYWNlRigvJSlzdHJldGNoeUdGOS8lKnN5bW1ldHJpY0dGOS8lKG1heHNpemVHUSlpbmZpbml0eUYoLyUobWluc2l6ZUdRIjFGKC8lKGxhcmdlb3BHRjkvJS5tb3ZhY [...]
+</Output>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNl9mbi1GJDYlLUkjbW5HRiU2OVEiNUYoLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRigvJSVzaXplR1EjMTJGKC8lJWJvbGRHUSZmYWxzZUYoLyUnaXRhbGljR0Y6LyUqdW5kZXJsaW5lR0Y6LyUqc3Vic2NyaXB0R0Y6LyUsc3VwZXJzY3JpcHRHRjovJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRigvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYoLyUnb3BhcXVlR0Y6LyUrZXhlY3V0YWJsZUdGOi8lKXJlYWRvbmx5R [...]
+</Output>
+</Group>
+<Group labelreference="L143" drawlabel="true">
+<Input>
+<Text-field style="Text" layout="Normal"></Text-field>
+<Text-field style="Text" layout="Normal"><Font size="16">Timing </Font></Text-field>
+<Text-field style="Text" layout="Normal"></Text-field>
+</Input>
+</Group>
+<Group labelreference="L160" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">time(lbMinpoly(p,A,'x'));</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtc0dGJTYjUTFjb252ZXJzaW9ufnRpbWU6RigtSSNtb0dGJTYzUSIsRigvJSVmb3JtR1EmaW5maXhGKC8lJmZlbmNlR1EmZmFsc2VGKC8lKnNlcGFyYXRvckdRJXRydWVGKC8lJ2xzcGFjZUdRJDBlbUYoLyUncnNwYWNlR1EzdmVyeXRoaWNrbWF0aHNwYWNlRigvJSlzdHJldGNoeUdGOS8lKnN5bW1ldHJpY0dGOS8lKG1heHNpemVHUSlpbmZpbml0eUYoLyUobWluc2l6ZUdRIjFGKC8lKGxhcmdlb3BHRjkvJS5tb3ZhY [...]
+</Output>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSNtbkc2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGKDY5USYwLjcwNkYoLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRigvJSVzaXplR1EjMTJGKC8lJWJvbGRHUSZmYWxzZUYoLyUnaXRhbGljR0Y1LyUqdW5kZXJsaW5lR0Y1LyUqc3Vic2NyaXB0R0Y1LyUsc3VwZXJzY3JpcHRHRjUvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRigvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYoLyUnb3BhcXVlR0Y1LyUrZXhlY3V0YWJsZUdGNS8lKXJlYWRvbmx5R1EldHJ1ZUYoLyUpY29tc [...]
+</Output>
+</Group>
+<Group labelreference="L264" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal"></Text-field>
+</Input>
+</Group>
+</Section>
+<Section collapsed="true" MultipleChoiceAnswerIndex="-1" MultipleChoiceRandomizeChoices="false" TrueFalseAnswerIndex="-1" EssayAnswerRows="5" EssayAnswerColumns="60"><Title>
+<Text-field style="Heading 3" layout="Heading 3">Characteristic Polynomial</Text-field></Title>
+<Text-field style="Text" layout="Normal"></Text-field>
+<Group labelreference="L348" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">restart():with(LinBox):with(LinearAlgebra):</Text-field>
+</Input>
+</Group>
+<Group labelreference="L267" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">n:=500;p:=17;gen:=rand(0..p-1);</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtaUdGJTY5USJuRigvJSdmYW1pbHlHUTBUaW1lc35OZXd+Um9tYW5GKC8lJXNpemVHUSMxMkYoLyUlYm9sZEdRJmZhbHNlRigvJSdpdGFsaWNHUSV0cnVlRigvJSp1bmRlcmxpbmVHRjgvJSpzdWJzY3JpcHRHRjgvJSxzdXBlcnNjcmlwdEdGOC8lK2ZvcmVncm91bmRHUSpbMCwwLDI1NV1GKC8lK2JhY2tncm91bmRHUS5bMjU1LDI1NSwyNTVdRigvJSdvcGFxdWVHRjgvJStleGVjdXRhYmxlR0Y4LyUpcmVhZG9ubHlHR [...]
+</Output>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtaUdGJTY5USJwRigvJSdmYW1pbHlHUTBUaW1lc35OZXd+Um9tYW5GKC8lJXNpemVHUSMxMkYoLyUlYm9sZEdRJmZhbHNlRigvJSdpdGFsaWNHUSV0cnVlRigvJSp1bmRlcmxpbmVHRjgvJSpzdWJzY3JpcHRHRjgvJSxzdXBlcnNjcmlwdEdGOC8lK2ZvcmVncm91bmRHUSpbMCwwLDI1NV1GKC8lK2JhY2tncm91bmRHUS5bMjU1LDI1NSwyNTVdRigvJSdvcGFxdWVHRjgvJStleGVjdXRhYmxlR0Y4LyUpcmVhZG9ubHlHR [...]
+</Output>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtaUdGJTY5USRnZW5GKC8lJ2ZhbWlseUdRMFRpbWVzfk5ld35Sb21hbkYoLyUlc2l6ZUdRIzEyRigvJSVib2xkR1EmZmFsc2VGKC8lJ2l0YWxpY0dRJXRydWVGKC8lKnVuZGVybGluZUdGOC8lKnN1YnNjcmlwdEdGOC8lLHN1cGVyc2NyaXB0R0Y4LyUrZm9yZWdyb3VuZEdRKlswLDAsMjU1XUYoLyUrYmFja2dyb3VuZEdRLlsyNTUsMjU1LDI1NV1GKC8lJ29wYXF1ZUdGOC8lK2V4ZWN1dGFibGVHRjgvJSlyZWFkb25se [...]
+</Output>
+</Group>
+<Group labelreference="L266" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">A:=Matrix(n,gen,datatype=integer[4]);</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzYlLUkjbWlHRiQ2OVEiQUYnLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRicvJSVzaXplR1EjMTJGJy8lJWJvbGRHUSZmYWxzZUYnLyUnaXRhbGljR1EldHJ1ZUYnLyUqdW5kZXJsaW5lR0Y3LyUqc3Vic2NyaXB0R0Y3LyUsc3VwZXJzY3JpcHRHRjcvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRicvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYnLyUnb3BhcXVlR0Y3LyUrZXhlY3V0YWJsZUdGNy8lKXJlYWRvbmx5R0Y6L [...]
+</Output>
+</Group>
+<Group labelreference="L135" drawlabel="true">
+<Input>
+<Text-field style="Text" layout="Normal"></Text-field>
+</Input>
+</Group>
+<Group labelreference="L119" drawlabel="true">
+<Input>
+<Text-field style="Text" layout="Normal"><Font size="16">Maple Characteristic polynomial</Font></Text-field>
+<Text-field style="Text" layout="Normal"></Text-field>
+</Input>
+</Group>
+<Group labelreference="L269" drawlabel="true">
+<Input>
+<Text-field style="Text" bold="true" italic="true" size="14" layout="Normal"><Font italic="true" bold="true" size="14">doesn't exist in Givaro::Modular package</Font></Text-field>
+</Input>
+</Group>
+<Group labelreference="L126" drawlabel="true">
+<Input>
+<Text-field style="Text" layout="Normal"></Text-field>
+<Text-field style="Text" layout="Normal"><Font size="16">LinBox Characteristic polynomial</Font></Text-field>
+<Text-field style="Text" layout="Normal"></Text-field>
+</Input>
+</Group>
+<Group labelreference="L154" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">lbCharpoly(p,A,'x');</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtc0dGJTYjUTFjb252ZXJzaW9ufnRpbWU6RigtSSNtb0dGJTYzUSIsRigvJSVmb3JtR1EmaW5maXhGKC8lJmZlbmNlR1EmZmFsc2VGKC8lKnNlcGFyYXRvckdRJXRydWVGKC8lJ2xzcGFjZUdRJDBlbUYoLyUncnNwYWNlR1EzdmVyeXRoaWNrbWF0aHNwYWNlRigvJSlzdHJldGNoeUdGOS8lKnN5bW1ldHJpY0dGOS8lKG1heHNpemVHUSlpbmZpbml0eUYoLyUobWluc2l6ZUdRIjFGKC8lKGxhcmdlb3BHRjkvJS5tb3ZhY [...]
+</Output>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNl1nbi1GJDYlLUkjbW5HRiU2OVEiN0YoLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRigvJSVzaXplR1EjMTJGKC8lJWJvbGRHUSZmYWxzZUYoLyUnaXRhbGljR0Y6LyUqdW5kZXJsaW5lR0Y6LyUqc3Vic2NyaXB0R0Y6LyUsc3VwZXJzY3JpcHRHRjovJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRigvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYoLyUnb3BhcXVlR0Y6LyUrZXhlY3V0YWJsZUdGOi8lKXJlYWRvbmx5R [...]
+</Output>
+</Group>
+<Group labelreference="L144" drawlabel="true">
+<Input>
+<Text-field style="Text" layout="Normal"></Text-field>
+<Text-field style="Text" layout="Normal"><Font size="16">Timing</Font></Text-field>
+<Text-field style="Text" layout="Normal"></Text-field>
+</Input>
+</Group>
+<Group labelreference="L139" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">time(lbCharpoly(p,A,'x'));</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtc0dGJTYjUTFjb252ZXJzaW9ufnRpbWU6RigtSSNtb0dGJTYzUSIsRigvJSVmb3JtR1EmaW5maXhGKC8lJmZlbmNlR1EmZmFsc2VGKC8lKnNlcGFyYXRvckdRJXRydWVGKC8lJ2xzcGFjZUdRJDBlbUYoLyUncnNwYWNlR1EzdmVyeXRoaWNrbWF0aHNwYWNlRigvJSlzdHJldGNoeUdGOS8lKnN5bW1ldHJpY0dGOS8lKG1heHNpemVHUSlpbmZpbml0eUYoLyUobWluc2l6ZUdRIjFGKC8lKGxhcmdlb3BHRjkvJS5tb3ZhY [...]
+</Output>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSNtbkc2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGKDY5USYwLjY1N0YoLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRigvJSVzaXplR1EjMTJGKC8lJWJvbGRHUSZmYWxzZUYoLyUnaXRhbGljR0Y1LyUqdW5kZXJsaW5lR0Y1LyUqc3Vic2NyaXB0R0Y1LyUsc3VwZXJzY3JpcHRHRjUvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRigvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYoLyUnb3BhcXVlR0Y1LyUrZXhlY3V0YWJsZUdGNS8lKXJlYWRvbmx5R1EldHJ1ZUYoLyUpY29tc [...]
+</Output>
+</Group>
+<Group labelreference="L270" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal"></Text-field>
+</Input>
+</Group>
+</Section>
+<Section collapsed="true" MultipleChoiceAnswerIndex="-1" MultipleChoiceRandomizeChoices="false" TrueFalseAnswerIndex="-1" EssayAnswerRows="5" EssayAnswerColumns="60"><Title>
+<Text-field style="Heading 3" layout="Heading 3">Linear System Solving</Text-field></Title>
+<Text-field style="Text" layout="Normal"></Text-field>
+<Group labelreference="L349" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">restart():with(LinBox):with(LinearAlgebra):</Text-field>
+</Input>
+</Group>
+<Group labelreference="L272" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">n:=500;p:=17;gen:=rand(0..p-1);</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtaUdGJTY5USJuRigvJSdmYW1pbHlHUTBUaW1lc35OZXd+Um9tYW5GKC8lJXNpemVHUSMxMkYoLyUlYm9sZEdRJmZhbHNlRigvJSdpdGFsaWNHUSV0cnVlRigvJSp1bmRlcmxpbmVHRjgvJSpzdWJzY3JpcHRHRjgvJSxzdXBlcnNjcmlwdEdGOC8lK2ZvcmVncm91bmRHUSpbMCwwLDI1NV1GKC8lK2JhY2tncm91bmRHUS5bMjU1LDI1NSwyNTVdRigvJSdvcGFxdWVHRjgvJStleGVjdXRhYmxlR0Y4LyUpcmVhZG9ubHlHR [...]
+</Output>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtaUdGJTY5USJwRigvJSdmYW1pbHlHUTBUaW1lc35OZXd+Um9tYW5GKC8lJXNpemVHUSMxMkYoLyUlYm9sZEdRJmZhbHNlRigvJSdpdGFsaWNHUSV0cnVlRigvJSp1bmRlcmxpbmVHRjgvJSpzdWJzY3JpcHRHRjgvJSxzdXBlcnNjcmlwdEdGOC8lK2ZvcmVncm91bmRHUSpbMCwwLDI1NV1GKC8lK2JhY2tncm91bmRHUS5bMjU1LDI1NSwyNTVdRigvJSdvcGFxdWVHRjgvJStleGVjdXRhYmxlR0Y4LyUpcmVhZG9ubHlHR [...]
+</Output>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtaUdGJTY5USRnZW5GKC8lJ2ZhbWlseUdRMFRpbWVzfk5ld35Sb21hbkYoLyUlc2l6ZUdRIzEyRigvJSVib2xkR1EmZmFsc2VGKC8lJ2l0YWxpY0dRJXRydWVGKC8lKnVuZGVybGluZUdGOC8lKnN1YnNjcmlwdEdGOC8lLHN1cGVyc2NyaXB0R0Y4LyUrZm9yZWdyb3VuZEdRKlswLDAsMjU1XUYoLyUrYmFja2dyb3VuZEdRLlsyNTUsMjU1LDI1NV1GKC8lJ29wYXF1ZUdGOC8lK2V4ZWN1dGFibGVHRjgvJSlyZWFkb25se [...]
+</Output>
+</Group>
+<Group labelreference="L271" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">A:=Matrix(n,gen,datatype=integer[4]);b:=Vector(n,gen,datatype=integer[4]);</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzYlLUkjbWlHRiQ2OVEiQUYnLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRicvJSVzaXplR1EjMTJGJy8lJWJvbGRHUSZmYWxzZUYnLyUnaXRhbGljR1EldHJ1ZUYnLyUqdW5kZXJsaW5lR0Y3LyUqc3Vic2NyaXB0R0Y3LyUsc3VwZXJzY3JpcHRHRjcvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRicvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYnLyUnb3BhcXVlR0Y3LyUrZXhlY3V0YWJsZUdGNy8lKXJlYWRvbmx5R0Y6L [...]
+</Output>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzYlLUkjbWlHRiQ2OVEiYkYnLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRicvJSVzaXplR1EjMTJGJy8lJWJvbGRHUSZmYWxzZUYnLyUnaXRhbGljR1EldHJ1ZUYnLyUqdW5kZXJsaW5lR0Y3LyUqc3Vic2NyaXB0R0Y3LyUsc3VwZXJzY3JpcHRHRjcvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRicvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYnLyUnb3BhcXVlR0Y3LyUrZXhlY3V0YWJsZUdGNy8lKXJlYWRvbmx5R0Y6L [...]
+</Output>
+</Group>
+<Group labelreference="L129" drawlabel="true">
+<Input>
+<Text-field style="Text" layout="Normal"></Text-field>
+</Input>
+</Group>
+<Group labelreference="L133" drawlabel="true">
+<Input>
+<Text-field style="Text" layout="Normal"><Font size="16">Maple linear system solving</Font></Text-field>
+<Text-field style="Text" layout="Normal"></Text-field>
+</Input>
+</Group>
+<Group labelreference="L273" drawlabel="true">
+<Input>
+<Text-field style="Text" bold="true" italic="true" size="14" layout="Normal"><Font italic="true" bold="true" size="14">no native solution available</Font></Text-field>
+</Input>
+</Group>
+<Group labelreference="L163" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">B:=Modular:-Mod(p,A,integer[4]);b1:=Modular:-Mod(p,b,integer[4]);</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzYlLUkjbWlHRiQ2OVEiQkYnLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRicvJSVzaXplR1EjMTJGJy8lJWJvbGRHUSZmYWxzZUYnLyUnaXRhbGljR1EldHJ1ZUYnLyUqdW5kZXJsaW5lR0Y3LyUqc3Vic2NyaXB0R0Y3LyUsc3VwZXJzY3JpcHRHRjcvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRicvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYnLyUnb3BhcXVlR0Y3LyUrZXhlY3V0YWJsZUdGNy8lKXJlYWRvbmx5R0Y6L [...]
+</Output>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzYlLUkjbWlHRiQ2OVEjYjFGJy8lJ2ZhbWlseUdRMFRpbWVzfk5ld35Sb21hbkYnLyUlc2l6ZUdRIzEyRicvJSVib2xkR1EmZmFsc2VGJy8lJ2l0YWxpY0dRJXRydWVGJy8lKnVuZGVybGluZUdGNy8lKnN1YnNjcmlwdEdGNy8lLHN1cGVyc2NyaXB0R0Y3LyUrZm9yZWdyb3VuZEdRKlswLDAsMjU1XUYnLyUrYmFja2dyb3VuZEdRLlsyNTUsMjU1LDI1NV1GJy8lJ29wYXF1ZUdGNy8lK2V4ZWN1dGFibGVHRjcvJSlyZWFkb25seUdGO [...]
+</Output>
+</Group>
+<Group labelreference="L274" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">pv:=Vector(n-1):Modular:-LUDecomposition(p,B,pv,0);</Text-field>
+</Input>
+</Group>
+<Group labelreference="L275" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">Modular:-LUApply(p,B,pv,b1);b1[1..10];</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzYlLUkjbW9HRiQ2M1EiW0YnLyUlZm9ybUdRJ3ByZWZpeEYnLyUmZmVuY2VHUSV0cnVlRicvJSpzZXBhcmF0b3JHUSZmYWxzZUYnLyUnbHNwYWNlR1EudGhpbm1hdGhzcGFjZUYnLyUncnNwYWNlR0Y6LyUpc3RyZXRjaHlHRjQvJSpzeW1tZXRyaWNHRjcvJShtYXhzaXplR1EpaW5maW5pdHlGJy8lKG1pbnNpemVHUSIxRicvJShsYXJnZW9wR0Y3LyUubW92YWJsZWxpbWl0c0dGNy8lJ2FjY2VudEdGNy8lMGZvbnRfc3R5bGVfbmFtZ [...]
+</Output>
+</Group>
+<Group labelreference="L147" drawlabel="true">
+<Input>
+<Text-field style="Text" layout="Normal"></Text-field>
+<Text-field style="Text" size="16" layout="Normal"><Font size="16">LinBox linear system solving</Font></Text-field>
+<Text-field style="Text" layout="Normal"></Text-field>
+</Input>
+</Group>
+<Group labelreference="L161" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">x:=lbSolve(p,A,b);x[1..10];</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtc0dGJTYjUTFjb252ZXJzaW9ufnRpbWU6RigtSSNtb0dGJTYzUSIsRigvJSVmb3JtR1EmaW5maXhGKC8lJmZlbmNlR1EmZmFsc2VGKC8lKnNlcGFyYXRvckdRJXRydWVGKC8lJ2xzcGFjZUdRJDBlbUYoLyUncnNwYWNlR1EzdmVyeXRoaWNrbWF0aHNwYWNlRigvJSlzdHJldGNoeUdGOS8lKnN5bW1ldHJpY0dGOS8lKG1heHNpemVHUSlpbmZpbml0eUYoLyUobWluc2l6ZUdRIjFGKC8lKGxhcmdlb3BHRjkvJS5tb3ZhY [...]
+</Output>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzYlLUkjbWlHRiQ2OVEieEYnLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRicvJSVzaXplR1EjMTJGJy8lJWJvbGRHUSZmYWxzZUYnLyUnaXRhbGljR1EldHJ1ZUYnLyUqdW5kZXJsaW5lR0Y3LyUqc3Vic2NyaXB0R0Y3LyUsc3VwZXJzY3JpcHRHRjcvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRicvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYnLyUnb3BhcXVlR0Y3LyUrZXhlY3V0YWJsZUdGNy8lKXJlYWRvbmx5R0Y6L [...]
+</Output>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzYlLUkjbW9HRiQ2M1EiW0YnLyUlZm9ybUdRJ3ByZWZpeEYnLyUmZmVuY2VHUSV0cnVlRicvJSpzZXBhcmF0b3JHUSZmYWxzZUYnLyUnbHNwYWNlR1EudGhpbm1hdGhzcGFjZUYnLyUncnNwYWNlR0Y6LyUpc3RyZXRjaHlHRjQvJSpzeW1tZXRyaWNHRjcvJShtYXhzaXplR1EpaW5maW5pdHlGJy8lKG1pbnNpemVHUSIxRicvJShsYXJnZW9wR0Y3LyUubW92YWJsZWxpbWl0c0dGNy8lJ2FjY2VudEdGNy8lMGZvbnRfc3R5bGVfbmFtZ [...]
+</Output>
+</Group>
+<Group labelreference="L155" drawlabel="true">
+<Input>
+<Text-field style="Text" layout="Normal"></Text-field>
+<Text-field style="Text" layout="Normal"><Font size="16">Timing comparison</Font></Text-field>
+<Text-field style="Text" layout="Normal"></Text-field>
+</Input>
+</Group>
+<Group labelreference="L282" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">B:=Modular:-Mod(p,A,integer[4]):b1:=Modular:-Mod(p,b,integer[4]):pv:=Vector(n-1):</Text-field>
+</Input>
+</Group>
+<Group labelreference="L281" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">t1:=time(Modular:-LUDecomposition(p,B,pv,0))+time(Modular:-LUApply(p,B,pv,b1));</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtaUdGJTY5USN0MUYoLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRigvJSVzaXplR1EjMTJGKC8lJWJvbGRHUSZmYWxzZUYoLyUnaXRhbGljR1EldHJ1ZUYoLyUqdW5kZXJsaW5lR0Y4LyUqc3Vic2NyaXB0R0Y4LyUsc3VwZXJzY3JpcHRHRjgvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRigvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYoLyUnb3BhcXVlR0Y4LyUrZXhlY3V0YWJsZUdGOC8lKXJlYWRvbmx5R [...]
+</Output>
+</Group>
+<Group labelreference="L276" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">t2:=time(lbSolve(p,A,b));</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtc0dGJTYjUTFjb252ZXJzaW9ufnRpbWU6RigtSSNtb0dGJTYzUSIsRigvJSVmb3JtR1EmaW5maXhGKC8lJmZlbmNlR1EmZmFsc2VGKC8lKnNlcGFyYXRvckdRJXRydWVGKC8lJ2xzcGFjZUdRJDBlbUYoLyUncnNwYWNlR1EzdmVyeXRoaWNrbWF0aHNwYWNlRigvJSlzdHJldGNoeUdGOS8lKnN5bW1ldHJpY0dGOS8lKG1heHNpemVHUSlpbmZpbml0eUYoLyUobWluc2l6ZUdRIjFGKC8lKGxhcmdlb3BHRjkvJS5tb3ZhY [...]
+</Output>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtaUdGJTY5USN0MkYoLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRigvJSVzaXplR1EjMTJGKC8lJWJvbGRHUSZmYWxzZUYoLyUnaXRhbGljR1EldHJ1ZUYoLyUqdW5kZXJsaW5lR0Y4LyUqc3Vic2NyaXB0R0Y4LyUsc3VwZXJzY3JpcHRHRjgvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRigvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYoLyUnb3BhcXVlR0Y4LyUrZXhlY3V0YWJsZUdGOC8lKXJlYWRvbmx5R [...]
+</Output>
+</Group>
+<Group labelreference="L277" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">t1/t2;</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSNtbkc2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGKDY5US0wLjU5MzEwMzQ0ODNGKC8lJ2ZhbWlseUdRMFRpbWVzfk5ld35Sb21hbkYoLyUlc2l6ZUdRIzEyRigvJSVib2xkR1EmZmFsc2VGKC8lJ2l0YWxpY0dGNS8lKnVuZGVybGluZUdGNS8lKnN1YnNjcmlwdEdGNS8lLHN1cGVyc2NyaXB0R0Y1LyUrZm9yZWdyb3VuZEdRKlswLDAsMjU1XUYoLyUrYmFja2dyb3VuZEdRLlsyNTUsMjU1LDI1NV1GKC8lJ29wYXF1ZUdGNS8lK2V4ZWN1dGFibGVHRjUvJSlyZWFkb25seUdRJXRydWVGK [...]
+</Output>
+</Group>
+<Group labelreference="L350" drawlabel="true">
+<Input>
+<Text-field style="Text" size="16" layout="Normal"><Font size="16">Singular system</Font></Text-field>
+<Text-field style="Text" size="16" layout="Normal"></Text-field>
+</Input>
+</Group>
+<Group labelreference="L352" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">n:=100;</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtaUdGJTY5USJuRigvJSdmYW1pbHlHUTBUaW1lc35OZXd+Um9tYW5GKC8lJXNpemVHUSMxMkYoLyUlYm9sZEdRJmZhbHNlRigvJSdpdGFsaWNHUSV0cnVlRigvJSp1bmRlcmxpbmVHRjgvJSpzdWJzY3JpcHRHRjgvJSxzdXBlcnNjcmlwdEdGOC8lK2ZvcmVncm91bmRHUSpbMCwwLDI1NV1GKC8lK2JhY2tncm91bmRHUS5bMjU1LDI1NSwyNTVdRigvJSdvcGFxdWVHRjgvJStleGVjdXRhYmxlR0Y4LyUpcmVhZG9ubHlHR [...]
+</Output>
+</Group>
+<Group labelreference="L353" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">A:=Matrix(n,n,gen,datatype=integer[4]):c:=Vector(n,gen,datatype=integer[4]):c[n]:=0:</Text-field>
+</Input>
+</Group>
+<Group labelreference="L354" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">A[1..n,n]:=A.c;</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzYlLUklbXN1YkdGJDYmLUkjbWlHRiQ2OVEiQUYnLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRicvJSVzaXplR1EjMTJGJy8lJWJvbGRHUSZmYWxzZUYnLyUnaXRhbGljR1EldHJ1ZUYnLyUqdW5kZXJsaW5lR0Y6LyUqc3Vic2NyaXB0R0Y6LyUsc3VwZXJzY3JpcHRHRjovJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRicvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYnLyUnb3BhcXVlR0Y6LyUrZXhlY3V0YWJsZUdGOi8lK [...]
+</Output>
+</Group>
+<Group labelreference="L355" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">lbRank(A);</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtc0dGJTYjUTFjb252ZXJzaW9ufnRpbWU6RigtSSNtb0dGJTYzUSIsRigvJSVmb3JtR1EmaW5maXhGKC8lJmZlbmNlR1EmZmFsc2VGKC8lKnNlcGFyYXRvckdRJXRydWVGKC8lJ2xzcGFjZUdRJDBlbUYoLyUncnNwYWNlR1EzdmVyeXRoaWNrbWF0aHNwYWNlRigvJSlzdHJldGNoeUdGOS8lKnN5bW1ldHJpY0dGOS8lKG1heHNpemVHUSlpbmZpbml0eUYoLyUobWluc2l6ZUdRIjFGKC8lKGxhcmdlb3BHRjkvJS5tb3ZhY [...]
+</Output>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSNtbkc2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGKDY5USM5OUYoLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRigvJSVzaXplR1EjMTJGKC8lJWJvbGRHUSZmYWxzZUYoLyUnaXRhbGljR0Y1LyUqdW5kZXJsaW5lR0Y1LyUqc3Vic2NyaXB0R0Y1LyUsc3VwZXJzY3JpcHRHRjUvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRigvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYoLyUnb3BhcXVlR0Y1LyUrZXhlY3V0YWJsZUdGNS8lKXJlYWRvbmx5R1EldHJ1ZUYoLyUpY29tcG9zZ [...]
+</Output>
+</Group>
+<Group labelreference="L356" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">pv:=Vector(n-1):Modular:-LUDecomposition(p,A,pv,0);</Text-field>
+</Input>
+<Output>
+<Text-field style="Error" layout="Error">Error, (in LinearAlgebra:-Modular:-LUDecomposition) matrix is singular</Text-field>
+</Output>
+</Group>
+<Group labelreference="L358" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">x:=lbSolve(p,A,c):x[1..10];</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtc0dGJTYjUTFjb252ZXJzaW9ufnRpbWU6RigtSSNtb0dGJTYzUSIsRigvJSVmb3JtR1EmaW5maXhGKC8lJmZlbmNlR1EmZmFsc2VGKC8lKnNlcGFyYXRvckdRJXRydWVGKC8lJ2xzcGFjZUdRJDBlbUYoLyUncnNwYWNlR1EzdmVyeXRoaWNrbWF0aHNwYWNlRigvJSlzdHJldGNoeUdGOS8lKnN5bW1ldHJpY0dGOS8lKG1heHNpemVHUSlpbmZpbml0eUYoLyUobWluc2l6ZUdRIjFGKC8lKGxhcmdlb3BHRjkvJS5tb3ZhY [...]
+</Output>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzYlLUkjbW9HRiQ2M1EiW0YnLyUlZm9ybUdRJ3ByZWZpeEYnLyUmZmVuY2VHUSV0cnVlRicvJSpzZXBhcmF0b3JHUSZmYWxzZUYnLyUnbHNwYWNlR1EudGhpbm1hdGhzcGFjZUYnLyUncnNwYWNlR0Y6LyUpc3RyZXRjaHlHRjQvJSpzeW1tZXRyaWNHRjcvJShtYXhzaXplR1EpaW5maW5pdHlGJy8lKG1pbnNpemVHUSIxRicvJShsYXJnZW9wR0Y3LyUubW92YWJsZWxpbWl0c0dGNy8lJ2FjY2VudEdGNy8lMGZvbnRfc3R5bGVfbmFtZ [...]
+</Output>
+</Group>
+<Group labelreference="L361" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">Norm(map(modp,A.x-c,p));</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSNtbkc2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGKDY5USIwRigvJSdmYW1pbHlHUTBUaW1lc35OZXd+Um9tYW5GKC8lJXNpemVHUSMxMkYoLyUlYm9sZEdRJmZhbHNlRigvJSdpdGFsaWNHRjUvJSp1bmRlcmxpbmVHRjUvJSpzdWJzY3JpcHRHRjUvJSxzdXBlcnNjcmlwdEdGNS8lK2ZvcmVncm91bmRHUSpbMCwwLDI1NV1GKC8lK2JhY2tncm91bmRHUS5bMjU1LDI1NSwyNTVdRigvJSdvcGFxdWVHRjUvJStleGVjdXRhYmxlR0Y1LyUpcmVhZG9ubHlHUSV0cnVlRigvJSljb21wb3NlZ [...]
+</Output>
+</Group>
+<Group labelreference="L439" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal"><Equation executable="true" style="2D Input" input-equation="Typesetting:-mrow(Typesetting:-mi(""))">LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzYjLUkjbWlHRiQ2OVEhRicvJSdmYW1pbHlHUTBUaW1lc35OZXd+Um9tYW5GJy8lJXNpemVHUSMxMkYnLyUlYm9sZEdRJmZhbHNlRicvJSdpdGFsaWNHUSV0cnVlRicvJSp1bmRlcmxpbmVHRjcvJSpzdWJzY3JpcHRHRjcvJSxzdXBlcnNjcmlwdEdGNy8lK2ZvcmVncm91bmRHUShbMCwwLDBdRicvJStiYWNrZ3JvdW5kR1EuWzI1NS [...]
+</Input>
+</Group>
+<Group labelreference="L351" drawlabel="true">
+<Input>
+<Text-field style="Text" layout="Normal"></Text-field>
+</Input>
+</Group>
+</Section>
+</Section>
+<Section collapsed="true" MultipleChoiceAnswerIndex="-1" MultipleChoiceRandomizeChoices="false" TrueFalseAnswerIndex="-1" EssayAnswerRows="5" EssayAnswerColumns="60"><Title>
+<Text-field style="Heading 2" layout="Heading 2">Benefits in practice</Text-field></Title>
+<Text-field style="Text" layout="Normal"></Text-field>
+<Text-field style="Text" size="14" layout="Normal"><Font size="14">Sometime numerical computation is not satisfying and exact computation becomes mandatory</Font></Text-field>
+<Text-field style="Text" size="14" layout="Normal"></Text-field>
+<Group labelreference="L406" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">with(LinearAlgebra):</Text-field>
+</Input>
+</Group>
+<Section collapsed="true" MultipleChoiceAnswerIndex="-1" MultipleChoiceRandomizeChoices="false" TrueFalseAnswerIndex="-1" EssayAnswerRows="5" EssayAnswerColumns="60"><Title>
+<Text-field style="Heading 3" layout="Heading 3">Very bad conditionned matrix</Text-field></Title>
+<Text-field style="Text" layout="Normal"></Text-field>
+<Group labelreference="L398" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">Moler:=proc(n) local i,j,Moler;
+ Moler:=Matrix(n);
+ for i from 1 to n do
+ for j from 1 to (i-1) do
+ Moler[i,j]:=j-2;
+ end do;
+ Moler[i,i]:=i;
+ for j from (i+1) to n do
+ Moler[i,j]:=i-2;
+ end do;
+ end do;
+ return Moler; end proc:</Text-field>
+</Input>
+</Group>
+<Group labelreference="L400" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">Redheffer:=proc(n) local i,j,Redheffer;
+ Redheffer:=Matrix(n);
+ for i from 1 to n do
+ Redheffer[i,1]:=1;
+ for j from 2 to n do
+ if (j mod i = 0) then
+ Redheffer[i,j]:=1;
+ else
+ Redheffer[i,j]:=0;
+ end if;
+ end do;
+ end do:
+ return Redheffer; end proc:</Text-field>
+</Input>
+</Group>
+<Group labelreference="L399" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">Moler(10),Redheffer(10);</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzYlLUYjNiUtSSNtb0dGJDYzUSJbRicvJSVmb3JtR1EncHJlZml4RicvJSZmZW5jZUdRJXRydWVGJy8lKnNlcGFyYXRvckdRJmZhbHNlRicvJSdsc3BhY2VHUS50aGlubWF0aHNwYWNlRicvJSdyc3BhY2VHRjwvJSlzdHJldGNoeUdGNi8lKnN5bW1ldHJpY0dGOS8lKG1heHNpemVHUSlpbmZpbml0eUYnLyUobWluc2l6ZUdRIjFGJy8lKGxhcmdlb3BHRjkvJS5tb3ZhYmxlbGltaXRzR0Y5LyUnYWNjZW50R0Y5LyUwZm9udF9zdHlsZ [...]
+</Output>
+</Group>
+<Group labelreference="L404" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">n:=200;</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtaUdGJTY5USJuRigvJSdmYW1pbHlHUTBUaW1lc35OZXd+Um9tYW5GKC8lJXNpemVHUSMxMkYoLyUlYm9sZEdRJmZhbHNlRigvJSdpdGFsaWNHUSV0cnVlRigvJSp1bmRlcmxpbmVHRjgvJSpzdWJzY3JpcHRHRjgvJSxzdXBlcnNjcmlwdEdGOC8lK2ZvcmVncm91bmRHUSpbMCwwLDI1NV1GKC8lK2JhY2tncm91bmRHUS5bMjU1LDI1NSwyNTVdRigvJSdvcGFxdWVHRjgvJStleGVjdXRhYmxlR0Y4LyUpcmVhZG9ubHlHR [...]
+</Output>
+</Group>
+<Group labelreference="L405" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">M:=1.*Moler(n):R:=1.*Redheffer(n):MR:=M.R;</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzYlLUkjbWlHRiQ2OVEjTVJGJy8lJ2ZhbWlseUdRMFRpbWVzfk5ld35Sb21hbkYnLyUlc2l6ZUdRIzEyRicvJSVib2xkR1EmZmFsc2VGJy8lJ2l0YWxpY0dRJXRydWVGJy8lKnVuZGVybGluZUdGNy8lKnN1YnNjcmlwdEdGNy8lLHN1cGVyc2NyaXB0R0Y3LyUrZm9yZWdyb3VuZEdRKlswLDAsMjU1XUYnLyUrYmFja2dyb3VuZEdRLlsyNTUsMjU1LDI1NV1GJy8lJ29wYXF1ZUdGNy8lK2V4ZWN1dGFibGVHRjcvJSlyZWFkb25seUdGO [...]
+</Output>
+</Group>
+<Group labelreference="L422" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">ConditionNumber(M); ConditionNumber(R); ConditionNumber(MR);</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtbkdGJTY5USw4LjQ4MDEwODYwMUYoLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRigvJSVzaXplR1EjMTJGKC8lJWJvbGRHUSZmYWxzZUYoLyUnaXRhbGljR0Y4LyUqdW5kZXJsaW5lR0Y4LyUqc3Vic2NyaXB0R0Y4LyUsc3VwZXJzY3JpcHRHRjgvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRigvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYoLyUnb3BhcXVlR0Y4LyUrZXhlY3V0YWJsZUdGOC8lKXJlYWRvb [...]
+</Output>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSNtbkc2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGKDY5USwxMTI1MC4wMDAwMEYoLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRigvJSVzaXplR1EjMTJGKC8lJWJvbGRHUSZmYWxzZUYoLyUnaXRhbGljR0Y1LyUqdW5kZXJsaW5lR0Y1LyUqc3Vic2NyaXB0R0Y1LyUsc3VwZXJzY3JpcHRHRjUvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRigvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYoLyUnb3BhcXVlR0Y1LyUrZXhlY3V0YWJsZUdGNS8lKXJlYWRvbmx5R1EldHJ1ZUYoL [...]
+</Output>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtbkdGJTY5USwyLjUyNzg2NTk5MkYoLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRigvJSVzaXplR1EjMTJGKC8lJWJvbGRHUSZmYWxzZUYoLyUnaXRhbGljR0Y4LyUqdW5kZXJsaW5lR0Y4LyUqc3Vic2NyaXB0R0Y4LyUsc3VwZXJzY3JpcHRHRjgvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRigvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYoLyUnb3BhcXVlR0Y4LyUrZXhlY3V0YWJsZUdGOC8lKXJlYWRvb [...]
+</Output>
+</Group>
+<Group labelreference="L411" drawlabel="true">
+<Input>
+<Text-field style="Text" layout="Normal"></Text-field>
+<Text-field style="Text" italic="true" size="14" layout="Normal"><Font italic="true" size="14">Solving a linear system</Font></Text-field>
+<Text-field style="Text" layout="Normal"></Text-field>
+</Input>
+</Group>
+<Group labelreference="L402" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">b:=1.*Vector(n,rand(-1..1));</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzYlLUkjbWlHRiQ2OVEiYkYnLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRicvJSVzaXplR1EjMTJGJy8lJWJvbGRHUSZmYWxzZUYnLyUnaXRhbGljR1EldHJ1ZUYnLyUqdW5kZXJsaW5lR0Y3LyUqc3Vic2NyaXB0R0Y3LyUsc3VwZXJzY3JpcHRHRjcvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRicvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYnLyUnb3BhcXVlR0Y3LyUrZXhlY3V0YWJsZUdGNy8lKXJlYWRvbmx5R0Y6L [...]
+</Output>
+</Group>
+<Group labelreference="L403" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">Digits:=14;</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtaUdGJTY5USdEaWdpdHNGKC8lJ2ZhbWlseUdRMFRpbWVzfk5ld35Sb21hbkYoLyUlc2l6ZUdRIzEyRigvJSVib2xkR1EmZmFsc2VGKC8lJ2l0YWxpY0dRJXRydWVGKC8lKnVuZGVybGluZUdGOC8lKnN1YnNjcmlwdEdGOC8lLHN1cGVyc2NyaXB0R0Y4LyUrZm9yZWdyb3VuZEdRKlswLDAsMjU1XUYoLyUrYmFja2dyb3VuZEdRLlsyNTUsMjU1LDI1NV1GKC8lJ29wYXF1ZUdGOC8lK2V4ZWN1dGFibGVHRjgvJSlyZWFkb [...]
+</Output>
+</Group>
+<Group labelreference="L418" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">t:=time():x:=LinearSolve(MR,b,method=hybrid):time()-t;</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSNtbkc2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGKDY5USYwLjAwOUYoLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRigvJSVzaXplR1EjMTJGKC8lJWJvbGRHUSZmYWxzZUYoLyUnaXRhbGljR0Y1LyUqdW5kZXJsaW5lR0Y1LyUqc3Vic2NyaXB0R0Y1LyUsc3VwZXJzY3JpcHRHRjUvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRigvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYoLyUnb3BhcXVlR0Y1LyUrZXhlY3V0YWJsZUdGNS8lKXJlYWRvbmx5R1EldHJ1ZUYoLyUpY29tc [...]
+</Output>
+</Group>
+<Group labelreference="L416" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">Norm(MR.x-b);</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSNtbkc2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGKDY5UTQyMzcuMTE3MTg3NTAwMDAwMDAwRigvJSdmYW1pbHlHUTBUaW1lc35OZXd+Um9tYW5GKC8lJXNpemVHUSMxMkYoLyUlYm9sZEdRJmZhbHNlRigvJSdpdGFsaWNHRjUvJSp1bmRlcmxpbmVHRjUvJSpzdWJzY3JpcHRHRjUvJSxzdXBlcnNjcmlwdEdGNS8lK2ZvcmVncm91bmRHUSpbMCwwLDI1NV1GKC8lK2JhY2tncm91bmRHUS5bMjU1LDI1NSwyNTVdRigvJSdvcGFxdWVHRjUvJStleGVjdXRhYmxlR0Y1LyUpcmVhZG9ubHlHU [...]
+</Output>
+</Group>
+<Group labelreference="L421" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">A:=Matrix(MR,datatype=integer[4]);</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzYlLUkjbWlHRiQ2OVEiQUYnLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRicvJSVzaXplR1EjMTJGJy8lJWJvbGRHUSZmYWxzZUYnLyUnaXRhbGljR1EldHJ1ZUYnLyUqdW5kZXJsaW5lR0Y3LyUqc3Vic2NyaXB0R0Y3LyUsc3VwZXJzY3JpcHRHRjcvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRicvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYnLyUnb3BhcXVlR0Y3LyUrZXhlY3V0YWJsZUdGNy8lKXJlYWRvbmx5R0Y6L [...]
+</Output>
+</Group>
+<Group labelreference="L420" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">t:=time():y:=lbSolve(A,b):time()-t;</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtc0dGJTYjUTFjb252ZXJzaW9ufnRpbWU6RigtSSNtb0dGJTYzUSIsRigvJSVmb3JtR1EmaW5maXhGKC8lJmZlbmNlR1EmZmFsc2VGKC8lKnNlcGFyYXRvckdRJXRydWVGKC8lJ2xzcGFjZUdRJDBlbUYoLyUncnNwYWNlR1EzdmVyeXRoaWNrbWF0aHNwYWNlRigvJSlzdHJldGNoeUdGOS8lKnN5bW1ldHJpY0dGOS8lKG1heHNpemVHUSlpbmZpbml0eUYoLyUobWluc2l6ZUdRIjFGKC8lKGxhcmdlb3BHRjkvJS5tb3ZhY [...]
+</Output>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSNtbkc2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGKDY5USYwLjMwN0YoLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRigvJSVzaXplR1EjMTJGKC8lJWJvbGRHUSZmYWxzZUYoLyUnaXRhbGljR0Y1LyUqdW5kZXJsaW5lR0Y1LyUqc3Vic2NyaXB0R0Y1LyUsc3VwZXJzY3JpcHRHRjUvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRigvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYoLyUnb3BhcXVlR0Y1LyUrZXhlY3V0YWJsZUdGNS8lKXJlYWRvbmx5R1EldHJ1ZUYoLyUpY29tc [...]
+</Output>
+</Group>
+<Group labelreference="L417" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">Norm(A.y-b);</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSNtbkc2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGKDY5USMwLkYoLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRigvJSVzaXplR1EjMTJGKC8lJWJvbGRHUSZmYWxzZUYoLyUnaXRhbGljR0Y1LyUqdW5kZXJsaW5lR0Y1LyUqc3Vic2NyaXB0R0Y1LyUsc3VwZXJzY3JpcHRHRjUvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRigvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYoLyUnb3BhcXVlR0Y1LyUrZXhlY3V0YWJsZUdGNS8lKXJlYWRvbmx5R1EldHJ1ZUYoLyUpY29tcG9zZ [...]
+</Output>
+</Group>
+<Group labelreference="L413" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal"></Text-field>
+</Input>
+</Group>
+<Group labelreference="L414" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal"></Text-field>
+</Input>
+</Group>
+<Text-field style="Text" layout="Normal"></Text-field>
+<Text-field style="Text" size="14" layout="Normal"></Text-field>
+</Section>
+<Text-field style="Text" layout="Normal"></Text-field>
+<Section collapsed="true" MultipleChoiceAnswerIndex="-1" MultipleChoiceRandomizeChoices="false" TrueFalseAnswerIndex="-1" EssayAnswerRows="5" EssayAnswerColumns="60"><Title>
+<Text-field style="Heading 3" layout="Heading 3">High precision results</Text-field></Title>
+<Text-field style="Text" layout="Normal"></Text-field>
+<Group labelreference="L423" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">Tref:=ImportMatrix("tref200.dat",format=entries);</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzYlLUkjbWlHRiQ2OVElVHJlZkYnLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRicvJSVzaXplR1EjMTJGJy8lJWJvbGRHUSZmYWxzZUYnLyUnaXRhbGljR1EldHJ1ZUYnLyUqdW5kZXJsaW5lR0Y3LyUqc3Vic2NyaXB0R0Y3LyUsc3VwZXJzY3JpcHRHRjcvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRicvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYnLyUnb3BhcXVlR0Y3LyUrZXhlY3V0YWJsZUdGNy8lKXJlYWRvbmx5R [...]
+</Output>
+</Group>
+<Group labelreference="L424" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">b:=Vector(200,rand(-1..1),datatype=integer[4]);</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzYlLUkjbWlHRiQ2OVEiYkYnLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRicvJSVzaXplR1EjMTJGJy8lJWJvbGRHUSZmYWxzZUYnLyUnaXRhbGljR1EldHJ1ZUYnLyUqdW5kZXJsaW5lR0Y3LyUqc3Vic2NyaXB0R0Y3LyUsc3VwZXJzY3JpcHRHRjcvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRicvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYnLyUnb3BhcXVlR0Y3LyUrZXhlY3V0YWJsZUdGNy8lKXJlYWRvbmx5R0Y6L [...]
+</Output>
+</Group>
+<Group labelreference="L430" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">Digits:=14;</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtaUdGJTY5USdEaWdpdHNGKC8lJ2ZhbWlseUdRMFRpbWVzfk5ld35Sb21hbkYoLyUlc2l6ZUdRIzEyRigvJSVib2xkR1EmZmFsc2VGKC8lJ2l0YWxpY0dRJXRydWVGKC8lKnVuZGVybGluZUdGOC8lKnN1YnNjcmlwdEdGOC8lLHN1cGVyc2NyaXB0R0Y4LyUrZm9yZWdyb3VuZEdRKlswLDAsMjU1XUYoLyUrYmFja2dyb3VuZEdRLlsyNTUsMjU1LDI1NV1GKC8lJ29wYXF1ZUdGOC8lK2V4ZWN1dGFibGVHRjgvJSlyZWFkb [...]
+</Output>
+</Group>
+<Group labelreference="L425" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">t:=time():x:=LinearSolve(1.*Tref,1.*b):time()-t;</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSNtbkc2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGKDY5USYwLjA2NUYoLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRigvJSVzaXplR1EjMTJGKC8lJWJvbGRHUSZmYWxzZUYoLyUnaXRhbGljR0Y1LyUqdW5kZXJsaW5lR0Y1LyUqc3Vic2NyaXB0R0Y1LyUsc3VwZXJzY3JpcHRHRjUvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRigvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYoLyUnb3BhcXVlR0Y1LyUrZXhlY3V0YWJsZUdGNS8lKXJlYWRvbmx5R1EldHJ1ZUYoLyUpY29tc [...]
+</Output>
+</Group>
+<Group labelreference="L426" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">Norm(Tref.x-b);</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtbkdGJTY5UTQyLjMxNzMxMzQzNjQ2MDc1NzgyRigvJSdmYW1pbHlHUTBUaW1lc35OZXd+Um9tYW5GKC8lJXNpemVHUSMxMkYoLyUlYm9sZEdRJmZhbHNlRigvJSdpdGFsaWNHRjgvJSp1bmRlcmxpbmVHRjgvJSpzdWJzY3JpcHRHRjgvJSxzdXBlcnNjcmlwdEdGOC8lK2ZvcmVncm91bmRHUSpbMCwwLDI1NV1GKC8lK2JhY2tncm91bmRHUS5bMjU1LDI1NSwyNTVdRigvJSdvcGFxdWVHRjgvJStleGVjdXRhYmxlR0Y4L [...]
+</Output>
+</Group>
+<Group labelreference="L427" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">t:=time():y:=lbSolve(Tref,b):time()-t;</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtc0dGJTYjUTFjb252ZXJzaW9ufnRpbWU6RigtSSNtb0dGJTYzUSIsRigvJSVmb3JtR1EmaW5maXhGKC8lJmZlbmNlR1EmZmFsc2VGKC8lKnNlcGFyYXRvckdRJXRydWVGKC8lJ2xzcGFjZUdRJDBlbUYoLyUncnNwYWNlR1EzdmVyeXRoaWNrbWF0aHNwYWNlRigvJSlzdHJldGNoeUdGOS8lKnN5bW1ldHJpY0dGOS8lKG1heHNpemVHUSlpbmZpbml0eUYoLyUobWluc2l6ZUdRIjFGKC8lKGxhcmdlb3BHRjkvJS5tb3ZhY [...]
+</Output>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSNtbkc2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGKDY5USYwLjM3MkYoLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRigvJSVzaXplR1EjMTJGKC8lJWJvbGRHUSZmYWxzZUYoLyUnaXRhbGljR0Y1LyUqdW5kZXJsaW5lR0Y1LyUqc3Vic2NyaXB0R0Y1LyUsc3VwZXJzY3JpcHRHRjUvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRigvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYoLyUnb3BhcXVlR0Y1LyUrZXhlY3V0YWJsZUdGNS8lKXJlYWRvbmx5R1EldHJ1ZUYoLyUpY29tc [...]
+</Output>
+</Group>
+<Group labelreference="L428" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">Norm(Tref.y-b);</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSNtbkc2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGKDY5USIwRigvJSdmYW1pbHlHUTBUaW1lc35OZXd+Um9tYW5GKC8lJXNpemVHUSMxMkYoLyUlYm9sZEdRJmZhbHNlRigvJSdpdGFsaWNHRjUvJSp1bmRlcmxpbmVHRjUvJSpzdWJzY3JpcHRHRjUvJSxzdXBlcnNjcmlwdEdGNS8lK2ZvcmVncm91bmRHUSpbMCwwLDI1NV1GKC8lK2JhY2tncm91bmRHUS5bMjU1LDI1NSwyNTVdRigvJSdvcGFxdWVHRjUvJStleGVjdXRhYmxlR0Y1LyUpcmVhZG9ubHlHUSV0cnVlRigvJSljb21wb3NlZ [...]
+</Output>
+</Group>
+<Group labelreference="L431" drawlabel="true">
+<Input>
+<Text-field style="Text" layout="Normal"></Text-field>
+<Text-field style="Text" italic="true" size="14" layout="Normal"><Font italic="true" size="14">Bug in Maple</Font></Text-field>
+<Text-field style="Text" layout="Normal"></Text-field>
+</Input>
+</Group>
+<Group labelreference="L434" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">Determinant(Tref);Rank(Tref);</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSNtbkc2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGKDY5USIwRigvJSdmYW1pbHlHUTBUaW1lc35OZXd+Um9tYW5GKC8lJXNpemVHUSMxMkYoLyUlYm9sZEdRJmZhbHNlRigvJSdpdGFsaWNHRjUvJSp1bmRlcmxpbmVHRjUvJSpzdWJzY3JpcHRHRjUvJSxzdXBlcnNjcmlwdEdGNS8lK2ZvcmVncm91bmRHUSpbMCwwLDI1NV1GKC8lK2JhY2tncm91bmRHUS5bMjU1LDI1NSwyNTVdRigvJSdvcGFxdWVHRjUvJStleGVjdXRhYmxlR0Y1LyUpcmVhZG9ubHlHUSV0cnVlRigvJSljb21wb3NlZ [...]
+</Output>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSNtbkc2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGKDY5USQxOTlGKC8lJ2ZhbWlseUdRMFRpbWVzfk5ld35Sb21hbkYoLyUlc2l6ZUdRIzEyRigvJSVib2xkR1EmZmFsc2VGKC8lJ2l0YWxpY0dGNS8lKnVuZGVybGluZUdGNS8lKnN1YnNjcmlwdEdGNS8lLHN1cGVyc2NyaXB0R0Y1LyUrZm9yZWdyb3VuZEdRKlswLDAsMjU1XUYoLyUrYmFja2dyb3VuZEdRLlsyNTUsMjU1LDI1NV1GKC8lJ29wYXF1ZUdGNS8lK2V4ZWN1dGFibGVHRjUvJSlyZWFkb25seUdRJXRydWVGKC8lKWNvbXBvc [...]
+</Output>
+</Group>
+<Group labelreference="L440" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">Digits:=14;</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtaUdGJTY5USdEaWdpdHNGKC8lJ2ZhbWlseUdRMFRpbWVzfk5ld35Sb21hbkYoLyUlc2l6ZUdRIzEyRigvJSVib2xkR1EmZmFsc2VGKC8lJ2l0YWxpY0dRJXRydWVGKC8lKnVuZGVybGluZUdGOC8lKnN1YnNjcmlwdEdGOC8lLHN1cGVyc2NyaXB0R0Y4LyUrZm9yZWdyb3VuZEdRKlswLDAsMjU1XUYoLyUrYmFja2dyb3VuZEdRLlsyNTUsMjU1LDI1NV1GKC8lJ29wYXF1ZUdGOC8lK2V4ZWN1dGFibGVHRjgvJSlyZWFkb [...]
+</Output>
+</Group>
+<Group labelreference="L435" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">Determinant(1.*Tref);Rank(1.*Tref);</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtbkdGJTY5UTAyLjQwODQ1MTkyNTQ4MDVGKC8lJ2ZhbWlseUdRMFRpbWVzfk5ld35Sb21hbkYoLyUlc2l6ZUdRIzEyRigvJSVib2xkR1EmZmFsc2VGKC8lJ2l0YWxpY0dGOC8lKnVuZGVybGluZUdGOC8lKnN1YnNjcmlwdEdGOC8lLHN1cGVyc2NyaXB0R0Y4LyUrZm9yZWdyb3VuZEdRKlswLDAsMjU1XUYoLyUrYmFja2dyb3VuZEdRLlsyNTUsMjU1LDI1NV1GKC8lJ29wYXF1ZUdGOC8lK2V4ZWN1dGFibGVHRjgvJSlyZ [...]
+</Output>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSNtbkc2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGKDY5USQyMDBGKC8lJ2ZhbWlseUdRMFRpbWVzfk5ld35Sb21hbkYoLyUlc2l6ZUdRIzEyRigvJSVib2xkR1EmZmFsc2VGKC8lJ2l0YWxpY0dGNS8lKnVuZGVybGluZUdGNS8lKnN1YnNjcmlwdEdGNS8lLHN1cGVyc2NyaXB0R0Y1LyUrZm9yZWdyb3VuZEdRKlswLDAsMjU1XUYoLyUrYmFja2dyb3VuZEdRLlsyNTUsMjU1LDI1NV1GKC8lJ29wYXF1ZUdGNS8lK2V4ZWN1dGFibGVHRjUvJSlyZWFkb25seUdRJXRydWVGKC8lKWNvbXBvc [...]
+</Output>
+</Group>
+<Group labelreference="L436" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">lbDeterminant(Tref);lbRank(Tref);</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtc0dGJTYjUTFjb252ZXJzaW9ufnRpbWU6RigtSSNtb0dGJTYzUSIsRigvJSVmb3JtR1EmaW5maXhGKC8lJmZlbmNlR1EmZmFsc2VGKC8lKnNlcGFyYXRvckdRJXRydWVGKC8lJ2xzcGFjZUdRJDBlbUYoLyUncnNwYWNlR1EzdmVyeXRoaWNrbWF0aHNwYWNlRigvJSlzdHJldGNoeUdGOS8lKnN5bW1ldHJpY0dGOS8lKG1heHNpemVHUSlpbmZpbml0eUYoLyUobWluc2l6ZUdRIjFGKC8lKGxhcmdlb3BHRjkvJS5tb3ZhY [...]
+</Output>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSNtbkc2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGKDY5UVxbbTI0MDg0NTE5MjU0ODAyNzQzMTkzNTM5MjE0MTY1NjUwNzE0MDcxODM4ODg4OTI4ODk5NjM4MDgxMzEzMjU2MjE0MjAxMDk4MTY2MDQyMzgyMTg3MDYwNDE4MDEzMTA5MzQ5NzE1NjMzNzYyNDgzNDY1ODIzMjM4NTEyNTU5ODQwNjk4OTQ4OTY0MDE1NjUwNDExMzc4MjU1NDYxMzU2OTYyODg4NzMwMjgwNjEwMzQ0MTc2MzU1NDEyMjQ4OTk4MDc1NDE0NjYzMTcxNzUxOTYyMTQyMzA3OTQ3MjE4NTE3NDkyNzAzNzI4OTg2N [...]
+</Output>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtc0dGJTYjUTFjb252ZXJzaW9ufnRpbWU6RigtSSNtb0dGJTYzUSIsRigvJSVmb3JtR1EmaW5maXhGKC8lJmZlbmNlR1EmZmFsc2VGKC8lKnNlcGFyYXRvckdRJXRydWVGKC8lJ2xzcGFjZUdRJDBlbUYoLyUncnNwYWNlR1EzdmVyeXRoaWNrbWF0aHNwYWNlRigvJSlzdHJldGNoeUdGOS8lKnN5bW1ldHJpY0dGOS8lKG1heHNpemVHUSlpbmZpbml0eUYoLyUobWluc2l6ZUdRIjFGKC8lKGxhcmdlb3BHRjkvJS5tb3ZhY [...]
+</Output>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSNtbkc2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGKDY5USQyMDBGKC8lJ2ZhbWlseUdRMFRpbWVzfk5ld35Sb21hbkYoLyUlc2l6ZUdRIzEyRigvJSVib2xkR1EmZmFsc2VGKC8lJ2l0YWxpY0dGNS8lKnVuZGVybGluZUdGNS8lKnN1YnNjcmlwdEdGNS8lLHN1cGVyc2NyaXB0R0Y1LyUrZm9yZWdyb3VuZEdRKlswLDAsMjU1XUYoLyUrYmFja2dyb3VuZEdRLlsyNTUsMjU1LDI1NV1GKC8lJ29wYXF1ZUdGNS8lK2V4ZWN1dGFibGVHRjUvJSlyZWFkb25seUdRJXRydWVGKC8lKWNvbXBvc [...]
+</Output>
+</Group>
+<Group labelreference="L437" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">Determinant(Matrix(Tref,storage=rectangular));</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSNtbkc2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGKDY5UVxbbTI0MDg0NTE5MjU0ODAyNzQzMTkzNTM5MjE0MTY1NjUwNzE0MDcxODM4ODg4OTI4ODk5NjM4MDgxMzEzMjU2MjE0MjAxMDk4MTY2MDQyMzgyMTg3MDYwNDE4MDEzMTA5MzQ5NzE1NjMzNzYyNDgzNDY1ODIzMjM4NTEyNTU5ODQwNjk4OTQ4OTY0MDE1NjUwNDExMzc4MjU1NDYxMzU2OTYyODg4NzMwMjgwNjEwMzQ0MTc2MzU1NDEyMjQ4OTk4MDc1NDE0NjYzMTcxNzUxOTYyMTQyMzA3OTQ3MjE4NTE3NDkyNzAzNzI4OTg2N [...]
+</Output>
+</Group>
+<Group labelreference="L438" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal"></Text-field>
+</Input>
+</Group>
+<Text-field style="Text" layout="Normal"></Text-field>
+</Section>
+<Text-field style="Text" layout="Normal"></Text-field>
+</Section>
+<Text-field style="Text" layout="Normal"></Text-field>
+</Section>
+<Section collapsed="true" MultipleChoiceAnswerIndex="-1" MultipleChoiceRandomizeChoices="false" TrueFalseAnswerIndex="-1" EssayAnswerRows="5" EssayAnswerColumns="60"><Title>
+<Text-field style="Heading 1" layout="Heading 1">Low level of the interface</Text-field></Title>
+<Text-field style="Text" layout="Normal"></Text-field>
+<Group labelreference="L283" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">restart;</Text-field>
+</Input>
+</Group>
+<Group labelreference="L284" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">p:=17;</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtaUdGJTY5USJwRigvJSdmYW1pbHlHUTBUaW1lc35OZXd+Um9tYW5GKC8lJXNpemVHUSMxMkYoLyUlYm9sZEdRJmZhbHNlRigvJSdpdGFsaWNHUSV0cnVlRigvJSp1bmRlcmxpbmVHRjgvJSpzdWJzY3JpcHRHRjgvJSxzdXBlcnNjcmlwdEdGOC8lK2ZvcmVncm91bmRHUSpbMCwwLDI1NV1GKC8lK2JhY2tncm91bmRHUS5bMjU1LDI1NSwyNTVdRigvJSdvcGFxdWVHRjgvJStleGVjdXRhYmxlR0Y4LyUpcmVhZG9ubHlHR [...]
+</Output>
+</Group>
+<Section collapsed="true" MultipleChoiceAnswerIndex="-1" MultipleChoiceRandomizeChoices="false" TrueFalseAnswerIndex="-1" EssayAnswerRows="5" EssayAnswerColumns="60"><Title>
+<Text-field style="Heading 2" layout="Heading 2">Submodule of module LinBox</Text-field></Title>
+<Group labelreference="L285" drawlabel="true">
+<Input>
+<Text-field style="Text" layout="Normal"></Text-field>
+</Input>
+</Group>
+<Group labelreference="L286" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">with(LinBox:-Dev);</Text-field>
+</Input>
+<Output>
+<Text-field style="Line Printed Output" layout="Line Printed Output"> LinBox/Maple Interface Package beta version 0.1
+ by Pascal Giorgi (pgiorgi at uwaterloo.ca)</Text-field>
+</Output>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtb0dGJTYzUSJbRigvJSVmb3JtR1EncHJlZml4RigvJSZmZW5jZUdRJXRydWVGKC8lKnNlcGFyYXRvckdRJmZhbHNlRigvJSdsc3BhY2VHUS50aGlubWF0aHNwYWNlRigvJSdyc3BhY2VHRjsvJSlzdHJldGNoeUdGNS8lKnN5bW1ldHJpY0dGOC8lKG1heHNpemVHUSlpbmZpbml0eUYoLyUobWluc2l6ZUdRIjFGKC8lKGxhcmdlb3BHRjgvJS5tb3ZhYmxlbGltaXRzR0Y4LyUnYWNjZW50R0Y4LyUwZm9udF9zdHlsZV9uY [...]
+</Output>
+</Group>
+<Group labelreference="L287" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal"></Text-field>
+</Input>
+</Group>
+<Group labelreference="L288" drawlabel="true">
+<Input>
+<Text-field style="Text" layout="Normal"></Text-field>
+</Input>
+</Group>
+<Group labelreference="L291" drawlabel="true">
+<Input>
+<Text-field style="Text" layout="Normal"></Text-field>
+</Input>
+</Group>
+</Section>
+<Section collapsed="true" MultipleChoiceAnswerIndex="-1" MultipleChoiceRandomizeChoices="false" TrueFalseAnswerIndex="-1" EssayAnswerRows="5" EssayAnswerColumns="60"><Title>
+<Text-field style="Heading 2" layout="Heading 2">Creation of Domain</Text-field></Title>
+<Text-field style="Text" layout="Normal"></Text-field>
+<Text-field style="Text" size="16" layout="Normal"><Font size="16">Integers Domain</Font></Text-field>
+<Text-field style="Text" size="16" layout="Normal"></Text-field>
+<Group labelreference="L293" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">Z:=lbDomain(0,"linbox_ring_integer");</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtaUdGJTY5USJaRigvJSdmYW1pbHlHUTBUaW1lc35OZXd+Um9tYW5GKC8lJXNpemVHUSMxMkYoLyUlYm9sZEdRJmZhbHNlRigvJSdpdGFsaWNHUSV0cnVlRigvJSp1bmRlcmxpbmVHRjgvJSpzdWJzY3JpcHRHRjgvJSxzdXBlcnNjcmlwdEdGOC8lK2ZvcmVncm91bmRHUSpbMCwwLDI1NV1GKC8lK2JhY2tncm91bmRHUS5bMjU1LDI1NSwyNTVdRigvJSdvcGFxdWVHRjgvJStleGVjdXRhYmxlR0Y4LyUpcmVhZG9ubHlHR [...]
+</Output>
+</Group>
+<Group labelreference="L294" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">Z:=lbDomain();</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtaUdGJTY5USJaRigvJSdmYW1pbHlHUTBUaW1lc35OZXd+Um9tYW5GKC8lJXNpemVHUSMxMkYoLyUlYm9sZEdRJmZhbHNlRigvJSdpdGFsaWNHUSV0cnVlRigvJSp1bmRlcmxpbmVHRjgvJSpzdWJzY3JpcHRHRjgvJSxzdXBlcnNjcmlwdEdGOC8lK2ZvcmVncm91bmRHUSpbMCwwLDI1NV1GKC8lK2JhY2tncm91bmRHUS5bMjU1LDI1NSwyNTVdRigvJSdvcGFxdWVHRjgvJStleGVjdXRhYmxlR0Y4LyUpcmVhZG9ubHlHR [...]
+</Output>
+</Group>
+<Text-field style="Text" layout="Normal"></Text-field>
+<Text-field style="Text" layout="Normal"><Font size="16">Finite fields domain</Font></Text-field>
+<Text-field style="Text" layout="Normal"></Text-field>
+<Group labelreference="L301" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">Zp:=lbDomain(p,"linbox_field_dbl");</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtaUdGJTY5USNacEYoLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRigvJSVzaXplR1EjMTJGKC8lJWJvbGRHUSZmYWxzZUYoLyUnaXRhbGljR1EldHJ1ZUYoLyUqdW5kZXJsaW5lR0Y4LyUqc3Vic2NyaXB0R0Y4LyUsc3VwZXJzY3JpcHRHRjgvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRigvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYoLyUnb3BhcXVlR0Y4LyUrZXhlY3V0YWJsZUdGOC8lKXJlYWRvbmx5R [...]
+</Output>
+</Group>
+<Group labelreference="L302" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">Zp:=lbDomain(p);</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtaUdGJTY5USNacEYoLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRigvJSVzaXplR1EjMTJGKC8lJWJvbGRHUSZmYWxzZUYoLyUnaXRhbGljR1EldHJ1ZUYoLyUqdW5kZXJsaW5lR0Y4LyUqc3Vic2NyaXB0R0Y4LyUsc3VwZXJzY3JpcHRHRjgvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRigvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYoLyUnb3BhcXVlR0Y4LyUrZXhlY3V0YWJsZUdGOC8lKXJlYWRvbmx5R [...]
+</Output>
+</Group>
+<Text-field style="Text" layout="Normal"></Text-field>
+<Text-field style="Text" layout="Normal"><Font size="16">Use of global default type</Font></Text-field>
+<Text-field style="Text" layout="Normal"></Text-field>
+<Group labelreference="L296" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">lbSetIntegerRing("linbox_ring_integer");</Text-field>
+</Input>
+</Group>
+<Group labelreference="L297" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">lbSetPrimeField("linbox_field_dbl");</Text-field>
+</Input>
+</Group>
+<Group labelreference="L304" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">Z1:=lbDomain();</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtaUdGJTY5USNaMUYoLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRigvJSVzaXplR1EjMTJGKC8lJWJvbGRHUSZmYWxzZUYoLyUnaXRhbGljR1EldHJ1ZUYoLyUqdW5kZXJsaW5lR0Y4LyUqc3Vic2NyaXB0R0Y4LyUsc3VwZXJzY3JpcHRHRjgvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRigvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYoLyUnb3BhcXVlR0Y4LyUrZXhlY3V0YWJsZUdGOC8lKXJlYWRvbmx5R [...]
+</Output>
+</Group>
+<Group labelreference="L305" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">Zp2:=lbDomain(p);</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtaUdGJTY5USRacDJGKC8lJ2ZhbWlseUdRMFRpbWVzfk5ld35Sb21hbkYoLyUlc2l6ZUdRIzEyRigvJSVib2xkR1EmZmFsc2VGKC8lJ2l0YWxpY0dRJXRydWVGKC8lKnVuZGVybGluZUdGOC8lKnN1YnNjcmlwdEdGOC8lLHN1cGVyc2NyaXB0R0Y4LyUrZm9yZWdyb3VuZEdRKlswLDAsMjU1XUYoLyUrYmFja2dyb3VuZEdRLlsyNTUsMjU1LDI1NV1GKC8lJ29wYXF1ZUdGOC8lK2V4ZWN1dGFibGVHRjgvJSlyZWFkb25se [...]
+</Output>
+</Group>
+<Group labelreference="L387" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal"></Text-field>
+</Input>
+</Group>
+</Section>
+<Section collapsed="true" MultipleChoiceAnswerIndex="-1" MultipleChoiceRandomizeChoices="false" TrueFalseAnswerIndex="-1" EssayAnswerRows="5" EssayAnswerColumns="60"><Title>
+<Text-field style="Heading 2" layout="Heading 2">Using Blackbox (Matrix)</Text-field></Title>
+<Text-field style="Text" layout="Normal"></Text-field>
+<Text-field style="Text" layout="Normal"></Text-field>
+<Group labelreference="L306" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">A:=lbBlackbox(Z,10,10);</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtaUdGJTY5USJBRigvJSdmYW1pbHlHUTBUaW1lc35OZXd+Um9tYW5GKC8lJXNpemVHUSMxMkYoLyUlYm9sZEdRJmZhbHNlRigvJSdpdGFsaWNHUSV0cnVlRigvJSp1bmRlcmxpbmVHRjgvJSpzdWJzY3JpcHRHRjgvJSxzdXBlcnNjcmlwdEdGOC8lK2ZvcmVncm91bmRHUSpbMCwwLDI1NV1GKC8lK2JhY2tncm91bmRHUS5bMjU1LDI1NSwyNTVdRigvJSdvcGFxdWVHRjgvJStleGVjdXRhYmxlR0Y4LyUpcmVhZG9ubHlHR [...]
+</Output>
+</Group>
+<Group labelreference="L307" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">Ap:=lbBlackbox(Zp,10,10);</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtaUdGJTY5USNBcEYoLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRigvJSVzaXplR1EjMTJGKC8lJWJvbGRHUSZmYWxzZUYoLyUnaXRhbGljR1EldHJ1ZUYoLyUqdW5kZXJsaW5lR0Y4LyUqc3Vic2NyaXB0R0Y4LyUsc3VwZXJzY3JpcHRHRjgvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRigvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYoLyUnb3BhcXVlR0Y4LyUrZXhlY3V0YWJsZUdGOC8lKXJlYWRvbmx5R [...]
+</Output>
+</Group>
+<Group labelreference="L445" drawlabel="true">
+<Input>
+<Text-field style="Text" size="16" layout="Normal"></Text-field>
+<Text-field style="Text" size="16" layout="Normal"><Font size="14">Use of global default type</Font></Text-field>
+<Text-field style="Text" size="16" layout="Normal"></Text-field>
+</Input>
+</Group>
+<Group labelreference="L448" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">lbSetBlackbox("linbox_sparse");</Text-field>
+</Input>
+</Group>
+<Group labelreference="L446" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">A:=lbBlackbox(Z,10,10);</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtaUdGJTY5USJBRigvJSdmYW1pbHlHUTBUaW1lc35OZXd+Um9tYW5GKC8lJXNpemVHUSMxMkYoLyUlYm9sZEdRJmZhbHNlRigvJSdpdGFsaWNHUSV0cnVlRigvJSp1bmRlcmxpbmVHRjgvJSpzdWJzY3JpcHRHRjgvJSxzdXBlcnNjcmlwdEdGOC8lK2ZvcmVncm91bmRHUSpbMCwwLDI1NV1GKC8lK2JhY2tncm91bmRHUS5bMjU1LDI1NSwyNTVdRigvJSdvcGFxdWVHRjgvJStleGVjdXRhYmxlR0Y4LyUpcmVhZG9ubHlHR [...]
+</Output>
+</Group>
+<Group labelreference="L447" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal"></Text-field>
+</Input>
+</Group>
+<Group labelreference="L365" drawlabel="true">
+<Input>
+<Text-field style="Text" layout="Normal"></Text-field>
+<Text-field style="Text" layout="Normal"> <Font size="14">Set entries at random over the domain</Font></Text-field>
+<Text-field style="Text" layout="Normal"></Text-field>
+</Input>
+</Group>
+<Group labelreference="L308" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">lbRandom(A);</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSNtaUc2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGKDY5UV1yW35MaW5Cb3h+QmxhY2tib3h+KHN0b3JhZ2V+PX5saW5ib3hfc3BhcnNlLH5kb21haW5+PX5bTGluQm94fkRvbWFpbn4odHlwZX49fmxpbmJveF9yaW5nX2ludGVnZXIsfmNoYXJhY3R+PX4wKV1+KV18K0YoLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRigvJSVzaXplR1EjMTJGKC8lJWJvbGRHUSZmYWxzZUYoLyUnaXRhbGljR1EldHJ1ZUYoLyUqdW5kZXJsaW5lR0Y1LyUqc3Vic2NyaXB0R0Y1LyUsc3VwZXJzY3Jpc [...]
+</Output>
+</Group>
+<Group labelreference="L311" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">lbRandom(Ap);</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSNtaUc2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGKDY5UWpxW35MaW5Cb3h+QmxhY2tib3h+KHN0b3JhZ2V+PX5saW5ib3hfZGVuc2UsfmRvbWFpbn49fltMaW5Cb3h+RG9tYWlufih0eXBlfj1+bGluYm94X2ZpZWxkX2RibCx+Y2hhcmFjdH49fjE3KV1+KV18K0YoLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRigvJSVzaXplR1EjMTJGKC8lJWJvbGRHUSZmYWxzZUYoLyUnaXRhbGljR1EldHJ1ZUYoLyUqdW5kZXJsaW5lR0Y1LyUqc3Vic2NyaXB0R0Y1LyUsc3VwZXJzY3JpcHRHR [...]
+</Output>
+</Group>
+<Group labelreference="L363" drawlabel="true">
+<Input>
+<Text-field style="Text" size="14" layout="Normal"></Text-field>
+<Text-field style="Text" size="14" layout="Normal"><Font size="14">Computation without specifying the domain</Font></Text-field>
+<Text-field style="Text" size="14" layout="Normal"></Text-field>
+</Input>
+</Group>
+<Group labelreference="L366" drawlabel="true">
+<Input>
+<Text-field style="Text" italic="true" size="14" layout="Normal"><Font italic="true" size="14">Over the integers</Font></Text-field>
+</Input>
+</Group>
+<Group labelreference="L312" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">d1:=lbDeterminant(A);</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtaUdGJTY5USNkMUYoLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRigvJSVzaXplR1EjMTJGKC8lJWJvbGRHUSZmYWxzZUYoLyUnaXRhbGljR1EldHJ1ZUYoLyUqdW5kZXJsaW5lR0Y4LyUqc3Vic2NyaXB0R0Y4LyUsc3VwZXJzY3JpcHRHRjgvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRigvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYoLyUnb3BhcXVlR0Y4LyUrZXhlY3V0YWJsZUdGOC8lKXJlYWRvbmx5R [...]
+</Output>
+</Group>
+<Group labelreference="L367" drawlabel="true">
+<Input>
+<Text-field style="Text" italic="true" size="14" layout="Normal"><Font italic="true" size="14">Over a finite field</Font></Text-field>
+</Input>
+</Group>
+<Group labelreference="L313" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">d2:=lbDeterminant(Ap);</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtaUdGJTY5USNkMkYoLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRigvJSVzaXplR1EjMTJGKC8lJWJvbGRHUSZmYWxzZUYoLyUnaXRhbGljR1EldHJ1ZUYoLyUqdW5kZXJsaW5lR0Y4LyUqc3Vic2NyaXB0R0Y4LyUsc3VwZXJzY3JpcHRHRjgvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRigvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYoLyUnb3BhcXVlR0Y4LyUrZXhlY3V0YWJsZUdGOC8lKXJlYWRvbmx5R [...]
+</Output>
+</Group>
+<Group labelreference="L450" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal"></Text-field>
+</Input>
+</Group>
+<Group labelreference="L309" drawlabel="true">
+<Input>
+<Text-field style="Text" size="14" layout="Normal"></Text-field>
+<Text-field style="Text" size="14" layout="Normal"><Font size="14">Converting data</Font></Text-field>
+<Text-field style="Text" size="14" layout="Normal"></Text-field>
+</Input>
+</Group>
+<Group labelreference="L441" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">lbConvertElement(d1);</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSNtbkc2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGKDY5UWhwMzExNjI3OTYyMjI4MzQ1MzA4MjI5ODYyNjQxMjc3NjYxNjczOTQ3MDg1MDkwOTQ1ODg4MjgyNzY3MTQzMjYyOTAwMDkyNTExNzI1NDIwMDc0ODEzNTIzMjY1NDk2RigvJSdmYW1pbHlHUTBUaW1lc35OZXd+Um9tYW5GKC8lJXNpemVHUSMxMkYoLyUlYm9sZEdRJmZhbHNlRigvJSdpdGFsaWNHRjUvJSp1bmRlcmxpbmVHRjUvJSpzdWJzY3JpcHRHRjUvJSxzdXBlcnNjcmlwdEdGNS8lK2ZvcmVncm91bmRHUSpbMCwwLDI1N [...]
+</Output>
+</Group>
+<Group labelreference="L449" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">lbConvertElement(d2);</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSNtbkc2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGKDY5USMxMUYoLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRigvJSVzaXplR1EjMTJGKC8lJWJvbGRHUSZmYWxzZUYoLyUnaXRhbGljR0Y1LyUqdW5kZXJsaW5lR0Y1LyUqc3Vic2NyaXB0R0Y1LyUsc3VwZXJzY3JpcHRHRjUvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRigvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYoLyUnb3BhcXVlR0Y1LyUrZXhlY3V0YWJsZUdGNS8lKXJlYWRvbmx5R1EldHJ1ZUYoLyUpY29tcG9zZ [...]
+</Output>
+</Group>
+<Group labelreference="L310" drawlabel="true">
+<Input>
+<Text-field style="Text" layout="Normal"></Text-field>
+</Input>
+</Group>
+<Text-field style="Text" layout="Normal"></Text-field>
+</Section>
+<Section collapsed="true" MultipleChoiceAnswerIndex="-1" MultipleChoiceRandomizeChoices="false" TrueFalseAnswerIndex="-1" EssayAnswerRows="5" EssayAnswerColumns="60"><Title>
+<Text-field style="Heading 2" layout="Heading 2">using Vector</Text-field></Title>
+<Text-field style="Text" layout="Normal"></Text-field>
+<Text-field style="Text" layout="Normal"></Text-field>
+<Group labelreference="L369" drawlabel="true">
+<Input>
+<Text-field style="Text" italic="true" size="14" layout="Normal"><Font italic="true" size="14">construction over the integers</Font></Text-field>
+</Input>
+</Group>
+<Group labelreference="L333" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">V:=lbVector(Z,10);</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtaUdGJTY5USJWRigvJSdmYW1pbHlHUTBUaW1lc35OZXd+Um9tYW5GKC8lJXNpemVHUSMxMkYoLyUlYm9sZEdRJmZhbHNlRigvJSdpdGFsaWNHUSV0cnVlRigvJSp1bmRlcmxpbmVHRjgvJSpzdWJzY3JpcHRHRjgvJSxzdXBlcnNjcmlwdEdGOC8lK2ZvcmVncm91bmRHUSpbMCwwLDI1NV1GKC8lK2JhY2tncm91bmRHUS5bMjU1LDI1NSwyNTVdRigvJSdvcGFxdWVHRjgvJStleGVjdXRhYmxlR0Y4LyUpcmVhZG9ubHlHR [...]
+</Output>
+</Group>
+<Group labelreference="L370" drawlabel="true">
+<Input>
+<Text-field style="Text" italic="true" size="14" layout="Normal"><Font italic="true" size="14">construction over finite field</Font></Text-field>
+</Input>
+</Group>
+<Group labelreference="L336" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">Vp:=lbVector(Zp,10);</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtaUdGJTY5USNWcEYoLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRigvJSVzaXplR1EjMTJGKC8lJWJvbGRHUSZmYWxzZUYoLyUnaXRhbGljR1EldHJ1ZUYoLyUqdW5kZXJsaW5lR0Y4LyUqc3Vic2NyaXB0R0Y4LyUsc3VwZXJzY3JpcHRHRjgvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRigvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYoLyUnb3BhcXVlR0Y4LyUrZXhlY3V0YWJsZUdGOC8lKXJlYWRvbmx5R [...]
+</Output>
+</Group>
+<Group labelreference="L451" drawlabel="true">
+<Input>
+<Text-field style="Text" size="16" layout="Normal"></Text-field>
+<Text-field style="Text" size="16" layout="Normal"><Font size="14">Use of global default type</Font></Text-field>
+<Text-field style="Text" size="16" layout="Normal"></Text-field>
+</Input>
+</Group>
+<Group labelreference="L452" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">lbSetVector("linbox_dense");</Text-field>
+</Input>
+</Group>
+<Group labelreference="L371" drawlabel="true">
+<Input>
+<Text-field style="Text" layout="Normal"></Text-field>
+</Input>
+</Group>
+<Group labelreference="L372" drawlabel="true">
+<Input>
+<Text-field style="Text" layout="Normal"> <Font size="14">Set entries at random over the domain</Font></Text-field>
+<Text-field style="Text" layout="Normal"></Text-field>
+</Input>
+</Group>
+<Group labelreference="L332" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">lbRandom(V);</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSNtaUc2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGKDY5UWpxW35MaW5Cb3h+VmVjdG9yfihzdG9yYWdlfj1+bGluYm94X2RlbnNlLH5kb21haW5+PX5bTGluQm94fkRvbWFpbn4odHlwZX49fmxpbmJveF9yaW5nX2ludGVnZXIsfmNoYXJhY3R+PX4wKV1+KV18K0YoLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRigvJSVzaXplR1EjMTJGKC8lJWJvbGRHUSZmYWxzZUYoLyUnaXRhbGljR1EldHJ1ZUYoLyUqdW5kZXJsaW5lR0Y1LyUqc3Vic2NyaXB0R0Y1LyUsc3VwZXJzY3JpcHRHR [...]
+</Output>
+</Group>
+<Group labelreference="L334" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">lbRandom(Vp);</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSNtaUc2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGKDY5UWhxW35MaW5Cb3h+VmVjdG9yfihzdG9yYWdlfj1+bGluYm94X2RlbnNlLH5kb21haW5+PX5bTGluQm94fkRvbWFpbn4odHlwZX49fmxpbmJveF9maWVsZF9kYmwsfmNoYXJhY3R+PX4xNyldfildfCtGKC8lJ2ZhbWlseUdRMFRpbWVzfk5ld35Sb21hbkYoLyUlc2l6ZUdRIzEyRigvJSVib2xkR1EmZmFsc2VGKC8lJ2l0YWxpY0dRJXRydWVGKC8lKnVuZGVybGluZUdGNS8lKnN1YnNjcmlwdEdGNS8lLHN1cGVyc2NyaXB0R0Y1L [...]
+</Output>
+</Group>
+<Group labelreference="L373" drawlabel="true">
+<Input>
+<Text-field style="Text" layout="Normal"></Text-field>
+</Input>
+</Group>
+<Group labelreference="L375" drawlabel="true">
+<Input>
+<Text-field style="Text" size="14" layout="Normal"><Font size="14">Computation without specifying the domain</Font></Text-field>
+<Text-field style="Text" size="14" layout="Normal"></Text-field>
+</Input>
+</Group>
+<Group labelreference="L376" drawlabel="true">
+<Input>
+<Text-field style="Text" italic="true" size="14" layout="Normal"><Font italic="true" size="14">Over the integers</Font></Text-field>
+</Input>
+</Group>
+<Group labelreference="L342" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">x1:=lbSolve(A,V);</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtaUdGJTY5USN4MUYoLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRigvJSVzaXplR1EjMTJGKC8lJWJvbGRHUSZmYWxzZUYoLyUnaXRhbGljR1EldHJ1ZUYoLyUqdW5kZXJsaW5lR0Y4LyUqc3Vic2NyaXB0R0Y4LyUsc3VwZXJzY3JpcHRHRjgvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRigvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYoLyUnb3BhcXVlR0Y4LyUrZXhlY3V0YWJsZUdGOC8lKXJlYWRvbmx5R [...]
+</Output>
+</Group>
+<Group labelreference="L335" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">x2:=lbSolve(Ap,Vp);</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtaUdGJTY5USN4MkYoLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRigvJSVzaXplR1EjMTJGKC8lJWJvbGRHUSZmYWxzZUYoLyUnaXRhbGljR1EldHJ1ZUYoLyUqdW5kZXJsaW5lR0Y4LyUqc3Vic2NyaXB0R0Y4LyUsc3VwZXJzY3JpcHRHRjgvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRigvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYoLyUnb3BhcXVlR0Y4LyUrZXhlY3V0YWJsZUdGOC8lKXJlYWRvbmx5R [...]
+</Output>
+</Group>
+<Group labelreference="L339" drawlabel="true">
+<Input>
+<Text-field style="Text" layout="Normal"></Text-field>
+<Text-field style="Text" size="14" layout="Normal"><Font size="14">Converting data</Font></Text-field>
+<Text-field style="Text" layout="Normal"></Text-field>
+</Input>
+</Group>
+<Group labelreference="L453" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">lbConvertVector(x1);lbConvertVector(x2);</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtb0dGJTYzUSJbRigvJSVmb3JtR1EncHJlZml4RigvJSZmZW5jZUdRJXRydWVGKC8lKnNlcGFyYXRvckdRJmZhbHNlRigvJSdsc3BhY2VHUS50aGlubWF0aHNwYWNlRigvJSdyc3BhY2VHRjsvJSlzdHJldGNoeUdGNS8lKnN5bW1ldHJpY0dGOC8lKG1heHNpemVHUSlpbmZpbml0eUYoLyUobWluc2l6ZUdRIjFGKC8lKGxhcmdlb3BHRjgvJS5tb3ZhYmxlbGltaXRzR0Y4LyUnYWNjZW50R0Y4LyUwZm9udF9zdHlsZV9uY [...]
+</Output>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtb0dGJTYzUSJbRigvJSVmb3JtR1EncHJlZml4RigvJSZmZW5jZUdRJXRydWVGKC8lKnNlcGFyYXRvckdRJmZhbHNlRigvJSdsc3BhY2VHUS50aGlubWF0aHNwYWNlRigvJSdyc3BhY2VHRjsvJSlzdHJldGNoeUdGNS8lKnN5bW1ldHJpY0dGOC8lKG1heHNpemVHUSlpbmZpbml0eUYoLyUobWluc2l6ZUdRIjFGKC8lKGxhcmdlb3BHRjgvJS5tb3ZhYmxlbGltaXRzR0Y4LyUnYWNjZW50R0Y4LyUwZm9udF9zdHlsZV9uY [...]
+</Output>
+</Group>
+</Section>
+<Section collapsed="false" MultipleChoiceAnswerIndex="-1" MultipleChoiceRandomizeChoices="false" TrueFalseAnswerIndex="-1" EssayAnswerRows="5" EssayAnswerColumns="60"><Title>
+<Text-field style="Heading 2" layout="Heading 2">Example of use</Text-field></Title>
+<Text-field style="Text" layout="Normal"></Text-field>
+<Section collapsed="true" MultipleChoiceAnswerIndex="-1" MultipleChoiceRandomizeChoices="false" TrueFalseAnswerIndex="-1" EssayAnswerRows="5" EssayAnswerColumns="60"><Title>
+<Text-field style="Heading 3" layout="Heading 3">Highly efficient user's solution</Text-field></Title>
+<Text-field style="Text" layout="Normal"></Text-field>
+<Text-field style="Text" layout="Normal"><Font italic="true" size="14">Compute the determinant of a matrix read from a file</Font></Text-field>
+<Group labelreference="L343" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">myDeterminant:=proc(p, file)
+ local Zp,B,d;
+ Zp:=lbDomain(p);
+ B:=lbBlackbox(Zp,file);
+ d:=lbElement(Zp);
+ lbDeterminant(d,B);
+ return lbConvertElement(d);
+ end;
+
+ </Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtaUdGJTY5US5teURldGVybWluYW50RigvJSdmYW1pbHlHUTBUaW1lc35OZXd+Um9tYW5GKC8lJXNpemVHUSMxMkYoLyUlYm9sZEdRJmZhbHNlRigvJSdpdGFsaWNHUSV0cnVlRigvJSp1bmRlcmxpbmVHRjgvJSpzdWJzY3JpcHRHRjgvJSxzdXBlcnNjcmlwdEdGOC8lK2ZvcmVncm91bmRHUSpbMCwwLDI1NV1GKC8lK2JhY2tncm91bmRHUS5bMjU1LDI1NSwyNTVdRigvJSdvcGFxdWVHRjgvJStleGVjdXRhYmxlR0Y4L [...]
+</Output>
+</Group>
+<Group labelreference="L344" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">myDeterminant(1009, "trefethen_200.sms");</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSNtbkc2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGKDY5USQzNDZGKC8lJ2ZhbWlseUdRMFRpbWVzfk5ld35Sb21hbkYoLyUlc2l6ZUdRIzEyRigvJSVib2xkR1EmZmFsc2VGKC8lJ2l0YWxpY0dGNS8lKnVuZGVybGluZUdGNS8lKnN1YnNjcmlwdEdGNS8lLHN1cGVyc2NyaXB0R0Y1LyUrZm9yZWdyb3VuZEdRKlswLDAsMjU1XUYoLyUrYmFja2dyb3VuZEdRLlsyNTUsMjU1LDI1NV1GKC8lJ29wYXF1ZUdGNS8lK2V4ZWN1dGFibGVHRjUvJSlyZWFkb25seUdRJXRydWVGKC8lKWNvbXBvc [...]
+</Output>
+</Group>
+<Group labelreference="L345" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">myDeterminant(0, "trefethen_200.sms");</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSNtbkc2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGKDY5UVxbbTI0MDg0NTE5MjU0ODAyNzQzMTkzNTM5MjE0MTY1NjUwNzE0MDcxODM4ODg4OTI4ODk5NjM4MDgxMzEzMjU2MjE0MjAxMDk4MTY2MDQyMzgyMTg3MDYwNDE4MDEzMTA5MzQ5NzE1NjMzNzYyNDgzNDY1ODIzMjM4NTEyNTU5ODQwNjk4OTQ4OTY0MDE1NjUwNDExMzc4MjU1NDYxMzU2OTYyODg4NzMwMjgwNjEwMzQ0MTc2MzU1NDEyMjQ4OTk4MDc1NDE0NjYzMTcxNzUxOTYyMTQyMzA3OTQ3MjE4NTE3NDkyNzAzNzI4OTg2N [...]
+</Output>
+</Group>
+<Group labelreference="L382" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal"></Text-field>
+</Input>
+</Group>
+</Section>
+</Section>
+<Section collapsed="true" MultipleChoiceAnswerIndex="-1" MultipleChoiceRandomizeChoices="false" TrueFalseAnswerIndex="-1" EssayAnswerRows="5" EssayAnswerColumns="60"><Title>
+<Text-field style="Heading 2" layout="Heading 2">To continue ...</Text-field></Title>
+<Text-field style="Text" layout="Normal"></Text-field>
+<Text-field style="Text" layout="Normal"></Text-field>
+</Section>
+</Section>
+<Group labelreference="L289" drawlabel="true">
+<Input>
+<Text-field style="Text" layout="Normal"></Text-field>
+<Text-field style="Text" layout="Normal"></Text-field>
+<Text-field style="Text" layout="Normal"></Text-field>
+<Text-field style="Text" layout="Normal"></Text-field>
+<Text-field style="Text" layout="Normal"></Text-field>
+<Text-field style="Text" layout="Normal"></Text-field>
+<Text-field style="Text" layout="Normal"></Text-field>
+<Text-field style="Text" layout="Normal"></Text-field>
+<Text-field style="Text" layout="Normal"></Text-field>
+<Text-field style="Text" layout="Normal"></Text-field>
+<Text-field style="Text" layout="Normal"></Text-field>
+<Text-field style="Text" layout="Normal"></Text-field>
+<Text-field style="Text" layout="Normal"></Text-field>
+</Input>
+</Group>
+</Worksheet>
\ No newline at end of file
diff --git a/interfaces/maple/linbox-demonstration.mw b/interfaces/maple/linbox-demonstration.mw
new file mode 100755
index 0000000..e93cb5b
--- /dev/null
+++ b/interfaces/maple/linbox-demonstration.mw
@@ -0,0 +1,2248 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<Worksheet>
+<Version major="7" minor="0"/>
+<Label-Scheme value="2" prefix=""/>
+<View-Properties presentation="false"></View-Properties>
+<MapleNet-Properties warnlevel="3" longdelim="true" plotoptions="" echo="1" errorcursor="false" elisiontermsthreshold="10000" elisiontermsbefore="100" errorbreak="1" prettyprint="3" prompt="> " latexwidth="6.0" useclientjvm="true" ansi="false" screenheight="25" labelwidth="20" plotdevice="inline" typesetting="standard" displayprecision="-1" indentamount="4" elisiondigitsthreshold="10000" quiet="false" plotoutput="terminal" rtablesize="10" preplot="" showassumed="1" plotdriver="openviz [...]
+<Styles><Font name="Heading 4" background="[255,255,255]" bold="false" executable="false" family="Serif" foreground="[0,0,0]" italic="true" opaque="false" readonly="false" size="12" subscript="false" superscript="false" underline="false"/>
+<Font name="Ordered List 5" background="[255,255,255]" bold="false" executable="false" family="Times New Roman" foreground="[0,0,0]" italic="false" opaque="false" readonly="false" size="12" subscript="false" superscript="false" underline="false"/>
+<Font name="Ordered List 1" background="[255,255,255]" bold="false" executable="false" family="Times New Roman" foreground="[0,0,0]" italic="false" opaque="false" readonly="false" size="12" subscript="false" superscript="false" underline="false"/>
+<Font name="Text Output" background="[255,255,255]" bold="false" executable="false" family="Monospaced" foreground="[0,0,255]" italic="false" opaque="false" readonly="true" size="12" subscript="false" superscript="false" underline="false"/>
+<Font name="Bullet Item" background="[255,255,255]" bold="false" executable="false" family="Times New Roman" foreground="[0,0,0]" italic="false" opaque="false" readonly="false" size="12" subscript="false" superscript="false" underline="false"/>
+<Font name="Author" background="[255,255,255]" bold="false" executable="false" family="Times New Roman" foreground="[0,0,0]" italic="false" opaque="false" readonly="false" size="12" subscript="false" superscript="false" underline="false"/>
+<Font name="Text" background="[255,255,255]" bold="false" executable="false" family="Times New Roman" foreground="[0,0,0]" italic="false" opaque="false" readonly="false" size="12" subscript="false" superscript="false" underline="false"/>
+<Font name="Diagnostic" background="[255,255,255]" bold="false" executable="false" family="Monospaced" foreground="[40,120,40]" italic="false" opaque="false" readonly="true" size="12" subscript="false" superscript="false" underline="false"/>
+<Font name="Heading 2" background="[255,255,255]" bold="true" executable="false" family="Serif" foreground="[0,0,0]" italic="false" opaque="false" readonly="false" size="16" subscript="false" superscript="false" underline="false"/>
+<Font name="Page Number" background="[255,255,255]" bold="false" executable="false" family="Times New Roman" foreground="[0,0,0]" italic="false" opaque="false" readonly="false" size="10" subscript="false" superscript="false" underline="false"/>
+<Font name="Ordered List 3" background="[255,255,255]" bold="false" executable="false" family="Times New Roman" foreground="[0,0,0]" italic="false" opaque="false" readonly="false" size="12" subscript="false" superscript="false" underline="false"/>
+<Font name="Maple Plot" background="[255,255,255]" bold="false" executable="false" family="Times New Roman" foreground="[0,0,0]" italic="false" opaque="false" readonly="false" size="12" subscript="false" superscript="false" underline="false"/>
+<Font name="Normal" background="[255,255,255]" bold="false" executable="false" family="Times New Roman" foreground="[0,0,0]" italic="false" opaque="false" readonly="false" size="12" subscript="false" superscript="false" underline="false"/>
+<Font name="Maple Input" background="[255,255,255]" bold="true" executable="true" family="Monospaced" foreground="[255,0,0]" italic="false" opaque="false" readonly="false" size="12" subscript="false" superscript="false" underline="false"/>
+<Font name="2D Output" background="[255,255,255]" bold="false" executable="false" family="Times New Roman" foreground="[0,0,255]" italic="false" opaque="false" readonly="true" size="12" subscript="false" superscript="false" underline="false"/>
+<Font name="Dictionary Hyperlink" background="[255,255,255]" bold="false" executable="false" family="Serif" foreground="[147,0,15]" italic="false" opaque="false" readonly="false" size="12" subscript="false" superscript="false" underline="true"/>
+<Font name="Dash Item" background="[255,255,255]" bold="false" executable="false" family="Times New Roman" foreground="[0,0,0]" italic="false" opaque="false" readonly="false" size="12" subscript="false" superscript="false" underline="false"/>
+<Font name="Heading 3" background="[255,255,255]" bold="true" executable="false" family="Serif" foreground="[0,0,0]" italic="true" opaque="false" readonly="false" size="14" subscript="false" superscript="false" underline="false"/>
+<Font name="Ordered List 4" background="[255,255,255]" bold="false" executable="false" family="Times New Roman" foreground="[0,0,0]" italic="false" opaque="false" readonly="false" size="12" subscript="false" superscript="false" underline="false"/>
+<Font name="Maple Output" background="[255,255,255]" bold="false" executable="false" family="Times New Roman" foreground="[0,0,0]" italic="false" opaque="false" readonly="false" size="12" subscript="false" superscript="false" underline="false"/>
+<Font name="2D Input" background="[255,255,255]" bold="false" executable="true" family="Times New Roman" foreground="[0,0,0]" italic="false" opaque="false" readonly="false" size="12" subscript="false" superscript="false" underline="false"/>
+<Font name="Line Printed Output" background="[255,255,255]" bold="false" executable="false" family="Monospaced" foreground="[0,0,255]" italic="false" opaque="false" readonly="true" size="12" subscript="false" superscript="false" underline="false"/>
+<Font name="List Item" background="[255,255,255]" bold="false" executable="false" family="Times New Roman" foreground="[0,0,0]" italic="false" opaque="false" readonly="false" size="12" subscript="false" superscript="false" underline="false"/>
+<Font name="Maple Input Placeholder" background="[255,255,255]" bold="true" executable="true" family="Monospaced" foreground="[200,0,200]" italic="false" opaque="false" readonly="false" size="12" subscript="false" superscript="false" underline="false"/>
+<Font name="2D Math" background="[255,255,255]" bold="false" executable="false" family="Times New Roman" foreground="[0,0,0]" italic="false" opaque="false" readonly="false" size="12" subscript="false" superscript="false" underline="false"/>
+<Font name="Error" background="[255,255,255]" bold="false" executable="false" family="Monospaced" foreground="[255,0,255]" italic="false" opaque="false" readonly="true" size="12" subscript="false" superscript="false" underline="false"/>
+<Font name="Warning" background="[255,255,255]" bold="false" executable="false" family="Monospaced" foreground="[0,0,255]" italic="false" opaque="false" readonly="true" size="12" subscript="false" superscript="false" underline="false"/>
+<Font name="Heading 1" background="[255,255,255]" bold="true" executable="false" family="Serif" foreground="[0,0,0]" italic="false" opaque="false" readonly="false" size="18" subscript="false" superscript="false" underline="false"/>
+<Font name="Title" background="[255,255,255]" bold="true" executable="false" family="Times New Roman" foreground="[0,0,0]" italic="false" opaque="false" readonly="false" size="18" subscript="false" superscript="false" underline="false"/>
+<Font name="Ordered List 2" background="[255,255,255]" bold="false" executable="false" family="Times New Roman" foreground="[0,0,0]" italic="false" opaque="false" readonly="false" size="12" subscript="false" superscript="false" underline="false"/>
+<Font name="Hyperlink" background="[255,255,255]" bold="false" executable="false" family="Serif" foreground="[0,128,128]" italic="false" opaque="false" readonly="false" size="12" subscript="false" superscript="false" underline="true"/>
+<Layout name="Ordered List 5" alignment="left" bullet="ROMAN" firstindent="0" leftmargin="144" rightmargin="0" linespacing="0.0" spaceabove="3" spacebelow="3" linebreak="space" pagebreak-before="false" initial="-1"/>
+<Layout name="Heading 4" alignment="left" bullet="none" firstindent="0" leftmargin="0" rightmargin="0" linespacing="0.0" spaceabove="0" spacebelow="0" linebreak="space" pagebreak-before="false" initial="0"/>
+<Layout name="Text Output" alignment="left" bullet="none" firstindent="0" leftmargin="0" rightmargin="0" linespacing="0.0" spaceabove="0" spacebelow="0" linebreak="newline" pagebreak-before="false" initial="0"/>
+<Layout name="Ordered List 1" alignment="left" bullet="numeric" firstindent="0" leftmargin="0" rightmargin="0" linespacing="0.0" spaceabove="3" spacebelow="3" linebreak="space" pagebreak-before="false" initial="-1"/>
+<Layout name="Bullet Item" alignment="left" bullet="dot" firstindent="0" leftmargin="0" rightmargin="0" linespacing="0.0" spaceabove="3" spacebelow="3" linebreak="space" pagebreak-before="false" initial="0"/>
+<Layout name="Author" alignment="centred" bullet="none" firstindent="0" leftmargin="0" rightmargin="0" linespacing="0.0" spaceabove="8" spacebelow="8" linebreak="space" pagebreak-before="false" initial="0"/>
+<Layout name="Dash Item" alignment="left" bullet="dash" firstindent="0" leftmargin="0" rightmargin="0" linespacing="0.0" spaceabove="3" spacebelow="3" linebreak="space" pagebreak-before="false" initial="0"/>
+<Layout name="Heading 3" alignment="left" bullet="none" firstindent="0" leftmargin="0" rightmargin="0" linespacing="0.0" spaceabove="0" spacebelow="0" linebreak="space" pagebreak-before="false" initial="0"/>
+<Layout name="Diagnostic" alignment="left" bullet="none" firstindent="0" leftmargin="0" rightmargin="0" linespacing="0.0" spaceabove="0" spacebelow="0" linebreak="any" pagebreak-before="false" initial="0"/>
+<Layout name="Ordered List 4" alignment="left" bullet="ALPHABETIC" firstindent="0" leftmargin="108" rightmargin="0" linespacing="0.0" spaceabove="3" spacebelow="3" linebreak="space" pagebreak-before="false" initial="-1"/>
+<Layout name="Maple Output" alignment="centred" bullet="none" firstindent="0" leftmargin="0" rightmargin="0" linespacing="0.3" spaceabove="0" spacebelow="0" linebreak="space" pagebreak-before="false" initial="0"/>
+<Layout name="List Item" alignment="left" bullet="indent" firstindent="0" leftmargin="0" rightmargin="0" linespacing="0.0" spaceabove="3" spacebelow="3" linebreak="space" pagebreak-before="false" initial="0"/>
+<Layout name="Line Printed Output" alignment="left" bullet="none" firstindent="0" leftmargin="0" rightmargin="0" linespacing="0.0" spaceabove="0" spacebelow="0" linebreak="any" pagebreak-before="false" initial="0"/>
+<Layout name="Heading 2" alignment="left" bullet="none" firstindent="0" leftmargin="0" rightmargin="0" linespacing="0.0" spaceabove="8" spacebelow="2" linebreak="space" pagebreak-before="false" initial="0"/>
+<Layout name="Ordered List 3" alignment="left" bullet="roman" firstindent="0" leftmargin="72" rightmargin="0" linespacing="0.0" spaceabove="3" spacebelow="3" linebreak="space" pagebreak-before="false" initial="-1"/>
+<Layout name="Error" alignment="left" bullet="none" firstindent="0" leftmargin="0" rightmargin="0" linespacing="0.0" spaceabove="0" spacebelow="0" linebreak="space" pagebreak-before="false" initial="0"/>
+<Layout name="Maple Plot" alignment="centred" bullet="none" firstindent="0" leftmargin="0" rightmargin="0" linespacing="0.0" spaceabove="0" spacebelow="0" linebreak="space" pagebreak-before="false" initial="0"/>
+<Layout name="Warning" alignment="left" bullet="none" firstindent="0" leftmargin="0" rightmargin="0" linespacing="0.0" spaceabove="0" spacebelow="0" linebreak="space" pagebreak-before="false" initial="0"/>
+<Layout name="Heading 1" alignment="left" bullet="none" firstindent="0" leftmargin="0" rightmargin="0" linespacing="0.0" spaceabove="8" spacebelow="4" linebreak="space" pagebreak-before="false" initial="0"/>
+<Layout name="Title" alignment="centred" bullet="none" firstindent="0" leftmargin="0" rightmargin="0" linespacing="0.0" spaceabove="12" spacebelow="12" linebreak="space" pagebreak-before="false" initial="0"/>
+<Layout name="Ordered List 2" alignment="left" bullet="alphabetic" firstindent="0" leftmargin="36" rightmargin="0" linespacing="0.0" spaceabove="3" spacebelow="3" linebreak="space" pagebreak-before="false" initial="-1"/>
+<Layout name="Normal" alignment="left" bullet="none" firstindent="0" leftmargin="0" rightmargin="0" linespacing="0.0" spaceabove="0" spacebelow="0" linebreak="space" pagebreak-before="false" initial="0"/>
+<Pencil-style name="Pencil 3" pen-color="[0,0,0]" pen-height="3.0" pen-width="3.0" pen-opacity="1.0"/>
+<Pencil-style name="Pencil 1" pen-color="[0,0,0]" pen-height="1.0" pen-width="1.0" pen-opacity="1.0"/>
+<Pencil-style name="Pencil 5" pen-color="[255,0,0]" pen-height="5.0" pen-width="5.0" pen-opacity="1.0"/>
+<Pencil-style name="Pencil 2" pen-color="[0,0,255]" pen-height="1.0" pen-width="1.0" pen-opacity="1.0"/>
+<Pencil-style name="Pencil 4" pen-color="[0,0,255]" pen-height="3.0" pen-width="3.0" pen-opacity="1.0"/>
+<Highlighter-style name="Highlighter 2" pen-color="[255,204,0]" pen-height="14.0" pen-width="14.0" pen-opacity="0.8"/>
+<Highlighter-style name="Highlighter 4" pen-color="[0,255,255]" pen-height="32.0" pen-width="32.0" pen-opacity="0.8"/>
+<Highlighter-style name="Highlighter 3" pen-color="[51,255,0]" pen-height="24.0" pen-width="24.0" pen-opacity="0.8"/>
+<Highlighter-style name="Highlighter 1" pen-color="[255,153,255]" pen-height="12.0" pen-width="8.0" pen-opacity="0.8"/>
+<Highlighter-style name="Highlighter 5" pen-color="[255,255,0]" pen-height="48.0" pen-width="48.0" pen-opacity="0.8"/>
+</Styles>
+<Task-table>
+ <Task-category name="<default>">
+ </Task-category>
+</Task-table>
+<Group labelreference="L7" drawlabel="true">
+<Input>
+<Text-field style="Text" family="Lucida Bright" size="24" layout="Normal" alignment="centred"><Font family="Lucida Bright" size="24">LinBox Interface beta version 0.1</Font></Text-field>
+<Text-field style="Text" family="Lucida Bright" size="24" layout="Normal" alignment="centred"><Font family="Lucida Bright" size="24">demonstration</Font></Text-field>
+<Text-field style="Text" family="Lucida Bright" size="18" layout="Normal" alignment="centred"><Font family="Lucida Bright" size="18">by Pascal Giorgi</Font></Text-field>
+<Text-field style="Text" family="Lucida Bright" size="18" layout="Normal" alignment="centred"></Text-field>
+<Text-field style="Text" family="Lucida Bright" size="18" layout="Normal" alignment="centred"></Text-field>
+<Text-field style="Text" family="Lucida Bright" size="18" layout="Normal" alignment="centred"></Text-field>
+<Text-field style="Text" family="Lucida Bright" size="18" layout="Normal" alignment="centred"></Text-field>
+</Input>
+</Group>
+<Group labelreference="L118" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">restart;</Text-field>
+</Input>
+</Group>
+<Section collapsed="true" MultipleChoiceAnswerIndex="-1" MultipleChoiceRandomizeChoices="false" TrueFalseAnswerIndex="-1" EssayAnswerRows="5" EssayAnswerColumns="60"><Title>
+<Text-field style="Heading 1" layout="Heading 1">Available through Maple module</Text-field></Title>
+<Group labelreference="L10" drawlabel="true">
+<Input>
+<Text-field style="Text" layout="Normal"></Text-field>
+</Input>
+</Group>
+<Group labelreference="L11" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">with(LinBox);</Text-field>
+</Input>
+<Output>
+<Text-field style="Line Printed Output" layout="Line Printed Output"> LinBox/Maple Interface Package beta version 0.1
+ by Pascal Giorgi (pgiorgi at uwaterloo.ca)</Text-field>
+</Output>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtb0dGJTYzUSJbRigvJSVmb3JtR1EncHJlZml4RigvJSZmZW5jZUdRJXRydWVGKC8lKnNlcGFyYXRvckdRJmZhbHNlRigvJSdsc3BhY2VHUS50aGlubWF0aHNwYWNlRigvJSdyc3BhY2VHRjsvJSlzdHJldGNoeUdGNS8lKnN5bW1ldHJpY0dGOC8lKG1heHNpemVHUSlpbmZpbml0eUYoLyUobWluc2l6ZUdRIjFGKC8lKGxhcmdlb3BHRjgvJS5tb3ZhYmxlbGltaXRzR0Y4LyUnYWNjZW50R0Y4LyUwZm9udF9zdHlsZV9uY [...]
+</Output>
+</Group>
+<Group labelreference="L16" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal"></Text-field>
+</Input>
+</Group>
+<Group labelreference="L13" drawlabel="true">
+<Input>
+<Text-field style="Text" size="18" layout="Normal"><Font size="16">comparison with LinearAlgebra package</Font></Text-field>
+</Input>
+</Group>
+<Group labelreference="L14" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">with(LinearAlgebra);</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtb0dGJTYzUSJbRigvJSVmb3JtR1EncHJlZml4RigvJSZmZW5jZUdRJXRydWVGKC8lKnNlcGFyYXRvckdRJmZhbHNlRigvJSdsc3BhY2VHUS50aGlubWF0aHNwYWNlRigvJSdyc3BhY2VHRjsvJSlzdHJldGNoeUdGNS8lKnN5bW1ldHJpY0dGOC8lKG1heHNpemVHUSlpbmZpbml0eUYoLyUobWluc2l6ZUdRIjFGKC8lKGxhcmdlb3BHRjgvJS5tb3ZhYmxlbGltaXRzR0Y4LyUnYWNjZW50R0Y4LyUwZm9udF9zdHlsZV9uY [...]
+</Output>
+</Group>
+<Group labelreference="L15" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal"></Text-field>
+</Input>
+</Group>
+</Section>
+<Section collapsed="true" MultipleChoiceAnswerIndex="-1" MultipleChoiceRandomizeChoices="false" TrueFalseAnswerIndex="-1" EssayAnswerRows="5" EssayAnswerColumns="60"><Title>
+<Text-field style="Heading 1" layout="Heading 1">High level of the interface </Text-field></Title>
+<Group labelreference="L8" drawlabel="true">
+<Input>
+<Text-field style="Text" layout="Normal"></Text-field>
+<Text-field style="Text" size="16" layout="Normal"><Font size="16">Call LinBox functionnalities directly on Maple objects.</Font></Text-field>
+<Text-field style="Text" layout="Normal"></Text-field>
+</Input>
+</Group>
+<Section collapsed="true" MultipleChoiceAnswerIndex="-1" MultipleChoiceRandomizeChoices="false" TrueFalseAnswerIndex="-1" EssayAnswerRows="5" EssayAnswerColumns="60"><Title>
+<Text-field style="Heading 2" layout="Heading 2">Computation over the integers</Text-field></Title>
+<Text-field style="Text" layout="Normal"></Text-field>
+<Group labelreference="L227" drawlabel="true">
+<Input>
+<Text-field style="Text" layout="Normal"></Text-field>
+</Input>
+</Group>
+<Section collapsed="true" MultipleChoiceAnswerIndex="-1" MultipleChoiceRandomizeChoices="false" TrueFalseAnswerIndex="-1" EssayAnswerRows="5" EssayAnswerColumns="60"><Title>
+<Text-field style="Heading 3" layout="Heading 3">Determinant</Text-field></Title>
+<Group labelreference="L17" drawlabel="true">
+<Input>
+<Text-field style="Text" layout="Normal"></Text-field>
+</Input>
+</Group>
+<Group labelreference="L228" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">n:=100;gen:=rand(0..10);</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtaUdGJTY5USJuRigvJSdmYW1pbHlHUTBUaW1lc35OZXd+Um9tYW5GKC8lJXNpemVHUSMxMkYoLyUlYm9sZEdRJmZhbHNlRigvJSdpdGFsaWNHUSV0cnVlRigvJSp1bmRlcmxpbmVHRjgvJSpzdWJzY3JpcHRHRjgvJSxzdXBlcnNjcmlwdEdGOC8lK2ZvcmVncm91bmRHUSpbMCwwLDI1NV1GKC8lK2JhY2tncm91bmRHUS5bMjU1LDI1NSwyNTVdRigvJSdvcGFxdWVHRjgvJStleGVjdXRhYmxlR0Y4LyUpcmVhZG9ubHlHR [...]
+</Output>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtaUdGJTY5USRnZW5GKC8lJ2ZhbWlseUdRMFRpbWVzfk5ld35Sb21hbkYoLyUlc2l6ZUdRIzEyRigvJSVib2xkR1EmZmFsc2VGKC8lJ2l0YWxpY0dRJXRydWVGKC8lKnVuZGVybGluZUdGOC8lKnN1YnNjcmlwdEdGOC8lLHN1cGVyc2NyaXB0R0Y4LyUrZm9yZWdyb3VuZEdRKlswLDAsMjU1XUYoLyUrYmFja2dyb3VuZEdRLlsyNTUsMjU1LDI1NV1GKC8lJ29wYXF1ZUdGOC8lK2V4ZWN1dGFibGVHRjgvJSlyZWFkb25se [...]
+</Output>
+</Group>
+<Group labelreference="L229" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">A:=Matrix(n,gen);</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzYlLUkjbWlHRiQ2OVEiQUYnLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRicvJSVzaXplR1EjMTJGJy8lJWJvbGRHUSZmYWxzZUYnLyUnaXRhbGljR1EldHJ1ZUYnLyUqdW5kZXJsaW5lR0Y3LyUqc3Vic2NyaXB0R0Y3LyUsc3VwZXJzY3JpcHRHRjcvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRicvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYnLyUnb3BhcXVlR0Y3LyUrZXhlY3V0YWJsZUdGNy8lKXJlYWRvbmx5R0Y6L [...]
+</Output>
+</Group>
+<Group labelreference="L29" drawlabel="true">
+<Input>
+<Text-field style="Text" layout="Normal"> <Font size="16">Maple determinant</Font></Text-field>
+<Text-field style="Text" layout="Normal"></Text-field>
+</Input>
+</Group>
+<Group labelreference="L27" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">Determinant(A);</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSNtbkc2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGKDY5UV1zMTMxNTQyMTA5NjUyNDk5ODEwNDIyNzczOTQ5NjE2NjQzMzE5MTU2Mzc3NzMzNjAxNzQ5ODU1OTgzNzk3NDY0Njk1MTI3MTQ5NDk4NDIzMTg4MTg1ODgyMTI3Mzg0MzE3NzgwMDI3MDA2NDUzODIxMTk4NzYxNTc2Mzc4NDY1NTY4MkYoLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRigvJSVzaXplR1EjMTJGKC8lJWJvbGRHUSZmYWxzZUYoLyUnaXRhbGljR0Y1LyUqdW5kZXJsaW5lR0Y1LyUqc3Vic2NyaXB0R0Y1LyUsc [...]
+</Output>
+</Group>
+<Group labelreference="L30" drawlabel="true">
+<Input>
+<Text-field style="Text" layout="Normal"> </Text-field>
+<Text-field style="Text" layout="Normal"><Font size="16">LinBox determinant</Font></Text-field>
+<Text-field style="Text" layout="Normal"></Text-field>
+</Input>
+</Group>
+<Group labelreference="L28" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">lbDeterminant(A);</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtc0dGJTYjUTFjb252ZXJzaW9ufnRpbWU6RigtSSNtb0dGJTYzUSIsRigvJSVmb3JtR1EmaW5maXhGKC8lJmZlbmNlR1EmZmFsc2VGKC8lKnNlcGFyYXRvckdRJXRydWVGKC8lJ2xzcGFjZUdRJDBlbUYoLyUncnNwYWNlR1EzdmVyeXRoaWNrbWF0aHNwYWNlRigvJSlzdHJldGNoeUdGOS8lKnN5bW1ldHJpY0dGOS8lKG1heHNpemVHUSlpbmZpbml0eUYoLyUobWluc2l6ZUdRIjFGKC8lKGxhcmdlb3BHRjkvJS5tb3ZhY [...]
+</Output>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSNtbkc2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGKDY5UV1zMTMxNTQyMTA5NjUyNDk5ODEwNDIyNzczOTQ5NjE2NjQzMzE5MTU2Mzc3NzMzNjAxNzQ5ODU1OTgzNzk3NDY0Njk1MTI3MTQ5NDk4NDIzMTg4MTg1ODgyMTI3Mzg0MzE3NzgwMDI3MDA2NDUzODIxMTk4NzYxNTc2Mzc4NDY1NTY4MkYoLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRigvJSVzaXplR1EjMTJGKC8lJWJvbGRHUSZmYWxzZUYoLyUnaXRhbGljR0Y1LyUqdW5kZXJsaW5lR0Y1LyUqc3Vic2NyaXB0R0Y1LyUsc [...]
+</Output>
+</Group>
+<Group labelreference="L32" drawlabel="true">
+<Input>
+<Text-field style="Text" layout="Normal"></Text-field>
+<Text-field style="Text" layout="Normal"><Font size="16">Timing comparison</Font></Text-field>
+<Text-field style="Text" layout="Normal"></Text-field>
+</Input>
+</Group>
+<Group labelreference="L31" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">t1:=time(Determinant(A));</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtaUdGJTY5USN0MUYoLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRigvJSVzaXplR1EjMTJGKC8lJWJvbGRHUSZmYWxzZUYoLyUnaXRhbGljR1EldHJ1ZUYoLyUqdW5kZXJsaW5lR0Y4LyUqc3Vic2NyaXB0R0Y4LyUsc3VwZXJzY3JpcHRHRjgvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRigvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYoLyUnb3BhcXVlR0Y4LyUrZXhlY3V0YWJsZUdGOC8lKXJlYWRvbmx5R [...]
+</Output>
+</Group>
+<Group labelreference="L33" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">t2:=time(lbDeterminant(A));</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtc0dGJTYjUTFjb252ZXJzaW9ufnRpbWU6RigtSSNtb0dGJTYzUSIsRigvJSVmb3JtR1EmaW5maXhGKC8lJmZlbmNlR1EmZmFsc2VGKC8lKnNlcGFyYXRvckdRJXRydWVGKC8lJ2xzcGFjZUdRJDBlbUYoLyUncnNwYWNlR1EzdmVyeXRoaWNrbWF0aHNwYWNlRigvJSlzdHJldGNoeUdGOS8lKnN5bW1ldHJpY0dGOS8lKG1heHNpemVHUSlpbmZpbml0eUYoLyUobWluc2l6ZUdRIjFGKC8lKGxhcmdlb3BHRjkvJS5tb3ZhY [...]
+</Output>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtaUdGJTY5USN0MkYoLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRigvJSVzaXplR1EjMTJGKC8lJWJvbGRHUSZmYWxzZUYoLyUnaXRhbGljR1EldHJ1ZUYoLyUqdW5kZXJsaW5lR0Y4LyUqc3Vic2NyaXB0R0Y4LyUsc3VwZXJzY3JpcHRHRjgvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRigvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYoLyUnb3BhcXVlR0Y4LyUrZXhlY3V0YWJsZUdGOC8lKXJlYWRvbmx5R [...]
+</Output>
+</Group>
+<Group labelreference="L34" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">t1/t2;</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSNtbkc2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGKDY5USw3LjM2NTI2OTQ2MUYoLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRigvJSVzaXplR1EjMTJGKC8lJWJvbGRHUSZmYWxzZUYoLyUnaXRhbGljR0Y1LyUqdW5kZXJsaW5lR0Y1LyUqc3Vic2NyaXB0R0Y1LyUsc3VwZXJzY3JpcHRHRjUvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRigvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYoLyUnb3BhcXVlR0Y1LyUrZXhlY3V0YWJsZUdGNS8lKXJlYWRvbmx5R1EldHJ1ZUYoL [...]
+</Output>
+</Group>
+<Group labelreference="L35" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">B:=Matrix(200,gen);</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzYlLUkjbWlHRiQ2OVEiQkYnLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRicvJSVzaXplR1EjMTJGJy8lJWJvbGRHUSZmYWxzZUYnLyUnaXRhbGljR1EldHJ1ZUYnLyUqdW5kZXJsaW5lR0Y3LyUqc3Vic2NyaXB0R0Y3LyUsc3VwZXJzY3JpcHRHRjcvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRicvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYnLyUnb3BhcXVlR0Y3LyUrZXhlY3V0YWJsZUdGNy8lKXJlYWRvbmx5R0Y6L [...]
+</Output>
+</Group>
+<Group labelreference="L37" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">t1:=time(Determinant(B));</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtaUdGJTY5USN0MUYoLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRigvJSVzaXplR1EjMTJGKC8lJWJvbGRHUSZmYWxzZUYoLyUnaXRhbGljR1EldHJ1ZUYoLyUqdW5kZXJsaW5lR0Y4LyUqc3Vic2NyaXB0R0Y4LyUsc3VwZXJzY3JpcHRHRjgvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRigvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYoLyUnb3BhcXVlR0Y4LyUrZXhlY3V0YWJsZUdGOC8lKXJlYWRvbmx5R [...]
+</Output>
+</Group>
+<Group labelreference="L38" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">t2:=time(lbDeterminant(B));</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtc0dGJTYjUTFjb252ZXJzaW9ufnRpbWU6RigtSSNtb0dGJTYzUSIsRigvJSVmb3JtR1EmaW5maXhGKC8lJmZlbmNlR1EmZmFsc2VGKC8lKnNlcGFyYXRvckdRJXRydWVGKC8lJ2xzcGFjZUdRJDBlbUYoLyUncnNwYWNlR1EzdmVyeXRoaWNrbWF0aHNwYWNlRigvJSlzdHJldGNoeUdGOS8lKnN5bW1ldHJpY0dGOS8lKG1heHNpemVHUSlpbmZpbml0eUYoLyUobWluc2l6ZUdRIjFGKC8lKGxhcmdlb3BHRjkvJS5tb3ZhY [...]
+</Output>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtaUdGJTY5USN0MkYoLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRigvJSVzaXplR1EjMTJGKC8lJWJvbGRHUSZmYWxzZUYoLyUnaXRhbGljR1EldHJ1ZUYoLyUqdW5kZXJsaW5lR0Y4LyUqc3Vic2NyaXB0R0Y4LyUsc3VwZXJzY3JpcHRHRjgvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRigvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYoLyUnb3BhcXVlR0Y4LyUrZXhlY3V0YWJsZUdGOC8lKXJlYWRvbmx5R [...]
+</Output>
+</Group>
+<Group labelreference="L39" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">t1/t2;</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSNtbkc2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGKDY5USwxNC40MTQ0NzM2OEYoLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRigvJSVzaXplR1EjMTJGKC8lJWJvbGRHUSZmYWxzZUYoLyUnaXRhbGljR0Y1LyUqdW5kZXJsaW5lR0Y1LyUqc3Vic2NyaXB0R0Y1LyUsc3VwZXJzY3JpcHRHRjUvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRigvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYoLyUnb3BhcXVlR0Y1LyUrZXhlY3V0YWJsZUdGNS8lKXJlYWRvbmx5R1EldHJ1ZUYoL [...]
+</Output>
+</Group>
+<Group labelreference="L36" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal"></Text-field>
+</Input>
+</Group>
+</Section>
+<Section collapsed="true" MultipleChoiceAnswerIndex="-1" MultipleChoiceRandomizeChoices="false" TrueFalseAnswerIndex="-1" EssayAnswerRows="5" EssayAnswerColumns="60"><Title>
+<Text-field style="Heading 3" layout="Heading 3">Rank</Text-field></Title>
+<Group labelreference="L232" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">n:=100;gen:=rand(0..10);</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtaUdGJTY5USJuRigvJSdmYW1pbHlHUTBUaW1lc35OZXd+Um9tYW5GKC8lJXNpemVHUSMxMkYoLyUlYm9sZEdRJmZhbHNlRigvJSdpdGFsaWNHUSV0cnVlRigvJSp1bmRlcmxpbmVHRjgvJSpzdWJzY3JpcHRHRjgvJSxzdXBlcnNjcmlwdEdGOC8lK2ZvcmVncm91bmRHUSpbMCwwLDI1NV1GKC8lK2JhY2tncm91bmRHUS5bMjU1LDI1NSwyNTVdRigvJSdvcGFxdWVHRjgvJStleGVjdXRhYmxlR0Y4LyUpcmVhZG9ubHlHR [...]
+</Output>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtaUdGJTY5USRnZW5GKC8lJ2ZhbWlseUdRMFRpbWVzfk5ld35Sb21hbkYoLyUlc2l6ZUdRIzEyRigvJSVib2xkR1EmZmFsc2VGKC8lJ2l0YWxpY0dRJXRydWVGKC8lKnVuZGVybGluZUdGOC8lKnN1YnNjcmlwdEdGOC8lLHN1cGVyc2NyaXB0R0Y4LyUrZm9yZWdyb3VuZEdRKlswLDAsMjU1XUYoLyUrYmFja2dyb3VuZEdRLlsyNTUsMjU1LDI1NV1GKC8lJ29wYXF1ZUdGOC8lK2V4ZWN1dGFibGVHRjgvJSlyZWFkb25se [...]
+</Output>
+</Group>
+<Group labelreference="L231" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">A:=Matrix(n,gen);</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzYlLUkjbWlHRiQ2OVEiQUYnLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRicvJSVzaXplR1EjMTJGJy8lJWJvbGRHUSZmYWxzZUYnLyUnaXRhbGljR1EldHJ1ZUYnLyUqdW5kZXJsaW5lR0Y3LyUqc3Vic2NyaXB0R0Y3LyUsc3VwZXJzY3JpcHRHRjcvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRicvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYnLyUnb3BhcXVlR0Y3LyUrZXhlY3V0YWJsZUdGNy8lKXJlYWRvbmx5R0Y6L [...]
+</Output>
+</Group>
+<Group labelreference="L18" drawlabel="true">
+<Input>
+<Text-field style="Text" layout="Normal"></Text-field>
+</Input>
+</Group>
+<Group labelreference="L40" drawlabel="true">
+<Input>
+<Text-field style="Text" layout="Normal"><Font size="16">Maple rank</Font></Text-field>
+<Text-field style="Text" layout="Normal"></Text-field>
+</Input>
+</Group>
+<Group labelreference="L41" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">Rank(A);</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSNtbkc2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGKDY5USQxMDBGKC8lJ2ZhbWlseUdRMFRpbWVzfk5ld35Sb21hbkYoLyUlc2l6ZUdRIzEyRigvJSVib2xkR1EmZmFsc2VGKC8lJ2l0YWxpY0dGNS8lKnVuZGVybGluZUdGNS8lKnN1YnNjcmlwdEdGNS8lLHN1cGVyc2NyaXB0R0Y1LyUrZm9yZWdyb3VuZEdRKlswLDAsMjU1XUYoLyUrYmFja2dyb3VuZEdRLlsyNTUsMjU1LDI1NV1GKC8lJ29wYXF1ZUdGNS8lK2V4ZWN1dGFibGVHRjUvJSlyZWFkb25seUdRJXRydWVGKC8lKWNvbXBvc [...]
+</Output>
+</Group>
+<Group labelreference="L42" drawlabel="true">
+<Input>
+<Text-field style="Text" layout="Normal"></Text-field>
+<Text-field style="Text" layout="Normal"><Font size="18">LinBox rank</Font></Text-field>
+<Text-field style="Text" layout="Normal"></Text-field>
+</Input>
+</Group>
+<Group labelreference="L43" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">lbRank(A);</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtc0dGJTYjUTFjb252ZXJzaW9ufnRpbWU6RigtSSNtb0dGJTYzUSIsRigvJSVmb3JtR1EmaW5maXhGKC8lJmZlbmNlR1EmZmFsc2VGKC8lKnNlcGFyYXRvckdRJXRydWVGKC8lJ2xzcGFjZUdRJDBlbUYoLyUncnNwYWNlR1EzdmVyeXRoaWNrbWF0aHNwYWNlRigvJSlzdHJldGNoeUdGOS8lKnN5bW1ldHJpY0dGOS8lKG1heHNpemVHUSlpbmZpbml0eUYoLyUobWluc2l6ZUdRIjFGKC8lKGxhcmdlb3BHRjkvJS5tb3ZhY [...]
+</Output>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSNtbkc2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGKDY5USQxMDBGKC8lJ2ZhbWlseUdRMFRpbWVzfk5ld35Sb21hbkYoLyUlc2l6ZUdRIzEyRigvJSVib2xkR1EmZmFsc2VGKC8lJ2l0YWxpY0dGNS8lKnVuZGVybGluZUdGNS8lKnN1YnNjcmlwdEdGNS8lLHN1cGVyc2NyaXB0R0Y1LyUrZm9yZWdyb3VuZEdRKlswLDAsMjU1XUYoLyUrYmFja2dyb3VuZEdRLlsyNTUsMjU1LDI1NV1GKC8lJ29wYXF1ZUdGNS8lK2V4ZWN1dGFibGVHRjUvJSlyZWFkb25seUdRJXRydWVGKC8lKWNvbXBvc [...]
+</Output>
+</Group>
+<Group labelreference="L44" drawlabel="true">
+<Input>
+<Text-field style="Text" layout="Normal"></Text-field>
+<Text-field style="Text" layout="Normal"><Font size="16">Timing comparison</Font></Text-field>
+<Text-field style="Text" layout="Normal"></Text-field>
+</Input>
+</Group>
+<Group labelreference="L174" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">t1:=time(Rank(A));</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtaUdGJTY5USN0MUYoLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRigvJSVzaXplR1EjMTJGKC8lJWJvbGRHUSZmYWxzZUYoLyUnaXRhbGljR1EldHJ1ZUYoLyUqdW5kZXJsaW5lR0Y4LyUqc3Vic2NyaXB0R0Y4LyUsc3VwZXJzY3JpcHRHRjgvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRigvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYoLyUnb3BhcXVlR0Y4LyUrZXhlY3V0YWJsZUdGOC8lKXJlYWRvbmx5R [...]
+</Output>
+</Group>
+<Group labelreference="L178" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">t2:=time(lbRank(A));</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtc0dGJTYjUTFjb252ZXJzaW9ufnRpbWU6RigtSSNtb0dGJTYzUSIsRigvJSVmb3JtR1EmaW5maXhGKC8lJmZlbmNlR1EmZmFsc2VGKC8lKnNlcGFyYXRvckdRJXRydWVGKC8lJ2xzcGFjZUdRJDBlbUYoLyUncnNwYWNlR1EzdmVyeXRoaWNrbWF0aHNwYWNlRigvJSlzdHJldGNoeUdGOS8lKnN5bW1ldHJpY0dGOS8lKG1heHNpemVHUSlpbmZpbml0eUYoLyUobWluc2l6ZUdRIjFGKC8lKGxhcmdlb3BHRjkvJS5tb3ZhY [...]
+</Output>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtaUdGJTY5USN0MkYoLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRigvJSVzaXplR1EjMTJGKC8lJWJvbGRHUSZmYWxzZUYoLyUnaXRhbGljR1EldHJ1ZUYoLyUqdW5kZXJsaW5lR0Y4LyUqc3Vic2NyaXB0R0Y4LyUsc3VwZXJzY3JpcHRHRjgvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRigvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYoLyUnb3BhcXVlR0Y4LyUrZXhlY3V0YWJsZUdGOC8lKXJlYWRvbmx5R [...]
+</Output>
+</Group>
+<Group labelreference="L179" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">t1/t2;</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSNtbkc2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGKDY5USwyNy40ODc4MDQ4OEYoLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRigvJSVzaXplR1EjMTJGKC8lJWJvbGRHUSZmYWxzZUYoLyUnaXRhbGljR0Y1LyUqdW5kZXJsaW5lR0Y1LyUqc3Vic2NyaXB0R0Y1LyUsc3VwZXJzY3JpcHRHRjUvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRigvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYoLyUnb3BhcXVlR0Y1LyUrZXhlY3V0YWJsZUdGNS8lKXJlYWRvbmx5R1EldHJ1ZUYoL [...]
+</Output>
+</Group>
+<Group labelreference="L176" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">B:=Matrix(200,gen);</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzYlLUkjbWlHRiQ2OVEiQkYnLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRicvJSVzaXplR1EjMTJGJy8lJWJvbGRHUSZmYWxzZUYnLyUnaXRhbGljR1EldHJ1ZUYnLyUqdW5kZXJsaW5lR0Y3LyUqc3Vic2NyaXB0R0Y3LyUsc3VwZXJzY3JpcHRHRjcvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRicvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYnLyUnb3BhcXVlR0Y3LyUrZXhlY3V0YWJsZUdGNy8lKXJlYWRvbmx5R0Y6L [...]
+</Output>
+</Group>
+<Group labelreference="L177" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">t1:=time(Rank(B));</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtaUdGJTY5USN0MUYoLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRigvJSVzaXplR1EjMTJGKC8lJWJvbGRHUSZmYWxzZUYoLyUnaXRhbGljR1EldHJ1ZUYoLyUqdW5kZXJsaW5lR0Y4LyUqc3Vic2NyaXB0R0Y4LyUsc3VwZXJzY3JpcHRHRjgvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRigvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYoLyUnb3BhcXVlR0Y4LyUrZXhlY3V0YWJsZUdGOC8lKXJlYWRvbmx5R [...]
+</Output>
+</Group>
+<Group labelreference="L175" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">t2:time(lbRank(B));</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtc0dGJTYjUTFjb252ZXJzaW9ufnRpbWU6RigtSSNtb0dGJTYzUSIsRigvJSVmb3JtR1EmaW5maXhGKC8lJmZlbmNlR1EmZmFsc2VGKC8lKnNlcGFyYXRvckdRJXRydWVGKC8lJ2xzcGFjZUdRJDBlbUYoLyUncnNwYWNlR1EzdmVyeXRoaWNrbWF0aHNwYWNlRigvJSlzdHJldGNoeUdGOS8lKnN5bW1ldHJpY0dGOS8lKG1heHNpemVHUSlpbmZpbml0eUYoLyUobWluc2l6ZUdRIjFGKC8lKGxhcmdlb3BHRjkvJS5tb3ZhY [...]
+</Output>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSNtbkc2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGKDY5USYwLjMwMEYoLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRigvJSVzaXplR1EjMTJGKC8lJWJvbGRHUSZmYWxzZUYoLyUnaXRhbGljR0Y1LyUqdW5kZXJsaW5lR0Y1LyUqc3Vic2NyaXB0R0Y1LyUsc3VwZXJzY3JpcHRHRjUvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRigvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYoLyUnb3BhcXVlR0Y1LyUrZXhlY3V0YWJsZUdGNS8lKXJlYWRvbmx5R1EldHJ1ZUYoLyUpY29tc [...]
+</Output>
+</Group>
+<Group labelreference="L181" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">t1/t2;</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSNtbkc2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGKDY5USwzMDAuMzE3MDczMkYoLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRigvJSVzaXplR1EjMTJGKC8lJWJvbGRHUSZmYWxzZUYoLyUnaXRhbGljR0Y1LyUqdW5kZXJsaW5lR0Y1LyUqc3Vic2NyaXB0R0Y1LyUsc3VwZXJzY3JpcHRHRjUvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRigvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYoLyUnb3BhcXVlR0Y1LyUrZXhlY3V0YWJsZUdGNS8lKXJlYWRvbmx5R1EldHJ1ZUYoL [...]
+</Output>
+</Group>
+<Group labelreference="L180" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal"></Text-field>
+</Input>
+</Group>
+</Section>
+<Section collapsed="true" MultipleChoiceAnswerIndex="-1" MultipleChoiceRandomizeChoices="false" TrueFalseAnswerIndex="-1" EssayAnswerRows="5" EssayAnswerColumns="60"><Title>
+<Text-field style="Heading 3" layout="Heading 3">Minimal Polynomial</Text-field></Title>
+<Group labelreference="L235" drawlabel="true">
+<Input>
+<Text-field style="Text" layout="Normal"></Text-field>
+</Input>
+</Group>
+<Group labelreference="L234" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">n:=20;gen:=rand(0..10);</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtaUdGJTY5USJuRigvJSdmYW1pbHlHUTBUaW1lc35OZXd+Um9tYW5GKC8lJXNpemVHUSMxMkYoLyUlYm9sZEdRJmZhbHNlRigvJSdpdGFsaWNHUSV0cnVlRigvJSp1bmRlcmxpbmVHRjgvJSpzdWJzY3JpcHRHRjgvJSxzdXBlcnNjcmlwdEdGOC8lK2ZvcmVncm91bmRHUSpbMCwwLDI1NV1GKC8lK2JhY2tncm91bmRHUS5bMjU1LDI1NSwyNTVdRigvJSdvcGFxdWVHRjgvJStleGVjdXRhYmxlR0Y4LyUpcmVhZG9ubHlHR [...]
+</Output>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtaUdGJTY5USRnZW5GKC8lJ2ZhbWlseUdRMFRpbWVzfk5ld35Sb21hbkYoLyUlc2l6ZUdRIzEyRigvJSVib2xkR1EmZmFsc2VGKC8lJ2l0YWxpY0dRJXRydWVGKC8lKnVuZGVybGluZUdGOC8lKnN1YnNjcmlwdEdGOC8lLHN1cGVyc2NyaXB0R0Y4LyUrZm9yZWdyb3VuZEdRKlswLDAsMjU1XUYoLyUrYmFja2dyb3VuZEdRLlsyNTUsMjU1LDI1NV1GKC8lJ29wYXF1ZUdGOC8lK2V4ZWN1dGFibGVHRjgvJSlyZWFkb25se [...]
+</Output>
+</Group>
+<Group labelreference="L233" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">A:=Matrix(n,gen);</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzYlLUkjbWlHRiQ2OVEiQUYnLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRicvJSVzaXplR1EjMTJGJy8lJWJvbGRHUSZmYWxzZUYnLyUnaXRhbGljR1EldHJ1ZUYnLyUqdW5kZXJsaW5lR0Y3LyUqc3Vic2NyaXB0R0Y3LyUsc3VwZXJzY3JpcHRHRjcvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRicvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYnLyUnb3BhcXVlR0Y3LyUrZXhlY3V0YWJsZUdGNy8lKXJlYWRvbmx5R0Y6L [...]
+</Output>
+</Group>
+<Group labelreference="L185" drawlabel="true">
+<Input>
+<Text-field style="Text" layout="Normal"></Text-field>
+</Input>
+</Group>
+<Group labelreference="L226" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal"></Text-field>
+</Input>
+</Group>
+<Group labelreference="L183" drawlabel="true">
+<Input>
+<Text-field style="Text" layout="Normal"><Font size="16">Maple minimal polynomial</Font></Text-field>
+<Text-field style="Text" layout="Normal"></Text-field>
+</Input>
+</Group>
+<Group labelreference="L188" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">MinimalPolynomial(A,'x');</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNkwtSSNtb0dGJTYzUSomdW1pbnVzMDtGKC8lJWZvcm1HUSdwcmVmaXhGKC8lJmZlbmNlR1EmZmFsc2VGKC8lKnNlcGFyYXRvckdGNS8lJ2xzcGFjZUdRJDBlbUYoLyUncnNwYWNlR0Y6LyUpc3RyZXRjaHlHRjUvJSpzeW1tZXRyaWNHRjUvJShtYXhzaXplR1EpaW5maW5pdHlGKC8lKG1pbnNpemVHUSIxRigvJShsYXJnZW9wR0Y1LyUubW92YWJsZWxpbWl0c0dGNS8lJ2FjY2VudEdGNS8lMGZvbnRfc3R5bGVfbmFtZUdRKjJEf [...]
+</Output>
+</Group>
+<Group labelreference="L184" drawlabel="true">
+<Input>
+<Text-field style="Text" layout="Normal"></Text-field>
+<Text-field style="Text" layout="Normal"><Font size="16">LinBox minimal polynomial</Font></Text-field>
+<Text-field style="Text" layout="Normal"></Text-field>
+</Input>
+</Group>
+<Group labelreference="L194" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">lbMinpoly(A,'x');</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtc0dGJTYjUTFjb252ZXJzaW9ufnRpbWU6RigtSSNtb0dGJTYzUSIsRigvJSVmb3JtR1EmaW5maXhGKC8lJmZlbmNlR1EmZmFsc2VGKC8lKnNlcGFyYXRvckdRJXRydWVGKC8lJ2xzcGFjZUdRJDBlbUYoLyUncnNwYWNlR1EzdmVyeXRoaWNrbWF0aHNwYWNlRigvJSlzdHJldGNoeUdGOS8lKnN5bW1ldHJpY0dGOS8lKG1heHNpemVHUSlpbmZpbml0eUYoLyUobWluc2l6ZUdRIjFGKC8lKGxhcmdlb3BHRjkvJS5tb3ZhY [...]
+</Output>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNkwtSSNtb0dGJTYzUSomdW1pbnVzMDtGKC8lJWZvcm1HUSdwcmVmaXhGKC8lJmZlbmNlR1EmZmFsc2VGKC8lKnNlcGFyYXRvckdGNS8lJ2xzcGFjZUdRJDBlbUYoLyUncnNwYWNlR0Y6LyUpc3RyZXRjaHlHRjUvJSpzeW1tZXRyaWNHRjUvJShtYXhzaXplR1EpaW5maW5pdHlGKC8lKG1pbnNpemVHUSIxRigvJShsYXJnZW9wR0Y1LyUubW92YWJsZWxpbWl0c0dGNS8lJ2FjY2VudEdGNS8lMGZvbnRfc3R5bGVfbmFtZUdRKjJEf [...]
+</Output>
+</Group>
+<Group labelreference="L192" drawlabel="true">
+<Input>
+<Text-field style="Text" layout="Normal"></Text-field>
+<Text-field style="Text" layout="Normal"><Font size="16">Timing comparison</Font></Text-field>
+<Text-field style="Text" layout="Normal"></Text-field>
+</Input>
+</Group>
+<Group labelreference="L187" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">t1:=time(MinimalPolynomial(A,'x'));</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtaUdGJTY5USN0MUYoLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRigvJSVzaXplR1EjMTJGKC8lJWJvbGRHUSZmYWxzZUYoLyUnaXRhbGljR1EldHJ1ZUYoLyUqdW5kZXJsaW5lR0Y4LyUqc3Vic2NyaXB0R0Y4LyUsc3VwZXJzY3JpcHRHRjgvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRigvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYoLyUnb3BhcXVlR0Y4LyUrZXhlY3V0YWJsZUdGOC8lKXJlYWRvbmx5R [...]
+</Output>
+</Group>
+<Group labelreference="L186" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">t2:time(lbMinpoly(A,'x'));</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtc0dGJTYjUTFjb252ZXJzaW9ufnRpbWU6RigtSSNtb0dGJTYzUSIsRigvJSVmb3JtR1EmaW5maXhGKC8lJmZlbmNlR1EmZmFsc2VGKC8lKnNlcGFyYXRvckdRJXRydWVGKC8lJ2xzcGFjZUdRJDBlbUYoLyUncnNwYWNlR1EzdmVyeXRoaWNrbWF0aHNwYWNlRigvJSlzdHJldGNoeUdGOS8lKnN5bW1ldHJpY0dGOS8lKG1heHNpemVHUSlpbmZpbml0eUYoLyUobWluc2l6ZUdRIjFGKC8lKGxhcmdlb3BHRjkvJS5tb3ZhY [...]
+</Output>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSNtbkc2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGKDY5USYwLjAwN0YoLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRigvJSVzaXplR1EjMTJGKC8lJWJvbGRHUSZmYWxzZUYoLyUnaXRhbGljR0Y1LyUqdW5kZXJsaW5lR0Y1LyUqc3Vic2NyaXB0R0Y1LyUsc3VwZXJzY3JpcHRHRjUvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRigvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYoLyUnb3BhcXVlR0Y1LyUrZXhlY3V0YWJsZUdGNS8lKXJlYWRvbmx5R1EldHJ1ZUYoLyUpY29tc [...]
+</Output>
+</Group>
+<Group labelreference="L191" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">t1/t2;</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSNtbkc2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGKDY5USw0Ni45NzU2MDk3NkYoLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRigvJSVzaXplR1EjMTJGKC8lJWJvbGRHUSZmYWxzZUYoLyUnaXRhbGljR0Y1LyUqdW5kZXJsaW5lR0Y1LyUqc3Vic2NyaXB0R0Y1LyUsc3VwZXJzY3JpcHRHRjUvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRigvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYoLyUnb3BhcXVlR0Y1LyUrZXhlY3V0YWJsZUdGNS8lKXJlYWRvbmx5R1EldHJ1ZUYoL [...]
+</Output>
+</Group>
+<Group labelreference="L189" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal"></Text-field>
+</Input>
+</Group>
+</Section>
+<Section collapsed="true" MultipleChoiceAnswerIndex="-1" MultipleChoiceRandomizeChoices="false" TrueFalseAnswerIndex="-1" EssayAnswerRows="5" EssayAnswerColumns="60"><Title>
+<Text-field style="Heading 3" layout="Heading 3">Characteristic Polynomial</Text-field></Title>
+<Group labelreference="L199" drawlabel="true">
+<Input>
+<Text-field style="Text" layout="Normal"></Text-field>
+</Input>
+</Group>
+<Group labelreference="L237" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">n:=20;gen:=rand(0..10);</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtaUdGJTY5USJuRigvJSdmYW1pbHlHUTBUaW1lc35OZXd+Um9tYW5GKC8lJXNpemVHUSMxMkYoLyUlYm9sZEdRJmZhbHNlRigvJSdpdGFsaWNHUSV0cnVlRigvJSp1bmRlcmxpbmVHRjgvJSpzdWJzY3JpcHRHRjgvJSxzdXBlcnNjcmlwdEdGOC8lK2ZvcmVncm91bmRHUSpbMCwwLDI1NV1GKC8lK2JhY2tncm91bmRHUS5bMjU1LDI1NSwyNTVdRigvJSdvcGFxdWVHRjgvJStleGVjdXRhYmxlR0Y4LyUpcmVhZG9ubHlHR [...]
+</Output>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtaUdGJTY5USRnZW5GKC8lJ2ZhbWlseUdRMFRpbWVzfk5ld35Sb21hbkYoLyUlc2l6ZUdRIzEyRigvJSVib2xkR1EmZmFsc2VGKC8lJ2l0YWxpY0dRJXRydWVGKC8lKnVuZGVybGluZUdGOC8lKnN1YnNjcmlwdEdGOC8lLHN1cGVyc2NyaXB0R0Y4LyUrZm9yZWdyb3VuZEdRKlswLDAsMjU1XUYoLyUrYmFja2dyb3VuZEdRLlsyNTUsMjU1LDI1NV1GKC8lJ29wYXF1ZUdGOC8lK2V4ZWN1dGFibGVHRjgvJSlyZWFkb25se [...]
+</Output>
+</Group>
+<Group labelreference="L236" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">A:=Matrix(n,gen);</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzYlLUkjbWlHRiQ2OVEiQUYnLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRicvJSVzaXplR1EjMTJGJy8lJWJvbGRHUSZmYWxzZUYnLyUnaXRhbGljR1EldHJ1ZUYnLyUqdW5kZXJsaW5lR0Y3LyUqc3Vic2NyaXB0R0Y3LyUsc3VwZXJzY3JpcHRHRjcvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRicvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYnLyUnb3BhcXVlR0Y3LyUrZXhlY3V0YWJsZUdGNy8lKXJlYWRvbmx5R0Y6L [...]
+</Output>
+</Group>
+<Group labelreference="L199" drawlabel="true">
+<Input>
+<Text-field style="Text" layout="Normal"></Text-field>
+</Input>
+</Group>
+<Group labelreference="L197" drawlabel="true">
+<Input>
+<Text-field style="Text" layout="Normal"><Font size="16">Maple characteristic polynomial</Font></Text-field>
+<Text-field style="Text" layout="Normal"></Text-field>
+</Input>
+</Group>
+<Group labelreference="L202" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">CharacteristicPolynomial(A,'x');</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNkstRiQ2Iy1JJW1zdXBHRiU2JS1JI21pR0YlNjlRInhGKC8lJ2ZhbWlseUdRMFRpbWVzfk5ld35Sb21hbkYoLyUlc2l6ZUdRIzEyRigvJSVib2xkR1EmZmFsc2VGKC8lJ2l0YWxpY0dRJXRydWVGKC8lKnVuZGVybGluZUdGPS8lKnN1YnNjcmlwdEdGPS8lLHN1cGVyc2NyaXB0R0Y9LyUrZm9yZWdyb3VuZEdRKlswLDAsMjU1XUYoLyUrYmFja2dyb3VuZEdRLlsyNTUsMjU1LDI1NV1GKC8lJ29wYXF1ZUdGPS8lK2V4ZWN1dGFib [...]
+</Output>
+</Group>
+<Group labelreference="L198" drawlabel="true">
+<Input>
+<Text-field style="Text" layout="Normal"></Text-field>
+<Text-field style="Text" layout="Normal"><Font size="16">LinBox characteristic polynomial</Font></Text-field>
+<Text-field style="Text" layout="Normal"></Text-field>
+</Input>
+</Group>
+<Group labelreference="L208" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">lbCharpoly(A,'x');</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtc0dGJTYjUTFjb252ZXJzaW9ufnRpbWU6RigtSSNtb0dGJTYzUSIsRigvJSVmb3JtR1EmaW5maXhGKC8lJmZlbmNlR1EmZmFsc2VGKC8lKnNlcGFyYXRvckdRJXRydWVGKC8lJ2xzcGFjZUdRJDBlbUYoLyUncnNwYWNlR1EzdmVyeXRoaWNrbWF0aHNwYWNlRigvJSlzdHJldGNoeUdGOS8lKnN5bW1ldHJpY0dGOS8lKG1heHNpemVHUSlpbmZpbml0eUYoLyUobWluc2l6ZUdRIjFGKC8lKGxhcmdlb3BHRjkvJS5tb3ZhY [...]
+</Output>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNkstRiQ2Iy1JJW1zdXBHRiU2JS1JI21pR0YlNjlRInhGKC8lJ2ZhbWlseUdRMFRpbWVzfk5ld35Sb21hbkYoLyUlc2l6ZUdRIzEyRigvJSVib2xkR1EmZmFsc2VGKC8lJ2l0YWxpY0dRJXRydWVGKC8lKnVuZGVybGluZUdGPS8lKnN1YnNjcmlwdEdGPS8lLHN1cGVyc2NyaXB0R0Y9LyUrZm9yZWdyb3VuZEdRKlswLDAsMjU1XUYoLyUrYmFja2dyb3VuZEdRLlsyNTUsMjU1LDI1NV1GKC8lJ29wYXF1ZUdGPS8lK2V4ZWN1dGFib [...]
+</Output>
+</Group>
+<Group labelreference="L206" drawlabel="true">
+<Input>
+<Text-field style="Text" layout="Normal"></Text-field>
+<Text-field style="Text" layout="Normal"><Font size="16">Timing comparison</Font></Text-field>
+<Text-field style="Text" layout="Normal"></Text-field>
+</Input>
+</Group>
+<Group labelreference="L201" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">t1:=time(CharacteristicPolynomial(A,'x'));</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtaUdGJTY5USN0MUYoLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRigvJSVzaXplR1EjMTJGKC8lJWJvbGRHUSZmYWxzZUYoLyUnaXRhbGljR1EldHJ1ZUYoLyUqdW5kZXJsaW5lR0Y4LyUqc3Vic2NyaXB0R0Y4LyUsc3VwZXJzY3JpcHRHRjgvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRigvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYoLyUnb3BhcXVlR0Y4LyUrZXhlY3V0YWJsZUdGOC8lKXJlYWRvbmx5R [...]
+</Output>
+</Group>
+<Group labelreference="L200" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">t2:=time(lbCharpoly(A,'x'));</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtc0dGJTYjUTFjb252ZXJzaW9ufnRpbWU6RigtSSNtb0dGJTYzUSIsRigvJSVmb3JtR1EmaW5maXhGKC8lJmZlbmNlR1EmZmFsc2VGKC8lKnNlcGFyYXRvckdRJXRydWVGKC8lJ2xzcGFjZUdRJDBlbUYoLyUncnNwYWNlR1EzdmVyeXRoaWNrbWF0aHNwYWNlRigvJSlzdHJldGNoeUdGOS8lKnN5bW1ldHJpY0dGOS8lKG1heHNpemVHUSlpbmZpbml0eUYoLyUobWluc2l6ZUdRIjFGKC8lKGxhcmdlb3BHRjkvJS5tb3ZhY [...]
+</Output>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtaUdGJTY5USN0MkYoLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRigvJSVzaXplR1EjMTJGKC8lJWJvbGRHUSZmYWxzZUYoLyUnaXRhbGljR1EldHJ1ZUYoLyUqdW5kZXJsaW5lR0Y4LyUqc3Vic2NyaXB0R0Y4LyUsc3VwZXJzY3JpcHRHRjgvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRigvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYoLyUnb3BhcXVlR0Y4LyUrZXhlY3V0YWJsZUdGOC8lKXJlYWRvbmx5R [...]
+</Output>
+</Group>
+<Group labelreference="L205" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">t1/t2;</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSNtbkc2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGKDY5USwxNy4wMDAwMDAwMEYoLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRigvJSVzaXplR1EjMTJGKC8lJWJvbGRHUSZmYWxzZUYoLyUnaXRhbGljR0Y1LyUqdW5kZXJsaW5lR0Y1LyUqc3Vic2NyaXB0R0Y1LyUsc3VwZXJzY3JpcHRHRjUvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRigvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYoLyUnb3BhcXVlR0Y1LyUrZXhlY3V0YWJsZUdGNS8lKXJlYWRvbmx5R1EldHJ1ZUYoL [...]
+</Output>
+</Group>
+<Group labelreference="L207" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">B:=Matrix(50,gen);</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzYlLUkjbWlHRiQ2OVEiQkYnLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRicvJSVzaXplR1EjMTJGJy8lJWJvbGRHUSZmYWxzZUYnLyUnaXRhbGljR1EldHJ1ZUYnLyUqdW5kZXJsaW5lR0Y3LyUqc3Vic2NyaXB0R0Y3LyUsc3VwZXJzY3JpcHRHRjcvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRicvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYnLyUnb3BhcXVlR0Y3LyUrZXhlY3V0YWJsZUdGNy8lKXJlYWRvbmx5R0Y6L [...]
+</Output>
+</Group>
+<Group labelreference="L203" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">CharacteristicPolynomial(B,'x');</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNmJxLUkjbW9HRiU2M1EqJnVtaW51czA7RigvJSVmb3JtR1EncHJlZml4RigvJSZmZW5jZUdRJmZhbHNlRigvJSpzZXBhcmF0b3JHRjUvJSdsc3BhY2VHUSQwZW1GKC8lJ3JzcGFjZUdGOi8lKXN0cmV0Y2h5R0Y1LyUqc3ltbWV0cmljR0Y1LyUobWF4c2l6ZUdRKWluZmluaXR5RigvJShtaW5zaXplR1EiMUYoLyUobGFyZ2VvcEdGNS8lLm1vdmFibGVsaW1pdHNHRjUvJSdhY2NlbnRHRjUvJTBmb250X3N0eWxlX25hbWVHUSoyR [...]
+</Output>
+</Group>
+<Group labelreference="L238" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">lbCharpoly(B,'x');</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtc0dGJTYjUTFjb252ZXJzaW9ufnRpbWU6RigtSSNtb0dGJTYzUSIsRigvJSVmb3JtR1EmaW5maXhGKC8lJmZlbmNlR1EmZmFsc2VGKC8lKnNlcGFyYXRvckdRJXRydWVGKC8lJ2xzcGFjZUdRJDBlbUYoLyUncnNwYWNlR1EzdmVyeXRoaWNrbWF0aHNwYWNlRigvJSlzdHJldGNoeUdGOS8lKnN5bW1ldHJpY0dGOS8lKG1heHNpemVHUSlpbmZpbml0eUYoLyUobWluc2l6ZUdRIjFGKC8lKGxhcmdlb3BHRjkvJS5tb3ZhY [...]
+</Output>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNmJxLUkjbW9HRiU2M1EqJnVtaW51czA7RigvJSVmb3JtR1EncHJlZml4RigvJSZmZW5jZUdRJmZhbHNlRigvJSpzZXBhcmF0b3JHRjUvJSdsc3BhY2VHUSQwZW1GKC8lJ3JzcGFjZUdGOi8lKXN0cmV0Y2h5R0Y1LyUqc3ltbWV0cmljR0Y1LyUobWF4c2l6ZUdRKWluZmluaXR5RigvJShtaW5zaXplR1EiMUYoLyUobGFyZ2VvcEdGNS8lLm1vdmFibGVsaW1pdHNHRjUvJSdhY2NlbnRHRjUvJTBmb250X3N0eWxlX25hbWVHUSoyR [...]
+</Output>
+</Group>
+<Group labelreference="L241" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">t1:=time(CharacteristicPolynomial(B,'x'));</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtaUdGJTY5USN0MUYoLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRigvJSVzaXplR1EjMTJGKC8lJWJvbGRHUSZmYWxzZUYoLyUnaXRhbGljR1EldHJ1ZUYoLyUqdW5kZXJsaW5lR0Y4LyUqc3Vic2NyaXB0R0Y4LyUsc3VwZXJzY3JpcHRHRjgvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRigvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYoLyUnb3BhcXVlR0Y4LyUrZXhlY3V0YWJsZUdGOC8lKXJlYWRvbmx5R [...]
+</Output>
+</Group>
+<Group labelreference="L242" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">t2:time(lbCharpoly(B,'x'));</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtc0dGJTYjUTFjb252ZXJzaW9ufnRpbWU6RigtSSNtb0dGJTYzUSIsRigvJSVmb3JtR1EmaW5maXhGKC8lJmZlbmNlR1EmZmFsc2VGKC8lKnNlcGFyYXRvckdRJXRydWVGKC8lJ2xzcGFjZUdRJDBlbUYoLyUncnNwYWNlR1EzdmVyeXRoaWNrbWF0aHNwYWNlRigvJSlzdHJldGNoeUdGOS8lKnN5bW1ldHJpY0dGOS8lKG1heHNpemVHUSlpbmZpbml0eUYoLyUobWluc2l6ZUdRIjFGKC8lKGxhcmdlb3BHRjkvJS5tb3ZhY [...]
+</Output>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSNtbkc2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGKDY5USYwLjA4MkYoLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRigvJSVzaXplR1EjMTJGKC8lJWJvbGRHUSZmYWxzZUYoLyUnaXRhbGljR0Y1LyUqdW5kZXJsaW5lR0Y1LyUqc3Vic2NyaXB0R0Y1LyUsc3VwZXJzY3JpcHRHRjUvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRigvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYoLyUnb3BhcXVlR0Y1LyUrZXhlY3V0YWJsZUdGNS8lKXJlYWRvbmx5R1EldHJ1ZUYoLyUpY29tc [...]
+</Output>
+</Group>
+<Group labelreference="L240" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">t1/t2;</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSNtbkc2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGKDY5USw3NzYuNTAwMDAwMEYoLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRigvJSVzaXplR1EjMTJGKC8lJWJvbGRHUSZmYWxzZUYoLyUnaXRhbGljR0Y1LyUqdW5kZXJsaW5lR0Y1LyUqc3Vic2NyaXB0R0Y1LyUsc3VwZXJzY3JpcHRHRjUvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRigvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYoLyUnb3BhcXVlR0Y1LyUrZXhlY3V0YWJsZUdGNS8lKXJlYWRvbmx5R1EldHJ1ZUYoL [...]
+</Output>
+</Group>
+<Group labelreference="L239" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal"></Text-field>
+</Input>
+</Group>
+</Section>
+<Section collapsed="true" MultipleChoiceAnswerIndex="-1" MultipleChoiceRandomizeChoices="false" TrueFalseAnswerIndex="-1" EssayAnswerRows="5" EssayAnswerColumns="60"><Title>
+<Text-field style="Heading 3" layout="Heading 3">Linear System Solving</Text-field></Title>
+<Text-field style="Text" layout="Normal"></Text-field>
+<Group labelreference="L244" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">n:=200;gen:=rand(0..10);</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtaUdGJTY5USJuRigvJSdmYW1pbHlHUTBUaW1lc35OZXd+Um9tYW5GKC8lJXNpemVHUSMxMkYoLyUlYm9sZEdRJmZhbHNlRigvJSdpdGFsaWNHUSV0cnVlRigvJSp1bmRlcmxpbmVHRjgvJSpzdWJzY3JpcHRHRjgvJSxzdXBlcnNjcmlwdEdGOC8lK2ZvcmVncm91bmRHUSpbMCwwLDI1NV1GKC8lK2JhY2tncm91bmRHUS5bMjU1LDI1NSwyNTVdRigvJSdvcGFxdWVHRjgvJStleGVjdXRhYmxlR0Y4LyUpcmVhZG9ubHlHR [...]
+</Output>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtaUdGJTY5USRnZW5GKC8lJ2ZhbWlseUdRMFRpbWVzfk5ld35Sb21hbkYoLyUlc2l6ZUdRIzEyRigvJSVib2xkR1EmZmFsc2VGKC8lJ2l0YWxpY0dRJXRydWVGKC8lKnVuZGVybGluZUdGOC8lKnN1YnNjcmlwdEdGOC8lLHN1cGVyc2NyaXB0R0Y4LyUrZm9yZWdyb3VuZEdRKlswLDAsMjU1XUYoLyUrYmFja2dyb3VuZEdRLlsyNTUsMjU1LDI1NV1GKC8lJ29wYXF1ZUdGOC8lK2V4ZWN1dGFibGVHRjgvJSlyZWFkb25se [...]
+</Output>
+</Group>
+<Group labelreference="L243" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">A:=Matrix(n,gen);b:=Vector(n,gen);</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzYlLUkjbWlHRiQ2OVEiQUYnLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRicvJSVzaXplR1EjMTJGJy8lJWJvbGRHUSZmYWxzZUYnLyUnaXRhbGljR1EldHJ1ZUYnLyUqdW5kZXJsaW5lR0Y3LyUqc3Vic2NyaXB0R0Y3LyUsc3VwZXJzY3JpcHRHRjcvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRicvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYnLyUnb3BhcXVlR0Y3LyUrZXhlY3V0YWJsZUdGNy8lKXJlYWRvbmx5R0Y6L [...]
+</Output>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzYlLUkjbWlHRiQ2OVEiYkYnLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRicvJSVzaXplR1EjMTJGJy8lJWJvbGRHUSZmYWxzZUYnLyUnaXRhbGljR1EldHJ1ZUYnLyUqdW5kZXJsaW5lR0Y3LyUqc3Vic2NyaXB0R0Y3LyUsc3VwZXJzY3JpcHRHRjcvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRicvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYnLyUnb3BhcXVlR0Y3LyUrZXhlY3V0YWJsZUdGNy8lKXJlYWRvbmx5R0Y6L [...]
+</Output>
+</Group>
+<Group labelreference="L245" drawlabel="true">
+<Input>
+<Text-field style="Text" layout="Normal"></Text-field>
+</Input>
+</Group>
+<Group labelreference="L213" drawlabel="true">
+<Input>
+<Text-field style="Text" layout="Normal"></Text-field>
+</Input>
+</Group>
+<Group labelreference="L211" drawlabel="true">
+<Input>
+<Text-field style="Text" layout="Normal"><Font size="16">Maple linear system solving</Font></Text-field>
+<Text-field style="Text" layout="Normal"></Text-field>
+</Input>
+</Group>
+<Group labelreference="L216" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">x1:=LinearSolve(A,b, method=modular);x1[1];</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzYlLUkjbWlHRiQ2OVEjeDFGJy8lJ2ZhbWlseUdRMFRpbWVzfk5ld35Sb21hbkYnLyUlc2l6ZUdRIzEyRicvJSVib2xkR1EmZmFsc2VGJy8lJ2l0YWxpY0dRJXRydWVGJy8lKnVuZGVybGluZUdGNy8lKnN1YnNjcmlwdEdGNy8lLHN1cGVyc2NyaXB0R0Y3LyUrZm9yZWdyb3VuZEdRKlswLDAsMjU1XUYnLyUrYmFja2dyb3VuZEdRLlsyNTUsMjU1LDI1NV1GJy8lJ29wYXF1ZUdGNy8lK2V4ZWN1dGFibGVHRjcvJSlyZWFkb25seUdGO [...]
+</Output>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSZtZnJhY0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGKDYqLUkjbW5HRiU2OVFhXWwmbWludXM7NTI3NDE2MTU0NzUxOTUxMDIzMTE3MTU1OTY4NjczNTQ2NDg0MjE2MzA0MTM3MTk5MjE2OTM0MDkxODcxNTUxMTg3Mjg4MjA0MDg4NjE5MjIwNDczNjMxNDQ1NTEwOTI5ODE4MDU0NzM3MDg3Mjc4NTk3MDUzNzYxNzg3MTQ3ODU1MjQxNTM2NzU0NDYxMTE1MTE1OTgxOTMxNzM5NzU4MTk3MTkwNDYxNjAzNDAxMDA4MzEzNjI4MDkyNTQzOTg0MjY0MzY3NTEyNjA0Mzg4NDk5NDM4ODU0M [...]
+</Output>
+</Group>
+<Group labelreference="L212" drawlabel="true">
+<Input>
+<Text-field style="Text" layout="Normal"></Text-field>
+<Text-field style="Text" layout="Normal"><Font size="16">LinBox linear system solving</Font></Text-field>
+<Text-field style="Text" layout="Normal"></Text-field>
+</Input>
+</Group>
+<Group labelreference="L222" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">x2:=lbSolve(A,b);x2[1];</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtc0dGJTYjUTFjb252ZXJzaW9ufnRpbWU6RigtSSNtb0dGJTYzUSIsRigvJSVmb3JtR1EmaW5maXhGKC8lJmZlbmNlR1EmZmFsc2VGKC8lKnNlcGFyYXRvckdRJXRydWVGKC8lJ2xzcGFjZUdRJDBlbUYoLyUncnNwYWNlR1EzdmVyeXRoaWNrbWF0aHNwYWNlRigvJSlzdHJldGNoeUdGOS8lKnN5bW1ldHJpY0dGOS8lKG1heHNpemVHUSlpbmZpbml0eUYoLyUobWluc2l6ZUdRIjFGKC8lKGxhcmdlb3BHRjkvJS5tb3ZhY [...]
+</Output>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzYlLUkjbWlHRiQ2OVEjeDJGJy8lJ2ZhbWlseUdRMFRpbWVzfk5ld35Sb21hbkYnLyUlc2l6ZUdRIzEyRicvJSVib2xkR1EmZmFsc2VGJy8lJ2l0YWxpY0dRJXRydWVGJy8lKnVuZGVybGluZUdGNy8lKnN1YnNjcmlwdEdGNy8lLHN1cGVyc2NyaXB0R0Y3LyUrZm9yZWdyb3VuZEdRKlswLDAsMjU1XUYnLyUrYmFja2dyb3VuZEdRLlsyNTUsMjU1LDI1NV1GJy8lJ29wYXF1ZUdGNy8lK2V4ZWN1dGFibGVHRjcvJSlyZWFkb25seUdGO [...]
+</Output>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSZtZnJhY0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGKDYqLUkjbW5HRiU2OVFhXWwmbWludXM7NTI3NDE2MTU0NzUxOTUxMDIzMTE3MTU1OTY4NjczNTQ2NDg0MjE2MzA0MTM3MTk5MjE2OTM0MDkxODcxNTUxMTg3Mjg4MjA0MDg4NjE5MjIwNDczNjMxNDQ1NTEwOTI5ODE4MDU0NzM3MDg3Mjc4NTk3MDUzNzYxNzg3MTQ3ODU1MjQxNTM2NzU0NDYxMTE1MTE1OTgxOTMxNzM5NzU4MTk3MTkwNDYxNjAzNDAxMDA4MzEzNjI4MDkyNTQzOTg0MjY0MzY3NTEyNjA0Mzg4NDk5NDM4ODU0M [...]
+</Output>
+</Group>
+<Group labelreference="L246" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal"></Text-field>
+</Input>
+</Group>
+<Group labelreference="L247" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal"></Text-field>
+</Input>
+</Group>
+<Group labelreference="L220" drawlabel="true">
+<Input>
+<Text-field style="Text" layout="Normal"></Text-field>
+<Text-field style="Text" layout="Normal"><Font size="16">Timing comparison</Font></Text-field>
+<Text-field style="Text" layout="Normal"></Text-field>
+</Input>
+</Group>
+<Group labelreference="L215" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">t1:=time(LinearSolve(A,b,method=modular));</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtaUdGJTY5USN0MUYoLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRigvJSVzaXplR1EjMTJGKC8lJWJvbGRHUSZmYWxzZUYoLyUnaXRhbGljR1EldHJ1ZUYoLyUqdW5kZXJsaW5lR0Y4LyUqc3Vic2NyaXB0R0Y4LyUsc3VwZXJzY3JpcHRHRjgvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRigvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYoLyUnb3BhcXVlR0Y4LyUrZXhlY3V0YWJsZUdGOC8lKXJlYWRvbmx5R [...]
+</Output>
+</Group>
+<Group labelreference="L214" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">t2:=time(lbSolve(A,b));</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtc0dGJTYjUTFjb252ZXJzaW9ufnRpbWU6RigtSSNtb0dGJTYzUSIsRigvJSVmb3JtR1EmaW5maXhGKC8lJmZlbmNlR1EmZmFsc2VGKC8lKnNlcGFyYXRvckdRJXRydWVGKC8lJ2xzcGFjZUdRJDBlbUYoLyUncnNwYWNlR1EzdmVyeXRoaWNrbWF0aHNwYWNlRigvJSlzdHJldGNoeUdGOS8lKnN5bW1ldHJpY0dGOS8lKG1heHNpemVHUSlpbmZpbml0eUYoLyUobWluc2l6ZUdRIjFGKC8lKGxhcmdlb3BHRjkvJS5tb3ZhY [...]
+</Output>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtaUdGJTY5USN0MkYoLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRigvJSVzaXplR1EjMTJGKC8lJWJvbGRHUSZmYWxzZUYoLyUnaXRhbGljR1EldHJ1ZUYoLyUqdW5kZXJsaW5lR0Y4LyUqc3Vic2NyaXB0R0Y4LyUsc3VwZXJzY3JpcHRHRjgvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRigvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYoLyUnb3BhcXVlR0Y4LyUrZXhlY3V0YWJsZUdGOC8lKXJlYWRvbmx5R [...]
+</Output>
+</Group>
+<Group labelreference="L219" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">t1/t2;</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSNtbkc2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGKDY5USwxNC4yODE3MzM3NUYoLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRigvJSVzaXplR1EjMTJGKC8lJWJvbGRHUSZmYWxzZUYoLyUnaXRhbGljR0Y1LyUqdW5kZXJsaW5lR0Y1LyUqc3Vic2NyaXB0R0Y1LyUsc3VwZXJzY3JpcHRHRjUvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRigvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYoLyUnb3BhcXVlR0Y1LyUrZXhlY3V0YWJsZUdGNS8lKXJlYWRvbmx5R1EldHJ1ZUYoL [...]
+</Output>
+</Group>
+<Group labelreference="L221" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">n:=300;B:=Matrix(n,gen);b1:=Vector(n,gen);</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtaUdGJTY5USJuRigvJSdmYW1pbHlHUTBUaW1lc35OZXd+Um9tYW5GKC8lJXNpemVHUSMxMkYoLyUlYm9sZEdRJmZhbHNlRigvJSdpdGFsaWNHUSV0cnVlRigvJSp1bmRlcmxpbmVHRjgvJSpzdWJzY3JpcHRHRjgvJSxzdXBlcnNjcmlwdEdGOC8lK2ZvcmVncm91bmRHUSpbMCwwLDI1NV1GKC8lK2JhY2tncm91bmRHUS5bMjU1LDI1NSwyNTVdRigvJSdvcGFxdWVHRjgvJStleGVjdXRhYmxlR0Y4LyUpcmVhZG9ubHlHR [...]
+</Output>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzYlLUkjbWlHRiQ2OVEiQkYnLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRicvJSVzaXplR1EjMTJGJy8lJWJvbGRHUSZmYWxzZUYnLyUnaXRhbGljR1EldHJ1ZUYnLyUqdW5kZXJsaW5lR0Y3LyUqc3Vic2NyaXB0R0Y3LyUsc3VwZXJzY3JpcHRHRjcvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRicvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYnLyUnb3BhcXVlR0Y3LyUrZXhlY3V0YWJsZUdGNy8lKXJlYWRvbmx5R0Y6L [...]
+</Output>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzYlLUkjbWlHRiQ2OVEjYjFGJy8lJ2ZhbWlseUdRMFRpbWVzfk5ld35Sb21hbkYnLyUlc2l6ZUdRIzEyRicvJSVib2xkR1EmZmFsc2VGJy8lJ2l0YWxpY0dRJXRydWVGJy8lKnVuZGVybGluZUdGNy8lKnN1YnNjcmlwdEdGNy8lLHN1cGVyc2NyaXB0R0Y3LyUrZm9yZWdyb3VuZEdRKlswLDAsMjU1XUYnLyUrYmFja2dyb3VuZEdRLlsyNTUsMjU1LDI1NV1GJy8lJ29wYXF1ZUdGNy8lK2V4ZWN1dGFibGVHRjcvJSlyZWFkb25seUdGO [...]
+</Output>
+</Group>
+<Group labelreference="L223" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">t1:=time(LinearSolve(B,b1, method=modular));</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtaUdGJTY5USN0MUYoLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRigvJSVzaXplR1EjMTJGKC8lJWJvbGRHUSZmYWxzZUYoLyUnaXRhbGljR1EldHJ1ZUYoLyUqdW5kZXJsaW5lR0Y4LyUqc3Vic2NyaXB0R0Y4LyUsc3VwZXJzY3JpcHRHRjgvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRigvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYoLyUnb3BhcXVlR0Y4LyUrZXhlY3V0YWJsZUdGOC8lKXJlYWRvbmx5R [...]
+</Output>
+</Group>
+<Group labelreference="L218" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">t2:time(lbSolve(B,b1));</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtc0dGJTYjUTFjb252ZXJzaW9ufnRpbWU6RigtSSNtb0dGJTYzUSIsRigvJSVmb3JtR1EmaW5maXhGKC8lJmZlbmNlR1EmZmFsc2VGKC8lKnNlcGFyYXRvckdRJXRydWVGKC8lJ2xzcGFjZUdRJDBlbUYoLyUncnNwYWNlR1EzdmVyeXRoaWNrbWF0aHNwYWNlRigvJSlzdHJldGNoeUdGOS8lKnN5bW1ldHJpY0dGOS8lKG1heHNpemVHUSlpbmZpbml0eUYoLyUobWluc2l6ZUdRIjFGKC8lKGxhcmdlb3BHRjkvJS5tb3ZhY [...]
+</Output>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSNtbkc2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGKDY5USYwLjgwNUYoLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRigvJSVzaXplR1EjMTJGKC8lJWJvbGRHUSZmYWxzZUYoLyUnaXRhbGljR0Y1LyUqdW5kZXJsaW5lR0Y1LyUqc3Vic2NyaXB0R0Y1LyUsc3VwZXJzY3JpcHRHRjUvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRigvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYoLyUnb3BhcXVlR0Y1LyUrZXhlY3V0YWJsZUdGNS8lKXJlYWRvbmx5R1EldHJ1ZUYoLyUpY29tc [...]
+</Output>
+</Group>
+<Group labelreference="L224" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">t1/t2;</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSNtbkc2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGKDY5USw0My4zNzQ2MTMwMEYoLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRigvJSVzaXplR1EjMTJGKC8lJWJvbGRHUSZmYWxzZUYoLyUnaXRhbGljR0Y1LyUqdW5kZXJsaW5lR0Y1LyUqc3Vic2NyaXB0R0Y1LyUsc3VwZXJzY3JpcHRHRjUvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRigvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYoLyUnb3BhcXVlR0Y1LyUrZXhlY3V0YWJsZUdGNS8lKXJlYWRvbmx5R1EldHJ1ZUYoL [...]
+</Output>
+</Group>
+<Group labelreference="L217" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal"></Text-field>
+</Input>
+</Group>
+</Section>
+<Group labelreference="L182" drawlabel="true">
+<Input>
+<Text-field style="Text" layout="Normal"></Text-field>
+</Input>
+</Group>
+</Section>
+<Section collapsed="true" MultipleChoiceAnswerIndex="-1" MultipleChoiceRandomizeChoices="false" TrueFalseAnswerIndex="-1" EssayAnswerRows="5" EssayAnswerColumns="60"><Title>
+<Text-field style="Heading 2" layout="Heading 2">Computation over finite fields</Text-field></Title>
+<Text-field style="Text" layout="Normal"></Text-field>
+<Group labelreference="L285" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">restart():with(LinBox):with(LinearAlgebra):</Text-field>
+</Input>
+</Group>
+<Section collapsed="true" MultipleChoiceAnswerIndex="-1" MultipleChoiceRandomizeChoices="false" TrueFalseAnswerIndex="-1" EssayAnswerRows="5" EssayAnswerColumns="60"><Title>
+<Text-field style="Heading 3" layout="Heading 3">Determinant</Text-field></Title>
+<Group labelreference="L130" drawlabel="true">
+<Input>
+<Text-field style="Text" layout="Normal"></Text-field>
+</Input>
+</Group>
+<Group labelreference="L256" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">n:=1000;p:=17;gen:=rand(0..p-1);</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtaUdGJTY5USJuRigvJSdmYW1pbHlHUTBUaW1lc35OZXd+Um9tYW5GKC8lJXNpemVHUSMxMkYoLyUlYm9sZEdRJmZhbHNlRigvJSdpdGFsaWNHUSV0cnVlRigvJSp1bmRlcmxpbmVHRjgvJSpzdWJzY3JpcHRHRjgvJSxzdXBlcnNjcmlwdEdGOC8lK2ZvcmVncm91bmRHUSpbMCwwLDI1NV1GKC8lK2JhY2tncm91bmRHUS5bMjU1LDI1NSwyNTVdRigvJSdvcGFxdWVHRjgvJStleGVjdXRhYmxlR0Y4LyUpcmVhZG9ubHlHR [...]
+</Output>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtaUdGJTY5USJwRigvJSdmYW1pbHlHUTBUaW1lc35OZXd+Um9tYW5GKC8lJXNpemVHUSMxMkYoLyUlYm9sZEdRJmZhbHNlRigvJSdpdGFsaWNHUSV0cnVlRigvJSp1bmRlcmxpbmVHRjgvJSpzdWJzY3JpcHRHRjgvJSxzdXBlcnNjcmlwdEdGOC8lK2ZvcmVncm91bmRHUSpbMCwwLDI1NV1GKC8lK2JhY2tncm91bmRHUS5bMjU1LDI1NSwyNTVdRigvJSdvcGFxdWVHRjgvJStleGVjdXRhYmxlR0Y4LyUpcmVhZG9ubHlHR [...]
+</Output>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtaUdGJTY5USRnZW5GKC8lJ2ZhbWlseUdRMFRpbWVzfk5ld35Sb21hbkYoLyUlc2l6ZUdRIzEyRigvJSVib2xkR1EmZmFsc2VGKC8lJ2l0YWxpY0dRJXRydWVGKC8lKnVuZGVybGluZUdGOC8lKnN1YnNjcmlwdEdGOC8lLHN1cGVyc2NyaXB0R0Y4LyUrZm9yZWdyb3VuZEdRKlswLDAsMjU1XUYoLyUrYmFja2dyb3VuZEdRLlsyNTUsMjU1LDI1NV1GKC8lJ29wYXF1ZUdGOC8lK2V4ZWN1dGFibGVHRjgvJSlyZWFkb25se [...]
+</Output>
+</Group>
+<Group labelreference="L257" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">A:=Matrix(n,gen,datatype=integer[4]);B:=Modular:-Mod(p,A, integer[4]);</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzYlLUkjbWlHRiQ2OVEiQUYnLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRicvJSVzaXplR1EjMTJGJy8lJWJvbGRHUSZmYWxzZUYnLyUnaXRhbGljR1EldHJ1ZUYnLyUqdW5kZXJsaW5lR0Y3LyUqc3Vic2NyaXB0R0Y3LyUsc3VwZXJzY3JpcHRHRjcvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRicvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYnLyUnb3BhcXVlR0Y3LyUrZXhlY3V0YWJsZUdGNy8lKXJlYWRvbmx5R0Y6L [...]
+</Output>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzYlLUkjbWlHRiQ2OVEiQkYnLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRicvJSVzaXplR1EjMTJGJy8lJWJvbGRHUSZmYWxzZUYnLyUnaXRhbGljR1EldHJ1ZUYnLyUqdW5kZXJsaW5lR0Y3LyUqc3Vic2NyaXB0R0Y3LyUsc3VwZXJzY3JpcHRHRjcvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRicvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYnLyUnb3BhcXVlR0Y3LyUrZXhlY3V0YWJsZUdGNy8lKXJlYWRvbmx5R0Y6L [...]
+</Output>
+</Group>
+<Group labelreference="L255" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal"></Text-field>
+</Input>
+</Group>
+<Group labelreference="L128" drawlabel="true">
+<Input>
+<Text-field style="Text" layout="Normal"> <Font size="16">Maple determinant</Font></Text-field>
+<Text-field style="Text" layout="Normal"></Text-field>
+</Input>
+</Group>
+<Group labelreference="L148" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">Modular:-Determinant(p,B);</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSNtbkc2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGKDY5USMxMkYoLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRigvJSVzaXplR1EjMTJGKC8lJWJvbGRHUSZmYWxzZUYoLyUnaXRhbGljR0Y1LyUqdW5kZXJsaW5lR0Y1LyUqc3Vic2NyaXB0R0Y1LyUsc3VwZXJzY3JpcHRHRjUvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRigvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYoLyUnb3BhcXVlR0Y1LyUrZXhlY3V0YWJsZUdGNS8lKXJlYWRvbmx5R1EldHJ1ZUYoLyUpY29tcG9zZ [...]
+</Output>
+</Group>
+<Group labelreference="L151" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">Determinant(A,method=modular[p]);</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSNtbkc2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGKDY5USMxMkYoLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRigvJSVzaXplR1EjMTJGKC8lJWJvbGRHUSZmYWxzZUYoLyUnaXRhbGljR0Y1LyUqdW5kZXJsaW5lR0Y1LyUqc3Vic2NyaXB0R0Y1LyUsc3VwZXJzY3JpcHRHRjUvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRigvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYoLyUnb3BhcXVlR0Y1LyUrZXhlY3V0YWJsZUdGNS8lKXJlYWRvbmx5R1EldHJ1ZUYoLyUpY29tcG9zZ [...]
+</Output>
+</Group>
+<Group labelreference="L152" drawlabel="true">
+<Input>
+<Text-field style="Text" layout="Normal"> </Text-field>
+<Text-field style="Text" layout="Normal"><Font size="16">LinBox determinant</Font></Text-field>
+<Text-field style="Text" layout="Normal"></Text-field>
+</Input>
+</Group>
+<Group labelreference="L122" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">lbDeterminant(p, A);</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtc0dGJTYjUTFjb252ZXJzaW9ufnRpbWU6RigtSSNtb0dGJTYzUSIsRigvJSVmb3JtR1EmaW5maXhGKC8lJmZlbmNlR1EmZmFsc2VGKC8lKnNlcGFyYXRvckdRJXRydWVGKC8lJ2xzcGFjZUdRJDBlbUYoLyUncnNwYWNlR1EzdmVyeXRoaWNrbWF0aHNwYWNlRigvJSlzdHJldGNoeUdGOS8lKnN5bW1ldHJpY0dGOS8lKG1heHNpemVHUSlpbmZpbml0eUYoLyUobWluc2l6ZUdRIjFGKC8lKGxhcmdlb3BHRjkvJS5tb3ZhY [...]
+</Output>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSNtbkc2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGKDY5USMxMkYoLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRigvJSVzaXplR1EjMTJGKC8lJWJvbGRHUSZmYWxzZUYoLyUnaXRhbGljR0Y1LyUqdW5kZXJsaW5lR0Y1LyUqc3Vic2NyaXB0R0Y1LyUsc3VwZXJzY3JpcHRHRjUvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRigvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYoLyUnb3BhcXVlR0Y1LyUrZXhlY3V0YWJsZUdGNS8lKXJlYWRvbmx5R1EldHJ1ZUYoLyUpY29tcG9zZ [...]
+</Output>
+</Group>
+<Group labelreference="L141" drawlabel="true">
+<Input>
+<Text-field style="Text" layout="Normal"></Text-field>
+<Text-field style="Text" layout="Normal"><Font size="16">Timing comparison</Font></Text-field>
+<Text-field style="Text" layout="Normal"></Text-field>
+</Input>
+</Group>
+<Group labelreference="L131" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">t1:=time(Modular:-Determinant(p,B));</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtaUdGJTY5USN0MUYoLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRigvJSVzaXplR1EjMTJGKC8lJWJvbGRHUSZmYWxzZUYoLyUnaXRhbGljR1EldHJ1ZUYoLyUqdW5kZXJsaW5lR0Y4LyUqc3Vic2NyaXB0R0Y4LyUsc3VwZXJzY3JpcHRHRjgvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRigvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYoLyUnb3BhcXVlR0Y4LyUrZXhlY3V0YWJsZUdGOC8lKXJlYWRvbmx5R [...]
+</Output>
+</Group>
+<Group labelreference="L168" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">t2:=time(Determinant(A,method=modular[p]));</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtaUdGJTY5USN0MkYoLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRigvJSVzaXplR1EjMTJGKC8lJWJvbGRHUSZmYWxzZUYoLyUnaXRhbGljR1EldHJ1ZUYoLyUqdW5kZXJsaW5lR0Y4LyUqc3Vic2NyaXB0R0Y4LyUsc3VwZXJzY3JpcHRHRjgvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRigvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYoLyUnb3BhcXVlR0Y4LyUrZXhlY3V0YWJsZUdGOC8lKXJlYWRvbmx5R [...]
+</Output>
+</Group>
+<Group labelreference="L138" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">t3:=time(lbDeterminant(p,A));</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtc0dGJTYjUTFjb252ZXJzaW9ufnRpbWU6RigtSSNtb0dGJTYzUSIsRigvJSVmb3JtR1EmaW5maXhGKC8lJmZlbmNlR1EmZmFsc2VGKC8lKnNlcGFyYXRvckdRJXRydWVGKC8lJ2xzcGFjZUdRJDBlbUYoLyUncnNwYWNlR1EzdmVyeXRoaWNrbWF0aHNwYWNlRigvJSlzdHJldGNoeUdGOS8lKnN5bW1ldHJpY0dGOS8lKG1heHNpemVHUSlpbmZpbml0eUYoLyUobWluc2l6ZUdRIjFGKC8lKGxhcmdlb3BHRjkvJS5tb3ZhY [...]
+</Output>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtaUdGJTY5USN0M0YoLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRigvJSVzaXplR1EjMTJGKC8lJWJvbGRHUSZmYWxzZUYoLyUnaXRhbGljR1EldHJ1ZUYoLyUqdW5kZXJsaW5lR0Y4LyUqc3Vic2NyaXB0R0Y4LyUsc3VwZXJzY3JpcHRHRjgvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRigvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYoLyUnb3BhcXVlR0Y4LyUrZXhlY3V0YWJsZUdGOC8lKXJlYWRvbmx5R [...]
+</Output>
+</Group>
+<Group labelreference="L153" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">t1/t3;t2/t3; </Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSNtbkc2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGKDY5USwxLjM4NTUyNjMxNkYoLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRigvJSVzaXplR1EjMTJGKC8lJWJvbGRHUSZmYWxzZUYoLyUnaXRhbGljR0Y1LyUqdW5kZXJsaW5lR0Y1LyUqc3Vic2NyaXB0R0Y1LyUsc3VwZXJzY3JpcHRHRjUvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRigvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYoLyUnb3BhcXVlR0Y1LyUrZXhlY3V0YWJsZUdGNS8lKXJlYWRvbmx5R1EldHJ1ZUYoL [...]
+</Output>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSNtbkc2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGKDY5USwyLjA5NDczNjg0MkYoLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRigvJSVzaXplR1EjMTJGKC8lJWJvbGRHUSZmYWxzZUYoLyUnaXRhbGljR0Y1LyUqdW5kZXJsaW5lR0Y1LyUqc3Vic2NyaXB0R0Y1LyUsc3VwZXJzY3JpcHRHRjUvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRigvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYoLyUnb3BhcXVlR0Y1LyUrZXhlY3V0YWJsZUdGNS8lKXJlYWRvbmx5R1EldHJ1ZUYoL [...]
+</Output>
+</Group>
+<Group labelreference="L140" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal"></Text-field>
+</Input>
+</Group>
+<Group labelreference="L150" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal"></Text-field>
+</Input>
+</Group>
+</Section>
+<Section collapsed="true" MultipleChoiceAnswerIndex="-1" MultipleChoiceRandomizeChoices="false" TrueFalseAnswerIndex="-1" EssayAnswerRows="5" EssayAnswerColumns="60"><Title>
+<Text-field style="Heading 3" layout="Heading 3">Rank</Text-field></Title>
+<Group labelreference="L123" drawlabel="true">
+<Input>
+<Text-field style="Text" layout="Normal"></Text-field>
+</Input>
+</Group>
+<Group labelreference="L346" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">restart():with(LinBox):with(LinearAlgebra):</Text-field>
+</Input>
+</Group>
+<Group labelreference="L259" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">n:=1000;p:=17;gen:=rand(0..p-1);</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtaUdGJTY5USJuRigvJSdmYW1pbHlHUTBUaW1lc35OZXd+Um9tYW5GKC8lJXNpemVHUSMxMkYoLyUlYm9sZEdRJmZhbHNlRigvJSdpdGFsaWNHUSV0cnVlRigvJSp1bmRlcmxpbmVHRjgvJSpzdWJzY3JpcHRHRjgvJSxzdXBlcnNjcmlwdEdGOC8lK2ZvcmVncm91bmRHUSpbMCwwLDI1NV1GKC8lK2JhY2tncm91bmRHUS5bMjU1LDI1NSwyNTVdRigvJSdvcGFxdWVHRjgvJStleGVjdXRhYmxlR0Y4LyUpcmVhZG9ubHlHR [...]
+</Output>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtaUdGJTY5USJwRigvJSdmYW1pbHlHUTBUaW1lc35OZXd+Um9tYW5GKC8lJXNpemVHUSMxMkYoLyUlYm9sZEdRJmZhbHNlRigvJSdpdGFsaWNHUSV0cnVlRigvJSp1bmRlcmxpbmVHRjgvJSpzdWJzY3JpcHRHRjgvJSxzdXBlcnNjcmlwdEdGOC8lK2ZvcmVncm91bmRHUSpbMCwwLDI1NV1GKC8lK2JhY2tncm91bmRHUS5bMjU1LDI1NSwyNTVdRigvJSdvcGFxdWVHRjgvJStleGVjdXRhYmxlR0Y4LyUpcmVhZG9ubHlHR [...]
+</Output>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtaUdGJTY5USRnZW5GKC8lJ2ZhbWlseUdRMFRpbWVzfk5ld35Sb21hbkYoLyUlc2l6ZUdRIzEyRigvJSVib2xkR1EmZmFsc2VGKC8lJ2l0YWxpY0dRJXRydWVGKC8lKnVuZGVybGluZUdGOC8lKnN1YnNjcmlwdEdGOC8lLHN1cGVyc2NyaXB0R0Y4LyUrZm9yZWdyb3VuZEdRKlswLDAsMjU1XUYoLyUrYmFja2dyb3VuZEdRLlsyNTUsMjU1LDI1NV1GKC8lJ29wYXF1ZUdGOC8lK2V4ZWN1dGFibGVHRjgvJSlyZWFkb25se [...]
+</Output>
+</Group>
+<Group labelreference="L260" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">A:=Matrix(n,gen,datatype=integer[4]);B:=Modular:-Mod(p,A, integer[4]);</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzYlLUkjbWlHRiQ2OVEiQUYnLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRicvJSVzaXplR1EjMTJGJy8lJWJvbGRHUSZmYWxzZUYnLyUnaXRhbGljR1EldHJ1ZUYnLyUqdW5kZXJsaW5lR0Y3LyUqc3Vic2NyaXB0R0Y3LyUsc3VwZXJzY3JpcHRHRjcvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRicvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYnLyUnb3BhcXVlR0Y3LyUrZXhlY3V0YWJsZUdGNy8lKXJlYWRvbmx5R0Y6L [...]
+</Output>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzYlLUkjbWlHRiQ2OVEiQkYnLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRicvJSVzaXplR1EjMTJGJy8lJWJvbGRHUSZmYWxzZUYnLyUnaXRhbGljR1EldHJ1ZUYnLyUqdW5kZXJsaW5lR0Y3LyUqc3Vic2NyaXB0R0Y3LyUsc3VwZXJzY3JpcHRHRjcvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRicvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYnLyUnb3BhcXVlR0Y3LyUrZXhlY3V0YWJsZUdGNy8lKXJlYWRvbmx5R0Y6L [...]
+</Output>
+</Group>
+<Group labelreference="L258" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal"></Text-field>
+</Input>
+</Group>
+<Group labelreference="L162" drawlabel="true">
+<Input>
+<Text-field style="Text" layout="Normal"><Font size="16">Maple rank</Font></Text-field>
+<Text-field style="Text" layout="Normal"></Text-field>
+</Input>
+</Group>
+<Group labelreference="L137" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">Modular:-Rank(p,B);</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSNtbkc2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGKDY5USUxMDAwRigvJSdmYW1pbHlHUTBUaW1lc35OZXd+Um9tYW5GKC8lJXNpemVHUSMxMkYoLyUlYm9sZEdRJmZhbHNlRigvJSdpdGFsaWNHRjUvJSp1bmRlcmxpbmVHRjUvJSpzdWJzY3JpcHRHRjUvJSxzdXBlcnNjcmlwdEdGNS8lK2ZvcmVncm91bmRHUSpbMCwwLDI1NV1GKC8lK2JhY2tncm91bmRHUS5bMjU1LDI1NSwyNTVdRigvJSdvcGFxdWVHRjUvJStleGVjdXRhYmxlR0Y1LyUpcmVhZG9ubHlHUSV0cnVlRigvJSljb21wb [...]
+</Output>
+</Group>
+<Group labelreference="L127" drawlabel="true">
+<Input>
+<Text-field style="Text" layout="Normal"></Text-field>
+<Text-field style="Text" layout="Normal"><Font size="16">LinBox rank</Font></Text-field>
+<Text-field style="Text" layout="Normal"></Text-field>
+</Input>
+</Group>
+<Group labelreference="L134" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">lbRank(p, A);</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtc0dGJTYjUTFjb252ZXJzaW9ufnRpbWU6RigtSSNtb0dGJTYzUSIsRigvJSVmb3JtR1EmaW5maXhGKC8lJmZlbmNlR1EmZmFsc2VGKC8lKnNlcGFyYXRvckdRJXRydWVGKC8lJ2xzcGFjZUdRJDBlbUYoLyUncnNwYWNlR1EzdmVyeXRoaWNrbWF0aHNwYWNlRigvJSlzdHJldGNoeUdGOS8lKnN5bW1ldHJpY0dGOS8lKG1heHNpemVHUSlpbmZpbml0eUYoLyUobWluc2l6ZUdRIjFGKC8lKGxhcmdlb3BHRjkvJS5tb3ZhY [...]
+</Output>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSNtbkc2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGKDY5USUxMDAwRigvJSdmYW1pbHlHUTBUaW1lc35OZXd+Um9tYW5GKC8lJXNpemVHUSMxMkYoLyUlYm9sZEdRJmZhbHNlRigvJSdpdGFsaWNHRjUvJSp1bmRlcmxpbmVHRjUvJSpzdWJzY3JpcHRHRjUvJSxzdXBlcnNjcmlwdEdGNS8lK2ZvcmVncm91bmRHUSpbMCwwLDI1NV1GKC8lK2JhY2tncm91bmRHUS5bMjU1LDI1NSwyNTVdRigvJSdvcGFxdWVHRjUvJStleGVjdXRhYmxlR0Y1LyUpcmVhZG9ubHlHUSV0cnVlRigvJSljb21wb [...]
+</Output>
+</Group>
+<Group labelreference="L167" drawlabel="true">
+<Input>
+<Text-field style="Text" layout="Normal"></Text-field>
+<Text-field style="Text" layout="Normal"><Font size="16">Timing comparison</Font></Text-field>
+<Text-field style="Text" layout="Normal"></Text-field>
+</Input>
+</Group>
+<Group labelreference="L249" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">t1:=time(Modular:-Rank(p,B));</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtaUdGJTY5USN0MUYoLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRigvJSVzaXplR1EjMTJGKC8lJWJvbGRHUSZmYWxzZUYoLyUnaXRhbGljR1EldHJ1ZUYoLyUqdW5kZXJsaW5lR0Y4LyUqc3Vic2NyaXB0R0Y4LyUsc3VwZXJzY3JpcHRHRjgvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRigvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYoLyUnb3BhcXVlR0Y4LyUrZXhlY3V0YWJsZUdGOC8lKXJlYWRvbmx5R [...]
+</Output>
+</Group>
+<Group labelreference="L250" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">t2:=time(lbRank(p,A));</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtc0dGJTYjUTFjb252ZXJzaW9ufnRpbWU6RigtSSNtb0dGJTYzUSIsRigvJSVmb3JtR1EmaW5maXhGKC8lJmZlbmNlR1EmZmFsc2VGKC8lKnNlcGFyYXRvckdRJXRydWVGKC8lJ2xzcGFjZUdRJDBlbUYoLyUncnNwYWNlR1EzdmVyeXRoaWNrbWF0aHNwYWNlRigvJSlzdHJldGNoeUdGOS8lKnN5bW1ldHJpY0dGOS8lKG1heHNpemVHUSlpbmZpbml0eUYoLyUobWluc2l6ZUdRIjFGKC8lKGxhcmdlb3BHRjkvJS5tb3ZhY [...]
+</Output>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtaUdGJTY5USN0MkYoLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRigvJSVzaXplR1EjMTJGKC8lJWJvbGRHUSZmYWxzZUYoLyUnaXRhbGljR1EldHJ1ZUYoLyUqdW5kZXJsaW5lR0Y4LyUqc3Vic2NyaXB0R0Y4LyUsc3VwZXJzY3JpcHRHRjgvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRigvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYoLyUnb3BhcXVlR0Y4LyUrZXhlY3V0YWJsZUdGOC8lKXJlYWRvbmx5R [...]
+</Output>
+</Group>
+<Group labelreference="L251" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">t1/t2;</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSNtbkc2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGKDY5US0wLjg2MzgzMTgyMDRGKC8lJ2ZhbWlseUdRMFRpbWVzfk5ld35Sb21hbkYoLyUlc2l6ZUdRIzEyRigvJSVib2xkR1EmZmFsc2VGKC8lJ2l0YWxpY0dGNS8lKnVuZGVybGluZUdGNS8lKnN1YnNjcmlwdEdGNS8lLHN1cGVyc2NyaXB0R0Y1LyUrZm9yZWdyb3VuZEdRKlswLDAsMjU1XUYoLyUrYmFja2dyb3VuZEdRLlsyNTUsMjU1LDI1NV1GKC8lJ29wYXF1ZUdGNS8lK2V4ZWN1dGFibGVHRjUvJSlyZWFkb25seUdRJXRydWVGK [...]
+</Output>
+</Group>
+<Group labelreference="L121" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal"></Text-field>
+</Input>
+</Group>
+</Section>
+<Section collapsed="true" MultipleChoiceAnswerIndex="-1" MultipleChoiceRandomizeChoices="false" TrueFalseAnswerIndex="-1" EssayAnswerRows="5" EssayAnswerColumns="60"><Title>
+<Text-field style="Heading 3" layout="Heading 3">Minimal Polynomial</Text-field></Title>
+<Group labelreference="L132" drawlabel="true">
+<Input>
+<Text-field style="Text" layout="Normal"></Text-field>
+</Input>
+</Group>
+<Group labelreference="L347" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">restart():with(LinBox):with(LinearAlgebra):</Text-field>
+</Input>
+</Group>
+<Group labelreference="L262" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">n:=500;p:=17;gen:=rand(0..p-1);</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtaUdGJTY5USJuRigvJSdmYW1pbHlHUTBUaW1lc35OZXd+Um9tYW5GKC8lJXNpemVHUSMxMkYoLyUlYm9sZEdRJmZhbHNlRigvJSdpdGFsaWNHUSV0cnVlRigvJSp1bmRlcmxpbmVHRjgvJSpzdWJzY3JpcHRHRjgvJSxzdXBlcnNjcmlwdEdGOC8lK2ZvcmVncm91bmRHUSpbMCwwLDI1NV1GKC8lK2JhY2tncm91bmRHUS5bMjU1LDI1NSwyNTVdRigvJSdvcGFxdWVHRjgvJStleGVjdXRhYmxlR0Y4LyUpcmVhZG9ubHlHR [...]
+</Output>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtaUdGJTY5USJwRigvJSdmYW1pbHlHUTBUaW1lc35OZXd+Um9tYW5GKC8lJXNpemVHUSMxMkYoLyUlYm9sZEdRJmZhbHNlRigvJSdpdGFsaWNHUSV0cnVlRigvJSp1bmRlcmxpbmVHRjgvJSpzdWJzY3JpcHRHRjgvJSxzdXBlcnNjcmlwdEdGOC8lK2ZvcmVncm91bmRHUSpbMCwwLDI1NV1GKC8lK2JhY2tncm91bmRHUS5bMjU1LDI1NSwyNTVdRigvJSdvcGFxdWVHRjgvJStleGVjdXRhYmxlR0Y4LyUpcmVhZG9ubHlHR [...]
+</Output>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtaUdGJTY5USRnZW5GKC8lJ2ZhbWlseUdRMFRpbWVzfk5ld35Sb21hbkYoLyUlc2l6ZUdRIzEyRigvJSVib2xkR1EmZmFsc2VGKC8lJ2l0YWxpY0dRJXRydWVGKC8lKnVuZGVybGluZUdGOC8lKnN1YnNjcmlwdEdGOC8lLHN1cGVyc2NyaXB0R0Y4LyUrZm9yZWdyb3VuZEdRKlswLDAsMjU1XUYoLyUrYmFja2dyb3VuZEdRLlsyNTUsMjU1LDI1NV1GKC8lJ29wYXF1ZUdGOC8lK2V4ZWN1dGFibGVHRjgvJSlyZWFkb25se [...]
+</Output>
+</Group>
+<Group labelreference="L263" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">A:=Matrix(n,gen,datatype=integer[4]);</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzYlLUkjbWlHRiQ2OVEiQUYnLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRicvJSVzaXplR1EjMTJGJy8lJWJvbGRHUSZmYWxzZUYnLyUnaXRhbGljR1EldHJ1ZUYnLyUqdW5kZXJsaW5lR0Y3LyUqc3Vic2NyaXB0R0Y3LyUsc3VwZXJzY3JpcHRHRjcvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRicvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYnLyUnb3BhcXVlR0Y3LyUrZXhlY3V0YWJsZUdGNy8lKXJlYWRvbmx5R0Y6L [...]
+</Output>
+</Group>
+<Group labelreference="L261" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal"></Text-field>
+</Input>
+</Group>
+<Group labelreference="L145" drawlabel="true">
+<Input>
+<Text-field style="Text" layout="Normal"><Font size="16">Maple minimal polynomial</Font></Text-field>
+<Text-field style="Text" layout="Normal"></Text-field>
+</Input>
+</Group>
+<Group labelreference="L254" drawlabel="true">
+<Input>
+<Text-field style="Text" layout="Normal"> <Font bold="true" italic="true" size="14">doesn't exist in Givaro::Modular Package</Font></Text-field>
+</Input>
+</Group>
+<Group labelreference="L136" drawlabel="true">
+<Input>
+<Text-field style="Text" layout="Normal"></Text-field>
+<Text-field style="Text" layout="Normal"><Font size="16">LinBox minimal polynomial</Font></Text-field>
+<Text-field style="Text" layout="Normal"></Text-field>
+</Input>
+</Group>
+<Group labelreference="L166" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">lbMinpoly(p,A,'x');</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtc0dGJTYjUTFjb252ZXJzaW9ufnRpbWU6RigtSSNtb0dGJTYzUSIsRigvJSVmb3JtR1EmaW5maXhGKC8lJmZlbmNlR1EmZmFsc2VGKC8lKnNlcGFyYXRvckdRJXRydWVGKC8lJ2xzcGFjZUdRJDBlbUYoLyUncnNwYWNlR1EzdmVyeXRoaWNrbWF0aHNwYWNlRigvJSlzdHJldGNoeUdGOS8lKnN5bW1ldHJpY0dGOS8lKG1heHNpemVHUSlpbmZpbml0eUYoLyUobWluc2l6ZUdRIjFGKC8lKGxhcmdlb3BHRjkvJS5tb3ZhY [...]
+</Output>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNl9mbi1GJDYlLUkjbW5HRiU2OVEiNUYoLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRigvJSVzaXplR1EjMTJGKC8lJWJvbGRHUSZmYWxzZUYoLyUnaXRhbGljR0Y6LyUqdW5kZXJsaW5lR0Y6LyUqc3Vic2NyaXB0R0Y6LyUsc3VwZXJzY3JpcHRHRjovJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRigvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYoLyUnb3BhcXVlR0Y6LyUrZXhlY3V0YWJsZUdGOi8lKXJlYWRvbmx5R [...]
+</Output>
+</Group>
+<Group labelreference="L143" drawlabel="true">
+<Input>
+<Text-field style="Text" layout="Normal"></Text-field>
+<Text-field style="Text" layout="Normal"><Font size="16">Timing </Font></Text-field>
+<Text-field style="Text" layout="Normal"></Text-field>
+</Input>
+</Group>
+<Group labelreference="L160" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">time(lbMinpoly(p,A,'x'));</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtc0dGJTYjUTFjb252ZXJzaW9ufnRpbWU6RigtSSNtb0dGJTYzUSIsRigvJSVmb3JtR1EmaW5maXhGKC8lJmZlbmNlR1EmZmFsc2VGKC8lKnNlcGFyYXRvckdRJXRydWVGKC8lJ2xzcGFjZUdRJDBlbUYoLyUncnNwYWNlR1EzdmVyeXRoaWNrbWF0aHNwYWNlRigvJSlzdHJldGNoeUdGOS8lKnN5bW1ldHJpY0dGOS8lKG1heHNpemVHUSlpbmZpbml0eUYoLyUobWluc2l6ZUdRIjFGKC8lKGxhcmdlb3BHRjkvJS5tb3ZhY [...]
+</Output>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSNtbkc2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGKDY5USYwLjcwNkYoLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRigvJSVzaXplR1EjMTJGKC8lJWJvbGRHUSZmYWxzZUYoLyUnaXRhbGljR0Y1LyUqdW5kZXJsaW5lR0Y1LyUqc3Vic2NyaXB0R0Y1LyUsc3VwZXJzY3JpcHRHRjUvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRigvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYoLyUnb3BhcXVlR0Y1LyUrZXhlY3V0YWJsZUdGNS8lKXJlYWRvbmx5R1EldHJ1ZUYoLyUpY29tc [...]
+</Output>
+</Group>
+<Group labelreference="L264" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal"></Text-field>
+</Input>
+</Group>
+</Section>
+<Section collapsed="true" MultipleChoiceAnswerIndex="-1" MultipleChoiceRandomizeChoices="false" TrueFalseAnswerIndex="-1" EssayAnswerRows="5" EssayAnswerColumns="60"><Title>
+<Text-field style="Heading 3" layout="Heading 3">Characteristic Polynomial</Text-field></Title>
+<Text-field style="Text" layout="Normal"></Text-field>
+<Group labelreference="L348" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">restart():with(LinBox):with(LinearAlgebra):</Text-field>
+</Input>
+</Group>
+<Group labelreference="L267" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">n:=500;p:=17;gen:=rand(0..p-1);</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtaUdGJTY5USJuRigvJSdmYW1pbHlHUTBUaW1lc35OZXd+Um9tYW5GKC8lJXNpemVHUSMxMkYoLyUlYm9sZEdRJmZhbHNlRigvJSdpdGFsaWNHUSV0cnVlRigvJSp1bmRlcmxpbmVHRjgvJSpzdWJzY3JpcHRHRjgvJSxzdXBlcnNjcmlwdEdGOC8lK2ZvcmVncm91bmRHUSpbMCwwLDI1NV1GKC8lK2JhY2tncm91bmRHUS5bMjU1LDI1NSwyNTVdRigvJSdvcGFxdWVHRjgvJStleGVjdXRhYmxlR0Y4LyUpcmVhZG9ubHlHR [...]
+</Output>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtaUdGJTY5USJwRigvJSdmYW1pbHlHUTBUaW1lc35OZXd+Um9tYW5GKC8lJXNpemVHUSMxMkYoLyUlYm9sZEdRJmZhbHNlRigvJSdpdGFsaWNHUSV0cnVlRigvJSp1bmRlcmxpbmVHRjgvJSpzdWJzY3JpcHRHRjgvJSxzdXBlcnNjcmlwdEdGOC8lK2ZvcmVncm91bmRHUSpbMCwwLDI1NV1GKC8lK2JhY2tncm91bmRHUS5bMjU1LDI1NSwyNTVdRigvJSdvcGFxdWVHRjgvJStleGVjdXRhYmxlR0Y4LyUpcmVhZG9ubHlHR [...]
+</Output>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtaUdGJTY5USRnZW5GKC8lJ2ZhbWlseUdRMFRpbWVzfk5ld35Sb21hbkYoLyUlc2l6ZUdRIzEyRigvJSVib2xkR1EmZmFsc2VGKC8lJ2l0YWxpY0dRJXRydWVGKC8lKnVuZGVybGluZUdGOC8lKnN1YnNjcmlwdEdGOC8lLHN1cGVyc2NyaXB0R0Y4LyUrZm9yZWdyb3VuZEdRKlswLDAsMjU1XUYoLyUrYmFja2dyb3VuZEdRLlsyNTUsMjU1LDI1NV1GKC8lJ29wYXF1ZUdGOC8lK2V4ZWN1dGFibGVHRjgvJSlyZWFkb25se [...]
+</Output>
+</Group>
+<Group labelreference="L266" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">A:=Matrix(n,gen,datatype=integer[4]);</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzYlLUkjbWlHRiQ2OVEiQUYnLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRicvJSVzaXplR1EjMTJGJy8lJWJvbGRHUSZmYWxzZUYnLyUnaXRhbGljR1EldHJ1ZUYnLyUqdW5kZXJsaW5lR0Y3LyUqc3Vic2NyaXB0R0Y3LyUsc3VwZXJzY3JpcHRHRjcvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRicvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYnLyUnb3BhcXVlR0Y3LyUrZXhlY3V0YWJsZUdGNy8lKXJlYWRvbmx5R0Y6L [...]
+</Output>
+</Group>
+<Group labelreference="L135" drawlabel="true">
+<Input>
+<Text-field style="Text" layout="Normal"></Text-field>
+</Input>
+</Group>
+<Group labelreference="L119" drawlabel="true">
+<Input>
+<Text-field style="Text" layout="Normal"><Font size="16">Maple Characteristic polynomial</Font></Text-field>
+<Text-field style="Text" layout="Normal"></Text-field>
+</Input>
+</Group>
+<Group labelreference="L269" drawlabel="true">
+<Input>
+<Text-field style="Text" bold="true" italic="true" size="14" layout="Normal"><Font italic="true" bold="true" size="14">doesn't exist in Givaro::Modular package</Font></Text-field>
+</Input>
+</Group>
+<Group labelreference="L126" drawlabel="true">
+<Input>
+<Text-field style="Text" layout="Normal"></Text-field>
+<Text-field style="Text" layout="Normal"><Font size="16">LinBox Characteristic polynomial</Font></Text-field>
+<Text-field style="Text" layout="Normal"></Text-field>
+</Input>
+</Group>
+<Group labelreference="L154" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">lbCharpoly(p,A,'x');</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtc0dGJTYjUTFjb252ZXJzaW9ufnRpbWU6RigtSSNtb0dGJTYzUSIsRigvJSVmb3JtR1EmaW5maXhGKC8lJmZlbmNlR1EmZmFsc2VGKC8lKnNlcGFyYXRvckdRJXRydWVGKC8lJ2xzcGFjZUdRJDBlbUYoLyUncnNwYWNlR1EzdmVyeXRoaWNrbWF0aHNwYWNlRigvJSlzdHJldGNoeUdGOS8lKnN5bW1ldHJpY0dGOS8lKG1heHNpemVHUSlpbmZpbml0eUYoLyUobWluc2l6ZUdRIjFGKC8lKGxhcmdlb3BHRjkvJS5tb3ZhY [...]
+</Output>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNl1nbi1GJDYlLUkjbW5HRiU2OVEiN0YoLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRigvJSVzaXplR1EjMTJGKC8lJWJvbGRHUSZmYWxzZUYoLyUnaXRhbGljR0Y6LyUqdW5kZXJsaW5lR0Y6LyUqc3Vic2NyaXB0R0Y6LyUsc3VwZXJzY3JpcHRHRjovJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRigvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYoLyUnb3BhcXVlR0Y6LyUrZXhlY3V0YWJsZUdGOi8lKXJlYWRvbmx5R [...]
+</Output>
+</Group>
+<Group labelreference="L144" drawlabel="true">
+<Input>
+<Text-field style="Text" layout="Normal"></Text-field>
+<Text-field style="Text" layout="Normal"><Font size="16">Timing</Font></Text-field>
+<Text-field style="Text" layout="Normal"></Text-field>
+</Input>
+</Group>
+<Group labelreference="L139" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">time(lbCharpoly(p,A,'x'));</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtc0dGJTYjUTFjb252ZXJzaW9ufnRpbWU6RigtSSNtb0dGJTYzUSIsRigvJSVmb3JtR1EmaW5maXhGKC8lJmZlbmNlR1EmZmFsc2VGKC8lKnNlcGFyYXRvckdRJXRydWVGKC8lJ2xzcGFjZUdRJDBlbUYoLyUncnNwYWNlR1EzdmVyeXRoaWNrbWF0aHNwYWNlRigvJSlzdHJldGNoeUdGOS8lKnN5bW1ldHJpY0dGOS8lKG1heHNpemVHUSlpbmZpbml0eUYoLyUobWluc2l6ZUdRIjFGKC8lKGxhcmdlb3BHRjkvJS5tb3ZhY [...]
+</Output>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSNtbkc2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGKDY5USYwLjY1N0YoLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRigvJSVzaXplR1EjMTJGKC8lJWJvbGRHUSZmYWxzZUYoLyUnaXRhbGljR0Y1LyUqdW5kZXJsaW5lR0Y1LyUqc3Vic2NyaXB0R0Y1LyUsc3VwZXJzY3JpcHRHRjUvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRigvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYoLyUnb3BhcXVlR0Y1LyUrZXhlY3V0YWJsZUdGNS8lKXJlYWRvbmx5R1EldHJ1ZUYoLyUpY29tc [...]
+</Output>
+</Group>
+<Group labelreference="L270" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal"></Text-field>
+</Input>
+</Group>
+</Section>
+<Section collapsed="true" MultipleChoiceAnswerIndex="-1" MultipleChoiceRandomizeChoices="false" TrueFalseAnswerIndex="-1" EssayAnswerRows="5" EssayAnswerColumns="60"><Title>
+<Text-field style="Heading 3" layout="Heading 3">Linear System Solving</Text-field></Title>
+<Text-field style="Text" layout="Normal"></Text-field>
+<Group labelreference="L349" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">restart():with(LinBox):with(LinearAlgebra):</Text-field>
+</Input>
+</Group>
+<Group labelreference="L272" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">n:=500;p:=17;gen:=rand(0..p-1);</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtaUdGJTY5USJuRigvJSdmYW1pbHlHUTBUaW1lc35OZXd+Um9tYW5GKC8lJXNpemVHUSMxMkYoLyUlYm9sZEdRJmZhbHNlRigvJSdpdGFsaWNHUSV0cnVlRigvJSp1bmRlcmxpbmVHRjgvJSpzdWJzY3JpcHRHRjgvJSxzdXBlcnNjcmlwdEdGOC8lK2ZvcmVncm91bmRHUSpbMCwwLDI1NV1GKC8lK2JhY2tncm91bmRHUS5bMjU1LDI1NSwyNTVdRigvJSdvcGFxdWVHRjgvJStleGVjdXRhYmxlR0Y4LyUpcmVhZG9ubHlHR [...]
+</Output>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtaUdGJTY5USJwRigvJSdmYW1pbHlHUTBUaW1lc35OZXd+Um9tYW5GKC8lJXNpemVHUSMxMkYoLyUlYm9sZEdRJmZhbHNlRigvJSdpdGFsaWNHUSV0cnVlRigvJSp1bmRlcmxpbmVHRjgvJSpzdWJzY3JpcHRHRjgvJSxzdXBlcnNjcmlwdEdGOC8lK2ZvcmVncm91bmRHUSpbMCwwLDI1NV1GKC8lK2JhY2tncm91bmRHUS5bMjU1LDI1NSwyNTVdRigvJSdvcGFxdWVHRjgvJStleGVjdXRhYmxlR0Y4LyUpcmVhZG9ubHlHR [...]
+</Output>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtaUdGJTY5USRnZW5GKC8lJ2ZhbWlseUdRMFRpbWVzfk5ld35Sb21hbkYoLyUlc2l6ZUdRIzEyRigvJSVib2xkR1EmZmFsc2VGKC8lJ2l0YWxpY0dRJXRydWVGKC8lKnVuZGVybGluZUdGOC8lKnN1YnNjcmlwdEdGOC8lLHN1cGVyc2NyaXB0R0Y4LyUrZm9yZWdyb3VuZEdRKlswLDAsMjU1XUYoLyUrYmFja2dyb3VuZEdRLlsyNTUsMjU1LDI1NV1GKC8lJ29wYXF1ZUdGOC8lK2V4ZWN1dGFibGVHRjgvJSlyZWFkb25se [...]
+</Output>
+</Group>
+<Group labelreference="L271" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">A:=Matrix(n,gen,datatype=integer[4]);b:=Vector(n,gen,datatype=integer[4]);</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzYlLUkjbWlHRiQ2OVEiQUYnLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRicvJSVzaXplR1EjMTJGJy8lJWJvbGRHUSZmYWxzZUYnLyUnaXRhbGljR1EldHJ1ZUYnLyUqdW5kZXJsaW5lR0Y3LyUqc3Vic2NyaXB0R0Y3LyUsc3VwZXJzY3JpcHRHRjcvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRicvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYnLyUnb3BhcXVlR0Y3LyUrZXhlY3V0YWJsZUdGNy8lKXJlYWRvbmx5R0Y6L [...]
+</Output>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzYlLUkjbWlHRiQ2OVEiYkYnLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRicvJSVzaXplR1EjMTJGJy8lJWJvbGRHUSZmYWxzZUYnLyUnaXRhbGljR1EldHJ1ZUYnLyUqdW5kZXJsaW5lR0Y3LyUqc3Vic2NyaXB0R0Y3LyUsc3VwZXJzY3JpcHRHRjcvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRicvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYnLyUnb3BhcXVlR0Y3LyUrZXhlY3V0YWJsZUdGNy8lKXJlYWRvbmx5R0Y6L [...]
+</Output>
+</Group>
+<Group labelreference="L129" drawlabel="true">
+<Input>
+<Text-field style="Text" layout="Normal"></Text-field>
+</Input>
+</Group>
+<Group labelreference="L133" drawlabel="true">
+<Input>
+<Text-field style="Text" layout="Normal"><Font size="16">Maple linear system solving</Font></Text-field>
+<Text-field style="Text" layout="Normal"></Text-field>
+</Input>
+</Group>
+<Group labelreference="L273" drawlabel="true">
+<Input>
+<Text-field style="Text" bold="true" italic="true" size="14" layout="Normal"><Font italic="true" bold="true" size="14">no native solution available</Font></Text-field>
+</Input>
+</Group>
+<Group labelreference="L163" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">B:=Modular:-Mod(p,A,integer[4]);b1:=Modular:-Mod(p,b,integer[4]);</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzYlLUkjbWlHRiQ2OVEiQkYnLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRicvJSVzaXplR1EjMTJGJy8lJWJvbGRHUSZmYWxzZUYnLyUnaXRhbGljR1EldHJ1ZUYnLyUqdW5kZXJsaW5lR0Y3LyUqc3Vic2NyaXB0R0Y3LyUsc3VwZXJzY3JpcHRHRjcvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRicvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYnLyUnb3BhcXVlR0Y3LyUrZXhlY3V0YWJsZUdGNy8lKXJlYWRvbmx5R0Y6L [...]
+</Output>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzYlLUkjbWlHRiQ2OVEjYjFGJy8lJ2ZhbWlseUdRMFRpbWVzfk5ld35Sb21hbkYnLyUlc2l6ZUdRIzEyRicvJSVib2xkR1EmZmFsc2VGJy8lJ2l0YWxpY0dRJXRydWVGJy8lKnVuZGVybGluZUdGNy8lKnN1YnNjcmlwdEdGNy8lLHN1cGVyc2NyaXB0R0Y3LyUrZm9yZWdyb3VuZEdRKlswLDAsMjU1XUYnLyUrYmFja2dyb3VuZEdRLlsyNTUsMjU1LDI1NV1GJy8lJ29wYXF1ZUdGNy8lK2V4ZWN1dGFibGVHRjcvJSlyZWFkb25seUdGO [...]
+</Output>
+</Group>
+<Group labelreference="L274" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">pv:=Vector(n-1):Modular:-LUDecomposition(p,B,pv,0);</Text-field>
+</Input>
+</Group>
+<Group labelreference="L275" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">Modular:-LUApply(p,B,pv,b1);b1[1..10];</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzYlLUkjbW9HRiQ2M1EiW0YnLyUlZm9ybUdRJ3ByZWZpeEYnLyUmZmVuY2VHUSV0cnVlRicvJSpzZXBhcmF0b3JHUSZmYWxzZUYnLyUnbHNwYWNlR1EudGhpbm1hdGhzcGFjZUYnLyUncnNwYWNlR0Y6LyUpc3RyZXRjaHlHRjQvJSpzeW1tZXRyaWNHRjcvJShtYXhzaXplR1EpaW5maW5pdHlGJy8lKG1pbnNpemVHUSIxRicvJShsYXJnZW9wR0Y3LyUubW92YWJsZWxpbWl0c0dGNy8lJ2FjY2VudEdGNy8lMGZvbnRfc3R5bGVfbmFtZ [...]
+</Output>
+</Group>
+<Group labelreference="L147" drawlabel="true">
+<Input>
+<Text-field style="Text" layout="Normal"></Text-field>
+<Text-field style="Text" size="16" layout="Normal"><Font size="16">LinBox linear system solving</Font></Text-field>
+<Text-field style="Text" layout="Normal"></Text-field>
+</Input>
+</Group>
+<Group labelreference="L161" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">x:=lbSolve(p,A,b);x[1..10];</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtc0dGJTYjUTFjb252ZXJzaW9ufnRpbWU6RigtSSNtb0dGJTYzUSIsRigvJSVmb3JtR1EmaW5maXhGKC8lJmZlbmNlR1EmZmFsc2VGKC8lKnNlcGFyYXRvckdRJXRydWVGKC8lJ2xzcGFjZUdRJDBlbUYoLyUncnNwYWNlR1EzdmVyeXRoaWNrbWF0aHNwYWNlRigvJSlzdHJldGNoeUdGOS8lKnN5bW1ldHJpY0dGOS8lKG1heHNpemVHUSlpbmZpbml0eUYoLyUobWluc2l6ZUdRIjFGKC8lKGxhcmdlb3BHRjkvJS5tb3ZhY [...]
+</Output>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzYlLUkjbWlHRiQ2OVEieEYnLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRicvJSVzaXplR1EjMTJGJy8lJWJvbGRHUSZmYWxzZUYnLyUnaXRhbGljR1EldHJ1ZUYnLyUqdW5kZXJsaW5lR0Y3LyUqc3Vic2NyaXB0R0Y3LyUsc3VwZXJzY3JpcHRHRjcvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRicvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYnLyUnb3BhcXVlR0Y3LyUrZXhlY3V0YWJsZUdGNy8lKXJlYWRvbmx5R0Y6L [...]
+</Output>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzYlLUkjbW9HRiQ2M1EiW0YnLyUlZm9ybUdRJ3ByZWZpeEYnLyUmZmVuY2VHUSV0cnVlRicvJSpzZXBhcmF0b3JHUSZmYWxzZUYnLyUnbHNwYWNlR1EudGhpbm1hdGhzcGFjZUYnLyUncnNwYWNlR0Y6LyUpc3RyZXRjaHlHRjQvJSpzeW1tZXRyaWNHRjcvJShtYXhzaXplR1EpaW5maW5pdHlGJy8lKG1pbnNpemVHUSIxRicvJShsYXJnZW9wR0Y3LyUubW92YWJsZWxpbWl0c0dGNy8lJ2FjY2VudEdGNy8lMGZvbnRfc3R5bGVfbmFtZ [...]
+</Output>
+</Group>
+<Group labelreference="L155" drawlabel="true">
+<Input>
+<Text-field style="Text" layout="Normal"></Text-field>
+<Text-field style="Text" layout="Normal"><Font size="16">Timing comparison</Font></Text-field>
+<Text-field style="Text" layout="Normal"></Text-field>
+</Input>
+</Group>
+<Group labelreference="L282" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">B:=Modular:-Mod(p,A,integer[4]):b1:=Modular:-Mod(p,b,integer[4]):pv:=Vector(n-1):</Text-field>
+</Input>
+</Group>
+<Group labelreference="L281" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">t1:=time(Modular:-LUDecomposition(p,B,pv,0))+time(Modular:-LUApply(p,B,pv,b1));</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtaUdGJTY5USN0MUYoLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRigvJSVzaXplR1EjMTJGKC8lJWJvbGRHUSZmYWxzZUYoLyUnaXRhbGljR1EldHJ1ZUYoLyUqdW5kZXJsaW5lR0Y4LyUqc3Vic2NyaXB0R0Y4LyUsc3VwZXJzY3JpcHRHRjgvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRigvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYoLyUnb3BhcXVlR0Y4LyUrZXhlY3V0YWJsZUdGOC8lKXJlYWRvbmx5R [...]
+</Output>
+</Group>
+<Group labelreference="L276" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">t2:=time(lbSolve(p,A,b));</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtc0dGJTYjUTFjb252ZXJzaW9ufnRpbWU6RigtSSNtb0dGJTYzUSIsRigvJSVmb3JtR1EmaW5maXhGKC8lJmZlbmNlR1EmZmFsc2VGKC8lKnNlcGFyYXRvckdRJXRydWVGKC8lJ2xzcGFjZUdRJDBlbUYoLyUncnNwYWNlR1EzdmVyeXRoaWNrbWF0aHNwYWNlRigvJSlzdHJldGNoeUdGOS8lKnN5bW1ldHJpY0dGOS8lKG1heHNpemVHUSlpbmZpbml0eUYoLyUobWluc2l6ZUdRIjFGKC8lKGxhcmdlb3BHRjkvJS5tb3ZhY [...]
+</Output>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtaUdGJTY5USN0MkYoLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRigvJSVzaXplR1EjMTJGKC8lJWJvbGRHUSZmYWxzZUYoLyUnaXRhbGljR1EldHJ1ZUYoLyUqdW5kZXJsaW5lR0Y4LyUqc3Vic2NyaXB0R0Y4LyUsc3VwZXJzY3JpcHRHRjgvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRigvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYoLyUnb3BhcXVlR0Y4LyUrZXhlY3V0YWJsZUdGOC8lKXJlYWRvbmx5R [...]
+</Output>
+</Group>
+<Group labelreference="L277" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">t1/t2;</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSNtbkc2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGKDY5US0wLjU5MzEwMzQ0ODNGKC8lJ2ZhbWlseUdRMFRpbWVzfk5ld35Sb21hbkYoLyUlc2l6ZUdRIzEyRigvJSVib2xkR1EmZmFsc2VGKC8lJ2l0YWxpY0dGNS8lKnVuZGVybGluZUdGNS8lKnN1YnNjcmlwdEdGNS8lLHN1cGVyc2NyaXB0R0Y1LyUrZm9yZWdyb3VuZEdRKlswLDAsMjU1XUYoLyUrYmFja2dyb3VuZEdRLlsyNTUsMjU1LDI1NV1GKC8lJ29wYXF1ZUdGNS8lK2V4ZWN1dGFibGVHRjUvJSlyZWFkb25seUdRJXRydWVGK [...]
+</Output>
+</Group>
+<Group labelreference="L350" drawlabel="true">
+<Input>
+<Text-field style="Text" size="16" layout="Normal"><Font size="16">Singular system</Font></Text-field>
+<Text-field style="Text" size="16" layout="Normal"></Text-field>
+</Input>
+</Group>
+<Group labelreference="L352" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">n:=100;</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtaUdGJTY5USJuRigvJSdmYW1pbHlHUTBUaW1lc35OZXd+Um9tYW5GKC8lJXNpemVHUSMxMkYoLyUlYm9sZEdRJmZhbHNlRigvJSdpdGFsaWNHUSV0cnVlRigvJSp1bmRlcmxpbmVHRjgvJSpzdWJzY3JpcHRHRjgvJSxzdXBlcnNjcmlwdEdGOC8lK2ZvcmVncm91bmRHUSpbMCwwLDI1NV1GKC8lK2JhY2tncm91bmRHUS5bMjU1LDI1NSwyNTVdRigvJSdvcGFxdWVHRjgvJStleGVjdXRhYmxlR0Y4LyUpcmVhZG9ubHlHR [...]
+</Output>
+</Group>
+<Group labelreference="L353" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">A:=Matrix(n,n,gen,datatype=integer[4]):c:=Vector(n,gen,datatype=integer[4]):c[n]:=0:</Text-field>
+</Input>
+</Group>
+<Group labelreference="L354" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">A[1..n,n]:=A.c;</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzYlLUklbXN1YkdGJDYmLUkjbWlHRiQ2OVEiQUYnLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRicvJSVzaXplR1EjMTJGJy8lJWJvbGRHUSZmYWxzZUYnLyUnaXRhbGljR1EldHJ1ZUYnLyUqdW5kZXJsaW5lR0Y6LyUqc3Vic2NyaXB0R0Y6LyUsc3VwZXJzY3JpcHRHRjovJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRicvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYnLyUnb3BhcXVlR0Y6LyUrZXhlY3V0YWJsZUdGOi8lK [...]
+</Output>
+</Group>
+<Group labelreference="L355" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">lbRank(A);</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtc0dGJTYjUTFjb252ZXJzaW9ufnRpbWU6RigtSSNtb0dGJTYzUSIsRigvJSVmb3JtR1EmaW5maXhGKC8lJmZlbmNlR1EmZmFsc2VGKC8lKnNlcGFyYXRvckdRJXRydWVGKC8lJ2xzcGFjZUdRJDBlbUYoLyUncnNwYWNlR1EzdmVyeXRoaWNrbWF0aHNwYWNlRigvJSlzdHJldGNoeUdGOS8lKnN5bW1ldHJpY0dGOS8lKG1heHNpemVHUSlpbmZpbml0eUYoLyUobWluc2l6ZUdRIjFGKC8lKGxhcmdlb3BHRjkvJS5tb3ZhY [...]
+</Output>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSNtbkc2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGKDY5USM5OUYoLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRigvJSVzaXplR1EjMTJGKC8lJWJvbGRHUSZmYWxzZUYoLyUnaXRhbGljR0Y1LyUqdW5kZXJsaW5lR0Y1LyUqc3Vic2NyaXB0R0Y1LyUsc3VwZXJzY3JpcHRHRjUvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRigvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYoLyUnb3BhcXVlR0Y1LyUrZXhlY3V0YWJsZUdGNS8lKXJlYWRvbmx5R1EldHJ1ZUYoLyUpY29tcG9zZ [...]
+</Output>
+</Group>
+<Group labelreference="L356" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">pv:=Vector(n-1):Modular:-LUDecomposition(p,A,pv,0);</Text-field>
+</Input>
+<Output>
+<Text-field style="Error" layout="Error">Error, (in LinearAlgebra:-Modular:-LUDecomposition) matrix is singular</Text-field>
+</Output>
+</Group>
+<Group labelreference="L358" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">x:=lbSolve(p,A,c):x[1..10];</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtc0dGJTYjUTFjb252ZXJzaW9ufnRpbWU6RigtSSNtb0dGJTYzUSIsRigvJSVmb3JtR1EmaW5maXhGKC8lJmZlbmNlR1EmZmFsc2VGKC8lKnNlcGFyYXRvckdRJXRydWVGKC8lJ2xzcGFjZUdRJDBlbUYoLyUncnNwYWNlR1EzdmVyeXRoaWNrbWF0aHNwYWNlRigvJSlzdHJldGNoeUdGOS8lKnN5bW1ldHJpY0dGOS8lKG1heHNpemVHUSlpbmZpbml0eUYoLyUobWluc2l6ZUdRIjFGKC8lKGxhcmdlb3BHRjkvJS5tb3ZhY [...]
+</Output>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzYlLUkjbW9HRiQ2M1EiW0YnLyUlZm9ybUdRJ3ByZWZpeEYnLyUmZmVuY2VHUSV0cnVlRicvJSpzZXBhcmF0b3JHUSZmYWxzZUYnLyUnbHNwYWNlR1EudGhpbm1hdGhzcGFjZUYnLyUncnNwYWNlR0Y6LyUpc3RyZXRjaHlHRjQvJSpzeW1tZXRyaWNHRjcvJShtYXhzaXplR1EpaW5maW5pdHlGJy8lKG1pbnNpemVHUSIxRicvJShsYXJnZW9wR0Y3LyUubW92YWJsZWxpbWl0c0dGNy8lJ2FjY2VudEdGNy8lMGZvbnRfc3R5bGVfbmFtZ [...]
+</Output>
+</Group>
+<Group labelreference="L361" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">Norm(map(modp,A.x-c,p));</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSNtbkc2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGKDY5USIwRigvJSdmYW1pbHlHUTBUaW1lc35OZXd+Um9tYW5GKC8lJXNpemVHUSMxMkYoLyUlYm9sZEdRJmZhbHNlRigvJSdpdGFsaWNHRjUvJSp1bmRlcmxpbmVHRjUvJSpzdWJzY3JpcHRHRjUvJSxzdXBlcnNjcmlwdEdGNS8lK2ZvcmVncm91bmRHUSpbMCwwLDI1NV1GKC8lK2JhY2tncm91bmRHUS5bMjU1LDI1NSwyNTVdRigvJSdvcGFxdWVHRjUvJStleGVjdXRhYmxlR0Y1LyUpcmVhZG9ubHlHUSV0cnVlRigvJSljb21wb3NlZ [...]
+</Output>
+</Group>
+<Group labelreference="L439" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal"><Equation executable="true" style="2D Input" input-equation="Typesetting:-mrow(Typesetting:-mi(""))">LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzYjLUkjbWlHRiQ2OVEhRicvJSdmYW1pbHlHUTBUaW1lc35OZXd+Um9tYW5GJy8lJXNpemVHUSMxMkYnLyUlYm9sZEdRJmZhbHNlRicvJSdpdGFsaWNHUSV0cnVlRicvJSp1bmRlcmxpbmVHRjcvJSpzdWJzY3JpcHRHRjcvJSxzdXBlcnNjcmlwdEdGNy8lK2ZvcmVncm91bmRHUShbMCwwLDBdRicvJStiYWNrZ3JvdW5kR1EuWzI1NS [...]
+</Input>
+</Group>
+<Group labelreference="L351" drawlabel="true">
+<Input>
+<Text-field style="Text" layout="Normal"></Text-field>
+</Input>
+</Group>
+</Section>
+</Section>
+<Section collapsed="true" MultipleChoiceAnswerIndex="-1" MultipleChoiceRandomizeChoices="false" TrueFalseAnswerIndex="-1" EssayAnswerRows="5" EssayAnswerColumns="60"><Title>
+<Text-field style="Heading 2" layout="Heading 2">Benefits in practice</Text-field></Title>
+<Text-field style="Text" layout="Normal"></Text-field>
+<Text-field style="Text" size="14" layout="Normal"><Font size="14">Sometime numerical computation is not satisfying and exact computation becomes mandatory</Font></Text-field>
+<Text-field style="Text" size="14" layout="Normal"></Text-field>
+<Group labelreference="L406" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">with(LinearAlgebra):</Text-field>
+</Input>
+</Group>
+<Section collapsed="true" MultipleChoiceAnswerIndex="-1" MultipleChoiceRandomizeChoices="false" TrueFalseAnswerIndex="-1" EssayAnswerRows="5" EssayAnswerColumns="60"><Title>
+<Text-field style="Heading 3" layout="Heading 3">Very bad conditionned matrix</Text-field></Title>
+<Text-field style="Text" layout="Normal"></Text-field>
+<Group labelreference="L398" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">Moler:=proc(n) local i,j,Moler;
+ Moler:=Matrix(n);
+ for i from 1 to n do
+ for j from 1 to (i-1) do
+ Moler[i,j]:=j-2;
+ end do;
+ Moler[i,i]:=i;
+ for j from (i+1) to n do
+ Moler[i,j]:=i-2;
+ end do;
+ end do;
+ return Moler; end proc:</Text-field>
+</Input>
+</Group>
+<Group labelreference="L400" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">Redheffer:=proc(n) local i,j,Redheffer;
+ Redheffer:=Matrix(n);
+ for i from 1 to n do
+ Redheffer[i,1]:=1;
+ for j from 2 to n do
+ if (j mod i = 0) then
+ Redheffer[i,j]:=1;
+ else
+ Redheffer[i,j]:=0;
+ end if;
+ end do;
+ end do:
+ return Redheffer; end proc:</Text-field>
+</Input>
+</Group>
+<Group labelreference="L399" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">Moler(10),Redheffer(10);</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzYlLUYjNiUtSSNtb0dGJDYzUSJbRicvJSVmb3JtR1EncHJlZml4RicvJSZmZW5jZUdRJXRydWVGJy8lKnNlcGFyYXRvckdRJmZhbHNlRicvJSdsc3BhY2VHUS50aGlubWF0aHNwYWNlRicvJSdyc3BhY2VHRjwvJSlzdHJldGNoeUdGNi8lKnN5bW1ldHJpY0dGOS8lKG1heHNpemVHUSlpbmZpbml0eUYnLyUobWluc2l6ZUdRIjFGJy8lKGxhcmdlb3BHRjkvJS5tb3ZhYmxlbGltaXRzR0Y5LyUnYWNjZW50R0Y5LyUwZm9udF9zdHlsZ [...]
+</Output>
+</Group>
+<Group labelreference="L404" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">n:=200;</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtaUdGJTY5USJuRigvJSdmYW1pbHlHUTBUaW1lc35OZXd+Um9tYW5GKC8lJXNpemVHUSMxMkYoLyUlYm9sZEdRJmZhbHNlRigvJSdpdGFsaWNHUSV0cnVlRigvJSp1bmRlcmxpbmVHRjgvJSpzdWJzY3JpcHRHRjgvJSxzdXBlcnNjcmlwdEdGOC8lK2ZvcmVncm91bmRHUSpbMCwwLDI1NV1GKC8lK2JhY2tncm91bmRHUS5bMjU1LDI1NSwyNTVdRigvJSdvcGFxdWVHRjgvJStleGVjdXRhYmxlR0Y4LyUpcmVhZG9ubHlHR [...]
+</Output>
+</Group>
+<Group labelreference="L405" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">M:=1.*Moler(n):R:=1.*Redheffer(n):MR:=M.R;</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzYlLUkjbWlHRiQ2OVEjTVJGJy8lJ2ZhbWlseUdRMFRpbWVzfk5ld35Sb21hbkYnLyUlc2l6ZUdRIzEyRicvJSVib2xkR1EmZmFsc2VGJy8lJ2l0YWxpY0dRJXRydWVGJy8lKnVuZGVybGluZUdGNy8lKnN1YnNjcmlwdEdGNy8lLHN1cGVyc2NyaXB0R0Y3LyUrZm9yZWdyb3VuZEdRKlswLDAsMjU1XUYnLyUrYmFja2dyb3VuZEdRLlsyNTUsMjU1LDI1NV1GJy8lJ29wYXF1ZUdGNy8lK2V4ZWN1dGFibGVHRjcvJSlyZWFkb25seUdGO [...]
+</Output>
+</Group>
+<Group labelreference="L422" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">ConditionNumber(M); ConditionNumber(R); ConditionNumber(MR);</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtbkdGJTY5USw4LjQ4MDEwODYwMUYoLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRigvJSVzaXplR1EjMTJGKC8lJWJvbGRHUSZmYWxzZUYoLyUnaXRhbGljR0Y4LyUqdW5kZXJsaW5lR0Y4LyUqc3Vic2NyaXB0R0Y4LyUsc3VwZXJzY3JpcHRHRjgvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRigvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYoLyUnb3BhcXVlR0Y4LyUrZXhlY3V0YWJsZUdGOC8lKXJlYWRvb [...]
+</Output>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSNtbkc2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGKDY5USwxMTI1MC4wMDAwMEYoLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRigvJSVzaXplR1EjMTJGKC8lJWJvbGRHUSZmYWxzZUYoLyUnaXRhbGljR0Y1LyUqdW5kZXJsaW5lR0Y1LyUqc3Vic2NyaXB0R0Y1LyUsc3VwZXJzY3JpcHRHRjUvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRigvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYoLyUnb3BhcXVlR0Y1LyUrZXhlY3V0YWJsZUdGNS8lKXJlYWRvbmx5R1EldHJ1ZUYoL [...]
+</Output>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtbkdGJTY5USwyLjUyNzg2NTk5MkYoLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRigvJSVzaXplR1EjMTJGKC8lJWJvbGRHUSZmYWxzZUYoLyUnaXRhbGljR0Y4LyUqdW5kZXJsaW5lR0Y4LyUqc3Vic2NyaXB0R0Y4LyUsc3VwZXJzY3JpcHRHRjgvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRigvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYoLyUnb3BhcXVlR0Y4LyUrZXhlY3V0YWJsZUdGOC8lKXJlYWRvb [...]
+</Output>
+</Group>
+<Group labelreference="L411" drawlabel="true">
+<Input>
+<Text-field style="Text" layout="Normal"></Text-field>
+<Text-field style="Text" italic="true" size="14" layout="Normal"><Font italic="true" size="14">Solving a linear system</Font></Text-field>
+<Text-field style="Text" layout="Normal"></Text-field>
+</Input>
+</Group>
+<Group labelreference="L402" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">b:=1.*Vector(n,rand(-1..1));</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzYlLUkjbWlHRiQ2OVEiYkYnLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRicvJSVzaXplR1EjMTJGJy8lJWJvbGRHUSZmYWxzZUYnLyUnaXRhbGljR1EldHJ1ZUYnLyUqdW5kZXJsaW5lR0Y3LyUqc3Vic2NyaXB0R0Y3LyUsc3VwZXJzY3JpcHRHRjcvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRicvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYnLyUnb3BhcXVlR0Y3LyUrZXhlY3V0YWJsZUdGNy8lKXJlYWRvbmx5R0Y6L [...]
+</Output>
+</Group>
+<Group labelreference="L403" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">Digits:=14;</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtaUdGJTY5USdEaWdpdHNGKC8lJ2ZhbWlseUdRMFRpbWVzfk5ld35Sb21hbkYoLyUlc2l6ZUdRIzEyRigvJSVib2xkR1EmZmFsc2VGKC8lJ2l0YWxpY0dRJXRydWVGKC8lKnVuZGVybGluZUdGOC8lKnN1YnNjcmlwdEdGOC8lLHN1cGVyc2NyaXB0R0Y4LyUrZm9yZWdyb3VuZEdRKlswLDAsMjU1XUYoLyUrYmFja2dyb3VuZEdRLlsyNTUsMjU1LDI1NV1GKC8lJ29wYXF1ZUdGOC8lK2V4ZWN1dGFibGVHRjgvJSlyZWFkb [...]
+</Output>
+</Group>
+<Group labelreference="L418" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">t:=time():x:=LinearSolve(MR,b,method=hybrid):time()-t;</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSNtbkc2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGKDY5USYwLjAwOUYoLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRigvJSVzaXplR1EjMTJGKC8lJWJvbGRHUSZmYWxzZUYoLyUnaXRhbGljR0Y1LyUqdW5kZXJsaW5lR0Y1LyUqc3Vic2NyaXB0R0Y1LyUsc3VwZXJzY3JpcHRHRjUvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRigvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYoLyUnb3BhcXVlR0Y1LyUrZXhlY3V0YWJsZUdGNS8lKXJlYWRvbmx5R1EldHJ1ZUYoLyUpY29tc [...]
+</Output>
+</Group>
+<Group labelreference="L416" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">Norm(MR.x-b);</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSNtbkc2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGKDY5UTQyMzcuMTE3MTg3NTAwMDAwMDAwRigvJSdmYW1pbHlHUTBUaW1lc35OZXd+Um9tYW5GKC8lJXNpemVHUSMxMkYoLyUlYm9sZEdRJmZhbHNlRigvJSdpdGFsaWNHRjUvJSp1bmRlcmxpbmVHRjUvJSpzdWJzY3JpcHRHRjUvJSxzdXBlcnNjcmlwdEdGNS8lK2ZvcmVncm91bmRHUSpbMCwwLDI1NV1GKC8lK2JhY2tncm91bmRHUS5bMjU1LDI1NSwyNTVdRigvJSdvcGFxdWVHRjUvJStleGVjdXRhYmxlR0Y1LyUpcmVhZG9ubHlHU [...]
+</Output>
+</Group>
+<Group labelreference="L421" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">A:=Matrix(MR,datatype=integer[4]);</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzYlLUkjbWlHRiQ2OVEiQUYnLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRicvJSVzaXplR1EjMTJGJy8lJWJvbGRHUSZmYWxzZUYnLyUnaXRhbGljR1EldHJ1ZUYnLyUqdW5kZXJsaW5lR0Y3LyUqc3Vic2NyaXB0R0Y3LyUsc3VwZXJzY3JpcHRHRjcvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRicvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYnLyUnb3BhcXVlR0Y3LyUrZXhlY3V0YWJsZUdGNy8lKXJlYWRvbmx5R0Y6L [...]
+</Output>
+</Group>
+<Group labelreference="L420" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">t:=time():y:=lbSolve(A,b):time()-t;</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtc0dGJTYjUTFjb252ZXJzaW9ufnRpbWU6RigtSSNtb0dGJTYzUSIsRigvJSVmb3JtR1EmaW5maXhGKC8lJmZlbmNlR1EmZmFsc2VGKC8lKnNlcGFyYXRvckdRJXRydWVGKC8lJ2xzcGFjZUdRJDBlbUYoLyUncnNwYWNlR1EzdmVyeXRoaWNrbWF0aHNwYWNlRigvJSlzdHJldGNoeUdGOS8lKnN5bW1ldHJpY0dGOS8lKG1heHNpemVHUSlpbmZpbml0eUYoLyUobWluc2l6ZUdRIjFGKC8lKGxhcmdlb3BHRjkvJS5tb3ZhY [...]
+</Output>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSNtbkc2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGKDY5USYwLjMwN0YoLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRigvJSVzaXplR1EjMTJGKC8lJWJvbGRHUSZmYWxzZUYoLyUnaXRhbGljR0Y1LyUqdW5kZXJsaW5lR0Y1LyUqc3Vic2NyaXB0R0Y1LyUsc3VwZXJzY3JpcHRHRjUvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRigvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYoLyUnb3BhcXVlR0Y1LyUrZXhlY3V0YWJsZUdGNS8lKXJlYWRvbmx5R1EldHJ1ZUYoLyUpY29tc [...]
+</Output>
+</Group>
+<Group labelreference="L417" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">Norm(A.y-b);</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSNtbkc2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGKDY5USMwLkYoLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRigvJSVzaXplR1EjMTJGKC8lJWJvbGRHUSZmYWxzZUYoLyUnaXRhbGljR0Y1LyUqdW5kZXJsaW5lR0Y1LyUqc3Vic2NyaXB0R0Y1LyUsc3VwZXJzY3JpcHRHRjUvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRigvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYoLyUnb3BhcXVlR0Y1LyUrZXhlY3V0YWJsZUdGNS8lKXJlYWRvbmx5R1EldHJ1ZUYoLyUpY29tcG9zZ [...]
+</Output>
+</Group>
+<Group labelreference="L413" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal"></Text-field>
+</Input>
+</Group>
+<Group labelreference="L414" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal"></Text-field>
+</Input>
+</Group>
+<Text-field style="Text" layout="Normal"></Text-field>
+<Text-field style="Text" size="14" layout="Normal"></Text-field>
+</Section>
+<Text-field style="Text" layout="Normal"></Text-field>
+<Section collapsed="true" MultipleChoiceAnswerIndex="-1" MultipleChoiceRandomizeChoices="false" TrueFalseAnswerIndex="-1" EssayAnswerRows="5" EssayAnswerColumns="60"><Title>
+<Text-field style="Heading 3" layout="Heading 3">High precision results</Text-field></Title>
+<Text-field style="Text" layout="Normal"></Text-field>
+<Group labelreference="L423" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">Tref:=ImportMatrix("tref200.dat",format=entries);</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzYlLUkjbWlHRiQ2OVElVHJlZkYnLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRicvJSVzaXplR1EjMTJGJy8lJWJvbGRHUSZmYWxzZUYnLyUnaXRhbGljR1EldHJ1ZUYnLyUqdW5kZXJsaW5lR0Y3LyUqc3Vic2NyaXB0R0Y3LyUsc3VwZXJzY3JpcHRHRjcvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRicvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYnLyUnb3BhcXVlR0Y3LyUrZXhlY3V0YWJsZUdGNy8lKXJlYWRvbmx5R [...]
+</Output>
+</Group>
+<Group labelreference="L424" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">b:=Vector(200,rand(-1..1),datatype=integer[4]);</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzYlLUkjbWlHRiQ2OVEiYkYnLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRicvJSVzaXplR1EjMTJGJy8lJWJvbGRHUSZmYWxzZUYnLyUnaXRhbGljR1EldHJ1ZUYnLyUqdW5kZXJsaW5lR0Y3LyUqc3Vic2NyaXB0R0Y3LyUsc3VwZXJzY3JpcHRHRjcvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRicvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYnLyUnb3BhcXVlR0Y3LyUrZXhlY3V0YWJsZUdGNy8lKXJlYWRvbmx5R0Y6L [...]
+</Output>
+</Group>
+<Group labelreference="L430" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">Digits:=14;</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtaUdGJTY5USdEaWdpdHNGKC8lJ2ZhbWlseUdRMFRpbWVzfk5ld35Sb21hbkYoLyUlc2l6ZUdRIzEyRigvJSVib2xkR1EmZmFsc2VGKC8lJ2l0YWxpY0dRJXRydWVGKC8lKnVuZGVybGluZUdGOC8lKnN1YnNjcmlwdEdGOC8lLHN1cGVyc2NyaXB0R0Y4LyUrZm9yZWdyb3VuZEdRKlswLDAsMjU1XUYoLyUrYmFja2dyb3VuZEdRLlsyNTUsMjU1LDI1NV1GKC8lJ29wYXF1ZUdGOC8lK2V4ZWN1dGFibGVHRjgvJSlyZWFkb [...]
+</Output>
+</Group>
+<Group labelreference="L425" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">t:=time():x:=LinearSolve(1.*Tref,1.*b):time()-t;</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSNtbkc2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGKDY5USYwLjA2NUYoLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRigvJSVzaXplR1EjMTJGKC8lJWJvbGRHUSZmYWxzZUYoLyUnaXRhbGljR0Y1LyUqdW5kZXJsaW5lR0Y1LyUqc3Vic2NyaXB0R0Y1LyUsc3VwZXJzY3JpcHRHRjUvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRigvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYoLyUnb3BhcXVlR0Y1LyUrZXhlY3V0YWJsZUdGNS8lKXJlYWRvbmx5R1EldHJ1ZUYoLyUpY29tc [...]
+</Output>
+</Group>
+<Group labelreference="L426" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">Norm(Tref.x-b);</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtbkdGJTY5UTQyLjMxNzMxMzQzNjQ2MDc1NzgyRigvJSdmYW1pbHlHUTBUaW1lc35OZXd+Um9tYW5GKC8lJXNpemVHUSMxMkYoLyUlYm9sZEdRJmZhbHNlRigvJSdpdGFsaWNHRjgvJSp1bmRlcmxpbmVHRjgvJSpzdWJzY3JpcHRHRjgvJSxzdXBlcnNjcmlwdEdGOC8lK2ZvcmVncm91bmRHUSpbMCwwLDI1NV1GKC8lK2JhY2tncm91bmRHUS5bMjU1LDI1NSwyNTVdRigvJSdvcGFxdWVHRjgvJStleGVjdXRhYmxlR0Y4L [...]
+</Output>
+</Group>
+<Group labelreference="L427" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">t:=time():y:=lbSolve(Tref,b):time()-t;</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtc0dGJTYjUTFjb252ZXJzaW9ufnRpbWU6RigtSSNtb0dGJTYzUSIsRigvJSVmb3JtR1EmaW5maXhGKC8lJmZlbmNlR1EmZmFsc2VGKC8lKnNlcGFyYXRvckdRJXRydWVGKC8lJ2xzcGFjZUdRJDBlbUYoLyUncnNwYWNlR1EzdmVyeXRoaWNrbWF0aHNwYWNlRigvJSlzdHJldGNoeUdGOS8lKnN5bW1ldHJpY0dGOS8lKG1heHNpemVHUSlpbmZpbml0eUYoLyUobWluc2l6ZUdRIjFGKC8lKGxhcmdlb3BHRjkvJS5tb3ZhY [...]
+</Output>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSNtbkc2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGKDY5USYwLjM3MkYoLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRigvJSVzaXplR1EjMTJGKC8lJWJvbGRHUSZmYWxzZUYoLyUnaXRhbGljR0Y1LyUqdW5kZXJsaW5lR0Y1LyUqc3Vic2NyaXB0R0Y1LyUsc3VwZXJzY3JpcHRHRjUvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRigvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYoLyUnb3BhcXVlR0Y1LyUrZXhlY3V0YWJsZUdGNS8lKXJlYWRvbmx5R1EldHJ1ZUYoLyUpY29tc [...]
+</Output>
+</Group>
+<Group labelreference="L428" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">Norm(Tref.y-b);</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSNtbkc2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGKDY5USIwRigvJSdmYW1pbHlHUTBUaW1lc35OZXd+Um9tYW5GKC8lJXNpemVHUSMxMkYoLyUlYm9sZEdRJmZhbHNlRigvJSdpdGFsaWNHRjUvJSp1bmRlcmxpbmVHRjUvJSpzdWJzY3JpcHRHRjUvJSxzdXBlcnNjcmlwdEdGNS8lK2ZvcmVncm91bmRHUSpbMCwwLDI1NV1GKC8lK2JhY2tncm91bmRHUS5bMjU1LDI1NSwyNTVdRigvJSdvcGFxdWVHRjUvJStleGVjdXRhYmxlR0Y1LyUpcmVhZG9ubHlHUSV0cnVlRigvJSljb21wb3NlZ [...]
+</Output>
+</Group>
+<Group labelreference="L431" drawlabel="true">
+<Input>
+<Text-field style="Text" layout="Normal"></Text-field>
+<Text-field style="Text" italic="true" size="14" layout="Normal"><Font italic="true" size="14">Bug in Maple</Font></Text-field>
+<Text-field style="Text" layout="Normal"></Text-field>
+</Input>
+</Group>
+<Group labelreference="L434" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">Determinant(Tref);Rank(Tref);</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSNtbkc2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGKDY5USIwRigvJSdmYW1pbHlHUTBUaW1lc35OZXd+Um9tYW5GKC8lJXNpemVHUSMxMkYoLyUlYm9sZEdRJmZhbHNlRigvJSdpdGFsaWNHRjUvJSp1bmRlcmxpbmVHRjUvJSpzdWJzY3JpcHRHRjUvJSxzdXBlcnNjcmlwdEdGNS8lK2ZvcmVncm91bmRHUSpbMCwwLDI1NV1GKC8lK2JhY2tncm91bmRHUS5bMjU1LDI1NSwyNTVdRigvJSdvcGFxdWVHRjUvJStleGVjdXRhYmxlR0Y1LyUpcmVhZG9ubHlHUSV0cnVlRigvJSljb21wb3NlZ [...]
+</Output>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSNtbkc2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGKDY5USQxOTlGKC8lJ2ZhbWlseUdRMFRpbWVzfk5ld35Sb21hbkYoLyUlc2l6ZUdRIzEyRigvJSVib2xkR1EmZmFsc2VGKC8lJ2l0YWxpY0dGNS8lKnVuZGVybGluZUdGNS8lKnN1YnNjcmlwdEdGNS8lLHN1cGVyc2NyaXB0R0Y1LyUrZm9yZWdyb3VuZEdRKlswLDAsMjU1XUYoLyUrYmFja2dyb3VuZEdRLlsyNTUsMjU1LDI1NV1GKC8lJ29wYXF1ZUdGNS8lK2V4ZWN1dGFibGVHRjUvJSlyZWFkb25seUdRJXRydWVGKC8lKWNvbXBvc [...]
+</Output>
+</Group>
+<Group labelreference="L440" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">Digits:=14;</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtaUdGJTY5USdEaWdpdHNGKC8lJ2ZhbWlseUdRMFRpbWVzfk5ld35Sb21hbkYoLyUlc2l6ZUdRIzEyRigvJSVib2xkR1EmZmFsc2VGKC8lJ2l0YWxpY0dRJXRydWVGKC8lKnVuZGVybGluZUdGOC8lKnN1YnNjcmlwdEdGOC8lLHN1cGVyc2NyaXB0R0Y4LyUrZm9yZWdyb3VuZEdRKlswLDAsMjU1XUYoLyUrYmFja2dyb3VuZEdRLlsyNTUsMjU1LDI1NV1GKC8lJ29wYXF1ZUdGOC8lK2V4ZWN1dGFibGVHRjgvJSlyZWFkb [...]
+</Output>
+</Group>
+<Group labelreference="L435" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">Determinant(1.*Tref);Rank(1.*Tref);</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtbkdGJTY5UTAyLjQwODQ1MTkyNTQ4MDVGKC8lJ2ZhbWlseUdRMFRpbWVzfk5ld35Sb21hbkYoLyUlc2l6ZUdRIzEyRigvJSVib2xkR1EmZmFsc2VGKC8lJ2l0YWxpY0dGOC8lKnVuZGVybGluZUdGOC8lKnN1YnNjcmlwdEdGOC8lLHN1cGVyc2NyaXB0R0Y4LyUrZm9yZWdyb3VuZEdRKlswLDAsMjU1XUYoLyUrYmFja2dyb3VuZEdRLlsyNTUsMjU1LDI1NV1GKC8lJ29wYXF1ZUdGOC8lK2V4ZWN1dGFibGVHRjgvJSlyZ [...]
+</Output>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSNtbkc2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGKDY5USQyMDBGKC8lJ2ZhbWlseUdRMFRpbWVzfk5ld35Sb21hbkYoLyUlc2l6ZUdRIzEyRigvJSVib2xkR1EmZmFsc2VGKC8lJ2l0YWxpY0dGNS8lKnVuZGVybGluZUdGNS8lKnN1YnNjcmlwdEdGNS8lLHN1cGVyc2NyaXB0R0Y1LyUrZm9yZWdyb3VuZEdRKlswLDAsMjU1XUYoLyUrYmFja2dyb3VuZEdRLlsyNTUsMjU1LDI1NV1GKC8lJ29wYXF1ZUdGNS8lK2V4ZWN1dGFibGVHRjUvJSlyZWFkb25seUdRJXRydWVGKC8lKWNvbXBvc [...]
+</Output>
+</Group>
+<Group labelreference="L436" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">lbDeterminant(Tref);lbRank(Tref);</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtc0dGJTYjUTFjb252ZXJzaW9ufnRpbWU6RigtSSNtb0dGJTYzUSIsRigvJSVmb3JtR1EmaW5maXhGKC8lJmZlbmNlR1EmZmFsc2VGKC8lKnNlcGFyYXRvckdRJXRydWVGKC8lJ2xzcGFjZUdRJDBlbUYoLyUncnNwYWNlR1EzdmVyeXRoaWNrbWF0aHNwYWNlRigvJSlzdHJldGNoeUdGOS8lKnN5bW1ldHJpY0dGOS8lKG1heHNpemVHUSlpbmZpbml0eUYoLyUobWluc2l6ZUdRIjFGKC8lKGxhcmdlb3BHRjkvJS5tb3ZhY [...]
+</Output>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSNtbkc2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGKDY5UVxbbTI0MDg0NTE5MjU0ODAyNzQzMTkzNTM5MjE0MTY1NjUwNzE0MDcxODM4ODg4OTI4ODk5NjM4MDgxMzEzMjU2MjE0MjAxMDk4MTY2MDQyMzgyMTg3MDYwNDE4MDEzMTA5MzQ5NzE1NjMzNzYyNDgzNDY1ODIzMjM4NTEyNTU5ODQwNjk4OTQ4OTY0MDE1NjUwNDExMzc4MjU1NDYxMzU2OTYyODg4NzMwMjgwNjEwMzQ0MTc2MzU1NDEyMjQ4OTk4MDc1NDE0NjYzMTcxNzUxOTYyMTQyMzA3OTQ3MjE4NTE3NDkyNzAzNzI4OTg2N [...]
+</Output>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtc0dGJTYjUTFjb252ZXJzaW9ufnRpbWU6RigtSSNtb0dGJTYzUSIsRigvJSVmb3JtR1EmaW5maXhGKC8lJmZlbmNlR1EmZmFsc2VGKC8lKnNlcGFyYXRvckdRJXRydWVGKC8lJ2xzcGFjZUdRJDBlbUYoLyUncnNwYWNlR1EzdmVyeXRoaWNrbWF0aHNwYWNlRigvJSlzdHJldGNoeUdGOS8lKnN5bW1ldHJpY0dGOS8lKG1heHNpemVHUSlpbmZpbml0eUYoLyUobWluc2l6ZUdRIjFGKC8lKGxhcmdlb3BHRjkvJS5tb3ZhY [...]
+</Output>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSNtbkc2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGKDY5USQyMDBGKC8lJ2ZhbWlseUdRMFRpbWVzfk5ld35Sb21hbkYoLyUlc2l6ZUdRIzEyRigvJSVib2xkR1EmZmFsc2VGKC8lJ2l0YWxpY0dGNS8lKnVuZGVybGluZUdGNS8lKnN1YnNjcmlwdEdGNS8lLHN1cGVyc2NyaXB0R0Y1LyUrZm9yZWdyb3VuZEdRKlswLDAsMjU1XUYoLyUrYmFja2dyb3VuZEdRLlsyNTUsMjU1LDI1NV1GKC8lJ29wYXF1ZUdGNS8lK2V4ZWN1dGFibGVHRjUvJSlyZWFkb25seUdRJXRydWVGKC8lKWNvbXBvc [...]
+</Output>
+</Group>
+<Group labelreference="L437" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">Determinant(Matrix(Tref,storage=rectangular));</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSNtbkc2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGKDY5UVxbbTI0MDg0NTE5MjU0ODAyNzQzMTkzNTM5MjE0MTY1NjUwNzE0MDcxODM4ODg4OTI4ODk5NjM4MDgxMzEzMjU2MjE0MjAxMDk4MTY2MDQyMzgyMTg3MDYwNDE4MDEzMTA5MzQ5NzE1NjMzNzYyNDgzNDY1ODIzMjM4NTEyNTU5ODQwNjk4OTQ4OTY0MDE1NjUwNDExMzc4MjU1NDYxMzU2OTYyODg4NzMwMjgwNjEwMzQ0MTc2MzU1NDEyMjQ4OTk4MDc1NDE0NjYzMTcxNzUxOTYyMTQyMzA3OTQ3MjE4NTE3NDkyNzAzNzI4OTg2N [...]
+</Output>
+</Group>
+<Group labelreference="L438" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal"></Text-field>
+</Input>
+</Group>
+<Text-field style="Text" layout="Normal"></Text-field>
+</Section>
+<Text-field style="Text" layout="Normal"></Text-field>
+</Section>
+<Text-field style="Text" layout="Normal"></Text-field>
+</Section>
+<Section collapsed="true" MultipleChoiceAnswerIndex="-1" MultipleChoiceRandomizeChoices="false" TrueFalseAnswerIndex="-1" EssayAnswerRows="5" EssayAnswerColumns="60"><Title>
+<Text-field style="Heading 1" layout="Heading 1">Low level of the interface</Text-field></Title>
+<Text-field style="Text" layout="Normal"></Text-field>
+<Group labelreference="L283" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">restart;</Text-field>
+</Input>
+</Group>
+<Group labelreference="L284" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">p:=17;</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtaUdGJTY5USJwRigvJSdmYW1pbHlHUTBUaW1lc35OZXd+Um9tYW5GKC8lJXNpemVHUSMxMkYoLyUlYm9sZEdRJmZhbHNlRigvJSdpdGFsaWNHUSV0cnVlRigvJSp1bmRlcmxpbmVHRjgvJSpzdWJzY3JpcHRHRjgvJSxzdXBlcnNjcmlwdEdGOC8lK2ZvcmVncm91bmRHUSpbMCwwLDI1NV1GKC8lK2JhY2tncm91bmRHUS5bMjU1LDI1NSwyNTVdRigvJSdvcGFxdWVHRjgvJStleGVjdXRhYmxlR0Y4LyUpcmVhZG9ubHlHR [...]
+</Output>
+</Group>
+<Section collapsed="true" MultipleChoiceAnswerIndex="-1" MultipleChoiceRandomizeChoices="false" TrueFalseAnswerIndex="-1" EssayAnswerRows="5" EssayAnswerColumns="60"><Title>
+<Text-field style="Heading 2" layout="Heading 2">Submodule of module LinBox</Text-field></Title>
+<Group labelreference="L285" drawlabel="true">
+<Input>
+<Text-field style="Text" layout="Normal"></Text-field>
+</Input>
+</Group>
+<Group labelreference="L286" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">with(LinBox:-Dev);</Text-field>
+</Input>
+<Output>
+<Text-field style="Line Printed Output" layout="Line Printed Output"> LinBox/Maple Interface Package beta version 0.1
+ by Pascal Giorgi (pgiorgi at uwaterloo.ca)</Text-field>
+</Output>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtb0dGJTYzUSJbRigvJSVmb3JtR1EncHJlZml4RigvJSZmZW5jZUdRJXRydWVGKC8lKnNlcGFyYXRvckdRJmZhbHNlRigvJSdsc3BhY2VHUS50aGlubWF0aHNwYWNlRigvJSdyc3BhY2VHRjsvJSlzdHJldGNoeUdGNS8lKnN5bW1ldHJpY0dGOC8lKG1heHNpemVHUSlpbmZpbml0eUYoLyUobWluc2l6ZUdRIjFGKC8lKGxhcmdlb3BHRjgvJS5tb3ZhYmxlbGltaXRzR0Y4LyUnYWNjZW50R0Y4LyUwZm9udF9zdHlsZV9uY [...]
+</Output>
+</Group>
+<Group labelreference="L287" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal"></Text-field>
+</Input>
+</Group>
+<Group labelreference="L288" drawlabel="true">
+<Input>
+<Text-field style="Text" layout="Normal"></Text-field>
+</Input>
+</Group>
+<Group labelreference="L291" drawlabel="true">
+<Input>
+<Text-field style="Text" layout="Normal"></Text-field>
+</Input>
+</Group>
+</Section>
+<Section collapsed="true" MultipleChoiceAnswerIndex="-1" MultipleChoiceRandomizeChoices="false" TrueFalseAnswerIndex="-1" EssayAnswerRows="5" EssayAnswerColumns="60"><Title>
+<Text-field style="Heading 2" layout="Heading 2">Creation of Domain</Text-field></Title>
+<Text-field style="Text" layout="Normal"></Text-field>
+<Text-field style="Text" size="16" layout="Normal"><Font size="16">Integers Domain</Font></Text-field>
+<Text-field style="Text" size="16" layout="Normal"></Text-field>
+<Group labelreference="L293" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">Z:=lbDomain(0,"linbox_ring_integer");</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtaUdGJTY5USJaRigvJSdmYW1pbHlHUTBUaW1lc35OZXd+Um9tYW5GKC8lJXNpemVHUSMxMkYoLyUlYm9sZEdRJmZhbHNlRigvJSdpdGFsaWNHUSV0cnVlRigvJSp1bmRlcmxpbmVHRjgvJSpzdWJzY3JpcHRHRjgvJSxzdXBlcnNjcmlwdEdGOC8lK2ZvcmVncm91bmRHUSpbMCwwLDI1NV1GKC8lK2JhY2tncm91bmRHUS5bMjU1LDI1NSwyNTVdRigvJSdvcGFxdWVHRjgvJStleGVjdXRhYmxlR0Y4LyUpcmVhZG9ubHlHR [...]
+</Output>
+</Group>
+<Group labelreference="L294" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">Z:=lbDomain();</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtaUdGJTY5USJaRigvJSdmYW1pbHlHUTBUaW1lc35OZXd+Um9tYW5GKC8lJXNpemVHUSMxMkYoLyUlYm9sZEdRJmZhbHNlRigvJSdpdGFsaWNHUSV0cnVlRigvJSp1bmRlcmxpbmVHRjgvJSpzdWJzY3JpcHRHRjgvJSxzdXBlcnNjcmlwdEdGOC8lK2ZvcmVncm91bmRHUSpbMCwwLDI1NV1GKC8lK2JhY2tncm91bmRHUS5bMjU1LDI1NSwyNTVdRigvJSdvcGFxdWVHRjgvJStleGVjdXRhYmxlR0Y4LyUpcmVhZG9ubHlHR [...]
+</Output>
+</Group>
+<Text-field style="Text" layout="Normal"></Text-field>
+<Text-field style="Text" layout="Normal"><Font size="16">Finite fields domain</Font></Text-field>
+<Text-field style="Text" layout="Normal"></Text-field>
+<Group labelreference="L301" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">Zp:=lbDomain(p,"linbox_field_dbl");</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtaUdGJTY5USNacEYoLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRigvJSVzaXplR1EjMTJGKC8lJWJvbGRHUSZmYWxzZUYoLyUnaXRhbGljR1EldHJ1ZUYoLyUqdW5kZXJsaW5lR0Y4LyUqc3Vic2NyaXB0R0Y4LyUsc3VwZXJzY3JpcHRHRjgvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRigvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYoLyUnb3BhcXVlR0Y4LyUrZXhlY3V0YWJsZUdGOC8lKXJlYWRvbmx5R [...]
+</Output>
+</Group>
+<Group labelreference="L302" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">Zp:=lbDomain(p);</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtaUdGJTY5USNacEYoLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRigvJSVzaXplR1EjMTJGKC8lJWJvbGRHUSZmYWxzZUYoLyUnaXRhbGljR1EldHJ1ZUYoLyUqdW5kZXJsaW5lR0Y4LyUqc3Vic2NyaXB0R0Y4LyUsc3VwZXJzY3JpcHRHRjgvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRigvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYoLyUnb3BhcXVlR0Y4LyUrZXhlY3V0YWJsZUdGOC8lKXJlYWRvbmx5R [...]
+</Output>
+</Group>
+<Text-field style="Text" layout="Normal"></Text-field>
+<Text-field style="Text" layout="Normal"><Font size="16">Use of global default type</Font></Text-field>
+<Text-field style="Text" layout="Normal"></Text-field>
+<Group labelreference="L296" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">lbSetIntegerRing("linbox_ring_integer");</Text-field>
+</Input>
+</Group>
+<Group labelreference="L297" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">lbSetPrimeField("linbox_field_dbl");</Text-field>
+</Input>
+</Group>
+<Group labelreference="L304" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">Z1:=lbDomain();</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtaUdGJTY5USNaMUYoLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRigvJSVzaXplR1EjMTJGKC8lJWJvbGRHUSZmYWxzZUYoLyUnaXRhbGljR1EldHJ1ZUYoLyUqdW5kZXJsaW5lR0Y4LyUqc3Vic2NyaXB0R0Y4LyUsc3VwZXJzY3JpcHRHRjgvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRigvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYoLyUnb3BhcXVlR0Y4LyUrZXhlY3V0YWJsZUdGOC8lKXJlYWRvbmx5R [...]
+</Output>
+</Group>
+<Group labelreference="L305" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">Zp2:=lbDomain(p);</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtaUdGJTY5USRacDJGKC8lJ2ZhbWlseUdRMFRpbWVzfk5ld35Sb21hbkYoLyUlc2l6ZUdRIzEyRigvJSVib2xkR1EmZmFsc2VGKC8lJ2l0YWxpY0dRJXRydWVGKC8lKnVuZGVybGluZUdGOC8lKnN1YnNjcmlwdEdGOC8lLHN1cGVyc2NyaXB0R0Y4LyUrZm9yZWdyb3VuZEdRKlswLDAsMjU1XUYoLyUrYmFja2dyb3VuZEdRLlsyNTUsMjU1LDI1NV1GKC8lJ29wYXF1ZUdGOC8lK2V4ZWN1dGFibGVHRjgvJSlyZWFkb25se [...]
+</Output>
+</Group>
+<Group labelreference="L387" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal"></Text-field>
+</Input>
+</Group>
+</Section>
+<Section collapsed="true" MultipleChoiceAnswerIndex="-1" MultipleChoiceRandomizeChoices="false" TrueFalseAnswerIndex="-1" EssayAnswerRows="5" EssayAnswerColumns="60"><Title>
+<Text-field style="Heading 2" layout="Heading 2">Using Blackbox (Matrix)</Text-field></Title>
+<Text-field style="Text" layout="Normal"></Text-field>
+<Text-field style="Text" layout="Normal"></Text-field>
+<Group labelreference="L306" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">A:=lbBlackbox(Z,10,10);</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtaUdGJTY5USJBRigvJSdmYW1pbHlHUTBUaW1lc35OZXd+Um9tYW5GKC8lJXNpemVHUSMxMkYoLyUlYm9sZEdRJmZhbHNlRigvJSdpdGFsaWNHUSV0cnVlRigvJSp1bmRlcmxpbmVHRjgvJSpzdWJzY3JpcHRHRjgvJSxzdXBlcnNjcmlwdEdGOC8lK2ZvcmVncm91bmRHUSpbMCwwLDI1NV1GKC8lK2JhY2tncm91bmRHUS5bMjU1LDI1NSwyNTVdRigvJSdvcGFxdWVHRjgvJStleGVjdXRhYmxlR0Y4LyUpcmVhZG9ubHlHR [...]
+</Output>
+</Group>
+<Group labelreference="L307" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">Ap:=lbBlackbox(Zp,10,10);</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtaUdGJTY5USNBcEYoLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRigvJSVzaXplR1EjMTJGKC8lJWJvbGRHUSZmYWxzZUYoLyUnaXRhbGljR1EldHJ1ZUYoLyUqdW5kZXJsaW5lR0Y4LyUqc3Vic2NyaXB0R0Y4LyUsc3VwZXJzY3JpcHRHRjgvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRigvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYoLyUnb3BhcXVlR0Y4LyUrZXhlY3V0YWJsZUdGOC8lKXJlYWRvbmx5R [...]
+</Output>
+</Group>
+<Group labelreference="L445" drawlabel="true">
+<Input>
+<Text-field style="Text" size="16" layout="Normal"></Text-field>
+<Text-field style="Text" size="16" layout="Normal"><Font size="14">Use of global default type</Font></Text-field>
+<Text-field style="Text" size="16" layout="Normal"></Text-field>
+</Input>
+</Group>
+<Group labelreference="L448" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">lbSetBlackbox("linbox_sparse");</Text-field>
+</Input>
+</Group>
+<Group labelreference="L446" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">A:=lbBlackbox(Z,10,10);</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtaUdGJTY5USJBRigvJSdmYW1pbHlHUTBUaW1lc35OZXd+Um9tYW5GKC8lJXNpemVHUSMxMkYoLyUlYm9sZEdRJmZhbHNlRigvJSdpdGFsaWNHUSV0cnVlRigvJSp1bmRlcmxpbmVHRjgvJSpzdWJzY3JpcHRHRjgvJSxzdXBlcnNjcmlwdEdGOC8lK2ZvcmVncm91bmRHUSpbMCwwLDI1NV1GKC8lK2JhY2tncm91bmRHUS5bMjU1LDI1NSwyNTVdRigvJSdvcGFxdWVHRjgvJStleGVjdXRhYmxlR0Y4LyUpcmVhZG9ubHlHR [...]
+</Output>
+</Group>
+<Group labelreference="L447" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal"></Text-field>
+</Input>
+</Group>
+<Group labelreference="L365" drawlabel="true">
+<Input>
+<Text-field style="Text" layout="Normal"></Text-field>
+<Text-field style="Text" layout="Normal"> <Font size="14">Set entries at random over the domain</Font></Text-field>
+<Text-field style="Text" layout="Normal"></Text-field>
+</Input>
+</Group>
+<Group labelreference="L308" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">lbRandom(A);</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSNtaUc2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGKDY5UV1yW35MaW5Cb3h+QmxhY2tib3h+KHN0b3JhZ2V+PX5saW5ib3hfc3BhcnNlLH5kb21haW5+PX5bTGluQm94fkRvbWFpbn4odHlwZX49fmxpbmJveF9yaW5nX2ludGVnZXIsfmNoYXJhY3R+PX4wKV1+KV18K0YoLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRigvJSVzaXplR1EjMTJGKC8lJWJvbGRHUSZmYWxzZUYoLyUnaXRhbGljR1EldHJ1ZUYoLyUqdW5kZXJsaW5lR0Y1LyUqc3Vic2NyaXB0R0Y1LyUsc3VwZXJzY3Jpc [...]
+</Output>
+</Group>
+<Group labelreference="L311" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">lbRandom(Ap);</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSNtaUc2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGKDY5UWpxW35MaW5Cb3h+QmxhY2tib3h+KHN0b3JhZ2V+PX5saW5ib3hfZGVuc2UsfmRvbWFpbn49fltMaW5Cb3h+RG9tYWlufih0eXBlfj1+bGluYm94X2ZpZWxkX2RibCx+Y2hhcmFjdH49fjE3KV1+KV18K0YoLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRigvJSVzaXplR1EjMTJGKC8lJWJvbGRHUSZmYWxzZUYoLyUnaXRhbGljR1EldHJ1ZUYoLyUqdW5kZXJsaW5lR0Y1LyUqc3Vic2NyaXB0R0Y1LyUsc3VwZXJzY3JpcHRHR [...]
+</Output>
+</Group>
+<Group labelreference="L363" drawlabel="true">
+<Input>
+<Text-field style="Text" size="14" layout="Normal"></Text-field>
+<Text-field style="Text" size="14" layout="Normal"><Font size="14">Computation without specifying the domain</Font></Text-field>
+<Text-field style="Text" size="14" layout="Normal"></Text-field>
+</Input>
+</Group>
+<Group labelreference="L366" drawlabel="true">
+<Input>
+<Text-field style="Text" italic="true" size="14" layout="Normal"><Font italic="true" size="14">Over the integers</Font></Text-field>
+</Input>
+</Group>
+<Group labelreference="L312" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">d1:=lbDeterminant(A);</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtaUdGJTY5USNkMUYoLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRigvJSVzaXplR1EjMTJGKC8lJWJvbGRHUSZmYWxzZUYoLyUnaXRhbGljR1EldHJ1ZUYoLyUqdW5kZXJsaW5lR0Y4LyUqc3Vic2NyaXB0R0Y4LyUsc3VwZXJzY3JpcHRHRjgvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRigvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYoLyUnb3BhcXVlR0Y4LyUrZXhlY3V0YWJsZUdGOC8lKXJlYWRvbmx5R [...]
+</Output>
+</Group>
+<Group labelreference="L367" drawlabel="true">
+<Input>
+<Text-field style="Text" italic="true" size="14" layout="Normal"><Font italic="true" size="14">Over a finite field</Font></Text-field>
+</Input>
+</Group>
+<Group labelreference="L313" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">d2:=lbDeterminant(Ap);</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtaUdGJTY5USNkMkYoLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRigvJSVzaXplR1EjMTJGKC8lJWJvbGRHUSZmYWxzZUYoLyUnaXRhbGljR1EldHJ1ZUYoLyUqdW5kZXJsaW5lR0Y4LyUqc3Vic2NyaXB0R0Y4LyUsc3VwZXJzY3JpcHRHRjgvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRigvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYoLyUnb3BhcXVlR0Y4LyUrZXhlY3V0YWJsZUdGOC8lKXJlYWRvbmx5R [...]
+</Output>
+</Group>
+<Group labelreference="L450" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal"></Text-field>
+</Input>
+</Group>
+<Group labelreference="L309" drawlabel="true">
+<Input>
+<Text-field style="Text" size="14" layout="Normal"></Text-field>
+<Text-field style="Text" size="14" layout="Normal"><Font size="14">Converting data</Font></Text-field>
+<Text-field style="Text" size="14" layout="Normal"></Text-field>
+</Input>
+</Group>
+<Group labelreference="L441" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">lbConvertElement(d1);</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSNtbkc2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGKDY5UWhwMzExNjI3OTYyMjI4MzQ1MzA4MjI5ODYyNjQxMjc3NjYxNjczOTQ3MDg1MDkwOTQ1ODg4MjgyNzY3MTQzMjYyOTAwMDkyNTExNzI1NDIwMDc0ODEzNTIzMjY1NDk2RigvJSdmYW1pbHlHUTBUaW1lc35OZXd+Um9tYW5GKC8lJXNpemVHUSMxMkYoLyUlYm9sZEdRJmZhbHNlRigvJSdpdGFsaWNHRjUvJSp1bmRlcmxpbmVHRjUvJSpzdWJzY3JpcHRHRjUvJSxzdXBlcnNjcmlwdEdGNS8lK2ZvcmVncm91bmRHUSpbMCwwLDI1N [...]
+</Output>
+</Group>
+<Group labelreference="L449" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">lbConvertElement(d2);</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSNtbkc2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGKDY5USMxMUYoLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRigvJSVzaXplR1EjMTJGKC8lJWJvbGRHUSZmYWxzZUYoLyUnaXRhbGljR0Y1LyUqdW5kZXJsaW5lR0Y1LyUqc3Vic2NyaXB0R0Y1LyUsc3VwZXJzY3JpcHRHRjUvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRigvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYoLyUnb3BhcXVlR0Y1LyUrZXhlY3V0YWJsZUdGNS8lKXJlYWRvbmx5R1EldHJ1ZUYoLyUpY29tcG9zZ [...]
+</Output>
+</Group>
+<Group labelreference="L310" drawlabel="true">
+<Input>
+<Text-field style="Text" layout="Normal"></Text-field>
+</Input>
+</Group>
+<Text-field style="Text" layout="Normal"></Text-field>
+</Section>
+<Section collapsed="true" MultipleChoiceAnswerIndex="-1" MultipleChoiceRandomizeChoices="false" TrueFalseAnswerIndex="-1" EssayAnswerRows="5" EssayAnswerColumns="60"><Title>
+<Text-field style="Heading 2" layout="Heading 2">using Vector</Text-field></Title>
+<Text-field style="Text" layout="Normal"></Text-field>
+<Text-field style="Text" layout="Normal"></Text-field>
+<Group labelreference="L369" drawlabel="true">
+<Input>
+<Text-field style="Text" italic="true" size="14" layout="Normal"><Font italic="true" size="14">construction over the integers</Font></Text-field>
+</Input>
+</Group>
+<Group labelreference="L333" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">V:=lbVector(Z,10);</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtaUdGJTY5USJWRigvJSdmYW1pbHlHUTBUaW1lc35OZXd+Um9tYW5GKC8lJXNpemVHUSMxMkYoLyUlYm9sZEdRJmZhbHNlRigvJSdpdGFsaWNHUSV0cnVlRigvJSp1bmRlcmxpbmVHRjgvJSpzdWJzY3JpcHRHRjgvJSxzdXBlcnNjcmlwdEdGOC8lK2ZvcmVncm91bmRHUSpbMCwwLDI1NV1GKC8lK2JhY2tncm91bmRHUS5bMjU1LDI1NSwyNTVdRigvJSdvcGFxdWVHRjgvJStleGVjdXRhYmxlR0Y4LyUpcmVhZG9ubHlHR [...]
+</Output>
+</Group>
+<Group labelreference="L370" drawlabel="true">
+<Input>
+<Text-field style="Text" italic="true" size="14" layout="Normal"><Font italic="true" size="14">construction over finite field</Font></Text-field>
+</Input>
+</Group>
+<Group labelreference="L336" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">Vp:=lbVector(Zp,10);</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtaUdGJTY5USNWcEYoLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRigvJSVzaXplR1EjMTJGKC8lJWJvbGRHUSZmYWxzZUYoLyUnaXRhbGljR1EldHJ1ZUYoLyUqdW5kZXJsaW5lR0Y4LyUqc3Vic2NyaXB0R0Y4LyUsc3VwZXJzY3JpcHRHRjgvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRigvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYoLyUnb3BhcXVlR0Y4LyUrZXhlY3V0YWJsZUdGOC8lKXJlYWRvbmx5R [...]
+</Output>
+</Group>
+<Group labelreference="L451" drawlabel="true">
+<Input>
+<Text-field style="Text" size="16" layout="Normal"></Text-field>
+<Text-field style="Text" size="16" layout="Normal"><Font size="14">Use of global default type</Font></Text-field>
+<Text-field style="Text" size="16" layout="Normal"></Text-field>
+</Input>
+</Group>
+<Group labelreference="L452" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">lbSetVector("linbox_dense");</Text-field>
+</Input>
+</Group>
+<Group labelreference="L371" drawlabel="true">
+<Input>
+<Text-field style="Text" layout="Normal"></Text-field>
+</Input>
+</Group>
+<Group labelreference="L372" drawlabel="true">
+<Input>
+<Text-field style="Text" layout="Normal"> <Font size="14">Set entries at random over the domain</Font></Text-field>
+<Text-field style="Text" layout="Normal"></Text-field>
+</Input>
+</Group>
+<Group labelreference="L332" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">lbRandom(V);</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSNtaUc2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGKDY5UWpxW35MaW5Cb3h+VmVjdG9yfihzdG9yYWdlfj1+bGluYm94X2RlbnNlLH5kb21haW5+PX5bTGluQm94fkRvbWFpbn4odHlwZX49fmxpbmJveF9yaW5nX2ludGVnZXIsfmNoYXJhY3R+PX4wKV1+KV18K0YoLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRigvJSVzaXplR1EjMTJGKC8lJWJvbGRHUSZmYWxzZUYoLyUnaXRhbGljR1EldHJ1ZUYoLyUqdW5kZXJsaW5lR0Y1LyUqc3Vic2NyaXB0R0Y1LyUsc3VwZXJzY3JpcHRHR [...]
+</Output>
+</Group>
+<Group labelreference="L334" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">lbRandom(Vp);</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSNtaUc2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGKDY5UWhxW35MaW5Cb3h+VmVjdG9yfihzdG9yYWdlfj1+bGluYm94X2RlbnNlLH5kb21haW5+PX5bTGluQm94fkRvbWFpbn4odHlwZX49fmxpbmJveF9maWVsZF9kYmwsfmNoYXJhY3R+PX4xNyldfildfCtGKC8lJ2ZhbWlseUdRMFRpbWVzfk5ld35Sb21hbkYoLyUlc2l6ZUdRIzEyRigvJSVib2xkR1EmZmFsc2VGKC8lJ2l0YWxpY0dRJXRydWVGKC8lKnVuZGVybGluZUdGNS8lKnN1YnNjcmlwdEdGNS8lLHN1cGVyc2NyaXB0R0Y1L [...]
+</Output>
+</Group>
+<Group labelreference="L373" drawlabel="true">
+<Input>
+<Text-field style="Text" layout="Normal"></Text-field>
+</Input>
+</Group>
+<Group labelreference="L375" drawlabel="true">
+<Input>
+<Text-field style="Text" size="14" layout="Normal"><Font size="14">Computation without specifying the domain</Font></Text-field>
+<Text-field style="Text" size="14" layout="Normal"></Text-field>
+</Input>
+</Group>
+<Group labelreference="L376" drawlabel="true">
+<Input>
+<Text-field style="Text" italic="true" size="14" layout="Normal"><Font italic="true" size="14">Over the integers</Font></Text-field>
+</Input>
+</Group>
+<Group labelreference="L342" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">x1:=lbSolve(A,V);</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtaUdGJTY5USN4MUYoLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRigvJSVzaXplR1EjMTJGKC8lJWJvbGRHUSZmYWxzZUYoLyUnaXRhbGljR1EldHJ1ZUYoLyUqdW5kZXJsaW5lR0Y4LyUqc3Vic2NyaXB0R0Y4LyUsc3VwZXJzY3JpcHRHRjgvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRigvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYoLyUnb3BhcXVlR0Y4LyUrZXhlY3V0YWJsZUdGOC8lKXJlYWRvbmx5R [...]
+</Output>
+</Group>
+<Group labelreference="L335" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">x2:=lbSolve(Ap,Vp);</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtaUdGJTY5USN4MkYoLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRigvJSVzaXplR1EjMTJGKC8lJWJvbGRHUSZmYWxzZUYoLyUnaXRhbGljR1EldHJ1ZUYoLyUqdW5kZXJsaW5lR0Y4LyUqc3Vic2NyaXB0R0Y4LyUsc3VwZXJzY3JpcHRHRjgvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRigvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYoLyUnb3BhcXVlR0Y4LyUrZXhlY3V0YWJsZUdGOC8lKXJlYWRvbmx5R [...]
+</Output>
+</Group>
+<Group labelreference="L339" drawlabel="true">
+<Input>
+<Text-field style="Text" layout="Normal"></Text-field>
+<Text-field style="Text" size="14" layout="Normal"><Font size="14">Converting data</Font></Text-field>
+<Text-field style="Text" layout="Normal"></Text-field>
+</Input>
+</Group>
+<Group labelreference="L453" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">lbConvertVector(x1);lbConvertVector(x2);</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtb0dGJTYzUSJbRigvJSVmb3JtR1EncHJlZml4RigvJSZmZW5jZUdRJXRydWVGKC8lKnNlcGFyYXRvckdRJmZhbHNlRigvJSdsc3BhY2VHUS50aGlubWF0aHNwYWNlRigvJSdyc3BhY2VHRjsvJSlzdHJldGNoeUdGNS8lKnN5bW1ldHJpY0dGOC8lKG1heHNpemVHUSlpbmZpbml0eUYoLyUobWluc2l6ZUdRIjFGKC8lKGxhcmdlb3BHRjgvJS5tb3ZhYmxlbGltaXRzR0Y4LyUnYWNjZW50R0Y4LyUwZm9udF9zdHlsZV9uY [...]
+</Output>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtb0dGJTYzUSJbRigvJSVmb3JtR1EncHJlZml4RigvJSZmZW5jZUdRJXRydWVGKC8lKnNlcGFyYXRvckdRJmZhbHNlRigvJSdsc3BhY2VHUS50aGlubWF0aHNwYWNlRigvJSdyc3BhY2VHRjsvJSlzdHJldGNoeUdGNS8lKnN5bW1ldHJpY0dGOC8lKG1heHNpemVHUSlpbmZpbml0eUYoLyUobWluc2l6ZUdRIjFGKC8lKGxhcmdlb3BHRjgvJS5tb3ZhYmxlbGltaXRzR0Y4LyUnYWNjZW50R0Y4LyUwZm9udF9zdHlsZV9uY [...]
+</Output>
+</Group>
+</Section>
+<Section collapsed="false" MultipleChoiceAnswerIndex="-1" MultipleChoiceRandomizeChoices="false" TrueFalseAnswerIndex="-1" EssayAnswerRows="5" EssayAnswerColumns="60"><Title>
+<Text-field style="Heading 2" layout="Heading 2">Example of use</Text-field></Title>
+<Text-field style="Text" layout="Normal"></Text-field>
+<Section collapsed="true" MultipleChoiceAnswerIndex="-1" MultipleChoiceRandomizeChoices="false" TrueFalseAnswerIndex="-1" EssayAnswerRows="5" EssayAnswerColumns="60"><Title>
+<Text-field style="Heading 3" layout="Heading 3">Highly efficient user's solution</Text-field></Title>
+<Text-field style="Text" layout="Normal"></Text-field>
+<Text-field style="Text" layout="Normal"><Font italic="true" size="14">Compute the determinant of a matrix read from a file</Font></Text-field>
+<Group labelreference="L343" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">myDeterminant:=proc(p, file)
+ local Zp,B,d;
+ Zp:=lbDomain(p);
+ B:=lbBlackbox(Zp,file);
+ d:=lbElement(Zp);
+ lbDeterminant(d,B);
+ return lbConvertElement(d);
+ end;
+
+ </Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtaUdGJTY5US5teURldGVybWluYW50RigvJSdmYW1pbHlHUTBUaW1lc35OZXd+Um9tYW5GKC8lJXNpemVHUSMxMkYoLyUlYm9sZEdRJmZhbHNlRigvJSdpdGFsaWNHUSV0cnVlRigvJSp1bmRlcmxpbmVHRjgvJSpzdWJzY3JpcHRHRjgvJSxzdXBlcnNjcmlwdEdGOC8lK2ZvcmVncm91bmRHUSpbMCwwLDI1NV1GKC8lK2JhY2tncm91bmRHUS5bMjU1LDI1NSwyNTVdRigvJSdvcGFxdWVHRjgvJStleGVjdXRhYmxlR0Y4L [...]
+</Output>
+</Group>
+<Group labelreference="L344" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">myDeterminant(1009, "trefethen_200.sms");</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSNtbkc2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGKDY5USQzNDZGKC8lJ2ZhbWlseUdRMFRpbWVzfk5ld35Sb21hbkYoLyUlc2l6ZUdRIzEyRigvJSVib2xkR1EmZmFsc2VGKC8lJ2l0YWxpY0dGNS8lKnVuZGVybGluZUdGNS8lKnN1YnNjcmlwdEdGNS8lLHN1cGVyc2NyaXB0R0Y1LyUrZm9yZWdyb3VuZEdRKlswLDAsMjU1XUYoLyUrYmFja2dyb3VuZEdRLlsyNTUsMjU1LDI1NV1GKC8lJ29wYXF1ZUdGNS8lK2V4ZWN1dGFibGVHRjUvJSlyZWFkb25seUdRJXRydWVGKC8lKWNvbXBvc [...]
+</Output>
+</Group>
+<Group labelreference="L345" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">myDeterminant(0, "trefethen_200.sms");</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSNtbkc2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGKDY5UVxbbTI0MDg0NTE5MjU0ODAyNzQzMTkzNTM5MjE0MTY1NjUwNzE0MDcxODM4ODg4OTI4ODk5NjM4MDgxMzEzMjU2MjE0MjAxMDk4MTY2MDQyMzgyMTg3MDYwNDE4MDEzMTA5MzQ5NzE1NjMzNzYyNDgzNDY1ODIzMjM4NTEyNTU5ODQwNjk4OTQ4OTY0MDE1NjUwNDExMzc4MjU1NDYxMzU2OTYyODg4NzMwMjgwNjEwMzQ0MTc2MzU1NDEyMjQ4OTk4MDc1NDE0NjYzMTcxNzUxOTYyMTQyMzA3OTQ3MjE4NTE3NDkyNzAzNzI4OTg2N [...]
+</Output>
+</Group>
+<Group labelreference="L382" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal"></Text-field>
+</Input>
+</Group>
+</Section>
+</Section>
+<Section collapsed="true" MultipleChoiceAnswerIndex="-1" MultipleChoiceRandomizeChoices="false" TrueFalseAnswerIndex="-1" EssayAnswerRows="5" EssayAnswerColumns="60"><Title>
+<Text-field style="Heading 2" layout="Heading 2">To continue ...</Text-field></Title>
+<Text-field style="Text" layout="Normal"></Text-field>
+<Text-field style="Text" layout="Normal"></Text-field>
+</Section>
+</Section>
+<Group labelreference="L289" drawlabel="true">
+<Input>
+<Text-field style="Text" layout="Normal"></Text-field>
+<Text-field style="Text" layout="Normal"></Text-field>
+<Text-field style="Text" layout="Normal"></Text-field>
+<Text-field style="Text" layout="Normal"></Text-field>
+<Text-field style="Text" layout="Normal"></Text-field>
+<Text-field style="Text" layout="Normal"></Text-field>
+<Text-field style="Text" layout="Normal"></Text-field>
+<Text-field style="Text" layout="Normal"></Text-field>
+<Text-field style="Text" layout="Normal"></Text-field>
+<Text-field style="Text" layout="Normal"></Text-field>
+<Text-field style="Text" layout="Normal"></Text-field>
+<Text-field style="Text" layout="Normal"></Text-field>
+<Text-field style="Text" layout="Normal"></Text-field>
+</Input>
+</Group>
+</Worksheet>
\ No newline at end of file
diff --git a/interfaces/sage/Makefile.am b/interfaces/sage/Makefile.am
index f7c690c..a3c6f47 100644
--- a/interfaces/sage/Makefile.am
+++ b/interfaces/sage/Makefile.am
@@ -21,9 +21,12 @@
if LINBOX_HAVE_SAGE
-AM_CPPFLAGS=-I$(top_srcdir) -I. -I../../linbox
+#AM_CPPFLAGS=-I$(top_srcdir) -I. -I../../linbox
-AM_CXXFLAGS = @DEFAULT_CFLAGS@ -DDISABLE_COMMENTATOR $(GMP_CFLAGS) $(NTL_CFLAGS) $(ATLAS_CFLAGS) $(FFLAS_FFPACK_CFLAGS) $(GIVARO_CFLAGS)
+AM_CPPFLAGS = -DDISABLE_COMMENTATOR -I$(top_srcdir)/linbox $(DEPS_CFLAGS)
+LDADD = $(DEPS_LIBS) $(LDFLAGS)
+
+#AM_CXXFLAGS = @DEFAULT_CFLAGS@ -DDISABLE_COMMENTATOR $(NTL_CFLAGS) $(OPTFLAGS) $(PARFLAGS)
lib_LTLIBRARIES = liblinboxsage.la
@@ -31,9 +34,9 @@ liblinboxsage_la_SOURCES = linbox-sage.C
pkginclude_HEADERS = linbox-sage.h
-#liblinboxsage_la_LIBADD = -llinbox $(BLAS_LIBS)
+#liblinboxsage_la_LIBADD = -llinbox
#gentoo's linbox-1.1.6-fix-undefined-symbols.patch
liblinboxsage_la_LIBADD = $(top_builddir)/linbox/liblinbox.la
-liblinboxsage_la_LDFLAGS = $(GIVARO_LIBS) $(GMP_LIBS) $(NTL_LIBS) $(BLAS_LIBS) $(MAPLE_LIBS) $(LDFLAGS) -version-info 0:0:0 #-Wl,-zmuldefs
+liblinboxsage_la_LDFLAGS = $(DEPS_LIBS) $(LDFLAGS) -version-info 0:0:0 #-Wl,-zmuldefs
endif
diff --git a/interfaces/sage/Makefile.in b/interfaces/sage/Makefile.in
deleted file mode 100644
index 924dc48..0000000
--- a/interfaces/sage/Makefile.in
+++ /dev/null
@@ -1,657 +0,0 @@
-# Makefile.in generated by automake 1.11.5 from Makefile.am.
-# @configure_input@
-
-# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software
-# Foundation, Inc.
-# This Makefile.in is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
-# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
-# PARTICULAR PURPOSE.
-
- at SET_MAKE@
-
-# Copyright (c) 2010 the LinBox group
-# ========LICENCE========
-# This file is part of the library LinBox.
-#
-# LinBox is free software: you can redistribute it and/or modify
-# it under the terms of the GNU Lesser General Public
-# License as published by the Free Software Foundation; either
-# version 2.1 of the License, or (at your option) any later version.
-#
-# This library 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
-# Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public
-# License along with this library; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
-# ========LICENCE========
-
-
-VPATH = @srcdir@
-am__make_dryrun = \
- { \
- am__dry=no; \
- case $$MAKEFLAGS in \
- *\\[\ \ ]*) \
- echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \
- | grep '^AM OK$$' >/dev/null || am__dry=yes;; \
- *) \
- for am__flg in $$MAKEFLAGS; do \
- case $$am__flg in \
- *=*|--*) ;; \
- *n*) am__dry=yes; break;; \
- esac; \
- done;; \
- esac; \
- test $$am__dry = yes; \
- }
-pkgdatadir = $(datadir)/@PACKAGE@
-pkgincludedir = $(includedir)/@PACKAGE@
-pkglibdir = $(libdir)/@PACKAGE@
-pkglibexecdir = $(libexecdir)/@PACKAGE@
-am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
-install_sh_DATA = $(install_sh) -c -m 644
-install_sh_PROGRAM = $(install_sh) -c
-install_sh_SCRIPT = $(install_sh) -c
-INSTALL_HEADER = $(INSTALL_DATA)
-transform = $(program_transform_name)
-NORMAL_INSTALL = :
-PRE_INSTALL = :
-POST_INSTALL = :
-NORMAL_UNINSTALL = :
-PRE_UNINSTALL = :
-POST_UNINSTALL = :
-build_triplet = @build@
-host_triplet = @host@
-subdir = interfaces/sage
-DIST_COMMON = $(am__pkginclude_HEADERS_DIST) $(srcdir)/Makefile.am \
- $(srcdir)/Makefile.in
-ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-am__aclocal_m4_deps = $(top_srcdir)/macros/aclocal-include.m4 \
- $(top_srcdir)/macros/config-header.m4 \
- $(top_srcdir)/macros/debug.m4 \
- $(top_srcdir)/macros/expat-check.m4 \
- $(top_srcdir)/macros/fflas-ffpack-check.m4 \
- $(top_srcdir)/macros/fplll-check.m4 \
- $(top_srcdir)/macros/givaro-check.m4 \
- $(top_srcdir)/macros/gmp-check.m4 \
- $(top_srcdir)/macros/iml-check.m4 \
- $(top_srcdir)/macros/lapack-check.m4 \
- $(top_srcdir)/macros/libtool.m4 \
- $(top_srcdir)/macros/lidia-check.m4 \
- $(top_srcdir)/macros/linbox-benchmark.m4 \
- $(top_srcdir)/macros/linbox-doc.m4 \
- $(top_srcdir)/macros/linbox-misc.m4 \
- $(top_srcdir)/macros/linbox-opt.m4 \
- $(top_srcdir)/macros/ltoptions.m4 \
- $(top_srcdir)/macros/ltsugar.m4 \
- $(top_srcdir)/macros/ltversion.m4 \
- $(top_srcdir)/macros/lt~obsolete.m4 \
- $(top_srcdir)/macros/m4ri-check.m4 \
- $(top_srcdir)/macros/m4rie-check.m4 \
- $(top_srcdir)/macros/maple-check.m4 \
- $(top_srcdir)/macros/mpfr-check.m4 \
- $(top_srcdir)/macros/ntl-check.m4 \
- $(top_srcdir)/macros/saclib-check.m4 \
- $(top_srcdir)/macros/sage-check.m4 $(top_srcdir)/configure.ac
-am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
- $(ACLOCAL_M4)
-mkinstalldirs = $(install_sh) -d
-CONFIG_HEADER = $(top_builddir)/config.h
-CONFIG_CLEAN_FILES =
-CONFIG_CLEAN_VPATH_FILES =
-am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
-am__vpath_adj = case $$p in \
- $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
- *) f=$$p;; \
- esac;
-am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
-am__install_max = 40
-am__nobase_strip_setup = \
- srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
-am__nobase_strip = \
- for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
-am__nobase_list = $(am__nobase_strip_setup); \
- for p in $$list; do echo "$$p $$p"; done | \
- sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
- $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
- if (++n[$$2] == $(am__install_max)) \
- { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
- END { for (dir in files) print dir, files[dir] }'
-am__base_list = \
- sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
- sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
-am__uninstall_files_from_dir = { \
- test -z "$$files" \
- || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \
- || { echo " ( cd '$$dir' && rm -f" $$files ")"; \
- $(am__cd) "$$dir" && rm -f $$files; }; \
- }
-am__installdirs = "$(DESTDIR)$(libdir)" "$(DESTDIR)$(pkgincludedir)"
-LTLIBRARIES = $(lib_LTLIBRARIES)
- at LINBOX_HAVE_SAGE_TRUE@liblinboxsage_la_DEPENDENCIES = \
- at LINBOX_HAVE_SAGE_TRUE@ $(top_builddir)/linbox/liblinbox.la
-am__liblinboxsage_la_SOURCES_DIST = linbox-sage.C
- at LINBOX_HAVE_SAGE_TRUE@am_liblinboxsage_la_OBJECTS = linbox-sage.lo
-liblinboxsage_la_OBJECTS = $(am_liblinboxsage_la_OBJECTS)
-liblinboxsage_la_LINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) \
- $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \
- $(CXXFLAGS) $(liblinboxsage_la_LDFLAGS) $(LDFLAGS) -o $@
- at LINBOX_HAVE_SAGE_TRUE@am_liblinboxsage_la_rpath = -rpath $(libdir)
-DEFAULT_INCLUDES = -I. at am__isrc@ -I$(top_builddir)
-depcomp =
-am__depfiles_maybe =
-CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
- $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
-LTCXXCOMPILE = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
- --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
- $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
-CXXLD = $(CXX)
-CXXLINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
- --mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \
- $(LDFLAGS) -o $@
-SOURCES = $(liblinboxsage_la_SOURCES)
-DIST_SOURCES = $(am__liblinboxsage_la_SOURCES_DIST)
-am__can_run_installinfo = \
- case $$AM_UPDATE_INFO_DIR in \
- n|no|NO) false;; \
- *) (install-info --version) >/dev/null 2>&1;; \
- esac
-am__pkginclude_HEADERS_DIST = linbox-sage.h
-HEADERS = $(pkginclude_HEADERS)
-ETAGS = etags
-CTAGS = ctags
-DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
-ACLOCAL = @ACLOCAL@
-AMTAR = @AMTAR@
-AR = @AR@
-AUTOCONF = @AUTOCONF@
-AUTOHEADER = @AUTOHEADER@
-AUTOMAKE = @AUTOMAKE@
-AWK = @AWK@
-BLAS_CFLAGS = @BLAS_CFLAGS@
-BLAS_LIBS = @BLAS_LIBS@
-CC = @CC@
-CCNAM = @CCNAM@
-CFLAGS = @CFLAGS@
-CPPFLAGS = @CPPFLAGS@
-CXX = @CXX@
-CXXCPP = @CXXCPP@
-CXXFLAGS = @CXXFLAGS@
-CYGPATH_W = @CYGPATH_W@
-DBG = @DBG@
-DEBUG_CFLAGS = @DEBUG_CFLAGS@
-DEFAULT_CFLAGS = @DEFAULT_CFLAGS@
-DEFS = @DEFS@
-DLLTOOL = @DLLTOOL@
-DSYMUTIL = @DSYMUTIL@
-DUMPBIN = @DUMPBIN@
-ECHO_C = @ECHO_C@
-ECHO_N = @ECHO_N@
-ECHO_T = @ECHO_T@
-EGREP = @EGREP@
-EXEEXT = @EXEEXT@
-EXPAT_CFLAGS = @EXPAT_CFLAGS@
-EXPAT_LIBS = @EXPAT_LIBS@
-FFLAS_FFPACK_CFLAGS = @FFLAS_FFPACK_CFLAGS@
-FFLAS_FFPACK_LIBS = @FFLAS_FFPACK_LIBS@
-FFLAS_FFPACK_LOC = @FFLAS_FFPACK_LOC@
-FGREP = @FGREP@
-FPLLL_CFLAGS = @FPLLL_CFLAGS@
-FPLLL_LIBS = @FPLLL_LIBS@
-GIVARO_CFLAGS = @GIVARO_CFLAGS@
-GIVARO_LIBS = @GIVARO_LIBS@
-GMP_CFLAGS = @GMP_CFLAGS@
-GMP_LIBS = @GMP_LIBS@
-GMP_VERSION = @GMP_VERSION@
-GREP = @GREP@
-IML_CFLAGS = @IML_CFLAGS@
-IML_LIBS = @IML_LIBS@
-INSTALL = @INSTALL@
-INSTALL_DATA = @INSTALL_DATA@
-INSTALL_PROGRAM = @INSTALL_PROGRAM@
-INSTALL_SCRIPT = @INSTALL_SCRIPT@
-INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
-LD = @LD@
-LDFLAGS = @LDFLAGS@
-LIBOBJS = @LIBOBJS@
-LIBS = @LIBS@
-LIBTOOL = @LIBTOOL@
-LIDIA_CFLAGS = @LIDIA_CFLAGS@
-LIDIA_LIBS = @LIDIA_LIBS@
-LINBOX_BENCH_PATH = @LINBOX_BENCH_PATH@
-LINBOX_DOC_PATH = @LINBOX_DOC_PATH@
-LIPO = @LIPO@
-LN_S = @LN_S@
-LTLIBOBJS = @LTLIBOBJS@
-M4RIE_CFLAGS = @M4RIE_CFLAGS@
-M4RIE_LIBS = @M4RIE_LIBS@
-M4RI_CFLAGS = @M4RI_CFLAGS@
-M4RI_LIBS = @M4RI_LIBS@
-MAINT = @MAINT@
-MAKEINFO = @MAKEINFO@
-MANIFEST_TOOL = @MANIFEST_TOOL@
-MAPLE_CFLAGS = @MAPLE_CFLAGS@
-MAPLE_HOME = @MAPLE_HOME@
-MAPLE_LIBS = @MAPLE_LIBS@
-MAPLE_VERSION = @MAPLE_VERSION@
-MKDIR_P = @MKDIR_P@
-MPFR_CFLAGS = @MPFR_CFLAGS@
-MPFR_LIBS = @MPFR_LIBS@
-NM = @NM@
-NMEDIT = @NMEDIT@
-NTL_CFLAGS = @NTL_CFLAGS@
-NTL_LIBS = @NTL_LIBS@
-OBJDUMP = @OBJDUMP@
-OBJEXT = @OBJEXT@
-OTOOL = @OTOOL@
-OTOOL64 = @OTOOL64@
-PACKAGE = @PACKAGE@
-PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
-PACKAGE_NAME = @PACKAGE_NAME@
-PACKAGE_STRING = @PACKAGE_STRING@
-PACKAGE_TARNAME = @PACKAGE_TARNAME@
-PACKAGE_URL = @PACKAGE_URL@
-PACKAGE_VERSION = @PACKAGE_VERSION@
-PATH_SEPARATOR = @PATH_SEPARATOR@
-PROF = @PROF@
-RANLIB = @RANLIB@
-RM = @RM@
-SACLIB_CFLAGS = @SACLIB_CFLAGS@
-SACLIB_LIBS = @SACLIB_LIBS@
-SED = @SED@
-SET_MAKE = @SET_MAKE@
-SHELL = @SHELL@
-STRIP = @STRIP@
-TESTS_CFLAGS = @TESTS_CFLAGS@
-VERSION = @VERSION@
-WARN = @WARN@
-abs_builddir = @abs_builddir@
-abs_srcdir = @abs_srcdir@
-abs_top_builddir = @abs_top_builddir@
-abs_top_srcdir = @abs_top_srcdir@
-ac_ct_AR = @ac_ct_AR@
-ac_ct_CC = @ac_ct_CC@
-ac_ct_CXX = @ac_ct_CXX@
-ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
-am__leading_dot = @am__leading_dot@
-am__tar = @am__tar@
-am__untar = @am__untar@
-bindir = @bindir@
-build = @build@
-build_alias = @build_alias@
-build_cpu = @build_cpu@
-build_os = @build_os@
-build_vendor = @build_vendor@
-builddir = @builddir@
-datadir = @datadir@
-datarootdir = @datarootdir@
-docdir = @docdir@
-dvidir = @dvidir@
-exec_prefix = @exec_prefix@
-host = @host@
-host_alias = @host_alias@
-host_cpu = @host_cpu@
-host_os = @host_os@
-host_vendor = @host_vendor@
-htmldir = @htmldir@
-includedir = @includedir@
-infodir = @infodir@
-install_sh = @install_sh@
-libdir = @libdir@
-libexecdir = @libexecdir@
-localedir = @localedir@
-localstatedir = @localstatedir@
-mandir = @mandir@
-mkdir_p = @mkdir_p@
-oldincludedir = @oldincludedir@
-pdfdir = @pdfdir@
-prefix = @prefix@
-program_transform_name = @program_transform_name@
-psdir = @psdir@
-sbindir = @sbindir@
-sharedstatedir = @sharedstatedir@
-srcdir = @srcdir@
-sysconfdir = @sysconfdir@
-target_alias = @target_alias@
-top_build_prefix = @top_build_prefix@
-top_builddir = @top_builddir@
-top_srcdir = @top_srcdir@
- at LINBOX_HAVE_SAGE_TRUE@AM_CPPFLAGS = -I$(top_srcdir) -I. -I../../linbox
- at LINBOX_HAVE_SAGE_TRUE@AM_CXXFLAGS = @DEFAULT_CFLAGS@ -DDISABLE_COMMENTATOR $(GMP_CFLAGS) $(NTL_CFLAGS) $(ATLAS_CFLAGS) $(FFLAS_FFPACK_CFLAGS) $(GIVARO_CFLAGS)
- at LINBOX_HAVE_SAGE_TRUE@lib_LTLIBRARIES = liblinboxsage.la
- at LINBOX_HAVE_SAGE_TRUE@liblinboxsage_la_SOURCES = linbox-sage.C
- at LINBOX_HAVE_SAGE_TRUE@pkginclude_HEADERS = linbox-sage.h
-
-#liblinboxsage_la_LIBADD = -llinbox $(BLAS_LIBS)
-#gentoo's linbox-1.1.6-fix-undefined-symbols.patch
- at LINBOX_HAVE_SAGE_TRUE@liblinboxsage_la_LIBADD = $(top_builddir)/linbox/liblinbox.la
- at LINBOX_HAVE_SAGE_TRUE@liblinboxsage_la_LDFLAGS = $(GIVARO_LIBS) $(GMP_LIBS) $(NTL_LIBS) $(BLAS_LIBS) $(MAPLE_LIBS) $(LDFLAGS) -version-info 0:0:0 #-Wl,-zmuldefs
-all: all-am
-
-.SUFFIXES:
-.SUFFIXES: .C .lo .o .obj
-$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps)
- @for dep in $?; do \
- case '$(am__configure_deps)' in \
- *$$dep*) \
- ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
- && { if test -f $@; then exit 0; else break; fi; }; \
- exit 1;; \
- esac; \
- done; \
- echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu --ignore-deps interfaces/sage/Makefile'; \
- $(am__cd) $(top_srcdir) && \
- $(AUTOMAKE) --gnu --ignore-deps interfaces/sage/Makefile
-.PRECIOUS: Makefile
-Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
- @case '$?' in \
- *config.status*) \
- cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
- *) \
- echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
- cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
- esac;
-
-$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
- cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-
-$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
- cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
- cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-$(am__aclocal_m4_deps):
-install-libLTLIBRARIES: $(lib_LTLIBRARIES)
- @$(NORMAL_INSTALL)
- @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \
- list2=; for p in $$list; do \
- if test -f $$p; then \
- list2="$$list2 $$p"; \
- else :; fi; \
- done; \
- test -z "$$list2" || { \
- echo " $(MKDIR_P) '$(DESTDIR)$(libdir)'"; \
- $(MKDIR_P) "$(DESTDIR)$(libdir)" || exit 1; \
- echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(libdir)'"; \
- $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(libdir)"; \
- }
-
-uninstall-libLTLIBRARIES:
- @$(NORMAL_UNINSTALL)
- @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \
- for p in $$list; do \
- $(am__strip_dir) \
- echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(libdir)/$$f'"; \
- $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(libdir)/$$f"; \
- done
-
-clean-libLTLIBRARIES:
- -test -z "$(lib_LTLIBRARIES)" || rm -f $(lib_LTLIBRARIES)
- @list='$(lib_LTLIBRARIES)'; for p in $$list; do \
- dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \
- test "$$dir" != "$$p" || dir=.; \
- echo "rm -f \"$${dir}/so_locations\""; \
- rm -f "$${dir}/so_locations"; \
- done
-liblinboxsage.la: $(liblinboxsage_la_OBJECTS) $(liblinboxsage_la_DEPENDENCIES) $(EXTRA_liblinboxsage_la_DEPENDENCIES)
- $(liblinboxsage_la_LINK) $(am_liblinboxsage_la_rpath) $(liblinboxsage_la_OBJECTS) $(liblinboxsage_la_LIBADD) $(LIBS)
-
-mostlyclean-compile:
- -rm -f *.$(OBJEXT)
-
-distclean-compile:
- -rm -f *.tab.c
-
-.C.o:
- $(CXXCOMPILE) -c -o $@ $<
-
-.C.obj:
- $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
-
-.C.lo:
- $(LTCXXCOMPILE) -c -o $@ $<
-
-mostlyclean-libtool:
- -rm -f *.lo
-
-clean-libtool:
- -rm -rf .libs _libs
-install-pkgincludeHEADERS: $(pkginclude_HEADERS)
- @$(NORMAL_INSTALL)
- @list='$(pkginclude_HEADERS)'; test -n "$(pkgincludedir)" || list=; \
- if test -n "$$list"; then \
- echo " $(MKDIR_P) '$(DESTDIR)$(pkgincludedir)'"; \
- $(MKDIR_P) "$(DESTDIR)$(pkgincludedir)" || exit 1; \
- fi; \
- for p in $$list; do \
- if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
- echo "$$d$$p"; \
- done | $(am__base_list) | \
- while read files; do \
- echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(pkgincludedir)'"; \
- $(INSTALL_HEADER) $$files "$(DESTDIR)$(pkgincludedir)" || exit $$?; \
- done
-
-uninstall-pkgincludeHEADERS:
- @$(NORMAL_UNINSTALL)
- @list='$(pkginclude_HEADERS)'; test -n "$(pkgincludedir)" || list=; \
- files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
- dir='$(DESTDIR)$(pkgincludedir)'; $(am__uninstall_files_from_dir)
-
-ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
- list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
- unique=`for i in $$list; do \
- if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
- done | \
- $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
- END { if (nonempty) { for (i in files) print i; }; }'`; \
- mkid -fID $$unique
-tags: TAGS
-
-TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
- $(TAGS_FILES) $(LISP)
- set x; \
- here=`pwd`; \
- list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
- unique=`for i in $$list; do \
- if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
- done | \
- $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
- END { if (nonempty) { for (i in files) print i; }; }'`; \
- shift; \
- if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
- test -n "$$unique" || unique=$$empty_fix; \
- if test $$# -gt 0; then \
- $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
- "$$@" $$unique; \
- else \
- $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
- $$unique; \
- fi; \
- fi
-ctags: CTAGS
-CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
- $(TAGS_FILES) $(LISP)
- list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
- unique=`for i in $$list; do \
- if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
- done | \
- $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
- END { if (nonempty) { for (i in files) print i; }; }'`; \
- test -z "$(CTAGS_ARGS)$$unique" \
- || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
- $$unique
-
-GTAGS:
- here=`$(am__cd) $(top_builddir) && pwd` \
- && $(am__cd) $(top_srcdir) \
- && gtags -i $(GTAGS_ARGS) "$$here"
-
-distclean-tags:
- -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
-
-distdir: $(DISTFILES)
- @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
- topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
- list='$(DISTFILES)'; \
- dist_files=`for file in $$list; do echo $$file; done | \
- sed -e "s|^$$srcdirstrip/||;t" \
- -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
- case $$dist_files in \
- */*) $(MKDIR_P) `echo "$$dist_files" | \
- sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
- sort -u` ;; \
- esac; \
- for file in $$dist_files; do \
- if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
- if test -d $$d/$$file; then \
- dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
- if test -d "$(distdir)/$$file"; then \
- find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
- fi; \
- if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
- cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
- find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
- fi; \
- cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
- else \
- test -f "$(distdir)/$$file" \
- || cp -p $$d/$$file "$(distdir)/$$file" \
- || exit 1; \
- fi; \
- done
-check-am: all-am
-check: check-am
-all-am: Makefile $(LTLIBRARIES) $(HEADERS)
-installdirs:
- for dir in "$(DESTDIR)$(libdir)" "$(DESTDIR)$(pkgincludedir)"; do \
- test -z "$$dir" || $(MKDIR_P) "$$dir"; \
- done
-install: install-am
-install-exec: install-exec-am
-install-data: install-data-am
-uninstall: uninstall-am
-
-install-am: all-am
- @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
-
-installcheck: installcheck-am
-install-strip:
- if test -z '$(STRIP)'; then \
- $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
- install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
- install; \
- else \
- $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
- install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
- "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
- fi
-mostlyclean-generic:
-
-clean-generic:
-
-distclean-generic:
- -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
- -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
-
-maintainer-clean-generic:
- @echo "This command is intended for maintainers to use"
- @echo "it deletes files that may require special tools to rebuild."
-clean: clean-am
-
-clean-am: clean-generic clean-libLTLIBRARIES clean-libtool \
- mostlyclean-am
-
-distclean: distclean-am
- -rm -f Makefile
-distclean-am: clean-am distclean-compile distclean-generic \
- distclean-tags
-
-dvi: dvi-am
-
-dvi-am:
-
-html: html-am
-
-html-am:
-
-info: info-am
-
-info-am:
-
-install-data-am: install-pkgincludeHEADERS
-
-install-dvi: install-dvi-am
-
-install-dvi-am:
-
-install-exec-am: install-libLTLIBRARIES
-
-install-html: install-html-am
-
-install-html-am:
-
-install-info: install-info-am
-
-install-info-am:
-
-install-man:
-
-install-pdf: install-pdf-am
-
-install-pdf-am:
-
-install-ps: install-ps-am
-
-install-ps-am:
-
-installcheck-am:
-
-maintainer-clean: maintainer-clean-am
- -rm -f Makefile
-maintainer-clean-am: distclean-am maintainer-clean-generic
-
-mostlyclean: mostlyclean-am
-
-mostlyclean-am: mostlyclean-compile mostlyclean-generic \
- mostlyclean-libtool
-
-pdf: pdf-am
-
-pdf-am:
-
-ps: ps-am
-
-ps-am:
-
-uninstall-am: uninstall-libLTLIBRARIES uninstall-pkgincludeHEADERS
-
-.MAKE: install-am install-strip
-
-.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \
- clean-libLTLIBRARIES clean-libtool ctags distclean \
- distclean-compile distclean-generic distclean-libtool \
- distclean-tags distdir dvi dvi-am html html-am info info-am \
- install install-am install-data install-data-am install-dvi \
- install-dvi-am install-exec install-exec-am install-html \
- install-html-am install-info install-info-am \
- install-libLTLIBRARIES install-man install-pdf install-pdf-am \
- install-pkgincludeHEADERS install-ps install-ps-am \
- install-strip installcheck installcheck-am installdirs \
- maintainer-clean maintainer-clean-generic mostlyclean \
- mostlyclean-compile mostlyclean-generic mostlyclean-libtool \
- pdf pdf-am ps ps-am tags uninstall uninstall-am \
- uninstall-libLTLIBRARIES uninstall-pkgincludeHEADERS
-
-
-# Tell versions [3.59,3.63) of GNU make to not export all variables.
-# Otherwise a system limit (for SysV at least) may be exceeded.
-.NOEXPORT:
diff --git a/interfaces/sage/linbox-sage.C b/interfaces/sage/linbox-sage.C
index c117ab6..7fa31f3 100644
--- a/interfaces/sage/linbox-sage.C
+++ b/interfaces/sage/linbox-sage.C
@@ -25,25 +25,22 @@
*/
#include <iostream>
-#include <gmp.h>
#include <cstdlib>
#include <vector>
#include <list>
-
-#include "linbox-sage.h"
-
+#include "linbox/linbox-config.h"
#include "linbox/util/commentator.h"
-#include "linbox/blackbox/sparse.h"
+#include "linbox/matrix/sparse-matrix.h"
//#include "linbox/element/givaro-polynomial.h"
-#include "linbox/matrix/blas-matrix.h"
-#include "linbox/matrix/sparse.h"
+#include "linbox/matrix/dense-matrix.h"
+#include "linbox/matrix/sparse-matrix.h"
#include "linbox/vector/sparse.h"
-#include "linbox/algorithms/blas-domain.h"
+#include "linbox/matrix/matrix-domain.h"
#include "linbox/algorithms/echelon-form.h"
#include "linbox/algorithms/gauss.h"
#include "linbox/algorithms/smith-form-adaptive.h"
@@ -58,7 +55,11 @@
#include "linbox/integer.h"
#include "linbox/field/gmp-rational.h"
#include "linbox/ring/givaro-polynomial.h"
-#include "linbox/field/modular.h"
+#include "givaro/modular.h"
+
+#include <gmp.h>
+
+#include "linbox-sage.h"
using namespace LinBox;
@@ -66,15 +67,13 @@ using namespace LinBox;
dense modulo Z/nZ
*************************************************************************/
-//we are using Modular<double> here as it seems to be best supported
+//we are using Givaro::Modular<double> here as it seems to be best supported
/* NOTE: There are many echelon form functions, possible base rings, etc. Strangely,
most don't build. This combination below does though.
*/
-void linbox_modn_dense_delete_array_double(double * f)
-{
- delete[] f;
+void linbox_modn_dense_delete_array_double(double * f) {delete[] f;
}
void linbox_modn_dense_delete_array_float(float * f) {delete[] f;
}
@@ -83,7 +82,7 @@ template <class Element>
unsigned long int linbox_modn_dense_echelonize (Element modulus, Element* matrix,
size_t nrows, size_t ncols)
{
- Modular<Element> F(modulus);
+ Givaro::Modular<Element> F(modulus);
size_t * P=new size_t[ncols];
size_t * Q=new size_t[nrows];
@@ -117,7 +116,7 @@ template<class Element>
unsigned long int linbox_modn_dense_rank (Element modulus, Element* matrix, size_t nrows, size_t ncols)
{
- Modular<Element> F (modulus);
+ Givaro::Modular<Element> F (modulus);
Element * Ad = new Element [nrows*ncols];
for (size_t i=0; i< nrows; ++i)
for (size_t j = 0; j < ncols; ++j)
@@ -141,7 +140,7 @@ template<class Element>
Element linbox_modn_dense_det(Element modulus,Element*matrix,size_t nrows,size_t ncols)
{
- Modular<Element> F (modulus);
+ Givaro::Modular<Element> F (modulus);
Element * Ad = new Element [nrows*ncols];
for (size_t i=0; i< nrows; ++i)
for (size_t j = 0; j < ncols; ++j)
@@ -164,10 +163,10 @@ template<class Element>
Element* linbox_modn_dense_minpoly (Element modulus, Element ** mp, size_t* degree,
size_t n, Element *matrix)
{
- typedef Modular<Element> Field;
+ typedef Givaro::Modular<Element> Field;
typedef std::vector<Element> Polynomial;
- Modular<Element> F(modulus);
+ Givaro::Modular<Element> F(modulus);
// Warning: super sketchy memory alloc here!!!!
std::vector<Element> *minP=new std::vector<Element>(n);
Element * X = new Element[n*(n+1)];
@@ -213,7 +212,7 @@ template<class Element>
Element* linbox_modn_dense_charpoly (Element modulus, Element *& cp, size_t n, Element *matrix)
{
- Modular<Element> F(modulus);
+ Givaro::Modular<Element> F(modulus);
// FIXME: check the memory management: better to allocate mp in sage
std::list<std::vector<Element> > P_list;
@@ -256,7 +255,7 @@ unsigned long linbox_modn_dense_col_rankprofile_submatrix_indices (Element modul
size_t nrows,
size_t ncols)
{
- Modular<Element> F (modulus);
+ Givaro::Modular<Element> F (modulus);
Element * Ad = new Element [nrows*ncols];
for (size_t i=0; i< nrows; ++i)
for (size_t j = 0; j < ncols; ++j)
@@ -283,7 +282,7 @@ unsigned long linbox_modn_dense_col_rankprofile_submatrix (Element modulus,
size_t& rank,
size_t nrows, size_t ncols)
{
- Modular<Element> F (modulus);
+ Givaro::Modular<Element> F (modulus);
//FIXME: check the memory managmenent
Element * Ad = new Element [nrows*ncols];
for (size_t i=0; i< nrows; ++i)
@@ -309,7 +308,7 @@ Element* linbox_modn_dense_matrix_matrix_multiply (Element modulus, Element *ans
size_t m, size_t n, size_t k)
{
- Modular<Element> F(modulus);
+ Givaro::Modular<Element> F(modulus);
FFLAS::fgemm (F, FFLAS::FflasNoTrans, FFLAS::FflasNoTrans, m,n,k, 1.0,
A, k, B, n, 0.0, ans, n);
@@ -333,7 +332,7 @@ Element * linbox_modn_dense_matrix_matrix_general_multiply(Element modulus,
Element *A, Element *B,
size_t m, size_t n, size_t k)
{
- Modular<Element> F(modulus);
+ Givaro::Modular<Element> F(modulus);
FFLAS::fgemm (F, FFLAS::FflasNoTrans, FFLAS::FflasNoTrans, m,n,k, alpha,
A, k, B, n, beta,ans, n);
return ans;
@@ -352,7 +351,7 @@ EXTERN float* linbox_modn_dense_matrix_matrix_general_multiply_float (float modu
dense over ZZ
*************************************************************************/
-typedef PID_integer IntegerRing;
+typedef Givaro::ZRing<Integer> IntegerRing;
template <class Field, class Polynomial>
void printPolynomial (const Field &F, const Polynomial &v)
@@ -368,7 +367,7 @@ void printPolynomial (const Field &F, const Polynomial &v)
SpyInteger spy;
typedef GivPolynomialRing<IntegerRing, Givaro::Dense> IntPolRing;
-void get_matrix(BlasMatrix<IntegerRing> &A, mpz_t** matrix)
+void get_matrix(DenseMatrix<IntegerRing> &A, mpz_t** matrix)
{
size_t i, j;
@@ -382,7 +381,7 @@ void get_matrix(BlasMatrix<IntegerRing> &A, mpz_t** matrix)
}
template<class Field>
-void set_matrix(mpz_t** matrix, BlasMatrix<Field>& A)
+void set_matrix(mpz_t** matrix, DenseMatrix<Field>& A)
{
size_t i, j;
for (i=0; i < A.rowdim(); ++i) {
@@ -392,6 +391,7 @@ void set_matrix(mpz_t** matrix, BlasMatrix<Field>& A)
}
}
+
// void linbox_integer_dense_minpoly_hacked(mpz_t* *mp, size_t* degree, size_t n, mpz_t** matrix, int do_minpoly)
// {
// /* We program around a bizarre bug in linbox, where minpoly doesn't work
@@ -406,7 +406,7 @@ void set_matrix(mpz_t** matrix, BlasMatrix<Field>& A)
// }
// IntegerRing ZZ;
-// BlasMatrix<IntegerRing> A(ZZ, m, m);
+// DenseMatrix<IntegerRing> A(ZZ, m, m);
// get_matrix<IntegerRing>(A, matrix);
@@ -455,7 +455,7 @@ void set_matrix(mpz_t** matrix, BlasMatrix<Field>& A)
void linbox_integer_dense_charpoly(mpz_t* &mp, size_t& degree, size_t n, mpz_t** matrix)
{
IntegerRing ZZ;
- BlasMatrix<IntegerRing> A(ZZ, n, n);
+ DenseMatrix<IntegerRing> A(ZZ, n, n);
get_matrix(A, matrix);
IntPolRing::Element m_A;
@@ -473,7 +473,7 @@ void linbox_integer_dense_charpoly(mpz_t* &mp, size_t& degree, size_t n, mpz_t**
void linbox_integer_dense_minpoly(mpz_t* &mp, size_t& degree, size_t n, mpz_t** matrix)
{
IntegerRing ZZ;
- BlasMatrix<IntegerRing> A(ZZ, n, n);
+ DenseMatrix<IntegerRing> A(ZZ, n, n);
get_matrix(A, matrix);
IntPolRing::Element m_A;
@@ -496,9 +496,9 @@ int linbox_integer_dense_matrix_matrix_multiply(mpz_t** ans, mpz_t **A, mpz_t **
size_t A_nr, size_t A_nc,size_t B_nc)
{
IntegerRing ZZ;
- BlasMatrix<IntegerRing> AA(ZZ, A_nr, A_nc);
- BlasMatrix<IntegerRing> BB(ZZ, A_nc, B_nc);
- BlasMatrix<IntegerRing> CC(ZZ, A_nr, B_nc);
+ DenseMatrix<IntegerRing> AA(ZZ, A_nr, A_nc);
+ DenseMatrix<IntegerRing> BB(ZZ, A_nc, B_nc);
+ DenseMatrix<IntegerRing> CC(ZZ, A_nr, B_nc);
get_matrix(AA, A);
get_matrix(BB, B);
@@ -515,7 +515,7 @@ unsigned long linbox_integer_dense_rank(mpz_t** matrix, size_t nrows,
size_t ncols)
{
IntegerRing ZZ;
- BlasMatrix<IntegerRing> A(ZZ, nrows, ncols);
+ DenseMatrix<IntegerRing> A(ZZ, nrows, ncols);
get_matrix(A, matrix);
unsigned long r;
rank(r, A);
@@ -529,7 +529,7 @@ void linbox_integer_dense_det(mpz_t ans, mpz_t** matrix, size_t nrows,
commentator().setMaxDepth (0);
IntegerRing ZZ;
- BlasMatrix<IntegerRing> A ( ZZ, nrows, ncols);
+ DenseMatrix<IntegerRing> A ( ZZ, nrows, ncols);
get_matrix(A, matrix);
IntegerRing::Element d;
@@ -538,15 +538,15 @@ void linbox_integer_dense_det(mpz_t ans, mpz_t** matrix, size_t nrows,
}
#ifdef __LINBOX_HAVE_NTL
-BlasMatrix<NTL_ZZ> new_matrix_integer_dense_ntl(mpz_t** matrix, size_t nrows, size_t ncols)
+DenseMatrix<NTL_ZZ> new_matrix_integer_dense_ntl(mpz_t** matrix, size_t nrows, size_t ncols)
{
NTL_ZZ Z;
- BlasMatrix<NTL_ZZ> A (Z,nrows, ncols);
+ DenseMatrix<NTL_ZZ> A (Z,nrows, ncols);
size_t i, j;
for (i=0; i < nrows; ++i) {
for (j=0; j < ncols; ++j) {
NTL_ZZ::Element t;
- PID_integer::Element s;
+ Givaro::ZRing<Integer>::Element s;
mpz_set(spy.get_mpz(s), matrix[i][j]);
Z.init(t, s);
A.setEntry(i, j, t);
@@ -561,7 +561,7 @@ void linbox_integer_dense_double_det (mpz_t ans1, mpz_t ans2, mpz_t **a, mpz_t
{
IntegerRing ZZ;
- BlasMatrix<IntegerRing> A(ZZ, n+1, n);
+ DenseMatrix<IntegerRing> A(ZZ, n+1, n);
size_t i, j;
for (i=0; i < n-1; ++i) {
for (j=0; j < n; ++j) {
@@ -571,13 +571,13 @@ void linbox_integer_dense_double_det (mpz_t ans1, mpz_t ans2, mpz_t **a, mpz_t
}
}
for (j=0; j < n; ++j) {
- PID_integer::Element t;
+ Givaro::ZRing<Integer>::Element t;
mpz_set(spy.get_mpz(t), b[0][j]);
A.setEntry (n-1, j, t);
mpz_set (spy.get_mpz(t), c[0][j]);
A.setEntry (n, j, t);
}
- PID_integer::Element d1,d2;
+ Givaro::ZRing<Integer>::Element d1,d2;
doubleDet (d1, d2, A, proof);
mpz_set(ans1, spy.get_mpz(d1));
mpz_set(ans2, spy.get_mpz(d2));
@@ -591,7 +591,7 @@ void linbox_integer_dense_smithform(mpz_t **v,
{
typedef NTL_ZZ Ints;
Ints Z;
- BlasMatrix<Ints> M(new_matrix_integer_dense_ntl(matrix, nrows, ncols));
+ DenseMatrix<Ints> M(new_matrix_integer_dense_ntl(matrix, nrows, ncols));
std::vector<integer> w(ncols);
SmithFormAdaptive::smithForm(w, M);
@@ -618,30 +618,34 @@ struct c_vector_modint_linbox {
};
typedef unsigned int mod_int;
-typedef Modular<unsigned int> GFp;
+typedef Givaro::Modular<unsigned int> GFp;
typedef GFp::Element GFpElement;
typedef std::vector <std::pair <size_t, GFpElement> > SparseSeqVectorGFp;
-typedef SparseMatrix<GFp, SparseSeqVectorGFp> SparseMatrixGFp;
+typedef SparseMatrix<GFp, VectorTraits<SparseSeqVectorGFp>::SparseFormat> SparseMatrixGFp;
-static SparseMatrixGFp linbox_new_modn_sparse_matrix(mod_int modulus, size_t numrows, size_t numcols, void *rows)
+SparseMatrixGFp* linbox_new_modn_sparse_matrix(mod_int modulus, size_t numrows, size_t numcols, void *rows)
{
- GFp F(modulus);
- SparseMatrixGFp M(F, numrows, numcols);
+ GFp *F=new GFp(modulus);
+ SparseMatrixGFp* M=new SparseMatrixGFp(*F, numrows, numcols);
struct c_vector_modint_linbox *A = static_cast<struct c_vector_modint_linbox *>(rows);
for(size_t i = 0; i < numrows; ++i) {
for(size_t j = 0; j < A[i].num_nonzero; ++j) {
- M.setEntry(i, A[i].positions[j], A[i].entries[j]);
+ M->setEntry(i, A[i].positions[j], A[i].entries[j]);
}
}
return M;
}
+void linbox_delete_modn_sparse_matrix (SparseMatrixGFp * A) {
+ const GFp * F = &A->field();
+ delete A;
+ delete F;
+}
+
static std::vector<GFpElement> linbox_new_modn_sparse_vector(mod_int modulus, size_t len, void *_vec)
{
- GFp F(modulus);
-
std::vector<GFpElement> A(len);
if (_vec==NULL) {
@@ -659,18 +663,18 @@ unsigned long linbox_modn_sparse_matrix_rank(mod_int modulus,
size_t numrows, size_t numcols,
void *rows, int gauss)
{
- GFp F(modulus);
unsigned long M_rank;
GFpElement M_det;
- GaussDomain<GFp> dom(F);
- SparseMatrixGFp M( linbox_new_modn_sparse_matrix(modulus, numrows, numcols, rows) );
+ SparseMatrixGFp *M = linbox_new_modn_sparse_matrix(modulus, numrows, numcols, rows) ;
+ const GFp &F = M->field();
+ GaussDomain<GFp> dom(F);
if(!gauss) {
- dom.InPlaceLinearPivoting(M_rank, M_det, M, numrows, numcols);
+ dom.InPlaceLinearPivoting(M_rank, M_det, *M, numrows, numcols);
}
else {
- dom.NoReordering(M_rank, M_det, M, numrows, numcols);
+ dom.NoReordering(M_rank, M_det, *M, numrows, numcols);
}
//*pivots = (int*)calloc(sizeof(int), dom.pivots.size());
@@ -679,7 +683,7 @@ unsigned long linbox_modn_sparse_matrix_rank(mod_int modulus,
// for(std::vector<int>::const_iterator i= dom.pivots.begin(); i!= dom.pivots.end(); ++i, ++j){
// (*pivots)[j] = *i;
// }
-
+ linbox_delete_modn_sparse_matrix(M);
return M_rank;
}
@@ -687,30 +691,34 @@ std::vector<mod_int> linbox_modn_sparse_matrix_solve(mod_int p, size_t numrows,
void *_a, void *b, int method)
{
// solve ax = b, for x, a matrix, b vector, x vector
- GFp F(p);
- std::vector<mod_int> X( numrows);
- std::vector<mod_int> B( linbox_new_modn_sparse_vector(p, numcols, b));
+ SparseMatrixGFp *A =linbox_new_modn_sparse_matrix(p, numrows, numcols, _a);
+
+ const GFp & F = A->field();
- SparseMatrixGFp A(linbox_new_modn_sparse_matrix(p, numrows, numcols, _a));
+ DenseVector<GFp> X(F, numrows);
+ DenseVector<GFp> B(F, linbox_new_modn_sparse_vector(p, numcols, b) );
switch(method) {
case 1:
- solve(X, A, B, Method::BlasElimination());
+ solve(X, *A, B, Method::BlasElimination());
break;
case 2:
- solve(X, A, B, Method::Blackbox());
+ solve(X, *A, B, Method::Blackbox());
break;
case 3:
- solve(X, A, B, Method::Wiedemann());
+ solve(X, *A, B, Method::Wiedemann());
break;
default:
- solve(X, A, B);
+ solve(X, *A, B);
}
- return X;
+
+ linbox_delete_modn_sparse_matrix(A);
+
+ return X.refRep();
}
// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
diff --git a/interfaces/sage/linbox-sage.h b/interfaces/sage/linbox-sage.h
index e249228..d521b02 100644
--- a/interfaces/sage/linbox-sage.h
+++ b/interfaces/sage/linbox-sage.h
@@ -25,9 +25,9 @@
*/
#ifndef __LINBOX_sage_H
-#define __LINBOX_sagE_H
+#define __LINBOX_sage_H
-#include<stddef.h>
+#include <stddef.h>
#include <cstdlib>
#include <vector>
diff --git a/linbox-config.in b/linbox-config.in
index b27dbd9..8bfd627 100644
--- a/linbox-config.in
+++ b/linbox-config.in
@@ -1,4 +1,4 @@
-#! /bin/sh
+#! /bin/bash
# Copyright (c) the LinBox group
# This file is part of LinBox (and probably stolen here and there)
@@ -19,8 +19,6 @@ cflags=false
libs=false
-
-
usage()
{
cat <<EOF
@@ -30,7 +28,8 @@ Known values for OPTION are:
--prefix show Linbox installation prefix
--libs print library linking information
- --cflags print pre-processor and compiler flags
+ --cflags print pre-processor flags
+ --cflags-full print pre-processor and compiler flags
--help display this help and exit
--version output version information string (eg @VERSION@)
--decimal-version output version information number (eg $decvr)
@@ -74,11 +73,15 @@ while test $# -gt 0; do
;;
--cflags)
- echo -n " -I${includedir} @GMP_CFLAGS@ @NTL_CFLAGS@ @GIVARO_CFLAGS@ @SACLIB_CFLAGS@ @LIDIA_CFLAGS@"
+ echo -n " -I${includedir} @FFLAS_FFPACK_CFLAGS@ @NTL_CFLAGS@ @SACLIB_CFLAGS@"
+ ;;
+
+ --cflags-full)
+ echo -n " -I${includedir} @CXXFLAGS@"
;;
--libs)
- echo -n " -L${libdir} -llinbox @LIDIA_LIBS@ @NTL_LIBS@ @GIVARO_LIBS@ @SACLIB_LIBS@ @GMP_LIBS@ @BLAS_LIBS@"
+ echo -n " -L${libdir} -llinbox @FFLAS_FFPACK_LIBS@ @NTL_LIBS@ @SACLIB_LIBS@ @IML_LIBS@ @MPFR_LIBS@ @FPLLL_LIBS@ @FPLLL_LIBS@ @OCL_LIBS@"
;;
*)
diff --git a/linbox.pc.in b/linbox.pc.in
new file mode 100644
index 0000000..6a95e29
--- /dev/null
+++ b/linbox.pc.in
@@ -0,0 +1,14 @@
+/------------------ linbox.pc ------------------------
+prefix=@prefix@
+exec_prefix=@prefix@/bin
+libdir=@prefix@/lib
+includedir=@prefix@/include
+
+Name: linbox
+Description: Exact Linear Algebra library
+URL: http://linbox-team.github.io/linbox/
+Version: @VERSION@
+Requires: fflas-ffpack >= 2.2.0
+Libs: -L${libdir} -llinbox @LINBOXSAGE_LIBS@ @NTL_LIBS@ @MPFR_LIBS@ @FPLLL_LIBS@ @IML_LIBS@ @FLINT_LIBS@ @OCL_LIBS@
+Cflags: @DEFAULT_CFLAGS@ -DDISABLE_COMMENTATOR -I${includedir}/linbox @NTL_CFLAGS@ @MPFR_CFLAGS@ @FPLLL_CFLAGS@ @IML_CFLAGS@ @FLINT_CFLAGS@
+\-------------------------------------------------------
diff --git a/linbox/Makefile.am b/linbox/Makefile.am
index 405658c..b8c3d59 100644
--- a/linbox/Makefile.am
+++ b/linbox/Makefile.am
@@ -19,42 +19,34 @@
# ========LICENCE========
#/
-AM_CPPFLAGS=-I$(top_srcdir)
+AM_CPPFLAGS= -I$(top_srcdir)/linbox $(DEPS_CFLAGS)
+LDADD = $(DEPS_LIBS) $(LDFLAGS)
-SUBDIRS=util element field randiter vector matrix blackbox switch algorithms solutions ring
+#AM_CPPFLAGS = -I at includedir@ -I$(top_srcdir)/linbox -I$(top_srcdir) $(DEFCPPFLAGS) $(OPTFLAGS) $(FFLAS_FFPACK_CFLAGS) $(NTL_CFLAGS) $(MPFR_CFLAGS) $(FPLLL_CFLAGS) $(IML_CFLAGS) $(FLINT_CFLAGS) $(PARFLAGS)
+#LDADD = $(FFLAS_FFPACK_LIBS) $(NTL_LIBS) $(MPFR_LIBS) $(FPLLL_LIBS) $(IML_LIBS) $(FLINT_LIBS) $(OCL_LIBS)
-BASIC_HDRS = \
- integer.h \
- config-blas.h linbox-config.h
+SUBDIRS=util element field randiter vector matrix blackbox algorithms solutions ring
-NTL_HDRS =
-GIVARO_HDRS =
+BASIC_HDRS = \
+ linbox-config.h \
+ config.h \
+ config-blas.h \
+ integer.h \
+ linbox-tags.h
-LIDIA_HDRS =
+NTL_HDRS =
if LINBOX_HAVE_NTL
USE_NTL_HDRS = $(NTL_HDRS)
endif
-if LINBOX_HAVE_GIVARO
-USE_GIVARO_HDRS = $(GIVARO_HDRS)
-endif
-
-if LINBOX_HAVE_LIDIA
-USE_LIDIA_HDRS = $(LIDIA_HDRS)
-endif
-
pkginclude_HEADERS = \
$(BASIC_HDRS) \
- $(USE_NTL_HDRS) \
- $(USE_GIVARO_HDRS) \
- $(USE_LIDIA_HDRS)
+ $(USE_NTL_HDRS)
EXTRA_DIST = \
$(NTL_HDRS) \
- $(GIVARO_HDRS) \
- $(LIDIA_HDRS) \
linbox.doxy \
archetypes.doxy
@@ -65,4 +57,12 @@ liblinbox_la_SOURCES = dummy.C
liblinbox_la_LIBADD = \
util/libutil.la \
randiter/libranditer.la \
- algorithms/libalgorithms.la
+ algorithms/libalgorithms.la \
+ $(MPFR_LIBS) $(IML_LIBS) $(OCL_LIBS)
+
+#Cygwin ?
+liblinbox_la_LDFLAGS = $(DEPS_LIBS) $(LDFLAGS) -no-undefined
+
+
+# $(top_srcdir)/benchmarks/libbenchmarks.la \
+#
diff --git a/linbox/Makefile.in b/linbox/Makefile.in
deleted file mode 100644
index eca8f1d..0000000
--- a/linbox/Makefile.in
+++ /dev/null
@@ -1,825 +0,0 @@
-# Makefile.in generated by automake 1.11.5 from Makefile.am.
-# @configure_input@
-
-# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software
-# Foundation, Inc.
-# This Makefile.in is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
-# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
-# PARTICULAR PURPOSE.
-
- at SET_MAKE@
-
-# Copyright (c) 2010 the LinBox group
-# This file is part of LinBox
-# ========LICENCE========
-# This file is part of the library LinBox.
-#
-# LinBox is free software: you can redistribute it and/or modify
-# it under the terms of the GNU Lesser General Public
-# License as published by the Free Software Foundation; either
-# version 2.1 of the License, or (at your option) any later version.
-#
-# This library 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
-# Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public
-# License along with this library; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
-# ========LICENCE========
-#/
-
-
-VPATH = @srcdir@
-am__make_dryrun = \
- { \
- am__dry=no; \
- case $$MAKEFLAGS in \
- *\\[\ \ ]*) \
- echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \
- | grep '^AM OK$$' >/dev/null || am__dry=yes;; \
- *) \
- for am__flg in $$MAKEFLAGS; do \
- case $$am__flg in \
- *=*|--*) ;; \
- *n*) am__dry=yes; break;; \
- esac; \
- done;; \
- esac; \
- test $$am__dry = yes; \
- }
-pkgdatadir = $(datadir)/@PACKAGE@
-pkgincludedir = $(includedir)/@PACKAGE@
-pkglibdir = $(libdir)/@PACKAGE@
-pkglibexecdir = $(libexecdir)/@PACKAGE@
-am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
-install_sh_DATA = $(install_sh) -c -m 644
-install_sh_PROGRAM = $(install_sh) -c
-install_sh_SCRIPT = $(install_sh) -c
-INSTALL_HEADER = $(INSTALL_DATA)
-transform = $(program_transform_name)
-NORMAL_INSTALL = :
-PRE_INSTALL = :
-POST_INSTALL = :
-NORMAL_UNINSTALL = :
-PRE_UNINSTALL = :
-POST_UNINSTALL = :
-build_triplet = @build@
-host_triplet = @host@
-subdir = linbox
-DIST_COMMON = $(pkginclude_HEADERS) $(srcdir)/Makefile.am \
- $(srcdir)/Makefile.in
-ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-am__aclocal_m4_deps = $(top_srcdir)/macros/aclocal-include.m4 \
- $(top_srcdir)/macros/config-header.m4 \
- $(top_srcdir)/macros/debug.m4 \
- $(top_srcdir)/macros/expat-check.m4 \
- $(top_srcdir)/macros/fflas-ffpack-check.m4 \
- $(top_srcdir)/macros/fplll-check.m4 \
- $(top_srcdir)/macros/givaro-check.m4 \
- $(top_srcdir)/macros/gmp-check.m4 \
- $(top_srcdir)/macros/iml-check.m4 \
- $(top_srcdir)/macros/lapack-check.m4 \
- $(top_srcdir)/macros/libtool.m4 \
- $(top_srcdir)/macros/lidia-check.m4 \
- $(top_srcdir)/macros/linbox-benchmark.m4 \
- $(top_srcdir)/macros/linbox-doc.m4 \
- $(top_srcdir)/macros/linbox-misc.m4 \
- $(top_srcdir)/macros/linbox-opt.m4 \
- $(top_srcdir)/macros/ltoptions.m4 \
- $(top_srcdir)/macros/ltsugar.m4 \
- $(top_srcdir)/macros/ltversion.m4 \
- $(top_srcdir)/macros/lt~obsolete.m4 \
- $(top_srcdir)/macros/m4ri-check.m4 \
- $(top_srcdir)/macros/m4rie-check.m4 \
- $(top_srcdir)/macros/maple-check.m4 \
- $(top_srcdir)/macros/mpfr-check.m4 \
- $(top_srcdir)/macros/ntl-check.m4 \
- $(top_srcdir)/macros/saclib-check.m4 \
- $(top_srcdir)/macros/sage-check.m4 $(top_srcdir)/configure.ac
-am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
- $(ACLOCAL_M4)
-mkinstalldirs = $(install_sh) -d
-CONFIG_HEADER = $(top_builddir)/config.h
-CONFIG_CLEAN_FILES =
-CONFIG_CLEAN_VPATH_FILES =
-am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
-am__vpath_adj = case $$p in \
- $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
- *) f=$$p;; \
- esac;
-am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
-am__install_max = 40
-am__nobase_strip_setup = \
- srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
-am__nobase_strip = \
- for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
-am__nobase_list = $(am__nobase_strip_setup); \
- for p in $$list; do echo "$$p $$p"; done | \
- sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
- $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
- if (++n[$$2] == $(am__install_max)) \
- { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
- END { for (dir in files) print dir, files[dir] }'
-am__base_list = \
- sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
- sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
-am__uninstall_files_from_dir = { \
- test -z "$$files" \
- || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \
- || { echo " ( cd '$$dir' && rm -f" $$files ")"; \
- $(am__cd) "$$dir" && rm -f $$files; }; \
- }
-am__installdirs = "$(DESTDIR)$(libdir)" "$(DESTDIR)$(pkgincludedir)"
-LTLIBRARIES = $(lib_LTLIBRARIES)
-liblinbox_la_DEPENDENCIES = util/libutil.la randiter/libranditer.la \
- algorithms/libalgorithms.la
-am_liblinbox_la_OBJECTS = dummy.lo
-liblinbox_la_OBJECTS = $(am_liblinbox_la_OBJECTS)
-DEFAULT_INCLUDES = -I. at am__isrc@ -I$(top_builddir)
-depcomp =
-am__depfiles_maybe =
-CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
- $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
-LTCXXCOMPILE = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
- --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
- $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
-CXXLD = $(CXX)
-CXXLINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
- --mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \
- $(LDFLAGS) -o $@
-SOURCES = $(liblinbox_la_SOURCES)
-DIST_SOURCES = $(liblinbox_la_SOURCES)
-RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \
- html-recursive info-recursive install-data-recursive \
- install-dvi-recursive install-exec-recursive \
- install-html-recursive install-info-recursive \
- install-pdf-recursive install-ps-recursive install-recursive \
- installcheck-recursive installdirs-recursive pdf-recursive \
- ps-recursive uninstall-recursive
-am__can_run_installinfo = \
- case $$AM_UPDATE_INFO_DIR in \
- n|no|NO) false;; \
- *) (install-info --version) >/dev/null 2>&1;; \
- esac
-HEADERS = $(pkginclude_HEADERS)
-RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \
- distclean-recursive maintainer-clean-recursive
-AM_RECURSIVE_TARGETS = $(RECURSIVE_TARGETS:-recursive=) \
- $(RECURSIVE_CLEAN_TARGETS:-recursive=) tags TAGS ctags CTAGS \
- distdir
-ETAGS = etags
-CTAGS = ctags
-DIST_SUBDIRS = $(SUBDIRS)
-DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
-am__relativize = \
- dir0=`pwd`; \
- sed_first='s,^\([^/]*\)/.*$$,\1,'; \
- sed_rest='s,^[^/]*/*,,'; \
- sed_last='s,^.*/\([^/]*\)$$,\1,'; \
- sed_butlast='s,/*[^/]*$$,,'; \
- while test -n "$$dir1"; do \
- first=`echo "$$dir1" | sed -e "$$sed_first"`; \
- if test "$$first" != "."; then \
- if test "$$first" = ".."; then \
- dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \
- dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \
- else \
- first2=`echo "$$dir2" | sed -e "$$sed_first"`; \
- if test "$$first2" = "$$first"; then \
- dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \
- else \
- dir2="../$$dir2"; \
- fi; \
- dir0="$$dir0"/"$$first"; \
- fi; \
- fi; \
- dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \
- done; \
- reldir="$$dir2"
-ACLOCAL = @ACLOCAL@
-AMTAR = @AMTAR@
-AR = @AR@
-AUTOCONF = @AUTOCONF@
-AUTOHEADER = @AUTOHEADER@
-AUTOMAKE = @AUTOMAKE@
-AWK = @AWK@
-BLAS_CFLAGS = @BLAS_CFLAGS@
-BLAS_LIBS = @BLAS_LIBS@
-CC = @CC@
-CCNAM = @CCNAM@
-CFLAGS = @CFLAGS@
-CPPFLAGS = @CPPFLAGS@
-CXX = @CXX@
-CXXCPP = @CXXCPP@
-CXXFLAGS = @CXXFLAGS@
-CYGPATH_W = @CYGPATH_W@
-DBG = @DBG@
-DEBUG_CFLAGS = @DEBUG_CFLAGS@
-DEFAULT_CFLAGS = @DEFAULT_CFLAGS@
-DEFS = @DEFS@
-DLLTOOL = @DLLTOOL@
-DSYMUTIL = @DSYMUTIL@
-DUMPBIN = @DUMPBIN@
-ECHO_C = @ECHO_C@
-ECHO_N = @ECHO_N@
-ECHO_T = @ECHO_T@
-EGREP = @EGREP@
-EXEEXT = @EXEEXT@
-EXPAT_CFLAGS = @EXPAT_CFLAGS@
-EXPAT_LIBS = @EXPAT_LIBS@
-FFLAS_FFPACK_CFLAGS = @FFLAS_FFPACK_CFLAGS@
-FFLAS_FFPACK_LIBS = @FFLAS_FFPACK_LIBS@
-FFLAS_FFPACK_LOC = @FFLAS_FFPACK_LOC@
-FGREP = @FGREP@
-FPLLL_CFLAGS = @FPLLL_CFLAGS@
-FPLLL_LIBS = @FPLLL_LIBS@
-GIVARO_CFLAGS = @GIVARO_CFLAGS@
-GIVARO_LIBS = @GIVARO_LIBS@
-GMP_CFLAGS = @GMP_CFLAGS@
-GMP_LIBS = @GMP_LIBS@
-GMP_VERSION = @GMP_VERSION@
-GREP = @GREP@
-IML_CFLAGS = @IML_CFLAGS@
-IML_LIBS = @IML_LIBS@
-INSTALL = @INSTALL@
-INSTALL_DATA = @INSTALL_DATA@
-INSTALL_PROGRAM = @INSTALL_PROGRAM@
-INSTALL_SCRIPT = @INSTALL_SCRIPT@
-INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
-LD = @LD@
-LDFLAGS = @LDFLAGS@
-LIBOBJS = @LIBOBJS@
-LIBS = @LIBS@
-LIBTOOL = @LIBTOOL@
-LIDIA_CFLAGS = @LIDIA_CFLAGS@
-LIDIA_LIBS = @LIDIA_LIBS@
-LINBOX_BENCH_PATH = @LINBOX_BENCH_PATH@
-LINBOX_DOC_PATH = @LINBOX_DOC_PATH@
-LIPO = @LIPO@
-LN_S = @LN_S@
-LTLIBOBJS = @LTLIBOBJS@
-M4RIE_CFLAGS = @M4RIE_CFLAGS@
-M4RIE_LIBS = @M4RIE_LIBS@
-M4RI_CFLAGS = @M4RI_CFLAGS@
-M4RI_LIBS = @M4RI_LIBS@
-MAINT = @MAINT@
-MAKEINFO = @MAKEINFO@
-MANIFEST_TOOL = @MANIFEST_TOOL@
-MAPLE_CFLAGS = @MAPLE_CFLAGS@
-MAPLE_HOME = @MAPLE_HOME@
-MAPLE_LIBS = @MAPLE_LIBS@
-MAPLE_VERSION = @MAPLE_VERSION@
-MKDIR_P = @MKDIR_P@
-MPFR_CFLAGS = @MPFR_CFLAGS@
-MPFR_LIBS = @MPFR_LIBS@
-NM = @NM@
-NMEDIT = @NMEDIT@
-NTL_CFLAGS = @NTL_CFLAGS@
-NTL_LIBS = @NTL_LIBS@
-OBJDUMP = @OBJDUMP@
-OBJEXT = @OBJEXT@
-OTOOL = @OTOOL@
-OTOOL64 = @OTOOL64@
-PACKAGE = @PACKAGE@
-PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
-PACKAGE_NAME = @PACKAGE_NAME@
-PACKAGE_STRING = @PACKAGE_STRING@
-PACKAGE_TARNAME = @PACKAGE_TARNAME@
-PACKAGE_URL = @PACKAGE_URL@
-PACKAGE_VERSION = @PACKAGE_VERSION@
-PATH_SEPARATOR = @PATH_SEPARATOR@
-PROF = @PROF@
-RANLIB = @RANLIB@
-RM = @RM@
-SACLIB_CFLAGS = @SACLIB_CFLAGS@
-SACLIB_LIBS = @SACLIB_LIBS@
-SED = @SED@
-SET_MAKE = @SET_MAKE@
-SHELL = @SHELL@
-STRIP = @STRIP@
-TESTS_CFLAGS = @TESTS_CFLAGS@
-VERSION = @VERSION@
-WARN = @WARN@
-abs_builddir = @abs_builddir@
-abs_srcdir = @abs_srcdir@
-abs_top_builddir = @abs_top_builddir@
-abs_top_srcdir = @abs_top_srcdir@
-ac_ct_AR = @ac_ct_AR@
-ac_ct_CC = @ac_ct_CC@
-ac_ct_CXX = @ac_ct_CXX@
-ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
-am__leading_dot = @am__leading_dot@
-am__tar = @am__tar@
-am__untar = @am__untar@
-bindir = @bindir@
-build = @build@
-build_alias = @build_alias@
-build_cpu = @build_cpu@
-build_os = @build_os@
-build_vendor = @build_vendor@
-builddir = @builddir@
-datadir = @datadir@
-datarootdir = @datarootdir@
-docdir = @docdir@
-dvidir = @dvidir@
-exec_prefix = @exec_prefix@
-host = @host@
-host_alias = @host_alias@
-host_cpu = @host_cpu@
-host_os = @host_os@
-host_vendor = @host_vendor@
-htmldir = @htmldir@
-includedir = @includedir@
-infodir = @infodir@
-install_sh = @install_sh@
-libdir = @libdir@
-libexecdir = @libexecdir@
-localedir = @localedir@
-localstatedir = @localstatedir@
-mandir = @mandir@
-mkdir_p = @mkdir_p@
-oldincludedir = @oldincludedir@
-pdfdir = @pdfdir@
-prefix = @prefix@
-program_transform_name = @program_transform_name@
-psdir = @psdir@
-sbindir = @sbindir@
-sharedstatedir = @sharedstatedir@
-srcdir = @srcdir@
-sysconfdir = @sysconfdir@
-target_alias = @target_alias@
-top_build_prefix = @top_build_prefix@
-top_builddir = @top_builddir@
-top_srcdir = @top_srcdir@
-AM_CPPFLAGS = -I$(top_srcdir)
-SUBDIRS = util element field randiter vector matrix blackbox switch algorithms solutions ring
-BASIC_HDRS = \
- integer.h \
- config-blas.h linbox-config.h
-
-NTL_HDRS =
-GIVARO_HDRS =
-LIDIA_HDRS =
- at LINBOX_HAVE_NTL_TRUE@USE_NTL_HDRS = $(NTL_HDRS)
- at LINBOX_HAVE_GIVARO_TRUE@USE_GIVARO_HDRS = $(GIVARO_HDRS)
- at LINBOX_HAVE_LIDIA_TRUE@USE_LIDIA_HDRS = $(LIDIA_HDRS)
-pkginclude_HEADERS = \
- $(BASIC_HDRS) \
- $(USE_NTL_HDRS) \
- $(USE_GIVARO_HDRS) \
- $(USE_LIDIA_HDRS)
-
-EXTRA_DIST = \
- $(NTL_HDRS) \
- $(GIVARO_HDRS) \
- $(LIDIA_HDRS) \
- linbox.doxy \
- archetypes.doxy
-
-lib_LTLIBRARIES = liblinbox.la
-liblinbox_la_SOURCES = dummy.C
-liblinbox_la_LIBADD = \
- util/libutil.la \
- randiter/libranditer.la \
- algorithms/libalgorithms.la
-
-all: all-recursive
-
-.SUFFIXES:
-.SUFFIXES: .C .lo .o .obj
-$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps)
- @for dep in $?; do \
- case '$(am__configure_deps)' in \
- *$$dep*) \
- ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
- && { if test -f $@; then exit 0; else break; fi; }; \
- exit 1;; \
- esac; \
- done; \
- echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu --ignore-deps linbox/Makefile'; \
- $(am__cd) $(top_srcdir) && \
- $(AUTOMAKE) --gnu --ignore-deps linbox/Makefile
-.PRECIOUS: Makefile
-Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
- @case '$?' in \
- *config.status*) \
- cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
- *) \
- echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
- cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
- esac;
-
-$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
- cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-
-$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
- cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
- cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-$(am__aclocal_m4_deps):
-install-libLTLIBRARIES: $(lib_LTLIBRARIES)
- @$(NORMAL_INSTALL)
- @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \
- list2=; for p in $$list; do \
- if test -f $$p; then \
- list2="$$list2 $$p"; \
- else :; fi; \
- done; \
- test -z "$$list2" || { \
- echo " $(MKDIR_P) '$(DESTDIR)$(libdir)'"; \
- $(MKDIR_P) "$(DESTDIR)$(libdir)" || exit 1; \
- echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(libdir)'"; \
- $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(libdir)"; \
- }
-
-uninstall-libLTLIBRARIES:
- @$(NORMAL_UNINSTALL)
- @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \
- for p in $$list; do \
- $(am__strip_dir) \
- echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(libdir)/$$f'"; \
- $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(libdir)/$$f"; \
- done
-
-clean-libLTLIBRARIES:
- -test -z "$(lib_LTLIBRARIES)" || rm -f $(lib_LTLIBRARIES)
- @list='$(lib_LTLIBRARIES)'; for p in $$list; do \
- dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \
- test "$$dir" != "$$p" || dir=.; \
- echo "rm -f \"$${dir}/so_locations\""; \
- rm -f "$${dir}/so_locations"; \
- done
-liblinbox.la: $(liblinbox_la_OBJECTS) $(liblinbox_la_DEPENDENCIES) $(EXTRA_liblinbox_la_DEPENDENCIES)
- $(CXXLINK) -rpath $(libdir) $(liblinbox_la_OBJECTS) $(liblinbox_la_LIBADD) $(LIBS)
-
-mostlyclean-compile:
- -rm -f *.$(OBJEXT)
-
-distclean-compile:
- -rm -f *.tab.c
-
-.C.o:
- $(CXXCOMPILE) -c -o $@ $<
-
-.C.obj:
- $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
-
-.C.lo:
- $(LTCXXCOMPILE) -c -o $@ $<
-
-mostlyclean-libtool:
- -rm -f *.lo
-
-clean-libtool:
- -rm -rf .libs _libs
-install-pkgincludeHEADERS: $(pkginclude_HEADERS)
- @$(NORMAL_INSTALL)
- @list='$(pkginclude_HEADERS)'; test -n "$(pkgincludedir)" || list=; \
- if test -n "$$list"; then \
- echo " $(MKDIR_P) '$(DESTDIR)$(pkgincludedir)'"; \
- $(MKDIR_P) "$(DESTDIR)$(pkgincludedir)" || exit 1; \
- fi; \
- for p in $$list; do \
- if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
- echo "$$d$$p"; \
- done | $(am__base_list) | \
- while read files; do \
- echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(pkgincludedir)'"; \
- $(INSTALL_HEADER) $$files "$(DESTDIR)$(pkgincludedir)" || exit $$?; \
- done
-
-uninstall-pkgincludeHEADERS:
- @$(NORMAL_UNINSTALL)
- @list='$(pkginclude_HEADERS)'; test -n "$(pkgincludedir)" || list=; \
- files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
- dir='$(DESTDIR)$(pkgincludedir)'; $(am__uninstall_files_from_dir)
-
-# This directory's subdirectories are mostly independent; you can cd
-# into them and run `make' without going through this Makefile.
-# To change the values of `make' variables: instead of editing Makefiles,
-# (1) if the variable is set in `config.status', edit `config.status'
-# (which will cause the Makefiles to be regenerated when you run `make');
-# (2) otherwise, pass the desired values on the `make' command line.
-$(RECURSIVE_TARGETS):
- @fail= failcom='exit 1'; \
- for f in x $$MAKEFLAGS; do \
- case $$f in \
- *=* | --[!k]*);; \
- *k*) failcom='fail=yes';; \
- esac; \
- done; \
- dot_seen=no; \
- target=`echo $@ | sed s/-recursive//`; \
- list='$(SUBDIRS)'; for subdir in $$list; do \
- echo "Making $$target in $$subdir"; \
- if test "$$subdir" = "."; then \
- dot_seen=yes; \
- local_target="$$target-am"; \
- else \
- local_target="$$target"; \
- fi; \
- ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
- || eval $$failcom; \
- done; \
- if test "$$dot_seen" = "no"; then \
- $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \
- fi; test -z "$$fail"
-
-$(RECURSIVE_CLEAN_TARGETS):
- @fail= failcom='exit 1'; \
- for f in x $$MAKEFLAGS; do \
- case $$f in \
- *=* | --[!k]*);; \
- *k*) failcom='fail=yes';; \
- esac; \
- done; \
- dot_seen=no; \
- case "$@" in \
- distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \
- *) list='$(SUBDIRS)' ;; \
- esac; \
- rev=''; for subdir in $$list; do \
- if test "$$subdir" = "."; then :; else \
- rev="$$subdir $$rev"; \
- fi; \
- done; \
- rev="$$rev ."; \
- target=`echo $@ | sed s/-recursive//`; \
- for subdir in $$rev; do \
- echo "Making $$target in $$subdir"; \
- if test "$$subdir" = "."; then \
- local_target="$$target-am"; \
- else \
- local_target="$$target"; \
- fi; \
- ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
- || eval $$failcom; \
- done && test -z "$$fail"
-tags-recursive:
- list='$(SUBDIRS)'; for subdir in $$list; do \
- test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \
- done
-ctags-recursive:
- list='$(SUBDIRS)'; for subdir in $$list; do \
- test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \
- done
-
-ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
- list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
- unique=`for i in $$list; do \
- if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
- done | \
- $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
- END { if (nonempty) { for (i in files) print i; }; }'`; \
- mkid -fID $$unique
-tags: TAGS
-
-TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
- $(TAGS_FILES) $(LISP)
- set x; \
- here=`pwd`; \
- if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \
- include_option=--etags-include; \
- empty_fix=.; \
- else \
- include_option=--include; \
- empty_fix=; \
- fi; \
- list='$(SUBDIRS)'; for subdir in $$list; do \
- if test "$$subdir" = .; then :; else \
- test ! -f $$subdir/TAGS || \
- set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \
- fi; \
- done; \
- list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
- unique=`for i in $$list; do \
- if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
- done | \
- $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
- END { if (nonempty) { for (i in files) print i; }; }'`; \
- shift; \
- if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
- test -n "$$unique" || unique=$$empty_fix; \
- if test $$# -gt 0; then \
- $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
- "$$@" $$unique; \
- else \
- $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
- $$unique; \
- fi; \
- fi
-ctags: CTAGS
-CTAGS: ctags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
- $(TAGS_FILES) $(LISP)
- list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
- unique=`for i in $$list; do \
- if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
- done | \
- $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
- END { if (nonempty) { for (i in files) print i; }; }'`; \
- test -z "$(CTAGS_ARGS)$$unique" \
- || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
- $$unique
-
-GTAGS:
- here=`$(am__cd) $(top_builddir) && pwd` \
- && $(am__cd) $(top_srcdir) \
- && gtags -i $(GTAGS_ARGS) "$$here"
-
-distclean-tags:
- -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
-
-distdir: $(DISTFILES)
- @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
- topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
- list='$(DISTFILES)'; \
- dist_files=`for file in $$list; do echo $$file; done | \
- sed -e "s|^$$srcdirstrip/||;t" \
- -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
- case $$dist_files in \
- */*) $(MKDIR_P) `echo "$$dist_files" | \
- sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
- sort -u` ;; \
- esac; \
- for file in $$dist_files; do \
- if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
- if test -d $$d/$$file; then \
- dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
- if test -d "$(distdir)/$$file"; then \
- find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
- fi; \
- if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
- cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
- find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
- fi; \
- cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
- else \
- test -f "$(distdir)/$$file" \
- || cp -p $$d/$$file "$(distdir)/$$file" \
- || exit 1; \
- fi; \
- done
- @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \
- if test "$$subdir" = .; then :; else \
- $(am__make_dryrun) \
- || test -d "$(distdir)/$$subdir" \
- || $(MKDIR_P) "$(distdir)/$$subdir" \
- || exit 1; \
- dir1=$$subdir; dir2="$(distdir)/$$subdir"; \
- $(am__relativize); \
- new_distdir=$$reldir; \
- dir1=$$subdir; dir2="$(top_distdir)"; \
- $(am__relativize); \
- new_top_distdir=$$reldir; \
- echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \
- echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \
- ($(am__cd) $$subdir && \
- $(MAKE) $(AM_MAKEFLAGS) \
- top_distdir="$$new_top_distdir" \
- distdir="$$new_distdir" \
- am__remove_distdir=: \
- am__skip_length_check=: \
- am__skip_mode_fix=: \
- distdir) \
- || exit 1; \
- fi; \
- done
-check-am: all-am
-check: check-recursive
-all-am: Makefile $(LTLIBRARIES) $(HEADERS)
-installdirs: installdirs-recursive
-installdirs-am:
- for dir in "$(DESTDIR)$(libdir)" "$(DESTDIR)$(pkgincludedir)"; do \
- test -z "$$dir" || $(MKDIR_P) "$$dir"; \
- done
-install: install-recursive
-install-exec: install-exec-recursive
-install-data: install-data-recursive
-uninstall: uninstall-recursive
-
-install-am: all-am
- @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
-
-installcheck: installcheck-recursive
-install-strip:
- if test -z '$(STRIP)'; then \
- $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
- install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
- install; \
- else \
- $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
- install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
- "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
- fi
-mostlyclean-generic:
-
-clean-generic:
-
-distclean-generic:
- -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
- -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
-
-maintainer-clean-generic:
- @echo "This command is intended for maintainers to use"
- @echo "it deletes files that may require special tools to rebuild."
-clean: clean-recursive
-
-clean-am: clean-generic clean-libLTLIBRARIES clean-libtool \
- mostlyclean-am
-
-distclean: distclean-recursive
- -rm -f Makefile
-distclean-am: clean-am distclean-compile distclean-generic \
- distclean-tags
-
-dvi: dvi-recursive
-
-dvi-am:
-
-html: html-recursive
-
-html-am:
-
-info: info-recursive
-
-info-am:
-
-install-data-am: install-pkgincludeHEADERS
-
-install-dvi: install-dvi-recursive
-
-install-dvi-am:
-
-install-exec-am: install-libLTLIBRARIES
-
-install-html: install-html-recursive
-
-install-html-am:
-
-install-info: install-info-recursive
-
-install-info-am:
-
-install-man:
-
-install-pdf: install-pdf-recursive
-
-install-pdf-am:
-
-install-ps: install-ps-recursive
-
-install-ps-am:
-
-installcheck-am:
-
-maintainer-clean: maintainer-clean-recursive
- -rm -f Makefile
-maintainer-clean-am: distclean-am maintainer-clean-generic
-
-mostlyclean: mostlyclean-recursive
-
-mostlyclean-am: mostlyclean-compile mostlyclean-generic \
- mostlyclean-libtool
-
-pdf: pdf-recursive
-
-pdf-am:
-
-ps: ps-recursive
-
-ps-am:
-
-uninstall-am: uninstall-libLTLIBRARIES uninstall-pkgincludeHEADERS
-
-.MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) ctags-recursive \
- install-am install-strip tags-recursive
-
-.PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \
- all all-am check check-am clean clean-generic \
- clean-libLTLIBRARIES clean-libtool ctags ctags-recursive \
- distclean distclean-compile distclean-generic \
- distclean-libtool distclean-tags distdir dvi dvi-am html \
- html-am info info-am install install-am install-data \
- install-data-am install-dvi install-dvi-am install-exec \
- install-exec-am install-html install-html-am install-info \
- install-info-am install-libLTLIBRARIES install-man install-pdf \
- install-pdf-am install-pkgincludeHEADERS install-ps \
- install-ps-am install-strip installcheck installcheck-am \
- installdirs installdirs-am maintainer-clean \
- maintainer-clean-generic mostlyclean mostlyclean-compile \
- mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
- tags tags-recursive uninstall uninstall-am \
- uninstall-libLTLIBRARIES uninstall-pkgincludeHEADERS
-
-
-# Tell versions [3.59,3.63) of GNU make to not export all variables.
-# Otherwise a system limit (for SysV at least) may be exceeded.
-.NOEXPORT:
diff --git a/linbox/algorithms/Makefile.am b/linbox/algorithms/Makefile.am
index b011792..6a7b999 100644
--- a/linbox/algorithms/Makefile.am
+++ b/linbox/algorithms/Makefile.am
@@ -21,121 +21,148 @@
pkgincludesubdir=$(pkgincludedir)/algorithms
-SUBDIRS=gauss matrix-blas3
+SUBDIRS=gauss opencl-kernels matrix-blas3 polynomial-matrix
+# IML
noinst_LTLIBRARIES=libalgorithms.la
libalgorithms_la_SOURCES= diophantine-solver.C
-# AM_CPPFLAGS= $(CBLAS_FLAG) $(GMP_CFLAGS) $(NTL_CFLAGS) $(GIVARO_CFLAGS) $(LIDIA_CFLAGS)
-
-AM_CXXFLAGS = @DEFAULT_CFLAGS@ -DDISABLE_COMMENTATOR $(CBLAS_FLAG) $(FFLAS_FFPACK_CFLAGS) $(GMP_CFLAGS) $(NTL_CFLAGS) $(ATLAS_CFLAGS) $(GIVARO_CFLAGS) $(LIDIA_CFLAGS) $(FPLLL_CFLAGS)
-
-pkgincludesub_HEADERS = \
- blackbox-container.h \
- blackbox-container-symmetric.h \
- blackbox-container-symmetrize.h \
- blackbox-container-base.h \
- bbsolve.h \
- double-det.h \
- det-rational.h \
- massey-domain.h \
- wiedemann.h wiedemann.inl \
- lanczos.h lanczos.inl \
- block-lanczos.h block-lanczos.inl \
- mg-block-lanczos.h mg-block-lanczos.inl \
- la-block-lanczos.h la-block-lanczos.inl \
- eliminator.h eliminator.inl \
- gauss.h \
- triangular-solve.h \
- gauss-gf2.h \
- triangular-solve-gf2.h \
- dense-container.h \
- cra-mpi.h \
- cra-kaapi.h \
- cra-domain.h \
- cra-domain-seq.h \
- cra-domain-omp.h \
- cra-early-multip.h \
- cra-early-single.h \
- cra-full-multip.h \
- cra-full-multip-fixed.h \
- cra-givrnsfixed.h \
- lazy-product.h \
- rational-cra.h \
- rational-cra2.h \
- rational-cra-early-multip.h \
- rational-cra-early-single.h \
- rational-cra-full-multip.h \
- blas-domain.h \
- blas-domain.inl \
- blas-domain-multimod.h \
- bitonic-sort.h \
- blackbox-block-container-base.h \
- blackbox-block-container.h \
- block-massey-domain.h \
- block-wiedemann.h \
- default.h \
- signature.h \
- smith-form-iliopoulos.h \
- one-invariant-factor.h \
- last-invariant-factor.h \
- hybrid-det.h \
- lifting-container.h \
- smith-form-local.h \
- smith-form-local2.inl \
- matrix-inverse.h \
- matrix-hom.h \
- matrix-rank.h \
- numeric-solver-lapack.h \
- rational-solver-sn.h \
- rational-solver-sn.inl \
- dyadic-to-rational.h \
- rational-reconstruction.h \
- rational-reconstruction-base.h \
- classic-rational-reconstruction.h \
- fast-rational-reconstruction.h \
- rational-solver.h \
- rational-solver2.h \
- rational-solver.inl \
- diophantine-solver.h \
- diophantine-solver.inl \
- smith-form-binary.h \
- smith-form-adaptive.h \
- smith-form-adaptive.inl \
- smith-form-sparseelim-local.h \
- smith-form-sparseelim-poweroftwo.h \
- rational-reconstruction2.h \
- rational-solver-adaptive.h \
- varprec-cra-early-single.h \
- varprec-cra-early-multip.h \
- vector-fraction.h \
- whisart_trace.h \
- cia.h \
- lattice.h lattice.inl \
- bbcharpoly.h \
- charpoly-rational.h \
- minpoly-integer.h \
- minpoly-rational.h \
- sigma-basis.h \
- matpoly-mult.h \
- echelon-form.h \
- toeplitz-det.h \
- dense-nullspace.h dense-nullspace.inl \
- linbox-tags.h \
- bm-seq.h \
- short-vector.h \
- rns.h rns.inl
-
-EXTRA_DIST = \
- algorithms.doxy \
- cra.doxy \
- wiedemann.doxy \
- lanczos.doxy \
- sigmabasis.doxy \
- elimination.doxy \
- lattice.doxy \
- diophantine.doxy \
- gauss.doxy
+# AM_CPPFLAGS= $(CBLAS_FLAG) $(GMP_CFLAGS) $(NTL_CFLAGS)
+
+AM_CPPFLAGS = -I$(top_srcdir)/linbox $(DEPS_CFLAGS)
+LDADD = $(DEPS_LIBS) $(LDFLAGS)
+
+#AM_CXXFLAGS = @DEFAULT_CFLAGS@ -DDISABLE_COMMENTATOR $(NTL_CFLAGS) $(ATLAS_CFLAGS) $(FPLLL_CFLAGS) $(OCL_CFLAGS) $(OMPFLAGS)
+
+OCL_HDRS = \
+ opencl-resource-controller.h \
+ opencl-environ.h
+
+# if LINBOX_HAVE_OCL // we include them anyway. (for make dist when OCL not available)
+USE_OCL_HDRS = $(OCL_HDRS)
+# endif
+
+
+
+pkgincludesub_HEADERS = \
+ blackbox-container.h \
+ blackbox-container-symmetric.h \
+ blackbox-container-symmetrize.h \
+ blackbox-container-base.h \
+ bbsolve.h \
+ coppersmith.h \
+ double-det.h \
+ det-rational.h \
+ massey-domain.h \
+ wiedemann.h \
+ wiedemann.inl \
+ lanczos.h \
+ lanczos.inl \
+ block-lanczos.h \
+ block-lanczos.inl \
+ mg-block-lanczos.h \
+ mg-block-lanczos.inl \
+ la-block-lanczos.h \
+ la-block-lanczos.inl \
+ eliminator.h \
+ eliminator.inl \
+ gauss.h \
+ triangular-solve.h \
+ gauss-gf2.h \
+ triangular-solve-gf2.h \
+ dense-container.h \
+ cra-mpi.h \
+ cra-kaapi.h \
+ cra-domain.h \
+ cra-domain-seq.h \
+ cra-domain-omp.h \
+ cra-early-multip.h \
+ cra-early-single.h \
+ cra-full-multip.h \
+ cra-full-multip-fixed.h \
+ cra-givrnsfixed.h \
+ lazy-product.h \
+ rational-cra.h \
+ rational-cra2.h \
+ rational-cra-early-multip.h \
+ rational-cra-early-single.h \
+ rational-cra-full-multip.h \
+ bitonic-sort.h \
+ blackbox-block-container-base.h \
+ blackbox-block-container.h \
+ block-massey-domain.h \
+ block-wiedemann.h \
+ block-coppersmith-domain.h \
+ default.h \
+ signature.h \
+ smith-form-iliopoulos.h \
+ one-invariant-factor.h \
+ last-invariant-factor.h \
+ hybrid-det.h \
+ lifting-container.h \
+ smith-form-local.h \
+ smith-form-local2.inl \
+ smith-form-textbook.h \
+ smith-form-kannan-bachem.h \
+ matrix-inverse.h \
+ matrix-hom.h \
+ matrix-rank.h \
+ numeric-solver-lapack.h \
+ rational-solver-sn.h \
+ rational-solver-sn.inl \
+ dyadic-to-rational.h \
+ rational-reconstruction.h \
+ rational-reconstruction-base.h \
+ classic-rational-reconstruction.h \
+ fast-rational-reconstruction.h \
+ rational-solver.h \
+ rational-solver2.h \
+ rational-solver.inl \
+ diophantine-solver.h \
+ diophantine-solver.inl \
+ smith-form-binary.h \
+ smith-form-adaptive.h \
+ smith-form-adaptive.inl \
+ smith-form-sparseelim-local.h \
+ smith-form-sparseelim-poweroftwo.h \
+ rational-reconstruction2.h \
+ rational-solver-adaptive.h \
+ varprec-cra-early-single.h \
+ varprec-cra-early-multip.h \
+ vector-fraction.h \
+ whisart_trace.h \
+ cia.h \
+ lattice.h \
+ lattice.inl \
+ bbcharpoly.h \
+ charpoly-rational.h \
+ minpoly-integer.h \
+ minpoly-rational.h \
+ sigma-basis.h \
+ matpoly-mult.h \
+ echelon-form.h \
+ toeplitz-det.h \
+ dense-nullspace.h \
+ dense-nullspace.inl \
+ short-vector.h \
+ rns.h \
+ rns.inl \
+ $(USE_OCL_HDRS)
+
+# iml.h \
+#
+
+EXTRA_DIST = \
+ algorithms.doxy \
+ cra.doxy \
+ iml.doxy \
+ wiedemann.doxy \
+ lanczos.doxy \
+ sigmabasis.doxy \
+ elimination.doxy \
+ lattice.doxy \
+ diophantine.doxy \
+ gauss.doxy
diff --git a/linbox/algorithms/Makefile.in b/linbox/algorithms/Makefile.in
deleted file mode 100644
index f79170b..0000000
--- a/linbox/algorithms/Makefile.in
+++ /dev/null
@@ -1,880 +0,0 @@
-# Makefile.in generated by automake 1.11.5 from Makefile.am.
-# @configure_input@
-
-# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software
-# Foundation, Inc.
-# This Makefile.in is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
-# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
-# PARTICULAR PURPOSE.
-
- at SET_MAKE@
-
-# Copyright (c) 2010 the LinBox group
-# ========LICENCE========
-# This file is part of the library LinBox.
-#
-# LinBox is free software: you can redistribute it and/or modify
-# it under the terms of the GNU Lesser General Public
-# License as published by the Free Software Foundation; either
-# version 2.1 of the License, or (at your option) any later version.
-#
-# This library 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
-# Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public
-# License along with this library; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
-# ========LICENCE========
-
-
-VPATH = @srcdir@
-am__make_dryrun = \
- { \
- am__dry=no; \
- case $$MAKEFLAGS in \
- *\\[\ \ ]*) \
- echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \
- | grep '^AM OK$$' >/dev/null || am__dry=yes;; \
- *) \
- for am__flg in $$MAKEFLAGS; do \
- case $$am__flg in \
- *=*|--*) ;; \
- *n*) am__dry=yes; break;; \
- esac; \
- done;; \
- esac; \
- test $$am__dry = yes; \
- }
-pkgdatadir = $(datadir)/@PACKAGE@
-pkgincludedir = $(includedir)/@PACKAGE@
-pkglibdir = $(libdir)/@PACKAGE@
-pkglibexecdir = $(libexecdir)/@PACKAGE@
-am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
-install_sh_DATA = $(install_sh) -c -m 644
-install_sh_PROGRAM = $(install_sh) -c
-install_sh_SCRIPT = $(install_sh) -c
-INSTALL_HEADER = $(INSTALL_DATA)
-transform = $(program_transform_name)
-NORMAL_INSTALL = :
-PRE_INSTALL = :
-POST_INSTALL = :
-NORMAL_UNINSTALL = :
-PRE_UNINSTALL = :
-POST_UNINSTALL = :
-build_triplet = @build@
-host_triplet = @host@
-subdir = linbox/algorithms
-DIST_COMMON = $(pkgincludesub_HEADERS) $(srcdir)/Makefile.am \
- $(srcdir)/Makefile.in
-ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-am__aclocal_m4_deps = $(top_srcdir)/macros/aclocal-include.m4 \
- $(top_srcdir)/macros/config-header.m4 \
- $(top_srcdir)/macros/debug.m4 \
- $(top_srcdir)/macros/expat-check.m4 \
- $(top_srcdir)/macros/fflas-ffpack-check.m4 \
- $(top_srcdir)/macros/fplll-check.m4 \
- $(top_srcdir)/macros/givaro-check.m4 \
- $(top_srcdir)/macros/gmp-check.m4 \
- $(top_srcdir)/macros/iml-check.m4 \
- $(top_srcdir)/macros/lapack-check.m4 \
- $(top_srcdir)/macros/libtool.m4 \
- $(top_srcdir)/macros/lidia-check.m4 \
- $(top_srcdir)/macros/linbox-benchmark.m4 \
- $(top_srcdir)/macros/linbox-doc.m4 \
- $(top_srcdir)/macros/linbox-misc.m4 \
- $(top_srcdir)/macros/linbox-opt.m4 \
- $(top_srcdir)/macros/ltoptions.m4 \
- $(top_srcdir)/macros/ltsugar.m4 \
- $(top_srcdir)/macros/ltversion.m4 \
- $(top_srcdir)/macros/lt~obsolete.m4 \
- $(top_srcdir)/macros/m4ri-check.m4 \
- $(top_srcdir)/macros/m4rie-check.m4 \
- $(top_srcdir)/macros/maple-check.m4 \
- $(top_srcdir)/macros/mpfr-check.m4 \
- $(top_srcdir)/macros/ntl-check.m4 \
- $(top_srcdir)/macros/saclib-check.m4 \
- $(top_srcdir)/macros/sage-check.m4 $(top_srcdir)/configure.ac
-am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
- $(ACLOCAL_M4)
-mkinstalldirs = $(install_sh) -d
-CONFIG_HEADER = $(top_builddir)/config.h
-CONFIG_CLEAN_FILES =
-CONFIG_CLEAN_VPATH_FILES =
-LTLIBRARIES = $(noinst_LTLIBRARIES)
-libalgorithms_la_LIBADD =
-am_libalgorithms_la_OBJECTS = diophantine-solver.lo
-libalgorithms_la_OBJECTS = $(am_libalgorithms_la_OBJECTS)
-DEFAULT_INCLUDES = -I. at am__isrc@ -I$(top_builddir)
-depcomp =
-am__depfiles_maybe =
-CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
- $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
-LTCXXCOMPILE = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
- --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
- $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
-CXXLD = $(CXX)
-CXXLINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
- --mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \
- $(LDFLAGS) -o $@
-SOURCES = $(libalgorithms_la_SOURCES)
-DIST_SOURCES = $(libalgorithms_la_SOURCES)
-RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \
- html-recursive info-recursive install-data-recursive \
- install-dvi-recursive install-exec-recursive \
- install-html-recursive install-info-recursive \
- install-pdf-recursive install-ps-recursive install-recursive \
- installcheck-recursive installdirs-recursive pdf-recursive \
- ps-recursive uninstall-recursive
-am__can_run_installinfo = \
- case $$AM_UPDATE_INFO_DIR in \
- n|no|NO) false;; \
- *) (install-info --version) >/dev/null 2>&1;; \
- esac
-am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
-am__vpath_adj = case $$p in \
- $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
- *) f=$$p;; \
- esac;
-am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
-am__install_max = 40
-am__nobase_strip_setup = \
- srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
-am__nobase_strip = \
- for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
-am__nobase_list = $(am__nobase_strip_setup); \
- for p in $$list; do echo "$$p $$p"; done | \
- sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
- $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
- if (++n[$$2] == $(am__install_max)) \
- { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
- END { for (dir in files) print dir, files[dir] }'
-am__base_list = \
- sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
- sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
-am__uninstall_files_from_dir = { \
- test -z "$$files" \
- || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \
- || { echo " ( cd '$$dir' && rm -f" $$files ")"; \
- $(am__cd) "$$dir" && rm -f $$files; }; \
- }
-am__installdirs = "$(DESTDIR)$(pkgincludesubdir)"
-HEADERS = $(pkgincludesub_HEADERS)
-RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \
- distclean-recursive maintainer-clean-recursive
-AM_RECURSIVE_TARGETS = $(RECURSIVE_TARGETS:-recursive=) \
- $(RECURSIVE_CLEAN_TARGETS:-recursive=) tags TAGS ctags CTAGS \
- distdir
-ETAGS = etags
-CTAGS = ctags
-DIST_SUBDIRS = $(SUBDIRS)
-DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
-am__relativize = \
- dir0=`pwd`; \
- sed_first='s,^\([^/]*\)/.*$$,\1,'; \
- sed_rest='s,^[^/]*/*,,'; \
- sed_last='s,^.*/\([^/]*\)$$,\1,'; \
- sed_butlast='s,/*[^/]*$$,,'; \
- while test -n "$$dir1"; do \
- first=`echo "$$dir1" | sed -e "$$sed_first"`; \
- if test "$$first" != "."; then \
- if test "$$first" = ".."; then \
- dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \
- dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \
- else \
- first2=`echo "$$dir2" | sed -e "$$sed_first"`; \
- if test "$$first2" = "$$first"; then \
- dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \
- else \
- dir2="../$$dir2"; \
- fi; \
- dir0="$$dir0"/"$$first"; \
- fi; \
- fi; \
- dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \
- done; \
- reldir="$$dir2"
-ACLOCAL = @ACLOCAL@
-AMTAR = @AMTAR@
-AR = @AR@
-AUTOCONF = @AUTOCONF@
-AUTOHEADER = @AUTOHEADER@
-AUTOMAKE = @AUTOMAKE@
-AWK = @AWK@
-BLAS_CFLAGS = @BLAS_CFLAGS@
-BLAS_LIBS = @BLAS_LIBS@
-CC = @CC@
-CCNAM = @CCNAM@
-CFLAGS = @CFLAGS@
-CPPFLAGS = @CPPFLAGS@
-CXX = @CXX@
-CXXCPP = @CXXCPP@
-CXXFLAGS = @CXXFLAGS@
-CYGPATH_W = @CYGPATH_W@
-DBG = @DBG@
-DEBUG_CFLAGS = @DEBUG_CFLAGS@
-DEFAULT_CFLAGS = @DEFAULT_CFLAGS@
-DEFS = @DEFS@
-DLLTOOL = @DLLTOOL@
-DSYMUTIL = @DSYMUTIL@
-DUMPBIN = @DUMPBIN@
-ECHO_C = @ECHO_C@
-ECHO_N = @ECHO_N@
-ECHO_T = @ECHO_T@
-EGREP = @EGREP@
-EXEEXT = @EXEEXT@
-EXPAT_CFLAGS = @EXPAT_CFLAGS@
-EXPAT_LIBS = @EXPAT_LIBS@
-FFLAS_FFPACK_CFLAGS = @FFLAS_FFPACK_CFLAGS@
-FFLAS_FFPACK_LIBS = @FFLAS_FFPACK_LIBS@
-FFLAS_FFPACK_LOC = @FFLAS_FFPACK_LOC@
-FGREP = @FGREP@
-FPLLL_CFLAGS = @FPLLL_CFLAGS@
-FPLLL_LIBS = @FPLLL_LIBS@
-GIVARO_CFLAGS = @GIVARO_CFLAGS@
-GIVARO_LIBS = @GIVARO_LIBS@
-GMP_CFLAGS = @GMP_CFLAGS@
-GMP_LIBS = @GMP_LIBS@
-GMP_VERSION = @GMP_VERSION@
-GREP = @GREP@
-IML_CFLAGS = @IML_CFLAGS@
-IML_LIBS = @IML_LIBS@
-INSTALL = @INSTALL@
-INSTALL_DATA = @INSTALL_DATA@
-INSTALL_PROGRAM = @INSTALL_PROGRAM@
-INSTALL_SCRIPT = @INSTALL_SCRIPT@
-INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
-LD = @LD@
-LDFLAGS = @LDFLAGS@
-LIBOBJS = @LIBOBJS@
-LIBS = @LIBS@
-LIBTOOL = @LIBTOOL@
-LIDIA_CFLAGS = @LIDIA_CFLAGS@
-LIDIA_LIBS = @LIDIA_LIBS@
-LINBOX_BENCH_PATH = @LINBOX_BENCH_PATH@
-LINBOX_DOC_PATH = @LINBOX_DOC_PATH@
-LIPO = @LIPO@
-LN_S = @LN_S@
-LTLIBOBJS = @LTLIBOBJS@
-M4RIE_CFLAGS = @M4RIE_CFLAGS@
-M4RIE_LIBS = @M4RIE_LIBS@
-M4RI_CFLAGS = @M4RI_CFLAGS@
-M4RI_LIBS = @M4RI_LIBS@
-MAINT = @MAINT@
-MAKEINFO = @MAKEINFO@
-MANIFEST_TOOL = @MANIFEST_TOOL@
-MAPLE_CFLAGS = @MAPLE_CFLAGS@
-MAPLE_HOME = @MAPLE_HOME@
-MAPLE_LIBS = @MAPLE_LIBS@
-MAPLE_VERSION = @MAPLE_VERSION@
-MKDIR_P = @MKDIR_P@
-MPFR_CFLAGS = @MPFR_CFLAGS@
-MPFR_LIBS = @MPFR_LIBS@
-NM = @NM@
-NMEDIT = @NMEDIT@
-NTL_CFLAGS = @NTL_CFLAGS@
-NTL_LIBS = @NTL_LIBS@
-OBJDUMP = @OBJDUMP@
-OBJEXT = @OBJEXT@
-OTOOL = @OTOOL@
-OTOOL64 = @OTOOL64@
-PACKAGE = @PACKAGE@
-PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
-PACKAGE_NAME = @PACKAGE_NAME@
-PACKAGE_STRING = @PACKAGE_STRING@
-PACKAGE_TARNAME = @PACKAGE_TARNAME@
-PACKAGE_URL = @PACKAGE_URL@
-PACKAGE_VERSION = @PACKAGE_VERSION@
-PATH_SEPARATOR = @PATH_SEPARATOR@
-PROF = @PROF@
-RANLIB = @RANLIB@
-RM = @RM@
-SACLIB_CFLAGS = @SACLIB_CFLAGS@
-SACLIB_LIBS = @SACLIB_LIBS@
-SED = @SED@
-SET_MAKE = @SET_MAKE@
-SHELL = @SHELL@
-STRIP = @STRIP@
-TESTS_CFLAGS = @TESTS_CFLAGS@
-VERSION = @VERSION@
-WARN = @WARN@
-abs_builddir = @abs_builddir@
-abs_srcdir = @abs_srcdir@
-abs_top_builddir = @abs_top_builddir@
-abs_top_srcdir = @abs_top_srcdir@
-ac_ct_AR = @ac_ct_AR@
-ac_ct_CC = @ac_ct_CC@
-ac_ct_CXX = @ac_ct_CXX@
-ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
-am__leading_dot = @am__leading_dot@
-am__tar = @am__tar@
-am__untar = @am__untar@
-bindir = @bindir@
-build = @build@
-build_alias = @build_alias@
-build_cpu = @build_cpu@
-build_os = @build_os@
-build_vendor = @build_vendor@
-builddir = @builddir@
-datadir = @datadir@
-datarootdir = @datarootdir@
-docdir = @docdir@
-dvidir = @dvidir@
-exec_prefix = @exec_prefix@
-host = @host@
-host_alias = @host_alias@
-host_cpu = @host_cpu@
-host_os = @host_os@
-host_vendor = @host_vendor@
-htmldir = @htmldir@
-includedir = @includedir@
-infodir = @infodir@
-install_sh = @install_sh@
-libdir = @libdir@
-libexecdir = @libexecdir@
-localedir = @localedir@
-localstatedir = @localstatedir@
-mandir = @mandir@
-mkdir_p = @mkdir_p@
-oldincludedir = @oldincludedir@
-pdfdir = @pdfdir@
-prefix = @prefix@
-program_transform_name = @program_transform_name@
-psdir = @psdir@
-sbindir = @sbindir@
-sharedstatedir = @sharedstatedir@
-srcdir = @srcdir@
-sysconfdir = @sysconfdir@
-target_alias = @target_alias@
-top_build_prefix = @top_build_prefix@
-top_builddir = @top_builddir@
-top_srcdir = @top_srcdir@
-pkgincludesubdir = $(pkgincludedir)/algorithms
-SUBDIRS = gauss matrix-blas3
-noinst_LTLIBRARIES = libalgorithms.la
-libalgorithms_la_SOURCES = diophantine-solver.C
-
-# AM_CPPFLAGS= $(CBLAS_FLAG) $(GMP_CFLAGS) $(NTL_CFLAGS) $(GIVARO_CFLAGS) $(LIDIA_CFLAGS)
-AM_CXXFLAGS = @DEFAULT_CFLAGS@ -DDISABLE_COMMENTATOR $(CBLAS_FLAG) $(FFLAS_FFPACK_CFLAGS) $(GMP_CFLAGS) $(NTL_CFLAGS) $(ATLAS_CFLAGS) $(GIVARO_CFLAGS) $(LIDIA_CFLAGS) $(FPLLL_CFLAGS)
-pkgincludesub_HEADERS = \
- blackbox-container.h \
- blackbox-container-symmetric.h \
- blackbox-container-symmetrize.h \
- blackbox-container-base.h \
- bbsolve.h \
- double-det.h \
- det-rational.h \
- massey-domain.h \
- wiedemann.h wiedemann.inl \
- lanczos.h lanczos.inl \
- block-lanczos.h block-lanczos.inl \
- mg-block-lanczos.h mg-block-lanczos.inl \
- la-block-lanczos.h la-block-lanczos.inl \
- eliminator.h eliminator.inl \
- gauss.h \
- triangular-solve.h \
- gauss-gf2.h \
- triangular-solve-gf2.h \
- dense-container.h \
- cra-mpi.h \
- cra-kaapi.h \
- cra-domain.h \
- cra-domain-seq.h \
- cra-domain-omp.h \
- cra-early-multip.h \
- cra-early-single.h \
- cra-full-multip.h \
- cra-full-multip-fixed.h \
- cra-givrnsfixed.h \
- lazy-product.h \
- rational-cra.h \
- rational-cra2.h \
- rational-cra-early-multip.h \
- rational-cra-early-single.h \
- rational-cra-full-multip.h \
- blas-domain.h \
- blas-domain.inl \
- blas-domain-multimod.h \
- bitonic-sort.h \
- blackbox-block-container-base.h \
- blackbox-block-container.h \
- block-massey-domain.h \
- block-wiedemann.h \
- default.h \
- signature.h \
- smith-form-iliopoulos.h \
- one-invariant-factor.h \
- last-invariant-factor.h \
- hybrid-det.h \
- lifting-container.h \
- smith-form-local.h \
- smith-form-local2.inl \
- matrix-inverse.h \
- matrix-hom.h \
- matrix-rank.h \
- numeric-solver-lapack.h \
- rational-solver-sn.h \
- rational-solver-sn.inl \
- dyadic-to-rational.h \
- rational-reconstruction.h \
- rational-reconstruction-base.h \
- classic-rational-reconstruction.h \
- fast-rational-reconstruction.h \
- rational-solver.h \
- rational-solver2.h \
- rational-solver.inl \
- diophantine-solver.h \
- diophantine-solver.inl \
- smith-form-binary.h \
- smith-form-adaptive.h \
- smith-form-adaptive.inl \
- smith-form-sparseelim-local.h \
- smith-form-sparseelim-poweroftwo.h \
- rational-reconstruction2.h \
- rational-solver-adaptive.h \
- varprec-cra-early-single.h \
- varprec-cra-early-multip.h \
- vector-fraction.h \
- whisart_trace.h \
- cia.h \
- lattice.h lattice.inl \
- bbcharpoly.h \
- charpoly-rational.h \
- minpoly-integer.h \
- minpoly-rational.h \
- sigma-basis.h \
- matpoly-mult.h \
- echelon-form.h \
- toeplitz-det.h \
- dense-nullspace.h dense-nullspace.inl \
- linbox-tags.h \
- bm-seq.h \
- short-vector.h \
- rns.h rns.inl
-
-EXTRA_DIST = \
- algorithms.doxy \
- cra.doxy \
- wiedemann.doxy \
- lanczos.doxy \
- sigmabasis.doxy \
- elimination.doxy \
- lattice.doxy \
- diophantine.doxy \
- gauss.doxy
-
-all: all-recursive
-
-.SUFFIXES:
-.SUFFIXES: .C .lo .o .obj
-$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps)
- @for dep in $?; do \
- case '$(am__configure_deps)' in \
- *$$dep*) \
- ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
- && { if test -f $@; then exit 0; else break; fi; }; \
- exit 1;; \
- esac; \
- done; \
- echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu --ignore-deps linbox/algorithms/Makefile'; \
- $(am__cd) $(top_srcdir) && \
- $(AUTOMAKE) --gnu --ignore-deps linbox/algorithms/Makefile
-.PRECIOUS: Makefile
-Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
- @case '$?' in \
- *config.status*) \
- cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
- *) \
- echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
- cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
- esac;
-
-$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
- cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-
-$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
- cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
- cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-$(am__aclocal_m4_deps):
-
-clean-noinstLTLIBRARIES:
- -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES)
- @list='$(noinst_LTLIBRARIES)'; for p in $$list; do \
- dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \
- test "$$dir" != "$$p" || dir=.; \
- echo "rm -f \"$${dir}/so_locations\""; \
- rm -f "$${dir}/so_locations"; \
- done
-libalgorithms.la: $(libalgorithms_la_OBJECTS) $(libalgorithms_la_DEPENDENCIES) $(EXTRA_libalgorithms_la_DEPENDENCIES)
- $(CXXLINK) $(libalgorithms_la_OBJECTS) $(libalgorithms_la_LIBADD) $(LIBS)
-
-mostlyclean-compile:
- -rm -f *.$(OBJEXT)
-
-distclean-compile:
- -rm -f *.tab.c
-
-.C.o:
- $(CXXCOMPILE) -c -o $@ $<
-
-.C.obj:
- $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
-
-.C.lo:
- $(LTCXXCOMPILE) -c -o $@ $<
-
-mostlyclean-libtool:
- -rm -f *.lo
-
-clean-libtool:
- -rm -rf .libs _libs
-install-pkgincludesubHEADERS: $(pkgincludesub_HEADERS)
- @$(NORMAL_INSTALL)
- @list='$(pkgincludesub_HEADERS)'; test -n "$(pkgincludesubdir)" || list=; \
- if test -n "$$list"; then \
- echo " $(MKDIR_P) '$(DESTDIR)$(pkgincludesubdir)'"; \
- $(MKDIR_P) "$(DESTDIR)$(pkgincludesubdir)" || exit 1; \
- fi; \
- for p in $$list; do \
- if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
- echo "$$d$$p"; \
- done | $(am__base_list) | \
- while read files; do \
- echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(pkgincludesubdir)'"; \
- $(INSTALL_HEADER) $$files "$(DESTDIR)$(pkgincludesubdir)" || exit $$?; \
- done
-
-uninstall-pkgincludesubHEADERS:
- @$(NORMAL_UNINSTALL)
- @list='$(pkgincludesub_HEADERS)'; test -n "$(pkgincludesubdir)" || list=; \
- files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
- dir='$(DESTDIR)$(pkgincludesubdir)'; $(am__uninstall_files_from_dir)
-
-# This directory's subdirectories are mostly independent; you can cd
-# into them and run `make' without going through this Makefile.
-# To change the values of `make' variables: instead of editing Makefiles,
-# (1) if the variable is set in `config.status', edit `config.status'
-# (which will cause the Makefiles to be regenerated when you run `make');
-# (2) otherwise, pass the desired values on the `make' command line.
-$(RECURSIVE_TARGETS):
- @fail= failcom='exit 1'; \
- for f in x $$MAKEFLAGS; do \
- case $$f in \
- *=* | --[!k]*);; \
- *k*) failcom='fail=yes';; \
- esac; \
- done; \
- dot_seen=no; \
- target=`echo $@ | sed s/-recursive//`; \
- list='$(SUBDIRS)'; for subdir in $$list; do \
- echo "Making $$target in $$subdir"; \
- if test "$$subdir" = "."; then \
- dot_seen=yes; \
- local_target="$$target-am"; \
- else \
- local_target="$$target"; \
- fi; \
- ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
- || eval $$failcom; \
- done; \
- if test "$$dot_seen" = "no"; then \
- $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \
- fi; test -z "$$fail"
-
-$(RECURSIVE_CLEAN_TARGETS):
- @fail= failcom='exit 1'; \
- for f in x $$MAKEFLAGS; do \
- case $$f in \
- *=* | --[!k]*);; \
- *k*) failcom='fail=yes';; \
- esac; \
- done; \
- dot_seen=no; \
- case "$@" in \
- distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \
- *) list='$(SUBDIRS)' ;; \
- esac; \
- rev=''; for subdir in $$list; do \
- if test "$$subdir" = "."; then :; else \
- rev="$$subdir $$rev"; \
- fi; \
- done; \
- rev="$$rev ."; \
- target=`echo $@ | sed s/-recursive//`; \
- for subdir in $$rev; do \
- echo "Making $$target in $$subdir"; \
- if test "$$subdir" = "."; then \
- local_target="$$target-am"; \
- else \
- local_target="$$target"; \
- fi; \
- ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
- || eval $$failcom; \
- done && test -z "$$fail"
-tags-recursive:
- list='$(SUBDIRS)'; for subdir in $$list; do \
- test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \
- done
-ctags-recursive:
- list='$(SUBDIRS)'; for subdir in $$list; do \
- test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \
- done
-
-ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
- list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
- unique=`for i in $$list; do \
- if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
- done | \
- $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
- END { if (nonempty) { for (i in files) print i; }; }'`; \
- mkid -fID $$unique
-tags: TAGS
-
-TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
- $(TAGS_FILES) $(LISP)
- set x; \
- here=`pwd`; \
- if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \
- include_option=--etags-include; \
- empty_fix=.; \
- else \
- include_option=--include; \
- empty_fix=; \
- fi; \
- list='$(SUBDIRS)'; for subdir in $$list; do \
- if test "$$subdir" = .; then :; else \
- test ! -f $$subdir/TAGS || \
- set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \
- fi; \
- done; \
- list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
- unique=`for i in $$list; do \
- if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
- done | \
- $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
- END { if (nonempty) { for (i in files) print i; }; }'`; \
- shift; \
- if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
- test -n "$$unique" || unique=$$empty_fix; \
- if test $$# -gt 0; then \
- $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
- "$$@" $$unique; \
- else \
- $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
- $$unique; \
- fi; \
- fi
-ctags: CTAGS
-CTAGS: ctags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
- $(TAGS_FILES) $(LISP)
- list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
- unique=`for i in $$list; do \
- if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
- done | \
- $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
- END { if (nonempty) { for (i in files) print i; }; }'`; \
- test -z "$(CTAGS_ARGS)$$unique" \
- || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
- $$unique
-
-GTAGS:
- here=`$(am__cd) $(top_builddir) && pwd` \
- && $(am__cd) $(top_srcdir) \
- && gtags -i $(GTAGS_ARGS) "$$here"
-
-distclean-tags:
- -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
-
-distdir: $(DISTFILES)
- @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
- topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
- list='$(DISTFILES)'; \
- dist_files=`for file in $$list; do echo $$file; done | \
- sed -e "s|^$$srcdirstrip/||;t" \
- -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
- case $$dist_files in \
- */*) $(MKDIR_P) `echo "$$dist_files" | \
- sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
- sort -u` ;; \
- esac; \
- for file in $$dist_files; do \
- if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
- if test -d $$d/$$file; then \
- dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
- if test -d "$(distdir)/$$file"; then \
- find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
- fi; \
- if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
- cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
- find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
- fi; \
- cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
- else \
- test -f "$(distdir)/$$file" \
- || cp -p $$d/$$file "$(distdir)/$$file" \
- || exit 1; \
- fi; \
- done
- @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \
- if test "$$subdir" = .; then :; else \
- $(am__make_dryrun) \
- || test -d "$(distdir)/$$subdir" \
- || $(MKDIR_P) "$(distdir)/$$subdir" \
- || exit 1; \
- dir1=$$subdir; dir2="$(distdir)/$$subdir"; \
- $(am__relativize); \
- new_distdir=$$reldir; \
- dir1=$$subdir; dir2="$(top_distdir)"; \
- $(am__relativize); \
- new_top_distdir=$$reldir; \
- echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \
- echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \
- ($(am__cd) $$subdir && \
- $(MAKE) $(AM_MAKEFLAGS) \
- top_distdir="$$new_top_distdir" \
- distdir="$$new_distdir" \
- am__remove_distdir=: \
- am__skip_length_check=: \
- am__skip_mode_fix=: \
- distdir) \
- || exit 1; \
- fi; \
- done
-check-am: all-am
-check: check-recursive
-all-am: Makefile $(LTLIBRARIES) $(HEADERS)
-installdirs: installdirs-recursive
-installdirs-am:
- for dir in "$(DESTDIR)$(pkgincludesubdir)"; do \
- test -z "$$dir" || $(MKDIR_P) "$$dir"; \
- done
-install: install-recursive
-install-exec: install-exec-recursive
-install-data: install-data-recursive
-uninstall: uninstall-recursive
-
-install-am: all-am
- @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
-
-installcheck: installcheck-recursive
-install-strip:
- if test -z '$(STRIP)'; then \
- $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
- install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
- install; \
- else \
- $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
- install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
- "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
- fi
-mostlyclean-generic:
-
-clean-generic:
-
-distclean-generic:
- -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
- -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
-
-maintainer-clean-generic:
- @echo "This command is intended for maintainers to use"
- @echo "it deletes files that may require special tools to rebuild."
-clean: clean-recursive
-
-clean-am: clean-generic clean-libtool clean-noinstLTLIBRARIES \
- mostlyclean-am
-
-distclean: distclean-recursive
- -rm -f Makefile
-distclean-am: clean-am distclean-compile distclean-generic \
- distclean-tags
-
-dvi: dvi-recursive
-
-dvi-am:
-
-html: html-recursive
-
-html-am:
-
-info: info-recursive
-
-info-am:
-
-install-data-am: install-pkgincludesubHEADERS
-
-install-dvi: install-dvi-recursive
-
-install-dvi-am:
-
-install-exec-am:
-
-install-html: install-html-recursive
-
-install-html-am:
-
-install-info: install-info-recursive
-
-install-info-am:
-
-install-man:
-
-install-pdf: install-pdf-recursive
-
-install-pdf-am:
-
-install-ps: install-ps-recursive
-
-install-ps-am:
-
-installcheck-am:
-
-maintainer-clean: maintainer-clean-recursive
- -rm -f Makefile
-maintainer-clean-am: distclean-am maintainer-clean-generic
-
-mostlyclean: mostlyclean-recursive
-
-mostlyclean-am: mostlyclean-compile mostlyclean-generic \
- mostlyclean-libtool
-
-pdf: pdf-recursive
-
-pdf-am:
-
-ps: ps-recursive
-
-ps-am:
-
-uninstall-am: uninstall-pkgincludesubHEADERS
-
-.MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) ctags-recursive \
- install-am install-strip tags-recursive
-
-.PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \
- all all-am check check-am clean clean-generic clean-libtool \
- clean-noinstLTLIBRARIES ctags ctags-recursive distclean \
- distclean-compile distclean-generic distclean-libtool \
- distclean-tags distdir dvi dvi-am html html-am info info-am \
- install install-am install-data install-data-am install-dvi \
- install-dvi-am install-exec install-exec-am install-html \
- install-html-am install-info install-info-am install-man \
- install-pdf install-pdf-am install-pkgincludesubHEADERS \
- install-ps install-ps-am install-strip installcheck \
- installcheck-am installdirs installdirs-am maintainer-clean \
- maintainer-clean-generic mostlyclean mostlyclean-compile \
- mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
- tags tags-recursive uninstall uninstall-am \
- uninstall-pkgincludesubHEADERS
-
-
-# Tell versions [3.59,3.63) of GNU make to not export all variables.
-# Otherwise a system limit (for SysV at least) may be exceeded.
-.NOEXPORT:
diff --git a/linbox/algorithms/alt-blackbox-block-container.h b/linbox/algorithms/alt-blackbox-block-container.h
new file mode 100644
index 0000000..210e5cb
--- /dev/null
+++ b/linbox/algorithms/alt-blackbox-block-container.h
@@ -0,0 +1,104 @@
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
+
+#ifndef __LINBOX_alt_blackbox_block_container_H
+#define __LINBOX_alt_blackbox_block_container_H
+
+namespace LinBox {
+
+template <class Field,class Blackbox,class Value>
+class AltBlackboxBlockContainer {
+public:
+
+ typedef typename MatrixDomain<Field>::OwnMatrix Block;
+
+ AltBlackboxBlockContainer () {}
+
+ /*
+ AltBlackboxBlockContainer(const Blackbox *M,
+ const Field &F,
+ const Block &V)
+ : U_(F,V.coldim(),M->rowdim()), V_(V),
+ M_(M), F_(F), b_(V.coldim())
+ {
+
+ }
+ */
+
+ AltBlackboxBlockContainer(const Blackbox *M,
+ const Field &F,
+ const Block &U,
+ const Block &V)
+ : b_(V.coldim()), F_(&F),
+ U_(U), V_(V),
+ LastOdd_(F,V.rowdim(),V.coldim()),
+ LastEven_(F,V.rowdim(),V.coldim()),
+ val_(F,V.coldim(),V.coldim()),
+ M_(M), MD_(F) {}
+
+ class const_iterator {
+ protected:
+ AltBlackboxBlockContainer &c_;
+ public:
+ const_iterator () {}
+ const_iterator(AltBlackboxBlockContainer<Field,Blackbox,Value> &c) :
+ c_(c) {}
+
+ const_iterator& operator++() {c_.incr(); return *this;}
+ const Value& operator*() {return c_.getValue();}
+ };
+
+ const_iterator begin() {
+ LastOdd_=V_;
+ LastEven_=V_;
+ isOdd_=true;
+ return const_iterator(*this);
+ }
+
+ void incr() {
+ Block result(*(const_cast<Field*>(F_)),b_,b_);
+ if (isOdd_) {
+ M_->applyLeft(LastEven_,LastOdd_);
+ MD_.mul(result,U_,LastEven_);
+ } else {
+ M_->applyLeft(LastOdd_,LastEven_);
+ MD_.mul(result,U_,LastOdd_);
+ }
+ isOdd_=!isOdd_;
+ for (size_t i=0;i<b_;++i) {
+ for (size_t j=0;j<b_;++j) {
+ typename Field::Element d;
+ result.getEntry(d,i,j);
+ val_.setEntry(i,j,d);
+ }
+ }
+ }
+
+ const Value& getValue() const {
+ return val_;
+ }
+
+ size_t rowdim() const {return b_;}
+ size_t coldim() const {return b_;}
+
+ const Blackbox* getBB() const {return M_;}
+
+protected:
+
+ size_t b_;
+
+ const Field *F_;
+
+ Block U_, V_, LastOdd_, LastEven_;
+
+ Value val_;
+
+ bool isOdd_;
+
+ const Blackbox *M_;
+
+ MatrixDomain<Field> MD_;
+};
+
+}
+
+#endif
diff --git a/linbox/algorithms/bbcharpoly.h b/linbox/algorithms/bbcharpoly.h
index 866ac1a..3458efd 100644
--- a/linbox/algorithms/bbcharpoly.h
+++ b/linbox/algorithms/bbcharpoly.h
@@ -34,13 +34,13 @@
#define __LINBOX_bbcharpoly_H
#define _LB_MAXITER 5
-#include <vector>
-#include <map>
+
+#include <givaro/givpoly1.h>
+
#include "linbox/blackbox/scalar-matrix.h"
#include "linbox/blackbox/sum.h"
-#include "linbox/ring/givaro-polynomial.h"
-#include "linbox/field/modular.h"
+#include "linbox/ring/modular.h"
#include "linbox/field/field-traits.h"
#include "linbox/solutions/det.h"
#include "linbox/solutions/rank.h"
@@ -49,6 +49,9 @@
#include "linbox/algorithms/matrix-hom.h"
#include "linbox/blackbox/polynomial.h"
+#include <vector>
+#include <map>
+
namespace LinBox
{
@@ -68,7 +71,8 @@ namespace LinBox
class FactorMult {
public:
FactorMult() :
- multiplicity(0),dep(NULL)
+ fieldP(NULL),intP(NULL)
+ ,multiplicity(0),dep(NULL)
{}
FactorMult( FieldPoly* FP, IntPoly* IP, unsigned long m, FactorMult<FieldPoly,IntPoly>*d) :
fieldP(FP), intP(IP), multiplicity(m), dep(d)
@@ -92,7 +96,7 @@ namespace LinBox
--i;
}
tmp = tmp/k + (int)(multiplicity - dep->multiplicity) / d;
- dep->multiplicity = tmp ;
+ dep->multiplicity =(size_t) tmp ;
//std::cerr<<"Updating "<<*dep->fieldP<<" --> mul = "<<tmp<<std::endl;
*goal -= tmp * ((int)dep->fieldP->size()-1);
@@ -102,7 +106,7 @@ namespace LinBox
int tmp = (int)((n - 2 * dep->multiplicity + multiplicity) / (dep->fieldP->size()-1));
*goal -= tmp * ((int)dep->fieldP->size()-1);
//std::cerr<<"Updating (leaf)"<<*dep->fieldP<<" --> mul = "<<tmp<<std::endl;
- dep->multiplicity = tmp;
+ dep->multiplicity = (size_t)tmp;
return 1;
}
}
@@ -140,9 +144,9 @@ namespace LinBox
/** Algorithm computing the integer characteristic polynomial
* of a blackbox.
*/
- template < class BlackBox >
- static typename GivPolynomialRing<typename BlackBox::Field>::Element&
- blackboxcharpoly (typename GivPolynomialRing<typename BlackBox::Field>::Element & P,
+ template < class BlackBox, class Polynomial >
+ static Polynomial&
+ blackboxcharpoly (Polynomial& P,
const BlackBox & A,
const RingCategories::IntegerTag & tag,
const Method::Blackbox & M)
@@ -150,11 +154,11 @@ namespace LinBox
commentator().start ("Integer BlackBox Charpoly ", "IbbCharpoly");
typename BlackBox::Field intRing = A.field();
- typedef Modular<uint32_t> Field;
+ typedef Givaro::Modular<uint32_t> Field;
typedef typename BlackBox::template rebind<Field>::other FieldBlackBox;
- typedef GivPolynomialRing<typename BlackBox::Field, Givaro::Dense> IntPolyDom;
+ typedef Givaro::Poly1FactorDom<typename BlackBox::Field, Givaro::Dense> IntPolyDom;
typedef typename IntPolyDom::Element IntPoly;
- typedef GivPolynomialRing<Field>::Element FieldPoly;
+ typedef Givaro::Poly1FactorDom<Field,Givaro::Dense>::Element FieldPoly;
// Set of factors-multiplicities sorted by degree
typedef FactorMult<FieldPoly,IntPoly> FM;
typedef std::multimap<unsigned long,FM*> FactPoly;
@@ -167,16 +171,16 @@ namespace LinBox
IntPolyDom IPD(intRing);
/* Computation of the integer minimal polynomial */
- IntPoly intMinPoly;
+ Polynomial intMinPoly(A.field());
minpoly (intMinPoly, A, M);
if (intMinPoly.size() == n+1){
commentator().stop ("done", NULL, "IbbCharpoly");
return P = intMinPoly;
}
/* Factorization over the integers */
- std::vector<IntPoly*> intFactors;
- std::vector<unsigned long> exp;
- IPD.factor (intFactors, exp, intMinPoly);
+ std::vector<IntPoly> intFactors;
+ std::vector<uint64_t> exp;
+ IPD.factor (intFactors, exp, IntPoly(intMinPoly.getRep().begin(),intMinPoly.getRep().end()));
size_t factnum = intFactors.size();
/* Choose a modular prime field */
@@ -188,10 +192,10 @@ namespace LinBox
int goal =(int) n;
for (size_t i = 0; i < intFactors.size(); ++i) {
- unsigned long deg = (intFactors[i]->size()-1);
+ uint64_t deg = (intFactors[i].size()-1);
FactorMult<FieldPoly,IntPoly>* FFM=NULL;
if (exp[i] > 1) {
- IntPoly *tmp = new IntPoly(*intFactors[i]);
+ IntPoly *tmp = new IntPoly(intFactors[i]);
FM* depend = NULL;
for (size_t j = 1; j <= exp[i]; ++j){
IntPoly * tmp2 = new IntPoly(*tmp);
@@ -202,21 +206,21 @@ namespace LinBox
factCharPoly.insert (std::pair<size_t, FM*> (deg, FFM));
++factnum;
depend = FFM;
- deg += intFactors[i]->size()-1;
+ deg += intFactors[i].size()-1;
if (j < exp[i])
- IPD.mul (*tmp, *tmp2, *intFactors[i]);
+ IPD.mul (*tmp, *tmp2, intFactors[i]);
}
delete tmp;
--factnum;
FFM->multiplicity = 1; // The last factor is present in minpoly
- goal -= (int)deg-(int)intFactors[i]->size()+1;
+ goal -= (int)deg-(int)intFactors[i].size()+1;
leadingBlocks.insert (std::pair<FM*,bool>(FFM,false));
}
else {
- FieldPoly* fp=new FieldPoly(intFactors[i]->size());
- typename IntPoly::template rebind<Field>() (*fp, *(intFactors[i]), F);
- FFM = new FM (fp,intFactors[i],1,NULL);
- factCharPoly.insert (std::pair<size_t, FM* > (intFactors[i]->size()-1, FFM));
+ FieldPoly* fp=new FieldPoly(intFactors[i].size());
+ typename IntPoly::template rebind<Field>() (*fp, (intFactors[i]), F);
+ FFM = new FM (fp,&intFactors[i],1,NULL);
+ factCharPoly.insert (std::pair<size_t, FM* > (intFactors[i].size()-1, FFM));
leadingBlocks.insert (std::pair<FM*,bool>(FFM,false));
goal -= (int)deg;
}
@@ -229,9 +233,9 @@ namespace LinBox
// Building the integer charpoly
IntPoly intCharPoly (n+1);
IntPoly tmpP;
- intRing.init (intCharPoly[0], 1);
+ intRing.assign(intCharPoly[0], intRing.one);
for (FactPolyIterator it_f = factCharPoly.begin(); it_f != factCharPoly.end(); ++it_f){
- IPD.pow (tmpP, *it_f->second->intP, it_f->second->multiplicity);
+ IPD.pow (tmpP, *it_f->second->intP, (long) it_f->second->multiplicity);
IPD.mulin (intCharPoly, tmpP);
delete it_f->second->intP;
delete it_f->second->fieldP;
@@ -239,27 +243,27 @@ namespace LinBox
}
commentator().stop ("done", NULL, "IbbCharpoly");
- return P = intCharPoly;
+ return P = Polynomial(A.field(), typename Polynomial::Rep(intCharPoly.begin(),intCharPoly.end()));
}
/** Algorithm computing the characteristic polynomial
* of a blackbox over a prime field.
*/
- template < class BlackBox >
- static typename GivPolynomialRing<typename BlackBox::Field>::Element&
- blackboxcharpoly (typename GivPolynomialRing<typename BlackBox::Field>::Element & P,
+ template < class BlackBox, class Polynomial >
+ static Polynomial&
+ blackboxcharpoly (Polynomial & P,
const BlackBox & A,
const RingCategories::ModularTag & tag,
const Method::Blackbox & M)
{
- commentator().start ("Modular BlackBox Charpoly ", "MbbCharpoly");
+ commentator().start ("Givaro::Modular BlackBox Charpoly ", "MbbCharpoly");
typedef typename BlackBox::Field Field;
- typedef GivPolynomialRing<Field, Givaro::Dense> PolyDom;
- typedef typename PolyDom::Element Polynomial;
+ typedef Givaro::Poly1FactorDom<Field, Givaro::Dense> PolyDom;
+ typedef typename PolyDom::Element FieldPoly;
// Set of factors-multiplicities sorted by degree
- typedef std::multimap<unsigned long,FactorMult<Polynomial>* > FactPoly;
+ typedef std::multimap<unsigned long,FactorMult<FieldPoly>* > FactPoly;
typedef typename FactPoly::iterator FactPolyIterator;
- std::multimap<FactorMult<Polynomial>*,bool> leadingBlocks;
+ std::multimap<FactorMult<FieldPoly>*,bool> leadingBlocks;
//typename std::multimap<FactorMult<Polynomial>*,bool>::iterator lead_it;
Field F = A.field();
@@ -277,58 +281,57 @@ namespace LinBox
}
- Polynomial charPoly (n+1);
+ FieldPoly charPoly (n+1);
{ /* Factorization over the field */
- std::vector<Polynomial*> factors;
- std::vector<unsigned long> exp;
+ std::vector<FieldPoly> factors;
+ std::vector<uint64_t> exp;
- PD.factor (factors, exp, minPoly);
+ PD.factor (factors, exp, FieldPoly(minPoly.getRep().begin(),minPoly.getRep().end()));
size_t factnum = factors.size();
/* Building the structure of factors */
int goal = (int)n;
for (size_t i = 0; i < factors.size(); ++i) {
- unsigned long deg = (factors[i]->size()-1);
- FactorMult<Polynomial>* FFM=NULL;
+ uint64_t deg = (factors[i].size()-1);
+ FactorMult<FieldPoly>* FFM=NULL;
if (exp[i] > 1) {
- Polynomial* tmp = new Polynomial(*factors[i]);
- FactorMult<Polynomial>* depend = NULL;
+ FieldPoly* tmp = new FieldPoly(factors[i]);
+ FactorMult<FieldPoly>* depend = NULL;
for (size_t j = 1; j <= exp[i]; ++j){
- Polynomial * tmp2 = new Polynomial(*tmp);
- FFM = new FactorMult<Polynomial> (tmp2, tmp2, 0, depend);
+ FieldPoly* tmp2 = new FieldPoly(*tmp);
+ FFM = new FactorMult<FieldPoly> (tmp2, tmp2, 0, depend);
// std::cerr<<"Inserting new factor (exp>1): "<<(*tmp2)<<std::endl;
- factCharPoly.insert (std::pair<size_t, FactorMult<Polynomial>* > (deg, FFM));
+ factCharPoly.insert (std::pair<size_t, FactorMult<FieldPoly>* > (deg, FFM));
++factnum;
depend = FFM;
- deg += factors[i]->size()-1;
+ deg += factors[i].size()-1;
if (j < exp[i])
- PD.mul (*tmp, *tmp2, *factors[i]);
+ PD.mul (*tmp, *tmp2, factors[i]);
}
delete tmp;
--factnum;
FFM->multiplicity = 1; // The last factor is present in minpoly
- goal -= (int)(deg-factors[i]->size())+1;
- leadingBlocks.insert (std::pair<FactorMult<Polynomial>*,bool>(FFM,false));
- delete factors[i] ;
+ goal -= (int)(deg-factors[i].size())+1;
+ leadingBlocks.insert (std::pair<FactorMult<FieldPoly>*,bool>(FFM,false));
}
else {
- FFM = new FactorMult<Polynomial> (factors[i],factors[i],1,NULL);
+ FFM = new FactorMult<FieldPoly> (&factors[i],&factors[i],1U,NULL);
//std::cerr<<"Inserting new factor : "<<*factors[i]<<std::endl;
- factCharPoly.insert (std::pair<size_t, FactorMult<Polynomial>* > (factors[i]->size()-1, FFM));
- leadingBlocks.insert (std::pair<FactorMult<Polynomial>*,bool>(FFM,false));
+ factCharPoly.insert (std::pair<size_t, FactorMult<FieldPoly>* > (factors[i].size()-1, FFM));
+ leadingBlocks.insert (std::pair<FactorMult<FieldPoly>*,bool>(FFM,false));
goal -= (int)deg;
}
}
findMultiplicities ( A, factCharPoly, leadingBlocks, goal, M);
// Building the product
- Polynomial tmpP;
- F.init (charPoly[0], 1);
+ FieldPoly tmpP;
+ F.assign(charPoly[0], F.one);
for (FactPolyIterator it_f = factCharPoly.begin(); it_f != factCharPoly.end(); ++it_f){
- PD.pow (tmpP, *it_f->second->fieldP, it_f->second->multiplicity);
+ PD.pow (tmpP, *it_f->second->fieldP,(long) it_f->second->multiplicity);
PD.mulin (charPoly, tmpP);
delete it_f->second->fieldP;
delete it_f->second;
@@ -338,7 +341,7 @@ namespace LinBox
commentator().stop ("done", NULL, "MbbCharpoly");
- return P = charPoly;
+ return P = Polynomial(A.field(), typename Polynomial::Rep(charPoly.begin(),charPoly.end()));
}
@@ -352,7 +355,7 @@ namespace LinBox
sols.push_back( ufv);
}
else if ( goal > 0 ){
- for (size_t i=i0; i<ufv.size(); ++i){
+ for (size_t i=(size_t)i0; i<ufv.size(); ++i){
ufv[i].multiplicity++;
trials( sols, goal - (int)ufv[i].fieldP->size()+1, ufv, (int)i );
ufv[i].multiplicity--;
@@ -369,7 +372,7 @@ namespace LinBox
{
typedef std::multimap<unsigned long, FactorMult<FieldPoly,IntPoly>* > FactPoly;
typedef typename BlackBox::Field Field;
- typedef GivPolynomialRing<Field, Givaro::Dense> PolyDom;
+ typedef Givaro::Poly1FactorDom<Field, Givaro::Dense> PolyDom;
typename FactPoly::iterator itf = factCharPoly.begin();
typename std::multimap<FactorMult<FieldPoly,IntPoly>*,bool>::iterator lead_it;
Field F = A.field();
@@ -393,7 +396,7 @@ namespace LinBox
PolynomialBB<BlackBox, FieldPoly > PA (A, *itf->second->fieldP);
rank (r, PA, M) ;
}
- itf->second->multiplicity = r;
+ itf->second->multiplicity =(size_t) r;
//std::cerr<<"Rank 1 : "<<*itf->second->fieldP<<" --> "<<r<<std::endl;
--factnum;
@@ -411,7 +414,7 @@ namespace LinBox
long unsigned int r;
rank (r, PA, M);
- itf->second->multiplicity =r;
+ itf->second->multiplicity =(size_t)r;
//std::cerr<<"Rank > 1 : "<<*itf->second->intP<<" --> "<<r<<std::endl;
--factnum;
@@ -441,9 +444,9 @@ namespace LinBox
//std::cerr<<"extra factor : "<<*currFFM->fieldP<<" --> "<<r<<std::endl;
int tmp = (int)currFFM->multiplicity;
- currFFM->multiplicity = r;
+ currFFM->multiplicity =(size_t) r;
currFFM->update (n,&goal);
- currFFM->multiplicity = tmp;
+ currFFM->multiplicity = (size_t)tmp;
}
}
else {
@@ -463,10 +466,10 @@ namespace LinBox
goal -= (lbm-1)*((int)lead_it->first->fieldP->size()-1);
}
else {
- lbm = (int)((n-lead_it->first->multiplicity) / ((int)lead_it->first->fieldP->size()-1));
+ lbm = (int)((int)(n-lead_it->first->multiplicity) / ((int)(lead_it->first->fieldP->size())-1));
goal -= (lbm-1)*((int)lead_it->first->fieldP->size()-1);
}
- lead_it->first->multiplicity = lbm;
+ lead_it->first->multiplicity = (size_t)lbm;
}
}
@@ -492,7 +495,7 @@ namespace LinBox
//Building the matrix A + gamma.Id mod p
F.neg( mgamma, gamma );
- ScalarMatrix<Field> gammaId( F, n, gamma );
+ ScalarMatrix<Field> gammaId( F, n, n, gamma );
Sum<BlackBox,ScalarMatrix<Field> > Agamma(A, gammaId);
// Compute det (A+gamma.Id)
@@ -502,7 +505,7 @@ namespace LinBox
// Compute Prod(Pi(-gamma)^mi)
typename Field::Element tmp, e;
- F.init (d2,1);
+ F.assign(d2,F.one);
typename FactPoly::iterator it_f=factCharPoly.begin();
PolyDom PD_f (F);
for (size_t i = 0; i < factCharPoly.size()-factnum; ++i, ++it_f){
@@ -511,7 +514,7 @@ namespace LinBox
F.mulin (d2, tmp);
}
while ( uf_it != sols.end() ){
- F.init (e,1);
+ F.assign (e,F.one);
for (size_t i = 0; i < uf_it->size(); ++i){
PD_f.eval( tmp, *(*uf_it)[i].fieldP, mgamma );
for (size_t j=0; j < (*uf_it)[i].multiplicity; ++j)
@@ -540,11 +543,10 @@ namespace LinBox
#endif // __BBCHARPOLY_H
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
// Local Variables:
// mode: C++
// tab-width: 8
// indent-tabs-mode: nil
// c-basic-offset: 8
// End:
-
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/algorithms/bbsolve.h b/linbox/algorithms/bbsolve.h
index a50ddc0..d6e2842 100644
--- a/linbox/algorithms/bbsolve.h
+++ b/linbox/algorithms/bbsolve.h
@@ -4,20 +4,20 @@
* written
* by Bradford Hovinen <hovinen at cis.udel.edu>
*
- *
+ *
* ========LICENCE========
* This file is part of the library LinBox.
- *
+ *
* LinBox is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
- *
+ *
* This library 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
* Lesser General Public License for more details.
- *
+ *
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
@@ -28,7 +28,6 @@
#ifndef __LINBOX_bbsolve_H
#define __LINBOX_bbsolve_H
-#include <vector>
#include <algorithm>
// must fix this list...
@@ -112,7 +111,7 @@ namespace LinBox
const Field &F,
const WiedemannTraits &traits = WiedemannTraits ())
{
- Vector u;
+ Vector u(A.field());
WiedemannSolver<Field> solver (F, traits);
VectorWrapper::ensureDim (u, A.rowdim ());
@@ -297,11 +296,10 @@ namespace LinBox
#endif // __LINBOX_bbsolve_H
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
// Local Variables:
// mode: C++
// tab-width: 8
// indent-tabs-mode: nil
// c-basic-offset: 8
// End:
-
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/algorithms/blackbox-block-container-base.h b/linbox/algorithms/blackbox-block-container-base.h
index 5f0fa25..a2c0aa8 100644
--- a/linbox/algorithms/blackbox-block-container-base.h
+++ b/linbox/algorithms/blackbox-block-container-base.h
@@ -35,16 +35,61 @@
#include <time.h> // for seeding
+#ifdef _OPENMP
+#include <omp.h>
+#endif
+
#include "linbox/linbox-config.h"
#include "linbox/util/debug.h"
#include "linbox/blackbox/archetype.h"
-#include "linbox/matrix/blas-matrix.h"
+#include "linbox/matrix/dense-matrix.h"
#include "linbox/vector/vector-domain.h"
-#include "linbox/algorithms/blas-domain.h"
+#include "linbox/matrix/matrix-domain.h"
+#include "linbox/matrix/matrix-domain.h"
+
+// #include "linbox/blackbox/triplesbb-omp.h"
+#include "linbox/matrix/sparse-matrix.h"
+#include "linbox/blackbox/pascal.h"
namespace LinBox
{
+//Temporary fix to deal with the fact that not all Blackboxes have applyLeft()
+template<class Field,class Block>
+class MulHelper {
+public:
+ template<class Blackbox>
+ static void mul(const Field& F,
+ Block &M1, const Blackbox &M2, const Block& M3) {
+ linbox_check( M1.rowdim() == M2.rowdim());
+ linbox_check( M2.coldim() == M3.rowdim());
+ linbox_check( M1.coldim() == M3.coldim());
+
+ MatrixDomain<Field> MD(F);
+ typename Block::ColIterator p1 = M1.colBegin();
+ typename Block::ConstColIterator p3 = M3.colBegin();
+
+ for (; p3 != M3.colEnd(); ++p1,++p3) {
+ M2.apply(*p1,*p3);
+ }
+ }
+
+ static void mul (const Field& F,
+ Block &M1, const SparseMatrix<Field,SparseMatrixFormat::TPL> &M2, const Block& M3) {
+ M2.applyLeft(M1,M3);
+ }
+
+ static void mul (const Field& F,
+ Block &M1, const SparseMatrix<Field,SparseMatrixFormat::TPL_omp> &M2, const Block& M3) {
+ M2.applyLeft(M1,M3);
+ }
+
+ static void mul (const Field& F,
+ Block &M1, const PascalBlackbox<Field> &M2, const Block& M3) {
+ M2.applyLeft(M1,M3);
+ }
+};
+
#ifndef MIN
#define MIN(a,b) ((a)<(b)?(a):(b))
#endif
@@ -75,9 +120,10 @@ namespace LinBox
// Sequence constructor from a blackbox and a field
// cs set the size of the sequence
BlackboxBlockContainerBase (const Blackbox *BD, const Field &F, size_t m, size_t n, size_t seed=(size_t)time(NULL)) :
- _field(F) , _BB(BD), _size(BD->rowdim()/m + BD->coldim()/n +2)
- , _nn(BD->rowdim()), _m(m), _n(n),
- _blockU(F,_m,_nn),_blockV(F,_nn,_n),_value(_field,m,n), _seed(seed)
+ _field(&F) , _BB(BD), _size(BD->rowdim()/m + BD->coldim()/n +2)
+ , _nn(BD->rowdim()), _m(m), _n(n)
+ ,casenumber(0)
+ ,_blockU(F,_m,_nn),_blockV(F,_nn,_n),_value(field(),m,n), _seed(seed)
{}
@@ -111,7 +157,8 @@ namespace LinBox
size_t size() const { return _size; }
// field of the sequence
- const Field &getField () const { return _field; }
+ const Field &field () const { return *_field; }
+ const Field &getField () const { return *_field; } // deprecated
// blackbox of the sequence
const Blackbox *getBB () const { return _BB; }
@@ -140,7 +187,7 @@ namespace LinBox
/// Members
//--------------
- Field _field;
+ const Field *_field;
const Blackbox *_BB;
size_t _size; // length of sequence
size_t _nn; // _BB order (square mat)
@@ -161,21 +208,12 @@ namespace LinBox
/// Initializers
//--------------
+
// Blackbox multiplication using apply function
- void Mul(Block &M1, const Blackbox &M2 , const Block& M3)
+ inline void Mul(Block &M1, const Blackbox &M2 , const Block& M3)
{
- linbox_check( M1.rowdim() == M2.rowdim());
- linbox_check( M2.coldim() == M3.rowdim());
- linbox_check( M1.coldim() == M3.coldim());
-
- typename Block::ColIterator p1 = M1.colBegin();
- typename Block::ConstColIterator p3 = M3.colBegin();
-
- for (; p3 != M3.colEnd(); ++p1,++p3) {
- M2.apply(*p1,*p3);
- }
- }
-
+ MulHelper<Field,Block>::mul(field(),M1,M2,M3);
+ }
/// User Left and Right blocks
void init (const Block& U, const Block& V)
@@ -188,8 +226,8 @@ namespace LinBox
casenumber = 1;
_blockU = U;
_blockV = V;
- _value = Value(_field,_m,_n);
- BlasMatrixDomain<Field> BMD(_field);
+ _value = Value(*_field,_m,_n);
+ BlasMatrixDomain<Field> BMD(*_field);
BMD.mul(_value, _blockU, _blockV);
}
@@ -198,7 +236,7 @@ namespace LinBox
{
casenumber = 1;
- typename Field::RandIter G(_field,0,_seed);
+ typename Field::RandIter G(*_field,0,_seed);
Block U (m, _BB->rowdim());
_blockU =U;
Block V(_BB->coldim(), n);
@@ -212,8 +250,8 @@ namespace LinBox
for (; iter_V != _blockV.End();++iter_V)
G.random(*iter_V);
- _value = Value(_field,m,n);
- BlasMatrixDomain<Field> BMD(_field);
+ _value = Value(*_field,m,n);
+ BlasMatrixDomain<Field> BMD(*_field);
BMD.mul(_value, _blockU, _blockV);
}
};
@@ -223,11 +261,10 @@ namespace LinBox
#endif // __LINBOX_blackbox_block_container_base_H
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
// Local Variables:
// mode: C++
// tab-width: 8
// indent-tabs-mode: nil
// c-basic-offset: 8
// End:
-
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/algorithms/blackbox-block-container.h b/linbox/algorithms/blackbox-block-container.h
index 6a785ce..e21f748 100644
--- a/linbox/algorithms/blackbox-block-container.h
+++ b/linbox/algorithms/blackbox-block-container.h
@@ -34,8 +34,8 @@
#include "linbox/util/debug.h"
#include "linbox/algorithms/blackbox-block-container-base.h"
-#include "linbox/matrix/blas-matrix.h"
-#include "linbox/algorithms/blas-domain.h"
+#include "linbox/matrix/dense-matrix.h"
+#include "linbox/matrix/matrix-domain.h"
#define _BBC_TIMING
@@ -54,9 +54,9 @@ namespace LinBox
public:
typedef _Field Field;
typedef typename Field::Element Element;
- typedef typename Field::RandIter RandIter;
- typedef BlasMatrix<Field> Block;
- typedef BlasMatrix<Field> Value;
+ typedef typename Field::RandIter RandIter;
+ typedef BlasMatrix<Field> Block;
+ typedef BlasMatrix<Field> Value;
// Default constructor
BlackboxBlockContainer () {}
@@ -139,12 +139,12 @@ namespace LinBox
tSequence.start();
#endif
if (this->casenumber) {
- this->Mul(_blockW,*this->_BB,this->_blockV);
+ this->Mul(_blockW,*this->_BB,this->_blockV);
_BMD.mul(this->_value, this->_blockU, _blockW);
this->casenumber = 0;
- }
+ }
else {
- this->Mul(this->_blockV,*this->_BB,_blockW);
+ this->Mul(this->_blockV,*this->_BB,_blockW);
_BMD.mul(this->_value, this->_blockU, this->_blockV);
this->casenumber = 1;
}
@@ -166,8 +166,8 @@ namespace LinBox
typedef _Field Field;
typedef typename Field::Element Element;
typedef typename Field::RandIter RandIter;
- typedef BlasMatrix<Field> Block;
- typedef BlasMatrix<Field> Value;
+ typedef BlasMatrix<Field> Block;
+ typedef BlasMatrix<Field> Value;
enum Launcher {RowUpdate=0, ColUpdate=1, Nothing=2};
@@ -418,7 +418,7 @@ namespace LinBox
BlasMatrix<Field> T(_blockW, i*numblock, 0, numblock, block);
_BMD.mul(tmp, _Special_U[i], T);
for (size_t j=0;j<block;++j){
- this->_field.assign(this->_value.refEntry(i,j), tmp[j]);
+ this->getField()->assign(this->_value.refEntry(i,j), tmp[j]);
}
}
@@ -432,7 +432,7 @@ namespace LinBox
BlasMatrix<Field> T(this->_blockV, i*numblock, 0, numblock, block);
_BMD.mul(tmp, _Special_U[i], T);
for (size_t j=0;j<block;++j)
- this->_field.assign(this->_value.refEntry(i,j), tmp[j]);
+ this->getField().assign(this->_value.refEntry(i,j), tmp[j]);
}
this->casenumber = 1;
diff --git a/linbox/algorithms/blackbox-container-base.h b/linbox/algorithms/blackbox-container-base.h
index 4ce344a..d61487d 100644
--- a/linbox/algorithms/blackbox-container-base.h
+++ b/linbox/algorithms/blackbox-container-base.h
@@ -59,17 +59,22 @@ namespace LinBox
typedef typename Field::Element Element;
//-- Constructors
- BlackboxContainerBase () {}
+ //! @bug no need for F
BlackboxContainerBase (const Blackbox *BB, const Field &F) :
- _field (F), _VD (F), _BB (BB), _size ((long)MIN (BB->rowdim (), BB->coldim ()))
+ _field (&F), _VD (F), _BB (BB), _size ((long)MIN (BB->rowdim (), BB->coldim ()))
+ ,casenumber(0)
+ ,u(F),v(F)
{
_size <<= 1;
}
// Pascal Giorgi 16.02.2004
+ //! @bug no need for F
BlackboxContainerBase (const Blackbox *BB, const Field &F, unsigned long Size) :
- _field (F), _VD (F), _BB (BB), _size ((long)Size)
+ _field (&F), _VD (F), _BB (BB), _size ((long)Size)
+ ,casenumber(0)
+ ,u(F),v(F)
{}
virtual ~BlackboxContainerBase ()
@@ -78,21 +83,22 @@ namespace LinBox
}
class const_iterator {
- BlackboxContainerBase<Field, Blackbox> &_c;
+ BlackboxContainerBase<Field, Blackbox> *_c;
public:
- //const_iterator () {} // BB ??
+ const_iterator () : _c(0){} // BB ??
const_iterator (BlackboxContainerBase<Field, Blackbox> &C) :
- _c (C)
+ _c (&C)
{}
- const_iterator &operator ++ () { _c._launch (); return *this; }
- const Element &operator * () { _c._wait (); return _c.getvalue (); }
+ const_iterator &operator ++ () { _c->_launch (); return *this; }
+ const Element &operator * () { _c->_wait (); return _c->getvalue (); }
};
const_iterator begin () { return const_iterator (*this); }
const_iterator end () { return const_iterator (); }
long size () const { return _size; }
- const Field &getField () const { return _field; }
+ const Field &getField () const { return *_field; } // deprecated
+ const Field &field () const { return *_field; }
Blackbox *getBB () const { return _BB; }
protected:
@@ -113,15 +119,15 @@ namespace LinBox
/// Members
//--------------
- Field _field;
+ const Field *_field;
VectorDomain<Field> _VD;
const Blackbox *_BB;
long _size;
- // BDS 22.03.03
+ // BDS 22.03.03 // bb : what is casenumber ?
long casenumber;
- std::vector<Element> u, v;
+ BlasVector<Field> u, v;
Element _value;
const Element &getvalue() { return _value; }
@@ -151,8 +157,8 @@ namespace LinBox
{
casenumber = 1;
u.resize (_BB->coldim ());
- for (long i = u.size (); i--;)
- g.random (u[i]);
+ for (long i = (long)u.size (); i--;)
+ g.random (u[(size_t)i]);
v.resize (_BB->rowdim ());
return _VD.dot (_value, u, u);
}
@@ -173,11 +179,10 @@ namespace LinBox
#endif // __LINBOX_blackbox_container_base_H
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
// Local Variables:
// mode: C++
// tab-width: 8
// indent-tabs-mode: nil
// c-basic-offset: 8
// End:
-
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/algorithms/blackbox-container-symmetric.h b/linbox/algorithms/blackbox-container-symmetric.h
index 3d503f6..8b7f292 100644
--- a/linbox/algorithms/blackbox-container-symmetric.h
+++ b/linbox/algorithms/blackbox-container-symmetric.h
@@ -59,7 +59,7 @@ namespace LinBox
template<class Vector>
BlackboxContainerSymmetric (const Blackbox *D, const Field &F, const Vector &u0) :
BlackboxContainerBase<Field, _Blackbox> (D, F)
- { init (u0, u0); }
+ { this->init (u0, u0); }
BlackboxContainerSymmetric (const Blackbox *D, const Field &F, RandIter &g) :
BlackboxContainerBase<Field, _Blackbox> (D, F)
{ this->init (g); }
diff --git a/linbox/algorithms/blackbox-container.h b/linbox/algorithms/blackbox-container.h
index 948b788..05c5994 100644
--- a/linbox/algorithms/blackbox-container.h
+++ b/linbox/algorithms/blackbox-container.h
@@ -6,20 +6,20 @@
*
* ------------------------------------
*
- *
+ *
* ========LICENCE========
* This file is part of the library LinBox.
- *
+ *
* LinBox is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
- *
+ *
* This library 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
* Lesser General Public License for more details.
- *
+ *
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
@@ -43,12 +43,13 @@ namespace LinBox
public:
typedef _Blackbox Blackbox;
- BlackboxContainer () {}
+ // BlackboxContainer () { /*std::cerr << "BC def cstor" << std::endl;*/ }
template<class Vector>
BlackboxContainer(const Blackbox * D, const Field &F, const Vector &u0) :
BlackboxContainerBase<Field, Blackbox> (D, F)
+ ,w(F)
{
init (u0, u0); w = this->u;
#ifdef INCLUDE_TIMING
@@ -60,6 +61,7 @@ namespace LinBox
template<class Vector>
BlackboxContainer(const Blackbox * D, const Field &F, const Vector &u0, unsigned long size) :
BlackboxContainerBase<Field, Blackbox> (D, F,size)
+ ,w(F)
{
init (u0, u0); w = this->u;
#ifdef INCLUDE_TIMING
@@ -71,6 +73,7 @@ namespace LinBox
template<class Vector1, class Vector2>
BlackboxContainer(const Blackbox * D, const Field &F, const Vector1 &u0, const Vector2& v0) :
BlackboxContainerBase<Field, Blackbox> (D, F)
+ ,w(F)
{
init (u0, v0); w = this->v;
#ifdef INCLUDE_TIMING
@@ -80,14 +83,15 @@ namespace LinBox
BlackboxContainer(const Blackbox * D, const Field &F, RandIter &g) :
BlackboxContainerBase<Field, Blackbox> (D, F)
+ ,w(F)
{
this->casenumber = 1;
this->u.resize (this->_BB->coldim ());
- for (long i = this->u.size (); i--;)
- g.random (this->u[i]);
+ for (long i = (long)this->u.size (); i--;)
+ g.random (this->u[(size_t)i]);
this->w.resize (this->_BB->coldim ());
- for (long i = this->w.size (); i--;)
- g.random (this->w[i]);
+ for (long i = (long)this->w.size (); i--;)
+ g.random (this->w[(size_t)i]);
this->v.resize (this->_BB->rowdim ());
this->_VD.dot (this->_value, this->u, this->w);
#ifdef INCLUDE_TIMING
@@ -101,7 +105,8 @@ namespace LinBox
#endif // INCLUDE_TIMING
protected:
- std::vector<typename Field::Element> w;
+ // std::vector<typename Field::Element> w;
+ BlasVector<Field> w ;
#ifdef INCLUDE_TIMING
Timer _timer;
diff --git a/linbox/algorithms/blas-domain-multimod.h b/linbox/algorithms/blas-domain-multimod.h
deleted file mode 100644
index 9a2325d..0000000
--- a/linbox/algorithms/blas-domain-multimod.h
+++ /dev/null
@@ -1,94 +0,0 @@
-/* linbox/algorithms/blas-domain.inl
- * Copyright (C) 2004 Pascal Giorgi, Clément Pernet
- *
- * Written by :
- * Pascal Giorgi pascal.giorgi at ens-lyon.fr
- * Clément Pernet clement.pernet at imag.fr
- *
- * ========LICENCE========
- * This file is part of the library LinBox.
- *
- * LinBox is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- * ========LICENCE========
- */
-
-
-
-#ifndef __LINBOX_blas_matrix_domain_multimod_H
-#define __LINBOX_blas_matrix_domain_multimod_H
-
-#include "linbox/matrix/blas-matrix-multimod.h"
-#include "linbox/algorithms/blas-domain.h"
-
-THIS_CODE_MAY_NOT_COMPILE_AND_IS_NOT_TESTED
-
-namespace LinBox
-{
-
-
- /*! specialisation for MultiModDouble.
- */
-// #ifndef __INTEL_COMPILER
- // template <>
-// #endif
- class BlasMatrixDomainInv<MultiModDouble,BlasMatrix<MultiModDouble> > {
- public:
- int operator() (const MultiModDouble &F,
- BlasMatrix<MultiModDouble> &Ainv,
- const BlasMatrix<MultiModDouble> &A) const
- {
-
- linbox_check( A.rowdim() == A.coldim());
- linbox_check( A.rowdim() == Ainv.rowdim());
- linbox_check( A.coldim() == Ainv.coldim());
- BlasMatrix<MultiModDouble> tmp(A);
- return (*this)(F,Ainv,tmp);
- }
-
- int operator() (const MultiModDouble &F,
- BlasMatrix<MultiModDouble> &Ainv,
- BlasMatrix<MultiModDouble> &A) const
- {
-
- linbox_check( A.rowdim() == A.coldim());
- linbox_check( A.rowdim() == Ainv.rowdim());
- linbox_check( A.coldim() == Ainv.coldim());
- int nullity, defrank=0;
-
- for (size_t i=0;i<F.size();++i){
- // get parent fflas field...
- FFPACK::Invert(F.getBase(i),A.rowdim(), A.getMatrix(i)->getPointer(),A.getMatrix(i)->getStride(),
- Ainv.getMatrix(i)->getPointer(),Ainv.getMatrix(i)->getStride(),nullity);
- defrank+=nullity;
- }
- return defrank;
- }
-
- };
-
-}
-
-
-#endif // __LINBOX_blas_matrix_domain_multimod_H
-
-
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
-// Local Variables:
-// mode: C++
-// tab-width: 8
-// indent-tabs-mode: nil
-// c-basic-offset: 8
-// End:
-
diff --git a/linbox/algorithms/blas-domain.h b/linbox/algorithms/blas-domain.h
deleted file mode 100644
index 93e7b19..0000000
--- a/linbox/algorithms/blas-domain.h
+++ /dev/null
@@ -1,827 +0,0 @@
-/* linbox/algorithms/blas-domain.h
- * Copyright (C) 2004 Pascal Giorgi, Clément Pernet
- *
- * Written by :
- * Pascal Giorgi pascal.giorgi at ens-lyon.fr
- * Clément Pernet clement.pernet at imag.fr
- *
- * ========LICENCE========
- * This file is part of the library LinBox.
- *
- * LinBox is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- * ========LICENCE========
- */
-
-/*! @file algorithms/blas-domain.h
- * @ingroup algorithms
- * @brief NO DOC
- * @warning A <code>BlasMatrixDomain<Field></code> should be templated by a
- * \link LinBox::Modular Modular\endlink field. In particular, this domain
- * is not suitable for integers.
- * @warning A \e Field does mean here a \e Field and not a general \f$\mathbf{Z}/m\mathbf{Z}\f$ \e ring. You'll be warned...
- */
-
-#ifndef __LINBOX_blas_matrix_domain_H
-#define __LINBOX_blas_matrix_domain_H
-
-#include <iostream>
-#include <vector>
-
-#include "linbox/linbox-config.h"
-#include "linbox/util/debug.h"
-
-#include <fflas-ffpack/ffpack/ffpack.h>
-#include <fflas-ffpack/fflas/fflas.h>
-#include "linbox/matrix/blas-matrix.h"
-#include "linbox/matrix/permutation-matrix.h"
-
-
-namespace LinBox
-{
-
- const int BlasBound = 1 << 26;
-
- /** @internal
- * Class handling multiplication of a Matrix by an Operand with accumulation and scaling.
- * Operand can be either a matrix or a vector.
- *
- * The only function: operator () is defined :
- * - D = beta.C + alpha. A*B
- * - C = beta.C + alpha. A*B
- */
- template< class Field, class Operand1, class Operand2, class Operand3>
- class BlasMatrixDomainMulAdd {
- public:
- Operand1 &operator() (const Field &F,
- Operand1 &D,
- const typename Field::Element &beta, const Operand1 &C,
- const typename Field::Element &alpha, const Operand2 &A, const Operand3 &B) const;
-
- Operand1 &operator() (const Field &F,
- const typename Field::Element &beta, Operand1 &C,
- const typename Field::Element &alpha, const Operand2 &A, const Operand3 &B) const;
-
-
- // allowing disymetry of Operand2 and Operand3 (only if different type)
- Operand1 &operator() (const Field &F,
- Operand1 &D,
- const typename Field::Element &beta, const Operand1 &C,
- const typename Field::Element &alpha, const Operand3 &A, const Operand2 &B) const;
-
- Operand1 &operator() (const Field &F,
- const typename Field::Element &beta, Operand1 &C,
- const typename Field::Element &alpha, const Operand3 &A, const Operand2 &B) const;
-
-
-
- };
-
- /*!@internal
- * Adding two matrices
- */
- template< class Field, class Operand1, class Operand2, class Operand3>
- class BlasMatrixDomainAdd {
- public:
- Operand1 &operator() (const Field &F,
- Operand1 &C, const Operand2 &A, const Operand3 &B) const;
-
- };
-
- /*!@internal
- * Substracting two matrices
- */
- template< class Field, class Operand1, class Operand2, class Operand3>
- class BlasMatrixDomainSub {
- public:
- Operand1 &operator() (const Field &F,
- Operand1 &C, const Operand2 &A, const Operand3 &B) const;
-
- };
- //! C -= A
- template< class Field, class Operand1, class Operand2>
- class BlasMatrixDomainSubin {
- public:
- Operand1 &operator() (const Field &F,
- Operand1 &C, const Operand2 &A) const;
-
- };
- //! C += A
- template< class Field, class Operand1, class Operand2>
- class BlasMatrixDomainAddin {
- public:
- Operand1 &operator() (const Field &F,
- Operand1 &C, const Operand2 &A) const;
-
- };
-
-
- /*!@internal
- * Copying a matrix
- */
- template< class Field, class Operand1, class Operand2>
- class BlasMatrixDomainCopy {
- public:
- Operand1 &operator() (const Field &F,
- Operand1 &B, const Operand2 &A) const;
-
- };
-
- /*!@internal
- * multiplying two matrices.
- */
- template< class Field, class Operand1, class Operand2, class Operand3>
- class BlasMatrixDomainMul {
- public:
- Operand1 &operator() (const Field &F,
- Operand1 &C, const Operand2 &A, const Operand3 &B) const
- {
- typename Field::Element zero, one;
- F.init( zero, 0UL );
- F.init( one, 1UL );
- return BlasMatrixDomainMulAdd<Field,Operand1,Operand2,Operand3>()( F, zero, C, one, A, B );
- }
- };
-
- /*! @internal
- * Class handling in-place multiplication of a Matrix by an Operand.
- * Operand can be either a matrix a permutation or a vector
- *
- * only function: operator () are defined :
- * - A = A*B
- * - B = A*B
- * .
- * @note In-place multiplications are proposed for the specialization
- * with a matrix and a permutation.
- * @warning Using mulin with two matrices is still defined but is
- * non-sense
- */
- // Operand 2 is always the type of the matrix which is not modified
- // ( for example: BlasPermutation TriangularBlasMatrix )
- template< class Field, class Operand1, class Operand2>
- class BlasMatrixDomainMulin {
- public:
- // Defines a dummy mulin over generic matrices using a temporary
- Operand1 &operator() (const Field &F,
- Operand1 &A, const Operand2 &B) const
- {
- typename Field::Element zero, one;
- F.init( zero, 0UL );
- F.init( one, 1UL );
- Operand1* tmp = new Operand1(A);
- // Effective copy of A
- *tmp = A;
- BlasMatrixDomainMulAdd<Field,Operand1,Operand1,Operand2>()( F, zero, A, one, *tmp, B );
- delete tmp;
- return A;
- }
-
- Operand1 &operator() (const Field &F,
- const Operand2 &A, Operand1 &B ) const
- {
- typename Field::Element zero, one;
- F.init( zero, 0UL );
- F.init( one, 1UL );
- Operand1* tmp = new Operand1(B);
- // Effective copy of B
- *tmp = B;
- BlasMatrixDomainMulAdd<Field,Operand1,Operand1,Operand2>()( F, zero, B, one, A, *tmp );
- delete tmp;
- return B;
- }
- };
-
- /*! @internal
- * Class handling inversion of a Matrix.
- *
- * only function: operator () are defined :
- * - Ainv = A^(-1)
- *
- * Returns nullity of matrix (0 iff inversion was ok)
- *
- * @warning Beware, if A is not const this allows an inplace computation
- * and so A will be modified
- *
- */
- template< class Field, class Matrix>
- class BlasMatrixDomainInv {
- public:
- int &operator() (const Field &F, Matrix &Ainv, const Matrix &A) const;
- int &operator() (const Field &F, Matrix &Ainv, Matrix &A) const;
- };
-
- /*! @internal
- * Class handling rank computation of a Matrix.
- *
- * only function: operator () are defined :
- * - return the rank of A
- *
- * @warning Beware, if A is not const this allows an inplace computation
- * and so A will be modified
- */
- template< class Field, class Matrix>
- class BlasMatrixDomainRank {
- public:
- unsigned int &operator() (const Field &F, const Matrix& A) const;
- unsigned int &operator() (const Field &F, Matrix& A) const;
- };
-
- /*! @internal
- * Class handling determinant computation of a Matrix.
- *
- * only function: operator () are defined :
- * - return the determinant of A
- *
- * @warning Beware, if A is not const this allows an inplace computation
- * and so A will be modified
- */
- template< class Field, class Matrix>
- class BlasMatrixDomainDet {
- public:
- typename Field::Element operator() (const Field &F, const Matrix& A) const;
- typename Field::Element operator() (const Field &F, Matrix& A) const;
- };
-
- /*! @internal
- * Class handling resolution of linear system of a Matrix.
- * with Operand as right or left and side
- *
- * only function: operator () are defined :
- * - X = A^(-1).B
- * - B = A^(-1).B
- */
- template< class Field, class Operand, class Matrix>
- class BlasMatrixDomainLeftSolve {
- public:
- Operand &operator() (const Field &F, Operand &X, const Matrix &A, const Operand &B) const;
- Operand &operator() (const Field &F, const Matrix &A, Operand &B) const;
- };
-
- /*! @internal
- * Class handling resolution of linear system of a Matrix.
- * with Operand as right or left and side
- *
- * only function: operator () are defined :
- * - X = B.A^(-1)
- * - B = B.A^(-1)
- */
- template< class Field, class Operand, class Matrix>
- class BlasMatrixDomainRightSolve {
- public:
- Operand &operator() (const Field &F, Operand &X, const Matrix &A, const Operand &B) const;
- Operand &operator() (const Field &F, const Matrix &A, Operand &B) const;
- };
-
- /*! @internal
- * Class handling the minimal polynomial of a Matrix.
- */
- template< class Field, class Polynomial, class Matrix>
- class BlasMatrixDomainMinpoly {
- public:
- Polynomial& operator() (const Field &F, Polynomial& P, const Matrix& A) const;
- };
-
- /*! @internal
- * Class handling the characteristic polynomial of a Matrix.
- */
- template< class Field, class ContPol, class Matrix>
- class BlasMatrixDomainCharpoly {
- public:
- // typedef Container<Polynomial> ContPol;
-
- ContPol& operator() (const Field &F, ContPol& P, const Matrix& A) const;
- };
-
- /**
- * Interface for all functionnalities provided
- * for BlasMatrix.
- * @internal
- * Done through specialization of all
- * classes defined above.
- */
- template <class Field>
- class BlasMatrixDomain {
-
- public:
- typedef typename Field::Element Element;
-
- protected:
-
- const Field & _field;
- Element _One;
- Element _Zero;
- Element _MOne;
-
- public:
-
- //! Constructor of BlasDomain.
-
- BlasMatrixDomain (const Field& F ) :
- _field(F)
- {
- F.init(_One,1UL);
- F.init(_Zero,0UL);
- F.init(_MOne,-1);
-#ifndef NDEBUG
- if (!Givaro::probab_prime(F.characteristic())) {
- std::cout << " *** WARNING *** " << std::endl;
- std::cout << " You are using a BLAS Domain where your field is not prime " << std::endl;
- }
-#endif
- }
-
- //! Copy constructor
- BlasMatrixDomain (const BlasMatrixDomain<Field> & BMD) :
- _field(BMD._field), _One(BMD._One), _Zero(BMD._Zero), _MOne(BMD._MOne)
- {
-#ifndef NDEBUG
- if (!Givaro::probab_prime(_field.characteristic())) {
- std::cout << " *** WARNING *** " << std::endl;
- std::cout << " You are using a BLAS Domain where your field is not prime " << std::endl;
- }
-#endif
-
- }
-
-
- //! Field accessor
- const Field& field() const
- {
- return _field;
- }
-
-
- /*
- * Basics operation available matrix respecting BlasMatrix interface
- */
-
- //! multiplication.
- //! C = A*B
- template <class Operand1, class Operand2, class Operand3>
- Operand1& mul(Operand1& C, const Operand2& A, const Operand3& B) const
- {
- return BlasMatrixDomainMul<Field,Operand1,Operand2,Operand3>()(_field,C,A,B);
- }
-
- //! addition.
- //! C = A+B
- template <class Operand1, class Operand2, class Operand3>
- Operand1& add(Operand1& C, const Operand2& A, const Operand3& B) const
- {
- return BlasMatrixDomainAdd<Field,Operand1,Operand2,Operand3>()(_field,C,A,B);
- }
-
- //! copy.
- //! B = A
- template <class Operand1, class Operand2>
- Operand1& copy(Operand1& B, const Operand2& A) const
- {
- return BlasMatrixDomainCopy<Field,Operand1,Operand2>()(_field,B,A);
- }
-
- //! substraction
- //! C = A-B
- template <class Operand1, class Operand2, class Operand3>
- Operand1& sub(Operand1& C, const Operand2& A, const Operand3& B) const
- {
- return BlasMatrixDomainSub<Field,Operand1,Operand2,Operand3>()(_field,C,A,B);
- }
-
- //! substraction (in place)
- //! C -= B
- template <class Operand1, class Operand3>
- Operand1& subin(Operand1& C, const Operand3& B) const
- {
- return BlasMatrixDomainSubin<Field,Operand1,Operand3>()(_field,C,B);
- }
-
- //! addition (in place)
- //! C += B
- template <class Operand1, class Operand3>
- Operand1& addin(Operand1& C, const Operand3& B) const
- {
- return BlasMatrixDomainAddin<Field,Operand1,Operand3>()(_field,C,B);
- }
-
-
- //! multiplication with scaling.
- //! C = alpha.A*B
- template <class Operand1, class Operand2, class Operand3>
- Operand1& mul(Operand1& C, const Element& alpha, const Operand2& A, const Operand3& B) const
- {
- return muladdin(_Zero,C,alpha,A,B);
- }
-
-
- //! In place multiplication.
- //! A = A*B
- template <class Operand1, class Operand2>
- Operand1& mulin_left(Operand1& A, const Operand2& B ) const
- {
- return BlasMatrixDomainMulin<Field,Operand1,Operand2>()(_field,A,B);
- }
-
- //! In place multiplication.
- //! B = A*B
- template <class Operand1, class Operand2>
- Operand2& mulin_right(const Operand1& A, Operand2& B ) const
- {
- return BlasMatrixDomainMulin<Field,Operand2,Operand1>()(_field,A,B);
- }
-
- //! axpy.
- //! D = A*B + C
- template <class Operand1, class Operand2, class Operand3>
- Operand1& axpy(Operand1& D, const Operand2& A, const Operand3& B, const Operand1& C) const
- {
- return muladd(D,_One,C,_One,A,B);
- }
-
- //! axpyin.
- //! C += A*B
- template <class Operand1, class Operand2, class Operand3>
- Operand1& axpyin(Operand1& C, const Operand2& A, const Operand3& B) const
- {
- return muladdin(_One,C,_One,A,B);
- }
-
- //! maxpy.
- //! D = C - A*B
- template <class Operand1, class Operand2, class Operand3>
- Operand1& maxpy(Operand1& D, const Operand2& A, const Operand3& B, const Operand1& C)const
- {
- return muladd(D,_One,C,_MOne,A,B);
- }
-
- //! maxpyin.
- //! C -= A*B
- template <class Operand1, class Operand2, class Operand3>
- Operand1& maxpyin(Operand1& C, const Operand2& A, const Operand3& B) const
- {
- return muladdin(_One,C,_MOne,A,B);
- }
-
- //! axmy.
- //! D= A*B - C
- template <class Operand1, class Operand2, class Operand3>
- Operand1& axmy(Operand1& D, const Operand2& A, const Operand3& B, const Operand1& C) const
- {
- return muladd(D,_MOne,C,_One,A,B);
- }
-
- //! axmyin.
- //! C = A*B - C
- template <class Operand1, class Operand2, class Operand3>
- Operand1& axmyin(Operand1& C, const Operand2& A, const Operand3& B) const
- {
- return muladdin(_MOne,C,_One,A,B);
- }
-
- //! general matrix-matrix multiplication and addition with scaling.
- //! D= beta.C + alpha.A*B
- template <class Operand1, class Operand2, class Operand3>
- Operand1& muladd(Operand1& D, const Element& beta, const Operand1& C,
- const Element& alpha, const Operand2& A, const Operand3& B) const
- {
- return BlasMatrixDomainMulAdd<Field,Operand1,Operand2,Operand3>()(_field,D,beta,C,alpha,A,B);
- }
-
- //! muladdin.
- //! C= beta.C + alpha.A*B.
- template <class Operand1, class Operand2, class Operand3>
- Operand1& muladdin(const Element& beta, Operand1& C,
- const Element& alpha, const Operand2& A, const Operand3& B) const
- {
- return BlasMatrixDomainMulAdd<Field,Operand1,Operand2,Operand3>()(_field,beta,C,alpha,A,B);
- }
-
-
- /*!
- * @name Solutions available for matrix respecting BlasMatrix interface
- */
- //@{
-
- //! Inversion
- template <class Matrix>
- Matrix& inv( Matrix &Ainv, const Matrix &A) const
- {
- BlasMatrixDomainInv<Field,Matrix>()(_field,Ainv,A);
- return Ainv;
- }
-
- //! Inversion (in place)
- template <class Matrix>
- Matrix& invin( Matrix &Ainv, Matrix &A) const
- {
- BlasMatrixDomainInv<Field,Matrix>()(_field,Ainv,A);
- return Ainv;
- }
-
- //! Inversion (the matrix A is modified)
- template <class Matrix>
- Matrix& invin(Matrix &A) const
- {
- Matrix tmp(A.rowdim(), A.coldim());
- tmp = A;
- BlasMatrixDomainInv<Field,Matrix>()(_field,A,tmp);
- return A;
- }
-
-
- /*! Division.
- * C = A B^{-1} ==> C . B = A
- */
- template <class Matrix>
- Matrix& div( Matrix &C, const Matrix &A, const Matrix &B) const
- {
- return this->right_solve(C,B,A);
- }
-
-
- //! Inversion w singular check
- template <class Matrix>
- Matrix& inv( Matrix &Ainv, const Matrix &A, int& nullity) const
- {
- nullity = BlasMatrixDomainInv<Field,Matrix>()(_field,Ainv,A);
- return Ainv;
- }
-
- //! Inversion (the matrix A is modified) w singular check
- template <class Matrix>
- Matrix& invin( Matrix &Ainv, Matrix &A, int& nullity) const
- {
- nullity = BlasMatrixDomainInv<Field,Matrix>()(_field,Ainv,A);
- return Ainv;
- }
-
- //! Rank
- template <class Matrix>
- unsigned int rank(const Matrix &A) const
- {
- return BlasMatrixDomainRank<Field,Matrix>()(_field,A);
- }
-
- //! in-place Rank (the matrix is modified)
- template <class Matrix>
- unsigned int rankin(Matrix &A) const
- {
- return BlasMatrixDomainRank<Field, Matrix>()(_field,A);
- }
-
- //! determinant
- template <class Matrix>
- Element det(const Matrix &A) const
- {
- return BlasMatrixDomainDet<Field, Matrix>()(_field,A);
- }
-
- //! in-place Determinant (the matrix is modified)
- template <class Matrix>
- Element detin(Matrix &A) const
- {
- return BlasMatrixDomainDet<Field, Matrix>()(_field,A);
- }
- //@}
-
- /*!
- * @name Solvers for Matrix (respecting BlasMatrix interface)
- * with Operand as right or left hand side
- */
- //@{
- //! linear solve with matrix right hand side.
- //! AX=B
- template <class Operand, class Matrix>
- Operand& left_solve (Operand& X, const Matrix& A, const Operand& B) const
- {
- return BlasMatrixDomainLeftSolve<Field,Operand,Matrix>()(_field,X,A,B);
- }
-
- //! linear solve with matrix right hand side, the result is stored in-place in B.
- //! @pre A must be square
- //! AX=B , (B<-X)
- template <class Operand,class Matrix>
- Operand& left_solve (const Matrix& A, Operand& B) const
- {
- return BlasMatrixDomainLeftSolve<Field,Operand,Matrix>()(_field,A,B);
- }
-
- //! linear solve with matrix right hand side.
- //! XA=B
- template <class Operand, class Matrix>
- Operand& right_solve (Operand& X, const Matrix& A, const Operand& B) const
- {
- return BlasMatrixDomainRightSolve<Field,Operand,Matrix>()(_field,X,A,B);
- }
-
- //! linear solve with matrix right hand side, the result is stored in-place in B.
- //! @pre A must be square
- //! XA=B , (B<-X)
- template <class Operand, class Matrix>
- Operand& right_solve (const Matrix& A, Operand& B) const
- {
- return BlasMatrixDomainRightSolve<Field,Operand,Matrix>()(_field,A,B);
- }
-
- //! minimal polynomial computation.
- template <class Polynomial, class Matrix>
- Polynomial& minpoly( Polynomial& P, const Matrix& A ) const
- {
- return BlasMatrixDomainMinpoly<Field, Polynomial, Matrix>()(_field,P,A);
- }
-
- //! characteristic polynomial computation.
- template <class Polynomial, class Matrix >
- Polynomial& charpoly( Polynomial& P, const Matrix& A ) const
- {
-
- commentator().start ("Modular Dense Charpoly ", "MDCharpoly");
- std::list<Polynomial> P_list;
- P_list.clear();
- BlasMatrixDomainCharpoly<Field, std::list<Polynomial>, Matrix >()(_field,P_list,A);
-
-
- Polynomial tmp(A.rowdim()+1);
- typename std::list<Polynomial>::iterator it = P_list.begin();
- P = *(it++);
- while( it!=P_list.end() ){
- // Waiting for an implementation of a domain of polynomials
- mulpoly( tmp, P, *it);
- P = tmp;
- // delete &(*it);
- ++it;
- }
- commentator().stop ("done", NULL, "MDCharpoly");
-
- return P;
- }
-
- //! characteristic polynomial computation.
- template <class Polynomial, class Matrix >
- std::list<Polynomial>& charpoly( std::list<Polynomial>& P, const Matrix& A ) const
- {
- return BlasMatrixDomainCharpoly<Field, std::list<Polynomial>, Matrix >()(_field,P,A);
- }
-
-
- //private:
- //! @todo Temporary: waiting for an implementation of a domain of polynomial
- template<class Polynomial>
- Polynomial &
- mulpoly(Polynomial &res, const Polynomial & P1, const Polynomial & P2)const
- {
- size_t i,j;
- res.resize(P1.size()+P2.size()-1);
- for (i=0;i<res.size();i++)
- _field.assign(res[i],_Zero);
- for ( i=0;i<P1.size();i++)
- for ( j=0;j<P2.size();j++)
- _field.axpyin(res[i+j],P1[i],P2[j]);
- return res;
-
- }
- //@}
-
- template<class Matrix1, class Matrix2>
- bool areEqual(const Matrix1 & A, const Matrix2 & B)
- {
- if ( (A.rowdim() != B.rowdim()) || (A.coldim() != B.coldim()) )
- return false ;
- for (size_t i = 0 ; i < A.rowdim() ; ++i)
- for (size_t j = 0 ; j < A.coldim() ; ++j)
- if (!_field.areEqual(A.getEntry(i,j),B.getEntry(i,j))) //!@bug use refs
- return false ;
- return true ;
- }
-
- template<class Matrix>
- void setIdentity(Matrix & I)
- {
- for (size_t i = 0 ; i< I.rowdim() ; ++i)
- for (size_t j = 0 ; j < I.coldim() ; ++j) {
- if (i == j)
- I.setEntry(i,j,_One);
- else
- I.setEntry(i,j,_Zero);
- }
-
- }
-
- template<class Matrix>
- void setZero(Matrix & I)
- {
- // use Iterator
- for (size_t i = 0 ; i< I.rowdim() ; ++i)
- for (size_t j = 0 ; j < I.coldim() ; ++j) {
- I.setEntry(i,j,_Zero);
- }
- }
-
-
- template<class Matrix1>
- bool isZero(const Matrix1 & A)
- {
- for (size_t i = 0 ; i < A.rowdim() ; ++i)
- for (size_t j = 0 ; j < A.coldim() ; ++j)
- if (!_field.isZero(A.getEntry(i,j))) //!@bug use refs
- return false ;
- return true ;
- }
-
- template<class Matrix1>
- bool isIdentity(const Matrix1 & A)
- {
- if (A.rowdim() != A.coldim())
- return false ;
- for (size_t i = 0 ; i < A.rowdim() ; ++i)
- if (!_field.isOne(A.getEntry(i,i)))
- return false;
-
- for (size_t i = 0 ; i < A.rowdim() ; ++i)
- for (size_t j = 0 ; j < i ; ++j)
- if (!_field.isZero(A.getEntry(i,j))) //!@bug use refs
- return false ;
- for (size_t i = 0 ; i < A.rowdim() ; ++i)
- for (size_t j = i+1 ; j < A.coldim() ; ++j)
- if (!_field.isZero(A.getEntry(i,j))) //!@bug use refs
- return false ;
- return true ;
- }
-
- template<class Matrix1>
- bool isIdentityGeneralized(const Matrix1 & A)
- {
- size_t mn = std::min(A.rowdim(),A.coldim());
- for (size_t i = 0 ; i < mn ; ++i)
- if (!_field.isOne(A.getEntry(i,i)))
- return false;
-
- for (size_t i = 0 ; i < A.rowdim() ; ++i)
- for (size_t j = 0 ; j < std::min(i,mn) ; ++j)
- if (!_field.isZero(A.getEntry(i,j))) //!@bug use refs
- return false ;
- for (size_t i = 0 ; i < A.rowdim() ; ++i)
- for (size_t j = i+1 ; j < A.coldim() ; ++j)
- if (!_field.isZero(A.getEntry(i,j))) //!@bug use refs
- return false ;
- return true ;
- }
-
- public:
-
- /** Print matrix.
- * @param os Output stream to which matrix is written.
- * @param A Matrix.
- * @returns reference to os.
- */
- template <class Matrix>
- inline std::ostream &write (std::ostream &os, const Matrix &A) const
- {
- return A.write (os);
- }
-
- template <class Matrix>
- inline std::ostream &write (std::ostream &os, const Matrix &A, bool maple_format) const
- {
- return A.write (os, _field, maple_format);
- }
-
- /** Read matrix
- * @param is Input stream from which matrix is read.
- * @param A Matrix.
- * @returns reference to is.
- */
- template <class Matrix>
- inline std::istream &read (std::istream &is, Matrix &A) const
- {
- return A.read (is, _field);
- }
-
- }; /* end of class BlasMatrixDomain */
-
-
-} /* end of namespace LinBox */
-
-#include "linbox/algorithms/blas-domain.inl"
-
-#endif /* __LINBOX_blas_matrix_domain_H */
-
-
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
-// Local Variables:
-// mode: C++
-// tab-width: 8
-// indent-tabs-mode: nil
-// c-basic-offset: 8
-// End:
-
diff --git a/linbox/algorithms/blas-domain.inl b/linbox/algorithms/blas-domain.inl
deleted file mode 100644
index 54b6d5c..0000000
--- a/linbox/algorithms/blas-domain.inl
+++ /dev/null
@@ -1,1507 +0,0 @@
-/* linbox/algorithms/blas-domain.inl
- * Copyright (C) 2004 Pascal Giorgi, Clément Pernet
- *
- * Written by :
- * Pascal Giorgi pascal.giorgi at ens-lyon.fr
- * Clément Pernet clement.pernet at imag.fr
- *
- * ========LICENCE========
- * This file is part of the library LinBox.
- *
- * LinBox is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- * ========LICENCE========
- */
-
-
-
-#ifndef __LINBOX_blas_matrix_domain_INL
-#define __LINBOX_blas_matrix_domain_INL
-
-#include "linbox/matrix/blas-matrix.h"
-#include "linbox/matrix/factorized-matrix.h"
-
-namespace LinBox
-{
-
- /*
- * **********************************************
- * *** Specialization for BlasMatrix<Field> ***
- * **********************************************
- */
-
-
-#if 0
- // Inversion
- // dpritcha: now returns nullity. (2004-07-19)
- // previously returned Ainv but this is passed back anyway.
- template <class Field>
- class BlasMatrixDomainInv<Field,BlasMatrix<Field> > {
- public:
- int operator() (const Field &F,
- BlasMatrix<Field> &Ainv,
- const BlasMatrix<Field> &A) const
- {
-
- linbox_check( A.rowdim() == A.coldim());
- linbox_check( A.rowdim() == Ainv.rowdim());
- linbox_check( A.coldim() == Ainv.coldim());
- BlasMatrix<Field> tmp(A);
- return (*this)(F,Ainv,tmp);
- }
-
- int operator() (const Field &F,
- BlasMatrix<Field> &Ainv,
- BlasMatrix<Field> &A) const
- {
-
- linbox_check( A.rowdim() == A.coldim());
- linbox_check( A.rowdim() == Ainv.rowdim());
- linbox_check( A.coldim() == Ainv.coldim());
- int nullity;
- FFPACK::Invert((typename Field::Father_t)F,A.rowdim(),A.getPointer(),A.getStride(),
- Ainv.getPointer(),Ainv.getStride(),nullity);
- return nullity;
- }
-
- };
-#endif
-
-
-#if 0
- // Rank
- template <class Field>
- class BlasMatrixDomainRank<Field,BlasMatrix<Field> > {
- public:
- inline unsigned int operator() (const Field &F,
- const BlasMatrix<Field> &A) const
- {
-
- BlasMatrix<Field> tmp(A);
- return (*this)(F,tmp);
- }
-
- inline unsigned int operator() (const Field &F,
- BlasMatrix<Field> &A) const
- {
-
- return FFPACK::Rank((typename Field::Father_t)F, A.rowdim(), A.coldim(),A.getPointer(), A.getStride());
- }
- };
-
- // determinant
- template <class Field>
- class BlasMatrixDomainDet<Field,BlasMatrix<Field> > {
- public:
- inline typename Field::Element operator()(const Field &F,
- const BlasMatrix<Field> &A) const
- {
-
- BlasMatrix<Field> tmp(A);
- return (*this)(F,tmp);
- }
-
- inline typename Field::Element operator() (const Field &F,
- BlasMatrix<Field> &A) const
- {
-
- return FFPACK::Det((typename Field::Father_t)F, A.rowdim(), A.coldim(),A.getPointer(), A.getStride());
- }
- };
-#endif
-
-
- /*
- * **********************************************
- * *** Specialization for BlasMatrix<Field> ***
- * **********************************************
- */
-
-
- // Inversion
- // dpritcha: now returns nullity. (2004-07-19)
- // previously returned Ainv but this is passed back anyway.
- template <class Field>
- class BlasMatrixDomainInv<Field,BlasMatrix<Field> > {
- public:
- int operator() (const Field &F,
- BlasMatrix<Field> &Ainv,
- const BlasMatrix<Field> &A) const
- {
-
- linbox_check( A.rowdim() == A.coldim());
- linbox_check( A.rowdim() == Ainv.rowdim());
- linbox_check( A.coldim() == Ainv.coldim());
- BlasMatrix<Field> tmp(A);
- return (*this)(F,Ainv,tmp);
- }
-
- int operator() (const Field &F,
- BlasMatrix<Field> &Ainv,
- BlasMatrix<Field> &A) const
- {
-
- linbox_check( A.rowdim() == A.coldim());
- linbox_check( A.rowdim() == Ainv.rowdim());
- linbox_check( A.coldim() == Ainv.coldim());
- int nullity;
- FFPACK::Invert ((typename Field::Father_t)F, A.rowdim(), A.getPointer(), A.getStride(),
- Ainv.getPointer(),Ainv.getStride(),nullity);
- return nullity;
- }
-
- };
-
- // Rank
- template <class Field>
- class BlasMatrixDomainRank<Field,BlasMatrix<Field> > {
- public:
- inline unsigned int operator() (const Field &F,
- const BlasMatrix<Field> &A) const
- {
-
- BlasMatrix<Field> tmp(A);
- return (*this)(F,tmp);
- }
-
- inline unsigned int
- operator() (const Field &F,
- BlasMatrix<Field> &A) const
- {
-
- return (unsigned int) FFPACK::Rank((typename Field::Father_t)F,
- A.rowdim(), A.coldim(),A.getPointer(), A.getStride());
- }
- };
-
- // determinant
- template <class Field>
- class BlasMatrixDomainDet<Field,BlasMatrix<Field> > {
- public:
- inline typename Field::Element operator()(const Field &F,
- const BlasMatrix<Field> &A) const
- {
-
- BlasMatrix<Field> tmp(A);
- return (*this)(F,tmp);
- }
-
- inline typename Field::Element operator() (const Field &F,
- BlasMatrix<Field> &A) const
- {
-
- return FFPACK::Det((typename Field::Father_t)F, A.rowdim(), A.coldim(),A.getPointer(), A.getStride());
- }
- };
-
-
- /*
- * specialization for Operand1, Operand2 and Operand3 of type BlasMatrix<Field>
- */
-
- template<class Field>
- class BlasMatrixDomainAdd<Field,BlasMatrix<Field>,BlasMatrix<Field>, BlasMatrix<Field> > {
- public:
- BlasMatrix<Field>& operator()(const Field& F,
- BlasMatrix<Field>& C,
- const BlasMatrix<Field>& A,
- const BlasMatrix<Field>& B) const
- {
- linbox_check( A.rowdim() == B.rowdim());
- linbox_check( C.rowdim() == A.rowdim());
- linbox_check( A.coldim() == B.coldim());
- linbox_check( C.coldim() == A.coldim());
- FFLAS::fadd ((typename Field::Father_t)F, C.rowdim(), C.coldim(),
- A.getPointer(), A.getStride(),
- B.getPointer(), B.getStride(),
- C.getPointer(), C.getStride());
- return C;
- }
- };
-
- template<class Field>
- class BlasMatrixDomainCopy<Field,BlasMatrix<Field>, BlasMatrix<Field> > {
- public:
- BlasMatrix<Field>& operator()(const Field& F,
- BlasMatrix<Field>& B,
- const BlasMatrix<Field>& A) const
- {
- linbox_check( A.rowdim() == B.rowdim());
- linbox_check( A.coldim() == B.coldim());
- for (size_t i=0; i<A.rowdim(); i++)
- FFLAS::fcopy ((typename Field::Father_t)F, A.coldim(),
- B.getPointer() + i*B.getStride(), 1,
- A.getPointer() + i*A.getStride(), 1);
- return B;
- }
- };
-
- template<class Field>
- class BlasMatrixDomainSub<Field,BlasMatrix<Field>,BlasMatrix<Field>, BlasMatrix<Field> > {
- public:
- BlasMatrix<Field>& operator()(const Field& F,
- BlasMatrix<Field>& C,
- const BlasMatrix<Field>& A,
- const BlasMatrix<Field>& B) const
- {
- linbox_check( A.rowdim() == B.rowdim());
- linbox_check( C.rowdim() == A.rowdim());
- linbox_check( A.coldim() == B.coldim());
- linbox_check( C.coldim() == A.coldim());
- FFLAS::fsub ((typename Field::Father_t)F, C.rowdim(), C.coldim(),
- A.getPointer(), A.getStride(),
- B.getPointer(), B.getStride(),
- C.getPointer(), C.getStride());
- return C;
- }
- };
-
- template<class Field>
- class BlasMatrixDomainSubin<Field,BlasMatrix<Field>,BlasMatrix<Field> > {
- public:
- BlasMatrix<Field>& operator()(const Field& F,
- BlasMatrix<Field>& C,
- const BlasMatrix<Field>& B) const
- {
- linbox_check( C.rowdim() == B.rowdim());
- linbox_check( C.coldim() == B.coldim());
- FFLAS::fsubin ((typename Field::Father_t)F, C.rowdim(), C.coldim(),
- B.getPointer(), B.getStride(),
- C.getPointer(), C.getStride());
- return C;
- }
- };
-
- template<class Field>
- class BlasMatrixDomainAddin<Field,BlasMatrix<Field>,BlasMatrix<Field> > {
- public:
- BlasMatrix<Field>& operator()(const Field& F,
- BlasMatrix<Field>& C,
- const BlasMatrix<Field>& B) const
- {
- linbox_check( C.rowdim() == B.rowdim());
- linbox_check( C.coldim() == B.coldim());
- FFLAS::faddin ((typename Field::Father_t)F, C.rowdim(), C.coldim(),
- B.getPointer(), B.getStride(),
- C.getPointer(), C.getStride());
- return C;
- }
- };
-
- // general matrix-matrix multiplication and addition with scaling
- // D= beta.C + alpha.A*B
- template<class Field>
- class BlasMatrixDomainMulAdd<Field,BlasMatrix<Field>,BlasMatrix<Field>, BlasMatrix<Field> > {
- public:
- BlasMatrix<Field>&
- operator()(const Field & F,
- BlasMatrix<Field> & D,
- const typename Field::Element & beta,
- const BlasMatrix<Field>& C,
- const typename Field::Element & alpha,
- const BlasMatrix<Field>& A,
- const BlasMatrix<Field>& B) const
- {
- linbox_check( A.coldim() == B.rowdim());
- linbox_check( C.rowdim() == A.rowdim());
- linbox_check( C.coldim() == B.coldim());
- linbox_check( D.rowdim() == C.rowdim());
- linbox_check( D.coldim() == C.coldim());
-
- D=C;
- // linbox_check(D.getPointer() != C.getPointer());
-
- // std::cout << "alpha :" << alpha << std::endl;
- // std::cout << "beta :" << beta << std::endl;
- // D.write(std::cout << "Dfgem :=" ) <<','<< std::endl;
- // A.write(std::cout << "Afgem :=" ) <<','<< std::endl;
- // B.write(std::cout << "Bfgem :=" ) <<','<< std::endl;
- FFLAS::fgemm((typename Field::Father_t) F, FFLAS::FflasNoTrans, FFLAS::FflasNoTrans,
- C.rowdim(), C.coldim(), A.coldim(),
- alpha,
- A.getPointer(), A.getStride(),
- B.getPointer(), B.getStride(),
- beta,
- D.getPointer(), D.getStride());
- // D.write(std::cout << "Dfgem :=" ) <<','<< std::endl;
- // std::cout << A.getStride() << "," << A.coldim() << std::endl;
- // std::cout << B.getStride() << "," << B.coldim() << std::endl;
- // std::cout << D.getStride() << "," << D.coldim() << std::endl;
- return D;
- }
-
-
- BlasMatrix<Field>&
- operator() (const Field & F,
- const typename Field::Element & beta,
- BlasMatrix<Field> & C,
- const typename Field::Element & alpha,
- const BlasMatrix<Field>& A,
- const BlasMatrix<Field>& B) const
- {
- linbox_check( A.coldim() == B.rowdim());
- linbox_check( C.rowdim() == A.rowdim());
- linbox_check( C.coldim() == B.coldim());
-
- FFLAS::fgemm((typename Field::Father_t) F, FFLAS::FflasNoTrans, FFLAS::FflasNoTrans,
- C.rowdim(), C.coldim(), A.coldim(),
- alpha,
- A.getPointer(), A.getStride(),
- B.getPointer(), B.getStride(),
- beta,
- C.getPointer(), C.getStride());
- return C;
- }
- };
-
-
- template<class Field>
- class BlasMatrixDomainMulAdd<Field,
- BlasMatrix<Field>,
- TransposedBlasMatrix<BlasMatrix<Field> >,
- BlasMatrix<Field> > {
- public:
- BlasMatrix<Field>&
- operator()(const Field & F,
- BlasMatrix<Field> & D,
- const typename Field::Element & beta,
- const BlasMatrix<Field>& C,
- const typename Field::Element & alpha,
- const TransposedBlasMatrix<BlasMatrix<Field> >& A,
- const BlasMatrix<Field>& B) const
- {
- linbox_check( A.getMatrix().rowdim() == B.rowdim());
- linbox_check( C.rowdim() == A.getMatrix().coldim());
- linbox_check( C.coldim() == B.coldim());
- linbox_check( D.rowdim() == C.rowdim());
- linbox_check( D.coldim() == C.coldim());
-
- D=C;
-
- FFLAS::fgemm((typename Field::Father_t) F, FFLAS::FflasTrans, FFLAS::FflasNoTrans,
- C.rowdim(), C.coldim(), B.rowdim(),
- alpha,
- A.getMatrix().getPointer(), A.getMatrix().getStride(),
- B.getPointer(), B.getStride(),
- beta,
- D.getPointer(), D.getStride());
-
- return D;
- }
-
-
- BlasMatrix<Field>&
- operator() (const Field & F,
- const typename Field::Element & beta,
- BlasMatrix<Field> & C,
- const typename Field::Element & alpha,
- const TransposedBlasMatrix<BlasMatrix<Field> >& A,
- const BlasMatrix<Field>& B) const
- {
- linbox_check( A.getMatrix().rowdim() == B.rowdim());
- linbox_check( C.rowdim() == A.getMatrix().coldim());
- linbox_check( C.coldim() == B.coldim());
-
- FFLAS::fgemm((typename Field::Father_t) F, FFLAS::FflasTrans, FFLAS::FflasNoTrans,
- C.rowdim(), C.coldim(), B.rowdim(),
- alpha,
- A.getMatrix().getPointer(), A.getMatrix().getStride(),
- B.getPointer(), B.getStride(),
- beta,
- C.getPointer(), C.getStride());
- return C;
- }
- };
-
- template<class Field>
- class BlasMatrixDomainMulAdd<Field,
- BlasMatrix<Field>,
- TransposedBlasMatrix<BlasMatrix<Field> >,
- TransposedBlasMatrix<BlasMatrix<Field> > > {
- public:
- BlasMatrix<Field>&
- operator()(const Field & F,
- BlasMatrix<Field> & D,
- const typename Field::Element & beta,
- const BlasMatrix<Field>& C,
- const typename Field::Element & alpha,
- const TransposedBlasMatrix<BlasMatrix<Field> >& A,
- const TransposedBlasMatrix<BlasMatrix<Field> >& B) const
- {
- linbox_check( A.getMatrix().rowdim() == B.getMatrix().coldim());
- linbox_check( C.rowdim() == A.getMatrix().coldim());
- linbox_check( C.coldim() == B.getMatrix().rowdim());
- linbox_check( D.rowdim() == C.rowdim());
- linbox_check( D.coldim() == C.coldim());
-
- D=C;
- // linbox_check(D.getPointer() != C.getPointer());
-
- FFLAS::fgemm((typename Field::Father_t) F, FFLAS::FflasTrans, FFLAS::FflasTrans,
- C.rowdim(), C.coldim(), A.getMatrix().rowdim(),
- alpha,
- A.getMatrix().getPointer(), A.getMatrix().getStride(),
- B.getMatrix().getPointer(), B.getMatrix().getStride(),
- beta,
- D.getPointer(), D.getStride());
- return D;
- }
-
-
- BlasMatrix<Field>&
- operator() (const Field & F,
- const typename Field::Element & beta,
- BlasMatrix<Field> & C,
- const typename Field::Element & alpha,
- const TransposedBlasMatrix<BlasMatrix<Field> >& A,
- const TransposedBlasMatrix<BlasMatrix<Field> >& B) const
- {
- linbox_check( A.getMatrix().rowdim() == B.getMatrix().coldim());
- linbox_check( C.rowdim() == A.getMatrix().coldim());
- linbox_check( C.coldim() == B.getMatrix().rowdim());
-
- FFLAS::fgemm((typename Field::Father_t) F, FFLAS::FflasTrans, FFLAS::FflasTrans,
- C.rowdim(), C.coldim(), A.getMatrix().rowdim(),
- alpha,
- A.getMatrix().getPointer(), A.getMatrix().getStride(),
- B.getMatrix().getPointer(), B.getMatrix().getStride(),
- beta,
- C.getPointer(), C.getStride());
- return C;
- }
- };
-
- template<class Field>
- class BlasMatrixDomainMulAdd<Field,
- BlasMatrix<Field>,
- BlasMatrix<Field>,
- TransposedBlasMatrix<BlasMatrix<Field> > > {
- public:
- BlasMatrix<Field>&
- operator()(const Field & F,
- BlasMatrix<Field> & D,
- const typename Field::Element & beta,
- const BlasMatrix<Field>& C,
- const typename Field::Element & alpha,
- const BlasMatrix<Field>& A,
- const TransposedBlasMatrix<BlasMatrix<Field> >& B) const
- {
- linbox_check( A.coldim() == B.getMatrix().coldim());
- linbox_check( C.rowdim() == A.rowdim());
- linbox_check( C.coldim() == B.getMatrix().rowdim());
- linbox_check( D.rowdim() == C.rowdim());
- linbox_check( D.coldim() == C.coldim());
-
- D=C;
- FFLAS::fgemm((typename Field::Father_t) F, FFLAS::FflasNoTrans, FFLAS::FflasTrans,
- C.rowdim(), C.coldim(), A.coldim(),
- alpha,
- A.getPointer(), A.getStride(),
- B.getMatrix().getPointer(), B.getMatrix().getStride(),
- beta,
- D.getPointer(), D.getStride());
- return D;
- }
-
-
- BlasMatrix<Field>&
- operator() (const Field & F,
- const typename Field::Element & beta,
- BlasMatrix<Field> & C,
- const typename Field::Element & alpha,
- const BlasMatrix<Field>& A,
- const TransposedBlasMatrix<BlasMatrix<Field> >& B) const
- {
- linbox_check( A.coldim() == B.getMatrix().coldim());
- linbox_check( C.rowdim() == A.rowdim());
- linbox_check( C.coldim() == B.getMatrix().rowdim());
-
- FFLAS::fgemm((typename Field::Father_t) F, FFLAS::FflasNoTrans, FFLAS::FflasTrans,
- C.rowdim(), C.coldim(), A.coldim(),
- alpha,
- A.getPointer(), A.getStride(),
- B.getMatrix().getPointer(), B.getMatrix().getStride(),
- beta,
- C.getPointer(), C.getStride());
- return C;
- }
- };
-
- /*
- * specialization for Operand1 and Operand3 of type std::vector<Element>
- * and Operand2 of type BlasMatrix<Field>
- */
-
- // general matrix-vector multiplication and addition with scaling
- // d = beta.c + alpha.A*b
- template<class Field>
- class BlasMatrixDomainMulAdd<Field,std::vector<typename Field::Element>,BlasMatrix<Field>,std::vector<typename Field::Element> > {
- public:
- std::vector<typename Field::Element>& operator() (const Field& F,
- std::vector<typename Field::Element>& d,
- const typename Field::Element& beta,
- const std::vector<typename Field::Element>& c,
- const typename Field::Element& alpha,
- const BlasMatrix<Field>& A,
- const std::vector<typename Field::Element>& b) const
- {
- linbox_check( A.coldim() == b.size());
- linbox_check( c.size() == b.size());
- linbox_check( d.size() == c.size());
- d=c;
-
- FFLAS::fgemv((typename Field::Father_t) F, FFLAS::FflasNoTrans,
- A.rowdim(), A.coldim(),
- alpha,
- A.getPointer(), A.getStride(),
- &b[0],1,
- beta,
- &d[0],1);
- return d;
- }
-
-
- std::vector<typename Field::Element>& operator() (const Field& F,
- const typename Field::Element& beta,
- std::vector<typename Field::Element>& c,
- const typename Field::Element& alpha,
- const BlasMatrix<Field>& A,
- const std::vector<typename Field::Element>& b) const
- {
- linbox_check( A.coldim() == b.size());
- linbox_check( A.rowdim() == c.size()); //fixed: dpritcha
-
- FFLAS::fgemv((typename Field::Father_t) F, FFLAS::FflasNoTrans,
- A.rowdim(), A.coldim(),
- alpha,
- A.getPointer(), A.getStride(),
- &b[0],1,
- beta,
- &c[0],1);
- return c;
- }
- };
-
- // general vector-matrix multiplication and addition with scaling
- // d = beta.c + alpha.a*B -- note order of coldim, rowdim passed to fgemv is switched
- template<class Field>
- class BlasMatrixDomainMulAdd<Field,std::vector<typename Field::Element>,std::vector<typename Field::Element>,BlasMatrix<Field> > {
- public:
- std::vector<typename Field::Element>& operator() (const Field& F,
- std::vector<typename Field::Element>& d,
- const typename Field::Element& beta,
- const std::vector<typename Field::Element>& c,
- const typename Field::Element& alpha,
- const std::vector<typename Field::Element>& a,
- const BlasMatrix<Field>& B) const
- {
- linbox_check( B.rowdim() == a.size());
- linbox_check( B.coldim() == c.size());
- linbox_check( d.size() == c.size());
- d=c;
-
- FFLAS::fgemv((typename Field::Father_t) F, FFLAS::FflasTrans,
- B.rowdim(), B.coldim(),
- alpha,
- B.getPointer(), B.getStride(),
- &a[0],1,
- beta,
- &d[0],1);
- return d;
- }
-
-
- std::vector<typename Field::Element>& operator() (const Field& F,
- const typename Field::Element& beta,
- std::vector<typename Field::Element>& c,
- const typename Field::Element& alpha,
- const std::vector<typename Field::Element>& a,
- const BlasMatrix<Field>& B) const
- {
- linbox_check( B.rowdim() == a.size());
- linbox_check( B.coldim() == c.size());
-
- FFLAS::fgemv((typename Field::Father_t) F, FFLAS::FflasTrans,
- B.rowdim(), B.coldim(),
- alpha,
- B.getPointer(), B.getStride(),
- &a[0],1,
- beta,
-
- &c[0],1);
- return c;
- }
- };
-
-
- /*
- * Specialization for Operand1, Operand2 of type BlasMatrix<Field>
- * and Operand3 of type BlasPermutation
- */
-
- // Matrix permutation product C = A*B
- template<class Field>
- class BlasMatrixDomainMul<Field,BlasMatrix<Field>,BlasMatrix<Field>, BlasPermutation<size_t> > {
- public:
- BlasMatrix<Field>& operator()(const Field& F,
- BlasMatrix<Field>& C,
- const BlasMatrix<Field>& A,
- const BlasPermutation<size_t>& B) const
- {
- C = A;
- return BlasMatrixDomainMulin<Field,BlasMatrix<Field>,BlasPermutation<size_t> >()( F, C, B);
- }
- };
-
- template<class Field>
- class BlasMatrixDomainMul<Field,BlasMatrix<Field>, BlasPermutation<size_t>,BlasMatrix<Field> > {
- public:
- BlasMatrix<Field>& operator()(const Field& F,
- BlasMatrix<Field>& C,
- const BlasPermutation<size_t>& B,
- const BlasMatrix<Field>& A) const
- {
- C = A;
- return BlasMatrixDomainMulin<Field,BlasMatrix<Field>,BlasPermutation<size_t> >()( F, B, C);
- }
- };
-
- /*
- * specialization for Operand1, Operand2 of type BlasMatrix<Field> and Operand3 of type TransposedBlasMatrix<BlasPermutation<size_t> >
- */
-
- // Matrix permutation product C = A*B
- template<class Field>
- class BlasMatrixDomainMul<Field,BlasMatrix<Field>,BlasMatrix<Field>, TransposedBlasMatrix<BlasPermutation<size_t> > > {
- public:
- BlasMatrix<Field>& operator()(const Field& F,
- BlasMatrix<Field>& C,
- const BlasMatrix<Field>& A,
- const TransposedBlasMatrix<BlasPermutation<size_t> >& B) const
- {
- C = A;
- return BlasMatrixDomainMulin<Field,BlasMatrix<Field>,TransposedBlasMatrix<BlasPermutation<size_t> > >()( F, C, B);
- }
- };
-
- template<class Field>
- class BlasMatrixDomainMul<Field,BlasMatrix<Field>, TransposedBlasMatrix<BlasPermutation<size_t> >,BlasMatrix<Field> > {
- public:
- BlasMatrix<Field>& operator()(const Field& F,
- BlasMatrix<Field>& C,
- const TransposedBlasMatrix<BlasPermutation<size_t> >& B,
- const BlasMatrix<Field>& A) const
- {
- C = A;
- return BlasMatrixDomainMulin<Field,BlasMatrix<Field>,TransposedBlasMatrix<BlasPermutation<size_t> > >()( F, B, C);
- }
- };
-
- /*
- * specialization for Operand1 of type BlasMatrix<Field> and Operand2 of type BlasPermutation
- */
-
- // In-place matrix permutation product
- template<class Field>
- class BlasMatrixDomainMulin<Field,BlasMatrix<Field>, BlasPermutation<size_t> > {
- public:
- BlasMatrix<Field>& operator()( const Field& F,
- BlasMatrix<Field>& A,
- const BlasPermutation<size_t>& B) const
- {
- if (B.isIdentity()) return A ;
- linbox_check( A.coldim() >= B.getSize() );
- FFPACK::applyP((typename Field::Father_t) F, FFLAS::FflasRight, FFLAS::FflasNoTrans,
- A.rowdim(), 0,(int) B.getOrder(),
- A.getPointer(), A.getStride(), B.getPointer() );
- return A;
- }
-
- BlasMatrix<Field>& operator()( const Field& F,
- const BlasPermutation<size_t>& B,
- BlasMatrix<Field>& A) const
- {
- if (B.isIdentity()) return A ;
- linbox_check( A.rowdim() >= B.getSize() );
- FFPACK::applyP((typename Field::Father_t) F, FFLAS::FflasLeft, FFLAS::FflasNoTrans,
- A.coldim(), 0,(int) B.getOrder(), A.getPointer(), A.getStride(), B.getPointer() );
- return A;
- }
-
- };
-
- template<class Field>
- class BlasMatrixDomainMulin<Field,BlasMatrix<Field>, TransposedBlasMatrix<BlasPermutation<size_t> > > {
- public:
- BlasMatrix<Field>& operator()( const Field& F,
- BlasMatrix<Field>& A,
- const TransposedBlasMatrix<BlasPermutation<size_t> >& B) const
- {
- if (B.getMatrix().isIdentity()) return A ;
- linbox_check( A.coldim() >= B.getMatrix().getSize() );
- FFPACK::applyP((typename Field::Father_t) F, FFLAS::FflasRight, FFLAS::FflasTrans,
- A.rowdim(), 0,(int) B.getMatrix().getOrder(),
- A.getPointer(), A.getStride(), B.getMatrix().getPointer() );
- return A;
- }
- BlasMatrix<Field>& operator()( const Field& F,
- const TransposedBlasMatrix<BlasPermutation<size_t> >& B,
- BlasMatrix<Field>& A) const
- {
- if (B.getMatrix().isIdentity()) return A ;
- linbox_check( A.rowdim() >= B.getMatrix().getSize() );
- FFPACK::applyP((typename Field::Father_t) F, FFLAS::FflasLeft, FFLAS::FflasTrans,
- A.coldim(), 0,(int) B.getMatrix().getOrder(), A.getPointer(), A.getStride(), B.getMatrix().getPointer() );
- return A;
- }
- };
-
-
-
- /*
- * specialization for Operand1, Operand2 of type std::vector<Element> and Operand3 of type BlasPermutation
- */
-
- // Matrix permutation product C = A*B
- template<class Field>
- class BlasMatrixDomainMul<Field,std::vector< typename Field::Element>,std::vector< typename Field::Element>, BlasPermutation<size_t> > {
- public:
- std::vector< typename Field::Element>& operator()(const Field& F,
- std::vector< typename Field::Element>& C,
- const std::vector< typename Field::Element>& A,
- const BlasPermutation<size_t>& B) const
- {
- C = A;
- return BlasMatrixDomainMulin<Field,std::vector< typename Field::Element>,BlasPermutation<size_t> >()( F, C, B);
- }
- };
-
- template<class Field>
- class BlasMatrixDomainMul<Field,std::vector< typename Field::Element>, BlasPermutation<size_t>,std::vector< typename Field::Element> > {
- public:
- std::vector< typename Field::Element>& operator()(const Field& F,
- std::vector< typename Field::Element>& C,
- const BlasPermutation<size_t>& B,
- const std::vector< typename Field::Element>& A) const
- {
- C = A;
- return BlasMatrixDomainMulin<Field,std::vector< typename Field::Element>,BlasPermutation<size_t> >()( F, B, C);
- }
- };
-
- /*
- * specialization for Operand1, Operand2 of type std::vector<Element> and Operand3 of type TransposedBlasMatrix<BlasPermutation<size_t> >
- */
-
- // Matrix permutation product C = A*B
- template<class Field>
- class BlasMatrixDomainMul<Field,std::vector< typename Field::Element>,std::vector< typename Field::Element>, TransposedBlasMatrix<BlasPermutation<size_t> > > {
- public:
- std::vector< typename Field::Element>& operator()(const Field& F,
- std::vector< typename Field::Element>& C,
- const std::vector< typename Field::Element>& A,
- const TransposedBlasMatrix<BlasPermutation<size_t> >& B) const
- {
- C = A;
- return BlasMatrixDomainMulin<Field,std::vector< typename Field::Element>,TransposedBlasMatrix<BlasPermutation<size_t> > >()( F, C, B);
- }
- };
-
- template<class Field>
- class BlasMatrixDomainMul<Field,std::vector< typename Field::Element>, TransposedBlasMatrix<BlasPermutation<size_t> >,std::vector< typename Field::Element> > {
- public:
- std::vector< typename Field::Element>& operator()(const Field& F,
- std::vector< typename Field::Element>& C,
- const TransposedBlasMatrix<BlasPermutation<size_t> >& B,
- const std::vector< typename Field::Element>& A) const
- {
- C = A;
- return BlasMatrixDomainMulin<Field,std::vector< typename Field::Element>,TransposedBlasMatrix<BlasPermutation<size_t> > >()( F, B, C);
- }
- };
-
- /*
- * specialization for Operand1 of type std::vector<Element> and Operand2 of type BlasPermutation
- */
-
- // In-place matrix permutation product
- template<class Field>
- class BlasMatrixDomainMulin<Field,std::vector< typename Field::Element>, BlasPermutation<size_t> > {
- public:
- std::vector< typename Field::Element>& operator()( const Field& F,
- std::vector< typename Field::Element>& A,
- const BlasPermutation<size_t>& B) const
- {
- if (B.isIdentity()) return A ;
- linbox_check( A.size() == B.getSize() );
- FFPACK::applyP((typename Field::Father_t) F, FFLAS::FflasRight, FFLAS::FflasNoTrans,
- 1, 0,(int) B.getOrder(), &A[0], 1, B.getPointer() );
- return A;
- }
-
- std::vector< typename Field::Element>& operator()( const Field& F,
- const BlasPermutation<size_t>& B,
- std::vector< typename Field::Element>& A) const
- {
- if (B.isIdentity()) return A ;
- linbox_check( A.size() >= B.getSize() );
- FFPACK::applyP((typename Field::Father_t) F, FFLAS::FflasLeft, FFLAS::FflasNoTrans,
- 1, 0,(int) B.getOrder(), &A[0], 1, B.getPointer() );
- return A;
- }
-
- };
-
- template<class Field>
- class BlasMatrixDomainMulin<Field,std::vector< typename Field::Element>, TransposedBlasMatrix<BlasPermutation<size_t> > > {
- public:
- std::vector< typename Field::Element>& operator()( const Field& F,
- std::vector< typename Field::Element>& A,
- const TransposedBlasMatrix<BlasPermutation<size_t> >& B) const
- {
- if (B.getMatrix().isIdentity()) return A ;
- linbox_check( A.size() >= B.getMatrix().getSize() );
- FFPACK::applyP((typename Field::Father_t) F, FFLAS::FflasRight, FFLAS::FflasTrans,
- 1, 0,(int) B.getMatrix().getOrder(),
- &A[0], 1, B.getMatrix().getPointer() );
- return A;
- }
- std::vector< typename Field::Element>& operator()( const Field& F,
- const TransposedBlasMatrix<BlasPermutation<size_t> >& B,
- std::vector< typename Field::Element>& A) const
- {
- if (B.getMatrix().isIdentity()) return A ;
- linbox_check( A.size() >= B.getMatrix().getSize() );
- FFPACK::applyP((typename Field::Father_t) F, FFLAS::FflasLeft, FFLAS::FflasTrans,
- 1, 0,(int) B.getMatrix().getOrder(), &A[0], 1, B.getMatrix().getPointer() );
- return A;
- }
- };
-
- /*
- * specialization for Operand1 of type BlasMatrix<Field> and Operand2
- * of type TriangularBlasMatrix<Field>
- */
-
- // Matrix/Triangular product C = A*B
- template<class Field>
- class BlasMatrixDomainMul<Field,BlasMatrix<Field>,BlasMatrix<Field>, TriangularBlasMatrix<Field> > {
- public:
- BlasMatrix<Field>& operator()(const Field& F,
- BlasMatrix<Field>& C,
- const BlasMatrix<Field>& A,
- const TriangularBlasMatrix<Field>& B) const
- {
- C = A;
- return BlasMatrixDomainMulin<Field,BlasMatrix<Field>,TriangularBlasMatrix<Field> >()( F, C, B);
- }
- };
-
- template<class Field>
- class BlasMatrixDomainMul<Field,BlasMatrix<Field>, TriangularBlasMatrix<Field>,BlasMatrix<Field> > {
- public:
- BlasMatrix<Field>& operator()(const Field& F,
- BlasMatrix<Field>& C,
- const TriangularBlasMatrix<Field>& B,
- const BlasMatrix<Field>& A) const
- {
- C = A;
- return BlasMatrixDomainMulin<Field,BlasMatrix<Field>,TriangularBlasMatrix<Field> >()( F, B, C);
- }
- };
-
- /*
- * specialization for Operand1 of type BlasMatrix<Field> and Operand2 of type TriangularBlasMatrix<Field>
- */
-
- // In-place matrix*triangular matrix product
- template<class Field>
- class BlasMatrixDomainMulin<Field,BlasMatrix<Field>,
- TriangularBlasMatrix<Field> >{
- public:
- BlasMatrix<Field>& operator()( const Field& F,
- BlasMatrix<Field>& A,
- const TriangularBlasMatrix<Field>& B) const
- {
- typename Field::Element one;
- F.init(one, 1UL);
- linbox_check( A.coldim() == B.rowdim() );
-
- FFLAS::ftrmm((typename Field::Father_t) F, FFLAS::FflasRight, (FFLAS::FFLAS_UPLO) (B.getUpLo()),
- FFLAS::FflasNoTrans,(FFLAS::FFLAS_DIAG) (B.getDiag()),
- A.rowdim(), A.coldim(), one,
- B.getPointer(), B.getStride(), A.getPointer(), A.getStride() );
- return A;
- }
-
- BlasMatrix<Field>& operator()( const Field& F,
- const TriangularBlasMatrix<Field>& B,
- BlasMatrix<Field>& A) const
- {
- linbox_check( B.coldim() == A.rowdim() );
- typename Field::Element one;
- F.init(one, 1UL);
- FFLAS::ftrmm((typename Field::Father_t) F, FFLAS::FflasLeft, (FFLAS::FFLAS_UPLO)(B.getUpLo()),
- FFLAS::FflasNoTrans, (FFLAS::FFLAS_DIAG) (B.getDiag()),
- A.rowdim(), A.coldim(), one,
- B.getPointer(), B.getStride(),
- A.getPointer(), A.getStride() );
- return A;
- }
- };
-
-
- /*! @internal In-place matrix*triangular matrix product with transpose.
- */
- template<class Field>
- class BlasMatrixDomainMulin<Field,BlasMatrix<Field>,
- TransposedBlasMatrix<TriangularBlasMatrix<Field> > >{
- public:
- BlasMatrix<Field>& operator()( const Field& F,
- BlasMatrix<Field>& A,
- const TransposedBlasMatrix< TriangularBlasMatrix<Field> >& B) const
- {
- typename Field::Element one;
- F.init(one, 1UL);
- linbox_check( B.getMatrix().coldim() == A.coldim() );
-
- FFLAS::ftrmm((typename Field::Father_t) F, FFLAS::FflasRight,
- (FFLAS::FFLAS_UPLO)(B.getMatrix().getUpLo()),
- FFLAS::FflasTrans,
- (FFLAS::FFLAS_DIAG) (B.getMatrix().getDiag()),
- A.rowdim(), A.coldim(),
- one,
- B.getMatrix().getPointer(), B.getMatrix().getStride(),
- A.getPointer(), A.getStride() );
- return A;
- }
-
- BlasMatrix<Field>& operator()( const Field& F,
- const TransposedBlasMatrix< TriangularBlasMatrix<Field> >& B,
- BlasMatrix<Field>& A) const
- {
- linbox_check( B.getMatrix().coldim() == A.rowdim() );
- typename Field::Element one;
- F.init(one, 1UL);
- FFLAS::ftrmm((typename Field::Father_t) F, FFLAS::FflasLeft,
- (FFLAS::FFLAS_UPLO) (B.getMatrix().getUpLo()),
- FFLAS::FflasTrans,
- (FFLAS::FFLAS_DIAG) (B.getMatrix().getDiag()),
- A.rowdim(), A.coldim(), one,
- B.getMatrix().getPointer(), B.getMatrix().getStride(),
- A.getPointer(), A.getStride() );
- return A;
- }
- };
-
-
-
- /*
- * specialization for Operand1 of type TriangularBlasMatrix<Field> and Operand2 of type BlasPermutation
- */
-
- // Matrix permutation product C = A*B
- template<class Field>
- class BlasMatrixDomainMul<Field,BlasMatrix<Field>,TriangularBlasMatrix<Field>, BlasPermutation<size_t> > {
- public:
- BlasMatrix<Field>& operator()(const Field& F,
- BlasMatrix<Field>& C,
- const TriangularBlasMatrix<Field>& A,
- const BlasPermutation<size_t>& B) const
- {
- C = A;
- return BlasMatrixDomainMulin<Field,BlasMatrix<Field>,BlasPermutation<size_t> >()( F, C, B);
- }
- };
-
- template<class Field>
- class BlasMatrixDomainMul<Field,BlasMatrix<Field>, BlasPermutation<size_t>,TriangularBlasMatrix<Field> > {
- public:
- BlasMatrix<Field>& operator()(const Field& F,
- BlasMatrix<Field>& C,
- const BlasPermutation<size_t>& B,
- const TriangularBlasMatrix<Field>& A) const
- {
- C = A;
- return BlasMatrixDomainMulin<Field,BlasMatrix<Field>,BlasPermutation<size_t> >()( F, B, C);
- }
- };
-
- /*
- * Specialization for Operand of type BlasMatrix<Field>
- */
-
- template <class Field>
- class BlasMatrixDomainLeftSolve<Field,BlasMatrix<Field>,BlasMatrix<Field> > {
- public:
- BlasMatrix<Field>& operator() (const Field& F,
- BlasMatrix<Field>& X,
- const BlasMatrix<Field>& A,
- const BlasMatrix<Field>& B) const
- {
- LQUPMatrix<Field> LQUP(A);
- LQUP.left_solve(X,B);
- return X;
- }
-
-
- BlasMatrix<Field>& operator() (const Field& F,
- const BlasMatrix<Field>& A,
- BlasMatrix<Field>& B) const
- {
- LQUPMatrix<Field> LQUP(A);
- LQUP.left_solve(B);
- return B;
- }
- };
-
- template <class Field>
- class BlasMatrixDomainRightSolve<Field,BlasMatrix<Field>,BlasMatrix<Field> > {
- public:
- BlasMatrix<Field>& operator() (const Field& F,
- BlasMatrix<Field>& X,
- const BlasMatrix<Field>& A,
- const BlasMatrix<Field>& B) const
- {
- LQUPMatrix<Field> LQUP(A);
- LQUP.right_solve(X,B);
- return X;
- }
-
-
- BlasMatrix<Field>& operator() (const Field& F,
- const BlasMatrix<Field>& A,
- BlasMatrix<Field>& B) const
- {
- LQUPMatrix<Field> LQUP(A);
- LQUP.right_solve(B);
- return B;
- }
-
- };
-
- template <class Field>
- class BlasMatrixDomainRightSolve<Field,BlasSubmatrix<Field>,BlasSubmatrix<Field> > {
- public:
- BlasSubmatrix<Field>& operator() (const Field& F,
- BlasSubmatrix<Field>& X,
- const BlasSubmatrix<Field>& A,
- const BlasSubmatrix<Field>& B) const
- {
- LQUPMatrix<Field> LQUP(A);
- LQUP.right_solve(X,B);
- return X;
- }
-
-
- BlasSubmatrix<Field>& operator() (const Field& F,
- const BlasSubmatrix<Field>& A,
- BlasSubmatrix<Field>& B) const
- {
- LQUPMatrix<Field> LQUP(A);
- LQUP.right_solve(B);
- return B;
- }
-
- };
-
- /*
- * Specialization for Operand of type std::vector<Element>
- */
-
- template <class Field>
- class BlasMatrixDomainLeftSolve<Field, std::vector<typename Field::Element>, BlasMatrix<Field> > {
- public:
- std::vector<typename Field::Element>& operator() (const Field& F,
- std::vector<typename Field::Element>& X,
- const BlasMatrix<Field>& A,
- const std::vector<typename Field::Element>& B) const
- {
- LQUPMatrix<Field> LQUP(A);
- LQUP.left_solve(X,B);
- return X;
- }
-
- std::vector<typename Field::Element>& operator()(const Field& F,
- const BlasMatrix<Field>& A,
- std::vector<typename Field::Element>& B) const
- {
- LQUPMatrix<Field> LQUP(A);
- LQUP.left_solve(B);
- return B;
- }
-
- };
-
- template <class Field>
- class BlasMatrixDomainRightSolve<Field, std::vector<typename Field::Element>, BlasMatrix<Field> > {
- public:
- std::vector<typename Field::Element>& operator() (const Field& F,
- std::vector<typename Field::Element>& X,
- const BlasMatrix<Field>& A,
- const std::vector<typename Field::Element>& B) const
- {
- LQUPMatrix<Field> LQUP(A);
- LQUP.right_solve(X,B);
- return X;
- }
-
- std::vector<typename Field::Element>& operator() (const Field& F,
- const BlasMatrix<Field>& A,
- std::vector<typename Field::Element>& B) const
- {
- LQUPMatrix<Field> LQUP(A);
- LQUP.right_solve(B);
- return B;
- }
-
- };
-
-
- /*
- * ********************************************************
- * *** Specialization for TriangularBlasMatrix<Field> ***
- * ********************************************************
- */
-
-
- /*
- * specialization for Operand of type BlasMatrix<Field>
- */
-
- template <class Field>
- class BlasMatrixDomainLeftSolve<Field, BlasMatrix<Field>,TriangularBlasMatrix<Field> > {
- public:
- BlasMatrix<Field>& operator() (const Field& F,
- BlasMatrix<Field>& X,
- const TriangularBlasMatrix<Field>& A,
- const BlasMatrix<Field>& B) const
- {
-
- linbox_check( X.rowdim() == B.rowdim());
- linbox_check( X.coldim() == B.coldim());
-
- typename BlasMatrix<Field>::ConstIterator Biter = B.Begin();
- typename BlasMatrix<Field>::Iterator Xiter = X.Begin();
-
- for (; Biter != B.End(); ++Biter,++Xiter)
- F.assign(*Xiter,*Biter);
-
- return (*this)(F,A,X);
-
- }
-
- BlasMatrix<Field>& operator() (const Field& F,
- const TriangularBlasMatrix<Field>& A,
- BlasMatrix<Field>& B) const
- {
- linbox_check( A.rowdim() == A.coldim());
- linbox_check( A.coldim() == B.rowdim());
- // typename Field::Element _One;
- // F.init(_One,1UL);
-
- FFLAS::ftrsm((typename Field::Father_t) F,
- FFLAS::FflasLeft, (FFLAS::FFLAS_UPLO) A.getUpLo(),
- FFLAS::FflasNoTrans,(FFLAS::FFLAS_DIAG) A.getDiag(),
- A.rowdim(), B.coldim(),
- F.one,A.getPointer(),A.getStride(),
- B.getPointer(),B.getStride());
-
- return B;
- }
- };
-
- template <class Field>
- class BlasMatrixDomainRightSolve<Field,BlasMatrix<Field>, TriangularBlasMatrix<Field> > {
- public:
- BlasMatrix<Field>& operator() (const Field& F,
- BlasMatrix<Field>& X,
- const TriangularBlasMatrix<Field>& A,
- const BlasMatrix<Field>& B) const
- {
-
- linbox_check( X.rowdim() == B.rowdim());
- linbox_check( X.coldim() == B.coldim());
-
- typename BlasMatrix<Field>::ConstIterator Biter = B.Begin();
- typename BlasMatrix<Field>::Iterator Xiter = X.Begin();
-
- for (; Biter != B.End(); ++Biter,++Xiter)
- F.assign(*Xiter,*Biter);
-
- return (*this)(F,A,X);
- }
-
- BlasMatrix<Field>& operator() (const Field& F,
- const TriangularBlasMatrix<Field>& A,
- BlasMatrix<Field>& B) const
- {
-
- linbox_check( A.rowdim() == A.coldim());
- linbox_check( B.coldim() == A.rowdim());
- // typename Field::Element _One;
- // F.init(_One,1UL);
-
- FFLAS::ftrsm((typename Field::Father_t) F,
- FFLAS::FflasRight,(FFLAS::FFLAS_UPLO) A.getUpLo(),
- FFLAS::FflasNoTrans,(FFLAS::FFLAS_DIAG) A.getDiag() ,
- B.rowdim(), A.coldim(),
- F.one,A.getPointer(),A.getStride(),
- B.getPointer(),B.getStride());
-
-
- return B;
- }
- };
-
- template <class Field>
- class BlasMatrixDomainRightSolve<Field,BlasSubmatrix<Field>, TriangularBlasMatrix<Field> > {
- public:
- BlasSubmatrix<Field>& operator() (const Field& F,
- BlasSubmatrix<Field>& X,
- const TriangularBlasMatrix<Field>& A,
- const BlasSubmatrix<Field>& B) const
- {
-
- linbox_check( X.rowdim() == B.rowdim());
- linbox_check( X.coldim() == B.coldim());
-
- typename BlasSubmatrix<Field>::ConstIterator Biter = B.Begin();
- typename BlasSubmatrix<Field>::Iterator Xiter = X.Begin();
-
- for (; Biter != B.End(); ++Biter,++Xiter)
- F.assign(*Xiter,*Biter);
-
- return (*this)(F,A,X);
- }
-
- BlasSubmatrix<Field>& operator() (const Field& F,
- const TriangularBlasMatrix<Field>& A,
- BlasSubmatrix<Field>& B) const
- {
-
- linbox_check( A.rowdim() == A.coldim());
- linbox_check( B.coldim() == A.rowdim());
- // typename Field::Element _One;
- // F.init(_One,1UL);
-
- FFLAS::ftrsm((typename Field::Father_t) F,
- FFLAS::FflasRight,(FFLAS::FFLAS_UPLO) A.getUpLo(),
- FFLAS::FflasNoTrans,(FFLAS::FFLAS_DIAG) A.getDiag() ,
- B.rowdim(), A.coldim(),
- F.one,A.getPointer(),A.getStride(),
- B.getPointer(),B.getStride());
-
-
- return B;
- }
- };
-
-
-
- /*
- * specialization for Operand of type std::vector<Element>
- */
-
- template <class Field>
- class BlasMatrixDomainLeftSolve<Field, std::vector<typename Field::Element>, TriangularBlasMatrix<Field> > {
- public:
- std::vector<typename Field::Element>& operator() (const Field& F,
- std::vector<typename Field::Element>& x,
- const TriangularBlasMatrix<Field>& A,
- const std::vector<typename Field::Element>& b) const
- {
-
- linbox_check (x.size() == b.size());
- typename std::vector<typename Field::Element>::const_iterator biter = b.begin();
- typename std::vector<typename Field::Element>::iterator xiter = x.begin();
- for (;biter!=b.end();++biter,++xiter)
- F.assign(*xiter,*biter);
-
- return (*this)(F,A,x);
- }
-
- std::vector<typename Field::Element>& operator() (const Field& F,
- const TriangularBlasMatrix<Field>& A,
- std::vector<typename Field::Element>& b) const
- {
-
- linbox_check( A.rowdim() == A.coldim());
- linbox_check( A.rowdim() == b.size());
-
- switch (A.getUpLo()) {
- case LinBoxTag::Upper:
- switch(A.getDiag()) {
- case LinBoxTag::Unit:
- FFLAS::ftrsv((typename Field::Father_t) F,
- FFLAS::FflasUpper,FFLAS::FflasNoTrans,FFLAS::FflasUnit,
- b.size(),A.getPointer(),A.getStride(),&b[0],1);
- break;
- case LinBoxTag::NonUnit:
- FFLAS::ftrsv((typename Field::Father_t) F,
- FFLAS::FflasUpper,FFLAS::FflasNoTrans,FFLAS::FflasNonUnit,
- b.size(),A.getPointer(),A.getStride(),&b[0],1);
- break;
- default:
- throw LinboxError ("Error in BlasMatrixDomain (triangular matrix not well defined)");
- }
- break;
- case LinBoxTag::Lower:
- switch(A.getDiag()) {
- case LinBoxTag::Unit:
- FFLAS::ftrsv((typename Field::Father_t) F,
- FFLAS::FflasLower,FFLAS::FflasNoTrans,FFLAS::FflasUnit,
- b.size(),A.getPointer(),A.getStride(),&b[0],1);
- break;
- case LinBoxTag::NonUnit:
- FFLAS::ftrsv((typename Field::Father_t) F,
- FFLAS::FflasLower,FFLAS::FflasNoTrans,FFLAS::FflasNonUnit,
- b.size(),A.getPointer(),A.getStride(),&b[0],1);
- break;
- default:
- throw LinboxError ("Error in BlasMatrixDomain (triangular matrix not well defined)");
- }
- break;
- default:
- throw LinboxError ("Error in BlasMatrixDomain (triangular matrix not well defined)");
-
- }
- return b;
- }
- };
-
- template <class Field>
- class BlasMatrixDomainRightSolve<Field, std::vector<typename Field::Element>, TriangularBlasMatrix<Field> > {
- public:
- std::vector<typename Field::Element>& operator() (const Field& F,
- std::vector<typename Field::Element>& x,
- const TriangularBlasMatrix<Field>& A,
- const std::vector<typename Field::Element>& b) const
- {
-
- linbox_check (x.size() == b.size());
- typename std::vector<typename Field::Element>::const_iterator biter = b.begin();
- typename std::vector<typename Field::Element>::iterator xiter = x.begin();
- for (;biter!=b.end();++biter,++xiter)
- F.assign(*xiter,*biter);
-
- return (*this)(F,A,x);
- }
-
- std::vector<typename Field::Element>& operator() (const Field& F,
- const TriangularBlasMatrix<Field>& A,
- std::vector<typename Field::Element>& b) const
- {
-
- linbox_check( A.rowdim() == A.coldim());
- linbox_check( A.coldim() == b.size());
-
-
- switch (A.getUpLo()) {
- case LinBoxTag::Upper:
- switch(A.getDiag()) {
- case LinBoxTag::Unit:
- FFLAS::ftrsv( (typename Field::Father_t)F,
- FFLAS::FflasUpper, FFLAS::FflasTrans, FFLAS::FflasUnit,
- b.size(),A.getPointer(),A.getStride(),&b[0],1);
- break;
- case LinBoxTag::NonUnit:
- FFLAS::ftrsv((typename Field::Father_t) F,
- FFLAS::FflasUpper,FFLAS::FflasTrans,FFLAS::FflasNonUnit,
- b.size(),A.getPointer(),A.getStride(),&b[0],1);
- break;
- default:
- throw LinboxError ("Error in BlasMatrixDomain (triangular matrix not well defined)");
- }
- break;
- case LinBoxTag::Lower:
- switch(A.getDiag()) {
- case LinBoxTag::Unit:
- FFLAS::ftrsv((typename Field::Father_t) F,
- FFLAS::FflasLower,FFLAS::FflasTrans,FFLAS::FflasUnit,
- b.size(),A.getPointer(),A.getStride(),&b[0],1);
- break;
- case LinBoxTag::NonUnit:
- FFLAS::ftrsv( (typename Field::Father_t)F,
- FFLAS::FflasLower,FFLAS::FflasTrans,FFLAS::FflasNonUnit,
- b.size(),A.getPointer(),A.getStride(),&b[0],1);
- break;
- default:
- throw LinboxError ("Error in BlasMatrixDomain (triangular matrix not well defined)");
- }
- break;
- default:
- throw LinboxError ("Error in BlasMatrixDomain (triangular matrix not well defined)");
-
- }
- return b;
- }
- };
-
- template< class Field, class Polynomial>
- class BlasMatrixDomainMinpoly< Field, Polynomial, BlasMatrix<Field> > {
- public:
- Polynomial& operator() (const Field &F, Polynomial& P, const BlasMatrix<Field>& A) const
- {
- commentator().start ("Modular Dense Minpoly ", "MDMinpoly");
-
- size_t n = A.coldim();
- linbox_check( n == A.rowdim());
- typename Field::Element * X = new typename Field::Element[n*(n+1)];
- size_t *Perm = new size_t[n];
- for ( size_t i=0; i<n; ++i)
- Perm[i] = 0;
- // (typename Field::Father_t)
- FFPACK::MinPoly<Field,Polynomial>( F, P, n, A.getPointer(), A.getStride(), X, n, Perm);
- commentator().report(Commentator::LEVEL_IMPORTANT, INTERNAL_DESCRIPTION) << "minpoly with " << P.size() << " coefficients" << std::endl;
-
- delete[] Perm;
- delete[] X;
- commentator().stop ("done",NULL,"MDMinpoly");
- return P;
- }
- };
-
-// #if !defined(__INTEL_COMPILER) && !defined(__CUDACC__) && !defined(__clang__)
- // template <>
-// #endif
- template< class Field, class ContPol >
- class BlasMatrixDomainCharpoly< Field, ContPol, BlasMatrix<Field> > {
- public:
- ContPol& operator() ( const Field &F,
- ContPol &P,
- const BlasMatrix<Field> &A) const
- {
-
- size_t n = A.coldim();
- P.clear();
- linbox_check( n == A.rowdim());
- FFPACK::CharPoly((typename Field::Father_t) F, P, n, A.getPointer(), A.getStride());
- return P;
- }
- };
-
-} //end of namespace LinBox
-
-#endif // __LINBOX_blas_matrix_domain_INL
-
-
-// Local Variables:
-// mode: C++
-// tab-width: 8
-// indent-tabs-mode: nil
-// c-basic-offset: 8
-// End:
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
-
diff --git a/linbox/algorithms/block-coppersmith-domain.h b/linbox/algorithms/block-coppersmith-domain.h
new file mode 100644
index 0000000..3c4cb1f
--- /dev/null
+++ b/linbox/algorithms/block-coppersmith-domain.h
@@ -0,0 +1,875 @@
+/* linbox/algorithms/block-coppersmith-domain.h
+ * Copyright (C) 2012 George Yuhasz
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+02110-1301 USA
+ * ========LICENCE========
+ */
+
+
+
+#ifndef __LINBOX_coppersmith_block_domain_H
+#define __LINBOX_coppersmith_block_domain_H
+
+#include <vector>
+#include <iostream>
+#include <algorithm>
+#include <iomanip>
+
+#include "linbox/util/timer.h"
+
+#include "givaro/givtimer.h"
+#if defined(__LINBOX_USE_OPENMP) and defined(__GIVARO_USE_OPENMP)
+#include <omp.h>
+namespace LinBox {
+ typedef Givaro::OMPTimer CTimer;
+}
+#else
+namespace LinBox {
+ typedef Givaro::Timer CTimer;
+}
+#endif
+
+#include "linbox/util/commentator.h"
+
+#define DEFAULT_BLOCK_EARLY_TERM_THRESHOLD 10
+//Preprocessor variables for the state of BM_iterators
+#define DeltaExceeded 4
+#define SequenceExceeded 3
+#define GeneratorFound 2
+#define GeneratorUnconfirmed 1
+
+namespace LinBox
+{
+ double g_time1=0.0,g_time2=0.0,g_time3=0.0,g_time4=0.0;
+ /** Compute the linear generator of a sequence of matrices.
+ *
+ * This class encapsulates the functionality required for computing
+ * the block minimal polynomial of a matrix.
+ * @bib
+ * Yuhasz thesis ...
+ */
+ template<class _Domain, class _Sequence>
+ class BlockCoppersmithDomain {
+
+ public:
+ typedef _Domain Domain;
+ typedef typename Domain::Field Field;
+ typedef typename Domain::Element Element;
+ typedef _Sequence Sequence;
+ typedef typename Domain::OwnMatrix Coefficient;
+ typedef typename Domain::Matrix Sub;
+
+
+ protected:
+ Sequence *_container;
+ const Domain *_MD;
+ unsigned long EARLY_TERM_THRESHOLD;
+
+
+ public:
+
+ BlockCoppersmithDomain (const BlockCoppersmithDomain<Field,
+Sequence> &Mat, unsigned long ett_default =
+DEFAULT_BLOCK_EARLY_TERM_THRESHOLD) :
+ _container(Mat._container), _MD(Mat._MD),
+ EARLY_TERM_THRESHOLD (ett_default)
+ {}
+ BlockCoppersmithDomain (const Domain& MD, Sequence *D, unsigned long ett_default
+= DEFAULT_BLOCK_EARLY_TERM_THRESHOLD) :
+ _container(D), _MD(&MD),
+EARLY_TERM_THRESHOLD (ett_default)
+ {}
+
+ //matrix domain
+ const Domain &domain () const { return *_MD; }
+
+ // field of the domain
+ const Field &field () const { return domain().field(); }
+ const Field &getField () const { return domain().field(); } // deprecated
+
+ // sequence of the domain
+ Sequence *getSequence () const
+ { return _container; }
+
+ // the principal function
+ std::vector<size_t> right_minpoly (std::vector<Coefficient> &P);
+
+ // left minimal generating polynomial of the sequence
+ // This _MAY_ get defined eventually.
+ std::vector<size_t> & left_minpoly (std::vector<Coefficient> &P);
+ // { /* transpose seq and transpose result*/ }
+
+ // For compatibility with massey-domain (element sequence case).
+ std::vector<size_t> /* & */ operator()(std::vector<Coefficient> &P)
+ {
+ return right_minpoly(P);
+ }
+
+
+ private:
+
+ // bm-seq.h stuff can go here.
+ class BM_Seq {
+
+ public:
+
+ typedef typename std::list<Coefficient>::const_iterator const_iterator;
+ typedef int size_type;
+
+ inline const Domain &domain() const { return *_MD;}
+ inline const Field &field() const {return domain().field();}
+
+ private:
+ const Domain *_MD;
+ std::list<Coefficient> _seq;
+ size_type _size;
+ size_t _row, _col;
+
+ public:
+ BM_Seq(const Domain & MD, size_t r, size_t c) : _MD(&MD)
+ {
+ _row = r;
+ _col = c;
+ _size = 0;
+ }
+ BM_Seq(const Domain & MD, size_t r) : _MD(&MD)
+ {
+ _row = r;
+ _col = r;
+ _size = 0;
+ }
+ BM_Seq(const Domain &MD, int n, Coefficient& M) : _MD(&MD), _seq(n, M), _size(n)
+ {
+ _row = M.rowdim();
+ _col = M.coldim();
+ }
+
+ BM_Seq() {}
+
+ BM_Seq(const BM_Seq& S) :
+ _MD(S._MD), _seq(S._seq), _size(S._size), _row(S._row), _col(S._col)
+ {}
+
+ BM_Seq & operator=(const BM_Seq& S)
+ {
+ if(this != &S){
+ (*this)._size = S._size;
+ (*this)._row = S._row;
+ (*this)._col = S._col;
+ (*this)._MD = S._MD;
+ _seq.clear();
+ for(typename std::list<Coefficient>::const_iterator it = S._seq.begin(); it != S._seq.end(); ++it)
+ _seq.push_back(*it);
+ }
+ return *this;
+ }
+
+
+ size_t rowdim()
+ {
+ return _row;
+ }
+
+ size_t coldim()
+ {
+ return _col;
+ }
+
+ const_iterator begin() const
+ {
+ return _seq.begin();
+ }
+
+ const_iterator end() const
+ {
+ return _seq.end();
+ }
+
+ void push_back(const Coefficient &M)
+ {
+ if(_row==M.rowdim() && _col==M.coldim()){
+ _seq.push_back(M);
+ ++_size;
+ }
+ }
+
+ bool operator==(const BM_Seq& l)
+ {
+ typename std::list<Coefficient>::const_iterator it, lit;
+ bool test = false;
+ if(_size==l._size && _row==l._row && _col==l._col){
+ test = true;
+ it = _seq.begin();
+ lit = l._seq.begin();
+ if(_size==0){
+ return test;
+ }
+ else{
+ while(test && it!=_seq.end()){
+ test = domain().areEqual(*it,*lit);
+ ++it;
+ ++lit;
+ }
+ }
+ }
+ return test;
+ }
+
+ bool operator!=(const BM_Seq& l)
+ {
+ return !(*this == l);
+ }
+
+ size_type size()
+ {
+ return _size;
+ }
+
+ class BM_iterator {
+ public:
+ typedef std::list<Coefficient> value_type;
+
+ private:
+ const Domain *_MD;
+ BM_Seq& _seq;
+ typename BM_Seq::size_type _size;
+ typename BM_Seq::size_type _t;
+ typename BM_Seq::const_iterator _seqel;
+ std::list<Coefficient> _gen;
+ std::vector<size_t> _deg;
+ size_t _delta;
+ size_t _mu;
+ size_t _beta;
+ size_t _sigma;
+ size_t _gensize;
+ size_t _row, _col;
+ size_t _ett;
+ size_t _etc;
+
+ public:
+ // This is an enumeration class that tells what state the berlekamp/massey algoithm iterator is in.
+ // The four states are:
+ // DeltaExceeded = 4
+ // SequenceExceeded = 3
+ // GeneratorFound = 2
+ // GeneratorUnconfirmed = 1
+ class TerminationState{
+ private:
+
+ int _state;
+ friend class BM_iterator;
+ TerminationState() : _state(GeneratorUnconfirmed) {}
+ TerminationState(int m) : _state(m) {}
+ public:
+ TerminationState(const TerminationState& t) : _state(t._state) {}
+ TerminationState & operator=(const TerminationState & t){
+ if(this != &t){
+ (*this)._state = t._state;
+ }
+ return *this;
+ }
+ bool IsGeneratorUnconfirmed(){
+ return _state==GeneratorUnconfirmed;
+ }
+ bool IsGeneratorFound()
+ {
+ return _state==GeneratorFound;
+ }
+ bool IsSequenceExceeded()
+ {
+ return _state==SequenceExceeded;
+ }
+ bool IsDeltaExceeded()
+ {
+ return _state==DeltaExceeded;
+ }
+ }; // TerminationState
+
+ private:
+ TerminationState _state;
+ public:
+ TerminationState state() const
+ {
+ return _state;
+ }
+ void setDelta(int d)
+ {
+ _delta=d;
+ if((/* _delta < 0 ||*/ _beta < _delta - _sigma + _mu +1) && _state._state!=3){
+ if(_sigma <= _delta /*|| _delta < 0*/)
+ _state._state = GeneratorUnconfirmed;
+ else
+ _state._state = DeltaExceeded;
+ }
+ else{
+ if(_sigma > _delta)
+ _state._state = DeltaExceeded;
+ else
+ _state._state = GeneratorFound;
+ }
+ }
+ //field and matrix domain functions
+ inline const Domain &domain() const { return *_MD;}
+ inline const Field &field() const { return domain().field();}
+ //Constructor
+ explicit BM_iterator(BM_Seq& s,
+ unsigned long earlyTermThreshold=DEFAULT_BLOCK_EARLY_TERM_THRESHOLD,
+ typename BM_Seq::size_type elinit=0) :
+ _MD(&s.domain()), _seq(s)
+ {
+ _row = s.rowdim();
+ _col = s.coldim();
+ _size = _seq.size();
+ _t = elinit;
+ _delta = (size_t)-1; // BB: is it meant ?
+ _seqel = _seq.begin();
+ _deg = std::vector<size_t>(_row+_col);
+ _ett=earlyTermThreshold;
+ _etc=0;
+ for(size_t i = _col; i < _row+_col; ++i)
+ _deg[i] = 1;
+ Coefficient gen1(field(),_col,_row+_col);
+ for(size_t i = 0; i<_col; ++i)
+ gen1.setEntry(i,i,field().one);
+ _gen.push_back(gen1);
+ _gensize = 1;
+ if(_size==0 || _t==_size)
+ _state._state = SequenceExceeded;
+ _sigma = 0;
+ _mu = 0;
+ _beta = 1;
+ }
+
+ //Copy constructor
+ BM_iterator(const BM_Seq::BM_iterator & it) :
+ _MD(&it.domain()), _seq(it._seq), _size(it._size), _t(it._t),
+ _seqel(it._seqel), _gen(it._gen), _deg(it._deg),
+ _delta(it._delta), _mu(it._mu), _beta(it._beta),
+ _sigma(it._sigma), _gensize(it._gensize),
+ _row(it._row), _col(it._col),
+ _ett(it._ett), _etc(it._etc), _state(it._state) {}
+
+
+ //Assignment operator not overloaded since BlasMatrix class has overloaded assignment error
+ //Overloaded assignment operator
+ BM_iterator& operator=(const typename BM_Seq::BM_iterator& it)
+ {
+ if(this != &it){
+ (*this)._MD = it._MD;
+ (*this)._row = it._row;
+ (*this)._col = it._col;
+ (*this)._seq = it._seq;
+ (*this)._size = it._size;
+ (*this)._t = it._t;
+ (*this)._seqel = it._seqel;
+ (*this)._deg = it._deg;
+ (*this)._gensize = it._gensize;
+ (*this)._delta = it._delta;
+ (*this)._mu = it._mu;
+ (*this)._sigma = it._sigma;
+ (*this)._beta = it._beta;
+ (*this)._state = it._state;
+ (*this)._ett = it._ett;
+ (*this)._etc = it._etc;
+ _gen.clear();
+ for(typename std::list<Coefficient>::const_iterator git = it._gen.begin(); git != it._gen.end(); ++git)
+ _seq.push_back(*git);
+ }
+ return (*this);
+ }
+
+ bool operator==(const BM_Seq::BM_iterator& it)
+ {
+ TerminationState check = it.state();
+ bool test1 = (_seq==it._seq);
+ bool test2 = (_t==it._t);
+ bool test3 = _delta==it._delta;
+ bool test4 = (_state._state == check._state && _state.IsSequenceExceeded());
+ return (test1 && test2 && (test3 || test4));
+ }
+
+ bool operator!=(const BM_iterator& it)
+ {
+ return !((*this) == it);
+ }
+ private:
+
+ // Column Copy
+ void ColumnCopy(Coefficient &M, Coefficient &A, size_t i)
+ {
+ size_t rowd = A.rowdim();
+ Sub MC(M,0,i,rowd,1);
+ Sub AC(A,0,i,rowd,1);
+ domain().copy(MC,AC);
+ }
+ // Column Swap
+ void ColumnSwap(Coefficient &M, size_t i, size_t j)
+ {
+ size_t rowd = M.rowdim();
+ Sub Ci(M,0,i,rowd,1);
+ Sub Cj(M,0,j,rowd,1);
+ domain().swap(Ci,Cj);
+ }
+ // Column Operation
+ void ColumnAdd(Coefficient &M, size_t i, size_t j, Element el)
+ {
+ size_t rowd = M.rowdim();
+ Coefficient temp(field(),rowd,1);
+ Sub Ci(M,0,i,rowd,1);
+ Sub Cj(M,0,j,rowd,1);
+ domain().mul(temp,Cj,el);
+ domain().addin(Ci,temp);
+
+ }
+ void Algorithm3dot2(Coefficient &tau, Coefficient &D, std::vector<size_t> &d, size_t &mu, size_t &sigma, size_t &beta)
+ {
+ Element pivel;
+ field().assign(pivel,field().zero);
+ // Retrieve the row and column dimensions of the sequence and the dimension of the discrepancy
+ size_t n = D.rowdim();
+ size_t nm = D.coldim();
+ size_t m = nm-n;
+ //Initialize tau to the identity matrix
+ for(size_t i = 0; i<nm; ++i)
+ tau.setEntry(i,i,field().one);
+ //Create the set of generator columns
+ std::set<size_t> gen;
+ typedef std::set<size_t>::key_type index_type;
+ for(index_type i=0; i<m; ++i)
+ gen.insert(i);
+ for(index_type i = 0; i<n; ++i){
+ //Compute pi, the columns of D with nonzero entries in row i
+ std::set<size_t> pi;
+ pi.insert(m+i);
+ for(typename std::set<size_t>::iterator genit = gen.begin(); genit != gen.end(); ++genit){
+ if(!field().isZero(D.getEntry(i,*genit)))
+ pi.insert(*genit);
+ }
+
+ //Choose the pivot row with the smallest nominal degree
+ index_type piv = m+i;
+ for(std::set<size_t>::iterator itpi = pi.begin(); itpi != pi.end(); ++itpi){
+ size_t j = *itpi;
+ if(d[j] <= d[piv]){
+ if(d[j]==d[piv]){
+ if(piv < m+i){
+ if(j<piv)
+ piv = j;
+ }
+ }
+ else
+ piv = j;
+ }
+ }
+ pi.erase(piv);
+ field().assign(pivel,D.getEntry(i,piv));
+ //Handle the case when piv=m+i, so no swap is done
+ if(piv==m+i){
+ for(std::set<size_t>::iterator itpi = pi.begin(); itpi != pi.end(); ++itpi){
+ Element temp;
+ field().assign(temp,D.getEntry(i, *itpi));
+ field().negin(temp);
+ field().divin(temp,pivel);
+ ColumnAdd(tau, *itpi, piv, temp);
+ ColumnAdd(D, *itpi, piv, temp);
+ }
+ }
+ else{
+ //Remove column index m+i and handle it separately
+ pi.erase(m+i);
+ //Eliminate nonzero discrepancies in generator columns
+ for(typename std::set<size_t>::iterator itpi = pi.begin(); itpi != pi.end(); ++itpi){
+ Element temp;
+ field().assign(temp,D.getEntry(i, *itpi));
+ field().negin(temp);
+ field().divin(temp,pivel);
+ ColumnAdd(tau, *itpi, piv, temp);
+ ColumnAdd(D, *itpi, piv, temp);
+ }
+ Element auxel;
+ field().assign(auxel,D.getEntry(i,m+i));
+ //Perform a major change and update an initialized auxiliary column
+ if(!field().isZero(auxel)){
+ Element temp;
+ field().assign(temp,D.getEntry(i, m+i));
+ field().negin(temp);
+ field().divin(temp,pivel);
+ ColumnAdd(tau, m+i, piv, temp);
+ ColumnAdd(D, m+i, piv, temp);
+ ColumnSwap(tau,piv, m+i);
+ ColumnSwap(D, piv, m+i);
+ }
+ else{
+ ColumnAdd(tau,m+i,piv,field().one);
+ ColumnAdd(D,m+i,piv,field().one);
+ gen.erase(piv);
+ }
+ size_t tempdeg = d[piv];
+ d[piv] = d[m+i];
+ d[m+i] = tempdeg;
+ if(tempdeg < beta)
+ beta = tempdeg;
+ if(d[piv] > mu)
+ mu = d[piv];
+ sigma = sigma - tempdeg + d[piv];
+ }
+ }
+ }
+ public:
+ BM_iterator& operator++()
+ {
+ //See if a matrix has been pushed on the sequence
+ //if it has, then recompute the seqel since it may
+ //have become corrupt.
+ //Also reset the size to the correct size of the sequence
+ if(_size < _seq.size()){
+ _seqel = _seq.begin();
+ for(int i = 0; i<_t; ++i)
+ ++_seqel;
+ _size = _seq.size();
+ }
+ //if the iterator points past the seq elements, do nothing
+ if(_t == _size){
+ return *this;
+ }
+ //Initialize the discrepancy
+ Coefficient disc(field(),_row, _row+_col);
+ //Create two iterators, one for seq, and one for gen
+ typename BM_Seq::const_iterator cseqit;
+ typename std::list<Coefficient>::iterator genit;
+ //get a iterator to the seq element to be processed
+ cseqit = _seqel;
+
+ CTimer start1; start1.start();
+ //Compute the discrepancy
+ std::vector<Coefficient*> coeffVec;
+ std::vector<const Coefficient*> seqPtrVec;
+ for(genit = _gen.begin(); genit!=_gen.end(); ++genit){
+ coeffVec.push_back(&(*genit));
+ seqPtrVec.push_back(&(*cseqit));
+ --cseqit;
+ }
+ int numCoeffs=coeffVec.size();
+ std::vector <Coefficient> discComponents;
+ discComponents.reserve(numCoeffs);
+ for (int i=0;i<numCoeffs;++i) {
+ discComponents.push_back(Coefficient(field(),_row,_row+_col));
+ }
+#ifdef __LINBOX_USE_OPENMP
+#pragma omp parallel for
+#endif
+ for (int i=0;i<numCoeffs;++i) {
+ domain().axpyin(discComponents[i],*(seqPtrVec[i]),*(coeffVec[i]));
+ }
+ for (int i=0;i<numCoeffs;++i) {
+ domain().addin(disc,discComponents[i]);
+ }
+ start1.stop();
+ g_time2 += start1.realtime();
+
+ CTimer start2; start2.start();
+ //Compute tau with Algorith3.2
+ Coefficient tau(field(), _row+_col, _row+_col);
+ Sub primaryDisc(disc,0,0,_row,_col);
+ if (_MD->isZero(primaryDisc)) {
+ --_etc;
+ } else {
+ _etc=_ett;
+ }
+ Algorithm3dot2(tau, disc, _deg, _mu, _sigma, _beta);
+ start2.stop();
+ g_time3 += start2.realtime();
+ CTimer start3; start3.start();
+ //Multiply tau into each matrix in the generator
+#ifdef __LINBOX_USE_OPENMP
+#pragma omp parallel for
+#endif
+ for (int i=0;i<numCoeffs;++i) {
+ domain().mulin(*(coeffVec[i]),tau);
+ }
+ start3.stop();
+ g_time4 += start3.realtime();
+ //Increment the auxiliary degrees and beta
+ for(size_t j = _col; j <_row+_col; ++j)
+ _deg[j]++;
+ ++_beta;
+ //Add a zero matrix to the end of the generator if needed.
+ int tmax = (int)_deg[0];
+ for(size_t j = 1; j<_row+_col; ++j)
+ if(tmax < (int)_deg[j])
+ tmax = (int)_deg[j];
+ if(tmax+1 > (int)_gensize){
+ _gen.push_back(Coefficient(field(),_col,_row+_col));
+ ++_gensize;
+ }
+ //Mimic multiplication be z in the auxiliary columns
+ typename std::list<Coefficient>::reverse_iterator g1,g2;
+ g1 = _gen.rbegin();
+ g2 = _gen.rbegin();
+ ++g1;
+ while(g1!=_gen.rend()){
+ Sub g1aux(*g1,0,_col,_col,_row);
+ Sub g2aux(*g2,0,_col,_col,_row);
+ domain().copy(g2aux,g1aux);
+ ++g1;
+ ++g2;
+ }
+ genit = _gen.begin();
+ Coefficient z1(field(),_col,_row);
+ Sub genitaux(*genit,0,_col,_col,_row);
+ domain().copy(genitaux,z1);
+ //Increment the t and seqel to the next element
+ ++_t;
+ ++_seqel;
+ //Update the state
+ if(/* _delta < 0 || */_beta < _delta - _sigma + _mu +1){
+ if(_t == _size)
+ _state._state = SequenceExceeded;
+ else{
+ if(_sigma > _delta /* && _delta >= 0*/)
+ _state._state = DeltaExceeded;
+ else
+ _state._state = GeneratorUnconfirmed;
+ }
+ }
+ else{
+ if(_sigma > _delta)
+ _state._state = DeltaExceeded;
+ else
+ _state._state = GeneratorFound;
+ }
+ if (_etc==0) {
+ _state._state=GeneratorFound;
+ }
+
+ return *this;
+ }
+ // Is this working? -AS
+ BM_iterator operator++(int)
+ {
+ //Create a copy of this
+ BM_iterator temp(*this);
+
+ //See if a matrix has been pushed on the sequence
+ //if it has, then recompute the seqel since it may
+ //have become corrupt.
+ //Also reset the size to the correct size of the sequence
+ if(_size < _seq.size()){
+ _seqel = _seq.begin();
+ for(int i = 0; i<_t; ++i)
+ ++_seqel;
+ _size = _seq.size();
+ }
+ //if the iterator points past the seq elements, do nothing
+ if(_t == _size){
+ return *this;
+ }
+ //Initialize the discrepancy
+ Coefficient disc(field(),_row, _row+_col);
+ //Create two iterators, one for seq, and one for gen
+ typename BM_Seq::const_iterator cseqit;
+ typename std::list<Coefficient>::iterator genit;
+ //get an iterator to the seq element to be processed
+ cseqit = _seqel;
+ //Compute the discrepancy
+ for(genit = _gen.begin(); genit!=_gen.end(); ++genit, cseqit--){
+ domain().axpyin(disc,*cseqit,*genit);
+ } // cost: k*n^3 (nxn matrix muladds where k is current generator length)
+ // is a reductive addition over independent muls.
+ //Compute tau with Algorith3.2
+ Coefficient tau(field(), _row+_col, _row+_col);
+ Algorithm3dot2(tau, disc, _deg, _mu, _sigma, _beta);
+ // cost: n^3 for elim on n x about 2n
+ //Multiply tau into each matrix in the generator
+ for(genit = _gen.begin(); genit!=_gen.end(); ++genit){
+ domain().mulin(*genit,tau);
+ } // cost: k*n^3 (nxn matrix muls where k is current generator length)
+ // is k independent muls with a shared mat tau.
+ //Increment the auxiliary degrees and beta
+ for(size_t j = _col; j <_row+_col; ++j)
+ _deg[j]++;
+ ++_beta;
+ //Add a zero matrix to the end of the generator if needed.
+ int tmax = (int)_deg[0];
+ for(size_t j = 1; j<_row+_col; ++j)
+ if(tmax < _deg[j])
+ tmax = (int)_deg[j];
+ if(tmax+1 > _gensize){
+ _gen.push_back(Coefficient(field(),_col,_row+_col));
+ ++_gensize;
+ }
+ //Mimic multiplication by z in the auxiliary columns
+ typename std::list<Coefficient>::reverse_iterator g1,g2;
+ g1 = _gen.rbegin();
+ g2 = _gen.rbegin();
+ ++g1;
+ while(g1!=_gen.rend()){
+ Sub g1aux(*g1,0,_col,_col,_row);
+ Sub g2aux(*g2,0,_col,_col,_row);
+ domain().copy(g2aux,g1aux);
+ ++g1;
+ ++g2;
+ }
+ genit = _gen.begin();
+ Coefficient z1(field(),_col,_row);
+ Sub genitaux(*genit,0,_col,_col,_row);
+ domain().copy(genitaux,z1);
+ //Increment the t and seqel to the next element
+ ++_t;
+ ++_seqel;
+ //Update the state
+ if(/* _delta < 0 || */ _beta < _delta - _sigma + _mu +1){
+ if(_t == _size)
+ _state._state = SequenceExceeded;
+ else{
+ if(_sigma > _delta /* && _delta >= 0 */)
+ _state._state = DeltaExceeded;
+ else
+ _state._state = GeneratorUnconfirmed;
+ }
+ }
+ else{
+ if(_sigma > _delta)
+ _state._state = DeltaExceeded;
+ else
+ _state._state = GeneratorFound;
+ }
+
+ return temp;
+ }
+ //return a reference to the current generator, in its algorithmic reversed form
+ value_type& operator*()
+ {
+ return _gen;
+ }
+ //overload the pointer operator
+ value_type* operator->()
+ {
+ return &_gen;
+ }
+ //Return a vector representing the reversal, by nominal degree, of the current generator
+ std::vector<Coefficient> GetGenerator()
+ {
+ std::vector<Coefficient> revgen(_mu+1, Coefficient(field(),_col,_col));
+ for(size_t i = 0; i<_col; ++i){
+ typename std::list<Coefficient>::iterator genit = _gen.begin();
+ for(int j = 0; j < (int)_deg[i]+1; ++j){
+ ColumnCopy(revgen[_deg[i]-j], *genit,i);
+ ++genit;
+ }
+ }
+ return revgen;
+ }
+
+ typename BM_Seq::size_type get_t()
+ {
+ return _t;
+ }
+
+ int get_mu()
+ {
+ return _mu;
+ }
+
+ int get_sigma()
+ {
+ return _sigma;
+ }
+ int get_beta()
+ {
+ return _beta;
+ }
+ int get_delta()
+ {
+ return _delta;
+ }
+ std::vector<size_t> get_deg()
+ {
+ std::vector<size_t> gendegree(&_deg[0], &_deg[_col]);
+ return gendegree;
+ }
+ }; //End of BM_iterator
+
+ //return an initialized BM_iterator
+ typename BM_Seq::BM_iterator BM_begin(int earlyTermThreshold)
+ {
+ return typename BM_Seq::BM_iterator(*this,earlyTermThreshold);
+ }
+ //return an initialized BM_iterator that points to one past the end of the sequence
+ typename BM_Seq::BM_iterator BM_end()
+ {
+ return typename BM_Seq::BM_iterator(*this, -1, _size);
+ }
+ /**/
+ };//End of BM_Seq
+
+ }; //end of class BlockCoppersmithDomain
+
+
+ // construct P s.t. \sum_{i}P[i]A^{i}=0
+ template<class _Domain, class _Sequence>
+ std::vector<size_t> BlockCoppersmithDomain<_Domain,
+ _Sequence>::
+ right_minpoly (std::vector<Coefficient> &P)
+ {
+ //Get the row and column dimensions
+ const size_t r = _container->rowdim();
+ const size_t c = _container->coldim();
+
+ typename Sequence::const_iterator contiter(_container->begin());
+ //Create the BM_Seq, that will use the Coppersmith Block Berlekamp Massey Algorithm to compute the minimal generator.
+ BM_Seq seq(domain(),r,c);
+
+ //Push the first projection onto the BM_Seq
+ seq.push_back(*contiter);
+
+ //Create the BM_Seq iterator whose incrementation performs a step of the generator
+ typename BM_Seq::BM_iterator bmit(seq.BM_begin(EARLY_TERM_THRESHOLD));
+ bmit.setDelta((int)(2*_container->getBB()->rowdim()+1));
+ typename BM_Seq::BM_iterator::TerminationState check = bmit.state();
+ while(!check.IsGeneratorFound() ){
+ ++bmit;
+ check = bmit.state();
+ if(check.IsSequenceExceeded()){
+ CTimer start; start.start();
+ ++contiter;
+ start.stop();
+ g_time1+=start.realtime();
+ seq.push_back(*contiter);
+ }
+ }
+ P = bmit.GetGenerator();
+ std::vector<size_t> deg(bmit.get_deg());
+ commentator().report(Commentator::LEVEL_IMPORTANT,TIMING_MEASURE) <<
+ "Times: " << g_time1 << " " << g_time2 << " " << g_time3 << " " << g_time4<<std::endl;
+ return deg;
+ }
+
+} // end of namespace LinBox
+
+#endif // __LINBOX_coppersmith_block_domain_H
+
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+
diff --git a/linbox/algorithms/block-lanczos.h b/linbox/algorithms/block-lanczos.h
index 1e731e1..9afb84b 100644
--- a/linbox/algorithms/block-lanczos.h
+++ b/linbox/algorithms/block-lanczos.h
@@ -74,10 +74,9 @@ namespace LinBox
* options for the solver
*/
BlockLanczosSolver (const Field &F, const BlockLanczosTraits &traits) :
- _traits (traits), _field (F), _VD (F), _MD (F), _randiter (F), _block (traits.blockingFactor ())
+ _traits (traits), _field (&F), _VD (F), _MD (F), _randiter (F), _block (traits.blockingFactor ())
{
init_temps ();
- _field.init (_one, 1);
}
/** Constructor with a random iterator.
@@ -87,10 +86,9 @@ namespace LinBox
* @param r Random iterator to use for randomization
*/
BlockLanczosSolver (const Field &F, const BlockLanczosTraits &traits, typename Field::RandIter r) :
- _traits (traits), _field (F), _VD (F), _MD (F), _randiter (r), _block (traits.blockingFactor ())
+ _traits (traits), _field (&F), _VD (F), _MD (F), _randiter (r), _block (traits.blockingFactor ())
{
init_temps ();
- _field.init (_one, 1);
}
/** Solve the linear system Ax = b.
@@ -113,6 +111,7 @@ namespace LinBox
template <class Blackbox, class Vector>
Vector &solve (const Blackbox &A, Vector &x, const Vector &b);
+ inline const Field & field() const { return *_field; }
private:
// S_i is represented here as a vector of booleans, where the entry at
@@ -212,7 +211,7 @@ namespace LinBox
// Private variables
const BlockLanczosTraits _traits;
- const Field &_field;
+ const Field *_field;
VectorDomain<Field> _VD;
MatrixDomain<Field> _MD;
typename Field::RandIter _randiter;
@@ -230,7 +229,6 @@ namespace LinBox
mutable typename Vector<Field>::Dense _tmp; // N
- typename Field::Element _one;
std::vector<size_t> _indices; // N
diff --git a/linbox/algorithms/block-lanczos.inl b/linbox/algorithms/block-lanczos.inl
index 23e3ae9..cb91cfd 100644
--- a/linbox/algorithms/block-lanczos.inl
+++ b/linbox/algorithms/block-lanczos.inl
@@ -38,7 +38,7 @@
#include "linbox/blackbox/diagonal.h"
#include "linbox/blackbox/compose.h"
#include "linbox/blackbox/transpose.h"
-#include "linbox/randiter/nonzero.h"
+#include <givaro/givranditer.h>
#include "linbox/util/commentator.h"
#include "linbox/util/timer.h"
@@ -143,8 +143,8 @@ namespace LinBox
_matV[2].resize (A.coldim (), _block);
_AV.resize (A.coldim (), _block);
- NonzeroRandIter<Field> real_ri (_field, _randiter);
- RandomDenseStream<Field, Vector, NonzeroRandIter<Field> > stream (_field, real_ri, A.coldim ());
+ Givaro::GeneralRingNonZeroRandIter<Field> real_ri (_randiter);
+ RandomDenseStream<Field, Vector, Givaro::GeneralRingNonZeroRandIter<Field> > stream (field(), real_ri, A.coldim ());
for (unsigned int i = 0; !success && i < _traits.maxTries (); ++i) {
std::ostream &report = commentator().report (Commentator::LEVEL_UNIMPORTANT, INTERNAL_DESCRIPTION);
@@ -174,7 +174,7 @@ namespace LinBox
VectorWrapper::ensureDim (y, A.coldim ());
stream >> d1;
- Diagonal<Field> D (_field, d1);
+ Diagonal<Field> D (field(), d1);
Compose<Blackbox, Diagonal<Field> > B (&A, &D);
report << "Random D: ";
@@ -199,7 +199,7 @@ namespace LinBox
typedef Compose<PC2, CO1> CO2;
stream >> d1;
- PC1 D (_field, d1);
+ PC1 D (field(), d1);
PC2 AT (&A);
CO1 B1 (&D, &A);
CO2 B (&AT, &B1);
@@ -232,8 +232,8 @@ namespace LinBox
typedef Compose<PC1, CO3> CO4;
stream >> d1 >> d2;
- PC1 D1 (_field, d1);
- PC1 D2 (_field, d2);
+ PC1 D1 (field(), d1);
+ PC1 D2 (field(), d2);
PC2 AT (&A);
CO1 B1 (&A, &D1);
CO2 B2 (&D2, &B1);
@@ -392,7 +392,7 @@ namespace LinBox
// i is the index for temporaries where we need to go back to i - 1
// j is the index for temporaries where we need to go back to j - 2
- int i = 0, j = 2, next_j, prev_j = 1, iter = 2;
+ int i = 0, j = 2, prev_j = 1, iter = 2;
typename Matrix::ColIterator k;
TIMER_DECLARE(AV);
@@ -401,7 +401,7 @@ namespace LinBox
TIMER_DECLARE(orthogonalization)
// Get a random fat vector _matV[0]
- RandomDenseStream<Field, typename Matrix::Col> stream (_field, _randiter, A.coldim ());
+ RandomDenseStream<Field, typename Matrix::Col> stream (field(), _randiter, A.coldim ());
for (k = _matV[0].colBegin (); k != _matV[0].colEnd (); ++k)
stream >> *k;
@@ -537,7 +537,7 @@ namespace LinBox
// Now we're ready to begin the real iteration
while (!_MD.isZero (_matV[j])) {
- next_j = j + 1;
+ int next_j = j + 1;
if (next_j > 2) next_j = 0;
TIMER_START(AV);
@@ -715,7 +715,7 @@ namespace LinBox
S[_indices[row]] = true; // Use column j of V_i in W_i
// Give the (j, j) entry unity
- _field.inv (Mjj_inv, _matM.getEntry (_indices[row], _indices[row]));
+ field().inv (Mjj_inv, _matM.getEntry (_indices[row], _indices[row]));
_VD.mulin (*(_matM.rowBegin () + _indices[row]), Mjj_inv);
// Zero the rest of the column j
@@ -737,10 +737,10 @@ namespace LinBox
const typename Field::Element &Mjj = _matM.refEntry (_indices[row], _indices[row] + _block);
- linbox_check (!_field.isZero (Mjj));
+ linbox_check (!field().isZero (Mjj));
// Zero the rest of the column j + N
- eliminate_col (_matM, row, _block, _indices, _field.inv (Mjj_inv, Mjj));
+ eliminate_col (_matM, row, _block, _indices, field().inv (Mjj_inv, Mjj));
// Zero row j
_VD.subin (*(_matM.rowBegin () + _indices[row]), *(_matM.rowBegin () + _indices[row]));
@@ -844,7 +844,7 @@ namespace LinBox
if (*l)
_VD.dot (*k, *i, *j);
else
- _field.subin (*k, *k);
+ field().subin (*k, *k);
}
_VD.copy (*i, _tmp);
@@ -909,7 +909,7 @@ namespace LinBox
size_t idx = 0;
for (i = A.rowBegin (); i != A.rowEnd (); ++i, ++idx)
- _field.addin ((*i)[idx], _one);
+ field().addin ((*i)[idx], field().one);
return A;
}
@@ -969,7 +969,7 @@ namespace LinBox
for (i = A.rowBegin (), i_idx = 0; i != A.rowEnd (); ++i, ++i_idx) {
_VD.subin (*i, *i);
- _field.assign ((*i)[i_idx], _one);
+ field().assign ((*i)[i_idx], field().one);
}
return A;
@@ -997,7 +997,7 @@ namespace LinBox
row_vec = *(_matM.rowBegin () + indices[row]);
for (idx = row; idx < A.rowdim (); ++idx) {
- if (!_field.isZero (A.getEntry (indices[idx], indices[row] + col_offset))) {
+ if (!field().isZero (A.getEntry (indices[idx], indices[row] + col_offset))) {
if (idx != row) {
typename Matrix::Row row1 = *(A.rowBegin () + indices[idx]);
std::swap_ranges (row_vec.begin (), row_vec.end (), row1.begin ());
@@ -1029,15 +1029,15 @@ namespace LinBox
for (row = 0; row < pivot; ++row) {
const typename Field::Element &Aij = A.getEntry (indices[row], indices[pivot] + col_offset);
- if (!_field.isZero (Aij))
- _VD.axpyin (*(A.rowBegin () + indices[row]), _field.neg (p, Aij), pivot_row);
+ if (!field().isZero (Aij))
+ _VD.axpyin (*(A.rowBegin () + indices[row]), field().neg (p, Aij), pivot_row);
}
for (++row; row < A.rowdim (); ++row) {
const typename Field::Element &Aij = A.getEntry (indices[row], indices[pivot] + col_offset);
- if (!_field.isZero (Aij))
- _VD.axpyin (*(A.rowBegin () + indices[row]), _field.neg (p, Aij), pivot_row);
+ if (!field().isZero (Aij))
+ _VD.axpyin (*(A.rowBegin () + indices[row]), field().neg (p, Aij), pivot_row);
}
}
@@ -1065,21 +1065,19 @@ namespace LinBox
{
linbox_check (M.rowdim () == M.coldim ());
- typename Field::Element neg_one;
- _field.init (neg_one, -1);
size_t i, j;
for (i = 0; i < M.rowdim (); ++i) {
for (j = 0; j < M.coldim (); ++j) {
- if (i != j && !_field.isZero (M.getEntry (i, j))) {
- if (!_field.isZero (M.getEntry (i, i))) {
+ if (i != j && !field().isZero (M.getEntry (i, j))) {
+ if (!field().isZero (M.getEntry (i, i))) {
typename Matrix::ConstRowIterator row = M.rowBegin () + j;
if (!_VD.isZero (*row))
return false;
}
- else if (!_field.isZero (M.getEntry (j, j))) {
+ else if (!field().isZero (M.getEntry (j, j))) {
typename Matrix::ConstColIterator col = M.colBegin () + i;
if (!_VD.isZero (*col))
return false;
@@ -1087,7 +1085,7 @@ namespace LinBox
else
return false;
}
- else if (!_field.isZero (M.getEntry (i, j)) && !_field.areEqual (M.getEntry (i, j), neg_one))
+ else if (!field().isZero (M.getEntry (i, j)) && !field().areEqual (M.getEntry (i, j), field().mOne))
return false;
}
}
@@ -1119,7 +1117,7 @@ namespace LinBox
bool ret = true;
- RandomDenseStream<Field, typename Matrix::Row> stream (_field, _randiter, n);
+ RandomDenseStream<Field, typename Matrix::Row> stream (field(), _randiter, n);
typename Matrix::RowIterator i = A.rowBegin ();
typename Matrix::ColIterator j = AT.colBegin ();
@@ -1187,7 +1185,7 @@ namespace LinBox
bool ret = true;
- RandomDenseStream<Field, typename Matrix::Row> stream (_field, _randiter, n);
+ RandomDenseStream<Field, typename Matrix::Row> stream (field(), _randiter, n);
typename Matrix::RowIterator i = A.rowBegin ();
typename Matrix::ColIterator j = AT.colBegin ();
@@ -1289,7 +1287,7 @@ namespace LinBox
bool ret = true;
- RandomDenseStream<Field, typename Matrix::Row> stream (_field, _randiter, n);
+ RandomDenseStream<Field, typename Matrix::Row> stream (field(), _randiter, n);
typename Matrix::RowIterator i = A.rowBegin ();
for (; i != A.rowEnd (); ++i)
@@ -1299,10 +1297,10 @@ namespace LinBox
report << "Computed A:" << std::endl;
_MD.write (report, A);
- RandomDenseStream<Field, Matrix> stream1 (_field, _randiter, m);
+ RandomDenseStream<Field, Matrix> stream1 (field(), _randiter, m);
stream1 >> x;
- RandomDenseStream<Field, Matrix> stream2 (_field, _randiter, n);
+ RandomDenseStream<Field, Matrix> stream2 (field(), _randiter, n);
stream1 >> y;
report << "Computed x: ";
@@ -1324,14 +1322,14 @@ namespace LinBox
_VD.dot (ATxy, ATx, y);
report << "Computed ATxy: ";
- _field.write (report, ATxy) << std::endl;
+ field().write (report, ATxy) << std::endl;
_VD.dot (xAy, x, Ay);
report << "Computed xAy: ";
- _field.write (report, xAy) << std::endl;
+ field().write (report, xAy) << std::endl;
- if (!_field.areEqual (ATxy, xAy)) {
+ if (!field().areEqual (ATxy, xAy)) {
commentator().report (Commentator::LEVEL_IMPORTANT, INTERNAL_ERROR)
<< "ERROR: <A^T x, y> != <x, Ay>" << std::endl;
ret = false;
diff --git a/linbox/algorithms/block-massey-domain.h b/linbox/algorithms/block-massey-domain.h
index 5987e07..2f0e83b 100644
--- a/linbox/algorithms/block-massey-domain.h
+++ b/linbox/algorithms/block-massey-domain.h
@@ -30,36 +30,61 @@
#include <vector>
#include <iostream>
+#include <algorithm>
#include <iomanip>
-
#include "linbox/util/commentator.h"
#include "linbox/util/timer.h"
-#include "linbox/field/unparametric.h"
+#include <givaro/zring.h>
#include "linbox/matrix/matrix-domain.h"
-#include "linbox/matrix/blas-matrix.h"
+#include "linbox/matrix/dense-matrix.h"
#include "linbox/matrix/factorized-matrix.h"
-#include "linbox/algorithms/blas-domain.h"
+#include "linbox/matrix/matrix-domain.h"
#include "linbox/algorithms/sigma-basis.h"
#include "linbox/util/timer.h"
-//#define __CHECK_RESULT
-//#define __DEBUG_MAPLE
-//#define __CHECK_LOOP
-//#define __PRINT_MINPOLY
-//#define __CHECK_DISCREPANCY
-//#define __CHECK_TRANSFORMATION
-//#define __CHECK_SIGMA_RESULT
-//#define __PRINT_SEQUENCE
-#define _BM_TIMING
+// #define __CHECK_RESULT
+// #define __DEBUG_MAPLE
+// #define __CHECK_LOOP
+// #define __PRINT_MINPOLY
+// #define __CHECK_DISCREPANCY
+// #define __CHECK_TRANSFORMATION
+// #define __CHECK_SIGMA_RESULT
+// #define __PRINT_SEQUENCE
+// #define __PRINT_SIGMABASE
+
+//#define _BM_TIMING
+#define DEFAULT_BLOCK_EARLY_TERM_THRESHOLD 10
namespace LinBox
{
+ template<class Field, class Coefficient>
+ void write_maple(const Field& F, const std::vector<Coefficient> & P)
+ {
+ std::cout<<"Matrix([";
+ for (size_t i=0;i< P[0].rowdim();++i){
+ std::cout<<"[";
+ for (size_t j=0;j< P[0].coldim();++j){
+ F.write(std::cout,P[0].getEntry(i,j));
+ for (size_t k=1;k<P.size();++k){
+ std::cout<<"+ x^"<<k<<"*";
+ F.write(std::cout,P[k].getEntry(i,j));
+ }
+ if (j != P[0].coldim()-1)
+ std::cout<<",";
+ }
+ if (i != P[0].rowdim()-1)
+ std::cout<<"],";
+ else
+ std::cout<<"]";
+ }
+ std::cout<<"]);\n";
+ }
+
-#define DEFAULT_EARLY_TERM_THRESHOLD 20
/** Compute the linear generator of a sequence of matrices.
@@ -67,7 +92,7 @@ namespace LinBox
* This class encapsulates the functionality required for computing
* the block minimal polynomial of a matrix.
* @bib
- * Giorgi, Jeannerod Villard algorithm from ISSAC'03
+ * Giorgi, Jeannerod, Villard algorithm from ISSAC'03
*/
template<class _Field, class _Sequence>
class BlockMasseyDomain {
@@ -76,12 +101,13 @@ namespace LinBox
typedef _Field Field;
typedef typename Field::Element Element;
typedef _Sequence Sequence;
- typedef BlasMatrix<Field> Coefficient;
+ typedef BlasMatrix<Field> Coefficient;
+ typedef BlasSubmatrix<Coefficient> CoeffView;
private:
Sequence *_container;
- Field _field;
+ const Field *_field;
BlasMatrixDomain<Field> _BMD;
MatrixDomain<Field> _MD;
unsigned long EARLY_TERM_THRESHOLD;
@@ -164,17 +190,18 @@ namespace LinBox
#endif
- BlockMasseyDomain (const BlockMasseyDomain<Field, Sequence> &Mat, unsigned long ett_default = DEFAULT_EARLY_TERM_THRESHOLD) :
- _container(Mat._container), _field(Mat._field), _BMD(Mat._field),
- _MD(Mat._field), EARLY_TERM_THRESHOLD (ett_default)
+ BlockMasseyDomain (const BlockMasseyDomain<Field, Sequence> &Mat, unsigned long ett_default = DEFAULT_BLOCK_EARLY_TERM_THRESHOLD) :
+ _container(Mat._container), _field(Mat._field), _BMD(Mat.field()),
+ _MD(Mat.field()), EARLY_TERM_THRESHOLD (ett_default)
{
#ifdef _BM_TIMING
clearTimer();
#endif
+
}
- BlockMasseyDomain (Sequence *D, unsigned long ett_default = DEFAULT_EARLY_TERM_THRESHOLD) :
- _container(D), _field(D->getField ()), _BMD(D->getField ()), _MD(D->getField ()), EARLY_TERM_THRESHOLD (ett_default)
+ BlockMasseyDomain (Sequence *D, unsigned long ett_default = DEFAULT_BLOCK_EARLY_TERM_THRESHOLD) :
+ _container(D), _field(&(D->field ())), _BMD(D->field ()), _MD(D->field ()), EARLY_TERM_THRESHOLD (ett_default)
{
#ifdef _BM_TIMING
clearTimer();
@@ -183,8 +210,8 @@ namespace LinBox
// field of the domain
- const Field &getField () const
- { return _field; }
+ const Field &field () const
+ { return *_field; }
// sequence of the domain
Sequence *getSequence () const
@@ -220,37 +247,12 @@ namespace LinBox
private:
- template<class Field>
- void write_maple(const Field& F, const std::vector<Coefficient> & P)
- {
- std::cout<<"Matrix([";
- for (size_t i=0;i< P[0].rowdim();++i){
- std::cout<<"[";
- for (size_t j=0;j< P[0].coldim();++j){
- F.write(std::cout,P[0].getEntry(i,j));
- for (size_t k=1;k<P.size();++k){
- std::cout<<"+ x^"<<k<<"*";
- F.write(std::cout,P[k].getEntry(i,j));
- }
- if (j != P[0].coldim()-1)
- std::cout<<",";
- }
- if (i != P[0].rowdim()-1)
- std::cout<<"],";
- else
- std::cout<<"]";
- }
- std::cout<<"]);\n";
- }
std::vector<size_t> masseyblock_left (std::vector<Coefficient> &P)
{
+ std::ostream& report = commentator().report (Commentator::LEVEL_IMPORTANT, INTERNAL_DESCRIPTION);
-#ifdef _BM_TIMING
- tSetup.clear();
- tSetup.start();
-#endif
const size_t length = _container->size ();
const size_t m = _container->rowdim();
const size_t n = _container->coldim();
@@ -263,23 +265,21 @@ namespace LinBox
typename Sequence::const_iterator _iter (_container->begin ());
// Reservation of memory for the entire sequence
- std::vector<Coefficient> S (length,Coefficient(m,n));
- //std::vector<Coefficient> S (length); //,Coefficient(m,n));
-
- Coefficient Unit(m+n,m);
- const Coefficient Zero(m+n,m);
- Element one,zero,mOne;
- _field.init(one,1L);
- _field.init(zero,0L);
- _field.init(mOne,-1L);
+ const Coefficient Zeromn(field(),m,n);
+ std::vector<Coefficient> S (length,Zeromn);
+
+
+ Coefficient Unit(field(),m+n,m);
+ const Coefficient Zero(field(),m+n,m);
+
for (size_t i=0;i<m;i++)
- Unit.setEntry(i,i,one);
+ Unit.setEntry(i,i,field().one);
size_t min_mn=(m <n)? m :n;
// initialization of discrepancy
- Coefficient Discrepancy(m+n,n);
+ Coefficient Discrepancy(field(),m+n,n);
for (size_t i=0;i<n;i++)
- Discrepancy.setEntry(i+m,i,one);
+ Discrepancy.setEntry(i+m,i,field().one);
// initialization of sigma base
std::vector<Coefficient> SigmaBase(1, Unit);
@@ -293,22 +293,13 @@ namespace LinBox
std::vector<long> degree(m+n,0);
for (size_t i=0;i<m;++i)
degree[i]=0;
-#ifdef _BM_TIMING
- tSetup.stop();
- ttSetup += tSetup;
- tCheckSequence.clear();
- tCheckSequence.start();
-#endif
+
// The first sequence element should be of full rank
// this is due to the strategy which say that we can compute
// only the first column of the approximation of [ S(x) Id]^T
// since the other colums have always lower degree.
if (_BMD.rank(*_iter)< min_mn)
throw PreconditionFailed (__func__, __LINE__, "Bad random Blocks, abort\n");
-#ifdef _BM_TIMING
- tCheckSequence.stop();
- ttCheckSequence += tCheckSequence;
-#endif
unsigned long early_stop=0;
long NN;
@@ -316,52 +307,44 @@ namespace LinBox
// Get the next coefficient in the sequence
S[NN]=*_iter;
-#ifdef _BM_TIMING
- if (NN != 0){
- tGetCoeff.stop();
- ttGetCoeff += tGetCoeff;
- }
- tDiscrepancy.clear();
- tDiscrepancy.start();
-#endif
/*
* Compute the new discrepancy (just updating the first m rows)
*/
// view of m first rows of SigmaBasis[0]
- Coefficient Sigma(SigmaBase[0],0,0,m,m);
+ CoeffView Sigma(SigmaBase[0],0,0,m,m);
// view of m first rows of Discrepancy
- Coefficient Discr(Discrepancy,0,0,m,n);
+ CoeffView Discr(Discrepancy,0,0,m,n);
_BMD.mul(Discr,Sigma,S[NN]);
+
for (size_t i=1;i<SigmaBase.size();i++){
- Coefficient Sigmaview(SigmaBase[i],0,0,m,m);
+ CoeffView Sigmaview(SigmaBase[i],0,0,m,m);
_BMD.axpyin(Discr,Sigmaview,S[NN-i]);
}
-#ifdef _BM_TIMING
- tDiscrepancy.stop();
- ttDiscrepancy += tDiscrepancy;
-#endif
-
- typename Coefficient::Iterator _iter_Discr = Discr.Begin();
-
- while ((_field.isZero(*_iter_Discr) && _iter_Discr != Discr.End()))
+ typename CoeffView::Iterator _iter_Discr = Discr.Begin();
+ while (_iter_Discr != Discr.End() && (field().isZero(*_iter_Discr)))
++_iter_Discr;
+ if (_iter_Discr!=Discr.End())
+ early_stop=0;
+ else
+ early_stop++;
// maybe there is something to do here
// increase the last n rows of orders
// multiply by X the last n rows of SigmaBase
- if (_iter_Discr != Discr.End())
- early_stop=0;
- else {
- early_stop++;
- }
-#ifdef _BM_TIMING
- tGetPermutation.clear();
- tGetPermutation.start();
-#endif
+ //if (_iter_Discr != Discr.End())
+
+ /*
+ Coefficient ZeroD(field(),m+n,n);
+ if (_MD.areEqual(Discrepancy,ZeroD))
+ early_stop=0;
+ else
+ early_stop++;
+ */
+
// Computation of the permutation BPerm1 such that BPerm1.order is in increasing order.
// order=Perm.order
//! @todo factorize this in \c BlasPermutation.
@@ -380,56 +363,30 @@ namespace LinBox
}
BlasPermutation<size_t> BPerm1(Perm1);
-#ifdef _BM_TIMING
- tGetPermutation.stop();
- ttGetPermutation += tGetPermutation;
- tApplyPerm.clear();
- tApplyPerm.start();
-
-#endif
// Discrepancy= BPerm1.Discrepancy
_BMD.mulin_right(BPerm1,Discrepancy);
-#ifdef _BM_TIMING
- tApplyPerm.stop();
- ttApplyPerm += tApplyPerm;
- tLQUP.clear();
- tLQUP.start();
-#endif
-
#ifdef __CHECK_DISCREPANCY
- std::ostream& report = commentator().report (Commentator::LEVEL_IMPORTANT, INTERNAL_DESCRIPTION);
+
report<<"Discrepancy"<<NN<<":=Matrix(";
- Discrepancy.write(report,_field,true)<<");"<<std::endl;
+ Discrepancy.write(report)<<");"<<std::endl;
#endif
-
-
// Computation of the LQUP decomposition of the discrepancy
- Coefficient CopyDiscr;
- CopyDiscr=Discrepancy;
+ Coefficient CopyDiscr(Discrepancy);
BlasPermutation<size_t> Pp (CopyDiscr.coldim());
BlasPermutation<size_t> Qt (CopyDiscr.rowdim());
- LQUPMatrix<Field> LQUP(_field, CopyDiscr,Pp,Qt);
-
-#ifdef _BM_TIMING
- tLQUP.stop();
- ttLQUP += tLQUP;
+ LQUPMatrix<Field> LQUP(CopyDiscr,Pp,Qt);
-#endif
// Get the matrix L of LQUP decomposition
- TriangularBlasMatrix<Field> L(_field,m+n,m+n, LinBoxTag::Lower, LinBoxTag::Unit );
+ TriangularBlasMatrix<Field> L(field(),m+n,m+n, Tag::Shape::Lower, Tag::Diag::Unit );
LQUP.getL(L);
// Get the tranposed permutation of Q from LQUP
// BlasPermutation<size_t> Qt=LQUP.getQ();
-#ifdef _BM_TIMING
- tGetPermutation.clear();
- tGetPermutation.start();
-#endif
// Computation of permutations BPerm2 such that the last n rows of BPerm2.Qt.Discrepancy are non zero.
std::vector<size_t> Perm2(m+n);
for (size_t i=0;i<n;++i)
@@ -438,65 +395,27 @@ namespace LinBox
Perm2[i]=i;
BlasPermutation<size_t> BPerm2(Perm2);
-#ifdef _BM_TIMING
- tGetPermutation.stop();
- ttGetPermutation += tGetPermutation;
- tInverseL.clear();
- tInverseL.start();
-#endif
// compute the inverse of L
- TriangularBlasMatrix<Field> invL (_field,m+n,m+n, LinBoxTag::Lower,LinBoxTag::Unit);
- FFPACK::trinv_left((typename Field::Father_t)_field,m+n,L.getPointer(),L.getStride(),invL.getWritePointer(),invL.getStride());
-
-#ifdef _BM_TIMING
- tInverseL.stop();
- ttInverseL += tInverseL;
-#endif
+ TriangularBlasMatrix<Field> invL (field(),m+n,m+n, Tag::Shape::Lower,Tag::Diag::Unit);
+ FFPACK::trinv_left(field(),m+n,L.getPointer(),L.getStride(),invL.getWritePointer(),invL.getStride());
#ifdef __CHECK_TRANSFORMATION
- report<<"invL"<<N<<":=Matrix(";
- invL.write(report,_field,true)<<");"<<std::endl;
+ report<<"invL"<<NN<<":=Matrix(";
+ invL.write(report)<<");"<<std::endl;
#endif
// SigmaBase = BPerm2.Qt. L^(-1) . BPerm1 . SigmaBase
for (size_t i=0;i<SigmaBase.size();i++) {
-#ifdef _BM_TIMING
- tApplyPerm.clear();
- tApplyPerm.start();
-#endif
_BMD.mulin_right(BPerm1,SigmaBase[i]);
-
-#ifdef _BM_TIMING
- tApplyPerm.stop();
- ttApplyPerm +=tApplyPerm;
-
- tUpdateSigma.clear();
- tUpdateSigma.start();
-#endif
_BMD.mulin_right(invL,SigmaBase[i]);
-#ifdef _BM_TIMING
- tUpdateSigma.stop();
- ttUpdateSigma += tUpdateSigma;
- tApplyPerm.clear();
- tApplyPerm.start();
-#endif
_BMD.mulin_right(Qt,SigmaBase[i]);
_BMD.mulin_right(BPerm2,SigmaBase[i]);
-#ifdef _BM_TIMING
- tApplyPerm.stop();
- ttApplyPerm +=tApplyPerm;
-#endif
}
-
-#ifdef _BM_TIMING
- tApplyPerm.clear();
- tApplyPerm.start();
-#endif
-
// Apply BPerm2 and Qt to the vector of order and increase by 1 the last n rows
- UnparametricField<long> UF(0);
- BlasMatrixDomain<UnparametricField<long> > BMDUF(UF);
+ Givaro::ZRing<long> UF(0);
+ // What?
+ BlasMatrixDomain<Givaro::ZRing<long> > BMDUF(UF);
BMDUF.mulin_right(Qt,order);
BMDUF.mulin_right(BPerm2,order);
BMDUF.mulin_right(BPerm1,degree);
@@ -507,12 +426,6 @@ namespace LinBox
degree[i]++;
}
-#ifdef _BM_TIMING
- tApplyPerm.stop();
- ttApplyPerm += tApplyPerm;
- tShiftSigma.clear();
- tShiftSigma.start();
-#endif
// Multiplying the last n row of SigmaBase by x.
long max_degree=degree[m];
for (size_t i=m+1;i<m+n;++i) {
@@ -530,34 +443,17 @@ namespace LinBox
for (int i= (int)size-2;i>=0;i--)
for (size_t j=0;j<n;j++)
for (size_t k=0;k<n;++k){
-
- // report << " i+1 item: ";
- // report << SigmaBase[i+1].getEntry(m+j,k) ;
- // report << " i item: ";
- // report << SigmaBase[i].getEntry(m+j,k)
- // << std::endl;
- // typename Field::Element& x = SigmaBase[i+1].refEntry(m+j,k);
- // report << &x << " " << x << " &x and x" << std::endl;
- // x = SigmaBase[i].getEntry(m+j,k);
- // report << x << " new x" << std::endl;
- _field.assign(SigmaBase[i+1].refEntry(m+j,k), SigmaBase[i].getEntry(m+j,k));
+ field().assign(SigmaBase[i+1].refEntry(m+j,k), SigmaBase[i].getEntry(m+j,k));
}
for (size_t j=0;j<n;j++)
for (size_t k=0;k<n;++k)
- _field.assign(SigmaBase[0].refEntry(m+j,k),zero);
-
-
-#ifdef _BM_TIMING
- tShiftSigma.stop();
- ttShiftSigma += tShiftSigma;
-#endif
-
+ field().assign(SigmaBase[0].refEntry(m+j,k),field().zero);
#ifdef __DEBUG_MAPLE
report<<"\n\nSigmaBase"<<NN<<":= ";
- write_maple(_field,SigmaBase);
+ write_maple(field(),SigmaBase);
report<<"order"<<NN<<":=<";
for (size_t i=0;i<m+n;++i){
@@ -580,46 +476,29 @@ namespace LinBox
report<<"Sequence size: "<<NN+1<<std::endl;
size_t min_t = (SigmaBase.size() > NN+1)? NN+1: SigmaBase.size();
for (size_t i=min_t - 1 ; i<NN+1; ++i){
- Coefficient Disc(m+n,n);
- _BMD.mul(Disc,SigmaBase[0],S[i]);
- for (size_t j=1;j<min_t -1;++j)
+ Coefficient Disc(field(),m+n,n);
+ for (size_t j=0;j<min_t ;++j)
_BMD.axpyin(Disc,SigmaBase[j],S[i-j]);
- Disc.write(report,_field)<<std::endl;
+ Disc.write(report)<<std::endl;
}
#endif
-
-#ifdef _BM_TIMING
- tNewDiscrepancy.clear();
- tNewDiscrepancy.start();
-#endif
// Discrepancy= BPerm2.U.Pp from LQUP
- Coefficient U(m+n,n);
- TriangularBlasMatrix<Field> trU(U,LinBoxTag::Upper,LinBoxTag::NonUnit);
+ Coefficient U(field(),m+n,n);
+ TriangularBlasMatrix<Field> trU(U,Tag::Shape::Upper,Tag::Diag::NonUnit);
LQUP.getU(trU);
//Discrepancy=U;
// BlasPermutation<size_t> Pp= LQUP.getP();
_BMD.mul(Discrepancy,trU, Pp);
_BMD.mulin_right(BPerm2,Discrepancy);
-
-#ifdef _BM_TIMING
- tNewDiscrepancy.stop();
- ttNewDiscrepancy+=tNewDiscrepancy;
-
- // timer in the loop
- tGetCoeff.clear();
- tGetCoeff.start();
-#endif
-
}
- std::ostream& report = commentator().report (Commentator::LEVEL_IMPORTANT, INTERNAL_DESCRIPTION);
- if ( early_stop == EARLY_TERM_THRESHOLD)
+ if ( early_stop == EARLY_TERM_THRESHOLD)
report<<"Early termination is used: stop at "<<NN<<" from "<<length<<" iterations\n\n";
#ifdef __PRINT_SEQUENCE
report<<"\n\nSequence:= ";
- write_maple(_field,S);
+ write_maple(field(),S);
#endif
@@ -627,54 +506,35 @@ namespace LinBox
#ifdef __CHECK_SIGMA_RESULT
report<<"Check SigmaBase application\n";
for (size_t i=SigmaBase.size()-1 ;i< length ;++i){
- Coefficient res(m+n,n);
+ Coefficient res(field(),m+n,n);
for (size_t k=0;k<SigmaBase.size();++k)
_BMD.axpyin(res,SigmaBase[k],S[i-k]);
- res.write(report,_field)<<std::endl;
+ res.write(report)<<std::endl;
}
#endif
-#ifdef _BM_TIMING
- tGetMinPoly.clear();
- tGetMinPoly.start();
-#endif
// Get the reverse matrix polynomial of the first m rows of SigmaBase according to degree.
degree=order;
- long max=degree[0];
- for (size_t i=1;i<m;i++) {
- if (degree[i]>max)
- max=degree[i];
- }
- //P = std::vector<Coefficient> (max+1);
- P.clear();
- Coefficient tmp(m,m);
- P.resize(max+1, tmp);
- //for (long i=0;i< max+1;++i)
- // P[i]=tmp;
+ long max= *std::max_element(degree.begin(),degree.end());
+ Coefficient tmp(field(),m,m);
+ P = std::vector<Coefficient> (max+1,tmp);
for (size_t i=0;i<m;i++)
for (long j=0;j<=degree[i];j++)
for (size_t k=0;k<m;k++)
- _field.assign(P[degree[i]-j].refEntry(i,k), SigmaBase[j].getEntry(i,k));
-#ifdef _BM_TIMING
- tGetMinPoly.stop();
- ttGetMinPoly +=tGetMinPoly;
-#endif
-
-
+ field().assign(P[degree[i]-j].refEntry(i,k), SigmaBase[j].getEntry(i,k));
#ifdef __CHECK_RESULT
report<<"Check minimal polynomial application\n";
bool valid=true;
for (size_t i=0;i< NN - P.size();++i){
- Coefficient res(m,n);
+ Coefficient res(field(),m,n);
_BMD.mul(res,P[0],S[i]);
for (size_t k=1,j=i+1;k<P.size();++k,++j)
_BMD.axpyin(res,P[k],S[j]);
for (size_t j=0;j<m*n;++j)
- if (!_field.isZero(*(res.getPointer()+j)))
+ if (!field().isZero(*(res.getPointer()+j)))
valid= false;
- //res.write(report,_field)<<std::endl;
}
if (valid)
report<<"minpoly is correct\n";
@@ -684,26 +544,16 @@ namespace LinBox
#ifdef __PRINT_MINPOLY
report<<"MinPoly:=";
- write_maple(_field,P);
-#if 0
+ write_maple(field(),P);
Coefficient Mat(*_container->getBB());
report<<"A:=Matrix(";
- Mat.write(report,_field,true);
-#endif
+ Mat.write(report);
#endif
std::vector<size_t> deg(m);
for (size_t i=0;i<m;++i)
deg[i]=(size_t)degree[i];
- //report << "clearing S " << S.size() << std::endl;
- //S.clear();
- //report << "cleared S " << S.size() << std::endl;
- // report << "clearing SigmaBase " << SigmaBase.size() << std::endl;
- // SigmaBase.resize(SigmaBase.size()-2);
- // report << "clearing last 4 of SigmaBase " << SigmaBase.size() << std::endl;
- // SigmaBase.clear();
- // report << "cleared SigmaBase " << SigmaBase.size() << std::endl;
return deg;
}
@@ -720,26 +570,23 @@ namespace LinBox
n = _container->coldim();
// Set some useful constant
- Element one;
- _field.init(one,1UL);
- const Coefficient Zero(2*m,2*m);
+ const Coefficient Zero(field(),2*m,2*m);
+ const Coefficient Zeromn(field(),2*m,n);
// Make the Power Serie from Sequence (U.A^i.V) and Identity
//_container->recompute(); // make sure sequence is already computed
- std::vector<Coefficient> PowerSerie(length);
+ std::vector<Coefficient> PowerSerie(length,Zeromn);
typename Sequence::const_iterator _iter (_container->begin ());
for (size_t i=0;i< length; ++i, ++_iter){
- Coefficient value(2*m,n);
- PowerSerie[i] = value;
for (size_t j=0;j<m;++j)
for (size_t k=0;k<n;++k)
PowerSerie[i].setEntry(j,k, (*_iter).getEntry(j,k));
}
for (size_t j=0;j<n;++j)
- PowerSerie[0].setEntry(m+j, j, one);
+ PowerSerie[0].setEntry(m+j, j, field().one);
#ifdef __PRINT_SEQUENCE
report<<"PowerSerie:=";
- write_maple(_field,PowerSerie);
+ write_maple(field(),PowerSerie);
#endif
@@ -752,7 +599,7 @@ namespace LinBox
std::vector<Coefficient> SigmaBase(length,Zero);
// Compute Sigma Base up to the order length - 1
- SigmaBasis<Field> SB(_field, PowerSerie);
+ SigmaBasis<Field> SB(field(), PowerSerie);
SB.left_basis(SigmaBase, length-1, defect);
// take the m rows which have lowest defect
@@ -774,9 +621,10 @@ namespace LinBox
for (size_t i=0;i<SigmaBase.size();++i)
_BMD.mulin_right(BPerm,SigmaBase[i]);
-#if 0
+#ifdef __PRINT_SIGMABASE
+ report<<"order is "<<length-1<<endl;
report<<"SigmaBase:=";
- write_maple(_field,SigmaBase);
+ write_maple(field(),SigmaBase);
#endif
// Compute the reverse polynomial of SigmaBase according to defect of each row
size_t max=defect[0];
@@ -784,25 +632,18 @@ namespace LinBox
if (defect[i] > max)
max=defect[i];
- P = std::vector<Coefficient> (max+1);
- Coefficient tmp(m,m);
- for (size_t i=0;i< max+1;++i)
- P[i]=tmp;
+ const Coefficient tmp(field(),m,m);
+ P = std::vector<Coefficient> (max+1,tmp);
for (size_t i=0;i<m;i++)
for (size_t j=0;j<=defect[i];j++)
for (size_t k=0;k<m;k++)
- _field.assign(P[defect[i]-j].refEntry(i,k), SigmaBase[j].getEntry(i,k));
+ field().assign(P[defect[i]-j].refEntry(i,k), SigmaBase[j].getEntry(i,k));
#ifdef __CHECK_RESULT
report<<"Check minimal polynomial application\n";
- //_container->recompute();
- typename Sequence::const_iterator _ptr (_container->begin ());
- for (size_t i=0;i< length; ++i, ++_ptr){
- PowerSerie[i] = *_ptr;
- }
bool valid=true;
for (size_t i=0;i< length - P.size();++i){
- Coefficient res(m,n);
+ Coefficient res(field(),m,n);
Coefficient Power(PowerSerie[i],0,0,m,n);
_BMD.mul(res,P[0],Power);
for (size_t k=1,j=i+1;k<P.size();++k,++j){
@@ -810,10 +651,9 @@ namespace LinBox
_BMD.axpyin(res,P[k],Powerview);
}
for (size_t j=0;j<m*n;++j)
- if (!_field.isZero(*(res.getPointer()+j)))
+ if (!field().isZero(*(res.getPointer()+j)))
valid= false;
- //res.write(report,_field)<<std::endl;
- }
+ }
if (valid)
report<<"minpoly is correct\n";
else
@@ -822,10 +662,7 @@ namespace LinBox
#ifdef __PRINT_MINPOLY
report<<"MinPoly:=";
- write_maple(_field,P);
- //Coefficient Mat(*_container->getBB());
- //report<<"A:=Matrix(";
- //Mat.write(report,_field,true);
+ write_maple(field(),P);
#endif
std::vector<size_t> degree(m);
for (size_t i=0;i<m;++i)
diff --git a/linbox/algorithms/block-wiedemann.h b/linbox/algorithms/block-wiedemann.h
index 8203262..e19a073 100644
--- a/linbox/algorithms/block-wiedemann.h
+++ b/linbox/algorithms/block-wiedemann.h
@@ -27,10 +27,12 @@
#define __LINBOX_block_wiedemann_H
#include <vector>
+#include <iostream>
+
#include "linbox/integer.h"
-#include "linbox/matrix/blas-matrix.h"
-#include "linbox/algorithms/blas-domain.h"
+#include "linbox/matrix/dense-matrix.h"
+#include "linbox/matrix/matrix-domain.h"
#include "linbox/algorithms/blackbox-block-container.h"
#include "linbox/algorithms/block-massey-domain.h"
#include "linbox/vector/vector-domain.h"
@@ -42,29 +44,30 @@
namespace LinBox
{
- template <class _Field>
+ template <class Context_>
class BlockWiedemannSolver{
public:
- typedef _Field Field;
+ typedef typename Context_::Field Field;
typedef typename Field::Element Element;
typedef typename Field::RandIter RandIter;
- typedef std::vector<Element> Vector;
- typedef BlasMatrix<Element> Block;
+ typedef BlasVector<Field> Vector;
+ typedef BlasMatrix<Field> Block;
protected:
- Field _field;
- BlasMatrixDomain<Field> _BMD;
+ Context_ _BMD;
VectorDomain<Field> _VDF;
- RandIter _rand;
+ const RandIter _rand;
public:
- BlockWiedemannSolver (const Field &F) :
- _field(F), _BMD(F), _VDF(F), _rand(F)
+ const Field & field() const { return _BMD.field(); }
+
+ BlockWiedemannSolver (const Context_ &C) :
+ _BMD(C.field()), _VDF(C.field()), _rand(const_cast<Field&>(C.field()))
{}
- BlockWiedemannSolver (const Field &F, const RandIter &rand) :
- _field(F), _BMD(F), _VDF(F), _rand(rand)
+ BlockWiedemannSolver (const Field &F, RandIter &rand) :
+ _BMD(F), _VDF(F), _rand(rand)
{}
template <class Blackbox>
@@ -84,11 +87,11 @@ namespace LinBox
tmp = n;
q = tmp.bitsize()-1;
//q=sqrt(tmp);
- std::cout<<"row block: "<<p<<std::endl;
- std::cout<<"col block: "<<q<<std::endl;
+ //std::cout<<"row block: "<<p<<std::endl;
+ //std::cout<<"col block: "<<q<<std::endl;
- Block U(p,m), UA(p-1,m), V(n,q);
+ Block U(field(),p,m), UA(field(),p-1,m), V(field(),n,q);
for (size_t i=0;i<n;++i)
for (size_t j=0;j<q;++j)
@@ -105,28 +108,33 @@ namespace LinBox
A.applyTranspose( *iter_U , *iter_UA );
for (size_t i=0;i<m;++i)
- U.setEntry(0,i,y[i]);
+ U.setEntry(0,i,y[(size_t)i]);
- BlackboxBlockContainer<Field,Transpose<Blackbox> > Sequence (&A,_field,U,V);
+ BlackboxBlockContainer<Field,Transpose<Blackbox> > Sequence (&A,field(),U,V);
BlockMasseyDomain <Field,BlackboxBlockContainer<Field,Transpose<Blackbox> > > MBD(&Sequence);
std::vector<Block> minpoly;
std::vector<size_t> degree;
MBD.left_minpoly_rec(minpoly,degree);
- MBD.printTimer();
+ //MBD.printTimer();
+
+ //cout<<"minpoly is: \n";
+ //write_maple(field(),minpoly);
+ //cout<<endl;
size_t idx=0;
- if ( _field.isZero(minpoly[0].getEntry(0,0))) {
+ if ( field().isZero(minpoly[0].getEntry(0,0))) {
size_t i=1;
- while ( _field.isZero(minpoly[0].getEntry(i,0)))
+ while (i<p && field().isZero(minpoly[0].getEntry(i,0)))
++i;
- if (i == m)
+ if (i == p)
throw LinboxError(" block minpoly: matrix seems to be singular - abort");
else
idx=i ;
}
+ typename Blackbox::Field F = A.field();
bool classic = true;
if ( classic) {
@@ -136,39 +144,39 @@ namespace LinBox
* the first element in this row is non zero.
* we use y and UA as projection (UA= U.A)
*/
- size_t deg = degree[idx];
- std::vector<Vector> combi(p,Vector(deg+1));
+ size_t deg = degree[(size_t)idx];
+ std::vector<Vector> combi(p,Vector(F,deg+1));
for (size_t i=0;i<p;++i)
for (size_t k=0;k<deg+1;++k)
- combi[i][k]=minpoly[k].getEntry(idx,i);
+ combi[(size_t)i][k]=minpoly[k].getEntry(idx,i);
- Vector lhs(n);
+ Vector lhs(F,n);
A.applyTranspose(lhs,y);
_VDF.mulin(lhs,combi[0][deg]);
Vector lhsbis(lhs);
- for (int i = deg-1 ; i > 0;--i) {
- _VDF.axpy (lhs, combi[0][i], y, lhsbis);
+ for (int i = (int)deg-1 ; i > 0;--i) {
+ _VDF.axpy (lhs, combi[0][(size_t)i], y, lhsbis);
A.applyTranspose (lhsbis, lhs);
}
Vector accu (lhs);
for (size_t k=1;k<p;++k){
- Vector row(m);
+ Vector row(F,m);
for (size_t j=0;j<m;++j)
row[j]=UA.getEntry(k-1,j);
A.applyTranspose(lhs,row);
_VDF.mulin(lhs,combi[k][deg]);
- Vector lhsbis(lhs);
- for (int i = deg-1 ; i >= 0;--i) {
- _VDF.axpy (lhs, combi[k][i], row, lhsbis);
- A.applyTranspose (lhsbis, lhs);
+ Vector lhsbis_loc(lhs);
+ for (int i = (int)deg-1 ; i >= 0;--i) {
+ _VDF.axpy (lhs, combi[k][(size_t)i], row, lhsbis_loc);
+ A.applyTranspose (lhsbis_loc, lhs);
}
_VDF.addin(accu,lhs);
}
Element scaling;
- _field.init(scaling);
- _field.neg(scaling,combi[0][0]);
- _field.invin(scaling);
+ field().init(scaling);
+ field().neg(scaling,combi[0][0]);
+ field().invin(scaling);
_VDF.mul(x,accu,scaling);
}
@@ -178,24 +186,24 @@ namespace LinBox
* given by the product of the idx-th row of MinPoly and UA.
* this should decrease the number of sparse apply but increase memory requirement.
*/
- size_t deg = degree[idx];
- Block idx_poly(deg+1,p-1);
+ size_t deg = degree[(size_t)idx];
+ Block idx_poly(field(),deg+1,p-1);
for (size_t i=0;i<deg+1;++i)
for (size_t j=0;j<p-1;++j)
- idx_poly.setEntry(i,j,minpoly[i].getEntry(idx,j+1));
+ idx_poly.setEntry(i,j,minpoly[(size_t)i].getEntry(idx,j+1));
- Block Combi(deg+1,m);
+ Block Combi(field(),deg+1,m);
_BMD.mul(Combi,idx_poly,UA);
- Vector lhs(n),row(m);
+ Vector lhs(F,n),row(F,m);
for (size_t i=0;i<m;++i)
- row[i]= Combi.getEntry(deg,i);
+ row[(size_t)i]= Combi.getEntry(deg,i);
A.applyTranspose(lhs,row);
Vector lhsbis(lhs);
- for (int i = deg-1 ; i >= 0;--i) {
+ for (int i = (int)deg-1 ; i >= 0;--i) {
for (size_t j=0;j<m;++j)
- row[j]= Combi.getEntry(i,j);
+ row[j]= Combi.getEntry((size_t)i,j);
_VDF.add (lhs,row,lhsbis);
A.applyTranspose (lhsbis, lhs);
}
@@ -206,15 +214,15 @@ namespace LinBox
_VDF.mulin(lhs,minpoly[deg].getEntry(idx,0));
lhsbis=lhs;
for (size_t i = deg-1 ; i > 0;--i) {
- _VDF.axpy (lhs,minpoly[i].getEntry(idx,0) , y, lhsbis);
+ _VDF.axpy (lhs,minpoly[(size_t)i].getEntry(idx,0) , y, lhsbis);
A.applyTranspose (lhsbis, lhs);
}
_VDF.addin(accu,lhs);
Element scaling;
- _field.init(scaling);
- _field.neg(scaling,minpoly[0].getEntry(idx,0));
- _field.invin(scaling);
+ field().init(scaling);
+ field().neg(scaling,minpoly[0].getEntry(idx,0));
+ field().invin(scaling);
_VDF.mul(x,accu,scaling);
}
@@ -231,11 +239,10 @@ namespace LinBox
#endif //__LINBOX_block_wiedemann_H
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
// Local Variables:
// mode: C++
// tab-width: 8
// indent-tabs-mode: nil
// c-basic-offset: 8
// End:
-
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/algorithms/bm-seq.h b/linbox/algorithms/bm-seq.h
deleted file mode 100644
index 9d9ce52..0000000
--- a/linbox/algorithms/bm-seq.h
+++ /dev/null
@@ -1,716 +0,0 @@
-
-/* linbox/algorithms/bm-seq.h
- * Copyright (C) 2008 George Yuhasz
- *
- * Written by George Yuhasz gyuhasz at math.ncsu.edu
- *
- * ========LICENCE========
- * This file is part of the library LinBox.
- *
- * LinBox is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- * ========LICENCE========
- */
-
-
-
-#ifndef __BM_SEQ_H
-#define __BM_SEQ_H
-
-//Preprocessor variables for the state of BM_iterators
-#define DeltaExceeded 4
-#define SequenceExceeded 3
-#define GeneratorFound 2
-#define GeneratorUnconfirmed 1
-
-#include <vector>
-#include <list>
-#include <set>
-
-#include "linbox/util/timer.h"
-#include "linbox/matrix/matrix-domain.h"
-
-
-
-namespace LinBox {
- template<class _Field>
- class BM_Seq {
-
- public:
-
- typedef _Field Field;
- typedef BlasMatrix<Field> value_type;
- typedef typename std::list<value_type>::const_iterator const_iterator;
- typedef int size_type;
-
- private:
-
- Field& _field;
- std::list<value_type > _seq;
- size_type _size;
- size_t _row, _col;
-
- public:
- BM_Seq(Field& F, size_t r, size_t c) : _field(F)
- {
- _row = r;
- _col = c;
- _size = 0;
- }
- BM_Seq(Field& F, size_t r) : _field(F)
- {
- _row = r;
- _col = r;
- _size = 0;
- }
- BM_Seq(int n, value_type& M) : _field(M.field()), _seq(n, M), _size(n)
- {
- _row = M.rowdim();
- _col = M.coldim();
- }
-
- BM_Seq() {}
-
- BM_Seq(const BM_Seq<Field>& S) :
- _field(S._field), _seq(S._seq), _size(S._size), _row(S._row), _col(S._col)
- {}
-
- BM_Seq & operator=(const BM_Seq<Field>& S)
- {
- if(this != &S){
- (*this)._size = S._size;
- (*this)._row = S._row;
- (*this)._col = S._col;
- (*this)._field = S._field;
- _seq.clear();
- for(typename std::list<value_type>::const_iterator it = S._seq.begin(); it != S._seq.end(); it++)
- _seq.push_back(*it);
- }
- return *this;
- }
-
- Field& field()
- {
- return _field;
- }
-
- size_t rowdim()
- {
- return _row;
- }
-
- size_t coldim()
- {
- return _col;
- }
-
- const_iterator begin() const
- {
- return _seq.begin();
- }
-
- const_iterator end() const
- {
- return _seq.end();
- }
-
- void push_back(const value_type &M)
- {
- if(_row==M.rowdim() && _col==M.coldim()){
- _seq.push_back(M);
- _size++;
- }
- }
-
- bool operator==(const BM_Seq<Field>& l)
- {
- typename std::list<value_type>::const_iterator it, lit;
- bool test = false;
- if(_size==l._size && _row==l._row && _col==l._col){
- test = true;
- MatrixDomain<Field> MD(_field);
- it = _seq.begin();
- lit = l._seq.begin();
- if(_size==0){
- return test;
- }
- else{
- while(test && it!=_seq.end()){
- test = MD.areEqual(*it,*lit);
- it++;
- lit++;
- }
- }
- }
- return test;
- }
-
- bool operator!=(const BM_Seq<Field>& l)
- {
- return !(*this == l);
- }
-
- size_type size()
- {
- return _size;
- }
-
- class BM_iterator {
- public:
- typedef std::list<typename BM_Seq<Field>::value_type> value_type;
-
- private:
- typedef typename BM_Seq<Field>::value_type matrix_type;
- Field& _field;
- BM_Seq<Field>& _seq;
- typename BM_Seq<Field>::size_type _size;
- typename BM_Seq<Field>::size_type _t;
- typename BM_Seq<Field>::const_iterator _seqel;
- std::list<matrix_type> _gen;
- std::vector<int> _deg;
- int _delta;
- int _mu;
- int _beta;
- int _sigma;
- int _gensize;
- size_t _row, _col;
-
- public:
- // This is an enumeration class that tells what state the berlekamp/massey algoithm iterator is in.
- // The four states are:
- // DeltaExceeded = 4
- // SequenceExceeded = 3
- // GeneratorFound = 2
- // GeneratorUnconfirmed = 1
- class TerminationState{
- private:
-
- int _state;
- friend class BM_iterator;
- TerminationState() : _state(GeneratorUnconfirmed) {}
- TerminationState(int m) : _state(m) {}
- public:
- TerminationState(const TerminationState& t) : _state(t._state) {}
- TerminationState & operator=(const TerminationState & t){
- if(this != &t){
- (*this)._state = t._state;
- }
- return *this;
- }
- bool IsGeneratorUnconfirmed(){
- return _state==GeneratorUnconfirmed;
- }
- bool IsGeneratorFound()
- {
- return _state==GeneratorFound;
- }
- bool IsSequenceExceeded()
- {
- return _state==SequenceExceeded;
- }
- bool IsDeltaExceeded()
- {
- return _state==DeltaExceeded;
- }
- };
-
- private:
- TerminationState _state;
- public:
- TerminationState state() const
- {
- return _state;
- }
- void setDelta(int d)
- {
- _delta=d;
- if((_delta < 0 || _beta < _delta - _sigma + _mu +1) && _state._state!=3){
- if(_sigma <= _delta || _delta < 0)
- _state._state = GeneratorUnconfirmed;
- else
- _state._state = DeltaExceeded;
- }
- else{
- if(_sigma > _delta)
- _state._state = DeltaExceeded;
- else
- _state._state = GeneratorFound;
- }
- }
- //Constructor
- explicit BM_iterator(BM_Seq<Field>& s, typename BM_Seq<Field>::size_type elinit=0) :
- _field(s.field()), _seq(s)
- {
- _row = s.rowdim();
- _col = s.coldim();
- _size = _seq.size();
- _t = elinit;
- _delta = -1;
- _seqel = _seq.begin();
- _deg = std::vector<int>(_row+_col);
- for(size_t i = _col; i < _row+_col; i++)
- _deg[i] = 1;
- typename Field::Element one;
- _field.init(one,1);
- matrix_type gen1(_field,_col,_row+_col);
- for(size_t i = 0; i<_col; i++)
- gen1.setEntry(i,i,one);
- _gen.push_back(gen1);
- _gensize = 1;
- if(_size==0 || _t==_size)
- _state._state = SequenceExceeded;
- _sigma = 0;
- _mu = 0;
- _beta = 1;
- }
-
- //Copy constructor
- BM_iterator(const BM_Seq<Field>::BM_iterator & it) :
- _field(it._field), _seq(it._seq), _size(it._size), _t(it._t),
- _seqel(it._seqel), _gen(it._gen), _deg(it._deg),
- _delta(it._delta), _mu(it._mu), _beta(it._beta),
- _sigma(it._sigma), _gensize(it._gensize),
- _row(it._row), _col(it._col), _state(it._state) {}
-
- //Assignment operator not overloaded since BlasMatrix class has overloaded assignment error
- //Overloaded assignment operator
- BM_iterator& operator=(const typename BM_Seq<Field>::BM_iterator& it)
- {
- if(this != &it){
- (*this)._field = it._field;
- (*this)._row = it._row;
- (*this)._col = it._col;
- (*this)._seq = it._seq;
- (*this)._size = it._size;
- (*this)._t = it._t;
- (*this)._seqel = it._seqel;
- (*this)._deg = it._deg;
- (*this)._gensize = it._gensize;
- (*this)._delta = it._delta;
- (*this)._mu = it._mu;
- (*this)._sigma = it._sigma;
- (*this)._beta = it._beta;
- (*this)._state = it._state;
- _gen.clear();
- for(typename std::list<matrix_type>::const_iterator git = it._gen.begin(); git != it._gen.end(); git++)
- _seq.push_back(*git);
- }
- return (*this);
- }
-
- bool operator==(const BM_Seq<Field>::BM_iterator& it)
- {
- TerminationState check = it.state();
- bool test1 = (_seq==it._seq);
- bool test2 = (_t==it._t);
- bool test3 = _delta==it._delta;
- bool test4 = (_state._state == check._state && _state.IsSequenceExceeded());
- return (test1 && test2 && (test3 || test4));
- }
-
- bool operator!=(const BM_iterator& it)
- {
- return !((*this) == it);
- }
- private:
-
- // Column Copy
- template <class Matrix>
- void ColumnCopy(Matrix &M, const Matrix &A, size_t i)
- {
- size_t rowd = A.rowdim();
- for(size_t j = 0; j<rowd; j++){
- M.setEntry(j,i,A.getEntry(j,i));
- }
- }
- // Column Swap
- template <class Matrix>
- void ColumnSwap(Matrix &M, size_t i, size_t j)
- {
- typename Matrix::Field F = M.field();
- typename Matrix::Element t;
- F.init(t,0);
- size_t rowd = M.rowdim();
- for(size_t k = 0; k < rowd; k++){
- F.assign(t,M.getEntry(k,i));
- M.setEntry(k,i,M.getEntry(k,j));
- M.setEntry(k,j,t);
- }
- }
- // Column Operation
- template <class Matrix>
- void ColumnAdd(Matrix &M, size_t i, size_t j, typename Matrix::Element el)
- {
- typename Matrix::Field F = M.field();
- typename Matrix::Element t;
- F.init(t,0);
- size_t rowd = M.rowdim();
- for (size_t k=0; k<rowd; k++){
- F.mul(t, M.getEntry(k,j), el);
- F.addin(t,M.getEntry(k,i));
- M.setEntry(k,i,t);
- }
- }
- template <class Matrix>
- Matrix Algorithm3dot2(Matrix &D, std::vector<int> &d, int &mu, int &sigma, int &beta)
- {
- typename Matrix::Field F = D.field();
- typename Matrix::Element one, pivel;
- F.init(one, 1);
- F.init(pivel,0);
- // Retrieve the row and column dimensions of the sequence and the dimension of the discrepancy
- size_t n = D.rowdim();
- size_t nm = D.coldim();
- size_t m = nm-n;
- //Initialize tau to the identity matrix
- Matrix tau(F,nm,nm);
- for(size_t i = 0; i<nm; i++)
- tau.setEntry(i,i,one);
- //Create the set of generator columns
- std::set<size_t> gen;
- typedef std::set<size_t>::key_type index_type;
- for(index_type i=0; i<m; i++)
- gen.insert(i);
- for(index_type i = 0; i<n; i++){
- //Compute pi, the columns of D with nonzero entries in row i
- std::set<size_t> pi;
- pi.insert(m+i);
- for(typename std::set<size_t>::iterator genit = gen.begin(); genit != gen.end(); genit++){
- if(!F.isZero(D.getEntry(i,*genit)))
- pi.insert(*genit);
- }
-
- //Choose the pivot row with the smallest nominal degree
- index_type piv = m+i;
- for(std::set<size_t>::iterator itpi = pi.begin(); itpi != pi.end(); itpi++){
- size_t j = *itpi;
- if(d[j] <= d[piv]){
- if(d[j]==d[piv]){
- if(piv < m+i){
- if(j<piv)
- piv = j;
- }
- }
- else
- piv = j;
- }
- }
- pi.erase(piv);
- F.assign(pivel,D.getEntry(i,piv));
- //Handle the case when piv=m+i, so no swap is done
- if(piv==m+i){
- for(std::set<size_t>::iterator itpi = pi.begin(); itpi != pi.end(); itpi++){
- typename Matrix::Element temp;
- F.init(temp,D.getEntry(i, *itpi));
- F.negin(temp);
- F.divin(temp,pivel);
- ColumnAdd(tau, *itpi, piv, temp);
- ColumnAdd(D, *itpi, piv, temp);
- }
- }
- else{
- //Remove column index m+i and handle it separately
- pi.erase(m+i);
- //Eliminate nonzero discrepancies in generator columns
- for(typename std::set<size_t>::iterator itpi = pi.begin(); itpi != pi.end(); itpi++){
- typename Matrix::Element temp;
- F.init(temp,D.getEntry(i, *itpi));
- F.negin(temp);
- F.divin(temp,pivel);
- ColumnAdd(tau, *itpi, piv, temp);
- ColumnAdd(D, *itpi, piv, temp);
- }
- typename Matrix::Element auxel;
- F.init(auxel,D.getEntry(i,m+i));
- //Perform a major change and update an initialized auxiliary column
- if(!F.isZero(auxel)){
- typename Matrix::Element temp;
- F.init(temp,D.getEntry(i, m+i));
- F.negin(temp);
- F.divin(temp,pivel);
- ColumnAdd(tau, m+i, piv, temp);
- ColumnAdd(D, m+i, piv, temp);
- ColumnSwap(tau,piv, m+i);
- ColumnSwap(D, piv, m+i);
- }
- else{
- ColumnAdd(tau,m+i,piv,one);
- ColumnAdd(D,m+i,piv,one);
- gen.erase(piv);
- }
- int tempdeg = d[piv];
- d[piv] = d[m+i];
- d[m+i] = tempdeg;
- if(tempdeg < beta)
- beta = tempdeg;
- if(d[piv] > mu)
- mu = d[piv];
- sigma = sigma - tempdeg + d[piv];
- }
- }
- return tau;
- }
- public:
- BM_iterator& operator++()
- {
- //See if a matrix has been pushed on the sequence
- //if it has, then recompute the seqel since it may
- //have become corrupt.
- //Also reset the size to the correct size of the sequence
- if(_size < _seq.size()){
- _seqel = _seq.begin();
- for(int i = 0; i<_t; i++)
- _seqel++;
- _size = _seq.size();
- }
- //if the iterator points past the seq elements, do nothing
- if(_t == _size){
- return *this;
- }
- //Initialize the discrepancy
- matrix_type disc(_field,_row, _row+_col);
- //Create two iterators, one for seq, and one for gen
- typename BM_Seq<Field>::const_iterator cseqit;
- typename std::list<matrix_type>::iterator genit;
- //get a iterator to the seq element to be processed
- cseqit = _seqel;
- //Create a matrix domain for addition and multiplication
- MatrixDomain<Field> MD(_field);
- //Compute the discrepancy
- for(genit = _gen.begin(); genit!=_gen.end(); genit++){
- MD.axpyin(disc,*cseqit,*genit);
- cseqit--;
- }
- //Compute tau with Algorith3.2
- matrix_type tau(Algorithm3dot2(disc, _deg, _mu, _sigma, _beta));
- //Multiply tau into each matrix in the generator
- for(genit = _gen.begin(); genit!=_gen.end(); genit++){
- MD.mulin(*genit,tau);
- }
- //Increment the auxiliary degrees and beta
- for(size_t j = _col; j <_row+_col; j++)
- _deg[j]++;
- _beta++;
- //Add a zero matrix to the end of the generator if needed.
- int tmax = _deg[0];
- for(size_t j = 1; j<_row+_col; j++)
- if(tmax < _deg[j])
- tmax = _deg[j];
- if(tmax+1 > _gensize){
- _gen.push_back(matrix_type(_field,_col,_row+_col));
- _gensize++;
- }
- //Mimic multiplication be z in the auxiliary columns
- typename std::list<matrix_type>::reverse_iterator g1,g2;
- g1 = _gen.rbegin();
- g2 = _gen.rbegin();
- g1++;
- while(g1!=_gen.rend()){
- for(size_t k = _col; k < _row+_col; k++){
- ColumnCopy(*g2,*g1,k);
- }
- g1++;
- g2++;
- }
- genit = _gen.begin();
- matrix_type z1(_field,_col,_row+_col);
- for(size_t k = _col; k < _row+_col; k++)
- ColumnCopy(*genit, z1,k);
- //Increment the t and seqel to the next element
- _t++;
- _seqel++;
- //Update the state
- if(_delta < 0 || _beta < _delta - _sigma + _mu +1){
- if(_t == _size)
- _state._state = SequenceExceeded;
- else{
- if(_sigma > _delta && _delta >= 0)
- _state._state = DeltaExceeded;
- else
- _state._state = GeneratorUnconfirmed;
- }
- }
- else{
- if(_sigma > _delta)
- _state._state = DeltaExceeded;
- else
- _state._state = GeneratorFound;
- }
-
- return *this;
- }
- BM_iterator operator++(int)
- {
- //Create a copy of this
- BM_iterator temp(*this);
-
- //See if a matrix has been pushed on the sequence
- //if it has, then recompute the seqel since it may
- //have become corrupt.
- //Also reset the size to the correct size of the sequence
- if(_size < _seq.size()){
- _seqel = _seq.begin();
- for(int i = 0; i<_t; i++)
- _seqel++;
- _size = _seq.size();
- }
- //if the iterator points past the seq elements, do nothing
- if(_t == _size){
- return *this;
- }
- //Initialize the discrepancy
- matrix_type disc(_field,_row, _row+_col);
- //Create two iterators, one for seq, and one for gen
- typename BM_Seq<Field>::const_iterator cseqit;
- typename std::list<matrix_type>::iterator genit;
- //get an iterator to the seq element to be processed
- cseqit = _seqel;
- //Create a matrix domain for addition and multiplication
- MatrixDomain<Field> MD(_field);
- //Compute the discrepancy
- for(genit = _gen.begin(); genit!=_gen.end(); genit++, cseqit--){
- MD.axpyin(disc,*cseqit,*genit);
- } // cost: k*n^3 (nxn matrix muladds where k is current generator length)
- // is a reductive addition over independent muls.
- //Compute tau with Algorith3.2
- matrix_type tau(Algorithm3dot2(disc, _deg, _mu, _sigma, _beta));
- // cost: n^3 for elim on n x about 2n
- //Multiply tau into each matrix in the generator
- for(genit = _gen.begin(); genit!=_gen.end(); genit++){
- MD.mulin(*genit,tau);
- } // cost: k*n^3 (nxn matrix muls where k is current generator length)
- // is k independent muls with a shared mat tau.
- //Increment the auxiliary degrees and beta
- for(size_t j = _col; j <_row+_col; j++)
- _deg[j]++;
- _beta++;
- //Add a zero matrix to the end of the generator if needed.
- int tmax = _deg[0];
- for(size_t j = 1; j<_row+_col; j++)
- if(tmax < _deg[j])
- tmax = _deg[j];
- if(tmax+1 > _gensize){
- _gen.push_back(matrix_type(_field,_col,_row+_col));
- _gensize++;
- }
- //Mimic multiplication by z in the auxiliary columns
- typename std::list<matrix_type>::reverse_iterator g1,g2;
- g1 = _gen.rbegin();
- g2 = _gen.rbegin();
- g1++;
- while(g1!=_gen.rend()){
- for(size_t k = _col; k < _row+_col; k++){
- ColumnCopy(*g2,*g1,k);
- }
- g1++;
- g2++;
- }
- genit = _gen.begin();
- matrix_type z1(_field,_col,_row+_col);
- for(size_t k = _col; k < _row+_col; k++)
- ColumnCopy(*genit, z1,k);
- //Increment the t and seqel to the next element
- _t++;
- _seqel++;
- //Update the state
- if(_delta < 0 || _beta < _delta - _sigma + _mu +1){
- if(_t == _size)
- _state._state = SequenceExceeded;
- else{
- if(_sigma > _delta && _delta >= 0)
- _state._state = DeltaExceeded;
- else
- _state._state = GeneratorUnconfirmed;
- }
- }
- else{
- if(_sigma > _delta)
- _state._state = DeltaExceeded;
- else
- _state._state = GeneratorFound;
- }
-
- return temp;
- }
- //return a reference to the current generator, in its algorithmic reversed form
- value_type& operator*()
- {
- return _gen;
- }
- //overload the pointer operator
- value_type* operator->()
- {
- return &_gen;
- }
- //Return a vector representing the reversal, by nominal degree, of the current generator
- std::vector<matrix_type> GetGenerator()
- {
- std::vector<matrix_type> revgen(_mu+1, matrix_type(_field,_col,_col));
- for(size_t i = 0; i<_col; i++){
- typename std::list<matrix_type>::iterator genit = _gen.begin();
- for(int j = 0; j < _deg[i]+1; j++){
- ColumnCopy(revgen[_deg[i]-j], *genit,i);
- genit++;
- }
- }
- return revgen;
- }
-
- typename BM_Seq<Field>::size_type get_t()
- {
- return _t;
- }
-
- int get_mu()
- {
- return _mu;
- }
-
- int get_sigma()
- {
- return _sigma;
- }
- int get_beta()
- {
- return _beta;
- }
- int get_delta()
- {
- return _delta;
- }
- };
- //return an initialized BM_iterator
- typename BM_Seq<Field>::BM_iterator BM_begin()
- {
- return typename BM_Seq<Field>::BM_iterator(*this);
- }
- //return an initialized BM_iterator that points to one past the end of the sequence
- typename BM_Seq<Field>::BM_iterator BM_end()
- {
- return typename BM_Seq<Field>::BM_iterator(*this, _size);
- }
- /**/
- };
-}
-
-#endif
-
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
-// Local Variables:
-// mode: C++
-// tab-width: 8
-// indent-tabs-mode: nil
-// c-basic-offset: 8
-// End:
-
diff --git a/linbox/algorithms/charpoly-rational.h b/linbox/algorithms/charpoly-rational.h
index 9322628..13ce385 100644
--- a/linbox/algorithms/charpoly-rational.h
+++ b/linbox/algorithms/charpoly-rational.h
@@ -27,10 +27,9 @@
#include "linbox/util/commentator.h"
#include "linbox/util/timer.h"
-#include "linbox/field/modular.h"
+#include "linbox/ring/modular.h"
//#include "linbox/field/gmp-rational.h"
-#include "linbox/field/PID-integer.h"
#include "linbox/blackbox/rational-matrix-factory.h"
#include "linbox/algorithms/cra-early-multip.h"
#include "linbox/algorithms/cra-domain.h"
@@ -165,7 +164,6 @@ namespace LinBox
const MyMethod &Met= Method::Hybrid())
{
- typedef Modular<double> myModular;
typedef typename Rationals::Element Quotient;
commentator().start ("Rational Charpoly", "Rminpoly");
@@ -176,32 +174,32 @@ namespace LinBox
std::vector<Integer> M(A.rowdim()+1,1);
std::vector<Integer> Di(A.rowdim());
- RationalMatrixFactory<PID_integer,Rationals,BlasMatrix<Rationals > > FA(&A);
+ RationalMatrixFactory<Givaro::ZRing<Integer>,Rationals,BlasMatrix<Rationals > > FA(&A);
Integer da=1, di=1; Integer D=1;
FA.denominator(da);
- for (int i=M.size()-2; i >= 0 ; --i) {
+ for (int i=(int)M.size()-2; i >= 0 ; --i) {
//c[m]=1, c[0]=det(A);
FA.denominator(di,i);
D *=di;
- Di[i]=di;
- M[i] = M[i+1]*da;
+ Di[(size_t)i]=di;
+ M[(size_t)i] = M[(size_t)i+1]*da;
}
- for (int i=0; i < M.size() ; ++i ) {
- gcd(M[i],M[i],D);
+ for (int i=0; i < (int) M.size() ; ++i ) {
+ gcd(M[(size_t)i],M[(size_t)i],D);
}
- PID_integer Z;
- BlasMatrix<PID_integer> Atilde(Z,A.rowdim(), A.coldim());
+ Givaro::ZRing<Integer> Z;
+ BlasMatrix<Givaro::ZRing<Integer> > Atilde(Z,A.rowdim(), A.coldim());
FA.makeAtilde(Atilde);
- ChineseRemainder< EarlyMultipCRA<Modular<double> > > cra(4UL);
+ ChineseRemainder< EarlyMultipCRA<Givaro::Modular<double> > > cra(4UL);
MyRationalModularCharpoly<BlasMatrix<Rationals > , MyMethod> iteration1(A, Met, M);
- MyIntegerModularCharpoly<BlasMatrix<PID_integer>, MyMethod> iteration2(Atilde, Met, Di, M);
+ MyIntegerModularCharpoly<BlasMatrix<Givaro::ZRing<Integer> >, MyMethod> iteration2(Atilde, Met, Di, M);
MyModularCharpoly<MyRationalModularCharpoly<BlasMatrix<Rationals > , MyMethod>,
- MyIntegerModularCharpoly<BlasMatrix<PID_integer>, MyMethod> > iteration(&iteration1,&iteration2);
+ MyIntegerModularCharpoly<BlasMatrix<Givaro::ZRing<Integer> >, MyMethod> > iteration(&iteration1,&iteration2);
- RReconstruction<PID_integer, ClassicMaxQRationalReconstruction<PID_integer> > RR;
+ RReconstruction<Givaro::ZRing<Integer>, ClassicMaxQRationalReconstruction<Givaro::ZRing<Integer> > > RR;
std::vector<Integer> PP; // use of integer due to non genericity of cra. PG 2005-08-04
UserTimer t1,t2;
@@ -231,27 +229,27 @@ namespace LinBox
Integer m; //Integer r; Integer a,b;
cra.getModulus(m);
cra.result(PP);//need to divide
- for (int i=0; i < PP.size(); ++i) {
+ for (int i=0; i < (int)PP.size(); ++i) {
Integer D_1;
- inv(D_1,M[i],m);
- PP[i] = (PP[i]*D_1) % m;
+ inv(D_1,M[(size_t)i],m);
+ PP[(size_t)i] = (PP[(size_t)i]*D_1) % m;
}
Integer den,den1;
std::vector<Integer> num(A.rowdim()+1);
std::vector<Integer> num1(A.rowdim()+1);
- if (RR.reconstructRational(num,den,PP,m,-1)) {//performs reconstruction strating form c[m], use c[i] as prec for c[i-1]
+ if (RR.reconstructRational(num,den,PP,m,-1)) {//performs reconstruction strating form c[m], use c[(size_t)i] as prec for c[(size_t)i-1]
cra(1,PP,iteration,genprime);
cra.getModulus(m);
- for (int i=0; i < PP.size(); ++i) {
+ for (int i=0; i < (int)PP.size(); ++i) {
Integer D_1;
- inv(D_1,M[i],m);
- PP[i] = (PP[i]*D_1) % m;
+ inv(D_1,M[(size_t)i],m);
+ PP[(size_t)i] = (PP[(size_t)i]*D_1) % m;
}
- bool terminated = true;
if (RR.reconstructRational(num1,den1,PP,m,-1)) {
+ bool terminated = true;
if (den==den1) {
- for (int i=0; i < num.size(); ++i) {
- if (num[i] != num1[i]) {
+ for (int i=0; i < (int)num.size(); ++i) {
+ if (num[(size_t)i] != num1[(size_t)i]) {
terminated =false;
break;
}
@@ -271,7 +269,7 @@ namespace LinBox
typename Vector <typename Rationals::Element>::iterator it;
Rationals Q;
for (it= p.begin(); it != p.end(); ++it, ++i) {
- A.field().init(*it, num[i],den);
+ A.field().init(*it, num[(size_t)i],den);
Q.get_den(t,*it);
if (it != p.begin()) Q.get_den(tt,*(it-1));
else tt = 1;
@@ -279,7 +277,7 @@ namespace LinBox
}
return p;
- break;
+ // break;
}
}
}
@@ -290,9 +288,9 @@ namespace LinBox
size_t i =0;
integer t,tt;
integer err;
- size_t max_res=0;int max_i;
+ // size_t max_res=0;int max_i;
// double rel;
- size_t max_resu=0; int max_iu;
+ // size_t max_resu=0; int max_iu;
// size_t max_err = 0;
Quotient qerr;
p.resize(PP.size());
@@ -301,27 +299,27 @@ namespace LinBox
Rationals Q;
for (it= p.begin(); it != p.end(); ++it, ++i) {
- A.field().init(*it, PP[i],M[i]);
+ A.field().init(*it, PP[(size_t)i],M[(size_t)i]);
Q.get_den(t, *it);
Q.get_num(tt,*it);
- err = M[i]/t;
- size_t resi = err.bitsize() + tt.bitsize() -1;
- size_t resu = t.bitsize() + tt.bitsize() -1;
- if (resi > max_res) {max_res = resi; max_i=i;}
- if (resu > max_resu) {max_resu = resu; max_iu =i;}
+ err = M[(size_t)i]/t;
+ // size_t resi = err.bitsize() + tt.bitsize() -1;
+ // size_t resu = t.bitsize() + tt.bitsize() -1;
+ // if (resi > max_res) {max_res = resi; max_i=i;}
+ // if (resu > max_resu) {max_resu = resu; max_iu =i;}
//size_t resu = t.bitsize() + tt.bitsize() -1;
//if (err.bitsize() > max_err) max_err = err.bitsize();
}
- max_res=0;
+ // max_res=0;
for (it= p.begin()+1; it != p.end(); ++it) {
- //A.field().init(*it, PP[i],M[i]);
+ //A.field().init(*it, PP[(size_t)i],M[(size_t)i]);
Q.get_den(t, *it);
Q.get_den(tt, *(it-1));
Q.init(qerr,t,tt);
Q.get_num(tt, *it);
- size_t resi = Q.bitsize(t,qerr) + tt.bitsize() -2;
- if (resi > max_res) {max_res = resi; max_i=i;}
+ // size_t resi = Q.bitsize(t,qerr) + tt.bitsize() -2;
+ // if (resi > max_res) {max_res = resi; max_i=i;}
//if (err.bitsize() > max_err) max_err = err.bitsize();
}
diff --git a/linbox/algorithms/cia.h b/linbox/algorithms/cia.h
index aa61e1c..24f2672 100644
--- a/linbox/algorithms/cia.h
+++ b/linbox/algorithms/cia.h
@@ -27,11 +27,11 @@
#ifndef __LINBOX_cia_H
#define __LINBOX_cia_H
-#include "linbox/ring/givaro-polynomial.h"
-#include "linbox/field/modular.h"
+#include <givaro/givpoly1factor.h>
+#include "linbox/ring/modular.h"
#include "linbox/randiter/random-prime.h"
-#include "linbox/matrix/blas-matrix.h"
-#include "linbox/algorithms/blas-domain.h"
+#include "linbox/matrix/dense-matrix.h"
+#include "linbox/matrix/matrix-domain.h"
#include "linbox/solutions/minpoly.h"
namespace LinBox
@@ -52,12 +52,12 @@ namespace LinBox
commentator().start ("Integer Givaro::Dense Charpoly ", "CIA");
typename Blackbox::Field intRing = A.field();
- typedef Modular<double> Field;
- typedef typename Blackbox::template rebind<Field>::other FBlackbox;
- typedef GivPolynomialRing<typename Blackbox::Field, Givaro::Dense> IntPolyDom;
- typedef GivPolynomialRing<Field, Givaro::Dense> FieldPolyDom;
- typedef typename IntPolyDom::Element IntPoly;
- typedef typename FieldPolyDom::Element FieldPoly;
+ typedef Givaro::Modular<double> Field;
+ typedef typename Blackbox::template rebind<Field>::other FBlackbox;
+ typedef Givaro::Poly1FactorDom<typename Blackbox::Field, Givaro::Dense> IntPolyDom;
+ typedef Givaro::Poly1FactorDom<Field, Givaro::Dense> FieldPolyDom;
+ typedef typename IntPolyDom::Element IntPoly;
+ typedef typename FieldPolyDom::Element FieldPoly;
IntPolyDom IPD(intRing);
@@ -67,8 +67,8 @@ namespace LinBox
minpoly (intMinPoly, A, RingCategories::IntegerTag(), M);
/* Factorization over the integers */
- std::vector<IntPoly*> intFactors;
- std::vector<unsigned long> mult;
+ std::vector<IntPoly> intFactors;
+ std::vector<uint64_t> mult;
IPD.factor (intFactors, mult, intMinPoly);
size_t nf = intFactors.size();
@@ -76,7 +76,7 @@ namespace LinBox
RandomPrimeIterator primeg (22);
++primeg;
Field F(*primeg);
- FBlackbox fbb(F, (int)A.rowdim(), (int)A.coldim());
+ FBlackbox fbb(F, A.rowdim(), A.coldim());
MatrixHom::map(fbb, A);
charpoly (fieldCharPoly, fbb, M);
/* Determination of the multiplicities */
@@ -84,11 +84,11 @@ namespace LinBox
std::vector<FieldPoly> fieldFactors (nf);
integer tmp_convert; // PG 2005-08-04
for (size_t i = 0; i < nf; ++i){
- size_t d= intFactors[i]->size();
+ size_t d= intFactors[i].size();
fieldFactors[i].resize(d);
for (size_t j = 0; j < d; ++j)
//F.init ((fieldFactors[i])[j], (*intFactors[i])[j]);
- F.init ((fieldFactors[i])[j], intRing.convert(tmp_convert,(*intFactors[i])[j]));// PG 2005-08-04
+ F.init ((fieldFactors[i])[j], intRing.convert(tmp_convert,(intFactors[i])[j]));// PG 2005-08-04
}
FieldPoly currPol = fieldCharPoly;
@@ -108,13 +108,13 @@ namespace LinBox
}
IntPoly intCharPoly (A.coldim());
- intRing.init (intCharPoly[0], 1);
+ intRing.assign (intCharPoly[0], intRing.one);
for (size_t i = 0; i < nf; ++i){
- IPD.pow( P, *intFactors[i], multip[i] );
+ IPD.pow( P, intFactors[i], multip[i] );
IPD.mulin( intCharPoly, P );
}
- for (size_t i = 0; i < nf; ++i)
- delete intFactors[i];
+ //for (size_t i = 0; i < nf; ++i)
+ //delete intFactors[i];
commentator().stop ("done", NULL, "CIA");
return P = intCharPoly;
@@ -124,11 +124,10 @@ namespace LinBox
#endif // __LINBOX_cia_H
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
// Local Variables:
// mode: C++
// tab-width: 8
// indent-tabs-mode: nil
// c-basic-offset: 8
// End:
-
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/algorithms/classic-rational-reconstruction.h b/linbox/algorithms/classic-rational-reconstruction.h
index 90da6f6..1de07be 100644
--- a/linbox/algorithms/classic-rational-reconstruction.h
+++ b/linbox/algorithms/classic-rational-reconstruction.h
@@ -244,8 +244,8 @@ namespace LinBox
}
bool reconstructRational(Element& a, Element& b, const Element& x, const Element& m, const Element& a_bound) const{
- bool res= false;
- return res = ClassicRationalReconstruction<Ring>::reconstructRational(a,b,x,m,a_bound);
+ // bool res= false;
+ return /* res =*/ ClassicRationalReconstruction<Ring>::reconstructRational(a,b,x,m,a_bound);
}
protected:
@@ -263,7 +263,7 @@ namespace LinBox
Element T = m.bitsize();
int c = 5; //should be changed here to enhance probability of correctness
- while((a>0) && (r0.bitsize() > T.bitsize() + c))
+ while((a>0) && (r0.bitsize() > T.bitsize() + (unsigned long)c))
{
q = r0;
_intRing.divin(q,a); // r0/num
@@ -272,7 +272,7 @@ namespace LinBox
amax = a;
bmax = b;
qmax = q;
- if (qmax.bitsize() > T.bitsize() + c) break;
+ if (qmax.bitsize() > T.bitsize() + (unsigned long)c) break;
}
u = a;
@@ -307,7 +307,7 @@ namespace LinBox
//Element T = m.bitsize();
//int c = 20;
//T=0;c=0;
- if (qmax.bitsize() > T.bitsize() + c) {
+ if (qmax.bitsize() > T.bitsize() + (unsigned long)c) {
return true;
}
else return false;
@@ -320,11 +320,10 @@ namespace LinBox
}
#endif //__LINBOX_classic_reconstruction_H
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
// Local Variables:
// mode: C++
// tab-width: 8
// indent-tabs-mode: nil
// c-basic-offset: 8
// End:
-
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/algorithms/coppersmith-invariant-factors.h b/linbox/algorithms/coppersmith-invariant-factors.h
new file mode 100644
index 0000000..29efa8a
--- /dev/null
+++ b/linbox/algorithms/coppersmith-invariant-factors.h
@@ -0,0 +1,193 @@
+/* linbox/algorithms/coppersmith-invariant-factors.h
+ * Copyright (C) 2014 Alex Stachnik
+ *
+ * Written by Alex Stachnik <stachnik at udel.edu>
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ * ========LICENCE========
+ */
+
+#ifndef __LINBOX_coppersmith_invariant_factors_H
+#define __LINBOX_coppersmith_invariant_factors_H
+
+#include "linbox/algorithms/block-coppersmith-domain.h"
+#include "linbox/algorithms/blackbox-block-container.h"
+//#include "linbox/algorithms/alt-blackbox-block-container.h"
+#include "linbox/matrix/random-matrix.h"
+
+#include <givaro/givpoly1.h>
+#include <linbox/ring/givaro-poly.h>
+#include <linbox/algorithms/smith-form-kannan-bachem.h>
+#include <linbox/algorithms/smith-form-iliopoulos.h>
+#include <linbox/algorithms/poly-det.h>
+#include "linbox/ring/givaro-poly-mod-poly.h"
+
+#include <omp.h>
+
+namespace LinBox
+{
+
+template<class Field_,class Blackbox_,class Field2_=Field_>
+class CoppersmithInvariantFactors {
+public:
+ typedef Field_ Field;
+ typedef Blackbox_ Blackbox;
+ typedef MatrixDomain<Field> Domain;
+ typedef typename Domain::OwnMatrix Block;
+ typedef typename Field::RandIter RandIter;
+ typedef Givaro::Poly1Dom<Field,Givaro::Dense> PolyDom;
+ typedef GivaroPoly<PolyDom> PolyRing;
+ typedef typename PolyRing::Element PolyElement;
+ typedef MatrixDomain<PolyRing> PolyMatDom;
+ typedef typename PolyMatDom::OwnMatrix PolyBlock;
+
+ CoppersmithInvariantFactors():
+ M_(NULL), n_(0), b_(0) {}
+
+ void init(Field& F, const Blackbox& M, size_t b) {
+ F_=F;
+ M_=M;
+ n_=M.rowdim();
+ MD_=Domain(F);
+ U_=Block(F,b,M.rowdim());
+ V_=Block(F,M.rowdim(),b);
+ b_=b;
+
+ RandIter RI(F_);
+ RandomDenseMatrix<RandIter,Field> RDM(F_,RI);
+ RDM.random(U_);
+ RDM.random(V_);
+ }
+
+ CoppersmithInvariantFactors(Field& F, const Blackbox& M, size_t b):
+ MD_(F), F_(F), M_(&M), n_(M.rowdim()), b_(b),
+ U_(F,b,M.rowdim()), V_(F,M.rowdim(),b)
+ {
+ RandIter RI(F_);
+ RandomDenseMatrix<RandIter,Field> RDM(F_,RI);
+ RDM.random(U_);
+ RDM.random(V_);
+ }
+
+ template <class Mat1, class Mat2>
+ CoppersmithInvariantFactors(Field& F, const Blackbox& M, size_t b,
+ const Mat1& U, const Mat2& V):
+ MD_(F), F_(F), M_(&M), n_(M.rowdim()), b_(b),
+ U_(F,b,M.rowdim()), V_(F,M.rowdim(),b)
+ {
+ MD_.copy(U_,U);
+ MD_.copy(V_,V);
+ }
+
+ template <class PolyRingVector>
+ size_t computeFactors(PolyRingVector& diag, int earlyTerm=10)
+ {
+ //typedef AltBlackboxBlockContainer<Field,Blackbox,typename MatrixDomain<Field2_>::OwnMatrix > BBC;
+ typedef BlackboxBlockContainer<Field,Blackbox> BBC;
+ typedef BlockCoppersmithDomain<MatrixDomain<Field2_>,BBC> BCD;
+ BBC blockSeq(M_,F_,U_,V_);
+ MatrixDomain<Field2_> BMD(F_);
+ BCD coppersmith(BMD,&blockSeq,earlyTerm);
+
+ std::vector<size_t> deg;
+ std::vector<typename MatrixDomain<Field2_>::OwnMatrix > gen;
+ deg=coppersmith.right_minpoly(gen);
+ commentator().report(Commentator::LEVEL_IMPORTANT,PROGRESS_REPORT)
+ <<"Finished computing minpoly"<<std::endl;
+
+ PolyDom PD(F_,"x");
+ PolyRing R(PD);
+ PolyMatDom PMD(R);
+ size_t d=gen.size();
+ PolyBlock MM(R,b_,b_);
+ PolyElement temp,detPoly;
+ PD.init(temp,d-1);
+
+#ifdef OUTPUT_CHECKPOINTS
+ {
+ ofstream oF("checkpoint.txt");
+ for (int i=0;i<d;++i) {
+ BMD.write(oF,gen[i]);
+ }
+ oF.close();
+ }
+#endif
+
+ for (uint32_t i = 0; i < b_; ++i) {
+ for (uint32_t j = 0; j < b_; ++j) {
+ for (uint32_t k = 0; k < d; ++k) {
+ PD.setEntry(temp,gen[k].getEntry(i,j),k);
+ }
+ MM.setEntry(i,j,temp);
+ }
+ }
+
+#ifdef OUTPUT_CHECKPOINTS
+ computePolyDetExtension(detPoly,F_,MM);
+
+ {
+ ofstream oF("polyDetCheckpoint.txt");
+ PD.write(oF,detPoly);
+ oF << std::endl;
+ oF.close();
+ }
+
+ {
+ GivaroPolyModPoly<Field2_> GPMPD(F_,detPoly);
+ GivaroPoly<typename GivaroPolyModPoly<Field2_>::Parent_t > GPMPDW(*(GPMPD.getExtension()));
+ MatrixDomain<GivaroPoly<GivaroPolyModPoly<Field2_> > > GPMPDWMD(GPMPDW);
+ typename MatrixDomain<GivaroPoly<GivaroPolyModPoly<Field2_> > >::OwnMatrix MMCopy(GPMPDW,b_,b_);
+ for (int i=0;i<b_;++i) {
+ for (int j=0;j<b_;++j) {
+ for (int k=0;k<d;++k) {
+ PD.setEntry(temp,gen[k].getEntry(i,j),k);
+ }
+ MMCopy.setEntry(i,j,temp);
+ }
+ }
+ SmithFormIliopoulos::solve(diag,MMCopy);
+ }
+#endif
+ SmithFormKannanBachemDomain<PolyMatDom> SFKB(PMD);
+ diag.resize(b_);
+ SFKB.solve(diag,MM);
+
+ for (uint32_t i = 0; i < diag.size(); ++i) {
+ R.normalizeIn(diag[i]);
+ }
+
+ return diag.size();
+ }
+
+protected:
+
+ Domain MD_;
+
+ Field F_;
+
+ const Blackbox *M_;
+
+ size_t n_,b_;
+
+ Block U_,V_;
+};
+
+}
+
+
+#endif //__LINBOX_coppersmith_invariant_factors_H
diff --git a/linbox/algorithms/coppersmith.h b/linbox/algorithms/coppersmith.h
new file mode 100644
index 0000000..53acf26
--- /dev/null
+++ b/linbox/algorithms/coppersmith.h
@@ -0,0 +1,479 @@
+/* linbox/algorithms/coppersmith.h
+ * evolved from block-wiedemann.h by George Yuhasz
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ * ========LICENCE========
+ */
+
+
+#ifndef __LINBOX_coppersmith_H
+#define __LINBOX_coppersmith_H
+
+#include <vector>
+#include <numeric>
+#include <algorithm>
+#include <iostream>
+#include <givaro/givpoly1crt.h>
+
+
+#include "linbox/integer.h"
+#include "linbox/util/commentator.h"
+#include "linbox/algorithms/blackbox-block-container.h"
+#include "linbox/algorithms/block-coppersmith-domain.h"
+#include "linbox/solutions/det.h"
+
+#include "linbox/util/error.h"
+#include "linbox/util/debug.h"
+
+namespace LinBox
+{
+
+ template <class _Domain>
+ class CoppersmithSolver{
+
+ public:
+ typedef _Domain Domain;
+ typedef typename Domain::Field Field;
+ typedef typename Domain::Element Element;
+ typedef typename Domain::OwnMatrix Block;
+ typedef typename Domain::Matrix Sub;
+
+ inline const Domain & domain() const { return *_MD; }
+ inline const Field & field() const { return domain().field(); }
+ protected:
+ const Domain *_MD;
+ size_t blocking;
+
+ public:
+ CoppersmithSolver(const Domain &MD, size_t blocking_ = 0) :
+ _MD(&MD), blocking(blocking_)
+ {}
+
+
+ template <class Vector, class Blackbox>
+ Vector &solveNonSingular (Vector &x, const Blackbox &B, const Vector &y) const
+ {
+ commentator().start ("Coppersmith solveNonSingular", "solveNonSingular");
+#if 1
+ std::ostream& report = commentator().report(Commentator::LEVEL_IMPORTANT, INTERNAL_DESCRIPTION);
+#endif
+
+ //Set up the projection matrices and their dimensions
+ size_t d = B.coldim();
+ size_t r,c;
+ integer tmp = d;
+
+ //Set the blocking size, Using Pascal Giorgi's convention
+ if(blocking==0){
+ r=tmp.bitsize()-1;
+ c=tmp.bitsize()-1;
+ }else
+ r=c=blocking;
+
+ //Create the block
+ Block U(field(),r,d);
+ Block W(field(),d,c-1);
+ Block V(field(),d,c);
+
+ //Pick random entries for U and W. W will become the last c-1 columns of V
+
+ U.random();
+ W.random();
+
+ //Multiply W by B on the left and place it in the last c-1 columns of V
+ Sub V2(V,0,1,d,c-1);
+ domain().mul(V2,B,W);
+
+ //Make the first column of V a copy of the right side of the system, y
+ for(size_t i=0; i<d; i++)
+ V.setEntry(i,0,y[i]);
+
+ //Create the sequence container and its iterator that will compute the projection
+ BlackboxBlockContainer<Field, Blackbox > blockseq(&B,field(),U,V);
+
+ //Get the generator of the projection using the Coppersmith algorithm (slightly modified by Yuhasz)
+ BlockCoppersmithDomain<Domain, BlackboxBlockContainer<Field, Blackbox> > BCD(domain(), &blockseq,d);
+ std::vector<Block> gen;
+ std::vector<size_t> deg;
+ deg = BCD.right_minpoly(gen);
+ report << "Size of blockseq " << blockseq.size() << std::endl;
+ report << "Size of gen " << gen.size() << std::endl;
+ for(size_t i = 0; i < gen[0].coldim(); i++)
+ report << "Column " << i << " has degree " << deg[i] << std::endl;
+
+ //Reconstruct the solution
+ //Pick a column of the generator with a nonzero element in the first row of the constant coefficient
+ size_t idx = 0;
+ if(field().isZero(gen[0].getEntry(0,0))){
+ size_t i = 1;
+ while(i<c && field().isZero(gen[0].getEntry(0,i)))
+ i++;
+ if(i==c)
+ throw LinboxError(" block minpoly: matrix seems to be singular - abort");
+ else
+ idx=i;
+ }
+
+ //from 1 to the degree of the index column, multiply A^(i-1)V times the idx column of the generator coefficient x^i
+ //Accumulate these results in xm
+ size_t mu = deg[idx];
+ Block BVo(V);
+ Block BVe(field(),d,c);
+ Block xm(field(),d,1);
+ bool odd = true;
+ for(size_t i = 1; i < mu+1; i++){
+ Sub gencol(gen[i],0,idx,c,1); // BB changed d,1 to c,1
+ Block BVgencol(field(),d,1);
+ if(odd){
+ domain().mul(BVgencol,BVo,gencol);
+ domain().addin(xm, BVgencol);
+ domain().mul(BVe,B,BVo);
+ odd=false;
+ }
+ else{
+ domain().mul(BVgencol,BVe,gencol);
+ domain().addin(xm, BVgencol);
+ domain().mul(BVo,B,BVe);
+ odd=true;
+ }
+
+ }
+
+ //For the constant coefficient, loop over the elements in the idx column except the first row
+ //Multiply the corresponding column of W (the last c-1 columns of V before application of B) by the generator element
+ //Accumulate the results in xm
+ for(size_t i = 1; i < c; i++){
+ Sub Wcol(W,0,i-1,d,1);
+ Block Wcolgen0(field(),d,1);
+ domain().mul(Wcolgen0, Wcol, gen[0].getEntry(i,idx));
+ domain().addin(xm,Wcolgen0);
+ }
+
+ //Multiply xm by -1(move to the correct side of the equation) and divide the the 0,idx entry of the generator constant
+ Element gen0inv;
+ field().inv(gen0inv,gen[0].getEntry(0,idx));
+ field().negin(gen0inv);
+ domain().mulin(xm, gen0inv);
+
+#if 0
+ //Test to see if the answer works with U
+ Block Bxm(field(),d,1), UBxm(field(),r,1), Uycol(field(), r,1);
+ Sub ycol(V,0,0,d,1);
+ domain().mul(Uycol, U, ycol);
+ domain().mul(Bxm, B, xm);
+ domain().mul(UBxm, U, Bxm);
+
+ if(domain().areEqual(UBxm, Uycol))
+ report << "The solution matches when projected by U" << endl;
+ else
+ report << "The solution does not match when projected by U" << endl;
+#endif
+
+
+ //Copy xm into x (Change type from 1 column matrix to Vector)
+ for(size_t i =0; i<d; i++)
+ x[i]=xm.getEntry(i,0);
+
+ commentator().stop ("done", NULL, "solveNonSingular");
+ return x;
+ }
+
+
+
+
+ }; // end of class CoppersmithSolver
+
+ template <class _Domain>
+ class CoppersmithRank{
+
+ public:
+ typedef _Domain Domain;
+ typedef typename Domain::Field Field;
+ typedef typename Domain::Element Element;
+ typedef typename Domain::Matrix Block;
+ typedef typename Domain::Submatrix Sub;
+ typedef typename Field::RandIter Random;
+
+ inline const Domain & domain() const { return *_MD; }
+ inline const Field & field() const { return domain().field(); }
+ protected:
+ const Domain *_MD;
+ Random iter;
+ size_t blocking;
+
+ //Compute the determinant of a polynomial matrix at the given set of evaluation points
+ //Store the results in the vector dets.
+ void EvalPolyMat(std::vector<Element> &dets, std::vector<Element> &values, std::vector<Block> & mat) const {
+
+ size_t deg = mat.size() -1;
+ size_t numv = values.size();
+ //Compute the determinant of the evaluation at values[i] for each i
+ for(size_t i = 0; i<numv; i++){
+ //copy the highest matrix coefficient
+ Block evalmat(field(), mat[0].rowdim(), mat[0].coldim());
+ domain().copy(evalmat,mat[deg]);
+ //Evaluate using a horner style evaluation
+ typename std::vector<Block>::reverse_iterator addit = mat.rbegin();
+ addit++;
+ for(addit; addit != mat.rend(); addit++){
+ domain().mulin(evalmat,values[i]);
+ domain().addin(evalmat,*addit);
+ }//end loop computing horner evaluation
+ //Compute the determinant of the evaluation and store it in dets[i]
+ dets[i] = det(dets[i],evalmat);
+ }//end loop over evaluation points
+ }//end evaluation of polynominal matrix determinant
+
+ public:
+ CoppersmithRank(const Domain &MD, size_t blocking_ = 0) :
+ _MD(&MD), blocking(blocking_), iter(MD.field())
+ {}
+
+
+ template <class Blackbox>
+ size_t rank (const Blackbox &B) const
+ {
+ commentator().start ("Coppersmith rank", "rank");
+#if 1
+ std::ostream& report = commentator().report(Commentator::LEVEL_IMPORTANT, INTERNAL_DESCRIPTION);
+#endif
+
+ //Set up the projection matrices and their dimensions
+ size_t d = B.coldim();
+ size_t r,c;
+ integer tmp = d;
+
+ //Set the blocking size, Using Pascal Giorgi's convention
+ if(blocking==0){
+ r=tmp.bitsize()-1;
+ c=tmp.bitsize()-1;
+ }else
+ r=c=blocking;
+
+ //Create the block
+ Block U(field(),r,d);
+ Block V(field(),d,c);
+
+ //Pick random entries for U and W. W will become the last c-1 columns of V
+
+ U.random();
+ V.random();
+
+
+ BlackboxBlockContainer<Field, Blackbox > blockseq(&B,field(),U,V);
+
+ //Get the generator of the projection using the Coppersmith algorithm (slightly modified by Yuhasz)
+ BlockCoppersmithDomain<Domain, BlackboxBlockContainer<Field, Blackbox> > BCD(domain(), &blockseq,d);
+ std::vector<Block> gen;
+ std::vector<size_t> deg;
+ deg = BCD.right_minpoly(gen);
+ for(size_t i = 0; i < gen[0].coldim(); i++)
+ report << "Column " << i << " has degree " << deg[i] << std::endl;
+
+ //Compute the rank via the determinant of the generator
+ //Get the sum of column degrees
+ //This is the degree of the determinant via Yuhasz thesis
+ //size_t detdeg = std::accumulate(deg.begin(), deg.end(), 0);
+ size_t detdeg= 0;
+ for(size_t i = 0; i < gen[0].coldim(); i++)
+ detdeg+=deg[i];
+ //Set up interpolation with one more evaluation point than degree
+ size_t numpoints = d+1;
+ std::vector<Element> evalpoints(numpoints), evaldets(numpoints);
+ for(typename std::vector<Element>::iterator evalit = evalpoints.begin(); evalit != evalpoints.end(); evalit++){
+ do{
+ //do iter.random(*evalit); while(field().isZero(*evalit));
+ iter.random(*evalit);
+ }while ((std::find(evalpoints.begin(), evalit, *evalit) != evalit));
+ }//end evaluation point construction loop
+
+ //Evaluate the generator determinant at the points
+ EvalPolyMat(evaldets, evalpoints, gen);
+ for(size_t k = 0; k <numpoints; k++)
+ report << evalpoints[k] << " " << evaldets[k] << std::endl;
+ //Construct the polynomial using Givare interpolation
+ //Stolen from Pascal Giorgi, linbox/examples/omp-block-rank.C
+ typedef Givaro::Poly1CRT< Field > PolyCRT;
+ PolyCRT Interpolator(field(), evalpoints, "x");
+ typename PolyCRT::Element Determinant;
+ Interpolator.RnsToRing(Determinant,evaldets);
+ Givaro::Degree intdetdeg;
+ Interpolator.getpolydom().degree(intdetdeg,Determinant);
+ Givaro::Degree intdetval;
+ Interpolator.getpolydom().val(intdetval,Determinant);
+ if(detdeg != (size_t) intdetdeg.value()){
+ report << "sum of column degrees " << detdeg << std::endl;
+ report << "interpolation degree " << intdetdeg.value() << std::endl;
+ }
+ report << "sum of column degrees " << detdeg << std::endl;
+ report << "interpolation degree " << intdetdeg.value() << std::endl;
+ report << "valence (trailing degree) " << intdetval.value() << std::endl;
+ for(size_t k = 0; k<gen.size(); k++)
+ domain().write(report, gen[k]) << "x^" << k << std::endl;
+ Interpolator.write(report << "Interpolated determinant: ", Determinant) << std::endl;
+ size_t myrank = size_t(intdetdeg.value() - intdetval.value());
+ commentator().stop ("done", NULL, "Coppersmith rank");
+ return myrank;
+ }
+
+
+
+
+ }; // end of class CoppersmithRank
+
+ //Use the coppersmith block wiedemann to compute the determinant
+ template <class _Domain>
+ class CoppersmithDeterminant{
+
+ public:
+ typedef _Domain Domain;
+ typedef typename Domain::Field Field;
+ typedef typename Domain::Element Element;
+ typedef typename Domain::Matrix Block;
+ typedef typename Domain::Submatrix Sub;
+ typedef typename Field::RandIter Random;
+
+ inline const Domain & domain() const { return *_MD; }
+ inline const Field & field() const { return domain().field(); }
+ protected:
+ const Domain *_MD;
+ Random iter;
+ size_t blocking;
+
+ //Compute the determinant of a polynomial matrix at the given set of evaluation points
+ //Store the results in the vector dets.
+ void EvalPolyMat(std::vector<Element> &dets, std::vector<Element> &values, std::vector<Block> & mat) const {
+
+ size_t deg = mat.size() -1;
+ size_t numv = values.size();
+ //Compute the determinant of the evaluation at values[i] for each i
+ for(size_t i = 0; i<numv; i++){
+ //copy the highest matrix coefficient
+ Block evalmat(mat[deg]);
+ //Evaluate using a horner style evaluation
+ typename std::vector<Block>::reverse_iterator addit = mat.rbegin();
+ addit++;
+ for(addit; addit != mat.rend(); addit++){
+ domain().mulin(evalmat,values[i]);
+ domain().addin(evalmat,*addit);
+ }//end loop computing horner evaluation
+ //Compute the determinant of the evaluation and store it in dets[i]
+ dets[i] = det(dets[i],evalmat);
+ }//end loop over evaluation points
+ }//end evaluation of polynominal matrix determinant
+
+ public:
+ CoppersmithDeterminant(const Domain &MD, size_t blocking_ = 0) :
+ _MD(&MD), blocking(blocking_), iter(MD.field())
+ {}
+
+
+ template <class Blackbox>
+ Element det (const Blackbox &B) const
+ {
+ commentator().start ("Coppersmith determinant", "determinant");
+#if 1
+ std::ostream& report = commentator().report(Commentator::LEVEL_IMPORTANT, INTERNAL_DESCRIPTION);
+#endif
+
+ //Set up the projection matrices and their dimensions
+ size_t d = B.coldim();
+ size_t r,c;
+ integer tmp = d;
+
+ //Use given blocking size, if not given use Pascal Giorgi's convention
+ if(blocking==0){
+ r=tmp.bitsize()-1;
+ c=tmp.bitsize()-1;
+ }else
+ r=c=blocking;
+
+ //Create the block
+ Block U(field(),r,d);
+ Block V(field(),d,c);
+
+ //Pick random entries for U and W. W will become the last c-1 columns of V
+
+ U.random();
+ V.random();
+
+ //Multiply V by B on the left
+ domain().leftMulin(B,V);
+
+ //Create the sequence container and its iterator that will compute the projection
+ BlackboxBlockContainer<Field, Blackbox > blockseq(&B,field(),U,V);
+
+ //Get the generator of the projection using the Coppersmith algorithm (slightly modified by Yuhasz)
+ BlockCoppersmithDomain<Domain, BlackboxBlockContainer<Field, Blackbox> > BCD(domain(), &blockseq,d);
+ std::vector<Block> gen;
+ std::vector<size_t> deg;
+ deg = BCD.right_minpoly(gen);
+
+ //Compute the determinant via the constant coefficient of the determinant of the generator
+ //Get the sum of column degrees
+ //This is the degree of the determinant via Yuhasz thesis
+ //size_t detdeg = std::accumulate(deg.begin(), deg.end(), 0);
+ size_t detdeg= 0;
+ for(size_t i = 0; i < gen[0].coldim(); i++)
+ detdeg+=deg[i];
+ //Set up interpolation with one more evaluation point than degree
+ size_t numpoints = 2*d;
+ std::vector<Element> evalpoints(numpoints), evaldets(numpoints);
+ for(typename std::vector<Element>::iterator evalit = evalpoints.begin(); evalit != evalpoints.end(); evalit++){
+ do{
+ do iter.random(*evalit); while(field().isZero(*evalit));
+ }while ((std::find(evalpoints.begin(), evalit, *evalit) != evalit));
+ }//end evaluation point construction loop
+
+ //Evaluate the generator determinant at the points
+ EvalPolyMat(evaldets, evalpoints, gen);
+ //Construct the polynomial using Givare interpolation
+ //Stolen from Pascal Giorgi, linbox/examples/omp-block-rank.C
+ typedef Givaro::Poly1CRT<Field> PolyCRT;
+ PolyCRT Interpolator(field(), evalpoints, "x");
+ typename PolyCRT::Element Determinant;
+ Interpolator.RnsToRing(Determinant,evaldets);
+ Givaro::Degree intdetdeg;
+ Interpolator.getpolydom().degree(intdetdeg,Determinant);
+ Givaro::Degree intdetval(0);
+ Interpolator.getpolydom().val(intdetval,Determinant);
+ if(d != (size_t)intdetdeg.value()){
+ report << "The matrix is singular, determinant is zero" << std::endl;
+ return field(0).zero;
+ }
+ Interpolator.write(report << "Interpolated determinant: ", Determinant) << std::endl;
+ Element intdeterminant(field().zero);
+ Interpolator.getpolydom().getEntry(intdeterminant,intdetval,Determinant);
+ commentator().stop ("done", NULL, "Coppersmith determinant");
+ return intdeterminant;
+ }
+
+ }; // end of class CoppersmithDeterminant
+
+
+}// end of namespace LinBox
+
+#endif //__LINBOX_coppersmith_H
+
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/algorithms/cra-domain-omp.h b/linbox/algorithms/cra-domain-omp.h
index 5648f85..38c4c99 100644
--- a/linbox/algorithms/cra-domain-omp.h
+++ b/linbox/algorithms/cra-domain-omp.h
@@ -34,8 +34,9 @@
#define __LINBOX_omp_cra_H
// commentator is not thread safe
#define DISABLE_COMMENTATOR
-#include "linbox/algorithms/cra-domain-seq.h"
+#include <omp.h>
#include <set>
+#include "linbox/algorithms/cra-domain-seq.h"
namespace LinBox
{
@@ -58,9 +59,14 @@ namespace LinBox
template<class Function, class PrimeIterator>
Integer& operator() (Integer& res, Function& Iteration, PrimeIterator& primeiter)
{
+ //! @bug why why why ???
+ /** erreur: ‘omp_get_max_threads’ has not been declared
+ * ../linbox/algorithms/cra-domain-omp.h:152:16: note: suggested alternative:
+ * /usr/lib/gcc/x86_64-linux-gnu/4.6/include/omp.h:64:12: note: ‘Givaro::omp_get_max_threads’
+ */
size_t NN = omp_get_max_threads();
//std::cerr << "Blocs: " << NN << " iterations." << std::endl;
- // commentator().start ("Parallel OMP Modular iteration", "mmcrait");
+ // commentator().start ("Parallel OMP Givaro::Modular iteration", "mmcrait");
if (NN == 1) return Father_t::operator()(res,Iteration,primeiter);
int coprime =0;
@@ -150,7 +156,7 @@ namespace LinBox
typedef typename CRATemporaryVectorTrait<Function, DomainElement>::Type_t ElementContainer;
size_t NN = omp_get_max_threads();
//std::cerr << "Blocs: " << NN << " iterations." << std::endl;
- // commentator().start ("Parallel OMP Modular iteration", "mmcrait");
+ // commentator().start ("Parallel OMP Givaro::Modular iteration", "mmcrait");
if (NN == 1) return Father_t::operator()(res,Iteration,primeiter);
int coprime =0;
diff --git a/linbox/algorithms/cra-domain-seq.h b/linbox/algorithms/cra-domain-seq.h
index 96001ca..12c3838 100644
--- a/linbox/algorithms/cra-domain-seq.h
+++ b/linbox/algorithms/cra-domain-seq.h
@@ -1,7 +1,7 @@
/* linbox/algorithms/cra-domain-seq.h
* Copyright (C) 1999-2010 The LinBox group
*
- * Time-stamp: <01 Apr 11 15:47:48 Jean-Guillaume.Dumas at imag.fr>
+ * Time-stamp: <29 Jun 15 18:59:17 Jean-Guillaume.Dumas at imag.fr>
*
* ========LICENCE========
* This file is part of the library LinBox.
@@ -29,12 +29,13 @@
#ifndef __LINBOX_sequential_cra_H
#define __LINBOX_sequential_cra_H
+#include "linbox/linbox-config.h"
#include "linbox/util/timer.h"
-#include <stdlib.h>
#include "linbox/integer.h"
#include "linbox/solutions/methods.h"
-#include <vector>
+#include "linbox/vector/blas-vector.h"
#include <utility>
+#include <stdlib.h>
#include "linbox/util/commentator.h"
//$define _LB_CRATIMING
@@ -42,8 +43,8 @@
namespace LinBox
{
- template<class Function, class Element> struct CRATemporaryVectorTrait {
- typedef std::vector<Element> Type_t;
+ template<class Function, class Field> struct CRATemporaryVectorTrait {
+ typedef BlasVector<Field> Type_t;
};
@@ -61,7 +62,7 @@ namespace LinBox
template<class Param>
ChineseRemainderSeq(const Param& b) :
- Builder_(b)
+ Builder_(b) //! @bug test-cra-domain/clang++ emits a warning
{
IterCounter=0;
}
@@ -94,7 +95,7 @@ namespace LinBox
template<class Function, class PrimeIterator>
Integer& operator() (Integer& res, Function& Iteration, PrimeIterator& primeiter)
{
- commentator().start ("Modular iteration", "mmcrait");
+ commentator().start ("Givaro::Modular iteration", "mmcrait");
if (IterCounter==0) {
++IterCounter;
Domain D(*primeiter);
@@ -106,7 +107,7 @@ namespace LinBox
Builder_.initialize( D, Iteration(r, D) );
}
- int coprime =0;
+ int coprime =0, nbprimes=0;
int maxnoncoprime = 1000;
while( ! Builder_.terminated() ) {
@@ -115,14 +116,14 @@ namespace LinBox
++primeiter;
++coprime;
if (coprime > maxnoncoprime) {
- std::cout << "you are running out of primes. " << maxnoncoprime << " coprime primes found";
+ commentator().report(Commentator::LEVEL_ALWAYS,INTERNAL_ERROR) << "you are running out of primes. " << nbprimes << " used and " << maxnoncoprime << " coprime primes tried for a new one.";
return Builder_.result(res);
}
}
coprime =0;
Domain D(*primeiter);
commentator().report(Commentator::LEVEL_IMPORTANT, INTERNAL_DESCRIPTION) << "With prime " << *primeiter << std::endl;
- ++primeiter;
+ ++primeiter; ++nbprimes;
DomainElement r; D.init(r);
Builder_.progress( D, Iteration(r, D) );
}
@@ -150,7 +151,7 @@ namespace LinBox
Builder_.initialize( D, Iteration(r, D) );
}
- int coprime =0;
+ int coprime =0, nbprimes=0;
int maxnoncoprime = 1000;
while ((k <0) || (i < k)) {
@@ -160,7 +161,7 @@ namespace LinBox
++primeiter;
++coprime;
if (coprime > maxnoncoprime) {
- std::cout << "you are running out of primes. " << maxnoncoprime << " coprime primes found";
+ commentator().report(Commentator::LEVEL_ALWAYS,INTERNAL_ERROR) << "you are running out of primes. " << nbprimes << " used and " << maxnoncoprime << " coprime primes tried for a new one.";
return true ;//term
}
}
@@ -168,7 +169,7 @@ namespace LinBox
Domain D(*primeiter);
commentator().report(Commentator::LEVEL_IMPORTANT, INTERNAL_DESCRIPTION) << "With prime " << *primeiter << std::endl;
- ++primeiter;
+ ++primeiter; ++nbprimes;
DomainElement r; D.init(r);
Builder_.progress( D, Iteration(r, D) );
}
@@ -181,17 +182,16 @@ namespace LinBox
template<class Iterator, class Function, class PrimeIterator>
Iterator& operator() (Iterator& res, Function& Iteration, PrimeIterator& primeiter)
{
- commentator().start ("Modular vectorized iteration", "mmcravit");
+ commentator().start ("Givaro::Modular vectorized iteration", "mmcravit");
if (IterCounter==0) {
Domain D(*primeiter);
commentator().report(Commentator::LEVEL_IMPORTANT, INTERNAL_DESCRIPTION) << "With prime " << *primeiter << std::endl;
++primeiter;
- typename CRATemporaryVectorTrait<Function, DomainElement>::Type_t r;
+ typename CRATemporaryVectorTrait<Function, Domain>::Type_t r(D);
Builder_.initialize( D, Iteration(r, D) );
}
-
- int coprime =0;
+ int coprime =0, nbprimes=0;
int maxnoncoprime = 1000;
while( ! Builder_.terminated() ) {
@@ -200,15 +200,15 @@ namespace LinBox
++primeiter;
++coprime;
if (coprime > maxnoncoprime) {
- std::cout << "you are running out of primes. " << maxnoncoprime << " coprime primes found";
+ commentator().report(Commentator::LEVEL_ALWAYS,INTERNAL_ERROR) << "you are running out of primes. " << nbprimes << " used and " << maxnoncoprime << " coprime primes tried for a new one.";
return Builder_.result(res);
}
}
-
+ coprime = 0;
Domain D(*primeiter);
commentator().report(Commentator::LEVEL_IMPORTANT, INTERNAL_DESCRIPTION) << "With prime " << *primeiter << std::endl;
- ++primeiter;
- typename CRATemporaryVectorTrait<Function, DomainElement>::Type_t r;
+ ++primeiter; ++nbprimes;
+ typename CRATemporaryVectorTrait<Function, Domain>::Type_t r(D);
Builder_.progress( D, Iteration(r, D) );
}
commentator().stop ("done", NULL, "mmcravit");
@@ -218,7 +218,6 @@ namespace LinBox
/*
*progress for k iterations
*/
-
template<class Iterator, class Function, class PrimeIterator>
bool operator() (const int k, Iterator& res, Function& Iteration, PrimeIterator& primeiter)
{
@@ -230,11 +229,11 @@ namespace LinBox
Domain D(*primeiter);
commentator().report(Commentator::LEVEL_IMPORTANT, INTERNAL_DESCRIPTION) << "With prime " << *primeiter << std::endl;
++primeiter;
- typename CRATemporaryVectorTrait<Function, DomainElement>::Type_t r;
+ typename CRATemporaryVectorTrait<Function, Domain>::Type_t r;
Builder_.initialize( D, Iteration(r, D) );
}
- int coprime =0;
+ int coprime =0, nbprimes=0;
int maxnoncoprime = 1000;
while( (k <0 ) || (i < k)) {
@@ -246,16 +245,16 @@ namespace LinBox
++primeiter;
++coprime;
if (coprime > maxnoncoprime) {
- std::cout << "you are runnig out of primes. " << maxnoncoprime << " coprime primes found";
+ commentator().report(Commentator::LEVEL_ALWAYS,INTERNAL_ERROR) << "you are running out of primes. " << nbprimes << " used and " << maxnoncoprime << " coprime primes tried for a new one.";
return true;//term
}
}
coprime =0;
Domain D(*primeiter);
- ++primeiter;
+ ++primeiter; ++nbprimes;
- typename CRATemporaryVectorTrait<Function, DomainElement>::Type_t r;
+ typename CRATemporaryVectorTrait<Function, Domain>::Type_t r;
Builder_.progress( D, Iteration(r, D) );
}
Builder_.result(res);
@@ -337,11 +336,11 @@ namespace LinBox
#endif //__LINBOX_sequential_cra_H
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
// Local Variables:
// mode: C++
// tab-width: 8
// indent-tabs-mode: nil
// c-basic-offset: 8
// End:
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/algorithms/cra-domain.h b/linbox/algorithms/cra-domain.h
index de8506e..4324d5b 100644
--- a/linbox/algorithms/cra-domain.h
+++ b/linbox/algorithms/cra-domain.h
@@ -31,11 +31,12 @@
* @ingroup algorithms
* @ingroup CRA
*
- * If _OPENMP is defined, the we use ChineseRemainderOMP, else
+ * If LINBOX_USES_OPENMP is defined, the we use ChineseRemainderOMP, else
* we fall back to ChineseRemainderSeq
*/
-#ifdef _OPENMP
+#include "linbox/integer.h"
+#ifdef LINBOX_USES_OPENMP
#include "linbox/algorithms/cra-domain-omp.h"
namespace LinBox
@@ -43,7 +44,7 @@ namespace LinBox
/*! @brief Wrapper around OMP/SEQ version of ChineseRemainderXXX<CRABase>.
* \ingroup CRA
*
- * If _OPENMP is defined, the we use ChineseRemainderOMP, else
+ * If LINBOX_USES_OPENMP is defined, the we use ChineseRemainderOMP, else
* we fall back to ChineseRemainderSeq
*
* This is the OMP version
@@ -73,7 +74,7 @@ namespace LinBox
/*! @brief Wrapper around OMP/SEQ version of ChineseRemainderXXX<CRABase>.
* \ingroup CRA
*
- * If _OPENMP is defined, the we use ChineseRemainderOMP, else
+ * If LINBOX_USES_OPENMP is defined, the we use ChineseRemainderOMP, else
* we fall back to ChineseRemainderSeq
*
* This is the SEQ version
diff --git a/linbox/algorithms/cra-early-multip.h b/linbox/algorithms/cra-early-multip.h
index 979303c..e40ba50 100644
--- a/linbox/algorithms/cra-early-multip.h
+++ b/linbox/algorithms/cra-early-multip.h
@@ -59,6 +59,7 @@ namespace LinBox
// of the elements to be reconstructed
std::vector< unsigned long > randv;
+ Integer& result(Integer &d) { std::cout << "should not be called" << std::endl; return d ;} ; // DON'T TOUCH
public:
EarlyMultipCRA(const unsigned long EARLY=DEFAULT_EARLY_TERM_THRESHOLD) :
@@ -75,6 +76,7 @@ namespace LinBox
EarlySingleCRA<Domain>::getResidue(m);
return m;
}
+
template<template<class T> class Vect>
Vect<Integer>& getResidue(Vect<Integer>& m)
{
@@ -82,6 +84,7 @@ namespace LinBox
return m;
}
+ //! Init
template<template<class T> class Vect>
void initialize (const Integer& D, const Vect<Integer>& e)
{
@@ -114,6 +117,26 @@ namespace LinBox
FullMultipCRA<Domain>::initialize(D, e);
}
+ template<class OKDomain>
+ void initialize (const Domain& D, const BlasVector<OKDomain>& e)
+ {
+ // Random coefficients for a linear combination
+ // of the elements to be reconstructed
+ srand48(BaseTimer::seed());
+ randv. resize ( e.size() );
+ for ( std::vector<unsigned long>::iterator int_p = randv. begin();
+ int_p != randv. end(); ++ int_p)
+ *int_p = ((unsigned long)lrand48()) % 20000;
+ DomainElement z;
+ // Could be much faster
+ // - do not compute twice the product of moduli
+ // - reconstruct one element of e until Early Termination,
+ // then only, try a random linear combination.
+ EarlySingleCRA<Domain>::initialize(D,dot(z, D, e, randv) );
+ FullMultipCRA<Domain>::initialize(D, e);
+ }
+
+ //! Progress
template<template<class T> class Vect>
void progress (const Integer& D, const Vect<Integer>& e)
{
@@ -123,24 +146,49 @@ namespace LinBox
FullMultipCRA<Domain>::progress(D, e);
}
+#if 1
template<template <class> class Alloc, template<class, class> class Vect>
void progress (const Domain& D, const Vect<DomainElement, Alloc<DomainElement> >& e)
{
+ // DomainElement z;
+ /*!@todo Could be much faster
+ - do not compute twice the product of moduli
+ - reconstruct one element of e until Early Termination,
+ then only, try a random linear combination.
+ */
+ // EarlySingleCRA<Domain>::progress(D, dot(z, D, e, randv));
+ // FullMultipCRA<Domain>::progress(D, e);
+ BlasVector<Domain> d(D,e);
+ this->progress(D,d);
+ }
+#endif
+
+ template<class OKDomain>
+ void progress (const Domain& D, const BlasVector<OKDomain>& e)
+ {
DomainElement z;
- // Could be much faster
- // - do not compute twice the product of moduli
- // - reconstruct one element of e until Early Termination,
- // then only, try a random linear combination.
+ /*!@todo Could be much faster
+ - do not compute twice the product of moduli
+ - reconstruct one element of e until Early Termination,
+ then only, try a random linear combination.
+ */
EarlySingleCRA<Domain>::progress(D, dot(z, D, e, randv));
FullMultipCRA<Domain>::progress(D, e);
}
+ //! Result
template<template <class> class Alloc, template<class, class> class Vect>
Vect<Integer, Alloc<Integer> >& result(Vect<Integer, Alloc<Integer> >& d)
{
return FullMultipCRA<Domain>::result(d);
}
+ BlasVector<Givaro::ZRing<Integer> >& result(BlasVector<Givaro::ZRing<Integer> >& d)
+ {
+ return FullMultipCRA<Domain>::result(d);
+ }
+
+ //! terminate
bool terminated()
{
return EarlySingleCRA<Domain>::terminated();
@@ -213,7 +261,7 @@ namespace LinBox
const Vect2& v2)
{
- D.init(z,0); DomainElement tmp;
+ D.assign(z,D.zero); DomainElement tmp;
typename Vect1<DomainElement, Alloc<DomainElement> >::const_iterator v1_p;
typename Vect2::const_iterator v2_p;
for (v1_p = v1. begin(), v2_p = v2. begin();
@@ -225,16 +273,35 @@ namespace LinBox
// commentator().report(Commentator::LEVEL_ALWAYS, INTERNAL_DESCRIPTION) << "z: " << z << std::endl;
return z;
}
+
+ template <class Vect2, class OKDomain>
+ DomainElement& dot (DomainElement& z, const Domain& D,
+ const BlasVector<OKDomain>& v1,
+ const Vect2& v2)
+ {
+
+ D.assign(z,D.zero); DomainElement tmp;
+ typename BlasVector<Domain>::const_iterator v1_p;
+ typename Vect2::const_iterator v2_p;
+ for (v1_p = v1. begin(), v2_p = v2. begin();
+ v1_p != v1. end();
+ ++ v1_p, ++ v2_p)
+ D.axpyin(z, (*v1_p), D.init(tmp, (*v2_p)));
+
+ // commentator().report(Commentator::LEVEL_ALWAYS, INTERNAL_DESCRIPTION) << "v: " << v2 << std::endl;
+ // commentator().report(Commentator::LEVEL_ALWAYS, INTERNAL_DESCRIPTION) << "z: " << z << std::endl;
+ return z;
+ }
+
};
}
#endif //__LINBOX_cra_early_multip_H
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
// Local Variables:
// mode: C++
// tab-width: 8
// indent-tabs-mode: nil
// c-basic-offset: 8
// End:
-
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/algorithms/cra-early-single.h b/linbox/algorithms/cra-early-single.h
index 3c3496a..0aba016 100644
--- a/linbox/algorithms/cra-early-single.h
+++ b/linbox/algorithms/cra-early-single.h
@@ -69,8 +69,8 @@ namespace LinBox
public:
EarlySingleCRA(const unsigned long EARLY=DEFAULT_EARLY_TERM_THRESHOLD) :
- primeProd_(1UL),
- nextM_(1UL),
+ primeProd_(1U),
+ nextM_(1U),
occurency_(0U),
EARLY_TERM_THRESHOLD((unsigned)EARLY-1)
{
@@ -97,7 +97,7 @@ namespace LinBox
tInit.start();
#endif
primeProd_ = D;
- nextM_ = 1UL;
+ nextM_ = 1U;
residue_ = e;
occurency_ = 1;
#ifdef CRATIMING
@@ -113,7 +113,7 @@ namespace LinBox
tInit.start();
#endif
D.characteristic( primeProd_ );
- nextM_ = 1UL;
+ nextM_ = 1U;
D.convert( residue_, e);
occurency_ = 1;
#ifdef CRATIMING
diff --git a/linbox/algorithms/cra-full-multip-fixed.h b/linbox/algorithms/cra-full-multip-fixed.h
index 74f7955..206b8ec 100644
--- a/linbox/algorithms/cra-full-multip-fixed.h
+++ b/linbox/algorithms/cra-full-multip-fixed.h
@@ -61,7 +61,7 @@ namespace LinBox
typedef std::vector<double>::iterator DoubleVect_Iterator ;
typedef std::vector< bool >::iterator BoolVect_Iterator ;
typedef std::vector< LazyProduct >::iterator LazyVect_Iterator ;
- typedef std::vector< Integer > IntVect ;
+ typedef BlasVector< Givaro::ZRing<Integer> > IntVect ;
typedef IntVect::iterator IntVect_Iterator ;
typedef std::vector< IntVect >::iterator IntVectVect_Iterator ;
typedef IntVect::const_iterator IntVect_ConstIterator ;
@@ -77,7 +77,8 @@ namespace LinBox
{
this->RadixSizes_.resize(1);
this->RadixPrimeProd_.resize(1);
- this->RadixResidues_.resize(1);
+ Givaro::ZRing<Integer> ZZ ;
+ this->RadixResidues_.resize(1,BlasVector<Givaro::ZRing<Integer>>(ZZ));
this->RadixOccupancy_.resize(1);
this->RadixOccupancy_.front() = false;
}
@@ -122,7 +123,8 @@ namespace LinBox
IntVectVect_Iterator _tab_it = this->RadixResidues_.begin();
BoolVect_Iterator _occ_it = this->RadixOccupancy_.begin();
- IntVect ri(this->size);
+ Givaro::ZRing<Integer> ZZ;
+ IntVect ri(ZZ,this->size);
LazyProduct mi;
double di;
if (*_occ_it) {
@@ -310,7 +312,7 @@ namespace LinBox
typedef std::vector<double>::iterator DoubleVect_Iterator ;
typedef std::vector< bool >::iterator BoolVect_Iterator ;
typedef std::vector< LazyProduct >::iterator LazyVect_Iterator ;
- typedef std::vector< Integer > IntVect ;
+ typedef BlasVector< Givaro::ZRing<Integer> > IntVect ;
typedef IntVect::iterator IntVect_Iterator ;
typedef std::vector< IntVect >::iterator IntVectVect_Iterator ;
typedef IntVect::const_iterator IntVect_ConstIterator ;
@@ -326,7 +328,8 @@ namespace LinBox
{
this->RadixSizes_.resize(1);
this->RadixPrimeProd_.resize(1);
- this->RadixResidues_.resize(1);
+ Givaro::ZRing<Integer> ZZ ;
+ this->RadixResidues_.resize(1,BlasVector<Givaro::ZRing<Integer>>(ZZ));
this->RadixOccupancy_.resize(1);
this->RadixOccupancy_.front() = false;
}
@@ -368,7 +371,8 @@ namespace LinBox
IntVectVect_Iterator _tab_it = this->RadixResidues_.begin();
BoolVect_Iterator _occ_it = this->RadixOccupancy_.begin();
- IntVect ri(this->size);
+ Givaro::ZRing<Integer> ZZ;
+ IntVect ri(ZZ,this->size);
LazyProduct mi;
double di;
if (*_occ_it) {
diff --git a/linbox/algorithms/cra-full-multip.h b/linbox/algorithms/cra-full-multip.h
index 4377702..ec2da34 100644
--- a/linbox/algorithms/cra-full-multip.h
+++ b/linbox/algorithms/cra-full-multip.h
@@ -34,7 +34,7 @@
#include <stdlib.h>
#include "linbox/integer.h"
#include "linbox/solutions/methods.h"
-#include <vector>
+#include "linbox/vector/blas-vector.h"
#include <utility>
#include "linbox/algorithms/lazy-product.h"
@@ -58,7 +58,7 @@ namespace LinBox
protected:
std::vector< double > RadixSizes_;
std::vector< LazyProduct > RadixPrimeProd_;
- std::vector< std::vector<Integer> > RadixResidues_;
+ std::vector< BlasVector<Givaro::ZRing<Integer> > > RadixResidues_;
std::vector< bool > RadixOccupancy_;
const double LOGARITHMIC_UPPER_BOUND;
double totalsize;
@@ -72,7 +72,8 @@ namespace LinBox
Integer& getModulus(Integer& m)
{
- std::vector<Integer> r; result(r);
+ Givaro::ZRing<Integer> ZZ;
+ BlasVector<Givaro::ZRing<Integer> > r(ZZ); result(r);
return m=RadixPrimeProd_.back()();
}
@@ -83,25 +84,28 @@ namespace LinBox
return r;
}
+ //! init
template<class Vect>
void initialize (const Integer& D, const Vect& e)
{
RadixSizes_.resize(1);
RadixPrimeProd_.resize(1);
- RadixResidues_.resize(1);
+ Givaro::ZRing<Integer> ZZ ;
+ const BlasVector<Givaro::ZRing<Integer> >z(ZZ);
+ RadixResidues_.resize(1,z);
RadixOccupancy_.resize(1); RadixOccupancy_.front() = false;
progress( D, e);
#if 0
std::vector< double >::iterator _dsz_it = RadixSizes_.begin();
std::vector< LazyProduct >::iterator _mod_it = RadixPrimeProd_.begin();
- std::vector< std::vector<Integer> >::iterator _tab_it = RadixResidues_.begin();
+ std::vector< BlasVector<Givaro::ZRing<Integer> > >::iterator _tab_it = RadixResidues_.begin();
std::vector< bool >::iterator _occ_it = RadixOccupancy_.begin();
_mod_it->initialize(D);
*_dsz_it = Givaro::naturallog(D);
typename Vect::const_iterator e_it = e.begin();
_tab_it->resize(e.size());
- std::vector<Integer>::iterator t0_it= _tab_it->begin();
+ BlasVector<Givaro::ZRing<Integer> >::iterator t0_it= _tab_it->begin();
for( ; e_it != e.end(); ++e_it, ++ t0_it)
*t0_it = *e_it;
*_occ_it = true;
@@ -114,11 +118,24 @@ namespace LinBox
{
RadixSizes_.resize(1);
RadixPrimeProd_.resize(1);
- RadixResidues_.resize(1);
+ Givaro::ZRing<Integer> ZZ;
+ RadixResidues_.resize(1,BlasVector<Givaro::ZRing<Integer> >(ZZ));
RadixOccupancy_.resize(1); RadixOccupancy_.front() = false;
progress(D, e);
}
+ template<class OKDomain>
+ void initialize (const Domain& D, const BlasVector<OKDomain>& e)
+ {
+ RadixSizes_.resize(1);
+ RadixPrimeProd_.resize(1);
+ Givaro::ZRing<Integer> ZZ ;
+ RadixResidues_.resize(1,BlasVector<Givaro::ZRing<Integer> >(ZZ));
+ RadixOccupancy_.resize(1); RadixOccupancy_.front() = false;
+ progress(D, e);
+ }
+
+ //! progress
/* Used in the case where D is a big Integer and Domain cannot be constructed */
// template<template<class T> class Vect>
template< template<class, class> class Vect, template <class> class Alloc>
@@ -126,13 +143,15 @@ namespace LinBox
{
std::vector< double >::iterator _dsz_it = RadixSizes_.begin();
std::vector< LazyProduct >::iterator _mod_it = RadixPrimeProd_.begin();
- std::vector< std::vector<Integer> >::iterator _tab_it = RadixResidues_.begin();
+ std::vector< BlasVector<Givaro::ZRing<Integer> > >::iterator _tab_it = RadixResidues_.begin();
std::vector< bool >::iterator _occ_it = RadixOccupancy_.begin();
- std::vector<Integer> ri(e.size()); LazyProduct mi; double di;
+ BlasVector<Givaro::ZRing<Integer> > ri(e.field(),e.size());
+ LazyProduct mi;
+ double di;
if (*_occ_it) {
typename Vect<Integer,Alloc<Integer> >::const_iterator e_it = e.begin();
- std::vector<Integer>::iterator ri_it = ri.begin();
- std::vector<Integer>::const_iterator t0_it = _tab_it->begin();
+ BlasVector<Givaro::ZRing<Integer> >::iterator ri_it = ri.begin();
+ BlasVector<Givaro::ZRing<Integer> >::const_iterator t0_it = _tab_it->begin();
Integer invprod; precomputeInvProd(invprod, D, _mod_it->operator()());
for( ; e_it != e.end(); ++e_it, ++ri_it, ++ t0_it) {
*ri_it =* e_it;
@@ -150,7 +169,69 @@ namespace LinBox
*_dsz_it = Givaro::naturallog(tmp);
typename Vect<Integer, Alloc<Integer> >::const_iterator e_it = e.begin();
_tab_it->resize(e.size());
- std::vector<Integer>::iterator t0_it= _tab_it->begin();
+ BlasVector<Givaro::ZRing<Integer> >::iterator t0_it= _tab_it->begin();
+ for( ; e_it != e.end(); ++e_it, ++ t0_it)
+ *t0_it = *e_it;
+ *_occ_it = true;
+ return;
+ }
+ for(++_dsz_it, ++_mod_it, ++_tab_it, ++_occ_it ; _occ_it != RadixOccupancy_.end() ; ++_dsz_it, ++_mod_it, ++_tab_it, ++_occ_it) {
+ if (*_occ_it) {
+ BlasVector<Givaro::ZRing<Integer> >::iterator ri_it = ri.begin();
+ BlasVector<Givaro::ZRing<Integer> >::const_iterator t_it= _tab_it->begin();
+ Integer invprod; precomputeInvProd(invprod, mi(), _mod_it->operator()());
+ for( ; ri_it != ri.end(); ++ri_it, ++ t_it)
+ smallbigreconstruct(*ri_it, *t_it, invprod);
+ mi.mulin(*_mod_it);
+ di += *_dsz_it;
+ *_occ_it = false;
+ }
+ else {
+ *_dsz_it = di;
+ *_mod_it = mi;
+ *_tab_it = ri;
+ *_occ_it = true;
+ return;
+ }
+ }
+
+ RadixSizes_.push_back( di );
+ RadixResidues_.push_back( ri );
+ RadixPrimeProd_.push_back( mi );
+ RadixOccupancy_.push_back ( true );
+ }
+
+ // spec for BlasVector
+ void progress (const Integer& D, const BlasVector<Givaro::ZRing<Integer> >& e)
+ {
+ std::vector< double >::iterator _dsz_it = RadixSizes_.begin();
+ std::vector< LazyProduct >::iterator _mod_it = RadixPrimeProd_.begin();
+ std::vector< BlasVector<Givaro::ZRing<Integer> > >::iterator _tab_it = RadixResidues_.begin();
+ std::vector< bool >::iterator _occ_it = RadixOccupancy_.begin();
+ BlasVector<Givaro::ZRing<Integer> > ri(e.field(),e.size());
+ LazyProduct mi; double di;
+ if (*_occ_it) {
+ typename BlasVector<Givaro::ZRing<Integer> >::const_iterator e_it = e.begin();
+ BlasVector<Givaro::ZRing<Integer> >::iterator ri_it = ri.begin();
+ BlasVector<Givaro::ZRing<Integer> >::const_iterator t0_it = _tab_it->begin();
+ Integer invprod; precomputeInvProd(invprod, D, _mod_it->operator()());
+ for( ; e_it != e.end(); ++e_it, ++ri_it, ++ t0_it) {
+ *ri_it =* e_it;
+ smallbigreconstruct(*ri_it, *t0_it, invprod );
+ }
+ Integer tmp = D;
+ di = *_dsz_it + Givaro::naturallog(tmp);
+ mi.mulin(tmp);
+ mi.mulin(*_mod_it);
+ *_occ_it = false;
+ }
+ else {
+ Integer tmp = D;
+ _mod_it->initialize(tmp);
+ *_dsz_it = Givaro::naturallog(tmp);
+ typename BlasVector<Givaro::ZRing<Integer> >::const_iterator e_it = e.begin();
+ _tab_it->resize(e.size());
+ BlasVector<Givaro::ZRing<Integer> >::iterator t0_it= _tab_it->begin();
for( ; e_it != e.end(); ++e_it, ++ t0_it)
*t0_it = *e_it;
*_occ_it = true;
@@ -158,8 +239,8 @@ namespace LinBox
}
for(++_dsz_it, ++_mod_it, ++_tab_it, ++_occ_it ; _occ_it != RadixOccupancy_.end() ; ++_dsz_it, ++_mod_it, ++_tab_it, ++_occ_it) {
if (*_occ_it) {
- std::vector<Integer>::iterator ri_it = ri.begin();
- std::vector<Integer>::const_iterator t_it= _tab_it->begin();
+ BlasVector<Givaro::ZRing<Integer> >::iterator ri_it = ri.begin();
+ BlasVector<Givaro::ZRing<Integer> >::const_iterator t_it= _tab_it->begin();
Integer invprod; precomputeInvProd(invprod, mi(), _mod_it->operator()());
for( ; ri_it != ri.end(); ++ri_it, ++ t_it)
smallbigreconstruct(*ri_it, *t_it, invprod);
@@ -188,16 +269,18 @@ namespace LinBox
// Radix shelves
std::vector< double >::iterator _dsz_it = RadixSizes_.begin();
std::vector< LazyProduct >::iterator _mod_it = RadixPrimeProd_.begin();
- std::vector< std::vector<Integer> >::iterator _tab_it = RadixResidues_.begin();
+ std::vector< BlasVector<Givaro::ZRing<Integer> > >::iterator _tab_it = RadixResidues_.begin();
std::vector< bool >::iterator _occ_it = RadixOccupancy_.begin();
- std::vector<Integer> ri(e.size()); LazyProduct mi; double di;
+ Givaro::ZRing<Integer> ZZ;
+ BlasVector<Givaro::ZRing<Integer> > ri(ZZ,e.size());
+ LazyProduct mi; double di;
if (*_occ_it) {
// If lower shelf is occupied
// Combine it with the new residue
// The for loop will try to put the resulting combination on the upper shelf
typename Vect<DomainElement, Alloc<DomainElement> >::const_iterator e_it = e.begin();
- std::vector<Integer>::iterator ri_it = ri.begin();
- std::vector<Integer>::const_iterator t0_it = _tab_it->begin();
+ BlasVector<Givaro::ZRing<Integer> >::iterator ri_it = ri.begin();
+ BlasVector<Givaro::ZRing<Integer> >::const_iterator t0_it = _tab_it->begin();
DomainElement invP0; precomputeInvP0(invP0, D, _mod_it->operator()() );
for( ; ri_it != ri.end(); ++e_it, ++ri_it, ++ t0_it)
fieldreconstruct(*ri_it, D, *e_it, *t0_it, invP0, (*_mod_it).operator()() );
@@ -219,7 +302,97 @@ namespace LinBox
totalsize += ltp;
typename Vect<DomainElement, Alloc<DomainElement> >::const_iterator e_it = e.begin();
_tab_it->resize(e.size());
- std::vector<Integer>::iterator t0_it= _tab_it->begin();
+ BlasVector<Givaro::ZRing<Integer> >::iterator t0_it= _tab_it->begin();
+ for( ; e_it != e.end(); ++e_it, ++ t0_it)
+ D.convert(*t0_it, *e_it);
+ *_occ_it = true;
+ return;
+ }
+
+ // We have a combination to put in the upper shelf
+ for(++_dsz_it, ++_mod_it, ++_tab_it, ++_occ_it ; _occ_it != RadixOccupancy_.end() ; ++_dsz_it, ++_mod_it, ++_tab_it, ++_occ_it) {
+ if (*_occ_it) {
+ // This shelf is occupied
+ // Combine it with the new combination
+ // The loop will try to put it on the upper shelf
+ BlasVector<Givaro::ZRing<Integer> >::iterator ri_it = ri.begin();
+ BlasVector<Givaro::ZRing<Integer> >::const_iterator t_it= _tab_it->begin();
+
+ Integer invprod; precomputeInvProd(invprod, mi(), _mod_it->operator()());
+ for( ; ri_it != ri.end(); ++ri_it, ++ t_it)
+ smallbigreconstruct(*ri_it, *t_it, invprod);
+
+ // Product (lazy) computation
+ mi.mulin(*_mod_it);
+
+ // Moding out
+ for(ri_it = ri.begin() ; ri_it != ri.end(); ++ri_it) {
+ *ri_it %= mi();
+ }
+
+ di += *_dsz_it;
+ *_occ_it = false;
+ }
+ else {
+ // This shelf is free
+ // Put the new combination here and exit
+ *_dsz_it = di;
+ *_mod_it = mi;
+ *_tab_it = ri;
+ *_occ_it = true;
+ return;
+ }
+ }
+ // All the shelfves were occupied
+ // We create a new top shelf
+ // And put the new combination there
+ RadixSizes_.push_back( di );
+ RadixResidues_.push_back( ri );
+ RadixPrimeProd_.push_back( mi );
+ RadixOccupancy_.push_back ( true );
+ }
+
+ // spec for BlasVector
+ template<class OKDomain>
+ void progress (const Domain& D, const BlasVector<OKDomain >& e)
+ {
+ // Radix shelves
+ std::vector< double >::iterator _dsz_it = RadixSizes_.begin();
+ std::vector< LazyProduct >::iterator _mod_it = RadixPrimeProd_.begin();
+ std::vector< BlasVector<Givaro::ZRing<Integer> > >::iterator _tab_it = RadixResidues_.begin();
+ std::vector< bool >::iterator _occ_it = RadixOccupancy_.begin();
+ Givaro::ZRing<Integer> ZZ;
+ LazyProduct mi; double di;
+ BlasVector<Givaro::ZRing<Integer> > ri(ZZ,e.size());
+ if (*_occ_it) {
+ // If lower shelf is occupied
+ // Combine it with the new residue
+ // The for loop will try to put the resulting combination on the upper shelf
+ typename BlasVector<Domain>::const_iterator e_it = e.begin();
+ BlasVector<Givaro::ZRing<Integer> >::iterator ri_it = ri.begin();
+ BlasVector<Givaro::ZRing<Integer> >::const_iterator t0_it = _tab_it->begin();
+ DomainElement invP0; precomputeInvP0(invP0, D, _mod_it->operator()() );
+ for( ; ri_it != ri.end(); ++e_it, ++ri_it, ++ t0_it)
+ fieldreconstruct(*ri_it, D, *e_it, *t0_it, invP0, (*_mod_it).operator()() );
+ Integer tmp; D.characteristic(tmp);
+ double ltp = Givaro::naturallog(tmp);
+ di = *_dsz_it + ltp;
+ totalsize += ltp;
+ mi.mulin(tmp);
+ mi.mulin(*_mod_it);
+ *_occ_it = false;
+ }
+ else {
+ // Lower shelf is free
+ // Put the new residue here and exit
+ Integer tmp; D.characteristic(tmp);
+ double ltp = Givaro::naturallog(tmp);
+ _mod_it->initialize(tmp);
+ *_dsz_it = ltp;
+ totalsize += ltp;
+ typename BlasVector<Domain>::const_iterator e_it = e.begin();
+ _tab_it->resize(e.size());
+ BlasVector<Givaro::ZRing<Integer> >::iterator t0_it= _tab_it->begin();
for( ; e_it != e.end(); ++e_it, ++ t0_it)
D.convert(*t0_it, *e_it);
*_occ_it = true;
@@ -232,8 +405,8 @@ namespace LinBox
// This shelf is occupied
// Combine it with the new combination
// The loop will try to put it on the upper shelf
- std::vector<Integer>::iterator ri_it = ri.begin();
- std::vector<Integer>::const_iterator t_it= _tab_it->begin();
+ BlasVector<Givaro::ZRing<Integer> >::iterator ri_it = ri.begin();
+ BlasVector<Givaro::ZRing<Integer> >::const_iterator t_it= _tab_it->begin();
Integer invprod; precomputeInvProd(invprod, mi(), _mod_it->operator()());
for( ; ri_it != ri.end(); ++ri_it, ++ t_it)
@@ -269,12 +442,91 @@ namespace LinBox
RadixOccupancy_.push_back ( true );
}
+
+ //! result
template<template<class, class> class Vect, template <class> class Alloc>
Vect<Integer, Alloc<Integer> >& result (Vect<Integer, Alloc<Integer> > &d)
{
d.resize( (RadixResidues_.front()).size() );
std::vector< LazyProduct >::iterator _mod_it = RadixPrimeProd_.begin();
- std::vector< std::vector< Integer > >::iterator _tab_it = RadixResidues_.begin();
+ std::vector< BlasVector< Givaro::ZRing<Integer> > >::iterator _tab_it = RadixResidues_.begin();
+ std::vector< bool >::iterator _occ_it = RadixOccupancy_.begin();
+ LazyProduct Product;
+ // We have to find to lowest occupied shelf
+ for( ; _occ_it != RadixOccupancy_.end() ; ++_mod_it, ++_tab_it, ++_occ_it) {
+ if (*_occ_it) {
+ // Found the lowest occupied shelf
+ Product = *_mod_it;
+ BlasVector<Givaro::ZRing<Integer> >::iterator t0_it = d.begin();
+ BlasVector<Givaro::ZRing<Integer> >::iterator t_it = _tab_it->begin();
+ if (++_occ_it == RadixOccupancy_.end()) {
+ // It is the only shelf of the radix
+ // We normalize the result and output it
+ for( ; t0_it != d.end(); ++t0_it, ++t_it)
+ normalize(*t0_it = *t_it, *t_it, _mod_it->operator()());
+ //RadixPrimeProd_.resize(1);
+ return d;
+ }
+ else {
+ // There are other shelves
+ // The result is initialized with this shelf
+ // The for loop will combine the other shelves m with the actual one
+ for( ; t0_it != d.end(); ++t0_it, ++t_it)
+ *t0_it = *t_it;
+ ++_mod_it; ++_tab_it;
+ break;
+ }
+ }
+ }
+ for( ; _occ_it != RadixOccupancy_.end() ; ++_mod_it, ++_tab_it, ++_occ_it) {
+ if (*_occ_it) {
+ // This shelf is occupied
+ // We need to combine it with the actual value of the result
+ BlasVector<Givaro::ZRing<Integer> >::iterator t0_it = d.begin();
+ BlasVector<Givaro::ZRing<Integer> >::const_iterator t_it = _tab_it->begin();
+ Integer invprod;
+ precomputeInvProd(invprod, Product(), _mod_it->operator()() );
+
+ for( ; t0_it != d.end(); ++t0_it, ++t_it)
+ smallbigreconstruct(*t0_it, *t_it, invprod);
+
+ // Overall product computation
+ Product.mulin(*_mod_it);
+
+ // Moding out and normalization
+ for(t0_it = d.begin();t0_it != d.end(); ++t0_it) {
+ *t0_it %= Product();
+ Integer tmp(*t0_it);
+ normalize(*t0_it, tmp, Product());
+ }
+
+ }
+ }
+
+ // We put it also the final prime product in the first shelf of products
+ // JGD : should we also put the result
+ // in the first shelf of residues and resize it to 1
+ // and set to true the first occupancy and resize it to 1
+ // in case result is not the last call (more progress to go) ?
+ RadixPrimeProd_.resize(1);
+ RadixPrimeProd_.front() = Product;
+ RadixSizes_.resize(1);
+ RadixSizes_.front() = Givaro::naturallog(Product());
+ Givaro::ZRing<Integer> ZZ;
+ RadixResidues_.resize(1,BlasVector<Givaro::ZRing<Integer> >(ZZ));
+ RadixResidues_.front() = d;
+ RadixOccupancy_.resize(1);
+ RadixOccupancy_.front() = true;
+
+ return d;
+ }
+
+ // spec for BlasVector
+ BlasVector<Givaro::ZRing<Integer> >& result (BlasVector<Givaro::ZRing<Integer> > &d)
+ {
+ d.resize( (RadixResidues_.front()).size() );
+ std::vector< LazyProduct >::iterator _mod_it = RadixPrimeProd_.begin();
+ std::vector< BlasVector< Givaro::ZRing<Integer> > >::iterator _tab_it = RadixResidues_.begin();
std::vector< bool >::iterator _occ_it = RadixOccupancy_.begin();
LazyProduct Product;
// We have to find to lowest occupied shelf
@@ -282,8 +534,8 @@ namespace LinBox
if (*_occ_it) {
// Found the lowest occupied shelf
Product = *_mod_it;
- std::vector<Integer>::iterator t0_it = d.begin();
- std::vector<Integer>::iterator t_it = _tab_it->begin();
+ BlasVector<Givaro::ZRing<Integer> >::iterator t0_it = d.begin();
+ BlasVector<Givaro::ZRing<Integer> >::iterator t_it = _tab_it->begin();
if (++_occ_it == RadixOccupancy_.end()) {
// It is the only shelf of the radix
// We normalize the result and output it
@@ -307,8 +559,8 @@ namespace LinBox
if (*_occ_it) {
// This shelf is occupied
// We need to combine it with the actual value of the result
- std::vector<Integer>::iterator t0_it = d.begin();
- std::vector<Integer>::const_iterator t_it = _tab_it->begin();
+ BlasVector<Givaro::ZRing<Integer> >::iterator t0_it = d.begin();
+ BlasVector<Givaro::ZRing<Integer> >::const_iterator t_it = _tab_it->begin();
Integer invprod;
precomputeInvProd(invprod, Product(), _mod_it->operator()() );
@@ -337,7 +589,8 @@ namespace LinBox
RadixPrimeProd_.front() = Product;
RadixSizes_.resize(1);
RadixSizes_.front() = Givaro::naturallog(Product());
- RadixResidues_.resize(1);
+ Givaro::ZRing<Integer> Z;
+ RadixResidues_.resize(1,BlasVector<Givaro::ZRing<Integer> >(Z));
RadixResidues_.front() = d;
RadixOccupancy_.resize(1);
RadixOccupancy_.front() = true;
@@ -345,6 +598,7 @@ namespace LinBox
return d;
}
+
bool terminated()
{
return totalsize > LOGARITHMIC_UPPER_BOUND;
@@ -421,11 +675,10 @@ namespace LinBox
#endif //__LINBOX_cra_full_multip_H
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
// Local Variables:
// mode: C++
// tab-width: 8
// indent-tabs-mode: nil
// c-basic-offset: 8
// End:
-
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/algorithms/cra-givrnsfixed.h b/linbox/algorithms/cra-givrnsfixed.h
index c3d9592..23623f3 100644
--- a/linbox/algorithms/cra-givrnsfixed.h
+++ b/linbox/algorithms/cra-givrnsfixed.h
@@ -1,7 +1,7 @@
/* linbox/algorithms/cra-full-multip.h
* Copyright (C) 1999-2010 The LinBox group
*
- * Time-stamp: <05 Apr 11 10:49:43 Jean-Guillaume.Dumas at imag.fr>
+ * Time-stamp: <29 May 13 09:57:18 Jean-Guillaume.Dumas at imag.fr>
*
* ========LICENCE========
* This file is part of the library LinBox.
@@ -31,6 +31,7 @@
#define __LINBOX_cra_givrnsfix_H
#include <stdlib.h>
+#include "linbox/vector/blas-vector.h"
#include <givaro/givrnsfixed.h>
namespace LinBox
@@ -51,7 +52,7 @@ namespace LinBox
const size_t nbloops;
size_t iterationnumber;
- std::vector< std::vector< integer > > residues;
+ std::vector< BlasVector< Givaro::ZRing<Integer> > > residues;
integer _product;
integer _midprod;
@@ -59,14 +60,28 @@ namespace LinBox
GivaroRnsFixedCRA(const std::vector<integer>& primes)
: Father_t(primes),
nbloops(primes.size()),
- iterationnumber(0),
- _product(1)
+ iterationnumber(0)
+ , residues(0,BlasVector<Givaro::ZRing<Integer> >(Givaro::ZRing<Integer>()))
+ , _product(1)
{
for(size_t i=0; i<primes.size(); ++i)
_product *= primes[i];
- Givaro::Integer::div(_midprod,_product,2);
+ Givaro::Integer::div(_midprod,_product,2);
}
+ GivaroRnsFixedCRA(const BlasVector<Givaro::ZRing<Integer> >& primes)
+ : Father_t(primes.getRep()), // refRep ?
+ nbloops(primes.size()),
+ iterationnumber(0)
+ , residues(0,BlasVector<Givaro::ZRing<Integer> >(Givaro::ZRing<Integer>()))
+ , _product(1)
+ {
+ for(size_t i=0; i<primes.size(); ++i)
+ _product *= primes[i];
+ Givaro::Integer::div(_midprod,_product,2);
+ }
+
+
Integer& getModulus(Integer& m)
{
return m=_product;
@@ -85,6 +100,15 @@ namespace LinBox
this->progress(D,e);
}
+ void initialize (const Domain& D, const BlasVector<Domain >& e)
+ {
+ Givaro::ZRing<Integer> ZZ;
+ BlasVector<Givaro::ZRing<Integer> > Z(ZZ);
+ residues.resize(e.size(),Z);
+ this->progress(D,e);
+ }
+
+
template< template<class, class> class Vect, template <class> class Alloc>
void progress (const Domain& D, const Vect<DomainElement, Alloc<DomainElement> >& e)
{
@@ -100,11 +124,43 @@ namespace LinBox
}
+ void progress (const Domain& D, const BlasVector<Domain>& e)
+ {
+ ++iterationnumber;
+ typename BlasVector<Domain >::const_iterator eit=e.begin();
+ std::vector<BlasVector< Givaro::ZRing<Integer> > >::iterator rit = residues.begin();
+
+ for( ; eit != e.end(); ++eit, ++rit) {
+ Integer tmp;
+ D.convert(tmp, *eit);
+ rit->push_back(tmp);
+ }
+
+ }
+
+
template<template<class, class> class Vect, template <class> class Alloc>
Vect<Integer, Alloc<Integer> >& result (Vect<Integer, Alloc<Integer> > &d)
{
d.resize(0);
- for(std::vector<std::vector< Integer > >::const_iterator rit = residues.begin(); rit != residues.end(); ++rit) {
+ for(typename Vect<Integer, Alloc<Integer> >::const_iterator rit = residues.begin(); rit != residues.end(); ++rit) {
+ Integer tmp;
+ RnsToRing(tmp, *rit);
+ linbox_check(tmp>=0);
+ linbox_check(tmp<_product);
+ if (tmp>_midprod)
+ tmp -= _product ;
+ linbox_check(tmp<=_midprod);
+ d.push_back(tmp);
+ }
+ return d;
+ }
+
+
+ BlasVector<Givaro::ZRing<Integer> >& result (BlasVector<Givaro::ZRing<Integer> > &d)
+ {
+ d.resize(0);
+ for(std::vector<BlasVector< Givaro::ZRing<Integer> > >::const_iterator rit = residues.begin(); rit != residues.end(); ++rit) {
Integer tmp;
RnsToRing(tmp, *rit);
linbox_check(tmp>=0);
diff --git a/linbox/algorithms/cra-mpi.h b/linbox/algorithms/cra-mpi.h
index 8618b85..c7a6fda 100644
--- a/linbox/algorithms/cra-mpi.h
+++ b/linbox/algorithms/cra-mpi.h
@@ -94,11 +94,11 @@ namespace LinBox
primes[i - 1] = *primeg;
_commPtr->send(primes[i - 1], i);
}
- int idle_process = 0;
bool first_time = true;
int poison_pills_left = procs - 1;
// loop until all execution is complete
while( poison_pills_left > 0 ){
+ int idle_process = 0;
// receive sub-answers from child procs
_commPtr->recv(r, MPI_ANY_SOURCE);
idle_process = (_commPtr->get_stat()).MPI_SOURCE;
@@ -177,9 +177,9 @@ namespace LinBox
_commPtr->send(primes[i - 1], i);
}
Builder_.initialize( D, Iteration(r, D) );
- int idle_process = 0;
int poison_pills_left = procs - 1;
while(poison_pills_left > 0 ){
+ int idle_process = 0;
// receive the beginnin and end of a vector in heapspace
_commPtr->recv(r.begin(), r.end(), MPI_ANY_SOURCE, 0);
// determine which process sent answer
diff --git a/linbox/algorithms/cra.doxy b/linbox/algorithms/cra.doxy
index 195c065..bbb7d1b 100644
--- a/linbox/algorithms/cra.doxy
+++ b/linbox/algorithms/cra.doxy
@@ -1,4 +1,4 @@
-// Copyright (C) 2010 Brice Boyer, part of LinBox, GNU LGPL, see COPYING
+// Copyright (C) 2010 Brice Boyer (briceboyer), part of LinBox, GNU LGPL, see COPYING
/*
* ========LICENCE========
* This file is part of the library LinBox.
diff --git a/linbox/algorithms/dense-container.h b/linbox/algorithms/dense-container.h
index ab9e77b..10abf17 100644
--- a/linbox/algorithms/dense-container.h
+++ b/linbox/algorithms/dense-container.h
@@ -6,20 +6,20 @@
*
* ------------------------------------
*
- *
+ *
* ========LICENCE========
* This file is part of the library LinBox.
- *
+ *
* LinBox is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
- *
+ *
* This library 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
* Lesser General Public License for more details.
- *
+ *
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
@@ -119,9 +119,9 @@ namespace LinBox
// Copy of v into a row of U
it = v.begin();
i=0;
- for (; it!=v.end(); it++, i++){
+ for (; it!=v.end(); ++it, ++i){
*(Up+i) = *it;
- _field.convert(tmp,*it);
+ field().convert(tmp,*it);
cerr<<" copie of "<<tmp;
}
cerr<<endl;
@@ -144,8 +144,8 @@ namespace LinBox
// Copy of v into a row of U
it = w.begin();
i=0;
- for (; it!=w.end(); it++, i++){
- _field.convert(tmp,*it);
+ for (; it!=w.end(); ++it, ++i){
+ field().convert(tmp,*it);
cerr<<" copie of "<<tmp;
*(Up+i) = *it;
}
diff --git a/linbox/algorithms/dense-nullspace.h b/linbox/algorithms/dense-nullspace.h
index 082066d..5eacfdf 100644
--- a/linbox/algorithms/dense-nullspace.h
+++ b/linbox/algorithms/dense-nullspace.h
@@ -1,5 +1,5 @@
/* Copyright (C) 2010 LinBox
- * Written by <brice.boyer at imag.fr>
+ * Written by Brice Boyer (briceboyer) <boyer.brice at gmail.com>
*
*
*
@@ -36,37 +36,13 @@
#define __LINBOX_dense_nullspace_H
-#include "linbox/algorithms/linbox-tags.h"
-#include "linbox/matrix/blas-matrix.h"
+#include "linbox/linbox-tags.h"
+#include "linbox/matrix/dense-matrix.h"
namespace LinBox
{
- /** Computes the kernel of a dense matrix using \c LQUP.
- *
- * Acccording to the dimensions of the input matrix, we chose different methods.
- * @warning timings may vary and these choices were made on an experimental basis.
- *
- * @param F Field
- * @param Side left or right from \c LinBox::SideTag
- * @param m rows
- * @param n cols
- * @param A input matrix
- * @param lda leading dimension of A
- * @param Ker Kernel. \c NULL if \c kerdim==0
- * @param ldk leading dimension of the kernel.
- * @param kerdim dimension of the kernel.
- * @return dimension of the kernel.
- *
- * @warning A is modified.
- */
- template<class Field>
- size_t
- NullSpaceBasis (const Field& F, const LinBoxTag::Side Side,
- const size_t & m, const size_t & n,
- typename Field::Element * A, const size_t & lda,
- typename Field::Element *& Ker, size_t& ldk,
- size_t & kerdim) ;
+
/*! Nullspace of a dense matrix on a finite field.
* A is modified.
@@ -76,14 +52,24 @@ namespace LinBox
* @param[out] Ker Nullspace of the matrix (Allocated in the routine)
* @param[out] kerdim rank of the kernel
* @return \p kerdim
+ *
+ * @todo make it work for BlasSubmatrix too
*/
template<class Field>
size_t&
- NullSpaceBasis (const Field& F, const LinBoxTag::Side Side,
- BlasMatrix<typename Field::Element> & A,
- BlasMatrix<typename Field::Element> & Ker,
+ NullSpaceBasisIn (const LINBOX_enum(Tag::Side) Side,
+ BlasMatrix<Field> & A,
+ BlasMatrix<Field> & Ker,
size_t & kerdim) ;
+ template<class DenseMat>
+ size_t&
+ NullSpaceBasisIn (const LINBOX_enum(Tag::Side) Side,
+ BlasSubmatrix<DenseMat> & A,
+ BlasMatrix<typename DenseMat::Field> & Ker,
+ size_t & kerdim) ;
+
+
/*! Nullspace of a dense matrix on a finite field.
* A is preserved.
* @param F field
@@ -92,18 +78,23 @@ namespace LinBox
* @param[out] Ker Nullspace of the matrix (Allocated in the routine)
* @param[out] kerdim rank of the kernel
* @return \p kerdim
+ *
+ * @todo make it work for BlasSubmatrix too
*/
template<class Field>
size_t&
- NullSpaceBasis (const Field& F, const LinBoxTag::Side Side,
- const BlasMatrix<typename Field::Element> & A,
- BlasMatrix<typename Field::Element> & Ker,
- size_t & kerdim)
- {
- BlasMatrix<typename Field::Element> B (A);
- return NullSpaceBasis<Field>(F,Side,B,Ker,kerdim);
+ NullSpaceBasis (const LINBOX_enum(Tag::Side) Side,
+ const BlasMatrix<Field> & A,
+ BlasMatrix<Field> & Ker,
+ size_t & kerdim) ;
+
+ template<class DenseMat>
+ size_t&
+ NullSpaceBasis (const LINBOX_enum(Tag::Side) Side,
+ const BlasSubmatrix<DenseMat> & A,
+ BlasMatrix<typename DenseMat::Field> & Ker,
+ size_t & kerdim);
- }
} // LinBox
@@ -113,11 +104,10 @@ namespace LinBox
#endif // __LINBOX_dense_nullspace_H
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
// Local Variables:
// mode: C++
// tab-width: 8
// indent-tabs-mode: nil
// c-basic-offset: 8
// End:
-
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/algorithms/dense-nullspace.inl b/linbox/algorithms/dense-nullspace.inl
index 87e5184..bbb2844 100644
--- a/linbox/algorithms/dense-nullspace.inl
+++ b/linbox/algorithms/dense-nullspace.inl
@@ -1,5 +1,5 @@
/* Copyright (C) 2010 LinBox
- * Written by <brice.boyer at imag.fr>
+ * Written by Brice Boyer (briceboyer) <boyer.brice at gmail.com>
*
*
*
@@ -25,438 +25,353 @@
#ifndef __LINBOX_dense_nullspace_INL
#define __LINBOX_dense_nullspace_INL
-#include "linbox/matrix/blas-matrix.h"
+#include "linbox/matrix/dense-matrix.h"
#include "fflas-ffpack/ffpack/ffpack.h" // LU
#include "fflas-ffpack/fflas/fflas.h" // trsm
-//#include "Matio.h" // write_field ;
+#include <fflas-ffpack/utils/Matio.h> // write_field ;
#include <iostream>
#include <cassert>
namespace LinBox
{
- /**
- * @brief
- *
- * @param F
- * @param Z
- * @param ldZ
- * @param lig1
- * @param col1
- * @param lig2
- * @param col2
- */
- template <class Field >
- void Zero(const Field & F,
- typename Field::Element * Z, const size_t ldZ,
- const size_t lig1, const size_t col1,
- const size_t lig2, const size_t col2)
- {
- assert(lig1<lig2);
- assert(col1<col2);
- assert(col2<=ldZ);
- typename Field::Element zero;
- F.init(zero,0UL);
-
- for (size_t i = lig1 ; i < lig2 ; ++i)
- for (size_t j = col1; j < col2 ; ++j) // F.assign(*(Id+i*ldI+j),zero)
- *(Z+i*ldZ+j) = zero ;
- return;
- }
-
-
- /*! Creates identity matrix in \p F of size \p dim1 \p x \p dim2.
- * @warning diag_num peut être < 0 !
- * @bug long et size_t ne cohabitent pas bien.
- */
- template <class Field >
- void Identity(const Field & F,
- typename Field::Element * Id, const size_t ldI,
- const size_t lig1, const size_t col1,
- const size_t lig2, const size_t col2)
- {
- assert(lig1<lig2);
- assert(col1<col2);
- assert(col2<=ldI);
- typename Field::Element one,zero;
- F.init(one,1UL);
- F.init(zero,0UL);
- for (size_t i = lig1 ; i < lig2 ; ++i)
- for (size_t j = col1; j < col2 ; ++j) // F.assign(*(Id+i*ldI+j),zero)
- *(Id+i*ldI+j) = zero ;
- // Zero(F,Id,ldI,lig1,col1,lig2,col2);
- size_t nb_un = std::min(col2-col1,lig2-lig1)-1;
-
- typename Field::Element * Un_ici = Id+lig1*ldI+col1 ;
- for (size_t i = 0 ; i < nb_un ; ++i){
- *(Un_ici) = one ;
- Un_ici += ldI ;
- ++Un_ici;
+ namespace Protected {
+
+ /**
+ * @brief
+ *
+ * @param F
+ * @param Z
+ * @param ldZ
+ * @param lig1
+ * @param col1
+ * @param lig2
+ * @param col2
+ */
+ template <class Field >
+ void Zero(const Field & F,
+ typename Field::Element * Z, const size_t ldZ,
+ const size_t lig1, const size_t col1,
+ const size_t lig2, const size_t col2)
+ {
+ assert(lig1<lig2);
+ assert(col1<col2);
+ assert(col2<=ldZ);
+
+ //! @todo use fzero
+ for (size_t i = lig1 ; i < lig2 ; ++i)
+ for (size_t j = col1; j < col2 ; ++j) // F.assign(*(Id+i*ldI+j),zero)
+ *(Z+i*ldZ+j) = F.zero ;
+ return;
}
- *(Un_ici) = one ;
- return;
- }
- /*!
- * @brief The right or left nullspace (kernel or cokernel) of a matrix A
- * We use the LU decomposition
- * @param F the field in which \p A lives
- * @param A is a matrix whose nullspace we look for.
- * @param M number of lines in \p A
- * @param N number of column of \p A
- * @param lda the leading dimension of matrix \p A
- * @param ker_dim the dimension of the kernel
- * @tparam Field -
- * @return a matrix of leading dimension ker_dim whose column vectors span the nullspace of A. Returns \p NULL (and not \f$\mathbf{0}\f$) if <code> ker_dim == 0 </code>.
- */
- template<class Field>
- typename Field::Element *
- RightNullspaceDirect ( const Field & F, // in place
- typename Field::Element * A,
- const size_t & M, // rows
- const size_t & N, // colm
- const size_t & lda, // leading dimension
- //typename Field::Element &* V ,
- size_t & ker_dim )
- {
- size_t *P = new size_t[N];
- size_t *Qt = new size_t[M];
- size_t R = FFPACK::LUdivine ((typename Field::Father_t)F, FFLAS::FflasNonUnit, FFLAS::FflasNoTrans,
- M, N, A, lda, P, Qt, FFPACK::FfpackLQUP);
- delete[] Qt;
-
- ker_dim = N-R ; // dimension of kernel
- if (ker_dim == 0) {
- delete[] P ;
- return NULL ; // only 0 in kernel
- }
- typename Field::Element * V = new typename Field::Element[ker_dim*N]; // Result here.
- size_t ldV = ker_dim ;
- if (R == 0) {
- delete[] P ;
- Identity(F,V,ldV,0,0,N,ker_dim);
- return V ;
- }
-
- for (size_t i = 0 ; i < R ; ++i) // V <- U2
- FFLAS::fcopy ((typename Field::Father_t)F, ker_dim, V + i * ldV, 1, A + R + i*lda, 1);
- typename Field::Element one ;
- F.init(one,1UL);
- FFLAS::ftrsm((typename Field::Father_t)F, FFLAS::FflasLeft, FFLAS::FflasUpper,
- FFLAS::FflasNoTrans, FFLAS::FflasNonUnit,
- R, ker_dim, one, A, lda , V, ldV) ; // (V = U2, A = U1) : U2 <- inv(U1)*U2 ;
-
- typename Field::Element minus_one, zero;
- F.init(zero,0UL);
- F.neg(minus_one, one);
- for ( size_t i = R ; i < N; ++i){ // filling the rest of V with -Id
- for (size_t j = 0 ; j < ker_dim ; ++j)
- *(V+ker_dim*i+j) = zero ;
- *(V+ker_dim*i+i-R) = minus_one ;
- /* // FIXME : faster ?
- for (size_t j = 0 ; j < ker_dim ; ++j) {
-
- if (i-R == j)
- *(V+ker_dim*i+j) = minus_one ;
- else
- *(V+ker_dim*i+j) = zero ;
- }
- */
-
+ /*! Creates identity matrix in \p F of size \p dim1 \p x \p dim2.
+ * @warning diag_num peut être < 0 !
+ * @bug long et size_t ne cohabitent pas bien.
+ */
+ template <class Field >
+ void Identity(const Field & F,
+ typename Field::Element * Id, const size_t ldI,
+ const size_t lig1, const size_t col1,
+ const size_t lig2, const size_t col2)
+ {
+ assert(lig1<lig2);
+ assert(col1<col2);
+ assert(col2<=ldI);
+ for (size_t i = lig1 ; i < lig2 ; ++i)
+ for (size_t j = col1; j < col2 ; ++j) // F.assign(*(Id+i*ldI+j),zero)
+ *(Id+i*ldI+j) = F.zero ;
+ // Zero(F,Id,ldI,lig1,col1,lig2,col2);
+ size_t nb_un = std::min(col2-col1,lig2-lig1)-1;
+
+ typename Field::Element * Un_ici = Id+lig1*ldI+col1 ;
+ for (size_t i = 0 ; i < nb_un ; ++i){
+ *(Un_ici) = F.one ;
+ Un_ici += ldI ;
+ ++Un_ici;
+ }
+ *(Un_ici) = F.one ;
+ return;
}
- FFPACK::applyP((typename Field::Father_t)F, FFLAS::FflasLeft, FFLAS::FflasTrans,
- ker_dim, 0, (int)R, V, ldV , P); // X = P^{-1}V
- delete[] P;
- return V;
-
- }
-
- template<class Field>
- typename Field::Element *
- RightNullspaceIndirect ( const Field & F, // in place
- typename Field::Element * A,
- const size_t & M, // rows
- const size_t & N, // colm
- const size_t & lda, // leading dimension
- //typename Field::Element &* V ,
- size_t & ker_dim )
- {
- size_t *P = new size_t[M];
- size_t *Qt = new size_t[N];
- size_t R = FFPACK::LUdivine ((typename Field::Father_t)F, FFLAS::FflasNonUnit, FFLAS::FflasTrans,
- M, N, A, lda, P, Qt, FFPACK::FfpackLQUP);
- // write_field (F, std::cout<<"ALU :="<<std::endl, A, M, N, N, true);
- // PrintLQUP (F,FFLAS::FflasNonUnit,FFLAS::FflasTrans,M,N,A,R,std::cout<<"L.Q.U.P"<<std::endl,Qt,P,true);
+ /*!
+ * @brief The right or left nullspace (kernel or cokernel) of a matrix A
+ * We use the LU decomposition
+ * @param F the field in which \p A lives
+ * @param A is a matrix whose nullspace we look for.
+ * @param M number of lines in \p A
+ * @param N number of column of \p A
+ * @param lda the leading dimension of matrix \p A
+ * @param ker_dim the dimension of the kernel
+ * @tparam Field -
+ * @return a matrix of leading dimension ker_dim whose column vectors span the nullspace of A. Returns \p NULL (and not \f$\mathbf{0}\f$) if <code> ker_dim == 0 </code>.
+ */
+ template<class Field>
+ typename Field::Element *
+ RightNullspaceDirect ( const Field & F, // in place
+ typename Field::Element * A,
+ const size_t & M, // rows
+ const size_t & N, // colm
+ const size_t & lda, // leading dimension
+ //typename Field::Element &* V ,
+ size_t & ker_dim )
+ {
+ typename Field::Element * NS;
+ FFPACK::NullSpaceBasis(F, FFLAS::FflasRight, M, N, A, lda, NS, ker_dim);
+ return NS ;
- // std::cout << "ker_dim = " << ker_dim << std::endl;
+ }
- delete[] P;
+ template<class Field>
+ typename Field::Element *
+ RightNullspaceIndirect ( const Field & F, // in place
+ typename Field::Element * A,
+ const size_t & M, // rows
+ const size_t & N, // colm
+ const size_t & lda, // leading dimension
+ //typename Field::Element &* V ,
+ size_t & ker_dim )
+ {
+ size_t *P = new size_t[M];
+ size_t *Qt = new size_t[N];
+ size_t R = FFPACK::LUdivine (F, FFLAS::FflasNonUnit, FFLAS::FflasTrans,
+ M, N, A, lda, P, Qt);//, FFPACK::FfpackLQUP);
+
+
+ // write_field (F, std::cout<<"ALU :="<<std::endl, A, M, N, N, true);
+ // PrintLQUP (F,FFLAS::FflasNonUnit,FFLAS::FflasTrans,M,N,A,R,std::cout<<"L.Q.U.P"<<std::endl,Qt,P,true);
+
+ // std::cout << "ker_dim = " << ker_dim << std::endl;
+
+ delete[] P;
+
+ ker_dim = N-R ; // dimension of kernel
+ if (ker_dim == 0) {
+ delete[] Qt ;
+ return NULL ; // only 0 in kernel
+ }
+ size_t ldV = ker_dim ;
+ typename Field::Element * V = new typename Field::Element[ker_dim*N]; // Result here.
+ if (R == 0) {
+ delete[] Qt ;
+ Identity(F,V,ker_dim,0,0,N,ker_dim);
+ return V ;
+ }
- ker_dim = N-R ; // dimension of kernel
- if (ker_dim == 0) {
- delete[] Qt ;
- return NULL ; // only 0 in kernel
- }
- size_t ldV = ker_dim ;
- typename Field::Element * V = new typename Field::Element[ker_dim*N]; // Result here.
- if (R == 0) {
- delete[] Qt ;
- Identity(F,V,ker_dim,0,0,N,ker_dim);
- return V ;
- }
+ //////////////////////////
- //////////////////////////
+ Zero (F,V,ldV,0,0,R,ker_dim);
+ Identity(F,V,ldV,R,0,N,ker_dim);
+ // write_field (F, std::cout<<"V init ="<<std::endl, V, N, ker_dim, ker_dim,true);
+ FFPACK::applyP(F, FFLAS::FflasLeft, FFLAS::FflasNoTrans,
+ ker_dim, 0, (int)R, V, ldV, Qt); // V = Q V
- Zero (F,V,ldV,0,0,R,ker_dim);
- Identity(F,V,ldV,R,0,N,ker_dim);
- // write_field (F, std::cout<<"V init ="<<std::endl, V, N, ker_dim, ker_dim,true);
- FFPACK::applyP((typename Field::Father_t)F, FFLAS::FflasLeft, FFLAS::FflasNoTrans,
- ker_dim, 0, (int)R, V, ldV, Qt); // V = Q V
+ // write_field (F, std::cout<<"V reordered ="<<std::endl, V, N,ker_dim, ker_dim,true);
- // write_field (F, std::cout<<"V reordered ="<<std::endl, V, N,ker_dim, ker_dim,true);
+ // actually we just select a line in the inverse of L.
+ //size_t wda = M ;
- // actually we just select a line in the inverse of L.
- //size_t wda = M ;
- typename Field::Element one, zero;
- F.init(zero,0UL);
- F.init(one,1UL);
- // F.neg(minus_one, one);
+ if (N <= M) { // on a de la place...
+ for ( size_t i=0; i< M; ++i ) {
+ size_t j = 0 ;
+ for ( ; j<std::min(i,N); ++j )
+ *(A+i*N+j) = F.zero;
+ if (i==j)
+ *(A+i*N+j) = F.zero;
+ }
- if (N <= M) { // on a de la place...
- for ( size_t i=0; i< M; ++i ) {
- size_t j = 0 ;
- for ( ; j<std::min(i,N); ++j )
- *(A+i*N+j) = zero;
- if (i==j)
- *(A+i*N+j) = zero;
+ //FFPACK::applyP( F, FFLAS::FflasRight, FFLAS::FflasNoTrans, M,0,M, A, N, Q );
+ FFPACK::applyP( F, FFLAS::FflasLeft, FFLAS::FflasNoTrans,
+ N,0,(int)N, A, N, Qt );
+ for ( size_t i=0; i< N; ++i )
+ *(A+N*i+i) = F.one ;
+
+ //write_field (F, std::cout<<"A avant trsm ="<<std::endl, A, M, N, N,true);
+ FFLAS::ftrsm(F, FFLAS::FflasLeft, FFLAS::FflasUpper,
+ FFLAS::FflasNoTrans, FFLAS::FflasUnit,
+ N, ker_dim, F.one, A, lda , V, ldV) ; // V = inv(Lower) V ;
+ //write_field (F, std::cout<<"V if after trsm ="<<std::endl, V, N,ker_dim, ker_dim,true);
}
-
- //FFPACK::applyP((typename Field::Father_t) F, FFLAS::FflasRight, FFLAS::FflasNoTrans, M,0,M, A, N, Q );
- FFPACK::applyP((typename Field::Father_t) F, FFLAS::FflasLeft, FFLAS::FflasNoTrans,
- N,0,(int)N, A, N, Qt );
- for ( size_t i=0; i< N; ++i )
- *(A+N*i+i) = one ;
-
- //write_field (F, std::cout<<"A avant trsm ="<<std::endl, A, M, N, N,true);
- FFLAS::ftrsm((typename Field::Father_t)F, FFLAS::FflasLeft, FFLAS::FflasUpper,
- FFLAS::FflasNoTrans, FFLAS::FflasUnit,
- N, ker_dim, one, A, lda , V, ldV) ; // V = inv(Lower) V ;
- //write_field (F, std::cout<<"V if after trsm ="<<std::endl, V, N,ker_dim, ker_dim,true);
- }
- else { // N > M we can't ftrsm because we can't add 0's to the lower part...
- typename Field::Element * L = new typename Field::Element[N*N]; // L_inf
- // début de L
- size_t i = 0 ;
- for ( ; i< M; ++i ){
- size_t j=0;
- for (; j< std::min(i,N) ; ++j )
- *(L+i*N+j) = zero ;
- if (i==j) {
- *(L+i*N+j) = zero ;
- j++;
- for (; j<N; ++j )
- *(L+i*N+j) = *(A+N*i+j);
+ else { // N > M we can't ftrsm because we can't add 0's to the lower part...
+ typename Field::Element * L = new typename Field::Element[N*N]; // L_inf
+ // début de L
+ size_t i = 0 ;
+ for ( ; i< M; ++i ){
+ size_t j=0;
+ for (; j< std::min(i,N) ; ++j )
+ *(L+i*N+j) = F.zero ;
+ if (i==j) {
+ *(L+i*N+j) = F.zero ;
+ j++;
+ for (; j<N; ++j )
+ *(L+i*N+j) = *(A+N*i+j);
+ }
}
+ for ( ; i< N; ++i )
+ for (size_t j = 0 ; j<N; ++j )
+ *(L+i*N+j) = F.zero ;
+
+ FFPACK::applyP( F, FFLAS::FflasLeft, FFLAS::FflasNoTrans,
+ N,0,(int)R, L, N, Qt );
+ for ( size_t ii=0; ii< N; ++ii )
+ *(L+N*ii+ii) = F.one ;
+ // fin de L.
+ //write_field (F, std::cout<<"U_1="<<std::endl, L, M, M, M,true);
+ FFLAS::ftrsm(F, FFLAS::FflasLeft, FFLAS::FflasUpper,
+ FFLAS::FflasNoTrans, FFLAS::FflasUnit,
+ N, ker_dim, F.one, L, N , V, ldV); // V = inv(Lower) V ;
+
+ // write_field (F, std::cout<<"V else after trsm ="<<std::endl, V, N,ker_dim, ker_dim,true);
+
+ delete[] L;
}
- for ( ; i< N; ++i )
- for (size_t j = 0 ; j<N; ++j )
- *(L+i*N+j) = zero ;
-
- FFPACK::applyP((typename Field::Father_t) F, FFLAS::FflasLeft, FFLAS::FflasNoTrans,
- N,0,(int)R, L, N, Qt );
- for ( size_t ii=0; ii< N; ++ii )
- *(L+N*ii+ii) = one ;
- // fin de L.
- //write_field (F, std::cout<<"U_1="<<std::endl, L, M, M, M,true);
- FFLAS::ftrsm((typename Field::Father_t)F, FFLAS::FflasLeft, FFLAS::FflasUpper,
- FFLAS::FflasNoTrans, FFLAS::FflasUnit,
- N, ker_dim, one, L, N , V, ldV); // V = inv(Lower) V ;
-
- // write_field (F, std::cout<<"V else after trsm ="<<std::endl, V, N,ker_dim, ker_dim,true);
-
- delete[] L;
- }
- //write_field (F, std::cout<<"V final ="<<std::endl, V, ker_dim, M, M,true);
- delete[] Qt ;
- return V;
-
- }
+ //write_field (F, std::cout<<"V final ="<<std::endl, V, ker_dim, M, M,true);
+ delete[] Qt ;
+ return V;
- template<class Field>
- typename Field::Element *
- LeftNullspaceIndirect ( const Field & F, // in place
- typename Field::Element * A,
- const size_t & M, // rows
- const size_t & N, // colm
- const size_t & lda, // leading dimension
- //typename Field::Element &* V ,
- size_t & coker_dim )
- {
- size_t *P = new size_t[M];
- size_t *Qt = new size_t[N];
- size_t R = FFPACK::LUdivine ((typename Field::Father_t)F, FFLAS::FflasNonUnit, FFLAS::FflasTrans,
- M, N, A, lda, P, Qt, FFPACK::FfpackLQUP);
- delete[] Qt;
-
- coker_dim = M-R ; // dimension of kernel
- if (coker_dim == 0) {
- delete[] P ;
- return NULL ; // only 0 in kernel
- }
- size_t ldV = M ;
- typename Field::Element * V = new typename Field::Element[coker_dim*M]; // Result here.
- if (R == 0) {
- delete[] P ;
- Identity(F,V,ldV,0,0,coker_dim,M);
- return V ;
}
- for (size_t i = 0 ; i < coker_dim ; ++i) // copy U2 to result V before updating with U1
- FFLAS::fcopy ((typename Field::Father_t)F, R, V + i * ldV, 1, A + (R + i)*lda, 1);
- typename Field::Element one, minus_one ;
- F.init(one,1UL);
- F.neg(minus_one, one);
- FFLAS::ftrsm((typename Field::Father_t)F, FFLAS::FflasRight, FFLAS::FflasLower,
- FFLAS::FflasNoTrans, FFLAS::FflasNonUnit,
- coker_dim, R, minus_one, A, lda , V, ldV) ; // V = U2 ; A = U1 ; U2 <- inv(U1)*U2 ;
-
- typename Field::Element zero;
- F.init(zero,0UL);
- Identity(F,V,ldV,0,R,coker_dim,M);
-#if 0
- for ( size_t i = 0 ; i < coker_dim ; ++i){ /* filling the rest of V with minus identity */
- for (size_t j = R ; j < M ; ++j)
- *(V+i*M+j) = zero ;
- *(V+i*M+i+R) = one ;
-#if 0 /* FIXME : faster ? */
- for (size_t j = R ; j < M ; ++j) {
- if (j == i+R)
- *(V+M*i+j) = one ;
- else
- *(V+M*i+j) = zero ;
- }
-#endif
+ template<class Field>
+ typename Field::Element *
+ LeftNullspaceIndirect ( const Field & F, // in place
+ typename Field::Element * A,
+ const size_t & M, // rows
+ const size_t & N, // colm
+ const size_t & lda, // leading dimension
+ //typename Field::Element &* V ,
+ size_t & coker_dim )
+ {
+ typename Field::Element * NS;
+ FFPACK::NullSpaceBasis(F, FFLAS::FflasLeft, M, N, A, lda, NS, coker_dim);
+ return NS ;
}
-#endif
-
- FFPACK::applyP((typename Field::Father_t)F, FFLAS::FflasRight, FFLAS::FflasNoTrans,
- coker_dim, 0,(int) R, V, ldV , P); // X = P^{-1}V
- delete[] P;
- return V;
-
- }
- // directement à gauche (X LQUP noyau de U puis invQ invL...)
- template<class Field>
- typename Field::Element *
- LeftNullspaceDirect ( const Field & F, // in place
- typename Field::Element * A,
- const size_t & M, // rows
- const size_t & N, // colm
- const size_t & lda, // leading dimension
- size_t & coker_dim)
- {
-
- size_t *P = new size_t[N];
- size_t *Q = new size_t[M];
-
- //write_field (F, std::cout<<"A avant LU ="<<std::endl, A, M, N, N, true);
- size_t R = FFPACK::LUdivine ((typename Field::Father_t)F, FFLAS::FflasNonUnit, FFLAS::FflasNoTrans,
- M, N, A, lda, P, Q, FFPACK::FfpackLQUP);
- assert(R<=std::min(M,N));
-
- //write_field (F, std::cout<<"ALU :="<<std::endl, A, M, N, N, true);
- //PrintLapackPermutation(P,N,std::cout<<"Permutation P := ");
- //PrintPermutation(F , FFLAS::FflasNoTrans, P, N, 0, N, std::cout, true);
- //PrintLapackPermutation(Q,M,std::cout<<"Permutation Q := ");
- //PrintPermutation(F , FFLAS::FflasTrans, Q, M, 0, M, std::cout, true);
- //PrintLQUP (F,FFLAS::FflasUnit,FFLAS::FflasNoTrans,M,N,A,R,std::cout<<"L.Q.U.P"<<std::endl,Q,P,true);
- coker_dim = M -R ; // dimension of co-kernel.
- //std::cout << "coker_dim = " << coker_dim << std::endl;
- delete[] P; // on s'en fout de P !
- if (coker_dim == 0){
- delete[] Q ;
- return NULL; // CoKernel is \f$\{\mathbf{0}_n\}\f$
- }
+ // directement à gauche (X LQUP noyau de U puis invQ invL...)
+ template<class Field>
+ typename Field::Element *
+ LeftNullspaceDirect ( const Field & F, // in place
+ typename Field::Element * A,
+ const size_t & M, // rows
+ const size_t & N, // colm
+ const size_t & lda, // leading dimension
+ size_t & coker_dim)
+ {
+
+ size_t *P = new size_t[N];
+ size_t *Q = new size_t[M];
+
+ //write_field (F, std::cout<<"A avant LU ="<<std::endl, A, M, N, N, true);
+ size_t R = FFPACK::LUdivine (F, FFLAS::FflasNonUnit, FFLAS::FflasNoTrans,
+ M, N, A, lda, P, Q);//, FFPACK::FfpackLQUP);
+ assert(R<=std::min(M,N));
+
+ //write_field (F, std::cout<<"ALU :="<<std::endl, A, M, N, N, true);
+ //PrintLapackPermutation(P,N,std::cout<<"Permutation P := ");
+ //PrintPermutation(F , FFLAS::FflasNoTrans, P, N, 0, N, std::cout, true);
+ //PrintLapackPermutation(Q,M,std::cout<<"Permutation Q := ");
+ //PrintPermutation(F , FFLAS::FflasTrans, Q, M, 0, M, std::cout, true);
+ //PrintLQUP (F,FFLAS::FflasUnit,FFLAS::FflasNoTrans,M,N,A,R,std::cout<<"L.Q.U.P"<<std::endl,Q,P,true);
+ coker_dim = M -R ; // dimension of co-kernel.
+ //std::cout << "coker_dim = " << coker_dim << std::endl;
+ delete[] P; // on s'en fout de P !
+ if (coker_dim == 0){
+ delete[] Q ;
+ return NULL; // CoKernel is \f$\{\mathbf{0}_n\}\f$
+ }
- typename Field::Element one, zero ; // 1,0 dans le corps
- F.init(one,1UL);
- F.init(zero,0UL);
- size_t ldV = M ;
- typename Field::Element * V = new typename Field::Element[coker_dim * M]; // le résultat sera ici.
- if (R == 0) {
- delete[] Q ;
- Identity(F,V,ldV,0,0,coker_dim,M);
- return V ;
- }
- Zero (F,V,ldV,0,0,coker_dim,R);
- Identity(F,V,ldV,0,R,coker_dim,M);
- // write_field (F, std::cout<<"V init ="<<std::endl, V, coker_dim, M, M,true);
- FFPACK::applyP((typename Field::Father_t)F, FFLAS::FflasRight, FFLAS::FflasNoTrans,
- coker_dim, 0, (int)R, V, ldV, Q); // V = V tQ
-
- //write_field (F, std::cout<<"V reordered ="<<std::endl, V, coker_dim, M, M,true);
-
- // actually we just select a line in the inverse of L.
- //size_t wda = M ;
- if (M <= N) {
- for ( size_t i=0; i< M; ++i )
- for (size_t j = i ; j<N; ++j )
- *(A+i*N+j) = zero;
-
- FFPACK::applyP((typename Field::Father_t) F, FFLAS::FflasRight, FFLAS::FflasNoTrans,
- M,0,(int)M, A, N, Q );
- for ( size_t i=0; i< M; ++i )
- *(A+N*i+i) = one ;
-
- //write_field (F, std::cout<<"A avant trsm ="<<std::endl, A, M, N, N,true);
- FFLAS::ftrsm((typename Field::Father_t)F, FFLAS::FflasRight, FFLAS::FflasLower,
- FFLAS::FflasNoTrans, FFLAS::FflasUnit,
- coker_dim , M , one, A, lda , V, ldV) ; // V = V inv(Lower) ;
- }
- else { // M > N we can't ftrsm because we can't add 0's to the lower part...
- typename Field::Element * L = new typename Field::Element[M*M]; // L_inf
-
- for ( size_t i=0; i< M; ++i ){ // copying A_inf to L
- size_t j=0;
- for (; j< std::min(i,N) ; ++j )
- *(L+i*M+j) = *(A+N*i+j);
- for (; j<M; ++j )
- *(L+i*M+j) = zero;
+ size_t ldV = M ;
+ typename Field::Element * V = new typename Field::Element[coker_dim * M]; // le résultat sera ici.
+ if (R == 0) {
+ delete[] Q ;
+ Identity(F,V,ldV,0,0,coker_dim,M);
+ return V ;
}
- FFPACK::applyP((typename Field::Father_t) F, FFLAS::FflasRight, FFLAS::FflasNoTrans,
- M,0,(int)R, L, M, Q );
- for ( size_t i=0; i< M; ++i )
- *(L+M*i+i) = one ;
+ Zero (F,V,ldV,0,0,coker_dim,R);
+ Identity(F,V,ldV,0,R,coker_dim,M);
+ // write_field (F, std::cout<<"V init ="<<std::endl, V, coker_dim, M, M,true);
+ FFPACK::applyP(F, FFLAS::FflasRight, FFLAS::FflasNoTrans,
+ coker_dim, 0, (int)R, V, ldV, Q); // V = V tQ
+
+ //write_field (F, std::cout<<"V reordered ="<<std::endl, V, coker_dim, M, M,true);
+
+ //size_t wda = M ;
+ if (M <= N) {
+ for ( size_t i=0; i< M; ++i )
+ for (size_t j = i ; j<N; ++j )
+ *(A+i*N+j) = F.zero;
+
+ FFPACK::applyP( F, FFLAS::FflasRight, FFLAS::FflasNoTrans,
+ M,0,(int)M, A, N, Q );
+ for ( size_t i=0; i< M; ++i )
+ *(A+N*i+i) = F.one ;
+
+ //write_field (F, std::cout<<"A avant trsm ="<<std::endl, A, M, N, N,true);
+ FFLAS::ftrsm(F, FFLAS::FflasRight, FFLAS::FflasLower,
+ FFLAS::FflasNoTrans, FFLAS::FflasUnit,
+ coker_dim , M , F.one, A, lda , V, ldV) ; // V = V inv(Lower) ;
+ }
+ else { // M > N we can't ftrsm because we can't add 0's to the lower part...
+ typename Field::Element * L = new typename Field::Element[M*M]; // L_inf
+
+ for ( size_t i=0; i< M; ++i ){ // copying A_inf to L
+ size_t j=0;
+ for (; j< std::min(i,N) ; ++j )
+ *(L+i*M+j) = *(A+N*i+j);
+ for (; j<M; ++j )
+ *(L+i*M+j) = F.zero;
+ }
+ FFPACK::applyP( F, FFLAS::FflasRight, FFLAS::FflasNoTrans,
+ M,0,(int)R, L, M, Q );
+ for ( size_t i=0; i< M; ++i )
+ *(L+M*i+i) = F.one ;
- //write_field (F, std::cout<<"U_1="<<std::endl, L, M, M, M,true);
- FFLAS::ftrsm((typename Field::Father_t)F, FFLAS::FflasRight, FFLAS::FflasLower,
- FFLAS::FflasNoTrans, FFLAS::FflasUnit,
- coker_dim , M , one, L, M , V, ldV) ; // V = V inv(Lower) ;
+ //write_field (F, std::cout<<"U_1="<<std::endl, L, M, M, M,true);
+ FFLAS::ftrsm(F, FFLAS::FflasRight, FFLAS::FflasLower,
+ FFLAS::FflasNoTrans, FFLAS::FflasUnit,
+ coker_dim , M , F.one, L, M , V, ldV) ; // V = V inv(Lower) ;
- delete[] L;
+ delete[] L;
+ }
+ //write_field (F, std::cout<<"V final ="<<std::endl, V, coker_dim, M, M,true);
+ delete[] Q ;
+ return V;
}
- //write_field (F, std::cout<<"V final ="<<std::endl, V, coker_dim, M, M,true);
- delete[] Q ;
- return V;
- }
-
+ } // Protected
+
+ /** Computes the kernel of a dense matrix using \c LQUP.
+ *
+ * Acccording to the dimensions of the input matrix, we chose different methods.
+ * @warning timings may vary and these choices were made on an experimental basis.
+ *
+ * @param F Field
+ * @param Side left or right from \c LinBox::SideTag
+ * @param m rows
+ * @param n cols
+ * @param A input matrix
+ * @param lda leading dimension of A
+ * @param Ker Kernel. \c NULL if \c kerdim==0
+ * @param ldk leading dimension of the kernel.
+ * @param kerdim dimension of the kernel.
+ * @return dimension of the kernel.
+ *
+ * @warning A is modified.
+ */
template<class Field>
size_t
- NullSpaceBasis (const Field& F, const LinBoxTag::Side Side,
+ NullSpaceBasisIn ( const Field & F, const LINBOX_enum(Tag::Side) Side,
const size_t & m, const size_t & n,
typename Field::Element * A, const size_t & lda,
typename Field::Element *& Ker, size_t& ldk,
size_t & kerdim)
{
- if (Side == LinBoxTag::Right){
+#if 0
+ if (Side == Tag::Side::Right){
if (m < n)
Ker = RightNullspaceDirect(F,A,m,n,lda,kerdim) ;
else
@@ -471,43 +386,88 @@ namespace LinBox
Ker = LeftNullspaceIndirect(F,A,m,n,lda,kerdim) ;
ldk = m;
}
+#else
+
+ FFPACK::NullSpaceBasis ( F, (FFLAS::FFLAS_SIDE) Side,
+ m,n, A, lda, Ker, ldk, kerdim);
+#endif
return kerdim;
}
- template<class Field>
+
+ //!@todo uses too much memory
+ template<class DenseMat>
size_t&
- NullSpaceBasis (const Field& F, const LinBoxTag::Side Side,
- BlasMatrix<typename Field::Element> & A,
- BlasMatrix<typename Field::Element> & Ker,
+ NullSpaceBasisIn (const LINBOX_enum(Tag::Side) Side,
+ BlasSubmatrix<DenseMat> & A,
+ BlasMatrix<typename DenseMat::Field> & Ker,
size_t & kerdim)
{
+ typedef typename DenseMat::Field Field;
+
typename Field::Element * Ker_ptr;
size_t ldk;
- NullSpaceBasis(F,Side,A.rowdim(),A.coldim(), A.getWritePointer(),A.getStride(), Ker_ptr,ldk,kerdim);
- if (Side == LinBoxTag::Right){
- Ker = BlasMatrix<typename Field::Element>(A.rowdim(),kerdim);
+ NullSpaceBasisIn(A.field(),Side,A.rowdim(),A.coldim(), A.getWritePointer(),A.getStride(), Ker_ptr,ldk,kerdim);
+ if (Side == Tag::Side::Right){
+ Ker.resize(A.coldim(),kerdim);
}
else {
- Ker = BlasMatrix<typename Field::Element>(kerdim,A.coldim());
+ assert(Side == Tag::Side::Left);
+ Ker.resize(kerdim,A.rowdim());
}
- //! @todo this is slow : use a constructor from Ker ?
- for(typename BlasMatrix<typename Field::Element>::Iterator it=Ker.Begin(); it!= Ker.End(); ++it,++Ker_ptr)
- *it=*Ker_ptr;
+ //! @todo use copy
+ const typename Field::Element * Ker_ptri = Ker_ptr;
+ for(typename BlasMatrix<Field>::Iterator it=Ker.Begin(); it!= Ker.End(); ++it,++Ker_ptri)
+ A.field().assign(*it,*Ker_ptri);
+
delete[] Ker_ptr ;
+
return kerdim;
}
+ template<class Field>
+ size_t&
+ NullSpaceBasisIn (const LINBOX_enum(Tag::Side) Side,
+ BlasMatrix<Field> & A,
+ BlasMatrix<Field> & Ker,
+ size_t & kerdim)
+ {
+ BlasSubmatrix< BlasMatrix<Field> > Asub(A);
+ return NullSpaceBasisIn(Side,Asub,Ker,kerdim);
+ }
+
+ template<class Field>
+ size_t&
+ NullSpaceBasis (const LINBOX_enum(Tag::Side) Side,
+ const BlasMatrix<Field> & A,
+ BlasMatrix<Field> & Ker,
+ size_t & kerdim)
+ {
+ const BlasSubmatrix<BlasMatrix<Field> > Asub (A);
+ return NullSpaceBasis<Field>(Side,Asub,Ker,kerdim);
+ }
+
+ template<class DenseMat>
+ size_t&
+ NullSpaceBasis (const LINBOX_enum(Tag::Side) Side,
+ const BlasSubmatrix<DenseMat> & A,
+ BlasMatrix<typename DenseMat::Field> & Ker,
+ size_t & kerdim)
+ {
+ BlasMatrix<typename DenseMat::Field> B (A);
+ return NullSpaceBasisIn<typename DenseMat::Field>(Side,B,Ker,kerdim);
+ }
+
} // LinBox
#endif // __LINBOX_dense_nullspace_INL
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
// Local Variables:
// mode: C++
// tab-width: 8
// indent-tabs-mode: nil
// c-basic-offset: 8
// End:
-
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/algorithms/density.h b/linbox/algorithms/density.h
new file mode 100644
index 0000000..d1c5db9
--- /dev/null
+++ b/linbox/algorithms/density.h
@@ -0,0 +1,85 @@
+/* Copyright (C) 2010 LinBox
+ *
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ * ========LICENCE========
+ */
+
+
+
+#ifndef __LINBOX_density_H
+#define __LINBOX_density_H
+#include "linbox/vector/vector-traits.h"
+
+namespace LinBox
+{
+
+ /** \brief Estimate nonzero entries in a vector, used in parallel elimination */
+ template<class Vector>
+ inline long density(const Vector& v)
+ {
+
+ return density(v, VectorTraits<Vector>::VectorCategory());
+ }
+
+ template<class Vector, class VectorCategory>
+ inline long density(const Vector&, VectorCategory);
+
+ template<class Vector>
+ inline long density(const Vector& v, VectorCategories::DenseVectorTag)
+ {
+
+ return v.size();
+ }
+
+
+ template<class Vector>
+ inline long density(const Vector& v, VectorCategories::SparseSequenceVectorTag)
+ {
+
+ return v.size();
+ }
+
+
+ template<class Vector>
+ inline long density(const Vector& v, VectorCategories::SparseAssociativeVectorTag)
+ {
+
+ return v.size();
+ }
+
+
+ template<class Vector>
+ inline long density(const Vector& v, VectorCategories::SparseParallelVectorTag) {
+
+
+ return v.first.size();
+ }
+}
+
+#endif //__LINBOX_density_H
+
+
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+
diff --git a/linbox/algorithms/det-rational.h b/linbox/algorithms/det-rational.h
index 26ffdd6..42592d1 100644
--- a/linbox/algorithms/det-rational.h
+++ b/linbox/algorithms/det-rational.h
@@ -27,10 +27,10 @@
#include "linbox/util/commentator.h"
#include "linbox/util/timer.h"
-#include "linbox/field/modular.h"
+#include "linbox/ring/modular.h"
//#include "linbox/field/gmp-rational.h"
-#include "linbox/field/PID-integer.h"
+#include "givaro/givinteger.h"
#include "linbox/blackbox/rational-matrix-factory.h"
#include "linbox/algorithms/varprec-cra-early-single.h"
#include "linbox/algorithms/cra-domain.h"
@@ -164,18 +164,18 @@ namespace LinBox
const MyMethod &Met= Method::Hybrid())
{
- typedef Modular<double> myModular;
- typedef typename Rationals::Element Quotient;
+// typedef typename Rationals::Element Quotient;
+ typedef BlasVector<Givaro::IntegerDom> IVect ;
commentator().start ("Rational Det", "Rdeterminant");
- RandomPrimeIterator genprime( 26-(int)ceil(log((double)A.rowdim())*0.7213475205));
+ RandomPrimeIterator genprime( (unsigned int)(26-(int)ceil(log((double)A.rowdim())*0.7213475205)));
Integer F = 1;
Integer M = 1;
//BlasMatrixBase<Quotient> ABase(A);
- RationalMatrixFactory<PID_integer,Rationals, BlasMatrix<Rationals > > FA(&A);
+ RationalMatrixFactory<Givaro::IntegerDom,Rationals, BlasMatrix<Rationals > > FA(&A);
Integer di=1;
for (int i=(int)A.rowdim()-1; i >= 0 ; --i) {
@@ -183,33 +183,35 @@ namespace LinBox
M *=di;
}
- PID_integer Z;
- BlasMatrix<PID_integer> Atilde(Z,A.rowdim(), A.coldim());
+ Givaro::IntegerDom Z;
+ BlasMatrix<Givaro::IntegerDom> Atilde(Z,A.rowdim(), A.coldim());
FA.makeAtilde(Atilde);
- UserTimer t0, t1,t2;bool term = false;
+ UserTimer t0, t1,t2;
+ bool term = false;
t0.clear();
t0.start();
corrections(Atilde,F);
- ChineseRemainder< VarPrecEarlySingleCRA<Modular<double> > > cra(3UL);
+ ChineseRemainder< VarPrecEarlySingleCRA<Givaro::Modular<double> > > cra(3UL);
MyRationalModularDet<BlasMatrix<Rationals > , MyMethod> iteration1(A, Met, M, F);
- MyIntegerModularDet<BlasMatrix<PID_integer>, MyMethod> iteration2(Atilde, Met);
+ MyIntegerModularDet<BlasMatrix<Givaro::IntegerDom>, MyMethod> iteration2(Atilde, Met);
MyModularDet<MyRationalModularDet<BlasMatrix<Rationals > , MyMethod>,
- MyIntegerModularDet<BlasMatrix<PID_integer>, MyMethod> > iteration(&iteration1,&iteration2);
+ MyIntegerModularDet<BlasMatrix<Givaro::IntegerDom>, MyMethod> > iteration(&iteration1,&iteration2);
- RReconstruction<PID_integer, ClassicMaxQRationalReconstruction<PID_integer> > RR;
+ RReconstruction<Givaro::IntegerDom, ClassicMaxQRationalReconstruction<Givaro::IntegerDom> > RR;
Integer dd; // use of integer due to non genericity of cra. PG 2005-08-04
size_t k = 4;
t1.clear();
t2.clear();
t1.start();
- term = cra((int)k,dd,iteration1,genprime);
+ //BB added |= because term was not used.
+ term |= cra((int)k,dd,iteration1,genprime);
t1.stop();
t2.start();
- term = cra((int)k,dd,iteration2,genprime);
+ term |= cra((int)k,dd,iteration2,genprime);
t2.stop();
double s1 = t1.time(), s2 = t2.time();
@@ -225,7 +227,7 @@ namespace LinBox
}
//switch: LIF
- std::vector<typename PID_integer::Element> v(A.rowdim()), r(A.rowdim());
+ IVect v(Z,A.rowdim()), r(Z,A.rowdim());
++genprime;
for(size_t i=0; i < v.size(); ++i) {
v[i] = rand() % (*genprime) ;
@@ -240,9 +242,9 @@ namespace LinBox
Integer lif = 1;
if ((s1 > 4*s2) && (!term)){
//cout << "lif " << std::flush;
- RationalSolver < PID_integer , Modular<double>, RandomPrimeIterator, DixonTraits > RSolver;
- LastInvariantFactor < PID_integer ,RationalSolver < PID_integer, Modular<double>, RandomPrimeIterator, DixonTraits > > LIF(RSolver);
- std::vector<Integer> r_num2 (Atilde. coldim());
+ RationalSolver < Givaro::IntegerDom , Givaro::Modular<double>, RandomPrimeIterator, DixonTraits > RSolver;
+ LastInvariantFactor < Givaro::IntegerDom ,RationalSolver < Givaro::IntegerDom, Givaro::Modular<double>, RandomPrimeIterator, DixonTraits > > LIF(RSolver);
+ IVect r_num2 (Z,Atilde. coldim());
t1.clear();
t1.start();
if (LIF.lastInvariantFactor1(lif, r_num2, Atilde)==0) {
@@ -334,11 +336,10 @@ namespace LinBox
#endif //__LINBOX_det_rational_H
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
// Local Variables:
// mode: C++
// tab-width: 8
// indent-tabs-mode: nil
// c-basic-offset: 8
// End:
-
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/algorithms/diophantine-solver.C b/linbox/algorithms/diophantine-solver.C
index b714644..defdbb5 100644
--- a/linbox/algorithms/diophantine-solver.C
+++ b/linbox/algorithms/diophantine-solver.C
@@ -22,6 +22,7 @@
*/
+#include "linbox/linbox-config.h"
#include "linbox/algorithms/diophantine-solver.h"
namespace LinBox
@@ -32,11 +33,10 @@ namespace LinBox
}
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
// Local Variables:
// mode: C++
// tab-width: 8
// indent-tabs-mode: nil
// c-basic-offset: 8
// End:
-
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/algorithms/diophantine-solver.h b/linbox/algorithms/diophantine-solver.h
index 419057f..8c3628a 100644
--- a/linbox/algorithms/diophantine-solver.h
+++ b/linbox/algorithms/diophantine-solver.h
@@ -67,7 +67,9 @@ namespace LinBox
* @param rs a rationalSolver
*/
DiophantineSolver (QSolver& rs) :
- _rationalSolver(rs), _ring(rs.getRing()), lastCertificate(_ring, 0)
+ _rationalSolver(rs), _ring(rs.getRing())
+ ,numSolutionsNeeded(0),numFailedCallsToSolver(0),numRevelantSolutions (0)
+ , lastCertificate(_ring, 0)
{ }
/** Solve a linear system \c Ax=b over quotient field of a ring.
@@ -132,14 +134,17 @@ namespace LinBox
}
#include "linbox/algorithms/diophantine-solver.inl"
+#ifdef LinBoxSrcOnly
+#include "linbox/algorithms/diophantine-solver.C"
+#endif
+
#endif //__LINBOX_diophantine_solver_H
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
// Local Variables:
// mode: C++
// tab-width: 8
// indent-tabs-mode: nil
// c-basic-offset: 8
// End:
-
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/algorithms/diophantine-solver.inl b/linbox/algorithms/diophantine-solver.inl
index bd82dcf..f3d30b9 100644
--- a/linbox/algorithms/diophantine-solver.inl
+++ b/linbox/algorithms/diophantine-solver.inl
@@ -25,7 +25,7 @@
#ifndef __LINBOX_diophantine_solver_INL
#define __LINBOX_diophantine_solver_INL
-#include "linbox/blackbox/sparse.h"
+#include "linbox/matrix/sparse-matrix.h"
#include "linbox/blackbox/lambda-sparse.h"
#include "linbox/algorithms/rational-solver.h"
#include "linbox/algorithms/vector-fraction.h"
@@ -102,7 +102,7 @@ namespace LinBox
if (level >= SL_LASVEGAS)
lowerDenBound = _rationalSolver.lastCertifiedDenFactor;
else
- _ring.init(lowerDenBound, 1);
+ _ring.assign(lowerDenBound, _ring.one);
#ifdef DEBUG_DIO
std::cout << "lower bound on denominator: " << lowerDenBound << std::endl;
std::cout << "upper bound on denominator: " << upperDenBound << std::endl;
@@ -187,11 +187,10 @@ namespace LinBox
#endif //__LINBOX_diophantine_solver_INL
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
// Local Variables:
// mode: C++
// tab-width: 8
// indent-tabs-mode: nil
// c-basic-offset: 8
// End:
-
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/algorithms/double-det.h b/linbox/algorithms/double-det.h
index 7a010a5..1d057db 100644
--- a/linbox/algorithms/double-det.h
+++ b/linbox/algorithms/double-det.h
@@ -35,7 +35,6 @@
#include "linbox/randiter/random-prime.h"
#include "linbox/solutions/solve.h"
#include "linbox/solutions/methods.h"
-#include <vector>
namespace LinBox
{
@@ -60,12 +59,12 @@ namespace LinBox
size_t* P = new size_t[N];
size_t* Qt = new size_t[N-1];
- FFPACK::LUdivine ((typename Field::Father_t)F, FFLAS::FflasUnit, FFLAS::FflasNoTrans, N-1, N,
+ FFPACK::LUdivine (F, FFLAS::FflasUnit, FFLAS::FflasNoTrans, N-1, N,
A, lda, P, Qt);
typename Field::Element d;
// Multiplying all (N-1) first pivots)
- F.init(d, 1UL);
+ F.assign(d, F.one);
for (size_t i=0; i<N-1; ++i)
F.mulin (d, *(A + i*(lda+1)));
@@ -76,14 +75,14 @@ namespace LinBox
F.negin(d);
// Trick: instead of Right-Trans, do Left-NoTrans in order to use inc*
- FFPACK::applyP ((typename Field::Father_t)F, FFLAS::FflasLeft, FFLAS::FflasNoTrans,
+ FFPACK::applyP (F, FFLAS::FflasLeft, FFLAS::FflasNoTrans,
1, 0,(int) N-1, b, incb, P);
- FFPACK::applyP ((typename Field::Father_t)F, FFLAS::FflasLeft, FFLAS::FflasNoTrans,
+ FFPACK::applyP (F, FFLAS::FflasLeft, FFLAS::FflasNoTrans,
1, 0,(int) N-1, c, incc, P);
- FFLAS::ftrsv ((typename Field::Father_t)F, FFLAS::FflasUpper, FFLAS::FflasTrans,
+ FFLAS::ftrsv (F, FFLAS::FflasUpper, FFLAS::FflasTrans,
FFLAS::FflasUnit,
N, A, lda, b, (int)incb);
- FFLAS::ftrsv ((typename Field::Father_t)F, FFLAS::FflasUpper, FFLAS::FflasTrans,
+ FFLAS::ftrsv (F, FFLAS::FflasUpper, FFLAS::FflasTrans,
FFLAS::FflasUnit,
N, A, lda, c, (int)incc);
@@ -109,8 +108,8 @@ namespace LinBox
{}
template<class Field>
- std::vector<typename Field::Element>&
- operator () (std::vector<typename Field::Element>& dd,
+ BlasVector<Field>&
+ operator () (BlasVector<Field>& dd,
const Field& F) const
{
@@ -241,9 +240,9 @@ namespace LinBox
typename BlackBox::Field F = A.field();
IntegerDoubleDetIteration<BlackBox> iteration(A, s1, s2);
// 0.7213475205 is an upper approximation of 1/(2log(2))
- RandomPrimeIterator genprime( 25-(int)ceil(log((double)A.rowdim())*0.7213475205));
+ RandomPrimeIterator genprime( (unsigned int)(25-(int)ceil(log((double)A.rowdim())*0.7213475205)));
- std::vector<typename BlackBox::Field::Element> dd;
+ BlasVector<typename BlackBox::Field> dd(A.field());
if (proof) {
integer bound;
double logbound;
@@ -255,7 +254,7 @@ namespace LinBox
//t_hd.stop();
//std::cerr<<"Hadamard bound = : "<<logbound<<" in "<<t_hd.usertime()<<"s"<<std::endl;
- ChineseRemainder <FullMultipCRA <Modular <double> > > cra(logbound);
+ ChineseRemainder <FullMultipCRA <Givaro::Modular <double> > > cra(logbound);
//t_hd.clear();
//t_cra.start();
@@ -265,7 +264,7 @@ namespace LinBox
}
else {
- ChineseRemainder <EarlyMultipCRA <Modular<double> > > cra(4UL);
+ ChineseRemainder <EarlyMultipCRA <Givaro::Modular<double> > > cra(4UL);
cra (dd, iteration, genprime);
}
F.mul (d1, dd[0], s1);
@@ -295,7 +294,7 @@ namespace LinBox
const size_t N = A.coldim();
BlasMatrix<typename BlackBox::Field> B (A.field(),N,N);
typename BlackBox::Field::Element den1, den2;
- std::vector<typename BlackBox::Field::Element> x1(N);
+ BlasVector<typename BlackBox::Field> x1(A.field(),N);
for (size_t i=0; i<N; ++i){
x1[i] = 0;
for (size_t j=0; j<N; ++j)
@@ -304,7 +303,7 @@ namespace LinBox
// for (size_t i=0; i<N; ++i)
// B.setEntry (i, N-1, b[i]);
- std::vector<typename BlackBox::Field::Element> c(N);
+ BlasVector<typename BlackBox::Field> c(A.field(),N);
for (size_t i=0; i<N; ++i)
c[i] = A.getEntry (N, i);
//Timer tim;
@@ -314,7 +313,7 @@ namespace LinBox
//tim.stop();
//std::cerr<<"Solve took "<<tim.usertime()<<std::endl;
- den1 = den1;
+ // den1 = den1;
// Should work:
// den (y[n]) = den (-den1/x[n]) = x[n]
den2 = -x1[N-1];
@@ -331,11 +330,10 @@ namespace LinBox
#endif // __LINBOX_doubledet_H
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
// Local Variables:
// mode: C++
// tab-width: 8
// indent-tabs-mode: nil
// c-basic-offset: 8
// End:
-
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/algorithms/dyadic-to-rational.h b/linbox/algorithms/dyadic-to-rational.h
index e1ced43..ffdb3ce 100644
--- a/linbox/algorithms/dyadic-to-rational.h
+++ b/linbox/algorithms/dyadic-to-rational.h
@@ -1,5 +1,6 @@
-#ifndef __DYADICTORATIONAL_H
-#define __DYADICTORATIONAL_H
+#ifndef __LINBOX_algorithms_dyadic_to_rational_H
+#define __LINBOX_algorithms_dyadic_to_rational_H
+
/* dyadic-to-rational.h
*
* dyadicToRational reconstructs a rational a/b from dyadic approximation n/2^k.
@@ -34,12 +35,12 @@
#include <stack>
#include <assert.h>
-#include <vector>
//#include "linbox/integer.h"
namespace LinBox{
-
+template<class Ring>
+bool partial_hegcd(Ring& Z, typename Ring::Element& e, typename Ring::Element& b, const typename Ring::Element& n, const typename Ring::Element& d, const typename Ring::Element& denBound);
/** Rational reconstruction of a/b from n/d with denominator bound B.
* We give a/b, the continued fraction approximant of n/d that
* satisfies |a/b - n/d| < 1/2d (well approximated) and 0 < b <= B.
@@ -95,8 +96,7 @@ int dyadicToRational (
// now a/b is solution but signs may be wrong
Z.abs(a,a);
Z.abs(b,b);
- Int zero; Z.init(zero, 0);
- if (Z.compare(n, zero) < 0) Z.negin(a); // a = -a;
+ if (Z.compare(n, Z.zero) < 0) Z.negin(a); // a = -a;
//std::cout << "DtR in n, d " << n << " "<< d << ", bound " << B << ", out a, b " << a << " " << b << std::endl;
bool guarantee = b*B < d;
@@ -124,10 +124,10 @@ bool partial_hegcd(Ring& Z, typename Ring::Element& e, typename Ring::Element& b
Int quo, r, tmp; Z.init(quo); Z.init(r); Z.init(tmp);
bool withinbound, wellapproximated;
- Int b0; Z.init(b0, 1); // and a0 = -0
- Int r0; Z.init(r0, n); // so that r0 = b0*n - a0*d
- Int b1; Z.init(b1, -0); // and a1 = 1
- Int r1; Z.init(r1, d); // so that r1 = b1*n - a1*d
+ Int b0; Z.init(b0); Z.assign(b0, Z.one); // and a0 = -0
+ Int r0; Z.init(r0); Z.assign(r0, n); // so that r0 = b0*n - a0*d
+ Int b1; Z.init(b1); Z.assign(b1, Z.zero); // and a1 = 1
+ Int r1; Z.init(r1); Z.assign(r1, d); // so that r1 = b1*n - a1*d
//std::cout << "init 1 -0: " << b0 << " " << b1 << std::endl;
do {
@@ -157,24 +157,23 @@ bool partial_hegcd(Ring& Z, typename Ring::Element& e, typename Ring::Element& b
template<class Ring>
int dyadicToRational(
const Ring& Z,
- std::vector<typename Ring::Element>& num, typename Ring::Element& den,
- std::vector<typename Ring::Element>& numx, typename Ring::Element& denx,
+ BlasVector<Ring>& num, typename Ring::Element& den,
+ BlasVector<Ring>& numx, typename Ring::Element& denx,
typename Ring::Element& denBound)
{
typedef typename Ring::Element Int;
Int q, rem, tmp_den, nx;
Z.init(q); Z.init(rem); Z.init(tmp_den); Z.init(nx);
- Int one; Z.init(one, 1);
- Int two; Z.init(two, 2);
- Int denx2;
- Z.init(denx2, denx); Z.divin(denx2, two);// denx2 = denx/2, for balancing remainders.
+ Int two; Z.init(two, int64_t(2));
+ Int denx2; Z.init(denx2);
+ Z.assign(denx2, denx); Z.divin(denx2, two);// denx2 = denx/2, for balancing remainders.
std::stack<std::pair<size_t, Int> > S;
Int tmp; Z.init(tmp);
- Int den_lcm; Z.init(den_lcm, 1);
+ Int den_lcm; Z.init(den_lcm); Z.assign(den_lcm, Z.one);
den = den_lcm; // = 1.
- S.push(std::pair<int, Int>(0, 1));
+ S.push(std::pair<int, Int>(0, Z.one));
Int e; Z.init(e);// e for error
int ret = 2; // 2 means guaranteed, 1 possible, 0 fail.
for (size_t i = 0; i < num.size(); ++i) {
@@ -183,7 +182,7 @@ int dyadicToRational(
Z.quoRem(num[i], e, tmp, denx); //nx*den - num[i]*denx = e, with num[i] and e nonneg.
// we need |nx/denx - num[i]/den| == e/den*denx <= 1/2denx, so 2e <= den.
// adjust to balanced remainder e.
- if (Z.compare(e, denx2) >= 0) {Z.subin(e, denx), Z.addin(num[i], one); }
+ if (Z.compare(e, denx2) >= 0) {Z.subin(e, denx), Z.addin(num[i], Z.one); }
//nx*den = num[i]*denx + e , thus |nx/denx - num[i]/den| = e/denx*den
// can try e < den && 2*e < den for speed
@@ -208,19 +207,18 @@ int dyadicToRational(
if (Z.compare(den, denBound)>0) return false; // den > denBound
}
- Int zero; Z.init(zero);
- if (Z.compare(numx[i], zero) < 0) Z.negin(num[i]); // numx[i] < 0
+ if (Z.compare(numx[i], Z.zero) < 0) Z.negin(num[i]); // numx[i] < 0
}
// now fix shorties
- Int t; Z.init(t, 1);
+ Int t; Z.assign(t, Z.one);
while ( S.size() > 1 ) {
Z.mulin(t, S.top().second);
int k = (int)S.top().first;
S.pop();
int j = (int)S.top().first;
for (int i = k-1; i >= j; --i) {
- Z.mulin(num[i], t);
+ Z.mulin(num[(size_t)i], t);
}
}
S.pop();
@@ -231,7 +229,7 @@ int dyadicToRational(
#if 0
// vector rational reconstruction building num, den from numx, denx
// This one -- very inefficient -- just reconstructs each one, then goes thru to fix for lcm.
-void rational_reconstruction(std::vector<integer>& num, integer& den, std::vector<integer>& numx, integer& denx, integer& denBound) {
+void rational_reconstruction(BlasVector<Givaro::ZRing<Integer> >& num, integer& den, BlasVector<Givaro::ZRing<Integer> >& numx, integer& denx, integer& denBound) {
integer den_tmp, missing_factor;
den = 1;
for (size_t i = 0; i < numx.size(); ++i) {
@@ -249,15 +247,14 @@ void rational_reconstruction(std::vector<integer>& num, integer& den, std::vecto
#endif
}// LinBox
-#endif // __DYADICTORATIONAL_H
+#endif // __LINBOX_algorithms_dyadic_to_rational_H
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
// Local Variables:
// mode: C++
// tab-width: 8
// indent-tabs-mode: nil
// c-basic-offset: 8
// End:
-
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
diff --git a/linbox/algorithms/echelon-form.h b/linbox/algorithms/echelon-form.h
index 1423e53..da5a0cf 100644
--- a/linbox/algorithms/echelon-form.h
+++ b/linbox/algorithms/echelon-form.h
@@ -30,8 +30,8 @@
#ifndef __LINBOX_echelon_form_H
#define __LINBOX_echelon_form_H
-#include "linbox/matrix/blas-matrix.h"
-#include "linbox/algorithms/blas-domain.h"
+#include "linbox/matrix/dense-matrix.h"
+#include "linbox/matrix/matrix-domain.h"
#include "linbox/matrix/matrix-domain.h"
#include "linbox/matrix/factorized-matrix.h"
@@ -45,7 +45,7 @@ namespace LinBox
private:
- Field _field;
+ const Field *_field;
BlasMatrixDomain<Field> _BMD;
MatrixDomain<Field> _MD;
@@ -54,7 +54,7 @@ namespace LinBox
// constructor
EchelonFormDomain(const Field &F) :
- _field(F), _BMD(F), _MD(F)
+ _field(&F), _BMD(F), _MD(F)
{}
@@ -70,13 +70,13 @@ namespace LinBox
n = A.coldim();
// get the transposed of A
- BlasMatrix<Field> At(_field,n, m);
+ BlasMatrix<Field> At(field(),n, m);
for (size_t i=0;i<m;++i)
for (size_t j=0;j<n;++j)
At.setEntry(j,i,A.getEntry(i,j));
- rank = columnEchelon(At);
+ rank = (size_t)columnEchelon(At);
// read the transpose of the echelon form from the rank 1st column of L
for (size_t i=0; i<rank;++i)
@@ -99,12 +99,12 @@ namespace LinBox
n = A.coldim();
// get the transposed of A
- BlasMatrix<Field> At(_field,n, m);
+ BlasMatrix<Field> At(field(),n, m);
for (size_t i=0;i<m;++i)
for (size_t j=0;j<n;++j)
At.setEntry(j,i,A.getEntry(i,j));
- rank = columnReducedEchelon(At);
+ rank = (size_t)columnReducedEchelon(At);
// read the transpose of the echelon form from the rank 1st column of At
for (size_t i=0; i<rank;++i)
@@ -158,9 +158,6 @@ namespace LinBox
size_t m,n, rank;
m = E.rowdim();
n = E.coldim();
- // Element zero, one;
- // _field.init(zero,0);
- // _field.init(one,1);
BlasPermutation<size_t> P(E.coldim());
BlasPermutation<size_t> Qt(E.rowdim());
@@ -176,11 +173,11 @@ namespace LinBox
// Zero out upper triangular part of E
for (size_t i=0;i<m;++i)
for (size_t j=i;j<n;++j)
- E.setEntry(i,j,_field.zero);
+ E.setEntry(i,j,field().zero);
// put one inplace of pivot
for (size_t i=0;i<rank;++i){
- E.setEntry(*(Qt.getPointer()+i),i,_field.one);
+ E.setEntry(*(Qt.getPointer()+i),i,field().one);
}
return (int)rank;
@@ -194,9 +191,6 @@ namespace LinBox
m = E.rowdim();
n = E.coldim();
- // Element zero, one;
- // _field.init(zero,0);
- // _field.init(one,1);
// compute the LQUP of E
BlasPermutation<size_t> P(E.coldim());
@@ -213,26 +207,26 @@ namespace LinBox
// Zero out upper triangular part of E
for (size_t i=0;i<m;++i)
for (size_t j=i;j<n;++j)
- E.setEntry(i,j,_field.zero);
+ E.setEntry(i,j,field().zero);
// permute E with Qt
_BMD.mulin_right(Qt,E);
// put one inplace of pivot
for (size_t i=0;i<rank;++i)
- E.setEntry(i,i, _field.one);//*(Qt.getPointer()+i),one);
+ E.setEntry(i,i, field().one);//*(Qt.getPointer()+i),one);
// Update the first r columns of E by Err^(-1)
// BlasSubmatrix<Field> Er(E,0,0,rank,rank);
BlasMatrix<Field> Er(E,0,0,rank,rank);
- TriangularBlasMatrix<Field> Err(Er, LinBoxTag::Lower, LinBoxTag::Unit);
- BlasSubmatrix<Field> En(E,rank,0,m-rank,rank);
+ TriangularBlasMatrix<Field> Err(Er, Tag::Shape::Lower, Tag::Diag::Unit);
+ BlasSubmatrix<BlasMatrix<Field> > En(E,rank,0,m-rank,rank);
_BMD.right_solve(Err, En);
for (size_t i=0;i<rank;++i){
for (size_t j=0;j<i;++j)
- E.setEntry(i,j,_field.zero);
+ E.setEntry(i,j,field().zero);
}
// permute L such that L<-Q.E
@@ -254,15 +248,16 @@ namespace LinBox
for (size_t i=0;i<m-1;++i){
std::cout<<"[";
for (size_t j=0;j<n-1;++j)
- _field.write(std::cout,A.getEntry(i,j))<<",";
- _field.write(std::cout, A.getEntry(i,n-1))<<"] , ";
+ field().write(std::cout,A.getEntry(i,j))<<",";
+ field().write(std::cout, A.getEntry(i,n-1))<<"] , ";
}
std::cout<<"[";
for (size_t j=0;j<n-1;++j)
- _field.write(std::cout,A.getEntry(m-1,j))<<",";
- _field.write(std::cout, A.getEntry(m-1,n-1))<<"]]);\n ";
+ field().write(std::cout,A.getEntry(m-1,j))<<",";
+ field().write(std::cout, A.getEntry(m-1,n-1))<<"]]);\n ";
}
+ const Field & field() { return *_field; }
};
}
diff --git a/linbox/algorithms/eliminator.h b/linbox/algorithms/eliminator.h
index b315f77..efb8b40 100644
--- a/linbox/algorithms/eliminator.h
+++ b/linbox/algorithms/eliminator.h
@@ -37,6 +37,7 @@
#include "linbox/vector/vector-domain.h"
#include "linbox/blackbox/archetype.h"
#include "linbox/solutions/methods.h"
+#include "linbox/matrix/dense-matrix.h"
namespace LinBox
@@ -179,7 +180,8 @@ namespace LinBox
*/
std::ostream &writePermutation (std::ostream &out, const Permutation &P) const;
- private:
+ const Field & field() { return _MD.field() ; }
+
// Compute the kth indexed Gauss-Jordan transform of the input
Matrix &kthGaussJordan (unsigned int &r,
typename Field::Element &d,
@@ -219,13 +221,12 @@ namespace LinBox
unsigned int dim, const std::vector<unsigned int> &profile);
// Private variables
+ private:
- const Field &_field;
VectorDomain<Field> _VD;
MatrixDomain<Field> _MD;
unsigned int _number;
- typename Field::Element _one;
// Temporaries used in the computation
diff --git a/linbox/algorithms/eliminator.inl b/linbox/algorithms/eliminator.inl
index a1399fd..d0d9816 100644
--- a/linbox/algorithms/eliminator.inl
+++ b/linbox/algorithms/eliminator.inl
@@ -38,7 +38,6 @@
#include "linbox/blackbox/diagonal.h"
#include "linbox/blackbox/compose.h"
#include "linbox/blackbox/transpose.h"
-#include "linbox/randiter/nonzero.h"
#include "linbox/util/commentator.h"
#include "linbox/util/timer.h"
@@ -65,9 +64,8 @@ namespace LinBox
template <class Field, class Matrix>
Eliminator<Field, Matrix>::Eliminator (const Field &F, unsigned int N) :
- _field (F), _VD (F), _MD (F), _number (N), _indepRows (N), _indepCols (N)
+ _VD (F), _MD (F), _number (N), _indepRows (N), _indepCols (N)
{
- _field.init (_one, 1);
}
template <class Field, class Matrix>
@@ -108,7 +106,7 @@ namespace LinBox
_perm.clear ();
_profile_idx = 0;
- kthGaussJordan (rank, d, 0, 0, A.coldim (), _one);
+ kthGaussJordan (rank, d, 0, 0, A.coldim (), field().one);
buildMinimalPermutation (P, rank, A.rowdim (), _perm);
buildMinimalPermutationFromProfile (Q, rank, A.coldim (), _profile);
@@ -122,7 +120,7 @@ namespace LinBox
BlasMatrix<Field> Ainv1 (Ainv, 0, 0, rank, rank);
BlasMatrix<Field> U1 (_matU, 0, 0, rank, rank);
- _field.inv (dinv, d);
+ field().inv (dinv, d);
_MD.mul (Ainv1, U1, dinv);
BlasMatrix<Field> Tv1 (Tv, 0, rank, rank, A.coldim () - rank);
@@ -215,7 +213,7 @@ namespace LinBox
/* Run the computation */
- kthGaussJordan (rank, d, 0, 0, _matA.coldim (), _one);
+ kthGaussJordan (rank, d, 0, 0, _matA.coldim (), fiedl().one);
/* Set _indepRows based on the permutation */
std::fill (_indepRows.begin (), _indepRows.begin () + rank, true);
@@ -231,7 +229,7 @@ namespace LinBox
_MD.permuteColumns (_matU, _perm.rbegin (), _perm.rend ());
/* Divide _matU by the determinant and copy to W */
- _field.invin (d);
+ field().invin (d);
_MD.mulin (_matU, d);
_MD.subin (W, W);
@@ -295,7 +293,7 @@ namespace LinBox
_perm.clear ();
_MD.copy (_matA, A);
_profile_idx = 0;
- kthGaussJordan (rank, det, 0, 0, (unsigned int) A.coldim (), _one);
+ kthGaussJordan (rank, det, 0, 0, (unsigned int) A.coldim (), field().one);
buildMinimalPermutation (P, rank, (unsigned int) A.rowdim (), _perm);
buildMinimalPermutationFromProfile (Q, rank, (unsigned int) A.coldim (), _profile);
@@ -309,7 +307,7 @@ namespace LinBox
BlasMatrix<Field> Ainv1 (U, 0, 0, rank, rank);
BlasMatrix<Field> U1 (_matU, 0, 0, rank, rank);
- _field.inv (dinv, det);
+ field().inv (dinv, det);
_MD.mul (Ainv1, U1, dinv);
BlasMatrix<Field> Tv1 (Tv, 0, rank, rank, A.coldim () - rank);
@@ -368,7 +366,6 @@ namespace LinBox
unsigned int m,
const typename Field::Element &d0)
{
- unsigned int i;
#ifdef ELIM_DETAILED_TRACE
commentator().start ("kth indexed Gauss-Jordan transform", "Eliminator::kthGaussJordan");
@@ -387,12 +384,13 @@ namespace LinBox
if (_MD.isZero (Ap)) {
r = 0;
- _field.assign (d, d0);
+ field().assign (d, d0);
}
else if (m == 1) {
+ unsigned int i;
// Find minimal index i > k with _matA[i, 1] != 0
for (i = 0; i < _matA.rowdim (); ++i)
- if (_indices[i] >= k && !_field.isZero (_matA.getEntry (_indices[i], s)))
+ if (_indices[i] >= k && !field().isZero (_matA.getEntry (_indices[i], s)))
break;
linbox_check (i < _matA.rowdim ());
@@ -404,12 +402,12 @@ namespace LinBox
r = 1;
_matA.getEntry (d, _indices[i], s);
- typename Matrix::ColIterator Uk = _matU.colBegin () + k;
- typename Matrix::ColIterator A1 = _matA.colBegin () + s;
+ typename Matrix::ColIterator Uk = _matU.colBegin () + (int)k;
+ typename Matrix::ColIterator A1 = _matA.colBegin () + (int)s;
_VD.neg (*Uk, *A1);
- _field.assign ((*Uk)[_indices[i]], (*Uk)[k]);
- _field.assign ((*Uk)[k], d0);
+ field().assign ((*Uk)[_indices[i]], (*Uk)[k]);
+ field().assign ((*Uk)[k], d0);
std::swap (_indices[i], _indices[k]);
@@ -447,7 +445,7 @@ namespace LinBox
BlasMatrix<Field> f (_matA, k, s + m1, r1, m2);
BlasMatrix<Field> g (_matA, k + r1, s + m1, l1, m2);
- _field.inv (d0inv, d0);
+ field().inv (d0inv, d0);
_MD.mul (et, a, f);
_MD.mulin (e, d1);
@@ -476,7 +474,7 @@ namespace LinBox
BlasMatrix<Field> U1 (_matU, 0, k, _matU.rowdim (), r1);
- _field.neg (d1neg, d1);
+ field().neg (d1neg, d1);
adddIN (_matU, d1neg);
_MD.permuteRows (U1, _perm.begin () + P_end, _perm.end ());
adddIN (_matU, d1);
@@ -509,7 +507,7 @@ namespace LinBox
BlasMatrix<Field> u2 (_matU, k + r1, k + r1, r2, r2);
BlasMatrix<Field> c2 (_matU, k + r, k + r1, l2, r2);
- _field.inv (d1inv, d1);
+ field().inv (d1inv, d1);
_MD.mul (a11t, a2, c1);
_MD.mulin (a1, d);
@@ -539,8 +537,8 @@ namespace LinBox
typename Field::Element dinv, d0inv;
- _field.inv (dinv, d);
- _field.inv (d0inv, d0);
+ field().inv (dinv, d);
+ field().inv (d0inv, d0);
BlasMatrix<Field> R (_matA.rowdim () - k, _matA.coldim () - s);
BlasMatrix<Field> Atest (Acopy, k, s, _matA.rowdim () - k, _matA.coldim () - s);
@@ -573,7 +571,7 @@ namespace LinBox
unsigned int idx;
for (i = A.rowBegin (), idx = 0; i != A.rowEnd (); ++i, ++idx)
- _field.addin ((*i)[idx], d);
+ A.field().addin ((*i)[idx], d);
return A;
}
@@ -589,7 +587,7 @@ namespace LinBox
for (i = A.rowBegin (), i_idx = 0; i != A.rowEnd (); ++i, ++i_idx) {
_VD.subin (*i, *i);
- _field.assign ((*i)[i_idx], _one);
+ A.field().assign ((*i)[i_idx], A.field().one);
}
return A;
@@ -693,7 +691,7 @@ namespace LinBox
idx2 = dim - 1;
while (idx < rank && idx2 >= rank) {
- while (_indepRows[idx] && idx < rank) ++idx;
+ while (idx < rank && _indepRows[idx]) ++idx;
while (!_indepRows[idx2] && idx2 >= rank) --idx2;
if (idx < rank && idx2 >= rank)
diff --git a/linbox/algorithms/fast-rational-reconstruction.h b/linbox/algorithms/fast-rational-reconstruction.h
index a405352..0562bbd 100644
--- a/linbox/algorithms/fast-rational-reconstruction.h
+++ b/linbox/algorithms/fast-rational-reconstruction.h
@@ -125,7 +125,7 @@ namespace LinBox
Element& powtwo(Element& h, const size_t log_h) const
{
h = 1;
- if (log_h <= 0) return h;
+ // if (log_h <= 0) return h;
h<<=log_h;
return h;
}
@@ -146,7 +146,6 @@ namespace LinBox
if (!fastEEA (ai,bi,ci,di,m,log_m,x,bound, log_bound)) return false;
- int K=0;
Element init_ainext = cur_ainext;
Element init_qinext = cur_qinext;
@@ -154,6 +153,7 @@ namespace LinBox
Element init_ri = cur_ri;
/* correction if $K <> bound = 2^log_bound */
if (cur_rinext > 0) {
+ int K=0;
while (cur_ainext <= d_bound) {
++K;
Element tmp;
@@ -350,15 +350,15 @@ namespace LinBox
aistar=distar=1;
bistar=cistar=0;
- Element mstar = m >> (long unsigned int) lambda;
- Element nstar = n >> (long unsigned int) lambda;
+ Element mstar = m >> (uint64_t) lambda;
+ Element nstar = n >> (uint64_t) lambda;
size_t log_mstar = 2*h+1;
if (nstar > 0) if (!fastEEA(aistar, bistar, cistar, distar, mstar, log_mstar,nstar, powh, h)) return false;
- int K=2;//reatreat steps;
if ((aistar > 1) && (distar > 0)) { //we have to go back 2 steps
+ int K=2;//reatreat steps;
Element aprev,bprev,cprev,dprev;
for (int i=0; i < K; ++i) {
prevEEA(aprev,bprev,cprev,dprev,aistar,bistar,cistar,distar);
@@ -403,9 +403,9 @@ namespace LinBox
Element ri = cur_ri;
Element rinext = cur_rinext;
- size_t log_m;
if ((rinext > 0) && (cur_ainext <= powh)){
+ size_t log_m;
log_m = rinext.bitsize()-1;
Element m2, n2;
m2 = rinext;
@@ -424,12 +424,12 @@ namespace LinBox
int k = (int)a1.bitsize()-1 ;
int _k;
- if (h-k > 2)
- _k = (int)(h-k-2);
+ if ((int)h-k > 2)
+ _k = ((int)h-k-2);
else _k = 0;
if (n2 >0) {
if (a1 < powh) {
- if (!fastEEA(a2,b2,c2,d2,m2,log_m,n2, powtwo(sqrth,_k), _k)) return false;
+ if (!fastEEA(a2,b2,c2,d2,m2,log_m,n2, powtwo(sqrth,(size_t)_k), (size_t)_k)) return false;
}
else {
ai = a1; bi = b1; ci=c1; di = d1;
@@ -545,7 +545,7 @@ namespace LinBox
}
Element ainext, binext, cinext,dinext;
- ainext=dinext=1;
+ dinext=1;
binext=cinext=0;
ainext = cur_ainext;
int K=-1;
@@ -659,7 +659,7 @@ namespace LinBox
a = tmpa; b = tmpb; c = tmpc; d = tmpd;
}
- QMatrix& max(const QMatrix& max1, const QMatrix max2) {
+ QMatrix /* & */ max(const QMatrix& max1, const QMatrix max2) {
if (max1.q >= max2.q) return QMatrix(max1);
else return QMatrix(max2);
}
@@ -695,7 +695,7 @@ namespace LinBox
if (_size+1 < _maxSize) {
this->push_back(bottom);
return false;
- ++_size;
+ // ++_size;
}
else {
if (!this->empty()) {
@@ -733,6 +733,7 @@ namespace LinBox
FastMaxQRationalReconstruction(const Ring& Z) :
FastRationalReconstruction<Ring>(Z), _intRing(Z)
+ ,c(0)
{}
bool reconstructRational(Element& a, Element& b, const Element& x, const Element& m) const
@@ -743,8 +744,8 @@ namespace LinBox
bool reconstructRational(Element& a, Element& b, const Element& x, const Element& m, const Element& a_bound) const
{
- bool res= false;
- return res = FastRationalReconstruction<Ring>::reconstructRational(a,b,x,m,a_bound);
+ // bool res= false;
+ return /* res = */ FastRationalReconstruction<Ring>::reconstructRational(a,b,x,m,a_bound);
}
protected:
@@ -795,13 +796,13 @@ namespace LinBox
d = maxQ.a;
//Element T = m.bitsize();int c = 5;
- if (maxQ.q.bitsize() > T.bitsize() + c) return true;
+ if (maxQ.q.bitsize() > T.bitsize() + (size_t)c) return true;
else return false;
}
bool classicQMaxEEA(Element& ai, Element& bi, Element& ci, Element& di, const Element& r0, const Element& r1,const Element& powh, myQueue<Ring >& queueMax, QMatrix<Ring>& maxQ) const
{
- if (maxQ.q.bitsize() > T.bitsize() + c) return true;
+ if (maxQ.q.bitsize() > T.bitsize() + (size_t) c) return true;
Element ri, rinext;
ri = r0; rinext = r1;
ai =di = 1;
@@ -820,7 +821,7 @@ namespace LinBox
if (queueMax.pushpop(top, newQ)) {
if (maxQ.q < top.q) {
maxQ = top;
- if (maxQ.q.bitsize() > T.bitsize() + c) return true;
+ if (maxQ.q.bitsize() > T.bitsize() + (size_t)c) return true;
}
}
@@ -865,7 +866,7 @@ namespace LinBox
const Element& m, const size_t d, const Element& n,
const Element& powh, const size_t& h, myQueue<Ring >& queueMax, QMatrix<Ring>& maxQ) const
{
- if (maxQ.q.bitsize() > T.bitsize() + c) return true;
+ if (maxQ.q.bitsize() > T.bitsize() + (size_t)c) return true;
ai=Element(1);
di=Element(1);
bi=Element(0);
@@ -882,7 +883,7 @@ namespace LinBox
if (queueMax.pushpop(top, newQ)) {
if (maxQ.q < top.q) {
maxQ = top;
- if (maxQ.q.bitsize() > T.bitsize() + c) return true;
+ if (maxQ.q.bitsize() > T.bitsize() + (size_t)c) return true;
}
}
return true;
@@ -911,7 +912,7 @@ namespace LinBox
if (queueMax.pushpop(top, newQ)) {
if (maxQ.q < top.q) {
maxQ = top;
- if (maxQ.q.bitsize() > T.bitsize() + c) return true;
+ if (maxQ.q.bitsize() > T.bitsize() + (size_t)c) return true;
}
}
@@ -934,7 +935,7 @@ namespace LinBox
if (queueMax.pushpop(top, newQ)) {
if (maxQ.q < top.q) {
maxQ = top;
- if (maxQ.q.bitsize() > T.bitsize() + c) return true;
+ if (maxQ.q.bitsize() > T.bitsize() + (size_t)c) return true;
}
}
}
@@ -960,14 +961,14 @@ namespace LinBox
aistar=distar=1;
bistar=cistar=0;
- Element mstar = m >> (long unsigned int) lambda;
- Element nstar = n >> (long unsigned int) lambda;
+ Element mstar = m >> (uint64_t) lambda;
+ Element nstar = n >> (uint64_t) lambda;
size_t log_mstar = 2*h+1;
queueMax._maxSize +=2;
if (nstar > 0) if (!fastQMaxEEA(aistar, bistar, cistar, distar, mstar, log_mstar,nstar, powh, h, queueMax, maxQ)) return false;
- if (maxQ.q.bitsize() > T.bitsize() + c) return true;
+ if (maxQ.q.bitsize() > T.bitsize() + (size_t)c) return true;
if (queueMax._size > 1) {
queueMax.pop_back();
QMatrix<Ring> Q_i_2 (queueMax.back());
@@ -1016,14 +1017,13 @@ namespace LinBox
this->powtwo(sqrth, logsqrth);
if (!fastQMaxEEA(a1,b1,c1,d1,m,d,n,sqrth, logsqrth, queueMax, maxQ)) return false;
- if (maxQ.q.bitsize() > T.bitsize() + c) return true;
+ if (maxQ.q.bitsize() > T.bitsize() + (size_t)c) return true;
ai = a1; bi = b1; ci=c1; di = d1;
Element ri = cur_ri;
Element rinext = cur_rinext;
- size_t log_m;
myQueue<Ring> queueTmp (queueMax._maxSize);
QMatrix<Ring> maxQTmp(_intRing);
@@ -1034,10 +1034,11 @@ namespace LinBox
if (queueMax.pushpop(top, newQ)) {
if (maxQ.q < top.q) {
maxQ = top;
- if (maxQ.q.bitsize() > T.bitsize() + c) return true;
+ if (maxQ.q.bitsize() > T.bitsize() + (size_t)c) return true;
}
}
+ size_t log_m;
log_m = rinext.bitsize()-1;
Element m2, n2;
m2 = rinext;
@@ -1062,7 +1063,7 @@ namespace LinBox
if (n2 >0) {
if (a1 < powh) {
if (!fastQMaxEEA(a2,b2,c2,d2,m2,log_m,n2,
- this->powtwo(sqrth,_k), _k, queueTmp,maxQTmp))
+ this->powtwo(sqrth,(size_t)_k), (size_t)_k, queueTmp,maxQTmp))
return false;
}
else {
@@ -1137,7 +1138,7 @@ namespace LinBox
if (maxQ.q < maxQTmp.q) {
maxQTmp.leftmultiply(Q_i);
maxQ = maxQTmp;
- if (maxQ.q.bitsize() > T.bitsize() + c) return true;
+ if (maxQ.q.bitsize() > T.bitsize() + (size_t)c) return true;
}
int K=0;
QMatrix<Ring > Q(_intRing);
@@ -1171,7 +1172,7 @@ namespace LinBox
if (queueMax.pushpop(top, Q)) {
if (maxQ.q < top.q) {
maxQ = top;
- if (maxQ.q.bitsize() > T.bitsize() + c) return true;
+ if (maxQ.q.bitsize() > T.bitsize() + (size_t)c) return true;
}
}
}
@@ -1213,7 +1214,7 @@ namespace LinBox
}
Element ainext, binext, cinext,dinext;
- ainext=dinext=1;
+ dinext=1;
binext=cinext=0;
ainext = cur_ainext;
int K=-1;
@@ -1234,7 +1235,7 @@ namespace LinBox
if (queueMax.pushpop(top, Q)) {
if (maxQ.q < top.q) {
maxQ = top;
- if (maxQ.q.bitsize() > T.bitsize() + c) return true;
+ if (maxQ.q.bitsize() > T.bitsize() + (size_t)c) return true;
}
}
diff --git a/linbox/algorithms/gauss.h b/linbox/algorithms/gauss.h
index c853e2c..c1bad75 100644
--- a/linbox/algorithms/gauss.h
+++ b/linbox/algorithms/gauss.h
@@ -12,20 +12,20 @@
* Move function definitions to gauss.inl
* -----------------------------------------------------------
*
- *
+ *
* ========LICENCE========
* This file is part of the library LinBox.
- *
+ *
* LinBox is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
- *
+ *
* This library 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
* Lesser General Public License for more details.
- *
+ *
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
@@ -46,15 +46,14 @@
#include "linbox/util/commentator.h"
#include "linbox/field/archetype.h"
#include "linbox/field/gf2.h"
-#include "linbox/vector/vector-domain.h"
-#include "linbox/matrix/sparse.h"
-#include "linbox/matrix/matrix-domain.h"
+#include "linbox/matrix/sparse-matrix.h"
#include "linbox/matrix/archetype.h"
#include "linbox/solutions/methods.h"
/** @file algorithms/gauss.h
* @brief Gauss elimination and applications for sparse matrices.
* Rank, nullspace, solve...
+ * @warning this codes expects SparseSeq matrices
*/
namespace LinBox
@@ -73,7 +72,7 @@ namespace LinBox
typedef typename Field::Element Element;
private:
- const Field &_field;
+ const Field *_field;
public:
@@ -81,7 +80,7 @@ namespace LinBox
* over which to perform computations
*/
GaussDomain (const Field &F) :
- _field (F)
+ _field (&F)
{}
//Copy constructor
@@ -92,7 +91,7 @@ namespace LinBox
/** accessor for the field of computation
*/
- const Field &field () const { return _field; }
+ const Field &field () const { return *_field; }
/** @name rank
Callers of the different rank routines\\
@@ -182,6 +181,16 @@ namespace LinBox
unsigned long Ni,
unsigned long Nj) const;
+ template <class Matrix, class Perm>
+ unsigned long& DenseQLUPin(unsigned long &rank,
+ Element& determinant,
+ std::deque<std::pair<size_t,size_t> > &invQ,
+ Matrix &L,
+ Matrix &U,
+ Perm &P,
+ unsigned long Ni,
+ unsigned long Nj) const;
+
template <class Matrix, class Perm, class Vector1, class Vector2>
Vector1& solve(Vector1& x, Vector1& w, unsigned long rank, const Perm& Q, const Matrix& L, const Matrix& U, const Perm& P, const Vector2& b) const;
@@ -348,8 +357,32 @@ Using : FindPivot and LU
template <class Vector>
void FindPivot (Vector &lignepivot, unsigned long &k, long &indpermut) const;
+ template <class Matrix, class Perm>
+ unsigned long& SparseContinuation(unsigned long &rank,
+ Element& determinant,
+ std::deque<std::pair<size_t,size_t> > &invQ,
+ Matrix &L,
+ Matrix &U,
+ Perm &P,
+ unsigned long Ni,
+ unsigned long Nj) const;
+
+
+ template <class Matrix, class Perm, bool hasFFLAS>
+ struct Continuation {
+ unsigned long& operator()(
+ unsigned long &rank,
+ Element& determinant,
+ std::deque<std::pair<size_t,size_t> > &invQ,
+ Matrix &L,
+ Matrix &U,
+ Perm &P,
+ unsigned long Ni,
+ unsigned long Nj, bool) const;
+ };
};
+
} // namespace LinBox
#include "linbox/algorithms/gauss/gauss.inl"
diff --git a/linbox/algorithms/gauss/Makefile.in b/linbox/algorithms/gauss/Makefile.in
deleted file mode 100644
index 86f1b94..0000000
--- a/linbox/algorithms/gauss/Makefile.in
+++ /dev/null
@@ -1,585 +0,0 @@
-# Makefile.in generated by automake 1.11.5 from Makefile.am.
-# @configure_input@
-
-# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software
-# Foundation, Inc.
-# This Makefile.in is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
-# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
-# PARTICULAR PURPOSE.
-
- at SET_MAKE@
-
-# Copyright (c) 2010 the LinBox group
-# ========LICENCE========
-# This file is part of the library LinBox.
-#
-# LinBox is free software: you can redistribute it and/or modify
-# it under the terms of the GNU Lesser General Public
-# License as published by the Free Software Foundation; either
-# version 2.1 of the License, or (at your option) any later version.
-#
-# This library 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
-# Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public
-# License along with this library; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
-# ========LICENCE========
-
-VPATH = @srcdir@
-am__make_dryrun = \
- { \
- am__dry=no; \
- case $$MAKEFLAGS in \
- *\\[\ \ ]*) \
- echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \
- | grep '^AM OK$$' >/dev/null || am__dry=yes;; \
- *) \
- for am__flg in $$MAKEFLAGS; do \
- case $$am__flg in \
- *=*|--*) ;; \
- *n*) am__dry=yes; break;; \
- esac; \
- done;; \
- esac; \
- test $$am__dry = yes; \
- }
-pkgdatadir = $(datadir)/@PACKAGE@
-pkgincludedir = $(includedir)/@PACKAGE@
-pkglibdir = $(libdir)/@PACKAGE@
-pkglibexecdir = $(libexecdir)/@PACKAGE@
-am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
-install_sh_DATA = $(install_sh) -c -m 644
-install_sh_PROGRAM = $(install_sh) -c
-install_sh_SCRIPT = $(install_sh) -c
-INSTALL_HEADER = $(INSTALL_DATA)
-transform = $(program_transform_name)
-NORMAL_INSTALL = :
-PRE_INSTALL = :
-POST_INSTALL = :
-NORMAL_UNINSTALL = :
-PRE_UNINSTALL = :
-POST_UNINSTALL = :
-build_triplet = @build@
-host_triplet = @host@
-subdir = linbox/algorithms/gauss
-DIST_COMMON = $(pkgincludesub_HEADERS) $(srcdir)/Makefile.am \
- $(srcdir)/Makefile.in
-ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-am__aclocal_m4_deps = $(top_srcdir)/macros/aclocal-include.m4 \
- $(top_srcdir)/macros/config-header.m4 \
- $(top_srcdir)/macros/debug.m4 \
- $(top_srcdir)/macros/expat-check.m4 \
- $(top_srcdir)/macros/fflas-ffpack-check.m4 \
- $(top_srcdir)/macros/fplll-check.m4 \
- $(top_srcdir)/macros/givaro-check.m4 \
- $(top_srcdir)/macros/gmp-check.m4 \
- $(top_srcdir)/macros/iml-check.m4 \
- $(top_srcdir)/macros/lapack-check.m4 \
- $(top_srcdir)/macros/libtool.m4 \
- $(top_srcdir)/macros/lidia-check.m4 \
- $(top_srcdir)/macros/linbox-benchmark.m4 \
- $(top_srcdir)/macros/linbox-doc.m4 \
- $(top_srcdir)/macros/linbox-misc.m4 \
- $(top_srcdir)/macros/linbox-opt.m4 \
- $(top_srcdir)/macros/ltoptions.m4 \
- $(top_srcdir)/macros/ltsugar.m4 \
- $(top_srcdir)/macros/ltversion.m4 \
- $(top_srcdir)/macros/lt~obsolete.m4 \
- $(top_srcdir)/macros/m4ri-check.m4 \
- $(top_srcdir)/macros/m4rie-check.m4 \
- $(top_srcdir)/macros/maple-check.m4 \
- $(top_srcdir)/macros/mpfr-check.m4 \
- $(top_srcdir)/macros/ntl-check.m4 \
- $(top_srcdir)/macros/saclib-check.m4 \
- $(top_srcdir)/macros/sage-check.m4 $(top_srcdir)/configure.ac
-am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
- $(ACLOCAL_M4)
-mkinstalldirs = $(install_sh) -d
-CONFIG_HEADER = $(top_builddir)/config.h
-CONFIG_CLEAN_FILES =
-CONFIG_CLEAN_VPATH_FILES =
-depcomp =
-am__depfiles_maybe =
-SOURCES =
-DIST_SOURCES =
-am__can_run_installinfo = \
- case $$AM_UPDATE_INFO_DIR in \
- n|no|NO) false;; \
- *) (install-info --version) >/dev/null 2>&1;; \
- esac
-am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
-am__vpath_adj = case $$p in \
- $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
- *) f=$$p;; \
- esac;
-am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
-am__install_max = 40
-am__nobase_strip_setup = \
- srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
-am__nobase_strip = \
- for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
-am__nobase_list = $(am__nobase_strip_setup); \
- for p in $$list; do echo "$$p $$p"; done | \
- sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
- $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
- if (++n[$$2] == $(am__install_max)) \
- { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
- END { for (dir in files) print dir, files[dir] }'
-am__base_list = \
- sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
- sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
-am__uninstall_files_from_dir = { \
- test -z "$$files" \
- || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \
- || { echo " ( cd '$$dir' && rm -f" $$files ")"; \
- $(am__cd) "$$dir" && rm -f $$files; }; \
- }
-am__installdirs = "$(DESTDIR)$(pkgincludesubdir)"
-HEADERS = $(pkgincludesub_HEADERS)
-ETAGS = etags
-CTAGS = ctags
-DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
-ACLOCAL = @ACLOCAL@
-AMTAR = @AMTAR@
-AR = @AR@
-AUTOCONF = @AUTOCONF@
-AUTOHEADER = @AUTOHEADER@
-AUTOMAKE = @AUTOMAKE@
-AWK = @AWK@
-BLAS_CFLAGS = @BLAS_CFLAGS@
-BLAS_LIBS = @BLAS_LIBS@
-CC = @CC@
-CCNAM = @CCNAM@
-CFLAGS = @CFLAGS@
-CPPFLAGS = @CPPFLAGS@
-CXX = @CXX@
-CXXCPP = @CXXCPP@
-CXXFLAGS = @CXXFLAGS@
-CYGPATH_W = @CYGPATH_W@
-DBG = @DBG@
-DEBUG_CFLAGS = @DEBUG_CFLAGS@
-DEFAULT_CFLAGS = @DEFAULT_CFLAGS@
-DEFS = @DEFS@
-DLLTOOL = @DLLTOOL@
-DSYMUTIL = @DSYMUTIL@
-DUMPBIN = @DUMPBIN@
-ECHO_C = @ECHO_C@
-ECHO_N = @ECHO_N@
-ECHO_T = @ECHO_T@
-EGREP = @EGREP@
-EXEEXT = @EXEEXT@
-EXPAT_CFLAGS = @EXPAT_CFLAGS@
-EXPAT_LIBS = @EXPAT_LIBS@
-FFLAS_FFPACK_CFLAGS = @FFLAS_FFPACK_CFLAGS@
-FFLAS_FFPACK_LIBS = @FFLAS_FFPACK_LIBS@
-FFLAS_FFPACK_LOC = @FFLAS_FFPACK_LOC@
-FGREP = @FGREP@
-FPLLL_CFLAGS = @FPLLL_CFLAGS@
-FPLLL_LIBS = @FPLLL_LIBS@
-GIVARO_CFLAGS = @GIVARO_CFLAGS@
-GIVARO_LIBS = @GIVARO_LIBS@
-GMP_CFLAGS = @GMP_CFLAGS@
-GMP_LIBS = @GMP_LIBS@
-GMP_VERSION = @GMP_VERSION@
-GREP = @GREP@
-IML_CFLAGS = @IML_CFLAGS@
-IML_LIBS = @IML_LIBS@
-INSTALL = @INSTALL@
-INSTALL_DATA = @INSTALL_DATA@
-INSTALL_PROGRAM = @INSTALL_PROGRAM@
-INSTALL_SCRIPT = @INSTALL_SCRIPT@
-INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
-LD = @LD@
-LDFLAGS = @LDFLAGS@
-LIBOBJS = @LIBOBJS@
-LIBS = @LIBS@
-LIBTOOL = @LIBTOOL@
-LIDIA_CFLAGS = @LIDIA_CFLAGS@
-LIDIA_LIBS = @LIDIA_LIBS@
-LINBOX_BENCH_PATH = @LINBOX_BENCH_PATH@
-LINBOX_DOC_PATH = @LINBOX_DOC_PATH@
-LIPO = @LIPO@
-LN_S = @LN_S@
-LTLIBOBJS = @LTLIBOBJS@
-M4RIE_CFLAGS = @M4RIE_CFLAGS@
-M4RIE_LIBS = @M4RIE_LIBS@
-M4RI_CFLAGS = @M4RI_CFLAGS@
-M4RI_LIBS = @M4RI_LIBS@
-MAINT = @MAINT@
-MAKEINFO = @MAKEINFO@
-MANIFEST_TOOL = @MANIFEST_TOOL@
-MAPLE_CFLAGS = @MAPLE_CFLAGS@
-MAPLE_HOME = @MAPLE_HOME@
-MAPLE_LIBS = @MAPLE_LIBS@
-MAPLE_VERSION = @MAPLE_VERSION@
-MKDIR_P = @MKDIR_P@
-MPFR_CFLAGS = @MPFR_CFLAGS@
-MPFR_LIBS = @MPFR_LIBS@
-NM = @NM@
-NMEDIT = @NMEDIT@
-NTL_CFLAGS = @NTL_CFLAGS@
-NTL_LIBS = @NTL_LIBS@
-OBJDUMP = @OBJDUMP@
-OBJEXT = @OBJEXT@
-OTOOL = @OTOOL@
-OTOOL64 = @OTOOL64@
-PACKAGE = @PACKAGE@
-PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
-PACKAGE_NAME = @PACKAGE_NAME@
-PACKAGE_STRING = @PACKAGE_STRING@
-PACKAGE_TARNAME = @PACKAGE_TARNAME@
-PACKAGE_URL = @PACKAGE_URL@
-PACKAGE_VERSION = @PACKAGE_VERSION@
-PATH_SEPARATOR = @PATH_SEPARATOR@
-PROF = @PROF@
-RANLIB = @RANLIB@
-RM = @RM@
-SACLIB_CFLAGS = @SACLIB_CFLAGS@
-SACLIB_LIBS = @SACLIB_LIBS@
-SED = @SED@
-SET_MAKE = @SET_MAKE@
-SHELL = @SHELL@
-STRIP = @STRIP@
-TESTS_CFLAGS = @TESTS_CFLAGS@
-VERSION = @VERSION@
-WARN = @WARN@
-abs_builddir = @abs_builddir@
-abs_srcdir = @abs_srcdir@
-abs_top_builddir = @abs_top_builddir@
-abs_top_srcdir = @abs_top_srcdir@
-ac_ct_AR = @ac_ct_AR@
-ac_ct_CC = @ac_ct_CC@
-ac_ct_CXX = @ac_ct_CXX@
-ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
-am__leading_dot = @am__leading_dot@
-am__tar = @am__tar@
-am__untar = @am__untar@
-bindir = @bindir@
-build = @build@
-build_alias = @build_alias@
-build_cpu = @build_cpu@
-build_os = @build_os@
-build_vendor = @build_vendor@
-builddir = @builddir@
-datadir = @datadir@
-datarootdir = @datarootdir@
-docdir = @docdir@
-dvidir = @dvidir@
-exec_prefix = @exec_prefix@
-host = @host@
-host_alias = @host_alias@
-host_cpu = @host_cpu@
-host_os = @host_os@
-host_vendor = @host_vendor@
-htmldir = @htmldir@
-includedir = @includedir@
-infodir = @infodir@
-install_sh = @install_sh@
-libdir = @libdir@
-libexecdir = @libexecdir@
-localedir = @localedir@
-localstatedir = @localstatedir@
-mandir = @mandir@
-mkdir_p = @mkdir_p@
-oldincludedir = @oldincludedir@
-pdfdir = @pdfdir@
-prefix = @prefix@
-program_transform_name = @program_transform_name@
-psdir = @psdir@
-sbindir = @sbindir@
-sharedstatedir = @sharedstatedir@
-srcdir = @srcdir@
-sysconfdir = @sysconfdir@
-target_alias = @target_alias@
-top_build_prefix = @top_build_prefix@
-top_builddir = @top_builddir@
-top_srcdir = @top_srcdir@
-pkgincludesubdir = $(pkgincludedir)/algorithms/gauss
-pkgincludesub_HEADERS = \
- gauss.inl \
- gauss-det.inl \
- gauss-rank.inl \
- gauss-solve.inl \
- gauss-nullspace.inl \
- gauss-elim.inl \
- gauss-pivot.inl \
- gauss-gf2.inl \
- gauss-elim-gf2.inl \
- gauss-rank-gf2.inl \
- gauss-pivot-gf2.inl \
- gauss-solve-gf2.inl
-
-all: all-am
-
-.SUFFIXES:
-$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps)
- @for dep in $?; do \
- case '$(am__configure_deps)' in \
- *$$dep*) \
- ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
- && { if test -f $@; then exit 0; else break; fi; }; \
- exit 1;; \
- esac; \
- done; \
- echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu --ignore-deps linbox/algorithms/gauss/Makefile'; \
- $(am__cd) $(top_srcdir) && \
- $(AUTOMAKE) --gnu --ignore-deps linbox/algorithms/gauss/Makefile
-.PRECIOUS: Makefile
-Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
- @case '$?' in \
- *config.status*) \
- cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
- *) \
- echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
- cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
- esac;
-
-$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
- cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-
-$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
- cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
- cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-$(am__aclocal_m4_deps):
-
-mostlyclean-libtool:
- -rm -f *.lo
-
-clean-libtool:
- -rm -rf .libs _libs
-install-pkgincludesubHEADERS: $(pkgincludesub_HEADERS)
- @$(NORMAL_INSTALL)
- @list='$(pkgincludesub_HEADERS)'; test -n "$(pkgincludesubdir)" || list=; \
- if test -n "$$list"; then \
- echo " $(MKDIR_P) '$(DESTDIR)$(pkgincludesubdir)'"; \
- $(MKDIR_P) "$(DESTDIR)$(pkgincludesubdir)" || exit 1; \
- fi; \
- for p in $$list; do \
- if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
- echo "$$d$$p"; \
- done | $(am__base_list) | \
- while read files; do \
- echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(pkgincludesubdir)'"; \
- $(INSTALL_HEADER) $$files "$(DESTDIR)$(pkgincludesubdir)" || exit $$?; \
- done
-
-uninstall-pkgincludesubHEADERS:
- @$(NORMAL_UNINSTALL)
- @list='$(pkgincludesub_HEADERS)'; test -n "$(pkgincludesubdir)" || list=; \
- files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
- dir='$(DESTDIR)$(pkgincludesubdir)'; $(am__uninstall_files_from_dir)
-
-ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
- list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
- unique=`for i in $$list; do \
- if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
- done | \
- $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
- END { if (nonempty) { for (i in files) print i; }; }'`; \
- mkid -fID $$unique
-tags: TAGS
-
-TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
- $(TAGS_FILES) $(LISP)
- set x; \
- here=`pwd`; \
- list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
- unique=`for i in $$list; do \
- if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
- done | \
- $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
- END { if (nonempty) { for (i in files) print i; }; }'`; \
- shift; \
- if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
- test -n "$$unique" || unique=$$empty_fix; \
- if test $$# -gt 0; then \
- $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
- "$$@" $$unique; \
- else \
- $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
- $$unique; \
- fi; \
- fi
-ctags: CTAGS
-CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
- $(TAGS_FILES) $(LISP)
- list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
- unique=`for i in $$list; do \
- if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
- done | \
- $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
- END { if (nonempty) { for (i in files) print i; }; }'`; \
- test -z "$(CTAGS_ARGS)$$unique" \
- || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
- $$unique
-
-GTAGS:
- here=`$(am__cd) $(top_builddir) && pwd` \
- && $(am__cd) $(top_srcdir) \
- && gtags -i $(GTAGS_ARGS) "$$here"
-
-distclean-tags:
- -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
-
-distdir: $(DISTFILES)
- @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
- topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
- list='$(DISTFILES)'; \
- dist_files=`for file in $$list; do echo $$file; done | \
- sed -e "s|^$$srcdirstrip/||;t" \
- -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
- case $$dist_files in \
- */*) $(MKDIR_P) `echo "$$dist_files" | \
- sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
- sort -u` ;; \
- esac; \
- for file in $$dist_files; do \
- if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
- if test -d $$d/$$file; then \
- dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
- if test -d "$(distdir)/$$file"; then \
- find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
- fi; \
- if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
- cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
- find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
- fi; \
- cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
- else \
- test -f "$(distdir)/$$file" \
- || cp -p $$d/$$file "$(distdir)/$$file" \
- || exit 1; \
- fi; \
- done
-check-am: all-am
-check: check-am
-all-am: Makefile $(HEADERS)
-installdirs:
- for dir in "$(DESTDIR)$(pkgincludesubdir)"; do \
- test -z "$$dir" || $(MKDIR_P) "$$dir"; \
- done
-install: install-am
-install-exec: install-exec-am
-install-data: install-data-am
-uninstall: uninstall-am
-
-install-am: all-am
- @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
-
-installcheck: installcheck-am
-install-strip:
- if test -z '$(STRIP)'; then \
- $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
- install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
- install; \
- else \
- $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
- install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
- "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
- fi
-mostlyclean-generic:
-
-clean-generic:
-
-distclean-generic:
- -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
- -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
-
-maintainer-clean-generic:
- @echo "This command is intended for maintainers to use"
- @echo "it deletes files that may require special tools to rebuild."
-clean: clean-am
-
-clean-am: clean-generic clean-libtool mostlyclean-am
-
-distclean: distclean-am
- -rm -f Makefile
-distclean-am: clean-am distclean-generic distclean-tags
-
-dvi: dvi-am
-
-dvi-am:
-
-html: html-am
-
-html-am:
-
-info: info-am
-
-info-am:
-
-install-data-am: install-pkgincludesubHEADERS
-
-install-dvi: install-dvi-am
-
-install-dvi-am:
-
-install-exec-am:
-
-install-html: install-html-am
-
-install-html-am:
-
-install-info: install-info-am
-
-install-info-am:
-
-install-man:
-
-install-pdf: install-pdf-am
-
-install-pdf-am:
-
-install-ps: install-ps-am
-
-install-ps-am:
-
-installcheck-am:
-
-maintainer-clean: maintainer-clean-am
- -rm -f Makefile
-maintainer-clean-am: distclean-am maintainer-clean-generic
-
-mostlyclean: mostlyclean-am
-
-mostlyclean-am: mostlyclean-generic mostlyclean-libtool
-
-pdf: pdf-am
-
-pdf-am:
-
-ps: ps-am
-
-ps-am:
-
-uninstall-am: uninstall-pkgincludesubHEADERS
-
-.MAKE: install-am install-strip
-
-.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \
- clean-libtool ctags distclean distclean-generic \
- distclean-libtool distclean-tags distdir dvi dvi-am html \
- html-am info info-am install install-am install-data \
- install-data-am install-dvi install-dvi-am install-exec \
- install-exec-am install-html install-html-am install-info \
- install-info-am install-man install-pdf install-pdf-am \
- install-pkgincludesubHEADERS install-ps install-ps-am \
- install-strip installcheck installcheck-am installdirs \
- maintainer-clean maintainer-clean-generic mostlyclean \
- mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
- tags uninstall uninstall-am uninstall-pkgincludesubHEADERS
-
-
-# Tell versions [3.59,3.63) of GNU make to not export all variables.
-# Otherwise a system limit (for SysV at least) may be exceeded.
-.NOEXPORT:
diff --git a/linbox/algorithms/gauss/gauss-elim-gf2.inl b/linbox/algorithms/gauss/gauss-elim-gf2.inl
index abd99b5..91c913c 100644
--- a/linbox/algorithms/gauss/gauss-elim-gf2.inl
+++ b/linbox/algorithms/gauss/gauss-elim-gf2.inl
@@ -3,20 +3,20 @@
*
* Time-stamp: <21 Jan 10 15:08:59 Jean-Guillaume.Dumas at imag.fr>
*
- *
+ *
* ========LICENCE========
* This file is part of the library LinBox.
- *
+ *
* LinBox is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
- *
+ *
* This library 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
* Lesser General Public License for more details.
- *
+ *
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
@@ -60,7 +60,7 @@ namespace LinBox
if ( static_cast<long>(*pin_it) != indpermut) {
--pin_it;
// Only k there
- *kin_it = indpermut;
+ *kin_it = (size_t)indpermut;
typename Vector::value_type etmp = *kin_it;
typename Vector::iterator current = kin_it;
typename Vector::iterator next = kin_it; ++next;
@@ -72,7 +72,7 @@ namespace LinBox
else {
--pin_it;
// Only k there
- *kin_it = indpermut;
+ *kin_it = (size_t)indpermut;
typename Vector::value_type etmp = *kin_it;
typename Vector::iterator current = kin_it;
typename Vector::iterator next = kin_it; ++next;
@@ -142,26 +142,26 @@ namespace LinBox
unsigned long j_head = 0;
for (; j_head < nj; ++j_head) {
- if (static_cast<long>(lignecourante[j_head]) >= indpermut) break;
+ if (static_cast<long>(lignecourante[(size_t)j_head]) >= indpermut) break;
#if 0
std::cerr << "ELIMINATE, j_head: " << j_head << std::endl;
#endif
}
if (j_head < nj) {
- if (static_cast<long>(lignecourante[j_head]) == indpermut) {
+ if (static_cast<long>(lignecourante[(size_t)j_head]) == indpermut) {
// -------------------------------------------
// Permutation
if ( indpermut != static_cast<long>(k)) {
if (lignecourante[0] != k) {
// zero <--> non zero
- E tmp = lignecourante[j_head];
+ E tmp = lignecourante[(size_t)j_head];
--columns[tmp];
++columns[k];
tmp = k;
- for (long l = j_head; l > 0; l--)
- lignecourante[l] = lignecourante[l-1];
+ for (long l = (long)j_head; l > 0; l--)
+ lignecourante[(size_t)l] = lignecourante[(size_t)l-1];
lignecourante[0] = tmp;
}
@@ -179,15 +179,14 @@ namespace LinBox
// A[i,k] <-- - A[i,k] / A[k,k]
headpivot = true;
- --columns[lignecourante[j_head] ];
+ --columns[lignecourante[(size_t)j_head] ];
// if A[k,j]=0, then A[i,j] <-- A[i,j]
while (j < j_head) {
- construit[j] = lignecourante[j];
+ construit[j] = lignecourante[(size_t)j];
++j;
}
- unsigned long j_piv;
unsigned long l = 0;
@@ -196,15 +195,16 @@ namespace LinBox
// for all j such that (j>k) and A[k,j]!=0
while (l < npiv) {
+ unsigned long j_piv;
j_piv = lignepivot[l];
// if A[k,j]=0, then A[i,j] <-- A[i,j]
- while ((m < nj) && (lignecourante[m] < j_piv))
- construit[j++] = lignecourante[m++];
+ while ((m < nj) && (lignecourante[(size_t)m] < j_piv))
+ construit[j++] = lignecourante[(size_t)m++];
// if A[i,j]!=0, then A[i,j] <-- A[i,j] - A[i,k]*A[k,j]
- if ((m < nj) && (lignecourante[m] == j_piv)) {
- --columns[lignecourante[m++]];
+ if ((m < nj) && (lignecourante[(size_t)m] == j_piv)) {
+ --columns[lignecourante[(size_t)m++]];
}
else {
++columns[j_piv];
@@ -216,7 +216,7 @@ namespace LinBox
// if A[k,j]=0, then A[i,j] <-- A[i,j]
while (m<nj)
- construit[j++] = lignecourante[m++];
+ construit[j++] = lignecourante[(size_t)m++];
construit.resize (j);
lignecourante = construit;
@@ -239,18 +239,18 @@ namespace LinBox
unsigned long l = 0;
for (; l < nj; ++l)
- if (lignecourante[l] >= k) break;
+ if (lignecourante[(size_t)l] >= k) break;
- if ((l < nj) && (lignecourante[l] == k)) {
+ if ((l < nj) && (lignecourante[(size_t)l] == k)) {
// non zero <--> zero
- E tmp = lignecourante[l];
+ E tmp ; // = (E)lignecourante[(size_t)l];
--columns[k];
- ++columns[indpermut];
- tmp = indpermut;
+ ++columns[(size_t)indpermut];
+ tmp = (E)indpermut;
unsigned long bjh = j_head-1;
for (; l < bjh; ++l)
- lignecourante[l] = lignecourante[l + 1];
+ lignecourante[(size_t)l] = lignecourante[(size_t)l + 1];
lignecourante[bjh] = tmp;
} // else // zero <--> zero
@@ -274,18 +274,18 @@ namespace LinBox
unsigned long l = 0;
for (; l < nj; ++l)
- if (lignecourante[l] >= k) break;
+ if (lignecourante[(size_t)l] >= k) break;
- if ((l < nj) && (lignecourante[l] == k)) {
+ if ((l < nj) && (lignecourante[(size_t)l] == k)) {
// non zero <--> zero
- E tmp = lignecourante[l];
+ E tmp ; // = (E) lignecourante[(size_t)l];
--columns[k];
- ++columns[indpermut];
- tmp = indpermut;
+ ++columns[(size_t)indpermut];
+ tmp = (E) indpermut;
unsigned long bjh = nj - 1;
for (; l < bjh; ++l)
- lignecourante[l] = lignecourante[l + 1];
+ lignecourante[(size_t)l] = lignecourante[(size_t)l + 1];
lignecourante[bjh] = tmp;
} // else
@@ -323,11 +323,10 @@ namespace LinBox
#endif // __LINBOX_gauss_elim_gf2_INL
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
// Local Variables:
// mode: C++
// tab-width: 8
// indent-tabs-mode: nil
// c-basic-offset: 8
// End:
-
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/algorithms/gauss/gauss-elim.inl b/linbox/algorithms/gauss/gauss-elim.inl
index 4f11f9d..6ffac37 100644
--- a/linbox/algorithms/gauss/gauss-elim.inl
+++ b/linbox/algorithms/gauss/gauss-elim.inl
@@ -3,20 +3,20 @@
*
* Time-stamp: <21 Jan 10 15:06:11 Jean-Guillaume.Dumas at imag.fr>
*
- *
+ *
* ========LICENCE========
* This file is part of the library LinBox.
- *
+ *
* LinBox is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
- *
+ *
* This library 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
* Lesser General Public License for more details.
- *
+ *
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
@@ -127,6 +127,7 @@ namespace LinBox
{
typedef typename Vector::value_type E;
+ typedef typename E::first_type E1;
unsigned long k = indcol - 1;
unsigned long nj = lignecourante.size () ;
@@ -148,30 +149,30 @@ namespace LinBox
unsigned long j_head = 0;
for (; j_head < nj; ++j_head) {
- if (static_cast<long>(lignecourante[j_head].first) >= indpermut) break;
+ if (static_cast<long>(lignecourante[(size_t)j_head].first) >= indpermut) break;
#if 0
std::cerr << "ELIMINATE, j_head: " << j_head << std::endl;
#endif
}
if (j_head < nj) {
- if (static_cast<long>(lignecourante[j_head].first) == indpermut) {
+ if (static_cast<long>(lignecourante[(size_t)j_head].first) == indpermut) {
// -------------------------------------------
// Permutation
if ( indpermut != static_cast<long>(k)) {
if (lignecourante[0].first == k) {
// non zero <--> non zero
- std::swap( lignecourante[0].second, lignecourante[j_head].second);
+ std::swap( lignecourante[0].second, lignecourante[(size_t)j_head].second);
}
else {
// zero <--> non zero
- E tmp = lignecourante[j_head];
- --columns[tmp.first];
- ++columns[k];
- tmp.first = (unsigned)k;
+ E tmp = lignecourante[(size_t)j_head];
+ --columns[(size_t)tmp.first];
+ ++columns[(size_t)k];
+ tmp.first = (E1)k;
for (long l = (long)j_head; l > 0; --l)
- lignecourante[l] = lignecourante[l-1];
+ lignecourante[(size_t)l] = lignecourante[(size_t)l-1];
lignecourante[0] = tmp;
}
@@ -190,18 +191,17 @@ namespace LinBox
// A[i,k] <-- - A[i,k] / A[k,k]
Element headcoeff;
- _field.divin (_field.neg (headcoeff, lignecourante[j_head].second),
+ field().divin (field().neg (headcoeff, lignecourante[(size_t)j_head].second),
lignepivot[0].second);
- --columns[lignecourante[j_head].first];
+ --columns[lignecourante[(size_t)j_head].first];
// if A[k,j]=0, then A[i,j] <-- A[i,j]
while (j < j_head) {
- construit[j] = lignecourante[j];
+ construit[j] = lignecourante[(size_t)j];
j++;
}
- unsigned long j_piv;
unsigned long l = 0;
@@ -210,6 +210,7 @@ namespace LinBox
// for all j such that (j>k) and A[k,j]!=0
while (l < npiv) {
+ unsigned long j_piv;
j_piv = lignepivot[l].first;
// if A[k,j]=0, then A[i,j] <-- A[i,j]
@@ -220,11 +221,11 @@ namespace LinBox
if ((m < nj) && (lignecourante[m].first == j_piv)) {
Element tmp;
- _field.axpy (tmp, headcoeff, lignepivot[l].second,
+ field().axpy (tmp, headcoeff, lignepivot[l].second,
lignecourante[m].second);
- if (! _field.isZero (tmp)) {
- _field.assign (lignecourante[m].second, tmp);
+ if (! field().isZero (tmp)) {
+ field().assign (lignecourante[m].second, tmp);
construit[j++] = lignecourante[m++];
}
else
@@ -233,9 +234,9 @@ namespace LinBox
else {
Element tmp;
- _field.mul (tmp, headcoeff, lignepivot[l].second);
+ field().mul (tmp, headcoeff, lignepivot[l].second);
- // if (! _field.isZero (tmp)) {
+ // if (! field().isZero (tmp)) {
++columns[j_piv];
construit[j++] = E ((unsigned)j_piv, tmp);
// }
@@ -272,18 +273,18 @@ namespace LinBox
unsigned long l = 0;
for (; l < nj; ++l)
- if (lignecourante[l].first >= k) break;
+ if (lignecourante[(size_t)l].first >= k) break;
- if ((l < nj) && (lignecourante[l].first == k)) {
+ if ((l < nj) && (lignecourante[(size_t)l].first == k)) {
// non zero <--> zero
- E tmp = lignecourante[l];
+ E tmp = lignecourante[(size_t)l];
--columns[k];
- ++columns[indpermut];
- tmp.first = (unsigned)indpermut;
+ ++columns[(size_t)indpermut];
+ tmp.first = (E1)indpermut;
unsigned long bjh = j_head-1;
for (; l < bjh; ++l)
- lignecourante[l] = lignecourante[l + 1];
+ lignecourante[(size_t)l] = lignecourante[(size_t)l + 1];
lignecourante[bjh] = tmp;
} // else // zero <--> zero
@@ -307,18 +308,18 @@ namespace LinBox
unsigned long l = 0;
for (; l < nj; ++l)
- if (lignecourante[l].first >= k) break;
+ if (lignecourante[(size_t)l].first >= k) break;
- if ((l < nj) && (lignecourante[l].first == k)) {
+ if ((l < nj) && (lignecourante[(size_t)l].first == k)) {
// non zero <--> zero
- E tmp = lignecourante[l];
+ E tmp = lignecourante[(size_t)l];
--columns[k];
- ++columns[indpermut];
- tmp.first = (unsigned)indpermut;
+ ++columns[(size_t)indpermut];
+ tmp.first = (E1)indpermut;
unsigned long bjh = nj - 1;
for (; l < bjh; ++l)
- lignecourante[l] = lignecourante[l + 1];
+ lignecourante[(size_t)l] = lignecourante[(size_t)l + 1];
lignecourante[bjh] = tmp;
} // else
@@ -358,6 +359,7 @@ namespace LinBox
{
typedef typename Vector::value_type E;
+ typedef typename E::first_type E1;
unsigned long k = indcol - 1;
unsigned long nj = lignecourante.size () ;
@@ -379,30 +381,30 @@ namespace LinBox
unsigned long j_head = 0;
for (; j_head < nj; ++j_head) {
- if (static_cast<long>(lignecourante[j_head].first) >= indpermut) break;
+ if (static_cast<long>(lignecourante[(size_t)j_head].first) >= indpermut) break;
#if 0
std::cerr << "ELIMINATE, j_head: " << j_head << std::endl;
#endif
}
if (j_head < nj) {
- if (static_cast<long>(lignecourante[j_head].first) == indpermut) {
+ if (static_cast<long>(lignecourante[(size_t)j_head].first) == indpermut) {
// -------------------------------------------
// Permutation
if ( indpermut != static_cast<long>(k)) {
if (lignecourante[0].first == k) {
// non zero <--> non zero
- std::swap( lignecourante[0].second, lignecourante[j_head].second);
+ std::swap( lignecourante[0].second, lignecourante[(size_t)j_head].second);
}
else {
// zero <--> non zero
- E tmp = lignecourante[j_head];
+ E tmp = lignecourante[(size_t)j_head];
--columns[tmp.first];
++columns[k];
- tmp.first = (unsigned)k;
+ tmp.first = (E1)k;
for (long l = (long)j_head; l > 0; --l)
- lignecourante[l] = lignecourante[l-1];
+ lignecourante[(size_t)l] = lignecourante[(size_t)l-1];
lignecourante[0] = tmp;
}
@@ -420,21 +422,20 @@ namespace LinBox
// A[i,k] <-- - A[i,k] / A[k,k]
Element headcoeff;
- _field.div( headpivot, lignecourante[j_head].second,
+ field().div( headpivot, lignecourante[(size_t)j_head].second,
lignepivot[0].second);
- _field.neg(headcoeff, headpivot);
- // _field.divin (_field.neg (headcoeff, lignecourante[j_head].second),
+ field().neg(headcoeff, headpivot);
+ // field().divin (field().neg (headcoeff, lignecourante[(size_t)j_head].second),
// lignepivot[0].second);
- --columns[lignecourante[j_head].first];
+ --columns[lignecourante[(size_t)j_head].first];
// if A[k,j]=0, then A[i,j] <-- A[i,j]
while (j < j_head) {
- construit[j] = lignecourante[j];
+ construit[j] = lignecourante[(size_t)j];
j++;
}
- unsigned long j_piv;
unsigned long l = 0;
@@ -443,6 +444,7 @@ namespace LinBox
// for all j such that (j>k) and A[k,j]!=0
while (l < npiv) {
+ unsigned long j_piv;
j_piv = lignepivot[l].first;
// if A[k,j]=0, then A[i,j] <-- A[i,j]
@@ -453,11 +455,11 @@ namespace LinBox
if ((m < nj) && (lignecourante[m].first == j_piv)) {
Element tmp;
- _field.axpy (tmp, headcoeff, lignepivot[l].second,
+ field().axpy (tmp, headcoeff, lignepivot[l].second,
lignecourante[m].second);
- if (! _field.isZero (tmp)) {
- _field.assign (lignecourante[m].second, tmp);
+ if (! field().isZero (tmp)) {
+ field().assign (lignecourante[m].second, tmp);
construit[j++] = lignecourante[m++];
}
else
@@ -466,9 +468,9 @@ namespace LinBox
else {
Element tmp;
- _field.mul (tmp, headcoeff, lignepivot[l].second);
+ field().mul (tmp, headcoeff, lignepivot[l].second);
- // if (! _field.isZero (tmp)) {
+ // if (! field().isZero (tmp)) {
++columns[j_piv];
construit[j++] = E ((unsigned)j_piv, tmp);
// }
@@ -505,18 +507,18 @@ namespace LinBox
unsigned long l = 0;
for (; l < nj; ++l)
- if (lignecourante[l].first >= k) break;
+ if (lignecourante[(size_t)l].first >= k) break;
- if ((l < nj) && (lignecourante[l].first == k)) {
+ if ((l < nj) && (lignecourante[(size_t)l].first == k)) {
// non zero <--> zero
- E tmp = lignecourante[l];
+ E tmp = lignecourante[(size_t)l];
--columns[k];
- ++columns[indpermut];
- tmp.first = (unsigned)indpermut;
+ ++columns[(size_t)indpermut];
+ tmp.first = (E1)indpermut;
unsigned long bjh = j_head-1;
for (; l < bjh; ++l)
- lignecourante[l] = lignecourante[l + 1];
+ lignecourante[(size_t)l] = lignecourante[(size_t)l + 1];
lignecourante[bjh] = tmp;
} // else // zero <--> zero
@@ -540,18 +542,18 @@ namespace LinBox
unsigned long l = 0;
for (; l < nj; ++l)
- if (lignecourante[l].first >= k) break;
+ if (lignecourante[(size_t)l].first >= k) break;
- if ((l < nj) && (lignecourante[l].first == k)) {
+ if ((l < nj) && (lignecourante[(size_t)l].first == k)) {
// non zero <--> zero
- E tmp = lignecourante[l];
+ E tmp = lignecourante[(size_t)l];
--columns[k];
- ++columns[indpermut];
- tmp.first = (unsigned)indpermut;
+ ++columns[(size_t)indpermut];
+ tmp.first = (E1)indpermut;
unsigned long bjh = nj - 1;
for (; l < bjh; ++l)
- lignecourante[l] = lignecourante[l + 1];
+ lignecourante[(size_t)l] = lignecourante[(size_t)l + 1];
lignecourante[bjh] = tmp;
} // else
@@ -587,6 +589,7 @@ namespace LinBox
const long &indpermut) const
{
typedef typename Vector::value_type E;
+ typedef typename E::first_type E1;
unsigned long k = indcol - 1;
unsigned long nj = lignecourante.size () ;
@@ -595,23 +598,23 @@ namespace LinBox
unsigned long j_head = 0;
for (; j_head < nj; ++j_head)
- if (static_cast<long>(lignecourante[j_head].first) >= indpermut) break;
+ if (static_cast<long>(lignecourante[(size_t)j_head].first) >= indpermut) break;
if (j_head < nj) {
- if (static_cast<long>(lignecourante[j_head].first) == indpermut) {
+ if (static_cast<long>(lignecourante[(size_t)j_head].first) == indpermut) {
// -------------------------------------------
// Permutation
if (indpermut != static_cast<long>(k)) {
if (lignecourante[0].first == k) {
// non zero <--> non zero
- std::swap( lignecourante[0].second, lignecourante[j_head].second);
+ std::swap( lignecourante[0].second, lignecourante[(size_t)j_head].second);
}
else {
// zero <--> non zero
- E tmp = lignecourante[j_head];
- tmp.first = k;
+ E tmp = lignecourante[(size_t)j_head];
+ tmp.first = (E1)k;
for (long l = (long)j_head; l > 0; --l)
- lignecourante[l] = lignecourante[l-1];
+ lignecourante[(size_t)l] = lignecourante[(size_t)l-1];
lignecourante[0] = tmp;
}
@@ -630,16 +633,15 @@ namespace LinBox
// A[i,k] <-- - A[i,k] / A[k,k]
Element headcoeff;
- _field.divin (_field.neg (headcoeff, lignecourante[j_head].second),
+ field().divin (field().neg (headcoeff, lignecourante[(size_t)j_head].second),
lignepivot[0].second);
// if A[k,j]=0, then A[i,j] <-- A[i,j]
while (j < j_head) {
- construit[j] = lignecourante[j];
+ construit[j] = lignecourante[(size_t)j];
j++;
}
- unsigned long j_piv;
unsigned long l = 0;
for (; l < npiv; l++)
@@ -647,6 +649,7 @@ namespace LinBox
// for all j such that (j>k) and A[k,j]!=0
while (l < npiv) {
+ unsigned long j_piv;
j_piv = lignepivot[l].first;
// if A[k,j]=0, then A[i,j] <-- A[i,j]
@@ -656,11 +659,11 @@ namespace LinBox
// if A[i,j]!=0, then A[i,j] <-- A[i,j] - A[i,k]*A[k,j]
if ((m < nj) && (lignecourante[m].first == j_piv)) {
Element tmp;
- _field.axpy (tmp, headcoeff, lignepivot[l].second,
+ field().axpy (tmp, headcoeff, lignepivot[l].second,
lignecourante[m].second);
- if (! _field.isZero (tmp)) {
- _field.assign (lignecourante[m].second, tmp);
+ if (! field().isZero (tmp)) {
+ field().assign (lignecourante[m].second, tmp);
construit[j++] = lignecourante[m++];
}
else
@@ -669,8 +672,8 @@ namespace LinBox
}
else {
Element tmp;
- _field.mul (tmp, headcoeff, lignepivot[l].second);
- // if (! _field.isZero (tmp))
+ field().mul (tmp, headcoeff, lignepivot[l].second);
+ // if (! field().isZero (tmp))
construit[j++] = E (j_piv, tmp);
// else
// std::cerr << "NEVER HAPPENED" << std::endl;
@@ -694,16 +697,16 @@ namespace LinBox
unsigned long l = 0;
for (; l < nj; ++l)
- if (lignecourante[l].first >= k) break;
+ if (lignecourante[(size_t)l].first >= k) break;
- if ((l < nj) && (lignecourante[l].first == k)) {
+ if ((l < nj) && (lignecourante[(size_t)l].first == k)) {
// non zero <--> zero
- E tmp = lignecourante[l];
- tmp.first = indpermut;
+ E tmp = lignecourante[(size_t)l];
+ tmp.first = (E1) indpermut;
unsigned long bjh = j_head -1;
for (; l < bjh; l++)
- lignecourante[l] = lignecourante[l + 1];
+ lignecourante[(size_t)l] = lignecourante[(size_t)l + 1];
lignecourante[bjh] = tmp;
} // else // zero <--> zero
@@ -728,16 +731,16 @@ namespace LinBox
unsigned long l = 0;
for (; l < nj; ++l)
- if (lignecourante[l].first >= k) break;
+ if (lignecourante[(size_t)l].first >= k) break;
- if ((l < nj) && (lignecourante[l].first == k)) {
+ if ((l < nj) && (lignecourante[(size_t)l].first == k)) {
// non zero <--> zero
- E tmp = lignecourante[l];
- tmp.first = indpermut;
+ E tmp = lignecourante[(size_t)l];
+ tmp.first = (E1) indpermut;
unsigned long bjh = nj - 1;
for (; l < bjh; l++)
- lignecourante[l] = lignecourante[l + 1];
+ lignecourante[(size_t)l] = lignecourante[(size_t)l + 1];
lignecourante[bjh] = tmp;
} // else
@@ -772,49 +775,49 @@ void GaussDomain<_Field>::permute (Vector &lignecourante,
// precondition indpermut != k
unsigned long nj = lignecourante.size () ;
if (nj > 0) {
- Element tmp; _field.init(tmp);
+ Element tmp; field().init(tmp);
unsigned long kin = 0;
for (; kin < nj; ++kin)
if (static_cast<long>(lignecourante[kin].first) >= k) break;
if (kin < nj) {
unsigned long pin = kin;
for (; pin < nj; ++pin)
- if (static_cast<long>(lignecourante[pin].first) >= indpermut) break;
+ if (static_cast<long>(lignecourante[(size_t)pin].first) >= indpermut) break;
if ( static_cast<long>(lignecourante[kin].first) == k) {
if (pin < nj) {
- if ( static_cast<long>(lignecourante[pin].first) == indpermut) {
+ if ( static_cast<long>(lignecourante[(size_t)pin].first) == indpermut) {
// Both there
- std::swap( lignecourante[kin].second, lignecourante[pin].second);
+ std::swap( lignecourante[kin].second, lignecourante[(size_t)pin].second);
}
else {
// Only k there
- lignecourante[kin].first = indpermut;
+ lignecourante[kin].first = (E1)indpermut;
typename Vector::value_type etmp = lignecourante[kin];
--pin;
for(size_t i=kin; i<pin; ++i)
- lignecourante[i] = lignecourante[i+1];
- lignecourante[pin] = etmp;
+ lignecourante[(size_t)i] = lignecourante[(size_t)i+1];
+ lignecourante[(size_t)pin] = etmp;
}
}
else {
pin = nj-1;
// Only k there
- lignecourante[kin].first = indpermut;
+ lignecourante[kin].irst = indpermut;
typename Vector::value_type etmp = lignecourante[kin];
for(size_t i=kin; i<pin; ++i)
- lignecourante[i] = lignecourante[i+1];
- lignecourante[pin] = etmp;
+ lignecourante[(size_t)i] = lignecourante[(size_t)i+1];
+ lignecourante[(size_t)pin] = etmp;
}
}
else {
if (pin < nj) {
- if ( static_cast<long>(lignecourante[pin].first) == indpermut) {
+ if ( static_cast<long>(lignecourante[(size_t)pin].first) == indpermut) {
// Only indpermut there
- lignecourante[pin].first = k;
- typename Vector::value_type etmp = lignecourante[pin];
+ lignecourante[(size_t)pin].first = (E1)k;
+ typename Vector::value_type etmp = lignecourante[(size_t)pin];
for(size_t i = pin; i>kin; --i)
- lignecourante[i] = lignecourante[i-1];
+ lignecourante[(size_t)i] = lignecourante[(size_t)i-1];
lignecourante[kin] = etmp;
} // else Nobody
} // else Nobody
diff --git a/linbox/algorithms/gauss/gauss-gf2.inl b/linbox/algorithms/gauss/gauss-gf2.inl
index 68320d3..9a63203 100644
--- a/linbox/algorithms/gauss/gauss-gf2.inl
+++ b/linbox/algorithms/gauss/gauss-gf2.inl
@@ -3,20 +3,20 @@
*
* Time-stamp: <15 Jun 10 16:20:16 Jean-Guillaume.Dumas at imag.fr>
*
- *
+ *
* ========LICENCE========
* This file is part of the library LinBox.
- *
+ *
* LinBox is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
- *
+ *
* This library 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
* Lesser General Public License for more details.
- *
+ *
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
@@ -76,9 +76,9 @@ namespace LinBox
// assignment of LigneA with the domain object
for (unsigned long jj = 0; jj < Ni; ++jj)
for (unsigned long k = 0; k < LigneA[jj].size (); k++)
- ++col_density[LigneA[jj][k]];
+ ++col_density[LigneA[jj][(size_t)k]];
- long last = Ni - 1;
+ long last = (long)Ni - 1;
long c;
Rank = 0;
@@ -104,7 +104,7 @@ namespace LinBox
#ifdef __LINBOX_FILLIN__
long sl(0);
for (size_t l = 0; l < Ni; ++l)
- sl += LigneA[l].size ();
+ sl += LigneA[(size_t)l].size ();
commentator().report (Commentator::LEVEL_IMPORTANT, PARTIAL_RESULT)
<< "Fillin (" << Rank << "/" << Ni << ") = "
@@ -117,24 +117,25 @@ namespace LinBox
long l;
for(l = k; l < static_cast<long>(Ni); ++l) {
- if ( (s = LigneA[l].size()) != 0 ) {
+ if ( (s = (long)LigneA[(size_t)l].size()) != 0 ) {
p = l;
break;
}
}
if (s) {
- long sl;
// Row permutation for the sparsest row
- for (; l < static_cast<long>(Ni); ++l)
- if (((sl = LigneA[l].size ()) < s) && (sl)) {
+ for (; l < static_cast<long>(Ni); ++l) {
+ long sl;
+ if (((sl = (long)LigneA[(size_t)l].size ()) < s) && (sl)) {
s = sl;
p = l;
}
+ }
if (p != k) {
// std::cerr << "Permuting rows: " << k << " <--> " << p << std::endl;
- std::swap( *LigneA_k, LigneA[p]);
+ std::swap( *LigneA_k, LigneA[(size_t)p]);
}
@@ -143,14 +144,14 @@ namespace LinBox
if (c != -1) {
long ll;
if ( c != (static_cast<long>(Rank)-1) ) {
- P.permute(Rank-1,c);
+ P.permute(Rank-1,(size_t)c);
for (ll=0 ; ll < k ; ++ll)
- permuteBinary( LigneA[ll], Rank, c);
+ permuteBinary( LigneA[(size_t)ll], Rank, c);
}
- long npiv=LigneA_k->size();
+ long npiv=(long)LigneA_k->size();
for (ll = k+1; ll < static_cast<long>(Ni); ++ll) {
bool elim=false;
- eliminateBinary (elim, LigneA[ll], *LigneA_k, Rank, c, npiv, col_density);
+ eliminateBinary (elim, LigneA[(size_t)ll], *LigneA_k, Rank, c, (size_t)npiv, col_density);
}
}
@@ -159,20 +160,20 @@ namespace LinBox
nbelem += LigneA_k->size ();
#endif
}
- // LigneA.write(rep << "U:= ", FORMAT_MAPLE) << std::endl;
+ // LigneA.write(rep << "U:= ", Tag::FileFormat::Maple) << std::endl;
}//for k
- SparseFindPivotBinary ( LigneA[last], Rank, c, determinant);
+ SparseFindPivotBinary ( LigneA[(size_t)last], Rank, c, determinant);
if (c != -1) {
if ( c != (static_cast<long>(Rank)-1) ) {
- P.permute(Rank-1,c);
+ P.permute(Rank-1,(size_t)c);
for (long ll=0 ; ll < last ; ++ll)
- permuteBinary( LigneA[ll], Rank, c);
+ permuteBinary( LigneA[(size_t)ll], Rank, c);
}
}
#ifdef __LINBOX_COUNT__
- nbelem += LigneA[last].size ();
+ nbelem += LigneA[(size_t)last].size ();
commentator().report (Commentator::LEVEL_NORMAL, PARTIAL_RESULT)
<< "Left elements : " << nbelem << std::endl;
#endif
@@ -180,7 +181,7 @@ namespace LinBox
#ifdef __LINBOX_FILLIN__
long sl(0);
for (size_t l=0; l < Ni; ++l)
- sl += LigneA[l].size ();
+ sl += LigneA[(size_t)l].size ();
commentator().report (Commentator::LEVEL_IMPORTANT, PARTIAL_RESULT)
<< "Fillin (" << Rank << "/" << Ni << ") = " << sl
@@ -195,7 +196,7 @@ namespace LinBox
<< "Determinant : " << determinant
<< " over GF (2)" << std::endl;
- // LigneA.write(rep << "U:= ", FORMAT_MAPLE) << ':' << std::endl;
+ // LigneA.write(rep << "U:= ", Tag::FileFormat::Maple) << ':' << std::endl;
commentator().report (Commentator::LEVEL_IMPORTANT, PARTIAL_RESULT)
<< "Rank : " << Rank
@@ -252,9 +253,9 @@ namespace LinBox
// assignment of LigneA with the domain object
for (unsigned long jj = 0; jj < Ni; ++jj)
for (unsigned long k = 0; k < LigneA[jj].size (); k++)
- ++col_density[LigneA[jj][k]];
+ ++col_density[LigneA[jj][(size_t)k]];
- long last = Ni - 1;
+ long last = (long)Ni - 1;
long c;
Rank = 0;
@@ -280,7 +281,7 @@ namespace LinBox
#ifdef __LINBOX_FILLIN__
long sl(0);
for (size_t l = 0; l < Ni; ++l)
- sl += LigneA[l].size ();
+ sl += LigneA[(size_t)l].size ();
commentator().report (Commentator::LEVEL_IMPORTANT, PARTIAL_RESULT)
<< "Fillin (" << Rank << "/" << Ni << ") = "
@@ -293,26 +294,27 @@ namespace LinBox
long l;
for(l = k; l < static_cast<long>(Ni); ++l) {
- if ( (s = LigneA[l].size()) ) {
+ if ( (s = (long)LigneA[(size_t)l].size()) ) {
p = l;
break;
}
}
if (s) {
- long sl;
// Row permutation for the sparsest row
- for (; l < static_cast<long>(Ni); ++l)
- if (((sl = LigneA[l].size ()) < s) && (sl)) {
+ for (; l < static_cast<long>(Ni); ++l){
+ long sl;
+ if (((sl = (long) LigneA[(size_t)l].size ()) < s) && (sl)) {
s = sl;
p = l;
}
+ }
if (p != k) {
// std::cerr << "Permuting rows: " << k << " <--> " << p << std::endl;
- invQ.push_front( std::pair<size_t,size_t>(k,p) );
- std::swap( *LigneA_k, LigneA[p]);
- std::swap( LigneL[k], LigneL[p]);
+ invQ.push_front( std::pair<size_t,size_t>((size_t)k,(size_t)p) );
+ std::swap( *LigneA_k, LigneA[(size_t)p]);
+ std::swap( LigneL[(size_t)k], LigneL[(size_t)p]);
}
@@ -321,15 +323,15 @@ namespace LinBox
if (c != -1) {
long ll;
if ( c != (static_cast<long>(Rank)-1) ) {
- P.permute(Rank-1,c);
+ P.permute(Rank-1,(size_t)c);
for (ll=0 ; ll < k ; ++ll)
- permuteBinary( LigneA[ll], Rank, c);
+ permuteBinary( LigneA[(size_t)ll], Rank, c);
}
- long npiv=LigneA_k->size();
+ long npiv=(long)LigneA_k->size();
for (ll = k+1; ll < static_cast<long>(Ni); ++ll) {
E hc; hc=Rank-1; bool elim=false;
- eliminateBinary (elim, LigneA[ll], *LigneA_k, Rank, c, npiv, col_density);
- if(elim) LigneL[ll].push_back(hc);
+ eliminateBinary (elim, LigneA[(size_t)ll], *LigneA_k, Rank, c, (size_t)npiv, col_density);
+ if(elim) LigneL[(size_t)ll].push_back(hc);
}
}
@@ -338,24 +340,24 @@ namespace LinBox
nbelem += LigneA_k->size ();
#endif
}
- LigneL[k].push_back(k);
- // LigneL.write(rep << "L:= ", FORMAT_MAPLE) << std::endl;
- // LigneA.write(rep << "U:= ", FORMAT_MAPLE) << std::endl;
+ LigneL[(size_t)k].push_back((size_t)k);
+ // LigneL.write(rep << "L:= ", Tag::FileFormat::Maple) << std::endl;
+ // LigneA.write(rep << "U:= ", Tag::FileFormat::Maple) << std::endl;
}//for k
- SparseFindPivotBinary ( LigneA[last], Rank, c, determinant);
+ SparseFindPivotBinary ( LigneA[(size_t)last], Rank, c, determinant);
if (c != -1) {
if ( c != (static_cast<long>(Rank)-1) ) {
- P.permute(Rank-1,c);
+ P.permute(Rank-1,(size_t)c);
for (long ll=0 ; ll < last ; ++ll)
- permuteBinary( LigneA[ll], Rank, c);
+ permuteBinary( LigneA[(size_t)ll], Rank, c);
}
}
- LigneL[last].push_back(last);
+ LigneL[(size_t)last].push_back((size_t)last);
#ifdef __LINBOX_COUNT__
- nbelem += LigneA[last].size ();
+ nbelem += LigneA[(size_t)last].size ();
commentator().report (Commentator::LEVEL_NORMAL, PARTIAL_RESULT)
<< "Left elements : " << nbelem << std::endl;
#endif
@@ -363,7 +365,7 @@ namespace LinBox
#ifdef __LINBOX_FILLIN__
long sl(0);
for (size_t l=0; l < Ni; ++l)
- sl += LigneA[l].size ();
+ sl += LigneA[(size_t)l].size ();
commentator().report (Commentator::LEVEL_IMPORTANT, PARTIAL_RESULT)
<< "Fillin (" << Rank << "/" << Ni << ") = " << sl
@@ -382,10 +384,10 @@ namespace LinBox
Q.permute( it->first, it->second );
#if 0
- Q.write(rep << "Q:= ", FORMAT_MAPLE) << ':' << std::endl;
- LigneL.write(rep << "L:= ", FORMAT_MAPLE) << ':' << std::endl;
- LigneA.write(rep << "U:= ", FORMAT_MAPLE) << ':' << std::endl;
- P.write(rep << "P:= ", FORMAT_MAPLE) << ':' << std::endl;
+ Q.write(rep << "Q:= ", Tag::FileFormat::Maple) << ':' << std::endl;
+ LigneL.write(rep << "L:= ", Tag::FileFormat::Maple) << ':' << std::endl;
+ LigneA.write(rep << "U:= ", Tag::FileFormat::Maple) << ':' << std::endl;
+ P.write(rep << "P:= ", Tag::FileFormat::Maple) << ':' << std::endl;
#endif
commentator().report (Commentator::LEVEL_IMPORTANT, PARTIAL_RESULT)
<< "Rank : " << Rank
@@ -402,11 +404,10 @@ namespace LinBox
#endif // __LINBOX_gauss_gf2_INL
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
// Local Variables:
// mode: C++
// tab-width: 8
// indent-tabs-mode: nil
// c-basic-offset: 8
// End:
-
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
diff --git a/linbox/algorithms/gauss/gauss-nullspace.inl b/linbox/algorithms/gauss/gauss-nullspace.inl
index 4f072f6..0f46c5b 100644
--- a/linbox/algorithms/gauss/gauss-nullspace.inl
+++ b/linbox/algorithms/gauss/gauss-nullspace.inl
@@ -4,20 +4,20 @@
* Written by Jean-Guillaume Dumas <Jean-Guillaume.Dumas at imag.fr>
* Time-stamp: <21 Jun 10 14:43:11 Jean-Guillaume.Dumas at imag.fr>
*
- *
+ *
* ========LICENCE========
* This file is part of the library LinBox.
- *
+ *
* LinBox is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
- *
+ *
* This library 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
* Lesser General Public License for more details.
- *
+ *
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
@@ -28,7 +28,7 @@
#ifndef __LINBOX_gauss_nullspace_INL
#define __LINBOX_gauss_nullspace_INL
-#include "linbox/blackbox/sparse.h"
+#include "linbox/matrix/sparse-matrix.h"
#include "linbox/algorithms/gauss.h"
#include "linbox/algorithms/triangular-solve.h"
#include "linbox/blackbox/permutation.h"
@@ -46,13 +46,13 @@ namespace LinBox
{
if (Rank == 0) {
for(size_t i=0; i<U.coldim(); ++i)
- x.setEntry(i,i,_field.one);
+ x.setEntry(i,i,field().one);
}
else {
unsigned long nullity = U.coldim()-Rank;
if (nullity != 0) {
// compute U2T s.t. U = [ U1 | -U2T^T ]
- Matrix U2T(_field,nullity,Rank);
+ Matrix U2T(field(),nullity,Rank);
for(typename Matrix::ConstIndexedIterator uit=U.IndexedBegin();
uit != U.IndexedEnd(); ++uit) {
@@ -61,7 +61,7 @@ namespace LinBox
}
for(typename Matrix::Iterator u2it=U2T.Begin();
u2it != U2T.End(); ++u2it)
- _field.negin(*u2it);
+ field().negin(*u2it);
// Compute the basis vector by vector
@@ -71,17 +71,17 @@ namespace LinBox
// Solve for upper part of basis
upperTriangularSparseSolve(W1Ti, Rank, U, U2T[i]);
// Add identity for lower part
- W1Ti.push_back( typename SparseVect::Element((unsigned)(Rank+i), _field.one ) );
+ W1Ti.push_back( typename SparseVect::Element((unsigned)(Rank+i), field().one ) );
for(size_t j=0; j<W1Ti.size(); ++j) {
// P.applyTranspose(x[i],W1T[i]);
// Transposein(x)
- x.setEntry( P.getStorage()[ W1Ti[j].first ], i, W1Ti[j].second );
+ x.setEntry( (size_t)P.getStorage()[ (size_t)W1Ti[(size_t)j].first ], i, W1Ti[j].second );
}
}
}
}
- // x.write( std::cerr << "X:=", FORMAT_MAPLE ) << ';' << std::endl;
+ // x.write( std::cerr << "X:=", Tag::FileFormat::Maple ) << ';' << std::endl;
return x;
}
@@ -102,13 +102,13 @@ namespace LinBox
unsigned long Rank;
size_t Ni(A.rowdim()),Nj(A.coldim());
- Permutation<Field> P((int)Nj,_field);
+ Permutation<Field> P((int)Nj,field());
- // A.write( std::cerr << "A:=", FORMAT_MAPLE ) << ';' << std::endl;
+ // A.write( std::cerr << "A:=", Tag::FileFormat::Maple ) << ';' << std::endl;
this->InPlaceLinearPivoting(Rank, Det, A, P, Ni, Nj );
- // P.write( std::cerr << "P:=", FORMAT_MAPLE ) << ';' << std::endl;
- // A.write( std::cerr << "Ua:=", FORMAT_MAPLE ) << ';' << std::endl;
+ // P.write( std::cerr << "P:=", Tag::FileFormat::Maple ) << ';' << std::endl;
+ // A.write( std::cerr << "Ua:=", Tag::FileFormat::Maple ) << ';' << std::endl;
for(size_t i=0; i< Ni; ++i) {
if (A[i].size() == 0) {
@@ -123,7 +123,7 @@ namespace LinBox
}
}
- // A.write( std::cerr << "Ub:=", FORMAT_MAPLE ) << ';' << std::endl;
+ // A.write( std::cerr << "Ub:=", Tag::FileFormat::Maple ) << ';' << std::endl;
return this->nullspacebasis(x, Rank, A, P);
}
@@ -132,7 +132,7 @@ namespace LinBox
template <class Matrix, class Block> inline Block&
GaussDomain<_Field>::nullspacebasis(Block& x, const Matrix& A) const
{
- SparseMatrix<Field, typename LinBox::Vector<Field>::SparseSeq> A1 (A);
+ SparseMatrix<Field, SparseMatrixFormat::SparseSeq> A1 (A);
return this->nullspacebasisin(x, A1);
}
diff --git a/linbox/algorithms/gauss/gauss-pivot-gf2.inl b/linbox/algorithms/gauss/gauss-pivot-gf2.inl
index c110120..2094b64 100644
--- a/linbox/algorithms/gauss/gauss-pivot-gf2.inl
+++ b/linbox/algorithms/gauss/gauss-pivot-gf2.inl
@@ -3,20 +3,20 @@
*
* Time-stamp: <21 Jan 10 15:08:59 Jean-Guillaume.Dumas at imag.fr>
*
- *
+ *
* ========LICENCE========
* This file is part of the library LinBox.
- *
+ *
* LinBox is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
- *
+ *
* This library 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
* Lesser General Public License for more details.
- *
+ *
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
@@ -48,15 +48,16 @@ namespace LinBox
#endif
typedef typename Vector::value_type E;
- long nj = lignepivot.size ();
+ long nj = (long)lignepivot.size ();
if (nj > 0) {
- indpermut = lignepivot.front();
+ indpermut = (long)lignepivot.front();
- long ds = --columns[indpermut], dl, p = 0;
+ long ds = (long) --columns[(size_t)indpermut], p = 0;
for (long j = 1; j < nj; ++j) {
- if ((dl = --columns[lignepivot[j]]) < ds) {
+ long dl;
+ if ((dl = (long) --columns[lignepivot[(size_t)j]]) < ds) {
ds = dl;
p = j;
}
@@ -64,14 +65,14 @@ namespace LinBox
if (p != 0) {
if (indpermut == static_cast<long>(indcol)) {
- indpermut = lignepivot[p];
+ indpermut = (long)lignepivot[(size_t)p];
}
else {
- E ttm = lignepivot[p];
- indpermut = ttm;
+ E ttm = (E)lignepivot[(size_t)p];
+ indpermut = (long)ttm;
for (long m = p; m; --m)
- lignepivot[m] = lignepivot[m-1];
+ lignepivot[(size_t)m] = lignepivot[(size_t)m-1];
lignepivot[0] = ttm;
}
@@ -103,10 +104,10 @@ namespace LinBox
long &indpermut,
bool& ) const // determinant
{
- long nj = lignepivot.size ();
+ long nj = (long)lignepivot.size ();
if (nj > 0) {
- indpermut = lignepivot.front();
+ indpermut = (long)lignepivot.front();
if (indpermut != static_cast<long>(indcol)){
lignepivot.front() = indcol;
}
@@ -122,11 +123,10 @@ namespace LinBox
#endif // __LINBOX_gauss_pivot_gf2_INL
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
// Local Variables:
// mode: C++
// tab-width: 8
// indent-tabs-mode: nil
// c-basic-offset: 8
// End:
-
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
diff --git a/linbox/algorithms/gauss/gauss-pivot.inl b/linbox/algorithms/gauss/gauss-pivot.inl
index 579ca73..6ea301e 100644
--- a/linbox/algorithms/gauss/gauss-pivot.inl
+++ b/linbox/algorithms/gauss/gauss-pivot.inl
@@ -2,20 +2,20 @@
* Copyright (C) 2009,2010 The LinBox group
* Written by JG Dumas <Jean-Guillaume.Dumas at imag.fr>
*
- *
+ *
* ========LICENCE========
* This file is part of the library LinBox.
- *
+ *
* LinBox is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
- *
+ *
* This library 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
* Lesser General Public License for more details.
- *
+ *
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
@@ -48,17 +48,18 @@ namespace LinBox
// std::cerr << "]" << std::endl;
typedef typename Vector::value_type E;
- long nj = lignepivot.size ();
+ long nj = (long) lignepivot.size ();
- bool pivoting = false;
if (nj > 0) {
- indpermut = lignepivot[0].first;
+ bool pivoting = false;
+ indpermut = (long)lignepivot[0].first;
- long ds = --columns[indpermut], dl, p = 0;
+ long ds = (long) --columns[(size_t)indpermut], p = 0;
for (long j = 1; j < nj; ++j) {
- if ((dl = --columns[lignepivot[j].first]) < ds) {
+ long dl;
+ if ((dl =(long) --columns[lignepivot[(size_t)j].first]) < ds) {
ds = dl;
p = j;
}
@@ -67,21 +68,21 @@ namespace LinBox
if (p != 0) {
pivoting = true;
if (indpermut == static_cast<long>(indcol)) {
- indpermut = lignepivot[p].first;
- std::swap( lignepivot[p].second, lignepivot[0].second);
+ indpermut =(long) lignepivot[(size_t)p].first;
+ std::swap( lignepivot[(size_t)p].second, lignepivot[0].second);
}
else {
- E ttm = lignepivot[p];
- indpermut = ttm.first;
+ E ttm = lignepivot[(size_t)p];
+ indpermut = (long)ttm.first;
for (long m = p; m; --m)
- lignepivot[m] = lignepivot[m-1];
+ lignepivot[(size_t)m] = lignepivot[(size_t)m-1];
lignepivot[0] = ttm;
}
}
- _field.mulin(determinant, lignepivot[0].second);
+ field().mulin(determinant, lignepivot[0].second);
if (indpermut != static_cast<long>(indcol)) {
// std::cerr << "Permuting col: " << indpermut << " <--> " << indcol << std::endl;
// no need to decrement/increment, already done during the search
@@ -89,7 +90,7 @@ namespace LinBox
pivoting = true;
}
- if (pivoting) _field.negin(determinant);
+ if (pivoting) field().negin(determinant);
++indcol;
}
else
@@ -111,15 +112,15 @@ namespace LinBox
long &indpermut,
Element& determinant) const
{
- long nj = lignepivot.size ();
+ long nj = (long)lignepivot.size ();
if (nj > 0) {
- indpermut = lignepivot[0].first;
- _field.mulin(determinant, lignepivot[0].second);
+ indpermut = (long) lignepivot[0].first;
+ field().mulin(determinant, lignepivot[0].second);
if (indpermut != static_cast<long>(indcol)){
// std::cerr << "Permuting col: " << lignepivot[0].first << " <--> " << indcol << std::endl;
lignepivot[0].first = (unsigned)indcol;
- _field.negin(determinant);
+ field().negin(determinant);
}
++indcol;
}
@@ -138,16 +139,16 @@ namespace LinBox
long j = (long)k;
for (; j < n ; ++j )
- if (!_field.isZero (lignepivot[j])) break ;
+ if (!field().isZero (lignepivot[(size_t)j])) break ;
if (j == n )
indpermut = -1 ;
else {
indpermut = j ;
if (indpermut != (long)k) {
- typename Vector::value_type tmp = lignepivot[k] ;
- lignepivot[k] = lignepivot[j] ;
- lignepivot[j] = tmp ;
+ typename Vector::value_type tmp = lignepivot[(size_t)k] ;
+ lignepivot[(size_t)k] = lignepivot[(size_t)j] ;
+ lignepivot[(size_t)j] = tmp ;
}
++k;
diff --git a/linbox/algorithms/gauss/gauss-solve-gf2.inl b/linbox/algorithms/gauss/gauss-solve-gf2.inl
old mode 100644
new mode 100755
index 31f7e91..31b7b6b
--- a/linbox/algorithms/gauss/gauss-solve-gf2.inl
+++ b/linbox/algorithms/gauss/gauss-solve-gf2.inl
@@ -2,22 +2,22 @@
* Copyright (C) LinBox 2009
*
* Written by Jean-Guillaume Dumas <Jean-Guillaume.Dumas at imag.fr>
- * Time-stamp: <23 Mar 12 17:32:19 Jean-Guillaume.Dumas at imag.fr>
+ * Time-stamp: <29 Oct 15 20:18:20 Jean-Guillaume.Dumas at imag.fr>
+ *
*
- *
* ========LICENCE========
* This file is part of the library LinBox.
- *
+ *
* LinBox is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
- *
+ *
* This library 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
* Lesser General Public License for more details.
- *
+ *
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
@@ -43,7 +43,8 @@ namespace LinBox
const Vector2& b) const
{
- Vector2 y(U.rowdim()), v(U.rowdim());
+ const GF2 F2;
+ Vector2 y(F2, U.rowdim()), v(F2, U.rowdim());
Q.applyTranspose(y, b);
@@ -69,10 +70,10 @@ namespace LinBox
this->QLUPin(Rank, Det, Q, L, A, P, A.rowdim(), A.coldim() );
- Vector1 w(A.coldim());
+ Vector1 w(F2, A.coldim());
- for(typename Vector1::iterator it=w.begin()+Rank;it!=w.end();++it)
- F2.init(*it,0);
+ for(typename Vector1::iterator it=w.begin()+(ptrdiff_t)Rank;it!=w.end();++it)
+ F2.assign(*it,F2.zero);
return this->solve(x, w, Rank, Q, L, A, P, b);
}
@@ -93,10 +94,10 @@ namespace LinBox
this->QLUPin(Rank, Det, Q, L, A, P, A.rowdim(), A.coldim() );
- Vector1 w(A.coldim());
+ Vector1 w(F2, A.coldim());
for(typename Vector1::iterator it=w.begin()+Rank;it!=w.end();++it)
- generator.random( *it );
+ generator.random( *it );
return this->solve(x, w, Rank, Q, L, A, P, b);
}
diff --git a/linbox/algorithms/gauss/gauss-solve.inl b/linbox/algorithms/gauss/gauss-solve.inl
index ea011a1..f504ad4 100644
--- a/linbox/algorithms/gauss/gauss-solve.inl
+++ b/linbox/algorithms/gauss/gauss-solve.inl
@@ -2,7 +2,7 @@
* Copyright (C) LinBox 2008
*
* Written by Jean-Guillaume Dumas <Jean-Guillaume.Dumas at imag.fr>
- * Time-stamp: <23 Mar 12 17:33:46 Jean-Guillaume.Dumas at imag.fr>
+ * Time-stamp: <09 Jul 13 14:09:52 Jean-Guillaume.Dumas at imag.fr>
*
*
* ========LICENCE========
@@ -40,15 +40,19 @@ namespace LinBox
template <class Matrix, class Perm, class Vector1, class Vector2> inline Vector1&
GaussDomain<_Field>::solve(Vector1& x, Vector1& w, unsigned long Rank, const Perm& Q, const Matrix& L, const Matrix& U, const Perm& P, const Vector2& b) const
{
+ // Q L U P x = b
+ Vector2 y(U.field(),U.rowdim()), v(U.field(),U.rowdim());
- Vector2 y(U.rowdim()), v(U.rowdim());
-
+ // L U P x = y = Q^T b
Q.applyTranspose(y, b);
+ // U P x = v = L^{-1} y
lowerTriangularUnitarySolve(v, L, y);
+ // P x = w = U^{-1} v, only for the upper part of w
upperTriangularSolve(w, U, v);
+ // x = P^T w = P^T U^{-1} L^{-1} Q^T b
return P.applyTranspose(x, w);
}
@@ -59,9 +63,9 @@ namespace LinBox
typename Field::Element Det;
unsigned long Rank;
- Matrix L(_field, A.rowdim(), A.rowdim());
- Permutation<Field> Q((int)A.rowdim(),_field);
- Permutation<Field> P((int)A.coldim(),_field);
+ Matrix L(field(), A.rowdim(), A.rowdim());
+ Permutation<Field> Q((int)A.rowdim(),field());
+ Permutation<Field> P((int)A.coldim(),field());
this->QLUPin(Rank, Det, Q, L, A, P, A.rowdim(), A.coldim() );
@@ -82,10 +86,10 @@ namespace LinBox
}
}
- Vector1 w(A.coldim());
+ Vector1 w(A.field(),A.coldim());
- for(typename Vector1::iterator it=w.begin()+Rank;it!=w.end();++it)
- _field.init(*it,0);
+ for(typename Vector1::iterator it=w.begin()+(ptrdiff_t)Rank;it!=w.end();++it)
+ field().assign(*it,field().zero);
return this->solve(x, w, Rank, Q, L, A, P, b);
}
@@ -94,18 +98,16 @@ namespace LinBox
template <class Matrix, class Vector1, class Vector2, class Random> inline Vector1&
GaussDomain<_Field>::solvein(Vector1& x, Matrix& A, const Vector2& b, Random& generator) const
{
- THIS_CODE_MAY_NOT_COMPILE_AND_IS_NOT_TESTED;
-
typename Field::Element Det;
unsigned long Rank;
- Matrix L(_field, A.rowdim(), A.rowdim());
- Permutation<Field> Q((int)A.rowdim(),_field);
- Permutation<Field> P((int)A.coldim(),_field);
+ Matrix L(field(), A.rowdim(), A.rowdim());
+ Permutation<Field> Q((int)A.rowdim(),field());
+ Permutation<Field> P((int)A.coldim(),field());
this->QLUPin(Rank, Det, Q, L, A, P, A.rowdim(), A.coldim() );
- Vector1 w(A.coldim());
- for(typename Vector1::iterator it=w.begin()+Rank;it!=w.end();++it)
+ Vector1 w(A.field(),A.coldim());
+ for(typename Vector1::iterator it=w.begin()+(ptrdiff_t)Rank;it!=w.end();++it)
generator.random( *it );
return this->solve(x, w, Rank, Q, L, A, P, b);
diff --git a/linbox/algorithms/gauss/gauss.inl b/linbox/algorithms/gauss/gauss.inl
index 137ef01..38820a1 100644
--- a/linbox/algorithms/gauss/gauss.inl
+++ b/linbox/algorithms/gauss/gauss.inl
@@ -2,22 +2,22 @@
* Copyright (C) 1999 Jean-Guillaume Dumas
*
* Written by Jean-Guillaume Dumas <Jean-Guillaume.Dumas at imag.fr>
- * Time-stamp: <18 Jun 10 15:48:38 Jean-Guillaume.Dumas at imag.fr>
+ * Time-stamp: <18 Jun 15 14:42:01 Jean-Guillaume.Dumas at imag.fr>
+ *
*
- *
* ========LICENCE========
* This file is part of the library LinBox.
- *
+ *
* LinBox is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
- *
+ *
* This library 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
* Lesser General Public License for more details.
- *
+ *
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
@@ -34,7 +34,10 @@
#include "linbox/algorithms/gauss.h"
#include "linbox/util/commentator.h"
+#include <givaro/zring.h>
+#include <givaro/ring-interface.h>
#include <utility>
+#include <type_traits>
#ifdef __LINBOX_ALL__
#define __LINBOX_COUNT__
@@ -42,681 +45,932 @@
#define __LINBOX_FILLIN__
#endif
+#ifdef __LINBOX_SpD_SWITCH__
+#include <linbox/matrix/dense-matrix.h>
+#include <numeric>
+# ifndef __LINBOX_SpD_MAXSPARSITY__
+// Sparsity less than 1% --> switch to dense
+# define __LINBOX_SpD_MAXSPARSITY__ 0.01
+# endif
+#endif
+
namespace LinBox
{
- template <class _Field>
- template <class Matrix, class Perm> inline unsigned long&
- GaussDomain<_Field>::QLUPin (unsigned long &Rank,
- Element &determinant,
- Perm &Q,
- Matrix &LigneL,
- Matrix &LigneA,
- Perm &P,
- unsigned long Ni,
- unsigned long Nj) const
- {
- linbox_check( Q.coldim() == Q.rowdim() );
- linbox_check( P.coldim() == P.rowdim() );
- linbox_check( LigneL.coldim() == LigneL.rowdim() );
- linbox_check( Q.coldim() == LigneL.rowdim() );
- linbox_check( LigneL.coldim() == LigneA.rowdim() );
- linbox_check( LigneA.coldim() == P.rowdim() );
-
- typedef typename Matrix::Row Vector;
- typedef typename Vector::value_type E;
-
- // Requirements : LigneA is an array of sparse rows
- // In place (LigneA is modified)
- // With reordering (D is a density type. Density is allocated here)
- // long Ni = LigneA.n_row (), Nj = LigneA.n_col ();
- commentator().start ("Gaussian elimination with reordering",
- "IPLR", Ni);
- commentator().report (Commentator::LEVEL_NORMAL, INTERNAL_DESCRIPTION)
- << "Gaussian QLUP elimination on " << Ni << " x " << Nj << " matrix" << std::endl;
+ template <class _Field>
+ template <class Matrix, class Perm> inline unsigned long&
+ GaussDomain<_Field>::QLUPin (unsigned long &Rank,
+ Element &determinant,
+ Perm &Q,
+ Matrix &LigneL,
+ Matrix &LigneA,
+ Perm &P,
+ unsigned long Ni,
+ unsigned long Nj) const
+ {
+ linbox_check( Q.coldim() == Q.rowdim() );
+ linbox_check( P.coldim() == P.rowdim() );
+ linbox_check( LigneL.coldim() == LigneL.rowdim() );
+ linbox_check( Q.coldim() == LigneL.rowdim() );
+ linbox_check( LigneL.coldim() == LigneA.rowdim() );
+ linbox_check( LigneA.coldim() == P.rowdim() );
+
+ typedef typename Matrix::Row Vector;
+ typedef typename Vector::value_type E;
+
+ // Requirements : LigneA is an array of sparse rows
+ // In place (LigneA is modified)
+ // With reordering (D is a density type. Density is allocated here)
+ // long Ni = LigneA.n_row (), Nj = LigneA.n_col ();
+ commentator().start ("QLUPin Gaussian elimination with reordering",
+ "IPLR", Ni);
+ commentator().report (Commentator::LEVEL_NORMAL, INTERNAL_DESCRIPTION)
+ << "Gaussian QLUP elimination on " << Ni << " x " << Nj << " matrix" << std::endl;
#ifdef __LINBOX_COUNT__
- long long nbelem = 0;
+ long long nbelem = 0;
#endif
- Element Eone; _field.init(Eone,1UL);
- _field.init(determinant,1UL);
- // allocation of the column density
- std::vector<size_t> col_density (Nj);
+ field().assign(determinant,field().one);
+ // allocation of the column density
+ std::vector<size_t> col_density (Nj);
- for(typename Matrix::RowIterator LigneL_it = LigneL.rowBegin() ;
- LigneL_it != LigneL.rowEnd(); ++LigneL_it)
- LigneL_it->reserve(16);
+ for(typename Matrix::RowIterator LigneL_it = LigneL.rowBegin() ;
+ LigneL_it != LigneL.rowEnd(); ++LigneL_it)
+ LigneL_it->reserve(16);
- std::deque<std::pair<size_t,size_t> > invQ;
+ std::deque<std::pair<size_t,size_t> > invQ;
- // assignment of LigneA with the domain object
- for (unsigned long jj = 0; jj < Ni; ++jj)
- for (unsigned long k = 0; k < LigneA[jj].size (); k++)
- ++col_density[LigneA[jj][k].first];
+ // assignment of LigneA with the domain object
+ for (unsigned long jj = 0; jj < Ni; ++jj)
+ for (unsigned long k = 0; k < LigneA[(size_t)jj].size (); k++)
+ ++col_density[LigneA[(size_t)jj][k].first];
- long last = (long)Ni - 1;
- long c;
- Rank = 0;
+ const long last = (long)Ni - 1;
+ long c;
+ Rank = 0;
+ bool degeneratedense=false;
#ifdef __LINBOX_OFTEN__
- long sstep = last/40;
- if (sstep > __LINBOX_OFTEN__) sstep = __LINBOX_OFTEN__;
+ long sstep = last/40;
+ if (sstep > __LINBOX_OFTEN__) sstep = __LINBOX_OFTEN__;
#else
- long sstep = 1000;
+# ifdef __LINBOX_FILLIN__
+ long sstep = 100;
+# else
+ long sstep = 1000;
+# endif
#endif
- // Elimination steps with reordering
-
- typename Matrix::RowIterator LigneA_k = LigneA.rowBegin(), LigneA_p;
- for (long k = 0; k < last; ++k, ++LigneA_k) {
- long p = k, s = 0;
-
-#ifdef __LINBOX_FILLIN__
- if ( ! (k % 100) )
-#else
- if ( ! (k % sstep) )
+
+ // Elimination steps with reordering
+
+ typename Matrix::RowIterator LigneA_k = LigneA.rowBegin(), LigneA_p;
+ for (long k = 0; k < last; ++k, ++LigneA_k) {
+
+#ifdef __LINBOX_SpD_MAXSPARSITY__
+
+ if (accumulate(col_density.begin()+Rank,col_density.end(),0)>(Ni*Nj*__LINBOX_SpD_MAXSPARSITY__)) {
+# ifdef _LB_DEBUG
+ std::cerr << "Dense switch: " << accumulate(col_density.begin()+Rank,col_density.end(),0) << '>' << Ni << '*' << Nj << '*' << __LINBOX_SpD_MAXSPARSITY__ << std::endl;
+# endif
+ degeneratedense=std::is_base_of<Givaro::FiniteRingInterface<Element>,_Field>::value && true; break;
+ }
#endif
- {
- commentator().progress (k);
+
+ long p = k, s = 0;
+
+ if ( ! (k % sstep) )
+ {
+ commentator().progress (k);
#ifdef __LINBOX_FILLIN__
- long sl(0);
- for (size_t l = 0; l < Ni; ++l)
- sl += LigneA[l].size ();
-
- commentator().report (Commentator::LEVEL_IMPORTANT, PARTIAL_RESULT)
- << "Fillin (" << Rank << "/" << Ni << ") = "
- << sl
- << " (" << double(sl)*100.0/double(Ni-k)/double(Nj-k) << "%, "
- << double(sl)/double(Ni-k) << " avg)"
- << std::endl;
+ long sl(0);
+ for (size_t l = 0; l < Ni; ++l)
+ sl +=(long) LigneA[(size_t)l].size ();
+
+ commentator().report (Commentator::LEVEL_IMPORTANT, PARTIAL_RESULT)
+ << "Fillin (" << Rank << "/" << Ni << ") = "
+ << sl
+ << " (" << double(sl)*100.0/double(Ni-k)/double(Nj-k) << "%, "
+ << double(sl)/double(Ni-k) << " avg)"
+ << std::endl;
#endif
- }
-
- long l;
- for(l = k; l < static_cast<long>(Ni); ++l) {
- if ( (s = LigneA[l].size()) ) {
- p = l;
- break;
- }
- }
-
- if (s) {
- long sl;
- // Row permutation for the sparsest row
- for (; l < static_cast<long>(Ni); ++l)
- if (((sl = LigneA[l].size ()) < s) && (sl)) {
- s = sl;
- p = l;
- }
-
- if (p != k) {
- // std::cerr << "Permuting rows: " << k << " <--> " << p << std::endl;
- invQ.push_front( std::pair<size_t,size_t>((size_t)k,(size_t)p) );
- _field.negin(determinant);
- std::swap( *LigneA_k, LigneA[p]);
- std::swap( LigneL[k], LigneL[p]);
- }
-
-
- SparseFindPivot (*LigneA_k, Rank, c, col_density, determinant);
-
- if (c != -1) {
- long ll;
- if ( c != (static_cast<long>(Rank)-1) ) {
- P.permute(Rank-1,c);
- for (ll=0 ; ll < k ; ++ll)
- permute( LigneA[ll], Rank, c);
- }
- long npiv=LigneA_k->size();
- for (ll = k+1; ll < static_cast<long>(Ni); ++ll) {
- E hc;
- hc.first=(unsigned)Rank-1;
- eliminate (hc.second, LigneA[ll], *LigneA_k, Rank, c, npiv, col_density);
- if(! _field.isZero(hc.second)) LigneL[ll].push_back(hc);
- }
- }
-
- // LigneA.write(std::cerr << "AFT " )<<std::endl;
+ }
+
+ long l;
+ for(l = k; l < static_cast<long>(Ni); ++l) {
+ if ( (s = (long) LigneA[(size_t)l].size()) ) {
+ p = l;
+ break;
+ }
+ }
+
+ if (s) {
+ // Row permutation for the sparsest row
+ for (; l < static_cast<long>(Ni); ++l) {
+ long sl;
+ if (((sl =(long) LigneA[(size_t)l].size ()) < s) && (sl)) {
+ s = sl;
+ p = l;
+ }
+ }
+
+ if (p != k) {
+ // std::cerr << "Permuting rows: " << k << " <--> " << p << std::endl;
+ invQ.push_front( std::pair<size_t,size_t>((size_t)k,(size_t)p) );
+ field().negin(determinant);
+ std::swap( *LigneA_k, LigneA[(size_t)p]);
+ std::swap( LigneL[(size_t)k], LigneL[(size_t)p]);
+ }
+
+
+ SparseFindPivot (*LigneA_k, Rank, c, col_density, determinant);
+
+ if (c != -1) {
+ long ll;
+ if ( c != (static_cast<long>(Rank)-1) ) {
+ P.permute(Rank-1,(size_t)c);
+ for (ll=0 ; ll < k ; ++ll)
+ permute( LigneA[(size_t)ll], Rank, c);
+ }
+ long npiv=(long)LigneA_k->size();
+ for (ll = k+1; ll < static_cast<long>(Ni); ++ll) {
+ E hc;
+ hc.first=(unsigned)Rank-1;
+ eliminate (hc.second, LigneA[(size_t)ll], *LigneA_k, Rank, c, (size_t)npiv, col_density);
+ if(! field().isZero(hc.second)) LigneL[(size_t)ll].push_back(hc);
+ }
+ }
+
+ // LigneA.write(std::cerr << "AFT " )<<std::endl;
#ifdef __LINBOX_COUNT__
- nbelem += LigneA_k->size ();
+ nbelem += LigneA_k->size ();
#endif
- }
- E one((unsigned)k,Eone);
- LigneL[k].push_back(one);
- // LigneL.write(rep << "L:= ", FORMAT_MAPLE) << std::endl;
- // LigneA.write(rep << "U:= ", FORMAT_MAPLE) << std::endl;
- }//for k
-
- SparseFindPivot ( LigneA[last], Rank, c, determinant);
- if (c != -1) {
- if ( c != (static_cast<long>(Rank)-1) ) {
- P.permute(Rank-1,c);
- for (long ll=0 ; ll < last ; ++ll)
- permute( LigneA[ll], Rank, c);
- }
- }
-
- E one((unsigned)last,Eone);
- LigneL[last].push_back(one);
+ }
+ E one((unsigned)k,field().one);
+ LigneL[(size_t)k].push_back(one);
+
+
+// LigneL.write(std::cerr << "L:= ", Tag::FileFormat::Maple) << std::endl;
+// LigneA.write(std::cerr << "U:= ", Tag::FileFormat::Maple) << std::endl;
+
+ }//for k
+
+// if (std::is_base_of<Givaro::FiniteRingInterface<Element>,_Field>::value && degeneratedense) {
+// DenseQLUPin(Rank,determinant,invQ,LigneL,LigneA,P,Ni,Nj);
+
+// } else {
+
+// SparseFindPivot ( LigneA[(size_t)last], Rank, c, determinant);
+// if (c != -1) {
+// if ( c != (static_cast<long>(Rank)-1) ) {
+// P.permute(Rank-1,(size_t)c);
+// for (long ll=0 ; ll < last ; ++ll)
+// permute( LigneA[(size_t)ll], Rank, c);
+// }
+// }
+
+// E one((unsigned)last,field().one);
+// LigneL[(size_t)last].push_back(one);
+// }
+ Continuation<Matrix,Perm,
+ std::is_base_of<Givaro::FiniteRingInterface<Element>,_Field>::value>
+ ()(*this, Rank,determinant,invQ,LigneL,LigneA,P,Ni,Nj,degeneratedense);
#ifdef __LINBOX_COUNT__
- nbelem += LigneA[last].size ();
- commentator().report (Commentator::LEVEL_NORMAL, PARTIAL_RESULT)
- << "Left elements : " << nbelem << std::endl;
+ nbelem += LigneA[(size_t)(Ni-1)].size ();
+ commentator().report (Commentator::LEVEL_NORMAL, PARTIAL_RESULT)
+ << "Left elements : " << nbelem << std::endl;
#endif
#ifdef __LINBOX_FILLIN__
- long sl(0);
- for (size_t l=0; l < Ni; ++l)
- sl += LigneA[l].size ();
+ long sl(0);
+ for (size_t l=0; l < Ni; ++l)
+ sl += (long) LigneA[(size_t)l].size ();
- commentator().report (Commentator::LEVEL_IMPORTANT, PARTIAL_RESULT)
- << "Fillin (" << Rank << "/" << Ni << ") = " << sl
- << std::endl;
+ commentator().report (Commentator::LEVEL_IMPORTANT, PARTIAL_RESULT)
+ << "Fillin (" << Rank << "/" << Ni << ") = " << sl
+ << std::endl;
#endif
- if ((Rank < Ni) || (Rank < Nj) || (Ni == 0) || (Nj == 0))
- _field.init(determinant,0UL);
-
- integer card;
- _field.write(commentator().report (Commentator::LEVEL_IMPORTANT, PARTIAL_RESULT)
- << "Determinant : ", determinant)
- << " over GF (" << _field.cardinality (card) << ")" << std::endl;
-
- for(std::deque<std::pair<size_t,size_t> >::const_iterator it = invQ.begin(); it!=invQ.end();++it)
- Q.permute( it->first, it->second );
-
-
- // std::ostream& rep = commentator().report (Commentator::LEVEL_IMPORTANT, PARTIAL_RESULT);
- // Q.write(rep << "Q:= ", FORMAT_MAPLE) << ':' << std::endl;
- // LigneL.write(rep << "L:= ", FORMAT_MAPLE) << ':' << std::endl;
- // LigneA.write(rep << "U:= ", FORMAT_MAPLE) << ':' << std::endl;
- // P.write(rep << "P:= ", FORMAT_MAPLE) << ':' << std::endl;
-
- commentator().report (Commentator::LEVEL_IMPORTANT, PARTIAL_RESULT)
- << "Rank : " << Rank
- << " over GF (" << card << ")" << std::endl;
- commentator().stop ("done", 0, "IPLR");
-
-
-
- return Rank;
- }
-
- template <class _Field>
- template <class Matrix> inline unsigned long&
- GaussDomain<_Field>::InPlaceLinearPivoting (unsigned long &Rank,
- Element &determinant,
- Matrix &LigneA,
- unsigned long Ni,
- unsigned long Nj) const
- {
- typedef typename Matrix::Row Vector;
- typedef typename Vector::value_type E;
-
- // Requirements : LigneA is an array of sparse rows
- // In place (LigneA is modified)
- // With reordering (D is a density type. Density is allocated here)
- // long Ni = LigneA.n_row (), Nj = LigneA.n_col ();
- commentator().start ("Gaussian elimination with reordering",
- "IPLR", Ni);
- _field.write( commentator().report (Commentator::LEVEL_NORMAL, INTERNAL_DESCRIPTION)
- << "Gaussian elimination on " << Ni << " x " << Nj << " matrix, over: ") << std::endl;
+ if ((Rank < Ni) || (Rank < Nj) || (Ni == 0) || (Nj == 0))
+ field().assign(determinant,field().zero);
+
+ integer card;
+ field().write(field().write(commentator().report (Commentator::LEVEL_IMPORTANT, PARTIAL_RESULT)
+ << "Determinant : ", determinant)
+ << " over ") << std::endl;
+
+ for(std::deque<std::pair<size_t,size_t> >::const_iterator it = invQ.begin(); it!=invQ.end();++it)
+ Q.permute( it->first, it->second );
+
+
+ std::ostream& rep = commentator().report (Commentator::LEVEL_IMPORTANT, PARTIAL_RESULT);
+ Q.write(rep << "Q:= ", Tag::FileFormat::Maple) << ':' << std::endl;
+ LigneL.write(rep << "L:= ", Tag::FileFormat::Maple) << ':' << std::endl;
+ LigneA.write(rep << "U:= ", Tag::FileFormat::Maple) << ':' << std::endl;
+ P.write(rep << "P:= ", Tag::FileFormat::Maple) << ':' << std::endl;
+
+ commentator().report (Commentator::LEVEL_IMPORTANT, PARTIAL_RESULT)
+ << "Rank : " << Rank
+ << " over GF (" << card << ")" << std::endl;
+ commentator().stop ("done", 0, "IPLR");
+
+
+
+ return Rank;
+ }
+
+
+
+ template <class _Field>
+ template <class Matrix, class Perm> inline unsigned long&
+ GaussDomain<_Field>::SparseContinuation (unsigned long &Rank,
+ Element &determinant,
+ std::deque<std::pair<size_t,size_t> > &invQ,
+ Matrix &LigneL,
+ Matrix &LigneA,
+ Perm &P,
+ unsigned long Ni,
+ unsigned long Nj) const
+ {
+ typedef typename Matrix::Row Vector;
+ typedef typename Vector::value_type E;
+
+ const long last = Ni-1;
+ long c;
+ SparseFindPivot ( LigneA[(size_t)last], Rank, c, determinant);
+ if (c != -1) {
+ if ( c != (static_cast<long>(Rank)-1) ) {
+ P.permute(Rank-1,(size_t)c);
+ for (long ll=0 ; ll < last ; ++ll)
+ permute( LigneA[(size_t)ll], Rank, c);
+ }
+ }
+
+ E one((unsigned)last,field().one);
+ LigneL[(size_t)last].push_back(one);
+ return Rank;
+ }
+
+
+ template <class _Field>
+ template<class Matrix, class Perm>
+ struct GaussDomain<_Field>::Continuation<Matrix,Perm,false> {
+ unsigned long& operator()(
+ const GaussDomain<_Field>& GD,
+ unsigned long &Rank,
+ typename GaussDomain<_Field>::Element &determinant,
+ std::deque<std::pair<size_t,size_t> > &invQ,
+ Matrix &LigneL,
+ Matrix &LigneA,
+ Perm &P,
+ unsigned long Ni,
+ unsigned long Nj,
+ bool degeneratedense) const
+ {
+ return GD.SparseContinuation(Rank,determinant,invQ,LigneL,LigneA,P,Ni,Nj);
+ }
+ };
+
+ template <class _Field>
+ template <class Matrix, class Perm>
+ struct GaussDomain<_Field>::Continuation<Matrix,Perm,true> {
+ unsigned long& operator()(
+ const GaussDomain<_Field>& GD,
+ unsigned long &Rank,
+ typename GaussDomain<_Field>::Element &determinant,
+ std::deque<std::pair<size_t,size_t> > &invQ,
+ Matrix &LigneL,
+ Matrix &LigneA,
+ Perm &P,
+ unsigned long Ni,
+ unsigned long Nj,
+ bool degeneratedense) const
+ {
+ if (degeneratedense) {
+ return GD.DenseQLUPin(Rank,determinant,invQ,LigneL,LigneA,P,Ni,Nj);
+ } else {
+ return GD.SparseContinuation(Rank,determinant,invQ,LigneL,LigneA,P,Ni,Nj);
+ }
+ }
+ };
+
+
+
+
+
+
+ template <class _Field>
+ template <class Matrix, class Perm> inline unsigned long&
+ GaussDomain<_Field>::DenseQLUPin (unsigned long &Rank,
+ Element &determinant,
+ std::deque<std::pair<size_t,size_t> > &dinvQ,
+ Matrix &dLigneL,
+ Matrix &dLigneA,
+ Perm &dP,
+ unsigned long Ni,
+ unsigned long Nj) const
+ {
+ linbox_check( dP.coldim() == dP.rowdim() );
+ linbox_check( dLigneL.coldim() == dLigneL.rowdim() );
+ linbox_check( dLigneL.coldim() == dLigneA.rowdim() );
+ linbox_check( dLigneA.coldim() == dP.rowdim() );
+
+// std::deque<std::pair<size_t,size_t> > dinvQ(invQ);
+// Matrix dLigneL(LigneL, this->field());
+// Matrix dLigneA(LigneA, this->field());
+// Perm dP(P);
+
+// { Perm dQ(Ni);
+// for(std::deque<std::pair<size_t,size_t> >::const_iterator it = dinvQ.begin(); it!=dinvQ.end();++it)
+// dQ.permute( it->first, it->second );
+// dQ.write(std::cerr << "dQ:= ") << ';' << std::endl;
+// }
+// dLigneL.write(std::cerr << "dL:= ", Tag::FileFormat::Maple) << ':' << std::endl;
+// dLigneA.write(std::cerr << "dU:= ", Tag::FileFormat::Maple) << ':' << std::endl;
+// dP.write(std::cerr << "dP:= ") << ';' << std::endl;
+
+
+ size_t sNi=Ni-Rank, sNj=Nj-Rank;
+// std::cerr << "Dense switch: " << sNi << 'x' << sNj << std::endl;
+ BlasMatrix<_Field> A(this->field(), sNi, sNj);
+
+ for(size_t di=Rank;di<Ni;++di) {
+ for(size_t dj=0;dj<dLigneA[di].size();++dj)
+ A.setEntry(di-Rank,dLigneA[di][dj].first-Rank, dLigneA[di][dj].second);
+ dLigneA[di].resize(0);
+ }
+
+
+// A.write(std::cerr << "A:= ", Tag::FileFormat::Maple) << std::endl;
+
+ enum FFLAS::FFLAS_DIAG diag = FFLAS::FflasNonUnit;
+ size_t *P2 = FFLAS::fflas_new<size_t>(sNi);
+ size_t *Q2 = FFLAS::fflas_new<size_t>(sNj);
+ for (size_t j=0;j<sNi;j++) P2[j]=0;
+ for (size_t j=0;j<sNj;j++) Q2[j]=0;
+ size_t R2 = FFPACK::PLUQ(this->field(), diag, sNi, sNj, A.getPointer(), sNj, P2, Q2);
+// std::cerr << "Rank:" << Rank << '+' << R2 << '=' << (Rank+R2) << std::endl;
+
+
+// std::cerr << dLigneL.rowdim() << 'x' << dLigneL.coldim() << std::endl;
+
+// { Perm dQ(Ni);
+// for(std::deque<std::pair<size_t,size_t> >::const_iterator it = dinvQ.begin(); it!=dinvQ.end();++it)
+// dQ.permute( it->first, it->second );
+// dQ.write(std::cerr << "dQ:= ") << ';' << std::endl;
+// }
+// dLigneL.write(std::cerr << "dL:= ", Tag::FileFormat::Maple) << ':' << std::endl;
+// dLigneA.write(std::cerr << "dU:= ", Tag::FileFormat::Maple) << ':' << std::endl;
+// dP.write(std::cerr << "dP:= ") << ';' << std::endl;
+
+
+ Givaro::ZRing<long> Z;
+
+// std::cerr << '['; for (size_t j=0;j<sNi;j++)
+// std::cerr << P2[j] << ' ';
+// std::cerr << ']' << std::endl;
+ // Left-Trans: P2^T * G
+ for (int i=sNi;--i>=0;)
+ if(i != static_cast<int>(P2[i])) {
+ dinvQ.push_front( std::pair<size_t,size_t>(Rank+(size_t)i,Rank+P2[i]) );
+ this->field().negin(determinant);
+ std::swap(dLigneL[i+Rank],dLigneL[P2[i]+Rank]);
+ }
+
+ // Put L2 in bottom right corner
+ for(size_t i=0; i<sNi; ++i)
+ for(size_t j=0; j<i; ++j)
+ if (!this->field().isZero(A.getEntry(i,j)))
+ dLigneL[Rank+i].push_back(std::pair<size_t, Element>(Rank+j,A.getEntry(i,j)));
+ for(size_t i=0; i<R2; ++i)
+ dLigneL[Rank+i].push_back(std::pair<size_t, Element>(Rank+i,this->field().one));
+
+
+ // Put U2 in bottom right corner
+ for(size_t i=0; i<sNi; ++i)
+ for(size_t j=i; j<sNj; ++j)
+ if (!this->field().isZero(A.getEntry(i,j)))
+ dLigneA[Rank+i].push_back(std::pair<size_t, Element>(Rank+j,A.getEntry(i,j)));
+ for(size_t i=0; i<R2; ++i)
+ this->field().mulin(determinant,A.getEntry(i,i));
+
+// std::cerr << '['; for (size_t j=0;j<sNj;++j)
+// std::cerr << Q2[j] << ' ';
+// std::cerr << ']' << std::endl;
+
+ // Right-Trans: H * Q2^T
+ for (size_t j=0;j<sNj;++j)
+ if(j != Q2[j]) {
+ this->field().negin(determinant);
+ for (size_t l=0; l<Rank; ++l)
+ permute( dLigneA[l], j+Rank+1, Q2[j]+Rank);
+ }
+
+ FFPACK::applyP(Z,FFLAS::FflasLeft,FFLAS::FflasNoTrans,1,0,sNj,&(*(dP.getStorage().begin()))+Rank,1,Q2);
+
+// { Perm dQ(Ni);
+// for(std::deque<std::pair<size_t,size_t> >::const_iterator it = dinvQ.begin(); it!=dinvQ.end();++it)
+// dQ.permute( it->first, it->second );
+// dQ.write(std::cerr << "dQ:= ") << ';' << std::endl;
+// }
+// dLigneL.write(std::cerr << "dL:= ", Tag::FileFormat::Maple) << ':' << std::endl;
+// dLigneA.write(std::cerr << "dU:= ", Tag::FileFormat::Maple) << ':' << std::endl;
+// dP.write(std::cerr << "dP:= ") << ';' << std::endl;
+
+
+
+
+ return Rank+=R2;
+ }
+
+
+ template <class _Field>
+ template <class Matrix> inline unsigned long&
+ GaussDomain<_Field>::InPlaceLinearPivoting (unsigned long &Rank,
+ Element &determinant,
+ Matrix &LigneA,
+ unsigned long Ni,
+ unsigned long Nj) const
+ {
+ typedef typename Matrix::Row Vector;
+
+ // Requirements : LigneA is an array of sparse rows
+ // In place (LigneA is modified)
+ // With reordering (D is a density type. Density is allocated here)
+ // long Ni = LigneA.n_row (), Nj = LigneA.n_col ();
+ commentator().start ("IPLR Gaussian elimination with reordering",
+ "IPLR", Ni);
+ field().write( commentator().report (Commentator::LEVEL_NORMAL, INTERNAL_DESCRIPTION)
+ << "Gaussian elimination on " << Ni << " x " << Nj << " matrix, over: ") << std::endl;
#ifdef __LINBOX_COUNT__
- long long nbelem = 0;
+ long long nbelem = 0;
#endif
- _field.init(determinant,1UL);
- Vector Vzer (0);
- // allocation of the column density
- std::vector<size_t> col_density (Nj);
+ field().assign(determinant,field().one);
+ Vector Vzer(0) ;
+
+ // allocation of the column density
+ std::vector<size_t> col_density (Nj);
- // assignment of LigneA with the domain object
- for (unsigned long jj = 0; jj < Ni; ++jj)
- for (unsigned long k = 0; k < LigneA[jj].size (); k++)
- ++col_density[LigneA[jj][k].first];
+ // assignment of LigneA with the domain object
+ for (unsigned long jj = 0; jj < Ni; ++jj)
+ for (unsigned long k = 0; k < LigneA[(size_t)jj].size (); k++)
+ ++col_density[LigneA[(size_t)jj][k].first];
- long last = (long)Ni - 1;
- long c;
- Rank = 0;
+ const long last = (long)Ni - 1;
+ long c;
+ Rank = 0;
#ifdef __LINBOX_OFTEN__
- long sstep = last/40;
- if (sstep > __LINBOX_OFTEN__) sstep = __LINBOX_OFTEN__;
+ long sstep = last/40;
+ if (sstep > __LINBOX_OFTEN__) sstep = __LINBOX_OFTEN__;
#else
- long sstep = 1000;
+ long sstep = 1000;
#endif
- // Elimination steps with reordering
- for (long k = 0; k < last; ++k) {
- unsigned long l;
- long p = k, s = LigneA[k].size (), sl;
+ // Elimination steps with reordering
+ for (long k = 0; k < last; ++k) {
+ long p = k, s = (long)LigneA[(size_t)k].size ();
#ifdef __LINBOX_FILLIN__
- if ( ! (k % 100) ) {
+ if ( ! (k % 100) ) {
+ unsigned long l;
+ long sl;
+ commentator().progress (k);
+ for (sl = 0, l = 0; l < Ni; ++l)
+ sl += (long)LigneA[(size_t)l].size ();
+
+ commentator().report (Commentator::LEVEL_IMPORTANT, PARTIAL_RESULT)
+ << "Fillin (" << Rank << "/" << Ni << ") = "
+ << sl
+ << " (" << double(sl)*100.0/double(Ni-k)/double(Nj-k) << "%, "
+ << double(sl)/double(Ni-k) << " avg)"
+ << std::endl;
+ }
#else
- if ( ! (k % sstep) ) {
-#endif
- commentator().progress (k);
-#ifdef __LINBOX_FILLIN__
- for (sl = 0, l = 0; l < Ni; ++l)
- sl += LigneA[l].size ();
-
- commentator().report (Commentator::LEVEL_IMPORTANT, PARTIAL_RESULT)
- << "Fillin (" << Rank << "/" << Ni << ") = "
- << sl
- << " (" << double(sl)*100.0/double(Ni-k)/double(Nj-k) << "%, "
- << double(sl)/double(Ni-k) << " avg)"
- << std::endl;
+ if ( ! (k % sstep) ) {
+ commentator().progress (k);
+ }
#endif
- }
-
- if (s) {
- // Row permutation for the sparsest row
- for (l = (unsigned long)k + 1; l < (unsigned long)Ni; ++l)
- if (((sl = LigneA[l].size ()) < s) && (sl)) {
- s = sl;
- p = (long)l;
- }
-
- if (p != k) {
- _field.negin(determinant);
- Vector vtm = LigneA[k];
- LigneA[k] = LigneA[p];
- LigneA[p] = vtm;
- }
-
- // LigneA.write(std::cerr << "BEF, k:" << k << ", Rank:" << Rank << ", c:" << c)<<std::endl;
-
- SparseFindPivot (LigneA[k], Rank, c, col_density, determinant);
- // LigneA.write(std::cerr << "PIV, k:" << k << ", Rank:" << Rank << ", c:" << c)<<std::endl;
- if (c != -1) {
- for (l = (unsigned long)k + 1; l < (unsigned long)Ni; ++l)
- eliminate (LigneA[l], LigneA[k], Rank, c, col_density);
- }
-
- // LigneA.write(std::cerr << "AFT " )<<std::endl;
+
+ if (s) {
+ unsigned long l;
+ // Row permutation for the sparsest row
+ for (l = (unsigned long)k + 1; l < (unsigned long)Ni; ++l) {
+ long sl;
+ if (((sl = (long)LigneA[(size_t)l].size ()) < s) && (sl)) {
+ s = sl;
+ p = (long)l;
+ }
+ }
+
+ if (p != k) {
+ field().negin(determinant);
+ Vector vtm = LigneA[(size_t)k];
+ LigneA[(size_t)k] = LigneA[(size_t)p];
+ LigneA[(size_t)p] = vtm;
+ }
+
+ // LigneA.write(std::cerr << "BEF, k:" << k << ", Rank:" << Rank << ", c:" << c)<<std::endl;
+
+ SparseFindPivot (LigneA[(size_t)k], Rank, c, col_density, determinant);
+ // LigneA.write(std::cerr << "PIV, k:" << k << ", Rank:" << Rank << ", c:" << c)<<std::endl;
+ if (c != -1) {
+ for (l = (unsigned long)k + 1; l < (unsigned long)Ni; ++l)
+ eliminate (LigneA[(size_t)l], LigneA[(size_t)k], Rank, c, col_density);
+ }
+
+ // LigneA.write(std::cerr << "AFT " )<<std::endl;
#ifdef __LINBOX_COUNT__
- nbelem += LigneA[k].size ();
+ nbelem += LigneA[(size_t)k].size ();
#endif
- LigneA[k] = Vzer;
- }
+ LigneA[(size_t)k] = Vzer;
+ }
- }//for k
+ }//for k
- SparseFindPivot (LigneA[last], Rank, c, determinant);
+ SparseFindPivot (LigneA[(size_t)last], Rank, c, determinant);
#ifdef __LINBOX_COUNT__
- nbelem += LigneA[last].size ();
- commentator().report (Commentator::LEVEL_NORMAL, PARTIAL_RESULT)
- << "Left elements : " << nbelem << std::endl;
+ nbelem += LigneA[(size_t)last].size ();
+ commentator().report (Commentator::LEVEL_NORMAL, PARTIAL_RESULT)
+ << "Left elements : " << nbelem << std::endl;
#endif
#ifdef __LINBOX_FILLIN__
- long sl(0);
- for (size_t l=0; l < Ni; ++l)
- sl += LigneA[l].size ();
+ long sl(0);
+ for (size_t l=0; l < Ni; ++l)
+ sl += (long)LigneA[(size_t)l].size ();
- commentator().report (Commentator::LEVEL_IMPORTANT, PARTIAL_RESULT)
- << "Fillin (" << Rank << "/" << Ni << ") = " << sl
- << std::endl;
+ commentator().report (Commentator::LEVEL_IMPORTANT, PARTIAL_RESULT)
+ << "Fillin (" << Rank << "/" << Ni << ") = " << sl
+ << std::endl;
#endif
- integer card;
-
- if ((Rank < Ni) || (Rank < Nj) || (Ni == 0) || (Nj == 0))
- _field.init(determinant,0UL);
-
- _field.write(commentator().report (Commentator::LEVEL_NORMAL, PARTIAL_RESULT)
- << "Determinant : ", determinant)
- << " over GF (" << _field.cardinality (card) << ")" << std::endl;
-
- commentator().report (Commentator::LEVEL_NORMAL, PARTIAL_RESULT)
- << "Rank : " << Rank
- << " over GF (" << card << ")" << std::endl;
- commentator().stop ("done", 0, "IPLR");
- return Rank;
- }
-
- template <class _Field>
- template <class Matrix, class Perm> inline unsigned long&
- GaussDomain<_Field>::InPlaceLinearPivoting (unsigned long &Rank,
- Element &determinant,
- Matrix &LigneA,
- Perm &P,
- unsigned long Ni,
- unsigned long Nj) const
- {
- typedef typename Matrix::Row Vector;
- typedef typename Vector::value_type E;
-
- // Requirements : LigneA is an array of sparse rows
- // In place (LigneA is modified)
- // With reordering (D is a density type. Density is allocated here)
- // long Ni = LigneA.n_row (), Nj = LigneA.n_col ();
- commentator().start ("Gaussian elimination with reordering",
- "IPLR", Ni);
- _field.write( commentator().report (Commentator::LEVEL_NORMAL, INTERNAL_DESCRIPTION)
- << "Gaussian elimination on " << Ni << " x " << Nj << " matrix, over: ") << std::endl;
+ integer card;
+
+ if ((Rank < Ni) || (Rank < Nj) || (Ni == 0) || (Nj == 0))
+ field().assign(determinant,field().zero);
+
+ field().write(commentator().report (Commentator::LEVEL_NORMAL, PARTIAL_RESULT)
+ << "Determinant : ", determinant)
+ << " over GF (" << field().cardinality (card) << ")" << std::endl;
+
+ commentator().report (Commentator::LEVEL_NORMAL, PARTIAL_RESULT)
+ << "Rank : " << Rank
+ << " over GF (" << card << ")" << std::endl;
+ commentator().stop ("done", 0, "IPLR");
+ return Rank;
+ }
+
+
+
+ template <class _Field>
+ template <class Matrix, class Perm> inline unsigned long&
+ GaussDomain<_Field>::InPlaceLinearPivoting (unsigned long &Rank,
+ Element &determinant,
+ Matrix &LigneA,
+ Perm &P,
+ unsigned long Ni,
+ unsigned long Nj) const
+ {
+ typedef typename Matrix::Row Vector;
+
+ // Requirements : LigneA is an array of sparse rows
+ // In place (LigneA is modified)
+ // With reordering (D is a density type. Density is allocated here)
+ // long Ni = LigneA.n_row (), Nj = LigneA.n_col ();
+ commentator().start ("IPperm Gaussian elimination with reordering",
+ "IPLR", Ni);
+ field().write( commentator().report (Commentator::LEVEL_NORMAL, INTERNAL_DESCRIPTION)
+ << "Gaussian elimination on " << Ni << " x " << Nj << " matrix, over: ") << std::endl;
#ifdef __LINBOX_COUNT__
- long long nbelem = 0;
+ long long nbelem = 0;
#endif
- _field.init(determinant,1UL);
- // allocation of the column density
- std::vector<size_t> col_density (Nj);
+ field().assign(determinant,field().one);
+ // allocation of the column density
+ std::vector<size_t> col_density (Nj);
- // assignment of LigneA with the domain object
- for (unsigned long jj = 0; jj < Ni; ++jj)
- for (unsigned long k = 0; k < LigneA[jj].size (); k++)
- ++col_density[LigneA[jj][k].first];
+ // assignment of LigneA with the domain object
+ for (unsigned long jj = 0; jj < Ni; ++jj)
+ for (unsigned long k = 0; k < LigneA[(size_t)jj].size (); k++)
+ ++col_density[LigneA[(size_t)jj][k].first];
- long last = (long)Ni - 1;
- long c;
- Rank = 0;
+ const long last = (long)Ni - 1;
+ long c;
+ Rank = 0;
#ifdef __LINBOX_OFTEN__
- long sstep = last/40;
- if (sstep > __LINBOX_OFTEN__) sstep = __LINBOX_OFTEN__;
+ long sstep = last/40;
+ if (sstep > __LINBOX_OFTEN__) sstep = __LINBOX_OFTEN__;
#else
- long sstep = 1000;
+ long sstep = 1000;
#endif
- // Elimination steps with reordering
- for (long k = 0; k < last; ++k) {
- unsigned long l;
- long p = k, s = LigneA[k].size (), sl;
+ // Elimination steps with reordering
+ for (long k = 0; k < last; ++k) {
+ long p = k, s =(long) LigneA[(size_t)k].size ();
#ifdef __LINBOX_FILLIN__
- if ( ! (k % 100) )
+ if ( ! (k % 100) )
+ {
+ unsigned long l;
+ long sl;
+ commentator().progress (k);
+ for (sl = 0, l = 0; l < Ni; ++l)
+ sl +=(long) LigneA[(size_t)l].size ();
+
+ commentator().report (Commentator::LEVEL_IMPORTANT, PARTIAL_RESULT)
+ << "Fillin (" << Rank << "/" << Ni << ") = "
+ << sl
+ << " (" << double(sl)*100.0/double(Ni-k)/double(Nj-k) << "%, "
+ << double(sl)/double(Ni-k) << " avg)"
+ << std::endl;
+
+ }
#else
- if ( ! (k % sstep) )
-#endif
- {
- commentator().progress (k);
-#ifdef __LINBOX_FILLIN__
- for (sl = 0, l = 0; l < Ni; ++l)
- sl += LigneA[l].size ();
-
- commentator().report (Commentator::LEVEL_IMPORTANT, PARTIAL_RESULT)
- << "Fillin (" << Rank << "/" << Ni << ") = "
- << sl
- << " (" << double(sl)*100.0/double(Ni-k)/double(Nj-k) << "%, "
- << double(sl)/double(Ni-k) << " avg)"
- << std::endl;
+ if ( ! (k % sstep) )
+ {
+ commentator().progress (k);
+ }
#endif
- }
-
- if (s) {
- // Row permutation for the sparsest row
- for (l = (unsigned long)k + 1; l < (unsigned long)Ni; ++l)
- if (((sl = LigneA[l].size ()) < s) && (sl)) {
- s = sl;
- p = (long)l;
- }
-
- if (p != k) {
- _field.negin(determinant);
- Vector vtm = LigneA[k];
- LigneA[k] = LigneA[p];
- LigneA[p] = vtm;
- }
-
- // LigneA.write(std::cerr << "BEF, k:" << k << ", Rank:" << Rank << ", c:" << c)<<std::endl;
-
- SparseFindPivot (LigneA[k], Rank, c, col_density, determinant);
- // LigneA.write(std::cerr << "PIV, k:" << k << ", Rank:" << Rank << ", c:" << c)<<std::endl;
- if (c != -1) {
- if ( c != (static_cast<long>(Rank)-1) )
- P.permute(Rank-1,c);
- for (long ll=0; ll < k ; ++ll)
- permute( LigneA[ll], Rank, c);
-
- for (l = (unsigned long)k + 1; l < (unsigned long)Ni; ++l)
- eliminate (LigneA[l], LigneA[k], Rank, c, col_density);
- }
-
- // LigneA.write(std::cerr << "AFT " )<<std::endl;
+
+
+ if (s) {
+ unsigned long l;
+ // Row permutation for the sparsest row
+ for (l = (unsigned long)k + 1; l < (unsigned long)Ni; ++l) {
+ long sl;
+ if (((sl =(long) LigneA[(size_t)l].size ()) < s) && (sl)) {
+ s = sl;
+ p = (long)l;
+ }
+ }
+
+ if (p != k) {
+ field().negin(determinant);
+ Vector vtm = LigneA[(size_t)k];
+ LigneA[(size_t)k] = LigneA[(size_t)p];
+ LigneA[(size_t)p] = vtm;
+ }
+
+ // LigneA.write(std::cerr << "BEF, k:" << k << ", Rank:" << Rank << ", c:" << c)<<std::endl;
+
+ SparseFindPivot (LigneA[(size_t)k], Rank, c, col_density, determinant);
+ // LigneA.write(std::cerr << "PIV, k:" << k << ", Rank:" << Rank << ", c:" << c)<<std::endl;
+ if (c != -1) {
+ if ( c != (static_cast<long>(Rank)-1) )
+ P.permute(Rank-1,(size_t)c);
+ for (long ll=0; ll < k ; ++ll)
+ permute( LigneA[(size_t)ll], Rank, c);
+
+ for (l = (unsigned long)k + 1; l < (unsigned long)Ni; ++l)
+ eliminate (LigneA[(size_t)l], LigneA[(size_t)k], Rank, c, col_density);
+ }
+
+ // LigneA.write(std::cerr << "AFT " )<<std::endl;
#ifdef __LINBOX_COUNT__
- nbelem += LigneA[k].size ();
+ nbelem += LigneA[(size_t)k].size ();
#endif
- }
+ }
- }//for k
+ }//for k
- SparseFindPivot (LigneA[last], Rank, c, determinant);
- if ( (c != -1) && (c != (static_cast<long>(Rank)-1) ) ) {
- P.permute(Rank-1,c);
- for (long ll=0; ll < last ; ++ll)
- permute( LigneA[ll], Rank, c);
- }
+ SparseFindPivot (LigneA[(size_t)last], Rank, c, determinant);
+ if ( (c != -1) && (c != (static_cast<long>(Rank)-1) ) ) {
+ P.permute(Rank-1,(size_t)c);
+ for (long ll=0; ll < last ; ++ll)
+ permute( LigneA[(size_t)ll], Rank, c);
+ }
#ifdef __LINBOX_COUNT__
- nbelem += LigneA[last].size ();
- commentator().report (Commentator::LEVEL_NORMAL, PARTIAL_RESULT)
- << "Left elements : " << nbelem << std::endl;
+ nbelem += LigneA[(size_t)last].size ();
+ commentator().report (Commentator::LEVEL_NORMAL, PARTIAL_RESULT)
+ << "Left elements : " << nbelem << std::endl;
#endif
#ifdef __LINBOX_FILLIN__
- long sl(0);
- for (size_t l=0; l < Ni; ++l)
- sl += LigneA[l].size ();
+ long sl(0);
+ for (size_t l=0; l < Ni; ++l)
+ sl +=(long) LigneA[(size_t)l].size ();
- commentator().report (Commentator::LEVEL_IMPORTANT, PARTIAL_RESULT)
- << "Fillin (" << Rank << "/" << Ni << ") = " << sl
- << std::endl;
+ commentator().report (Commentator::LEVEL_IMPORTANT, PARTIAL_RESULT)
+ << "Fillin (" << Rank << "/" << Ni << ") = " << sl
+ << std::endl;
#endif
- integer card;
-
- if ((Rank < Ni) || (Rank < Nj) || (Ni == 0) || (Nj == 0))
- _field.init(determinant,0UL);
-
- _field.write(commentator().report (Commentator::LEVEL_NORMAL, PARTIAL_RESULT)
- << "Determinant : ", determinant)
- << " over GF (" << _field.cardinality (card) << ")" << std::endl;
-
- commentator().report (Commentator::LEVEL_NORMAL, PARTIAL_RESULT)
- << "Rank : " << Rank
- << " over GF (" << card << ")" << std::endl;
- commentator().stop ("done", 0, "IPLR");
- return Rank;
- }
-
- template <class _Field>
- template <class Matrix> inline unsigned long&
- GaussDomain<_Field>::NoReordering (unsigned long &res,
- Element &determinant,
- Matrix &LigneA,
- unsigned long Ni,
- unsigned long Nj) const
- {
- // Requirements : SLA is an array of sparse rows
- // IN PLACE.
- // Without reordering (Pivot is first non-zero in row)
- // long Ni = SLA.n_row (), Nj = SLA.n_col ();
- // long Ni = LigneA.n_row (), Nj = LigneA.n_col ();
- commentator().start ("Gaussian elimination (no reordering)",
- "NoRe", Ni);
- commentator().report (Commentator::LEVEL_NORMAL, INTERNAL_DESCRIPTION)
- << "Gaussian elimination on " << Ni << " x " << Nj << " matrix" << std::endl;
-
- typedef typename Matrix::Row Vector;
- typedef typename Vector::value_type E;
- // typedef typename Matrix::Element Elem;
+ integer card;
+
+ if ((Rank < Ni) || (Rank < Nj) || (Ni == 0) || (Nj == 0))
+ field().assign(determinant,field().zero);
+
+ field().write(commentator().report (Commentator::LEVEL_NORMAL, PARTIAL_RESULT)
+ << "Determinant : ", determinant)
+ << " over GF (" << field().cardinality (card) << ")" << std::endl;
+
+ commentator().report (Commentator::LEVEL_NORMAL, PARTIAL_RESULT)
+ << "Rank : " << Rank
+ << " over GF (" << card << ")" << std::endl;
+ commentator().stop ("done", 0, "IPLR");
+ return Rank;
+ }
+
+ template <class _Field>
+ template <class Matrix> inline unsigned long&
+ GaussDomain<_Field>::NoReordering (unsigned long &res,
+ Element &determinant,
+ Matrix &LigneA,
+ unsigned long Ni,
+ unsigned long Nj) const
+ {
+ // Requirements : SLA is an array of sparse rows
+ // IN PLACE.
+ // Without reordering (Pivot is first non-zero in row)
+ // long Ni = SLA.n_row (), Nj = SLA.n_col ();
+ // long Ni = LigneA.n_row (), Nj = LigneA.n_col ();
+ commentator().start ("Gaussian elimination (no reordering)",
+ "NoRe", Ni);
+ commentator().report (Commentator::LEVEL_NORMAL, INTERNAL_DESCRIPTION)
+ << "Gaussian elimination on " << Ni << " x " << Nj << " matrix" << std::endl;
+
+ typedef typename Matrix::Row Vector;
+ // typedef typename Vector::value_type E;
+ // typedef typename Matrix::Element Elem;
#ifdef __LINBOX_COUNT__
- long long nbelem = 0;
+ long long nbelem = 0;
#endif
- Vector Vzer (0);
+ Vector Vzer (0);
- _field.init(determinant,1UL);
- long last = (long)Ni - 1;
- long c;
- unsigned long indcol (0);
+ field().assign(determinant,field().one);
+ const long last = (long)Ni - 1;
+ long c;
+ unsigned long indcol (0);
- for (long k = 0; k < last; ++k) {
- if (!(k % 1000))
- commentator().progress (k);
+ for (long k = 0; k < last; ++k) {
+ if (!(k % 1000))
+ commentator().progress (k);
- unsigned long l;
- if (!LigneA[k].empty ()) {
- SparseFindPivot (LigneA[k], indcol, c, determinant);
- if (c != -1)
- for (l = (unsigned long)k + 1; l < (unsigned long)Ni; ++l)
- eliminate (LigneA[l], LigneA[k], indcol, c);
+ if (!LigneA[(size_t)k].empty ()) {
+ SparseFindPivot (LigneA[(size_t)k], indcol, c, determinant);
+ if (c != -1) {
+ unsigned long l;
+ for (l = (unsigned long)k + 1; l < (unsigned long)Ni; ++l)
+ eliminate (LigneA[(size_t)l], LigneA[(size_t)k], indcol, c);
+ }
#ifdef __LINBOX_COUNT__
- nbelem += LigneA[k].size ();
+ nbelem += LigneA[(size_t)k].size ();
#endif
- LigneA[k] = Vzer;
- }
- }
+ LigneA[(size_t)k] = Vzer;
+ }
+ }
- SparseFindPivot ( LigneA[last], indcol, c, determinant);
+ SparseFindPivot ( LigneA[(size_t)last], indcol, c, determinant);
#ifdef __LINBOX_COUNT__
- nbelem += LigneA[last].size ();
- commentator().report (Commentator::LEVEL_NORMAL, PARTIAL_RESULT)
- << "Left elements : " << nbelem << std::endl;
+ nbelem += LigneA[(size_t)last].size ();
+ commentator().report (Commentator::LEVEL_NORMAL, PARTIAL_RESULT)
+ << "Left elements : " << nbelem << std::endl;
#endif
- res = indcol;
-
- if ((res < Ni) || (res < Nj))
- if ((res < Ni) || (res < Nj) || (Ni == 0) || (Nj == 0))
- _field.init(determinant,0UL);
-
- integer card;
-
- _field.write(commentator().report (Commentator::LEVEL_NORMAL, PARTIAL_RESULT)
- << "Determinant : ", determinant)
- << " over GF (" << _field.cardinality (card) << ")" << std::endl;
-
- commentator().report (Commentator::LEVEL_NORMAL, PARTIAL_RESULT)
- << "Rank : " << res
- << " over GF (" << card << ")" << std::endl;
- commentator().stop ("done", 0, "NoRe");
- return res;
- }
-
-
- template <class _Field>
- template<class Vector> inline void
- GaussDomain<_Field>::Upper (Vector &lignecur,
- const Vector &lignepivot,
- unsigned long indcol,
- long indpermut) const
- {
- static typename _Field::Element zero = _field.init(zero);
-
- long n = lignecur.size () ;
- long k = (long) indcol - 1 ;
-
- // permutation if one has been performed to compute the pivot
- if (indpermut != k) {
- typename Vector::value_type tmp = lignecur[k];
- lignecur[k] = lignecur[indpermut];
- lignecur[indpermut] = tmp;
- }
-
- typename Vector::value_type headcoeff;
- _field.divin (_field.neg (headcoeff, lignecur[k]), lignepivot[k]);
-
-
-
- // LU in place
- _field.assign (lignecur[k], zero);
- for (long j = k; ++j < n;)
- _field.axpyin (lignecur[j], headcoeff, lignepivot[j]) ;
- }
-
- template <class _Field>
- template <class Vector> inline void
- GaussDomain<_Field>::LU (Vector &lignecur,
- const Vector &lignepivot,
- unsigned long indcol,
- long indpermut) const
- {
- long n = lignecur.size ();
- long k = (long) indcol - 1;
-
- // permutation if one has been performed to compute the pivot
- if (indpermut != k) {
- typename Vector::value_type tmp = lignecur[k];
- lignecur[k] = lignecur[indpermut];
- lignecur[indpermut] = tmp;
- }
-
- typename Vector::value_type headcoeff;
- // LU in place
- _field.div (headcoeff, lignecur[k], lignepivot[k]);
- _field.assign (lignecur[k], headcoeff);
- _field.negin (headcoeff);
- for (long j = k; ++j < n;)
- _field.axpyin (lignecur[j],headcoeff,lignepivot[j]);
- }
-
-
- template <class _Field>
- template <class Matrix> inline unsigned long &
- GaussDomain<_Field>::upperin (unsigned long &res, Matrix &A) const
- {
- // Requirements : A is an array of rows
- // In place (A is modified)
- // Without reordering (Pivot is first non-zero in row)
- long Ni = A.rowdim ();
- long last = Ni - 1;
- long c;
- unsigned long indcol = 0;
-
- for (long k = 0; k < last; ++k) {
- FindPivot (A[k], indcol, c);
- if (c != -1)
- for (long l = k + 1; l < Ni; ++l)
- Upper (A[l], A[k], indcol, c);
- }
-
- FindPivot (A[last], indcol, c);
- return res = indcol;
- }
-
- template <class _Field>
- template <class Matrix> inline unsigned long &
- GaussDomain<_Field>::LUin (unsigned long &res, Matrix &A) const
- {
- // Requirements : A is an array of rows
- // In place (A is modified)
- // Without reordering (Pivot is first non-zero in row)
-
- long Ni = A.rowdim ();
- long last = Ni - 1;
- long c;
- unsigned long indcol = 0;
-
- for (long k = 0; k < last; ++k) {
- FindPivot (A[k], indcol, c);
- if (c != -1)
- for (long l = k + 1; l < Ni; ++l)
- LU (A[l], A[k], indcol, c);
- }
-
- FindPivot (A[last], indcol, c);
- return res = indcol;
- }
-
-
- } // namespace LinBox
+ res = indcol;
+
+ if ((res < Ni) || (res < Nj))
+ if ((res < Ni) || (res < Nj) || (Ni == 0) || (Nj == 0))
+ field().assign(determinant,field().zero);
+
+ integer card;
+
+ field().write(commentator().report (Commentator::LEVEL_NORMAL, PARTIAL_RESULT)
+ << "Determinant : ", determinant)
+ << " over GF (" << field().cardinality (card) << ")" << std::endl;
+
+ commentator().report (Commentator::LEVEL_NORMAL, PARTIAL_RESULT)
+ << "Rank : " << res
+ << " over GF (" << card << ")" << std::endl;
+ commentator().stop ("done", 0, "NoRe");
+ return res;
+ }
+
+
+ template <class _Field>
+ template<class Vector> inline void
+ GaussDomain<_Field>::Upper (Vector &lignecur,
+ const Vector &lignepivot,
+ unsigned long indcol,
+ long indpermut) const
+ {
+
+ long n = lignecur.size () ;
+ long k = (long) indcol - 1 ;
+
+ // permutation if one has been performed to compute the pivot
+ if (indpermut != k) {
+ typename Vector::value_type tmp = lignecur[k];
+ lignecur[k] = lignecur[indpermut];
+ lignecur[indpermut] = tmp;
+ }
+
+ typename Vector::value_type headcoeff;
+ field().divin (field().neg (headcoeff, lignecur[k]), lignepivot[k]);
+
+
+
+ // LU in place
+ field().assign (lignecur[k], field().zero);
+ for (long j = k; ++j < n;)
+ field().axpyin (lignecur[j], headcoeff, lignepivot[j]) ;
+ }
+
+ template <class _Field>
+ template <class Vector> inline void
+ GaussDomain<_Field>::LU (Vector &lignecur,
+ const Vector &lignepivot,
+ unsigned long indcol,
+ long indpermut) const
+ {
+ long n = lignecur.size ();
+ long k = (long) indcol - 1;
+
+ // permutation if one has been performed to compute the pivot
+ if (indpermut != k) {
+ typename Vector::value_type tmp = lignecur[k];
+ lignecur[k] = lignecur[indpermut];
+ lignecur[indpermut] = tmp;
+ }
+
+ typename Vector::value_type headcoeff;
+ // LU in place
+ field().div (headcoeff, lignecur[k], lignepivot[k]);
+ field().assign (lignecur[k], headcoeff);
+ field().negin (headcoeff);
+ for (long j = k; ++j < n;)
+ field().axpyin (lignecur[j],headcoeff,lignepivot[j]);
+ }
+
+
+ template <class _Field>
+ template <class Matrix> inline unsigned long &
+ GaussDomain<_Field>::upperin (unsigned long &res, Matrix &A) const
+ {
+ // Requirements : A is an array of rows
+ // In place (A is modified)
+ // Without reordering (Pivot is first non-zero in row)
+ long Ni = A.rowdim ();
+ const long last = Ni - 1;
+ long c;
+ unsigned long indcol = 0;
+
+ for (long k = 0; k < last; ++k) {
+ FindPivot (A[k], indcol, c);
+ if (c != -1)
+ for (long l = k + 1; l < Ni; ++l)
+ Upper (A[l], A[k], indcol, c);
+ }
+
+ FindPivot (A[last], indcol, c);
+ return res = indcol;
+ }
+
+ template <class _Field>
+ template <class Matrix> inline unsigned long &
+ GaussDomain<_Field>::LUin (unsigned long &res, Matrix &A) const
+ {
+ // Requirements : A is an array of rows
+ // In place (A is modified)
+ // Without reordering (Pivot is first non-zero in row)
+
+ long Ni = A.rowdim ();
+ const long last = Ni - 1;
+ long c;
+ unsigned long indcol = 0;
+
+ for (long k = 0; k < last; ++k) {
+ FindPivot (A[k], indcol, c);
+ if (c != -1)
+ for (long l = k + 1; l < Ni; ++l)
+ LU (A[l], A[k], indcol, c);
+ }
+
+ FindPivot (A[last], indcol, c);
+ return res = indcol;
+ }
+
+
+} // namespace LinBox
+
#endif // __LINBOX_gauss_INL
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
// Local Variables:
// mode: C++
// tab-width: 8
// indent-tabs-mode: nil
// c-basic-offset: 8
// End:
-
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/algorithms/hybrid-det.h b/linbox/algorithms/hybrid-det.h
index 1376bbc..3f67bd1 100644
--- a/linbox/algorithms/hybrid-det.h
+++ b/linbox/algorithms/hybrid-det.h
@@ -29,12 +29,12 @@
#include "linbox/linbox-config.h"
#include "linbox/util/debug.h"
-#include "linbox/blackbox/sparse.h"
-#include "linbox/field/PID-integer.h"
+#include "linbox/matrix/sparse-matrix.h"
+#include "givaro/zring.h"
#include "linbox/randiter/random-prime.h"
#include "linbox/algorithms/rational-solver.h"
#include "linbox/algorithms/last-invariant-factor.h"
-#include "linbox/field/modular.h"
+#include "linbox/ring/modular.h"
#include "linbox/algorithms/cra-domain.h"
#include "linbox/randiter/random-prime.h"
#include "linbox/algorithms/matrix-hom.h"
@@ -49,19 +49,21 @@ namespace LinBox
struct IntegerModularDetReduced {
private:
- const Blackbox &A;
- const MyMethod &M;
+ const Blackbox &A;
+ const MyMethod &M;
/* contains the factor by which to divide det */
- integer beta;
+ integer beta;
- size_t factor;
- size_t iter_count;
- size_t iter_count2;
- typename Vector<PID_integer>::Dense moduli;
+ size_t factor;
+ Givaro::ZRing<Integer> ZZ; //! @todo is it \c A.field()?
+ size_t iter_count;
+ size_t iter_count2;
+ typedef BlasVector<Givaro::ZRing<Integer> > IVect ;
+ IVect moduli ;
public:
- typename Vector<PID_integer>::Dense primes;
+ IVect primes ;
size_t iterations()
{
@@ -74,18 +76,15 @@ namespace LinBox
}
-#if 0
- int iter_count;
- int iter_count2;
- Vector <PID_integer>:: Dense moduli;
- Vector <PID_integer>:: Dense primes;
-#endif
-
- IntegerModularDetReduced(const Blackbox& b, const MyMethod& n, const integer& divisor, const size_t& f) :
- A(b), M(n), beta(divisor), factor(f)
+ IntegerModularDetReduced(const Blackbox& b, const MyMethod& n, const integer& divisor, const size_t& fs) :
+ A(b), M(n)
+ , beta(divisor)
+ , factor(fs)
+ ,ZZ(Givaro::ZRing<Integer>())
+ ,moduli(ZZ,fs),primes(ZZ,fs)
{
- moduli.resize(factor);
- primes.resize(factor);
+ // moduli.resize(factor);
+ // primes.resize(factor);
iter_count = 0;
iter_count2 = 0;
@@ -155,7 +154,7 @@ namespace LinBox
const MyMethod &M)
{
//commentator().setReportStream(std::cout);
- typedef Modular<double> myModular;
+ typedef Givaro::Modular<double> mymodular;
typedef typename Blackbox::Field Integers;
typedef typename Integers::Element Integer_t;
@@ -174,7 +173,7 @@ namespace LinBox
RandomPrimeIterator genprime( (Integer_t)p_size );
//cout << "prime size: " << p_size << "\n";
- EarlySingleCRA<myModular> cra(4UL);
+ EarlySingleCRA<mymodular> cra(4UL);
IntegerModularDetReduced<Blackbox,MyMethod> iteration(A, M, beta,myfactor);
#if 0
@@ -195,10 +194,10 @@ namespace LinBox
#endif
{
++genprime;
- myModular D(*genprime);
+ mymodular D(*genprime);
iteration.primes[early_counter] = *genprime;
- myModular::Element r;
- D.init(r,0);
+ mymodular::Element r;
+ D.assign(r,D.zero);
cra.initialize( D, iteration(r, D));
++early_counter;
}
@@ -206,11 +205,11 @@ namespace LinBox
while ( early_counter < myfactor && !cra.terminated() ) {
++genprime;
while (cra.noncoprime(*genprime)) ++genprime;
- myModular D(*genprime);
+ mymodular D(*genprime);
iteration.primes[early_counter] = *genprime;
// prime(p, early_counter);
- myModular::Element r;
- D.init(r,0);
+ mymodular::Element r;
+ D.assign(r,D.zero);
cra.progress( D, iteration(r, D));
++early_counter;
}
@@ -236,11 +235,11 @@ namespace LinBox
if (A.rowdim() < 50 ) {
while ( !cra.terminated() ) {
genprime.randomPrime(p);
- myModular D(p);
+ mymodular D(p);
iteration.primes[early_counter] = p;
// prime(p, early_counter);
- myModular::Element r;
- D.init(r,0);
+ mymodular::Element r;
+ D.assign(r,D.zero);
cra.progress( D, iteration(r, D));
++early_counter;
}
@@ -252,13 +251,13 @@ namespace LinBox
RandomPrime genprime1( 26-(int)ceil(log((double)A.rowdim())*0.7213475205));
Integers ZZ;
- RationalSolver < Integers , myModular, RandomPrime, DixonTraits > RSolver(A. field(), genprime);
+ RationalSolver < Integers , mymodular, RandomPrime, DixonTraits > RSolver(A. field(), genprime);
#endif
- RationalSolver < Integers , myModular, RandomPrimeIterator, DixonTraits > RSolver;
+ RationalSolver < Integers , mymodular, RandomPrimeIterator, DixonTraits > RSolver;
- typename Vector<Integers>:: Dense r_num1 (A. coldim());
+ BlasVector<Integers> r_num1 (A.field(),A. coldim());
- LastInvariantFactor < Integers ,RationalSolver < Integers, myModular, RandomPrimeIterator, DixonTraits > > LIF(RSolver);
+ LastInvariantFactor < Integers ,RationalSolver < Integers, mymodular, RandomPrimeIterator, DixonTraits > > LIF(RSolver);
#ifdef _LB_H_DET_TIMING
BT.start();
#endif
@@ -297,14 +296,14 @@ namespace LinBox
iteration.Beta(beta);
//RandomPrime genprime2( 26-(int)ceil(log((double)A.rowdim())*0.7213475205));
- EarlySingleCRA< Modular<double> > cra2(4UL);
+ EarlySingleCRA< Givaro::Modular<double> > cra2(4UL);
Integer_t k = 1;
early_counter = 0;
while ( early_counter < myfactor && !cra2.terminated() ) {
- myModular D(iteration.primes[early_counter]);
- myModular::Element r;
- D.init(r,0);
+ mymodular D(iteration.primes[early_counter]);
+ mymodular::Element r;
+ D.assign(r,D.zero);
cra2.progress( D, iteration(r, D) );
++early_counter;
}
@@ -318,7 +317,7 @@ namespace LinBox
}
else if (0/* time2 < a*log2(lif)*time1/p_size*/) {
- typename Vector<Integers>:: Dense r_num2 (A. coldim());
+ BlasVector<Integers> r_num2 (A.field(),A. coldim());
Integer_t lif2=1;
LIF.lastInvariantFactor1(lif2,r_num2,A);
LIF.bonus(bonus,lif, lif2, r_num1,r_num2);
@@ -334,13 +333,13 @@ namespace LinBox
//iteration.Moduli(moduli);
//iteration.Primes(primes);
k=1;
- EarlySingleCRA< Modular<double> > cra3(4UL);
+ EarlySingleCRA< Givaro::Modular<double> > cra3(4UL);
early_counter = 0;
while ( (early_counter < myfactor) && (!cra3.terminated() )) {
- myModular D(iteration.primes[early_counter]);
- myModular::Element r;
- D.init(r,0);
+ mymodular D(iteration.primes[early_counter]);
+ mymodular::Element r;
+ D.assign(r,D.zero);
cra3.progress( D, iteration(r, D));
++early_counter;
//iteration.Inc();
@@ -361,9 +360,9 @@ namespace LinBox
while (!cra3.terminated()) {
++genprime;
while (cra3.noncoprime(*genprime)) ++genprime;
- myModular D(*genprime);
- myModular::Element r;
- D.init(r,0);
+ mymodular D(*genprime);
+ mymodular::Element r;
+ D.assign(r,D.zero);
cra3.progress( D, iteration(r, D));
}
cra3.result(k);
@@ -378,9 +377,9 @@ namespace LinBox
while (!cra2.terminated()) {
++genprime;
while (cra2.noncoprime(*genprime)) ++genprime;
- myModular D(*genprime);
- myModular::Element r;
- D.init(r,0);
+ mymodular D(*genprime);
+ mymodular::Element r;
+ D.assign(r,D.zero);
cra2.progress( D, iteration(r, D));
}
cra2.result(k);
@@ -393,9 +392,9 @@ namespace LinBox
while (!cra2.terminated()) {
++genprime;
while (cra2.noncoprime(*genprime)) ++genprime;
- myModular D(*genprime);
- myModular::Element r;
- D.init(r,0);
+ mymodular D(*genprime);
+ mymodular::Element r;
+ D.assign(r,D.zero);
cra2.progress( D, iteration(r, D));
}
cra2.result(k);
@@ -437,8 +436,8 @@ namespace LinBox
{
//commentator().setReportStream(std::cout);
- typedef Modular<double> myModular;
- //typedef PID_integer Integers;
+ typedef Givaro::Modular<double> mymodular;
+ //typedef Givaro::ZRing<Integer> Integers;
typedef typename Integers::Element Integer;
commentator().start ("Integer Determinant - hybrid version for sparse matrices", "det");
@@ -456,7 +455,7 @@ namespace LinBox
RandomPrime genprime( (Integer)p_size );
commentator().report (Commentator::LEVEL_NORMAL, INTERNAL_DESCRIPTION) << "prime size: " << p_size << "\n";
- ChineseRemainder< myModular > cra(3UL);
+ ChineseRemainder< mymodular > cra(3UL);
IntegerModularDetReduced<SparseMatrix<Integers >,MyMethod> iteration(A, M, beta,myfactor);
#if 0
if (A.rowdim() < 200 ) {
@@ -475,21 +474,21 @@ namespace LinBox
BT.start();
genprime.randomPrime(p);
- myModular D(p);
+ mymodular D(p);
iteration.primes[early_counter] = p;
- myModular::Element r;
- D.init(r,0);
+ mymodular::Element r;
+ D.assign(r,D.zero);
cra.initialize( D, iteration(r, D));
++early_counter;
while ( early_counter < myfactor && !cra.terminated() ) {
genprime.randomPrime(p);
while (cra.noncoprime(p)) genprime.randomPrime(p);
- myModular D(p);
+ mymodular D(p);
iteration.primes[early_counter] = p;
// prime(p, early_counter);
- myModular::Element r;
- D.init(r,0);
+ mymodular::Element r;
+ D.assign(r,D.zero);
cra.progress( D, iteration(r, D));
++early_counter;
}
@@ -512,11 +511,11 @@ namespace LinBox
if (A.rowdim() < 50 ) {
while ( !cra.terminated() ) {
genprime.randomPrime(p);
- myModular D(p);
+ mymodular D(p);
iteration.primes[early_counter] = p;
// prime(p, early_counter);
- myModular::Element r;
- D.init(r,0);
+ mymodular::Element r;
+ D.assign(r,D.zero);
cra.progress( D, iteration(r, D));
++early_counter;
}
@@ -529,7 +528,7 @@ namespace LinBox
RandomPrime genprime1( 26-(int)ceil(log((double)A.rowdim())*0.7213475205));
Integers ZZ;
#endif
- typedef RationalSolver < Integers , myModular, RandomPrime, BlockHankelTraits > Solver;
+ typedef RationalSolver < Integers , mymodular, RandomPrime, BlockHankelTraits > Solver;
Solver RSolver(A. field(), genprime);
typename Vector<Integers>:: Dense r_num1 (A. coldim());
@@ -568,14 +567,14 @@ namespace LinBox
iteration.Beta(beta);
//RandomPrime genprime2( 26-(int)ceil(log((double)A.rowdim())*0.7213475205));
- ChineseRemainder< Modular<double> > cra2(3UL);
+ ChineseRemainder< Givaro::Modular<double> > cra2(3UL);
Integer k = 1;
early_counter = 0;
while ( early_counter < myfactor && !cra2.terminated() ) {
- myModular D(iteration.primes[early_counter]);
- myModular::Element r;
- D.init(r,0);
+ mymodular D(iteration.primes[early_counter]);
+ mymodular::Element r;
+ D.assign(r,D.zero);
cra2.progress( D, iteration(r, D));
++early_counter;
}
@@ -605,13 +604,13 @@ namespace LinBox
//iteration.Moduli(moduli);
//iteration.Primes(primes);
k=1;
- ChineseRemainder< Modular<double> > cra3(3UL);
+ ChineseRemainder< Givaro::Modular<double> > cra3(3UL);
early_counter = 0;
while ( (early_counter < myfactor) && (!cra3.terminated() )) {
- myModular D(iteration.primes[early_counter]);
- myModular::Element r;
- D.init(r,0);
+ mymodular D(iteration.primes[early_counter]);
+ mymodular::Element r;
+ D.assign(r,D.zero);
cra3.progress( D, iteration(r, D));
++early_counter;
//iteration.Inc();
@@ -632,9 +631,9 @@ namespace LinBox
while (!cra3.terminated()) {
genprime.randomPrime(p);
while (cra3.noncoprime(p)) genprime.randomPrime(p);
- myModular D(p);
- myModular::Element r;
- D.init(r,0);
+ mymodular D(p);
+ mymodular::Element r;
+ D.assign(r,D.zero);
cra3.progress( D, iteration(r, D));
}
cra3.result(k);
@@ -649,9 +648,9 @@ namespace LinBox
while (!cra2.terminated()) {
genprime.randomPrime(p);
while (cra2.noncoprime(p)) genprime.randomPrime(p);
- myModular D(p);
- myModular::Element r;
- D.init(r,0);
+ mymodular D(p);
+ mymodular::Element r;
+ D.assign(r,D.zero);
cra2.progress( D, iteration(r, D));
}
cra2.result(k);
@@ -664,9 +663,9 @@ namespace LinBox
while (!cra2.terminated()) {
genprime.randomPrime(p);
while (cra2.noncoprime(p)) genprime.randomPrime(p);
- myModular D(p);
- myModular::Element r;
- D.init(r,0);
+ mymodular D(p);
+ mymodular::Element r;
+ D.assign(r,D.zero);
cra2.progress( D, iteration(r, D));
}
cra2.result(k);
@@ -709,11 +708,10 @@ namespace LinBox
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
// Local Variables:
// mode: C++
// tab-width: 8
// indent-tabs-mode: nil
// c-basic-offset: 8
// End:
-
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/algorithms/iml.doxy b/linbox/algorithms/iml.doxy
new file mode 100644
index 0000000..53fe717
--- /dev/null
+++ b/linbox/algorithms/iml.doxy
@@ -0,0 +1,29 @@
+// Copyright (C) 2013 LinBox, GNU LGPL, see COPYING for licence information
+/*
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ * ========LICENCE========
+ */
+
+/** @ingroup algorithms
+ @defgroup iml IML
+ @brief NO DOC YET
+
+
+ */
+
+// vim:syntax=doxygen
diff --git a/linbox/algorithms/invariant-factors.h b/linbox/algorithms/invariant-factors.h
new file mode 100644
index 0000000..9a96bb1
--- /dev/null
+++ b/linbox/algorithms/invariant-factors.h
@@ -0,0 +1,271 @@
+/* linbox/algorithms/coppersmith-invariant-factors.h
+ * Copyright (C) 2015 Gavin Harrison
+ *
+ * Written by Gavin Harrison <gavin.har at gmail.com>
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ * ========LICENCE========
+ */
+
+#ifndef __LINBOX_invariant_factors_H
+#define __LINBOX_invariant_factors_H
+
+#include "linbox/algorithms/block-coppersmith-domain.h"
+#include "linbox/algorithms/blackbox-block-container.h"
+#include "linbox/matrix/random-matrix.h"
+
+#include <givaro/givpoly1.h>
+#include <linbox/ring/givaro-poly.h>
+#include <linbox/algorithms/smith-form-kannan-bachem.h>
+#include <linbox/algorithms/smith-form-iliopoulos2.h>
+
+#include <givaro/givtimer.h>
+
+namespace LinBox
+{
+
+template<class _Field, class _Blackbox>
+class InvariantFactors {
+public:
+ typedef _Field Field;
+ typedef _Blackbox Blackbox;
+ typedef MatrixDomain<Field> Domain;
+ typedef typename Domain::OwnMatrix Block;
+ typedef typename Field::RandIter RandIter;
+ typedef Givaro::Poly1Dom<Field,Givaro::Dense> PolyDom;
+ typedef GivaroPoly<PolyDom> PolyRing;
+ typedef typename PolyRing::Element PolyElement;
+ typedef MatrixDomain<PolyRing> PolyMatDom;
+ typedef typename PolyMatDom::OwnMatrix PolyBlock;
+ typedef RandomDenseMatrix<RandIter, Field> RandomMatrix;
+ typedef SmithFormKannanBachemDomain<PolyMatDom> SmithKbDomain;
+ typedef BlackboxBlockContainer<Field,Blackbox> Sequence;
+ typedef BlockCoppersmithDomain<Domain, Sequence> CoppersmithDomain;
+ typedef IliopoulosDomain<PolyRing> IliopoulosDom;
+
+protected:
+ Domain _MD;
+ Field _F;
+ RandIter _RI;
+ RandomMatrix _RDM;
+ PolyDom _PD;
+ PolyRing _R;
+ PolyMatDom _PMD;
+ SmithKbDomain _SFKB;
+ IliopoulosDom _SFI;
+ Givaro::Timer timer;
+
+public:
+ InvariantFactors(Field &F, PolyRing &R) :
+ _MD(F),
+ _F(F),
+ _RI(F),
+ _RDM(F, _RI),
+ _PD(R.domain()),
+ _R(R),
+ _PMD(R),
+ _SFKB(_PMD),
+ _SFI(R)
+ {
+ }
+
+//protected:
+ void computeGenerator(
+ std::vector<Block> &gen,
+ const Blackbox &M,
+ size_t b,
+ int earlyTerm)
+ {
+ size_t n = M.rowdim();
+ Block U(_F, b, n);
+ Block V(_F, n, b);
+
+ _RDM.random(U);
+ _RDM.random(V);
+
+ Sequence blockSeq(&M, _F, U, V);
+ CoppersmithDomain coppersmith(_MD, &blockSeq, earlyTerm);
+
+ coppersmith.right_minpoly(gen);
+ }
+
+ void convertSequenceToPolyMatrix(
+ PolyBlock &MM,
+ const std::vector<Block> &gen)
+ {
+ PolyElement temp;
+ size_t d = gen.size();
+ _PD.init(temp, d-1);
+
+ size_t b = MM.rowdim();
+ for (uint32_t i = 0; i < b; i++) {
+ for (uint32_t j = 0; j < b; j++) {
+ for (uint32_t k = 0; k < d; k++) {
+ _PD.setEntry(temp, gen[k].getEntry(i,j), k);
+ }
+ MM.setEntry(i,j,temp);
+ }
+ }
+ }
+
+ void modMatrix(PolyBlock &M, const PolyElement &d)
+ {
+ size_t n = M.coldim();
+
+ for (size_t i = 0; i < n; i++) {
+ for (size_t j = 0; j < n; j++) {
+ PolyElement tmp;
+ M.getEntry(tmp, i, j);
+ _R.modin(tmp, d);
+ M.setEntry(i, j, tmp);
+ }
+ }
+ }
+
+ template <class PolyRingVector>
+ void computeSmithForm(PolyRingVector &diag, const PolyBlock &M, size_t b)
+ {
+ diag.resize(b);
+ _SFKB.solve(diag, M);
+
+ for (uint32_t i = 0; i < diag.size(); i++) {
+ _R.normalizeIn(diag[i]);
+ }
+ }
+
+ template <class PolyRingVector>
+ void computeSmithForm(
+ PolyRingVector &diag,
+ const PolyBlock &M,
+ const PolyElement &d,
+ size_t b)
+ {
+ diag.resize(b);
+ _SFI.smithForm(diag, M, d);
+ }
+
+ template <class PolyRingVector>
+ void computeFactors(
+ PolyRingVector &diag,
+ const Blackbox &M,
+ size_t b,
+ int earlyTerm = 10)
+ {
+ timer.clear();
+ timer.start();
+ std::vector<Block> gen;
+ computeGenerator(gen, M, b, earlyTerm);
+ timer.stop();
+
+ std::cout << "Time to compute first generator: " << timer.usertime();
+ std::cout << std::endl;
+
+ timer.clear();
+
+ timer.start();
+ PolyBlock MM(_R, b, b);
+ convertSequenceToPolyMatrix(MM, gen);
+ timer.stop();
+
+ //std::cout << "Time to convert first matrix to poly matrix: " << timer.usertime();
+ //std::cout << std::endl;
+
+ timer.clear();
+
+ timer.start();
+ computeSmithForm(diag, MM, b);
+ timer.stop();
+
+ std::cout << "Time to compute smith form kb: " << timer.usertime();
+ std::cout << std::endl;
+ }
+
+ template <class PolyRingVector>
+ void computeFactors(
+ PolyRingVector &diag,
+ const Blackbox &M,
+ const PolyElement &d,
+ size_t b,
+ int earlyTerm = 10)
+ {
+ timer.clear();
+ timer.start();
+ std::vector<Block> gen;
+ computeGenerator(gen, M, b, earlyTerm);
+ timer.stop();
+
+ std::cout << "Time to compute second generator: " << timer.usertime();
+ std::cout << std::endl;
+
+ timer.clear();
+ timer.start();
+ PolyBlock MM(_R, b, b);
+ convertSequenceToPolyMatrix(MM, gen);
+ timer.stop();
+
+ //std::cout << "Time to convert second matrix to poly matrix: " << timer.usertime();
+ //std::cout << std::endl;
+
+ timer.clear();
+ timer.start();
+ modMatrix(MM, d);
+ computeSmithForm(diag, MM, d, b);
+ timer.stop();
+
+ std::cout << "Time to compute smith form iliopoulos: " << timer.usertime();
+ std::cout << std::endl;
+ }
+
+public:
+ template <class PolyRingVector>
+ void solve(
+ PolyRingVector &diag,
+ const Blackbox &M,
+ size_t b,
+ size_t b1,
+ size_t r,
+ int earlyTerm = 10)
+ {
+ // Compute first b1 factors
+ PolyRingVector partialResult;
+ computeFactors(partialResult, M, b1, earlyTerm);
+
+ // get r-th factor
+ PolyElement d;
+ _R.assign(d, partialResult[b1 - r]);
+
+ // Compute factors mod r-th factor
+ computeFactors(diag, M, d, b, earlyTerm);
+
+ // Fill in zeros before r-th factor with r-th factor
+ for (size_t i = 0; i < b - r; i++) {
+ if (_R.isZero(diag[i])) {
+ _R.assign(diag[i], d);
+ }
+ }
+
+ // Fill in remaining factors with original values
+ for (size_t i = b - r; i < b; i++) {
+ diag[i] = partialResult[i - b + b1];
+ }
+ }
+};
+
+}
+
+#endif //__LINBOX_invariant_factors_H
diff --git a/linbox/algorithms/la-block-lanczos.h b/linbox/algorithms/la-block-lanczos.h
index 8221a25..655fb4b 100644
--- a/linbox/algorithms/la-block-lanczos.h
+++ b/linbox/algorithms/la-block-lanczos.h
@@ -52,7 +52,7 @@ namespace LinBox
* mutual orthogonality properties. This algorithm was proposed by
* Bradford Hovinen.
*/
- template <class Field, class Matrix = BlasMatrix<typename Field::Element> >
+ template <class Field, class Matrix = BlasMatrix<Field> >
class LABlockLanczosSolver {
public:
@@ -65,7 +65,7 @@ namespace LinBox
*/
LABlockLanczosSolver (const Field &F,
const BlockLanczosTraits &traits) :
- _traits (traits), _field (F), _VD (F), _MD (F), _randiter (F),
+ _traits (traits), _field (&F), _VD (F), _MD (F), _randiter (F),
_uAv (this), _eliminator (F, _traits.blockingFactor ())
{ init_temps (); }
@@ -78,7 +78,7 @@ namespace LinBox
LABlockLanczosSolver (const Field &F,
const BlockLanczosTraits &traits,
typename Field::RandIter r) :
- _traits (traits), _field (F), _VD (F), _MD (F), _randiter (r),
+ _traits (traits), _field (const_cast<Field*>(&F)), _VD (F), _MD (F), _randiter (r),
_uAv (this),
_eliminator (F, (unsigned int) _traits.blockingFactor ())
{ init_temps (); }
@@ -178,8 +178,7 @@ namespace LinBox
};
// Structure representing an iterate
- struct Iterate
- {
+ struct Iterate {
// Record of the pseudoinverse
Matrix _udotAvbarinv; // N x N
Matrix _ubarAvdotinv; // N x N
@@ -208,16 +207,21 @@ namespace LinBox
bool _done;
Iterate (LABlockLanczosSolver &solver, size_t n, size_t N, unsigned int iter) :
- _udotAvbarinv (N, N), _ubarAvdotinv (N, N),
- _u (n, N), _v (n, N), _udot (n, N), _vdot (n, N),
+ _udotAvbarinv (solver.field(),N, (uint32_t)N),
+ _ubarAvdotinv (solver.field(),N, (uint32_t)N),
+ _u (solver.field(),n, (uint32_t)N),
+ _v (solver.field(),n, (uint32_t)N),
+ _udot (solver.field(),n, (uint32_t)N),
+ _vdot (solver.field(),n, (uint32_t)N),
_sigma_u (solver, (unsigned int) N),
_sigma_v (solver, (unsigned int) N),
- _udotAv (N, N), _uAvdot (N, N)
+ _udotAv (solver.field(),N, (uint32_t)N),
+ _uAvdot (solver.field(),N, (uint32_t)N)
{ init (iter); }
void init (unsigned int iter)
{
- _iter = iter;
+ _iter = (int)iter;
_rho_u = _rho_v = 0;
_done = false;
_sigma_u.reset ();
@@ -313,10 +317,13 @@ namespace LinBox
return (a < b) ? a : b;
}
+ inline Field & field() { return *_field; }
+ private:
+
// Private variables
const BlockLanczosTraits _traits;
- const Field &_field;
+ /*const*/ Field *_field;
VectorDomain<Field> _VD;
MatrixDomain<Field> _MD;
typename Field::RandIter _randiter;
diff --git a/linbox/algorithms/la-block-lanczos.inl b/linbox/algorithms/la-block-lanczos.inl
index c94bfe8..93f9bee 100644
--- a/linbox/algorithms/la-block-lanczos.inl
+++ b/linbox/algorithms/la-block-lanczos.inl
@@ -42,7 +42,6 @@
#include "linbox/blackbox/diagonal.h"
#include "linbox/blackbox/compose.h"
#include "linbox/blackbox/transpose.h"
-#include "linbox/randiter/nonzero.h"
#include "linbox/util/commentator.h"
#include "linbox/util/timer.h"
#include "linbox/algorithms/la-block-lanczos.h"
@@ -153,7 +152,7 @@ namespace LinBox
_VD.copy (*(_v0.colBegin ()), b);
// Fill the remaining columns of _v0 with random data
- RandomDenseStream<Field, typename Matrix::Col> stream (_field, _randiter, A.coldim ());
+ RandomDenseStream<Field, typename Matrix::Col> stream (field(), _randiter, A.coldim ());
typename Matrix::ColIterator iter = _v0.colBegin ();
for (++iter; iter != _v0.colEnd (); ++iter)
@@ -230,7 +229,7 @@ namespace LinBox
_Av.resize (A.coldim (), _traits.blockingFactor ());
// Fill y with random data
- RandomDenseStream<Field, typename Matrix::Col> stream (_field, _randiter, A.coldim ());
+ RandomDenseStream<Field, typename Matrix::Col> stream (field(), _randiter, A.coldim ());
typename Matrix::ColIterator iter;
for (iter = _y.colBegin (); iter != _y.colEnd (); ++iter)
@@ -301,7 +300,7 @@ namespace LinBox
_Av.resize (A.coldim (), _traits.blockingFactor ());
// Fill v0 with random data
- RandomDenseStream<Field, typename Matrix::Col> stream (_field, _randiter, A.coldim ());
+ RandomDenseStream<Field, typename Matrix::Col> stream (field(), _randiter, A.coldim ());
typename Matrix::ColIterator iter;
for (iter = _y.colBegin (); iter != _y.colEnd (); ++iter)
@@ -352,7 +351,7 @@ namespace LinBox
unsigned int dead_iters = 0;
Integer c;
- _field.characteristic (c);
+ field().characteristic (c);
double logc = log (double (c));
unsigned int max_dead_iters = (unsigned int) ceil (3 * log (double (A.rowdim ())) / (N * logc)) + 2;
@@ -390,7 +389,7 @@ namespace LinBox
next_iterate = getNextIterate (0);
// Get a random fat vectors _blockV[0] and _blockU[0]
- RandomDenseStream<Field, typename Matrix::Col> stream (_field, _randiter, A.coldim ());
+ RandomDenseStream<Field, typename Matrix::Col> stream (field(), _randiter, A.coldim ());
typename Matrix::ColIterator u_iter;
for (u_iter = next_iterate->_u.colBegin (); u_iter != next_iterate->_u.colEnd (); ++u_iter)
@@ -398,6 +397,7 @@ namespace LinBox
_MD.copy (next_iterate->_v, _v0);
+ //! @bug what is this ?
#ifdef LABL_DETAILED_TRACE
Matrix u0 (A.rowdim (), _traits.blockingFactor ());
Matrix v0 (A.rowdim (), _traits.blockingFactor ());
@@ -442,21 +442,21 @@ namespace LinBox
TIMER_STOP(AV);
TIMER_START(innerProducts);
- _MD.mul (*_uAv.get (_iter, _iter), transpose (iterate_here->_u), _Av);
- _MD.mul (*_uAv.get (_iter + 1, _iter), uTA, _Av);
+ _MD.mul (*_uAv.get ((int)_iter, (int)_iter), transpose (iterate_here->_u), _Av);
+ _MD.mul (*_uAv.get ((int)_iter + 1, (int)_iter), uTA, _Av);
TIMER_STOP(innerProducts);
- if (_MD.isZero (*_uAv.get (_iter, _iter)) && _MD.isZero (*_uAv.get (_iter + 1, _iter)))
+ if (_MD.isZero (*_uAv.get ((int)_iter, (int)_iter)) && _MD.isZero (*_uAv.get ((int)_iter + 1, (int)_iter)))
++dead_iters;
else
dead_iters = 0;
TIMER_START(updateInnerProducts);
- _MD.copy (*_uAv.get (_iter, _iter + 1), *_uAv.get (_iter + 1, _iter));
+ _MD.copy (*_uAv.get ((int)_iter, (int)_iter + 1), *_uAv.get ((int)_iter + 1, (int)_iter));
for (j = _history.begin (); j != _history.end () && *j != iterate_here; ++j) {
- _MD.copy (*_uAv.get (_iter + 1, (*j)->_iter), *_uAv.get (_iter, (*j)->_iter + 1));
- _MD.copy (*_uAv.get ((*j)->_iter, _iter + 1), *_uAv.get ((*j)->_iter + 1, _iter));
+ _MD.copy (*_uAv.get ((int)_iter + 1, (int)(*j)->_iter), *_uAv.get ((int)_iter, (int)(*j)->_iter + 1));
+ _MD.copy (*_uAv.get ((int)(*j)->_iter, (int)_iter + 1), *_uAv.get ((int)(*j)->_iter + 1, (int)_iter));
compute_alphaAvip1 (j, _iter);
compute_uip1Abeta (j, _iter);
}
@@ -484,7 +484,7 @@ namespace LinBox
BlasMatrix<Field> udot ((*j)->_udot, 0, 0, A.rowdim (), (*j)->_rho_v);
BlasMatrix<Field> vdot ((*j)->_vdot, 0, 0, A.rowdim (), (*j)->_rho_u);
- _MD.copy (_T1, *_uAv.get (_iter + 1, (*j)->_iter));
+ _MD.copy (_T1, *_uAv.get ((int)_iter + 1, (*j)->_iter));
(*j)->_sigma_v.apply (_T1, false);
BlasMatrix<Field> uip1Avbarj (_T1, 0, 0, N, (*j)->_rho_v);
@@ -500,7 +500,7 @@ namespace LinBox
_MD.write (reportN, udotAvbarinv);
#endif
- _MD.copy (_T1, *_uAv.get ((*j)->_iter, _iter + 1));
+ _MD.copy (_T1, *_uAv.get ((*j)->_iter, (int)_iter + 1));
(*j)->_sigma_u.apply (_T1, true);
BlasMatrix<Field> ubarjAvip1 (_T1, 0, 0, (*j)->_rho_u, N);
@@ -606,8 +606,8 @@ namespace LinBox
BlasMatrix<Field> udotAv ((*l)->_udotAv, 0, 0, Cu.coldim (), N);
BlasMatrix<Field> uAvdot ((*l)->_uAvdot, 0, 0, N, Cv.rowdim ());
- _MD.axpyin (*_uAv.get (iter + 1, (*l)->_iter), Cu, udotAv);
- _MD.axpyin (*_uAv.get ((*l)->_iter, iter + 1), uAvdot, Cv);
+ _MD.axpyin (*_uAv.get ((int)iter + 1, (*l)->_iter), Cu, udotAv);
+ _MD.axpyin (*_uAv.get ((*l)->_iter, (int)iter + 1), uAvdot, Cv);
#ifdef LABL_DETAILED_TRACE
std::ostream &reportN = commentator().report (Commentator::LEVEL_NORMAL, INTERNAL_DESCRIPTION);
@@ -720,7 +720,7 @@ namespace LinBox
_MD.negin (ujAvietamu);
_MD.axpyin (*_uAv.get ((*j)->_iter, i->_iter), ujAvietamu, ultildeAvi);
- adjust_alphaAvip1 (j, (*j)->_steps.back (), i->_iter);
+ adjust_alphaAvip1 (j, (*j)->_steps.back (), (unsigned int)i->_iter);
}
if (*l != i) {
@@ -844,7 +844,7 @@ namespace LinBox
_MD.negin (nuTuizetaAvj);
_MD.axpyin (*_uAv.get (i->_iter, (*j)->_iter), uiAvltilde, nuTuizetaAvj);
- adjust_uip1Abeta (j, (*j)->_steps.back (), i->_iter);
+ adjust_uip1Abeta (j, (*j)->_steps.back (), (unsigned int)i->_iter);
}
if (*l != i) {
@@ -1024,12 +1024,12 @@ namespace LinBox
BlasMatrix<Field> nuukAvj (*step._nuukAvj, 0, 0, step._rhop, N);
- _MD.copy (_T1, *_uAv.get (iter + 1, step._l->_iter));
+ _MD.copy (_T1, *_uAv.get ((int)iter + 1, step._l->_iter));
step._l->_sigma_v.apply (_T1, false);
BlasMatrix<Field> uip1Avltilde (_T1, 0, step._rho, N, step._rhop);
- _MD.axpyin (*_uAv.get (iter + 1, (*j)->_iter), uip1Avltilde, nuukAvj);
+ _MD.axpyin (*_uAv.get ((int)iter + 1, (*j)->_iter), uip1Avltilde, nuukAvj);
}
template <class Field, class Matrix>
@@ -1071,12 +1071,12 @@ namespace LinBox
BlasMatrix<Field> ujAvkmu (*step._ujAvkmu, 0, 0, N, step._rhop);
- _MD.copy (_T1, *_uAv.get (step._l->_iter, iter + 1));
+ _MD.copy (_T1, *_uAv.get (step._l->_iter, (int)iter + 1));
step._l->_sigma_u.apply (_T1, true);
BlasMatrix<Field> ultildeAvip1 (_T1, step._rho, 0, step._rhop, N);
- _MD.axpyin (*_uAv.get ((*j)->_iter, iter + 1), ujAvkmu, ultildeAvip1);
+ _MD.axpyin (*_uAv.get ((*j)->_iter, (int)iter + 1), ujAvkmu, ultildeAvip1);
}
template <class Field, class Matrix>
@@ -1401,10 +1401,10 @@ namespace LinBox
linbox_check ((unsigned int) i < _base + _blocks.size ());
linbox_check ((unsigned int) j < _base + _blocks.front ().size ());
- Matrix *ret = _blocks[i - _base][j - _base];
+ Matrix *ret = _blocks[(size_t)i - _base][(size_t)j - _base];
if (ret == NULL)
- ret = _blocks[i - _base][j - _base] = _solver->newBlock ();
+ ret = _blocks[(size_t)i - _base][(size_t)j - _base] = _solver->newBlock ();
linbox_check (ret != NULL);
@@ -1419,7 +1419,7 @@ namespace LinBox
Matrix *ret;
if (_ip_trashcan.empty ())
- ret = new Matrix (_traits.blockingFactor (), _traits.blockingFactor ());
+ ret = new Matrix (field(),_traits.blockingFactor (), _traits.blockingFactor ());
else {
ret = _ip_trashcan.top ();
_ip_trashcan.pop ();
@@ -1547,7 +1547,7 @@ namespace LinBox
_matW.resize (_traits.blockingFactor (), _traits.blockingFactor ());
_Cu.resize (_traits.blockingFactor (), _traits.blockingFactor ());
_Cv.resize (_traits.blockingFactor (), _traits.blockingFactor ());
- _field.init (_one, 1);
+ field().init (_one, 1);
}
} // namespace LinBox
diff --git a/linbox/algorithms/lanczos.h b/linbox/algorithms/lanczos.h
index e80cfd2..0d05a5b 100644
--- a/linbox/algorithms/lanczos.h
+++ b/linbox/algorithms/lanczos.h
@@ -57,7 +57,7 @@ namespace LinBox
* options for the solver
*/
LanczosSolver (const Field &F, const LanczosTraits &traits) :
- _traits (traits), _field (F), _randiter (F), _VD (F)
+ _traits (traits), _field (&F), _randiter (F), _VD (F)
{}
/** @brief Constructor with a random iterator
@@ -67,7 +67,7 @@ namespace LinBox
* @param r Random iterator to use for randomization
*/
LanczosSolver (const Field &F, const LanczosTraits &traits, typename Field::RandIter r) :
- _traits (traits), _field (F), _randiter (r), _VD (F)
+ _traits (traits), _field (&F), _randiter (r), _VD (F)
{}
/** Solve the linear system Ax = b.
@@ -90,6 +90,7 @@ namespace LinBox
template <class Blackbox>
Vector &solve (const Blackbox &A, Vector &x, const Vector &b);
+ inline const Field & field() const { return *_field; }
private:
// Run the Lanczos iteration and return the result. Return false
@@ -98,7 +99,7 @@ namespace LinBox
bool iterate (const Blackbox &A, Vector &x, const Vector &b);
const LanczosTraits &_traits;
- const Field &_field;
+ const Field *_field;
typename Field::RandIter _randiter;
VectorDomain<Field> _VD;
diff --git a/linbox/algorithms/lanczos.inl b/linbox/algorithms/lanczos.inl
index e4509b5..97dccd8 100644
--- a/linbox/algorithms/lanczos.inl
+++ b/linbox/algorithms/lanczos.inl
@@ -86,8 +86,8 @@ namespace LinBox
VectorWrapper::ensureDim (_w[1], A.coldim ());
VectorWrapper::ensureDim (_Aw, A.coldim ());
- NonzeroRandIter<Field> real_ri (_field, _randiter);
- RandomDenseStream<Field, LVector, NonzeroRandIter<Field> > stream (_field, real_ri, A.coldim ());
+ Givaro::GeneralRingNonZeroRandIter<Field> real_ri (_randiter);
+ RandomDenseStream<Field, LVector, Givaro::GeneralRingNonZeroRandIter<Field> > stream (field(), real_ri, A.coldim ());
for (unsigned int i = 0; !success && i < _traits.maxTries (); ++i) {
std::ostream &report = commentator().report (Commentator::LEVEL_UNIMPORTANT, INTERNAL_DESCRIPTION);
@@ -117,7 +117,7 @@ namespace LinBox
VectorWrapper::ensureDim (y, A.coldim ());
stream >> d1;
- Diagonal<Field, typename VectorTraits<LVector>::VectorCategory> D (_field, d1);
+ Diagonal<Field, typename VectorTraits<LVector>::VectorCategory> D (field(), d1);
Compose<Blackbox, Diagonal<Field, typename VectorTraits<LVector>::VectorCategory> > B (&A, &D);
report << "Random D: ";
@@ -136,7 +136,7 @@ namespace LinBox
VectorWrapper::ensureDim (bp, A.coldim ());
stream >> d1;
- Diagonal<Field, typename VectorTraits<LVector>::VectorCategory> D (_field, d1);
+ Diagonal<Field, typename VectorTraits<LVector>::VectorCategory> D (field(), d1);
Transpose<Blackbox> AT (&A);
Compose<Diagonal<Field, typename VectorTraits<LVector>::VectorCategory>, Blackbox> B1 (&D, &A);
Compose<Transpose<Blackbox>, Compose<Diagonal<Field, typename VectorTraits<LVector>::VectorCategory>, Blackbox> > B (&AT, &B1);
@@ -162,8 +162,8 @@ namespace LinBox
VectorWrapper::ensureDim (y, A.coldim ());
stream >> d1 >> d2;
- Diagonal<Field, typename VectorTraits<LVector>::VectorCategory> D1 (_field, d1);
- Diagonal<Field, typename VectorTraits<LVector>::VectorCategory> D2 (_field, d2);
+ Diagonal<Field, typename VectorTraits<LVector>::VectorCategory> D1 (field(), d1);
+ Diagonal<Field, typename VectorTraits<LVector>::VectorCategory> D2 (field(), d2);
Transpose<Blackbox> AT (&A);
Compose<Blackbox,
@@ -278,7 +278,7 @@ namespace LinBox
_VD.subin (_w[0], _w[0]);
// Get a random vector _w[1]
- RandomDenseStream<Field, LVector> stream (_field, _randiter, A.coldim ());
+ RandomDenseStream<Field, LVector> stream (field(), _randiter, A.coldim ());
stream >> _w[1];
std::ostream &report = commentator().report (Commentator::LEVEL_UNIMPORTANT, INTERNAL_DESCRIPTION);
@@ -288,28 +288,28 @@ namespace LinBox
A.apply (_Aw, _w[j]); // Aw_j
_VD.dot (delta[j], _w[j], _Aw); // delta_j <- <w_j, Aw_j>
- if (_field.isZero (delta[j])) {
+ if (field().isZero (delta[j])) {
commentator().stop ("FAILED", "<w_1, Aw_1> = 0", "LanczosSolver::iterate");
return false;
}
_VD.dot (alpha, _Aw, _Aw); // alpha <- -<Aw_j, Aw_j> / delta_j
- _field.divin (alpha, delta[j]);
- _field.negin (alpha);
+ field().divin (alpha, delta[j]);
+ field().negin (alpha);
- _field.subin (beta, beta); // beta <- 0
+ field().subin (beta, beta); // beta <- 0
_VD.dot (wb, _w[j], b); // x <- <w_j, b> / delta_j w_j
- _field.divin (wb, delta[j]);
+ field().divin (wb, delta[j]);
_VD.mul (x, _w[j], wb);
- while (!_field.isZero (delta[j])) {
+ while (!field().isZero (delta[j])) {
commentator().progress ();
report << "Total matrix-vector products so far: " << prods << std::endl;
- // traceReport (report, _field, "alpha", iter, alpha);
- // traceReport (report, _field, "beta", iter, alpha);
+ // traceReport (report, field(), "alpha", iter, alpha);
+ // traceReport (report, field(), "beta", iter, alpha);
traceReport (report, _VD, "w", iter - 1, _w[1 - j]);
traceReport (report, _VD, "w", iter, _w[j]);
@@ -326,19 +326,19 @@ namespace LinBox
_VD.dot (delta[j], _w[j], _Aw); // delta_j <- <w_j, Aw_j>
- // traceReport (report, _field, "delta", iter - 1, delta[1 - j]);
- // traceReport (report, _field, "delta", iter, delta[j]);
+ // traceReport (report, field(), "delta", iter - 1, delta[1 - j]);
+ // traceReport (report, field(), "delta", iter, delta[j]);
- if (!_field.isZero (delta[j])) {
+ if (!field().isZero (delta[j])) {
_VD.dot (alpha, _Aw, _Aw); // alpha <- -<Aw_j, Aw_j> / delta_j
- _field.divin (alpha, delta[j]);
- _field.negin (alpha);
+ field().divin (alpha, delta[j]);
+ field().negin (alpha);
- _field.div (beta, delta[j], delta[1 - j]); // beta <- -delta_j / delta_j-1
- _field.negin (beta);
+ field().div (beta, delta[j], delta[1 - j]); // beta <- -delta_j / delta_j-1
+ field().negin (beta);
_VD.dot (wb, _w[j], b); // x <- x + <w_j, b> / delta_j w_j
- _field.divin (wb, delta[j]);
+ field().divin (wb, delta[j]);
_VD.axpyin (x, wb, _w[j]);
}
diff --git a/linbox/algorithms/last-invariant-factor.h b/linbox/algorithms/last-invariant-factor.h
index 3b0916c..1083304 100644
--- a/linbox/algorithms/last-invariant-factor.h
+++ b/linbox/algorithms/last-invariant-factor.h
@@ -28,6 +28,7 @@
#include "linbox/util/debug.h"
#include "linbox/algorithms/default.h"
#include "linbox/algorithms/rational-solver.h"
+#include "linbox/vector/blas-vector.h"
#include <utility>
namespace LinBox
@@ -50,7 +51,9 @@ namespace LinBox
protected:
+ typedef BlasVector<Ring> DVect;
Ring r;
+ mutable typename Ring::RandIter _gen;
Solver solver;
int threshold;
@@ -62,7 +65,7 @@ namespace LinBox
LastInvariantFactor(const Solver& _solver = Solver(),
const Ring& _r =Ring(),
int _threshold =DEFAULTLIFTHRESHOLD) :
- r(_r),solver(_solver), threshold(_threshold)
+ r(_r), _gen(r),solver(_solver), threshold(_threshold)
{
if ( _threshold <= 1) threshold = DEFAULTLIFTHRESHOLD;
@@ -99,11 +102,12 @@ namespace LinBox
const Vector& PrimeL) const
{
- r.init(lif, 1);
+ r.assign(lif, r.one);
int count = 0;
SolverReturnStatus tmp;
// Storage of rational solution
- std::vector<Integer> r_num (A. coldim()); Integer r_den;
+ DVect r_num (r,A. coldim());
+ Integer r_den;
//std::vector<std::pair<Integer, Integer> > result (A.coldim());
//typename std::vector<std::pair<Integer, Integer> >::iterator result_p;
// vector b, RHS, 32-bit int is good enough
@@ -111,20 +115,22 @@ namespace LinBox
typename std::vector<int>::iterator b_p;
typename Vector::const_iterator Prime_p;
- Integer pri, quo, rem;
+ Integer pri, quo, rem, itmp;
for (; count < threshold; ++ count) {
// assign b to be a random vector
for (b_p = b.begin(); b_p != b.end(); ++ b_p) {
- * b_p = rand() % 268435456 - 134217728; // may need to change to use ring's random gen.
- // dpritcha, 2004-07-26
+// * b_p = rand() % 268435456 - 134217728; // may need to change to use ring's random gen.
+// // dpritcha, 2004-07-26
+ _gen( itmp );
+ * b_p = (int)itmp;
}
// try to solve Ax = b over Ring
tmp = solver.solveNonsingular(r_num, r_den, A, b);
// If no solution found
if (tmp != SS_OK) {
- r.init (lif, 0);
+ r.assign (lif, r.zero);
break;
}
@@ -135,7 +141,7 @@ namespace LinBox
for ( Prime_p = PrimeL.begin();
Prime_p != PrimeL.end();
++ Prime_p) {
- r.init (pri, (unsigned long) *Prime_p);
+ r.init (pri, *Prime_p);
do {
r.quoRem(quo,rem,lif,pri);
if (r.isZero(rem)) r.assign(lif,quo);
@@ -157,12 +163,13 @@ namespace LinBox
const Vector& PrimeL) const
{
- r. init(lif, 1);
- r. init (Bonus, 1);
+ r. assign(lif, r.one);
+ r. assign(Bonus, r.one);
int count = 0;
SolverReturnStatus tmp1, tmp2;
// Storage of rational solution
- std::vector<Integer> r1_num (A. coldim()), r2_num (A. coldim()); Integer r1_den, r2_den;
+ DVect r1_num (r,A. coldim()), r2_num (r,A. coldim());
+ Integer r1_den, r2_den;
//std::vector<std::pair<Integer, Integer> > result (A.coldim());
//typename std::vector<std::pair<Integer, Integer> >::iterator result_p;
// vector b, RHS, 32-bit int is good enough
@@ -174,17 +181,19 @@ namespace LinBox
for (; count < (threshold + 1) / 2; ++ count) {
// assign b to be a random vector
for (b_p = b1. begin(); b_p != b1. end(); ++ b_p) {
- * b_p = rand();
+// * b_p = rand();
+ *b_p = _gen.random();//(* b_p);
}
for (b_p = b2. begin(); b_p != b2. end(); ++ b_p) {
- * b_p = rand();
+// * b_p = rand();
+ *b_p = _gen.random();//(* b_p);
}
// try to solve Ax = b1, b2 over Ring
tmp1 = solver. solveNonsingular(r1_num, r1_den, A, b1);
tmp2 = solver. solveNonsingular(r2_num, r2_den, A, b2);
// If no solution found
if ((tmp1 != SS_OK) || (tmp2 != SS_OK)){
- r.init (lif, 0);
+ r.assign (lif, r.zero);
break;
}
@@ -193,18 +202,20 @@ namespace LinBox
// compute the Bonus
Integer g, d, a11, a12, a21, a22, l, c_bonus, c_l;
- typename std::vector<Integer>::iterator num1_p, num2_p;
- std::vector<Integer> r1 (A. rowdim());
- std::vector<Integer> r2 (A. rowdim());
- typename std::vector<Integer>::iterator r1_p, r2_p;
- r. init (l, 0);
+ typename DVect::iterator num1_p, num2_p;
+ DVect r1 (r,A. rowdim());
+ DVect r2 (r,A. rowdim());
+ typename DVect::iterator r1_p, r2_p;
+ r. assign (l, r.zero);
int i;
for (i = 0; i < 20; ++ i) {
for (r1_p = r1. begin(), r2_p = r2. begin(); r1_p != r1. end(); ++ r1_p, ++ r2_p) {
- r. init (*r1_p, rand());
- r. init (*r2_p, rand());
+// r. init (*r1_p, rand());
+// r. init (*r2_p, rand());
+ r. init (*r1_p); _gen(*r1_p);
+ r. init (*r2_p); _gen(*r2_p);
}
- r. init (a11, 0); r. init (a12, 0); r. init (a21, 0); r. init (a22, 0);
+ r. assign(a11, r.zero); r. assign (a12, r.zero); r. assign (a21, r.zero); r. assign (a22, r.zero);
for (r1_p = r1. begin(), num1_p = r1_num. begin(); r1_p != r1. end(); ++ r1_p, ++ num1_p)
r. axpyin (a11, *r1_p, *num1_p);
for (r1_p = r1. begin(), num2_p = r2_num. begin(); r1_p != r1. end(); ++ r1_p, ++ num2_p)
@@ -263,16 +274,18 @@ namespace LinBox
if (r_num.size()!=A. coldim()) return lif=0;
Integer r_den;
- std::vector<Integer> b(A.rowdim());
- typename std::vector<Integer>::iterator b_p;
+ DVect b(r,A.rowdim());
+ typename DVect::iterator b_p;
//typename Vector::const_iterator Prime_p;
Integer pri, quo, rem;
// assign b to be a random vector
for (b_p = b.begin(); b_p != b.end(); ++ b_p) {
- * b_p = rand() % 268435456 - 134217728; // may need to change to use ring's random gen.
- // dpritcha, 2004-07-26
+// * b_p = rand() % 268435456 - 134217728; // may need to change to use ring's random gen.
+// // dpritcha, 2004-07-26
+ _gen( * b_p );
+
}
//report <<"try to solve Ax = b over Ring";
// try to solve Ax = b over Ring
@@ -280,7 +293,7 @@ namespace LinBox
tmp = solver.solveNonsingular(r_num, r_den, A, b,oldMatrix);
// If no solution found
if (tmp != SS_OK) {
- //r.init (lif, 0);
+ //r.assign (lif, r.zero);
//break;
return lif=0;
}
@@ -291,7 +304,7 @@ namespace LinBox
Integer den,t;
r. lcm(den,r_den,lif);
r. div(t, den, r_den);
- typename std::vector<Integer>::iterator num_p = r_num.begin();
+ typename DVect::iterator num_p = r_num.begin();
for (; num_p != r_num. end(); ++num_p) {
r. mulin(*num_p, t);
}
@@ -305,18 +318,20 @@ namespace LinBox
if (Bonus==0) Bonus=1;
if (r1_num.size() != r2_num.size()) return Bonus=0;
Integer g, d, a11, a12, a21, a22, c_bonus, l, c_l;
- typename std::vector<Integer>::iterator num1_p, num2_p;
- std::vector<Integer> r1 (r1_num. size());
- std::vector<Integer> r2 (r2_num. size());
- typename std::vector<Integer>::iterator r1_p, r2_p;
- r. init (l, 0);
+ typename DVect::iterator num1_p, num2_p;
+ DVect r1 (r,r1_num. size());
+ DVect r2 (r,r2_num. size());
+ typename DVect::iterator r1_p, r2_p;
+ r. assign (l, r.zero);
int i;
for (i = 0; i < 20; ++ i) {
for (r1_p = r1. begin(), r2_p = r2. begin(); r1_p != r1. end(); ++ r1_p, ++ r2_p) {
- r. init (*r1_p, rand());
- r. init (*r2_p, rand());
+// r. init (*r1_p, rand());
+// r. init (*r2_p, rand());
+ r. init (*r1_p); _gen(*r1_p);
+ r. init (*r2_p); _gen(*r2_p);
}
- r. init (a11, 0); r. init (a12, 0); r. init (a21, 0); r. init (a22, 0);
+ r. assign (a11, r.zero); r. assign (a12, r.zero); r. assign (a21, r.zero); r. assign (a22, r.zero);
for (r1_p = r1. begin(), num1_p = r1_num. begin(); r1_p != r1. end(); ++ r1_p, ++ num1_p)
r. axpyin (a11, *r1_p, *num1_p);
for (r1_p = r1. begin(), num2_p = r2_num. begin(); r1_p != r1. end(); ++ r1_p, ++ num2_p)
@@ -349,7 +364,7 @@ namespace LinBox
Integer& lastInvariantFactor(Integer& lif, const IMatrix& A) const
{
- std::vector<Integer> empty_v;
+ DVect empty_v(r);
lastInvariantFactor (lif, A, empty_v);
return lif;
}
@@ -360,7 +375,7 @@ namespace LinBox
Integer& lastInvariantFactor_Bonus(Integer& lif, Integer& Bonus, const IMatrix& A) const
{
- std::vector<Integer> empty_v;
+ DVect empty_v(r);
lastInvariantFactor_Bonus (lif, Bonus, A, empty_v);
return lif;
}
@@ -372,11 +387,10 @@ namespace LinBox
#endif //__LINBOX_last_invariant_factor_H
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
// Local Variables:
// mode: C++
// tab-width: 8
// indent-tabs-mode: nil
// c-basic-offset: 8
// End:
-
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/algorithms/lattice.doxy b/linbox/algorithms/lattice.doxy
index 760d636..0aabe2c 100644
--- a/linbox/algorithms/lattice.doxy
+++ b/linbox/algorithms/lattice.doxy
@@ -1,4 +1,4 @@
-// Copyright (C) 2011 Brice Boyer, part of LinBox, GNU LGPL, see COPYING
+// Copyright (C) 2011 Brice Boyer (briceboyer), part of LinBox, GNU LGPL, see COPYING
/*
* Coypright (c) LinBox
* ========LICENCE========
diff --git a/linbox/algorithms/lattice.h b/linbox/algorithms/lattice.h
index 3585d0f..8bf0584 100644
--- a/linbox/algorithms/lattice.h
+++ b/linbox/algorithms/lattice.h
@@ -1,6 +1,6 @@
/* linbox/algorithms/lattice.h
* Copyright (C) 2011 The LinBox group
- * Written by Brice Boyer <bboyer at imag.fr>
+ * Written by Brice Boyer (briceboyer) <boyer.brice at gmail.com>
*
* ========LICENCE========
* This file is part of the library LinBox.
@@ -33,7 +33,7 @@
*
* @todo Create a BlasMatrix<NTL_ZZ> that is just like a mat_ZZ !
* @todo Create a BlasMatrix<FPLLL_ZZ> that is just like a IntMatrix !
- * @todo This will avoid copy back/forth a BlasMatrix<PID_integer>
+ * @todo This will avoid copy back/forth a BlasMatrix<Givaro::ZRing<Integer> >
*/
#if !defined(__LINBOX_HAVE_FPLLL) && !defined(__LINBOX_HAVE_NTL)
@@ -48,18 +48,7 @@
#ifdef __LINBOX_HAVE_FPLLL
-// this is a damn FPLLL bug !!!
-namespace FPLLL {
-#define round
-#define trunc
#include <fplll/fplll.h>
-#include <fplll/heuristic.h>
-#include <fplll/proved.h>
-#include <fplll/wrapper.h>
-#undef round
-#undef trunc
-}
-
#endif
diff --git a/linbox/algorithms/lattice.inl b/linbox/algorithms/lattice.inl
index 820a308..f29ed0b 100644
--- a/linbox/algorithms/lattice.inl
+++ b/linbox/algorithms/lattice.inl
@@ -1,6 +1,6 @@
/* linbox/algorithms/lattice.inl
* Copyright (C) 2011 The LinBox group
- * Written by Brice Boyer <bboyer at imag.fr>
+ * Written by Brice Boyer (briceboyer) <boyer.brice at gmail.com>
*
* ========LICENCE========
* This file is part of the library LinBox.
@@ -335,31 +335,32 @@ namespace LinBox
if (withU)
throw NotImplementedYet("not U");
// Convert H
- FPLLL::ZZ_mat<ZT> B(H.rowdim(),H.coldim()) ;
+ fplll::ZZ_mat<ZT> B(H.rowdim(),H.coldim()) ;
for (size_t i = 0 ; i < H.rowdim() ; ++i) {
for (size_t j = 0 ; j < H.coldim() ; ++j) {
- B.Set(i,j,FPLLL::Z_NR<ZT>(H.getEntry(i,j)) );
+ fplll::Z_NR<ZT> x = H.getEntry(i,j);
+ B.Set((int)i,(int)j,x);
}
}
// LLL()
switch (meth.getMeth()) {
case (latticeMethod::latticeFPLLL::P) :
{
- FPLLL::proved<ZT,double> lllMethod(&B,meth.getPrecision(),
+ fplll::proved<ZT,double> lllMethod(&B,meth.getPrecision(),
meth.getEta(),meth.getDelta());
lllMethod.LLL();
}
break;
case (latticeMethod::latticeFPLLL::W) :
{
- FPLLL::wrapper lllMethod(&B,meth.getPrecision(),
+ fplll::wrapper lllMethod(&B,meth.getPrecision(),
meth.getEta(),meth.getDelta());
lllMethod.LLL();
}
break;
case (latticeMethod::latticeFPLLL::H) :
{
- FPLLL::heuristic<ZT,double> lllMethod(&B,meth.getPrecision(),
+ fplll::heuristic<ZT,double> lllMethod(&B,meth.getPrecision(),
meth.getEta(),meth.getDelta(),
meth.getSiegel());
lllMethod.LLL();
diff --git a/linbox/algorithms/lifting-container.h b/linbox/algorithms/lifting-container.h
index e30449b..18d1ea8 100644
--- a/linbox/algorithms/lifting-container.h
+++ b/linbox/algorithms/lifting-container.h
@@ -45,7 +45,7 @@
#include "linbox/vector/vector-domain.h"
#include "linbox/blackbox/compose.h"
#include "linbox/blackbox/block-hankel-inverse.h"
-#include "linbox/algorithms/blas-domain.h"
+#include "linbox/matrix/matrix-domain.h"
#include "linbox/field/hom.h"
#include "linbox/matrix/transpose-matrix.h"
#include "linbox/blackbox/transpose.h"
@@ -72,15 +72,13 @@ namespace LinBox
//size_t m, n, col=0;
//n=A.coldim();
//m=A.rowdim();
- R.init(H_col_sqr, 1);
- Integer_t zero;
- R.init(zero,0UL);
+ R.assign(H_col_sqr, R.one);
typename ItMatrix::ConstRowIterator row= A.rowBegin();
- std::vector<Integer_t> tmp(A.coldim(), zero);
- for (; row != A.rowEnd(); row++){
+ std::vector<Integer_t> tmp(A.coldim(), R.zero);
+ for (; row != A.rowEnd(); ++row){
typename ItMatrix::ConstRow::const_iterator elm= row->begin();
- for (size_t i=0; elm != row->end(); elm++, ++i)
+ for (size_t i=0; elm != row->end(); ++elm, ++i)
R.axpyin(tmp[i], *elm, *elm);
}
@@ -92,10 +90,10 @@ namespace LinBox
typename ItMatrix::ConstColIterator colIter;
colIter = A.colBegin();
- for (; colIter != A.colEnd(); colIter++, col++) {
+ for (; colIter != A.colEnd(); ++colIter, ++col) {
typename ItMatrix::ConstCol::const_iterator elm;
- R.init(sqsum, 0);
- for (elm = colIter->begin(); elm != colIter->end(); elm++)
+ R.assign(sqsum, R.zero);
+ for (elm = colIter->begin(); elm != colIter->end(); ++elm)
R.axpyin(sqsum, *elm, *elm);
R.mulin(H_col_sqr, sqsum);
if (col == 0 || sqsum < short_col_sqr)
@@ -114,10 +112,10 @@ namespace LinBox
}
// in other solvers we generally use BlasMatrix which inherits from BlasSubmatrix
- template <class Ring>
- void BoundBlackbox(const Ring& R, typename Ring::Element& H_col_sqr,
- typename Ring::Element& short_col_sqr,
- const BlasSubmatrix<Ring>& A)
+ template <class Matrix>
+ void BoundBlackbox(const typename Matrix::Field& R, typename Matrix::Element& H_col_sqr,
+ typename Matrix::Element& short_col_sqr,
+ const BlasSubmatrix<Matrix>& A)
{
SpecialBound(R, H_col_sqr, short_col_sqr, A);
}
@@ -130,27 +128,25 @@ namespace LinBox
{
typedef typename Ring::Element Integer_t;
- Integer_t one,zero,sqsum;
+ Integer_t sqsum;
size_t m,n;
n=A.coldim();
m=A.rowdim();
- R.init(one,1);
- R.init(zero,0);
- R.init(H_col_sqr, 1);
+ R.assign(H_col_sqr, R.one);
typename std::vector<Integer_t>::const_iterator iter;
- std::vector<Integer_t> e(n,zero),tmp(m);
+ std::vector<Integer_t> e(n,R.zero),tmp(m);
- for (size_t i=0;i<n;i++){
- e[i]=one;
+ for (size_t i=0;i<n;++i){
+ e[i]=R.one;
A.apply(tmp,e);
- sqsum=zero;
+ sqsum=R.zero;
for (iter=tmp.begin();iter!=tmp.end();++iter){
sqsum += (*iter)*(*iter);
}
R.mulin(H_col_sqr, sqsum);
if (i==0 || sqsum < short_col_sqr)
short_col_sqr = sqsum;
- e[i]=zero;
+ e[i]=R.zero;
}
}
@@ -160,25 +156,23 @@ namespace LinBox
const Compose<Matrix1,Matrix2> & A)
{
typedef typename Ring::Element Integer_t;
- Integer_t one,zero,sqsum;
+ Integer_t sqsum;
size_t m,n;
n=A.coldim();
m=A.rowdim();
- R.init(one,1);
- R.init(zero,0);
- R.init(H_col_sqr, 1);
+ R.assign(H_col_sqr, R.one);
typename std::vector<Integer_t>::const_iterator iter;
- std::vector<Integer_t> e(n,zero),tmp(m);
- for (size_t i=0;i<n;i++){
- e[i]=one;
+ std::vector<Integer_t> e(n,R.zero),tmp(m);
+ for (size_t i=0;i<n;++i){
+ e[i]=R.one;
A.apply(tmp,e);
- sqsum=zero;
+ sqsum=R.zero;
for (iter=tmp.begin();iter!=tmp.end();++iter)
sqsum += (*iter)*(*iter);
R.mulin(H_col_sqr, sqsum);
if (i==0 || sqsum < short_col_sqr)
short_col_sqr = sqsum;
- e[i]=zero;
+ e[i]=R.zero;
}
}
@@ -188,25 +182,23 @@ namespace LinBox
const Transpose<Matrix> & A)
{
typedef typename Ring::Element Integer_t;
- Integer_t one,zero,sqsum;
+ Integer_t sqsum;
size_t m,n;
n=A.coldim();
m=A.rowdim();
- R.init(one,1);
- R.init(zero,0);
- R.init(H_col_sqr, 1);
+ R.assign(H_col_sqr, R.one);
typename std::vector<Integer_t>::const_iterator iter;
- std::vector<Integer_t> e(n,zero),tmp(m);
- for (size_t i=0;i<n;i++){
- e[i]=one;
+ std::vector<Integer_t> e(n,R.zero),tmp(m);
+ for (size_t i=0;i<n;++i){
+ e[i]=R.one;
A.applyTranspose(tmp,e);
- sqsum=zero;
+ sqsum=R.zero;
for (iter=tmp.begin();iter!=tmp.end();++iter)
sqsum += (*iter)*(*iter);
R.mulin(H_col_sqr, sqsum);
if (i==0 || sqsum < short_col_sqr)
short_col_sqr = sqsum;
- e[i]=zero;
+ e[i]=R.zero;
}
}
@@ -223,25 +215,23 @@ namespace LinBox
void BoundBlackbox (const Ring& R, typename Ring::Element& H_col_sqr,
typename Ring::Element& short_col_sqr, const IMatrix& A) {
typedef typename Ring::Element Integer_t;
- Integer_t one,zero,sqsum;
+ Integer_t sqsum;
size_t m,n;
n=A.coldim();
m=A.rowdim();
- R.init(one,1);
- R.init(zero,0);
- R.init(H_col_sqr, 1);
+ R.assign(H_col_sqr, R.one);
typename std::vector<Integer_t>::const_iterator iter;
- std::vector<Integer_t> e(n,zero),tmp(m);
- for (size_t i=0;i<n;i++){
- e[i]=one;
+ std::vector<Integer_t> e(n,R.zero),tmp(m);
+ for (size_t i=0;i<n;++i){
+ e[i]=R.one;
A.apply(tmp,e);
- sqsum=zero;
+ sqsum=R.zero;
for (iter=tmp.begin();iter!=tmp.end();++iter)
sqsum += (*iter)*(*iter);
R.mulin(H_col_sqr, sqsum);
if (i==0 || sqsum < short_col_sqr)
short_col_sqr = sqsum;
- e[i]=zero;
+ e[i]=R.zero;
}
}
#endif
@@ -257,19 +247,18 @@ namespace LinBox
void ApplyBound(const Ring& R, typename Ring::Element& bound_A, const ItMatrix& A)
{
typedef typename Ring::Element Integer_t;
- Integer_t possum, negsum, zero;
- R.init(bound_A, 0);
- R.init(zero, 0);
+ Integer_t possum, negsum;
+ R.assign(bound_A, R.zero);
typename ItMatrix::ConstRowIterator rowIter;
rowIter = A.rowBegin();
- for (; rowIter != A.rowEnd(); rowIter++) {
+ for (; rowIter != A.rowEnd(); ++rowIter) {
typename ItMatrix::ConstRow::const_iterator elm;
- R.init(possum, 0);
- R.init(negsum, 0);
- for (elm = rowIter->begin(); elm != rowIter->end(); elm++)
- if (*elm > zero)
+ R.assign(possum, R.zero);
+ R.assign(negsum, R.zero);
+ for (elm = rowIter->begin(); elm != rowIter->end(); ++elm)
+ if (*elm > R.zero)
R.addin(possum, *elm);
else
R.subin(negsum, *elm);
@@ -310,21 +299,21 @@ namespace LinBox
typedef _IMatrix IMatrix;
typedef _Ring Ring;
typedef typename _Ring::Element Integer_t;
- typedef std::vector<Integer_t> IVector;
+ typedef BlasVector<_Ring> IVector;
#ifdef RSTIMING
mutable Timer ttSetup, tRingApply, tRingOther, ttRingOther, ttRingApply;
#endif
protected:
- const IMatrix& _matA;
- Ring _intRing;
- Integer_t _p;
- IVector _b;
- VectorDomain<Ring> _VDR;
- size_t _length;
- Integer_t _numbound;
- Integer_t _denbound;
+ const IMatrix& _matA;
+ Ring _intRing;
+ Integer_t _p;
+ IVector _b;
+ VectorDomain<Ring> _VDR;
+ size_t _length;
+ Integer_t _numbound;
+ Integer_t _denbound;
MatrixApplyDomain<Ring,IMatrix> _MAD;
//BlasApply<Ring> _BA;
@@ -350,7 +339,7 @@ namespace LinBox
template <class Prime_Type, class Vector1>
LiftingContainerBase (const Ring& R, const IMatrix& A, const Vector1& b, const Prime_Type& p):
- _matA(A), _intRing(R), _VDR(R), _MAD(R,A)
+ _matA(A), _intRing(R), _b(R,b.size()),_VDR(R), _MAD(R,A)
{
#ifdef RSTIMING
@@ -372,18 +361,18 @@ namespace LinBox
// initialize res = b
- _b.resize(b.size());
- typename Vector1::const_iterator b_iter = b.begin();
- typename std::vector<Integer_t>::iterator res_iter = _b.begin() ;
+ // _b.resize(b.size());
+ typename Vector1::const_iterator b_iter = b.begin();
+ typename BlasVector<Ring>::iterator res_iter = _b.begin() ;
for (; b_iter != b.end(); ++res_iter, ++b_iter)
- this->_intRing.init(*res_iter, *b_iter);
+ this->_intRing.init(*res_iter, int64_t(*b_iter));
Integer_t had_sq, short_sq;
BoundBlackbox(this->_intRing, had_sq, short_sq, A);
- typename std::vector<Integer_t>::const_iterator iterb = _b.begin();
+ typename BlasVector<Ring>::const_iterator iterb = _b.begin();
Integer_t normb_sq;
- this->_intRing.init(normb_sq, 0);
+ this->_intRing.assign(normb_sq, this->_intRing.zero);
for (;iterb!=_b.end();++iterb)
normb_sq += (*iterb)*(*iterb);
@@ -395,7 +384,7 @@ namespace LinBox
D = sqrt(had_sqi) + 1;
N = sqrt(had_sqi * normb_sqi / short_sqi) + 1;
L = N * D * 2;
- _length = logp(L,Prime) + 1; // round up instead of down
+ _length = (size_t)logp(L,Prime) + 1; // round up instead of down
#ifdef DEBUG_LC
std::cout<<" norms computed, p = "<<_p<<"\n";
std::cout<<" N = "<<N<<", D = "<<D<<", length = "<<_length<<"\n";
@@ -424,7 +413,7 @@ namespace LinBox
class const_iterator {
private:
- std::vector<Integer_t> _res;
+ BlasVector<Ring> _res;
const LiftingContainerBase &_lc;
size_t _position;
public:
@@ -458,7 +447,7 @@ namespace LinBox
/* prepare for updating residu */
// compute v2 = _matA * digit
- IVector v2 (_lc._matA.coldim());
+ IVector v2 (_lc.ring(),_lc._matA.coldim());
_lc._MAD.applyV(v2,digit, _res);
#ifdef DEBUG_LC
@@ -477,7 +466,7 @@ namespace LinBox
// update _res -= v2
_lc._VDR.subin (_res, v2);
- typename std::vector<Integer_t>::iterator p0;
+ typename BlasVector<Ring>::iterator p0;
// update _res = _res / p
int index=0;
for ( p0 = _res.begin(); p0 != _res.end(); ++ p0, ++index){
@@ -492,7 +481,7 @@ namespace LinBox
}
// increase position of the iterator
- _position++;
+ ++_position;
#ifdef RSTIMING
_lc.tRingOther.stop();
_lc.ttRingOther += _lc.tRingOther;
@@ -615,14 +604,14 @@ namespace LinBox
typedef _IMatrix IMatrix;
typedef _FMatrix FMatrix;
typedef typename Field::Element Element;
- typedef typename IMatrix::Element Integer_t;
- typedef std::vector<Integer_t> IVector;
- typedef std::vector<Element> FVector;
+ typedef typename IMatrix::Element Integer_t;
+ typedef BlasVector<Ring> IVector;
+ typedef BlasVector<Field> FVector;
protected:
const FMatrix& _Ap;
- Field _field;
+ const Field *_field;
const VectorDomain<Field> _VDF;
mutable FVector _res_p;
mutable FVector _digit_p;
@@ -640,14 +629,14 @@ namespace LinBox
const FMatrix& Ap,
const VectorIn& b,
const Prime_Type& p) :
- LiftingContainerBase<Ring,IMatrix> (R,A,b,p), _Ap(Ap), _field(F), _VDF(F),
- _res_p(b.size()), _digit_p(A.coldim()), _BA(F)
+ LiftingContainerBase<Ring,IMatrix> (R,A,b,p), _Ap(Ap), _field(&F), _VDF(F),
+ _res_p(F,b.size()), _digit_p(F,A.coldim()), _BA(F)
{
for (size_t i=0; i< _res_p.size(); ++i)
- _field.init(_res_p[i]);
+ field().init(_res_p[i]);
for (size_t i=0; i< _digit_p.size(); ++i)
- _field.init(_digit_p[i]);
+ field().init(_digit_p[i]);
//
#ifdef RSTIMING
@@ -656,7 +645,7 @@ namespace LinBox
#endif
#ifdef DEBUG_LC
std::cout<<"Primes: ";
- _field.write(std::cout);
+ field().write(std::cout);
std::cout<<"\n Matrix: \n";
A.write(std::cout);
std::cout<<"\n Matrix mod p: \n";
@@ -673,27 +662,31 @@ namespace LinBox
// return the field
const Field& field() const
{
- return _field;
+ return *_field;
}
protected:
virtual IVector& nextdigit(IVector& digit, const IVector& residu) const
{
+ linbox_check(digit.size()==residu.size());
#ifdef RSTIMING
tGetDigitConvert.start();
#endif
LinBox::integer tmp;
- Hom<Ring, Field> hom(this->_intRing, _field);
+ Hom<Ring, Field> hom(this->_intRing, field());
// res_p = residu mod p
- //VectorHom::map (_res_p, residu, _field, this->_intRing);
+ //VectorHom::map (_res_p, residu, field(), this->_intRing);
{
- typename FVector::iterator iter_p = _res_p.begin();
+ // std::cout << digit.size() << std::endl;
+ typename FVector::iterator iter_p = _res_p.begin();
typename IVector::const_iterator iter = residu.begin();
- for ( ;iter != residu. end(); ++iter, ++iter_p)
- //_field. init (*iter_p, this->_intRing.convert(tmp,*iter));
- hom.image(*iter_p, *iter);//std::cout<<*iter_p<<"= "<< *iter<<" mod "<<this->_p<<"\n";
+ for ( ;iter != residu. end(); ++iter, ++iter_p) {
+ //field(). init (*iter_p, this->_intRing.convert(tmp,*iter));
+ hom.image(*iter_p, *iter);
+ // std::cout<<*iter_p<<"= "<< *iter<<" mod "<<this->_p<<"\n";
+ }
}
#ifdef RSTIMING
tGetDigitConvert.stop();
@@ -710,13 +703,13 @@ namespace LinBox
tGetDigitConvert.start();
#endif
// digit = digit_p
- //VectorHom::map(digit, _digit_p, this->_intRing, _field);
+ //VectorHom::map(digit, _digit_p, this->_intRing, field());
{
typename FVector::const_iterator iter_p = _digit_p.begin();
typename IVector::iterator iter = digit.begin();
for ( ; iter_p!= _digit_p.end(); ++iter_p, ++iter)
- //this->_intRing.init(*iter, _field.convert(tmp,*iter_p));
+ //this->_intRing.init(*iter, field().convert(tmp,*iter_p));
hom.preimage(*iter, *iter_p);
}
@@ -749,7 +742,7 @@ namespace LinBox
const FMatrix &_Ap;
mutable FPolynomial _MinPoly;
- Field _field;
+ const Field *_field;
const VectorDomain<Field> _VDF;
mutable FVector _res_p;
mutable FVector _digit_p;
@@ -768,14 +761,14 @@ namespace LinBox
const FPolynomial& MinPoly,
const VectorIn& b,
const Prime_Type& p) :
- LiftingContainerBase<Ring,IMatrix> (R,A,b,p), _Ap(Ap), _MinPoly(MinPoly), _field(F), _VDF(F), _res_p(b.size()), _digit_p(A.coldim()), _rand(F)
+ LiftingContainerBase<Ring,IMatrix> (R,A,b,p), _Ap(Ap), _MinPoly(MinPoly), _field(&F), _VDF(F), _res_p(b.size()), _digit_p(A.coldim()), _rand(F)
{
// Normalize the minimal polynomial as f(x)=1- a1/a0 x - a2/a0 x^2 - ...
FPolyIterator iter=_MinPoly.begin();
while(++iter != _MinPoly.end ()){
- _field.divin (*iter, _MinPoly.front ());
- _field.negin (*iter);
+ field().divin (*iter, _MinPoly.front ());
+ field().negin (*iter);
}
#ifdef RSTIMING
ttGetDigit.clear();
@@ -788,7 +781,7 @@ namespace LinBox
// return the field
const Field& field() const
{
- return _field;
+ return *_field;
}
protected:
@@ -805,7 +798,7 @@ namespace LinBox
typename FVector::iterator iter_p = _res_p.begin();
typename IVector::const_iterator iter = residu.begin();
for ( ;iter != residu. end(); ++iter, ++iter_p)
- _field. init (*iter_p, this->_intRing.convert(tmp,*iter));
+ field(). init (*iter_p, this->_intRing.convert(tmp,*iter));
}
#ifdef RSTIMING
tGetDigitConvert.stop();
@@ -830,17 +823,17 @@ namespace LinBox
bool nosolution = false;
int nosolution_threshold=5;
int nst=0;
- size_t minpoly_degree;
// until the digit is incorrect update the minpoly and recompute the digit
while (!_VDF.areEqual(error,_res_p) && !nosolution ){
+ size_t minpoly_degree;
minpoly_degree=_MinPoly.size();
FPolynomial Poly;
unsigned long deg;
unsigned long size= (_Ap.rowdim() - _MinPoly.size())<<1 ;
- BlackboxContainer<Field, FMatrix > Sequence(&_Ap,_field,error,size);
+ BlackboxContainer<Field, FMatrix > Sequence(&_Ap,field(),error,size);
MasseyDomain<Field,BlackboxContainer<Field, FMatrix > > MD(&Sequence);
MD.minpoly(Poly,deg);
- if (_field.isZero(Poly.front())) {
+ if (field().isZero(Poly.front())) {
// here we should stop the execution but not yet implemented
std::cout<<" the prime was not good \n, result will be wrong";
break;
@@ -849,17 +842,15 @@ namespace LinBox
// denormalize the minimal polynomial
FPolyIterator iter=_MinPoly.begin();
while (++iter != _MinPoly.end()) {
- _field.mulin (*iter, _MinPoly.front());
- _field.negin (*iter);
+ field().mulin (*iter, _MinPoly.front());
+ field().negin (*iter);
}
// update the minimal polynomial
- Element zero;
- _field.init(zero,0);
- FPolynomial newMinPoly(_MinPoly.size()+Poly.size()-1,zero);
- for (size_t i=0; i < _MinPoly.size(); i++)
- for (size_t j=0 ; j < Poly.size(); j++)
- _field.axpyin(newMinPoly[i+j],_MinPoly[i],Poly[j]);
+ FPolynomial newMinPoly(_MinPoly.size()+Poly.size()-1,field().zero);
+ for (size_t i=0; i < _MinPoly.size(); ++i)
+ for (size_t j=0 ; j < Poly.size(); ++j)
+ field().axpyin(newMinPoly[i+j],_MinPoly[i],Poly[j]);
_MinPoly.clear();
Poly.clear();
_MinPoly=newMinPoly;
@@ -867,8 +858,8 @@ namespace LinBox
// normalize the new minimal polynomial
iter=_MinPoly.begin ();
while (++iter != _MinPoly.end ()) {
- _field.divin (*iter, _MinPoly.front ());
- _field.negin (*iter);
+ field().divin (*iter, _MinPoly.front ());
+ field().negin (*iter);
}
_VDF.mul (_digit_p, _res_p, _MinPoly.back ());
@@ -884,7 +875,7 @@ namespace LinBox
nst=0;std::cout<<"updating minpoly\n";
}
else {
- if (nst < nosolution_threshold) nst++;
+ if (nst < nosolution_threshold) ++nst;
else{
nosolution=true;
throw PreconditionFailed (__func__, __LINE__, "system is inconsistent or the choosen prime leads to inconsistent resolution");
@@ -901,7 +892,7 @@ namespace LinBox
typename FVector::const_iterator iter_p = _digit_p.begin();
typename IVector::iterator iter = digit.begin();
for ( ; iter_p!= _digit_p.end(); ++iter_p, ++iter)
- this->_intRing.init(*iter, _field.convert(tmp,*iter_p));
+ this->_intRing.init(*iter, field().convert(tmp,*iter_p));
}
#ifdef RSTIMING
@@ -937,7 +928,7 @@ namespace LinBox
protected:
const FMatrix &_Ap;
- Field _field;
+ const Field * _field;
const VectorDomain<Field> _VDF;
mutable FVector _res_p;
mutable FVector _digit_p;
@@ -966,7 +957,7 @@ namespace LinBox
const size_t m,
const size_t n) :
LiftingContainerBase<Ring,IMatrix> (R,A,b,p), _Ap(Ap),
- _field(F),
+ _field(&F),
_VDF(F),
_res_p(b.size()),
_digit_p(A.coldim()),
@@ -993,10 +984,10 @@ namespace LinBox
std::cout<<"U:\n";
- UU.write(std::cout, _field);
+ UU.write(std::cout, field());
std::cout<<"V:\n";
- V.write(std::cout, _field);
+ V.write(std::cout, field());
Block UAp(_m, _row);
@@ -1010,10 +1001,10 @@ namespace LinBox
_rand.random(UAp.refEntry(0,i));
- _Seq = new Sequence (&Ap, _field, UAp,V);
+ _Seq = new Sequence (&Ap, field(), UAp,V);
std::cout<<"Sequence:\n";
for (size_t i=0;i<_Seq->getRep().size();++i)
- _Seq->getRep()[i].write(std::cout,_field)<<"\n";
+ _Seq->getRep()[i].write(std::cout,field())<<"\n";
std::cout<<"\n";
@@ -1040,7 +1031,7 @@ namespace LinBox
}
// return the field
- const Field& field() const { return _field; }
+ const Field& field() const { return *_field; }
protected:
@@ -1056,7 +1047,7 @@ namespace LinBox
typename FVector::iterator iter_p = _res_p.begin();
typename IVector::const_iterator iter = residu.begin();
for ( ;iter != residu. end(); ++iter, ++iter_p)
- _field. init (*iter_p, this->_intRing.convert(tmp,*iter));
+ field(). init (*iter_p, this->_intRing.convert(tmp,*iter));
}
#ifdef RSTIMING
tGetDigitConvert.stop();
@@ -1066,7 +1057,7 @@ namespace LinBox
std::cout<<"residue:\n";
for (size_t i=0;i<_res_p.size();++i)
- _field.write(std::cout,_res_p[i])<<",";
+ field().write(std::cout,_res_p[i])<<",";
std::cout<<"\n";
@@ -1076,7 +1067,7 @@ namespace LinBox
_Seq->recompute();
std::cout<<"Modified Sequence:\n";
for (size_t i=0;i<_Seq->getRep().size();++i)
- _Seq->getRep()[i].write(std::cout,_field)<<"\n";
+ _Seq->getRep()[i].write(std::cout,field())<<"\n";
std::cout<<"\n";
FBlockPolynomial minpoly;
@@ -1092,13 +1083,13 @@ namespace LinBox
#endif
std::cout<<"Block Minpoly:\n";
for (size_t i=0;i<minpoly.size();++i)
- minpoly[i].write(std::cout,_field)<<"\n";
+ minpoly[i].write(std::cout,field())<<"\n";
std::cout<<"\n";
size_t idx=0;
- if ( _field.isZero(minpoly[0].getEntry(0,0))) {
+ if ( field().isZero(minpoly[0].getEntry(0,0))) {
size_t i=1;
- while ( _field.isZero(minpoly[0].getEntry(i,0)))
+ while ( field().isZero(minpoly[0].getEntry(i,0)))
++i;
if (i == _m)
throw LinboxError(" block minpoly: matrix seems to be singular - abort");
@@ -1107,12 +1098,12 @@ namespace LinBox
}
size_t deg = degree[idx];
- BlasMatrix<Field> idx_poly(_field,deg+1,_m-1);
+ BlasMatrix<Field> idx_poly(field(),deg+1,_m-1);
for (size_t i=0;i<deg+1;++i)
for (size_t j=0;j<_m-1;++j)
idx_poly.setEntry(i,j,minpoly[i].getEntry(idx,j+1));
- BlasMatrix<Field> Combi(_field,deg+1,_row);
+ BlasMatrix<Field> Combi(field(),deg+1,_row);
_BMD.mul(Combi,idx_poly,UU);
@@ -1140,9 +1131,9 @@ namespace LinBox
_VDF.addin(accu,lhs);
Element scaling;
- _field.init(scaling);
- _field.neg(scaling,minpoly[0].getEntry(idx,0));
- _field.invin(scaling);
+ field().init(scaling);
+ field().neg(scaling,minpoly[0].getEntry(idx,0));
+ field().invin(scaling);
_VDF.mul(_digit_p,accu,scaling);
@@ -1165,7 +1156,7 @@ namespace LinBox
typename FVector::const_iterator iter_p = _digit_p.begin();
typename IVector::iterator iter = digit.begin();
for ( ; iter_p!= _digit_p.end(); ++iter_p, ++iter)
- this->_intRing.init(*iter, _field.convert(tmp,*iter_p));
+ this->_intRing.init(*iter, field().convert(tmp,*iter_p));
}
#ifdef RSTIMING
@@ -1197,9 +1188,9 @@ namespace LinBox
protected:
const FMatrix& _Ap;
- const Diagonal<Field> &_diagMat;
+ const Diagonal<Field> &_diagMat;
const BlockHankelInverse<Field> &_Hinv;
- Field _field;
+ const Field *_field;
mutable FVector _res_p;
mutable FVector _digit_p;
std::vector<std::vector<Element> > _u;
@@ -1208,7 +1199,6 @@ namespace LinBox
size_t _numblock;
VectorDomain<Field> _VD;
BlasMatrixDomain<Field> _BMD;
- Element _zero;
public:
#ifdef RSTIMING
@@ -1228,16 +1218,16 @@ namespace LinBox
const Block& V,
const VectorIn& b,
const Prime_Type& p) :
- LiftingContainerBase<Ring,IMatrix> (R,A,b,p), _Ap(Ap), _Hinv(Hinv), _field(F),
+ LiftingContainerBase<Ring,IMatrix> (R,A,b,p), _Ap(Ap), _Hinv(Hinv), _field(&F),
_res_p(b.size()), _digit_p(A.coldim()), _block(U.rowdim()), _numblock(A.coldim()/_block) , _VD(F), _BMD(F), _diagMat(D)
{
tApplyU.clear();
tApplyH.clear();
tApplyV.clear();
for (size_t i=0; i< _res_p.size(); ++i)
- _field.init(_res_p[i]);
+ field().init(_res_p[i]);
for (size_t i=0; i< _digit_p.size(); ++i)
- _field.init(_digit_p[i]);
+ field().init(_digit_p[i]);
// size_t block= U.rowdim();
@@ -1246,10 +1236,9 @@ namespace LinBox
for (size_t i=0;i<_block;++i)
for (size_t j=0;j<_numblock;++j){
- _field.assign(_u[i][j], U.getEntry(0, i*_numblock+j));
- _field.assign(_v[i][j], V.getEntry(i*_numblock+j, i));
+ field().assign(_u[i][j], U.getEntry(0, i*_numblock+j));
+ field().assign(_v[i][j], V.getEntry(i*_numblock+j, i));
}
- _field.init(_zero,0);
//Ap.write(std::cout,F);
#ifdef RSTIMING
@@ -1258,7 +1247,7 @@ namespace LinBox
#endif
#ifdef DEBUG_LC
std::cout<<"Primes: ";
- _field.write(std::cout);
+ field().write(std::cout);
#endif
}
@@ -1276,7 +1265,7 @@ namespace LinBox
// return the field
const Field& field() const
{
- return _field;
+ return *_field;
}
protected:
@@ -1288,14 +1277,14 @@ namespace LinBox
#endif
//LinBox::integer tmp;
- Hom<Ring, Field> hom(this->_intRing, _field);
+ Hom<Ring, Field> hom(this->_intRing, field());
// res_p = residu mod p
- //VectorHom::map (_res_p, residu, _field, this->_intRing);
+ //VectorHom::map (_res_p, residu, field(), this->_intRing);
{
typename FVector::iterator iter_p = _res_p.begin();
typename IVector::const_iterator iter = residu.begin();
for ( ;iter != residu. end(); ++iter, ++iter_p)
- //_field. init (*iter_p, this->_intRing.convert(tmp,*iter));
+ //field(). init (*iter_p, this->_intRing.convert(tmp,*iter));
hom.image(*iter_p, *iter);
}
#ifdef RSTIMING
@@ -1317,8 +1306,8 @@ namespace LinBox
#if 0
std::cout<<"b:=<";
for (size_t i=0;i<_res_p.size()-1;++i)
- _field.write(std::cout,_res_p[i])<<",";
- _field.write(std::cout,_res_p[_res_p.size()-1])<<">;\n";
+ field().write(std::cout,_res_p[i])<<",";
+ field().write(std::cout,_res_p[_res_p.size()-1])<<">;\n";
#endif
size_t n = _Ap.coldim();
@@ -1326,9 +1315,9 @@ namespace LinBox
FVector z0(n), b0(n), b1(n);
_diagMat.apply(b0, _res_p);
_res_p=b0;
- BlasMatrix<Field> Apib(_field,n, _numblock);
+ BlasMatrix<Field> Apib(field(),n, _numblock);
for (size_t i=0;i<n;++i){
- _field.assign(Apib.refEntry(i,0), _res_p[i]);
+ field().assign(Apib.refEntry(i,0), _res_p[i]);
}
int swi=1;
@@ -1336,22 +1325,22 @@ namespace LinBox
if (swi){
_Ap.apply(b1, b0);
for (size_t i=0;i<n;++i)
- _field.assign(Apib.refEntry(i,j), b1[i]);
+ field().assign(Apib.refEntry(i,j), b1[i]);
swi=0;
}
else{
_Ap.apply(b0, b1);
for (size_t i=0;i<n;++i)
- _field.assign(Apib.refEntry(i,j), b0[i]);
+ field().assign(Apib.refEntry(i,j), b0[i]);
swi=1;
}
FVector tmp(_numblock);
for (size_t i=0; i<_block; ++i){
- BlasMatrix<Field> T(_field,Apib, i*_numblock, 0, _numblock, _numblock);
+ BlasMatrix<Field> T(field(),Apib, i*_numblock, 0, _numblock, _numblock);
_BMD.mul(tmp, _u[i], T);
for (size_t j=0;j<_numblock;++j){
- this->_field.assign(z0[j*_block+i], tmp[j]);
+ this->field().assign(z0[j*_block+i], tmp[j]);
}
}
#ifdef RSTIMING
@@ -1374,14 +1363,14 @@ namespace LinBox
std::cout<<" Hinv U b mod p done\n";
std::cout<<"\n y:=<";
for (size_t i=0;i<_digit_p.size()-1;++i)
- _field.write(std::cout,z1[i])<<",";
- _field.write(std::cout,z1[_digit_p.size()-1])<<">;\n";
+ field().write(std::cout,z1[i])<<",";
+ field().write(std::cout,z1[_digit_p.size()-1])<<">;\n";
#endif
// compute digit_p = [V^T AV^T ... A^k]^T.z1
FVector b_bar(n), b_hat(_numblock);
for (size_t i=0;i<n;++i)
- _field.assign(_digit_p[i], _zero);
+ field().assign(_digit_p[i], field().zero);
for (int i= _numblock-1;i>=0; --i){
_Ap.apply(b1, _digit_p);
@@ -1389,7 +1378,7 @@ namespace LinBox
for (size_t j=0;j<_block;++j){
_VD.mul(b_hat, _v[j], z1[i*_block+j]);
for (size_t k=0;k<_numblock;++k)
- _field.assign(b_bar[j*_numblock+k], b_hat[k]);
+ field().assign(b_bar[j*_numblock+k], b_hat[k]);
}
_VD.addin(_digit_p, b_bar);
}
@@ -1402,8 +1391,8 @@ namespace LinBox
std::cout<<" V Hinv U b mod p done\n";
std::cout<<"\n x:=<";
for (size_t i=0;i<_digit_p.size()-1;++i)
- _field.write(std::cout,_digit_p[i])<<",";
- _field.write(std::cout,_digit_p[_digit_p.size()-1])<<">;\n";
+ field().write(std::cout,_digit_p[i])<<",";
+ field().write(std::cout,_digit_p[_digit_p.size()-1])<<">;\n";
#endif
#ifdef RSTIMING
@@ -1412,12 +1401,12 @@ namespace LinBox
tGetDigitConvert.start();
#endif
// digit = digit_p
- //VectorHom::map(digit, _digit_p, this->_intRing, _field);
+ //VectorHom::map(digit, _digit_p, this->_intRing, field());
{
typename FVector::const_iterator iter_p = _digit_p.begin();
typename IVector::iterator iter = digit.begin();
for ( ; iter_p!= _digit_p.end(); ++iter_p, ++iter)
- //this->_intRing.init(*iter, _field.convert(tmp,*iter_p));
+ //this->_intRing.init(*iter, field().convert(tmp,*iter_p));
hom.preimage(*iter, *iter_p);
}
@@ -1442,8 +1431,8 @@ namespace LinBox
typedef _FMatrix FMatrix;
typedef typename Field::Element Element;
typedef typename IMatrix::Element Integer_t;
- typedef std::vector<Integer_t> IVector;
- typedef std::vector<Element> FVector;
+ typedef BlasVector<Ring> IVector;
+ typedef BlasVector<Field> FVector;
protected:
@@ -1452,7 +1441,7 @@ namespace LinBox
const Permutation<_Field>& QQ;
const Permutation<_Field>& PP;
unsigned long _rank;
- Field _field;
+ const Field *_field;
mutable FVector _res_p;
mutable FVector _digit_p;
GaussDomain<Field> _GD;
@@ -1472,20 +1461,20 @@ namespace LinBox
unsigned long rank,
const VectorIn& b,
const Prime_Type& p) :
- LiftingContainerBase<Ring,IMatrix> (R,A,b,p), LL(L),QQ(Q),UU(U), PP(P), _rank(rank),
- _field(F), _res_p(b.size()), _digit_p(A.coldim()), _GD(F)
+ LiftingContainerBase<Ring,IMatrix> (R,A,b,p), LL(L),UU(U),QQ(Q), PP(P), _rank(rank),
+ _field(&F), _res_p(F,b.size()), _digit_p(F,A.coldim()), _GD(F)
{
for (size_t i=0; i< _res_p.size(); ++i)
- _field.init(_res_p[i]);
+ field().init(_res_p[i]);
for (size_t i=0; i< _digit_p.size(); ++i)
- _field.init(_digit_p[i]);
+ field().init(_digit_p[i]);
}
virtual ~SparseLULiftingContainer() {}
// return the field
- const Field& field() const { return _field; }
+ const Field& field() const { return *_field; }
protected:
@@ -1493,7 +1482,7 @@ namespace LinBox
{
// compute residu mod p
- Hom<Ring, Field> hom(this->_intRing, _field);
+ Hom<Ring, Field> hom(this->_intRing, field());
{
typename FVector::iterator iter_p = _res_p.begin();
typename IVector::const_iterator iter = residu.begin();
@@ -1501,8 +1490,9 @@ namespace LinBox
hom.image(*iter_p, *iter);
}
+ FVector w(field(), UU.coldim());
// solve the system mod p using L.Q.U.P Factorization
- _GD.solve(_digit_p, _rank, QQ,LL,UU,PP, _res_p);
+ _GD.solve(_digit_p, w, _rank, QQ,LL,UU,PP, _res_p);
// promote new solution mod p to integers
@@ -1510,7 +1500,7 @@ namespace LinBox
typename FVector::const_iterator iter_p = _digit_p.begin();
typename IVector::iterator iter = digit.begin();
for ( ; iter_p!= _digit_p.end(); ++iter_p, ++iter)
- //this->_intRing.init(*iter, _field.convert(tmp,*iter_p));
+ //this->_intRing.init(*iter, field().convert(tmp,*iter_p));
hom.preimage(*iter, *iter_p);
}
@@ -1525,7 +1515,6 @@ namespace LinBox
#endif //__LINBOX_lifting_container_H
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
// Local Variables:
// mode: C++
// tab-width: 8
diff --git a/linbox/algorithms/linbox-tags.h b/linbox/algorithms/linbox-tags.h
deleted file mode 100644
index e5133cb..0000000
--- a/linbox/algorithms/linbox-tags.h
+++ /dev/null
@@ -1,95 +0,0 @@
-/* Copyright (C) 2010,2011,2012 LinBox
- * Written by <brice.boyer at imag.fr>
- *
- *
- *
- * ========LICENCE========
- * This file is part of the library LinBox.
- *
- * LinBox is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- * ========LICENCE========
- */
-
-/*! @file algorithms/linbox-tags.h
- * @ingroup algorithms
- * @brief Provides tags for various algorithms/solutions, à la \c FFLAS.
- * This is a subset of Fflas* enums.
- */
-
-#ifndef __LINBOX_linbox_tags_H
-#define __LINBOX_linbox_tags_H
-
-#include <fflas-ffpack/fflas/fflas.h>
-
-namespace LinBox
-{
-
- /*! Structure for tags.
- * Tags are simple enums that set a choice in a routine.
- * For instance, if the user wants a <i>right</i> nullspace,
- * she will use a \c LinBoxTag::Right parameter.
- *
- * There it total compatiblity with \c FFLAS tags (cross link)
- * For instance, in LinBox, it is similar to use \c LinBoxTag::Upper and
- * <code>(LinBoxTag::Shape) FFLAS::FflasUpper</code>.
- *
- * @note Tags are not Methods.
- */
- struct LinBoxTag {
- //! Left/Right Tag
- enum Side {
- Left = FFLAS::FflasLeft, //!< Left
- Right = FFLAS::FflasRight //!< Right
- };
-
- //! (No)Transpose Tag
- enum Transpose {
- NoTrans = FFLAS::FflasNoTrans,
- Trans = FFLAS::FflasTrans
- };
-
- //! (Upp/Low)er Tag
- enum Shape {
- Upper = FFLAS::FflasUpper,
- Lower = FFLAS::FflasLower
- } ;
-
- //! (Non)Unit Diagonal Tag
- enum Diag {
- NonUnit = FFLAS::FflasNonUnit,
- Unit = FFLAS::FflasUnit
- } ;
-
- //! Dense format (table) output Tag
- enum Format {
- FormatPlain = 0,
- FormatMaple = 1,
- FormatHTML = 2,
- FormatLaTeX = 3
- } ;
- } ;
-
-}
-
-#endif // __LINBOX_linbox_tags_H
-
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
-// Local Variables:
-// mode: C++
-// tab-width: 8
-// indent-tabs-mode: nil
-// c-basic-offset: 8
-// End:
-
diff --git a/linbox/algorithms/massey-domain.h b/linbox/algorithms/massey-domain.h
index decfec7..99fce7a 100644
--- a/linbox/algorithms/massey-domain.h
+++ b/linbox/algorithms/massey-domain.h
@@ -12,20 +12,20 @@
*
* ------------------------------------
*
- *
+ *
* ========LICENCE========
* This file is part of the library LinBox.
- *
+ *
* LinBox is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
- *
+ *
* This library 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
* Lesser General Public License for more details.
- *
+ *
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
@@ -81,7 +81,7 @@ namespace LinBox
class MasseyDomain {
private:
Sequence *_container;
- Field _field;
+ const Field *_field;
VectorDomain<Field> _VD;
unsigned long EARLY_TERM_THRESHOLD;
@@ -98,32 +98,36 @@ namespace LinBox
MasseyDomain (unsigned long ett_default = DEFAULT_EARLY_TERM_THRESHOLD) :
_container (),
_field (),
- _VD (_field),
+ _VD (),
EARLY_TERM_THRESHOLD (ett_default)
{}
MasseyDomain (const MasseyDomain<Field, Sequence> &Mat, unsigned long ett_default = DEFAULT_EARLY_TERM_THRESHOLD) :
_container (Mat._container),
_field (Mat._field),
- _VD (Mat._field),
+ _VD (Mat.field()),
EARLY_TERM_THRESHOLD (ett_default)
{}
MasseyDomain (Sequence *D, unsigned long ett_default = DEFAULT_EARLY_TERM_THRESHOLD) :
_container (D),
- _field (D->getField ()),
- _VD (D->getField ()),
+ _field (&(D->field ())),
+ _VD (D->field ()),
EARLY_TERM_THRESHOLD (ett_default)
{}
MasseyDomain (Sequence *MD, const Field &F, unsigned long ett_default = DEFAULT_EARLY_TERM_THRESHOLD) :
_container (MD),
- _field (F),
+ _field (&F),
_VD (F),
EARLY_TERM_THRESHOLD (ett_default)
{}
- //-- Principal method
+ /*-- Principal method
+ * C is set to the minpoly when full_poly = true.
+ * full_poly = false saves 2 iterations. Then C is sometimes not the minpoly,
+ * but is a poly sufficient for rank deduction.
+ */
template<class Polynomial>
long operator () (Polynomial &C, bool full_poly = false)
{
@@ -131,7 +135,8 @@ namespace LinBox
}
//-- Domains access
- const Field &getField () const { return _field; }
+ const Field &field () const { return *_field; }
+ const Field &getField () const { return *_field; } // deprecated
Sequence *getSequence () const { return _container; }
#ifdef INCLUDE_TIMING
@@ -150,18 +155,18 @@ namespace LinBox
template <class V>
long v_degree (V& v)
{
- long i = v.size()-1;
+ long i = (long)v.size()-1;
if (i == _DEGINFTY_)
return _DEGINFTY_;
- else if (!_field.isZero (v[i]))
+ else if (!field().isZero (v[(size_t)i]))
return i;
// We must re-compute the degree :
for (long j = i - 1; j >= 0; j--) {
- if (!_field.isZero (v[j])) {
- v.resize (j + 1);
+ if (!field().isZero (v[(size_t)j])) {
+ v.resize ((size_t)j + 1);
return j;
}
}
@@ -173,17 +178,17 @@ namespace LinBox
template <class V>
long v_val(V& v)
{
- long i = v.size() - 1;
+ long i = (long)v.size() - 1;
if (i == _DEGINFTY_)
return _DEGINFTY_;
- else if (!_field.isZero (v[0]))
+ else if (!field().isZero (v[0]))
return 0;
// We must compute the valuation :
for (long j = 1; j <= i; j++)
- if (!_field.isZero ((v)[j])) return j ;
+ if (!field().isZero ((v)[(size_t)j])) return j ;
return _DEGINFTY_ ;
}
@@ -208,26 +213,31 @@ namespace LinBox
integer card;
- commentator().start ("Massey", "masseyd", END);
+ commentator().start ("Massey", "masseyd", (unsigned int)END);
// ====================================================
// Sequence and iterator initialization
//
typename Sequence::const_iterator _iter (_container->begin ());
- Polynomial S (END + 1);
+ Polynomial S (field(),(size_t)END + 1);
// -----------------------------------------------
// Preallocation. No further allocation.
//
- C.reserve (n + 1); C.resize (1); _field.assign (C[0], _field.one);
- Polynomial B (n + 1); B.resize (1); _field.assign (B[0], _field.one);
+ C.reserve ((size_t)n + 1);
+ C.resize (1);
+ field().assign (C[0], field().one);
+
+ Polynomial B (field(),(size_t)n + 1);
+ B.resize (1);
+ field().assign (B[0], field().one);
long L = 0;
Element b, d, Ds;
long x = 1, b_deg = 0, c_deg = 0, l_deg;
long COMMOD = (END > 40) ? (END / 20) : 2;
- _field.assign (b, _field.one);
+ field().assign (b, field().one);
for (long NN = 0; NN < END && x < (long) EARLY_TERM_THRESHOLD; ++NN, ++_iter) {
@@ -239,7 +249,7 @@ namespace LinBox
// Next coefficient in the sequence
// Discrepancy computation
//
- S[NN] = *_iter;
+ S[(size_t)NN] = *_iter;
//
#ifdef INCLUDE_TIMING
@@ -252,7 +262,7 @@ namespace LinBox
ReverseVector<Subvector<typename Polynomial::iterator> > Spp (Sp);
_VD.dot (d, Cp, Spp);
- _field.addin (d, S[NN]);
+ field().addin (d, S[(size_t)NN]);
#ifdef INCLUDE_TIMING
timer.stop ();
@@ -262,68 +272,62 @@ namespace LinBox
timer.start ();
#endif // INCLUDE_TIMING
- if (_field.isZero (d)) {
+ if (field().isZero (d)) {
++x;
- }
- else {
+ } else {
if (L > (NN >> 1)) {
// -----------------------------------------------
// C = C + (Polynome(X,x,-d/b) * B);
//
- _field.divin (_field.neg (Ds, d), b);
+ field().divin (field().neg (Ds, d), b);
long i = l_deg = (x + b_deg);
if (l_deg > c_deg) {
- C.resize (l_deg + 1);
+ C.resize ((size_t)l_deg + 1);
if (x > c_deg) {
for (; i >= x; --i)
- _field.mul (C[i], Ds, B[i-x]);
+ field().mul (C[(size_t)i], Ds, B[(size_t)(i-x)]);
for (; i > c_deg; --i)
- _field.assign (C[i], _field.zero);
- }
- else {
+ field().assign (C[(size_t)i], field().zero);
+ } else {
for (; i > c_deg; --i)
- _field.mul (C[i], Ds, B[i-x]);
+ field().mul (C[(size_t)i], Ds, B[(size_t)(i-x)]);
for (; i >= x; --i)
- _field.axpyin (C[i], Ds, B[i-x]);
+ field().axpyin (C[(size_t)i], Ds, B[(size_t)(i-x)]);
}
- }
- else {
+ } else {
for (; i >= x; --i)
- _field.axpyin (C[i], Ds, B[i-x]);
+ field().axpyin (C[(size_t)i], Ds, B[(size_t)(i-x)]);
}
// -----------------------------------------------
c_deg = v_degree(C);
++x;
- }
- else {
+ } else {
// -----------------------------------------------
// C = C + (Polynome(X,x,-d/b) * B); //
- _field.divin (_field.neg (Ds, d), b);
+ field().divin (field().neg (Ds, d), b);
long i = l_deg = x + b_deg;
B.resize (C.size ());
if (l_deg > c_deg) {
- C.resize (l_deg+1);
+ C.resize ((size_t)l_deg+1);
if (x > c_deg) {
for (; i >= x; --i)
- _field.mul (C[i], Ds, B[i-x]);
+ field().mul (C[(size_t)i], Ds, B[(size_t)(i-x)]);
for (; i > c_deg; --i)
- _field.assign (C[i], _field.zero);
- }
- else {
+ field().assign (C[(size_t)i], field().zero);
+ } else {
for (; i > c_deg; --i)
- _field.mul (C[i], Ds, B[i-x]);
+ field().mul (C[(size_t)i], Ds, B[(size_t)(i-x)]);
for (; i >= x; --i)
- _field.axpy (C[i], Ds, B[i-x], _field.assign(B[i],C[i]) );
+ field().axpy (C[(size_t)i], Ds, B[(size_t)(i-x)], field().assign(B[(size_t)i],C[(size_t)i]) );
}
- }
- else {
+ } else {
for (i = c_deg; i > l_deg; --i)
- _field.assign(B[i],C[i]);
+ field().assign(B[(size_t)i],C[(size_t)i]);
for (; i >= x; --i)
- _field.axpy (C[i], Ds, B[i-x], _field.assign(B[i],C[i]) );
+ field().axpy (C[(size_t)i], Ds, B[(size_t)(i-x)], field().assign(B[(size_t)i],C[(size_t)i]) );
}
- for (; i >= 0; --i) _field.assign(B[i],C[i]);
+ for (; i >= 0; --i) field().assign(B[(size_t)i],C[(size_t)i]);
// -----------------------------------------------
L = NN+1-L;
@@ -354,7 +358,7 @@ namespace LinBox
//
void pseudo_rank (unsigned long &rank)
{
- std::vector<Element> phi;
+ BlasVector<Field> phi(field());
massey (phi, 0);
rank = v_degree (phi) - v_val (phi);
}
@@ -363,7 +367,7 @@ namespace LinBox
{
commentator().start ("Valence", "LinBox::MasseyDomain::valence");
- std::vector<Element> phi;
+ BlasVector<Field> phi(field());
massey (phi, 1);
rank = v_degree (phi) - v_val (phi);
Valence = phi[v_degree (phi)];
@@ -374,18 +378,17 @@ namespace LinBox
template<class Polynomial>
unsigned long pseudo_minpoly (Polynomial &phi, unsigned long &rank, bool full_poly = true)
{
- unsigned long L = massey (phi, full_poly);
+ unsigned long L = (unsigned long)massey (phi, full_poly);
long dp = v_degree(phi);
- rank = dp - v_val (phi);
+ rank = (unsigned long) (dp - v_val (phi));
if (phi.size()) {
for(long i = dp >> 1;i > 0; --i) {
- phi[0] = phi[i];
- phi[i] = phi[dp-i];
- phi[dp-i] = phi[0];
+ phi[0] = phi[(size_t)i];
+ phi[(size_t)i] = phi[(size_t)(dp-i)];
+ phi[(size_t)(dp-i)] = phi[0];
}
- phi[0] = phi[dp];
-// _field.init (phi[dp], 1UL);
- _field.assign (phi[dp], _field.one);
+ phi[0] = phi[(size_t)dp];
+ field().assign (phi[(size_t)dp], field().one);
}
return L;
}
@@ -394,16 +397,16 @@ namespace LinBox
void minpoly (Polynomial &phi, unsigned long &rank, bool full_poly = true)
{
long dp = massey (phi, full_poly);
- rank = v_degree(phi) - v_val (phi);
+ rank = (unsigned long) (v_degree(phi) - v_val (phi));
if (phi.size () > 0) {
- phi.resize (dp+1);
+ phi.resize ((size_t)dp+1);
for (long i = dp >> 1; i > 0; --i)
- std::swap (phi[i], phi[dp-i]);
- phi[0] = phi[dp];
-// _field.init (phi[dp], 1UL);
- _field.assign(phi[dp], _field.one);
+ std::swap (phi[(size_t)i], phi[(size_t)(dp-i)]);
+ phi[0] = phi[(size_t)dp];
+ field().assign(phi[(size_t)dp], field().one);
}
}
+
};
}
@@ -411,11 +414,10 @@ namespace LinBox
#endif // __LINBOX_massey_domain_H
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
// Local Variables:
// mode: C++
// tab-width: 8
// indent-tabs-mode: nil
// c-basic-offset: 8
// End:
-
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/algorithms/matpoly-mult.h b/linbox/algorithms/matpoly-mult.h
index e63d52f..93ce6d4 100644
--- a/linbox/algorithms/matpoly-mult.h
+++ b/linbox/algorithms/matpoly-mult.h
@@ -27,7 +27,7 @@
#define __LINBOX_matpoly_mult_H
#include "linbox/randiter/random-fftprime.h"
-#include "linbox/algorithms/blas-domain.h"
+#include "linbox/matrix/matrix-domain.h"
#include "linbox/matrix/matrix-domain.h"
#include "linbox/util/error.h"
#include "linbox/util/debug.h"
@@ -99,8 +99,9 @@ namespace LinBox
template< class Polynomial1, class Polynomial2, class Polynomial3>
void midproduct (Polynomial1 &a, const Polynomial2 &b, const Polynomial3 &c)
{
- linbox_check( 2*a.size() == c.size()+1);
- linbox_check( 2*b.size() == c.size()+1);
+ // Need to be check somewhere else (SigmaBasis)
+ //linbox_check( 2*a.size() == c.size()+1);
+ //linbox_check( 2*b.size() == c.size()+1);
size_t d = b.size()+c.size();
//std::cout<<"midp "<<a.size()<<" = "<<b.size()<<" x "<<c.size()<<"...\n";
@@ -126,7 +127,8 @@ namespace LinBox
template< class Polynomial1, class Polynomial2, class Polynomial3>
void midproductgen (Polynomial1 &a, const Polynomial2 &b, const Polynomial3 &c)
{
- linbox_check( a.size()+b.size() == c.size()+1);
+ // Need to be check somewhere else (SigmaBasis)
+ //linbox_check( a.size()+b.size() == c.size()+1);
size_t d = b.size()+c.size();
//std::cout<<"midp "<<a.size()<<" = "<<b.size()<<" x "<<c.size()<<"...\n";
@@ -154,14 +156,16 @@ namespace LinBox
template <class Field>
class ClassicMulDomain {
private:
- Field _field;
+ const Field *_field;
BlasMatrixDomain<Field> _BMD;
MatrixDomain<Field> _MD;
public:
+ inline const Field & field() const { return *_field; }
+
ClassicMulDomain(const Field &F) :
- _field(F), _BMD(F), _MD(F)
+ _field(&F), _BMD(F), _MD(F)
{}
template< class Polynomial1, class Polynomial2, class Polynomial3>
@@ -170,7 +174,7 @@ namespace LinBox
linbox_check(a.size() >= (b.size()+c.size()-1));
for (size_t i=0;i<b.size();++i){
for (size_t j=0;j<c.size();++j)
- _BMD.axpyin(a[i+j],b[i],c[j]);
+ _BMD.axpyin(a[(size_t)i+j],b[(size_t)i],c[j]);
}
}
@@ -182,7 +186,7 @@ namespace LinBox
for (size_t i=0;i<b.size();++i){
for (size_t j=0;j<c.size();++j){
if ((i+j<2*a.size()-1) && (i+j>=a.size()-1)){
- _BMD.axpyin(a[i+j - a.size()+1],b[i],c[j]);
+ _BMD.axpyin(a[(size_t)i+j - a.size()+1],b[(size_t)i],c[j]);
}
}
}
@@ -195,7 +199,7 @@ namespace LinBox
for (size_t i=0;i<b.size();++i){
for (size_t j=0;j<c.size();++j){
if ((i+j>=a.size()-1) && (i+j<=c.size()-1)){
- _BMD.axpyin(a[i+j - a.size()+1],b[i],c[j]);
+ _BMD.axpyin(a[(size_t)i+j - a.size()+1],b[(size_t)i],c[j]);
}
}
}
@@ -209,14 +213,15 @@ namespace LinBox
public:
typedef _Field Field;
private:
- Field _field;
+ const Field *_field;
BlasMatrixDomain<Field> _BMD;
MatrixDomain<Field> _MD;
size_t _mul;
public:
+ inline const Field & field() const { return *_field; }
KaratsubaMulDomain(const Field &F) :
- _field(F), _BMD(F), _MD(F)
+ _field(&F), _BMD(F), _MD(F)
{_mul=0;}
template< class Polynomial1, class Polynomial2, class Polynomial3>
@@ -227,14 +232,16 @@ namespace LinBox
template< class Polynomial1, class Polynomial2, class Polynomial3>
void midproduct(Polynomial1 &a, const Polynomial2 &b, const Polynomial3 &c) {
- linbox_check( 2*a.size() == c.size()+1);
- linbox_check( 2*b.size() == c.size()+1);
+ // problem with sigma basis need to be checked
+ //linbox_check( 2*a.size() == c.size()+1);
+ //linbox_check( 2*b.size() == c.size()+1);
midproduct_Karatsuba(a, b, c);
}
template< class Polynomial1, class Polynomial2, class Polynomial3>
void midproductgen(Polynomial1 &a, const Polynomial2 &b, const Polynomial3 &c) {
- linbox_check(a.size()+b.size() == c.size()+1);
+ // problem with sigma basis need to be checked
+ //linbox_check(a.size()+b.size() == c.size()+1);
midproduct_Karatsubagen(a, b, c);
}
@@ -246,9 +253,9 @@ namespace LinBox
const Polynomial3 &B, size_t shiftB, size_t degB){
typedef typename Polynomial1::value_type Coefficient;
- const Coefficient ZeroC(C[0].rowdim(), C[0].coldim());
- const Coefficient ZeroA(A[0].rowdim(), A[0].coldim());
- const Coefficient ZeroB(B[0].rowdim(), B[0].coldim());
+ const Coefficient ZeroC(field(), C[0].rowdim(), C[0].coldim());
+ const Coefficient ZeroA(field(), A[0].rowdim(), A[0].coldim());
+ const Coefficient ZeroB(field(), B[0].rowdim(), B[0].coldim());
if ((degA == 1) || (degB == 1)) {
@@ -288,34 +295,34 @@ namespace LinBox
// add low and high degrees of A
for (size_t i=0;i<degA_low;++i)
- A_tmp[i]=A[shiftA+i];
+ A_tmp[(size_t)i]=A[shiftA+i];
if ( degA_high != 0)
for (size_t i=0;i<degA_high;++i)
- _MD.addin(A_tmp[i],A[shiftA+degSplit+i]);
+ _MD.addin(A_tmp[(size_t)i],A[shiftA+degSplit+i]);
// add low and high degrees of B
for (size_t i=0;i<degB_low;++i)
- B_tmp[i]=B[shiftA+i];
+ B_tmp[(size_t)i]=B[shiftA+i];
if ( degB_high != 0)
for (size_t i=0;i<degB_high;++i)
- _MD.addin(B_tmp[i],B[shiftB+degSplit+i]);
+ _MD.addin(B_tmp[(size_t)i],B[shiftB+degSplit+i]);
// multiply the sums
Karatsuba_mul(C_tmp, 0, A_tmp, 0, degA_low, B_tmp, 0, degB_low);
// subtract the low product from the product of sums
for (size_t i=0;i< C_tmp.size();++i)
- _MD.subin(C_tmp[i], C[shiftC+i]);
+ _MD.subin(C_tmp[(size_t)i], C[shiftC+i]);
// subtract the high product from the product of sums
if ((degA_high !=0) && (degB_high != 0))
for (size_t i=0;i< degA_high+degB_high-1; ++i)
- _MD.subin(C_tmp[i], C[shiftC+(degSplit << 1)+i]);
+ _MD.subin(C_tmp[(size_t)i], C[shiftC+(degSplit << 1)+i]);
// add the middle term of the product
size_t mid= (degA_low+degB_high > degB_low+degA_high)? degA_low+degB_high :degB_low+degA_high;
for (size_t i=0;i< mid-1; ++i)
- _MD.addin(C[shiftC+degSplit+i], C_tmp[i]);
+ _MD.addin(C[shiftC+degSplit+i], C_tmp[(size_t)i]);
}
}
@@ -331,50 +338,50 @@ namespace LinBox
size_t k1= A.size()-k0;
typedef typename Polynomial1::value_type Coefficient;
- const Coefficient ZeroC(C[0].rowdim(), C[0].coldim());
- const Coefficient ZeroA(A[0].rowdim(), A[0].coldim());
- const Coefficient ZeroB(B[0].rowdim(), B[0].coldim());
+ const Coefficient ZeroC(field(), C[0].rowdim(), C[0].coldim());
+ const Coefficient ZeroA(field(), A[0].rowdim(), A[0].coldim());
+ const Coefficient ZeroB(field(), B[0].rowdim(), B[0].coldim());
std::vector<Coefficient> alpha(k1,ZeroC), beta(k1,ZeroC), gamma(k0,ZeroC);
std::vector<Coefficient> A_low(k0, ZeroA), A_high(k1,ZeroA);
std::vector<Coefficient> B1(2*k1-1,ZeroB), B2(2*k1-1,ZeroB);
for (size_t i=0;i<k0;++i)
- A_low[i] = A[i];
+ A_low[(size_t)i] = A[(size_t)i];
for (size_t i=k0;i<A.size();++i)
- A_high[i-k0] = A[i];
+ A_high[(size_t)i-k0] = A[(size_t)i];
for (size_t i=0;i<2*k1-1;++i){
- B1[i] = B[i];
- B2[i] = B[i+k1];
- _MD.addin(B1[i],B2[i]);
+ B1[(size_t)i] = B[(size_t)i];
+ B2[(size_t)i] = B[(size_t)i+k1];
+ _MD.addin(B1[(size_t)i],B2[(size_t)i]);
}
midproduct_Karatsuba(alpha, A_high, B1);
if (k0 == k1) {
for (size_t i=0;i<k1;++i)
- _MD.subin(A_high[i],A_low[i]);
+ _MD.subin(A_high[(size_t)i],A_low[(size_t)i]);
midproduct_Karatsuba(beta, A_high, B2);
}
else {
for (size_t i=1;i<k1;++i)
- _MD.subin(A_high[i],A_low[i-1]);
+ _MD.subin(A_high[(size_t)i],A_low[(size_t)i-1]);
midproduct_Karatsuba(beta, A_high, B2);
}
std::vector<Coefficient> B3(2*k0-1,ZeroB);
for (size_t i=0;i<2*k0-1;++i)
- _MD.add(B3[i],B[i+2*k1],B[i+k1]);
+ _MD.add(B3[(size_t)i],B[(size_t)i+2*k1],B[(size_t)i+k1]);
midproduct_Karatsuba(gamma, A_low, B3);
for (size_t i=0;i<k1;++i)
- _MD.sub(C[i],alpha[i],beta[i]);
+ _MD.sub(C[(size_t)i],alpha[(size_t)i],beta[(size_t)i]);
for (size_t i=0;i<k0;++i){
- C[k1+i]=gamma[i];
- _MD.addin(C[k1+i],beta[i]);
+ C[k1+i]=gamma[(size_t)i];
+ _MD.addin(C[k1+i],beta[(size_t)i]);
}
}
}
@@ -384,7 +391,7 @@ namespace LinBox
if (A.size() == 1){
for (size_t i=0;i<B.size();i++)
- _BMD.mul(C[i],A[0],B[i]);
+ _BMD.mul(C[(size_t)i],A[0],B[(size_t)i]);
}
else {
size_t dA=A.size();
@@ -396,9 +403,9 @@ namespace LinBox
std::cout<<C.size()<<" "<<A.size()<<" "<<B.size()<<"("<<Bk0<<","<<Bk1<<")\n";
typedef typename Polynomial1::value_type Coefficient;
- const Coefficient ZeroC(C[0].rowdim(), C[0].coldim());
- const Coefficient ZeroA(A[0].rowdim(), A[0].coldim());
- const Coefficient ZeroB(B[0].rowdim(), B[0].coldim());
+ const Coefficient ZeroC(field(), C[0].rowdim(), C[0].coldim());
+ const Coefficient ZeroA(field(), A[0].rowdim(), A[0].coldim());
+ const Coefficient ZeroB(field(), B[0].rowdim(), B[0].coldim());
std::vector<Coefficient> A_low(Ak0,ZeroA), A_high(Ak1,ZeroA);
std::vector<Coefficient> alpha(Bk1,ZeroC), beta(Bk1,ZeroC), gamma(Bk0,ZeroC);
@@ -406,43 +413,43 @@ namespace LinBox
for (size_t i=0;i<Ak0;++i)
- A_low[i] = A[i];
+ A_low[(size_t)i] = A[(size_t)i];
for (size_t i=Ak0;i<dA;++i)
- A_high[i-Ak0] = A[i];
+ A_high[(size_t)i-Ak0] = A[(size_t)i];
for (size_t i=0;i<Ak1+Bk1-1;++i){
- B1[i] = B[i];
- B2[i] = B[i+Ak1];
- _MD.addin(B1[i],B2[i]);
+ B1[(size_t)i] = B[(size_t)i];
+ B2[(size_t)i] = B[(size_t)i+Ak1];
+ _MD.addin(B1[(size_t)i],B2[(size_t)i]);
}
midproduct_Karatsubagen(alpha, A_high, B1);
if (Ak0 == Ak1) {
for (size_t i=0;i<Ak1;++i)
- _MD.subin(A_high[i],A_low[i]);
+ _MD.subin(A_high[(size_t)i],A_low[(size_t)i]);
midproduct_Karatsubagen(beta, A_high, B2);
}
else {
for (size_t i=1;i<Ak1;++i)
- _MD.subin(A_high[i],A_low[i-1]);
+ _MD.subin(A_high[(size_t)i],A_low[(size_t)i-1]);
midproduct_Karatsubagen(beta, A_high, B2);
}
if (Bk0>0) {
for (size_t i=0;i<Ak0+Bk0-1;++i)
- _MD.add(B3[i],B[i+Ak0+Bk1],B[i+Ak0]);
+ _MD.add(B3[(size_t)i],B[(size_t)i+Ak0+Bk1],B[(size_t)i+Ak0]);
midproduct_Karatsubagen(gamma, A_low, B3);
}
for (size_t i=0;i<Bk1;++i)
- _MD.sub(C[i],alpha[i],beta[i]);
+ _MD.sub(C[(size_t)i],alpha[(size_t)i],beta[(size_t)i]);
for (size_t i=0;i<Bk0;++i){
- C[Bk1+i]=gamma[i];
- _MD.addin(C[Bk1+i],beta[i]);
+ C[Bk1+i]=gamma[(size_t)i];
+ _MD.addin(C[Bk1+i],beta[(size_t)i]);
}
}
}
@@ -463,17 +470,18 @@ namespace LinBox
typedef SpecialFFTMulDomain<Field> FFTDomainBase;
private:
- Field _field;
+ const Field *_field;
integer _p;
size_t _fftsize;
public:
+ inline const Field & field() const { return *_field; }
FFTMulDomain (const Field &F) :
- _field(F)
+ _field(&F)
{
- _field.characteristic(_p);
+ field().characteristic(_p);
_fftsize=0;
//check if field is based on fft prime
@@ -492,13 +500,13 @@ namespace LinBox
size_t pts =1; while (pts < deg) { pts= pts<<1; ++lpts; }
typedef typename Polynomial1::value_type Coefficient;
- const Coefficient ZeroC(c[0].rowdim(), c[0].coldim());
- const Coefficient ZeroA(a[0].rowdim(), a[0].coldim());
- const Coefficient ZeroB(b[0].rowdim(), b[0].coldim());
+ const Coefficient ZeroC(field(), c[0].rowdim(), c[0].coldim());
+ const Coefficient ZeroA(field(), a[0].rowdim(), a[0].coldim());
+ const Coefficient ZeroB(field(), b[0].rowdim(), b[0].coldim());
// check if fft prime and good enough
if (lpts < _fftsize){
- FFTDomainBase fftdomain(_field);
+ FFTDomainBase fftdomain(field());
fftdomain.mul(a, b, c);
}
else {
@@ -514,20 +522,21 @@ namespace LinBox
size_t bit = std::max((53-ln)>>1, _p.bitsize());
// get number of necessary primes
- integer ibound = n * _p * _p * std::max(b.size(), c.size());
- integer primesprod=1; size_t nbrprimes=1;
- RandomFFTPrime fftprime((int)bit, FFT_PRIME_SEED);
+ integer ibound = uint64_t(n) * _p * _p * std::max(b.size(), c.size());
+ integer primesprod;
+ size_t nbrprimes=1;
+ RandomFFTPrime fftprime((size_t)bit, FFT_PRIME_SEED);
std::vector<integer> lprimes(10); lprimes.resize(nbrprimes);
- lprimes[0] = fftprime.randomPrime();
+ lprimes[0] = fftprime.generatePrime();
primesprod = lprimes[0];
while (primesprod < ibound) {
++nbrprimes;
lprimes.resize(nbrprimes);
- do {lprimes[nbrprimes-1] = fftprime.randomPrime();} while (primesprod % lprimes[nbrprimes-1] == 0);
+ do {lprimes[nbrprimes-1] = fftprime.generatePrime();} while (primesprod % lprimes[nbrprimes-1] == 0);
primesprod *= lprimes[nbrprimes-1];
}
#ifdef FFT_TIMING
- std::cout<<"num of primes "<<nbrprimes<<"\n";
+ std::cout<<"num of primes "<<nbrprimes<< std::endl;
#endif
// allocate fftprime fields
Field * f_i = new Field[nbrprimes];
@@ -537,11 +546,11 @@ namespace LinBox
// set fftprimes, fftdomains, polynomial matrix results
for (size_t i=0; i< nbrprimes; ++i){
- f_i[i] = Field(lprimes[i]);
- FFTDomainBase fftdomain(f_i[i]);
- a_i[i] = std::vector<Coefficient>(a.size(), ZeroA);
+ f_i[(size_t)i] = Field(lprimes[(size_t)i]);
+ FFTDomainBase fftdomain(f_i[(size_t)i]);
+ a_i[(size_t)i] = std::vector<Coefficient>(a.size(), ZeroA);
// does not work if original field representation is not Fp seen as integers mod p
- fftdomain.mul(a_i[i], b ,c);
+ fftdomain.mul(a_i[(size_t)i], b ,c);
}
Timer chrono;
@@ -551,7 +560,7 @@ namespace LinBox
for (size_t kk=0;kk<a.size();++kk)
for (size_t i=0;i<a[0].rowdim();++i)
for (size_t j=0;j<a[0].coldim();++j){
- _field.init(a[kk].refEntry(i,j), a_i[0][kk].getEntry(i,j));
+ field().init(a[kk].refEntry(i,j), a_i[0][kk].getEntry(i,j));
}
}
else {
@@ -559,9 +568,9 @@ namespace LinBox
Element * crt_inv = new Element[nbrprimes];
Element tmp;
for (size_t i=0;i<nbrprimes; ++i){
- crt[i]=primesprod/lprimes[i];
- f_i[i].init(tmp,crt[i]);
- f_i[i].inv(crt_inv[i], tmp);
+ crt[(size_t)i]=primesprod/lprimes[(size_t)i];
+ f_i[(size_t)i].init(tmp,crt[(size_t)i]);
+ f_i[(size_t)i].inv(crt_inv[(size_t)i], tmp);
}
integer res,acc;
@@ -576,7 +585,7 @@ namespace LinBox
if (acc > primesprod)
acc-= primesprod;
}
- _field.init(a[kk].refEntry(i,j), acc);
+ field().init(a[kk].refEntry(i,j), acc);
}
#ifdef FFT_TIMING
chrono.stop();std::cout<<"reconstruction time: "<<chrono<<"\n";
@@ -591,8 +600,9 @@ namespace LinBox
template< class Polynomial1, class Polynomial2, class Polynomial3>
void midproduct(Polynomial1 &a, const Polynomial2 &b, const Polynomial3 &c) {
- linbox_check(2*a.size() == c.size()+1 );
- linbox_check(2*b.size() == c.size()+1 );
+ // need to be checked for sigmabasis
+ //linbox_check(2*a.size() == c.size()+1 );
+ //linbox_check(2*b.size() == c.size()+1 );
linbox_check(b[0].coldim() == c[0].rowdim());
size_t mm = b[0].rowdim();
@@ -600,7 +610,7 @@ namespace LinBox
size_t nn = c[0].coldim();
typedef typename Polynomial1::value_type Coefficient;
- const Coefficient ZeroA(mm,nn), ZeroB(mm,kk), ZeroC(kk,nn);
+ const Coefficient ZeroA(field(), mm,nn), ZeroB(field(), mm,kk), ZeroC(field(), kk,nn);
size_t deg = c.size()+1;
size_t lpts = 0;
@@ -608,7 +618,7 @@ namespace LinBox
// check if fft prime and good enough
if (lpts < _fftsize){
- FFTDomainBase fftdomain(_field);
+ FFTDomainBase fftdomain(field());
fftdomain.midproduct(a, b, c);
}
else {
@@ -628,16 +638,17 @@ namespace LinBox
size_t bit = std::max((53-ln)>>1, _p.bitsize());
// get number of necessary primes
- integer ibound = n * _p * _p * std::max(b.size(), c.size());
- integer primesprod=1; size_t nbrprimes=1;
- RandomFFTPrime fftprime((int)bit, FFT_PRIME_SEED);
+ integer ibound = uint64_t(n) * _p * _p * std::max(b.size(), c.size());
+ integer primesprod;
+ size_t nbrprimes=1;
+ RandomFFTPrime fftprime(bit, FFT_PRIME_SEED);
std::vector<integer> lprimes(10); lprimes.resize(nbrprimes);
- lprimes[0] = fftprime.randomPrime();
+ lprimes[0] = fftprime.generatePrime();
primesprod = lprimes[0];
while (primesprod < ibound) {
++nbrprimes;
lprimes.resize(nbrprimes);
- do {lprimes[nbrprimes-1] = fftprime.randomPrime();} while (primesprod % lprimes[nbrprimes-1] == 0);
+ do {lprimes[nbrprimes-1] = fftprime.generatePrime();} while (primesprod % lprimes[nbrprimes-1] == 0);
primesprod *= lprimes[nbrprimes-1];
}
@@ -653,11 +664,11 @@ namespace LinBox
// set fftprimes, fftdomains, polynomial matrix results
for (size_t i=0; i< nbrprimes; ++i){
- f_i[i] = Field(lprimes[i]);
- FFTDomainBase fftdomain(f_i[i]);
- a_i[i] = std::vector<Coefficient>(a.size(), ZeroA);
+ f_i[(size_t)i] = Field(lprimes[(size_t)i]);
+ FFTDomainBase fftdomain(f_i[(size_t)i]);
+ a_i[(size_t)i] = std::vector<Coefficient>(a.size(), ZeroA);
// does not work if original field representation is not Fp seen as integers mod p
- fftdomain.midproduct(a_i[i], b ,c);
+ fftdomain.midproduct(a_i[(size_t)i], b ,c);
}
Timer chrono;
@@ -667,7 +678,7 @@ namespace LinBox
for (size_t k=0;k<a.size();++k)
for (size_t i=0;i<a[0].rowdim();++i)
for (size_t j=0;j<a[0].coldim();++j){
- _field.init(a[k].refEntry(i,j), a_i[0][k].getEntry(i,j));
+ field().init(a[k].refEntry(i,j), a_i[0][k].getEntry(i,j));
}
}
else {
@@ -675,9 +686,9 @@ namespace LinBox
Element * crt_inv = new Element[nbrprimes];
Element tmp;
for (size_t i=0;i<nbrprimes; ++i){
- crt[i]=primesprod/lprimes[i];
- f_i[i].init(tmp,crt[i]);
- f_i[i].inv(crt_inv[i], tmp);
+ crt[(size_t)i]=primesprod/lprimes[(size_t)i];
+ f_i[(size_t)i].init(tmp,crt[(size_t)i]);
+ f_i[(size_t)i].inv(crt_inv[(size_t)i], tmp);
}
integer res,acc;
@@ -692,7 +703,7 @@ namespace LinBox
if (acc > primesprod)
acc-= primesprod;
}
- _field.init(a[k].refEntry(i,j), acc);
+ field().init(a[k].refEntry(i,j), acc);
}
delete [] crt;
delete [] crt_inv;
@@ -711,24 +722,25 @@ namespace LinBox
// Specialization for extension field GFqDom
template <>
- class FFTMulDomain<GivaroGfq> {
+ class FFTMulDomain<Givaro::GFq> {
public:
- typedef GivaroGfq Field;
- typedef Modular<double> ModularField;
+ typedef Givaro::GFq Field;
+ typedef Givaro::Modular<double> ModularField;
typedef typename Field::Element Element;
typedef typename ModularField::Element ModularElement;
typedef SpecialFFTMulDomain<ModularField> FFTDomainBase;
private:
- Field _field;
+ const Field *_field;
integer _p;
size_t _fftsize;
public:
+ inline const Field & field() const { return *_field; }
- FFTMulDomain (const Field &F) : _field(F){
+ FFTMulDomain (const Field &F) : _field(&F){
- _field.characteristic(_p);
+ field().characteristic(_p);
_fftsize=0;
//check if field is based on fft prime
@@ -747,9 +759,9 @@ namespace LinBox
size_t pts =1; while (pts < deg) { pts= pts<<1; ++lpts; }
typedef typename Polynomial1::value_type Coefficient;
- const Coefficient ZeroC(c[0].rowdim(), c[0].coldim());
- const Coefficient ZeroA(a[0].rowdim(), a[0].coldim());
- const Coefficient ZeroB(b[0].rowdim(), b[0].coldim());
+ const Coefficient ZeroC(field(), c[0].rowdim(), c[0].coldim());
+ const Coefficient ZeroA(field(), a[0].rowdim(), a[0].coldim());
+ const Coefficient ZeroB(field(), b[0].rowdim(), b[0].coldim());
// computation done using CRT with few fft primes
@@ -768,12 +780,12 @@ namespace LinBox
integer primesprod=1; size_t nbrprimes=1;
RandomFFTPrime fftprime(bit, FFT_PRIME_SEED);
std::vector<integer> lprimes(10); lprimes.resize(nbrprimes);
- lprimes[0] = fftprime.randomPrime();
+ lprimes[0] = fftprime.generatePrime();
primesprod = lprimes[0];
while (primesprod < ibound) {
++nbrprimes;
lprimes.resize(nbrprimes);
- do {lprimes[nbrprimes-1] = fftprime.randomPrime();} while (primesprod % lprimes[nbrprimes-1] == 0);
+ do {lprimes[nbrprimes-1] = fftprime.generatePrime();} while (primesprod % lprimes[nbrprimes-1] == 0);
primesprod *= lprimes[nbrprimes-1];
}
#ifdef FFT_TIMING
@@ -790,14 +802,14 @@ namespace LinBox
// set fftprimes, fftdomains, polynomial matrices
for (size_t i=0; i< nbrprimes; ++i){
- f_i[i] = Field(lprimes[i]);
- FFTDomainBase fftdomain(f_i[i]);
- a_i[i] = std::vector<Coefficient>(a.size(), ZeroA);
- b_i[i] = std::vector<Coefficient>(b.size(), ZeroB);
- c_i[i] = std::vector<Coefficient>(c.size(), ZeroC);
+ f_i[(size_t)i] = Field(lprimes[(size_t)i]);
+ FFTDomainBase fftdomain(f_i[(size_t)i]);
+ a_i[(size_t)i] = std::vector<Coefficient>(a.size(), ZeroA);
+ b_i[(size_t)i] = std::vector<Coefficient>(b.size(), ZeroB);
+ c_i[(size_t)i] = std::vector<Coefficient>(c.size(), ZeroC);
// does not work if original field representation is not Fp seen as integers mod p
- fftdomain.mul(a_i[i], b ,c);
+ fftdomain.mul(a_i[(size_t)i], b ,c);
}
Timer chrono;
@@ -807,7 +819,7 @@ namespace LinBox
for (size_t k=0;k<a.size();++k)
for (size_t i=0;i<a[0].rowdim();++i)
for (size_t j=0;j<a[0].coldim();++j){
- _field.init(a[k].refEntry(i,j), a_i[0][k].getEntry(i,j));
+ field().init(a[k].refEntry(i,j), a_i[0][k].getEntry(i,j));
}
}
else {
@@ -815,9 +827,9 @@ namespace LinBox
Element * crt_inv = new Element[nbrprimes];
Element tmp;
for (size_t i=0;i<nbrprimes; ++i){
- crt[i]=primesprod/lprimes[i];
- f_i[i].init(tmp,crt[i]);
- f_i[i].inv(crt_inv[i], tmp);
+ crt[(size_t)i]=primesprod/lprimes[(size_t)i];
+ f_i[(size_t)i].init(tmp,crt[(size_t)i]);
+ f_i[(size_t)i].inv(crt_inv[(size_t)i], tmp);
}
integer res,acc;
@@ -832,7 +844,7 @@ namespace LinBox
if (acc > primesprod)
acc-= primesprod;
}
- _field.init(a[k].refEntry(i,j), acc);
+ field().init(a[k].refEntry(i,j), acc);
}
#ifdef FFT_TIMING
chrono.stop();std::cout<<"reconstruction time: "<<chrono<<"\n";
@@ -847,8 +859,9 @@ namespace LinBox
template< class Polynomial1, class Polynomial2, class Polynomial3>
void midproduct(Polynomial1 &a, const Polynomial2 &b, const Polynomial3 &c) {
- linbox_check(2*a.size() == c.size()+1 );
- linbox_check(2*b.size() == c.size()+1 );
+ // need to be checked for sigmabasis
+ //linbox_check(2*a.size() == c.size()+1 );
+ //linbox_check(2*b.size() == c.size()+1 );
linbox_check(b[0].coldim() == c[0].rowdim());
size_t m = b[0].rowdim();
@@ -856,7 +869,7 @@ namespace LinBox
size_t n = c[0].coldim();
typedef typename Polynomial1::value_type Coefficient;
- const Coefficient ZeroA(m,n), ZeroB(m,k), ZeroC(k,n);
+ const Coefficient ZeroA(field(), m,n), ZeroB(field(), m,k), ZeroC(field(), k,n);
size_t deg = c.size()+1;
size_t lpts = 0;
@@ -864,7 +877,7 @@ namespace LinBox
// check if fft prime and good enough
if (lpts < _fftsize){
- FFTDomainBase fftdomain(_field);
+ FFTDomainBase fftdomain(field());
fftdomain.midproduct(a, b, c);
}
else {
@@ -884,12 +897,12 @@ namespace LinBox
integer primesprod=1; size_t nbrprimes=1;
RandomFFTPrime fftprime(bit, FFT_PRIME_SEED);
std::vector<integer> lprimes(10); lprimes.resize(nbrprimes);
- lprimes[0] = fftprime.randomPrime();
+ lprimes[0] = fftprime.generatePrime();
primesprod = lprimes[0];
while (primesprod < ibound) {
++nbrprimes;
lprimes.resize(nbrprimes);
- do {lprimes[nbrprimes-1] = fftprime.randomPrime();} while (primesprod % lprimes[nbrprimes-1] == 0);
+ do {lprimes[nbrprimes-1] = fftprime.generatePrime();} while (primesprod % lprimes[nbrprimes-1] == 0);
primesprod *= lprimes[nbrprimes-1];
}
@@ -905,11 +918,11 @@ namespace LinBox
// set fftprimes, fftdomains, polynomial matrix results
for (size_t i=0; i< nbrprimes; ++i){
- f_i[i] = Field(lprimes[i]);
- FFTDomainBase fftdomain(f_i[i]);
- a_i[i] = std::vector<Coefficient>(a.size(), ZeroA);
+ f_i[(size_t)i] = Field(lprimes[(size_t)i]);
+ FFTDomainBase fftdomain(f_i[(size_t)i]);
+ a_i[(size_t)i] = std::vector<Coefficient>(a.size(), ZeroA);
// does not work if original field representation is not Fp seen as integers mod p
- fftdomain.midproduct(a_i[i], b ,c);
+ fftdomain.midproduct(a_i[(size_t)i], b ,c);
}
Timer chrono;
@@ -919,7 +932,7 @@ namespace LinBox
for (size_t k=0;k<a.size();++k)
for (size_t i=0;i<a[0].rowdim();++i)
for (size_t j=0;j<a[0].coldim();++j){
- _field.init(a[k].refEntry(i,j), a_i[0][k].getEntry(i,j));
+ field().init(a[k].refEntry(i,j), a_i[0][k].getEntry(i,j));
}
}
else {
@@ -927,9 +940,9 @@ namespace LinBox
Element * crt_inv = new Element[nbrprimes];
Element tmp;
for (size_t i=0;i<nbrprimes; ++i){
- crt[i]=primesprod/lprimes[i];
- f_i[i].init(tmp,crt[i]);
- f_i[i].inv(crt_inv[i], tmp);
+ crt[(size_t)i]=primesprod/lprimes[(size_t)i];
+ f_i[(size_t)i].init(tmp,crt[(size_t)i]);
+ f_i[(size_t)i].inv(crt_inv[(size_t)i], tmp);
}
integer res,acc;
@@ -944,7 +957,7 @@ namespace LinBox
if (acc > primesprod)
acc-= primesprod;
}
- _field.init(a[k].refEntry(i,j), acc);
+ field().init(a[k].refEntry(i,j), acc);
}
delete [] crt;
delete [] crt_inv;
@@ -969,7 +982,7 @@ namespace LinBox
typedef typename Field::Element Element;
private:
- Field _field;
+ const Field *_field;
integer _p;
long _pl;
MatrixDomain<Field> _MD;
@@ -977,12 +990,13 @@ namespace LinBox
double fftadd, fftmul, fftcopy;
mutable long _gen;
public:
+ inline const Field & field() const { return *_field; }
SpecialFFTMulDomain(const Field &F) :
- _field(F), _MD(F), _BMD(F)
+ _field(&F), _MD(F), _BMD(F)
{
F.characteristic(_p);
- _pl = _p;
+ _pl = int64_t(_p);
fftadd= fftmul = fftcopy=0.;
// find a pseudo primitive element of the multiplicative group _p -1
@@ -1026,7 +1040,7 @@ namespace LinBox
size_t k = b[0].coldim();
size_t n = c[0].coldim();
typedef typename Polynomial1::value_type Coefficient;
- const Coefficient ZeroA(m,n), ZeroB(m,k), ZeroC(k,n);
+ const Coefficient ZeroA(field(), m,n), ZeroB(field(), m,k), ZeroC(field(), k,n);
size_t deg = b.size()+c.size()-1;
size_t lpts = 0;
@@ -1044,7 +1058,7 @@ namespace LinBox
// find a pseudo nth primitive root of unity
for (;;) {
// compute the nth primitive root
- w= (long) Givaro::powmod(_gen, _pl>>lpts, _p);
+ w= (int64_t) Givaro::powmod(int64_t(_gen), int64_t(_pl>>lpts), _p);
if ((w !=1) && (w != _pl-1))
break;
@@ -1077,24 +1091,25 @@ namespace LinBox
long inv_w;
// compute w^(-1) mod p using extended euclidean algorithm
- long x_int, y_int, q, tx, ty, temp;
- x_int = (long) _p;
- y_int = (long) w;
+ long x_int, y_int, tx, ty;
+ x_int = (int64_t) _p;
+ y_int = (int64_t) w;
tx = 0; ty = 1;
while (y_int != 0) {
+ long q,temp;
q = x_int / y_int; // integer quotient
temp = y_int; y_int = x_int - q * y_int;
x_int = temp;
temp = ty; ty = tx - q * ty;
tx = temp;
}
- if (tx < 0) tx += (long) _p;
+ if (tx < 0) tx += (int64_t) _p;
inv_w = tx;
Element _w, _inv_w;
- _field.init(_w, w);
- _field.init(_inv_w, inv_w);
+ field().init(_w, w);
+ field().init(_inv_w, inv_w);
std::vector<Element> pow_w(pts);
std::vector<Element> pow_inv_w(pts);
@@ -1102,29 +1117,29 @@ namespace LinBox
//std::cout<<"degree: "<<pts<<"\n";
// compute power of w and w^(-1)
- _field.init(pow_w[0],1);
- _field.init(pow_inv_w[0],1);
+ field().assign(pow_w[0],field().one);
+ field().assign(pow_inv_w[0],field().one);
for (size_t i=1;i<pts;++i){
- _field.mul(pow_w[i], pow_w[i-1], _w);
- _field.mul(pow_inv_w[i], pow_inv_w[i-1], _inv_w);
+ field().mul(pow_w[(size_t)i], pow_w[(size_t)i-1], _w);
+ field().mul(pow_inv_w[(size_t)i], pow_inv_w[(size_t)i-1], _inv_w);
}
// compute reverse bit ordering
// size_t revbit[pts];
std::vector<size_t> revbit(pts);
- for (long i = 0, j = 0; i < static_cast<long>(pts); i++, j = RevInc(j, lpts))
+ for (long i = 0, j = 0; i < static_cast<long>(pts); i++, j = RevInc(j, (long)lpts))
revbit[(size_t)i]=(size_t)j;
// set the data
std::vector<Coefficient> fft_a(pts, ZeroA), fft_b(pts, ZeroB), fft_c(pts,ZeroC);
for (size_t i=0;i<b.size();++i)
- fft_b[i]=b[i];
+ fft_b[(size_t)i]=b[(size_t)i];
for (size_t i=b.size();i<pts;++i)
- fft_b[i]=ZeroB;
+ fft_b[(size_t)i]=ZeroB;
for (size_t i=0;i<c.size();++i)
- fft_c[i]=c[i];
+ fft_c[(size_t)i]=c[(size_t)i];
for (size_t i=c.size();i<pts;++i)
- fft_c[i]=ZeroC;
+ fft_c[(size_t)i]=ZeroC;
@@ -1161,13 +1176,13 @@ namespace LinBox
// {chrono_mul[omp_get_thread_num()].start();
// #endif
// #endif
- _BMD.mul(fft_a[i], fft_b[i], fft_c[i]);
+ _BMD.mul(fft_a[(size_t)i], fft_b[(size_t)i], fft_c[(size_t)i]);
#ifdef FFT_TIMING
chrono.stop();
#ifdef __LINBOX_HAVE_OPENMP
//chrono_mul[omp_get_thread_num()].stop();chrono_mul_t[omp_get_thread_num()]+=chrono_mul[omp_get_thread_num()];}
//for (size_t i=0;i<omp_get_max_threads();i++)
- //std::cout<<"FFT: componentwise mul thread["<<i<<"] -> "<<chrono_mul_t[i]<<std::endl;
+ //std::cout<<"FFT: componentwise mul thread["<<i<<"] -> "<<chrono_mul_t[(size_t)i]<<std::endl;
#endif
std::cout<<"FFT: componentwise mul total : "<<chrono<<"\n";
chrono.clear();
@@ -1182,13 +1197,13 @@ namespace LinBox
// #pragma omp parallel for shared(fft_a,revbit) private(Element) schedule(runtime)
// #endif
for (size_t i=0; i< pts; ++i){
- if (revbit[i]>i){
- typename Coefficient::Iterator it_a1=fft_a[i].Begin();
- typename Coefficient::Iterator it_a2=fft_a[revbit[i]].Begin();
- for (; it_a1 != fft_a[i].End(); ++it_a1, ++it_a2){
- _field.assign(swapping,*it_a1);
- _field.assign(*it_a1, *it_a2);
- _field.assign(*it_a2,swapping);
+ if (revbit[(size_t)i]>i){
+ typename Coefficient::Iterator it_a1=fft_a[(size_t)i].Begin();
+ typename Coefficient::Iterator it_a2=fft_a[revbit[(size_t)i]].Begin();
+ for (; it_a1 != fft_a[(size_t)i].End(); ++it_a1, ++it_a2){
+ field().assign(swapping,*it_a1);
+ field().assign(*it_a1, *it_a2);
+ field().assign(*it_a2,swapping);
}
}
}
@@ -1216,17 +1231,17 @@ namespace LinBox
// set the result according to bitreverse ordering and multiply by 1/pts
Element inv_pts;
- _field.init(inv_pts, pts);
- _field.invin(inv_pts);
+ field().init(inv_pts, pts);
+ field().invin(inv_pts);
// #ifdef __LINBOX_HAVE_OPENMP
// #pragma omp parallel for shared(a,fft_a,revbit,inv_pts) schedule(stati
// #endif
for (long i=0; i< static_cast<long>(deg); ++i){
- //a[i] = fft_a[revbit[i]];
- //_MD.mulin(a[i], inv_pts);
- _MD.mul(a[i],fft_a[revbit[i]],inv_pts);
+ //a[(size_t)i] = fft_a[revbit[(size_t)i]];
+ //_MD.mulin(a[(size_t)i], inv_pts);
+ _MD.mul(a[(size_t)i],fft_a[revbit[(size_t)i]],inv_pts);
}
#ifdef FFT_TIMING
chrono.stop();
@@ -1238,16 +1253,16 @@ namespace LinBox
// middle product: a[0..n-1] = (b.c)[n..2n-1]
template< class Polynomial1, class Polynomial2, class Polynomial3>
void midproduct (Polynomial1 &a, const Polynomial2 &b, const Polynomial3 &c) {
-
- linbox_check(2*a.size() == c.size()+1 );
- linbox_check(2*b.size() == c.size()+1 );
+ // need to be checked for sigmabasis
+ //linbox_check(2*a.size() == c.size()+1 );
+ //linbox_check(2*b.size() == c.size()+1 );
linbox_check(b[0].coldim() == c[0].rowdim());
size_t m = b[0].rowdim();
size_t k = b[0].coldim();
size_t n = c[0].coldim();
typedef typename Polynomial1::value_type Coefficient;
- const Coefficient ZeroA(m,n), ZeroB(m,k), ZeroC(k,n);
+ const Coefficient ZeroA(field(), m,n), ZeroB(field(), m,k), ZeroC(field(), k,n);
size_t deg = c.size()+1;
size_t lpts = 0;
@@ -1263,7 +1278,7 @@ namespace LinBox
for (;;) {
// compute the nth primitive root
- w= (long) Givaro::powmod(_gen, _pl>>lpts, _p);
+ w= (int64_t) Givaro::powmod(int64_t(_gen), int64_t(_pl>>lpts), _p);
//std::cout<<w<<" : "<<_gen<<"\n"<<(_pl>>lpts)<<"\n";
if ((w !=1) && (w != _pl-1))
@@ -1298,52 +1313,53 @@ namespace LinBox
long inv_w;
// compute w^(-1) mod p using extended euclidean algorithm
- long x_int, y_int, q, tx, ty, temp;
- x_int = (long) _p;
- y_int = (long) w;
+ long x_int, y_int, tx, ty;
+ x_int = (int64_t) _p;
+ y_int = (int64_t) w;
tx = 0; ty = 1;
while (y_int != 0) {
+ long q,temp;
q = x_int / y_int; // integer quotient
temp = y_int; y_int = x_int - q * y_int;
x_int = temp;
temp = ty; ty = tx - q * ty;
tx = temp;
}
- if (tx < 0) tx += (long) _p;
+ if (tx < 0) tx += (int64_t) _p;
inv_w = tx;
Element _w, _inv_w;
- _field.init(_w,w);
- _field.init(_inv_w, inv_w);
+ field().init(_w,w);
+ field().init(_inv_w, inv_w);
std::vector<Element> pow_w(pts);
std::vector<Element> pow_inv_w(pts);
// compute power of w and w^(-1)
- _field.init(pow_w[0],1);
- _field.init(pow_inv_w[0],1);
+ field().assign(pow_w[0],field().one);
+ field().assign(pow_inv_w[0],field().one);
for (size_t i=1;i<pts;++i){
- _field.mul(pow_w[i], pow_w[i-1], _w);
- _field.mul(pow_inv_w[i], pow_inv_w[i-1], _inv_w);
+ field().mul(pow_w[(size_t)i], pow_w[(size_t)i-1], _w);
+ field().mul(pow_inv_w[(size_t)i], pow_inv_w[(size_t)i-1], _inv_w);
}
// compute reverse bit ordering
// XXX this is C99 extension
// size_t revbit[pts];
std::vector<size_t> revbit(pts);
- for (long i = 0, j = 0; i < static_cast<long>(pts); i++, j = RevInc(j, lpts))
+ for (long i = 0, j = 0; i < static_cast<long>(pts); i++, j = RevInc(j, (long)lpts))
revbit[(size_t)i]=(size_t)j;
// set the data
std::vector<Coefficient> fft_a(pts, ZeroA), fft_b(pts, ZeroB), fft_c(pts, ZeroC);
for (size_t i=0;i<b.size();++i)
- fft_b[i]=b[b.size()-i-1];// reverse b
+ fft_b[(size_t)i]=b[b.size()-i-1];// reverse b
for (size_t i=b.size();i<pts;++i)
- fft_b[i]=ZeroB;;
+ fft_b[(size_t)i]=ZeroB;;
for (size_t i=0;i<c.size();++i)
- fft_c[i]=c[i];
+ fft_c[(size_t)i]=c[(size_t)i];
for (size_t i=c.size();i<pts;++i)
- fft_c[i]=ZeroC;
+ fft_c[(size_t)i]=ZeroC;
// compute the DFT of b and DFT^-1 of c (parallel if __LINBOX_HAVE_OPENMP)
@@ -1357,7 +1373,7 @@ namespace LinBox
#pragma omp parallel for shared(fft_a,fft_b,fft_c) schedule(dynamic)
#endif
for (long i=0;i<static_cast<long>(pts);++i)
- _BMD.mul(fft_a[i], fft_b[i], fft_c[i]);
+ _BMD.mul(fft_a[(size_t)i], fft_b[(size_t)i], fft_c[(size_t)i]);
Element swapping;
// reorder the term in the FFT according to reverse bit ordering
@@ -1365,13 +1381,13 @@ namespace LinBox
// #pragma omp parallel for shared(fft_a,revbit,inv_pts) schedule(runtime)
// #endif
for (size_t i=0; i< pts; ++i){
- if (revbit[i]>i){
- typename Coefficient::Iterator it_a1=fft_a[i].Begin();
- typename Coefficient::Iterator it_a2=fft_a[revbit[i]].Begin();
- for (; it_a1 != fft_a[i].End(); ++it_a1, ++it_a2){
- _field.assign(swapping,*it_a1);
- _field.assign(*it_a1, *it_a2);
- _field.assign(*it_a2,swapping);
+ if (revbit[(size_t)i]>i){
+ typename Coefficient::Iterator it_a1=fft_a[(size_t)i].Begin();
+ typename Coefficient::Iterator it_a2=fft_a[revbit[(size_t)i]].Begin();
+ for (; it_a1 != fft_a[(size_t)i].End(); ++it_a1, ++it_a2){
+ field().assign(swapping,*it_a1);
+ field().assign(*it_a1, *it_a2);
+ field().assign(*it_a2,swapping);
}
}
}
@@ -1382,14 +1398,14 @@ namespace LinBox
// set the result according to bitreverse ordering and multiply by 1/pts
Element inv_pts;
- _field.init(inv_pts, pts);
- _field.invin(inv_pts);
+ field().init(inv_pts, pts);
+ field().invin(inv_pts);
// #ifdef __LINBOX_HAVE_OPENMP
// #pragma omp parallel for shared(fft_a,revbit,inv_pts) schedule(static)
// #endif
for (long i=0; i< static_cast<long>(a.size()); ++i){
- a[i] = fft_a[revbit[i]];
- _MD.mulin(a[i], inv_pts);
+ a[(size_t)i] = fft_a[revbit[(size_t)i]];
+ _MD.mulin(a[(size_t)i], inv_pts);
}
}
@@ -1405,7 +1421,7 @@ namespace LinBox
size_t k = b[0].coldim();
size_t n = c[0].coldim();
typedef typename Polynomial1::value_type Coefficient;
- const Coefficient ZeroA(m,n), ZeroB(m,k), ZeroC(k,n);
+ const Coefficient ZeroA(field(), m,n), ZeroB(field(), m,k), ZeroC(field(), k,n);
size_t deg = c.size()+1;
size_t lpts = 0;
@@ -1421,7 +1437,7 @@ namespace LinBox
for (;;) {
// compute the nth primitive root
- w= (long) Givaro::powmod(_gen, _pl>>lpts, _p);
+ w= (int64_t) Givaro::powmod(_gen, int64_t(_pl>>lpts), _p);
//std::cout<<w<<" : "<<_gen<<"\n"<<(_pl>>lpts)<<"\n";
if ((w !=1) && (w != _pl-1))
@@ -1456,11 +1472,12 @@ namespace LinBox
long inv_w;
// compute w^(-1) mod p using extended euclidean algorithm
- long x_int, y_int, q, tx, ty, temp;
+ long x_int, y_int, tx, ty;
x_int = (long) _p;
y_int = (long) w;
tx = 0; ty = 1;
while (y_int != 0) {
+ long q,temp;
q = x_int / y_int; // integer quotient
temp = y_int; y_int = x_int - q * y_int;
x_int = temp;
@@ -1472,17 +1489,17 @@ namespace LinBox
Element _w, _inv_w;
- _field.init(_w,w);
- _field.init(_inv_w, inv_w);
+ field().init(_w,w);
+ field().init(_inv_w, inv_w);
std::vector<Element> pow_w(pts);
std::vector<Element> pow_inv_w(pts);
// compute power of w and w^(-1)
- _field.init(pow_w[0],1);
- _field.init(pow_inv_w[0],1);
+ field().assign(pow_w[0],field().one);
+ field().assign(pow_inv_w[0],field().one);
for (size_t i=1;i<pts;++i){
- _field.mul(pow_w[i], pow_w[i-1], _w);
- _field.mul(pow_inv_w[i], pow_inv_w[i-1], _inv_w);
+ field().mul(pow_w[(size_t)i], pow_w[(size_t)i-1], _w);
+ field().mul(pow_inv_w[(size_t)i], pow_inv_w[(size_t)i-1], _inv_w);
}
// compute reverse bit ordering
@@ -1494,13 +1511,13 @@ namespace LinBox
// set the data
std::vector<Coefficient> fft_a(pts, ZeroA), fft_b(pts, ZeroB), fft_c(pts, ZeroC);
for (size_t i=0;i<b.size();++i)
- fft_b[i]=b[b.size()-i-1];// reverse b
+ fft_b[(size_t)i]=b[b.size()-i-1];// reverse b
for (size_t i=b.size();i<pts;++i)
- fft_b[i]=ZeroB;;
+ fft_b[(size_t)i]=ZeroB;;
for (size_t i=0;i<c.size();++i)
- fft_c[i]=c[i];
+ fft_c[(size_t)i]=c[(size_t)i];
for (size_t i=c.size();i<pts;++i)
- fft_c[i]=ZeroC;
+ fft_c[(size_t)i]=ZeroC;
// compute the DFT of b and DFT^-1 of c (parallel if __LINBOX_HAVE_OPENMP)
@@ -1515,7 +1532,7 @@ namespace LinBox
#pragma omp parallel for shared(fft_a,fft_b,fft_c) schedule(dynamic)
#endif
for (long i=0;i<(long)pts;++i)
- _BMD.mul(fft_a[i], fft_b[i], fft_c[i]);
+ _BMD.mul(fft_a[(size_t)i], fft_b[(size_t)i], fft_c[(size_t)i]);
Element swapping;
// reorder the term in the FFT according to reverse bit ordering
@@ -1523,13 +1540,13 @@ namespace LinBox
// #pragma omp parallel for shared(fft_a,revbit,inv_pts) schedule(runtime)
// #endif
for (size_t i=0; i< pts; ++i){
- if (revbit[i]>i){
- typename Coefficient::Iterator it_a1=fft_a[i].Begin();
- typename Coefficient::Iterator it_a2=fft_a[revbit[i]].Begin();
- for (; it_a1 != fft_a[i].End(); ++it_a1, ++it_a2){
- _field.assign(swapping,*it_a1);
- _field.assign(*it_a1, *it_a2);
- _field.assign(*it_a2,swapping);
+ if (revbit[(size_t)i]>i){
+ typename Coefficient::Iterator it_a1=fft_a[(size_t)i].Begin();
+ typename Coefficient::Iterator it_a2=fft_a[revbit[(size_t)i]].Begin();
+ for (; it_a1 != fft_a[(size_t)i].End(); ++it_a1, ++it_a2){
+ field().assign(swapping,*it_a1);
+ field().assign(*it_a1, *it_a2);
+ field().assign(*it_a2,swapping);
}
}
}
@@ -1540,14 +1557,14 @@ namespace LinBox
// set the result according to bitreverse ordering and multiply by 1/pts
Element inv_pts;
- _field.init(inv_pts, pts);
- _field.invin(inv_pts);
+ field().init(inv_pts, pts);
+ field().invin(inv_pts);
// #ifdef __LINBOX_HAVE_OPENMP
// #pragma omp parallel for shared(fft_a,revbit,inv_pts) schedule(static)
// #endif
for (long i=0; i< a.size(); ++i){
- a[i] = fft_a[revbit[i]];
- _MD.mulin(a[i], inv_pts);
+ a[(size_t)i] = fft_a[revbit[(size_t)i]];
+ _MD.mulin(a[(size_t)i], inv_pts);
}
}
@@ -1575,10 +1592,10 @@ namespace LinBox
typename Coeff::Iterator it_b= B.Begin();
Element tmp;
for (; it_a != A.End(); ++it_a, ++it_b){
- _field.assign(tmp,*it_a);
- _field.addin(*it_a, *it_b);
- _field.sub(*it_b, tmp, *it_b);
- _field.mulin(*it_b, alpha);
+ field().assign(tmp,*it_a);
+ field().addin(*it_a, *it_b);
+ field().sub(*it_b, tmp, *it_b);
+ field().mulin(*it_b, alpha);
}
}
@@ -1589,7 +1606,7 @@ namespace LinBox
Element *aptr = A.getPointer();
const Element *bptr = B.getPointer();
for (size_t i=0;i<n2;++i){
- aptr[i]+= bptr[i];
+ aptr[(size_t)i]+= bptr[(size_t)i];
}
}
@@ -1600,9 +1617,9 @@ namespace LinBox
Element *bptr = B.getPointer();
Element tmp;
for (size_t i=0;i<n2;++i){
- tmp = aptr[i];
- _field.addin(aptr[i],bptr[i]);
- _field.sub(bptr[i], tmp, bptr[i]);
+ tmp = aptr[(size_t)i];
+ field().addin(aptr[(size_t)i],bptr[(size_t)i]);
+ field().sub(bptr[(size_t)i], tmp, bptr[(size_t)i]);
}
}
@@ -1671,19 +1688,18 @@ namespace LinBox
//_MD.addin(fft[shift],fft[shift+n2]);
//_MD.sub(fft[shift+n2], tmp, fft[shift+n2]);
//myAddSub(fft[shift],fft[shift+n2]);
- Element one;_field.init(one,integer(1));
- Butterfly(fft[shift],fft[shift+n2],one);
+ Butterfly(fft[shift],fft[shift+n2],field().one);
for (size_t i=1; i< n2; ++i){
- Butterfly(fft[shift+i],fft[shift+i+n2],pow_w[idx_w*i]);
+ Butterfly(fft[shift+i],fft[shift+i+n2],pow_w[(size_t)idx_w*i]);
//_MD.copy(tmp, fft[shift+i]);
//_MD.addin(fft[shift+i],fft[shift+i+n2]);
//_MD.sub(fft[shift+i+n2], tmp, fft[shift+i+n2]);
//myAddSub(fft[shift+i],fft[shift+i+n2]);
- //_MD.mulin(fft[shift+i+n2], pow_w[idx_w*i]);
- //FFLAS::fscal(_field, mn, pow_w[idx_w*i], fft[shift+i+n2].getPointer(), 1);
+ //_MD.mulin(fft[shift+i+n2], pow_w[(size_t)idx_w*i]);
+ //FFLAS::fscal(field(), mn, pow_w[(size_t)idx_w*i], fft[shift+i+n2].getPointer(), 1);
}
FFT(fft, n2, pow_w, idx_w<<1, shift);
FFT(fft, n2, pow_w, idx_w<<1, shift+n2);
@@ -1695,7 +1711,7 @@ namespace LinBox
void iterative_FFT (Polynomial &fft, size_t n, size_t ln, const std::vector<Element> &pow_w){
typedef typename Polynomial::value_type Coefficient;
- Coefficient tmp(fft[0].rowdim(), fft[0].coldim());
+ Coefficient tmp(field(), fft[0].rowdim(), fft[0].coldim());
if (ln == 0)
return;
@@ -1708,9 +1724,9 @@ namespace LinBox
// bottom level s = 1
for (size_t i=0; i< n; i+=2) {
- _MD.copy(tmp, fft[i]);
- _MD.addin(fft[i], fft[i+1]);
- _MD.sub(fft[i+1], tmp, fft[i+1]);
+ _MD.copy(tmp, fft[(size_t)i]);
+ _MD.addin(fft[(size_t)i], fft[(size_t)i+1]);
+ _MD.sub(fft[(size_t)i+1], tmp, fft[(size_t)i+1]);
}
// others levels s = 2..ln-1
@@ -1725,16 +1741,16 @@ namespace LinBox
Coefficient *t, *t1, *tt, *tt1, *u, *u1, *uu, *uu1;
- t = &fft[i+m2];
- u = &fft[i];
- t1 = &fft[i+1+m2]; _MD.mulin(*t1, pow_w[w]);
- u1 = &fft[i+1];
+ t = &fft[(size_t)i+m2];
+ u = &fft[(size_t)i];
+ t1 = &fft[(size_t)i+1+m2]; _MD.mulin(*t1, pow_w[w]);
+ u1 = &fft[(size_t)i+1];
for (size_t j=0; j<m2-2; j+=2){
- tt = &fft[i+j+2+m2];_MD.mulin(*tt, pow_w[(j+2)*w]);
- uu = &fft[i+j+2];
- tt1 = &fft[i+j+3+m2];_MD.mulin(*tt1, pow_w[(j+3)*w]);
- uu1 = &fft[i+j+3];
+ tt = &fft[(size_t)i+j+2+m2];_MD.mulin(*tt, pow_w[(j+2)*w]);
+ uu = &fft[(size_t)i+j+2];
+ tt1 = &fft[(size_t)i+j+3+m2];_MD.mulin(*tt1, pow_w[(j+3)*w]);
+ uu1 = &fft[(size_t)i+j+3];
_MD.copy(tmp, *u);
_MD.addin(*u, *t);
diff --git a/linbox/algorithms/matrix-blas3/Makefile.am b/linbox/algorithms/matrix-blas3/Makefile.am
index 9d9c538..5fb4f86 100644
--- a/linbox/algorithms/matrix-blas3/Makefile.am
+++ b/linbox/algorithms/matrix-blas3/Makefile.am
@@ -1,5 +1,5 @@
# Copyright (c) 2010 the LinBox group
-# written by bb <bboyer at imag.fr>
+# written by Brice Boyer <boyer.brice at gmail.com>
# ========LICENCE========
# This file is part of the library LinBox.
#
@@ -25,6 +25,8 @@ pkgincludesubdir=$(pkgincludedir)/algorithms/matrix-blas3
pkgincludesub_HEADERS = mul.h \
mul-naive.inl \
+ mul-flint.inl \
+ mul-cra.inl \
mul-toomcook.inl
EXTRA_DIST = \
diff --git a/linbox/algorithms/matrix-blas3/Makefile.in b/linbox/algorithms/matrix-blas3/Makefile.in
deleted file mode 100644
index fd9dadc..0000000
--- a/linbox/algorithms/matrix-blas3/Makefile.in
+++ /dev/null
@@ -1,579 +0,0 @@
-# Makefile.in generated by automake 1.11.5 from Makefile.am.
-# @configure_input@
-
-# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software
-# Foundation, Inc.
-# This Makefile.in is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
-# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
-# PARTICULAR PURPOSE.
-
- at SET_MAKE@
-
-# Copyright (c) 2010 the LinBox group
-# written by bb <bboyer at imag.fr>
-# ========LICENCE========
-# This file is part of the library LinBox.
-#
-# LinBox is free software: you can redistribute it and/or modify
-# it under the terms of the GNU Lesser General Public
-# License as published by the Free Software Foundation; either
-# version 2.1 of the License, or (at your option) any later version.
-#
-# This library 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
-# Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public
-# License along with this library; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
-# ========LICENCE========
-
-VPATH = @srcdir@
-am__make_dryrun = \
- { \
- am__dry=no; \
- case $$MAKEFLAGS in \
- *\\[\ \ ]*) \
- echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \
- | grep '^AM OK$$' >/dev/null || am__dry=yes;; \
- *) \
- for am__flg in $$MAKEFLAGS; do \
- case $$am__flg in \
- *=*|--*) ;; \
- *n*) am__dry=yes; break;; \
- esac; \
- done;; \
- esac; \
- test $$am__dry = yes; \
- }
-pkgdatadir = $(datadir)/@PACKAGE@
-pkgincludedir = $(includedir)/@PACKAGE@
-pkglibdir = $(libdir)/@PACKAGE@
-pkglibexecdir = $(libexecdir)/@PACKAGE@
-am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
-install_sh_DATA = $(install_sh) -c -m 644
-install_sh_PROGRAM = $(install_sh) -c
-install_sh_SCRIPT = $(install_sh) -c
-INSTALL_HEADER = $(INSTALL_DATA)
-transform = $(program_transform_name)
-NORMAL_INSTALL = :
-PRE_INSTALL = :
-POST_INSTALL = :
-NORMAL_UNINSTALL = :
-PRE_UNINSTALL = :
-POST_UNINSTALL = :
-build_triplet = @build@
-host_triplet = @host@
-subdir = linbox/algorithms/matrix-blas3
-DIST_COMMON = $(pkgincludesub_HEADERS) $(srcdir)/Makefile.am \
- $(srcdir)/Makefile.in
-ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-am__aclocal_m4_deps = $(top_srcdir)/macros/aclocal-include.m4 \
- $(top_srcdir)/macros/config-header.m4 \
- $(top_srcdir)/macros/debug.m4 \
- $(top_srcdir)/macros/expat-check.m4 \
- $(top_srcdir)/macros/fflas-ffpack-check.m4 \
- $(top_srcdir)/macros/fplll-check.m4 \
- $(top_srcdir)/macros/givaro-check.m4 \
- $(top_srcdir)/macros/gmp-check.m4 \
- $(top_srcdir)/macros/iml-check.m4 \
- $(top_srcdir)/macros/lapack-check.m4 \
- $(top_srcdir)/macros/libtool.m4 \
- $(top_srcdir)/macros/lidia-check.m4 \
- $(top_srcdir)/macros/linbox-benchmark.m4 \
- $(top_srcdir)/macros/linbox-doc.m4 \
- $(top_srcdir)/macros/linbox-misc.m4 \
- $(top_srcdir)/macros/linbox-opt.m4 \
- $(top_srcdir)/macros/ltoptions.m4 \
- $(top_srcdir)/macros/ltsugar.m4 \
- $(top_srcdir)/macros/ltversion.m4 \
- $(top_srcdir)/macros/lt~obsolete.m4 \
- $(top_srcdir)/macros/m4ri-check.m4 \
- $(top_srcdir)/macros/m4rie-check.m4 \
- $(top_srcdir)/macros/maple-check.m4 \
- $(top_srcdir)/macros/mpfr-check.m4 \
- $(top_srcdir)/macros/ntl-check.m4 \
- $(top_srcdir)/macros/saclib-check.m4 \
- $(top_srcdir)/macros/sage-check.m4 $(top_srcdir)/configure.ac
-am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
- $(ACLOCAL_M4)
-mkinstalldirs = $(install_sh) -d
-CONFIG_HEADER = $(top_builddir)/config.h
-CONFIG_CLEAN_FILES =
-CONFIG_CLEAN_VPATH_FILES =
-depcomp =
-am__depfiles_maybe =
-SOURCES =
-DIST_SOURCES =
-am__can_run_installinfo = \
- case $$AM_UPDATE_INFO_DIR in \
- n|no|NO) false;; \
- *) (install-info --version) >/dev/null 2>&1;; \
- esac
-am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
-am__vpath_adj = case $$p in \
- $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
- *) f=$$p;; \
- esac;
-am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
-am__install_max = 40
-am__nobase_strip_setup = \
- srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
-am__nobase_strip = \
- for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
-am__nobase_list = $(am__nobase_strip_setup); \
- for p in $$list; do echo "$$p $$p"; done | \
- sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
- $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
- if (++n[$$2] == $(am__install_max)) \
- { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
- END { for (dir in files) print dir, files[dir] }'
-am__base_list = \
- sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
- sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
-am__uninstall_files_from_dir = { \
- test -z "$$files" \
- || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \
- || { echo " ( cd '$$dir' && rm -f" $$files ")"; \
- $(am__cd) "$$dir" && rm -f $$files; }; \
- }
-am__installdirs = "$(DESTDIR)$(pkgincludesubdir)"
-HEADERS = $(pkgincludesub_HEADERS)
-ETAGS = etags
-CTAGS = ctags
-DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
-ACLOCAL = @ACLOCAL@
-AMTAR = @AMTAR@
-AR = @AR@
-AUTOCONF = @AUTOCONF@
-AUTOHEADER = @AUTOHEADER@
-AUTOMAKE = @AUTOMAKE@
-AWK = @AWK@
-BLAS_CFLAGS = @BLAS_CFLAGS@
-BLAS_LIBS = @BLAS_LIBS@
-CC = @CC@
-CCNAM = @CCNAM@
-CFLAGS = @CFLAGS@
-CPPFLAGS = @CPPFLAGS@
-CXX = @CXX@
-CXXCPP = @CXXCPP@
-CXXFLAGS = @CXXFLAGS@
-CYGPATH_W = @CYGPATH_W@
-DBG = @DBG@
-DEBUG_CFLAGS = @DEBUG_CFLAGS@
-DEFAULT_CFLAGS = @DEFAULT_CFLAGS@
-DEFS = @DEFS@
-DLLTOOL = @DLLTOOL@
-DSYMUTIL = @DSYMUTIL@
-DUMPBIN = @DUMPBIN@
-ECHO_C = @ECHO_C@
-ECHO_N = @ECHO_N@
-ECHO_T = @ECHO_T@
-EGREP = @EGREP@
-EXEEXT = @EXEEXT@
-EXPAT_CFLAGS = @EXPAT_CFLAGS@
-EXPAT_LIBS = @EXPAT_LIBS@
-FFLAS_FFPACK_CFLAGS = @FFLAS_FFPACK_CFLAGS@
-FFLAS_FFPACK_LIBS = @FFLAS_FFPACK_LIBS@
-FFLAS_FFPACK_LOC = @FFLAS_FFPACK_LOC@
-FGREP = @FGREP@
-FPLLL_CFLAGS = @FPLLL_CFLAGS@
-FPLLL_LIBS = @FPLLL_LIBS@
-GIVARO_CFLAGS = @GIVARO_CFLAGS@
-GIVARO_LIBS = @GIVARO_LIBS@
-GMP_CFLAGS = @GMP_CFLAGS@
-GMP_LIBS = @GMP_LIBS@
-GMP_VERSION = @GMP_VERSION@
-GREP = @GREP@
-IML_CFLAGS = @IML_CFLAGS@
-IML_LIBS = @IML_LIBS@
-INSTALL = @INSTALL@
-INSTALL_DATA = @INSTALL_DATA@
-INSTALL_PROGRAM = @INSTALL_PROGRAM@
-INSTALL_SCRIPT = @INSTALL_SCRIPT@
-INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
-LD = @LD@
-LDFLAGS = @LDFLAGS@
-LIBOBJS = @LIBOBJS@
-LIBS = @LIBS@
-LIBTOOL = @LIBTOOL@
-LIDIA_CFLAGS = @LIDIA_CFLAGS@
-LIDIA_LIBS = @LIDIA_LIBS@
-LINBOX_BENCH_PATH = @LINBOX_BENCH_PATH@
-LINBOX_DOC_PATH = @LINBOX_DOC_PATH@
-LIPO = @LIPO@
-LN_S = @LN_S@
-LTLIBOBJS = @LTLIBOBJS@
-M4RIE_CFLAGS = @M4RIE_CFLAGS@
-M4RIE_LIBS = @M4RIE_LIBS@
-M4RI_CFLAGS = @M4RI_CFLAGS@
-M4RI_LIBS = @M4RI_LIBS@
-MAINT = @MAINT@
-MAKEINFO = @MAKEINFO@
-MANIFEST_TOOL = @MANIFEST_TOOL@
-MAPLE_CFLAGS = @MAPLE_CFLAGS@
-MAPLE_HOME = @MAPLE_HOME@
-MAPLE_LIBS = @MAPLE_LIBS@
-MAPLE_VERSION = @MAPLE_VERSION@
-MKDIR_P = @MKDIR_P@
-MPFR_CFLAGS = @MPFR_CFLAGS@
-MPFR_LIBS = @MPFR_LIBS@
-NM = @NM@
-NMEDIT = @NMEDIT@
-NTL_CFLAGS = @NTL_CFLAGS@
-NTL_LIBS = @NTL_LIBS@
-OBJDUMP = @OBJDUMP@
-OBJEXT = @OBJEXT@
-OTOOL = @OTOOL@
-OTOOL64 = @OTOOL64@
-PACKAGE = @PACKAGE@
-PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
-PACKAGE_NAME = @PACKAGE_NAME@
-PACKAGE_STRING = @PACKAGE_STRING@
-PACKAGE_TARNAME = @PACKAGE_TARNAME@
-PACKAGE_URL = @PACKAGE_URL@
-PACKAGE_VERSION = @PACKAGE_VERSION@
-PATH_SEPARATOR = @PATH_SEPARATOR@
-PROF = @PROF@
-RANLIB = @RANLIB@
-RM = @RM@
-SACLIB_CFLAGS = @SACLIB_CFLAGS@
-SACLIB_LIBS = @SACLIB_LIBS@
-SED = @SED@
-SET_MAKE = @SET_MAKE@
-SHELL = @SHELL@
-STRIP = @STRIP@
-TESTS_CFLAGS = @TESTS_CFLAGS@
-VERSION = @VERSION@
-WARN = @WARN@
-abs_builddir = @abs_builddir@
-abs_srcdir = @abs_srcdir@
-abs_top_builddir = @abs_top_builddir@
-abs_top_srcdir = @abs_top_srcdir@
-ac_ct_AR = @ac_ct_AR@
-ac_ct_CC = @ac_ct_CC@
-ac_ct_CXX = @ac_ct_CXX@
-ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
-am__leading_dot = @am__leading_dot@
-am__tar = @am__tar@
-am__untar = @am__untar@
-bindir = @bindir@
-build = @build@
-build_alias = @build_alias@
-build_cpu = @build_cpu@
-build_os = @build_os@
-build_vendor = @build_vendor@
-builddir = @builddir@
-datadir = @datadir@
-datarootdir = @datarootdir@
-docdir = @docdir@
-dvidir = @dvidir@
-exec_prefix = @exec_prefix@
-host = @host@
-host_alias = @host_alias@
-host_cpu = @host_cpu@
-host_os = @host_os@
-host_vendor = @host_vendor@
-htmldir = @htmldir@
-includedir = @includedir@
-infodir = @infodir@
-install_sh = @install_sh@
-libdir = @libdir@
-libexecdir = @libexecdir@
-localedir = @localedir@
-localstatedir = @localstatedir@
-mandir = @mandir@
-mkdir_p = @mkdir_p@
-oldincludedir = @oldincludedir@
-pdfdir = @pdfdir@
-prefix = @prefix@
-program_transform_name = @program_transform_name@
-psdir = @psdir@
-sbindir = @sbindir@
-sharedstatedir = @sharedstatedir@
-srcdir = @srcdir@
-sysconfdir = @sysconfdir@
-target_alias = @target_alias@
-top_build_prefix = @top_build_prefix@
-top_builddir = @top_builddir@
-top_srcdir = @top_srcdir@
-pkgincludesubdir = $(pkgincludedir)/algorithms/matrix-blas3
-pkgincludesub_HEADERS = mul.h \
- mul-naive.inl \
- mul-toomcook.inl
-
-EXTRA_DIST = \
- blas3.doxy
-
-all: all-am
-
-.SUFFIXES:
-$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps)
- @for dep in $?; do \
- case '$(am__configure_deps)' in \
- *$$dep*) \
- ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
- && { if test -f $@; then exit 0; else break; fi; }; \
- exit 1;; \
- esac; \
- done; \
- echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu --ignore-deps linbox/algorithms/matrix-blas3/Makefile'; \
- $(am__cd) $(top_srcdir) && \
- $(AUTOMAKE) --gnu --ignore-deps linbox/algorithms/matrix-blas3/Makefile
-.PRECIOUS: Makefile
-Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
- @case '$?' in \
- *config.status*) \
- cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
- *) \
- echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
- cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
- esac;
-
-$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
- cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-
-$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
- cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
- cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-$(am__aclocal_m4_deps):
-
-mostlyclean-libtool:
- -rm -f *.lo
-
-clean-libtool:
- -rm -rf .libs _libs
-install-pkgincludesubHEADERS: $(pkgincludesub_HEADERS)
- @$(NORMAL_INSTALL)
- @list='$(pkgincludesub_HEADERS)'; test -n "$(pkgincludesubdir)" || list=; \
- if test -n "$$list"; then \
- echo " $(MKDIR_P) '$(DESTDIR)$(pkgincludesubdir)'"; \
- $(MKDIR_P) "$(DESTDIR)$(pkgincludesubdir)" || exit 1; \
- fi; \
- for p in $$list; do \
- if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
- echo "$$d$$p"; \
- done | $(am__base_list) | \
- while read files; do \
- echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(pkgincludesubdir)'"; \
- $(INSTALL_HEADER) $$files "$(DESTDIR)$(pkgincludesubdir)" || exit $$?; \
- done
-
-uninstall-pkgincludesubHEADERS:
- @$(NORMAL_UNINSTALL)
- @list='$(pkgincludesub_HEADERS)'; test -n "$(pkgincludesubdir)" || list=; \
- files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
- dir='$(DESTDIR)$(pkgincludesubdir)'; $(am__uninstall_files_from_dir)
-
-ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
- list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
- unique=`for i in $$list; do \
- if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
- done | \
- $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
- END { if (nonempty) { for (i in files) print i; }; }'`; \
- mkid -fID $$unique
-tags: TAGS
-
-TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
- $(TAGS_FILES) $(LISP)
- set x; \
- here=`pwd`; \
- list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
- unique=`for i in $$list; do \
- if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
- done | \
- $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
- END { if (nonempty) { for (i in files) print i; }; }'`; \
- shift; \
- if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
- test -n "$$unique" || unique=$$empty_fix; \
- if test $$# -gt 0; then \
- $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
- "$$@" $$unique; \
- else \
- $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
- $$unique; \
- fi; \
- fi
-ctags: CTAGS
-CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
- $(TAGS_FILES) $(LISP)
- list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
- unique=`for i in $$list; do \
- if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
- done | \
- $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
- END { if (nonempty) { for (i in files) print i; }; }'`; \
- test -z "$(CTAGS_ARGS)$$unique" \
- || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
- $$unique
-
-GTAGS:
- here=`$(am__cd) $(top_builddir) && pwd` \
- && $(am__cd) $(top_srcdir) \
- && gtags -i $(GTAGS_ARGS) "$$here"
-
-distclean-tags:
- -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
-
-distdir: $(DISTFILES)
- @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
- topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
- list='$(DISTFILES)'; \
- dist_files=`for file in $$list; do echo $$file; done | \
- sed -e "s|^$$srcdirstrip/||;t" \
- -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
- case $$dist_files in \
- */*) $(MKDIR_P) `echo "$$dist_files" | \
- sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
- sort -u` ;; \
- esac; \
- for file in $$dist_files; do \
- if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
- if test -d $$d/$$file; then \
- dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
- if test -d "$(distdir)/$$file"; then \
- find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
- fi; \
- if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
- cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
- find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
- fi; \
- cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
- else \
- test -f "$(distdir)/$$file" \
- || cp -p $$d/$$file "$(distdir)/$$file" \
- || exit 1; \
- fi; \
- done
-check-am: all-am
-check: check-am
-all-am: Makefile $(HEADERS)
-installdirs:
- for dir in "$(DESTDIR)$(pkgincludesubdir)"; do \
- test -z "$$dir" || $(MKDIR_P) "$$dir"; \
- done
-install: install-am
-install-exec: install-exec-am
-install-data: install-data-am
-uninstall: uninstall-am
-
-install-am: all-am
- @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
-
-installcheck: installcheck-am
-install-strip:
- if test -z '$(STRIP)'; then \
- $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
- install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
- install; \
- else \
- $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
- install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
- "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
- fi
-mostlyclean-generic:
-
-clean-generic:
-
-distclean-generic:
- -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
- -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
-
-maintainer-clean-generic:
- @echo "This command is intended for maintainers to use"
- @echo "it deletes files that may require special tools to rebuild."
-clean: clean-am
-
-clean-am: clean-generic clean-libtool mostlyclean-am
-
-distclean: distclean-am
- -rm -f Makefile
-distclean-am: clean-am distclean-generic distclean-tags
-
-dvi: dvi-am
-
-dvi-am:
-
-html: html-am
-
-html-am:
-
-info: info-am
-
-info-am:
-
-install-data-am: install-pkgincludesubHEADERS
-
-install-dvi: install-dvi-am
-
-install-dvi-am:
-
-install-exec-am:
-
-install-html: install-html-am
-
-install-html-am:
-
-install-info: install-info-am
-
-install-info-am:
-
-install-man:
-
-install-pdf: install-pdf-am
-
-install-pdf-am:
-
-install-ps: install-ps-am
-
-install-ps-am:
-
-installcheck-am:
-
-maintainer-clean: maintainer-clean-am
- -rm -f Makefile
-maintainer-clean-am: distclean-am maintainer-clean-generic
-
-mostlyclean: mostlyclean-am
-
-mostlyclean-am: mostlyclean-generic mostlyclean-libtool
-
-pdf: pdf-am
-
-pdf-am:
-
-ps: ps-am
-
-ps-am:
-
-uninstall-am: uninstall-pkgincludesubHEADERS
-
-.MAKE: install-am install-strip
-
-.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \
- clean-libtool ctags distclean distclean-generic \
- distclean-libtool distclean-tags distdir dvi dvi-am html \
- html-am info info-am install install-am install-data \
- install-data-am install-dvi install-dvi-am install-exec \
- install-exec-am install-html install-html-am install-info \
- install-info-am install-man install-pdf install-pdf-am \
- install-pkgincludesubHEADERS install-ps install-ps-am \
- install-strip installcheck installcheck-am installdirs \
- maintainer-clean maintainer-clean-generic mostlyclean \
- mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
- tags uninstall uninstall-am uninstall-pkgincludesubHEADERS
-
-
-# Tell versions [3.59,3.63) of GNU make to not export all variables.
-# Otherwise a system limit (for SysV at least) may be exceeded.
-.NOEXPORT:
diff --git a/linbox/algorithms/matrix-blas3/blas3.doxy b/linbox/algorithms/matrix-blas3/blas3.doxy
index 2a69597..fed10c0 100644
--- a/linbox/algorithms/matrix-blas3/blas3.doxy
+++ b/linbox/algorithms/matrix-blas3/blas3.doxy
@@ -1,6 +1,6 @@
/*
* Copyright (c) 2012 LinBox
- * written by bb <bboyer at imag.fr>
+ * written by Brice Boyer (briceboyer) <boyer.brice at gmail.com>
*
* ========LICENCE========
* This file is part of the library LinBox.
diff --git a/linbox/algorithms/matrix-blas3/mul-cra.inl b/linbox/algorithms/matrix-blas3/mul-cra.inl
new file mode 100644
index 0000000..0740d28
--- /dev/null
+++ b/linbox/algorithms/matrix-blas3/mul-cra.inl
@@ -0,0 +1,191 @@
+/* Copyright (C) 2014 the members of the LinBox group
+ *
+ * Written by Brice Boyer (briceboyer) <boyer.brice at gmail.com>
+ *
+ * This file is part of the LinBox library.
+ *
+ * ========LICENCE========
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * LinBox 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ * ========LICENCE========
+ *
+ */
+
+#ifndef __LINBOX_matrix_blas3_mul_cra_INL
+#define __LINBOX_matrix_blas3_mul_cra_INL
+
+#include "linbox/algorithms/cra-domain.h"
+#include "linbox/algorithms/cra-full-multip-fixed.h"
+
+#include "givaro/random-integer.h"
+#include "linbox/randiter/random-prime.h"
+
+
+namespace LinBox { namespace BLAS3 { namespace Protected {
+
+ struct IntegerCraMatMul {
+
+
+ typedef Givaro::Modular<double> Field;
+ typedef Field::Element Element;
+ typedef BlasMatrix<Field> ModularMatrix ;
+ typedef BlasMatrix<Givaro::ZRing<Integer> > IntegerMatrix ;
+
+#ifdef _LB_MM_TIMING
+#ifdef _OPENMP
+ typedef LinBox::OMPTimer Mytime;
+#else
+ typedef LinBox::Timer Mytime;
+#endif
+#endif
+
+ const IntegerMatrix &_A_, &_B_;
+
+#ifdef _LB_MM_TIMING
+ mutable Mytime chrono;
+#endif
+
+ IntegerCraMatMul(const IntegerMatrix& A, const IntegerMatrix& B) :
+ _A_(A), _B_(B)
+ {
+#ifdef _LB_MM_TIMING
+ chrono.clear();
+#endif
+ linbox_check(A.getPointer() == _A_.getPointer());
+ }
+
+ IntegerCraMatMul(IntegerMatrix& A, IntegerMatrix& B) :
+ _A_(A), _B_(B)
+ {
+#ifdef _LB_MM_TIMING
+ chrono.clear();
+#endif
+ linbox_check(A.getPointer() == _A_.getPointer());
+ }
+
+ ModularMatrix& operator()(ModularMatrix& Cp, const Field& F) const
+ {
+ BlasMatrixDomain<Field> BMD(F);
+
+ /* intialisation */
+ // ModularMatrix Cpp(_A_.rowdim(),_B_.coldim());
+ // Cp = Cpp ;
+ ModularMatrix Ap(_A_, F);
+ ModularMatrix Bp(_B_, F);
+ Cp.resize(Ap.rowdim(),Bp.coldim());
+
+ /* multiplication mod p */
+
+#ifdef _LB_MM_TIMING
+ Mytime matmul; matmul.clear(); matmul.start();
+#endif
+ BMD.mul(Cp,Ap,Bp);
+ // BMD.axpyin(Cp,Ap,Bp);
+#if 0
+ // BMD.mul( static_cast<BlasMatrix<double>&>(Cp),Ap,Bp);
+ if (FAM_TYPE == _axpy)
+ BMD.axpyin(Cp,Ap,Bp);
+ else if (FAM_TYPE == _axmy)
+ BMD.axmyin(Cp,Ap,Bp);
+ else if (FAM_TYPE == _maxpy)
+ BMD.maxpyin(Cp,Ap,Bp);
+#endif
+#ifdef _LB_MM_TIMING
+ matmul.stop();
+ this->chrono+=matmul;
+#endif
+#if 0
+ if (Ap.rowdim() <= 20 && Ap.coldim() <= 20) {
+ Integer chara;
+ F.characteristic(chara);
+ F.write(cout) << endl;
+ cout << "p:=" << chara << ';' << std::endl;
+ A.write(cout<< "A:=",true) << ';' << std::endl;
+ Ap.write(cout << "Ap:=", F, true) << ';' << endl;
+ Bp.write(cout << "Bp:=", F, true) << ';' << endl;
+ Cp.write(cout<< "Cp:=", F, true) << ';' << endl;
+ }
+#endif
+ return Cp;
+ }
+
+
+
+ };
+
+} // Protected
+} // BLAS3
+} // LinBox
+
+namespace LinBox {
+ template<class Field>
+ struct CRATemporaryVectorTrait<BLAS3::Protected::IntegerCraMatMul, Field> {
+ // typedef typename std::vector<double>::iterator Type_t ;
+ typedef typename LinBox::BlasMatrix<Field > Type_t;
+ };
+} // LinBox
+
+
+namespace LinBox { namespace BLAS3 {
+ template<class _anyMatrix>
+ _anyMatrix & mul (_anyMatrix& C,
+ const _anyMatrix& A,
+ const _anyMatrix& B,
+ const mulMethod::CRA &)
+ {
+
+ size_t PrimeSize = 22; //! @todo pourqoi ?
+
+ integer mA, mB ;
+ BlasMatrixDomain<typename _anyMatrix::Field> BMD(A.field());
+ BMD.Magnitude(mA,A);
+ BMD.Magnitude(mB,B);
+ double logC = Givaro::naturallog(mA*mB*A.coldim());
+
+ typedef Givaro::Modular<double> ModularField ;
+
+ {
+
+ RandomPrimeIterator genprime( (unsigned int)PrimeSize );
+ ChineseRemainder< FullMultipBlasMatCRA< ModularField > > cra( std::pair<size_t,double>(C.rowdim()*C.coldim(), logC) );
+ Protected::IntegerCraMatMul iteration(A,B);
+
+ cra(C, iteration, genprime);
+
+#ifdef _LB_DEBUG
+#ifdef _LB_MM_TIMING
+ std::cout << "Sole modular matrix multiplications: " << iteration.chrono << std::endl;
+#endif
+
+ Integer mC; BMD.Magnitude(mC, C);
+ std::cout << "C max: " << logtwo(mC) << " (" << LinBox::naturallog(mC) << ')' << std::endl;
+#endif
+
+ }
+
+ return C;
+
+ }
+} // BLAS3
+} // LinBox
+
+#endif // __LINBOX_matrix_blas3_mul_cra_INL
+
+//Local Variables:
+//mode: C++
+//tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/algorithms/matrix-blas3/mul-flint.inl b/linbox/algorithms/matrix-blas3/mul-flint.inl
new file mode 100644
index 0000000..bd4e705
--- /dev/null
+++ b/linbox/algorithms/matrix-blas3/mul-flint.inl
@@ -0,0 +1,116 @@
+/* Copyright (C) 2012 the members of the LinBox group
+ * Written by Brice Boyer (briceboyer) <boyer.brice at gmail.com>
+ *
+ * This file is part of the LinBox library.
+ *
+ * ========LICENCE========
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * LinBox 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ * ========LICENCE========
+ *
+ */
+
+#ifndef __LINBOX_matrix_blas3_mul_flint_INL
+#define __LINBOX_matrix_blas3_mul_flint_INL
+
+
+namespace LinBox {
+ namespace BLAS3 {
+ namespace Protected {
+ template<class _ZZ>
+ void getFlintMatrix(BlasMatrix<_ZZ> &C , const FLINT::fmpz_mat_t Cf)
+ {
+ Integer toto(0) ;
+ for (size_t i = 0 ; i< C.rowdim() ; ++i)
+ for (size_t j = 0 ; j< C.coldim() ; ++j) {
+ FLINT::fmpz_get_mpz(toto.get_mpz(), fmpz_mat_entry(Cf,i,j));
+ C.setEntry(i,j, toto );
+ }
+ }
+
+ template<class _ZZ>
+ void setFlintMatrix(FLINT::fmpz_mat_t Cf, const BlasMatrix<_ZZ> &C )
+ {
+ Integer toto(0) ;
+ for (size_t i = 0 ; i< C.rowdim() ; ++i)
+ for (size_t j = 0 ; j< C.coldim() ; ++j) {
+ FLINT::fmpz_set_mpz(fmpz_mat_entry(Cf,i,j), C.getEntry(i,j).get_mpz_const());
+ }
+ }
+
+#if 0
+ template<class _Mat>
+ void getFlintMatrix(BlasSubmatrix<_Mat> &C , const FLINT::fmpz_mat_t Cf)
+ {
+ Integer toto(0) ;
+ for (size_t i = 0 ; i< C.rowdim() ; ++i)
+ for (size_t j = 0 ; j< C.coldim() ; ++j) {
+ FLINT::fmpz_get_mpz(toto.get_mpz(), fmpz_mat_entry(Cf,i,j));
+ C.setEntry(i,j, toto );
+ }
+ }
+
+
+ template<class _ZZ>
+ void setFlintMatrix(FLINT::fmpz_mat_t Cf, const BlasSubmatrix<_ZZ> &C )
+ {
+ Integer toto(0) ;
+ for (size_t i = 0 ; i< C.rowdim() ; ++i)
+ for (size_t j = 0 ; j< C.coldim() ; ++j) {
+ FLINT::fmpz_set_mpz(fmpz_mat_entry(Cf,i,j), C.getEntry(i,j).get_mpz_const());
+ }
+ }
+#endif
+
+ }
+
+ template<class DenseIntMat>
+ DenseIntMat &
+ mul (DenseIntMat& C,
+ const DenseIntMat& A,
+ const DenseIntMat& B,
+ const mulMethod::FLINT & )
+ {
+ FLINT::fmpz_mat_t Af ;
+ FLINT::fmpz_mat_t Bf ;
+ FLINT::fmpz_mat_t Cf ;
+ FLINT::fmpz_mat_init(Af, A.rowdim(), A.coldim());
+ FLINT::fmpz_mat_init(Bf, B.rowdim(), B.coldim());
+ FLINT::fmpz_mat_init(Cf, C.rowdim(), C.coldim());
+ Protected::setFlintMatrix<typename DenseIntMat::Field>(Af,A);
+ Protected::setFlintMatrix<typename DenseIntMat::Field>(Bf,B);
+ // Timer Tim ;Tim.clear(); Tim.start();
+ FLINT::fmpz_mat_mul(Cf,Af,Bf);
+ // Tim.stop() ; std::cout << "inside : " << Tim << std::endl;
+ Protected::getFlintMatrix<typename DenseIntMat::Field>(C,Cf);
+ FLINT::fmpz_mat_clear(Af);
+ FLINT::fmpz_mat_clear(Bf);
+ FLINT::fmpz_mat_clear(Cf);
+
+ return C;
+ }
+ } // BLAS3
+}
+
+
+#endif // __LINBOX_matrix_blas3_mul_flint_INL
+
+//Local Variables:
+//mode: C++
+//tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
+
diff --git a/linbox/algorithms/matrix-blas3/mul-naive.inl b/linbox/algorithms/matrix-blas3/mul-naive.inl
index 49ab820..08e56a6 100644
--- a/linbox/algorithms/matrix-blas3/mul-naive.inl
+++ b/linbox/algorithms/matrix-blas3/mul-naive.inl
@@ -1,5 +1,5 @@
/* Copyright (C) 2012 the members of the LinBox group
- * Written by B. Boyer < bboyer at imag.fr >
+ * Written by Brice Boyer (briceboyer) <boyer.brice at gmail.com>
*
* This file is part of the LinBox library.
*
@@ -25,31 +25,30 @@
#define __LINBOX_matrix_blas3_mul_naive_INL
-namespace LinBox {
- namespace BLAS3 {
- template<class _anyMatrix, class _otherMatrix1, class _otherMatrix2>
- _anyMatrix & mul (_anyMatrix& C,
- const _otherMatrix1& A,
- const _otherMatrix2& B,
- const mulMethod::naive &)
- {
- // TODO check sizes
- // TODO check fields
- // TODO check get/set Entry
- typedef typename _anyMatrix::Field Field;
- const Field &F = B.field();
- for (size_t i = 0 ; i <C.rowdim(); ++i)
- for (size_t j = 0 ; j <C.coldim(); ++j) {
- C.setEntry(i,j,F.zero);
- for (size_t k = 0 ; k <B.rowdim(); ++k)
- F.axpyin(C.refEntry(i,j),
- A.getEntry(i, k),
- B.getEntry(k, j));
- }
- return C;
- }
+namespace LinBox { namespace BLAS3 {
+ template<class _anyMatrix, class _otherMatrix1, class _otherMatrix2>
+ _anyMatrix & mul (_anyMatrix& C,
+ const _otherMatrix1& A,
+ const _otherMatrix2& B,
+ const mulMethod::naive &)
+ {
+ // TODO check sizes
+ // TODO check fields
+ // TODO check get/set Entry
+ typedef typename _anyMatrix::Field Field;
+ const Field &F = B.field();
+ for (size_t i = 0 ; i <C.rowdim(); ++i)
+ for (size_t j = 0 ; j <C.coldim(); ++j) {
+ C.setEntry(i,j,F.zero);
+ for (size_t k = 0 ; k <B.rowdim(); ++k)
+ F.axpyin(C.refEntry(i,j),
+ A.getEntry(i, k),
+ B.getEntry(k, j));
+ }
+ return C;
}
-}
+} // BLAS3
+} // LinBox
#endif // __LINBOX_matrix_blas3_mul_naive_INL
diff --git a/linbox/algorithms/matrix-blas3/mul-toomcook.inl b/linbox/algorithms/matrix-blas3/mul-toomcook.inl
index ca72c9b..baaf37d 100644
--- a/linbox/algorithms/matrix-blas3/mul-toomcook.inl
+++ b/linbox/algorithms/matrix-blas3/mul-toomcook.inl
@@ -1,5 +1,5 @@
/* Copyright (C) 2012 the members of the LinBox group
- * Written by B. Boyer < bboyer at imag.fr >
+ * Written by Brice Boyer (briceboyer) <boyer.brice at gmail.com>
*
* This file is part of the LinBox library.
*
@@ -35,303 +35,328 @@
#include <fflas-ffpack/fflas/fflas.h>
#include <fflas-ffpack/ffpack/ffpack.h>
+#include "linbox/algorithms/matrix-hom.h"
-namespace LinBox {
- namespace BLAS3 {
+namespace LinBox { namespace BLAS3 {
- template<class Zpz>
- BlasMatrix<Zpz>& ToomCook(BlasMatrix<Zpz>& TC, BlasMatrix<Zpz>& iTC)
- {
- linbox_check(TC.rowdim() == TC.coldim());
- size_t l = TC.rowdim();
+ template<class Zpz>
+ BlasMatrix<Zpz>& ToomCook(BlasMatrix<Zpz>& TC, BlasMatrix<Zpz>& iTC)
+ {
+ linbox_check(TC.rowdim() == TC.coldim());
+ size_t l = TC.rowdim();
- for (size_t i = 0 ; i < l ; ++i)
- for (size_t j = 0 ; j < l ; ++j) {
- TC.field().init(TC.refEntry(i,j), pow((Integer)i,j));
- }
- BlasMatrixDomain<Zpz> BMD(TC.field()) ;
- // TC.write(std::cout << "TC ") << std::endl;
- // BMD.invert(iTC, TC);
- int null;
- FFPACK::Invert((typename Field::Father_t)TC.field(),l,TC.getPointer(),l,iTC.getWritePointer(),l,null);
- // iTC.write(std::cout << "TC^(-1) ") << std::endl;
- // TC.write(std::cout << "TC ") << std::endl;
- return TC;
- }
+ for (size_t i = 0 ; i < l ; ++i)
+ for (size_t j = 0 ; j < l ; ++j) {
+ TC.field().init(TC.refEntry(i,j), pow((Integer)i,j));
+ }
+ BlasMatrixDomain<Zpz> BMD(TC.field()) ;
+ // TC.write(std::cout << "TC ") << std::endl;
+ // BMD.invert(iTC, TC);
+ int null;
+ FFPACK::Invert(TC.field(),l,TC.getPointer(),l,iTC.getWritePointer(),l,null);
+ // iTC.write(std::cout << "TC^(-1) ") << std::endl;
+ // TC.write(std::cout << "TC ") << std::endl;
+ return TC;
+ }
- namespace Protected {
+ namespace Protected {
- template<class Zpz, class GFpe>
- BlasMatrix<Zpz >& mul (BlasMatrix<Zpz> & CMatBloc,
- const BlasMatrix<Zpz>& AMatBloc,
- const BlasMatrix<Zpz>& BMatBloc,
- const size_t m,
- const size_t k,
- const size_t n,
- const mulMethod::ToomCook<GFpe> & T)
- {
+ template<class Zpz, class GFpe>
+ BlasMatrix<Zpz >& mul (BlasMatrix<Zpz> & CMatBloc,
+ const BlasMatrix<Zpz>& AMatBloc,
+ const BlasMatrix<Zpz>& BMatBloc,
+ const size_t m,
+ const size_t k,
+ const size_t n,
+ const mulMethod::ToomCook<GFpe> & T)
+ {
#if (__LINBOX_FFLAS_FFPACK_VERSION < 10501)
#warning "Invert is buggy in your fflas-ffpack version. please consider upgrading to >=1.5.1."
#endif
- const Zpz & F = CMatBloc.field();
- const GFpe& GF = T._myF ;
- // linbox_check(T._myF.characacteristic() == F.characteristic());
- // TODO si e = 1 on matmul !
- size_t e = (size_t) GF.exponent() ; // extension degree
- size_t l = 2*e - 1 ; // sure ?
-
- BlasMatrix<Zpz> TC (F,l,l);
- BlasMatrix<Zpz> iTC (F,l,l);
- BlasMatrix<Zpz> iEval (F,l,l);
- // FWD = Matrix(K, l, l, [K(i**j) for i in range(l) for j in range(l)])
- ToomCook(TC,iTC);
- // each row is a result matrix
- BlasMatrix<Zpz> TMatBloc( F, l, m*n);
-
-
- // AY = [sum(FWD[i,j]*A[j] for j in range(len(A))) for i in range(l)]
- // BY = [sum(FWD[i,j]*B[j] for j in range(len(B))) for i in range(l)]
- if (!T.memory_unlimited) { /* space efficient */
- BlasMatrix<Zpz> AEval( F , m, k);
- BlasMatrix<Zpz> BEval( F , k, n);
-
-
- for (size_t i = 0 ; i < l ; ++i) {
- FFLAS::fgemv((typename Field::Father_t)F, FFLAS::FflasTrans,
- e, m*k,
- F.one,
- AMatBloc.getPointer(), m*k,
- TC.getPointer()+ i*l, 1,
- F.zero,
- AEval.getWritePointer(), 1);
-
- FFLAS::fgemv((typename Field::Father_t)F, FFLAS::FflasTrans,
- e, k*n,
- F.one,
- BMatBloc.getPointer(), k*n,
- TC.getPointer()+ i*l, 1,
- F.zero,
- BEval.getWritePointer(), 1);
-
- FFLAS::fgemm((typename Field::Father_t)F,
- FFLAS::FflasNoTrans, FFLAS::FflasNoTrans,
- // m, k , n,
- m,n,k,
- F.one,
- AEval.getPointer(), AEval.coldim(), //lda
- BEval.getPointer(), BEval.coldim(), //ldb
- F.zero,
- TMatBloc.getWritePointer()+i*m*n, n);
- }
- }
- else { /* time efficient (matmul) */
- BlasMatrix<Zpz> AEval( F , l, m*k);
- BlasMatrix<Zpz> BEval( F , l, k*n);
-
-
- FFLAS::fgemm((typename Field::Father_t)F,
- FFLAS::FflasNoTrans, FFLAS::FflasNoTrans,
- // m, k , n,
- l,m*k,e,
+ const Zpz & F = CMatBloc.field();
+ const GFpe& GF = T._myF ;
+ // linbox_check(T._myF.characacteristic() == F.characteristic());
+ // TODO si e = 1 on matmul !
+ size_t e = (size_t) GF.exponent() ; // extension degree
+ size_t l = 2*e - 1 ; // sure ?
+
+ BlasMatrix<Zpz> TC (F,l,l);
+ BlasMatrix<Zpz> iTC (F,l,l);
+ BlasMatrix<Zpz> iEval (F,l,l);
+ // FWD = Matrix(K, l, l, [K(i**j) for i in range(l) for j in range(l)])
+ ToomCook(TC,iTC);
+ // each row is a result matrix
+ BlasMatrix<Zpz> TMatBloc( F, l, m*n);
+
+
+ // AY = [sum(FWD[i,j]*A[j] for j in range(len(A))) for i in range(l)]
+ // BY = [sum(FWD[i,j]*B[j] for j in range(len(B))) for i in range(l)]
+ if (!T.memory_unlimited) { /* space efficient */
+ BlasMatrix<Zpz> AEval( F , m, k);
+ BlasMatrix<Zpz> BEval( F , k, n);
+
+
+ for (size_t i = 0 ; i < l ; ++i) {
+ FFLAS::fgemv(F, FFLAS::FflasTrans,
+ e, m*k,
F.one,
- // AEval.getPointer(), AEval.coldim(), //lda
- TC.getPointer(),l,
AMatBloc.getPointer(), m*k,
+ TC.getPointer()+ i*l, 1,
+ F.zero,
+ AEval.getWritePointer(), 1);
+
+ FFLAS::fgemv(F, FFLAS::FflasTrans,
+ e, k*n,
+ F.one,
+ BMatBloc.getPointer(), k*n,
+ TC.getPointer()+ i*l, 1,
F.zero,
- AEval.getWritePointer(), m*k);
- // TMatBloc.getWritePointer()+i*m*n, n);
+ BEval.getWritePointer(), 1);
- FFLAS::fgemm((typename Field::Father_t)F,
+ FFLAS::fgemm(F,
FFLAS::FflasNoTrans, FFLAS::FflasNoTrans,
// m, k , n,
- l,n*k,e,
+ m,n,k,
F.one,
- // AEval.getPointer(), AEval.coldim(), //lda
- TC.getPointer(),l,
- BMatBloc.getPointer(), n*k,
+ AEval.getPointer(), AEval.coldim(), //lda
+ BEval.getPointer(), BEval.coldim(), //ldb
F.zero,
- BEval.getWritePointer(), n*k);
-
- for (size_t i = 0 ; i < l ; ++i) {
-
- FFLAS::fgemm((typename Field::Father_t)F,
- FFLAS::FflasNoTrans, FFLAS::FflasNoTrans,
- // m, k , n,
- m,n,k,
- F.one,
- AEval.getPointer()+i*m*k, k, //lda
- BEval.getPointer()+i*n*k, n, //ldb
- F.zero,
- TMatBloc.getWritePointer()+i*m*n, n);
- }
+ TMatBloc.getWritePointer()+i*m*n, n);
}
+ }
+ else { /* time efficient (matmul) */
+ BlasMatrix<Zpz> AEval( F , l, m*k);
+ BlasMatrix<Zpz> BEval( F , l, k*n);
- std::vector<double> minpoly_vector = GF.irreducible() ;
- for (size_t i = 0 ; i < minpoly_vector.size(); ++i)
- F.negin(minpoly_vector[i]);
-
- // BlasSubmatrix<Zpz> CompMat(CMatBloc,0,0,l,l);
- BlasMatrix<Zpz> CompMat(F,l,l);
- for (size_t i = 0 ; i < e ; ++i) { // degree == l ?
- CompMat.setEntry(i,i,F.one);
- }
- for (size_t j = 0 ; j < e-1 ; ++j) {
- CompMat.setEntry(j,e,minpoly_vector[j]);
- }
- typename Zpz::Element coeff ;
- typename Zpz::Element tmp_coeff, tmp_coeff2 ;
- F.init(tmp_coeff);
- for (size_t i = 1 ; i < e-1 ; ++i){
- for (size_t j = 1 ; j < e+1 ; ++j) {
- CompMat.setEntry(j, i + e, CompMat.getEntry((j-1),i - 1 + e) ) ;
- }
- if (!F.isZero(CompMat.getEntry(e,i+e))){
- F.init(coeff, CompMat.getEntry( e, i + e) );
- for(size_t j = 0 ; j < e-1 ; ++j){
- F.mul(tmp_coeff, coeff,minpoly_vector[j]);
- F.init(tmp_coeff2,CompMat.getEntry(j,i+e));
- F.addin(tmp_coeff2, tmp_coeff);
- CompMat.setEntry(j,i+e, tmp_coeff2 );
- }
- }
- }
- // BCK = ~FWD
- // XXX some stuff here
- FFLAS::fgemm((typename Field::Father_t)F,
+ FFLAS::fgemm(F,
FFLAS::FflasNoTrans, FFLAS::FflasNoTrans,
- l, l, l, F.one,
- CompMat.getPointer(), l,
- iTC.getPointer(), l,
+ // m, k , n,
+ l,m*k,e,
+ F.one,
+ // AEval.getPointer(), AEval.coldim(), //lda
+ TC.getPointer(),l,
+ AMatBloc.getPointer(), m*k,
F.zero,
- iEval.getWritePointer(), l);
-
+ AEval.getWritePointer(), m*k);
+ // TMatBloc.getWritePointer()+i*m*n, n);
- // Y = [sum(BCK[i,j]*Y[j] for j in range(l)) for i in range(l)]
- FFLAS::fgemm((typename Field::Father_t)F,
+ FFLAS::fgemm(F,
FFLAS::FflasNoTrans, FFLAS::FflasNoTrans,
- e,m*n,l,
+ // m, k , n,
+ l,n*k,e,
F.one,
- iEval.getPointer(), l,
- TMatBloc.getPointer(), m*n,
+ // AEval.getPointer(), AEval.coldim(), //lda
+ TC.getPointer(),l,
+ BMatBloc.getPointer(), n*k,
F.zero,
- CMatBloc.getWritePointer(), m*n);
- return CMatBloc;
+ BEval.getWritePointer(), n*k);
- }
- }
+ for (size_t i = 0 ; i < l ; ++i) {
- template<class Zpz, class GF>
- std::vector<BlasMatrix<Zpz> >& mul (std::vector<BlasMatrix<Zpz> >& C,
- const std::vector<BlasMatrix<Zpz> >& A,
- const std::vector<BlasMatrix<Zpz> >& B,
- const mulMethod::ToomCook<GF> & T)
- {
- size_t m = C[0].rowdim();
- size_t k = B[0].rowdim();
- size_t n = C[0].coldim();
- const Zpz & F = C[0].field();
- BlasMatrix<Zpz> Cbloc(F,C.size(),m*n);
- BlasMatrix<Zpz> Abloc(F,C.size(),m*k);
- BlasMatrix<Zpz> Bbloc(F,C.size(),k*n);
- // convert
- for (size_t l = 0 ; l < C.size() ; ++l){
- for (size_t i = 0 ; i < m ; ++i) {
- for (size_t j = 0 ; j < k ; ++j) {
- Abloc.setEntry(l,i*k+j,A[l].getEntry(i,j));
- }
+ FFLAS::fgemm(F,
+ FFLAS::FflasNoTrans, FFLAS::FflasNoTrans,
+ // m, k , n,
+ m,n,k,
+ F.one,
+ AEval.getPointer()+i*m*k, k, //lda
+ BEval.getPointer()+i*n*k, n, //ldb
+ F.zero,
+ TMatBloc.getWritePointer()+i*m*n, n);
}
}
- for (size_t l = 0 ; l < C.size() ; ++l){
- for (size_t i = 0 ; i < k ; ++i) {
- for (size_t j = 0 ; j < n ; ++j) {
- Bbloc.setEntry(l,i*n+j,B[l].getEntry(i,j));
+ typedef typename Zpz::Element Element;
+ std::vector<Element> minpoly_vector = GF.irreducible() ;
+ for (size_t i = 0 ; i < minpoly_vector.size(); ++i)
+ F.negin(minpoly_vector[i]);
+
+ // BlasSubmatrix<Zpz> CompMat(CMatBloc,0,0,l,l);
+ BlasMatrix<Zpz> CompMat(F,l,l);
+ for (size_t i = 0 ; i < e ; ++i) { // degree == l ?
+ CompMat.setEntry(i,i,F.one);
+ }
+ for (size_t j = 0 ; j < e-1 ; ++j) {
+ CompMat.setEntry(j,e,minpoly_vector[j]);
+ }
+ typename Zpz::Element coeff ;
+ typename Zpz::Element tmp_coeff, tmp_coeff2 ;
+ F.init(tmp_coeff);
+ for (size_t i = 1 ; i < e-1 ; ++i){
+ for (size_t j = 1 ; j < e+1 ; ++j) {
+ CompMat.setEntry(j, i + e, CompMat.getEntry((j-1),i - 1 + e) ) ;
+ }
+ if (!F.isZero(CompMat.getEntry(e,i+e))){
+ F.init(coeff, CompMat.getEntry( e, i + e) );
+ for(size_t j = 0 ; j < e-1 ; ++j){
+ F.mul(tmp_coeff, coeff,minpoly_vector[j]);
+ F.init(tmp_coeff2,CompMat.getEntry(j,i+e));
+ F.addin(tmp_coeff2, tmp_coeff);
+ CompMat.setEntry(j,i+e, tmp_coeff2 );
}
}
}
+ // BCK = ~FWD
+ // XXX some stuff here
+ FFLAS::fgemm(F,
+ FFLAS::FflasNoTrans, FFLAS::FflasNoTrans,
+ l, l, l, F.one,
+ CompMat.getPointer(), l,
+ iTC.getPointer(), l,
+ F.zero,
+ iEval.getWritePointer(), l);
+
+
+ // Y = [sum(BCK[i,j]*Y[j] for j in range(l)) for i in range(l)]
+ FFLAS::fgemm(F,
+ FFLAS::FflasNoTrans, FFLAS::FflasNoTrans,
+ e,m*n,l,
+ F.one,
+ iEval.getPointer(), l,
+ TMatBloc.getPointer(), m*n,
+ F.zero,
+ CMatBloc.getWritePointer(), m*n);
+ return CMatBloc;
- Protected::mul(Cbloc,Abloc,Bbloc,m,k,n,T);
+ }
+ }
- for (size_t l = 0 ; l < C.size() ; ++l){
- for (size_t i = 0 ; i < m ; ++i) {
- for (size_t j = 0 ; j < n ; ++j) {
- C[l].setEntry(i,j,Cbloc.getEntry(l,i*n+j));
- }
+ template<class Zpz, class GF>
+ std::vector<BlasMatrix<Zpz> >& mul (std::vector<BlasMatrix<Zpz> >& C,
+ const std::vector<BlasMatrix<Zpz> >& A,
+ const std::vector<BlasMatrix<Zpz> >& B,
+ const mulMethod::ToomCook<GF> & T)
+ {
+ size_t m = C[0].rowdim();
+ size_t k = B[0].rowdim();
+ size_t n = C[0].coldim();
+ const Zpz & F = C[0].field();
+ BlasMatrix<Zpz> Cbloc(F,C.size(),m*n);
+ BlasMatrix<Zpz> Abloc(F,C.size(),m*k);
+ BlasMatrix<Zpz> Bbloc(F,C.size(),k*n);
+ // convert
+ for (size_t l = 0 ; l < C.size() ; ++l){
+ for (size_t i = 0 ; i < m ; ++i) {
+ for (size_t j = 0 ; j < k ; ++j) {
+ Abloc.setEntry(l,i*k+j,A[l].getEntry(i,j));
}
}
- // convert back
}
- template<class Zpz>
- BlasMatrix<GivaroExtension<Zpz> >&
- mul (BlasMatrix<GivaroExtension<Zpz> >& C,
- const BlasMatrix<GivaroExtension<Zpz> >& A,
- const BlasMatrix<GivaroExtension<Zpz> >& B,
- const mulMethod::ToomCook<GivaroExtension<Zpz> > & T)
- {
- size_t m = C.rowdim();
- size_t k = B.rowdim();
- size_t n = C.coldim();
- Zpz F ( A.field().characteristic() ); // BaseField ?
- size_t e = (size_t) A.field().exponent();
- BlasMatrix<Zpz> Cbloc(F,e,m*n);
- BlasMatrix<Zpz> Abloc(F,e,m*k);
- BlasMatrix<Zpz> Bbloc(F,e,k*n);
-
-
- for (size_t l = 0 ; l < e ; ++l){
- for (size_t i = 0 ; i < m ; ++i) {
- for (size_t j = 0 ; j < k ; ++j) {
- if (l< A.getEntry(i,j).size())
- Abloc.setEntry(l,i*k+j,
- A.getEntry(i,j)[l]);
- }
+ for (size_t l = 0 ; l < C.size() ; ++l){
+ for (size_t i = 0 ; i < k ; ++i) {
+ for (size_t j = 0 ; j < n ; ++j) {
+ Bbloc.setEntry(l,i*n+j,B[l].getEntry(i,j));
}
}
- // for (size_t l = 0 ; l < e ; ++l){
- // std::cout << Abloc.getEntry(l,0) << ';';
- // }
- // std::cout << std::endl;
-
- for (size_t l = 0 ; l < e ; ++l){
- for (size_t i = 0 ; i < k ; ++i) {
- for (size_t j = 0 ; j < n ; ++j) {
- if (l< B.getEntry(i,j).size())
- Bbloc.setEntry(l,i*n+j,B.getEntry(i,j)[l]);
- }
+ }
+
+
+ Protected::mul(Cbloc,Abloc,Bbloc,m,k,n,T);
+
+ for (size_t l = 0 ; l < C.size() ; ++l){
+ for (size_t i = 0 ; i < m ; ++i) {
+ for (size_t j = 0 ; j < n ; ++j) {
+ C[l].setEntry(i,j,Cbloc.getEntry(l,i*n+j));
}
}
+ }
+ // convert back
+ }
+
+ template<class Zpz>
+ BlasMatrix<Givaro::Extension<Zpz> >&
+ mul (BlasMatrix<Givaro::Extension<Zpz> >& C,
+ const BlasMatrix<Givaro::Extension<Zpz> >& A,
+ const BlasMatrix<Givaro::Extension<Zpz> >& B,
+ const mulMethod::ToomCook<Givaro::Extension<Zpz> > & T)
+ {
+
+ size_t e = (size_t) A.field().exponent() ; // extension degree
+
+ size_t m = C.rowdim();
+ size_t k = B.rowdim();
+ size_t n = C.coldim();
+
+ Zpz F ( (Integer) A.field().characteristic() ); // BaseField ?
+
+
+ if (e == 1) {
+ BlasMatrix<Zpz> Af(A,F);
+ BlasMatrix<Zpz> Bf(B,F);
+ BlasMatrix<Zpz> Cf(C,F);
+ FFLAS::fgemm(F,
+ FFLAS::FflasNoTrans, FFLAS::FflasNoTrans,
+ // m, k , n,
+ m,n,k,
+ F.one,
+ Af.getPointer(), A.getStride(), //lda
+ Bf.getPointer(), B.getStride(), //ldb
+ F.zero,
+ Cf.getWritePointer(), C.getStride());
+ MatrixHom::map(C,Cf);
+ return C;
+ }
- // C.field().init(C.refEntry(0,0));
+ BlasMatrix<Zpz> Cbloc(F,e,m*n);
+ BlasMatrix<Zpz> Abloc(F,e,m*k);
+ BlasMatrix<Zpz> Bbloc(F,e,k*n);
- Protected::mul(Cbloc,Abloc,Bbloc,m,k,n,T);
- // convert back
- typedef typename GivaroExtension<Zpz>::Element Element ;
+ for (size_t l = 0 ; l < e ; ++l){
for (size_t i = 0 ; i < m ; ++i) {
+ for (size_t j = 0 ; j < k ; ++j) {
+ if (l< A.getEntry(i,j).size())
+ Abloc.setEntry(l,i*k+j,
+ A.getEntry(i,j)[l]);
+ }
+ }
+ }
+ // for (size_t l = 0 ; l < e ; ++l){
+ // std::cout << Abloc.getEntry(l,0) << ';';
+ // }
+ // std::cout << std::endl;
+
+ for (size_t l = 0 ; l < e ; ++l){
+ for (size_t i = 0 ; i < k ; ++i) {
for (size_t j = 0 ; j < n ; ++j) {
- Element x(e) ;
- for (size_t l = 0 ; l < e ; ++l){
- x[l] = Cbloc.getEntry(l,i*n+j);
- }
- C.field().polynomial_domain().modin(x,C.field().irreducible());
- // A.field().convert((Element&)C.refEntry(i,j),x);
- // A.field().init(x);
- C.setEntry(i,j,x);
+ if (l< B.getEntry(i,j).size())
+ Bbloc.setEntry(l,i*n+j,B.getEntry(i,j)[l]);
}
}
- // for (size_t l = 0 ; l < e ; ++l){
- // std::cout << Cbloc.getEntry(l,0) << ';';
- // }
- // std::cout << std::endl;
+ }
+
+ // C.field().init(C.refEntry(0,0));
+ Protected::mul(Cbloc,Abloc,Bbloc,m,k,n,T);
+ // convert back
+
+ typedef typename Givaro::Extension<Zpz>::Element Element ;
+ for (size_t i = 0 ; i < m ; ++i) {
+ for (size_t j = 0 ; j < n ; ++j) {
+ Element x(e) ;
+ for (size_t l = 0 ; l < e ; ++l){
+ x[l] = Cbloc.getEntry(l,i*n+j);
+ }
+ C.field().polynomial_domain().modin(x,C.field().irreducible());
+ // A.field().convert((Element&)C.refEntry(i,j),x);
+ // A.field().init(x);
+ C.setEntry(i,j,x);
+ }
}
+ // for (size_t l = 0 ; l < e ; ++l){
+ // std::cout << Cbloc.getEntry(l,0) << ';';
+ // }
+ // std::cout << std::endl;
+ //
+ return C ;
}
-}
+
+} // BLAS3
+} // LinBox
#endif // __LINBOX_matrix_blas3_mul_toomcook_INL
diff --git a/linbox/algorithms/matrix-blas3/mul.h b/linbox/algorithms/matrix-blas3/mul.h
index a65914d..1ebbf2a 100644
--- a/linbox/algorithms/matrix-blas3/mul.h
+++ b/linbox/algorithms/matrix-blas3/mul.h
@@ -1,5 +1,5 @@
/* Copyright (C) 2012 the members of the LinBox group
- * Written by B. Boyer < bboyer at imag.fr >
+ * Written by Brice Boyer (briceboyer) <boyer.brice at gmail.com>
*
* This file is part of the LinBox library.
*
@@ -32,8 +32,9 @@
#include <vector>
#include "linbox/integer.h"
-#include <linbox/field/givaro.h>
-#include <linbox/matrix/blas-matrix.h>
+#include <givaro/extension.h>
+#include <linbox/matrix/dense-matrix.h>
+
// Methods
@@ -54,6 +55,10 @@ namespace LinBox {
} ; //! Toom-Cook method.
struct naive {};
+
+ struct FLINT {};
+
+ struct CRA {} ;
}
}
}
@@ -74,7 +79,7 @@ namespace LinBox {
/** @brief Toom-Cook multiplication for GF(p^e)
* A matrix over GF(p^e) is represented by a polynomial of Z/pZ matrices.
- * @tparam Zpz is some modular field, GFq is GivaroExtension (or the like)
+ * @tparam Zpz is some modular field, GFq is Givaro::Extension (or the like)
* @param [out] C result
* @param A matrix
* @param B matrix
@@ -89,7 +94,7 @@ namespace LinBox {
/** @brief Toom-Cook multiplication for GF(p^e)
*
- * @tparam Zpz is some modular field, GFq is GivaroExtension (or the like)
+ * @tparam Zpz is some modular field, GFq is Givaro::Extension (or the like)
* @param [out] C result
* @param A matrix
* @param B matrix
@@ -97,11 +102,11 @@ namespace LinBox {
* @warning p should not be too small, and e>1 (you've been warned...)
*/
template<class Zpz>
- BlasMatrix<GivaroExtension<Zpz> >&
- mul (BlasMatrix<GivaroExtension<Zpz> >& C,
- const BlasMatrix<GivaroExtension<Zpz> >& A,
- const BlasMatrix<GivaroExtension<Zpz> >& B,
- const mulMethod::ToomCook<GivaroExtension<Zpz> > & T);
+ BlasMatrix<Givaro::Extension<Zpz> >&
+ mul (BlasMatrix<Givaro::Extension<Zpz> >& C,
+ const BlasMatrix<Givaro::Extension<Zpz> >& A,
+ const BlasMatrix<Givaro::Extension<Zpz> >& B,
+ const mulMethod::ToomCook<Givaro::Extension<Zpz> > & T);
#if 0 /* Generic method */
template<class ZpzMatrix>
@@ -142,6 +147,49 @@ namespace LinBox {
}
#include "linbox/algorithms/matrix-blas3/mul-naive.inl"
+// flint
+
+#ifdef __LINBOX_HAVE_FLINT
+namespace FLINT {
+ extern "C" {
+ // #include "longlong.h"
+#define __GMP_BITS_PER_MP_LIMB GMP_LIMB_BITS
+#include "flint/flint.h"
+#include "flint/fmpz_mat.h"
+ }
+}
+
+namespace LinBox {
+ namespace BLAS3 {
+
+ //! Wrapper to FLINT mat-mul
+ template<class DenseIntMat>
+ DenseIntMat &
+ mul (DenseIntMat& C,
+ const DenseIntMat& A,
+ const DenseIntMat& B,
+ const mulMethod::FLINT & );
+
+ }
+}
+#include "linbox/algorithms/matrix-blas3/mul-flint.inl"
+#endif // __LINBOX_HAVE_FLINT
+
+
+// CRA
+namespace LinBox {
+ namespace BLAS3 {
+ template<class DenseIntMat>
+ DenseIntMat &
+ mul (DenseIntMat& C,
+ const DenseIntMat& A,
+ const DenseIntMat& B,
+ const mulMethod::CRA & );
+
+ }
+}
+#include "linbox/algorithms/matrix-blas3/mul-cra.inl"
+
// <+other algo+>
namespace LinBox {
namespace BLAS3 {
diff --git a/linbox/algorithms/matrix-hom.h b/linbox/algorithms/matrix-hom.h
index d0cb9b0..af616e3 100644
--- a/linbox/algorithms/matrix-hom.h
+++ b/linbox/algorithms/matrix-hom.h
@@ -34,224 +34,85 @@
#ifndef __LINBOX_matrix_hom_H
#define __LINBOX_matrix_hom_H
+//! @bug it is dangerous to include matrices defs that include hom for their rebind...
#include "linbox/integer.h"
-#include "linbox/blackbox/sparse.h"
-#include "linbox/blackbox/compose.h"
-#include "linbox/blackbox/polynomial.h"
-#include "linbox/blackbox/scalar-matrix.h"
#include "linbox/field/hom.h"
#include "linbox/matrix/matrix-category.h"
-
+#include "linbox/matrix/dense-matrix.h"
+#include "linbox/matrix/sparse-matrix.h"
+#include "linbox/blackbox/blackbox.h"
+#include "linbox/vector/blas-vector.h"
namespace LinBox
{
- // try to map a blackbox over a homorphic ring
- // The most suitable type
- template <class Blackbox, class Field>
- struct MatrixHomTrait {
- //typedef ... FBlackbox
- // donot know
- typedef Blackbox value_type;
- };
-
-#if 0
- // Vector<Ring>::Sparse = Vector<Ring>::SparsePar
- template <class Ring, class Field>
- struct Convert<SparseMatrix<Ring, typename Vector<Ring>::Sparse>, Field> {
- typedef SparseMatrix<Field, typename Vector<Field>::Sparse> value_type;
- };
-#endif
-
- template <class Ring, class Field>
- struct MatrixHomTrait<SparseMatrix<Ring, typename Vector<Ring>::SparseSeq>, Field> {
- typedef SparseMatrix<Field, typename Vector<Field>::SparseSeq> value_type;
- };
-
- template <class Ring, class Field>
- struct MatrixHomTrait<SparseMatrix<Ring, typename Vector<Ring>::SparsePar>, Field> {
- typedef SparseMatrix<Field, typename Vector<Field>::SparsePar> value_type;
- };
-
- template <class Ring, class Field>
- struct MatrixHomTrait<SparseMatrix<Ring, typename Vector<Ring>::SparseMap>, Field> {
- typedef SparseMatrix<Field, typename Vector<Field>::SparseMap> value_type;
- };
-
- template <class Ring, class Field>
- struct MatrixHomTrait<BlasMatrix<Ring>, Field> {
- typedef BlasMatrix<Field> value_type;
- };
-
/// \brief Limited doc so far. Used in RationalSolver.
namespace MatrixHom
{
-
- //public:
-
- template<class FMatrix, class IMatrix>
- void map (FMatrix & Ap, const IMatrix& A)
- {
- typename IMatrix::template rebind<typename FMatrix::Field>()( Ap, A);
- }
-
- // construct a sparse matrix over finite field, such that Ap = A mod p, where F = Ring / <p>
- template<class Field, class Vect, class IMatrix>
- void map (SparseMatrix<Field, Vect> &Ap, const IMatrix& A, const Field &F);
-
- // construct a sparse matrix over finite field, such that Ap = A mod p, where F = Ring / <p>
- template<class Ring, class Vect1, class Field, class Vect2>
- void map (SparseMatrix<Field, Vect2>& Ap, const SparseMatrix<Ring, Vect1>& A)
- {
- typename SparseMatrix<Ring,Vect1>::template rebind<Field,Vect2>()( Ap, A);
- }
-
-
-
// function class to hanle map to BlasMatrix (needed to allow partial specialization)
template< class Field, class IMatrix, class Type>
class BlasMatrixMAP {
public:
- void operator() (BlasMatrix<Field> &Ap, const IMatrix& A, const Field& F, Type type);
+ template<class _Rep>
+ void operator() (BlasMatrix<Field,_Rep> &Ap, const IMatrix& A, Type type);
};
- // construct a BlasMatrix over finite fiel, such that Ap - A mod p, where F = Ring / <p>
-
- template<class Ring, class Field>
- void map (BlasMatrix<Field> &Ap, const BlasMatrix<Ring>& A )
- {
- typename BlasMatrix<Ring>::template rebind<Field>()( Ap, A);
- }
-
-
- template <class Field, class IMatrix>
- void map (BlasMatrix<Field> &Ap, const IMatrix &A, const Field &F)
- {
- BlasMatrixMAP<Field, IMatrix, typename MatrixContainerTrait<IMatrix>::Type> ()(Ap, A, F, typename MatrixContainerTrait<IMatrix>::Type());
- }
-
- template <class Field, class IPoly, class IMatrix>
- void map (PolynomialBB< typename IMatrix::template rebind<Field>::other,
- typename IPoly::template rebind<Field>::other> &Ap,
- const PolynomialBB<IMatrix, IPoly> &A, const Field & F)
- {
- typename PolynomialBB<IMatrix,IPoly>::template rebind<Field>() (Ap, A, F);
- }
-
- template <class Field, class Ring>
- void map (ScalarMatrix<Field> &Ap,
- const ScalarMatrix<Ring> &A)
- {
- typename ScalarMatrix<Ring>::template rebind<Field>() (Ap, A);
- }
-
- }
-
- template <class Field, class Vect, class IMatrix>
- void MatrixHom::map (SparseMatrix<Field, Vect> &Ap, const IMatrix& A, const Field &F)
- {
-
- // Ap = new SparseMatrix<Field, Vect>(F, A.rowdim(), A.coldim());
-
- typedef typename IMatrix::Field Ring;
-
- Ring r = A.field();
-
- typename Ring::Element one, zero;
-
- r. init(one, 1);
-
- r. init(zero, 0);
-
- std::vector<typename Ring::Element> e(A.coldim(), zero), tmp(A.rowdim());
-
- typename std::vector<typename Ring::Element>::iterator iter, e_p;
-
- typename Field::Element val;
-
- int i = 0;
-
- Hom<Ring, Field> hom(A. field(), F);
-
- for (e_p=e.begin();e_p != e.end(); ++e_p,i++){
- r.assign(*e_p, one);
- A.apply(tmp,e);
- int j;
- for (iter=tmp.begin(),j=0; iter != tmp.end(); ++iter,j++) {
- hom. image (val, *iter);
- if (!F.isZero(val))
- Ap.setEntry (j,i, val);
-
- }
- r.assign(*e_p, zero);
- }
-
- }
-
- namespace MatrixHom
- {
-
template<class Field, class IMatrix>
class BlasMatrixMAP<Field, IMatrix, MatrixContainerCategory::Blackbox> {
public:
- void operator() (BlasMatrix<Field> &Ap, const IMatrix &A, const Field &F, MatrixContainerCategory::Blackbox type)
+ template<class _Rep>
+ void operator() (BlasMatrix<Field,_Rep> &Ap, const IMatrix &A, MatrixContainerCategory::Blackbox type)
{
- // Ap = new BlasMatrix<Field>(F, A.rowdim(), A.coldim());
typedef typename IMatrix::Field Ring;
Ring r = A.field();
- typename Ring::Element one, zero;
- r. init(one, 1);
- r. init(zero, 0);
- std::vector<typename Ring::Element> e(A.coldim(), zero), tmp(A.rowdim());
+ std::vector<typename Ring::Element> e(A.coldim(), r.zero), tmp(A.rowdim());
- typename BlasMatrix<Field>::ColIterator col_p;
+ typename BlasMatrix<Field,_Rep>::ColIterator col_p;
- typename BlasMatrix<Field>::Col::iterator elt_p;
+ typename BlasMatrix<Field,_Rep>::Col::iterator elt_p;
typename std::vector<typename Ring::Element>::iterator e_p, tmp_p;
- Hom<Ring, Field> hom(A. field(), F);
+ Hom<Ring, Field> hom(A. field(), Ap.field());
for (col_p = Ap.colBegin(), e_p = e.begin();
e_p != e.end(); ++ col_p, ++ e_p) {
- r.assign(*e_p, one);
+ r.assign(*e_p, r.one);
A.apply (tmp, e);
for (tmp_p = tmp.begin(), elt_p = col_p -> begin();
tmp_p != tmp.end(); ++ tmp_p, ++ elt_p)
hom.image (*elt_p, *tmp_p);
- r.assign(*e_p, zero);
+ r.assign(*e_p, r.zero);
}
}
};
-
template<class Field, class IMatrix>
class BlasMatrixMAP<Field, IMatrix, MatrixContainerCategory::Container> {
public:
- void operator() (BlasMatrix<Field> &Ap, const IMatrix &A, const Field &F, MatrixContainerCategory::Container type)
+ template<class _Rep>
+ void operator() (BlasMatrix<Field,_Rep> &Ap, const IMatrix &A, MatrixContainerCategory::Container type)
{
- // Ap = new BlasMatrix<Field>(F, A.rowdim(), A.coldim());
- Hom<typename IMatrix::Field , Field> hom(A.field(), F);
- typename Field::Element e, zero;
- F.init(zero,0UL);
+ Hom<typename IMatrix::Field , Field> hom(A.field(), Ap.field());
+ typename Field::Element e;
for( typename IMatrix::ConstIndexedIterator indices = A.IndexedBegin();
(indices != A.IndexedEnd()) ;
++indices ) {
hom. image (e, A.getEntry(indices.rowIndex(),indices.colIndex()) );
- if (!F.isZero(e))
+ if (!Ap.field().isZero(e))
Ap.setEntry (indices.rowIndex(),
indices.colIndex(), e);
else
Ap.setEntry (indices.rowIndex(),
- indices.colIndex(), zero);
+ indices.colIndex(), Ap.field().zero);
}
}
@@ -260,32 +121,32 @@ namespace LinBox
template<class Field, class IMatrix>
class BlasMatrixMAP<Field, IMatrix, MatrixContainerCategory::BlasContainer> {
public:
- void operator() (BlasMatrix<Field> &Ap, const IMatrix &A, const Field &F, MatrixContainerCategory::BlasContainer type)
+ template<class _Rep>
+ void operator() (BlasMatrix<Field,_Rep> &Ap, const IMatrix &A, MatrixContainerCategory::BlasContainer type)
{
- //Ap = new BlasMatrix<Field>(F, A.rowdim(), A.coldim());
- Hom<typename IMatrix::Field , Field> hom(A.field(), F);
+ Hom<typename IMatrix::Field , Field> hom(A.field(), Ap.field());
typename IMatrix::ConstIterator iterA = A.Begin();
- typename BlasMatrix<Field>::Iterator iterAp = Ap.Begin();
+ typename BlasMatrix<Field,_Rep>::Iterator iterAp = Ap.Begin();
- for(; iterA != A.End(); iterA++, iterAp++)
+ for(; iterA != A.End(); ++iterA, ++iterAp)
hom. image (*iterAp, *iterA);
}
};
- template<class Field>
- class BlasMatrixMAP<Field, BlasMatrix<PID_integer>, MatrixContainerCategory::BlasContainer> {
+ template<class Field, class _Rep>
+ class BlasMatrixMAP<Field, BlasMatrix<Givaro::ZRing<Integer>,_Rep>, MatrixContainerCategory::BlasContainer> {
public:
- void operator() (BlasMatrix<Field> &Ap, const BlasMatrix<PID_integer> &A, const Field &F, MatrixContainerCategory::BlasContainer type)
+ template<class _Rep2>
+ void operator() (BlasMatrix<Field,_Rep2> &Ap, const BlasMatrix<Givaro::ZRing<Integer>,_Rep> &A, MatrixContainerCategory::BlasContainer type)
{
- //Ap = new BlasMatrix<Field>(F, A.rowdim(), A.coldim());
- PID_integer ZZ ;
- Hom<PID_integer , Field> hom(ZZ, F);
+ Givaro::ZRing<Integer> ZZ ;
+ Hom<Givaro::ZRing<Integer> , Field> hom(ZZ, Ap.field());
- typename BlasMatrix<PID_integer>::ConstIterator iterA = A.Begin();
- typename BlasMatrix<Field>::Iterator iterAp = Ap.Begin();
+ typename BlasMatrix<Givaro::ZRing<Integer>,_Rep>::ConstIterator iterA = A.Begin();
+ typename BlasMatrix<Field,_Rep2>::Iterator iterAp = Ap.Begin();
- for(; iterA != A.End(); iterA++, iterAp++)
+ for(; iterA != A.End(); ++iterA, ++iterAp)
hom. image (*iterAp, *iterA);
}
};
@@ -294,38 +155,123 @@ namespace LinBox
template< class IMatrix>
class BlasMatrixMAP<MultiModDouble, IMatrix, MatrixContainerCategory::BlasContainer > {
public:
- void operator() (BlasMatrix<MultiModDouble> &Ap, const IMatrix &A, const MultiModDouble &F, MatrixContainerCategory::BlasContainer type)
+ template<class _Rep>
+ void operator() (BlasMatrix<MultiModDouble,_Rep> &Ap, const IMatrix &A, MatrixContainerCategory::BlasContainer type)
{
- // Ap = new BlasMatrix<MultiModDouble>(F, A.rowdim(), A.coldim());
- for (size_t i=0; i<F.size();++i)
- MatrixHom::map(Ap.getMatrix(i), A, F.getBase(i));
+ for (size_t i=0; i<Ap.field().size();++i)
+ MatrixHom::map(Ap.getMatrix(i), A);
}
};
template< class IMatrix>
class BlasMatrixMAP<MultiModDouble, IMatrix, MatrixContainerCategory::Container > {
public:
- void operator() (BlasMatrix<MultiModDouble> &Ap, const IMatrix &A, const MultiModDouble &F, MatrixContainerCategory::Container type)
+ template<class _Rep>
+ void operator() (BlasMatrix<MultiModDouble,_Rep> &Ap, const IMatrix &A, MatrixContainerCategory::Container type)
{
- // Ap = new BlasMatrix<MultiModDouble>(F, A.rowdim(), A.coldim());
- for (size_t i=0; i<F.size();++i)
- MatrixHom::map(Ap.getMatrix(i), A, F.getBase(i));
+ for (size_t i=0; i<Ap.field().size();++i)
+ MatrixHom::map(Ap.getMatrix(i), A);
}
};
template< class IMatrix>
class BlasMatrixMAP<MultiModDouble, IMatrix, MatrixContainerCategory::Blackbox > {
public:
- void operator() (BlasMatrix<MultiModDouble> &Ap, const IMatrix &A, const MultiModDouble &F, MatrixContainerCategory::Blackbox type)
+ template<class _Rep>
+ void operator() (BlasMatrix<MultiModDouble,_Rep> &Ap, const IMatrix &A, MatrixContainerCategory::Blackbox type)
{
- // Ap = new BlasMatrix<MultiModDouble>(F, A.rowdim(), A.coldim());
- for (size_t i=0; i<F.size();++i)
- MatrixHom::map(Ap.getMatrix(i), A, F.getBase(i));
+ for (size_t i=0; i<Ap.field().size();++i)
+ MatrixHom::map(Ap.getMatrix(i), A);
}
};
#endif
- }
-}
+ } // MatrixHom
+
+ namespace MatrixHom
+ {
+
+
+ template<class FMatrix, class IMatrix>
+ void map (FMatrix & Ap, const IMatrix& A)
+ {
+ typename IMatrix::template rebind<typename FMatrix::Field>()( Ap, A);
+ }
+
+ // construct a sparse matrix over finite field, such that Ap = A mod p, where F = Ring / <p>
+ template<class Ring, class Vect1, class Field, class Vect2>
+ void map (SparseMatrix<Field, Vect2>& Ap, const SparseMatrix<Ring, Vect1>& A)
+ {
+ // typename SparseMatrix<Ring,Vect1>::template rebind<Field, typename SparseVectorTranslate<Field,Vect2>::other_t >()( Ap, A);
+ typename SparseMatrix<Ring,Vect1>::template rebind<Field,Vect2>()( Ap, A);
+ }
+
+
+ // construct a BlasMatrix over finite field, such that Ap - A mod p, where F = Ring / <p>
+ template<class Ring, class Field, class _Rep>
+ void map (BlasMatrix<Field,_Rep> &Ap, const BlasMatrix<Ring,_Rep>& A )
+ {
+ typename BlasMatrix<Ring,_Rep>::template rebind<Field>()( Ap, A);
+ }
+
+ template <class Field, class IMatrix, class _Rep>
+ void map (BlasMatrix<Field,_Rep> &Ap, const IMatrix &A)
+ {
+ BlasMatrixMAP<Field, IMatrix, typename MatrixContainerTrait<IMatrix>::Type> ()(Ap, A, typename MatrixContainerTrait<IMatrix>::Type());
+ }
+
+ template <class Field, class IPoly, class IMatrix>
+ void map (PolynomialBB< typename IMatrix::template rebind<Field>::other,
+ typename IPoly::template rebind<Field>::other> &Ap,
+ const PolynomialBB<IMatrix, IPoly> &A)
+ {
+ typename PolynomialBB<IMatrix,IPoly>::template rebind<Field>() (Ap, A);
+ }
+
+ template <class Field, class Ring>
+ void map (ScalarMatrix<Field> &Ap,
+ const ScalarMatrix<Ring> &A)
+ {
+ typename ScalarMatrix<Ring>::template rebind<Field>() (Ap, A);
+ }
+
+ // construct a sparse matrix over finite field, such that Ap = A mod p, where F = Ring / <p>
+ template <class Field, class Vect, class IMatrix>
+ void map (SparseMatrix<Field, Vect> &Ap, const IMatrix& A)
+ {
+
+ typedef typename IMatrix::Field Ring;
+
+ Ring r = A.field();
+
+ BlasVector<Ring> e(r,A.coldim()), tmp(r,A.rowdim());
+
+ typename BlasVector<Ring>::iterator iter, e_p;
+
+ typename Field::Element val;
+
+ int i = 0;
+
+ Hom<Ring, Field> hom(A. field(), Ap.field());
+
+ for (e_p=e.begin();e_p != e.end(); ++e_p,++i){
+ r.assign(*e_p, r.one);
+ A.apply(tmp,e);
+ int j;
+ for (iter=tmp.begin(),j=0; iter != tmp.end(); ++iter,++j) {
+ hom. image (val, *iter);
+ if (!Ap.field().isZero(val))
+ Ap.setEntry ((size_t)j,(size_t)i, val);
+
+ }
+ r.assign(*e_p, r.zero);
+ }
+
+ }
+
+
+ } // MatrixHom
+
+} // LinBox
#endif //__LINBOX_matrix_hom_H
diff --git a/linbox/algorithms/matrix-inverse.h b/linbox/algorithms/matrix-inverse.h
index 9d537d6..23e2281 100644
--- a/linbox/algorithms/matrix-inverse.h
+++ b/linbox/algorithms/matrix-inverse.h
@@ -55,6 +55,7 @@ namespace LinBox
//typedef typename AnyDenseMatrix::Field Field;
// step1 PLU Inplcae, actually, LPA = U.
+ // XXX Permutation
std::vector<std::pair<int,int> > P;
P.reserve (A.rowdim());
@@ -128,33 +129,29 @@ namespace LinBox
//2a compute inverse of PA, by solving upper-triangeular system, PA = U^{-1} L.
- typename Field::Element Zero;
- typename Field::Element N_one;
- F.init(Zero,0);
- F.init(N_one, -1);
offset = 0;
for(cur_c = A.colBegin();cur_c != A. colEnd(); ++ cur_c, ++ offset) {
for (cur_cp = cur_c -> begin();
cur_cp != cur_c -> begin() + offset; ++ cur_cp)
- F.assign (*cur_cp, Zero);
+ F.assign (*cur_cp, F.zero);
- F.assign(*cur_cp, N_one); ++ cur_cp;
+ F.assign(*cur_cp, F.mOne); ++ cur_cp;
for (; cur_cp != cur_c -> end(); ++ cur_cp)
F.negin(*cur_cp);
//matrix is indexed by 0, instead of 1.
- for (cur_cp = cur_c -> begin() + (A.rowdim() - 1),
+ for (cur_cp = cur_c -> begin() + (ptrdiff_t)(A.rowdim() - 1),
tmp_r = tmp.rowBegin() + ( (int)A.rowdim() - 1);
cur_cp != cur_c -> begin() - 1;
-- cur_cp, -- tmp_r) {
F.assign (tmp_e, *cur_cp);
- for(tmp_cp = cur_c -> begin() + (A.rowdim() - 1), tmp_rp = tmp_r -> begin() + ( A.rowdim() -1);
+ for(tmp_cp = cur_c -> begin() + (ptrdiff_t) (A.rowdim() - 1), tmp_rp = tmp_r -> begin() + (ptrdiff_t) ( A.rowdim() -1);
tmp_cp != cur_cp; -- tmp_cp, -- tmp_rp)
F.axpyin(tmp_e, *tmp_cp, *tmp_rp);
diff --git a/linbox/algorithms/matrix-rank.h b/linbox/algorithms/matrix-rank.h
index 359adf9..4fb0cba 100644
--- a/linbox/algorithms/matrix-rank.h
+++ b/linbox/algorithms/matrix-rank.h
@@ -32,7 +32,7 @@
#define __LINBOX_matrix_rank_H
#include "linbox/util/debug.h"
-#include "linbox/blackbox/sparse.h"
+#include "linbox/matrix/sparse-matrix.h"
#include "linbox/solutions/rank.h"
#include "linbox/algorithms/matrix-hom.h"
@@ -77,11 +77,13 @@ namespace LinBox
long rank(const IMatrix& A) const
{
+ rp.template setBitsField<Field>();
+
Field F ((unsigned long)*rp);
BlasMatrix<Field> Ap(F, A.rowdim(), A.coldim());
- MatrixHom::map(Ap, A, F);
+ MatrixHom::map(Ap, A);
long result;
@@ -100,12 +102,14 @@ namespace LinBox
long rank(const BlasMatrix<IRing>& A) const
{
- Field F ((unsigned long)*rp);
+ rp.template setBitsField<_Field>();
+
+ Field F ((integer)*rp);
//! bug the following should work :
// BlasMatrix<Field> Ap(F,A);
BlasMatrix<Field> Ap(F, A.rowdim(), A.coldim());
- MatrixHom::map(Ap, A, F);
+ MatrixHom::map(Ap, A);
long result;
@@ -125,6 +129,7 @@ namespace LinBox
template <class Row>
long rank(const SparseMatrix<Ring, Row>& A) const
{
+ rp.template setBitsField<Field>();
Field F (*rp);
typename SparseMatrix<Ring, Row>::template rebind<Field>::other Ap(A, F);
@@ -231,7 +236,7 @@ namespace LinBox
LinBox::rank(result, A, A.field());
- return result;
+ return (long)result;
}
};
diff --git a/linbox/algorithms/mg-block-lanczos.h b/linbox/algorithms/mg-block-lanczos.h
index c65b900..37b17a9 100644
--- a/linbox/algorithms/mg-block-lanczos.h
+++ b/linbox/algorithms/mg-block-lanczos.h
@@ -39,6 +39,7 @@
#include "linbox/vector/vector-domain.h"
#include "linbox/blackbox/archetype.h"
#include "linbox/solutions/methods.h"
+#include "linbox/matrix/dense-matrix.h"
// I'm putting everything inside the LinBox namespace so that I can drop all of
// this in to LinBox easily at a later date, without any messy porting.
@@ -46,6 +47,7 @@
namespace LinBox
{
+
/** \brief Block Lanczos iteration
*
* This is a blocked version of the iteration given in @ref LanczosSolver. The
@@ -62,7 +64,7 @@ namespace LinBox
* Currently, only dense vectors are supported for this iteration, and it is
* unlikely any other vector archetypes will be supported in the future.
*/
- template <class Field, class Matrix = BlasMatrix<typename Field::Element> >
+ template <class Field, class Matrix = BlasMatrix<Field,typename RawVector<typename Field::Element >::Dense> >
class MGBlockLanczosSolver {
public:
@@ -74,10 +76,11 @@ namespace LinBox
* options for the solver
*/
MGBlockLanczosSolver (const Field &F, const BlockLanczosTraits &traits) :
- _traits (traits), _field (F), _VD (F), _MD (F), _randiter (F), _block (traits.blockingFactor ())
+ _traits (traits), _field (&F), _VD (F), _MD (F), _randiter (F)
+ ,_AV(F)
+ , _block (traits.blockingFactor ())
{
init_temps ();
- _field.init (_one, 1);
}
/** Constructor with a random iterator
@@ -87,10 +90,11 @@ namespace LinBox
* @param r Random iterator to use for randomization
*/
MGBlockLanczosSolver (const Field &F, const BlockLanczosTraits &traits, typename Field::RandIter r) :
- _traits (traits), _field (F), _VD (F), _MD (F), _randiter (r), _block (traits.blockingFactor ())
+ _traits (traits), _field (&F), _VD (F), _MD (F), _randiter (r)
+ ,_AV(F)
+ , _block (traits.blockingFactor ())
{
init_temps ();
- _field.init (_one, 1);
}
/** Solve the linear system Ax = b.
@@ -218,20 +222,25 @@ namespace LinBox
// Initialize the temporaries used in computation
void init_temps ();
+ // are we public?
+ inline const Field & field() const { return *_field; }
+
// Private variables
const BlockLanczosTraits _traits;
- const Field &_field;
+ const Field *_field;
VectorDomain<Field> _VD;
MatrixDomain<Field> _MD;
typename Field::RandIter _randiter;
// Temporaries used in the computation
- Matrix _matV[3]; // n x N
+ // Matrix _matV[3]; // n x N
+ std::vector<Matrix> _matV;
Matrix _AV; // n x N
Matrix _VTAV; // N x N
- Matrix _Winv[2]; // N x N
+ // Matrix _Winv[2]; // N x N
+ std::vector<Matrix> _Winv ;
Matrix _AVTAVSST_VTAV; // N x N
Matrix _matT; // N x N
Matrix _DEF; // N x N
@@ -244,7 +253,6 @@ namespace LinBox
mutable Matrix _tmp; // N x <=N
mutable Matrix _tmp1; // N x <=N
- typename Field::Element _one;
std::vector<size_t> _indices; // N
@@ -286,11 +294,11 @@ namespace LinBox
#endif // __LINBOX_mg_block_lanczos_H
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
// Local Variables:
// mode: C++
// tab-width: 8
// indent-tabs-mode: nil
// c-basic-offset: 8
// End:
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/algorithms/mg-block-lanczos.inl b/linbox/algorithms/mg-block-lanczos.inl
index 8a5566a..8d305b1 100644
--- a/linbox/algorithms/mg-block-lanczos.inl
+++ b/linbox/algorithms/mg-block-lanczos.inl
@@ -38,7 +38,7 @@
#include "linbox/blackbox/diagonal.h"
#include "linbox/blackbox/compose.h"
#include "linbox/blackbox/transpose.h"
-#include "linbox/randiter/nonzero.h"
+#include <givaro/givranditer.h>
#include "linbox/util/commentator.h"
#include "linbox/util/timer.h"
#include "linbox/algorithms/mg-block-lanczos.h"
@@ -136,7 +136,8 @@ namespace LinBox
commentator().start ("Solving linear system (Montgomery's block Lanczos)", "MGBlockLanczosSolver::solve");
bool success = false;
- Vector d1, d2, b1, b2, bp, y, Ax, ATAx, ATb;
+ Field F = A.field();
+ Vector d1(F), d2(F), b1(F), b2(F), bp(F), y(F), Ax(F), ATAx(F), ATb(F);
// Get the temporaries into the right sizes
_b.resize (b.size (), 1);
@@ -150,8 +151,8 @@ namespace LinBox
_matV[2].resize (A.coldim (), _block);
_AV.resize (A.coldim (), _block);
- NonzeroRandIter<Field> real_ri (_field, _randiter);
- RandomDenseStream<Field, Vector, NonzeroRandIter<Field> > stream (_field, real_ri, A.coldim ());
+ Givaro::GeneralRingNonZeroRandIter<Field> real_ri (_randiter);
+ RandomDenseStream<Field, Vector, Givaro::GeneralRingNonZeroRandIter<Field> > stream (field(), real_ri, A.coldim ());
for (unsigned int i = 0; !success && i < _traits.maxTries (); ++i) {
std::ostream &report = commentator().report (Commentator::LEVEL_UNIMPORTANT, INTERNAL_DESCRIPTION);
@@ -188,7 +189,7 @@ namespace LinBox
VectorWrapper::ensureDim (y, A.coldim ());
stream >> d1;
- Diagonal<Field> D (_field, d1);
+ Diagonal<Field> D (d1);
Compose<Blackbox, Diagonal<Field> > B (&A, &D);
report << "Random D: ";
@@ -215,7 +216,7 @@ namespace LinBox
typedef Compose<PC2, CO1> CO2;
stream >> d1;
- PC1 D (_field, d1);
+ PC1 D (d1);
PC2 AT (&A);
CO1 B1 (&D, &A);
CO2 B (&AT, &B1);
@@ -250,8 +251,8 @@ namespace LinBox
typedef Compose<PC1, CO3> CO4;
stream >> d1 >> d2;
- PC1 D1 (_field, d1);
- PC1 D2 (_field, d2);
+ PC1 D1 (d1);
+ PC1 D2 (d2);
PC2 AT (&A);
CO1 B1 (&A, &D1);
CO2 B2 (&D2, &B1);
@@ -339,7 +340,6 @@ namespace LinBox
unsigned int number = 0;
- bool success;
typename LinBox::Vector<Field>::Dense d1, d2;
@@ -358,18 +358,19 @@ namespace LinBox
typename Matrix::ColIterator xi = x.colBegin ();
- NonzeroRandIter<Field> real_ri (_field, _randiter);
- RandomDenseStream<Field, typename LinBox::Vector<Field>::Dense, NonzeroRandIter<Field> > d_stream (_field, real_ri, A.coldim ());
+ Givaro::GeneralRingNonZeroRandIter<Field> real_ri (_randiter);
+ RandomDenseStream<Field, typename LinBox::Vector<Field>::Dense, Givaro::GeneralRingNonZeroRandIter<Field> > d_stream (field(), real_ri, A.coldim ());
TransposeMatrix<Matrix> bT (_b);
TransposeMatrix<Matrix> xT (_x);
for ( unsigned int i = 0; number < x.coldim () && i < _traits.maxTries (); ++i) {
+ // bool success;
std::ostream &report = commentator().report (Commentator::LEVEL_UNIMPORTANT, INTERNAL_DESCRIPTION);
report << "in try: " << i << std::endl;
// Fill y with random data
- RandomDenseStream<Field, typename Matrix::Col> stream (_field, _randiter, A.coldim ());
+ RandomDenseStream<Field, typename Matrix::Col> stream (field(), _randiter, A.coldim ());
typename Matrix::ColIterator iter;
for (iter = _y.colBegin (); iter != _y.colEnd (); ++iter)
@@ -380,7 +381,8 @@ namespace LinBox
switch (_traits.preconditioner ()) {
case BlockLanczosTraits::NO_PRECONDITIONER:
- success = iterate (A);
+ // success =
+ iterate (A);
break;
case BlockLanczosTraits::SYMMETRIZE:
@@ -391,7 +393,8 @@ namespace LinBox
_MD.blackboxMulRight (xT, transpose (_b), A);
_MD.copy (_b, _x);
- success = iterate (B);
+ // success =
+ iterate (B);
break;
}
@@ -400,13 +403,14 @@ namespace LinBox
VectorWrapper::ensureDim (d1, A.coldim ());
d_stream >> d1;
- Diagonal<Field> D (_field, d1);
+ Diagonal<Field> D (field(), d1);
Compose<Blackbox, Diagonal<Field> > B (&A, &D);
report << "Random D: ";
_VD.write (report, d1) << std::endl;
- success = iterate (B);
+ // success =
+ iterate (B);
_MD.blackboxMulLeft (_b, D, _x);
_MD.copy (_x, _b);
@@ -424,7 +428,7 @@ namespace LinBox
typedef Compose<PC2, CO1> CO2;
d_stream >> d1;
- PC1 D (_field, d1);
+ PC1 D (field(), d1);
PC2 AT (&A);
CO1 B1 (&D, &A);
CO2 B (&AT, &B1);
@@ -435,7 +439,8 @@ namespace LinBox
_MD.blackboxMulLeft (_x, D, _b);
_MD.blackboxMulRight (bT, transpose (_x), A);
- success = iterate (B);
+ // success =
+ iterate (B);
break;
}
@@ -453,8 +458,8 @@ namespace LinBox
typedef Compose<PC1, CO3> CO4;
d_stream >> d1 >> d2;
- PC1 D1 (_field, d1);
- PC1 D2 (_field, d2);
+ PC1 D1 (field(), d1);
+ PC1 D2 (field(), d2);
PC2 AT (&A);
CO1 B1 (&A, &D1);
CO2 B2 (&D2, &B1);
@@ -472,7 +477,8 @@ namespace LinBox
_MD.blackboxMulLeft (_x, D1, _b);
_MD.copy (_b, _x);
- success = iterate (B);
+ // success =
+ iterate (B);
_MD.blackboxMulLeft (_b, D1, _x);
_MD.copy (_x, _b);
@@ -533,7 +539,7 @@ namespace LinBox
// i is the index for temporaries where we need to go back to i - 1
// j is the index for temporaries where we need to go back to j - 2
- int i = 0, j = 2, next_j, prev_j = 1, iter = 2;
+ int i = 0, j = 2, prev_j = 1, iter = 2;
typename Matrix::ColIterator k;
TIMER_DECLARE(AV);
@@ -545,7 +551,7 @@ namespace LinBox
TIMER_DECLARE(terminationCheck);
// Get a random fat vector _matV[0]
- RandomDenseStream<Field, typename Matrix::Col> stream (_field, _randiter, A.coldim ());
+ RandomDenseStream<Field, typename Matrix::Col> stream (field(), _randiter, A.coldim ());
for (k = _matV[0].colBegin (); k != _matV[0].colEnd (); ++k)
stream >> *k;
@@ -565,7 +571,7 @@ namespace LinBox
TIMER_STOP(innerProducts);
TIMER_START(Winv);
- Ni = compute_Winv_S (_Winv[0], _vecS, _VTAV);
+ Ni = (size_t)compute_Winv_S (_Winv[0], _vecS, _VTAV);
TIMER_STOP(Winv);
// Check for catastrophic breakdown
@@ -646,7 +652,7 @@ namespace LinBox
TIMER_STOP(innerProducts);
TIMER_START(Winv);
- Ni = compute_Winv_S (_Winv[1], _vecS, _VTAV);
+ Ni = (size_t)compute_Winv_S (_Winv[1], _vecS, _VTAV);
TIMER_STOP(Winv);
// Check for catastrophic breakdown
@@ -709,7 +715,7 @@ namespace LinBox
if (done) break;
- next_j = j + 1;
+ int next_j = j + 1;
if (next_j > 2) next_j = 0;
TIMER_START(AV);
@@ -734,7 +740,7 @@ namespace LinBox
TIMER_STOP(innerProducts);
TIMER_START(Winv);
- Ni = compute_Winv_S (_Winv[i], _vecS, _VTAV);
+ Ni = (size_t)compute_Winv_S (_Winv[i], _vecS, _VTAV);
TIMER_STOP(Winv);
// Check for catastrophic breakdown
@@ -751,10 +757,10 @@ namespace LinBox
#endif
// MGBLTraceReport (report, _MD, "AV", iter, _AV);
- MGBLTraceReport (report, _MD, "F", iter + 1, _DEF);
- MGBLTraceReport (report, _MD, "V^T AV", iter, _VTAV);
- MGBLTraceReport (report, _MD, "Winv", iter, _Winv[i]);
- reportS (report, _vecS, iter);
+ MGBLTraceReport (report, _MD, "F", (size_t)iter + 1, _DEF);
+ MGBLTraceReport (report, _MD, "V^T AV", (size_t)iter, _VTAV);
+ MGBLTraceReport (report, _MD, "Winv", (size_t)iter, _Winv[i]);
+ reportS (report, _vecS, (size_t)iter);
// Now that we have S_i, finish off with F_i+1
TIMER_START(orthogonalization);
@@ -776,7 +782,7 @@ namespace LinBox
mul (_AVTAVSST_VTAV, transpose (_AV), _AV, _vecS);
TIMER_STOP(innerProducts);
- MGBLTraceReport (report, _MD, "V^T A^2 V", iter, _AVTAVSST_VTAV);
+ MGBLTraceReport (report, _MD, "V^T A^2 V", (size_t)iter, _AVTAVSST_VTAV);
TIMER_START(orthogonalization);
_MD.addin (_AVTAVSST_VTAV, _VTAV);
@@ -786,14 +792,14 @@ namespace LinBox
addIN (_DEF);
_MD.axpyin (_matV[next_j], _matV[j], _DEF);
- MGBLTraceReport (report, _MD, "D", iter + 1, _DEF);
+ MGBLTraceReport (report, _MD, "D", (size_t)iter + 1, _DEF);
// Compute E and update V_i+1
mul (_DEF, _Winv[1 - i], _VTAV, _vecS);
_MD.axpyin (_matV[next_j], _matV[prev_j], _DEF);
TIMER_STOP(orthogonalization);
- MGBLTraceReport (report, _MD, "E", iter + 1, _DEF);
+ MGBLTraceReport (report, _MD, "E", (size_t)iter + 1, _DEF);
// Add AV_i S_i S_i^T
TIMER_START(Vnext);
@@ -801,10 +807,10 @@ namespace LinBox
TIMER_STOP(Vnext);
// MGBLTraceReport (report, _MD, "V", iter + 1, _matV[next_j]);
- checkAConjugacy (_MD, _AV, _matV[next_j], _DEF, iter, iter + 1);
+ checkAConjugacy (_MD, _AV, _matV[next_j], _DEF, (size_t)iter, (size_t)iter + 1);
#ifdef MGBL_DETAILED_TRACE
- checkAConjugacy (_MD, AV1_backup, _matV[next_j], _DEF, 1, iter + 1);
+ checkAConjugacy (_MD, AV1_backup, _matV[next_j], _DEF, 1, (size_t)iter + 1);
#endif
i = 1 - i;
@@ -812,8 +818,8 @@ namespace LinBox
j = next_j;
++iter;
- if (!(iter % progress_interval))
- commentator().progress (total_dim);
+ if (!(iter % (int)progress_interval))
+ commentator().progress ((long)total_dim);
if (total_dim > A.rowdim ()) {
commentator().report (Commentator::LEVEL_IMPORTANT, INTERNAL_ERROR)
@@ -863,8 +869,10 @@ namespace LinBox
_MD.write (report, T);
#endif
- BlasMatrix<Field> M1 (_matM, 0, 0, T.rowdim (), T.coldim ());
- BlasMatrix<Field> M2 (_matM, 0, T.coldim (), T.rowdim (), T.coldim ());
+ // BlasMatrix<Field> M1 (_matM, 0, 0, T.rowdim (), T.coldim ());
+ Matrix M1 (_matM, 0, 0, T.rowdim (), T.coldim ());
+ // BlasMatrix<Field> M2 (_matM, 0, T.coldim (), T.rowdim (), T.coldim ());
+ Matrix M2 (_matM, 0, T.coldim (), T.rowdim (), T.coldim ());
_MD.copy (M1, T);
setIN (M2);
@@ -897,7 +905,7 @@ namespace LinBox
S[_indices[row]] = true; // Use column j of V_i in W_i
// Give the (j, j) entry unity
- _field.inv (Mjj_inv, _matM.getEntry (_indices[row], _indices[row]));
+ field().inv (Mjj_inv, _matM.getEntry (_indices[row], _indices[row]));
_VD.mulin (*(_matM.rowBegin () + (int)_indices[row]), Mjj_inv);
// Zero the rest of the column j
@@ -919,10 +927,10 @@ namespace LinBox
const typename Field::Element &Mjj = _matM.refEntry (_indices[row], _indices[row] + _block);
- linbox_check (!_field.isZero (Mjj));
+ linbox_check (!field().isZero (Mjj));
// Zero the rest of the column j + N
- eliminate_col (_matM, row, (int)_block, _indices, _field.inv (Mjj_inv, Mjj));
+ eliminate_col (_matM, row, (int)_block, _indices, field().inv (Mjj_inv, Mjj));
// Zero row j
_VD.subin (*(_matM.rowBegin () + (int)_indices[row]), *(_matM.rowBegin () + (int)_indices[row]));
@@ -1028,7 +1036,7 @@ namespace LinBox
if (*l)
_VD.dot (*k, *i, *j);
else
- _field.subin (*k, *k);
+ field().subin (*k, *k);
}
_VD.copy (*i, tmp);
@@ -1093,7 +1101,7 @@ namespace LinBox
size_t idx = 0;
for (i = A.rowBegin (); i != A.rowEnd (); ++i, ++idx)
- _field.addin ((*i)[idx], _one);
+ field().addin ((*i)[idx], field().one);
return A;
}
@@ -1153,7 +1161,7 @@ namespace LinBox
for (i = A.rowBegin (), i_idx = 0; i != A.rowEnd (); ++i, ++i_idx) {
_VD.subin (*i, *i);
- _field.assign ((*i)[i_idx], _one);
+ field().assign ((*i)[i_idx], field().one);
}
return A;
@@ -1181,7 +1189,7 @@ namespace LinBox
row_vec = *(_matM.rowBegin () + (int)indices[row]);
for (idx = row; idx < A.rowdim (); ++idx) {
- if (!_field.isZero (A.getEntry (indices[idx], indices[row] + col_offset))) {
+ if (!field().isZero (A.getEntry (indices[idx], indices[row] + (size_t)col_offset))) {
if (idx != row) {
typename Matrix::Row row1 = *(A.rowBegin () + (int)indices[idx]);
std::swap_ranges (row_vec.begin (), row_vec.end (), row1.begin ());
@@ -1205,23 +1213,24 @@ namespace LinBox
// I'm assuming everything left of the column with the index of the pivot row is 0
size_t row;
- typename BlasMatrix<Field>::Row pivot_row;
+ // typename BlasMatrix<Field>::Row pivot_row;
+ typename Matrix::Row pivot_row;
typename Field::Element p;
pivot_row = *(A.rowBegin () + (int)indices[pivot]);
for (row = 0; row < pivot; ++row) {
- const typename Field::Element &Aij = A.getEntry (indices[row], indices[pivot] + col_offset);
+ const typename Field::Element &Aij = A.getEntry (indices[row], indices[pivot] + (size_t)col_offset);
- if (!_field.isZero (Aij))
- _VD.axpyin (*(A.rowBegin () +(int) indices[row]), _field.neg (p, Aij), pivot_row);
+ if (!field().isZero (Aij))
+ _VD.axpyin (*(A.rowBegin () +(int) indices[row]), field().neg (p, Aij), pivot_row);
}
for (++row; row < A.rowdim (); ++row) {
- const typename Field::Element &Aij = A.getEntry (indices[row], indices[pivot] + col_offset);
+ const typename Field::Element &Aij = A.getEntry (indices[row], indices[pivot] + (size_t)col_offset);
- if (!_field.isZero (Aij))
- _VD.axpyin (*(A.rowBegin () + (int) indices[row]), _field.neg (p, Aij), pivot_row);
+ if (!field().isZero (Aij))
+ _VD.axpyin (*(A.rowBegin () + (int) indices[row]), field().neg (p, Aij), pivot_row);
}
}
@@ -1248,21 +1257,18 @@ namespace LinBox
{
linbox_check (M.rowdim () == M.coldim ());
- typename Field::Element neg_one;
-
- _field.init (neg_one, -1);
size_t i, j;
for (i = 0; i < M.rowdim (); ++i) {
for (j = 0; j < M.coldim (); ++j) {
- if (i != j && !_field.isZero (M.getEntry (i, j))) {
- if (!_field.isZero (M.getEntry (i, i))) {
+ if (i != j && !field().isZero (M.getEntry (i, j))) {
+ if (!field().isZero (M.getEntry (i, i))) {
typename Matrix::ConstRowIterator row = M.rowBegin () + j;
if (!_VD.isZero (*row))
return false;
}
- else if (!_field.isZero (M.getEntry (j, j))) {
+ else if (!field().isZero (M.getEntry (j, j))) {
typename Matrix::ConstColIterator col = M.colBegin () + i;
if (!_VD.isZero (*col))
return false;
@@ -1270,7 +1276,7 @@ namespace LinBox
else
return false;
}
- else if (!_field.isZero (M.getEntry (i, j)) && !_field.areEqual (M.getEntry (i, j), neg_one))
+ else if (!field().isZero (M.getEntry (i, j)) && !field().areEqual (M.getEntry (i, j), field().mOne))
return false;
}
}
@@ -1298,11 +1304,11 @@ namespace LinBox
Matrix ATA (n, n);
Matrix W (n, n);
Matrix WA (n, n);
- std::vector<bool> S (n);
+ std::vector<bool> S ((size_t)n);
bool ret = true;
- RandomDenseStream<Field, typename Matrix::Row> stream (_field, _randiter, n);
+ RandomDenseStream<Field, typename Matrix::Row> stream (field(), _randiter, n);
typename Matrix::RowIterator i = A.rowBegin ();
typename Matrix::ColIterator j = AT.colBegin ();
@@ -1366,11 +1372,11 @@ namespace LinBox
Matrix ATA (n, n);
Matrix W (n, n);
Matrix WA (n, n);
- std::vector<bool> S (n);
+ std::vector<bool> S ((size_t)n);
bool ret = true;
- RandomDenseStream<Field, typename Matrix::Row> stream (_field, _randiter, n);
+ RandomDenseStream<Field, typename Matrix::Row> stream (field(), _randiter, n);
typename Matrix::RowIterator i = A.rowBegin ();
typename Matrix::ColIterator j = AT.colBegin ();
@@ -1472,7 +1478,7 @@ namespace LinBox
bool ret = true;
- RandomDenseStream<Field, typename Matrix::Row> stream (_field, _randiter, n);
+ RandomDenseStream<Field, typename Matrix::Row> stream (field(), _randiter, n);
typename Matrix::RowIterator i = A.rowBegin ();
for (; i != A.rowEnd (); ++i)
@@ -1482,10 +1488,10 @@ namespace LinBox
report << "Computed A:" << std::endl;
_MD.write (report, A);
- RandomDenseStream<Field, Matrix> stream1 (_field, _randiter, m);
+ RandomDenseStream<Field, Matrix> stream1 (field(), _randiter, m);
stream1 >> x;
- RandomDenseStream<Field, Matrix> stream2 (_field, _randiter, n);
+ RandomDenseStream<Field, Matrix> stream2 (field(), _randiter, n);
stream1 >> y;
report << "Computed x: ";
@@ -1507,14 +1513,14 @@ namespace LinBox
_VD.dot (ATxy, ATx, y);
report << "Computed ATxy: ";
- _field.write (report, ATxy) << std::endl;
+ field().write (report, ATxy) << std::endl;
_VD.dot (xAy, x, Ay);
report << "Computed xAy: ";
- _field.write (report, xAy) << std::endl;
+ field().write (report, xAy) << std::endl;
- if (!_field.areEqual (ATxy, xAy)) {
+ if (!field().areEqual (ATxy, xAy)) {
commentator().report (Commentator::LEVEL_IMPORTANT, INTERNAL_ERROR)
<< "ERROR: <A^T x, y> != <x, Ay>" << std::endl;
ret = false;
diff --git a/linbox/algorithms/minpoly-integer.h b/linbox/algorithms/minpoly-integer.h
index 5e65561..ff31e55 100644
--- a/linbox/algorithms/minpoly-integer.h
+++ b/linbox/algorithms/minpoly-integer.h
@@ -28,7 +28,7 @@
#define __LINBOX_minpoly_integer_H
#include <iostream>
-#include <math.h>
+#include <cmath>
/*! \file algorithms/minpoly-integer.h
* Compute the minpoly of a matrix over an integer ring using modular arithmetic
@@ -113,10 +113,7 @@ namespace LinBox
typedef typename IMatrix::template rebind<Field>::other FBlackbox;
typedef std::vector<Element> FPoly;
FPoly fp;
- integer mmodulus;
- FieldTraits<Field>::maxModulus(mmodulus);
- long bits = (long) floor (log((double)mmodulus)/M_LN2);
- RandomPrimeIterator primeg(bits);
+ RandomPrimeIterator primeg; primeg.template setBitsField<Field>();
for (int i = 0; i < n_try; ++ i) {
++primeg;
Field F(*primeg);
@@ -150,13 +147,10 @@ namespace LinBox
typedef typename IMatrix::template rebind<Field>::other FBlackbox;
typedef std::vector<Element> FPoly;
- integer mmodulus;
- FieldTraits<Field>::maxModulus(mmodulus);
- long bits = (long) floor (log((double)mmodulus)/M_LN2);
+ RandomPrimeIterator primeg; primeg.template setBitsField<Field>();
- RandomPrimeIterator primeg(bits);
FPoly fp (degree + 1);
- typename FPoly::iterator fp_p;
+ // typename FPoly::iterator fp_p;
y.resize (degree + 1);
EarlyMultipCRA< _Field > cra(3UL);
@@ -194,14 +188,10 @@ namespace LinBox
typedef typename IMatrix::template rebind<Field>::other FBlackbox;
typedef std::vector<Element> FPoly;
+ RandomPrimeIterator primeg; primeg.template setBitsField<Field>();
- integer mmodulus;
- FieldTraits<Field>::maxModulus(mmodulus);
- long bits = (long) floor (log((double)mmodulus)/M_LN2);
-
- RandomPrimeIterator primeg(bits);
FPoly fp (degree + 1);
- typename FPoly::iterator fp_p;
+ // typename FPoly::iterator fp_p;
y.resize (degree + 1);
EarlyMultipCRA< _Field > cra(3UL);
@@ -269,18 +259,16 @@ namespace LinBox
y. resize (degree + 1);
size_t n = M. rowdim();
- integer mmodulus;
- FieldTraits<Field>::maxModulus(mmodulus);
- long bit1 = (long) floor (log((double)mmodulus)/M_LN2);
- long bit2 = (long) floor (log(sqrt(double(4503599627370496LL/n)))/M_LN2);
- RandomPrimeIterator primeg(bit1 < bit2 ? bit1 : bit2);
+ RandomPrimeIterator primeg;
+ if( ! primeg.template setBitsDelayedField<Field>(n) )
+ primeg.template setBitsField<Field>();
Element* FA = new Element [n*n];
Element* X = new Element [n*(n+1)];
size_t* Perm = new size_t[n];
Element* p;
typename BlasMatrix<Ring>::ConstIterator raw_p;
std::vector<Element> poly (degree + 1);
- typename std::vector<Element>::iterator poly_ptr;
+ // typename std::vector<Element>::iterator poly_ptr;
EarlyMultipCRA< _Field > cra(3UL);
do {
@@ -315,7 +303,7 @@ namespace LinBox
}
cra. result(y);
//std::cout << "Number of primes needed: " << cra. steps() << std::endl;
- delete FA; delete X; delete Perm;
+ delete[] FA; delete[] X; delete[] Perm;
return y;
}
@@ -333,11 +321,9 @@ namespace LinBox
Element* p;
std::vector<Element> Poly;
- integer mmodulus;
- FieldTraits<Field>::maxModulus(mmodulus);
- long bit1 = (long) floor (log((double)mmodulus)/M_LN2);
- long bit2 = (long) floor (log(sqrt(double(4503599627370496LL/n)))/M_LN2);
- RandomPrimeIterator primeg(bit1 < bit2 ? bit1 : bit2);
+ RandomPrimeIterator primeg;
+ if( ! primeg.template setBitsDelayedField<Field>(n) )
+ primeg.template setBitsField<Field>();
typename BlasMatrix<Ring>::ConstIterator raw_p;
for (int i = 0; i < n_try; ++ i) {
@@ -352,7 +338,7 @@ namespace LinBox
if (degree < Poly. size() - 1)
degree = Poly. size() -1;
}
- delete FA; delete X; delete Perm;
+ delete[] FA; delete[] X; delete[] Perm;
return degree;
}
@@ -360,11 +346,10 @@ namespace LinBox
#endif //__LINBOX_minpoly_integer_H
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
// Local Variables:
// mode: C++
// tab-width: 8
// indent-tabs-mode: nil
// c-basic-offset: 8
// End:
-
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/algorithms/minpoly-rational.h b/linbox/algorithms/minpoly-rational.h
index 4a642ab..002815d 100644
--- a/linbox/algorithms/minpoly-rational.h
+++ b/linbox/algorithms/minpoly-rational.h
@@ -27,10 +27,10 @@
#include "linbox/util/commentator.h"
#include "linbox/util/timer.h"
-#include "linbox/field/modular.h"
+#include "linbox/ring/modular.h"
//#include "linbox/field/gmp-rational.h"
-#include "linbox/field/PID-integer.h"
+#include "givaro/zring.h"
#include "linbox/blackbox/rational-matrix-factory.h"
#include "linbox/algorithms/cra-early-multip.h"
#include "linbox/algorithms/cra-domain.h"
@@ -164,8 +164,6 @@ namespace LinBox
const BlasMatrix<Rationals > &A,
const MyMethod &Met= Method::Hybrid())
{
-
- typedef Modular<double> myModular;
typedef typename Rationals::Element Quotient;
commentator().start ("Rational Minpoly", "Rminpoly");
@@ -176,34 +174,34 @@ namespace LinBox
std::vector<Integer> M(A.rowdim()+1,1);
std::vector<Integer> Di(A.rowdim());
- RationalMatrixFactory<PID_integer,Rationals, BlasMatrix<Rationals > > FA(&A);
+ RationalMatrixFactory<Givaro::ZRing<Integer>,Rationals, BlasMatrix<Rationals > > FA(&A);
Integer da=1, di=1; Integer D=1;
FA.denominator(da);
- for (int i=M.size()-2; i >= 0 ; --i) {
+ for (int i=(int)M.size()-2; i >= 0 ; --i) {
//c[m]=1, c[0]=det(A);
FA.denominator(di,i);
D *=di;
- Di[i]=di;
- M[i] = M[i+1]*da;
+ Di[(size_t)i]=di;
+ M[(size_t)i] = M[(size_t)i+1]*da;
}
- for (int i=0; i < M.size() ; ++i ) {
- gcd(M[i],M[i],D);
+ for (int i=0; i <(int) M.size() ; ++i ) {
+ gcd(M[(size_t)i],M[(size_t)i],D);
}
- PID_integer Z;
- BlasMatrix<PID_integer> Atilde(Z,A.rowdim(), A.coldim());
+ Givaro::ZRing<Integer> Z;
+ BlasMatrix<Givaro::ZRing<Integer> > Atilde(Z,A.rowdim(), A.coldim());
FA.makeAtilde(Atilde);
- ChineseRemainder< EarlyMultipCRA<Modular<double> > > cra(4UL);
+ ChineseRemainder< EarlyMultipCRA<Givaro::Modular<double> > > cra(4UL);
MyRationalModularMinpoly<BlasMatrix<Rationals > , MyMethod> iteration1(A, Met, M);
- MyIntegerModularMinpoly<BlasMatrix<PID_integer>, MyMethod> iteration2(Atilde, Met, Di, M);
+ MyIntegerModularMinpoly<BlasMatrix<Givaro::ZRing<Integer> >, MyMethod> iteration2(Atilde, Met, Di, M);
MyModularMinpoly<MyRationalModularMinpoly<BlasMatrix<Rationals > , MyMethod>,
- MyIntegerModularMinpoly<BlasMatrix<PID_integer>, MyMethod> > iteration(&iteration1,&iteration2);
+ MyIntegerModularMinpoly<BlasMatrix<Givaro::ZRing<Integer> >, MyMethod> > iteration(&iteration1,&iteration2);
- RReconstruction<PID_integer, ClassicMaxQRationalReconstruction<PID_integer> > RR;
+ RReconstruction<Givaro::ZRing<Integer>, ClassicMaxQRationalReconstruction<Givaro::ZRing<Integer> > > RR;
- std::vector<Integer> PP,PP2; // use of integer due to non genericity of cra. PG 2005-08-04
+ std::vector<Integer> PP; // use of integer due to non genericity of cra. PG 2005-08-04
UserTimer t1,t2;
t1.clear();
t2.clear();
@@ -229,27 +227,27 @@ namespace LinBox
Integer m; //Integer r; Integer a,b;
cra.getModulus(m);
cra.result(PP);//need to divide
- for (int i=0; i < PP.size(); ++i) {
+ for (int i=0; i < (int)PP.size(); ++i) {
Integer D_1;
- inv(D_1,M[i],m);
- PP[i] = (PP[i]*D_1) % m;
+ inv(D_1,M[(size_t)i],m);
+ PP[(size_t)i] = (PP[(size_t)i]*D_1) % m;
}
Integer den,den1;
std::vector<Integer> num(A.rowdim()+1);
std::vector<Integer> num1(A.rowdim()+1);
- if (RR.reconstructRational(num,den,PP,m,-1)) {//performs reconstruction strating form c[m], use c[i] as prec for c[i-1]
+ if (RR.reconstructRational(num,den,PP,m,-1)) {//performs reconstruction strating form c[m], use c[(size_t)i] as prec for c[(size_t)i-1]
cra(1,PP,iteration,genprime);
cra.getModulus(m);
- for (int i=0; i < PP.size(); ++i) {
+ for (int i=0; i < (int)PP.size(); ++i) {
Integer D_1;
- inv(D_1,M[i],m);
- PP[i] = (PP[i]*D_1) % m;
+ inv(D_1,M[(size_t)i],m);
+ PP[(size_t)i] = (PP[(size_t)i]*D_1) % m;
}
- bool terminated = true;
if (RR.reconstructRational(num1,den1,PP,m,-1)) {
+ bool terminated = true;
if (den==den1) {
- for (int i=0; i < num.size(); ++i) {
- if (num[i] != num1[i]) {
+ for (int i=0; i < (int)num.size(); ++i) {
+ if (num[(size_t)i] != num1[(size_t)i]) {
terminated =false;
break;
}
@@ -269,7 +267,7 @@ namespace LinBox
typename Vector <typename Rationals::Element>::iterator it;
Rationals Q;
for (it= p.begin(); it != p.end(); ++it, ++i) {
- A.field().init(*it, num[i],den);
+ A.field().init(*it, num[(size_t)i],den);
Q.get_den(t,*it);
if (it != p.begin()) Q.get_den(tt,*(it-1));
else tt = 1;
@@ -277,7 +275,7 @@ namespace LinBox
}
return p;
- break;
+ // break;
}
}
}
@@ -288,9 +286,9 @@ namespace LinBox
size_t i =0;
integer t,tt;
integer err;
- size_t max_res=0;int max_i;
+ // size_t max_res=0;int max_i;
// double rel;
- size_t max_resu=0; int max_iu;
+ // size_t max_resu=0; int max_iu;
// size_t max_err = 0;
Quotient qerr;
p.resize(PP.size());
@@ -299,24 +297,24 @@ namespace LinBox
Rationals Q;
for (it= p.begin(); it != p.end(); ++it, ++i) {
- A.field().init(*it, PP[i],M[i]);
+ A.field().init(*it, PP[(size_t)i],M[(size_t)i]);
Q.get_den(t, *it);
Q.get_num(tt,*it);
- err = M[i]/t;
- size_t resi = err.bitsize() + tt.bitsize() -1;
- size_t resu = t.bitsize() + tt.bitsize() -1;
- if (resi > max_res) {max_res = resi; max_i=i;}
- if (resu > max_resu) {max_resu = resu; max_iu =i;}
+ err = M[(size_t)i]/t;
+ // size_t resi = err.bitsize() + tt.bitsize() -1;
+ // size_t resu = t.bitsize() + tt.bitsize() -1;
+ // if (resi > max_res) {max_res = resi; max_i=i;}
+ // if (resu > max_resu) {max_resu = resu; max_iu =i;}
}
- max_res=0;
+ // max_res=0;
for (it= p.begin()+1; it != p.end(); ++it) {
Q.get_den(t, *it);
Q.get_den(tt, *(it-1));
Q.init(qerr,t,tt);
Q.get_num(tt, *it);
- size_t resi = Q.bitsize(t,qerr) + tt.bitsize() -2;
- if (resi > max_res) {max_res = resi; max_i=i;}
+ // size_t resi = Q.bitsize(t,qerr) + tt.bitsize() -2;
+ // if (resi > max_res) {max_res = resi; max_i=i;}
}
commentator().stop ("done", NULL, "Iminpoly");
@@ -330,11 +328,10 @@ namespace LinBox
#endif //__LINBOX_rat_minpoly_H
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
// Local Variables:
// mode: C++
// tab-width: 8
// indent-tabs-mode: nil
// c-basic-offset: 8
// End:
-
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/algorithms/one-invariant-factor.h b/linbox/algorithms/one-invariant-factor.h
index 1615770..4ec1d3a 100644
--- a/linbox/algorithms/one-invariant-factor.h
+++ b/linbox/algorithms/one-invariant-factor.h
@@ -96,7 +96,7 @@ namespace LinBox
void setCrossover(double t)
{
- if(0 <= t <= 1)
+ if(0 <= t and t <= 1)
crossover = t;
}
@@ -139,7 +139,7 @@ namespace LinBox
return oif;
}
- r.init (oif, 0);
+ r.assign (oif, r.zero);
int count;
@@ -236,7 +236,7 @@ namespace LinBox
return oif;
}
- r.init (oif, 0); r. init (bonus, 0);
+ r.assign (oif, r.zero); r. assign (bonus, r.zero);
int count;
Integer prev, tmp_i, p_bonus;
//typename RandomMatrixTraits<IMatrix>::value_type *L, *U;
diff --git a/linbox/algorithms/opencl-environ.h b/linbox/algorithms/opencl-environ.h
new file mode 100644
index 0000000..0e016f4
--- /dev/null
+++ b/linbox/algorithms/opencl-environ.h
@@ -0,0 +1,375 @@
+/* linbox/algorithms/opencl-environ.h
+ * Copyright (C) 2012 Matthew Wezowicz
+ *
+ * Written by Matthew Wezowicz <mwezz at udel.edu>
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ * ========LICENCE========
+ *.
+ */
+
+#include <pthread.h>
+
+#include <algorithm>
+#include <istream>
+#include <iterator>
+#include <sstream>
+#include <string>
+#include <vector>
+
+#include <CL/cl.h>
+
+//#include "named-mutex.h"
+
+#ifndef __LINBOX_opencl_environ_H
+#define __LINBOX_opencl_environ_H
+
+namespace LinBox{
+
+ /**
+ * Container for all pertenant information needed to use an OpenCL device,
+ * compile kernels for the device, track resource usage, and gain exclusive
+ * access to the device
+ *
+ * Complies to the OpenCL 1.0 spec
+ */
+ class OpenCLEnviron{
+
+ private:
+ //Platform info
+ std::string platformName;
+ double platformVersion;
+ std::vector<std::string> platformExtensions;
+
+ //Device info
+ std::vector<std::string> deviceExtensions;
+
+ //OpenCL variables
+ cl_context context;
+ cl_device_id device;
+ cl_command_queue commandQueue;
+ cl_int errcode;
+
+ //Memory stats
+ unsigned long memCapacity;
+ unsigned long maxBufferSize;
+ unsigned long memInUse;
+
+ //Device type flags
+ bool CPU;
+ bool GPU;
+ bool ACCEL;
+ bool Other;
+
+ //Lock to control access to environ
+#ifndef __MPI_SHARED
+ pthread_mutex_t* deviceLock;
+#else
+ NamedMutex* deviceLock;
+#endif
+
+ //ID number
+ unsigned int IDnum;
+
+ OpenCLEnviron();
+ OpenCLEnviron(const OpenCLEnviron&);
+ OpenCLEnviron& operator=(const OpenCLEnviron&);
+
+ public:
+ OpenCLEnviron(
+ std::string platformName_,
+ double platformVersion_,
+ std::vector<std::string> platformExtensions_,
+ cl_context context_,
+ cl_device_id device_,
+#ifndef __MPI_SHARED
+ pthread_mutex_t* deviceLock_,
+#else
+ NamedMutex* deviceLock_,
+#endif
+ unsigned int IDnum_) :
+ //Init list starts here
+ platformName(platformName_),
+ platformVersion(platformVersion_),
+ platformExtensions(platformExtensions_),
+ context(context_),
+ device(device_),
+ errcode(CL_SUCCESS),
+ memCapacity(0L),
+ maxBufferSize(0L),
+ memInUse(0L),
+ CPU(false),
+ GPU(false),
+ ACCEL(false),
+ Other(true),
+ deviceLock(deviceLock_),
+ IDnum(IDnum_){
+
+ //Initialize command queue
+ clCreateCommandQueue(
+ context,
+ device,
+ CL_QUEUE_PROFILING_ENABLE,
+ &errcode);
+
+ //Get memory stats
+ errcode = clGetDeviceInfo(
+ device,
+ CL_DEVICE_GLOBAL_MEM_SIZE,
+ sizeof(cl_ulong),
+ &memCapacity,
+ NULL);
+ errcode = clGetDeviceInfo(
+ device,
+ CL_DEVICE_MAX_MEM_ALLOC_SIZE,
+ sizeof(cl_ulong),
+ &maxBufferSize,
+ NULL);
+
+ //Get device type
+ cl_device_type type;
+
+ errcode = clGetDeviceInfo(
+ device,
+ CL_DEVICE_TYPE,
+ sizeof(cl_device_type),
+ &type,
+ NULL);
+
+ CPU = (type == CL_DEVICE_TYPE_CPU);
+ GPU = (type == CL_DEVICE_TYPE_GPU);
+ ACCEL = (type == CL_DEVICE_TYPE_ACCELERATOR);
+ Other = ((CPU || GPU || ACCEL) == false);
+
+ //Enumerate device extensions
+ size_t sizeRet;
+
+ errcode = clGetDeviceInfo(
+ device,
+ CL_DEVICE_EXTENSIONS,
+ 0,
+ NULL,
+ &sizeRet);
+
+ char* devExt = new char[sizeRet];
+
+ errcode = clGetDeviceInfo(
+ device,
+ CL_DEVICE_EXTENSIONS,
+ sizeRet,
+ devExt,
+ NULL);
+
+ //Parse out individual extensions into vector
+ std::string devExt2(devExt);
+ std::stringstream strstream(devExt2);
+ std::istream_iterator<std::string> it(strstream);
+ std::istream_iterator<std::string> end;
+
+ for(; it != end; it++){
+ deviceExtensions.push_back(*it);
+ }
+
+ //Deallocate memory
+ delete[] devExt;
+ }
+
+ ~OpenCLEnviron(){}
+
+ /**
+ * getPlatformName() returns string with platform name
+ */
+ std::string getPlatformName() const{
+ return platformName;
+ }
+
+ /**
+ * getPlatformVersion() returns double with platform version
+ */
+ double getPlatformVersion() const{
+ return platformVersion;
+ }
+
+ /**
+ * getPlatformExtensions() returns a constant reference to the vector with
+ * the platform extensions supported by this environ
+ */
+ const std::vector<std::string>& getPlatformExtensions() const{
+ return platformExtensions;
+ }
+
+ /**
+ * getDeviceExtensions() returns a constant reference to the vector with
+ * the device extensions supported by this environ
+ */
+ const std::vector<std::string>& getDeviceExtensions() const{
+ return deviceExtensions;
+ }
+
+ /**
+ * getIDNum() returns the unsigned int with the OpenCLEnviron ID number
+ */
+ unsigned int getIDNum() const{
+ return IDnum;
+ }
+
+ /**
+ * getContext() accessor for the context associated with environ
+ */
+ cl_context getContext() const{
+ return context;
+ }
+
+ /**
+ * getDevice() accessor for the device associated with environ
+ */
+ cl_device_id getDevice() const{
+ return device;
+ }
+
+ /**
+ * getCommandQueue() accessor for thecommand queue associated with environ
+ */
+ cl_command_queue getCommandQueue() const{
+ return commandQueue;
+ }
+
+ /**
+ * getErrorCode() accessor for the error code associated with environ
+ */
+ cl_int getErrorCode() const{
+ return errcode;
+ }
+
+ /**
+ * setErrorCode() accessor for setting error code associated with environ
+ */
+ void setErrorCode(cl_int err){
+ errcode = err;
+ }
+
+ /**
+ * getMemCapacity() accessor for the memory capacity associated with environ
+ */
+ unsigned long getMemCapacity() const{
+ return memCapacity;
+ }
+
+ /**
+ * getMaxBufferSize() accessor for the maximum buffer size associated
+ * with environ
+ */
+ unsigned long getMaxBufferSize() const{
+ return maxBufferSize;
+ }
+
+ /**
+ * getMemInUse() accessor for the memory currently in use by the environ
+ */
+ unsigned long getMemInUse() const{
+ return memInUse;
+ }
+
+ /**
+ * getMemAvailable() accessor for the memory available in the environ
+ */
+ unsigned long getMemAvailable() const{
+ return memCapacity - memInUse;
+ }
+
+ /**
+ * memAllocated() setter for updating the memory levels
+ */
+ void memAllocated(unsigned long alloc){
+ memInUse += alloc;
+ }
+
+ /**
+ * memDeallocated() setter for updating the memory levels
+ */
+ void memDeallocated(unsigned long dealloc){
+ memInUse -= dealloc;
+ }
+
+ /**
+ * isCPU() accessor for the device type in the environ
+ */
+ bool isCPU() const{
+ return CPU;
+ }
+
+ /**
+ * isGPU() accessor for the device type in the environ
+ */
+ bool isGPU() const{
+ return GPU;
+ }
+
+ /**
+ * isAccelerator() accessor for the device type in the environ
+ */
+ bool isAccelerator() const{
+ return ACCEL;
+ }
+
+ /**
+ * isOtherDevice() accessor for the device type in the environ
+ */
+ bool isOtherDevice() const{
+ return Other;
+ }
+
+ /**
+ * acquireEnviron() accessor for gaining exclusive access to the environ
+ */
+ void acquireEnviron(){
+#ifndef __MPI_SHARED
+ pthread_mutex_lock(deviceLock);
+#else
+ deviceLock->lock();
+ memInUse = deviceLock->updateLocalValue<unsigned long>("memInUse");
+#endif
+ }
+
+ /**
+ * releaseEnviron() accessor for releasing exclusive access to the environ
+ */
+ void releaseEnviron(){
+#ifndef __MPI_SHARED
+ pthread_mutex_unlock(deviceLock);
+#else
+ deviceLock->updateGlobalValue<unsigned long>("memInUse", memInUse);
+ deviceLock->unlock();
+#endif
+ }
+
+ /**
+ * getDeviceLock() accessor for underlying lock in the environ
+ */
+#ifndef __MPI_SHARED
+ pthread_mutex_t* getDeviceLock(){
+#else
+ NamedMutex* getDeviceLock(){
+#endif
+ return deviceLock;
+ }
+ };
+
+} /* end of namespace LinBox */
+
+#endif /* __LINBOX_opencl_environ_H */
diff --git a/linbox/algorithms/opencl-kernels/Makefile.am b/linbox/algorithms/opencl-kernels/Makefile.am
new file mode 100644
index 0000000..159c5f6
--- /dev/null
+++ b/linbox/algorithms/opencl-kernels/Makefile.am
@@ -0,0 +1,34 @@
+# Copyright (c) 2012 the LinBox group
+# ========LICENCE========
+# This file is part of the library LinBox.
+#
+# LinBox is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+#
+# This library 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
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+# ========LICENCE========
+
+
+
+pkgincludesubdir=$(pkgincludedir)/algorithms/opencl-kernels
+
+OCL_HDRS = \
+ opencl-domain-kernels.inl
+
+if LINBOX_HAVE_OCL
+USE_OCL_HDRS = $(OCL_HDRS)
+endif
+
+pkgincludesub_HEADERS = \
+ $(USE_OCL_HDRS)
+
+
diff --git a/linbox/algorithms/opencl-kernels/file-list.txt b/linbox/algorithms/opencl-kernels/file-list.txt
new file mode 100644
index 0000000..c7d7096
--- /dev/null
+++ b/linbox/algorithms/opencl-kernels/file-list.txt
@@ -0,0 +1,40 @@
+kernel-modulus-dp-unroll.cl
+kernel-modulus-sp-unroll.cl
+kernel-partial-8-dp-unroll.cl
+kernel-partial-16-sp-unroll.cl
+kernel-partial-32-dp-unroll.cl
+kernel-partial-32-sp-unroll.cl
+kernel-partial-1024-dp-unroll.cl
+kernel-partial-1024-sp-unroll.cl
+kernel-muladd-modulus-dp-unroll.cl
+kernel-muladd-modulus-sp-unroll.cl
+kernel-muladd-partial-8-dp-unroll.cl
+kernel-muladd-partial-16-sp-unroll.cl
+kernel-muladd-partial-32-dp-unroll.cl
+kernel-muladd-partial-32-sp-unroll.cl
+kernel-muladd-partial-1024-dp-unroll.cl
+kernel-muladd-partial-1024-sp-unroll.cl
+kernel-axpy-modulus-dp-unroll.cl
+kernel-axpy-modulus-sp-unroll.cl
+kernel-axpy-partial-8-dp-unroll.cl
+kernel-axpy-partial-16-sp-unroll.cl
+kernel-axpy-partial-32-dp-unroll.cl
+kernel-axpy-partial-32-sp-unroll.cl
+kernel-axpy-partial-1024-dp-unroll.cl
+kernel-axpy-partial-1024-sp-unroll.cl
+kernel-maxpy-modulus-dp-unroll.cl
+kernel-maxpy-modulus-sp-unroll.cl
+kernel-maxpy-partial-8-dp-unroll.cl
+kernel-maxpy-partial-16-sp-unroll.cl
+kernel-maxpy-partial-32-dp-unroll.cl
+kernel-maxpy-partial-32-sp-unroll.cl
+kernel-maxpy-partial-1024-dp-unroll.cl
+kernel-maxpy-partial-1024-sp-unroll.cl
+kernel-axmy-modulus-dp-unroll.cl
+kernel-axmy-modulus-sp-unroll.cl
+kernel-axmy-partial-8-dp-unroll.cl
+kernel-axmy-partial-16-sp-unroll.cl
+kernel-axmy-partial-32-dp-unroll.cl
+kernel-axmy-partial-32-sp-unroll.cl
+kernel-axmy-partial-1024-dp-unroll.cl
+kernel-axmy-partial-1024-sp-unroll.cl
\ No newline at end of file
diff --git a/linbox/algorithms/opencl-kernels/kernel-axmy-modulus-dp-unroll.cl b/linbox/algorithms/opencl-kernels/kernel-axmy-modulus-dp-unroll.cl
new file mode 100644
index 0000000..3dfe323
--- /dev/null
+++ b/linbox/algorithms/opencl-kernels/kernel-axmy-modulus-dp-unroll.cl
@@ -0,0 +1,95 @@
+/*
+ * kernel_axmy_modulus_dp.cl
+ *
+ * Created on: Dec 21, 2011
+ * Author: Matthew Wezowicz
+ */
+
+#define BLOCK_SIZE 16
+#pragma OPENCL EXTENSION cl_khr_fp64 : enable
+
+__kernel void matrixAxmyKernelModular1DP(__global double* D, __global double* A, __global double* B,
+ __global double* C, const int widthA, const int widthB, const double mod){
+ //Geet Workgroup ID
+ int bx = get_group_id(0);
+ int by = get_group_id(1);
+
+ //Get Local ID
+ int tx = get_local_id(0);
+ int ty = get_local_id(1);
+
+ //Range of indexies for submatrix of A
+ int aBegin= widthA * BLOCK_SIZE * by;
+ int aEnd = aBegin + widthA - 1;
+ int aStep = BLOCK_SIZE;
+
+ //Range of indecies for sub-matrix of B
+ int bBegin = BLOCK_SIZE * bx;
+ int bStep = BLOCK_SIZE * widthB;
+
+ //Local storage of sub-matrices of A and B;
+ __local double As[BLOCK_SIZE][BLOCK_SIZE];
+ __local double Bs[BLOCK_SIZE][BLOCK_SIZE];
+
+ //Temporary storage for result
+ double Dsub = 0;
+
+ //Loop over all the sub-maticies of A and B required to compute
+ //the result sub-matrix
+ for(int a = aBegin, b = bBegin; a < aEnd; a += aStep, b += bStep){
+ //Load the matricies from global memory to local memory
+ //Each thread loads one element of each sub-matrix
+ As[ty][tx] = A[a + widthA * ty + tx];
+ Bs[ty][tx] = B[b + widthB * ty + tx];
+
+ //Synchronize threads
+ barrier(CLK_LOCAL_MEM_FENCE);
+
+ //Multiply the two sub-matrices together
+ Dsub += As[ty][0] * Bs[0][tx];
+ Dsub = fmod(Dsub, mod);
+ Dsub += As[ty][1] * Bs[1][tx];
+ Dsub = fmod(Dsub, mod);
+ Dsub += As[ty][2] * Bs[2][tx];
+ Dsub = fmod(Dsub, mod);
+ Dsub += As[ty][3] * Bs[3][tx];
+ Dsub = fmod(Dsub, mod);
+ Dsub += As[ty][4] * Bs[4][tx];
+ Dsub = fmod(Dsub, mod);
+ Dsub += As[ty][5] * Bs[5][tx];
+ Dsub = fmod(Dsub, mod);
+ Dsub += As[ty][6] * Bs[6][tx];
+ Dsub = fmod(Dsub, mod);
+ Dsub += As[ty][7] * Bs[7][tx];
+ Dsub = fmod(Dsub, mod);
+ Dsub += As[ty][8] * Bs[8][tx];
+ Dsub = fmod(Dsub, mod);
+ Dsub += As[ty][9] * Bs[9][tx];
+ Dsub = fmod(Dsub, mod);
+ Dsub += As[ty][10] * Bs[10][tx];
+ Dsub = fmod(Dsub, mod);
+ Dsub += As[ty][11] * Bs[11][tx];
+ Dsub = fmod(Dsub, mod);
+ Dsub += As[ty][12] * Bs[12][tx];
+ Dsub = fmod(Dsub, mod);
+ Dsub += As[ty][13] * Bs[13][tx];
+ Dsub = fmod(Dsub, mod);
+ Dsub += As[ty][14] * Bs[14][tx];
+ Dsub = fmod(Dsub, mod);
+ Dsub += As[ty][15] * Bs[15][tx];
+ Dsub = fmod(Dsub, mod);
+
+ //Synchronize threads
+ barrier(CLK_LOCAL_MEM_FENCE);
+ }
+ //Calculates the offset inthe result matrix
+ int d = widthB * BLOCK_SIZE * by + BLOCK_SIZE * bx;
+
+ //Load, add, and normalize with element from C
+ double c = C[d + ty * widthB + tx];
+ Dsub = Dsub - c;
+ Dsub = fmod((mod + Dsub), mod);
+
+ //Add the sum to the appropriate spot
+ D[d + ty * widthB + tx] = Dsub;
+}
\ No newline at end of file
diff --git a/linbox/algorithms/opencl-kernels/kernel-axmy-modulus-dp.cl b/linbox/algorithms/opencl-kernels/kernel-axmy-modulus-dp.cl
new file mode 100644
index 0000000..f833a1f
--- /dev/null
+++ b/linbox/algorithms/opencl-kernels/kernel-axmy-modulus-dp.cl
@@ -0,0 +1,68 @@
+/*
+ * kernel_axmy_modulus_dp.cl
+ *
+ * Created on: Dec 21, 2011
+ * Author: Matthew Wezowicz
+ */
+
+#define BLOCK_SIZE 16
+#pragma OPENCL EXTENSION cl_khr_fp64 : enable
+
+__kernel void matrixAxmyKernelModular1DP(__global double* D, __global double* A, __global double* B,
+ __global double* C, const int widthA, const int widthB, const double mod){
+ //Geet Workgroup ID
+ int bx = get_group_id(0);
+ int by = get_group_id(1);
+
+ //Get Local ID
+ int tx = get_local_id(0);
+ int ty = get_local_id(1);
+
+ //Range of indexies for submatrix of A
+ int aBegin= widthA * BLOCK_SIZE * by;
+ int aEnd = aBegin + widthA - 1;
+ int aStep = BLOCK_SIZE;
+
+ //Range of indecies for sub-matrix of B
+ int bBegin = BLOCK_SIZE * bx;
+ int bStep = BLOCK_SIZE * widthB;
+
+ //Local storage of sub-matrices of A and B;
+ __local double As[BLOCK_SIZE][BLOCK_SIZE];
+ __local double Bs[BLOCK_SIZE][BLOCK_SIZE];
+
+ //Temporary storage for result
+ double Dsub = 0;
+
+ //Loop over all the sub-maticies of A and B required to compute
+ //the result sub-matrix
+ for(int a = aBegin, b = bBegin; a < aEnd; a += aStep, b += bStep){
+ //Load the matricies from global memory to local memory
+ //Each thread loads one element of each sub-matrix
+ As[ty][tx] = A[a + widthA * ty + tx];
+ Bs[ty][tx] = B[b + widthB * ty + tx];
+
+ //Synchronize threads
+ barrier(CLK_LOCAL_MEM_FENCE);
+
+ //Multiply the two sub-matrices together
+ for(int i = 0; i < BLOCK_SIZE; i++){
+ Dsub += As[ty][i] * Bs[i][tx];
+ //Calls fmod everey iteration to normalize the partial sum
+ Dsub = fmod(Dsub, mod);
+ }
+
+ //Synchronize threads
+ barrier(CLK_LOCAL_MEM_FENCE);
+ }
+ //Calculates the offset inthe result matrix
+ int d = widthB * BLOCK_SIZE * by + BLOCK_SIZE * bx;
+
+ //Load, add, and normalize with element from C
+ double c = C[d + ty * widthB + tx];
+ Dsub = Dsub - c;
+ Dsub = fmod((mod + Dsub), mod);
+
+ //Add the sum to the appropriate spot
+ D[d + ty * widthB + tx] = Dsub;
+}
\ No newline at end of file
diff --git a/linbox/algorithms/opencl-kernels/kernel-axmy-modulus-sp-unroll.cl b/linbox/algorithms/opencl-kernels/kernel-axmy-modulus-sp-unroll.cl
new file mode 100644
index 0000000..aa0779e
--- /dev/null
+++ b/linbox/algorithms/opencl-kernels/kernel-axmy-modulus-sp-unroll.cl
@@ -0,0 +1,94 @@
+/*
+ * kernel_axmy_modulus_sp.cl
+ *
+ * Created on: Dec 21, 2011
+ * Author: Matthew Wezowicz
+ */
+
+#define BLOCK_SIZE 16
+
+__kernel void matrixAxmyKernelModular1SP(__global float* D, __global float* A, __global float* B,
+ __global float* C, const int widthA, const int widthB, const float mod){
+ //Geet Workgroup ID
+ int bx = get_group_id(0);
+ int by = get_group_id(1);
+
+ //Get Local ID
+ int tx = get_local_id(0);
+ int ty = get_local_id(1);
+
+ //Range of indexies for submatrix of A
+ int aBegin= widthA * BLOCK_SIZE * by;
+ int aEnd = aBegin + widthA - 1;
+ int aStep = BLOCK_SIZE;
+
+ //Range of indecies for sub-matrix of B
+ int bBegin = BLOCK_SIZE * bx;
+ int bStep = BLOCK_SIZE * widthB;
+
+ //Local storage of sub-matrices of A and B;
+ __local float As[BLOCK_SIZE][BLOCK_SIZE];
+ __local float Bs[BLOCK_SIZE][BLOCK_SIZE];
+
+ //Temporary storage for result
+ float Dsub = 0;
+
+ //Loop over all the sub-maticies of A and B required to compute
+ //the result sub-matrix
+ for(int a = aBegin, b = bBegin; a < aEnd; a += aStep, b += bStep){
+ //Load the matricies from global memory to local memory
+ //Each thread loads one element of each sub-matrix
+ As[ty][tx] = A[a + widthA * ty + tx];
+ Bs[ty][tx] = B[b + widthB * ty + tx];
+
+ //Synchronize threads
+ barrier(CLK_LOCAL_MEM_FENCE);
+
+ //Multiply the two sub-matrices together
+ Dsub += As[ty][0] * Bs[0][tx];
+ Dsub = fmod(Dsub, mod);
+ Dsub += As[ty][1] * Bs[1][tx];
+ Dsub = fmod(Dsub, mod);
+ Dsub += As[ty][2] * Bs[2][tx];
+ Dsub = fmod(Dsub, mod);
+ Dsub += As[ty][3] * Bs[3][tx];
+ Dsub = fmod(Dsub, mod);
+ Dsub += As[ty][4] * Bs[4][tx];
+ Dsub = fmod(Dsub, mod);
+ Dsub += As[ty][5] * Bs[5][tx];
+ Dsub = fmod(Dsub, mod);
+ Dsub += As[ty][6] * Bs[6][tx];
+ Dsub = fmod(Dsub, mod);
+ Dsub += As[ty][7] * Bs[7][tx];
+ Dsub = fmod(Dsub, mod);
+ Dsub += As[ty][8] * Bs[8][tx];
+ Dsub = fmod(Dsub, mod);
+ Dsub += As[ty][9] * Bs[9][tx];
+ Dsub = fmod(Dsub, mod);
+ Dsub += As[ty][10] * Bs[10][tx];
+ Dsub = fmod(Dsub, mod);
+ Dsub += As[ty][11] * Bs[11][tx];
+ Dsub = fmod(Dsub, mod);
+ Dsub += As[ty][12] * Bs[12][tx];
+ Dsub = fmod(Dsub, mod);
+ Dsub += As[ty][13] * Bs[13][tx];
+ Dsub = fmod(Dsub, mod);
+ Dsub += As[ty][14] * Bs[14][tx];
+ Dsub = fmod(Dsub, mod);
+ Dsub += As[ty][15] * Bs[15][tx];
+ Dsub = fmod(Dsub, mod);
+
+ //Synchronize threads
+ barrier(CLK_LOCAL_MEM_FENCE);
+ }
+ //Calculates the offset inthe result matrix
+ int d = widthB * BLOCK_SIZE * by + BLOCK_SIZE * bx;
+
+ //Load, add, and normalize with element from C
+ float c = C[d + ty * widthB + tx];
+ Dsub = Dsub - c;
+ Dsub = fmod((mod + Dsub), mod);
+
+ //Add the sum to the appropriate spot
+ D[d + ty * widthB + tx] = Dsub;
+}
\ No newline at end of file
diff --git a/linbox/algorithms/opencl-kernels/kernel-axmy-modulus-sp.cl b/linbox/algorithms/opencl-kernels/kernel-axmy-modulus-sp.cl
new file mode 100644
index 0000000..6801316
--- /dev/null
+++ b/linbox/algorithms/opencl-kernels/kernel-axmy-modulus-sp.cl
@@ -0,0 +1,67 @@
+/*
+ * kernel_axmy_modulus_sp.cl
+ *
+ * Created on: Dec 21, 2011
+ * Author: Matthew Wezowicz
+ */
+
+#define BLOCK_SIZE 16
+
+__kernel void matrixAxmyKernelModular1SP(__global float* D, __global float* A, __global float* B,
+ __global float* C, const int widthA, const int widthB, const float mod){
+ //Geet Workgroup ID
+ int bx = get_group_id(0);
+ int by = get_group_id(1);
+
+ //Get Local ID
+ int tx = get_local_id(0);
+ int ty = get_local_id(1);
+
+ //Range of indexies for submatrix of A
+ int aBegin= widthA * BLOCK_SIZE * by;
+ int aEnd = aBegin + widthA - 1;
+ int aStep = BLOCK_SIZE;
+
+ //Range of indecies for sub-matrix of B
+ int bBegin = BLOCK_SIZE * bx;
+ int bStep = BLOCK_SIZE * widthB;
+
+ //Local storage of sub-matrices of A and B;
+ __local float As[BLOCK_SIZE][BLOCK_SIZE];
+ __local float Bs[BLOCK_SIZE][BLOCK_SIZE];
+
+ //Temporary storage for result
+ float Dsub = 0;
+
+ //Loop over all the sub-maticies of A and B required to compute
+ //the result sub-matrix
+ for(int a = aBegin, b = bBegin; a < aEnd; a += aStep, b += bStep){
+ //Load the matricies from global memory to local memory
+ //Each thread loads one element of each sub-matrix
+ As[ty][tx] = A[a + widthA * ty + tx];
+ Bs[ty][tx] = B[b + widthB * ty + tx];
+
+ //Synchronize threads
+ barrier(CLK_LOCAL_MEM_FENCE);
+
+ //Multiply the two sub-matrices together
+ for(int i = 0; i < BLOCK_SIZE; i++){
+ Dsub += As[ty][i] * Bs[i][tx];
+ //Calls fmod everey iteration to normalize the partial sum
+ Dsub = fmod(Dsub, mod);
+ }
+
+ //Synchronize threads
+ barrier(CLK_LOCAL_MEM_FENCE);
+ }
+ //Calculates the offset inthe result matrix
+ int d = widthB * BLOCK_SIZE * by + BLOCK_SIZE * bx;
+
+ //Load, add, and normalize with element from C
+ float c = C[d + ty * widthB + tx];
+ Dsub = Dsub - c;
+ Dsub = fmod((mod + Dsub), mod);
+
+ //Add the sum to the appropriate spot
+ D[d + ty * widthB + tx] = Dsub;
+}
\ No newline at end of file
diff --git a/linbox/algorithms/opencl-kernels/kernel-axmy-partial-1024-dp-unroll.cl b/linbox/algorithms/opencl-kernels/kernel-axmy-partial-1024-dp-unroll.cl
new file mode 100644
index 0000000..372b0c5
--- /dev/null
+++ b/linbox/algorithms/opencl-kernels/kernel-axmy-partial-1024-dp-unroll.cl
@@ -0,0 +1,93 @@
+/*
+ * kernel_axpy_parital_1024_dp.cl
+ *
+ * Created on: Dec 21, 2011
+ * Author: Matthew Wezowicz
+ */
+
+#define BLOCK_SIZE 16
+#pragma OPENCL EXTENSION cl_khr_fp64 : enable
+
+__kernel void matrixAxmyKernelModular1024DP(__global double* D, __global double* A, __global double* B,
+ __global double* C, const int widthA, const int widthB, const double mod){
+ //Geet Workgroup ID
+ int bx = get_group_id(0);
+ int by = get_group_id(1);
+
+ //Get Local ID
+ int tx = get_local_id(0);
+ int ty = get_local_id(1);
+
+ //Range of indexies for submatrix of A
+ int aBegin= widthA * BLOCK_SIZE * by;
+ int aEnd = aBegin + widthA - 1;
+ int aStep = BLOCK_SIZE;
+
+ //Range of indecies for sub-matrix of B
+ int bBegin = BLOCK_SIZE * bx;
+ int bStep = BLOCK_SIZE * widthB;
+
+ //Local storage of sub-matrices of A and B;
+ __local double As[BLOCK_SIZE][BLOCK_SIZE];
+ __local double Bs[BLOCK_SIZE][BLOCK_SIZE];
+
+ //Temporary storage for result
+ double Dsub = 0;
+
+ //Counter for modulus every 32 iterations
+ int mCount = 0;
+
+ //Loop over all the sub-maticies of A and B required to compute
+ //the result sub-matrix
+ for(int a = aBegin, b = bBegin; a < aEnd; a += aStep, b += bStep){
+ //Load the matricies from global memory to local memory
+ //Each thread loads one element of each sub-matrix
+ As[ty][tx] = A[a + widthA * ty + tx];
+ Bs[ty][tx] = B[b + widthB * ty + tx];
+
+ //Synchronize threads
+ barrier(CLK_LOCAL_MEM_FENCE);
+
+ //Multiply the two sub-matrices together
+ Dsub += As[ty][0] * Bs[0][tx];
+ Dsub += As[ty][1] * Bs[1][tx];
+ Dsub += As[ty][2] * Bs[2][tx];
+ Dsub += As[ty][3] * Bs[3][tx];
+ Dsub += As[ty][4] * Bs[4][tx];
+ Dsub += As[ty][5] * Bs[5][tx];
+ Dsub += As[ty][6] * Bs[6][tx];
+ Dsub += As[ty][7] * Bs[7][tx];
+ Dsub += As[ty][8] * Bs[8][tx];
+ Dsub += As[ty][9] * Bs[9][tx];
+ Dsub += As[ty][10] * Bs[10][tx];
+ Dsub += As[ty][11] * Bs[11][tx];
+ Dsub += As[ty][12] * Bs[12][tx];
+ Dsub += As[ty][13] * Bs[13][tx];
+ Dsub += As[ty][14] * Bs[14][tx];
+ Dsub += As[ty][15] * Bs[15][tx];
+
+ mCount++;
+
+ //fmod every 1024 iterations
+ if(mCount == 64){
+ Dsub = fmod(Dsub, mod);
+ mCount = 0;
+ }
+
+ //Synchronize threads
+ barrier(CLK_LOCAL_MEM_FENCE);
+ }
+ //Calls fmod once to normalize the sum
+ Dsub = fmod(Dsub, mod);
+
+ //Calculates the offset in the result matrix
+ int d = widthB * BLOCK_SIZE * by + BLOCK_SIZE * bx;
+
+ //Load, add, and normalize with element from C
+ double c = C[d + ty * widthB + tx];
+ Dsub = Dsub - c;
+ Dsub = fmod((mod + Dsub), mod);
+
+ //Add the sum to the appropriate spot
+ D[d + ty * widthB + tx] = Dsub;
+}
\ No newline at end of file
diff --git a/linbox/algorithms/opencl-kernels/kernel-axmy-partial-1024-dp.cl b/linbox/algorithms/opencl-kernels/kernel-axmy-partial-1024-dp.cl
new file mode 100644
index 0000000..1f98e84
--- /dev/null
+++ b/linbox/algorithms/opencl-kernels/kernel-axmy-partial-1024-dp.cl
@@ -0,0 +1,79 @@
+/*
+ * kernel_axpy_parital_1024_dp.cl
+ *
+ * Created on: Dec 21, 2011
+ * Author: Matthew Wezowicz
+ */
+
+#define BLOCK_SIZE 16
+#pragma OPENCL EXTENSION cl_khr_fp64 : enable
+
+__kernel void matrixAxmyKernelModular1024DP(__global double* D, __global double* A, __global double* B,
+ __global double* C, const int widthA, const int widthB, const double mod){
+ //Geet Workgroup ID
+ int bx = get_group_id(0);
+ int by = get_group_id(1);
+
+ //Get Local ID
+ int tx = get_local_id(0);
+ int ty = get_local_id(1);
+
+ //Range of indexies for submatrix of A
+ int aBegin= widthA * BLOCK_SIZE * by;
+ int aEnd = aBegin + widthA - 1;
+ int aStep = BLOCK_SIZE;
+
+ //Range of indecies for sub-matrix of B
+ int bBegin = BLOCK_SIZE * bx;
+ int bStep = BLOCK_SIZE * widthB;
+
+ //Local storage of sub-matrices of A and B;
+ __local double As[BLOCK_SIZE][BLOCK_SIZE];
+ __local double Bs[BLOCK_SIZE][BLOCK_SIZE];
+
+ //Temporary storage for result
+ double Dsub = 0;
+
+ //Counter for modulus every 32 iterations
+ int mCount = 0;
+
+ //Loop over all the sub-maticies of A and B required to compute
+ //the result sub-matrix
+ for(int a = aBegin, b = bBegin; a < aEnd; a += aStep, b += bStep){
+ //Load the matricies from global memory to local memory
+ //Each thread loads one element of each sub-matrix
+ As[ty][tx] = A[a + widthA * ty + tx];
+ Bs[ty][tx] = B[b + widthB * ty + tx];
+
+ //Synchronize threads
+ barrier(CLK_LOCAL_MEM_FENCE);
+
+ //Multiply the two sub-matrices together
+ for(int i = 0; i < BLOCK_SIZE; i++){
+ Dsub += As[ty][i] * Bs[i][tx];
+ }
+ mCount++;
+
+ //fmod every 1024 iterations
+ if(mCount == 64){
+ Dsub = fmod(Dsub, mod);
+ mCount = 0;
+ }
+
+ //Synchronize threads
+ barrier(CLK_LOCAL_MEM_FENCE);
+ }
+ //Calls fmod once to normalize the sum
+ Dsub = fmod(Dsub, mod);
+
+ //Calculates the offset in the result matrix
+ int d = widthB * BLOCK_SIZE * by + BLOCK_SIZE * bx;
+
+ //Load, add, and normalize with element from C
+ double c = C[d + ty * widthB + tx];
+ Dsub = Dsub - c;
+ Dsub = fmod((mod + Dsub), mod);
+
+ //Add the sum to the appropriate spot
+ D[d + ty * widthB + tx] = Dsub;
+}
\ No newline at end of file
diff --git a/linbox/algorithms/opencl-kernels/kernel-axmy-partial-1024-sp-unroll.cl b/linbox/algorithms/opencl-kernels/kernel-axmy-partial-1024-sp-unroll.cl
new file mode 100644
index 0000000..095884e
--- /dev/null
+++ b/linbox/algorithms/opencl-kernels/kernel-axmy-partial-1024-sp-unroll.cl
@@ -0,0 +1,92 @@
+/*
+ * kernel_axpy_parital_1024_sp.cl
+ *
+ * Created on: Dec 21, 2011
+ * Author: Matthew Wezowicz
+ */
+
+#define BLOCK_SIZE 16
+
+__kernel void matrixAxmyKernelModular1024SP(__global float* D, __global float* A, __global float* B,
+ __global float* C, const int widthA, const int widthB, const float mod){
+ //Geet Workgroup ID
+ int bx = get_group_id(0);
+ int by = get_group_id(1);
+
+ //Get Local ID
+ int tx = get_local_id(0);
+ int ty = get_local_id(1);
+
+ //Range of indexies for submatrix of A
+ int aBegin= widthA * BLOCK_SIZE * by;
+ int aEnd = aBegin + widthA - 1;
+ int aStep = BLOCK_SIZE;
+
+ //Range of indecies for sub-matrix of B
+ int bBegin = BLOCK_SIZE * bx;
+ int bStep = BLOCK_SIZE * widthB;
+
+ //Local storage of sub-matrices of A and B;
+ __local float As[BLOCK_SIZE][BLOCK_SIZE];
+ __local float Bs[BLOCK_SIZE][BLOCK_SIZE];
+
+ //Temporary storage for result
+ float Dsub = 0;
+
+ //Counter for modulus every 32 iterations
+ int mCount = 0;
+
+ //Loop over all the sub-maticies of A and B required to compute
+ //the result sub-matrix
+ for(int a = aBegin, b = bBegin; a < aEnd; a += aStep, b += bStep){
+ //Load the matricies from global memory to local memory
+ //Each thread loads one element of each sub-matrix
+ As[ty][tx] = A[a + widthA * ty + tx];
+ Bs[ty][tx] = B[b + widthB * ty + tx];
+
+ //Synchronize threads
+ barrier(CLK_LOCAL_MEM_FENCE);
+
+ //Multiply the two sub-matrices together
+ Dsub += As[ty][0] * Bs[0][tx];
+ Dsub += As[ty][1] * Bs[1][tx];
+ Dsub += As[ty][2] * Bs[2][tx];
+ Dsub += As[ty][3] * Bs[3][tx];
+ Dsub += As[ty][4] * Bs[4][tx];
+ Dsub += As[ty][5] * Bs[5][tx];
+ Dsub += As[ty][6] * Bs[6][tx];
+ Dsub += As[ty][7] * Bs[7][tx];
+ Dsub += As[ty][8] * Bs[8][tx];
+ Dsub += As[ty][9] * Bs[9][tx];
+ Dsub += As[ty][10] * Bs[10][tx];
+ Dsub += As[ty][11] * Bs[11][tx];
+ Dsub += As[ty][12] * Bs[12][tx];
+ Dsub += As[ty][13] * Bs[13][tx];
+ Dsub += As[ty][14] * Bs[14][tx];
+ Dsub += As[ty][15] * Bs[15][tx];
+
+ mCount++;
+
+ //fmod every 1024 iterations
+ if(mCount == 64){
+ Dsub = fmod(Dsub, mod);
+ mCount = 0;
+ }
+
+ //Synchronize threads
+ barrier(CLK_LOCAL_MEM_FENCE);
+ }
+ //Calls fmod once to normalize the sum
+ Dsub = fmod(Dsub, mod);
+
+ //Calculates the offset inthe result matrix
+ int d = widthB * BLOCK_SIZE * by + BLOCK_SIZE * bx;
+
+ //Load, add, and normalize with element from C
+ float c = C[d + ty * widthB + tx];
+ Dsub = Dsub - c;
+ Dsub = fmod((mod + Dsub), mod);
+
+ //Add the sum to the appropriate spot
+ D[d + ty * widthB + tx] = Dsub;
+}
\ No newline at end of file
diff --git a/linbox/algorithms/opencl-kernels/kernel-axmy-partial-1024-sp.cl b/linbox/algorithms/opencl-kernels/kernel-axmy-partial-1024-sp.cl
new file mode 100644
index 0000000..6902ef3
--- /dev/null
+++ b/linbox/algorithms/opencl-kernels/kernel-axmy-partial-1024-sp.cl
@@ -0,0 +1,78 @@
+/*
+ * kernel_axpy_parital_1024_sp.cl
+ *
+ * Created on: Dec 21, 2011
+ * Author: Matthew Wezowicz
+ */
+
+#define BLOCK_SIZE 16
+
+__kernel void matrixAxmyKernelModular1024SP(__global float* D, __global float* A, __global float* B,
+ __global float* C, const int widthA, const int widthB, const float mod){
+ //Geet Workgroup ID
+ int bx = get_group_id(0);
+ int by = get_group_id(1);
+
+ //Get Local ID
+ int tx = get_local_id(0);
+ int ty = get_local_id(1);
+
+ //Range of indexies for submatrix of A
+ int aBegin= widthA * BLOCK_SIZE * by;
+ int aEnd = aBegin + widthA - 1;
+ int aStep = BLOCK_SIZE;
+
+ //Range of indecies for sub-matrix of B
+ int bBegin = BLOCK_SIZE * bx;
+ int bStep = BLOCK_SIZE * widthB;
+
+ //Local storage of sub-matrices of A and B;
+ __local float As[BLOCK_SIZE][BLOCK_SIZE];
+ __local float Bs[BLOCK_SIZE][BLOCK_SIZE];
+
+ //Temporary storage for result
+ float Dsub = 0;
+
+ //Counter for modulus every 32 iterations
+ int mCount = 0;
+
+ //Loop over all the sub-maticies of A and B required to compute
+ //the result sub-matrix
+ for(int a = aBegin, b = bBegin; a < aEnd; a += aStep, b += bStep){
+ //Load the matricies from global memory to local memory
+ //Each thread loads one element of each sub-matrix
+ As[ty][tx] = A[a + widthA * ty + tx];
+ Bs[ty][tx] = B[b + widthB * ty + tx];
+
+ //Synchronize threads
+ barrier(CLK_LOCAL_MEM_FENCE);
+
+ //Multiply the two sub-matrices together
+ for(int i = 0; i < BLOCK_SIZE; i++){
+ Dsub += As[ty][i] * Bs[i][tx];
+ }
+ mCount++;
+
+ //fmod every 1024 iterations
+ if(mCount == 64){
+ Dsub = fmod(Dsub, mod);
+ mCount = 0;
+ }
+
+ //Synchronize threads
+ barrier(CLK_LOCAL_MEM_FENCE);
+ }
+ //Calls fmod once to normalize the sum
+ Dsub = fmod(Dsub, mod);
+
+ //Calculates the offset inthe result matrix
+ int d = widthB * BLOCK_SIZE * by + BLOCK_SIZE * bx;
+
+ //Load, add, and normalize with element from C
+ float c = C[d + ty * widthB + tx];
+ Dsub = Dsub - c;
+ Dsub = fmod((mod + Dsub), mod);
+
+ //Add the sum to the appropriate spot
+ D[d + ty * widthB + tx] = Dsub;
+}
\ No newline at end of file
diff --git a/linbox/algorithms/opencl-kernels/kernel-axmy-partial-16-sp-unroll.cl b/linbox/algorithms/opencl-kernels/kernel-axmy-partial-16-sp-unroll.cl
new file mode 100644
index 0000000..240c88b
--- /dev/null
+++ b/linbox/algorithms/opencl-kernels/kernel-axmy-partial-16-sp-unroll.cl
@@ -0,0 +1,79 @@
+/*
+ * kernel_axpy_parital_16_sp.cl
+ *
+ * Created on: Dec 21, 2011
+ * Author: Matthew Wezowicz
+ */
+
+#define BLOCK_SIZE 16
+
+__kernel void matrixAxmyKernelModular16SP(__global float* D, __global float* A, __global float* B,
+ __global float* C, const int widthA, const int widthB, const float mod){
+ //Geet Workgroup ID
+ int bx = get_group_id(0);
+ int by = get_group_id(1);
+
+ //Get Local ID
+ int tx = get_local_id(0);
+ int ty = get_local_id(1);
+
+ //Range of indexies for submatrix of A
+ int aBegin= widthA * BLOCK_SIZE * by;
+ int aEnd = aBegin + widthA - 1;
+ int aStep = BLOCK_SIZE;
+
+ //Range of indecies for sub-matrix of B
+ int bBegin = BLOCK_SIZE * bx;
+ int bStep = BLOCK_SIZE * widthB;
+
+ //Local storage of sub-matrices of A and B;
+ __local float As[BLOCK_SIZE][BLOCK_SIZE];
+ __local float Bs[BLOCK_SIZE][BLOCK_SIZE];
+
+ //Temporary storage for result
+ float Dsub = 0;
+
+ //Loop over all the sub-maticies of A and B required to compute
+ //the result sub-matrix
+ for(int a = aBegin, b = bBegin; a < aEnd; a += aStep, b += bStep){
+ //Load the matricies from global memory to local memory
+ //Each thread loads one element of each sub-matrix
+ As[ty][tx] = A[a + widthA * ty + tx];
+ Bs[ty][tx] = B[b + widthB * ty + tx];
+
+ //Synchronize threads
+ barrier(CLK_LOCAL_MEM_FENCE);
+
+ //Multiply the two sub-matrices together
+ Dsub += As[ty][0] * Bs[0][tx];
+ Dsub += As[ty][1] * Bs[1][tx];
+ Dsub += As[ty][2] * Bs[2][tx];
+ Dsub += As[ty][3] * Bs[3][tx];
+ Dsub += As[ty][4] * Bs[4][tx];
+ Dsub += As[ty][5] * Bs[5][tx];
+ Dsub += As[ty][6] * Bs[6][tx];
+ Dsub += As[ty][7] * Bs[7][tx];
+ Dsub += As[ty][8] * Bs[8][tx];
+ Dsub += As[ty][9] * Bs[9][tx];
+ Dsub += As[ty][10] * Bs[10][tx];
+ Dsub += As[ty][11] * Bs[11][tx];
+ Dsub += As[ty][12] * Bs[12][tx];
+ Dsub += As[ty][13] * Bs[13][tx];
+ Dsub += As[ty][14] * Bs[14][tx];
+ Dsub += As[ty][15] * Bs[15][tx];
+ Dsub = fmod(Dsub, mod);
+
+ //Synchronize threads
+ barrier(CLK_LOCAL_MEM_FENCE);
+ }
+ //Calculates the offset inthe result matrix
+ int d = widthB * BLOCK_SIZE * by + BLOCK_SIZE * bx;
+
+ //Load, add, and normalize with element from C
+ float c = C[d + ty * widthB + tx];
+ Dsub = Dsub - c;
+ Dsub = fmod((mod + Dsub), mod);
+
+ //Add the sum to the appropriate spot
+ D[d + ty * widthB + tx] = Dsub;
+}
\ No newline at end of file
diff --git a/linbox/algorithms/opencl-kernels/kernel-axmy-partial-16-sp.cl b/linbox/algorithms/opencl-kernels/kernel-axmy-partial-16-sp.cl
new file mode 100644
index 0000000..f96d441
--- /dev/null
+++ b/linbox/algorithms/opencl-kernels/kernel-axmy-partial-16-sp.cl
@@ -0,0 +1,66 @@
+/*
+ * kernel_axpy_parital_16_sp.cl
+ *
+ * Created on: Dec 21, 2011
+ * Author: Matthew Wezowicz
+ */
+
+#define BLOCK_SIZE 16
+
+__kernel void matrixAxmyKernelModular16SP(__global float* D, __global float* A, __global float* B,
+ __global float* C, const int widthA, const int widthB, const float mod){
+ //Geet Workgroup ID
+ int bx = get_group_id(0);
+ int by = get_group_id(1);
+
+ //Get Local ID
+ int tx = get_local_id(0);
+ int ty = get_local_id(1);
+
+ //Range of indexies for submatrix of A
+ int aBegin= widthA * BLOCK_SIZE * by;
+ int aEnd = aBegin + widthA - 1;
+ int aStep = BLOCK_SIZE;
+
+ //Range of indecies for sub-matrix of B
+ int bBegin = BLOCK_SIZE * bx;
+ int bStep = BLOCK_SIZE * widthB;
+
+ //Local storage of sub-matrices of A and B;
+ __local float As[BLOCK_SIZE][BLOCK_SIZE];
+ __local float Bs[BLOCK_SIZE][BLOCK_SIZE];
+
+ //Temporary storage for result
+ float Dsub = 0;
+
+ //Loop over all the sub-maticies of A and B required to compute
+ //the result sub-matrix
+ for(int a = aBegin, b = bBegin; a < aEnd; a += aStep, b += bStep){
+ //Load the matricies from global memory to local memory
+ //Each thread loads one element of each sub-matrix
+ As[ty][tx] = A[a + widthA * ty + tx];
+ Bs[ty][tx] = B[b + widthB * ty + tx];
+
+ //Synchronize threads
+ barrier(CLK_LOCAL_MEM_FENCE);
+
+ //Multiply the two sub-matrices together
+ for(int i = 0; i < BLOCK_SIZE; i++){
+ Dsub += As[ty][i] * Bs[i][tx];
+ }
+ Dsub = fmod(Dsub, mod);
+
+ //Synchronize threads
+ barrier(CLK_LOCAL_MEM_FENCE);
+ }
+ //Calculates the offset inthe result matrix
+ int d = widthB * BLOCK_SIZE * by + BLOCK_SIZE * bx;
+
+ //Load, add, and normalize with element from C
+ float c = C[d + ty * widthB + tx];
+ Dsub = Dsub - c;
+ Dsub = fmod((mod + Dsub), mod);
+
+ //Add the sum to the appropriate spot
+ D[d + ty * widthB + tx] = Dsub;
+}
\ No newline at end of file
diff --git a/linbox/algorithms/opencl-kernels/kernel-axmy-partial-32-dp-unroll.cl b/linbox/algorithms/opencl-kernels/kernel-axmy-partial-32-dp-unroll.cl
new file mode 100644
index 0000000..02688da
--- /dev/null
+++ b/linbox/algorithms/opencl-kernels/kernel-axmy-partial-32-dp-unroll.cl
@@ -0,0 +1,93 @@
+/*
+ * kernel_axmy_parital_32_dp.cl
+ *
+ * Created on: Dec 21, 2011
+ * Author: Matthew Wezowicz
+ */
+
+#define BLOCK_SIZE 16
+#pragma OPENCL EXTENSION cl_khr_fp64 : enable
+
+__kernel void matrixAxmyKernelModular32DP(__global double* D, __global double* A, __global double* B,
+ __global double* C, const int widthA, const int widthB, const double mod){
+ //Geet Workgroup ID
+ int bx = get_group_id(0);
+ int by = get_group_id(1);
+
+ //Get Local ID
+ int tx = get_local_id(0);
+ int ty = get_local_id(1);
+
+ //Range of indexies for submatrix of A
+ int aBegin= widthA * BLOCK_SIZE * by;
+ int aEnd = aBegin + widthA - 1;
+ int aStep = BLOCK_SIZE;
+
+ //Range of indecies for sub-matrix of B
+ int bBegin = BLOCK_SIZE * bx;
+ int bStep = BLOCK_SIZE * widthB;
+
+ //Local storage of sub-matrices of A and B;
+ __local double As[BLOCK_SIZE][BLOCK_SIZE];
+ __local double Bs[BLOCK_SIZE][BLOCK_SIZE];
+
+ //Temporary storage for result
+ double Dsub = 0;
+
+ //Counter for modulus every 32 iterations
+ int mCount = 0;
+
+ //Loop over all the sub-maticies of A and B required to compute
+ //the result sub-matrix
+ for(int a = aBegin, b = bBegin; a < aEnd; a += aStep, b += bStep){
+ //Load the matricies from global memory to local memory
+ //Each thread loads one element of each sub-matrix
+ As[ty][tx] = A[a + widthA * ty + tx];
+ Bs[ty][tx] = B[b + widthB * ty + tx];
+
+ //Synchronize threads
+ barrier(CLK_LOCAL_MEM_FENCE);
+
+ //Multiply the two sub-matrices together
+ Dsub += As[ty][0] * Bs[0][tx];
+ Dsub += As[ty][1] * Bs[1][tx];
+ Dsub += As[ty][2] * Bs[2][tx];
+ Dsub += As[ty][3] * Bs[3][tx];
+ Dsub += As[ty][4] * Bs[4][tx];
+ Dsub += As[ty][5] * Bs[5][tx];
+ Dsub += As[ty][6] * Bs[6][tx];
+ Dsub += As[ty][7] * Bs[7][tx];
+ Dsub += As[ty][8] * Bs[8][tx];
+ Dsub += As[ty][9] * Bs[9][tx];
+ Dsub += As[ty][10] * Bs[10][tx];
+ Dsub += As[ty][11] * Bs[11][tx];
+ Dsub += As[ty][12] * Bs[12][tx];
+ Dsub += As[ty][13] * Bs[13][tx];
+ Dsub += As[ty][14] * Bs[14][tx];
+ Dsub += As[ty][15] * Bs[15][tx];
+
+ mCount++;
+
+ //fmod every 32 iterations
+ if(mCount == 2){
+ Dsub = fmod(Dsub, mod);
+ mCount = 0;
+ }
+
+ //Synchronize threads
+ barrier(CLK_LOCAL_MEM_FENCE);
+ }
+ //Calls fmod once to normalize the sum
+ Dsub = fmod(Dsub, mod);
+
+ //Calculates the offset inthe result matrix
+ int d = widthB * BLOCK_SIZE * by + BLOCK_SIZE * bx;
+
+ //Load, add, and normalize with element from C
+ double c = C[d + ty * widthB + tx];
+ Dsub = Dsub - c;
+ Dsub = fmod((mod + Dsub), mod);
+
+ //Add the sum to the appropriate spot
+ D[d + ty * widthB + tx] = Dsub;
+}
\ No newline at end of file
diff --git a/linbox/algorithms/opencl-kernels/kernel-axmy-partial-32-dp.cl b/linbox/algorithms/opencl-kernels/kernel-axmy-partial-32-dp.cl
new file mode 100644
index 0000000..8796913
--- /dev/null
+++ b/linbox/algorithms/opencl-kernels/kernel-axmy-partial-32-dp.cl
@@ -0,0 +1,79 @@
+/*
+ * kernel_axmy_parital_32_dp.cl
+ *
+ * Created on: Dec 21, 2011
+ * Author: Matthew Wezowicz
+ */
+
+#define BLOCK_SIZE 16
+#pragma OPENCL EXTENSION cl_khr_fp64 : enable
+
+__kernel void matrixAxmyKernelModular32DP(__global double* D, __global double* A, __global double* B,
+ __global double* C, const int widthA, const int widthB, const double mod){
+ //Geet Workgroup ID
+ int bx = get_group_id(0);
+ int by = get_group_id(1);
+
+ //Get Local ID
+ int tx = get_local_id(0);
+ int ty = get_local_id(1);
+
+ //Range of indexies for submatrix of A
+ int aBegin= widthA * BLOCK_SIZE * by;
+ int aEnd = aBegin + widthA - 1;
+ int aStep = BLOCK_SIZE;
+
+ //Range of indecies for sub-matrix of B
+ int bBegin = BLOCK_SIZE * bx;
+ int bStep = BLOCK_SIZE * widthB;
+
+ //Local storage of sub-matrices of A and B;
+ __local double As[BLOCK_SIZE][BLOCK_SIZE];
+ __local double Bs[BLOCK_SIZE][BLOCK_SIZE];
+
+ //Temporary storage for result
+ double Dsub = 0;
+
+ //Counter for modulus every 32 iterations
+ int mCount = 0;
+
+ //Loop over all the sub-maticies of A and B required to compute
+ //the result sub-matrix
+ for(int a = aBegin, b = bBegin; a < aEnd; a += aStep, b += bStep){
+ //Load the matricies from global memory to local memory
+ //Each thread loads one element of each sub-matrix
+ As[ty][tx] = A[a + widthA * ty + tx];
+ Bs[ty][tx] = B[b + widthB * ty + tx];
+
+ //Synchronize threads
+ barrier(CLK_LOCAL_MEM_FENCE);
+
+ //Multiply the two sub-matrices together
+ for(int i = 0; i < BLOCK_SIZE; i++){
+ Dsub += As[ty][i] * Bs[i][tx];
+ }
+ mCount++;
+
+ //fmod every 32 iterations
+ if(mCount == 2){
+ Dsub = fmod(Dsub, mod);
+ mCount = 0;
+ }
+
+ //Synchronize threads
+ barrier(CLK_LOCAL_MEM_FENCE);
+ }
+ //Calls fmod once to normalize the sum
+ Dsub = fmod(Dsub, mod);
+
+ //Calculates the offset inthe result matrix
+ int d = widthB * BLOCK_SIZE * by + BLOCK_SIZE * bx;
+
+ //Load, add, and normalize with element from C
+ double c = C[d + ty * widthB + tx];
+ Dsub = Dsub - c;
+ Dsub = fmod((mod + Dsub), mod);
+
+ //Add the sum to the appropriate spot
+ D[d + ty * widthB + tx] = Dsub;
+}
\ No newline at end of file
diff --git a/linbox/algorithms/opencl-kernels/kernel-axmy-partial-32-sp-unroll.cl b/linbox/algorithms/opencl-kernels/kernel-axmy-partial-32-sp-unroll.cl
new file mode 100644
index 0000000..f077abe
--- /dev/null
+++ b/linbox/algorithms/opencl-kernels/kernel-axmy-partial-32-sp-unroll.cl
@@ -0,0 +1,92 @@
+/*
+ * kernel_axmy_parital_32_sp.cl
+ *
+ * Created on: Dec 21, 2011
+ * Author: Matthew Wezowicz
+ */
+
+#define BLOCK_SIZE 16
+
+__kernel void matrixAxmyKernelModular32SP(__global float* D, __global float* A, __global float* B,
+ __global float* C, const int widthA, const int widthB, const float mod){
+ //Geet Workgroup ID
+ int bx = get_group_id(0);
+ int by = get_group_id(1);
+
+ //Get Local ID
+ int tx = get_local_id(0);
+ int ty = get_local_id(1);
+
+ //Range of indexies for submatrix of A
+ int aBegin= widthA * BLOCK_SIZE * by;
+ int aEnd = aBegin + widthA - 1;
+ int aStep = BLOCK_SIZE;
+
+ //Range of indecies for sub-matrix of B
+ int bBegin = BLOCK_SIZE * bx;
+ int bStep = BLOCK_SIZE * widthB;
+
+ //Local storage of sub-matrices of A and B;
+ __local float As[BLOCK_SIZE][BLOCK_SIZE];
+ __local float Bs[BLOCK_SIZE][BLOCK_SIZE];
+
+ //Temporary storage for result
+ float Dsub = 0;
+
+ //Counter for modulus every 32 iterations
+ int mCount = 0;
+
+ //Loop over all the sub-maticies of A and B required to compute
+ //the result sub-matrix
+ for(int a = aBegin, b = bBegin; a < aEnd; a += aStep, b += bStep){
+ //Load the matricies from global memory to local memory
+ //Each thread loads one element of each sub-matrix
+ As[ty][tx] = A[a + widthA * ty + tx];
+ Bs[ty][tx] = B[b + widthB * ty + tx];
+
+ //Synchronize threads
+ barrier(CLK_LOCAL_MEM_FENCE);
+
+ //Multiply the two sub-matrices together
+ Dsub += As[ty][0] * Bs[0][tx];
+ Dsub += As[ty][1] * Bs[1][tx];
+ Dsub += As[ty][2] * Bs[2][tx];
+ Dsub += As[ty][3] * Bs[3][tx];
+ Dsub += As[ty][4] * Bs[4][tx];
+ Dsub += As[ty][5] * Bs[5][tx];
+ Dsub += As[ty][6] * Bs[6][tx];
+ Dsub += As[ty][7] * Bs[7][tx];
+ Dsub += As[ty][8] * Bs[8][tx];
+ Dsub += As[ty][9] * Bs[9][tx];
+ Dsub += As[ty][10] * Bs[10][tx];
+ Dsub += As[ty][11] * Bs[11][tx];
+ Dsub += As[ty][12] * Bs[12][tx];
+ Dsub += As[ty][13] * Bs[13][tx];
+ Dsub += As[ty][14] * Bs[14][tx];
+ Dsub += As[ty][15] * Bs[15][tx];
+
+ mCount++;
+
+ //fmod every 32 iterations
+ if(mCount == 2){
+ Dsub = fmod(Dsub, mod);
+ mCount = 0;
+ }
+
+ //Synchronize threads
+ barrier(CLK_LOCAL_MEM_FENCE);
+ }
+ //Calls fmod once to normalize the sum
+ Dsub = fmod(Dsub, mod);
+
+ //Calculates the offset inthe result matrix
+ int d = widthB * BLOCK_SIZE * by + BLOCK_SIZE * bx;
+
+ //Load, add, and normalize with element from C
+ float c = C[d + ty * widthB + tx];
+ Dsub = Dsub - c;
+ Dsub = fmod((mod + Dsub), mod);
+
+ //Add the sum to the appropriate spot
+ D[d + ty * widthB + tx] = Dsub;
+}
\ No newline at end of file
diff --git a/linbox/algorithms/opencl-kernels/kernel-axmy-partial-32-sp.cl b/linbox/algorithms/opencl-kernels/kernel-axmy-partial-32-sp.cl
new file mode 100644
index 0000000..421e8e7
--- /dev/null
+++ b/linbox/algorithms/opencl-kernels/kernel-axmy-partial-32-sp.cl
@@ -0,0 +1,78 @@
+/*
+ * kernel_axmy_parital_32_sp.cl
+ *
+ * Created on: Dec 21, 2011
+ * Author: Matthew Wezowicz
+ */
+
+#define BLOCK_SIZE 16
+
+__kernel void matrixAxmyKernelModular32SP(__global float* D, __global float* A, __global float* B,
+ __global float* C, const int widthA, const int widthB, const float mod){
+ //Geet Workgroup ID
+ int bx = get_group_id(0);
+ int by = get_group_id(1);
+
+ //Get Local ID
+ int tx = get_local_id(0);
+ int ty = get_local_id(1);
+
+ //Range of indexies for submatrix of A
+ int aBegin= widthA * BLOCK_SIZE * by;
+ int aEnd = aBegin + widthA - 1;
+ int aStep = BLOCK_SIZE;
+
+ //Range of indecies for sub-matrix of B
+ int bBegin = BLOCK_SIZE * bx;
+ int bStep = BLOCK_SIZE * widthB;
+
+ //Local storage of sub-matrices of A and B;
+ __local float As[BLOCK_SIZE][BLOCK_SIZE];
+ __local float Bs[BLOCK_SIZE][BLOCK_SIZE];
+
+ //Temporary storage for result
+ float Dsub = 0;
+
+ //Counter for modulus every 32 iterations
+ int mCount = 0;
+
+ //Loop over all the sub-maticies of A and B required to compute
+ //the result sub-matrix
+ for(int a = aBegin, b = bBegin; a < aEnd; a += aStep, b += bStep){
+ //Load the matricies from global memory to local memory
+ //Each thread loads one element of each sub-matrix
+ As[ty][tx] = A[a + widthA * ty + tx];
+ Bs[ty][tx] = B[b + widthB * ty + tx];
+
+ //Synchronize threads
+ barrier(CLK_LOCAL_MEM_FENCE);
+
+ //Multiply the two sub-matrices together
+ for(int i = 0; i < BLOCK_SIZE; i++){
+ Dsub += As[ty][i] * Bs[i][tx];
+ }
+ mCount++;
+
+ //fmod every 32 iterations
+ if(mCount == 2){
+ Dsub = fmod(Dsub, mod);
+ mCount = 0;
+ }
+
+ //Synchronize threads
+ barrier(CLK_LOCAL_MEM_FENCE);
+ }
+ //Calls fmod once to normalize the sum
+ Dsub = fmod(Dsub, mod);
+
+ //Calculates the offset inthe result matrix
+ int d = widthB * BLOCK_SIZE * by + BLOCK_SIZE * bx;
+
+ //Load, add, and normalize with element from C
+ float c = C[d + ty * widthB + tx];
+ Dsub = Dsub - c;
+ Dsub = fmod((mod + Dsub), mod);
+
+ //Add the sum to the appropriate spot
+ D[d + ty * widthB + tx] = Dsub;
+}
\ No newline at end of file
diff --git a/linbox/algorithms/opencl-kernels/kernel-axmy-partial-8-dp-unroll.cl b/linbox/algorithms/opencl-kernels/kernel-axmy-partial-8-dp-unroll.cl
new file mode 100644
index 0000000..f921176
--- /dev/null
+++ b/linbox/algorithms/opencl-kernels/kernel-axmy-partial-8-dp-unroll.cl
@@ -0,0 +1,82 @@
+/*
+ * kernel_axmy_parital_8_dp.cl
+ *
+ * Created on: Dec 21, 2011
+ * Author: Matthew Wezowicz
+ */
+
+#define BLOCK_SIZE 16
+#pragma OPENCL EXTENSION cl_khr_fp64 : enable
+
+__kernel void matrixAxmyKernelModular8DP(__global double* D, __global double* A, __global double* B,
+ __global double* C, const int widthA, const int widthB, const double mod){
+ //Geet Workgroup ID
+ int bx = get_group_id(0);
+ int by = get_group_id(1);
+
+ //Get Local ID
+ int tx = get_local_id(0);
+ int ty = get_local_id(1);
+
+ //Range of indexies for submatrix of A
+ int aBegin= widthA * BLOCK_SIZE * by;
+ int aEnd = aBegin + widthA - 1;
+ int aStep = BLOCK_SIZE;
+
+ //Range of indecies for sub-matrix of B
+ int bBegin = BLOCK_SIZE * bx;
+ int bStep = BLOCK_SIZE * widthB;
+
+ //Local storage of sub-matrices of A and B;
+ __local double As[BLOCK_SIZE][BLOCK_SIZE];
+ __local double Bs[BLOCK_SIZE][BLOCK_SIZE];
+
+ //Temporary storage for result
+ double Dsub = 0;
+
+ //Loop over all the sub-maticies of A and B required to compute
+ //the result sub-matrix
+ for(int a = aBegin, b = bBegin; a < aEnd; a += aStep, b += bStep){
+ //Load the matricies from global memory to local memory
+ //Each thread loads one element of each sub-matrix
+ As[ty][tx] = A[a + widthA * ty + tx];
+ Bs[ty][tx] = B[b + widthB * ty + tx];
+
+ //Synchronize threads
+ barrier(CLK_LOCAL_MEM_FENCE);
+
+ //Multiply the two sub-matrices together
+ Dsub += As[ty][0] * Bs[0][tx];
+ Dsub += As[ty][1] * Bs[1][tx];
+ Dsub += As[ty][2] * Bs[2][tx];
+ Dsub += As[ty][3] * Bs[3][tx];
+ Dsub += As[ty][4] * Bs[4][tx];
+ Dsub += As[ty][5] * Bs[5][tx];
+ Dsub += As[ty][6] * Bs[6][tx];
+ Dsub += As[ty][7] * Bs[7][tx];
+ Dsub = fmod(Dsub, mod);
+
+ Dsub += As[ty][8] * Bs[8][tx];
+ Dsub += As[ty][9] * Bs[9][tx];
+ Dsub += As[ty][10] * Bs[10][tx];
+ Dsub += As[ty][11] * Bs[11][tx];
+ Dsub += As[ty][12] * Bs[12][tx];
+ Dsub += As[ty][13] * Bs[13][tx];
+ Dsub += As[ty][14] * Bs[14][tx];
+ Dsub += As[ty][15] * Bs[15][tx];
+ Dsub = fmod(Dsub, mod);
+
+ //Synchronize threads
+ barrier(CLK_LOCAL_MEM_FENCE);
+ }
+ //Calculates the offset inthe result matrix
+ int d = widthB * BLOCK_SIZE * by + BLOCK_SIZE * bx;
+
+ //Load, add, and normalize with element from C
+ double c = C[d + ty * widthB + tx];
+ Dsub = Dsub - c;
+ Dsub = fmod((mod + Dsub), mod);
+
+ //Add the sum to the appropriate spot
+ D[d + ty * widthB + tx] = Dsub;
+}
\ No newline at end of file
diff --git a/linbox/algorithms/opencl-kernels/kernel-axmy-partial-8-dp.cl b/linbox/algorithms/opencl-kernels/kernel-axmy-partial-8-dp.cl
new file mode 100644
index 0000000..ffdf473
--- /dev/null
+++ b/linbox/algorithms/opencl-kernels/kernel-axmy-partial-8-dp.cl
@@ -0,0 +1,71 @@
+/*
+ * kernel_axmy_parital_8_dp.cl
+ *
+ * Created on: Dec 21, 2011
+ * Author: Matthew Wezowicz
+ */
+
+#define BLOCK_SIZE 16
+#pragma OPENCL EXTENSION cl_khr_fp64 : enable
+
+__kernel void matrixAxmyKernelModular8DP(__global double* D, __global double* A, __global double* B,
+ __global double* C, const int widthA, const int widthB, const double mod){
+ //Geet Workgroup ID
+ int bx = get_group_id(0);
+ int by = get_group_id(1);
+
+ //Get Local ID
+ int tx = get_local_id(0);
+ int ty = get_local_id(1);
+
+ //Range of indexies for submatrix of A
+ int aBegin= widthA * BLOCK_SIZE * by;
+ int aEnd = aBegin + widthA - 1;
+ int aStep = BLOCK_SIZE;
+
+ //Range of indecies for sub-matrix of B
+ int bBegin = BLOCK_SIZE * bx;
+ int bStep = BLOCK_SIZE * widthB;
+
+ //Local storage of sub-matrices of A and B;
+ __local double As[BLOCK_SIZE][BLOCK_SIZE];
+ __local double Bs[BLOCK_SIZE][BLOCK_SIZE];
+
+ //Temporary storage for result
+ double Dsub = 0;
+
+ //Loop over all the sub-maticies of A and B required to compute
+ //the result sub-matrix
+ for(int a = aBegin, b = bBegin; a < aEnd; a += aStep, b += bStep){
+ //Load the matricies from global memory to local memory
+ //Each thread loads one element of each sub-matrix
+ As[ty][tx] = A[a + widthA * ty + tx];
+ Bs[ty][tx] = B[b + widthB * ty + tx];
+
+ //Synchronize threads
+ barrier(CLK_LOCAL_MEM_FENCE);
+
+ //Multiply the two sub-matrices together
+ for(int i = 0; i < BLOCK_SIZE / 2; i++){
+ Dsub += As[ty][i] * Bs[i][tx];
+ }
+ Dsub = fmod(Dsub, mod);
+ for(int i = BLOCK_SIZE / 2; i < BLOCK_SIZE; i++){
+ Dsub += As[ty][i] * Bs[i][tx];
+ }
+ Dsub = fmod(Dsub, mod);
+
+ //Synchronize threads
+ barrier(CLK_LOCAL_MEM_FENCE);
+ }
+ //Calculates the offset inthe result matrix
+ int d = widthB * BLOCK_SIZE * by + BLOCK_SIZE * bx;
+
+ //Load, add, and normalize with element from C
+ double c = C[d + ty * widthB + tx];
+ Dsub = Dsub - c;
+ Dsub = fmod((mod + Dsub), mod);
+
+ //Add the sum to the appropriate spot
+ D[d + ty * widthB + tx] = Dsub;
+}
\ No newline at end of file
diff --git a/linbox/algorithms/opencl-kernels/kernel-axpy-modulus-dp-unroll.cl b/linbox/algorithms/opencl-kernels/kernel-axpy-modulus-dp-unroll.cl
new file mode 100644
index 0000000..02f2f24
--- /dev/null
+++ b/linbox/algorithms/opencl-kernels/kernel-axpy-modulus-dp-unroll.cl
@@ -0,0 +1,95 @@
+/*
+ * kernel_axpy_modulus_dp.cl
+ *
+ * Created on: Dec 20, 2011
+ * Author: Matthew Wezowicz
+ */
+
+#define BLOCK_SIZE 16
+#pragma OPENCL EXTENSION cl_khr_fp64 : enable
+
+__kernel void matrixAxpyKernelModular1DP(__global double* D, __global double* A, __global double* B,
+ __global double* C, const int widthA, const int widthB, const double mod){
+ //Geet Workgroup ID
+ int bx = get_group_id(0);
+ int by = get_group_id(1);
+
+ //Get Local ID
+ int tx = get_local_id(0);
+ int ty = get_local_id(1);
+
+ //Range of indexies for submatrix of A
+ int aBegin= widthA * BLOCK_SIZE * by;
+ int aEnd = aBegin + widthA - 1;
+ int aStep = BLOCK_SIZE;
+
+ //Range of indecies for sub-matrix of B
+ int bBegin = BLOCK_SIZE * bx;
+ int bStep = BLOCK_SIZE * widthB;
+
+ //Local storage of sub-matrices of A and B;
+ __local double As[BLOCK_SIZE][BLOCK_SIZE];
+ __local double Bs[BLOCK_SIZE][BLOCK_SIZE];
+
+ //Temporary storage for result
+ double Dsub = 0;
+
+ //Loop over all the sub-maticies of A and B required to compute
+ //the result sub-matrix
+ for(int a = aBegin, b = bBegin; a < aEnd; a += aStep, b += bStep){
+ //Load the matricies from global memory to local memory
+ //Each thread loads one element of each sub-matrix
+ As[ty][tx] = A[a + widthA * ty + tx];
+ Bs[ty][tx] = B[b + widthB * ty + tx];
+
+ //Synchronize threads
+ barrier(CLK_LOCAL_MEM_FENCE);
+
+ //Multiply the two sub-matrices together
+ Dsub += As[ty][0] * Bs[0][tx];
+ Dsub = fmod(Dsub, mod);
+ Dsub += As[ty][1] * Bs[1][tx];
+ Dsub = fmod(Dsub, mod);
+ Dsub += As[ty][2] * Bs[2][tx];
+ Dsub = fmod(Dsub, mod);
+ Dsub += As[ty][3] * Bs[3][tx];
+ Dsub = fmod(Dsub, mod);
+ Dsub += As[ty][4] * Bs[4][tx];
+ Dsub = fmod(Dsub, mod);
+ Dsub += As[ty][5] * Bs[5][tx];
+ Dsub = fmod(Dsub, mod);
+ Dsub += As[ty][6] * Bs[6][tx];
+ Dsub = fmod(Dsub, mod);
+ Dsub += As[ty][7] * Bs[7][tx];
+ Dsub = fmod(Dsub, mod);
+ Dsub += As[ty][8] * Bs[8][tx];
+ Dsub = fmod(Dsub, mod);
+ Dsub += As[ty][9] * Bs[9][tx];
+ Dsub = fmod(Dsub, mod);
+ Dsub += As[ty][10] * Bs[10][tx];
+ Dsub = fmod(Dsub, mod);
+ Dsub += As[ty][11] * Bs[11][tx];
+ Dsub = fmod(Dsub, mod);
+ Dsub += As[ty][12] * Bs[12][tx];
+ Dsub = fmod(Dsub, mod);
+ Dsub += As[ty][13] * Bs[13][tx];
+ Dsub = fmod(Dsub, mod);
+ Dsub += As[ty][14] * Bs[14][tx];
+ Dsub = fmod(Dsub, mod);
+ Dsub += As[ty][15] * Bs[15][tx];
+ Dsub = fmod(Dsub, mod);
+
+ //Synchronize threads
+ barrier(CLK_LOCAL_MEM_FENCE);
+ }
+ //Calculates the offset inthe result matrix
+ int d = widthB * BLOCK_SIZE * by + BLOCK_SIZE * bx;
+
+ //Load, add, and normalize with element from C
+ double c = C[d + ty * widthB + tx];
+ Dsub = Dsub + c;
+ Dsub = fmod(Dsub, mod);
+
+ //Add the sum to the appropriate spot
+ D[d + ty * widthB + tx] = Dsub;
+}
\ No newline at end of file
diff --git a/linbox/algorithms/opencl-kernels/kernel-axpy-modulus-dp.cl b/linbox/algorithms/opencl-kernels/kernel-axpy-modulus-dp.cl
new file mode 100644
index 0000000..89c1f80
--- /dev/null
+++ b/linbox/algorithms/opencl-kernels/kernel-axpy-modulus-dp.cl
@@ -0,0 +1,68 @@
+/*
+ * kernel_axpy_modulus_dp.cl
+ *
+ * Created on: Dec 20, 2011
+ * Author: Matthew Wezowicz
+ */
+
+#define BLOCK_SIZE 16
+#pragma OPENCL EXTENSION cl_khr_fp64 : enable
+
+__kernel void matrixAxpyKernelModular1DP(__global double* D, __global double* A, __global double* B,
+ __global double* C, const int widthA, const int widthB, const double mod){
+ //Geet Workgroup ID
+ int bx = get_group_id(0);
+ int by = get_group_id(1);
+
+ //Get Local ID
+ int tx = get_local_id(0);
+ int ty = get_local_id(1);
+
+ //Range of indexies for submatrix of A
+ int aBegin= widthA * BLOCK_SIZE * by;
+ int aEnd = aBegin + widthA - 1;
+ int aStep = BLOCK_SIZE;
+
+ //Range of indecies for sub-matrix of B
+ int bBegin = BLOCK_SIZE * bx;
+ int bStep = BLOCK_SIZE * widthB;
+
+ //Local storage of sub-matrices of A and B;
+ __local double As[BLOCK_SIZE][BLOCK_SIZE];
+ __local double Bs[BLOCK_SIZE][BLOCK_SIZE];
+
+ //Temporary storage for result
+ double Dsub = 0;
+
+ //Loop over all the sub-maticies of A and B required to compute
+ //the result sub-matrix
+ for(int a = aBegin, b = bBegin; a < aEnd; a += aStep, b += bStep){
+ //Load the matricies from global memory to local memory
+ //Each thread loads one element of each sub-matrix
+ As[ty][tx] = A[a + widthA * ty + tx];
+ Bs[ty][tx] = B[b + widthB * ty + tx];
+
+ //Synchronize threads
+ barrier(CLK_LOCAL_MEM_FENCE);
+
+ //Multiply the two sub-matrices together
+ for(int i = 0; i < BLOCK_SIZE; i++){
+ Dsub += As[ty][i] * Bs[i][tx];
+ //Calls fmod everey iteration to normalize the partial sum
+ Dsub = fmod(Dsub, mod);
+ }
+
+ //Synchronize threads
+ barrier(CLK_LOCAL_MEM_FENCE);
+ }
+ //Calculates the offset inthe result matrix
+ int d = widthB * BLOCK_SIZE * by + BLOCK_SIZE * bx;
+
+ //Load, add, and normalize with element from C
+ double c = C[d + ty * widthB + tx];
+ Dsub = Dsub + c;
+ Dsub = fmod(Dsub, mod);
+
+ //Add the sum to the appropriate spot
+ D[d + ty * widthB + tx] = Dsub;
+}
\ No newline at end of file
diff --git a/linbox/algorithms/opencl-kernels/kernel-axpy-modulus-sp-unroll.cl b/linbox/algorithms/opencl-kernels/kernel-axpy-modulus-sp-unroll.cl
new file mode 100644
index 0000000..10ad0d7
--- /dev/null
+++ b/linbox/algorithms/opencl-kernels/kernel-axpy-modulus-sp-unroll.cl
@@ -0,0 +1,94 @@
+/*
+ * kernel_axpy_modulus_sp.cl
+ *
+ * Created on: Dec 20, 2011
+ * Author: Matthew Wezowicz
+ */
+
+#define BLOCK_SIZE 16
+
+__kernel void matrixAxpyKernelModular1SP(__global float* D, __global float* A, __global float* B,
+ __global float* C, const int widthA, const int widthB, const float mod){
+ //Geet Workgroup ID
+ int bx = get_group_id(0);
+ int by = get_group_id(1);
+
+ //Get Local ID
+ int tx = get_local_id(0);
+ int ty = get_local_id(1);
+
+ //Range of indexies for submatrix of A
+ int aBegin= widthA * BLOCK_SIZE * by;
+ int aEnd = aBegin + widthA - 1;
+ int aStep = BLOCK_SIZE;
+
+ //Range of indecies for sub-matrix of B
+ int bBegin = BLOCK_SIZE * bx;
+ int bStep = BLOCK_SIZE * widthB;
+
+ //Local storage of sub-matrices of A and B;
+ __local float As[BLOCK_SIZE][BLOCK_SIZE];
+ __local float Bs[BLOCK_SIZE][BLOCK_SIZE];
+
+ //Temporary storage for result
+ float Dsub = 0;
+
+ //Loop over all the sub-maticies of A and B required to compute
+ //the result sub-matrix
+ for(int a = aBegin, b = bBegin; a < aEnd; a += aStep, b += bStep){
+ //Load the matricies from global memory to local memory
+ //Each thread loads one element of each sub-matrix
+ As[ty][tx] = A[a + widthA * ty + tx];
+ Bs[ty][tx] = B[b + widthB * ty + tx];
+
+ //Synchronize threads
+ barrier(CLK_LOCAL_MEM_FENCE);
+
+ //Multiply the two sub-matrices together
+ Dsub += As[ty][0] * Bs[0][tx];
+ Dsub = fmod(Dsub, mod);
+ Dsub += As[ty][1] * Bs[1][tx];
+ Dsub = fmod(Dsub, mod);
+ Dsub += As[ty][2] * Bs[2][tx];
+ Dsub = fmod(Dsub, mod);
+ Dsub += As[ty][3] * Bs[3][tx];
+ Dsub = fmod(Dsub, mod);
+ Dsub += As[ty][4] * Bs[4][tx];
+ Dsub = fmod(Dsub, mod);
+ Dsub += As[ty][5] * Bs[5][tx];
+ Dsub = fmod(Dsub, mod);
+ Dsub += As[ty][6] * Bs[6][tx];
+ Dsub = fmod(Dsub, mod);
+ Dsub += As[ty][7] * Bs[7][tx];
+ Dsub = fmod(Dsub, mod);
+ Dsub += As[ty][8] * Bs[8][tx];
+ Dsub = fmod(Dsub, mod);
+ Dsub += As[ty][9] * Bs[9][tx];
+ Dsub = fmod(Dsub, mod);
+ Dsub += As[ty][10] * Bs[10][tx];
+ Dsub = fmod(Dsub, mod);
+ Dsub += As[ty][11] * Bs[11][tx];
+ Dsub = fmod(Dsub, mod);
+ Dsub += As[ty][12] * Bs[12][tx];
+ Dsub = fmod(Dsub, mod);
+ Dsub += As[ty][13] * Bs[13][tx];
+ Dsub = fmod(Dsub, mod);
+ Dsub += As[ty][14] * Bs[14][tx];
+ Dsub = fmod(Dsub, mod);
+ Dsub += As[ty][15] * Bs[15][tx];
+ Dsub = fmod(Dsub, mod);
+
+ //Synchronize threads
+ barrier(CLK_LOCAL_MEM_FENCE);
+ }
+ //Calculates the offset inthe result matrix
+ int d = widthB * BLOCK_SIZE * by + BLOCK_SIZE * bx;
+
+ //Load, add, and normalize with element from C
+ float c = C[d + ty * widthB + tx];
+ Dsub = Dsub + c;
+ Dsub = fmod(Dsub, mod);
+
+ //Add the sum to the appropriate spot
+ D[d + ty * widthB + tx] = Dsub;
+}
\ No newline at end of file
diff --git a/linbox/algorithms/opencl-kernels/kernel-axpy-modulus-sp.cl b/linbox/algorithms/opencl-kernels/kernel-axpy-modulus-sp.cl
new file mode 100644
index 0000000..1349f80
--- /dev/null
+++ b/linbox/algorithms/opencl-kernels/kernel-axpy-modulus-sp.cl
@@ -0,0 +1,67 @@
+/*
+ * kernel_axpy_modulus_sp.cl
+ *
+ * Created on: Dec 20, 2011
+ * Author: Matthew Wezowicz
+ */
+
+#define BLOCK_SIZE 16
+
+__kernel void matrixAxpyKernelModular1SP(__global float* D, __global float* A, __global float* B,
+ __global float* C, const int widthA, const int widthB, const float mod){
+ //Geet Workgroup ID
+ int bx = get_group_id(0);
+ int by = get_group_id(1);
+
+ //Get Local ID
+ int tx = get_local_id(0);
+ int ty = get_local_id(1);
+
+ //Range of indexies for submatrix of A
+ int aBegin= widthA * BLOCK_SIZE * by;
+ int aEnd = aBegin + widthA - 1;
+ int aStep = BLOCK_SIZE;
+
+ //Range of indecies for sub-matrix of B
+ int bBegin = BLOCK_SIZE * bx;
+ int bStep = BLOCK_SIZE * widthB;
+
+ //Local storage of sub-matrices of A and B;
+ __local float As[BLOCK_SIZE][BLOCK_SIZE];
+ __local float Bs[BLOCK_SIZE][BLOCK_SIZE];
+
+ //Temporary storage for result
+ float Dsub = 0;
+
+ //Loop over all the sub-maticies of A and B required to compute
+ //the result sub-matrix
+ for(int a = aBegin, b = bBegin; a < aEnd; a += aStep, b += bStep){
+ //Load the matricies from global memory to local memory
+ //Each thread loads one element of each sub-matrix
+ As[ty][tx] = A[a + widthA * ty + tx];
+ Bs[ty][tx] = B[b + widthB * ty + tx];
+
+ //Synchronize threads
+ barrier(CLK_LOCAL_MEM_FENCE);
+
+ //Multiply the two sub-matrices together
+ for(int i = 0; i < BLOCK_SIZE; i++){
+ Dsub += As[ty][i] * Bs[i][tx];
+ //Calls fmod everey iteration to normalize the partial sum
+ Dsub = fmod(Dsub, mod);
+ }
+
+ //Synchronize threads
+ barrier(CLK_LOCAL_MEM_FENCE);
+ }
+ //Calculates the offset inthe result matrix
+ int d = widthB * BLOCK_SIZE * by + BLOCK_SIZE * bx;
+
+ //Load, add, and normalize with element from C
+ float c = C[d + ty * widthB + tx];
+ Dsub = Dsub + c;
+ Dsub = fmod(Dsub, mod);
+
+ //Add the sum to the appropriate spot
+ D[d + ty * widthB + tx] = Dsub;
+}
\ No newline at end of file
diff --git a/linbox/algorithms/opencl-kernels/kernel-axpy-partial-1024-dp-unroll.cl b/linbox/algorithms/opencl-kernels/kernel-axpy-partial-1024-dp-unroll.cl
new file mode 100644
index 0000000..9c15e54
--- /dev/null
+++ b/linbox/algorithms/opencl-kernels/kernel-axpy-partial-1024-dp-unroll.cl
@@ -0,0 +1,93 @@
+/*
+ * kernel_axpy_parital_1024_dp.cl
+ *
+ * Created on: Dec 20, 2011
+ * Author: Matthew Wezowicz
+ */
+
+#define BLOCK_SIZE 16
+#pragma OPENCL EXTENSION cl_khr_fp64 : enable
+
+__kernel void matrixAxpyKernelModular1024DP(__global double* D, __global double* A, __global double* B,
+ __global double* C, const int widthA, const int widthB, const double mod){
+ //Geet Workgroup ID
+ int bx = get_group_id(0);
+ int by = get_group_id(1);
+
+ //Get Local ID
+ int tx = get_local_id(0);
+ int ty = get_local_id(1);
+
+ //Range of indexies for submatrix of A
+ int aBegin= widthA * BLOCK_SIZE * by;
+ int aEnd = aBegin + widthA - 1;
+ int aStep = BLOCK_SIZE;
+
+ //Range of indecies for sub-matrix of B
+ int bBegin = BLOCK_SIZE * bx;
+ int bStep = BLOCK_SIZE * widthB;
+
+ //Local storage of sub-matrices of A and B;
+ __local double As[BLOCK_SIZE][BLOCK_SIZE];
+ __local double Bs[BLOCK_SIZE][BLOCK_SIZE];
+
+ //Temporary storage for result
+ double Dsub = 0;
+
+ //Counter for modulus every 32 iterations
+ int mCount = 0;
+
+ //Loop over all the sub-maticies of A and B required to compute
+ //the result sub-matrix
+ for(int a = aBegin, b = bBegin; a < aEnd; a += aStep, b += bStep){
+ //Load the matricies from global memory to local memory
+ //Each thread loads one element of each sub-matrix
+ As[ty][tx] = A[a + widthA * ty + tx];
+ Bs[ty][tx] = B[b + widthB * ty + tx];
+
+ //Synchronize threads
+ barrier(CLK_LOCAL_MEM_FENCE);
+
+ //Multiply the two sub-matrices together
+ Dsub += As[ty][0] * Bs[0][tx];
+ Dsub += As[ty][1] * Bs[1][tx];
+ Dsub += As[ty][2] * Bs[2][tx];
+ Dsub += As[ty][3] * Bs[3][tx];
+ Dsub += As[ty][4] * Bs[4][tx];
+ Dsub += As[ty][5] * Bs[5][tx];
+ Dsub += As[ty][6] * Bs[6][tx];
+ Dsub += As[ty][7] * Bs[7][tx];
+ Dsub += As[ty][8] * Bs[8][tx];
+ Dsub += As[ty][9] * Bs[9][tx];
+ Dsub += As[ty][10] * Bs[10][tx];
+ Dsub += As[ty][11] * Bs[11][tx];
+ Dsub += As[ty][12] * Bs[12][tx];
+ Dsub += As[ty][13] * Bs[13][tx];
+ Dsub += As[ty][14] * Bs[14][tx];
+ Dsub += As[ty][15] * Bs[15][tx];
+
+ mCount++;
+
+ //fmod every 1024 iterations
+ if(mCount == 64){
+ Dsub = fmod(Dsub, mod);
+ mCount = 0;
+ }
+
+ //Synchronize threads
+ barrier(CLK_LOCAL_MEM_FENCE);
+ }
+ //Calls fmod once to normalize the sum
+ Dsub = fmod(Dsub, mod);
+
+ //Calculates the offset in the result matrix
+ int d = widthB * BLOCK_SIZE * by + BLOCK_SIZE * bx;
+
+ //Load, add, and normalize with element from C
+ double c = C[d + ty * widthB + tx];
+ Dsub = Dsub + c;
+ Dsub = fmod(Dsub, mod);
+
+ //Add the sum to the appropriate spot
+ D[d + ty * widthB + tx] = Dsub;
+}
\ No newline at end of file
diff --git a/linbox/algorithms/opencl-kernels/kernel-axpy-partial-1024-dp.cl b/linbox/algorithms/opencl-kernels/kernel-axpy-partial-1024-dp.cl
new file mode 100644
index 0000000..7c99644
--- /dev/null
+++ b/linbox/algorithms/opencl-kernels/kernel-axpy-partial-1024-dp.cl
@@ -0,0 +1,79 @@
+/*
+ * kernel_axpy_parital_1024_dp.cl
+ *
+ * Created on: Dec 20, 2011
+ * Author: Matthew Wezowicz
+ */
+
+#define BLOCK_SIZE 16
+#pragma OPENCL EXTENSION cl_khr_fp64 : enable
+
+__kernel void matrixAxpyKernelModular1024DP(__global double* D, __global double* A, __global double* B,
+ __global double* C, const int widthA, const int widthB, const double mod){
+ //Geet Workgroup ID
+ int bx = get_group_id(0);
+ int by = get_group_id(1);
+
+ //Get Local ID
+ int tx = get_local_id(0);
+ int ty = get_local_id(1);
+
+ //Range of indexies for submatrix of A
+ int aBegin= widthA * BLOCK_SIZE * by;
+ int aEnd = aBegin + widthA - 1;
+ int aStep = BLOCK_SIZE;
+
+ //Range of indecies for sub-matrix of B
+ int bBegin = BLOCK_SIZE * bx;
+ int bStep = BLOCK_SIZE * widthB;
+
+ //Local storage of sub-matrices of A and B;
+ __local double As[BLOCK_SIZE][BLOCK_SIZE];
+ __local double Bs[BLOCK_SIZE][BLOCK_SIZE];
+
+ //Temporary storage for result
+ double Dsub = 0;
+
+ //Counter for modulus every 32 iterations
+ int mCount = 0;
+
+ //Loop over all the sub-maticies of A and B required to compute
+ //the result sub-matrix
+ for(int a = aBegin, b = bBegin; a < aEnd; a += aStep, b += bStep){
+ //Load the matricies from global memory to local memory
+ //Each thread loads one element of each sub-matrix
+ As[ty][tx] = A[a + widthA * ty + tx];
+ Bs[ty][tx] = B[b + widthB * ty + tx];
+
+ //Synchronize threads
+ barrier(CLK_LOCAL_MEM_FENCE);
+
+ //Multiply the two sub-matrices together
+ for(int i = 0; i < BLOCK_SIZE; i++){
+ Dsub += As[ty][i] * Bs[i][tx];
+ }
+ mCount++;
+
+ //fmod every 1024 iterations
+ if(mCount == 64){
+ Dsub = fmod(Dsub, mod);
+ mCount = 0;
+ }
+
+ //Synchronize threads
+ barrier(CLK_LOCAL_MEM_FENCE);
+ }
+ //Calls fmod once to normalize the sum
+ Dsub = fmod(Dsub, mod);
+
+ //Calculates the offset in the result matrix
+ int d = widthB * BLOCK_SIZE * by + BLOCK_SIZE * bx;
+
+ //Load, add, and normalize with element from C
+ double c = C[d + ty * widthB + tx];
+ Dsub = Dsub + c;
+ Dsub = fmod(Dsub, mod);
+
+ //Add the sum to the appropriate spot
+ D[d + ty * widthB + tx] = Dsub;
+}
\ No newline at end of file
diff --git a/linbox/algorithms/opencl-kernels/kernel-axpy-partial-1024-sp-unroll.cl b/linbox/algorithms/opencl-kernels/kernel-axpy-partial-1024-sp-unroll.cl
new file mode 100644
index 0000000..97e5d49
--- /dev/null
+++ b/linbox/algorithms/opencl-kernels/kernel-axpy-partial-1024-sp-unroll.cl
@@ -0,0 +1,92 @@
+/*
+ * kernel_axpy_parital_1024_sp.cl
+ *
+ * Created on: Dec 20, 2011
+ * Author: Matthew Wezowicz
+ */
+
+#define BLOCK_SIZE 16
+
+__kernel void matrixAxpyKernelModular1024SP(__global float* D, __global float* A, __global float* B,
+ __global float* C, const int widthA, const int widthB, const float mod){
+ //Geet Workgroup ID
+ int bx = get_group_id(0);
+ int by = get_group_id(1);
+
+ //Get Local ID
+ int tx = get_local_id(0);
+ int ty = get_local_id(1);
+
+ //Range of indexies for submatrix of A
+ int aBegin= widthA * BLOCK_SIZE * by;
+ int aEnd = aBegin + widthA - 1;
+ int aStep = BLOCK_SIZE;
+
+ //Range of indecies for sub-matrix of B
+ int bBegin = BLOCK_SIZE * bx;
+ int bStep = BLOCK_SIZE * widthB;
+
+ //Local storage of sub-matrices of A and B;
+ __local float As[BLOCK_SIZE][BLOCK_SIZE];
+ __local float Bs[BLOCK_SIZE][BLOCK_SIZE];
+
+ //Temporary storage for result
+ float Dsub = 0;
+
+ //Counter for modulus every 32 iterations
+ int mCount = 0;
+
+ //Loop over all the sub-maticies of A and B required to compute
+ //the result sub-matrix
+ for(int a = aBegin, b = bBegin; a < aEnd; a += aStep, b += bStep){
+ //Load the matricies from global memory to local memory
+ //Each thread loads one element of each sub-matrix
+ As[ty][tx] = A[a + widthA * ty + tx];
+ Bs[ty][tx] = B[b + widthB * ty + tx];
+
+ //Synchronize threads
+ barrier(CLK_LOCAL_MEM_FENCE);
+
+ //Multiply the two sub-matrices together
+ Dsub += As[ty][0] * Bs[0][tx];
+ Dsub += As[ty][1] * Bs[1][tx];
+ Dsub += As[ty][2] * Bs[2][tx];
+ Dsub += As[ty][3] * Bs[3][tx];
+ Dsub += As[ty][4] * Bs[4][tx];
+ Dsub += As[ty][5] * Bs[5][tx];
+ Dsub += As[ty][6] * Bs[6][tx];
+ Dsub += As[ty][7] * Bs[7][tx];
+ Dsub += As[ty][8] * Bs[8][tx];
+ Dsub += As[ty][9] * Bs[9][tx];
+ Dsub += As[ty][10] * Bs[10][tx];
+ Dsub += As[ty][11] * Bs[11][tx];
+ Dsub += As[ty][12] * Bs[12][tx];
+ Dsub += As[ty][13] * Bs[13][tx];
+ Dsub += As[ty][14] * Bs[14][tx];
+ Dsub += As[ty][15] * Bs[15][tx];
+
+ mCount++;
+
+ //fmod every 1024 iterations
+ if(mCount == 64){
+ Dsub = fmod(Dsub, mod);
+ mCount = 0;
+ }
+
+ //Synchronize threads
+ barrier(CLK_LOCAL_MEM_FENCE);
+ }
+ //Calls fmod once to normalize the sum
+ Dsub = fmod(Dsub, mod);
+
+ //Calculates the offset inthe result matrix
+ int d = widthB * BLOCK_SIZE * by + BLOCK_SIZE * bx;
+
+ //Load, add, and normalize with element from C
+ float c = C[d + ty * widthB + tx];
+ Dsub = Dsub + c;
+ Dsub = fmod(Dsub, mod);
+
+ //Add the sum to the appropriate spot
+ D[d + ty * widthB + tx] = Dsub;
+}
\ No newline at end of file
diff --git a/linbox/algorithms/opencl-kernels/kernel-axpy-partial-1024-sp.cl b/linbox/algorithms/opencl-kernels/kernel-axpy-partial-1024-sp.cl
new file mode 100644
index 0000000..35714ac
--- /dev/null
+++ b/linbox/algorithms/opencl-kernels/kernel-axpy-partial-1024-sp.cl
@@ -0,0 +1,78 @@
+/*
+ * kernel_axpy_parital_1024_sp.cl
+ *
+ * Created on: Dec 20, 2011
+ * Author: Matthew Wezowicz
+ */
+
+#define BLOCK_SIZE 16
+
+__kernel void matrixAxpyKernelModular1024SP(__global float* D, __global float* A, __global float* B,
+ __global float* C, const int widthA, const int widthB, const float mod){
+ //Geet Workgroup ID
+ int bx = get_group_id(0);
+ int by = get_group_id(1);
+
+ //Get Local ID
+ int tx = get_local_id(0);
+ int ty = get_local_id(1);
+
+ //Range of indexies for submatrix of A
+ int aBegin= widthA * BLOCK_SIZE * by;
+ int aEnd = aBegin + widthA - 1;
+ int aStep = BLOCK_SIZE;
+
+ //Range of indecies for sub-matrix of B
+ int bBegin = BLOCK_SIZE * bx;
+ int bStep = BLOCK_SIZE * widthB;
+
+ //Local storage of sub-matrices of A and B;
+ __local float As[BLOCK_SIZE][BLOCK_SIZE];
+ __local float Bs[BLOCK_SIZE][BLOCK_SIZE];
+
+ //Temporary storage for result
+ float Dsub = 0;
+
+ //Counter for modulus every 32 iterations
+ int mCount = 0;
+
+ //Loop over all the sub-maticies of A and B required to compute
+ //the result sub-matrix
+ for(int a = aBegin, b = bBegin; a < aEnd; a += aStep, b += bStep){
+ //Load the matricies from global memory to local memory
+ //Each thread loads one element of each sub-matrix
+ As[ty][tx] = A[a + widthA * ty + tx];
+ Bs[ty][tx] = B[b + widthB * ty + tx];
+
+ //Synchronize threads
+ barrier(CLK_LOCAL_MEM_FENCE);
+
+ //Multiply the two sub-matrices together
+ for(int i = 0; i < BLOCK_SIZE; i++){
+ Dsub += As[ty][i] * Bs[i][tx];
+ }
+ mCount++;
+
+ //fmod every 1024 iterations
+ if(mCount == 64){
+ Dsub = fmod(Dsub, mod);
+ mCount = 0;
+ }
+
+ //Synchronize threads
+ barrier(CLK_LOCAL_MEM_FENCE);
+ }
+ //Calls fmod once to normalize the sum
+ Dsub = fmod(Dsub, mod);
+
+ //Calculates the offset inthe result matrix
+ int d = widthB * BLOCK_SIZE * by + BLOCK_SIZE * bx;
+
+ //Load, add, and normalize with element from C
+ float c = C[d + ty * widthB + tx];
+ Dsub = Dsub + c;
+ Dsub = fmod(Dsub, mod);
+
+ //Add the sum to the appropriate spot
+ D[d + ty * widthB + tx] = Dsub;
+}
\ No newline at end of file
diff --git a/linbox/algorithms/opencl-kernels/kernel-axpy-partial-16-sp-unroll.cl b/linbox/algorithms/opencl-kernels/kernel-axpy-partial-16-sp-unroll.cl
new file mode 100644
index 0000000..30c20d1
--- /dev/null
+++ b/linbox/algorithms/opencl-kernels/kernel-axpy-partial-16-sp-unroll.cl
@@ -0,0 +1,79 @@
+/*
+ * kernel_axpy_parital_16_sp.cl
+ *
+ * Created on: Dec 20, 2011
+ * Author: Matthew Wezowicz
+ */
+
+#define BLOCK_SIZE 16
+
+__kernel void matrixAxpyKernelModular16SP(__global float* D, __global float* A, __global float* B,
+ __global float* C, const int widthA, const int widthB, const float mod){
+ //Geet Workgroup ID
+ int bx = get_group_id(0);
+ int by = get_group_id(1);
+
+ //Get Local ID
+ int tx = get_local_id(0);
+ int ty = get_local_id(1);
+
+ //Range of indexies for submatrix of A
+ int aBegin= widthA * BLOCK_SIZE * by;
+ int aEnd = aBegin + widthA - 1;
+ int aStep = BLOCK_SIZE;
+
+ //Range of indecies for sub-matrix of B
+ int bBegin = BLOCK_SIZE * bx;
+ int bStep = BLOCK_SIZE * widthB;
+
+ //Local storage of sub-matrices of A and B;
+ __local float As[BLOCK_SIZE][BLOCK_SIZE];
+ __local float Bs[BLOCK_SIZE][BLOCK_SIZE];
+
+ //Temporary storage for result
+ float Dsub = 0;
+
+ //Loop over all the sub-maticies of A and B required to compute
+ //the result sub-matrix
+ for(int a = aBegin, b = bBegin; a < aEnd; a += aStep, b += bStep){
+ //Load the matricies from global memory to local memory
+ //Each thread loads one element of each sub-matrix
+ As[ty][tx] = A[a + widthA * ty + tx];
+ Bs[ty][tx] = B[b + widthB * ty + tx];
+
+ //Synchronize threads
+ barrier(CLK_LOCAL_MEM_FENCE);
+
+ //Multiply the two sub-matrices together
+ Dsub += As[ty][0] * Bs[0][tx];
+ Dsub += As[ty][1] * Bs[1][tx];
+ Dsub += As[ty][2] * Bs[2][tx];
+ Dsub += As[ty][3] * Bs[3][tx];
+ Dsub += As[ty][4] * Bs[4][tx];
+ Dsub += As[ty][5] * Bs[5][tx];
+ Dsub += As[ty][6] * Bs[6][tx];
+ Dsub += As[ty][7] * Bs[7][tx];
+ Dsub += As[ty][8] * Bs[8][tx];
+ Dsub += As[ty][9] * Bs[9][tx];
+ Dsub += As[ty][10] * Bs[10][tx];
+ Dsub += As[ty][11] * Bs[11][tx];
+ Dsub += As[ty][12] * Bs[12][tx];
+ Dsub += As[ty][13] * Bs[13][tx];
+ Dsub += As[ty][14] * Bs[14][tx];
+ Dsub += As[ty][15] * Bs[15][tx];
+ Dsub = fmod(Dsub, mod);
+
+ //Synchronize threads
+ barrier(CLK_LOCAL_MEM_FENCE);
+ }
+ //Calculates the offset inthe result matrix
+ int d = widthB * BLOCK_SIZE * by + BLOCK_SIZE * bx;
+
+ //Load, add, and normalize with element from C
+ float c = C[d + ty * widthB + tx];
+ Dsub = Dsub + c;
+ Dsub = fmod(Dsub, mod);
+
+ //Add the sum to the appropriate spot
+ D[d + ty * widthB + tx] = Dsub;
+}
\ No newline at end of file
diff --git a/linbox/algorithms/opencl-kernels/kernel-axpy-partial-16-sp.cl b/linbox/algorithms/opencl-kernels/kernel-axpy-partial-16-sp.cl
new file mode 100644
index 0000000..20e8d1a
--- /dev/null
+++ b/linbox/algorithms/opencl-kernels/kernel-axpy-partial-16-sp.cl
@@ -0,0 +1,66 @@
+/*
+ * kernel_axpy_parital_16_sp.cl
+ *
+ * Created on: Dec 20, 2011
+ * Author: Matthew Wezowicz
+ */
+
+#define BLOCK_SIZE 16
+
+__kernel void matrixAxpyKernelModular16SP(__global float* D, __global float* A, __global float* B,
+ __global float* C, const int widthA, const int widthB, const float mod){
+ //Geet Workgroup ID
+ int bx = get_group_id(0);
+ int by = get_group_id(1);
+
+ //Get Local ID
+ int tx = get_local_id(0);
+ int ty = get_local_id(1);
+
+ //Range of indexies for submatrix of A
+ int aBegin= widthA * BLOCK_SIZE * by;
+ int aEnd = aBegin + widthA - 1;
+ int aStep = BLOCK_SIZE;
+
+ //Range of indecies for sub-matrix of B
+ int bBegin = BLOCK_SIZE * bx;
+ int bStep = BLOCK_SIZE * widthB;
+
+ //Local storage of sub-matrices of A and B;
+ __local float As[BLOCK_SIZE][BLOCK_SIZE];
+ __local float Bs[BLOCK_SIZE][BLOCK_SIZE];
+
+ //Temporary storage for result
+ float Dsub = 0;
+
+ //Loop over all the sub-maticies of A and B required to compute
+ //the result sub-matrix
+ for(int a = aBegin, b = bBegin; a < aEnd; a += aStep, b += bStep){
+ //Load the matricies from global memory to local memory
+ //Each thread loads one element of each sub-matrix
+ As[ty][tx] = A[a + widthA * ty + tx];
+ Bs[ty][tx] = B[b + widthB * ty + tx];
+
+ //Synchronize threads
+ barrier(CLK_LOCAL_MEM_FENCE);
+
+ //Multiply the two sub-matrices together
+ for(int i = 0; i < BLOCK_SIZE; i++){
+ Dsub += As[ty][i] * Bs[i][tx];
+ }
+ Dsub = fmod(Dsub, mod);
+
+ //Synchronize threads
+ barrier(CLK_LOCAL_MEM_FENCE);
+ }
+ //Calculates the offset inthe result matrix
+ int d = widthB * BLOCK_SIZE * by + BLOCK_SIZE * bx;
+
+ //Load, add, and normalize with element from C
+ float c = C[d + ty * widthB + tx];
+ Dsub = Dsub + c;
+ Dsub = fmod(Dsub, mod);
+
+ //Add the sum to the appropriate spot
+ D[d + ty * widthB + tx] = Dsub;
+}
\ No newline at end of file
diff --git a/linbox/algorithms/opencl-kernels/kernel-axpy-partial-32-dp-unroll.cl b/linbox/algorithms/opencl-kernels/kernel-axpy-partial-32-dp-unroll.cl
new file mode 100644
index 0000000..0bbf796
--- /dev/null
+++ b/linbox/algorithms/opencl-kernels/kernel-axpy-partial-32-dp-unroll.cl
@@ -0,0 +1,93 @@
+/*
+ * kernel_axpy_parital_32_dp.cl
+ *
+ * Created on: Dec 20, 2011
+ * Author: Matthew Wezowicz
+ */
+
+#define BLOCK_SIZE 16
+#pragma OPENCL EXTENSION cl_khr_fp64 : enable
+
+__kernel void matrixAxpyKernelModular32DP(__global double* D, __global double* A, __global double* B,
+ __global double* C, const int widthA, const int widthB, const double mod){
+ //Geet Workgroup ID
+ int bx = get_group_id(0);
+ int by = get_group_id(1);
+
+ //Get Local ID
+ int tx = get_local_id(0);
+ int ty = get_local_id(1);
+
+ //Range of indexies for submatrix of A
+ int aBegin= widthA * BLOCK_SIZE * by;
+ int aEnd = aBegin + widthA - 1;
+ int aStep = BLOCK_SIZE;
+
+ //Range of indecies for sub-matrix of B
+ int bBegin = BLOCK_SIZE * bx;
+ int bStep = BLOCK_SIZE * widthB;
+
+ //Local storage of sub-matrices of A and B;
+ __local double As[BLOCK_SIZE][BLOCK_SIZE];
+ __local double Bs[BLOCK_SIZE][BLOCK_SIZE];
+
+ //Temporary storage for result
+ double Dsub = 0;
+
+ //Counter for modulus every 32 iterations
+ int mCount = 0;
+
+ //Loop over all the sub-maticies of A and B required to compute
+ //the result sub-matrix
+ for(int a = aBegin, b = bBegin; a < aEnd; a += aStep, b += bStep){
+ //Load the matricies from global memory to local memory
+ //Each thread loads one element of each sub-matrix
+ As[ty][tx] = A[a + widthA * ty + tx];
+ Bs[ty][tx] = B[b + widthB * ty + tx];
+
+ //Synchronize threads
+ barrier(CLK_LOCAL_MEM_FENCE);
+
+ //Multiply the two sub-matrices together
+ Dsub += As[ty][0] * Bs[0][tx];
+ Dsub += As[ty][1] * Bs[1][tx];
+ Dsub += As[ty][2] * Bs[2][tx];
+ Dsub += As[ty][3] * Bs[3][tx];
+ Dsub += As[ty][4] * Bs[4][tx];
+ Dsub += As[ty][5] * Bs[5][tx];
+ Dsub += As[ty][6] * Bs[6][tx];
+ Dsub += As[ty][7] * Bs[7][tx];
+ Dsub += As[ty][8] * Bs[8][tx];
+ Dsub += As[ty][9] * Bs[9][tx];
+ Dsub += As[ty][10] * Bs[10][tx];
+ Dsub += As[ty][11] * Bs[11][tx];
+ Dsub += As[ty][12] * Bs[12][tx];
+ Dsub += As[ty][13] * Bs[13][tx];
+ Dsub += As[ty][14] * Bs[14][tx];
+ Dsub += As[ty][15] * Bs[15][tx];
+
+ mCount++;
+
+ //fmod every 32 iterations
+ if(mCount == 2){
+ Dsub = fmod(Dsub, mod);
+ mCount = 0;
+ }
+
+ //Synchronize threads
+ barrier(CLK_LOCAL_MEM_FENCE);
+ }
+ //Calls fmod once to normalize the sum
+ Dsub = fmod(Dsub, mod);
+
+ //Calculates the offset inthe result matrix
+ int d = widthB * BLOCK_SIZE * by + BLOCK_SIZE * bx;
+
+ //Load, add, and normalize with element from C
+ double c = C[d + ty * widthB + tx];
+ Dsub = Dsub + c;
+ Dsub = fmod(Dsub, mod);
+
+ //Add the sum to the appropriate spot
+ D[d + ty * widthB + tx] = Dsub;
+}
\ No newline at end of file
diff --git a/linbox/algorithms/opencl-kernels/kernel-axpy-partial-32-dp.cl b/linbox/algorithms/opencl-kernels/kernel-axpy-partial-32-dp.cl
new file mode 100644
index 0000000..736e6d7
--- /dev/null
+++ b/linbox/algorithms/opencl-kernels/kernel-axpy-partial-32-dp.cl
@@ -0,0 +1,79 @@
+/*
+ * kernel_axpy_parital_32_dp.cl
+ *
+ * Created on: Dec 20, 2011
+ * Author: Matthew Wezowicz
+ */
+
+#define BLOCK_SIZE 16
+#pragma OPENCL EXTENSION cl_khr_fp64 : enable
+
+__kernel void matrixAxpyKernelModular32DP(__global double* D, __global double* A, __global double* B,
+ __global double* C, const int widthA, const int widthB, const double mod){
+ //Geet Workgroup ID
+ int bx = get_group_id(0);
+ int by = get_group_id(1);
+
+ //Get Local ID
+ int tx = get_local_id(0);
+ int ty = get_local_id(1);
+
+ //Range of indexies for submatrix of A
+ int aBegin= widthA * BLOCK_SIZE * by;
+ int aEnd = aBegin + widthA - 1;
+ int aStep = BLOCK_SIZE;
+
+ //Range of indecies for sub-matrix of B
+ int bBegin = BLOCK_SIZE * bx;
+ int bStep = BLOCK_SIZE * widthB;
+
+ //Local storage of sub-matrices of A and B;
+ __local double As[BLOCK_SIZE][BLOCK_SIZE];
+ __local double Bs[BLOCK_SIZE][BLOCK_SIZE];
+
+ //Temporary storage for result
+ double Dsub = 0;
+
+ //Counter for modulus every 32 iterations
+ int mCount = 0;
+
+ //Loop over all the sub-maticies of A and B required to compute
+ //the result sub-matrix
+ for(int a = aBegin, b = bBegin; a < aEnd; a += aStep, b += bStep){
+ //Load the matricies from global memory to local memory
+ //Each thread loads one element of each sub-matrix
+ As[ty][tx] = A[a + widthA * ty + tx];
+ Bs[ty][tx] = B[b + widthB * ty + tx];
+
+ //Synchronize threads
+ barrier(CLK_LOCAL_MEM_FENCE);
+
+ //Multiply the two sub-matrices together
+ for(int i = 0; i < BLOCK_SIZE; i++){
+ Dsub += As[ty][i] * Bs[i][tx];
+ }
+ mCount++;
+
+ //fmod every 32 iterations
+ if(mCount == 2){
+ Dsub = fmod(Dsub, mod);
+ mCount = 0;
+ }
+
+ //Synchronize threads
+ barrier(CLK_LOCAL_MEM_FENCE);
+ }
+ //Calls fmod once to normalize the sum
+ Dsub = fmod(Dsub, mod);
+
+ //Calculates the offset inthe result matrix
+ int d = widthB * BLOCK_SIZE * by + BLOCK_SIZE * bx;
+
+ //Load, add, and normalize with element from C
+ double c = C[d + ty * widthB + tx];
+ Dsub = Dsub + c;
+ Dsub = fmod(Dsub, mod);
+
+ //Add the sum to the appropriate spot
+ D[d + ty * widthB + tx] = Dsub;
+}
\ No newline at end of file
diff --git a/linbox/algorithms/opencl-kernels/kernel-axpy-partial-32-sp-unroll.cl b/linbox/algorithms/opencl-kernels/kernel-axpy-partial-32-sp-unroll.cl
new file mode 100644
index 0000000..e67ef4c
--- /dev/null
+++ b/linbox/algorithms/opencl-kernels/kernel-axpy-partial-32-sp-unroll.cl
@@ -0,0 +1,92 @@
+/*
+ * kernel_axpy_parital_32_sp.cl
+ *
+ * Created on: Dec 20, 2011
+ * Author: Matthew Wezowicz
+ */
+
+#define BLOCK_SIZE 16
+
+__kernel void matrixAxpyKernelModular32SP(__global float* D, __global float* A, __global float* B,
+ __global float* C, const int widthA, const int widthB, const float mod){
+ //Geet Workgroup ID
+ int bx = get_group_id(0);
+ int by = get_group_id(1);
+
+ //Get Local ID
+ int tx = get_local_id(0);
+ int ty = get_local_id(1);
+
+ //Range of indexies for submatrix of A
+ int aBegin= widthA * BLOCK_SIZE * by;
+ int aEnd = aBegin + widthA - 1;
+ int aStep = BLOCK_SIZE;
+
+ //Range of indecies for sub-matrix of B
+ int bBegin = BLOCK_SIZE * bx;
+ int bStep = BLOCK_SIZE * widthB;
+
+ //Local storage of sub-matrices of A and B;
+ __local float As[BLOCK_SIZE][BLOCK_SIZE];
+ __local float Bs[BLOCK_SIZE][BLOCK_SIZE];
+
+ //Temporary storage for result
+ float Dsub = 0;
+
+ //Counter for modulus every 32 iterations
+ int mCount = 0;
+
+ //Loop over all the sub-maticies of A and B required to compute
+ //the result sub-matrix
+ for(int a = aBegin, b = bBegin; a < aEnd; a += aStep, b += bStep){
+ //Load the matricies from global memory to local memory
+ //Each thread loads one element of each sub-matrix
+ As[ty][tx] = A[a + widthA * ty + tx];
+ Bs[ty][tx] = B[b + widthB * ty + tx];
+
+ //Synchronize threads
+ barrier(CLK_LOCAL_MEM_FENCE);
+
+ //Multiply the two sub-matrices together
+ Dsub += As[ty][0] * Bs[0][tx];
+ Dsub += As[ty][1] * Bs[1][tx];
+ Dsub += As[ty][2] * Bs[2][tx];
+ Dsub += As[ty][3] * Bs[3][tx];
+ Dsub += As[ty][4] * Bs[4][tx];
+ Dsub += As[ty][5] * Bs[5][tx];
+ Dsub += As[ty][6] * Bs[6][tx];
+ Dsub += As[ty][7] * Bs[7][tx];
+ Dsub += As[ty][8] * Bs[8][tx];
+ Dsub += As[ty][9] * Bs[9][tx];
+ Dsub += As[ty][10] * Bs[10][tx];
+ Dsub += As[ty][11] * Bs[11][tx];
+ Dsub += As[ty][12] * Bs[12][tx];
+ Dsub += As[ty][13] * Bs[13][tx];
+ Dsub += As[ty][14] * Bs[14][tx];
+ Dsub += As[ty][15] * Bs[15][tx];
+
+ mCount++;
+
+ //fmod every 32 iterations
+ if(mCount == 2){
+ Dsub = fmod(Dsub, mod);
+ mCount = 0;
+ }
+
+ //Synchronize threads
+ barrier(CLK_LOCAL_MEM_FENCE);
+ }
+ //Calls fmod once to normalize the sum
+ Dsub = fmod(Dsub, mod);
+
+ //Calculates the offset inthe result matrix
+ int d = widthB * BLOCK_SIZE * by + BLOCK_SIZE * bx;
+
+ //Load, add, and normalize with element from C
+ float c = C[d + ty * widthB + tx];
+ Dsub = Dsub + c;
+ Dsub = fmod(Dsub, mod);
+
+ //Add the sum to the appropriate spot
+ D[d + ty * widthB + tx] = Dsub;
+}
\ No newline at end of file
diff --git a/linbox/algorithms/opencl-kernels/kernel-axpy-partial-32-sp.cl b/linbox/algorithms/opencl-kernels/kernel-axpy-partial-32-sp.cl
new file mode 100644
index 0000000..eecd16d
--- /dev/null
+++ b/linbox/algorithms/opencl-kernels/kernel-axpy-partial-32-sp.cl
@@ -0,0 +1,78 @@
+/*
+ * kernel_axpy_parital_32_sp.cl
+ *
+ * Created on: Dec 20, 2011
+ * Author: Matthew Wezowicz
+ */
+
+#define BLOCK_SIZE 16
+
+__kernel void matrixAxpyKernelModular32SP(__global float* D, __global float* A, __global float* B,
+ __global float* C, const int widthA, const int widthB, const float mod){
+ //Geet Workgroup ID
+ int bx = get_group_id(0);
+ int by = get_group_id(1);
+
+ //Get Local ID
+ int tx = get_local_id(0);
+ int ty = get_local_id(1);
+
+ //Range of indexies for submatrix of A
+ int aBegin= widthA * BLOCK_SIZE * by;
+ int aEnd = aBegin + widthA - 1;
+ int aStep = BLOCK_SIZE;
+
+ //Range of indecies for sub-matrix of B
+ int bBegin = BLOCK_SIZE * bx;
+ int bStep = BLOCK_SIZE * widthB;
+
+ //Local storage of sub-matrices of A and B;
+ __local float As[BLOCK_SIZE][BLOCK_SIZE];
+ __local float Bs[BLOCK_SIZE][BLOCK_SIZE];
+
+ //Temporary storage for result
+ float Dsub = 0;
+
+ //Counter for modulus every 32 iterations
+ int mCount = 0;
+
+ //Loop over all the sub-maticies of A and B required to compute
+ //the result sub-matrix
+ for(int a = aBegin, b = bBegin; a < aEnd; a += aStep, b += bStep){
+ //Load the matricies from global memory to local memory
+ //Each thread loads one element of each sub-matrix
+ As[ty][tx] = A[a + widthA * ty + tx];
+ Bs[ty][tx] = B[b + widthB * ty + tx];
+
+ //Synchronize threads
+ barrier(CLK_LOCAL_MEM_FENCE);
+
+ //Multiply the two sub-matrices together
+ for(int i = 0; i < BLOCK_SIZE; i++){
+ Dsub += As[ty][i] * Bs[i][tx];
+ }
+ mCount++;
+
+ //fmod every 32 iterations
+ if(mCount == 2){
+ Dsub = fmod(Dsub, mod);
+ mCount = 0;
+ }
+
+ //Synchronize threads
+ barrier(CLK_LOCAL_MEM_FENCE);
+ }
+ //Calls fmod once to normalize the sum
+ Dsub = fmod(Dsub, mod);
+
+ //Calculates the offset inthe result matrix
+ int d = widthB * BLOCK_SIZE * by + BLOCK_SIZE * bx;
+
+ //Load, add, and normalize with element from C
+ float c = C[d + ty * widthB + tx];
+ Dsub = Dsub + c;
+ Dsub = fmod(Dsub, mod);
+
+ //Add the sum to the appropriate spot
+ D[d + ty * widthB + tx] = Dsub;
+}
\ No newline at end of file
diff --git a/linbox/algorithms/opencl-kernels/kernel-axpy-partial-8-dp-unroll.cl b/linbox/algorithms/opencl-kernels/kernel-axpy-partial-8-dp-unroll.cl
new file mode 100644
index 0000000..5d9f0aa
--- /dev/null
+++ b/linbox/algorithms/opencl-kernels/kernel-axpy-partial-8-dp-unroll.cl
@@ -0,0 +1,82 @@
+/*
+ * kernel_axpy_parital_8_dp.cl
+ *
+ * Created on: Dec 20, 2011
+ * Author: Matthew Wezowicz
+ */
+
+#define BLOCK_SIZE 16
+#pragma OPENCL EXTENSION cl_khr_fp64 : enable
+
+__kernel void matrixAxpyKernelModular8DP(__global double* D, __global double* A, __global double* B,
+ __global double* C, const int widthA, const int widthB, const double mod){
+ //Geet Workgroup ID
+ int bx = get_group_id(0);
+ int by = get_group_id(1);
+
+ //Get Local ID
+ int tx = get_local_id(0);
+ int ty = get_local_id(1);
+
+ //Range of indexies for submatrix of A
+ int aBegin= widthA * BLOCK_SIZE * by;
+ int aEnd = aBegin + widthA - 1;
+ int aStep = BLOCK_SIZE;
+
+ //Range of indecies for sub-matrix of B
+ int bBegin = BLOCK_SIZE * bx;
+ int bStep = BLOCK_SIZE * widthB;
+
+ //Local storage of sub-matrices of A and B;
+ __local double As[BLOCK_SIZE][BLOCK_SIZE];
+ __local double Bs[BLOCK_SIZE][BLOCK_SIZE];
+
+ //Temporary storage for result
+ double Dsub = 0;
+
+ //Loop over all the sub-maticies of A and B required to compute
+ //the result sub-matrix
+ for(int a = aBegin, b = bBegin; a < aEnd; a += aStep, b += bStep){
+ //Load the matricies from global memory to local memory
+ //Each thread loads one element of each sub-matrix
+ As[ty][tx] = A[a + widthA * ty + tx];
+ Bs[ty][tx] = B[b + widthB * ty + tx];
+
+ //Synchronize threads
+ barrier(CLK_LOCAL_MEM_FENCE);
+
+ //Multiply the two sub-matrices together
+ Dsub += As[ty][0] * Bs[0][tx];
+ Dsub += As[ty][1] * Bs[1][tx];
+ Dsub += As[ty][2] * Bs[2][tx];
+ Dsub += As[ty][3] * Bs[3][tx];
+ Dsub += As[ty][4] * Bs[4][tx];
+ Dsub += As[ty][5] * Bs[5][tx];
+ Dsub += As[ty][6] * Bs[6][tx];
+ Dsub += As[ty][7] * Bs[7][tx];
+ Dsub = fmod(Dsub, mod);
+
+ Dsub += As[ty][8] * Bs[8][tx];
+ Dsub += As[ty][9] * Bs[9][tx];
+ Dsub += As[ty][10] * Bs[10][tx];
+ Dsub += As[ty][11] * Bs[11][tx];
+ Dsub += As[ty][12] * Bs[12][tx];
+ Dsub += As[ty][13] * Bs[13][tx];
+ Dsub += As[ty][14] * Bs[14][tx];
+ Dsub += As[ty][15] * Bs[15][tx];
+ Dsub = fmod(Dsub, mod);
+
+ //Synchronize threads
+ barrier(CLK_LOCAL_MEM_FENCE);
+ }
+ //Calculates the offset inthe result matrix
+ int d = widthB * BLOCK_SIZE * by + BLOCK_SIZE * bx;
+
+ //Load, add, and normalize with element from C
+ double c = C[d + ty * widthB + tx];
+ Dsub = Dsub + c;
+ Dsub = fmod(Dsub, mod);
+
+ //Add the sum to the appropriate spot
+ D[d + ty * widthB + tx] = Dsub;
+}
\ No newline at end of file
diff --git a/linbox/algorithms/opencl-kernels/kernel-axpy-partial-8-dp.cl b/linbox/algorithms/opencl-kernels/kernel-axpy-partial-8-dp.cl
new file mode 100644
index 0000000..985880f
--- /dev/null
+++ b/linbox/algorithms/opencl-kernels/kernel-axpy-partial-8-dp.cl
@@ -0,0 +1,71 @@
+/*
+ * kernel_axpy_parital_8_dp.cl
+ *
+ * Created on: Dec 20, 2011
+ * Author: Matthew Wezowicz
+ */
+
+#define BLOCK_SIZE 16
+#pragma OPENCL EXTENSION cl_khr_fp64 : enable
+
+__kernel void matrixAxpyKernelModular8DP(__global double* D, __global double* A, __global double* B,
+ __global double* C, const int widthA, const int widthB, const double mod){
+ //Geet Workgroup ID
+ int bx = get_group_id(0);
+ int by = get_group_id(1);
+
+ //Get Local ID
+ int tx = get_local_id(0);
+ int ty = get_local_id(1);
+
+ //Range of indexies for submatrix of A
+ int aBegin= widthA * BLOCK_SIZE * by;
+ int aEnd = aBegin + widthA - 1;
+ int aStep = BLOCK_SIZE;
+
+ //Range of indecies for sub-matrix of B
+ int bBegin = BLOCK_SIZE * bx;
+ int bStep = BLOCK_SIZE * widthB;
+
+ //Local storage of sub-matrices of A and B;
+ __local double As[BLOCK_SIZE][BLOCK_SIZE];
+ __local double Bs[BLOCK_SIZE][BLOCK_SIZE];
+
+ //Temporary storage for result
+ double Dsub = 0;
+
+ //Loop over all the sub-maticies of A and B required to compute
+ //the result sub-matrix
+ for(int a = aBegin, b = bBegin; a < aEnd; a += aStep, b += bStep){
+ //Load the matricies from global memory to local memory
+ //Each thread loads one element of each sub-matrix
+ As[ty][tx] = A[a + widthA * ty + tx];
+ Bs[ty][tx] = B[b + widthB * ty + tx];
+
+ //Synchronize threads
+ barrier(CLK_LOCAL_MEM_FENCE);
+
+ //Multiply the two sub-matrices together
+ for(int i = 0; i < BLOCK_SIZE / 2; i++){
+ Dsub += As[ty][i] * Bs[i][tx];
+ }
+ Dsub = fmod(Dsub, mod);
+ for(int i = BLOCK_SIZE / 2; i < BLOCK_SIZE; i++){
+ Dsub += As[ty][i] * Bs[i][tx];
+ }
+ Dsub = fmod(Dsub, mod);
+
+ //Synchronize threads
+ barrier(CLK_LOCAL_MEM_FENCE);
+ }
+ //Calculates the offset inthe result matrix
+ int d = widthB * BLOCK_SIZE * by + BLOCK_SIZE * bx;
+
+ //Load, add, and normalize with element from C
+ double c = C[d + ty * widthB + tx];
+ Dsub = Dsub + c;
+ Dsub = fmod(Dsub, mod);
+
+ //Add the sum to the appropriate spot
+ D[d + ty * widthB + tx] = Dsub;
+}
\ No newline at end of file
diff --git a/linbox/algorithms/opencl-kernels/kernel-maxpy-modulus-dp-unroll.cl b/linbox/algorithms/opencl-kernels/kernel-maxpy-modulus-dp-unroll.cl
new file mode 100644
index 0000000..c29981a
--- /dev/null
+++ b/linbox/algorithms/opencl-kernels/kernel-maxpy-modulus-dp-unroll.cl
@@ -0,0 +1,95 @@
+/*
+ * kernel_maxpy_modulus_dp.cl
+ *
+ * Created on: Dec 21, 2011
+ * Author: Matthew Wezowicz
+ */
+
+#define BLOCK_SIZE 16
+#pragma OPENCL EXTENSION cl_khr_fp64 : enable
+
+__kernel void matrixMaxpyKernelModular1DP(__global double* D, __global double* A, __global double* B,
+ __global double* C, const int widthA, const int widthB, const double mod){
+ //Geet Workgroup ID
+ int bx = get_group_id(0);
+ int by = get_group_id(1);
+
+ //Get Local ID
+ int tx = get_local_id(0);
+ int ty = get_local_id(1);
+
+ //Range of indexies for submatrix of A
+ int aBegin= widthA * BLOCK_SIZE * by;
+ int aEnd = aBegin + widthA - 1;
+ int aStep = BLOCK_SIZE;
+
+ //Range of indecies for sub-matrix of B
+ int bBegin = BLOCK_SIZE * bx;
+ int bStep = BLOCK_SIZE * widthB;
+
+ //Local storage of sub-matrices of A and B;
+ __local double As[BLOCK_SIZE][BLOCK_SIZE];
+ __local double Bs[BLOCK_SIZE][BLOCK_SIZE];
+
+ //Temporary storage for result
+ double Dsub = 0;
+
+ //Loop over all the sub-maticies of A and B required to compute
+ //the result sub-matrix
+ for(int a = aBegin, b = bBegin; a < aEnd; a += aStep, b += bStep){
+ //Load the matricies from global memory to local memory
+ //Each thread loads one element of each sub-matrix
+ As[ty][tx] = A[a + widthA * ty + tx];
+ Bs[ty][tx] = B[b + widthB * ty + tx];
+
+ //Synchronize threads
+ barrier(CLK_LOCAL_MEM_FENCE);
+
+ //Multiply the two sub-matrices together
+ Dsub += As[ty][0] * Bs[0][tx];
+ Dsub = fmod(Dsub, mod);
+ Dsub += As[ty][1] * Bs[1][tx];
+ Dsub = fmod(Dsub, mod);
+ Dsub += As[ty][2] * Bs[2][tx];
+ Dsub = fmod(Dsub, mod);
+ Dsub += As[ty][3] * Bs[3][tx];
+ Dsub = fmod(Dsub, mod);
+ Dsub += As[ty][4] * Bs[4][tx];
+ Dsub = fmod(Dsub, mod);
+ Dsub += As[ty][5] * Bs[5][tx];
+ Dsub = fmod(Dsub, mod);
+ Dsub += As[ty][6] * Bs[6][tx];
+ Dsub = fmod(Dsub, mod);
+ Dsub += As[ty][7] * Bs[7][tx];
+ Dsub = fmod(Dsub, mod);
+ Dsub += As[ty][8] * Bs[8][tx];
+ Dsub = fmod(Dsub, mod);
+ Dsub += As[ty][9] * Bs[9][tx];
+ Dsub = fmod(Dsub, mod);
+ Dsub += As[ty][10] * Bs[10][tx];
+ Dsub = fmod(Dsub, mod);
+ Dsub += As[ty][11] * Bs[11][tx];
+ Dsub = fmod(Dsub, mod);
+ Dsub += As[ty][12] * Bs[12][tx];
+ Dsub = fmod(Dsub, mod);
+ Dsub += As[ty][13] * Bs[13][tx];
+ Dsub = fmod(Dsub, mod);
+ Dsub += As[ty][14] * Bs[14][tx];
+ Dsub = fmod(Dsub, mod);
+ Dsub += As[ty][15] * Bs[15][tx];
+ Dsub = fmod(Dsub, mod);
+
+ //Synchronize threads
+ barrier(CLK_LOCAL_MEM_FENCE);
+ }
+ //Calculates the offset inthe result matrix
+ int d = widthB * BLOCK_SIZE * by + BLOCK_SIZE * bx;
+
+ //Load, add, and normalize with element from C
+ double c = C[d + ty * widthB + tx];
+ Dsub = c - Dsub;
+ Dsub = fmod((mod + Dsub), mod);
+
+ //Add the sum to the appropriate spot
+ D[d + ty * widthB + tx] = Dsub;
+}
\ No newline at end of file
diff --git a/linbox/algorithms/opencl-kernels/kernel-maxpy-modulus-dp.cl b/linbox/algorithms/opencl-kernels/kernel-maxpy-modulus-dp.cl
new file mode 100644
index 0000000..b83c7a5
--- /dev/null
+++ b/linbox/algorithms/opencl-kernels/kernel-maxpy-modulus-dp.cl
@@ -0,0 +1,68 @@
+/*
+ * kernel_maxpy_modulus_dp.cl
+ *
+ * Created on: Dec 21, 2011
+ * Author: Matthew Wezowicz
+ */
+
+#define BLOCK_SIZE 16
+#pragma OPENCL EXTENSION cl_khr_fp64 : enable
+
+__kernel void matrixMaxpyKernelModular1DP(__global double* D, __global double* A, __global double* B,
+ __global double* C, const int widthA, const int widthB, const double mod){
+ //Geet Workgroup ID
+ int bx = get_group_id(0);
+ int by = get_group_id(1);
+
+ //Get Local ID
+ int tx = get_local_id(0);
+ int ty = get_local_id(1);
+
+ //Range of indexies for submatrix of A
+ int aBegin= widthA * BLOCK_SIZE * by;
+ int aEnd = aBegin + widthA - 1;
+ int aStep = BLOCK_SIZE;
+
+ //Range of indecies for sub-matrix of B
+ int bBegin = BLOCK_SIZE * bx;
+ int bStep = BLOCK_SIZE * widthB;
+
+ //Local storage of sub-matrices of A and B;
+ __local double As[BLOCK_SIZE][BLOCK_SIZE];
+ __local double Bs[BLOCK_SIZE][BLOCK_SIZE];
+
+ //Temporary storage for result
+ double Dsub = 0;
+
+ //Loop over all the sub-maticies of A and B required to compute
+ //the result sub-matrix
+ for(int a = aBegin, b = bBegin; a < aEnd; a += aStep, b += bStep){
+ //Load the matricies from global memory to local memory
+ //Each thread loads one element of each sub-matrix
+ As[ty][tx] = A[a + widthA * ty + tx];
+ Bs[ty][tx] = B[b + widthB * ty + tx];
+
+ //Synchronize threads
+ barrier(CLK_LOCAL_MEM_FENCE);
+
+ //Multiply the two sub-matrices together
+ for(int i = 0; i < BLOCK_SIZE; i++){
+ Dsub += As[ty][i] * Bs[i][tx];
+ //Calls fmod everey iteration to normalize the partial sum
+ Dsub = fmod(Dsub, mod);
+ }
+
+ //Synchronize threads
+ barrier(CLK_LOCAL_MEM_FENCE);
+ }
+ //Calculates the offset inthe result matrix
+ int d = widthB * BLOCK_SIZE * by + BLOCK_SIZE * bx;
+
+ //Load, add, and normalize with element from C
+ double c = C[d + ty * widthB + tx];
+ Dsub = c - Dsub;
+ Dsub = fmod((mod + Dsub), mod);
+
+ //Add the sum to the appropriate spot
+ D[d + ty * widthB + tx] = Dsub;
+}
\ No newline at end of file
diff --git a/linbox/algorithms/opencl-kernels/kernel-maxpy-modulus-sp-unroll.cl b/linbox/algorithms/opencl-kernels/kernel-maxpy-modulus-sp-unroll.cl
new file mode 100644
index 0000000..bb926f9
--- /dev/null
+++ b/linbox/algorithms/opencl-kernels/kernel-maxpy-modulus-sp-unroll.cl
@@ -0,0 +1,94 @@
+/*
+ * kernel_maxpy_modulus_sp.cl
+ *
+ * Created on: Dec 21, 2011
+ * Author: Matthew Wezowicz
+ */
+
+#define BLOCK_SIZE 16
+
+__kernel void matrixMaxpyKernelModular1SP(__global float* D, __global float* A, __global float* B,
+ __global float* C, const int widthA, const int widthB, const float mod){
+ //Geet Workgroup ID
+ int bx = get_group_id(0);
+ int by = get_group_id(1);
+
+ //Get Local ID
+ int tx = get_local_id(0);
+ int ty = get_local_id(1);
+
+ //Range of indexies for submatrix of A
+ int aBegin= widthA * BLOCK_SIZE * by;
+ int aEnd = aBegin + widthA - 1;
+ int aStep = BLOCK_SIZE;
+
+ //Range of indecies for sub-matrix of B
+ int bBegin = BLOCK_SIZE * bx;
+ int bStep = BLOCK_SIZE * widthB;
+
+ //Local storage of sub-matrices of A and B;
+ __local float As[BLOCK_SIZE][BLOCK_SIZE];
+ __local float Bs[BLOCK_SIZE][BLOCK_SIZE];
+
+ //Temporary storage for result
+ float Dsub = 0;
+
+ //Loop over all the sub-maticies of A and B required to compute
+ //the result sub-matrix
+ for(int a = aBegin, b = bBegin; a < aEnd; a += aStep, b += bStep){
+ //Load the matricies from global memory to local memory
+ //Each thread loads one element of each sub-matrix
+ As[ty][tx] = A[a + widthA * ty + tx];
+ Bs[ty][tx] = B[b + widthB * ty + tx];
+
+ //Synchronize threads
+ barrier(CLK_LOCAL_MEM_FENCE);
+
+ //Multiply the two sub-matrices together
+ Dsub += As[ty][0] * Bs[0][tx];
+ Dsub = fmod(Dsub, mod);
+ Dsub += As[ty][1] * Bs[1][tx];
+ Dsub = fmod(Dsub, mod);
+ Dsub += As[ty][2] * Bs[2][tx];
+ Dsub = fmod(Dsub, mod);
+ Dsub += As[ty][3] * Bs[3][tx];
+ Dsub = fmod(Dsub, mod);
+ Dsub += As[ty][4] * Bs[4][tx];
+ Dsub = fmod(Dsub, mod);
+ Dsub += As[ty][5] * Bs[5][tx];
+ Dsub = fmod(Dsub, mod);
+ Dsub += As[ty][6] * Bs[6][tx];
+ Dsub = fmod(Dsub, mod);
+ Dsub += As[ty][7] * Bs[7][tx];
+ Dsub = fmod(Dsub, mod);
+ Dsub += As[ty][8] * Bs[8][tx];
+ Dsub = fmod(Dsub, mod);
+ Dsub += As[ty][9] * Bs[9][tx];
+ Dsub = fmod(Dsub, mod);
+ Dsub += As[ty][10] * Bs[10][tx];
+ Dsub = fmod(Dsub, mod);
+ Dsub += As[ty][11] * Bs[11][tx];
+ Dsub = fmod(Dsub, mod);
+ Dsub += As[ty][12] * Bs[12][tx];
+ Dsub = fmod(Dsub, mod);
+ Dsub += As[ty][13] * Bs[13][tx];
+ Dsub = fmod(Dsub, mod);
+ Dsub += As[ty][14] * Bs[14][tx];
+ Dsub = fmod(Dsub, mod);
+ Dsub += As[ty][15] * Bs[15][tx];
+ Dsub = fmod(Dsub, mod);
+
+ //Synchronize threads
+ barrier(CLK_LOCAL_MEM_FENCE);
+ }
+ //Calculates the offset inthe result matrix
+ int d = widthB * BLOCK_SIZE * by + BLOCK_SIZE * bx;
+
+ //Load, add, and normalize with element from C
+ float c = C[d + ty * widthB + tx];
+ Dsub = c - Dsub;
+ Dsub = fmod((mod + Dsub), mod);
+
+ //Add the sum to the appropriate spot
+ D[d + ty * widthB + tx] = Dsub;
+}
\ No newline at end of file
diff --git a/linbox/algorithms/opencl-kernels/kernel-maxpy-modulus-sp.cl b/linbox/algorithms/opencl-kernels/kernel-maxpy-modulus-sp.cl
new file mode 100644
index 0000000..34b0e33
--- /dev/null
+++ b/linbox/algorithms/opencl-kernels/kernel-maxpy-modulus-sp.cl
@@ -0,0 +1,67 @@
+/*
+ * kernel_maxpy_modulus_sp.cl
+ *
+ * Created on: Dec 21, 2011
+ * Author: Matthew Wezowicz
+ */
+
+#define BLOCK_SIZE 16
+
+__kernel void matrixMaxpyKernelModular1SP(__global float* D, __global float* A, __global float* B,
+ __global float* C, const int widthA, const int widthB, const float mod){
+ //Geet Workgroup ID
+ int bx = get_group_id(0);
+ int by = get_group_id(1);
+
+ //Get Local ID
+ int tx = get_local_id(0);
+ int ty = get_local_id(1);
+
+ //Range of indexies for submatrix of A
+ int aBegin= widthA * BLOCK_SIZE * by;
+ int aEnd = aBegin + widthA - 1;
+ int aStep = BLOCK_SIZE;
+
+ //Range of indecies for sub-matrix of B
+ int bBegin = BLOCK_SIZE * bx;
+ int bStep = BLOCK_SIZE * widthB;
+
+ //Local storage of sub-matrices of A and B;
+ __local float As[BLOCK_SIZE][BLOCK_SIZE];
+ __local float Bs[BLOCK_SIZE][BLOCK_SIZE];
+
+ //Temporary storage for result
+ float Dsub = 0;
+
+ //Loop over all the sub-maticies of A and B required to compute
+ //the result sub-matrix
+ for(int a = aBegin, b = bBegin; a < aEnd; a += aStep, b += bStep){
+ //Load the matricies from global memory to local memory
+ //Each thread loads one element of each sub-matrix
+ As[ty][tx] = A[a + widthA * ty + tx];
+ Bs[ty][tx] = B[b + widthB * ty + tx];
+
+ //Synchronize threads
+ barrier(CLK_LOCAL_MEM_FENCE);
+
+ //Multiply the two sub-matrices together
+ for(int i = 0; i < BLOCK_SIZE; i++){
+ Dsub += As[ty][i] * Bs[i][tx];
+ //Calls fmod everey iteration to normalize the partial sum
+ Dsub = fmod(Dsub, mod);
+ }
+
+ //Synchronize threads
+ barrier(CLK_LOCAL_MEM_FENCE);
+ }
+ //Calculates the offset inthe result matrix
+ int d = widthB * BLOCK_SIZE * by + BLOCK_SIZE * bx;
+
+ //Load, add, and normalize with element from C
+ float c = C[d + ty * widthB + tx];
+ Dsub = c - Dsub;
+ Dsub = fmod((mod + Dsub), mod);
+
+ //Add the sum to the appropriate spot
+ D[d + ty * widthB + tx] = Dsub;
+}
\ No newline at end of file
diff --git a/linbox/algorithms/opencl-kernels/kernel-maxpy-partial-1024-dp-unroll.cl b/linbox/algorithms/opencl-kernels/kernel-maxpy-partial-1024-dp-unroll.cl
new file mode 100644
index 0000000..25ee76e
--- /dev/null
+++ b/linbox/algorithms/opencl-kernels/kernel-maxpy-partial-1024-dp-unroll.cl
@@ -0,0 +1,93 @@
+/*
+ * kernel_maxpy_parital_1024_dp.cl
+ *
+ * Created on: Dec 21, 2011
+ * Author: Matthew Wezowicz
+ */
+
+#define BLOCK_SIZE 16
+#pragma OPENCL EXTENSION cl_khr_fp64 : enable
+
+__kernel void matrixMaxpyKernelModular1024DP(__global double* D, __global double* A, __global double* B,
+ __global double* C, const int widthA, const int widthB, const double mod){
+ //Geet Workgroup ID
+ int bx = get_group_id(0);
+ int by = get_group_id(1);
+
+ //Get Local ID
+ int tx = get_local_id(0);
+ int ty = get_local_id(1);
+
+ //Range of indexies for submatrix of A
+ int aBegin= widthA * BLOCK_SIZE * by;
+ int aEnd = aBegin + widthA - 1;
+ int aStep = BLOCK_SIZE;
+
+ //Range of indecies for sub-matrix of B
+ int bBegin = BLOCK_SIZE * bx;
+ int bStep = BLOCK_SIZE * widthB;
+
+ //Local storage of sub-matrices of A and B;
+ __local double As[BLOCK_SIZE][BLOCK_SIZE];
+ __local double Bs[BLOCK_SIZE][BLOCK_SIZE];
+
+ //Temporary storage for result
+ double Dsub = 0;
+
+ //Counter for modulus every 32 iterations
+ int mCount = 0;
+
+ //Loop over all the sub-maticies of A and B required to compute
+ //the result sub-matrix
+ for(int a = aBegin, b = bBegin; a < aEnd; a += aStep, b += bStep){
+ //Load the matricies from global memory to local memory
+ //Each thread loads one element of each sub-matrix
+ As[ty][tx] = A[a + widthA * ty + tx];
+ Bs[ty][tx] = B[b + widthB * ty + tx];
+
+ //Synchronize threads
+ barrier(CLK_LOCAL_MEM_FENCE);
+
+ //Multiply the two sub-matrices together
+ Dsub += As[ty][0] * Bs[0][tx];
+ Dsub += As[ty][1] * Bs[1][tx];
+ Dsub += As[ty][2] * Bs[2][tx];
+ Dsub += As[ty][3] * Bs[3][tx];
+ Dsub += As[ty][4] * Bs[4][tx];
+ Dsub += As[ty][5] * Bs[5][tx];
+ Dsub += As[ty][6] * Bs[6][tx];
+ Dsub += As[ty][7] * Bs[7][tx];
+ Dsub += As[ty][8] * Bs[8][tx];
+ Dsub += As[ty][9] * Bs[9][tx];
+ Dsub += As[ty][10] * Bs[10][tx];
+ Dsub += As[ty][11] * Bs[11][tx];
+ Dsub += As[ty][12] * Bs[12][tx];
+ Dsub += As[ty][13] * Bs[13][tx];
+ Dsub += As[ty][14] * Bs[14][tx];
+ Dsub += As[ty][15] * Bs[15][tx];
+
+ mCount++;
+
+ //fmod every 1024 iterations
+ if(mCount == 64){
+ Dsub = fmod(Dsub, mod);
+ mCount = 0;
+ }
+
+ //Synchronize threads
+ barrier(CLK_LOCAL_MEM_FENCE);
+ }
+ //Calls fmod once to normalize the sum
+ Dsub = fmod(Dsub, mod);
+
+ //Calculates the offset in the result matrix
+ int d = widthB * BLOCK_SIZE * by + BLOCK_SIZE * bx;
+
+ //Load, add, and normalize with element from C
+ double c = C[d + ty * widthB + tx];
+ Dsub = c - Dsub;
+ Dsub = fmod((mod + Dsub), mod);
+
+ //Add the sum to the appropriate spot
+ D[d + ty * widthB + tx] = Dsub;
+}
\ No newline at end of file
diff --git a/linbox/algorithms/opencl-kernels/kernel-maxpy-partial-1024-dp.cl b/linbox/algorithms/opencl-kernels/kernel-maxpy-partial-1024-dp.cl
new file mode 100644
index 0000000..b113602
--- /dev/null
+++ b/linbox/algorithms/opencl-kernels/kernel-maxpy-partial-1024-dp.cl
@@ -0,0 +1,79 @@
+/*
+ * kernel_maxpy_parital_1024_dp.cl
+ *
+ * Created on: Dec 21, 2011
+ * Author: Matthew Wezowicz
+ */
+
+#define BLOCK_SIZE 16
+#pragma OPENCL EXTENSION cl_khr_fp64 : enable
+
+__kernel void matrixMaxpyKernelModular1024DP(__global double* D, __global double* A, __global double* B,
+ __global double* C, const int widthA, const int widthB, const double mod){
+ //Geet Workgroup ID
+ int bx = get_group_id(0);
+ int by = get_group_id(1);
+
+ //Get Local ID
+ int tx = get_local_id(0);
+ int ty = get_local_id(1);
+
+ //Range of indexies for submatrix of A
+ int aBegin= widthA * BLOCK_SIZE * by;
+ int aEnd = aBegin + widthA - 1;
+ int aStep = BLOCK_SIZE;
+
+ //Range of indecies for sub-matrix of B
+ int bBegin = BLOCK_SIZE * bx;
+ int bStep = BLOCK_SIZE * widthB;
+
+ //Local storage of sub-matrices of A and B;
+ __local double As[BLOCK_SIZE][BLOCK_SIZE];
+ __local double Bs[BLOCK_SIZE][BLOCK_SIZE];
+
+ //Temporary storage for result
+ double Dsub = 0;
+
+ //Counter for modulus every 32 iterations
+ int mCount = 0;
+
+ //Loop over all the sub-maticies of A and B required to compute
+ //the result sub-matrix
+ for(int a = aBegin, b = bBegin; a < aEnd; a += aStep, b += bStep){
+ //Load the matricies from global memory to local memory
+ //Each thread loads one element of each sub-matrix
+ As[ty][tx] = A[a + widthA * ty + tx];
+ Bs[ty][tx] = B[b + widthB * ty + tx];
+
+ //Synchronize threads
+ barrier(CLK_LOCAL_MEM_FENCE);
+
+ //Multiply the two sub-matrices together
+ for(int i = 0; i < BLOCK_SIZE; i++){
+ Dsub += As[ty][i] * Bs[i][tx];
+ }
+ mCount++;
+
+ //fmod every 1024 iterations
+ if(mCount == 64){
+ Dsub = fmod(Dsub, mod);
+ mCount = 0;
+ }
+
+ //Synchronize threads
+ barrier(CLK_LOCAL_MEM_FENCE);
+ }
+ //Calls fmod once to normalize the sum
+ Dsub = fmod(Dsub, mod);
+
+ //Calculates the offset in the result matrix
+ int d = widthB * BLOCK_SIZE * by + BLOCK_SIZE * bx;
+
+ //Load, add, and normalize with element from C
+ double c = C[d + ty * widthB + tx];
+ Dsub = c - Dsub;
+ Dsub = fmod((mod + Dsub), mod);
+
+ //Add the sum to the appropriate spot
+ D[d + ty * widthB + tx] = Dsub;
+}
\ No newline at end of file
diff --git a/linbox/algorithms/opencl-kernels/kernel-maxpy-partial-1024-sp-unroll.cl b/linbox/algorithms/opencl-kernels/kernel-maxpy-partial-1024-sp-unroll.cl
new file mode 100644
index 0000000..be73196
--- /dev/null
+++ b/linbox/algorithms/opencl-kernels/kernel-maxpy-partial-1024-sp-unroll.cl
@@ -0,0 +1,92 @@
+/*
+ * kernel_maxpy_parital_1024_sp.cl
+ *
+ * Created on: Dec 21, 2011
+ * Author: Matthew Wezowicz
+ */
+
+#define BLOCK_SIZE 16
+
+__kernel void matrixMaxpyKernelModular1024SP(__global float* D, __global float* A, __global float* B,
+ __global float* C, const int widthA, const int widthB, const float mod){
+ //Geet Workgroup ID
+ int bx = get_group_id(0);
+ int by = get_group_id(1);
+
+ //Get Local ID
+ int tx = get_local_id(0);
+ int ty = get_local_id(1);
+
+ //Range of indexies for submatrix of A
+ int aBegin= widthA * BLOCK_SIZE * by;
+ int aEnd = aBegin + widthA - 1;
+ int aStep = BLOCK_SIZE;
+
+ //Range of indecies for sub-matrix of B
+ int bBegin = BLOCK_SIZE * bx;
+ int bStep = BLOCK_SIZE * widthB;
+
+ //Local storage of sub-matrices of A and B;
+ __local float As[BLOCK_SIZE][BLOCK_SIZE];
+ __local float Bs[BLOCK_SIZE][BLOCK_SIZE];
+
+ //Temporary storage for result
+ float Dsub = 0;
+
+ //Counter for modulus every 32 iterations
+ int mCount = 0;
+
+ //Loop over all the sub-maticies of A and B required to compute
+ //the result sub-matrix
+ for(int a = aBegin, b = bBegin; a < aEnd; a += aStep, b += bStep){
+ //Load the matricies from global memory to local memory
+ //Each thread loads one element of each sub-matrix
+ As[ty][tx] = A[a + widthA * ty + tx];
+ Bs[ty][tx] = B[b + widthB * ty + tx];
+
+ //Synchronize threads
+ barrier(CLK_LOCAL_MEM_FENCE);
+
+ //Multiply the two sub-matrices together
+ Dsub += As[ty][0] * Bs[0][tx];
+ Dsub += As[ty][1] * Bs[1][tx];
+ Dsub += As[ty][2] * Bs[2][tx];
+ Dsub += As[ty][3] * Bs[3][tx];
+ Dsub += As[ty][4] * Bs[4][tx];
+ Dsub += As[ty][5] * Bs[5][tx];
+ Dsub += As[ty][6] * Bs[6][tx];
+ Dsub += As[ty][7] * Bs[7][tx];
+ Dsub += As[ty][8] * Bs[8][tx];
+ Dsub += As[ty][9] * Bs[9][tx];
+ Dsub += As[ty][10] * Bs[10][tx];
+ Dsub += As[ty][11] * Bs[11][tx];
+ Dsub += As[ty][12] * Bs[12][tx];
+ Dsub += As[ty][13] * Bs[13][tx];
+ Dsub += As[ty][14] * Bs[14][tx];
+ Dsub += As[ty][15] * Bs[15][tx];
+
+ mCount++;
+
+ //fmod every 1024 iterations
+ if(mCount == 64){
+ Dsub = fmod(Dsub, mod);
+ mCount = 0;
+ }
+
+ //Synchronize threads
+ barrier(CLK_LOCAL_MEM_FENCE);
+ }
+ //Calls fmod once to normalize the sum
+ Dsub = fmod(Dsub, mod);
+
+ //Calculates the offset inthe result matrix
+ int d = widthB * BLOCK_SIZE * by + BLOCK_SIZE * bx;
+
+ //Load, add, and normalize with element from C
+ float c = C[d + ty * widthB + tx];
+ Dsub = c - Dsub;
+ Dsub = fmod((mod + Dsub), mod);
+
+ //Add the sum to the appropriate spot
+ D[d + ty * widthB + tx] = Dsub;
+}
\ No newline at end of file
diff --git a/linbox/algorithms/opencl-kernels/kernel-maxpy-partial-1024-sp.cl b/linbox/algorithms/opencl-kernels/kernel-maxpy-partial-1024-sp.cl
new file mode 100644
index 0000000..733c866
--- /dev/null
+++ b/linbox/algorithms/opencl-kernels/kernel-maxpy-partial-1024-sp.cl
@@ -0,0 +1,78 @@
+/*
+ * kernel_maxpy_parital_1024_sp.cl
+ *
+ * Created on: Dec 21, 2011
+ * Author: Matthew Wezowicz
+ */
+
+#define BLOCK_SIZE 16
+
+__kernel void matrixMaxpyKernelModular1024SP(__global float* D, __global float* A, __global float* B,
+ __global float* C, const int widthA, const int widthB, const float mod){
+ //Geet Workgroup ID
+ int bx = get_group_id(0);
+ int by = get_group_id(1);
+
+ //Get Local ID
+ int tx = get_local_id(0);
+ int ty = get_local_id(1);
+
+ //Range of indexies for submatrix of A
+ int aBegin= widthA * BLOCK_SIZE * by;
+ int aEnd = aBegin + widthA - 1;
+ int aStep = BLOCK_SIZE;
+
+ //Range of indecies for sub-matrix of B
+ int bBegin = BLOCK_SIZE * bx;
+ int bStep = BLOCK_SIZE * widthB;
+
+ //Local storage of sub-matrices of A and B;
+ __local float As[BLOCK_SIZE][BLOCK_SIZE];
+ __local float Bs[BLOCK_SIZE][BLOCK_SIZE];
+
+ //Temporary storage for result
+ float Dsub = 0;
+
+ //Counter for modulus every 32 iterations
+ int mCount = 0;
+
+ //Loop over all the sub-maticies of A and B required to compute
+ //the result sub-matrix
+ for(int a = aBegin, b = bBegin; a < aEnd; a += aStep, b += bStep){
+ //Load the matricies from global memory to local memory
+ //Each thread loads one element of each sub-matrix
+ As[ty][tx] = A[a + widthA * ty + tx];
+ Bs[ty][tx] = B[b + widthB * ty + tx];
+
+ //Synchronize threads
+ barrier(CLK_LOCAL_MEM_FENCE);
+
+ //Multiply the two sub-matrices together
+ for(int i = 0; i < BLOCK_SIZE; i++){
+ Dsub += As[ty][i] * Bs[i][tx];
+ }
+ mCount++;
+
+ //fmod every 1024 iterations
+ if(mCount == 64){
+ Dsub = fmod(Dsub, mod);
+ mCount = 0;
+ }
+
+ //Synchronize threads
+ barrier(CLK_LOCAL_MEM_FENCE);
+ }
+ //Calls fmod once to normalize the sum
+ Dsub = fmod(Dsub, mod);
+
+ //Calculates the offset inthe result matrix
+ int d = widthB * BLOCK_SIZE * by + BLOCK_SIZE * bx;
+
+ //Load, add, and normalize with element from C
+ float c = C[d + ty * widthB + tx];
+ Dsub = c - Dsub;
+ Dsub = fmod((mod + Dsub), mod);
+
+ //Add the sum to the appropriate spot
+ D[d + ty * widthB + tx] = Dsub;
+}
\ No newline at end of file
diff --git a/linbox/algorithms/opencl-kernels/kernel-maxpy-partial-16-sp-unroll.cl b/linbox/algorithms/opencl-kernels/kernel-maxpy-partial-16-sp-unroll.cl
new file mode 100644
index 0000000..467ba4d
--- /dev/null
+++ b/linbox/algorithms/opencl-kernels/kernel-maxpy-partial-16-sp-unroll.cl
@@ -0,0 +1,79 @@
+/*
+ * kernel_maxpy_parital_16_sp.cl
+ *
+ * Created on: Dec 21, 2011
+ * Author: Matthew Wezowicz
+ */
+
+#define BLOCK_SIZE 16
+
+__kernel void matrixMaxpyKernelModular16SP(__global float* D, __global float* A, __global float* B,
+ __global float* C, const int widthA, const int widthB, const float mod){
+ //Geet Workgroup ID
+ int bx = get_group_id(0);
+ int by = get_group_id(1);
+
+ //Get Local ID
+ int tx = get_local_id(0);
+ int ty = get_local_id(1);
+
+ //Range of indexies for submatrix of A
+ int aBegin= widthA * BLOCK_SIZE * by;
+ int aEnd = aBegin + widthA - 1;
+ int aStep = BLOCK_SIZE;
+
+ //Range of indecies for sub-matrix of B
+ int bBegin = BLOCK_SIZE * bx;
+ int bStep = BLOCK_SIZE * widthB;
+
+ //Local storage of sub-matrices of A and B;
+ __local float As[BLOCK_SIZE][BLOCK_SIZE];
+ __local float Bs[BLOCK_SIZE][BLOCK_SIZE];
+
+ //Temporary storage for result
+ float Dsub = 0;
+
+ //Loop over all the sub-maticies of A and B required to compute
+ //the result sub-matrix
+ for(int a = aBegin, b = bBegin; a < aEnd; a += aStep, b += bStep){
+ //Load the matricies from global memory to local memory
+ //Each thread loads one element of each sub-matrix
+ As[ty][tx] = A[a + widthA * ty + tx];
+ Bs[ty][tx] = B[b + widthB * ty + tx];
+
+ //Synchronize threads
+ barrier(CLK_LOCAL_MEM_FENCE);
+
+ //Multiply the two sub-matrices together
+ Dsub += As[ty][0] * Bs[0][tx];
+ Dsub += As[ty][1] * Bs[1][tx];
+ Dsub += As[ty][2] * Bs[2][tx];
+ Dsub += As[ty][3] * Bs[3][tx];
+ Dsub += As[ty][4] * Bs[4][tx];
+ Dsub += As[ty][5] * Bs[5][tx];
+ Dsub += As[ty][6] * Bs[6][tx];
+ Dsub += As[ty][7] * Bs[7][tx];
+ Dsub += As[ty][8] * Bs[8][tx];
+ Dsub += As[ty][9] * Bs[9][tx];
+ Dsub += As[ty][10] * Bs[10][tx];
+ Dsub += As[ty][11] * Bs[11][tx];
+ Dsub += As[ty][12] * Bs[12][tx];
+ Dsub += As[ty][13] * Bs[13][tx];
+ Dsub += As[ty][14] * Bs[14][tx];
+ Dsub += As[ty][15] * Bs[15][tx];
+ Dsub = fmod(Dsub, mod);
+
+ //Synchronize threads
+ barrier(CLK_LOCAL_MEM_FENCE);
+ }
+ //Calculates the offset inthe result matrix
+ int d = widthB * BLOCK_SIZE * by + BLOCK_SIZE * bx;
+
+ //Load, add, and normalize with element from C
+ float c = C[d + ty * widthB + tx];
+ Dsub = c - Dsub;
+ Dsub = fmod((mod + Dsub), mod);
+
+ //Add the sum to the appropriate spot
+ D[d + ty * widthB + tx] = Dsub;
+}
\ No newline at end of file
diff --git a/linbox/algorithms/opencl-kernels/kernel-maxpy-partial-16-sp.cl b/linbox/algorithms/opencl-kernels/kernel-maxpy-partial-16-sp.cl
new file mode 100644
index 0000000..a227592
--- /dev/null
+++ b/linbox/algorithms/opencl-kernels/kernel-maxpy-partial-16-sp.cl
@@ -0,0 +1,66 @@
+/*
+ * kernel_maxpy_parital_16_sp.cl
+ *
+ * Created on: Dec 21, 2011
+ * Author: Matthew Wezowicz
+ */
+
+#define BLOCK_SIZE 16
+
+__kernel void matrixMaxpyKernelModular16SP(__global float* D, __global float* A, __global float* B,
+ __global float* C, const int widthA, const int widthB, const float mod){
+ //Geet Workgroup ID
+ int bx = get_group_id(0);
+ int by = get_group_id(1);
+
+ //Get Local ID
+ int tx = get_local_id(0);
+ int ty = get_local_id(1);
+
+ //Range of indexies for submatrix of A
+ int aBegin= widthA * BLOCK_SIZE * by;
+ int aEnd = aBegin + widthA - 1;
+ int aStep = BLOCK_SIZE;
+
+ //Range of indecies for sub-matrix of B
+ int bBegin = BLOCK_SIZE * bx;
+ int bStep = BLOCK_SIZE * widthB;
+
+ //Local storage of sub-matrices of A and B;
+ __local float As[BLOCK_SIZE][BLOCK_SIZE];
+ __local float Bs[BLOCK_SIZE][BLOCK_SIZE];
+
+ //Temporary storage for result
+ float Dsub = 0;
+
+ //Loop over all the sub-maticies of A and B required to compute
+ //the result sub-matrix
+ for(int a = aBegin, b = bBegin; a < aEnd; a += aStep, b += bStep){
+ //Load the matricies from global memory to local memory
+ //Each thread loads one element of each sub-matrix
+ As[ty][tx] = A[a + widthA * ty + tx];
+ Bs[ty][tx] = B[b + widthB * ty + tx];
+
+ //Synchronize threads
+ barrier(CLK_LOCAL_MEM_FENCE);
+
+ //Multiply the two sub-matrices together
+ for(int i = 0; i < BLOCK_SIZE; i++){
+ Dsub += As[ty][i] * Bs[i][tx];
+ }
+ Dsub = fmod(Dsub, mod);
+
+ //Synchronize threads
+ barrier(CLK_LOCAL_MEM_FENCE);
+ }
+ //Calculates the offset inthe result matrix
+ int d = widthB * BLOCK_SIZE * by + BLOCK_SIZE * bx;
+
+ //Load, add, and normalize with element from C
+ float c = C[d + ty * widthB + tx];
+ Dsub = c - Dsub;
+ Dsub = fmod((mod + Dsub), mod);
+
+ //Add the sum to the appropriate spot
+ D[d + ty * widthB + tx] = Dsub;
+}
\ No newline at end of file
diff --git a/linbox/algorithms/opencl-kernels/kernel-maxpy-partial-32-dp-unroll.cl b/linbox/algorithms/opencl-kernels/kernel-maxpy-partial-32-dp-unroll.cl
new file mode 100644
index 0000000..a98e0c8
--- /dev/null
+++ b/linbox/algorithms/opencl-kernels/kernel-maxpy-partial-32-dp-unroll.cl
@@ -0,0 +1,93 @@
+/*
+ * kernel_maxpy_parital_32_dp.cl
+ *
+ * Created on: Dec 21, 2011
+ * Author: Matthew Wezowicz
+ */
+
+#define BLOCK_SIZE 16
+#pragma OPENCL EXTENSION cl_khr_fp64 : enable
+
+__kernel void matrixMaxpyKernelModular32DP(__global double* D, __global double* A, __global double* B,
+ __global double* C, const int widthA, const int widthB, const double mod){
+ //Geet Workgroup ID
+ int bx = get_group_id(0);
+ int by = get_group_id(1);
+
+ //Get Local ID
+ int tx = get_local_id(0);
+ int ty = get_local_id(1);
+
+ //Range of indexies for submatrix of A
+ int aBegin= widthA * BLOCK_SIZE * by;
+ int aEnd = aBegin + widthA - 1;
+ int aStep = BLOCK_SIZE;
+
+ //Range of indecies for sub-matrix of B
+ int bBegin = BLOCK_SIZE * bx;
+ int bStep = BLOCK_SIZE * widthB;
+
+ //Local storage of sub-matrices of A and B;
+ __local double As[BLOCK_SIZE][BLOCK_SIZE];
+ __local double Bs[BLOCK_SIZE][BLOCK_SIZE];
+
+ //Temporary storage for result
+ double Dsub = 0;
+
+ //Counter for modulus every 32 iterations
+ int mCount = 0;
+
+ //Loop over all the sub-maticies of A and B required to compute
+ //the result sub-matrix
+ for(int a = aBegin, b = bBegin; a < aEnd; a += aStep, b += bStep){
+ //Load the matricies from global memory to local memory
+ //Each thread loads one element of each sub-matrix
+ As[ty][tx] = A[a + widthA * ty + tx];
+ Bs[ty][tx] = B[b + widthB * ty + tx];
+
+ //Synchronize threads
+ barrier(CLK_LOCAL_MEM_FENCE);
+
+ //Multiply the two sub-matrices together
+ Dsub += As[ty][0] * Bs[0][tx];
+ Dsub += As[ty][1] * Bs[1][tx];
+ Dsub += As[ty][2] * Bs[2][tx];
+ Dsub += As[ty][3] * Bs[3][tx];
+ Dsub += As[ty][4] * Bs[4][tx];
+ Dsub += As[ty][5] * Bs[5][tx];
+ Dsub += As[ty][6] * Bs[6][tx];
+ Dsub += As[ty][7] * Bs[7][tx];
+ Dsub += As[ty][8] * Bs[8][tx];
+ Dsub += As[ty][9] * Bs[9][tx];
+ Dsub += As[ty][10] * Bs[10][tx];
+ Dsub += As[ty][11] * Bs[11][tx];
+ Dsub += As[ty][12] * Bs[12][tx];
+ Dsub += As[ty][13] * Bs[13][tx];
+ Dsub += As[ty][14] * Bs[14][tx];
+ Dsub += As[ty][15] * Bs[15][tx];
+
+ mCount++;
+
+ //fmod every 32 iterations
+ if(mCount == 2){
+ Dsub = fmod(Dsub, mod);
+ mCount = 0;
+ }
+
+ //Synchronize threads
+ barrier(CLK_LOCAL_MEM_FENCE);
+ }
+ //Calls fmod once to normalize the sum
+ Dsub = fmod(Dsub, mod);
+
+ //Calculates the offset inthe result matrix
+ int d = widthB * BLOCK_SIZE * by + BLOCK_SIZE * bx;
+
+ //Load, add, and normalize with element from C
+ double c = C[d + ty * widthB + tx];
+ Dsub = c - Dsub;
+ Dsub = fmod((mod + Dsub), mod);
+
+ //Add the sum to the appropriate spot
+ D[d + ty * widthB + tx] = Dsub;
+}
\ No newline at end of file
diff --git a/linbox/algorithms/opencl-kernels/kernel-maxpy-partial-32-dp.cl b/linbox/algorithms/opencl-kernels/kernel-maxpy-partial-32-dp.cl
new file mode 100644
index 0000000..488cb64
--- /dev/null
+++ b/linbox/algorithms/opencl-kernels/kernel-maxpy-partial-32-dp.cl
@@ -0,0 +1,79 @@
+/*
+ * kernel_maxpy_parital_32_dp.cl
+ *
+ * Created on: Dec 21, 2011
+ * Author: Matthew Wezowicz
+ */
+
+#define BLOCK_SIZE 16
+#pragma OPENCL EXTENSION cl_khr_fp64 : enable
+
+__kernel void matrixMaxpyKernelModular32DP(__global double* D, __global double* A, __global double* B,
+ __global double* C, const int widthA, const int widthB, const double mod){
+ //Geet Workgroup ID
+ int bx = get_group_id(0);
+ int by = get_group_id(1);
+
+ //Get Local ID
+ int tx = get_local_id(0);
+ int ty = get_local_id(1);
+
+ //Range of indexies for submatrix of A
+ int aBegin= widthA * BLOCK_SIZE * by;
+ int aEnd = aBegin + widthA - 1;
+ int aStep = BLOCK_SIZE;
+
+ //Range of indecies for sub-matrix of B
+ int bBegin = BLOCK_SIZE * bx;
+ int bStep = BLOCK_SIZE * widthB;
+
+ //Local storage of sub-matrices of A and B;
+ __local double As[BLOCK_SIZE][BLOCK_SIZE];
+ __local double Bs[BLOCK_SIZE][BLOCK_SIZE];
+
+ //Temporary storage for result
+ double Dsub = 0;
+
+ //Counter for modulus every 32 iterations
+ int mCount = 0;
+
+ //Loop over all the sub-maticies of A and B required to compute
+ //the result sub-matrix
+ for(int a = aBegin, b = bBegin; a < aEnd; a += aStep, b += bStep){
+ //Load the matricies from global memory to local memory
+ //Each thread loads one element of each sub-matrix
+ As[ty][tx] = A[a + widthA * ty + tx];
+ Bs[ty][tx] = B[b + widthB * ty + tx];
+
+ //Synchronize threads
+ barrier(CLK_LOCAL_MEM_FENCE);
+
+ //Multiply the two sub-matrices together
+ for(int i = 0; i < BLOCK_SIZE; i++){
+ Dsub += As[ty][i] * Bs[i][tx];
+ }
+ mCount++;
+
+ //fmod every 32 iterations
+ if(mCount == 2){
+ Dsub = fmod(Dsub, mod);
+ mCount = 0;
+ }
+
+ //Synchronize threads
+ barrier(CLK_LOCAL_MEM_FENCE);
+ }
+ //Calls fmod once to normalize the sum
+ Dsub = fmod(Dsub, mod);
+
+ //Calculates the offset inthe result matrix
+ int d = widthB * BLOCK_SIZE * by + BLOCK_SIZE * bx;
+
+ //Load, add, and normalize with element from C
+ double c = C[d + ty * widthB + tx];
+ Dsub = c - Dsub;
+ Dsub = fmod((mod + Dsub), mod);
+
+ //Add the sum to the appropriate spot
+ D[d + ty * widthB + tx] = Dsub;
+}
\ No newline at end of file
diff --git a/linbox/algorithms/opencl-kernels/kernel-maxpy-partial-32-sp-unroll.cl b/linbox/algorithms/opencl-kernels/kernel-maxpy-partial-32-sp-unroll.cl
new file mode 100644
index 0000000..e8ef963
--- /dev/null
+++ b/linbox/algorithms/opencl-kernels/kernel-maxpy-partial-32-sp-unroll.cl
@@ -0,0 +1,92 @@
+/*
+ * kernel_maxpy_parital_32_sp.cl
+ *
+ * Created on: Dec 21, 2011
+ * Author: Matthew Wezowicz
+ */
+
+#define BLOCK_SIZE 16
+
+__kernel void matrixMaxpyKernelModular32SP(__global float* D, __global float* A, __global float* B,
+ __global float* C, const int widthA, const int widthB, const float mod){
+ //Geet Workgroup ID
+ int bx = get_group_id(0);
+ int by = get_group_id(1);
+
+ //Get Local ID
+ int tx = get_local_id(0);
+ int ty = get_local_id(1);
+
+ //Range of indexies for submatrix of A
+ int aBegin= widthA * BLOCK_SIZE * by;
+ int aEnd = aBegin + widthA - 1;
+ int aStep = BLOCK_SIZE;
+
+ //Range of indecies for sub-matrix of B
+ int bBegin = BLOCK_SIZE * bx;
+ int bStep = BLOCK_SIZE * widthB;
+
+ //Local storage of sub-matrices of A and B;
+ __local float As[BLOCK_SIZE][BLOCK_SIZE];
+ __local float Bs[BLOCK_SIZE][BLOCK_SIZE];
+
+ //Temporary storage for result
+ float Dsub = 0;
+
+ //Counter for modulus every 32 iterations
+ int mCount = 0;
+
+ //Loop over all the sub-maticies of A and B required to compute
+ //the result sub-matrix
+ for(int a = aBegin, b = bBegin; a < aEnd; a += aStep, b += bStep){
+ //Load the matricies from global memory to local memory
+ //Each thread loads one element of each sub-matrix
+ As[ty][tx] = A[a + widthA * ty + tx];
+ Bs[ty][tx] = B[b + widthB * ty + tx];
+
+ //Synchronize threads
+ barrier(CLK_LOCAL_MEM_FENCE);
+
+ //Multiply the two sub-matrices together
+ Dsub += As[ty][0] * Bs[0][tx];
+ Dsub += As[ty][1] * Bs[1][tx];
+ Dsub += As[ty][2] * Bs[2][tx];
+ Dsub += As[ty][3] * Bs[3][tx];
+ Dsub += As[ty][4] * Bs[4][tx];
+ Dsub += As[ty][5] * Bs[5][tx];
+ Dsub += As[ty][6] * Bs[6][tx];
+ Dsub += As[ty][7] * Bs[7][tx];
+ Dsub += As[ty][8] * Bs[8][tx];
+ Dsub += As[ty][9] * Bs[9][tx];
+ Dsub += As[ty][10] * Bs[10][tx];
+ Dsub += As[ty][11] * Bs[11][tx];
+ Dsub += As[ty][12] * Bs[12][tx];
+ Dsub += As[ty][13] * Bs[13][tx];
+ Dsub += As[ty][14] * Bs[14][tx];
+ Dsub += As[ty][15] * Bs[15][tx];
+
+ mCount++;
+
+ //fmod every 32 iterations
+ if(mCount == 2){
+ Dsub = fmod(Dsub, mod);
+ mCount = 0;
+ }
+
+ //Synchronize threads
+ barrier(CLK_LOCAL_MEM_FENCE);
+ }
+ //Calls fmod once to normalize the sum
+ Dsub = fmod(Dsub, mod);
+
+ //Calculates the offset inthe result matrix
+ int d = widthB * BLOCK_SIZE * by + BLOCK_SIZE * bx;
+
+ //Load, add, and normalize with element from C
+ float c = C[d + ty * widthB + tx];
+ Dsub = c - Dsub;
+ Dsub = fmod((mod + Dsub), mod);
+
+ //Add the sum to the appropriate spot
+ D[d + ty * widthB + tx] = Dsub;
+}
\ No newline at end of file
diff --git a/linbox/algorithms/opencl-kernels/kernel-maxpy-partial-32-sp.cl b/linbox/algorithms/opencl-kernels/kernel-maxpy-partial-32-sp.cl
new file mode 100644
index 0000000..1a97e20
--- /dev/null
+++ b/linbox/algorithms/opencl-kernels/kernel-maxpy-partial-32-sp.cl
@@ -0,0 +1,78 @@
+/*
+ * kernel_maxpy_parital_32_sp.cl
+ *
+ * Created on: Dec 21, 2011
+ * Author: Matthew Wezowicz
+ */
+
+#define BLOCK_SIZE 16
+
+__kernel void matrixMaxpyKernelModular32SP(__global float* D, __global float* A, __global float* B,
+ __global float* C, const int widthA, const int widthB, const float mod){
+ //Geet Workgroup ID
+ int bx = get_group_id(0);
+ int by = get_group_id(1);
+
+ //Get Local ID
+ int tx = get_local_id(0);
+ int ty = get_local_id(1);
+
+ //Range of indexies for submatrix of A
+ int aBegin= widthA * BLOCK_SIZE * by;
+ int aEnd = aBegin + widthA - 1;
+ int aStep = BLOCK_SIZE;
+
+ //Range of indecies for sub-matrix of B
+ int bBegin = BLOCK_SIZE * bx;
+ int bStep = BLOCK_SIZE * widthB;
+
+ //Local storage of sub-matrices of A and B;
+ __local float As[BLOCK_SIZE][BLOCK_SIZE];
+ __local float Bs[BLOCK_SIZE][BLOCK_SIZE];
+
+ //Temporary storage for result
+ float Dsub = 0;
+
+ //Counter for modulus every 32 iterations
+ int mCount = 0;
+
+ //Loop over all the sub-maticies of A and B required to compute
+ //the result sub-matrix
+ for(int a = aBegin, b = bBegin; a < aEnd; a += aStep, b += bStep){
+ //Load the matricies from global memory to local memory
+ //Each thread loads one element of each sub-matrix
+ As[ty][tx] = A[a + widthA * ty + tx];
+ Bs[ty][tx] = B[b + widthB * ty + tx];
+
+ //Synchronize threads
+ barrier(CLK_LOCAL_MEM_FENCE);
+
+ //Multiply the two sub-matrices together
+ for(int i = 0; i < BLOCK_SIZE; i++){
+ Dsub += As[ty][i] * Bs[i][tx];
+ }
+ mCount++;
+
+ //fmod every 32 iterations
+ if(mCount == 2){
+ Dsub = fmod(Dsub, mod);
+ mCount = 0;
+ }
+
+ //Synchronize threads
+ barrier(CLK_LOCAL_MEM_FENCE);
+ }
+ //Calls fmod once to normalize the sum
+ Dsub = fmod(Dsub, mod);
+
+ //Calculates the offset inthe result matrix
+ int d = widthB * BLOCK_SIZE * by + BLOCK_SIZE * bx;
+
+ //Load, add, and normalize with element from C
+ float c = C[d + ty * widthB + tx];
+ Dsub = c - Dsub;
+ Dsub = fmod((mod + Dsub), mod);
+
+ //Add the sum to the appropriate spot
+ D[d + ty * widthB + tx] = Dsub;
+}
\ No newline at end of file
diff --git a/linbox/algorithms/opencl-kernels/kernel-maxpy-partial-8-dp-unroll.cl b/linbox/algorithms/opencl-kernels/kernel-maxpy-partial-8-dp-unroll.cl
new file mode 100644
index 0000000..7fdfc0b
--- /dev/null
+++ b/linbox/algorithms/opencl-kernels/kernel-maxpy-partial-8-dp-unroll.cl
@@ -0,0 +1,82 @@
+/*
+ * kernel_maxpy_parital_8_dp.cl
+ *
+ * Created on: Dec 21, 2011
+ * Author: Matthew Wezowicz
+ */
+
+#define BLOCK_SIZE 16
+#pragma OPENCL EXTENSION cl_khr_fp64 : enable
+
+__kernel void matrixMaxpyKernelModular8DP(__global double* D, __global double* A, __global double* B,
+ __global double* C, const int widthA, const int widthB, const double mod){
+ //Geet Workgroup ID
+ int bx = get_group_id(0);
+ int by = get_group_id(1);
+
+ //Get Local ID
+ int tx = get_local_id(0);
+ int ty = get_local_id(1);
+
+ //Range of indexies for submatrix of A
+ int aBegin= widthA * BLOCK_SIZE * by;
+ int aEnd = aBegin + widthA - 1;
+ int aStep = BLOCK_SIZE;
+
+ //Range of indecies for sub-matrix of B
+ int bBegin = BLOCK_SIZE * bx;
+ int bStep = BLOCK_SIZE * widthB;
+
+ //Local storage of sub-matrices of A and B;
+ __local double As[BLOCK_SIZE][BLOCK_SIZE];
+ __local double Bs[BLOCK_SIZE][BLOCK_SIZE];
+
+ //Temporary storage for result
+ double Dsub = 0;
+
+ //Loop over all the sub-maticies of A and B required to compute
+ //the result sub-matrix
+ for(int a = aBegin, b = bBegin; a < aEnd; a += aStep, b += bStep){
+ //Load the matricies from global memory to local memory
+ //Each thread loads one element of each sub-matrix
+ As[ty][tx] = A[a + widthA * ty + tx];
+ Bs[ty][tx] = B[b + widthB * ty + tx];
+
+ //Synchronize threads
+ barrier(CLK_LOCAL_MEM_FENCE);
+
+ //Multiply the two sub-matrices together
+ Dsub += As[ty][0] * Bs[0][tx];
+ Dsub += As[ty][1] * Bs[1][tx];
+ Dsub += As[ty][2] * Bs[2][tx];
+ Dsub += As[ty][3] * Bs[3][tx];
+ Dsub += As[ty][4] * Bs[4][tx];
+ Dsub += As[ty][5] * Bs[5][tx];
+ Dsub += As[ty][6] * Bs[6][tx];
+ Dsub += As[ty][7] * Bs[7][tx];
+ Dsub = fmod(Dsub, mod);
+
+ Dsub += As[ty][8] * Bs[8][tx];
+ Dsub += As[ty][9] * Bs[9][tx];
+ Dsub += As[ty][10] * Bs[10][tx];
+ Dsub += As[ty][11] * Bs[11][tx];
+ Dsub += As[ty][12] * Bs[12][tx];
+ Dsub += As[ty][13] * Bs[13][tx];
+ Dsub += As[ty][14] * Bs[14][tx];
+ Dsub += As[ty][15] * Bs[15][tx];
+ Dsub = fmod(Dsub, mod);
+
+ //Synchronize threads
+ barrier(CLK_LOCAL_MEM_FENCE);
+ }
+ //Calculates the offset inthe result matrix
+ int d = widthB * BLOCK_SIZE * by + BLOCK_SIZE * bx;
+
+ //Load, add, and normalize with element from C
+ double c = C[d + ty * widthB + tx];
+ Dsub = c - Dsub;
+ Dsub = fmod((mod + Dsub), mod);
+
+ //Add the sum to the appropriate spot
+ D[d + ty * widthB + tx] = Dsub;
+}
\ No newline at end of file
diff --git a/linbox/algorithms/opencl-kernels/kernel-maxpy-partial-8-dp.cl b/linbox/algorithms/opencl-kernels/kernel-maxpy-partial-8-dp.cl
new file mode 100644
index 0000000..0238f4f
--- /dev/null
+++ b/linbox/algorithms/opencl-kernels/kernel-maxpy-partial-8-dp.cl
@@ -0,0 +1,71 @@
+/*
+ * kernel_maxpy_parital_8_dp.cl
+ *
+ * Created on: Dec 21, 2011
+ * Author: Matthew Wezowicz
+ */
+
+#define BLOCK_SIZE 16
+#pragma OPENCL EXTENSION cl_khr_fp64 : enable
+
+__kernel void matrixMaxpyKernelModular8DP(__global double* D, __global double* A, __global double* B,
+ __global double* C, const int widthA, const int widthB, const double mod){
+ //Geet Workgroup ID
+ int bx = get_group_id(0);
+ int by = get_group_id(1);
+
+ //Get Local ID
+ int tx = get_local_id(0);
+ int ty = get_local_id(1);
+
+ //Range of indexies for submatrix of A
+ int aBegin= widthA * BLOCK_SIZE * by;
+ int aEnd = aBegin + widthA - 1;
+ int aStep = BLOCK_SIZE;
+
+ //Range of indecies for sub-matrix of B
+ int bBegin = BLOCK_SIZE * bx;
+ int bStep = BLOCK_SIZE * widthB;
+
+ //Local storage of sub-matrices of A and B;
+ __local double As[BLOCK_SIZE][BLOCK_SIZE];
+ __local double Bs[BLOCK_SIZE][BLOCK_SIZE];
+
+ //Temporary storage for result
+ double Dsub = 0;
+
+ //Loop over all the sub-maticies of A and B required to compute
+ //the result sub-matrix
+ for(int a = aBegin, b = bBegin; a < aEnd; a += aStep, b += bStep){
+ //Load the matricies from global memory to local memory
+ //Each thread loads one element of each sub-matrix
+ As[ty][tx] = A[a + widthA * ty + tx];
+ Bs[ty][tx] = B[b + widthB * ty + tx];
+
+ //Synchronize threads
+ barrier(CLK_LOCAL_MEM_FENCE);
+
+ //Multiply the two sub-matrices together
+ for(int i = 0; i < BLOCK_SIZE / 2; i++){
+ Dsub += As[ty][i] * Bs[i][tx];
+ }
+ Dsub = fmod(Dsub, mod);
+ for(int i = BLOCK_SIZE / 2; i < BLOCK_SIZE; i++){
+ Dsub += As[ty][i] * Bs[i][tx];
+ }
+ Dsub = fmod(Dsub, mod);
+
+ //Synchronize threads
+ barrier(CLK_LOCAL_MEM_FENCE);
+ }
+ //Calculates the offset inthe result matrix
+ int d = widthB * BLOCK_SIZE * by + BLOCK_SIZE * bx;
+
+ //Load, add, and normalize with element from C
+ double c = C[d + ty * widthB + tx];
+ Dsub = c - Dsub;
+ Dsub = fmod((mod + Dsub), mod);
+
+ //Add the sum to the appropriate spot
+ D[d + ty * widthB + tx] = Dsub;
+}
\ No newline at end of file
diff --git a/linbox/algorithms/opencl-kernels/kernel-modulus-dp-unroll.cl b/linbox/algorithms/opencl-kernels/kernel-modulus-dp-unroll.cl
new file mode 100644
index 0000000..b32c95b
--- /dev/null
+++ b/linbox/algorithms/opencl-kernels/kernel-modulus-dp-unroll.cl
@@ -0,0 +1,89 @@
+/*
+ * kernel_modulus_dp.cl
+ *
+ * Created on: Jul 5, 2011
+ * Author: Matthew Wezowicz
+ */
+
+#define BLOCK_SIZE 16
+#pragma OPENCL EXTENSION cl_khr_fp64 : enable
+
+__kernel void matrixMulKernelModular1DP(__global double* C, __global double* A, __global double* B,
+ const int widthA, const int widthB, const double mod){
+ //Get Workgroup ID
+ int bx = get_group_id(0);
+ int by = get_group_id(1);
+
+ //Get Local ID
+ int tx = get_local_id(0);
+ int ty = get_local_id(1);
+
+ //Range of indecies for sub-matrix of A
+ int aBegin = widthA * BLOCK_SIZE * by;
+ int aEnd = aBegin + widthA - 1;
+ int aStep = BLOCK_SIZE;
+
+ //Range of indecies for sub-matrix of B
+ int bBegin = BLOCK_SIZE * bx;
+ int bStep = BLOCK_SIZE * widthB;
+
+ //Local storage of sub-matrices of A and B
+ __local double As[BLOCK_SIZE][BLOCK_SIZE];
+ __local double Bs[BLOCK_SIZE][BLOCK_SIZE];
+
+ //Temporary storage for result
+ double Csub = 0;
+
+ //Loop over all the sub-matrices of A and B required to compute
+ //the result sub-matrix
+ for(int a = aBegin, b = bBegin; a < aEnd; a += aStep, b += bStep){
+ //Load the matrices from global memory to local memory
+ //Each thread loads one element of each sub-matrix
+ As[ty][tx] = A[a + widthA * ty + tx];
+ Bs[ty][tx] = B[b + widthB * ty + tx];
+
+ //Synchronize threads
+ barrier(CLK_LOCAL_MEM_FENCE);
+
+ //Multiply the two sub-matrices together
+ Csub += As[ty][0] * Bs[0][tx];
+ Csub = fmod(Csub, mod);
+ Csub += As[ty][1] * Bs[1][tx];
+ Csub = fmod(Csub, mod);
+ Csub += As[ty][2] * Bs[2][tx];
+ Csub = fmod(Csub, mod);
+ Csub += As[ty][3] * Bs[3][tx];
+ Csub = fmod(Csub, mod);
+ Csub += As[ty][4] * Bs[4][tx];
+ Csub = fmod(Csub, mod);
+ Csub += As[ty][5] * Bs[5][tx];
+ Csub = fmod(Csub, mod);
+ Csub += As[ty][6] * Bs[6][tx];
+ Csub = fmod(Csub, mod);
+ Csub += As[ty][7] * Bs[7][tx];
+ Csub = fmod(Csub, mod);
+ Csub += As[ty][8] * Bs[8][tx];
+ Csub = fmod(Csub, mod);
+ Csub += As[ty][9] * Bs[9][tx];
+ Csub = fmod(Csub, mod);
+ Csub += As[ty][10] * Bs[10][tx];
+ Csub = fmod(Csub, mod);
+ Csub += As[ty][11] * Bs[11][tx];
+ Csub = fmod(Csub, mod);
+ Csub += As[ty][12] * Bs[12][tx];
+ Csub = fmod(Csub, mod);
+ Csub += As[ty][13] * Bs[13][tx];
+ Csub = fmod(Csub, mod);
+ Csub += As[ty][14] * Bs[14][tx];
+ Csub = fmod(Csub, mod);
+ Csub += As[ty][15] * Bs[15][tx];
+ Csub = fmod(Csub, mod);
+
+ //Synchronize threads
+ barrier(CLK_LOCAL_MEM_FENCE);
+ }
+ //Calculates the offset in the result matrix and add the sum to the
+ //appropriate spot
+ int c = widthB * BLOCK_SIZE * by + BLOCK_SIZE * bx;
+ C[c + ty * widthB + tx] = Csub;
+}
diff --git a/linbox/algorithms/opencl-kernels/kernel-modulus-dp.cl b/linbox/algorithms/opencl-kernels/kernel-modulus-dp.cl
new file mode 100644
index 0000000..4a76dd6
--- /dev/null
+++ b/linbox/algorithms/opencl-kernels/kernel-modulus-dp.cl
@@ -0,0 +1,62 @@
+/*
+ * kernel_modulus_dp.cl
+ *
+ * Created on: Jul 5, 2011
+ * Author: Matthew Wezowicz
+ */
+
+#define BLOCK_SIZE 16
+#pragma OPENCL EXTENSION cl_khr_fp64 : enable
+
+__kernel void matrixMulKernelModular1DP(__global double* C, __global double* A, __global double* B,
+ const int widthA, const int widthB, const double mod){
+ //Get Workgroup ID
+ int bx = get_group_id(0);
+ int by = get_group_id(1);
+
+ //Get Local ID
+ int tx = get_local_id(0);
+ int ty = get_local_id(1);
+
+ //Range of indecies for sub-matrix of A
+ int aBegin = widthA * BLOCK_SIZE * by;
+ int aEnd = aBegin + widthA - 1;
+ int aStep = BLOCK_SIZE;
+
+ //Range of indecies for sub-matrix of B
+ int bBegin = BLOCK_SIZE * bx;
+ int bStep = BLOCK_SIZE * widthB;
+
+ //Local storage of sub-matrices of A and B
+ __local double As[BLOCK_SIZE][BLOCK_SIZE];
+ __local double Bs[BLOCK_SIZE][BLOCK_SIZE];
+
+ //Temporary storage for result
+ double Csub = 0;
+
+ //Loop over all the sub-matrices of A and B required to compute
+ //the result sub-matrix
+ for(int a = aBegin, b = bBegin; a < aEnd; a += aStep, b += bStep){
+ //Load the matrices from global memory to local memory
+ //Each thread loads one element of each sub-matrix
+ As[ty][tx] = A[a + widthA * ty + tx];
+ Bs[ty][tx] = B[b + widthB * ty + tx];
+
+ //Synchronize threads
+ barrier(CLK_LOCAL_MEM_FENCE);
+
+ //Multiply the two sub-matrices together
+ for(int i = 0; i < BLOCK_SIZE; i++){
+ Csub += As[ty][i] * Bs[i][tx];
+ //Calls fmod every iteration to normalize the partial sum
+ Csub = fmod(Csub, mod);
+ }
+
+ //Synchronize threads
+ barrier(CLK_LOCAL_MEM_FENCE);
+ }
+ //Calculates the offset in the result matrix and add the sum to the
+ //appropriate spot
+ int c = widthB * BLOCK_SIZE * by + BLOCK_SIZE * bx;
+ C[c + ty * widthB + tx] = Csub;
+}
diff --git a/linbox/algorithms/opencl-kernels/kernel-modulus-sp-unroll.cl b/linbox/algorithms/opencl-kernels/kernel-modulus-sp-unroll.cl
new file mode 100644
index 0000000..f9d4c51
--- /dev/null
+++ b/linbox/algorithms/opencl-kernels/kernel-modulus-sp-unroll.cl
@@ -0,0 +1,88 @@
+/*
+ * kernel_modulus_sp.cl
+ *
+ * Created on: Jul 5, 2011
+ * Author: Matthew Wezowicz
+ */
+
+#define BLOCK_SIZE 16
+
+__kernel void matrixMulKernelModular1SP(__global float* C, __global float* A, __global float* B,
+ const int widthA, const int widthB, const float mod){
+ //Get Workgroup ID
+ int bx = get_group_id(0);
+ int by = get_group_id(1);
+
+ //Get Local ID
+ int tx = get_local_id(0);
+ int ty = get_local_id(1);
+
+ //Range of indecies for sub-matrix of A
+ int aBegin = widthA * BLOCK_SIZE * by;
+ int aEnd = aBegin + widthA - 1;
+ int aStep = BLOCK_SIZE;
+
+ //Range of indecies for sub-matrix of B
+ int bBegin = BLOCK_SIZE * bx;
+ int bStep = BLOCK_SIZE * widthB;
+
+ //Local storage of sub-matrices of A and B
+ __local float As[BLOCK_SIZE][BLOCK_SIZE];
+ __local float Bs[BLOCK_SIZE][BLOCK_SIZE];
+
+ //Temporary storage for result
+ float Csub = 0;
+
+ //Loop over all the sub-matrices of A and B required to compute
+ //the result sub-matrix
+ for(int a = aBegin, b = bBegin; a < aEnd; a += aStep, b += bStep){
+ //Load the matrices from global memory to local memory
+ //Each thread loads one element of each sub-matrix
+ As[ty][tx] = A[a + widthA * ty + tx];
+ Bs[ty][tx] = B[b + widthB * ty + tx];
+
+ //Synchronize threads
+ barrier(CLK_LOCAL_MEM_FENCE);
+
+ //Multiply the two sub-matrices together
+ Csub += As[ty][0] * Bs[0][tx];
+ Csub = fmod(Csub, mod);
+ Csub += As[ty][1] * Bs[1][tx];
+ Csub = fmod(Csub, mod);
+ Csub += As[ty][2] * Bs[2][tx];
+ Csub = fmod(Csub, mod);
+ Csub += As[ty][3] * Bs[3][tx];
+ Csub = fmod(Csub, mod);
+ Csub += As[ty][4] * Bs[4][tx];
+ Csub = fmod(Csub, mod);
+ Csub += As[ty][5] * Bs[5][tx];
+ Csub = fmod(Csub, mod);
+ Csub += As[ty][6] * Bs[6][tx];
+ Csub = fmod(Csub, mod);
+ Csub += As[ty][7] * Bs[7][tx];
+ Csub = fmod(Csub, mod);
+ Csub += As[ty][8] * Bs[8][tx];
+ Csub = fmod(Csub, mod);
+ Csub += As[ty][9] * Bs[9][tx];
+ Csub = fmod(Csub, mod);
+ Csub += As[ty][10] * Bs[10][tx];
+ Csub = fmod(Csub, mod);
+ Csub += As[ty][11] * Bs[11][tx];
+ Csub = fmod(Csub, mod);
+ Csub += As[ty][12] * Bs[12][tx];
+ Csub = fmod(Csub, mod);
+ Csub += As[ty][13] * Bs[13][tx];
+ Csub = fmod(Csub, mod);
+ Csub += As[ty][14] * Bs[14][tx];
+ Csub = fmod(Csub, mod);
+ Csub += As[ty][15] * Bs[15][tx];
+ Csub = fmod(Csub, mod);
+
+ //Synchronize threads
+ barrier(CLK_LOCAL_MEM_FENCE);
+ }
+ //Calculates the offset in the result matrix and add the sum to the
+ //appropriate spot
+ int c = widthB * BLOCK_SIZE * by + BLOCK_SIZE * bx;
+ C[c + ty * widthB + tx] = Csub;
+}
diff --git a/linbox/algorithms/opencl-kernels/kernel-modulus-sp.cl b/linbox/algorithms/opencl-kernels/kernel-modulus-sp.cl
new file mode 100644
index 0000000..1a4a2be
--- /dev/null
+++ b/linbox/algorithms/opencl-kernels/kernel-modulus-sp.cl
@@ -0,0 +1,61 @@
+/*
+ * kernel_modulus_sp.cl
+ *
+ * Created on: Jul 5, 2011
+ * Author: Matthew Wezowicz
+ */
+
+#define BLOCK_SIZE 16
+
+__kernel void matrixMulKernelModular1SP(__global float* C, __global float* A, __global float* B,
+ const int widthA, const int widthB, const float mod){
+ //Get Workgroup ID
+ int bx = get_group_id(0);
+ int by = get_group_id(1);
+
+ //Get Local ID
+ int tx = get_local_id(0);
+ int ty = get_local_id(1);
+
+ //Range of indecies for sub-matrix of A
+ int aBegin = widthA * BLOCK_SIZE * by;
+ int aEnd = aBegin + widthA - 1;
+ int aStep = BLOCK_SIZE;
+
+ //Range of indecies for sub-matrix of B
+ int bBegin = BLOCK_SIZE * bx;
+ int bStep = BLOCK_SIZE * widthB;
+
+ //Local storage of sub-matrices of A and B
+ __local float As[BLOCK_SIZE][BLOCK_SIZE];
+ __local float Bs[BLOCK_SIZE][BLOCK_SIZE];
+
+ //Temporary storage for result
+ float Csub = 0;
+
+ //Loop over all the sub-matrices of A and B required to compute
+ //the result sub-matrix
+ for(int a = aBegin, b = bBegin; a < aEnd; a += aStep, b += bStep){
+ //Load the matrices from global memory to local memory
+ //Each thread loads one element of each sub-matrix
+ As[ty][tx] = A[a + widthA * ty + tx];
+ Bs[ty][tx] = B[b + widthB * ty + tx];
+
+ //Synchronize threads
+ barrier(CLK_LOCAL_MEM_FENCE);
+
+ //Multiply the two sub-matrices together
+ for(int i = 0; i < BLOCK_SIZE; i++){
+ Csub += As[ty][i] * Bs[i][tx];
+ //Calls fmod every iteration to normalize the partial sum
+ Csub = fmod(Csub, mod);
+ }
+
+ //Synchronize threads
+ barrier(CLK_LOCAL_MEM_FENCE);
+ }
+ //Calculates the offset in the result matrix and add the sum to the
+ //appropriate spot
+ int c = widthB * BLOCK_SIZE * by + BLOCK_SIZE * bx;
+ C[c + ty * widthB + tx] = Csub;
+}
diff --git a/linbox/algorithms/opencl-kernels/kernel-muladd-modulus-dp-unroll.cl b/linbox/algorithms/opencl-kernels/kernel-muladd-modulus-dp-unroll.cl
new file mode 100644
index 0000000..27b9c2e
--- /dev/null
+++ b/linbox/algorithms/opencl-kernels/kernel-muladd-modulus-dp-unroll.cl
@@ -0,0 +1,109 @@
+/*
+ * kernel_modulus_dp.cl
+ *
+ * Created on: Jul 5, 2011
+ * Author: Matthew Wezowicz
+ */
+
+#define BLOCK_SIZE 16
+#pragma OPENCL EXTENSION cl_khr_fp64 : enable
+
+__kernel void matrixMuladdKernelModular1DP(__global double* D, double alpha, __global double* A, __global double* B,
+ double beta, __global double* C, const int widthA, const int widthB, const double mod){
+ //Get Workgroup ID
+ int bx = get_group_id(0);
+ int by = get_group_id(1);
+
+ //Get Local ID
+ int tx = get_local_id(0);
+ int ty = get_local_id(1);
+
+ //Range of indecies for sub-matrix of A
+ int aBegin = widthA * BLOCK_SIZE * by;
+ int aEnd = aBegin + widthA - 1;
+ int aStep = BLOCK_SIZE;
+
+ //Range of indecies for sub-matrix of B
+ int bBegin = BLOCK_SIZE * bx;
+ int bStep = BLOCK_SIZE * widthB;
+
+ //Local storage of sub-matrices of A and B
+ __local double As[BLOCK_SIZE][BLOCK_SIZE];
+ __local double Bs[BLOCK_SIZE][BLOCK_SIZE];
+
+ //Temporary storage for result
+ double Dsub = 0;
+
+ //Loop over all the sub-matrices of A and B required to compute
+ //the result sub-matrix
+ for(int a = aBegin, b = bBegin; a < aEnd; a += aStep, b += bStep){
+ //Load the matrices from global memory to local memory
+ //Each thread loads one element of each sub-matrix
+ As[ty][tx] = A[a + widthA * ty + tx];
+ Bs[ty][tx] = B[b + widthB * ty + tx];
+
+ //Synchronize threads
+ barrier(CLK_LOCAL_MEM_FENCE);
+
+ //Multiply the two sub-matrices together
+ Dsub += As[ty][0] * Bs[0][tx];
+ Dsub = fmod(Dsub, mod);
+ Dsub += As[ty][1] * Bs[1][tx];
+ Dsub = fmod(Dsub, mod);
+ Dsub += As[ty][2] * Bs[2][tx];
+ Dsub = fmod(Dsub, mod);
+ Dsub += As[ty][3] * Bs[3][tx];
+ Dsub = fmod(Dsub, mod);
+ Dsub += As[ty][4] * Bs[4][tx];
+ Dsub = fmod(Dsub, mod);
+ Dsub += As[ty][5] * Bs[5][tx];
+ Dsub = fmod(Dsub, mod);
+ Dsub += As[ty][6] * Bs[6][tx];
+ Dsub = fmod(Dsub, mod);
+ Dsub += As[ty][7] * Bs[7][tx];
+ Dsub = fmod(Dsub, mod);
+ Dsub += As[ty][8] * Bs[8][tx];
+ Dsub = fmod(Dsub, mod);
+ Dsub += As[ty][9] * Bs[9][tx];
+ Dsub = fmod(Dsub, mod);
+ Dsub += As[ty][10] * Bs[10][tx];
+ Dsub = fmod(Dsub, mod);
+ Dsub += As[ty][11] * Bs[11][tx];
+ Dsub = fmod(Dsub, mod);
+ Dsub += As[ty][12] * Bs[12][tx];
+ Dsub = fmod(Dsub, mod);
+ Dsub += As[ty][13] * Bs[13][tx];
+ Dsub = fmod(Dsub, mod);
+ Dsub += As[ty][14] * Bs[14][tx];
+ Dsub = fmod(Dsub, mod);
+ Dsub += As[ty][15] * Bs[15][tx];
+ Dsub = fmod(Dsub, mod);
+
+ //Synchronize threads
+ barrier(CLK_LOCAL_MEM_FENCE);
+ }
+ //Calculates the offset in the result matrix
+ int d = widthB * BLOCK_SIZE * by + BLOCK_SIZE * bx;
+
+ //Scale Dsub by alpha
+ Dsub = alpha * Dsub;
+ Dsub = fmod(Dsub, mod);
+ if(Dsub < 0){
+ Dsub = mod + Dsub;
+ }
+
+ //Scalse Csub by beta
+ double Csub = C[d + ty * widthB + tx];
+ Csub = beta * Csub;
+ Csub = fmod(Csub, mod);
+ if(Csub < 0){
+ Csub = mod + Csub;
+ }
+
+ //Add Dsub and Dsub
+ Dsub = Dsub + Csub;
+ Dsub = fmod(Dsub, mod);
+
+ //Add the sum to the appropriate spot
+ D[d + ty * widthB + tx] = Dsub;
+}
diff --git a/linbox/algorithms/opencl-kernels/kernel-muladd-modulus-dp.cl b/linbox/algorithms/opencl-kernels/kernel-muladd-modulus-dp.cl
new file mode 100644
index 0000000..ee3c983
--- /dev/null
+++ b/linbox/algorithms/opencl-kernels/kernel-muladd-modulus-dp.cl
@@ -0,0 +1,82 @@
+/*
+ * kernel_modulus_dp.cl
+ *
+ * Created on: Jul 5, 2011
+ * Author: Matthew Wezowicz
+ */
+
+#define BLOCK_SIZE 16
+#pragma OPENCL EXTENSION cl_khr_fp64 : enable
+
+__kernel void matrixMuladdKernelModular1DP(__global double* D, double alpha, __global double* A, __global double* B,
+ double beta, __global double* C, const int widthA, const int widthB, const double mod){
+ //Get Workgroup ID
+ int bx = get_group_id(0);
+ int by = get_group_id(1);
+
+ //Get Local ID
+ int tx = get_local_id(0);
+ int ty = get_local_id(1);
+
+ //Range of indecies for sub-matrix of A
+ int aBegin = widthA * BLOCK_SIZE * by;
+ int aEnd = aBegin + widthA - 1;
+ int aStep = BLOCK_SIZE;
+
+ //Range of indecies for sub-matrix of B
+ int bBegin = BLOCK_SIZE * bx;
+ int bStep = BLOCK_SIZE * widthB;
+
+ //Local storage of sub-matrices of A and B
+ __local double As[BLOCK_SIZE][BLOCK_SIZE];
+ __local double Bs[BLOCK_SIZE][BLOCK_SIZE];
+
+ //Temporary storage for result
+ double Dsub = 0;
+
+ //Loop over all the sub-matrices of A and B required to compute
+ //the result sub-matrix
+ for(int a = aBegin, b = bBegin; a < aEnd; a += aStep, b += bStep){
+ //Load the matrices from global memory to local memory
+ //Each thread loads one element of each sub-matrix
+ As[ty][tx] = A[a + widthA * ty + tx];
+ Bs[ty][tx] = B[b + widthB * ty + tx];
+
+ //Synchronize threads
+ barrier(CLK_LOCAL_MEM_FENCE);
+
+ //Multiply the two sub-matrices together
+ for(int i = 0; i < BLOCK_SIZE; i++){
+ Dsub += As[ty][i] * Bs[i][tx];
+ //Calls fmod every iteration to normalize the partial sum
+ Dsub = fmod(Dsub, mod);
+ }
+
+ //Synchronize threads
+ barrier(CLK_LOCAL_MEM_FENCE);
+ }
+ //Calculates the offset in the result matrix
+ int d = widthB * BLOCK_SIZE * by + BLOCK_SIZE * bx;
+
+ //Scale Dsub by alpha
+ Dsub = alpha * Dsub;
+ Dsub = fmod(Dsub, mod);
+ if(Dsub < 0){
+ Dsub = mod + Dsub;
+ }
+
+ //Scalse Csub by beta
+ double Csub = C[d + ty * widthB + tx];
+ Csub = beta * Csub;
+ Csub = fmod(Csub, mod);
+ if(Csub < 0){
+ Csub = mod + Csub;
+ }
+
+ //Add Dsub and Dsub
+ Dsub = Dsub + Csub;
+ Dsub = fmod(Dsub, mod);
+
+ //Add the sum to the appropriate spot
+ D[d + ty * widthB + tx] = Dsub;
+}
diff --git a/linbox/algorithms/opencl-kernels/kernel-muladd-modulus-sp-unroll.cl b/linbox/algorithms/opencl-kernels/kernel-muladd-modulus-sp-unroll.cl
new file mode 100644
index 0000000..ec473e8
--- /dev/null
+++ b/linbox/algorithms/opencl-kernels/kernel-muladd-modulus-sp-unroll.cl
@@ -0,0 +1,108 @@
+/*
+ * kernel_modulus_sp.cl
+ *
+ * Created on: Jul 5, 2011
+ * Author: Matthew Wezowicz
+ */
+
+#define BLOCK_SIZE 16
+
+__kernel void matrixMuladdKernelModular1SP(__global float* D, float alpha, __global float* A, __global float* B,
+ float beta, __global float* C, const int widthA, const int widthB, const float mod){
+ //Get Workgroup ID
+ int bx = get_group_id(0);
+ int by = get_group_id(1);
+
+ //Get Local ID
+ int tx = get_local_id(0);
+ int ty = get_local_id(1);
+
+ //Range of indecies for sub-matrix of A
+ int aBegin = widthA * BLOCK_SIZE * by;
+ int aEnd = aBegin + widthA - 1;
+ int aStep = BLOCK_SIZE;
+
+ //Range of indecies for sub-matrix of B
+ int bBegin = BLOCK_SIZE * bx;
+ int bStep = BLOCK_SIZE * widthB;
+
+ //Local storage of sub-matrices of A and B
+ __local float As[BLOCK_SIZE][BLOCK_SIZE];
+ __local float Bs[BLOCK_SIZE][BLOCK_SIZE];
+
+ //Temporary storage for result
+ float Dsub = 0;
+
+ //Loop over all the sub-matrices of A and B required to compute
+ //the result sub-matrix
+ for(int a = aBegin, b = bBegin; a < aEnd; a += aStep, b += bStep){
+ //Load the matrices from global memory to local memory
+ //Each thread loads one element of each sub-matrix
+ As[ty][tx] = A[a + widthA * ty + tx];
+ Bs[ty][tx] = B[b + widthB * ty + tx];
+
+ //Synchronize threads
+ barrier(CLK_LOCAL_MEM_FENCE);
+
+ //Multiply the two sub-matrices together
+ Dsub += As[ty][0] * Bs[0][tx];
+ Dsub = fmod(Dsub, mod);
+ Dsub += As[ty][1] * Bs[1][tx];
+ Dsub = fmod(Dsub, mod);
+ Dsub += As[ty][2] * Bs[2][tx];
+ Dsub = fmod(Dsub, mod);
+ Dsub += As[ty][3] * Bs[3][tx];
+ Dsub = fmod(Dsub, mod);
+ Dsub += As[ty][4] * Bs[4][tx];
+ Dsub = fmod(Dsub, mod);
+ Dsub += As[ty][5] * Bs[5][tx];
+ Dsub = fmod(Dsub, mod);
+ Dsub += As[ty][6] * Bs[6][tx];
+ Dsub = fmod(Dsub, mod);
+ Dsub += As[ty][7] * Bs[7][tx];
+ Dsub = fmod(Dsub, mod);
+ Dsub += As[ty][8] * Bs[8][tx];
+ Dsub = fmod(Dsub, mod);
+ Dsub += As[ty][9] * Bs[9][tx];
+ Dsub = fmod(Dsub, mod);
+ Dsub += As[ty][10] * Bs[10][tx];
+ Dsub = fmod(Dsub, mod);
+ Dsub += As[ty][11] * Bs[11][tx];
+ Dsub = fmod(Dsub, mod);
+ Dsub += As[ty][12] * Bs[12][tx];
+ Dsub = fmod(Dsub, mod);
+ Dsub += As[ty][13] * Bs[13][tx];
+ Dsub = fmod(Dsub, mod);
+ Dsub += As[ty][14] * Bs[14][tx];
+ Dsub = fmod(Dsub, mod);
+ Dsub += As[ty][15] * Bs[15][tx];
+ Dsub = fmod(Dsub, mod);
+
+ //Synchronize threads
+ barrier(CLK_LOCAL_MEM_FENCE);
+ }
+ //Calculates the offset in the result matrix
+ int d = widthB * BLOCK_SIZE * by + BLOCK_SIZE * bx;
+
+ //Scale Dsub by alpha
+ Dsub = alpha * Dsub;
+ Dsub = fmod(Dsub, mod);
+ if(Dsub < 0){
+ Dsub = mod + Dsub;
+ }
+
+ //Scalse Csub by beta
+ float Csub = C[d + ty * widthB + tx];
+ Csub = beta * Csub;
+ Csub = fmod(Csub, mod);
+ if(Csub < 0){
+ Csub = mod + Csub;
+ }
+
+ //Add Dsub and Dsub
+ Dsub = Dsub + Csub;
+ Dsub = fmod(Dsub, mod);
+
+ //Add the sum to the appropriate spot
+ D[d + ty * widthB + tx] = Dsub;
+}
diff --git a/linbox/algorithms/opencl-kernels/kernel-muladd-modulus-sp.cl b/linbox/algorithms/opencl-kernels/kernel-muladd-modulus-sp.cl
new file mode 100644
index 0000000..0e0a6ab
--- /dev/null
+++ b/linbox/algorithms/opencl-kernels/kernel-muladd-modulus-sp.cl
@@ -0,0 +1,81 @@
+/*
+ * kernel_modulus_sp.cl
+ *
+ * Created on: Jul 5, 2011
+ * Author: Matthew Wezowicz
+ */
+
+#define BLOCK_SIZE 16
+
+__kernel void matrixMuladdKernelModular1SP(__global float* D, float alpha, __global float* A, __global float* B,
+ float beta, __global float* C, const int widthA, const int widthB, const float mod){
+ //Get Workgroup ID
+ int bx = get_group_id(0);
+ int by = get_group_id(1);
+
+ //Get Local ID
+ int tx = get_local_id(0);
+ int ty = get_local_id(1);
+
+ //Range of indecies for sub-matrix of A
+ int aBegin = widthA * BLOCK_SIZE * by;
+ int aEnd = aBegin + widthA - 1;
+ int aStep = BLOCK_SIZE;
+
+ //Range of indecies for sub-matrix of B
+ int bBegin = BLOCK_SIZE * bx;
+ int bStep = BLOCK_SIZE * widthB;
+
+ //Local storage of sub-matrices of A and B
+ __local float As[BLOCK_SIZE][BLOCK_SIZE];
+ __local float Bs[BLOCK_SIZE][BLOCK_SIZE];
+
+ //Temporary storage for result
+ float Dsub = 0;
+
+ //Loop over all the sub-matrices of A and B required to compute
+ //the result sub-matrix
+ for(int a = aBegin, b = bBegin; a < aEnd; a += aStep, b += bStep){
+ //Load the matrices from global memory to local memory
+ //Each thread loads one element of each sub-matrix
+ As[ty][tx] = A[a + widthA * ty + tx];
+ Bs[ty][tx] = B[b + widthB * ty + tx];
+
+ //Synchronize threads
+ barrier(CLK_LOCAL_MEM_FENCE);
+
+ //Multiply the two sub-matrices together
+ for(int i = 0; i < BLOCK_SIZE; i++){
+ Dsub += As[ty][i] * Bs[i][tx];
+ //Calls fmod every iteration to normalize the partial sum
+ Dsub = fmod(Dsub, mod);
+ }
+
+ //Synchronize threads
+ barrier(CLK_LOCAL_MEM_FENCE);
+ }
+ //Calculates the offset in the result matrix
+ int d = widthB * BLOCK_SIZE * by + BLOCK_SIZE * bx;
+
+ //Scale Dsub by alpha
+ Dsub = alpha * Dsub;
+ Dsub = fmod(Dsub, mod);
+ if(Dsub < 0){
+ Dsub = mod + Dsub;
+ }
+
+ //Scalse Csub by beta
+ float Csub = C[d + ty * widthB + tx];
+ Csub = beta * Csub;
+ Csub = fmod(Csub, mod);
+ if(Csub < 0){
+ Csub = mod + Csub;
+ }
+
+ //Add Dsub and Dsub
+ Dsub = Dsub + Csub;
+ Dsub = fmod(Dsub, mod);
+
+ //Add the sum to the appropriate spot
+ D[d + ty * widthB + tx] = Dsub;
+}
diff --git a/linbox/algorithms/opencl-kernels/kernel-muladd-partial-1024-dp-unroll.cl b/linbox/algorithms/opencl-kernels/kernel-muladd-partial-1024-dp-unroll.cl
new file mode 100644
index 0000000..6bf994a
--- /dev/null
+++ b/linbox/algorithms/opencl-kernels/kernel-muladd-partial-1024-dp-unroll.cl
@@ -0,0 +1,107 @@
+/*
+ * kernel_partial_1024_dp.cl
+ *
+ * Created on: Jul 13, 2011
+ * Author: Matthew Wezowicz
+ */
+
+#define BLOCK_SIZE 16
+#pragma OPENCL EXTENSION cl_khr_fp64 : enable
+
+__kernel void matrixMuladdKernelModular1024DP(__global double* D, double alpha, __global double* A, __global double* B,
+ double beta, __global double* C, const int widthA, const int widthB, const double mod){
+ //Get Workgroup ID
+ int bx = get_group_id(0);
+ int by = get_group_id(1);
+
+ //Get Local ID
+ int tx = get_local_id(0);
+ int ty = get_local_id(1);
+
+ //Range of indecies for sub-matrix of A
+ int aBegin = widthA * BLOCK_SIZE * by;
+ int aEnd = aBegin + widthA - 1;
+ int aStep = BLOCK_SIZE;
+
+ //Range of indecies for sub-matrix of B
+ int bBegin = BLOCK_SIZE * bx;
+ int bStep = BLOCK_SIZE * widthB;
+
+ //Local storage of sub-matrices of A and B
+ __local double As[BLOCK_SIZE][BLOCK_SIZE];
+ __local double Bs[BLOCK_SIZE][BLOCK_SIZE];
+
+ //Temporary storage for result
+ double Dsub = 0;
+
+ //Counter for modulus every 32 iterations
+ int mCount = 0;
+
+ //Loop over all the sub-matrices of A and B required to compute
+ //the result sub-matrix
+ for(int a = aBegin, b = bBegin; a < aEnd; a += aStep, b += bStep){
+ //Load the matrices from global memory to local memory
+ //Each thread loads one element of each sub-matrix
+ As[ty][tx] = A[a + widthA * ty + tx];
+ Bs[ty][tx] = B[b + widthB * ty + tx];
+
+ //Synchronize threads
+ barrier(CLK_LOCAL_MEM_FENCE);
+
+ //Multiply the two sub-matrices together
+ Dsub += As[ty][0] * Bs[0][tx];
+ Dsub += As[ty][1] * Bs[1][tx];
+ Dsub += As[ty][2] * Bs[2][tx];
+ Dsub += As[ty][3] * Bs[3][tx];
+ Dsub += As[ty][4] * Bs[4][tx];
+ Dsub += As[ty][5] * Bs[5][tx];
+ Dsub += As[ty][6] * Bs[6][tx];
+ Dsub += As[ty][7] * Bs[7][tx];
+ Dsub += As[ty][8] * Bs[8][tx];
+ Dsub += As[ty][9] * Bs[9][tx];
+ Dsub += As[ty][10] * Bs[10][tx];
+ Dsub += As[ty][11] * Bs[11][tx];
+ Dsub += As[ty][12] * Bs[12][tx];
+ Dsub += As[ty][13] * Bs[13][tx];
+ Dsub += As[ty][14] * Bs[14][tx];
+ Dsub += As[ty][15] * Bs[15][tx];
+
+ mCount++;
+
+ //fmod every 1024 iterations
+ if(mCount == 64){
+ Dsub = fmod(Dsub, mod);
+ mCount = 0;
+ }
+
+ //Synchronize threads
+ barrier(CLK_LOCAL_MEM_FENCE);
+ }
+
+ Dsub = fmod(Dsub, mod);
+
+ //Calculates the offset in the result matrix
+ int d = widthB * BLOCK_SIZE * by + BLOCK_SIZE * bx;
+
+ //Scale Dsub by alpha
+ Dsub = alpha * Dsub;
+ Dsub = fmod(Dsub, mod);
+ if(Dsub < 0){
+ Dsub = mod + Dsub;
+ }
+
+ //Scalse Csub by beta
+ double Csub = C[d + ty * widthB + tx];
+ Csub = beta * Csub;
+ Csub = fmod(Csub, mod);
+ if(Csub < 0){
+ Csub = mod + Csub;
+ }
+
+ //Add Dsub and Dsub
+ Dsub = Dsub + Csub;
+ Dsub = fmod(Dsub, mod);
+
+ //Add the sum to the appropriate spot
+ D[d + ty * widthB + tx] = Dsub;
+}
diff --git a/linbox/algorithms/opencl-kernels/kernel-muladd-partial-1024-dp.cl b/linbox/algorithms/opencl-kernels/kernel-muladd-partial-1024-dp.cl
new file mode 100644
index 0000000..6c5192c
--- /dev/null
+++ b/linbox/algorithms/opencl-kernels/kernel-muladd-partial-1024-dp.cl
@@ -0,0 +1,93 @@
+/*
+ * kernel_partial_1024_dp.cl
+ *
+ * Created on: Jul 13, 2011
+ * Author: Matthew Wezowicz
+ */
+
+#define BLOCK_SIZE 16
+#pragma OPENCL EXTENSION cl_khr_fp64 : enable
+
+__kernel void matrixMuladdKernelModular1024DP(__global double* D, double alpha, __global double* A, __global double* B,
+ double beta, __global double* C, const int widthA, const int widthB, const double mod){
+ //Get Workgroup ID
+ int bx = get_group_id(0);
+ int by = get_group_id(1);
+
+ //Get Local ID
+ int tx = get_local_id(0);
+ int ty = get_local_id(1);
+
+ //Range of indecies for sub-matrix of A
+ int aBegin = widthA * BLOCK_SIZE * by;
+ int aEnd = aBegin + widthA - 1;
+ int aStep = BLOCK_SIZE;
+
+ //Range of indecies for sub-matrix of B
+ int bBegin = BLOCK_SIZE * bx;
+ int bStep = BLOCK_SIZE * widthB;
+
+ //Local storage of sub-matrices of A and B
+ __local double As[BLOCK_SIZE][BLOCK_SIZE];
+ __local double Bs[BLOCK_SIZE][BLOCK_SIZE];
+
+ //Temporary storage for result
+ double Dsub = 0;
+
+ //Counter for modulus every 32 iterations
+ int mCount = 0;
+
+ //Loop over all the sub-matrices of A and B required to compute
+ //the result sub-matrix
+ for(int a = aBegin, b = bBegin; a < aEnd; a += aStep, b += bStep){
+ //Load the matrices from global memory to local memory
+ //Each thread loads one element of each sub-matrix
+ As[ty][tx] = A[a + widthA * ty + tx];
+ Bs[ty][tx] = B[b + widthB * ty + tx];
+
+ //Synchronize threads
+ barrier(CLK_LOCAL_MEM_FENCE);
+
+ //Multiply the two sub-matrices together
+ for(int i = 0; i < BLOCK_SIZE; i++){
+ Dsub += As[ty][i] * Bs[i][tx];
+ }
+ mCount++;
+
+ //fmod every 1024 iterations
+ if(mCount == 64){
+ Dsub = fmod(Dsub, mod);
+ mCount = 0;
+ }
+
+ //Synchronize threads
+ barrier(CLK_LOCAL_MEM_FENCE);
+ }
+
+ Dsub = fmod(Dsub, mod);
+
+ //Calculates the offset in the result matrix
+ int d = widthB * BLOCK_SIZE * by + BLOCK_SIZE * bx;
+
+ //Scale Dsub by alpha
+ Dsub = alpha * Dsub;
+ Dsub = fmod(Dsub, mod);
+ if(Dsub < 0){
+ Dsub = mod + Dsub;
+ }
+
+ //Scalse Csub by beta
+ double Csub = C[d + ty * widthB + tx];
+ Csub = beta * Csub;
+ Csub = fmod(Csub, mod);
+ if(Csub < 0){
+ Csub = mod + Csub;
+ }
+
+ //Add Dsub and Dsub
+ Dsub = Dsub + Csub;
+ Dsub = fmod(Dsub, mod);
+
+ //Add the sum to the appropriate spot
+ D[d + ty * widthB + tx] = Dsub;
+}
diff --git a/linbox/algorithms/opencl-kernels/kernel-muladd-partial-1024-sp-unroll.cl b/linbox/algorithms/opencl-kernels/kernel-muladd-partial-1024-sp-unroll.cl
new file mode 100644
index 0000000..3f32eb9
--- /dev/null
+++ b/linbox/algorithms/opencl-kernels/kernel-muladd-partial-1024-sp-unroll.cl
@@ -0,0 +1,106 @@
+/*
+ * kernel_partial_1024_sp.cl
+ *
+ * Created on: Jul 13, 2011
+ * Author: Matthew Wezowicz
+ */
+
+#define BLOCK_SIZE 16
+
+__kernel void matrixMuladdKernelModular1024SP(__global float* D, float alpha, __global float* A, __global float* B,
+ float beta, __global float* C, const int widthA, const int widthB, const float mod){
+ //Get Workgroup ID
+ int bx = get_group_id(0);
+ int by = get_group_id(1);
+
+ //Get Local ID
+ int tx = get_local_id(0);
+ int ty = get_local_id(1);
+
+ //Range of indecies for sub-matrix of A
+ int aBegin = widthA * BLOCK_SIZE * by;
+ int aEnd = aBegin + widthA - 1;
+ int aStep = BLOCK_SIZE;
+
+ //Range of indecies for sub-matrix of B
+ int bBegin = BLOCK_SIZE * bx;
+ int bStep = BLOCK_SIZE * widthB;
+
+ //Local storage of sub-matrices of A and B
+ __local float As[BLOCK_SIZE][BLOCK_SIZE];
+ __local float Bs[BLOCK_SIZE][BLOCK_SIZE];
+
+ //Temporary storage for result
+ float Dsub = 0;
+
+ //Counter for modulus every 32 iterations
+ int mCount = 0;
+
+ //Loop over all the sub-matrices of A and B required to compute
+ //the result sub-matrix
+ for(int a = aBegin, b = bBegin; a < aEnd; a += aStep, b += bStep){
+ //Load the matrices from global memory to local memory
+ //Each thread loads one element of each sub-matrix
+ As[ty][tx] = A[a + widthA * ty + tx];
+ Bs[ty][tx] = B[b + widthB * ty + tx];
+
+ //Synchronize threads
+ barrier(CLK_LOCAL_MEM_FENCE);
+
+ //Multiply the two sub-matrices together
+ Dsub += As[ty][0] * Bs[0][tx];
+ Dsub += As[ty][1] * Bs[1][tx];
+ Dsub += As[ty][2] * Bs[2][tx];
+ Dsub += As[ty][3] * Bs[3][tx];
+ Dsub += As[ty][4] * Bs[4][tx];
+ Dsub += As[ty][5] * Bs[5][tx];
+ Dsub += As[ty][6] * Bs[6][tx];
+ Dsub += As[ty][7] * Bs[7][tx];
+ Dsub += As[ty][8] * Bs[8][tx];
+ Dsub += As[ty][9] * Bs[9][tx];
+ Dsub += As[ty][10] * Bs[10][tx];
+ Dsub += As[ty][11] * Bs[11][tx];
+ Dsub += As[ty][12] * Bs[12][tx];
+ Dsub += As[ty][13] * Bs[13][tx];
+ Dsub += As[ty][14] * Bs[14][tx];
+ Dsub += As[ty][15] * Bs[15][tx];
+
+ mCount++;
+
+ //fmod every 1024 iterations
+ if(mCount == 64){
+ Dsub = fmod(Dsub, mod);
+ mCount = 0;
+ }
+
+ //Synchronize threads
+ barrier(CLK_LOCAL_MEM_FENCE);
+ }
+
+ Dsub = fmod(Dsub, mod);
+
+ //Calculates the offset in the result matrix
+ int d = widthB * BLOCK_SIZE * by + BLOCK_SIZE * bx;
+
+ //Scale Dsub by alpha
+ Dsub = alpha * Dsub;
+ Dsub = fmod(Dsub, mod);
+ if(Dsub < 0){
+ Dsub = mod + Dsub;
+ }
+
+ //Scalse Csub by beta
+ float Csub = C[d + ty * widthB + tx];
+ Csub = beta * Csub;
+ Csub = fmod(Csub, mod);
+ if(Csub < 0){
+ Csub = mod + Csub;
+ }
+
+ //Add Dsub and Dsub
+ Dsub = Dsub + Csub;
+ Dsub = fmod(Dsub, mod);
+
+ //Add the sum to the appropriate spot
+ D[d + ty * widthB + tx] = Dsub;
+}
diff --git a/linbox/algorithms/opencl-kernels/kernel-muladd-partial-1024-sp.cl b/linbox/algorithms/opencl-kernels/kernel-muladd-partial-1024-sp.cl
new file mode 100644
index 0000000..abd8731
--- /dev/null
+++ b/linbox/algorithms/opencl-kernels/kernel-muladd-partial-1024-sp.cl
@@ -0,0 +1,92 @@
+/*
+ * kernel_partial_1024_sp.cl
+ *
+ * Created on: Jul 13, 2011
+ * Author: Matthew Wezowicz
+ */
+
+#define BLOCK_SIZE 16
+
+__kernel void matrixMuladdKernelModular1024SP(__global float* D, float alpha, __global float* A, __global float* B,
+ float beta, __global float* C, const int widthA, const int widthB, const float mod){
+ //Get Workgroup ID
+ int bx = get_group_id(0);
+ int by = get_group_id(1);
+
+ //Get Local ID
+ int tx = get_local_id(0);
+ int ty = get_local_id(1);
+
+ //Range of indecies for sub-matrix of A
+ int aBegin = widthA * BLOCK_SIZE * by;
+ int aEnd = aBegin + widthA - 1;
+ int aStep = BLOCK_SIZE;
+
+ //Range of indecies for sub-matrix of B
+ int bBegin = BLOCK_SIZE * bx;
+ int bStep = BLOCK_SIZE * widthB;
+
+ //Local storage of sub-matrices of A and B
+ __local float As[BLOCK_SIZE][BLOCK_SIZE];
+ __local float Bs[BLOCK_SIZE][BLOCK_SIZE];
+
+ //Temporary storage for result
+ float Dsub = 0;
+
+ //Counter for modulus every 32 iterations
+ int mCount = 0;
+
+ //Loop over all the sub-matrices of A and B required to compute
+ //the result sub-matrix
+ for(int a = aBegin, b = bBegin; a < aEnd; a += aStep, b += bStep){
+ //Load the matrices from global memory to local memory
+ //Each thread loads one element of each sub-matrix
+ As[ty][tx] = A[a + widthA * ty + tx];
+ Bs[ty][tx] = B[b + widthB * ty + tx];
+
+ //Synchronize threads
+ barrier(CLK_LOCAL_MEM_FENCE);
+
+ //Multiply the two sub-matrices together
+ for(int i = 0; i < BLOCK_SIZE; i++){
+ Dsub += As[ty][i] * Bs[i][tx];
+ }
+ mCount++;
+
+ //fmod every 1024 iterations
+ if(mCount == 64){
+ Dsub = fmod(Dsub, mod);
+ mCount = 0;
+ }
+
+ //Synchronize threads
+ barrier(CLK_LOCAL_MEM_FENCE);
+ }
+
+ Dsub = fmod(Dsub, mod);
+
+ //Calculates the offset in the result matrix
+ int d = widthB * BLOCK_SIZE * by + BLOCK_SIZE * bx;
+
+ //Scale Dsub by alpha
+ Dsub = alpha * Dsub;
+ Dsub = fmod(Dsub, mod);
+ if(Dsub < 0){
+ Dsub = mod + Dsub;
+ }
+
+ //Scalse Csub by beta
+ float Csub = C[d + ty * widthB + tx];
+ Csub = beta * Csub;
+ Csub = fmod(Csub, mod);
+ if(Csub < 0){
+ Csub = mod + Csub;
+ }
+
+ //Add Dsub and Dsub
+ Dsub = Dsub + Csub;
+ Dsub = fmod(Dsub, mod);
+
+ //Add the sum to the appropriate spot
+ D[d + ty * widthB + tx] = Dsub;
+}
diff --git a/linbox/algorithms/opencl-kernels/kernel-muladd-partial-16-sp-unroll.cl b/linbox/algorithms/opencl-kernels/kernel-muladd-partial-16-sp-unroll.cl
new file mode 100644
index 0000000..f839e76
--- /dev/null
+++ b/linbox/algorithms/opencl-kernels/kernel-muladd-partial-16-sp-unroll.cl
@@ -0,0 +1,96 @@
+/*
+ * kernel_partial_sp.cl
+ *
+ * Created on: Jul 5, 2011
+ * Author: Matthew Wezowicz
+ */
+
+#define BLOCK_SIZE 16
+
+__kernel void matrixMuladdKernelModular16SP(__global float* D, float alpha, __global float* A, __global float* B,
+ float beta, __global float* C, const int widthA, const int widthB, const float mod){
+ //Get Workgroup ID
+ int bx = get_group_id(0);
+ int by = get_group_id(1);
+
+ //Get Local ID
+ int tx = get_local_id(0);
+ int ty = get_local_id(1);
+
+ //Range of indecies for sub-matrix of A
+ int aBegin = widthA * BLOCK_SIZE * by;
+ int aEnd = aBegin + widthA - 1;
+ int aStep = BLOCK_SIZE;
+
+ //Range of indecies for sub-matrix of B
+ int bBegin = BLOCK_SIZE * bx;
+ int bStep = BLOCK_SIZE * widthB;
+
+ //Local storage of sub-matrices of A and B
+ __local float As[BLOCK_SIZE][BLOCK_SIZE];
+ __local float Bs[BLOCK_SIZE][BLOCK_SIZE];
+
+ //Temporary storage for result
+ float Dsub = 0;
+
+ //Setup count for modulus every 32 iterations.
+ int m = 0;
+
+ //Loop over all the sub-matrices of A and B required to compute
+ //the result sub-matrix
+ for(int a = aBegin, b = bBegin; a < aEnd; a += aStep, b += bStep){
+ //Load the matrices from global memory to local memory
+ //Each thread loads one element of each sub-matrix
+ As[ty][tx] = A[a + widthA * ty + tx];
+ Bs[ty][tx] = B[b + widthB * ty + tx];
+
+ //Synchronize threads
+ barrier(CLK_LOCAL_MEM_FENCE);
+
+ //Multiply the two sub-matrices together
+ Dsub += As[ty][0] * Bs[0][tx];
+ Dsub += As[ty][1] * Bs[1][tx];
+ Dsub += As[ty][2] * Bs[2][tx];
+ Dsub += As[ty][3] * Bs[3][tx];
+ Dsub += As[ty][4] * Bs[4][tx];
+ Dsub += As[ty][5] * Bs[5][tx];
+ Dsub += As[ty][6] * Bs[6][tx];
+ Dsub += As[ty][7] * Bs[7][tx];
+ Dsub += As[ty][8] * Bs[8][tx];
+ Dsub += As[ty][9] * Bs[9][tx];
+ Dsub += As[ty][10] * Bs[10][tx];
+ Dsub += As[ty][11] * Bs[11][tx];
+ Dsub += As[ty][12] * Bs[12][tx];
+ Dsub += As[ty][13] * Bs[13][tx];
+ Dsub += As[ty][14] * Bs[14][tx];
+ Dsub += As[ty][15] * Bs[15][tx];
+ Dsub = fmod(Dsub, mod);
+
+ //Synchronize threads
+ barrier(CLK_LOCAL_MEM_FENCE);
+ }
+ //Calculates the offset in the result matrix
+ int d = widthB * BLOCK_SIZE * by + BLOCK_SIZE * bx;
+
+ //Scale Dsub by alpha
+ Dsub = alpha * Dsub;
+ Dsub = fmod(Dsub, mod);
+ if(Dsub < 0){
+ Dsub = mod + Dsub;
+ }
+
+ //Scalse Csub by beta
+ float Csub = C[d + ty * widthB + tx];
+ Csub = beta * Csub;
+ Csub = fmod(Csub, mod);
+ if(Csub < 0){
+ Csub = mod + Csub;
+ }
+
+ //Add Dsub and Dsub
+ Dsub = Dsub + Csub;
+ Dsub = fmod(Dsub, mod);
+
+ //Add the sum to the appropriate spot
+ D[d + ty * widthB + tx] = Dsub;
+}
diff --git a/linbox/algorithms/opencl-kernels/kernel-muladd-partial-16-sp.cl b/linbox/algorithms/opencl-kernels/kernel-muladd-partial-16-sp.cl
new file mode 100644
index 0000000..97aea8a
--- /dev/null
+++ b/linbox/algorithms/opencl-kernels/kernel-muladd-partial-16-sp.cl
@@ -0,0 +1,83 @@
+/*
+ * kernel_partial_sp.cl
+ *
+ * Created on: Jul 5, 2011
+ * Author: Matthew Wezowicz
+ */
+
+#define BLOCK_SIZE 16
+
+__kernel void matrixMuladdKernelModular16SP(__global float* D, float alpha, __global float* A, __global float* B,
+ float beta, __global float* C, const int widthA, const int widthB, const float mod){
+ //Get Workgroup ID
+ int bx = get_group_id(0);
+ int by = get_group_id(1);
+
+ //Get Local ID
+ int tx = get_local_id(0);
+ int ty = get_local_id(1);
+
+ //Range of indecies for sub-matrix of A
+ int aBegin = widthA * BLOCK_SIZE * by;
+ int aEnd = aBegin + widthA - 1;
+ int aStep = BLOCK_SIZE;
+
+ //Range of indecies for sub-matrix of B
+ int bBegin = BLOCK_SIZE * bx;
+ int bStep = BLOCK_SIZE * widthB;
+
+ //Local storage of sub-matrices of A and B
+ __local float As[BLOCK_SIZE][BLOCK_SIZE];
+ __local float Bs[BLOCK_SIZE][BLOCK_SIZE];
+
+ //Temporary storage for result
+ float Dsub = 0;
+
+ //Setup count for modulus every 32 iterations.
+ int m = 0;
+
+ //Loop over all the sub-matrices of A and B required to compute
+ //the result sub-matrix
+ for(int a = aBegin, b = bBegin; a < aEnd; a += aStep, b += bStep){
+ //Load the matrices from global memory to local memory
+ //Each thread loads one element of each sub-matrix
+ As[ty][tx] = A[a + widthA * ty + tx];
+ Bs[ty][tx] = B[b + widthB * ty + tx];
+
+ //Synchronize threads
+ barrier(CLK_LOCAL_MEM_FENCE);
+
+ //Multiply the two sub-matrices together
+ for(int i = 0; i < BLOCK_SIZE; i++){
+ Dsub += As[ty][i] * Bs[i][tx];
+ }
+ Dsub = fmod(Dsub, mod);
+
+ //Synchronize threads
+ barrier(CLK_LOCAL_MEM_FENCE);
+ }
+ //Calculates the offset in the result matrix
+ int d = widthB * BLOCK_SIZE * by + BLOCK_SIZE * bx;
+
+ //Scale Dsub by alpha
+ Dsub = alpha * Dsub;
+ Dsub = fmod(Dsub, mod);
+ if(Dsub < 0){
+ Dsub = mod + Dsub;
+ }
+
+ //Scalse Csub by beta
+ float Csub = C[d + ty * widthB + tx];
+ Csub = beta * Csub;
+ Csub = fmod(Csub, mod);
+ if(Csub < 0){
+ Csub = mod + Csub;
+ }
+
+ //Add Dsub and Dsub
+ Dsub = Dsub + Csub;
+ Dsub = fmod(Dsub, mod);
+
+ //Add the sum to the appropriate spot
+ D[d + ty * widthB + tx] = Dsub;
+}
diff --git a/linbox/algorithms/opencl-kernels/kernel-muladd-partial-32-dp-unroll.cl b/linbox/algorithms/opencl-kernels/kernel-muladd-partial-32-dp-unroll.cl
new file mode 100644
index 0000000..9d0a1bd
--- /dev/null
+++ b/linbox/algorithms/opencl-kernels/kernel-muladd-partial-32-dp-unroll.cl
@@ -0,0 +1,107 @@
+/*
+ * kernel_partial_32_dp.cl
+ *
+ * Created on: Jul 5, 2011
+ * Author: Matthew Wezowicz
+ */
+
+#define BLOCK_SIZE 16
+#pragma OPENCL EXTENSION cl_khr_fp64 : enable
+
+__kernel void matrixMuladdKernelModular32DP(__global double* D, double alpha, __global double* A, __global double* B,
+ double beta, __global double* C, const int widthA, const int widthB, const double mod){
+ //Get Workgroup ID
+ int bx = get_group_id(0);
+ int by = get_group_id(1);
+
+ //Get Local ID
+ int tx = get_local_id(0);
+ int ty = get_local_id(1);
+
+ //Range of indecies for sub-matrix of A
+ int aBegin = widthA * BLOCK_SIZE * by;
+ int aEnd = aBegin + widthA - 1;
+ int aStep = BLOCK_SIZE;
+
+ //Range of indecies for sub-matrix of B
+ int bBegin = BLOCK_SIZE * bx;
+ int bStep = BLOCK_SIZE * widthB;
+
+ //Local storage of sub-matrices of A and B
+ __local double As[BLOCK_SIZE][BLOCK_SIZE];
+ __local double Bs[BLOCK_SIZE][BLOCK_SIZE];
+
+ //Temporary storage for result
+ double Dsub = 0;
+
+ //Counter for modulus every 32 iterations
+ int mCount = 0;
+
+ //Loop over all the sub-matrices of A and B required to compute
+ //the result sub-matrix
+ for(int a = aBegin, b = bBegin; a < aEnd; a += aStep, b += bStep){
+ //Load the matrices from global memory to local memory
+ //Each thread loads one element of each sub-matrix
+ As[ty][tx] = A[a + widthA * ty + tx];
+ Bs[ty][tx] = B[b + widthB * ty + tx];
+
+ //Synchronize threads
+ barrier(CLK_LOCAL_MEM_FENCE);
+
+ //Multiply the two sub-matrices together
+ Dsub += As[ty][0] * Bs[0][tx];
+ Dsub += As[ty][1] * Bs[1][tx];
+ Dsub += As[ty][2] * Bs[2][tx];
+ Dsub += As[ty][3] * Bs[3][tx];
+ Dsub += As[ty][4] * Bs[4][tx];
+ Dsub += As[ty][5] * Bs[5][tx];
+ Dsub += As[ty][6] * Bs[6][tx];
+ Dsub += As[ty][7] * Bs[7][tx];
+ Dsub += As[ty][8] * Bs[8][tx];
+ Dsub += As[ty][9] * Bs[9][tx];
+ Dsub += As[ty][10] * Bs[10][tx];
+ Dsub += As[ty][11] * Bs[11][tx];
+ Dsub += As[ty][12] * Bs[12][tx];
+ Dsub += As[ty][13] * Bs[13][tx];
+ Dsub += As[ty][14] * Bs[14][tx];
+ Dsub += As[ty][15] * Bs[15][tx];
+
+ mCount++;
+
+ //fmod every 32 iterations
+ if(mCount == 2){
+ Dsub = fmod(Dsub, mod);
+ mCount = 0;
+ }
+
+ //Synchronize threads
+ barrier(CLK_LOCAL_MEM_FENCE);
+ }
+
+ Dsub = fmod(Dsub, mod);
+
+ //Calculates the offset in the result matrix
+ int d = widthB * BLOCK_SIZE * by + BLOCK_SIZE * bx;
+
+ //Scale Dsub by alpha
+ Dsub = alpha * Dsub;
+ Dsub = fmod(Dsub, mod);
+ if(Dsub < 0){
+ Dsub = mod + Dsub;
+ }
+
+ //Scalse Csub by beta
+ double Csub = C[d + ty * widthB + tx];
+ Csub = beta * Csub;
+ Csub = fmod(Csub, mod);
+ if(Csub < 0){
+ Csub = mod + Csub;
+ }
+
+ //Add Dsub and Dsub
+ Dsub = Dsub + Csub;
+ Dsub = fmod(Dsub, mod);
+
+ //Add the sum to the appropriate spot
+ D[d + ty * widthB + tx] = Dsub;
+}
diff --git a/linbox/algorithms/opencl-kernels/kernel-muladd-partial-32-dp.cl b/linbox/algorithms/opencl-kernels/kernel-muladd-partial-32-dp.cl
new file mode 100644
index 0000000..504d9dc
--- /dev/null
+++ b/linbox/algorithms/opencl-kernels/kernel-muladd-partial-32-dp.cl
@@ -0,0 +1,93 @@
+/*
+ * kernel_partial_32_dp.cl
+ *
+ * Created on: Jul 5, 2011
+ * Author: Matthew Wezowicz
+ */
+
+#define BLOCK_SIZE 16
+#pragma OPENCL EXTENSION cl_khr_fp64 : enable
+
+__kernel void matrixMuladdKernelModular32DP(__global double* D, double alpha, __global double* A, __global double* B,
+ double beta, __global double* C, const int widthA, const int widthB, const double mod){
+ //Get Workgroup ID
+ int bx = get_group_id(0);
+ int by = get_group_id(1);
+
+ //Get Local ID
+ int tx = get_local_id(0);
+ int ty = get_local_id(1);
+
+ //Range of indecies for sub-matrix of A
+ int aBegin = widthA * BLOCK_SIZE * by;
+ int aEnd = aBegin + widthA - 1;
+ int aStep = BLOCK_SIZE;
+
+ //Range of indecies for sub-matrix of B
+ int bBegin = BLOCK_SIZE * bx;
+ int bStep = BLOCK_SIZE * widthB;
+
+ //Local storage of sub-matrices of A and B
+ __local double As[BLOCK_SIZE][BLOCK_SIZE];
+ __local double Bs[BLOCK_SIZE][BLOCK_SIZE];
+
+ //Temporary storage for result
+ double Dsub = 0;
+
+ //Counter for modulus every 32 iterations
+ int mCount = 0;
+
+ //Loop over all the sub-matrices of A and B required to compute
+ //the result sub-matrix
+ for(int a = aBegin, b = bBegin; a < aEnd; a += aStep, b += bStep){
+ //Load the matrices from global memory to local memory
+ //Each thread loads one element of each sub-matrix
+ As[ty][tx] = A[a + widthA * ty + tx];
+ Bs[ty][tx] = B[b + widthB * ty + tx];
+
+ //Synchronize threads
+ barrier(CLK_LOCAL_MEM_FENCE);
+
+ //Multiply the two sub-matrices together
+ for(int i = 0; i < BLOCK_SIZE; i++){
+ Dsub += As[ty][i] * Bs[i][tx];
+ }
+ mCount++;
+
+ //fmod every 32 iterations
+ if(mCount == 2){
+ Dsub = fmod(Dsub, mod);
+ mCount = 0;
+ }
+
+ //Synchronize threads
+ barrier(CLK_LOCAL_MEM_FENCE);
+ }
+
+ Dsub = fmod(Dsub, mod);
+
+ //Calculates the offset in the result matrix
+ int d = widthB * BLOCK_SIZE * by + BLOCK_SIZE * bx;
+
+ //Scale Dsub by alpha
+ Dsub = alpha * Dsub;
+ Dsub = fmod(Dsub, mod);
+ if(Dsub < 0){
+ Dsub = mod + Dsub;
+ }
+
+ //Scalse Csub by beta
+ double Csub = C[d + ty * widthB + tx];
+ Csub = beta * Csub;
+ Csub = fmod(Csub, mod);
+ if(Csub < 0){
+ Csub = mod + Csub;
+ }
+
+ //Add Dsub and Dsub
+ Dsub = Dsub + Csub;
+ Dsub = fmod(Dsub, mod);
+
+ //Add the sum to the appropriate spot
+ D[d + ty * widthB + tx] = Dsub;
+}
diff --git a/linbox/algorithms/opencl-kernels/kernel-muladd-partial-32-sp-unroll.cl b/linbox/algorithms/opencl-kernels/kernel-muladd-partial-32-sp-unroll.cl
new file mode 100644
index 0000000..f5b5150
--- /dev/null
+++ b/linbox/algorithms/opencl-kernels/kernel-muladd-partial-32-sp-unroll.cl
@@ -0,0 +1,106 @@
+/*
+ * kernel_partial_32_sp.cl
+ *
+ * Created on: Jul 5, 2011
+ * Author: Matthew Wezowicz
+ */
+
+#define BLOCK_SIZE 16
+
+__kernel void matrixMuladdKernelModular32SP(__global float* D, float alpha, __global float* A, __global float* B,
+ float beta, __global float* C, const int widthA, const int widthB, const float mod){
+ //Get Workgroup ID
+ int bx = get_group_id(0);
+ int by = get_group_id(1);
+
+ //Get Local ID
+ int tx = get_local_id(0);
+ int ty = get_local_id(1);
+
+ //Range of indecies for sub-matrix of A
+ int aBegin = widthA * BLOCK_SIZE * by;
+ int aEnd = aBegin + widthA - 1;
+ int aStep = BLOCK_SIZE;
+
+ //Range of indecies for sub-matrix of B
+ int bBegin = BLOCK_SIZE * bx;
+ int bStep = BLOCK_SIZE * widthB;
+
+ //Local storage of sub-matrices of A and B
+ __local float As[BLOCK_SIZE][BLOCK_SIZE];
+ __local float Bs[BLOCK_SIZE][BLOCK_SIZE];
+
+ //Temporary storage for result
+ float Dsub = 0;
+
+ //Counter for modulus every 32 iterations
+ int mCount = 0;
+
+ //Loop over all the sub-matrices of A and B required to compute
+ //the result sub-matrix
+ for(int a = aBegin, b = bBegin; a < aEnd; a += aStep, b += bStep){
+ //Load the matrices from global memory to local memory
+ //Each thread loads one element of each sub-matrix
+ As[ty][tx] = A[a + widthA * ty + tx];
+ Bs[ty][tx] = B[b + widthB * ty + tx];
+
+ //Synchronize threads
+ barrier(CLK_LOCAL_MEM_FENCE);
+
+ //Multiply the two sub-matrices together
+ Dsub += As[ty][0] * Bs[0][tx];
+ Dsub += As[ty][1] * Bs[1][tx];
+ Dsub += As[ty][2] * Bs[2][tx];
+ Dsub += As[ty][3] * Bs[3][tx];
+ Dsub += As[ty][4] * Bs[4][tx];
+ Dsub += As[ty][5] * Bs[5][tx];
+ Dsub += As[ty][6] * Bs[6][tx];
+ Dsub += As[ty][7] * Bs[7][tx];
+ Dsub += As[ty][8] * Bs[8][tx];
+ Dsub += As[ty][9] * Bs[9][tx];
+ Dsub += As[ty][10] * Bs[10][tx];
+ Dsub += As[ty][11] * Bs[11][tx];
+ Dsub += As[ty][12] * Bs[12][tx];
+ Dsub += As[ty][13] * Bs[13][tx];
+ Dsub += As[ty][14] * Bs[14][tx];
+ Dsub += As[ty][15] * Bs[15][tx];
+
+ mCount++;
+
+ //fmod every 32 iterations
+ if(mCount == 2){
+ Dsub = fmod(Dsub, mod);
+ mCount = 0;
+ }
+
+ //Synchronize threads
+ barrier(CLK_LOCAL_MEM_FENCE);
+ }
+
+ Dsub = fmod(Dsub, mod);
+
+ //Calculates the offset in the result matrix
+ int d = widthB * BLOCK_SIZE * by + BLOCK_SIZE * bx;
+
+ //Scale Dsub by alpha
+ Dsub = alpha * Dsub;
+ Dsub = fmod(Dsub, mod);
+ if(Dsub < 0){
+ Dsub = mod + Dsub;
+ }
+
+ //Scalse Csub by beta
+ float Csub = C[d + ty * widthB + tx];
+ Csub = beta * Csub;
+ Csub = fmod(Csub, mod);
+ if(Csub < 0){
+ Csub = mod + Csub;
+ }
+
+ //Add Dsub and Dsub
+ Dsub = Dsub + Csub;
+ Dsub = fmod(Dsub, mod);
+
+ //Add the sum to the appropriate spot
+ D[d + ty * widthB + tx] = Dsub;
+}
diff --git a/linbox/algorithms/opencl-kernels/kernel-muladd-partial-32-sp.cl b/linbox/algorithms/opencl-kernels/kernel-muladd-partial-32-sp.cl
new file mode 100644
index 0000000..4200543
--- /dev/null
+++ b/linbox/algorithms/opencl-kernels/kernel-muladd-partial-32-sp.cl
@@ -0,0 +1,92 @@
+/*
+ * kernel_partial_32_sp.cl
+ *
+ * Created on: Jul 5, 2011
+ * Author: Matthew Wezowicz
+ */
+
+#define BLOCK_SIZE 16
+
+__kernel void matrixMuladdKernelModular32SP(__global float* D, float alpha, __global float* A, __global float* B,
+ float beta, __global float* C, const int widthA, const int widthB, const float mod){
+ //Get Workgroup ID
+ int bx = get_group_id(0);
+ int by = get_group_id(1);
+
+ //Get Local ID
+ int tx = get_local_id(0);
+ int ty = get_local_id(1);
+
+ //Range of indecies for sub-matrix of A
+ int aBegin = widthA * BLOCK_SIZE * by;
+ int aEnd = aBegin + widthA - 1;
+ int aStep = BLOCK_SIZE;
+
+ //Range of indecies for sub-matrix of B
+ int bBegin = BLOCK_SIZE * bx;
+ int bStep = BLOCK_SIZE * widthB;
+
+ //Local storage of sub-matrices of A and B
+ __local float As[BLOCK_SIZE][BLOCK_SIZE];
+ __local float Bs[BLOCK_SIZE][BLOCK_SIZE];
+
+ //Temporary storage for result
+ float Dsub = 0;
+
+ //Counter for modulus every 32 iterations
+ int mCount = 0;
+
+ //Loop over all the sub-matrices of A and B required to compute
+ //the result sub-matrix
+ for(int a = aBegin, b = bBegin; a < aEnd; a += aStep, b += bStep){
+ //Load the matrices from global memory to local memory
+ //Each thread loads one element of each sub-matrix
+ As[ty][tx] = A[a + widthA * ty + tx];
+ Bs[ty][tx] = B[b + widthB * ty + tx];
+
+ //Synchronize threads
+ barrier(CLK_LOCAL_MEM_FENCE);
+
+ //Multiply the two sub-matrices together
+ for(int i = 0; i < BLOCK_SIZE; i++){
+ Dsub += As[ty][i] * Bs[i][tx];
+ }
+ mCount++;
+
+ //fmod every 32 iterations
+ if(mCount == 2){
+ Dsub = fmod(Dsub, mod);
+ mCount = 0;
+ }
+
+ //Synchronize threads
+ barrier(CLK_LOCAL_MEM_FENCE);
+ }
+
+ Dsub = fmod(Dsub, mod);
+
+ //Calculates the offset in the result matrix
+ int d = widthB * BLOCK_SIZE * by + BLOCK_SIZE * bx;
+
+ //Scale Dsub by alpha
+ Dsub = alpha * Dsub;
+ Dsub = fmod(Dsub, mod);
+ if(Dsub < 0){
+ Dsub = mod + Dsub;
+ }
+
+ //Scalse Csub by beta
+ float Csub = C[d + ty * widthB + tx];
+ Csub = beta * Csub;
+ Csub = fmod(Csub, mod);
+ if(Csub < 0){
+ Csub = mod + Csub;
+ }
+
+ //Add Dsub and Dsub
+ Dsub = Dsub + Csub;
+ Dsub = fmod(Dsub, mod);
+
+ //Add the sum to the appropriate spot
+ D[d + ty * widthB + tx] = Dsub;
+}
diff --git a/linbox/algorithms/opencl-kernels/kernel-muladd-partial-8-dp-unroll.cl b/linbox/algorithms/opencl-kernels/kernel-muladd-partial-8-dp-unroll.cl
new file mode 100644
index 0000000..ec670bc
--- /dev/null
+++ b/linbox/algorithms/opencl-kernels/kernel-muladd-partial-8-dp-unroll.cl
@@ -0,0 +1,96 @@
+/*
+ * kernel_partial_8_dp.cl
+ *
+ * Created on: Jul 5, 2011
+ * Author: Matthew Wezowicz
+ */
+
+#define BLOCK_SIZE 16
+#pragma OPENCL EXTENSION cl_khr_fp64 : enable
+
+__kernel void matrixMuladdKernelModular8DP(__global double* D, double alpha, __global double* A, __global double* B,
+ double beta, __global double* C, const int widthA, const int widthB, const double mod){
+ //Get Workgroup ID
+ int bx = get_group_id(0);
+ int by = get_group_id(1);
+
+ //Get Local ID
+ int tx = get_local_id(0);
+ int ty = get_local_id(1);
+
+ //Range of indecies for sub-matrix of A
+ int aBegin = widthA * BLOCK_SIZE * by;
+ int aEnd = aBegin + widthA - 1;
+ int aStep = BLOCK_SIZE;
+
+ //Range of indecies for sub-matrix of B
+ int bBegin = BLOCK_SIZE * bx;
+ int bStep = BLOCK_SIZE * widthB;
+
+ //Local storage of sub-matrices of A and B
+ __local double As[BLOCK_SIZE][BLOCK_SIZE];
+ __local double Bs[BLOCK_SIZE][BLOCK_SIZE];
+
+ //Temporary storage for result
+ double Dsub = 0;
+
+ //Loop over all the sub-matrices of A and B required to compute
+ //the result sub-matrix
+ for(int a = aBegin, b = bBegin; a < aEnd; a += aStep, b += bStep){
+ //Load the matrices from global memory to local memory
+ //Each thread loads one element of each sub-matrix
+ As[ty][tx] = A[a + widthA * ty + tx];
+ Bs[ty][tx] = B[b + widthB * ty + tx];
+
+ //Synchronize threads
+ barrier(CLK_LOCAL_MEM_FENCE);
+
+ //Multiply the two sub-matrices together
+ Dsub += As[ty][0] * Bs[0][tx];
+ Dsub += As[ty][1] * Bs[1][tx];
+ Dsub += As[ty][2] * Bs[2][tx];
+ Dsub += As[ty][3] * Bs[3][tx];
+ Dsub += As[ty][4] * Bs[4][tx];
+ Dsub += As[ty][5] * Bs[5][tx];
+ Dsub += As[ty][6] * Bs[6][tx];
+ Dsub += As[ty][7] * Bs[7][tx];
+ Dsub = fmod(Dsub, mod);
+
+ Dsub += As[ty][8] * Bs[8][tx];
+ Dsub += As[ty][9] * Bs[9][tx];
+ Dsub += As[ty][10] * Bs[10][tx];
+ Dsub += As[ty][11] * Bs[11][tx];
+ Dsub += As[ty][12] * Bs[12][tx];
+ Dsub += As[ty][13] * Bs[13][tx];
+ Dsub += As[ty][14] * Bs[14][tx];
+ Dsub += As[ty][15] * Bs[15][tx];
+ Dsub = fmod(Dsub, mod);
+
+ //Synchronize threads
+ barrier(CLK_LOCAL_MEM_FENCE);
+ }
+ //Calculates the offset in the result matrix
+ int d = widthB * BLOCK_SIZE * by + BLOCK_SIZE * bx;
+
+ //Scale Dsub by alpha
+ Dsub = alpha * Dsub;
+ Dsub = fmod(Dsub, mod);
+ if(Dsub < 0){
+ Dsub = mod + Dsub;
+ }
+
+ //Scalse Csub by beta
+ double Csub = C[d + ty * widthB + tx];
+ Csub = beta * Csub;
+ Csub = fmod(Csub, mod);
+ if(Csub < 0){
+ Csub = mod + Csub;
+ }
+
+ //Add Dsub and Dsub
+ Dsub = Dsub + Csub;
+ Dsub = fmod(Dsub, mod);
+
+ //Add the sum to the appropriate spot
+ D[d + ty * widthB + tx] = Dsub;
+}
diff --git a/linbox/algorithms/opencl-kernels/kernel-muladd-partial-8-dp.cl b/linbox/algorithms/opencl-kernels/kernel-muladd-partial-8-dp.cl
new file mode 100644
index 0000000..af3bbcc
--- /dev/null
+++ b/linbox/algorithms/opencl-kernels/kernel-muladd-partial-8-dp.cl
@@ -0,0 +1,86 @@
+/*
+ * kernel_partial_8_dp.cl
+ *
+ * Created on: Jul 5, 2011
+ * Author: Matthew Wezowicz
+ */
+
+#define BLOCK_SIZE 16
+#pragma OPENCL EXTENSION cl_khr_fp64 : enable
+
+__kernel void matrixMuladdKernelModular8DP(__global double* D, double alpha, __global double* A, __global double* B,
+ double beta, __global double* C, const int widthA, const int widthB, const double mod){
+ //Get Workgroup ID
+ int bx = get_group_id(0);
+ int by = get_group_id(1);
+
+ //Get Local ID
+ int tx = get_local_id(0);
+ int ty = get_local_id(1);
+
+ //Range of indecies for sub-matrix of A
+ int aBegin = widthA * BLOCK_SIZE * by;
+ int aEnd = aBegin + widthA - 1;
+ int aStep = BLOCK_SIZE;
+
+ //Range of indecies for sub-matrix of B
+ int bBegin = BLOCK_SIZE * bx;
+ int bStep = BLOCK_SIZE * widthB;
+
+ //Local storage of sub-matrices of A and B
+ __local double As[BLOCK_SIZE][BLOCK_SIZE];
+ __local double Bs[BLOCK_SIZE][BLOCK_SIZE];
+
+ //Temporary storage for result
+ double Dsub = 0;
+
+ //Loop over all the sub-matrices of A and B required to compute
+ //the result sub-matrix
+ for(int a = aBegin, b = bBegin; a < aEnd; a += aStep, b += bStep){
+ //Load the matrices from global memory to local memory
+ //Each thread loads one element of each sub-matrix
+ As[ty][tx] = A[a + widthA * ty + tx];
+ Bs[ty][tx] = B[b + widthB * ty + tx];
+
+ //Synchronize threads
+ barrier(CLK_LOCAL_MEM_FENCE);
+
+ //Multiply the two sub-matrices together
+ for(int i = 0; i < BLOCK_SIZE / 2; i++){
+ Dsub += As[ty][i] * Bs[i][tx];
+ }
+ Dsub = fmod(Dsub, mod);
+
+ for(int i = BLOCK_SIZE / 2; i < BLOCK_SIZE; i++){
+ Dsub += As[ty][i] * Bs[i][tx];
+ }
+ Dsub = fmod(Dsub, mod);
+
+ //Synchronize threads
+ barrier(CLK_LOCAL_MEM_FENCE);
+ }
+ //Calculates the offset in the result matrix
+ int d = widthB * BLOCK_SIZE * by + BLOCK_SIZE * bx;
+
+ //Scale Dsub by alpha
+ Dsub = alpha * Dsub;
+ Dsub = fmod(Dsub, mod);
+ if(Dsub < 0){
+ Dsub = mod + Dsub;
+ }
+
+ //Scalse Csub by beta
+ double Csub = C[d + ty * widthB + tx];
+ Csub = beta * Csub;
+ Csub = fmod(Csub, mod);
+ if(Csub < 0){
+ Csub = mod + Csub;
+ }
+
+ //Add Dsub and Dsub
+ Dsub = Dsub + Csub;
+ Dsub = fmod(Dsub, mod);
+
+ //Add the sum to the appropriate spot
+ D[d + ty * widthB + tx] = Dsub;
+}
diff --git a/linbox/algorithms/opencl-kernels/kernel-parser.py b/linbox/algorithms/opencl-kernels/kernel-parser.py
new file mode 100644
index 0000000..ada29e8
--- /dev/null
+++ b/linbox/algorithms/opencl-kernels/kernel-parser.py
@@ -0,0 +1,177 @@
+"""
+/* linbox/algorithms/opencl-domain-setup.inl
+ * Copyright (C) 2011-2012 Matthew Wezowicz
+ *
+ * Written by Matthew Wezowicz <mwezz at udel.edu>
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ * ========LICENCE========
+ *.
+ */
+"""
+
+import string
+import time
+
+def parse_kernel(file_name, output):
+ # Open the kernel file
+ fp = open(file_name)
+
+ # Begin parsing of the kernel file
+ parsed = []
+
+ # Search for the kernel name in the file
+ # Once found generate the const char* kernel name line
+ for line in fp.readlines():
+ line = string.split(line)
+ if(len(line) > 0 and line[0] == '__kernel'):
+ parsed.append("const char*")
+ temp = string.split(line[2],'(')
+ parsed.append(temp[0])
+ parsed.append("= {\n")
+ break
+
+ # Join the line with spaces
+ parsed = string.join(parsed)
+
+ # Write the const char* kernel name line to the header file
+ output.write("\t")
+ output.write(parsed)
+
+ # Seek to beginning of the kernel file
+ fp.seek(0,0)
+
+ # Skip over the comment block at the beginning of the kernel file
+ # Write rest of file to the const char* block
+ for line in fp.readlines():
+ temp = string.split(line)
+ if(len(temp) > 0 and (temp[0] == '/*' or temp[0] == '*' or temp[0] == '*/' or temp[0][:2] == '//')):
+ continue
+ if(len(temp) == 0):
+ continue
+ output.write("\t\t\"")
+ output.write(string.rstrip(line))
+ output.write("\\n\"\n")
+
+ # End const char* block
+ output.write("\t};\n\n")
+
+ # Close kernel file
+ fp.close()
+
+ return
+
+def gen_timestamp():
+ # Get the time
+ timestruct = time.localtime()
+
+ # Begin generating the timestamp string
+ timestamp = ""
+ if(timestruct.tm_mon < 10):
+ timestamp = "0" + str(timestruct.tm_mon) + "/"
+ else:
+ timestamp = str(timestruct.tm_mon) + "/"
+
+ if(timestruct.tm_mday < 10):
+ timestamp += "0" + str(timestruct.tm_mday) + "/"
+ else:
+ timestamp += str(timestruct.tm_mday) + "/"
+
+ timestamp += str(timestruct.tm_year) + " "
+
+ if(timestruct.tm_hour < 10):
+ timestamp += "0" + str(timestruct.tm_hour) + ":"
+ else:
+ timestamp += str(timestruct.tm_hour) + ":"
+
+ if(timestruct.tm_min < 10):
+ timestamp += "0" + str(timestruct.tm_min) + ":"
+ else:
+ timestamp += str(timestruct.tm_min) + ":"
+
+ if(timestruct.tm_sec < 10):
+ timestamp += "0" + str(timestruct.tm_sec)
+ else:
+ timestamp += str(timestruct.tm_sec)
+
+ return timestamp
+
+def main():
+ # Open file containing list of all selected kernels
+ fp = open("file-list.txt","r")
+
+ # Create file to write the generated header into
+ output = open("opencl-domain-kernels.inl","w")
+
+ # Add standard comment block to
+ output.write("/* linbox/algorithms/opencl-domain.h\n"
+ " * Copyright (C) 2012 Matthew Wezowicz\n"
+ " *\n"
+ " * Written by Matthew Wezowicz <mwezz at udel.edu>\n"
+ " *\n"
+ " * ========LICENCE========\n"
+ " * This file is part of the library LinBox.\n"
+ " *\n"
+ " * LinBox is free software: you can redistribute it and/or modify\n"
+ " * it under the terms of the GNU Lesser General Public\n"
+ " * License as published by the Free Software Foundation; either\n"
+ " * version 2.1 of the License, or (at your option) any later version.\n"
+ " *\n"
+ " * This library is distributed in the hope that it will be useful,\n"
+ " * but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
+ " * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\n"
+ " * Lesser General Public License for more details.\n"
+ " *\n"
+ " * You should have received a copy of the GNU Lesser General Public\n"
+ " * License along with this library; if not, write to the Free Software\n"
+ " * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n"
+ " * ========LICENCE========\n"
+ " *.\n"
+ " */\n\n")
+
+ # Add timestamp for generation
+ output.write(" /*###--- Generated On ---###*/\n")
+ output.write(" /*###--- " + gen_timestamp() + " ---###*/\n\n")
+
+ # Add header file lines
+ output.write("#ifndef __LINBOX_opencl_matrix_domain_kernels_INL\n")
+ output.write("#define __LINBOX_opencl_matrix_domain_kernels_INL\n\n")
+ output.write("namespace LinBox{\n\n")
+
+ # For every file in the file list generate a const char* and add to the header
+ for file_name in fp.readlines():
+ parse_kernel(string.rstrip(file_name),output)
+
+ # Add end of header lines
+ output.write("} // end of namespace LinBox\n\n")
+ output.write("#endif // __LINBOX_opencl_matrix_domain_kernels_INL\n\n")
+ output.write("// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s\n"
+ "// Local Variables:\n"
+ "// mode: C++\n"
+ "// tab-width: 8\n"
+ "// indent-tabs-mode: nil\n"
+ "// c-basic-offset: 8\n"
+ "// End:\n")
+
+ # Close the files
+ fp.close()
+ output.close()
+
+ return
+
+main()
diff --git a/linbox/algorithms/opencl-kernels/kernel-partial-1024-dp-unroll.cl b/linbox/algorithms/opencl-kernels/kernel-partial-1024-dp-unroll.cl
new file mode 100644
index 0000000..9f073e9
--- /dev/null
+++ b/linbox/algorithms/opencl-kernels/kernel-partial-1024-dp-unroll.cl
@@ -0,0 +1,87 @@
+/*
+ * kernel_partial_1024_dp.cl
+ *
+ * Created on: Jul 13, 2011
+ * Author: Matthew Wezowicz
+ */
+
+#define BLOCK_SIZE 16
+#pragma OPENCL EXTENSION cl_khr_fp64 : enable
+
+__kernel void matrixMulKernelModular1024DP(__global double* C, __global double* A, __global double* B,
+ const int widthA, const int widthB, const double mod){
+ //Get Workgroup ID
+ int bx = get_group_id(0);
+ int by = get_group_id(1);
+
+ //Get Local ID
+ int tx = get_local_id(0);
+ int ty = get_local_id(1);
+
+ //Range of indecies for sub-matrix of A
+ int aBegin = widthA * BLOCK_SIZE * by;
+ int aEnd = aBegin + widthA - 1;
+ int aStep = BLOCK_SIZE;
+
+ //Range of indecies for sub-matrix of B
+ int bBegin = BLOCK_SIZE * bx;
+ int bStep = BLOCK_SIZE * widthB;
+
+ //Local storage of sub-matrices of A and B
+ __local double As[BLOCK_SIZE][BLOCK_SIZE];
+ __local double Bs[BLOCK_SIZE][BLOCK_SIZE];
+
+ //Temporary storage for result
+ double Csub = 0;
+
+ //Counter for modulus every 32 iterations
+ int mCount = 0;
+
+ //Loop over all the sub-matrices of A and B required to compute
+ //the result sub-matrix
+ for(int a = aBegin, b = bBegin; a < aEnd; a += aStep, b += bStep){
+ //Load the matrices from global memory to local memory
+ //Each thread loads one element of each sub-matrix
+ As[ty][tx] = A[a + widthA * ty + tx];
+ Bs[ty][tx] = B[b + widthB * ty + tx];
+
+ //Synchronize threads
+ barrier(CLK_LOCAL_MEM_FENCE);
+
+ //Multiply the two sub-matrices together
+ Csub += As[ty][0] * Bs[0][tx];
+ Csub += As[ty][1] * Bs[1][tx];
+ Csub += As[ty][2] * Bs[2][tx];
+ Csub += As[ty][3] * Bs[3][tx];
+ Csub += As[ty][4] * Bs[4][tx];
+ Csub += As[ty][5] * Bs[5][tx];
+ Csub += As[ty][6] * Bs[6][tx];
+ Csub += As[ty][7] * Bs[7][tx];
+ Csub += As[ty][8] * Bs[8][tx];
+ Csub += As[ty][9] * Bs[9][tx];
+ Csub += As[ty][10] * Bs[10][tx];
+ Csub += As[ty][11] * Bs[11][tx];
+ Csub += As[ty][12] * Bs[12][tx];
+ Csub += As[ty][13] * Bs[13][tx];
+ Csub += As[ty][14] * Bs[14][tx];
+ Csub += As[ty][15] * Bs[15][tx];
+
+ mCount++;
+
+ //fmod every 1024 iterations
+ if(mCount == 64){
+ Csub = fmod(Csub, mod);
+ mCount = 0;
+ }
+
+ //Synchronize threads
+ barrier(CLK_LOCAL_MEM_FENCE);
+ }
+ //Calls fmod once to normalize the sum
+ Csub = fmod(Csub, mod);
+
+ //Calculates the offset in the result matrix and add the sum to the
+ //appropriate spot
+ int c = widthB * BLOCK_SIZE * by + BLOCK_SIZE * bx;
+ C[c + ty * widthB + tx] = Csub;
+}
diff --git a/linbox/algorithms/opencl-kernels/kernel-partial-1024-dp.cl b/linbox/algorithms/opencl-kernels/kernel-partial-1024-dp.cl
new file mode 100644
index 0000000..d420477
--- /dev/null
+++ b/linbox/algorithms/opencl-kernels/kernel-partial-1024-dp.cl
@@ -0,0 +1,73 @@
+/*
+ * kernel_partial_1024_dp.cl
+ *
+ * Created on: Jul 13, 2011
+ * Author: Matthew Wezowicz
+ */
+
+#define BLOCK_SIZE 16
+#pragma OPENCL EXTENSION cl_khr_fp64 : enable
+
+__kernel void matrixMulKernelModular1024DP(__global double* C, __global double* A, __global double* B,
+ const int widthA, const int widthB, const double mod){
+ //Get Workgroup ID
+ int bx = get_group_id(0);
+ int by = get_group_id(1);
+
+ //Get Local ID
+ int tx = get_local_id(0);
+ int ty = get_local_id(1);
+
+ //Range of indecies for sub-matrix of A
+ int aBegin = widthA * BLOCK_SIZE * by;
+ int aEnd = aBegin + widthA - 1;
+ int aStep = BLOCK_SIZE;
+
+ //Range of indecies for sub-matrix of B
+ int bBegin = BLOCK_SIZE * bx;
+ int bStep = BLOCK_SIZE * widthB;
+
+ //Local storage of sub-matrices of A and B
+ __local double As[BLOCK_SIZE][BLOCK_SIZE];
+ __local double Bs[BLOCK_SIZE][BLOCK_SIZE];
+
+ //Temporary storage for result
+ double Csub = 0;
+
+ //Counter for modulus every 32 iterations
+ int mCount = 0;
+
+ //Loop over all the sub-matrices of A and B required to compute
+ //the result sub-matrix
+ for(int a = aBegin, b = bBegin; a < aEnd; a += aStep, b += bStep){
+ //Load the matrices from global memory to local memory
+ //Each thread loads one element of each sub-matrix
+ As[ty][tx] = A[a + widthA * ty + tx];
+ Bs[ty][tx] = B[b + widthB * ty + tx];
+
+ //Synchronize threads
+ barrier(CLK_LOCAL_MEM_FENCE);
+
+ //Multiply the two sub-matrices together
+ for(int i = 0; i < BLOCK_SIZE; i++){
+ Csub += As[ty][i] * Bs[i][tx];
+ }
+ mCount++;
+
+ //fmod every 1024 iterations
+ if(mCount == 64){
+ Csub = fmod(Csub, mod);
+ mCount = 0;
+ }
+
+ //Synchronize threads
+ barrier(CLK_LOCAL_MEM_FENCE);
+ }
+ //Calls fmod once to normalize the sum
+ Csub = fmod(Csub, mod);
+
+ //Calculates the offset in the result matrix and add the sum to the
+ //appropriate spot
+ int c = widthB * BLOCK_SIZE * by + BLOCK_SIZE * bx;
+ C[c + ty * widthB + tx] = Csub;
+}
diff --git a/linbox/algorithms/opencl-kernels/kernel-partial-1024-sp-unroll.cl b/linbox/algorithms/opencl-kernels/kernel-partial-1024-sp-unroll.cl
new file mode 100644
index 0000000..98f1525
--- /dev/null
+++ b/linbox/algorithms/opencl-kernels/kernel-partial-1024-sp-unroll.cl
@@ -0,0 +1,86 @@
+/*
+ * kernel_partial_1024_sp.cl
+ *
+ * Created on: Jul 13, 2011
+ * Author: Matthew Wezowicz
+ */
+
+#define BLOCK_SIZE 16
+
+__kernel void matrixMulKernelModular1024SP(__global float* C, __global float* A, __global float* B,
+ const int widthA, const int widthB, const float mod){
+ //Get Workgroup ID
+ int bx = get_group_id(0);
+ int by = get_group_id(1);
+
+ //Get Local ID
+ int tx = get_local_id(0);
+ int ty = get_local_id(1);
+
+ //Range of indecies for sub-matrix of A
+ int aBegin = widthA * BLOCK_SIZE * by;
+ int aEnd = aBegin + widthA - 1;
+ int aStep = BLOCK_SIZE;
+
+ //Range of indecies for sub-matrix of B
+ int bBegin = BLOCK_SIZE * bx;
+ int bStep = BLOCK_SIZE * widthB;
+
+ //Local storage of sub-matrices of A and B
+ __local float As[BLOCK_SIZE][BLOCK_SIZE];
+ __local float Bs[BLOCK_SIZE][BLOCK_SIZE];
+
+ //Temporary storage for result
+ float Csub = 0;
+
+ //Counter for modulus every 32 iterations
+ int mCount = 0;
+
+ //Loop over all the sub-matrices of A and B required to compute
+ //the result sub-matrix
+ for(int a = aBegin, b = bBegin; a < aEnd; a += aStep, b += bStep){
+ //Load the matrices from global memory to local memory
+ //Each thread loads one element of each sub-matrix
+ As[ty][tx] = A[a + widthA * ty + tx];
+ Bs[ty][tx] = B[b + widthB * ty + tx];
+
+ //Synchronize threads
+ barrier(CLK_LOCAL_MEM_FENCE);
+
+ //Multiply the two sub-matrices together
+ Csub += As[ty][0] * Bs[0][tx];
+ Csub += As[ty][1] * Bs[1][tx];
+ Csub += As[ty][2] * Bs[2][tx];
+ Csub += As[ty][3] * Bs[3][tx];
+ Csub += As[ty][4] * Bs[4][tx];
+ Csub += As[ty][5] * Bs[5][tx];
+ Csub += As[ty][6] * Bs[6][tx];
+ Csub += As[ty][7] * Bs[7][tx];
+ Csub += As[ty][8] * Bs[8][tx];
+ Csub += As[ty][9] * Bs[9][tx];
+ Csub += As[ty][10] * Bs[10][tx];
+ Csub += As[ty][11] * Bs[11][tx];
+ Csub += As[ty][12] * Bs[12][tx];
+ Csub += As[ty][13] * Bs[13][tx];
+ Csub += As[ty][14] * Bs[14][tx];
+ Csub += As[ty][15] * Bs[15][tx];
+
+ mCount++;
+
+ //fmod every 1024 iterations
+ if(mCount == 64){
+ Csub = fmod(Csub, mod);
+ mCount = 0;
+ }
+
+ //Synchronize threads
+ barrier(CLK_LOCAL_MEM_FENCE);
+ }
+ //Calls fmod once to normalize the sum
+ Csub = fmod(Csub, mod);
+
+ //Calculates the offset in the result matrix and add the sum to the
+ //appropriate spot
+ int c = widthB * BLOCK_SIZE * by + BLOCK_SIZE * bx;
+ C[c + ty * widthB + tx] = Csub;
+}
diff --git a/linbox/algorithms/opencl-kernels/kernel-partial-1024-sp.cl b/linbox/algorithms/opencl-kernels/kernel-partial-1024-sp.cl
new file mode 100644
index 0000000..421a5bf
--- /dev/null
+++ b/linbox/algorithms/opencl-kernels/kernel-partial-1024-sp.cl
@@ -0,0 +1,72 @@
+/*
+ * kernel_partial_1024_sp.cl
+ *
+ * Created on: Jul 13, 2011
+ * Author: Matthew Wezowicz
+ */
+
+#define BLOCK_SIZE 16
+
+__kernel void matrixMulKernelModular1024SP(__global float* C, __global float* A, __global float* B,
+ const int widthA, const int widthB, const float mod){
+ //Get Workgroup ID
+ int bx = get_group_id(0);
+ int by = get_group_id(1);
+
+ //Get Local ID
+ int tx = get_local_id(0);
+ int ty = get_local_id(1);
+
+ //Range of indecies for sub-matrix of A
+ int aBegin = widthA * BLOCK_SIZE * by;
+ int aEnd = aBegin + widthA - 1;
+ int aStep = BLOCK_SIZE;
+
+ //Range of indecies for sub-matrix of B
+ int bBegin = BLOCK_SIZE * bx;
+ int bStep = BLOCK_SIZE * widthB;
+
+ //Local storage of sub-matrices of A and B
+ __local float As[BLOCK_SIZE][BLOCK_SIZE];
+ __local float Bs[BLOCK_SIZE][BLOCK_SIZE];
+
+ //Temporary storage for result
+ float Csub = 0;
+
+ //Counter for modulus every 32 iterations
+ int mCount = 0;
+
+ //Loop over all the sub-matrices of A and B required to compute
+ //the result sub-matrix
+ for(int a = aBegin, b = bBegin; a < aEnd; a += aStep, b += bStep){
+ //Load the matrices from global memory to local memory
+ //Each thread loads one element of each sub-matrix
+ As[ty][tx] = A[a + widthA * ty + tx];
+ Bs[ty][tx] = B[b + widthB * ty + tx];
+
+ //Synchronize threads
+ barrier(CLK_LOCAL_MEM_FENCE);
+
+ //Multiply the two sub-matrices together
+ for(int i = 0; i < BLOCK_SIZE; i++){
+ Csub += As[ty][i] * Bs[i][tx];
+ }
+ mCount++;
+
+ //fmod every 1024 iterations
+ if(mCount == 64){
+ Csub = fmod(Csub, mod);
+ mCount = 0;
+ }
+
+ //Synchronize threads
+ barrier(CLK_LOCAL_MEM_FENCE);
+ }
+ //Calls fmod once to normalize the sum
+ Csub = fmod(Csub, mod);
+
+ //Calculates the offset in the result matrix and add the sum to the
+ //appropriate spot
+ int c = widthB * BLOCK_SIZE * by + BLOCK_SIZE * bx;
+ C[c + ty * widthB + tx] = Csub;
+}
diff --git a/linbox/algorithms/opencl-kernels/kernel-partial-16-sp-unroll.cl b/linbox/algorithms/opencl-kernels/kernel-partial-16-sp-unroll.cl
new file mode 100644
index 0000000..76f7872
--- /dev/null
+++ b/linbox/algorithms/opencl-kernels/kernel-partial-16-sp-unroll.cl
@@ -0,0 +1,74 @@
+/*
+ * kernel_partial_16_sp.cl
+ *
+ * Created on: Jul 5, 2011
+ * Author: Matthew Wezowicz
+ */
+
+#define BLOCK_SIZE 16
+
+__kernel void matrixMulKernelModular16SP(__global float* C, __global float* A, __global float* B,
+ const int widthA, const int widthB, const float mod){
+ //Get Workgroup ID
+ int bx = get_group_id(0);
+ int by = get_group_id(1);
+
+ //Get Local ID
+ int tx = get_local_id(0);
+ int ty = get_local_id(1);
+
+ //Range of indecies for sub-matrix of A
+ int aBegin = widthA * BLOCK_SIZE * by;
+ int aEnd = aBegin + widthA - 1;
+ int aStep = BLOCK_SIZE;
+
+ //Range of indecies for sub-matrix of B
+ int bBegin = BLOCK_SIZE * bx;
+ int bStep = BLOCK_SIZE * widthB;
+
+ //Local storage of sub-matrices of A and B
+ __local float As[BLOCK_SIZE][BLOCK_SIZE];
+ __local float Bs[BLOCK_SIZE][BLOCK_SIZE];
+
+ //Temporary storage for result
+ float Csub = 0;
+
+ //Loop over all the sub-matrices of A and B required to compute
+ //the result sub-matrix
+ for(int a = aBegin, b = bBegin; a < aEnd; a += aStep, b += bStep){
+ //Load the matrices from global memory to local memory
+ //Each thread loads one element of each sub-matrix
+ As[ty][tx] = A[a + widthA * ty + tx];
+ Bs[ty][tx] = B[b + widthB * ty + tx];
+
+ //Synchronize threads
+ barrier(CLK_LOCAL_MEM_FENCE);
+
+ //Multiply the two sub-matrices together
+ Csub += As[ty][0] * Bs[0][tx];
+ Csub += As[ty][1] * Bs[1][tx];
+ Csub += As[ty][2] * Bs[2][tx];
+ Csub += As[ty][3] * Bs[3][tx];
+ Csub += As[ty][4] * Bs[4][tx];
+ Csub += As[ty][5] * Bs[5][tx];
+ Csub += As[ty][6] * Bs[6][tx];
+ Csub += As[ty][7] * Bs[7][tx];
+ Csub += As[ty][8] * Bs[8][tx];
+ Csub += As[ty][9] * Bs[9][tx];
+ Csub += As[ty][10] * Bs[10][tx];
+ Csub += As[ty][11] * Bs[11][tx];
+ Csub += As[ty][12] * Bs[12][tx];
+ Csub += As[ty][13] * Bs[13][tx];
+ Csub += As[ty][14] * Bs[14][tx];
+ Csub += As[ty][15] * Bs[15][tx];
+ Csub = fmod(Csub, mod);
+
+ //Synchronize threads
+ barrier(CLK_LOCAL_MEM_FENCE);
+ }
+
+ //Calculates the offset in the result matrix and add the sum to the
+ //appropriate spot
+ int c = widthB * BLOCK_SIZE * by + BLOCK_SIZE * bx;
+ C[c + ty * widthB + tx] = Csub;
+}
diff --git a/linbox/algorithms/opencl-kernels/kernel-partial-16-sp.cl b/linbox/algorithms/opencl-kernels/kernel-partial-16-sp.cl
new file mode 100644
index 0000000..83ae102
--- /dev/null
+++ b/linbox/algorithms/opencl-kernels/kernel-partial-16-sp.cl
@@ -0,0 +1,61 @@
+/*
+ * kernel_partial_16_sp.cl
+ *
+ * Created on: Jul 5, 2011
+ * Author: Matthew Wezowicz
+ */
+
+#define BLOCK_SIZE 16
+
+__kernel void matrixMulKernelModular16SP(__global float* C, __global float* A, __global float* B,
+ const int widthA, const int widthB, const float mod){
+ //Get Workgroup ID
+ int bx = get_group_id(0);
+ int by = get_group_id(1);
+
+ //Get Local ID
+ int tx = get_local_id(0);
+ int ty = get_local_id(1);
+
+ //Range of indecies for sub-matrix of A
+ int aBegin = widthA * BLOCK_SIZE * by;
+ int aEnd = aBegin + widthA - 1;
+ int aStep = BLOCK_SIZE;
+
+ //Range of indecies for sub-matrix of B
+ int bBegin = BLOCK_SIZE * bx;
+ int bStep = BLOCK_SIZE * widthB;
+
+ //Local storage of sub-matrices of A and B
+ __local float As[BLOCK_SIZE][BLOCK_SIZE];
+ __local float Bs[BLOCK_SIZE][BLOCK_SIZE];
+
+ //Temporary storage for result
+ float Csub = 0;
+
+ //Loop over all the sub-matrices of A and B required to compute
+ //the result sub-matrix
+ for(int a = aBegin, b = bBegin; a < aEnd; a += aStep, b += bStep){
+ //Load the matrices from global memory to local memory
+ //Each thread loads one element of each sub-matrix
+ As[ty][tx] = A[a + widthA * ty + tx];
+ Bs[ty][tx] = B[b + widthB * ty + tx];
+
+ //Synchronize threads
+ barrier(CLK_LOCAL_MEM_FENCE);
+
+ //Multiply the two sub-matrices together
+ for(int i = 0; i < BLOCK_SIZE; i++){
+ Csub += As[ty][i] * Bs[i][tx];
+ }
+ Csub = fmod(Csub, mod);
+
+ //Synchronize threads
+ barrier(CLK_LOCAL_MEM_FENCE);
+ }
+
+ //Calculates the offset in the result matrix and add the sum to the
+ //appropriate spot
+ int c = widthB * BLOCK_SIZE * by + BLOCK_SIZE * bx;
+ C[c + ty * widthB + tx] = Csub;
+}
diff --git a/linbox/algorithms/opencl-kernels/kernel-partial-32-dp-unroll.cl b/linbox/algorithms/opencl-kernels/kernel-partial-32-dp-unroll.cl
new file mode 100644
index 0000000..f968bbd
--- /dev/null
+++ b/linbox/algorithms/opencl-kernels/kernel-partial-32-dp-unroll.cl
@@ -0,0 +1,87 @@
+/*
+ * kernel_partial_32_dp.cl
+ *
+ * Created on: Jul 5, 2011
+ * Author: Matthew Wezowicz
+ */
+
+#define BLOCK_SIZE 16
+#pragma OPENCL EXTENSION cl_khr_fp64 : enable
+
+__kernel void matrixMulKernelModular32DP(__global double* C, __global double* A, __global double* B,
+ const int widthA, const int widthB, const double mod){
+ //Get Workgroup ID
+ int bx = get_group_id(0);
+ int by = get_group_id(1);
+
+ //Get Local ID
+ int tx = get_local_id(0);
+ int ty = get_local_id(1);
+
+ //Range of indecies for sub-matrix of A
+ int aBegin = widthA * BLOCK_SIZE * by;
+ int aEnd = aBegin + widthA - 1;
+ int aStep = BLOCK_SIZE;
+
+ //Range of indecies for sub-matrix of B
+ int bBegin = BLOCK_SIZE * bx;
+ int bStep = BLOCK_SIZE * widthB;
+
+ //Local storage of sub-matrices of A and B
+ __local double As[BLOCK_SIZE][BLOCK_SIZE];
+ __local double Bs[BLOCK_SIZE][BLOCK_SIZE];
+
+ //Temporary storage for result
+ double Csub = 0;
+
+ //Counter for modulus every 32 iterations
+ int mCount = 0;
+
+ //Loop over all the sub-matrices of A and B required to compute
+ //the result sub-matrix
+ for(int a = aBegin, b = bBegin; a < aEnd; a += aStep, b += bStep){
+ //Load the matrices from global memory to local memory
+ //Each thread loads one element of each sub-matrix
+ As[ty][tx] = A[a + widthA * ty + tx];
+ Bs[ty][tx] = B[b + widthB * ty + tx];
+
+ //Synchronize threads
+ barrier(CLK_LOCAL_MEM_FENCE);
+
+ //Multiply the two sub-matrices together
+ Csub += As[ty][0] * Bs[0][tx];
+ Csub += As[ty][1] * Bs[1][tx];
+ Csub += As[ty][2] * Bs[2][tx];
+ Csub += As[ty][3] * Bs[3][tx];
+ Csub += As[ty][4] * Bs[4][tx];
+ Csub += As[ty][5] * Bs[5][tx];
+ Csub += As[ty][6] * Bs[6][tx];
+ Csub += As[ty][7] * Bs[7][tx];
+ Csub += As[ty][8] * Bs[8][tx];
+ Csub += As[ty][9] * Bs[9][tx];
+ Csub += As[ty][10] * Bs[10][tx];
+ Csub += As[ty][11] * Bs[11][tx];
+ Csub += As[ty][12] * Bs[12][tx];
+ Csub += As[ty][13] * Bs[13][tx];
+ Csub += As[ty][14] * Bs[14][tx];
+ Csub += As[ty][15] * Bs[15][tx];
+
+ mCount++;
+
+ //fmod every 32 iterations
+ if(mCount == 2){
+ Csub = fmod(Csub, mod);
+ mCount = 0;
+ }
+
+ //Synchronize threads
+ barrier(CLK_LOCAL_MEM_FENCE);
+ }
+ //Calls fmod once to normalize the sum
+ Csub = fmod(Csub, mod);
+
+ //Calculates the offset in the result matrix and add the sum to the
+ //appropriate spot
+ int c = widthB * BLOCK_SIZE * by + BLOCK_SIZE * bx;
+ C[c + ty * widthB + tx] = Csub;
+}
diff --git a/linbox/algorithms/opencl-kernels/kernel-partial-32-dp.cl b/linbox/algorithms/opencl-kernels/kernel-partial-32-dp.cl
new file mode 100644
index 0000000..edbfc0d
--- /dev/null
+++ b/linbox/algorithms/opencl-kernels/kernel-partial-32-dp.cl
@@ -0,0 +1,73 @@
+/*
+ * kernel_partial_32_dp.cl
+ *
+ * Created on: Jul 5, 2011
+ * Author: Matthew Wezowicz
+ */
+
+#define BLOCK_SIZE 16
+#pragma OPENCL EXTENSION cl_khr_fp64 : enable
+
+__kernel void matrixMulKernelModular32DP(__global double* C, __global double* A, __global double* B,
+ const int widthA, const int widthB, const double mod){
+ //Get Workgroup ID
+ int bx = get_group_id(0);
+ int by = get_group_id(1);
+
+ //Get Local ID
+ int tx = get_local_id(0);
+ int ty = get_local_id(1);
+
+ //Range of indecies for sub-matrix of A
+ int aBegin = widthA * BLOCK_SIZE * by;
+ int aEnd = aBegin + widthA - 1;
+ int aStep = BLOCK_SIZE;
+
+ //Range of indecies for sub-matrix of B
+ int bBegin = BLOCK_SIZE * bx;
+ int bStep = BLOCK_SIZE * widthB;
+
+ //Local storage of sub-matrices of A and B
+ __local double As[BLOCK_SIZE][BLOCK_SIZE];
+ __local double Bs[BLOCK_SIZE][BLOCK_SIZE];
+
+ //Temporary storage for result
+ double Csub = 0;
+
+ //Counter for modulus every 32 iterations
+ int mCount = 0;
+
+ //Loop over all the sub-matrices of A and B required to compute
+ //the result sub-matrix
+ for(int a = aBegin, b = bBegin; a < aEnd; a += aStep, b += bStep){
+ //Load the matrices from global memory to local memory
+ //Each thread loads one element of each sub-matrix
+ As[ty][tx] = A[a + widthA * ty + tx];
+ Bs[ty][tx] = B[b + widthB * ty + tx];
+
+ //Synchronize threads
+ barrier(CLK_LOCAL_MEM_FENCE);
+
+ //Multiply the two sub-matrices together
+ for(int i = 0; i < BLOCK_SIZE; i++){
+ Csub += As[ty][i] * Bs[i][tx];
+ }
+ mCount++;
+
+ //fmod every 32 iterations
+ if(mCount == 2){
+ Csub = fmod(Csub, mod);
+ mCount = 0;
+ }
+
+ //Synchronize threads
+ barrier(CLK_LOCAL_MEM_FENCE);
+ }
+ //Calls fmod once to normalize the sum
+ Csub = fmod(Csub, mod);
+
+ //Calculates the offset in the result matrix and add the sum to the
+ //appropriate spot
+ int c = widthB * BLOCK_SIZE * by + BLOCK_SIZE * bx;
+ C[c + ty * widthB + tx] = Csub;
+}
diff --git a/linbox/algorithms/opencl-kernels/kernel-partial-32-sp-unroll.cl b/linbox/algorithms/opencl-kernels/kernel-partial-32-sp-unroll.cl
new file mode 100644
index 0000000..c598c0e
--- /dev/null
+++ b/linbox/algorithms/opencl-kernels/kernel-partial-32-sp-unroll.cl
@@ -0,0 +1,86 @@
+/*
+ * kernel_partial_32_sp.cl
+ *
+ * Created on: Jul 5, 2011
+ * Author: Matthew Wezowicz
+ */
+
+#define BLOCK_SIZE 16
+
+__kernel void matrixMulKernelModular32SP(__global float* C, __global float* A, __global float* B,
+ const int widthA, const int widthB, const float mod){
+ //Get Workgroup ID
+ int bx = get_group_id(0);
+ int by = get_group_id(1);
+
+ //Get Local ID
+ int tx = get_local_id(0);
+ int ty = get_local_id(1);
+
+ //Range of indecies for sub-matrix of A
+ int aBegin = widthA * BLOCK_SIZE * by;
+ int aEnd = aBegin + widthA - 1;
+ int aStep = BLOCK_SIZE;
+
+ //Range of indecies for sub-matrix of B
+ int bBegin = BLOCK_SIZE * bx;
+ int bStep = BLOCK_SIZE * widthB;
+
+ //Local storage of sub-matrices of A and B
+ __local float As[BLOCK_SIZE][BLOCK_SIZE];
+ __local float Bs[BLOCK_SIZE][BLOCK_SIZE];
+
+ //Temporary storage for result
+ float Csub = 0;
+
+ //Counter for modulus every 32 iterations
+ int mCount = 0;
+
+ //Loop over all the sub-matrices of A and B required to compute
+ //the result sub-matrix
+ for(int a = aBegin, b = bBegin; a < aEnd; a += aStep, b += bStep){
+ //Load the matrices from global memory to local memory
+ //Each thread loads one element of each sub-matrix
+ As[ty][tx] = A[a + widthA * ty + tx];
+ Bs[ty][tx] = B[b + widthB * ty + tx];
+
+ //Synchronize threads
+ barrier(CLK_LOCAL_MEM_FENCE);
+
+ //Multiply the two sub-matrices together
+ Csub += As[ty][0] * Bs[0][tx];
+ Csub += As[ty][1] * Bs[1][tx];
+ Csub += As[ty][2] * Bs[2][tx];
+ Csub += As[ty][3] * Bs[3][tx];
+ Csub += As[ty][4] * Bs[4][tx];
+ Csub += As[ty][5] * Bs[5][tx];
+ Csub += As[ty][6] * Bs[6][tx];
+ Csub += As[ty][7] * Bs[7][tx];
+ Csub += As[ty][8] * Bs[8][tx];
+ Csub += As[ty][9] * Bs[9][tx];
+ Csub += As[ty][10] * Bs[10][tx];
+ Csub += As[ty][11] * Bs[11][tx];
+ Csub += As[ty][12] * Bs[12][tx];
+ Csub += As[ty][13] * Bs[13][tx];
+ Csub += As[ty][14] * Bs[14][tx];
+ Csub += As[ty][15] * Bs[15][tx];
+
+ mCount++;
+
+ //fmod every 32 iterations
+ if(mCount == 2){
+ Csub = fmod(Csub, mod);
+ mCount = 0;
+ }
+
+ //Synchronize threads
+ barrier(CLK_LOCAL_MEM_FENCE);
+ }
+ //Calls fmod once to normalize the sum
+ Csub = fmod(Csub, mod);
+
+ //Calculates the offset in the result matrix and add the sum to the
+ //appropriate spot
+ int c = widthB * BLOCK_SIZE * by + BLOCK_SIZE * bx;
+ C[c + ty * widthB + tx] = Csub;
+}
diff --git a/linbox/algorithms/opencl-kernels/kernel-partial-32-sp.cl b/linbox/algorithms/opencl-kernels/kernel-partial-32-sp.cl
new file mode 100644
index 0000000..111cfaf
--- /dev/null
+++ b/linbox/algorithms/opencl-kernels/kernel-partial-32-sp.cl
@@ -0,0 +1,72 @@
+/*
+ * kernel_partial_32_sp.cl
+ *
+ * Created on: Jul 5, 2011
+ * Author: Matthew Wezowicz
+ */
+
+#define BLOCK_SIZE 16
+
+__kernel void matrixMulKernelModular32SP(__global float* C, __global float* A, __global float* B,
+ const int widthA, const int widthB, const float mod){
+ //Get Workgroup ID
+ int bx = get_group_id(0);
+ int by = get_group_id(1);
+
+ //Get Local ID
+ int tx = get_local_id(0);
+ int ty = get_local_id(1);
+
+ //Range of indecies for sub-matrix of A
+ int aBegin = widthA * BLOCK_SIZE * by;
+ int aEnd = aBegin + widthA - 1;
+ int aStep = BLOCK_SIZE;
+
+ //Range of indecies for sub-matrix of B
+ int bBegin = BLOCK_SIZE * bx;
+ int bStep = BLOCK_SIZE * widthB;
+
+ //Local storage of sub-matrices of A and B
+ __local float As[BLOCK_SIZE][BLOCK_SIZE];
+ __local float Bs[BLOCK_SIZE][BLOCK_SIZE];
+
+ //Temporary storage for result
+ float Csub = 0;
+
+ //Counter for modulus every 32 iterations
+ int mCount = 0;
+
+ //Loop over all the sub-matrices of A and B required to compute
+ //the result sub-matrix
+ for(int a = aBegin, b = bBegin; a < aEnd; a += aStep, b += bStep){
+ //Load the matrices from global memory to local memory
+ //Each thread loads one element of each sub-matrix
+ As[ty][tx] = A[a + widthA * ty + tx];
+ Bs[ty][tx] = B[b + widthB * ty + tx];
+
+ //Synchronize threads
+ barrier(CLK_LOCAL_MEM_FENCE);
+
+ //Multiply the two sub-matrices together
+ for(int i = 0; i < BLOCK_SIZE; i++){
+ Csub += As[ty][i] * Bs[i][tx];
+ }
+ mCount++;
+
+ //fmod every 32 iterations
+ if(mCount == 2){
+ Csub = fmod(Csub, mod);
+ mCount = 0;
+ }
+
+ //Synchronize threads
+ barrier(CLK_LOCAL_MEM_FENCE);
+ }
+ //Calls fmod once to normalize the sum
+ Csub = fmod(Csub, mod);
+
+ //Calculates the offset in the result matrix and add the sum to the
+ //appropriate spot
+ int c = widthB * BLOCK_SIZE * by + BLOCK_SIZE * bx;
+ C[c + ty * widthB + tx] = Csub;
+}
diff --git a/linbox/algorithms/opencl-kernels/kernel-partial-8-dp-unroll.cl b/linbox/algorithms/opencl-kernels/kernel-partial-8-dp-unroll.cl
new file mode 100644
index 0000000..4cd3eb7
--- /dev/null
+++ b/linbox/algorithms/opencl-kernels/kernel-partial-8-dp-unroll.cl
@@ -0,0 +1,77 @@
+/*
+ * kernel_partial_8_dp.cl
+ *
+ * Created on: Jul 5, 2011
+ * Author: Matthew Wezowicz
+ */
+
+#define BLOCK_SIZE 16
+#pragma OPENCL EXTENSION cl_khr_fp64 : enable
+
+__kernel void matrixMulKernelModular8DP(__global double* C, __global double* A, __global double* B,
+ const int widthA, const int widthB, const double mod){
+ //Get Workgroup ID
+ int bx = get_group_id(0);
+ int by = get_group_id(1);
+
+ //Get Local ID
+ int tx = get_local_id(0);
+ int ty = get_local_id(1);
+
+ //Range of indecies for sub-matrix of A
+ int aBegin = widthA * BLOCK_SIZE * by;
+ int aEnd = aBegin + widthA - 1;
+ int aStep = BLOCK_SIZE;
+
+ //Range of indecies for sub-matrix of B
+ int bBegin = BLOCK_SIZE * bx;
+ int bStep = BLOCK_SIZE * widthB;
+
+ //Local storage of sub-matrices of A and B
+ __local double As[BLOCK_SIZE][BLOCK_SIZE];
+ __local double Bs[BLOCK_SIZE][BLOCK_SIZE];
+
+ //Temporary storage for result
+ double Csub = 0;
+
+ //Loop over all the sub-matrices of A and B required to compute
+ //the result sub-matrix
+ for(int a = aBegin, b = bBegin; a < aEnd; a += aStep, b += bStep){
+ //Load the matrices from global memory to local memory
+ //Each thread loads one element of each sub-matrix
+ As[ty][tx] = A[a + widthA * ty + tx];
+ Bs[ty][tx] = B[b + widthB * ty + tx];
+
+ //Synchronize threads
+ barrier(CLK_LOCAL_MEM_FENCE);
+
+ //Multiply the two sub-matrices together
+ Csub += As[ty][0] * Bs[0][tx];
+ Csub += As[ty][1] * Bs[1][tx];
+ Csub += As[ty][2] * Bs[2][tx];
+ Csub += As[ty][3] * Bs[3][tx];
+ Csub += As[ty][4] * Bs[4][tx];
+ Csub += As[ty][5] * Bs[5][tx];
+ Csub += As[ty][6] * Bs[6][tx];
+ Csub += As[ty][7] * Bs[7][tx];
+ Csub = fmod(Csub, mod);
+
+ Csub += As[ty][8] * Bs[8][tx];
+ Csub += As[ty][9] * Bs[9][tx];
+ Csub += As[ty][10] * Bs[10][tx];
+ Csub += As[ty][11] * Bs[11][tx];
+ Csub += As[ty][12] * Bs[12][tx];
+ Csub += As[ty][13] * Bs[13][tx];
+ Csub += As[ty][14] * Bs[14][tx];
+ Csub += As[ty][15] * Bs[15][tx];
+ Csub = fmod(Csub, mod);
+
+ //Synchronize threads
+ barrier(CLK_LOCAL_MEM_FENCE);
+ }
+
+ //Calculates the offset in the result matrix and add the sum to the
+ //appropriate spot
+ int c = widthB * BLOCK_SIZE * by + BLOCK_SIZE * bx;
+ C[c + ty * widthB + tx] = Csub;
+}
diff --git a/linbox/algorithms/opencl-kernels/kernel-partial-8-dp.cl b/linbox/algorithms/opencl-kernels/kernel-partial-8-dp.cl
new file mode 100644
index 0000000..d0ad449
--- /dev/null
+++ b/linbox/algorithms/opencl-kernels/kernel-partial-8-dp.cl
@@ -0,0 +1,67 @@
+/*
+ * kernel_partial_8_dp.cl
+ *
+ * Created on: Jul 5, 2011
+ * Author: Matthew Wezowicz
+ */
+
+#define BLOCK_SIZE 16
+#pragma OPENCL EXTENSION cl_khr_fp64 : enable
+
+__kernel void matrixMulKernelModular8DP(__global double* C, __global double* A, __global double* B,
+ const int widthA, const int widthB, const double mod){
+ //Get Workgroup ID
+ int bx = get_group_id(0);
+ int by = get_group_id(1);
+
+ //Get Local ID
+ int tx = get_local_id(0);
+ int ty = get_local_id(1);
+
+ //Range of indecies for sub-matrix of A
+ int aBegin = widthA * BLOCK_SIZE * by;
+ int aEnd = aBegin + widthA - 1;
+ int aStep = BLOCK_SIZE;
+
+ //Range of indecies for sub-matrix of B
+ int bBegin = BLOCK_SIZE * bx;
+ int bStep = BLOCK_SIZE * widthB;
+
+ //Local storage of sub-matrices of A and B
+ __local double As[BLOCK_SIZE][BLOCK_SIZE];
+ __local double Bs[BLOCK_SIZE][BLOCK_SIZE];
+
+ //Temporary storage for result
+ double Csub = 0;
+
+ //Loop over all the sub-matrices of A and B required to compute
+ //the result sub-matrix
+ for(int a = aBegin, b = bBegin; a < aEnd; a += aStep, b += bStep){
+ //Load the matrices from global memory to local memory
+ //Each thread loads one element of each sub-matrix
+ As[ty][tx] = A[a + widthA * ty + tx];
+ Bs[ty][tx] = B[b + widthB * ty + tx];
+
+ //Synchronize threads
+ barrier(CLK_LOCAL_MEM_FENCE);
+
+ //Multiply the two sub-matrices together
+ for(int i = 0; i < BLOCK_SIZE / 2; i++){
+ Csub += As[ty][i] * Bs[i][tx];
+ }
+ Csub = fmod(Csub, mod);
+
+ for(int i = BLOCK_SIZE / 2; i < BLOCK_SIZE; i++){
+ Csub += As[ty][i] * Bs[i][tx];
+ }
+ Csub = fmod(Csub, mod);
+
+ //Synchronize threads
+ barrier(CLK_LOCAL_MEM_FENCE);
+ }
+
+ //Calculates the offset in the result matrix and add the sum to the
+ //appropriate spot
+ int c = widthB * BLOCK_SIZE * by + BLOCK_SIZE * bx;
+ C[c + ty * widthB + tx] = Csub;
+}
diff --git a/linbox/algorithms/opencl-kernels/opencl-domain-kernels.inl b/linbox/algorithms/opencl-kernels/opencl-domain-kernels.inl
new file mode 100644
index 0000000..cdae0c3
--- /dev/null
+++ b/linbox/algorithms/opencl-kernels/opencl-domain-kernels.inl
@@ -0,0 +1,2276 @@
+/* linbox/algorithms/opencl-domain.h
+ * Copyright (C) 2012 Matthew Wezowicz
+ *
+ * Written by Matthew Wezowicz <mwezz at udel.edu>
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ * ========LICENCE========
+ *.
+ */
+
+ /*###--- Generated On ---###*/
+ /*###--- 07/24/2012 11:29:38 ---###*/
+
+#ifndef __LINBOX_opencl_matrix_domain_kernels_INL
+#define __LINBOX_opencl_matrix_domain_kernels_INL
+
+namespace LinBox{
+
+ const char* matrixMulKernelModular1DP = {
+ "#define BLOCK_SIZE 16\n"
+ "#pragma OPENCL EXTENSION cl_khr_fp64 : enable\n"
+ "__kernel void matrixMulKernelModular1DP(__global double* C, __global double* A, __global double* B,\n"
+ " const int widthA, const int widthB, const double mod){\n"
+ " int bx = get_group_id(0);\n"
+ " int by = get_group_id(1);\n"
+ " int tx = get_local_id(0);\n"
+ " int ty = get_local_id(1);\n"
+ " int aBegin = widthA * BLOCK_SIZE * by;\n"
+ " int aEnd = aBegin + widthA - 1;\n"
+ " int aStep = BLOCK_SIZE;\n"
+ " int bBegin = BLOCK_SIZE * bx;\n"
+ " int bStep = BLOCK_SIZE * widthB;\n"
+ " __local double As[BLOCK_SIZE][BLOCK_SIZE];\n"
+ " __local double Bs[BLOCK_SIZE][BLOCK_SIZE];\n"
+ " double Csub = 0;\n"
+ " for(int a = aBegin, b = bBegin; a < aEnd; a += aStep, b += bStep){\n"
+ " As[ty][tx] = A[a + widthA * ty + tx];\n"
+ " Bs[ty][tx] = B[b + widthB * ty + tx];\n"
+ " barrier(CLK_LOCAL_MEM_FENCE);\n"
+ " Csub += As[ty][0] * Bs[0][tx];\n"
+ " Csub = fmod(Csub, mod);\n"
+ " Csub += As[ty][1] * Bs[1][tx];\n"
+ " Csub = fmod(Csub, mod);\n"
+ " Csub += As[ty][2] * Bs[2][tx];\n"
+ " Csub = fmod(Csub, mod);\n"
+ " Csub += As[ty][3] * Bs[3][tx];\n"
+ " Csub = fmod(Csub, mod);\n"
+ " Csub += As[ty][4] * Bs[4][tx];\n"
+ " Csub = fmod(Csub, mod);\n"
+ " Csub += As[ty][5] * Bs[5][tx];\n"
+ " Csub = fmod(Csub, mod);\n"
+ " Csub += As[ty][6] * Bs[6][tx];\n"
+ " Csub = fmod(Csub, mod);\n"
+ " Csub += As[ty][7] * Bs[7][tx];\n"
+ " Csub = fmod(Csub, mod);\n"
+ " Csub += As[ty][8] * Bs[8][tx];\n"
+ " Csub = fmod(Csub, mod);\n"
+ " Csub += As[ty][9] * Bs[9][tx];\n"
+ " Csub = fmod(Csub, mod);\n"
+ " Csub += As[ty][10] * Bs[10][tx];\n"
+ " Csub = fmod(Csub, mod);\n"
+ " Csub += As[ty][11] * Bs[11][tx];\n"
+ " Csub = fmod(Csub, mod);\n"
+ " Csub += As[ty][12] * Bs[12][tx];\n"
+ " Csub = fmod(Csub, mod);\n"
+ " Csub += As[ty][13] * Bs[13][tx];\n"
+ " Csub = fmod(Csub, mod);\n"
+ " Csub += As[ty][14] * Bs[14][tx];\n"
+ " Csub = fmod(Csub, mod);\n"
+ " Csub += As[ty][15] * Bs[15][tx];\n"
+ " Csub = fmod(Csub, mod);\n"
+ " barrier(CLK_LOCAL_MEM_FENCE);\n"
+ " }\n"
+ " int c = widthB * BLOCK_SIZE * by + BLOCK_SIZE * bx;\n"
+ " C[c + ty * widthB + tx] = Csub;\n"
+ "}\n"
+ };
+
+ const char* matrixMulKernelModular1SP = {
+ "#define BLOCK_SIZE 16\n"
+ "__kernel void matrixMulKernelModular1SP(__global float* C, __global float* A, __global float* B,\n"
+ " const int widthA, const int widthB, const float mod){\n"
+ " int bx = get_group_id(0);\n"
+ " int by = get_group_id(1);\n"
+ " int tx = get_local_id(0);\n"
+ " int ty = get_local_id(1);\n"
+ " int aBegin = widthA * BLOCK_SIZE * by;\n"
+ " int aEnd = aBegin + widthA - 1;\n"
+ " int aStep = BLOCK_SIZE;\n"
+ " int bBegin = BLOCK_SIZE * bx;\n"
+ " int bStep = BLOCK_SIZE * widthB;\n"
+ " __local float As[BLOCK_SIZE][BLOCK_SIZE];\n"
+ " __local float Bs[BLOCK_SIZE][BLOCK_SIZE];\n"
+ " float Csub = 0;\n"
+ " for(int a = aBegin, b = bBegin; a < aEnd; a += aStep, b += bStep){\n"
+ " As[ty][tx] = A[a + widthA * ty + tx];\n"
+ " Bs[ty][tx] = B[b + widthB * ty + tx];\n"
+ " barrier(CLK_LOCAL_MEM_FENCE);\n"
+ " Csub += As[ty][0] * Bs[0][tx];\n"
+ " Csub = fmod(Csub, mod);\n"
+ " Csub += As[ty][1] * Bs[1][tx];\n"
+ " Csub = fmod(Csub, mod);\n"
+ " Csub += As[ty][2] * Bs[2][tx];\n"
+ " Csub = fmod(Csub, mod);\n"
+ " Csub += As[ty][3] * Bs[3][tx];\n"
+ " Csub = fmod(Csub, mod);\n"
+ " Csub += As[ty][4] * Bs[4][tx];\n"
+ " Csub = fmod(Csub, mod);\n"
+ " Csub += As[ty][5] * Bs[5][tx];\n"
+ " Csub = fmod(Csub, mod);\n"
+ " Csub += As[ty][6] * Bs[6][tx];\n"
+ " Csub = fmod(Csub, mod);\n"
+ " Csub += As[ty][7] * Bs[7][tx];\n"
+ " Csub = fmod(Csub, mod);\n"
+ " Csub += As[ty][8] * Bs[8][tx];\n"
+ " Csub = fmod(Csub, mod);\n"
+ " Csub += As[ty][9] * Bs[9][tx];\n"
+ " Csub = fmod(Csub, mod);\n"
+ " Csub += As[ty][10] * Bs[10][tx];\n"
+ " Csub = fmod(Csub, mod);\n"
+ " Csub += As[ty][11] * Bs[11][tx];\n"
+ " Csub = fmod(Csub, mod);\n"
+ " Csub += As[ty][12] * Bs[12][tx];\n"
+ " Csub = fmod(Csub, mod);\n"
+ " Csub += As[ty][13] * Bs[13][tx];\n"
+ " Csub = fmod(Csub, mod);\n"
+ " Csub += As[ty][14] * Bs[14][tx];\n"
+ " Csub = fmod(Csub, mod);\n"
+ " Csub += As[ty][15] * Bs[15][tx];\n"
+ " Csub = fmod(Csub, mod);\n"
+ " barrier(CLK_LOCAL_MEM_FENCE);\n"
+ " }\n"
+ " int c = widthB * BLOCK_SIZE * by + BLOCK_SIZE * bx;\n"
+ " C[c + ty * widthB + tx] = Csub;\n"
+ "}\n"
+ };
+
+ const char* matrixMulKernelModular8DP = {
+ "#define BLOCK_SIZE 16\n"
+ "#pragma OPENCL EXTENSION cl_khr_fp64 : enable\n"
+ "__kernel void matrixMulKernelModular8DP(__global double* C, __global double* A, __global double* B,\n"
+ " const int widthA, const int widthB, const double mod){\n"
+ " int bx = get_group_id(0);\n"
+ " int by = get_group_id(1);\n"
+ " int tx = get_local_id(0);\n"
+ " int ty = get_local_id(1);\n"
+ " int aBegin = widthA * BLOCK_SIZE * by;\n"
+ " int aEnd = aBegin + widthA - 1;\n"
+ " int aStep = BLOCK_SIZE;\n"
+ " int bBegin = BLOCK_SIZE * bx;\n"
+ " int bStep = BLOCK_SIZE * widthB;\n"
+ " __local double As[BLOCK_SIZE][BLOCK_SIZE];\n"
+ " __local double Bs[BLOCK_SIZE][BLOCK_SIZE];\n"
+ " double Csub = 0;\n"
+ " for(int a = aBegin, b = bBegin; a < aEnd; a += aStep, b += bStep){\n"
+ " As[ty][tx] = A[a + widthA * ty + tx];\n"
+ " Bs[ty][tx] = B[b + widthB * ty + tx];\n"
+ " barrier(CLK_LOCAL_MEM_FENCE);\n"
+ " Csub += As[ty][0] * Bs[0][tx];\n"
+ " Csub += As[ty][1] * Bs[1][tx];\n"
+ " Csub += As[ty][2] * Bs[2][tx];\n"
+ " Csub += As[ty][3] * Bs[3][tx];\n"
+ " Csub += As[ty][4] * Bs[4][tx];\n"
+ " Csub += As[ty][5] * Bs[5][tx];\n"
+ " Csub += As[ty][6] * Bs[6][tx];\n"
+ " Csub += As[ty][7] * Bs[7][tx];\n"
+ " Csub = fmod(Csub, mod);\n"
+ " Csub += As[ty][8] * Bs[8][tx];\n"
+ " Csub += As[ty][9] * Bs[9][tx];\n"
+ " Csub += As[ty][10] * Bs[10][tx];\n"
+ " Csub += As[ty][11] * Bs[11][tx];\n"
+ " Csub += As[ty][12] * Bs[12][tx];\n"
+ " Csub += As[ty][13] * Bs[13][tx];\n"
+ " Csub += As[ty][14] * Bs[14][tx];\n"
+ " Csub += As[ty][15] * Bs[15][tx];\n"
+ " Csub = fmod(Csub, mod);\n"
+ " barrier(CLK_LOCAL_MEM_FENCE);\n"
+ " }\n"
+ " int c = widthB * BLOCK_SIZE * by + BLOCK_SIZE * bx;\n"
+ " C[c + ty * widthB + tx] = Csub;\n"
+ "}\n"
+ };
+
+ const char* matrixMulKernelModular16SP = {
+ "#define BLOCK_SIZE 16\n"
+ "__kernel void matrixMulKernelModular16SP(__global float* C, __global float* A, __global float* B,\n"
+ " const int widthA, const int widthB, const float mod){\n"
+ " int bx = get_group_id(0);\n"
+ " int by = get_group_id(1);\n"
+ " int tx = get_local_id(0);\n"
+ " int ty = get_local_id(1);\n"
+ " int aBegin = widthA * BLOCK_SIZE * by;\n"
+ " int aEnd = aBegin + widthA - 1;\n"
+ " int aStep = BLOCK_SIZE;\n"
+ " int bBegin = BLOCK_SIZE * bx;\n"
+ " int bStep = BLOCK_SIZE * widthB;\n"
+ " __local float As[BLOCK_SIZE][BLOCK_SIZE];\n"
+ " __local float Bs[BLOCK_SIZE][BLOCK_SIZE];\n"
+ " float Csub = 0;\n"
+ " for(int a = aBegin, b = bBegin; a < aEnd; a += aStep, b += bStep){\n"
+ " As[ty][tx] = A[a + widthA * ty + tx];\n"
+ " Bs[ty][tx] = B[b + widthB * ty + tx];\n"
+ " barrier(CLK_LOCAL_MEM_FENCE);\n"
+ " Csub += As[ty][0] * Bs[0][tx];\n"
+ " Csub += As[ty][1] * Bs[1][tx];\n"
+ " Csub += As[ty][2] * Bs[2][tx];\n"
+ " Csub += As[ty][3] * Bs[3][tx];\n"
+ " Csub += As[ty][4] * Bs[4][tx];\n"
+ " Csub += As[ty][5] * Bs[5][tx];\n"
+ " Csub += As[ty][6] * Bs[6][tx];\n"
+ " Csub += As[ty][7] * Bs[7][tx];\n"
+ " Csub += As[ty][8] * Bs[8][tx];\n"
+ " Csub += As[ty][9] * Bs[9][tx];\n"
+ " Csub += As[ty][10] * Bs[10][tx];\n"
+ " Csub += As[ty][11] * Bs[11][tx];\n"
+ " Csub += As[ty][12] * Bs[12][tx];\n"
+ " Csub += As[ty][13] * Bs[13][tx];\n"
+ " Csub += As[ty][14] * Bs[14][tx];\n"
+ " Csub += As[ty][15] * Bs[15][tx];\n"
+ " Csub = fmod(Csub, mod);\n"
+ " barrier(CLK_LOCAL_MEM_FENCE);\n"
+ " }\n"
+ " int c = widthB * BLOCK_SIZE * by + BLOCK_SIZE * bx;\n"
+ " C[c + ty * widthB + tx] = Csub;\n"
+ "}\n"
+ };
+
+ const char* matrixMulKernelModular32DP = {
+ "#define BLOCK_SIZE 16\n"
+ "#pragma OPENCL EXTENSION cl_khr_fp64 : enable\n"
+ "__kernel void matrixMulKernelModular32DP(__global double* C, __global double* A, __global double* B,\n"
+ " const int widthA, const int widthB, const double mod){\n"
+ " int bx = get_group_id(0);\n"
+ " int by = get_group_id(1);\n"
+ " int tx = get_local_id(0);\n"
+ " int ty = get_local_id(1);\n"
+ " int aBegin = widthA * BLOCK_SIZE * by;\n"
+ " int aEnd = aBegin + widthA - 1;\n"
+ " int aStep = BLOCK_SIZE;\n"
+ " int bBegin = BLOCK_SIZE * bx;\n"
+ " int bStep = BLOCK_SIZE * widthB;\n"
+ " __local double As[BLOCK_SIZE][BLOCK_SIZE];\n"
+ " __local double Bs[BLOCK_SIZE][BLOCK_SIZE];\n"
+ " double Csub = 0;\n"
+ " int mCount = 0;\n"
+ " for(int a = aBegin, b = bBegin; a < aEnd; a += aStep, b += bStep){\n"
+ " As[ty][tx] = A[a + widthA * ty + tx];\n"
+ " Bs[ty][tx] = B[b + widthB * ty + tx];\n"
+ " barrier(CLK_LOCAL_MEM_FENCE);\n"
+ " Csub += As[ty][0] * Bs[0][tx];\n"
+ " Csub += As[ty][1] * Bs[1][tx];\n"
+ " Csub += As[ty][2] * Bs[2][tx];\n"
+ " Csub += As[ty][3] * Bs[3][tx];\n"
+ " Csub += As[ty][4] * Bs[4][tx];\n"
+ " Csub += As[ty][5] * Bs[5][tx];\n"
+ " Csub += As[ty][6] * Bs[6][tx];\n"
+ " Csub += As[ty][7] * Bs[7][tx];\n"
+ " Csub += As[ty][8] * Bs[8][tx];\n"
+ " Csub += As[ty][9] * Bs[9][tx];\n"
+ " Csub += As[ty][10] * Bs[10][tx];\n"
+ " Csub += As[ty][11] * Bs[11][tx];\n"
+ " Csub += As[ty][12] * Bs[12][tx];\n"
+ " Csub += As[ty][13] * Bs[13][tx];\n"
+ " Csub += As[ty][14] * Bs[14][tx];\n"
+ " Csub += As[ty][15] * Bs[15][tx];\n"
+ " mCount++;\n"
+ " if(mCount == 2){\n"
+ " Csub = fmod(Csub, mod);\n"
+ " mCount = 0;\n"
+ " }\n"
+ " barrier(CLK_LOCAL_MEM_FENCE);\n"
+ " }\n"
+ " Csub = fmod(Csub, mod);\n"
+ " int c = widthB * BLOCK_SIZE * by + BLOCK_SIZE * bx;\n"
+ " C[c + ty * widthB + tx] = Csub;\n"
+ "}\n"
+ };
+
+ const char* matrixMulKernelModular32SP = {
+ "#define BLOCK_SIZE 16\n"
+ "__kernel void matrixMulKernelModular32SP(__global float* C, __global float* A, __global float* B,\n"
+ " const int widthA, const int widthB, const float mod){\n"
+ " int bx = get_group_id(0);\n"
+ " int by = get_group_id(1);\n"
+ " int tx = get_local_id(0);\n"
+ " int ty = get_local_id(1);\n"
+ " int aBegin = widthA * BLOCK_SIZE * by;\n"
+ " int aEnd = aBegin + widthA - 1;\n"
+ " int aStep = BLOCK_SIZE;\n"
+ " int bBegin = BLOCK_SIZE * bx;\n"
+ " int bStep = BLOCK_SIZE * widthB;\n"
+ " __local float As[BLOCK_SIZE][BLOCK_SIZE];\n"
+ " __local float Bs[BLOCK_SIZE][BLOCK_SIZE];\n"
+ " float Csub = 0;\n"
+ " int mCount = 0;\n"
+ " for(int a = aBegin, b = bBegin; a < aEnd; a += aStep, b += bStep){\n"
+ " As[ty][tx] = A[a + widthA * ty + tx];\n"
+ " Bs[ty][tx] = B[b + widthB * ty + tx];\n"
+ " barrier(CLK_LOCAL_MEM_FENCE);\n"
+ " Csub += As[ty][0] * Bs[0][tx];\n"
+ " Csub += As[ty][1] * Bs[1][tx];\n"
+ " Csub += As[ty][2] * Bs[2][tx];\n"
+ " Csub += As[ty][3] * Bs[3][tx];\n"
+ " Csub += As[ty][4] * Bs[4][tx];\n"
+ " Csub += As[ty][5] * Bs[5][tx];\n"
+ " Csub += As[ty][6] * Bs[6][tx];\n"
+ " Csub += As[ty][7] * Bs[7][tx];\n"
+ " Csub += As[ty][8] * Bs[8][tx];\n"
+ " Csub += As[ty][9] * Bs[9][tx];\n"
+ " Csub += As[ty][10] * Bs[10][tx];\n"
+ " Csub += As[ty][11] * Bs[11][tx];\n"
+ " Csub += As[ty][12] * Bs[12][tx];\n"
+ " Csub += As[ty][13] * Bs[13][tx];\n"
+ " Csub += As[ty][14] * Bs[14][tx];\n"
+ " Csub += As[ty][15] * Bs[15][tx];\n"
+ " mCount++;\n"
+ " if(mCount == 2){\n"
+ " Csub = fmod(Csub, mod);\n"
+ " mCount = 0;\n"
+ " }\n"
+ " barrier(CLK_LOCAL_MEM_FENCE);\n"
+ " }\n"
+ " Csub = fmod(Csub, mod);\n"
+ " int c = widthB * BLOCK_SIZE * by + BLOCK_SIZE * bx;\n"
+ " C[c + ty * widthB + tx] = Csub;\n"
+ "}\n"
+ };
+
+ const char* matrixMulKernelModular1024DP = {
+ "#define BLOCK_SIZE 16\n"
+ "#pragma OPENCL EXTENSION cl_khr_fp64 : enable\n"
+ "__kernel void matrixMulKernelModular1024DP(__global double* C, __global double* A, __global double* B,\n"
+ " const int widthA, const int widthB, const double mod){\n"
+ " int bx = get_group_id(0);\n"
+ " int by = get_group_id(1);\n"
+ " int tx = get_local_id(0);\n"
+ " int ty = get_local_id(1);\n"
+ " int aBegin = widthA * BLOCK_SIZE * by;\n"
+ " int aEnd = aBegin + widthA - 1;\n"
+ " int aStep = BLOCK_SIZE;\n"
+ " int bBegin = BLOCK_SIZE * bx;\n"
+ " int bStep = BLOCK_SIZE * widthB;\n"
+ " __local double As[BLOCK_SIZE][BLOCK_SIZE];\n"
+ " __local double Bs[BLOCK_SIZE][BLOCK_SIZE];\n"
+ " double Csub = 0;\n"
+ " int mCount = 0;\n"
+ " for(int a = aBegin, b = bBegin; a < aEnd; a += aStep, b += bStep){\n"
+ " As[ty][tx] = A[a + widthA * ty + tx];\n"
+ " Bs[ty][tx] = B[b + widthB * ty + tx];\n"
+ " barrier(CLK_LOCAL_MEM_FENCE);\n"
+ " Csub += As[ty][0] * Bs[0][tx];\n"
+ " Csub += As[ty][1] * Bs[1][tx];\n"
+ " Csub += As[ty][2] * Bs[2][tx];\n"
+ " Csub += As[ty][3] * Bs[3][tx];\n"
+ " Csub += As[ty][4] * Bs[4][tx];\n"
+ " Csub += As[ty][5] * Bs[5][tx];\n"
+ " Csub += As[ty][6] * Bs[6][tx];\n"
+ " Csub += As[ty][7] * Bs[7][tx];\n"
+ " Csub += As[ty][8] * Bs[8][tx];\n"
+ " Csub += As[ty][9] * Bs[9][tx];\n"
+ " Csub += As[ty][10] * Bs[10][tx];\n"
+ " Csub += As[ty][11] * Bs[11][tx];\n"
+ " Csub += As[ty][12] * Bs[12][tx];\n"
+ " Csub += As[ty][13] * Bs[13][tx];\n"
+ " Csub += As[ty][14] * Bs[14][tx];\n"
+ " Csub += As[ty][15] * Bs[15][tx];\n"
+ " mCount++;\n"
+ " if(mCount == 64){\n"
+ " Csub = fmod(Csub, mod);\n"
+ " mCount = 0;\n"
+ " }\n"
+ " barrier(CLK_LOCAL_MEM_FENCE);\n"
+ " }\n"
+ " Csub = fmod(Csub, mod);\n"
+ " int c = widthB * BLOCK_SIZE * by + BLOCK_SIZE * bx;\n"
+ " C[c + ty * widthB + tx] = Csub;\n"
+ "}\n"
+ };
+
+ const char* matrixMulKernelModular1024SP = {
+ "#define BLOCK_SIZE 16\n"
+ "__kernel void matrixMulKernelModular1024SP(__global float* C, __global float* A, __global float* B,\n"
+ " const int widthA, const int widthB, const float mod){\n"
+ " int bx = get_group_id(0);\n"
+ " int by = get_group_id(1);\n"
+ " int tx = get_local_id(0);\n"
+ " int ty = get_local_id(1);\n"
+ " int aBegin = widthA * BLOCK_SIZE * by;\n"
+ " int aEnd = aBegin + widthA - 1;\n"
+ " int aStep = BLOCK_SIZE;\n"
+ " int bBegin = BLOCK_SIZE * bx;\n"
+ " int bStep = BLOCK_SIZE * widthB;\n"
+ " __local float As[BLOCK_SIZE][BLOCK_SIZE];\n"
+ " __local float Bs[BLOCK_SIZE][BLOCK_SIZE];\n"
+ " float Csub = 0;\n"
+ " int mCount = 0;\n"
+ " for(int a = aBegin, b = bBegin; a < aEnd; a += aStep, b += bStep){\n"
+ " As[ty][tx] = A[a + widthA * ty + tx];\n"
+ " Bs[ty][tx] = B[b + widthB * ty + tx];\n"
+ " barrier(CLK_LOCAL_MEM_FENCE);\n"
+ " Csub += As[ty][0] * Bs[0][tx];\n"
+ " Csub += As[ty][1] * Bs[1][tx];\n"
+ " Csub += As[ty][2] * Bs[2][tx];\n"
+ " Csub += As[ty][3] * Bs[3][tx];\n"
+ " Csub += As[ty][4] * Bs[4][tx];\n"
+ " Csub += As[ty][5] * Bs[5][tx];\n"
+ " Csub += As[ty][6] * Bs[6][tx];\n"
+ " Csub += As[ty][7] * Bs[7][tx];\n"
+ " Csub += As[ty][8] * Bs[8][tx];\n"
+ " Csub += As[ty][9] * Bs[9][tx];\n"
+ " Csub += As[ty][10] * Bs[10][tx];\n"
+ " Csub += As[ty][11] * Bs[11][tx];\n"
+ " Csub += As[ty][12] * Bs[12][tx];\n"
+ " Csub += As[ty][13] * Bs[13][tx];\n"
+ " Csub += As[ty][14] * Bs[14][tx];\n"
+ " Csub += As[ty][15] * Bs[15][tx];\n"
+ " mCount++;\n"
+ " if(mCount == 64){\n"
+ " Csub = fmod(Csub, mod);\n"
+ " mCount = 0;\n"
+ " }\n"
+ " barrier(CLK_LOCAL_MEM_FENCE);\n"
+ " }\n"
+ " Csub = fmod(Csub, mod);\n"
+ " int c = widthB * BLOCK_SIZE * by + BLOCK_SIZE * bx;\n"
+ " C[c + ty * widthB + tx] = Csub;\n"
+ "}\n"
+ };
+
+ const char* matrixMuladdKernelModular1DP = {
+ "#define BLOCK_SIZE 16\n"
+ "#pragma OPENCL EXTENSION cl_khr_fp64 : enable\n"
+ "__kernel void matrixMuladdKernelModular1DP(__global double* D, double alpha, __global double* A, __global double* B,\n"
+ " double beta, __global double* C, const int widthA, const int widthB, const double mod){\n"
+ " int bx = get_group_id(0);\n"
+ " int by = get_group_id(1);\n"
+ " int tx = get_local_id(0);\n"
+ " int ty = get_local_id(1);\n"
+ " int aBegin = widthA * BLOCK_SIZE * by;\n"
+ " int aEnd = aBegin + widthA - 1;\n"
+ " int aStep = BLOCK_SIZE;\n"
+ " int bBegin = BLOCK_SIZE * bx;\n"
+ " int bStep = BLOCK_SIZE * widthB;\n"
+ " __local double As[BLOCK_SIZE][BLOCK_SIZE];\n"
+ " __local double Bs[BLOCK_SIZE][BLOCK_SIZE];\n"
+ " double Dsub = 0;\n"
+ " for(int a = aBegin, b = bBegin; a < aEnd; a += aStep, b += bStep){\n"
+ " As[ty][tx] = A[a + widthA * ty + tx];\n"
+ " Bs[ty][tx] = B[b + widthB * ty + tx];\n"
+ " barrier(CLK_LOCAL_MEM_FENCE);\n"
+ " Dsub += As[ty][0] * Bs[0][tx];\n"
+ " Dsub = fmod(Dsub, mod);\n"
+ " Dsub += As[ty][1] * Bs[1][tx];\n"
+ " Dsub = fmod(Dsub, mod);\n"
+ " Dsub += As[ty][2] * Bs[2][tx];\n"
+ " Dsub = fmod(Dsub, mod);\n"
+ " Dsub += As[ty][3] * Bs[3][tx];\n"
+ " Dsub = fmod(Dsub, mod);\n"
+ " Dsub += As[ty][4] * Bs[4][tx];\n"
+ " Dsub = fmod(Dsub, mod);\n"
+ " Dsub += As[ty][5] * Bs[5][tx];\n"
+ " Dsub = fmod(Dsub, mod);\n"
+ " Dsub += As[ty][6] * Bs[6][tx];\n"
+ " Dsub = fmod(Dsub, mod);\n"
+ " Dsub += As[ty][7] * Bs[7][tx];\n"
+ " Dsub = fmod(Dsub, mod);\n"
+ " Dsub += As[ty][8] * Bs[8][tx];\n"
+ " Dsub = fmod(Dsub, mod);\n"
+ " Dsub += As[ty][9] * Bs[9][tx];\n"
+ " Dsub = fmod(Dsub, mod);\n"
+ " Dsub += As[ty][10] * Bs[10][tx];\n"
+ " Dsub = fmod(Dsub, mod);\n"
+ " Dsub += As[ty][11] * Bs[11][tx];\n"
+ " Dsub = fmod(Dsub, mod);\n"
+ " Dsub += As[ty][12] * Bs[12][tx];\n"
+ " Dsub = fmod(Dsub, mod);\n"
+ " Dsub += As[ty][13] * Bs[13][tx];\n"
+ " Dsub = fmod(Dsub, mod);\n"
+ " Dsub += As[ty][14] * Bs[14][tx];\n"
+ " Dsub = fmod(Dsub, mod);\n"
+ " Dsub += As[ty][15] * Bs[15][tx];\n"
+ " Dsub = fmod(Dsub, mod);\n"
+ " barrier(CLK_LOCAL_MEM_FENCE);\n"
+ " }\n"
+ " int d = widthB * BLOCK_SIZE * by + BLOCK_SIZE * bx;\n"
+ " Dsub = alpha * Dsub;\n"
+ " Dsub = fmod(Dsub, mod);\n"
+ " if(Dsub < 0){\n"
+ " Dsub = mod + Dsub;\n"
+ " }\n"
+ " double Csub = C[d + ty * widthB + tx];\n"
+ " Csub = beta * Csub;\n"
+ " Csub = fmod(Csub, mod);\n"
+ " if(Csub < 0){\n"
+ " Csub = mod + Csub;\n"
+ " }\n"
+ " Dsub = Dsub + Csub;\n"
+ " Dsub = fmod(Dsub, mod);\n"
+ " D[d + ty * widthB + tx] = Dsub;\n"
+ "}\n"
+ };
+
+ const char* matrixMuladdKernelModular1SP = {
+ "#define BLOCK_SIZE 16\n"
+ "__kernel void matrixMuladdKernelModular1SP(__global float* D, float alpha, __global float* A, __global float* B,\n"
+ " float beta, __global float* C, const int widthA, const int widthB, const float mod){\n"
+ " int bx = get_group_id(0);\n"
+ " int by = get_group_id(1);\n"
+ " int tx = get_local_id(0);\n"
+ " int ty = get_local_id(1);\n"
+ " int aBegin = widthA * BLOCK_SIZE * by;\n"
+ " int aEnd = aBegin + widthA - 1;\n"
+ " int aStep = BLOCK_SIZE;\n"
+ " int bBegin = BLOCK_SIZE * bx;\n"
+ " int bStep = BLOCK_SIZE * widthB;\n"
+ " __local float As[BLOCK_SIZE][BLOCK_SIZE];\n"
+ " __local float Bs[BLOCK_SIZE][BLOCK_SIZE];\n"
+ " float Dsub = 0;\n"
+ " for(int a = aBegin, b = bBegin; a < aEnd; a += aStep, b += bStep){\n"
+ " As[ty][tx] = A[a + widthA * ty + tx];\n"
+ " Bs[ty][tx] = B[b + widthB * ty + tx];\n"
+ " barrier(CLK_LOCAL_MEM_FENCE);\n"
+ " Dsub += As[ty][0] * Bs[0][tx];\n"
+ " Dsub = fmod(Dsub, mod);\n"
+ " Dsub += As[ty][1] * Bs[1][tx];\n"
+ " Dsub = fmod(Dsub, mod);\n"
+ " Dsub += As[ty][2] * Bs[2][tx];\n"
+ " Dsub = fmod(Dsub, mod);\n"
+ " Dsub += As[ty][3] * Bs[3][tx];\n"
+ " Dsub = fmod(Dsub, mod);\n"
+ " Dsub += As[ty][4] * Bs[4][tx];\n"
+ " Dsub = fmod(Dsub, mod);\n"
+ " Dsub += As[ty][5] * Bs[5][tx];\n"
+ " Dsub = fmod(Dsub, mod);\n"
+ " Dsub += As[ty][6] * Bs[6][tx];\n"
+ " Dsub = fmod(Dsub, mod);\n"
+ " Dsub += As[ty][7] * Bs[7][tx];\n"
+ " Dsub = fmod(Dsub, mod);\n"
+ " Dsub += As[ty][8] * Bs[8][tx];\n"
+ " Dsub = fmod(Dsub, mod);\n"
+ " Dsub += As[ty][9] * Bs[9][tx];\n"
+ " Dsub = fmod(Dsub, mod);\n"
+ " Dsub += As[ty][10] * Bs[10][tx];\n"
+ " Dsub = fmod(Dsub, mod);\n"
+ " Dsub += As[ty][11] * Bs[11][tx];\n"
+ " Dsub = fmod(Dsub, mod);\n"
+ " Dsub += As[ty][12] * Bs[12][tx];\n"
+ " Dsub = fmod(Dsub, mod);\n"
+ " Dsub += As[ty][13] * Bs[13][tx];\n"
+ " Dsub = fmod(Dsub, mod);\n"
+ " Dsub += As[ty][14] * Bs[14][tx];\n"
+ " Dsub = fmod(Dsub, mod);\n"
+ " Dsub += As[ty][15] * Bs[15][tx];\n"
+ " Dsub = fmod(Dsub, mod);\n"
+ " barrier(CLK_LOCAL_MEM_FENCE);\n"
+ " }\n"
+ " int d = widthB * BLOCK_SIZE * by + BLOCK_SIZE * bx;\n"
+ " Dsub = alpha * Dsub;\n"
+ " Dsub = fmod(Dsub, mod);\n"
+ " if(Dsub < 0){\n"
+ " Dsub = mod + Dsub;\n"
+ " }\n"
+ " float Csub = C[d + ty * widthB + tx];\n"
+ " Csub = beta * Csub;\n"
+ " Csub = fmod(Csub, mod);\n"
+ " if(Csub < 0){\n"
+ " Csub = mod + Csub;\n"
+ " }\n"
+ " Dsub = Dsub + Csub;\n"
+ " Dsub = fmod(Dsub, mod);\n"
+ " D[d + ty * widthB + tx] = Dsub;\n"
+ "}\n"
+ };
+
+ const char* matrixMuladdKernelModular8DP = {
+ "#define BLOCK_SIZE 16\n"
+ "#pragma OPENCL EXTENSION cl_khr_fp64 : enable\n"
+ "__kernel void matrixMuladdKernelModular8DP(__global double* D, double alpha, __global double* A, __global double* B,\n"
+ " double beta, __global double* C, const int widthA, const int widthB, const double mod){\n"
+ " int bx = get_group_id(0);\n"
+ " int by = get_group_id(1);\n"
+ " int tx = get_local_id(0);\n"
+ " int ty = get_local_id(1);\n"
+ " int aBegin = widthA * BLOCK_SIZE * by;\n"
+ " int aEnd = aBegin + widthA - 1;\n"
+ " int aStep = BLOCK_SIZE;\n"
+ " int bBegin = BLOCK_SIZE * bx;\n"
+ " int bStep = BLOCK_SIZE * widthB;\n"
+ " __local double As[BLOCK_SIZE][BLOCK_SIZE];\n"
+ " __local double Bs[BLOCK_SIZE][BLOCK_SIZE];\n"
+ " double Dsub = 0;\n"
+ " for(int a = aBegin, b = bBegin; a < aEnd; a += aStep, b += bStep){\n"
+ " As[ty][tx] = A[a + widthA * ty + tx];\n"
+ " Bs[ty][tx] = B[b + widthB * ty + tx];\n"
+ " barrier(CLK_LOCAL_MEM_FENCE);\n"
+ " Dsub += As[ty][0] * Bs[0][tx];\n"
+ " Dsub += As[ty][1] * Bs[1][tx];\n"
+ " Dsub += As[ty][2] * Bs[2][tx];\n"
+ " Dsub += As[ty][3] * Bs[3][tx];\n"
+ " Dsub += As[ty][4] * Bs[4][tx];\n"
+ " Dsub += As[ty][5] * Bs[5][tx];\n"
+ " Dsub += As[ty][6] * Bs[6][tx];\n"
+ " Dsub += As[ty][7] * Bs[7][tx];\n"
+ " Dsub = fmod(Dsub, mod);\n"
+ " Dsub += As[ty][8] * Bs[8][tx];\n"
+ " Dsub += As[ty][9] * Bs[9][tx];\n"
+ " Dsub += As[ty][10] * Bs[10][tx];\n"
+ " Dsub += As[ty][11] * Bs[11][tx];\n"
+ " Dsub += As[ty][12] * Bs[12][tx];\n"
+ " Dsub += As[ty][13] * Bs[13][tx];\n"
+ " Dsub += As[ty][14] * Bs[14][tx];\n"
+ " Dsub += As[ty][15] * Bs[15][tx];\n"
+ " Dsub = fmod(Dsub, mod);\n"
+ " barrier(CLK_LOCAL_MEM_FENCE);\n"
+ " }\n"
+ " int d = widthB * BLOCK_SIZE * by + BLOCK_SIZE * bx;\n"
+ " Dsub = alpha * Dsub;\n"
+ " Dsub = fmod(Dsub, mod);\n"
+ " if(Dsub < 0){\n"
+ " Dsub = mod + Dsub;\n"
+ " }\n"
+ " double Csub = C[d + ty * widthB + tx];\n"
+ " Csub = beta * Csub;\n"
+ " Csub = fmod(Csub, mod);\n"
+ " if(Csub < 0){\n"
+ " Csub = mod + Csub;\n"
+ " }\n"
+ " Dsub = Dsub + Csub;\n"
+ " Dsub = fmod(Dsub, mod);\n"
+ " D[d + ty * widthB + tx] = Dsub;\n"
+ "}\n"
+ };
+
+ const char* matrixMuladdKernelModular16SP = {
+ "#define BLOCK_SIZE 16\n"
+ "__kernel void matrixMuladdKernelModular16SP(__global float* D, float alpha, __global float* A, __global float* B,\n"
+ " float beta, __global float* C, const int widthA, const int widthB, const float mod){\n"
+ " int bx = get_group_id(0);\n"
+ " int by = get_group_id(1);\n"
+ " int tx = get_local_id(0);\n"
+ " int ty = get_local_id(1);\n"
+ " int aBegin = widthA * BLOCK_SIZE * by;\n"
+ " int aEnd = aBegin + widthA - 1;\n"
+ " int aStep = BLOCK_SIZE;\n"
+ " int bBegin = BLOCK_SIZE * bx;\n"
+ " int bStep = BLOCK_SIZE * widthB;\n"
+ " __local float As[BLOCK_SIZE][BLOCK_SIZE];\n"
+ " __local float Bs[BLOCK_SIZE][BLOCK_SIZE];\n"
+ " float Dsub = 0;\n"
+ " int m = 0;\n"
+ " for(int a = aBegin, b = bBegin; a < aEnd; a += aStep, b += bStep){\n"
+ " As[ty][tx] = A[a + widthA * ty + tx];\n"
+ " Bs[ty][tx] = B[b + widthB * ty + tx];\n"
+ " barrier(CLK_LOCAL_MEM_FENCE);\n"
+ " Dsub += As[ty][0] * Bs[0][tx];\n"
+ " Dsub += As[ty][1] * Bs[1][tx];\n"
+ " Dsub += As[ty][2] * Bs[2][tx];\n"
+ " Dsub += As[ty][3] * Bs[3][tx];\n"
+ " Dsub += As[ty][4] * Bs[4][tx];\n"
+ " Dsub += As[ty][5] * Bs[5][tx];\n"
+ " Dsub += As[ty][6] * Bs[6][tx];\n"
+ " Dsub += As[ty][7] * Bs[7][tx];\n"
+ " Dsub += As[ty][8] * Bs[8][tx];\n"
+ " Dsub += As[ty][9] * Bs[9][tx];\n"
+ " Dsub += As[ty][10] * Bs[10][tx];\n"
+ " Dsub += As[ty][11] * Bs[11][tx];\n"
+ " Dsub += As[ty][12] * Bs[12][tx];\n"
+ " Dsub += As[ty][13] * Bs[13][tx];\n"
+ " Dsub += As[ty][14] * Bs[14][tx];\n"
+ " Dsub += As[ty][15] * Bs[15][tx];\n"
+ " Dsub = fmod(Dsub, mod);\n"
+ " barrier(CLK_LOCAL_MEM_FENCE);\n"
+ " }\n"
+ " int d = widthB * BLOCK_SIZE * by + BLOCK_SIZE * bx;\n"
+ " Dsub = alpha * Dsub;\n"
+ " Dsub = fmod(Dsub, mod);\n"
+ " if(Dsub < 0){\n"
+ " Dsub = mod + Dsub;\n"
+ " }\n"
+ " float Csub = C[d + ty * widthB + tx];\n"
+ " Csub = beta * Csub;\n"
+ " Csub = fmod(Csub, mod);\n"
+ " if(Csub < 0){\n"
+ " Csub = mod + Csub;\n"
+ " }\n"
+ " Dsub = Dsub + Csub;\n"
+ " Dsub = fmod(Dsub, mod);\n"
+ " D[d + ty * widthB + tx] = Dsub;\n"
+ "}\n"
+ };
+
+ const char* matrixMuladdKernelModular32DP = {
+ "#define BLOCK_SIZE 16\n"
+ "#pragma OPENCL EXTENSION cl_khr_fp64 : enable\n"
+ "__kernel void matrixMuladdKernelModular32DP(__global double* D, double alpha, __global double* A, __global double* B,\n"
+ " double beta, __global double* C, const int widthA, const int widthB, const double mod){\n"
+ " int bx = get_group_id(0);\n"
+ " int by = get_group_id(1);\n"
+ " int tx = get_local_id(0);\n"
+ " int ty = get_local_id(1);\n"
+ " int aBegin = widthA * BLOCK_SIZE * by;\n"
+ " int aEnd = aBegin + widthA - 1;\n"
+ " int aStep = BLOCK_SIZE;\n"
+ " int bBegin = BLOCK_SIZE * bx;\n"
+ " int bStep = BLOCK_SIZE * widthB;\n"
+ " __local double As[BLOCK_SIZE][BLOCK_SIZE];\n"
+ " __local double Bs[BLOCK_SIZE][BLOCK_SIZE];\n"
+ " double Dsub = 0;\n"
+ " int mCount = 0;\n"
+ " for(int a = aBegin, b = bBegin; a < aEnd; a += aStep, b += bStep){\n"
+ " As[ty][tx] = A[a + widthA * ty + tx];\n"
+ " Bs[ty][tx] = B[b + widthB * ty + tx];\n"
+ " barrier(CLK_LOCAL_MEM_FENCE);\n"
+ " Dsub += As[ty][0] * Bs[0][tx];\n"
+ " Dsub += As[ty][1] * Bs[1][tx];\n"
+ " Dsub += As[ty][2] * Bs[2][tx];\n"
+ " Dsub += As[ty][3] * Bs[3][tx];\n"
+ " Dsub += As[ty][4] * Bs[4][tx];\n"
+ " Dsub += As[ty][5] * Bs[5][tx];\n"
+ " Dsub += As[ty][6] * Bs[6][tx];\n"
+ " Dsub += As[ty][7] * Bs[7][tx];\n"
+ " Dsub += As[ty][8] * Bs[8][tx];\n"
+ " Dsub += As[ty][9] * Bs[9][tx];\n"
+ " Dsub += As[ty][10] * Bs[10][tx];\n"
+ " Dsub += As[ty][11] * Bs[11][tx];\n"
+ " Dsub += As[ty][12] * Bs[12][tx];\n"
+ " Dsub += As[ty][13] * Bs[13][tx];\n"
+ " Dsub += As[ty][14] * Bs[14][tx];\n"
+ " Dsub += As[ty][15] * Bs[15][tx];\n"
+ " mCount++;\n"
+ " if(mCount == 2){\n"
+ " Dsub = fmod(Dsub, mod);\n"
+ " mCount = 0;\n"
+ " }\n"
+ " barrier(CLK_LOCAL_MEM_FENCE);\n"
+ " }\n"
+ " Dsub = fmod(Dsub, mod);\n"
+ " int d = widthB * BLOCK_SIZE * by + BLOCK_SIZE * bx;\n"
+ " Dsub = alpha * Dsub;\n"
+ " Dsub = fmod(Dsub, mod);\n"
+ " if(Dsub < 0){\n"
+ " Dsub = mod + Dsub;\n"
+ " }\n"
+ " double Csub = C[d + ty * widthB + tx];\n"
+ " Csub = beta * Csub;\n"
+ " Csub = fmod(Csub, mod);\n"
+ " if(Csub < 0){\n"
+ " Csub = mod + Csub;\n"
+ " }\n"
+ " Dsub = Dsub + Csub;\n"
+ " Dsub = fmod(Dsub, mod);\n"
+ " D[d + ty * widthB + tx] = Dsub;\n"
+ "}\n"
+ };
+
+ const char* matrixMuladdKernelModular32SP = {
+ "#define BLOCK_SIZE 16\n"
+ "__kernel void matrixMuladdKernelModular32SP(__global float* D, float alpha, __global float* A, __global float* B,\n"
+ " float beta, __global float* C, const int widthA, const int widthB, const float mod){\n"
+ " int bx = get_group_id(0);\n"
+ " int by = get_group_id(1);\n"
+ " int tx = get_local_id(0);\n"
+ " int ty = get_local_id(1);\n"
+ " int aBegin = widthA * BLOCK_SIZE * by;\n"
+ " int aEnd = aBegin + widthA - 1;\n"
+ " int aStep = BLOCK_SIZE;\n"
+ " int bBegin = BLOCK_SIZE * bx;\n"
+ " int bStep = BLOCK_SIZE * widthB;\n"
+ " __local float As[BLOCK_SIZE][BLOCK_SIZE];\n"
+ " __local float Bs[BLOCK_SIZE][BLOCK_SIZE];\n"
+ " float Dsub = 0;\n"
+ " int mCount = 0;\n"
+ " for(int a = aBegin, b = bBegin; a < aEnd; a += aStep, b += bStep){\n"
+ " As[ty][tx] = A[a + widthA * ty + tx];\n"
+ " Bs[ty][tx] = B[b + widthB * ty + tx];\n"
+ " barrier(CLK_LOCAL_MEM_FENCE);\n"
+ " Dsub += As[ty][0] * Bs[0][tx];\n"
+ " Dsub += As[ty][1] * Bs[1][tx];\n"
+ " Dsub += As[ty][2] * Bs[2][tx];\n"
+ " Dsub += As[ty][3] * Bs[3][tx];\n"
+ " Dsub += As[ty][4] * Bs[4][tx];\n"
+ " Dsub += As[ty][5] * Bs[5][tx];\n"
+ " Dsub += As[ty][6] * Bs[6][tx];\n"
+ " Dsub += As[ty][7] * Bs[7][tx];\n"
+ " Dsub += As[ty][8] * Bs[8][tx];\n"
+ " Dsub += As[ty][9] * Bs[9][tx];\n"
+ " Dsub += As[ty][10] * Bs[10][tx];\n"
+ " Dsub += As[ty][11] * Bs[11][tx];\n"
+ " Dsub += As[ty][12] * Bs[12][tx];\n"
+ " Dsub += As[ty][13] * Bs[13][tx];\n"
+ " Dsub += As[ty][14] * Bs[14][tx];\n"
+ " Dsub += As[ty][15] * Bs[15][tx];\n"
+ " mCount++;\n"
+ " if(mCount == 2){\n"
+ " Dsub = fmod(Dsub, mod);\n"
+ " mCount = 0;\n"
+ " }\n"
+ " barrier(CLK_LOCAL_MEM_FENCE);\n"
+ " }\n"
+ " Dsub = fmod(Dsub, mod);\n"
+ " int d = widthB * BLOCK_SIZE * by + BLOCK_SIZE * bx;\n"
+ " Dsub = alpha * Dsub;\n"
+ " Dsub = fmod(Dsub, mod);\n"
+ " if(Dsub < 0){\n"
+ " Dsub = mod + Dsub;\n"
+ " }\n"
+ " float Csub = C[d + ty * widthB + tx];\n"
+ " Csub = beta * Csub;\n"
+ " Csub = fmod(Csub, mod);\n"
+ " if(Csub < 0){\n"
+ " Csub = mod + Csub;\n"
+ " }\n"
+ " Dsub = Dsub + Csub;\n"
+ " Dsub = fmod(Dsub, mod);\n"
+ " D[d + ty * widthB + tx] = Dsub;\n"
+ "}\n"
+ };
+
+ const char* matrixMuladdKernelModular1024DP = {
+ "#define BLOCK_SIZE 16\n"
+ "#pragma OPENCL EXTENSION cl_khr_fp64 : enable\n"
+ "__kernel void matrixMuladdKernelModular1024DP(__global double* D, double alpha, __global double* A, __global double* B,\n"
+ " double beta, __global double* C, const int widthA, const int widthB, const double mod){\n"
+ " int bx = get_group_id(0);\n"
+ " int by = get_group_id(1);\n"
+ " int tx = get_local_id(0);\n"
+ " int ty = get_local_id(1);\n"
+ " int aBegin = widthA * BLOCK_SIZE * by;\n"
+ " int aEnd = aBegin + widthA - 1;\n"
+ " int aStep = BLOCK_SIZE;\n"
+ " int bBegin = BLOCK_SIZE * bx;\n"
+ " int bStep = BLOCK_SIZE * widthB;\n"
+ " __local double As[BLOCK_SIZE][BLOCK_SIZE];\n"
+ " __local double Bs[BLOCK_SIZE][BLOCK_SIZE];\n"
+ " double Dsub = 0;\n"
+ " int mCount = 0;\n"
+ " for(int a = aBegin, b = bBegin; a < aEnd; a += aStep, b += bStep){\n"
+ " As[ty][tx] = A[a + widthA * ty + tx];\n"
+ " Bs[ty][tx] = B[b + widthB * ty + tx];\n"
+ " barrier(CLK_LOCAL_MEM_FENCE);\n"
+ " Dsub += As[ty][0] * Bs[0][tx];\n"
+ " Dsub += As[ty][1] * Bs[1][tx];\n"
+ " Dsub += As[ty][2] * Bs[2][tx];\n"
+ " Dsub += As[ty][3] * Bs[3][tx];\n"
+ " Dsub += As[ty][4] * Bs[4][tx];\n"
+ " Dsub += As[ty][5] * Bs[5][tx];\n"
+ " Dsub += As[ty][6] * Bs[6][tx];\n"
+ " Dsub += As[ty][7] * Bs[7][tx];\n"
+ " Dsub += As[ty][8] * Bs[8][tx];\n"
+ " Dsub += As[ty][9] * Bs[9][tx];\n"
+ " Dsub += As[ty][10] * Bs[10][tx];\n"
+ " Dsub += As[ty][11] * Bs[11][tx];\n"
+ " Dsub += As[ty][12] * Bs[12][tx];\n"
+ " Dsub += As[ty][13] * Bs[13][tx];\n"
+ " Dsub += As[ty][14] * Bs[14][tx];\n"
+ " Dsub += As[ty][15] * Bs[15][tx];\n"
+ " mCount++;\n"
+ " if(mCount == 64){\n"
+ " Dsub = fmod(Dsub, mod);\n"
+ " mCount = 0;\n"
+ " }\n"
+ " barrier(CLK_LOCAL_MEM_FENCE);\n"
+ " }\n"
+ " Dsub = fmod(Dsub, mod);\n"
+ " int d = widthB * BLOCK_SIZE * by + BLOCK_SIZE * bx;\n"
+ " Dsub = alpha * Dsub;\n"
+ " Dsub = fmod(Dsub, mod);\n"
+ " if(Dsub < 0){\n"
+ " Dsub = mod + Dsub;\n"
+ " }\n"
+ " double Csub = C[d + ty * widthB + tx];\n"
+ " Csub = beta * Csub;\n"
+ " Csub = fmod(Csub, mod);\n"
+ " if(Csub < 0){\n"
+ " Csub = mod + Csub;\n"
+ " }\n"
+ " Dsub = Dsub + Csub;\n"
+ " Dsub = fmod(Dsub, mod);\n"
+ " D[d + ty * widthB + tx] = Dsub;\n"
+ "}\n"
+ };
+
+ const char* matrixMuladdKernelModular1024SP = {
+ "#define BLOCK_SIZE 16\n"
+ "__kernel void matrixMuladdKernelModular1024SP(__global float* D, float alpha, __global float* A, __global float* B,\n"
+ " float beta, __global float* C, const int widthA, const int widthB, const float mod){\n"
+ " int bx = get_group_id(0);\n"
+ " int by = get_group_id(1);\n"
+ " int tx = get_local_id(0);\n"
+ " int ty = get_local_id(1);\n"
+ " int aBegin = widthA * BLOCK_SIZE * by;\n"
+ " int aEnd = aBegin + widthA - 1;\n"
+ " int aStep = BLOCK_SIZE;\n"
+ " int bBegin = BLOCK_SIZE * bx;\n"
+ " int bStep = BLOCK_SIZE * widthB;\n"
+ " __local float As[BLOCK_SIZE][BLOCK_SIZE];\n"
+ " __local float Bs[BLOCK_SIZE][BLOCK_SIZE];\n"
+ " float Dsub = 0;\n"
+ " int mCount = 0;\n"
+ " for(int a = aBegin, b = bBegin; a < aEnd; a += aStep, b += bStep){\n"
+ " As[ty][tx] = A[a + widthA * ty + tx];\n"
+ " Bs[ty][tx] = B[b + widthB * ty + tx];\n"
+ " barrier(CLK_LOCAL_MEM_FENCE);\n"
+ " Dsub += As[ty][0] * Bs[0][tx];\n"
+ " Dsub += As[ty][1] * Bs[1][tx];\n"
+ " Dsub += As[ty][2] * Bs[2][tx];\n"
+ " Dsub += As[ty][3] * Bs[3][tx];\n"
+ " Dsub += As[ty][4] * Bs[4][tx];\n"
+ " Dsub += As[ty][5] * Bs[5][tx];\n"
+ " Dsub += As[ty][6] * Bs[6][tx];\n"
+ " Dsub += As[ty][7] * Bs[7][tx];\n"
+ " Dsub += As[ty][8] * Bs[8][tx];\n"
+ " Dsub += As[ty][9] * Bs[9][tx];\n"
+ " Dsub += As[ty][10] * Bs[10][tx];\n"
+ " Dsub += As[ty][11] * Bs[11][tx];\n"
+ " Dsub += As[ty][12] * Bs[12][tx];\n"
+ " Dsub += As[ty][13] * Bs[13][tx];\n"
+ " Dsub += As[ty][14] * Bs[14][tx];\n"
+ " Dsub += As[ty][15] * Bs[15][tx];\n"
+ " mCount++;\n"
+ " if(mCount == 64){\n"
+ " Dsub = fmod(Dsub, mod);\n"
+ " mCount = 0;\n"
+ " }\n"
+ " barrier(CLK_LOCAL_MEM_FENCE);\n"
+ " }\n"
+ " Dsub = fmod(Dsub, mod);\n"
+ " int d = widthB * BLOCK_SIZE * by + BLOCK_SIZE * bx;\n"
+ " Dsub = alpha * Dsub;\n"
+ " Dsub = fmod(Dsub, mod);\n"
+ " if(Dsub < 0){\n"
+ " Dsub = mod + Dsub;\n"
+ " }\n"
+ " float Csub = C[d + ty * widthB + tx];\n"
+ " Csub = beta * Csub;\n"
+ " Csub = fmod(Csub, mod);\n"
+ " if(Csub < 0){\n"
+ " Csub = mod + Csub;\n"
+ " }\n"
+ " Dsub = Dsub + Csub;\n"
+ " Dsub = fmod(Dsub, mod);\n"
+ " D[d + ty * widthB + tx] = Dsub;\n"
+ "}\n"
+ };
+
+ const char* matrixAxpyKernelModular1DP = {
+ "#define BLOCK_SIZE 16\n"
+ "#pragma OPENCL EXTENSION cl_khr_fp64 : enable\n"
+ "__kernel void matrixAxpyKernelModular1DP(__global double* D, __global double* A, __global double* B,\n"
+ " __global double* C, const int widthA, const int widthB, const double mod){\n"
+ " int bx = get_group_id(0);\n"
+ " int by = get_group_id(1);\n"
+ " int tx = get_local_id(0);\n"
+ " int ty = get_local_id(1);\n"
+ " int aBegin= widthA * BLOCK_SIZE * by;\n"
+ " int aEnd = aBegin + widthA - 1;\n"
+ " int aStep = BLOCK_SIZE;\n"
+ " int bBegin = BLOCK_SIZE * bx;\n"
+ " int bStep = BLOCK_SIZE * widthB;\n"
+ " __local double As[BLOCK_SIZE][BLOCK_SIZE];\n"
+ " __local double Bs[BLOCK_SIZE][BLOCK_SIZE];\n"
+ " double Dsub = 0;\n"
+ " for(int a = aBegin, b = bBegin; a < aEnd; a += aStep, b += bStep){\n"
+ " As[ty][tx] = A[a + widthA * ty + tx];\n"
+ " Bs[ty][tx] = B[b + widthB * ty + tx];\n"
+ " barrier(CLK_LOCAL_MEM_FENCE);\n"
+ " Dsub += As[ty][0] * Bs[0][tx];\n"
+ " Dsub = fmod(Dsub, mod);\n"
+ " Dsub += As[ty][1] * Bs[1][tx];\n"
+ " Dsub = fmod(Dsub, mod);\n"
+ " Dsub += As[ty][2] * Bs[2][tx];\n"
+ " Dsub = fmod(Dsub, mod);\n"
+ " Dsub += As[ty][3] * Bs[3][tx];\n"
+ " Dsub = fmod(Dsub, mod);\n"
+ " Dsub += As[ty][4] * Bs[4][tx];\n"
+ " Dsub = fmod(Dsub, mod);\n"
+ " Dsub += As[ty][5] * Bs[5][tx];\n"
+ " Dsub = fmod(Dsub, mod);\n"
+ " Dsub += As[ty][6] * Bs[6][tx];\n"
+ " Dsub = fmod(Dsub, mod);\n"
+ " Dsub += As[ty][7] * Bs[7][tx];\n"
+ " Dsub = fmod(Dsub, mod);\n"
+ " Dsub += As[ty][8] * Bs[8][tx];\n"
+ " Dsub = fmod(Dsub, mod);\n"
+ " Dsub += As[ty][9] * Bs[9][tx];\n"
+ " Dsub = fmod(Dsub, mod);\n"
+ " Dsub += As[ty][10] * Bs[10][tx];\n"
+ " Dsub = fmod(Dsub, mod);\n"
+ " Dsub += As[ty][11] * Bs[11][tx];\n"
+ " Dsub = fmod(Dsub, mod);\n"
+ " Dsub += As[ty][12] * Bs[12][tx];\n"
+ " Dsub = fmod(Dsub, mod);\n"
+ " Dsub += As[ty][13] * Bs[13][tx];\n"
+ " Dsub = fmod(Dsub, mod);\n"
+ " Dsub += As[ty][14] * Bs[14][tx];\n"
+ " Dsub = fmod(Dsub, mod);\n"
+ " Dsub += As[ty][15] * Bs[15][tx];\n"
+ " Dsub = fmod(Dsub, mod);\n"
+ " barrier(CLK_LOCAL_MEM_FENCE);\n"
+ " }\n"
+ " int d = widthB * BLOCK_SIZE * by + BLOCK_SIZE * bx;\n"
+ " double c = C[d + ty * widthB + tx];\n"
+ " Dsub = Dsub + c;\n"
+ " Dsub = fmod(Dsub, mod);\n"
+ " D[d + ty * widthB + tx] = Dsub;\n"
+ "}\n"
+ };
+
+ const char* matrixAxpyKernelModular1SP = {
+ "#define BLOCK_SIZE 16\n"
+ "__kernel void matrixAxpyKernelModular1SP(__global float* D, __global float* A, __global float* B,\n"
+ " __global float* C, const int widthA, const int widthB, const float mod){\n"
+ " int bx = get_group_id(0);\n"
+ " int by = get_group_id(1);\n"
+ " int tx = get_local_id(0);\n"
+ " int ty = get_local_id(1);\n"
+ " int aBegin= widthA * BLOCK_SIZE * by;\n"
+ " int aEnd = aBegin + widthA - 1;\n"
+ " int aStep = BLOCK_SIZE;\n"
+ " int bBegin = BLOCK_SIZE * bx;\n"
+ " int bStep = BLOCK_SIZE * widthB;\n"
+ " __local float As[BLOCK_SIZE][BLOCK_SIZE];\n"
+ " __local float Bs[BLOCK_SIZE][BLOCK_SIZE];\n"
+ " float Dsub = 0;\n"
+ " for(int a = aBegin, b = bBegin; a < aEnd; a += aStep, b += bStep){\n"
+ " As[ty][tx] = A[a + widthA * ty + tx];\n"
+ " Bs[ty][tx] = B[b + widthB * ty + tx];\n"
+ " barrier(CLK_LOCAL_MEM_FENCE);\n"
+ " Dsub += As[ty][0] * Bs[0][tx];\n"
+ " Dsub = fmod(Dsub, mod);\n"
+ " Dsub += As[ty][1] * Bs[1][tx];\n"
+ " Dsub = fmod(Dsub, mod);\n"
+ " Dsub += As[ty][2] * Bs[2][tx];\n"
+ " Dsub = fmod(Dsub, mod);\n"
+ " Dsub += As[ty][3] * Bs[3][tx];\n"
+ " Dsub = fmod(Dsub, mod);\n"
+ " Dsub += As[ty][4] * Bs[4][tx];\n"
+ " Dsub = fmod(Dsub, mod);\n"
+ " Dsub += As[ty][5] * Bs[5][tx];\n"
+ " Dsub = fmod(Dsub, mod);\n"
+ " Dsub += As[ty][6] * Bs[6][tx];\n"
+ " Dsub = fmod(Dsub, mod);\n"
+ " Dsub += As[ty][7] * Bs[7][tx];\n"
+ " Dsub = fmod(Dsub, mod);\n"
+ " Dsub += As[ty][8] * Bs[8][tx];\n"
+ " Dsub = fmod(Dsub, mod);\n"
+ " Dsub += As[ty][9] * Bs[9][tx];\n"
+ " Dsub = fmod(Dsub, mod);\n"
+ " Dsub += As[ty][10] * Bs[10][tx];\n"
+ " Dsub = fmod(Dsub, mod);\n"
+ " Dsub += As[ty][11] * Bs[11][tx];\n"
+ " Dsub = fmod(Dsub, mod);\n"
+ " Dsub += As[ty][12] * Bs[12][tx];\n"
+ " Dsub = fmod(Dsub, mod);\n"
+ " Dsub += As[ty][13] * Bs[13][tx];\n"
+ " Dsub = fmod(Dsub, mod);\n"
+ " Dsub += As[ty][14] * Bs[14][tx];\n"
+ " Dsub = fmod(Dsub, mod);\n"
+ " Dsub += As[ty][15] * Bs[15][tx];\n"
+ " Dsub = fmod(Dsub, mod);\n"
+ " barrier(CLK_LOCAL_MEM_FENCE);\n"
+ " }\n"
+ " int d = widthB * BLOCK_SIZE * by + BLOCK_SIZE * bx;\n"
+ " float c = C[d + ty * widthB + tx];\n"
+ " Dsub = Dsub + c;\n"
+ " Dsub = fmod(Dsub, mod);\n"
+ " D[d + ty * widthB + tx] = Dsub;\n"
+ "}\n"
+ };
+
+ const char* matrixAxpyKernelModular8DP = {
+ "#define BLOCK_SIZE 16\n"
+ "#pragma OPENCL EXTENSION cl_khr_fp64 : enable\n"
+ "__kernel void matrixAxpyKernelModular8DP(__global double* D, __global double* A, __global double* B,\n"
+ " __global double* C, const int widthA, const int widthB, const double mod){\n"
+ " int bx = get_group_id(0);\n"
+ " int by = get_group_id(1);\n"
+ " int tx = get_local_id(0);\n"
+ " int ty = get_local_id(1);\n"
+ " int aBegin= widthA * BLOCK_SIZE * by;\n"
+ " int aEnd = aBegin + widthA - 1;\n"
+ " int aStep = BLOCK_SIZE;\n"
+ " int bBegin = BLOCK_SIZE * bx;\n"
+ " int bStep = BLOCK_SIZE * widthB;\n"
+ " __local double As[BLOCK_SIZE][BLOCK_SIZE];\n"
+ " __local double Bs[BLOCK_SIZE][BLOCK_SIZE];\n"
+ " double Dsub = 0;\n"
+ " for(int a = aBegin, b = bBegin; a < aEnd; a += aStep, b += bStep){\n"
+ " As[ty][tx] = A[a + widthA * ty + tx];\n"
+ " Bs[ty][tx] = B[b + widthB * ty + tx];\n"
+ " barrier(CLK_LOCAL_MEM_FENCE);\n"
+ " Dsub += As[ty][0] * Bs[0][tx];\n"
+ " Dsub += As[ty][1] * Bs[1][tx];\n"
+ " Dsub += As[ty][2] * Bs[2][tx];\n"
+ " Dsub += As[ty][3] * Bs[3][tx];\n"
+ " Dsub += As[ty][4] * Bs[4][tx];\n"
+ " Dsub += As[ty][5] * Bs[5][tx];\n"
+ " Dsub += As[ty][6] * Bs[6][tx];\n"
+ " Dsub += As[ty][7] * Bs[7][tx];\n"
+ " Dsub = fmod(Dsub, mod);\n"
+ " Dsub += As[ty][8] * Bs[8][tx];\n"
+ " Dsub += As[ty][9] * Bs[9][tx];\n"
+ " Dsub += As[ty][10] * Bs[10][tx];\n"
+ " Dsub += As[ty][11] * Bs[11][tx];\n"
+ " Dsub += As[ty][12] * Bs[12][tx];\n"
+ " Dsub += As[ty][13] * Bs[13][tx];\n"
+ " Dsub += As[ty][14] * Bs[14][tx];\n"
+ " Dsub += As[ty][15] * Bs[15][tx];\n"
+ " Dsub = fmod(Dsub, mod);\n"
+ " barrier(CLK_LOCAL_MEM_FENCE);\n"
+ " }\n"
+ " int d = widthB * BLOCK_SIZE * by + BLOCK_SIZE * bx;\n"
+ " double c = C[d + ty * widthB + tx];\n"
+ " Dsub = Dsub + c;\n"
+ " Dsub = fmod(Dsub, mod);\n"
+ " D[d + ty * widthB + tx] = Dsub;\n"
+ "}\n"
+ };
+
+ const char* matrixAxpyKernelModular16SP = {
+ "#define BLOCK_SIZE 16\n"
+ "__kernel void matrixAxpyKernelModular16SP(__global float* D, __global float* A, __global float* B,\n"
+ " __global float* C, const int widthA, const int widthB, const float mod){\n"
+ " int bx = get_group_id(0);\n"
+ " int by = get_group_id(1);\n"
+ " int tx = get_local_id(0);\n"
+ " int ty = get_local_id(1);\n"
+ " int aBegin= widthA * BLOCK_SIZE * by;\n"
+ " int aEnd = aBegin + widthA - 1;\n"
+ " int aStep = BLOCK_SIZE;\n"
+ " int bBegin = BLOCK_SIZE * bx;\n"
+ " int bStep = BLOCK_SIZE * widthB;\n"
+ " __local float As[BLOCK_SIZE][BLOCK_SIZE];\n"
+ " __local float Bs[BLOCK_SIZE][BLOCK_SIZE];\n"
+ " float Dsub = 0;\n"
+ " for(int a = aBegin, b = bBegin; a < aEnd; a += aStep, b += bStep){\n"
+ " As[ty][tx] = A[a + widthA * ty + tx];\n"
+ " Bs[ty][tx] = B[b + widthB * ty + tx];\n"
+ " barrier(CLK_LOCAL_MEM_FENCE);\n"
+ " Dsub += As[ty][0] * Bs[0][tx];\n"
+ " Dsub += As[ty][1] * Bs[1][tx];\n"
+ " Dsub += As[ty][2] * Bs[2][tx];\n"
+ " Dsub += As[ty][3] * Bs[3][tx];\n"
+ " Dsub += As[ty][4] * Bs[4][tx];\n"
+ " Dsub += As[ty][5] * Bs[5][tx];\n"
+ " Dsub += As[ty][6] * Bs[6][tx];\n"
+ " Dsub += As[ty][7] * Bs[7][tx];\n"
+ " Dsub += As[ty][8] * Bs[8][tx];\n"
+ " Dsub += As[ty][9] * Bs[9][tx];\n"
+ " Dsub += As[ty][10] * Bs[10][tx];\n"
+ " Dsub += As[ty][11] * Bs[11][tx];\n"
+ " Dsub += As[ty][12] * Bs[12][tx];\n"
+ " Dsub += As[ty][13] * Bs[13][tx];\n"
+ " Dsub += As[ty][14] * Bs[14][tx];\n"
+ " Dsub += As[ty][15] * Bs[15][tx];\n"
+ " Dsub = fmod(Dsub, mod);\n"
+ " barrier(CLK_LOCAL_MEM_FENCE);\n"
+ " }\n"
+ " int d = widthB * BLOCK_SIZE * by + BLOCK_SIZE * bx;\n"
+ " float c = C[d + ty * widthB + tx];\n"
+ " Dsub = Dsub + c;\n"
+ " Dsub = fmod(Dsub, mod);\n"
+ " D[d + ty * widthB + tx] = Dsub;\n"
+ "}\n"
+ };
+
+ const char* matrixAxpyKernelModular32DP = {
+ "#define BLOCK_SIZE 16\n"
+ "#pragma OPENCL EXTENSION cl_khr_fp64 : enable\n"
+ "__kernel void matrixAxpyKernelModular32DP(__global double* D, __global double* A, __global double* B,\n"
+ " __global double* C, const int widthA, const int widthB, const double mod){\n"
+ " int bx = get_group_id(0);\n"
+ " int by = get_group_id(1);\n"
+ " int tx = get_local_id(0);\n"
+ " int ty = get_local_id(1);\n"
+ " int aBegin= widthA * BLOCK_SIZE * by;\n"
+ " int aEnd = aBegin + widthA - 1;\n"
+ " int aStep = BLOCK_SIZE;\n"
+ " int bBegin = BLOCK_SIZE * bx;\n"
+ " int bStep = BLOCK_SIZE * widthB;\n"
+ " __local double As[BLOCK_SIZE][BLOCK_SIZE];\n"
+ " __local double Bs[BLOCK_SIZE][BLOCK_SIZE];\n"
+ " double Dsub = 0;\n"
+ " int mCount = 0;\n"
+ " for(int a = aBegin, b = bBegin; a < aEnd; a += aStep, b += bStep){\n"
+ " As[ty][tx] = A[a + widthA * ty + tx];\n"
+ " Bs[ty][tx] = B[b + widthB * ty + tx];\n"
+ " barrier(CLK_LOCAL_MEM_FENCE);\n"
+ " Dsub += As[ty][0] * Bs[0][tx];\n"
+ " Dsub += As[ty][1] * Bs[1][tx];\n"
+ " Dsub += As[ty][2] * Bs[2][tx];\n"
+ " Dsub += As[ty][3] * Bs[3][tx];\n"
+ " Dsub += As[ty][4] * Bs[4][tx];\n"
+ " Dsub += As[ty][5] * Bs[5][tx];\n"
+ " Dsub += As[ty][6] * Bs[6][tx];\n"
+ " Dsub += As[ty][7] * Bs[7][tx];\n"
+ " Dsub += As[ty][8] * Bs[8][tx];\n"
+ " Dsub += As[ty][9] * Bs[9][tx];\n"
+ " Dsub += As[ty][10] * Bs[10][tx];\n"
+ " Dsub += As[ty][11] * Bs[11][tx];\n"
+ " Dsub += As[ty][12] * Bs[12][tx];\n"
+ " Dsub += As[ty][13] * Bs[13][tx];\n"
+ " Dsub += As[ty][14] * Bs[14][tx];\n"
+ " Dsub += As[ty][15] * Bs[15][tx];\n"
+ " mCount++;\n"
+ " if(mCount == 2){\n"
+ " Dsub = fmod(Dsub, mod);\n"
+ " mCount = 0;\n"
+ " }\n"
+ " barrier(CLK_LOCAL_MEM_FENCE);\n"
+ " }\n"
+ " Dsub = fmod(Dsub, mod);\n"
+ " int d = widthB * BLOCK_SIZE * by + BLOCK_SIZE * bx;\n"
+ " double c = C[d + ty * widthB + tx];\n"
+ " Dsub = Dsub + c;\n"
+ " Dsub = fmod(Dsub, mod);\n"
+ " D[d + ty * widthB + tx] = Dsub;\n"
+ "}\n"
+ };
+
+ const char* matrixAxpyKernelModular32SP = {
+ "#define BLOCK_SIZE 16\n"
+ "__kernel void matrixAxpyKernelModular32SP(__global float* D, __global float* A, __global float* B,\n"
+ " __global float* C, const int widthA, const int widthB, const float mod){\n"
+ " int bx = get_group_id(0);\n"
+ " int by = get_group_id(1);\n"
+ " int tx = get_local_id(0);\n"
+ " int ty = get_local_id(1);\n"
+ " int aBegin= widthA * BLOCK_SIZE * by;\n"
+ " int aEnd = aBegin + widthA - 1;\n"
+ " int aStep = BLOCK_SIZE;\n"
+ " int bBegin = BLOCK_SIZE * bx;\n"
+ " int bStep = BLOCK_SIZE * widthB;\n"
+ " __local float As[BLOCK_SIZE][BLOCK_SIZE];\n"
+ " __local float Bs[BLOCK_SIZE][BLOCK_SIZE];\n"
+ " float Dsub = 0;\n"
+ " int mCount = 0;\n"
+ " for(int a = aBegin, b = bBegin; a < aEnd; a += aStep, b += bStep){\n"
+ " As[ty][tx] = A[a + widthA * ty + tx];\n"
+ " Bs[ty][tx] = B[b + widthB * ty + tx];\n"
+ " barrier(CLK_LOCAL_MEM_FENCE);\n"
+ " Dsub += As[ty][0] * Bs[0][tx];\n"
+ " Dsub += As[ty][1] * Bs[1][tx];\n"
+ " Dsub += As[ty][2] * Bs[2][tx];\n"
+ " Dsub += As[ty][3] * Bs[3][tx];\n"
+ " Dsub += As[ty][4] * Bs[4][tx];\n"
+ " Dsub += As[ty][5] * Bs[5][tx];\n"
+ " Dsub += As[ty][6] * Bs[6][tx];\n"
+ " Dsub += As[ty][7] * Bs[7][tx];\n"
+ " Dsub += As[ty][8] * Bs[8][tx];\n"
+ " Dsub += As[ty][9] * Bs[9][tx];\n"
+ " Dsub += As[ty][10] * Bs[10][tx];\n"
+ " Dsub += As[ty][11] * Bs[11][tx];\n"
+ " Dsub += As[ty][12] * Bs[12][tx];\n"
+ " Dsub += As[ty][13] * Bs[13][tx];\n"
+ " Dsub += As[ty][14] * Bs[14][tx];\n"
+ " Dsub += As[ty][15] * Bs[15][tx];\n"
+ " mCount++;\n"
+ " if(mCount == 2){\n"
+ " Dsub = fmod(Dsub, mod);\n"
+ " mCount = 0;\n"
+ " }\n"
+ " barrier(CLK_LOCAL_MEM_FENCE);\n"
+ " }\n"
+ " Dsub = fmod(Dsub, mod);\n"
+ " int d = widthB * BLOCK_SIZE * by + BLOCK_SIZE * bx;\n"
+ " float c = C[d + ty * widthB + tx];\n"
+ " Dsub = Dsub + c;\n"
+ " Dsub = fmod(Dsub, mod);\n"
+ " D[d + ty * widthB + tx] = Dsub;\n"
+ "}\n"
+ };
+
+ const char* matrixAxpyKernelModular1024DP = {
+ "#define BLOCK_SIZE 16\n"
+ "#pragma OPENCL EXTENSION cl_khr_fp64 : enable\n"
+ "__kernel void matrixAxpyKernelModular1024DP(__global double* D, __global double* A, __global double* B,\n"
+ " __global double* C, const int widthA, const int widthB, const double mod){\n"
+ " int bx = get_group_id(0);\n"
+ " int by = get_group_id(1);\n"
+ " int tx = get_local_id(0);\n"
+ " int ty = get_local_id(1);\n"
+ " int aBegin= widthA * BLOCK_SIZE * by;\n"
+ " int aEnd = aBegin + widthA - 1;\n"
+ " int aStep = BLOCK_SIZE;\n"
+ " int bBegin = BLOCK_SIZE * bx;\n"
+ " int bStep = BLOCK_SIZE * widthB;\n"
+ " __local double As[BLOCK_SIZE][BLOCK_SIZE];\n"
+ " __local double Bs[BLOCK_SIZE][BLOCK_SIZE];\n"
+ " double Dsub = 0;\n"
+ " int mCount = 0;\n"
+ " for(int a = aBegin, b = bBegin; a < aEnd; a += aStep, b += bStep){\n"
+ " As[ty][tx] = A[a + widthA * ty + tx];\n"
+ " Bs[ty][tx] = B[b + widthB * ty + tx];\n"
+ " barrier(CLK_LOCAL_MEM_FENCE);\n"
+ " Dsub += As[ty][0] * Bs[0][tx];\n"
+ " Dsub += As[ty][1] * Bs[1][tx];\n"
+ " Dsub += As[ty][2] * Bs[2][tx];\n"
+ " Dsub += As[ty][3] * Bs[3][tx];\n"
+ " Dsub += As[ty][4] * Bs[4][tx];\n"
+ " Dsub += As[ty][5] * Bs[5][tx];\n"
+ " Dsub += As[ty][6] * Bs[6][tx];\n"
+ " Dsub += As[ty][7] * Bs[7][tx];\n"
+ " Dsub += As[ty][8] * Bs[8][tx];\n"
+ " Dsub += As[ty][9] * Bs[9][tx];\n"
+ " Dsub += As[ty][10] * Bs[10][tx];\n"
+ " Dsub += As[ty][11] * Bs[11][tx];\n"
+ " Dsub += As[ty][12] * Bs[12][tx];\n"
+ " Dsub += As[ty][13] * Bs[13][tx];\n"
+ " Dsub += As[ty][14] * Bs[14][tx];\n"
+ " Dsub += As[ty][15] * Bs[15][tx];\n"
+ " mCount++;\n"
+ " if(mCount == 64){\n"
+ " Dsub = fmod(Dsub, mod);\n"
+ " mCount = 0;\n"
+ " }\n"
+ " barrier(CLK_LOCAL_MEM_FENCE);\n"
+ " }\n"
+ " Dsub = fmod(Dsub, mod);\n"
+ " int d = widthB * BLOCK_SIZE * by + BLOCK_SIZE * bx;\n"
+ " double c = C[d + ty * widthB + tx];\n"
+ " Dsub = Dsub + c;\n"
+ " Dsub = fmod(Dsub, mod);\n"
+ " D[d + ty * widthB + tx] = Dsub;\n"
+ "}\n"
+ };
+
+ const char* matrixAxpyKernelModular1024SP = {
+ "#define BLOCK_SIZE 16\n"
+ "__kernel void matrixAxpyKernelModular1024SP(__global float* D, __global float* A, __global float* B,\n"
+ " __global float* C, const int widthA, const int widthB, const float mod){\n"
+ " int bx = get_group_id(0);\n"
+ " int by = get_group_id(1);\n"
+ " int tx = get_local_id(0);\n"
+ " int ty = get_local_id(1);\n"
+ " int aBegin= widthA * BLOCK_SIZE * by;\n"
+ " int aEnd = aBegin + widthA - 1;\n"
+ " int aStep = BLOCK_SIZE;\n"
+ " int bBegin = BLOCK_SIZE * bx;\n"
+ " int bStep = BLOCK_SIZE * widthB;\n"
+ " __local float As[BLOCK_SIZE][BLOCK_SIZE];\n"
+ " __local float Bs[BLOCK_SIZE][BLOCK_SIZE];\n"
+ " float Dsub = 0;\n"
+ " int mCount = 0;\n"
+ " for(int a = aBegin, b = bBegin; a < aEnd; a += aStep, b += bStep){\n"
+ " As[ty][tx] = A[a + widthA * ty + tx];\n"
+ " Bs[ty][tx] = B[b + widthB * ty + tx];\n"
+ " barrier(CLK_LOCAL_MEM_FENCE);\n"
+ " Dsub += As[ty][0] * Bs[0][tx];\n"
+ " Dsub += As[ty][1] * Bs[1][tx];\n"
+ " Dsub += As[ty][2] * Bs[2][tx];\n"
+ " Dsub += As[ty][3] * Bs[3][tx];\n"
+ " Dsub += As[ty][4] * Bs[4][tx];\n"
+ " Dsub += As[ty][5] * Bs[5][tx];\n"
+ " Dsub += As[ty][6] * Bs[6][tx];\n"
+ " Dsub += As[ty][7] * Bs[7][tx];\n"
+ " Dsub += As[ty][8] * Bs[8][tx];\n"
+ " Dsub += As[ty][9] * Bs[9][tx];\n"
+ " Dsub += As[ty][10] * Bs[10][tx];\n"
+ " Dsub += As[ty][11] * Bs[11][tx];\n"
+ " Dsub += As[ty][12] * Bs[12][tx];\n"
+ " Dsub += As[ty][13] * Bs[13][tx];\n"
+ " Dsub += As[ty][14] * Bs[14][tx];\n"
+ " Dsub += As[ty][15] * Bs[15][tx];\n"
+ " mCount++;\n"
+ " if(mCount == 64){\n"
+ " Dsub = fmod(Dsub, mod);\n"
+ " mCount = 0;\n"
+ " }\n"
+ " barrier(CLK_LOCAL_MEM_FENCE);\n"
+ " }\n"
+ " Dsub = fmod(Dsub, mod);\n"
+ " int d = widthB * BLOCK_SIZE * by + BLOCK_SIZE * bx;\n"
+ " float c = C[d + ty * widthB + tx];\n"
+ " Dsub = Dsub + c;\n"
+ " Dsub = fmod(Dsub, mod);\n"
+ " D[d + ty * widthB + tx] = Dsub;\n"
+ "}\n"
+ };
+
+ const char* matrixMaxpyKernelModular1DP = {
+ "#define BLOCK_SIZE 16\n"
+ "#pragma OPENCL EXTENSION cl_khr_fp64 : enable\n"
+ "__kernel void matrixMaxpyKernelModular1DP(__global double* D, __global double* A, __global double* B,\n"
+ " __global double* C, const int widthA, const int widthB, const double mod){\n"
+ " int bx = get_group_id(0);\n"
+ " int by = get_group_id(1);\n"
+ " int tx = get_local_id(0);\n"
+ " int ty = get_local_id(1);\n"
+ " int aBegin= widthA * BLOCK_SIZE * by;\n"
+ " int aEnd = aBegin + widthA - 1;\n"
+ " int aStep = BLOCK_SIZE;\n"
+ " int bBegin = BLOCK_SIZE * bx;\n"
+ " int bStep = BLOCK_SIZE * widthB;\n"
+ " __local double As[BLOCK_SIZE][BLOCK_SIZE];\n"
+ " __local double Bs[BLOCK_SIZE][BLOCK_SIZE];\n"
+ " double Dsub = 0;\n"
+ " for(int a = aBegin, b = bBegin; a < aEnd; a += aStep, b += bStep){\n"
+ " As[ty][tx] = A[a + widthA * ty + tx];\n"
+ " Bs[ty][tx] = B[b + widthB * ty + tx];\n"
+ " barrier(CLK_LOCAL_MEM_FENCE);\n"
+ " Dsub += As[ty][0] * Bs[0][tx];\n"
+ " Dsub = fmod(Dsub, mod);\n"
+ " Dsub += As[ty][1] * Bs[1][tx];\n"
+ " Dsub = fmod(Dsub, mod);\n"
+ " Dsub += As[ty][2] * Bs[2][tx];\n"
+ " Dsub = fmod(Dsub, mod);\n"
+ " Dsub += As[ty][3] * Bs[3][tx];\n"
+ " Dsub = fmod(Dsub, mod);\n"
+ " Dsub += As[ty][4] * Bs[4][tx];\n"
+ " Dsub = fmod(Dsub, mod);\n"
+ " Dsub += As[ty][5] * Bs[5][tx];\n"
+ " Dsub = fmod(Dsub, mod);\n"
+ " Dsub += As[ty][6] * Bs[6][tx];\n"
+ " Dsub = fmod(Dsub, mod);\n"
+ " Dsub += As[ty][7] * Bs[7][tx];\n"
+ " Dsub = fmod(Dsub, mod);\n"
+ " Dsub += As[ty][8] * Bs[8][tx];\n"
+ " Dsub = fmod(Dsub, mod);\n"
+ " Dsub += As[ty][9] * Bs[9][tx];\n"
+ " Dsub = fmod(Dsub, mod);\n"
+ " Dsub += As[ty][10] * Bs[10][tx];\n"
+ " Dsub = fmod(Dsub, mod);\n"
+ " Dsub += As[ty][11] * Bs[11][tx];\n"
+ " Dsub = fmod(Dsub, mod);\n"
+ " Dsub += As[ty][12] * Bs[12][tx];\n"
+ " Dsub = fmod(Dsub, mod);\n"
+ " Dsub += As[ty][13] * Bs[13][tx];\n"
+ " Dsub = fmod(Dsub, mod);\n"
+ " Dsub += As[ty][14] * Bs[14][tx];\n"
+ " Dsub = fmod(Dsub, mod);\n"
+ " Dsub += As[ty][15] * Bs[15][tx];\n"
+ " Dsub = fmod(Dsub, mod);\n"
+ " barrier(CLK_LOCAL_MEM_FENCE);\n"
+ " }\n"
+ " int d = widthB * BLOCK_SIZE * by + BLOCK_SIZE * bx;\n"
+ " double c = C[d + ty * widthB + tx];\n"
+ " Dsub = c - Dsub;\n"
+ " Dsub = fmod((mod + Dsub), mod);\n"
+ " D[d + ty * widthB + tx] = Dsub;\n"
+ "}\n"
+ };
+
+ const char* matrixMaxpyKernelModular1SP = {
+ "#define BLOCK_SIZE 16\n"
+ "__kernel void matrixMaxpyKernelModular1SP(__global float* D, __global float* A, __global float* B,\n"
+ " __global float* C, const int widthA, const int widthB, const float mod){\n"
+ " int bx = get_group_id(0);\n"
+ " int by = get_group_id(1);\n"
+ " int tx = get_local_id(0);\n"
+ " int ty = get_local_id(1);\n"
+ " int aBegin= widthA * BLOCK_SIZE * by;\n"
+ " int aEnd = aBegin + widthA - 1;\n"
+ " int aStep = BLOCK_SIZE;\n"
+ " int bBegin = BLOCK_SIZE * bx;\n"
+ " int bStep = BLOCK_SIZE * widthB;\n"
+ " __local float As[BLOCK_SIZE][BLOCK_SIZE];\n"
+ " __local float Bs[BLOCK_SIZE][BLOCK_SIZE];\n"
+ " float Dsub = 0;\n"
+ " for(int a = aBegin, b = bBegin; a < aEnd; a += aStep, b += bStep){\n"
+ " As[ty][tx] = A[a + widthA * ty + tx];\n"
+ " Bs[ty][tx] = B[b + widthB * ty + tx];\n"
+ " barrier(CLK_LOCAL_MEM_FENCE);\n"
+ " Dsub += As[ty][0] * Bs[0][tx];\n"
+ " Dsub = fmod(Dsub, mod);\n"
+ " Dsub += As[ty][1] * Bs[1][tx];\n"
+ " Dsub = fmod(Dsub, mod);\n"
+ " Dsub += As[ty][2] * Bs[2][tx];\n"
+ " Dsub = fmod(Dsub, mod);\n"
+ " Dsub += As[ty][3] * Bs[3][tx];\n"
+ " Dsub = fmod(Dsub, mod);\n"
+ " Dsub += As[ty][4] * Bs[4][tx];\n"
+ " Dsub = fmod(Dsub, mod);\n"
+ " Dsub += As[ty][5] * Bs[5][tx];\n"
+ " Dsub = fmod(Dsub, mod);\n"
+ " Dsub += As[ty][6] * Bs[6][tx];\n"
+ " Dsub = fmod(Dsub, mod);\n"
+ " Dsub += As[ty][7] * Bs[7][tx];\n"
+ " Dsub = fmod(Dsub, mod);\n"
+ " Dsub += As[ty][8] * Bs[8][tx];\n"
+ " Dsub = fmod(Dsub, mod);\n"
+ " Dsub += As[ty][9] * Bs[9][tx];\n"
+ " Dsub = fmod(Dsub, mod);\n"
+ " Dsub += As[ty][10] * Bs[10][tx];\n"
+ " Dsub = fmod(Dsub, mod);\n"
+ " Dsub += As[ty][11] * Bs[11][tx];\n"
+ " Dsub = fmod(Dsub, mod);\n"
+ " Dsub += As[ty][12] * Bs[12][tx];\n"
+ " Dsub = fmod(Dsub, mod);\n"
+ " Dsub += As[ty][13] * Bs[13][tx];\n"
+ " Dsub = fmod(Dsub, mod);\n"
+ " Dsub += As[ty][14] * Bs[14][tx];\n"
+ " Dsub = fmod(Dsub, mod);\n"
+ " Dsub += As[ty][15] * Bs[15][tx];\n"
+ " Dsub = fmod(Dsub, mod);\n"
+ " barrier(CLK_LOCAL_MEM_FENCE);\n"
+ " }\n"
+ " int d = widthB * BLOCK_SIZE * by + BLOCK_SIZE * bx;\n"
+ " float c = C[d + ty * widthB + tx];\n"
+ " Dsub = c - Dsub;\n"
+ " Dsub = fmod((mod + Dsub), mod);\n"
+ " D[d + ty * widthB + tx] = Dsub;\n"
+ "}\n"
+ };
+
+ const char* matrixMaxpyKernelModular8DP = {
+ "#define BLOCK_SIZE 16\n"
+ "#pragma OPENCL EXTENSION cl_khr_fp64 : enable\n"
+ "__kernel void matrixMaxpyKernelModular8DP(__global double* D, __global double* A, __global double* B,\n"
+ " __global double* C, const int widthA, const int widthB, const double mod){\n"
+ " int bx = get_group_id(0);\n"
+ " int by = get_group_id(1);\n"
+ " int tx = get_local_id(0);\n"
+ " int ty = get_local_id(1);\n"
+ " int aBegin= widthA * BLOCK_SIZE * by;\n"
+ " int aEnd = aBegin + widthA - 1;\n"
+ " int aStep = BLOCK_SIZE;\n"
+ " int bBegin = BLOCK_SIZE * bx;\n"
+ " int bStep = BLOCK_SIZE * widthB;\n"
+ " __local double As[BLOCK_SIZE][BLOCK_SIZE];\n"
+ " __local double Bs[BLOCK_SIZE][BLOCK_SIZE];\n"
+ " double Dsub = 0;\n"
+ " for(int a = aBegin, b = bBegin; a < aEnd; a += aStep, b += bStep){\n"
+ " As[ty][tx] = A[a + widthA * ty + tx];\n"
+ " Bs[ty][tx] = B[b + widthB * ty + tx];\n"
+ " barrier(CLK_LOCAL_MEM_FENCE);\n"
+ " Dsub += As[ty][0] * Bs[0][tx];\n"
+ " Dsub += As[ty][1] * Bs[1][tx];\n"
+ " Dsub += As[ty][2] * Bs[2][tx];\n"
+ " Dsub += As[ty][3] * Bs[3][tx];\n"
+ " Dsub += As[ty][4] * Bs[4][tx];\n"
+ " Dsub += As[ty][5] * Bs[5][tx];\n"
+ " Dsub += As[ty][6] * Bs[6][tx];\n"
+ " Dsub += As[ty][7] * Bs[7][tx];\n"
+ " Dsub = fmod(Dsub, mod);\n"
+ " Dsub += As[ty][8] * Bs[8][tx];\n"
+ " Dsub += As[ty][9] * Bs[9][tx];\n"
+ " Dsub += As[ty][10] * Bs[10][tx];\n"
+ " Dsub += As[ty][11] * Bs[11][tx];\n"
+ " Dsub += As[ty][12] * Bs[12][tx];\n"
+ " Dsub += As[ty][13] * Bs[13][tx];\n"
+ " Dsub += As[ty][14] * Bs[14][tx];\n"
+ " Dsub += As[ty][15] * Bs[15][tx];\n"
+ " Dsub = fmod(Dsub, mod);\n"
+ " barrier(CLK_LOCAL_MEM_FENCE);\n"
+ " }\n"
+ " int d = widthB * BLOCK_SIZE * by + BLOCK_SIZE * bx;\n"
+ " double c = C[d + ty * widthB + tx];\n"
+ " Dsub = c - Dsub;\n"
+ " Dsub = fmod((mod + Dsub), mod);\n"
+ " D[d + ty * widthB + tx] = Dsub;\n"
+ "}\n"
+ };
+
+ const char* matrixMaxpyKernelModular16SP = {
+ "#define BLOCK_SIZE 16\n"
+ "__kernel void matrixMaxpyKernelModular16SP(__global float* D, __global float* A, __global float* B,\n"
+ " __global float* C, const int widthA, const int widthB, const float mod){\n"
+ " int bx = get_group_id(0);\n"
+ " int by = get_group_id(1);\n"
+ " int tx = get_local_id(0);\n"
+ " int ty = get_local_id(1);\n"
+ " int aBegin= widthA * BLOCK_SIZE * by;\n"
+ " int aEnd = aBegin + widthA - 1;\n"
+ " int aStep = BLOCK_SIZE;\n"
+ " int bBegin = BLOCK_SIZE * bx;\n"
+ " int bStep = BLOCK_SIZE * widthB;\n"
+ " __local float As[BLOCK_SIZE][BLOCK_SIZE];\n"
+ " __local float Bs[BLOCK_SIZE][BLOCK_SIZE];\n"
+ " float Dsub = 0;\n"
+ " for(int a = aBegin, b = bBegin; a < aEnd; a += aStep, b += bStep){\n"
+ " As[ty][tx] = A[a + widthA * ty + tx];\n"
+ " Bs[ty][tx] = B[b + widthB * ty + tx];\n"
+ " barrier(CLK_LOCAL_MEM_FENCE);\n"
+ " Dsub += As[ty][0] * Bs[0][tx];\n"
+ " Dsub += As[ty][1] * Bs[1][tx];\n"
+ " Dsub += As[ty][2] * Bs[2][tx];\n"
+ " Dsub += As[ty][3] * Bs[3][tx];\n"
+ " Dsub += As[ty][4] * Bs[4][tx];\n"
+ " Dsub += As[ty][5] * Bs[5][tx];\n"
+ " Dsub += As[ty][6] * Bs[6][tx];\n"
+ " Dsub += As[ty][7] * Bs[7][tx];\n"
+ " Dsub += As[ty][8] * Bs[8][tx];\n"
+ " Dsub += As[ty][9] * Bs[9][tx];\n"
+ " Dsub += As[ty][10] * Bs[10][tx];\n"
+ " Dsub += As[ty][11] * Bs[11][tx];\n"
+ " Dsub += As[ty][12] * Bs[12][tx];\n"
+ " Dsub += As[ty][13] * Bs[13][tx];\n"
+ " Dsub += As[ty][14] * Bs[14][tx];\n"
+ " Dsub += As[ty][15] * Bs[15][tx];\n"
+ " Dsub = fmod(Dsub, mod);\n"
+ " barrier(CLK_LOCAL_MEM_FENCE);\n"
+ " }\n"
+ " int d = widthB * BLOCK_SIZE * by + BLOCK_SIZE * bx;\n"
+ " float c = C[d + ty * widthB + tx];\n"
+ " Dsub = c - Dsub;\n"
+ " Dsub = fmod((mod + Dsub), mod);\n"
+ " D[d + ty * widthB + tx] = Dsub;\n"
+ "}\n"
+ };
+
+ const char* matrixMaxpyKernelModular32DP = {
+ "#define BLOCK_SIZE 16\n"
+ "#pragma OPENCL EXTENSION cl_khr_fp64 : enable\n"
+ "__kernel void matrixMaxpyKernelModular32DP(__global double* D, __global double* A, __global double* B,\n"
+ " __global double* C, const int widthA, const int widthB, const double mod){\n"
+ " int bx = get_group_id(0);\n"
+ " int by = get_group_id(1);\n"
+ " int tx = get_local_id(0);\n"
+ " int ty = get_local_id(1);\n"
+ " int aBegin= widthA * BLOCK_SIZE * by;\n"
+ " int aEnd = aBegin + widthA - 1;\n"
+ " int aStep = BLOCK_SIZE;\n"
+ " int bBegin = BLOCK_SIZE * bx;\n"
+ " int bStep = BLOCK_SIZE * widthB;\n"
+ " __local double As[BLOCK_SIZE][BLOCK_SIZE];\n"
+ " __local double Bs[BLOCK_SIZE][BLOCK_SIZE];\n"
+ " double Dsub = 0;\n"
+ " int mCount = 0;\n"
+ " for(int a = aBegin, b = bBegin; a < aEnd; a += aStep, b += bStep){\n"
+ " As[ty][tx] = A[a + widthA * ty + tx];\n"
+ " Bs[ty][tx] = B[b + widthB * ty + tx];\n"
+ " barrier(CLK_LOCAL_MEM_FENCE);\n"
+ " Dsub += As[ty][0] * Bs[0][tx];\n"
+ " Dsub += As[ty][1] * Bs[1][tx];\n"
+ " Dsub += As[ty][2] * Bs[2][tx];\n"
+ " Dsub += As[ty][3] * Bs[3][tx];\n"
+ " Dsub += As[ty][4] * Bs[4][tx];\n"
+ " Dsub += As[ty][5] * Bs[5][tx];\n"
+ " Dsub += As[ty][6] * Bs[6][tx];\n"
+ " Dsub += As[ty][7] * Bs[7][tx];\n"
+ " Dsub += As[ty][8] * Bs[8][tx];\n"
+ " Dsub += As[ty][9] * Bs[9][tx];\n"
+ " Dsub += As[ty][10] * Bs[10][tx];\n"
+ " Dsub += As[ty][11] * Bs[11][tx];\n"
+ " Dsub += As[ty][12] * Bs[12][tx];\n"
+ " Dsub += As[ty][13] * Bs[13][tx];\n"
+ " Dsub += As[ty][14] * Bs[14][tx];\n"
+ " Dsub += As[ty][15] * Bs[15][tx];\n"
+ " mCount++;\n"
+ " if(mCount == 2){\n"
+ " Dsub = fmod(Dsub, mod);\n"
+ " mCount = 0;\n"
+ " }\n"
+ " barrier(CLK_LOCAL_MEM_FENCE);\n"
+ " }\n"
+ " Dsub = fmod(Dsub, mod);\n"
+ " int d = widthB * BLOCK_SIZE * by + BLOCK_SIZE * bx;\n"
+ " double c = C[d + ty * widthB + tx];\n"
+ " Dsub = c - Dsub;\n"
+ " Dsub = fmod((mod + Dsub), mod);\n"
+ " D[d + ty * widthB + tx] = Dsub;\n"
+ "}\n"
+ };
+
+ const char* matrixMaxpyKernelModular32SP = {
+ "#define BLOCK_SIZE 16\n"
+ "__kernel void matrixMaxpyKernelModular32SP(__global float* D, __global float* A, __global float* B,\n"
+ " __global float* C, const int widthA, const int widthB, const float mod){\n"
+ " int bx = get_group_id(0);\n"
+ " int by = get_group_id(1);\n"
+ " int tx = get_local_id(0);\n"
+ " int ty = get_local_id(1);\n"
+ " int aBegin= widthA * BLOCK_SIZE * by;\n"
+ " int aEnd = aBegin + widthA - 1;\n"
+ " int aStep = BLOCK_SIZE;\n"
+ " int bBegin = BLOCK_SIZE * bx;\n"
+ " int bStep = BLOCK_SIZE * widthB;\n"
+ " __local float As[BLOCK_SIZE][BLOCK_SIZE];\n"
+ " __local float Bs[BLOCK_SIZE][BLOCK_SIZE];\n"
+ " float Dsub = 0;\n"
+ " int mCount = 0;\n"
+ " for(int a = aBegin, b = bBegin; a < aEnd; a += aStep, b += bStep){\n"
+ " As[ty][tx] = A[a + widthA * ty + tx];\n"
+ " Bs[ty][tx] = B[b + widthB * ty + tx];\n"
+ " barrier(CLK_LOCAL_MEM_FENCE);\n"
+ " Dsub += As[ty][0] * Bs[0][tx];\n"
+ " Dsub += As[ty][1] * Bs[1][tx];\n"
+ " Dsub += As[ty][2] * Bs[2][tx];\n"
+ " Dsub += As[ty][3] * Bs[3][tx];\n"
+ " Dsub += As[ty][4] * Bs[4][tx];\n"
+ " Dsub += As[ty][5] * Bs[5][tx];\n"
+ " Dsub += As[ty][6] * Bs[6][tx];\n"
+ " Dsub += As[ty][7] * Bs[7][tx];\n"
+ " Dsub += As[ty][8] * Bs[8][tx];\n"
+ " Dsub += As[ty][9] * Bs[9][tx];\n"
+ " Dsub += As[ty][10] * Bs[10][tx];\n"
+ " Dsub += As[ty][11] * Bs[11][tx];\n"
+ " Dsub += As[ty][12] * Bs[12][tx];\n"
+ " Dsub += As[ty][13] * Bs[13][tx];\n"
+ " Dsub += As[ty][14] * Bs[14][tx];\n"
+ " Dsub += As[ty][15] * Bs[15][tx];\n"
+ " mCount++;\n"
+ " if(mCount == 2){\n"
+ " Dsub = fmod(Dsub, mod);\n"
+ " mCount = 0;\n"
+ " }\n"
+ " barrier(CLK_LOCAL_MEM_FENCE);\n"
+ " }\n"
+ " Dsub = fmod(Dsub, mod);\n"
+ " int d = widthB * BLOCK_SIZE * by + BLOCK_SIZE * bx;\n"
+ " float c = C[d + ty * widthB + tx];\n"
+ " Dsub = c - Dsub;\n"
+ " Dsub = fmod((mod + Dsub), mod);\n"
+ " D[d + ty * widthB + tx] = Dsub;\n"
+ "}\n"
+ };
+
+ const char* matrixMaxpyKernelModular1024DP = {
+ "#define BLOCK_SIZE 16\n"
+ "#pragma OPENCL EXTENSION cl_khr_fp64 : enable\n"
+ "__kernel void matrixMaxpyKernelModular1024DP(__global double* D, __global double* A, __global double* B,\n"
+ " __global double* C, const int widthA, const int widthB, const double mod){\n"
+ " int bx = get_group_id(0);\n"
+ " int by = get_group_id(1);\n"
+ " int tx = get_local_id(0);\n"
+ " int ty = get_local_id(1);\n"
+ " int aBegin= widthA * BLOCK_SIZE * by;\n"
+ " int aEnd = aBegin + widthA - 1;\n"
+ " int aStep = BLOCK_SIZE;\n"
+ " int bBegin = BLOCK_SIZE * bx;\n"
+ " int bStep = BLOCK_SIZE * widthB;\n"
+ " __local double As[BLOCK_SIZE][BLOCK_SIZE];\n"
+ " __local double Bs[BLOCK_SIZE][BLOCK_SIZE];\n"
+ " double Dsub = 0;\n"
+ " int mCount = 0;\n"
+ " for(int a = aBegin, b = bBegin; a < aEnd; a += aStep, b += bStep){\n"
+ " As[ty][tx] = A[a + widthA * ty + tx];\n"
+ " Bs[ty][tx] = B[b + widthB * ty + tx];\n"
+ " barrier(CLK_LOCAL_MEM_FENCE);\n"
+ " Dsub += As[ty][0] * Bs[0][tx];\n"
+ " Dsub += As[ty][1] * Bs[1][tx];\n"
+ " Dsub += As[ty][2] * Bs[2][tx];\n"
+ " Dsub += As[ty][3] * Bs[3][tx];\n"
+ " Dsub += As[ty][4] * Bs[4][tx];\n"
+ " Dsub += As[ty][5] * Bs[5][tx];\n"
+ " Dsub += As[ty][6] * Bs[6][tx];\n"
+ " Dsub += As[ty][7] * Bs[7][tx];\n"
+ " Dsub += As[ty][8] * Bs[8][tx];\n"
+ " Dsub += As[ty][9] * Bs[9][tx];\n"
+ " Dsub += As[ty][10] * Bs[10][tx];\n"
+ " Dsub += As[ty][11] * Bs[11][tx];\n"
+ " Dsub += As[ty][12] * Bs[12][tx];\n"
+ " Dsub += As[ty][13] * Bs[13][tx];\n"
+ " Dsub += As[ty][14] * Bs[14][tx];\n"
+ " Dsub += As[ty][15] * Bs[15][tx];\n"
+ " mCount++;\n"
+ " if(mCount == 64){\n"
+ " Dsub = fmod(Dsub, mod);\n"
+ " mCount = 0;\n"
+ " }\n"
+ " barrier(CLK_LOCAL_MEM_FENCE);\n"
+ " }\n"
+ " Dsub = fmod(Dsub, mod);\n"
+ " int d = widthB * BLOCK_SIZE * by + BLOCK_SIZE * bx;\n"
+ " double c = C[d + ty * widthB + tx];\n"
+ " Dsub = c - Dsub;\n"
+ " Dsub = fmod((mod + Dsub), mod);\n"
+ " D[d + ty * widthB + tx] = Dsub;\n"
+ "}\n"
+ };
+
+ const char* matrixMaxpyKernelModular1024SP = {
+ "#define BLOCK_SIZE 16\n"
+ "__kernel void matrixMaxpyKernelModular1024SP(__global float* D, __global float* A, __global float* B,\n"
+ " __global float* C, const int widthA, const int widthB, const float mod){\n"
+ " int bx = get_group_id(0);\n"
+ " int by = get_group_id(1);\n"
+ " int tx = get_local_id(0);\n"
+ " int ty = get_local_id(1);\n"
+ " int aBegin= widthA * BLOCK_SIZE * by;\n"
+ " int aEnd = aBegin + widthA - 1;\n"
+ " int aStep = BLOCK_SIZE;\n"
+ " int bBegin = BLOCK_SIZE * bx;\n"
+ " int bStep = BLOCK_SIZE * widthB;\n"
+ " __local float As[BLOCK_SIZE][BLOCK_SIZE];\n"
+ " __local float Bs[BLOCK_SIZE][BLOCK_SIZE];\n"
+ " float Dsub = 0;\n"
+ " int mCount = 0;\n"
+ " for(int a = aBegin, b = bBegin; a < aEnd; a += aStep, b += bStep){\n"
+ " As[ty][tx] = A[a + widthA * ty + tx];\n"
+ " Bs[ty][tx] = B[b + widthB * ty + tx];\n"
+ " barrier(CLK_LOCAL_MEM_FENCE);\n"
+ " Dsub += As[ty][0] * Bs[0][tx];\n"
+ " Dsub += As[ty][1] * Bs[1][tx];\n"
+ " Dsub += As[ty][2] * Bs[2][tx];\n"
+ " Dsub += As[ty][3] * Bs[3][tx];\n"
+ " Dsub += As[ty][4] * Bs[4][tx];\n"
+ " Dsub += As[ty][5] * Bs[5][tx];\n"
+ " Dsub += As[ty][6] * Bs[6][tx];\n"
+ " Dsub += As[ty][7] * Bs[7][tx];\n"
+ " Dsub += As[ty][8] * Bs[8][tx];\n"
+ " Dsub += As[ty][9] * Bs[9][tx];\n"
+ " Dsub += As[ty][10] * Bs[10][tx];\n"
+ " Dsub += As[ty][11] * Bs[11][tx];\n"
+ " Dsub += As[ty][12] * Bs[12][tx];\n"
+ " Dsub += As[ty][13] * Bs[13][tx];\n"
+ " Dsub += As[ty][14] * Bs[14][tx];\n"
+ " Dsub += As[ty][15] * Bs[15][tx];\n"
+ " mCount++;\n"
+ " if(mCount == 64){\n"
+ " Dsub = fmod(Dsub, mod);\n"
+ " mCount = 0;\n"
+ " }\n"
+ " barrier(CLK_LOCAL_MEM_FENCE);\n"
+ " }\n"
+ " Dsub = fmod(Dsub, mod);\n"
+ " int d = widthB * BLOCK_SIZE * by + BLOCK_SIZE * bx;\n"
+ " float c = C[d + ty * widthB + tx];\n"
+ " Dsub = c - Dsub;\n"
+ " Dsub = fmod((mod + Dsub), mod);\n"
+ " D[d + ty * widthB + tx] = Dsub;\n"
+ "}\n"
+ };
+
+ const char* matrixAxmyKernelModular1DP = {
+ "#define BLOCK_SIZE 16\n"
+ "#pragma OPENCL EXTENSION cl_khr_fp64 : enable\n"
+ "__kernel void matrixAxmyKernelModular1DP(__global double* D, __global double* A, __global double* B,\n"
+ " __global double* C, const int widthA, const int widthB, const double mod){\n"
+ " int bx = get_group_id(0);\n"
+ " int by = get_group_id(1);\n"
+ " int tx = get_local_id(0);\n"
+ " int ty = get_local_id(1);\n"
+ " int aBegin= widthA * BLOCK_SIZE * by;\n"
+ " int aEnd = aBegin + widthA - 1;\n"
+ " int aStep = BLOCK_SIZE;\n"
+ " int bBegin = BLOCK_SIZE * bx;\n"
+ " int bStep = BLOCK_SIZE * widthB;\n"
+ " __local double As[BLOCK_SIZE][BLOCK_SIZE];\n"
+ " __local double Bs[BLOCK_SIZE][BLOCK_SIZE];\n"
+ " double Dsub = 0;\n"
+ " for(int a = aBegin, b = bBegin; a < aEnd; a += aStep, b += bStep){\n"
+ " As[ty][tx] = A[a + widthA * ty + tx];\n"
+ " Bs[ty][tx] = B[b + widthB * ty + tx];\n"
+ " barrier(CLK_LOCAL_MEM_FENCE);\n"
+ " Dsub += As[ty][0] * Bs[0][tx];\n"
+ " Dsub = fmod(Dsub, mod);\n"
+ " Dsub += As[ty][1] * Bs[1][tx];\n"
+ " Dsub = fmod(Dsub, mod);\n"
+ " Dsub += As[ty][2] * Bs[2][tx];\n"
+ " Dsub = fmod(Dsub, mod);\n"
+ " Dsub += As[ty][3] * Bs[3][tx];\n"
+ " Dsub = fmod(Dsub, mod);\n"
+ " Dsub += As[ty][4] * Bs[4][tx];\n"
+ " Dsub = fmod(Dsub, mod);\n"
+ " Dsub += As[ty][5] * Bs[5][tx];\n"
+ " Dsub = fmod(Dsub, mod);\n"
+ " Dsub += As[ty][6] * Bs[6][tx];\n"
+ " Dsub = fmod(Dsub, mod);\n"
+ " Dsub += As[ty][7] * Bs[7][tx];\n"
+ " Dsub = fmod(Dsub, mod);\n"
+ " Dsub += As[ty][8] * Bs[8][tx];\n"
+ " Dsub = fmod(Dsub, mod);\n"
+ " Dsub += As[ty][9] * Bs[9][tx];\n"
+ " Dsub = fmod(Dsub, mod);\n"
+ " Dsub += As[ty][10] * Bs[10][tx];\n"
+ " Dsub = fmod(Dsub, mod);\n"
+ " Dsub += As[ty][11] * Bs[11][tx];\n"
+ " Dsub = fmod(Dsub, mod);\n"
+ " Dsub += As[ty][12] * Bs[12][tx];\n"
+ " Dsub = fmod(Dsub, mod);\n"
+ " Dsub += As[ty][13] * Bs[13][tx];\n"
+ " Dsub = fmod(Dsub, mod);\n"
+ " Dsub += As[ty][14] * Bs[14][tx];\n"
+ " Dsub = fmod(Dsub, mod);\n"
+ " Dsub += As[ty][15] * Bs[15][tx];\n"
+ " Dsub = fmod(Dsub, mod);\n"
+ " barrier(CLK_LOCAL_MEM_FENCE);\n"
+ " }\n"
+ " int d = widthB * BLOCK_SIZE * by + BLOCK_SIZE * bx;\n"
+ " double c = C[d + ty * widthB + tx];\n"
+ " Dsub = Dsub - c;\n"
+ " Dsub = fmod((mod + Dsub), mod);\n"
+ " D[d + ty * widthB + tx] = Dsub;\n"
+ "}\n"
+ };
+
+ const char* matrixAxmyKernelModular1SP = {
+ "#define BLOCK_SIZE 16\n"
+ "__kernel void matrixAxmyKernelModular1SP(__global float* D, __global float* A, __global float* B,\n"
+ " __global float* C, const int widthA, const int widthB, const float mod){\n"
+ " int bx = get_group_id(0);\n"
+ " int by = get_group_id(1);\n"
+ " int tx = get_local_id(0);\n"
+ " int ty = get_local_id(1);\n"
+ " int aBegin= widthA * BLOCK_SIZE * by;\n"
+ " int aEnd = aBegin + widthA - 1;\n"
+ " int aStep = BLOCK_SIZE;\n"
+ " int bBegin = BLOCK_SIZE * bx;\n"
+ " int bStep = BLOCK_SIZE * widthB;\n"
+ " __local float As[BLOCK_SIZE][BLOCK_SIZE];\n"
+ " __local float Bs[BLOCK_SIZE][BLOCK_SIZE];\n"
+ " float Dsub = 0;\n"
+ " for(int a = aBegin, b = bBegin; a < aEnd; a += aStep, b += bStep){\n"
+ " As[ty][tx] = A[a + widthA * ty + tx];\n"
+ " Bs[ty][tx] = B[b + widthB * ty + tx];\n"
+ " barrier(CLK_LOCAL_MEM_FENCE);\n"
+ " Dsub += As[ty][0] * Bs[0][tx];\n"
+ " Dsub = fmod(Dsub, mod);\n"
+ " Dsub += As[ty][1] * Bs[1][tx];\n"
+ " Dsub = fmod(Dsub, mod);\n"
+ " Dsub += As[ty][2] * Bs[2][tx];\n"
+ " Dsub = fmod(Dsub, mod);\n"
+ " Dsub += As[ty][3] * Bs[3][tx];\n"
+ " Dsub = fmod(Dsub, mod);\n"
+ " Dsub += As[ty][4] * Bs[4][tx];\n"
+ " Dsub = fmod(Dsub, mod);\n"
+ " Dsub += As[ty][5] * Bs[5][tx];\n"
+ " Dsub = fmod(Dsub, mod);\n"
+ " Dsub += As[ty][6] * Bs[6][tx];\n"
+ " Dsub = fmod(Dsub, mod);\n"
+ " Dsub += As[ty][7] * Bs[7][tx];\n"
+ " Dsub = fmod(Dsub, mod);\n"
+ " Dsub += As[ty][8] * Bs[8][tx];\n"
+ " Dsub = fmod(Dsub, mod);\n"
+ " Dsub += As[ty][9] * Bs[9][tx];\n"
+ " Dsub = fmod(Dsub, mod);\n"
+ " Dsub += As[ty][10] * Bs[10][tx];\n"
+ " Dsub = fmod(Dsub, mod);\n"
+ " Dsub += As[ty][11] * Bs[11][tx];\n"
+ " Dsub = fmod(Dsub, mod);\n"
+ " Dsub += As[ty][12] * Bs[12][tx];\n"
+ " Dsub = fmod(Dsub, mod);\n"
+ " Dsub += As[ty][13] * Bs[13][tx];\n"
+ " Dsub = fmod(Dsub, mod);\n"
+ " Dsub += As[ty][14] * Bs[14][tx];\n"
+ " Dsub = fmod(Dsub, mod);\n"
+ " Dsub += As[ty][15] * Bs[15][tx];\n"
+ " Dsub = fmod(Dsub, mod);\n"
+ " barrier(CLK_LOCAL_MEM_FENCE);\n"
+ " }\n"
+ " int d = widthB * BLOCK_SIZE * by + BLOCK_SIZE * bx;\n"
+ " float c = C[d + ty * widthB + tx];\n"
+ " Dsub = Dsub - c;\n"
+ " Dsub = fmod((mod + Dsub), mod);\n"
+ " D[d + ty * widthB + tx] = Dsub;\n"
+ "}\n"
+ };
+
+ const char* matrixAxmyKernelModular8DP = {
+ "#define BLOCK_SIZE 16\n"
+ "#pragma OPENCL EXTENSION cl_khr_fp64 : enable\n"
+ "__kernel void matrixAxmyKernelModular8DP(__global double* D, __global double* A, __global double* B,\n"
+ " __global double* C, const int widthA, const int widthB, const double mod){\n"
+ " int bx = get_group_id(0);\n"
+ " int by = get_group_id(1);\n"
+ " int tx = get_local_id(0);\n"
+ " int ty = get_local_id(1);\n"
+ " int aBegin= widthA * BLOCK_SIZE * by;\n"
+ " int aEnd = aBegin + widthA - 1;\n"
+ " int aStep = BLOCK_SIZE;\n"
+ " int bBegin = BLOCK_SIZE * bx;\n"
+ " int bStep = BLOCK_SIZE * widthB;\n"
+ " __local double As[BLOCK_SIZE][BLOCK_SIZE];\n"
+ " __local double Bs[BLOCK_SIZE][BLOCK_SIZE];\n"
+ " double Dsub = 0;\n"
+ " for(int a = aBegin, b = bBegin; a < aEnd; a += aStep, b += bStep){\n"
+ " As[ty][tx] = A[a + widthA * ty + tx];\n"
+ " Bs[ty][tx] = B[b + widthB * ty + tx];\n"
+ " barrier(CLK_LOCAL_MEM_FENCE);\n"
+ " Dsub += As[ty][0] * Bs[0][tx];\n"
+ " Dsub += As[ty][1] * Bs[1][tx];\n"
+ " Dsub += As[ty][2] * Bs[2][tx];\n"
+ " Dsub += As[ty][3] * Bs[3][tx];\n"
+ " Dsub += As[ty][4] * Bs[4][tx];\n"
+ " Dsub += As[ty][5] * Bs[5][tx];\n"
+ " Dsub += As[ty][6] * Bs[6][tx];\n"
+ " Dsub += As[ty][7] * Bs[7][tx];\n"
+ " Dsub = fmod(Dsub, mod);\n"
+ " Dsub += As[ty][8] * Bs[8][tx];\n"
+ " Dsub += As[ty][9] * Bs[9][tx];\n"
+ " Dsub += As[ty][10] * Bs[10][tx];\n"
+ " Dsub += As[ty][11] * Bs[11][tx];\n"
+ " Dsub += As[ty][12] * Bs[12][tx];\n"
+ " Dsub += As[ty][13] * Bs[13][tx];\n"
+ " Dsub += As[ty][14] * Bs[14][tx];\n"
+ " Dsub += As[ty][15] * Bs[15][tx];\n"
+ " Dsub = fmod(Dsub, mod);\n"
+ " barrier(CLK_LOCAL_MEM_FENCE);\n"
+ " }\n"
+ " int d = widthB * BLOCK_SIZE * by + BLOCK_SIZE * bx;\n"
+ " double c = C[d + ty * widthB + tx];\n"
+ " Dsub = Dsub - c;\n"
+ " Dsub = fmod((mod + Dsub), mod);\n"
+ " D[d + ty * widthB + tx] = Dsub;\n"
+ "}\n"
+ };
+
+ const char* matrixAxmyKernelModular16SP = {
+ "#define BLOCK_SIZE 16\n"
+ "__kernel void matrixAxmyKernelModular16SP(__global float* D, __global float* A, __global float* B,\n"
+ " __global float* C, const int widthA, const int widthB, const float mod){\n"
+ " int bx = get_group_id(0);\n"
+ " int by = get_group_id(1);\n"
+ " int tx = get_local_id(0);\n"
+ " int ty = get_local_id(1);\n"
+ " int aBegin= widthA * BLOCK_SIZE * by;\n"
+ " int aEnd = aBegin + widthA - 1;\n"
+ " int aStep = BLOCK_SIZE;\n"
+ " int bBegin = BLOCK_SIZE * bx;\n"
+ " int bStep = BLOCK_SIZE * widthB;\n"
+ " __local float As[BLOCK_SIZE][BLOCK_SIZE];\n"
+ " __local float Bs[BLOCK_SIZE][BLOCK_SIZE];\n"
+ " float Dsub = 0;\n"
+ " for(int a = aBegin, b = bBegin; a < aEnd; a += aStep, b += bStep){\n"
+ " As[ty][tx] = A[a + widthA * ty + tx];\n"
+ " Bs[ty][tx] = B[b + widthB * ty + tx];\n"
+ " barrier(CLK_LOCAL_MEM_FENCE);\n"
+ " Dsub += As[ty][0] * Bs[0][tx];\n"
+ " Dsub += As[ty][1] * Bs[1][tx];\n"
+ " Dsub += As[ty][2] * Bs[2][tx];\n"
+ " Dsub += As[ty][3] * Bs[3][tx];\n"
+ " Dsub += As[ty][4] * Bs[4][tx];\n"
+ " Dsub += As[ty][5] * Bs[5][tx];\n"
+ " Dsub += As[ty][6] * Bs[6][tx];\n"
+ " Dsub += As[ty][7] * Bs[7][tx];\n"
+ " Dsub += As[ty][8] * Bs[8][tx];\n"
+ " Dsub += As[ty][9] * Bs[9][tx];\n"
+ " Dsub += As[ty][10] * Bs[10][tx];\n"
+ " Dsub += As[ty][11] * Bs[11][tx];\n"
+ " Dsub += As[ty][12] * Bs[12][tx];\n"
+ " Dsub += As[ty][13] * Bs[13][tx];\n"
+ " Dsub += As[ty][14] * Bs[14][tx];\n"
+ " Dsub += As[ty][15] * Bs[15][tx];\n"
+ " Dsub = fmod(Dsub, mod);\n"
+ " barrier(CLK_LOCAL_MEM_FENCE);\n"
+ " }\n"
+ " int d = widthB * BLOCK_SIZE * by + BLOCK_SIZE * bx;\n"
+ " float c = C[d + ty * widthB + tx];\n"
+ " Dsub = Dsub - c;\n"
+ " Dsub = fmod((mod + Dsub), mod);\n"
+ " D[d + ty * widthB + tx] = Dsub;\n"
+ "}\n"
+ };
+
+ const char* matrixAxmyKernelModular32DP = {
+ "#define BLOCK_SIZE 16\n"
+ "#pragma OPENCL EXTENSION cl_khr_fp64 : enable\n"
+ "__kernel void matrixAxmyKernelModular32DP(__global double* D, __global double* A, __global double* B,\n"
+ " __global double* C, const int widthA, const int widthB, const double mod){\n"
+ " int bx = get_group_id(0);\n"
+ " int by = get_group_id(1);\n"
+ " int tx = get_local_id(0);\n"
+ " int ty = get_local_id(1);\n"
+ " int aBegin= widthA * BLOCK_SIZE * by;\n"
+ " int aEnd = aBegin + widthA - 1;\n"
+ " int aStep = BLOCK_SIZE;\n"
+ " int bBegin = BLOCK_SIZE * bx;\n"
+ " int bStep = BLOCK_SIZE * widthB;\n"
+ " __local double As[BLOCK_SIZE][BLOCK_SIZE];\n"
+ " __local double Bs[BLOCK_SIZE][BLOCK_SIZE];\n"
+ " double Dsub = 0;\n"
+ " int mCount = 0;\n"
+ " for(int a = aBegin, b = bBegin; a < aEnd; a += aStep, b += bStep){\n"
+ " As[ty][tx] = A[a + widthA * ty + tx];\n"
+ " Bs[ty][tx] = B[b + widthB * ty + tx];\n"
+ " barrier(CLK_LOCAL_MEM_FENCE);\n"
+ " Dsub += As[ty][0] * Bs[0][tx];\n"
+ " Dsub += As[ty][1] * Bs[1][tx];\n"
+ " Dsub += As[ty][2] * Bs[2][tx];\n"
+ " Dsub += As[ty][3] * Bs[3][tx];\n"
+ " Dsub += As[ty][4] * Bs[4][tx];\n"
+ " Dsub += As[ty][5] * Bs[5][tx];\n"
+ " Dsub += As[ty][6] * Bs[6][tx];\n"
+ " Dsub += As[ty][7] * Bs[7][tx];\n"
+ " Dsub += As[ty][8] * Bs[8][tx];\n"
+ " Dsub += As[ty][9] * Bs[9][tx];\n"
+ " Dsub += As[ty][10] * Bs[10][tx];\n"
+ " Dsub += As[ty][11] * Bs[11][tx];\n"
+ " Dsub += As[ty][12] * Bs[12][tx];\n"
+ " Dsub += As[ty][13] * Bs[13][tx];\n"
+ " Dsub += As[ty][14] * Bs[14][tx];\n"
+ " Dsub += As[ty][15] * Bs[15][tx];\n"
+ " mCount++;\n"
+ " if(mCount == 2){\n"
+ " Dsub = fmod(Dsub, mod);\n"
+ " mCount = 0;\n"
+ " }\n"
+ " barrier(CLK_LOCAL_MEM_FENCE);\n"
+ " }\n"
+ " Dsub = fmod(Dsub, mod);\n"
+ " int d = widthB * BLOCK_SIZE * by + BLOCK_SIZE * bx;\n"
+ " double c = C[d + ty * widthB + tx];\n"
+ " Dsub = Dsub - c;\n"
+ " Dsub = fmod((mod + Dsub), mod);\n"
+ " D[d + ty * widthB + tx] = Dsub;\n"
+ "}\n"
+ };
+
+ const char* matrixAxmyKernelModular32SP = {
+ "#define BLOCK_SIZE 16\n"
+ "__kernel void matrixAxmyKernelModular32SP(__global float* D, __global float* A, __global float* B,\n"
+ " __global float* C, const int widthA, const int widthB, const float mod){\n"
+ " int bx = get_group_id(0);\n"
+ " int by = get_group_id(1);\n"
+ " int tx = get_local_id(0);\n"
+ " int ty = get_local_id(1);\n"
+ " int aBegin= widthA * BLOCK_SIZE * by;\n"
+ " int aEnd = aBegin + widthA - 1;\n"
+ " int aStep = BLOCK_SIZE;\n"
+ " int bBegin = BLOCK_SIZE * bx;\n"
+ " int bStep = BLOCK_SIZE * widthB;\n"
+ " __local float As[BLOCK_SIZE][BLOCK_SIZE];\n"
+ " __local float Bs[BLOCK_SIZE][BLOCK_SIZE];\n"
+ " float Dsub = 0;\n"
+ " int mCount = 0;\n"
+ " for(int a = aBegin, b = bBegin; a < aEnd; a += aStep, b += bStep){\n"
+ " As[ty][tx] = A[a + widthA * ty + tx];\n"
+ " Bs[ty][tx] = B[b + widthB * ty + tx];\n"
+ " barrier(CLK_LOCAL_MEM_FENCE);\n"
+ " Dsub += As[ty][0] * Bs[0][tx];\n"
+ " Dsub += As[ty][1] * Bs[1][tx];\n"
+ " Dsub += As[ty][2] * Bs[2][tx];\n"
+ " Dsub += As[ty][3] * Bs[3][tx];\n"
+ " Dsub += As[ty][4] * Bs[4][tx];\n"
+ " Dsub += As[ty][5] * Bs[5][tx];\n"
+ " Dsub += As[ty][6] * Bs[6][tx];\n"
+ " Dsub += As[ty][7] * Bs[7][tx];\n"
+ " Dsub += As[ty][8] * Bs[8][tx];\n"
+ " Dsub += As[ty][9] * Bs[9][tx];\n"
+ " Dsub += As[ty][10] * Bs[10][tx];\n"
+ " Dsub += As[ty][11] * Bs[11][tx];\n"
+ " Dsub += As[ty][12] * Bs[12][tx];\n"
+ " Dsub += As[ty][13] * Bs[13][tx];\n"
+ " Dsub += As[ty][14] * Bs[14][tx];\n"
+ " Dsub += As[ty][15] * Bs[15][tx];\n"
+ " mCount++;\n"
+ " if(mCount == 2){\n"
+ " Dsub = fmod(Dsub, mod);\n"
+ " mCount = 0;\n"
+ " }\n"
+ " barrier(CLK_LOCAL_MEM_FENCE);\n"
+ " }\n"
+ " Dsub = fmod(Dsub, mod);\n"
+ " int d = widthB * BLOCK_SIZE * by + BLOCK_SIZE * bx;\n"
+ " float c = C[d + ty * widthB + tx];\n"
+ " Dsub = Dsub - c;\n"
+ " Dsub = fmod((mod + Dsub), mod);\n"
+ " D[d + ty * widthB + tx] = Dsub;\n"
+ "}\n"
+ };
+
+ const char* matrixAxmyKernelModular1024DP = {
+ "#define BLOCK_SIZE 16\n"
+ "#pragma OPENCL EXTENSION cl_khr_fp64 : enable\n"
+ "__kernel void matrixAxmyKernelModular1024DP(__global double* D, __global double* A, __global double* B,\n"
+ " __global double* C, const int widthA, const int widthB, const double mod){\n"
+ " int bx = get_group_id(0);\n"
+ " int by = get_group_id(1);\n"
+ " int tx = get_local_id(0);\n"
+ " int ty = get_local_id(1);\n"
+ " int aBegin= widthA * BLOCK_SIZE * by;\n"
+ " int aEnd = aBegin + widthA - 1;\n"
+ " int aStep = BLOCK_SIZE;\n"
+ " int bBegin = BLOCK_SIZE * bx;\n"
+ " int bStep = BLOCK_SIZE * widthB;\n"
+ " __local double As[BLOCK_SIZE][BLOCK_SIZE];\n"
+ " __local double Bs[BLOCK_SIZE][BLOCK_SIZE];\n"
+ " double Dsub = 0;\n"
+ " int mCount = 0;\n"
+ " for(int a = aBegin, b = bBegin; a < aEnd; a += aStep, b += bStep){\n"
+ " As[ty][tx] = A[a + widthA * ty + tx];\n"
+ " Bs[ty][tx] = B[b + widthB * ty + tx];\n"
+ " barrier(CLK_LOCAL_MEM_FENCE);\n"
+ " Dsub += As[ty][0] * Bs[0][tx];\n"
+ " Dsub += As[ty][1] * Bs[1][tx];\n"
+ " Dsub += As[ty][2] * Bs[2][tx];\n"
+ " Dsub += As[ty][3] * Bs[3][tx];\n"
+ " Dsub += As[ty][4] * Bs[4][tx];\n"
+ " Dsub += As[ty][5] * Bs[5][tx];\n"
+ " Dsub += As[ty][6] * Bs[6][tx];\n"
+ " Dsub += As[ty][7] * Bs[7][tx];\n"
+ " Dsub += As[ty][8] * Bs[8][tx];\n"
+ " Dsub += As[ty][9] * Bs[9][tx];\n"
+ " Dsub += As[ty][10] * Bs[10][tx];\n"
+ " Dsub += As[ty][11] * Bs[11][tx];\n"
+ " Dsub += As[ty][12] * Bs[12][tx];\n"
+ " Dsub += As[ty][13] * Bs[13][tx];\n"
+ " Dsub += As[ty][14] * Bs[14][tx];\n"
+ " Dsub += As[ty][15] * Bs[15][tx];\n"
+ " mCount++;\n"
+ " if(mCount == 64){\n"
+ " Dsub = fmod(Dsub, mod);\n"
+ " mCount = 0;\n"
+ " }\n"
+ " barrier(CLK_LOCAL_MEM_FENCE);\n"
+ " }\n"
+ " Dsub = fmod(Dsub, mod);\n"
+ " int d = widthB * BLOCK_SIZE * by + BLOCK_SIZE * bx;\n"
+ " double c = C[d + ty * widthB + tx];\n"
+ " Dsub = Dsub - c;\n"
+ " Dsub = fmod((mod + Dsub), mod);\n"
+ " D[d + ty * widthB + tx] = Dsub;\n"
+ "}\n"
+ };
+
+ const char* matrixAxmyKernelModular1024SP = {
+ "#define BLOCK_SIZE 16\n"
+ "__kernel void matrixAxmyKernelModular1024SP(__global float* D, __global float* A, __global float* B,\n"
+ " __global float* C, const int widthA, const int widthB, const float mod){\n"
+ " int bx = get_group_id(0);\n"
+ " int by = get_group_id(1);\n"
+ " int tx = get_local_id(0);\n"
+ " int ty = get_local_id(1);\n"
+ " int aBegin= widthA * BLOCK_SIZE * by;\n"
+ " int aEnd = aBegin + widthA - 1;\n"
+ " int aStep = BLOCK_SIZE;\n"
+ " int bBegin = BLOCK_SIZE * bx;\n"
+ " int bStep = BLOCK_SIZE * widthB;\n"
+ " __local float As[BLOCK_SIZE][BLOCK_SIZE];\n"
+ " __local float Bs[BLOCK_SIZE][BLOCK_SIZE];\n"
+ " float Dsub = 0;\n"
+ " int mCount = 0;\n"
+ " for(int a = aBegin, b = bBegin; a < aEnd; a += aStep, b += bStep){\n"
+ " As[ty][tx] = A[a + widthA * ty + tx];\n"
+ " Bs[ty][tx] = B[b + widthB * ty + tx];\n"
+ " barrier(CLK_LOCAL_MEM_FENCE);\n"
+ " Dsub += As[ty][0] * Bs[0][tx];\n"
+ " Dsub += As[ty][1] * Bs[1][tx];\n"
+ " Dsub += As[ty][2] * Bs[2][tx];\n"
+ " Dsub += As[ty][3] * Bs[3][tx];\n"
+ " Dsub += As[ty][4] * Bs[4][tx];\n"
+ " Dsub += As[ty][5] * Bs[5][tx];\n"
+ " Dsub += As[ty][6] * Bs[6][tx];\n"
+ " Dsub += As[ty][7] * Bs[7][tx];\n"
+ " Dsub += As[ty][8] * Bs[8][tx];\n"
+ " Dsub += As[ty][9] * Bs[9][tx];\n"
+ " Dsub += As[ty][10] * Bs[10][tx];\n"
+ " Dsub += As[ty][11] * Bs[11][tx];\n"
+ " Dsub += As[ty][12] * Bs[12][tx];\n"
+ " Dsub += As[ty][13] * Bs[13][tx];\n"
+ " Dsub += As[ty][14] * Bs[14][tx];\n"
+ " Dsub += As[ty][15] * Bs[15][tx];\n"
+ " mCount++;\n"
+ " if(mCount == 64){\n"
+ " Dsub = fmod(Dsub, mod);\n"
+ " mCount = 0;\n"
+ " }\n"
+ " barrier(CLK_LOCAL_MEM_FENCE);\n"
+ " }\n"
+ " Dsub = fmod(Dsub, mod);\n"
+ " int d = widthB * BLOCK_SIZE * by + BLOCK_SIZE * bx;\n"
+ " float c = C[d + ty * widthB + tx];\n"
+ " Dsub = Dsub - c;\n"
+ " Dsub = fmod((mod + Dsub), mod);\n"
+ " D[d + ty * widthB + tx] = Dsub;\n"
+ "}\n"
+ };
+
+} // end of namespace LinBox
+
+#endif // __LINBOX_opencl_matrix_domain_kernels_INL
+
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
diff --git a/linbox/algorithms/opencl-resource-controller.h b/linbox/algorithms/opencl-resource-controller.h
new file mode 100644
index 0000000..3cf885a
--- /dev/null
+++ b/linbox/algorithms/opencl-resource-controller.h
@@ -0,0 +1,533 @@
+/* linbox/algorithms/opencl-resource-controller.h
+ * Copyright (C) 2012 Matthew Wezowicz
+ *
+ * Written by Matthew Wezowicz <mwezz at udel.edu>
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ * ========LICENCE========
+ *.
+ */
+
+/** @file algorithms/opencl-resource-controller.h
+ */
+
+#include <pthread.h>
+
+#include <algorithm>
+#include <istream>
+#include <iterator>
+#include <map>
+#include <sstream>
+#include <string>
+#include <vector>
+
+#include <CL/cl.h>
+
+//#include "named-mutex.h"
+#include "opencl-environ.h"
+
+#ifndef __LINBOX_opencl_resource_controller_H
+#define __LINBOX_opencl_resource_controller_H
+
+namespace LinBox{
+
+ /**
+ * Enumerate all of the platforms currently available on the system
+ */
+ std::vector<cl_platform_id> enumPlatforms(){
+ //Variables
+ cl_int errcode;
+ cl_platform_id* platforms;
+ cl_uint numPlatforms;
+
+ //Get number of platforms on system
+ errcode = clGetPlatformIDs(0, NULL, &numPlatforms);
+ linbox_check(errcode == CL_SUCCESS);
+
+ //Return empty vector if error
+ if(errcode != CL_SUCCESS || numPlatforms <= 0){
+ std::vector<cl_platform_id> ret;
+ return ret;
+ }
+
+ //Allocate memory for platforms IDs
+ platforms = new cl_platform_id[numPlatforms];
+
+ //Read in platform IDs
+ errcode = clGetPlatformIDs(numPlatforms, platforms, NULL);
+ linbox_check(errcode == CL_SUCCESS);
+
+ //Allocate vector for platform IDs
+ std::vector<cl_platform_id> ret;
+
+ //Copy platform IDs into vector
+ for(int i = 0; i < (int)numPlatforms; i++){
+ ret.push_back(platforms[(size_t)i]);
+ }
+
+ //Deallocate memory
+ delete[] platforms;
+
+ return ret;
+ }
+
+ /**
+ * Get the platform name associated with the platform
+ */
+ std::string getPlatformName(cl_platform_id platform){
+ //Variables
+ char* tempBuffer;
+ cl_int errcode;
+ size_t sizeRet;
+
+ //Get size of platform name
+ errcode = clGetPlatformInfo(platform, CL_PLATFORM_NAME, 0, NULL, &sizeRet);
+ linbox_check(errcode == CL_SUCCESS);
+
+ //Allocate memory for platform name
+ tempBuffer = new char[sizeRet];
+
+ //Read in platform name
+ errcode = clGetPlatformInfo(
+ platform,
+ CL_PLATFORM_NAME,
+ sizeRet,
+ tempBuffer,
+ NULL);
+ linbox_check(errcode == CL_SUCCESS);
+
+ //Convert platform name to std::string
+ std::string ret(tempBuffer);
+
+ //Deallocate memory
+ delete[] tempBuffer;
+
+ return ret;
+ }
+
+ /**
+ * Get the platform version associated with the platform
+ */
+ double getPlatformVersion(cl_platform_id platform){
+ //Variables
+ char* tempBuffer;
+ cl_int errcode;
+ double ret = 0;
+ size_t first;
+ size_t second;
+ size_t sizeRet;
+
+ //Get size of platform version string
+ errcode = clGetPlatformInfo(
+ platform,
+ CL_PLATFORM_VERSION,
+ 0,
+ NULL,
+ &sizeRet);
+ linbox_check(errcode == CL_SUCCESS);
+
+ //Allocate memory for platform version string
+ tempBuffer = new char[sizeRet];
+
+ //Read in platform name string
+ errcode = clGetPlatformInfo(
+ platform,
+ CL_PLATFORM_VERSION,
+ sizeRet,
+ tempBuffer,
+ NULL);
+ linbox_check(errcode == CL_SUCCESS);
+
+ //Convert platform version string to std::string
+ std::string versionString(tempBuffer);
+
+ //Isolate the version number in string and convert to double
+ first = versionString.find_first_of(" ", 0);
+ second = versionString.find_first_of(" ", (first + 1));
+ std::string tempString = versionString.substr(first, (second - first));
+ std::stringstream strstream(tempString);
+ strstream >> ret;
+
+ //Deallocate memory
+ delete[] tempBuffer;
+
+ return ret;
+ }
+
+ /**
+ * Get the platform extensions associated with the platform
+ */
+ std::vector<std::string> getPlatformExtensions(cl_platform_id platform){
+ //Variables
+ char* tempBuffer;
+ cl_int errcode;
+ size_t sizeRet;
+
+ //Get size of platform extensions string
+ errcode = clGetPlatformInfo(
+ platform,
+ CL_PLATFORM_EXTENSIONS,
+ 0,
+ NULL,
+ &sizeRet);
+ linbox_check(errcode == CL_SUCCESS);
+
+ //Allocate memory for platform extensions string
+ tempBuffer = new char[sizeRet];
+
+ //Read in platform extensions string
+ errcode = clGetPlatformInfo(
+ platform,
+ CL_PLATFORM_EXTENSIONS,
+ sizeRet,
+ tempBuffer,
+ NULL);
+ linbox_check(errcode == CL_SUCCESS);
+
+ //Convert platfrom extensions string to std::string
+ std::string tempString(tempBuffer);
+
+ //Parse out the individual extensions and copy into vector
+ std::stringstream strstream(tempString);
+ std::istream_iterator<std::string> it(strstream);
+ std::istream_iterator<std::string> end;
+ std::vector<std::string> ret;
+ for(; it != end; it++){
+ ret.push_back(*it);
+ }
+
+ //Deallocate memory
+ delete[] tempBuffer;
+
+ return ret;
+ }
+
+ /**
+ * Enumerate all of the devices currently available on the platform
+ */
+ std::vector<cl_device_id> enumDevices(cl_platform_id platform){
+ //Variables
+ cl_device_id* devices;
+ cl_int errcode;
+ cl_uint numDevices;
+
+ //Get number of devices in platform
+ errcode = clGetDeviceIDs(
+ platform,
+ CL_DEVICE_TYPE_ALL,
+ 0,
+ NULL,
+ &numDevices);
+ linbox_check(errcode == CL_SUCCESS);
+
+ //Return empty vector if error
+ if(errcode != CL_SUCCESS || numDevices <= 0){
+ std::vector<cl_device_id> ret;
+ return ret;
+ }
+
+ //Allocate memory for device IDs
+ devices = new cl_device_id[numDevices];
+
+ //Read in device IDs
+ errcode = clGetDeviceIDs(
+ platform,
+ CL_DEVICE_TYPE_ALL,
+ numDevices,
+ devices,
+ NULL);
+ linbox_check(errcode == CL_SUCCESS);
+
+ //Allocate vector for device IDs
+ std::vector<cl_device_id> ret;
+
+ //Copy device IDs into vector
+ for(int i = 0; i < (int)numDevices; i++){
+ ret.push_back(devices[(size_t)i]);
+ }
+
+ //Deallocate memory
+ delete[] devices;
+
+ return ret;
+ }
+
+ /**
+ * Create an OpenCL context from a platfrom and device
+ */
+ cl_context createContext(cl_platform_id platform, cl_device_id device){
+ //Variables
+ cl_context ret;
+ cl_int errcode;
+ cl_context_properties props[3] = {
+ CL_CONTEXT_PLATFORM,
+ (cl_context_properties)platform,
+ 0};
+
+ //Create context
+ ret = clCreateContext(props, 1, &device, NULL, NULL, &errcode);
+ linbox_check(errcode == CL_SUCCESS);
+
+ return ret;
+ }
+
+ class OpenCLResourceController{
+
+ private:
+ static std::vector<OpenCLEnviron*>* environs;
+
+#ifndef __MPI_SHARED
+ static std::map<unsigned int, unsigned int>* IDsToInstances;
+ static pthread_mutex_t controllerLock;
+#else
+ static std::map<unsigned int, std::string>* IDsToNames;
+ static std::map<std::string, unsigned int>* namesToInstances;
+ static std::vector<NamedMutex*>* mutexs;
+ static NamedMutex controllerLock;
+#endif
+
+ static bool initialized;
+
+ void init(){
+ unsigned int ID = 0;
+
+ environs = new std::vector<OpenCLEnviron*>;
+#ifndef __MPI_SHARED
+ IDsToInstances = new std::map<unsigned int, unsigned int>;
+#else
+ mutexs = new std::vector<NamedMUtex*>;
+ IDsToNames = new std::map<unsigned int, std::string>;
+ namesToInstances = new std::map<std::string, unsigned int>;
+#endif
+
+ std::vector<cl_platform_id> platforms = enumPlatforms();
+
+ for(int i = 0; i < (int)platforms.size(); i++){
+ std::string platformName = getPlatformName(platforms[(size_t)i]);
+
+ double platformVersion = getPlatformVersion(platforms[(size_t)i]);
+
+ std::vector<std::string> platformExtensions =
+ getPlatformExtensions(platforms[(size_t)i]);
+
+ std::vector<cl_device_id> devices = enumDevices(platforms[(size_t)i]);
+
+ for(int j = 0; j < (int)devices.size(); j++){
+ cl_context context = createContext(platforms[(size_t)i], devices[(size_t)j]);
+
+#ifndef __MPI_SHARED
+ //Allocate and initialize device lock
+ pthread_mutex_t* tempMutex = new pthread_mutex_t;
+
+ pthread_mutex_init(tempMutex, NULL);
+
+ //Build OpenCLEnviron
+ OpenCLEnviron* tempEnviron = new OpenCLEnviron(
+ platformName,
+ platformVersion,
+ platformExtensions,
+ context,
+ devices[(size_t)j],
+ tempMutex,
+ ID);
+
+ //Update map of ID numbers to allocated instances
+ (*IDsToInstances)[ID] = 0;
+
+ ID++;
+#else
+ //Build NamedMutex name
+ std::stringstream strstream;
+ strstream << platformName << "_" << j;
+ std::string mutexName(strstream.str());
+
+ //Construct named mutex
+ NamedMutex* tempMutex = new NamedMutex(mutexName);
+ mutexs->push_back(tempMutex);
+
+ //Build OpenCLEnviron with local ID number
+ OpenCLEnviron* tempEnviron = new OpenCLEnviron(
+ platformName,
+ platformVersion,
+ platformExtensions,
+ context,
+ devices[(size_t)j],
+ tempMutex,
+ ID);
+
+ //Update local copy of map with
+ //NamedMutex names to allocated instances
+ unsigned int allocated =
+ controllerLock.updateLocalValue<unsigned int>(mutexName);
+ (*namesToInstances)[mutexName] = allocated;
+
+ //Update local map of ID numbers to NamedMutex names
+ (*IDsToNames)[ID] = mutexName;
+
+ //Update global copy of map with
+ //NamedMutex names to allocated instances
+ controllerLock.updateGlobalValue<unsigned int>(mutexName, allocated);
+
+ ID++;
+#endif
+
+ environs->push_back(tempEnviron);
+ }
+ }
+
+ initialized = true;
+ }
+
+ public:
+
+ OpenCLResourceController(){
+#ifndef __MPI_SHARED
+ pthread_mutex_lock(&controllerLock);
+
+ init();
+ //removeDuplicates();
+
+ pthread_mutex_unlock(&controllerLock);
+#else
+ controllerLock.lock();
+
+ init();
+ //removeDuplicates();
+
+ controllerLock.unlock();
+#endif
+ }
+
+ ~OpenCLResourceController(){
+#ifndef __MPI_SHARED
+ for(int i = 0; i < (int)environs->size(); i++){
+ pthread_mutex_destroy(environs->at((size_t)i)->getDeviceLock());
+ delete environs->at((size_t)i)->getDeviceLock();
+ delete environs->at((size_t)i);
+ }
+#else
+ for(int i = 0; i < mutexs->size(); i++){
+ delete mutexs->at((size_t)i);
+ }
+ for(int i = 0; i < environs->size(); i++){
+ delete environs->at((size_t)i);
+ }
+#endif
+ }
+
+ const std::vector<OpenCLEnviron*>* accessEnvirons(){
+ return environs;
+ }
+
+ void acquireController(){
+#ifndef __MPI_SHARED
+ pthread_mutex_lock(&controllerLock);
+#else
+ controllerLock.lock();
+
+ //Update local copy of map with
+ //NamedMutex names to allocated instances
+ ///!TODO
+#endif
+ }
+
+ void releaseController(){
+#ifndef __MPI_SHARED
+ pthread_mutex_unlock(&controllerLock);
+#else
+ //Update global copy of map with
+ //NamedMutex names to allocated instances
+ ///!TODO
+
+ controllerLock.unlock();
+#endif
+ }
+
+ unsigned int getInstanceCount(unsigned int ID){
+#ifndef __MPI_SHARED
+ return (*IDsToInstances)[ID];
+#else
+ return (*namesToInstances)[(*IDsToNames)[ID]];
+#endif
+ }
+
+ unsigned int allocateInstance(unsigned int ID){
+#ifndef __MPI_SHARED
+ (*IDsToInstances)[ID] += 1;
+ return (*IDsToInstances)[ID];
+#else
+ (*namesToInstances)[(*IDsToNames)[ID]] += 1;
+ return (*namesToInstances)[(*IDsToNames)[ID]];
+#endif
+ }
+
+ unsigned int deallocateInstance(unsigned int ID){
+#ifndef __MPI_SHARED
+ (*IDsToInstances)[ID] -= 1;
+#if 0
+ if((*IDsToInstances)[ID] < 0){ //! @bug BB Toujours faux
+ (*IDsToInstances)[ID] = 0;
+ }
+#endif
+ return (*IDsToInstances)[ID];
+#else
+ (*namesToInstances)[(*IDsToNames)[ID]] -= 1;
+ if((*namesToInstances)[(*IDsToNames)[ID]] < 0){
+ (*namesToInstances)[(*IDsToNames)[ID]] = 0;
+ }
+ return (*namesToInstances)[(*IDsToNames)[ID]];
+#endif
+ }
+
+ }; /* end of class OpenCLResourceController */
+
+ std::vector<OpenCLEnviron*>* OpenCLResourceController::environs = NULL;
+#ifndef __MPI_SHARED
+ std::map<unsigned int, unsigned int>*
+ OpenCLResourceController::IDsToInstances = NULL;
+ pthread_mutex_t OpenCLResourceController::controllerLock =
+ PTHREAD_MUTEX_INITIALIZER;
+#else
+ std::map<unsigned int, std::string>*
+ OpenCLResourceController::IDsToNames = NULL;
+ std::map<std::string, unsigned int>*
+ OpenCLResourceController::namesToInstances = NULL;
+ std::vector<NamedMutex*>*
+ OpenCLResourceController::mutexs = NULL;
+ NamedMutex OpenCLResourceController::controllerLock =
+ NamedMutex("OpenCLResourceContollerLock");
+#endif
+ bool OpenCLResourceController::initialized(false);
+
+ OpenCLResourceController& accessOpenCLResourceController(){
+ static OpenCLResourceController controller;
+ return controller;
+ }
+
+} /* end of namespace LinBox */
+
+#endif // __LINBOX_opencl_resource_controller_H
+
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+
diff --git a/linbox/algorithms/poly-det.h b/linbox/algorithms/poly-det.h
new file mode 100644
index 0000000..288886e
--- /dev/null
+++ b/linbox/algorithms/poly-det.h
@@ -0,0 +1,195 @@
+#ifndef __LINBOX_POLY_DET_H
+#define __LINBOX_POLY_DET_H
+/* by Alex Stachnik
+*/
+
+#include <givaro/extension.h>
+#include <linbox/algorithms/poly-interpolation.h>
+#include <linbox/solutions/det.h>
+
+namespace LinBox {
+/*
+Matrix is a polynomial matrix.
+result is set to its determinant and returned (a polynomial).
+d is the number of evaluation points.
+
+The method is to compute dets at each evaluation point and interpolate.
+ (note by bds)
+ */
+template <class Field>
+typename Givaro::Poly1Dom<Field,Givaro::Dense>::Element&
+computePolyDet(typename Givaro::Poly1Dom<Field,Givaro::Dense>::Element& result,
+ DenseMatrix<Givaro::Poly1Dom<Field,Givaro::Dense> >& A,
+ int d)
+{
+ typedef Givaro::Poly1Dom<Field,Givaro::Dense> PolyDom;
+ typedef typename PolyDom::Element PolyElt;
+ typedef typename Field::Element FieldElt;
+ //typedef MatrixDomain<Field> FieldMatDom;
+ typedef DenseMatrix<Field> FieldMat;
+
+ int n=A.coldim(),m=A.rowdim();
+
+ PolyDom BR=A.field();
+ Field F(BR.subDomain()); // coeff field
+
+ std::vector<FieldMat> mats;
+ std::vector<FieldElt> pts(d);
+ FieldElt fieldElt;
+ F.assign(fieldElt,F.zero);
+ for (int i=0;i<d;++i) {
+ mats.push_back(FieldMat(F,m,n));
+ F.init(pts[i],int64_t(i));
+ }
+
+ commentator().report(Commentator::LEVEL_IMPORTANT,PROGRESS_REPORT)
+ << "Initialized mats" << std::endl;
+
+
+ PolyInterpolation<Field,PolyDom> PI(pts,F,BR);
+#pragma omp parallel for shared(mats,A,PI,BR,F)
+ for (int i=0;i<m;++i) {
+ for (int j=0;j<n;++j) {
+ PolyElt p;
+ A.getEntry(p,i,j);
+ std::vector<FieldElt> vals;
+ PI.evaluate(vals,p,BR,F);
+ for (int k=0;k<d;++k) {
+ mats[k].setEntry(i,j,vals[k]);
+ }
+ }
+ }
+
+ commentator().report(Commentator::LEVEL_IMPORTANT,PROGRESS_REPORT)
+ << "Finished evaluations" << std::endl;
+
+ std::vector<FieldElt> dets(d);
+#pragma omp parallel for shared(dets,mats)
+ for (int k=0;k<d;++k) {
+ det(dets[k],mats[k],Method::Elimination());
+ }
+
+ PI.interpolate(result,pts,dets,BR,F);
+ return result;
+}
+
+int roundUpPowerOfTwo(unsigned int n)
+{
+ if (n==0) {
+ return 0;
+ } else if (n==1) {
+ return 1;
+ }
+
+ int bits=0;
+ int loopN=n;
+ while (loopN>0) {
+ loopN = loopN >> 1;
+ ++bits;
+ }
+
+ unsigned int mask=(1<<(bits-1))-1;
+ if ((mask&n)!=0) {
+ return 1<<bits;
+ } else {
+ return 1<<(bits-1);
+ }
+}
+
+template <class Field,class Matrix>
+typename Givaro::Poly1Dom<Field,Givaro::Dense>::Element&
+computePolyDetExtension(typename Givaro::Poly1Dom<Field,Givaro::Dense>::Element& result,
+ Field& F,
+ Matrix& A)
+{
+ typedef Givaro::Poly1Dom<Field,Givaro::Dense> BasePolyDom;
+ typedef typename BasePolyDom::Element BasePolyElt;
+
+ BasePolyDom BR=F;
+
+ int n=A.coldim(),m=A.rowdim();
+
+ commentator().report(Commentator::LEVEL_IMPORTANT,PROGRESS_REPORT)
+ << "Computing d" << std::endl;
+
+ int d=0;
+ BasePolyElt p;
+ for (int i=0;i<m;++i) {
+ int rowMaxD=0;
+ for (int j=0;j<n;++j) {
+ A.getEntry(p,i,j);
+ int t=BR.degree(p).value();
+ rowMaxD=(rowMaxD<t)?t:rowMaxD;
+ }
+ d += rowMaxD;
+ }
+ d=roundUpPowerOfTwo(d+1);
+
+ commentator().report(Commentator::LEVEL_IMPORTANT,PROGRESS_REPORT)
+ << "Found d" << std::endl;
+
+ int a,e=1;
+ a=F.cardinality();
+ int newCard=a;
+ while (newCard<d) {
+ newCard *= a;
+ ++e;
+ }
+
+ typedef Givaro::Extension<Field> ExtField;
+ typedef Givaro::Poly1Dom<ExtField,Givaro::Dense> ExtPolyDom;
+ typedef typename ExtPolyDom::Element ExtPoly;
+ //typedef typename Matrix::template rebind<ExtPolyDom>::other EPolyMatrix;
+ typedef DenseMatrix<ExtPolyDom> EPolyMatrix;
+
+ ExtField EF(F,e);
+ ExtPolyDom EPD(EF,"x");
+ Hom<Field,Givaro::Extension<Field> > hom(F,EF);
+
+ commentator().report(Commentator::LEVEL_IMPORTANT,PROGRESS_REPORT)
+ << "Constructed new matrix" << std::endl;
+
+ EPolyMatrix Ap(EPD,m,n);
+ for (int i=0;i<m;++i) {
+ for (int j=0;j<n;++j) {
+ BasePolyElt oldElt;
+ A.getEntry(oldElt,i,j);
+ ExtPoly newElt;
+ if (BR.isZero(oldElt)) {
+ EPD.assign(newElt,EPD.zero);
+ } else {
+ int eltDegree=BR.degree(oldElt).value();
+ EPD.init(newElt,BR.degree(oldElt));
+ for (int k=0;k<eltDegree+1;++k) {
+ hom.image(newElt[k],oldElt[k]);
+ }
+ }
+ Ap.setEntry(i,j,newElt);
+ }
+ }
+
+ commentator().report(Commentator::LEVEL_IMPORTANT,PROGRESS_REPORT)
+ << "Converted matrix" << std::endl;
+
+ ExtPoly ep;
+ computePolyDet<ExtField>(ep,Ap,d);
+ //computePolyDet(ep,EF,Ap,d);
+
+ commentator().report(Commentator::LEVEL_IMPORTANT,PROGRESS_REPORT)
+ << "Computed over base field" << std::endl;
+
+ if (EPD.isZero(ep)) {
+ BR.assign(result,BR.zero);
+ } else {
+ int eltDegree=EPD.degree(ep).value();
+ BR.init(result,EPD.degree(ep));
+ for (int k=0;k<eltDegree+1;++k) {
+ hom.preimage(result[k],ep[k]);
+ }
+ }
+ return result;
+}
+
+}
+
+#endif //__LINBOX_POLY_DET_H
diff --git a/linbox/algorithms/poly-interpolation.h b/linbox/algorithms/poly-interpolation.h
new file mode 100644
index 0000000..7bf5d99
--- /dev/null
+++ b/linbox/algorithms/poly-interpolation.h
@@ -0,0 +1,174 @@
+
+#ifndef __LINBOX_POLY_INTERPOLATION_H
+#define __LINBOX_POLY_INTERPOLATION_H
+
+
+#include <omp.h>
+
+#include <linbox/ring/givaro-poly.h>
+
+namespace LinBox {
+
+
+ // Expects pts to have size 2^n, undefined behavior otherwise
+template<class Field, class PolyDom>
+class PolyInterpolation {
+public:
+ typedef GivaroPoly<PolyDom> Ring;
+ typedef typename Ring::Element RingElt;
+ typedef typename Field::Element FieldElt;
+ typedef std::vector<std::vector<RingElt> > ProductTree;
+
+ PolyInterpolation(const std::vector<FieldElt>& pts,
+ Field& F,
+ PolyDom& PD)
+ {
+ int n=pts.size();
+
+ std::vector<RingElt> mRow;
+ for (int i=0;i<n;++i) {
+ RingElt p;
+ PD.assign(p,PD.one);
+ PD.shiftin(p,1);
+ PD.subin(p,pts[i]);
+ mRow.push_back(p);
+ }
+ Mtree_.push_back(mRow);
+ k_=0;
+ while (Mtree_[k_].size()>1) {
+ std::vector<RingElt> row;
+ for (uint32_t i = 0; i < Mtree_[k_].size()/2; ++i) {
+ RingElt p;
+ PD.mul(p,Mtree_[k_][2*i],Mtree_[k_][2*i+1]);
+ row.push_back(p);
+ }
+ Mtree_.push_back(row);
+ ++k_;
+ }
+ }
+
+ RingElt& interpolate(RingElt& poly,
+ const std::vector<FieldElt>& pts,
+ const std::vector<FieldElt>& vals,
+ PolyDom& PD,
+ Field& F)
+ {
+ int n=pts.size();
+ std::vector<FieldElt> si;
+ RingElt mprime;
+ PD.diff(mprime,Mtree_[k_][0]);
+ evaluate(si,mprime,PD,F);
+ for (int i=0;i<n;++i) {
+ F.invin(si[i]);
+ F.mulin(si[i],vals[i]);
+ }
+ scaledSum(poly,si,PD);
+ return poly;
+ }
+
+ RingElt& scaledSum(RingElt& comb,
+ const std::vector<FieldElt>& cs,
+ PolyDom& PD)
+ {
+ int numPts=cs.size();
+ std::vector<RingElt> fRow,tempRow;
+ fRow.resize(numPts);
+ for (int i=0;i<numPts;++i) {
+ PD.assign(fRow[i],cs[i]);
+ }
+
+ for (int i=0;i<k_;++i) {
+ int rowLen=fRow.size();
+ tempRow.resize(rowLen/2);
+ for (int j=0;j<rowLen/2;++j) {
+ RingElt p,q;
+ PD.mul(p,fRow[2*j],Mtree_[i][2*j+1]);
+ PD.mul(q,fRow[2*j+1],Mtree_[i][2*j]);
+ PD.addin(p,q);
+ PD.assign(tempRow[j],p);
+ }
+ fRow.swap(tempRow);
+ tempRow.clear();
+ }
+ PD.assign(comb,fRow[0]);
+ return comb;
+ }
+
+ void evaluate(std::vector<FieldElt>& vals,
+ const RingElt& poly,
+ PolyDom& PD,
+ Field& F)
+ {
+ std::vector<RingElt> fRow,tempRow;
+ fRow.push_back(poly);
+
+ for (int i=k_-1;i>=0;--i) {
+ int rowLen=fRow.size();
+ tempRow.resize(rowLen*2);
+ for (int j=0;j<rowLen;++j) {
+ RingElt p;
+ PD.mod(p,fRow[j],Mtree_[i][2*j]);
+ PD.assign(tempRow[2*j],p);
+ PD.mod(p,fRow[j],Mtree_[i][2*j+1]);
+ PD.assign(tempRow[2*j+1],p);
+ }
+ fRow.swap(tempRow);
+ tempRow.clear();
+ }
+
+ int numPts=fRow.size();
+ vals.resize(numPts);
+ for (int i=0;i<numPts;++i) {
+ FieldElt d;
+ PD.leadcoef(d,fRow[i]);
+ vals[i]=d;
+ }
+ }
+
+
+ static void naiveInterpolate(RingElt& poly,
+ const std::vector<FieldElt>& vals,
+ const std::vector<FieldElt>& pts,
+ GivaroPoly<PolyDom>& R,
+ PolyDom& PD,
+ Field& F)
+ {
+ typedef GivaroPoly<PolyDom> Ring;
+ typedef typename Ring::Element RingElt;
+ typedef typename Ring::Scalar_t FieldElt;
+
+ int n=vals.size();
+ linbox_check(vals.size()==pts.size());
+ PD.assign(poly,PD.zero);
+ for (int i=0;i<n;++i) {
+ RingElt mulElt;
+ PD.assign(mulElt,PD.one);
+ for (int j=0;j<n;++j) {
+ if (i==j) {
+ continue;
+ }
+ RingElt p;
+ PD.assign(p,PD.one);
+ PD.shiftin(p,1);
+ PD.subin(p,pts[j]);
+ FieldElt d;
+ F.sub(d,pts[i],pts[j]);
+ PD.divin(p,d);
+ PD.mulin(mulElt,p);
+ }
+ PD.mulin(mulElt,vals[i]);
+ PD.addin(poly,mulElt);
+ }
+ }
+protected:
+
+ ProductTree Mtree_;
+
+ int k_;
+
+};
+
+
+}
+
+#endif //__LINBOX_POLY_INTERPOLATION_H
diff --git a/linbox/algorithms/polynomial-matrix/Makefile.am b/linbox/algorithms/polynomial-matrix/Makefile.am
new file mode 100644
index 0000000..a58ec59
--- /dev/null
+++ b/linbox/algorithms/polynomial-matrix/Makefile.am
@@ -0,0 +1,39 @@
+# Copyright (c) 2010 the LinBox group
+# ========LICENCE========
+# This file is part of the library LinBox.
+#
+# LinBox is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+#
+# This library 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
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+# ========LICENCE========
+
+
+
+pkgincludesubdir=$(pkgincludedir)/algorithms/polynomial-matrix
+
+
+pkgincludesub_HEADERS = \
+ matpoly-add-domain.h \
+ matpoly-mult-naive.h \
+ matpoly-mult-fft.h \
+ matpoly-mult-kara.h \
+ matpoly-mult-fft-wordsize.inl \
+ matpoly-mult-fft-wordsize-fast.inl \
+ matpoly-mult-fft-wordsize-three-primes.inl \
+ matpoly-mult-fft-multiprecision.inl \
+ polynomial-fft-transform-simd.inl \
+ polynomial-fft-transform.h \
+ polynomial-fft-transform.inl \
+ polynomial-matrix-domain.h \
+ simd.h \
+ order-basis.h
diff --git a/linbox/algorithms/polynomial-matrix/matpoly-add-domain.h b/linbox/algorithms/polynomial-matrix/matpoly-add-domain.h
new file mode 100755
index 0000000..116a04d
--- /dev/null
+++ b/linbox/algorithms/polynomial-matrix/matpoly-add-domain.h
@@ -0,0 +1,91 @@
+/* -*- mode: C++; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
+/*
+ * Copyright (C) 2013 Pascal Giorgi
+ *
+ * Written by Pascal Giorgi <pascal.giorgi at lirmm.fr>
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ * ========LICENCE========
+ */
+
+#ifndef __LINBOX_matpoly_add_domain_H
+#define __LINBOX_matpoly_add_domain_H
+
+#include <algorithm>
+#include "linbox/matrix/matrix-domain.h"
+
+namespace LinBox {
+
+ template <class Field>
+ class PolynomialMatrixAddDomain {
+ protected:
+ MatrixDomain<Field> _BMD;
+
+ public:
+ PolynomialMatrixAddDomain(const Field& F)
+ : _BMD(F) {}
+
+ // add function (a must be allocated with the right size)
+ template<typename PMatrix1,typename PMatrix2,typename PMatrix3>
+ void add(PMatrix1 &a, const PMatrix2 &b, const PMatrix3 &c){
+ size_t i=0;
+ for(;i<std::min(b.size(),c.size());i++)
+ _BMD.add(a[i],b[i],c[i]);
+ if (b.size()>c.size()){
+ for(;i<b.size();i++)
+ a[i]=b[i];
+ }
+ else{
+ for(;i<c.size();i++)
+ a[i]=c[i];
+ }
+ }
+
+ // addin function (a must be allocated with the right size)
+ template<typename PMatrix1,typename PMatrix2>
+ void addin(PMatrix1 &a, const PMatrix2 &b){
+ for(size_t i=0;i<b.size();i++)
+ _BMD.addin(a[i],b[i]);
+ }
+
+ // sub function (a must be allocated with the right size)
+ template<typename PMatrix1,typename PMatrix2,typename PMatrix3>
+ void sub(PMatrix1 &a, const PMatrix2 &b, const PMatrix3 &c){
+ size_t i=0;
+ for(;i<std::min(b.size(),c.size());i++)
+ _BMD.sub(a[i],b[i],c[i]);
+ if (b.size()>c.size()){
+ for(;i<b.size();i++)
+ a[i]=b[i];
+ }
+ else{
+ for(;i<c.size();i++)
+ _BMD.neg(a[i],c[i]);
+ }
+ }
+
+ // subin function (a must be allocated with the right size)
+ template<typename PMatrix1,typename PMatrix2>
+ void subin(PMatrix1 &a, const PMatrix2 &b){
+ for(size_t i=0;i<b.size();i++)
+ _BMD.subin(a[i],b[i]);
+ }
+ };
+}
+#endif
+
diff --git a/linbox/algorithms/polynomial-matrix/matpoly-mult-fft-multiprecision.inl b/linbox/algorithms/polynomial-matrix/matpoly-mult-fft-multiprecision.inl
new file mode 100644
index 0000000..743d14b
--- /dev/null
+++ b/linbox/algorithms/polynomial-matrix/matpoly-mult-fft-multiprecision.inl
@@ -0,0 +1,668 @@
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
+/* -*- mode: C++; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
+/*
+ * Copyright (C) 2013 Pascal Giorgi
+ * Romain Lebreton
+ *
+ * Written by Pascal Giorgi <pascal.giorgi at lirmm.fr>
+ * Romain Lebreton <lebreton at lirmm.fr>
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ * ========LICENCE========
+ */
+#ifndef __LINBOX_matpoly_mult_ftt_multiprecision_INL
+#define __LINBOX_matpoly_mult_ftt_multiprecision_INL
+
+#include <givaro/zring.h>
+#include "linbox/ring/modular.h"
+#include "linbox/randiter/random-fftprime.h"
+#include "linbox/randiter/random-prime.h"
+#include <fflas-ffpack/field/rns-double.h>
+#define MB(x) ((x)/(double)(1<<20))
+#ifndef MEMINFO
+#define MEMINFO ""
+#endif
+namespace LinBox{
+
+ /***************************************************
+ **** Polynomial Matrix Multiplication over Z[x] ***
+ ***************************************************/
+ template<>
+ class PolynomialMatrixFFTMulDomain<Givaro::ZRing<integer> > {
+ public:
+ typedef Givaro::ZRing<integer> IntField;
+ //typedef Givaro::Modular<uint32_t> ModField;
+ typedef Givaro::Modular<double> ModField;
+ typedef PolynomialMatrix<PMType::polfirst,PMStorage::plain,ModField> MatrixP_F; // Polynomial matrix stored as a matrix of polynomials
+ typedef PolynomialMatrix<PMType::polfirst,PMStorage::plain,IntField> MatrixP_I; // Polynomial matrix stored as a matrix of polynomials
+
+ private:
+ const IntField *_field;
+ integer _maxnorm;
+
+ template<typename PMatrix1>
+ size_t logmax(const PMatrix1 A) const {
+ size_t mm=A.get(0,0,0).bitsize();
+ for(size_t k=0;k<A.size();k++)
+ for (size_t i=0;i<A.rowdim()*A.coldim();i++){
+ size_t tmp=A.get(i,k).bitsize();
+ mm=std::max(mm,tmp);
+ }
+ return mm;
+ }
+
+ public:
+ void getFFTPrime(uint64_t prime_max, size_t lpts, integer bound, std::vector<integer> &bas){
+
+ RandomFFTPrime RdFFT(prime_max);
+ size_t nbp=0;
+ if (!RdFFT.generatePrimes(lpts,bound,bas)){
+ integer MM=1;
+ for(std::vector<integer>::size_type i=0;i<bas.size();i++)
+ MM*=bas[i];
+ RandomPrimeIter Rd(integer(prime_max).bitsize());
+ integer tmp;
+ do {
+ do {Rd.random(tmp);}
+ while (MM%tmp==0);
+ bas.push_back(tmp);
+ nbp++;
+ MM*=tmp;
+ } while (MM<bound);
+ }
+#ifdef VERBOSE_FFT
+ std::cout<<"MatPoly Multiprecision FFT : using "<<bas.size()-nbp<<" FFT primes and "<<nbp<<" normal primes "<<std::endl;
+#endif
+ }
+
+
+
+ inline const IntField & field() const { return *_field; }
+
+
+ PolynomialMatrixFFTMulDomain (const IntField &F, const integer maxnorm=0) :
+ _field(&F), _maxnorm(maxnorm) {}
+
+ template<typename PMatrix1, typename PMatrix2, typename PMatrix3>
+ void mul (PMatrix1 &c, const PMatrix2 &a, const PMatrix3 &b) {
+ //compute a bound on the entry of the input matrix a and b
+ FFT_PROFILE_START(2);
+ integer maxA,maxB;
+ maxA=maxB=_maxnorm;
+ if (_maxnorm==0){
+ maxA=1;maxA<<=uint64_t(logmax(a));
+ maxB=1;maxB<<=uint64_t(logmax(b));
+ }
+ integer bound=2*maxA*maxB*uint64_t(a.coldim())*uint64_t(std::min(a.size(),b.size()));
+ FFT_PROFILING(2,"max norm computation");
+
+ mul_crtla(c,a,b,maxA,maxB,bound);
+ }
+
+ template<typename PMatrix1, typename PMatrix2, typename PMatrix3>
+ void midproduct (PMatrix1 &c, const PMatrix2 &a, const PMatrix3 &b,
+ bool smallLeft=true, size_t n0=0, size_t n1=0) {
+ //compute a bound on the entry of the input matrix a and b
+ FFT_PROFILE_START(2);
+ integer maxA,maxB;
+ maxA=maxB=_maxnorm;
+ if (_maxnorm==0){
+ maxA=1;maxA<<=uint64_t(logmax(a));
+ maxB=1;maxB<<=uint64_t(logmax(b));
+ }
+ integer bound=2*maxA*maxB*integer((uint64_t)a.coldim())*integer((uint64_t)std::min(a.size(),b.size()));;
+ if (smallLeft)
+ bound*= (uint64_t)a.size();
+ else
+ bound*= (uint64_t)b.size();
+
+ FFT_PROFILING(2,"max norm computation");
+
+ midproduct_crtla(c,a,b,maxA,maxB,bound,smallLeft, n0,n1);
+ }
+
+
+ // template< typename PMatrix1,typename PMatrix2, typename PMatrix3>
+ // void mul_crtla(PMatrix1 &c, const PMatrix2 &a, const PMatrix3 &b,
+ // const integer& maxA, const integer& maxB, const integer& bound) {
+ // // (convert to MatrixP representation)
+ // FFT_PROFILE_START;
+ // MatrixP_I a2(field(),a.rowdim(),a.coldim(),a.size());
+ // MatrixP_I b2(field(),b.rowdim(),b.coldim(),b.size());
+ // a2.copy(a,0,a.size()-1);
+ // b2.copy(b,0,b.size()-1);
+ // MatrixP_I c2(field(),c.rowdim(),c.coldim(),c.size());
+ // FFT_PROFILING(2,"converting rep of input matrices");
+ // mul_crtla(c2,a2,b2,maxA,maxB,bound);
+ // c.copy(c2,0,c.size()-1);
+ // FFT_PROFILING(2,"converting rep of output matrices");
+ // }
+
+
+ // void mul_crtla(MatrixP_I &c, const MatrixP_I &a, const MatrixP_I &b,
+ // const integer& maxA, const integer& maxB, const integer& bound){
+
+ // WARNING: Polynomial Matrix should stored as matrix of polynomial with integer coefficient
+ template< typename PMatrix1,typename PMatrix2, typename PMatrix3>
+ void mul_crtla(PMatrix1 &c, const PMatrix2 &a, const PMatrix3 &b,
+ const integer& maxA, const integer& maxB, const integer& bound) {
+
+ FFT_PROFILE_START(2);
+ linbox_check(a.coldim() == b.rowdim());
+ size_t m = a.rowdim();
+ size_t k = a.coldim();
+ size_t n = b.coldim();
+ size_t s= a.size()+b.size()-1;
+ c.resize(s);
+ size_t lpts=0;
+ size_t pts = 1; while (pts < s) { pts= pts<<1; ++lpts; }
+
+ // compute bit size of feasible prime for FFLAS
+ // size_t _k=k,lk=0;
+ //while ( _k ) {_k>>=1; ++lk;}
+ //size_t prime_bitsize= (53-lk)>>1;
+
+ // compute max prime value for FFLAS
+ uint64_t prime_max= std::sqrt( (1ULL<<53) / k)+1;
+ std::vector<integer> bas;
+ getFFTPrime(prime_max,lpts,bound,bas);
+ // RandomFFTPrime RdFFT(prime_bitsize);
+ // if (!RdFFT.generatePrimes(lpts,bound,bas)){
+ // std::cout<<"COULD NOT FIND ENOUGH FFT PRIME in MatPoly FFTMUL taking normal primes..."<<std::endl;
+ // exit(1);
+ // }
+
+ std::vector<double> basis(bas.size());
+ std::copy(bas.begin(),bas.end(),basis.begin());
+ FFPACK::rns_double RNS(basis);
+ size_t num_primes = RNS._size;
+#ifdef FFT_PROFILER
+ //double tMul=0.,tCopy=0;;
+ if (FFT_PROF_LEVEL<3){
+ std::cout << "number of FFT primes :" << num_primes << std::endl;
+ std::cout << "max prime : "<<prime_max<<" ("<<integer(prime_max).bitsize()<<")"<<std::endl;
+ std::cout << "bitsize of the output: "<<bound.bitsize()
+ <<"( "<< RNS._M.bitsize()<<" )"<<std::endl;
+ std::cout <<" +++++++++++++++++++++++++++++++"<<std::endl;
+ }
+#endif
+ FFT_PROFILING(2,"init of CRT approach");
+ // reduce t_a and t_b modulo each FFT primes
+ size_t n_ta=m*k*a.size(), n_tb=k*n*b.size();
+ //size_t n_ta=m*k*pts, n_tb=k*n*pts;
+ //std::cout<<"----------------------------------------------"<<std::endl;
+ //std::cout<<"MUL FFT RNS: "<<MEMINFO<<std::endl;
+ std::cout<<"MUL FFT RNS: need "<<MB((m*n*pts+n_ta+n_tb)*num_primes*8 + 2*(m*k+k*n)*pts*8)<<"Mo"<<std::endl;
+
+ //std::cout<<"MUL FFT RNS: RNS -> allocating "<<MB((n_ta+n_tb)*num_primes*8)<<"Mo"<<std::endl;
+ double* t_a_mod= new double[n_ta*num_primes];
+ double* t_b_mod= new double[n_tb*num_primes];
+ RNS.init(1, n_ta, t_a_mod, n_ta, a.getPointer(), n_ta, maxA);
+ RNS.init(1, n_tb, t_b_mod, n_tb, b.getPointer(), n_tb, maxB);
+ FFT_PROFILING(2,"reduction mod pi of input matrices");
+
+ std::vector<MatrixP_F*> c_i (num_primes);
+ //std::cout<<"MUL FFT RNS: RNS -> allocating "<<MB((m*n*pts)*num_primes*8)<<"Mo"<<std::endl;
+ //std::cout<<"MUL FFT RNS: RNS -> allocating "<<MB((2*(m*k+k*n)*pts)*8)<<"Mo"<<std::endl;
+
+ // FFT_PROFILE_START(2);
+ // auto sp=SPLITTER();
+ // PARFOR1D(l,num_primes,sp,
+ for (size_t l=0;l<num_primes;l++)
+ {
+ //FFT_PROFILE_START;
+ ModField f(RNS._basis[l]);
+ MatrixP_F a_i (f, m, k, pts);
+ MatrixP_F b_i (f, k, n, pts);
+
+ c_i[l] = new MatrixP_F(f, m, n, pts);
+ // copy reduced data
+ for (size_t i=0;i<m*k;i++)
+ for (size_t j=0;j<a.size();j++)
+ a_i.ref(i,j)=t_a_mod[l*n_ta+j+i*a.size()];
+ for (size_t i=0;i<k*n;i++)
+ for (size_t j=0;j<b.size();j++)
+ b_i.ref(i,j)=t_b_mod[l*n_tb+j+i*b.size()];
+ //FFT_PROFILE_GET(tCopy);
+ //PolynomialMatrixFFTPrimeMulDomain<ModField> fftdomain (f);
+ PolynomialMatrixThreePrimesFFTMulDomain<ModField> fftdomain (f);
+ fftdomain.mul_fft(lpts, *c_i[l], a_i, b_i);
+ //FFT_PROFILE_GET(tMul);
+ }
+ //)
+ FFT_PROFILING(2,"FFTprime mult+copying");
+ delete[] t_a_mod;
+ delete[] t_b_mod;
+ //FFT_PROFILE(2,"copying linear reduced matrix",tCopy);
+ //FFT_PROFILE(2,"FFTprime multiplication",tMul);
+
+ if (num_primes < 2) {
+ FFT_PROFILE_START(2);
+ c.copy(*c_i[0],0,s-1);
+ } else {
+ FFT_PROFILE_START(2);
+ // construct contiguous storage for c_i
+ size_t n_tc=m*n*s;
+ //std::cout<<"MUL FFT RNS: RNS -> allocating "<<MB(n_tc*num_primes*8)<<"Mo"<<std::endl;
+ double *t_c_mod = new double[n_tc*num_primes];
+ for (size_t l=0;l<num_primes;l++){
+ for (size_t i=0;i<m*n;i++)
+ for (size_t j=0;j<s;j++)
+ t_c_mod[l*n_tc + (j+i*s)]= c_i[l]->get(i,j);
+ delete c_i[l];
+ }
+ FFT_PROFILING(2,"linearization of results mod pi");
+
+ // reconstruct the result in C
+ RNS.convert(1,n_tc,0,c.getWritePointer(),n_tc, t_c_mod, n_tc);
+ //std::cout<<"MUL FFT RNS: "<<MEMINFO<<std::endl;
+ //std::cout<<"----------------------------------------------"<<std::endl;
+ delete[] t_c_mod;
+
+ }
+ FFT_PROFILING(2,"k prime reconstruction");
+ // std::cout<<"CC:="<<c<<std::endl;
+ // std::cout<<"<-----------------: "<<std::endl;;
+ }
+
+ // WARNING: Polynomial Matrix should stored as matrix of polynomial with integer coefficient
+ template< typename PMatrix1,typename PMatrix2, typename PMatrix3>
+ void mul_crtla2(PMatrix1 &c, const PMatrix2 &a, const PMatrix3 &b,
+ const integer& maxA, const integer& maxB, const integer& bound) {
+
+ FFT_PROFILE_START(2);
+ linbox_check(a.coldim() == b.rowdim());
+ size_t m = a.rowdim();
+ size_t k = a.coldim();
+ size_t n = b.coldim();
+ size_t s= a.size()+b.size()-1;
+ c.resize(s);
+ size_t lpts=0;
+ size_t pts = 1; while (pts < s) { pts= pts<<1; ++lpts; }
+
+ // compute max prime value for FFLAS
+ uint64_t prime_max= std::sqrt( (1ULL<<53) / k)+1;
+ std::vector<integer> bas;
+ getFFTPrime(prime_max,lpts,bound,bas);
+
+ std::vector<double> basis(bas.size());
+ std::copy(bas.begin(),bas.end(),basis.begin());
+ FFPACK::rns_double RNS(basis);
+ size_t num_primes = RNS._size;
+
+
+#ifdef FFT_PROFILER
+ //double tMul=0.,tCopy=0;;
+ if (FFT_PROF_LEVEL<3){
+ std::cout << "number of FFT primes :" << num_primes << std::endl;
+ std::cout << "max prime : "<<prime_max<<" ("<<integer(prime_max).bitsize()<<")"<<std::endl;
+ std::cout << "bitsize of the output: "<<bound.bitsize()
+ <<"( "<< RNS._M.bitsize()<<" )"<<std::endl;
+ std::cout <<" +++++++++++++++++++++++++++++++"<<std::endl;
+ }
+#endif
+
+
+ FFT_PROFILING(2,"init of CRT approach");
+ // reduce t_a and t_b modulo each FFT primes
+ size_t n_ta=m*k*a.size(), n_tb=k*n*b.size();
+ std::vector<MatrixP_F*> c_i (num_primes);
+
+
+ // loop for memory saving
+ size_t CRT_NBPRIME=4;
+ double* t_a_mod= new double[n_ta*CRT_NBPRIME];
+ double* t_b_mod= new double[n_tb*CRT_NBPRIME];
+ std::cout<<"MUL FFT RNS: input/output data: "<< MB((n_ta*(maxA.bitsize()+128) +n_tb*(maxB.bitsize()+128) +m*k*s*(bound.bitsize()+128))/8)<<"Mo"<<std::endl;
+ std::cout<<"MUL FFT RNS: initial need "<<MB((m*n*pts+n_ta+n_tb)*num_primes*8 + 2*(m*k+k*n)*pts*8)<<"Mo"<<std::endl;
+ std::cout<<"MUL FFT RNS: RNS in: "<<MB( (n_ta+n_tb)*CRT_NBPRIME*8)<<"Mo"<<std::endl;
+ std::cout<<"MUL FFT RNS: RNC com: "<<MB(2*(m*k+k*n)*pts*8)<<"Mo"<<std::endl;
+ std::cout<<"MUL FFT RNS: RNS out: "<<MB((m*n*pts)*num_primes*8 )<<"Mo"<<std::endl;
+
+ for(size_t loop=0;loop<num_primes;loop+=CRT_NBPRIME){
+
+ // create chunk of RNS
+ size_t rns_chunk=std::min(CRT_NBPRIME,num_primes-loop); // nbr of primes in the current smallRNS basis
+ std::vector<double> smallBasis(rns_chunk);
+ std::copy(basis.begin()+loop,basis.begin()+loop+rns_chunk,smallBasis.begin());
+ FFPACK::rns_double smallRNS(smallBasis);
+ smallRNS.precompute_cst(RNS._ldm);
+
+ //std::cout<<"MUL FFT RNS: RNS -> allocating "<<MB((n_ta+n_tb)*num_primes*8)<<"Mo"<<std::endl;
+ smallRNS.init(1, n_ta, t_a_mod, n_ta, a.getPointer(), n_ta, maxA);
+ smallRNS.init(1, n_tb, t_b_mod, n_tb, b.getPointer(), n_tb, maxB);
+ FFT_PROFILING(2,"reduction mod pi of input matrices");
+
+ //std::cout<<"MUL FFT RNS: RNS -> allocating "<<MB((m*n*pts)*num_primes*8)<<"Mo"<<std::endl;
+ //std::cout<<"MUL FFT RNS: RNS -> allocating "<<MB((2*(m*k+k*n)*pts)*8)<<"Mo"<<std::endl;
+
+ for (size_t l=0;l<rns_chunk;l++)
+ {
+ //FFT_PROFILE_START;
+ //std::cout<<"prime: "<<(long)smallRNS._basis[l]<<std::endl;
+ ModField f(smallRNS._basis[l]);
+ MatrixP_F a_i (f, m, k, pts);
+ MatrixP_F b_i (f, k, n, pts);
+ c_i[loop+l] = new MatrixP_F(f, m, n, pts);
+ // copy reduced data
+ for (size_t i=0;i<m*k;i++)
+ for (size_t j=0;j<a.size();j++)
+ a_i.ref(i,j)=t_a_mod[l*n_ta+j+i*a.size()];
+ for (size_t i=0;i<k*n;i++)
+ for (size_t j=0;j<b.size();j++)
+ b_i.ref(i,j)=t_b_mod[l*n_tb+j+i*b.size()];
+ //FFT_PROFILE_GET(tCopy);
+ //PolynomialMatrixFFTPrimeMulDomain<ModField> fftdomain (f);
+ PolynomialMatrixThreePrimesFFTMulDomain<ModField> fftdomain (f);
+ fftdomain.mul_fft(lpts, *c_i[loop+l], a_i, b_i);
+ //FFT_PROFILE_GET(tMul);
+ }
+ FFT_PROFILING(2,"FFTprime mult+copying");
+ //FFT_PROFILE(2,"copying linear reduced matrix",tCopy);
+ //FFT_PROFILE(2,"FFTprime multiplication",tMul);
+
+ } // end of loop for memory saving
+ delete[] t_a_mod;
+ delete[] t_b_mod;
+
+
+ if (num_primes < 2) {
+ FFT_PROFILE_START(2);
+ c.copy(*c_i[0],0,s-1);
+ } else {
+ FFT_PROFILE_START(2);
+ // construct contiguous storage for c_i
+ size_t n_tc=m*n*s;
+ //std::cout<<"MUL FFT RNS: RNS -> allocating "<<MB(n_tc*num_primes*8)<<"Mo"<<std::endl;
+ double *t_c_mod = new double[n_tc*num_primes];
+ for (size_t l=0;l<num_primes;l++){
+ for (size_t i=0;i<m*n;i++)
+ for (size_t j=0;j<s;j++)
+ t_c_mod[l*n_tc + (j+i*s)]= c_i[l]->get(i,j);
+ delete c_i[l];
+ }
+ FFT_PROFILING(2,"linearization of results mod pi");
+
+ // reconstruct the result in C
+ RNS.convert(1,n_tc,0,c.getWritePointer(),n_tc, t_c_mod, n_tc);
+ //std::cout<<"MUL FFT RNS: "<<MEMINFO<<std::endl;
+ //std::cout<<"----------------------------------------------"<<std::endl;
+ delete[] t_c_mod;
+
+ }
+ FFT_PROFILING(2,"k prime reconstruction");
+ // std::cout<<"CC:="<<c<<std::endl;
+ // std::cout<<"<-----------------: "<<std::endl;;
+ }
+
+
+
+ // template< typename PMatrix1,typename PMatrix2, typename PMatrix3>
+ // void midproduct_crtla(PMatrix1 &c, const PMatrix2 &a, const PMatrix3 &b,
+ // const integer& maxA, const integer& maxB, const integer& bound,
+ // bool smallLeft=true, size_t n0=0, size_t n1=0) {
+ // // (convert to MatrixP representation)
+ // MatrixP_I a2(field(),a.rowdim(),a.coldim(),a.size());
+ // MatrixP_I b2(field(),b.rowdim(),b.coldim(),b.size());
+ // a2.copy(a,0,a.size()-1);
+ // b2.copy(b,0,b.size()-1);
+ // MatrixP_I c2(field(),c.rowdim(),c.coldim(),c.size());
+ // midproduct_crtla(c2,a2,b2,maxA,maxB,bound,smallLeft,n0,n1);
+ // c.copy(c2,0,c2.size()-1);
+ // }
+
+ // WARNING: Polynomial Matrix should stored as matrix of polynomial with integer coefficient
+ template< typename PMatrix1,typename PMatrix2, typename PMatrix3>
+ void midproduct_crtla(PMatrix1 &c, const PMatrix2 &a, const PMatrix3 &b,
+ const integer& maxA, const integer& maxB, const integer& bound,
+ bool smallLeft=true, size_t n0=0, size_t n1=0) {
+ // void midproduct_crtla(MatrixP_I &c, const MatrixP_I &a, const MatrixP_I &b,
+ // const integer& maxA, const integer& maxB, const integer& bound,
+ // bool smallLeft=true, size_t n0=0, size_t n1=0) {
+ FFT_PROFILE_START(2);
+ linbox_check(a.coldim() == b.rowdim());
+ size_t m = a.rowdim();
+ size_t k = a.coldim();
+ size_t n = b.coldim();
+ size_t hdeg = (n0==0?c.size():n0);
+ size_t deg = (n1==0?2*hdeg:n1);
+ linbox_check(c.size()>=deg-hdeg);
+
+ if (smallLeft){
+ linbox_check(b.size()<hdeg+deg);
+ }
+ else
+ linbox_check(a.size()<hdeg+deg);
+
+ //linbox_check(2*c.size()-1 == b.size());
+ //size_t deg= b.size()+1;
+ //size_t hdeg= deg/2;
+ size_t lpts=0;
+ size_t pts = 1; while (pts < deg) { pts= pts<<1; ++lpts; }
+
+
+ // compute bit size of feasible prime for FFLAS
+ // size_t _k=k,lk=0;
+ //while ( _k ) {_k>>=1; ++lk;}
+ //size_t prime_bitsize= (53-lk)>>1;
+
+ // compute max prime value for FFLAS
+ uint64_t prime_max= std::sqrt( (1ULL<<53) / k)+1;
+ std::vector<integer> bas;
+ getFFTPrime(prime_max,lpts,bound,bas);
+ //RandomFFTPrime RdFFT(prime_bitsize);
+ // if (!RdFFT.generatePrimes(bound,bas)){
+ // std::cout<<"COULD NOT FIND ENOUGH FFT PRIME in MatPoly FFTMUL exiting..."<<std::endl;
+ // throw LinboxError("LinBox ERROR: not enough FFT Prime\n");
+ // }
+
+ std::vector<double> basis(bas.size());
+ std::copy(bas.begin(),bas.end(),basis.begin());
+ FFPACK::rns_double RNS(basis);
+ size_t num_primes = RNS._size;
+#ifdef FFT_PROFILER
+ double tMul=0.,tCopy=0;;
+ if (FFT_PROF_LEVEL<3){
+ std::cout << "number of FFT primes :" << num_primes << std::endl;
+ std::cout << "max prime : "<<prime_max<<" ("<<integer(prime_max).bitsize()<<")"<<std::endl;
+ std::cout << "bitsize of the output: "<<bound.bitsize()
+ <<"( "<< RNS._M.bitsize()<<" )"<<std::endl;
+ std::cout <<" +++++++++++++++++++++++++++++++"<<std::endl;
+ }
+#endif
+ FFT_PROFILING(2,"init of CRT approach");
+ // reduce t_a and t_b modulo each FFT primes
+ size_t n_ta=m*k*a.size(), n_tb=k*n*b.size();
+ double* t_a_mod= new double[n_ta*num_primes];
+ double* t_b_mod= new double[n_tb*num_primes];
+ RNS.init(1, n_ta, t_a_mod, n_ta, a.getPointer(), n_ta, maxA);
+ RNS.init(1, n_tb, t_b_mod, n_tb, b.getPointer(), n_tb, maxB);
+ FFT_PROFILING(2,"reduction mod pi of input matrices");
+
+ //std::cout<<"----------------------------------------------"<<std::endl;
+ //std::cout<<"MIDP FFT RNS: "<<MEMINFO<<std::endl;
+ //std::cout<<"MIDP FFT RNS: need "<<MB((m*n*pts+n_ta+n_tb)*num_primes*8 + 2*(m*k+k*n)*pts*8)<<"Mo"<<std::endl;
+
+
+ //std::cout<<"MIDP FFT RNS: RNS -> allocating "<<MB((n_ta+n_tb)*num_primes*8)<<"Mo"<<std::endl;
+ //std::cout<<"MIDP FFT RNS: RNS -> allocating "<<MB((m*n)*pts*num_primes*8)<<"Mo"<<std::endl;
+ //std::cout<<"MIDP FFT RNS: "<<MEMINFO<<std::endl;
+
+ std::vector<MatrixP_F*> c_i (num_primes);
+
+ for (size_t l=0;l<num_primes;l++){
+ FFT_PROFILE_START(2);
+ ModField f(RNS._basis[l]);
+ MatrixP_F a_i (f, m, k, pts);
+ MatrixP_F b_i (f, k, n, pts);
+ c_i[l] = new MatrixP_F(f, m, n, pts);
+ // copy reduced data and reversed when necessary according to midproduct algo
+ //std::cout<<"hdeg-size: "<<hdeg<<" <-> "<<a.size()<<std::endl;
+ for (size_t i=0;i<m*k;i++)
+ for (size_t j=0;j<a.size();j++)
+ if (smallLeft)
+ a_i.ref(i,hdeg-1-j)=t_a_mod[l*n_ta+j+i*a.size()];
+ else
+ a_i.ref(i,j)=t_a_mod[l*n_ta+j+i*a.size()];
+ for (size_t i=0;i<k*n;i++)
+ for (size_t j=0;j<b.size();j++)
+ if (smallLeft)
+ b_i.ref(i,j)=t_b_mod[l*n_tb+j+i*b.size()];
+ else
+ b_i.ref(i,hdeg-1-j)=t_b_mod[l*n_tb+j+i*b.size()];
+ FFT_PROFILE_GET(2,tCopy);
+ //PolynomialMatrixFFTPrimeMulDomain<ModField> fftdomain (f);
+ PolynomialMatrixThreePrimesFFTMulDomain<ModField> fftdomain (f);
+ fftdomain.midproduct_fft(lpts, *(c_i[l]), a_i, b_i, smallLeft);
+
+ FFT_PROFILE_GET(2,tMul);
+ }
+ delete[] t_a_mod;
+ delete[] t_b_mod;
+ FFT_PROFILE(2,"copying linear reduced matrix",tCopy);
+ FFT_PROFILE(2,"FFTprime multiplication",tMul);
+
+ if (num_primes < 2) {
+ FFT_PROFILE_START(2);
+ c.copy(*(c_i[0]),0,c.size()-1);
+ } else {
+ FFT_PROFILE_START(2);
+ // construct contiguous storage for c_i
+ double *t_c_mod;
+ size_t n_tc=m*n*c.size();
+ t_c_mod = new double[n_tc*num_primes];
+ for (size_t l=0;l<num_primes;l++){
+ for (size_t i=0;i<m*n;i++)
+ for (size_t j=0;j<c.size();j++)
+ t_c_mod[l*n_tc + (j+i*c.size())]= c_i[l]->get(i,j);
+ delete c_i[l];
+ }
+ FFT_PROFILING(2,"linearization of results mod pi");
+
+ // reconstruct the result in C
+ RNS.convert(1,n_tc,0,c.getWritePointer(),n_tc, t_c_mod, n_tc);
+ //std::cout<<"MIDP FFT RNS: "<<MEMINFO<<std::endl;
+ delete[] t_c_mod;
+
+ //std::cout<<"MUL FFT RNS: "<<MEMINFO<<std::endl;
+ //std::cout<<"----------------------------------------------"<<std::endl;
+
+ FFT_PROFILING(2,"k prime reconstruction");
+ }
+ }
+ };
+
+
+ /***************************************************************************
+ **** Polynomial Matrix Multiplication over Fp[x], with p multiprecision ***
+ ***************************************************************************/
+ template <>
+ class PolynomialMatrixFFTMulDomain<Givaro::Modular<integer> > {
+ public:
+ typedef Givaro::Modular<integer> Field;
+ typedef typename Field::Element Element;
+ typedef Givaro::ZRing<integer> IntField;
+ // Polynomial matrix stored as a polynomial of matrix
+ typedef PolynomialMatrix<PMType::polfirst,PMStorage::plain,Field> MatrixP_F;
+ // Polynomial matrix stored as a polynomial of matrix
+ typedef PolynomialMatrix<PMType::polfirst,PMStorage::plain,IntField> MatrixP_I;
+
+ private:
+ const Field *_field; // Read only
+ integer _p;
+
+ public:
+ inline const Field & field() const { return *_field; }
+
+ PolynomialMatrixFFTMulDomain(const Field &F) : _field(&F) {
+ field().cardinality(_p);
+ }
+
+ template<typename Matrix1, typename Matrix2, typename Matrix3>
+ void mul (Matrix1 &c, const Matrix2 &a, const Matrix3 &b) {
+ FFT_PROFILE_START(2);
+ MatrixP_F a2(field(),a.rowdim(),a.coldim(),a.size());
+ MatrixP_F b2(field(),b.rowdim(),b.coldim(),b.size());
+ MatrixP_F c2(field(),c.rowdim(),c.coldim(),c.size());
+ a2.copy(a,0,a.size()-1);
+ b2.copy(b,0,b.size()-1);
+ FFT_PROFILING(2,"converting rep of input");
+ mul(c2,a2,b2);
+ FFT_PROFILE_START(2);
+ c.copy(c2,0,c.size()-1);
+ FFT_PROFILING(2,"converting rep of output");
+
+ }
+
+ // Matrix with polynomials
+ void mul (MatrixP_F &c, const MatrixP_F &a, const MatrixP_F &b) {
+
+ FFT_PROFILE_START(2);
+ IntField Z;
+ PolynomialMatrixFFTMulDomain<IntField> Zmul(Z,_p);
+ integer bound=2*_p*_p*integer((uint64_t)a.coldim())*integer((uint64_t)std::min(a.size(),b.size()));
+ //Zmul.mul_crtla(c,a,b,_p,_p,bound);
+ Zmul.mul_crtla2(c,a,b,_p,_p,bound);
+
+ // reduce the result mod p
+ FFT_PROFILE_START(2);
+ for (size_t i=0;i<c.rowdim()*c.coldim();i++)
+ for (size_t j=0;j<c.size();j++)
+ c.ref(i,j)%=_p;
+ FFT_PROFILING(2,"reduction mod p of output");
+ }
+
+ template<typename Matrix1, typename Matrix2, typename Matrix3>
+ void midproduct (Matrix1 &c, const Matrix2 &a, const Matrix3 &b,
+ bool smallLeft=true, size_t n0=0, size_t n1=0) {
+
+ MatrixP_F a2(field(),a.rowdim(),a.coldim(),a.size());
+ MatrixP_F b2(field(),b.rowdim(),b.coldim(),b.size());
+ a2.copy(a,0,a.size()-1);
+ b2.copy(b,0,b.size()-1);
+ MatrixP_F c2(field(),c.rowdim(),c.coldim(),c.size());
+ midproduct(c2,a2,b2,smallLeft,n0,n1);
+ c.copy(c2,0,c.size()-1);
+ }
+
+ void midproduct (MatrixP_F &c, const MatrixP_F &a, const MatrixP_F &b,
+ bool smallLeft=true, size_t n0=0, size_t n1=0) {
+ IntField Z;
+ PolynomialMatrixFFTMulDomain<IntField> Zmul(Z,_p);
+ //const MatrixP_I* a2 = reinterpret_cast<const MatrixP_I*>(&a);
+ //const MatrixP_I* b2 = reinterpret_cast<const MatrixP_I*>(&b);
+ //MatrixP_I* c2 = reinterpret_cast<MatrixP_I*>(&c);
+ //Zmul.midproduct(*c2,*a2,*b2,smallLeft,n0,n1);
+ Zmul.midproduct(c,a,b,smallLeft,n0,n1);
+ // reduce the result mod p
+ FFT_PROFILE_START(2);
+ for (size_t i=0;i<c.rowdim()*c.coldim();i++)
+ for (size_t j=0;j<c.size();j++)
+ c.ref(i,j)%=_p;
+ FFT_PROFILING(2,"reduction mod p of output");
+ }
+ };
+
+
+
+
+
+
+} // end of namespace LinBox
+
+#endif // __LINBOX_matpoly_mult_ftt_multiprecision_INL
diff --git a/linbox/algorithms/polynomial-matrix/matpoly-mult-fft-wordsize-fast.inl b/linbox/algorithms/polynomial-matrix/matpoly-mult-fft-wordsize-fast.inl
new file mode 100644
index 0000000..50e260d
--- /dev/null
+++ b/linbox/algorithms/polynomial-matrix/matpoly-mult-fft-wordsize-fast.inl
@@ -0,0 +1,314 @@
+/* -*- mode: C++; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
+/*
+ * Copyright (C) 2013 Pascal Giorgi
+ * Romain Lebreton
+ *
+ * Written by Pascal Giorgi <pascal.giorgi at lirmm.fr>
+ * Romain Lebreton <lebreton at lirmm.fr>
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ * ========LICENCE========
+ */
+#ifndef __LINBOX_matpoly_mult_ftt_wordsize_fast_INL
+#define __LINBOX_matpoly_mult_ftt_wordsize_fast_INL
+
+#include "givaro/modular.h"
+#include "fflas-ffpack/fflas-ffpack.h"
+#include "linbox/matrix/polynomial-matrix.h"
+#include "linbox/matrix/matrix-domain.h"
+#include "linbox/algorithms/polynomial-matrix/polynomial-fft-transform.h"
+
+namespace LinBox {
+
+ /***********************************************************************************
+ **** Polynomial Matrix Multiplication over Zp[x] with p (FFTPrime, FFLAS prime) ***
+ ***********************************************************************************/
+ template<class Field>
+ class PolynomialMatrixFFTPrimeMulDomain {
+
+ //typedef Givaro::Modular<T> Field;
+ public:
+ // Polynomial matrix stored as a matrix of polynomial
+ typedef PolynomialMatrix<PMType::polfirst,PMStorage::plain,Field> MatrixP;
+ // Polynomial matrix stored as a polynomial of matrix
+ typedef PolynomialMatrix<PMType::matfirst,PMStorage::plain,Field> PMatrix;
+
+ private:
+ const Field *_field; // Read only
+ uint64_t _p;
+ BlasMatrixDomain<Field> _BMD;
+
+ public:
+ inline const Field & field() const { return *_field; }
+
+ PolynomialMatrixFFTPrimeMulDomain(const Field &F)
+ : _field(&F), _p(field().cardinality()), _BMD(F){}
+
+ template<typename Matrix1, typename Matrix2, typename Matrix3>
+ void mul (Matrix1 &c, const Matrix2 &a, const Matrix3 &b) {
+ linbox_check(a.coldim()==b.rowdim());
+ size_t deg = a.size()+b.size()-1;
+ size_t lpts = 0;
+ size_t pts = 1; while (pts < deg) { pts= pts<<1; ++lpts; }
+ // padd the input a and b to 2^lpts (convert to MatrixP representation)
+ MatrixP a2(field(),a.rowdim(),a.coldim(),pts);
+ MatrixP b2(field(),b.rowdim(),b.coldim(),pts);
+ a2.copy(a,0,a.size()-1);
+ b2.copy(b,0,b.size()-1);
+ MatrixP c2(field(),c.rowdim(),c.coldim(),pts);
+ mul_fft (lpts,c2, a2, b2);
+ c.copy(c2,0,deg-1);
+ }
+
+ void mul (MatrixP &c, const MatrixP &a, const MatrixP &b) {
+ linbox_check(a.coldim()==b.rowdim());
+ size_t deg = a.size()+b.size()-1;
+ size_t lpts = 0;
+ size_t pts = 1; while (pts < deg) { pts= pts<<1; ++lpts; }
+
+ // padd the input a and b to 2^lpts
+ MatrixP a2(field(),a.rowdim(),a.coldim(),pts);
+ MatrixP b2(field(),b.rowdim(),b.coldim(),pts);
+ a2.copy(a,0,a.size()-1);
+ b2.copy(b,0,b.size()-1);
+ // resize c to 2^lpts
+ c.resize(pts);
+ mul_fft (lpts,c, a2, b2);
+ c.resize(deg);
+ }
+
+ // a,b and c must have size: 2^lpts
+ // -> use TFT to circumvent the padding issue
+ void mul_fft (size_t lpts, MatrixP &c, MatrixP &a, MatrixP &b) {
+ FFT_PROFILE_START(1);
+ size_t m = a.rowdim();
+ size_t k = a.coldim();
+ size_t n = b.coldim();
+ size_t pts=c.size();
+ //std::cout<<"mul : 2^"<<lpts<<std::endl;
+#ifdef FFT_PROFILER
+ Timer totalTime;
+ totalTime.start();
+ if (FFT_PROF_LEVEL==1) std::cout<<"FFT: points "<<pts<<"\n";
+#endif
+
+ if ((_p-1) % pts != 0) {
+ std::cout<<"Error the prime is not a FFTPrime or it has too small power of 2\n";
+ std::cout<<"prime="<<_p<<std::endl;
+ std::cout<<"nbr points="<<pts<<std::endl;
+ throw LinboxError("LinBox ERROR: bad FFT Prime\n");
+ }
+ FFT_transform<Field> FFTer (field(), lpts);
+ FFT_transform<Field> FFTinv (field(), lpts, FFTer.getInvRoot());
+ FFT_PROFILING(1,"init");
+
+ // std::cout<<"FFT Root: "<<FFTer.getRoot()<<std::endl;
+ // std::cout<<"FFT InvRoot: "<<FFTer.getInvRoot()<<std::endl;
+ // std::cout<<a<<std::endl;
+ // std::cout<<b<<std::endl;
+
+ // FFT transformation on the input matrices
+ for (size_t i = 0; i < m * k; i++)
+ FFTer.FFT_DIF(&(a.ref(i,0)));
+ for (size_t i = 0; i < k * n; i++)
+ FFTer.FFT_DIF(&(b.ref(i,0)));
+ FFT_PROFILING(1,"direct FFT_DIF");
+
+ //std::cout<<"DIF: w="<<FFTer._w<<std::endl;
+ //std::cout<<a<<std::endl;
+ //std::cout<<b<<std::endl;
+
+
+ // convert the matrix representation to matfirst (with double coefficient)
+ PMatrix vm_c (field(), m, n, pts);
+#ifdef TRY1
+ BlasMatrix<Field> vm_a(field(),m,k);
+ BlasMatrix<Field> vm_b(field(),k,n);
+ FFT_PROFILING(1,"creation of Matfirst");
+
+ // Pointwise multiplication
+ for (size_t i = 0; i < pts; ++i){
+ a.setMatrix(vm_a,i);
+ b.setMatrix(vm_b,i);
+ _BMD.mul(vm_c[i], vm_a, vm_b);
+ }
+ FFT_PROFILING(1,"Pointwise mult");
+
+#else
+ PMatrix vm_a (field(), m, k, pts);
+ PMatrix vm_b (field(), k, n, pts);
+ FFT_PROFILING(1,"creation of Matfirst");
+ vm_a.copy(a);
+ vm_b.copy(b);
+ FFT_PROFILING(1,"Polfirst to Matfirst");
+
+ // Pointwise multiplication
+ for (size_t i = 0; i < pts; ++i)
+ _BMD.mul(vm_c[i], vm_a[i], vm_b[i]);
+ FFT_PROFILING(1,"Pointwise mult");
+#endif
+ // Transformation into matrix of polynomials (with int32_t coefficient)
+ c.copy(vm_c);
+ FFT_PROFILING(1,"Matfirst to Polfirst");
+
+ //std::cout<<"pointwise:"<<std::endl;
+ //std::cout<<c<<std::endl;
+
+ // Inverse FFT on the output matrix
+ for (size_t i = 0; i < m * n; i++)
+ FFTinv.FFT_DIT(&(c.ref(i,0)));
+ FFT_PROFILING(1,"inverse FFT_DIT");
+
+ // std::cout<<"DIT:"<<std::endl;
+ // std::cout<<c<<std::endl;
+
+ // Divide by pts = 2^lpts
+ typename Field::Element inv_pts;
+ field().init(inv_pts, pts);
+ field().invin(inv_pts);
+ // for (size_t i = 0; i < m * n; i++)
+ // for (size_t j = 0; j < pts; j++)
+ // field().mulin(c.ref(i,j), inv_pts);
+ FFLAS::fscalin(field(),c.rowdim()*c.coldim()*c.size(), inv_pts, c.getWritePointer(),1);
+
+ // std::cout<<"SCALIN:"<<std::endl;
+ // std::cout<<c<<std::endl;
+
+ FFT_PROFILING(1,"scaling the result");
+#ifdef FFT_PROFILER
+ totalTime.stop();
+ //std::cout<<"FFT(1): total time : "<<totalTime<<std::endl;
+#endif
+ }
+
+ // compute c= (a*b x^(-n0-1)) mod x^n1
+ // by defaut: n0=c.size() and n1=2*c.size();
+ template<typename Matrix1, typename Matrix2, typename Matrix3>
+ void midproduct (Matrix1 &c, const Matrix2 &a, const Matrix3 &b,
+ bool smallLeft=true, size_t n0=0,size_t n1=0) {
+ linbox_check(a.coldim()==b.rowdim());
+ size_t hdeg = (n0==0?c.size():n0);
+ size_t deg = (n1==0?2*hdeg:n1);
+ linbox_check(c.size()>=deg-hdeg);
+ if (smallLeft){
+ linbox_check(b.size()<hdeg+deg);
+ }
+ else
+ linbox_check(a.size()<hdeg+deg);
+
+ size_t lpts = 0;
+ size_t pts = 1; while (pts < deg) { pts= pts<<1; ++lpts; }
+ // padd the input a and b to 2^lpts (use MatrixP representation)
+ MatrixP a2(field(),a.rowdim(),a.coldim(),pts);
+ MatrixP b2(field(),b.rowdim(),b.coldim(),pts);
+ MatrixP c2(field(),c.rowdim(),c.coldim(),pts);
+ a2.copy(a,0,a.size()-1);
+ b2.copy(b,0,b.size()-1);
+
+ // reverse the element of the smallest polynomial according to h(x^-1)*x^(hdeg)
+ if (smallLeft)
+ for (size_t j=0;j<a2.rowdim()*a2.coldim();j++)
+ for (size_t i=0;i<hdeg/2;i++)
+ std::swap(a2.ref(j,i),a2.ref(j,hdeg-1-i));
+ else
+ for (size_t j=0;j<b2.rowdim()*b2.coldim();j++)
+ for (size_t i=0;i<hdeg/2;i++)
+ std::swap(b2.ref(j,i),b2.ref(j,hdeg-1-i));
+
+ midproduct_fft (lpts,c2, a2, b2, smallLeft);
+ c.copy(c2,0,c.size()-1);
+ }
+
+ // a,b and c must have size: 2^lpts
+ // -> a must have been already reversed according to the midproduct algorithm
+ void midproduct_fft (size_t lpts, MatrixP &c, MatrixP &a, MatrixP &b,
+ bool smallLeft=true) {
+ FFT_PROFILE_START(1);
+ size_t m = a.rowdim();
+ size_t k = a.coldim();
+ size_t n = b.coldim();
+ size_t pts=c.size();
+ //cout<<"mid : "<<pts<<endl;
+#ifdef FFT_PROFILER
+ if (FFT_PROF_LEVEL==1) std::cout<<"FFT: points "<<pts<<"\n";
+#endif
+ if ((_p-1) % pts != 0) {
+ std::cout<<"Error the prime is not a FFTPrime or it has too small power of 2\n";
+ std::cout<<"prime="<<_p<<std::endl;
+ std::cout<<"nbr points="<<pts<<std::endl;
+ throw LinboxError("LinBox ERROR: bad FFT Prime\n");
+ }
+ FFT_transform<Field> FFTer (field(), lpts);
+ FFT_transform<Field> FFTinv(field(), lpts, FFTer.getInvRoot());
+ FFT_PROFILING(1,"init");
+
+ // FFT transformation on the input matrices
+ if (smallLeft){
+ for (size_t i = 0; i < m * k; i++)
+ FFTer.FFT_DIF(&(a(i)[0]));
+ for (size_t i = 0; i < k * n; i++)
+ FFTinv.FFT_DIF(&(b(i)[0]));
+ }
+ else {
+ for (size_t i = 0; i < m * k; i++)
+ FFTinv.FFT_DIF(&(a(i)[0]));
+ for (size_t i = 0; i < k * n; i++)
+ FFTer.FFT_DIF(&(b(i)[0]));
+ }
+ FFT_PROFILING(1,"direct FFT_DIF");
+
+ // convert the matrix representation to matfirst (with double coefficient)
+ PMatrix vm_c (field(), m, n, pts);
+ PMatrix vm_a (field(), m, k, pts);
+ PMatrix vm_b (field(), k, n, pts);
+ FFT_PROFILING(1,"creation of Matfirst");
+ vm_a.copy(a);
+ vm_b.copy(b);
+ FFT_PROFILING(1,"Polfirst to Matfirst");
+
+ // Pointwise multiplication
+ for (size_t i = 0; i < pts; ++i)
+ _BMD.mul(vm_c[i], vm_a[i], vm_b[i]);
+ FFT_PROFILING(1,"pointwise mult");
+
+ // Transformation into matrix of polynomials (with int32_t coefficient)
+ c.copy(vm_c);
+ FFT_PROFILING(1,"Matfirst to Polfirst");
+
+ // Inverse FFT on the output matrix
+ for (size_t i = 0; i < m * n; i++)
+ FFTer.FFT_DIT(&(c(i)[0]));
+ FFT_PROFILING(1,"inverse FFT_DIT");
+
+ // Divide by pts = 2^ltps
+ typename Field::Element inv_pts;
+ field().init(inv_pts, pts);
+ field().invin(inv_pts);
+ // for (size_t i = 0; i < m * n; i++)
+ // for (size_t j = 0; j < pts; j++)
+ // field().mulin(c.ref(i,j), inv_pts);
+ FFLAS::fscalin(field(),c.rowdim()*c.coldim()*c.size(), inv_pts, c.getWritePointer(),1);
+ FFT_PROFILING(1,"scaling the result");
+ }
+ }; // end of class special FFT mul domain
+
+
+
+}//end of namespace LinBox
+
+#endif // __LINBOX_matpoly_mult_ftt_wordsize_fast_INL
diff --git a/linbox/algorithms/polynomial-matrix/matpoly-mult-fft-wordsize-three-primes.inl b/linbox/algorithms/polynomial-matrix/matpoly-mult-fft-wordsize-three-primes.inl
new file mode 100644
index 0000000..e68d0dc
--- /dev/null
+++ b/linbox/algorithms/polynomial-matrix/matpoly-mult-fft-wordsize-three-primes.inl
@@ -0,0 +1,291 @@
+/* -*- mode: C++; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
+/*
+ * Copyright (C) 2015 Pascal Giorgi
+ *
+ * Written by Pascal Giorgi <pascal.giorgi at lirmm.fr>
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ * ========LICENCE========
+ */
+#ifndef __LINBOX_matpoly_mult_ftt_wordsize_three_primes_INL
+#define __LINBOX_matpoly_mult_ftt_wordsize_three_primes_INL
+
+#include "givaro/modular.h"
+#include "fflas-ffpack/fflas-ffpack.h"
+#include "linbox/matrix/polynomial-matrix.h"
+#include "linbox/matrix/matrix-domain.h"
+#include "linbox/algorithms/polynomial-matrix/polynomial-fft-transform.h"
+#include "linbox/algorithms/polynomial-matrix/matpoly-mult-fft-wordsize-fast.inl"
+#include "linbox/randiter/random-fftprime.h"
+#include <cmath>
+
+namespace LinBox {
+
+ /***********************************************************************************
+ **** Polynomial Matrix Multiplication over Zp[x] with p (FFLAS prime) ***
+ ***********************************************************************************/
+ template<class Field>
+ class PolynomialMatrixThreePrimesFFTMulDomain {
+ public:
+ // Polynomial matrix stored as a matrix of polynomial
+ typedef PolynomialMatrix<PMType::polfirst,PMStorage::plain,Field> MatrixP;
+ // Polynomial matrix stored as a polynomial of matrix
+ typedef PolynomialMatrix<PMType::matfirst,PMStorage::plain,Field> PMatrix;
+ //typedef Givaro::Modular<double> ModField;
+ typedef Field ModField;
+ private:
+ const Field *_field; // Read only
+ uint64_t _p;
+
+ public:
+ inline const Field & field() const { return *_field; }
+
+ PolynomialMatrixThreePrimesFFTMulDomain(const Field &F)
+ : _field(&F), _p(field().cardinality())
+ {
+ if (integer(_p).bitsize()>29) {
+ std::cout<<"MatPoly MUL FFT 3-primes: error initial prime has more than 29 bits exiting.."<<std::endl;
+ throw LinboxError("LinBox ERROR: too large FFT Prime (more than 29 bits \n");
+ }
+ }
+
+ template<typename Matrix1, typename Matrix2, typename Matrix3>
+ void mul (Matrix1 &c, const Matrix2 &a, const Matrix3 &b) {
+ linbox_check(a.coldim()==b.rowdim());
+ size_t deg = a.size()+b.size()-1;
+ size_t lpts = 0;
+ size_t pts = 1; while (pts < deg) { pts= pts<<1; ++lpts; }
+ // padd the input a and b to 2^lpts (convert to MatrixP representation)
+ MatrixP a2(field(),a.rowdim(),a.coldim(),pts);
+ MatrixP b2(field(),b.rowdim(),b.coldim(),pts);
+ a2.copy(a,0,a.size()-1);
+ b2.copy(b,0,b.size()-1);
+ MatrixP c2(field(),c.rowdim(),c.coldim(),pts);
+ mul_fft (lpts,c2, a2, b2);
+ c.copy(c2,0,deg-1);
+ }
+
+ void mul (MatrixP &c, const MatrixP &a, const MatrixP &b) {
+ linbox_check(a.coldim()==b.rowdim());
+ size_t deg = a.size()+b.size()-1;
+ size_t lpts = 0;
+ size_t pts = 1; while (pts < deg) { pts= pts<<1; ++lpts; }
+ // padd the input a and b to 2^lpts
+ MatrixP a2(field(),a.rowdim(),a.coldim(),pts);
+ MatrixP b2(field(),b.rowdim(),b.coldim(),pts);
+ a2.copy(a,0,a.size()-1);
+ b2.copy(b,0,b.size()-1);
+ // resize c to 2^lpts
+ c.resize(pts);
+ mul_fft (lpts,c, a2, b2);
+ c.resize(deg);
+ }
+
+ void mul_fft (size_t lpts, MatrixP &c, MatrixP &a, MatrixP &b) {
+ size_t pts=c.size();
+ if ((_p-1) % pts == 0){
+ PolynomialMatrixFFTPrimeMulDomain<ModField> fftprime_domain (field());
+ fftprime_domain.mul_fft(lpts,c,a,b);
+ return;
+ }
+ //std::cout<<"a:="<<a<<std::endl;
+ //std::cout<<"b:="<<b<<std::endl;
+ linbox_check(a.coldim() == b.rowdim());
+ size_t m = a.rowdim();
+ size_t k = a.coldim();
+ size_t n = b.coldim();
+
+
+ integer bound=integer((uint64_t)_p)*integer((uint64_t)_p)*integer((uint64_t)k)*integer((uint64_t)pts);
+ // compute bit size of feasible prime for FFLAS
+ // size_t _k=k,lk=0;
+ // while ( _k ) {_k>>=1; ++lk;}
+ // size_t prime_bitsize= (53-lk)>>1;
+
+ // compute max prime value for FFLAS
+ uint64_t prime_max= std::sqrt( (1ULL<<53) / k)+1;
+ RandomFFTPrime RdFFT(prime_max);
+ std::vector<integer> bas;
+ if (!RdFFT.generatePrimes(lpts,bound,bas)){
+ std::cout<<"COULD NOT FIND ENOUGH FFT PRIME in MatPoly 3-Primes FFT MUL exiting..."<<std::endl;
+ std::cout<<"Parameters : ("<<m<<"x"<<k<<") ("<<k<<"x"<<n<<") with "<<pts<<" points with prime= "<<_p<<std::endl;
+ throw LinboxError("LinBox ERROR: not enough FFT Prime\n");
+ }
+ //std::cout<<"MUL FFT 3-PRIME found enough prime"<<std::endl;
+ size_t num_primes = bas.size();
+ std::vector<double> basis(num_primes);
+ std::copy(bas.begin(),bas.end(),basis.begin());
+
+ std::vector<MatrixP*> c_i (num_primes);
+ std::vector<ModField> f(num_primes,ModField(2));
+ for (size_t l=0;l<num_primes;l++)
+ f[l]=ModField(basis[l]);
+
+ for (size_t l=0;l<num_primes;l++){
+ PolynomialMatrixFFTPrimeMulDomain<ModField> fftdomain (f[l]);
+ MatrixP ai(f[l],m,k,pts);
+ MatrixP bi(f[l],k,n,pts);
+ FFLAS::fassign(f[l],m*k*pts,a.getPointer(),1,ai.getWritePointer(),1);
+ FFLAS::fassign(f[l],k*n*pts,b.getPointer(),1,bi.getWritePointer(),1);
+ c_i[l] = new MatrixP(f[l], m, n, pts);
+ fftdomain.mul_fft(lpts, *c_i[l], ai, bi);
+ //std::cout<<"pi:="<<(uint64_t)basis[l]<<std::endl;
+ //std::cout<<"ci:="<<*c_i[l]<<std::endl;
+ }
+
+ // reconstruct the result with MRS
+ typename Field::Element alpha;
+ typename Field::Element beta=field().one;
+ FFLAS::freduce(field(),m*n*c.size(),c_i[0]->getPointer(),1,c.getWritePointer(),1);
+ for (size_t i=1;i<num_primes;i++){
+ for(size_t j=0;j<i;j++){
+ f[i].init(alpha,basis[j]);
+ f[i].invin(alpha);
+ FFLAS::fsubin (f[i],m*n*pts,c_i[j]->getPointer(),1,c_i[i]->getWritePointer(),1);
+ FFLAS::fscalin(f[i],m*n*pts,alpha,c_i[i]->getWritePointer(),1);
+ }
+ field().mulin(beta,basis[i-1]);
+ FFLAS::faxpy(field(),m*n*pts,beta,c_i[i]->getPointer(),1,c.getWritePointer(),1);
+ }
+
+ //std::cout<<"c:="<<c<<std::endl;
+
+ for (size_t i=1;i<num_primes;i++)
+ delete c_i[i];
+ }
+
+ // compute c= (a*b x^(-n0-1)) mod x^n1
+ // by defaut: n0=c.size() and n1=2*c.size();
+ template<typename Matrix1, typename Matrix2, typename Matrix3>
+ void midproduct (Matrix1 &c, const Matrix2 &a, const Matrix3 &b,
+ bool smallLeft=true, size_t n0=0,size_t n1=0) {
+ linbox_check(a.coldim()==b.rowdim());
+ size_t hdeg = (n0==0?c.size():n0);
+ size_t deg = (n1==0?2*hdeg:n1);
+ linbox_check(c.size()>=deg-hdeg);
+ if (smallLeft){
+ linbox_check(b.size()<hdeg+deg);
+ }
+ else
+ linbox_check(a.size()<hdeg+deg);
+
+ size_t lpts = 0;
+ size_t pts = 1; while (pts < deg) { pts= pts<<1; ++lpts; }
+ // padd the input a and b to 2^lpts (use MatrixP representation)
+ MatrixP a2(field(),a.rowdim(),a.coldim(),pts);
+ MatrixP b2(field(),b.rowdim(),b.coldim(),pts);
+ MatrixP c2(field(),c.rowdim(),c.coldim(),pts);
+ a2.copy(a,0,a.size()-1);
+ b2.copy(b,0,b.size()-1);
+
+ // reverse the element of the smallest polynomial according to h(x^-1)*x^(hdeg)
+ if (smallLeft)
+ for (size_t j=0;j<a2.rowdim()*a2.coldim();j++)
+ for (size_t i=0;i<hdeg/2;i++)
+ std::swap(a2.ref(j,i),a2.ref(j,hdeg-1-i));
+ else
+ for (size_t j=0;j<b2.rowdim()*b2.coldim();j++)
+ for (size_t i=0;i<hdeg/2;i++)
+ std::swap(b2.ref(j,i),b2.ref(j,hdeg-1-i));
+
+ midproduct_fft (lpts,c2, a2, b2, smallLeft);
+ c.copy(c2,0,c.size()-1);
+ }
+
+
+ // a,b and c must have size: 2^lpts
+ // -> a must have been already reversed according to the midproduct algorithm
+ void midproduct_fft (size_t lpts, MatrixP &c, MatrixP &a, MatrixP &b,
+ bool smallLeft=true) {
+ size_t pts=c.size();
+ if ((_p-1) % pts == 0){
+ PolynomialMatrixFFTPrimeMulDomain<ModField> fftprime_domain (field());
+ fftprime_domain.midproduct_fft(lpts,c,a,b,smallLeft);
+ return;
+ }
+ size_t m = a.rowdim();
+ size_t k = a.coldim();
+ size_t n = b.coldim();
+
+ integer bound=integer(_p)*integer(_p)*integer((uint64_t)k)*integer((uint64_t)pts);
+
+ // compute bit size of feasible prime for FFLAS
+ // size_t _k=k,lk=0;
+ // while ( _k ) {_k>>=1; ++lk;}
+ // size_t prime_bitsize= (53-lk)>>1;
+
+ // compute max prime value for FFLAS
+ uint64_t prime_max= std::sqrt( (1ULL<<53) / k)+1;
+ RandomFFTPrime RdFFT(prime_max);
+
+ std::vector<integer> bas;
+
+
+ if (!RdFFT.generatePrimes(lpts,bound,bas)){
+ std::cout<<"COULD NOT FIND ENOUGH FFT PRIME in MatPoly 3-Primes FFT MIDP exiting..."<<std::endl;
+ std::cout<<"Parameters : ("<<m<<"x"<<k<<") ("<<k<<"x"<<n<<") with "<<pts<<" points with prime= "<<_p<<std::endl;
+ throw LinboxError("LinBox ERROR: not enough FFT Prime\n");
+ }
+ size_t num_primes = bas.size();
+
+ std::vector<double> basis(num_primes);
+ std::copy(bas.begin(),bas.end(),basis.begin());
+
+ std::vector<MatrixP*> c_i (num_primes);
+ std::vector<ModField> f(num_primes,ModField(2));
+ for (size_t l=0;l<num_primes;l++)
+ f[l]=ModField(basis[l]);
+
+ for (size_t l=0;l<num_primes;l++){
+ PolynomialMatrixFFTPrimeMulDomain<ModField> fftdomain (f[l]);
+ MatrixP ai(f[l],m,k,pts);
+ MatrixP bi(f[l],k,n,pts);
+ FFLAS::fassign(f[l],m*k*pts,a.getPointer(),1,ai.getWritePointer(),1);
+ FFLAS::fassign(f[l],k*n*pts,b.getPointer(),1,bi.getWritePointer(),1);
+ c_i[l] = new MatrixP(f[l], m, n, pts);
+ fftdomain.midproduct_fft(lpts, *c_i[l], ai, bi,smallLeft);
+ //std::cout<<"pi:="<<(uint64_t)basis[l]<<std::endl;
+ //std::cout<<"ci:="<<*c_i[l]<<std::endl;
+ }
+
+ // reconstruct the result with MRS
+ typename Field::Element alpha;
+ typename Field::Element beta=field().one;
+ FFLAS::freduce(field(),m*n*pts,c_i[0]->getPointer(),1,c.getWritePointer(),1);
+ for (size_t i=1;i<num_primes;i++){
+ for(size_t j=0;j<i;j++){
+ f[i].init(alpha,basis[j]);
+ f[i].invin(alpha);
+ FFLAS::fsubin (f[i],m*n*pts,c_i[j]->getPointer(),1,c_i[i]->getWritePointer(),1);
+ FFLAS::fscalin(f[i],m*n*pts,alpha,c_i[i]->getWritePointer(),1);
+ }
+ field().mulin(beta,basis[i-1]);
+ FFLAS::faxpy(field(),m*n*pts,beta,c_i[i]->getPointer(),1,c.getWritePointer(),1);
+ }
+
+ //std::cout<<"c:="<<c<<std::endl;
+
+ for (size_t i=1;i<num_primes;i++)
+ delete c_i[i];
+
+ }
+
+ };
+} // end of namespace LinBox
+
+#endif
diff --git a/linbox/algorithms/polynomial-matrix/matpoly-mult-fft-wordsize.inl b/linbox/algorithms/polynomial-matrix/matpoly-mult-fft-wordsize.inl
new file mode 100644
index 0000000..c09f31e
--- /dev/null
+++ b/linbox/algorithms/polynomial-matrix/matpoly-mult-fft-wordsize.inl
@@ -0,0 +1,127 @@
+/* -*- mode: C++; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
+/*
+ * Copyright (C) 2013 Pascal Giorgi
+ * Romain Lebreton
+ *
+ * Written by Pascal Giorgi <pascal.giorgi at lirmm.fr>
+ * Romain Lebreton <lebreton at lirmm.fr>
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ * ========LICENCE========
+ */
+#ifndef __LINBOX_matpoly_mult_ftt_wordsize_INL
+#define __LINBOX_matpoly_mult_ftt_wordsize_INL
+
+#include "linbox/ring/modular.h"
+#include "linbox/matrix/matrix-domain.h"
+#include "linbox/matrix/polynomial-matrix.h"
+#include "linbox/algorithms/polynomial-matrix/matpoly-mult-fft-wordsize-three-primes.inl"
+#include "linbox/algorithms/polynomial-matrix/matpoly-mult-fft-wordsize-fast.inl"
+namespace LinBox {
+
+ /**************************************************************
+ * Polynomial Matrix Multiplication over Zp[x] with p <2^32 ***
+ **************************************************************/
+ template <class T1, class T2>
+ class PolynomialMatrixFFTMulDomain<Givaro::Modular<T1,T2> > {
+ public:
+ typedef Givaro::Modular<T1,T2> Field;
+ typedef Givaro::Modular<integer> LargeField;
+ typedef typename Field::Element Element;
+ typedef PolynomialMatrix<PMType::polfirst,PMStorage::plain,Field> MatrixP;
+ typedef PolynomialMatrix<PMType::polfirst,PMStorage::plain,LargeField> MatrixP_L;
+
+ private:
+ const Field *_field; // Read only
+ uint64_t _p;
+ public:
+ inline const Field & field() const { return *_field; }
+
+ PolynomialMatrixFFTMulDomain (const Field& F) : _field(&F), _p(F.cardinality()) {}
+
+ template<typename Matrix1, typename Matrix2, typename Matrix3>
+ void mul (Matrix1 &c, const Matrix2 &a, const Matrix3 &b) {
+ uint64_t pts= 1<<(integer((uint64_t)a.size()+b.size()-1).bitsize());
+ if ( _p< 536870912ULL && ((_p-1) % pts)==0){
+ PolynomialMatrixFFTPrimeMulDomain<Field> MulDom(field());
+ MulDom.mul(c,a,b);
+ }
+ else {
+ if (_p< 536870912ULL){
+ PolynomialMatrixThreePrimesFFTMulDomain<Field> MulDom(field());
+ MulDom.mul(c,a,b);
+ }
+ else {
+ // use computation with Givaro::Modular<integer>
+ // -> could be optimized in some cases (e.g. output entries less than 2^64)
+ FFT_PROFILE_START(2);
+ LargeField Fp(_p);
+ PolynomialMatrixFFTMulDomain<LargeField> MulDom(Fp);
+ MatrixP_L a2(Fp,a.rowdim(),a.coldim(),a.size());
+ MatrixP_L b2(Fp,b.rowdim(),b.coldim(),b.size());
+ MatrixP_L c2(Fp,c.rowdim(),c.coldim(),c.size());
+ a2.copy(a,0,a.size()-1);
+ b2.copy(b,0,b.size()-1);
+ FFT_PROFILING(2,"converting rep of polynomial matrix input");
+ MulDom.mul(c2,a2,b2);
+ c.copy(c2,0,c.size()-1);
+ FFT_PROFILING(2,"converting rep of polynomial matrix output");
+ }
+ }
+ }
+
+ template<typename Matrix1, typename Matrix2, typename Matrix3>
+ void midproduct (Matrix1 &c, const Matrix2 &a, const Matrix3 &b,
+ bool smallLeft=true, size_t n0=0,size_t n1=0) {
+ uint64_t pts= 1<<(integer((uint64_t)a.size()+b.size()-1).bitsize());
+ if (_p< 536870912ULL && ((_p-1) % pts)==0){
+ //std::cout<<"MIDP: Staying with FFT Prime Field"<<std::endl;
+ PolynomialMatrixFFTPrimeMulDomain<Field> MulDom(field());
+ MulDom.midproduct(c,a,b,smallLeft,n0,n1);
+ }
+ else {
+ if (_p< 536870912ULL){
+ PolynomialMatrixThreePrimesFFTMulDomain<Field> MulDom(field());
+ MulDom.midproduct(c,a,b,smallLeft,n0,n1);
+ }
+ else { // use computation with Givaro::Modular<integer>
+ //-> could be optimized in some cases (e.g. output entries less than 2^64)
+ FFT_PROFILE_START(2);
+ //std::cout<<"MIDP: Switching to Large Field"<<std::endl;
+ LargeField Fp(_p);
+ PolynomialMatrixFFTMulDomain<LargeField> MulDom(Fp);
+ MatrixP_L a2(Fp,a.rowdim(),a.coldim(),a.size());
+ MatrixP_L b2(Fp,b.rowdim(),b.coldim(),b.size());
+ MatrixP_L c2(Fp,c.rowdim(),c.coldim(),c.size());
+ a2.copy(a,0,a.size()-1);
+ b2.copy(b,0,b.size()-1);
+ FFT_PROFILING(2,"converting rep of polynomial matrix input");
+ MulDom.midproduct(c2,a2,b2,smallLeft,n0,n1);
+ c.copy(c2,0,c.size()-1);
+ FFT_PROFILING(2,"converting rep of polynomial matrix output");
+ }
+ }
+ }
+
+
+ };
+
+
+}//end of namespace LinBox
+
+#endif // __LINBOX_matpoly_mult_ftt_wordsize_INL
diff --git a/linbox/algorithms/polynomial-matrix/matpoly-mult-fft.h b/linbox/algorithms/polynomial-matrix/matpoly-mult-fft.h
new file mode 100755
index 0000000..8e7a06d
--- /dev/null
+++ b/linbox/algorithms/polynomial-matrix/matpoly-mult-fft.h
@@ -0,0 +1,120 @@
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
+/* -*- mode: C++; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
+/*
+ * Copyright (C) 2013 Pascal Giorgi
+ * Romain Lebreton
+ *
+ * Written by Pascal Giorgi <pascal.giorgi at lirmm.fr>
+ * Romain Lebreton <lebreton at lirmm.fr>
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ * ========LICENCE========
+ */
+
+#ifndef __LINBOX_matpoly_mult_ftt_H
+#define __LINBOX_matpoly_mult_ftt_H
+
+#include "linbox/util/error.h"
+#include "linbox/util/debug.h"
+#include "linbox/util/timer.h"
+
+#include "linbox/integer.h"
+#include <givaro/zring.h>
+#include "linbox/ring/modular.h"
+#include "givaro/givtimer.h"
+
+#ifdef FFT_PROFILER
+#include <iostream>
+#ifndef FFT_PROF_LEVEL
+int FFT_PROF_LEVEL=1;
+#endif
+Givaro::Timer mychrono[3];
+#define FFT_PROF_MSG_SIZE 35
+#define FFT_PROFILE_START(lvl) mychrono[lvl].clear();mychrono[lvl].start();
+
+#define FFT_PROFILING(lvl,msg) \
+ if (lvl>=FFT_PROF_LEVEL) { \
+ mychrono[lvl].stop();std::cout<<"FFT("<<lvl<<"):"; \
+ std::cout.width(FFT_PROF_MSG_SIZE);std::cout<<std::left<<msg<<" : "; \
+ std::cout.precision(6);std::cout<<mychrono[lvl]<<std::endl; \
+ mychrono[lvl].clear();mychrono[lvl].start(); \
+}
+
+#ifdef HAVE_OPENMP
+#define FFT_PROFILE_GET(lvl,x) \
+ // mychrono.stop();(x)+=mychrono.realtime();mychrono.clear();mychrono.start();
+#else
+#define FFT_PROFILE_GET(lvl,x) \
+ mychrono[lvl].stop();(x)+=mychrono[lvl].usertime();mychrono[lvl].clear();mychrono[lvl].start();
+#endif
+#define FFT_PROFILE(lvl,msg,x) \
+if ((lvl)>=FFT_PROF_LEVEL) { \
+ std::cout<<"FFT: "; \
+ std::cout.width(FFT_PROF_MSG_SIZE);std::cout<<std::left<<msg<<" : "; \
+ std::cout.precision(6);std::cout<<x<<" s"<<std::endl; \
+}
+#else
+#define FFT_PROFILE_START(lvl)
+#define FFT_PROFILING(lvl,msg)
+#define FFT_PROFILE_GET(lv,x)
+#define FFT_PROFILE(lvl,msg,x)
+#endif // FFT_PROFILER
+
+
+#ifndef FFT_DEG_THRESHOLD
+#define FFT_DEG_THRESHOLD 4
+#endif
+
+namespace LinBox
+{
+ // generic handler for multiplication using FFT
+ template <class Field>
+ class PolynomialMatrixFFTMulDomain {
+ public:
+ inline const Field & field() const;
+
+ PolynomialMatrixFFTMulDomain (const Field& F);
+
+ template<typename Matrix1, typename Matrix2, typename Matrix3>
+ void mul (Matrix1 &c, const Matrix2 &a, const Matrix3 &b);
+
+ template<typename Matrix1, typename Matrix2, typename Matrix3>
+ void midproduct (Matrix1 &c, const Matrix2 &a, const Matrix3 &b, bool smallLeft=true, size_t n0=0,size_t n1=0);
+ };
+
+
+ //class PolynomialMatrixFFTPrimeMulDomain ; // Mul in Zp[x] with p <2^32, (fflas, fourier)
+
+ // template <class T>
+ // class PolynomialMatrixFFTMulDomain<Givaro::Modular<T> > ; // Mul in Zp[x] with p^2 storable in type T
+
+ // template<>
+ // class PolynomialMatrixFFTMulDomain<Givaro::ZRing<integer> >; // Mul in Z[x]
+
+ // template <>
+ // class PolynomialMatrixFFTMulDomain<Givaro::Modular<integer> > ; // Mul in Zp[x] with p multiprecision
+
+} // end of namespace LinBox
+
+#include "linbox/algorithms/polynomial-matrix/matpoly-mult-fft-wordsize-fast.inl"
+#include "linbox/algorithms/polynomial-matrix/matpoly-mult-fft-wordsize-three-primes.inl"
+#include "linbox/algorithms/polynomial-matrix/matpoly-mult-fft-multiprecision.inl"
+#include "linbox/algorithms/polynomial-matrix/matpoly-mult-fft-recint.inl"
+#include "linbox/algorithms/polynomial-matrix/matpoly-mult-fft-wordsize.inl"
+
+#endif // __LINBOX_matpoly_mult_ftt_H
diff --git a/linbox/algorithms/polynomial-matrix/matpoly-mult-kara.h b/linbox/algorithms/polynomial-matrix/matpoly-mult-kara.h
new file mode 100755
index 0000000..1faefea
--- /dev/null
+++ b/linbox/algorithms/polynomial-matrix/matpoly-mult-kara.h
@@ -0,0 +1,364 @@
+/* -*- mode: C++; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
+/*
+ * Copyright (C) 2013 Pascal Giorgi
+ *
+ * Written by Pascal Giorgi <pascal.giorgi at lirmm.fr>
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ * ========LICENCE========
+ */
+#ifndef __LINBOX_matpoly_mult_kara_H
+#define __LINBOX_matpoly_mult_kara_H
+
+#include "linbox/algorithms/polynomial-matrix/matpoly-add-domain.h"
+#include "linbox/algorithms/polynomial-matrix/matpoly-mult-naive.h"
+#include <algorithm>
+
+#ifndef KARA_DEG_THRESHOLD
+#define KARA_DEG_THRESHOLD 4
+#endif
+
+namespace LinBox
+{
+ template<class Field>
+ class PolynomialMatrixKaraDomain {
+ private:
+ const Field *_field;
+ PolynomialMatrixAddDomain<Field> _PMD;
+ PolynomialMatrixNaiveMulDomain<Field> _NMD;
+ double _timeMul, _timeAdd;
+ public:
+ // Polynomial matrix stored as a matrix of polynomial
+ typedef PolynomialMatrix<PMType::polfirst,PMStorage::plain,Field> MatrixP;
+ // Polynomial matrix stored as a polynomial of matrix
+ typedef PolynomialMatrix<PMType::matfirst,PMStorage::plain,Field> PMatrix;
+ template <PMStorage S> using _PMatrix = PolynomialMatrix<PMType::matfirst,S,Field>;
+
+ const Field & field() const { return *_field; }
+
+ PolynomialMatrixKaraDomain(const Field &F) :
+ _field(&F), _PMD(F), _NMD(F){}
+
+ // c must be allocated with the right size
+ template<typename Matrix1,typename Matrix2,typename Matrix3>
+ void mul(Matrix1 &c, const Matrix2 &a, const Matrix3 &b)
+ {
+ PMatrix a2(field(),a.rowdim(),a.coldim(),a.size());
+ PMatrix b2(field(),b.rowdim(),b.coldim(),b.size());
+ a2.copy(a,0,a.size()-1);
+ b2.copy(b,0,b.size()-1);
+ PMatrix c2(field(),c.rowdim(),c.coldim(),a.size()+b.size()-1);
+ mul(c2, a2, b2);
+ c.copy(c2,0,c2.size()-1);
+ }
+
+ void mul(PMatrix &c, const PMatrix &a, const PMatrix &b){
+ linbox_check(c.size() >= (a.size()+b.size()-1));
+ typename PMatrix::plain t(*_field,c.rowdim(),c.coldim(),std::max(a.size(),b.size()));
+#ifdef KARA_TIMING
+ _timeMul=_timeAdd=0.;
+ Timer chrono;
+ chrono.start();
+#endif
+ Karatsuba_mul(c,a,b,t);
+#ifdef KARA_TIMING
+ cout<<" Karatsuba Multiplication: add : "<<_timeAdd<<" s"<<endl;
+ cout<<" Karatsuba Multiplication: mul : "<<_timeMul<<" s"<<endl;
+ cout<<" Karatsuba Multiplication: total : "<<chrono.userElapsedTime()<<" s"<<endl<<endl;
+#endif
+ }
+
+ // c must be of size n
+ // b must be of size 2n-1
+ // a is of size <=n
+ // compute c= (a*b x^(-n)) mod x^n
+
+ template<typename Matrix1,typename Matrix2,typename Matrix3>
+ void midproduct(Matrix1 &c, const Matrix2 &a, const Matrix3 &b)
+ {
+ PMatrix a2(field(),a.rowdim(),a.coldim(),a.size());
+ PMatrix b2(field(),b.rowdim(),b.coldim(),b.size());
+ a2.copy(a,0,a.size()-1);
+ b2.copy(b,0,b.size()-1);
+ PMatrix c2(field(),c.rowdim(),c.coldim(),c.size());
+ midproduct(c2, a2, b2);
+ c.copy(c2,0,c2.size()-1);
+ }
+
+ void midproduct(PMatrix &c, const PMatrix &a, const PMatrix &b){
+ linbox_check(2*c.size()-1==b.size());
+ typename PMatrix::plain t(field(),c.rowdim(),c.coldim(),3*c.size());
+ // Rk: if n is a power of two, only 2n-1 extra storage is needed
+ // if n is odd, 5(n-1)/2 extra storage is needed
+#ifdef KARA_TIMING
+ _timeMul=_timeAdd=0.;
+ Timer chrono;
+ chrono.start();
+#endif
+ typename PMatrix::plain a2(field(),a.rowdim(), a.coldim(), c.size());
+ a2.copy(a,0,a.size()-1);
+ Karatsuba_midproduct(c,a2,b,t);
+#ifdef KARA_TIMING
+ cout<<" Karatsuba Multiplication: add : "<<_timeAdd<<" s"<<endl;
+ cout<<" Karatsuba Multiplication: mul : "<<_timeMul<<" s"<<endl;
+ cout<<" Karatsuba Multiplication: total : "<<chrono.userElapsedTime()<<" s"<<endl<<endl;
+#endif
+ }
+
+
+ protected:
+
+ template<typename PMatrix1,typename PMatrix2,typename PMatrix3, typename PMatrix4>
+ void Karatsuba_mul(PMatrix1 &C, const PMatrix2 &A, const PMatrix3& B, PMatrix4 &TMP) {
+
+ //cout<<A.size()<<"x"<<B.size()<<"->"<<C.size()<<" ("<<TMP.size()<<")"<<endl;
+ Timer chrono;
+ if ((A.size() <=KARA_DEG_THRESHOLD) || (B.size()<=KARA_DEG_THRESHOLD)) {
+#ifdef KARA_TIMING
+ chrono.start();
+#endif
+ _NMD.mul(C,A,B);
+#ifdef KARA_TIMING
+ _timeMul+=chrono.userElapsedTime();
+#endif
+ }
+ else {
+#ifdef KARA_TIMING
+ chrono.start();
+#endif
+ size_t dA, dB, p, p2, q,qA, qB, n2;
+ dA = A.size();
+ dB = B.size();
+ n2=dA+dB;
+ p=std::max((dA>>1)+(dA&1),(dB>>1) +(dB&1));
+ p2=p<<1;
+ qA= dA - p;
+ qB= dB - p;
+ q=std::max(qA,qB);
+ typename PMatrix::const_view Ah,Al;
+ typename PMatrix::const_view Bh,Bl;
+ typename PMatrix::view C0,C1,C2,TMP0;
+ Al=A.at(0,p-1); Ah=A.at(p,dA-1);
+ Bl=B.at(0,p-1); Bh=B.at(p,dB-1);
+
+ // add low and high terms of A in C[0,p-1]
+ C0=C.at(0,p-1);
+ _PMD.add(C0,Al,Ah);
+
+ // add low and high terms of B in C[p,2p-1]
+ C1=C.at(p,p2-1);
+ _PMD.add(C1,Bl,Bh);
+#ifdef KARA_TIMING
+ _timeAdd+=chrono.userElapsedTime();
+#endif
+ // multiply the sums in TMP[0,p2-2] using C[p2,n2-2] as temporary
+ C2=C.at(p2,n2-2);
+ TMP0=TMP.at(0,p2-2);
+ Karatsuba_mul(TMP0,C0,C1,C2);
+
+ // multiply high terms in C[p2,n2-2] using C[0,q-1] as temporary
+ C0=C.at(0,q-1);
+ Karatsuba_mul(C2, Ah,Bh, C0);
+#ifdef KARA_TIMING
+ chrono.start();
+#endif
+ // subtract the high product from the product of the sums
+ _PMD.subin(TMP0,C2);
+
+ // add TMP to the result at the right position (add when only necessary)
+ for (size_t i=p;i<=p2-1;i++) C[i]=TMP[i-p];
+ if (p>=2){
+ C2=C.at(p2,p2+p-2);
+ TMP0=TMP.at(p,p2-2);
+ _PMD.addin(C2,TMP0);
+ }
+#ifdef KARA_TIMING
+ _timeAdd+=chrono.userElapsedTime();
+#endif
+
+ // multiply low terms in TMP[0,2p-2] using C[2p,n2-2]] as temporary
+ TMP0=TMP.at(0,p2-2);
+ C0=C.at(0,p-1);
+ Karatsuba_mul(TMP0,Al,Bl,C0);
+
+#ifdef KARA_TIMING
+ chrono.start();
+#endif
+ // subtract the low product from result at the right place
+ C1=C.at(p,p+p2-2);
+ _PMD.subin(C1,TMP0);
+
+ // add TMP to the result at the right position (add when only necessary)
+ for (size_t i=0;i<=p-1;i++) C[i]=TMP[i];
+ if (p>=2){
+ C1=C.at(p,p2-2);
+ TMP0=TMP.at(p,p2-2);
+ _PMD.addin(C1,TMP0);
+ }
+#ifdef KARA_TIMING
+ _timeAdd+=chrono.userElapsedTime();
+#endif
+ }
+ }
+
+ // a is of size n
+ // b is of size 2n-1
+ // c is of size n
+ // compute c= (a*b x^(-n)) mod x^n
+ // TMP must be of size 2n
+ template<typename PMatrix1,typename PMatrix2,typename PMatrix3>
+ void Karatsuba_midproduct(PMatrix1 &C, const PMatrix2 &A, const PMatrix3& B, PMatrix1 &TMP) {
+
+ //cout<<A.size()<<"x"<<B.size()<<"->"<<C.size()<<" ("<<TMP.size()<<")\n";
+ Timer chrono;
+ if ((A.size() <=KARA_DEG_THRESHOLD) || (B.size()<=KARA_DEG_THRESHOLD)) {
+#ifdef KARA_TIMING
+ chrono.start();
+#endif
+ //cout<<"-------------------------------------------------"<<endl;
+ _NMD.midproduct(C,A,B);
+#ifdef KARA_TIMING
+ _timeMul+=chrono.userElapsedTime();
+#endif
+ }
+ else {
+#ifdef KARA_TIMING
+ chrono.start();
+#endif
+ //cout<<"* BEGIN ***********************************************"<<endl;
+ size_t n,n0,n1,s0,s1;
+ n=C.size();
+ n0=n>>1; // n0 <= n1
+ n1=n-n0;
+ s0=2*n0-1;
+ s1=2*n1-1;
+ // cout<<"n="<<n<<endl;
+ // cout<<"n0="<<n0<<endl;
+ // cout<<"n1="<<n1<<endl;
+ // cout<<"s0="<<s0<<endl;
+ // cout<<"s1="<<s1<<endl;
+ // cout<<"TMP SIZE:"<<TMP.size()<<endl;
+ typename PMatrix::const_view Ah,Al;
+ typename PMatrix::const_view Bh,Bm0,Bm1,Bl;
+ typename PMatrix::view C0,C1,TMP0,TMP1,TMP2;
+ Al=A.at(0,n0-1); // size: n0
+ Ah=A.at(n0,n-1); // size: n1
+ Bl=B.at(0,s1-1); // size: 2n1-1
+ Bh=B.at(2*n1,2*n1+s0-1);// size: 2n0-1
+ Bm0=B.at(n1,n1+s0-1); // size: 2n0-1
+ Bm1=B.at(n1,n1+s1-1); // size: 2n1-1
+ //cout<<"@@@@@@@@@@@@@@@@"<<endl;
+ //cout.flush();
+
+ // add Bl and Bm1 in C[0,s1-1]
+
+ C0=C.at(0,s1-1);
+ _PMD.add(C0,Bl,Bm1);
+#ifdef KARA_TIMING
+ _timeAdd+=chrono.userElapsedTime();
+#endif
+ // 1) TMP[0,n1-1]= midproduct(Ah,Bl+Bm1) using TMP[n1,n1+s1] as temporary
+ TMP0=TMP.at(0,n1-1);
+ TMP1=TMP.at(n1,4*n1-1);
+ Karatsuba_midproduct(TMP0,Ah,C0,TMP1);
+ //cout<<"alpha=:"<<TMP0<<endl;
+#ifdef KARA_TIMING
+ chrono.start();
+#endif
+ // copy TMP[0,n1-1] to C[0,n1-1]
+ C0=C.at(0,n1-1);
+ C0.copy(TMP0);
+
+ if(n0!=n1) {
+ TMP[2*n-1]=C[n1-1];
+ // compute Ah-x*Al in C[n0,n-1]
+ C1=C.at(n0,n-1);
+ C1.copy(Ah,0,n1-1);
+ C1=C.at(n1,n-1);
+ _PMD.subin(C1,Al);
+ C1=C.at(n0,n-1);
+
+ // 2) T[0,n1-1]= midproduct(Ah-Al,Bm1) using TMP[n1,n1+s1] as temporary
+ Karatsuba_midproduct(TMP0,C1,Bm1,TMP1);
+ //cout<<"beta=:"<<TMP0<<endl;
+
+ C[n1-1]=TMP[2*n-1];
+
+ _PMD.subin(C0,TMP0);
+
+ C1=C.at(n1,n-1);
+ TMP1=TMP.at(0,n0-1);
+ C1.copy(TMP1);
+
+ TMP0=TMP.at(0,s0-1);
+ TMP1=TMP.at(s0,s0+n0-1);
+ TMP2=TMP.at(s0+n0,s0+4*n0-1);
+
+ _PMD.add(TMP0,Bm0,Bh);
+
+ // 3) T[s0,s0+n0-1]= midproduct(Al,Bm0+Bh) using TMP[s0+n0,2so+n0] as temporary
+ Karatsuba_midproduct(TMP1,Al,TMP0,TMP2);
+ //cout<<"gamma=:"<<TMP1<<endl;
+
+ C1=C.at(n1,n-1);
+ _PMD.addin(C1,TMP1);
+ }
+ else {
+ // add Bh and Bm in TMP[0,s0-1]
+ TMP0=TMP.at(0,s0-1);
+ _PMD.add(TMP0,Bh,Bm0);
+
+ // 2) C[n1,n-1]= midproduct(Al,Bh+Bm0) using TMP[s0,2s0] as temporary
+ C1=C.at(n1,n-1);
+ TMP1=TMP.at(s0,s0+3*n0-1);
+ Karatsuba_midproduct(C1,Al,TMP0,TMP1);
+ //cout<<"gamma=:"<<TMP0<<endl;
+
+ // compute Ah-Al in T[0,n1-1]
+ TMP0=TMP.at(0,n1-1);
+ TMP1=TMP.at(n1,2*n1-1);
+ TMP2=TMP.at(2*n1,2*n1+3*n0-1);
+
+ _PMD.sub(TMP0,Ah,Al);
+
+ // 3) T[n1,2n1-1]= midproduct(Ah-Al,Bm0) using TMP[2n1,2n1+s0] as temporary
+ Karatsuba_midproduct(TMP1,TMP0,Bm0,TMP2);
+ //cout<<"beta=:"<<TMP1<<endl;
+
+ C0=C.at(0,n1-1);
+ _PMD.subin(C0,TMP1);
+ _PMD.addin(C1,TMP1);
+ }
+
+ //cout<<"* END ***********************************************"<<endl;
+ }
+ }
+
+ }; // end of class KaratsubaMulDomain<Field, Matrix>
+
+} // end of namespace LinBox
+#endif
+
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+
diff --git a/linbox/algorithms/polynomial-matrix/matpoly-mult-naive.h b/linbox/algorithms/polynomial-matrix/matpoly-mult-naive.h
new file mode 100755
index 0000000..bc35be0
--- /dev/null
+++ b/linbox/algorithms/polynomial-matrix/matpoly-mult-naive.h
@@ -0,0 +1,143 @@
+/* -*- mode: C++; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
+/*
+ * Copyright (C) 2013 Pascal Giorgi
+ *
+ * Written by Pascal Giorgi <pascal.giorgi at lirmm.fr>
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ * ========LICENCE========
+ */
+
+
+#ifndef __LINBOX_MATPOLY_MUL_NAIVE_H
+#define __LINBOX_MATPOLY_MUL_NAIVE_H
+
+#include "linbox/util/error.h"
+#include "linbox/util/debug.h"
+#include "linbox/matrix/matrix-domain.h"
+#include <algorithm>
+namespace LinBox
+{
+
+ template <class Field>
+ class PolynomialMatrixNaiveMulDomain {
+ private:
+ const Field *_field;
+ BlasMatrixDomain<Field> _BMD;
+
+ // Polynomial matrix stored as a matrix of polynomial
+ typedef PolynomialMatrix<PMType::polfirst,PMStorage::plain,Field> MatrixP;
+ // Polynomial matrix stored as a polynomial of matrix
+ typedef PolynomialMatrix<PMType::matfirst,PMStorage::plain,Field> PMatrix;
+ template <PMStorage S> using _PMatrix = PolynomialMatrix<PMType::matfirst,S,Field>;
+ public:
+
+ inline const Field& field() const { return *_field; }
+
+ PolynomialMatrixNaiveMulDomain(const Field &F) :
+ _field(&F), _BMD(F){}
+
+
+ void mul(PMatrix& c, const PMatrix& a, const PMatrix& b)
+ {
+ for (size_t k=0;k<a.size()+b.size()-1;k++){
+ size_t idx_min= (k+1<b.size()?0:k+1-b.size());
+ size_t idx_max=std::min(k,a.size()-1);
+ _BMD.mul(c[k],a[idx_min],b[k-idx_min]);
+ for (size_t i=idx_min+1;i<=idx_max;i++){
+ _BMD.axpyin(c[k],a[i],b[k-i]);
+ }
+ }
+ }
+
+ // c must be allocated with the right size
+ template<typename Matrix1,typename Matrix2,typename Matrix3>
+ void mul(Matrix1& c, const Matrix2& a, const Matrix3& b)
+ {
+ PMatrix a2(field(),a.rowdim(),a.coldim(),a.size());
+ PMatrix b2(field(),b.rowdim(),b.coldim(),b.size());
+ a2.copy(a,0,a.size()-1);
+ b2.copy(b,0,b.size()-1);
+ PMatrix c2(field(),c.rowdim(),c.coldim(),a.size()+b.size()-1);
+ mul(c2, a2, b2);
+ c.copy(c2,0,c2.size()-1);
+ }
+
+
+
+ // c must be allocated with the right size
+ // a and b can have a size smaller than required
+ template<typename Matrix1,typename Matrix2,typename Matrix3>
+ void midproduct(Matrix1& c, const Matrix2& a, const Matrix3& b,
+ bool smallLeft=true, size_t n0=0,size_t n1=0)
+ {
+ PMatrix a2(field(),a.rowdim(),a.coldim(),a.size());
+ PMatrix b2(field(),b.rowdim(),b.coldim(),b.size());
+ a2.copy(a,0,a.size()-1);
+ b2.copy(b,0,b.size()-1);
+ PMatrix c2(field(),c.rowdim(),c.coldim(),c.size());
+ midproduct(c2, a2, b2, smallLeft, n0, n1);
+ c.copy(c2,0,c2.size()-1);
+ }
+ void midproduct(PMatrix& c, const PMatrix& a, const PMatrix& b,
+ bool smallLeft=true, size_t n0=0,size_t n1=0) {
+ //cout<<"naive midprod "<<a.size()<<"x"<<b.size()<<"->"<<c.size()<<endl;
+ size_t hdeg = ((n0==0)?c.size():n0);
+ size_t deg = ((n1==0)?2*hdeg-1:n1);
+ //cout<<"("<<hdeg-1<<","<<deg-1<<")"<<endl;
+ if (smallLeft){
+ // for (size_t k=hdeg-1;k<std::min(a.size()+b.size()-1,deg);k++){
+ // _BMD.mul(c[k-hdeg+1],a[0],b[k]);
+ // for (size_t j=1;j<std::min(hdeg,a.size());++j)
+ // _BMD.axpyin(c[k-hdeg+1],a[j],b[k-j]);
+ //}
+ for (size_t k=hdeg-1;k<std::min(a.size()+b.size()-1,deg);k++){
+ size_t idx_b=std::min(k,b.size()-1);
+ size_t idx_a=k-idx_b;
+ //cout<<k<<" : "<<idx_a<<"---"<<idx_b<<endl;
+ _BMD.mul(c[k-hdeg+1],a[idx_a],b[idx_b]);
+ for (size_t j=idx_a+1;j<=std::min(k,a.size()-1);++j){
+ //cout<<k<<" : "<<j<<"---"<<k-j<<endl;
+ _BMD.axpyin(c[k-hdeg+1],a[j],b[k-j]);
+ }
+ }
+ }else {
+ for (size_t k=hdeg-1;k<std::min(a.size()+b.size()-1,deg);k++){
+ size_t idx_a=std::min(k,a.size()-1);
+ size_t idx_b=k-idx_a;
+ _BMD.mul(c[k-hdeg+1],a[idx_a],b[idx_b]);
+ for (size_t j=idx_b+1;j<=std::min(k,b.size()-1);++j){
+ _BMD.axpyin(c[k-hdeg+1],a[k-j],b[j]);
+ }
+ }
+ }
+ }
+ };
+
+} // end of namespace LinBox
+
+#endif //__LINBOX_MATPOLY_MUL_NAIVE_H
+
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+
diff --git a/linbox/algorithms/polynomial-matrix/order-basis.h b/linbox/algorithms/polynomial-matrix/order-basis.h
new file mode 100755
index 0000000..4affeb2
--- /dev/null
+++ b/linbox/algorithms/polynomial-matrix/order-basis.h
@@ -0,0 +1,641 @@
+/* linbox/algorithms/sigma-basis.h
+ * Copyright (C) 2005,2013 Pascal Giorgi, Romain Lebreton
+ *
+ * Written by Pascal Giorgi pascal.giorgi at lirmm.fr
+ * Romain Lebreton lebreton at lirmm.fr
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ * ========LICENCE========
+ */
+#include "linbox/matrix/dense-matrix.h"
+#include "linbox/matrix/polynomial-matrix.h"
+#include "linbox/algorithms/polynomial-matrix/polynomial-matrix-domain.h"
+#include <vector>
+#include <algorithm>
+#include <chrono>
+#include "fflas-ffpack/fflas-ffpack.h"
+#define MBASIS_THRESHOLD_LOG 5
+#define MBASIS_THRESHOLD (1<<MBASIS_THRESHOLD_LOG)
+
+namespace LinBox {
+
+#ifdef __CHECK_ORDERBASIS
+#define __CHECK_MBASIS
+#define __CHECK_PMBASIS
+#endif
+
+#if (__CHECK_MBASIS) or (__CHECK_PMBASIS)
+#include <string>
+ template<typename Field, typename Mat>
+ std::string check_orderbasis(const Field& F, const Mat& sigma, const Mat& serie, size_t ord){
+ Mat T(F,sigma.rowdim(),serie.coldim(),sigma.size()+serie.size()-1);
+ PolynomialMatrixMulDomain<Field> PMD(F);
+ PMD.mul(T,sigma,serie);
+ MatrixDomain<Field> MD(F);
+ size_t i=0;
+ std::string msg(".....");
+ bool nul_sigma=true;
+ while(i<ord && MD.isZero(T[i])){
+ if (!MD.isZero(sigma[i])) nul_sigma=false;
+ i++;
+ }
+ if (i<ord){
+ std::cout<<"error at degree="<<i<<std::endl;
+ T[i].write(std::cout, Tag::FileFormat::Plain);
+ std::cout<<"***"<<std::endl;
+ std::cout<<serie<<std::endl;
+ std::cout<<sigma<<std::endl;
+ exit(1);
+ }
+
+
+ if (i==ord && !nul_sigma)
+ msg+="done";
+ else
+ msg+="error";
+ return msg;
+ }
+#endif
+
+
+ template< size_t K>
+ struct EarlyTerm {
+ size_t _count;
+ size_t _val;
+
+ EarlyTerm(): _count(0),_val(0){}
+
+ void update(size_t r, const std::vector<size_t>& u){
+ std::vector<size_t> v(u);
+ sort(v.begin(),v.end());
+ size_t x=0;
+ for (size_t i=0;i<r;i++)
+ x+=v[i];
+ if (x==_val)
+ _count++;
+ else{
+ _val=x;
+ _count=0;
+ }
+ }
+
+ bool terminated() const {return _count>=K;}
+
+ void reset() {_count=0;_val=0;}
+ };
+
+ template<class Field, class ET=EarlyTerm<-1> >
+ class OrderBasis {
+ public:
+ typedef PolynomialMatrix<PMType::polfirst,PMStorage::plain,Field> MatrixP;
+ typedef PolynomialMatrix<PMType::matfirst,PMStorage::plain,Field> PMatrix;
+ private:
+ const Field* _field;
+ PolynomialMatrixMulDomain<Field> _PMD;
+ BlasMatrixDomain<Field> _BMD;
+ ET _EarlyStop;
+ public:
+#if 1 or (PROFILE_PMBASIS) or (__CHECK_MBASIS)or (__CHECK_PMBASIS)
+ size_t _idx=0;
+ size_t _target=0;
+ double _eta=0.;
+ std::chrono::time_point<std::chrono::system_clock> _start, _end;
+ bool _started=false;
+#endif
+ OrderBasis(const Field& f) : _field(&f), _PMD(f), _BMD(f) {
+ }
+
+ inline const Field& field() const {return *_field;}
+
+ // serie must have exactly order elements (i.e. its degree = order-1)
+ // sigma can have at most order+1 elements (i.e. its degree = order)
+ template<typename PMatrix1, typename PMatrix2>
+ size_t PM_Basis2(PMatrix1 &sigma,
+ const PMatrix2 &serie,
+ size_t order,
+ std::vector<size_t> &shift){
+ std::cout<<"COPYING INTIAL SERIE"<<std::endl;
+ PMatrix2 serie2(serie.field(),serie.rowdim(),serie.coldim(),serie.size());
+ serie2.copy(serie);
+ return PM_Basis(sigma,serie2,order,shift);
+ }
+
+
+ // serie must have exactly order elements (i.e. its degree = order-1)
+ // sigma can have at most order+1 elements (i.e. its degree = order)
+ // BEWARE: serie can be modified
+ template<typename PMatrix1, typename PMatrix2>
+ size_t PM_Basis(PMatrix1 &sigma,
+ const PMatrix2 &serie,
+ size_t order,
+ std::vector<size_t> &shift)
+ {
+
+#if 1 or (PROFILE_PMBASIS)
+ //std::cout<<"Start PM-Basis : "<<order<<" ("<<_idx<<"/"<<_target<<")] : "<<std::endl;//MEMINFO<<std::endl;
+ if (_target==0) _target=order;
+ if (!_started) {_started=true; _start = std::chrono::system_clock::now();}
+ std::chrono::time_point<std::chrono::system_clock> _chrono_start=std::chrono::system_clock::now();
+#endif
+
+ if (order <= MBASIS_THRESHOLD) {
+#if 1 or (PROFILE_PMBASIS) or (__CHECK_PMBASIS)
+ _idx+=order;
+#endif
+ return M_Basis(sigma, serie, order, shift);
+ }
+ else {
+#ifdef PROFILE_PMBASIS
+ Timer chrono;
+ chrono.start();
+#endif
+ size_t ord1,ord2,d1,d2;
+ ord1 = order>>1;
+ ord2 = order-ord1; // ord1+ord2=order
+ size_t m,n,k;
+ m=sigma.rowdim();
+ n=sigma.coldim();
+ k=serie.coldim();
+ integer p;
+
+ // first recursive call
+ PMatrix1 sigma1(field(),m,n,ord1+1);
+
+#ifdef MEM_PMBASIS
+ std::cerr<<"[PM-Basis ("<<order<<") "<<_idx<<"/"<<_target<<"] [Sigma1] -> "<<MB(m*n*(ord1+1)*length(field().characteristic(p)))<<"Mo"<<MEMINFO<<std::endl;
+#endif
+ //typename PMatrix2::const_view serie1=serie.at(0,ord1-1);
+ PMatrix2 *serie1=new PMatrix2(field(),n,k,ord1);
+#ifdef MEM_PMBASIS
+ std::cerr<<"[PM-Basis ("<<order<<") "<<_idx<<"/"<<_target<<"] [Serie1] -> "<<MB(n*k*ord1*length(field().characteristic(p)))<<"Mo"<<MEMINFO<<std::endl;
+#endif
+ serie1->copy(serie,0,ord1-1);
+ d1 = PM_Basis(sigma1, *serie1, ord1, shift);
+ delete serie1;
+ if (_EarlyStop.terminated()){
+ sigma=sigma1;
+ return d1;
+ }
+
+ // compute the serie update
+ // TODO: for Block Wiedemann, this step can use only the first column of sigma
+ PMatrix2 *serie2=new PMatrix2(field(),n,k,ord2);//serie2 size=ord1+1 -> midproduct)
+#ifdef MEM_PMBASIS
+ std::cerr<<"[PM-Basis ("<<order<<") "<<_idx<<"/"<<_target<<"] [Serie2] -> "<<MB(n*k*ord2*length(field().characteristic(p)))<<"Mo"<<MEMINFO<<std::endl;
+#endif
+ _PMD.midproductgen(*serie2, sigma1, serie, true, ord1+1,ord1+ord2);
+#ifdef PROFILE_PMBASIS
+ //chrono.stop();
+ //std::cout<<" -> serie update "<<sigma1.size()<<"x"<<order<<" --> "<<chrono.usertime()<<std::endl;//MEMINFO<<std::endl;
+ //chrono.clear();chrono.start();
+#endif
+ // second recursive call
+
+ PMatrix1 sigma2(field(),m,n,ord2+1);
+#ifdef MEM_PMBASIS
+ std::cerr<<"[PM-Basis("<<order<<") "<<_idx<<"/"<<_target<<"] [Sigma2] -> "<<MB(m*n*(ord1+1)*length(field().characteristic(p)))<<"Mo"<<MEMINFO<<std::endl;
+#endif
+ d2 = PM_Basis(sigma2, *serie2, ord2, shift);
+ delete serie2;
+
+ // compute the result
+ _PMD.mul(sigma, sigma2, sigma1);
+ //sigma.resize(d1+d2+1);
+ sigma.setsize(d1+d2+1);
+#ifdef PROFILE_PMBASIS
+ //chrono.stop();
+ //std::cout<<" -> basis product "<<sigma1.size()<<"x"<<sigma2.size()<<" = "<<d1+d2+1<<" -->"<<chrono.usertime()<<MEMINFO<<std::endl;
+#endif
+
+#ifdef __CHECK_PMBASIS
+ std::cout<<"PMBASIS: order "<<_idx<<check_orderbasis(field(),sigma,serie,order)<<std::endl;
+#endif
+#ifdef PROFILE_PMBASIS
+ chrono.stop();
+ _end = std::chrono::system_clock::now();
+ std::chrono::duration<double> elapsed_beginning = _end-_start;
+ std::chrono::duration<double> elapsed_comp = _end-_chrono_start;
+
+ double magicnumber=double(_target)/double(order)*log(double(_target)/double(order))/log(2.);
+ double tcomp = elapsed_comp.count();
+ double telap = elapsed_beginning.count();
+
+ _eta=(_eta!=0.0?std::min(_eta,tcomp*magicnumber):tcomp*magicnumber);
+ std::cerr<<"[PM-Basis : "<<order<<" ("<<_idx<<"/"<<_target<<")] : "<<chrono.usertime()
+ << " (ETA: "<< telap<<"s / "<<_eta<<"s)"<<MEMINFO<<std::endl;
+ chrono.clear();chrono.start();
+#endif
+
+
+ return d1+d2;
+ }
+ }
+ // serie must have exactly order elements (i.e. its degree = order-1)
+ size_t M_Basis(MatrixP &sigma,
+ const MatrixP &serie,
+ size_t order,
+ std::vector<size_t> &shift)
+ {
+
+ PMatrix sigma1(field(),sigma.rowdim(),sigma.coldim(),order+1);
+ PMatrix serie1(field(),serie.rowdim(),serie.coldim(),order);
+ serie1.copy(serie,0,order-1);
+ size_t d= M_Basis(sigma1,serie1,order,shift);
+ sigma.resize(d+1);
+ sigma.copy(sigma1,0,d);
+ return d;
+
+ }
+
+ // serie must have exactly order elements (i.e. its degree = order-1)
+ template<typename PMatrix1, typename PMatrix2>
+ size_t M_Basis(PMatrix1 &sigma,
+ const PMatrix2 &serie,
+ size_t order,
+ std::vector<size_t> &shift)
+ {
+#ifdef __DEBUG_MBASIS
+ std::cout<<"------------- mba : "<<order<<std::endl;
+ std::cout<<serie<<std::endl;
+#endif
+ size_t m=serie.rowdim();
+ size_t n=serie.coldim();
+ size_t rank=0;
+ BlasMatrix<Field> delta(field(),m,n);
+ size_t max_degree=0; // a bound on the row degree of sigma
+ std::vector<size_t> degree(m,0); // a bound on each row degree of sigma
+ //auto degree=shift;
+ //size_t max_degree=*std::max_element(degree.begin(),degree.end());
+
+ // set sigma to identity
+ for(size_t i=0;i<m*m;i++)
+ sigma.ref(i,0)=0;
+ for(size_t i=0;i<m;i++)
+ sigma.ref(i,i,0)=1;
+
+ BlasPermutation<size_t> Qt(m), P(n);
+ TransposedBlasMatrix<BlasPermutation<size_t> > Q(Qt);
+ typedef BlasSubmatrix<BlasMatrix<Field> > View;
+ size_t k=0;
+ for (; k<order && !_EarlyStop.terminated(); k++){
+#ifdef __DEBUG_MBASIS
+ std::cout<<std::endl<<"****************** "<<k<<std::endl;
+ std::cout<<"shift=";std::copy(shift.begin(),shift.end(),std::ostream_iterator<size_t>(std::cout,","));std::cout<<std::endl;
+ std::cout<<"degree=";std::copy(degree.begin(),degree.end(),std::ostream_iterator<size_t>(std::cout,","));std::cout<<std::endl;
+
+#endif
+ // sort the shift in ascending order (-> minimize the shifted row-degree of sigma)
+ // -> store the permutation in Bperm
+ // -> permute the row degree at the same time
+ std::vector<size_t> perm(m);
+ for (size_t i=0;i<m;i++) perm[i]=i;
+ for (size_t i=0;i<m;++i) {
+ size_t idx_min=i;
+ for (size_t j=i+1;j<m;++j)
+ if (shift[j]< shift[idx_min])
+ idx_min=j;
+ std::swap( shift[i], shift[idx_min]);
+ std::swap(degree[i], degree[idx_min]);
+ perm[i]=idx_min;
+ }
+ BlasPermutation<size_t> Bperm(perm);
+#ifdef __DEBUG_MBASIS
+ std::cout<<"Bp=";
+ Bperm.write(std::cout,false);
+ std::cout<<std::endl;
+ std::cout<<"Bp.shift=";std::copy(shift.begin(),shift.end(),std::ostream_iterator<size_t>(std::cout,","));std::cout<<std::endl;
+ std::cout<<"Bp.degree=";std::copy(degree.begin(),degree.end(),std::ostream_iterator<size_t>(std::cout,","));std::cout<<std::endl;
+#endif
+ // check if Qt is identity
+ //size_t lll=0;
+ //while(lll<m && Qt[lll]==lll) lll++;
+
+ // permute the row of the current sigma basis
+ // and compute the new discrepancy
+ //if (true){
+ //if (k==0 || lll!=m){
+ if (k==0 ){ //|| !Qt.isIdentity()){
+ _BMD.mulin_right(Bperm, sigma[0]);
+ _BMD.mul(delta,sigma[0],serie[k]);
+ for(size_t i=1;i<=std::min(k,max_degree);i++){
+ _BMD.mulin_right(Bperm, sigma[i]);
+ _BMD.axpyin(delta,sigma[i],serie[k-i]);
+ }
+ }
+ else{
+ // if Qt is identity then the first rank rows of delta remain unchanged
+ // the first rank rows of Qt.delta remain unchanged
+ if (!Qt.isIdentity())
+ _BMD.mulin_right(Qt, delta);
+
+ View delta1(delta, rank,0,m-rank,n);
+ View sigma1(sigma[0],rank,0,m-rank,m);
+ _BMD.mul(delta1,sigma1,serie[k]);
+ _BMD.mulin_right(Bperm, sigma[0]);
+ for(size_t i=1;i<=std::min(k,max_degree);i++){
+ View sigmak(sigma[i],rank,0,m-rank,m);
+ _BMD.axpyin(delta1,sigmak,serie[k-i]);
+ _BMD.mulin_right(Bperm, sigma[i]);
+ }
+ _BMD.mulin_right(Bperm, delta);
+ }
+ //std::cout<<"******** k="<<k<<std::endl;
+#ifdef __DEBUG_MBASIS
+ std::cout<<sigma<<std::endl;
+ delta.write(std::cout,Tag::FileFormat::Maple);
+ std::cout<<std::endl;
+#endif
+ BlasMatrix<Field> delta_copy(delta);
+ //delta_copy.write(std::cout,Tag::FileFormat::Plain);
+
+#define NEWELIM
+#ifdef NEWELIM
+ // Compute a column reduced basis of the nullspace of delta
+ // -> [ L2 I ]
+ rank= FFPACK::PLUQ (field(), FFLAS::FflasNonUnit, m, n,
+ delta_copy.getWritePointer(),delta_copy.getStride(),
+ Qt.getWritePointer(), P.getWritePointer());
+ //delta_copy.write(std::cout,Tag::FileFormat::Maple);
+ //std::cout<<std::endl;
+
+ View L1(delta_copy,0 ,0, rank,rank);
+ View L2(delta_copy,rank,0,m-rank,rank);
+ FFLAS::ftrsm(field(),FFLAS::FflasRight,FFLAS::FflasLower,
+ FFLAS::FflasNoTrans,FFLAS::FflasUnit,
+ m-rank,rank, field().mOne, L1.getPointer(),L1.getStride(), L2.getWritePointer(),L2.getStride());
+#else
+ LQUPMatrix<Field> LQUP(delta_copy,P,Qt);
+ // Get L from LQUP
+ TriangularBlasMatrix<Field> L(field(), m, m, Tag::Shape::Lower, Tag::Diag::Unit);
+ LQUP.getL(L);
+ rank=LQUP.getRank(); // the first rank entries of Qt give the pivot row
+ // inverse L in-place (COULD BE IMPROVED -> only compute the left kernel by trsm)
+ //FFPACK::ftrtri(field(),FFLAS::FflasLower,FFLAS::FflasUnit,m,L.getPointer(),L.getStride());
+ View L1(L,0 ,0, rank,rank);
+ View L2(L,rank,0,m-rank,rank);
+ FFLAS::ftrsm(field(),FFLAS::FflasRight,FFLAS::FflasLower,
+ FFLAS::FflasNoTrans,FFLAS::FflasUnit,
+ m-rank,rank, field().mOne, L1.getPointer(),m, L2.getWritePointer(),m);
+#endif
+
+ // update sigma by L^(-1) (rank sensitive -> use only the left kernel basis)
+ for(size_t i=0;i<=std::min(k,max_degree);i++){
+ // NEED TO APPLY Qt to sigma[i]
+ _BMD.mulin_right(Qt, sigma[i]);
+ View S1(sigma[i],0,0,rank,m);
+ View S2(sigma[i],rank,0,m-rank,m);
+ _BMD.axpyin(S2,L2,S1);
+ //_BMD.mulin_right(L,sigma[i]);
+ }
+#ifdef __DEBUG_MBASIS
+ std::cout<<"Qt=";
+ Qt.write(std::cout,false);
+ std::cout<<"\nP=";
+ P.write(std::cout,false);
+
+ std::cout<<std::endl<<"rank="<<rank<<" Qt size: "<<Qt.getSize()<<std::endl;
+#endif
+#if 0
+ size_t dmax=0, smax=0;
+ // update: the row-degree, the shifted row-degree,
+ // the max pivot degree and the maximum row degree
+ for (size_t i=0;i<rank;++i) {
+ //std::cout<<"Qt["<<i<<"]="<<Qt.getPointer()[i]<<std::endl;
+ dmax=std::max(dmax, degree[Qt[i]]);
+ smax=std::max(smax, shift [Qt[i]]);
+ degree[Qt[i]]++;
+ shift [Qt[i]]++;
+ }
+ //std::cout<<"dmax:"<<dmax<<std::endl;
+ max_degree=std::max(max_degree,dmax+1);
+ //std::cout<<"max degree:"<<max_degree<<std::endl;
+ for (size_t i=rank;i<m;i++){
+ degree[Qt[i]]=std::max(dmax, degree[Qt[i]]);
+ //THIS LINE IS NOT NEEDED -> shift [Qt[i]]=max(smax, shift [Qt[i]]);
+ }
+#else
+
+ size_t dmax=0;
+ Givaro::ZRing<size_t> Zint;
+ BlasMatrixDomain<Givaro::ZRing<size_t> > TTT(Zint);
+
+ TTT.mulin_right(Qt, degree);
+ TTT.mulin_right(Qt, shift);
+#ifdef __DEBUG_MBASIS
+ std::cout<<"Qt.Bp.shift=";std::copy(shift.begin(),shift.end(),std::ostream_iterator<size_t>(std::cout,","));std::cout<<std::endl;
+ std::cout<<"Qt.Bp.degree=";std::copy(degree.begin(),degree.end(),std::ostream_iterator<size_t>(std::cout,","));std::cout<<std::endl;
+
+ std::cout<<std::endl;
+#endif
+#endif
+
+ for (size_t i=0;i<rank;++i) {
+ dmax=std::max(dmax, degree[i]);
+ degree[i]++;
+ shift [i]++;
+ }
+ for (size_t i=rank;i<m;i++){
+ degree[i]=std::max(degree[i],dmax);
+ }
+ max_degree=std::min(order,std::max(max_degree,dmax+1));
+#ifdef __DEBUG_MBASIS
+ std::cout<<"max degree:"<<max_degree<<std::endl;
+ std::cout<<"Qt.Bp.shift=";std::copy(shift.begin(),shift.end(),std::ostream_iterator<size_t>(std::cout,","));std::cout<<std::endl;
+ std::cout<<"Qt.Bp.degree=";std::copy(degree.begin(),degree.end(),std::ostream_iterator<size_t>(std::cout,","));std::cout<<std::endl;
+
+#endif
+ // shift the pivot row of sigma by x
+ for (int l=max_degree-1;l>=0;l--)
+ for (size_t i=0;i<rank;i++)
+ for (size_t j=0;j<m;j++)
+ sigma.ref(i,j,l+1)=sigma.ref(i,j,l);
+ //sigma.ref(Qt[i],j,l+1)=sigma.ref(Qt[i],j,l);
+ for (size_t i=0;i<rank;i++)
+ for (size_t j=0;j<m;j++)
+ sigma.ref(i,j,0)=field().zero;
+#ifdef __DEBUG_MBASIS
+ std::cout<<"max degree="<<max_degree<<std::endl<<std::endl;
+ std::cout<<"F"<<k<<":="<<sigma<<std::endl<<"******************"<<std::endl;
+ std::cout<<std::endl;
+#endif
+ // update Early Termination
+ //_EarlyStop.update(rank,shift);
+#ifdef __CHECK_MBASIS
+ std::cout<<"MBASIS: order "<<k<<check_orderbasis(field(),sigma,serie,k+1)<<std::endl;
+#endif
+
+ _EarlyStop.update(m-rank,shift); // codimension (m-rank) seems better
+ }
+
+ if (_EarlyStop.terminated()) {
+ std::cout<<"OrderBasis: Early Termination at :"<<k<<"/"<<order<<std::endl;
+ }
+
+ sigma.resize(max_degree+1);
+ return max_degree;
+ }
+
+
+
+ inline size_t twoValuation(size_t x){
+ size_t i=0;
+ while (x!=0 && !(x&0x1)){
+ i++;
+ x>>=1;
+ }
+ return i;
+ }
+
+ template<class Polynomial1>
+ void update_sigma(size_t m, size_t n, std::list<Polynomial1*>& L, size_t k){
+ Polynomial1 *P1,*P2,*P3;
+ for(size_t i=0;i<k;i++){
+ P2=L.back();L.pop_back();
+ P3=L.back();L.pop_back();
+ P1 = new Polynomial1(field(),m,n,P2->size()+P3->size()-1);
+ _PMD.mul(*P1,*P2,*P3);
+ L.push_back(P1);
+ delete P2; delete P3;
+ }
+ }
+
+ // serie must have exactly order elements (i.e. its degree = order-1)
+ // sigma can have at most order+1 elements (i.e. its degree = order)
+ // Algorithm from [Giorgi, Lebreton ISSAC'2014]
+ template<typename PMatrix1, typename PMatrix2>
+ void oPM_Basis(PMatrix1 &sigma,
+ const PMatrix2 &serie,
+ size_t order,
+ std::vector<size_t> &shift)
+ {
+ size_t m,n,k,l,lp;
+ m=sigma.rowdim();
+ n=sigma.coldim();
+ k=serie.coldim();
+
+ // log of the order
+ size_t log_order=integer(order).bitsize();
+
+ // leaf size of the recursive PM_Basis algorithm (must be a power of 2)
+ size_t log_ord = MBASIS_THRESHOLD_LOG;
+ size_t ord = std::min(size_t(1)<<log_ord ,order);
+
+ // prepare the storage for each serie update
+ std::vector<PMatrix2*> L_serie(log_order+1);
+ for (size_t i=log_ord;i<log_order;i++)
+ L_serie[i]= new PMatrix2(field(),n,k,(1<<i));
+ L_serie[log_order]=const_cast<PMatrix2*>(&serie);
+
+ typedef typename PMatrix2::const_view cview;
+ std::list<PMatrix1*> L_sigma;
+ PMatrix1* sigmak;
+ cview seriek;
+ typedef HalflineMPDomain<Field,PMatrix2,PMatrix1,PMatrix2> HFMPD;
+ std::list<HFMPD*> L_mp;
+ typename std::list<HFMPD*>::iterator iter, t_iter;
+
+ // // Reset Early Termination
+ _EarlyStop.reset();
+
+ sigmak = new PMatrix1(field(),m,n,ord+1);
+ seriek = serie.at(0,ord-1);
+ M_Basis(*sigmak, seriek, ord, shift);
+ L_sigma.push_back(sigmak);
+ size_t sss=0;
+ for(size_t k=ord;k<order && !_EarlyStop.terminated();k+=ord,sss++){
+ //std::cout<<"------------ order="<<k<<std::endl;
+ l = twoValuation(k);
+ lp = twoValuation(k-(1<<l)); lp=(lp==0?log_order:lp);
+ // compute next element in the original serie and
+ // update all subsequent computed series
+ for(iter=L_mp.begin(); iter!=L_mp.end(); ){
+ (*iter)->update(ord);
+ t_iter=iter;
+ ++iter;
+
+ if ((*t_iter)->terminated()){
+ delete *t_iter;
+ L_mp.erase(t_iter);
+ }
+ }
+
+ // compute the serie update
+ //seriek = const_cast<const PMatrix2*>(L_serie[lp])->at(0,min(order,(1ULL<<(l+1)))-1);
+
+ //size_t update_max=min(order,1ULL<<(l+1));
+ //_PMD.midproductgen(*L_serie[l],*L_sigma.back(), seriek, true, (1ULL<<l)+1,update_max);
+
+
+ /*
+ cout<<"---------------"<<endl;
+ cout<<"MP "<<(1ULL<<l)<<"x"<<(1ULL<<(l+1))<<endl;
+ cout<<*(L_sigma.back())<<endl;
+ cout<<lp<<" ----- "<<endl<<*(L_serie[lp])<<endl;
+ cout<<"---------------"<<endl;
+ */
+
+ //L_mp.push_back(new HFMPD(field(),*(L_serie[l]),*(L_sigma.back()), seriek, 1ULL<<l));
+ L_mp.push_back(new HFMPD(field(),*(L_serie[l]),*(L_sigma.back()),*(L_serie[lp]), 1ULL<<l));
+
+ // compute the new sigma
+ sigmak = new PMatrix(field(),m,n,ord+1);
+ size_t step= std::min(ord,order-k); // needed if order%ord <> 0
+ seriek = const_cast<const PMatrix2*>(L_serie[l])->at(0,step-1);
+
+ // compute the next "step" elements of the serie L_serie[l]
+ L_mp.back()->update(ord);
+
+ M_Basis(*sigmak, seriek, step, shift);
+ L_sigma.push_back(sigmak);
+
+ // update the sigma list
+ update_sigma(m, n, L_sigma, twoValuation(k/ord+1));
+ }
+ // get the product of all sigma
+ if (L_sigma.size()>1){
+ update_sigma(m, n, L_sigma, L_sigma.size()-2);
+ PMatrix1 *s1,*s2;
+ s1= L_sigma.back();L_sigma.pop_back();
+ s2= L_sigma.back();L_sigma.pop_back();
+ _PMD.mul(sigma,*s1,*s2);
+ delete s1; delete s2;
+ }
+ else {
+ sigma.resize(L_sigma.back()->size());
+ sigma.copy(*L_sigma.back(),0,L_sigma.back()->size()-1);
+ delete L_sigma.back();
+ }
+ for (size_t i=0;i<log_order;i++)
+ delete L_serie[i];
+
+ // Info about early termination
+ //if (_EarlyStop.terminated())
+ // cout<<"Early termination at order "<<sss<<" ("<<order<<")"<<endl;
+ }
+
+ };
+
+} // end of namespace LinBox
+
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/algorithms/polynomial-matrix/polynomial-fft-transform-simd.inl b/linbox/algorithms/polynomial-matrix/polynomial-fft-transform-simd.inl
new file mode 100644
index 0000000..6c5e0f8
--- /dev/null
+++ b/linbox/algorithms/polynomial-matrix/polynomial-fft-transform-simd.inl
@@ -0,0 +1,817 @@
+/* -*- mode: C++; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
+/*
+ * Copyright (C) 2014 Pascal Giorgi, Romain Lebreton
+ *
+ * Written by Pascal Giorgi <pascal.giorgi at lirmm.fr>
+ * Romain Lebreton <romain.lebreton at lirmm.fr>
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ * ========LICENCE========
+ */
+
+
+#ifndef __LINBOX_polynomial_fft_transform_simd_INL
+#define __LINBOX_polynomial_fft_transform_simd_INL
+
+#include "linbox/algorithms/polynomial-matrix/simd.h"
+
+namespace LinBox {
+
+
+ /******************************************************************************************************************
+ ******************************************************************************************************************
+ *********************************** FFT with SSE CODE *******************************************************
+ ******************************************************************************************************************
+ ******************************************************************************************************************/
+
+ template <class Field>
+ inline void FFT_transform<Field>::reduce128_modp(uint32_t* ABCD, const _vect128_t& P) {
+ _vect128_t V1,T;
+ // V1=[A B C D], V2=[E F G H]
+ VEC128_LOAD(V1,ABCD);
+ VEC128_MOD_P(V1,V1,P,T);
+ VEC128_STORE(ABCD,V1);
+ }
+
+ /*-----------------------------------*/
+ /*-- Butterflies DIF ----*/
+ /*-----------------------------------*/
+
+
+ template <class Field>
+ inline void FFT_transform<Field>::Butterfly_DIF_mod2p_4x1_SSE(uint32_t* ABCD, uint32_t* EFGH,
+ const uint32_t* alpha,
+ const uint32_t* alphap,
+ const _vect128_t& P, const _vect128_t& P2)
+ {
+ _vect128_t V1,V2,V3,V4,W,Wp,T;
+ // V1=[A B C D], V2=[E F G H]
+ VEC128_LOAD(V1,ABCD);
+ VEC128_LOAD(V2,EFGH);
+ VEC128_LOAD(W ,alpha);
+ VEC128_LOAD(Wp,alphap);
+ // V3 = V1 + V2 mod
+ VEC128_ADD_MOD(V3,V1,V2,P2,T);
+ VEC128_STORE(ABCD,V3);
+ // V4 = (V1+(2P-V2))alpha mod 2P
+ VEC128_SUB_32(T,V2,P2);
+ VEC128_SUB_32(V4,V1,T);
+ VEC128_MUL_MOD(T,V4,W,P,Wp,V1,V2,V3);// V3 is the result
+ VEC128_STORE(EFGH,T);
+ }
+
+
+ template <class Field>
+ inline void FFT_transform<Field>::Butterfly_DIF_mod2p_4x1_SSE_laststep(uint32_t* ABCD, uint32_t* EFGH, const _vect128_t& P2) {
+ _vect128_t V1,V2,V3,V4,V5;
+ // V1=[A B C D], V2=[E F G H]
+ VEC128_LOAD(V1,ABCD);
+ VEC128_LOAD(V2,EFGH);
+ // V3 = [A C B D], V4 = [E G F H]
+ VEC128_SHUFFLE_32(V3,V1,0xD8);
+ VEC128_SHUFFLE_32(V4,V2,0xD8);
+ // V1 = [A E C G], V2 = [B F D H]
+ VEC128_UNPACK_LO_32(V1,V3,V4);
+ VEC128_UNPACK_HI_32(V2,V3,V4);
+ // V3 = V1 + V2 mod 2P
+ VEC128_ADD_MOD(V3,V1,V2,P2,V5);
+ // V4 = V1 + (2P - V2) mod 2P
+ VEC128_SUB_32(V5,V2,P2);
+ VEC128_SUB_32(V2,V1,V5);
+ VEC128_MOD_P(V4,V2,P2,V5);
+ // V1 = [A C E G], V2 = [B D F H]
+ VEC128_SHUFFLE_32(V1,V3,0xD8);
+ VEC128_SHUFFLE_32(V2,V4,0xD8);
+ // V3 = [A B C D], V4 = [E F G H]
+ VEC128_UNPACK_LO_32(V3,V1,V2);
+ VEC128_UNPACK_HI_32(V4,V1,V2);
+ // Store
+ VEC128_STORE(ABCD,V3);
+ VEC128_STORE(EFGH,V4);
+ }
+
+ template <class Field>
+ inline void FFT_transform<Field>::Butterfly_DIF_mod2p_4x2_SSE(uint32_t* ABCD, uint32_t* EFGH, uint32_t* IJKL, uint32_t* MNOP,
+ const uint32_t* alpha, const uint32_t*beta , const uint32_t* gamma,
+ const uint32_t* alphap, const uint32_t*betap , const uint32_t* gammap,
+ const _vect128_t& P, const _vect128_t& P2) {
+ _vect128_t V1,V2,V3,V4,W,Wp,T1,T2,T3,T4,T5,T6,T7,T8;
+
+ // V1=[A B C D], V2=[E F G H], V3=[I J K L], V4=[M N O P]
+ VEC128_LOAD(V1,ABCD);
+ VEC128_LOAD(V2,IJKL);
+ VEC128_LOAD(W ,alpha);
+ VEC128_LOAD(Wp,alphap);
+ /**************/
+ // T1 = V1 + V2 mod 2P
+ VEC128_ADD_MOD(T1,V1,V2,P2,T8);
+ // T2 = (V1+(2P-V2))alpha mod 2P
+ VEC128_SUB_32(T7,V2,P2);
+ VEC128_SUB_32(T6,V1,T7);
+ VEC128_MUL_MOD(T2,T6,W,P,Wp,T3,T4,T5);
+ /**************/
+ VEC128_LOAD(V3,EFGH);
+ VEC128_LOAD(V4,MNOP);
+ VEC128_LOAD(W ,beta);
+ VEC128_LOAD(Wp,betap);
+ /**************/
+ // T3 = V3 + V4 mod 2P
+ VEC128_ADD_MOD(T3,V3,V4,P2,T8);
+ // T4 = (V3+(2P-V4))beta mod 2P
+ VEC128_SUB_32(T7,V4,P2);
+ VEC128_SUB_32(T6,V3,T7);
+ VEC128_MUL_MOD(T4,T6,W,P,Wp,V1,V2,T8);// T1 is the result
+ /**************/
+ VEC128_LOAD(W ,gamma);
+ VEC128_LOAD(Wp,gammap);
+ /**************/
+ // V1 = T1 + T3 mod 2P
+ VEC128_ADD_MOD(V1,T1,T3,P2,T8);
+ // V3 = (T1+(2P-T3))gamma mod 2P
+ VEC128_SUB_32(T7,T3,P2);
+ VEC128_SUB_32(T6,T1,T7);
+ VEC128_MUL_MOD(V3,T6,W,P,Wp,T3,T5,T8);// T1 is the result
+ /**************/
+ // V2 = T2 + T4 mod 2P
+ VEC128_ADD_MOD(V2,T2,T4,P2,T8);
+ // V4 = (T2+(2P-T4))gamma mod 2P
+ VEC128_SUB_32(T7,T4,P2);
+ VEC128_SUB_32(T6,T2,T7);
+ VEC128_MUL_MOD(V4,T6,W,P,Wp,T1,T3,T8);// T1 is the result
+ /**************/
+ VEC128_STORE(ABCD,V1);
+ VEC128_STORE(EFGH,V3);
+ VEC128_STORE(IJKL,V2);
+ VEC128_STORE(MNOP,V4);
+ }
+
+
+
+ template <class Field>
+ inline void FFT_transform<Field>::Butterfly_DIF_mod2p_4x2_SSE_last2step(uint32_t* ABCD, uint32_t* EFGH,
+ const _vect128_t& W,
+ const _vect128_t& Wp,
+ const _vect128_t& P, const _vect128_t& P2) {
+ _vect128_t V1,V2,V3,V4,V5,V6,V7;
+ // V1=[A B C D], V2=[E F G H]
+ VEC128_LOAD(V1,ABCD);
+ VEC128_LOAD(V2,EFGH);
+ // V3=[A E B F], V4=[C G D H]
+ VEC128_UNPACK_LO_32(V3,V1,V2);
+ VEC128_UNPACK_HI_32(V4,V1,V2);
+ // V1 = V3 + V4 mod 2P
+ // P2 = [2p 2p 2p 2p]
+ VEC128_ADD_MOD(V1,V3,V4,P2,V5);
+ // V2 = (V3+(2P-V4))alpha mod 2P
+ VEC128_SUB_32(V5,V4,P2);
+ VEC128_SUB_32(V6,V3,V5);
+ VEC128_MOD_P(V2,V6,P2,V2);
+ // V4 = [D D H H]
+ VEC128_UNPACK_HI_32(V4,V2,V2);
+ // V6 = V4 * Wp mod 2^64
+ // Wp = [Wp ? Wp ?]
+ VEC128_MUL_32(V7,V4,Wp);
+ VEC128_MUL_LO_32(V5,V7,P);
+ // At this point V4= [? Q_D*p ? Q_H*p]
+ // V5 = [D D H H] * [W W W W] mod 2^32
+ VEC128_MUL_LO_32(V6,V4,W);
+ VEC128_SUB_32(V4,V6,V5);
+ VEC128_SHUFFLE_32(V3,V4,0xDD);
+ //At this point, V2 = [D*Wmodp H*Wmodp D*Wmodp H*Wmodp]
+ // At this time I have V1=[A E B F], V2=[C G ? ?], V3=[? ? D H]
+ // I need V3 = [A C E G], V4 = [B D F H]
+ VEC128_UNPACK_HI_32(V4,V1,V3);
+ VEC128_UNPACK_LO_32(V3,V1,V2);
+ // V1 = V3 + V4 mod 2P
+ VEC128_ADD_MOD(V1,V3,V4,P2,V5);
+ // V2 = V3 + (2P - V4) mod 2P
+ VEC128_SUB_32(V5,V4,P2);
+ VEC128_SUB_32(V6,V3,V5);
+ VEC128_MOD_P(V2,V6,P2,V2);
+ // Result in V1 = [A C E G] and V2 = [B D F H]
+ // Transform to V3=[A B C D], V4=[E F G H]
+ VEC128_UNPACK_LO_32(V3,V1,V2);
+ VEC128_UNPACK_HI_32(V4,V1,V2);
+ // Store
+ VEC128_STORE(ABCD,V3);
+ VEC128_STORE(EFGH,V4);
+ }
+
+
+ /*-----------------------------------*/
+ /*-- Butterflies DIT ----*/
+ /*-----------------------------------*/
+
+
+ template <class Field>
+ inline void FFT_transform<Field>::Butterfly_DIT_mod4p_4x1_SSE(uint32_t* ABCD, uint32_t* EFGH,
+ const uint32_t* alpha,
+ const uint32_t* alphap,
+ const _vect128_t& P, const _vect128_t& P2) {
+ _vect128_t V1,V2,V3,V4,W,Wp,T1,T2;
+ // V1=[A B C D], V2=[E F G H]
+ VEC128_LOAD(V1,ABCD);
+ VEC128_LOAD(V2,EFGH);
+ VEC128_LOAD(W ,alpha);
+ VEC128_LOAD(Wp,alphap);
+ // V3 = V1 mod 2P
+ VEC128_MOD_P (V3,V1,P2,T1);
+ // V4 = V2 * W mod P
+ VEC128_MUL_MOD(V4,V2,W,P,Wp,V1,T1,T2);
+ // V1 = V3 + V4
+ VEC128_ADD_32(V1,V3,V4);
+ VEC128_STORE(ABCD,V1);
+ // V2 = V3 - (V4 - 2P)
+ VEC128_SUB_32(T1,V4,P2);
+ VEC128_SUB_32(V2,V3,T1);
+ VEC128_STORE(EFGH,V2);
+ }
+
+ template <class Field>
+ inline void FFT_transform<Field>::Butterfly_DIT_mod4p_4x2_SSE_first2step(uint32_t* ABCD, uint32_t* EFGH,
+ const _vect128_t& W,
+ const _vect128_t& Wp,
+ const _vect128_t& P, const _vect128_t& P2) {
+ _vect128_t V1,V2,V3,V4,T1,T2,T3,T4;
+ // V1=[A B C D], V2=[E F G H]
+ VEC128_LOAD(V1,ABCD);
+ VEC128_LOAD(V2,EFGH);
+ // T1 = [A C B D], T2 = [E G F H]
+ VEC128_SHUFFLE_32(T1,V1,0xD8);
+ VEC128_SHUFFLE_32(T2,V2,0xD8);
+ // V1 = [A E C G], V2 = [B F D H]
+ VEC128_UNPACK_LO_32(V1,T1,T2);
+ VEC128_UNPACK_HI_32(V2,T1,T2);
+ // V3 = V1 + V2
+ // Rk: No need for (. mod 2P) since entries are <P
+ VEC128_ADD_32(V3,V1,V2);
+ // V4 = V1 + (P - V2)
+ // Rk: No need for (. mod 2P) since entries are <P
+ VEC128_SUB_32(T1,V2,P);
+ VEC128_SUB_32(V4,V1,T1);
+ // T1 = [D D H H]
+ VEC128_UNPACK_HI_32(T1,V4,V4);
+ // T2 = T1 * Wp mod 2^64
+ // Wp = [Wp ? Wp ?]
+ VEC128_MUL_32(T2,T1,Wp);
+ VEC128_MUL_LO_32(T3,T2,P);
+ // At this point T3= [? Q_D*p ? Q_H*p]
+ // T4 = [D D H H] * [W W W W] mod 2^32
+ VEC128_MUL_LO_32(T4,T1,W);
+ VEC128_SUB_32(T1,T4,T3);
+ VEC128_SHUFFLE_32(T2,T1,0XDD);
+ //At this point, T2 = [D*Wmodp H*Wmodp D*Wmodp H*Wmodp]
+ // At this time I have V3=[A E C G], V4=[B F ? ?], T2=[? ? D H]
+ // I need V1 = [A B E F], V2 = [C D G H]
+ VEC128_UNPACK_LO_32(V1,V3,V4);
+ VEC128_UNPACK_HI_32(V2,V3,T2);
+ // T1 = V1 + V2
+ VEC128_ADD_32(T1,V1,V2);
+ // T2 = V1 - (V2 - 2P)
+ VEC128_SUB_32(T3,V2,P2);
+ VEC128_SUB_32(T2,V1,T3);
+ // Result in T1 = [A B E F] and T2 = [C D G H]
+ // Transform to V1=[A C B D], V2=[E G F H]
+ VEC128_UNPACK_LO_32(V1,T1,T2);
+ VEC128_UNPACK_HI_32(V2,T1,T2);
+ // Then T1=[A B C D], T2=[E F G H]
+ VEC128_SHUFFLE_32(T1,V1,0xD8);
+ VEC128_SHUFFLE_32(T2,V2,0xD8);
+ // Store
+ VEC128_STORE(ABCD,T1);
+ VEC128_STORE(EFGH,T2);
+ }
+
+ /*-----------------------------------*/
+ /*-- SSE FFT functions ----*/
+ /*-----------------------------------*/
+
+ template <class Field>
+ void FFT_transform<Field>::FFT_DIF_Harvey_mod2p_iterative4x1_SSE (uint32_t *fft) {
+ _vect128_t P,P2;
+ P = _mm_set1_epi32(_pl);
+ P2 = _mm_set1_epi32(_dpl);
+ uint32_t * tab_w = &pow_w [0];
+ uint32_t * tab_wp= &pow_wp[0];
+ size_t w, f;
+ for (w = n >> 1, f = 1; w >= 4; tab_w+=w, tab_wp+=w, w >>= 1, f <<= 1){
+ // w : witdh of butterflies
+ // f : # families of butterflies
+ for (size_t i = 0; i < f; i++)
+ for (size_t j = 0; j < w; j+=4)
+
+#define A0 &fft[0] + (i << 1) *w+ j
+#define A4 &fft[0] + ((i << 1)+1)*w+ j
+ Butterfly_DIF_mod2p_4x1_SSE(A0,A4, tab_w+j,tab_wp+j,P,P2);
+#undef A0
+#undef A4
+ //std::cout<<fft<<std::endl;
+ }
+ // Last two steps
+ if (n >= 8) {
+ _vect128_t W,Wp;
+ W = _mm_set1_epi32 ((int)tab_w [1]);
+ Wp= _mm_set1_epi32 ((int)tab_wp[1]);
+
+ for (size_t i = 0; i < f; i+=2)
+#define A0 &fft[0] + (i << 2)
+#define A4 &fft[0] + ((i << 2)+4)
+ Butterfly_DIF_mod2p_4x2_SSE_last2step(A0,A4,W,Wp,P,P2);
+ //std::cout<<fft<<std::endl;
+#undef A0
+#undef A4
+ } else {
+ for (; w >= 1; tab_w+=w, tab_wp+=w, w >>= 1, f <<= 1)
+ for (size_t i = 0; i < f; i++)
+ for (size_t j = 0; j < w; j++)
+ Butterfly_DIF_mod2p(fft[(i << 1)*w+j], fft[((i << 1)+1)*w+j], tab_w[j], tab_wp[j]);
+ }
+ }
+
+ template <class Field>
+ void FFT_transform<Field>::FFT_DIF_Harvey_mod2p_iterative4x2_SSE (uint32_t *fft) {
+ size_t w, f;
+ _vect128_t P,P2;
+ P = _mm_set1_epi32(_pl);
+ P2 = _mm_set1_epi32(_dpl);
+ uint32_t * tab_w = &pow_w[0];
+ uint32_t * tab_wp= &pow_wp[0];
+ for (w = n >> 1, f = 1; w >= 8; tab_w+=w+(w>>1), tab_wp+=w+(w>>1), w >>= 2, f <<= 2)
+ // w : witdh of butterflies
+ // f : # families of butterflies
+ for (size_t i = 0; i < f; i++)
+ for (size_t j = 0; j < (w >> 1); j+=4) {
+#define A0 &fft[0] + (i << 1) *w+ j
+#define A1 &fft[0] + (i << 1) *w+(j+(w >> 1))
+#define A2 &fft[0] + ((i << 1)+1)*w+ j
+#define A3 &fft[0] + ((i << 1)+1)*w+(j+(w >> 1))
+
+ Butterfly_DIF_mod2p_4x2_SSE(A0, A1, A2, A3,
+ tab_w +j, tab_w +j+(w >> 1), tab_w +j+w,
+ tab_wp+j, tab_wp+j+(w >> 1), tab_wp+j+w,
+ P,P2);
+#undef A0
+#undef A1
+#undef A2
+#undef A3
+ }
+
+ // Last two steps
+ if (n >= 8) {
+ if (w == 4) {
+ for (size_t i = 0; i < f; i++)
+#define A0 &fft[0] + (i << 1) *w
+#define A4 &fft[0] + ((i << 1)+1)*w
+ Butterfly_DIF_mod2p_4x1_SSE(A0,A4, tab_w,tab_wp,P,P2);
+#undef A0
+#undef A4
+ tab_w+=w;
+ tab_wp+=w;
+ w >>= 1;
+ f <<= 1;
+ }
+
+ _vect128_t W,Wp;
+ W = _mm_set1_epi32 ((int)tab_w [1]);
+ Wp= _mm_set1_epi32 ((int)tab_wp[1]);
+
+ for (size_t i = 0; i < f; i+=2)
+#define A0 &fft[0] + (i << 2)
+#define A4 &fft[0] + ((i << 2)+4)
+ Butterfly_DIF_mod2p_4x2_SSE_last2step(A0,A4,W,Wp,P,P2);
+#undef A0
+#undef A4
+ } else {
+ for (; w >= 1; tab_w+=w, tab_wp+=w, w >>= 1, f <<= 1)
+ for (size_t i = 0; i < f; i++)
+ for (size_t j = 0; j < w; j++)
+ Butterfly_DIF_mod2p(fft[(i << 1)*w+j], fft[((i << 1)+1)*w+j], tab_w[j], tab_wp[j]);
+ }
+ }
+
+ template <class Field>
+ void FFT_transform<Field>::FFT_DIT_Harvey_mod4p_iterative4x1_SSE (uint32_t *fft)
+ {
+ _vect128_t P,P2;
+ VEC128_SET_32(P,_pl);
+ VEC128_SET_32(P2,_dpl);
+ // Last two steps
+ if (n >= 8) {
+ _vect128_t W,Wp;
+ W = _mm_set1_epi32 ((int)pow_w [n-3]);
+ Wp= _mm_set1_epi32 ((int)pow_wp[n-3]);
+
+ for (size_t i = 0; i < n; i+=8)
+ Butterfly_DIT_mod4p_4x2_SSE_first2step(&fft[i],&fft[i+4],W,Wp,P,P2);
+
+ uint32_t * tab_w = &pow_w [n-8];
+ uint32_t * tab_wp= &pow_wp[n-8];
+ for (size_t w = 4, f = n >> 3; f >= 1; w <<= 1, f >>= 1, tab_w-=w, tab_wp-=w){
+ // w : witdh of butterflies
+ // f : # families of butterflies
+ for (size_t i = 0; i < f; i++)
+ for (size_t j = 0; j < w; j+=4)
+#define A0 &fft[0] + (i << 1) *w+ j
+#define A4 &fft[0] + ((i << 1)+1)*w+ j
+ Butterfly_DIT_mod4p_4x1_SSE(A0,A4, tab_w+j,tab_wp+j,P,P2);
+
+#undef A0
+#undef A4
+
+ }
+ } else {
+ uint32_t * tab_w = &pow_w [n-2];
+ uint32_t * tab_wp= &pow_wp[n-2];
+ for (size_t w = 1, f = n >> 1; f >= 1; w <<= 1, f >>= 1, tab_w-=w, tab_wp-=w)
+ for (size_t i = 0; i < f; i++)
+ for (size_t j = 0; j < w; j++)
+ Butterfly_DIT_mod4p(fft[(i << 1)*w+j], fft[((i << 1)+1)*w+j], tab_w[j], tab_wp[j]);
+ }
+ }
+
+
+ /******************************************************************************************************************
+ ******************************************************************************************************************
+ *********************************** FFT with AVX 2 CODE *******************************************************
+ ******************************************************************************************************************
+ ******************************************************************************************************************/
+
+
+#ifdef __LINBOX_HAVE_AVX2
+
+ template <class Field>
+ inline void FFT_transform<Field>::reduce256_modp(uint32_t* ABCD, const _vect256_t& P) {
+ _vect256_t V1,T;
+ VEC256_LOADU(V1,ABCD);
+ VEC256_MOD_P(V1,V1,P,T);
+ VEC256_STOREU(ABCD,V1);
+ }
+
+
+ /*---------------------------------------------------*/
+ /*-- implementation of DIF with 256-bits AVX ----*/
+ /*---------------------------------------------------*/
+
+ template <class Field>
+ inline void FFT_transform<Field>::Butterfly_DIF_mod2p_8x1_AVX(uint32_t* ABCDEFGH, uint32_t* IJKLMNOP,
+ const uint32_t* alpha,
+ const uint32_t* alphap,
+ const _vect256_t& P, const _vect256_t& P2) {
+ _vect256_t V1,V2,V3,V4,W,Wp,T;
+ // V1=[A B C D E F G H], V2=[I J K L M N O P]
+ VEC256_LOADU(V1,ABCDEFGH);
+ VEC256_LOADU(V2,IJKLMNOP);
+ VEC256_LOADU(W ,alpha);
+ VEC256_LOADU(Wp,alphap);
+
+ // V3 = V1 + V2 mod
+ VEC256_ADD_MOD(V3,V1,V2,P2,T);
+ VEC256_STOREU(ABCDEFGH,V3);
+
+ // V4 = (V1+(2P-V2))alpha mod 2P
+ VEC256_SUB_32(T,V2,P2);
+ VEC256_SUB_32(V4,V1,T);
+ VEC256_MUL_MOD(T,V4,W,P,Wp,V1,V2,V3);// V3 is the result
+ VEC256_STOREU(IJKLMNOP,T);
+ }
+
+
+ template <class Field>
+ inline void FFT_transform<Field>::Butterfly_DIF_mod2p_8x3_AVX_last3step(uint32_t* ABCDEFGH, uint32_t* IJKLMNOP,
+ const _vect256_t& alpha,const _vect256_t& alphap,
+ const _vect256_t& beta ,const _vect256_t& betap,
+ const _vect256_t& P ,const _vect256_t& P2) {
+ _vect256_t V1,V2,V3,V4,V5,V6,V7,Q;
+
+ // V1=[A B C D E F G H], V2=[I J K L M N O P]
+ VEC256_LOADU(V1,ABCDEFGH);
+ VEC256_LOADU(V2,IJKLMNOP);
+
+ /* 1st step */
+ // V3=[A B C D I J K L] V4=[E F G H M N O P]
+ VEC256_UNPACK_LO_128(V3,V1,V2);
+ VEC256_UNPACK_HI_128(V4,V1,V2);
+
+ // V1 = V3 + V4 mod 2P
+ // P2 = [2p 2p 2p 2p]
+ VEC256_ADD_MOD(V1,V3,V4,P2,V5);
+
+ // V2 = (V3+(2P-V4))alpha mod 2P
+ VEC256_SUB_32(V5,V4,P2);
+ VEC256_SUB_32(V6,V3,V5);
+ VEC256_MOD_P(V7,V6,P2,V2);
+ VEC256_MUL_MOD(V2,V7,alpha,P,alphap,V3,V4,V5);
+
+ /* 2nd step */
+
+ // V3=[A E B F I M J N] V4=[C G D H K O L P]
+ VEC256_UNPACK_LO_32(V3,V1,V2);
+ VEC256_UNPACK_HI_32(V4,V1,V2);
+
+ // V1 = V3 + V4 mod 2P
+ // P2 = [2p 2p 2p 2p]
+ VEC256_ADD_MOD(V1,V3,V4,P2,V5);
+
+ // V2 = (V3+(2P-V4))alpha mod 2P
+ // V7 = (V3+(2P-V4)) mod 2P
+ VEC256_SUB_32(V5,V4,P2);
+ VEC256_SUB_32(V6,V3,V5);
+ VEC256_MOD_P(V7,V6,P2,V2);
+
+ // V4 = [D D H H L L P P ]
+ VEC256_UNPACK_HI_32(V4,V7,V7);
+
+ // Q = V4 * beta mod 2^64 = [* Qd * Qh * Ql * Qp]
+ // with betap= [ betap * betap * betap * betap *]
+ VEC256_MUL_32(Q,V4,betap);
+ // V5 = [* Qd.P * Qh.P * Ql.P * Qp.P]
+ VEC256_MUL_LO_32(V5,Q,P);
+ // V6 = V4 * beta mod 2^32
+ VEC256_MUL_LO_32(V6,V4,beta);
+ // V3 = V6 - V5 = [* (D.beta mod p) * (H.beta mod p) * (L.beta mod p) * (P.beta mod p)]
+ VEC256_SUB_32(V3,V6,V5);
+ // V2=[* * D H * * L P]
+ VEC256_SHUFFLE_32(V2,V3,0xDD);
+
+ /* 3nd step */
+ // At this time I have V1=[A B E F I J M N], V7=[C G * * K O * *], V2=[* * D H * * L P]
+ // I need V3 = [A C E G I K M O], V4=[B D F H J L N P]
+ VEC256_UNPACK_LO_32(V3,V1,V7);
+ VEC256_UNPACK_HI_32(V4,V1,V2);
+
+ // V1 = V3 + V4 mod 2P
+ VEC256_ADD_MOD(V1,V3,V4,P2,V5);
+
+ // V2 = V3 + (2P - V4) mod 2P
+ VEC256_SUB_32(V5,V4,P2);
+ VEC256_SUB_32(V6,V3,V5);
+ VEC256_MOD_P(V2,V6,P2,V2);
+
+ // Result in V1=[A C E G I K M O] V2=[B D F H J L N P]
+ // Transform to V3=[A B C D I J K L],V4=[E F G H M N O P]
+ VEC256_UNPACK_LO_32(V3,V1,V2);
+ VEC256_UNPACK_HI_32(V4,V1,V2);
+
+ // Transform to V1=[A B C D E F G H], V2=[I J K L M N O P]
+ VEC256_UNPACK_LO_128(V1,V3,V4);
+ VEC256_UNPACK_HI_128(V2,V3,V4);
+
+ // Store
+ VEC256_STOREU(ABCDEFGH,V1);
+ VEC256_STOREU(IJKLMNOP,V2);
+ }
+
+
+
+ template <class Field>
+ void FFT_transform<Field>::FFT_DIF_Harvey_mod2p_iterative8x1_AVX (uint32_t *fft) {
+ _vect256_t P,P2;
+ VEC256_SET_32(P,_pl);
+ VEC256_SET_32(P2,_dpl);
+
+ uint32_t * tab_w = &pow_w [0];
+ uint32_t * tab_wp= &pow_wp[0];
+ size_t w, f;
+ for (w = n >> 1, f = 1; w >= 8; tab_w+=w, tab_wp+=w, w >>= 1, f <<= 1){
+ // w : witdh of butterflies
+ // f : # families of butterflies
+ for (size_t i = 0; i < f; i++)
+ for (size_t j = 0; j < w; j+=8)
+#define A0 &fft[0] + (i << 1) *w+ j
+#define A4 &fft[0] + ((i << 1)+1)*w+ j
+ Butterfly_DIF_mod2p_8x1_AVX(A0,A4, tab_w+j,tab_wp+j,P,P2);
+
+#undef A0
+#undef A4
+ //std::cout<<fft<<std::endl;
+ }
+ // Last three steps
+ if (n >= 16) {
+ _vect256_t alpha,alphap,beta,betap;
+ uint32_t tmp[8];
+ tmp[0]=tmp[4]=tab_w[0];
+ tmp[1]=tmp[5]=tab_w[1];
+ tmp[2]=tmp[6]=tab_w[2];
+ tmp[3]=tmp[7]=tab_w[3];
+ VEC256_LOADU(alpha,tmp);
+ tmp[0]=tmp[4]=tab_wp[0];
+ tmp[1]=tmp[5]=tab_wp[1];
+ tmp[2]=tmp[6]=tab_wp[2];
+ tmp[3]=tmp[7]=tab_wp[3];
+ VEC256_LOADU(alphap,tmp);
+ VEC256_SET_32(beta,tab_w [5]);
+ VEC256_SET_32(betap,tab_wp [5]);
+
+ for (size_t i = 0; i < f; i+=2)
+#define A0 &fft[0] + (i << 3)
+#define A4 &fft[0] + (i << 3)+8
+ Butterfly_DIF_mod2p_8x3_AVX_last3step(A0,A4,alpha,alphap,beta,betap,P,P2);
+#undef A0
+#undef A4
+ //std::cout<<fft<<std::endl;
+ } else {
+ for (; w >= 1; tab_w+=w, tab_wp+=w, w >>= 1, f <<= 1)
+ for (size_t i = 0; i < f; i++)
+ for (size_t j = 0; j < w; j++)
+ Butterfly_DIF_mod2p(fft[(i << 1)*w+j], fft[((i << 1)+1)*w+j], tab_w[j], tab_wp[j]);
+ }
+ }
+
+
+ /*---------------------------------------------------*/
+ /*-- implementation of DIF with 256-bits AVX ----*/
+ /*---------------------------------------------------*/
+
+ template <class Field>
+ inline void FFT_transform<Field>::Butterfly_DIT_mod4p_8x1_AVX(uint32_t* ABCDEFGH, uint32_t* IJKLMNOP,
+ const uint32_t* alpha,
+ const uint32_t* alphap,
+ const _vect256_t& P, const _vect256_t& P2) {
+ _vect256_t V1,V2,V3,V4,W,Wp,T1,T2;
+ // V1=[A B C D E F G H], V2=[I J K L M N O P]
+ VEC256_LOADU(V1,ABCDEFGH);
+ VEC256_LOADU(V2,IJKLMNOP);
+ VEC256_LOADU(W ,alpha);
+ VEC256_LOADU(Wp,alphap);
+
+ // V3 = V1 mod 2P
+ VEC256_MOD_P (V3,V1,P2,T1);
+
+ // V4 = V2 * W mod P
+ VEC256_MUL_MOD(V4,V2,W,P,Wp,V1,T1,T2);
+
+ // V1 = V3 + V4
+ VEC256_ADD_32(V1,V3,V4);
+ VEC256_STOREU(ABCDEFGH,V1);
+
+ // V2 = V3 - (V4 - 2P)
+ VEC256_SUB_32(T1,V4,P2);
+ VEC256_SUB_32(V2,V3,T1);
+ VEC256_STOREU(IJKLMNOP,V2);
+ }
+
+
+ template <class Field>
+ inline void FFT_transform<Field>::Butterfly_DIT_mod4p_8x3_AVX_first3step(uint32_t* ABCDEFGH, uint32_t* IJKLMNOP,
+ const _vect256_t& alpha,const _vect256_t& alphap,
+ const _vect256_t& beta ,const _vect256_t& betap,
+ const _vect256_t& P, const _vect256_t& P2) {
+ _vect256_t V1,V2,V3,V4,V5,V6,V7,Q;
+ // V1=[A B C D E F G H], V2=[I J K L M N O P]
+ VEC256_LOADU(V1,ABCDEFGH);
+ VEC256_LOADU(V2,IJKLMNOP);
+
+
+ /*********************************************/
+ /* 1st STEP */
+ /*********************************************/
+ // Transform to V3=[A I C K E M G O], V4=[B J D L F N H P]
+ VEC256_UNPACK_LO_32(V6,V1,V2); // V6=[A I B J E M F N]
+ VEC256_UNPACK_HI_32(V7,V1,V2); // V7=[C K D L G O H P]
+ VEC256_UNPACK_LO_64(V3,V6,V7); // V3=[A I C K E M G O]
+ VEC256_UNPACK_HI_64(V4,V6,V7); // V4=[B J D L F N H P]
+
+
+
+
+ // V1 = V3 + V4; V1 = [A I C K E M G O]
+ // Rk: No need for (. mod 2P) since entries are <P
+ VEC256_ADD_32(V1,V3,V4);
+
+ // V2 = V3 + (P - V4); V2 = [B J D L F N H P]
+ // Rk: No need for (. mod 2P) since entries are <P
+ VEC256_SUB_32(V6,V4,P);
+ VEC256_SUB_32(V2,V3,V6);
+
+ /*********************************************/
+ /* 2nd STEP */
+ /*********************************************/
+ // V5 = [D D L L H H P P]
+ VEC256_UNPACK_HI_32(V5,V2,V2);
+ // Q = V5 * alpha mod 2^64 = [* Qd * Qh * Ql * Qp]
+ // with betap= [ alphap * alphap * alphap * alphap *]
+ VEC256_MUL_32(Q,V5,alphap);
+ // V6 = [* Qd.P * Qh.P * Ql.P * Qp.P]
+ VEC256_MUL_LO_32(V6,Q,P);
+ // V7 = V5 * alpha mod 2^32
+ VEC256_MUL_LO_32(V7,V5,alpha);
+ // V3 = V7 - V6 = [* (D.alpha mod p) * (L.alpha mod p) * (H.alpha mod p) * (P.alpha mod p)]
+ VEC256_SUB_32(V3,V7,V6);
+ // V7=[D L * * H P * *]
+ VEC256_SHUFFLE_32(V7,V3,0xFD);
+ // V6 = [B J D L F N H P]
+ VEC256_UNPACK_LO_64(V6,V2,V7);
+ // V3= [A B I J E F M N], V4=[C D K L G H O P]
+ VEC256_UNPACK_LO_32(V3,V1,V6);
+ VEC256_UNPACK_HI_32(V4,V1,V6);
+
+ // V1 = V3+V4
+ VEC256_ADD_32(V1,V3,V4);
+ // V2 = V3 - (V4 - 2P)
+ VEC256_SUB_32(V7,V4,P2);
+ VEC256_SUB_32(V2,V3,V7);
+
+ /*********************************************/
+ /* 3nd STEP */
+ /*********************************************/
+ // V3= [A B C D I J K L] V4= [E F G H M N O P]
+ VEC256_UNPACK_LO_64(V6,V1,V2);
+ VEC256_UNPACK_HI_64(V7,V1,V2);
+ VEC256_UNPACK_LO_128(V3,V6,V7);
+ VEC256_UNPACK_HI_128(V4,V6,V7);
+
+ // V6= V3 mod 2P
+ VEC256_MOD_P(V6,V3,P2,V7);
+
+ // V7= V4.beta mod p
+ VEC256_MUL_MOD(V7,V4,beta,P,betap,V1,V2,V5);
+
+ // V1 = V6+V7
+ VEC256_ADD_32(V1,V6,V7);
+
+ // V2 = V6 - (V7 - 2P)
+ VEC256_SUB_32(V5,V7,P2);
+ VEC256_SUB_32(V2,V6,V5);
+
+ /*********************************************/
+ // V3=[A B C D E F G H] V4=[I J K L M N O P]
+ VEC256_UNPACK_LO_128(V3,V1,V2);
+ VEC256_UNPACK_HI_128(V4,V1,V2);
+
+ // Store
+ VEC256_STOREU(ABCDEFGH,V3);
+ VEC256_STOREU(IJKLMNOP,V4);
+ }
+
+
+
+ template <class Field>
+ void FFT_transform<Field>::FFT_DIT_Harvey_mod4p_iterative8x1_AVX (uint32_t *fft) {
+ _vect256_t P,P2;
+ VEC256_SET_32(P,_pl);
+ VEC256_SET_32(P2,_dpl);
+
+ // first three steps
+ if (n >= 16) {
+ _vect256_t alpha,alphap,beta,betap;
+ VEC256_SET_32(alpha,pow_w[n-3]);
+ VEC256_SET_32(alphap,pow_wp[n-3]);
+ uint32_t tmp[8];
+ tmp[0]=tmp[4]=pow_w[n-8];
+ tmp[1]=tmp[5]=pow_w[n-7];
+ tmp[2]=tmp[6]=pow_w[n-6];
+ tmp[3]=tmp[7]=pow_w[n-5];
+ VEC256_LOADU(beta,tmp);
+ tmp[0]=tmp[4]=pow_wp[n-8];
+ tmp[1]=tmp[5]=pow_wp[n-7];
+ tmp[2]=tmp[6]=pow_wp[n-6];
+ tmp[3]=tmp[7]=pow_wp[n-5];
+ VEC256_LOADU(betap,tmp);
+ for (uint64_t i = 0; i < n; i+=16)
+ Butterfly_DIT_mod4p_8x3_AVX_first3step(&fft[i],&fft[i+8],alpha,alphap,beta,betap,P,P2);
+ uint32_t * tab_w = &pow_w [n-16];
+ uint32_t * tab_wp= &pow_wp[n-16];
+ for (size_t w = 8, f = n >> 4; f >= 1; w <<= 1, f >>= 1, tab_w-=w, tab_wp-=w){
+ // w : witdh of butterflies
+ // f : # families of butterflies
+ for (size_t i = 0; i < f; i++)
+ for (size_t j = 0; j < w; j+=8)
+#define A0 &fft[0] + (i << 1) *w+ j
+#define A4 &fft[0] + ((i << 1)+1)*w+ j
+ Butterfly_DIT_mod4p_8x1_AVX(A0,A4, tab_w+j,tab_wp+j,P,P2);
+#undef A0
+#undef A4
+ }
+ } else {
+ uint32_t * tab_w = &pow_w [n-2];
+ uint32_t * tab_wp= &pow_wp[n-2];
+ for (size_t w = 1, f = n >> 1; f >= 1; w <<= 1, f >>= 1, tab_w-=w, tab_wp-=w)
+ for (size_t i = 0; i < f; i++)
+ for (size_t j = 0; j < w; j++)
+ Butterfly_DIT_mod4p(fft[(i << 1)*w+j], fft[((i << 1)+1)*w+j], tab_w[j], tab_wp[j]);
+ }
+ }
+
+
+
+
+#endif // end of AVX2 section
+
+} // enf of namespace LinBox
+
+#endif //end of file
diff --git a/linbox/algorithms/polynomial-matrix/polynomial-fft-transform.h b/linbox/algorithms/polynomial-matrix/polynomial-fft-transform.h
new file mode 100755
index 0000000..bd19bff
--- /dev/null
+++ b/linbox/algorithms/polynomial-matrix/polynomial-fft-transform.h
@@ -0,0 +1,331 @@
+/* -*- mode: C++; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
+/*
+ * Copyright (C) 2014 Pascal Giorgi, Romain Lebreton
+ *
+ * Written by Pascal Giorgi <pascal.giorgi at lirmm.fr>
+ * Romain Lebreton <romain.lebreton at lirmm.fr>
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ * ========LICENCE========
+ */
+
+
+#ifndef __LINBOX_polynomial_fft_transform_H
+#define __LINBOX_polynomial_fft_transform_H
+
+#include <iostream>
+#include "linbox/linbox-config.h"
+#include "linbox/algorithms/polynomial-matrix/simd.h"
+#include "linbox/util/debug.h"
+#include "givaro/givinteger.h"
+
+// template<typename T>
+// std::ostream& operator<<(std::ostream& os, const std::vector<T> &x){
+// std::ostream_iterator<T> out_it (os,", ");
+// std::copy ( x.begin(), x.end(), out_it );
+// return os;
+// }
+
+#include "fflas-ffpack/utils/align-allocator.h"
+
+namespace LinBox {
+
+
+ // class to handle FFT transform over wordsize prime field Fp (p < 2^29)
+ template <class Field>
+ class FFT_transform {
+ public:
+ typedef typename Field::Element Element;
+
+ const Field *fld;
+ uint64_t _pl, _dpl;
+ uint64_t n;
+ uint64_t ln;
+ //uint64_t _logp;
+ //uint64_t _I;
+ //double _pinv;
+ uint32_t _w;
+ uint32_t _invw;
+ typedef std::vector<uint32_t,AlignedAllocator<uint32_t, Alignment::DEFAULT> > VECT;
+ VECT pow_w;
+ VECT pow_wp; // Precomputations in shoup
+ VECT _data;
+ Element _p;
+ // pow_w = table of roots of unity. If w = primitive K-th root, then the table is:
+ // 1, w, w^2, ..., w^{K/2-1},
+ // 1, w^2, w^4, ..., w^{K/2-2},
+ // 1, w^4, w^8, ..., w^{K/2-4}
+ // ...
+ // 1, w^{K/8}, w^{K/4}, w^{3K/8},
+ // 1, w^{K/4},
+ // 1.
+
+ inline const Field & field() const { return *fld; }
+
+ uint64_t find_gen (uint64_t _m, uint64_t _val2p) {
+ // find a primitive 2^k root of unity where
+ // _p - 1 = 2^k * m
+ srand((unsigned int) time(NULL));
+ uint64_t y,z,j;
+ uint64_t _gen;
+ for (;;) {
+ _gen = rand() % _pl; if (_gen <= 0) continue;
+ z = 1;
+ for (unsigned long i=0; i < _m; ++i) z = z*_gen % _pl;
+ if (z == 1) continue;
+ // _gen^i =/ 1 pour 0 <= i < m
+ _gen = z;
+ j = 0;
+ do {
+ y = z;
+ z = y*y % _pl;
+ j++;
+ } while (j != _val2p && z != 1);
+ if (j == _val2p)
+ break;
+ }
+ return _gen;
+ }
+
+ FFT_transform (const Field& fld2, size_t ln2, Element w = 0)
+ : fld (&fld2), n ((1U << ln2)), ln (ln2), pow_w(n - 1), pow_wp(n - 1), _data(n) {
+ _pl = fld->characteristic();
+ _p = fld->characteristic();
+
+ linbox_check((_pl >> 29) == 0 ); // 8*p < 2^31 for Harvey's butterflies
+ _dpl = (_pl << 1);
+ //_pinv = 1 / (double) _pl;
+
+ if (w == 0){ // find a pseudo 2^lpts-th primitive root of unity
+ uint64_t _val2p = 0;
+ uint64_t _m = _pl;
+ uint64_t _logp = 0;
+ while (_m) {
+ _m >>= 1;
+ _logp++;
+ }
+ _m = _pl - 1;
+ while ((_m & 1) == 0) {
+ _m >>= 1;
+ _val2p++;
+ }
+ //_I = (1L << (_logp << 1)) / _pl;
+ uint64_t _gen = find_gen (_m, _val2p);
+ _w = Givaro::powmod(_gen, 1<<(_val2p-ln), _pl);
+ }
+ else {
+ _w = (uint32_t)w;
+ }
+
+ // compute w^(-1) mod p = w^(2^lpts - 1)
+ _invw = Givaro::powmod(_w, (1<<ln) - 1, _pl);
+
+ size_t pos = 0;
+ uint64_t wi = 1;
+ uint64_t __w = _w;
+ if (ln>0){
+ size_t tpts = 1 << (ln - 1);
+ while (tpts > 0) {
+ for (size_t i = 0; i < tpts; i++, pos++) {
+ pow_w[pos] = wi;
+ pow_wp[pos] = ((uint64_t) pow_w[pos] << 32UL) / _pl;
+ wi= (wi*__w)%_pl;
+ //field().mulin(wi, __w);
+ }
+ wi = 1;
+ __w = (__w * __w) % _pl;
+ //field().mulin(__w, __w);
+ tpts >>= 1;
+ }
+ }
+ }
+
+
+ Element getRoot() const {return _w;}
+ Element getInvRoot() const {return _invw;}
+
+
+ void FFT_DIF_Harvey (uint32_t *fft) {
+#ifdef __LINBOX_USE_SIMD
+#ifdef __AVX2__
+ FFT_DIF_Harvey_mod2p_iterative8x1_AVX(fft);
+ if (n>=8){
+ _vect256_t P;
+ VEC256_SET_32(P,_pl);
+ for (uint64_t i = 0; i < n; i += 8)
+ reduce256_modp(fft+i,P);
+ return;
+ }
+#else
+ FFT_DIF_Harvey_mod2p_iterative4x2_SSE(fft);
+#endif
+ if (n >=4) {
+ _vect128_t P;
+ VEC128_SET_32(P,_pl);
+ for (uint64_t i = 0; i < n; i += 4)
+ reduce128_modp(fft+i,P);
+ } else {
+ for (uint64_t i = 0; i < n; i++)
+ if (fft[i] >= _pl) fft[i] -= _pl;
+ }
+#else
+ // FALLBACK WHEN NO SIMD VERSION
+ FFT_DIF_Harvey_mod2p_iterative2x2(fft);
+ for (uint64_t i = 0; i < n; i++) {
+ if (fft[i] >= (_pl << 1)) fft[i] -= (_pl << 1);
+ if (fft[i] >= _pl) fft[i] -= _pl;
+ }
+#endif
+ }
+
+ void FFT_DIT_Harvey (uint32_t *fft) {
+#ifdef __LINBOX_USE_SIMD
+#ifdef __AVX2__
+ FFT_DIT_Harvey_mod4p_iterative8x1_AVX(fft);
+ if (n>=8){
+ _vect256_t P,P2;
+ VEC256_SET_32(P, _pl);
+ VEC256_SET_32(P2,_dpl);
+ for (uint64_t i = 0; i < n; i += 8){
+ reduce256_modp(&fft[i],P2);
+ reduce256_modp(&fft[i],P);
+ }
+ return;
+ }
+#else
+ FFT_DIT_Harvey_mod4p_iterative4x1_SSE(fft);
+#endif
+ if (n >=4) {
+ _vect128_t P,P2;
+ VEC128_SET_32(P,_pl);
+ VEC128_SET_32(P2,_dpl);
+ for (uint64_t i = 0; i < n; i += 4){
+ reduce128_modp(&fft[i],P2);
+ reduce128_modp(&fft[i],P);
+ }
+ } else {
+ for (uint64_t i = 0; i < n; i++) {
+ if (fft[i] >= (_pl << 1)) fft[i] -= (_pl << 1);
+ if (fft[i] >= _pl) fft[i] -= _pl;
+ }
+ }
+#else
+ // FALLBACK WHEN NO SIMD VERSION
+ FFT_DIT_Harvey_mod4p_iterative2x2(fft);
+ for (uint64_t i = 0; i < n; i++) {
+ if (fft[i] >= (_pl << 1)) fft[i] -= (_pl << 1);
+ if (fft[i] >= _pl) fft[i] -= _pl;
+ }
+#endif
+ }
+
+ // FFT without conversion
+ template <class T=Element>
+ typename std::enable_if<std::is_same<T,uint32_t>::value>::type
+ FFT_DIF (T *fft) {
+ FFT_DIF_Harvey(fft);
+ }
+ template <class T=Element>
+ typename std::enable_if<std::is_same<T,uint32_t>::value>::type
+ FFT_DIT (T *fft) {
+ FFT_DIT_Harvey(fft);
+ }
+
+ // FFT with conversion from Element to uint32_t
+ template <typename T=Element>
+ typename std::enable_if<!std::is_same<T,uint32_t>::value>::type
+ FFT_DIF (T *fft) {
+ for(uint64_t i=0;i<n;i++)
+ _data[i]=fft[i];
+ FFT_DIF_Harvey(&_data[0]);
+ for(uint64_t i=0;i<n;i++)
+ fft[i]=_data[i];
+
+ }
+ template <typename T=Element>
+ typename std::enable_if<!std::is_same<T,uint32_t>::value>::type
+ FFT_DIT (T *fft) {
+ for(uint64_t i=0;i<n;i++)
+ _data[i]=fft[i];
+ FFT_DIT_Harvey(&_data[0]);
+ for(uint64_t i=0;i<n;i++)
+ fft[i]=_data[i];
+ }
+
+ /*
+ * Different implementations for the butterfly operations
+ */
+ template <class T>
+ inline void Butterfly_DIT_mod4p(T& A, T& B, const uint32_t& alpha, const uint32_t& alphap);
+ template <class T>
+ inline void Butterfly_DIF_mod2p(T& A, T& B, const uint32_t& alpha, const uint32_t& alphap);
+
+ inline void reduce128_modp(uint32_t*, const __m128i&);
+ inline void Butterfly_DIF_mod2p_4x1_SSE(uint32_t* ABCD, uint32_t* EFGH,const uint32_t* alpha, const uint32_t* alphap, const __m128i& P, const __m128i& P2);
+ inline void Butterfly_DIF_mod2p_4x1_SSE_laststep(uint32_t* ABCD, uint32_t* EFGH, const __m128i& P2);
+ inline void Butterfly_DIF_mod2p_4x2_SSE(uint32_t* , uint32_t* ,uint32_t* , uint32_t* ,
+ const uint32_t* ,const uint32_t* ,const uint32_t* ,
+ const uint32_t* ,const uint32_t* ,const uint32_t* ,
+ const __m128i& P, const __m128i& P2);
+ inline void Butterfly_DIF_mod2p_4x2_SSE_last2step(uint32_t* ABCD, uint32_t* EFGH, const __m128i& W,
+ const __m128i& Wp, const __m128i& P, const __m128i& P2);
+ inline void Butterfly_DIT_mod4p_4x1_SSE(uint32_t* ABCD, uint32_t* EFGH, const uint32_t* alpha,
+ const uint32_t* alphap,const __m128i& P, const __m128i& P2);
+ inline void Butterfly_DIT_mod4p_4x2_SSE_first2step(uint32_t* ABCD, uint32_t* EFGH, const __m128i& W,
+ const __m128i& Wp, const __m128i& P, const __m128i& P2);
+#ifdef __AVX2__
+ inline void reduce256_modp(uint32_t*, const __m256i&);
+ inline void Butterfly_DIF_mod2p_8x1_AVX(uint32_t* ABCD, uint32_t* EFGH, const uint32_t* alpha,const uint32_t* alphap,const __m256i& P, const __m256i& P2);
+ inline void Butterfly_DIF_mod2p_8x3_AVX_last3step(uint32_t* ABCDEFGH, uint32_t* IJKLMNOP, const __m256i& alpha,const __m256i& alphap,
+ const __m256i& beta ,const __m256i& betap, const __m256i& P ,const __m256i& P2);
+ inline void Butterfly_DIT_mod4p_8x1_AVX(uint32_t* ABCD, uint32_t* EFGH, const uint32_t* alpha,const uint32_t* alphap,
+ const __m256i& P, const __m256i& P2);
+ inline void Butterfly_DIT_mod4p_8x3_AVX_first3step(uint32_t* ABCDEFGH, uint32_t* IJKLMNOP, const __m256i& alpha,const __m256i& alphap,
+ const __m256i& beta ,const __m256i& betap, const __m256i& P ,const __m256i& P2);
+
+
+#endif
+
+ /*
+ * Different implementation of DIF/DIT with Harvey's trick
+ */
+
+ void FFT_DIF_Harvey_mod2p_iterative (Element *fft);
+ void FFT_DIF_Harvey_mod2p_iterative2x2 (Element *fft);
+ void FFT_DIF_Harvey_mod2p_iterative3x3 (Element *fft);
+ void FFT_DIT_Harvey_mod4p_iterative2x2 (Element *fft);
+ void FFT_DIT_Harvey_mod4p_iterative3x3 (Element *fft);
+ // SIMD implementations follow
+ void FFT_DIF_Harvey_mod2p_iterative4x1_SSE (uint32_t *fft);
+ void FFT_DIF_Harvey_mod2p_iterative4x2_SSE (uint32_t *fft);
+ void FFT_DIT_Harvey_mod4p_iterative4x1_SSE (uint32_t *fft);
+#ifdef __AVX2__
+ void FFT_DIF_Harvey_mod2p_iterative8x1_AVX (uint32_t *fft);
+ void FFT_DIT_Harvey_mod4p_iterative8x1_AVX (uint32_t *fft);
+#endif
+
+ };
+} // end of namespace LinBox
+
+#include "linbox/algorithms/polynomial-matrix/polynomial-fft-transform.inl"
+#ifdef __LINBOX_USE_SIMD
+#include "linbox/algorithms/polynomial-matrix/polynomial-fft-transform-simd.inl"
+#endif
+#endif // __LINBOX_FFT_H
+
+
diff --git a/linbox/algorithms/polynomial-matrix/polynomial-fft-transform.inl b/linbox/algorithms/polynomial-matrix/polynomial-fft-transform.inl
new file mode 100644
index 0000000..84cc795
--- /dev/null
+++ b/linbox/algorithms/polynomial-matrix/polynomial-fft-transform.inl
@@ -0,0 +1,238 @@
+/* -*- mode: C++; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
+/*
+ * Copyright (C) 2014 Pascal Giorgi, Romain Lebreton
+ *
+ * Written by Pascal Giorgi <pascal.giorgi at lirmm.fr>
+ * Romain Lebreton <romain.lebreton at lirmm.fr>
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ * ========LICENCE========
+ */
+
+namespace LinBox {
+
+ template <class Field>
+ template <class T>
+ inline void FFT_transform<Field>::Butterfly_DIT_mod4p(T& A, T& B, const uint32_t& alpha, const uint32_t& alphap) {
+ // Harvey's algorithm
+ // 0 <= A,B < 4*p, p < 2^32 / 4
+ // alphap = Floor(alpha * 2^ 32 / p])
+ if (A >= _dpl) A -= _dpl;
+ uint32_t tmp = ((uint32_t) alphap * (uint64_t)B) >> 32;
+ tmp = (uint64_t)alpha * B - tmp * _pl;
+ B = A + (_dpl - tmp);
+ // B &= 0XFFFFFFFF;
+ A += tmp;
+ }
+
+ template <class Field>
+ template <class T>
+ inline void FFT_transform<Field>::Butterfly_DIF_mod2p(T& A, T& B, const uint32_t& alpha, const uint32_t& alphap) {
+ //std::cout<<A<<" $$ "<<B<<"("<<alpha<<","<<alphap<<" ) -> ";
+ // Harvey's algorithm
+ // 0 <= A,B < 2*p, p < 2^32 / 4
+ // alphap = Floor(alpha * 2^ 32 / p])
+ uint64_t tmp = A;
+ A += B;
+ if (A >= _dpl) A -= _dpl;
+ B = tmp + (_dpl - B);
+ tmp = ((uint32_t) alphap * (uint64_t)B) >> 32;
+ B = (uint64_t)alpha * B - tmp * _pl;
+ //B &= 0xFFFFFFFF;
+ //std::cout<<A<<" $$ "<<B<<"\n ";
+ }
+
+
+ template <class Field>
+ void FFT_transform<Field>::FFT_DIF_Harvey_mod2p_iterative (Element *fft) {
+ for (size_t w = n >> 1, f = 1, pos_w = 0; w != 0; f <<= 1, pos_w += w, w >>= 1)
+ // w : witdh of butterflies
+ // f : # families of butterflies
+ for (size_t i = 0; i < f; i++){
+ for (size_t j = 0; j < w; j++)
+ Butterfly_DIF_mod2p(fft[(i << 1)*w+j], fft[((i << 1)+1)*w+j], pow_w[j*f], pow_wp[j*f]);
+ }
+ }
+
+ template <class Field>
+ void FFT_transform<Field>::FFT_DIF_Harvey_mod2p_iterative2x2 (Element *fft) {
+ size_t w, f;
+ for (w = n >> 1, f = 1; w >= 2; w >>= 2, f <<= 2)
+ // w : witdh of butterflies
+ // f : # families of butterflies
+ for (size_t i = 0; i < f; i++)
+ for (size_t j = 0; j < (w >> 1); j++) {
+#define A0 fft[(i << 1) *w+ j ]
+#define A1 fft[(i << 1) *w+(j+(w >> 1))]
+#define A2 fft[((i << 1)+1)*w+ j ]
+#define A3 fft[((i << 1)+1)*w+(j+(w >> 1))]
+ // Base butterfly
+ Butterfly_DIF_mod2p(A0, A2, pow_w[j*f], pow_wp[j*f]);
+ // Same step, same family, index + (w >>1)
+ Butterfly_DIF_mod2p(A1, A3, pow_w[(j+(w >> 1))*f], pow_wp[(j+(w >> 1))*f]);
+ // Next step on first entries of previous butterflies, #family * 2, same index
+ Butterfly_DIF_mod2p(A0, A1, pow_w[j*(f << 1)], pow_wp[j*(f << 1)]);
+ // Next step on second entries of previous butterflies, #family * 2, same index
+ Butterfly_DIF_mod2p(A2, A3, pow_w[j*(f << 1)], pow_wp[j*(f << 1)]);
+#undef A0
+#undef A1
+#undef A2
+#undef A3
+ }
+ // Remaining steps, at most one
+ if (w > 0)
+ // w : witdh of butterflies
+ // f : # families of butterflies
+ for (size_t i = 0; i < f; i++)
+ for (size_t j = 0; j < w; j++)
+ Butterfly_DIF_mod2p(fft[(i << 1)*w+j], fft[((i << 1)+1)*w+j], pow_w[j*f], pow_wp[j*f]);
+ }
+
+ template <class Field>
+ void FFT_transform<Field>::FFT_DIF_Harvey_mod2p_iterative3x3 (Element *fft) {
+ size_t w, f;
+ for (w = n >> 1, f = 1; w >= 4; w >>= 3, f <<= 3)
+ // w : witdh of butterflies
+ // f : # families of butterflies
+ for (size_t i = 0; i < f; i++)
+ for (size_t j = 0; j < (w >> 2); j++) {
+#define A0 fft[(i << 1) *w+ j ]
+#define A1 fft[(i << 1) *w+(j+ (w >> 2))]
+#define A2 fft[(i << 1) *w+(j+ (w >> 1))]
+#define A3 fft[(i << 1) *w+(j+3*(w >> 2))]
+#define A4 fft[((i << 1)+1)*w+ j ]
+#define A5 fft[((i << 1)+1)*w+(j+ (w >> 2))]
+#define A6 fft[((i << 1)+1)*w+(j+ (w >> 1))]
+#define A7 fft[((i << 1)+1)*w+(j+3*(w >> 2))]
+ // First Step
+ Butterfly_DIF_mod2p(A0, A4, pow_w[ j *f], pow_wp[ j *f]);
+ Butterfly_DIF_mod2p(A1, A5, pow_w[(j+ (w >> 2))*f], pow_wp[(j+ (w >> 2))*f]);
+ Butterfly_DIF_mod2p(A2, A6, pow_w[(j+ (w >> 1))*f], pow_wp[(j+ (w >> 1))*f]);
+ Butterfly_DIF_mod2p(A3, A7, pow_w[(j+3*(w >> 2))*f], pow_wp[(j+3*(w >> 2))*f]);
+
+ // Second Step
+ Butterfly_DIF_mod2p(A0, A2, pow_w[ j *(f << 1)], pow_wp[ j *(f << 1)]);
+ Butterfly_DIF_mod2p(A1, A3, pow_w[(j+(w >> 2))*(f << 1)], pow_wp[(j+(w >> 2))*(f << 1)]);
+ Butterfly_DIF_mod2p(A4, A6, pow_w[ j *(f << 1)], pow_wp[ j *(f << 1)]);
+ Butterfly_DIF_mod2p(A5, A7, pow_w[(j+(w >> 2))*(f << 1)], pow_wp[(j+(w >> 2))*(f << 1)]);
+
+ // Third Step
+ Butterfly_DIF_mod2p(A0, A1, pow_w[j*(f << 2)], pow_wp[j*(f << 2)]);
+ Butterfly_DIF_mod2p(A2, A3, pow_w[j*(f << 2)], pow_wp[j*(f << 2)]);
+ Butterfly_DIF_mod2p(A4, A5, pow_w[j*(f << 2)], pow_wp[j*(f << 2)]);
+ Butterfly_DIF_mod2p(A6, A7, pow_w[j*(f << 2)], pow_wp[j*(f << 2)]);
+#undef A0
+#undef A1
+#undef A2
+#undef A3
+#undef A4
+#undef A5
+#undef A6
+#undef A7
+ }
+ // Remaining steps, at most two
+ for (; w > 0; w >>= 1, f <<= 1)
+ // w : witdh of butterflies
+ // f : # families of butterflies
+ for (size_t i = 0; i < f; i++)
+ for (size_t j = 0; j < w; j++)
+ Butterfly_DIF_mod2p(fft[(i << 1)*w+j], fft[((i << 1)+1)*w+j], pow_w[j*f], pow_wp[j*f]);
+ }
+
+
+ template <class Field>
+ void FFT_transform<Field>::FFT_DIT_Harvey_mod4p_iterative2x2 (Element *fft) {
+ size_t w, f;
+ for (w = 1, f = n >> 1; f >= 2; w <<= 2, f >>= 2)
+ // w : witdh of butterflies
+ // f : # families of butterflies
+ for (size_t i = 0; i < (f >> 1); i++)
+ for (size_t j = 0; j < w; j++) {
+#define A0 fft[ (i << 2) *w+j]
+#define A1 fft[((i << 2)+1)*w+j]
+#define A2 fft[((i << 2)+2)*w+j]
+#define A3 fft[((i << 2)+3)*w+j]
+ Butterfly_DIT_mod4p(A0, A1, pow_w[j*f], pow_wp[j*f]);
+ Butterfly_DIT_mod4p(A2, A3, pow_w[j*f], pow_wp[j*f]);
+
+ Butterfly_DIT_mod4p(A0, A2, pow_w[ j *(f >> 1)], pow_wp[ j *(f >> 1)]);
+ Butterfly_DIT_mod4p(A1, A3, pow_w[(j+w)*(f >> 1)], pow_wp[(j+w)*(f >> 1)]);
+#undef A0
+#undef A1
+#undef A2
+#undef A3
+ }
+ // Remaining steps, at most one
+ if (f > 0)
+ // w : witdh of butterflies
+ // f : # families of butterflies
+ for (size_t i = 0; i < f; i++)
+ for (size_t j = 0; j < w; j++)
+ Butterfly_DIT_mod4p(fft[(i << 1)*w+j], fft[((i << 1)+1)*w+j], pow_w[j*f], pow_wp[j*f]);
+ }
+
+ template <class Field>
+ void FFT_transform<Field>::FFT_DIT_Harvey_mod4p_iterative3x3 (Element *fft) {
+ size_t w, f;
+ for (w = 1, f = n >> 1; f >= 4; w <<= 3, f >>= 3)
+ // w : witdh of butterflies
+ // f : # families of butterflies
+ for (size_t i = 0; i < (f >> 2); i++)
+ for (size_t j = 0; j < w; j++) {
+#define A0 fft[ (i << 3) *w+j]
+#define A1 fft[((i << 3)+1)*w+j]
+#define A2 fft[((i << 3)+2)*w+j]
+#define A3 fft[((i << 3)+3)*w+j]
+#define A4 fft[((i << 3)+4)*w+j]
+#define A5 fft[((i << 3)+5)*w+j]
+#define A6 fft[((i << 3)+6)*w+j]
+#define A7 fft[((i << 3)+7)*w+j]
+ Butterfly_DIT_mod4p(A0, A1, pow_w[j*f], pow_wp[j*f]);
+ Butterfly_DIT_mod4p(A2, A3, pow_w[j*f], pow_wp[j*f]);
+ Butterfly_DIT_mod4p(A4, A5, pow_w[j*f], pow_wp[j*f]);
+ Butterfly_DIT_mod4p(A6, A7, pow_w[j*f], pow_wp[j*f]);
+
+ Butterfly_DIT_mod4p(A0, A2, pow_w[ j *(f >> 1)], pow_wp[ j *(f >> 1)]);
+ Butterfly_DIT_mod4p(A1, A3, pow_w[(j+w)*(f >> 1)], pow_wp[(j+w)*(f >> 1)]);
+ Butterfly_DIT_mod4p(A4, A6, pow_w[ j *(f >> 1)], pow_wp[ j *(f >> 1)]);
+ Butterfly_DIT_mod4p(A5, A7, pow_w[(j+w)*(f >> 1)], pow_wp[(j+w)*(f >> 1)]);
+
+ Butterfly_DIT_mod4p(A0, A4, pow_w[ j *(f >> 2)], pow_wp[ j *(f >> 2)]);
+ Butterfly_DIT_mod4p(A1, A5, pow_w[(j+ w)*(f >> 2)], pow_wp[(j+ w)*(f >> 2)]);
+ Butterfly_DIT_mod4p(A2, A6, pow_w[(j+2*w)*(f >> 2)], pow_wp[(j+2*w)*(f >> 2)]);
+ Butterfly_DIT_mod4p(A3, A7, pow_w[(j+3*w)*(f >> 2)], pow_wp[(j+3*w)*(f >> 2)]);
+#undef A0
+#undef A1
+#undef A2
+#undef A3
+#undef A4
+#undef A5
+#undef A6
+#undef A7
+ }
+ // Remaining steps, at most one
+ for ( ; f > 0; w <<= 1, f >>= 1)
+ // w : witdh of butterflies
+ // f : # families of butterflies
+ for (size_t i = 0; i < f; i++)
+ for (size_t j = 0; j < w; j++)
+ Butterfly_DIT_mod4p(fft[(i << 1)*w+j], fft[((i << 1)+1)*w+j], pow_w[j*f], pow_wp[j*f]);
+ }
+
+
+}
diff --git a/linbox/algorithms/polynomial-matrix/polynomial-matrix-domain.h b/linbox/algorithms/polynomial-matrix/polynomial-matrix-domain.h
new file mode 100755
index 0000000..7274dd3
--- /dev/null
+++ b/linbox/algorithms/polynomial-matrix/polynomial-matrix-domain.h
@@ -0,0 +1,218 @@
+/* -*- mode: C++; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
+/*
+ * Copyright (C) 2013 Pascal Giorgi
+ *
+ * Written by Pascal Giorgi <pascal.giorgi at lirmm.fr>
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ * ========LICENCE========
+ */
+
+
+#ifndef __LINBOX_POLYNOMIAL_MATRIX_DOMAIN_H
+#define __LINBOX_POLYNOMIAL_MATRIX_DOMAIN_H
+
+#define KARA_DEG_THRESHOLD 2
+#define FFT_DEG_THRESHOLD 2
+
+#include "linbox/algorithms/polynomial-matrix/matpoly-mult-naive.h"
+#include "linbox/algorithms/polynomial-matrix/matpoly-mult-kara.h"
+#include "linbox/algorithms/polynomial-matrix/matpoly-mult-fft.h"
+#include <algorithm>
+namespace LinBox
+{
+
+ template <class Field>
+ class PolynomialMatrixMulDomain {
+ public:
+ PolynomialMatrixKaraDomain<Field> _kara;
+ PolynomialMatrixFFTMulDomain<Field> _fft;
+ PolynomialMatrixNaiveMulDomain<Field> _naive;
+ const Field* _field;
+ public:
+ PolynomialMatrixMulDomain (const Field &F) :
+ _kara(F), _fft(F), _naive(F), _field(&F) {}
+
+ inline const Field& field() const {return *_field;}
+
+ template< class PMatrix1,class PMatrix2,class PMatrix3>
+ void mul(PMatrix1 &c, const PMatrix2 &a, const PMatrix3 &b)
+ {
+ size_t d = a.size()+b.size();
+ if (d > FFT_DEG_THRESHOLD){
+ //std::cout<<"PolMul FFT"<<std::endl;
+ _fft.mul(c,a,b);
+ }
+ else
+ if ( d > KARA_DEG_THRESHOLD){
+ //std::cout<<"PolMul Kara"<<std::endl;
+ _kara.mul(c,a,b);
+ }
+ else {
+ //std::cout<<"PolMul Naive"<<std::endl;
+ _naive.mul(c,a,b);
+ }
+ }
+
+ template< class PMatrix1,class PMatrix2,class PMatrix3>
+ void midproduct (PMatrix1 &c, const PMatrix2 &a, const PMatrix3 &b)
+ {
+ size_t d = b.size();
+ if (d > FFT_DEG_THRESHOLD)
+ _fft.midproduct(c,a,b);
+ else
+ if ( d > KARA_DEG_THRESHOLD)
+ _kara.midproduct(c,a,b);
+ else
+ _naive.midproduct(c,a,b);
+ }
+
+ template< class PMatrix1,class PMatrix2,class PMatrix3>
+ void midproductgen (PMatrix1 &c, const PMatrix2 &a, const PMatrix3 &b, bool smallLeft=true, size_t n0=0, size_t n1=0)
+ {
+ if ( c.size() <= 4)
+ _naive.midproduct(c,a,b,smallLeft,n0,n1);
+ else
+ _fft.midproduct(c,a,b,smallLeft,n0,n1);
+ }
+ };
+
+ template<class Field>
+ class PolynomialMatrixDomain : public PolynomialMatrixMulDomain<Field>, public PolynomialMatrixAddDomain<Field> {
+ public:
+ PolynomialMatrixDomain (const Field& F) : PolynomialMatrixMulDomain<Field>(F), PolynomialMatrixAddDomain<Field>(F) {}
+ };
+
+
+
+
+ template <typename Field, typename PMatrix1,typename PMatrix2,typename PMatrix3>
+ class HalflineMPDomain {
+ private:
+ PMatrix1 *_c;
+ const PMatrix2 *_a;
+ const PMatrix3 *_b;
+ typename PMatrix3::const_view _b1;
+ typename PMatrix1::plain _tmp;
+ size_t _i;
+ size_t _d;
+ PolynomialMatrixDomain<Field> _PMD;
+ BlasMatrixDomain<Field> _BMD;
+ public:
+ double mid;
+ const Field& field(){return _PMD.field();}
+
+ HalflineMPDomain(const Field& F): _i(1), _d(0), _PMD(F), _BMD(F) {}
+
+ // compute c = x^k ab mod x^2k
+ // a is of sike k+1
+ // b is of size 2k
+ // c is of size k
+ HalflineMPDomain(const Field& F, PMatrix1& c, const PMatrix2& a, const PMatrix3 &b,
+ size_t k)
+ : _c(&c), _a(&a), _b(&b), _b1(b,k,std::min(b.size()-1,2*k-1)), _tmp(F,c.rowdim(),c.coldim(),2*k-1),
+ _i(1), _d(std::min(b.size()-1,2*k-1)-k+1), _PMD(F), _BMD(F), mid(0)
+ {
+ linbox_check(c.size()==k);
+ linbox_check(a.size()<=k+1);
+ //linbox_check(b.size()==2*k);
+ Timer chrono;
+ chrono.start();
+ // compute the high product of c= x^(k-1) a[1,k]b[0,k-1] mod x^2k
+ typename PMatrix2::const_view a0= a.at(1,a.size()-1);
+ typename PMatrix3::const_view b0= b.at(0,k-1);
+ _PMD.mul(_tmp,a0,b0);
+ c.copy(_tmp,k-1,2*k-2);
+ chrono.stop();
+ mid+=chrono.usertime();
+
+ }
+
+ void update(size_t s=1){
+ for (size_t i=0;i<s;i++){
+ ++(*this);
+ }
+ }
+
+ void operator++() {
+ if (!terminated()){ // compute product at step _i
+ //cout<<"read coeff <="<<_d+_i-1<<" of "<< 2*_d<<" ..."<<endl;;
+ size_t m = twoValuation(_i);
+ size_t step= 1ULL<<m;
+ //typename PMatrix3::const_view bb = _b->at(0, 2*_d-1);
+
+ if (step<_d) {
+ // cout<<"("<< 0 <<","<< min(2*step-2,_a->size()-1)<<") x";
+ // cout<<"("<< _i-step <<","<< _i-1 <<") ->";
+ // cout<<"("<< _i-1 <<","<< _i+step-2 <<") "<<endl;;
+
+ typename PMatrix1::view tmp = _tmp.at(0 , step-1);
+ typename PMatrix1::view c = _c->at(_i-1, _i+step-2);
+ typename PMatrix2::const_view a = _a->at(0, std::min(2*step-2,_a->size()-1));
+ typename PMatrix3::const_view b = _b1.at(_i-step, _i-1);
+ Timer chrono;
+ chrono.start();
+ _PMD.midproductgen(tmp,a,b,false);//,step,2*step);
+ chrono.stop();
+ _PMD.addin(c,tmp);
+ mid+=chrono.usertime();
+ }
+ else {
+ // compute the last diagonal element
+ for(size_t i=0;i<std::min(_d,_a->size());i++)
+ _BMD.axpyin((*_c)[_d-1],(*_a)[i],_b1[_d-i-1]);
+ /*
+ cout<<"checking result of online MP ..."<<_d<<"x"<<2*_d<<"...";
+ PMatrix1 R(field(),_c->rowdim(),_c->coldim(),_c->size());
+ typename PMatrix3::const_view b = _b->at(0, 2*_d-1);
+ _PMD.midproductgen(R,*_a, b, true, _d+1,2*_d);
+ if (R==(*_c))
+ cout<<"done"<<endl;
+ else
+ cout<<"error"<<endl;
+ */
+ }
+ _i++;
+ }
+ }
+
+ bool terminated() const {return _i>_d;}
+
+ inline size_t twoValuation(size_t x){
+ size_t i=0;
+ while (x!=0 && !(x&0x1)){
+ i++;
+ x>>=1;
+ }
+ return i;
+ }
+
+
+ };
+
+} // end of namespace LinBox
+
+#endif //__LINBOX_matpoly_mult_H
+
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/algorithms/polynomial-matrix/simd.h b/linbox/algorithms/polynomial-matrix/simd.h
new file mode 100644
index 0000000..badcc2d
--- /dev/null
+++ b/linbox/algorithms/polynomial-matrix/simd.h
@@ -0,0 +1,273 @@
+/* -*- mode: C++; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
+/*
+ * Copyright (C) 2013 Pascal Giorgi
+ *
+ * Written by Pascal Giorgi <pascal.giorgi at lirmm.fr>
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ * ========LICENCE========
+ */
+
+#ifndef __LINBOX_SIMD__
+#define __LINBOX_SIMD__
+
+
+//#include <immintrin.h>
+#include "fflas-ffpack/utils/fflas_intrinsic.h"
+#include <iostream>
+
+
+#ifdef __AVX2__
+/* 256 bits CODE HERE */
+#define __LINBOX_HAVE_AVX2
+
+// define 256 bits simd vector type
+typedef __m256i _vect256_t;
+
+/* 256 bits CODE HERE */
+// C=C+AB using X as temporary
+#define VEC256_MADD_32(C,A,B,X) \
+ X= _mm256_mul_epi32(A,B); C= _mm256_add_epi64(C,X);
+
+// C=A*B (2 op 32x32->64)
+#define VEC256_MUL_32(C,A,B) \
+ C= _mm256_mul_epu32(A,B);
+
+// C=A*B (4 op 32x32->32 low product)
+#define VEC256_MUL_LO_32(C,A,B) \
+ C= _mm256_mullo_epi32(A,B);
+
+// C=A+B
+#define VEC256_ADD_32(C,A,B) \
+ C= _mm256_add_epi32(A,B);
+// C=A+B
+#define VEC256_ADD_64(C,A,B) \
+ C= _mm256_add_epi64(A,B);
+
+// A+=B
+#define VEC256_ADDIN_64(A,B) \
+ A= _mm256_add_epi64(A,B);
+
+// C=A-B
+#define VEC256_SUB_32(C,A,B) \
+ C= _mm256_sub_epi32(A,B);
+
+// C = A mod P using T as temporary (A must lie in [0 2P[ )
+#define VEC256_MOD_P(C,A,P,T) \
+ T=_mm256_cmpgt_epi32(P,A); \
+ C=_mm256_sub_epi32(A,_mm256_andnot_si256(T,P));
+// Rk: __m128i _mm_cmpgt_epi64 (__m128d a, __m128d b) // compare a>b si vrai renvoi 0xFFFFFFFFFFFFFFFF
+
+// C = A >> X
+#define VEC256_RSHIFT_64(C,A,X) \
+ C=_mm256_srli_epi64 (A,X);
+
+// C = A << X
+#define VEC256_LSHIFT_64(C,A,X) \
+ C=_mm256_slli_epi64 (A,X);
+
+// C = A || X
+#define VEC256_OR(C,A,X) \
+ C=_mm256_or_si256(A,X);
+
+// C = unpack_lo32(A,B)
+#define VEC256_UNPACK_LO_32(C,A,B) \
+ C = _mm256_unpacklo_epi32(A,B);
+
+// C = unpack_hi32(A,B)
+#define VEC256_UNPACK_HI_32(C,A,B) \
+ C = _mm256_unpackhi_epi32(A,B);
+
+// C = unpack_lo32(A,B)
+#define VEC256_UNPACK_LO_64(C,A,B) \
+ C = _mm256_unpacklo_epi64(A,B);
+
+// C = unpack_hi32(A,B)
+#define VEC256_UNPACK_HI_64(C,A,B) \
+ C = _mm256_unpackhi_epi64(A,B);
+
+// C = unpack_lo128(A,B)
+#define VEC256_UNPACK_LO_128(C,A,B) \
+ C = _mm256_permute2x128_si256(A,B,32);
+
+// C = unpack_hi128(A,B)
+#define VEC256_UNPACK_HI_128(C,A,B) \
+ C = _mm256_permute2x128_si256(A,B,49);
+
+// C= blend_epi32(A,B,X)
+#define VEC256_BLEND_32(C,A,B,X) \
+ C = _mm256_blend_epi32(A,B,X);
+
+// C =shuffle_32(A,X)
+#define VEC256_SHUFFLE_32(C,A,X) \
+ C = _mm256_shuffle_epi32(A,X);
+
+// C=X[0,1]
+#define VEC256_LOAD(C,X) \
+ C=_mm256_load_si256(reinterpret_cast<const __m256i*>(X));
+#define VEC256_LOADU(C,X) \
+ C=_mm256_loadu_si256(reinterpret_cast<const __m256i*>(X));
+// C[0,1]=X
+#define VEC256_STORE(C,X) \
+ _mm256_store_si256(reinterpret_cast<__m256i*>(C),X);
+#define VEC256_STOREU(C,X) \
+ _mm256_storeu_si256(reinterpret_cast<__m256i*>(C),X);
+#define VEC256_SET_64(C,X) \
+ C=_mm256_set1_epi64x(X);
+#define VEC256_SET_32(C,X) \
+ C=_mm256_set1_epi32(X);
+
+#define VEC256_PRINT_32(X) \
+ {uint32_t T[8]; VEC256_STORE(T,X);std::cout<<"[ "<<T[0]<<","<<T[1]<<","<<T[2]<<","<<T[3]<<","<<T[4]<<","<<T[5]<<","<<T[6]<<","<<T[7]<<"]";}
+
+#endif
+
+/* 128 bits CODE HERE */
+
+// define 128 bits simd vector type
+typedef __m128i _vect128_t;
+
+
+// C=C+AB using X as temporary
+#define VEC128_MADD_32(C,A,B,X) \
+ X= _mm_mul_epi32(A,B); C= _mm_add_epi64(C,X);
+
+// C=A*B (2 op 32x32->64)
+#define VEC128_MUL_32(C,A,B) \
+ C= _mm_mul_epu32(A,B);
+
+// C=A*B (4 op 32x32->32 low product)
+#define VEC128_MUL_LO_32(C,A,B) \
+ C= _mm_mullo_epi32(A,B);
+
+// C=A+B
+#define VEC128_ADD_32(C,A,B) \
+ C= _mm_add_epi32(A,B);
+
+// C=A+B
+#define VEC128_ADD_64(C,A,B) \
+ C= _mm_add_epi64(A,B);
+
+// A+=B
+#define VEC128_ADDIN_64(A,B) \
+ A= _mm_add_epi64(A,B);
+
+// C=A-B
+#define VEC128_SUB_32(C,A,B) \
+ C= _mm_sub_epi32(A,B);
+
+// C = A mod P using T as temporary (A must lie in [0 2P[ )
+#define VEC128_MOD_P(C,A,P,T) \
+ T=_mm_cmplt_epi32(A,P); \
+ C=_mm_sub_epi32(A,_mm_andnot_si128(T,P));
+// Rk: __m128i _mm_cmpgt_epi64 (__m128d a, __m128d b) // compare a>b si vrai renvoi 0xFFFFFFFFFFFFFFFF
+
+// C = A >> X
+#define VEC128_RSHIFT_64(C,A,X) \
+ C=_mm_srli_epi64 (A,X);
+
+// C = A << X
+#define VEC128_LSHIFT_64(C,A,X) \
+ C=_mm_slli_epi64 (A,X);
+
+// C = A || X
+#define VEC128_OR(C,A,X) \
+ C=_mm_or_si128(A,X);
+
+// C = unpack_lo32(A,B)
+#define VEC128_UNPACK_LO_32(C,A,B) \
+ C = _mm_unpacklo_epi32(A,B);
+
+// C = unpack_hi32(A,B)
+#define VEC128_UNPACK_HI_32(C,A,B) \
+ C = _mm_unpackhi_epi32(A,B);
+
+// C = unpack_lo32(A,B)
+#define VEC128_UNPACK_LO_64(C,A,B) \
+ C = _mm_unpacklo_epi64(A,B);
+
+// C = unpack_hi32(A,B)
+#define VEC128_UNPACK_HI_64(C,A,B) \
+ C = _mm_unpackhi_epi64(A,B);
+
+// C =shuffle_32(A,X)
+#define VEC128_SHUFFLE_32(C,A,X) \
+ C = _mm_shuffle_epi32(A,X);
+
+// C=X[0,1]
+#define VEC128_LOAD(C,X) \
+ C=_mm_load_si128(reinterpret_cast<const __m128i*>(X));
+#define VEC128_LOADU(C,X) \
+ C=_mm_loadu_si128(reinterpret_cast<const __m128i*>(X));
+// C[0,1]=X
+#define VEC128_STORE(C,X) \
+ _mm_store_si128(reinterpret_cast<__m128i*>(C),X);
+#define VEC128_STOREU(C,X) \
+ _mm_storeu_si128(reinterpret_cast<__m128i*>(C),X);
+#define VEC128_SET_64(C,X) \
+ C=_mm_set1_epi64x(X);
+#define VEC128_SET_32(C,X) \
+ C=_mm_set1_epi32(X);
+
+#define VEC128_PRINT_32(X) \
+ { uint32_t T[4];VEC128_STORE(T,X); cout<<"[ "<<T[0]<<","<<T[1]<<","<<T[2]<<","<<T[3]<<"]";}
+
+// END OF 128 BITS CODE
+
+
+// C=A*B (4 op 32x32->32 high product) // A and with a mask can be used to remove the last two shift with C
+#define VEC128_MUL_HI_32(C,A,B,A1,B1) \
+ VEC128_MUL_32(C,A,B); \
+ VEC128_RSHIFT_64(A1,A,32); \
+ VEC128_RSHIFT_64(B1,B,32); \
+ VEC128_MUL_32(A1,A1,B1); \
+ VEC128_RSHIFT_64(C,C,32); \
+ VEC128_RSHIFT_64(A1,A1,32); \
+ VEC128_LSHIFT_64(A1,A1,32); \
+ VEC128_OR(C,C,A1);
+#define VEC256_MUL_HI_32(C,A,B,A1,B1) \
+ VEC256_MUL_32(C,A,B); \
+ VEC256_RSHIFT_64(A1,A,32); \
+ VEC256_RSHIFT_64(B1,B,32); \
+ VEC256_MUL_32(A1,A1,B1); \
+ VEC256_RSHIFT_64(C,C,32); \
+ VEC256_RSHIFT_64(A1,A1,32); \
+ VEC256_LSHIFT_64(A1,A1,32); \
+ VEC256_OR(C,C,A1);
+
+// C= A+B mod P using T as temporary
+#define VEC128_ADD_MOD(C,A,B,P,T) \
+ VEC128_ADD_32(C,A,B); VEC128_MOD_P(C,C,P,T);
+#define VEC256_ADD_MOD(C,A,B,P,T) \
+ VEC256_ADD_32(C,A,B); VEC256_MOD_P(C,C,P,T);
+
+// C= A*X mod P using T1, T2 as temporaries
+#define VEC128_MUL_MOD(C,A,X,P,Xp,Q,T1,T2) \
+ VEC128_MUL_HI_32(Q,A,Xp,T1,T2); \
+ VEC128_MUL_LO_32(C,A,X); \
+ VEC128_MUL_LO_32(T1,Q,P); \
+ VEC128_SUB_32(C,C,T1);
+#define VEC256_MUL_MOD(C,A,X,P,Xp,Q,T1,T2) \
+ VEC256_MUL_HI_32(Q,A,Xp,T1,T2); \
+ VEC256_MUL_LO_32(C,A,X); \
+ VEC256_MUL_LO_32(T1,Q,P); \
+ VEC256_SUB_32(C,C,T1);
+
+
+
+#endif // end of file
diff --git a/linbox/algorithms/rational-cra-early-multip.h b/linbox/algorithms/rational-cra-early-multip.h
index 8ba88c6..5634350 100644
--- a/linbox/algorithms/rational-cra-early-multip.h
+++ b/linbox/algorithms/rational-cra-early-multip.h
@@ -25,7 +25,7 @@
#ifndef __LINBOX_rational_early_multip_cra_H
#define __LINBOX_rational_early_multip_cra_H
-#include "linbox/field/PID-integer.h"
+#include "givaro/zring.h"
#include "linbox/algorithms/rational-cra-early-single.h"
#include "linbox/algorithms/rational-cra-full-multip.h"
@@ -42,6 +42,17 @@ namespace LinBox
// of the elements to be reconstructed
std::vector< unsigned long > randv;
+ void initialize (const Integer& D, const Integer& e) {return;}; // DON'T TOUCH
+ void progress (const Integer & D, const Integer & e) {return;};
+ void initialize (const Domain& D, const DomainElement& e){return;};
+ Integer& result(Integer& d){return d;};
+ void progress (const Domain& D, const DomainElement& e){return;};
+
+
+
+
+
+
public:
@@ -49,7 +60,7 @@ namespace LinBox
EarlySingleRatCRA<Domain>(EARLY), FullMultipRatCRA<Domain>()
{ }
-
+ //!init
template<template<class, class> class Vect, template <class> class Alloc>
void initialize (const Domain& D, const Vect <DomainElement, Alloc<DomainElement> >& e)
{
@@ -70,7 +81,26 @@ namespace LinBox
FullMultipRatCRA<Domain>::initialize(D, e);
}
+ void initialize (const Domain& D, const BlasVector<Domain>& e)
+ {
+ // Random coefficients for a linear combination
+ // of the elements to be reconstructed
+ srand48(BaseTimer::seed());
+ randv. resize ( e.size() );
+ for ( std::vector<unsigned long>::iterator int_p = randv. begin();
+ int_p != randv. end(); ++ int_p)
+ *int_p = ((unsigned long)lrand48()) % 20000;
+
+ DomainElement z;
+ // Could be much faster
+ // - do not compute twice the product of moduli
+ // - reconstruct one element of e until Early Termination,
+ // then only, try a random linear combination.
+ EarlySingleRatCRA<Domain>::initialize(D,dot(z, D, e, randv) );
+ FullMultipRatCRA<Domain>::initialize(D, e);
+ }
+ //!progress
template<template<class,class> class Vect, template <class> class Alloc>
void progress (const Domain& D, const Vect<DomainElement, Alloc<DomainElement> >& e)
{
@@ -83,12 +113,30 @@ namespace LinBox
FullMultipRatCRA<Domain>::progress(D, e);
}
+ void progress (const Domain& D, const BlasVector<Domain>& e)
+ {
+ DomainElement z;
+ // Could be much faster
+ // - do not compute twice the product of moduli
+ // - reconstruct one element of e until Early Termination,
+ // then only, try a random linear combination.
+ EarlySingleRatCRA<Domain>::progress(D, dot(z, D, e, randv));
+ FullMultipRatCRA<Domain>::progress(D, e);
+ }
+
+ //!result
template<template<class, class> class Vect, template <class> class Alloc>
Vect<Integer, Alloc<Integer> >& result(Vect<Integer, Alloc<Integer> >& num, Integer& den)
{
return FullMultipRatCRA<Domain>::result(num, den);
}
+ BlasVector<Givaro::ZRing<Integer> >& result(BlasVector<Givaro::ZRing<Integer>>& num, Givaro::ZRing<Integer>::Element& den)
+ {
+ return FullMultipRatCRA<Domain>::result(num, den);
+ }
+
+ //!tools
bool terminated()
{
return EarlySingleRatCRA<Domain>::terminated();
@@ -106,7 +154,7 @@ namespace LinBox
const Vect1<DomainElement, Alloc<DomainElement> >& v1, const Vect2& v2)
{
- D.init(z,0); DomainElement tmp;
+ D.assign(z,D.zero); DomainElement tmp;
typename Vect1<DomainElement, Alloc<DomainElement> >::const_iterator v1_p;
typename Vect2::const_iterator v2_p;
for (v1_p = v1. begin(), v2_p = v2. begin();
@@ -119,17 +167,36 @@ namespace LinBox
#endif
return z;
}
+
+ template <class Vect2>
+ DomainElement& dot (DomainElement& z, const Domain& D,
+ const BlasVector<Domain >& v1, const Vect2& v2)
+ {
+
+ D.assign(z,D.zero); DomainElement tmp;
+ typename BlasVector<Domain >::const_iterator v1_p;
+ typename Vect2::const_iterator v2_p;
+ for (v1_p = v1. begin(), v2_p = v2. begin();
+ v1_p != v1. end();
+ ++ v1_p, ++ v2_p)
+ D.axpyin(z, (*v1_p), D.init(tmp, (*v2_p)));
+#if 0
+ commentator().report(Commentator::LEVEL_ALWAYS, INTERNAL_DESCRIPTION) << "v: " << v2 << std::endl;
+ commentator().report(Commentator::LEVEL_ALWAYS, INTERNAL_DESCRIPTION) << "z: " << z << std::endl;
+#endif
+ return z;
+ }
+
};
}
#endif //__LINBOX_rational_early_multip_cra_H
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
// Local Variables:
// mode: C++
// tab-width: 8
// indent-tabs-mode: nil
// c-basic-offset: 8
// End:
-
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/algorithms/rational-cra-early-single.h b/linbox/algorithms/rational-cra-early-single.h
index 25e838a..4e09b94 100644
--- a/linbox/algorithms/rational-cra-early-single.h
+++ b/linbox/algorithms/rational-cra-early-single.h
@@ -25,7 +25,7 @@
#ifndef __LINBOX_rational_early_single_cra_H
#define __LINBOX_rational_early_single_cra_H
-#include "linbox/field/PID-integer.h"
+#include "givaro/zring.h"
#include "linbox/algorithms/cra-early-single.h"
namespace LinBox
@@ -37,7 +37,7 @@ namespace LinBox
typedef EarlySingleCRA<Domain> Father_t;
typedef typename Father_t::DomainElement DomainElement;
typedef EarlySingleRatCRA<Domain> Self_t;
- PID_integer _ZZ;
+ Givaro::ZRing<Integer> _ZZ;
Integer Numer0;
Integer Denom0;
@@ -140,14 +140,13 @@ namespace LinBox
};
}
-#endif
+#endif // __LINBOX_rational_early_single_cra_H
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
// Local Variables:
// mode: C++
// tab-width: 8
// indent-tabs-mode: nil
// c-basic-offset: 8
// End:
-
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/algorithms/rational-cra-full-multip.h b/linbox/algorithms/rational-cra-full-multip.h
index 89ee540..3a66721 100644
--- a/linbox/algorithms/rational-cra-full-multip.h
+++ b/linbox/algorithms/rational-cra-full-multip.h
@@ -25,7 +25,7 @@
#ifndef __LINBOX_rational_full_multip_cra_H
#define __LINBOX_rational_full_multip_cra_H
-#include "linbox/field/PID-integer.h"
+#include "givaro/zring.h"
#include "linbox/algorithms/cra-full-multip.h"
namespace LinBox
@@ -48,7 +48,7 @@ namespace LinBox
typedef FullMultipCRA<Domain> Father_t;
typedef typename Father_t::DomainElement DomainElement;
typedef FullMultipRatCRA<Domain> Self_t;
- PID_integer _ZZ;
+ Givaro::ZRing<Integer> _ZZ;
public:
using Father_t::RadixSizes_;
@@ -130,6 +130,72 @@ namespace LinBox
return num;
}
+ BlasVector<Givaro::ZRing<Integer> >& result (BlasVector<Givaro::ZRing<Integer>> &num, Integer& den)
+ {
+ num.resize( (Father_t::RadixResidues_.front()).size() );
+ std::vector< LazyProduct >::iterator _mod_it = Father_t::RadixPrimeProd_.begin();
+ std::vector< BlasVector<Givaro::ZRing<Integer>> >::iterator _tab_it = Father_t::RadixResidues_.begin();
+ std::vector< bool >::iterator _occ_it = Father_t::RadixOccupancy_.begin();
+ LazyProduct Product;
+ for( ; _occ_it != Father_t::RadixOccupancy_.end() ; ++_mod_it, ++_tab_it, ++_occ_it) {
+ if (*_occ_it) {
+ Product = *_mod_it;
+ BlasVector<Givaro::ZRing<Integer>>::iterator t0_it = num.begin();
+ BlasVector<Givaro::ZRing<Integer>>::iterator t_it = _tab_it->begin();
+ if (++_occ_it == Father_t::RadixOccupancy_.end()) {
+ den = 1;
+ Integer s, nd; _ZZ.sqrt(s, _mod_it->operator()());
+ for( ; t0_it != num.end(); ++t0_it, ++t_it) {
+ iterativeratrecon(*t0_it = *t_it, nd, den, _mod_it->operator()(), s);
+ if (nd > 1) {
+ BlasVector<Givaro::ZRing<Integer>>::iterator t02 = num.begin();
+ for( ; t02 != t0_it ; ++t02)
+ *t02 *= nd;
+ den *= nd;
+ }
+ }
+ return num;
+ }
+ else {
+ for( ; t0_it != num.end(); ++t0_it, ++t_it)
+ *t0_it = *t_it;
+ ++_mod_it; ++_tab_it;
+ break;
+ }
+ }
+ }
+ for( ; _occ_it != Father_t::RadixOccupancy_.end() ; ++_mod_it, ++_tab_it, ++_occ_it) {
+ if (*_occ_it) {
+ BlasVector<Givaro::ZRing<Integer> >::iterator t0_it = num.begin();
+ BlasVector<Givaro::ZRing<Integer> >::const_iterator t_it = _tab_it->begin();
+ Integer invprod;
+ this->precomputeInvProd(invprod, Product(), _mod_it->operator()() );
+ for( ; t0_it != num.end(); ++t0_it, ++t_it)
+ this->smallbigreconstruct(*t0_it, *t_it, invprod );
+ Product.mulin(*_mod_it);
+
+ // Moding out and normalization
+ for(t0_it = num.begin();t0_it != num.end(); ++t0_it) {
+ *t0_it %= Product();
+ Integer tmp(*t0_it);
+ this->normalize(*t0_it, tmp, Product());
+ }
+ }
+ }
+ den = 1;
+ Integer s, nd; _ZZ.sqrt(s, Product.operator()());
+ BlasVector<Givaro::ZRing<Integer> >::iterator t0_it = num.begin();
+ for( ; t0_it != num.end(); ++t0_it) {
+ iterativeratrecon(*t0_it, nd, den, Product.operator()(), s);
+ if (nd > 1) {
+ BlasVector<Givaro::ZRing<Integer> >::iterator t02 = num.begin();
+ for( ; t02 != t0_it ; ++t02)
+ *t02 *= nd;
+ den *= nd;
+ }
+ }
+ return num;
+ }
protected:
Integer& iterativeratrecon(Integer& u1, Integer& new_den, const Integer& old_den, const Integer& m1, const Integer& s)
@@ -143,11 +209,10 @@ namespace LinBox
#endif //__LINBOX_rational_full_multip_cra_H
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
// Local Variables:
// mode: C++
// tab-width: 8
// indent-tabs-mode: nil
// c-basic-offset: 8
// End:
-
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/algorithms/rational-cra.h b/linbox/algorithms/rational-cra.h
index 3442235..67863ba 100644
--- a/linbox/algorithms/rational-cra.h
+++ b/linbox/algorithms/rational-cra.h
@@ -26,7 +26,7 @@
#ifndef __LINBOX_rational_cra_H
#define __LINBOX_rational_cra_H
-#include "linbox/field/PID-integer.h"
+#include "givaro/zring.h"
namespace LinBox
{
@@ -98,6 +98,7 @@ namespace LinBox
return Builder_.result(num, den);
}
+#if 0 /* marche pas si on remplace le premier Interger par Givaro::ZRing<Integer> :-( spécialise pour BlasVector*/
template<template <class, class> class Vect, template <class> class Alloc, class Function, class RandPrimeIterator>
Vect<Integer, Alloc<Integer> > & operator() (Vect<Integer, Alloc<Integer> >& num, Integer& den, Function& Iteration, RandPrimeIterator& genprime)
{
@@ -115,16 +116,35 @@ namespace LinBox
}
return Builder_.result(num, den);
}
+#endif
+
+ template<class Function, class RandPrimeIterator>
+ BlasVector<Givaro::ZRing<Integer> > & operator() ( BlasVector<Givaro::ZRing<Integer> >& num, Integer& den, Function& Iteration, RandPrimeIterator& genprime)
+ {
+ ++genprime;
+ {
+ Domain D(*genprime);
+ BlasVector<Domain > r(D);
+ Builder_.initialize( D, Iteration(r, D) );
+ }
+ while( ! Builder_.terminated() ) {
+ ++genprime; while(Builder_.noncoprime(*genprime) ) ++genprime;
+ Domain D(*genprime);
+ BlasVector<Domain > r(D);
+ Builder_.progress( D, Iteration(r, D) );
+ }
+ return Builder_.result(num, den);
+ }
+
};
}
#endif //__LINBOX_rational_cra_H
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
// Local Variables:
// mode: C++
// tab-width: 8
// indent-tabs-mode: nil
// c-basic-offset: 8
// End:
-
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/algorithms/rational-cra2.h b/linbox/algorithms/rational-cra2.h
index 89f745c..d04657d 100644
--- a/linbox/algorithms/rational-cra2.h
+++ b/linbox/algorithms/rational-cra2.h
@@ -28,8 +28,8 @@
#define CRATIMING
-#include "linbox/field/PID-integer.h"
-
+#include "givaro/zring.h"
+#include "linbox/vector/blas-vector.h"
#include "linbox/algorithms/rational-reconstruction-base.h"
#include "linbox/algorithms/classic-rational-reconstruction.h"
@@ -56,10 +56,10 @@ namespace LinBox
* Either by Early Termination see [Dumas, Saunder, Villard, JSC 32 (1/2), pp 71-99, 2001],
* Or via a bound on the size of the Integers.
*/
- //typedef PID_Integer Integers;
+ //typedef Givaro::ZRing<Integer> Integers;
//typedef Integers::Element Integer;
- template<class RatCRABase, class RatRecon = RReconstruction<PID_integer, ClassicMaxQRationalReconstruction<PID_integer> > >
+ template<class RatCRABase, class RatRecon = RReconstruction<Givaro::ZRing<Integer>, ClassicMaxQRationalReconstruction<Givaro::ZRing<Integer> > > >
struct RationalRemainder2 {
@@ -105,7 +105,8 @@ namespace LinBox
\param[out] den the rational denominator
*/
template<class Function, class RandPrimeIterator>
- Integer & operator() (Integer& num, Integer& den, Function& Iteration, RandPrimeIterator& genprime)
+ Integer & operator() (Integer& num, Integer& den
+ , Function& Iteration, RandPrimeIterator& genprime)
{
{
++genprime;
@@ -136,7 +137,7 @@ namespace LinBox
Domain D(*genprime);
DomainElement r; D.init(r);
Builder_.progress( D, Iteration(r, D) );
- if (RR_.scheduled(IterCounter-1)) {
+ if (RR_.scheduled((size_t)IterCounter-1)) {
Integer Mint ; Builder_.getModulus(Mint);
Integer rint ; Builder_.getResidue(rint);
if (RR_.reconstructRational(num,den,rint,Mint)) {
@@ -163,7 +164,8 @@ namespace LinBox
*/
template<class Function, class RandPrimeIterator>
- bool operator() (const int k, Integer& num, Integer& den, Function& Iteration, RandPrimeIterator& genprime)
+ bool operator() (const int k, Integer& num, Integer& den
+ , Function& Iteration, RandPrimeIterator& genprime)
{
if ((IterCounter==0) && (k != 0)) {
@@ -231,7 +233,8 @@ namespace LinBox
}
template<template <class, class> class Vect, template<class> class Alloc, class Function, class RandPrimeIterator>
- Vect<Integer, Alloc<Integer> > & operator() (Vect<Integer, Alloc<Integer> >& num, Integer& den, Function& Iteration, RandPrimeIterator& genprime)
+ Vect<Integer, Alloc<Integer> > & operator() (Vect<Integer, Alloc<Integer> >& num, Integer& den
+ , Function& Iteration, RandPrimeIterator& genprime)
{
{
++IterCounter;
@@ -266,7 +269,7 @@ namespace LinBox
Vect<DomainElement, Alloc<DomainElement> > r;
Builder_.progress( D, Iteration(r, D) );
- if (RR_.scheduled(IterCounter-1) || Builder_.terminated()) {
+ if (RR_.scheduled((size_t)IterCounter-1) || Builder_.terminated()) {
Integer Mint ; Builder_.getModulus(Mint);
if ( Builder_.terminated() ) {//early or full termination occurred, check reconstruction of the whole vector
//early or full termination
@@ -275,7 +278,7 @@ namespace LinBox
if (RR_.reconstructRational(num,den,r_v,Mint) ) {
Vect<Integer, Alloc<Integer> > vnum(num),vden(m_in.size(),den);
for (int i=0; i < (int)vnum.size(); ++ i) {
- if (vnum[i]==0) vnum[i] = 1; // no prec
+ if (vnum[(size_t)i]==0) vnum[(size_t)i] = 1; // no prec
}
Builder_.productin(vnum, f_in);
Builder_.productin(vden,m_in);
@@ -322,12 +325,108 @@ namespace LinBox
return num;
}
+ template<class Function, class RandPrimeIterator>
+ BlasVector<Givaro::ZRing<Integer> > & operator() (BlasVector<Givaro::ZRing<Integer> >& num, Integer& den
+ , Function& Iteration, RandPrimeIterator& genprime)
+ {
+ {
+ ++IterCounter;
+ ++genprime;
+ Domain D(*genprime);
+ BlasVector<Domain> r(D);
+ Builder_.initialize( D, Iteration(r, D) );
+ }
+
+ int coprime =0;
+ int maxnoncoprime = 1000;
+
+ Givaro::ZRing<Integer> Z;
+ BlasVector<Givaro::ZRing<Integer> > f_in(Z),m_in(Z);
+ Builder_.getPreconditioner(f_in,m_in);
+
+ //while( ! Builder_.terminated() )
+ while (1) { // in case of terminated() - checks for RR of the whole vector
+ //++IterCounter;
+ ++genprime;
+ while(Builder_.noncoprime(*genprime) ) {
+ ++genprime;
+ ++coprime;
+ if (coprime > maxnoncoprime) {
+ std::cout << "you are running out of primes. " << maxnoncoprime << " coprime primes found";
+ return num;
+ }
+ }
+ coprime = 0;
+
+
+ Domain D(*genprime);
+ BlasVector<Domain > r(D);
+ Builder_.progress( D, Iteration(r, D) );
+
+ if (RR_.scheduled((size_t)IterCounter-1) || Builder_.terminated()) {
+ Integer Mint ; Builder_.getModulus(Mint);
+ if ( Builder_.terminated() ) {//early or full termination occurred, check reconstruction of the whole vector
+ //early or full termination
+ BlasVector<Givaro::ZRing<Integer> > r_v(Z) ;
+ Builder_.getResidue(r_v);
+ if (RR_.reconstructRational(num,den,r_v,Mint) ) {
+ BlasVector<Givaro::ZRing<Integer> > vnum(num),vden(Z,m_in.size(),den);
+ for (int i=0; i < (int)vnum.size(); ++ i) {
+ if (vnum[(size_t)i]==0) vnum[(size_t)i] = 1; // no prec
+ }
+ Builder_.productin(vnum, f_in);
+ Builder_.productin(vden,m_in);
+ Builder_.changePreconditioner(vnum,vden) ;
+ int k ;
+ Builder_.getThreshold(k);
+ if (this->operator()(k,num,den,Iteration,genprime)) {
+ break;
+ }
+ else { // back to original preconditioners
+ Builder_.changePreconditioner(f_in,m_in);//not optimal, may restore results
+ Builder_.changeVector();
+ }
+ }
+ else { //back to original preconditioners
+ Builder_.changePreconditioner(f_in,m_in);
+ Builder_.changeVector();
+ }
+ }
+ else {
+ //heuristics: reconstruction of vector
+ Integer rint ;
+ Builder_.getResidue(rint);
+ Integer n,d;
+ if (RR_.reconstructRational(n,d,rint,Mint)) {
+ BlasVector<Givaro::ZRing<Integer> > vden(Z,m_in.size(),d);
+ Builder_.productin(vden,m_in);
+ Builder_.changePreconditioner(f_in,vden);
+ int k; Builder_.getThreshold(k);
+ if (this->operator()(k,num,den,Iteration,genprime)) { //prob. certify result of RR
+ m_in = vden;
+ }
+ else { //false result of RR
+ Builder_.changePreconditioner(f_in,m_in);//not optimal, may restore results
+ }
+
+ }
+ }
+ }
+ ++IterCounter;
+ }
+ Builder_.result(num,den);
+
+ return num;
+ }
+
+
/*
* progress for k>=0 iterations
* run until terminated if k <0
*/
template<template <class, class> class Vect, template<class> class Alloc, class Function, class RandPrimeIterator>
- bool operator() (const int k, Vect<Integer, Alloc<Integer> >& num, Integer& den, Function& Iteration, RandPrimeIterator& genprime)
+ bool operator() (const int k, Vect<Integer, Alloc<Integer> >& num, Integer& den
+ , Function& Iteration, RandPrimeIterator& genprime)
{
if ((IterCounter==0) && (k != 0)) {
++IterCounter;
@@ -408,6 +507,93 @@ namespace LinBox
else return false;
}
+
+ // temp. spec. for BlasVector
+ template<class Function, class RandPrimeIterator>
+ bool operator() (const int k, BlasVector<Givaro::ZRing<Integer> >& num
+ , Integer& den, Function& Iteration, RandPrimeIterator& genprime)
+ {
+ if ((IterCounter==0) && (k != 0)) {
+ ++IterCounter;
+ ++genprime;
+ Domain D(*genprime);
+ BlasVector<Domain> r(D);
+ Builder_.initialize( D, Iteration(r, D) );
+ }
+ int coprime =0;
+ int maxnoncoprime = 1000;
+ Givaro::ZRing<Integer> Z;
+
+ BlasVector<Givaro::ZRing<Integer> > f_in(Z),m_in(Z);
+ Builder_.getPreconditioner(f_in,m_in);
+ for (int i=0; ((k<0) && Builder_.terminated()) || (i <k); ++i ) {
+ //++IterCounter;
+ ++genprime;
+ while(Builder_.noncoprime(*genprime) ) {
+ ++genprime;
+ ++coprime;
+ if (coprime > maxnoncoprime) {
+ std::cout << "you are running out of primes. " << maxnoncoprime << " coprime primes found";
+ return false;
+ //return Builder_.result(res);
+ }
+ }
+ coprime = 0;
+ Domain D(*genprime);
+ BlasVector<Domain > r(D);
+ Builder_.progress( D, Iteration(r, D) );
+ //if (RR_.scheduled(IterCounter-1))
+ ++IterCounter;
+
+#if 0
+ Integer M ; Builder_.getModulus(M);
+ if ( Builder_.terminated() ) {
+ BlasVector<Givaro::ZRing<Integer> > r ; Builder_.getResidue(r);
+ if (RR_.reconstructRational(num,den,r,M) ) {
+ BlasVector<Givaro::ZRing<Integer> > vnum(num),vden(m_in.size(),den);
+ Builder_.productin(vnum, f_in); Builder_.productin(vden,m_in);
+ if (Builder_.changePreconditioner(vnum,vden)) break;
+ else Builder_.changePreconditioner(f_in,m_in);//not optimal, may restore results
+ }
+ }
+ else {
+ Integer r ; Builder_.getResidue(r);
+ Integer n,d;
+ if (RR_.reconstructRational(n,d,r,M)) {
+ BlasVector<Givaro::ZRing<Integer> > vden(m_in.size(),d);
+ Builder_.productin(vden,m_in);
+ if (Builder_.changePreconditioner(f_in,vden)) break;
+ else Builder_.changePreconditioner(f_in,m_in);//not optimal, may restore results
+ }
+ }
+#endif
+ }
+ if (Builder_.terminated()) {
+ //BlasVector<Givaro::ZRing<Integer> > p_mul, p_div,res, g;
+ //Builder_.getPreconditioner(p_div,p_mul);
+ Builder_.result(num,den);
+#if 0
+ num = Builder_productin(res,p_div);
+ typename BlasVector<Givaro::ZRing<Integer> >::iterator itnum,itden,ittmp;
+ den = 1; Integer denold = 1;
+ for (itnum = num.begin(), itden=p_mul.begin(); itnum != num.end(); ++itnum,++itden) {
+ lcm(den,den,*itden);
+ if (denold != den) {
+ Integer h = den/denold;
+ ittmp = num.begin();
+ for (;itnum != itnum; ++ittmp) *ittmp *= h;
+ }
+ denold = den;
+ }
+ den = p_mul;
+#endif
+
+ return true;
+ }
+ else return false;
+ }
+
+
#ifdef CRATIMING
std::ostream& reportTimes(std::ostream& os)
{
@@ -453,11 +639,10 @@ namespace LinBox
#endif // __LINBOX_rational2_cra_H
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
// Local Variables:
// mode: C++
// tab-width: 8
// indent-tabs-mode: nil
// c-basic-offset: 8
// End:
-
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/algorithms/rational-reconstruction-base.h b/linbox/algorithms/rational-reconstruction-base.h
index da19fd4..882d662 100644
--- a/linbox/algorithms/rational-reconstruction-base.h
+++ b/linbox/algorithms/rational-reconstruction-base.h
@@ -29,9 +29,9 @@
#include <iostream>
#include <deque>
-#include <math.h>
+#include <cmath>
-#include "linbox/field/PID-integer.h"
+#include <givaro/zring.h>
namespace LinBox
{
@@ -40,7 +40,7 @@ namespace LinBox
INCREMENTAL, QUADRATIC, GEOMETRIC, CERTIFIED
};
- template <class Ring=PID_integer>
+ template <class Ring=Givaro::ZRing<Integer> >
class RReconstructionBase;
/*
@@ -48,12 +48,12 @@ namespace LinBox
* together with method reconstructRational(a,b,x,m)
* implements scheduling INCREMENTAL, QUADRATIC, GEOMETRIC, CERTIFIED
* implements vector reconstruction
- * _intRing is the integer ring used for reconstruction, default PID_integer
+ * _intRing is the integer ring used for reconstruction, default Givaro::ZRing<Integer>
* _RR is the rational reconstruction method, see fast-ratioinal-reconstruction.h, classic-rational-reconstruction.h
* THRESHOLD_ - treshold for INCREMENTAL schedule
* rbound_ - min number of iterations for all schedule
*/
- template <class Ring=PID_integer, class RRBase=RReconstructionBase<PID_integer> >
+ template <class Ring=Givaro::ZRing<Integer>, class RRBase=RReconstructionBase<Givaro::ZRing<Integer> > >
struct RReconstruction {
protected:
Ring _intRing;
@@ -70,7 +70,7 @@ namespace LinBox
{
RecCounter =0;
if (_meth == QUADRATIC) {
- RecCounter = (int)sqrt((double)rbound_);//RecCounter^2 < rbound_ <=(RecCounter+1)^2
+ RecCounter = (size_t)sqrt((double)rbound_);//RecCounter^2 < rbound_ <=(RecCounter+1)^2
}
else if (_meth == GEOMETRIC) {
RecCounter = (size_t) log((double)rbound_) ;//2^RecCounter < rbound_ <=2^(RecCounter+1)
@@ -163,7 +163,7 @@ namespace LinBox
else {//if (inc == -1)
int i = (int)x.size()-1;
for (; i >=0; --i ) {
- Element x_in(x[i]);
+ Element x_in(x[(size_t)i]);
x_in *=old_den;
if (x_in <0) {
if ((-(x_in)) > m) x_in %= m;
@@ -172,7 +172,7 @@ namespace LinBox
else {
if (x_in > m) x_in %= m;
}
- if (x_in > 0) res = res && _RR.reconstructRational(a[i], new_den,x_in,m);
+ if (x_in > 0) res = res && _RR.reconstructRational(a[(size_t)i], new_den,x_in,m);
else {
res = true;
*it_a = 0;
@@ -180,10 +180,10 @@ namespace LinBox
}
if (!res) return res;
else {
- //std::cout << a[i] << "/" << b*new_den << "\n";
+ //std::cout << a[(size_t)i] << "/" << b*new_den << "\n";
if (new_den > 1) {
for (int j = (int)a.size()-1; j > i ; --j) {
- a[j] *=new_den;
+ a[(size_t)j] *=new_den;
}
b *= new_den;
old_den *= new_den;
@@ -314,12 +314,12 @@ namespace LinBox
};
/*
- * This is the default RReconstruction, using PID_Integer and ClassicRationalReconstruction of Wang
+ * This is the default RReconstruction, using ZRing<Integer> and ClassicRationalReconstruction of Wang
*/
template <>
- class RReconstructionBase<PID_integer> {
+ class RReconstructionBase<Givaro::ZRing<Integer> > {
public:
- typedef PID_integer Ring;
+ typedef Givaro::ZRing<Integer> Ring;
Ring _intRing;
mutable OpCounter C;
typedef Ring::Element Element;
diff --git a/linbox/algorithms/rational-reconstruction.h b/linbox/algorithms/rational-reconstruction.h
index 97c3a76..a14c2f0 100644
--- a/linbox/algorithms/rational-reconstruction.h
+++ b/linbox/algorithms/rational-reconstruction.h
@@ -55,6 +55,33 @@
#endif
+namespace Givaro
+{
+ inline void reconstructRational (Integer& a, Integer& b, const Integer& x, const Integer& m, const Integer& bound)
+ {
+ Rational rr(x,m,bound);
+ a = rr.nume();
+ b = rr.deno();
+ }
+
+ inline void reconstructRational (Integer& a, Integer& b, const Integer& x, const Integer& m)
+ {
+ reconstructRational(a,b, x, m, Givaro::sqrt(m));
+ }
+
+ inline bool reconstructRational (Integer& a, Integer& b,
+ const Integer& x, const Integer& m,
+ const Integer& a_bound, const Integer& b_bound)
+ {
+ Integer bound = x/b_bound;
+ // if (bound>a_bound) std::cerr << "a_bound: " << a_bound << ", x/b_bound: " << bound << std::endl;
+
+ reconstructRational(a,b,x,m, (bound>a_bound?bound:a_bound));
+
+ return b<= b_bound;
+ }
+
+}
namespace LinBox
@@ -64,6 +91,9 @@ namespace LinBox
return ( (m.bitsize()+7 )/8) ;
}
+
+
+
/*! \brief Limited doc so far.
* Used, for instance, after LiftingContainer.
*/
@@ -169,7 +199,7 @@ namespace LinBox
{
typename InVect1::const_iterator v1_p;
typename InVect2::const_iterator v2_p;
- _r. init (d, 0);
+ _r. assign(d, _r.zero);
for (v1_p = v1. begin(), v2_p = v2. begin(); v1_p != v1. end(); ++ v1_p, ++ v2_p)
_r. axpyin (d, *v1_p, *v2_p);
@@ -209,25 +239,26 @@ namespace LinBox
int n = (int)num. size();
int len = (int)_lcontainer. length();
Integer prime = _lcontainer.prime();//prime
- LVector digits; //Store all p-adic digits
- digits. resize (len); //reserve space for all digits
+ const BlasVector<Ring> zero(_r,(size_t)n);
+ LVector digits((size_t)len,zero); //Store all p-adic digits
+ // digits. resize ((size_t)len); //reserve space for all digits
Integer modulus; //store current modulus
Integer denbound; // store current bound for den
Integer numbound; //store current bound for num
- _r. init (modulus, 1);
- _r. init (denbound, 1);
- _r. init (numbound, 1);
+ _r. assign (modulus, _r.one);
+ _r. assign (denbound, _r.one);
+ _r. assign (numbound, _r.one);
Integer c1, c2, c1_den, c1_num, c2_den, c2_num;
- IVector r1(num.size()), r2(num.size());
- _r. init (c1, 0); _r. init(c1_den, 1); _r. init (c1_num, 0);
- _r. init (c2, 0); _r. init(c2_den, 1); _r. init (c2_num, 0);
+ IVector r1(_r,num.size()), r2(_r,num.size());
+ _r. assign(c1, _r.zero); _r. assign(c1_den, _r.one); _r. assign (c1_num, _r.zero);
+ _r. assign(c2, _r.zero); _r. assign(c2_den, _r.one); _r. assign (c2_num, _r.zero);
typename IVector::iterator r_p;
for (r_p = r1. begin(); r_p != r1. end(); ++ r_p)
- _r. init (*r_p, rand());
+ _r. init (*r_p, int64_t(rand()));
for (r_p = r2. begin(); r_p != r2. end(); ++ r_p)
- _r. init (*r_p, rand());
+ _r. init (*r_p, int64_t(rand()));
//std::cout << "Random vecotor1: " ;
//print (r1);
@@ -237,7 +268,7 @@ namespace LinBox
Integer pmodulus; //store previous modulus
Integer tmp; //temprary integer
- _r. init (den, 1);
+ _r. assign (den, _r.one);
typename LiftingContainer::const_iterator iter = _lcontainer.begin();
Integer tmp_den, tmp_num, rem1, rem2;
@@ -259,12 +290,13 @@ namespace LinBox
IVector& dig = *digits_p;
++step; ++ digits_p;
- dig. resize (n);
+ // dig. resize ((size_t)n);
// get next p-adic digit
bool nextResult = iter.next(dig);
if (!nextResult) {
- std::cout << "ERROR in lifting container. Are you using <double> ring with large norm? (1)" << std::endl;
+ commentator().report() <<
+ "ERROR in lifting container. Are you using <double> ring with large norm? (1)" << std::endl;
return false;
}
//std::cout << "New digits:\n";
@@ -283,14 +315,14 @@ namespace LinBox
if ((step % _threshold) == 0) {
//std::cout << "Previous (Current) modulus: " << pmodulus << "( " << modulus << ")\n";
- dot (tmp, r1, dig); _r. remin (tmp, prime); _r. axpyin (c1, tmp, pmodulus);
+ dot (tmp, r1, dig); _r. modin (tmp, prime); _r. axpyin (c1, tmp, pmodulus);
//std::cout << "r1 * digit: " << tmp << '\n';
- dot (tmp, r2, dig); _r. remin (tmp, prime); _r. axpyin (c2, tmp, pmodulus);
+ dot (tmp, r2, dig); _r. modin (tmp, prime); _r. axpyin (c2, tmp, pmodulus);
//std::cout << "r2 * digit: " << tmp << '\n';
//std::cout << "c1, c2: " << c1 << ", " << c2 << "\n";
- _r. mul (rem1, c1, c1_den); _r. subin (rem1, c1_num); _r. remin (rem1, modulus);
- _r. mul (rem2, c2, c2_den); _r. subin (rem2, c2_num); _r. remin (rem2, modulus);
+ _r. mul (rem1, c1, c1_den); _r. subin (rem1, c1_num); _r. modin (rem1, modulus);
+ _r. mul (rem2, c2, c2_den); _r. subin (rem2, c2_num); _r. modin (rem2, modulus);
//Early termination condition is met.
@@ -300,21 +332,21 @@ namespace LinBox
}
if (!_r. isZero (rem1)) {
- int status = (int)_r.reconstructRational(tmp_num, tmp_den, c1, modulus, numbound, denbound);
+ int status = (int)Givaro::reconstructRational(tmp_num, tmp_den, c1, modulus, numbound, denbound);
if(status) {
_r. assign (c1_den, tmp_den); _r. assign (c1_num, tmp_num);
}
}
if (!_r. isZero (rem2)) {
- int status =(int) _r.reconstructRational(tmp_num, tmp_den, c2, modulus, numbound, denbound);
+ int status =(int) Givaro::reconstructRational(tmp_num, tmp_den, c2, modulus, numbound, denbound);
if(status) {
_r. assign (c2_den, tmp_den); _r. assign (c2_num, tmp_num);
}
}
}
}
- IVector res (n);
+ IVector res (_r,(size_t)n);
typename LVector::const_iterator digit_begin = digits. begin();
PolEval (res, digit_begin, (size_t)step, prime);
if(step < len) _r. lcm (den, c1_den, c2_den);
@@ -332,11 +364,11 @@ namespace LinBox
std::cout << "Start rational reconstruction:\n";
typename Vector::iterator num_p; typename IVector::iterator res_p;
Integer tmp_res, neg_res, abs_neg, l, g;
- _r. init (den, 1);
+ _r. assign(den, _r.one);
int counter=0;
for (num_p = num. begin(), res_p = res. begin(); num_p != num. end(); ++ num_p, ++ res_p) {
_r. mul (tmp_res, *res_p, den);
- _r. remin (tmp_res, modulus);
+ _r. modin (tmp_res, modulus);
_r. sub (neg_res, tmp_res, modulus);
_r. abs (abs_neg, neg_res);
@@ -345,9 +377,10 @@ namespace LinBox
else if (_r. compare(abs_neg, numbound) < 0)
_r. assign (*num_p, neg_res);
else {
- int status= (int) _r. reconstructRational(tmp_num, tmp_den, *res_p, modulus, numbound, denbound);
+ int status= (int)Givaro::reconstructRational(tmp_num, tmp_den, *res_p, modulus, numbound, denbound);
if (!status) {
- std::cout << "ERROR in reconstruction ? (1)\n" << std::endl;
+ commentator().report()
+ << "ERROR in reconstruction ? (1)\n" << std::endl;
#ifdef DEBUG_RR
std::cout<<" try to reconstruct :\n";
// std::cout<<"approximation: "<<*iter_approx<<std::endl;
@@ -400,7 +433,7 @@ namespace LinBox
#endif
linbox_check(num.size() == (size_t)_lcontainer.size());
- _r. init (den, 1);
+ _r. assign (den, _r.one);
Integer prime = _lcontainer.prime(); // prime used for lifting
std::vector<size_t> accuracy(_lcontainer.size(), 0); // accuracy (in powers of p) of each answer so far
Vector digit(_lcontainer.size()); // to store next digit
@@ -408,9 +441,9 @@ namespace LinBox
Integer prev_modulus; // store previous modulus
Integer numbound, denbound; // current num/den bound for early termination
size_t numConfirmed; // number of reconstructions which passed twice
- _r.init(modulus, 0);
+ _r.assign(modulus, _r.zero);
std::vector<Integer> zz(_lcontainer.size(), modulus); // stores each truncated p-adic approximation
- _r.init(modulus, 1);
+ _r.assign(modulus, _r.one);
size_t len = _lcontainer.length();
/* should be ceil(log(2*numbound*denbound)/log(prime))
@@ -457,7 +490,7 @@ namespace LinBox
_r.convert(iD, _lcontainer.numbound());
_r.convert(iN, _lcontainer.denbound());
_r.convert(pPower, prime);
- pPower = pow(pPower, len-1);
+ pPower = pow(pPower, uint64_t(len)-1);
tmp = pPower * iN;
tmp /= iD;
@@ -501,7 +534,8 @@ namespace LinBox
// get next p-adic digit
bool nextResult = iter.next(digit);
if (!nextResult) {
- std::cout << "ERROR in lifting container. Are you using <double> ring with large norm? (2)" << std::endl;
+ commentator().report()
+ << "ERROR in lifting container. Are you using <double> ring with large norm? (2)" << std::endl;
return false;
}
#ifdef RSTIMING
@@ -566,7 +600,7 @@ namespace LinBox
Integer tmp_num, tmp_den;
_r. assign (tmp_den, den);
_r. mul (tmp_num, den, *zz_p);
- _r. remin (tmp_num, modulus);
+ _r. modin (tmp_num, modulus);
// assign tmp_num = one of tmp_num and tmp_num - modulus with smallest absolute value.
Integer n_num;
@@ -595,7 +629,7 @@ namespace LinBox
justConfirming = false;
// if no answer yet (or last answer became invalid)
// try to reconstruct a rational number
- tmp = _r.reconstructRational(*num_p, tmp_den, *zz_p, modulus, numbound, denbound);
+ tmp = Givaro::reconstructRational(*num_p, tmp_den, *zz_p, modulus, numbound, denbound);
// update 'accuracy' according to whether it worked or not
if (tmp) {
linbox_check (!_r.isZero(tmp_den));
@@ -629,7 +663,7 @@ namespace LinBox
// check if the rational number works for _zz_p mod _modulus
_r. mul (tmp_i, den, *zz_p);
_r. subin (tmp_i, *num_p);
- _r. remin (tmp_i, modulus);
+ _r. modin (tmp_i, modulus);
if (_r.isZero (tmp_i)) {
*accuracy_p = i;
numConfirmed++;
@@ -637,7 +671,7 @@ namespace LinBox
else {
// previous result is fake, reconstruct new answer
Integer tmp_den;
- tmp = _r.reconstructRational(*num_p, tmp_den, *zz_p, modulus, numbound, denbound);
+ tmp = Givaro::reconstructRational(*num_p, tmp_den, *zz_p, modulus, numbound, denbound);
if (tmp) {
linbox_check (!_r.isZero(den));
if (! _r. areEqual (tmp_den, den)) {
@@ -672,7 +706,7 @@ namespace LinBox
Integer g;
- _r. init (g, 0);
+ _r. assign (g, _r.zero);
_r. gcdin (g, den);
for (num_p = num. begin(); num_p != num. end(); ++ num_p)
_r. gcdin (g, *num_p);
@@ -698,27 +732,25 @@ namespace LinBox
if (deg == 1){
for (size_t i=0;i<y.size();++i)
- _r.assign(y[i],(*Pol)[i]);
+ _r.assign(y[(size_t)i],(*Pol)[(size_t)i]);
}
else{
size_t deg_low, deg_high;
deg_high = deg/2;
deg_low = deg - deg_high;
- Integer zero;
- _r.init(zero,0);
- Vector y1(y.size(),zero), y2(y.size(),zero);
+ Vector y1(_r,y.size(),_r.zero), y2(_r,y.size(),_r.zero);
Integer x1=x, x2=x;
PolEval(y1, Pol, deg_low, x1);
- ConstIterator Pol_high= Pol+deg_low;
+ ConstIterator Pol_high= Pol+(ptrdiff_t)deg_low;
PolEval(y2, Pol_high, deg_high, x2);
for (size_t i=0;i< y.size();++i){
- _r.assign(y[i],y1[i]);
- _r.axpyin(y[i],x1,y2[i]);
- //_r.axpy(y[i],x1,y2[i],y1[i]);
+ _r.assign(y[(size_t)i],y1[(size_t)i]);
+ _r.axpyin(y[(size_t)i],x1,y2[(size_t)i]);
+ //_r.axpy(y[(size_t)i],x1,y2[(size_t)i],y1[(size_t)i]);
}
_r.mul(x,x1,x2);
@@ -751,20 +783,18 @@ namespace LinBox
size_t size= _lcontainer.size();
- Integer zero;
- _r.init(zero,0);
- Vector zero_digit(_lcontainer.size(),zero);
+ Vector zero_digit(_r,_lcontainer.size(),_r.zero);
// store approximation as a polynomial and evaluate by baby step giant step
std::vector<Vector> digit_approximation(length,zero_digit);
// store real approximation
- Vector real_approximation(size,zero);
+ Vector real_approximation(_r,size,_r.zero);
// store modulus (intially set to 1)
Integer modulus;
- _r.init(modulus, 1);
+ _r.assign(modulus, _r.one);
// denominator upper bound
Integer denbound;
@@ -788,7 +818,7 @@ namespace LinBox
#endif
// Compute all the approximation using liftingcontainer
typename LiftingContainer::const_iterator iter = _lcontainer.begin();
- for (size_t i=0 ; iter != _lcontainer.end() && iter.next(digit_approximation[i]);++i) {
+ for (size_t i=0 ; iter != _lcontainer.end() && iter.next(digit_approximation[(size_t)i]);++i) {
#ifdef LIFTING_PROGRESS
lifting_commentator().progress(i);
@@ -796,7 +826,7 @@ namespace LinBox
#if 0
eval_horn.start();
for (size_t j=0;j<size;++j)
- _r.axpyin(real_approximation[j],modulus, digit_approximation[i][j]);
+ _r.axpyin(real_approximation[j],modulus, digit_approximation[(size_t)i][j]);
eval_horn.stop();
eval_horner+=eval_horn;
#endif
@@ -809,7 +839,8 @@ namespace LinBox
// problem occured during lifting
if (iter!= _lcontainer.end()){
- std::cout << "ERROR in lifting container. Are you using <double> ring with large norm? (3)" << std::endl;
+ commentator().report()
+ << "ERROR in lifting container. Are you using <double> ring with large norm? (3)" << std::endl;
return false;
}
@@ -845,7 +876,7 @@ namespace LinBox
for (int i= length -1; i>= skip+sqrt_length; --i)
for (size_t j=0;j<size;++j) {
_r.mulin(baby_approx[sqrt_length][j] , prime);
- _r.addin(baby_approx[sqrt_length][j], digit_approximation[i][j]);
+ _r.addin(baby_approx[sqrt_length][j], digit_approximation[(size_t)i][j]);
}
LinBox::integer p_to_sqrt, p;
@@ -859,7 +890,7 @@ namespace LinBox
for (int i= sqrt_length; i>= 0; --i)
for (size_t j=0;j<size;j++) {
_r.mulin(real_approximation[j] , prime_to_sqrt );
- _r.addin(real_approximation[j], baby_approx[i][j]);
+ _r.addin(real_approximation[j], baby_approx[(size_t)i][j]);
}
}
eval_bsgs.stop();
@@ -896,10 +927,11 @@ namespace LinBox
typename Vector::iterator iter_d = den_r.begin();
for (size_t i=0; iter_a != real_approximation.end(); ++iter_a, ++ iter_n, ++iter_d, ++i){
- if (!_r.reconstructRational(*iter_n, *iter_d,
+ if (!Givaro::reconstructRational(*iter_n, *iter_d,
*iter_a, modulus, numbound, denbound))
{
- std::cout << "ERROR in reconstruction ?\n" << std::endl;
+ commentator().report()
+ << "ERROR in reconstruction ?\n" << std::endl;
}
}
dumb_ratrecon.stop();
@@ -914,11 +946,11 @@ namespace LinBox
Timer ratrecon;
ratrecon.start();
Integer common_den, common_den_mod_prod, bound,two,tmp;
- _r.init(common_den,1);
- _r.init(common_den_mod_prod,1);
- _r.init(two,2);
+ _r.assign(common_den,_r.one);
+ _r.assign(common_den_mod_prod,_r.one);
+ _r.init(two,int64_t(2));
- Vector denominator(num.size());
+ Vector denominator(_r,num.size());
int counter=0;
typename Vector::iterator iter_approx = real_approximation.begin();
@@ -932,23 +964,23 @@ namespace LinBox
for (size_t i=0; iter_approx != real_approximation.end(); ++iter_approx, ++ iter_num, ++iter_denom, ++i){
//_r.mulin( *iter_approx , common_den_mod_prod);
_r.mulin( *iter_approx , common_den);
- _r.remin( *iter_approx , modulus);
+ _r.modin( *iter_approx , modulus);
_r. sub (neg_approx, *iter_approx, modulus);
_r. abs (abs_approx, neg_approx);
if ( _r.compare(*iter_approx, numbound) < 0){
_r.assign(*iter_num, *iter_approx);
- _r.init(*iter_denom, 1);
+ _r.assign(*iter_denom, _r.one);
}
else if (_r.compare(abs_approx, numbound) <0){
_r.assign(*iter_num, neg_approx);
- _r.init(*iter_denom, 1);
+ _r.assign(*iter_denom, _r.one);
}
else {
- if (!_r.reconstructRational(*iter_num, *iter_denom, *iter_approx, modulus, numbound, denbound))
+ if (!Givaro::reconstructRational(*iter_num, *iter_denom, *iter_approx, modulus, numbound, denbound))
{
- std::cout << "ERROR in reconstruction ? (3)\n" << std::endl;
#ifdef DEBUG_RR
+ std::cout << "ERROR in reconstruction ? (3)\n" << std::endl;
std::cout<<" try to reconstruct :\n";
std::cout<<"approximation: "<<*iter_approx<<std::endl;
std::cout<<"modulus: "<<modulus<<std::endl;
@@ -975,10 +1007,10 @@ namespace LinBox
_r.assign(modulus,tmp);
_r.div(tmp,modulus,prime);
}
- _r.rem(tmp , *iter_denom , modulus);
- _r.remin(common_den_mod_prod , modulus);
+ _r.mod(tmp , *iter_denom , modulus);
+ _r.modin(common_den_mod_prod , modulus);
_r.mulin(common_den_mod_prod , tmp);
- _r.remin(common_den_mod_prod , modulus);
+ _r.modin(common_den_mod_prod , modulus);
}
#endif
@@ -986,17 +1018,17 @@ namespace LinBox
}
- _r.init(tmp,1);
+ _r.assign(tmp,_r.one);
for (int i= idx_last_den ; i>=0;--i){
- _r.mulin(num[i],tmp);
- _r.mulin(tmp,denominator[i]);
+ _r.mulin(num[(size_t)i],tmp);
+ _r.mulin(tmp,denominator[(size_t)i]);
}
#if 0
typename Vector1::reverse_iterator rev_iter_num = num.rbegin();
typename Vector::reverse_iterator rev_iter_denom = denominator.rbegin();
- _r.init(tmp,1);
+ _r.assign(tmp,_r.one);
for (; rev_iter_num != num.rend(); ++rev_iter_num, ++rev_iter_denom){
_r.mulin(*rev_iter_num,tmp);
@@ -1034,7 +1066,7 @@ namespace LinBox
Integer init_den = den_app;
if (den > 0) lcm(init_den,den,den_app);
- _r. init (den, 1);
+ _r. assign(den, _r.one);
#ifdef DEBUG_RR
cout << "debug: den " << den;
#endif
@@ -1042,9 +1074,9 @@ namespace LinBox
Vector digit(_lcontainer.size()); // to store next digit
Integer modulus; // store modulus (power of prime)
Integer prev_modulus; // store previous modulus
- _r.init(modulus, 0);
+ _r.assign(modulus, _r.zero);
std::vector<Integer> zz(_lcontainer.size(), modulus); // stores each truncated p-adic approximation
- _r.init(modulus, 1);
+ _r.assign(modulus, _r.one);
size_t len = _lcontainer.length(); // should be ceil(log(2*numbound*denbound)/log(prime))
#ifdef DEBUG_RR
@@ -1078,7 +1110,8 @@ namespace LinBox
// get next p-adic digit
bool nextResult = iter.next(digit);
if (!nextResult) {
- std::cout << "ERROR in lifting container. Are you using <double> ring with large norm? (ET)" << std::endl;
+ commentator().report()
+ << "ERROR in lifting container. Are you using <double> ring with large norm? (ET)" << std::endl;
return false;
}
#ifdef RSTIMING
@@ -1111,7 +1144,7 @@ namespace LinBox
terminated = true;
for ( zz_p = zz.begin(), num_p = num.begin(); zz_p != zz.end(); ++ zz_p, ++ num_p) {
Integer a = *num_p;
- Integer bx= *zz_p; _r. mulin (bx, den); _r. remin(bx, modulus);
+ Integer bx= *zz_p; _r. mulin (bx, den); _r. modin(bx, modulus);
Integer _bx = bx-modulus;
if (!_r.areEqual(a,bx) && !_r.areEqual(a,_bx)) {
terminated = false;
@@ -1129,8 +1162,8 @@ namespace LinBox
Integer tmp_den=0;
Integer zz_p_den (*zz_p);
_r. mulin (zz_p_den,den);
- _r. remin (zz_p_den,modulus);
- bool tmp = RR.reconstructRational(*num_p, tmp_den, zz_p_den, modulus);
+ _r. modin (zz_p_den,modulus);
+ bool tmp = Givaro::reconstructRational(*num_p, tmp_den, zz_p_den, modulus);
#ifdef RSTIMING
++counter;
#endif
@@ -1158,9 +1191,9 @@ namespace LinBox
Integer tmp_den;
Integer zz_p_den (*zz_p);
_r. mulin (zz_p_den,den);
- _r. remin (zz_p_den,modulus);
+ _r. modin (zz_p_den,modulus);
- bool tmp = RR.reconstructRational(*num_p, tmp_den, zz_p_den, modulus, _lcontainer.numbound(), _lcontainer.denbound());
+ bool tmp = Givaro::reconstructRational(*num_p, tmp_den, zz_p_den, modulus, _lcontainer.numbound(), _lcontainer.denbound());
#ifdef RSTIMING
++counter;
#endif
@@ -1173,7 +1206,8 @@ namespace LinBox
}
}
else {
- std::cout << "ERROR in reconstruction ? (ET)\n" << std::flush;
+ commentator().report()
+ << "ERROR in reconstruction ? (ET)\n" << std::flush;
}
}
@@ -1189,7 +1223,7 @@ namespace LinBox
#endif
Integer g;
Integer abs_num_p(0);
- _r. init (g, 0);
+ _r. assign(g, _r.zero);
_r. gcdin (g, den);
for (num_p = num. begin(); num_p != num. end(); ++ num_p) {
_r. gcdin (g, *num_p);
@@ -1275,20 +1309,18 @@ namespace LinBox
std::cout<<"magnitude time: "<<magn<<"\n";
// some constants
- Integer zero;
- _r.init(zero,0);
- Vector zero_digit(_lcontainer.size(),zero);
+ Vector zero_digit(_lcontainer.size(),_r.zero);
// store approximation as a polynomial and evaluate by baby step giant step
std::vector<Vector> digit_approximation(length,zero_digit);
// store real approximation
- Vector real_approximation(size,zero);
+ Vector real_approximation(size,_r.zero);
Vector last_real_approximation;
// store modulus (intially set to 1)
Integer modulus, last_modulus;
- _r.init(modulus, 1);
+ _r.assign(modulus, _r.one);
typename LiftingContainer::const_iterator iter = _lcontainer.begin();
@@ -1298,11 +1330,11 @@ namespace LinBox
size_t endingsteps =minsteps;
// switchers
- bool latticeOK=false, numeratorOK=false, domoresteps=true, domorelattice=true;
+ bool numeratorOK=false, domoresteps=true, domorelattice=true;
// common denominator
Integer common_denom;
- _r.init(common_denom,1);
+ _r.assign(common_denom,_r.one);
// bad numerator index
size_t bad_num_index=0;
@@ -1327,7 +1359,7 @@ namespace LinBox
if (domoresteps){
// compute the padic digits
- for (size_t i = startingsteps ; (i< endingsteps) && (iter.next(digit_approximation[i]));++i) {
+ for (size_t i = startingsteps ; (i< endingsteps) && (iter.next(digit_approximation[(size_t)i]));++i) {
_r.mulin(modulus,prime);
}
@@ -1343,7 +1375,7 @@ namespace LinBox
if (startingsteps != 0){
for (size_t i=0;i<size;++i){
- _r.axpyin(last_real_approximation[i],real_approximation[i], last_modulus);
+ _r.axpyin(last_real_approximation[(size_t)i],real_approximation[(size_t)i], last_modulus);
}
real_approximation=last_real_approximation;
}
@@ -1371,16 +1403,16 @@ namespace LinBox
// NTL::clear(Lattice);
// Lattice[0][0]=1;
// for (size_t i= bad_num_index+1;i< bad_num_index+k+1;++i){
- // Lattice[i][i]=m;//not working when bad index <> 0
- // _r.convert(tmp_int, real_approximation[i-1]);
+ // Lattice[(size_t)i][(size_t)i]=m;//not working when bad index <> 0
+ // _r.convert(tmp_int, real_approximation[(size_t)i-1]);
// tmp=NTL::to_ZZ((std::string(tmp_int)).c_str());
- // Lattice[0][i]=tmp;//not working when bad index <> 0
+ // Lattice[0][(size_t)i]=tmp;//not working when bad index <> 0
// }
BlasMatrix<Ring> Lattice(_r,k+1,k+1);
Lattice.setEntry(0,0,_r.one);
for (size_t i= bad_num_index+1;i< bad_num_index+k+1;++i){
Lattice.setEntry(i,i,mod);//not working when bad index <> 0
- _r.convert(tmp_int, real_approximation[i-1]);
+ _r.convert(tmp_int, real_approximation[(size_t)i-1]);
Lattice.setEntry(0,i,tmp_int);//not working when bad index <> 0
}
@@ -1400,8 +1432,8 @@ namespace LinBox
// check if the 1st row is the short vector
- // Lattice[i][j] should work. Using standard getEntry though
- latticeOK=true;
+ // Lattice[(size_t)i][j] should work. Using standard getEntry though
+ bool latticeOK=true;
tmp=abs(Lattice.getEntry(0,0))*ratio;
for (size_t i=1;i<k+1;++i){
for (size_t j=0;j<k+1;++j)
@@ -1431,7 +1463,7 @@ namespace LinBox
// integer dd= integer(0);
// for(long i = b - 1; i >= 0; --i) {
// dd *= base;
- // dd += integer(byteArray[i]);
+ // dd += integer(byteArray[(size_t)i]);
// }
// delete [] byteArray;
myInteger dd = Lattice.getEntry(0,0);
@@ -1451,15 +1483,15 @@ namespace LinBox
numeratorOK=true;
// compute the numerators and check their validity according to the numerator bound
for (size_t i=0;i<size;++i){
- _r.mulin(real_approximation[i], denom);
- _r.remin(real_approximation[i], modulus);
- _r. sub (neg_approx, real_approximation[i], modulus);
+ _r.mulin(real_approximation[(size_t)i], denom);
+ _r.modin(real_approximation[(size_t)i], modulus);
+ _r. sub (neg_approx, real_approximation[(size_t)i], modulus);
_r. abs (abs_approx, neg_approx);
- if ( _r.compare(real_approximation[i], numbound) < 0)
- _r.assign(num[i], real_approximation[i]);
+ if ( _r.compare(real_approximation[(size_t)i], numbound) < 0)
+ _r.assign(num[(size_t)i], real_approximation[(size_t)i]);
else if (_r.compare(abs_approx, numbound) <0)
- _r.assign(num[i], neg_approx);
+ _r.assign(num[(size_t)i], neg_approx);
else {
bad_num_index= std::min(i, size-k);
numeratorOK=false;
@@ -1483,7 +1515,7 @@ namespace LinBox
}
// check the validity of the solution according to n.||A||.||num||+ d.||b|| < modulus
- integer check= size*MagnA*maxnum+dd*Magnb;
+ integer check= uint64_t(size)*MagnA*maxnum+dd*Magnb;
checksol.stop();
std::cout<<"checking solution time : "<<checksol<<"\n\n";
@@ -1533,7 +1565,7 @@ namespace LinBox
if (neg_denom){
for (size_t i=0;i<size;++i)
- _r.negin(num[i]);
+ _r.negin(num[(size_t)i]);
}
#ifdef RSTIMING
tRecon.stop();
@@ -1618,20 +1650,18 @@ namespace LinBox
std::cout<<"magnitude time: "<<magn<<"\n";
// some constants
- Integer zero;
- _r.init(zero,0);
- Vector zero_digit(_lcontainer.size(),zero);
+ Vector zero_digit(_lcontainer.size(),_r.zero);
// store approximation as a polynomial and evaluate by baby step giant step
std::vector<Vector> digit_approximation(length,zero_digit);
// store real approximation
- Vector real_approximation(size,zero);
+ Vector real_approximation(size,_r.zero);
Vector last_real_approximation;
// store modulus (intially set to 1)
Integer modulus, last_modulus;
- _r.init(modulus, 1);
+ _r.assign(modulus, _r.one);
typename LiftingContainer::const_iterator iter = _lcontainer.begin();
@@ -1641,11 +1671,11 @@ namespace LinBox
size_t endingsteps =minsteps;
// switchers
- bool latticeOK=false, numeratorOK=false, domoresteps=true, domorelattice=true;
+ bool numeratorOK=false, domoresteps=true, domorelattice=true;
// common denominator
Integer common_denom;
- _r.init(common_denom,1);
+ _r.assign(common_denom,_r.one);
// bad numerator index
size_t bad_num_index=0;
@@ -1672,7 +1702,7 @@ namespace LinBox
linbox_check(startingsteps != endingsteps);
// compute the padic digits
- for (size_t i = startingsteps ; (i< endingsteps) && (iter.next(digit_approximation[i]));++i) {
+ for (size_t i = startingsteps ; (i< endingsteps) && (iter.next(digit_approximation[(size_t)i]));++i) {
_r.mulin(modulus,prime);
}
@@ -1688,7 +1718,7 @@ namespace LinBox
if (startingsteps != 0){
for (size_t i=0;i<size;++i){
- _r.axpyin(last_real_approximation[i],real_approximation[i], last_modulus);
+ _r.axpyin(last_real_approximation[(size_t)i],real_approximation[(size_t)i], last_modulus);
}
real_approximation=last_real_approximation;
}
@@ -1711,9 +1741,9 @@ namespace LinBox
// ZZ_mat<mpz_t> Lattice(k+1,k+1) ;
// Lattice= new mpz_t*[k+2];
// for (size_t i=0;i<k+2;++i){
- // Lattice[i]= new mpz_t[k+2];
+ // Lattice[(size_t)i]= new mpz_t[k+2];
// for (size_t j=0;j<k+2;++j)
- // mpz_init(Lattice[i][j]);
+ // mpz_init(Lattice[(size_t)i][j]);
// }
BlasMatrix<Ring> Lattice(_r,k+1,k+1);
@@ -1724,17 +1754,17 @@ namespace LinBox
// Lattice.Set(0,0,Z_NR<mpz_t>(tmp.get_mpz()));
// for (size_t i=1;i< k+1;++i){
- // mpz_set(Lattice[i][i],mod.get_mpz());
+ // mpz_set(Lattice[(size_t)i][(size_t)i],mod.get_mpz());
// Lattice.Set(i,i, Z_NR<mpz_t>(mod.get_mpz()) );
// _r.convert(tmp, real_approximation[bad_num_index+i-1]);
// Lattice.Set(0,i,Z_NR<mpz_t>(tmp.get_mpz()));
- // mpz_set(Lattice[1][i],tmp.get_mpz());
+ // mpz_set(Lattice[1][(size_t)i],tmp.get_mpz());
// }
Lattice.setEntry(0,0,tmp);
for (size_t i=1;i< k+1;++i){
Lattice.setEntry(i,i, mod );
_r.convert(tmp, real_approximation[bad_num_index+i-1]);
- Lattice.setEntry(0,i,FPLLL::Z_NR<mpz_t>(tmp.get_mpz()));
+ Lattice.setEntry(0,i,fplll::Z_NR<mpz_t>(tmp.get_mpz()));
}
@@ -1754,7 +1784,7 @@ namespace LinBox
// check if the 1st row is the short vector
- latticeOK=true;
+ bool latticeOK=true;
_r.mul(tmp, Lattice.getEntry(0,0),ratio);
// mpz_mul(tmp.get_mpz(), Lattice(0,0).GetData(),ratio.get_mpz());
for (size_t i=1;i<k+1;++i){
@@ -1773,8 +1803,8 @@ namespace LinBox
//delete the lattice
// for (size_t i=0;i<k+2;++i){
// for (size_t j=0;j<k+2;++j)
- // mpz_clear(Lattice[i][j]);
- // delete[] Lattice[i];
+ // mpz_clear(Lattice[(size_t)i][j]);
+ // delete[] Lattice[(size_t)i];
// }
// delete[] Lattice;
@@ -1801,15 +1831,15 @@ namespace LinBox
numeratorOK=true;
// compute the numerators and check their validity according to the numerator bound
for (size_t i=0;i<size;++i){
- _r.mulin(real_approximation[i], common_denom);
- _r.remin(real_approximation[i], modulus);
- _r. sub (neg_approx, real_approximation[i], modulus);
+ _r.mulin(real_approximation[(size_t)i], common_denom);
+ _r.modin(real_approximation[(size_t)i], modulus);
+ _r. sub (neg_approx, real_approximation[(size_t)i], modulus);
_r. abs (abs_approx, neg_approx);
- if ( _r.compare(real_approximation[i], numbound) < 0)
- _r.assign(num[i], real_approximation[i]);
+ if ( _r.compare(real_approximation[(size_t)i], numbound) < 0)
+ _r.assign(num[(size_t)i], real_approximation[(size_t)i]);
else if (_r.compare(abs_approx, numbound) <0)
- _r.assign(num[i], neg_approx);
+ _r.assign(num[(size_t)i], neg_approx);
else {
bad_num_index= std::min(i, size-k);
numeratorOK=false;
@@ -1833,7 +1863,7 @@ namespace LinBox
}
// check the validity of the solution according to n.||A||.||num||+ d.||b|| < modulus
- integer check= size*MagnA*maxnum+dd*Magnb;
+ integer check= uint64_t(size)*MagnA*maxnum+dd*Magnb;
checksol.stop();
std::cout<<"checking solution time : "<<checksol<<"\n\n";
@@ -1883,7 +1913,7 @@ namespace LinBox
if (neg_denom){
for (size_t i=0;i<size;++i)
- _r.negin(num[i]);
+ _r.negin(num[(size_t)i]);
}
#ifdef RSTIMING
tRecon.stop();
@@ -1960,20 +1990,18 @@ namespace LinBox
std::cout<<"magnitude time: "<<magn<<"\n";
// some constants
- Integer zero;
- _r.init(zero,0);
- Vector zero_digit(_lcontainer.size(),zero);
+ Vector zero_digit(_lcontainer.size(),_r.zero);
// store approximation as a polynomial and evaluate by baby step giant step
std::vector<Vector> digit_approximation(length,zero_digit);
// store real approximation
- Vector real_approximation(size,zero);
+ Vector real_approximation(size,_r.zero);
Vector last_real_approximation;
// store modulus (intially set to 1)
Integer modulus, last_modulus;
- _r.init(modulus, 1);
+ _r.assign(modulus, _r.one);
typename LiftingContainer::const_iterator iter = _lcontainer.begin();
@@ -1983,11 +2011,11 @@ namespace LinBox
size_t endingsteps =minsteps;
// switchers
- bool latticeOK=false, numeratorOK=false, domoresteps=true, domorelattice=true;
+ bool numeratorOK=false, domoresteps=true, domorelattice=true;
// common denominator
Integer common_denom;
- _r.init(common_denom,1);
+ _r.assign(common_denom,_r.one);
// bad numerator index
size_t bad_num_index=0;
@@ -2014,7 +2042,7 @@ namespace LinBox
linbox_check(startingsteps != endingsteps);
// compute the padic digits
- for (size_t i = startingsteps ; (i< endingsteps) && (iter.next(digit_approximation[i]));++i) {
+ for (size_t i = startingsteps ; (i< endingsteps) && (iter.next(digit_approximation[(size_t)i]));++i) {
_r.mulin(modulus,prime);
}
@@ -2030,7 +2058,7 @@ namespace LinBox
if (startingsteps != 0){
for (size_t i=0;i<size;++i){
- _r.axpyin(last_real_approximation[i],real_approximation[i], last_modulus);
+ _r.axpyin(last_real_approximation[(size_t)i],real_approximation[(size_t)i], last_modulus);
}
real_approximation=last_real_approximation;
}
@@ -2056,9 +2084,9 @@ namespace LinBox
Lattice[0]=tmp;
for (size_t i=1;i< k+1;++i){
- Lattice[i*(k+1)+i]=mod;
+ Lattice[(size_t)i*(k+1)+i]=mod;
_r.convert(tmp, real_approximation[bad_num_index+i-1]);
- Lattice[i]=tmp;
+ Lattice[(size_t)i]=tmp;
}
// ratio to check the validity of the denominator compare to the entries in the reduced lattice
@@ -2075,11 +2103,11 @@ namespace LinBox
// check if the 1st row is the short vector
- latticeOK=true;
+ bool latticeOK=true;
tmp = Givaro::abs(L3[0][0]*ratio);
for (size_t i=1;i<k+1;++i){
for (size_t j=0;j<k+1;++j)
- if (tmp > Givaro::abs(L3[i][j])){
+ if (tmp > Givaro::abs(L3[(size_t)i][j])){
latticeOK=false;
break;
}
@@ -2112,15 +2140,15 @@ namespace LinBox
numeratorOK=true;
// compute the numerators and check their validity according to the numerator bound
for (size_t i=0;i<size;++i){
- _r.mulin(real_approximation[i], common_denom);
- _r.remin(real_approximation[i], modulus);
- _r. sub (neg_approx, real_approximation[i], modulus);
+ _r.mulin(real_approximation[(size_t)i], common_denom);
+ _r.modin(real_approximation[(size_t)i], modulus);
+ _r. sub (neg_approx, real_approximation[(size_t)i], modulus);
_r. abs (abs_approx, neg_approx);
- if ( _r.compare(real_approximation[i], numbound) < 0)
- _r.assign(num[i], real_approximation[i]);
+ if ( _r.compare(real_approximation[(size_t)i], numbound) < 0)
+ _r.assign(num[(size_t)i], real_approximation[(size_t)i]);
else if (_r.compare(abs_approx, numbound) <0)
- _r.assign(num[i], neg_approx);
+ _r.assign(num[(size_t)i], neg_approx);
else {
bad_num_index= std::min(i, size-k);
numeratorOK=false;
@@ -2144,7 +2172,7 @@ namespace LinBox
}
// check the validity of the solution according to n.||A||.||num||+ d.||b|| < modulus
- integer check= size*MagnA*maxnum+dd*Magnb;
+ integer check= uint64_t(size)*MagnA*maxnum+dd*Magnb;
checksol.stop();
std::cout<<"checking solution time : "<<checksol<<"\n\n";
@@ -2194,7 +2222,7 @@ namespace LinBox
if (neg_denom){
for (size_t i=0;i<size;++i)
- _r.negin(num[i]);
+ _r.negin(num[(size_t)i]);
}
#ifdef RSTIMING
tRecon.stop();
diff --git a/linbox/algorithms/rational-solver-adaptive.h b/linbox/algorithms/rational-solver-adaptive.h
index b15dc7f..4e8e0fc 100644
--- a/linbox/algorithms/rational-solver-adaptive.h
+++ b/linbox/algorithms/rational-solver-adaptive.h
@@ -30,7 +30,7 @@
#include "linbox/util/debug.h"
-#include "linbox/field/modular.h"
+#include "linbox/ring/modular.h"
#include "linbox/algorithms/rational-solver.h"
#include "linbox/randiter/random-prime.h"
@@ -43,16 +43,16 @@ namespace LinBox
static SolverReturnStatus solveNonsingular(OutVector& num, typename IRing::Element& den, const BlasMatrix<IRing>& M, const InVector& b)
{
linbox_check ((M. rowdim() == M. coldim()) && (b.size() == M.rowdim()) && (num. size() ==M.coldim()));
- typedef Modular<int32_t> Field;
- // typedef Modular<double> Field;
- RationalSolver<IRing, Field, RandomPrimeIterator, WanTraits> numerical_solver;
- //RationalSolver<IRing, Field, RandomPrimeIterator, NumericalTraits> numerical_solver;
+ typedef Givaro::Modular<int32_t> Field;
+ // typedef Givaro::Modular<double> Field;
+ RationalSolver<IRing, Field, RandomPrimeIterator, NumSymNormTraits> numerical_solver;
+ //RationalSolver<IRing, Field, RandomPrimeIterator, NumSymOverlapTraits> numerical_solver;
SolverReturnStatus ret;
ret = numerical_solver. solve(num, den, M, b);
if (ret != SS_OK) {
RationalSolver<IRing, Field, RandomPrimeIterator> solver;
- std::vector<typename IRing::Element> Ib; Ib.reserve(b.size());
+ BlasVector<IRing> Ib(M.field()); Ib.reserve(b.size());
typename IRing::Element tmp;
for(typename InVector::const_iterator biter = b.begin();
biter != b.end();
@@ -72,9 +72,9 @@ namespace LinBox
struct RationalSolverAdaptiveClass<IRing, OutVector, Container<typename IRing::Element> > {
static SolverReturnStatus solveNonsingular(OutVector& num, typename IRing::Element& den, const BlasMatrix<IRing>& M, const Container<typename IRing::Element> & b) {
linbox_check ((M. rowdim() == M. coldim()) && (b.size() == M.rowdim()) && (num. size() ==M.coldim()));
- typedef Modular<int32_t> Field;
- // typedef Modular<double> Field;
- RationalSolver<IRing, Field, RandomPrimeIterator, NumericalTraits> numerical_solver;
+ typedef Givaro::Modular<int32_t> Field;
+ // typedef Givaro::Modular<double> Field;
+ RationalSolver<IRing, Field, RandomPrimeIterator, NumSymOverlapTraits> numerical_solver;
SolverReturnStatus ret;
ret = numerical_solver. solve(num, den, M, b);
diff --git a/linbox/algorithms/rational-solver-sn.h b/linbox/algorithms/rational-solver-sn.h
index 1809492..a688b40 100644
--- a/linbox/algorithms/rational-solver-sn.h
+++ b/linbox/algorithms/rational-solver-sn.h
@@ -35,11 +35,11 @@
#include "linbox/blackbox/archetype.h"
#include "linbox/algorithms/dyadic-to-rational.h"
#include "linbox/blackbox/compose.h"
-#include "linbox/matrix/blas-matrix.h"
+#include "linbox/matrix/dense-matrix.h"
#include "linbox/algorithms/vector-fraction.h"
#include "linbox/algorithms/matrix-hom.h"
#include "linbox/util/timer.h"
-#include "linbox/field/PID-integer.h"
+#include "givaro/zring.h"
namespace LinBox {
@@ -66,17 +66,17 @@ namespace LinBox {
public:
typedef typename Ring::Element Int;
- typedef std::vector<Int> IVector;
+ typedef BlasVector<Ring> IVector;
// note: the type integer is also used. For instance, we assume shift operator<< works on integer.
typedef ParamFuzzy Field;
typedef typename Field::Element Float;
- typedef std::vector<Float> FVector;
+ typedef BlasVector<Field> FVector;
typedef BlasMatrix<Field> FMatrix;
protected:
Ring _ring;
VectorDomain<Ring> _VDR;
- Field _field;
+ const Field _field; // we own it, user not expected to provide this handle on floating pt.
VectorDomain<Field> _VDF;
NumericSolver _numsolver;
//inline static int check (int n, const double* M, integer* numx, integer& denx, double* b) ;
@@ -92,9 +92,14 @@ namespace LinBox {
bool exact_apply;
public:
+ inline const Field & field() const { return _field; }
+
RationalSolverSN(const Ring& R = Ring(), const NumericSolver& S = NumericSolver(),
bool ea=false) :
- _ring(R), _VDR(R), _field(Field()), _VDF(Field()), _numsolver(S), exact_apply(ea)
+ _ring(R), _VDR(R), _field(), _VDF(field()), _numsolver(S)
+ // randow default to 0
+ ,shift(0),shift_prev(0),shift_max(0),SHIFT_BOUND(0), HIT(0), MISS(0), iterations(0),sstatus(SHIFT_GROW),searchPeak(false),mnorm(0)
+ , exact_apply(ea)
{}
/**
@@ -116,10 +121,10 @@ namespace LinBox {
linbox_check((b.size() == M.rowdim()) && (num. size() == M.coldim()));
// DM is M as matrix of doubles
- FMatrix DM(_field, n, n);
+ FMatrix DM(field(), n, n);
// Fix MatrixHom?
//FMatrix* DMp = &DM;
- //MatrixHom::map<FMatrix, IMatrix, Field>(DMp, M, _field);
+ //MatrixHom::map<FMatrix, IMatrix, Field>(DMp, M, field());
if(n != M. rowdim() || n != M. coldim() || n != num.size()) {
// std::cerr << "solve fail 1 - dimension mismatch" << std::endl;
@@ -134,21 +139,21 @@ namespace LinBox {
typename FMatrix::Iterator dm_p = DM.Begin();
for (typename IMatrix::ConstIterator raw_p = M.Begin();
raw_p != M. End(); ++ raw_p, ++dm_p) {
- _field.init(*dm_p, *raw_p);
+ field().init(*dm_p, *raw_p);
}
// build a numeric solver from new double matrix
_numsolver.init(DM);
// r is b as vector of doubles. (r is initial residual)
- FVector r(n);
- IVector bi(n);
+ FVector r(field(),n);
+ IVector bi(_ring,n);
typename IVector::const_iterator b_p = b.begin();
typename IVector::iterator bi_p = bi.begin();
typename FVector::iterator r_p = r.begin();
- for ( ; b_p != b. begin() + n; ++b_p, ++r_p, ++bi_p) {
+ for ( ; b_p != b. begin() + (ptrdiff_t) n; ++b_p, ++r_p, ++bi_p) {
*bi_p = *b_p; // copy original RHS
- _field.init(*r_p, *b_p);
+ field().init(*r_p, *b_p);
}
// denBound is the Hadamard bound, loopBound is roughly twice as much
@@ -167,12 +172,13 @@ namespace LinBox {
loopBound *= (2*mnorm + zw_dmax((int)n, &*(r.begin()), 1));
- std::vector<integer> numx(n), tnum(n); // numerator of binary expansion
+ Givaro::ZRing<Integer> Z;
+ BlasVector<Givaro::ZRing<Integer> > numx(Z,n), tnum(Z,n); // numerator of binary expansion
integer denx = 1, tden; // denominator of binary expansion (denx is a power of 2).
- FVector x(n), xs_int(n), xs_frac(n);
- FVector lastr(n);
- IVector lastb(n);
+ FVector x(field(),n), xs_int(field(),n), xs_frac(field(),n);
+ FVector lastr(field(),n);
+ IVector lastb(_ring,n);
//set initial shift small.
shift = 2;
@@ -183,8 +189,6 @@ namespace LinBox {
HIT = 0; MISS = 0;
iterations = 0;
integer ay, be;
- PID_integer Z;
- int ret;
bool recon_success = false;
int recon_status = 0;
@@ -199,6 +203,7 @@ namespace LinBox {
//size_t rr_count = 0;
//solve_timer.clear(); rr_timer.clear();
do{
+ int ret;
//tt.clear(); tt.start();
ret = rat_sol(numx, denx, xs_int, xs_frac, bi, lastb, r, lastr, x, bound, M);
//tt.stop(); solve_timer += tt;
@@ -222,7 +227,7 @@ namespace LinBox {
bound <<= 2;
int rPos = rand()%(int)n;
//std::cerr << "At iteration " << iterations << ", ";
- if(dyadicToRational(Z, ay, be, numx[rPos], denx, denBound) /*== 2*/){
+ if(dyadicToRational(Z, ay, be, numx[(size_t)rPos], denx, denBound) /*== 2*/){
//std::cerr << "Random single worked! ";
}
else{
@@ -274,7 +279,7 @@ namespace LinBox {
#if 0
// Answer checking
- IVector y(n), z(n);
+ IVector y(_ring,n), z(_ring,n);
M.apply(y, num);
_VDR.mul(z, b, den);
if ( !_VDR.areEqual(y, z)) {
@@ -331,11 +336,10 @@ namespace LinBox {
#endif // __LINBOX_rational_solver_sn_H
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
// Local Variables:
// mode: C++
// tab-width: 8
// indent-tabs-mode: nil
// c-basic-offset: 8
// End:
-
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/algorithms/rational-solver-sn.inl b/linbox/algorithms/rational-solver-sn.inl
index 5e54ece..d263fe5 100644
--- a/linbox/algorithms/rational-solver-sn.inl
+++ b/linbox/algorithms/rational-solver-sn.inl
@@ -42,14 +42,14 @@ int zw_shift(NumericSolver & NS_S, size_t n, FVector &r, FVector &x)
{
// ZW method for calculating shift
// compute ax
- FVector ax(n);
+ FVector ax(field(),n);
NS_S.apply(ax, x);
// compute ax = ax -r, the negative of residual
for(size_t i=0; i<n; i++)
- _field.sub(ax[i], ax[i], r[i]);
+ field().sub(ax[i], ax[i], r[i]);
// compute possible shift
int zw_shift_loc;
- double normr1, normr2, normr3, shift1, shift2;
+ double normr1, normr2, normr3, shift2;
normr1 = zw_dmax(n, &*r.begin(), 1);
normr2 = zw_dmax(n, &*ax.begin(), 1);
normr3 = zw_dmax(n, &*x.begin(), 1);
@@ -59,7 +59,7 @@ int zw_shift(NumericSolver & NS_S, size_t n, FVector &r, FVector &x)
if (normr2 <.0000000001)
zw_shift_loc = 30;
else {
- shift1 = floor(log_2 (normr1 / normr2)) - 2;
+ double shift1 = floor(log_2 (normr1 / normr2)) - 2;
zw_shift_loc = (int)(30 < shift1 ? 30 : shift1);
}
@@ -81,10 +81,9 @@ int rat_sol(IVector& numx, Int& denx, FVector& xs_int, FVector& xs_frac, IVector
// xs_int: integer part of scaled x.
// xs_frac: fractional part of scaled x.
// x * 2^shift = xs_int + xs_frac.
- FVector nextx(n), quo(n);
+ FVector nextx(field(),n), quo(field(),n);
integer denx_i;
- typename Field::Element one; _field.init(one, 1);
// need to save original r for zw_shift calculation
// TODO: I took out the ZWSHIFT, still need last r??
@@ -111,9 +110,9 @@ int rat_sol(IVector& numx, Int& denx, FVector& xs_int, FVector& xs_frac, IVector
for(size_t i=0; i<n; i++){
// TODO - analyze logic here
// quo[i] = xs_frac[i] / nextx[i] - 1;
- //_field.div(quo[i], xs_frac[i], nextx[i]);
- //_field.subin(quo[i], one);
- _field.sub(quo[i], xs_frac[i], nextx[i]);
+ //field().div(quo[i], xs_frac[i], nextx[i]);
+ //field().subin(quo[i], field().one);
+ field().sub(quo[i], xs_frac[i], nextx[i]);
}
double q = zw_dmax((int)n, &*quo.begin(), 1);
@@ -251,7 +250,7 @@ inline void update_xs(FVector& xs_int, FVector& xs_frac, FVector& x)
{
Float scalar, tmp;
int64_t shifted = ((int64_t)1 << shift);
- _field.init(scalar, (double) shifted);
+ field().init(scalar, (double) shifted);
// make xs_int and xs_frac such that x*scalar = xs_int + xs_frac.
for(size_t i = 0; i < xs_int.size(); ++i){
@@ -269,8 +268,8 @@ inline void update_r(FVector& r, FVector& xs_int)
Float scalar;
size_t n = r.size();
int64_t shifted = ((int64_t)1 << shift);
- _field.init(scalar, (double)shifted);
- FVector y(n);
+ field().init(scalar, (double)shifted);
+ FVector y(field(),n);
//update r = r * 2^shift - Mat*xs_int
_VDF.mulin(r, scalar);
@@ -284,7 +283,7 @@ template <class IMatrix>
inline void update_r_exact(IVector& r_exact, FVector& r, FVector& xs_int, IMatrix &IM){
size_t n = r.size();
- IVector x_i(n), y_i(n);
+ IVector x_i(_ring,n), y_i(_ring,n);
typename Ring::Element scalar = ((int64_t)1 << shift);
@@ -297,14 +296,14 @@ inline void update_r_exact(IVector& r_exact, FVector& r, FVector& xs_int, IMatri
int64_t th = ((int64_t)1 << 52); // double mantissa
Float thresh;
- _field.init(thresh, (double)th);
+ field().init(thresh, (double)th);
debugneol("vnorm " << vnorm);
// r -= Mat * xs_int
- if(_field.mulin(vnorm, mnorm) < thresh){
+ if(field().mulin(vnorm, mnorm) < thresh){
debugneol("Numeric ");
- FVector y(n);
+ FVector y(field(),n);
_numsolver.apply(y, xs_int);
for(size_t i = 0; i < n; ++i)
_ring.init(y_i[i], y[i]);
@@ -323,12 +322,12 @@ inline void update_r_exact(IVector& r_exact, FVector& r, FVector& xs_int, IMatri
typename FVector::iterator rp = r.begin();
typename IVector::iterator rep = r_exact.begin();
for(; rp!= r.end(); ++rp, ++rep)
- _field.init(*rp, *rep);
+ field().init(*rp, *rep);
return;
} // update_r_exact
-// no longer called...
+#if 0 /* no longer called...*/
inline int HadamardBound(integer& B, FMatrix& DM)
{
size_t n = DM.rowdim();
@@ -336,25 +335,27 @@ inline int HadamardBound(integer& B, FMatrix& DM)
B = B * B;
double mnorm_loc = zw_dOOnorm(&*DM.Begin(), n, n);
+ //! @bug this is not good.
// [don't know what this comment is about] should be a check for 2 * mnorm + zw_dmax (n, b, 1);
// TODO what is "b"? from copied code it is the RHS array of doubles
// zw_max just seems to get abs(max value of b)
// next line false, just to compile
- double *b;
+ double *b = NULL;
B *= 2 * mnorm_loc + zw_dmax (n, b, 1); // [don't know what this factor is about]
B <<= 1; // [extra factor of 2 for some reason... ]
return B;
}
+#endif
//update num, *num <- *num * 2^shift + d
inline IVector& update_num (IVector& num, const FVector& d)
{
size_t n = d.size();
- IVector d_i(n);
+ IVector d_i(_ring,n);
for (size_t i = 0; i < n; ++i) {
_ring.init(d_i[i], d[i]);
}
- Int scalar; _ring.init(scalar, 1UL << shift);
+ Int scalar; _ring.init(scalar, uint64_t(1 << shift));
// TODO - analyze GMP shifting capability
_VDR.mulin(num, scalar);
_VDR.addin(num, d_i);
@@ -364,12 +365,12 @@ inline IVector& update_num (IVector& num, const FVector& d)
//update r = r * shift - M d
inline static int update_r_ll (double* r, int n, const double* M, const double* d, int shift)
{
- long long int tmp;
+ // long long int tmp;
double* p1;
const double* p2;
const double* pd;
for (p1 = r, p2 = M; p1 != r + n; ++ p1) {
- tmp = (long long int) *p1;
+ long long int tmp = (long long int) *p1;
tmp <<= shift;
for (pd = d; pd != d + n; ++ pd, ++ p2) {
tmp -= (long long int)*pd * (long long int) *p2;
@@ -400,10 +401,10 @@ inline static double highAbs(FMatrix M)
inline static double zw_dOOnorm(const double* M, int m, int n)
{
double norm = 0;
- double old = 0;
+ // double old = 0;
const double* p;
for (p = M; p != M + (m * n); ) {
- old = norm;
+ double old = norm;
norm = cblas_dasum (n, p ,1);
if (norm < old) norm = old;
p += n;
@@ -418,12 +419,12 @@ inline static double zw_dmax (const int N, const double* a, const int inc)
inline static int zw_hbound (integer& b, int m, int n, const double* M)
{
- double norm = 0;
+ // double norm = 0;
const double* p;
integer tmp;
b = 1;
for (p = M; p != M + (m * n); ) {
- norm = cblas_dnrm2 (n, p ,1);
+ double norm = cblas_dnrm2 (n, p ,1);
tmp = norm;
integer::mulin (b, tmp);
p += n;
@@ -490,11 +491,10 @@ void dumpData(const Matrix &M, const IVector &b, IVector &numx, integer &denx, i
#endif
}
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
// Local Variables:
// mode: C++
// tab-width: 8
// indent-tabs-mode: nil
// c-basic-offset: 8
// End:
-
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/algorithms/rational-solver.h b/linbox/algorithms/rational-solver.h
index 1607804..f4df415 100644
--- a/linbox/algorithms/rational-solver.h
+++ b/linbox/algorithms/rational-solver.h
@@ -40,9 +40,9 @@
// #include "linbox/field/multimod-field.h"
#include "linbox/solutions/methods.h"
#include "linbox/blackbox/archetype.h"
+#include "linbox/matrix/dense-matrix.h"
#include "linbox/blackbox/lambda-sparse.h"
#include "linbox/blackbox/compose.h"
-#include "linbox/matrix/blas-matrix.h"
#include "linbox/algorithms/vector-fraction.h"
#include "linbox/util/timer.h"
@@ -272,6 +272,7 @@ namespace LinBox
_ring(r), _genprime(rp), _traits(traits)
{
+ _genprime.template setBitsField<Field>();
++_genprime; _prime=*_genprime;
#ifdef RSTIMING
clearTimers();
@@ -386,7 +387,10 @@ namespace LinBox
}
#endif
- void chooseNewPrime() const { ++_genprime; _prime = *_genprime; }
+ void chooseNewPrime() const {
+ _genprime.template setBitsField<Field>();
+ ++_genprime; _prime = *_genprime;
+ }
}; // end of specialization for the class RationalSover with Wiedemann traits
@@ -476,6 +480,7 @@ namespace LinBox
_ring(r), _genprime(rp), _traits(traits)
{
+ _genprime.template setBitsField<Field>();
++_genprime; _prime=*_genprime;
#ifdef RSTIMING
clearTimers();
@@ -668,6 +673,7 @@ namespace LinBox
const RandomPrime& rp = RandomPrime(DEFAULT_PRIMESIZE)) :
lastCertificate(r, 0), _genprime(rp), _ring(r)
{
+ _genprime.template setBitsField<Field>();
++_genprime; _prime=*_genprime;
#ifdef RSTIMING
clearTimers();
@@ -812,6 +818,7 @@ namespace LinBox
void chooseNewPrime() const
{
+ _genprime.template setBitsField<Field>();
++_genprime;
_prime = *_genprime;
}
@@ -904,7 +911,7 @@ namespace LinBox
Keep it just for interface consistency.
*/
template <class Ring, class Field, class RandomPrime>
- class RationalSolver<Ring, Field, RandomPrime, NumericalTraits>;
+ class RationalSolver<Ring, Field, RandomPrime, NumSymOverlapTraits>;
/** \brief solver using a hybrid Numeric/Symbolic computation.
*
@@ -920,7 +927,7 @@ namespace LinBox
//template argument Field and RandomPrime are not used.
//Keep it just for interface consistency.
template <class Ring, class Field, class RandomPrime>
- class RationalSolver<Ring, Field, RandomPrime, WanTraits> ;
+ class RationalSolver<Ring, Field, RandomPrime, NumSymNormTraits> ;
/*--------------*/
/* BLOCK HANKEL */
@@ -953,6 +960,7 @@ namespace LinBox
const RandomPrime& rp = RandomPrime(DEFAULT_PRIMESIZE)) :
_genprime(rp), _ring(r)
{
+ _genprime.template setBitsField<Field>();
_prime=_genprime.randomPrime();
}
@@ -1008,6 +1016,7 @@ namespace LinBox
const RandomPrime& rp = RandomPrime(DEFAULT_PRIMESIZE)) :
_genprime(rp), _ring(r)
{
+ _genprime.template setBitsField<Field>();
_prime=_genprime.randomPrime();
}
@@ -1039,11 +1048,10 @@ namespace LinBox
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
// Local Variables:
// mode: C++
// tab-width: 8
// indent-tabs-mode: nil
// c-basic-offset: 8
// End:
-
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/algorithms/rational-solver.inl b/linbox/algorithms/rational-solver.inl
index 08fdf34..7e92d61 100644
--- a/linbox/algorithms/rational-solver.inl
+++ b/linbox/algorithms/rational-solver.inl
@@ -29,7 +29,7 @@
#include "linbox/util/debug.h"
#include "linbox/linbox-config.h"
-#include "linbox/blackbox/sparse.h"
+#include "linbox/matrix/sparse-matrix.h"
#include "linbox/blackbox/lambda-sparse.h"
#include "linbox/blackbox/transpose.h"
#include "linbox/blackbox/diagonal.h"
@@ -49,12 +49,12 @@
#include "linbox/solutions/methods.h"
#include "linbox/blackbox/block-hankel-inverse.h"
-
+#include "linbox/vector/blas-vector.h"
// #ifdef __LINBOX_BLAS_AVAILABLE
#include "linbox/config-blas.h"
-#include "linbox/matrix/blas-matrix.h"
-#include "linbox/algorithms/blas-domain.h"
+#include "linbox/matrix/dense-matrix.h"
+#include "linbox/matrix/matrix-domain.h"
#include "linbox/matrix/factorized-matrix.h"
#include "linbox/util/timer.h"
// #endif
@@ -76,7 +76,7 @@ namespace LinBox
}
template<>
- inline bool checkBlasPrime(const std::vector<integer> p)
+ inline bool checkBlasPrime(const BlasVector<Givaro::ZRing<Integer> > p)
{
bool tmp=true;
for (size_t i=0;i<p.size();++i)
@@ -113,7 +113,8 @@ namespace LinBox
break;
case SS_SINGULAR:
- std::cerr<<"switching to singular\n";
+ commentator().report (Commentator::LEVEL_IMPORTANT, INTERNAL_ERROR) << "switching to singular" << std::endl;
+ //std::cerr<<"switching to singular\n";
status=solveSingular(num, den,A,b);
break;
@@ -185,23 +186,7 @@ namespace LinBox
return SS_SINGULAR;
}
else {
-#if 0
- std::cerr<<"A:\n";
- A.write(std::cerr);
- std::cerr<<"A mod p:\n";
- Ap->write(std::cerr);
- Ring r;
- VectorDomain<Ring> VD(r);
- std::cerr<<"b:\n";
- VD.write(std::cerr,b)<<std::endl;
- std::cerr<<"prime: "<<_prime<<std::endl;
-
- std::cerr<<"non singular\n";
-
- CSRSparseMatrix<Field> csr_Ap(*F,*Ap);
- typedef CSRSparseMatrix<Field> FMatrix;
-#endif
typedef SparseMatrix<Field> FMatrix;
typedef WiedemannLiftingContainer<Ring, Field, IMatrix, FMatrix, FPolynomial> LiftingContainer;
@@ -229,8 +214,7 @@ namespace LinBox
{
std::cerr<<"in singular solver\n";
- typedef std::vector<typename Field::Element> FVector;
- typedef std::vector<typename Ring::Element> IVector;
+ typedef BlasVector<Ring> IVector;
typedef SparseMatrix<Field> FMatrix;
// checking size of system
@@ -280,7 +264,7 @@ namespace LinBox
}
while(((F->isZero(tmp) || MinPoly.size() <=2) && --badprecondition ));
std::cerr<<"minpoly found with size: "<<MinPoly.size()<<std::endl;
- for (size_t i=0;i<MinPoly.size();i++)
+ for (size_t i=0;i<MinPoly.size();++i)
std::cerr<<MinPoly[i]<<"*x^"<<i<<"+";
std::cerr<<std::endl;
@@ -314,7 +298,7 @@ namespace LinBox
#if 0
typename Ring::Element lden;
- _ring. init (lden, 1);
+ _ring. assign (lden, _ring.one);
typename Vector1::iterator p;
for (p = answer.begin(); p != answer.end(); ++ p)
_ring. lcm (lden, lden, p->second);
@@ -498,7 +482,8 @@ namespace LinBox
break;
case SS_SINGULAR:
- std::cerr<<"switching to singular\n";
+ commentator().report (Commentator::LEVEL_IMPORTANT, INTERNAL_ERROR) << "could switch to singular but not doing it(?)" << std::endl;
+ //std::cerr<<"switching to singular\n";
//status=solveSingular(num, den,A,b);
break;
@@ -517,10 +502,10 @@ namespace LinBox
template <class IMatrix, class Vector1, class Vector2>
SolverReturnStatus
RationalSolver<Ring,Field,RandomPrime,BlockWiedemannTraits>::solveNonsingular (Vector1& num,
- Integer& den,
- const IMatrix& A,
- const Vector2& b,
- int maxPrimes) const
+ Integer& den,
+ const IMatrix& A,
+ const Vector2& b,
+ int maxPrimes) const
{
// checking if matrix is square
linbox_check(A.rowdim() == A.coldim());
@@ -536,7 +521,8 @@ namespace LinBox
m = n = sqrt(tmp);
m = n = root(tmp,3); // wrong # args to root. -bds
#endif
- m = n = root(tmproot, tmp,3);
+ // m = n =
+ root(tmproot, tmp,3);
m = n = tmproot;
// std::cout<<"block factor= "<<m<<"\n";;
typedef SparseMatrix<Field> FMatrix;
@@ -608,7 +594,7 @@ namespace LinBox
break;
case SS_FAILED:
- std::cout <<"nonsingular failed\n";
+ //std::cout <<"nonsingular failed\n"; // BDS: in what sense is this part of the spec of solve?
break;
default:
@@ -626,11 +612,11 @@ namespace LinBox
template <class IMatrix, class Vector1, class Vector2>
SolverReturnStatus
RationalSolver<Ring,Field,RandomPrime,DixonTraits>::solveNonsingular(Vector1& num,
- Integer& den,
- const IMatrix& A,
- const Vector2& b,
- bool oldMatrix,
- int maxPrimes) const
+ Integer& den,
+ const IMatrix& A,
+ const Vector2& b,
+ bool oldMatrix,
+ int maxPrimes) const
{
// std::cout<<"DIXON\n\n\n\n";
@@ -650,7 +636,7 @@ namespace LinBox
#if 0
if (trials == maxPrimes) return SS_SINGULAR;
if (trials != 0) chooseNewPrime();
- trials++;
+ ++trials;
#endif
#ifdef DEBUG_DIXON
//std::cout << "_prime: "<<_prime<<"\n";
@@ -676,7 +662,7 @@ namespace LinBox
if (!oldMatrix) {
if (trials == maxPrimes) return SS_SINGULAR;
if (trials != 0) chooseNewPrime();
- trials++;
+ ++trials;
// Could delete a non allocated matrix -> segfault
if (FMP != NULL) delete FMP;
@@ -689,7 +675,7 @@ namespace LinBox
FMP = new BlasMatrix<Field>(*F, A.rowdim(),A.coldim());
- MatrixHom::map (*FMP, A, *F); // use MatrixHom to reduce matrix PG 2005-06-16
+ MatrixHom::map (*FMP, A ); // use MatrixHom to reduce matrix PG 2005-06-16
#if 0
typename BlasMatrix<Field>::Iterator iter_p = FMP->Begin();
typename IMatrix::ConstIterator iter = A.Begin();
@@ -717,8 +703,10 @@ namespace LinBox
ttNonsingularSetup += tNonsingularSetup;
tNonsingularInv.start();
#endif
+ assert(FMP != NULL);
BMDF.invin(*invA, *FMP, notfr); //notfr <- nullity
- if (FMP != NULL) delete FMP;
+ // if (FMP != NULL) // useless
+ delete FMP;
FMP = invA;
#if 0
std::cout << "notfr = " << notfr << std::endl;
@@ -818,7 +806,7 @@ namespace LinBox
int trials = 0;
while (trials < maxPrimes){
if (trials != 0) chooseNewPrime();
- trials++;
+ ++trials;
#ifdef DEBUG_DIXON
std::cout << "_prime: "<<_prime<<"\n";
#endif
@@ -827,7 +815,7 @@ namespace LinBox
#endif
// typedef typename Field::Element Element;
- typedef typename Ring::Element Integer_t;
+ // typedef typename Ring::Element Integer_t;
typedef DixonLiftingContainer<Ring, Field,
BlasMatrix<Ring>, BlasMatrix<Field> > LiftingContainer;
@@ -835,10 +823,6 @@ namespace LinBox
linbox_check(A.rowdim() == b.size());
LinBox::integer tmp;
- Integer_t _rone,_rzero;
- _ring.init(_rone,1);
- _ring.init(_rzero,0);
-
Field F (_prime);
BlasMatrixDomain<Ring> BMDI(_ring);
BlasMatrixDomain<Field> BMDF(F);
@@ -853,18 +837,15 @@ namespace LinBox
// such that
// - TAS_P . (A|b) . TAS_Q has nonzero principal minors up to TAS_rank
// - TAS_Q permutes b to the (TAS_rank)th column of A iff the system is inconsistent mod p
-
BlasMatrix<Field>* TAS_factors = new BlasMatrix<Field>(F, A.coldim()+1, A.rowdim());
Hom<Ring, Field> Hmap(_ring, F);
BlasMatrix<Field> Ap(F, A.rowdim(), A.coldim());
- MatrixHom::map(Ap, A, F);
-
+ MatrixHom::map(Ap, A);
for (size_t i=0;i<A.rowdim();++i)
for (size_t j=0;j<A.coldim();++j)
TAS_factors->setEntry(j,i, Ap.getEntry(i,j));
-
for (size_t i=0;i<A.rowdim();++i){
typename Field::Element tmpe;
F.init(tmpe);
@@ -887,8 +868,8 @@ namespace LinBox
// BlasPermutation<size_t> TAS_Qt = TAS_LQUP->getQ();
std::vector<size_t> srcRow(A.rowdim()), srcCol(A.coldim()+1);
std::vector<size_t>::iterator sri = srcRow.begin(), sci = srcCol.begin();
- for (size_t i=0; i<A.rowdim(); i++, sri++) *sri = i;
- for (size_t i=0; i<A.coldim()+1; i++, sci++) *sci = i;
+ for (size_t i=0; i<A.rowdim(); ++i, ++sri) *sri = i;
+ for (size_t i=0; i<A.coldim()+1; ++i, ++sci) *sci = i;
indexDomain iDom;
BlasMatrixDomain<indexDomain> BMDs(iDom);
BMDs.mulin_right(TAS_Qt, srcCol);
@@ -896,9 +877,9 @@ namespace LinBox
#ifdef DEBUG_INC
std::cout << "P takes (0 1 ...) to (";
- for (size_t i=0; i<A.rowdim(); i++) std::cout << srcRow[i] << ' '; std::cout << ')' << std::endl;
+ for (size_t i=0; i<A.rowdim(); ++i) std::cout << srcRow[i] << ' '; std::cout << ')' << std::endl;
std::cout << "Q takes (0 1 ...) to (";
- for (size_t i=0; i<A.coldim()+1; i++) std::cout << srcCol[i] << ' '; std::cout << ')' << std::endl;
+ for (size_t i=0; i<A.coldim()+1; ++i) std::cout << srcCol[i] << ' '; std::cout << ')' << std::endl;
#endif
bool appearsInconsistent = (srcCol[TAS_rank-1] == A.coldim());
@@ -921,29 +902,29 @@ namespace LinBox
aEmpty &= _ring.isZero(*iter);
}
if (aEmpty) {
- for (size_t i=0; i<b.size(); i++)
- if (!_ring.areEqual(b[i], _rzero)) {
+ for (size_t i=0; i<b.size(); ++i)
+ if (!_ring.areEqual(b[i], _ring.zero)) {
if (level >= SL_CERTIFIED) {
lastCertificate.clearAndResize(b.size());
- _ring.assign(lastCertificate.numer[i], _rone);
+ _ring.assign(lastCertificate.numer[i], _ring.one);
}
return SS_INCONSISTENT;
}
#if 0
// both A and b are all zero.
- for (size_t i=0; i<answer.size(); i++) {
- answer[i].first = _rzero;
- answer[i].second = _rone;
+ for (size_t i=0; i<answer.size(); ++i) {
+ answer[i].first = _ring.zero;
+ answer[i].second = _ring.one;
}
#endif
- _ring. assign (den, _rone);
+ _ring. assign (den, _ring.one);
for (typename Vector1::iterator p = num. begin(); p != num. end(); ++ p)
- _ring. assign (*p, _rzero);
+ _ring. assign (*p, _ring.zero);
if (level >= SL_LASVEGAS)
- _ring.init(lastCertifiedDenFactor, 1);
+ _ring.assign(lastCertifiedDenFactor, _ring.one);
if (level == SL_CERTIFIED) {
- _ring.init(lastZBNumer, 0);
+ _ring.assign(lastZBNumer, _ring.zero);
lastCertificate.clearAndResize(b.size());
}
return SS_OK;
@@ -963,7 +944,7 @@ namespace LinBox
Atp_minor_inv = new BlasMatrix<Field>(F, rank, rank);
- FFPACK::LQUPtoInverseOfFullRankMinor((typename Field::Father_t)F, rank, TAS_factors->getPointer(), A.rowdim(),
+ FFPACK::LQUPtoInverseOfFullRankMinor(F, rank, TAS_factors->getPointer(), A.rowdim(),
TAS_Qt.getPointer(),
Atp_minor_inv->getPointer(), rank);
#ifdef RSTIMING
@@ -982,18 +963,19 @@ namespace LinBox
#ifdef RSTIMING
tCheckConsistency.start();
#endif
- std::vector<Integer> zt(rank);
- for (size_t i=0; i<rank; i++)
+ Givaro::ZRing<Integer> Z;
+ BlasVector<Givaro::ZRing<Integer> > zt(Z,rank);
+ for (size_t i=0; i<rank; ++i)
_ring.assign(zt[i], A.getEntry(srcRow[rank], srcCol[i]));
BlasMatrix<Ring> At_minor(_ring, rank, rank);
- for (size_t i=0; i<rank; i++)
- for (size_t j=0; j<rank; j++)
+ for (size_t i=0; i<rank; ++i)
+ for (size_t j=0; j<rank; ++j)
_ring.assign(At_minor.refEntry(j, i), A.getEntry(srcRow[i], srcCol[j]));
#ifdef DEBUG_INC
At_minor.write(std::cout << "At_minor:" << std::endl);//, _ring);
Atp_minor_inv->write(std::cout << "Atp_minor_inv:" << std::endl);//, F);
- std::cout << "zt: "; for (size_t i=0; i<rank; i++) std::cout << zt[i] <<' '; std::cout << std::endl;
+ std::cout << "zt: "; for (size_t i=0; i<rank; ++i) std::cout << zt[i] <<' '; std::cout << std::endl;
#endif
#ifdef RSTIMING
tCheckConsistency.stop();
@@ -1004,7 +986,8 @@ namespace LinBox
RationalReconstruction<LiftingContainer > re(lc);
- Vector1 short_num(rank); Integer short_den;
+ Vector1 short_num(A.field(),rank);
+ Integer short_den;
if (!re.getRational(short_num, short_den,0))
return SS_FAILED; // dirty, but should not be called
@@ -1018,17 +1001,17 @@ namespace LinBox
cert. denom = short_den;
cert.numer.resize(b.size());
_ring.subin(cert.numer[rank], cert.denom);
- _ring.init(cert.denom, 1);
+ _ring.assign(cert.denom, _ring.one);
BMDI.mulin_left(cert.numer, TAS_P);
#ifdef DEBUG_INC
cert.write(std::cout << "cert:") << std::endl;
#endif
bool certifies = true; //check certificate
- std::vector<Integer> certnumer_A(A.coldim());
+ BlasVector<Ring> certnumer_A(_ring,A.coldim());
BAR.applyVTrans(certnumer_A, A_check, cert.numer);
- typename std::vector<Integer>::iterator cai = certnumer_A.begin();
- for (size_t i=0; certifies && i<A.coldim(); i++, cai++)
+ typename BlasVector<Ring>::iterator cai = certnumer_A.begin();
+ for (size_t i=0; certifies && i<A.coldim(); ++i, ++cai)
certifies &= _ring.isZero(*cai);
#ifdef RSTIMING
tCheckConsistency.stop();
@@ -1038,7 +1021,7 @@ namespace LinBox
if (level == SL_CERTIFIED) lastCertificate.copy(cert);
return SS_INCONSISTENT;
}
- std::cout<<"system is suspected to be inconsistent but it was only a bad prime\n";
+ commentator().report (Commentator::LEVEL_IMPORTANT, PARTIAL_RESULT) << "system is suspected to be inconsistent but it was only a bad prime" << std::endl;
continue; // try new prime. analogous to u.A12 != A22 in Muld.+Storj.
}
@@ -1054,16 +1037,16 @@ namespace LinBox
// use shortcut - transpose Atp_minor_inv to get Ap_minor_inv
Element _rtmp;
Ap_minor_inv = Atp_minor_inv;
- for (size_t i=0; i<rank; i++)
- for (size_t j=0; j<i; j++) {
+ for (size_t i=0; i<rank; ++i)
+ for (size_t j=0; j<i; ++j) {
Ap_minor_inv->getEntry(_rtmp, i, j);
Ap_minor_inv->setEntry(i, j, Ap_minor_inv->refEntry(j, i));
Ap_minor_inv->setEntry(j, i, _rtmp);
}
// permute original entries into A_minor
- for (size_t i=0; i<rank; i++)
- for (size_t j=0; j<rank; j++)
+ for (size_t i=0; i<rank; ++i)
+ for (size_t j=0; j<rank; ++j)
_ring.assign(A_minor.refEntry(i, j), A_check.getEntry(srcRow[i], srcCol[j]));
#ifdef RSTIMING
tMakeConditioner.stop();
@@ -1072,8 +1055,8 @@ namespace LinBox
if (makeMinDenomCert && level >= SL_LASVEGAS){
B = new BlasMatrix<Ring>(_ring, rank, A.coldim());
- for (size_t i=0; i<rank; i++)
- for (size_t j=0; j<A.coldim(); j++)
+ for (size_t i=0; i<rank; ++i)
+ for (size_t j=0; j<A.coldim(); ++j)
_ring.assign(B->refEntry(i, j), A_check.getEntry(srcRow[i],j));
}
}
@@ -1086,8 +1069,8 @@ namespace LinBox
LinBox::integer tmp2=0;
size_t maxBitSize = 0;
- for (size_t i=0; i<rank; i++)
- for (size_t j=0; j<A.coldim(); j++){
+ for (size_t i=0; i<rank; ++i)
+ for (size_t j=0; j<A.coldim(); ++j){
_ring.assign(B->refEntry(i, j), A_check.getEntry(srcRow[i], j));
_ring.convert(tmp2, A_check.getEntry(srcRow[i], j));
maxBitSize = std::max(maxBitSize, tmp2.bitsize());
@@ -1110,9 +1093,9 @@ namespace LinBox
typename BlasMatrix<Ring>::Iterator iter;
for (iter = P->Begin(); iter != P->End(); ++iter) {
if (rand() > RAND_MAX/2)
- _ring.assign(*iter, _rone);
+ _ring.assign(*iter, _ring.one);
else
- _ring.assign(*iter, _rzero);
+ _ring.assign(*iter, _ring.zero);
}
// compute A_minor = B.P
@@ -1124,7 +1107,7 @@ namespace LinBox
double *P_dbl= new double[A.coldim()*rank];
double *A_minor_dbl = new double[rank*rank];
for (size_t i=0;i<rank;++i)
- for (size_t j=0;j<A.coldim(); j++){
+ for (size_t j=0;j<A.coldim(); ++j){
_ring.convert(B_dbl[j+i*A.coldim()], B->getEntry(i,j));
_ring.convert(P_dbl[i+j*rank], P->getEntry(j,i));
}
@@ -1157,7 +1140,7 @@ namespace LinBox
ttMakeConditioner += tMakeConditioner;
tInvertBP.start();
#endif
- BMDF.inv(*Ap_minor_inv, Ap_minor, nullity);
+ BMDF.inv((BlasMatrix<Field>&)*Ap_minor_inv, (BlasMatrix<Field>&)Ap_minor, nullity);
#ifdef RSTIMING
tInvertBP.stop();
ttInvertBP += tInvertBP;
@@ -1165,7 +1148,7 @@ namespace LinBox
} while (nullity > 0);
}
// Compute newb = (TAS_P.b)[0..(rank-1)]
- std::vector<Integer> newb(b);
+ BlasVector<Ring> newb(b);
BMDI.mulin_right(TAS_P, newb);
newb.resize(rank);
@@ -1183,7 +1166,7 @@ namespace LinBox
#endif
RationalReconstruction<LiftingContainer > re(lc);
- Vector1 short_num(rank); Integer short_den;
+ Vector1 short_num(_ring,rank); Integer short_den;
if (!re.getRational(short_num, short_den,0))
return SS_FAILED; // dirty, but should not be called
@@ -1198,13 +1181,13 @@ namespace LinBox
if (!randomSolution) {
// short_answer = TAS_Q * short_answer
- answer_to_vf.numer.resize(A.coldim()+1,_rzero);
+ answer_to_vf.numer.resize(A.coldim()+1,_ring.zero);
BMDI.mulin_left(answer_to_vf.numer, TAS_Qt);
answer_to_vf.numer.resize(A.coldim());
}
else {
// short_answer = P * short_answer
- typename Vector<Ring>::Dense newNumer(A.coldim());
+ BlasVector<Ring> newNumer(_ring,A.coldim());
BAR.applyV(newNumer, *P, answer_to_vf.numer);
//BAR.applyVspecial(newNumer, *P, answer_to_vf.numer);
@@ -1213,18 +1196,18 @@ namespace LinBox
if (level >= SL_LASVEGAS) { //check consistency
- std::vector<Integer> A_times_xnumer(b.size());
+ BlasVector<Ring> A_times_xnumer(_ring,b.size());
BAR.applyV(A_times_xnumer, A_check, answer_to_vf.numer);
Integer tmpi;
typename Vector2::const_iterator ib = b.begin();
- typename std::vector<Integer>::iterator iAx = A_times_xnumer.begin();
+ typename BlasVector<Ring>::iterator iAx = A_times_xnumer.begin();
int thisrow = 0;
bool needNewPrime = false;
- for (; !needNewPrime && ib != b.end(); iAx++, ib++, thisrow++)
+ for (; !needNewPrime && ib != b.end(); ++iAx, ++ib, ++thisrow)
if (!_ring.areEqual(_ring.mul(tmpi, *ib, answer_to_vf.denom), *iAx)) {
// should attempt to certify inconsistency now
// as in "if [A31 | A32]y != b3" of step (4)
@@ -1258,15 +1241,15 @@ namespace LinBox
#endif
Integer _rtmp;
Element _ftmp;
- for (size_t i=0; i<rank; i++)
- for (size_t j=0; j<i; j++) {
+ for (size_t i=0; i<rank; ++i)
+ for (size_t j=0; j<i; ++j) {
Ap_minor_inv->getEntry(_ftmp, i, j);
Ap_minor_inv->setEntry(i, j, Ap_minor_inv->refEntry(j, i));
Ap_minor_inv->setEntry(j, i, _ftmp);
}
- for (size_t i=0; i<rank; i++)
- for (size_t j=0; j<i; j++) {
+ for (size_t i=0; i<rank; ++i)
+ for (size_t j=0; j<i; ++j) {
A_minor.getEntry(_rtmp, i, j);
A_minor.setEntry(i, j, A_minor.refEntry(j, i));
A_minor.setEntry(j, i, _rtmp);
@@ -1289,19 +1272,20 @@ namespace LinBox
// so it corresponds to b instead of newb
//q in {0, 1}^rank
- std::vector<Integer> q(rank);
- typename std::vector<Integer>::iterator q_iter;
+ Givaro::ZRing<Integer> Z;
+ BlasVector<Givaro::ZRing<Integer> > q(Z,rank);
+ typename BlasVector<Givaro::ZRing<Integer> >::iterator q_iter;
bool allzero;
do {
allzero = true;
for (q_iter = q.begin(); q_iter != q.end(); ++q_iter) {
if (rand() > RAND_MAX/2) {
- (*q_iter) = _rone;
+ _ring.assign((*q_iter), _ring.one);
allzero = false;
}
else
- (*q_iter) = _rzero;
+ (*q_iter) = _ring.zero;
}
} while (allzero);
#ifdef RSTIMING
@@ -1312,7 +1296,7 @@ namespace LinBox
LiftingContainer lc2(_ring, F, A_minor, *Ap_minor_inv, q, _prime);
RationalReconstruction<LiftingContainer> rere(lc2);
- Vector1 u_num(rank); Integer u_den;
+ Vector1 u_num(_ring,rank); Integer u_den;
if (!rere.getRational(u_num, u_den,0)) return SS_FAILED;
#ifdef RSTIMING
@@ -1323,18 +1307,18 @@ namespace LinBox
VectorFraction<Ring> u_to_vf(_ring, u_num.size());
u_to_vf. numer = u_num;
u_to_vf. denom = u_den;
- std::vector<Integer> uB(A.coldim());
+ BlasVector<Ring> uB(_ring,A.coldim());
BAR.applyVTrans(uB, *B, u_to_vf.numer);
#if 0
std::cout << "BP: ";
A_minor.write(std::cout, _ring) << std::endl;
std::cout << "q: ";
- for (size_t i=0; i<rank; i++) std::cout << q[i]; std::cout << std::endl;
+ for (size_t i=0; i<rank; ++i) std::cout << q[i]; std::cout << std::endl;
u_to_vf.write(std::cout << "u: ") << std::endl;
#endif
- Integer numergcd = _rzero;
+ Integer numergcd = _ring.zero;
vectorGcdIn(numergcd, _ring, uB);
// denom(partial_cert . Mr) = partial_cert_to_vf.denom / numergcd
@@ -1386,29 +1370,25 @@ namespace LinBox
template <class IMatrix, class Vector1, class Vector2>
SolverReturnStatus
RationalSolver<Ring,Field,RandomPrime,BlockHankelTraits>::solveNonsingular(Vector1& num,
- Integer& den,
- const IMatrix& A,
- const Vector2& b,
- size_t blocksize,
- int maxPrimes) const
+ Integer& den,
+ const IMatrix& A,
+ const Vector2& b,
+ size_t blocksize,
+ int maxPrimes) const
{
linbox_check(A.rowdim() == A.coldim());
linbox_check(A.rowdim() % blocksize == 0);
- typedef typename Field::Element Element_t;
-
-
// reduce the matrix mod p
Field F(_prime);
typedef typename IMatrix::template rebind<Field>::other FMatrix;
- FMatrix Ap(F, A.rowdim(), A.coldim());
- typename IMatrix::template rebind<Field>()( Ap, A, F);
+ FMatrix Ap(A, F);
// precondition Ap with a random diagonal Matrix
typename Field::RandIter G(F,0,123456);
- std::vector<Element_t> diag(Ap.rowdim());
+ BlasVector<Field> diag(F,Ap.rowdim());
for(size_t i=0;i<Ap.rowdim();++i){
do {
@@ -1418,7 +1398,7 @@ namespace LinBox
- Diagonal<Field> D(F, diag);
+ Diagonal<Field> D(diag);
Compose<Diagonal<Field>, FMatrix> DAp(D,Ap);
@@ -1453,7 +1433,7 @@ namespace LinBox
// compute the inverse of the Hankel matrix associated with the Krylov Sequence
BlockHankelInverse<Field> Hinv(F, Seq.getRep());
- std::vector<Element_t> y(n), x(n, 1);
+ BlasVector<Field> y(F,n), x(F,n, F.one);
#ifdef RSTIMING
chrono.stop();
@@ -1497,19 +1477,18 @@ namespace LinBox
typedef typename Field::Element Element_t;
// reduce the matrix mod p
- Field F(_prime);
+ const Field F(_prime);
typedef typename IMatrix::template rebind<Field>::other FMatrix;
- FMatrix Ap(F, A.rowdim(), A.coldim());
- typename IMatrix::template rebind<Field>()( Ap, A, F);
+ FMatrix Ap(A, F);
// compute LQUP Factorization
- Permutation<Field> P(A.coldim(),F),Q(A.rowdim(),F);
+ Permutation<Field> P((int)A.coldim(),F),Q((int)A.rowdim(),F);
FMatrix L(F, A.rowdim(), A.rowdim());
unsigned long rank;
Element_t det;
GaussDomain<Field> GD(F);
- GD.QLUPin(rank,det,Q,L,*Ap,P,Ap->rowdim(), Ap->coldim());
+ GD.QLUPin(rank,det,Q,L,Ap,P,Ap.rowdim(), Ap.coldim());
if (rank != A.rowdim()) {
#if 0
throw LinboxError ("ERROR in DIXON SparseLU: singular matrix or bad prime");
@@ -1519,8 +1498,8 @@ namespace LinBox
// Therefore, prune unnecessary elements
// in those last columns of U
size_t origNNZ=0,newNNZ=0;
- for(typename FMatrix::RowIterator row=Ap->rowBegin();
- row != Ap->rowEnd(); ++row) {
+ for(typename FMatrix::RowIterator row=Ap.rowBegin();
+ row != Ap.rowEnd(); ++row) {
if (row->size()) {
origNNZ += row->size();
size_t ns=0;
@@ -1539,7 +1518,7 @@ namespace LinBox
typedef SparseLULiftingContainer<Ring,Field,IMatrix,FMatrix> LiftingContainer;
- LiftingContainer lc(_ring, F, A, L, Q, *Ap, P, rank, b, _prime);
+ LiftingContainer lc(_ring, F, A, L, Q, Ap, P, rank, b, _prime);
RationalReconstruction<LiftingContainer > re(lc);
if (!re.getRational(num, den, 0))
@@ -1556,11 +1535,10 @@ namespace LinBox
#endif //__LINBOX_rational_solver_INL
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
// Local Variables:
// mode: C++
// tab-width: 8
// indent-tabs-mode: nil
// c-basic-offset: 8
// End:
-
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/algorithms/rational-solver2.h b/linbox/algorithms/rational-solver2.h
index affb886..1f7e6ae 100644
--- a/linbox/algorithms/rational-solver2.h
+++ b/linbox/algorithms/rational-solver2.h
@@ -36,7 +36,7 @@
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
-#include <math.h>
+#include <cmath>
#include "linbox/integer.h"
#include "linbox/algorithms/rational-reconstruction2.h"
@@ -56,7 +56,7 @@ namespace LinBox
//template argument Field and RandomPrime are not used.
//Keep it just for interface consistency.
template <class Ring, class Field, class RandomPrime>
- class RationalSolver<Ring, Field, RandomPrime, WanTraits> {
+ class RationalSolver<Ring, Field, RandomPrime, NumSymNormTraits> {
protected:
Ring r;
@@ -69,7 +69,7 @@ namespace LinBox
{}
-#if __LINBOX_HAVE_LAPACK
+#ifdef __LINBOX_HAVE_CLAPACK
template <class IMatrix, class OutVector, class InVector>
SolverReturnStatus solve(OutVector& num, Integer& den,
const IMatrix& M, const InVector& b) const
@@ -122,6 +122,7 @@ namespace LinBox
integer* numx = new integer[n];
integer denx;
int ret;
+ //!@bug don't use cblas_, we should use only fflas-ffpack (if not interfaced in LinBox::)
ret = cblas_rsol (n, DM, numx, denx, Db);
delete[] DM; delete[] Db;
@@ -169,7 +170,7 @@ namespace LinBox
/** compute the hadamard bound*/
inline static int cblas_hbound (integer& b, int m, int n, const double* M);
-#if __LINBOX_HAVE_LAPACK
+#if __LINBOX_HAVE_CLAPACK
// compute the inverse of a general matrix
inline static int cblas_dgeinv(double* M, int n);
/* solve Ax = b
@@ -184,16 +185,17 @@ namespace LinBox
inline static int cblas_rsol (int n, const double* M, integer* numx, integer& denx, double* b);
#endif
};
-#if __LINBOX_HAVE_LAPACK
+#if __LINBOX_HAVE_CLAPACK
template <class Ring, class Field, class RandomPrime>
- inline int RationalSolver<Ring, Field, RandomPrime, WanTraits>::cblas_dgeinv(double* M, int n)
+ inline int RationalSolver<Ring, Field, RandomPrime, NumSymNormTraits>::cblas_dgeinv(double* M, int n)
{
enum CBLAS_ORDER order = CblasRowMajor;
int lda = n;
int *P = new int[n];
int ierr = clapack_dgetrf (order, n, n, M, lda, P);
if (ierr != 0) {
- std::cerr << "In RationalSolver::cblas_dgeinv Matrix is not full rank" << std::endl;
+ commentator().report (Commentator::LEVEL_IMPORTANT, PARTIAL_RESULT)
+ /*std::cerr*/ << "In RationalSolver::cblas_dgeinv Matrix is not full rank" << std::endl;
delete[] P ;
return -1;
}
@@ -203,11 +205,11 @@ namespace LinBox
}
template <class Ring, class Field, class RandomPrime>
- inline int RationalSolver<Ring, Field, RandomPrime, WanTraits>::cblas_rsol (int n, const double* M, integer* numx, integer& denx, double* b)
+ inline int RationalSolver<Ring, Field, RandomPrime, NumSymNormTraits>::cblas_rsol (int n, const double* M, integer* numx, integer& denx, double* b)
{
if (n < 1) return 0;
double* IM = new double[n * n];
- memcpy ((void*)IM, (const void*)M, sizeof(double)*n*n);
+ memcpy ((void*)IM, (const void*)M, sizeof(double)*(size_t)(n*n));
int ret;
//compute the inverse by flops
ret = cblas_dgeinv (IM, n);
@@ -242,7 +244,7 @@ namespace LinBox
//double log2 = log (2.0);
double log2 = M_LN2;
// r = b
- memcpy ((void*) r, (const void*) b, sizeof(double)*n);
+ memcpy ((void*) r, (const void*) b, sizeof(double)*(size_t)n);
do {
cblas_dapply (n, n, IM, r, x);
@@ -251,7 +253,7 @@ namespace LinBox
// compute ax = ax -r, the negative of residual
cblas_daxpy (n, -1, r, 1, ax, 1);
// compute possible shift
- double normr1, normr2, normr3, shift1, shift2;
+ double normr1, normr2, normr3, shift2;
normr1 = cblas_dmax(n, r, 1);
normr2 = cblas_dmax(n, ax, 1);
normr3 = cblas_dmax(n, x, 1);
@@ -260,7 +262,7 @@ namespace LinBox
if (normr2 <.0000000001)
shift = 30;
else {
- shift1 = floor(log (normr1 / normr2) / log2) - 2;
+ double shift1 = floor(log (normr1 / normr2) / log2) - 2;
shift = (int)(30 < shift1 ? 30 : shift1);
}
@@ -324,8 +326,8 @@ namespace LinBox
++ p_mpz;
++ p_x;
- int sgn;
for (; p_mpz != num + n; ++ p_mpz, ++ p_x) {
+ int sgn;
sgn = sign (*p_mpz);
tmp_mpz = denx * (*p_mpz);
tmp_mpz = abs (tmp_mpz);
@@ -420,14 +422,14 @@ namespace LinBox
template <class Ring, class Field, class RandomPrime>
/* apply y <- Ax */
- inline int RationalSolver<Ring, Field, RandomPrime, WanTraits>::cblas_dapply (int m, int n, const double* A, const double* x, double* y)
+ inline int RationalSolver<Ring, Field, RandomPrime, NumSymNormTraits>::cblas_dapply (int m, int n, const double* A, const double* x, double* y)
{
cblas_dgemv (CblasRowMajor, CblasNoTrans, m, n, 1, A, n, x, 1, 0, y, 1);
return 0;
}
template <class Ring, class Field, class RandomPrime>
- inline int RationalSolver<Ring, Field, RandomPrime, WanTraits>::cblas_mpzapply (int m, int n, const double* A, const integer* x, integer* y)
+ inline int RationalSolver<Ring, Field, RandomPrime, NumSymNormTraits>::cblas_mpzapply (int m, int n, const double* A, const integer* x, integer* y)
{
const double* p_A;
const integer* p_x;
@@ -438,7 +440,7 @@ namespace LinBox
for (p_x = x; p_x != x + n; ++ p_x, ++ p_A) {
//mpz_set_d (tmp, *p_A);
//mpz_addmul_si (*p_y, *p_x, (int)(*p_A));
- tmp = *p_x * (long long int)(*p_A);
+ tmp = *p_x * (int64_t)(*p_A);
integer::addin (*p_y, tmp);
}
}
@@ -447,7 +449,7 @@ namespace LinBox
template <class Ring, class Field, class RandomPrime>
template <class Elt>
- inline int RationalSolver<Ring, Field, RandomPrime, WanTraits>::printvec (const Elt* v, int n)
+ inline int RationalSolver<Ring, Field, RandomPrime, NumSymNormTraits>::printvec (const Elt* v, int n)
{
const Elt* p;
std::cout << '[';
@@ -459,7 +461,7 @@ namespace LinBox
template <class Ring, class Field, class RandomPrime>
//update num, *num <- *num * 2^shift + d
- inline int RationalSolver<Ring, Field, RandomPrime, WanTraits>::update_num (integer* num, int n, const double* d, int shift)
+ inline int RationalSolver<Ring, Field, RandomPrime, NumSymNormTraits>::update_num (integer* num, int n, const double* d, int shift)
{
integer* p_mpz;
integer tmp_mpz;
@@ -474,13 +476,13 @@ namespace LinBox
template <class Ring, class Field, class RandomPrime>
//update r = r * shift - M d
- inline int RationalSolver<Ring, Field, RandomPrime, WanTraits>::update_r_int (double* r, int n, const double* M, const double* d, int shift)
+ inline int RationalSolver<Ring, Field, RandomPrime, NumSymNormTraits>::update_r_int (double* r, int n, const double* M, const double* d, int shift)
{
- int tmp;
double* p1;
const double* p2;
const double* pd;
for (p1 = r, p2 = M; p1 != r + n; ++ p1) {
+ int tmp;
tmp = (int)(long long int) *p1;
tmp <<= shift;
for (pd = d; pd != d + n; ++ pd, ++ p2) {
@@ -493,13 +495,13 @@ namespace LinBox
template <class Ring, class Field, class RandomPrime>
//update r = r * shift - M d
- inline int RationalSolver<Ring, Field, RandomPrime, WanTraits>::update_r_ll (double* r, int n, const double* M, const double* d, int shift)
+ inline int RationalSolver<Ring, Field, RandomPrime, NumSymNormTraits>::update_r_ll (double* r, int n, const double* M, const double* d, int shift)
{
- long long int tmp;
double* p1;
const double* p2;
const double* pd;
for (p1 = r, p2 = M; p1 != r + n; ++ p1) {
+ long long int tmp;
tmp = (long long int) *p1;
tmp <<= shift;
for (pd = d; pd != d + n; ++ pd, ++ p2) {
@@ -511,12 +513,12 @@ namespace LinBox
}
template <class Ring, class Field, class RandomPrime>
- inline double RationalSolver<Ring, Field, RandomPrime, WanTraits>::cblas_dOOnorm(const double* M, int m, int n)
+ inline double RationalSolver<Ring, Field, RandomPrime, NumSymNormTraits>::cblas_dOOnorm(const double* M, int m, int n)
{
double norm = 0;
- double old = 0;
const double* p;
for (p = M; p != M + (m * n); ) {
+ double old = 0;
old = norm;
norm = cblas_dasum (n, p ,1);
if (norm < old) norm = old;
@@ -526,19 +528,19 @@ namespace LinBox
}
template <class Ring, class Field, class RandomPrime>
- inline double RationalSolver<Ring, Field, RandomPrime, WanTraits>::cblas_dmax (const int N, const double* a, const int inc)
+ inline double RationalSolver<Ring, Field, RandomPrime, NumSymNormTraits>::cblas_dmax (const int N, const double* a, const int inc)
{
return fabs(a[cblas_idamax (N, a, inc)]);
}
template <class Ring, class Field, class RandomPrime>
- inline int RationalSolver<Ring, Field, RandomPrime, WanTraits>::cblas_hbound (integer& b, int m, int n, const double* M)
+ inline int RationalSolver<Ring, Field, RandomPrime, NumSymNormTraits>::cblas_hbound (integer& b, int m, int n, const double* M)
{
- double norm = 0;
const double* p;
integer tmp;
b = 1;
for (p = M; p != M + (m * n); ) {
+ double norm = 0;
norm = cblas_dnrm2 (n, p ,1);
tmp = norm;
integer::mulin (b, tmp);
@@ -553,11 +555,10 @@ namespace LinBox
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
// Local Variables:
// mode: C++
// tab-width: 8
// indent-tabs-mode: nil
// c-basic-offset: 8
// End:
-
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/algorithms/rns.h b/linbox/algorithms/rns.h
index 0c1188d..c9b603d 100644
--- a/linbox/algorithms/rns.h
+++ b/linbox/algorithms/rns.h
@@ -1,6 +1,6 @@
/* Copyright (C) 2011 LinBox
- * Written by BB <brice.boyer at imag.fr>
+ * Written by Brice Boyer (briceboyer) <boyer.brice at gmail.com>
*
*
*
@@ -52,7 +52,7 @@ namespace LinBox
private:
typedef std::vector<unsigned long> Fvect ;
typedef std::vector<integer> Ivect ;
- typedef Modular<double> Field ;
+ typedef Givaro::Modular<double> Field ;
Fvect _primes_; //!< vector of integers, pairwise coprime (or pairwise different primes)
unsigned long _size_; //!< number of primes
@@ -128,7 +128,7 @@ namespace LinBox
private:
typedef std::vector<unsigned long> Fvect ;
typedef std::vector<integer> Ivect ;
- typedef Modular<double> Field ;
+ typedef Givaro::Modular<double> Field ;
Fvect _primes_; //!< vector of integers, pairwise coprime (or pairwise different primes)
unsigned long _size_; //!< number of primes
diff --git a/linbox/algorithms/rns.inl b/linbox/algorithms/rns.inl
index 84aa30c..31d8149 100644
--- a/linbox/algorithms/rns.inl
+++ b/linbox/algorithms/rns.inl
@@ -1,6 +1,6 @@
/* Copyright (C) 2011 LinBox
- * Written by BB <brice.boyer at imag.fr>
+ * Written by Brice Boyer (briceboyer) <boyer.brice at gmail.com>
*
*
*
@@ -263,7 +263,7 @@ namespace LinBox
std::vector<std::vector<double> > residues(_size_);
for (size_t i = 0 ; i < _size_ ; ++i) {
residues[i].resize(result.size());
- unitCRA(residues[i],Modular<double>(_Primes_[i]));
+ unitCRA(residues[i],Givaro::Modular<double>(_Primes_[i]));
}
for (size_t i = 0 ; i < result.size() ; ++i) {
diff --git a/linbox/algorithms/short-vector.h b/linbox/algorithms/short-vector.h
index 6e122ed..3997972 100644
--- a/linbox/algorithms/short-vector.h
+++ b/linbox/algorithms/short-vector.h
@@ -37,7 +37,7 @@
*/
#include <iostream>
-#include "linbox/field/PID-integer.h"
+#include "givaro/zring.h"
#include "linbox/util/timer.h"
#include "linbox/integer.h"
#include <algorithm>
@@ -48,7 +48,7 @@
#else
#error "you need fplll here"
#endif
-#include <math.h>
+#include <cmath>
@@ -151,7 +151,7 @@ namespace LinBox
inline void maxpyin(integer r[3], const integer &a, const integer y[3])
{
if ((a.bitsize()<32) && (a >= 0)){
- unsigned long aa= a;
+ uint64_t aa= a;
mpz_submul_ui(r[0].get_mpz(), y[0].get_mpz_const(), aa);
mpz_submul_ui(r[1].get_mpz(), y[1].get_mpz_const(), aa);
mpz_submul_ui(r[2].get_mpz(), y[2].get_mpz_const(), aa);
@@ -166,7 +166,7 @@ namespace LinBox
inline void axpyin(integer r[3], const integer &a, const integer y[3])
{
if ((a.bitsize()<32) && (a >= 0)){
- unsigned long aa= a;
+ uint64_t aa= a;
mpz_addmul_ui(r[0].get_mpz(), y[0].get_mpz_const(), aa);
mpz_addmul_ui(r[1].get_mpz(), y[1].get_mpz_const(), aa);
mpz_addmul_ui(r[2].get_mpz(), y[2].get_mpz_const(), aa);
@@ -446,8 +446,8 @@ namespace LinBox
void print()
{
- PID_integer Z;
- BlasMatrix<PID_integer> M(Z,3,3);
+ Givaro::ZRing<Integer> Z;
+ BlasMatrix<Givaro::ZRing<Integer> > M(Z,3,3);
M.setEntry(0,0,b1[0]);
M.setEntry(0,1,b1[1]);
M.setEntry(0,2,b1[2]);
@@ -511,7 +511,7 @@ namespace LinBox
else{
// x = (_m* 0x1P53);//9007199254740992;
x = (_m* 9007199254740992UL);
- x = x<<(_e-53);
+ x = x<<(int64_t(_e)-53);
return x;
}
}
diff --git a/linbox/algorithms/sigma-basis.h b/linbox/algorithms/sigma-basis.h
index ab4a436..2929cf8 100644
--- a/linbox/algorithms/sigma-basis.h
+++ b/linbox/algorithms/sigma-basis.h
@@ -31,10 +31,10 @@
#include "linbox/util/commentator.h"
#include "linbox/util/timer.h"
-#include "linbox/algorithms/blas-domain.h"
-#include "linbox/field/unparametric.h"
#include "linbox/matrix/matrix-domain.h"
-#include "linbox/matrix/blas-matrix.h"
+#include <givaro/zring.h>
+#include "linbox/matrix/matrix-domain.h"
+#include "linbox/matrix/dense-matrix.h"
#include "linbox/matrix/factorized-matrix.h"
#include "linbox/algorithms/matpoly-mult.h"
@@ -48,6 +48,7 @@
/*! @file algorithms/sigma-basis.h
* @brief \f$\sigma\f$-basis (minimal basis).
*/
+#define MBASIS_THRESHOLD 16
namespace LinBox
{
@@ -67,8 +68,9 @@ namespace LinBox
typedef typename Field::Element Element;
typedef BlasMatrix<Field> Coefficient;
+ inline const Field & field() const { return *_field; }
private:
- Field _field;
+ const Field * _field;
BlasMatrixDomain<Field> _BMD;
MatrixDomain<Field> _MD;
std::vector<Coefficient> &_Serie;
@@ -134,7 +136,7 @@ namespace LinBox
public:
SigmaBasis(const Field &F, std::vector<Coefficient> &PowerSerie) :
- _field(F), _BMD(F), _MD(F), _Serie(PowerSerie), PM_domain(F)
+ _field(&F), _BMD(F), _MD(F), _Serie(PowerSerie), PM_domain(F)
{
#ifdef _BM_TIMING
clearTimer();
@@ -151,7 +153,7 @@ namespace LinBox
size_t m = _Serie[0].rowdim();
size_t n = _Serie[0].coldim();
- const Coefficient TransposedZero(n,m);
+ const Coefficient TransposedZero(field(),n,m);
// take the transposed of the Serie and use PM_Basis
std::vector<Coefficient> TransposedSerie (length, TransposedZero);
@@ -161,7 +163,7 @@ namespace LinBox
for (size_t j=0;j<n;++j)
TransposedSerie[k].setEntry(j,i, _Serie[k].getEntry(i,j));
- const Coefficient Zero(n, n);
+ const Coefficient Zero(field(),n, n);
// Prepare SigmaBase
SigmaBase.resize(degree+1, Zero);
@@ -176,7 +178,7 @@ namespace LinBox
{
const size_t m = _Serie[0].rowdim();
- const Coefficient Zero(m, m);
+ const Coefficient Zero(field(), m, m);
// Prepare SigmaBase
SigmaBase.resize(degree+1, Zero);
@@ -198,8 +200,8 @@ namespace LinBox
const size_t m = _Serie[0].rowdim();
const size_t n = _Serie[0].coldim();
- const Coefficient Zero(m, m);
- const Coefficient ZeroSerie(m,n);
+ const Coefficient Zero(field(),m, m);
+ const Coefficient ZeroSerie(field(),m,n);
// Prepare SigmaBases
@@ -238,8 +240,8 @@ namespace LinBox
size_t length=_Serie.size();
size_t m = _Serie[0].rowdim();
size_t n = _Serie[0].coldim();
- const Coefficient TransposedZero(n,m);
- const Coefficient Zero(n, n);
+ const Coefficient TransposedZero(field(),n,m);
+ const Coefficient Zero(field(),n, n);
// take the transposed of the Serie and use PM_Basis
std::vector<Coefficient> TransposedSerie (length, TransposedZero);
@@ -295,7 +297,7 @@ namespace LinBox
// transpose the PowerSerie
- const Coefficient Zero(m,n);
+ const Coefficient Zero(field(),m,n);
std::vector<Coefficient> TransPowerSerie(deg,Zero);
for (size_t i=0;i<deg;++i){
for (size_t j=0;j<m;++j)
@@ -344,7 +346,7 @@ namespace LinBox
// transpose the PowerSerie
- const Coefficient Zero(m,n);
+ const Coefficient Zero(field(),m,n);
std::vector<Coefficient> TransPowerSerie(deg,Zero);
for (size_t i=0;i<deg;++i){
for (size_t j=0;j<m;++j)
@@ -379,25 +381,24 @@ namespace LinBox
//
// SigmaBase must be already allocated with degree+1 elements
// PowerSerie must have at least degree+1 element
-#define MBASIS_THRESHOLD 16
template <class Polynomial1, class Polynomial2>
- void PM_Basis(Polynomial1 &SigmaBase,
+ void PM_Basis(Polynomial1 &SigmaBase,
const Polynomial2 &PowerSerie,
- size_t degree,
- std::vector<size_t> &defect)
+ size_t degree,
+ std::vector<size_t> &defect)
{
size_t m,n;
m = PowerSerie[0].rowdim();
n = PowerSerie[0].coldim();
- const Coefficient ZeroSigma(m,m);
- const Coefficient ZeroSerie(m,n);
+ const Coefficient ZeroSigma(field(),m,m);
+ const Coefficient ZeroSerie(field(),m,n);
if (degree == 0) {
- Coefficient Identity(m,m);
+ Coefficient Identity(field(),m,m);
for (size_t i=0;i< m;++i)
- Identity.setEntry(i,i,_field.one);
+ Identity.setEntry(i,i,field().one);
SigmaBase[0]=Identity;
}
@@ -445,7 +446,7 @@ namespace LinBox
//PM_domain.midproduct(Serie2,Sigma1,PowerSerie);
ComputeNewSerie(Serie2,Sigma1,PowerSerie, degree1, degree2);
- Serie2.resize(degree2+1);
+ Serie2.resize(degree2+1,ZeroSerie);
#ifdef _BM_TIMING
tUpdateSerie.stop();ttUpdateSerie += tUpdateSerie;
@@ -477,7 +478,7 @@ namespace LinBox
// algorithm is from Giorgi, Jeannerod and Villard ISSAC'03
template <class Polynomial1, class Polynomial2>
void M_Basis(Polynomial1 &SigmaBase,
- Polynomial2 PowerSerie,
+ Polynomial2 &PowerSerie,
size_t length,
std::vector<size_t> &defect)
{
@@ -489,15 +490,16 @@ namespace LinBox
n = PowerSerie[0].coldim();
// Set some useful constants
- const Coefficient Zero(m,m);
+ const Coefficient Zero(field(),m,m);
// Reserve memory for the Sigma Base and set SigmaBase[0] to Identity
SigmaBase.reserve(length+1);
- SigmaBase.resize(1);
- Coefficient Identity(m,m);
+ SigmaBase.resize(1,Zero);
+ Coefficient Identity(field(),m,m);
for (size_t i=0;i< m;++i)
- Identity.setEntry(i,i,_field.one);
- SigmaBase[0]=Identity;
+ Identity.setEntry(i,i,field().one);
+ // SigmaBase.resize(1,Identity) won't work
+ SigmaBase[0] = Identity;
// Keep track on Sigma Base's row degree
// I adjust the degree with the maximal difference between defects
@@ -514,7 +516,7 @@ namespace LinBox
// Discrepancy
- Coefficient Discrepancy(m,n);
+ Coefficient Discrepancy(field(),m,n);
Timer chrono;
#ifdef _BM_TIMING
int cptr=0;
@@ -533,7 +535,7 @@ namespace LinBox
for (size_t i=0;i<m;++i) {
size_t idx_min=i;
for (size_t j=i+1;j<m;++j)
- if (defect[j]< defect[idx_min])
+ if (defect[(size_t)j]< defect[idx_min])
idx_min=j;
std::swap(defect[i], defect[idx_min]);
Perm1[i]=idx_min;
@@ -562,10 +564,11 @@ namespace LinBox
chrono.start();
#endif
// Compute Discrepancy
- _BMD.mul(Discrepancy,SigmaBase[0],PowerSerie[k]);
+ _BMD.mul(Discrepancy,SigmaBase[0],PowerSerie[k]);
for (size_t i=1;i<SigmaBase.size();++i){
_BMD.axpyin(Discrepancy,SigmaBase[i],PowerSerie[k-i]);
}
+
#ifdef _BM_TIMING
cptr+=SigmaBase.size();
chrono.stop();
@@ -575,7 +578,7 @@ namespace LinBox
#endif
//std::cout<<"MBasis: Discrepancy\n";
- //Discrepancy.write(std::cout,_field);
+ //Discrepancy.write(std::cout,field());
// Compute LQUP of Discrepancy
@@ -584,8 +587,8 @@ namespace LinBox
LQUPMatrix<Field> LQUP(Discrepancy,P,Qt);
// Get L from LQUP
- TriangularBlasMatrix<Field> L(_field, m, m,
- LinBoxTag::Lower, LinBoxTag::Unit);
+ TriangularBlasMatrix<Field> L(field(), m, m,
+ Tag::Shape::Lower, Tag::Diag::Unit);
LQUP.getL(L);
// get the transposed permutation of Q from LQUP
@@ -593,9 +596,9 @@ namespace LinBox
// Compute the inverse of L
- TriangularBlasMatrix<Field> invL(_field, m, m,
- LinBoxTag::Lower, LinBoxTag::Unit);
- FFPACK::trinv_left((typename Field::Father_t)_field,m,L.getPointer(),L.getStride(),invL.getWritePointer(),invL.getStride());
+ TriangularBlasMatrix<Field> invL(field(), m, m,
+ Tag::Shape::Lower, Tag::Diag::Unit);
+ FFPACK::trinv_left((const Field &)field(),m,L.getPointer(),L.getStride(),invL.getWritePointer(),invL.getStride());
#ifdef _BM_TIMING
chrono.stop();
@@ -640,11 +643,11 @@ namespace LinBox
for (int j= (int) size-2;j>=0; --j){
for (size_t l=0;l<m;++l)
//BB: #warning Q[i] pour i>r ne veut rien dire...
- _field.assign(SigmaBase[j+1].refEntry(*(Qt.getPointer()+i),l),
- SigmaBase[j].getEntry(*(Qt.getPointer()+i),l));
+ field().assign(SigmaBase[(size_t)j+1].refEntry(*(Qt.getPointer()+i),l),
+ SigmaBase[(size_t)j].getEntry(*(Qt.getPointer()+i),l));
}
for (size_t l=0;l<m;++l)
- _field.assign(SigmaBase[0].refEntry(*(Qt.getPointer()+i),l),_field.zero);
+ field().assign(SigmaBase[0].refEntry(*(Qt.getPointer()+i),l),field().zero);
}
#ifdef _BM_TIMING
chrono.stop();
@@ -670,7 +673,7 @@ namespace LinBox
// degree1 >= degree2
//size_t size = 2*degree1 + 1;
- const Coefficient ZeroSerie (OldSerie[0].rowdim(), OldSerie[0].coldim());
+ const Coefficient ZeroSerie (field(),OldSerie[0].rowdim(), OldSerie[0].coldim());
//const Coefficient ZeroBase (SigmaBase[0].rowdim(), SigmaBase[0].coldim());
// Work on a copy of the old Serie (increase size by one for computation of middle product)
@@ -703,7 +706,7 @@ namespace LinBox
for (size_t i=0;i<degree2+1;++i)
for (size_t j=0;j<degree1+1;++j)
- _BMD.axpyin(NewSerie[i],SigmaBase[j],OldSerie[degree1+i-j]);
+ _BMD.axpyin(NewSerie[i],SigmaBase[(size_t)j],OldSerie[degree1+i-j]);
}
@@ -731,16 +734,16 @@ namespace LinBox
// Initialization of the Serie iterator
typename std::vector<Coefficient>::const_iterator _iter (PowerSerie.begin ());
- Coefficient Unit(m+n,m);
- const Coefficient Zero(m+n,m);
+ Coefficient Unit(field(),m+n,m);
+ const Coefficient Zero(field(),m+n,m);
for (size_t i=0;i<m;i++)
- Unit.setEntry(i,i,_field.one);
+ Unit.setEntry(i,i,field().one);
size_t min_mn=(m <n)? m :n;
// initialization of discrepancy
- Coefficient Discrepancy(m+n,n);
+ Coefficient Discrepancy(field(),m+n,n);
for (size_t i=0;i<n;i++)
- Discrepancy.setEntry(i+m,i,_field.one);
+ Discrepancy.setEntry(i+m,i,field().one);
// initialization of sigma base
@@ -791,7 +794,7 @@ namespace LinBox
typename Coefficient::Iterator _iter_Discr = Discr.Begin();
- while ((_field.isZero(*_iter_Discr) && _iter_Discr != Discr.End()))
+ while ((field().isZero(*_iter_Discr) && _iter_Discr != Discr.End()))
++_iter_Discr;
// maybe there is something to do here
@@ -813,7 +816,7 @@ namespace LinBox
for (size_t i=0;i<m+n;++i) {
size_t idx_min=i;
for (size_t j=i+1;j<m+n;++j)
- if (order[j]< order[idx_min])
+ if (order[(size_t)j]< order[idx_min])
idx_min=j;
std::swap(order[i],order[idx_min]);
Perm1[i]=idx_min;
@@ -835,8 +838,8 @@ namespace LinBox
LQUPMatrix<Field> LQUP(CopyDiscr,P,Qt);
// Get the matrix L of LQUP decomposition
- TriangularBlasMatrix<Field> L(_field,m+n,m+n,
- LinBoxTag::Lower, LinBoxTag::Unit );
+ TriangularBlasMatrix<Field> L(field(),m+n,m+n,
+ Tag::Shape::Lower, Tag::Diag::Unit );
LQUP.getL(L);
// Get the tranposed permutation of Q from LQUP
@@ -851,9 +854,9 @@ namespace LinBox
BlasPermutation<size_t> BPerm2(Perm2);
// compute the inverse of L
- TriangularBlasMatrix<Field> invL (_field,m+n,m+n,
- LinBoxTag::Lower,LinBoxTag::Unit);
- FFPACK::trinv_left((typename Field::Father_t)_field,m+n, L.getPointer(), L.getStride(),
+ TriangularBlasMatrix<Field> invL (field(),m+n,m+n,
+ Tag::Shape::Lower,Tag::Diag::Unit);
+ FFPACK::trinv_left((const Field &)field(),m+n, L.getPointer(), L.getStride(),
invL.getWritePointer(), invL.getStride());
@@ -867,8 +870,8 @@ namespace LinBox
// Apply BPerm2 and Qt to the vector of order and increase by 1 the last n rows
- UnparametricField<long> UF;
- BlasMatrixDomain<UnparametricField<long> > BMDUF(UF);
+ Givaro::ZRing<long> UF;
+ BlasMatrixDomain<Givaro::ZRing<long> > BMDUF(UF);
BMDUF.mulin_right(Qt,order);
BMDUF.mulin_right(BPerm2,order);
BMDUF.mulin_right(BPerm1,degree);
@@ -895,17 +898,17 @@ namespace LinBox
for (int i= (int)size-2;i>=0;i--)
for (size_t j=0;j<n;j++)
for (size_t k=0;k<n;++k)
- _field.assign(SigmaBase[i+1].refEntry(m+j,k), SigmaBase[i].getEntry(m+j,k));
+ field().assign(SigmaBase[i+1].refEntry(m+j,k), SigmaBase[i].getEntry(m+j,k));
for (size_t j=0;j<n;j++)
for (size_t k=0;k<n;++k)
- _field.assign(SigmaBase[0].refEntry(m+j,k),_field.zero);
+ field().assign(SigmaBase[0].refEntry(m+j,k),field().zero);
// Discrepancy= BPerm2.U.P from LQUP
- Coefficient U(m+n,n);
+ Coefficient U(field(),m+n,n);
TriangularBlasMatrix<Field> trU( U,
- LinBoxTag::Upper,LinBoxTag::NonUnit);
+ Tag::Shape::Upper,Tag::Diag::NonUnit);
LQUP.getU(trU);
Discrepancy=U;
// BlasPermutation<size_t> P= LQUP.getP();
@@ -924,13 +927,13 @@ namespace LinBox
max=degree[i];
}
- const Coefficient AZero(m,m);
+ const Coefficient AZero(field(),m,m);
Approx.resize(max+1, AZero);
for (size_t i=0;i<m;i++)
for (long j=0;j<=degree[i];j++)
for (size_t k=0;k<m;k++)
- _field.assign(Approx[j].refEntry(i,k), SigmaBase[j].getEntry(i,k));
+ field().assign(Approx[(size_t)j].refEntry(i,k), SigmaBase[(size_t)j].getEntry(i,k));
}
@@ -954,16 +957,16 @@ namespace LinBox
// Initialization of the Serie iterator
typename std::vector<Coefficient>::const_iterator _iter (PowerSerie.begin ());
- Coefficient Unit(m+n,m);
- const Coefficient Zero(m+n,m);
+ Coefficient Unit(field(),m+n,m);
+ const Coefficient Zero(field(),m+n,m);
for (size_t i=0;i<m;i++)
- Unit.setEntry(i,i,_field.one);
+ Unit.setEntry(i,i,field().one);
size_t min_mn=(m <n)? m :n;
// initialization of discrepancy
- Coefficient Discrepancy(m+n,n);
+ Coefficient Discrepancy(field(),m+n,n);
for (size_t i=0;i<n;i++)
- Discrepancy.setEntry(i+m,i,_field.one);
+ Discrepancy.setEntry(i+m,i,field().one);
// initialization of sigma base
@@ -1014,7 +1017,7 @@ namespace LinBox
typename Coefficient::Iterator _iter_Discr = Discr.Begin();
- while ((_field.isZero(*_iter_Discr) && _iter_Discr != Discr.End()))
+ while ((field().isZero(*_iter_Discr) && _iter_Discr != Discr.End()))
++_iter_Discr;
// maybe there is something to do here
@@ -1036,7 +1039,7 @@ namespace LinBox
for (size_t i=0;i<m+n;++i) {
size_t idx_min=i;
for (size_t j=i+1;j<m+n;++j)
- if (order[j]< order[idx_min])
+ if (order[(size_t)j]< order[idx_min])
idx_min=j;
std::swap(order[i],order[idx_min]);
Perm1[i]=idx_min;
@@ -1058,8 +1061,8 @@ namespace LinBox
LQUPMatrix<Field> LQUP(CopyDiscr,P,Qt);
// Get the matrix L of LQUP decomposition
- TriangularBlasMatrix<Field> L(_field, m+n,m+n,
- LinBoxTag::Lower, LinBoxTag::Unit );
+ TriangularBlasMatrix<Field> L(field(), m+n,m+n,
+ Tag::Shape::Lower, Tag::Diag::Unit );
LQUP.getL(L);
// Get the tranposed permutation of Q from LQUP
@@ -1074,9 +1077,9 @@ namespace LinBox
BlasPermutation<size_t> BPerm2(Perm2);
// compute the inverse of L
- TriangularBlasMatrix<Field> invL (_field,m+n,m+n,
- LinBoxTag::Lower,LinBoxTag::Unit);
- FFPACK::trinv_left((typename Field::Father_t)_field,m+n,L.getPointer(),L.getStride(),
+ TriangularBlasMatrix<Field> invL (field(),m+n,m+n,
+ Tag::Shape::Lower,Tag::Diag::Unit);
+ FFPACK::trinv_left(field(),m+n,L.getPointer(),L.getStride(),
invL.getWritePointer(),invL.getStride());
@@ -1090,8 +1093,8 @@ namespace LinBox
// Apply BPerm2 and Qt to the vector of order and increase by 1 the last n rows
- UnparametricField<long> UF;
- BlasMatrixDomain<UnparametricField<long> > BMDUF(UF);
+ Givaro::ZRing<long> UF;
+ BlasMatrixDomain<Givaro::ZRing<long> > BMDUF(UF);
BMDUF.mulin_right(Qt,order);
BMDUF.mulin_right(BPerm2,order);
BMDUF.mulin_right(BPerm1,degree);
@@ -1118,16 +1121,16 @@ namespace LinBox
for (int i= (int)size-2;i>=0;i--)
for (size_t j=0;j<n;j++)
for (size_t k=0;k<n;++k)
- _field.assign(SigmaBase[i+1].refEntry(m+j,k), SigmaBase[i].getEntry(m+j,k));
+ field().assign(SigmaBase[i+1].refEntry(m+j,k), SigmaBase[i].getEntry(m+j,k));
for (size_t j=0;j<n;j++)
for (size_t k=0;k<n;++k)
- _field.assign(SigmaBase[0].refEntry(m+j,k),_field.zero);
+ field().assign(SigmaBase[0].refEntry(m+j,k),field().zero);
// Discrepancy= BPerm2.U.P from LQUP
- Coefficient U(m+n,n);
- TriangularBlasMatrix<Field> trU(U,LinBoxTag::Upper,LinBoxTag::NonUnit);
+ Coefficient U(field(),m+n,n);
+ TriangularBlasMatrix<Field> trU(U,Tag::Shape::Upper,Tag::Diag::NonUnit);
LQUP.getU(trU);
Discrepancy=U;
// BlasPermutation<size_t> P= LQUP.getP();
@@ -1143,13 +1146,13 @@ namespace LinBox
max=order[i];
}
- const Coefficient AZero(m,m);
+ const Coefficient AZero(field(),m,m);
Approx1.resize(max+1, AZero);
for (size_t i=0;i<m;i++)
for (long j=0;j<=order[i];j++)
for (size_t k=0;k<m;k++)
- _field.assign(Approx1[j].refEntry(i,k), SigmaBase[j].getEntry(i,k));
+ field().assign(Approx1[(size_t)j].refEntry(i,k), SigmaBase[(size_t)j].getEntry(i,k));
}
}
@@ -1165,13 +1168,13 @@ namespace LinBox
max=degree[i];
}
- const Coefficient AZero(m,m);
+ const Coefficient AZero(field(),m,m);
Approx2.resize(max+1, AZero);
for (size_t i=0;i<m;i++)
for (long j=0;j<=degree[i];j++)
for (size_t k=0;k<m;k++)
- _field.assign(Approx2[j].refEntry(i,k), SigmaBase[j].getEntry(i,k));
+ field().assign(Approx2[(size_t)j].refEntry(i,k), SigmaBase[(size_t)j].getEntry(i,k));
}
@@ -1190,28 +1193,30 @@ namespace LinBox
n = PowerSerie[0].coldim();
// Set some useful constants
- const Coefficient Zeromm(m,m);
- const Coefficient Zeromn(m,n);
+ const Coefficient Zeromm(field(),m,m);
+ const Coefficient Zeromn(field(),m,n);
// Reserve memory for the Sigma Base
SigmaBase.reserve(length+1);
SigmaBase.resize(1);
// set SigmaBase[0] to Identity
- Coefficient Identity(m,m);
+ Coefficient Identity(field(),m,m);
for (size_t i=0;i< m;++i)
- Identity.setEntry(i,i,_field.one);
+ Identity.setEntry(i,i,field().one);
SigmaBase[0]=Identity;
// Define Truncated Residual
std::vector<Coefficient> Residual(length+1, Zeromn);
// Set Truncated Residual to PowerSerie mod X^length
+#if 0
for (size_t k=0;k<length; ++k)
Residual[k] = PowerSerie[k];
+#endif
// Define Discrepancy
- Coefficient Discrepancy(m,n);
+ Coefficient Discrepancy(field(),m,n);
// Row degree of SigmaBase
// Keep track on Sigma Base's row degree
@@ -1396,7 +1401,7 @@ namespace LinBox
for (size_t i=0;i<m;++i) {
size_t idx_min=i;
for (size_t j=i+1;j<m;++j)
- if (defect[j]< defect[idx_min])
+ if (defect[(size_t)j]< defect[idx_min])
idx_min=j;
std::swap(defect[i], defect[idx_min]);
Perm1[i]=idx_min;
@@ -1428,7 +1433,7 @@ namespace LinBox
#endif
/* new version : use of columnReducedEchelon */
- EchelonFormDomain<Field> EFD(_field);
+ EchelonFormDomain<Field> EFD(field());
size_t rank = EFD.columnReducedEchelon(Discrepancy);
@@ -1438,7 +1443,7 @@ namespace LinBox
perm[i]=i;
size_t idx=0;
for (size_t i=0;i<rank;++i){
- while(_field.isZero(Discrepancy.getEntry(idx,i))) idx++;
+ while(field().isZero(Discrepancy.getEntry(idx,i))) idx++;
perm[i]=idx;
idx++;
}
@@ -1485,17 +1490,17 @@ namespace LinBox
maxs=std::max(maxs, degree[*(Qt.getPointer()+d)]);
maxs=std::min(maxs, SigmaBase.size()-1);
- //Discrepancy.write(std::cout,_field);
+ //Discrepancy.write(std::cout,field());
#ifndef OPTMIZED_SIGMA_UPDATE
// Compute a Permutation to put all trivial columns of SigmaBase to right part of it
std::vector<size_t> PermTrivial(m);
- bool PTrivial=true;
for(size_t i=0;i<m;++i)
if (PermPivots[i]>i)
std::swap(triv_column[i], triv_column[PermPivots[i]]);
+ // bool PTrivial=true; // no need for that here
if (nbr_triv > (int)rank) {
size_t idx_triv, idx_nontriv;
idx_nontriv = 0;
@@ -1504,12 +1509,12 @@ namespace LinBox
for (size_t i=0;i<m;++i){
if (triv_column[i]!=0){
PermTrivial[i]=idx_nontriv;
- if (i!=idx_nontriv) PTrivial=false;
+ // if (i!=idx_nontriv) PTrivial=false;
idx_nontriv++;
}
else {
PermTrivial[i]=idx_triv;
- if (i!=idx_triv) PTrivial=false;
+ // if (i!=idx_triv) PTrivial=false;
idx_triv++;
}
}
@@ -1549,7 +1554,7 @@ namespace LinBox
std::cout<<"\n";
write_maple("Sigma",SigmaBase);
- //Discrepancy.write(std::cout,_field);
+ //Discrepancy.write(std::cout,field());
@@ -1558,13 +1563,13 @@ namespace LinBox
std::cout<<triv_column[i]<<", ";
std::cout<<"\n";
- SigmaBase[0].write(std::cout,_field);
+ SigmaBase[0].write(std::cout,field());
_BMD.mulin_right(BPerm1, SigmaBase[0]);
- SigmaBase[0].write(std::cout,_field);
+ SigmaBase[0].write(std::cout,field());
_BMD.mulin_left(SigmaBase[0],PPiv);
- SigmaBase[0].write(std::cout,_field);
+ SigmaBase[0].write(std::cout,field());
_BMD.mulin_left(SigmaBase[0], PTr);
- SigmaBase[0].write(std::cout,_field);
+ SigmaBase[0].write(std::cout,field());
_BMD.mulin_left(SigmaBase[0], PTrT);
_BMD.mulin_left(SigmaBase[0],PPivT);
TransposedBlasMatrix<BlasPermutation<size_t> > BPerm1T(BPerm1);
@@ -1573,7 +1578,7 @@ namespace LinBox
// Update SigmaBase
for (size_t i=0;i<maxs+1;++i) {
- //SigmaBase[0].write(std::cout,_field);
+ //SigmaBase[0].write(std::cout,field());
// permute SigmaBase
_BMD.mulin_right(BPerm1, SigmaBase[i]);
@@ -1598,14 +1603,14 @@ namespace LinBox
BlasMatrix<Field> S_bottom_left (SigmaBase[i], rank,0,m-rank,lsize);
#if 0
if (i==0){
- S_bottom_left.write(std::cout,_field);
+ S_bottom_left.write(std::cout,field());
}
#endif
// deal with the left part of S_bottom
_BMD.axmyin(S_bottom_left, G, S_top_left);
#if 0
if (i==0){
- S_bottom_left.write(std::cout,_field);
+ S_bottom_left.write(std::cout,field());
}
#endif
@@ -1625,7 +1630,7 @@ namespace LinBox
_BMD.mulin_right(Q, SigmaBase[i]);
#if 0
if (i==0){
- S_bottom_left.write(std::cout,_field);
+ S_bottom_left.write(std::cout,field());
}
#endif
}
@@ -1780,10 +1785,10 @@ namespace LinBox
for (size_t i=0;i<rank;++i){
for (int j= (int) size-2;j>=0; --j){
for (size_t l=0;l<m;++l)
- _field.assign(SigmaBase[j+1].refEntry(*(Qt.getPointer()+i),l), SigmaBase[j].getEntry(*(Qt.getPointer()+i),l));
+ field().assign(SigmaBase[(size_t)j+1].refEntry(*(Qt.getPointer()+i),l), SigmaBase[(size_t)j].getEntry(*(Qt.getPointer()+i),l));
}
for (size_t l=0;l<m;++l)
- _field.assign(SigmaBase[0].refEntry(*(Qt.getPointer()+i),l),_field.zero);
+ field().assign(SigmaBase[0].refEntry(*(Qt.getPointer()+i),l),field().zero);
}
#ifdef _BM_TIMING
chrono.stop();
@@ -1796,7 +1801,7 @@ namespace LinBox
for (size_t i=0;i<rank;++i){
for (int j= (int) length-2;j>= (int) k; j--){
for (size_t l=0;l<n;++l)
- _field.assign(Residual[j+1].refEntry(*(Qt.getPointer()+i),l), Residual[j].getEntry(*(Qt.getPointer()+i),l));
+ field().assign(Residual[(size_t)j+1].refEntry(*(Qt.getPointer()+i),l), Residual[(size_t)j].getEntry(*(Qt.getPointer()+i),l));
}
}
*/
@@ -1835,14 +1840,14 @@ namespace LinBox
size_t m,n;
m = PowerSerie[0].rowdim();
n = PowerSerie[0].coldim();
- const Coefficient ZeroSigma(m,m);
- const Coefficient ZeroSerie(m,n);
+ const Coefficient ZeroSigma(field(),m,m);
+ const Coefficient ZeroSerie(field(),m,n);
PowerSerie.resize(degree, ZeroSerie);
if (degree == 0) {
- Coefficient Identity(m,m);
+ Coefficient Identity(field(),m,m);
for (size_t i=0;i< m;++i)
- Identity.setEntry(i,i,_field.one);
+ Identity.setEntry(i,i,field().one);
SigmaBase[0]=Identity;
}
else {
@@ -1887,7 +1892,8 @@ namespace LinBox
tUpdateSerie.clear();
tUpdateSerie.start();
#endif
- /*
+
+#if 0
//write_maple("Sigma1", Sigma1);
Sigma1.resize(degree1+1, ZeroSigma);
@@ -1900,10 +1906,10 @@ namespace LinBox
Serie[i] = PowerSerie[i];
PM_domain.midproduct(Serie2, Sigma1, Serie);
- //ClassicMulDomain<Field, std::vector<Coefficient> > CM_domain(_field);
+ //ClassicMulDomain<Field, std::vector<Coefficient> > CM_domain(field());
//CM_domain.midproduct(Serie2, Sigma1, Serie);
Serie2.resize(degree2, ZeroSerie);
- */
+#endif
std::vector<Coefficient> Serie2(degree2,ZeroSerie);
UpdateSerie(Serie2, Sigma1, PowerSerie, degree1, degree2);
@@ -1979,17 +1985,17 @@ namespace LinBox
size_t m,n;
m = OldSerie[0].rowdim();
n = OldSerie[0].coldim();
- const Coefficient ZeroSigma(m,m);
- const Coefficient ZeroSerie(m,n);
+ const Coefficient ZeroSigma(field(),m,m);
+ const Coefficient ZeroSerie(field(),m,n);
size_t Ssize = SigmaBase.size();
if (SigmaBase.size() < 5){
// do the calculation by hand
for (size_t j=degree1;j<degree1+degree2;++j){
- _BMD.mul(NewSerie[j-degree1], SigmaBase[0], OldSerie[j]);
+ _BMD.mul(NewSerie[(size_t)j-degree1], SigmaBase[0], OldSerie[(size_t)j]);
for (size_t i=1;i<Ssize; ++i)
- _BMD.axpyin(NewSerie[j-degree1], SigmaBase[i], OldSerie[j-i]);
+ _BMD.axpyin(NewSerie[(size_t)j-degree1], SigmaBase[i], OldSerie[(size_t)j-i]);
}
}
else{
@@ -2023,13 +2029,13 @@ namespace LinBox
for (size_t i=0;i<m-1;++i){
std::cout<<"[";
for (size_t j=0;j<n-1;++j)
- _field.write(std::cout,C.getEntry(i,j))<<",";
- _field.write(std::cout,C.getEntry(i,n-1))<<"] , ";
+ field().write(std::cout,C.getEntry(i,j))<<",";
+ field().write(std::cout,C.getEntry(i,n-1))<<"] , ";
}
std::cout<<"[";
for (size_t j=0;j<n-1;++j)
- _field.write(std::cout,C.getEntry(m-1,j))<<",";
- _field.write(std::cout, C.getEntry(m-1,n-1))<<"]])]); ";
+ field().write(std::cout,C.getEntry(m-1,j))<<",";
+ field().write(std::cout, C.getEntry(m-1,n-1))<<"]])]); ";
}
@@ -2046,26 +2052,26 @@ namespace LinBox
for (size_t i=0;i<m-1;++i){
std::cout<<"[";
for (size_t j=0;j<n-1;++j)
- _field.write(std::cout,P[k].getEntry(i,j))<<",";
- _field.write(std::cout, P[k].getEntry(i,n-1))<<"] , ";
+ field().write(std::cout,P[k].getEntry(i,j))<<",";
+ field().write(std::cout, P[k].getEntry(i,n-1))<<"] , ";
}
std::cout<<"[";
for (size_t j=0;j<n-1;++j)
- _field.write(std::cout,P[k].getEntry(m-1,j))<<",";
- _field.write(std::cout, P[k].getEntry(m-1,n-1))<<"]]) , ";
+ field().write(std::cout,P[k].getEntry(m-1,j))<<",";
+ field().write(std::cout, P[k].getEntry(m-1,n-1))<<"]]) , ";
}
std::cout<<"Matrix([";
for (size_t i=0;i<m-1;++i){
std::cout<<"[";
for (size_t j=0;j<n-1;++j)
- _field.write(std::cout,P[P.size()-1].getEntry(i,j))<<",";
- _field.write(std::cout, P[P.size()-1].getEntry(i,n-1))<<"] , ";
+ field().write(std::cout,P[P.size()-1].getEntry(i,j))<<",";
+ field().write(std::cout, P[P.size()-1].getEntry(i,n-1))<<"] , ";
}
std::cout<<"[";
for (size_t j=0;j<n-1;++j)
- _field.write(std::cout,P[P.size()-1].getEntry(m-1,j))<<",";
- _field.write(std::cout, P[P.size()-1].getEntry(m-1,n-1))<<"]])]); \n\n";
+ field().write(std::cout,P[P.size()-1].getEntry(m-1,j))<<",";
+ field().write(std::cout, P[P.size()-1].getEntry(m-1,n-1))<<"]])]); \n\n";
}
@@ -2078,11 +2084,10 @@ namespace LinBox
#endif //__LINBOX_sigma_basis_H
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
// Local Variables:
// mode: C++
// tab-width: 8
// indent-tabs-mode: nil
// c-basic-offset: 8
// End:
-
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/algorithms/signature.h b/linbox/algorithms/signature.h
index bc2c274..38b756c 100644
--- a/linbox/algorithms/signature.h
+++ b/linbox/algorithms/signature.h
@@ -26,12 +26,12 @@
#define __LINBOX_signature_H
/* Function related to the signature computation of symmetric matrices */
-#include "linbox/field/modular.h"
+#include "linbox/ring/modular.h"
#include "linbox/algorithms/cra-early-multip.h"
#include <fflas-ffpack/ffpack/ffpack.h>
#include "linbox/randiter/random-prime.h"
-#include "linbox/matrix/blas-matrix.h"
-#include "linbox/algorithms/blas-domain.h"
+#include "linbox/matrix/dense-matrix.h"
+#include "linbox/matrix/matrix-domain.h"
#include "linbox/solutions/minpoly.h"
namespace LinBox
@@ -49,20 +49,21 @@ namespace LinBox
template <class Matrix>
static bool isPosDef (const Matrix& M, const BLAS_LPM_Method& meth)
{
- RandomPrimeIterator::setSeed(time(0));
+ RandomPrimeIterator::setSeed((size_t)time(0));
size_t n = M. rowdim();
std::vector<int> P;
symmetricLU (P, M);
if (P. size () < n)
return false;
- typedef typename Matrix::Field::Element Int;
- std::vector<Int> D(n);
+ // typedef typename Matrix::Field::Element Int;
+ // std::vector<Int> D(n);
+ BlasVector<typename Matrix::Field> D(M.field(),n);
semiD(D, M);
//std::cout << "All principal minors are: [";
//for (int i = 0; i < n; ++ i)
- // std::cout << D[i] << ", ";
+ // std::cout << D[(size_t)i] << ", ";
//std::cout << "]\n";
if (allPos(D)) return true;
@@ -95,10 +96,10 @@ namespace LinBox
template <class Matrix>
static bool isPosSemiDef (const Matrix& M, const BLAS_LPM_Method& meth)
{
- RandomPrimeIterator::setSeed(time(0));
+ RandomPrimeIterator::setSeed((size_t)time(0));
size_t n = M. rowdim();
std::vector<int> P;
- size_t r = rank_random (M);
+ size_t r = (size_t)rank_random (M);
//std::clog << "Rank:= " << r << std::endl;
if (r == 0)
return true;
@@ -118,10 +119,10 @@ namespace LinBox
Matrix PM (R, P.size(), P.size());
typename Matrix::RowIterator cur_r; int j = 0;
for (cur_r = PM. rowBegin(); cur_r != PM. rowEnd(); ++ cur_r, ++j) {
- typename Matrix::ConstRowIterator m_r = M. rowBegin() + P[j];
+ typename Matrix::ConstRowIterator m_r = M. rowBegin() + P[(size_t)j];
for (size_t k = 0; k < P.size(); ++ k)
R. assign (cur_r -> operator[] (k),
- m_r -> operator[] (P[k]));
+ m_r -> operator[] ((size_t)P[(size_t)k]));
}
semiD (D, PM);
}
@@ -192,26 +193,28 @@ namespace LinBox
//M. write (std::cout);
typedef typename Matrix::Field Ring;
typedef typename Ring::Element Integer_t;
- typedef Modular<double> Field;
+ typedef Givaro::Modular<double> Field;
typedef Field::Element Element;
size_t n = M. rowdim();
+ RandomPrimeIterator primeg;
+ if( ! primeg.template setBitsDelayedField<Field>(n) )
+ primeg.template setBitsField<Field>();
+
- integer mmodulus;
- FieldTraits<Field>::maxModulus(mmodulus);
- long bit1 = (long) floor (log((double)mmodulus)/M_LN2);
- long bit2 = (long) floor (log(sqrt(double(4503599627370496LL/n)))/M_LN2);
- RandomPrimeIterator primeg(unsigned(bit1 < bit2 ? bit1 : bit2));
- Field::Element* FA = new Field::Element[n*n];
+ Element* FA = new Element[n*n];
size_t* P= new size_t[n], *PQ = new size_t[n];
size_t* P_p, * PQ_p;
- Field::Element* p; Field::Element tmp;
+ Element* p; Element tmp;
EarlyMultipCRA< Field > cra(3UL);
Integer_t m = 1;
- std::vector<Field::Element> v(n);
+ // std::vector<Element> v(n);
+ typedef Givaro::ZRing<Element> NoField;
+ NoField unF ;
+ BlasVector<NoField> v(unF,n);
size_t j = 0;
Field K2;
bool faithful = true;
@@ -229,7 +232,7 @@ namespace LinBox
K1. init (*p, *raw_p);
//clog << "\rComputing lup mod " << prime << ". ";
- FFPACK::LUdivine((typename Field::Father_t)K1, FFLAS::FflasNonUnit, FFLAS::FflasNoTrans, n, n, FA, n, P, PQ, FFPACK::FfpackLQUP);
+ FFPACK::LUdivine(K1, FFLAS::FflasNonUnit, FFLAS::FflasNoTrans, n, n, FA, n, P, PQ);//, FFPACK::FfpackLQUP);
faithful = true;
for ( j = 0, P_p = P, PQ_p = PQ; j < n; ++ j, ++ P_p, ++ PQ_p)
@@ -239,14 +242,16 @@ namespace LinBox
}
} while(! faithful);
- K2. init (tmp, 1UL);
+ K2. assign(tmp, K2.one);
- typename std::vector<Field::Element>::iterator vp;
+ // typename std::vector<Element>::iterator vp;
+ typename BlasVector<NoField>::iterator vp;
for (j = 0, vp = v.begin(); vp != v.end(); ++j, ++vp) {
K2.mulin(tmp, *(FA + (j * n + j)));
K2.assign(*vp, tmp);
}
- cra. initialize(K2, v);
+ // BlasVector<Field> v2(K2,v);//!@bug should not do it like that...
+ cra. initialize(K2, v );
while (! cra.terminated() ){
// get a prime.
@@ -257,7 +262,7 @@ namespace LinBox
K3. init (*p, *raw_p);
//clog << "\rComputing lup mod " << prime << ". ";
- FFPACK::LUdivine((typename Field::Father_t)K3, FFLAS::FflasNonUnit, FFLAS::FflasNoTrans, n, n, FA, n, P, PQ, FFPACK::FfpackLQUP);
+ FFPACK::LUdivine(K3, FFLAS::FflasNonUnit, FFLAS::FflasNoTrans, n, n, FA, n, P, PQ);//, FFPACK::FfpackLQUP);
faithful = true;
for ( j = 0, P_p = P, PQ_p = PQ; j < n; ++ j, ++ P_p, ++ PQ_p)
@@ -271,7 +276,7 @@ namespace LinBox
continue;
}
- K3. init (tmp, 1UL);
+ K3. assign(tmp, K3.one);
for (j = 0, vp = v.begin(); vp != v.end(); ++j, ++vp) {
K3.mulin(tmp, *(FA + (j * n + j)));
@@ -283,6 +288,7 @@ namespace LinBox
std::cout << v[l] << ", ";
std::cout << "]\n";
#endif
+ // BlasVector<Field> v3(K3,v); //!@bug should not be doing that...
cra. progress(K3, v);
}
@@ -301,29 +307,28 @@ namespace LinBox
static Vector& symmetricLU (Vector& v, const Matrix& IM)
{
- typedef Modular<int32_t> Field;
- // typedef Modular<double> Field;
+ typedef Givaro::Modular<int32_t> Field;
+ // typedef Givaro::Modular<double> Field;
typedef Field::Element Element;
typedef BlasMatrix<Field> FMatrix;
- RandomPrimeIterator primeg(20);
- Field F ((unsigned long)*primeg);
+ RandomPrimeIterator primeg; primeg.template setBitsField<Field>();
+ Field F (*primeg);
FMatrix FM(F, IM.rowdim(), IM.coldim());
//std::cout << "Random prime " << p << "\n";
- Element zero; F. init (zero, 0);
- MatrixHom::map (FM, IM, F);
+ MatrixHom::map (FM, IM);
VectorDomain<Field> VD(F);
FMatrix& M = FM;
//typename FMatrix::RowIterator cur_r, tmp_r;
- typedef FMatrix::Row Row;
+ // typedef FMatrix::Row Row;
//the index is 0-based.
int i = 0;
int n = (int) M. rowdim();
- std::vector<int> P(n);
+ std::vector<int> P((size_t)n);
for (i = 0; i < n; ++ i)
- P[i] = i;
+ P[(size_t)i] = i;
//M. write(std::cout);
for (i = 0; i < n; ++ i) {
@@ -331,7 +336,7 @@ namespace LinBox
int j;
//find a pivot
for (j = i; j < n; ++ j) {
- if (!F. isZero(M[j][j])) break;
+ if (!F. isZero(M[(size_t)j][(size_t)j])) break;
}
//no piviot
@@ -345,15 +350,15 @@ namespace LinBox
//std::cout << "Pivot= " << j << '\n';
//M. write(std::cout);
- P[i] = j;
+ P[(size_t)i] = j;
Element tmp;
- F. inv (tmp, M[i][i]);
+ F. inv (tmp, M[(size_t)i][(size_t)i]);
F. negin(tmp);
VD. mulin(*(M. rowBegin() + i), tmp);
//M. write(std::cout);
for (j = i + 1; j < n; ++ j) {
- F. assign (tmp, M[j][i]);
+ F. assign (tmp, M[(size_t)j][(size_t)i]);
VD. axpyin (*(M. rowBegin() + j), tmp,
*(M. rowBegin() + i));
}
@@ -361,20 +366,20 @@ namespace LinBox
//not necessary
//M. write(std::cout);
for (j = i + 1; j < n; ++ j)
- F. assign (M[i][j], zero);
+ F. assign (M[(size_t)i][(size_t)j], F.zero);
}
- v. resize (n);
+ v. resize ((size_t)n);
std::vector<int>::iterator i_p; int j;
for (i_p = v. begin(), j = 0; i_p != v. end(); ++ i_p, ++ j)
*i_p = j;
for (j = 0; j < i; ++ j) {
- if (j != P[j])
- std::swap (v[j], v[P[j]]);
+ if (j != P[(size_t)j])
+ std::swap (v[(size_t)j], v[(size_t)P[(size_t)j]]);
}
- v. resize (i);
+ v. resize ((size_t)i);
//std::cout << "Pseud-rank: " << i << "\n[";
//for (i_p = v. begin(); i_p != v. end(); ++ i_p)
@@ -390,30 +395,28 @@ namespace LinBox
static long rank_random (const Matrix& M)
{
- typedef typename Matrix::Field Ring;
+ // typedef typename Matrix::Field Ring;
// typedef typename Ring::Element Integer_t;
- typedef Modular<double> Field;
- typedef Field::Element Element;
+ typedef Givaro::Modular<double> Field;
+ // typedef Field::Element Element;
int n = (int)M. rowdim();
- integer mmodulus;
- FieldTraits<Field>::maxModulus(mmodulus);
- long bit1 = (long) floor (log((double)mmodulus)/M_LN2);
- long bit2 = (long) floor (log(sqrt(double(4503599627370496LL/n)))/M_LN2);
- RandomPrimeIterator primeg((unsigned)(bit1 < bit2 ? bit1 : bit2));
-
Field::Element* FA = new Field::Element[n*n], *p;
// get a prime.
// Compute the rank mod that prime. Accumulate into v with CRA.
+ RandomPrimeIterator primeg;
+ if( ! primeg.template setBitsDelayedField<Field>(n) )
+ primeg.template setBitsField<Field>();
+
Field K(*primeg);
typename Matrix::ConstIterator raw_p;
for (p = FA, raw_p = M. Begin(); p != FA + (n*n); ++ p, ++ raw_p)
K. init (*p, *raw_p);
- long r = FFPACK::Rank((typename Field::Father_t) K, n, n, FA, n);
+ long r = (long)FFPACK::Rank( K, (size_t)n, (size_t)n, FA, (size_t)n);
delete[] FA;
return r;
diff --git a/linbox/algorithms/smith-form-adaptive.h b/linbox/algorithms/smith-form-adaptive.h
index ed0a425..d2f66fb 100644
--- a/linbox/algorithms/smith-form-adaptive.h
+++ b/linbox/algorithms/smith-form-adaptive.h
@@ -32,7 +32,7 @@
#include <vector>
#include "linbox/integer.h"
-#include "linbox/matrix/blas-matrix.h"
+#include "linbox/matrix/dense-matrix.h"
namespace LinBox
{
@@ -40,7 +40,7 @@ namespace LinBox
class SmithFormAdaptive {
public:
- static const long prime[];// = {2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97};
+ static const int64_t prime[];// = {2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97};
static const int NPrime;// = 25;
@@ -48,18 +48,18 @@ namespace LinBox
* Should work with SparseMatrix and BlasMatrix
*/
template <class Matrix>
- static void compute_local_long (std::vector<integer>& s, const Matrix& A, long p, long e);
+ static void compute_local_long (BlasVector<Givaro::ZRing<Integer> >& s, const Matrix& A, int64_t p, int64_t e);
- /* Compute the local smith form at prime p, when modular (p^e) doesnot fit in long
+ /* Compute the local smith form at prime p, when modular (p^e) doesnot fit in int64_t
* Should work with SparseMatrix and BlasMatrix
*/
template <class Matrix>
- static void compute_local_big (std::vector<integer>& s, const Matrix& A, long p, long e);
+ static void compute_local_big (BlasVector<Givaro::ZRing<Integer> >& s, const Matrix& A, int64_t p, int64_t e);
/* Compute the local smith form at prime p
*/
template <class Matrix>
- static void compute_local (std::vector<integer>& s, const Matrix& A, long p, long e);
+ static void compute_local (BlasVector<Givaro::ZRing<Integer> >& s, const Matrix& A, int64_t p, int64_t e);
/* Compute the k-smooth part of the invariant factor, where k = 100.
* @param sev is the exponent part ...
@@ -67,14 +67,14 @@ namespace LinBox
* Should work with SparseMatrix and BlasMatrix
*/
template <class Matrix>
- static void smithFormSmooth (std::vector<integer>& s, const Matrix& A, long r, const std::vector<long>& sev);
+ static void smithFormSmooth (BlasVector<Givaro::ZRing<Integer> >& s, const Matrix& A, long r, const std::vector<int64_t>& sev);
/* Compute the k-rough part of the invariant factor, where k = 100.
* By EGV+ algorithm or Iliopoulos' algorithm for Smith form.
* Should work with BlasMatrix
*/
template <class Matrix>
- static void smithFormRough (std::vector<integer>& s, const Matrix& A, integer m );
+ static void smithFormRough (BlasVector<Givaro::ZRing<Integer> >& s, const Matrix& A, integer m );
/* Compute the Smith form via valence algorithms
* Compute the local Smith form at each possible prime
@@ -82,7 +82,7 @@ namespace LinBox
* Should work with SparseMatrix and BlasMatrix
*/
template <class Matrix>
- static void smithFormVal (std::vector<integer>&s, const Matrix& A, long r, const std::vector<long>& sev);
+ static void smithFormVal (BlasVector<Givaro::ZRing<Integer> >&s, const Matrix& A, long r, const std::vector<int64_t>& sev);
/** \brief Smith form of a dense matrix by adaptive algorithm.
*
@@ -91,26 +91,25 @@ namespace LinBox
* Should work with SparseMatrix and BlasMatrix
*/
template <class Matrix>
- static void smithForm (std::vector<integer>& s, const Matrix& A);
+ static void smithForm (BlasVector<Givaro::ZRing<Integer> >& s, const Matrix& A);
/** Specialization for dense case*/
// template <class IRing>
- // static void smithForm (std::vector<integer>& s, const BlasMatrix<IRing>& A);
- template <class IRing>
- static void smithForm (std::vector<integer>& s, const BlasMatrix<IRing>& A);
+ // static void smithForm (BlasVector<Givaro::ZRing<Integer> >& s, const BlasMatrix<IRing>& A);
+ template <class IRing, class _Rep>
+ static void smithForm (BlasVector<Givaro::ZRing<Integer> >& s, const BlasMatrix<IRing, _Rep>& A);
};
- const long SmithFormAdaptive::prime[] = {2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97};
+ const int64_t SmithFormAdaptive::prime[] = {2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97};
const int SmithFormAdaptive::NPrime = 25;
}
#include "linbox/algorithms/smith-form-adaptive.inl"
#endif //__LINBOX_smith_form_adaptive_H
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
// Local Variables:
// mode: C++
// tab-width: 8
// indent-tabs-mode: nil
// c-basic-offset: 8
// End:
-
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/algorithms/smith-form-adaptive.inl b/linbox/algorithms/smith-form-adaptive.inl
index 4011d08..fcfc0a2 100644
--- a/linbox/algorithms/smith-form-adaptive.inl
+++ b/linbox/algorithms/smith-form-adaptive.inl
@@ -26,13 +26,15 @@
#ifndef __LINBOX_smith_form_adaptive_INL
#define __LINBOX_smith_form_adaptive_INL
-#include <math.h>
+#include <cmath>
#include <vector>
+#include <givaro/modular-int32.h>
+
#include "linbox/linbox-config.h"
#include "linbox/integer.h"
#include "linbox/util/debug.h"
-#include "linbox/field/PIR-modular-int32.h"
-#include "linbox/field/local2_32.h"
+#include "linbox/ring/pir-modular-int32.h"
+#include "linbox/ring/local2_32.h"
#include "linbox/algorithms/smith-form-iliopoulos.h"
#include "linbox/algorithms/smith-form-local.h"
#include "linbox/algorithms/rational-solver-adaptive.h"
@@ -50,7 +52,7 @@
#ifdef __LINBOX_HAVE_NTL
-#include "linbox/field/PIR-ntl-ZZ_p.h"
+#include "linbox/ring/pir-ntl-zz_p.h"
#endif
namespace LinBox
@@ -59,7 +61,7 @@ namespace LinBox
/* Compute the local smith form at prime p, when modular (p^e) fits in long
*/
template <class Matrix>
- void SmithFormAdaptive::compute_local_long (std::vector <integer>& s, const Matrix& A, long p, long e)
+ void SmithFormAdaptive::compute_local_long (BlasVector<Givaro::ZRing<Integer> >& s, const Matrix& A, int64_t p, int64_t e)
{
std::ostream& report = commentator().report (Commentator::LEVEL_IMPORTANT, PROGRESS_REPORT);
@@ -73,25 +75,25 @@ namespace LinBox
std::list <Local2_32::Element> l;
SmithFormLocal<Local2_32> SF;
BlasMatrix <Local2_32> A_local(R, A.rowdim(),A.coldim());
- MatrixHom::map (A_local, A, R);
+ MatrixHom::map (A_local, A);
SF (l, A_local, R);
std::list <Local2_32::Element>::iterator l_p;
- std::vector <integer>::iterator s_p;
- for (s_p = s. begin(), l_p = l. begin(); s_p != s. begin() + order; ++ s_p, ++ l_p)
+ BlasVector<Givaro::ZRing<Integer> >::iterator s_p;
+ for (s_p = s. begin(), l_p = l. begin(); s_p != s. begin() +(ptrdiff_t) order; ++ s_p, ++ l_p)
*s_p = *l_p;
report << " Done\n";
}
else if (e == 1) {
report << " Compute local smith at prime " << p << ", by rank.\n";
#if 0 /*Meet trouble to call ffpack routine*/
- Modular<double> F (p); Modular<double>::Element elt;
+ Givaro::Modular<double> F (p); Givaro::Modular<double>::Element elt;
int n = A. rowdim(); int m = A. coldim();
- Modular<double>::Element* A_local = new Modular<double>::Element [n * m];
+ Givaro::Modular<double>::Element* A_local = new Givaro::Modular<double>::Element [n * m];
typename Matrix::ConstIndexedIterator rawi_p;
typename Matrix::ConstIterator raw_p;
- Modular<double>::Element* A_local_p;
+ Givaro::Modular<double>::Element* A_local_p;
for (A_local_p = A_local; A_local_p != A_local + (n*m); ++ A_local_p)
- F. init (*A_local_p, 0);
+ F. assign (*A_local_p, F.zero);
integer tmp;
for (rawi_p = A. IndexedBegin(), raw_p = A. Begin(), A_local_p = A_local; rawi_p != A. IndexedEnd(); ++ rawi_p, ++ raw_p, ++ A_local_p) {
//F. init (*A_local_p, *raw_p);
@@ -105,40 +107,40 @@ namespace LinBox
std::cout << *(A_local + i) << '\t';
std::cout << "\nbegin to call ffpack:\n";
- unsigned int rank = FPACK::Rank ((Modular<double>::Father_t)(F, n, m, A_local, m);
+ unsigned int rank = FPACK::Rank ((Givaro::Modular<double>::Father_t)(F, n, m, A_local, m);
std::cout << "Call of ffpack is done\n";
delete[] A_local;
#endif
- typedef Modular<int32_t> Field;
+ typedef Givaro::Modular<int32_t> Field;
typedef BlasMatrix<Field> FMatrix;
MatrixRank<typename Matrix::Field, Field> MR;
- Field F((unsigned long)p);
+ Field F(p);
FMatrix A_local(A, F);
long rank = MR. rankIn (A_local);
- std::vector <integer>::iterator s_p;
+ BlasVector<Givaro::ZRing<Integer> >::iterator s_p;
for (s_p = s. begin(); s_p != s. begin() + (long) rank; ++ s_p)
*s_p = 1;
- for (; s_p != s. begin() + order; ++ s_p)
+ for (; s_p != s. begin() +(ptrdiff_t) order; ++ s_p)
*s_p = 0;
report << " Done\n";
}
else {
report << " Compute local smith at " << p <<'^' << e << " using PIRModular<int32_t>\n";
- long m = 1;
+ int64_t m = 1;
int i = 0;
for (i = 0; i < e; ++ i)
m *= p;
typedef PIRModular<int32_t> PIR;
- PIR R((unsigned int)m);
+ PIR R((int32_t)m);
BlasMatrix <PIR> A_local(R, A.rowdim(), A.coldim());
SmithFormLocal <PIR> SF;
std::list <PIR::Element> l;
- MatrixHom::map (A_local, A, R);
+ MatrixHom::map (A_local, A);
SF (l, A_local, R);
std::list <PIR::Element>::iterator l_p;
- std::vector <integer>::iterator s_p;
- for (s_p = s. begin(), l_p = l. begin(); s_p != s. begin() + order; ++ s_p, ++ l_p)
+ BlasVector<Givaro::ZRing<Integer> >::iterator s_p;
+ for (s_p = s. begin(), l_p = l. begin(); s_p != s. begin() +(ptrdiff_t) order; ++ s_p, ++ l_p)
*s_p = *l_p;
report << " Done\n";
}
@@ -149,7 +151,7 @@ namespace LinBox
/* Compute the local smith form at prime p, when modular (p^e) doesnot fit in long
*/
template <class Matrix>
- void SmithFormAdaptive::compute_local_big (std::vector<integer>& s, const Matrix& A, long p, long e)
+ void SmithFormAdaptive::compute_local_big (BlasVector<Givaro::ZRing<Integer> >& s, const Matrix& A, int64_t p, int64_t e)
{
std::ostream& report = commentator().report (Commentator::LEVEL_IMPORTANT, PROGRESS_REPORT);
@@ -164,25 +166,25 @@ namespace LinBox
BlasMatrix <PIR_ntl_ZZ_p> A_local(R, A.rowdim(), A.coldim());
SmithFormLocal <PIR_ntl_ZZ_p> SF;
std::list <PIR_ntl_ZZ_p::Element> l;
- MatrixHom::map (A_local, A, R);
+ MatrixHom::map (A_local, A);
SF (l, A_local, R);
std::list <PIR_ntl_ZZ_p::Element>::iterator l_p;
- std::vector <integer>::iterator s_p;
- for (s_p = s. begin(), l_p = l. begin(); s_p != s. begin() + order; ++ s_p, ++ l_p)
+ BlasVector<Givaro::ZRing<Integer> >::iterator s_p;
+ for (s_p = s. begin(), l_p = l. begin(); s_p != s. begin() +(ptrdiff_t) order; ++ s_p, ++ l_p)
R. convert(*s_p, *l_p);
report << " Done \n";
}
else {
- std::cout << "Compute local smith at " << p << '^' << e << std::endl;
+ std::cerr << "Compute local smith at " << p << '^' << e << std::endl;
std::cerr << "Not implemented yet.\n";
}
return;
}
#else
template <class Matrix>
- void SmithFormAdaptive::compute_local_big (std::vector<integer>& s, const Matrix& A, long p, long e)
+ void SmithFormAdaptive::compute_local_big (BlasVector<Givaro::ZRing<Integer> >& s, const Matrix& A, int64_t p, int64_t e)
{
- throw(LinBoxError("you need NTL to use SmithFormAdaptive",__func__,__FILE__,__LINE__));
+ throw(LinBoxError("you need NTL to use SmithFormAdaptive",LB_FILE_LOC));
}
#endif
@@ -190,7 +192,7 @@ namespace LinBox
/* Compute the local smith form at prime p
*/
template <class Matrix>
- void SmithFormAdaptive::compute_local (std::vector<integer>& s, const Matrix& A, long p, long e)
+ void SmithFormAdaptive::compute_local (BlasVector<Givaro::ZRing<Integer> >& s, const Matrix& A, int64_t p, int64_t e)
{
linbox_check ((p > 0) && ( e >= 0));
@@ -201,7 +203,7 @@ namespace LinBox
compute_local_big (s, A, p, e);
// normalize the answer
- for (std::vector<integer>::iterator p_it = s. begin(); p_it != s. end(); ++ p_it)
+ for (BlasVector<Givaro::ZRing<Integer> >::iterator p_it = s. begin(); p_it != s. end(); ++ p_it)
*p_it = gcd (*p_it, m);
}
@@ -211,23 +213,25 @@ namespace LinBox
* r >= 2;
*/
template <class Matrix>
- void SmithFormAdaptive::smithFormSmooth (std::vector<integer>& s, const Matrix& A, long r, const std::vector<long>& sev)
+ void SmithFormAdaptive::smithFormSmooth (BlasVector<Givaro::ZRing<Integer> >& s, const Matrix& A, long r, const std::vector<int64_t>& sev)
{
+ Givaro::ZRing<Integer> Z;
//....
std::ostream& report = commentator().report (Commentator::LEVEL_IMPORTANT, PROGRESS_REPORT);
report << "Computation the k-smooth part of the invariant factors starts(via local and rank):" << std::endl;
int order = (int)(A. rowdim() < A. coldim() ? A. rowdim() : A. coldim());
linbox_check (s. size() >= (unsigned long)order);
- std::vector<long>::const_iterator sev_p; const long* prime_p; std::vector<integer>::iterator s_p;
- std::vector<integer> local(order); std::vector<integer>::iterator local_p;
+ std::vector<int64_t>::const_iterator sev_p; const int64_t* prime_p; BlasVector<Givaro::ZRing<Integer> >::iterator s_p;
+ BlasVector<Givaro::ZRing<Integer> > local(Z,(size_t)order);
+ BlasVector<Givaro::ZRing<Integer> >::iterator local_p;
- for (s_p = s. begin(); s_p != s. begin() + r; ++ s_p)
+ for (s_p = s. begin(); s_p != s. begin() +(ptrdiff_t) r; ++ s_p)
*s_p = 1;
for (; s_p != s. end(); ++ s_p)
*s_p = 0;
if (r == 0) return;
- for (sev_p = sev. begin(), prime_p = prime; sev_p != sev. begin() + NPrime; ++ sev_p, ++ prime_p) {
+ for (sev_p = sev. begin(), prime_p = prime; sev_p != sev. begin() +(ptrdiff_t) NPrime; ++ sev_p, ++ prime_p) {
int extra = 1;
do {
@@ -239,11 +243,11 @@ namespace LinBox
compute_local (local, A, *prime_p, *sev_p + extra);
//check
report << " Check if it agrees with the rank: ";
- if ((local[r-1] % m != 0 ) && ((r == order) ||(local[r] % m == 0))) {report << "yes.\n"; break;}
+ if ((local[(size_t)r-1] % m != 0 ) && ((r == order) ||(local[(size_t)r] % m == 0))) {report << "yes.\n"; break;}
report << "no. \n";
extra *= 2;
} while (true);
- for (s_p = s. begin(), local_p = local. begin(); s_p != s. begin() + order; ++ s_p, ++ local_p)
+ for (s_p = s. begin(), local_p = local. begin(); s_p != s. begin() +(ptrdiff_t) order; ++ s_p, ++ local_p)
*s_p *= *local_p;
}
report << "Computation of the smooth part is done.\n";
@@ -256,7 +260,7 @@ namespace LinBox
* By EGV+ algorithm or Iliopoulos' algorithm for Smith form.
*/
template <class Matrix>
- void SmithFormAdaptive::smithFormRough (std::vector<integer>& s, const Matrix& A, integer m)
+ void SmithFormAdaptive::smithFormRough (BlasVector<Givaro::ZRing<Integer> >& s, const Matrix& A, integer m)
{
std::ostream& report = commentator().report (Commentator::LEVEL_IMPORTANT, PROGRESS_REPORT);
@@ -270,17 +274,17 @@ namespace LinBox
report << " Elimination starts:\n";
PIRModular<int32_t> R (m);
BlasMatrix<PIRModular<int32_t> > A_ilio(R, A.rowdim(), A.coldim());
- MatrixHom::map (A_ilio, A, R);
+ MatrixHom::map (A_ilio, A);
SmithFormIliopoulos::smithFormIn (A_ilio);
- int i; std::vector<integer>::iterator s_p;
- for (i = 0, s_p = s. begin(); s_p != s. begin() + order; ++ i, ++ s_p)
- R. convert(*s_p, A_ilio[i][i]);
+ int i; BlasVector<Givaro::ZRing<Integer> >::iterator s_p;
+ for (i = 0, s_p = s. begin(); s_p != s. begin() +(ptrdiff_t) order; ++ i, ++ s_p)
+ R. convert(*s_p, A_ilio[(size_t)i][(size_t)i]);
report << " Elimination ends.\n";
}
// else if bisection possible
else if (m > T) {
report << " Big rough part, bisection starts:\n";
- typedef Modular<int> Field;
+ typedef Givaro::Modular<int> Field;
typedef typename Matrix::Field Ring;
typedef RationalSolverAdaptive Solver;
typedef LastInvariantFactor<Ring, Solver> LIF;
@@ -288,11 +292,11 @@ namespace LinBox
SmithFormBinary<Ring, OIF, MatrixRank<Ring, Field > > sf;;
sf. setOIFThreshold (2);
sf. setLIFThreshold (2);
- std::vector<long> primeL (prime, prime + NPrime);
- std::vector<typename Ring::Element> out (order);
+ std::vector<int64_t> primeL (prime, prime + NPrime);
+ std::vector<typename Ring::Element> out ((size_t)order);
sf. smithForm (out, A, primeL);
typename std::vector<typename Ring::Element>::iterator out_p;
- std::vector<integer>::iterator s_p;
+ BlasVector<Givaro::ZRing<Integer> >::iterator s_p;
for (s_p = s. begin(), out_p = out. begin(); out_p != out. end(); ++ out_p, ++ s_p)
A. field(). convert (*s_p, *out_p);
report << " Big rough part, bisection ends.\n";
@@ -301,20 +305,20 @@ namespace LinBox
report << " Elimination start:\n";
PIR_ntl_ZZ_p R (m);
BlasMatrix<PIR_ntl_ZZ_p> A_ilio(R, A.rowdim(), A.coldim());
- MatrixHom::map (A_ilio, A, R);
+ MatrixHom::map (A_ilio, A);
SmithFormIliopoulos::smithFormIn (A_ilio);
- int i; std::vector<integer>::iterator s_p;
- for (i = 0, s_p = s. begin(); s_p != s. begin() + order; ++ i, ++ s_p)
- R. convert(*s_p, A_ilio[i][i]);
+ int i; BlasVector<Givaro::ZRing<Integer> >::iterator s_p;
+ for (i = 0, s_p = s. begin(); s_p != s. begin() +(ptrdiff_t) order; ++ i, ++ s_p)
+ R. convert(*s_p, A_ilio[(size_t)i][(size_t)i]);
report << " Elimination ends.\n";
}
report << "Compuation of the k-rough part of the invariant factors finishes.\n";
}
#else
template <class Matrix>
- void SmithFormAdaptive::smithFormRough (std::vector<integer>& s, const Matrix& A, integer m)
+ void SmithFormAdaptive::smithFormRough (BlasVector<Givaro::ZRing<Integer> >& s, const Matrix& A, integer m)
{
- throw(LinBoxError("you need NTL to use SmithFormAdaptive",__func__,__FILE__,__LINE__));
+ throw(LinBoxError("you need NTL to use SmithFormAdaptive",LB_FILE_LOC));
}
#endif
@@ -323,23 +327,30 @@ namespace LinBox
* r >= 2;
*/
template <class Matrix>
- void SmithFormAdaptive::smithFormVal (std::vector<integer>&s, const Matrix& A, long r, const std::vector<long>& sev)
+ void SmithFormAdaptive::smithFormVal (BlasVector<Givaro::ZRing<Integer> >&s, const Matrix& A, long r, const std::vector<int64_t>& sev)
{
//....
+ Givaro::ZRing<Integer> Z;
std::ostream& report = commentator().report (Commentator::LEVEL_IMPORTANT, PROGRESS_REPORT);
report << "Computation the local smith form at each possible prime:\n";
int order = (int)(A. rowdim() < A. coldim() ? A. rowdim() : A. coldim());
linbox_check (s. size() >= (unsigned long)order);
- std::vector<long>::const_iterator sev_p; const long* prime_p; std::vector<integer>::iterator s_p;
- std::vector<integer> local(order); std::vector<integer>::iterator local_p;
- for (s_p = s. begin(); s_p != s. begin() + r; ++ s_p)
+ std::vector<int64_t>::const_iterator sev_p;
+ const int64_t* prime_p;
+
+ BlasVector<Givaro::ZRing<Integer> >::iterator s_p;
+ BlasVector<Givaro::ZRing<Integer> > local(Z,(size_t)order);
+
+ BlasVector<Givaro::ZRing<Integer> >::iterator local_p;
+
+ for (s_p = s. begin(); s_p != s. begin() +(ptrdiff_t) r; ++ s_p)
*s_p = 1;
for (; s_p != s. end(); ++ s_p)
*s_p = 0;
if (r == 0) return;
- for (sev_p = sev. begin(), prime_p = prime; sev_p != sev. begin() + NPrime; ++ sev_p, ++ prime_p) {
+ for (sev_p = sev. begin(), prime_p = prime; sev_p != sev. begin() +(ptrdiff_t) NPrime; ++ sev_p, ++ prime_p) {
if (*sev_p <= 0) continue;
//only compute the local Smith form at each possible prime
int extra = 2;
@@ -356,11 +367,11 @@ namespace LinBox
compute_local (local, A, *prime_p, extra);
//check
report << " Check if it agrees with the rank: ";
- if ((local[r-1] % m != 0 ) && ((r == order) ||(local[r] % m == 0))) {report << "yes.\n"; break;}
+ if ((local[(size_t)r-1] % m != 0 ) && ((r == order) ||(local[(size_t)r] % m == 0))) {report << "yes.\n"; break;}
report << "no. \n";
extra *= 2;
} while (true);
- for (s_p = s. begin(), local_p = local. begin(); s_p != s. begin() + order; ++ s_p, ++ local_p)
+ for (s_p = s. begin(), local_p = local. begin(); s_p != s. begin() +(ptrdiff_t) order; ++ s_p, ++ local_p)
*s_p *= *local_p;
}
report << "Computation of the smith form done.\n";
@@ -374,7 +385,7 @@ namespace LinBox
* then based on that, compute the rough and smooth part, seperately.
*/
template <class Matrix>
- void SmithFormAdaptive::smithForm (std::vector<integer>& s, const Matrix& A)
+ void SmithFormAdaptive::smithForm (BlasVector<Givaro::ZRing<Integer> >& s, const Matrix& A)
{
//commentator().start ("Smith Form starts", "Smithform");
@@ -386,20 +397,20 @@ namespace LinBox
report << "Computation of the rank starts:\n";
typedef typename Matrix::Field Ring;
unsigned long r;
- MatrixRank<Ring, Modular<int32_t> > MR;
+ MatrixRank<Ring, Givaro::Modular<int32_t> > MR;
r = MR. rank (A);
report << " Matrix rank over a random prime field: " << r << '\n';
report << "Computation of the rank finished.\n";
- const long* prime_p;
- std::vector<long> e(NPrime); std::vector<long>::iterator e_p;
+ const int64_t* prime_p;
+ std::vector<int64_t> e(NPrime); std::vector<int64_t>::iterator e_p;
report <<" Compute the degree of min poly of AA^T: \n";
- typedef Modular<int32_t> Field;
+ typedef Givaro::Modular<int32_t> Field;
integer Val; Field::Element v; unsigned long degree;
- RandomPrimeIterator rg ((int)(log( (double)(FieldTraits<Field>::maxModulus()) ) / M_LN2 - 2));
- Field F ((unsigned long)*rg);
+ RandomPrimeIterator rg; rg.template setBitsField<Field>();
+ Field F (*rg);
typename MatrixHomTrait<Matrix, Field>::value_type Ap(F, A.rowdim(), A.coldim());
- MatrixHom::map (Ap, A, F);
+ MatrixHom::map (Ap, A);
Valence::one_valence (v, degree, Ap);
report <<" Degree of minimal polynomial of AA^T = " << degree << '\n';
// if degree is small
@@ -420,6 +431,7 @@ namespace LinBox
if (Val == 1) {
smithFormVal (s, A, r, e);
report << "Computation of the invariant factors ends." << std::endl;
+ //cerr << "Computation of the invariant factors ends." << std::endl;
return;
}
else
@@ -435,7 +447,7 @@ namespace LinBox
//Chnage A to BlasMatrix
Ring R(A. field());
BlasMatrix<Ring> DA(R,A.rowdim(),A.coldim());
- MatrixHom::map (DA, A, R);
+ MatrixHom::map (DA, A);
do {
oif. oneInvariantFactor_Bonus (_lif, _bonus, DA, (int)r);
@@ -456,13 +468,14 @@ namespace LinBox
}
// bonus assigns to its rough part
bonus = gcd (bonus, r_mod);
- std::vector<integer> smooth (order), rough (order);
+ Givaro::ZRing<Integer> Z;
+ BlasVector<Givaro::ZRing<Integer> > smooth (Z,(size_t)order), rough (Z,(size_t)order);
smithFormRough (rough, DA, bonus);
smithFormSmooth (smooth, A, r, e);
//fixed the rough largest invariant factor
if (r > 0) rough[r-1] = r_mod;
- std::vector<integer>::iterator s_p, rough_p, smooth_p;
+ BlasVector<Givaro::ZRing<Integer> >::iterator s_p, rough_p, smooth_p;
/*
report << "Smooth part\n";
@@ -470,15 +483,15 @@ namespace LinBox
report<< *smooth_p << ' ';
report<< '\n';
report<<"Rough part\n";
- for (rough_p = rough. begin(); rough_p != rough. begin() + r; ++ rough_p)
+ for (rough_p = rough. begin(); rough_p != rough. begin() +(ptrdiff_t) r; ++ rough_p)
report<< *rough_p << ' ';
report<< '\n';
*/
- for (rough_p = rough. begin(); rough_p != rough. begin() + r; ++ rough_p)
+ for (rough_p = rough. begin(); rough_p != rough. begin() +(ptrdiff_t) r; ++ rough_p)
if (* rough_p == 0) *rough_p = bonus;
- for (s_p = s. begin(), smooth_p = smooth. begin (), rough_p = rough. begin(); s_p != s. begin() + order; ++s_p, ++ smooth_p, ++ rough_p)
+ for (s_p = s. begin(), smooth_p = smooth. begin (), rough_p = rough. begin(); s_p != s. begin() +(ptrdiff_t) order; ++s_p, ++ smooth_p, ++ rough_p)
*s_p = *smooth_p * *rough_p;
report << "Computation of the invariant factors ends." << std::endl;
@@ -491,33 +504,39 @@ namespace LinBox
* Otherwise, compute the largest invariant factor,
* then based on that, compute the rough and smooth part, seperately.
*/
- template <class IRing>
- void SmithFormAdaptive::smithForm (std::vector<integer>& s, const BlasMatrix<IRing>& A)
+ template <class IRing, class _Rep>
+ void SmithFormAdaptive::smithForm (BlasVector<Givaro::ZRing<Integer> >& s, const BlasMatrix<IRing, _Rep>& A)
{
//commentator().start ("Smith Form starts", "Smithform");
+ Givaro::ZRing<Integer> Z;
std::ostream& report = commentator().report (Commentator::LEVEL_IMPORTANT, PROGRESS_REPORT);
report << "Computation of the invariant factors starts (via an adaptive alg):" << std::endl;
+ //cerr << "Computation of the invariant factors starts (via an adaptive alg):" << std::endl;
// compute the rank over a random prime field.
- int order = (int)(A. rowdim() < A. coldim() ? A. rowdim() : A. coldim());
- report << "Computation of the rank starts:\n";
- typedef typename BlasMatrix<IRing>::Field Ring;
+ const size_t order = (A. rowdim() < A. coldim() ? A. rowdim() : A. coldim());
+
+ report << "Computation of the rank starts:" << std::endl;
+ typedef typename BlasMatrix<IRing,_Rep>::Field Ring;
unsigned long r;
- MatrixRank<Ring, Modular<int32_t> > MR;
- r = MR. rank (A);
- report << " Matrix rank over a random prime field: " << r << '\n';
+ MatrixRank<Ring, Givaro::Modular<int32_t> > MR;
+ r = (unsigned long)MR. rank (A);
+ report << " Matrix rank over a random prime field: " << r << std::endl;
report << "Computation of the rank finished.\n";
- const long* prime_p;
- std::vector<long> e(NPrime); std::vector<long>::iterator e_p;
+ // a hack
+ if (r == 0) { for (size_t i = 0; i < order; ++i) s[i]=0; return; }
+ const int64_t* prime_p;
+ std::vector<int64_t> e(NPrime); std::vector<int64_t>::iterator e_p;
report <<" Compute the degree of min poly of AA^T: \n";
- typedef Modular<int32_t> Field;
- integer Val; Field::Element v; unsigned long degree;
- RandomPrimeIterator rg ((int)(log( (double)(FieldTraits<Field>::maxModulus()) ) / M_LN2 - 2));
- Field F ((unsigned long)*rg);
- typename MatrixHomTrait<BlasMatrix <IRing>, Field>::value_type Ap(F,A.rowdim(),A.coldim());
- MatrixHom::map (Ap, A, F);
+ typedef Givaro::Modular<int32_t> Field;
+ integer Val; Field::Element v; size_t degree;
+ //integer Val; Field::Element v; unsigned long degree;
+ RandomPrimeIterator rg; rg.template setBitsField<Field>();
+ Field F (*rg);
+ typename MatrixHomTrait<BlasMatrix <IRing, _Rep>, Field>::value_type Ap(F,A.rowdim(),A.coldim());
+ MatrixHom::map (Ap, A);
Valence::one_valence (v, degree, Ap);
report <<" Degree of minial polynomial of AA^T = " << degree << '\n';
// if degree is small
@@ -536,7 +555,7 @@ namespace LinBox
}
}
if (Val == 1) {
- smithFormVal (s, A, r, e);
+ smithFormVal (s, A, (long)r, e);
report << "Computation of the invariant factors ends." << std::endl;
return;
}
@@ -570,13 +589,13 @@ namespace LinBox
}
// bonus assigns to its rough part
bonus = gcd (bonus, r_mod);
- std::vector<integer> smooth (order), rough (order);
- smithFormSmooth (smooth, A, r, e);
+ BlasVector<Givaro::ZRing<Integer> > smooth (Z,order), rough (Z,order);
+ smithFormSmooth (smooth, A, (long)r, e);
smithFormRough (rough, A, bonus);
// fixed the rough largest invariant factor
if (r > 0) rough[r-1] = r_mod;
- std::vector<integer>::iterator s_p, rough_p, smooth_p;
+ BlasVector<Givaro::ZRing<Integer> >::iterator s_p, rough_p, smooth_p;
/*
report << "Smooth part\n";
@@ -584,15 +603,15 @@ namespace LinBox
report<< *smooth_p << ' ';
report<< '\n';
report<<"Rough part\n";
- for (rough_p = rough. begin(); rough_p != rough. begin() + r; ++ rough_p)
+ for (rough_p = rough. begin(); rough_p != rough. begin() +(ptrdiff_t) r; ++ rough_p)
report<< *rough_p << ' ';
report<< '\n';
*/
- for (rough_p = rough. begin(); rough_p != rough. begin() + r; ++ rough_p)
+ for (rough_p = rough. begin(); rough_p != rough. begin() + (ptrdiff_t)r; ++ rough_p)
if (* rough_p == 0) *rough_p = bonus;
- for (s_p = s. begin(), smooth_p = smooth. begin (), rough_p = rough. begin(); s_p != s. begin() + order; ++s_p, ++ smooth_p, ++ rough_p)
+ for (s_p = s. begin(), smooth_p = smooth. begin (), rough_p = rough. begin(); s_p != s. begin() + (ptrdiff_t)order; ++s_p, ++ smooth_p, ++ rough_p)
*s_p = *smooth_p * *rough_p;
report << "Computation of the invariant factors ends." << std::endl;
@@ -604,11 +623,10 @@ namespace LinBox
#endif //__LINBOX_smith_form_adaptive_INL
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
// Local Variables:
// mode: C++
// tab-width: 8
// indent-tabs-mode: nil
// c-basic-offset: 8
// End:
-
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/algorithms/smith-form-binary.h b/linbox/algorithms/smith-form-binary.h
index 63dc753..7646403 100644
--- a/linbox/algorithms/smith-form-binary.h
+++ b/linbox/algorithms/smith-form-binary.h
@@ -112,18 +112,16 @@ namespace LinBox
typename Vector::iterator p;
- Integer zero;
long Ar = rank.rank(A);
report << "Rank = " << Ar <<'\n';
- r.init (zero,0);
// set k-th invariant factor to zero for all k > Ar
for (p = sf.begin() + Ar; p!= sf.end(); ++p)
- r.assign(*p,zero);
+ r.assign(*p,r.zero);
// A is a zero matrix
@@ -172,11 +170,11 @@ namespace LinBox
}
- oif.oneInvariantFactor(sf[Ar - 1], A, (int)Ar, PrimeL);
+ oif.oneInvariantFactor(sf[(size_t)Ar - 1], A, (int)Ar, PrimeL);
report << "Biggest invariant factor = ";
- r. write (report, sf[Ar - 1]);
+ r. write (report, sf[(size_t)Ar - 1]);
report << '\n' << std::flush;
@@ -221,7 +219,7 @@ namespace LinBox
Integer& firstInvariantFactor(Integer& fif, const IMatrix& A, const Vector& PrimeL) const
{
- r.init(fif,0);
+ r.assign(fif,r.zero);
typename IMatrix::ConstIterator A_p;
@@ -245,7 +243,7 @@ namespace LinBox
// filter out primes in PRIME from lif
for ( Prime_p = PrimeL.begin(); Prime_p != PrimeL.end(); ++ Prime_p) {
- r.init (p,(unsigned long) *Prime_p);
+ r.init (p, *Prime_p);
do {
r.quoRem(quo,rem,fif,p);
@@ -263,7 +261,7 @@ namespace LinBox
/** \brief Binary search invariant factors between i and j, missing those factors in PrimeL
- * suppose sf[i - 1], sf [j - 1] are ith and jth invariant factor of A
+ * suppose sf[(size_t)i - 1], sf [j - 1] are ith and jth invariant factor of A
* i <= j
*/
@@ -282,9 +280,9 @@ namespace LinBox
if (j <= i + 1) return sf;
// if i-th invariant factor == j-th invariant factor
- if (r.areEqual(sf[i - 1], sf[j - 1])) {
+ if (r.areEqual(sf[(size_t)i - 1], sf[(size_t)j - 1])) {
for (p = sf.begin() + i; p != sf.begin() + (j -1); ++ p)
- r.assign (*p, sf[i-1]);
+ r.assign (*p, sf[(size_t)i-1]);
return sf;
}
@@ -293,11 +291,11 @@ namespace LinBox
report << "Start to compute " << mid << "-th invariant factor:\n" << std::flush;
- oif.oneInvariantFactor (sf[mid - 1], A, mid, PrimeL);
+ oif.oneInvariantFactor (sf[(size_t)mid - 1], A, mid, PrimeL);
report << mid <<"-th invairant factor of A = " ;
- r.write (report, sf[mid -1]);
+ r.write (report, sf[(size_t)mid -1]);
report << "\n" << std::flush;
@@ -327,18 +325,16 @@ namespace LinBox
typename Vector::iterator p;
- Integer zero;
long Ar = rank.rank(A);
report << "Rank = " << Ar <<'\n';
- r.init (zero,0);
// set k-th invariant factor to zero for all k > Ar
for (p = sf.begin() + Ar; p!= sf.end(); ++p)
- r.assign(*p,zero);
+ r.assign(*p,r.zero);
// A is a zero matrix
@@ -387,11 +383,11 @@ namespace LinBox
}
- oif.oneInvariantFactor(sf[Ar - 1], A, Ar, PrimeL);
+ oif.oneInvariantFactor(sf[(size_t)Ar - 1], A, Ar, PrimeL);
report << "Biggest invariant factor = ";
- r. write (report, sf[Ar - 1]);
+ r. write (report, sf[(size_t)Ar - 1]);
report << '\n' << std::flush;
@@ -431,7 +427,7 @@ namespace LinBox
protected:
/** \brief Binary search invariant factors between i and j, missing those factors in PrimeL
- * suppose sf[i - 1], sf [j - 1] are ith and jth invariant factor of A
+ * suppose sf[(size_t)i - 1], sf [j - 1] are ith and jth invariant factor of A
* i <= j
*/
@@ -450,9 +446,9 @@ namespace LinBox
if (j <= i + 1) return sf;
// if i-th invariant factor == j-th invariant factor
- if (r.areEqual(sf[i - 1], sf[j - 1])) {
+ if (r.areEqual(sf[(size_t)i - 1], sf[(size_t)j - 1])) {
for (p = sf.begin() + i; p != sf.begin() + (j -1); ++ p)
- r.assign (*p, sf[i-1]);
+ r.assign (*p, sf[(size_t)i-1]);
return sf;
}
@@ -461,17 +457,17 @@ namespace LinBox
report << "Start to compute " << mid << "-th invariant factor:\n" << std::flush;
- oif.oneInvariantFactor (sf[mid - 1], A, mid, PrimeL);
+ oif.oneInvariantFactor (sf[(size_t)mid - 1], A, mid, PrimeL);
report << mid <<"-th invairant factor of A = " ;
- r.write (report, sf[mid -1]);
+ r.write (report, sf[(size_t)mid -1]);
report << "\n" << std::flush;
// recursively binary search all k-invariant factors, where i <= k <= mid
- if (r. areEqual (sf[mid-1], sf[j-1]))
+ if (r. areEqual (sf[(size_t)mid-1], sf[(size_t)j-1]))
smithFormBinarySearchBackward (sf, A, i, mid, 2 * depth, PrimeL);
else
smithFormBinarySearchBackward (sf, A, i, mid, depth, PrimeL);
diff --git a/linbox/algorithms/smith-form-iliopoulos.h b/linbox/algorithms/smith-form-iliopoulos.h
index 47231b9..c9bcc3e 100644
--- a/linbox/algorithms/smith-form-iliopoulos.h
+++ b/linbox/algorithms/smith-form-iliopoulos.h
@@ -32,10 +32,10 @@
namespace LinBox
{
- /** \brief This is Iliopoulos' algorithm do diagonalize.
+ /** \brief This is Iliopoulos' algorithm to diagonalize.
- * Compute Smith Form by elimination modulo m, for some modulus m such
- * as S(n), the last invariant factor.
+ * Compute Smith Form by elimination modulo m,
+ * for m = S(n), the last invariant factor.
* The elimination method is originally described in
* @bib
* <i>Worst Case Complexity Bounds on Algorithms for computing the Canonical
@@ -49,7 +49,9 @@ namespace LinBox
protected:
/** \brief eliminationRow will make the first row (*, 0, ..., 0)
* by col operations.
- * It is the implementation of Iliopoulos algorithm
+ * It is the implementation of Iliopoulos algorithm.
+ * A Ring has basic ring functions
+ * plus gcd, xgcd, isDivisor, isUnit, normalIn
*/
template<class Matrix, class Ring>
static Matrix& eliminationRow (Matrix& A, const Ring& r)
@@ -106,7 +108,10 @@ namespace LinBox
Element g, s, t;
- r. dxgcd (g, s, t, y2, y1, *row_p1, *row_p2);
+ //r. dxgcd (g, s, t, y2, y1, *row_p1, *row_p2);
+ r. xgcd (g, s, t, *row_p1, *row_p2);
+ r.div(y2, *row_p1, g);
+ r.div(y1, *row_p2, g);
r. negin (y1);
@@ -143,7 +148,7 @@ namespace LinBox
typename std::vector<Element>::iterator p1, p2;
- r. init(tmp_v[0], 1);
+ r. assign(tmp_v[0], r.one);
p1 = tmp_v.begin() + 1;
p2 = tmp_v.begin() + 1;
@@ -154,7 +159,7 @@ namespace LinBox
r.assign(g, *row_p2); ++ row_p2;
- r.init(*p1, 1); ++ p1;
+ r.assign(*p1, r.one); ++ p1;
for (; row_p2 != cur_r -> end(); ++ row_p2, ++ p1) {
@@ -183,7 +188,7 @@ namespace LinBox
// after finding the pivot
- // column operation to make A[p][j] = 0, where k < j
+ // column operation to make A[p][(size_t)j] = 0, where k < j
Element g, tmp;
@@ -265,7 +270,10 @@ namespace LinBox
col_p2 = col_p1 + 1;
- r.dxgcd(g, s, t, y2, y1, *col_p1, *col_p2);
+ //r.dxgcd(g, s, t, y2, y1, *col_p1, *col_p2);
+ r. xgcd (g, s, t, *col_p1, *col_p2);
+ r.div(y2, *col_p1, g);
+ r.div(y1, *col_p2, g);
r. negin (y1);
@@ -309,11 +317,11 @@ namespace LinBox
r.assign (g, *col_p2); ++ col_p2;
- r. init (tmp_v[0], 1);
+ r. assign(tmp_v[0], r.one);
p1 = tmp_v.begin() + 1;
- r.init(*p1,1); ++ p1;
+ r.assign(*p1,r.one); ++ p1;
for(; col_p2 != cur_c -> end(); ++ col_p2, ++ p1) {
@@ -377,7 +385,7 @@ namespace LinBox
cur_r = A.rowBegin();
row_p = cur_r -> begin();
- tmp = * (A.rowBegin() -> begin());
+ tmp = *row_p;// (A.rowBegin() -> begin());
if (r.isZero(tmp)) return true;
@@ -399,14 +407,15 @@ namespace LinBox
if (A.rowdim() == 0 || A.coldim() == 0) return A;
-
- do {
+ //eliminationCol (A, r);
+ //if (!check(A, r))
+ do {
eliminationRow (A, r);
eliminationCol (A, r);
- }
- while (!check(A, r));
+ }
+ while (!check(A, r));
typedef typename SubMatrixTraits<Matrix>::value_type sub_mat_t ;
@@ -422,6 +431,17 @@ namespace LinBox
public:
+ template <class Vector,class Matrix>
+ static void solve(Vector& factors,const Matrix& A)
+ {
+ Matrix B(A);
+ smithFormIn(B);
+ factors.resize(B.rowdim());
+ for (int i=0;i<B.rowdim();++i) {
+ A.field().assign(factors[i],B.getEntry(i,i));
+ }
+ }
+
template<class Matrix>
static Matrix& smithFormIn(Matrix& A) {
@@ -432,12 +452,6 @@ namespace LinBox
typename Matrix::RowIterator row_p;
- Element zero, one;
-
- r. init (zero, 0);
-
- r. init (one, 1);
-
diagonalizationIn(A, r);
int min = (int)(A.rowdim() <= A.coldim() ? A.rowdim() : A.coldim());
@@ -450,25 +464,25 @@ namespace LinBox
for ( j = i + 1; j < min; ++ j) {
- if (r. isUnit(A[i][i])) break;
+ if (r. isUnit(A[(size_t)i][(size_t)i])) break;
- else if (r. isZero (A[j][j])) continue;
+ else if (r. isZero (A[(size_t)j][(size_t)j])) continue;
- else if (r. isZero (A[i][i])) {
- std::swap (A[i][i], A[j][j]);
+ else if (r. isZero (A[(size_t)i][(size_t)i])) {
+ std::swap (A[(size_t)i][(size_t)i], A[(size_t)j][(size_t)j]);
}
else {
- r. gcd (g, A[j][j], A[i][i]);
+ r. gcd (g, A[(size_t)j][(size_t)j], A[(size_t)i][(size_t)i]);
- r. divin (A[j][j], g);
+ r. divin (A[(size_t)j][(size_t)j], g);
- r. mulin (A[j][j], A[i][i]);
+ r. mulin (A[(size_t)j][(size_t)j], A[(size_t)i][(size_t)i]);
- r. assign (A[i][i], g);
+ r. assign (A[(size_t)i][(size_t)i], g);
}
}
- r. normalIn (A[i][i]);
+ r. normalIn (A[(size_t)i][(size_t)i]);
}
return A;
diff --git a/linbox/algorithms/smith-form-iliopoulos2.h b/linbox/algorithms/smith-form-iliopoulos2.h
new file mode 100644
index 0000000..25f794b
--- /dev/null
+++ b/linbox/algorithms/smith-form-iliopoulos2.h
@@ -0,0 +1,468 @@
+/* Copyright (C) 2015 LinBox
+ *
+ * Author: Gavin Harrison
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ * ========LICENCE========
+ */
+
+#ifndef __LINBOX_smith_form_iliopoulos2_H
+#define __LINBOX_smith_form_iliopoulos2_H
+
+namespace LinBox
+{
+
+template<class _Field>
+class IliopoulosDomain {
+public:
+ typedef _Field Field;
+ typedef MatrixDomain<Field> Domain;
+ typedef typename Domain::OwnMatrix Matrix;
+ typedef typename Field::Element Element;
+
+protected:
+ Domain _MD;
+ Field _F;
+
+public:
+ void xgcd(
+ Element &g,
+ std::vector<Element> &ts,
+ const std::vector<Element> &as)
+ {
+ ts.resize(as.size());
+ _F.assign(ts[0], _F.one);
+ _F.assign(g, as[0]);
+
+ for (size_t i = 1; i < as.size(); i++) {
+ Element r, t1, t2;
+ _F.gcd(r, t1, t2, g, as[i]);
+
+ for (size_t j = 0; j < i; j++) {
+ _F.mulin(ts[j], t1);
+ }
+
+ _F.assign(ts[i], t2);
+ _F.assign(g, r);
+ }
+ }
+
+ void swapRows(Matrix &A, size_t a, size_t b)
+ {
+ size_t n = A.coldim();
+
+ Element tmp1, tmp2;
+ for (size_t i = 0; i < n; i++) {
+ A.getEntry(tmp1, a, i);
+ A.getEntry(tmp2, b, i);
+
+ A.setEntry(a, i, tmp2);
+ A.setEntry(b, i, tmp1);
+ }
+ }
+
+ void swapCols(Matrix &A, size_t a, size_t b)
+ {
+ size_t n = A.coldim();
+
+ Element tmp1, tmp2;
+ for (size_t i = 0; i < n; i++) {
+ A.getEntry(tmp1, i, a);
+ A.getEntry(tmp2, i, b);
+
+ A.setEntry(i, a, tmp2);
+ A.setEntry(i, b, tmp1);
+ }
+ }
+
+ bool isRowZero(const Matrix &A, size_t p)
+ {
+ size_t n = A.coldim();
+
+ Element tmp;
+ for (size_t i = p; i < n; i++) {
+ if (!_F.isZero(_MD.getEntry(tmp, p, i))) {
+ return false;
+ }
+ }
+
+ return true;
+ }
+
+ bool moveNonzeroRowToPivot(Matrix &A, size_t p)
+ {
+ size_t n = A.coldim();
+
+ if (!isRowZero(A, p)) {
+ return true;
+ }
+
+ for (size_t i = p; i < n; i++) {
+ if (!isRowZero(A, i)) {
+ swapRows(A, p, i);
+ return true;
+ }
+ }
+
+ return false;
+ }
+
+ bool moveZeroColToPivot(Matrix &A, size_t p)
+ {
+ size_t n = A.coldim();
+
+ Element tmp;
+ if (_F.isZero(A.getEntry(tmp, p, p))) {
+ return true;
+ }
+
+ for (size_t i = p+1; i < n; i++) {
+ if (_F.isZero(A.getEntry(tmp, p, i))) {
+ swapCols(A, p, i);
+ return true;
+ }
+ }
+
+ return false;
+ }
+
+ void makePivotColZero(Matrix &A, size_t p)
+ {
+ Element r, x1, x2, y1, y2, a, b;
+
+ A.getEntry(a, p, p);
+ A.getEntry(b, p, p+1);
+
+ _F.gcd(r, x1, x2, a, b);
+
+ _F.div(y1, b, r);
+ _F.div(y2, a, r);
+ _F.negin(y2);
+
+ size_t n = A.coldim();
+
+ for (size_t i = 0; i < n; i++) {
+ A.getEntry(a, i, p);
+ A.getEntry(b, i, p+1);
+
+ Element new_a, new_b, tmp;
+ _F.mul(tmp, y1, a);
+ _F.mul(new_a, y2, b);
+ _F.addin(new_a, tmp);
+
+ _F.mul(tmp, x1, a);
+ _F.mul(new_b, x2, b);
+ _F.addin(new_b, tmp);
+
+ A.setEntry(i, p, new_a);
+ A.setEntry(i, p+1, new_b);
+ }
+ }
+
+ void makePivotRowZero(Matrix &A, size_t p)
+ {
+ Element r, x1, x2, y1, y2, a, b;
+
+ A.getEntry(a, p, p);
+ A.getEntry(b, p+1, p);
+
+ _F.gcd(r, x1, x2, a, b);
+ _F.div(y1, b, r);
+ _F.div(y2, a, r);
+ _F.negin(y2);
+
+ size_t n = A.rowdim();
+
+ for (size_t i = 0; i < n; i++) {
+ A.getEntry(a, p, i);
+ A.getEntry(b, p+1, i);
+
+ Element new_a, new_b, tmp;
+ _F.mul(tmp, y1, a);
+ _F.mul(new_a, y2, b);
+ _F.addin(new_a, tmp);
+
+ _F.mul(tmp, x1, a);
+ _F.mul(new_b, x2, b);
+ _F.addin(new_b, tmp);
+
+ A.setEntry(p, i, new_a);
+ A.setEntry(p+1, i, new_b);
+ }
+ }
+
+ void scaleAndAddColsToPivotCol(
+ Matrix &A,
+ const std::vector<Element> &ts,
+ size_t p)
+ {
+ size_t n = A.coldim();
+
+ // Add cols p+1 to n into p, scaled by ts[i]
+ for (size_t j = p; j < n; j++) {
+ Element a;
+ A.getEntry(a, j, p);
+
+ for (size_t i = p+1; i < n; i++) {
+ Element b, tmp;
+ A.getEntry(b, j, i);
+ _F.mulin(b, ts[i - p - 1]);
+ _F.addin(a, b);
+ }
+
+ A.setEntry(j, p, a);
+ }
+ }
+
+ void eliminateOffPivotCols(Matrix &A, Element &s, size_t p)
+ {
+ size_t n = A.coldim();
+
+ // zero out other columns entry in pivot row
+ for (size_t i = p+1; i < n; i++) {
+ Element q;
+ A.getEntry(q, p, i);
+ _F.divin(q, s);
+
+ for (size_t j = p; j < n; j++) {
+ Element a, b, tmp;
+ A.getEntry(a, j, p);
+ A.getEntry(b, j, i);
+ _F.mul(tmp, a, q);
+ _F.subin(b, tmp);
+ A.setEntry(j, i, b);
+ }
+ }
+ }
+
+ void reduceEntries(Matrix &A, const Element &d, size_t p)
+ {
+ size_t n = A.coldim();
+
+ // reduce entries mod d
+ for (size_t i = p; i < n; i++) {
+ for (size_t j = p; j < n; j++) {
+ Element tmp;
+ A.getEntry(tmp, i, j);
+ _F.modin(tmp, d);
+ A.setEntry(i, j, tmp);
+ }
+ }
+ }
+
+ void eliminateRow(Matrix &A, const Element &d, size_t p)
+ {
+ size_t n = A.coldim();
+
+ if (!moveZeroColToPivot(A, p)) {
+ makePivotColZero(A, p);
+ }
+
+ std::vector<Element> ks;
+ for (size_t i = p+1; i < n; i++) {
+ Element tmp;
+ A.getEntry(tmp, p, i);
+ ks.push_back(tmp);
+ }
+
+ Element s;
+ std::vector<Element> ts;
+ xgcd(s, ts, ks);
+
+ scaleAndAddColsToPivotCol(A, ts, p);
+
+ eliminateOffPivotCols(A, s, p);
+
+ reduceEntries(A, d, p);
+ }
+
+ bool moveZeroRowToPivot(Matrix &A, size_t p)
+ {
+ size_t n = A.rowdim();
+
+ for (size_t i = p+1; i < n; i++) {
+ Element tmp;
+ A.getEntry(tmp, i, p);
+
+ if (_F.isZero(tmp)) {
+ swapRows(A, p, i);
+ return true;
+ }
+ }
+
+ return false;
+ }
+
+ void scaleAndAddRowsToPivotRow(
+ Matrix &A,
+ const std::vector<Element> &ts,
+ size_t p)
+ {
+ size_t n = A.coldim();
+
+ // Add rows p+1 to n into p, scaled by ts[i]
+ for (size_t j = p; j < n; j++) {
+ Element a;
+ A.getEntry(a, p, j);
+
+ for (size_t i = p+1; i < n; i++) {
+ Element b, tmp;
+ A.getEntry(b, i, j);
+ _F.mulin(b, ts[i - p - 1]);
+ _F.addin(a, b);
+ }
+
+ A.setEntry(p, j, a);
+ }
+ }
+
+ void eliminateOffPivotRows(Matrix &A, Element &s, size_t p)
+ {
+ size_t n = A.coldim();
+
+ // zero out other rows entry in pivot col
+ for (size_t i = p+1; i < n; i++) {
+ Element q;
+ A.getEntry(q, i, p);
+ _F.divin(q, s);
+
+ for (size_t j = p; j < n; j++) {
+ Element a, b, tmp;
+ A.getEntry(a, p, j);
+ A.getEntry(b, i, j);
+ _F.mul(tmp, a, q);
+ _F.subin(b, tmp);
+ A.setEntry(i, j, b);
+ }
+ }
+ }
+
+ void eliminateCol(Matrix &A, const Element &d, size_t p)
+ {
+ size_t n = A.coldim();
+
+ if (!moveZeroRowToPivot(A, p)) {
+ makePivotRowZero(A, p);
+ }
+
+ std::vector<Element> ks;
+ for (size_t i = p+1; i < n; i++) {
+ Element tmp;
+ A.getEntry(tmp, i, p);
+ ks.push_back(tmp);
+ }
+ ks.push_back(d);
+
+ Element s;
+ std::vector<Element> ts;
+ xgcd(s, ts, ks);
+
+ scaleAndAddRowsToPivotRow(A, ts, p);
+ A.setEntry(p, p, s);
+
+ eliminateOffPivotRows(A, s, p);
+
+ reduceEntries(A, d, p);
+ }
+
+ bool pivotDividesRow(Matrix &A, size_t p)
+ {
+ size_t n = A.coldim();
+
+ Element a;
+ A.getEntry(a, p, p);
+
+ for (size_t i = p+1; i < n; i++) {
+ Element b;
+ A.getEntry(b, p, i);
+
+ if (!_F.isDivisor(b, a)) {
+ return false;
+ }
+ }
+
+ return true;
+ }
+
+ void zeroOutRow(Matrix &A, size_t p)
+ {
+ size_t n = A.coldim();
+
+ for (size_t i = p+1; i < n; i++) {
+ A.setEntry(p, i, _F.zero);
+ }
+ }
+
+public:
+ IliopoulosDomain(Field &F) :
+ _MD(F),
+ _F(F)
+ {
+ }
+
+ void smithFormIn(Matrix &A, const Element &d)
+ {
+ size_t n = A.coldim();
+
+ for (size_t p = 0; p < n - 1; p++) {
+ do {
+ eliminateRow(A, d, p);
+ eliminateCol(A, d, p);
+ } while(!pivotDividesRow(A, p));
+ zeroOutRow(A, p);
+ }
+
+ for (size_t p = 0; p < n; p++) {
+ for (size_t q = p+1; q < n; q++) {
+ Element h;
+ A.getEntry(h, p, p);
+
+ Element Aqq;
+ A.getEntry(Aqq, q, q);
+
+ Element App;
+ _F.gcd(App, Aqq, h);
+ _F.divin(h, App);
+ _F.mulin(Aqq, h);
+
+ A.setEntry(p, p, App);
+ A.setEntry(q, q, Aqq);
+ }
+ }
+ }
+
+ template <class PolyRingVector>
+ void smithForm(PolyRingVector &diag, const Matrix &A, const Element &d)
+ {
+ size_t n = A.coldim();
+
+ Matrix B(_F, n, n);
+ _MD.copy(B, A);
+
+ smithFormIn(B, d);
+
+ for (int i = 0; i < n; i++) {
+ B.getEntry(diag[i], i, i);
+ _F.normalizeIn(diag[i]);
+ }
+ }
+};
+
+}
+
+#endif //__LINBOX_smith_form_iliopoulos2_H
\ No newline at end of file
diff --git a/linbox/algorithms/smith-form-kannan-bachem.h b/linbox/algorithms/smith-form-kannan-bachem.h
new file mode 100644
index 0000000..b3daeb5
--- /dev/null
+++ b/linbox/algorithms/smith-form-kannan-bachem.h
@@ -0,0 +1,358 @@
+
+/* tests/__LINBOX_smith_form_kannan_bachem.h
+ * Copyright (C) 2014 Gavin Harrison,
+ *
+ * Written by Gavin Harrison <gmh33 at drexel.edu>,
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ * ========LICENCE========
+ *.
+ */
+
+#include <iostream>
+#include "linbox/matrix/dense-matrix.h"
+
+#ifndef __LINBOX_smith_form_kannan_bachem_domain_H
+#define __LINBOX_smith_form_kannan_bachem_domain_H
+
+namespace LinBox
+{
+ template<class MatrixDomain>
+ class SmithFormKannanBachemDomain
+ {
+ public:
+ typedef typename MatrixDomain::Field Field;
+ typedef typename Field::Element Element;
+ typedef BlasMatrix<Field> Rep;
+
+ private:
+ MatrixDomain _MD;
+ const Field &field() const { return _MD.field(); }
+
+ public:
+ SmithFormKannanBachemDomain(const MatrixDomain &MD) : _MD(MD) {}
+ SmithFormKannanBachemDomain(const SmithFormKannanBachemDomain &D) : _MD(D._MD) {}
+
+ private:
+ void swapRows(Rep &A, int a, int b) const
+ {
+ for (size_t i = 0; i < A.coldim(); i++)
+ {
+ Element tmp1, tmp2;
+
+ A.getEntry(tmp1, a, i);
+ A.getEntry(tmp2, b, i);
+
+ A.setEntry(a, i, tmp2);
+ A.setEntry(b, i, tmp1);
+ }
+ }
+
+ void swapCols(Rep &A, int a, int b) const
+ {
+ for (size_t i = 0; i < A.rowdim(); i++)
+ {
+ Element tmp1, tmp2;
+
+ A.getEntry(tmp1, i, a);
+ A.getEntry(tmp2, i, b);
+
+ A.setEntry(i, a, tmp2);
+ A.setEntry(i, b, tmp1);
+ }
+ }
+
+ // Ensures that if a=b then s=u=v=1 and t=0 to avoid an infinite loop
+ void dxgcd(Element &s, Element &t, Element &u, Element &v, const Element &a, const Element &b) const
+ {
+ if (field().areEqual(a,b))
+ {
+ field().assign(s, field().one);
+ field().assign(t, field().zero);
+ field().assign(u, field().one);
+ field().assign(v, field().one);
+ return;
+ }
+
+ Element g;
+ field().dxgcd(g,s,t,u,v,a,b);
+ }
+
+ bool findPivot(Rep &A, size_t n) const
+ {
+ for (size_t i = n; i < A.rowdim(); i++)
+ {
+ for (size_t j = n; j < A.coldim(); j++)
+ {
+ Element tmp;
+ A.getEntry(tmp, i, j);
+
+ if (!field().isZero(tmp))
+ {
+ if (i != n)
+ swapRows(A, n, i);
+
+ if (j != n)
+ swapCols(A, n, j);
+
+ return true;
+ }
+ }
+ }
+
+ return false;
+ }
+
+ void eliminateCol(Rep &A, int p, int o) const
+ {
+ Element pp, op;
+
+ A.getEntry(op, o, p);
+
+ if (field().isZero(op))
+ return;
+
+ A.getEntry(pp, p, p);
+
+ Element s,t,u,v;
+ dxgcd(s,t,u,v,pp,op);
+
+ for (size_t i = p; i < A.coldim(); i++)
+ {
+ Element pi,oi;
+
+ A.getEntry(pi, p, i);
+ A.getEntry(oi, o, i);
+
+ Element tmp1, tmp2;
+ field().mul(tmp1, s, pi);
+ field().mul(tmp2, t, oi);
+ field().addin(tmp1, tmp2);
+ A.setEntry(p, i, tmp1);
+
+ field().mul(tmp1, pi, v);
+ field().mul(tmp2, oi, u);
+ field().subin(tmp2, tmp1);
+ A.setEntry(o, i, tmp2);
+ }
+ }
+
+ void eliminateRow(Rep &A, int p, int o) const
+ {
+ Element pp, po;
+
+ A.getEntry(po, p, o);
+
+ if (field().isZero(po))
+ return;
+
+ A.getEntry(pp, p, p);
+
+ Element s,t,u,v;
+ dxgcd(s,t,u,v,pp,po);
+
+ for (size_t i = p; i < A.rowdim(); i++)
+ {
+ Element ip, io;
+
+ A.getEntry(ip, i, p);
+ A.getEntry(io, i, o);
+
+ Element tmp1, tmp2;
+
+ field().mul(tmp1, ip, s);
+ field().mul(tmp2, io, t);
+ field().addin(tmp1, tmp2);
+ A.setEntry(i, p, tmp1);
+
+ field().mul(tmp1, ip, v);
+ field().mul(tmp2, io, u);
+ field().subin(tmp2, tmp1);
+ A.setEntry(i, o, tmp2);
+ }
+ }
+
+ void reduceOffDiagonal(Rep &A, int s, int e) const
+ {
+ for (int i = s; i <= e; i++)
+ {
+ Element nii,ii;
+ A.getEntry(ii, i, i);
+ field().normalize(nii,ii);
+
+ Element tmp;
+ field().div(tmp, nii, ii);
+
+ if (field().isOne(tmp))
+ continue;
+
+ // A[i] = A[i,i] * n
+ // where n = normalized(A[i,i]) / A[i,i]
+ A.setEntry(i, i, nii);
+ for (size_t j = i+1; j < A.coldim(); j++)
+ {
+ Element ij;
+ A.getEntry(ij, i, j);
+ field().mulin(ij, tmp);
+ A.setEntry(i, j, ij);
+ }
+ }
+
+ // Ording of reduction here is an improvement to Kannan/Bachem
+ // Introduced by Chou/Collins '82
+ // Reduce from bottom to top and left to right
+ // * 4 5 6
+ // 0 * 2 3
+ // 0 0 * 1
+ // 0 0 0 *
+ for (int i = e-1; i >= s; i--)
+ {
+ for (int j = i+1; j <= e; j++)
+ {
+ Element jj, ij, tmp;
+
+ A.getEntry(ij, i, j);
+ if (field().isZero(ij))
+ continue;
+
+ A.getEntry(jj, j, j);
+ field().quo(tmp, ij, jj);
+
+ // A[i] = A[i] - quo(A[i,j], A[j,j]) * A[j]
+ for (size_t k = j; k < A.coldim(); k++)
+ {
+ Element ik, jk;
+
+ A.getEntry(ik, i, k);
+ A.getEntry(jk, j, k);
+
+ field().mulin(jk, tmp);
+ field().subin(ik, jk);
+
+ A.setEntry(i, k, ik);
+ }
+ }
+ }
+ }
+
+ // Puts the lower-right n-by-n minor of A into Hermite Normal Form
+ void hermite(Rep &A, int n) const
+ {
+ int dim = (int)A.rowdim();
+
+ for (int i = n; i < dim; i++)
+ {
+ for (int j = n; j < i; j++)
+ eliminateCol(A, j, i);
+
+ if (!findPivot(A, i))
+ return;
+
+ reduceOffDiagonal(A, n, i);
+ }
+ }
+
+ bool isRowDiagonalized(const Rep &A, int n) const
+ {
+ for (size_t i = n+1; i < A.coldim(); i++)
+ {
+ Element ni;
+ A.getEntry(ni, n, i);
+ if (!field().isZero(ni))
+ return false;
+ }
+ return true;
+ }
+
+ bool pivotDividesRemaining(Rep &A, int n) const
+ {
+ Element nn;
+ A.getEntry(nn, n, n);
+
+ for (size_t i = n+1; i < A.rowdim(); i++)
+ {
+ for (size_t j = i; j < A.coldim(); j++)
+ {
+ Element ij, g;
+ A.getEntry(ij, i, j);
+
+ if (field().isZero(ij))
+ continue;
+
+ field().gcd(g, nn, ij);
+
+ if (!field().areAssociates(g, nn))
+ {
+ // Add row i to row n
+ for (size_t k = i; k < A.coldim(); k++)
+ {
+ Element ik;
+ A.getEntry(ik, i, k);
+ A.setEntry(n, k, ik);
+ }
+ return false;
+ }
+ }
+ }
+
+ return true;
+ }
+
+ public:
+ template<class Vector>
+ Vector &solve(Vector &S, const Rep &A) const
+ {
+ size_t dim = A.rowdim();
+ linbox_check(A.coldim() == dim && S.size() >= dim);
+
+ Rep B(A);
+
+ for (size_t i = 0; i < dim;)
+ {
+ if (!findPivot(B, i))
+ break;
+
+ for (size_t j = i+1; j < dim; j++)
+ eliminateRow(B, i, j);
+
+ hermite(B, i);
+
+ if (!isRowDiagonalized(B, i))
+ continue;
+
+ if (!pivotDividesRemaining(B, i))
+ continue;
+
+ i++;
+
+ //std::cout << i << "/" << dim << std::endl;
+ }
+
+ for (size_t i = 0; i < dim; i++)
+ {
+ Element ii;
+ B.getEntry(ii, i, i);
+ S.setEntry(i, ii);
+ }
+
+ return S;
+ }
+ };
+}
+
+#endif // __LINBOX_smith_form_kannan_bachem_domain_H
diff --git a/linbox/algorithms/smith-form-local.h b/linbox/algorithms/smith-form-local.h
index fa2f161..ff85ac6 100644
--- a/linbox/algorithms/smith-form-local.h
+++ b/linbox/algorithms/smith-form-local.h
@@ -5,20 +5,20 @@
*
* ------------------------------------
*
- *
+ *
* ========LICENCE========
* This file is part of the library LinBox.
- *
+ *
* LinBox is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
- *
+ *
* This library 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
* Lesser General Public License for more details.
- *
+ *
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
@@ -34,7 +34,7 @@
//#include <algorithm>
// #include "linbox/field/multimod-field.h"
-#include "linbox/matrix/blas-matrix.h"
+#include "linbox/matrix/dense-matrix.h"
namespace LinBox
{
@@ -55,7 +55,7 @@ namespace LinBox
template<class Matrix>
std::list<Elt>& operator()(std::list<Elt>& L, Matrix& A, const LocalPID& R)
{
- Elt d; R.init(d, 1);
+ Elt d; R.assign(d,R.one);
return smithStep(L, d, A, R);
}
@@ -63,10 +63,9 @@ namespace LinBox
std::list<Elt>& smithStep(std::list<Elt>& L, Elt& d, Matrix& A, const LocalPID& R)
{
- //std::cout << "Dimension: " << A.rowdim() << " " << A.coldim() <<"\n";
if ( A.rowdim() == 0 || A.coldim() == 0 ) return L;
- Elt g; R.init(g, 0);
+ Elt g; R.assign(g, R.zero);
typename Matrix::RowIterator p;
typename Matrix::Row::iterator q, r;
for ( p = A.rowBegin(); p != A.rowEnd(); ++p) {
diff --git a/linbox/algorithms/smith-form-local2.inl b/linbox/algorithms/smith-form-local2.inl
index 83cfab3..0a155b7 100644
--- a/linbox/algorithms/smith-form-local2.inl
+++ b/linbox/algorithms/smith-form-local2.inl
@@ -5,20 +5,20 @@
*
* ------------------------------------
*
- *
+ *
* ========LICENCE========
* This file is part of the library LinBox.
- *
+ *
* LinBox is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
- *
+ *
* This library 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
* Lesser General Public License for more details.
- *
+ *
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
@@ -34,7 +34,7 @@
#include <list>
//#include <algorithm>
-#include "linbox/field/local2_32.h"
+#include "linbox/ring/local2_32.h"
namespace LinBox
{
@@ -54,7 +54,8 @@ namespace LinBox
template<class Matrix>
std::list<Elt>& operator()(std::list<Elt>& L, Matrix& A, const LocalPIR& R)
- { Elt d; R.init(d, 1);
+ {
+ Elt d; R.assign(d, R.one);
Elt *p = &(A[0][0]);
return smithStep(L, d, p, A.rowdim(), A.coldim(), A.getStride(), R);
}
@@ -65,8 +66,8 @@ namespace LinBox
if ( m == 0 || n == 0 )
return L;
- LocalPIR::Exponent g = LocalPIR::Exponent(32); //R.init(g, 0); // must change to 2^31 maybe.
- size_t i, j, k;
+ LocalPIR::Exponent g = LocalPIR::Exponent(32); //R.init(g); // must change to 2^31 maybe.
+ size_t i, j;
/* Arguably this search order should be reversed to increase the likelyhood of no col swap,
assuming row swaps cheaper. Not so, however on my example. -bds 11Nov */
for ( i = 0; i != m; ++i)
@@ -83,13 +84,13 @@ namespace LinBox
L.insert(L.end(), (m < n) ? m : n, 0);
return L;
}
- if ( i != m ) // g is a unit and, because this is a local ring,
+ if ( i != m ) // g is a unit and, because this is a local ring,
// value at which this first happened also is a unit.
{ // put pivot in 0,0 position
if ( i != 0 ) // swap rows
std::swap_ranges(Ap, Ap+n, Ap + i*stride);
if ( j != 0 ) // swap cols
- for(k = 0; k != m; ++k)
+ for(size_t k = 0; k != m; ++k)
std::swap(Ap[k*stride + 0], Ap[k*stride + j]);
// elimination step - crude and for dense only - fix later
diff --git a/linbox/algorithms/smith-form-sparseelim-local.h b/linbox/algorithms/smith-form-sparseelim-local.h
index f108890..83e9af1 100644
--- a/linbox/algorithms/smith-form-sparseelim-local.h
+++ b/linbox/algorithms/smith-form-sparseelim-local.h
@@ -53,7 +53,7 @@ namespace LinBox
template <> struct Boolean_Trait<false> {
typedef float BooleanType;// float does not matter, only that it differs from int
};
-
+
enum {
PRIVILEGIATE_NO_COLUMN_PIVOTING = 1,
PRIVILEGIATE_REDUCING_FILLIN = 2,
@@ -90,36 +90,36 @@ namespace LinBox
template<class Modulu>
bool isNZero(const Modulu& a ) const { return (bool)a ;}
template<class Modulu>
- bool isZero(const Modulu& a ) const { return a == 0UL;}
+ bool isZero(const Modulu& a ) const { return a == 0U;}
- template<class Modulo, class Modulo2>
- Modulo& MY_Zpz_inv (Modulo& u1, const Modulo2 a, const Modulo2 _p) const
+ template<class Modulo, class Modulo2, class Modulo3>
+ Modulo& MY_Zpz_inv (Modulo& u1, const Modulo2 a, const Modulo3 _p) const
{
- u1 = Modulo(1UL);
- Modulo r0(_p), r1(a);
+ u1 = Modulo(1U);
+ Modulo r0((Modulo)_p), r1((Modulo)a); //! clang complains for examples/smith.C and examples/smithvalence.C
Modulo q(r0/r1);
-
+
r0 -= q * r1;
if ( isZero(r0) ) return u1;
Modulo u0 = q;
-
+
q = r1/r0;
r1 -= q * r0;
-
+
while ( isNZero(r1) ) {
u1 += q * u0;
-
+
q = r0/r1;
r0 -= q * r1;
if ( isZero(r0) ) return u1;
u0 += q * u1;
-
+
q = r1/r0;
r1 -= q * r0;
-
+
}
-
- return u1=_p-u0;
+
+ return u1=(Modulo)_p-u0;
}
template<class Modulo, class Modulo2>
Modulo MY_Zpz_inv (const Modulo a, const Modulo2 _p) const
@@ -143,9 +143,9 @@ namespace LinBox
template<class Modulo, class Vecteur>
void SameColumnPivoting(Modulo PRIME, const Vecteur& lignepivot, unsigned long& indcol, long& indpermut, Boolean_Trait<true>::BooleanType ) {
// Try first in the same column
- unsigned long nj = lignepivot.size() ;
+ unsigned long nj = (unsigned long) lignepivot.size() ;
if (nj && (indcol == lignepivot[0].first) && (! this->MY_divides(PRIME,lignepivot[0].second) ) ) {
- indpermut = indcol;
+ indpermut = (long) indcol;
++indcol;
}
}
@@ -160,8 +160,8 @@ namespace LinBox
bool SameColumnPivotingTrait(Modulo PRIME, unsigned long& p, const BB& LigneA, const Mmap& psizes, unsigned long& indcol, long& c, Boolean_Trait<true>::BooleanType truetrait) {
c=-2;
for( typename Mmap::const_iterator iter = psizes.begin(); iter != psizes.end(); ++iter) {
- p = (*iter).second;
- SameColumnPivoting(PRIME, LigneA[p], indcol, c, truetrait ) ;
+ p = (unsigned long)(*iter).second;
+ SameColumnPivoting(PRIME, LigneA[(size_t)p], indcol, c, truetrait ) ;
if (c > -2 ) break;
}
if (c > -2)
@@ -174,10 +174,10 @@ namespace LinBox
template<class Vecteur>
void CherchePivot( Vecteur& lignepivot, unsigned long& indcol , long& indpermut )
{
- unsigned long nj = lignepivot.size() ;
+ unsigned long nj = (unsigned long)lignepivot.size() ;
if (nj) {
- indpermut= lignepivot[0].first;
- if (indpermut != indcol)
+ indpermut= (long)lignepivot[0].first;
+ if (indpermut != (long)indcol)
lignepivot[0].first = (indcol);
++indcol;
}
@@ -192,33 +192,35 @@ namespace LinBox
{
typedef typename Vecteur::value_type E;
typedef typename Field::Element F;
- long nj = lignepivot.size() ;
+ long nj =(long) lignepivot.size() ;
if (nj) {
- indpermut = lignepivot[0].first;
+ indpermut = (long)lignepivot[0].first;
long pp=0;
for(;pp<nj;++pp)
- if (! this->MY_divides(PRIME,lignepivot[pp].second) ) break;
+ if (! this->MY_divides(PRIME,lignepivot[(size_t)pp].second) ) break;
if (pp < nj) {
- long ds = columns[ lignepivot[pp].first ],dl,p=pp,j=pp;
- for(++j;j<nj;++j)
- if ( ( (dl=columns[lignepivot[j].first] ) < ds ) && (! MY_divides(PRIME,lignepivot[j].second) ) ) {
+ long ds = (long)columns[ lignepivot[(size_t)pp].first ],p=pp,j=pp;
+ for(++j;j<nj;++j){
+ long dl;
+ if ( ( (dl=(long)columns[(size_t)lignepivot[(size_t)j].first] ) < ds ) && (! MY_divides(PRIME,lignepivot[(size_t)j].second) ) ) {
ds = dl;
p = j;
}
+ }
if (p != 0) {
if (indpermut == (long)indcol) {
- F ttm = lignepivot[p].second;
- indpermut = lignepivot[p].first;
- lignepivot[p].second = (lignepivot[0].second);
+ F ttm = (F)lignepivot[(size_t)p].second;
+ indpermut = (long)lignepivot[(size_t)p].first;
+ lignepivot[(size_t)p].second = (lignepivot[0].second);
lignepivot[0].second = (ttm);
}
else {
- E ttm = lignepivot[p];
- indpermut = ttm.first;
+ E ttm = (E) lignepivot[(size_t)p];
+ indpermut = (long)ttm.first;
for(long m=p;m;--m)
- lignepivot[m] = lignepivot[m-1];
+ lignepivot[(size_t)m] = lignepivot[(size_t)m-1];
lignepivot[0] = ttm;
}
}
@@ -226,7 +228,7 @@ namespace LinBox
lignepivot[0].first = (indcol);
indcol++ ;
for(j=nj;j--;)
- --columns[ lignepivot[j].first ];
+ --columns[ lignepivot[(size_t)j].first ];
}
else
indpermut = -2;
@@ -261,38 +263,38 @@ namespace LinBox
typedef typename Signed_Trait<Modulo>::unsigned_type UModulo;
- unsigned long k = indcol - 1;
- unsigned long nj = lignecourante.size() ;
+ unsigned long k = (unsigned long)indcol - 1;
+ unsigned long nj = (unsigned long) lignecourante.size() ;
if (nj) {
unsigned long j_head(0);
for(; j_head<nj; ++j_head)
- if (long(lignecourante[j_head].first) >= indpermut) break;
+ if (long(lignecourante[(size_t)j_head].first) >= indpermut) break;
unsigned long bjh(j_head-1);
- if ((j_head<nj) && (long(lignecourante[j_head].first) == indpermut)) {
+ if ((j_head<nj) && (long(lignecourante[(size_t)j_head].first) == indpermut)) {
// -------------------------------------------
// Permutation
if (indpermut != (long)k) {
if (lignecourante[0].first == k) {
// non zero <--> non zero
- F tmp = lignecourante[0].second ;
- lignecourante[0].second = (lignecourante[j_head].second );
- lignecourante[j_head].second = (tmp);
+ F tmp = (F) lignecourante[0].second ;
+ lignecourante[0].second = (lignecourante[(size_t)j_head].second );
+ lignecourante[(size_t)j_head].second = (tmp);
}
else {
// zero <--> non zero
- E tmp = lignecourante[j_head];
+ E tmp = (E) lignecourante[(size_t)j_head];
--columns[ tmp.first ];
- ++columns[k];
+ ++columns[(size_t)k];
tmp.first = (k);
- for(long l=j_head; l>0; l--)
- lignecourante[l] = lignecourante[l-1];
+ for(long l=(long)j_head; l>0; l--)
+ lignecourante[(size_t)l] = lignecourante[(size_t)l-1];
lignecourante[0] = tmp;
}
j_head = 0;
}
// -------------------------------------------
// Elimination
- unsigned long npiv = lignepivot.size();
+ unsigned long npiv = (unsigned long) lignepivot.size();
Vecteur construit(nj + npiv);
// construit : <-- ci
// courante : <-- m
@@ -301,7 +303,7 @@ namespace LinBox
Viter ci = construit.begin();
unsigned long m=1;
unsigned long l(0);
- // A[i,k] <-- A[i,k] / A[k,k]
+ // A[(size_t)i,k] <-- A[(size_t)i,k] / A[(size_t)k,k]
// lignecourante[0].second = ( ((UModulo)( ( MOD-(lignecourante[0].second) ) * ( MY_Zpz_inv( lignepivot[0].second, MOD) ) ) ) % (UModulo)MOD ) ;
// F headcoeff = lignecourante[0].second;
F headcoeff = MOD-(lignecourante[0].second);
@@ -311,39 +313,39 @@ namespace LinBox
lignecourante[0].second = headcoeff;
--columns[ lignecourante[0].first ];
- unsigned long j_piv;
for(;l<npiv;++l)
- if (lignepivot[l].first > k) break;
- // for all j such that (j>k) and A[k,j]!=0
+ if (lignepivot[(size_t)l].first > k) break;
+ // for all j such that (j>k) and A[(size_t)k,j]!=0
for(;l<npiv;++l) {
- j_piv = lignepivot[l].first;
- // if A[k,j]=0, then A[i,j] <-- A[i,j]
- for (;(m<nj) && (lignecourante[m].first < j_piv);)
- *ci++ = lignecourante[m++];
- // if A[i,j]!=0, then A[i,j] <-- A[i,j] - A[i,k]*A[k,j]
- if ((m<nj) && (lignecourante[m].first == j_piv)) {
- //lignecourante[m].second = ( ((UModulo)( headcoeff * lignepivot[l].second + lignecourante[m].second ) ) % (UModulo)MOD );
- lignecourante[m].second += ( headcoeff * lignepivot[l].second );
- lignecourante[m].second %= (UModulo)MOD;
- if (isNZero(lignecourante[m].second))
- *ci++ = lignecourante[m++];
+ unsigned long j_piv;
+ j_piv = (unsigned long) lignepivot[(size_t)l].first;
+ // if A[(size_t)k,j]=0, then A[(size_t)i,j] <-- A[(size_t)i,j]
+ for (;(m<nj) && (lignecourante[(size_t)m].first < j_piv);)
+ *ci++ = lignecourante[(size_t)m++];
+ // if A[(size_t)i,j]!=0, then A[(size_t)i,j] <-- A[(size_t)i,j] - A[(size_t)i,k]*A[(size_t)k,j]
+ if ((m<nj) && (lignecourante[(size_t)m].first == j_piv)) {
+ //lignecourante[(size_t)m].second = ( ((UModulo)( headcoeff * lignepivot[(size_t)l].second + lignecourante[(size_t)m].second ) ) % (UModulo)MOD );
+ lignecourante[(size_t)m].second += ( headcoeff * lignepivot[(size_t)l].second );
+ lignecourante[(size_t)m].second %= (UModulo)MOD;
+ if (isNZero(lignecourante[(size_t)m].second))
+ *ci++ = lignecourante[(size_t)m++];
else
- --columns[ lignecourante[m++].first ];
+ --columns[ lignecourante[(size_t)m++].first ];
// m++;
}
else {
F tmp(headcoeff);
- tmp *= lignepivot[l].second;
+ tmp *= lignepivot[(size_t)l].second;
tmp %= (UModulo)MOD;
if (isNZero(tmp)) {
- ++columns[j_piv];
+ ++columns[(size_t)j_piv];
*ci++ = E(j_piv, tmp );
}
}
}
- // if A[k,j]=0, then A[i,j] <-- A[i,j]
+ // if A[(size_t)k,j]=0, then A[(size_t)i,j] <-- A[(size_t)i,j]
for (;m<nj;)
- *ci++ = lignecourante[m++];
+ *ci++ = lignecourante[(size_t)m++];
construit.erase(ci,construit.end());
lignecourante = construit;
@@ -354,15 +356,15 @@ namespace LinBox
if (indpermut != (long)k) {
unsigned long l(0);
for(; l<nj; ++l)
- if (lignecourante[l].first >= k) break;
- if ((l<nj) && (lignecourante[l].first == k)) {
+ if (lignecourante[(size_t)l].first >= k) break;
+ if ((l<nj) && (lignecourante[(size_t)l].first == k)) {
// non zero <--> zero
- E tmp = lignecourante[l];
+ E tmp = (E) lignecourante[(size_t)l];
--columns[tmp.first ];
- ++columns[indpermut];
- tmp.first = (indpermut);
+ ++columns[(size_t)indpermut];
+ tmp.first = (unsigned long) (indpermut);
for(;l<bjh;l++)
- lignecourante[l] = lignecourante[l+1];
+ lignecourante[(size_t)l] = lignecourante[(size_t)l+1];
lignecourante[bjh] = tmp;
} // else
// zero <--> zero
@@ -394,23 +396,23 @@ namespace LinBox
// assignment of LigneA with the domain object
size_t jj;
for(jj=0; jj<Ni; ++jj) {
- Vecteur tmp = LigneA[jj];
+ Vecteur tmp = LigneA[(size_t)jj];
Vecteur toto(tmp.size());
unsigned long k=0,rs=0;
for(; k<tmp.size(); ++k) {
- Modulo r = tmp[k].second;
+ Modulo r = tmp[(size_t)k].second;
if ((r <0) || (r >= MOD)) r %= MOD ;
if (r <0) r += MOD ;
if (isNZero(r)) {
- ++col_density[ tmp[k].first ];
- toto[rs] =tmp[k];
+ ++col_density[ tmp[(size_t)k].first ];
+ toto[rs] =tmp[(size_t)k];
toto[rs].second = ( r );
++rs;
}
}
toto.resize(rs);
- LigneA[jj] = toto;
- // LigneA[jj].reactualsize(Nj);
+ LigneA[(size_t)jj] = toto;
+ // LigneA[(size_t)jj].reactualsize(Nj);
}
@@ -423,7 +425,7 @@ namespace LinBox
for (unsigned long k=0; k<last;++k) {
- if ( ! (k % maxout) ) commentator().progress (k);
+ if ( ! (k % maxout) ) commentator().progress ((long)k);
unsigned long p=k;
@@ -432,7 +434,7 @@ namespace LinBox
std::multimap< long, long > psizes;
for(p=k; p<Ni; ++p)
- psizes.insert( psizes.end(), std::pair<long,long>( LigneA[p].size(), p) );
+ psizes.insert( psizes.end(), std::pair<long,long>( (long) LigneA[(size_t)p].size(), (long) p) );
#ifdef LINBOX_pp_gauss_steps_OUT
std::cerr << "------------ ordered rows " << k << " -----------" << std::endl;
@@ -449,16 +451,16 @@ namespace LinBox
break;
for( typename std::multimap< long, long >::const_iterator iter = psizes.begin(); iter != psizes.end(); ++iter) {
- p = (*iter).second;
+ p = (unsigned long)(*iter).second;
- CherchePivot( PRIME, LigneA[p], indcol, c , col_density) ;
+ CherchePivot( PRIME, LigneA[(size_t)p], indcol, c , col_density) ;
if (c > -2 ) break;
}
if (c > -2) break;
for(unsigned long ii=k;ii<Ni;++ii)
- for(unsigned long jjj=LigneA[ii].size();jjj--;)
- LigneA[ii][jjj].second /= PRIME;
+ for(unsigned long jjj=LigneA[(size_t)ii].size();jjj--;)
+ LigneA[(size_t)ii][(size_t)jjj].second /= PRIME;
MOD /= PRIME;
ranks.push_back( indcol );
++ind_pow;
@@ -472,9 +474,9 @@ namespace LinBox
#ifdef LINBOX_pp_gauss_steps_OUT
std::cerr << "------------ permuting rows " << p << " and " << k << " ---" << std::endl;
#endif
- Vecteur vtm = LigneA[k];
- LigneA[k] = LigneA[p];
- LigneA[p] = vtm;
+ Vecteur vtm = LigneA[(size_t)k];
+ LigneA[(size_t)k] = LigneA[(size_t)p];
+ LigneA[(size_t)p] = vtm;
}
#ifdef LINBOX_pp_gauss_steps_OUT
if (c != (long(indcol)-1L))
@@ -482,25 +484,25 @@ namespace LinBox
#endif
if (c != -1)
for(unsigned long l=k + 1; l < Ni; ++l)
- FaireElimination(MOD, LigneA[l], LigneA[k], indcol, c, col_density);
+ FaireElimination(MOD, LigneA[(size_t)l], LigneA[(size_t)k], (long)indcol, c, col_density);
#ifdef LINBOX_pp_gauss_steps_OUT
- LigneA.write(cerr << "step[" << k << "], pivot: " << c << std::endl) << endl;
+ LigneA.write(std::cerr << "step[" << k << "], pivot: " << c << std::endl) << std::endl;
#endif
- PreserveUpperMatrixRow(LigneA[k], typename Boolean_Trait<PreserveUpperMatrix>::BooleanType());
+ PreserveUpperMatrixRow(LigneA[(size_t)k], typename Boolean_Trait<PreserveUpperMatrix>::BooleanType());
}
c = -2;
- SameColumnPivoting(PRIME, LigneA[last], indcol, c, typename Boolean_Trait<PrivilegiateNoColumnPivoting>::BooleanType() );
- if (c == -2) CherchePivot( PRIME, LigneA[last], indcol, c, col_density );
+ SameColumnPivoting(PRIME, LigneA[(size_t)last], indcol, c, typename Boolean_Trait<PrivilegiateNoColumnPivoting>::BooleanType() );
+ if (c == -2) CherchePivot( PRIME, LigneA[(size_t)last], indcol, c, col_density );
while( c == -2) {
ranks.push_back( indcol );
- for(long jjj=LigneA[last].size();jjj--;)
- LigneA[last][jjj].second /= PRIME;
+ for(long jjj=(long)LigneA[(size_t)last].size();jjj--;)
+ LigneA[(size_t)last][(size_t)jjj].second /= PRIME;
MOD /= PRIME;
- CherchePivot( PRIME, LigneA[last], indcol, c, col_density );
+ CherchePivot( PRIME, LigneA[(size_t)last], indcol, c, col_density );
}
while( MOD > 1) {
MOD /= PRIME;
@@ -509,7 +511,7 @@ namespace LinBox
// ranks.push_back(indcol);
#ifdef LINBOX_pp_gauss_steps_OUT
- LigneA.write(cerr << "step[" << Ni-1 << "], pivot: " << c << std::endl) << endl;
+ LigneA.write(std::cerr << "step[" << Ni-1 << "], pivot: " << c << std::endl) << std::endl;
#endif
#ifdef LINBOX_PRANK_OUT
std::cerr << "Rank mod " << (unsigned long)FMOD << " : " << indcol << std::endl;
@@ -538,18 +540,19 @@ namespace LinBox
template<class Modulo, class Matrix, template<class, class> class Container, template<class> class Alloc>
- Container<std::pair<size_t,size_t>, Alloc<std::pair<size_t,size_t> > >& operator()(Container<std::pair<size_t,size_t>, Alloc<std::pair<size_t,size_t> > >& L, Matrix& A, Modulo FMOD, Modulo PRIME, int StaticParameters=0)
+ Container<std::pair<size_t,Modulo>, Alloc<std::pair<size_t,Modulo> > >& operator()(Container<std::pair<size_t,Modulo>, Alloc<std::pair<size_t,Modulo> > >& L, Matrix& A, Modulo FMOD, Modulo PRIME, int StaticParameters=0)
{
Container<size_t, Alloc<size_t> > ranks;
prime_power_rankin( FMOD, PRIME, ranks, A, A.rowdim(), A.coldim(), std::vector<size_t>(),StaticParameters);
L.resize( 0 ) ;
size_t MOD = 1;
- size_t num = 0, diff;
+ size_t num = 0;
for( typename Container<size_t, Alloc<size_t> >::const_iterator it = ranks.begin(); it != ranks.end(); ++it) {
+ size_t diff;
diff = *it-num;
if (diff > 0)
- L.push_back( std::pair<size_t,size_t>(*it-num,MOD) );
- MOD *= PRIME;
+ L.push_back( std::pair<size_t,Modulo>(*it-num,MOD) );
+ MOD *= (size_t)PRIME;
num = *it;
}
return L;
diff --git a/linbox/algorithms/smith-form-sparseelim-poweroftwo.h b/linbox/algorithms/smith-form-sparseelim-poweroftwo.h
index 636045a..879558a 100644
--- a/linbox/algorithms/smith-form-sparseelim-poweroftwo.h
+++ b/linbox/algorithms/smith-form-sparseelim-poweroftwo.h
@@ -1,7 +1,7 @@
/* algorithms/smith-form-sparseelim-poweroftwo.h
* Copyright (C) LinBox
* Written by JG Dumas
- * Time-stamp: <06 Apr 12 11:50:12 Jean-Guillaume.Dumas at imag.fr>
+ * Time-stamp: <03 Jul 15 13:59:19 Jean-Guillaume.Dumas at imag.fr>
* ========LICENCE========
* This file is part of the library LinBox.
*
@@ -24,11 +24,20 @@
#ifndef __LINBOX_pp_gauss_poweroftwo_H
#define __LINBOX_pp_gauss_poweroftwo_H
-
#include <map>
#include <givaro/givconfig.h> // for Signed_Trait
#include "linbox/algorithms/smith-form-sparseelim-local.h"
+// LINBOX_pp_gauss_intermediate_OUT outputs intermediate matrices
+#ifdef LINBOX_pp_gauss_intermediate_OUT
+
+// LINBOX_pp_gauss_steps_OUT outputs elimination steps
+# ifndef LINBOX_pp_gauss_steps_OUT
+# define LINBOX_pp_gauss_steps_OUT
+# endif
+
+#endif
+
// LINBOX_pp_gauss_steps_OUT outputs elimination steps
#ifdef LINBOX_pp_gauss_steps_OUT
@@ -53,164 +62,171 @@ namespace LinBox
const Element zero;
const Element one;
public:
-
+
/** \brief The field parameter is the domain
* over which to perform computations
*/
PowerGaussDomainPowerOfTwo () : zero(0U), one(1U) {}
-
+
//Copy constructor
///
PowerGaussDomainPowerOfTwo (const PowerGaussDomainPowerOfTwo &M) {}
-
-
-
+
+
+
// --------------------------------------------
// Modulo operators
bool isNZero(const UInt_t& a ) const { return (bool)a ;}
bool isZero(const UInt_t& a ) const { return a == 0U;}
bool isOne(const UInt_t& a ) const { return a == 1U;}
+ /// @todo use Givaro isOdd
bool isOdd(const UInt_t& b) const {
return (bool)(b & 1U);
- }
-
+ }
+
bool MY_divides(const UInt_t& a, const UInt_t& b) const {
return (!(b%a));
}
-
+
+ // [On Newton-Raphson iteration for multiplicative
+ // inverses modulo prime powers. J-G. Dumas.
+ // IEEE Transactions on Computers, 2013]
+ // http://doi.ieeecomputersociety.org/10.1109/TC.2013.94
UInt_t& MY_Zpz_inv (UInt_t& u1, const UInt_t& a, const size_t exponent, const UInt_t& TWOTOEXPMONE) const {
- static const UInt_t ttep2(TWOTOEXPMONE+3);
+ static const UInt_t ttep2(TWOTOEXPMONE+3U);
if (this->isOne(a)) return u1=this->one;
- REQUIRE( (one<<exponent) == (TWOTOEXPMONE+1) );
+ REQUIRE( (one<<exponent) == (TWOTOEXPMONE+1U) );
REQUIRE( a <= TWOTOEXPMONE );
- REQUIRE( (a & 1) );
+ REQUIRE( (a & 1U) );
u1=ttep2-a; // 2-a
UInt_t xmone(a-1);
for(size_t i=2; i<exponent; i<<=1) {
- xmone *= xmone;
+ UInt_t tmp(xmone); xmone *= tmp;
xmone &= TWOTOEXPMONE;
u1 *= ++xmone; --xmone;
u1 &= TWOTOEXPMONE;
}
- ENSURE( ((a * u1) & TWOTOEXPMONE) == 1 );
+ ENSURE( ((a * u1) & TWOTOEXPMONE) == 1U );
return u1;
}
// UInt_t& MY_Zpz_inv (UInt_t& u1, const UInt_t a, const UInt_t _p) const {
-// u1 = 1UL;
+// u1 = 1U;
// UInt_t r0(_p), r1(a);
// UInt_t q(r0/r1);
-
+
// r0 -= q * r1;
// if ( this->isZero(r0) ) return u1;
// UInt_t u0 = q;
-
+
// q = r1/r0;
// r1 -= q * r0;
-
+
// while ( this->isNZero(r1) ) {
// u1 += q * u0;
-
+
// q = r0/r1;
// r0 -= q * r1;
// if ( this->isZero(r0) ) return u1;
// u0 += q * u1;
-
+
// q = r1/r0;
// r1 -= q * r0;
-
+
// }
-
+
// return u1=_p-u0;
// }
// UInt_t MY_Zpz_inv (const UInt_t a, const UInt_t _p) const {
// UInt_t u1; return MY_Zpz_inv(u1,a,_p);
// }
-
-
+
+
// ------------------------------------------------
// Pivot Searchers and column strategy
// ------------------------------------------------
template<class Vecteur>
void SameColumnPivoting(const Vecteur& lignepivot, unsigned long& indcol, long& indpermut, Boolean_Trait<false>::BooleanType ) {}
-
-
+
+
template<class Vecteur>
void SameColumnPivoting(const Vecteur& lignepivot, unsigned long& indcol, long& indpermut, Boolean_Trait<true>::BooleanType ) {
// Try first in the same column
- unsigned long nj = lignepivot.size() ;
- if (nj && (indcol == lignepivot[0].first) && (this->isOdd(lignepivot[0].second) ) ) {
- indpermut = indcol;
+ unsigned long nj = (unsigned long) lignepivot.size() ;
+ if (nj && (indcol == lignepivot[0].first) && (this->isOdd((UInt_t)lignepivot[0].second) ) ) {
+ indpermut = (long)indcol;
++indcol;
}
}
-
+
template<class BB, class Mmap>
bool SameColumnPivotingTrait(unsigned long& p, const BB& LigneA, const Mmap& psizes, unsigned long& indcol, long& indpermut, Boolean_Trait<false>::BooleanType ) {
// Do not try first in the same column
return false;
}
-
+
template<class BB, class Mmap>
bool SameColumnPivotingTrait(unsigned long& p, const BB& LigneA, const Mmap& psizes, unsigned long& indcol, long& c, Boolean_Trait<true>::BooleanType truetrait) {
c=-2;
for( typename Mmap::const_iterator iter = psizes.begin(); iter != psizes.end(); ++iter) {
- p = (*iter).second;
- SameColumnPivoting(LigneA[p], indcol, c, truetrait ) ;
+ p = (unsigned long) (*iter).second;
+ SameColumnPivoting(LigneA[(size_t)p], indcol, c, truetrait ) ;
if (c > -2 ) break;
}
if (c > -2)
return true;
else
return false;
-
+
}
-
+
template<class Vecteur>
void CherchePivot( Vecteur& lignepivot, unsigned long& indcol , long& indpermut ) {
- unsigned long nj = lignepivot.size() ;
+ unsigned long nj = (unsigned long) lignepivot.size() ;
if (nj) {
- indpermut= lignepivot[0].first;
- if (indpermut != indcol)
+ indpermut=(long) lignepivot[0].first;
+ if (indpermut != (long)indcol)
lignepivot[0].first = (indcol);
++indcol;
}
else
indpermut = -1;
}
-
-
-
+
+
+
template<class Vecteur, class D>
void CherchePivot(Vecteur& lignepivot, unsigned long& indcol , long& indpermut, D& columns ) {
typedef typename Vecteur::value_type E;
- long nj = lignepivot.size() ;
+ long nj = (long) lignepivot.size() ;
if (nj) {
- indpermut = lignepivot[0].first;
+ indpermut = (long)lignepivot[0].first;
long pp=0;
for(;pp<nj;++pp)
- if (this->isOdd(lignepivot[pp].second) ) break;
-
+ if (this->isOdd((UInt_t)lignepivot[(size_t)pp].second) ) break;
+
if (pp < nj) {
- long ds = columns[ lignepivot[pp].first ],dl,p=pp,j=pp;
- for(++j;j<nj;++j)
- if ( ( (dl=columns[lignepivot[j].first] ) < ds ) && (this->isOdd(lignepivot[j].second) ) ) {
+ long ds = (long)columns[ lignepivot[(size_t)pp].first ],p=pp,j=pp;
+ for(++j;j<nj;++j){
+ long dl;
+ if ( ( (dl=(long)columns[(size_t)lignepivot[(size_t)j].first] ) < ds ) && (this->isOdd((UInt_t)lignepivot[(size_t)j].second) ) ) {
ds = dl;
p = j;
}
+ }
if (p != 0) {
if (indpermut == (long)indcol) {
- UInt_t ttm = lignepivot[p].second;
- indpermut = lignepivot[p].first;
- lignepivot[p].second = (lignepivot[0].second);
- lignepivot[0].second = (ttm);
+ UInt_t ttm = (UInt_t)lignepivot[(size_t)p].second;
+ indpermut = (long)lignepivot[(size_t)p].first;
+ lignepivot[(size_t)p].second = (lignepivot[0].second);
+ lignepivot[0].second = (UInt_t)(ttm);
}
else {
- E ttm = lignepivot[p];
- indpermut = ttm.first;
+ E ttm = (E) lignepivot[(size_t)p];
+ indpermut = (long)ttm.first;
for(long m=p;m;--m)
- lignepivot[m] = lignepivot[m-1];
+ lignepivot[(size_t)m] = lignepivot[(size_t)m-1];
lignepivot[0] = ttm;
}
}
@@ -218,7 +234,7 @@ namespace LinBox
lignepivot[0].first = (indcol);
indcol++ ;
for(j=nj;j--;)
- --columns[ lignepivot[j].first ];
+ --columns[ lignepivot[(size_t)j].first ];
}
else
indpermut = -2;
@@ -234,8 +250,8 @@ namespace LinBox
void PreserveUpperMatrixRow(Vecteur& ligne, Boolean_Trait<false>::BooleanType ) {
ligne = Vecteur(0);
}
-
-
+
+
template<class Vecteur, class De>
void FaireElimination( const size_t EXPONENT, const UInt_t& TWOK, const UInt_t& TWOKMONE,
Vecteur& lignecourante,
@@ -243,43 +259,43 @@ namespace LinBox
const long& indcol,
const long& indpermut,
De& columns) {
-
+
// typedef typename Vecteur::coefficientSpace F;
// typedef typename Vecteur::value_types E;
typedef typename Vecteur::value_type E;
-
- unsigned long k = indcol - 1;
- unsigned long nj = lignecourante.size() ;
+
+ unsigned long k = (unsigned long) indcol - 1;
+ unsigned long nj = (unsigned long) lignecourante.size() ;
if (nj) {
unsigned long j_head(0);
for(; j_head<nj; ++j_head)
- if (long(lignecourante[j_head].first) >= indpermut) break;
+ if (long(lignecourante[(size_t)j_head].first) >= indpermut) break;
unsigned long bjh(j_head-1);
- if ((j_head<nj) && (long(lignecourante[j_head].first) == indpermut)) {
+ if ((j_head<nj) && (long(lignecourante[(size_t)j_head].first) == indpermut)) {
// -------------------------------------------
// Permutation
if (indpermut != (long)k) {
if (lignecourante[0].first == k) {
// non zero <--> non zero
- UInt_t tmp = lignecourante[0].second ;
- lignecourante[0].second = (lignecourante[j_head].second );
- lignecourante[j_head].second = (tmp);
+ UInt_t tmp = (UInt_t) lignecourante[0].second ;
+ lignecourante[0].second = lignecourante[(size_t)j_head].second;
+ lignecourante[(size_t)j_head].second = tmp;
}
else {
// zero <--> non zero
- E tmp = lignecourante[j_head];
+ E tmp = (E) lignecourante[(size_t)j_head];
--columns[ tmp.first ];
++columns[k];
tmp.first = (k);
- for(long l=j_head; l>0; l--)
- lignecourante[l] = lignecourante[l-1];
+ for(long l=(long)j_head; l>0; l--)
+ lignecourante[(size_t)l] = lignecourante[(size_t)l-1];
lignecourante[0] = tmp;
}
j_head = 0;
}
// -------------------------------------------
// Elimination
- unsigned long npiv = lignepivot.size();
+ unsigned long npiv = (unsigned long) lignepivot.size();
Vecteur construit(nj + npiv);
// construit : <-- ci
// courante : <-- m
@@ -288,50 +304,60 @@ namespace LinBox
Viter ci = construit.begin();
unsigned long m=1;
unsigned long l(0);
- // A[i,k] <-- A[i,k] / A[k,k]
- UInt_t headcoeff = TWOK-(lignecourante[0].second);
+ // A[(size_t)i,k] <-- A[(size_t)i,k] / A[(size_t)k,k]
+
+ UInt_t headcoeff = TWOK-(UInt_t)(lignecourante[0].second);
+
+
// UInt_t invpiv; MY_Zpz_inv(invpiv, lignepivot[0].second, TWOK);
- UInt_t invpiv; MY_Zpz_inv(invpiv, lignepivot[0].second, EXPONENT, TWOKMONE);
+ UInt_t invpiv;
+ MY_Zpz_inv(invpiv, (UInt_t) (lignepivot[0].second), EXPONENT, TWOKMONE);
headcoeff *= invpiv;
headcoeff &= TWOKMONE ;
+
+
// lignecourante[0].second = ( ((UModulo)( ( MOD-(lignecourante[0].second) ) * ( MY_Zpz_inv( lignepivot[0].second, MOD) ) ) ) % (UModulo)MOD ) ;
// UInt_t headcoeff = lignecourante[0].second ;
--columns[ lignecourante[0].first ];
-
- unsigned long j_piv;
+
for(;l<npiv;++l)
- if (lignepivot[l].first > k) break;
- // for all j such that (j>k) and A[k,j]!=0
+ if (lignepivot[(size_t)l].first > k) break;
+ // for all j such that (j>k) and A[(size_t)k,j]!=0
for(;l<npiv;++l) {
- j_piv = lignepivot[l].first;
- // if A[k,j]=0, then A[i,j] <-- A[i,j]
- for (;(m<nj) && (lignecourante[m].first < j_piv);)
- *ci++ = lignecourante[m++];
- // if A[i,j]!=0, then A[i,j] <-- A[i,j] - A[i,k]*A[k,j]
- if ((m<nj) && (lignecourante[m].first == j_piv)) {
-// lignecourante[m].second = ( ((UModulo)( headcoeff * lignepivot[l].second + lignecourante[m].second ) ) % (UModulo)MOD );
- lignecourante[m].second += ( headcoeff * lignepivot[l].second );
- lignecourante[m].second &= TWOKMONE;
- if (isNZero(lignecourante[m].second))
- *ci++ = lignecourante[m++];
+ unsigned long j_piv;
+ j_piv = (unsigned long) lignepivot[(size_t)l].first;
+ // if A[(size_t)k,j]=0, then A[(size_t)i,j] <-- A[(size_t)i,j]
+ for (;(m<nj) && (lignecourante[(size_t)m].first < j_piv);)
+ *ci++ = lignecourante[(size_t)m++];
+ // if A[(size_t)i,j]!=0, then A[(size_t)i,j] <-- A[(size_t)i,j] - A[(size_t)i,k]*A[(size_t)k,j]
+ if ((m<nj) && (lignecourante[(size_t)m].first == j_piv)) {
+// lignecourante[(size_t)m].second = ( ((UModulo)( headcoeff * lignepivot[(size_t)l].second + lignecourante[(size_t)m].second ) ) % (UModulo)MOD );
+ STATE( UInt_t lcs = lignecourante[(size_t)m].second);
+
+
+ lignecourante[(size_t)m].second += ( headcoeff * (UInt_t)lignepivot[(size_t)l].second );
+ lignecourante[(size_t)m].second &= TWOKMONE;
+
+ if (isNZero((UInt_t)(lignecourante[(size_t)m].second)))
+ *ci++ = lignecourante[(size_t)m++];
else
- --columns[ lignecourante[m++].first ];
+ --columns[ lignecourante[(size_t)m++].first ];
// m++;
}
else {
UInt_t tmp(headcoeff);
- tmp *= lignepivot[l].second;
+ tmp *= (UInt_t)lignepivot[(size_t)l].second;
tmp &= TWOKMONE;
if (isNZero(tmp)) {
- ++columns[j_piv];
- *ci++ = E(j_piv, tmp );
+ ++columns[(size_t)j_piv];
+ *ci++ = E(j_piv, (UInt_t)tmp );
}
}
}
- // if A[k,j]=0, then A[i,j] <-- A[i,j]
+ // if A[(size_t)k,j]=0, then A[(size_t)i,j] <-- A[(size_t)i,j]
for (;m<nj;)
- *ci++ = lignecourante[m++];
-
+ *ci++ = lignecourante[(size_t)m++];
+
construit.erase(ci,construit.end());
lignecourante = construit;
}
@@ -341,56 +367,61 @@ namespace LinBox
if (indpermut != (long)k) {
unsigned long l(0);
for(; l<nj; ++l)
- if (lignecourante[l].first >= k) break;
- if ((l<nj) && (lignecourante[l].first == k)) {
+ if (lignecourante[(size_t)l].first >= k) break;
+ if ((l<nj) && (lignecourante[(size_t)l].first == k)) {
// non zero <--> zero
- E tmp = lignecourante[l];
+ E tmp = (E) lignecourante[(size_t)l];
--columns[tmp.first ];
- ++columns[indpermut];
- tmp.first = (indpermut);
+ ++columns[(size_t)indpermut];
+ tmp.first = (unsigned long)(indpermut);
for(;l<bjh;l++)
- lignecourante[l] = lignecourante[l+1];
+ lignecourante[(size_t)l] = lignecourante[(size_t)l+1];
lignecourante[bjh] = tmp;
} // else
// zero <--> zero
}
}
}
-
+
// ------------------------------------------------------
// Rank calculators, defining row strategy
// ------------------------------------------------------
-
+
template<class BB, class D, class Container, bool PrivilegiateNoColumnPivoting, bool PreserveUpperMatrix>
void gauss_rankin(size_t EXPONENTMAX, Container& ranks, BB& LigneA, const size_t Ni, const size_t Nj, const D& density_trait)
{
commentator().start ("Gaussian elimination with reordering modulo a prime power of 2",
"PRGEPo2", Ni);
-
+
ranks.resize(0);
-
+
typedef typename BB::Row Vecteur;
size_t EXPONENT = EXPONENTMAX;
- UInt_t TWOK(1UL); TWOK <<= EXPONENT;
+ UInt_t TWOK(1U); TWOK <<= EXPONENT;
UInt_t TWOKMONE(TWOK); --TWOKMONE;
-
+ENSURE( TWOK == (UInt_t(1U) << EXPONENT) );
+ENSURE( TWOKMONE == (TWOK - 1U) );
+
+
+
#ifdef LINBOX_PRANK_OUT
std::cerr << "Elimination mod " << TWOK << std::endl;
#endif
-
+
D col_density(Nj);
-
+
// assignment of LigneA with the domain object
size_t jj;
for(jj=0; jj<Ni; ++jj) {
- Vecteur tmp = LigneA[jj];
+ Vecteur tmp = LigneA[(size_t)jj];
Vecteur toto(tmp.size());
unsigned long k=0,rs=0;
for(; k<tmp.size(); ++k) {
- UInt_t r = tmp[k].second;
+ UInt_t r = (UInt_t)tmp[k].second;
// if (r <0) r %= TWOK ;
// if (r <0) r += TWOK ;
- if (r >= TWOK) r &= TWOKMONE;
+// if (r >= TWOK) r &= TWOKMONE;
+ r &= TWOKMONE;
if (isNZero(r)) {
++col_density[ tmp[k].first ];
toto[rs] =tmp[k];
@@ -399,31 +430,31 @@ namespace LinBox
}
}
toto.resize(rs);
- LigneA[jj] = toto;
- // LigneA[jj].reactualsize(Nj);
-
+ LigneA[(size_t)jj] = toto;
+ // LigneA[(size_t)jj].reactualsize(Nj);
+
}
-
+
unsigned long last = Ni-1;
long c(0);
unsigned long indcol(0);
unsigned long ind_pow = 1;
unsigned long maxout = Ni/100; maxout = (maxout<10 ? 10 : (maxout>1000 ? 1000 : maxout) );
unsigned long thres = Ni/maxout; thres = (thres >0 ? thres : 1);
-
-
+
+
for (unsigned long k=0; k<last;++k) {
- if ( ! (k % maxout) ) commentator().progress (k);
-
-
+ if ( ! (k % maxout) ) commentator().progress ((long)k);
+
+
unsigned long p=k;
for(;;) {
-
-
+
+
std::multimap< long, long > psizes;
for(p=k; p<Ni; ++p)
- psizes.insert( psizes.end(), std::pair<long,long>( LigneA[p].size(), p) );
-
+ psizes.insert( psizes.end(), std::pair<long,long>( (long)LigneA[(size_t)p].size(), (long)p) );
+
#ifdef LINBOX_pp_gauss_steps_OUT
std::cerr << "------------ ordered rows " << k << " -----------" << std::endl;
for( std::multimap< long, long >::const_iterator iter = psizes.begin(); iter != psizes.end(); ++iter)
@@ -432,41 +463,45 @@ namespace LinBox
}
std::cerr << "---------------------------------------" << std::endl;
#endif
-
-
-
+
+
+
if ( SameColumnPivotingTrait(p, LigneA, psizes, indcol, c, typename Boolean_Trait<PrivilegiateNoColumnPivoting>::BooleanType() ) )
break;
-
+
for( typename std::multimap< long, long >::const_iterator iter = psizes.begin(); iter != psizes.end(); ++iter) {
- p = (*iter).second;
-
- CherchePivot( LigneA[p], indcol, c , col_density) ;
+ p = (unsigned long) (*iter).second;
+
+ CherchePivot( LigneA[(size_t)p], indcol, c , col_density) ;
if (c > -2 ) break;
}
-
+
if (c > -2) break;
for(unsigned long ii=k;ii<Ni;++ii)
- for(unsigned long jjj=LigneA[ii].size();jjj--;)
- LigneA[ii][jjj].second >>= 1;
+ for(unsigned long jjj=LigneA[(size_t)ii].size();jjj--;)
+ LigneA[(size_t)ii][(size_t)jjj].second >>= 1;
--EXPONENT;
TWOK >>= 1;
TWOKMONE >>=1;
+
+ENSURE( TWOK == (UInt_t(1U) << EXPONENT) );
+ENSURE( TWOKMONE == (TWOK - 1U) );
+
ranks.push_back( indcol );
++ind_pow;
#ifdef LINBOX_PRANK_OUT
std::cerr << "Rank mod 2^" << ind_pow << " : " << indcol << std::endl;
if (TWOK == 1) std::cerr << "wattadayada inhere ?" << std::endl;
#endif
-
+
}
if (p != k) {
#ifdef LINBOX_pp_gauss_steps_OUT
std::cerr << "------------ permuting rows " << p << " and " << k << " ---" << std::endl;
#endif
- Vecteur vtm = LigneA[k];
- LigneA[k] = LigneA[p];
- LigneA[p] = vtm;
+ Vecteur vtm = LigneA[(size_t)k];
+ LigneA[(size_t)k] = LigneA[(size_t)p];
+ LigneA[(size_t)p] = vtm;
}
#ifdef LINBOX_pp_gauss_steps_OUT
if (c != (long(indcol)-1L))
@@ -474,40 +509,46 @@ namespace LinBox
#endif
if (c != -1)
for(unsigned long l=k + 1; l < Ni; ++l)
- FaireElimination(EXPONENT, TWOK, TWOKMONE, LigneA[l], LigneA[k], indcol, c, col_density);
-
-
+ FaireElimination(EXPONENT, TWOK, TWOKMONE, LigneA[(size_t)l], LigneA[(size_t)k], (long)indcol, c, col_density);
+
#ifdef LINBOX_pp_gauss_steps_OUT
- LigneA.write(cerr << "step[" << k << "], pivot: " << c << std::endl) << endl;
+ std::cerr << "step[" << k << "], pivot: " << c << std::endl;
#endif
-
- PreserveUpperMatrixRow(LigneA[k], typename Boolean_Trait<PreserveUpperMatrix>::BooleanType());
+
+#ifdef LINBOX_pp_gauss_intermediate_OUT
+ LigneA.write(std::cerr) << std::endl;
+#endif
+
+ PreserveUpperMatrixRow(LigneA[(size_t)k], typename Boolean_Trait<PreserveUpperMatrix>::BooleanType());
}
-
+
c = -2;
- SameColumnPivoting(LigneA[last], indcol, c, typename Boolean_Trait<PrivilegiateNoColumnPivoting>::BooleanType() );
- if (c == -2) CherchePivot( LigneA[last], indcol, c, col_density );
+ SameColumnPivoting(LigneA[(size_t)last], indcol, c, typename Boolean_Trait<PrivilegiateNoColumnPivoting>::BooleanType() );
+ if (c == -2) CherchePivot( LigneA[(size_t)last], indcol, c, col_density );
while( c == -2) {
ranks.push_back( indcol );
- for(long jjj=LigneA[last].size();jjj--;)
- LigneA[last][jjj].second >>= 1;
- TWOK >>= 1;
- CherchePivot( LigneA[last], indcol, c, col_density );
+ for(long jjj=(long)LigneA[(size_t)last].size();jjj--;)
+ LigneA[(size_t)last][(size_t)jjj].second >>= 1;
+ TWOK >>= 1;
+ CherchePivot( LigneA[(size_t)last], indcol, c, col_density );
}
while( TWOK > 1) {
TWOK >>= 1;
ranks.push_back( indcol );
}
-
+
// ranks.push_back(indcol);
#ifdef LINBOX_pp_gauss_steps_OUT
- LigneA.write(cerr << "step[" << Ni-1 << "], pivot: " << c << std::endl) << endl;
+ std::cerr << "step[" << Ni-1 << "], pivot: " << c << std::endl;
+#endif
+#ifdef LINBOX_pp_gauss_intermediate_OUT
+ LigneA.write(std::cerr) << std::endl;
#endif
#ifdef LINBOX_PRANK_OUT
- std::cerr << "Rank mod 2^" << EXPONENT << " : " << indcol << std::endl;
+ std::cerr << "Rank mod 2^" << EXPONENTMAX << " : " << indcol << std::endl;
#endif
commentator().stop ("done", 0, "PRGEPo2");
-
+
}
template<class BB, class D, class Container>
@@ -527,16 +568,16 @@ namespace LinBox
}
}
-
+
template<class Matrix, template<class, class> class Container, template<class> class Alloc>
Container<std::pair<size_t,UInt_t>, Alloc<std::pair<size_t,UInt_t> > >& operator()(Container<std::pair<size_t,UInt_t>, Alloc<std::pair<size_t,UInt_t> > >& L, Matrix& A, size_t EXPONENT, int StaticParameters=0) {
Container<size_t, Alloc<size_t> > ranks;
prime_power_rankin( EXPONENT, ranks, A, A.rowdim(), A.coldim(), std::vector<size_t>(),StaticParameters);
L.resize( 0 ) ;
UInt_t MOD(1);
- size_t num = 0, diff;
+ size_t num = 0;
for( typename Container<size_t, Alloc<size_t> >::const_iterator it = ranks.begin(); it != ranks.end(); ++it) {
- diff = *it-num;
+ size_t diff = *it-num;
if (diff > 0)
L.push_back( std::pair<size_t,UInt_t>(*it-num,MOD) );
MOD <<= 1;
@@ -544,11 +585,11 @@ namespace LinBox
}
return L;
}
-
+
};
-
-
-
+
+
+
} // end of LinBox namespace
#endif //__LINBOX_pp_gauss_poweroftwo_H
diff --git a/linbox/algorithms/smith-form-textbook.h b/linbox/algorithms/smith-form-textbook.h
new file mode 100644
index 0000000..ccb8579
--- /dev/null
+++ b/linbox/algorithms/smith-form-textbook.h
@@ -0,0 +1,268 @@
+/*
+ * Copyright (C) 2014 Gavin Harrison,
+ *
+ * Written by Gavin Harrison <gmh33 at drexel.edu>,
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ * ========LICENCE========
+ *.
+ */
+
+#include "linbox/matrix/dense-matrix.h"
+
+#ifndef __LINBOX_smith_form_textbook_domain_H
+#define __LINBOX_smith_form_textbook_domain_H
+
+namespace LinBox
+{
+ template<class MatrixDomain>
+ class SmithFormTextbookDomain {
+ public:
+ typedef typename MatrixDomain::Field Field;
+ typedef typename Field::Element Element;
+ typedef BlasMatrix<Field> Rep;
+
+ private:
+ MatrixDomain _MD;
+
+ public:
+ const Field &field() const { return _MD.field(); }
+ SmithFormTextbookDomain(const MatrixDomain &MD) : _MD(MD) {}
+ SmithFormTextbookDomain(const SmithFormTextbookDomain &D) : _MD(D._MD) {}
+
+ private:
+ void swapRows(Rep &A, int n, int a, int b) const
+ {
+ for (size_t i = n; i < A.coldim(); i++)
+ {
+ Element tmp1, tmp2;
+
+ A.getEntry(tmp1, a, i);
+ A.getEntry(tmp2, b, i);
+
+ A.setEntry(a, i, tmp2);
+ A.setEntry(b, i, tmp1);
+ }
+ }
+
+ void swapCols(Rep &A, int n, int a, int b) const
+ {
+ for (size_t i = n; i < A.rowdim(); i++)
+ {
+ Element tmp1, tmp2;
+
+ A.getEntry(tmp1, i, a);
+ A.getEntry(tmp2, i, b);
+
+ A.setEntry(i, a, tmp2);
+ A.setEntry(i, b, tmp1);
+ }
+ }
+
+ // Ensures that if a=b then s=u=v=1 and t=0 to avoid an infinite loop
+ void dxgcd(Element &s, Element &t, Element &u, Element &v, const Element &a, const Element &b) const
+ {
+ if (field().areEqual(a,b))
+ {
+ field().assign(s, field().one);
+ field().assign(t, field().zero);
+ field().assign(u, field().one);
+ field().assign(v, field().one);
+ return;
+ }
+
+ Element g;
+ field().dxgcd(g,s,t,u,v,a,b);
+ }
+
+ bool findPivot(Rep &A, size_t n) const
+ {
+ for (size_t i = n; i < A.rowdim(); i++)
+ {
+ for (size_t j = n; j < A.coldim(); j++)
+ {
+ Element tmp;
+ A.getEntry(tmp, i, j);
+
+ if (!field().isZero(tmp))
+ {
+ if (i != n)
+ swapRows(A, n, n, i);
+
+ if (j != n)
+ swapCols(A, n, n, j);
+
+ return true;;
+ }
+ }
+ }
+
+ return false;
+ }
+
+ bool eliminateCol(Rep &A, int n) const
+ {
+ bool modified = false;
+
+ for (size_t i = n+1; i < A.rowdim(); i++)
+ {
+ Element nn, in;
+
+ A.getEntry(nn, n, n);
+ A.getEntry(in, i, n);
+
+ if (!field().isZero(in))
+ {
+ modified = true;
+
+ Element s, t, u, v;
+ dxgcd(s, t, u, v, nn, in);
+
+ for (size_t j = n; j < A.coldim(); j++)
+ {
+ Element nj, ij;
+
+ A.getEntry(nj, n, j);
+ A.getEntry(ij, i, j);
+
+ Element tmp1, tmp2;
+
+ field().mul(tmp1, nj, s);
+ field().mul(tmp2, ij, t);
+ field().addin(tmp1, tmp2);
+ A.setEntry(n, j, tmp1);
+
+ field().mul(tmp1, nj, v);
+ field().mul(tmp2, ij, u);
+ field().subin(tmp1, tmp2);
+ A.setEntry(i, j, tmp1);
+ }
+ }
+ }
+
+ return modified;
+ }
+
+ bool eliminateRow(Rep &A, int n) const
+ {
+ int modified = false;
+
+ for (size_t i = n+1; i < A.coldim(); i++)
+ {
+ Element nn, ni;
+
+ A.getEntry(nn, n, n);
+ A.getEntry(ni, n, i);
+
+ if (!field().isZero(ni))
+ {
+ modified = true;
+
+ Element s, t, u, v;
+ dxgcd(s, t, u, v, nn, ni);
+
+ for (size_t j = n; j < A.rowdim(); j++)
+ {
+ Element jn, ji;
+
+ A.getEntry(jn, j, n);
+ A.getEntry(ji, j, i);
+
+ Element tmp1, tmp2;
+
+ field().mul(tmp1, jn, s);
+ field().mul(tmp2, ji, t);
+ field().addin(tmp1, tmp2);
+ A.setEntry(j, n, tmp1);
+
+ field().mul(tmp1, jn, v);
+ field().mul(tmp2, ji, u);
+ field().subin(tmp1, tmp2);
+ A.setEntry(j, i, tmp1);
+ }
+ }
+ }
+
+ return modified;
+ }
+
+ bool fixDiagonal(Rep &A) const
+ {
+ bool fixed = false;
+
+ size_t dim = A.rowdim() < A.coldim() ? A.rowdim() : A.coldim();
+
+ for (size_t i = 0; i < dim-1; i++)
+ {
+ Element tmp1, tmp2;
+
+ A.getEntry(tmp1, i, i);
+ A.getEntry(tmp2, i+1, i+1);
+
+ if (!field().isZero(tmp2))
+ {
+ Element g;
+ field().gcd(g, tmp1, tmp2);
+
+ if (!field().areAssociates(g, tmp1))
+ {
+ A.setEntry(i+1, i, tmp2);
+ fixed = true;
+ }
+ }
+ else
+ {
+ return fixed;
+ }
+ }
+
+ return fixed;
+ }
+
+ public:
+ template<class Vector>
+ Vector &solve(Vector &S, const Rep &A) const
+ {
+ size_t dim = A.rowdim() < A.coldim() ? A.rowdim() : A.coldim();
+
+ linbox_check(S.size() >= dim);
+
+ Rep B(A);
+
+ do
+ {
+ for (size_t n = 0; n < dim && findPivot(B, n); n++)
+ {
+ eliminateCol(B, n);
+ while(eliminateRow(B, n) && eliminateCol(B, n));
+ }
+ } while(fixDiagonal(B));
+
+ for (size_t i = 0; i < dim; i++)
+ {
+ Element tmp;
+ B.getEntry(tmp, i, i);
+ S.setEntry(i, tmp);
+ }
+
+ return S;
+ }
+ };
+}
+
+#endif // __LINBOX_smith_form_direct_domain_H
diff --git a/linbox/algorithms/toeplitz-det.h b/linbox/algorithms/toeplitz-det.h
index 3070da6..b1f005f 100644
--- a/linbox/algorithms/toeplitz-det.h
+++ b/linbox/algorithms/toeplitz-det.h
@@ -38,19 +38,18 @@ namespace LinBox
const typename PField::Element& T, size_t n )
{
short int sign = 1;
- typename PField::Coeff one, temp;
+ typename PField::Coeff temp;
const typename PField::CoeffField& CField = F.getCoeffField();
- CField.init(one,1);
- CField.init(res,1);
+ CField.assign(res,CField.one);
typename PField::Element f1, f2( T ), fi;
- F.setCoeff( f1, 2*n - 1, one );
- F.init( fi, one );
+ F.setCoeff( f1, 2*n - 1, CField.one );
+ F.assign( fi, F.one );
while( F.deg(f2) >= n ) {
F.rem( fi, f1, f2 );
CField.mulin
( res, CField.powin( F.leadCoeff( temp, f2 ),
- F.deg(f1) - F.deg(fi) ) );
+ (long)(F.deg(f1) - F.deg(fi)) ) );
if( !((F.deg(f2)-F.deg(f1))%2) && !((F.deg(f1)-n)%2) )
sign = (short)-sign;
f1 = f2;
@@ -60,14 +59,12 @@ namespace LinBox
if( F.deg(f2) == (n-1) ) {
CField.mulin
( res, CField.powin( F.leadCoeff( temp, f2 ),
- F.deg(f1) - F.deg(f2) ) );
+ (long)(F.deg(f1) - F.deg(f2)) ) );
if( sign == -1 ) {
- typename PField::Coeff negOne;
- CField.init( negOne, -1 );
- CField.mulin( res, negOne );
+ CField.mulin( res, CField.mOne);
}
}
- else CField.init( res, 0 );
+ else CField.assign( res, CField.zero );
return res;
}
diff --git a/linbox/algorithms/triangular-solve-gf2.h b/linbox/algorithms/triangular-solve-gf2.h
index 824a69d..d2db10b 100644
--- a/linbox/algorithms/triangular-solve-gf2.h
+++ b/linbox/algorithms/triangular-solve-gf2.h
@@ -2,20 +2,20 @@
* Copyright(C) LinBox 2008
* Written by Jean-Guillaume Dumas
* Triangular Solve
- *
+ *
* ========LICENCE========
* This file is part of the library LinBox.
- *
+ *
* LinBox is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
- *
+ *
* This library 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
* Lesser General Public License for more details.
- *
+ *
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
@@ -53,9 +53,9 @@ namespace LinBox
// for( ; (res != x.end()) && (row != U.rowEnd()); ++res, ++row, ++vec) { }
size_t last = x.size();
if( b.size() < last ) last = b.size();
- res += last;
- row += last;
- vec += last;
+ res += (ptrdiff_t)last;
+ row += (ptrdiff_t)last;
+ vec += (ptrdiff_t) last;
VectorCategories::DenseZeroOneVectorTag DZOtag;
VectorCategories::SparseZeroOneVectorTag SZOtag;
@@ -72,7 +72,7 @@ namespace LinBox
VectorDomain<Field> VD(F2);
for( ; row != U.begin(); --row, --vec, --res) {
- F2.init(*res, 0UL);
+ F2.assign(*res, F2.zero);
if (row->size()) {
typename Field::Element tmp;
VD.dotSpecialized(tmp, x, *row, DZOtag, SZOtag);
@@ -87,7 +87,7 @@ namespace LinBox
}
}
}
- F2.init(*res, 0UL);
+ F2.assign(*res, F2.zero);
if (row->size()) {
typename Field::Element tmp;
VD.dotSpecialized(tmp, x, *row, DZOtag, SZOtag);
@@ -125,7 +125,7 @@ namespace LinBox
VectorCategories::SparseZeroOneVectorTag SZOtag;
VectorDomain<GF2> VD(F2);
for( ; row != L.end(); ++row, ++vec, ++res) {
- F2.init(*res, 0UL);
+ F2.assign(*res, F2.zero);
GF2::Element tmp;
VD.dotSpecialized(tmp, *row, x, SZOtag, DZOtag);
F2.negin(tmp);
diff --git a/linbox/algorithms/triangular-solve.h b/linbox/algorithms/triangular-solve.h
index 435ffb8..06b6313 100644
--- a/linbox/algorithms/triangular-solve.h
+++ b/linbox/algorithms/triangular-solve.h
@@ -1,20 +1,20 @@
/* ===================================================================
* Copyright(C) 2008 LinBox
* Triangular Solve
- *
+ *
* ========LICENCE========
* This file is part of the library LinBox.
- *
+ *
* LinBox is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
- *
+ *
* This library 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
* Lesser General Public License for more details.
- *
+ *
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
@@ -50,7 +50,7 @@ namespace LinBox
// Assume U has form (U1, X | 0, 0), where U1 is invertible.
// Discover the rank of U so as to use the bottom of x to seed the solution.
for(row = U.rowEnd()-1; row >= U.rowBegin() && row->size() == 0; --row);
- row++; // now points to first zero row of U.
+ ++row; // now points to first zero row of U.
res += row - U.rowBegin();
vec += row - U.rowBegin();
@@ -66,7 +66,7 @@ namespace LinBox
VectorDomain<Field> VD(F);
for( ; row != U.rowBegin(); --row, --vec, --res) {
- F.init(*res, 0UL);
+ F.assign(*res, F.zero);
if (row->size()) {
typename Field::Element tmp;
VD.dot(tmp, *row, x);
@@ -84,7 +84,7 @@ namespace LinBox
}
}
- F.init(*res, 0UL);
+ F.assign(*res, F.zero);
if (row->size()) {
typename Field::Element tmp;
VD.dot(tmp, *row, x);
@@ -128,7 +128,8 @@ namespace LinBox
vec += b.size(); --vec;
typename Matrix::ConstRowIterator row=U.rowBegin();
- row += rank; --row;
+ row += (ptrdiff_t)rank;
+ --row;
VectorDomain<Field> VD(F);
@@ -187,7 +188,7 @@ namespace LinBox
VectorDomain<Field> VD(F);
for( ; row != L.rowEnd(); ++row, ++vec, ++res) {
- F.init(*res, 0UL);
+ F.assign(*res, F.zero);
typename Field::Element tmp;
VD.dot(tmp, *row, x);
F.negin(tmp);
diff --git a/linbox/algorithms/varprec-cra-early-multip.h b/linbox/algorithms/varprec-cra-early-multip.h
index 5f5ccda..e061242 100644
--- a/linbox/algorithms/varprec-cra-early-multip.h
+++ b/linbox/algorithms/varprec-cra-early-multip.h
@@ -28,7 +28,6 @@
#include "linbox/util/timer.h"
#include <stdlib.h>
#include "linbox/integer.h"
-#include "linbox/field/PID-integer.h"
#include "linbox/field/gmp-rational.h"
#include "linbox/solutions/methods.h"
#include <vector>
@@ -49,7 +48,7 @@ namespace LinBox
* FullMulpitCRA should consist of vectors of size 0, but errors happen.
*/
- //typedef PID_Integer Integers;
+ //typedef Givaro::ZRing<Integer> Integers;
//typedef Integers::Element Integer;
template<class Domain_Type>
@@ -63,18 +62,19 @@ namespace LinBox
typedef VarPrecEarlyMultipCRA<Domain> Self_t;
protected:
- std::vector< Integer > vfactor_;
- std::vector< Integer > vmultip_;
+ BlasVector< Givaro::ZRing<Integer> > vfactor_;
+ BlasVector< Givaro::ZRing<Integer> > vmultip_;
std::vector< unsigned long > randv;
+ Integer& result(Integer &d) {return d;}; // DON'T TOUCH
public:
VarPrecEarlyMultipCRA(const unsigned long EARLY = DEFAULT_EARLY_TERM_THRESHOLD, const double b=0.0,
- const std::vector<Integer>& vf = std::vector<Integer>(0),
- const std::vector<Integer>& vm = std::vector<Integer>(0)) :
+ const BlasVector<Givaro::ZRing<Integer> >& vf = BlasVector<Givaro::ZRing<Integer> >(Givaro::ZRing<Integer>()),
+ const BlasVector<Givaro::ZRing<Integer> >& vm = BlasVector<Givaro::ZRing<Integer> >(Givaro::ZRing<Integer>())) :
EarlySingleCRA<Domain>(EARLY), FullMultipCRA<Domain>(b), vfactor_(vf), vmultip_(vm)
{
for (int i=0; i < (int)vfactor_.size(); ++i) {
- if (vfactor_[i]==0) vfactor_[i]=1;
+ if (vfactor_[(size_t)i]==0) vfactor_[(size_t)i]=1;
}
}
@@ -82,18 +82,18 @@ namespace LinBox
EarlySingleCRA<Domain>(other.EARLY_TERM_THRESHOLD), FullMultipCRA<Domain>(other.LOGARITHMIC_UPPER_BOUND), vfactor_(other.vfactor_), vmultip_(other.vmultip_)
{
for (int i=0; i < vfactor_.size(); ++i) {
- if (vfactor_[i]==0) vfactor_[i]=1;
+ if (vfactor_[(size_t)i]==0) vfactor_[(size_t)i]=1;
}
}
- int getThreshold(int& t) {return t = EarlySingleCRA<Domain>::EARLY_TERM_THRESHOLD;}
+ int getThreshold(int& t) {return t = (int)EarlySingleCRA<Domain>::EARLY_TERM_THRESHOLD;}
Integer& getModulus(Integer& m) {EarlySingleCRA<Domain>::getModulus(m);return m;}
Integer& getResidue(Integer& r) {EarlySingleCRA<Domain>::getResidue(r);return r;}
template<class Vect>
Vect& getResidue(Vect& r) {
- Vect z,vf, vm;
+ Vect z(r.field()),vf(r.field()), vm(r.field());
FullMultipCRA<Domain>::result(z);
typename Vect::const_iterator it,itf,itm;
@@ -176,7 +176,7 @@ namespace LinBox
template<class Vect>
void progress (const Domain& D, const Vect& e) {
//z = (e/ factor mod D)
- // Could be much faster
+ //!@todo Could be much faster
// - do not compute twice the product of moduli
// - reconstruct one element of e until Early Termination,
// then only, try a random linear combination.
@@ -192,6 +192,25 @@ namespace LinBox
FullMultipCRA<Domain>::progress(D, e);
}
+ template<class OKDomain>
+ void progress (const Domain& D, const BlasVector<OKDomain>& e) {
+ //z = (e/ factor mod D)
+ //!@todo Could be much faster
+ // - do not compute twice the product of moduli
+ // - reconstruct one element of e until Early Termination,
+ // then only, try a random linear combination.
+
+ BlasVector<Domain> vz(D,vfactor_.size());
+ inverse(vz,vfactor_,D);
+ productin(vz,vmultip_,D);
+ productin(vz,e,D);
+ DomainElement z;
+ dot(z,D,vz,randv);
+
+ EarlySingleCRA<Domain>::progress(D, z);
+ FullMultipCRA<Domain>::progress(D, e);
+ }
+
bool terminated() {
bool ET = EarlySingleCRA<Domain>::terminated();
if (FullMultipCRA<Domain>::LOGARITHMIC_UPPER_BOUND> 1.0) ET = ET || FullMultipCRA<Domain>::terminated();
@@ -297,7 +316,8 @@ namespace LinBox
}
template<template<class,class> class Vect, template<class> class Alloc>
- Vect<Integer, Alloc<Integer> >& result(Vect<Integer, Alloc<Integer> >& num, Integer& den) {
+ Vect<Integer, Alloc<Integer> >& result(Vect<Integer, Alloc<Integer> >& num, Integer& den)
+ {
if ((FullMultipCRA<Domain>::LOGARITHMIC_UPPER_BOUND> 1.0) && ( FullMultipCRA<Domain>::terminated() )) {
FullMultipCRA<Domain>::result(num);
den = 1;
@@ -337,8 +357,51 @@ namespace LinBox
}
}
+ BlasVector<Givaro::ZRing<Integer> >& result(BlasVector<Givaro::ZRing<Integer> >& num, Integer& den)
+ {
+ if ((FullMultipCRA<Domain>::LOGARITHMIC_UPPER_BOUND> 1.0) && ( FullMultipCRA<Domain>::terminated() )) {
+ FullMultipCRA<Domain>::result(num);
+ den = 1;
+ return num;
+ }
+ else {
+ Givaro::ZRing<Integer> Z;
+ BlasVector<Givaro::ZRing<Integer> > z(Z),vf(Z), vm(Z);
+ FullMultipCRA<Domain>::result(z);//vector of non prec results
+
+ typename BlasVector<Givaro::ZRing<Integer> >::const_iterator it,itf,itm;
+ typename BlasVector<Givaro::ZRing<Integer> >::iterator itt;
+
+ Integer M; getModulus(M);
+ getPreconditioner(vf,vm);
+
+ BlasVector<Givaro::ZRing<Integer> > residue(Z);//vector of residues
+ getResidue(residue);
+
+ num.clear();
+
+ //getPreconditioner(vf,vm);
+ itf = vf.begin(); itm = vm.begin();it = residue.begin();
+ den = 1; Integer old_den =1;
+ for (; it!= residue.end(); ++it, ++itf,++itm ) {
+ lcm(den,den,*itm);Integer d = den/old_den;
+
+ num.push_back((*itf) * (*it));
+ if (den != old_den) {
+ for (itt=num.begin(); itt !=num.end()-1 ;++itt) {
+ *itt *= d;
+ }
+ *itt = *itt * (den/ (*itm));
+ }
+ old_den = den;
+ }
+ return num;
+ }
+ }
+
template<template<class, class> class Vect, template<class> class Alloc>
- Vect<Quotient, Alloc<Quotient> >& result(Vect<Quotient, Alloc<Quotient> >& q) {
+ Vect<Quotient, Alloc<Quotient> >& result(Vect<Quotient, Alloc<Quotient> >& q)
+ {
q.clear();
if ((FullMultipCRA<Domain>::LOGARITHMIC_UPPER_BOUND> 1.0) && ( FullMultipCRA<Domain>::terminated() )) {
std::vector<Integer> vz;
@@ -346,7 +409,7 @@ namespace LinBox
typename Vect<Integer, Alloc<Integer> >::const_iterator it = vz.begin();
for (; it!= vz.end(); ++it) {
- q.push_back(Quotient(*it,1UL));
+ q.push_back(Quotient(*it,1));
}
return q;
}
@@ -382,23 +445,24 @@ namespace LinBox
vfactor_ = vf;
for (int i=0; i < (int)vfactor_.size(); ++i) {
- if (vfactor_[i]==0) vfactor_[i]=1; //if factor ==0 set no factor
+ if (vfactor_[(size_t)i]==0) vfactor_[(size_t)i]=1; //if factor ==0 set no factor
}
vmultip_ = vm;
- Vect e(vfactor_.size());
+ Givaro::ZRing<Integer> Z;
+ Vect e(Z,vfactor_.size());
//clear CRAEarlySingle;
EarlySingleCRA<Domain>::occurency_ = 0;
- EarlySingleCRA<Domain>::nextM_ = 1UL;
- EarlySingleCRA<Domain>::primeProd_ = 1UL;
+ EarlySingleCRA<Domain>::nextM_ = 1;
+ EarlySingleCRA<Domain>::primeProd_ = 1;
EarlySingleCRA<Domain>::residue_ = 0;
//Computation of residue_
//std::vector< double >::iterator _dsz_it = RadixSizes_.begin();
std::vector< LazyProduct >::iterator _mod_it = FullMultipCRA<Domain>::RadixPrimeProd_.end();// list of prime products
- std::vector< std::vector<Integer> >::iterator _tab_it = FullMultipCRA<Domain>::RadixResidues_.end();// list of residues as vectors of size 1
+ std::vector< BlasVector<Givaro::ZRing<Integer> > >::iterator _tab_it = FullMultipCRA<Domain>::RadixResidues_.end();// list of residues as vectors of size 1
std::vector< bool >::iterator _occ_it = FullMultipCRA<Domain>::RadixOccupancy_.end();//flags of occupied fields
int n = (int)FullMultipCRA<Domain>::RadixOccupancy_.size();
//std::vector<Integer> ri(1); LazyProduct mi; double di;
@@ -410,7 +474,7 @@ namespace LinBox
++shelf;
if (*_occ_it) {
Integer D = _mod_it->operator()();
- Vect e_v(vfactor_.size());
+ Vect e_v(Z,vfactor_.size());
inverse(e_v,vfactor_,D);
productin(e_v,*_tab_it,D);
productin(e_v,vmultip_,D);
@@ -423,7 +487,7 @@ namespace LinBox
EarlySingleCRA<Domain>::progress(D,z);
if (prev_residue_ == EarlySingleCRA<Domain>::residue_ ) {
- EarlySingleCRA<Domain>::occurency_ = EarlySingleCRA<Domain>::occurency_ + (shelf - prev_shelf);
+ EarlySingleCRA<Domain>::occurency_ = EarlySingleCRA<Domain>::occurency_ + (unsigned int) (shelf - prev_shelf);
}
if ( EarlySingleCRA<Domain>::terminated() ) {
return true;
@@ -451,8 +515,9 @@ namespace LinBox
template <template<class> class Alloc, template<class, class> class Vect1, class Vect2>
DomainElement& dot (DomainElement& z, const Domain& D,
const Vect1<DomainElement, Alloc<DomainElement> >& v1,
- const Vect2& v2) {
- D.init(z,0); DomainElement tmp;
+ const Vect2& v2)
+ {
+ D.assign(z,D.zero); DomainElement tmp;
typename Vect1<DomainElement, Alloc<DomainElement> >::const_iterator v1_p;
typename Vect2::const_iterator v2_p;
@@ -461,8 +526,24 @@ namespace LinBox
return z;
}
+ template<class Vect2>
+ DomainElement& dot (DomainElement& z, const Domain& D,
+ const BlasVector<Domain>& v1,
+ const Vect2& v2)
+ {
+ D.assign(z,D.zero); DomainElement tmp;
+ typename BlasVector<Domain>::const_iterator v1_p;
+ typename Vect2::const_iterator v2_p;
+
+ for (v1_p = v1. begin(), v2_p = v2. begin();v1_p != v1. end();++ v1_p, ++ v2_p)
+ D.axpyin(z, (*v1_p), D.init(tmp, (*v2_p)));
+ return z;
+ }
+
+
template <template<class> class Alloc, template<class, class> class Vect1, class Vect2>
- Integer& dot (Integer& z, const Integer& D, const Vect1<Integer, Alloc<Integer> >& v1, const Vect2& v2) {
+ Integer& dot (Integer& z, const Integer& D, const Vect1<Integer, Alloc<Integer> >& v1, const Vect2& v2)
+ {
z = 0;
typename Vect1<Integer, Alloc<Integer> >::const_iterator v1_p;
typename Vect2::const_iterator v2_p;
@@ -472,14 +553,28 @@ namespace LinBox
return z;
}
+ template<class Vect2>
+ Integer& dot (Integer& z, const Integer& D, const BlasVector<Givaro::ZRing<Integer> >& v1, const Vect2& v2)
+ {
+ z = 0;
+ typename BlasVector<Givaro::ZRing<Integer> >::const_iterator v1_p;
+ typename Vect2::const_iterator v2_p;
+ for (v1_p = v1. begin(), v2_p = v2. begin(); v1_p != v1. end(); ++ v1_p, ++ v2_p) {
+ z = (z + (*v1_p)*int64_t(*v2_p))%D;
+ }
+ return z;
+ }
+
+
template<class Vect1, class Vect2>
- Vect1& inverse(Vect1& vz,const Vect2 vf, const Domain D) {
+ Vect1& inverse(Vect1& vz,const Vect2& vf, const Domain D)
+ {
vz.clear();
typename Vect2::const_iterator it = vf.begin();
for (; it != vf.end(); ++it) {
DomainElement z,i;
- D.init(z,1);
+ D.assign(z,D.one);
D.init(i,*it);
if (!D.isZero(i)) D.inv(z,i);
vz.push_back(z);
@@ -489,7 +584,8 @@ namespace LinBox
}
template<class Vect1, class Vect2>
- Vect1& inverse(Vect1& vz,const Vect2& vf, const Integer& D) {
+ Vect1& inverse(Vect1& vz,const Vect2& vf, const Integer& D)
+ {
vz.clear();
typename Vect2::const_iterator it = vf.begin();
@@ -500,9 +596,10 @@ namespace LinBox
}
return vz;
}
+
public:
template<class Vect1, class Vect2>
- Vect1& productin(Vect1& vz, const Vect2 vm, const Domain D) {
+ Vect1& productin(Vect1& vz, const Vect2 &vm, const Domain D) {
typename Vect1::iterator v1_p;
typename Vect2::const_iterator v2_p;
@@ -559,11 +656,10 @@ namespace LinBox
#endif //__LINBOX_varprec_cra_multip_single_H
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
// Local Variables:
// mode: C++
// tab-width: 8
// indent-tabs-mode: nil
// c-basic-offset: 8
// End:
-
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/algorithms/varprec-cra-early-single.h b/linbox/algorithms/varprec-cra-early-single.h
index ee290c1..6d6e34d 100644
--- a/linbox/algorithms/varprec-cra-early-single.h
+++ b/linbox/algorithms/varprec-cra-early-single.h
@@ -28,10 +28,8 @@
#include "linbox/util/timer.h"
#include <stdlib.h>
#include "linbox/integer.h"
-#include "linbox/field/PID-integer.h"
#include "linbox/field/gmp-rational.h"
#include "linbox/solutions/methods.h"
-#include <vector>
#include <utility>
#include "linbox/algorithms/cra-early-single.h"
#include "linbox/algorithms/cra-full-multip.h"
@@ -51,7 +49,7 @@ namespace LinBox
template<class Domain_Type>
struct VarPrecEarlySingleCRA: public EarlySingleCRA<Domain_Type>, FullMultipCRA<Domain_Type> {
- //typedef PID_Integer Integers;
+ //typedef Givaro::ZRing<Integer> Integers;
//typedef Integers::Element Integer;
typedef GMPRationalField Rationals;
typedef Rationals::Element Quotient;
@@ -87,7 +85,7 @@ namespace LinBox
int getThreshold(int& t)
{
- return t = EarlySingleCRA<Domain>::EARLY_TERM_THRESHOLD;
+ return t = (int)EarlySingleCRA<Domain>::EARLY_TERM_THRESHOLD;
}
Integer& getModulus(Integer& m)
@@ -114,7 +112,8 @@ namespace LinBox
z%=D;
EarlySingleCRA<Domain>::initialize(D, z);
- std::vector<Integer> v;
+ Givaro::ZRing<Integer> ZZ ;
+ BlasVector<Givaro::ZRing<Integer> > v(ZZ);
v.push_back(e);
FullMultipCRA<Domain>::initialize(D, v);
}
@@ -129,7 +128,7 @@ namespace LinBox
D.mulin(z,m);
EarlySingleCRA<Domain>::initialize(D, z);
- std::vector<DomainElement> v;
+ BlasVector<Domain> v(D);
v.push_back(e);
FullMultipCRA<Domain>::initialize(D, v);
}
@@ -150,7 +149,8 @@ namespace LinBox
//z = e / factor mod D;
EarlySingleCRA<Domain>::progress(D, z);
- std::vector<Integer> v;
+ Givaro::ZRing<Integer> ZZ ;
+ BlasVector<Givaro::ZRing<Integer> > v(ZZ);
v.push_back(e);
FullMultipCRA<Domain>::progress(D, v);
}
@@ -173,7 +173,7 @@ namespace LinBox
EarlySingleCRA<Domain>::progress(D, z);
- std::vector<DomainElement> v;
+ BlasVector<Domain> v(D);
v.push_back(e);
FullMultipCRA<Domain>::progress(D, v);
@@ -218,7 +218,8 @@ namespace LinBox
Integer& result(Integer& r)
{
if ((FullMultipCRA<Domain>::LOGARITHMIC_UPPER_BOUND> 1.0) && ( FullMultipCRA<Domain>::terminated() )) {
- std::vector<Integer> v;
+ Givaro::ZRing<Integer> ZZ ;
+ BlasVector<Givaro::ZRing<Integer> > v(ZZ);
FullMultipCRA<Domain>::result(v);
return r = v.front();
}
@@ -232,7 +233,8 @@ namespace LinBox
Quotient& result(Quotient& q)
{
if ((FullMultipCRA<Domain>::LOGARITHMIC_UPPER_BOUND> 1.0) && ( FullMultipCRA<Domain>::terminated() )) {
- std::vector<Integer> v;
+ Givaro::ZRing<Integer> ZZ ;
+ BlasVector<Givaro::ZRing<Integer> > v(ZZ);
FullMultipCRA<Domain>::result(v);
return q = v.front();
}
@@ -248,7 +250,8 @@ namespace LinBox
{
if ((FullMultipCRA<Domain>::LOGARITHMIC_UPPER_BOUND> 1.0) && ( FullMultipCRA<Domain>::terminated() )) {
den =1;
- std::vector<Integer> v;
+ Givaro::ZRing<Integer> ZZ ;
+ BlasVector<Givaro::ZRing<Integer> > v(ZZ);
FullMultipCRA<Domain>::result(v);
return num = v.front();
}
@@ -276,18 +279,18 @@ namespace LinBox
//clear CRAEarlySingle;
EarlySingleCRA<Domain>::occurency_ = 0;
- EarlySingleCRA<Domain>::nextM_ = 1UL;
- EarlySingleCRA<Domain>::primeProd_ = 1UL;
+ EarlySingleCRA<Domain>::nextM_ = 1;
+ EarlySingleCRA<Domain>::primeProd_ = 1;
EarlySingleCRA<Domain>::residue_ = 0;
//Computation of residue_
//std::vector< double >::iterator _dsz_it = RadixSizes_.begin();//nie wiem
std::vector< LazyProduct >::iterator _mod_it = FullMultipCRA<Domain>::RadixPrimeProd_.end(); // list of prime products
- std::vector< std::vector<Integer> >::iterator _tab_it = FullMultipCRA<Domain>::RadixResidues_.end(); // list of residues as vectors of size 1
+ std::vector< BlasVector<Givaro::ZRing<Integer> > >::iterator _tab_it = FullMultipCRA<Domain>::RadixResidues_.end(); // list of residues as vectors of size 1
std::vector< bool >::iterator _occ_it = FullMultipCRA<Domain>::RadixOccupancy_.end(); //flags of occupied fields
int n= (int) FullMultipCRA<Domain>::RadixOccupancy_.size();
- //std::vector<Integer> ri(1); LazyProduct mi; double di;//nie wiem
+ //BlasVector<Givaro::ZRing<Integer> > ri(1); LazyProduct mi; double di;//nie wiem
// could be much faster if max occupandy is stored
--_mod_it; --_tab_it; --_occ_it;
int prev_shelf=0, shelf = 0; Integer prev_residue_ =0;
@@ -308,7 +311,7 @@ namespace LinBox
EarlySingleCRA<Domain>::progress(D,e_i);
if (prev_residue_ == EarlySingleCRA<Domain>::residue_ ) {
- EarlySingleCRA<Domain>::occurency_ = EarlySingleCRA<Domain>::occurency_ + (shelf - prev_shelf);
+ EarlySingleCRA<Domain>::occurency_ = EarlySingleCRA<Domain>::occurency_ + (unsigned int) (shelf - prev_shelf);
}
diff --git a/linbox/algorithms/vector-fraction.h b/linbox/algorithms/vector-fraction.h
index af94e3a..f128a09 100644
--- a/linbox/algorithms/vector-fraction.h
+++ b/linbox/algorithms/vector-fraction.h
@@ -28,6 +28,7 @@
#include "linbox/linbox-config.h"
#include "linbox/util/debug.h"
#include <stdio.h>
+#include "linbox/vector/blas-vector.h"
#include "linbox/vector/vector-traits.h"
namespace LinBox
@@ -54,7 +55,7 @@ namespace LinBox
//this could be replaced by a fancier version that combines elements linearly at random
template<class Domain, class Vector>
void vectorGcdIn(typename Domain::Element& result, Domain& D, Vector& v) {
- for (typename Vector::iterator i = v.begin(); i != v.end(); i++)
+ for (typename Vector::iterator i = v.begin(); i != v.end(); ++i)
D.gcdin(result, *i);
}
@@ -63,7 +64,7 @@ namespace LinBox
template<class Domain, class Vector>
typename Domain::Element vectorGcd(Domain& D, Vector& v) {
typename Domain::Element result;
- D.init(result, 0);
+ D.assign(result, D.zero);
vectorGcdIn(result, D, v);
return result;
}
@@ -71,7 +72,7 @@ namespace LinBox
/**
* \brief VectorFraction<Domain> is a vector of rational elements with common reduced denominator.
- * Here Domain is a ring supporting the gcd, eg NTL_ZZ or PID_integer
+ * Here Domain is a ring supporting the gcd, eg NTL_ZZ or Givaro::ZRing<Integer>
* For compatability with the return type of rationalSolver, it allows conversion from/to
* std::vector<std::pair<Domain::Element> >.
* All functions will return the fraction in reduced form, calling reduce() if necessary.
@@ -80,15 +81,14 @@ namespace LinBox
template<class Domain>
class VectorFraction{
public:
- typedef typename Domain::Element Element;
+ typedef typename Domain::Element Element;
typedef typename std::pair<Element, Element> Fraction;
- typedef typename std::vector<Fraction> FVector;
- typedef typename Vector<Domain>::Dense Vector;
+ typedef typename std::vector<Fraction> FVector;
+ typedef BlasVector<Domain> Vector;
Vector numer;
Element denom;
const Domain& _domain;
- Element zero;
/**
* constructor from vector of rational numbers
@@ -102,13 +102,12 @@ namespace LinBox
bool alreadyReduced = false;
typename FVector::iterator i;
- D.init(zero, 0);
- D.init(denom, 1);
+ D.assign(denom, D.one);
if (!alreadyReduced)
- for (i=frac.begin(); i!=frac.end(); i++)
+ for (i=frac.begin(); i!=frac.end(); ++i)
reduceIn(D, *i);
- for (i=frac.begin(); i!=frac.end(); i++) {
+ for (i=frac.begin(); i!=frac.end(); ++i) {
linbox_check(!D.isZero(i->second));
D.lcmin(denom, i->second);
}
@@ -116,7 +115,7 @@ namespace LinBox
numer = Vector(frac.size());
typename Vector::iterator j;
- for (i=frac.begin(), j=numer.begin(); i!=frac.end(); i++, j++){
+ for (i=frac.begin(), j=numer.begin(); i!=frac.end(); ++i, ++j){
D.mul(*j, denom, i->first);
D.divin(*j, i->second);
}
@@ -124,20 +123,19 @@ namespace LinBox
/** allocating constructor, returns [0, 0, ... 0]/1 */
VectorFraction(const Domain& D, size_t n) :
- _domain(D)
+ numer(D,n)
+ ,_domain(D)
{
- D.init(zero, 0);
- D.init(denom, 1);
- numer = Vector(n);
typename Vector::iterator j;
- for (j=numer.begin(); j!=numer.end(); j++)
- D.assign(*j, zero);
+ for (j=numer.begin(); j!=numer.end(); ++j)
+ D.assign(*j, D.zero);
}
/** copy constructor */
VectorFraction(const VectorFraction<Domain>& VF) :
- _domain(VF._domain)
+ numer(VF._domain)
+ ,_domain(VF._domain)
{
copy(VF);
}
@@ -151,18 +149,18 @@ namespace LinBox
typename Vector::iterator i;
typename Vector::const_iterator j;
- for (i=numer.begin(), j=VF.numer.begin(); i!=numer.end(); i++, j++)
+ for (i=numer.begin(), j=VF.numer.begin(); i!=numer.end(); ++i, ++j)
_domain.assign(*i, *j);
}
/** clear and resize without construction */
void clearAndResize(size_t size)
{
- _domain.init(denom, 1);
+ _domain.init(denom, (int64_t)1);
typename Vector::iterator i;
numer.resize(size);
- for (i=numer.begin(); i!=numer.end(); i++)
- _domain.init(*i, 0);
+ for (i=numer.begin(); i!=numer.end(); ++i)
+ _domain.assign(*i, _domain.zero);
}
/**
@@ -180,13 +178,13 @@ namespace LinBox
return true;
}
Element s, t, g;
- _domain.xgcd(g, s, t, denom, other.denom);
+ _domain.gcd(g, s, t, denom, other.denom);
if (_domain.areEqual(g, denom)) ; //do nothing
else {
denom = g;
typename Vector::iterator it=numer.begin();
typename Vector::const_iterator io=other.numer.begin();
- for (; it != numer.end(); it++, io++) {
+ for (; it != numer.end(); ++it, ++io) {
_domain.mulin(*it, s);
_domain.axpyin(*it, t, *io);
}
@@ -237,7 +235,7 @@ namespace LinBox
_domain.assign(denom, lincomb);
typename Vector::iterator it=numer.begin();
typename Vector::const_iterator io=other.numer.begin();
- for (; it != numer.end(); it++, io++)
+ for (; it != numer.end(); ++it, ++io)
_domain.axpyin(*it, A, *io);
return true;
}
@@ -263,7 +261,7 @@ namespace LinBox
return true;
}
- Element A, g, l, n1d2_g, n2d1_g, lincomb, g2, tmpe, one;
+ Element A, g, l, n1d2_g, n2d1_g, lincomb, g2, tmpe;
_domain.gcd(g, d1, d2); //compute gcd
_domain.mul(l, d1, d2);
@@ -279,7 +277,6 @@ namespace LinBox
integer tmp;
_domain.mul(tmpe, denom, other.denom);
_domain.convert(tmp, tmpe);
- _domain.init(one, 1);
typename Domain::RandIter randiter(_domain, tmp); //seed omitted
// TODO: I don't think this random iterator has high-quality low order bits, which are needed
do {
@@ -288,7 +285,7 @@ namespace LinBox
_domain.axpyin(lincomb, A, n2d1_g);
_domain.gcd(g2, lincomb, l);
}
- while (!_domain.areEqual(one, g2));
+ while (!_domain.areEqual(_domain.one, g2));
this->axpyin(A, other);
_domain.lcmin(d1, d2);
@@ -318,7 +315,7 @@ namespace LinBox
typename Vector::iterator i = this->numer.begin();
typename Vector::const_iterator j = x.numer.begin();
- for (; i != this->numer.end(); i++, j++) {
+ for (; i != this->numer.end(); ++i, ++j) {
_domain.mulin(*i, xdenom_prime);
_domain.axpyin(*i, a_prime, *j);
}
@@ -333,7 +330,7 @@ namespace LinBox
std::ostream& write(std::ostream& os) const
{
os << "[";
- for (typename Vector::const_iterator it=numer.begin(); it != numer.end(); it++) {
+ for (typename Vector::const_iterator it=numer.begin(); it != numer.end(); ++it) {
if (it != numer.begin()) os << " ";
os << *it;
}
@@ -346,7 +343,7 @@ namespace LinBox
linbox_check(numer.size()==result.size());
typename Vector::const_iterator it=numer.begin();
typename FVector::iterator ir=result.begin();
- for (; it != numer.end(); it++, ir++) {
+ for (; it != numer.end(); ++it, ++ir) {
_domain.assign(ir->first, *it);
_domain.assign(ir->second, denom);
}
@@ -362,7 +359,7 @@ namespace LinBox
vectorGcdIn(gcd, _domain, numer);
_domain.divin(denom, gcd);
- for (i=numer.begin(); i!=numer.end(); i++)
+ for (i=numer.begin(); i!=numer.end(); ++i)
_domain.divin(*i, gcd);
return (*this);
}
diff --git a/linbox/algorithms/whisart_trace.h b/linbox/algorithms/whisart_trace.h
old mode 100644
new mode 100755
index 9875bb9..25ab2f9
--- a/linbox/algorithms/whisart_trace.h
+++ b/linbox/algorithms/whisart_trace.h
@@ -1,7 +1,7 @@
-/* linbox/algorithms/cra-domain.h
+/* linbox/algorithms/whisart_trace.h
* Copyright (C) 1999-2010 The LinBox group
*
- * Time-stamp: <19 Apr 10 18:35:14 Jean-Guillaume.Dumas at imag.fr>
+ * Time-stamp: <23 Oct 15 17:07:37 Jean-Guillaume.Dumas at imag.fr>
* Computes the trace of D1 B D2 B^T D1 or D1 B^T D2 B D1
*
* ========LICENCE========
@@ -22,55 +22,27 @@
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
* ========LICENCE========
*/
-#ifndef __LINBOX_whisart_trace_H
-#define __LINBOX_whisart_trace_H
-
-#include "linbox/field/modular.h"
-#include "linbox/blackbox/compose.h"
-#include "linbox/blackbox/transpose.h"
-#include "linbox/blackbox/sparse.h"
-#include "linbox/blackbox/lambda-sparse.h"
-// #include "linbox/blackbox/subrowmatrix.h"
-#include "linbox/solutions/trace.h"
-
-namespace LinBox
-{
-
- // Trait to show whether or not the BB class has a Indexed iterator
- template<class BB> struct IndexedCategory;
- /// limited doc so far
- namespace IndexedTags
- {
- struct HasIndexed{};
- struct NoIndexed{};
- }
-
- template<class BB> struct IndexedCategory {
- typedef IndexedTags::NoIndexed Tag;
- };
+/** @file linbox/algorithms/whisart_trace.h
+ * @brief Whisart trace
+ * Computes the trace of D1 B D2 B^T D1 or D1 B^T D2 B D1
+ */
- template<class Field>
- struct IndexedCategory< BlasMatrix<Field> > {
- typedef IndexedTags::HasIndexed Tag; };
+#ifndef __LINBOX_whisart_trace_H
+#define __LINBOX_whisart_trace_H
+#include "linbox/ring/modular.h"
- template<class Field, class Row>
- struct IndexedCategory< LambdaSparseMatrix<Field,Row> > {
- typedef IndexedTags::HasIndexed Tag; };
+#include "linbox/matrix/dense-matrix.h"
- template<class Field, class Row>
- struct IndexedCategory< SparseMatrix<Field,Row> > {
- typedef IndexedTags::HasIndexed Tag; };
+#include "linbox/matrix/sparse-matrix.h"
-#if 0
- template<class Matrix, class MatrixCategory>
- struct IndexedCategory< SubRowMatrix<Matrix,MatrixCategory> > {
- typedef IndexedTags::HasIndexed Tag;
- };
-#endif
+#include "linbox/blackbox/blackbox.h"
+#include "linbox/solutions/trace.h"
+namespace LinBox
+{
template<class Field, class BB>
typename Field::Element& WhisartTrace(
@@ -150,7 +122,7 @@ namespace LinBox
{
// Trace of ExtD B InD B^T ExtD
// is sum ExtD_i^2 B_{i,j} InD_j
- F.init(tr, 0);
+ F.init(tr);
for(typename BB::ConstIndexedIterator it = A.IndexedBegin();
it != A.IndexedEnd(); ++it) {
typename Field::Element tmp,e,i;
@@ -168,6 +140,40 @@ namespace LinBox
}
template<class Field, class BB>
+ typename Field::Element& WhisartTrace(
+ typename Field::Element& tr,
+ const Field& F,
+ const LinBox::Diagonal<Field>& ExtD,
+ const BB& A,
+ const LinBox::Diagonal<Field>& InD,
+ IndexedTags::HasNext )
+ {
+ // Trace of ExtD B InD B^T ExtD
+ // is sum ExtD_i^2 B_{i,j} InD_j
+ size_t i,j ;
+ typename Field::Element it ;
+ F.init(tr);
+ A.firstTriple();
+ while ( A.nextTriple(i,j,it) ) {
+ typename Field::Element tmp,e,f;
+ F.init(tmp);
+ F.init(e);
+ F.init(f);
+ F.mul(tmp,it,it);
+ ExtD.getEntry(e, i, i);
+ F.mulin(tmp,e);
+ F.mulin(tmp,e);
+ InD.getEntry(f, j , j);
+ F.mulin(tmp,f);
+ F.addin(tr, tmp);
+ }
+ A.firstTriple();
+ return tr;
+ }
+
+
+
+ template<class Field, class BB>
typename Field::Element& WhisartTraceTranspose(
typename Field::Element& tr,
const Field& F,
@@ -178,14 +184,14 @@ namespace LinBox
{
// Trace of ExtD B^T InD B ExtD
// is sum ExtD_j^2 B_{i,j} InD_i
- F.init(tr, 0);
+ F.init(tr);
for(typename BB::ConstIndexedIterator it = A.IndexedBegin();
it != A.IndexedEnd(); ++it) {
typename Field::Element tmp,e,i;
- F.init(tmp,0UL);
- F.init(e,0UL);
- F.init(i,0UL);
+ F.init(tmp);
+ F.init(e);
+ F.init(i);
F.mul(tmp, it.value(),it.value());
ExtD.getEntry(e, it.colIndex(),it.colIndex());
@@ -199,17 +205,50 @@ namespace LinBox
return tr;
}
+ template<class Field, class BB>
+ typename Field::Element& WhisartTraceTranspose(
+ typename Field::Element& tr,
+ const Field& F,
+ const LinBox::Diagonal<Field>& ExtD,
+ const BB& A,
+ const LinBox::Diagonal<Field>& InD,
+ IndexedTags::HasNext )
+ {
+ // Trace of ExtD B^T InD B ExtD
+ // is sum ExtD_j^2 B_{i,j} InD_i
+ F.init(tr);
+ size_t i,j ;
+ typename Field::Element it ;
+ F.init(tr);
+ A.firstTriple();
+ while ( A.nextTriple(i,j,it) ) {
+
+ typename Field::Element tmp,e,f;
+ F.init(tmp);
+ F.init(e);
+ F.init(f);
+
+ F.mul(tmp, it,it);
+ ExtD.getEntry(e,j,j);
+ F.mulin(tmp,e);
+ F.mulin(tmp,e);
+ InD.getEntry(f, i,i);
+ F.mulin(tmp,f);
+ F.addin(tr, tmp);
+ }
+
+ return tr;
+ }
}
#endif //__LINBOX_whisart_trace_H
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
// Local Variables:
// mode: C++
// tab-width: 8
// indent-tabs-mode: nil
// c-basic-offset: 8
// End:
-
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/algorithms/wiedemann.h b/linbox/algorithms/wiedemann.h
index b3d9180..65bdd2c 100644
--- a/linbox/algorithms/wiedemann.h
+++ b/linbox/algorithms/wiedemann.h
@@ -35,20 +35,20 @@
* which one to use in different circumstances
* ------------------------------------
*
- *
+ *
* ========LICENCE========
* This file is part of the library LinBox.
- *
+ *
* LinBox is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
- *
+ *
* This library 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
* Lesser General Public License for more details.
- *
+ *
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
@@ -69,7 +69,7 @@
#include "linbox/blackbox/archetype.h"
#include "linbox/blackbox/squarize.h"
-#include "linbox/blackbox/sparse.h"
+#include "linbox/matrix/sparse-matrix.h"
#include "linbox/util/debug.h"
#include "linbox/vector/vector-domain.h"
#include "linbox/solutions/methods.h"
@@ -130,23 +130,22 @@ namespace LinBox
#endif // INCLUDE_TIMING
}
-
-
commentator().stop ("done", NULL, "minpoly");
return P;
}
}
-#ifdef __LINBOX_HAVE_GIVARO
#ifndef LINBOX_EXTENSION_DEGREE_MAX
#define LINBOX_EXTENSION_DEGREE_MAX 19
#endif
-#include "linbox/blackbox/sparse.h"
-#include "linbox/field/modular.h"
+#include <givaro/extension.h>
+#include <givaro/gfq.h>
+
+#include "linbox/matrix/sparse-matrix.h"
+#include "linbox/ring/modular.h"
#include "linbox/algorithms/matrix-hom.h"
-#include "linbox/field/givaro.h"
#include "linbox/field/map.h"
namespace LinBox
@@ -163,34 +162,34 @@ namespace LinBox
const Field& F = A.field();
integer a,c; F.cardinality(a); F.characteristic(c);
if (a != c) {
- unsigned long extend = (unsigned long)FF_EXPONENT_MAX(a,(integer)LINBOX_EXTENSION_DEGREE_MAX);
+ uint64_t extend = (uint64_t)FF_EXPONENT_MAX(a,(integer)LINBOX_EXTENSION_DEGREE_MAX);
if (extend > 1) {
commentator().report (Commentator::LEVEL_ALWAYS,INTERNAL_WARNING) << "Extension of degree " << extend << std::endl;
- GivaroExtension<Field> EF( F, extend);
+ Givaro::Extension<Field> EF( F, extend);
- typedef typename Blackbox::template rebind< GivaroExtension<Field> >::other FBlackbox;
+ typedef typename Blackbox::template rebind< Givaro::Extension<Field> >::other FBlackbox;
FBlackbox Ap(A, EF);
- std::vector< typename GivaroExtension<Field>::Element > eP;
+ BlasVector< Givaro::Extension<Field> > eP(EF);
minpoly(eP, Ap, tag, Method::Wiedemann(M));
- return PreMap<Field, GivaroExtension<Field> >(F,EF)(P, eP);
+ return PreMap<Field, Givaro::Extension<Field> >(F,EF)(P, eP);
}
else
return minpoly(P, A, tag, Method::Wiedemann(M));
-
}
else {
- unsigned long extend = (unsigned long)FF_EXPONENT_MAX(c,(integer)LINBOX_EXTENSION_DEGREE_MAX);
+ uint64_t extend = (uint64_t)FF_EXPONENT_MAX(c,(integer)LINBOX_EXTENSION_DEGREE_MAX);
if (extend > 1) {
commentator().report (Commentator::LEVEL_ALWAYS,INTERNAL_WARNING) << "Word size extension : " << extend << std::endl;
- GivaroGfq EF( (unsigned long)c, extend);
- typedef typename Blackbox::template rebind< GivaroGfq >::other FBlackbox;
+ typedef Givaro::GFqDom<int64_t> Fld;
+ Fld EF( (uint64_t)c, extend);
+ typedef typename Blackbox::template rebind< Fld >::other FBlackbox;
FBlackbox Ap(A, EF);
- std::vector< typename GivaroGfq::Element > eP;
+ BlasVector< Fld > eP(EF);
minpoly(eP, Ap, tag, Method::Wiedemann(M));
- return PreMap<Field, GivaroGfq >(F,EF)(P, eP);
+ return PreMap<Field, Fld >(F,EF)(P, eP);
}
else
@@ -198,8 +197,8 @@ namespace LinBox
}
}
}
-#else
-namespace LinBox
+
+/*namespace LinBox
{
// The minpoly with BlackBox Method
template<class Polynomial, class Blackbox>
@@ -212,8 +211,7 @@ namespace LinBox
commentator().report (Commentator::LEVEL_ALWAYS,INTERNAL_WARNING) << " WARNING, no extension available, returning only a factor of the minpoly\n";
return minpoly(P, A, tag, Method::Wiedemann (M));
}
-}
-#endif
+}*/
namespace LinBox
{
@@ -240,7 +238,7 @@ namespace LinBox
* options for the solver
*/
WiedemannSolver (const Field &F, const WiedemannTraits &traits) :
- _traits (traits), _field (F), _randiter (F), _VD (F)
+ _traits (traits), _field (&F), _randiter (F), _VD (F)
{}
/*! Constructor with a random iterator.
@@ -253,7 +251,7 @@ namespace LinBox
WiedemannSolver (const Field &F,
const WiedemannTraits &traits,
typename Field::RandIter r) :
- _traits (traits), _field (F), _randiter (r), _VD (F)
+ _traits (traits), _field (&F), _randiter (r), _VD (F)
{}
/// \ingroup algorithms
@@ -354,6 +352,7 @@ namespace LinBox
//@}
+ inline const Field & field() const { return *_field; }
private:
@@ -361,7 +360,7 @@ namespace LinBox
SparseMatrix<Field> *makeLambdaSparseMatrix (size_t m);
WiedemannTraits _traits;
- const Field &_field;
+ const Field *_field;
typename Field::RandIter _randiter;
VectorDomain<Field> _VD;
};
@@ -373,11 +372,10 @@ namespace LinBox
#endif // __LINBOX_wiedemann_H
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
// Local Variables:
// mode: C++
// tab-width: 8
// indent-tabs-mode: nil
// c-basic-offset: 8
// End:
-
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/algorithms/wiedemann.inl b/linbox/algorithms/wiedemann.inl
index 6c98ce5..c3efed3 100644
--- a/linbox/algorithms/wiedemann.inl
+++ b/linbox/algorithms/wiedemann.inl
@@ -29,20 +29,20 @@
* which one to use in different circumstances
* ------------------------------------
*
- *
+ *
* ========LICENCE========
* This file is part of the library LinBox.
- *
+ *
* LinBox is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
- *
+ *
* This library 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
* Lesser General Public License for more details.
- *
+ *
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
@@ -65,7 +65,6 @@
#include "linbox/algorithms/blackbox-container-symmetric.h"
//#include "linbox/algorithms/blackbox-container-generic.h"
#include "linbox/algorithms/massey-domain.h"
-#include "linbox/switch/cekstv.h"
#include "linbox/solutions/rank.h"
#include "linbox/vector/stream.h"
@@ -90,7 +89,7 @@ namespace LinBox
if (A.rowdim() != A.coldim() ) _traits.singular (singular = WiedemannTraits::SINGULAR);
ReturnStatus status = FAILED;
- unsigned int tries = (int)_traits.maxTries ();
+ unsigned int tries = (unsigned int)_traits.maxTries ();
unsigned long r = (unsigned long) -1;
@@ -113,7 +112,7 @@ namespace LinBox
case SINGULAR:
commentator().report (Commentator::LEVEL_IMPORTANT, INTERNAL_DESCRIPTION)
<< "System found to be singular. Reverting to nonsingular solver." << std::endl;
- tries = (int)_traits.maxTries ();
+ tries = (unsigned int)_traits.maxTries ();
singular = WiedemannTraits::SINGULAR;
break;
default:
@@ -192,13 +191,13 @@ namespace LinBox
const Vector &b,
bool useRandIter)
{
- typedef std::vector<typename Field::Element> Polynomial;
+ typedef BlasVector<Field> Polynomial;
typedef typename Polynomial::iterator PolyIterator;
commentator().start ("Solving nonsingular system (Wiedemann)", "WiedemannSolver::solveNonsingular");
- Polynomial m_A;
- Vector z;
+ Polynomial m_A(A.field());
+ Vector z(A.field());
bool ret = true;
{
@@ -215,7 +214,7 @@ namespace LinBox
_VD.write (report, m_A) << std::endl;
}
- if (_field.isZero (m_A.front ())) {
+ if (field().isZero (m_A.front ())) {
commentator().stop ("singular", "System found to be singular",
"WiedemannSolver::solveNonsingular");
return SINGULAR;
@@ -227,8 +226,8 @@ namespace LinBox
PolyIterator iter = m_A.begin ();
while (++iter != m_A.end ()) {
- _field.divin (*iter, m_A.front ());
- _field.negin (*iter);
+ field().divin (*iter, m_A.front ());
+ field().negin (*iter);
}
commentator().stop ("done");
@@ -242,11 +241,11 @@ namespace LinBox
VectorWrapper::ensureDim (z, A.rowdim ());
for (int i = (int) m_A.size () - 1; --i > 0;) {
- if ((m_A.size () - i) & (0xff == 0))
- commentator().progress (m_A.size () - i);
+ if (((long)m_A.size () - i) & (0xff == 0))
+ commentator().progress ((long)m_A.size () - i);
A.apply (z, x);
- _VD.axpy (x, m_A[i], b, z);
+ _VD.axpy (x, m_A[(size_t)i], b, z);
}
commentator().stop ("done");
@@ -290,7 +289,7 @@ namespace LinBox
{
commentator().start ("Solving singular system (Wiedemann)", "WiedemannSolver::solveSingular");
- Vector Ax;
+ Vector Ax(A.field());
ReturnStatus status = OK, sfrs = OK;
@@ -299,10 +298,9 @@ namespace LinBox
{
commentator().start ("Constructing butterfly preconditioner");
- CekstvSwitchFactory<Field> factory (_randiter);
- typedef Butterfly<Field, CekstvSwitch<Field> > ButterflyP;
- ButterflyP P(_field, A.rowdim (), factory);
- ButterflyP Q(_field, A.coldim (), factory);
+ typedef Butterfly<Field> ButterflyP;
+ ButterflyP P(field(), A.rowdim ());
+ ButterflyP Q(field(), A.coldim ());
Compose< Blackbox, ButterflyP > AQ(&A, &Q);
Compose< ButterflyP, Compose< Blackbox, ButterflyP > > PAQ(&P, &AQ);
@@ -430,9 +428,9 @@ namespace LinBox
commentator().start ("Solving singular system with generic rank profile (Wiedemann)",
"WiedemannSolver::findRandomSolution");
- Vector v, Avpb, PAvpb, bp, xp, Qinvx;
+ Vector v(A.field()), Avpb(A.field()), PAvpb(A.field()), bp(A.field()), xp(A.field()), Qinvx(A.field());
- RandomDenseStream<Field, Vector> stream (_field, _randiter, A.coldim ());
+ RandomDenseStream<Field, Vector> stream (field(), _randiter, A.coldim ());
VectorWrapper::ensureDim (v, A.coldim ());
VectorWrapper::ensureDim (Avpb, A.rowdim ());
@@ -498,9 +496,9 @@ namespace LinBox
{
commentator().start ("Finding a nullspace element (Wiedemann)", "WiedemannSolver::findNullspaceElement");
- Vector v, Av, PAv, vp, xp, Qinvx;
+ Vector v(A.field()), Av(A.field()), PAv(A.field()), vp(A.field()), xp(A.field()), Qinvx(A.field());
- RandomDenseStream<Field, Vector> stream (_field, _randiter, A.coldim ());
+ RandomDenseStream<Field, Vector> stream (field(), _randiter, A.coldim ());
unsigned long r = (A.coldim () < A.rowdim ()) ? A.coldim () : A.rowdim ();
@@ -560,7 +558,7 @@ namespace LinBox
commentator().start ("Obtaining certificate of inconsistency (Wiedemann)",
"WiedemannSolver::certifyInconsistency");
- Vector PTinvu;
+ // Vector PTinvu(A.field());
typename Field::Element uTb;
WiedemannTraits cert_traits;
@@ -572,14 +570,14 @@ namespace LinBox
cert_traits.singular (WiedemannTraits::SINGULAR);
cert_traits.maxTries (1);
- WiedemannSolver solver (_field, cert_traits, _randiter);
+ WiedemannSolver solver (field(), cert_traits, _randiter);
Transpose<Blackbox> AT (&A);
solver.findNullspaceElement (u, AT);
_VD.dot (uTb, u, b);
- if (!_field.isZero (uTb))
+ if (!field().isZero (uTb))
ret = true;
commentator().stop (MSG_STATUS (ret), NULL, "WiedemannSolver::certifyInconsistency");
@@ -594,17 +592,17 @@ namespace LinBox
const double LAMBDA = 3;
integer card;
- _field.cardinality (card);
+ field().cardinality (card);
double init_p = 1.0 - 1.0 / (double) card;
double log_m = LAMBDA * log ((double) m) / M_LN2;
- double new_p;
- SparseMatrix<Field> *P = new SparseMatrix<Field> (_field, m, m);
+ SparseMatrix<Field> *P = new SparseMatrix<Field> (field(), m, m);
- RandomSparseStream<Field> stream (_field, _randiter, init_p, m, m);
+ RandomSparseStream<Field,typename SparseMatrix<Field>::Row> stream (field(), _randiter, init_p, m, m);
for (unsigned int i = 0; i < m; ++i) {
+ double new_p;
new_p = log_m / double(m - i + 1);
if (init_p < new_p)
@@ -623,11 +621,10 @@ namespace LinBox
#endif // __LINBOX_wiedemann_INL
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
// Local Variables:
// mode: C++
// tab-width: 8
// indent-tabs-mode: nil
// c-basic-offset: 8
// End:
-
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/blackbox/Makefile.am b/linbox/blackbox/Makefile.am
index f267eb8..df287e8 100644
--- a/linbox/blackbox/Makefile.am
+++ b/linbox/blackbox/Makefile.am
@@ -23,20 +23,22 @@ pkgincludesubdir=$(pkgincludedir)/blackbox
BASIC_HDRS = \
archetype.h \
+ blackbox.h \
+ bb.h \
factory.h \
butterfly.h \
+ butterfly.inl \
hilbert.h \
compose.h \
permutation.h \
squarize.h \
- sparse1.h \
- sparse.h \
- sparse.inl \
scalar-matrix.h \
submatrix.h \
inverse.h \
transpose.h \
sum.h \
+ csf.h \
+ csf.inl \
diagonal.h \
diagonal-gf2.h \
moore-penrose.h \
@@ -48,10 +50,11 @@ BASIC_HDRS = \
frobenius.h \
zero-one.h \
zero-one.inl \
- zo.h zo.inl \
- zo-gf2.h zo-gf2.inl \
+ zo.h \
+ zo.inl \
+ zo-gf2.h \
+ zo-gf2.inl \
quad-matrix.h \
- triplesbb.h \
apply.h \
submatrix-traits.h \
random-matrix-traits.h \
@@ -64,37 +67,29 @@ BASIC_HDRS = \
block-toeplitz.h \
block-hankel-inverse.h \
jit-matrix.h \
- rational-matrix-factory.h
+ toeplitz.h \
+ toeplitz.inl \
+ rational-matrix-factory.h\
+ fibb.h \
+ pascal.h
NTL_HDRS = \
- toeplitz.h ntl-hankel.h ntl-sylvester.h \
- toeplitz.inl ntl-hankel.inl ntl-sylvester.inl
+ ntl-hankel.h \
+ ntl-hankel.inl \
+ ntl-sylvester.h \
+ ntl-sylvester.inl
-GIVARO_HDRS =
-
-LIDIA_HDRS =
if LINBOX_HAVE_NTL
USE_NTL_HDRS = $(NTL_HDRS)
endif
-if LINBOX_HAVE_GIVARO
-USE_GIVARO_HDRS = $(GIVARO_HDRS)
-endif
-
-if LINBOX_HAVE_LIDIA
-USE_LIDIA_HDRS = $(LIDIA_HDRS)
-endif
pkgincludesub_HEADERS = \
$(BASIC_HDRS) \
- $(USE_NTL_HDRS) \
- $(USE_GIVARO_HDRS) \
- $(USE_LIDIA_HDRS)
+ $(USE_NTL_HDRS)
EXTRA_DIST = \
$(NTL_HDRS) \
- $(GIVARO_HDRS) \
- $(LIDIA_HDRS) \
blackbox.doxy
diff --git a/linbox/blackbox/Makefile.in b/linbox/blackbox/Makefile.in
deleted file mode 100644
index c60bb8f..0000000
--- a/linbox/blackbox/Makefile.in
+++ /dev/null
@@ -1,650 +0,0 @@
-# Makefile.in generated by automake 1.11.5 from Makefile.am.
-# @configure_input@
-
-# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software
-# Foundation, Inc.
-# This Makefile.in is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
-# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
-# PARTICULAR PURPOSE.
-
- at SET_MAKE@
-
-# Copyright (c) 2010 the LinBox group
-# ========LICENCE========
-# This file is part of the library LinBox.
-#
-# LinBox is free software: you can redistribute it and/or modify
-# it under the terms of the GNU Lesser General Public
-# License as published by the Free Software Foundation; either
-# version 2.1 of the License, or (at your option) any later version.
-#
-# This library 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
-# Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public
-# License along with this library; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
-# ========LICENCE========
-
-VPATH = @srcdir@
-am__make_dryrun = \
- { \
- am__dry=no; \
- case $$MAKEFLAGS in \
- *\\[\ \ ]*) \
- echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \
- | grep '^AM OK$$' >/dev/null || am__dry=yes;; \
- *) \
- for am__flg in $$MAKEFLAGS; do \
- case $$am__flg in \
- *=*|--*) ;; \
- *n*) am__dry=yes; break;; \
- esac; \
- done;; \
- esac; \
- test $$am__dry = yes; \
- }
-pkgdatadir = $(datadir)/@PACKAGE@
-pkgincludedir = $(includedir)/@PACKAGE@
-pkglibdir = $(libdir)/@PACKAGE@
-pkglibexecdir = $(libexecdir)/@PACKAGE@
-am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
-install_sh_DATA = $(install_sh) -c -m 644
-install_sh_PROGRAM = $(install_sh) -c
-install_sh_SCRIPT = $(install_sh) -c
-INSTALL_HEADER = $(INSTALL_DATA)
-transform = $(program_transform_name)
-NORMAL_INSTALL = :
-PRE_INSTALL = :
-POST_INSTALL = :
-NORMAL_UNINSTALL = :
-PRE_UNINSTALL = :
-POST_UNINSTALL = :
-build_triplet = @build@
-host_triplet = @host@
-subdir = linbox/blackbox
-DIST_COMMON = $(am__pkgincludesub_HEADERS_DIST) $(srcdir)/Makefile.am \
- $(srcdir)/Makefile.in
-ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-am__aclocal_m4_deps = $(top_srcdir)/macros/aclocal-include.m4 \
- $(top_srcdir)/macros/config-header.m4 \
- $(top_srcdir)/macros/debug.m4 \
- $(top_srcdir)/macros/expat-check.m4 \
- $(top_srcdir)/macros/fflas-ffpack-check.m4 \
- $(top_srcdir)/macros/fplll-check.m4 \
- $(top_srcdir)/macros/givaro-check.m4 \
- $(top_srcdir)/macros/gmp-check.m4 \
- $(top_srcdir)/macros/iml-check.m4 \
- $(top_srcdir)/macros/lapack-check.m4 \
- $(top_srcdir)/macros/libtool.m4 \
- $(top_srcdir)/macros/lidia-check.m4 \
- $(top_srcdir)/macros/linbox-benchmark.m4 \
- $(top_srcdir)/macros/linbox-doc.m4 \
- $(top_srcdir)/macros/linbox-misc.m4 \
- $(top_srcdir)/macros/linbox-opt.m4 \
- $(top_srcdir)/macros/ltoptions.m4 \
- $(top_srcdir)/macros/ltsugar.m4 \
- $(top_srcdir)/macros/ltversion.m4 \
- $(top_srcdir)/macros/lt~obsolete.m4 \
- $(top_srcdir)/macros/m4ri-check.m4 \
- $(top_srcdir)/macros/m4rie-check.m4 \
- $(top_srcdir)/macros/maple-check.m4 \
- $(top_srcdir)/macros/mpfr-check.m4 \
- $(top_srcdir)/macros/ntl-check.m4 \
- $(top_srcdir)/macros/saclib-check.m4 \
- $(top_srcdir)/macros/sage-check.m4 $(top_srcdir)/configure.ac
-am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
- $(ACLOCAL_M4)
-mkinstalldirs = $(install_sh) -d
-CONFIG_HEADER = $(top_builddir)/config.h
-CONFIG_CLEAN_FILES =
-CONFIG_CLEAN_VPATH_FILES =
-depcomp =
-am__depfiles_maybe =
-SOURCES =
-DIST_SOURCES =
-am__can_run_installinfo = \
- case $$AM_UPDATE_INFO_DIR in \
- n|no|NO) false;; \
- *) (install-info --version) >/dev/null 2>&1;; \
- esac
-am__pkgincludesub_HEADERS_DIST = archetype.h factory.h butterfly.h \
- hilbert.h compose.h permutation.h squarize.h sparse1.h \
- sparse.h sparse.inl scalar-matrix.h submatrix.h inverse.h \
- transpose.h sum.h diagonal.h diagonal-gf2.h moore-penrose.h \
- direct-sum.h null-matrix.h matrix-blackbox.h dif.h companion.h \
- frobenius.h zero-one.h zero-one.inl zo.h zo.inl zo-gf2.h \
- zo-gf2.inl quad-matrix.h triplesbb.h apply.h \
- submatrix-traits.h random-matrix-traits.h scompose.h \
- blackbox-interface.h random-matrix.h lambda-sparse.h \
- polynomial.h block-hankel.h block-toeplitz.h \
- block-hankel-inverse.h jit-matrix.h rational-matrix-factory.h \
- toeplitz.h ntl-hankel.h ntl-sylvester.h toeplitz.inl \
- ntl-hankel.inl ntl-sylvester.inl
-am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
-am__vpath_adj = case $$p in \
- $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
- *) f=$$p;; \
- esac;
-am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
-am__install_max = 40
-am__nobase_strip_setup = \
- srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
-am__nobase_strip = \
- for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
-am__nobase_list = $(am__nobase_strip_setup); \
- for p in $$list; do echo "$$p $$p"; done | \
- sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
- $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
- if (++n[$$2] == $(am__install_max)) \
- { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
- END { for (dir in files) print dir, files[dir] }'
-am__base_list = \
- sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
- sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
-am__uninstall_files_from_dir = { \
- test -z "$$files" \
- || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \
- || { echo " ( cd '$$dir' && rm -f" $$files ")"; \
- $(am__cd) "$$dir" && rm -f $$files; }; \
- }
-am__installdirs = "$(DESTDIR)$(pkgincludesubdir)"
-HEADERS = $(pkgincludesub_HEADERS)
-ETAGS = etags
-CTAGS = ctags
-DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
-ACLOCAL = @ACLOCAL@
-AMTAR = @AMTAR@
-AR = @AR@
-AUTOCONF = @AUTOCONF@
-AUTOHEADER = @AUTOHEADER@
-AUTOMAKE = @AUTOMAKE@
-AWK = @AWK@
-BLAS_CFLAGS = @BLAS_CFLAGS@
-BLAS_LIBS = @BLAS_LIBS@
-CC = @CC@
-CCNAM = @CCNAM@
-CFLAGS = @CFLAGS@
-CPPFLAGS = @CPPFLAGS@
-CXX = @CXX@
-CXXCPP = @CXXCPP@
-CXXFLAGS = @CXXFLAGS@
-CYGPATH_W = @CYGPATH_W@
-DBG = @DBG@
-DEBUG_CFLAGS = @DEBUG_CFLAGS@
-DEFAULT_CFLAGS = @DEFAULT_CFLAGS@
-DEFS = @DEFS@
-DLLTOOL = @DLLTOOL@
-DSYMUTIL = @DSYMUTIL@
-DUMPBIN = @DUMPBIN@
-ECHO_C = @ECHO_C@
-ECHO_N = @ECHO_N@
-ECHO_T = @ECHO_T@
-EGREP = @EGREP@
-EXEEXT = @EXEEXT@
-EXPAT_CFLAGS = @EXPAT_CFLAGS@
-EXPAT_LIBS = @EXPAT_LIBS@
-FFLAS_FFPACK_CFLAGS = @FFLAS_FFPACK_CFLAGS@
-FFLAS_FFPACK_LIBS = @FFLAS_FFPACK_LIBS@
-FFLAS_FFPACK_LOC = @FFLAS_FFPACK_LOC@
-FGREP = @FGREP@
-FPLLL_CFLAGS = @FPLLL_CFLAGS@
-FPLLL_LIBS = @FPLLL_LIBS@
-GIVARO_CFLAGS = @GIVARO_CFLAGS@
-GIVARO_LIBS = @GIVARO_LIBS@
-GMP_CFLAGS = @GMP_CFLAGS@
-GMP_LIBS = @GMP_LIBS@
-GMP_VERSION = @GMP_VERSION@
-GREP = @GREP@
-IML_CFLAGS = @IML_CFLAGS@
-IML_LIBS = @IML_LIBS@
-INSTALL = @INSTALL@
-INSTALL_DATA = @INSTALL_DATA@
-INSTALL_PROGRAM = @INSTALL_PROGRAM@
-INSTALL_SCRIPT = @INSTALL_SCRIPT@
-INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
-LD = @LD@
-LDFLAGS = @LDFLAGS@
-LIBOBJS = @LIBOBJS@
-LIBS = @LIBS@
-LIBTOOL = @LIBTOOL@
-LIDIA_CFLAGS = @LIDIA_CFLAGS@
-LIDIA_LIBS = @LIDIA_LIBS@
-LINBOX_BENCH_PATH = @LINBOX_BENCH_PATH@
-LINBOX_DOC_PATH = @LINBOX_DOC_PATH@
-LIPO = @LIPO@
-LN_S = @LN_S@
-LTLIBOBJS = @LTLIBOBJS@
-M4RIE_CFLAGS = @M4RIE_CFLAGS@
-M4RIE_LIBS = @M4RIE_LIBS@
-M4RI_CFLAGS = @M4RI_CFLAGS@
-M4RI_LIBS = @M4RI_LIBS@
-MAINT = @MAINT@
-MAKEINFO = @MAKEINFO@
-MANIFEST_TOOL = @MANIFEST_TOOL@
-MAPLE_CFLAGS = @MAPLE_CFLAGS@
-MAPLE_HOME = @MAPLE_HOME@
-MAPLE_LIBS = @MAPLE_LIBS@
-MAPLE_VERSION = @MAPLE_VERSION@
-MKDIR_P = @MKDIR_P@
-MPFR_CFLAGS = @MPFR_CFLAGS@
-MPFR_LIBS = @MPFR_LIBS@
-NM = @NM@
-NMEDIT = @NMEDIT@
-NTL_CFLAGS = @NTL_CFLAGS@
-NTL_LIBS = @NTL_LIBS@
-OBJDUMP = @OBJDUMP@
-OBJEXT = @OBJEXT@
-OTOOL = @OTOOL@
-OTOOL64 = @OTOOL64@
-PACKAGE = @PACKAGE@
-PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
-PACKAGE_NAME = @PACKAGE_NAME@
-PACKAGE_STRING = @PACKAGE_STRING@
-PACKAGE_TARNAME = @PACKAGE_TARNAME@
-PACKAGE_URL = @PACKAGE_URL@
-PACKAGE_VERSION = @PACKAGE_VERSION@
-PATH_SEPARATOR = @PATH_SEPARATOR@
-PROF = @PROF@
-RANLIB = @RANLIB@
-RM = @RM@
-SACLIB_CFLAGS = @SACLIB_CFLAGS@
-SACLIB_LIBS = @SACLIB_LIBS@
-SED = @SED@
-SET_MAKE = @SET_MAKE@
-SHELL = @SHELL@
-STRIP = @STRIP@
-TESTS_CFLAGS = @TESTS_CFLAGS@
-VERSION = @VERSION@
-WARN = @WARN@
-abs_builddir = @abs_builddir@
-abs_srcdir = @abs_srcdir@
-abs_top_builddir = @abs_top_builddir@
-abs_top_srcdir = @abs_top_srcdir@
-ac_ct_AR = @ac_ct_AR@
-ac_ct_CC = @ac_ct_CC@
-ac_ct_CXX = @ac_ct_CXX@
-ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
-am__leading_dot = @am__leading_dot@
-am__tar = @am__tar@
-am__untar = @am__untar@
-bindir = @bindir@
-build = @build@
-build_alias = @build_alias@
-build_cpu = @build_cpu@
-build_os = @build_os@
-build_vendor = @build_vendor@
-builddir = @builddir@
-datadir = @datadir@
-datarootdir = @datarootdir@
-docdir = @docdir@
-dvidir = @dvidir@
-exec_prefix = @exec_prefix@
-host = @host@
-host_alias = @host_alias@
-host_cpu = @host_cpu@
-host_os = @host_os@
-host_vendor = @host_vendor@
-htmldir = @htmldir@
-includedir = @includedir@
-infodir = @infodir@
-install_sh = @install_sh@
-libdir = @libdir@
-libexecdir = @libexecdir@
-localedir = @localedir@
-localstatedir = @localstatedir@
-mandir = @mandir@
-mkdir_p = @mkdir_p@
-oldincludedir = @oldincludedir@
-pdfdir = @pdfdir@
-prefix = @prefix@
-program_transform_name = @program_transform_name@
-psdir = @psdir@
-sbindir = @sbindir@
-sharedstatedir = @sharedstatedir@
-srcdir = @srcdir@
-sysconfdir = @sysconfdir@
-target_alias = @target_alias@
-top_build_prefix = @top_build_prefix@
-top_builddir = @top_builddir@
-top_srcdir = @top_srcdir@
-pkgincludesubdir = $(pkgincludedir)/blackbox
-BASIC_HDRS = \
- archetype.h \
- factory.h \
- butterfly.h \
- hilbert.h \
- compose.h \
- permutation.h \
- squarize.h \
- sparse1.h \
- sparse.h \
- sparse.inl \
- scalar-matrix.h \
- submatrix.h \
- inverse.h \
- transpose.h \
- sum.h \
- diagonal.h \
- diagonal-gf2.h \
- moore-penrose.h \
- direct-sum.h \
- null-matrix.h \
- matrix-blackbox.h \
- dif.h \
- companion.h \
- frobenius.h \
- zero-one.h \
- zero-one.inl \
- zo.h zo.inl \
- zo-gf2.h zo-gf2.inl \
- quad-matrix.h \
- triplesbb.h \
- apply.h \
- submatrix-traits.h \
- random-matrix-traits.h \
- scompose.h \
- blackbox-interface.h \
- random-matrix.h \
- lambda-sparse.h \
- polynomial.h \
- block-hankel.h \
- block-toeplitz.h \
- block-hankel-inverse.h \
- jit-matrix.h \
- rational-matrix-factory.h
-
-NTL_HDRS = \
- toeplitz.h ntl-hankel.h ntl-sylvester.h \
- toeplitz.inl ntl-hankel.inl ntl-sylvester.inl
-
-GIVARO_HDRS =
-LIDIA_HDRS =
- at LINBOX_HAVE_NTL_TRUE@USE_NTL_HDRS = $(NTL_HDRS)
- at LINBOX_HAVE_GIVARO_TRUE@USE_GIVARO_HDRS = $(GIVARO_HDRS)
- at LINBOX_HAVE_LIDIA_TRUE@USE_LIDIA_HDRS = $(LIDIA_HDRS)
-pkgincludesub_HEADERS = \
- $(BASIC_HDRS) \
- $(USE_NTL_HDRS) \
- $(USE_GIVARO_HDRS) \
- $(USE_LIDIA_HDRS)
-
-EXTRA_DIST = \
- $(NTL_HDRS) \
- $(GIVARO_HDRS) \
- $(LIDIA_HDRS) \
- blackbox.doxy
-
-all: all-am
-
-.SUFFIXES:
-$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps)
- @for dep in $?; do \
- case '$(am__configure_deps)' in \
- *$$dep*) \
- ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
- && { if test -f $@; then exit 0; else break; fi; }; \
- exit 1;; \
- esac; \
- done; \
- echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu --ignore-deps linbox/blackbox/Makefile'; \
- $(am__cd) $(top_srcdir) && \
- $(AUTOMAKE) --gnu --ignore-deps linbox/blackbox/Makefile
-.PRECIOUS: Makefile
-Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
- @case '$?' in \
- *config.status*) \
- cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
- *) \
- echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
- cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
- esac;
-
-$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
- cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-
-$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
- cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
- cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-$(am__aclocal_m4_deps):
-
-mostlyclean-libtool:
- -rm -f *.lo
-
-clean-libtool:
- -rm -rf .libs _libs
-install-pkgincludesubHEADERS: $(pkgincludesub_HEADERS)
- @$(NORMAL_INSTALL)
- @list='$(pkgincludesub_HEADERS)'; test -n "$(pkgincludesubdir)" || list=; \
- if test -n "$$list"; then \
- echo " $(MKDIR_P) '$(DESTDIR)$(pkgincludesubdir)'"; \
- $(MKDIR_P) "$(DESTDIR)$(pkgincludesubdir)" || exit 1; \
- fi; \
- for p in $$list; do \
- if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
- echo "$$d$$p"; \
- done | $(am__base_list) | \
- while read files; do \
- echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(pkgincludesubdir)'"; \
- $(INSTALL_HEADER) $$files "$(DESTDIR)$(pkgincludesubdir)" || exit $$?; \
- done
-
-uninstall-pkgincludesubHEADERS:
- @$(NORMAL_UNINSTALL)
- @list='$(pkgincludesub_HEADERS)'; test -n "$(pkgincludesubdir)" || list=; \
- files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
- dir='$(DESTDIR)$(pkgincludesubdir)'; $(am__uninstall_files_from_dir)
-
-ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
- list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
- unique=`for i in $$list; do \
- if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
- done | \
- $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
- END { if (nonempty) { for (i in files) print i; }; }'`; \
- mkid -fID $$unique
-tags: TAGS
-
-TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
- $(TAGS_FILES) $(LISP)
- set x; \
- here=`pwd`; \
- list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
- unique=`for i in $$list; do \
- if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
- done | \
- $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
- END { if (nonempty) { for (i in files) print i; }; }'`; \
- shift; \
- if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
- test -n "$$unique" || unique=$$empty_fix; \
- if test $$# -gt 0; then \
- $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
- "$$@" $$unique; \
- else \
- $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
- $$unique; \
- fi; \
- fi
-ctags: CTAGS
-CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
- $(TAGS_FILES) $(LISP)
- list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
- unique=`for i in $$list; do \
- if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
- done | \
- $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
- END { if (nonempty) { for (i in files) print i; }; }'`; \
- test -z "$(CTAGS_ARGS)$$unique" \
- || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
- $$unique
-
-GTAGS:
- here=`$(am__cd) $(top_builddir) && pwd` \
- && $(am__cd) $(top_srcdir) \
- && gtags -i $(GTAGS_ARGS) "$$here"
-
-distclean-tags:
- -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
-
-distdir: $(DISTFILES)
- @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
- topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
- list='$(DISTFILES)'; \
- dist_files=`for file in $$list; do echo $$file; done | \
- sed -e "s|^$$srcdirstrip/||;t" \
- -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
- case $$dist_files in \
- */*) $(MKDIR_P) `echo "$$dist_files" | \
- sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
- sort -u` ;; \
- esac; \
- for file in $$dist_files; do \
- if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
- if test -d $$d/$$file; then \
- dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
- if test -d "$(distdir)/$$file"; then \
- find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
- fi; \
- if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
- cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
- find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
- fi; \
- cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
- else \
- test -f "$(distdir)/$$file" \
- || cp -p $$d/$$file "$(distdir)/$$file" \
- || exit 1; \
- fi; \
- done
-check-am: all-am
-check: check-am
-all-am: Makefile $(HEADERS)
-installdirs:
- for dir in "$(DESTDIR)$(pkgincludesubdir)"; do \
- test -z "$$dir" || $(MKDIR_P) "$$dir"; \
- done
-install: install-am
-install-exec: install-exec-am
-install-data: install-data-am
-uninstall: uninstall-am
-
-install-am: all-am
- @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
-
-installcheck: installcheck-am
-install-strip:
- if test -z '$(STRIP)'; then \
- $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
- install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
- install; \
- else \
- $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
- install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
- "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
- fi
-mostlyclean-generic:
-
-clean-generic:
-
-distclean-generic:
- -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
- -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
-
-maintainer-clean-generic:
- @echo "This command is intended for maintainers to use"
- @echo "it deletes files that may require special tools to rebuild."
-clean: clean-am
-
-clean-am: clean-generic clean-libtool mostlyclean-am
-
-distclean: distclean-am
- -rm -f Makefile
-distclean-am: clean-am distclean-generic distclean-tags
-
-dvi: dvi-am
-
-dvi-am:
-
-html: html-am
-
-html-am:
-
-info: info-am
-
-info-am:
-
-install-data-am: install-pkgincludesubHEADERS
-
-install-dvi: install-dvi-am
-
-install-dvi-am:
-
-install-exec-am:
-
-install-html: install-html-am
-
-install-html-am:
-
-install-info: install-info-am
-
-install-info-am:
-
-install-man:
-
-install-pdf: install-pdf-am
-
-install-pdf-am:
-
-install-ps: install-ps-am
-
-install-ps-am:
-
-installcheck-am:
-
-maintainer-clean: maintainer-clean-am
- -rm -f Makefile
-maintainer-clean-am: distclean-am maintainer-clean-generic
-
-mostlyclean: mostlyclean-am
-
-mostlyclean-am: mostlyclean-generic mostlyclean-libtool
-
-pdf: pdf-am
-
-pdf-am:
-
-ps: ps-am
-
-ps-am:
-
-uninstall-am: uninstall-pkgincludesubHEADERS
-
-.MAKE: install-am install-strip
-
-.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \
- clean-libtool ctags distclean distclean-generic \
- distclean-libtool distclean-tags distdir dvi dvi-am html \
- html-am info info-am install install-am install-data \
- install-data-am install-dvi install-dvi-am install-exec \
- install-exec-am install-html install-html-am install-info \
- install-info-am install-man install-pdf install-pdf-am \
- install-pkgincludesubHEADERS install-ps install-ps-am \
- install-strip installcheck installcheck-am installdirs \
- maintainer-clean maintainer-clean-generic mostlyclean \
- mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
- tags uninstall uninstall-am uninstall-pkgincludesubHEADERS
-
-
-# Tell versions [3.59,3.63) of GNU make to not export all variables.
-# Otherwise a system limit (for SysV at least) may be exceeded.
-.NOEXPORT:
diff --git a/linbox/blackbox/apply.h b/linbox/blackbox/apply.h
index b133b0a..42cc7ce 100644
--- a/linbox/blackbox/apply.h
+++ b/linbox/blackbox/apply.h
@@ -32,6 +32,7 @@
#define __LINBOX_apply_H
#include "linbox/linbox-config.h"
+#include "givaro-config.h"
#include "linbox/integer.h"
#include "linbox/util/debug.h"
// #if defined(__LINBOX_field_multimod_field_H) && !defined(__LINBOX_blas_matrix_domain_H)
@@ -40,10 +41,11 @@
#include "linbox/field/multimod-field.h"
#include "linbox/field/hom.h"
#include "linbox/randiter/multimod-randomprime.h"
-#include "linbox/blackbox/sparse.h"
-#include "linbox/matrix/blas-matrix.h"
+#include "linbox/matrix/sparse-matrix.h"
+#include "linbox/matrix/dense-matrix.h"
#include "linbox/algorithms/lifting-container.h"
#include <vector>
+#include "linbox/vector/blas-vector.h"
#include "linbox/util/timer.h"
@@ -84,32 +86,30 @@ namespace LinBox
class BlasApply {
public:
- typedef typename Domain::Element Element;
- typedef std::vector<Element> Vector;
+ typedef typename Domain::Element Element;
+ typedef BlasVector<Domain> Vector;
BlasApply(const Domain& D) :
_domain(D), _MD(D)
{
_domain.characteristic(_prime);
- _domain.init(_one,1UL);
- _domain.init(_zero,0UL);
}
//#ifdef __LINBOX_BLAS_AVAILABLE
- inline Vector& applyV(Vector &y,
+ inline Vector& applyV(Vector &y,
const BlasMatrix<Domain> &A,
- const Vector &x) const
+ const Vector &x) const
{
if (( _prime > 0) && ( _prime < 67108863)) {
- FFLAS::fgemv((typename Domain::Father_t) _domain, FFLAS::FflasNoTrans,
+ FFLAS::fgemv(_domain, FFLAS::FflasNoTrans,
A.rowdim(), A.coldim(),
- _one,
+ _domain.one,
A.getPointer(), A.getStride(),
&x[0],1,
- _zero,
+ _domain.zero,
&y[0],1);
}
else {
@@ -118,19 +118,19 @@ namespace LinBox
return y;
}
- inline Vector& applyVTrans(Vector &y,
+ inline Vector& applyVTrans(Vector &y,
BlasMatrix<Domain> &A,
- const Vector &x) const
+ const Vector &x) const
{
if (( _prime > 0) && ( _prime < 67108863)) {
- FFLAS::fgemv((typename Domain::Father_t) _domain, FFLAS::FflasTrans,
+ FFLAS::fgemv(_domain, FFLAS::FflasTrans,
A.rowdim(), A.coldim(),
- _one,
+ _domain.one,
A.getPointer(), A.getStride(),
&x[0],1,
- _zero,
+ _domain.zero,
&y[0],1);
}
else {
@@ -206,8 +206,8 @@ namespace LinBox
(int) maxword,(int) m,(int) n, 1,
xdbl,(int) n, At_dbl, (int) m, 0, ydbl, (int) m);
- delete At_dbl;
- delete xdbl;
+ delete[] At_dbl;
+ delete[] xdbl;
size_t rclen=maxword*4+5;
unsigned char* combined1 = new unsigned char[m*rclen];
@@ -243,9 +243,9 @@ namespace LinBox
else
result = 0;
- importWords(tmp2, (size_t)rclen, -1, 1, 0, 0, combined1+i*rclen);
+ Givaro::Protected::importWords(tmp2, (size_t)rclen, -1, 1, 0, 0, combined1+i*rclen);
result += tmp2;
- importWords(tmp2, (size_t)rclen, -1, 1, 0, 0, combined2+i*rclen);
+ Givaro::Protected::importWords(tmp2, (size_t)rclen, -1, 1, 0, 0, combined2+i*rclen);
result += tmp2;
_domain.init(y[i], result);
@@ -259,10 +259,9 @@ namespace LinBox
private:
- Domain _domain;
- integer _prime;
- Element _one,_zero;
- MatrixDomain<Domain> _MD;
+ Domain _domain;
+ integer _prime;
+ MatrixDomain<Domain> _MD;
};
@@ -272,8 +271,8 @@ namespace LinBox
class MatrixApplyDomain {
public:
- typedef typename Domain::Element Element;
- typedef std::vector<Element> Vector;
+ typedef typename Domain::Element Element;
+ typedef BlasVector<Domain> Vector;
MatrixApplyDomain(const Domain& D, const IMatrix &Mat) :
_domain(D), _matM(Mat)
@@ -322,13 +321,16 @@ namespace LinBox
enum ApplyChoice {Classic, MatrixQadic, VectorQadic, CRT};
public:
- typedef typename Domain::Element Element;
- typedef std::vector<Element> Vector;
- typedef IMatrix Matrix;
+ typedef typename Domain::Element Element;
+ typedef BlasVector<Domain> Vector;
+ typedef IMatrix Matrix;
BlasMatrixApplyDomain(const Domain& D, const IMatrix &Mat) :
_domain(D), _matM(Mat), _MD(D), _m(Mat.rowdim()), _n(Mat.coldim())
+ ,use_chunks(false),use_neg(false),chunk_size(0)
+ ,num_chunks(0)
+ ,chunks(NULL),vchunks(NULL)
{
_switcher= Classic;_rns=NULL;
}
@@ -378,7 +380,7 @@ namespace LinBox
// Check Qadic matrix reprentation possibility
LinBox::integer maxChunkVal = 1;
maxChunkVal <<= 53;
- maxChunkVal /= (prime-1) * _n;
+ maxChunkVal /= (prime-1) * uint64_t(_n);
chunk_size = maxChunkVal.bitsize();
use_chunks = (chunk_size >= 16);
//std::cout<<"max bit= "<<maxBitSize<<" "<<maxValue.size_in_base(4)*2<<"\n";std::cout<<"max value= "<<maxValue<<"\n";
@@ -390,7 +392,7 @@ namespace LinBox
// Check Qadic vector representation possibility
maxChunkVal = 1;
maxChunkVal <<= 53;
- maxChunkVal /= 2*maxValue * _n;
+ maxChunkVal /= 2*maxValue * uint64_t(_n);
chunk_size = maxChunkVal.bitsize();
use_chunks = (chunk_size >= 16);
@@ -486,10 +488,10 @@ namespace LinBox
case CRT:
if (use_neg){
maxValue= maxValue<<1;
- maxBitSize+=1;
+ // maxBitSize+=1;
}
- integer a_bound= maxValue*_n+1;
- integer b_bound= sqrt(integer("9007199254740992")/_n); std::cout<<"max prime: "<<b_bound<<" max rns: "<<a_bound<<std::endl;
+ integer a_bound= maxValue*uint64_t(_n)+1;
+ integer b_bound= sqrt(integer("9007199254740992")/uint64_t(_n)); std::cout<<"max prime: "<<b_bound<<" max rns: "<<a_bound<<std::endl;
MultiModRandomPrime mmrp;
std::vector<integer> rns_basis = mmrp.createPrimes(b_bound, a_bound);
_rns = new MultiModDouble(rns_basis);
@@ -505,13 +507,13 @@ namespace LinBox
vchunks = new double[_n*_rns->size()];
// prepare special CRT
- Element g, s, q, zero,one,two;
+ Element g, s, q, two;
_q= _rns->getCRTmodulo();
- _domain.init(q,_q);_domain.init(zero,0UL);_domain.init(one,1UL);_domain.init(two,2UL);
- _domain.xgcd(g, _inv_q, s, q, _prime);
- if (_domain.compare(_inv_q, zero)<0 ) _domain.addin(_inv_q,_prime);
+ _domain.init(q,_q);_domain.init(two,int64_t(2));
+ _domain.gcd(g, _inv_q, s, q, _prime);
+ if (_domain.compare(_inv_q, _domain.zero)<0 ) _domain.addin(_inv_q,_prime);
_domain.mul(_pq,_prime,q);
- _domain.sub(_h_pq,_pq, one);
+ _domain.sub(_h_pq,_pq, _domain.one);
_domain.divin(_h_pq, two);
break;
@@ -585,8 +587,8 @@ namespace LinBox
*/
int rclen = (int)num_chunks*2 + 5;
- unsigned char* combined = new unsigned char[rc*_n*rclen];
- memset(combined, 0, rc*_n*rclen);
+ unsigned char* combined = new unsigned char[(size_t)rc*_n*(size_t)rclen];
+ memset(combined, 0, (size_t)rc*_n*(size_t)rclen);
//order from major index to minor: combining index, component of sol'n, byte
//compute a product (chunk times x) for each chunk
@@ -621,7 +623,7 @@ namespace LinBox
for (size_t j=0; j<_n; j++) {
// up to 53 bits will be ored-in, to be summed later
unsigned char* bitDest = combined;
- bitDest += rclen*((i % rc)*_n+j);
+ bitDest += (size_t)rclen*((i % (size_t)rc)*_n+j);
long long mask = static_cast<long long>(ctd[j]);
bitDest += 2*i;
*(reinterpret_cast<long long*>(bitDest) ) |= mask;
@@ -640,8 +642,8 @@ namespace LinBox
result = 0;
for (int j=0; j<rc; j++) {
- unsigned char* thispos = combined + rclen*(j*_n+i);
- importWords(tmp, (size_t)rclen, -1, 1, 0, 0, thispos);
+ unsigned char* thispos = combined + (size_t)rclen*((size_t)j*_n+i);
+ Givaro::Protected::importWords(tmp, (size_t)rclen, -1, 1, 0, 0, thispos);
result += tmp;
}
_domain.init(y[i], result);
@@ -649,7 +651,7 @@ namespace LinBox
// shift back the result
if (use_neg) {
Element acc;
- _domain.init(acc,0);
+ _domain.assign(acc,_domain.zero);
for (size_t i=0;i<x.size();++i)
_domain.addin(acc,x[i]);
_domain.mulin(acc,shift);
@@ -739,7 +741,7 @@ namespace LinBox
*(reinterpret_cast<long long*>(BitDest) ) |= mask;
BitDest+=rc*chunk_byte;
}
- importWords(val, (size_t)rclen, -1, 1, 0, 0, combined);
+ Givaro::Protected::importWords(val, (size_t)rclen, -1, 1, 0, 0, combined);
result+=val;
}
_domain.init(y[i], result);
@@ -748,7 +750,7 @@ namespace LinBox
// shift back the result
if (use_neg) {
Element acc;
- _domain.init(acc,0);
+ _domain.assign(acc,_domain.zero);
for (size_t i=0;i<x.size();++i)
_domain.addin(acc,x[i]);
_domain.mulin(acc,shift);
@@ -859,10 +861,10 @@ namespace LinBox
Element y_cur, b_cur;
// finish crt according to b
for (size_t i=0;i<_m;++i){
- _domain.rem(b_cur, b[i], _prime);
+ _domain.mod(b_cur, b[i], _prime);
_domain.sub(y_cur, b_cur, y[i]);//std::cout<<"(b-y): "<<y_cur<<std::endl;
_domain.mulin(y_cur, _inv_q);//std::cout<<"((b-y)/q): "<<y_cur<<std::endl;
- _domain.remin(y_cur, _prime);//std::cout<<"((b-y)/q mod p): "<<y_cur<<std::endl;
+ _domain.modin(y_cur, _prime);//std::cout<<"((b-y)/q mod p): "<<y_cur<<std::endl;
_domain.axpyin(y[i],_q, y_cur);//std::cout<<"y+p((b-y)/q mod p): "<<y[i]<<std::endl;
if ( y[i] > _h_pq) y[i]-=_pq;
}
@@ -956,15 +958,15 @@ namespace LinBox
// cout << "rc= " << rc << ", rclen = " << rclen << endl;
- unsigned char* combined = new unsigned char[rc*_m*_k*rclen];
- memset(combined, 0, rc*_m*_k*rclen);
+ unsigned char* combined = new unsigned char[(size_t)rc*_m*_k*(size_t)rclen];
+ memset(combined, 0, (size_t)rc*_m*_k*(size_t)rclen);
//order from major index to minor: combining index, component of sol'n, byte
//compute a product (chunk times x) for each chunk
double* ctd = new double[_m*_k];
- for (size_t i=0; i<num_chunks; i++) {
+ for (size_t i=0; i<num_chunks; i++) {//!@bug why not use FFLAS ?
cblas_dgemm(CblasRowMajor, CblasNoTrans, CblasNoTrans,
(int) _m,(int) _k,(int) _n, 1,
chunks+(_m*_n*i),(int) _n, dX, (int) _k, 0, ctd, (int) _k);
@@ -973,7 +975,7 @@ namespace LinBox
for (size_t j=0; j<_m*_k; j++) {
// up to 53 bits will be ored-in, to be summed later
unsigned char* bitDest = combined;
- bitDest += rclen*((i % rc)*_m*_k+j);
+ bitDest += (unsigned char)rclen*((i % (size_t)rc)*_m*_k+j);
long long mask = static_cast<long long>(ctd[j]);
bitDest += 2*i;
*(reinterpret_cast<long long*>(bitDest) ) |= mask;
@@ -995,8 +997,8 @@ namespace LinBox
result = 0;
for (int j=0; j<rc; j++) {
- unsigned char* thispos = combined + rclen*(j*_m*_k+i);
- importWords(tmp, (size_t)rclen, -1, 1, 0, 0, thispos);
+ unsigned char* thispos = combined + (unsigned char) rclen*((size_t)j*_m*_k+i);
+ Givaro::Protected::importWords(tmp, (size_t)rclen, -1, 1, 0, 0, thispos);
result += tmp;
#ifdef DEBUG_CHUNK_APPLYM
cout << "rc[" << j << "," << i << "]:" << tmp << endl;
@@ -1091,14 +1093,14 @@ namespace LinBox
n = Mat.coldim();
mn = m*n;
- size_t tmpsize, tmpbitsize, j;
if (num_chunks ==1)
for (size_t i=0; i<mn; ++i, ++it)
D.convert(*(chunks+i), *it);
- else
+ else {
for (size_t i=0; i<mn; ++i, ++it) {
+ size_t tmpsize, tmpbitsize, j;
integer tmp;
double* pdbl = chunks + i;
D.convert(tmp, *it);
@@ -1218,6 +1220,7 @@ namespace LinBox
#endif
}
}
+ }
}
/** \brief split an integer vector into a padic chunk representation
@@ -1236,13 +1239,13 @@ namespace LinBox
size_t mn;
mn = V.size();
- size_t tmpsize, tmpbitsize, j;
if (num_chunks ==1)
for (size_t i=0; i<mn; ++i, ++it)
D.convert(*(chunks+i), *it);
- else
+ else {
for (size_t i=0; i<mn; ++i, ++it) {
+ size_t tmpsize, tmpbitsize, j;
integer tmp;
double* pdbl = chunks + i*num_chunks;
D.convert(tmp, *it);
@@ -1356,6 +1359,7 @@ namespace LinBox
#endif
}
}
+ }
}
@@ -1375,18 +1379,18 @@ namespace LinBox
size_t mn;
mn = V.size();
- size_t tmpsize, tmpbitsize, j;
if (num_chunks ==1)
for (size_t i=0; i<mn; ++i, ++it)
D.convert(*(chunks+i), *it);
- else
+ else {
for (size_t i=0; i<mn; ++i, ++it) {
+ size_t tmpsize, /*tmpbitsize,*/ j;
integer tmp;
double* pdbl = chunks + i*num_chunks;
D.convert(tmp, *it);
tmpsize = tmp.size();
- tmpbitsize = tmp.bitsize();
+ //tmpbitsize = tmp.bitsize();
if (tmp ==0)
*pdbl=0;
@@ -1396,6 +1400,7 @@ namespace LinBox
#if __LINBOX_SIZEOF_LONG == 8
// specialization for 64bits integer limbs
+ size_t tmpbitsize = tmp.bitsize();
for (j=0; j<tmpsize-1; j++) {
*pdbl = double(tmp[j] & 0xFFFFFFFF);
*(pdbl+1) = double(tmp[j] >> 32);
@@ -1417,6 +1422,7 @@ namespace LinBox
++tmp;
#if __LINBOX_SIZEOF_LONG == 8
// specialization for 64bits integer limbs
+ size_t tmpbitsize = tmp.bitsize();
for (j=0; j<tmpsize; j++) {
*pdbl = double(0xFFFFFFFF ^ ( tmp[j] & 0xFFFFFFFF));
*(pdbl+2) = double(0xFFFFFFFF ^ ( tmp[j] >> 32));
@@ -1454,6 +1460,7 @@ namespace LinBox
}
}
+ }
}
@@ -1504,11 +1511,10 @@ namespace LinBox
#endif // __LINBOX_apply_H
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
// Local Variables:
// mode: C++
// tab-width: 8
// indent-tabs-mode: nil
// c-basic-offset: 8
// End:
-
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/blackbox/bb.h b/linbox/blackbox/bb.h
new file mode 100644
index 0000000..cc898cb
--- /dev/null
+++ b/linbox/blackbox/bb.h
@@ -0,0 +1,85 @@
+#ifndef LB_BB_H
+#define LB_BB_H
+/* linbox/blackbox/bb.h
+ * Copyright (C) 2015 bds for LinBox Team. See linbox/COPYING.LESSER for License info.
+ *
+ * Written by bds
+ *
+ * Blackbox base class for support of separate compilation
+ */
+
+/* blackbox base class
+ *
+ * Algorithms may take BB<Field> parameters and be separately compiled.
+ *
+ * Non-template functions of BB are pure virtual. Code bloat is avoided.
+ * Template functions may be called by select on the BBType tag. This
+ * introduces some code bloat.
+ */
+#include <iostream>
+#include "linbox/util/error.h"
+#include "linbox/matrix/dense-matrix.h"
+#include "linbox/matrix/matrix-domain.h"
+namespace LinBox {
+
+// for now, only the FIBB tags.
+enum BBType {diagonal, permutation, triangular, product, lqup, pluq, other};
+
+template <class Ring>
+struct BB
+{
+ typedef Ring Field;
+ typedef DenseMatrix<Field> ResizableMatrix;
+ //typedef DenseMatrix<Field, std::vector<typename Ring::Element> > ResizableMatrix;
+ typedef DenseMatrix<Field> Matrix;
+
+ virtual ~BB(){}
+
+ virtual BBType bbTag() const
+ = 0;
+ virtual size_t rowdim() const
+ = 0;
+ virtual size_t coldim() const
+ = 0;
+ virtual const Field& field() const
+ = 0;
+ virtual std::ostream& write(std::ostream& os) const
+ = 0;
+ virtual std::istream& read(std::istream& os)
+ = 0;
+ virtual Matrix& applyLeft(Matrix& Y, const Matrix& X) const
+ = 0;
+ virtual Matrix& applyRight(Matrix& Y, const Matrix& X) const
+ = 0;
+ template<class OutVector, class InVector>
+ OutVector& apply(OutVector& y, const InVector& x) const
+ { switch (bbTag())
+ { //case BBx_tag: static_cast<BBx<Field>*>(this)->apply(y,x); break;
+ //case permutation: static_cast<Permutation<Field>*>(this)->apply(y, x)
+ default: throw LinboxError("indirect call to apply not supported for BBType " /* bbTag*/);
+ }
+ return y;
+ }
+ template<class OutVector, class InVector>
+ OutVector& applyTranspose(OutVector& y, const InVector& x) const
+ { switch (bbTag())
+ { //case BBxtag: static_cast<BBx<Field>*>(this)->applyTranspose(y,x); break;
+ default: throw LinboxError("indirect call to applyTranspose not supported for BBType " /* bbTag*/);
+ }
+ return y;
+ }
+
+ template<typename BB2>
+ void map(BB2& A)
+ { switch (bbTag())
+ { //case bbxtag: static_cast<bbx<Field>*>(this)->map(A); break;
+ // using it's struct rebind;
+ default: throw LinboxError("indirect call to map not supported for BBType " /* bbTag*/);
+ }
+ return A;
+ }
+
+}; // class BB
+
+} // LinBox
+#endif // LB_BB_H
diff --git a/linbox/blackbox/blackbox.doxy b/linbox/blackbox/blackbox.doxy
index bbb13d0..c71eadd 100644
--- a/linbox/blackbox/blackbox.doxy
+++ b/linbox/blackbox/blackbox.doxy
@@ -22,17 +22,17 @@
/** \ingroup linbox
\defgroup blackbox blackbox
- \brief These matrix classes adhere to the simple blackbox interface.
+ \brief These matrix classes meet the simple interface needed for blackbox algorithms.
Blackbox matrix algorithms require of the matrix only it's
- property of being a linear operator. That is, such algorithms exploit only the
- capacity to apply the matrix to a vector (column vector on right or row vector on left).
+ property of being a linear operator. Such algorithms exploit only the
+ capacity to multiply the matrix with a vector or suitably shaped matrix (on right or left).
The advantage is efficient generic methods particularly applicable to sparse and
- structured matrix classes in which matrix vector product is fast. Importantly,
+ structured matrix classes in which matrix-vector product is fast. Importantly,
these methods are also space efficient, typically, for an n by n matrix using only O(n) space
beyond the matrix representation itself.
- These classes all implement the very simple black box
+ These classes all implement the simple black box
interface as it is defined in the
LinBox::BlackboxArchetype base class. Thus blackbox matrix algorithms may be used on
objects of any of these classes. In contrast, classes representing matrices in such
@@ -57,6 +57,17 @@
\link LinBox::BlackboxArchetype BlackboxArchetype \endlink, so that they may be used as parameters to
functions compiled with the blackbox archetype.
+Blackboxes exist in 3 states: bare, shaped, and ready.
+A bare blackbox results from default construction. Only shaping functions may be used on bare blackboxes.
+Shaping functions establish the field of the elements and the row and column dimensions.
+Functions field(), rowdim(), coldim(), and initializing functions may be used on shaped matrices.
+initializing functions include read() and, in some cases, setEntry().
+The ready() function converts to the ready state. For many blackbox classes it is optional, for others it is essential. Mathematical operations are valid on ready blackboxes (apply(), applyTranspose(), matrixHom()).
+
+The mother model is used for the member field of a blackbox. The lifetime of the field must enclose the lifetime of a blackbox based on the field.
+The public field() function of a blackbox returns a "const Field &" and thus may only be called on a shaped blackbox.
+The protected field member is a "const Field *".
+This convention (1) allows bare blackboxes and (2) avoids proliferation of field copies. While most fields are tiny objects, a few have a large amount of data.
*/
// vim:syn=doxygen
diff --git a/linbox/blackbox/blackbox.h b/linbox/blackbox/blackbox.h
new file mode 100644
index 0000000..b93dda4
--- /dev/null
+++ b/linbox/blackbox/blackbox.h
@@ -0,0 +1,69 @@
+/* Copyright (C) 2014 the LinBox group
+ *
+ *
+ * Written by :
+ * Brice Boyer (briceboyer) <boyer.brice at gmail.com>
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ * ========LICENCE========
+ */
+
+/** @file linbox/blackbox/blackbox.h
+ * @brief File including all of LinBox blackboxes.
+ */
+
+
+#ifndef __LINBOX_blackbox_blackbox_H
+#define __LINBOX_blackbox_blackbox_H
+
+#include "linbox/matrix/matrix-traits.h"
+
+#include "linbox/blackbox/compose.h"
+#include "linbox/blackbox/transpose.h"
+#include "linbox/blackbox/lambda-sparse.h"
+// #include "linbox/blackbox/subrowmatrix.h"
+#include "linbox/blackbox/polynomial.h"
+#include "linbox/blackbox/scalar-matrix.h"
+
+namespace LinBox {
+
+ template<class Field, class Row>
+ struct IndexedCategory< LambdaSparseMatrix<Field,Row> > {
+ typedef IndexedTags::HasIndexed Tag;
+ };
+
+
+#if 0
+ template<class Matrix, class MatrixCategory>
+ struct IndexedCategory< SubRowMatrix<Matrix,MatrixCategory> > {
+ typedef IndexedTags::HasIndexed Tag;
+ };
+#endif
+
+} // LinBox
+
+#endif // __LINBOX_blackbox_blackbox_H
+
+
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/blackbox/blackbox_parallel.h b/linbox/blackbox/blackbox_parallel.h
new file mode 100644
index 0000000..8550b1b
--- /dev/null
+++ b/linbox/blackbox/blackbox_parallel.h
@@ -0,0 +1,274 @@
+/* Copyright (C) 2010 LinBox
+ * Author: Zhendong Wan
+ *
+ *
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ * ========LICENCE========
+ */
+
+#ifndef __LINBOX_blackbox_parallel_H
+#define __LINBOX_blackbox_parallel_H
+
+/* parallel apply and apply transpose
+ */
+#include "linbox/vector/subvector.h"
+#include "linbox/vector/vector-domain.h"
+#include "linbox/algorithms/density.h"
+#include "linbox/blackbox/blackbox-interface.h"
+#include "linbox/blackbox/subrowmatrix.h"
+#include "linbox/blackbox/blackbox_thread.h"
+
+#include <typeinfo>
+
+namespace LinBox
+{
+
+ /** \brief This is a matrix representation supporting a parallel matrix vector product
+ */
+ template <class Out, class Matrix, class In>
+ Out& BlackboxParallel(Out& out,const Matrix& m,
+ const In& in, BBBase::BBType type) : public BlackboxInterface
+
+
+ template <class Out, class Matrix, class In>
+ Out& BlackboxParallel(Out& out, const Matrix& cm, const In& in, BBBase::BBType type) : public BlackboxInterface
+ {
+
+ typedef SubRowMatrix<Matrix> SubMatrix;
+
+ typedef typename Out::iterator OutIterator;
+
+ typedef typename In::const_iterator InIterator;
+
+ typename BB_list_list::const_iterator cp;
+
+ const std::type_info * key = & typeid (Out& (*) (Out&, const Matrix&, const In&));
+
+ // search the threads info location
+ cp = cm. sub_list. find (key);
+
+ // allocate threads for this apply function
+ if (cp == cm. sub_list. end()) {
+
+ Matrix& m = const_cast<Matrix&>(cm);
+
+ m. sub_list. insert (std::pair<const std::type_info*,
+ BB_list>
+ (key, BB_list()));
+
+ typename BB_list_list::iterator p;
+
+ p = m. sub_list. find (key);
+
+ cp = p;
+
+ pthread_sigmask (SIG_BLOCK, &(Thread::sigset), 0);
+
+ const In* inaddr = NULL;
+
+ int nnz = 0;
+
+ int aver_load, cur_load;
+
+ typename Matrix::ConstRowIterator row_p;
+
+ for (row_p = m. rowBegin(); row_p != m. rowEnd(); ++ row_p)
+
+ nnz += density(*row_p);
+
+ aver_load = (int)ceil((double)nnz / (double)LINBOX_NTHR);
+
+ cur_load = 0;
+
+ int len = 0;
+
+ int pos = 0;
+
+ SubMatrix* subp;
+
+ Out* outaddr = NULL;
+
+ BBBase* t;
+
+ for (row_p = m. rowBegin(); row_p != m. rowEnd(); ++ row_p) {
+
+ cur_load += density(*row_p);
+
+ ++ len;
+
+ if ((cur_load >= aver_load) || (((size_t)(pos + len) == cm. rowdim()) && (cur_load > 0))) {
+
+ cur_load = 0;
+
+ subp = new SubMatrix(&m, pos, len);
+
+ t = createBBThread(subp, outaddr, inaddr);
+
+ p -> second. push_back (t);
+
+ pos += len;
+
+ len = 0;
+ }
+
+ }
+
+ }
+
+ switch (type) {
+
+ case BBBase::Apply : {
+
+ std::vector<Subvector<OutIterator>*> outv(cp -> second.size());
+
+ typename std::vector<Subvector<OutIterator>*>::iterator outv_p = outv. begin();
+
+ int len = 0;
+
+ int pos = 0;
+
+ BB_list::const_iterator ti_p;
+
+ const In* inaddr = ∈
+
+ BBBase* bp = NULL;
+
+ // give the input for each threads, and signal them
+ for (ti_p = cp -> second. begin(); ti_p != cp -> second. end(); ++ ti_p, ++ outv_p) {
+
+ bp = *(ti_p);
+
+ len = ((const SubMatrix*)bp -> bb_addr) -> rowdim();
+
+ *outv_p = new Subvector<OutIterator>(out. begin() + pos,
+ out. begin() + (pos + len));
+
+ bp -> bb_outaddr = (void*) *outv_p;
+
+ bp -> bb_inaddr = (const void*) inaddr;
+
+ bp -> bb_type = BBBase::Apply;
+
+ Thread::signal_thread (bp);
+
+ pos += len;
+ }
+
+ OutIterator out_p;
+
+ for (out_p = out. begin() + pos; out_p != out. end(); ++ out_p)
+
+ cm. field(). assign(*out_p, cm.field().zero);
+
+ for (ti_p = cp ->second. begin(); ti_p != cp -> second. end(); ++ ti_p)
+
+ Thread::wait_thread (*ti_p);
+
+ for (outv_p = outv. begin(); outv_p != outv. end(); ++ outv_p)
+
+ delete (*outv_p);
+
+ break; }
+
+ case BBBase::ApplyTranspose : {
+
+ int nthr = cp -> second. size ();
+
+ OutIterator out_p;
+
+ for (out_p = out. begin(); out_p != out. end(); ++ out_p)
+
+ cm. field(). assign(*out_p, cm.field().zero);
+
+ std::vector<std::vector<typename Matrix::Field::Element> > out_v(nthr);
+
+ std::vector<Subvector<InIterator>*> in_v(nthr);
+
+ typename std::vector<std::vector<typename Matrix::Field::Element> >::iterator out_v_p;
+
+ typename std::vector<Subvector<InIterator>*>::iterator in_v_p;
+
+ int len = 0;
+
+ int pos = 0;
+
+ BB_list::const_iterator ti_p;
+
+ BBBase* bp = NULL;
+
+ for (ti_p = cp -> second. begin (), in_v_p = in_v. begin(), out_v_p = out_v. begin();
+ ti_p != cp -> second. end();
+ ++ ti_p, ++ in_v_p, ++ out_v_p) {
+
+ bp = *ti_p;
+
+ len = ((const SubMatrix*)bp -> bb_addr) -> rowdim();
+
+ *in_v_p = new Subvector<InIterator>(in. begin() + pos, in. begin() + (pos + len));
+
+ out_v_p -> resize (cm. coldim());
+
+ bp -> bb_outaddr = &(*out_v_p);
+
+ bp -> bb_inaddr = *in_v_p;
+
+ bp -> bb_type = BBBase::ApplyTranspose;
+
+ Thread::signal_thread (bp);
+
+ pos += len;
+ }
+
+ for (ti_p = cp ->second. begin(); ti_p != cp -> second. end(); ++ ti_p)
+
+ Thread::wait_thread (*ti_p);
+
+ VectorDomain<typename Matrix::Field> vd(cm. field());
+
+ for (out_v_p = out_v. begin(), in_v_p = in_v. begin();
+ out_v_p != out_v. end(); ++ out_v_p, ++ in_v_p) {
+
+ vd. addin (out, *out_v_p);
+
+ delete (*in_v_p);
+
+ }
+
+ break; }
+
+ default :
+ break;
+ }
+
+ return out;
+ }
+
+}
+
+#endif //__LINBOX_blackbox_parallel_H
+
+
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+
diff --git a/linbox/blackbox/blackbox_thread.h b/linbox/blackbox/blackbox_thread.h
new file mode 100644
index 0000000..240f778
--- /dev/null
+++ b/linbox/blackbox/blackbox_thread.h
@@ -0,0 +1,405 @@
+/* Copyright (C) 2010 LinBox
+ * Written by
+ * zhendong wan
+ *
+ *
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ * ========LICENCE========
+ */
+
+#ifndef __LINBOX_blackbox_thread_H
+#define __LINBOX_blackbox_thread_H
+
+/* create a thread, which is bound to a lwp to run matrix apply
+*/
+
+#include "linbox/vector/subvector.h"
+#include <pthread.h>
+#include <signal.h>
+#include <string.h>
+
+namespace LinBox
+{
+
+ /** built on posix threads
+ \ingroup blackbox
+
+ This is a thread interface, built on posix threads.
+ */
+ class Thread {
+
+ public:
+
+#ifdef DEBUG
+ static int count;
+#endif
+
+ // attributes for posix thread
+ static pthread_attr_t attr;
+
+ // a signal set
+ static sigset_t sigset;
+
+ static const int SIGAPPLY;
+
+ static void terminate_thread (const Thread* t) {
+
+ pthread_cancel(t -> getpid());
+
+ pthread_join (t -> getpid(), 0);
+
+ }
+
+ // signal a thread
+ static void signal_thread (const Thread* t) {
+
+ pthread_kill ( t -> getpid(), SIGAPPLY);
+
+ }
+
+ // wait for a signal
+ static void wait_thread (const Thread* t) {
+
+ int err = 0, sig = 0;
+
+ err = sigwait (&sigset, &sig);
+
+ if (err == -1) {
+
+ std::cerr << strerror (errno);
+
+
+ exit (1);
+ }
+
+ }
+
+ // notify the caller
+ static void notify_parent (const Thread* t) {
+
+ pthread_kill ( t -> getppid(), SIGAPPLY);
+
+ }
+
+ // terminate a thread
+ static void terminate_thread (const Thread& t) {
+
+ pthread_cancel(t. getpid());
+
+ pthread_join (t. getpid(), 0);
+
+ }
+
+ static void signal_thread (const Thread& t) {
+
+ pthread_kill ( t. getpid(), SIGAPPLY);
+
+ }
+
+ static void wait_thread (const Thread& t) {
+
+ int err = 0, sig = 0;
+
+ err = sigwait (&sigset, &sig);
+
+ if (err == -1) {
+
+ std::cerr << strerror (errno);
+
+
+ exit (1);
+ }
+
+ }
+
+ static void notify_parent (const Thread& t) {
+
+ pthread_kill ( t. getppid(), SIGAPPLY);
+
+ }
+
+ protected:
+
+ pthread_t pid;
+
+ pthread_t ppid;
+
+ public:
+
+ /** return the unique id associate with the thread.*/
+ pthread_t getpid ( ) const {
+
+ return pid;
+ }
+
+ /** set the unique id associate with the thread.*/
+ void setpid (pthread_t _pid) {
+
+ pid = _pid;
+ }
+
+ /** return caller's id */
+ pthread_t getppid ( ) const {
+
+ return ppid;
+ }
+
+ /** set the caller's id */
+ void setppid (pthread_t _ppid) {
+
+ ppid = _ppid;
+ }
+
+ /** run the thread */
+ virtual void run (void) = 0;
+
+ virtual ~Thread () {
+#ifdef DEBUG
+ --count;
+#endif
+
+ }
+
+ Thread () {
+#ifdef DEBUG
+
+ ++ count;
+#endif
+ }
+
+ };
+
+#ifdef DEBUG
+
+ int Thread::count = 0;
+#endif
+
+ /* initialization of static member of Thread */
+ const int Thread::SIGAPPLY = SIGRTMIN;
+
+ pthread_attr_t Thread::attr = (
+
+ pthread_attr_init (&(Thread::attr)),
+
+ pthread_attr_setscope (&(Thread::attr), PTHREAD_SCOPE_SYSTEM),
+
+ Thread::attr
+ );
+
+ sigset_t Thread::sigset = (
+
+ sigemptyset (&(Thread::sigset)),
+
+ sigaddset (&(Thread::sigset), Thread::SIGAPPLY),
+
+ (Thread::sigset)
+ );
+
+
+ /* a posix thread bound to an object of Thread */
+ void* runThread (void* arg) {
+
+ Thread* t = (Thread*) arg;
+
+ pthread_setcancelstate (PTHREAD_CANCEL_ENABLE, NULL);
+
+ pthread_setcanceltype (PTHREAD_CANCEL_ASYNCHRONOUS, NULL);
+
+ t -> run ( );
+
+ return 0;
+ }
+
+ // blackbox base
+ // a pointer to the address of BB
+ // a pointer to the address of output
+ // a pointer to the address of input
+ struct BBBase : public virtual Thread {
+
+ typedef enum {Apply, ApplyTranspose} BBType;
+
+ BBBase (const void* addr = NULL, void* outaddr = NULL,
+ const void* inaddr = NULL, BBType type = Apply) :
+
+ Thread (),
+ bb_addr (addr),
+ bb_outaddr (outaddr),
+ bb_inaddr (inaddr),
+ bb_type(type){
+
+
+#ifdef DEBUG
+ std::cout << "A blackbox was created with info:\n";
+
+ std::cout << "\tAddress of thread " << bb_addr << '\n';
+
+ std::cout << "\tAddrees of output " << bb_outaddr << '\n';
+
+ std::cout << "\tAddress of input " << bb_inaddr << '\n';
+
+#endif
+ }
+
+ virtual ~BBBase () {
+ }
+
+ const void* bb_addr;
+
+ void* bb_outaddr;
+
+ const void* bb_inaddr;
+
+ BBType bb_type;
+
+ };
+
+ class LessTypeInfo {
+
+ public:
+
+ bool operator() (const std::type_info* info1, const std::type_info* info2) const
+ {
+
+ return info1 -> before (*info2);
+ }
+ };
+
+ typedef std::vector<BBBase*> BB_list;
+
+ typedef std::map <const std::type_info*, BB_list, LessTypeInfo> BB_list_list;
+
+ template <class Matrix, class Out, class In>
+
+ class BBThread : public virtual BBBase {
+
+ public:
+
+ typedef Subvector<typename Out::iterator> SubOut;
+
+ typedef Subvector<typename In::const_iterator> SubIn;
+
+ BBThread(const Matrix* _m = NULL, Out* _outaddr = NULL,
+ const In* _inaddr = NULL, BBBase::BBType type= BBBase::Apply) :
+ Thread(), BBBase ((const void*)_m, (void*)_outaddr, (const void*)_inaddr, type) {
+
+
+#ifdef DEBUG
+ std::cout << "A BB thread was created with properties:\n";
+
+ std::cout << "Matrix: ";
+
+ _m -> write (std::cout);
+
+ std::cout << '\n';
+
+ std::cout << "Out address " << bb_outaddr << '\n';
+
+ std::cout << "In address " << bb_inaddr << '\n';
+
+#endif
+ }
+
+ inline void run (void) {
+
+ const Matrix& matrix = *((const Matrix*)bb_addr);
+
+ while (true) {
+
+ //wait for signal
+ Thread::wait_thread (this);
+
+ switch (bb_type) {
+
+ // Apply request
+ case BBBase::Apply :
+
+ matrix. apply ( *(SubOut*)bb_outaddr,
+ *(const In*)bb_inaddr );
+
+ break;
+
+ // ApplyTranspose request
+ case BBBase::ApplyTranspose :
+
+ matrix. applyTranspose (*(std::vector<typename Matrix::Field::Element>*)bb_outaddr,
+ *(const SubIn*)bb_inaddr);
+
+ break;
+
+ // othre choices
+ default :
+
+ std::cerr << "Unknown command type\n";
+
+ break;
+ }
+
+ Thread::notify_parent (this);
+ }
+ }
+
+ virtual ~BBThread () {
+
+ delete (const Matrix*)bb_addr;
+
+ }
+ };
+
+ /*- create posix thread corresponding a BBThread, and run it */
+ template<class Matrix, class Out, class In>
+
+ BBThread<Matrix, Out, In>* createBBThread ( const Matrix* m, Out* out, const In* in) {
+
+ pthread_t id;
+
+ BBThread<Matrix, Out, In>* t = new BBThread<Matrix, Out, In>(m, out, in);
+
+ int ret = pthread_create (&id, &(Thread::attr), runThread, t);
+
+ if (ret != 0) {
+#ifdef DEBUG
+ std::cout << "Number of thread created: " << Thread::count << '\n';
+#endif
+
+ std::cout << "Not enough resource\n";
+
+ std::cerr << strerror(ret);
+
+ exit (1);
+ }
+
+ t -> setpid (id);
+
+ t -> setppid (pthread_self ());
+
+ return t;
+ }
+
+}
+#endif //__LINBOX_blackbox_thread_H
+
+
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+
diff --git a/linbox/blackbox/block-hankel-inverse.h b/linbox/blackbox/block-hankel-inverse.h
index 5740711..b994d77 100644
--- a/linbox/blackbox/block-hankel-inverse.h
+++ b/linbox/blackbox/block-hankel-inverse.h
@@ -39,6 +39,7 @@
//#define PADEMATRIX
+
namespace LinBox
{
@@ -48,9 +49,9 @@ namespace LinBox
public:
typedef _Field Field;
typedef typename Field::Element Element;
- typedef BlasMatrix<Element> Coefficient;
+ typedef BlasMatrix<Field> Coefficient;
private:
- Field _field;
+ const Field *_field;
VectorDomain<Field> _VD;
BlockHankel<Field> *_H1;
BlockHankel<Field> *_T1;
@@ -65,8 +66,8 @@ namespace LinBox
// Constructor from a stl vector of BlasMatrix reprenting
// all different elements in the Hankel representation
// vector is of odd size and represent the 1st column and last row append together
- BlockHankelInverse(const Field &F, const std::vector<BlasMatrix<Element> > &P) :
- _field(F), _VD(F), _BMD(F)
+ BlockHankelInverse(const Field &F, const std::vector<BlasMatrix<Field> > &P) :
+ _field(&F), _VD(F), _BMD(F)
{
//write_maple("UAV",P);
@@ -75,8 +76,7 @@ namespace LinBox
size_t rowblock = (deg+1)>>1;
size_t colblock = rowblock;
_row = _col = colblock*block;
- Element one;
- _field.init(one, 1UL);
+ Element one=field().one;
_numblock=rowblock;
_block= block;
@@ -86,21 +86,34 @@ namespace LinBox
#ifndef PADEMATRIX
// construct the matrix polynomial serie [ P(x)^T I ]^T and [ P^T(x) I ]
- std::vector<Coefficient> RightPowerSerie(deg+2), LeftPowerSerie(deg+2), LPS(deg+2), RPS(deg+2);
+ Coefficient Zero1(F,2*block,block);
+ Coefficient ZeroT(F,block,2*block);
+
+ std::vector<Coefficient> RightPowerSerie(deg+2,Zero1), LeftPowerSerie(deg+2,ZeroT);
+ std::vector<Coefficient> LPS(deg+2,Zero1), RPS(deg+2,ZeroT);
+
+ //free memory
+ Zero1.resize(0,0);
+ ZeroT.resize(0,0);
+
for (size_t i=0;i< deg+2; ++i){
- LeftPowerSerie[i] = Coefficient(2*block, block); LPS[i]= Coefficient(2*block, block);
- RightPowerSerie[i] = Coefficient(block, 2*block); RPS[i]= Coefficient(block, 2*block);
+ // LeftPowerSerie[i] = Coefficient(2*block, block); LPS[i]= Coefficient(2*block, block);
+ // RightPowerSerie[i] = Coefficient(block, 2*block); RPS[i]= Coefficient(block, 2*block);
if (i <deg) {
for (size_t j=0;j<block;++j)
for (size_t k=0;k<block;++k){
- LeftPowerSerie[i].setEntry(j,k, P[i].getEntry(j,k));LPS[i].setEntry(j,k, P[i].getEntry(j,k));
- RightPowerSerie[i].setEntry(j,k, P[i].getEntry(j,k));RPS[i].setEntry(j,k, P[i].getEntry(j,k));
+ LeftPowerSerie[i]. setEntry(j,k, P[i].getEntry(j,k));
+ LPS[i]. setEntry(j,k, P[i].getEntry(j,k));
+ RightPowerSerie[i].setEntry(j,k, P[i].getEntry(j,k));
+ RPS[i]. setEntry(j,k, P[i].getEntry(j,k));
}
}
}
for (size_t j=0;j<block;++j){
- LeftPowerSerie[0].setEntry(block+j, j , one); LPS[0].setEntry(block+j, j , one);
- RightPowerSerie[0].setEntry(j, block+j, one); RPS[0].setEntry(j, j+block , one);
+ LeftPowerSerie[0]. setEntry(block+j, j , one);
+ LPS[0]. setEntry(block+j, j , one);
+ RightPowerSerie[0].setEntry(j, block+j , one);
+ RPS[0]. setEntry(j, block+j , one);
}
//write_maple("Sx",LeftPowerSerie);
@@ -134,7 +147,7 @@ namespace LinBox
//SBL.left_basis (LP2, deg+1, dlp2);
//SBR.right_basis (RP2, deg+1, drp2);
- std::vector<BlasMatrix<Element> > SLP1, SLP2, SRP1, SRP2;
+ std::vector<BlasMatrix<Field> > SLP1, SLP2, SRP1, SRP2;
extractLeftSigma (SLP1, LP1, dlp1, block);
extractLeftSigma (SLP2, LP2, dlp2, block);
@@ -150,7 +163,7 @@ namespace LinBox
drp[i]=1;
}
- Coefficient ZeroSerie(block, block);
+ Coefficient ZeroSerie(field(),block, block);
std::vector<Coefficient> Serie(deg+2, ZeroSerie);
for (size_t i=0;i<deg;++i)
for (size_t j=0;j<block;++j)
@@ -160,14 +173,14 @@ namespace LinBox
SigmaBasis<Field> SBL(F, Serie);
SigmaBasis<Field> SBR(F, Serie);
- std::vector<BlasMatrix<Element> > SLP1, SLP2, SRP1, SRP2;
+ std::vector<BlasMatrix<Field> > SLP1, SLP2, SRP1, SRP2;
SBL.multi_left_PadeMatrix (SLP1, deg-1, SLP2, deg+1, dlp);
SBR.multi_right_PadeMatrix (SRP1, deg-1, SRP2, deg+1, drp);
#endif
- BlasMatrix<Element> Res(block,block), Inv(block, block);
+ BlasMatrix<Field> Res(field(),block,block), Inv(field(),block, block);
int singular;
// Normalization of SLP2 (V*)
@@ -229,17 +242,18 @@ namespace LinBox
write_maple("V",SRP2);
*/
- std::vector<Coefficient> rev_poly(SRP2.size());
+ Coefficient Zero2(field());
+ std::vector<Coefficient> rev_poly(SRP2.size(),Zero2);
for (size_t i=0;i<SRP2.size();++i)
rev_poly[i]= SRP2[SRP2.size()-1-i];
rev_poly.erase(rev_poly.begin());
- _H1 = new BlockHankel<Field> (_field, rev_poly, BlockHankelTag::up); // V
+ _H1 = new BlockHankel<Field> (field(), rev_poly, BlockHankelTag::up); // V
rev_poly.resize(SRP2.size());
- const BlasMatrix<Element> Zero(block,block);
+ const BlasMatrix<Field> Zero(field(),block,block);
for (size_t i=0;i<SRP1.size();++i)
rev_poly[i]= SRP1[SRP1.size()-1-i];
rev_poly[SRP1.size()]= Zero;
@@ -247,15 +261,16 @@ namespace LinBox
- _H2 = new BlockHankel<Field> (_field, rev_poly, BlockHankelTag::up); // Q
+ _H2 = new BlockHankel<Field> (field(), rev_poly, BlockHankelTag::up); // Q
- _T1 = new BlockHankel<Field> (_field, SLP1, BlockHankelTag::up); // Qstar
+ _T1 = new BlockHankel<Field> (field(), SLP1, BlockHankelTag::up); // Qstar
SLP2.erase(SLP2.begin());
- _T2 = new BlockHankel<Field> (_field, SLP2, BlockHankelTag::up); // Vstar
+ _T2 = new BlockHankel<Field> (field(), SLP2, BlockHankelTag::up); // Vstar
}
+ //!@bug copy constructor ??
~BlockHankelInverse()
{
@@ -276,7 +291,7 @@ namespace LinBox
// reverse y according to block structure
for (size_t i=0; i< _numblock; ++i)
for (size_t j=0;j<_block;++j){
- _field.assign(rev_y[(_numblock-i-1)*_block+j], y[i*_block+j]);
+ field().assign(rev_y[(_numblock-i-1)*_block+j], y[i*_block+j]);
}
_T1->apply(z1, rev_y);
@@ -299,12 +314,12 @@ namespace LinBox
size_t coldim() const { return _col;}
- const Field& field() const { return _field;}
+ const Field& field() const { return *_field;}
protected:
- void extractLeftSigma(std::vector<BlasMatrix<Element> > &S,
- std::vector<BlasMatrix<Element> > &SigmaBase,
+ void extractLeftSigma(std::vector<BlasMatrix<Field> > &S,
+ std::vector<BlasMatrix<Field> > &SigmaBase,
std::vector<size_t> &defect,
size_t block) const
{
@@ -314,7 +329,7 @@ namespace LinBox
std::cout<<defect[i]<<",";
std::cout<<"\n";
for (size_t i=0;i<SigmaBase.size();++i)
- SigmaBase[i].write(std::cout,_field);
+ SigmaBase[i].write(std::cout,field());
#endif
// take the block rows which have lowest defect
@@ -342,7 +357,7 @@ namespace LinBox
size_t idx=0;
for (size_t i=0; i<2*block;++i){
for (size_t j=0;j<2*block;++j)
- if (!_field.isZero(SigmaBase[0].getEntry(i,j))){
+ if (!field().isZero(SigmaBase[0].getEntry(i,j))){
notnull[idx]=i;
++idx;
break;
@@ -356,7 +371,7 @@ namespace LinBox
max=defect[i];
// prepare S to receive the sigma base
- const BlasMatrix<Element> Zero(block,block);
+ const BlasMatrix<Field> Zero(field(),block,block);
S.resize(max+1, Zero);
// extract the sigma base
@@ -369,8 +384,8 @@ namespace LinBox
}
- void extractRightSigma(std::vector<BlasMatrix<Element> > &S,
- std::vector<BlasMatrix<Element> > &SigmaBase,
+ void extractRightSigma(std::vector<BlasMatrix<Field> > &S,
+ std::vector<BlasMatrix<Field> > &SigmaBase,
std::vector<size_t> &defect,
size_t block) const
{
@@ -381,7 +396,7 @@ namespace LinBox
std::cout<<"\n";
for (size_t i=0;i<SigmaBase.size();++i)
- SigmaBase[i].write(std::cout,_field);
+ SigmaBase[i].write(std::cout,field());
#endif
// take the m rows which have lowest defect
@@ -409,7 +424,7 @@ namespace LinBox
size_t idx=0;
for (size_t i=0; i<2*block;++i){
for (size_t j=0;j<2*block;++j)
- if (!_field.isZero(SigmaBase[0].getEntry(i,j))){
+ if (!field().isZero(SigmaBase[0].getEntry(i,j))){
notnull[idx]=i;
++idx;
break;
@@ -423,7 +438,7 @@ namespace LinBox
max=defect[i];
// prepare S to receive the sigma base
- const BlasMatrix<Element> Zero(block,block);
+ const BlasMatrix<Field> Zero(field(),block,block);
S.resize(max+1, Zero);
// extract the sigma base
@@ -456,26 +471,26 @@ namespace LinBox
for (size_t i=0;i<m-1;++i){
std::cout<<"[";
for (size_t j=0;j<n-1;++j)
- _field.write(std::cout,P[k].getEntry(i,j))<<",";
- _field.write(std::cout, P[k].getEntry(i,n-1))<<"] , ";
+ field().write(std::cout,P[k].getEntry(i,j))<<",";
+ field().write(std::cout, P[k].getEntry(i,n-1))<<"] , ";
}
std::cout<<"[";
for (size_t j=0;j<n-1;++j)
- _field.write(std::cout,P[k].getEntry(m-1,j))<<",";
- _field.write(std::cout, P[k].getEntry(m-1,n-1))<<"]]) , ";
+ field().write(std::cout,P[k].getEntry(m-1,j))<<",";
+ field().write(std::cout, P[k].getEntry(m-1,n-1))<<"]]) , ";
}
std::cout<<"Matrix([";
for (size_t i=0;i<m-1;++i){
std::cout<<"[";
for (size_t j=0;j<n-1;++j)
- _field.write(std::cout,P[P.size()-1].getEntry(i,j))<<",";
- _field.write(std::cout, P[P.size()-1].getEntry(i,n-1))<<"] , ";
+ field().write(std::cout,P[P.size()-1].getEntry(i,j))<<",";
+ field().write(std::cout, P[P.size()-1].getEntry(i,n-1))<<"] , ";
}
std::cout<<"[";
for (size_t j=0;j<n-1;++j)
- _field.write(std::cout,P[P.size()-1].getEntry(m-1,j))<<",";
- _field.write(std::cout, P[P.size()-1].getEntry(m-1,n-1))<<"]])]; \n";
+ field().write(std::cout,P[P.size()-1].getEntry(m-1,j))<<",";
+ field().write(std::cout, P[P.size()-1].getEntry(m-1,n-1))<<"]])]; \n";
}
diff --git a/linbox/blackbox/block-hankel.h b/linbox/blackbox/block-hankel.h
index 175c861..f1b916b 100644
--- a/linbox/blackbox/block-hankel.h
+++ b/linbox/blackbox/block-hankel.h
@@ -26,13 +26,14 @@
#define __LINBOX_bb_block_hankel_H
#include <vector>
-#include "linbox/matrix/blas-matrix.h"
+#include "linbox/matrix/dense-matrix.h"
#include "linbox/vector/vector-domain.h"
-#include "linbox/algorithms/blas-domain.h"
+#include "linbox/matrix/matrix-domain.h"
#include "linbox/util/debug.h"
//#define BHANKEL_TIMER
+
namespace LinBox
{
@@ -45,14 +46,14 @@ namespace LinBox
// note that P is done as a mirror
// here we compute a^d.P(1/a^d) where d is the degree of P
template<class Field>
- void MatPolyHornerEval (const Field &F,
- BlasMatrix<typename Field::Element> &R,
- const std::vector<BlasMatrix<typename Field::Element> > &P,
- const typename Field::Element &a)
+ void MatPolyHornerEval (const Field &F,
+ BlasMatrix<Field> &R,
+ const std::vector<BlasMatrix<Field> > &P,
+ const typename Field::Element &a)
{
R= P[0];
- typename BlasMatrix<typename Field::Element>::Iterator it_R;
- typename BlasMatrix<typename Field::Element>::ConstIterator it_P;
+ typename BlasMatrix<Field>::Iterator it_R;
+ typename BlasMatrix<Field>::ConstIterator it_P;
for (size_t k=1; k<P.size(); ++k){
it_R = R.Begin();
it_P = P[k].Begin();
@@ -88,22 +89,21 @@ namespace LinBox
}
template<class Field>
- void BlockHankelEvaluation(const Field &F,
- std::vector<BlasMatrix<typename Field::Element> > &E,
- const std::vector<BlasMatrix<typename Field::Element> > &P,
- size_t k)
+ void BlockHankelEvaluation(const Field &F,
+ std::vector<BlasMatrix<Field> > &E,
+ const std::vector<BlasMatrix<Field> > &P,
+ size_t k)
{
// do the evaluation of the Block Hankel Matrix using Horner Rules
// at k differents points (0,1,2,..,k-1)
E.resize(k);
E[0]=P.back();
- typename Field::Element a, one;
- F.init(one,1);
- F.assign(a,one);
+ typename Field::Element a ;
+ F.assign(a,F.one);
for (size_t i=1;i<k;++i){
MatPolyHornerEval(F, E[i], P, a);
- F.addin(a, one);
+ F.addin(a, F.one);
}
}
@@ -115,13 +115,12 @@ namespace LinBox
{
size_t k=E.size();
E[0]=std::vector<typename Field::Element> (P.begin(), P.begin()+block);
- typename Field::Element a, one;
- F.init(one,1);
- F.assign(a,one);
+ typename Field::Element a;
+ F.assign(a,F.one);
for (size_t i=1;i<k;++i){
VectHornelEval (F, E[i], P, block, a);
- F.addin(a, one);
+ F.addin(a, F.one);
}
}
@@ -132,18 +131,17 @@ namespace LinBox
std::vector<std::vector<typename Field::Element> > &P,
size_t k)
{
- typename Field::Element one,zero, a;
- F.init(one,1);F.init(zero,0);
- F.init(a,0);
+ typename Field::Element a;
+ F.assign(a,F.zero);
// compute L:= (x)(x-1)(x-2)(x-3)...(x-k+1) = a1x+a2x^2+...+a(k-1)x^(k-1)
std::list<typename Field::Element> L(2);
- F.assign(L.front(), zero);
- F.assign(*(++L.begin()), one);
+ F.assign(L.front(), F.zero);
+ F.assign(*(++L.begin()), F.one);
for (size_t i=1;i<k;++i){
- F.subin(a, one);
- L.push_front(zero);
- typename std::list<typename Field::Element>::iterator it_next = L.begin();it_next++;
+ F.subin(a, F.one);
+ L.push_front(F.zero);
+ typename std::list<typename Field::Element>::iterator it_next = L.begin();++it_next;
typename std::list<typename Field::Element>::iterator it = L.begin();
for (;it_next != L.end();++it, ++it_next)
F.axpyin(*it, a, *it_next);
@@ -152,9 +150,9 @@ namespace LinBox
// compute P[i]:= L/(x-i)
P[0]= std::vector<typename Field::Element>(++L.begin(), L.end());
size_t deg=L.size();
- F.init(a,0);
+ F.assign(a,F.zero);
for (size_t i=1;i<k;++i){
- F.addin(a,one);
+ F.addin(a,F.one);
P[i].resize(deg-1);
typename std::list<typename Field::Element>::const_reverse_iterator rit=L.rbegin();
F.assign(P[i][deg-2],*rit);
@@ -165,17 +163,17 @@ namespace LinBox
// compute P[i]= P[i] / Prod((i-j), j<>i)
typename Field::Element prod, ui, uj, tmp;
- F.init(ui,-1);
+ F.assign(ui,F.mOne);
for (size_t i=0;i<k;++i){
- F.assign(prod,one);
- F.addin(ui,one);
- F.assign(uj,zero);
+ F.assign(prod,F.one);
+ F.addin(ui,F.one);
+ F.assign(uj,F.zero);
for (size_t j=0;j<k;++j){
if (j != i){
F.sub(tmp,ui,uj);
F.mulin(prod,tmp);
}
- F.addin(uj,one);
+ F.addin(uj,F.one);
}
F.invin(prod);
//std::cout<<"coeff: ";F.write(std::cout, prod)<<"\n";
@@ -216,14 +214,15 @@ namespace LinBox
typedef _Field Field;
typedef typename Field::Element Element;
+ //! is this used ?
BlockHankel() {}
// Constructor from a stl vector of BlasMatrix reprenting
// all different elements in the Hankel representation
// order of element will depend on first column and/or last row
// (plain->[column|row]; up -> [column]; low -> [row];)
- BlockHankel (Field &F, const std::vector<BlasMatrix<Element> > &H, BlockHankelTag::shape s= BlockHankelTag::plain) :
- _field(F), _BMD(F)
+ BlockHankel (Field &F, const std::vector<BlasMatrix<Field> > &H, BlockHankelTag::shape s= BlockHankelTag::plain) :
+ _field(&F), _BMD(F)
{
linbox_check( H.begin()->rowdim() != H.begin()->coldim());
@@ -239,7 +238,7 @@ namespace LinBox
_row = _rowblock*_block;
_col = _row;
_shape = s;
- BlockHankelEvaluation( _field, _matpoly, H, _deg+_colblock-1);
+ BlockHankelEvaluation( field(), _matpoly, H, _deg+_colblock-1);
}
break;
case BlockHankelTag::up :
@@ -251,7 +250,7 @@ namespace LinBox
_row = _rowblock*_block;
_col = _row;
_shape = s;
- BlockHankelEvaluation( _field, _matpoly, H, _deg+_colblock-1);
+ BlockHankelEvaluation( field(), _matpoly, H, _deg+_colblock-1);
}
break;
case BlockHankelTag::low :
@@ -263,7 +262,7 @@ namespace LinBox
_row = _rowblock*_block;
_col = _row;
_shape = s;
- BlockHankelEvaluation( _field, _matpoly, H, _deg+_colblock-1);
+ BlockHankelEvaluation( field(), _matpoly, H, _deg+_colblock-1);
}
break;
}
@@ -277,18 +276,16 @@ namespace LinBox
_vecpoly.resize(_numpoints, std::vector<Element>(_block));
_veclagrange.resize(_numpoints);
- BHVectorLagrangeCoeff(_field, _veclagrange, _numpoints);
+ BHVectorLagrangeCoeff(field(), _veclagrange, _numpoints);
- _vander = BlasMatrix<Element> (_numpoints,_numpoints);
- _inv_vander = BlasMatrix<Element> (_numpoints,_numpoints);
+ _vander = BlasMatrix<Field> (_field,_numpoints,_numpoints);
+ _inv_vander = BlasMatrix<Field> (_field,_numpoints,_numpoints);
std::vector<Element> points(_numpoints);
- Element one;
- F.init(one,1);
for (size_t i=0;i<_numpoints;++i){
F.init(points[i],i);
- _vander.setEntry(i,0, one);
+ _vander.setEntry(i,0, F.one);
}
@@ -301,15 +298,16 @@ namespace LinBox
_BMD.inv(_inv_vander, _vander);
- _partial_vander= BlasMatrix<Element> (_vander, 0, 0, _numpoints, _colblock);
+ //! @warning memory wasted
+ _partial_vander= BlasMatrix<Field> (_vander, 0, 0, _numpoints, _colblock);
size_t shift=_colblock-1;
if ( _shape == BlockHankelTag::up)
shift=0;
- _partial_inv_vander= BlasMatrix<Element> (_inv_vander, shift, 0, _colblock, _numpoints);
+ _partial_inv_vander= BlasMatrix<Field> (_inv_vander, shift, 0, _colblock, _numpoints);
- _x = BlasMatrix<Element> (_numpoints, _block);
- _y = BlasMatrix<Element> (_colblock, _block);
+ _x = BlasMatrix<Field> (_field,_numpoints, _block);
+ _y = BlasMatrix<Field> (_field,_colblock, _block);
_Tapply.clear();
@@ -321,6 +319,14 @@ namespace LinBox
BlockHankel (const BlockHankel<Field> &H) :
_field(H._field()), _matpoly (H._matpoly), _deg(H._deg),
_row(H._row), _col(H._col), _rowblock(H._rowblock), _colblock(H._colblock), _block(H._block), _shape(H._shape)
+ // dummy defaults
+ ,_vander(BlasMatrix<Field>(*_field))
+ ,_partial_vander(BlasMatrix<Field>(*_field))
+ ,_inv_vander(BlasMatrix<Field>(*_field))
+ ,_partial_inv_vander(BlasMatrix<Field>(*_field))
+ ,_y(BlasMatrix<Field>(*_field))
+ ,_x(BlasMatrix<Field>(*_field))
+ ,_numpoints(0)
{}
// get the column dimension
@@ -329,6 +335,8 @@ namespace LinBox
// get the row dimension
size_t rowdim() const {return _row;}
+ const Field& field() const { return *_field;}
+
// get the block dimension
size_t blockdim() const {return _block;}
@@ -339,13 +347,13 @@ namespace LinBox
{
linbox_check(this->_coldim == y.size());
linbox_check(this->_rowdim == x.size());
- BlasMatrixDomain<Field> BMD(_field);
+ BlasMatrixDomain<Field> BMD(field());
#ifdef BHANKEL_TIMER
_chrono.clear();
_chrono.start();
#endif
// evaluation of the vector seen as a vector polynomial in
- //BHVectorEvaluation(_field, _vecpoly, y, _block);
+ //BHVectorEvaluation(field(), _vecpoly, y, _block);
for (size_t i=0;i<_colblock;++i)
for (size_t j=0;j<_block;++j)
@@ -355,7 +363,7 @@ namespace LinBox
for (size_t i=0;i<_numpoints;++i){
for (size_t j=0;j<_block; ++j)
- _field.assign(_vecpoly[i][j], _x.getEntry(i,j));
+ field().assign(_vecpoly[i][j], _x.getEntry(i,j));
}
#ifdef BHANKEL_TIMER
_chrono.stop();
@@ -381,7 +389,7 @@ namespace LinBox
shift=0;
// interpolation to get the result vector
- BHVectorInterpolation(_field, x, x_vecpoly, _veclagrange, shift);
+ BHVectorInterpolation(field(), x, x_vecpoly, _veclagrange, shift);
#endif
for (size_t i=0;i<_numpoints;++i)
for (size_t j=0;j<_block;++j)
@@ -391,7 +399,7 @@ namespace LinBox
for (size_t i=0;i<_colblock;++i)
for (size_t j=0;j<_block;++j)
- _field.assign( x[x.size() - (i+1)*_block +j], _y.getEntry(i,j));
+ field().assign( x[x.size() - (i+1)*_block +j], _y.getEntry(i,j));
#ifdef BHANKEL_TIMER
_chrono.stop();
@@ -412,16 +420,16 @@ namespace LinBox
}
private:
- Field _field;
- std::vector<BlasMatrix<Element> > _matpoly;
+ const Field *_field;
+ std::vector<BlasMatrix<Field> > _matpoly;
mutable std::vector<std::vector<Element> > _vecpoly;
std::vector<std::vector<Element> > _veclagrange;
- BlasMatrix<Element> _vander;
- BlasMatrix<Element> _partial_vander;
- BlasMatrix<Element> _inv_vander;
- BlasMatrix<Element> _partial_inv_vander;
- mutable BlasMatrix<Element> _y;
- mutable BlasMatrix<Element> _x;
+ BlasMatrix<Field> _vander;
+ BlasMatrix<Field> _partial_vander;
+ BlasMatrix<Field> _inv_vander;
+ BlasMatrix<Field> _partial_inv_vander;
+ mutable BlasMatrix<Field> _y;
+ mutable BlasMatrix<Field> _x;
BlasMatrixDomain<Field> _BMD;
size_t _deg;
size_t _row;
diff --git a/linbox/blackbox/block-toeplitz.h b/linbox/blackbox/block-toeplitz.h
index b546534..e249926 100644
--- a/linbox/blackbox/block-toeplitz.h
+++ b/linbox/blackbox/block-toeplitz.h
@@ -26,12 +26,14 @@
#define __LINBOX_block_toeplitz_H
#include <vector>
-#include "linbox/matrix/blas-matrix.h"
+#include "linbox/matrix/dense-matrix.h"
#include "linbox/vector/vector-domain.h"
-#include "linbox/algorithms/blas-domain.h"
+#include "linbox/matrix/matrix-domain.h"
#include "linbox/util/debug.h"
#include "linbox/blackbox/block-hankel.h"
+THIS_CODE_MAY_NOT_COMPILE_AND_IS_NOT_TESTED
+
namespace LinBox
{
diff --git a/linbox/blackbox/butterfly.h b/linbox/blackbox/butterfly.h
index 6c16a06..a444fe1 100644
--- a/linbox/blackbox/butterfly.h
+++ b/linbox/blackbox/butterfly.h
@@ -46,16 +46,30 @@
#ifndef __LINBOX_butterfly_H
#define __LINBOX_butterfly_H
-#include <vector>
#include "linbox/blackbox/blackbox-interface.h"
+#include "linbox/vector/vector-domain.h"
/*! @file blackbox/butterfly.h
*/
-// Namespace in which all LinBox library code resides
namespace LinBox
{
+
+ /** The default butterfly switch object.
+ *
+ * This is a predicate object that is applied
+ * to two elements to switch them as needed
+ * by the \ref Butterfly\ Switching\ Network\ BlackBox\ Matrix\ Object
+ * following the exchange matrix introduced in "Efficient Matrix
+ * Preconditioners for Black Box Linear Algebra" by Chen, Eberly,
+ * Kaltofen, Saunders, Turner, and Villard.
+ */
+ template <class Field> class CekstvSwitch ;
+
+ /// Alternate butterfly switch object for testing.
+ class BooleanSwitch;
+
/** @name Butterfly
* @brief Butterfly preconditioner and supporting function
*/
@@ -78,7 +92,7 @@ namespace LinBox
* @param Switch switch object type
\ingroup blackbox
*/
- template <class _Field, class Switch>
+ template <class _Field, class Switch = CekstvSwitch<_Field>>
class Butterfly : public BlackboxInterface {
public:
typedef _Field Field;
@@ -88,7 +102,7 @@ namespace LinBox
/** No-Op Constructor
*/
Butterfly (const Field &F, size_t n) :
- _field (F), _VD (F), _n (n)
+ _field (&F), _VD (F), _n (n)
{}
@@ -159,7 +173,7 @@ namespace LinBox
for( ; sit != A.switchesEnd(); ++sit) {
_Sw1 newsw;
- typename Switch::template rebind<_Tp1>() (newsw, *sit, Ap.field(), A._field);
+ typename Switch::template rebind<_Tp1>() (newsw, *sit, Ap.field(), A.field());
Ap.switches().push_back( newsw );
}
// Ap = new other(LAp);
@@ -168,7 +182,7 @@ namespace LinBox
template<typename _Tp1, typename _Sw1>
Butterfly (const Butterfly<_Tp1,_Sw1>& B, const Field &F) :
- _field (F), _VD (F), _n (B.rowdim())
+ _field (&F), _VD (F), _n (B.rowdim())
{
typename Butterfly<_Tp1,_Sw1>::template rebind<Field>() (*this, B);
}
@@ -191,7 +205,7 @@ namespace LinBox
{ return _n; }
const Field& field() const
- {return _field;}
+ {return *_field;}
// Required for rebind
@@ -216,7 +230,7 @@ namespace LinBox
// Field over which we are working
- const Field _field;
+ const Field *_field;
VectorDomain<Field> _VD;
// Number of rows and columns of square matrix.
@@ -239,132 +253,6 @@ namespace LinBox
}; // template <class Field, class Vector> class Butterfly
- // Implementation of methods
-
- template <class Field, class Switch>
- inline Butterfly<Field, Switch>::Butterfly (const Field &F, size_t n, typename Switch::Factory &factory) :
- _field (F), _VD (F), _n (n)
- {
- buildIndices ();
-
- for (unsigned int i = 0; i < _indices.size (); ++i)
- _switches.push_back (factory.makeSwitch ());
- }
-
- template <class Field, class Switch>
- template<class OutVector, class InVector>
- inline OutVector& Butterfly<Field, Switch>::apply (OutVector& y, const InVector& x) const
- {
- std::vector< std::pair<size_t, size_t> >::const_iterator idx_iter = _indices.begin ();
- typename std::vector<Switch>::const_iterator switch_iter = _switches.begin ();
-
- _VD.copy (y, x);
-
- for (; idx_iter != _indices.end (); ++idx_iter, ++switch_iter)
- switch_iter->apply (_field, y[idx_iter->first], y[idx_iter->second]);
-
- return y;
- }
-
- template <class Field, class Switch>
- template <class OutVector, class InVector>
- inline OutVector& Butterfly<Field, Switch>::applyTranspose (OutVector& y, const InVector& x) const
- {
- std::vector< std::pair<size_t, size_t> >::const_reverse_iterator idx_iter = _indices.rbegin ();
- typename std::vector<Switch>::const_reverse_iterator switch_iter = _switches.rbegin ();
-
- _VD.copy (y, x);
-
- for (; idx_iter != _indices.rend (); ++idx_iter, ++switch_iter)
- switch_iter->applyTranspose (_field, y[idx_iter->first], y[idx_iter->second]);
-
- return y;
- }
-
- template <class Field, class Switch>
- void Butterfly<Field, Switch>::buildIndices ()
- {
- for (size_t value (_n), l_p (0), n_p (1);
- n_p != 0;
- value >>= 1, l_p++, n_p <<= 1)
- {
- if (value & 1) {
- _l_vec.push_back (l_p);
- _n_vec.push_back (n_p);
- }
- }
-
- // Create vector of indices to switch
- size_t n_p, l_p; // size of group and number of levels in group
- size_t level (0), difference (1); // track levels done for powers of 2
-
- // Vector containing indices for last level of last power of 2.
- std::vector< std::pair< size_t, size_t > > p_ind;
-
- // Vector and iterator used for computing p_ind.
- std::vector< std::pair< size_t, size_t > > temp_ind;
- std::vector< std::pair< size_t, size_t > >::iterator iter;
-
- // Loop over sub-groups of powers of two
- for (size_t p (0), start_index (0);
- p < _n_vec.size ();
- p++, start_index += n_p)
- {
- // update size
- n_p = _n_vec[p];
- l_p = _l_vec[p];
-
- // loop over levels of sub-group network
- for ( ; level < l_p; level++, difference <<= 1) {
- // Create
- temp_ind = p_ind;
-
- // the second sub group is a shift of the first
- for (iter = temp_ind.begin (); iter != temp_ind.end (); iter++) {
- iter->first += difference;
- iter->second += difference;
- }
-
- // add the second group to the first
- p_ind.insert (p_ind.end (), temp_ind.begin (), temp_ind.end ());
-
- // add switches to mix the two sub groups
- temp_ind = std::vector< std::pair<size_t, size_t> >
- (difference, std::pair<size_t, size_t> (0, 0));
-
- size_t i = 0;
- for (iter = temp_ind.begin (); iter != temp_ind.end (); i++, iter++) {
- iter->first += i;
- iter->second += i + difference;
- }
-
- // add the combining group to the first and second
- p_ind.insert (p_ind.end (), temp_ind.begin (), temp_ind.end ());
- }
-
- // Add this level to total list of indices and correct starting point
- temp_ind = p_ind;
-
- for (iter = temp_ind.begin (); iter != temp_ind.end (); iter++) {
- iter->first += start_index;
- iter->second += start_index;
- }
-
- _indices.insert (_indices.end (), temp_ind.begin (), temp_ind.end ());
-
- // Combine everything so far
- temp_ind = std::vector< std::pair<size_t, size_t> > (start_index, std::pair<size_t, size_t> (0, 0));
-
- iter = temp_ind.begin ();
- for (size_t index = 0; index < start_index; index++, iter++) {
- iter->first = index;
- iter->second += index + n_p;
- }
-
- _indices.insert (_indices.end (), temp_ind.begin (), temp_ind.end ());
- }
- }
-
/** A function used with Butterfly Blackbox Matrices.
* This function takes an STL vector x of booleans, and returns
* a vector y of booleans such that setting the switches marked
@@ -384,328 +272,12 @@ namespace LinBox
* @param j offset of contiguous block
*/
inline std::vector<bool> setButterfly (const std::vector<bool>& x,
- size_t j = 0)
- {
- size_t n = x.size ();
-
- commentator().start ("Setting butterfly switches", "setButterfly");
-
- std::ostream &report = commentator().report (Commentator::LEVEL_NORMAL, INTERNAL_DESCRIPTION);
+ size_t j = 0);
- report << "Called set switches with vector of size " << n
- << " and offset " << j << std::endl;
-
- // return empty vector if zero or one elements in x because
- // no switching will be done.
- if (x.size () <= 1) {
- commentator().indent (report);
- report << "No switches needed. Returning with empty vector." << std::endl;
-
- commentator().stop ("done");
- return std::vector<bool> ();
- }
-
- commentator().indent (report);
- report << "Counting the number of switches that exist." << std::endl;
-
- // break inputs into groups of size powers of 2.
- // calculate size of groups, and powers of 2 that give sizes
- // store these values in vectors n and l, respectively
- std::vector<size_t> l_vec, n_vec;
-
- for (size_t value (n), l_p (0), n_p (1);
- n_p != 0;
- value >>= 1, l_p++, n_p <<= 1)
- {
- commentator().indent (report);
- report << " looping at value = " << value
- << ", l_p = " << l_p
- << ", n_p = " << n_p << std::endl;
-
- if (value & 1) {
- l_vec.push_back (l_p);
- n_vec.push_back (n_p);
-
- commentator().indent (report);
- report << " inserted value = " << value
- << ", l_p = " << l_p
- << ", n_p = " << n_p << std::endl;
- }
- }
-
- // Calculate total number of switches required
- size_t s (0);
-
- for (size_t ii = 0; ii < n_vec.size (); ii++)
- s += n_vec[ii] * l_vec[ii] / 2;
-
- for (size_t ii = 0; ii < n_vec.size () - 1; ii++)
- for (size_t jj = 0; jj <= ii; jj++)
- s += n_vec[jj];
-
- commentator().indent (report);
- report << "There are a total of " << s << " switches" << std::endl;
-
- // Set largest power of 2 in decomposition of n = x.size ()
- size_t n_p (*n_vec.rbegin ());
-
- commentator().indent (report);
- report << "Found largest power of 2 in decomposition of " << n
- << " as n_p = " << n_p << std::endl;
-
- if ( (n != n_p) && (j != 0) ) {
- commentator().indent (report);
- report << "Non-zero offset " << j
- << " used with non-power size."
- << "Offset reset to zero." << std::endl;
-
- j = 0;
- }
- else
- j %= n;
-
- if (n == n_p) {
- n_p /= 2; // >> is not portable!
-
- commentator().indent (report);
- report << "n = " << n << " is a power of two. "
- << "Resetting n_p to be half of n: n_p = " << n_p << std::endl;
- }
-
- // count true elements not in largest power of 2 block
- size_t r_1(0);
-
- for (std::vector<bool>::const_iterator iter = x.begin ();
- iter != x.begin () + (n - n_p);
- iter++)
- if (*iter) r_1++;
-
- // count total number of true elements in x.
- size_t r (r_1);
-
- for (std::vector<bool>::const_iterator iter = x.begin () + (n - n_p);
- iter != x.end ();
- iter++)
- if (*iter) r++;
-
- commentator().indent (report);
- report << "The vector x will be broken into two sub-vectors,"
- << "x_1 = x[0,...," << n - n_p - 1 << "] and x_2 = x["
- << n - n_p << ",...," << n - 1 << "]."
- << "There are a total of " << r << " true Elements in x, "
- << r_1 << " of which occured in the first sub-vector."
- << "The output vector will have " << s << " entries and will"
- << "switch the true Elements of x into a contiguous block"
- << "[" << j << "," << j + r
- << ") = [" << j << "," << j + r - 1<< "]." << std::endl;
-
- if (r == 0) {
- commentator().indent (report);
- report << "There are no true Elements in x, so the recursion is"
- << "being broken and a vector of false flags returned." << std::endl;
-
- commentator().stop ("done");
- return std::vector<bool> (s, false);
- }
- else if (r == n) {
- commentator().indent (report);
- report << "There are no false Elements in x, so the recursion is"
- << "being broken and a vector of false flags returned." << std::endl;
-
- commentator().stop ("done");
- return std::vector<bool> (s, false);
- }
-
- // Calculate where the true elements are supposed to end up
- // Here, they will be in a contiguous block starting after the
- // offset. s_1 are the true elements after the offset and in the first
- // sub-group, s_2 are the ones in the second sub group, and s_3 are the
- // elements that wrap around to the beginning. s_1 and s_3 cannot both
- // be non-zero unless s_2 == n_p. (I.e., the second group is full.)
- // Also, because for n != 2 n_p the offset is zero, in that case
- // s_3 must be zero. Any of them may be zero if the corrsponding block
- // is empty.
- // s_2 is only used for tracing the program, so it is not always computed.
-
- size_t s_1;
-
- if (j < n - n_p) {
- if (j + r < n - n_p)
- s_1 = r;
- else
- s_1 = n - n_p - j;
- }
- else
- s_1 = 0;
-
- size_t s_2 = 0;
-
- if (commentator().isPrinted (Commentator::LEVEL_NORMAL, INTERNAL_DESCRIPTION)) {
- if (j + r < n - n_p)
- s_2 = 0;
- else {
- if (j + r < n)
- s_2 = j + r;
- else
- s_2 = n;
-
- if (j < n - n_p)
- s_2 -= (n - n_p);
- else
- s_2 -= j;
- }
- }
-
- size_t s_3 = ((j + r) > n) ? j + r - n : 0;
-
- commentator().indent (report);
- report << "The number of Elements in each of the three blocks of "
- << "true Elements in the end result are"
- << "s_1 = " << s_1
- << ", s_2 = " << s_2
- << ", and s_3 = " << s_3 << "." << std::endl;
-
- // Create empty vector for output. y_temp is used to retrieve output
- // from recursion before inserting into output.
- std::vector<bool> y_1, y_2, y_3 = std::vector<bool> (n - n_p, false);
-
- if ((s_1 + s_3) == r_1) {
- commentator().indent (report);
- report << "Case I: s_1 + s_3 == r_1 and s_2 == r - r_1."
- << "No Elements are moved between the two sub-vectors." << std::endl;
-
- if (j < (n - n_p)) {
- commentator().indent (report);
- report << " A: j < (n - n_p). j_1 = j = " << j << ", j_2 = 0";
-
- y_1 = setButterfly (std::vector<bool>(x.begin (), x.begin () + (n - n_p)), j);
- y_2 = setButterfly (std::vector<bool>(x.begin () + (n - n_p), x.end ()), 0);
-
- }
- else {
- commentator().indent (report);
- report << " A: j >= (n - n_p). j_1 = 0, j_2 = j - (n - n_p) = "
- << j - (n - n_p) << std::endl;
-
- // This case cannot occur for n != 2*n_p because j != 0
-
- y_1 = setButterfly (std::vector<bool>(x.begin (), x.begin () + (n - n_p)), 0);
- y_2 = setButterfly (std::vector<bool>(x.begin () + (n - n_p), x.end ()), j - (n - n_p));
- }
- }
- else if ((s_1 + s_3) > r_1) {
- commentator().indent (report);
- report << "Case II: s_1 + s_3 > r_1 and s_2 < r - r_1."
- << "Elements are moved from the right sub-vector to the left." << std::endl;
-
- // This means that s_2 < n_p, so either s_1 = 0 or s_3 = 0 (or both).
-
- if (j < (n - n_p)) {
- commentator().indent (report);
- report << " A: j < (n - n_p). j_1 = j, j_2 = 2*n_p + j + r_1 - n = "
- << 2*n_p + j + r_1 - n << std::endl;
-
- // In this case, s_1 > 0, so s_3 = 0, and wrap-around cannot occur.
-
- y_1 = setButterfly (std::vector<bool>(x.begin (), x.begin () + (n - n_p)), j);
- y_2 = setButterfly (std::vector<bool>(x.begin () + (n - n_p), x.end ()), 2*n_p + j + r_1 - n);
-
- for (std::vector<bool>::iterator iter = (y_3.begin () + (j + r_1));
- iter != (y_3.begin () + (n - n_p));
- iter++)
- *iter = true;
- }
- else {
- commentator().indent (report);
- report << " A: j >= (n - n_p). j_1 = j + r - n - r_1 = "
- << j + r - n - r_1 << ", j_2 = j - (n - n_p) = "
- << j - (n - n_p) << std::endl;
-
- // In this case, s_1 = 0, so s_3 >= 0, and wrap-around may occur.
- // This case cannot occur for n != 2*n_p because j != 0.
-
- y_1 = setButterfly (std::vector<bool>(x.begin (), x.begin () + (n - n_p)), j + r - n - r_1);
- y_2 = setButterfly (std::vector<bool>(x.begin () + (n - n_p), x.end ()), j - (n - n_p));
-
- for (std::vector<bool>::iterator iter = y_3.begin ();
- iter != (y_3.begin () + (j + r - n - r_1));
- iter++)
- *iter = true;
- }
- }
- else if ((s_1 + s_3) < r_1) {
- commentator().indent (report);
- report << "Case III: s_1 + s_3 < r_1 and s_2 > r - r_1."
- << "Elements are moved from the left sub-vector to the right." << std::endl;
-
- // This case also means that s_1 + s_3 < n - n_p, or the contiguous
- // block cannot encompass the entire first sub-vector. For this
- // reason, this case is not considered when n != 2*n_p (when j = 0).
-
- if (j < (n - n_p)) {
- commentator().indent (report);
- report << " A: j < (n - n_p). j_1 = j = " << j
- << ", j_2 = j + r_1 - n + n_p = " << j + r_1 - n + n_p << std::endl;
- // In this case, s_1 > 0, so s_3 = 0, and wrap-around cannot occur.
-
- y_1 = setButterfly (std::vector<bool>(x.begin (), x.begin () + (n - n_p)), j);
- y_2 = setButterfly (std::vector<bool>(x.begin () + (n - n_p), x.end ()), j + r_1 - n + n_p);
-
- for (std::vector<bool>::iterator iter = (y_3.begin () + s_3);
- iter != (y_3.begin () + (j + r_1 - n + n_p));
- iter++)
- *iter = true;
- }
- else {
- commentator().indent (report);
- report << " A: j >= (n - n_p). j_1 = j + r - n_p - r_1 = "
- << j + r - n_p - r_1 << ", j_2 = j - (n - n_p) = "
- << j - (n - n_p) << std::endl;
-
- // In this case, s_1 = 0, so s_3 >= 0, and wrap-around may occur.
- // This case cannot occur for n != 2*n_p because j != 0.
-
- y_1 = setButterfly (std::vector<bool>(x.begin (), x.begin () + (n - n_p)), j + r - n_p - r_1);
- y_2 = setButterfly (std::vector<bool>(x.begin () + (n - n_p), x.end ()), j - (n - n_p));
-
- for (std::vector<bool>::iterator iter (y_3.begin () + (j + r - n_p - r_1));
- iter != (y_3.begin () + (n - n_p));
- iter++)
- *iter = true;
- }
- }
-
- // Create output vector.
- std::vector<bool> y (y_1);
- y.insert (y.end (), y_2.begin (), y_2.end ());
- y.insert (y.end (), y_3.begin (), y_3.end ());
-
- commentator().indent (report);
- report << "The output vector for n = " << n << " has " << y.size ()
- << " entries."
- << " " << y_1.size () << " from the first sub-vector"
- << " " << y_2.size () << " from the second sub-vector"
- << " " << y_3.size () << " from recombining the two"
- << "And the output vector y is:"
- << "-------------------------- " << std::endl;
-
- for (size_t i = 0; i < y.size (); i++) {
- commentator().indent (report);
- report << " " << i << ": " << y[i] << std::endl;
- }
-
- commentator().indent (report);
- report << "-------------------------- " << std::endl;
-
- commentator().stop ("done");
-
- return y;
-
- } // std::vector<bool> setButterfly (const std::vector<bool>& x, size_t j)
-
- //@}
} // namespace LinBox
+#include "butterfly.inl"
+
#endif // __LINBOX_butterfly_H
diff --git a/linbox/blackbox/butterfly.inl b/linbox/blackbox/butterfly.inl
new file mode 100644
index 0000000..df97e6f
--- /dev/null
+++ b/linbox/blackbox/butterfly.inl
@@ -0,0 +1,845 @@
+/* linbox/blackbox/butterfly.inl
+ * Copyright (C) 1999-2001 William J Turner,
+ * 2001 Bradford Hovinen
+ 2015 reorg bds
+ *
+ * Written by William J Turner <wjturner at math.ncsu.edu>,
+ * Bradford Hovinen <hovinen at cis.udel.edu>
+ *
+ * -----------------------------------------------------------
+ * 2002-09-26 Bradford Hovinen <bghovinen at math.uwaterloo.ca>
+ *
+ * Refactoring: The switch object now only contains the information necessary
+ * for a single 2x2 block. The butterfly black box maintains a vector of switch
+ * objects that it keeps in parallel with its vector of indices. There is a new
+ * lightweight class, called a SwitchFactory, that constructs switches on the
+ * fly. It is defined individually for each switch type, and a instance thereof
+ * is passed to the butterfly, which then uses it to construct its vector.
+ *
+ * This eliminates two problems: first, because switch objects are constructed
+ * by the butterfly itself, there is no need to know a priori the length of the
+ * vector of indices. Second, the switch object itself becomes simpler, as it
+ * need only be responsible for a single 2x2 block.
+ *
+ * -----------------------------------------------------------
+ *
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ * ========LICENCE========
+ *
+ */
+
+#ifndef __LINBOX_butterfly_INL
+#define __LINBOX_butterfly_INL
+
+#include <vector>
+#include "linbox/blackbox/blackbox-interface.h"
+#include "linbox/vector/vector-domain.h"
+#include "linbox/field/hom.h"
+
+/** @file blackbox/butterfly.inl
+ *
+ * First linbox block: butterfly method implementations
+ * Second LinBox block: butterfly switch and switch factory impls.
+ *
+ */
+namespace LinBox
+{
+ // Implementation of Butterfly methods
+
+ template <class Field, class Switch>
+ inline Butterfly<Field, Switch>::Butterfly (const Field &F, size_t n, typename Switch::Factory &factory) :
+ _field (&F), _VD (F), _n (n)
+ {
+ buildIndices ();
+
+ for (unsigned int i = 0; i < _indices.size (); ++i)
+ _switches.push_back (factory.makeSwitch ());
+ }
+
+ template <class Field, class Switch>
+ template<class OutVector, class InVector>
+ inline OutVector& Butterfly<Field, Switch>::apply (OutVector& y, const InVector& x) const
+ {
+ std::vector< std::pair<size_t, size_t> >::const_iterator idx_iter = _indices.begin ();
+ typename std::vector<Switch>::const_iterator switch_iter = _switches.begin ();
+
+ _VD.copy (y, x);
+
+ for (; idx_iter != _indices.end (); ++idx_iter, ++switch_iter)
+ switch_iter->apply (field(), y[idx_iter->first], y[idx_iter->second]);
+
+ return y;
+ }
+
+ template <class Field, class Switch>
+ template <class OutVector, class InVector>
+ inline OutVector& Butterfly<Field, Switch>::applyTranspose (OutVector& y, const InVector& x) const
+ {
+ std::vector< std::pair<size_t, size_t> >::const_reverse_iterator idx_iter = _indices.rbegin ();
+ typename std::vector<Switch>::const_reverse_iterator switch_iter = _switches.rbegin ();
+
+ _VD.copy (y, x);
+
+ for (; idx_iter != _indices.rend (); ++idx_iter, ++switch_iter)
+ switch_iter->applyTranspose (field(), y[idx_iter->first], y[idx_iter->second]);
+
+ return y;
+ }
+
+ template <class Field, class Switch>
+ void Butterfly<Field, Switch>::buildIndices ()
+ {
+ for (size_t value (_n), l_p (0), n_p (1);
+ n_p != 0;
+ value >>= 1, ++l_p, n_p <<= 1)
+ {
+ if (value & 1) {
+ _l_vec.push_back (l_p);
+ _n_vec.push_back (n_p);
+ }
+ }
+
+ // Create vector of indices to switch
+ size_t n_p ; // size of group and number of levels in group
+ size_t level (0), difference (1); // track levels done for powers of 2
+
+ // Vector containing indices for last level of last power of 2.
+ std::vector< std::pair< size_t, size_t > > p_ind;
+
+ // Vector and iterator used for computing p_ind.
+ std::vector< std::pair< size_t, size_t > > temp_ind;
+ std::vector< std::pair< size_t, size_t > >::iterator iter;
+
+ // Loop over sub-groups of powers of two
+ for (size_t p (0), start_index (0);
+ p < _n_vec.size ();
+ ++p, start_index += n_p)
+ {
+ // update size
+ n_p = _n_vec[p];
+ size_t l_p = _l_vec[p];
+
+ // loop over levels of sub-group network
+ for ( ; level < l_p; ++level, difference <<= 1) {
+ // Create
+ temp_ind = p_ind;
+
+ // the second sub group is a shift of the first
+ for (iter = temp_ind.begin (); iter != temp_ind.end (); ++iter) {
+ iter->first += difference;
+ iter->second += difference;
+ }
+
+ // add the second group to the first
+ p_ind.insert (p_ind.end (), temp_ind.begin (), temp_ind.end ());
+
+ // add switches to mix the two sub groups
+ temp_ind = std::vector< std::pair<size_t, size_t> >
+ (difference, std::pair<size_t, size_t> (0, 0));
+
+ size_t i = 0;
+ for (iter = temp_ind.begin (); iter != temp_ind.end (); ++i, ++iter) {
+ iter->first += i;
+ iter->second += i + difference;
+ }
+
+ // add the combining group to the first and second
+ p_ind.insert (p_ind.end (), temp_ind.begin (), temp_ind.end ());
+ }
+
+ // Add this level to total list of indices and correct starting point
+ temp_ind = p_ind;
+
+ for (iter = temp_ind.begin (); iter != temp_ind.end (); ++iter) {
+ iter->first += start_index;
+ iter->second += start_index;
+ }
+
+ _indices.insert (_indices.end (), temp_ind.begin (), temp_ind.end ());
+
+ // Combine everything so far
+ temp_ind = std::vector< std::pair<size_t, size_t> > (start_index, std::pair<size_t, size_t> (0, 0));
+
+ iter = temp_ind.begin ();
+ for (size_t index = 0; index < start_index; ++index, ++iter) {
+ iter->first = index;
+ iter->second += index + n_p;
+ }
+
+ _indices.insert (_indices.end (), temp_ind.begin (), temp_ind.end ());
+ }
+ }
+
+ inline std::vector<bool> setButterfly (const std::vector<bool>& x,
+ size_t j)
+ {
+ size_t n = x.size ();
+
+ commentator().start ("Setting butterfly switches", "setButterfly");
+
+ std::ostream &report = commentator().report (Commentator::LEVEL_NORMAL, INTERNAL_DESCRIPTION);
+
+ report << "Called set switches with vector of size " << n
+ << " and offset " << j << std::endl;
+
+ // return empty vector if zero or one elements in x because
+ // no switching will be done.
+ if (x.size () <= 1) {
+ commentator().indent (report);
+ report << "No switches needed. Returning with empty vector." << std::endl;
+
+ commentator().stop ("done");
+ return std::vector<bool> ();
+ }
+
+ commentator().indent (report);
+ report << "Counting the number of switches that exist." << std::endl;
+
+ // break inputs into groups of size powers of 2.
+ // calculate size of groups, and powers of 2 that give sizes
+ // store these values in vectors n and l, respectively
+ std::vector<size_t> l_vec, n_vec;
+
+ for (size_t value (n), l_p (0), n_p (1);
+ n_p != 0;
+ value >>= 1, ++l_p, n_p <<= 1)
+ {
+ commentator().indent (report);
+ report << " looping at value = " << value
+ << ", l_p = " << l_p
+ << ", n_p = " << n_p << std::endl;
+
+ if (value & 1) {
+ l_vec.push_back (l_p);
+ n_vec.push_back (n_p);
+
+ commentator().indent (report);
+ report << " inserted value = " << value
+ << ", l_p = " << l_p
+ << ", n_p = " << n_p << std::endl;
+ }
+ }
+
+ // Calculate total number of switches required
+ size_t s (0);
+
+ for (size_t ii = 0; ii < n_vec.size (); ++ii)
+ s += n_vec[ii] * l_vec[ii] / 2;
+
+ for (size_t ii = 0; ii < n_vec.size () - 1; ++ii)
+ for (size_t jj = 0; jj <= ii; ++jj)
+ s += n_vec[jj];
+
+ commentator().indent (report);
+ report << "There are a total of " << s << " switches" << std::endl;
+
+ // Set largest power of 2 in decomposition of n = x.size ()
+ size_t n_p (*n_vec.rbegin ());
+
+ commentator().indent (report);
+ report << "Found largest power of 2 in decomposition of " << n
+ << " as n_p = " << n_p << std::endl;
+
+ if ( (n != n_p) && (j != 0) ) {
+ commentator().indent (report);
+ report << "Non-zero offset " << j
+ << " used with non-power size."
+ << "Offset reset to zero." << std::endl;
+
+ j = 0;
+ }
+ else
+ j %= n;
+
+ if (n == n_p) {
+ n_p /= 2; // >> is not portable!
+
+ commentator().indent (report);
+ report << "n = " << n << " is a power of two. "
+ << "Resetting n_p to be half of n: n_p = " << n_p << std::endl;
+ }
+
+ // count true elements not in largest power of 2 block
+ size_t r_1(0);
+
+ for (std::vector<bool>::const_iterator iter = x.begin ();
+ iter != x.begin () + (ptrdiff_t)(n - n_p);
+ ++iter)
+ if (*iter) ++r_1;
+
+ // count total number of true elements in x.
+ size_t r (r_1);
+
+ for (std::vector<bool>::const_iterator iter = x.begin () + (ptrdiff_t)(n - n_p);
+ iter != x.end ();
+ ++iter)
+ if (*iter) ++r;
+
+ commentator().indent (report);
+ report << "The vector x will be broken into two sub-vectors,"
+ << "x_1 = x[0,...," << n - n_p - 1 << "] and x_2 = x["
+ << n - n_p << ",...," << n - 1 << "]."
+ << "There are a total of " << r << " true Elements in x, "
+ << r_1 << " of which occured in the first sub-vector."
+ << "The output vector will have " << s << " entries and will"
+ << "switch the true Elements of x into a contiguous block"
+ << "[" << j << "," << j + r
+ << ") = [" << j << "," << j + r - 1<< "]." << std::endl;
+
+ if (r == 0) {
+ commentator().indent (report);
+ report << "There are no true Elements in x, so the recursion is"
+ << "being broken and a vector of false flags returned." << std::endl;
+
+ commentator().stop ("done");
+ return std::vector<bool> (s, false);
+ }
+ else if (r == n) {
+ commentator().indent (report);
+ report << "There are no false Elements in x, so the recursion is"
+ << "being broken and a vector of false flags returned." << std::endl;
+
+ commentator().stop ("done");
+ return std::vector<bool> (s, false);
+ }
+
+ // Calculate where the true elements are supposed to end up
+ // Here, they will be in a contiguous block starting after the
+ // offset. s_1 are the true elements after the offset and in the first
+ // sub-group, s_2 are the ones in the second sub group, and s_3 are the
+ // elements that wrap around to the beginning. s_1 and s_3 cannot both
+ // be non-zero unless s_2 == n_p. (I.e., the second group is full.)
+ // Also, because for n != 2 n_p the offset is zero, in that case
+ // s_3 must be zero. Any of them may be zero if the corrsponding block
+ // is empty.
+ // s_2 is only used for tracing the program, so it is not always computed.
+
+ size_t s_1;
+
+ if (j < n - n_p) {
+ if (j + r < n - n_p)
+ s_1 = r;
+ else
+ s_1 = n - n_p - j;
+ }
+ else
+ s_1 = 0;
+
+ size_t s_2 = 0;
+
+ if (commentator().isPrinted (Commentator::LEVEL_NORMAL, INTERNAL_DESCRIPTION)) {
+ if (j + r < n - n_p)
+ s_2 = 0;
+ else {
+ if (j + r < n)
+ s_2 = j + r;
+ else
+ s_2 = n;
+
+ if (j < n - n_p)
+ s_2 -= (n - n_p);
+ else
+ s_2 -= j;
+ }
+ }
+
+ size_t s_3 = ((j + r) > n) ? j + r - n : 0;
+
+ commentator().indent (report);
+ report << "The number of Elements in each of the three blocks of "
+ << "true Elements in the end result are"
+ << "s_1 = " << s_1
+ << ", s_2 = " << s_2
+ << ", and s_3 = " << s_3 << "." << std::endl;
+
+ // Create empty vector for output. y_temp is used to retrieve output
+ // from recursion before inserting into output.
+ std::vector<bool> y_1, y_2, y_3 = std::vector<bool> (n - n_p, false);
+
+ if ((s_1 + s_3) == r_1) {
+ commentator().indent (report);
+ report << "Case I: s_1 + s_3 == r_1 and s_2 == r - r_1."
+ << "No Elements are moved between the two sub-vectors." << std::endl;
+
+ if (j < (n - n_p)) {
+ commentator().indent (report);
+ report << " A: j < (n - n_p). j_1 = j = " << j << ", j_2 = 0";
+
+ y_1 = setButterfly (std::vector<bool>(x.begin (), x.begin () + (ptrdiff_t)(n - n_p)), j);
+ y_2 = setButterfly (std::vector<bool>(x.begin () + (ptrdiff_t)(n - n_p), x.end ()), 0);
+
+ }
+ else {
+ commentator().indent (report);
+ report << " A: j >= (n - n_p). j_1 = 0, j_2 = j - (n - n_p) = "
+ << j - (n - n_p) << std::endl;
+
+ // This case cannot occur for n != 2*n_p because j != 0
+
+ y_1 = setButterfly (std::vector<bool>(x.begin (), x.begin () + (ptrdiff_t)(n - n_p)), 0);
+ y_2 = setButterfly (std::vector<bool>(x.begin () + (ptrdiff_t)(n - n_p), x.end ()), j - (n - n_p));
+ }
+ }
+ else if ((s_1 + s_3) > r_1) {
+ commentator().indent (report);
+ report << "Case II: s_1 + s_3 > r_1 and s_2 < r - r_1."
+ << "Elements are moved from the right sub-vector to the left." << std::endl;
+
+ // This means that s_2 < n_p, so either s_1 = 0 or s_3 = 0 (or both).
+
+ if (j < (n - n_p)) {
+ commentator().indent (report);
+ report << " A: j < (n - n_p). j_1 = j, j_2 = 2*n_p + j + r_1 - n = "
+ << 2*n_p + j + r_1 - n << std::endl;
+
+ // In this case, s_1 > 0, so s_3 = 0, and wrap-around cannot occur.
+
+ y_1 = setButterfly (std::vector<bool>(x.begin (), x.begin () + (ptrdiff_t)(n - n_p)), j);
+ y_2 = setButterfly (std::vector<bool>(x.begin () + (ptrdiff_t)(n - n_p), x.end ()), 2*n_p + j + r_1 - n);
+
+ for (std::vector<bool>::iterator iter = (y_3.begin () + (ptrdiff_t)(j + r_1));
+ iter != (y_3.begin () + (ptrdiff_t)(n - n_p));
+ ++iter)
+ *iter = true;
+ }
+ else {
+ commentator().indent (report);
+ report << " A: j >= (n - n_p). j_1 = j + r - n - r_1 = "
+ << j + r - n - r_1 << ", j_2 = j - (n - n_p) = "
+ << j - (n - n_p) << std::endl;
+
+ // In this case, s_1 = 0, so s_3 >= 0, and wrap-around may occur.
+ // This case cannot occur for n != 2*n_p because j != 0.
+
+ y_1 = setButterfly (std::vector<bool>(x.begin (), x.begin () + (ptrdiff_t)(n - n_p)), j + r - n - r_1);
+ y_2 = setButterfly (std::vector<bool>(x.begin () + (ptrdiff_t)(n - n_p), x.end ()), j - (n - n_p));
+
+ for (std::vector<bool>::iterator iter = y_3.begin ();
+ iter != (y_3.begin () + (ptrdiff_t)(j + r - n - r_1));
+ ++iter)
+ *iter = true;
+ }
+ }
+ else if ((s_1 + s_3) < r_1) {
+ commentator().indent (report);
+ report << "Case III: s_1 + s_3 < r_1 and s_2 > r - r_1."
+ << "Elements are moved from the left sub-vector to the right." << std::endl;
+
+ // This case also means that s_1 + s_3 < n - n_p, or the contiguous
+ // block cannot encompass the entire first sub-vector. For this
+ // reason, this case is not considered when n != 2*n_p (when j = 0).
+
+ if (j < (n - n_p)) {
+ commentator().indent (report);
+ report << " A: j < (n - n_p). j_1 = j = " << j
+ << ", j_2 = j + r_1 - n + n_p = " << j + r_1 - n + n_p << std::endl;
+ // In this case, s_1 > 0, so s_3 = 0, and wrap-around cannot occur.
+
+ y_1 = setButterfly (std::vector<bool>(x.begin (), x.begin () +(ptrdiff_t) (n - n_p)), j);
+ y_2 = setButterfly (std::vector<bool>(x.begin () +(ptrdiff_t) (n - n_p), x.end ()), j + r_1 - n + n_p);
+
+ for (std::vector<bool>::iterator iter = (y_3.begin () +(ptrdiff_t) s_3);
+ iter != (y_3.begin () + (ptrdiff_t)(j + r_1 - n + n_p));
+ ++iter)
+ *iter = true;
+ }
+ else {
+ commentator().indent (report);
+ report << " A: j >= (n - n_p). j_1 = j + r - n_p - r_1 = "
+ << j + r - n_p - r_1 << ", j_2 = j - (n - n_p) = "
+ << j - (n - n_p) << std::endl;
+
+ // In this case, s_1 = 0, so s_3 >= 0, and wrap-around may occur.
+ // This case cannot occur for n != 2*n_p because j != 0.
+
+ y_1 = setButterfly (std::vector<bool>(x.begin (), x.begin () + (ptrdiff_t)(n - n_p)), j + r - n_p - r_1);
+ y_2 = setButterfly (std::vector<bool>(x.begin () + (ptrdiff_t)(n - n_p), x.end ()), j - (n - n_p));
+
+ for (std::vector<bool>::iterator iter (y_3.begin () + (ptrdiff_t)(j + r - n_p - r_1));
+ iter != (y_3.begin () + (ptrdiff_t)(n - n_p));
+ ++iter)
+ *iter = true;
+ }
+ }
+
+ // Create output vector.
+ std::vector<bool> y (y_1);
+ y.insert (y.end (), y_2.begin (), y_2.end ());
+ y.insert (y.end (), y_3.begin (), y_3.end ());
+
+ commentator().indent (report);
+ report << "The output vector for n = " << n << " has " << y.size ()
+ << " entries."
+ << " " << y_1.size () << " from the first sub-vector"
+ << " " << y_2.size () << " from the second sub-vector"
+ << " " << y_3.size () << " from recombining the two"
+ << "And the output vector y is:"
+ << "-------------------------- " << std::endl;
+
+ for (size_t i = 0; i < y.size (); ++i) {
+ commentator().indent (report);
+ report << " " << i << ": " << y[i] << std::endl;
+ }
+
+ commentator().indent (report);
+ report << "-------------------------- " << std::endl;
+
+ commentator().stop ("done");
+
+ return y;
+
+ } // std::vector<bool> setButterfly (const std::vector<bool>& x, size_t j)
+
+ //@}
+
+ // Begin cekstv switch
+
+ template <class Field> class CekstvSwitchFactory;
+
+ template <class Field>
+ class CekstvSwitch {
+ public:
+
+ /// Typedef
+ typedef typename Field::Element Element;
+ typedef CekstvSwitch<Field> Self_t;
+ typedef CekstvSwitchFactory<Field> Factory;
+
+ CekstvSwitch () {}
+
+ /** Constructor from a field and a field element.
+ * @param a vector of switches
+ */
+ CekstvSwitch (const typename Field::Element &a) :
+ _a (a)
+ {}
+
+ /** Destructor.
+ */
+ ~CekstvSwitch () {}
+
+ /** Apply switch function.
+ * Switches the elements in references according to the
+ * exchange matrix introduced in "Efficient Matrix
+ * Preconditioners for Black Box Linear Algebra" by Chen, Eberly,
+ * Kaltofen, Saunders, Turner, and Villard and the current field element
+ * specified in the switch object.
+ * @return bool true if swapped, false otherwise
+ * @param F
+ * @param x reference to first element to be switched
+ * @param y reference to second element to be switched
+ */
+ bool apply (const Field &F, Element &x, Element &y) const;
+
+ /** Apply switch transpose function.
+ * Switches the elements in references according to the
+ * transpose of the exchange matrix introduced in "Efficient Matrix
+ * Preconditioners for Black Box Linear Algebra" by Chen, Eberly,
+ * Kaltofen, Saunders, Turner, and Villard and the current field element
+ * specified in the switch object.
+ * @return bool true if swapped, false otherwise
+ * @param F
+ * @param x reference to first element to be switched
+ * @param y reference to second element to be switched
+ */
+ bool applyTranspose (const Field &F, Element &x, Element &y) const;
+
+
+ template<typename _Tp1>
+ struct rebind
+ {
+ typedef CekstvSwitch<_Tp1> other;
+
+ // special rebind operator() with two fields,
+ // indeed local field is not stored in the switch
+ void operator() (other & Ap, const Self_t& A, const _Tp1& T, const Field& F) {
+ Hom<Field, _Tp1>(F,T).image(Ap.getData(), A.getData());
+ }
+ };
+
+ typename Field::Element& getData() { return _a; }
+ const typename Field::Element& getData() const { return _a; }
+
+
+ private:
+
+ // Parameter of this 2x2 block
+ typename Field::Element _a;
+ };
+
+ template <class Field>
+ class CekstvSwitchFactory {
+ public:
+ /** Constructor from an STL vector of bools
+ */
+ CekstvSwitchFactory (typename Field::RandIter r) :
+ _r (r)
+ {}
+
+ /** Construct and return a boolean switch object
+ */
+ CekstvSwitch<Field> makeSwitch ()
+ { typename Field::Element a; return CekstvSwitch<Field> (_r.random (a)); }
+
+ private:
+
+ typename Field::RandIter _r;
+ };
+
+ template <class Field>
+ inline bool CekstvSwitch<Field>::apply (const Field &F,
+ typename Field::Element &x,
+ typename Field::Element &y) const
+ {
+ F.axpyin (x, _a, y);
+ F.addin (y, x);
+
+ return true;
+ }
+
+ template <class Field>
+ inline bool CekstvSwitch<Field>::applyTranspose (const Field &F,
+ typename Field::Element &x,
+ typename Field::Element &y) const
+ {
+ F.addin (x, y);
+ F.axpyin (y, _a, x);
+
+ return true;
+ }
+
+// End cekstv switch
+#if 0
+// Begin specialization of cekstv switch object
+ template <>
+ class CekstvSwitch<GF2>
+ {
+ public:
+ typedef GF2 Field;
+ /// Typedef
+ typedef Field::Element Element;
+ typedef CekstvSwitch<Field> Self_t;
+ typedef CekstvSwitchFactory<Field> Factory;
+
+ /** Constructor from a field and a field element.
+ * @param F field in which arithmetic is done
+ * @param switches vector of switches
+ */
+ CekstvSwitch (const Field::Element &a) :
+ _a (a)
+ {}
+
+ ~CekstvSwitch () {}
+
+ bool apply (const Field &F, Element &x, Element &y) const
+ {
+ F.axpyin (x, _a, y);
+ F.addin (y, x);
+ return true;
+ }
+
+ bool applyTranspose (const Field &F, Element &x, Element &y) const
+ {
+ F.addin (x, y);
+ F.axpyin (y, _a, x);
+ return true;
+ }
+
+ bool apply (const Field &F, stdBitReference x, stdBitReference y) const
+ {
+ F.axpyin (x, _a, y);
+ F.addin (y, x);
+ return true;
+ }
+
+ bool applyTranspose (const Field &F, stdBitReference x, stdBitReference y) const
+ {
+ F.addin (x, y);
+ F.axpyin (y, _a, x);
+ return true;
+ }
+
+ template<typename _Tp1>
+ struct rebind
+ {
+ typedef CekstvSwitch<_Tp1> other;
+
+ // special rebind operator() with two fields,
+ // indeed local field is not stored in the switch
+ void operator() (other *& Ap, const Self_t& A, const _Tp1& T, const Field& F) {
+ typename _Tp1::Element u;
+ Hom<Field, _Tp1>(F,T).image(u, A._a);
+ Ap = new other(u);
+ }
+ };
+
+
+ private:
+
+ // Parameter of this 2x2 block
+ Field::Element _a;
+ };
+
+
+// End, specialization of cekstv switch object
+#endif
+// Begin boolean switch
+
+ class BooleanSwitchFactory;
+
+ /** Boolean switch object.
+ * This is a switch predicate object that is applied
+ * to two references to elements to switch them as needed
+ * by the \ref Butterfly\ Switching\ Network\ BlackBox\ Matrix\ Object.
+ */
+ class BooleanSwitch {
+ public:
+
+ typedef BooleanSwitch Self_t;
+ typedef BooleanSwitchFactory Factory;
+
+ /** Constructor from an STL vector of booleans.
+ * The switch is applied using the vector of booleans.
+ * A true value means to swap the two elements, and a false
+ * value means not to.
+ * The apply function starts at the beginning of the vector moving
+ * forward through it, and applyTranspose function starts at the end
+ * moving backwards. Both repeat the vector after they pass through it.
+ * @param s vector of switches
+ */
+ BooleanSwitch (const bool s) :
+ _s (s)
+ {}
+
+ /** Destructor.
+ */
+ ~BooleanSwitch () {}
+
+ /** Apply switch function.
+ * Switches the elements in references according to current boolean
+ * value. Swaps the elements if boolean is true, otherwise does nothing.
+ * It is templatized by the element type to be swapped.
+ * @return bool \c true if swapped, \c false otherwise
+ * @param F
+ * @param x reference to first element to be switched
+ * @param y reference to second element to be switched
+ */
+ template <class Field>
+ bool apply (const Field &F,
+ typename Field::Element &x,
+ typename Field::Element &y) const;
+
+ /** Apply switch transpose function.
+ * Switches the elements in references according to current boolean
+ * value. Swaps the elements if boolean is true, otherwise does nothing.
+ * It is templatized by the element type to be swapped.
+ * @return bool \c true if swapped, \c false otherwise
+ * @param F
+ * @param x reference to first element to be switched
+ * @param y reference to second element to be switched
+ */
+ template <class Field>
+ bool applyTranspose (const Field &F,
+ typename Field::Element &x,
+ typename Field::Element &y) const;
+
+ template<typename _Tp1>
+ struct rebind {
+ typedef BooleanSwitch other;
+
+ };
+
+ protected:
+
+ bool _s;
+
+ }; // class boolean_switch
+
+ /** Boolean switch factory
+ *
+ * This class facilitates construction of boolean switch objects by the
+ * butterfly matrix.
+ */
+}// linbox
+namespace LinBox {
+
+ class BooleanSwitchFactory {
+ public:
+ /** Constructor from an STL vector of bools
+ */
+ BooleanSwitchFactory (const std::vector<bool> &switches) :
+ _switches (switches), _iter (switches.begin ())
+ {}
+
+ /** Construct and return a boolean switch object
+ *
+ * This function walks through the switches object given in the
+ * constructor, advancing on each invocation. It wraps around to the
+ * beginning of the vector when it reaches the end.
+ */
+ BooleanSwitch makeSwitch ()
+ {
+ if (_iter == _switches.end ())
+ _iter = _switches.begin ();
+
+ return BooleanSwitch (*_iter++);
+ }
+
+ private:
+
+ const std::vector<bool> &_switches;
+ std::vector<bool>::const_iterator _iter;
+ };
+
+ template <class Field>
+ inline bool BooleanSwitch::apply (const Field &F,
+ typename Field::Element &x,
+ typename Field::Element &y) const
+ {
+ if (_s)
+ std::swap (x, y);
+
+ return _s;
+ }
+
+ template <class Field>
+ inline bool BooleanSwitch::applyTranspose (const Field &F,
+ typename Field::Element &x,
+ typename Field::Element &y) const
+ {
+ if (_s)
+ std::swap (x, y);
+
+ return _s;
+ }
+
+// End boolean switch
+}// namespace LinBox
+
+#endif // __LINBOX_butterfly_INL
+
+
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+
diff --git a/linbox/blackbox/companion.h b/linbox/blackbox/companion.h
index 6ee04e5..0c40384 100644
--- a/linbox/blackbox/companion.h
+++ b/linbox/blackbox/companion.h
@@ -25,82 +25,90 @@
#define __LINBOX_companion_H
#include "linbox/blackbox/blackbox-interface.h"
-#include "linbox/blackbox/triplesbb.h"
+// #include "linbox/blackbox/triplesbb.h"
+#include "linbox/matrix/sparse-matrix.h"
#include <vector>
namespace LinBox
{
/** \ingroup blackbox
- \brief %Companion matrix of a monic polynomial.
- */
- template<class _Field>
- struct Companion: public TriplesBB<_Field> {
- typedef _Field Field;
+ * \brief %Companion matrix of a monic polynomial.
+ *
+ * @warning companion would be faster if built direct, using one axpy per entry: y_i = x_i-1 + p_i*x_n
+ */
+ template<class Field_>
+ struct Companion: public SparseMatrix<Field_,SparseMatrixFormat::CSR> {
+ typedef Field_ Field;
+ typedef SparseMatrix<Field,SparseMatrixFormat::CSR> Father_t;
/// This is the n by n companion matrix of a given polynomial of degree n.
template<class Polynomial>
- Companion(const Field& F =Field(), const Polynomial& P =Polynomial(1)) :
- TriplesBB<Field>(F, P.size()-1, P.size()-1)
+ Companion(const Field& F , const Polynomial& P ) :
+ Father_t(F, P.size()-1, P.size()-1)
{
size_t n = P.size() - 1;
- const size_t indexbase = 1;
- typename Field::Element one; F.init(one, 1);
for (size_t i = 1; i < n; ++i)
- this->addEntry(one, i+indexbase, i-1+indexbase);
+ this->setEntry(i, i-1, F.one);
for (size_t i = 0; i < n; ++i) {
typename Field::Element x;
- F.init(x, 0);
F.neg(x, P[i]);
- this->addEntry(x, i+indexbase, n-1+indexbase);
+ this->setEntry(i, n-1, x);
}
}// Companion cstor
-
+ /// zero matrix
+ Companion(const Field& F) :
+ Father_t(F)
+ {}
/**
* \brief This constructs a random companion matrix.
-
- Builds n by n matrix from degree n monic poly with other coefficients random.
+ *
+ * Builds n by n matrix from degree n monic poly with other coefficients random.
+ *
+ * @warning should it be a constructor ?
*/
Companion(const Field& F, size_t n,
typename Field::RandIter r ) :
- TriplesBB<Field>(F, n, n)
+ Father_t(F, n, n)
{
std::vector<typename Field::Element> p(n+1);
for (typename std::vector<typename Field::Element>::iterator i = p.begin(); i != p.end(); ++i)
r.random(*i); // we'll pretend p[n] == 1, ok?
- const size_t indexbase = 1;
- typename Field::Element one; F.init(one, 1);
- for (size_t i = 1; i < n; ++i) addEntry(one, i+indexbase, i-1+indexbase);
+ for (size_t i = 1; i < n; ++i) this->setEntry(i, i-1, F.one);
for (size_t i = 0; i < n; ++i)
{ typename Field::Element x;
- F.init(x, 0);
F.neg(x, p[i]);
- addEntry(x, i+indexbase, n-1+indexbase);
+ this->setEntry(i, n-1, x);
}
}
+ /**
+ * \brief This constructs a random companion matrix.
+ *
+ * Builds n by n matrix from degree n monic poly with other coefficients random.
+ *
+ * @warning should it be a constructor ?
+ */
Companion(const Field& F, size_t n) :
- TriplesBB<Field>(F,n,n)
+ Father_t(F,n,n)
{
typename Field::RandIter r(F);
std::vector<typename Field::Element> p(n+1);
for (typename std::vector<typename Field::Element>::iterator i = p.begin(); i != p.end(); ++i)
r.random(*i); // we'll pretend p[n] == 1, ok?
- const size_t indexbase = 1;
- typename Field::Element one; F.init(one, 1);
+ // const size_t indexbase = 1;
for (size_t i = 1; i < n; ++i)
- this->addEntry(one, i+indexbase, i-1+indexbase);
+ this->setEntry(i, i-1, F.one);
for (size_t i = 0; i < n; ++i)
{ typename Field::Element x;
- F.init(x, 0);
F.neg(x, p[i]);
- this->addEntry(x, i+indexbase, n-1+indexbase);
+ this->setEntry(i, n-1, x);
}
}
@@ -111,9 +119,10 @@ namespace LinBox
};
+ using Father_t::write;
+
- // companion would be faster if built direct, using one axpy per entry: y_i = x_i-1 + p_i*x_n
}; //Companion class
@@ -123,11 +132,10 @@ namespace LinBox
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
// Local Variables:
// mode: C++
// tab-width: 8
// indent-tabs-mode: nil
// c-basic-offset: 8
// End:
-
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/blackbox/compose.h b/linbox/blackbox/compose.h
index 9578a66..420af80 100644
--- a/linbox/blackbox/compose.h
+++ b/linbox/blackbox/compose.h
@@ -31,7 +31,7 @@
#include "linbox/util/debug.h"
#include "linbox/linbox-config.h"
#include "linbox/blackbox/blackbox-interface.h"
-#include "linbox/matrix/blas-matrix.h"
+#include "linbox/vector/blas-vector.h"
namespace LinBox
{
@@ -81,7 +81,7 @@ namespace LinBox
* @param B blackbox
*/
Compose (const Blackbox1 &A, const Blackbox2 &B) :
- _A_ptr(&A), _B_ptr(&B)
+ _A_ptr(&A), _B_ptr(&B),_z(A.field())
{
// Rich Seagraves - "It seems VectorWrapper somehow
// became depricated. Makes the assumption that
@@ -97,7 +97,7 @@ namespace LinBox
* @param B_ptr blackbox
*/
Compose (const Blackbox1 *A_ptr, const Blackbox2 *B_ptr) :
- _A_ptr(A_ptr), _B_ptr(B_ptr)
+ _A_ptr(A_ptr), _B_ptr(B_ptr),_z(A_ptr->field())
{
linbox_check (A_ptr != (Blackbox1 *) 0);
linbox_check (B_ptr != (Blackbox2 *) 0);
@@ -113,8 +113,7 @@ namespace LinBox
* @param[in] Mat blackbox to copy.
*/
Compose (const Compose<Blackbox1, Blackbox2>& Mat) :
- _A_ptr ( Mat._A_ptr), _B_ptr ( Mat._B_ptr)
- //{ VectorWrapper::ensureDim (_z, _A_ptr->coldim ()); }
+ _A_ptr ( Mat._A_ptr), _B_ptr ( Mat._B_ptr),_z(Mat.field())
{
_z.resize(_A_ptr->coldim());
}
@@ -237,7 +236,7 @@ namespace LinBox
const Blackbox2 *_B_ptr;
// local intermediate vector
- mutable std::vector<Element> _z;
+ mutable BlasVector<Field> _z;
};
/// specialization for _Blackbox1 = _Blackbox2
@@ -298,14 +297,18 @@ namespace LinBox
typename std::vector<std::vector<Element> >::reverse_iterator z_p, pz_p;
b_p = _BlackboxL.rbegin();
pz_p = z_p = _zl.rbegin();
+ typedef BlasSubvector<BlasVector<Field, typename Vector<Field>::Dense> > BSub;
+ BSub pz_p_vec(field(),*pz_p);
- (*b_p) -> apply(*pz_p, x);
+ (*b_p) -> apply(pz_p_vec, x);
++ b_p; ++ z_p;
- for (; z_p != _zl.rend(); ++ b_p, ++ z_p, ++ pz_p)
- (*b_p) -> apply (*z_p,*pz_p);
+ for (; z_p != _zl.rend(); ++ b_p, ++ z_p, ++ pz_p) {
+ BSub z_p_vec(field(),*z_p);
+ (*b_p) -> apply (z_p_vec,pz_p_vec);
+ }
- (*b_p) -> apply(y, *pz_p);
+ (*b_p) -> apply(y, pz_p_vec);
return y;
}
@@ -411,16 +414,20 @@ namespace LinBox
typedef Compose<IMatrix, IMatrix> value_type;
};
+
+ template<class Field, class Rep>
+ class BlasMatrix ;
+
/// used in smith-binary, for example
- template<class Field>
- class ComposeTraits< BlasMatrix<Field> > {
+ template<class Field, class Rep>
+ class ComposeTraits< BlasMatrix<Field, Rep> > {
public:
// define the return value type
- typedef BlasMatrix<Field> value_type;
+ typedef BlasMatrix<Field, Rep> value_type;
};
-}
+} // LinBox
namespace LinBox
@@ -460,6 +467,7 @@ namespace LinBox
*/
ComposeOwner (const Blackbox1 &A, const Blackbox2 &B) :
_A_data(A), _B_data(B)
+ ,_z(A.field())
{
// Rich Seagraves - "It seems VectorWrapper somehow
// became depricated. Makes the assumption that
@@ -474,6 +482,7 @@ namespace LinBox
*/
ComposeOwner (const Blackbox1 *A_data, const Blackbox2 *B_data) :
_A_data(*A_data), _B_data(*B_data)
+ ,_z(A_data->field())
{
linbox_check (A_data != (Blackbox1 *) 0);
linbox_check (B_data != (Blackbox2 *) 0);
@@ -490,6 +499,7 @@ namespace LinBox
*/
ComposeOwner (const ComposeOwner<Blackbox1, Blackbox2>& Mat) :
_A_data ( Mat.getLeftData()), _B_data ( Mat.getRightData())
+ ,_z(Mat.field())
{
_z.resize(_A_data.coldim());
}
@@ -555,7 +565,7 @@ namespace LinBox
ComposeOwner (const Compose<_BBt1, _BBt2> &Mat, const Field& F) :
_A_data(*(Mat.getLeftPtr()), F),
_B_data(*(Mat.getRightPtr()), F),
- _z(_A_data.coldim())
+ _z(F,_A_data.coldim())
{
typename Compose<_BBt1, _BBt2>::template rebind<Field>()(*this,Mat);
}
@@ -564,7 +574,7 @@ namespace LinBox
ComposeOwner (const ComposeOwner<_BBt1, _BBt2> &Mat, const Field& F) :
_A_data(Mat.getLeftData(), F),
_B_data(Mat.getRightData(), F) ,
- _z(_A_data.coldim())
+ _z(F,_A_data.coldim())
{
typename ComposeOwner<_BBt1, _BBt2>::template rebind<Field>()(*this,Mat);
}
@@ -611,20 +621,19 @@ namespace LinBox
Blackbox2 _B_data;
// local intermediate vector
- mutable std::vector<Element> _z;
+ mutable BlasVector<Field> _z;
};
-}
+} // LinBox
#endif // __LINBOX_compose_H
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
// Local Variables:
// mode: C++
// tab-width: 8
// indent-tabs-mode: nil
// c-basic-offset: 8
// End:
-
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/blackbox/csf.h b/linbox/blackbox/csf.h
new file mode 100644
index 0000000..5c065f7
--- /dev/null
+++ b/linbox/blackbox/csf.h
@@ -0,0 +1,491 @@
+/* linbox/blackbox/csr.h
+ * Compressed Sparse Format BB
+ * Author: Bryan Youse
+ * overhaul of ./zo.h, a CSR formatted BB for {0,1}-Matrices
+ * ------------------------------------
+ *
+ * Copyright (c) LinBox
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ * ========LICENCE========
+ *.
+ */
+
+#ifndef __LINBOX_CSF_H
+#define __LINBOX_CSF_H
+
+#include "linbox/integer.h"
+//#include "linbox/vector/vector-traits.h"
+#include "linbox/util/debug.h"
+#include "linbox/util/matrix-stream.h"
+#include "linbox/ring/modular.h"
+#include "linbox/blackbox/blackbox-interface.h"
+
+// For STL pair in IndexIterator
+#include <utility>
+#include <iterator>
+#include <vector> // For vectors in _col2row and _row2col
+#include <cstdlib> // For randomness in randomized quicksort
+#include <ctime>
+
+namespace LinBox
+{
+ /** \brief Space efficient representation of sparse matrices.
+ *
+ * Compressed Sparse Row/Column (CSR/C) involves two arrays of length NNZ (number of non-zeros)
+ * One of column indices and another of matrix values.
+ * A third array contains pointers indicating the division of the two NNZ arrays into rows.
+ * (or vice versa w/r/t rows & columns)
+ *
+ \ingroup blackbox
+ */
+
+ /*
+ bool revLexLess(const std::pair<size_t,size_t>& a, const std::pair<size_t,size_t> b)
+ { return a.second < b.second || (b.second == a.second && a.first < b.first); }
+ */
+
+ template<class _Field>
+ class CSF : public BlackboxInterface {
+ public:
+ // if these are ints, SuperLU can use the data directly
+ // otherwise they need converted from size_t (8byte v. 4byte)
+ typedef size_t Index;//int64_t Index;
+ typedef CSF<_Field> Self_t;
+ typedef _Field Field;
+ typedef typename _Field::Element Element;
+ typedef std::vector<Index> IndexVector;
+ typedef std::vector<Element> ElementVector;
+ typedef IndexVector PtrVector;
+ typedef std::pair<Index, Index> IndexPair;
+ typedef std::pair<IndexPair, Element> Triple;
+ typedef std::vector<Triple> Data;
+
+ //to denote by which way we sort our matrix
+ enum csformat { csr, csc }; //( true / false )
+
+ // DEFAULT CONSTRUCTOR, do nothing. Matrix will be uninitialized.
+ CSF(){};
+
+ // Destructor, once again do nothing
+ ~CSF(){};
+
+ // basic constructor, can be used with subsequent read.
+ CSF(const Field& F) :
+ _field(&F), sorted(true)
+ ,_rowdim(0),_coldim(0),isCSR(false)
+ {}
+
+ /* The real constructor /TODO give docs here
+ assuming entries are sorted in lexicographic order by (row,col) pair.
+ This depends on an accurate nnz being passed in.
+ Probably should change to inputting vectors sometime...
+ */
+ CSF
+ (Field& F, Index* rowP, Index* colP, Element* valP, Index rows, Index cols, Index nnz) :
+ _field(&F), _rowdim(rows), _coldim(cols), sorted(true), isCSR(true)
+ {
+ Data data;
+ for (Index i = 0; i < nnz; ++i, ++rowP, ++colP, ++valP)
+ data.push_back(Triple(IndexPair(static_cast<Index>(*rowP), static_cast<Index>(*colP)), static_cast<Element>(*valP)));
+ init(data);
+ }
+
+ /* constructor from a MatrixStream */
+ CSF( MatrixStream<Field>& ms ) :
+ _field(&(ms.getField()))
+ ,isCSR(false),sorted(false)
+ {
+ read(ms);
+ }
+
+ // copy constructor, easy enough
+ CSF(const CSF<Field>& A) :
+ _field(A._field), _inds(A._inds), _vals(A._vals), _ptrs(A._ptrs), _rowdim(A._rowdim), _coldim(A._coldim), sorted(A.sorted)
+ { }
+
+ // TODO
+#if 0
+ //switching the way in which the matrix is sorted
+ void switch_sort() const
+ {
+ //std::cout << " -- switch_sort: " << std::endl;
+ Index dim;
+
+ if( sorted ) dim = _coldim;
+ else dim = _rowdim;
+
+ //std::cout << " -- in switch sort, before allocating temp -- " << std::endl;
+ std::vector< IndexVector > temp(dim);
+ //std::cout << temp.size() << std::endl;
+ //IndexVector temp[dim]; //maybe this needs toooooo much memory space when dim is very large
+ //std::cout << " -- in switch sort, after allocating temp -- " << std::endl;
+
+ for( PtrVector::iterator i = _ptrs.begin(); i < _ptrs.end() - 1; ++i )
+ for( IndexVector::iterator j = *i; j != *(i+1); ++j )
+ temp[*j].push_back( (Index)(i - _ptrs.begin()) );
+
+ _inds.clear(); _ptrs.clear();
+ std::back_insert_iterator < std::vector<Index> > colend( _inds) ;
+ for( size_t k = 0; k < dim; ++k )
+ {
+ _ptrs.push_back( _inds.end() );
+ copy( temp[k].begin(), temp[k].end(), colend );
+ }
+
+ _ptrs.push_back( _inds.end() );
+ sorted = !sorted;
+
+ return;
+ }
+#endif
+
+/*
+ template<class OutVector, class InVector>
+ OutVector& applyTranspose(OutVector& y, const InVector& x) const; // y = ATx
+ //OutVector& applyTranspose(OutVector& y, const InVector& x); // y = ATx
+
+ template<class OutVector, class InVector>
+ OutVector& apply(OutVector& y, const InVector& x) const; // y = Ax;
+ //OutVector& apply(OutVector& y, const InVector& x); // y = Ax;
+*/
+ template<class OutVector, class InVector>
+ OutVector & apply(OutVector & y, const InVector & x) const {
+ linbox_check((y.size()==rowdim())&&(x.size()==coldim()));
+
+ FieldAXPY<Field> accum (field());
+
+ typename OutVector::iterator yp;
+ typename InVector::const_iterator xp;
+ // PtrVector::const_iterator ip;
+
+ /*
+ if( !sorted )
+ switch_sort();
+ */
+
+ xp=x.begin();
+ yp=y.begin();
+ accum.reset();
+
+ for(Index i = _ptrs[0]; (size_t)i < _ptrs.size()-1; ++i, ++yp) {
+ for(Index j = _ptrs[i]; j < _ptrs[i+1]; ++j) {
+ accum.mulacc(_vals[j], *(xp + _inds[j]) ); // y = a*x
+ }
+ accum.get(*yp);
+ accum.reset();
+ }
+
+ return y;
+ }
+
+ template<class OutVector, class InVector>
+ OutVector & applyTranspose(OutVector & y, const InVector & x) const {
+ linbox_check((y.size()==coldim())&&(x.size()==rowdim()));
+
+ for(size_t i = 0; i < y.size(); ++i) y[i] = field().zero;
+
+ for(Index i = _ptrs[0]; (size_t)i < _ptrs.size()-1; ++i) {
+ for(Index j = _ptrs[i]; j < _ptrs[i+1]; ++j) {
+ // process row i: yj += xi Aij , yindsj += xi valsj
+ field().axpyin(y[i], x[_inds[j]], _vals[j]);
+ }
+ }
+
+ return y;
+ }
+
+ Element & getEntry(Element& x, Index i, Index j) {
+ size_t k;
+ for (k = _ptrs[i]; k < _ptrs[i+1]; ++k)
+ if (_inds[k] == j) break;
+ if (k == _ptrs[i+1]) return field().assign(x, field().zero);
+ else return field().copy(x, _vals[k]);
+ }
+
+ Element & setEntry(Index i, Index j, Element& x) {
+ // data must exist.
+ data.push_back(i, j, x);
+ }
+
+ void finalize() { // from data to csf
+ init(_data);
+ }
+
+ double &d00norm(double &norm){
+ norm = 0;
+ double t;
+ // maximal row inf (OO) norm
+ for(Index i = _ptrs[0]; (size_t)i < _ptrs.size()-1; ++i) {
+ double old;
+ old = norm;
+ for(Index j = _ptrs[i]; j < _ptrs[i+1]; ++j) {
+ field().convert(t, _vals[j]);
+ norm += abs(t);
+ }
+ if (norm < old) norm = old;
+ }
+
+ return norm;
+ }
+
+ integer &hadamardBound(integer &res){
+ res = 1L;
+ integer tmp;
+
+ // product of ||A_i||_2 norms for rows A_i
+ for(Index i = _ptrs[0]; (size_t)i < _ptrs.size()-1; ++i) {
+ tmp = 0;
+ for(Index j = _ptrs[i]; j < _ptrs[i+1]; ++j) {
+ tmp += static_cast<integer>(_vals[j]) * _vals[j];
+ }
+ res *= tmp;
+ }
+
+ res = sqrt (res);
+ return res;
+ }
+
+ /** Read the matrix from a matrix stream
+ * @param ms Stream from which to read the matrix
+ */
+ void read(MatrixStream<Field> &ms)
+ {
+ Data d;
+ size_t r, c;
+ Element v;
+
+ int64_t count = 0;
+
+ ms.getDimensions( _rowdim, _coldim );
+
+ while (ms.nextTriple(r, c, v) )
+ {
+ d.push_back(Triple(IndexPair(static_cast<Index>(r), static_cast<Index>(c)), static_cast<Element>(v)));
+ ++count;
+ }
+
+ init(d);
+ }
+
+ /* Accessor methods */
+ size_t rowdim() const
+ { return _rowdim; }
+
+ size_t coldim() const
+ { return _coldim; }
+
+ // TODO generecize for csc
+ IndexVector &getRows()
+ {
+ return _ptrs;
+ }
+
+ IndexVector &getCols()
+ {
+ return _inds;
+ }
+
+ ElementVector &getVals()
+ {
+ return _vals;
+ }
+
+ std::ostream& write_summary(std::ostream& out = std::cout) const
+ {
+ out << "CSF Matrix: _inds.size() " << _inds.size();
+ out << ", _ptrs.size() " << _ptrs.size();
+ out << ", _rowdim " << _rowdim;
+ out << ", _coldim " << _coldim;
+ return out;
+ }
+
+ // helper to write out triples, essentially sms w/o header/footer
+ std::ostream& write_sms(std::ostream& out = std::cout) const {
+ Index row = 0;
+ integer val;
+ for(Index i = 0; i < _ptrs.size() - 1; ++i, ++row)
+ for(Index j = _ptrs[i]; j < _ptrs[i+1]; ++j){
+ field().convert(val, _vals[j]);
+ out << row << " " << _inds[j] << " " << val << std::endl;
+ }
+
+ return out;
+ }
+
+ // TODO generecize for CSC format
+ std::ostream& write(std::ostream& out = std::cout) const {
+ integer val;
+ // for each row
+ for(Index i=0, k=0; (size_t)i < _ptrs.size() - 1; ++i){
+ k = 0;
+ out << " [";
+ // j will be the index in _inds and _vals of data
+ for(Index j = _ptrs[i]; j < _ptrs[i+1]; ++j){
+ // print zeros up to data
+ for(; k<_inds[j]; ++k) out << " 0";
+ field().convert(val, _vals[j]);
+ // print data
+ out << " " << val;
+ ++k; // adjust zero printing counter by one
+ }
+ for(; (size_t)k<_coldim; ++k) out << " 0"; // print zeros to end
+ out << " ]";
+ }
+ out << std::endl;
+ return out;
+ }
+
+ const Field& field() const
+ {
+ return *_field;
+ }
+
+ /* Non blackbox function. Tells the number of nonzero entries */
+ size_t nnz() const
+ {
+ return _inds.size();
+ };
+
+ typedef MatrixCategories::BlackboxTag MatrixCategory;
+
+// TODO come back to these things later.
+#if 0
+ template<typename _Tp1>
+ struct rebind
+ {
+ typedef CSF<_Tp1> other;
+ void operator() (other *& Ap,
+ const Self_t& A,
+ const _Tp1& F) {
+ Ap = new other(F, A._inds, A._ptrs, A._rowdim, A._coldim, A.sorted);
+ }
+ };
+#endif
+
+ protected:
+ const Field *_field; // The field used by this class
+ IndexVector _inds; // The nnz indices sorted by row or by col
+ ElementVector _vals; // The values corresonding to nnz indices
+ PtrVector _ptrs; // the pointers to beginning of each (row/col)
+ size_t _rowdim, _coldim;
+
+ // if data is empty, matrix is ready to use.
+ Data _data;
+ bool sorted, isCSR;
+
+ class sort_data_by_col{
+ private:
+ Data _d;
+ public:
+ sort_data_by_col(Data d) : _d(d) {}
+ // col sorted
+ bool operator()(const Triple &a, const Triple &b){
+ return (a.first.second < b.first.second ||
+ (a.first.second == b.first.second && a.first.first < b.first.first));
+ }
+ };
+
+ // INITIAL
+ void init(Data& d)
+ {
+ Index nnz = d.size();
+ sort(d.begin(), d.end());
+ //sort(d.begin(), d.end(), sort_data_by_col(d));
+
+ /*
+ typename Data::iterator di = d.begin();
+ for(;di != d.end(); ++di){
+ std::cout << (*di).first.first << " " << (*di).first.second << " " << (*di).second << std::endl;
+ }
+ */
+
+ // set up _inds and _vals
+ // if CSR, matrix cols represented by _inds and rows rep. by _ptrs
+ for (Index i = 0; i < nnz; ++i){
+ if(isCSR) _inds.push_back(d[i].first.second);
+ else _inds.push_back(d[i].first.first);
+ _vals.push_back(d[i].second);
+ }
+
+ // p represents position in the index/value arrays
+ Index p = 0;
+
+ // set up _ptrs
+ _ptrs.push_back(p);
+
+ typename Data::iterator q = d.begin();
+ // for all the data we have
+ for (Index i = 0; q != d.end(); ++q, ++p){
+ // if we see a new row
+ if (i != q->first.first) {
+ // loop to encapsulate all possible "zero rows"
+ for (Index j = i; j < q->first.first; j++)
+ _ptrs.push_back(p); //add the index for the new row
+ i = q->first.first; // now we're searching against the new row
+ }
+ }
+ // lastly, a pointer to AFTER last elt.
+ _ptrs.push_back(nnz);
+
+ } // init()
+
+#if 0
+ // TODO decide between 2 copies and sort switching.
+ keep another copy is not needed if we can switch sort between row and col
+ // sort by cols first, then do the same as above
+ sort(ip.begin(), ip.end(), revLexLess);
+
+ // set up _row
+ for (Index i = 0; i < NNz; ++i)
+ _row.push_back(ip[i].first);
+
+ // set up _colP
+ p = _row.begin();
+ _colP.push_back(p);
+
+ q =ip.begin();
+ i = q->second;
+ p++;q++;
+
+ for ( ; q != ip.end(); ++q, ++p)
+ if (i != q->second)
+ {
+ for (Index j = i; j < (q+1)->second; j++)
+ _colP.push_back(p);
+ i = q->second;
+ }
+ _colP.push_back(_row.end());
+ }
+#endif
+
+ }; //CSF
+
+}//End of LinBox
+
+//#include "csf.inl"
+
+#endif // __LINBOX_CSF
+
+
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/blackbox/csf.inl b/linbox/blackbox/csf.inl
new file mode 100644
index 0000000..0d5b29d
--- /dev/null
+++ b/linbox/blackbox/csf.inl
@@ -0,0 +1,215 @@
+/*
+ * Copyright (c) LinBox
+ * Written by Bryan Youse
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ * ========LICENCE========
+ *.
+ */
+
+namespace LinBox
+{
+ template<class Field>
+ template<class OutVector, class InVector>
+ OutVector & CSF<Field>::apply(OutVector & y, const InVector & x) const
+ {
+ linbox_check((y.size()==rowdim())&&(x.size()==coldim()));
+
+ FieldAXPY<Field> accum (field());
+
+ typename OutVector::iterator yp;
+ typename InVector::const_iterator xp;
+ PtrVector::const_iterator ip;
+
+ /*
+ if( !sorted )
+ switch_sort();
+ */
+
+ xp=x.begin();
+ yp=y.begin();
+ accum.reset();
+
+ for(Index i = _ptrs[0]; (size_t)i < _ptrs.size()-1; ++i, ++yp) {
+ for(Index j = _ptrs[i]; j < _ptrs[i+1]; ++j)
+ {
+ // y = a*x
+ accum.mulacc(_vals[j], *(xp + _inds[j]) );
+ }
+ accum.get(*yp);
+ accum.reset();
+ }
+
+ return y;
+ }
+
+ /*
+ template<class Field>
+ template<class OutVector, class InVector>
+ OutVector & CSF<Field>::apply(OutVector & y, const InVector & x) const
+ //OutVector & CSF<Field>::apply(OutVector & y, const InVector & x)
+ {
+ //std::cout << endl;
+ //std::cout << " new apply pass " << endl;
+ //std::cout << this->rowdim() << " " << this->coldim() << endl;
+ //std::cout << " inside apply " << endl;
+ //std::cout << x.size() << " " << y.size() << endl;
+
+ linbox_check((y.size()==rowdim())&&(x.size()==coldim()));
+
+ FieldAXPY<Field> accum (field());
+
+ typename OutVector::iterator yp;
+ typename InVector::const_iterator xp;
+ PtrVector::const_iterator ip;
+ IndexVector::const_iterator jp;
+
+ //std::cout << " before sorting " << endl;
+
+ if( !sorted )
+ {
+ //std::cout << " -- apply: switch sort (" << _rowdim << ", " << _coldim << ", " << nnz() << ", " << sorted << " " << &(this->sorted) << ") -- " << std::endl;
+ switch_sort();
+ //std::cout << " -- apply: switch sort (" << _rowdim << ", " << _coldim << ", " << nnz() << ", " << sorted << ") -- " << std::endl;
+ }
+ //std::cout << " -- zo apply: " << this << "(" << _rowdim << ", " << _coldim << ", " << nnz() << ")" << std::endl;
+
+ xp=x.begin();
+ yp=y.begin();
+ accum.reset();
+
+ //std::cout << " before for loop " << endl;
+ //std::cout << _ptrs.end() - _ptrs.begin() << " ";
+ //std::cout << _inds.end() - _inds.begin() << endl;
+
+ //std::cout << " stupid test here " << (*_ptrs.begin()) - _inds.begin() << endl;
+ //cout << &_inds << " of size ";
+ //cout << sizeof(_inds) << " ";
+ //cout << &(*_inds.begin()) << endl;
+
+ for(ip = _ptrs.begin(); ip !=_ptrs.end()-1; ++ip, ++yp)
+ //for(ip = _ptrs.begin(); ip < _ptrs.end()-2; ++ip, ++yp) // zigzag way
+ {
+ //std::cout << " inside the outer for loop " << ip - _ptrs.begin() << endl;
+ for(jp = *ip; jp !=*(ip + 1); ++jp)
+ {
+ //std::cout << jp - _inds.begin() << endl;
+ accum.accumulate_special( *(xp + *jp) );
+ }
+ //std::cout << " accumulate is done for one iteration " << endl;
+ //std::cout << " before accum.get " << yp - y.begin() << endl;
+ accum.get(*yp);
+ //std::cout << " before accum.reset " << endl;
+ accum.reset();
+
+ // /// zigzag way
+ ++ip;++yp;
+
+ for(jp = *(ip + 1); jp >*ip; --jp)
+ accum.accumulate_special( *(xp + *(jp-1)) );
+ accum.get(*yp);
+ accum.reset();
+
+
+ }
+
+ return y;
+ }
+*/
+
+
+ /* if you want to keep two copies for the matrix, one of which is sorted by row,
+ * the other by column, then you want to use this applyTranspose function. In
+ * this case, un-comment this one and comment out the applyTranspose further down
+ */
+ /*
+ template<class Field>
+ template<class OutVector, class InVector>
+ OutVector & CSF<Field>::applyTranspose(OutVector & y, const InVector & x) const
+ {
+ linbox_check((y.size()==coldim())&&(x.size()==rowdim()));
+
+ FieldAXPY<Field> accum (field());
+
+ typename OutVector::iterator yp;
+ typename InVector::const_iterator xp;
+ PtrVector::const_iterator ip;
+ IndexVector::const_iterator jp;
+
+ xp=x.begin();
+ yp=y.begin();
+ accum.reset();
+
+ for(ip = _colP.begin(); ip < _colP.end()-1; ++ip, ++yp)
+ {
+ for(jp = *ip; jp <*(ip + 1); ++jp)
+ accum.accumulate_special( *(xp + *jp) );
+ accum.get(*yp);
+ accum.reset();
+ }
+
+ return y;
+
+ }
+ */
+
+#if 0
+ template<class Field>
+ template<class OutVector, class InVector>
+ OutVector & CSF<Field>::applyTranspose(OutVector & y, const InVector & x) const
+ {
+ linbox_check((y.size()==coldim())&&(x.size()==rowdim()));
+
+ FieldAXPY<Field> accum (field());
+
+ typename OutVector::iterator yp;
+ typename InVector::const_iterator xp;
+ PtrVector::const_iterator ip;
+ IndexVector::const_iterator jp;
+
+ xp=x.begin();
+ yp=y.begin();
+ accum.reset();
+
+ if( sorted )
+ //{
+ //std::cout << " -- in apply transpose, before switch sort -- " << std::endl;
+ switch_sort();
+ //std::cout << " -- in apply transpose, after switch sort -- " << std::endl;
+ //}
+
+ for(ip = _ptrs.begin(); ip < _ptrs.end()-1; ++ip, ++yp)
+ {
+ for(jp = *ip; jp <*(ip + 1); ++jp)
+ accum.accumulate_special( *(xp + *jp) );
+ accum.get(*yp);
+ accum.reset();
+ }
+ return y;
+ }
+#endif
+}//End of LinBox
+
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+
diff --git a/linbox/blackbox/dense-zero-one.h b/linbox/blackbox/dense-zero-one.h
new file mode 100644
index 0000000..1e3fdf8
--- /dev/null
+++ b/linbox/blackbox/dense-zero-one.h
@@ -0,0 +1,405 @@
+/* linbox/blackbox/dense-zero-one.h
+ * Copyright (c) LinBox
+ * written by Nick Messina <nmessina at cis.udel.edu>
+ *
+ * -----------------------------------------------------
+ *
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ * ========LICENCE========
+ *.
+ */
+
+#ifndef __LINBOX_dense_zero_one_H
+#define __LINBOX_dense_zero_one_H
+
+
+
+#include <iostream>
+//#include "linbox/field/hom.h"
+#include "linbox/linbox-config.h"
+#include <vector>
+#include "linbox/blackbox/blackbox-interface.h"
+
+
+//const size_t SIZE = sizeof(LinBox::uint64_t) * 8;
+#define SIZE (sizeof(uint64_t) * 8)
+
+
+namespace LinBox
+{
+
+ template <class _MatrixDomain>
+ class DenseZeroOne : public BlackboxInterface {
+
+ public:
+
+ // The following two typedefs are not useful in LinBox yet, as matrix domains aren't yet defined
+ typedef _MatrixDomain MatrixDomain;
+ typedef typename MatrixDomain::Scalar Scalar;
+ typedef typename MatrixDomain::Block Block;
+ typedef MatrixDomain Field;
+
+ typedef uint64_t PackedUnit;
+ typedef DenseZeroOne<MatrixDomain> Self_t;
+
+ /* Notes:
+ * _rows gives the number of rows of PackedUnits
+ * _cols gives the number of bits in each row */
+
+ DenseZeroOne(MatrixDomain MD, size_t m, size_t n) :
+ _MD(MD), _rows(m), _cols(n)
+ {
+ _valPerWord = SIZE;
+ _mask = 1;
+ _rep.resize( _rows * ( ((_cols-1)/_valPerWord) + 1));
+ }
+
+ DenseZeroOne(const Self_t & other) :
+ _MD(other._MD), _rows(other._rows), _cols(other._cols), _valPerWord(other._valPerWord), _rep(other._rep), _mask(other._mask)
+ {}
+
+ /* Constructor for making the blackbox out of a vector of PackedUnits.
+ * Note that if the vector given is too short for given size(m by n),
+ * the blackbox is enlarged and padded by 0's added after the given vector.
+ * If the vector given is too large, the blackbox truncates this vector
+ * to the appropriate number of PackedUnits. */
+ template <class Vector>
+ DenseZeroOne(MatrixDomain MD, size_t m, size_t n, Vector & v) :
+ _MD(MD), _rows(m), _cols(n)
+ {
+ _valPerWord = SIZE;
+ _mask = 1;
+ _rep = v;
+ _rep.resize( _rows * ( ((_cols-1)/_valPerWord) + 1));
+ }
+
+
+ Scalar & getEntry(Scalar & x, size_t i, size_t j) const
+ {
+ //Get all index values needed.
+ size_t unitNum = i*(_rep.size()/_rows) + (j/_valPerWord); //Starts from 0
+ size_t bitPlace = (j%_valPerWord) + 1; //Starts from 1
+
+ _MD.init(x, (_rep[unitNum] >> (_valPerWord - bitPlace) ) & _mask );
+ return x;
+ }
+
+ void setEntry(size_t i, size_t j, const Scalar & x)
+ {
+ //Get all index values needed.
+ size_t unitNum = i*(_rep.size()/_rows) + (j/_valPerWord); //Starts from 0
+ size_t bitPlace = (j%_valPerWord) + 1; //Starts from 1
+
+ PackedUnit y = 0;
+ if (_MD.isOne(x))
+ y = 1;
+
+ _rep[unitNum] &= ~(_mask << (_valPerWord - bitPlace));
+ _rep[unitNum] |= (y << (_valPerWord - bitPlace));
+ }
+
+ //Apply Variants
+
+ // matrix-vector product
+ template <class OutVector, class InVector>
+ OutVector & apply(OutVector & y, const InVector & x) const
+ {
+ Scalar sum = 0;
+ std::vector<PackedUnit>::const_iterator p = _rep.begin();
+ typename InVector::const_iterator xp = x.begin();
+
+ for(size_t yi = 0; yi != _rows; ++yi){
+ // for(; xp != x.end(); ++p)
+ for(; p != _rep.begin() + ((yi+1) * (_rep.size()/_rows)); ++p){
+ for(PackedUnit mask = _mask << (_valPerWord -1); (mask!=0) && (xp!=x.end()); mask>>=1){
+ if(mask & (*p))
+ _MD.addin(sum, (*xp));
+ ++xp;
+ }
+ }
+ y[yi] = sum;
+ sum = 0;
+ xp = x.begin();
+ }
+
+ return y;
+ }
+
+
+ //vector-matrix product
+ template <class OutVector, class InVector>
+ OutVector & applyTranspose(OutVector & y, const InVector & x) const
+ {
+ Scalar sum = 0;
+ std::vector<PackedUnit>::const_iterator p = _rep.begin();
+ typename InVector::const_iterator xp = x.begin();
+ PackedUnit mask = _mask << (_valPerWord - 1);
+
+ for(size_t yi = 0; yi != _cols; ++yi){
+ for(; xp != x.end(); ++xp, p+=(_rep.size()/_rows)){
+ if(mask & (*p))
+ _MD.addin(sum, (*xp));
+ }
+ y[yi] = sum;
+ sum = 0;
+ xp = x.begin();
+ p = _rep.begin() + ((yi+1)/_valPerWord);
+ mask >>= 1;
+ if(mask == 0)
+ mask = _mask << (_valPerWord - 1);
+ }
+
+ return y;
+ }
+
+
+ //Block apply
+ Block & apply(Block & Y, Block & X) const
+ {
+ //Let i,j represent current spot in BB, used for Block constructions
+ std::vector<PackedUnit>::const_iterator p = _rep.begin();
+ size_t j = 0;
+ _MD.zero(Y);
+ Block x(X.field(),1, X.coldim()), y(Y.field(),1, Y.coldim());
+
+ for(size_t i = 0; i != _rows; ++i){
+ //! @bug submatrix ?
+ Y.subBlock(y,i,0,1,Y.coldim());
+
+ for(; p != _rep.begin() + ((i+1) * (_rep.size()/_rows)); ++p){
+ for(PackedUnit mask = _mask << (_valPerWord - 1); (mask!=0) && (j != _cols); mask>>=1, ++j){
+ if(mask & (*p))
+ _MD.addin(y, X.subBlock(x,j,0,1,X.coldim()));
+ }
+ }
+ j = 0;
+ }
+
+ return Y;
+ }
+
+
+ //Block applyTranspose
+ Block & applyTranspose(Block & Y, Block & X) const
+ {
+ //Traverse the BB by going through each column.
+ //When BB[i,j] = 1, add the ith column of X
+ //to the jth column of Y
+
+ std::vector<PackedUnit>::const_iterator p = _rep.begin();
+ PackedUnit mask = _mask << (_valPerWord - 1);
+ _MD.zero(Y);
+ Block x(X.rowdim(),1), y(Y.rowdim(),1);
+
+ for(size_t j = 0; j != _cols; ++j){
+ Y.subBlock (y,0,j,Y.rowdim(),1);
+ for(size_t i = 0; i != _rows; ++i, p+=(_rep.size()/_rows)){
+ if(mask & (*p))
+ _MD.addin(y, X.subBlock(x,0,i,X.rowdim(),1));
+ }
+ p = _rep.begin() + ((j+1)/_valPerWord);
+ mask >>= 1;
+ if(mask == 0)
+ mask = _mask << (_valPerWord - 1);
+ }
+
+ return Y;
+ }
+
+
+ //Unpacking apply
+ Block & unpackingApply(Block & Out, Block & In, const size_t U = 1024)
+ {
+ _MD.zero(Out);
+ Block A, B, C;
+ size_t iend, jend, kend;
+
+ for(size_t i = 0; i < _rows; i += U){
+ if(i + U >= _rows) iend = _rows - i;
+ else iend = U;
+
+ for(size_t j = 0; j < In.coldim(); j += U){
+ if (j + U >= In.coldim()) jend = In.coldim() - j;
+ else jend = U;
+
+ Out.subBlock(C,i,j,iend,jend);
+ for(size_t k = 0; k < _cols; k += U){
+ if(k + U >= _cols) kend = _cols - k;
+ else kend = U;
+
+ expandBlock(A,i,k,iend,kend);
+ In.subBlock(B,k,j,kend,jend);
+ _MD.axpyin(C, A, B);
+ }
+ }
+ }
+
+ return Out;
+ }
+
+
+ //Unpacking applyTranspose
+ Block & unpackingApplyTranspose(Block & Out, Block & In, const size_t U = 1024)
+ {
+ _MD.zero(Out);
+ Block A, B, C;
+ size_t iend, jend, kend;
+
+ for(size_t i = 0; i < In.rowdim(); i += U){
+ if(i + U >= In.rowdim()) iend = In.rowdim() - i;
+ else iend = U;
+
+ for(size_t j = 0; j < _cols; j += U){
+ if (j + U >= _cols) jend = _cols - j;
+ else jend = U;
+
+ Out.subBlock(C,i,j,iend,jend);
+ for(size_t k = 0; k < _rows; k += U){
+ if(k + U >= _rows) kend = _rows - k;
+ else kend = U;
+
+ expandBlock(A,k,j,kend,jend);
+ In.subBlock(B,i,k,iend,kend);
+ _MD.axpyin(C, B, A);
+ }
+ }
+ }
+
+ return Out;
+ }
+
+
+ size_t rowdim() const {return _rows;}
+
+ size_t coldim() const {return _cols;}
+
+ MatrixDomain domain() const {return _MD;}
+
+ Field field() const {return _MD;}
+
+ /* Note that if the user calls the following function outside of the range of the
+ * blackbox, the block returned is padded with zeros for out of range values of the blackbox.
+ */
+ Block & expandBlock(Block & Out, const size_t i, const size_t j, const size_t numRows, const size_t numCols)
+ {
+ //Check size, and resize if necessary
+ if ( (Out.rowdim() != numRows) || (Out.coldim() != numCols) )
+ Out.resize(numRows, numCols);
+
+ //Index values
+ size_t unitNum = i*(_rep.size()/_rows) + (j/_valPerWord); //Starts from 0
+ size_t bitPlace = (j%_valPerWord) + 1; //Starts from 1
+
+ std::vector<PackedUnit>::const_iterator p;
+ size_t outRow = 0;
+ size_t outCol = 0;
+ Scalar x;
+ size_t bp = bitPlace;
+
+ for(;outRow != numRows; ++outRow){
+ p = _rep.begin() + unitNum + outRow*(_rep.size()/_rows);
+ if(i + outRow >= _rows){
+ for(; outCol != numCols; ++outCol)
+ Out.setEntry(outRow, outCol, _MD._zro);
+ }
+
+ else{
+ for(; outCol != numCols; ++p){
+ for(; (bp != _valPerWord + 1) && (outCol != numCols); ++bp){
+ if (j + outCol >= _cols) x = _MD._zro;
+ else _MD.init(x, ((*p) >> (_valPerWord - bp)) & _mask);
+ Out.setEntry(outRow, outCol, x);
+ ++outCol;
+ }
+ bp = 1;
+ }
+ }
+
+ bp = bitPlace;
+ outCol = 0;
+ }
+
+ return Out;
+ }
+
+ std::ostream & write(std::ostream & os, Block & B)
+ {
+ Scalar x;
+ for(size_t i = 0; i!= B.rowdim(); ++i){
+ for(size_t j = 0; j!= B.coldim(); ++j)
+ os << B.getEntry(x,i,j) << ' ';
+ os << std::endl;
+ }
+
+ return os;
+ }
+
+ std::ostream & write(std::ostream & os)
+ {
+ Scalar x;
+ for(size_t i = 0; i != _rows; ++i){
+ for(size_t j = 0; j!= _cols; ++j){
+ os << getEntry(x,i,j) << ' ';
+ }
+ os << std::endl;
+ }
+ return os;
+ }
+
+
+ /** @todo Functions that should be written:
+ * read()
+ * rebind()
+ */
+
+ private:
+
+ //Field which blackbox is over
+ MatrixDomain _MD;
+
+ //Number of rows and columns of the matrix
+ size_t _rows, _cols;
+
+ //Number of bits in a PackedUnit
+ size_t _valPerWord;
+
+ //Representation of the matrix
+ std::vector<PackedUnit> _rep;
+
+ //Mask used
+ PackedUnit _mask;
+
+
+
+ }; // class Dense01Blackbox
+
+} // namespace LinBox
+
+#endif // __LINBOX_dense_zero_one_H
+
+
+
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+
diff --git a/linbox/blackbox/diagonal-gf2.h b/linbox/blackbox/diagonal-gf2.h
index d613e98..84c2da4 100644
--- a/linbox/blackbox/diagonal-gf2.h
+++ b/linbox/blackbox/diagonal-gf2.h
@@ -57,14 +57,14 @@ namespace LinBox
typedef BlackboxArchetype Blackbox;
typedef bool Element;
- Diagonal (const Field &, const BitVector &y) :
- _v (y)
+ Diagonal (const Field & F, const BitVector &y) :
+ _field(&F), _v (y)
{}
/// The field.
const Field& field() const
{
- return *(new GF2());
+ return *_field;
}
Blackbox *clone() const
@@ -127,7 +127,9 @@ namespace LinBox
return (i==j?x=this->_v[i]:x=false);
}
- private:
+ protected:
+
+ const Field *_field;
// Bit vector of elements
BitVector _v;
diff --git a/linbox/blackbox/diagonal.h b/linbox/blackbox/diagonal.h
index 24e6321..96ec5dd 100644
--- a/linbox/blackbox/diagonal.h
+++ b/linbox/blackbox/diagonal.h
@@ -45,9 +45,16 @@
#include <vector>
#include "linbox/vector/vector-traits.h"
+#include "linbox/vector/blas-vector.h"
#include "linbox/util/debug.h"
#include "linbox/linbox-config.h"
#include "linbox/field/hom.h"
+#include "linbox/solutions/solution-tags.h"
+#include "linbox/util/matrix-stream.h"
+#include "linbox/util/write-mm.h"
+#include "linbox/matrix/dense-matrix.h"
+#include "linbox/matrix/matrix-domain.h"
+#include "linbox/blackbox/fibb.h"
// Namespace in which all LinBox library code resides
namespace LinBox
@@ -80,29 +87,46 @@ namespace LinBox
* and partial template specialization.
*/
template<class Field, class Trait = typename VectorTraits<typename
- LinBox::Vector<Field>::Dense>::VectorCategory > class Diagonal {
+ LinBox::Vector<Field>::Dense>::VectorCategory >
+ class Diagonal {
private:
/// empty constructor
- Diagonal () {} };
+ Diagonal () {}
+ };
/**
\brief Specialization of Diagonal for application to dense vectors
*/
template <class _Field>
- class Diagonal<_Field, VectorCategories::DenseVectorTag> {
+ class Diagonal<_Field, VectorCategories::DenseVectorTag>
+ : public FIBB<_Field> {
typedef Diagonal<_Field, VectorCategories::DenseVectorTag> Self_t;
public:
- typedef _Field Field;
- typedef typename Field::Element Element;
+ using Father_t = FIBB<_Field>;
+ using Field = _Field;
+ using Element = typename Father_t::Element;
+ using Matrix = typename Father_t::Matrix;
+ using Vector_t = BlasVector<Field>;
+
+ /// \brief cstor ready for a read.
+ Diagonal(const Field &F) :
+ _field(&F)
+ , _n(0)
+ , _v(F)
+ {}
/// \brief cstor from vector of elements.
- Diagonal(const Field F, const std::vector<typename Field::Element>& v);
+ // Diagonal(const Field &F, const std::vector<typename Field::Element>& v);
+
+ Diagonal(const Vector_t& v);
// construct random nonsingular n by n diagonal matrix.
- Diagonal(const Field F, const size_t n, bool nonsing=true);
+ Diagonal(const Field &F, const size_t n, bool nonsing=true);
+
+ Diagonal(const Field &F, const size_t n, typename Field::RandIter& iter);
- Diagonal(const Field F, const size_t n, typename Field::RandIter& iter);
+ ~Diagonal(){}
template <class OutVector, class InVector>
OutVector &apply (OutVector &y, const InVector &x) const;
@@ -110,6 +134,16 @@ namespace LinBox
template <class OutVector, class InVector>
OutVector &applyTranspose (OutVector &y, const InVector &x) const { return apply (y, x); }
+ virtual Matrix& applyRight(Matrix& Y, const Matrix& X) const // Y = AX
+ { MatrixDomain<Field> MD(field());
+ return MD.mul(Y, *this, X);
+ }
+
+ Matrix& applyLeft(Matrix& Y, const Matrix& X) const // Y = AX
+ { MatrixDomain<Field> MD(field());
+ return MD.mul(Y, X, *this);
+ }
+
size_t rowdim(void) const { return _n; }
size_t coldim(void) const { return _n; }
@@ -118,7 +152,7 @@ namespace LinBox
void randomNonsingular();
/// \brief the field of the entries
- const Field& field() const{ return _field; }
+ const Field& field() const{ return *_field; }
/** Get an entry and store it in the given value.
* This form is more in the LinBox style and is provided for interface
@@ -128,10 +162,19 @@ namespace LinBox
* @param j Column index
* @return Reference to x
*/
- Element &getEntry (Element &x, size_t i, size_t j) const {
- return (i==j?_field.assign(x,_v[i]):_field.init(x,0));
+ Element &getEntry (Element &x, size_t i, size_t j) const
+ {
+ return (i==j?field().assign(x,_v[i]):field().assign(x,field().zero));
}
+ /** (i,i) entry is set to x.
+ *
+ * could throw error if j != i, but now j is ignored.
+ */
+ void setEntry (size_t i, size_t j, const Element &x)
+ {
+ _v[i] = x;
+ }
template<typename _Tp1>
struct rebind {
@@ -142,8 +185,8 @@ namespace LinBox
Hom<typename Self_t::Field, _Tp1> hom(A.field(), Ap.field());
- typename std::vector<typename _Tp1::Element>::iterator nit = Ap.getData().begin();
- typename std::vector<Element>::const_iterator oit = A.getData().begin();
+ typename BlasVector<_Tp1>::iterator nit = Ap.getData().begin();
+ typename Vector_t::const_iterator oit = A.getData().begin();
for( ; oit != A.getData().end() ; ++nit, ++oit)
hom.image (*nit, *oit);
}
@@ -152,34 +195,199 @@ namespace LinBox
template<typename _Tp1, typename _Vc1>
Diagonal(const Diagonal<_Tp1,_Vc1>& D, const Field& F) :
- _field(F), _n(D.rowdim()), _v(D.rowdim())
+ _field(&F), _n(D.rowdim()), _v(F,D.rowdim())
{
typename Diagonal<_Tp1,_Vc1>::template rebind<Field>() (*this, D);
}
+ std::ostream& write(std::ostream& os) const
+ {
+ writeMMCoordHeader(os, *this, rowdim(), "Diagonal");
+ for (size_t i = 0; i < rowdim(); ++i)
+ field().write(os << i + 1 << " " << i + 1 << " ", _v[i]) << std::endl;
+ return os;
+ }
+ std::istream& read(std::istream& is)
+ {
+ MatrixStream<Field> ms(field(), is);
+ size_t c, i, j;
+ if( !ms.getDimensions(_n, c) || c != _n )
+ throw ms.reportError(__FUNCTION__,__LINE__);
+ Element x; field().assign(x, field().zero);
+ _v.resize(_n);
+ for (size_t k = 0; k < _n; ++ k) {
+ ms.nextTriple(i, j, x);
+ if (i != j) throw ms.reportError(__FUNCTION__,__LINE__);
+ setEntry(i, j, x);
+ }
+ return is;
+ }
+ Diagonal ( MatrixStream<Field>& ms ):
+ _field(&ms.field())
+ ,_n(0)
+ ,_v(ms.field())
+ {
+ size_t c, i, j;
+ if( !ms.getDimensions(_n, c) || c != _n )
+ throw ms.reportError(__FUNCTION__,__LINE__);
+ Element x; field().assign(x, field().zero);
+ _v.resize(_n);
+ for (size_t k = 0; k < _n; ++ k) {
+ ms.nextTriple(i, j, x);
+ if (i != j) throw ms.reportError(__FUNCTION__,__LINE__);
+ setEntry(i, j, x);
+ }
+ }
- std::ostream& write(std::ostream& out) {
- out << "diag(";
- for (typename std::vector<Element>::iterator p = _v.begin(); p != _v.end(); ++p)
- _field.write(out, *p) << ", ";
- return out << "\b\b)";
+ const Vector_t& getData() const { return _v; }
+ Vector_t& getData() { return _v; }
+
+/* FIBB functions */
+/* rank, det, solveRight, solveLeft, solveMPRight, solveMPLeft,
+nullspaceRandomRight, nullspaceRandomLeft, nullspaceBasisRight, nullspaceBasisLeft */
+
+BBType bbTag() const { return diagonal; }
+
+size_t& rank(size_t& r) const
+{ // assuming square
+ r = 0;
+ Element x; field().init(x);
+ size_t n = (rowdim() > coldim()) ? rowdim() : coldim();
+ for (size_t i = 0; i < n; ++i)
+ if (not field().isZero(getEntry(x,i,i))) r++;
+ return r;
+}
+
+Element& det( Element& d) const
+{ if (rowdim() != coldim()) return d = field().zero;
+ Element x; field().init(x);
+ d = field().one;
+ for (size_t i = 0; i < rowdim(); ++i)
+ field().mulin(d, getEntry(x,i,i));
+ return d;
+}
+
+Matrix& solveRight(Matrix& Y, const Matrix& X) const
+{ return solveMPRight(Y, X);
+}
+
+Matrix& solveLeft(Matrix& Y, const Matrix& X) const
+{ return solveMPLeft(Y, X);
+}
+
+Matrix& solveMPRight(Matrix& Y, const Matrix& X) const
+{ BlasMatrixDomain<Field> MD(field());
+ Element x; field().init(x);
+ Element y; field().init(y);
+ Element d; field().init(d);
+ Y.zero();
+ for (size_t i = 0; i < coldim(); ++ i)
+ { if ( ! field().isZero( getEntry(x, i, i) ) )
+ {// Todo: do this as a matrix (or vector) level operation
+ field().inv(d, x);
+ for (size_t j = 0; j < X.coldim(); ++ j)
+ Y.setEntry(i,j, field().mul(y, d, X.getEntry(x, i, j)));
+ /* this causes a deallocation error ??
+ Matrix Xrow(X, i, 0, 1, coldim());
+ Matrix Yrow(Y, i, 0, 1, coldim());
+ // there should be a scalar mul!
+ Matrix S(field(), 1, 1);
+ S.setEntry(0,0,field().invin(x));
+ MD.mul(Yrow, S, Xrow);
+ */
+ }
+ }
+ return Y;
+}
+
+Matrix& solveMPLeft(Matrix& Y, const Matrix& X) const
+{ BlasMatrixDomain<Field> MD(field());
+ Element x; field().init(x);
+ Element y; field().init(y);
+ Element d; field().init(d);
+ Y.zero();
+ for (size_t j = 0; j < rowdim(); ++ j)
+ { if (! field().isZero( getEntry(x, j, j) ) )
+ {// Todo: do this as a matrix (or vector) level operation
+ field().inv(d, x);
+ for (size_t i = 0; i < X.rowdim(); ++ i)
+ Y.setEntry(i,j, field().mul(y, d, X.getEntry(x, i, j)));
+ /* this causes a deallocation error ??
+ Matrix Xcol(X, 0, j, rowdim(), 1);
+ Matrix Ycol(Y, 0, j, rowdim(), 1);
+ Matrix S(field(), 1, 1);
+ S.setEntry(0,0,field().invin(x));
+ MD.mul(Ycol, Xcol, S);
+ */
+ }
+ }
+ return Y;
+}
+
+Matrix& nullspaceRandomRight(Matrix& N) const
+{ N.zero();
+ Element x; field().init(x);
+ for (size_t i = 0; i < rowdim(); ++ i)
+ { getEntry(x, i, i);
+ if (field().isZero(x))
+ { Matrix Nrow(N, i, 0, 1, N.coldim());
+ Nrow.random();
+ }
+ }
+ return N;
+}
+
+Matrix& nullspaceRandomLeft(Matrix& N) const
+{ N.zero();
+ Element x; field().init(x);
+ for (size_t i = 0; i < rowdim(); ++ i)
+ { getEntry(x, i, i);
+ if (field().isZero(x))
+ { Matrix Ncol(N, 0, i, N.rowdim(), 1);
+ Ncol.random();
}
+ }
+ return N;
+}
+
+BlasMatrix<Field>& nullspaceBasisRight(BlasMatrix<Field>& N) const
+{ size_t n = coldim(), r; rank(r);
+ N.resize(rowdim(), n-r, field().zero);
+ Element x; field().init(x);
+ size_t k = 0;
+ for (size_t i = 0; i < N.coldim(); ++i)
+ { if (field().isZero( getEntry(x,i,i) ))
+ N.setEntry(i,k++, field().one);
+
+ }
+ return N;
+}
+
+BlasMatrix<Field>& nullspaceBasisLeft(BlasMatrix<Field>& N) const
+{ size_t m = rowdim(), r; rank(r);
+ N.resize(m-r, coldim(), field().zero);
+ Element x; field().init(x);
+ size_t k = 0;
+ for (size_t i = 0; i < N.rowdim(); ++i)
+ { if (field().isZero( getEntry(x,i,i) ))
+ N.setEntry(i,k++, field().one);
- const std::vector<Element>& getData() const { return _v; }
- std::vector<Element>& getData() { return _v; }
+ }
+ return N;
+}
- private:
+ protected:
// Field for arithmetic
- Field _field;
+ const Field *_field;
// Number of rows and columns of square matrix.
size_t _n;
// STL vector of field elements used in applying matrix.
- std::vector<Element> _v;
+ Vector_t _v;
}; // template <Field, Vector> class Diagonal<DenseVectorTag>
@@ -194,10 +402,13 @@ namespace LinBox
typedef _Field Field;
typedef typename Field::Element Element;
+ typedef BlasVector<Field> Vector_t;
- Diagonal(const Field F, const std::vector<typename Field::Element>& v);
+ // Diagonal(const Field &F, const std::vector<typename Field::Element>& v);
- Diagonal(const Field F, const size_t n, typename Field::RandIter& iter);
+ Diagonal(const Vector_t& v);
+
+ Diagonal(const Field &F, const size_t n, typename Field::RandIter& iter);
template<class OutVector, class InVector>
OutVector& apply(OutVector& y, const InVector& x) const;
@@ -207,7 +418,7 @@ namespace LinBox
size_t rowdim(void) const { return _n; }
size_t coldim(void) const { return _n; }
- const Field& field() const {return _field;}
+ const Field& field() const {return *_field;}
/** Get an entry and store it in the given value.
* This form is more in the LinBox style and is provided for interface
* compatibility with other parts of the library
@@ -218,7 +429,7 @@ namespace LinBox
*/
Element &getEntry (Element &x, size_t i, size_t j) const
{
- return (i==j?_field.assign(x,_v[i]):_field.init(x));
+ return (i==j?field().assign(x,_v[i]):field().init(x));
}
@@ -241,27 +452,27 @@ namespace LinBox
template<typename _Tp1, typename _Vc1>
Diagonal(const Diagonal<_Tp1,_Vc1>& D, const Field& F) :
- _field(F), _n(D.rowdim()), _v(D.rowdim())
+ _field(&F), _n(D.rowdim()), _v(D.rowdim())
{
typename Diagonal<_Tp1,_Vc1>::template rebind<Field>() (*this, D, F);
}
- const std::vector<Element>& getData() const { return _v; }
- std::vector<Element>& getData() { return _v; }
+ const Vector_t& getData() const { return _v; }
+ Vector_t& getData() { return _v; }
- private:
+ protected:
// Field for arithmetic
- Field _field;
+ const Field *_field;
// Number of rows and columns of square matrix.
size_t _n;
// STL vector of field elements used in applying matrix.
- std::vector<Element> _v;
+ Vector_t _v;
}; // template <Field, Vector> class Diagonal<SparseSequenceVectorTag>
@@ -277,10 +488,12 @@ namespace LinBox
typedef _Field Field;
typedef typename Field::Element Element;
+ typedef BlasVector<Field> Vector_t;
+
- Diagonal(const Field F, const std::vector<typename Field::Element>& v);
+ Diagonal(const Vector_t& v);
- Diagonal(const Field F, const size_t n, typename Field::RandIter& iter);
+ Diagonal(const Field &F, const size_t n, typename Field::RandIter& iter);
template<class OutVector, class InVector>
OutVector& apply(OutVector& y, const InVector& x) const;
@@ -291,7 +504,7 @@ namespace LinBox
size_t rowdim(void) const { return _n; }
size_t coldim(void) const { return _n; }
- const Field field() const { return _field; }
+ const Field field() const { return *_field; }
/** Get an entry and store it in the given value.
* This form is more in the LinBox style and is provided for interface
@@ -303,7 +516,7 @@ namespace LinBox
*/
Element &getEntry (Element &x, size_t i, size_t j) const
{
- return (i==j?_field.assign(x,_v[i]):_field.init(x));
+ return (i==j?field().assign(x,_v[i]):field().init(x));
}
@@ -330,31 +543,32 @@ namespace LinBox
typename Diagonal<_Tp1,_Vc1>::template rebind<Field>() (*this, D, F);
}
- const std::vector<Element>& getData() const { return _v; }
- std::vector<Element>& getData() { return _v; }
+ const Vector_t& getData() const { return _v; }
+ Vector_t& getData() { return _v; }
- private:
+ protected:
// Field for arithmetic
- Field _field;
+ const Field *_field;
// Number of rows and columns of square matrix.
size_t _n;
// STL vector of field elements used in applying matrix.
- std::vector<Element> _v;
+ Vector_t _v;
}; // template <Field, Vector> class Diagonal<SparseAssociativeVectorTag>
// Method implementations for dense vectors
/// constructor from vector
template <class Field>
- inline Diagonal<Field, VectorCategories::DenseVectorTag >::Diagonal(const Field F,
- const std::vector<typename Field::Element>& v) :
- _field(F), _n(v.size()), _v(v)
- {}
+ inline Diagonal<Field, VectorCategories::DenseVectorTag >::Diagonal( const Vector_t& v) :
+ _field(&v.field()), _n(v.size()), _v(v)
+ {
+ // std::cout << _v.size() << ',' << _v.getPointer() << std::endl;
+ }
/*!
@@ -364,13 +578,12 @@ namespace LinBox
* @param nonsing non-singular matrix ? (no zero on diagonal ?)
*/
template <class _Field>
- inline Diagonal<_Field, VectorCategories::DenseVectorTag>::Diagonal(const Field F,
+ inline Diagonal<_Field, VectorCategories::DenseVectorTag>::Diagonal(const Field &F,
const size_t n,
- bool nonsing) :
- _field(F), _n(n), _v(n)
+ bool nonsing) : //!@bug this should not be bool but enum
+ _field(&F), _n(n), _v(F,n)
{
typename Field::RandIter r(F);
- typedef typename std::vector<typename Field::Element>::iterator iter;
if (nonsing)
randomNonsingular();
else
@@ -379,10 +592,10 @@ namespace LinBox
//! random diagonal matrix of size n
template <class Field>
- inline Diagonal<Field, VectorCategories::DenseVectorTag >::Diagonal(const Field F,
+ inline Diagonal<Field, VectorCategories::DenseVectorTag >::Diagonal(const Field &F,
const size_t n,
typename Field::RandIter& iter) :
- _field(F), _n(n), _v(n)
+ _field(&F), _n(n), _v(F,n)
{
#if 0
for (typename std::vector<typename Field::Element>::iterator
@@ -396,8 +609,8 @@ namespace LinBox
template <class _Field>
inline void Diagonal<_Field, VectorCategories::DenseVectorTag>::random()
{
- typename Field::RandIter r(_field);
- typedef typename std::vector<typename Field::Element>::iterator iter;
+ typename Field::RandIter r(field());
+ typedef typename Vector_t::iterator iter;
for (iter i = _v.begin(); i < _v.end(); ++i)
r.random(*i);
}
@@ -406,10 +619,10 @@ namespace LinBox
template <class _Field>
inline void Diagonal<_Field, VectorCategories::DenseVectorTag>::randomNonsingular()
{
- typename Field::RandIter r(_field);
- typedef typename std::vector<typename Field::Element>::iterator iter;
+ typename Field::RandIter r(field());
+ typedef typename Vector_t::iterator iter;
for (iter i = _v.begin(); i < _v.end(); ++i)
- while (_field.isZero(r.random(*i))) ;
+ while (field().isZero(r.random(*i))) ;
}
/*! generic apply.
@@ -424,7 +637,7 @@ namespace LinBox
linbox_check (_n == x.size ());
// Create iterators for input, output, and stored vectors
- typename std::vector<Element>::const_iterator v_iter;
+ typename Vector_t::const_iterator v_iter;
typename InVector::const_iterator x_iter;
typename OutVector::iterator y_iter;
@@ -436,8 +649,8 @@ namespace LinBox
// vector elements to create output vector element.
for (y_iter = y.begin ();
y_iter != y.end ();
- y_iter++, v_iter++, x_iter++)
- _field.mul (*y_iter, *v_iter, *x_iter);
+ ++y_iter, ++v_iter, ++x_iter)
+ field().mul (*y_iter, *v_iter, *x_iter);
return y;
} // Vector& Diagonal<DenseVectorTag>::apply(Vector& y, const Vector&) const
@@ -449,9 +662,8 @@ namespace LinBox
* @param v vector
*/
template <class Field>
- inline Diagonal<Field, VectorCategories::SparseSequenceVectorTag >::Diagonal(const Field F,
- const std::vector<typename Field::Element>& v) :
- _field(F), _n(v.size()), _v(v)
+ inline Diagonal<Field, VectorCategories::SparseSequenceVectorTag >::Diagonal( const Vector_t& v) :
+ _field(&v.field()), _n(v.size()), _v(v)
{}
/** apply for sparse sequence vectors.
@@ -467,13 +679,11 @@ namespace LinBox
y.clear (); // we'll overwrite using push_backs.
// create field elements and size_t to be used in calculations
- size_t i;
- Element zero, entry;
- _field.init (zero, 0);
- _field.init (entry, 0);
+ Element entry;
+ field().assign (entry, field().zero);
// Create iterators for input and stored vectors
- typename std::vector<Element>::const_iterator v_iter;
+ typename Vector_t::const_iterator v_iter;
typename InVector::const_iterator x_iter;
// Start at beginning of _v vector
@@ -482,10 +692,11 @@ namespace LinBox
// Iterator over indices of input vector.
// For each element, multiply input element with corresponding element
// of stored vector and insert non-zero elements into output vector
- for (x_iter = x.begin (); x_iter != x.end (); x_iter++) {
+ for (x_iter = x.begin (); x_iter != x.end (); ++x_iter) {
+ size_t i;
i = (*x_iter).first;
- _field.mul (entry, *(v_iter + i), (*x_iter).second);
- if (!_field.isZero (entry)) y.push_back ( std::pair<size_t, Element>(i, entry));
+ field().mul (entry, *(v_iter + i), (*x_iter).second);
+ if (!field().isZero (entry)) y.push_back ( std::pair<size_t, Element>(i, entry));
}
return y;
@@ -498,8 +709,8 @@ namespace LinBox
* @param v vector
*/
template <class Field>
- inline Diagonal<Field, VectorCategories::SparseAssociativeVectorTag >::Diagonal(const Field F, const std::vector<typename Field::Element>& v) :
- _field(F), _n(v.size()), _v(v)
+ inline Diagonal<Field, VectorCategories::SparseAssociativeVectorTag >::Diagonal(const Vector_t& v) :
+ _field(&v.field()), _n(v.size()), _v(v)
{}
/** apply for sparse associative vectors.
@@ -515,13 +726,11 @@ namespace LinBox
y.clear (); // we'll overwrite using inserts
// create field elements and size_t to be used in calculations
- size_t i;
- Element zero, entry;
- _field.init (zero, 0);
- _field.init (entry, 0);
+ Element entry;
+ field().assing (entry, field().zero);
// Create iterators for input and stored vectors
- typename std::vector<Element>::const_iterator v_iter;
+ typename Vector_t::const_iterator v_iter;
typename InVector::const_iterator x_iter;
// Start at beginning of _v vector
@@ -530,26 +739,29 @@ namespace LinBox
// Iterator over indices of input vector.
// For each element, multiply input element with corresponding element
// of stored vector and insert non-zero elements into output vector
- for (x_iter = x.begin (); x_iter != x.end (); x_iter++)
+ for (x_iter = x.begin (); x_iter != x.end (); ++x_iter)
{
+ size_t i;
i = x_iter->first;
- _field.mul (entry, *(v_iter + i), (*x_iter).second);
- if (!_field.isZero (entry)) y.insert (y.end (), std::pair<size_t, Element>(i, entry));
+ field().mul (entry, *(v_iter + i), (*x_iter).second);
+ if (!field().isZero (entry)) y.insert (y.end (), std::pair<size_t, Element>(i, entry));
}
return y;
} // Vector& Diagonal<SparseAssociativeVectorTag>::apply(...) const
+ template<class Field, class Trait> struct GetEntryCategory<Diagonal<Field, Trait> >
+ { typedef SolutionTags::Local Tag; };
+
} // namespace LinBox
#endif // __LINBOX_diagonal_H
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
// Local Variables:
// mode: C++
// tab-width: 8
// indent-tabs-mode: nil
// c-basic-offset: 8
// End:
-
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/blackbox/direct-sum.h b/linbox/blackbox/direct-sum.h
index 4796706..3cf44f8 100644
--- a/linbox/blackbox/direct-sum.h
+++ b/linbox/blackbox/direct-sum.h
@@ -28,6 +28,7 @@
#include "linbox/blackbox/null-matrix.h"
#include "linbox/vector/vector-traits.h"
+#include "linbox/matrix/matrix-traits.h"
#include "linbox/blackbox/blackbox-interface.h"
#include "linbox/vector/subvector.h"
#include "linbox/matrix/matrix-domain.h"
@@ -216,6 +217,12 @@ namespace LinBox
const Blackbox1* getLeftPtr() const {return _Ap;}
const Blackbox2* getRightPtr() const {return _Bp;}
+ std::ostream & write(std::ostream & os) const
+ {
+ _Ap->write(os); _Bp->write(os << '+') ;
+ return os ;
+ }
+
protected:
// the direct summands
const Blackbox1* _Ap;
@@ -303,8 +310,8 @@ namespace LinBox
int offset_y = 0;
typename std::vector<const Blackbox* >::const_iterator bp;
for(bp = _VB.begin(); bp != _VB.end(); ++bp){
- const Subvector<typename InVector::const_iterator> x1(x.begin() + offset_x, x.begin() + (offset_x + (*bp)->coldim()));
- Subvector<typename OutVector::iterator> y1(y.begin() + offset_y, y.begin() + (offset_y + (*bp)->rowdim()));
+ const Subvector<typename InVector::const_iterator> x1(x.begin() + offset_x, x.begin() + (ptrdiff_t) ((unsigned long)offset_x + (*bp)->coldim()));
+ Subvector<typename OutVector::iterator> y1(y.begin() + offset_y, y.begin() + (ptrdiff_t) ((unsigned long)offset_y + (*bp)->rowdim()));
(*bp)->apply(y1,x1);
offset_x += (int) (*bp)->coldim();
offset_y += (int) (*bp)->rowdim();
@@ -323,8 +330,8 @@ namespace LinBox
int offset_y = 0;
typename std::vector<const Blackbox* >::const_iterator bp;
for(bp = _VB.begin(); bp != _VB.end(); ++bp){
- const Subvector<typename InVector::const_iterator> x1(x.begin() + offset_x, x.begin() + (offset_x + (*bp)->rowdim()));
- Subvector<typename OutVector::iterator> y1(y.begin() + offset_y, y.begin() + (offset_y + (*bp)->coldim()));
+ const Subvector<typename InVector::const_iterator> x1(x.begin() + offset_x, x.begin() +(ptrdiff_t) ((unsigned long)offset_x + (*bp)->rowdim()));
+ Subvector<typename OutVector::iterator> y1(y.begin() + offset_y, y.begin() + (ptrdiff_t) ((unsigned long)offset_y + (*bp)->coldim()));
(*bp)->applyTranspose(y1,x1);
offset_x += (int) (*bp)->rowdim();
offset_y += (int) (*bp)->coldim();
@@ -352,6 +359,15 @@ namespace LinBox
size_t size() const {
return this->_VB.size();
}
+ std::ostream & write(std::ostream & os) const
+ {
+ typename std::vector<const Blackbox* >::const_iterator bp;
+ for(bp = _VB.begin(); bp != _VB.end(); ++bp){
+ (*bp)->write(os);
+ }
+ return os ;
+ }
+
protected:
std::vector<const Blackbox* > _VB;
size_t m;
@@ -360,7 +376,6 @@ namespace LinBox
- template <class Matrix> struct MatrixTraits;
// #if !defined __INTEL_COMPILER && !defined(__clang__)
// template<>
@@ -602,6 +617,9 @@ namespace LinBox
DirectSumOwner (const DirectSum<_BBt> &M, const Field& F) :
_VB_data( M.size() ), m( M.rowdim() ), n( M.coldim())
{
+ // for (size_t i = 0 ; i < M.size() ; ++i)
+ // _VB_data[i].changeField(F);
+
typename DirectSum<_BBt>::template rebind<Field>()(*this, M);
}
@@ -622,8 +640,8 @@ namespace LinBox
int offset_y = 0;
typename ListBB_t::const_iterator bp;
for(bp = _VB_data.begin(); bp != _VB_data.end(); ++bp){
- const Subvector<typename InVector::const_iterator> x1(x.begin() + offset_x, x.begin() + (offset_x + bp->coldim()));
- Subvector<typename OutVector::iterator> y1(y.begin() + offset_y, y.begin() + (offset_y + bp->rowdim()));
+ const Subvector<typename InVector::const_iterator> x1(x.begin() + (ptrdiff_t)offset_x, x.begin() + (offset_x + (int)bp->coldim()));
+ Subvector<typename OutVector::iterator> y1(y.begin() + (ptrdiff_t)offset_y, y.begin() + (offset_y + (int)bp->rowdim()));
bp->apply(y1,x1);
offset_x += (int) bp->coldim();
offset_y += (int) bp->rowdim();
@@ -642,8 +660,8 @@ namespace LinBox
int offset_y = 0;
typename ListBB_t::const_iterator bp;
for(bp = _VB_data.begin(); bp != _VB_data.end(); ++bp){
- const Subvector<typename InVector::const_iterator> x1(x.begin() + offset_x, x.begin() + (offset_x + bp->rowdim()));
- Subvector<typename OutVector::iterator> y1(y.begin() + offset_y, y.begin() + (offset_y + bp->coldim()));
+ const Subvector<typename InVector::const_iterator> x1(x.begin() +(ptrdiff_t) offset_x, x.begin() + (ptrdiff_t)(offset_x + (int)bp->rowdim()));
+ Subvector<typename OutVector::iterator> y1(y.begin() + (ptrdiff_t)offset_y, y.begin() + (ptrdiff_t)(offset_y + (int)bp->coldim()));
bp->applyTranspose(y1,x1);
offset_x += (int)bp->rowdim();
offset_y += (int)bp->coldim();
@@ -688,11 +706,10 @@ namespace LinBox
#endif // __LINBOX_direct_sum_H
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
// Local Variables:
// mode: C++
// tab-width: 8
// indent-tabs-mode: nil
// c-basic-offset: 8
// End:
-
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/blackbox/fibb-product.h b/linbox/blackbox/fibb-product.h
new file mode 100644
index 0000000..e5ed032
--- /dev/null
+++ b/linbox/blackbox/fibb-product.h
@@ -0,0 +1,418 @@
+/* linbox/blackbox/fibb-product.h
+ * Copyright (C) 2015 bds for LinBox Team. See linbox/COPYING.LESSER for License info.
+ *
+ * Written by bds
+ */
+// todo: possiby merge with compose blackbox
+#ifndef LB_FIBBProduct_H
+#define LB_FIBBProduct_H
+
+#include "linbox/blackbox/fibb.h"
+
+namespace LinBox{
+
+template<class Field_>
+struct FIBBProduct : public FIBB<Field_> { // Fast Inverse BlackBox
+ typedef Field_ Field;
+ typedef FIBB<Field> Father_t;
+ typedef FIBBProduct<Field> Self_t;
+ protected:
+ const Field* field_;
+ const FIBB<Field>** factors_;
+ size_t n_;
+ bool alloc_; // true only if new used within construction of factors_
+ bool alloc_members_; // true only if new used to construct members.
+ // (all or nothing ownership of members)
+ const FIBB<Field>& head() const { return *(factors_[0]); }
+ FIBBProduct<Field>& tail (FIBBProduct<Field>& A) const
+ { A.field_ = field_;
+ A.factors_ = factors_ + 1; A.n_ = n_-1;
+ A.alloc_ = A.alloc_members_ = false;
+ return A;
+ }
+ public:
+ using Element = typename Father_t::Element;
+ using Matrix = typename Father_t::Matrix;
+
+ /* Blackbox functions */
+ BBType bbTag() const { return product; }
+ size_t rowdim() const;
+ size_t coldim() const;
+ const Field& field() const;
+ Matrix& applyRight(Matrix& Y, const Matrix& X) const; // Y = AX
+ Matrix& applyLeft(Matrix& Y, const Matrix& X) const; // Y = XA
+ // todo: rebind - hom support
+ std::istream& read(std::istream& is);
+ std::ostream& write(std::ostream& os) const;
+
+ /* fibb functions */
+ size_t& rank(size_t& r) const;
+
+ Element& det(Element& d) const;
+
+ Matrix& solveRight(Matrix& Y, const Matrix& X) const;
+ /// Y: YA = X, for this A
+ Matrix& solveLeft(Matrix& Y, const Matrix& X) const;
+
+ /// N: AN = 0, each col random.
+ Matrix& nullspaceRandomRight(Matrix& N) const;
+ /// N: NA = 0, each row random.
+ Matrix& nullspaceRandomLeft(Matrix& N) const;
+
+ /* nullspaceBasisRight and nullspaceBasisLeft */
+ /** B: columns are a right nullspace basis for this A.
+
+ B is resized and filled so that:
+ (1) AB = 0, (2) Ax = 0 => exists y: x = By, and (3) B has full rank.
+ */
+ DenseMatrix<Field>& nullspaceBasisRight(DenseMatrix<Field>& B) const;
+ /// BA= 0 and xA = 0 => exists y: x = yB and B full rank.
+ DenseMatrix<Field>& nullspaceBasisLeft(DenseMatrix<Field>& B) const;
+
+ /* cstors, dstor, initializers */
+// FIBBProduct();
+ FIBBProduct(const Field& F);
+// FIBBProduct(const FIBBProduct<Field>& A);
+ FIBBProduct(const FIBB<Field>& A1, const FIBB<Field>& A2);
+ FIBBProduct(const FIBB<Field>& A1, const FIBB<Field>& A2,
+ const FIBB<Field>& A3);
+ FIBBProduct(const FIBB<Field>& A1, const FIBB<Field>& A2,
+ const FIBB<Field>& A3, const FIBB<Field>& A4);
+ FIBBProduct(const FIBB<Field>& A1, const FIBB<Field>& A2,
+ const FIBB<Field>& A3, const FIBB<Field>& A4,
+ const FIBB<Field>& A5);
+ ~FIBBProduct();
+ FIBBProduct& init(const FIBB<Field>& A1);
+ FIBBProduct& init(const FIBB<Field>& A1, const FIBB<Field>& A2);
+ FIBBProduct& init(const FIBB<Field>& A1, const FIBB<Field>& A2,
+ const FIBB<Field>& A3);
+ FIBBProduct& init(const FIBB<Field>& A1, const FIBB<Field>& A2,
+ const FIBB<Field>& A3, const FIBB<Field>& A4);
+ FIBBProduct& init(const FIBB<Field>& A1, const FIBB<Field>& A2,
+ const FIBB<Field>& A3, const FIBB<Field>& A4,
+ const FIBB<Field>& A5);
+ // product and owner of heap allocated FIBBs
+ FIBBProduct& incorporate(const FIBB<Field>* A1,
+ const FIBB<Field>* A2 = NULL, const FIBB<Field>* A3 = NULL,
+ const FIBB<Field>* A4 = NULL, const FIBB<Field>* A5 = NULL);
+ const FIBB<Field>& operator[](size_t i) ;
+
+}; // class FIBBProduct
+}// namespace LinBox
+#endif // LB_FIBBProduct_H
+
+// blackbox/FIBBProduct.inl
+#ifndef LB_FIBBProduct_INL
+#define LB_FIBBProduct_INL
+namespace LinBox {
+
+// Blackbox interface
+template<class Field> size_t FIBBProduct<Field>::
+rowdim() const { return n_ > 0 ? factors_[0]->rowdim() : 0; }
+
+template<class Field> size_t FIBBProduct<Field>::
+coldim() const { return n_ > 0 ? factors_[n_-1]->coldim() : 0; }
+
+template<class Field> const Field& FIBBProduct<Field>::
+field() const { return *field_; }
+
+template<class Field> typename FIBBProduct<Field>::Matrix& FIBBProduct<Field>::
+applyRight(typename FIBBProduct<Field>::Matrix& Y, const typename FIBBProduct<Field>::Matrix& X) const
+{ if (n_==0) return Y;
+ if (n_==1) return head().applyRight(Y,X);
+ const FIBB<Field>& A = head();
+ FIBBProduct<Field> B(field()); tail(B);
+ Matrix X1(field(), B.rowdim(), X.coldim());
+ B.applyRight(X1, X);
+ A.applyRight(Y, X1);
+ return Y;
+}
+
+template<class Field> typename FIBBProduct<Field>::Matrix& FIBBProduct<Field>::
+applyLeft(typename FIBBProduct<Field>::Matrix& Y, const typename FIBBProduct<Field>::Matrix& X) const
+{ if (n_==0) return Y;
+ if (n_==1) return head().applyLeft(Y,X);
+ const FIBB<Field>& A = head();
+ FIBBProduct<Field> B(field()); tail(B);
+ Matrix X1(field(), X.rowdim(), B.coldim());
+ A.applyLeft(X1, X);
+ B.applyLeft(Y, X1);
+ return Y;
+}
+
+/* rebind - hom support
+*/
+// todo: read
+template<class Field> std::istream& FIBBProduct<Field>::
+read(std::istream& is)
+{ return is; }
+
+template<class Field> std::ostream& FIBBProduct<Field>::
+write(std::ostream& os) const
+{ os << std::endl << "%%MatrixMarket matrix composite integer general" << std::endl;
+ field().write(os << "% written by LinBox::FIBBProduct< ") << " >" << std::endl;
+ os << n_;
+ for (size_t i = 0; i < n_; ++i)
+ factors_[i]->write(os << std::endl);
+ return os;
+}
+
+template<class Field> size_t& FIBBProduct<Field>::
+rank( size_t& r ) const
+{ if (n_ == 0) return r = 0;
+ factors_[0]->rank(r);
+ size_t s;
+ for (size_t i = 1; i < n_; ++i)
+ r = std::min(r, factors_[i]->rank(s));
+ return r;
+}
+
+template<class Field> typename FIBBProduct<Field>::Element& FIBBProduct<Field>::
+det( typename FIBBProduct<Field>::Element& d ) const
+{ if (n_==0) return field().assign(d, field().one);
+ factors_[0]->det(d);
+ typename Field::Element e; field().init(e);
+ for (size_t i = 1; i < n_; ++i)
+ field().mulin(d, factors_[i]->det(e));
+ return d;
+}
+
+template<class Field> typename FIBBProduct<Field>::Matrix& FIBBProduct<Field>::
+solveRight( typename FIBBProduct<Field>::Matrix& Y, const typename FIBBProduct<Field>::Matrix& X ) const
+{ if (n_==0) return Y;
+ if (n_==1) return head().solveRight(Y,X);
+ const FIBB<Field>& A = head();
+ FIBBProduct<Field> B(field()); tail(B);
+ Matrix Z(field(), A.coldim(), X.coldim());
+ A.solveRight(Z,X); // A1*Z = X
+ return B.solveRight(Y,Z); // A2*Y = Z
+}
+
+template<class Field> typename FIBBProduct<Field>::Matrix& FIBBProduct<Field>::
+solveLeft( typename FIBBProduct<Field>::Matrix& Y, const typename FIBBProduct<Field>::Matrix& X ) const
+{ if (n_==0) return Y;
+ if (n_==1) return head().solveLeft(Y,X);
+ const FIBB<Field>& A = head();
+ FIBBProduct<Field> B(field()); tail(B);
+ Matrix Z(field(), X.rowdim(), A.coldim());
+ B.solveLeft(Z,X); // Z*A2 = X
+ return A.solveLeft(Y,Z); // Y*A1 = Z
+}
+
+template<class Field> typename FIBBProduct<Field>::Matrix& FIBBProduct<Field>::
+nullspaceRandomRight( typename FIBBProduct<Field>::Matrix& N ) const // N: ABN = 0
+{
+ if (n_==0) return N;
+ if (n_==1) return head().nullspaceRandomRight(N);
+ size_t r;
+ const FIBB<Field>& A = head();
+ FIBBProduct<Field> B(field()); tail(B);
+ if (A.rowdim() == A.coldim() and A.rank(r) == A.coldim())
+ return B.nullspaceRandomRight(N);
+ else
+ { Matrix N1(N);
+ A.nullspaceRandomRight(N1);
+ B.solveRight(N,N1);
+ return N;
+ // a solveRightin would be good if B is a perm.
+ }
+}
+
+template<class Field> typename FIBBProduct<Field>::Matrix& FIBBProduct<Field>::
+nullspaceRandomLeft( typename FIBBProduct<Field>::Matrix& N ) const
+{ if (n_==0) return N;
+ if (n_==1) return head().nullspaceRandomLeft(N);
+ size_t r;
+ const FIBB<Field>& A = head();
+ FIBBProduct<Field> B(field()); tail(B);
+ if (B.rowdim() == B.coldim() and B.rank(r) == B.coldim())
+ return A.nullspaceRandomLeft(N);
+ else
+ { Matrix N1(N);
+ B.nullspaceRandomLeft(N1);
+ return A.solveLeft(N,N1);
+ // a solveLeftin would be good if A is a perm.
+ }
+}
+
+/*
+template<class Field> typename FIBBProduct<Field>::Matrix& FIBBProduct<Field>::
+genericNullspaceRandomRight( typename FIBBProduct<Field>::Matrix& N ) const
+{ Matrix X(field(), rowdim(), N.coldim());
+ Matrix R(field(), coldim(), N.coldim());
+ R.random();
+ applyRight(X, R); // X: X = AR
+ solveRight(N, X); // N: AN = X = AR
+ return DenseMatrixDomain<Field>(field()).subin(N, R);
+}
+
+template<class Field> Matrix& FIBBProduct<Field>::
+genericNullspaceRandomLeft( Matrix& N ) const
+{ Matrix X(field(), N.rowdim(), rowdim());
+ Matrix R(field(), N.rowdim(), coldim());
+ R.random();
+ applyLeft(X, R); // X: X = RA
+ solveLeft(N, X); // N: NA = RA
+ return BlasMatrixDomain<Field>(field()).subin(N, R);
+}
+*/
+
+template<class Field> DenseMatrix<Field>& FIBBProduct<Field>::
+nullspaceBasisRight( DenseMatrix<Field>& N ) const
+{ if (n_==0) { N.resize(0,0); return N; }
+ if (n_==1) return head().nullspaceBasisRight(N);
+ size_t r;
+ const FIBB<Field>& A = head();
+ FIBBProduct<Field> B(field()); tail(B);
+ if (A.rowdim() == A.coldim() and A.rank(r) == A.rowdim())
+ B.nullspaceBasisRight(N);
+ else
+ { Matrix N1(field());
+ A.nullspaceBasisRight(N1);
+ N.resize(N1.rowdim(), N1.coldim());
+ B.solveRight(N, N1);
+ }
+ return N;
+}
+
+template<class Field> DenseMatrix<Field>& FIBBProduct<Field>::
+nullspaceBasisLeft( DenseMatrix<Field>& N ) const
+{ if (n_==0) { N.resize(0,0); return N; }
+ if (n_==1) return head().nullspaceBasisLeft(N);
+ size_t r;
+ const FIBB<Field>& A = head();
+
+ FIBBProduct<Field> B(field()); tail(B);
+ if (B.rowdim() == B.coldim() and B.rank(r) == B.rowdim())
+ A.nullspaceBasisLeft(N);
+ else
+ { Matrix N1(field());
+ B.nullspaceBasisLeft(N1);
+ N.resize(N1.rowdim(), N1.coldim());
+ A.solveLeft(N, N1);
+ }
+ return N;
+}
+
+/* cstors, dstor */
+template<class Field> FIBBProduct<Field>::
+FIBBProduct(const Field& F)
+: field_(&F), factors_(0), n_(0), alloc_(false), alloc_members_(false)
+{}
+
+//template<class Field> FIBBProduct<Field>::
+//FIBBProduct(const FIBBProduct<Field>& A): Ap(A.Ap), Bp(A.Bp), allocA(A.allocA), allocB(A.allocB)
+//{}
+
+template<class Field> FIBBProduct<Field>::
+FIBBProduct( const FIBB<Field>& A1, const FIBB<Field>& A2 )
+: field_(0), factors_(0), n_(0), alloc_(false), alloc_members_(false)
+{ init(A1, A2); }
+
+template<class Field> FIBBProduct<Field>::
+FIBBProduct( const FIBB<Field>& A1, const FIBB<Field>& A2,
+ const FIBB<Field>& A3 )
+: field_(0), factors_(0), n_(0), alloc_(false), alloc_members_(false)
+{ init(A1, A2, A3); }
+
+template<class Field> FIBBProduct<Field>::
+FIBBProduct( const FIBB<Field>& A1, const FIBB<Field>& A2,
+ const FIBB<Field>& A3, const FIBB<Field>& A4 )
+: field_(0), factors_(0), n_(0), alloc_(false), alloc_members_(false)
+{ init(A1, A2, A3, A4); }
+
+template<class Field> FIBBProduct<Field>::
+FIBBProduct( const FIBB<Field>& A1, const FIBB<Field>& A2,
+ const FIBB<Field>& A3, const FIBB<Field>& A4,
+ const FIBB<Field>& A5 )
+: field_(0), factors_(0), n_(0), alloc_(false), alloc_members_(false)
+{ init(A1, A2, A3, A4, A5); }
+
+template<class Field> FIBBProduct<Field>::
+~FIBBProduct()
+{ if (alloc_members_)
+ for(size_t i = 0; i < n_; ++i) delete factors_[i];
+ if (alloc_) delete[] factors_;
+}
+
+/* initializers */
+
+template<class Field> FIBBProduct<Field>& FIBBProduct<Field>::
+init( const FIBB<Field>& A )
+{ field_ = &(A.field());
+ if (alloc_ and factors_) delete[] factors_;
+ factors_ = new const FIBB<Field>*[1]; n_ = 1;
+ alloc_ = true; alloc_members_ = false;
+ factors_[0] = &A;
+ return *this;
+}
+
+template<class Field> FIBBProduct<Field>& FIBBProduct<Field>::
+init( const FIBB<Field>& A1, const FIBB<Field>& A2 )
+{ field_ = &(A1.field());
+ if (alloc_ and factors_) delete[] factors_;
+ factors_ = new const FIBB<Field>*[2]; n_ = 2;
+ alloc_ = true; alloc_members_ = false;
+ factors_[0] = &A1; factors_[1] = &A2;
+ return *this;
+}
+
+template<class Field> FIBBProduct<Field>& FIBBProduct<Field>::
+init( const FIBB<Field>& A1, const FIBB<Field>& A2,
+ const FIBB<Field>& A3 )
+{ field_ = &(A1.field());
+ if (alloc_ and factors_) delete[] factors_;
+ factors_ = new const FIBB<Field>*[3]; n_ = 3;
+ alloc_ = true; alloc_members_ = false;
+ factors_[0] = &A1; factors_[1] = &A2;
+ factors_[2] = &A3;
+ return *this;
+}
+
+template<class Field> FIBBProduct<Field>& FIBBProduct<Field>::
+init( const FIBB<Field>& A1, const FIBB<Field>& A2,
+ const FIBB<Field>& A3, const FIBB<Field>& A4 )
+{ field_ = &(A1.field());
+ if (alloc_ and factors_) delete[] factors_;
+ factors_ = new const FIBB<Field>*[4]; n_ = 4;
+ alloc_ = true; alloc_members_ = false;
+ factors_[0] = &A1; factors_[1] = &A2;
+ factors_[2] = &A3; factors_[3] = &A4;
+ return *this;
+}
+
+template<class Field> FIBBProduct<Field>& FIBBProduct<Field>::
+init( const FIBB<Field>& A1, const FIBB<Field>& A2,
+ const FIBB<Field>& A3, const FIBB<Field>& A4,
+ const FIBB<Field>& A5 )
+{ field_ = &(A1.field());
+ if (alloc_ and factors_) delete[] factors_;
+ factors_ = new const FIBB<Field>*[5]; n_ = 5;
+ alloc_ = true; alloc_members_ = false;
+ factors_[0] = &A1; factors_[1] = &A2;
+ factors_[2] = &A3; factors_[3] = &A4;
+ factors_[4] = &A5;
+ return *this;
+}
+
+template<class Field> FIBBProduct<Field>& FIBBProduct<Field>::
+incorporate(const FIBB<Field>* A1,
+ const FIBB<Field>* A2, const FIBB<Field>* A3,
+ const FIBB<Field>* A4, const FIBB<Field>* A5)
+{
+ if (A2 == NULL) init(*A1);
+ if (A3 == NULL) init(*A1,*A2);
+ if (A4 == NULL) init(*A1,*A2,*A3);
+ if (A5 == NULL) init(*A1,*A2,*A3,*A4);
+ else init(*A1,*A2,*A3,*A4,*A5);
+ alloc_members_ = true;
+ return *this;
+}
+
+template<class Field> const FIBB<Field>& FIBBProduct<Field>::
+operator[](size_t i)
+{ return *(factors_[i]); }
+
+}// namespace LinBox
+
+#endif // LB_FIBBProduct_INL
diff --git a/linbox/blackbox/fibb.h b/linbox/blackbox/fibb.h
new file mode 100644
index 0000000..c49a337
--- /dev/null
+++ b/linbox/blackbox/fibb.h
@@ -0,0 +1,111 @@
+/* linbox/blackbox/fibb.h
+ * Copyright (C) 2015 bds for LinBox Team. See linbox/COPYING.LESSER for License info.
+ *
+ * Written by bds
+ */
+#ifndef LB_FIBB_H
+#define LB_FIBB_H
+
+/*
+FIBB: Fast Inverse BlackBox
+
+The FIBB functions are those of a blackbox plus rank, det, and the solvers:
+Solve, NullSpaceRandom, NullSpaceBasis.
+The solvers have left and right forms.
+
+THe FIBBs are Diagonal, Permutation, Triangular, and products of FIBBs in which one or both are nonsingular.
+*/
+#include "linbox/blackbox/bb.h"
+namespace LinBox{
+
+template <class Ring>
+struct FIBB : public BB<Ring>
+{
+ using Field = Ring;
+ using Element = typename Ring::Element;
+ using ResizableMatrix = DenseMatrix<Field>;
+ using Matrix = DenseMatrix<Field>;
+
+// virtual const Field& field() const = 0;
+
+ virtual ~FIBB(){}
+
+ virtual size_t& rank(size_t& r) const
+ = 0;
+
+ virtual Element& det( Element& d) const
+ = 0;
+
+ // solveRight and solveLeft
+ /** @brief Y: AY = X, for this A.
+ Solve nonsingular or consistent singular system.
+ If it is consistent singular, an arbitrary solution is provided.
+ X and Y must have identical shape.
+
+ Note that Y+Z is a random sample of the solution space after
+ {solveRight(Y, X); nullspaceRandomRight(Z);}.
+
+ Behaviour is unspecified for inconsistent systems (see solveMP).
+ */
+ virtual Matrix& solveRight(Matrix& Y, const Matrix& X) const
+ = 0;
+ /// Y: YA = X, for this A
+ virtual Matrix& solveLeft(Matrix& Y, const Matrix& X) const
+ = 0;
+
+ /// N: AN = 0, each col random.
+ virtual Matrix& nullspaceRandomRight(Matrix& N) const
+ = 0;
+ /// N: NA = 0, each row random.
+ virtual Matrix& nullspaceRandomLeft(Matrix& N) const
+ = 0;
+ // this generic is virtual so that it may be specialized for performance
+
+ // nullspaceBasisRight and nullspaceBasisLeft
+
+ /** B: columns are a right nullspace basis for this A.
+
+ B is resized and filled so that:
+ (1) AB = 0, (2) Ax = 0 => exists y: x = By, and (3) B has full rank.
+ */
+ virtual ResizableMatrix& nullspaceBasisRight(ResizableMatrix& B) const
+ = 0;
+ /// BA= 0 and xA = 0 => exists y: x = yB and B full rank.
+ virtual ResizableMatrix& nullspaceBasisLeft(ResizableMatrix& B) const
+ = 0;
+}; // class FIBB
+
+/// N: AN = 0, each col random.
+template<class Field>
+DenseMatrix<Field>& genericNullspaceRandomRight(DenseMatrix<Field>& N, const FIBB<Field>& A)
+//DenseMatrix<Field, std::vector<typename Field::Element> >& genericNullspaceRandomRight(DenseMatrix<Field, std::vector<typename Field::Element> >& N, const FIBB<Field>& A)
+{ typedef DenseMatrix<Field> ResizableMatrix;
+ typedef DenseMatrix<Field> Matrix;
+ ResizableMatrix Xb(A.field(), N.rowdim(), N.coldim());
+ ResizableMatrix Yb(A.field(), A.rowdim(), N.coldim());
+ Matrix X(Xb); X.random();
+ Matrix Y(Yb);
+ A.applyRight(Y, X); // Y = AX
+ A.solveRight(N, Y); // AN = AX
+ BlasMatrixDomain<Field> MD(A.field());
+ return MD.subin(N, X);
+}
+
+/// N: NA = 0, each row random.
+template<class Field>
+DenseMatrix<Field>& genericNullspaceRandomLeft(DenseMatrix<Field>& N, const FIBB<Field>& A)
+//DenseMatrix<Field, std::vector<typename Field::Element> >& genericNullspaceRandomLeft(DenseMatrix<Field, std::vector<typename Field::Element> >& N, const FIBB<Field>& A)
+{ typedef DenseMatrix<Field> ResizableMatrix;
+ typedef DenseMatrix<Field> Matrix;
+ ResizableMatrix Xb(A.field(), N.rowdim(), N.coldim());
+ ResizableMatrix Yb(A.field(), N.rowdim(), A.coldim());
+ Matrix X(Xb); X.random();
+ Matrix Y(Yb);
+ A.applyLeft(Y, X); // Y = XA
+ A.solveLeft(N, Y); // NA = XA
+ BlasMatrixDomain<Field> MD(A.field());
+ return MD.subin(N, X);
+}
+
+} // namespace LinBox
+#endif // LB_FIBB_H
diff --git a/linbox/blackbox/frobenius.h b/linbox/blackbox/frobenius.h
index c3871e0..365fd2b 100644
--- a/linbox/blackbox/frobenius.h
+++ b/linbox/blackbox/frobenius.h
@@ -37,9 +37,11 @@
namespace LinBox
{
/// \ingroup blackbox
- template <class _Field>
- class Frobenius: public BlackboxInterface, public DirectSum<Companion<_Field> > {
+ template <class Field_>
+ class Frobenius: public BlackboxInterface, public DirectSum<Companion<Field_> > {
public:
+ typedef Field_ Field;
+
Frobenius() { } // default constructor
/** Constructor.
@@ -49,7 +51,7 @@ namespace LinBox
* @param vlist diagonal-block sizes, positive ints in non-increasing order
*/
template <class VDegList>
- Frobenius( const _Field &F, const VDegList &vlist)
+ Frobenius( const Field &F, const VDegList &vlist)
{ }
/** Constructor.
@@ -60,15 +62,15 @@ namespace LinBox
* @param pend iterator pointing after end of a list of polynomials
*/
template <class PolyIterator>
- Frobenius( const _Field &F, PolyIterator pbegin, PolyIterator pend)
+ Frobenius( const Field &F, PolyIterator pbegin, PolyIterator pend)
{
- this->_VB.resize(pend - pbegin);
+ this->_VB.resize((size_t)(pend - pbegin));
PolyIterator pp = pbegin;
- typename std::vector<const Companion<_Field>* >::iterator vp;
+ typename std::vector<const Companion<Field>* >::iterator vp;
this->m = 0;
this->n = 0;
for(vp = this->_VB.begin(); vp != this->_VB.end(); ++vp,++pp) {
- *vp = new Companion<_Field>(F,*pp);
+ *vp = new Companion<Field>(F,*pp);
this->m += (*vp) -> rowdim();
this->n += (*vp) -> coldim();
}
@@ -78,7 +80,7 @@ namespace LinBox
/// destructor
~Frobenius()
{
- typename std::vector< const Companion<_Field>* >::iterator vp;
+ typename std::vector< const Companion<Field>* >::iterator vp;
for(vp = this->_VB.begin(); vp != this->_VB.end(); ++vp)
delete (*vp);
}
diff --git a/linbox/blackbox/hilbert.h b/linbox/blackbox/hilbert.h
index 79dc467..eb34712 100644
--- a/linbox/blackbox/hilbert.h
+++ b/linbox/blackbox/hilbert.h
@@ -8,20 +8,20 @@
* The original hilbert.h, providing one of the first blackbox examples, but not using the JIT feature,
* was written by Will Turner.
*
- *
+ *
* ========LICENCE========
* This file is part of the library LinBox.
- *
+ *
* LinBox is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
- *
+ *
* This library 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
* Lesser General Public License for more details.
- *
+ *
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
@@ -39,6 +39,8 @@
#include <vector>
#include "linbox/blackbox/jit-matrix.h"
+#include "linbox/util/matrix-stream.h"
+#include "linbox/util/write-mm.h"
namespace LinBox
@@ -53,7 +55,9 @@ namespace LinBox
typedef typename _Field::Element Element;
/// set up vector of 1/(i+1)
- Hilbert_JIT_Entry(Field& F, size_t m, size_t n);
+ void init(const Field& F, size_t m, size_t n);
+
+ Hilbert_JIT_Entry(const Field& F, size_t m, size_t n) {init(F, m, n);}
/// return 1/(i+j+2), zero based indexing.
Element& operator()(Element &entry, size_t i, size_t j) const
@@ -68,11 +72,10 @@ namespace LinBox
/// constructor
template<typename _Field>
- Hilbert_JIT_Entry<_Field>::Hilbert_JIT_Entry(_Field& F, size_t m, size_t n) {
+ void Hilbert_JIT_Entry<_Field>::init(const _Field& F, size_t m, size_t n) {
- Element temp, one;
- F.init(one, 1);
- F.init(temp, 0);
+ Element temp;
+ F.assign(temp, F.zero);
_vecH = std::vector<Element>(m+n, temp);
@@ -80,7 +83,7 @@ namespace LinBox
// the ith entry of _vecH = 1/(i+1)
for (iter=_vecH.begin(); iter != _vecH.end(); iter++) {
- F.addin(temp, one);
+ F.addin(temp, F.one);
F.inv(*iter, temp);
}
@@ -96,25 +99,48 @@ namespace LinBox
*/
template<typename _Field>
class Hilbert : public JIT_Matrix<_Field, Hilbert_JIT_Entry<_Field> > {
+ using JIT_Matrix<_Field, Hilbert_JIT_Entry<_Field> >::_m;
+ using JIT_Matrix<_Field, Hilbert_JIT_Entry<_Field> >::_n;
+ using JIT_Matrix<_Field, Hilbert_JIT_Entry<_Field> >::_gen;
public:
+ typedef _Field Field;
+ using JIT_Matrix<_Field, Hilbert_JIT_Entry<_Field> >::field;
+ using JIT_Matrix<_Field, Hilbert_JIT_Entry<_Field> >::rowdim;
+ using JIT_Matrix<_Field, Hilbert_JIT_Entry<_Field> >::coldim;
/** Constructor from field and size.
* @param F the field.
* @param n the size : size_t integer number of rows and columns of matrix.
*/
- Hilbert(_Field& F, size_t n) :
- JIT_Matrix<_Field, Hilbert_JIT_Entry<_Field> >(F, n, n, Hilbert_JIT_Entry<_Field>(F, n, n))
+ Hilbert(const Field& F, size_t n = 0) :
+ JIT_Matrix<Field, Hilbert_JIT_Entry<Field> >(F, n, n, Hilbert_JIT_Entry<Field>(F, n, n))
{};
- };
+ std::ostream& write(std::ostream& os) const
+ {
+ return writeMMPatternHeader(os, *this, 0, "Hilbert");
+ }
+ std::istream& read(std::istream& is)
+ {
+ MatrixStream<Field> ms(field(), is);
+ ms.getDimensions(_m, _n);
+ _gen.init(field(), _m, _n);
+ return is;
+ }
+ Hilbert(MatrixStream<_Field> &ms) :
+ JIT_Matrix<_Field,Hilbert_JIT_Entry<_Field> >(ms.field())
+ {
+ ms.getDimensions(_m, _n);
+ _gen.init(field(), _m, _n);
+ }
+ };
}//LinBox Namespace
#endif //__LINBOX_hilbert_H
-
// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
// Local Variables:
// mode: C++
diff --git a/linbox/blackbox/inverse.h b/linbox/blackbox/inverse.h
index 6d9b266..5e98449 100644
--- a/linbox/blackbox/inverse.h
+++ b/linbox/blackbox/inverse.h
@@ -60,13 +60,16 @@ namespace LinBox
typedef typename Blackbox::Field Field;
typedef typename Field::Element Element;
- typedef std::vector<Element> Polynomial;
+ typedef BlasVector<Field> Polynomial;
/** Constructor from field and dense vector of field elements.
* @param BB Black box of which to get the inverse
*/
Inverse (const Blackbox *BB) :
_VD (BB->field()), _BB (BB)
+ , _minpoly(BB->field())
+ , _transposeMinpoly(BB->field())
+ , _z(BB->field())
{
linbox_check ((BB->rowdim ()) == (BB->coldim ()));
@@ -81,7 +84,11 @@ namespace LinBox
* another black box
*/
Inverse (const Inverse &BB) :
- _VD (BB->field()), _BB (BB._BB), _minpoly (BB._minpoly)
+ _VD (BB->field()), _BB (BB._BB)
+ , _minpoly (BB._minpoly)
+ , _z(BB->field())
+ , _transposeMinpoly(BB->field())
+
{
_z.resize (_BB->coldim ());
}
@@ -102,7 +109,7 @@ namespace LinBox
int i;
if (_minpoly.empty ()) {
- Polynomial _mp1;
+ Polynomial _mp1(field());
Element a0;
minpoly (_mp1, *_BB);
@@ -113,16 +120,16 @@ namespace LinBox
field().negin (a0);
for (i = 1; i < (int) _mp1.size (); i++)
- field().mul (_minpoly[i-1], _mp1[i], a0);
+ field().mul (_minpoly[(size_t)i-1], _mp1[(size_t)i], a0);
}
int n = (int) _minpoly.size () - 1;
- _VD.mul (y, x, _minpoly[n]);
+ _VD.mul (y, x, _minpoly[(size_t)n]);
for (i = n - 1; i >= 0; i--) {
_BB->apply (_z, y);
- _VD.axpy (y, _minpoly[i], x, _z);
+ _VD.axpy (y, _minpoly[(size_t)i], x, _z);
}
return y;
@@ -143,7 +150,7 @@ namespace LinBox
int i;
if (_transposeMinpoly.empty ()) {
- Polynomial _mp1;
+ Polynomial _mp1(field());
Element a0;
Transpose<Blackbox> BBT (_BB);
@@ -156,16 +163,16 @@ namespace LinBox
field().negin (a0);
for (i = 1; i < (int) _mp1.size (); i++)
- field().mul (_transposeMinpoly[i-1], _mp1[i], a0);
+ field().mul (_transposeMinpoly[(size_t)i-1], _mp1[(size_t)i], a0);
}
int n = (int) _transposeMinpoly.size () - 1;
- _VD.mul (y, x, _transposeMinpoly[n]);
+ _VD.mul (y, x, _transposeMinpoly[(size_t)n]);
for (i = n - 1; i >= 0; i--) {
_BB->applyTranspose (_z, y);
- _VD.axpy (y, _transposeMinpoly[i], x, _z);
+ _VD.axpy (y, _transposeMinpoly[(size_t)i], x, _z);
}
return y;
@@ -197,7 +204,7 @@ namespace LinBox
const Field& field() const
{ return _BB->field();}
- private:
+ protected:
const VectorDomain<Field> _VD;
const Blackbox *_BB;
@@ -215,11 +222,10 @@ namespace LinBox
#endif // __LINBOX_inverse_H
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
// Local Variables:
// mode: C++
// tab-width: 8
// indent-tabs-mode: nil
// c-basic-offset: 8
// End:
-
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
diff --git a/linbox/blackbox/jit-matrix.h b/linbox/blackbox/jit-matrix.h
index 5662418..9de9458 100644
--- a/linbox/blackbox/jit-matrix.h
+++ b/linbox/blackbox/jit-matrix.h
@@ -1,64 +1,71 @@
-/* linbox/blackbox/jit-matrix.h
- * Copyright (c) LinBox
+/*
+ * copyright (c) LinBox
*
* bds, jpm
*
- *
- * ========LICENCE========
- * This file is part of the library LinBox.
- *
+ *
+ * ========licence========
+ * this file is part of the library LinBox.
+ *
* LinBox is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- * ========LICENCE========
+ * it under the terms of the gnu lesser general public
+ * license as published by the free software foundation; either
+ * version 2.1 of the license, or (at your option) any later version.
+ *
+ * this library 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
+ * lesser general public license for more details.
+ *
+ * you should have received a copy of the gnu lesser general public
+ * license along with this library; if not, write to the free software
+ * foundation, inc., 51 franklin street, fifth floor, boston, ma 02110-1301 usa
+ * ========licence========
*.
*/
-#ifndef __LINBOX_jitmatrix_H
-#define __LINBOX_jitmatrix_H
+/** @file linbox/blackbox/jit-matrix.h
+ * @brief nodoc
+ */
+
+#ifndef __LINBOX_jitmatrix_h
+#define __LINBOX_jitmatrix_h
+#include "linbox/matrix/matrix-category.h"
#include "linbox/blackbox/blackbox-interface.h"
namespace LinBox
{
/**
-
- \brief Example of a blackbox that is space efficient, though not time efficient.
-
- \ingroup blackbox
- Just In Time Matrix.
-
- The matrix itself is not stored in memory. Rather, an EntryGenerator
- function is called to provide the entries. The entry generator is
- called once for each entry during an apply or applyTranspose
- operation.
-
- An toy example of its use is the Hilbert matrix, whose \f$i,j\f$ entry is
- generated by the formula \f$1/(i+j+2)\f$ in zero based indexing.
- The motivating examples were matrices also defined by formula, the Paley type matrices.
- \sa{MSW07}% ISSAC 07 paper
- In that context block structured turned out to be essential and the
- JIT_Matrix class is primarily intended for block structured matrices,
- the JIT entries being matrix blocks.
-
- @param _Field only need provide the \c init() and \c axpyin() functions.
-
- @param JIT_EntryGenerator \c gen() is a function object defining the
- matrix by providing <code>gen(e, i, j)</code> which sets field element e to the \c i,j entry
- of the matrix. Indexing is zero based.
-
-*/
+ *
+ * \brief example of a blackbox that is space efficient, though not
+ * time efficient.
+ *
+ *\ingroup blackbox
+ * just in time matrix.
+ *
+ * the matrix itself is not stored in memory. rather, an
+ * entrygenerator function is called to provide the entries. the entry
+ * generator is called once for each entry during an apply or
+ * applytranspose operation.
+ *
+ * An toy example of its use is the Hilbert matrix, whose \f$i,j\f$
+ * entry is generated by the formula \f$1/(i+j+2)\f$ in zero based
+ * indexing. The motivating examples were matrices also defined by
+ * formula, the Paley type matrices. \sa{MSW07}% ISSAC 07 paper In
+ * that context block structured turned out to be essential and the
+ * JIT_Matrix class is primarily intended for block structured
+ * matrices, the JIT entries being matrix blocks.
+ *
+ * @param _Field only need provide the \c init() and \c axpyin()
+ * functions.
+ *
+ * @param JIT_EntryGenerator \c gen() is a function object defining the
+ * matrix by providing <code>gen(e, i, j)</code> which sets field
+ * element e to the \c i,j entry of the matrix. Indexing is zero based.
+ *
+ */
template <class _Field, class JIT_EntryGenerator>
@@ -76,27 +83,24 @@ namespace LinBox
* and must be valid for 0 <= i < m, 0 <= j < n.
**/
- JIT_Matrix (_Field& F, const size_t m, const size_t n,
+ JIT_Matrix (const _Field& F, const size_t m, const size_t n,
const JIT_EntryGenerator& JIT) :
- _field(F), _m(m), _n(n), _gen(JIT)
+ _field(&F), _m(m), _n(n), _gen(JIT)
{};
template<class OutVector, class InVector>
- OutVector& apply (OutVector& y, const InVector& x) ;
- //OutVector& apply (OutVector& y, const InVector& x) const;
-
+ OutVector& apply (OutVector& y, const InVector& x) const;
template<class OutVector, class InVector>
- OutVector& applyTranspose (OutVector& y, const InVector& x);
- //OutVector& applyTranspose (OutVector& y, const InVector& x) const;
+ OutVector& applyTranspose (OutVector& y, const InVector& x) const;
size_t rowdim (void) const { return _m; }
size_t coldim (void) const { return _n; }
- const Field& field() const { return _field; }
+ const Field& field() const { return *_field; }
protected:
// Field for arithmetic
- Field _field;
+ const Field *_field;
// Number of rows and columns of matrix.
size_t _m;
@@ -112,16 +116,16 @@ namespace LinBox
template <class Field, class JIT_EntryGenerator>
template <class OutVector, class InVector>
- inline OutVector& JIT_Matrix<Field, JIT_EntryGenerator>::apply (OutVector& y, const InVector& x)
+ inline OutVector& JIT_Matrix<Field, JIT_EntryGenerator>::apply (OutVector& y, const InVector& x) const
{
Element entry;
- _field.init(entry,0);
+ field().assign(entry,field().zero);
for (size_t i = 0; i < _m; ++i) {
- _field.init(y[i], 0);
+ field().assign(y[i], field().zero);
for (size_t j = 0; j < _n; ++j) {
_gen(entry, i, j);
- _field.axpyin (y[i], entry, x[j]);
+ field().axpyin (y[i], entry, x[j]);
}
}
return y;
@@ -130,14 +134,14 @@ namespace LinBox
template <class Field, class JIT_EntryGenerator>
template <class OutVector, class InVector>
- inline OutVector& JIT_Matrix<Field, JIT_EntryGenerator>::applyTranspose (OutVector& y, const InVector& x)
+ inline OutVector& JIT_Matrix<Field, JIT_EntryGenerator>::applyTranspose (OutVector& y, const InVector& x) const
{
Element entry;
- _field.init(entry,0);
+ field().assign(entry,field().zero);
for (size_t i = 0; i < _m; ++i) {
- _field.init(y[i], 0);
+ field().assign(y[i], field().zero);
for (size_t j = 0; j < _n; ++j) {
- _field.axpyin ( y[i], x[j], _gen(entry, j, i) );
+ field().axpyin ( y[i], x[j], _gen(entry, j, i) );
}
}
return y;
diff --git a/linbox/blackbox/lambda-sparse.h b/linbox/blackbox/lambda-sparse.h
index ea7d224..e67b30f 100644
--- a/linbox/blackbox/lambda-sparse.h
+++ b/linbox/blackbox/lambda-sparse.h
@@ -26,7 +26,7 @@
#ifndef __LINBOX_lambda_sparse_H
#define __LINBOX_lambda_sparse_H
-#include "linbox/blackbox/sparse.h"
+#include "linbox/matrix/sparse-matrix.h"
#include "linbox/blackbox/archetype.h"
#include "linbox/vector/stream.h"
#include "linbox/vector/vector-traits.h"
@@ -61,11 +61,11 @@ namespace LinBox
typename Field::RandIter _randiter(F);
double init_p = 1.0 - 1.0 / (double) card;
double log_m = LAMBDA * log ((double) m) / M_LN2;
- double new_p;
RandomSparseStream<Field,typename Vector<Field>::SparseSeq> stream (F, _randiter, init_p, n, m );
for (unsigned int i = 0; i < m; ++i) {
+ double new_p;
new_p = log_m / double(m - i);
if (init_p < new_p)
@@ -86,11 +86,11 @@ namespace LinBox
typename Field::RandIter _randiter(F,size,0);
double init_p = 1.0 - 1.0 / (double) size;
double log_m = LAMBDA * log ((double) m) / M_LN2;
- double new_p;
RandomSparseStream<Field,typename Vector<Field>::SparseSeq> stream (F, _randiter, init_p, n, m );
for (unsigned int i = 0; i < m; ++i) {
+ double new_p;
new_p = log_m / double(m - i);
if (init_p < new_p)
@@ -139,7 +139,7 @@ namespace LinBox
for (; iter != this->End(); ++iter)
if (*iter > max) max=*iter;
- this->_field.convert(norm,max);
+ this->field().convert(norm,max);
return norm;
}
@@ -154,11 +154,10 @@ namespace LinBox
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
// Local Variables:
// mode: C++
// tab-width: 8
// indent-tabs-mode: nil
// c-basic-offset: 8
// End:
-
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/blackbox/matrix-blackbox.h b/linbox/blackbox/matrix-blackbox.h
index 76ceaee..89687ae 100644
--- a/linbox/blackbox/matrix-blackbox.h
+++ b/linbox/blackbox/matrix-blackbox.h
@@ -32,7 +32,7 @@
#include "linbox/blackbox/blackbox-interface.h"
#include "linbox/blackbox/archetype.h"
#include "linbox/matrix/matrix-domain.h"
-#include "linbox/matrix/sparse.h"
+#include "linbox/matrix/sparse-matrix.h"
#include "linbox/field/rebind.h"
// Namespace in which all LinBox library code resides
@@ -65,7 +65,7 @@ namespace LinBox
* @param rep Matrix from which to construct the black box
*/
MatrixBlackbox (const Field &F, Matrix &Rep) :
- _field (F), _MD (F), _matA (Rep)
+ _field (&F), _MD (F), _matA (Rep)
{}
/** Constructor with size
@@ -77,7 +77,7 @@ namespace LinBox
* @param n Column dimension
*/
MatrixBlackbox (const Field &F, size_t m, size_t n) :
- _field (F), _MD (F), _matA (F, m, n)
+ _field (&F), _MD (F), _matA (F, m, n)
{}
/** Constructor
@@ -90,13 +90,13 @@ namespace LinBox
*/
template <class Row>
MatrixBlackbox (const Field &F, VectorStream<Row> &stream) :
- _field (F), _MD (F), _matA (stream)
+ _field (&F), _MD (F), _matA (stream)
{}
/** Copy constructor
*/
MatrixBlackbox (const MatrixBlackbox &B) :
- _field (B._field), _MD (B._field), _matA (B._matA)
+ _field (B._field), _MD (*(B._field)), _matA (B._matA)
{}
/** Destructor. */
@@ -183,7 +183,7 @@ namespace LinBox
/** Return a reference to the base field
*/
- inline const Field &field () const { return _field;}
+ inline const Field &field () const { return *_field;}
/** Return a reference to the underlying representation
*/
@@ -191,7 +191,7 @@ namespace LinBox
private:
- const Field &_field; // Field used for all arithmetic
+ const Field *_field; // Field used for all arithmetic
MatrixDomain<Field> _MD; // Matrix domain for matrix-vector
// operations
Matrix _matA; // Underlying matrix representation
diff --git a/linbox/blackbox/moore-penrose.h b/linbox/blackbox/moore-penrose.h
index 62fe954..b474872 100644
--- a/linbox/blackbox/moore-penrose.h
+++ b/linbox/blackbox/moore-penrose.h
@@ -86,9 +86,10 @@ namespace LinBox
_matGGT = new Compose<Submatrix<Blackbox>, Transpose<Submatrix<Blackbox> > > (_matGG, _matGT);
_matFTFinv = new Inverse<Compose<Transpose<Submatrix<Blackbox> >,Submatrix<Blackbox> > > ( _matFTF);
_matGGTinv = new Inverse<Compose<Submatrix<Blackbox>, Transpose<Submatrix<Blackbox> > > > ( _matGGT);
- }
+ }
/** Copy constructor
+ * @bug Value of pointer '_matB1', which points to allocated memory, is copied in copy constructor instead of allocating new memory.
*/
MoorePenrose (const MoorePenrose &A) :
_matA ( A._matA),
@@ -211,11 +212,10 @@ namespace LinBox
#endif // __LINBOX_moore_penrose_H
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
// Local Variables:
// mode: C++
// tab-width: 8
// indent-tabs-mode: nil
// c-basic-offset: 8
// End:
-
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/blackbox/ntl-hankel.h b/linbox/blackbox/ntl-hankel.h
index 41bec72..fe871e2 100644
--- a/linbox/blackbox/ntl-hankel.h
+++ b/linbox/blackbox/ntl-hankel.h
@@ -28,6 +28,7 @@
#include "linbox/blackbox/blackbox-interface.h"
#include "toeplitz.h" // we inherit everything from ntl-toeplitz
+// #include "linbox/vector/blas-vector.h"
//#define DBGMSGS 1
@@ -45,17 +46,35 @@ namespace LinBox
typedef _Field Field;
typedef typename Field::Element Element;
+ typedef Toeplitz<_Field> TBase;
+ typedef TBase Father_t;
+ using TBase::P;
+ using TBase::rowDim;
+ using TBase::colDim;
+ using TBase::sysDim;
+ using TBase::shape;
+ using TBase::pdata;
+ using TBase::rpdata;
+ using TBase::field_;
+ using TBase::field;
+
+
template<typename _Tp1>
struct rebind
{ typedef Hankel<_Tp1> other; };
//------- CONSTRUCTORS AND DESTRUCTORS
- ~Hankel(); // Destructor
- Hankel(); // Zero Param Constructor
- Hankel( const Field F, // Cnstr. with Field and STL vec. of elems
- const std::vector<Element>&v);
+ ~Hankel();
+ // Hankel();// : Toeplitz<_Field>(){}
+ Hankel( const Field F) : Father_t (F) {};
+ // Cnstr. with Field and STL vec. of elems
+ Hankel( const Field F, const std::vector<Element>&v);// : Toeplitz<_Field>(F, v){}
+ Hankel( const BlasVector<Field>&v);// : Toeplitz<_Field>(F, v){}
+
+ Hankel( const Field F, size_t n);// : Toeplitz<_Field>(F, n) {}
// Hankel(char *dataFileName ); // read from a file
+ //void init( const Field F, size_t n) { Toeplitz<_Field>::init(F, n) }
//------- INHERITED READ-ONLY ACCESSOR, and OBSERVER METHODS
@@ -66,11 +85,6 @@ namespace LinBox
* inline size_t sysdim() const;// Max of rows & columns;
*/
- //------- MUTATOR METHODS
-
- void setToUniModUT() ; // Convert to UTriang matrix with det 1
- void setToUniModLT() ; // Convert to LTriang matrix with det 1
-
//------ SERVICE METHODS
template<class OutVector, class InVector>
OutVector& apply( OutVector &v_out, const InVector& v_in) const;
@@ -87,11 +101,10 @@ namespace LinBox
#endif //__LINBOX_ntl_hankel_H
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
// Local Variables:
// mode: C++
// tab-width: 8
// indent-tabs-mode: nil
// c-basic-offset: 8
// End:
-
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/blackbox/ntl-hankel.inl b/linbox/blackbox/ntl-hankel.inl
index 8eb82fa..326d4b6 100644
--- a/linbox/blackbox/ntl-hankel.inl
+++ b/linbox/blackbox/ntl-hankel.inl
@@ -56,6 +56,7 @@ namespace LinBox
+#if 0
/*-----------------------------------------------------------------
*---- Default Constructor
*----------------------------------------------------------------*/
@@ -69,6 +70,7 @@ namespace LinBox
#endif
}//----- Zero Param Constructor ---- [Tested 6/14/02 -- Works]
+#endif
@@ -78,21 +80,21 @@ namespace LinBox
*----------------------------------------------------------------*/
template <class Field>
Hankel<Field>::Hankel( const Field F,
- const std::vector<typename Field::Element>&v)
+ const std::vector<typename Field::Element>&v) : Father_t(F)
{
// Assumes that the input is a vector of ZZ_p else things will FAIL
- if ( (1 & v.size()) == 0)
+ if ( isEven(v.size()) )
{
std::cout << "There must be an ODD number of entries in the input vector " <<
"The length given is " << v.size();
}
- assert( (1 & v.size()) == 1);
+ assert( isOdd(v.size()) );
this->rowDim = (1+v.size())/2; // The vector is 0..2n-2;
this->colDim = (1+v.size())/2;
this->sysDim = (1+v.size())/2;
- this->pdata.SetMaxLength( v.size());
+ this->pdata.SetMaxLength( (long) v.size());
// rpdata.SetMaxLength( v.size());
for (unsigned int i=0; i< v.size(); i++)
{
@@ -107,6 +109,37 @@ namespace LinBox
}//----- Constructor given a vector----
+ /*-----------------------------------------------------------------
+ *----- Constructor With User-Supplied First Row And Column
+ *----------------------------------------------------------------*/
+ template <class Field>
+ Hankel<Field>::Hankel( const BlasVector<Field>&v ) :
+ Father_t(v.field())
+ {
+ //! @warning Assumes that the input is a vector of ZZ_p else things will FAIL
+ if ( isEven( v.size() ) )
+ {
+ std::cout << "There must be an ODD number of entries in the input vector " <<
+ "The length given is " << v.size();
+ }
+ assert( isOdd(v.size()) );
+
+ this->rowDim = (1+v.size())/2; // The vector is 0..2n-2;
+ this->colDim = (1+v.size())/2;
+ this->sysDim = (1+v.size())/2;
+
+ this->pdata.SetMaxLength( (long) v.size());
+ for (unsigned int i=0; i< v.size(); i++)
+ {
+ this->P.setCoeff( this->pdata, i, v[i]);
+ }
+
+#ifdef DBGMSGS
+ std::cout << "Hankel::Hankel(F,V):\tCreated a " << this->rowDim << "x"<< this->colDim<<
+ " Hankel matrix "<< std::endl;
+#endif
+
+ }//----- Constructor given a vector----
/*-----------------------------------------------------------------
@@ -115,14 +148,16 @@ namespace LinBox
template <class Field>
void Hankel<Field>::print(std::ostream& os) const
{
- register size_t i, N, j;
+ size_t N;
os<< this->rowDim << " " << this->colDim << " " << this->shape.shape() << std::endl;
N = (this->rowDim-1)<<1;
if ( N < 20 ) { // Print small matrices in dense format
Element tmp;
+ size_t i;
for (i = N ; i >= this->colDim-1; i--) {
+ size_t j;
for ( j = 0; j < this->colDim ; j++)
os << " " << this->P.getCoeff(tmp, this->pdata,i-j) ;
os << std::endl;
@@ -179,21 +214,19 @@ namespace LinBox
* Make the matrix LOWER triangular with determinant 1.
* i.e. clear the last this->coldim-1 elements in the this->data vector
*----------------------------------------------------------------*/
+#if 0
template <class Field>
void Hankel<Field>::setToUniModLT()
{
int L = int(this->rowDim-1)<<1;
this->shape.shape(BlackboxSpecifier::UNIMOD_LT);
- Element one,zero;
- this->K.init(one,1);
- this->K.init(zero,0);
for (int i= int(this->rowDim)-1; i <= L; i++ ) {
// zero out the below-diagonal entries
- this->P.setCoeff(this->pdata,i,zero);
+ this->P.setCoeff(this->pdata,i,field().zero);
}
// set the antidiagonal to 1
- this->P.setCoeff( this->pdata, this->rowDim-1, one); // update the corresponding coeff of this->pdata
+ this->P.setCoeff( this->pdata, this->rowDim-1, field().one); // update the corresponding coeff of this->pdata
//reverse(rpdata,this->pdata); // no need to construct the transpose
return;
}//
@@ -210,23 +243,19 @@ namespace LinBox
{
this->shape.shape(BlackboxSpecifier::UNIMOD_UT);
- Element one,zero;
- this->K.init(one,1);
- this->K.init(zero,0);
-
for (size_t i=0; i < this->rowDim-1; i++ ) {
// zero out the below-antidiagonal entries
- this->P.setCoeff(this->pdata, i , zero);
+ this->P.setCoeff(this->pdata, i , field().zero);
}
// set antidiagonal to 1
- this->P.setCoeff(this->pdata,this->rowDim-1, one); // update the corresponding coeff of this->pdata
+ this->P.setCoeff(this->pdata,this->rowDim-1, field().one); // update the corresponding coeff of this->pdata
//reverse(rpdata,this->pdata); // no need to construct the transpose
return;
}//
-
+#endif
/*-----------------------------------------------------------------
* Apply the matrix to a vector Here the input and output
@@ -248,7 +277,7 @@ namespace LinBox
(v_in.size() == this->coldim())) ;
NTL::ZZ_pX pxOut, pxIn;
- pxIn.SetMaxLength( v_in.size()-1);
+ pxIn.SetMaxLength( (long) v_in.size()-1);
for (unsigned int i=0; i< v_in.size(); i++)
this->P.setCoeff( pxIn, i, v_in[i]);
@@ -263,7 +292,7 @@ namespace LinBox
#endif
int N = (int)this->rowdim();
for ( int i= 0; i < N; i++)
- this->P.getCoeff(v_out[N-1-i], pxOut, N-1+i);
+ this->P.getCoeff(v_out[(size_t)(N-1-i)], pxOut, (size_t)(N-1+i));
return v_out;
@@ -291,11 +320,10 @@ namespace LinBox
#endif //__LINBOX_bb_ntl_hankel_INL
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
// Local Variables:
// mode: C++
// tab-width: 8
// indent-tabs-mode: nil
// c-basic-offset: 8
// End:
-
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/blackbox/ntl-sylvester.h b/linbox/blackbox/ntl-sylvester.h
index 958cc32..a588fa6 100644
--- a/linbox/blackbox/ntl-sylvester.h
+++ b/linbox/blackbox/ntl-sylvester.h
@@ -47,10 +47,13 @@ namespace LinBox
typedef _Field Field;
typedef typename Field::Element element; // Currently restricted to ZZ_p
~Sylvester(); // Destructor
- Sylvester(); // Default Constructor
+ Sylvester( const Field &F ); // Default Constructor
Sylvester( const Field F,
const std::vector<element> &vpx,
const std::vector<element> &vpy ); // Constructor given 2 polys and Field
+ Sylvester(
+ const BlasVector<Field> &vpx,
+ const BlasVector<Field> &vpy );
void print( std::ostream& os = std::cout ) const; // Print to stream or stdout
@@ -75,8 +78,12 @@ namespace LinBox
//Sylvester(char *dataFileName ); // read from a file -- not implemented yet
+ std::ostream& write(std::ostream & os)
+ {
+ os << "NOT YET" ;
+ return os ;
+ }
protected:
- Field K;
size_t rowDim,
colDim,
@@ -92,6 +99,7 @@ namespace LinBox
size_t qxdeg() const { return qdata.size() - 1; }
+ const Field & K;
};// End, Sylvester
}
diff --git a/linbox/blackbox/ntl-sylvester.inl b/linbox/blackbox/ntl-sylvester.inl
index e007e8e..1578c79 100644
--- a/linbox/blackbox/ntl-sylvester.inl
+++ b/linbox/blackbox/ntl-sylvester.inl
@@ -53,7 +53,8 @@ namespace LinBox
* Default constructor.
*---------------------------------------------------------------------*/
template <class Field>
- Sylvester<Field>::Sylvester()
+ Sylvester<Field>::Sylvester( const Field & F) :
+ pdata(0),qdata(0),K(F)
{
sysDim = // Default dimension is 0
rowDim = // Default row dim is 0
@@ -79,7 +80,7 @@ namespace LinBox
const std::vector<typename Field::Element> &vp,
const std::vector<typename Field::Element> &vq
) :
- pdata(vp), qdata(vq)
+ pdata(vp), qdata(vq), K(F)
{
// Set the row, col, and system dimensions
@@ -88,14 +89,14 @@ namespace LinBox
sysDim = vp.size() + vq.size()-2; // square system with dimension deg(px)+deg(qx)
// Copy the vector to a polynomial representation, for px
- pxdata.SetMaxLength( vp.size() );
+ pxdata.SetMaxLength((long) vp.size() );
for (size_t ip=0; ip< vp.size(); ip++ )
- SetCoeff( pxdata, ip, vp[ip]);
+ SetCoeff( pxdata, (long)ip, vp[ip]);
// Copy the vector to a polynomial representation, for qx
- qxdata.SetMaxLength( vq.size() );
+ qxdata.SetMaxLength((long) vq.size() );
for ( size_t iq=0; iq< vq.size(); iq++ )
- SetCoeff( qxdata, iq, vq[iq] );
+ SetCoeff( qxdata, (long)iq, vq[iq] );
#ifdef DBGMSGS
@@ -103,17 +104,61 @@ namespace LinBox
"x"<< colDim<< " Sylvester matrix "<< std::endl;
#endif
- /* Inserted for a timing calculation with the gcd
- * double start_time = GetTime();
- * ZZ_pX gx;
- * GCD( gx, pxdata, qxdata);
- *
- * double end_time = GetTime();
- * cout << gx << endl;
- * std::cout << "Time for gcd = " << end_time-start_time << " sec\n";
- */
+ /* Inserted for a timing calculation with the gcd */
+#if 0
+ double start_time = GetTime();
+ ZZ_pX gx;
+ GCD( gx, pxdata, qxdata);
+
+ double end_time = GetTime();
+ cout << gx << endl;
+ std::cout << "Time for gcd = " << end_time-start_time << " sec\n";
+#endif
+
}// Sylvester()
+ template <class Field>
+ Sylvester<Field>::Sylvester(
+ const BlasVector<Field> &vp,
+ const BlasVector<Field> &vq
+ ) :
+ pdata(vp.size()), qdata(vq.size()), K(vp.field())
+ {
+ std::copy(vp.begin(), vp.end(), pdata.begin());
+ std::copy(vq.begin(), vq.end(), qdata.begin());
+
+ // Set the row, col, and system dimensions
+ rowDim =
+ colDim =
+ sysDim = vp.size() + vq.size()-2; // square system with dimension deg(px)+deg(qx)
+
+ // Copy the vector to a polynomial representation, for px
+ pxdata.SetMaxLength((long) vp.size() );
+ for (size_t ip=0; ip< vp.size(); ip++ )
+ SetCoeff( pxdata, (long)ip, vp[ip]);
+
+ // Copy the vector to a polynomial representation, for qx
+ qxdata.SetMaxLength((long) vq.size() );
+ for ( size_t iq=0; iq< vq.size(); iq++ )
+ SetCoeff( qxdata, (long)iq, vq[iq] );
+
+
+#ifdef DBGMSGS
+ std::cout << "Sylvester::Sylvester(F,v,w):\tCreated a " << rowDim <<
+ "x"<< colDim<< " Sylvester matrix "<< std::endl;
+#endif
+
+#if 0
+ double start_time = GetTime();
+ ZZ_pX gx;
+ GCD( gx, pxdata, qxdata);
+
+ double end_time = GetTime();
+ cout << gx << endl;
+ std::cout << "Time for gcd = " << end_time-start_time << " sec\n";
+#endif
+
+ }// Sylvester()
/*----------------------------------------------------------------------
@@ -279,28 +324,28 @@ namespace LinBox
NTL::ZZ_pX txOut, txIn;
/*--------------- Convert input vector to a polynomial ---------*/
- txIn.SetMaxLength( v_in.size() -1 );
+ txIn.SetMaxLength( (long)v_in.size() -1 );
for ( size_t i=0; i < v_in.size(); i++ )
- SetCoeff( txIn, i, v_in[i] );
+ SetCoeff( txIn, (long)i, v_in[i] );
/*-------------- Poly multiply the upper Sylvester poly by input ------*/
mul( txOut, txIn, pxdata);
- int Nq = qxdeg();
- int m = pxdeg();
+ const size_t Nq = qxdeg();
+ const size_t m = pxdeg();
/*-------------- vout[0..deg(q)-1] <--- txout[deg(qx)...2deg(qx)-1] --- */
- for ( int i=0; i < Nq; ++i )
- GetCoeff(v_out[i], txOut, m+i);
+ for ( size_t i=0; i < Nq; ++i )
+ GetCoeff(v_out[i], txOut, (long)(m+i));
/*-------------- Poly multiply the lower Sylvester poly by input -----*/
mul( txOut, txIn, qxdata);
- int Np = pxdeg();
- int n = qxdeg();
+ const size_t Np = pxdeg();
+ const size_t n = qxdeg();
/*-------------- vout[deg(qx)..deg(qx)+deg(px)-1] <---
* txout[deg(qx)...deg(qx)+deg(px)-1] --- */
- for ( int i=0; i < Np; ++i )
- GetCoeff(v_out[Nq+i], txOut, n+i );
+ for ( size_t i=0; i < Np; ++i )
+ GetCoeff(v_out[Nq+i], txOut, (long)(n+i) );
return v_out;
@@ -338,22 +383,22 @@ namespace LinBox
/*--------- We need to reverse the input vector -----------*/
/*--------- txIn[0...m-1] <--- vin[m-1...0] ----------*/
- txIn.SetMaxLength( qxdeg()-1 );
+ txIn.SetMaxLength((long) qxdeg()-1 );
for ( size_t i=0; i < qxdeg(); i++ )
- SetCoeff( txIn, qxdeg()-1-i, v_in[i] );
+ SetCoeff( txIn, (long)(qxdeg()-1-i), v_in[i] );
mul( txOut, txIn, pxdata); // Do the poly multiply
/*--------- We need to reverse the output vector -----------*/
/*------- v_out[0..N-1] <--- txOut[N-1...0] --------*/
for (size_t i=0; i < v_out.size(); i++)
- GetCoeff(v_out[i], txOut, sysdim()-1-i); // Extract the coeffs
+ GetCoeff(v_out[i], txOut, (long)(sysdim()-1-i)); // Extract the coeffs
/*--------- We need to reverse the input vector -----------*/
/*--------- txIn[m ... m+n-1] <--- vin[m+n-1 ... m] -----------*/
- txIn.SetMaxLength( pxdeg()-1 );
+ txIn.SetMaxLength((long) pxdeg()-1 );
for ( size_t i=0; i < pxdeg(); i++ )
- SetCoeff( txIn,pxdeg()-1-i, v_in[qxdeg()+i] );
+ SetCoeff( txIn, (long)(pxdeg()-1-i), v_in[qxdeg()+i] );
mul( txOut, txIn, qxdata); // do the poly multiply
@@ -361,7 +406,7 @@ namespace LinBox
/*------- v_out[0..N-1] <--- txOut[N-1...0] --------*/
for (size_t i=0; i < v_out.size(); i++) {
- GetCoeff(tval, txOut, sysdim()-1-i);
+ GetCoeff(tval, txOut, (long)(sysdim()-1-i));
add( v_out[i], v_out[i], tval ); // add to the accumulated output
}
diff --git a/linbox/blackbox/pascal.h b/linbox/blackbox/pascal.h
new file mode 100644
index 0000000..92e82ba
--- /dev/null
+++ b/linbox/blackbox/pascal.h
@@ -0,0 +1,278 @@
+
+#ifndef __LINBOX_pascal_H
+#define __LINBOX_pascal_H
+
+#include <iostream>
+#include <vector>
+#include <limits>
+#include <algorithm>
+
+#ifdef __LINBOX_USE_OPENMP
+#include <omp.h>
+#endif
+
+#include "linbox/util/debug.h"
+#include "linbox/matrix/sliced3.h"
+
+#define PASCAL_BASECASE_THRESH 81
+
+namespace LinBox {
+
+template <class Field>
+class ModularNChooseK {
+public:
+ typedef typename Field::Element Element;
+
+ int reduceZeros(int x)
+ {
+ while ((x>0)&&(x%q_==0)) {
+ x/=q_;
+ }
+ return x;
+ }
+
+ void initFactorials()
+ {
+ factList_.resize(maxN_+1);
+ Element d;
+ F_.assign(factList_[0],F_.one);
+ for (int i=1;i<maxN_+1;++i) {
+ F_.init(d,reduceZeros(i));
+ if (d==0) {
+ F_.assign(factList_[i],factList_[i-1]);
+ } else {
+ F_.mul(factList_[i],factList_[i-1],d);
+ }
+ }
+ }
+
+ void initPowerList()
+ {
+ powerList_.resize(maxN_+1);
+ for (int i=0;i<maxN_+1;++i) {
+ powerList_[i]=0;
+ }
+ for (int k=q_;k<maxN_;k*=q_) {
+ for (int i=k-1;i<maxN_;i+=k) {
+ ++powerList_[i+1];
+ }
+ }
+
+ int sum=0;
+ for (int i=0;i<maxN_+1;++i) {
+ sum+=powerList_[i];
+ powerList_[i]=sum;
+ }
+ }
+
+ ModularNChooseK(Field& F, int q, int maxN) :
+ F_(F), q_(q), maxN_(maxN)
+ {
+
+ initPowerList();
+ initFactorials();
+ }
+
+ Element& compute(Element& d,int n,int k)
+ {
+ int denomPower=powerList_[k]+powerList_[n-k];
+ int numerPower=powerList_[n];
+ if (numerPower>denomPower) {
+ F_.assign(d,F_.zero);
+ } else {
+ linbox_check(numerPower==denomPower);
+ F_.mul(d,factList_[n-k],factList_[k]);
+ F_.div(d,factList_[n],d);
+ }
+ return d;
+
+ }
+protected:
+ Field F_;
+ int q_;
+ std::vector<int> powerList_;
+ std::vector<Element> factList_;
+ int maxN_;
+};
+
+template <class Field>
+class PascalBlackbox {
+public:
+ typedef typename Field::Element Element;
+
+ template <class Vector>
+ PascalBlackbox(int r,
+ int c,
+ const Vector& polyCoeffs,
+ Field& F) :
+ polyCoeffs_(polyCoeffs),
+ rowdim_(r),coldim_(c),
+ F_(F)
+ {
+ initPowersOfThree();
+ initBaseCase();
+ }
+
+ void initBaseCase()
+ {
+ ModularNChooseK<Field> Choose(F_,3,std::max(rowdim_+coldim_,2*PASCAL_BASECASE_THRESH)+1);
+ nonZeroRows_.clear();
+ nonZeroCols_.clear();
+ nonZerosUnflipped_.clear();
+ nonZerosFlipped_.clear();
+ int r=PASCAL_BASECASE_THRESH;
+ Element two;
+ F_.add(two,F_.one,F_.one);
+ for (int k=0;k<(2*r)-1;++k) {
+ for (int j=(k<r)?0:(1+k-4);j<std::min(k+1,r);++j) {
+ Element d;
+ int i=k-j;
+ Choose.compute(d,k,j);
+ if (!F_.isZero(d)) {
+ nonZeroRows_.push_back(i);
+ nonZeroCols_.push_back(j);
+ nonZerosUnflipped_.push_back(d);
+ F_.mulin(d,two);
+ nonZerosFlipped_.push_back(d);
+ }
+ }
+ }
+ }
+
+ template <class Mat1, class Mat2>
+ Mat1& applyLeft(Mat1& lhs,const Mat2& rhs) const
+ {
+ int r=std::max(PASCAL_BASECASE_THRESH,
+ nextPowerOfThree(std::max(rowdim_,coldim_)));
+ lhs.zero();
+ applyLeft(0,0,r,lhs,const_cast<Mat2&>(rhs),false,1);
+ return lhs;
+ }
+
+ template<class Mat1, class Mat2>
+ void applyLeft(int i0, int j0, int r, Mat1& lhs,Mat2& rhs, bool flip, int numThreads) const
+ {
+ if (i0 > rowdim_ || j0 > coldim_) return;
+ if (r<=PASCAL_BASECASE_THRESH) {
+ if (flip) {
+ applyHelper(i0,j0,r,lhs,rhs,nonZerosFlipped_);
+ } else {
+ applyHelper(i0,j0,r,lhs,rhs,nonZerosUnflipped_);
+ }
+ } else {
+ int r3=r/3;
+
+//CP: removing all explicit OMP calls
+// to be replaced by calls to FFLAS-FFPACK's DSL
+
+// #ifdef __LINBOX_USE_OPENMP
+// int threadLimit=omp_get_max_threads();
+// //int threadLimit=4;
+// #endif
+
+// #pragma omp parallel sections if (numThreads+2<=threadLimit) shared(lhs,rhs)
+// {
+// #pragma omp section
+ applyLeft(i0,j0,r3,lhs,rhs,flip,numThreads+2);
+// #pragma omp section
+ applyLeft(i0+r3,j0,r3,lhs,rhs,flip,numThreads+2);
+// #pragma omp section
+ applyLeft(i0+2*r3,j0,r3,lhs,rhs,flip,numThreads+2);
+// }
+
+// #pragma omp parallel sections if (numThreads+1<=threadLimit) shared(lhs,rhs)
+// {
+// #pragma omp section
+ applyLeft(i0,j0+r3,r3,lhs,rhs,flip,numThreads+1);
+// #pragma omp section
+ applyLeft(i0+r3,j0+r3,r3,lhs,rhs,!flip,numThreads);
+ // }
+
+
+ applyLeft(i0,j0+2*r3,r3,lhs,rhs,flip,numThreads+1);
+
+ }
+ }
+
+ template<class SlicedDom>
+ void applyHelper(int i0,int j0,int r,Sliced<SlicedDom>& lhs,Sliced<SlicedDom>& rhs,
+ const std::vector<uint16_t>& nonZeros) const
+ {
+ int nnz=nonZeroRows_.size();
+ for (int l=0;l<nnz;++l) {
+ int i=nonZeroRows_[l]+i0;
+ int j=nonZeroCols_[l]+j0;
+ int k=i+j;
+ if (i>=rowdim_ || j>=coldim_) {
+ continue;
+ }
+ if (F_.isZero(polyCoeffs_[k])) {
+ continue;
+ }
+ Element d;
+ d=nonZeros[l];
+ F_.mul(d,d,polyCoeffs_[k]);
+ typename Sliced<SlicedDom>::RawIterator Ab(lhs.rowBegin(i)),
+ Ae(lhs.rowEnd(i)), Bb(rhs.rowBegin(j));
+ lhs.axpyin(Ab,Ae,d,Bb);
+ }
+ }
+
+ template<class Mat1, class Mat2>
+ void applyHelper(int i0,int j0,int r,Mat1& lhs,Mat2& rhs,const std::vector<uint16_t>& nonZeros) const
+ {
+ int nnz=nonZeroRows_.size();
+ int w=rhs.coldim();
+ for (int l=0;l<nnz;++l) {
+ int i=nonZeroRows_[l]+i0;
+ int j=nonZeroCols_[l]+j0;
+ int k=i+j;
+ if (i>=rowdim_ || j>=coldim_) {
+ continue;
+ }
+ if (F_.isZero(polyCoeffs_[k])) {
+ continue;
+ }
+ Element d;
+ d=nonZeros[l];
+ F_.mul(d,d,polyCoeffs_[k]);
+ typename Mat2::constSubMatrixType Xr(rhs,j,0,1,w);
+ typename Mat1::subMatrixType Yr(lhs,i,0,1,w);
+ lhs._MD.saxpyin(Yr,d,Xr);
+ }
+ }
+
+ size_t rowdim() const {return rowdim_;}
+ size_t coldim() const {return coldim_;}
+
+ const Field& field() const {
+ return F_;
+ }
+
+protected:
+ std::vector<Element> polyCoeffs_;
+ int rowdim_,coldim_;
+ Field F_;
+ std::vector<int> powersOfThree_;
+ std::vector<uint16_t> nonZeroRows_,nonZeroCols_,nonZerosFlipped_,nonZerosUnflipped_;
+
+ void initPowersOfThree()
+ {
+ int x=1;
+ while (x<std::numeric_limits<int>::max()/3) {
+ powersOfThree_.push_back(x);
+ x*=3;
+ }
+ powersOfThree_.push_back(x);
+ }
+ int nextPowerOfThree(int x) const
+ {
+ int i=0;
+ while (powersOfThree_[i] < x) {++i;}
+ return powersOfThree_[i];
+ }
+};
+
+}
+
+#endif //__LINBOX_pascal_H
diff --git a/linbox/blackbox/permutation.h b/linbox/blackbox/permutation.h
index ad4b3ba..81cef09 100644
--- a/linbox/blackbox/permutation.h
+++ b/linbox/blackbox/permutation.h
@@ -6,7 +6,7 @@
* ========LICENCE========
* This file is part of the library LinBox.
*
- * LinBox is free software: you can redistribute it and/or modify
+ * LinBox is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
@@ -26,72 +26,94 @@
#define __LINBOX_bb_permutation_H
#include <utility>
-#ifndef __LINBOX_PERMUTATION_STORAGE
-// #include "linbox/vector/light_container.h"
-// #define __LINBOX_PERMUTATION_STORAGE LightContainer< long >
-#include <vector>
-#define __LINBOX_PERMUTATION_STORAGE std::vector< long >
-#endif
+#include <algorithm>
-#include "linbox/util/debug.h"
#include "linbox/linbox-config.h"
-#include "linbox/blackbox/blackbox-interface.h"
-
-#ifdef __LINBOX_XMLENABLED
-
-#include "linbox/util/xml/linbox-reader.h"
-#include "linbox/util/xml/linbox-writer.h"
-
-#include <iostream>
-#include <string>
-
-#endif //__LINBOX_XMLENABLED
+#include "linbox/linbox-tags.h"
+#include "linbox/matrix/dense-matrix.h"
+#include "linbox/matrix/matrix-domain.h"
+#include "linbox/randiter/mersenne-twister.h"
+#include "linbox/blackbox/fibb.h"
-
-// Namespace in which all LinBox library code resides
namespace LinBox
{
- /** \brief size is n.
+ /** \brief
\ingroup blackbox
- * @param Storage \ref LinBox dense or sparse vector of field elements
*/
- template<class _Field, class _Storage = __LINBOX_PERMUTATION_STORAGE >
- class Permutation : public BlackboxInterface {
- const _Field& _field;
+ template<class _Field, class _Matrix=DenseMatrix<_Field>>
+ class Permutation : public FIBB<_Field>
+ {
+ public:
+ typedef _Field Field;
+ typedef typename Field::Element Element;
+ typedef Permutation<Field> Self_t;
+ typedef LightContainer<long> Storage;
+ typedef _Matrix Matrix;
+ protected:
+ Storage _indices; // Vector of indices
+ bool alloc; //
+ const Field* _field;
public:
- typedef Permutation<_Field, _Storage> Self_t;
- typedef _Storage Storage;
- typedef _Field Field;
- typedef typename Field::Element Element;
/** Constructor from a vector of indices.
* This constructor creates a permutation matrix based on a vector of indices
* @param F
* @param indices Vector of indices representing the permutation
+ * Permutation P has 1 in the P_{i, _indices[i]} positions.
*/
Permutation (Storage & indices, const Field& F = Field()) :
- _field(F), _indices (indices)
+ _field(&F), _indices (indices)
{}
- /** Constructor from a dimension.
- * This constructor creates an n x n permutation matrix, initialized to be the identity
- * @param n The dimension of hte matrix to create
- * @param F
+ Self_t& init(size_t* P, size_t n)
+ { _indices.resize(n);
+ for (size_t i = 0; i < n; ++i)
+ _indices[i] = P[i];
+ return *this;
+ }
+
+ Permutation (size_t* P, size_t n, const Field& F = Field())
+ : _field(&F)
+ { init(P, n); }
+
+ /** \brief n x n permutation matrix, initially the identity.
+ * @param n The dimension of the matrix
+ * @param F field or ring
*/
Permutation (int n, const Field& F = Field()) :
- _field(F)
+ _field(&F)
{
identity(n);
}
+ Permutation (const Field& F = Field(), size_t n=0, size_t m = 0) :
+ _field(&F)
+ {
+ identity((int)n);
+ }
+
+ //!@bug should be size_t
void identity(int n)
{
- this->_indices.resize (n);
+ this->_indices.resize ((size_t)n);
for (typename Storage::value_type i=0; i < n; ++i)
- _indices[i] = i;
+ _indices[(size_t)i] = i;
+ }
+
+ //void random(size_t n)
+ void random()
+ {
+ size_t n = rowdim();
+ identity((int)n);
+ MersenneTwister r((unsigned int)time(NULL));
+ // Knuth construction
+ for (size_t i = 0; i < n-1; ++i) {
+ size_t j = i + r.randomInt()%(n-i);
+ std::swap(_indices[(size_t)i], _indices[(size_t)j]);
+ }
}
@@ -103,21 +125,6 @@ namespace LinBox
_field(Mat._field),_indices (Mat._indices)
{}
-#ifdef __LINBOX_XMLENABLED
- Permutation(LinBox::Reader &R)
- {
- if(!R.expectTagName("MatrixOver")) return;
- if(!R.expectChildTag()) return;
- R.traverseChild();
-
- if(!R.expectTagName("permutation") || !R.expectTagNumVector(_indices)) return;
-
- R.upToParent();
- return;
- }
-#endif
-
-
// Destructor
~Permutation (void) {}
@@ -141,7 +148,7 @@ namespace LinBox
linbox_check (y.size () == _indices.size ());
for (i = 0; i < x.size(); ++i)
- _field.assign(y[i], x[_indices[i]]);
+ field().assign(y[(size_t)i], x[(size_t)_indices[(size_t)i]]);
return y;
}
@@ -167,16 +174,114 @@ namespace LinBox
linbox_check (y.size () == _indices.size ());
for (i = 0; i < _indices.size (); ++i)
- _field.assign(y[_indices[i]], x[i]);
+ field().assign(y[(size_t)_indices[(size_t)i]], x[(size_t)i]);
return y;
}
+#if 1
+ Matrix& applyRight(Matrix& Y, const Matrix& X) const
+ {
+ Element x; field().init(x);
+ for (size_t i = 0; i < Y.rowdim(); ++i){
+ size_t k = _indices[i];
+ for (size_t j = 0; j < Y.coldim(); ++j)
+ Y.setEntry(i,j, X.getEntry(x, k, j));
+ }
+ /* desired form
+ for (size_t i = 0; i < rowdim(); ++i)
+ {
+ Matrix Yrow(Y, i, 0, 1, Y.coldim());
+ Matrix Xrow(X, _indices[i], 0, 1, X.coldim());
+ Yrow.copy(Xrow); // right kind of copy?
+ }
+ */
+ return Y;
+ }
+ Matrix& applyLeft(Matrix& Y, const Matrix& X) const
+ {
+ Element x; field().init(x);
+ for (size_t i = 0; i < Y.coldim(); ++i){
+ size_t k = _indices[i];
+ for (size_t j = 0; j < Y.rowdim(); ++j)
+ Y.setEntry(j,k, X.getEntry(x, j, i));
+ }
+ /* desired form
+ for (size_t i = 0; i < coldim(); ++i)
+ {
+ Matrix Ycol(Y, 0, _indices[i], Y.rowdim(), 1);
+ Matrix Xcol(X, 0, i, X.rowdim(), 1);
+ Ycol.copy(Xcol);
+ }
+ */
+ return Y;
+ }
+ /* FIBB functions */
+ BBType bbTag() const { return permutation; }
+ size_t& rank(size_t& r) const
+ { return r = rowdim(); }
+
+ Element& det(Element& d) const
+ { size_t b = 0, i, j, k;
+ Storage marks(_indices.size());
+ for (i = 0; i < _indices.size(); ++i)
+ if (not marks[i])
+ { for (k = 1, j = _indices[i]; i != j; ++k, j = _indices[j])
+ ;
+ b &= k;
+ }
+ return d = b&1 ? field().mOne : field().one;
+ }
+
+ Matrix& solveRight(Matrix& Y, const Matrix& X) const
+ { Element x; field().init(x);
+ for (size_t i = 0; i < Y.rowdim(); ++i){
+ size_t k = _indices[i];
+ for (size_t j = 0; j < Y.coldim(); ++j)
+ Y.setEntry(k,j, X.getEntry(x, i, j));
+ }
+ /* desired form
+ for (size_t i = 0; i < rowdim(); ++i)
+ {
+ Matrix Yrow(Y, _indices[i], 0, 1, Y.coldim());
+ Matrix Xrow(X, i, 0, 1, X.coldim());
+ Yrow.copy(Xrow);
+ }
+ */
+ return Y;
+ }
+ Matrix& solveLeft(Matrix& Y, const Matrix& X) const
+ { Element x; field().init(x);
+ for (size_t i = 0; i < Y.coldim(); ++i){
+ size_t k = _indices[i];
+ for (size_t j = 0; j < Y.rowdim(); ++j)
+ Y.setEntry(j,i, X.getEntry(x, j, k));
+ }
+ /* desired form
+ for (size_t i = 0; i < coldim(); ++i)
+ {
+ Matrix Ycol(Y, 0, i, Y.rowdim(), 1);
+ Matrix Xcol(X, 0, _indices[i], X.rowdim(), 1);
+ Ycol.copy(Xcol);
+ }
+ */
+ return Y;
+ }
+ Matrix& nullspaceRandomRight(Matrix& N) const
+ { N.zero(); return N; }
+ Matrix& nullspaceRandomLeft(Matrix& N) const
+ { N.zero(); return N; }
+ Matrix& nullspaceBasisRight(Matrix& N) const
+ { N.resize(rowdim(), 0); return N; }
+ Matrix& nullspaceBasisLeft(Matrix& N) const
+ { N.resize(0, coldim()); return N; }
+ /* end FIBB section */
+#endif
template<typename _Tp1>
struct rebind {
- typedef Permutation<_Tp1, Storage> other;
+ typedef Permutation<_Tp1> other;
void operator() (other & Ap, const Self_t& A, const _Tp1& F) {
Ap->setStorage( A.getStorage() );
}
@@ -206,98 +311,162 @@ namespace LinBox
}
/**
- * Add a transposition to the matrix
- */
- void permute (size_t row1, size_t row2)
+ * this <-- transposition(i,j)*this
+ * indices (i = 0, j = 1):
+ * 0 2 1 * 1 0 2 = 1 2 0
+ * matrices (corresponding):
+ * 1 0 0 0 1 0 0 1 0
+ * 0 0 1 * 1 0 0 = 0 0 1
+ * 0 1 0 0 0 1 1 0 0
+ */
+ void permute (size_t i, size_t j)
{
- linbox_check (/* row1 >= 0 &&*/ row1 < _indices.size ());
- linbox_check (/* row2 >= 0 &&*/ row2 < _indices.size ());
- std::swap (_indices[row1], _indices[row2]);
-
+ linbox_check (/* i >= 0 &&*/ i < _indices.size ());
+ linbox_check (/* j >= 0 &&*/ j < _indices.size ());
+ std::swap (_indices[i], _indices[j]);
}
- const Field& field() { return _field; }
+ size_t operator[](size_t i) const {
+ return _indices[i];
+ }
-#ifdef __LINBOX_XMLENABLED
+ const Field& field() const { return *_field; }
- std::ostream &write(std::ostream &out) const
- {
- LinBox::Writer W;
- if( toTag(W) )
- W.write(out);
+ //!@bug needs a read. (needed by test-blackbox.h)
+ std::istream &read(std::istream &os)
+ { return read(os, Tag::FileFormat::Plain); }
- return out;
- }
+ //!@bug needs a MM version
+ std::ostream &write(std::ostream &os) const
+ { return write(os, Tag::FileFormat::Plain); }
- bool toTag(LinBox::Writer &W) const
- {
- std::string s;
- W.setTagName("MatrixOver");
- W.setAttribute("rows", LinBox::Writer::numToString(s, _indices.size()));
- W.setAttribute("cols", LinBox::Writer::numToString(s, _indices.size()));
- W.setAttribute("implDetail", "permutation");
-
- W.addTagChild();
- W.setTagName("permutation");
- W.addNumericalList(_indices);
- W.upToParent();
-
- return true;
- }
-#else
- std::ostream &write(std::ostream &os, FileFormatTag format = FORMAT_MAPLE) const
+ std::ostream &write(std::ostream &os, LINBOX_enum(Tag::FileFormat) format) const
{
- // for (typename Storage::const_iterator it=_indices.begin(); it!=_indices.end(); ++it)
- // std::cerr << *it << ' ';
- typename Field::Element one, zero; _field.init(one,1UL);_field.init(zero,0UL);
- os << "[";
- bool firstrow=true;
- long nmu = _indices.size()-1;
- for (typename Storage::const_iterator it=_indices.begin(); it!=_indices.end(); ++it) {
- if (firstrow) {
- os << "[";
- firstrow =false;
- }
- else
- os << ", [";
- long i=0;
- for( ; i< *it ; ++i) {
- _field.write(os, zero);
- if (i < nmu) os << ',';
+ // Avoid unneeded overhead in the case that this
+ // printing is disabled
+ if (not os)
+ return os;
+
+ switch (format) {
+ case Tag::FileFormat::Maple:
+ {
+ os << '[';
+ bool firstrow=true;
+ long nmu = (long)_indices.size()-1;
+ for (typename Storage::const_iterator it=_indices.begin(); it!=_indices.end(); ++it) {
+ if (firstrow) {
+ os << '[';
+ firstrow =false;
+ }
+ else
+ os << ", [";
+
+ long i=0;
+ for( ; i< *it ; ++i) {
+ field().write(os, field().zero);
+ if (i < nmu) os << ',';
+ }
+ field().write(os, field().one);
+ if (i < nmu) os << ',';
+ for(++i ; i< static_cast<long>(_indices.size()) ; ++i) {
+ field().write(os, field().zero);
+ if (i < nmu) os << ',';
+ }
+ os << ']';
+
+ }
+ os << ']';
+ break;
}
- _field.write(os, one);
- if (i < nmu) os << ',';
- for(++i ; i< static_cast<long>(_indices.size()) ; ++i) {
- _field.write(os, zero);
- if (i < nmu) os << ',';
+ case Tag::FileFormat::Pretty:
+ {
+ for (typename Storage::const_iterator it=_indices.begin(); it!=_indices.end(); ++it) {
+ os << " [";
+
+ long i=0;
+ for( ; i< *it ; ++i) {
+ field().write(os << ' ', field().zero);
+ }
+ field().write(os << ' ', field().one);
+ for(++i ; i< static_cast<long>(_indices.size()) ; ++i) {
+ field().write(os << ' ', field().zero);
+ }
+ os << " ]" << std::endl;
+
+ }
+ break;
}
- os << " ]";
+
+ default:
+ os << '{';
+ for (typename Storage::const_iterator it=_indices.begin(); it!=_indices.end(); ++it)
+ os << *it << ' ';
+ os << '}';
+ break;
+
+
}
- return os << "]";
+
+
+ return os;
+ }
+
+ //!@bug there is no read here. (needed by test-blackbox.h)
+ std::istream &read(std::istream &is, LINBOX_enum(Tag::FileFormat) format)
+ {
+ switch (format) {
+ case Tag::FileFormat::Plain:
+ {
+ char t;
+ is >> t;
+ Storage::value_type val;
+ _indices.resize(0);
+ while( t != '}') {
+ is >> val;
+ _indices.push_back(val);
+ is >> t;
+ if (t!='}') is.putback (t);
+ }
+ break;
+
+ }
+ default:
+ throw NotImplementedYet();
+ }
+ return is ;
}
-#endif
- Storage& setStorage(const Storage& s) { return _indices=s; }
- const Storage& getStorage() const { return _indices; }
- private:
- // Vector of indices
- Storage _indices;
+ Storage& setStorage(const Storage& s) { return _indices=s; }
+ const Storage& getStorage() const { return _indices; }
+ Storage& getStorage() { return _indices; }
- }; // template <Vector> class Permutation
+ /// Generate next permutation in lex order.
+ void next()
+ {
+ int n = _indices.size();
+ if (n == 1) return;
+ int i, j;
+ for (i = n-2; i >= 0 and _indices[(size_t)i] >= _indices[(size_t)i+1]; --i);
+ if (i < 0) {identity(n); return; }
+ for (j = i+2; j < n and _indices[(size_t)i] <= _indices[(size_t)j]; ++j);
+ std::swap(_indices[(size_t)i], _indices[(size_t)j-1]);
+ std::reverse(_indices.begin() + i + 1, _indices.end());
+ }
+
+}; // template <Vector> class Permutation
} // namespace LinBox
#endif // __LINBOX_bb_permutation_H
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
// Local Variables:
// mode: C++
// tab-width: 8
// indent-tabs-mode: nil
// c-basic-offset: 8
// End:
-
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/blackbox/polynomial.h b/linbox/blackbox/polynomial.h
index f9f8603..04c3934 100644
--- a/linbox/blackbox/polynomial.h
+++ b/linbox/blackbox/polynomial.h
@@ -93,7 +93,7 @@ namespace LinBox
inline Vector1 &apply (Vector1 &y, const Vector2 &x) const
{
Vector2 u (x);
- Vector2 v(u.size());
+ Vector2 v(field(),u.size());
_VD.mul( y, x, _P_ptr->operator[](0) );
for (size_t i=1; i<_P_ptr->size(); ++i){
_A_ptr->apply( v, u );
@@ -117,7 +117,7 @@ namespace LinBox
inline Vector1 &applyTranspose (Vector1 &y, const Vector2 &x) const
{
Vector2 u( x );
- Vector2 v(u.size());
+ Vector2 v(field(),u.size());
_VD.mul( y, x, _P_ptr->operator[](0));
for (size_t i=1; i<_P_ptr->size(); ++i){
_A_ptr->applyTranspose( v, u );
@@ -238,7 +238,7 @@ namespace LinBox
inline Vector1 &apply (Vector1 &y, const Vector2 &x) const
{
Vector2 u (x);
- Vector2 v(u.size());
+ Vector2 v(field(),u.size());
_VD.mul( y, x, _P_data[0] );
for (size_t i=1; i<_P_data.size(); ++i){
_A_data.apply( v, u );
@@ -262,7 +262,7 @@ namespace LinBox
inline Vector1 &applyTranspose (Vector1 &y, const Vector2 &x) const
{
Vector2 u( x );
- Vector2 v(u.size());
+ Vector2 v(field(), u.size());
_VD.mul( y, x, _P_data[0]);
for (size_t i=1; i<_P_data.size(); ++i){
_A_data.applyTranspose( v, u );
diff --git a/linbox/blackbox/quad-matrix.h b/linbox/blackbox/quad-matrix.h
index 1fc9dd4..51f6f13 100644
--- a/linbox/blackbox/quad-matrix.h
+++ b/linbox/blackbox/quad-matrix.h
@@ -34,6 +34,8 @@
#include "linbox/blackbox/blackbox-interface.h"
#include "linbox/blackbox/scalar-matrix.h"
#include "linbox/blackbox/zo.h"
+#include "linbox/vector/subvector.h"
+#include "linbox/vector/blas-vector.h"
//#include "linbox/blackbox/side-by-side.h"
//#include "linbox/blackbox/over-under.h"
@@ -64,28 +66,31 @@ namespace LinBox
\ingroup blackbox
+ @bug needs read for test-blackbox.h
*/
template <typename _Field>
class ZOQuad {
+ public:
+ typedef _Field Field;
+ typedef typename Field::Element Element;
+ typedef size_t Index;
+ typedef std::vector<Index> IndexVector;
+ typedef std::vector<IndexVector::iterator> PointerVector;
//friend class ZeroOne<_Field>;
+ protected:
enum BBtype {zo, sbs, ou};
const void* _BBp;
BBtype _tag;
size_t _r, _c;
static const unsigned int smallThreshold = 60000;
- protected:
- _Field _field;
+ const Field *_field;
public:
- typedef _Field Field;
-
- typedef size_t Index;
- typedef std::vector<Index> IndexVector;
- typedef std::vector<IndexVector::iterator> PointerVector;
// constructors
ZOQuad() :
_BBp(0), _r(0), _c(0)
+ ,_tag(zo),_field(NULL)
{}
#if 0
ZOQuad(const ScalarMatrix<Field>& A) :
@@ -94,9 +99,11 @@ namespace LinBox
#endif
ZOQuad(const SideBySide<Field>& A) :
_BBp(&A), _tag(sbs), _r(A.rowdim()), _c(A.coldim())
+ ,_field(&A.field())
{}
ZOQuad(const OverUnder<Field>& A) :
_BBp(&A), _tag(ou), _r(A.rowdim()), _c(A.coldim())
+ ,_field(&A.field())
{}
ZOQuad(const ZeroOne<Field>& A) //:
// _BBp(&A), _tag(zo), _r(A.rowdim()), _c(A.coldim())
@@ -167,8 +174,8 @@ namespace LinBox
PointerVector firstHalfP;
std::back_insert_iterator< IndexVector > first(firstHalf);
std::back_insert_iterator< PointerVector > firstP(firstHalfP);
- copy( A._index.begin(), *(A._indexP.begin() + A._indexP.size()/2), first);
- copy( A._indexP.begin(), A._indexP.begin() + A._indexP.size()/2 + 1, firstP);
+ copy( A._index.begin(), *(A._indexP.begin() +(ptrdiff_t) A._indexP.size()/2), first);
+ copy( A._indexP.begin(), A._indexP.begin() +(ptrdiff_t) A._indexP.size()/2 + 1, firstP);
ZeroOne<Field> L(F, firstHalf, firstHalfP, A._rowdim, firstHalfP.size()-1, A.sorted);
ZOQuad<Field> *LL = new ZOQuad<Field>(L);
@@ -176,8 +183,8 @@ namespace LinBox
PointerVector secondHalfP;
std::back_insert_iterator< IndexVector > second(secondHalf);
std::back_insert_iterator< PointerVector > secondP(secondHalfP);
- copy( *(A._indexP.begin() + A._indexP.size()/2), A._index.end(), second);
- copy( A._indexP.begin() + A._indexP.size()/2, A._indexP.end(), secondP);
+ copy( *(A._indexP.begin() +(ptrdiff_t) A._indexP.size()/2), A._index.end(), second);
+ copy( A._indexP.begin() +(ptrdiff_t) A._indexP.size()/2, A._indexP.end(), secondP);
ZeroOne<Field> R(F, secondHalf, secondHalfP, A._rowdim, secondHalfP.size()-1, A.sorted);
ZOQuad<Field> *RR = new ZOQuad<Field>(R);
@@ -192,6 +199,13 @@ namespace LinBox
}
//*/
}
+
+
+ std::istream &read (std::istream &is)
+ {
+ throw(LinBoxError("no read in ZOQuad"));
+ }
+
std::ostream & write(std::ostream & out) const
{
switch (_tag)
@@ -439,14 +453,14 @@ namespace LinBox
template <typename InVector, typename OutVector>
OutVector& apply(OutVector& y, const InVector& x) const
- //OutVector& apply(OutVector& y, const InVector& x)
{
std::vector<typename Field::Element> z(y.size());
+ // BlasVector<Field> z(field(),y.size());
VectorDomain<Field> VD(field());
- //std::vector<typename Field::Element> x_1( x.begin(), x.begin() + _quadLeft->coldim() );
- //std::vector<typename Field::Element> x_2( x.begin() + _quadLeft->coldim(), x.end() );
- Subvector<typename InVector::const_iterator> x_1(x.begin(), x.begin()+_quadLeft->coldim());
- Subvector<typename InVector::const_iterator> x_2(x.begin()+_quadLeft->coldim(), x.end());
+ Subvector<typename InVector::const_iterator> x_1(x.begin(), x.begin()+(ptrdiff_t)_quadLeft->coldim());
+ // BlasSubvector<Field> x_1(x.begin(), x.begin()+(ptrdiff_t)_quadLeft->coldim());
+ Subvector<typename InVector::const_iterator> x_2(x.begin()+(ptrdiff_t)_quadLeft->coldim(), x.end());
+ // BlasSubvector<Field> x_2(x.begin()+(ptrdiff_t)_quadLeft->coldim(), x.end());
//std::cout << " side-by-side apply size of x: " << x.size() << " " << " size of y: " << y.size() << endl;
//std::cout << " side-by-side apply size of x_1: " << x_1.size() << " " << " size of x_2: " << x_2.size() << endl;
_quadLeft->apply (y, x_1);
@@ -458,16 +472,16 @@ namespace LinBox
template <typename InVector, typename OutVector>
OutVector& applyTranspose(OutVector& y, const InVector& x) const
- //OutVector& applyTranspose(OutVector& y, const InVector& x)
{
- //std::vector<typename Field::Element> y_1( y.begin(), y.begin() + _quadLeft->coldim() );
- //std::vector<typename Field::Element> y_2( y.begin() + _quadLeft->coldim(), y.end() );
- Subvector<typename OutVector::iterator, typename OutVector::const_iterator> y_1(y.begin(), y.begin()+_quadLeft->coldim());
- Subvector<typename OutVector::iterator, typename OutVector::const_iterator> y_2(y.begin()+_quadLeft->coldim(), y.end());
+ Subvector<typename OutVector::iterator, typename OutVector::const_iterator> y_1(y.begin(), y.begin()+(ptrdiff_t)_quadLeft->coldim());
+ // BlasSubvector<Field> y_1(y.begin(), y.begin()+(ptrdiff_t)_quadLeft->coldim());
+ Subvector<typename OutVector::iterator, typename OutVector::const_iterator> y_2(y.begin()+(ptrdiff_t)_quadLeft->coldim(), y.end());
+
+ // BlasSubvector<Field> y_2(y.begin()+(ptrdiff_t)_quadLeft->coldim(), y.end());
_quadLeft->applyTranspose (y_1, x);
_quadRight->applyTranspose (y_2, x);
copy(y_1.begin(), y_1.end(), y.begin());
- copy(y_2.begin(), y_2.end(), y.begin() + y_1.size());
+ copy(y_2.begin(), y_2.end(), y.begin() +(ptrdiff_t) y_1.size());
return y;
}
@@ -489,31 +503,29 @@ namespace LinBox
template <typename InVector, typename OutVector>
OutVector& apply(OutVector& y, const InVector& x) const
- //OutVector& apply(OutVector& y, const InVector& x)
{
//std::vector<typename Field::Element> y_1( y.begin(), y.begin() + _quadUp->rowdim() );
//std::vector<typename Field::Element> y_2( y.begin() + _quadUp->rowdim(), y.end() );
- Subvector<typename OutVector::iterator, typename OutVector::const_iterator> y_1(y.begin(), y.begin()+_quadUp->rowdim());
- Subvector<typename OutVector::iterator, typename OutVector::const_iterator> y_2(y.begin()+_quadUp->rowdim(), y.end());
+ Subvector<typename OutVector::iterator, typename OutVector::const_iterator> y_1(y.begin(), y.begin()+(ptrdiff_t)_quadUp->rowdim());
+ Subvector<typename OutVector::iterator, typename OutVector::const_iterator> y_2(y.begin()+(ptrdiff_t)_quadUp->rowdim(), y.end());
//if ((_A_ptr == 0) || (_B_ptr == 0)) { throw error }
//std::cout << " over-under apply size of x: " << x.size() << " " << " size of y: " << y.size() << endl;
//std::cout << " over-under apply size of y_1: " << y_1.size() << " " << " size of y_2: " << y_2.size() << endl;
_quadUp->apply (y_1, x);
_quadDown->apply (y_2, x);
//copy(y_1.begin(), y_1.end(), y.begin());
- //copy(y_2.begin(), y_2.end(), y.begin() + y_1.size());
+ //copy(y_2.begin(), y_2.end(), y.begin() +(ptrdiff_t) y_1.size());
return y;
}
template <typename InVector, typename OutVector>
OutVector& applyTranspose(OutVector& y, const InVector& x) const
- //OutVector& applyTranspose(OutVector& y, const InVector& x)
{
std::vector<typename Field::Element> z(y.size());
VectorDomain<Field> VD(field());
- std::vector<typename Field::Element> x_1( x.begin(), x.begin() + _quadUp->rowdim() );
- std::vector<typename Field::Element> x_2( x.begin() + _quadUp->rowdim(), x.end() );
+ std::vector<typename Field::Element> x_1( x.begin(), x.begin() + (ptrdiff_t)_quadUp->rowdim() );
+ std::vector<typename Field::Element> x_2( x.begin() + (ptrdiff_t)_quadUp->rowdim(), x.end() );
//Subvector<typename InVector::iterator, typename InVector::const_iterator> x_1(x.begin(), x.begin()+_quadUp->rowdim());
//Subvector<typename InVector::iterator, typename InVector::const_iterator> x_2(x.begin()+_quadUp->rowdim(), x.end());
_quadUp->applyTranspose (y, x_1);
@@ -534,11 +546,10 @@ namespace LinBox
#endif // __LINBOX_quad_matrix_H
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
// Local Variables:
// mode: C++
// tab-width: 8
// indent-tabs-mode: nil
// c-basic-offset: 8
// End:
-
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/blackbox/random-matrix.h b/linbox/blackbox/random-matrix.h
index 03d40db..557db32 100644
--- a/linbox/blackbox/random-matrix.h
+++ b/linbox/blackbox/random-matrix.h
@@ -28,7 +28,7 @@
#define __LINBOX_blackbox_random_matrix_H
#include "linbox/blackbox/blackbox-interface.h"
-#include "linbox/blackbox/sparse.h"
+#include "linbox/matrix/sparse-matrix.h"
namespace LinBox
{
@@ -54,28 +54,27 @@ namespace LinBox
int rowdim, int coldim )
{
- Ap = new BlasMatrix<Field>(f, rowdim, coldim);
+ Ap = new BlasMatrix<Field>(f, (size_t)rowdim, (size_t)coldim);
typename BlasMatrix<Field>::Iterator Ap_p;
- typename Field::Element zero, one, elt;
- f. init (one, 1); f. init (zero, 0);
+ typename Field::Element elt;
for (Ap_p = Ap -> Begin(); Ap_p != Ap -> End(); ++ Ap_p)
- f. assign (*Ap_p, zero);
+ f. assign (*Ap_p, f.zero);
if (rowdim < coldim)
for (int i = 0; i < rowdim; ++ i) {
- Ap -> setEntry (i, i, one);
+ Ap -> setEntry ((size_t)i,(size_t) i, f.one);
for (int j = rowdim; j < coldim; ++ j){
- f. init (elt, rand()%10);
- Ap -> setEntry (i, j, elt);
+ f. init (elt, (uint64_t)(rand()%10));
+ Ap -> setEntry ((size_t)i, (size_t)j, elt);
}
}
else
for (int i = 0; i < coldim; ++ i) {
- Ap -> setEntry (i, i, one);
+ Ap -> setEntry ((size_t)i,(size_t) i, f.one);
for (int j = coldim; j < rowdim; ++ j) {
- f. init (elt, rand()%10);
- Ap -> setEntry (j, i, elt);
+ f. init (elt, (uint64_t)(rand()%10));
+ Ap -> setEntry ((size_t)j,(size_t) i, elt);
}
}
@@ -92,7 +91,7 @@ namespace LinBox
int rowdim, int coldim)
{
- Ap = new SparseMatrix<Field>(f, rowdim, coldim);
+ Ap = new SparseMatrix<Field>(f, (size_t)rowdim, (size_t)coldim);
const int m = rowdim < coldim ? rowdim : coldim;
@@ -100,11 +99,11 @@ namespace LinBox
typename Field::Element elt;
- f. init (elt, 1);
+ f. assign(elt, f.one);
for ( i = 0; i < m; ++ i)
- Ap -> setEntry (i, i, elt);
+ Ap -> setEntry ((size_t)i, (size_t)i, elt);
if ( m < rowdim ) {
@@ -119,7 +118,7 @@ namespace LinBox
f.init(elt, rand() % 10 + 1);
- Ap -> setEntry (i, j, elt);
+ Ap -> setEntry ((size_t)i, (size_t)j, elt);
}
}
}
@@ -138,7 +137,7 @@ namespace LinBox
f.init(elt, rand() % 10 + 1);
- Ap -> setEntry (i, j, elt);
+ Ap -> setEntry ((size_t)i, (size_t)j, elt);
}
}
}
diff --git a/linbox/blackbox/rational-matrix-factory.h b/linbox/blackbox/rational-matrix-factory.h
index 55e34b7..16f53f1 100644
--- a/linbox/blackbox/rational-matrix-factory.h
+++ b/linbox/blackbox/rational-matrix-factory.h
@@ -26,8 +26,7 @@
#include "linbox/blackbox/factory.h"
//#include "linbox/field/gmp-rational.h"
-#include "linbox/field/PID-integer.h"
-#include "linbox/integer.h"
+#include "givaro/zring.h"
#include <vector>
@@ -49,9 +48,6 @@ namespace LinBox
class RationalMatrixFactory /*: public MatrixFactory<Integers,typename Rationals::Element >*/ {
//typedef GMPRationalField Rationals;
typedef typename Rationals::Element Quotient;
- //typedef PID_integer Integers;
- //typedef typename PID_integer::Element Integer;
- //
private:
const QMatrix* _matA;
@@ -77,9 +73,9 @@ namespace LinBox
double maxNorm(double& res) const {
typename QMatrix::ConstIterator i;
res = 0.0;
- double tmp;
for( i = _matA->Begin(); i != _matA->End(); ++i ) {
+ double tmp;
Integer d,n;
_ratField.get_den(d,*i);
_ratField.get_num(n,*i);
@@ -94,9 +90,9 @@ namespace LinBox
typename QMatrix::ConstRow::const_iterator c;
res = 1.0;
- double temp;
for( r = _matA->rowBegin(); r != _matA->rowEnd(); ++r ) {
+ double temp;
temp = 0.0;
for( c = r->begin(); c != r->end(); ++c ) {
Integer d,n;
@@ -119,7 +115,6 @@ namespace LinBox
Integer& denominator(Integer& da) const {
if (_denA ==1 ) {
ConstIterator i;
- //_denA = 1L;
for (i = _matA->Begin (); i != _matA->End (); ++i) {
Integer d;
_ratField.get_den(d,*i);
@@ -130,24 +125,23 @@ namespace LinBox
}
/*
- * returns common denominator _denAi[i] of i-th row
+ * returns common denominator _denAi[(size_t)i] of i-th row
*/
Integer& denominator(Integer& di, const int i) const {
- if (_denAi[i]==1) {
- typedef typename QMatrix::ConstRow::const_iterator EltIterator;
+ if (_denAi[(size_t)i]==1) {
for (size_t j=0; j < _matA->coldim(); ++j) {
Integer d;
- _ratField.get_den(d,_matA->getEntry(i,j));
- lcm(_denAi[i],_denAi[i],d);
+ _ratField.get_den(d,_matA->getEntry((size_t)i,(size_t)j));
+ lcm(_denAi[(size_t)i],_denAi[(size_t)i],d);
}
}
- return di=_denAi[i];
+ return di=_denAi[(size_t)i];
}
//returns max of abs(numerators) and denominators of _matA
Integer& rationalNorm(Integer& res) const {
ConstIterator i;
- res = 0L;
+ res = int64_t(0);
Integer tmp;
for (i = _matA->Begin (); i != _matA->End (); ++i) {
Integer n ;
@@ -173,9 +167,9 @@ namespace LinBox
return res;
}
- //returns norm of tilde{A} = diag(_denAi[i])_matA
+ //returns norm of tilde{A} = diag(_denAi[(size_t)i])_matA
Integer& normAtilde(Integer& res) const {
- res = 0L;
+ res = int64_t(0);
double dres = 0;
//int i=0;
Integer tmp;
@@ -202,21 +196,20 @@ namespace LinBox
* optimization: computes normAprim, normAprim, rationalNormat the same time
*/
Integer getNorms(Integer& ratnorm, Integer& normaprim, Integer& normatilde) const {
- typedef typename QMatrix::ConstRow::const_iterator EltIterator;
- ratnorm = 0L; normaprim=0L; normatilde= 0L;
- Integer da=1L;
- std::vector<integer> di(_matA->rowdim(),1L);
+ ratnorm = int64_t(0); normaprim=int64_t(0); normatilde= int64_t(0);
+ Integer da=int64_t(1);
+ std::vector<integer> di(_matA->rowdim(),int64_t(1));
for (size_t i=0; i < _matA->rowdim(); ++i) {
- if (_denAi[i]==1) {
+ if (_denAi[(size_t)i]==1) {
for (size_t j=0; j < _matA->coldim(); ++j ) {
Integer d ;
_ratField.get_den(d,_matA->getEntry(i,j));
- lcm(_denAi[i],_denAi[i],d);
+ lcm(_denAi[(size_t)i],_denAi[(size_t)i],d);
}
}
- di[i] = _denAi[i];
- lcm(_denA,_denA,di[i]);
+ di[(size_t)i] = _denAi[(size_t)i];
+ lcm(_denA,_denA,di[(size_t)i]);
}
da = _denA;
@@ -231,7 +224,7 @@ namespace LinBox
if (tmp > ratnorm) ratnorm = tmp;
if (d > ratnorm) ratnorm = d;
- Integer tmp2 = (di[i]) / d;
+ Integer tmp2 = (di[(size_t)i]) / d;
tmp2 *=tmp;
if (tmp2 > normatilde) normatilde = tmp2;
@@ -271,7 +264,7 @@ namespace LinBox
}
/*
- * Creates Atilde = diag(_denAi[i]) * _matA
+ * Creates Atilde = diag(_denAi[(size_t)i]) * _matA
*/
template <class Matrix>
Matrix& makeAtilde(Matrix& Atilde) const {
@@ -279,7 +272,7 @@ namespace LinBox
Atilde.resize(_matA->rowdim(),_matA->coldim());
std::vector<integer> di(_matA->rowdim());
for (size_t i=0; i < (size_t)_matA->rowdim(); ++i)
- denominator(di[(int)i],(int)i);
+ denominator(di[(size_t)i],(int)i);
for( size_t i=0; i < _matA->rowdim(); ++i) {
for (size_t j=0; j < _matA->coldim(); ++j) {
@@ -288,7 +281,7 @@ namespace LinBox
_ratField.get_num(n,Aij);
Integer d ;
_ratField.get_den(d,Aij);
- Integer tmp = di[i]/d;
+ Integer tmp = di[(size_t)i]/d;
tmp *=n;
typename Matrix::Field F=Atilde.field();
typename Matrix::Field::Element ftmp; F.init(ftmp,tmp);
diff --git a/linbox/blackbox/scalar-matrix.h b/linbox/blackbox/scalar-matrix.h
index 0590449..f9d7666 100644
--- a/linbox/blackbox/scalar-matrix.h
+++ b/linbox/blackbox/scalar-matrix.h
@@ -33,12 +33,14 @@
#define __LINBOX_scalar_H
#include <algorithm>
+#include <iostream>
#include "linbox/field/hom.h"
#include "linbox/vector/vector-traits.h"
-#include "linbox/util/debug.h"
#include "linbox/linbox-config.h"
-#include "linbox/field/hom.h"
#include "linbox/blackbox/blackbox-interface.h"
+#include "linbox/solutions/solution-tags.h"
+#include "linbox/util/matrix-stream.h"
+#include "linbox/util/write-mm.h"
namespace LinBox
{
@@ -50,13 +52,13 @@ namespace LinBox
* The matrix itself is not stored in memory, just the scalar and the dimensions.
* \ingroup blackbox
*/
- template <class _Field>
+ template <class Field_>
class ScalarMatrix : public BlackboxInterface {
public:
- typedef _Field Field;
+ typedef Field_ Field;
typedef typename Field::Element Element;
- typedef ScalarMatrix<_Field> Self_t;
+ typedef ScalarMatrix<Field> Self_t;
/* In each specialization, I must define suitable constructor(s) and
* BlackboxArchetype<Vector> * clone() const;
@@ -69,18 +71,60 @@ namespace LinBox
*/
/// Constructs an initially 0 by 0 matrix.
+ //! @bug this should not be allowed (unknown field)
ScalarMatrix () :
- _n(0)
+ field_(NULL),
+ n_(0)
+ {}
+
+ ScalarMatrix( MatrixStream<Field> & ms) :
+ field_(&ms.field())
+ ,n_(0)
+ {
+ size_t c, i, j;
+ if( !ms.getDimensions(n_, c) || c != n_ )
+ throw ms.reportError(__FUNCTION__,__LINE__);
+ ms.nextTriple(i, j, v_);
+ if (i != j) throw ms.reportError(__FUNCTION__,__LINE__);
+ // finalize();
+ }
+
+ void changeField(const Field &F)
+ {
+ field_ = &F ;
+ }
+
+ /** Constructor of readable scalar matrix.
+ * @param F field in which to do arithmetic.
+ */
+ ScalarMatrix (const Field &F) :
+ field_(&F),
+ n_(0)
{}
+#if 0
/** Scalar matrix Constructor from an element.
* @param F field in which to do arithmetic.
* @param n size of the matrix.
* @param s scalar, a field element, to be used as the diagonal of the matrix.
+ * @bug this is a wrong constructor, should be the following...
*/
ScalarMatrix (const Field &F, const size_t n, const Element &s) :
- _field(F), _n(n), _v(s)
+ field_(&F), n_(n), v_(s)
{}
+#endif
+
+ ScalarMatrix (const Field &F, const size_t n, const size_t m, const Element &s) :
+ field_(&F), n_(n), v_(s)
+ {
+ linbox_check(n ==m);
+ }
+
+ ScalarMatrix (const Field &F, const size_t n, const size_t m) :
+ field_(&F), n_(n), v_(0)
+ {
+ linbox_check(m==n);
+ }
/** Constructor from a random element.
* @param F field in which to do arithmetic.
@@ -88,14 +132,20 @@ namespace LinBox
* @param iter Random iterator from which to get the diagonal scalar element.
*/
ScalarMatrix (const Field &F, const size_t n, const typename Field::RandIter& iter) :
- _field(F), _n(n)
- { iter.random(_v); }
+ field_(&F), n_(n)
+ { iter.random(v_); }
ScalarMatrix(const ScalarMatrix<Field> &Mat) :
- _field(Mat._field)
+ field_(Mat.field_)
+ , n_(Mat.n_), v_(Mat.v_)
+ {
+ //n_ = Mat.n_;
+ //v_ = Mat.v_;
+ }
+
+ void setScalar(Element & x)
{
- _n = Mat._n;
- _v = Mat._v;
+ field().assign(v_, x) ;
}
@@ -128,48 +178,74 @@ namespace LinBox
{
Hom<typename Self_t::Field, _Tp1> hom(A.field(), Ap.field());
typename _Tp1::Element e;
- Ap.field().init(e,0UL);
- hom.image (e, A._v);
+ Ap.field().assign(e,Ap.field().zero);
+ hom.image (e, A.v_);
Ap.setScalar(e);
}
};
template<typename _Tp1>
ScalarMatrix (const ScalarMatrix<_Tp1>& S, const Field &F) :
- _field(F), _n(S.rowdim())
+ field_(&F), n_(S.rowdim())
{
typename ScalarMatrix<_Tp1>::template rebind<Field>() (*this, S);
}
- size_t rowdim(void) const { return _n; }
+ size_t rowdim(void) const { return n_; }
- size_t coldim(void) const { return _n; }
+ size_t coldim(void) const { return n_; }
- const Field& field() const {return _field;}
+ const Field& field() const {return *field_;}
+
+ // for specialized solutions
- // for a specialization in solutions
Element& trace(Element& t) const
- { Element n; _field.init(n, _n);
- return _field.mul(t, _v, n);
+ { Element n; field().init(n, n_);
+ return field().mul(t, v_, n);
}
Element& getEntry(Element& x, const size_t i, const size_t j) const
{
- return (i==j?_field.assign(x,_v):_field.init(x,0));
+ // return (i==j ? field().assign(x,v_) : field().assign(x,field().zero));
+ return (i==j ? field().assign(x,v_) : field().assign(x,field().zero));
+ }
+
+ Element& det(Element& d) const
+ {
+ return pow(field(), d, v_, n_);
+ }
+
+ long int& rank(long int& r) const
+ {
+ return r = (field().isZero(v_) ? 0 : n_);
}
+ Element& getScalar(Element& x) const { return this->field().assign(x,this->v_); }
+ Element& setScalar(const Element& x) { return this->field().assign(this->v_,x); }
+ std::ostream& write(std::ostream& os) const {
+ writeMMCoordHeader(os, *this, 1, "ScalarMatrix");
+ field().write(os << "1 1 ", v_) << std::endl;
+ return os;
+ }
- Element& getScalar(Element& x) const { return this->_field.assign(x,this->_v); }
- Element& setScalar(const Element& x) { return this->_field.assign(this->_v,x); }
+ std::istream& read(std::istream& is) {
+ MatrixStream<Field> ms(field(), is);
+ size_t c, i, j;
+ if( !ms.getDimensions(n_, c) || c != n_ )
+ throw ms.reportError(__FUNCTION__,__LINE__);
+ ms.nextTriple(i, j, v_);
+ if (i != j) throw ms.reportError(__FUNCTION__,__LINE__);
+ return is;
+ }
protected:
- Field _field; // Field for arithmetic
+ const Field *field_; // Field for arithmetic
- size_t _n; // Number of rows and columns of square matrix.
+ size_t n_; // Number of rows and columns of square matrix.
- Element _v; // the scalar used in applying matrix.
+ Element v_; // the scalar used in applying matrix.
// dense vector _app for apply
template<class OutVector, class InVector>
@@ -186,6 +262,13 @@ namespace LinBox
template<class OutVector, class InVector>
OutVector& _app (OutVector &y, const InVector &x, VectorCategories::SparseAssociativeVectorTag) const;
+ // p <- a^e. Really should be a field op
+ Element& pow(Field& F, Element& p, const Element& a, const size_t e) {
+ Element x; F.init(x);
+ if (e == 0) return F.assign(p, F.one);
+ if (e%2 == 0) return pow(F, p, F.mul(x, a, a), e/2);
+ else /* (e%2 == 1)*/ return F.mul(p, a, pow(F, p, a, e-1));
+ }
}; // template <Field> class ScalarMatrix
// dense vector _app
@@ -194,18 +277,18 @@ namespace LinBox
inline OutVector &ScalarMatrix<Field>::
_app(OutVector& y, const InVector& x, VectorCategories::DenseVectorTag t) const
{
- linbox_check (x.size() >= _n);
- linbox_check (y.size() >= _n);
+ linbox_check (x.size() >= n_);
+ linbox_check (y.size() >= n_);
typename OutVector::iterator y_iter = y.begin ();
- if (_field.isZero(_v)) // just write zeroes
- for ( ; y_iter != y.end (); ++y_iter) *y_iter = _v;
- else if (_field.isOne(_v) ) // just copy
- copy(x.begin(), x.end(), y.begin());
+ if (field().isZero(v_)) // just write zeroes
+ for ( ; y_iter != y.end (); ++y_iter) *y_iter = v_;
+ else if (field().isOne(v_) ) // just copy
+ std::copy(x.begin(), x.end(), y.begin());
else // use actual muls
{ typename InVector::const_iterator x_iter = x.begin ();
for ( ; y_iter != y.end () ; ++y_iter, ++x_iter )
- _field.mul (*y_iter, _v, *x_iter);
+ field().mul (*y_iter, v_, *x_iter);
}
return y;
@@ -218,20 +301,20 @@ namespace LinBox
inline OutVector &ScalarMatrix<Field>::
_app(OutVector& y, const InVector& x, VectorCategories::SparseSequenceVectorTag t) const
{
- //linbox_check ((!x.empty ()) && (_n < x.back ().first));
+ //linbox_check ((!x.empty ()) && (n_ < x.back ().first));
// neither is required of x ?
y.clear (); // we'll overwrite using push_backs.
// field element to be used in calculations
Element entry;
- _field.init (entry, 0); // needed?
+ field().assign(entry, field().zero);
// For each element, multiply input element with corresponding element
// of stored scalar and insert non-zero elements into output vector
for ( typename InVector::const_iterator x_iter = x.begin (); x_iter != x.end (); ++x_iter)
- { _field.mul (entry, _v, x_iter->second);
- if (!_field.isZero (entry)) y.push_back (make_pair (x_iter->first, entry));
+ { field().mul (entry, v_, x_iter->second);
+ if (!field().isZero (entry)) y.push_back (make_pair (x_iter->first, entry));
}
return y;
@@ -247,29 +330,45 @@ namespace LinBox
// create field elements and size_t to be used in calculations
Element entry;
- _field.init (entry, 0);
+ field().assign(entry, field().zero);
// Iterator over indices of input vector.
// For each element, multiply input element with
// stored scalar and insert non-zero elements into output vector
for ( typename InVector::const_iterator x_iter = x.begin (); x_iter != x.end (); ++x_iter)
- { _field.mul (entry, _v, x_iter->second);
- if (!_field.isZero (entry)) y.insert (y.end (), make_pair (x_iter->first, entry));
+ { field().mul (entry, v_, x_iter->second);
+ if (!field().isZero (entry)) y.insert (y.end (), make_pair (x_iter->first, entry));
}
return y;
} // sparse associative vector _app
+ // let solutions know we have getEntry() and trace().
+ template <class Field>
+ struct GetEntryCategory<ScalarMatrix<Field> >
+ { typedef SolutionTags::Local Tag; };
+
+ template <class Field>
+ struct TraceCategory<ScalarMatrix<Field> >
+ { typedef SolutionTags::Local Tag; };
+
+ template <class Field>
+ struct DetCategory<ScalarMatrix<Field> >
+ { typedef SolutionTags::Local Tag; };
+
+ template <class Field>
+ struct RankCategory<ScalarMatrix<Field> >
+ { typedef SolutionTags::Local Tag; };
+
} // namespace LinBox
#endif // __LINBOX_scalar_H
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
// Local Variables:
// mode: C++
// tab-width: 8
// indent-tabs-mode: nil
// c-basic-offset: 8
// End:
-
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/blackbox/scompose.h b/linbox/blackbox/scompose.h
index 606faf9..6cc76fc 100644
--- a/linbox/blackbox/scompose.h
+++ b/linbox/blackbox/scompose.h
@@ -86,13 +86,16 @@ namespace LinBox
typename BlasMatrix<Field>::RowIterator row_p;
- std::vector<typename Field::Element> tmp(R.rowdim());
+ // std::vector<typename Field::Element> tmp(R.rowdim());
+ BlasVector<Field> tmp(R.field(),R.rowdim());
for (row_p = LAR -> rowBegin(), crow_p = L.rowBegin();
row_p != LAR -> rowEnd(); ++ row_p, ++ crow_p) {
A.applyTranspose(tmp, *crow_p);
+ // BlasSubvector<BlasVector<Field> > row_p_v(R.field(),*row_p); //! @warning should not be necessary (RowIterator should be a BlasSubvector...).
+ // R.applyTranspose(row_p_v, tmp);
R.applyTranspose(*row_p, tmp);
}
diff --git a/linbox/blackbox/sparse.h b/linbox/blackbox/sparse.h
deleted file mode 100644
index 5b89ecf..0000000
--- a/linbox/blackbox/sparse.h
+++ /dev/null
@@ -1,443 +0,0 @@
-/* linbox/blackbox/sparse.h
- * Copyright (C) 1999-2005 William J Turner,
- * 2001-2002 Bradford Hovinen
- *
- * Written by W. J. Turner <wjturner at acm.org>,
- * Bradford Hovinen <hovinen at cis.udel.edu>
- *
- * ------------------------------------
- * 2002-08-06 Bradford Hovinen <hovinen at cis.udel.edu>
- *
- * Renamed to sparse.h from sparse0.h
- * ------------------------------------
- * Modified by Bradford Hovinen <hovinen at cis.udel.edu>
- * Modified by Jean-Guillaume Dumas <Jean-Guillaume.Dumas at imag.fr>
- * 28.08.2002 : added back : field()
- *
- * Refactoring:
- * - Eliminated SparseMatrixAux and moved that functionality into Sparse0
- * - Made SparseMatrixBase parameterized only on the element type
- * - New read/write implementations for SparseMatrixBase, supporting multiple
- * formats
- * - Eliminated Gaussian elimination code
- * - Added iterators, including ColOfRowsIterator, Iterator, and
- * IndexIterator
- * - Eliminated operator []; added getEntry; changed put_value to setEntry
- * ------------------------------------
- * Modified by W. J. Turner <wjturner at acm.org>
- * 24.06.2005 : Removed using declarations
- * ------------------------------------
- *
- *
- * ========LICENCE========
- * This file is part of the library LinBox.
- *
- * LinBox is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- * ========LICENCE========
- *.
- */
-
-#ifndef __LINBOX_blackbox_sparse_H
-#define __LINBOX_blackbox_sparse_H
-
-#include "linbox/linbox-config.h"
-#include "linbox/blackbox/blackbox-interface.h"
-#include "linbox/matrix/sparse.h"
-#include "linbox/vector/vector-domain.h"
-#include "linbox/vector/vector-traits.h"
-#include "linbox/vector/stream.h"
-#include "linbox/util/field-axpy.h"
-#include "linbox/field/hom.h"
-#include "linbox/field/rebind.h"
-
-namespace LinBox
-{
-
- /** \brief vector of sparse rows.
-
- * This is a generic black box for a sparse matrix. It inherits
- * LinBox::SparseMatrixBase, which implements all of the underlying
- * accessors and iterators.
- * \ingroup blackbox
- */
- template <class _Field,
- class _Row = typename LinBox::Vector<_Field>::Sparse>
- class SparseMatrix : public BlackboxInterface, public SparseMatrixBase<typename _Field::Element, _Row> {
- public:
-
- typedef _Field Field;
- typedef typename Field::Element Element;
- typedef typename SparseMatrixBase<typename Field::Element, _Row>::Row Row;
- typedef typename SparseMatrixBase<typename Field::Element, _Row>::Rep Rep;
- typedef SparseMatrix<_Field, _Row> Self_t;
-
-
-#ifdef __LINBOX_PARALLEL
- BB_list_list sub_list;
-#endif
-
- FileFormatTag Format;
-
- typedef typename SparseMatrixBase<typename Field::Element, _Row>::Iterator Iterator;
- typedef typename SparseMatrixBase<typename Field::Element, _Row>::IndexedIterator IndexedIterator;
- typedef typename SparseMatrixBase<typename Field::Element, _Row>::ConstIterator ConstIterator;
- typedef typename SparseMatrixBase<typename Field::Element, _Row>::ConstIndexedIterator ConstIndexedIterator;
-
- /** Constructor.
- * Builds a zero m x n matrix
- * Note: the copy constructor and operator= will work as intended
- * because of STL's container design
- * @param F Field over which entries exist
- * @param m Row dimension
- * @param n Column dimension
- */
-#if 0
- SparseMatrix (const Field &F) :
- SparseMatrixBase<Element, _Row> (0,0), _field (F), _VD (F), _MD (F), _AT (*this)
- {
- std::cerr << "default cstor" << std::endl;
- }
-
- SparseMatrix (const Field &F, size_t m, size_t n) :
- SparseMatrixBase<Element, _Row> (m, n), _field (F), _VD (F), _MD (F), _AT (*this)
- {
- std::cerr << "default cstor : " << m << "x" << n << std::endl;
- }
-#endif
- SparseMatrix (const Field &F, size_t m=0, size_t n=0) :
- SparseMatrixBase<Element, _Row> (m, n), _field (F), _VD (F), _MD (F), _AT (*this)
- { }
-
- /** Constructor from a vector stream
- * @param F Field over which entries exist
- * @param stream Stream with which to generate row vectors
- */
- template<class VectStream>
- SparseMatrix (const Field &F, VectStream &stream) :
- SparseMatrixBase<Element, _Row> (stream.size (), stream.dim ()),
- _field (F), _VD (F), _MD (F), _AT (*this)
- {
- typename SparseMatrixBase<Element, _Row>::RowIterator i;
-
- for (i = SparseMatrixBase<Element, _Row>::rowBegin (); i != SparseMatrixBase<Element, _Row>::rowEnd (); ++i)
- stream >> *i;
- }
-
-
- /** Constructor from a MatrixStream
- * @param ms A matrix stream properly initialized
- */
- SparseMatrix( MatrixStream<Field>& ms ) :
- SparseMatrixBase<Element,_Row>(ms), _field(ms.getField()), _VD(ms.getField()), _MD(ms.getField()), _AT(*this)
- { }
-
- /** Copy constructor
- */
- SparseMatrix (const SparseMatrix<Field, Row> &B) :
- SparseMatrixBase<Element, _Row> (B), _field (B._field), _VD (B._field), _MD (B._field), _AT (*this)
- { }
-
- /** Row type Converter constructor
- */
- template<class VectorType>
- SparseMatrix (const SparseMatrix<Field, VectorType> &B) :
- SparseMatrixBase<Element, _Row> (B), _field (B._field), _VD (B._field), _MD (B._field), _AT (*this)
- { }
-
- /** Destructor. */
- ~SparseMatrix () {
-#ifdef __LINBOX_PARALLEL
-
- BB_list_list::iterator p;
-
- BB_list::iterator e_p;
-
- for (p = sub_list. begin(); p != sub_list. end(); ++ p)
- for (e_p = p -> second. begin();
- e_p != p -> second. end(); ++ e_p) {
-
- Thread::terminate_thread (*e_p);
-
- delete (*e_p);
- }
-#endif
- }
-
- /** Matrix-vector product
- * \f$y = A x\f$.
- * @return reference to output vector y
- * @param x input vector
- * @param y
- */
- template <class OutVector, class InVector>
- OutVector &apply (OutVector &y, const InVector &x) const
- {
-#ifdef __LINBOX_PARALLEL
- return BlackboxParallel (y, *this, x, BBBase::Apply);
-#else
- return _MD.vectorMul (y, *this, x);
-#endif
- }
-
- /** Transpose matrix-vector product
- * \f$ y = A^T x\f$.
- * @return reference to output vector y
- * @param x input vector
- * @param y
- */
- template <class OutVector, class InVector>
- OutVector &applyTranspose (OutVector& y, const InVector &x) const
- {
-#ifdef __LINBOX_PARALLEL
- return BlackboxParallel (y, *this, x, BBBase::ApplyTranspose);
-#else
- return _MD.vectorMul (y, _AT, x);
-#endif
- }
-
-
- template<typename _Tp1, typename _Rw1 = typename Rebind<_Row, _Tp1>::other>
- struct rebind {
- typedef SparseMatrix<_Tp1, _Rw1> other;
-
- void operator() (other & Ap, const Self_t& A) {
- // Ap = new other(F, A.rowdim(), A.coldim());
-
- typename _Tp1::Element e;
-
- Hom<typename Self_t::Field, _Tp1> hom(A.field(), Ap.field());
- for( typename Self_t::ConstIndexedIterator
- indices = A.IndexedBegin();
- (indices != A.IndexedEnd()) ;
- ++indices ) {
- // hom. image (e, A.getEntry(indices.rowIndex(),indices.colIndex()) );
- hom. image (e, indices.value() );
- if (!Ap.field().isZero(e))
- Ap.setEntry (indices.rowIndex(),
- indices.colIndex(), e);
- }
- }
- };
-
- template<typename _Tp1, typename _Rw1>
- SparseMatrix (const SparseMatrix<_Tp1, _Rw1> &Mat, const Field& F) :
- SparseMatrixBase<Element, _Row> (Mat.rowdim(),Mat.coldim()),
- _field (F), _VD (F), _MD (F), _AT (*this) {
- typename SparseMatrix<_Tp1,_Rw1>::template rebind<Field,_Row>()(*this, Mat);
- }
-
-
-
-
- /** Retreive row dimensions of Sparsemat matrix.
- * @return integer number of rows of SparseMatrix0Base matrix.
- */
- size_t rowdim () const
- { return SparseMatrixBase<Element, _Row>::_m; }
-
- /** Retreive column dimensions of Sparsemat matrix.
- * @return integer number of columns of SparseMatrix0Base matrix.
- */
- size_t coldim () const
- { return SparseMatrixBase<Element, _Row>::_n; }
-
- /** Read the matrix from a stream in the given format
- * @param is Input stream from which to read the matrix
- * @param format Format of input matrix
- * @return Reference to input stream
- */
- std::istream &read (std::istream &is, FileFormatTag format = FORMAT_DETECT)
- { return SparseMatrixBase<Element, _Row>::read (is, _field, format); }
-
- /** Write the matrix to a stream in the given format
- * @param os Output stream to which to write the matrix
- * @param format Format of output
- * @return Reference to output stream
- */
- std::ostream &write (std::ostream &os, FileFormatTag format = FORMAT_PRETTY) const
- { return SparseMatrixBase<Element, _Row>::write (os, _field, format); }
-
- // JGD 28.08.2002
- /** Access to the base field
- */
- const Field& field () const
- { return _field;}
-
- protected:
-
- const Field _field; // Field used for all arithmetic
- VectorDomain<Field> _VD; // Vector domain for matrix operations
- MatrixDomain<Field> _MD; // Matrix domain for matrix operations
-
- TransposeMatrix<SparseMatrix<_Field, _Row> > _AT;
-
- template<class F, class R> friend class SparseMatrix;
- };
-
- /** Sparse matrix factory
- * This class inherits \ref BlackboxFactory and provides a method for using a
- * \ref SparseMatrixBase object with integer or rational data type as input to
- * the high-level integer and rational solutions functions.
- */
-
- template <class Field,
- class BElement = typename Field::Element,
- class Row = typename LinBox::Vector<Field>::Sparse,
- class BRow = typename LinBox::RawVector<BElement>::Sparse>
- class SparseMatrixFactory : public BlackboxFactory<Field,SparseMatrix<Field,Row> > {//otot
- const SparseMatrixBase<BElement, BRow> &_matA;
-
- public:
-
- SparseMatrixFactory (const SparseMatrixBase<BElement, BRow> &A) :
- _matA (A)
- {}
-
- // FIXME: This function assumes basically that the matrix is over the integers
-
- SparseMatrix<Field,Row> *makeBlackbox (const Field &F);
-
- integer &maxNorm (integer &res)
- {
- typename SparseMatrixBase<BElement, BRow>::ConstIterator i;
-
- res = 0L;
-
- integer tmp;
-
- for (i = _matA.Begin (); i != _matA.End (); ++i) {
- tmp = abs (*i);
-
- if (res < tmp)
- res = tmp;
- }
-
- return res;
- }
-
- size_t rowdim ()
- { return _matA.rowdim (); }
- size_t coldim ()
- { return _matA.coldim (); }
-
- // A better bound for determinant of an integer sparse matrix, ZW
- integer &hadamardBound (integer& res) const
- {
- return hadamardBound (res, typename VectorTraits<Row>::VectorCategory());
- }
-
- integer &hadamardBound (integer& res, VectorCategories::SparseParallelVectorTag) const
- {
- typedef typename SparseMatrixBase<BElement, BRow>::ConstRowIterator RowIterator;
- typedef typename SparseMatrixBase<BElement, BRow>::ConstRow::second_type::const_iterator EltIterator;
-
- res = 1L;
-
- integer tmp;
- RowIterator row_p;
- EltIterator elt_p;
-
- for (row_p = _matA. rowBegin(); row_p != _matA. rowEnd(); ++ row_p) {
- tmp = 0;
-
- for (elt_p = row_p -> second. begin(); elt_p != row_p -> second. end(); ++ elt_p)
- tmp += static_cast<integer>(*elt_p) * (*elt_p);
-
- res *=tmp;
- }
-
- res = sqrt (res);
- return res;
- }
-
- integer &hadamardBound (integer& res, VectorCategories::SparseSequenceVectorTag) const{
- typedef typename SparseMatrixBase<BElement, BRow>::ConstRowIterator RowIterator;
- typedef typename SparseMatrixBase<BElement, BRow>::ConstRow::const_iterator EltIterator;
-
- res = 1L;
-
- integer tmp;
- RowIterator row_p;
-
- for ( row_p = _matA. rowBegin(); row_p != _matA. rowEnd(); ++ row_p) {
- tmp = 0;
-
- for (EltIterator elt_p = row_p -> begin(); elt_p != row_p -> end(); ++ elt_p)
- tmp += static_cast<integer>(elt_p -> second) * (elt_p -> second);
-
- res *=tmp;
- }
-
- res = sqrt (res);
- return res;
- }
-
- integer &hadamardBound (integer& res, VectorCategories::SparseAssociativeVectorTag) const
- {
- typedef typename SparseMatrixBase<BElement, BRow>::ConstRowIterator RowIterator;
- typedef typename SparseMatrixBase<BElement, BRow>::ConstRow::const_iterator EltIterator;
-
- res = 1L;
-
- integer tmp;
- RowIterator row_p;
- EltIterator elt_p;
-
- for ( row_p = _matA. rowBegin(); row_p != _matA. rowEnd(); ++ row_p) {
- tmp = 0;
-
- for (elt_p = row_p -> begin(); elt_p != row_p -> end(); ++ elt_p)
- tmp += static_cast<integer>(elt_p -> second) * (elt_p -> second);
-
- res *=tmp;
- }
-
- res = sqrt (res);
- return res;
- }
- };
-
-// #if !defined(__INTEL_COMPILER) && !defined(__CUDACC__) && !defined(__clang__)
- // template <>
-// #endif
- template <class Field, class _Row>
- struct MatrixTraits< SparseMatrix<Field, _Row> >
- {
- typedef SparseMatrix<Field, _Row> MatrixType;
- typedef MatrixCategories::RowMatrixTag MatrixCategory;
- };
-
- template <class Field, class _Row>
- struct MatrixTraits< const SparseMatrix<Field, _Row> >
- {
- typedef const SparseMatrix<Field, _Row> MatrixType;
- typedef MatrixCategories::RowMatrixTag MatrixCategory;
- };
-
-} // namespace LinBox
-
-#include "linbox/blackbox/sparse.inl"
-
-#endif // __LINBOX_blackbox_sparse_H
-
-
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
-// Local Variables:
-// mode: C++
-// tab-width: 8
-// indent-tabs-mode: nil
-// c-basic-offset: 8
-// End:
-
diff --git a/linbox/blackbox/sparse.inl b/linbox/blackbox/sparse.inl
deleted file mode 100644
index 57f9380..0000000
--- a/linbox/blackbox/sparse.inl
+++ /dev/null
@@ -1,77 +0,0 @@
-/* linbox/blackbox/sparse.inl
- * Copyright (C) 1999-2001 William J Turner,
- * 2001-2002 Bradford Hovinen
- *
- * Written by William J Turner <wjturner at math.ncsu.edu>,
- * Bradford Hovinen <hovinen at cis.udel.edu>
- *
- * ------------------------------------
- * Modified by Bradford Hovinen <hovinen at cis.udel.edu>
- *
- * Refactoring:
- * - Eliminated SparseMatrixAux and moved that functionality into Sparse0
- * - Made SparseMatrixBase parameterized only on the element type
- * - New read/write implementations for SparseMatrixBase, supporting multiple
- * formats
- * - Eliminated Gaussian elimination code
- * - Added iterators, including ColOfRowsIterator, Iterator, and
- * IndexIterator
- * - Eliminated operator []; added getEntry; changed put_value to setEntry
- * ------------------------------------
- *
- *
- * ========LICENCE========
- * This file is part of the library LinBox.
- *
- * LinBox is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- * ========LICENCE========
- *.
- */
-
-#ifndef __LINBOX_blackbox_sparse_INL
-#define __LINBOX_blackbox_sparse_INL
-
-#include "linbox/blackbox/sparse.h"
-
-namespace LinBox
-{
-
- template <class Field, class BElement, class _Row, class BRow>
- SparseMatrix<Field,_Row> *SparseMatrixFactory<Field, BElement, _Row, BRow>::makeBlackbox (const Field &F)
- {
- SparseMatrix<Field, _Row> *A = new SparseMatrix<Field, _Row> (F, rowdim (), coldim ());
-
- typename SparseMatrixBase<BElement, BRow>::ConstIterator i;
- typename SparseMatrixBase<BElement, BRow>::ConstIndexedIterator j;
-
- for (i = _matA.Begin (), j = _matA.IndexedBegin (); i != _matA.End (); ++i, ++j)
- F.init (A->refEntry (j.rowIndex (), j.colIndex ()), *i);
-
- return A;
- }
-
-}
-
-#endif // __LINBOX_blackbox_sparse_INL
-
-
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
-// Local Variables:
-// mode: C++
-// tab-width: 8
-// indent-tabs-mode: nil
-// c-basic-offset: 8
-// End:
-
diff --git a/linbox/blackbox/sparse1.h b/linbox/blackbox/sparse1.h
deleted file mode 100644
index 4a3e7da..0000000
--- a/linbox/blackbox/sparse1.h
+++ /dev/null
@@ -1,463 +0,0 @@
-/* Copyright (C) 1999,2005 LinBox
- * Written by JG Dumas
- *
- *
- *
- * ========LICENCE========
- * This file is part of the library LinBox.
- *
- * LinBox is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- * ========LICENCE========
- */
-
-#ifndef __LINBOX_sparse_bb_domain_H
-#define __LINBOX_sparse_bb_domain_H
-
-// Linbox wrapper for sparse vectors
-
-#include "linbox/vector/sparse.h"
-
-#ifndef _SP_BB_VECTOR_
-#ifdef _IBB_VECTOR_
-#define _SP_BB_VECTOR_ _IBB_VECTOR_
-#else
-#include <vector>
-#define _SP_BB_VECTOR_ std::vector
-#endif // _IBB_VECTOR_
-#endif // _SP_BB_VECTOR_
-
-template <class Domain, class I = unsigned long>
-class SparseBlackBoxDom {
-public:
- typedef Domain Domain_t;
- typedef Domain Field;
- typedef typename Domain::Element Type_t;
- typedef _SP_BB_VECTOR_<Sparse_Vector<Type_t, I> > Element;
- typedef Sparse_Vector<Type_t, I> Row_t;
- typedef Sparse_Vector<Type_t, I> value_type;
- typedef SparseBlackBoxDom< Domain, I > Self_t;
- typedef _SP_BB_VECTOR_< Type_t > PreferredInMatrix_t;
- typedef _SP_BB_VECTOR_< Type_t > PreferredOutMatrix_t;
-protected:
- typedef Sparse_Vector<Type_t, I> SV_t;
- typedef Element Rep;
- Domain_t _domain;
- //- As a BlackBox is a singleton we can store the only representation
- I _row_dim, _col_dim, _nz_elem;
- double _lognormdet;
- Rep _container;
-
-public:
- //--- Default cstors:
- SparseBlackBoxDom() :
- _domain(),_nz_elem(0)
- {};
- SparseBlackBoxDom(const Domain& D) :
- _domain(D),_nz_elem(0)
- { }
- SparseBlackBoxDom(const Domain& D, char * mat_file) :
- _domain(D),_nz_elem(0)
- { read(mat_file) ; }
-
- //--- Cstor of recopy: compiler's generated
- SparseBlackBoxDom(const Self_t& M) :
- _domain(M._domain),_row_dim(M.n_row()),_col_dim(M.n_col()),_nz_elem(0),_container(M._container)
- {}
-
- //--- Usefull to use the same domain to perform other operations
- const Domain_t& getdomain() const { return _domain; }
- const Domain_t& field() const { return _domain; }
-
- //--- BlackBox size
- size_t n_row(const Rep& a) const { return a.size(); }
- size_t n_col(const Rep& a) const { if (a.size() ) return a[0].actualsize(); else return 0; }
- size_t n_elem(const Rep& a) const
- {
- long tot=0;
- for(long s=a.size();s--;)
- tot+=a[s].size();
- return tot;
- }
-
- size_t size() const { return _row_dim; }
- size_t n_row() const { return _row_dim; }
- size_t n_col() const { return _col_dim; }
- size_t rowdim() const { return _row_dim; }
- size_t coldim() const { return _col_dim; }
- size_t n_elem() const { return _nz_elem; }
- double lognorm() const { return _lognormdet; }
-
-
- template<typename _Tp1>
- struct rebind
- { typedef SparseBlackBoxDom<_Tp1> other; };
-
- //--- initializations
- Rep& init(Rep& a, char * mat_file) const {
- I ni,nj,ne; double lognorm;
- return read(a,ni,nj,ne,lognorm,mat_file);
- }
-
- // Rep& init(Rep& a) const { return a = _container; }
- void init(Rep& a) { _container = a; _row_dim = n_row(a); _col_dim = n_col(a); _nz_elem = n_elem(a); }
- Rep& init(char * mat_file) { return read(mat_file); }
-
- // ***********************************************************
- // Access to the sparse matrix representation of the black-box
- // Reads to a file in the sparse format if the entries can be
- // converted to %ld, otherwise ?
-
- Rep& read (Rep& ca, I& ni, I& nj, I& ne, double& lognorm, char * mat_file) const {
- char *UT, *File_Name;
- int is_gzipped = 0;
- size_t s = strlen(mat_file);
- if ((mat_file[--s] == 'z') && (mat_file[--s] == 'g') && (mat_file[--s] == '.')) {
- is_gzipped = 1;
- File_Name = tempnam("/tmp","bbx_");
- UT = new char[s+34+strlen(File_Name)];
- sprintf(UT,"gunzip -c %s > %s", mat_file, File_Name);
- system(UT);
- sprintf(UT,"\\rm %s", File_Name);
- }
- else
- File_Name = mat_file;
-
- FILE* FileDes = fopen(File_Name, "r");
- if (FileDes != NULL) {
- char * tmp = new char[200]; unsigned long tni, tnj;
- fscanf(FileDes,"%ld %ld %s\n",&tni, &tnj, &tmp) ;
- ni = tni; nj =tnj;
- // delete [] tmp;
- ca.resize( ni ); ne=0;
-
- long i,j;
- long val;
- fscanf(FileDes,"%ld %ld %ld\n",&i, &j, &val) ;
- typename Domain_t::Element cour;
-
- lognorm = 0.0;
- double normrow = 0.0;
-
- for(unsigned long ii=0; ii<ni; ++ii) {
- // No non-zero element yet
- normrow = 0.0;
- ca[ii].resize(0);
- ca[ii].reactualsize(nj);
- while (i == (ii+1)) {
- _domain.init( cour, val );
- if (! _domain.isZero( cour )) {
- ca[ii].push_back( SV_t::value_type(j-1, cour ) );
- ++ne;
- normrow += double(cour) * double(cour);
-
- }
- fscanf(FileDes,"%ld %ld %ld\n",&i, &j, &val) ;
- }
- if (normrow > 1.0) lognorm += log( normrow )/2.0;
- }
-
- fclose(FileDes);
- if (is_gzipped) {
- system(UT);
- }
- }
-
- return ca;
- }
-
-
- void read (I& ni, I& nj, char * mat_file) const {
- char *UT, *File_Name;
- int is_gzipped = 0;
- size_t s = strlen(mat_file);
- if ((mat_file[--s] == 'z') && (mat_file[--s] == 'g') && (mat_file[--s] == '.')) {
- is_gzipped = 1;
- File_Name = tempnam("/tmp","bbx_");
- UT = new char[s+44+strlen(File_Name)];
- sprintf(UT,"gunzip -c %s | head -1 > %s", mat_file, File_Name);
- system(UT);
- sprintf(UT,"\\rm %s", File_Name);
- }
- else
- File_Name = mat_file;
-
- FILE* FileDes = fopen(File_Name, "r");
- if (FileDes != NULL) {
- char * tmp = new char[200]; unsigned long tni, tnj;
- fscanf(FileDes,"%ld %ld %s\n",&tni, &tnj, &tmp) ;
- ni = tni; nj =tnj;
- }
-
- fclose(FileDes);
- if (is_gzipped) {
- system(UT);
- }
- }
-
- Rep& read (char * mat_file) { return read(_container,_row_dim,_col_dim,_nz_elem, _lognormdet, mat_file); }
-
- Rep& read_transpose (Rep& ca, I& ni, I& nj, I& ne, char * mat_file) {
- char *UT, *File_Name;
- int is_gzipped = 0;
- size_t s = strlen(mat_file);
- if ((mat_file[--s] == 'z') && (mat_file[--s] == 'g') && (mat_file[--s] == '.')) {
- is_gzipped = 1;
- File_Name = tempnam("/tmp","bbx_");
- UT = new char[s+34+strlen(File_Name)];
- sprintf(UT,"gunzip -c %s > %s", mat_file, File_Name);
- system(UT);
- sprintf(UT,"\\rm %s", File_Name);
- }
- else
- File_Name = mat_file;
-
- FILE* FileDes = fopen(File_Name, "r");
- if (FileDes != NULL) {
- char * tmp = new char[200]; unsigned long tni, tnj;
- fscanf(FileDes,"%ld %ld %s\n",&tni, &tnj, &tmp) ;
- ni = tnj; nj =tni;
- ca.resize(ni); ne = 0;
- for(long l=0; l<ni; ++l)
- { ca[l].reactualsize(nj); ca[l].resize(0); }
-
- long i,j;
- long val;
- fscanf(FileDes,"%ld %ld %ld\n",&i, &j, &val) ;
- typename Domain_t::Element cour;
-
- for(long ii=0; ii<nj; ++ii)
- while (i == (ii+1)) {
- _domain.init( cour, val );
- if (! _domain.isZero( cour )) {
- ca[j-1].push_back( SV_t::value_type(I(ii), cour ) );
- ++ne;
- }
- fscanf(FileDes,"%ld %ld %ld\n",&i, &j, &val) ;
- }
- }
-
- fclose(FileDes);
- if (is_gzipped) {
- system(UT);
- }
- }
-
- Rep& read_transpose (char * mat_file) { return read_transpose(_container, _row_dim, _col_dim, _nz_elem, mat_file); }
-
-
- void write(char * O_File_Name, const Rep& ca ) const {
- FILE* FileDes = fopen(O_File_Name, "w");
- if (FileDes != 0) {
- I nr=n_row(ca),nc=n_col(ca);
- fprintf(FileDes,"%ld %ld M\n",nr,nc);
- typename SV_t::value_type _entry;
- for (long i=0; i<nr; i++)
- for (long j=0; j< ca[i].size(); j++) {
- _entry=ca[i][j];
- fprintf(FileDes,"%ld %ld %ld\n",i+1,_entry.getindex() +1,_domain.write( _entry.getvalue() ));
- }
- fprintf(FileDes,"%ld %ld %ld\n",0,0,0);
- }
- fclose(FileDes);
- }
-
- void write(char * O_File_Name) const { write(O_File_Name, _container) ; }
-
-
- // ***********************************************************
- // Access to the sparse matrix representation of the black-box
- // Reads from a stream in the sparse format if the entries
- // read from long
- // GV - PG
-
- Rep& read (std::istream& is, Rep& ca, I& ni, I& nj, I& ne) const {
-
- char * tmp = new char[200];
-
- is >> ni;
- is >> nj;
- is >> tmp;
-
- // delete [] tmp;
- ca.resize( ni ); ne=0;
- // ca = Rep( ni ); ne=0;
-
- long i,j;
- long val;
- is >> i >> j >> val ;
- typename Domain_t::Element cour;
-
- for(unsigned long ii=0; ii<ni; ++ii) {
- // No non-zero element yet
- // ca[ii] = SV_t(0,nj);
- ca[ii].resize(0);
- ca[ii].reactualsize(nj);
- while (i == (ii+1)) {
- _domain.init( cour, val );
- if (! _domain.isZero( cour )) {
- ca[ii].push_back( SV_t::value_type(j-1, cour ) );
- ++ne;
- }
- is >> i >> j >> val ;
- }
- }
-
- return ca;
- }
-
-
- Rep& read (std::istream& is)
- { return read(is, _container, _row_dim, _col_dim, _nz_elem); }
-
-
-
- // ***********************************************************
- // Write a sparse matrix to an output stream
- // GV - PG
- // JGD : removed -1
-
- std::ostream& write(std::ostream& os, const Rep& ca ) const {
-
- I nr=n_row(ca),nc=n_col(ca);
- os << nr << " " << nc << "\n";
- typename SV_t::value_type _entry;
- for (long i=0; i<nr; i++)
- for (long j=0; j< ca[i].size(); j++) {
- _entry=ca[i][j];
- os << i+1 << " " << _entry.getindex() +1 << " ";
- _domain.write(os, _entry.getvalue() );
- os << "\n";
- }
- return os << "\n";
- }
-
- std::ostream& write(std::ostream& os) const { return write(os, _container) ; }
-
-
-
-
- //-- BlackBox methods
-
- template<class OutMatrix, class InMatrix>
- OutMatrix& apply(OutMatrix& res, const InMatrix& vect, const Rep& ca ) const {
- typename SV_t::value_type toto;
- I k,i;
- res.resize(n_row());
- for(k=n_row(); k-- ; )
- for( res[k]=_domain.zero, i=ca[k].size(); i-- ; ) {
- toto = ca[k][i];
- _domain.axpyin(res[k],toto.getvalue(),vect[toto.getindex()]);
- }
- return res;
- }
-
- template<class OutMatrix, class InMatrix>
- OutMatrix& apply(OutMatrix& res, const InMatrix& vect) const {
- return apply(res, vect, _container);
- }
-
- template<class OutMatrix, class InMatrix>
- OutMatrix& applyTranspose(OutMatrix& res, const InMatrix& vect, const Rep& ca) const {
- typename SV_t::value_type toto;
- I k,i;
- res.resize(n_col());
- for(i=res.size(); i-- ; )
- res[i] = _domain.zero;
- for(k=ca.size(); k-- ; )
- for(i=ca[k].size(); i-- ; ) {
- toto = ca[k][i];
- _domain.axpyin(res[ toto.getindex() ],toto.getvalue(), vect[k]);
- }
- return res;
- }
-
- template<class OutMatrix, class InMatrix>
- OutMatrix& applyTranspose(OutMatrix& res, const InMatrix& vect) const {
- return applyTranspose(res, vect, _container);
- }
-
- //-- Special Methods
-
- const Row_t& operator[] (const I i) const { return _container[i]; }
- Row_t& operator[] (const I i) { return _container[i]; } ;
-
-
- template<class Left, class Right>
- Rep& rank_precondition(const Left& l, const Right& r, Rep& ca) const {
- Type_t tmp;
- for(long ii=ca.size()-1; ii>=0; --ii)
- for(long jj=ca[ii].size()-1; jj>=0; --jj)
- ca[ii][jj].change_value( _domain.mulin( _domain.mul(tmp, l[ii], ca[ii][jj].getvalue()), r[ca[ii][jj].getindex()] ) );
- return ca;
- }
-
- template<class Left, class Right>
- Rep& rank_precondition(const Left& l, const Right& r) {
- return rank_precondition(l, r, _container);
- }
-
- template<class RandGen>
- void precondition(RandGen& g) {
- I ll=0;
- PreferredOutMatrix_t diag_left(_row_dim);
- for(; ll<_row_dim; ++ll)
- _domain.nonzerorandom(g, diag_left[ll]);
-
- PreferredInMatrix_t diag_right(_col_dim);
- for(ll=0;ll<_col_dim; ++ll)
- _domain.nonzerorandom(g, diag_right[ll]);
-
- rank_precondition(diag_left, diag_right);
- }
-
-
- Type_t& trace(Type_t& t, const Rep& ca) {
- t = _domain.zero;
- for(long ii=ca.size()-1; ii>=0; --ii)
- for(long jj=ca[ii].size()-1; jj>=0; --jj)
- if (ca[ii][jj].getindex() == (ii))
- _domain.addin(t, ca[ii][jj].getvalue());
- return t;
- }
-
- Type_t& trace(Type_t& t) {
- return trace(t, _container);
- }
-
- Type_t& trace_ata(Type_t& t, const Rep& ca) {
- t = _domain.zero;
- for(long ii=ca.size()-1; ii>=0; --ii)
- for(long jj=ca[ii].size()-1; jj>=0; --jj)
- _domain.axpyin(t, ca[ii][jj].getvalue(), ca[ii][jj].getvalue());
- return t;
- }
-
- Type_t& trace_ata(Type_t& t) {
- return trace_ata(t, _container);
- }
-
-};
-
-#endif // __LINBOX_sparse_bb_domain_H
-
-
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
-// Local Variables:
-// mode: C++
-// tab-width: 8
-// indent-tabs-mode: nil
-// c-basic-offset: 8
-// End:
-
diff --git a/linbox/blackbox/squarize.h b/linbox/blackbox/squarize.h
index 4ce6f96..39054dd 100644
--- a/linbox/blackbox/squarize.h
+++ b/linbox/blackbox/squarize.h
@@ -59,13 +59,13 @@ namespace LinBox
Squarize (const Blackbox& A) :
_A_ptr(&A)
{
- _A_ptr->field().init(_Zero,0UL);
+ _A_ptr->field().assign(_Zero,_A_ptr->field().zero);
}
Squarize (const Blackbox *A_ptr) :
_A_ptr(A_ptr)
{
- _A_ptr->field().init(_Zero,0UL);
+ _A_ptr->field().assign(_Zero,_A_ptr->field().zero);
// create new copies of matrices in dynamic memory
//linbox_check (A_ptr != NULL);
//_A_ptr = A_ptr->clone ();
@@ -78,7 +78,7 @@ namespace LinBox
Squarize (const Squarize<Blackbox> &M) :
_A_ptr(M._A_ptr)
{
- _A_ptr->field().init(_Zero,0UL);
+ _A_ptr->field().assign(_Zero,_A_ptr->field().zero);
// create new copies of matrices in dynamic memory
//linbox_check (M._A_ptr != NULL);
//_A_ptr = M._A_ptr->clone ();
@@ -106,13 +106,14 @@ namespace LinBox
* @return reference to vector y containing output.
* @param x constant reference to vector to contain input
* @param y
+ * @todo use field().zero
*/
template <class Vector1, class Vector2>
inline Vector1 &apply (Vector1 &y, const Vector2 &x) const
{
if (_A_ptr != 0) _A_ptr->apply (y, x);
if (_A_ptr->rowdim () < y.size()) {
- for(typename Vector1::iterator yit=y.begin()+_A_ptr->rowdim ();
+ for(typename Vector1::iterator yit=y.begin()+(ptrdiff_t)_A_ptr->rowdim ();
yit != y.end(); ++yit)
*yit = _Zero;
}
@@ -128,13 +129,14 @@ namespace LinBox
* @return reference to vector y containing output.
* @param x constant reference to vector to contain input
* @param y
+ * @todo use field().zero
*/
template <class Vector1, class Vector2>
inline Vector1 &applyTranspose (Vector1 &y, const Vector2 &x) const
{
if (_A_ptr != 0) _A_ptr->applyTranspose (y, x);
if (_A_ptr->coldim () < y.size()) {
- for(typename Vector1::iterator yit=y.begin()+_A_ptr->rcoldim ();
+ for(typename Vector1::iterator yit=y.begin()+(ptrdiff_t)_A_ptr->rcoldim ();
yit != y.end(); ++yit)
*yit = _Zero;
} return y;
diff --git a/linbox/blackbox/submatrix.h b/linbox/blackbox/submatrix.h
index da3eece..79ab150 100644
--- a/linbox/blackbox/submatrix.h
+++ b/linbox/blackbox/submatrix.h
@@ -44,7 +44,7 @@
#include "linbox/util/debug.h"
#include "linbox/util/error.h"
#include "linbox/vector/vector-domain.h"
-#include "linbox/matrix/blas-matrix.h"
+#include "linbox/matrix/dense-matrix.h"
#include "linbox/blackbox/blackbox-interface.h"
@@ -140,12 +140,12 @@ namespace LinBox
template<class OutVector, class InVector>
OutVector& apply (OutVector &y, const InVector& x) const
{
- std::fill (_z.begin (), _z.begin () + _col, _BB->field().zero);
- std::fill (_z.begin () + _col + _coldim, _z.end (), _BB->field().zero);
+ std::fill (_z.begin (), _z.begin () + (ptrdiff_t)_col, _BB->field().zero);
+ std::fill (_z.begin () + (ptrdiff_t)(_col + _coldim), _z.end (), _BB->field().zero);
- copy (x.begin (), x.end (), _z.begin () + _col); // Copying. Yuck.
+ copy (x.begin (), x.end (), _z.begin () + (ptrdiff_t)_col); // Copying. Yuck.
_BB->apply (_y, _z);
- copy (_y.begin () + _row, _y.begin () + _row + _rowdim, y.begin ());
+ copy (_y.begin () + (ptrdiff_t)_row, _y.begin () + (ptrdiff_t)(_row + _rowdim), y.begin ());
return y;
}
@@ -161,12 +161,12 @@ namespace LinBox
template<class OutVector, class InVector>
OutVector& applyTranspose (OutVector &y, const InVector& x) const
{
- std::fill (_y.begin (), _y.begin () + _row, _BB->field().zero);
- std::fill (_y.begin () + _row + _rowdim, _y.end (), _BB->field().zero);
+ std::fill (_y.begin (), _y.begin () + (ptrdiff_t)_row, _BB->field().zero);
+ std::fill (_y.begin () + (ptrdiff_t)(_row + _rowdim), _y.end (), _BB->field().zero);
- copy (x.begin (), x.end (), _y.begin () + _row); // Copying. Yuck.
+ copy (x.begin (), x.end (), _y.begin () + (ptrdiff_t)_row); // Copying. Yuck.
_BB->applyTranspose (_z, _y);
- copy (_z.begin () + _col, _z.begin () + _col + _coldim, y.begin ());
+ copy (_z.begin () + (ptrdiff_t)_col, _z.begin () + (ptrdiff_t)(_col + _coldim), y.begin ());
return y;
}
@@ -265,12 +265,13 @@ namespace LinBox
/** Specialization for BlasMatrix */
template<class _Field>
- class Submatrix<BlasMatrix<_Field>, VectorCategories::DenseVectorTag> : public BlasSubmatrix<_Field> {
+ class Submatrix<BlasMatrix<_Field>, VectorCategories::DenseVectorTag> : public BlasSubmatrix<BlasMatrix<_Field> > {
public:
typedef _Field Field;
- typedef Submatrix<BlasMatrix<_Field>, VectorCategories::DenseVectorTag> Self_t;
- typedef BlasSubmatrix<_Field> Father_t;
+ typedef BlasMatrix<_Field> Matrix ;
+ typedef Submatrix<Matrix, VectorCategories::DenseVectorTag> Self_t;
+ typedef BlasSubmatrix<Matrix> Father_t;
private:
@@ -294,7 +295,7 @@ namespace LinBox
size_t col,
size_t Rowdim,
size_t Coldim) :
- BlasSubmatrix<Field>(const_cast<BlasMatrix<Field>& >(*Mat), row, col, Rowdim, Coldim),
+ BlasSubmatrix<Matrix>(const_cast<BlasMatrix<Field>& >(*Mat), row, col, Rowdim, Coldim),
f(Mat -> field()), vd(Mat -> field())
{ }
@@ -310,7 +311,7 @@ namespace LinBox
size_t col,
size_t Rowdim,
size_t Coldim) :
- BlasSubmatrix<Field>(const_cast<BlasMatrix<Field>& >(Mat), row, col, Rowdim, Coldim),
+ BlasSubmatrix<Matrix>(const_cast<BlasMatrix<Field>& >(Mat), row, col, Rowdim, Coldim),
f(Mat.field()), vd(Mat.field())
{ }
@@ -327,10 +328,10 @@ namespace LinBox
size_t col,
size_t Rowdim,
size_t Coldim ) :
- BlasSubmatrix<Field> (const_cast<Submatrix<BlasMatrix<Field> >&>(*SM), row, col, Rowdim, Coldim),
+ BlasSubmatrix<Matrix> (const_cast<Submatrix<BlasMatrix<Field> >&>(*SM), row, col, Rowdim, Coldim),
f (SM -> field()), vd(SM -> field())
{
- }
+ }
/** Constructor from an existing submatrix and dimensions
* @param SM reference to Submatrix from which to
@@ -345,7 +346,7 @@ namespace LinBox
size_t col,
size_t Rowdim,
size_t Coldim ) :
- BlasSubmatrix<Field> (const_cast<Submatrix<BlasMatrix<Field> >&>(SM), row, col, Rowdim, Coldim),
+ BlasSubmatrix<Matrix> (const_cast<Submatrix<BlasMatrix<Field> >&>(SM), row, col, Rowdim, Coldim),
f (SM. field()), vd(SM. field())
{ }
@@ -360,7 +361,7 @@ namespace LinBox
std::istream& read (std::istream& is)
{
- BlasSubmatrix<Field>::read (is, f);
+ BlasSubmatrix<Matrix>::read (is, f);
return is;
}
@@ -369,7 +370,7 @@ namespace LinBox
std::ostream& write (std::ostream& os) const
{
- BlasSubmatrix<Field>::write (os, f);
+ BlasSubmatrix<Matrix>::write (os, f);
return os;
}
@@ -385,7 +386,7 @@ namespace LinBox
Vect1 &apply (Vect1 &y, const Vect2 &x) const
{
- typename BlasSubmatrix<Field>::ConstRowIterator p;
+ typename BlasSubmatrix<Matrix>::ConstRowIterator p;
typename Vect1::iterator p_y = y.begin ();
@@ -407,7 +408,7 @@ namespace LinBox
Vect1 &applyTranspose (Vect1 &y, const Vect2 &x) const
{
- typename BlasSubmatrix<Field>::ConstColIterator colp;
+ typename BlasSubmatrix<Matrix>::ConstColIterator colp;
typename Vect1::iterator p_y = y.begin ();
@@ -486,12 +487,12 @@ namespace LinBox
template<class OutVector, class InVector>
OutVector& apply (OutVector &y, const InVector& x) const
{
- std::fill (_z.begin (), _z.begin () + _col, _BB_data.field().zero);
- std::fill (_z.begin () + _col + _coldim, _z.end (), _BB_data.field().zero);
+ std::fill (_z.begin (), _z.begin () + (ptrdiff_t)_col, _BB_data.field().zero);
+ std::fill (_z.begin () + (ptrdiff_t)(_col + _coldim), _z.end (), _BB_data.field().zero);
- copy (x.begin (), x.end (), _z.begin () + _col); // Copying. Yuck.
+ copy (x.begin (), x.end (), _z.begin () +(ptrdiff_t) _col); // Copying. Yuck.
_BB_data.apply (_y, _z);
- copy (_y.begin () + _row, _y.begin () + _row + _rowdim, y.begin ());
+ copy (_y.begin () +(ptrdiff_t) _row, _y.begin () +(ptrdiff_t) (_row + _rowdim), y.begin ());
return y;
}
@@ -507,12 +508,12 @@ namespace LinBox
template<class OutVector, class InVector>
OutVector& applyTranspose (OutVector &y, const InVector& x) const
{
- std::fill (_y.begin (), _y.begin () + _row, _BB_data.field().zero);
- std::fill (_y.begin () + _row + _rowdim, _y.end (), _BB_data.field().zero);
+ std::fill (_y.begin (), _y.begin () +(ptrdiff_t) _row, _BB_data.field().zero);
+ std::fill (_y.begin () +(ptrdiff_t)( _row + _rowdim), _y.end (), _BB_data.field().zero);
- copy (x.begin (), x.end (), _y.begin () + _row); // Copying. Yuck.
+ copy (x.begin (), x.end (), _y.begin () + (ptrdiff_t)_row); // Copying. Yuck.
_BB_data.applyTranspose (_z, _y);
- copy (_z.begin () + _col, _z.begin () + _col + _coldim, y.begin ());
+ copy (_z.begin () + (ptrdiff_t)_col, _z.begin () + (ptrdiff_t)(_col + _coldim), y.begin ());
return y;
}
@@ -619,4 +620,3 @@ namespace LinBox
// c-basic-offset: 8
// End:
// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
-
diff --git a/linbox/blackbox/subrowmatrix.h b/linbox/blackbox/subrowmatrix.h
new file mode 100644
index 0000000..da961fe
--- /dev/null
+++ b/linbox/blackbox/subrowmatrix.h
@@ -0,0 +1,219 @@
+/* linbox/blackbox/companion.h
+ * Copyright(c) LinBox
+ *
+ * Author: Zhendong wan
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ * ========LICENCE========
+ */
+
+
+#ifndef __LINBOX_subrowmatrix_H
+#define __LINBOX_subrowmatrix_H
+
+THIS_CODE_MAY_NOT_COMPILE_AND_IS_NOT_TESTED
+
+
+#include <iostream>
+#include "linbox/matrix/matrix-domain.h"
+#include "linbox/vector/vector-domain.h"
+#include "linbox/blackbox/blackbox-interface.h"
+
+namespace LinBox
+{
+ /**
+ * \brief submatrix consisting contiguous rows of a row based matrix.
+
+ \ingroup blackbox
+ * submatrix consisting of rows [i1, ..., i2] of a row based matrix.
+ */
+ //@{
+ template<class Matrix,
+ class MatrixCategory = typename MatrixTraits<Matrix>::MatrixCategory>
+
+ class SubRowMatrix: public BlackboxInterface ;
+
+ /** matrix with RowMatrixTag
+ * Support Row, apply, applyTranspose
+ */
+ template <class Matrix>
+ class SubRowMatrix<Matrix, MatrixCategories::RowMatrixTag> : public BlackboxInterface {
+
+ public:
+ typedef typename Matrix::Field Field;
+
+ protected:
+
+ /* try to use const Matrix*
+ * but getting too much compiling error messages.
+ * Maybe do it in future.
+ * Z. Wan
+ */
+ Matrix* _BB;
+
+ size_t _row;
+
+ size_t _rowdim;
+
+ MatrixDomain<Field> _MD;
+
+ public:
+
+ typedef typename MatrixCategories::RowMatrixTag MatrixCategory;
+
+ typedef typename Field::Element Element;
+
+ typedef typename Matrix::RowIterator RowIterator;
+ typedef typename Matrix::ConstRowIterator ConstRowIterator;
+ typedef typename Matrix::Row Row;
+ typedef typename Matrix::ConstRow ConstRow;
+
+ typedef typename Matrix::ConstIterator Iterator;
+ typedef typename Matrix::ConstIterator ConstIterator;
+ typedef typename Matrix::ConstIndexedIterator IndexedIterator;
+ typedef typename Matrix::ConstIndexedIterator ConstIndexedIterator;
+
+ SubRowMatrix (const Matrix* BB,
+ size_t row,
+ size_t rowdim) :
+ _row(row), _rowdim(rowdim), _MD(BB->field())
+ {
+
+ _BB = const_cast<Matrix*&>(BB);
+
+ }
+
+
+ virtual ~SubRowMatrix ( ) {}
+
+ size_t rowdim ( ) const
+ {
+
+ return _rowdim;
+ }
+
+ size_t coldim ( ) const
+ {
+
+ return _BB -> coldim();
+ }
+
+ const Field& field( ) const
+ {
+
+ return _BB -> field ();
+ }
+
+ template <class OutVector, class InVector>
+ OutVector &apply (OutVector &y, const InVector &x) const
+ {
+
+
+ return _MD.vectorMul (y, *this, x);
+ }
+
+
+ template <class OutVector, class InVector>
+ OutVector &applyTranspose (OutVector& y, const InVector &x) const
+ {
+
+ return _MD.vectorMul (y, TransposeMatrix<SubRowMatrix> (*this), x);
+ }
+
+
+
+ template<typename _Tp1>
+ struct rebind
+ { typedef SubRowMatrix<Matrix::rebind<_Tp1>::other, MatrixCategory> other; };
+
+
+
+ RowIterator rowBegin () {
+
+ return _BB -> rowBegin() + _row;
+
+ }
+
+ RowIterator rowEnd () {
+
+ return _BB -> rowBegin() + (_row + rowdim);
+ }
+
+
+ ConstRowIterator rowBegin () const
+ {
+
+ return _BB -> rowBegin() + _row;
+ }
+
+ ConstRowIterator rowEnd () const
+ {
+
+ return _BB -> rowBegin() + (_row + _rowdim);
+ }
+
+
+ std::ostream& write (std::ostream& out) const
+ {
+
+#ifdef DEBUG
+
+ std::cout << "Row, Col " << rowdim () << ' ' << coldim () << '\n';
+#endif
+
+ ConstRowIterator row_p;
+
+ VectorDomain<Field> vd (field());
+
+
+ for (row_p = rowBegin(); row_p != rowEnd(); ++ row_p) {
+
+ vd. write (out, *row_p);
+
+ std::cout << '\n';
+
+ }
+
+ return out;
+
+ }
+
+ /* I do not need them currently now,
+ * I maybe implement in future
+ */
+#if 0
+ Iterator Begin ();
+ Iterator End ();
+ ConstIterator Begin () const;
+ ConstIterator End () const;
+#endif
+ };
+ //@}
+}
+
+#endif //__LINBOX_subrowmatrix_H
+
+
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+
diff --git a/linbox/blackbox/sum.h b/linbox/blackbox/sum.h
index 8782d67..44a11f7 100644
--- a/linbox/blackbox/sum.h
+++ b/linbox/blackbox/sum.h
@@ -72,7 +72,7 @@ namespace LinBox
* @param A, B: black box matrices.
*/
Sum (const Blackbox1 &A, const Blackbox2 &B) :
- _A_ptr(&A), _B_ptr(&B), VD( field() )
+ _A_ptr(&A), _B_ptr(&B), VD( A.field() )
{
linbox_check (A.coldim () == B.coldim ());
linbox_check (A.rowdim () == B.rowdim ());
@@ -87,7 +87,7 @@ namespace LinBox
* @param A_ptr, B_ptr: pointers to black box matrices.
*/
Sum (const Blackbox1 *A_ptr, const Blackbox2 *B_ptr) :
- _A_ptr(A_ptr), _B_ptr(B_ptr), VD( field() )
+ _A_ptr(A_ptr), _B_ptr(B_ptr), VD( A_ptr->field() )
{
// create new copies of matrices in dynamic memory
linbox_check (A_ptr != 0);
@@ -189,6 +189,11 @@ namespace LinBox
const Blackbox2* getRightPtr() const {return _B_ptr;}
+ std::ostream & write(std::ostream & os) const
+ {
+ _A_ptr->write(os); _B_ptr->write(os << '+') ;
+ return os ;
+ }
protected:
// use a copy of the input field for faster performance (no pointer dereference).
@@ -232,7 +237,7 @@ namespace LinBox
* @param A, B: black box matrices.
*/
SumOwner (const Blackbox1 &A, const Blackbox2 &B) :
- _A_data(&A), _B_data(&B), VD( field() )
+ _A_data(&A), _B_data(&B), VD( A.field() )
{
linbox_check (A.coldim () == B.coldim ());
linbox_check (A.rowdim () == B.rowdim ());
@@ -247,7 +252,7 @@ namespace LinBox
* @param A_data, B_data: pointers to black box matrices.
*/
SumOwner (const Blackbox1 *A_data, const Blackbox2 *B_data) :
- _A_data(A_data), _B_data(B_data), VD( field() )
+ _A_data(A_data), _B_data(B_data), VD( A_data->field() )
{
// create new copies of matrices in dynamic memory
linbox_check (A_data != 0);
@@ -392,6 +397,12 @@ namespace LinBox
return _B_data;
}
+ std::ostream & write(std::ostream & os) const
+ {
+ _A_data.write(os); _B_data.write(os << '+') ;
+ return os ;
+ }
+
protected:
// use a copy of the input field for faster performance (no pointer dereference).
diff --git a/linbox/blackbox/toeplitz.h b/linbox/blackbox/toeplitz.h
index dbab05c..e14cf70 100644
--- a/linbox/blackbox/toeplitz.h
+++ b/linbox/blackbox/toeplitz.h
@@ -31,11 +31,12 @@
#include <vector>
#include "linbox/vector/vector-traits.h"
#include "linbox/solutions/methods.h" // for shape
+#include "linbox/solutions/solution-tags.h" // to offer trace, det
#include "linbox/linbox-config.h"
#include "linbox/blackbox/blackbox-interface.h"
#ifdef __LINBOX_HAVE_NTL
-#include "linbox/field/ntl.h"
+#include "linbox/ring/ntl.h"
#endif
//#define DBGMSGS 1
@@ -49,27 +50,27 @@
namespace LinBox
{
- template <class _Field, class _PField>
+ template <class _Field, class _PRing>
class ToeplitzBase : public BlackboxInterface {
- protected: // Constructors etc. are protected because instances of this
- // class should not be instantiated; use Toeplitz instead.
- typedef _PField PField;
- typedef typename _PField::Element Poly;
+ protected: // Constructors etc. are protected because stand-alone instances of this
+ // class should not be constructed; use Toeplitz instead.
+ typedef _PRing PRing;
+ typedef typename _PRing::Element Poly;
- typedef typename _PField::CoeffField Field;
+ typedef typename _PRing::CoeffField Field;
- typedef typename _PField::Coeff Element;
+ typedef typename _PRing::Coeff Element;
//------- CONSTRUCTORS AND DESTRUCTORS
virtual ~ToeplitzBase(); // Destructor
- ToeplitzBase(); // Zero Param Constructor
+ // ToeplitzBase(); // Zero Param Constructor
ToeplitzBase( const Field& F);// Field only cstr. JGD 30.09.2003
- ToeplitzBase( const PField& PF );
+ ToeplitzBase( const PRing& PF );
// Constructor using a polynomial field, a polynomial in that
// field representing the matrix, and the matrix dimensions
// If no n is given, it will default to the same as m.
- ToeplitzBase( const PField& PF, const Poly& p,
+ ToeplitzBase( const PRing& PF, const Poly& p,
size_t m, size_t n=0 );
@@ -84,9 +85,9 @@ namespace LinBox
inline size_t rowdim() const { return rowDim; }// Number of Rows
inline size_t coldim() const { return colDim; }// Number of Cols
- inline size_t sysdim() const { return sysDim; }
- // Max of rows & columns;
- const Field& field() const {return K;}
+ inline size_t sysdim() const { return sysDim; } // Max of rows & columns;
+ const Field& field() const {return *field_;}
+
//------- MUTATOR METHODS
void setToUniModUT() ; // Convert to UTriang matrix with det 1
@@ -96,8 +97,8 @@ namespace LinBox
// void convert(NTL::ZZ_pX &pout, const std::vector<Element> &vin);
protected:
- PField P; // Polynomial field
- Field K; // Field parameter (coefficient field)
+ PRing P; // Polynomial field
+ const Field *field_; // Field parameter (coefficient field)
size_t rowDim; // row dimension
size_t colDim; // col dimension
@@ -112,7 +113,7 @@ namespace LinBox
//std::vector<NTL::ZZ_p> data; // The vector of coeffs of the polynomial
/* These were only used by the XML stuff and are more or less
- * obsolete with the presence of polynomial fields.
+ * obsolete with the presence of polynomial rings.
void convert(Poly &pout, const std::vector<Element> &vin);
// CONVERTS the input vector of field Elements to a ZZ_pX
@@ -121,6 +122,17 @@ namespace LinBox
// Converts from polynomial rep to a vector rep
// inverse of the convert from Element to ZZ_pX
*/
+ public:
+ std::ostream & write(std::ostream & out) const
+ {
+ return out << "NO WRITE IMPLEMENTED" << std::endl;
+ }
+
+ void read(std::istream & in)
+ {
+ throw(NotImplementedYet());
+ }
+
}; // class ToeplitzBase
@@ -128,92 +140,93 @@ namespace LinBox
\ingroup blackbox
* It stores the 2n-1 values of the first row and column.
- * The apply is a call to polynomial multiplication and for large n
- * will be FFT based, running in O(lg(n)) time.
- * The _PField template parameter should be a polynomial field;
- * computations on the matrix will be performed using this polynomial.
+ * The _PRing template parameter should be a polynomial ring.
+ * Computations on the matrix will be performed using this polynomial ring.
+ * The apply is a call to polynomial multiplication and if the poly ring is
+ * FFT based for large n, apply will run in O(n lg(n)) time.
*/
#ifdef __LINBOX_HAVE_NTL
- template< class _CField, class _PField = NTL_ZZ_pX >
+ template< class _CField, class _PRing = NTL_ZZ_pX >
#else
- template< class _CField, class _PField >
+ template< class _CField, class _PRing >
#endif
- class Toeplitz :public ToeplitzBase<_CField,_PField> {
+ class Toeplitz : public ToeplitzBase<_CField,_PRing> {
protected:
- typedef ToeplitzBase<_CField,_PField> TBase;
+ typedef ToeplitzBase<_CField,_PRing> Father_t;
public:
- typedef typename TBase::PField PField;
- typedef typename TBase::Poly Poly;
+ typedef typename Father_t::PRing PRing;
+ typedef typename Father_t::Poly Poly;
- typedef typename TBase::Field Field;
+ typedef typename Father_t::Field Field;
- typedef typename TBase::Element Element;
+ typedef typename Father_t::Element Element;
- Toeplitz() :
- TBase()
- {}
Toeplitz(const Field& F) :
- TBase(F)
+ Father_t(F)
{}
- Toeplitz( const PField& PF ) :
- TBase(PF)
+ Toeplitz( const PRing& PF ) :
+ Father_t(PF)
{}
- Toeplitz( const PField& PF, const Poly& p,
+ Toeplitz( const PRing& PF, const Poly& p,
size_t m, size_t n=0 ) :
- TBase(PF,p,m,n)
+ Father_t(PF,p,m,n)
{}
+ using Father_t::field_;
+ using Father_t::field;
}; // end of class Toeplitz
/** Specialization for when the field of matrix elements is the same
* as the coefficient field of the polynomial field.
*/
- template< class _PField >
- class Toeplitz< typename _PField::CoeffField, _PField > : public ToeplitzBase< typename _PField::CoeffField, _PField > {
+ template< class _PRing >
+ class Toeplitz< typename _PRing::CoeffField, _PRing > : public ToeplitzBase< typename _PRing::CoeffField, _PRing > {
protected:
- typedef ToeplitzBase< typename _PField::CoeffField, _PField > TBase;
- using TBase::P;
- using TBase::rowDim;
- using TBase::colDim;
- using TBase::sysDim;
- using TBase::shape;
- using TBase::pdata;
- using TBase::rpdata;
- using TBase::K;
+ typedef ToeplitzBase< typename _PRing::CoeffField, _PRing > Father_t;
+ using Father_t::P;
+ using Father_t::rowDim;
+ using Father_t::colDim;
+ using Father_t::sysDim;
+ using Father_t::shape;
+ using Father_t::pdata;
+ using Father_t::rpdata;
+ using Father_t::field_;
public:
- using TBase::rowdim;
- using TBase::coldim;
- typedef typename TBase::PField PField;
- typedef typename TBase::Poly Poly;
+ using Father_t::rowdim;
+ using Father_t::coldim;
+ typedef typename Father_t::PRing PRing;
+ typedef typename Father_t::Poly Poly;
- typedef typename TBase::Field Field;
+ typedef typename Father_t::Field Field;
- typedef typename TBase::Element Element;
+ typedef typename Father_t::Element Element;
//------- CONSTRUCTORS AND DESTRUCTORS
- Toeplitz() :
- TBase()
- {}
Toeplitz(const Field& F) :
- TBase(F)
+ Father_t(F)
{}
- Toeplitz( const PField& PF ) :
- TBase(PF)
+ Toeplitz( const PRing& PF ) :
+ Father_t(PF)
{}
- Toeplitz( const PField& PF, const Poly& p,
+ Toeplitz( const PRing& PF, const Poly& p,
size_t m, size_t n=0 ) :
- TBase(PF,p,m,n)
+ Father_t(PF,p,m,n)
{}
Toeplitz( const Field& F, // Cnstr. with Field and STL vec. of elems
const std::vector<Element>& v) :
- TBase(F)
+ Father_t(F)
{ init_vector(v); }
+ Toeplitz( const Field& F, // Cnstr. with Field and STL vec. of elems
+ const BlasVector<Field>& v) :
+ Father_t(F)
+ { init_vector(v.getRep()); }
- void print( std::ostream& os = std::cout) const; // Print the contents to the screen
+ //! @bug this is not MM format at all
+ std::ostream & write( std::ostream& os = std::cout) const; // Print the contents to the screen
- void print( char *outFileName) const;
+ void write( char *outFileName) const;
// Print the contents to a file
template<class OutVector, class InVector>
@@ -224,6 +237,9 @@ namespace LinBox
// Get the determinant of the matrix
Element& det( Element& res ) const;
+
+ Element& trace( Element& res ) const;
+
protected:
// initialization via a vector. Usually called by a constructor
// Moved in a separate protected function to enable easier
@@ -231,20 +247,25 @@ namespace LinBox
void init_vector( const std::vector<Element>& v );
}; // Toeplitz specialization
+ template<class Field, class PD>
+ struct DetCategory<Toeplitz<Field,PD> > { typedef typename SolutionTags::Local Tag; };
+
+ template<class Field, class PD>
+ struct TraceCategory<Toeplitz<Field,PD> > { typedef typename SolutionTags::Local Tag; };
+
+
+
} // namespace LinBox
#include "linbox/blackbox/toeplitz.inl"
-// Hide the implementation; include it here because
-// older compilers want everything in one template file
#endif //__LINBOX_toeplitz_H
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
// Local Variables:
// mode: C++
// tab-width: 8
// indent-tabs-mode: nil
// c-basic-offset: 8
// End:
-
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/blackbox/toeplitz.inl b/linbox/blackbox/toeplitz.inl
index 1978f0f..acf6c3c 100644
--- a/linbox/blackbox/toeplitz.inl
+++ b/linbox/blackbox/toeplitz.inl
@@ -27,9 +27,6 @@
* partial template specialization for toeplitz matrices that
* are manipulated in fields and rings according to the arithmetic
* in the ntl package from V. Shoup
- *
- * Everything is in the Linbox namespace by virtue of the #include
- * in ntl-Toeplitz.h
*-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+*/
#ifndef __LINBOX_bb_toeplitz_INL
@@ -37,7 +34,7 @@
#include <iostream>
#include <fstream>
-#include <cassert> // JGD 26.09.2003
+// #include <clinbox_check> // JGD 26.09.2003
#include "linbox/algorithms/toeplitz-det.h"
namespace LinBox
@@ -45,12 +42,12 @@ namespace LinBox
/*-----------------------------------------------------------------
*---- Destructor
*----------------------------------------------------------------*/
- template <class _CField, class _PField>
- inline ToeplitzBase<_CField,_PField>::~ToeplitzBase()
+ template <class _CField, class _PRing>
+ inline ToeplitzBase<_CField,_PRing>::~ToeplitzBase()
{
#ifdef DBGMSGS
- std::cout << "Toeplitz::~Toeplitz():\tDestroyed a " << rowDim << "x"<< this->colDim<<
- " Toeplitz matrix "<< std::endl;
+ std::cout << "Toeplitz::~Toeplitz():\tDestroyed a " << rowdim() << "x"<< this->coldim()<<
+ " Toeplitz matrix "<< std::endl;
#endif
}//---- Destructor ---- [Tested 6/14/02 -- Works]
@@ -59,9 +56,9 @@ namespace LinBox
/*-----------------------------------------------------------------
*---- Field-only Constructor
*----------------------------------------------------------------*/
- template <class _CField, class _PField>
- ToeplitzBase<_CField, _PField>::ToeplitzBase(const Field& F) :
- P(F), K(F)
+ template <class _CField, class _PRing>
+ ToeplitzBase<_CField, _PRing>::ToeplitzBase(const Field& F) :
+ P(F), field_(&F)
{
sysDim = // Default dimension is 0
rowDim = // Default row dim is 0
@@ -69,18 +66,19 @@ namespace LinBox
shape.shape(BlackboxSpecifier::TOEPLITZ);
#ifdef DBGMSGS
std::cout << "Toeplitz::Toeplitz():\tCreated a " << rowDim << "x"<< this->colDim<<
- " Toeplitz matrix "<< std::endl;
+ " Toeplitz matrix "<< std::endl;
#endif
}//----- Field-only Constructor
+#if 0
/*-----------------------------------------------------------------
*---- Zero Parameter Constructor
*----------------------------------------------------------------*/
- template <class _CField, class _PField>
- ToeplitzBase<_CField, _PField>::ToeplitzBase() :
- P(0), K(0)
+ template <class _CField, class _PRing>
+ ToeplitzBase<_CField, _PRing>::ToeplitzBase() :
+ P(0), field_(0)
{
sysDim = // Default dimension is 0
rowDim = // Default row dim is 0
@@ -88,17 +86,15 @@ namespace LinBox
shape.shape(BlackboxSpecifier::TOEPLITZ);
#ifdef DBGMSGS
std::cout << "Toeplitz::Toeplitz():\tCreated a " << rowDim << "x"<< this->colDim<<
- " Toeplitz matrix "<< std::endl;
+ " Toeplitz matrix "<< std::endl;
#endif
}//----- Zero Param Constructor ---- [Tested 6/14/02 -- Works]
+#endif
- /*-----------------------------------------------------------------
- *------ Polynomial Field constructor
- *-----------------------------------------------------------------*/
- template< class _CField, class _PField >
- ToeplitzBase<_CField,_PField>::ToeplitzBase( const PField& PF ) :
- P(PF), K(PF.getCoeffField())
+ template <class _CField, class _PRing>
+ ToeplitzBase<_CField, _PRing>::ToeplitzBase(const _PRing& PF) :
+ P(PF), field_(&(PF.getCoeffField()))
{
sysDim = rowDim = this->colDim = 0;
shape.shape(BlackboxSpecifier::TOEPLITZ);
@@ -108,27 +104,27 @@ namespace LinBox
/*-----------------------------------------------------------------
*------ Polynomial constructor
*-----------------------------------------------------------------*/
- template< class _CField, class _PField >
- ToeplitzBase<_CField,_PField>::ToeplitzBase
- ( const PField& PF, const Poly& p, size_t m, size_t n ) :
- P(PF), K(PF.getCoeffField()), rowDim(m), colDim(n), pdata(p)
+ template< class _CField, class _PRing >
+ ToeplitzBase<_CField,_PRing>::ToeplitzBase ( const PRing& PF
+ , const Poly& p
+ , size_t m
+ , size_t n ) :
+ P(PF), field_(&(PF.getCoeffField())), rowDim(m), colDim(n), pdata(p)
{
shape.shape(BlackboxSpecifier::TOEPLITZ);
if( n == 0 ) this->colDim = rowDim;
if( rowDim >= this->colDim ) sysDim = rowDim;
else sysDim = this->colDim;
- assert( P.deg(p) <= rowDim + this->colDim - 2 );
+ linbox_check( P.deg(p) <= rowDim + this->colDim - 2 );
P.rev(rpdata, pdata);
// Account for possible trailing zeroes
if( P.deg(pdata) < rowDim + this->colDim - 2 ) {
Poly x;
- P.init(x,0);
- Element one;
- K.init(one,1);
- P.setCoeff(x, (rowDim + this->colDim - 2 - P.deg(pdata)), one);
+ P.assign(x,P.zero);
+ P.setCoeff(x, (rowDim + this->colDim - 2 - P.deg(pdata)), field().one);
P.mulin( rpdata, x );
}
@@ -138,15 +134,15 @@ namespace LinBox
/*-----------------------------------------------------------------
*----- Constructor With User-Supplied First Row And Column
*----------------------------------------------------------------*/
- template <class _PField>
- void Toeplitz<typename _PField::CoeffField, _PField>::init_vector( const std::vector<Element>&v)
+ template <class _PRing>
+ void Toeplitz<typename _PRing::CoeffField, _PRing>::init_vector( const std::vector<Element>&v)
{
if ( (1 & v.size()) == 0)
{
std::cout << "There must be an ODD number of entries in the input vector " <<
"The length given is " << v.size();
}
- assert( (1 & v.size()) == 1);
+ linbox_check( (1 & v.size()) == 1);
this->P.init(this->pdata, v);
this->P.rev(this->rpdata, this->pdata);
@@ -154,10 +150,8 @@ namespace LinBox
// Account for possible trailing zeroes
if( this->P.deg(this->pdata) < v.size() - 1 ) {
Poly x;
- this->P.init(x,0);
- Element one;
- this->K.init(one,1);
- this->P.setCoeff(x, (v.size() - 1 - this->P.deg(this->pdata)), one);
+ this->P.assign(x,this->P.zero);
+ this->P.setCoeff(x, (v.size() - 1 - this->P.deg(this->pdata)), this->field().one);
this->P.mulin( this->rpdata, x );
}
@@ -167,7 +161,7 @@ namespace LinBox
#ifdef DBGMSGS
std::cout << "Toeplitz::Toeplitz(F,V):\tCreated a " << rowDim << "x"<< this->colDim<<
- " Toeplitz matrix "<< std::endl;
+ " Toeplitz matrix "<< std::endl;
#endif
}//----- Constructor given a vector---- [Tested 6/14/02 -- Works]
@@ -177,44 +171,45 @@ namespace LinBox
/*-----------------------------------------------------------------
*----- Print The Matrix To Screen
*----------------------------------------------------------------*/
- template <class _PField>
- void Toeplitz<typename _PField::CoeffField,_PField>::print(std::ostream& os) const
+ template <class _PRing>
+ std::ostream & Toeplitz<typename _PRing::CoeffField,_PRing>::write(std::ostream& os) const
{
- register int i, N;
- register unsigned int j;
+ int N;
Element temp;
- os<< this->rowDim << " " << this->colDim << " " << this->shape.shape() << std::endl;
- N = (int) (this->rowDim + this->colDim) -1;
+ os<< this->rowdim() << " " << this->coldim() << " " << this->shape.shape() << std::endl;
+ N = (int) (this->rowdim() + this->coldim()) -1;
if ( N < 20 ) // Print small matrices in dense format
{
- for (i = (int)this->colDim-1; i < N; i++)
+ int i;
+ unsigned int j;
+ for (i = (int)this->coldim()-1; i < N; i++)
{
- for ( j = 0; j < this->colDim ; j++)
+ for ( j = 0; j < this->coldim() ; j++)
os << " " ;
- this->K.write(os,this->P.getCoeff(temp,this->pdata,static_cast<size_t>(i-j))) ;
+ this->field().write(os,this->P.getCoeff(temp,this->pdata,static_cast<size_t>((unsigned int)i-j))) ;
os << std::endl;
}
}
else
{ // Print large matrices' first row and col
os << "[";
- for (size_t ii = this->rowDim + this->colDim - 2; ii> 0;ii--)
- this->K.write(os, this->P.getCoeff(temp,this->pdata,ii) ) << " ";
- this->K.write(os,this->P.getCoeff(temp,this->pdata,0)) << "]\n";
+ for (size_t ii = this->rowdim() + this->coldim() - 2; ii> 0;ii--)
+ this->field().write(os, this->P.getCoeff(temp,this->pdata,ii) ) << " ";
+ this->field().write(os,this->P.getCoeff(temp,this->pdata,0)) << "]\n";
this->P.write(os, this->pdata) << std::endl;
} //[v(2n-2),....,v(0)]; where v(0) is the top right entry of the matrix
- return;
- } //---- print()----- [Tested 6/14/02 -- Works]
+ return os;
+ } //---- write()----- [Tested 6/14/02 -- Works]
+#if 0
// /*-----------------------------------------------------------------
// *---- The infamous clone has been created here
// *----------------------------------------------------------------*/
-#if 0
template <class Field, class Vector>
BlackboxArchetype<Vector>* Toeplitz<Field, Vector>::clone() const
{
@@ -225,50 +220,49 @@ namespace LinBox
/*-----------------------------------------------------------------
*---- Save To File, Given Destination Filename
*----------------------------------------------------------------*/
- template <class _PField>
- void Toeplitz<typename _PField::CoeffField, _PField>::print( char *outFileName) const
+ template <class _PRing>
+ void Toeplitz<typename _PRing::CoeffField, _PRing>::write( char *outFileName) const
{
Element temp;
std::cout << "Printing toeplitz matrix to " << outFileName << std::endl;
if ( outFileName == NULL )
- print(); // Print to stdout if no file is specified
+ write(); // Print to stdout if no file is specified
else
{
std::ofstream o_fp(outFileName, std::ios::out);
- o_fp << this->rowDim << " " << this->colDim << " " << this->shape.shape() << std::endl ;
+ o_fp << this->rowdim() << " " << this->coldim() << " " << this->shape.shape() << std::endl ;
o_fp << "[";
- for (size_t i = this->rowDim + this->colDim - 1 ; i-- ; )
- this->K.write(o_fp,this->P.getCoeff(temp,this->pdata,i))
+ for (size_t i = this->rowdim() + this->coldim() - 1 ; i-- ; )
+ this->field().write(o_fp,this->P.getCoeff(temp,this->pdata,i))
<< " ";
o_fp << "]\n";
o_fp.close();
}
return;
- } // print(char *) [Tested 6/14/02 -- Works]
+ } // write(char *) [Tested 6/14/02 -- Works]
+#if 0 //dated material with no known use -bds 2012Jul
/*-----------------------------------------------------------------
* Make the matrix upper triangular with determinant 1.
* i.e. clear the last N-1 elements in the data vector
*----------------------------------------------------------------*/
- template <class _CField, class _PField>
- void ToeplitzBase<_CField, _PField>::setToUniModUT()
+ template <class _CField, class _PRing>
+ void ToeplitzBase<_CField, _PRing>::setToUniModUT()
{
- typename PField::Coeff zero, one;
- P.getCoeffField().init(zero,0);
- P.getCoeffField().init(one,1);
+ const PRing & PF = P.getCoeffField() ;
- for( size_t i = sysDim; i <= P.deg(pdata); ++i )
- P.setCoeff(pdata,i,zero);
+ for( size_t i = sysdim(); i <= P.deg(pdata); ++i )
+ P.setCoeff(pdata,i,PF.zero);
for( size_t i = 0; i < sysDim - 1; ++i )
- P.setCoeff(rpdata,i,zero);
+ P.setCoeff(rpdata,i,PF.zero);
- P.setCoeff(pdata,sysDim-1,one);
- P.setCoeff(rpdata,sysDim-1,one);
+ P.setCoeff(pdata,sysDim-1,PF.one);
+ P.setCoeff(rpdata,sysDim-1,PF.one);
shape.shape(BlackboxSpecifier::UNIMOD_UT);
return;
@@ -280,57 +274,69 @@ namespace LinBox
* Make matrix a unimodular Lower Triangular with det 1
* i.e. clear the first N-1 elements in the data vector
*----------------------------------------------------------------*/
- template <class _CField, class _PField>
- void ToeplitzBase<_CField, _PField>::setToUniModLT()
+ template <class _CField, class _PRing>
+ void ToeplitzBase<_CField, _PRing>::setToUniModLT()
{
- typename PField::Coeff zero, one;
- P.getCoeffField().init(zero,0);
- P.getCoeffField().init(one,1);
+ const PRing & PF = P.getCoeffField() ;
for( size_t i = sysDim; i <= P.deg(rpdata); ++i )
- P.setCoeff(rpdata,i,zero);
+ P.setCoeff(rpdata,i,PF.zero);
for( size_t i = 0; i < sysDim - 1; ++i )
- P.setCoeff(pdata,i,zero);
+ P.setCoeff(pdata,i,PF.zero);
- P.setCoeff(pdata,sysDim-1,one);
- P.setCoeff(rpdata,sysDim-1,one);
+ P.setCoeff(pdata,sysDim-1,PF.one);
+ P.setCoeff(rpdata,sysDim-1,PF.one);
shape.shape(BlackboxSpecifier::UNIMOD_LT);
return;
}// [UNCOMMENTED PART Tested 6/14/02 -- Works]
+#endif
/*-----------------------------------------------------------------
* Compute the determinant of the matrix
*-----------------------------------------------------------------*/
- template<class _PField>
- typename Toeplitz<typename _PField::CoeffField,_PField>::Element&
- Toeplitz<typename _PField::CoeffField,_PField>::det
+ template<class _PRing>
+ typename Toeplitz<typename _PRing::CoeffField,_PRing>::Element&
+ Toeplitz<typename _PRing::CoeffField,_PRing>::det
( Element& res ) const
{
return toeplitz_determinant( this->P, res, this->pdata, this->sysDim );
}
+ /*-----------------------------------------------------------------
+ * Compute the trace of the matrix
+ *-----------------------------------------------------------------*/
+ /*-----------------------------------------------------------------
+ * Compute the trace of the matrix
+ *-----------------------------------------------------------------*/
+ /*-----------------------------------------------------------------
+ * Compute the trace of the matrix
+ *-----------------------------------------------------------------*/
+ template<class _PRing>
+ typename Toeplitz<typename _PRing::CoeffField,_PRing>::Element&
+ Toeplitz<typename _PRing::CoeffField,_PRing>::trace
+ ( Element& res ) const
+ {
+ Element x; this->field().init(x, min(rowdim(), coldim()));
+ this->P.getCoeff(res, pdata, rowdim()-1);
+ return this->field().mulin(res, x);
+ }
+
/*-----------------------------------------------------------------
* Apply the matrix to a vector
*----------------------------------------------------------------*/
- template <class _PField>
+ template <class _PRing>
template <class OutVector, class InVector>
- OutVector& Toeplitz<typename _PField::CoeffField,_PField>::apply( OutVector &v_out,
- const InVector& v_in) const
+ OutVector& Toeplitz<typename _PRing::CoeffField,_PRing>::apply( OutVector &v_out,
+ const InVector& v_in) const
{
- if (v_out.size() != this->rowdim())
- std::cout << "\tToeplitz::apply()\t output vector not correct size, at "
- << v_out.size() << ". System rowdim is" << this->rowdim() << std::endl;
- if ( v_in.size() != this->coldim() )
- std::cout << "\tToeplitz::apply()\t input vector not correct size at "
- << v_in.size() << ". System colDim is" << this->coldim() << std::endl;
- assert((v_out.size() == this->rowdim()) &&
- (v_in.size() == this->coldim())) ;
+ linbox_check((v_out.size() == this->rowdim()) &&
+ (v_in.size() == this->coldim())) ;
Poly pOut, pIn;
this->P.init( pIn, v_in );
@@ -360,10 +366,10 @@ namespace LinBox
/*-----------------------------------------------------------------
* Apply the transposed matrix to a vector
*----------------------------------------------------------------*/
- template <class _PField>
+ template <class _PRing>
template<class OutVector, class InVector>
- OutVector& Toeplitz<typename _PField::CoeffField,_PField>::applyTranspose( OutVector &v_out,
- const InVector& v_in) const
+ OutVector& Toeplitz<typename _PRing::CoeffField,_PRing>::applyTranspose( OutVector &v_out,
+ const InVector& v_in) const
{
if (v_out.size() != this->coldim())
@@ -372,8 +378,8 @@ namespace LinBox
if ( v_in.size() != this->rowdim() )
std::cout << "\tToeplitz::apply()\t input vector not correct size at "
<< v_in.size() << ". System colDim is" << this->rowdim() << std::endl;
- assert((v_out.size() == this->coldim()) &&
- (v_in.size() == this->rowdim())) ;
+ linbox_check((v_out.size() == this->coldim()) &&
+ (v_in.size() == this->rowdim())) ;
Poly pOut, pIn;
this->P.init( pIn, v_in );
@@ -401,11 +407,10 @@ namespace LinBox
#endif //__LINBOX_bb_toeplitz_INL
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
// Local Variables:
// mode: C++
// tab-width: 8
// indent-tabs-mode: nil
// c-basic-offset: 8
// End:
-
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/blackbox/transpose.h b/linbox/blackbox/transpose.h
index 4c4fb8c..8433de1 100644
--- a/linbox/blackbox/transpose.h
+++ b/linbox/blackbox/transpose.h
@@ -26,6 +26,7 @@
#ifndef __LINBOX_transpose_H
#define __LINBOX_transpose_H
+#include "linbox/util/error.h"
#include "linbox/blackbox/blackbox-interface.h"
namespace LinBox
@@ -50,6 +51,7 @@ namespace LinBox
\ingroup blackbox
* @param Vector \ref LinBox dense or sparse vector of field elements
+ * @bug no write here. test-blackbox.h requires it
*/
template <class Blackbox>
class Transpose : public BlackboxInterface {
@@ -66,6 +68,10 @@ namespace LinBox
* matrix A
* @param A pointer to black box matrix.
*/
+ Transpose (Blackbox& A) :
+ _A_ptr(&A)
+ {}
+
Transpose (const Blackbox& A) :
_A_ptr(&A)
{}
@@ -163,7 +169,26 @@ namespace LinBox
// accessors to the blackboxes
const Blackbox* getPtr() const {return _A_ptr;}
- private:
+
+ Element& getEntry(Element& x, size_t i, size_t j) const
+ {
+ return _A_ptr->getEntry(x, j, i);
+ }
+
+ void setEntry(size_t i, size_t j, const Element& x)
+ {
+ const_cast<Blackbox_t*>(_A_ptr)->setEntry( j, i, x);
+ }
+
+ std::ostream &write(std::ostream & os) const {
+ return _A_ptr->write(os << "transpose of:");
+ }
+ std::istream &read(std::istream & is) {
+ throw LinboxError("you don't want to call read here");
+ return is;
+ }
+
+ protected:
// Pointers to the matrix
const Blackbox *_A_ptr;
diff --git a/linbox/blackbox/triangular-fibb.h b/linbox/blackbox/triangular-fibb.h
new file mode 100644
index 0000000..328ded6
--- /dev/null
+++ b/linbox/blackbox/triangular-fibb.h
@@ -0,0 +1,322 @@
+/* linbox/blackbox/triangular-fibb.h
+ * bds
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ * ========LICENCE========
+ */
+
+#ifndef __LINBOX_triangular_fibb_H
+#define __LINBOX_triangular_fibb_H
+
+#include <utility>
+#include <algorithm>
+
+#include "linbox/linbox-config.h"
+#include "linbox/linbox-tags.h"
+#include "linbox/matrix/dense-matrix.h"
+#include "linbox/matrix/matrix-domain.h"
+#include "linbox/randiter/mersenne-twister.h"
+#include "linbox/blackbox/fibb.h"
+
+namespace LinBox
+{
+
+ /** \brief
+
+ \ingroup blackbox
+ */
+ template<class Field_>
+ struct TriangularFIBB : public FIBB<Field_>
+ {
+ typedef Field_ Field;
+ protected:
+ typedef TriangularBlasMatrix<Field> Rep_t;
+ Rep_t * rep_;
+ const Field* field_;
+ public:
+ typedef TriangularFIBB<Field> Self_t;
+ typedef typename Field::Element Element;
+ typedef DenseMatrix<Field> Matrix;
+
+ Self_t& init(Rep_t& T) const
+ { rep_ = &T; field_ = &(T.field()); return *this; }
+
+ TriangularFIBB(const Field& F): field_(&F) {}
+ /// Constructor from a TriangularBlasMatrix
+ TriangularFIBB(Rep_t& T): rep_(&T), field_(&T.field()) {}
+
+ void random() { rep_->random(); }
+ /*
+ void random(size_t n)
+ {
+ size_t n = rowdim();
+ rep_->identity((int)n);
+ MersenneTwister r((unsigned int)time(NULL));
+ // Knuth construction
+ for (size_t i = 0; i < n-1; ++i) {
+ size_t j = i + r.randomInt()%(n-i);
+ std::swap(rep_->_indices[i], rep_->_indices[j]);
+ }
+ }
+ */
+
+
+ /* Copy constructor.
+ * Creates new black box objects in dynamic memory.
+ * @param M constant reference to compose black box matrix
+ */
+ TriangularFIBB (const TriangularFIBB &Mat) :
+ rep_(Mat.rep_)
+ {}
+
+ // Destructor
+ ~TriangularFIBB (void) {}
+
+ Matrix& applyRight(Matrix& B, const Matrix& A) const
+ { return applyMatrix(B, A, FFLAS::FflasLeft); }
+
+ Matrix& applyLeft(Matrix& B, const Matrix& A) const
+ { return applyMatrix(B, A, FFLAS::FflasRight); }
+
+ Matrix& applyMatrix(Matrix& B, const Matrix& A, const FFLAS::FFLAS_SIDE side) const {
+ B.copy(A);
+ FFLAS::ftrmm<Field> (field(),
+ side,
+ FFLAS::FFLAS_UPLO(rep_->getUpLo()), //const FFLAS_UPLO Uplo,
+ FFLAS::FflasNoTrans, //const FFLAS_TRANSPOSE TransA,
+ FFLAS::FFLAS_DIAG(rep_->getDiag()), //const FFLAS_DIAG Diag,
+ B.rowdim(), //const size_t M,
+ B.coldim(), //const size_t N,
+ field().one, //const typename Field::Element alpha,
+ rep_->getPointer(), //typename Field::Element_ptr A,
+ rep_->getStride(), //const size_t lda,
+ B.getPointer(), //typename Field::Element_ptr B,
+ B.getStride() //const size_t ldb)
+ );
+ return B;
+ }
+
+#if 0
+ // will want better base case
+ Matrix& applyRight(Matrix& Y, const Matrix& X) const
+ {
+ Element x; field().init(x);
+ if (rowdim() == 1) ...//TODO == quit here
+ for (size_t i = 0; i < Y.rowdim(); ++i){
+ size_t k = rep_->_indices[i];
+ for (size_t j = 0; j < Y.coldim(); ++j)
+ Y.setEntry(i,j, X.getEntry(x, k, j));
+ }
+ /* desired form
+ for (size_t i = 0; i < rowdim(); ++i)
+ {
+ Matrix Yrow(Y, i, 0, 1, Y.coldim());
+ Matrix Xrow(X, rep_->_indices[i], 0, 1, X.coldim());
+ Yrow.copy(Xrow); // right kind of copy?
+ }
+ */
+ return Y;
+ }
+ Matrix& applyLeft(Matrix& Y, const Matrix& X) const
+ {
+ Element x; field().init(x);
+ for (size_t i = 0; i < Y.coldim(); ++i){
+ size_t k = rep_->_indices[i];
+ for (size_t j = 0; j < Y.rowdim(); ++j)
+ Y.setEntry(j,k, X.getEntry(x, j, i));
+ }
+ /* desired form
+ for (size_t i = 0; i < coldim(); ++i)
+ {
+ Matrix Ycol(Y, 0, rep_->_indices[i], Y.rowdim(), 1);
+ Matrix Xcol(X, 0, i, X.rowdim(), 1);
+ Ycol.copy(Xcol);
+ */
+ return Y;
+ }
+#endif
+ /* FIBB functions */
+
+ BBType bbTag() const { return triangular; }
+
+ size_t& rank(size_t& r) const
+ { size_t m = rowdim(), n = coldim();
+ size_t k = m < n ? m : n;
+ if (rep_->getDiag() == Tag::Diag::Unit) {
+ r = k;
+ } else {
+ // assume trapezoid for now, later fix to allow echelon
+ Element x;
+ r = 0;
+ while (r < k and not field().isZero(rep_->getEntry(x,r,r)))
+ ++r;
+ }
+ return r;
+ }
+
+ Element& det(Element& d) const
+ { size_t m = rowdim(), n = coldim();
+ if (m != n) {
+ field().assign(d,field().zero);
+ } else if (rep_->getDiag() == Tag::Diag::Unit) {
+ field().assign(d,field().one);
+ } else {
+ Element x;
+ field().assign(d, field().one);
+ for (size_t i = 0; i < m; ++i)
+ field().mulin(d,rep_->getEntry(x,i,i));
+ }
+ return d;
+ }
+
+ Matrix& solveRight(Matrix& B, const Matrix& A) const
+ { return solveMatrix(B, A, Tag::Side::Left); }
+
+ Matrix& solveLeft(Matrix& B, const Matrix& A) const
+ { return solveMatrix(B, A, Tag::Side::Right); }
+
+ Matrix& solveMatrix(Matrix& B, const Matrix& A, const Tag::Side side) const
+ {
+ B.copy(A);
+ FFLAS::ftrsm<Field> (field(), FFLAS::FFLAS_SIDE(side),
+ FFLAS::FFLAS_UPLO(rep_->getUpLo()), //const FFLAS_UPLO Uplo,
+ FFLAS::FflasNoTrans, //const FFLAS_TRANSPOSE TransA,
+ FFLAS::FFLAS_DIAG(rep_->getDiag()), //const FFLAS_DIAG Diag,
+ B.rowdim(), //const size_t M,
+ B.coldim(), //const size_t N,
+ field().one, //const typename Field::Element alpha,
+ rep_->getPointer(), //typename Field::Element_ptr A,
+ rep_->getStride(), //const size_t lda,
+ B.getPointer(), //typename Field::Element_ptr B,
+ B.getStride() //const size_t ldb)
+ );
+ return B;
+ }
+
+#if 0
+ Matrix& solveRight(Matrix& Y, const Matrix& X) const
+ { Element x; field().init(x);
+ for (size_t i = 0; i < Y.rowdim(); ++i){
+ size_t k = rep_->_indices[i];
+ for (size_t j = 0; j < Y.coldim(); ++j)
+ Y.setEntry(k,j, X.getEntry(x, i, j));
+ }
+ /* desired form
+ for (size_t i = 0; i < rowdim(); ++i)
+ {
+ Matrix Yrow(Y, rep_->_indices[i], 0, 1, Y.coldim());
+ Matrix Xrow(X, i, 0, 1, X.coldim());
+ Yrow.copy(Xrow);
+ }
+ */
+ return Y;
+ }
+ Matrix& solveLeft(Matrix& Y, const Matrix& X) const
+ { Element x; field().init(x);
+ for (size_t i = 0; i < Y.coldim(); ++i){
+ size_t k = rep_->_indices[i];
+ for (size_t j = 0; j < Y.rowdim(); ++j)
+ Y.setEntry(j,i, X.getEntry(x, j, k));
+ }
+ /* desired form
+ for (size_t i = 0; i < coldim(); ++i)
+ {
+ Matrix Ycol(Y, 0, i, Y.rowdim(), 1);
+ Matrix Xcol(X, 0, rep_->_indices[i], X.rowdim(), 1);
+ Ycol.copy(Xcol);
+ }
+ */
+ return Y;
+ }
+#endif
+ Matrix& nullspaceRandomRight(Matrix& N) const
+ { N.zero(); return N; }
+ Matrix& nullspaceRandomLeft(Matrix& N) const
+ { N.zero(); return N; }
+ BlasMatrix<Field>& nullspaceBasisRight(BlasMatrix<Field>& N) const
+ { N.resize(rowdim(), 0); return N; }
+ BlasMatrix<Field>& nullspaceBasisLeft(BlasMatrix<Field>& N) const
+ { N.resize(0, coldim()); return N; }
+ /* end FIBB section */
+
+ template<typename _Tp1>
+ struct rebind {
+ typedef TriangularFIBB<_Tp1> other;
+ void operator() (other & Ap, const Self_t& A, const _Tp1& F) {
+ Ap->setStorage( A.getStorage() );
+ }
+ };
+
+
+
+ /* Retreive row dimensions of BlackBox matrix.
+ * This may be needed for applying preconditioners.
+ * Required by abstract base class.
+ * @return integer number of rows of black box matrix.
+ */
+ /// rowdim
+ size_t rowdim (void) const
+ {
+ return rep_->rowdim();
+ }
+
+ /* Retreive column dimensions of BlackBox matrix.
+ * Required by abstract base class.
+ * @return integer number of columns of black box matrix.
+ */
+ /// coldim
+ size_t coldim (void) const
+ {
+ return rep_->coldim();
+ }
+
+ const Field& field() const { return rep_->field(); }
+ const Field& ring() const { return rep_->field(); }
+
+ //!@bug needs a MM version
+ std::ostream &write(std::ostream &os) const
+ { return rep_->write(os, Tag::FileFormat::Plain); }
+
+ std::ostream &write(std::ostream &os, LINBOX_enum(Tag::FileFormat) format) const
+ { return rep_->write(os, format); }
+
+ //!@bug there is no read here. (needed by test-blackbox.h)
+ std::istream &read(std::istream &is)
+ { return is; }
+ std::istream &read(std::istream &is) const
+ { return is; }
+ std::istream &read(std::istream &is, LINBOX_enum(Tag::FileFormat) format) const
+ {
+ throw NotImplementedYet();
+ return is ;
+ }
+
+}; // template <Vector> class TriangularFIBB
+
+
+} // namespace LinBox
+
+#endif // __LINBOX_triangular_fibb_H
+
+
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/blackbox/triplesbb.h b/linbox/blackbox/triplesbb.h
deleted file mode 100644
index 973b4f5..0000000
--- a/linbox/blackbox/triplesbb.h
+++ /dev/null
@@ -1,348 +0,0 @@
-/* linbox/blackbox/triplesbb.h
- * Copyright (c) Linbox
- * ========LICENCE========
- * This file is part of the library LinBox.
- *
- * LinBox is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- * ========LICENCE========
-
- * Written by Rich Seagraves <seagrave at cis.udel.edu>
- * with mods by bds
- */
-
-/** @file blackbox/triplesbb.h
- * @ingroup blackbox
- * @brief NO DOC
- */
-
-#ifndef __LINBOX_triplesbb_H
-#define __LINBOX_triplesbb_H
-
-#include <algorithm>
-using std::max;
-#include "linbox/linbox-config.h"
-#include "linbox/util/debug.h"
-#include "linbox/util/field-axpy.h"
-#include "linbox/blackbox/blackbox-interface.h"
-#include "linbox/field/hom.h"
-
-#include <vector>
-
-namespace LinBox
-{
-
- /** \brief wrapper for NAG Sparse Matrix format.
- *
- \ingroup blackbox
- * This class acts as a wrapper for a pre-existing NAGSparse Matrix.
- * To be used for interface between LinBox and computer algebra systems such
- * as Maple that can encode sparse matrices in the NAGSparse format
- */
- template<class _Field>
- class TriplesBB : public BlackboxInterface{
-
- public:
- typedef _Field Field;
- typedef typename Field::Element Element;
- typedef TriplesBB<Field> Self_t;
-
-
- // Default constructor.
- TriplesBB() {}
-
- // Takes 3 vectors and copies(bad) them.
- TriplesBB( Field F,
- std::vector<Element> values,
- std::vector<size_t> rowP,
- std::vector<size_t> colP,
- size_t rows,
- size_t cols,
- bool RowSortFlag = false,
- bool ColSortFlag = false);
-
- // Alternate constructor. Allows for use of addEntry operation.
- TriplesBB(Field F, size_t rows, size_t cols, size_t reserve = 0);
-
- ~TriplesBB() {};
-
- // Copy Constructor
- TriplesBB(const TriplesBB<Field> &);
-
- // Assignment operator for use in STL map
- const TriplesBB<Field> & operator=(const TriplesBB<Field> & );
-
- template<class OutVector, class InVector>
- OutVector & apply(OutVector &, const InVector &) const; // y = Ax;
-
- template<class OutVector, class InVector>
- OutVector & applyTranspose(OutVector &, const InVector &) const; // y = ATx
- size_t rowdim() const { return _rows; }
-
- size_t coldim() const { return _cols; }
-
- template<typename _Tp1>
- struct rebind {
- typedef TriplesBB<_Tp1> other;
- void operator() (other & Ap, const Self_t& A, const _Tp1& F)
- {
- Hom <typename Self_t::Field, _Tp1> hom( A.field(), F);
-
- typedef typename _Tp1::Element otherElt;
- typedef typename std::vector<otherElt> othervec;
- typedef typename std::vector<Element> selfvec;
- typedef typename othervec::iterator otheriter;
- typedef typename selfvec::const_iterator selfiter;
- otheriter vp_p; selfiter v_p;
-
- Ap._values.resize(A._values.size());
- for (v_p = A._values.begin(), vp_p = Ap._values.begin();
- v_p != A._values.end(); ++ v_p, ++ vp_p)
- hom.image (*vp_p, *v_p);
- }
- };
-
- template<typename _Tp1>
- TriplesBB(const TriplesBB<_Tp1>& T, const Field& F) :
- _field(F), _values(T.size()), _RowV(T.getRows()), _ColV(T.getCols()), _rows(T.rowdim()), _cols(T.coldim()), _faxpy(max(T.getRows(),T.getCols()), FieldAXPY<Field>(F)), _RowSortFlag(T.isRowSorted()), _ColSortFlag(T.isColSorted())
- {}
-
-
-
- /* Returns number of non-zero entries */
- size_t size() const { return _values.size(); }
-
- // Add entry function, element e is added in the i,j position. Zero based?
- void addEntry(const Element & e, const size_t i, const size_t j);
-
- const Field & field() const { return _field; }
-
- /* Data accessors. Used to access the 3 vectors containing Matrix data
- */
- const std::vector<Element> & getData() const { return _values; }
- const std::vector<size_t> & getRows() const { return _RowV; }
- const std::vector<size_t> & getCols() const { return _ColV; }
- bool isRowSorted() { return _RowSortFlag; }
- bool isColSorted() { return _ColSortFlag; }
-
-
- protected:
- Field _field; // The field used by this class
-
- /// _values contains the nonzero elements of the BlackBox
- std::vector<Element> _values;
-
- /// _RowV & _ColV are vectors containing the row & column indices
- std::vector<size_t> _RowV, _ColV;
-
- /// The number of rows, columns
- size_t _rows, _cols;
-
- /* _apply is the generic apply utility funtion called by apply() and
- * applyTranspose(). Walks through the non-zero elements of the Matrix and
- * performs the proper calculation using a vector of FieldAxpy's
- */
- template<class OutVector, class InVector>
- void _apply(OutVector &, const InVector &, std::vector<size_t>::const_iterator, std::vector<size_t>::const_iterator) const;
-
- /* STL vector of FieldAXPY objects. Supports delayed modding out, a feature
- * which contributes a significant speed boost when performing apply &
- * applyTranspose calculations over a field of multi-precision integers
- */
-
- mutable std::vector<FieldAXPY<Field> > _faxpy;
-
- /* Sort flag. Used by the sort function to determine whether a sort
- * operation is needed. Also used by _apply for a slightly optimized
- * apply operation. Note, "sorted" is considered sorted if the
- * matrix is row-sorted, IE if the entries go row 1, row 1, row 1, row 2, row 2, etc
- */
- bool _RowSortFlag, _ColSortFlag;
-
-
- };
-
- /* Constructor for the TriplesBB class. This is the constructor that is
- * expected to be used. To use it, you must pass in a field element that
- * will work over the data (F), pointers to the 3 arrays used by the NAGSparse
- * format (values, rowP, colP), the number of rows and columns (rows and
- * cols), the number of non-zero elements (NNz) and the ordering, which
- * defaults to 0 (no ordering implied).
- */
- template<class Field>
- TriplesBB<Field>::TriplesBB(Field F,
- std::vector<Element> values,
- std::vector<size_t> RowV,
- std::vector<size_t> ColV,
- size_t rows,
- size_t cols,
- bool RowSortFlag,
- bool ColSortFlag) :
- _field(F), _values(values), _RowV(RowV), _ColV(ColV), _rows(rows), _cols(cols), _faxpy(max(rows,cols), FieldAXPY<Field>(F)), _RowSortFlag(RowSortFlag), _ColSortFlag(ColSortFlag)
- {}
-
- /* Better constructor that only takes the field, m, n and recommended
- * reserve (optional arguement) for use with STL vector reserve option
- * (reduce the number of memory management moves). Meant to be used in
- * conjuction with the addEntry() method
- */
- template<class Field>
- TriplesBB<Field>::TriplesBB( Field F, size_t rows, size_t cols, size_t res):
- _field(F), _rows(rows), _cols(cols), _faxpy( max(rows, cols), FieldAXPY<Field>(F)), _RowSortFlag(false), _ColSortFlag(false)
- {
- if(res != 0) {
- _values.reserve(res);
- _RowV.reserve(res);
- _ColV.reserve(res);
- }
- }
-
-
-
- template<class Field>
- TriplesBB<Field>::TriplesBB(const TriplesBB<Field> &In) :
- _faxpy( max(In._rows, In._cols), FieldAXPY<Field>(In._field)),
- _field ( In._field ),
- _values ( In._values ),
- _RowV ( In._RowV ),
- _ColV ( In._ColV ),
- _rows ( In._rows ),
- _cols ( In._cols ),
- _RowSortFlag ( In._RowSortFlag ),
- _ColSortFlag ( In._ColSortFlag )
- { }
-
-
- template<class Field>
- const TriplesBB<Field> & TriplesBB<Field>::operator=(const TriplesBB<Field> & rhs)
- {
- _field = rhs._field;
- _values = rhs._values;
- _RowV = rhs._RowV;
- _ColV = rhs._ColV;
- _rows = rhs._rows; _cols = rhs._cols;
- _RowSortFlag = rhs._RowSortFlag;
- _ColSortFlag = rhs._ColSortFlag;
-
- _faxpy.resize(rhs._faxpy.size(), FieldAXPY<Field>(_field));
-
- return *this;
- }
-
-
- template<class Field>
- template<class OutVector, class InVector>
- OutVector & TriplesBB<Field>::apply(OutVector & y, const InVector & x) const
- {
-
- _apply( y, x, _RowV.begin(), _ColV.begin() );
- return y;
- }
-
- /* BlackBoxArchetype applyTranspose function. Performs the y = ATx, where
- * y and x are vectors passed in applyTranspose(y,x), and A is the present
- * Matrix. Returns a reference to y. As this is a tranpose calculation,
- * the indexing is reversed, so y is indexed by the columns, while x is indexed
- * by the rows. Thus, as in apply above, takes advantage of this fact by
- * switching on the ordering.
- */
- template<class Field>
- template<class OutVector, class InVector>
- OutVector & TriplesBB<Field>::applyTranspose(OutVector & y, const InVector & x) const
- {
- _apply( y, x, _ColV.begin(), _RowV.begin() );
- return y;
- }
-
-
- template<class Field>
- template<class OutVector, class InVector>
- void TriplesBB<Field>::_apply(OutVector & y, const InVector & x, std::vector<size_t>::const_iterator i, std::vector<size_t>::const_iterator j) const
- {
- typename OutVector::iterator yp;
- typename InVector::const_iterator xp;
- typename Field::Element zero;
- typename std::vector<Element>::const_iterator v;
- typename std::vector<FieldAXPY<Field> >::iterator fa_i;
-
- _field.init(zero,0);
-
- for(fa_i = _faxpy.begin(); fa_i != _faxpy.end(); ++fa_i)
- fa_i->assign(zero);
-
- for( v = _values.begin(), fa_i = _faxpy.begin() - 1, xp = x.begin() - 1; v != _values.end(); ++i, ++j, ++v)
- (fa_i + *i)->mulacc(*v, *(xp + *j));
-
-
-
- for(fa_i = _faxpy.begin(), yp = y.begin(); yp != y.end(); ++yp, ++fa_i)
- fa_i->get(*yp);
-
-
-
- }
-
-
- /* addEntry method. Allows user to add entries on the fly. Meant to be used
- * with the "copyless" constructor above. Note, will automatically set the
- * _sortFlag to false, as you can't be sure the entries are still sorted afterwards
- */
- template<class Field>
- void TriplesBB<Field>::addEntry(const Element &Elem, const size_t i, const size_t j)
- {
- _RowSortFlag = _ColSortFlag = false;
- _values.push_back(Elem);
- _RowV.push_back(i);
- _ColV.push_back(j);
- }
-
-#if 0
- template<class Field, class Vector>
- void TriplesBB<Field, Vector>::SortByRow()
- {
- RowWiseLessThan<Field,Vector> rwlt;
- if(_RowSortFlag) return; // If already sorted, bail
-
- std::sort( IndexedBegin(), IndexedEnd(), rwlt );
- _RowSortFlag = true; // Sets the row sort flag
- _ColSortFlag = false; // Unset the col sort flag
-
- }
-
- template<class Field, class Vector>
- void TriplesBB<Field, Vector>::SortByCol()
- {
-
- ColWiseLessThan<Field,Vector> cwlt;
- if(_ColSortFlag) return; // If already sorted, bail
-
- std::sort( IndexedBegin(), IndexedEnd(), cwlt );
- _ColSortFlag = true; // Sets the Col sort flag
- _RowSortFlag = false; // Unset the Row sort flag
- }
-#endif
-
-} // namespace LinBox
-
-#endif // __LINBOX_triplesbb_H
-
-
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
-// Local Variables:
-// mode: C++
-// tab-width: 8
-// indent-tabs-mode: nil
-// c-basic-offset: 8
-// End:
-
diff --git a/linbox/blackbox/zero-one.h b/linbox/blackbox/zero-one.h
index a1734a3..83294e7 100644
--- a/linbox/blackbox/zero-one.h
+++ b/linbox/blackbox/zero-one.h
@@ -35,7 +35,7 @@
#include "linbox/integer.h"
#include "linbox/vector/vector-traits.h"
#include "linbox/util/debug.h"
-#include "linbox/field/modular.h"
+#include "linbox/ring/modular.h"
#include "linbox/blackbox/blackbox-interface.h"
// For STL pair in IndexIterator
@@ -72,7 +72,7 @@ namespace LinBox
// Default constructor, do nothing.
ZeroOne(const Field& F);
// The real constructor /todo give docs here
- ZeroOne(Field F, Index* rowP, Index* colP, Index rows, Index cols, Index NNz, bool rowSort = false, bool colSort = false);
+ ZeroOne(Field &F, Index* rowP, Index* colP, Index rows, Index cols, Index NNz, bool rowSort = false, bool colSort = false);
// Destructor, once again do nothing
~ZeroOne();
@@ -86,7 +86,7 @@ namespace LinBox
template<class OutVector, class InVector>
OutVector& apply(OutVector& y, const InVector& x) const // y = Ax;
{
- return applySpecialization(y,x,getType(_field));
+ return applySpecialization(y,x,getType(field()));
}
/** applyTranspose.
@@ -100,7 +100,7 @@ namespace LinBox
template<class OutVector, class InVector>
OutVector& applyTranspose(OutVector& y, const InVector& x) const // y = ATx
{
- return applyTransposeSpecialization(y,x,getType(_field));
+ return applyTransposeSpecialization(y,x,getType(field()));
}
size_t rowdim() const
@@ -125,7 +125,7 @@ namespace LinBox
template<typename _Tp1>
ZeroOne(const ZeroOne<_Tp1>& Z, const Field& F) :
- _field(F),
+ _field(&F),
_rows(Z.rowdim()), _cols(Z.coldim()), _nnz(Z.nnz()),
_rowP(new Index[Z.nnz()]), _colP(new Index[Z.nnz()]),
_rowSort(Z.isRowSorted()), _colSort(Z.isColSorted()),
@@ -168,17 +168,20 @@ namespace LinBox
*/
std::istream &read (std::istream &is)
{
- size_t i, j, k, m, n;
+ size_t i=0, j=0, m=0, n=0;
+ // This trick is used to get the entire line
+ // whatever way it is written: "m n M" or "m n nnz"
char buf[80];
buf[0]=0;
is.getline (buf, 80);
std::istringstream str (buf);
- str >> m >> n >> k;
+ str >> m >> n;
_rows = m;
_cols = n;
+
std::vector<size_t> rowP, colP;
- size_t x;
+ size_t x=0;
while (is >> i >> j >> x) {
if (i == 0 || i == (size_t) -1) break;
if (x == 1UL) {
@@ -189,26 +192,30 @@ namespace LinBox
_nnz = rowP.size();
_rowP = new size_t[_nnz];
_colP = new size_t[_nnz];
- copy(rowP.begin(), rowP.end(), _rowP);
- copy(colP.begin(), colP.end(), _colP);
+ std::copy(rowP.begin(), rowP.end(), _rowP);
+ std::copy(colP.begin(), colP.end(), _colP);
return is;
}
- std::ostream& write(std::ostream& out =std::cout)
+ std::ostream& write(std::ostream& out = std::cout)
{
size_t* i=_rowP;
size_t* j=_colP;
- std::cout<<"Row dim: "<<rowdim()
- <<" Col dim: "<<coldim()
- <<" Total nnz: "<<nnz()<<"\n";
- for(;i<_rowP+nnz();++i,++j)
- std::cout<<*i<<" "<<*j<<"\n";
+
+ out << "Row dim: " << rowdim()
+ << " Col dim: " << coldim()
+ << " Total nnz: " << nnz() << std::endl;
+
+ auto lastIndex = _rowP + nnz();
+ for(; i < lastIndex; ++i, ++j)
+ out << *i << " " << *j << std::endl;
+
return out;
}
const Field& field() const
{
- return _field;
+ return *_field;
}
bool isRowSorted() const
@@ -229,7 +236,7 @@ namespace LinBox
protected:
- Field _field; //!< @internal The field used by this class
+ const Field *_field; //!< @internal The field used by this class
/*! @internal A temporary element used for initalization for the Begin() and
* End() methods of the ZeroOne class. Is used to initalize a 1
@@ -267,7 +274,7 @@ namespace LinBox
return NormField();
}
- Mod32Field getType(const Modular<uint32_t> &) const
+ Mod32Field getType(const Givaro::Modular<uint32_t> &) const
{
return Mod32Field();
}
diff --git a/linbox/blackbox/zero-one.inl b/linbox/blackbox/zero-one.inl
index 5252d5e..8bea38b 100644
--- a/linbox/blackbox/zero-one.inl
+++ b/linbox/blackbox/zero-one.inl
@@ -6,20 +6,20 @@
* Modified by Zhendong Wan, -bds
* ------------------------------------
*
- *
+ *
* ========LICENCE========
* This file is part of the library LinBox.
- *
+ *
* LinBox is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
- *
+ *
* This library 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
* Lesser General Public License for more details.
- *
+ *
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
@@ -98,25 +98,25 @@ namespace LinBox
template<class Field> typename
ZeroOne<Field>::Iterator ZeroOne<Field>::Begin()
{
- return Iterator( 0, _field.init(_tmp, 1) );
+ return Iterator( 0, field().assign(_tmp, field().one) );
}
template<class Field> typename
ZeroOne<Field>::Iterator ZeroOne<Field>::End()
{
- return Iterator( _nnz, _field.init(_tmp, 1) );
+ return Iterator( _nnz, field().assign(_tmp, field().one) );
}
template<class Field>
const typename ZeroOne<Field>::Iterator ZeroOne<Field>::Begin() const
{
- return Iterator(0, _field.init(_tmp, 1) );
+ return Iterator(0, field().assign(_tmp, field().one) );
}
template<class Field>
const typename ZeroOne<Field>::Iterator ZeroOne<Field>::End() const
{
- return Iterator(_nnz, _field.init(_tmp, 1) );
+ return Iterator(_nnz, field().assign(_tmp, field().one) );
}
/*! IndexIterator.
@@ -207,16 +207,16 @@ namespace LinBox
template<class Field>
ZeroOne<Field>::ZeroOne(const Field& F) :
- _field(F)
+ _field(&F)
{
srand((unsigned int) time(NULL) );
dynamic = false;
}
template<class Field>
- ZeroOne<Field>::ZeroOne(Field F, Index* rowP, Index* colP,
+ ZeroOne<Field>::ZeroOne(Field& F, Index* rowP, Index* colP,
Index rows, Index cols, Index NNz, bool RowSort, bool ColSort):
- _field(F), _rows(rows), _cols(cols), _nnz(NNz), _rowP(rowP), _colP(colP), _rowSort(RowSort), _colSort(ColSort) , dynamic(false)
+ _field(&F), _rows(rows), _cols(cols), _nnz(NNz), _rowP(rowP), _colP(colP), _rowSort(RowSort), _colSort(ColSort) , dynamic(false)
{
srand((unsigned)time(NULL));
}
@@ -233,9 +233,11 @@ namespace LinBox
template<class Field>
void ZeroOne<Field>::rowSort() const
{
- int mode = 0;
if( _rowSort) return; // Already sorted, we're done
- else _qsort( (size_t) 0, _nnz, mode);
+ else {
+ int mode = 0;
+ _qsort( (size_t) 0, _nnz, mode);
+ }
_rowSort = true;
return;
}
@@ -243,9 +245,11 @@ namespace LinBox
template<class Field>
void ZeroOne<Field>::colSort() const
{
- int mode = 1;
if( _colSort) return; // Already sorted, good to go
- else _qsort( (size_t) 0, _nnz, mode);
+ else {
+ int mode = 1;
+ _qsort( (size_t) 0, _nnz, mode);
+ }
_colSort = true; _rowSort = false;
return;
}
@@ -253,13 +257,13 @@ namespace LinBox
template<class Field>
void ZeroOne<Field>::_qsort(size_t p, size_t e, int &mode) const
{
- int i;
if( (e - p) <= 1) ;
else
{
+ int i;
i = 1 + (int)_part(p, e, mode);
- _qsort(p, i, mode);
- _qsort(i, e, mode);
+ _qsort(p, (size_t)i, mode);
+ _qsort((size_t)i, e, mode);
}
}
@@ -267,7 +271,7 @@ namespace LinBox
size_t ZeroOne<Field>::_part(size_t p, size_t e, int &mode) const
{
size_t rtemp, ctemp, rowval, colval;
- int i = int(p +(int) rand() % (e - p)), j =(int) e;
+ int i = int(p +(size_t) rand() % (e - p)), j =(int) e;
rtemp = _rowP[p];
ctemp = _colP[p];
_rowP[p] = _rowP[i];
@@ -293,7 +297,7 @@ namespace LinBox
_rowP[i] = rtemp;
_colP[i] = ctemp;
}
- else return j;
+ else return (size_t)j;
}
}
else
@@ -310,7 +314,7 @@ namespace LinBox
_rowP[i] = rtemp;
_colP[i] = ctemp;
}
- else return j;
+ else return (size_t)j;
}
}
}
@@ -327,7 +331,7 @@ namespace LinBox
// 0 out y. Note, this implementation assumes a dense vector.
for(yp = y.begin(); yp != y.end(); ++yp)
- _field.init(*yp , 0);
+ field().assign(*yp , field().zero);
rowSort();
@@ -337,25 +341,25 @@ namespace LinBox
jp=_colP;
size_t rowI =0;
- for(; ip <_rowP+nnz(); ++ip,++jp)
+ auto ipEnd = _rowP + nnz();
+ for(; ip < ipEnd; ++ip,++jp)
{
if( *ip == rowI)
- _field.addin(*yp,*(xp + *jp));
+ field().addin(*yp,*(xp +(ptrdiff_t) *jp));
else
{
if((*ip-rowI)==1)
++yp;
else
- yp=y.begin()+*ip;
+ yp=y.begin()+(ptrdiff_t)*ip;
rowI=*ip;
- _field.addin(*yp,*(xp + *jp));
+ field().addin(*yp,*(xp +(ptrdiff_t) *jp));
}
}
return y;
}
-
template<class Field>
template<class OutVector, class InVector>
OutVector & ZeroOne<Field>::applySpecialization(OutVector & y, const InVector & x, const Mod32Field& m) const
@@ -369,7 +373,7 @@ namespace LinBox
Index* ip, *jp;
for(yp = y.begin(); yp != y.end(); ++yp)
- _field.init(*yp , 0);
+ field().assign(*yp , field().zero);
rowSort();
@@ -380,7 +384,7 @@ namespace LinBox
size_t rowI =0;
integer _prime;
- _field.characteristic(_prime);
+ field().characteristic(_prime);
uint32_t prime = static_cast<uint32_t>(_prime);
@@ -389,17 +393,17 @@ namespace LinBox
for(; ip <_rowP+nnz(); ++ip,++jp)
{
if( *ip == rowI)
- accum=accum+*(xp + *jp);
+ accum=accum+*(xp +(ptrdiff_t) *jp);
else
{
*yp= (val_t)(accum % prime);
if((*ip-rowI)==1)
++yp;
else
- yp=y.begin()+*ip;
+ yp=y.begin()+(ptrdiff_t)*ip;
rowI=*ip;
- accum=*(xp+*jp);
+ accum=*(xp+(ptrdiff_t)*jp);
}
}
if(rowI)
@@ -421,7 +425,7 @@ namespace LinBox
// 0 out y. Note, this implementation assumes a dense vector.
for(yp = y.begin(); yp != y.end(); ++yp)
- _field.init(*yp , 0);
+ field().assign(*yp , field().zero);
rowSort();
@@ -434,16 +438,16 @@ namespace LinBox
for(; ip <_rowP+nnz(); ++ip,++jp)
{
if( *ip == rowI)
- _field.addin(*(yp+*jp),*xp);
+ field().addin(*(yp+(ptrdiff_t)*jp),*xp);
else
{
if((*ip-rowI)==1)
++xp;
else
- xp=x.begin()+*ip;
+ xp=x.begin()+(ptrdiff_t)*ip;
rowI=*ip;
- _field.addin(*(yp+*jp),*xp);
+ field().addin(*(yp+(ptrdiff_t)*jp),*xp);
}
}
@@ -477,21 +481,21 @@ namespace LinBox
for(; ip <_rowP+nnz(); ++ip,++jp)
{
if( *ip == rowI) {
- *(y_cp+*jp) += *xp;
+ *(y_cp+(ptrdiff_t)*jp) += *xp;
}
else {
if((*ip-rowI)==1)
++xp;
else
- xp=x.begin()+*ip;
+ xp=x.begin()+(ptrdiff_t)*ip;
rowI=*ip;
- *(y_cp+*jp) += *xp;
+ *(y_cp+(ptrdiff_t)*jp) += *xp;
}
}
integer _prime;
- _field.characteristic(_prime);
+ field().characteristic(_prime);
uint32_t prime = static_cast<uint32_t>(_prime);
yp=y.begin();
diff --git a/linbox/blackbox/zo-gf2.h b/linbox/blackbox/zo-gf2.h
index 84d8443..29d2193 100644
--- a/linbox/blackbox/zo-gf2.h
+++ b/linbox/blackbox/zo-gf2.h
@@ -30,10 +30,10 @@
#include <algorithm>
#include "linbox/blackbox/zero-one.h"
#include "linbox/field/gf2.h"
-#include "linbox/field/unparametric.h"
+#include <givaro/zring.h>
#include "linbox/util/matrix-stream.h"
#include "linbox/vector/stream.h"
-#include "linbox/matrix/sparse.h"
+#include "linbox/matrix/sparse-matrix.h"
#include "linbox/vector/light_container.h"
namespace LinBox
@@ -54,7 +54,7 @@ namespace LinBox
typedef ZeroOne<GF2> Self_t;
typedef GF2 Field;
- const GF2 _field;
+ const GF2 *_field;
ZeroOne(const GF2& ) :
_nnz(0)
@@ -119,9 +119,9 @@ namespace LinBox
* @return Reference to input stream
*/
std::istream &read (std::istream &is) ;
- std::ostream& write (std::ostream& out, FileFormatTag format=FORMAT_GUILLAUME) const ;
+ std::ostream& write (std::ostream& out, LINBOX_enum(Tag::FileFormat) format=Tag::FileFormat::Guillaume) const ;
- const Field& field() const { return _field; }
+ const Field& field() const { return *_field; }
template<typename _Tp1>
struct rebind {
diff --git a/linbox/blackbox/zo-gf2.inl b/linbox/blackbox/zo-gf2.inl
old mode 100644
new mode 100755
index fa18cfd..fdc7e70
--- a/linbox/blackbox/zo-gf2.inl
+++ b/linbox/blackbox/zo-gf2.inl
@@ -42,11 +42,12 @@ namespace LinBox
_field(F), _x(x)
{}
+
bool operator()(const typename Blackbox::Row_t& row) const
{
bool tmp(false);
for(typename Blackbox::Row_t::const_iterator loc = row.begin(); loc != row.end(); ++loc) {
- _field.addin(tmp,_x[*loc]);
+ _field.addin(tmp,_x.at(*loc));
}
return tmp;
}
@@ -56,7 +57,7 @@ namespace LinBox
template<class OutVector, class InVector>
inline OutVector & ZeroOne<GF2>::apply(OutVector & y, const InVector & x) const
{
- dotp<Self_t,InVector> mydp(this->_field, x);
+ dotp<Self_t,InVector> mydp(this->field(), x);
std::transform(this->begin(), this->end(), y.begin(), mydp );
return y;
}
@@ -70,7 +71,7 @@ namespace LinBox
for( ; row != this->end(); ++yit, ++row) {
bool tmp(false);
for(Row_t::const_iterator loc = row->begin();loc != row->end(); ++loc)
- _field.addin(tmp,x[*loc]);
+ field().addin(tmp,x[*loc]);
*yit = tmp;
}
return y;
@@ -85,7 +86,7 @@ namespace LinBox
Self_t::const_iterator row = this->begin();
for( ; row != this->end(); ++row, ++xit) {
for(typename Self_t::Row_t::const_iterator loc = row->begin(); loc != row->end(); ++loc) {
- _field.addin(y[*loc],*xit);
+ field().addin(y[*loc],*xit);
}
}
return y;
@@ -95,7 +96,7 @@ namespace LinBox
inline void ZeroOne<GF2>::setEntry(size_t i, size_t j, const Element& v) {
Row_t& rowi = this->operator[](i);
Row_t::iterator there = std::lower_bound(rowi.begin(), rowi.end(), j);
- if (! _field.isZero(v) ) {
+ if (! field().isZero(v) ) {
if ( (there == rowi.end() ) || (*there != j) ) {
rowi.insert(there, j);
++_nnz;
@@ -116,7 +117,7 @@ namespace LinBox
if (there != rowi.end() )
return r=*there;
else
- return r=_field.zero;
+ return r=field().zero;
}
inline const ZeroOne<GF2>::Element& ZeroOne<GF2>::getEntry(size_t i, size_t j) const
@@ -126,13 +127,13 @@ namespace LinBox
if (there != rowi.end() )
return reinterpret_cast<const ZeroOne<GF2>::Element&>(*there);
else
- return _field.zero;
+ return field().zero;
}
inline std::istream &ZeroOne<GF2>::read (std::istream &is) {
// Reads a long int and take it mod 2 afterwards (v&1)
- UnparametricField<long> Ints;
- MatrixStream<UnparametricField<long> > S(Ints, is);
+ Givaro::ZRing<long> Ints;
+ MatrixStream<Givaro::ZRing<long> > S(Ints, is);
S.getDimensions( _rowdim, _coldim );
this->resize(_rowdim);
Index r, c;
@@ -149,9 +150,9 @@ namespace LinBox
return is;
}
- inline std::ostream& ZeroOne<GF2>::write (std::ostream& out, FileFormatTag format) const
+ inline std::ostream& ZeroOne<GF2>::write (std::ostream& out, LINBOX_enum(Tag::FileFormat) format) const
{
- if (format == FORMAT_GUILLAUME) {
+ if (format == Tag::FileFormat::Guillaume) {
out << _rowdim << ' ' << _coldim << " M\n";
for(size_t i=0; i<_rowdim; ++i) {
const Row_t& rowi = this->operator[](i);
@@ -160,7 +161,7 @@ namespace LinBox
}
return out << "0 0 0" << std::endl;
}
- else if (format == FORMAT_MAPLE) {
+ else if (format == Tag::FileFormat::Maple) {
out << '[';
bool firstrow=true;
for (const_iterator i = begin (); i != end (); ++i) {
@@ -255,22 +256,22 @@ namespace LinBox
*/
inline ZeroOne<GF2>::Iterator ZeroOne<GF2>::Begin()
{
- return Iterator( 0, _field.one );
+ return Iterator( 0, field().one );
}
inline ZeroOne<GF2>::Iterator ZeroOne<GF2>::End()
{
- return Iterator( _nnz, _field.one );
+ return Iterator( _nnz, field().one );
}
inline const ZeroOne<GF2>::Iterator ZeroOne<GF2>::Begin() const
{
- return Iterator(0, _field.one );
+ return Iterator(0, field().one );
}
inline const ZeroOne<GF2>::Iterator ZeroOne<GF2>::End() const
{
- return Iterator(_nnz, _field.one );
+ return Iterator(_nnz, field().one );
}
/*! IndexIterator.
@@ -398,10 +399,10 @@ namespace LinBox
// Specialization of getentry
-#include "linbox/solutions/getentry.h"
+#include "linbox/solutions/solution-tags.h"
namespace LinBox
{
- template<> struct GetEntryCategory<ZeroOne<GF2> > { typedef GetEntryTags::Local Tag; };
+ template<> struct GetEntryCategory<ZeroOne<GF2> > { typedef SolutionTags::Local Tag; };
} // end of namespace LinBox
#endif //__LINBOX_zo_gf2_INL
diff --git a/linbox/blackbox/zo.h b/linbox/blackbox/zo.h
index 8f3300a..fbeb373 100644
--- a/linbox/blackbox/zo.h
+++ b/linbox/blackbox/zo.h
@@ -2,20 +2,20 @@
* Copyright (c) LinBox
* by Hui Wang, assisted by bds
* ------------------------------------
- *
+ *
* ========LICENCE========
* This file is part of the library LinBox.
- *
+ *
* LinBox is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
- *
+ *
* This library 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
* Lesser General Public License for more details.
- *
+ *
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
@@ -34,10 +34,10 @@
#include "linbox/integer.h"
-//#include "linbox/vector/vector-traits.h"
#include "linbox/util/debug.h"
+#include "linbox/matrix/matrix-category.h"
#include "linbox/util/matrix-stream.h"
-#include "linbox/field/modular.h"
+#include "linbox/ring/modular.h"
#include "linbox/blackbox/blackbox-interface.h"
#include "linbox/blackbox/quad-matrix.h"
@@ -50,7 +50,7 @@
namespace LinBox
{
- bool revLexLess(const std::pair<size_t,size_t>& a, const std::pair<size_t,size_t> b)
+ bool revLexLess(const std::pair<size_t,size_t>& a, const std::pair<size_t,size_t> & b)
{ return a.second < b.second || (b.second == a.second && a.first < b.first); }
/** \brief Time and space efficient representation of sparse {0,1}-matrices.
@@ -86,13 +86,15 @@ namespace LinBox
// basic constructor, can be used with subsequent read.
ZeroOne(const Field& F) :
- _field(F), sorted(true)
+ _field(&F)
+ ,_rowdim(0),_coldim(0)
+ , sorted(true)
{}
// constructor for use by ZOQuad. Needs work.
ZeroOne (const Field& F, IndexVector& index, PointerVector& indexP,
Index Rowdim, Index Coldim, bool sortedBy) :
- _field(F), _index(index), _indexP(indexP),
+ _field(&F), _index(index), _indexP(indexP),
_rowdim(Rowdim), _coldim(Coldim), sorted(sortedBy)
{
std::ptrdiff_t diff = _index.begin() - index.begin();
@@ -115,7 +117,7 @@ namespace LinBox
*/
ZeroOne
(Field& F, Index* rowP, Index* colP, Index rows, Index cols, Index NNz) :
- _field(F), _rowdim(rows), _coldim(cols), sorted(true)
+ _field(&F), _rowdim(rows), _coldim(cols), sorted(true)
{
std::vector<std::pair<Index, Index> > indexPairs;
for (Index i = 0; i < NNz; ++i, ++rowP, ++colP)
@@ -205,13 +207,13 @@ namespace LinBox
std::vector<std::pair<Index, Index> >::iterator q = ip.begin();
Index i = q->first;
- p++;q++; //start from the second place
+ ++p;++q; //start from the second place
for (; q != ip.end(); ++q, ++p)
if (i != q->first)
{
- //for (Index j = i; j < (q+1)->first; j++)//difference may be more than 1
- for (Index j = i; j < q->first; j++)//difference may be more than 1
+ //for (Index j = i; j < (q+1)->first; ++j)//difference may be more than 1
+ for (Index j = i; j < q->first; ++j)//difference may be more than 1
_indexP.push_back(p);
i = q->first; //we should change i after the for loop, otherwise the
//for loop will not run at all
@@ -232,12 +234,12 @@ namespace LinBox
q =ip.begin();
i = q->second;
- p++;q++;
+ ++p;++q;
for ( ; q != ip.end(); ++q, ++p)
if (i != q->second)
{
- for (Index j = i; j < (q+1)->second; j++)
+ for (Index j = i; j < (q+1)->second; ++j)
_colP.push_back(p);
i = q->second;
}
@@ -301,7 +303,7 @@ namespace LinBox
std::vector<std::pair<Index, Index> > indexPairs;
Index r, c;
Element v;
- MatrixStream<Field> S(_field, is);
+ MatrixStream<Field> S(field(), is);
long count = 0;
// /*
@@ -325,7 +327,6 @@ namespace LinBox
*/
std::cout << " -- read: " << count << std::endl;
- //S.getRows(_rowdim); S.getColumns(_coldim);
init(indexPairs);
return is;
}
@@ -339,7 +340,7 @@ namespace LinBox
}
const Field& field() const
- { return _field; }
+ { return *_field; }
/* Non blackbox function. Tells the number of nonzero entries
*/
@@ -351,7 +352,7 @@ namespace LinBox
protected:
- Field _field; // The field used by this class
+ const Field *_field; // The field used by this class
/* _indexP is a pointer to an array of row indexes. _colP is a pointer
* to an array of column indexes. These two are the other arrays of a
@@ -399,11 +400,10 @@ namespace LinBox
#endif // __LINBOX_zero_one_H
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
// Local Variables:
// mode: C++
// tab-width: 8
// indent-tabs-mode: nil
// c-basic-offset: 8
// End:
-
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/blackbox/zo.inl b/linbox/blackbox/zo.inl
index 0cf73a4..061accc 100644
--- a/linbox/blackbox/zo.inl
+++ b/linbox/blackbox/zo.inl
@@ -6,20 +6,20 @@
* Modified by Zhendong Wan, -bds
* ------------------------------------
*
- *
+ *
* ========LICENCE========
* This file is part of the library LinBox.
- *
+ *
* LinBox is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
- *
+ *
* This library 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
* Lesser General Public License for more details.
- *
+ *
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
@@ -67,7 +67,7 @@ namespace LinBox
linbox_check((y.size()==rowdim())&&(x.size()==coldim()));
- FieldAXPY<Field> accum (_field);
+ FieldAXPY<Field> accum (field());
typename OutVector::iterator yp;
typename InVector::const_iterator xp;
@@ -106,7 +106,7 @@ namespace LinBox
for(jp = *ip; jp !=*(ip + 1); ++jp)
{
//std::cout << jp - _index.begin() << endl;
- accum.accumulate_special( *(xp + *jp) );
+ accum.accumulate_special( *(xp + (ptrdiff_t)*jp) );
}
//std::cout << " accumulate is done for one iteration " << endl;
//std::cout << " before accum.get " << yp - y.begin() << endl;
@@ -139,7 +139,7 @@ namespace LinBox
{
linbox_check((y.size()==coldim())&&(x.size()==rowdim()));
- FieldAXPY<Field> accum (_field);
+ FieldAXPY<Field> accum (field());
typename OutVector::iterator yp;
typename InVector::const_iterator xp;
@@ -169,7 +169,7 @@ namespace LinBox
{
linbox_check((y.size()==coldim())&&(x.size()==rowdim()));
- FieldAXPY<Field> accum (_field);
+ FieldAXPY<Field> accum (field());
typename OutVector::iterator yp;
typename InVector::const_iterator xp;
@@ -190,7 +190,7 @@ namespace LinBox
for(ip = _indexP.begin(); ip < _indexP.end()-1; ++ip, ++yp)
{
for(jp = *ip; jp <*(ip + 1); ++jp)
- accum.accumulate_special( *(xp + *jp) );
+ accum.accumulate_special( *(xp +(ptrdiff_t) *jp) );
accum.get(*yp);
accum.reset();
}
diff --git a/linbox/blackbox/zoi.inl b/linbox/blackbox/zoi.inl
new file mode 100644
index 0000000..1d854ef
--- /dev/null
+++ b/linbox/blackbox/zoi.inl
@@ -0,0 +1,244 @@
+/* linbox/blackbox/nag-sparse.h
+ * Copyright (C) 2002 Rich Seagraves
+ *
+ * Written by Rich Seagraves <seagrave at cis.udel.edu>
+ * Modified by Zhendong Wan, -bds
+ * ------------------------------------
+ *
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ * ========LICENCE========
+ *.
+ */
+
+#ifndef __LINBOX_bb_zoi_INL
+#define __LINBOX_bb_zoi_INL
+
+#if 0
+#ifndef _ZOI_OUTERLOOP_CHUNK_SIZE
+#include "test-zo-openmp-chunksize.h" // BB: where is this file ?
+#endif
+#endif
+
+namespace LinBox
+{
+
+ /*
+ // for GF(310), apply to packvec will do adds with periodic normalizations
+ template<>
+ template<Field>
+ Packvec<typename Field::Accumulator>& ZeroOne<Field>::apply<Packvec<typename Field::Accumulator>, Packvec<typename Field::Accumulator> >
+ (Pacvec<typename Field::Accumulator>& y,
+ Pacvec<typename Field::Accumulator>& x)
+ { return y; }
+
+ // more stuff for paley graphs
+ template<class OutVector, class InVector>
+ template<>
+ OutVector & ZeroOne<Special3_10Field>::apply(OutVector & y, const InVector & x) const
+ {
+ typedef Special3_10Field Field;
+ typedef typename Packvec<Field::Accumulator> Vector;
+ Vector xx, yy;
+ field().convert(xx, x);
+ apply(yy, xx);
+ field().convert(y, yy);
+ }
+ */
+
+ template<class Field>
+ template<class OutVector, class InVector>
+ OutVector & ZeroOne<Field>::apply(OutVector & y, const InVector & x) const
+ //OutVector & ZeroOne<Field>::apply(OutVector & y, const InVector & x)
+ {
+
+ //std::cout << endl;
+ //std::cout << " new apply pass " << endl;
+ //std::cout << this->rowdim() << " " << this->coldim() << endl;
+ //std::cout << " inside apply " << endl;
+ //std::cout << x.size() << " " << y.size() << endl;
+
+ linbox_check((y.size()==rowdim())&&(x.size()==coldim()));
+
+ typename OutVector::iterator yp;
+ typename InVector::const_iterator xp;
+ //PointerVector::const_iterator ip;
+ int i; // for index version of loop suitable for openMP
+ int ilimit; // for index version of loop suitable for openMP
+ IndexVector::const_iterator jp;
+
+
+ //std::cout << " before sorting " << endl;
+
+ if( !sorted )
+ {
+ //std::cout << " -- apply: switch sort (" << _rowdim << ", " << _coldim << ", " << nnz() << ", " << sorted << " " << &(this->sorted) << ") -- " << std::endl;
+ switch_sort();
+ //std::cout << " -- apply: switch sort (" << _rowdim << ", " << _coldim << ", " << nnz() << ", " << sorted << ") -- " << std::endl;
+ }
+ //std::cout << " -- zo apply: " << this << "(" << _rowdim << ", " << _coldim << ", " << nnz() << ")" << std::endl;
+
+ xp=x.begin();
+ yp=y.begin();
+ // accum.reset();
+
+
+ // outer loop to parallelize
+
+ // Timer timer;
+ // timer.start();
+ ilimit = _indexP.size() -1;
+ // std::cout << std::endl << "Using ilimit: " << ilimit << std::endl;
+
+
+#ifdef _RUNOPENMP
+ // std:: cout<< "_ZOI_OUTERLOOP_CHUNK_SIZE is:" << _ZOI_OUTERLOOP_CHUNK_SIZE << std:: endl;
+ // std::cout<<"number of threads is " << omp_get_num_threads() << std ::endl;
+#pragma omp parallel
+ {
+#pragma omp for firstprivate(xp, ilimit) private(jp, i) schedule(static, _ZOI_OUTERLOOP_CHUNK_SIZE)
+#endif
+
+ for(i = 0; i < ilimit; ++i)
+
+ //for(i = 0; i < _indexP.size()-1; ++i)
+ //for(ip = _indexP.begin(); ip !=_indexP.end()-1; ++ip, ++yp)
+ {
+
+ FieldAXPY<Field> accum (field());
+
+#ifdef _RUNOPENMP
+ //#pragma omp critical
+ // {
+ // if (i%5000==0)
+ // std::cout<< ":i/thread no.:" << i << ":" << omp_get_thread_num() << std::endl;
+ // }
+#endif
+
+ for(jp = _indexP[i]; jp !=_indexP[i+1]; ++jp)
+ {
+ //std::cout << jp - _index.begin() << endl;
+
+ accum.accumulate_special( *(xp + *jp) );
+
+ }
+
+ //std::cout << " accumulate is done for one iteration " << endl;
+ //std::cout << " before accum.get " << yp - y.begin() << endl;
+ accum.get(y[i]);
+ //std::cout << " before accum.reset " << endl;
+ // accum.reset();
+ }
+#ifdef _RUNOPENMP
+ }
+#endif
+
+ // timer.stop();
+
+ // std::cout << "time:" << timer << std::endl;
+ // std::cout << "user/sys/real/threads/chunksize:" << timer.usertime() << "/" <<
+ // timer.systime() << "/" << timer.realtime() <<
+ // "/" << omp_get_max_threads() << "/" << _ZOI_OUTERLOOP_CHUNK_SIZE << std::endl;
+
+ return y;
+ }
+
+ /* if you want to keep two copies for the matrix, one of which is sorted by row,
+ * the other by column, then you want to use this applyTranspose function. In
+ * this case, un-comment this one and comment out the applyTranspose further down
+ */
+ /*
+ template<class Field>
+ template<class OutVector, class InVector>
+ OutVector & ZeroOne<Field>::applyTranspose(OutVector & y, const InVector & x) const
+ {
+ linbox_check((y.size()==coldim())&&(x.size()==rowdim()));
+
+ FieldAXPY<Field> accum (field());
+
+ typename OutVector::iterator yp;
+ typename InVector::const_iterator xp;
+ PointerVector::const_iterator ip;
+ IndexVector::const_iterator jp;
+
+ xp=x.begin();
+ yp=y.begin();
+ accum.reset();
+
+ for(ip = _colP.begin(); ip < _colP.end()-1; ++ip, ++yp)
+ {
+ for(jp = *ip; jp <*(ip + 1); ++jp)
+ accum.accumulate_special( *(xp + *jp) );
+ accum.get(*yp);
+ accum.reset();
+ }
+
+ return y;
+
+ }
+ */
+
+ template<class Field>
+ template<class OutVector, class InVector>
+ OutVector & ZeroOne<Field>::applyTranspose(OutVector & y, const InVector & x) const
+ {
+ linbox_check((y.size()==coldim())&&(x.size()==rowdim()));
+
+ FieldAXPY<Field> accum (field());
+
+ typename OutVector::iterator yp;
+ typename InVector::const_iterator xp;
+ PointerVector::const_iterator ip;
+ IndexVector::const_iterator jp;
+
+ xp=x.begin();
+ yp=y.begin();
+ accum.reset();
+
+ if( sorted )
+ //{
+ //std::cout << " -- in apply transpose, before switch sort -- " << std::endl;
+ switch_sort();
+ //std::cout << " -- in apply transpose, after switch sort -- " << std::endl;
+ //}
+
+ for(ip = _indexP.begin(); ip < _indexP.end()-1; ++ip, ++yp)
+ {
+ for(jp = *ip; jp <*(ip + 1); ++jp)
+ accum.accumulate_special( *(xp + *jp) );
+ accum.get(*yp);
+ accum.reset();
+ }
+ return y;
+ }
+
+}//End of LinBox
+
+//#undef _ZOI_OUTERLOOP_CHUNK_SIZE
+
+#endif //__LINBOX_bb_zoi_INL
+
+
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+
diff --git a/linbox/element/Makefile.in b/linbox/element/Makefile.in
deleted file mode 100644
index c926d64..0000000
--- a/linbox/element/Makefile.in
+++ /dev/null
@@ -1,582 +0,0 @@
-# Makefile.in generated by automake 1.11.5 from Makefile.am.
-# @configure_input@
-
-# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software
-# Foundation, Inc.
-# This Makefile.in is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
-# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
-# PARTICULAR PURPOSE.
-
- at SET_MAKE@
-
-VPATH = @srcdir@
-am__make_dryrun = \
- { \
- am__dry=no; \
- case $$MAKEFLAGS in \
- *\\[\ \ ]*) \
- echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \
- | grep '^AM OK$$' >/dev/null || am__dry=yes;; \
- *) \
- for am__flg in $$MAKEFLAGS; do \
- case $$am__flg in \
- *=*|--*) ;; \
- *n*) am__dry=yes; break;; \
- esac; \
- done;; \
- esac; \
- test $$am__dry = yes; \
- }
-pkgdatadir = $(datadir)/@PACKAGE@
-pkgincludedir = $(includedir)/@PACKAGE@
-pkglibdir = $(libdir)/@PACKAGE@
-pkglibexecdir = $(libexecdir)/@PACKAGE@
-am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
-install_sh_DATA = $(install_sh) -c -m 644
-install_sh_PROGRAM = $(install_sh) -c
-install_sh_SCRIPT = $(install_sh) -c
-INSTALL_HEADER = $(INSTALL_DATA)
-transform = $(program_transform_name)
-NORMAL_INSTALL = :
-PRE_INSTALL = :
-POST_INSTALL = :
-NORMAL_UNINSTALL = :
-PRE_UNINSTALL = :
-POST_UNINSTALL = :
-build_triplet = @build@
-host_triplet = @host@
-subdir = linbox/element
-DIST_COMMON = $(pkgincludesub_HEADERS) $(srcdir)/Makefile.am \
- $(srcdir)/Makefile.in
-ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-am__aclocal_m4_deps = $(top_srcdir)/macros/aclocal-include.m4 \
- $(top_srcdir)/macros/config-header.m4 \
- $(top_srcdir)/macros/debug.m4 \
- $(top_srcdir)/macros/expat-check.m4 \
- $(top_srcdir)/macros/fflas-ffpack-check.m4 \
- $(top_srcdir)/macros/fplll-check.m4 \
- $(top_srcdir)/macros/givaro-check.m4 \
- $(top_srcdir)/macros/gmp-check.m4 \
- $(top_srcdir)/macros/iml-check.m4 \
- $(top_srcdir)/macros/lapack-check.m4 \
- $(top_srcdir)/macros/libtool.m4 \
- $(top_srcdir)/macros/lidia-check.m4 \
- $(top_srcdir)/macros/linbox-benchmark.m4 \
- $(top_srcdir)/macros/linbox-doc.m4 \
- $(top_srcdir)/macros/linbox-misc.m4 \
- $(top_srcdir)/macros/linbox-opt.m4 \
- $(top_srcdir)/macros/ltoptions.m4 \
- $(top_srcdir)/macros/ltsugar.m4 \
- $(top_srcdir)/macros/ltversion.m4 \
- $(top_srcdir)/macros/lt~obsolete.m4 \
- $(top_srcdir)/macros/m4ri-check.m4 \
- $(top_srcdir)/macros/m4rie-check.m4 \
- $(top_srcdir)/macros/maple-check.m4 \
- $(top_srcdir)/macros/mpfr-check.m4 \
- $(top_srcdir)/macros/ntl-check.m4 \
- $(top_srcdir)/macros/saclib-check.m4 \
- $(top_srcdir)/macros/sage-check.m4 $(top_srcdir)/configure.ac
-am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
- $(ACLOCAL_M4)
-mkinstalldirs = $(install_sh) -d
-CONFIG_HEADER = $(top_builddir)/config.h
-CONFIG_CLEAN_FILES =
-CONFIG_CLEAN_VPATH_FILES =
-depcomp =
-am__depfiles_maybe =
-SOURCES =
-DIST_SOURCES =
-am__can_run_installinfo = \
- case $$AM_UPDATE_INFO_DIR in \
- n|no|NO) false;; \
- *) (install-info --version) >/dev/null 2>&1;; \
- esac
-am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
-am__vpath_adj = case $$p in \
- $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
- *) f=$$p;; \
- esac;
-am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
-am__install_max = 40
-am__nobase_strip_setup = \
- srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
-am__nobase_strip = \
- for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
-am__nobase_list = $(am__nobase_strip_setup); \
- for p in $$list; do echo "$$p $$p"; done | \
- sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
- $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
- if (++n[$$2] == $(am__install_max)) \
- { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
- END { for (dir in files) print dir, files[dir] }'
-am__base_list = \
- sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
- sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
-am__uninstall_files_from_dir = { \
- test -z "$$files" \
- || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \
- || { echo " ( cd '$$dir' && rm -f" $$files ")"; \
- $(am__cd) "$$dir" && rm -f $$files; }; \
- }
-am__installdirs = "$(DESTDIR)$(pkgincludesubdir)"
-HEADERS = $(pkgincludesub_HEADERS)
-ETAGS = etags
-CTAGS = ctags
-DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
-ACLOCAL = @ACLOCAL@
-AMTAR = @AMTAR@
-AR = @AR@
-AUTOCONF = @AUTOCONF@
-AUTOHEADER = @AUTOHEADER@
-AUTOMAKE = @AUTOMAKE@
-AWK = @AWK@
-BLAS_CFLAGS = @BLAS_CFLAGS@
-BLAS_LIBS = @BLAS_LIBS@
-CC = @CC@
-CCNAM = @CCNAM@
-CFLAGS = @CFLAGS@
-CPPFLAGS = @CPPFLAGS@
-CXX = @CXX@
-CXXCPP = @CXXCPP@
-CXXFLAGS = @CXXFLAGS@
-CYGPATH_W = @CYGPATH_W@
-DBG = @DBG@
-DEBUG_CFLAGS = @DEBUG_CFLAGS@
-DEFAULT_CFLAGS = @DEFAULT_CFLAGS@
-DEFS = @DEFS@
-DLLTOOL = @DLLTOOL@
-DSYMUTIL = @DSYMUTIL@
-DUMPBIN = @DUMPBIN@
-ECHO_C = @ECHO_C@
-ECHO_N = @ECHO_N@
-ECHO_T = @ECHO_T@
-EGREP = @EGREP@
-EXEEXT = @EXEEXT@
-EXPAT_CFLAGS = @EXPAT_CFLAGS@
-EXPAT_LIBS = @EXPAT_LIBS@
-FFLAS_FFPACK_CFLAGS = @FFLAS_FFPACK_CFLAGS@
-FFLAS_FFPACK_LIBS = @FFLAS_FFPACK_LIBS@
-FFLAS_FFPACK_LOC = @FFLAS_FFPACK_LOC@
-FGREP = @FGREP@
-FPLLL_CFLAGS = @FPLLL_CFLAGS@
-FPLLL_LIBS = @FPLLL_LIBS@
-GIVARO_CFLAGS = @GIVARO_CFLAGS@
-GIVARO_LIBS = @GIVARO_LIBS@
-GMP_CFLAGS = @GMP_CFLAGS@
-GMP_LIBS = @GMP_LIBS@
-GMP_VERSION = @GMP_VERSION@
-GREP = @GREP@
-IML_CFLAGS = @IML_CFLAGS@
-IML_LIBS = @IML_LIBS@
-INSTALL = @INSTALL@
-INSTALL_DATA = @INSTALL_DATA@
-INSTALL_PROGRAM = @INSTALL_PROGRAM@
-INSTALL_SCRIPT = @INSTALL_SCRIPT@
-INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
-LD = @LD@
-LDFLAGS = @LDFLAGS@
-LIBOBJS = @LIBOBJS@
-LIBS = @LIBS@
-LIBTOOL = @LIBTOOL@
-LIDIA_CFLAGS = @LIDIA_CFLAGS@
-LIDIA_LIBS = @LIDIA_LIBS@
-LINBOX_BENCH_PATH = @LINBOX_BENCH_PATH@
-LINBOX_DOC_PATH = @LINBOX_DOC_PATH@
-LIPO = @LIPO@
-LN_S = @LN_S@
-LTLIBOBJS = @LTLIBOBJS@
-M4RIE_CFLAGS = @M4RIE_CFLAGS@
-M4RIE_LIBS = @M4RIE_LIBS@
-M4RI_CFLAGS = @M4RI_CFLAGS@
-M4RI_LIBS = @M4RI_LIBS@
-MAINT = @MAINT@
-MAKEINFO = @MAKEINFO@
-MANIFEST_TOOL = @MANIFEST_TOOL@
-MAPLE_CFLAGS = @MAPLE_CFLAGS@
-MAPLE_HOME = @MAPLE_HOME@
-MAPLE_LIBS = @MAPLE_LIBS@
-MAPLE_VERSION = @MAPLE_VERSION@
-MKDIR_P = @MKDIR_P@
-MPFR_CFLAGS = @MPFR_CFLAGS@
-MPFR_LIBS = @MPFR_LIBS@
-NM = @NM@
-NMEDIT = @NMEDIT@
-NTL_CFLAGS = @NTL_CFLAGS@
-NTL_LIBS = @NTL_LIBS@
-OBJDUMP = @OBJDUMP@
-OBJEXT = @OBJEXT@
-OTOOL = @OTOOL@
-OTOOL64 = @OTOOL64@
-PACKAGE = @PACKAGE@
-PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
-PACKAGE_NAME = @PACKAGE_NAME@
-PACKAGE_STRING = @PACKAGE_STRING@
-PACKAGE_TARNAME = @PACKAGE_TARNAME@
-PACKAGE_URL = @PACKAGE_URL@
-PACKAGE_VERSION = @PACKAGE_VERSION@
-PATH_SEPARATOR = @PATH_SEPARATOR@
-PROF = @PROF@
-RANLIB = @RANLIB@
-RM = @RM@
-SACLIB_CFLAGS = @SACLIB_CFLAGS@
-SACLIB_LIBS = @SACLIB_LIBS@
-SED = @SED@
-SET_MAKE = @SET_MAKE@
-SHELL = @SHELL@
-STRIP = @STRIP@
-TESTS_CFLAGS = @TESTS_CFLAGS@
-VERSION = @VERSION@
-WARN = @WARN@
-abs_builddir = @abs_builddir@
-abs_srcdir = @abs_srcdir@
-abs_top_builddir = @abs_top_builddir@
-abs_top_srcdir = @abs_top_srcdir@
-ac_ct_AR = @ac_ct_AR@
-ac_ct_CC = @ac_ct_CC@
-ac_ct_CXX = @ac_ct_CXX@
-ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
-am__leading_dot = @am__leading_dot@
-am__tar = @am__tar@
-am__untar = @am__untar@
-bindir = @bindir@
-build = @build@
-build_alias = @build_alias@
-build_cpu = @build_cpu@
-build_os = @build_os@
-build_vendor = @build_vendor@
-builddir = @builddir@
-datadir = @datadir@
-datarootdir = @datarootdir@
-docdir = @docdir@
-dvidir = @dvidir@
-exec_prefix = @exec_prefix@
-host = @host@
-host_alias = @host_alias@
-host_cpu = @host_cpu@
-host_os = @host_os@
-host_vendor = @host_vendor@
-htmldir = @htmldir@
-includedir = @includedir@
-infodir = @infodir@
-install_sh = @install_sh@
-libdir = @libdir@
-libexecdir = @libexecdir@
-localedir = @localedir@
-localstatedir = @localstatedir@
-mandir = @mandir@
-mkdir_p = @mkdir_p@
-oldincludedir = @oldincludedir@
-pdfdir = @pdfdir@
-prefix = @prefix@
-program_transform_name = @program_transform_name@
-psdir = @psdir@
-sbindir = @sbindir@
-sharedstatedir = @sharedstatedir@
-srcdir = @srcdir@
-sysconfdir = @sysconfdir@
-target_alias = @target_alias@
-top_build_prefix = @top_build_prefix@
-top_builddir = @top_builddir@
-top_srcdir = @top_srcdir@
-# it under the terms of the GNU Lesser General Public
-# License as published by the Free Software Foundation; either
-# version 2.1 of the License, or (at your option) any later version.
-#
-# This library 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
-# Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public
-# License along with this library; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
-# ========LICENCE========
-#/
-pkgincludesubdir = $(pkgincludedir)/element
-EXTRA_DIST = \
- element.doxy
-
-pkgincludesub_HEADERS = \
- abstract.h \
- archetype.h \
- envelope.h \
- gmp-rational.h
-
-all: all-am
-
-.SUFFIXES:
-$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps)
- @for dep in $?; do \
- case '$(am__configure_deps)' in \
- *$$dep*) \
- ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
- && { if test -f $@; then exit 0; else break; fi; }; \
- exit 1;; \
- esac; \
- done; \
- echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu --ignore-deps linbox/element/Makefile'; \
- $(am__cd) $(top_srcdir) && \
- $(AUTOMAKE) --gnu --ignore-deps linbox/element/Makefile
-.PRECIOUS: Makefile
-Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
- @case '$?' in \
- *config.status*) \
- cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
- *) \
- echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
- cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
- esac;
-
-$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
- cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-
-$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
- cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
- cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-$(am__aclocal_m4_deps):
-
-mostlyclean-libtool:
- -rm -f *.lo
-
-clean-libtool:
- -rm -rf .libs _libs
-install-pkgincludesubHEADERS: $(pkgincludesub_HEADERS)
- @$(NORMAL_INSTALL)
- @list='$(pkgincludesub_HEADERS)'; test -n "$(pkgincludesubdir)" || list=; \
- if test -n "$$list"; then \
- echo " $(MKDIR_P) '$(DESTDIR)$(pkgincludesubdir)'"; \
- $(MKDIR_P) "$(DESTDIR)$(pkgincludesubdir)" || exit 1; \
- fi; \
- for p in $$list; do \
- if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
- echo "$$d$$p"; \
- done | $(am__base_list) | \
- while read files; do \
- echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(pkgincludesubdir)'"; \
- $(INSTALL_HEADER) $$files "$(DESTDIR)$(pkgincludesubdir)" || exit $$?; \
- done
-
-uninstall-pkgincludesubHEADERS:
- @$(NORMAL_UNINSTALL)
- @list='$(pkgincludesub_HEADERS)'; test -n "$(pkgincludesubdir)" || list=; \
- files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
- dir='$(DESTDIR)$(pkgincludesubdir)'; $(am__uninstall_files_from_dir)
-
-ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
- list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
- unique=`for i in $$list; do \
- if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
- done | \
- $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
- END { if (nonempty) { for (i in files) print i; }; }'`; \
- mkid -fID $$unique
-tags: TAGS
-
-TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
- $(TAGS_FILES) $(LISP)
- set x; \
- here=`pwd`; \
- list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
- unique=`for i in $$list; do \
- if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
- done | \
- $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
- END { if (nonempty) { for (i in files) print i; }; }'`; \
- shift; \
- if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
- test -n "$$unique" || unique=$$empty_fix; \
- if test $$# -gt 0; then \
- $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
- "$$@" $$unique; \
- else \
- $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
- $$unique; \
- fi; \
- fi
-ctags: CTAGS
-CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
- $(TAGS_FILES) $(LISP)
- list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
- unique=`for i in $$list; do \
- if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
- done | \
- $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
- END { if (nonempty) { for (i in files) print i; }; }'`; \
- test -z "$(CTAGS_ARGS)$$unique" \
- || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
- $$unique
-
-GTAGS:
- here=`$(am__cd) $(top_builddir) && pwd` \
- && $(am__cd) $(top_srcdir) \
- && gtags -i $(GTAGS_ARGS) "$$here"
-
-distclean-tags:
- -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
-
-distdir: $(DISTFILES)
- @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
- topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
- list='$(DISTFILES)'; \
- dist_files=`for file in $$list; do echo $$file; done | \
- sed -e "s|^$$srcdirstrip/||;t" \
- -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
- case $$dist_files in \
- */*) $(MKDIR_P) `echo "$$dist_files" | \
- sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
- sort -u` ;; \
- esac; \
- for file in $$dist_files; do \
- if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
- if test -d $$d/$$file; then \
- dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
- if test -d "$(distdir)/$$file"; then \
- find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
- fi; \
- if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
- cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
- find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
- fi; \
- cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
- else \
- test -f "$(distdir)/$$file" \
- || cp -p $$d/$$file "$(distdir)/$$file" \
- || exit 1; \
- fi; \
- done
-check-am: all-am
-check: check-am
-all-am: Makefile $(HEADERS)
-installdirs:
- for dir in "$(DESTDIR)$(pkgincludesubdir)"; do \
- test -z "$$dir" || $(MKDIR_P) "$$dir"; \
- done
-install: install-am
-install-exec: install-exec-am
-install-data: install-data-am
-uninstall: uninstall-am
-
-install-am: all-am
- @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
-
-installcheck: installcheck-am
-install-strip:
- if test -z '$(STRIP)'; then \
- $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
- install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
- install; \
- else \
- $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
- install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
- "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
- fi
-mostlyclean-generic:
-
-clean-generic:
-
-distclean-generic:
- -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
- -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
-
-maintainer-clean-generic:
- @echo "This command is intended for maintainers to use"
- @echo "it deletes files that may require special tools to rebuild."
-clean: clean-am
-
-clean-am: clean-generic clean-libtool mostlyclean-am
-
-distclean: distclean-am
- -rm -f Makefile
-distclean-am: clean-am distclean-generic distclean-tags
-
-dvi: dvi-am
-
-dvi-am:
-
-html: html-am
-
-html-am:
-
-info: info-am
-
-info-am:
-
-install-data-am: install-pkgincludesubHEADERS
-
-install-dvi: install-dvi-am
-
-install-dvi-am:
-
-install-exec-am:
-
-install-html: install-html-am
-
-install-html-am:
-
-install-info: install-info-am
-
-install-info-am:
-
-install-man:
-
-install-pdf: install-pdf-am
-
-install-pdf-am:
-
-install-ps: install-ps-am
-
-install-ps-am:
-
-installcheck-am:
-
-maintainer-clean: maintainer-clean-am
- -rm -f Makefile
-maintainer-clean-am: distclean-am maintainer-clean-generic
-
-mostlyclean: mostlyclean-am
-
-mostlyclean-am: mostlyclean-generic mostlyclean-libtool
-
-pdf: pdf-am
-
-pdf-am:
-
-ps: ps-am
-
-ps-am:
-
-uninstall-am: uninstall-pkgincludesubHEADERS
-
-.MAKE: install-am install-strip
-
-.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \
- clean-libtool ctags distclean distclean-generic \
- distclean-libtool distclean-tags distdir dvi dvi-am html \
- html-am info info-am install install-am install-data \
- install-data-am install-dvi install-dvi-am install-exec \
- install-exec-am install-html install-html-am install-info \
- install-info-am install-man install-pdf install-pdf-am \
- install-pkgincludesubHEADERS install-ps install-ps-am \
- install-strip installcheck installcheck-am installdirs \
- maintainer-clean maintainer-clean-generic mostlyclean \
- mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
- tags uninstall uninstall-am uninstall-pkgincludesubHEADERS
-
-
-# Copyright (c) 2010 the LinBox group
-# This file is part of LinBox
-# ========LICENCE========
-# This file is part of the library LinBox.
-#
- LinBox is free software: you can redistribute it and/or modify
-
-# Tell versions [3.59,3.63) of GNU make to not export all variables.
-# Otherwise a system limit (for SysV at least) may be exceeded.
-.NOEXPORT:
diff --git a/linbox/element/abstract.h b/linbox/element/abstract.h
index b1aa86f..5f96f41 100644
--- a/linbox/element/abstract.h
+++ b/linbox/element/abstract.h
@@ -77,11 +77,10 @@ namespace LinBox
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
// Local Variables:
// mode: C++
// tab-width: 8
// indent-tabs-mode: nil
// c-basic-offset: 8
// End:
-
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/element/envelope.h b/linbox/element/envelope.h
index e8838ff..6b61eee 100644
--- a/linbox/element/envelope.h
+++ b/linbox/element/envelope.h
@@ -114,11 +114,10 @@ namespace LinBox
#endif // __LINBOX_element_envelope_H
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
// Local Variables:
// mode: C++
// tab-width: 8
// indent-tabs-mode: nil
// c-basic-offset: 8
// End:
-
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/field/Givaro/Makefile.am b/linbox/field/Givaro/Makefile.am
deleted file mode 100644
index 9065a7b..0000000
--- a/linbox/field/Givaro/Makefile.am
+++ /dev/null
@@ -1,42 +0,0 @@
-# Copyright (c) 2010 the LinBox group
-# ========LICENCE========
-# This file is part of the library LinBox.
-#
-# LinBox is free software: you can redistribute it and/or modify
-# it under the terms of the GNU Lesser General Public
-# License as published by the Free Software Foundation; either
-# version 2.1 of the License, or (at your option) any later version.
-#
-# This library 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
-# Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public
-# License along with this library; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
-# ========LICENCE========
-
-
-
-pkgincludesubdir=$(pkgincludedir)/field/Givaro
-
-GIVARO_HDRS = \
- givaro-zpz.h \
- givaro-montg.h \
- givaro-zpz.inl \
- givaro-gfq.h \
- givaro-extension.h \
- givaro-field.h \
- givaro-field-gf2.h \
- givaro-rational.h
-
-if LINBOX_HAVE_GIVARO
-USE_GIVARO_HDRS = $(GIVARO_HDRS)
-endif
-
-pkgincludesub_HEADERS = \
- $(USE_GIVARO_HDRS)
-
-# EXTRA_DIST = \
- # givaro.doxy
diff --git a/linbox/field/Givaro/Makefile.in b/linbox/field/Givaro/Makefile.in
deleted file mode 100644
index e270249..0000000
--- a/linbox/field/Givaro/Makefile.in
+++ /dev/null
@@ -1,591 +0,0 @@
-# Makefile.in generated by automake 1.11.5 from Makefile.am.
-# @configure_input@
-
-# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software
-# Foundation, Inc.
-# This Makefile.in is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
-# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
-# PARTICULAR PURPOSE.
-
- at SET_MAKE@
-
-# Copyright (c) 2010 the LinBox group
-# ========LICENCE========
-# This file is part of the library LinBox.
-#
-# LinBox is free software: you can redistribute it and/or modify
-# it under the terms of the GNU Lesser General Public
-# License as published by the Free Software Foundation; either
-# version 2.1 of the License, or (at your option) any later version.
-#
-# This library 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
-# Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public
-# License along with this library; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
-# ========LICENCE========
-
-VPATH = @srcdir@
-am__make_dryrun = \
- { \
- am__dry=no; \
- case $$MAKEFLAGS in \
- *\\[\ \ ]*) \
- echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \
- | grep '^AM OK$$' >/dev/null || am__dry=yes;; \
- *) \
- for am__flg in $$MAKEFLAGS; do \
- case $$am__flg in \
- *=*|--*) ;; \
- *n*) am__dry=yes; break;; \
- esac; \
- done;; \
- esac; \
- test $$am__dry = yes; \
- }
-pkgdatadir = $(datadir)/@PACKAGE@
-pkgincludedir = $(includedir)/@PACKAGE@
-pkglibdir = $(libdir)/@PACKAGE@
-pkglibexecdir = $(libexecdir)/@PACKAGE@
-am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
-install_sh_DATA = $(install_sh) -c -m 644
-install_sh_PROGRAM = $(install_sh) -c
-install_sh_SCRIPT = $(install_sh) -c
-INSTALL_HEADER = $(INSTALL_DATA)
-transform = $(program_transform_name)
-NORMAL_INSTALL = :
-PRE_INSTALL = :
-POST_INSTALL = :
-NORMAL_UNINSTALL = :
-PRE_UNINSTALL = :
-POST_UNINSTALL = :
-build_triplet = @build@
-host_triplet = @host@
-subdir = linbox/field/Givaro
-DIST_COMMON = $(am__pkgincludesub_HEADERS_DIST) $(srcdir)/Makefile.am \
- $(srcdir)/Makefile.in
-ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-am__aclocal_m4_deps = $(top_srcdir)/macros/aclocal-include.m4 \
- $(top_srcdir)/macros/config-header.m4 \
- $(top_srcdir)/macros/debug.m4 \
- $(top_srcdir)/macros/expat-check.m4 \
- $(top_srcdir)/macros/fflas-ffpack-check.m4 \
- $(top_srcdir)/macros/fplll-check.m4 \
- $(top_srcdir)/macros/givaro-check.m4 \
- $(top_srcdir)/macros/gmp-check.m4 \
- $(top_srcdir)/macros/iml-check.m4 \
- $(top_srcdir)/macros/lapack-check.m4 \
- $(top_srcdir)/macros/libtool.m4 \
- $(top_srcdir)/macros/lidia-check.m4 \
- $(top_srcdir)/macros/linbox-benchmark.m4 \
- $(top_srcdir)/macros/linbox-doc.m4 \
- $(top_srcdir)/macros/linbox-misc.m4 \
- $(top_srcdir)/macros/linbox-opt.m4 \
- $(top_srcdir)/macros/ltoptions.m4 \
- $(top_srcdir)/macros/ltsugar.m4 \
- $(top_srcdir)/macros/ltversion.m4 \
- $(top_srcdir)/macros/lt~obsolete.m4 \
- $(top_srcdir)/macros/m4ri-check.m4 \
- $(top_srcdir)/macros/m4rie-check.m4 \
- $(top_srcdir)/macros/maple-check.m4 \
- $(top_srcdir)/macros/mpfr-check.m4 \
- $(top_srcdir)/macros/ntl-check.m4 \
- $(top_srcdir)/macros/saclib-check.m4 \
- $(top_srcdir)/macros/sage-check.m4 $(top_srcdir)/configure.ac
-am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
- $(ACLOCAL_M4)
-mkinstalldirs = $(install_sh) -d
-CONFIG_HEADER = $(top_builddir)/config.h
-CONFIG_CLEAN_FILES =
-CONFIG_CLEAN_VPATH_FILES =
-depcomp =
-am__depfiles_maybe =
-SOURCES =
-DIST_SOURCES =
-am__can_run_installinfo = \
- case $$AM_UPDATE_INFO_DIR in \
- n|no|NO) false;; \
- *) (install-info --version) >/dev/null 2>&1;; \
- esac
-am__pkgincludesub_HEADERS_DIST = givaro-zpz.h givaro-montg.h \
- givaro-zpz.inl givaro-gfq.h givaro-extension.h givaro-field.h \
- givaro-field-gf2.h givaro-rational.h
-am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
-am__vpath_adj = case $$p in \
- $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
- *) f=$$p;; \
- esac;
-am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
-am__install_max = 40
-am__nobase_strip_setup = \
- srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
-am__nobase_strip = \
- for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
-am__nobase_list = $(am__nobase_strip_setup); \
- for p in $$list; do echo "$$p $$p"; done | \
- sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
- $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
- if (++n[$$2] == $(am__install_max)) \
- { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
- END { for (dir in files) print dir, files[dir] }'
-am__base_list = \
- sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
- sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
-am__uninstall_files_from_dir = { \
- test -z "$$files" \
- || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \
- || { echo " ( cd '$$dir' && rm -f" $$files ")"; \
- $(am__cd) "$$dir" && rm -f $$files; }; \
- }
-am__installdirs = "$(DESTDIR)$(pkgincludesubdir)"
-HEADERS = $(pkgincludesub_HEADERS)
-ETAGS = etags
-CTAGS = ctags
-DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
-ACLOCAL = @ACLOCAL@
-AMTAR = @AMTAR@
-AR = @AR@
-AUTOCONF = @AUTOCONF@
-AUTOHEADER = @AUTOHEADER@
-AUTOMAKE = @AUTOMAKE@
-AWK = @AWK@
-BLAS_CFLAGS = @BLAS_CFLAGS@
-BLAS_LIBS = @BLAS_LIBS@
-CC = @CC@
-CCNAM = @CCNAM@
-CFLAGS = @CFLAGS@
-CPPFLAGS = @CPPFLAGS@
-CXX = @CXX@
-CXXCPP = @CXXCPP@
-CXXFLAGS = @CXXFLAGS@
-CYGPATH_W = @CYGPATH_W@
-DBG = @DBG@
-DEBUG_CFLAGS = @DEBUG_CFLAGS@
-DEFAULT_CFLAGS = @DEFAULT_CFLAGS@
-DEFS = @DEFS@
-DLLTOOL = @DLLTOOL@
-DSYMUTIL = @DSYMUTIL@
-DUMPBIN = @DUMPBIN@
-ECHO_C = @ECHO_C@
-ECHO_N = @ECHO_N@
-ECHO_T = @ECHO_T@
-EGREP = @EGREP@
-EXEEXT = @EXEEXT@
-EXPAT_CFLAGS = @EXPAT_CFLAGS@
-EXPAT_LIBS = @EXPAT_LIBS@
-FFLAS_FFPACK_CFLAGS = @FFLAS_FFPACK_CFLAGS@
-FFLAS_FFPACK_LIBS = @FFLAS_FFPACK_LIBS@
-FFLAS_FFPACK_LOC = @FFLAS_FFPACK_LOC@
-FGREP = @FGREP@
-FPLLL_CFLAGS = @FPLLL_CFLAGS@
-FPLLL_LIBS = @FPLLL_LIBS@
-GIVARO_CFLAGS = @GIVARO_CFLAGS@
-GIVARO_LIBS = @GIVARO_LIBS@
-GMP_CFLAGS = @GMP_CFLAGS@
-GMP_LIBS = @GMP_LIBS@
-GMP_VERSION = @GMP_VERSION@
-GREP = @GREP@
-IML_CFLAGS = @IML_CFLAGS@
-IML_LIBS = @IML_LIBS@
-INSTALL = @INSTALL@
-INSTALL_DATA = @INSTALL_DATA@
-INSTALL_PROGRAM = @INSTALL_PROGRAM@
-INSTALL_SCRIPT = @INSTALL_SCRIPT@
-INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
-LD = @LD@
-LDFLAGS = @LDFLAGS@
-LIBOBJS = @LIBOBJS@
-LIBS = @LIBS@
-LIBTOOL = @LIBTOOL@
-LIDIA_CFLAGS = @LIDIA_CFLAGS@
-LIDIA_LIBS = @LIDIA_LIBS@
-LINBOX_BENCH_PATH = @LINBOX_BENCH_PATH@
-LINBOX_DOC_PATH = @LINBOX_DOC_PATH@
-LIPO = @LIPO@
-LN_S = @LN_S@
-LTLIBOBJS = @LTLIBOBJS@
-M4RIE_CFLAGS = @M4RIE_CFLAGS@
-M4RIE_LIBS = @M4RIE_LIBS@
-M4RI_CFLAGS = @M4RI_CFLAGS@
-M4RI_LIBS = @M4RI_LIBS@
-MAINT = @MAINT@
-MAKEINFO = @MAKEINFO@
-MANIFEST_TOOL = @MANIFEST_TOOL@
-MAPLE_CFLAGS = @MAPLE_CFLAGS@
-MAPLE_HOME = @MAPLE_HOME@
-MAPLE_LIBS = @MAPLE_LIBS@
-MAPLE_VERSION = @MAPLE_VERSION@
-MKDIR_P = @MKDIR_P@
-MPFR_CFLAGS = @MPFR_CFLAGS@
-MPFR_LIBS = @MPFR_LIBS@
-NM = @NM@
-NMEDIT = @NMEDIT@
-NTL_CFLAGS = @NTL_CFLAGS@
-NTL_LIBS = @NTL_LIBS@
-OBJDUMP = @OBJDUMP@
-OBJEXT = @OBJEXT@
-OTOOL = @OTOOL@
-OTOOL64 = @OTOOL64@
-PACKAGE = @PACKAGE@
-PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
-PACKAGE_NAME = @PACKAGE_NAME@
-PACKAGE_STRING = @PACKAGE_STRING@
-PACKAGE_TARNAME = @PACKAGE_TARNAME@
-PACKAGE_URL = @PACKAGE_URL@
-PACKAGE_VERSION = @PACKAGE_VERSION@
-PATH_SEPARATOR = @PATH_SEPARATOR@
-PROF = @PROF@
-RANLIB = @RANLIB@
-RM = @RM@
-SACLIB_CFLAGS = @SACLIB_CFLAGS@
-SACLIB_LIBS = @SACLIB_LIBS@
-SED = @SED@
-SET_MAKE = @SET_MAKE@
-SHELL = @SHELL@
-STRIP = @STRIP@
-TESTS_CFLAGS = @TESTS_CFLAGS@
-VERSION = @VERSION@
-WARN = @WARN@
-abs_builddir = @abs_builddir@
-abs_srcdir = @abs_srcdir@
-abs_top_builddir = @abs_top_builddir@
-abs_top_srcdir = @abs_top_srcdir@
-ac_ct_AR = @ac_ct_AR@
-ac_ct_CC = @ac_ct_CC@
-ac_ct_CXX = @ac_ct_CXX@
-ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
-am__leading_dot = @am__leading_dot@
-am__tar = @am__tar@
-am__untar = @am__untar@
-bindir = @bindir@
-build = @build@
-build_alias = @build_alias@
-build_cpu = @build_cpu@
-build_os = @build_os@
-build_vendor = @build_vendor@
-builddir = @builddir@
-datadir = @datadir@
-datarootdir = @datarootdir@
-docdir = @docdir@
-dvidir = @dvidir@
-exec_prefix = @exec_prefix@
-host = @host@
-host_alias = @host_alias@
-host_cpu = @host_cpu@
-host_os = @host_os@
-host_vendor = @host_vendor@
-htmldir = @htmldir@
-includedir = @includedir@
-infodir = @infodir@
-install_sh = @install_sh@
-libdir = @libdir@
-libexecdir = @libexecdir@
-localedir = @localedir@
-localstatedir = @localstatedir@
-mandir = @mandir@
-mkdir_p = @mkdir_p@
-oldincludedir = @oldincludedir@
-pdfdir = @pdfdir@
-prefix = @prefix@
-program_transform_name = @program_transform_name@
-psdir = @psdir@
-sbindir = @sbindir@
-sharedstatedir = @sharedstatedir@
-srcdir = @srcdir@
-sysconfdir = @sysconfdir@
-target_alias = @target_alias@
-top_build_prefix = @top_build_prefix@
-top_builddir = @top_builddir@
-top_srcdir = @top_srcdir@
-pkgincludesubdir = $(pkgincludedir)/field/Givaro
-GIVARO_HDRS = \
- givaro-zpz.h \
- givaro-montg.h \
- givaro-zpz.inl \
- givaro-gfq.h \
- givaro-extension.h \
- givaro-field.h \
- givaro-field-gf2.h \
- givaro-rational.h
-
- at LINBOX_HAVE_GIVARO_TRUE@USE_GIVARO_HDRS = $(GIVARO_HDRS)
-pkgincludesub_HEADERS = \
- $(USE_GIVARO_HDRS)
-
-all: all-am
-
-.SUFFIXES:
-$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps)
- @for dep in $?; do \
- case '$(am__configure_deps)' in \
- *$$dep*) \
- ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
- && { if test -f $@; then exit 0; else break; fi; }; \
- exit 1;; \
- esac; \
- done; \
- echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu --ignore-deps linbox/field/Givaro/Makefile'; \
- $(am__cd) $(top_srcdir) && \
- $(AUTOMAKE) --gnu --ignore-deps linbox/field/Givaro/Makefile
-.PRECIOUS: Makefile
-Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
- @case '$?' in \
- *config.status*) \
- cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
- *) \
- echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
- cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
- esac;
-
-$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
- cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-
-$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
- cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
- cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-$(am__aclocal_m4_deps):
-
-mostlyclean-libtool:
- -rm -f *.lo
-
-clean-libtool:
- -rm -rf .libs _libs
-install-pkgincludesubHEADERS: $(pkgincludesub_HEADERS)
- @$(NORMAL_INSTALL)
- @list='$(pkgincludesub_HEADERS)'; test -n "$(pkgincludesubdir)" || list=; \
- if test -n "$$list"; then \
- echo " $(MKDIR_P) '$(DESTDIR)$(pkgincludesubdir)'"; \
- $(MKDIR_P) "$(DESTDIR)$(pkgincludesubdir)" || exit 1; \
- fi; \
- for p in $$list; do \
- if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
- echo "$$d$$p"; \
- done | $(am__base_list) | \
- while read files; do \
- echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(pkgincludesubdir)'"; \
- $(INSTALL_HEADER) $$files "$(DESTDIR)$(pkgincludesubdir)" || exit $$?; \
- done
-
-uninstall-pkgincludesubHEADERS:
- @$(NORMAL_UNINSTALL)
- @list='$(pkgincludesub_HEADERS)'; test -n "$(pkgincludesubdir)" || list=; \
- files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
- dir='$(DESTDIR)$(pkgincludesubdir)'; $(am__uninstall_files_from_dir)
-
-ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
- list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
- unique=`for i in $$list; do \
- if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
- done | \
- $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
- END { if (nonempty) { for (i in files) print i; }; }'`; \
- mkid -fID $$unique
-tags: TAGS
-
-TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
- $(TAGS_FILES) $(LISP)
- set x; \
- here=`pwd`; \
- list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
- unique=`for i in $$list; do \
- if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
- done | \
- $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
- END { if (nonempty) { for (i in files) print i; }; }'`; \
- shift; \
- if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
- test -n "$$unique" || unique=$$empty_fix; \
- if test $$# -gt 0; then \
- $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
- "$$@" $$unique; \
- else \
- $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
- $$unique; \
- fi; \
- fi
-ctags: CTAGS
-CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
- $(TAGS_FILES) $(LISP)
- list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
- unique=`for i in $$list; do \
- if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
- done | \
- $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
- END { if (nonempty) { for (i in files) print i; }; }'`; \
- test -z "$(CTAGS_ARGS)$$unique" \
- || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
- $$unique
-
-GTAGS:
- here=`$(am__cd) $(top_builddir) && pwd` \
- && $(am__cd) $(top_srcdir) \
- && gtags -i $(GTAGS_ARGS) "$$here"
-
-distclean-tags:
- -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
-
-distdir: $(DISTFILES)
- @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
- topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
- list='$(DISTFILES)'; \
- dist_files=`for file in $$list; do echo $$file; done | \
- sed -e "s|^$$srcdirstrip/||;t" \
- -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
- case $$dist_files in \
- */*) $(MKDIR_P) `echo "$$dist_files" | \
- sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
- sort -u` ;; \
- esac; \
- for file in $$dist_files; do \
- if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
- if test -d $$d/$$file; then \
- dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
- if test -d "$(distdir)/$$file"; then \
- find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
- fi; \
- if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
- cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
- find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
- fi; \
- cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
- else \
- test -f "$(distdir)/$$file" \
- || cp -p $$d/$$file "$(distdir)/$$file" \
- || exit 1; \
- fi; \
- done
-check-am: all-am
-check: check-am
-all-am: Makefile $(HEADERS)
-installdirs:
- for dir in "$(DESTDIR)$(pkgincludesubdir)"; do \
- test -z "$$dir" || $(MKDIR_P) "$$dir"; \
- done
-install: install-am
-install-exec: install-exec-am
-install-data: install-data-am
-uninstall: uninstall-am
-
-install-am: all-am
- @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
-
-installcheck: installcheck-am
-install-strip:
- if test -z '$(STRIP)'; then \
- $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
- install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
- install; \
- else \
- $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
- install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
- "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
- fi
-mostlyclean-generic:
-
-clean-generic:
-
-distclean-generic:
- -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
- -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
-
-maintainer-clean-generic:
- @echo "This command is intended for maintainers to use"
- @echo "it deletes files that may require special tools to rebuild."
-clean: clean-am
-
-clean-am: clean-generic clean-libtool mostlyclean-am
-
-distclean: distclean-am
- -rm -f Makefile
-distclean-am: clean-am distclean-generic distclean-tags
-
-dvi: dvi-am
-
-dvi-am:
-
-html: html-am
-
-html-am:
-
-info: info-am
-
-info-am:
-
-install-data-am: install-pkgincludesubHEADERS
-
-install-dvi: install-dvi-am
-
-install-dvi-am:
-
-install-exec-am:
-
-install-html: install-html-am
-
-install-html-am:
-
-install-info: install-info-am
-
-install-info-am:
-
-install-man:
-
-install-pdf: install-pdf-am
-
-install-pdf-am:
-
-install-ps: install-ps-am
-
-install-ps-am:
-
-installcheck-am:
-
-maintainer-clean: maintainer-clean-am
- -rm -f Makefile
-maintainer-clean-am: distclean-am maintainer-clean-generic
-
-mostlyclean: mostlyclean-am
-
-mostlyclean-am: mostlyclean-generic mostlyclean-libtool
-
-pdf: pdf-am
-
-pdf-am:
-
-ps: ps-am
-
-ps-am:
-
-uninstall-am: uninstall-pkgincludesubHEADERS
-
-.MAKE: install-am install-strip
-
-.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \
- clean-libtool ctags distclean distclean-generic \
- distclean-libtool distclean-tags distdir dvi dvi-am html \
- html-am info info-am install install-am install-data \
- install-data-am install-dvi install-dvi-am install-exec \
- install-exec-am install-html install-html-am install-info \
- install-info-am install-man install-pdf install-pdf-am \
- install-pkgincludesubHEADERS install-ps install-ps-am \
- install-strip installcheck installcheck-am installdirs \
- maintainer-clean maintainer-clean-generic mostlyclean \
- mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
- tags uninstall uninstall-am uninstall-pkgincludesubHEADERS
-
-
-# EXTRA_DIST = \
-# # givaro.doxy
-
-# Tell versions [3.59,3.63) of GNU make to not export all variables.
-# Otherwise a system limit (for SysV at least) may be exceeded.
-.NOEXPORT:
diff --git a/linbox/field/Givaro/givaro-extension.h b/linbox/field/Givaro/givaro-extension.h
deleted file mode 100644
index 2031d19..0000000
--- a/linbox/field/Givaro/givaro-extension.h
+++ /dev/null
@@ -1,321 +0,0 @@
-/* linbox/field/givaro-gfq.h
- * Copyright (C) 2005 JGD
- *
- * Time-stamp: <22 Jun 10 10:02:34 Jean-Guillaume.Dumas at imag.fr>
- * ------------------------------------
- *
- *
- * ========LICENCE========
- * This file is part of the library LinBox.
- *
- * LinBox is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- * ========LICENCE========
- *.
- */
-
-/*! @file field/Givaro/givaro-extension.h
- * @ingroup field
- * @brief NO DOC
- */
-
-#ifndef __LINBOX_field_givaro_extension_H
-#define __LINBOX_field_givaro_extension_H
-
-
-#include "linbox/linbox-config.h"
-#include "linbox/integer.h"
-#include "linbox/field/field-traits.h"
-#include "linbox/field/field-interface.h"
-#include "linbox/util/debug.h"
-#include "linbox/field/field-traits.h"
-#include "linbox/field/Givaro/givaro-gfq.h"
-
-#ifdef __LINBOX_XMLENABLED
-
-#include "linbox/util/xml/linbox-reader.h"
-#include "linbox/util/xml/linbox-writer.h"
-
-#include <iostream>
-#include <string>
-#include <vector>
-
-#endif //__LINBOX_XMLENABLED
-
-//---------------------------------------------
-// Files of Givaro library
-#include <givaro/givextension.h>
-#include <givaro/giv_randiter.h>
-//---------------------------------------------
-// To convert linbox fields to Givaro interface
-#include "linbox/field/Givaro/givaro-field.h"
-
-//---------------------------------------------
-// Namespace in which all LinBox code resides
-namespace LinBox
-{
-
- template <class Ring>
- struct ClassifyRing;
-
- template< class BaseField>
- class GivaroExtension;
-
-// #if !defined(__INTEL_COMPILER) && !defined(__CUDACC__) && !defined(__clang__)
- // template<>
-// #endif
- template< class BaseField>
- struct ClassifyRing<GivaroExtension<BaseField> > {
- typedef RingCategories::ModularTag categoryTag;
- };
-
-// #if !defined(__INTEL_COMPILER) && !defined(__CUDACC__) && !defined(__clang__)
- // template<>
-// #endif
- template< class BaseField>
- struct FieldTraits< GivaroExtension<BaseField> > {
- typedef RingCategories::ModularTag categoryTag;
-
- static integer& maxModulus( integer& i )
- {
- return FieldTraits<BaseField>::maxModulus(i);
- }
-
- static bool goodModulus( const integer& i )
- {
- return FieldTraits<BaseField>::goodModulus(i);
- }
-
- // After that degree might not be correct ...
- static integer& maxExponent( integer& i )
- {
- return i = 2147483648UL;
- }
- static bool goodExponent( const integer& i )
- {
- integer max;
- return ( i >= 1 && i <= maxExponent( max ) );
- }
- };
-
-
- /** This template class is defined to be in phase with the LinBox
- * archetype.
- * Most of all methods are inherited from Extension class
- * of Givaro.
- * These class allow to construct only extension field with a prime characteristic.
- */
- template< class BaseField = LinBox::GivaroGfq>
- class GivaroExtension : public Givaro::Extension<GivaroField<BaseField> >, public FieldInterface {
-
- typedef GivaroExtension<GivaroField<BaseField> > Self_t;
- typedef Givaro::Extension<GivaroField<BaseField> > Extension_t;
- public:
- /** Element type.
- * This type is inherited from the Givaro class Extension
- */
- typedef typename Givaro::Extension<GivaroField<BaseField> >::Element Element;
-
- typedef Givaro:: Extension<GivaroField<BaseField> > Father_t;
-
- using Extension_t::zero;
- using Extension_t::one;
- using Extension_t::mOne;
-
- /** RandIter type.
- * This type is inherited from the Givaro class GFqDom<TAG>
- */
- typedef Givaro::GIV_ExtensionrandIter< Givaro::Extension<GivaroField<BaseField> >, LinBox::integer > RandIter;
-
-
- GivaroExtension()
- {}
-
-
- /** Constructor from an integer.
- */
- GivaroExtension(const integer& p, const integer& k=1) :
- Givaro::Extension<GivaroField<BaseField> >(static_cast<typename Givaro::Extension< GivaroField< BaseField > >::Residu_t >(int32_t(p)), static_cast<typename Givaro::Extension< GivaroField< BaseField > >::Residu_t>(int32_t(k)))
- {
- }
-
- /** Constructor extension of a base field.
- */
- GivaroExtension(const BaseField& bF, const integer& ext=1) :
- Givaro::Extension<GivaroField<BaseField> >( GivaroField<BaseField>(bF),
- static_cast<typename Givaro::Extension< GivaroField< BaseField > >::Residu_t>(int32_t(ext)))
- {
- }
-
-
- /** Copy Constructor
- */
- GivaroExtension(const Self_t& F) :
- Givaro::Extension<GivaroField<BaseField> >(F) {
- }
-
-
- using Givaro::Extension<GivaroField<BaseField> >:: characteristic ;
-#if (GIVARO_VERSION<30403)
- long unsigned int & characteristic(long unsigned int & c) const
- {
- return c = (long unsigned)Givaro::Extension<GivaroField<BaseField> >::characteristic() ;
- }
-#else
- long unsigned int & characteristic(long unsigned int & c) const
- {
- return Givaro::Extension<GivaroField<BaseField> >::characteristic(c) ;
- }
-#endif
-
- }; // class GivaroExtension
-
-
-
- /** This template class is define just to be in phase with the LinBox
- * archetype.
- * Most of all methods are inherited from Extension class
- * of Givaro.
- * these class allow to construct only extension field with a prime characteristic.
- */
-// #ifndef __INTEL_COMPILER
- template<>
-// #endif
- class GivaroExtension<LinBox::GivaroGfq> : public Givaro::Extension< Givaro::GFqDom<int32_t> >, public FieldInterface {
-
- typedef GivaroExtension<GivaroGfq> Self_t;
- typedef Givaro::Extension< Givaro::GFqDom<int32_t> > Extension_t;
- public:
-
- /** Element type.
- * This type is inherited from the Givaro class Extension
- */
- typedef Givaro::Extension< Givaro::GFqDom<int32_t> >::Element Element;
- typedef Givaro::Extension< Givaro::GFqDom<int32_t> > Father_t;
-
- using Extension_t::zero;
- using Extension_t::one;
- using Extension_t::mOne;
-
-
- /** RandIter type.
- * This type is inherited from the Givaro class GFqDom<TAG>
- */
- typedef Givaro::GIV_ExtensionrandIter< Givaro::Extension< Givaro::GFqDom<int32_t> >, LinBox::integer > RandIter;
-
- /** Constructor from an integer.
- */
- GivaroExtension(const integer& p, const integer& k=1) :
- Givaro::Extension< Givaro::GFqDom<int32_t> >(static_cast< Givaro::Extension< Givaro::GFqDom<int32_t> >::Residu_t>(int32_t(p)),
- static_cast< Givaro::Extension< Givaro::GFqDom<int32_t> >::Residu_t>(int32_t(k)))
- {
- }
-
- /** Constructor extension of a base field.
- */
- GivaroExtension(const GivaroGfq& bF, const integer& ext=1) :
- Givaro::Extension< Givaro::GFqDom<int32_t> >( static_cast< const Givaro::Extension< Givaro::GFqDom< int32_t > >::BaseField_t &>(bF),
- static_cast< Givaro::Extension< Givaro::GFqDom<int32_t> >::Residu_t >(int32_t(ext)))
- {
- }
-
-
- /** Copy Constructor.
- */
- GivaroExtension(const Self_t& F) :
- Givaro::Extension< Givaro::GFqDom<int32_t> >(F)
- { }
-
-
- }; // class GivaroExtension
-
-
-
-} // namespace LinBox
-
-
-
-// Specialization of homomorphism for basefield
-#include "linbox/field/hom.h"
-namespace LinBox
-{
- /// NO DOC
- template< class BaseField>
- class Hom < BaseField, GivaroExtension<BaseField> > {
- typedef BaseField Source;
- typedef GivaroExtension<BaseField> Target;
- public:
- typedef typename Source::Element SrcElt;
- typedef typename Target::Element Elt;
-
- //Hom(){}
- /** Constructor.
- * Construct a homomorphism from a specific source ring S and target
- * field T with Hom(S, T). The default behaviour is error.
- * Specializations define all actual homomorphisms.
- */
- Hom(const Source& S, const Target& T) :
- _source(S), _target(T)
- {}
-
- /** Image.
- * image(t, s) implements the homomorphism, assigning the
- * t the value of the image of s under the mapping.
- *
- * The default behaviour is a no-op.
- */
- Elt& image(Elt& t, const SrcElt& s) const
- {
- return _target.assign(t, s);
- }
-
- /** Preimage.
- * If possible, preimage(s,t) assigns a value to s such that
- * the image of s is t. Otherwise behaviour is unspecified.
- * An error may be thrown, a conventional value may be set, or
- * an arb value set.
- *
- * The default behaviour is a no-op.
- */
- SrcElt& preimage(SrcElt& s, const Elt& t) const
- {
- // return _target.getEntry(s, Degree(0), t);
- return _target.convert(s, t);
- }
-
- const Source& source() const
- {
- return _source;
- }
- const Target& target() const
- {
- return _target;
- }
-
- private:
- Source _source;
- Target _target;
- }; // end Hom
-}
-#endif // __LINBOX_field_givaro_extension_H
-
-
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
-// Local Variables:
-// mode: C++
-// tab-width: 8
-// indent-tabs-mode: nil
-// c-basic-offset: 8
-// End:
-
diff --git a/linbox/field/Givaro/givaro-field-gf2.h b/linbox/field/Givaro/givaro-field-gf2.h
deleted file mode 100644
index 750f808..0000000
--- a/linbox/field/Givaro/givaro-field-gf2.h
+++ /dev/null
@@ -1,218 +0,0 @@
-/* linbox/field/givaro-field.h
- * Copyright (C) 2009 JGD
- *
- * ------------------------------------
- *
- *
- * ========LICENCE========
- * This file is part of the library LinBox.
- *
- * LinBox is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- * ========LICENCE========
- *.
- */
-
-#ifndef __LINBOX_givaro_field_gf2_H
-#define __LINBOX_givaro_field_gf2_H
-
-#include "linbox/field/gf2.h"
-#include "linbox/field/Givaro/givaro-field.h"
-
-// Specialization of GivaroField for GF2
-namespace LinBox
-{
-
- /**
- \brief give LinBox fields an allure of Givaro Fields
- \ingroup field
-
- * This class adds the necessary requirements allowing
- * the construction of an extension of a LinBox field.
- */
- template<>
- struct GivaroField<LinBox::GF2> : public LinBox::GF2 {
- typedef LinBox::GF2 BaseField;
- typedef BaseField::Element TT;
- typedef Signed_Trait<TT>::unsigned_type UTT;
- typedef TT Rep;
- typedef GivaroField<BaseField> Self_t;
- typedef Rep Element;
- typedef UTT Residu_t;
-
- Element zero, one;
- GivaroField(const BaseField& bf) :
- BaseField(bf)
- {
- this->init(zero,0UL);
- this->init(one, 1UL);
- }
-
-
- // -- amxy: r <- c - a * b mod p
- Rep& amxy (Rep& r, const Rep a, const Rep b, const Rep c) const
- {
- Rep tmp;
- this->mul(tmp, a, b);
- this->assign(r,c);
- return this->subin(r,tmp);
- }
- stdBitReference amxy (stdBitReference r, const Rep a, const Rep b, const Rep c) const
- {
- Rep tmp;
- this->mul(tmp, a, b);
- this->assign(r,c);
- return this->subin(r,tmp);
- }
-
-
- // -- maxpy: r <- y - a * x
- Rep& maxpy (Rep& r, const Rep a, const Rep x, const Rep y) const
- {
- Rep tmp; this->mul(tmp, a, x);
- return this->sub(r,y,tmp);
- }
- stdBitReference maxpy (stdBitReference r, const Rep a, const Rep x, const Rep y) const
- {
- Rep tmp; this->mul(tmp, a, x);
- return this->sub(r,y,tmp);
- }
- // -- axmyin: r <- a * x - r
- Rep& axmyin (Rep& r, const Rep a, const Rep x) const
- {
- maxpyin(r,a,x);
- return negin(r);
- }
- stdBitReference axmyin (stdBitReference r, const Rep a, const Rep x) const
- {
- maxpyin(r,a,x);
- return negin(r);
- }
- // -- maxpyin: r <- r - a * x
- Rep& maxpyin (Rep& r, const Rep a, const Rep x) const
- {
- Rep tmp; this->mul(tmp, a, x);
- return this->subin(r,tmp);
- }
- stdBitReference maxpyin (stdBitReference r, const Rep a, const Rep x) const
- {
- Rep tmp; this->mul(tmp, a, x);
- return this->subin(r,tmp);
- }
-
-
-
- bool areNEqual ( const Rep a, const Rep b) const
- {
- return ! this->areEqual(a,b);
- }
-
- // Access to the modulus, characteristic, size, exponent
- UTT residu() const
- {
- integer c;
- BaseField::characteristic(c);
- return UTT(c);
- }
-
- UTT characteristic() const
- {
- integer c; BaseField::characteristic(c); return UTT(c);
- }
- UTT cardinality() const
- {
- integer c; BaseField::cardinality(c); return UTT(c);
- }
- UTT exponent() const
- {
- return 1;
- }
- UTT size() const
- {
- integer c;
- BaseField::cardinality(c);
- return UTT(c);
- }
-
-
- // ----- random generators
- template<class RandIter> Rep& random(RandIter& g, Rep& r) const
- {
- return r = g() ;
- }
- template<class RandIter> Rep& random(RandIter& g, Rep& r, long s) const
- {
- return r = g() ;
- }
- template<class RandIter> Rep& random(RandIter& g, Rep& r, const Rep& b) const
- {
- return r = g() ;
- }
- template<class RandIter> Rep& nonzerorandom(RandIter& g, Rep& r) const
- {
- return r = g() ;
- }
- template<class RandIter> Rep& nonzerorandom(RandIter& g, Rep& r, long s) const
- {
- return r = g() ;
- }
- template<class RandIter> Rep& nonzerorandom(RandIter& g, Rep& r, const Rep& b) const
- {
- return r = g() ;
- }
-
- template<class RandIter> stdBitReference random(RandIter& g, stdBitReference r) const
- {
- return r = g() ;
- }
- template<class RandIter> stdBitReference random(RandIter& g, stdBitReference r, long s) const
- {
- return r = g() ;
- }
- template<class RandIter> stdBitReference random(RandIter& g, stdBitReference r, const stdBitReference b) const
- {
- return r = g() ;
- }
- template<class RandIter> stdBitReference nonzerorandom(RandIter& g, stdBitReference r) const
- {
- return r = g() ;
- }
- template<class RandIter> stdBitReference nonzerorandom(RandIter& g, stdBitReference r, long s) const
- {
- return r = g() ;
- }
- template<class RandIter> stdBitReference nonzerorandom(RandIter& g, stdBitReference r, const Rep& b) const
- {
- return r = g() ;
- }
- template<class RandIter> stdBitReference nonzerorandom(RandIter& g, stdBitReference r, const stdBitReference b) const
- {
- return r = g() ;
- }
-
- };
-
-}
-
-#endif // __LINBOX_givaro_field_gf2_H
-
-
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
-// Local Variables:
-// mode: C++
-// tab-width: 8
-// indent-tabs-mode: nil
-// c-basic-offset: 8
-// End:
-
diff --git a/linbox/field/Givaro/givaro-field.h b/linbox/field/Givaro/givaro-field.h
deleted file mode 100644
index e911211..0000000
--- a/linbox/field/Givaro/givaro-field.h
+++ /dev/null
@@ -1,200 +0,0 @@
-/* linbox/field/givaro-field.h
- * Copyright (C) 2009 JGD
- *
- * ------------------------------------
- *
- *
- * ========LICENCE========
- * This file is part of the library LinBox.
- *
- * LinBox is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- * ========LICENCE========
- *.
- */
-
-#ifndef __LINBOX_givaro_field_H
-#define __LINBOX_givaro_field_H
-
-#include <givaro/givconfig.h>
-#include "linbox/integer.h"
-#include "linbox/field/field-traits.h"
-#include "linbox/field/field-interface.h"
-
-namespace LinBox
-{
-
- /**
- \brief give LinBox fields an allure of Givaro Fields
- \ingroup field
-
- * This class adds the necessary requirements allowing
- * the construction of an extension of a LinBox field
- * or a givaro polynomial of a LinBox field ...
- */
- template< class BaseField >
- struct GivaroField : public BaseField {
- typedef typename BaseField::Element TT;
- typedef typename Signed_Trait<TT>::unsigned_type UTT;
- typedef TT Rep;
- typedef GivaroField<BaseField> Self_t;
- typedef Rep Element;
- typedef UTT Residu_t;
-
- Element zero, one, mOne;
- GivaroField() :
- BaseField()
- {
- this->init(zero,0UL);
- this->init(one, 1UL);
- this->init(mOne);
- this->neg(mOne,one);
- }
-
- GivaroField(const BaseField& bf) :
- BaseField(bf)
- {
- this->init(zero,0UL);
- this->init(one, 1UL);
- this->init(mOne);
- this->neg(mOne,one);
- // neg(init(mOne),one);
- }
-
-
- // -- axmy: r <- a * x - y
- Rep& axmy (Rep& r, const Rep a, const Rep x, const Rep y) const
- {
- Rep tmp; this->mul(tmp, a, x);
- return this->sub(r,tmp,y);
- }
-
- // -- maxpy: r <- y - a * x
- Rep& maxpy (Rep& r, const Rep a, const Rep x, const Rep y) const
- {
- Rep tmp; this->mul(tmp, a, x);
- return this->sub(r,y,tmp);
- }
-
- // -- axmyin: r <- a * x - r
- Rep& axmyin (Rep& r, const Rep a, const Rep x) const
- {
- maxpyin(r,a,x);
- return negin(r);
- }
-
- // -- maxpyin: r <- r - a * x
- Rep& maxpyin (Rep& r, const Rep a, const Rep x) const
- {
- Rep tmp; this->mul(tmp, a, x);
- return this->subin(r,tmp);
- }
-
- bool areNEqual ( const Rep a, const Rep b) const
- {
- return ! this->areEqual(a,b);
- }
-
- // Access to the modulus, characteristic, size, exponent
- UTT residu() const
- {
- integer c;
- BaseField::characteristic(c);
- return UTT(c);
- }
-
- UTT characteristic() const
- {
- integer c;
- BaseField::characteristic(c);
- return UTT(c);
- }
-
- integer& characteristic(integer& i) const
- {
- return BaseField::characteristic(i);
- }
-
- UTT cardinality() const
- {
- integer c;
- BaseField::cardinality(c);
- return UTT(c);
- }
-
- UTT exponent() const
- {
- return 1;
- }
-
- UTT size() const
- {
- integer c;
- BaseField::cardinality(c);
- return UTT(c);
- }
-
-
- // ----- random generators
- template<class RandIter> Rep& random(RandIter& g, Rep& r) const
- {
- return this->init(r,g()) ;
- }
-
- template<class RandIter> Rep& random(RandIter& g, Rep& r, long s) const
- {
- return this->init(r,g()) ;
- }
-
- template<class RandIter> Rep& random(RandIter& g, Rep& r, const Rep& b) const
- {
- return this->init(r,g()) ;
- }
-
- template<class RandIter> Rep& nonzerorandom(RandIter& g, Rep& r) const
- {
- do { this->init(r,g()); } while( this->isZero(r) );
- return r;
- }
-
- template<class RandIter> Rep& nonzerorandom(RandIter& g, Rep& r, long s) const
- {
- do { this->init(r,g()); } while( this->isZero(r) );
- return r;
- }
-
- template<class RandIter> Rep& nonzerorandom(RandIter& g, Rep& r, const Rep& b) const
- {
- do { this->init(r,g()); } while( this->isZero(r) ); return r;
- }
-
- };
-
-
-
-} // end namespace LinBox
-//! @bug the following line is a bug.
-#include "linbox/field/Givaro/givaro-field-gf2.h"
-
-#endif // __LINBOX_givaro_field_H
-
-
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
-// Local Variables:
-// mode: C++
-// tab-width: 8
-// indent-tabs-mode: nil
-// c-basic-offset: 8
-// End:
-
diff --git a/linbox/field/Givaro/givaro-gfq.h b/linbox/field/Givaro/givaro-gfq.h
deleted file mode 100644
index 7361dff..0000000
--- a/linbox/field/Givaro/givaro-gfq.h
+++ /dev/null
@@ -1,283 +0,0 @@
-/* linbox/field/givaro-gfq.h
- * Copyright (C) 2002 Pascal Giorgi
- *
- * Written by Pascal Giorgi <pascal.giorgi at ens-lyon.fr>
- * JGD 12.06.2002 : -- I don't see the need of *(new in convert
- * JGD 19.09.2003 : added isZero
- * WJT 24.06.2005 : Removed using declarations
- *
- * ------------------------------------
- *
- *
- * ========LICENCE========
- * This file is part of the library LinBox.
- *
- * LinBox is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- * ========LICENCE========
- *.
- */
-
-/*! @file field/Givaro/givaro-gfq.h
- *
- * @warning This wrapper works only with an improved version of Givaro ;
- * This version of givaro won't be available for public yet ;
- * But it is available on my web page ;
- * You can send me a mail to get it or for others details.
- */
-
-#ifndef __LINBOX_field_givaro_gfq_H
-#define __LINBOX_field_givaro_gfq_H
-
-
-#include "linbox/linbox-config.h"
-#include "linbox/util/debug.h"
-#include "linbox/integer.h"
-#include "linbox/field/field-traits.h"
-#include "linbox/field/field-interface.h"
-
-
-//------------------------------------
-// Files of Givaro library
-
-
-#include <givaro/givtablelimits.h>
-#include <givaro/givgfq.h>
-#include <givaro/giv_randiter.h>
-#include <givaro/givpoly1factor.h>
-//------------------------------------
-
-// Namespace in which all LinBox code resides
-namespace LinBox
-{
-
- template <class Ring>
- struct ClassifyRing;
-
- class GivaroGfq;
-
- template<>
- struct ClassifyRing<GivaroGfq> {
- typedef RingCategories::ModularTag categoryTag;
- };
-
-
- template<>
- inline integer& FieldTraits<GivaroGfq>::maxModulus( integer& i )
- {
- return i = integer( 32749 ); // prevprime( 2^15 )
- }
-
- template<>
- inline bool FieldTraits<GivaroGfq>::goodModulus( const integer& i )
- {
- integer max;
- if( i < 2 || i > FieldTraits<GivaroGfq>::maxModulus(max) )
- return false;
- return probab_prime( i, 10 );
- }
-
- template<>
- inline integer& FieldTraits<GivaroGfq>::maxExponent( integer& i )
- {
- return i = _GIVARO_FF_MAXEXPONENT_; // Cardinality must be <= 2^21
- }
-
-
- /** Wrapper of Givaro's GFqDom<int32_t> class.
- \ingroup field
-
- * This class allows to construct only extension fields with a prime characteristic.
- */
- class GivaroGfq : public Givaro::GFqDom<int32_t>, public FieldInterface {
-
- public:
-
- typedef Givaro::GFqDom<int32_t> Father_t ;
-
- using Father_t::one ;
- using Father_t::zero;
- using Father_t::mOne;
- /** Element type.
- * This type is inherited from the Givaro class GFqDom<int32_t>
- */
- typedef Givaro::GFqDom<int32_t>::Rep Element;
-
- /** RandIter type
- * This type is inherited from the Givaro class GFqDom<TAG>
- */
- typedef Givaro::GIV_randIter< Givaro::GFqDom<int32_t>, LinBox::integer > RandIter;
-
- /** Empty Constructor
- */
- GivaroGfq() :
- Givaro::GFqDom<int32_t>()
- {
- // Givaro::GFqDom<int32_t>::init(one,1);
- // Givaro::GFqDom<int32_t>::init(mOne,-1);
- // Givaro::GFqDom<int32_t>::init(zero,0);
- }
-
- /** Constructor from an integer
- * this constructor use the ZpzDom<TAG> constructor
- */
- GivaroGfq(const integer& p, const integer& k=1) :
- Givaro::GFqDom<int32_t>(static_cast<UTT>(int32_t(p)), static_cast<UTT>(int32_t(k)))
- {
- //enforce that the cardinality must be <2^16, for givaro-gfq
- int32_t pl=p;
- for(int32_t i=1;i<k;++i) pl*=(int32_t)p;
- if(!FieldTraits<GivaroGfq>::goodModulus(p)) {
- throw PreconditionFailed(__func__,__FILE__,__LINE__,"modulus be between 2 and 2^15 and prime");
- }
- else if(pl>(1<<_GIVARO_FF_MAXEXPONENT_)) {
- std::stringstream MSGFFMAXE;
- MSGFFMAXE << "cardinality must be < 2^" << _GIVARO_FF_MAXEXPONENT_;
- throw PreconditionFailed(__func__,__FILE__,__LINE__,MSGFFMAXE.str().c_str());
- }
- // Givaro::GFqDom<int32_t>::init(one,1);
- // Givaro::GFqDom<int32_t>::init(mOne,-1);
- // Givaro::GFqDom<int32_t>::init(zero,0);
-
- }
-
- // This constructor takes a vector of ints that represent the polynomial
- // to use (for modular arithmetic on the extension field).
- GivaroGfq(const integer& p, const integer& k, const std::vector<integer>& modPoly) :
- Givaro::GFqDom<int32_t>(static_cast<UTT>(int32_t(p)), static_cast<UTT>(int32_t(k)), modPoly)
- {
- }
-
- /** Characteristic.
- * Return integer representing characteristic of the domain.
- * Returns a positive integer to all domains with finite characteristic,
- * and returns 0 to signify a domain of infinite characteristic.
- * @return integer representing characteristic of the domain.
- */
- integer& characteristic(integer& c) const
- {
- return c=integer(static_cast<int32_t>( Givaro::GFqDom<int32_t>::characteristic()));
- }
-
- int32_t characteristic() const
- {
- return static_cast<int32_t>( Givaro::GFqDom<int32_t>::characteristic());
- }
-
-#if (GIVARO_VERSION<30403)
- unsigned long characteristic(unsigned long & c) const
- {
- return c = static_cast<int32_t>( Givaro::GFqDom<int32_t>::characteristic());
- }
-#else
- unsigned long characteristic(unsigned long & c) const
- {
- return Givaro::GFqDom<int32_t>::characteristic(c);
- }
-#endif
-
- /** Cardinality.
- * Return integer representing cardinality of the domain.
- * Returns a non-negative integer for all domains with finite
- * cardinality, and returns -1 to signify a domain of infinite
- * cardinality.
- * @return integer representing cardinality of the domain
- */
- integer& cardinality(integer& c) const
- {
- return c=integer(static_cast<int32_t>( Givaro::GFqDom<int32_t>::size()));
- }
-
-
- integer cardinality() const
- {
- return integer(static_cast<int32_t>( Givaro::GFqDom<int32_t>::cardinality()));
- }
-
-
- /** Initialization of field base Element from an integer.
- * Behaves like C++ allocator construct.
- * This function assumes the output field base Element x has already been
- * constructed, but that it is not already initialized.
- * We assume that the type of Element is short int.
- * this methos is just a simple cast.
- * @return reference to field base Element.
- * @param x field base Element to contain output (reference returned).
- * @param y integer.
- */
- Element& init(Element& x , const integer& y = 0) const
- {
- return Givaro::GFqDom<int32_t>::init( x, int32_t(y % (integer) _q));
- }
-
- // TO BE OPTIMIZED
- Element& init(Element& x , const float y) const
- {
- return Givaro::GFqDom<int32_t>::init( x, (double)y);
- }
-
- template<class YYY>
- Element& init(Element& x , const YYY& y) const
- {
- return Givaro::GFqDom<int32_t>::init( x, y);
- }
-
- /** Conversion of field base Element to an integer.
- * This function assumes the output field base Element x has already been
- * constructed, but that it is not already initialized.
- * @return reference to an integer.
- * @param x integer to contain output (reference returned).
- * @param y constant field base Element.
- */
- integer& convert(integer& x, const Element& y) const
- {
- int32_t tmp;
- return x = integer( Givaro::GFqDom<int32_t>::convert(tmp,y));
- }
- // TO BE OPTIMIZED
- float& convert(float& x, const Element& y) const
- {
- double tmp;
- Givaro::GFqDom<int32_t>::convert( tmp, y);
- return x = (float)tmp;
- }
-
- template<class XXX>
- XXX& convert(XXX& x, const Element& y) const
- {
- return Givaro::GFqDom<int32_t>::convert( x, y);
- }
-
- //bool isZero(const Element& x) const { return Givaro::GFqDom<int32_t>::isZero(x); }
-
-
- }; // class GivaroGfq
-
-
-
-
-
-} // namespace LinBox
-
-#endif // __LINBOX_field_givaro_gfq_H
-
-
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
-// Local Variables:
-// mode: C++
-// tab-width: 8
-// indent-tabs-mode: nil
-// c-basic-offset: 8
-// End:
-
diff --git a/linbox/field/Givaro/givaro-montg.h b/linbox/field/Givaro/givaro-montg.h
deleted file mode 100644
index 51d82ca..0000000
--- a/linbox/field/Givaro/givaro-montg.h
+++ /dev/null
@@ -1,207 +0,0 @@
-/* linbox/field/givaro-gfq.h
- * Copyright (C) 2004 Jean-Guillaume Dumas
- *
- * Written by Jean-Guillaume Dumas <Jean-Guillaume.Dumas at imag.fr>
- *
- * ------------------------------------
- *
- *
- * ========LICENCE========
- * This file is part of the library LinBox.
- *
- * LinBox is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- * ========LICENCE========
- *.
- */
-
-/* WARNING this wrapper works only with an improved version of Givaro.
- * This version of givaro won't be available for public yet.
- * But it is available on my web page.
- * You can send me a mail to get it or for others details.
- */
-
-#ifndef __LINBOX_field_givaro_montgomery_H
-#define __LINBOX_field_givaro_montgomery_H
-
-
-#include "linbox/integer.h"
-#include "linbox/field/field-interface.h"
-#include "linbox/util/debug.h"
-#include "linbox/linbox-config.h"
-#include "linbox/field/field-traits.h"
-
-//------------------------------------
-// Files of Givaro library
-
-
-#include <givaro/givmontg32.h>
-#include <givaro/giv_randiter.h>
-//------------------------------------
-
-// Namespace in which all LinBox code resides
-namespace LinBox
-{
-
-
- template <class Ring>
- struct ClassifyRing;
-
- class GivaroMontg;
-
- template<>
- struct ClassifyRing<GivaroMontg> {
- typedef RingCategories::ModularTag categoryTag;
- };
- /**
- \brief wrapper of Givaro's Givaro::Montgomery< Givaro::Std32>.
- \ingroup field
-
- * This class is a modular representation with a Givaro::Montgomery reduction
- */
- class GivaroMontg : public Givaro::Montgomery< Givaro::Std32>, public FieldInterface {
-
- public:
-
- /** Element type.
- * This type is inherited from the Givaro class Givaro::Montgomery< Givaro::Std32>
- */
- typedef Givaro::Montgomery< Givaro::Std32> Father_t ;
- typedef Father_t::Rep Element;
- using Father_t::one;
- using Father_t::mOne;
- using Father_t::zero;
-
- /** RandIter type
- * This type is inherited from the Givaro class Givaro::Montgomery< Givaro::Std32>
- */
- typedef Givaro::GIV_randIter< Givaro::Montgomery< Givaro::Std32>, LinBox::integer > RandIter;
-
- /** Constructor from an integer
- * this constructor use the ZpzDom<TAG> constructor
- */
- GivaroMontg(const integer& p) :
- Givaro::Montgomery< Givaro::Std32>(static_cast<uint32_t>(long(p)))
- { }
-
- /** Constructor from an integer (takes degree of extension as 2nd parameter, must be 1)
- * this constructor use the ZpzDom<TAG> constructor
- */
- GivaroMontg(const integer& p, const integer& k) :
- Givaro::Montgomery< Givaro::Std32>(static_cast<uint32_t>(long(p)))
- {
-
- if (k!=1)
- throw PreconditionFailed(__func__,__FILE__,__LINE__,"exponent must be 1");
- }
-
- /** Characteristic.
- * Return integer representing characteristic of the domain.
- * Returns a positive integer to all domains with finite characteristic,
- * and returns 0 to signify a domain of infinite characteristic.
- * @return integer representing characteristic of the domain.
- */
- integer& characteristic(integer& c) const
- {
- return c=integer(static_cast<long>( Givaro::Montgomery< Givaro::Std32>::characteristic()));
- }
-
- long characteristic() const
- {
- return static_cast<long>( Givaro::Montgomery< Givaro::Std32>::characteristic());
- }
-
-
- /** Cardinality.
- * Return integer representing cardinality of the domain.
- * Returns a non-negative integer for all domains with finite
- * cardinality, and returns -1 to signify a domain of infinite
- * cardinality.
- * @return integer representing cardinality of the domain
- */
- integer& cardinality(integer& c) const
- {
- return c=integer(static_cast<long>( Givaro::Montgomery< Givaro::Std32>::size()));
- }
-
- long cardinality() const
- {
- return static_cast<long>( Givaro::Montgomery< Givaro::Std32>::size());
- }
-
- /** Initialization of field base Element from an integer.
- * Behaves like C++ allocator construct.
- * This function assumes the output field base Element x has already been
- * constructed, but that it is not already initialized.
- * We assume that the type of Element is short int.
- * this methos is just a simple cast.
- * @return reference to field base Element.
- * @param x field base Element to contain output (reference returned).
- * @param y integer.
- */
- Element& init(Element& x , const integer& y=0) const
- {
- return Givaro::Montgomery< Givaro::Std32>::init( x,long(y % (integer)_p));
- }
-
- Element& init(Element& x , const double y) const
- {
- return Givaro::Montgomery< Givaro::Std32>::init( x, y);
- }
-
- /** Conversion of field base element to an integer.
- * This function assumes the output field base element x has already been
- * constructed, but that it is not already initialized.
- * @return reference to an integer.
- * @param x integer to contain output (reference returned).
- * @param y constant field base element.
- */
- integer& convert(integer& x, const Element& y) const
- {
- long tmp;
- // return x = *(new integer(Montgomery< Givaro::Std32>::convert(tmp,y)));
- return x = integer( Givaro::Montgomery< Givaro::Std32>::convert(tmp,y));
- }
-
- double& convert(double& x, const Element& y) const
- {
- return Givaro::Montgomery< Givaro::Std32>::convert( x, y);
- }
-
-#if 0 /* isZero */
- bool isZero(const Element& x) const
- {
- return Givaro::Montgomery< Givaro::Std32>::isZero(x);
- }
-#endif
-
- static inline int getMaxModulus() { return 40504; }
-
- }; // class GivaroMontg
-
-
-
-} // namespace LinBox
-
-#endif // __LINBOX_field_givaro_montgomery_H
-
-
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
-// Local Variables:
-// mode: C++
-// tab-width: 8
-// indent-tabs-mode: nil
-// c-basic-offset: 8
-// End:
-
diff --git a/linbox/field/Givaro/givaro-rational.h b/linbox/field/Givaro/givaro-rational.h
deleted file mode 100644
index 9b4178b..0000000
--- a/linbox/field/Givaro/givaro-rational.h
+++ /dev/null
@@ -1,229 +0,0 @@
-/* linbox/field/givaro-rational.h
- * Copyright (C) 2004 Gilles Villard
- *
- * Created Gilles Villard < Gilles.Villard at ens-lyon.fr>
- * ven oct 8 13:30:05 CEST 2004
- * ========LICENCE========
- * This file is part of the library LinBox.
- *
- * LinBox is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- * ========LICENCE========
- */
-
-
-#ifndef __LINBOX_givaro_rational_H
-#define __LINBOX_givaro_rational_H
-
-
-#include "linbox/integer.h"
-#include "linbox/field/unparametric.h"
-#include "linbox/field/field-traits.h"
-
-
-//------------------------------------
-// Files of Givaro library
-
-#include "givaro/givrational.h"
-//------------------------------------
-
-
-namespace LinBox
-{
-
- template <class Ring>
- struct ClassifyRing;
-
- class GivaroRational;
-
- template<>
- struct ClassifyRing<GivaroRational> {
- typedef RingCategories::RationalTag categoryTag;
- };
-
- class GivaroRational : public UnparametricField< Givaro::Rational> {
-
- public:
-
- /** Element type.
- *
- */
- typedef Givaro::Rational Element;
- Element zero,one,mOne;
-
-
- Element& init(Element& x , const integer& y) const
- {
- return x=Element(y);
- }
-
- Element& init(Element& x , const integer& n,const integer& d) const
- {
- return x=Element(n,d);
- }
-
- template<class XX>
- Element& init(Element& x , const XX& y) const
- {
- return x=Element(y);
- }
-
- std::istream &read(std::istream & s, Element &a) const
- {
- s >> a;
- return s;
- }
-
- integer& convert(integer& i, const Element& r) const
- {
- return i=r.nume();
- }
-
-
- Element& assign(Element& x , const Element& y) const
- {
- return x=y;
- }
-
- // x = numerator of y
- integer& get_num (integer& x, const Element& y) const
- {
- return x = y.nume();
- }
-
- // x = denominator of y
- integer& get_den (integer& x, const Element& y) const
- {
- return x = y.deno();
- }
-
-
- }; // class
-
-
-
-} // namespace LinBox
-
-
-// Specialization of homomorphism for basefield
-#include "linbox/field/hom.h"
-namespace LinBox
-{
- template <class _Target>
- class Hom<GivaroRational, _Target> {
-
- public:
- typedef GivaroRational Source;
- typedef _Target Target;
- typedef typename Source::Element SrcElt;
- typedef typename Target::Element Elt;
-
- Hom(const Source& S, const Target& T) :
- _source (S), _target(T)
- {
- }
- Elt& image(Elt& t, const SrcElt& s)
- {
- _source. get_num (num, s);
- _source. get_den (den, s);
- if (den == 1) {
- return _target.init(t,num);
- }
- else if (num == 1) {
- _target.init(t,den);
- return _target.invin(t);
- }
- else {
- _target. init (tmp, den);
- _target. init (t, num);
- return _target. divin (t, tmp);
-
- }
- // _target. init (t, den);
- // return _target. invin (t);
-
- }
- SrcElt& preimage(SrcElt& s, const Elt& t)
- {
- _target. convert (num, t);
- _source. init (s, num);
- return s;
-
- }
- const Source& source()
- {
- return _source;
- }
- const Target& target()
- {
- return _target;
- }
-
- protected:
- integer num, den;
- Elt tmp;
- Source _source;
- Target _target;
- }; // end Hom
-
- template <>
- class Hom<GivaroRational,GivaroRational> {
-
- public:
- typedef GivaroRational Source;
- typedef Source Target;
- typedef Source::Element SrcElt;
- typedef Target::Element Elt;
-
- Hom(const Source& S, const Target& T) :
- _source (S), _target(T)
- {
-}
- Elt& image(Elt& t, const SrcElt& s) {
- _target.assign(t, s);
- return t;
-
-
-}
- SrcElt& preimage(SrcElt& s, const Elt& t)
- {
- _source.assign(s, t);
- return s;
-
-}
- const Source& source() {
-return _source;
-}
- const Target& target() {
-return _target;
-}
-
- protected:
- Source _source;
- Target _target;
- }; // end Hom
-
-}
-
-#endif // __LINBOX_givaro_rational_H
-
-
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
-// Local Variables:
-// mode: C++
-// tab-width: 8
-// indent-tabs-mode: nil
-// c-basic-offset: 8
-// End:
-
diff --git a/linbox/field/Givaro/givaro-zpz.h b/linbox/field/Givaro/givaro-zpz.h
deleted file mode 100644
index 6fa4230..0000000
--- a/linbox/field/Givaro/givaro-zpz.h
+++ /dev/null
@@ -1,518 +0,0 @@
-/* linbox/field/givaro-zpz.h
- * Copyright (C) 2002 Pascal Giorgi
- *
- * Written by Pascal Giorgi <pascal.giorgi at ens-lyon.fr>
- *
- * ------------------------------------
- *
- *
- * ========LICENCE========
- * This file is part of the library LinBox.
- *
- * LinBox is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- * ========LICENCE========
- *.
- */
-
-/* WARNING this wrapper works only with an improved version of Givaro.
- * This version of givaro won't be available for public yet.
- * But it is available on my web page.
- * You can send me a mail to get it or for others details.
- */
-
-#ifndef __LINBOX_field_givaro_zpz_H
-#define __LINBOX_field_givaro_zpz_H
-
-
-#include "linbox/linbox-config.h"
-#include "linbox/integer.h"
-#include "linbox/field/field-interface.h"
-#include "linbox/util/debug.h"
-#include "linbox/vector/vector-domain.h"
-//-------------------------------------
-// Files of Givaro library
-#include <givaro/givzpz.h>
-#include <givaro/giv_randiter.h>
-#include "linbox/field/field-traits.h"
-
-//--------------------------------------
-
-// Namespace in which all LinBox code resides
-namespace LinBox
-{
-
- /* This wrappers allows to use three sorts of givaro fields :
- * Elements represent by a 32 bits integer
- * Elements represent by a 16 bits integer
- * Elements represent in Zech log representation by a 16 bits integer
- *
- * To use this fields with the wrapper below just replace the template
- * parameter by the Tag appropriated.
- * "Givaro::Std16" for 16 bits integer
- * "Givaro::Std32" for 32 bits integer
- * "Givaro::Log16" for Zech log representation in 16 bits
- */
- template<class Field>
- class DotProductDomain;
- template<class Field>
- class FieldAXPY;
-
- template <class Ring>
- struct ClassifyRing;
-
- template <class TAG>
- class GivaroZpz;
-
- template<class Tag>
- struct ClassifyRing<GivaroZpz<Tag> > {
- typedef RingCategories::ModularTag categoryTag;
- };
-
- /** \brief wrapper of Givaro's ZpzDom.
- \ingroup field
-
- * Most methods are inherited from Givaro::ZpzDom< Givaro::Std16>, Givaro::ZpzDom< Givaro::Std32>
- * and Givaro::ZpzDom<log16> classes of Givaro.
- * These classes allow to construct only finite field with a prime modulus.
- */
- template <class TAG>
- class GivaroZpz : public Givaro::ZpzDom<TAG>, public FieldInterface {
-
- private:
-
- /* friend class DotProductDomain<GivaroZpz<TAG> > ;
- friend class FieldAXPY<GivaroZpz<TAG> >; */
-
- public:
-
- //typedef integer Integer;
-
- /** Element type.
- * This type is inherited from the Givaro class Givaro::ZpzDom<TAG>
- */
- typedef typename Givaro::ZpzDom<TAG>::Rep Element;
- // Element zero,one,mOne;
- typedef Givaro::ZpzDom<TAG> Father_t ;
- typedef GivaroZpz<TAG> Self_t ;
- using Father_t::one ;
- using Father_t::zero ;
- using Father_t::mOne ;
-
- /** RandIter type
- * This type is inherited from the Givaro class Givaro::ZpzDom<TAG>
- */
- typedef Givaro::GIV_randIter< Givaro::ZpzDom<TAG>, integer > RandIter;
-
- /** Constructor from an integer
- * this constructor use the Givaro::ZpzDom<TAG> constructor
- */
- GivaroZpz (const integer &p) :
- Givaro::ZpzDom<TAG> (static_cast<typename Givaro::ZpzDom<TAG>::Residu_t> (p))
- {}
-
-
- /** Constructor from an integer (takes degree of extension as 2nd parameter, must be 1)
- * this constructor use the Givaro::ZpzDom<TAG> constructor
- */
- GivaroZpz (const integer &p, const integer& k) :
- Givaro::ZpzDom<TAG> (static_cast<typename Givaro::ZpzDom<TAG>::Residu_t> (p))
- {
-
- if (k!=1)
- throw PreconditionFailed(__func__,__FILE__,__LINE__,"exponent must be 1");
- }
-
- /** Copy constructor.
- * This copy constructor use the Givaro::ZpzDom<TAG> copy constructor
- */
- GivaroZpz (const GivaroZpz<TAG>& F) :
- Givaro::ZpzDom<TAG> (F)
- {}
-
-
-#if 0
- // Rich Seagraves 7-16-2003
- // As is, this operator is an infinite loop
- // By not providing an operator= in GivaroZpz,
- // the operator= in the base class ( Givaro::ZpzDom<TAG>) is called
- // automatically by the rules of C++, which I'm guessing is
- // the "Right Thing" for this operator
- //
- /** Operator =
- */
- /*
- GivaroZpz<TAG>& operator= (const GivaroZpz<TAG>& F)
- {
- return (*this)=F;
- }
- */
-#endif
-
- /** Characteristic.
- * Return integer representing characteristic of the domain.
- * @return integer representing characteristic of the domain.
- */
- integer &characteristic (integer &c) const
- {
- return c = integer ( Givaro::ZpzDom<TAG>::size ());
- }
- unsigned long &characteristic (unsigned long &c) const
- {
- return c = (unsigned long) ( Givaro::ZpzDom<TAG>::size ());
- }
-
- long characteristic() const
- {
- return static_cast<int>( Givaro::ZpzDom<TAG>::size());
- }
-
- /** Cardinality.
- * Return integer representing cardinality of the domain.
- * @return integer representing cardinality of the domain
- */
- integer &cardinality (integer &c) const
- {
- return c = integer ( Givaro::ZpzDom<TAG>::size ());
- }
-
- integer cardinality () const
- {
- return integer ( Givaro::ZpzDom<TAG>::size ());
- }
-
- /** Conversion of field base element to an integer.
- * This function assumes the output field base element x has already been
- * constructed, but that it is not already initialized.
- * @return reference to an integer.
- * @param x integer to contain output (reference returned).
- * @param y constant field base element.
- */
- integer &convert (integer &x, const Element &y) const
- {
- return x = integer (y);
- }
-
- double &convert (double& x, const Element& y) const
- {
- return x = static_cast<double>(y);
- }
-
- template<class Type>
- Type &convert (Type& x, const Element& y) const
- {
- return x = static_cast<Type>(y);
- }
-
-
- /** Initialization of field base element from an integer.
- * Behaves like C++ allocator construct.
- * This function assumes the output field base element x has already been
- * constructed, but that it is not already initialized.
- * @return reference to field base element.
- * @param x field base element to contain output (reference returned).
- * @param y integer.
- */
- Element &init (Element &x , const integer &y = 0) const
- {
- //
- // AU 28/03/07 no cast to long allows to use Givaro::ZpzDom<integer>
- //
- //Givaro::ZpzDom<TAG>::init (x, (long) (y% integer(this->_p)));
- Givaro::ZpzDom<TAG>::init (x, (y% integer(this->_p)));
- return x;
- }
-
- Element &init (Element &x , const long &y ) const
- {
- return Givaro::ZpzDom<TAG>::init (x, y ) ;
-
- }
- Element &init (Element &x , const int &y ) const
- {
- return Givaro::ZpzDom<TAG>::init (x, y ) ;
-
- }
-
- Element &init (Element &x , const unsigned&y ) const
- {
- return Givaro::ZpzDom<TAG>::init (x, y ) ;
-
- }
-
- Element &init (Element &x , const unsigned long &y ) const
- {
- return Givaro::ZpzDom<TAG>::init (x, y ) ;
-
- }
-
- Element &init (Element &x , const double &y ) const
- {
- double z = fmod(y, (double) this->_p);
- if (z < 0) z += (double) this->_p;
- z += 0.5;
- return x = static_cast<Element>(z); //rounds towards 0
- }
-
- static uint64_t getMaxModulus();
-
- }; // class GivaroZpz<TAG>
-
-
- template <> uint64_t GivaroZpz< Givaro::Std32>::getMaxModulus() { return 46339; } // 2^15.5-1
- template <> uint64_t GivaroZpz< Givaro::Std64>::getMaxModulus() { return 3037000499ULL; } // 2^15.5-1
- template <> uint64_t GivaroZpz< Givaro::Unsigned32>::getMaxModulus() { return 65535; } // 2^16-1
- template <> uint64_t GivaroZpz< Givaro::Std16>::getMaxModulus() { return 255; } // 2^8-1
- template <> uint64_t GivaroZpz< Givaro::Log16>::getMaxModulus() { return 32767; } // 2^15 - 1
-
- /** Specialisation of the convert function for the zech log representation
- * of givaro-zpz (GivaroZpz< Givaro::Log16>.
- * this function translates the internal representation to the real
- * value of the element.
- * This can have no sense but can be usefull
- * NB : the init function for this specialisation does the same thing.
- * the function transaltes the values to her internal representation.
- */
- template <> integer& GivaroZpz< Givaro::Log16>::convert(integer& x, const Element& y) const
- {
- if (y>=this->_p) return x = 0;
- int tmp = _tab_rep2value[y];
- return x = integer (tmp);
- }
-
- template <> double& GivaroZpz< Givaro::Log16>::convert(double& x, const Element& y) const
- {
- if (y>=this->_p) return x = 0.0;
- int tmp = _tab_rep2value[y];
- return x = (double) tmp;
- }
-
- template <> GivaroZpz< Givaro::Log16>::Element& GivaroZpz< Givaro::Log16>::init(GivaroZpz< Givaro::Log16>::Element& x, const double& y) const
- {
- double z = fmod(y, (double) this->_p);
- if (z < 0) z += this->_p;
- z += 0.5;
- return x = _tab_value2rep[static_cast<long>(z)]; //rounds towards 0
- }
-
- template <> GivaroZpz< Givaro::Log16>::Element& GivaroZpz< Givaro::Log16>::init(GivaroZpz< Givaro::Log16>::Element& x, const integer& y) const
- {
- int tmp =(int) (y % (integer)this->_p);
- if (tmp < 0 ) tmp += this->_p;
- return x = _tab_value2rep[tmp];
- }
-
- /* Specialization of FieldAXPY for GivaroZpz< Givaro::Std32> Field */
-
- template <>
- class FieldAXPY<GivaroZpz< Givaro::Std32> > {
- public:
-
- typedef GivaroZpz< Givaro::Std32>::Element Element;
- typedef GivaroZpz< Givaro::Std32> Field;
-
- FieldAXPY (const Field &F) :
- _field (F) , Corr(uint64_t(-1) % (uint64_t)F.characteristic() +1)
- { _y = 0; }
- FieldAXPY (const FieldAXPY &faxpy) :
- _field (faxpy._field), _y (0) , Corr(faxpy.Corr)
- {}
-
- FieldAXPY<GivaroZpz< Givaro::Std32> > &operator = (const FieldAXPY &faxpy)
- { _field = faxpy._field; _y = faxpy._y; Corr = faxpy.Corr; return *this; }
-
- inline uint64_t& mulacc (const Element &a, const Element &x)
- {
- uint64_t t = (uint64_t) a * (uint64_t) x;
- _y += t;
- if (_y < t)
- return _y += Corr;
- else
- return _y;
- }
-
- inline uint64_t& accumulate (const Element &t)
- {
- _y += t;
- if (_y < (uint64_t)t)
- return _y += Corr;
- else
- return _y;
- }
-
- inline Element &get (Element &y) {
- _y %= (uint64_t) _field.characteristic();
- if ((int64_t) _y < 0) _y += _field.characteristic();
- y = (uint32_t) _y;
- return y;
- }
-
- inline FieldAXPY &assign (const Element y)
- { _y = y; return *this; }
-
- inline void reset() {
- _y = 0;
- }
-
- private:
-
- Field _field;
- uint64_t _y;
- uint64_t Corr;
- };
-
-
- /* Specialization of FieldAXPY for GivaroZpz< Givaro::Std32> Field */
-
- template <>
- class FieldAXPY<GivaroZpz< Givaro::Std16> > {
- public:
-
- typedef GivaroZpz< Givaro::Std16>::Element Element;
- typedef GivaroZpz< Givaro::Std16> Field;
-
- FieldAXPY (const Field &F) :
- _field (F) , Corr(uint32_t(-1) % (uint32_t)F.characteristic() +1)
- {
- _y = 0;
- }
- FieldAXPY (const FieldAXPY &faxpy) :
- _field (faxpy._field), _y (0) , Corr(faxpy.Corr)
- {}
-
- FieldAXPY<GivaroZpz< Givaro::Std16> > &operator = (const FieldAXPY &faxpy)
- {
- _field = faxpy._field;
- _y = faxpy._y;
- Corr = faxpy.Corr;
- return *this;
- }
-
- inline uint32_t& mulacc (const Element &a, const Element &x)
- {
- uint32_t t = (uint32_t) a * (uint32_t) x;
- _y += t;
-
- if (_y < t)
- return _y += Corr;
- else
- return _y;
- }
-
- inline uint32_t& accumulate (const Element &t)
- {
- _y += t;
-
- if (_y < (uint32_t)t)
- return _y += Corr;
- else
- return _y;
- }
-
- inline Element &get (Element &y)
- {
- _y %= (uint32_t) _field.characteristic();
- if ((int32_t) _y < 0)
- _y += (Element) _field.characteristic();
- y = (uint16_t) _y;
- return y;
- }
-
- inline FieldAXPY &assign (const Element y)
- {
- _y = y;
- return *this;
- }
-
- inline void reset()
- {
- _y = 0;
- }
-
- private:
-
- Field _field;
- uint32_t _y;
- uint32_t Corr;
- };
-
- // Specialization of DotProductDomain for GivaroZpz< Givaro::Std32> field
-
- template <>
- class DotProductDomain<GivaroZpz< Givaro::Std32> > : private virtual VectorDomainBase<GivaroZpz< Givaro::Std32> > {
-
- public:
-
- typedef GivaroZpz< Givaro::Std32>::Element Element;
-
- DotProductDomain (const GivaroZpz< Givaro::Std32> &F) :
- VectorDomainBase<GivaroZpz< Givaro::Std32> > (F) ,
- Corr(uint64_t(-1) % (uint64_t)F.characteristic() +1),
- Max(uint64_t(-1))
- {}
-
- protected:
- template <class Vector1, class Vector2>
- inline Element &dotSpecializedDD (Element &res, const Vector1 &v1, const Vector2 &v2) const;
-
- template <class Vector1, class Vector2>
- inline Element &dotSpecializedDSP (Element &res, const Vector1 &v1, const Vector2 &v2) const;
-
- private:
- uint64_t Corr;
- uint64_t Max;
- };
-
- // Specialization of DotProductDomain for GivaroZpz< Givaro::Std16> field
-
- template <>
- class DotProductDomain<GivaroZpz< Givaro::Std16> > : private virtual VectorDomainBase<GivaroZpz< Givaro::Std16> > {
-
- public:
-
- typedef GivaroZpz< Givaro::Std16>::Element Element;
-
- DotProductDomain (const GivaroZpz< Givaro::Std16> &F) :
- VectorDomainBase<GivaroZpz< Givaro::Std16> > (F) ,
- Corr(uint32_t(-1) % (uint32_t)F.characteristic() +1),
- Max(uint32_t(-1))
- {}
-
- protected:
- template <class Vector1, class Vector2>
- inline Element &dotSpecializedDD (Element &res, const Vector1 &v1, const Vector2 &v2) const;
-
- template <class Vector1, class Vector2>
- inline Element &dotSpecializedDSP (Element &res, const Vector1 &v1, const Vector2 &v2) const;
-
- private:
- uint32_t Corr;
- uint32_t Max;
- };
-
-} // namespace LinBox
-
-#include "linbox/field/Givaro/givaro-zpz.inl"
-
-#endif // __LINBOX_field_givaro_zpz_H
-
-
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
-// Local Variables:
-// mode: C++
-// tab-width: 8
-// indent-tabs-mode: nil
-// c-basic-offset: 8
-// End:
-
diff --git a/linbox/field/Givaro/givaro-zpz.inl b/linbox/field/Givaro/givaro-zpz.inl
deleted file mode 100644
index f247992..0000000
--- a/linbox/field/Givaro/givaro-zpz.inl
+++ /dev/null
@@ -1,288 +0,0 @@
-/* linbox/field/givaro-zpz.inl
- * Written by Pascal Giorgi <pascal.giorgi at ens-lyon.fr>
- *
- * ------------------------------------
- *
- * Copyright (c) LinBox
- *
- * ========LICENCE========
- * This file is part of the library LinBox.
- *
- * LinBox is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- * ========LICENCE========
- *.
- */
-
-/*!@internal
- * @file linbox/field/Givaro/givaro-zpz.inl
- * @brief implementation of givaro-zpz.h.
- */
-
-
-#ifndef __LINBOX_givaro_zpz_INL
-#define __LINBOX_givaro_zpz_INL
-
-
-#include <iostream>
-#include "linbox/integer.h"
-
-namespace LinBox
-{
-
-
-
- template <class Vector1, class Vector2>
- inline GivaroZpz< Givaro::Std32>::Element &DotProductDomain<GivaroZpz< Givaro::Std32> >::dotSpecializedDD
- (GivaroZpz< Givaro::Std32>::Element &res, const Vector1 &v1, const Vector2 &v2) const
- {
- typedef typename GivaroZpz<Givaro::Std32>::Element Elem;
- uint64_t inter,best ;
- inter=best=0;
- if (v1.size()==0)
- return res=Elem(0);
- else {
-
- uint64_t size = v1.size();
- uint64_t min = Max / (Corr+ (uint64_t)(_field.characteristic()-1)*(uint64_t)(_field.characteristic()-1));
- uint64_t min_size = (size < min ? size : min);
- uint64_t good1 = (size > min_size ? size - min_size: 0);
- uint64_t good2 = (long)(size / min_size)* min_size ;
- uint64_t good_size = (good1 > good2 ? good1 : good2 );
-
- typename Vector1::const_iterator i=v1.begin();
- typename Vector2::const_iterator j=v2.begin();
-
- unsigned long k=0;
-
- for (;k<min_size;i++,j++,k++)
- best+=(uint64_t)*i * (uint64_t)*j;
-
- for (inter=best;k<good_size;inter=best) {
- for (unsigned long l=0;l<min_size;i++,j++,k++,l++)
- best+= (uint64_t)*i * (uint64_t)*j;
- if (inter > best) best+=Corr;
- }
-
- for (;k<size;i++,j++,k++)
- best+= (uint64_t)*i * (uint64_t)*j;
- if (inter > best) best+=Corr;
-
-
- return res = Elem(best % (uint64_t)_field.characteristic());
- }
- }
-
- template <class Vector1, class Vector2>
- inline GivaroZpz< Givaro::Std32>::Element &DotProductDomain<GivaroZpz< Givaro::Std32> >::dotSpecializedDSP
- (GivaroZpz< Givaro::Std32>::Element &res, const Vector1 &v1, const Vector2 &v2) const
- {
- uint64_t inter,best ;
- inter=best=0;
- if ((v1.first).size()== 0)
- return res=GivaroZpz< Givaro::Std32>::Element(0);
- else {
- uint64_t size = (v1.first).size();
- uint64_t min = Max / (Corr+ (uint64_t)(_field.characteristic()-1)*(uint64_t)(_field.characteristic()-1));
- uint64_t min_size = (size < min ? size : min);
- uint64_t good1 = (size > min_size ? size - min_size: 0);
- uint64_t good2 = (long)(size / min_size)* min_size ;
- uint64_t good_size = (good1 > good2 ? good1 : good2 );
-
- typename Vector1::first_type::const_iterator i_idx = v1.first.begin ();
- typename Vector1::second_type::const_iterator i_elt = v1.second.begin ();
-
- unsigned long k=0;
-
- for (;k<min_size;i_idx++,i_elt++,k++)
- best+=(uint64_t)*i_elt * (uint64_t)v2[*i_idx];
-
- for (inter=best;k<good_size;inter=best) {
- for (unsigned long l=0;l<min_size;i_idx++,i_elt++,k++,l++)
- best+= (uint64_t)*i_elt * (uint64_t)v2[*i_idx];
- if (inter > best) best+=Corr;
- }
-
- for (;k<size;i_idx++,i_elt++,k++)
- best+= (uint64_t)*i_elt * (uint64_t)v2[*i_idx];
- if (inter > best) best+=Corr;
-
- return res = best % _field.characteristic();
- }
- }
-
-
-
- template <class Vector1, class Vector2>
- inline GivaroZpz< Givaro::Std16>::Element &DotProductDomain<GivaroZpz< Givaro::Std16> >::dotSpecializedDD
- (GivaroZpz< Givaro::Std16>::Element &res, const Vector1 &v1, const Vector2 &v2) const
- {
- uint32_t inter,best ;
- inter=best=0;
- if (v1.size() == 0)
- return res=GivaroZpz< Givaro::Std16>::Element(0);
- else {
- uint32_t size = v1.size();
- uint32_t min = Max / (Corr+ ((uint32_t)_field.characteristic()-1)*(uint32_t)(_field.characteristic()-1));
- uint32_t min_size = (size < min ? size : min);
- uint32_t good1 = (size > min_size ? size - min_size: 0);
- uint32_t good2 = (long)(size / min_size)* min_size ;
- uint32_t good_size = (good1 > good2 ? good1 : good2 );
-
-
- typename Vector1::const_iterator i=v1.begin();
- typename Vector2::const_iterator j=v2.begin();
-
- uint32_t k=0;
-
- for (;k<min_size;i++,j++,k++)
- best+=(uint32_t)*i * (uint32_t)*j;
-
- for (inter=best;k<good_size;inter=best) {
- for (unsigned long l=0;l<min_size;i++,j++,k++,l++)
- best+= (uint32_t)*i * (uint32_t)*j;
- if (inter > best) best+=Corr;
- }
-
- for (;k<size;i++,j++,k++)
- best+= (uint32_t)*i * (uint32_t)*j;
- if (inter > best) best+=Corr;
-
- return res = best % (uint32_t)_field.characteristic();
- }
- }
-
- template <class Vector1, class Vector2>
- inline GivaroZpz< Givaro::Std16>::Element &DotProductDomain<GivaroZpz< Givaro::Std16> >::dotSpecializedDSP
- (GivaroZpz< Givaro::Std16>::Element &res, const Vector1 &v1, const Vector2 &v2) const
- {
- uint32_t inter,best ;
- inter=best=0;
- if ((v1.first).size()==0)
- return res=GivaroZpz< Givaro::Std16>::Element(0);
- else {
- uint32_t size = (v1.first).size();
- uint32_t min = Max / (Corr+ (uint32_t)(_field.characteristic()-1)*(uint32_t)(_field.characteristic()-1));
- uint32_t min_size = (size < min ? size : min);
- uint32_t good1 = (size > min_size ? size - min_size: 0);
- uint32_t good2 = (long)(size / min_size)* min_size ;
- uint32_t good_size = (good1 > good2 ? good1 : good2 );
-
- typename Vector1::first_type::const_iterator i_idx = v1.first.begin ();
- typename Vector1::second_type::const_iterator i_elt = v1.second.begin ();
- uint32_t k=0;
-
- for (;k<min_size;i_idx++,i_elt++,k++)
- best+=(uint32_t)*i_elt * (uint32_t)v2[*i_idx];
-
- for (inter=best;k<good_size;inter=best) {
- for (unsigned long l=0;l<min_size;i_idx++,i_elt++,k++,l++)
- best+= (uint32_t)*i_elt * (uint32_t)v2[*i_idx];
- if (inter > best) best+=Corr;
- }
-
- for (;k<size;i_idx++,i_elt++,k++)
- best+= (uint32_t)*i_elt * (uint32_t)v2[*i_idx];
- if (inter > best) best+=Corr;
-
- return res = best % (uint32_t)_field.characteristic();
- }
- }
-
-
-#ifdef XMLENABLED
-
- template<>
- bool GivaroZpz< Givaro::Std16>::toTag(Writer &W) const
- {
- string s;
- int16_t m = ZpzDom< Givaro::Std16>::residu();
-
- W.setTagName("field");
- W.setAttribute("implDetail", "givaro-zpz-std16");
- W.setAttribute("cardinality", Writer::numToString(s, m));
-
- W.addTagChild();
- W.setTagName("finite");
-
- W.addTagChild();
- W.setTagName("characteristic");
- W.addNum(m);
- W.upToParent();
- W.upToParent();
-
- return true;
- }
-
- template <>
- bool GivaroZpz< Givaro::Std32>::toTag(Writer &W) const
- {
- string s;
- int32_t m = ZpzDom< Givaro::Std32>::residu();
-
- W.setTagName("field");
- W.setAttribute("implDetail", "givaro-zpz-std32");
- W.setAttribute("cardinality", Writer::numToString(s, m));
-
- W.addTagChild();
- W.setTagName("finite");
-
- W.addTagChild();
- W.setTagName("characteristic");
- W.addNum(m);
- W.upToParent();
-
- W.upToParent();
-
- return true;
- }
-
- template <>
- bool GivaroZpz<Log16>::toTag(Writer &W) const
- {
- string s;
- int16_t m = ZpzDom<Log16>::residu();
-
- W.setTagName("field");
- W.setAttribute("implDetail", "givaro-zpz-log16");
- W.setAttribute("cardinality", Writer::numToString(s, m));
-
- W.addTagChild();
- W.setTagName("finite");
-
- W.addTagChild();
- W.setTagName("characteristic");
- W.addNum(m);
- W.upToParent();
-
- W.upToParent();
-
- return true;
- }
-#endif
-
-
-}
-
-#endif //__LINBOX_givaro_zpz_INL
-
-
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
-// Local Variables:
-// mode: C++
-// tab-width: 8
-// indent-tabs-mode: nil
-// c-basic-offset: 8
-// End:
-
diff --git a/linbox/field/Makefile.am b/linbox/field/Makefile.am
index 08fae88..648d61b 100644
--- a/linbox/field/Makefile.am
+++ b/linbox/field/Makefile.am
@@ -21,8 +21,6 @@
pkgincludesubdir=$(pkgincludedir)/field
-SUBDIRS=NTL Givaro Modular
-
BASIC_HDRS = \
field-interface.h \
field-traits.h \
@@ -30,58 +28,16 @@ BASIC_HDRS = \
abstract.h \
archetype.h \
envelope.h \
- unparametric.h \
param-fuzzy.h \
gmp-rational.h \
- modular.h \
- modular-balanced.h \
gf2.h \
gf2.inl \
hom.h \
map.h \
- PIR-modular-int32.h \
- local2_32.h \
- PID-integer.h \
- PID-double.h \
- block-ring.h \
multimod-field.h
-NTL_HDRS = \
- ntl.h \
- PID-ntl-zz_p.h \
- PIR-ntl-ZZ_p.h
-
-GIVARO_HDRS = \
- givaro.h
-
-LIDIA_HDRS = \
- lidia.h \
- lidia-gfq.h
-
-if LINBOX_HAVE_NTL
-USE_NTL_HDRS = $(NTL_HDRS)
-endif
-
-if LINBOX_HAVE_GIVARO
-USE_GIVARO_HDRS = $(GIVARO_HDRS)
-endif
-
-if LINBOX_HAVE_LIDIA
-USE_LIDIA_HDRS = $(LIDIA_HDRS)
-endif
-
pkgincludesub_HEADERS = \
- $(BASIC_HDRS) \
- $(USE_NTL_HDRS) \
- $(USE_GIVARO_HDRS) \
- $(USE_LIDIA_HDRS)
+ $(BASIC_HDRS)
EXTRA_DIST = \
- $(NTL_HDRS) \
- $(GIVARO_HDRS) \
- $(LIDIA_HDRS) \
- field.doxy \
- modular.doxy \
- integers.doxy \
- lidia.doxy \
- ntl.doxy
+ field.doxy
diff --git a/linbox/field/Makefile.in b/linbox/field/Makefile.in
deleted file mode 100644
index 9c752bd..0000000
--- a/linbox/field/Makefile.in
+++ /dev/null
@@ -1,782 +0,0 @@
-# Makefile.in generated by automake 1.11.5 from Makefile.am.
-# @configure_input@
-
-# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software
-# Foundation, Inc.
-# This Makefile.in is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
-# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
-# PARTICULAR PURPOSE.
-
- at SET_MAKE@
-
-# Copyright (c) 2010 the LinBox group
-# ========LICENCE========
-# This file is part of the library LinBox.
-#
-# LinBox is free software: you can redistribute it and/or modify
-# it under the terms of the GNU Lesser General Public
-# License as published by the Free Software Foundation; either
-# version 2.1 of the License, or (at your option) any later version.
-#
-# This library 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
-# Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public
-# License along with this library; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
-# ========LICENCE========
-
-VPATH = @srcdir@
-am__make_dryrun = \
- { \
- am__dry=no; \
- case $$MAKEFLAGS in \
- *\\[\ \ ]*) \
- echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \
- | grep '^AM OK$$' >/dev/null || am__dry=yes;; \
- *) \
- for am__flg in $$MAKEFLAGS; do \
- case $$am__flg in \
- *=*|--*) ;; \
- *n*) am__dry=yes; break;; \
- esac; \
- done;; \
- esac; \
- test $$am__dry = yes; \
- }
-pkgdatadir = $(datadir)/@PACKAGE@
-pkgincludedir = $(includedir)/@PACKAGE@
-pkglibdir = $(libdir)/@PACKAGE@
-pkglibexecdir = $(libexecdir)/@PACKAGE@
-am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
-install_sh_DATA = $(install_sh) -c -m 644
-install_sh_PROGRAM = $(install_sh) -c
-install_sh_SCRIPT = $(install_sh) -c
-INSTALL_HEADER = $(INSTALL_DATA)
-transform = $(program_transform_name)
-NORMAL_INSTALL = :
-PRE_INSTALL = :
-POST_INSTALL = :
-NORMAL_UNINSTALL = :
-PRE_UNINSTALL = :
-POST_UNINSTALL = :
-build_triplet = @build@
-host_triplet = @host@
-subdir = linbox/field
-DIST_COMMON = $(am__pkgincludesub_HEADERS_DIST) $(srcdir)/Makefile.am \
- $(srcdir)/Makefile.in
-ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-am__aclocal_m4_deps = $(top_srcdir)/macros/aclocal-include.m4 \
- $(top_srcdir)/macros/config-header.m4 \
- $(top_srcdir)/macros/debug.m4 \
- $(top_srcdir)/macros/expat-check.m4 \
- $(top_srcdir)/macros/fflas-ffpack-check.m4 \
- $(top_srcdir)/macros/fplll-check.m4 \
- $(top_srcdir)/macros/givaro-check.m4 \
- $(top_srcdir)/macros/gmp-check.m4 \
- $(top_srcdir)/macros/iml-check.m4 \
- $(top_srcdir)/macros/lapack-check.m4 \
- $(top_srcdir)/macros/libtool.m4 \
- $(top_srcdir)/macros/lidia-check.m4 \
- $(top_srcdir)/macros/linbox-benchmark.m4 \
- $(top_srcdir)/macros/linbox-doc.m4 \
- $(top_srcdir)/macros/linbox-misc.m4 \
- $(top_srcdir)/macros/linbox-opt.m4 \
- $(top_srcdir)/macros/ltoptions.m4 \
- $(top_srcdir)/macros/ltsugar.m4 \
- $(top_srcdir)/macros/ltversion.m4 \
- $(top_srcdir)/macros/lt~obsolete.m4 \
- $(top_srcdir)/macros/m4ri-check.m4 \
- $(top_srcdir)/macros/m4rie-check.m4 \
- $(top_srcdir)/macros/maple-check.m4 \
- $(top_srcdir)/macros/mpfr-check.m4 \
- $(top_srcdir)/macros/ntl-check.m4 \
- $(top_srcdir)/macros/saclib-check.m4 \
- $(top_srcdir)/macros/sage-check.m4 $(top_srcdir)/configure.ac
-am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
- $(ACLOCAL_M4)
-mkinstalldirs = $(install_sh) -d
-CONFIG_HEADER = $(top_builddir)/config.h
-CONFIG_CLEAN_FILES =
-CONFIG_CLEAN_VPATH_FILES =
-depcomp =
-am__depfiles_maybe =
-SOURCES =
-DIST_SOURCES =
-RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \
- html-recursive info-recursive install-data-recursive \
- install-dvi-recursive install-exec-recursive \
- install-html-recursive install-info-recursive \
- install-pdf-recursive install-ps-recursive install-recursive \
- installcheck-recursive installdirs-recursive pdf-recursive \
- ps-recursive uninstall-recursive
-am__can_run_installinfo = \
- case $$AM_UPDATE_INFO_DIR in \
- n|no|NO) false;; \
- *) (install-info --version) >/dev/null 2>&1;; \
- esac
-am__pkgincludesub_HEADERS_DIST = field-interface.h field-traits.h \
- rebind.h abstract.h archetype.h envelope.h unparametric.h \
- param-fuzzy.h gmp-rational.h modular.h modular-balanced.h \
- gf2.h gf2.inl hom.h map.h PIR-modular-int32.h local2_32.h \
- PID-integer.h PID-double.h block-ring.h multimod-field.h ntl.h \
- PID-ntl-zz_p.h PIR-ntl-ZZ_p.h givaro.h lidia.h lidia-gfq.h
-am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
-am__vpath_adj = case $$p in \
- $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
- *) f=$$p;; \
- esac;
-am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
-am__install_max = 40
-am__nobase_strip_setup = \
- srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
-am__nobase_strip = \
- for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
-am__nobase_list = $(am__nobase_strip_setup); \
- for p in $$list; do echo "$$p $$p"; done | \
- sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
- $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
- if (++n[$$2] == $(am__install_max)) \
- { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
- END { for (dir in files) print dir, files[dir] }'
-am__base_list = \
- sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
- sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
-am__uninstall_files_from_dir = { \
- test -z "$$files" \
- || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \
- || { echo " ( cd '$$dir' && rm -f" $$files ")"; \
- $(am__cd) "$$dir" && rm -f $$files; }; \
- }
-am__installdirs = "$(DESTDIR)$(pkgincludesubdir)"
-HEADERS = $(pkgincludesub_HEADERS)
-RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \
- distclean-recursive maintainer-clean-recursive
-AM_RECURSIVE_TARGETS = $(RECURSIVE_TARGETS:-recursive=) \
- $(RECURSIVE_CLEAN_TARGETS:-recursive=) tags TAGS ctags CTAGS \
- distdir
-ETAGS = etags
-CTAGS = ctags
-DIST_SUBDIRS = $(SUBDIRS)
-DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
-am__relativize = \
- dir0=`pwd`; \
- sed_first='s,^\([^/]*\)/.*$$,\1,'; \
- sed_rest='s,^[^/]*/*,,'; \
- sed_last='s,^.*/\([^/]*\)$$,\1,'; \
- sed_butlast='s,/*[^/]*$$,,'; \
- while test -n "$$dir1"; do \
- first=`echo "$$dir1" | sed -e "$$sed_first"`; \
- if test "$$first" != "."; then \
- if test "$$first" = ".."; then \
- dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \
- dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \
- else \
- first2=`echo "$$dir2" | sed -e "$$sed_first"`; \
- if test "$$first2" = "$$first"; then \
- dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \
- else \
- dir2="../$$dir2"; \
- fi; \
- dir0="$$dir0"/"$$first"; \
- fi; \
- fi; \
- dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \
- done; \
- reldir="$$dir2"
-ACLOCAL = @ACLOCAL@
-AMTAR = @AMTAR@
-AR = @AR@
-AUTOCONF = @AUTOCONF@
-AUTOHEADER = @AUTOHEADER@
-AUTOMAKE = @AUTOMAKE@
-AWK = @AWK@
-BLAS_CFLAGS = @BLAS_CFLAGS@
-BLAS_LIBS = @BLAS_LIBS@
-CC = @CC@
-CCNAM = @CCNAM@
-CFLAGS = @CFLAGS@
-CPPFLAGS = @CPPFLAGS@
-CXX = @CXX@
-CXXCPP = @CXXCPP@
-CXXFLAGS = @CXXFLAGS@
-CYGPATH_W = @CYGPATH_W@
-DBG = @DBG@
-DEBUG_CFLAGS = @DEBUG_CFLAGS@
-DEFAULT_CFLAGS = @DEFAULT_CFLAGS@
-DEFS = @DEFS@
-DLLTOOL = @DLLTOOL@
-DSYMUTIL = @DSYMUTIL@
-DUMPBIN = @DUMPBIN@
-ECHO_C = @ECHO_C@
-ECHO_N = @ECHO_N@
-ECHO_T = @ECHO_T@
-EGREP = @EGREP@
-EXEEXT = @EXEEXT@
-EXPAT_CFLAGS = @EXPAT_CFLAGS@
-EXPAT_LIBS = @EXPAT_LIBS@
-FFLAS_FFPACK_CFLAGS = @FFLAS_FFPACK_CFLAGS@
-FFLAS_FFPACK_LIBS = @FFLAS_FFPACK_LIBS@
-FFLAS_FFPACK_LOC = @FFLAS_FFPACK_LOC@
-FGREP = @FGREP@
-FPLLL_CFLAGS = @FPLLL_CFLAGS@
-FPLLL_LIBS = @FPLLL_LIBS@
-GIVARO_CFLAGS = @GIVARO_CFLAGS@
-GIVARO_LIBS = @GIVARO_LIBS@
-GMP_CFLAGS = @GMP_CFLAGS@
-GMP_LIBS = @GMP_LIBS@
-GMP_VERSION = @GMP_VERSION@
-GREP = @GREP@
-IML_CFLAGS = @IML_CFLAGS@
-IML_LIBS = @IML_LIBS@
-INSTALL = @INSTALL@
-INSTALL_DATA = @INSTALL_DATA@
-INSTALL_PROGRAM = @INSTALL_PROGRAM@
-INSTALL_SCRIPT = @INSTALL_SCRIPT@
-INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
-LD = @LD@
-LDFLAGS = @LDFLAGS@
-LIBOBJS = @LIBOBJS@
-LIBS = @LIBS@
-LIBTOOL = @LIBTOOL@
-LIDIA_CFLAGS = @LIDIA_CFLAGS@
-LIDIA_LIBS = @LIDIA_LIBS@
-LINBOX_BENCH_PATH = @LINBOX_BENCH_PATH@
-LINBOX_DOC_PATH = @LINBOX_DOC_PATH@
-LIPO = @LIPO@
-LN_S = @LN_S@
-LTLIBOBJS = @LTLIBOBJS@
-M4RIE_CFLAGS = @M4RIE_CFLAGS@
-M4RIE_LIBS = @M4RIE_LIBS@
-M4RI_CFLAGS = @M4RI_CFLAGS@
-M4RI_LIBS = @M4RI_LIBS@
-MAINT = @MAINT@
-MAKEINFO = @MAKEINFO@
-MANIFEST_TOOL = @MANIFEST_TOOL@
-MAPLE_CFLAGS = @MAPLE_CFLAGS@
-MAPLE_HOME = @MAPLE_HOME@
-MAPLE_LIBS = @MAPLE_LIBS@
-MAPLE_VERSION = @MAPLE_VERSION@
-MKDIR_P = @MKDIR_P@
-MPFR_CFLAGS = @MPFR_CFLAGS@
-MPFR_LIBS = @MPFR_LIBS@
-NM = @NM@
-NMEDIT = @NMEDIT@
-NTL_CFLAGS = @NTL_CFLAGS@
-NTL_LIBS = @NTL_LIBS@
-OBJDUMP = @OBJDUMP@
-OBJEXT = @OBJEXT@
-OTOOL = @OTOOL@
-OTOOL64 = @OTOOL64@
-PACKAGE = @PACKAGE@
-PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
-PACKAGE_NAME = @PACKAGE_NAME@
-PACKAGE_STRING = @PACKAGE_STRING@
-PACKAGE_TARNAME = @PACKAGE_TARNAME@
-PACKAGE_URL = @PACKAGE_URL@
-PACKAGE_VERSION = @PACKAGE_VERSION@
-PATH_SEPARATOR = @PATH_SEPARATOR@
-PROF = @PROF@
-RANLIB = @RANLIB@
-RM = @RM@
-SACLIB_CFLAGS = @SACLIB_CFLAGS@
-SACLIB_LIBS = @SACLIB_LIBS@
-SED = @SED@
-SET_MAKE = @SET_MAKE@
-SHELL = @SHELL@
-STRIP = @STRIP@
-TESTS_CFLAGS = @TESTS_CFLAGS@
-VERSION = @VERSION@
-WARN = @WARN@
-abs_builddir = @abs_builddir@
-abs_srcdir = @abs_srcdir@
-abs_top_builddir = @abs_top_builddir@
-abs_top_srcdir = @abs_top_srcdir@
-ac_ct_AR = @ac_ct_AR@
-ac_ct_CC = @ac_ct_CC@
-ac_ct_CXX = @ac_ct_CXX@
-ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
-am__leading_dot = @am__leading_dot@
-am__tar = @am__tar@
-am__untar = @am__untar@
-bindir = @bindir@
-build = @build@
-build_alias = @build_alias@
-build_cpu = @build_cpu@
-build_os = @build_os@
-build_vendor = @build_vendor@
-builddir = @builddir@
-datadir = @datadir@
-datarootdir = @datarootdir@
-docdir = @docdir@
-dvidir = @dvidir@
-exec_prefix = @exec_prefix@
-host = @host@
-host_alias = @host_alias@
-host_cpu = @host_cpu@
-host_os = @host_os@
-host_vendor = @host_vendor@
-htmldir = @htmldir@
-includedir = @includedir@
-infodir = @infodir@
-install_sh = @install_sh@
-libdir = @libdir@
-libexecdir = @libexecdir@
-localedir = @localedir@
-localstatedir = @localstatedir@
-mandir = @mandir@
-mkdir_p = @mkdir_p@
-oldincludedir = @oldincludedir@
-pdfdir = @pdfdir@
-prefix = @prefix@
-program_transform_name = @program_transform_name@
-psdir = @psdir@
-sbindir = @sbindir@
-sharedstatedir = @sharedstatedir@
-srcdir = @srcdir@
-sysconfdir = @sysconfdir@
-target_alias = @target_alias@
-top_build_prefix = @top_build_prefix@
-top_builddir = @top_builddir@
-top_srcdir = @top_srcdir@
-pkgincludesubdir = $(pkgincludedir)/field
-SUBDIRS = NTL Givaro Modular
-BASIC_HDRS = \
- field-interface.h \
- field-traits.h \
- rebind.h \
- abstract.h \
- archetype.h \
- envelope.h \
- unparametric.h \
- param-fuzzy.h \
- gmp-rational.h \
- modular.h \
- modular-balanced.h \
- gf2.h \
- gf2.inl \
- hom.h \
- map.h \
- PIR-modular-int32.h \
- local2_32.h \
- PID-integer.h \
- PID-double.h \
- block-ring.h \
- multimod-field.h
-
-NTL_HDRS = \
- ntl.h \
- PID-ntl-zz_p.h \
- PIR-ntl-ZZ_p.h
-
-GIVARO_HDRS = \
- givaro.h
-
-LIDIA_HDRS = \
- lidia.h \
- lidia-gfq.h
-
- at LINBOX_HAVE_NTL_TRUE@USE_NTL_HDRS = $(NTL_HDRS)
- at LINBOX_HAVE_GIVARO_TRUE@USE_GIVARO_HDRS = $(GIVARO_HDRS)
- at LINBOX_HAVE_LIDIA_TRUE@USE_LIDIA_HDRS = $(LIDIA_HDRS)
-pkgincludesub_HEADERS = \
- $(BASIC_HDRS) \
- $(USE_NTL_HDRS) \
- $(USE_GIVARO_HDRS) \
- $(USE_LIDIA_HDRS)
-
-EXTRA_DIST = \
- $(NTL_HDRS) \
- $(GIVARO_HDRS) \
- $(LIDIA_HDRS) \
- field.doxy \
- modular.doxy \
- integers.doxy \
- lidia.doxy \
- ntl.doxy
-
-all: all-recursive
-
-.SUFFIXES:
-$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps)
- @for dep in $?; do \
- case '$(am__configure_deps)' in \
- *$$dep*) \
- ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
- && { if test -f $@; then exit 0; else break; fi; }; \
- exit 1;; \
- esac; \
- done; \
- echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu --ignore-deps linbox/field/Makefile'; \
- $(am__cd) $(top_srcdir) && \
- $(AUTOMAKE) --gnu --ignore-deps linbox/field/Makefile
-.PRECIOUS: Makefile
-Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
- @case '$?' in \
- *config.status*) \
- cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
- *) \
- echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
- cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
- esac;
-
-$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
- cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-
-$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
- cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
- cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-$(am__aclocal_m4_deps):
-
-mostlyclean-libtool:
- -rm -f *.lo
-
-clean-libtool:
- -rm -rf .libs _libs
-install-pkgincludesubHEADERS: $(pkgincludesub_HEADERS)
- @$(NORMAL_INSTALL)
- @list='$(pkgincludesub_HEADERS)'; test -n "$(pkgincludesubdir)" || list=; \
- if test -n "$$list"; then \
- echo " $(MKDIR_P) '$(DESTDIR)$(pkgincludesubdir)'"; \
- $(MKDIR_P) "$(DESTDIR)$(pkgincludesubdir)" || exit 1; \
- fi; \
- for p in $$list; do \
- if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
- echo "$$d$$p"; \
- done | $(am__base_list) | \
- while read files; do \
- echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(pkgincludesubdir)'"; \
- $(INSTALL_HEADER) $$files "$(DESTDIR)$(pkgincludesubdir)" || exit $$?; \
- done
-
-uninstall-pkgincludesubHEADERS:
- @$(NORMAL_UNINSTALL)
- @list='$(pkgincludesub_HEADERS)'; test -n "$(pkgincludesubdir)" || list=; \
- files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
- dir='$(DESTDIR)$(pkgincludesubdir)'; $(am__uninstall_files_from_dir)
-
-# This directory's subdirectories are mostly independent; you can cd
-# into them and run `make' without going through this Makefile.
-# To change the values of `make' variables: instead of editing Makefiles,
-# (1) if the variable is set in `config.status', edit `config.status'
-# (which will cause the Makefiles to be regenerated when you run `make');
-# (2) otherwise, pass the desired values on the `make' command line.
-$(RECURSIVE_TARGETS):
- @fail= failcom='exit 1'; \
- for f in x $$MAKEFLAGS; do \
- case $$f in \
- *=* | --[!k]*);; \
- *k*) failcom='fail=yes';; \
- esac; \
- done; \
- dot_seen=no; \
- target=`echo $@ | sed s/-recursive//`; \
- list='$(SUBDIRS)'; for subdir in $$list; do \
- echo "Making $$target in $$subdir"; \
- if test "$$subdir" = "."; then \
- dot_seen=yes; \
- local_target="$$target-am"; \
- else \
- local_target="$$target"; \
- fi; \
- ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
- || eval $$failcom; \
- done; \
- if test "$$dot_seen" = "no"; then \
- $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \
- fi; test -z "$$fail"
-
-$(RECURSIVE_CLEAN_TARGETS):
- @fail= failcom='exit 1'; \
- for f in x $$MAKEFLAGS; do \
- case $$f in \
- *=* | --[!k]*);; \
- *k*) failcom='fail=yes';; \
- esac; \
- done; \
- dot_seen=no; \
- case "$@" in \
- distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \
- *) list='$(SUBDIRS)' ;; \
- esac; \
- rev=''; for subdir in $$list; do \
- if test "$$subdir" = "."; then :; else \
- rev="$$subdir $$rev"; \
- fi; \
- done; \
- rev="$$rev ."; \
- target=`echo $@ | sed s/-recursive//`; \
- for subdir in $$rev; do \
- echo "Making $$target in $$subdir"; \
- if test "$$subdir" = "."; then \
- local_target="$$target-am"; \
- else \
- local_target="$$target"; \
- fi; \
- ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
- || eval $$failcom; \
- done && test -z "$$fail"
-tags-recursive:
- list='$(SUBDIRS)'; for subdir in $$list; do \
- test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \
- done
-ctags-recursive:
- list='$(SUBDIRS)'; for subdir in $$list; do \
- test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \
- done
-
-ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
- list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
- unique=`for i in $$list; do \
- if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
- done | \
- $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
- END { if (nonempty) { for (i in files) print i; }; }'`; \
- mkid -fID $$unique
-tags: TAGS
-
-TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
- $(TAGS_FILES) $(LISP)
- set x; \
- here=`pwd`; \
- if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \
- include_option=--etags-include; \
- empty_fix=.; \
- else \
- include_option=--include; \
- empty_fix=; \
- fi; \
- list='$(SUBDIRS)'; for subdir in $$list; do \
- if test "$$subdir" = .; then :; else \
- test ! -f $$subdir/TAGS || \
- set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \
- fi; \
- done; \
- list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
- unique=`for i in $$list; do \
- if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
- done | \
- $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
- END { if (nonempty) { for (i in files) print i; }; }'`; \
- shift; \
- if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
- test -n "$$unique" || unique=$$empty_fix; \
- if test $$# -gt 0; then \
- $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
- "$$@" $$unique; \
- else \
- $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
- $$unique; \
- fi; \
- fi
-ctags: CTAGS
-CTAGS: ctags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
- $(TAGS_FILES) $(LISP)
- list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
- unique=`for i in $$list; do \
- if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
- done | \
- $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
- END { if (nonempty) { for (i in files) print i; }; }'`; \
- test -z "$(CTAGS_ARGS)$$unique" \
- || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
- $$unique
-
-GTAGS:
- here=`$(am__cd) $(top_builddir) && pwd` \
- && $(am__cd) $(top_srcdir) \
- && gtags -i $(GTAGS_ARGS) "$$here"
-
-distclean-tags:
- -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
-
-distdir: $(DISTFILES)
- @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
- topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
- list='$(DISTFILES)'; \
- dist_files=`for file in $$list; do echo $$file; done | \
- sed -e "s|^$$srcdirstrip/||;t" \
- -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
- case $$dist_files in \
- */*) $(MKDIR_P) `echo "$$dist_files" | \
- sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
- sort -u` ;; \
- esac; \
- for file in $$dist_files; do \
- if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
- if test -d $$d/$$file; then \
- dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
- if test -d "$(distdir)/$$file"; then \
- find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
- fi; \
- if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
- cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
- find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
- fi; \
- cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
- else \
- test -f "$(distdir)/$$file" \
- || cp -p $$d/$$file "$(distdir)/$$file" \
- || exit 1; \
- fi; \
- done
- @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \
- if test "$$subdir" = .; then :; else \
- $(am__make_dryrun) \
- || test -d "$(distdir)/$$subdir" \
- || $(MKDIR_P) "$(distdir)/$$subdir" \
- || exit 1; \
- dir1=$$subdir; dir2="$(distdir)/$$subdir"; \
- $(am__relativize); \
- new_distdir=$$reldir; \
- dir1=$$subdir; dir2="$(top_distdir)"; \
- $(am__relativize); \
- new_top_distdir=$$reldir; \
- echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \
- echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \
- ($(am__cd) $$subdir && \
- $(MAKE) $(AM_MAKEFLAGS) \
- top_distdir="$$new_top_distdir" \
- distdir="$$new_distdir" \
- am__remove_distdir=: \
- am__skip_length_check=: \
- am__skip_mode_fix=: \
- distdir) \
- || exit 1; \
- fi; \
- done
-check-am: all-am
-check: check-recursive
-all-am: Makefile $(HEADERS)
-installdirs: installdirs-recursive
-installdirs-am:
- for dir in "$(DESTDIR)$(pkgincludesubdir)"; do \
- test -z "$$dir" || $(MKDIR_P) "$$dir"; \
- done
-install: install-recursive
-install-exec: install-exec-recursive
-install-data: install-data-recursive
-uninstall: uninstall-recursive
-
-install-am: all-am
- @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
-
-installcheck: installcheck-recursive
-install-strip:
- if test -z '$(STRIP)'; then \
- $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
- install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
- install; \
- else \
- $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
- install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
- "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
- fi
-mostlyclean-generic:
-
-clean-generic:
-
-distclean-generic:
- -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
- -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
-
-maintainer-clean-generic:
- @echo "This command is intended for maintainers to use"
- @echo "it deletes files that may require special tools to rebuild."
-clean: clean-recursive
-
-clean-am: clean-generic clean-libtool mostlyclean-am
-
-distclean: distclean-recursive
- -rm -f Makefile
-distclean-am: clean-am distclean-generic distclean-tags
-
-dvi: dvi-recursive
-
-dvi-am:
-
-html: html-recursive
-
-html-am:
-
-info: info-recursive
-
-info-am:
-
-install-data-am: install-pkgincludesubHEADERS
-
-install-dvi: install-dvi-recursive
-
-install-dvi-am:
-
-install-exec-am:
-
-install-html: install-html-recursive
-
-install-html-am:
-
-install-info: install-info-recursive
-
-install-info-am:
-
-install-man:
-
-install-pdf: install-pdf-recursive
-
-install-pdf-am:
-
-install-ps: install-ps-recursive
-
-install-ps-am:
-
-installcheck-am:
-
-maintainer-clean: maintainer-clean-recursive
- -rm -f Makefile
-maintainer-clean-am: distclean-am maintainer-clean-generic
-
-mostlyclean: mostlyclean-recursive
-
-mostlyclean-am: mostlyclean-generic mostlyclean-libtool
-
-pdf: pdf-recursive
-
-pdf-am:
-
-ps: ps-recursive
-
-ps-am:
-
-uninstall-am: uninstall-pkgincludesubHEADERS
-
-.MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) ctags-recursive \
- install-am install-strip tags-recursive
-
-.PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \
- all all-am check check-am clean clean-generic clean-libtool \
- ctags ctags-recursive distclean distclean-generic \
- distclean-libtool distclean-tags distdir dvi dvi-am html \
- html-am info info-am install install-am install-data \
- install-data-am install-dvi install-dvi-am install-exec \
- install-exec-am install-html install-html-am install-info \
- install-info-am install-man install-pdf install-pdf-am \
- install-pkgincludesubHEADERS install-ps install-ps-am \
- install-strip installcheck installcheck-am installdirs \
- installdirs-am maintainer-clean maintainer-clean-generic \
- mostlyclean mostlyclean-generic mostlyclean-libtool pdf pdf-am \
- ps ps-am tags tags-recursive uninstall uninstall-am \
- uninstall-pkgincludesubHEADERS
-
-
-# Tell versions [3.59,3.63) of GNU make to not export all variables.
-# Otherwise a system limit (for SysV at least) may be exceeded.
-.NOEXPORT:
diff --git a/linbox/field/Modular/Makefile.am b/linbox/field/Modular/Makefile.am
deleted file mode 100644
index 9c9b370..0000000
--- a/linbox/field/Modular/Makefile.am
+++ /dev/null
@@ -1,44 +0,0 @@
-# Copyright (c) 2010 the LinBox group
-# ========LICENCE========
-# This file is part of the library LinBox.
-#
-# LinBox is free software: you can redistribute it and/or modify
-# it under the terms of the GNU Lesser General Public
-# License as published by the Free Software Foundation; either
-# version 2.1 of the License, or (at your option) any later version.
-#
-# This library 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
-# Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public
-# License along with this library; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
-# ========LICENCE========
-
-
-
-pkgincludesubdir=$(pkgincludedir)/field/Modular
-
-BASIC_HDRS = \
- modular-unsigned.h \
- modular.inl \
- modular-int32.h \
- modular-int64.h \
- modular-short.h \
- modular-byte.h \
- modular-balanced-double.h \
- modular-balanced-float.h \
- modular-balanced-int32.h \
- modular-balanced-int64.h \
- modular-crooked-double.h \
- modular-double.h \
- modular-float.h
-
-
-pkgincludesub_HEADERS = \
- $(BASIC_HDRS)
-
-# EXTRA_DIST = \
- # modular.doxy
diff --git a/linbox/field/Modular/Makefile.in b/linbox/field/Modular/Makefile.in
deleted file mode 100644
index 41645ae..0000000
--- a/linbox/field/Modular/Makefile.in
+++ /dev/null
@@ -1,592 +0,0 @@
-# Makefile.in generated by automake 1.11.5 from Makefile.am.
-# @configure_input@
-
-# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software
-# Foundation, Inc.
-# This Makefile.in is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
-# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
-# PARTICULAR PURPOSE.
-
- at SET_MAKE@
-
-# Copyright (c) 2010 the LinBox group
-# ========LICENCE========
-# This file is part of the library LinBox.
-#
-# LinBox is free software: you can redistribute it and/or modify
-# it under the terms of the GNU Lesser General Public
-# License as published by the Free Software Foundation; either
-# version 2.1 of the License, or (at your option) any later version.
-#
-# This library 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
-# Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public
-# License along with this library; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
-# ========LICENCE========
-
-VPATH = @srcdir@
-am__make_dryrun = \
- { \
- am__dry=no; \
- case $$MAKEFLAGS in \
- *\\[\ \ ]*) \
- echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \
- | grep '^AM OK$$' >/dev/null || am__dry=yes;; \
- *) \
- for am__flg in $$MAKEFLAGS; do \
- case $$am__flg in \
- *=*|--*) ;; \
- *n*) am__dry=yes; break;; \
- esac; \
- done;; \
- esac; \
- test $$am__dry = yes; \
- }
-pkgdatadir = $(datadir)/@PACKAGE@
-pkgincludedir = $(includedir)/@PACKAGE@
-pkglibdir = $(libdir)/@PACKAGE@
-pkglibexecdir = $(libexecdir)/@PACKAGE@
-am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
-install_sh_DATA = $(install_sh) -c -m 644
-install_sh_PROGRAM = $(install_sh) -c
-install_sh_SCRIPT = $(install_sh) -c
-INSTALL_HEADER = $(INSTALL_DATA)
-transform = $(program_transform_name)
-NORMAL_INSTALL = :
-PRE_INSTALL = :
-POST_INSTALL = :
-NORMAL_UNINSTALL = :
-PRE_UNINSTALL = :
-POST_UNINSTALL = :
-build_triplet = @build@
-host_triplet = @host@
-subdir = linbox/field/Modular
-DIST_COMMON = $(pkgincludesub_HEADERS) $(srcdir)/Makefile.am \
- $(srcdir)/Makefile.in
-ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-am__aclocal_m4_deps = $(top_srcdir)/macros/aclocal-include.m4 \
- $(top_srcdir)/macros/config-header.m4 \
- $(top_srcdir)/macros/debug.m4 \
- $(top_srcdir)/macros/expat-check.m4 \
- $(top_srcdir)/macros/fflas-ffpack-check.m4 \
- $(top_srcdir)/macros/fplll-check.m4 \
- $(top_srcdir)/macros/givaro-check.m4 \
- $(top_srcdir)/macros/gmp-check.m4 \
- $(top_srcdir)/macros/iml-check.m4 \
- $(top_srcdir)/macros/lapack-check.m4 \
- $(top_srcdir)/macros/libtool.m4 \
- $(top_srcdir)/macros/lidia-check.m4 \
- $(top_srcdir)/macros/linbox-benchmark.m4 \
- $(top_srcdir)/macros/linbox-doc.m4 \
- $(top_srcdir)/macros/linbox-misc.m4 \
- $(top_srcdir)/macros/linbox-opt.m4 \
- $(top_srcdir)/macros/ltoptions.m4 \
- $(top_srcdir)/macros/ltsugar.m4 \
- $(top_srcdir)/macros/ltversion.m4 \
- $(top_srcdir)/macros/lt~obsolete.m4 \
- $(top_srcdir)/macros/m4ri-check.m4 \
- $(top_srcdir)/macros/m4rie-check.m4 \
- $(top_srcdir)/macros/maple-check.m4 \
- $(top_srcdir)/macros/mpfr-check.m4 \
- $(top_srcdir)/macros/ntl-check.m4 \
- $(top_srcdir)/macros/saclib-check.m4 \
- $(top_srcdir)/macros/sage-check.m4 $(top_srcdir)/configure.ac
-am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
- $(ACLOCAL_M4)
-mkinstalldirs = $(install_sh) -d
-CONFIG_HEADER = $(top_builddir)/config.h
-CONFIG_CLEAN_FILES =
-CONFIG_CLEAN_VPATH_FILES =
-depcomp =
-am__depfiles_maybe =
-SOURCES =
-DIST_SOURCES =
-am__can_run_installinfo = \
- case $$AM_UPDATE_INFO_DIR in \
- n|no|NO) false;; \
- *) (install-info --version) >/dev/null 2>&1;; \
- esac
-am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
-am__vpath_adj = case $$p in \
- $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
- *) f=$$p;; \
- esac;
-am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
-am__install_max = 40
-am__nobase_strip_setup = \
- srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
-am__nobase_strip = \
- for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
-am__nobase_list = $(am__nobase_strip_setup); \
- for p in $$list; do echo "$$p $$p"; done | \
- sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
- $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
- if (++n[$$2] == $(am__install_max)) \
- { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
- END { for (dir in files) print dir, files[dir] }'
-am__base_list = \
- sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
- sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
-am__uninstall_files_from_dir = { \
- test -z "$$files" \
- || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \
- || { echo " ( cd '$$dir' && rm -f" $$files ")"; \
- $(am__cd) "$$dir" && rm -f $$files; }; \
- }
-am__installdirs = "$(DESTDIR)$(pkgincludesubdir)"
-HEADERS = $(pkgincludesub_HEADERS)
-ETAGS = etags
-CTAGS = ctags
-DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
-ACLOCAL = @ACLOCAL@
-AMTAR = @AMTAR@
-AR = @AR@
-AUTOCONF = @AUTOCONF@
-AUTOHEADER = @AUTOHEADER@
-AUTOMAKE = @AUTOMAKE@
-AWK = @AWK@
-BLAS_CFLAGS = @BLAS_CFLAGS@
-BLAS_LIBS = @BLAS_LIBS@
-CC = @CC@
-CCNAM = @CCNAM@
-CFLAGS = @CFLAGS@
-CPPFLAGS = @CPPFLAGS@
-CXX = @CXX@
-CXXCPP = @CXXCPP@
-CXXFLAGS = @CXXFLAGS@
-CYGPATH_W = @CYGPATH_W@
-DBG = @DBG@
-DEBUG_CFLAGS = @DEBUG_CFLAGS@
-DEFAULT_CFLAGS = @DEFAULT_CFLAGS@
-DEFS = @DEFS@
-DLLTOOL = @DLLTOOL@
-DSYMUTIL = @DSYMUTIL@
-DUMPBIN = @DUMPBIN@
-ECHO_C = @ECHO_C@
-ECHO_N = @ECHO_N@
-ECHO_T = @ECHO_T@
-EGREP = @EGREP@
-EXEEXT = @EXEEXT@
-EXPAT_CFLAGS = @EXPAT_CFLAGS@
-EXPAT_LIBS = @EXPAT_LIBS@
-FFLAS_FFPACK_CFLAGS = @FFLAS_FFPACK_CFLAGS@
-FFLAS_FFPACK_LIBS = @FFLAS_FFPACK_LIBS@
-FFLAS_FFPACK_LOC = @FFLAS_FFPACK_LOC@
-FGREP = @FGREP@
-FPLLL_CFLAGS = @FPLLL_CFLAGS@
-FPLLL_LIBS = @FPLLL_LIBS@
-GIVARO_CFLAGS = @GIVARO_CFLAGS@
-GIVARO_LIBS = @GIVARO_LIBS@
-GMP_CFLAGS = @GMP_CFLAGS@
-GMP_LIBS = @GMP_LIBS@
-GMP_VERSION = @GMP_VERSION@
-GREP = @GREP@
-IML_CFLAGS = @IML_CFLAGS@
-IML_LIBS = @IML_LIBS@
-INSTALL = @INSTALL@
-INSTALL_DATA = @INSTALL_DATA@
-INSTALL_PROGRAM = @INSTALL_PROGRAM@
-INSTALL_SCRIPT = @INSTALL_SCRIPT@
-INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
-LD = @LD@
-LDFLAGS = @LDFLAGS@
-LIBOBJS = @LIBOBJS@
-LIBS = @LIBS@
-LIBTOOL = @LIBTOOL@
-LIDIA_CFLAGS = @LIDIA_CFLAGS@
-LIDIA_LIBS = @LIDIA_LIBS@
-LINBOX_BENCH_PATH = @LINBOX_BENCH_PATH@
-LINBOX_DOC_PATH = @LINBOX_DOC_PATH@
-LIPO = @LIPO@
-LN_S = @LN_S@
-LTLIBOBJS = @LTLIBOBJS@
-M4RIE_CFLAGS = @M4RIE_CFLAGS@
-M4RIE_LIBS = @M4RIE_LIBS@
-M4RI_CFLAGS = @M4RI_CFLAGS@
-M4RI_LIBS = @M4RI_LIBS@
-MAINT = @MAINT@
-MAKEINFO = @MAKEINFO@
-MANIFEST_TOOL = @MANIFEST_TOOL@
-MAPLE_CFLAGS = @MAPLE_CFLAGS@
-MAPLE_HOME = @MAPLE_HOME@
-MAPLE_LIBS = @MAPLE_LIBS@
-MAPLE_VERSION = @MAPLE_VERSION@
-MKDIR_P = @MKDIR_P@
-MPFR_CFLAGS = @MPFR_CFLAGS@
-MPFR_LIBS = @MPFR_LIBS@
-NM = @NM@
-NMEDIT = @NMEDIT@
-NTL_CFLAGS = @NTL_CFLAGS@
-NTL_LIBS = @NTL_LIBS@
-OBJDUMP = @OBJDUMP@
-OBJEXT = @OBJEXT@
-OTOOL = @OTOOL@
-OTOOL64 = @OTOOL64@
-PACKAGE = @PACKAGE@
-PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
-PACKAGE_NAME = @PACKAGE_NAME@
-PACKAGE_STRING = @PACKAGE_STRING@
-PACKAGE_TARNAME = @PACKAGE_TARNAME@
-PACKAGE_URL = @PACKAGE_URL@
-PACKAGE_VERSION = @PACKAGE_VERSION@
-PATH_SEPARATOR = @PATH_SEPARATOR@
-PROF = @PROF@
-RANLIB = @RANLIB@
-RM = @RM@
-SACLIB_CFLAGS = @SACLIB_CFLAGS@
-SACLIB_LIBS = @SACLIB_LIBS@
-SED = @SED@
-SET_MAKE = @SET_MAKE@
-SHELL = @SHELL@
-STRIP = @STRIP@
-TESTS_CFLAGS = @TESTS_CFLAGS@
-VERSION = @VERSION@
-WARN = @WARN@
-abs_builddir = @abs_builddir@
-abs_srcdir = @abs_srcdir@
-abs_top_builddir = @abs_top_builddir@
-abs_top_srcdir = @abs_top_srcdir@
-ac_ct_AR = @ac_ct_AR@
-ac_ct_CC = @ac_ct_CC@
-ac_ct_CXX = @ac_ct_CXX@
-ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
-am__leading_dot = @am__leading_dot@
-am__tar = @am__tar@
-am__untar = @am__untar@
-bindir = @bindir@
-build = @build@
-build_alias = @build_alias@
-build_cpu = @build_cpu@
-build_os = @build_os@
-build_vendor = @build_vendor@
-builddir = @builddir@
-datadir = @datadir@
-datarootdir = @datarootdir@
-docdir = @docdir@
-dvidir = @dvidir@
-exec_prefix = @exec_prefix@
-host = @host@
-host_alias = @host_alias@
-host_cpu = @host_cpu@
-host_os = @host_os@
-host_vendor = @host_vendor@
-htmldir = @htmldir@
-includedir = @includedir@
-infodir = @infodir@
-install_sh = @install_sh@
-libdir = @libdir@
-libexecdir = @libexecdir@
-localedir = @localedir@
-localstatedir = @localstatedir@
-mandir = @mandir@
-mkdir_p = @mkdir_p@
-oldincludedir = @oldincludedir@
-pdfdir = @pdfdir@
-prefix = @prefix@
-program_transform_name = @program_transform_name@
-psdir = @psdir@
-sbindir = @sbindir@
-sharedstatedir = @sharedstatedir@
-srcdir = @srcdir@
-sysconfdir = @sysconfdir@
-target_alias = @target_alias@
-top_build_prefix = @top_build_prefix@
-top_builddir = @top_builddir@
-top_srcdir = @top_srcdir@
-pkgincludesubdir = $(pkgincludedir)/field/Modular
-BASIC_HDRS = \
- modular-unsigned.h \
- modular.inl \
- modular-int32.h \
- modular-int64.h \
- modular-short.h \
- modular-byte.h \
- modular-balanced-double.h \
- modular-balanced-float.h \
- modular-balanced-int32.h \
- modular-balanced-int64.h \
- modular-crooked-double.h \
- modular-double.h \
- modular-float.h
-
-pkgincludesub_HEADERS = \
- $(BASIC_HDRS)
-
-all: all-am
-
-.SUFFIXES:
-$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps)
- @for dep in $?; do \
- case '$(am__configure_deps)' in \
- *$$dep*) \
- ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
- && { if test -f $@; then exit 0; else break; fi; }; \
- exit 1;; \
- esac; \
- done; \
- echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu --ignore-deps linbox/field/Modular/Makefile'; \
- $(am__cd) $(top_srcdir) && \
- $(AUTOMAKE) --gnu --ignore-deps linbox/field/Modular/Makefile
-.PRECIOUS: Makefile
-Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
- @case '$?' in \
- *config.status*) \
- cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
- *) \
- echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
- cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
- esac;
-
-$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
- cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-
-$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
- cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
- cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-$(am__aclocal_m4_deps):
-
-mostlyclean-libtool:
- -rm -f *.lo
-
-clean-libtool:
- -rm -rf .libs _libs
-install-pkgincludesubHEADERS: $(pkgincludesub_HEADERS)
- @$(NORMAL_INSTALL)
- @list='$(pkgincludesub_HEADERS)'; test -n "$(pkgincludesubdir)" || list=; \
- if test -n "$$list"; then \
- echo " $(MKDIR_P) '$(DESTDIR)$(pkgincludesubdir)'"; \
- $(MKDIR_P) "$(DESTDIR)$(pkgincludesubdir)" || exit 1; \
- fi; \
- for p in $$list; do \
- if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
- echo "$$d$$p"; \
- done | $(am__base_list) | \
- while read files; do \
- echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(pkgincludesubdir)'"; \
- $(INSTALL_HEADER) $$files "$(DESTDIR)$(pkgincludesubdir)" || exit $$?; \
- done
-
-uninstall-pkgincludesubHEADERS:
- @$(NORMAL_UNINSTALL)
- @list='$(pkgincludesub_HEADERS)'; test -n "$(pkgincludesubdir)" || list=; \
- files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
- dir='$(DESTDIR)$(pkgincludesubdir)'; $(am__uninstall_files_from_dir)
-
-ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
- list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
- unique=`for i in $$list; do \
- if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
- done | \
- $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
- END { if (nonempty) { for (i in files) print i; }; }'`; \
- mkid -fID $$unique
-tags: TAGS
-
-TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
- $(TAGS_FILES) $(LISP)
- set x; \
- here=`pwd`; \
- list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
- unique=`for i in $$list; do \
- if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
- done | \
- $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
- END { if (nonempty) { for (i in files) print i; }; }'`; \
- shift; \
- if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
- test -n "$$unique" || unique=$$empty_fix; \
- if test $$# -gt 0; then \
- $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
- "$$@" $$unique; \
- else \
- $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
- $$unique; \
- fi; \
- fi
-ctags: CTAGS
-CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
- $(TAGS_FILES) $(LISP)
- list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
- unique=`for i in $$list; do \
- if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
- done | \
- $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
- END { if (nonempty) { for (i in files) print i; }; }'`; \
- test -z "$(CTAGS_ARGS)$$unique" \
- || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
- $$unique
-
-GTAGS:
- here=`$(am__cd) $(top_builddir) && pwd` \
- && $(am__cd) $(top_srcdir) \
- && gtags -i $(GTAGS_ARGS) "$$here"
-
-distclean-tags:
- -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
-
-distdir: $(DISTFILES)
- @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
- topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
- list='$(DISTFILES)'; \
- dist_files=`for file in $$list; do echo $$file; done | \
- sed -e "s|^$$srcdirstrip/||;t" \
- -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
- case $$dist_files in \
- */*) $(MKDIR_P) `echo "$$dist_files" | \
- sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
- sort -u` ;; \
- esac; \
- for file in $$dist_files; do \
- if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
- if test -d $$d/$$file; then \
- dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
- if test -d "$(distdir)/$$file"; then \
- find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
- fi; \
- if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
- cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
- find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
- fi; \
- cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
- else \
- test -f "$(distdir)/$$file" \
- || cp -p $$d/$$file "$(distdir)/$$file" \
- || exit 1; \
- fi; \
- done
-check-am: all-am
-check: check-am
-all-am: Makefile $(HEADERS)
-installdirs:
- for dir in "$(DESTDIR)$(pkgincludesubdir)"; do \
- test -z "$$dir" || $(MKDIR_P) "$$dir"; \
- done
-install: install-am
-install-exec: install-exec-am
-install-data: install-data-am
-uninstall: uninstall-am
-
-install-am: all-am
- @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
-
-installcheck: installcheck-am
-install-strip:
- if test -z '$(STRIP)'; then \
- $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
- install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
- install; \
- else \
- $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
- install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
- "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
- fi
-mostlyclean-generic:
-
-clean-generic:
-
-distclean-generic:
- -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
- -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
-
-maintainer-clean-generic:
- @echo "This command is intended for maintainers to use"
- @echo "it deletes files that may require special tools to rebuild."
-clean: clean-am
-
-clean-am: clean-generic clean-libtool mostlyclean-am
-
-distclean: distclean-am
- -rm -f Makefile
-distclean-am: clean-am distclean-generic distclean-tags
-
-dvi: dvi-am
-
-dvi-am:
-
-html: html-am
-
-html-am:
-
-info: info-am
-
-info-am:
-
-install-data-am: install-pkgincludesubHEADERS
-
-install-dvi: install-dvi-am
-
-install-dvi-am:
-
-install-exec-am:
-
-install-html: install-html-am
-
-install-html-am:
-
-install-info: install-info-am
-
-install-info-am:
-
-install-man:
-
-install-pdf: install-pdf-am
-
-install-pdf-am:
-
-install-ps: install-ps-am
-
-install-ps-am:
-
-installcheck-am:
-
-maintainer-clean: maintainer-clean-am
- -rm -f Makefile
-maintainer-clean-am: distclean-am maintainer-clean-generic
-
-mostlyclean: mostlyclean-am
-
-mostlyclean-am: mostlyclean-generic mostlyclean-libtool
-
-pdf: pdf-am
-
-pdf-am:
-
-ps: ps-am
-
-ps-am:
-
-uninstall-am: uninstall-pkgincludesubHEADERS
-
-.MAKE: install-am install-strip
-
-.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \
- clean-libtool ctags distclean distclean-generic \
- distclean-libtool distclean-tags distdir dvi dvi-am html \
- html-am info info-am install install-am install-data \
- install-data-am install-dvi install-dvi-am install-exec \
- install-exec-am install-html install-html-am install-info \
- install-info-am install-man install-pdf install-pdf-am \
- install-pkgincludesubHEADERS install-ps install-ps-am \
- install-strip installcheck installcheck-am installdirs \
- maintainer-clean maintainer-clean-generic mostlyclean \
- mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
- tags uninstall uninstall-am uninstall-pkgincludesubHEADERS
-
-
-# EXTRA_DIST = \
-# # modular.doxy
-
-# Tell versions [3.59,3.63) of GNU make to not export all variables.
-# Otherwise a system limit (for SysV at least) may be exceeded.
-.NOEXPORT:
diff --git a/linbox/field/Modular/modular-balanced-double.h b/linbox/field/Modular/modular-balanced-double.h
deleted file mode 100644
index 839f65d..0000000
--- a/linbox/field/Modular/modular-balanced-double.h
+++ /dev/null
@@ -1,342 +0,0 @@
-/* linbox/field/modular-balanced-double.h
- * Copyright (C) 2003 Pascal Giorgi
- * 2005,2008 Clement Pernet
- * Written by Pascal Giorgi <pascal.giorgi at ens-lyon.fr>
- * and Clement Pernet <Clement.Pernet at imag.fr>
- *
- * ------------------------------------
- *
- *
- * ========LICENCE========
- * This file is part of the library LinBox.
- *
- * LinBox is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- * ========LICENCE========
- *.
- */
-
-/*! @file field/Modular/modular-balanced-double.h
- * @ingroup field
- * @brief Balanced representation of <code>Z/mZ</code> over \c double .
- */
-
-#ifndef __LINBOX_modular_balanced_double_H
-#define __LINBOX_modular_balanced_double_H
-
-#ifdef __INTEL_COMPILER
-#define FmodF fmodf
-#else
-#define FmodF fmod
-#endif
-
-#include "linbox/linbox-config.h"
-#include "linbox/integer.h"
-#include "linbox/vector/vector-domain.h"
-#include "linbox/field/field-interface.h"
-#include "linbox/field/field-traits.h"
-#include "linbox/util/field-axpy.h"
-#include "linbox/util/debug.h"
-#include <math.h>
-#include "linbox/field/field-traits.h"
-#include "linbox/randiter/modular-balanced.h"
-#include "linbox/randiter/nonzero.h"
-
-#include <fflas-ffpack/field/modular-balanced-double.h>
-
-
-// Namespace in which all LinBox code resides
-namespace LinBox
-{
-
- template< class Element >
- class ModularBalanced;
-
- template <class Ring>
- struct ClassifyRing;
-
- template <class Element>
- struct ClassifyRing<ModularBalanced<Element> >;
-
- template <>
- struct ClassifyRing<ModularBalanced<double> > {
- typedef RingCategories::ModularTag categoryTag;
- };
-
- class MultiModDouble;
-
- /*! \ingroup modular
- * Centered representation of \f$\mathbf{Z}/m\mathbf{Z}\f$.
- * If \c m is the modulus, then elements are represented in \f[ \left
- * \llbracket \left \lceil -\frac{m-1}{2} \right \rceil, \left \lceil
- * \frac{m-1}{2} \right \rceil \right \rrbracket.\f] This
- * representation allows more accumulations before a reduction is
- * necessary, at the cost of a more expensive reduction.
- */
- template<>
- class ModularBalanced<double> : public FieldInterface,
- public FFPACK::ModularBalanced<double> {
-
- public:
- typedef FFPACK::ModularBalanced<double> Father_t ;
- friend class FieldAXPY<ModularBalanced<double> >;
- friend class DotProductDomain<ModularBalanced<double> >;
- friend class MultiModDouble;
-
- typedef double Element;
- typedef ModularBalancedRandIter<double> RandIter;
-
- static ClassifyRing <ModularBalanced<double> >::categoryTag getCategory()
- {
- return ClassifyRing<ModularBalanced<double> >::categoryTag();
- }
-
- ModularBalanced (const integer& p, int e = 1) :
- Father_t((unsigned long)p)
- {
-#ifdef DEBUG
- if (p > (integer) ULONG_MAX)
- throw PreconditionFailed(__func__,__FILE__,__LINE__,"prime too big");
- if(modulus <= 1)
- throw PreconditionFailed(__func__,__FILE__,__LINE__,"modulus must be > 1");
- if(modulus > getMaxModulus())
- throw PreconditionFailed(__func__,__FILE__,__LINE__,"modulus is too big");
-#endif
-
- }
-
- using Father_t::cardinality ;
- integer &cardinality (integer &c) const
- {
- return c = integer(modulus);
- }
-
- using Father_t::characteristic ;
- integer &characteristic (integer &c) const
- {
- return c = integer(modulus);
- }
-
- using Father_t::convert ;
- integer &convert (integer &x, const Element &y) const
- {
- return x = integer (y);
- }
-
- using Father_t::init ;
- Element &init (Element &x, const integer &y) const
- {
- x = (Element)(y%lmodulus);
- if (x<mhalf_mod) return x += modulus ;
- else if (x>half_mod) return x -= modulus ;
- return x ;
- }
-
- Element &init(Element &x) const
- {
- return x = 0 ;
- }
-
- //! @bug faux si modulus==2
- inline bool isMinusOne (const Element &x) const
- {
- return (x == -1.);
- }
-
- unsigned long AccBound(const Element&r) const
- {
- // Element one, zero ; init(one,1UL) ; init(zero,0UL);
- double max_double = (double) (1ULL<<DBL_MANT_DIG) - modulus ;
- double p = std::max(half_mod,-mhalf_mod) ;
- if (areEqual(zero,r))
- return (unsigned long) (double(max_double)/p) ;
- else if (areEqual(one,r))
- {
- if (modulus>= getMaxModulus())
- return 0 ;
- else
- return (unsigned long) (double(max_double)/(p*p)) ;
- }
- else
- throw LinboxError("Bad input, expecting 0 or 1");
- return 0;
- }
-
- };
-
- //! Specialization of FieldAXPY.
- template <>
- class FieldAXPY<ModularBalanced<double> > {
- public:
-
- typedef double Element;
- typedef ModularBalanced<double> Field;
-
- FieldAXPY (const Field &F) :
- _field (F),
- _y(0.) , _bound( (double) ((1ULL << 53) - (int) (_field.modulus*_field.modulus)))
- {}
-
- FieldAXPY (const FieldAXPY &faxpy) :
- _field (faxpy._field),
- _y(faxpy._y), _bound(faxpy._bound)
- {}
-
- FieldAXPY<ModularBalanced<double> > &operator = (const FieldAXPY &faxpy)
- {
- _field = faxpy._field;
- _y= faxpy._y;
- _bound= faxpy._bound;
- return *this;
- }
-
- inline Element& mulacc (const Element &a, const Element &x)
- {
- // Element tmp= a*x;
- // return accumulate(tmp);
- return accumulate(a*x);
- }
-
- inline Element& accumulate (const Element &tmp)
- {
- _y += tmp;
- if (_y > _bound)
- return _y = fmod (_y, _field.modulus);
- else
- return _y;
- }
- inline Element& subumulate (const Element &tmp)
- {
- _y -= tmp;
- if (_y < 0)
- return _y += _field.modulus;
- else
- return _y;
- }
-
- inline Element& get (Element &y) {
- _y = fmod (_y, _field.modulus);
- return y=_y ;
- }
-
- inline FieldAXPY &assign (const Element y) {
- _y = y;
- return *this;
- }
-
- inline void reset() {
- _y = 0.;
- }
-
- inline Element& set (const Element &tmp) {
- _y = tmp;
- if (_y > _bound)
- return _y = fmod (_y, _field.modulus);
- else
- return _y;
- }
-
- private:
-
- Field _field;
- double _y;
- double _bound;
- };
-
-
- //! Specialization of DotProductDomain.
- template <>
- class DotProductDomain<ModularBalanced<double> > : private virtual VectorDomainBase<ModularBalanced<double> > {
- private:
- double _bound;
- size_t _nmax;
-
- public:
- typedef double Element;
- DotProductDomain (const ModularBalanced<double> &F) :
- VectorDomainBase<ModularBalanced<double> > (F), _bound( (double) ( (1ULL<<53) - (int) (_field.modulus*_field.modulus)))
- {
- _nmax= (size_t)floor((double(1<<26)* double(1<<26)*2.)/ (_field.modulus * _field.modulus));
- }
-
- protected:
- template <class Vector1, class Vector2>
- inline Element &dotSpecializedDD (Element &res, const Vector1 &v1, const Vector2 &v2) const
- {
-
- double y = 0.;
- double t = 0.;
- if (v1.size() < _nmax) {
- for (size_t i = 0; i< v1.size();++i)
- y += v1[i] * v2[i] ;
- y = fmod(y, _field.modulus);
- }
- else{
- size_t i=0;
- for (;i< v1.size()- _nmax ;i=i+_nmax){
- for (size_t j=i;j<i+_nmax;++j)
- y += v1[j] * v2[j];
- t+=fmod(y, _field.modulus);
- y=0.;
- }
- for (;i < v1.size();++i)
- y += v1[i] * v2[i];
- t+=fmod(y, _field.modulus);
- y = fmod(t, _field.modulus);
- }
- return res = y;
- }
-
- template <class Vector1, class Vector2>
- inline Element &dotSpecializedDSP (Element &res, const Vector1 &v1, const Vector2 &v2) const
- {
-
- double y = 0.;
- double t =0.;
-
-
- if (v1.first.size() < _nmax) {
- for (size_t i=0;i<v1.first.size();++i)
- y+= v1.second[i] * v2[v1.first[i]];
- y = fmod(y, _field.modulus);
- }
- else {
- size_t i=0;
- for (;i< v1.first.size()- _nmax ;i=i+_nmax){
- for (size_t j=i;j<i+_nmax;++j)
- y += v1.second[j] * v2[v1.first[j]];
- t+=fmod(y, _field.modulus);
- y=0.;
- }
- for (;i < v1.first.size();++i)
- y += v1.second[i] * v2[v1.first[i]];
- t+= fmod(y, _field.modulus);
- y = fmod(t, _field.modulus);
- }
- return res = y;
- }
- };
-}
-
-#endif //__LINBOX_modular_balanced_double_H
-
-
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
-// Local Variables:
-// mode: C++
-// tab-width: 8
-// indent-tabs-mode: nil
-// c-basic-offset: 8
-// End:
-
diff --git a/linbox/field/Modular/modular-balanced-float.h b/linbox/field/Modular/modular-balanced-float.h
deleted file mode 100644
index 0d8f4f4..0000000
--- a/linbox/field/Modular/modular-balanced-float.h
+++ /dev/null
@@ -1,336 +0,0 @@
-/* field/modular-balanced-float.h
- * Copyright (C) 2003 Pascal Giorgi
- * 2005,2008 Clement Pernet
- * Written by Clement Pernet <clement.pernet at gmail.com>
- * Pascal Giorgi <pascal.giorgi at ens-lyon.fr>
- * Modified Brice Boyer <bboyer at imag.fr>
- * ------------------------------------
- *
- *
- * ========LICENCE========
- * This file is part of the library LinBox.
- *
- * LinBox is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- * ========LICENCE========
- *.
- */
-
-/*! @file field/Modular/modular-balanced-float.h
- * @ingroup field
- * @brief Balanced representation of <code>Z/mZ</code> over \c float .
- */
-
-#ifndef __LINBOX_modular_balanced_float_H
-#define __LINBOX_modular_balanced_float_H
-
-#ifdef __INTEL_COMPILER
-#define FmodF fmodf
-#else
-#define FmodF fmod
-#endif
-
-#include "linbox/linbox-config.h"
-#include "linbox/integer.h"
-#include "linbox/vector/vector-domain.h"
-#include "linbox/field/field-interface.h"
-#include "linbox/field/field-traits.h"
-#include "linbox/util/field-axpy.h"
-#include "linbox/util/debug.h"
-#include <math.h>
-#include "linbox/field/field-traits.h"
-#include "linbox/randiter/modular-balanced.h"
-#include "linbox/randiter/nonzero.h"
-
-#include <fflas-ffpack/field/modular-balanced-float.h>
-
-
-// Namespace in which all LinBox code resides
-namespace LinBox
-{
-
- template< class Element >
- class ModularBalanced;
-
- template <class Ring>
- struct ClassifyRing;
-
- template <class Element>
- struct ClassifyRing<ModularBalanced<Element> >;
-
- template <>
- struct ClassifyRing<ModularBalanced<float> > {
- typedef RingCategories::ModularTag categoryTag;
- };
-
- class MultiModFloat;
-
- /// \ingroup field
- template <>
- class ModularBalanced<float> : public FieldInterface,
- public FFPACK::ModularBalanced<float> {
- public :
- typedef float Element;
- typedef FFPACK::ModularBalanced<float> Father_t ;
-
- friend class FieldAXPY<ModularBalanced<Element> >;
- friend class DotProductDomain<ModularBalanced<Element> >;
- friend class MultiModFloat;
-
- typedef ModularBalancedRandIter<Element> RandIter;
-
- static ClassifyRing <ModularBalanced<Element> >::categoryTag
- getCategory()
- {
- return ClassifyRing<ModularBalanced<Element> >::categoryTag();
- }
-
- ModularBalanced (const integer& p, int e = 1) :
- Father_t((unsigned long)p)
- {
-#ifdef DEBUG
- if(modulus <= 1)
- throw PreconditionFailed(__func__,__FILE__,__LINE__,"modulus must be > 1");
- if(modulus > getMaxModulus())
- throw PreconditionFailed(__func__,__FILE__,__LINE__,"modulus is too big");
- // check integer not too big.
-#endif
-
- }
-
-
- using Father_t::cardinality ;
- inline integer &cardinality (integer &c) const
- {
- return c = integer(modulus);
- }
-
- using Father_t::characteristic ;
- inline integer &characteristic (integer &c) const
- {
- return c = integer(modulus);
- }
-
- using Father_t::convert ;
- inline integer &convert (integer &x, const Element &y) const
- {
- // if ( y < 0. )
- // return x = integer (y + modulus) ;
- // else
- return x = integer (y);
- }
-
- using Father_t::init ;
- inline Element &init (Element &x, const integer &y) const
- {
- x = (Element)(y%lmodulus);
- if (x > half_mod) return x -= modulus;
- else if (x < mhalf_mod) return x += modulus;
-
- return x;
- }
-
- Element &init(Element &x) const
- {
- return x = 0 ;
- }
-
- inline bool isMinusOne (const Element &x) const
- {
- return (x == -1.);
- }
-
- unsigned long AccBound(const Element&r) const
- {
- // Element one, zero ; init(one,1UL) ; init(zero,0UL);
- double max_double = (double) (1ULL<<FLT_MANT_DIG) - modulus ;
- double p = std::max(half_mod,-mhalf_mod) ;
- if (areEqual(zero,r))
- return (unsigned long) (double(max_double)/p) ;
- else if (areEqual(one,r))
- {
- if (modulus>= getMaxModulus())
- return 0 ;
- else
- return (unsigned long) (double(max_double)/(p*p)) ;
- }
- else
- throw LinboxError("Bad input, expecting 0 or 1");
- return 0;
- }
-
- };
-
- template <>
- class FieldAXPY<ModularBalanced<float> > {
- public:
- typedef float Element;
- typedef ModularBalanced<Element> Field;
-
- FieldAXPY (const Field &F) :
- _field (F),
- _y(0.) , _bound( (Element) (((1ULL << 24) - (int) (_field.modulus*_field.modulus))))
- {}
-
- FieldAXPY (const FieldAXPY &faxpy) :
- _field (faxpy._field),
- _y(faxpy._y), _bound(faxpy._bound)
- {}
-
- FieldAXPY<ModularBalanced<Element> > &operator = (const FieldAXPY &faxpy) {
- _field = faxpy._field;
- _y= faxpy._y;
- _bound= faxpy._bound;
- return *this;
- }
-
- inline Element& mulacc (const Element &a, const Element &x) {
- // Element tmp= a*x;
- // return accumulate(tmp);
- return accumulate(a*x);
- }
-
- inline Element& accumulate (const Element &tmp) {
- _y += tmp;
- if (_y > _bound)
- return _y = fmodf (_y, _field.modulus);
- else
- return _y;
- }
- inline Element& subumulate (const Element &tmp) {
- _y -= tmp;
- if (_y < 0)
- return _y += _field.modulus;
- else
- return _y;
- }
-
- inline Element& get (Element &y) {
- _y = fmodf (_y, _field.modulus);
- return y=_y ;
- }
-
- inline FieldAXPY &assign (const Element y) {
- _y = y;
- return *this;
- }
-
- inline void reset() {
- _y = 0.;
- }
-
- inline Element& set (const Element &tmp) {
- _y = tmp;
- if (_y > _bound)
- return _y = fmodf (_y, _field.modulus);
- else
- return _y;
- }
-
- private:
- Field _field;
- Element _y;
- Element _bound;
- };
-
-
- template <>
- class DotProductDomain<ModularBalanced<float> > : private virtual VectorDomainBase<ModularBalanced<float> > {
- public:
- typedef float Element;
- DotProductDomain (const ModularBalanced<Element> &F) :
- VectorDomainBase<ModularBalanced<Element> > (F), _bound( (Element) ( (1ULL<<24) - (int) (_field.modulus*_field.modulus)))
- {
- _nmax= (size_t)floor((Element(1<<11)* Element(1<<11)*2.)/ (_field.modulus * _field.modulus));
- }
-
- protected:
- template <class Vector1, class Vector2>
- inline Element &dotSpecializedDD (Element &res, const Vector1 &v1, const Vector2 &v2) const
- {
-
- Element y = 0.;
- Element t = 0.;
- if (v1.size() < _nmax) {
- for (size_t i = 0; i< v1.size();++i)
- y += v1[i] * v2[i] ;
- y = fmodf(y, _field.modulus);
- }
- else{
- size_t i=0;
- for (;i< v1.size()- _nmax ;i=i+_nmax){
- for (size_t j=i;j<i+_nmax;++j)
- y += v1[j] * v2[j];
- t+= fmodf(y, _field.modulus);
- y=0.;
- }
- for (;i < v1.size();++i)
- y += v1[i] * v2[i];
- t+= fmodf(y, _field.modulus);
- y = fmodf(t, _field.modulus);
- }
- return res = y;
- }
-
- template <class Vector1, class Vector2>
- inline Element &dotSpecializedDSP (Element &res, const Vector1 &v1, const Vector2 &v2) const
- {
-
- Element y = 0.;
- Element t =0.;
-
-
- if (v1.first.size() < _nmax) {
- for (size_t i=0;i<v1.first.size();++i)
- y+= v1.second[i] * v2[v1.first[i]];
- y = fmodf(y, _field.modulus);
- }
- else {
- size_t i=0;
- for (;i< v1.first.size()- _nmax ;i=i+_nmax){
- for (size_t j=i;j<i+_nmax;++j)
- y += v1.second[j] * v2[v1.first[j]];
- t+=fmodf(y, _field.modulus);
- y=0.;
- }
- for (;i < v1.first.size();++i)
- y += v1.second[i] * v2[v1.first[i]];
- t+= fmodf(y, _field.modulus);
- y = fmodf(t, _field.modulus);
- }
- return res = y;
- }
- private:
- Element _bound;
- size_t _nmax;
-
- };
-} // Namespace LinBox
-
-#include "linbox/randiter/modular-balanced.h"
-#include "linbox/randiter/nonzero.h"
-
-#undef FmodF
-
-#endif //__LINBOX_modular_balanced_float_H
-
-
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
-// Local Variables:
-// mode: C++
-// tab-width: 8
-// indent-tabs-mode: nil
-// c-basic-offset: 8
-// End:
-
diff --git a/linbox/field/Modular/modular-balanced-int32.h b/linbox/field/Modular/modular-balanced-int32.h
deleted file mode 100644
index 82282a3..0000000
--- a/linbox/field/Modular/modular-balanced-int32.h
+++ /dev/null
@@ -1,336 +0,0 @@
-/* Copyright (C) 2009 LinBox
- * Written by C Pernet
- * updated to compilable condition by <brice.boyer at imag.fr>
- *
- *
- *
- * ========LICENCE========
- * This file is part of the library LinBox.
- *
- * LinBox is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- * ========LICENCE========
- */
-
-
-/*! @file field/Modular/modular-balanced-int32.h
- * @ingroup field
- * @brief Balanced representation of <code>Z/mZ</code> over \c int32_t .
- */
-
-#ifndef __LINBOX_modular_balanced_int32_H
-#define __LINBOX_modular_balanced_int32_H
-
-
-#include "linbox/linbox-config.h"
-#include "linbox/integer.h"
-#include "linbox/vector/vector-domain.h"
-#include "linbox/field/field-interface.h"
-#include "linbox/field/field-traits.h"
-#include "linbox/util/field-axpy.h"
-#include "linbox/util/debug.h"
-#include "linbox/field/field-traits.h"
-#include "linbox/field/Modular/modular-int32.h"
-
-#include <fflas-ffpack/field/modular-balanced-int32.h>
-
-#ifndef LINBOX_MAX_INT /* 2147483647 */
-#define LINBOX_MAX_INT INT32_MAX
-#endif
-
-
-// Namespace in which all LinBox code resides
-namespace LinBox
-{
-
- template< class Element >
- class ModularBalanced;
- template< class Element >
- class ModularBalancedRandIter;
- template< class Field, class RandIter >
- class NonzeroRandIter;
-
-
- template <class Ring>
- struct ClassifyRing;
-
- template<class Element>
- struct ClassifyRing<ModularBalanced<Element> >;
-
- template<>
- struct ClassifyRing<ModularBalanced<int32_t> > {
- typedef RingCategories::ModularTag categoryTag;
- };
-
- /// \ingroup field
- template <>
- class ModularBalanced<int32_t> : public FieldInterface,
- public FFPACK::ModularBalanced<int32_t> {
-
- public:
- typedef FFPACK::ModularBalanced<int32_t> Father_t ;
-
- friend class FieldAXPY<ModularBalanced<int32_t> >;
- friend class DotProductDomain<ModularBalanced<int32_t> >;
-
- typedef int32_t Element;
- typedef ModularBalancedRandIter<int32_t> RandIter;
-
- ModularBalanced(int32_t p, int32_t e=1) :
- Father_t(p,e)
- {}
-
- using Father_t::cardinality ;
- integer &cardinality (integer &c) const
- {
- return c = modulus;
- }
-
- using Father_t::characteristic ;
- integer &characteristic (integer &c) const
- {
- return c = modulus;
- }
-
- using Father_t::convert;
- // this function converts an int to a natural number ?
- integer &convert (integer &x, const Element &y) const
- {
- if(y >= 0)
- return x = y;
- else
- return x = y + modulus;
- }
-
- using Father_t::init ;
- Element &init (Element &x, const integer &y) const
- {
- x = Element(y % (long)modulus);
-
- if (x < mhalf_mod)
- x += modulus;
- else if (x > half_mod)
- x -= modulus;
-
- return x;
- }
-
- Element &init(Element &x) const
- {
- return x = 0 ;
- }
-
- };
-
- template <>
- class FieldAXPY<ModularBalanced<int32_t> > {
- public:
-
- typedef int32_t Element;
- typedef ModularBalanced<int32_t> Field;
-
- FieldAXPY (const Field &F) :
- _field (F),_y(0),_times(0)
- { }
-
-
- FieldAXPY (const FieldAXPY &faxpy) :
- _field (faxpy._field), _y (0),_times(0)
- {}
-
- FieldAXPY<ModularBalanced<int32_t> > &operator = (const FieldAXPY &faxpy)
- {
- _field = faxpy._field;
- _y = faxpy._y;
- _times = faxpy._times;
- return *this;
- }
-
- inline int64_t& mulacc (const Element &a, const Element &x)
- {
- int64_t t = (int64_t) a * (int64_t) x;
- if (_times < blocksize) {
- ++_times;
- return _y += t;
- }
-
- else {
- _times = 1;
- normalize();
- return _y += t;
- }
- }
-
- inline int64_t& accumulate (const Element &t)
- {
- if (_times < blocksize) {
- ++_times;
- return _y += t;
- }
-
- else {
- _times = 1;
- normalize();
- return _y += t;
- }
- }
-
- inline Element& get (Element &y)
- {
-
- normalize();
-
- y = Element(_y);
-
- if (y > _field.half_mod)
- y -= _field.modulus;
- else if (y < _field.mhalf_mod)
- y += _field.modulus;
-
- return y;
- }
-
- inline FieldAXPY &assign (const Element y)
- {
- _y = y;
- return *this;
- }
-
- inline void reset()
- {
- _y = 0;
- }
-
- private:
-
- Field _field;
- int64_t _y;
- int32_t _times;
- static const int32_t blocksize = 32;
-
- inline void normalize() {
- _y = (int32_t)_y -(int32_t)(int64_t)((double) _y * _field.modulusinv) * (int32_t)_field.modulus;
- }
-
- };
-
-
- template <>
- class DotProductDomain<ModularBalanced<int32_t> > : private virtual VectorDomainBase<ModularBalanced<int32_t> > {
-
- private:
- const int32_t blocksize;
-
- public:
- typedef int32_t Element;
- DotProductDomain (const ModularBalanced<int32_t> &F) :
- VectorDomainBase<ModularBalanced<int32_t> > (F) ,blocksize(32)
- { }
-
- protected:
- template <class Vector1, class Vector2>
- inline Element &dotSpecializedDD (Element &res, const Vector1 &v1, const Vector2 &v2) const
- {
-
- typename Vector1::const_iterator pv1,pv1e;
- typename Vector2::const_iterator pv2;
-
- int64_t y = 0;
- int64_t t;
- // int32_t times = 0;
-
- pv1 = pv1e = v1.begin();
- pv2 = v2.begin();
-
- for(size_t i = 0; i < v1.size() / blocksize ;++i) {
- pv1e = pv1e + blocksize;
- for(;pv1 != pv1e;++pv1,++pv2) {
- t = (((int64_t) *pv1 ) * ((int64_t) *pv2 ));
- y += t;
- }
- normalize(y);
- }
-
- for(;pv1 != v1.end(); ++pv1, ++pv2) {
- t = (((int64_t) *pv1 ) * ((int64_t) *pv2 ));
- y += t;
- }
-
- normalize(y);
- res = (Element) y;
-
- if (res > _field.half_mod) res -= _field.modulus;
- else if(res < _field.mhalf_mod) res += _field.modulus;
-
- return res;
-
- }
-
- template <class Vector1, class Vector2>
- inline Element &dotSpecializedDSP (Element &res, const Vector1 &v1, const Vector2 &v2) const
- {
-
- typename Vector1::first_type::const_iterator i_idx, i_idxe;
- typename Vector1::second_type::const_iterator i_elt;
-
- int64_t y = 0;
- int64_t t;
-
- i_idx = i_idxe = v1.first.begin();
- i_elt = v1.second.begin();
-
- for(size_t i = 0; i < v1.first.size() / blocksize ; ++i) {
- i_idxe = i_idxe + blocksize;
- for(;i_idx!= i_idxe;++i_idx, ++i_elt) {
- t = ( (int64_t) *i_elt ) * ( (int64_t) v2[*i_idx] );
- y += t;
- }
- normalize(y);
- }
-
-
- for(;i_idx!= v1.first.end();++i_idx, ++i_elt) {
- t = ( (int64_t) *i_elt ) * ( (int64_t) v2[*i_idx] );
- y += t;
- }
-
- normalize(y);
-
- res = (Element) y;
- if (res > _field.half_mod) res -= _field.modulus;
- else if(res < _field.mhalf_mod) res += _field.modulus;
-
- return res;
- }
-
- inline void normalize(int64_t& _y) const
- {
- _y = (int32_t)_y -(int32_t)(int64_t)((double) _y * _field.modulusinv) * (int32_t)_field.modulus;
- }
-
- };
-}
-
-#include "linbox/randiter/modular-balanced.h"
-#endif //__LINBOX_modular_balanced_int32_H
-
-
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
-// Local Variables:
-// mode: C++
-// tab-width: 8
-// indent-tabs-mode: nil
-// c-basic-offset: 8
-// End:
-
diff --git a/linbox/field/Modular/modular-balanced-int64.h b/linbox/field/Modular/modular-balanced-int64.h
deleted file mode 100644
index 4a25eb3..0000000
--- a/linbox/field/Modular/modular-balanced-int64.h
+++ /dev/null
@@ -1,345 +0,0 @@
-/* Copyright (C) 2010 LinBox
- * Adapted by B Boyer <brice.boyer at imag.fr>
- * (from other modular-balanced* files)
- *
- *
- *
- * ========LICENCE========
- * This file is part of the library LinBox.
- *
- * LinBox is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- * ========LICENCE========
- */
-
-
-/*! @file field/Modular/modular-balanced-int64.h
- * @ingroup field
- * @brief Balanced representation of <code>Z/mZ</code> over \c int64_t .
- */
-
-#ifndef __LINBOX_modular_balanced_int64_H
-#define __LINBOX_modular_balanced_int64_H
-
-#include "linbox/linbox-config.h"
-#include "linbox/integer.h"
-#include "linbox/vector/vector-domain.h"
-#include "linbox/field/field-interface.h"
-#include "linbox/field/field-traits.h"
-#include "linbox/util/field-axpy.h"
-#include "linbox/util/debug.h"
-#include "linbox/field/field-traits.h"
-
-#include <fflas-ffpack/field/modular-balanced-int64.h>
-
-#ifndef LINBOX_MAX_INT64
-#ifdef __x86_64__
-#define LINBOX_MAX_INT64 INT64_MAX
-#else
-#define LINBOX_MAX_INT64 INT64_MAX
-#endif
-#endif
-
-
-// Namespace in which all LinBox code resides
-namespace LinBox
-{
-
- template< class Element >
- class ModularBalanced;
- template< class Element >
- class ModularBalancedRandIter;
-
- template <class Ring>
- struct ClassifyRing;
-
- template<class Element>
- struct ClassifyRing<ModularBalanced<Element> >;
-
- template<>
- struct ClassifyRing<ModularBalanced<int64_t> > {
- typedef RingCategories::ModularTag categoryTag;
- };
-
- /// \ingroup field
- template <>
- class ModularBalanced<int64_t> : public FieldInterface
- public FFPACK::ModularBalanced<int64_t> {
-
- public:
-
- friend class FieldAXPY<ModularBalanced<int64_t> >;
- friend class DotProductDomain<ModularBalanced<int64_t> >;
-
- typedef FFPACK::ModularBalanced<int64_t> Father_t ;
-
- typedef int64_t Element;
- typedef ModularBalancedRandIter<int64_t> RandIter;
-
- using Father_t:: cardinality;
- integer &cardinality (integer &c) const
- {
- return c = modulus;
- }
-
- using Father_t:: characteristic;
- integer &characteristic (integer &c) const
- {
- return c = modulus;
- }
-
- using Father_t:: convert;
- // this function converts an int to a natural number ?
- integer &convert (integer &x, const Element &y) const
- {
- if(y >= 0)
- return x = y;
- else
- return x = y + modulus;
- }
-
- using Father_t:: init;
- Element &init (Element &x, const integer &y) const
- {
- x = y % (long) (modulus);
- if (x < mhalf_mod) x += modulus;
- else if (x > half_mod) x -= modulus;
- return x;
- }
-
- Element &init(Element &x) const
- {
- return x = 0 ;
- }
-
- private:
-
- };
-
- template <>
- class FieldAXPY<ModularBalanced<int64_t> > {
- public:
-
- typedef int64_t Element;
- typedef ModularBalanced<int64_t> Field;
-
- FieldAXPY (const Field &F) :
- _field (F),_y(0),_times(0)
- {
- }
-
-
- FieldAXPY (const FieldAXPY &faxpy) :
- _field (faxpy._field), _y (0),_times(0)
- {}
-
- FieldAXPY<ModularBalanced<int64_t> > &operator = (const FieldAXPY &faxpy)
- {
- _field = faxpy._field;
- _y = faxpy._y;
- _times = faxpy._times;
- return *this;
- }
-
- inline int64_t& mulacc (const Element &a, const Element &x)
- {
- int64_t t = (int64_t) a * (int64_t) x;
- if (_times < blocksize)
- {
- ++_times;
- return _y += t;
- }
-
- else {
- _times = 1;
- normalize();
- return _y += t;
- }
- }
-
- inline int64_t& accumulate (const Element &t)
- {
- if (_times < blocksize)
- {
- ++_times;
- return _y += t;
- }
-
- else {
- _times = 1;
- normalize();
- return _y += t;
- }
- }
-
- inline Element& get (Element &y)
- {
-
- normalize();
-
- y = _y;
-
- if (y > _field.half_mod)
- y -= _field.modulus;
- else if (y < _field.mhalf_mod)
- y += _field.modulus;
-
- return y;
- }
-
- inline FieldAXPY &assign (const Element y)
- {
- _y = y;
- return *this;
- }
-
- inline void reset()
- {
- _y = 0;
- }
-
- private:
-
- Field _field;
- int64_t _y;
- int64_t _times;
- //!@todo tune me ?
- static const int64_t blocksize = 32;
-
- inline void normalize()
- {
- _y = (int64_t)_y -(int64_t)(int64_t)((double) _y * _field.modulusinv) * (int64_t)_field.modulus;
- }
-
- };
-
-
- template <>
- class DotProductDomain<ModularBalanced<int64_t> > : private virtual VectorDomainBase<ModularBalanced<int64_t> > {
-
- private:
- const int64_t blocksize;
-
- public:
- typedef int64_t Element;
- DotProductDomain (const ModularBalanced<int64_t> &F) :
- VectorDomainBase<ModularBalanced<int64_t> > (F) ,blocksize(32)
- { }
-
- protected:
- template <class Vector1, class Vector2>
- inline Element &dotSpecializedDD (Element &res, const Vector1 &v1, const Vector2 &v2) const
- {
-
- typename Vector1::const_iterator pv1,pv1e;
- typename Vector2::const_iterator pv2;
-
- int64_t y = 0;
- int64_t t;
- int64_t times = 0;
-
- pv1 = pv1e = v1.begin();
- pv2 = v2.begin();
-
- for(int i = 0; i < v1.size() / blocksize ;++i)
- {
- pv1e = pv1e + blocksize;
- for(;pv1 != pv1e;++pv1,++pv2)
- {
- t = (((int64_t) *pv1 ) * ((int64_t) *pv2 ));
- y += t;
- }
- normalize(y);
- }
-
- for(;pv1 != v1.end(); ++pv1, ++pv2)
- {
- t = (((int64_t) *pv1 ) * ((int64_t) *pv2 ));
- y += t;
- }
-
- normalize(y);
- res = y;
-
- if (res > _field.half_mod) res -= _field.modulus;
- else if(res < _field.mhalf_mod) res += _field.modulus;
-
- return res;
-
- }
-
- template <class Vector1, class Vector2>
- inline Element &dotSpecializedDSP (Element &res, const Vector1 &v1, const Vector2 &v2) const
- {
-
- typename Vector1::first_type::const_iterator i_idx, i_idxe;
- typename Vector1::second_type::const_iterator i_elt;
-
- int64_t y = 0;
- int64_t t;
-
- i_idx = i_idxe = v1.first.begin();
- i_elt = v1.second.begin();
-
- for(int i = 0; i < v1.first.size() / blocksize ; ++i)
- {
- i_idxe = i_idxe + blocksize;
- for(;i_idx!= i_idxe;++i_idx, ++i_elt)
- {
- t = ( (int64_t) *i_elt ) * ( (int64_t) v2[*i_idx] );
- y += t;
- }
- normalize(y);
- }
-
-
- for(;i_idx!= v1.first.end();++i_idx, ++i_elt)
- {
- t = ( (int64_t) *i_elt ) * ( (int64_t) v2[*i_idx] );
- y += t;
- }
-
- normalize(y);
-
- res = y;
- if (res > _field.half_mod) res -= _field.modulus;
- else if(res < _field.mhalf_mod) res += _field.modulus;
-
- return res;
- }
-
- inline void normalize(int64_t& _y) const
- {
- _y = (int64_t)_y -(int64_t)(int64_t)((double) _y * _field.modulusinv) * (int64_t)_field.modulus;
- }
-
- };
-}
-
-#undef LINBOX_MAX_INT64
-
-#include "linbox/randiter/modular.h" // do not unse _LB_MAX inside this one !
-
-
-#endif //__LINBOX_modular_balanced_int64_H
-
-
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
-// Local Variables:
-// mode: C++
-// tab-width: 8
-// indent-tabs-mode: nil
-// c-basic-offset: 8
-// End:
-
diff --git a/linbox/field/Modular/modular-byte.h b/linbox/field/Modular/modular-byte.h
deleted file mode 100644
index b49f9f4..0000000
--- a/linbox/field/Modular/modular-byte.h
+++ /dev/null
@@ -1,773 +0,0 @@
-/* Copyright (C) 2010 LinBox
- *
- *
- *
- * ========LICENCE========
- * This file is part of the library LinBox.
- *
- * LinBox is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- * ========LICENCE========
- */
-
-/*! @file field/Modular/modular-byte.h
- * @ingroup field
- * @brief representation of <code>Z/mZ</code> over \c byte .
- */
-#ifndef __LINBOX_modular_bit_H
-#define __LINBOX_modular_bit_H
-
-
-#include "linbox/linbox-config.h"
-#include "linbox/integer.h"
-#include "linbox/vector/vector-domain.h"
-#include "linbox/field/field-interface.h"
-#include "linbox/field/field-traits.h"
-#include "linbox/util/debug.h"
-#include "linbox/field/field-traits.h"
-
-#ifndef LINBOX_MAX_INT8 /* 127 */
-#define LINBOX_MAX_INT8 INT8_MAX
-#endif
-
-#ifdef __ICC
-#pragma warning(disable:2259)
-#endif
-
-// Namespace in which all LinBox code resides
-namespace LinBox
-{
-
- template<class Element>
- class Modular;
-
- template<class Element>
- class ModularRandIter;
-
- template<class Field>
- class FieldAXPY;
-
- template<class Field>
- class DotProductDomain;
-
- template<class Field>
- class MVProductDomain;
-
- template <class Ring>
- struct ClassifyRing;
-
- template <class Element>
- struct ClassifyRing<Modular<Element> >;
-
- template <>
- struct ClassifyRing<Modular<int8_t> >{
- typedef RingCategories::ModularTag categoryTag;
- };
-
- /** \brief Specialization of Modular to signed 8 bit element type with efficient dot product.
- *
- * Efficient element operations for dot product, mul, axpy, by using floating point
- * inverse of modulus (borrowed from NTL) and some use of non-normalized intermediate values.
- *
- * Requires: modulus < 2^7.
- * Intended use: prime modulus < 2^7.
- \ingroup field
- */
- template <>
- class Modular<int8_t> : public FieldInterface {
- public:
- typedef int8_t Element;
- protected:
- Element modulus;
- unsigned long lmodulus ;
- double modulusinv;
- public:
- const Element one,zero,mOne;
- friend class FieldAXPY<Modular<Element> >;
- friend class DotProductDomain<Modular<Element> >;
- friend class MVProductDomain<Modular<Element> >;
-
- typedef ModularRandIter<Element> RandIter;
-
- //default modular field,taking 65521 as default modulus
- Modular () :
- modulus(13),lmodulus(13)
- ,one((Element)1),zero((Element)0),mOne(Element(modulus-(Element)1))
- {
- modulusinv=1/(double)13;
- }
-
- Modular (int value, int exp = 1) :
- modulus(Element(value)),lmodulus((unsigned int)value)
- ,one((Element)1),zero((Element)0),mOne(Element(modulus-(Element)1))
- {
- modulusinv = 1 / ((double) value);
-#ifdef DEBUG
- if(exp != 1) throw PreconditionFailed(__func__,__FILE__,__LINE__,"exponent must be 1");
- if(value <= 1) throw PreconditionFailed(__func__,__FILE__,__LINE__,"modulus must be > 1");
- integer max;
- if(value > FieldTraits< Modular<Element> >::maxModulus(max)) throw PreconditionFailed(__func__,__FILE__,__LINE__,"modulus is too big");
-#endif
- }
-
- Modular(const Modular<Element>& mf) :
- modulus(mf.modulus),lmodulus(mf.lmodulus),modulusinv(mf.modulusinv)
- ,one(mf.one),zero(mf.zero),mOne(mf.mOne)
- {}
-
- Modular &operator=(const Modular<Element> &F)
- {
- modulus = F.modulus;
- lmodulus = F.lmodulus;
- modulusinv = F.modulusinv;
- F.assign(const_cast<Element&>(one),F.one);
- F.assign(const_cast<Element&>(zero),F.zero);
- F.assign(const_cast<Element&>(mOne),F.mOne);
-
- return *this;
- }
-
-
- inline integer &cardinality (integer &c) const
- {
- return c = modulus;
- }
-
- inline integer &characteristic (integer &c) const
- {
- return c = modulus;
- }
-
- inline unsigned long cardinality () const
- {
- return lmodulus;
- }
-
- inline unsigned long characteristic () const
- {
- return lmodulus;
- }
-
-
- inline integer &convert (integer &x, const Element &y) const
- {
- return x = y;
- }
-
- inline std::ostream &write (std::ostream &os) const
- {
- return os << "Element mod " << (int)modulus;
- }
-
- inline std::istream &read (std::istream &is)
- {
- int prime;
- is >> prime;
- modulus = (Element) prime;
- modulusinv = 1 /((double) modulus );
-#ifdef DEBUG
- if(prime <= 1) throw PreconditionFailed(__func__,__FILE__,__LINE__,"modulus must be > 1");
- integer max;
- if(prime > FieldTraits< Modular<Element> >::maxModulus(max)) throw PreconditionFailed(__func__,__FILE__,__LINE__,"modulus is too big");
-#endif
-
- return is;
- }
-
- inline std::ostream &write (std::ostream &os, const Element &x) const
- {
- return os << x;
- }
-
- inline std::istream &read (std::istream &is, Element &x) const
- {
- integer tmp;
- is >> tmp;
- init(x,tmp);
- return is;
- }
-
-
- inline Element &init (Element &x, const integer &y) const
- {
- x =(Element)((int16_t) (y % (long) (modulus)));
- if (x < 0) x=Element(x+modulus);
- return x;
- }
-
- inline Element& init(Element& x, int y ) const
- {
- x = Element(y % int(modulus));
- if ( x < 0 ) x=Element(x+modulus);
- return x;
- }
-
- inline Element& init(Element& x, long y) const
- {
- x = Element(y % long(modulus));
- if ( x < 0 ) x=Element(x+modulus);
- return x;
- }
-
- inline Element& init(Element& x, long unsigned y) const
- {
- x = Element (y % lmodulus);
- if ( x < 0 ) x=Element(x+modulus);
- return x;
- }
-
-
- Element& init(Element&x) const
- {
- return x = 0 ;
- }
-
- inline Element& assign(Element& x, const Element& y) const
- {
- return x=y;
- }
-
-
- inline bool areEqual (const Element &x, const Element &y) const
- {
- return x == y;
- }
-
- inline bool isZero (const Element &x) const
- {
- return x == 0;
- }
-
- inline bool isOne (const Element &x) const
- {
- return x == 1;
- }
-
- inline Element &add (Element &x, const Element &y, const Element &z) const
- {
- x = Element(y + z);
- if ( (uint8_t)x >= modulus )
- x =Element(( (uint8_t)x )- modulus);
- return x;
- }
-
- inline Element &sub (Element &x, const Element &y, const Element &z) const
- {
- x = Element(y - z);
- if (x < 0) x=Element(x+modulus);
- return x;
- }
-
- inline Element &mul (Element &x, const Element &y, const Element &z) const
- {
- Element q;
-
- double ab=((double) y)* ((double) z);
- q = (Element)(ab*modulusinv); // q could be off by (+/-) 1
- x = (Element) (ab - ((double) q )* ((double) modulus));
-
-
- if (x >= modulus)
- x=Element(x-modulus);
- else if (x < 0)
- x=Element(x+modulus);
-
- return x;
- }
-
- inline Element &div (Element &x, const Element &y, const Element &z) const
- {
- Element temp;
- inv (temp, z);
- return mul (x, y, temp);
- }
-
- inline Element &neg (Element &x, const Element &y) const
- {
- if(y==0) return x=0;
- else return x=Element(modulus-y);
- }
-
- inline Element &inv (Element &x, const Element &y) const
- {
- Element d, t;
- XGCD(d, x, t, y, modulus);
-#ifdef DEBUG
- if (d != 1)
- throw PreconditionFailed(__func__,__FILE__,__LINE__,"InvMod: inverse undefined");
-#endif
- if (x < 0)
- return x=Element(x+modulus);
- else
- return x;
- }
-
- inline Element &axpy (Element &r,
- const Element &a,
- const Element &x,
- const Element &y) const
- {
- Element q;
-
- double ab = ((double) a)* ((double) x) + y;
- q = (Element)(ab*modulusinv); // q could be off by (+/-) 1
- r = (Element) (ab - ((double) q )* ((double) modulus));
-
-
- if (r >= modulus)
- r=Element(r-modulus);
- else if (x < 0)
- r=Element(r+modulus);
-
- return r;
-
- }
-
- inline Element &addin (Element &x, const Element &y) const
- {
- x = Element(x+y);
- if ( ((uint8_t) x) >= modulus )
- x = Element( ((uint8_t) x)-modulus );
- return x;
- }
-
- inline Element &subin (Element &x, const Element &y) const
- {
- x = Element(x-y);
- if (x < 0) x=Element(x+modulus);
- return x;
- }
-
- inline Element &mulin (Element &x, const Element &y) const
- {
- return mul(x,x,y);
- }
-
- inline Element &divin (Element &x, const Element &y) const
- {
- return div(x,x,y);
- }
-
- inline Element &negin (Element &x) const
- {
- if (x == 0) return x;
- else return x = Element(modulus - x);
- }
-
- inline Element &invin (Element &x) const
- {
- return inv (x, x);
- }
-
- inline Element &axpyin (Element &r, const Element &a, const Element &x) const
- {
-
-
- Element q;
-
- double ab = ((double) a)* ((double) x) + r;
- q = (Element)(ab*modulusinv); // q could be off by (+/-) 1
- r = (Element) (ab - ((double) q )* ((double) modulus));
-
-
- if (r >= modulus)
- r=Element(r-modulus);
- else if (x < 0)
- r=Element(r+modulus);
-
- return r;
- }
-
- static inline Element getMaxModulus()
- {
- return INT8_MAX;
- } // 2^7-1
-
-
- private:
-
- static void XGCD(Element& d, Element& s, Element& t, Element a, Element b)
- {
- int32_t u, v, u0, v0, u1, v1, u2, v2, q, r;
-
- Element aneg = 0, bneg = 0;
-
- if (a < 0) {
-#ifdef DEBUG
- if (a < -LINBOX_MAX_INT8) throw PreconditionFailed(__func__,__FILE__,__LINE__,"XGCD: integer overflow");
-#endif
- a = Element(-a);
- aneg = 1;
- }
-
- if (b < 0) {
-#ifdef DEBUG
- if (b < -LINBOX_MAX_INT8) throw PreconditionFailed(__func__,__FILE__,__LINE__,"XGCD: integer overflow");
-#endif
- b = (Element)-b;
- bneg = 1;
- }
-
- u1 = 1; v1 = 0;
- u2 = 0; v2 = 1;
- u = a; v = b;
-
- while (v != 0) {
- q = u / v;
- r = u % v;
- u = v;
- v = r;
- u0 = u2;
- v0 = v2;
- u2 = u1 - q*u2;
- v2 = v1- q*v2;
- u1 = u0;
- v1 = v0;
- }
-
- if (aneg)
- u1 = -u1;
-
- if (bneg)
- v1 = -v1;
-
- d = Element(u);
- s = Element(u1);
- t = Element(v1);
- }
-
- };
-
- template <>
- class FieldAXPY<Modular<int8_t> > {
- public:
-
- typedef int8_t Element;
- typedef Modular<int8_t> Field;
-
- FieldAXPY (const Field &F) :
- _field (F),_y(0)
- {
- }
-
- FieldAXPY (const FieldAXPY &faxpy) :
- _field (faxpy._field), _y (0)
- {}
-
- FieldAXPY<Modular<int8_t> > &operator = (const FieldAXPY &faxpy)
- {
- _field = faxpy._field;
- _y = faxpy._y;
-
- return *this;
- }
-
- inline uint64_t& mulacc (const Element &a, const Element &x)
- {
- uint64_t t = ( (uint16_t) a ) * ( (uint16_t) x );
- return _y +=t;
- }
-
- inline uint64_t& accumulate (const Element &t)
- {
- return _y += (uint64_t)t;
- }
-
- inline Element& get (Element &y)
- {
- y = Element(_y % (uint64_t) _field.modulus);
- return y;
- }
-
- inline FieldAXPY &assign (const Element y)
- {
- _y = (uint64_t) y;
- return *this;
- }
-
- inline void reset()
- {
- _y = 0;
- }
-
- private:
-
- Field _field;
- uint64_t _y;
- uint8_t _two_64;
- };
-
-
- template <>
- class DotProductDomain<Modular<int8_t> > : private virtual VectorDomainBase<Modular<int8_t> > {
-
- public:
- typedef int8_t Element;
- DotProductDomain (const Modular<int8_t> &F) :
- VectorDomainBase<Modular<int8_t> > (F)
- { }
-
- protected:
- template <class Vector1, class Vector2>
- inline Element &dotSpecializedDD (Element &res, const Vector1 &v1, const Vector2 &v2) const
- {
-
- typename Vector1::const_iterator i;
- typename Vector2::const_iterator j;
-
- uint64_t y = 0;
- // uint64_t t;
-
- for (i = v1.begin (), j = v2.begin (); i < v1.end (); ++i, ++j) {
- y += ( (uint16_t) *i ) * ( (uint16_t) *j );
- }
-
-
- y %= (uint64_t) _field.modulus;
-
- return res = (Element) y;
-
- }
-
- template <class Vector1, class Vector2>
- inline Element &dotSpecializedDSP (Element &res, const Vector1 &v1, const Vector2 &v2) const
- {
- typename Vector1::first_type::const_iterator i_idx;
- typename Vector1::second_type::const_iterator i_elt;
-
- uint64_t y = 0;
-
- for (i_idx = v1.first.begin (), i_elt = v1.second.begin (); i_idx != v1.first.end (); ++i_idx, ++i_elt) {
- y += ( (uint16_t) *i_elt ) * ( (uint16_t) v2[*i_idx] );
- }
-
- y %= (uint64_t) _field.modulus;
-
- return res = (Element)y;
-
- }
-
- };
-
-
- template <>
- class MVProductDomain<Modular<int8_t> >
- {
- public:
-
- typedef int8_t Element;
-
- protected:
- template <class Vector1, class Matrix, class Vector2>
- inline Vector1 &mulColDense
- (const VectorDomain<Modular<int8_t> > &VD, Vector1 &w, const Matrix &A, const Vector2 &v) const
- {
- return mulColDenseSpecialized
- (VD, w, A, v, VectorTraits<typename Matrix::Column>::VectorCategory ());
- }
-
- private:
- template <class Vector1, class Matrix, class Vector2>
- Vector1 &mulColDenseSpecialized
- (const VectorDomain<Modular<int8_t> > &VD, Vector1 &w, const Matrix &A, const Vector2 &v,
- VectorCategories::DenseVectorTag) const;
- template <class Vector1, class Matrix, class Vector2>
- Vector1 &mulColDenseSpecialized
- (const VectorDomain<Modular<int8_t> > &VD, Vector1 &w, const Matrix &A, const Vector2 &v,
- VectorCategories::SparseSequenceVectorTag) const;
- template <class Vector1, class Matrix, class Vector2>
- Vector1 &mulColDenseSpecialized
- (const VectorDomain<Modular<int8_t> > &VD, Vector1 &w, const Matrix &A, const Vector2 &v,
- VectorCategories::SparseAssociativeVectorTag) const;
- template <class Vector1, class Matrix, class Vector2>
- Vector1 &mulColDenseSpecialized
- (const VectorDomain<Modular<int8_t> > &VD, Vector1 &w, const Matrix &A, const Vector2 &v,
- VectorCategories::SparseParallelVectorTag) const;
-
- mutable std::vector<uint64_t> _tmp;
- };
-
- template <class Vector1, class Matrix, class Vector2>
- Vector1 &MVProductDomain<Modular<int8_t> >::mulColDenseSpecialized
- (const VectorDomain<Modular<int8_t> > &VD, Vector1 &w, const Matrix &A, const Vector2 &v,
- VectorCategories::DenseVectorTag) const
- {
-
- linbox_check (A.coldim () == v.size ());
- linbox_check (A.rowdim () == w.size ());
-
- typename Matrix::ConstColIterator i = A.colBegin ();
- typename Vector2::const_iterator j;
- typename Matrix::Column::const_iterator k;
- std::vector<uint64_t>::iterator l;
-
- uint64_t t;
-
- if (_tmp.size () < w.size ())
- _tmp.resize (w.size ());
-
- std::fill (_tmp.begin (), _tmp.begin () + w.size (), 0);
-
- for (j = v.begin (); j != v.end (); ++j, ++i) {
- for (k = i->begin (), l = _tmp.begin (); k != i->end (); ++k, ++l) {
- t = ((uint16_t) *k) * ((uint16_t) *j);
-
- *l += t;
-
- }
- }
-
- typename Vector1::iterator w_j;
-
- for (w_j = w.begin (), l = _tmp.begin (); w_j != w.end (); ++w_j, ++l)
- *w_j = *l % VD.field ().modulus;
-
- return w;
- }
-
- template <class Vector1, class Matrix, class Vector2>
- Vector1 &MVProductDomain<Modular<int8_t> >::mulColDenseSpecialized
- (const VectorDomain<Modular<int8_t> > &VD, Vector1 &w, const Matrix &A, const Vector2 &v,
- VectorCategories::SparseSequenceVectorTag) const
- {
- linbox_check (A.coldim () == v.size ());
- linbox_check (A.rowdim () == w.size ());
-
- typename Matrix::ConstColIterator i = A.colBegin ();
- typename Vector2::const_iterator j;
- typename Matrix::Column::const_iterator k;
- std::vector<uint64_t>::iterator l;
-
- uint64_t t;
-
- if (_tmp.size () < w.size ())
- _tmp.resize (w.size ());
-
- std::fill (_tmp.begin (), _tmp.begin () + w.size (), 0);
-
- for (j = v.begin (); j != v.end (); ++j, ++i) {
- for (k = i->begin (), l = _tmp.begin (); k != i->end (); ++k, ++l) {
- t = ((uint16_t) k->second) * ((uint16_t) *j);
-
- _tmp[k->first] += t;
-
- }
- }
-
- typename Vector1::iterator w_j;
-
- for (w_j = w.begin (), l = _tmp.begin (); w_j != w.end (); ++w_j, ++l)
- *w_j = *l % VD.field ().modulus;
-
- return w;
- }
-
- template <class Vector1, class Matrix, class Vector2>
- Vector1 &MVProductDomain<Modular<int8_t> >::mulColDenseSpecialized
- (const VectorDomain<Modular<int8_t> > &VD, Vector1 &w, const Matrix &A, const Vector2 &v,
- VectorCategories::SparseAssociativeVectorTag) const
- {
-
- linbox_check (A.coldim () == v.size ());
- linbox_check (A.rowdim () == w.size ());
-
- typename Matrix::ConstColIterator i = A.colBegin ();
- typename Vector2::const_iterator j;
- typename Matrix::Column::const_iterator k;
- std::vector<uint64_t>::iterator l;
-
- uint64_t t;
-
- if (_tmp.size () < w.size ())
- _tmp.resize (w.size ());
-
- std::fill (_tmp.begin (), _tmp.begin () + w.size (), 0);
-
- for (j = v.begin (); j != v.end (); ++j, ++i) {
- for (k = i->begin (), l = _tmp.begin (); k != i->end (); ++k, ++l) {
- t = ((uint16_t) k->second) * ((uint16_t) *j);
-
- _tmp[k->first] += t;
-
- }
- }
-
- typename Vector1::iterator w_j;
-
- for (w_j = w.begin (), l = _tmp.begin (); w_j != w.end (); ++w_j, ++l)
- *w_j = *l % VD.field ().modulus;
-
- return w;
- }
-
- template <class Vector1, class Matrix, class Vector2>
- Vector1 &MVProductDomain<Modular<int8_t> >::mulColDenseSpecialized
- (const VectorDomain<Modular<int8_t> > &VD, Vector1 &w, const Matrix &A, const Vector2 &v,
- VectorCategories::SparseParallelVectorTag) const
- {
-
- linbox_check (A.coldim () == v.size ());
- linbox_check (A.rowdim () == w.size ());
-
- typename Matrix::ConstColIterator i = A.colBegin ();
- typename Vector2::const_iterator j;
- typename Matrix::Column::first_type::const_iterator k_idx;
- typename Matrix::Column::second_type::const_iterator k_elt;
- std::vector<uint64_t>::iterator l;
-
- uint64_t t;
-
- if (_tmp.size () < w.size ())
- _tmp.resize (w.size ());
-
- std::fill (_tmp.begin (), _tmp.begin () + w.size (), 0);
-
- for (j = v.begin (); j != v.end (); ++j, ++i) {
- for (k_idx = i->first.begin (), k_elt = i->second.begin (), l = _tmp.begin ();
- k_idx != i->first.end ();
- ++k_idx, ++k_elt, ++l)
- {
- t = ((uint16_t) *k_elt) * ((uint16_t) *j);
-
- _tmp[*k_idx] += t;
-
- }
- }
-
- typename Vector1::iterator w_j;
-
- for (w_j = w.begin (), l = _tmp.begin (); w_j != w.end (); ++w_j, ++l)
- *w_j = *l % VD.field ().modulus;
-
- return w;
- }
-
-}
-
-#ifdef __ICC
-#pragma warning(enable:2259)
-#endif
-
-#include "linbox/randiter/modular.h"
-#endif //__LINBOX_modular_bit_H
-
-
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
-// Local Variables:
-// mode: C++
-// tab-width: 8
-// indent-tabs-mode: nil
-// c-basic-offset: 8
-// End:
-
diff --git a/linbox/field/Modular/modular-crooked-double.h b/linbox/field/Modular/modular-crooked-double.h
deleted file mode 100644
index 2ce863d..0000000
--- a/linbox/field/Modular/modular-crooked-double.h
+++ /dev/null
@@ -1,616 +0,0 @@
-
-/* linbox/field/modular-crooked-double.h
- * Copyright (C) 2010 LinBox
- *
- * adapted from field/modular-balanced-double.h
- * by Brice Boyer <brice.boyer at imag.fr>
- *
- * ------------------------------------
- *
- *
- * ========LICENCE========
- * This file is part of the library LinBox.
- *
- * LinBox is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- * ========LICENCE========
- *.
- */
-
-/*! @file field/Modular/modular-crooked-double.h
- * @ingroup field
- * @brief Crooked representation of <code>Z/mZ</code> over \c double .
- * This is a balanced representation with more positive (or negative) representants.
- * Being tested.
- */
-#ifndef __LINBOX_modular_crooked_double_H
-#define __LINBOX_modular_crooked_double_H
-
-
-#include "linbox/linbox-config.h"
-#include "linbox/integer.h"
-#include "linbox/vector/vector-domain.h"
-#include "linbox/field/field-interface.h"
-#include "linbox/field/field-traits.h"
-#include "linbox/util/field-axpy.h"
-#include "linbox/util/debug.h"
-#include <cmath>
-#include "linbox/field/field-traits.h"
-#include "linbox/randiter/modular-crooked.h"
-#include "linbox/randiter/nonzero.h"
-#include <iostream>
-
-
-// Namespace in which all LinBox code resides
-namespace LinBox
-{
- template< class Element >
- class ModularCrooked;
-
- template <class Ring>
- struct ClassifyRing;
-
- template <class Element>
- struct ClassifyRing<ModularCrooked<Element> >;
-
- template <>
- struct ClassifyRing<ModularCrooked<double> >
- {
- typedef RingCategories::ModularTag categoryTag;
- };
-
- class MultiModDouble;
-
- /// \ingroup field
- template <>
- class ModularCrooked<double> : public FieldInterface {
-
- protected:
-
- double modulus;
- double up_mod;
- double lo_mod;
- unsigned long lmodulus;
-
- public:
-
- friend class FieldAXPY<ModularCrooked<double> >;
- friend class DotProductDomain<ModularCrooked<double> >;
- friend class MultiModDouble;
-
- typedef double Element;
- const Element zero,one,mOne;
- typedef ModularCrookedRandIter<double> RandIter;
-
- static ClassifyRing <ModularCrooked<double> >::categoryTag
- getCategory()
- {
- return ClassifyRing<ModularCrooked<double> >::categoryTag();
- }
-
- ModularCrooked ()
- : zero(0),one(1),mOne(-1)
- {}
-
- ModularCrooked (int32_t p, float f = 0.5, int exp = 1) :
- modulus((Element)p), up_mod( std::ceil((p-1.)*f) ), lo_mod( up_mod-modulus+1 ),lmodulus (p)
- ,zero(0),one(1),mOne(-1)
- {
-#ifdef DEBUG
- if(modulus <= 1)
- throw PreconditionFailed(__func__,
- __LINE__,
- "modulus must be > 1");
- if( exp != 1 ) throw PreconditionFailed(__func__,
- __LINE__,
- "exponent must be 1");
- integer max;
- if (modulus > (double) FieldTraits<ModularCrooked<double> >::maxModulus(max))
- throw PreconditionFailed (__func__,
- __LINE__,
- "modulus is too big");
-#endif
- }
-
- ModularCrooked (double p, float f = 0.5) :
- modulus((Element)p), up_mod( std::ceil((p-1.)*f) ), lo_mod( up_mod-modulus+1 ),lmodulus ((unsigned long)p)
- ,zero(0),one(1),mOne(-1)
- {
-#ifdef DEBUG
- if (modulus <= 1)
- throw PreconditionFailed(__func__,
- __LINE__,
- "modulus must be > 1");
- integer max;
- if (modulus > (double) FieldTraits<ModularCrooked<double> >::maxModulus(max))
- throw PreconditionFailed (__func__,
- __LINE__,
- "modulus is too big");
-#endif
- }
-
- ModularCrooked (long int p, float f = 0.5) :
- modulus((double)p), up_mod( std::ceil((double)(p-1)*f) ), lo_mod( up_mod-modulus+1 ),lmodulus ((unsigned long)p)
- ,zero(0),one(1),mOne(-1)
- {
-#ifdef DEBUG
- if ((double) modulus <= 1)
- throw PreconditionFailed(__func__,__FILE__,__LINE__,"modulus must be > 1");
- integer max;
- if ((double) modulus > (double) FieldTraits<ModularCrooked<double> >::maxModulus(max))
- throw PreconditionFailed (__func__,
- __LINE__,
- "modulus is too big");
-#endif
- }
-
- ModularCrooked (const integer& p, float f = 0.5) :
- modulus((double)p), up_mod( std::ceil((double)(p-1)*f) ), lo_mod( up_mod-modulus+1 ),lmodulus (p)
- ,zero(0),one(1),mOne(-1)
- {
-#ifdef DEBUG
- if(modulus <= 1)
- throw PreconditionFailed(__func__,__FILE__,__LINE__,"modulus must be > 1");
- if(modulus > getMaxModulus())
- throw PreconditionFailed(__func__,__FILE__,__LINE__,"modulus is too big");
-#endif
-
- }
-
- ModularCrooked (const ModularCrooked<double>& mf) :
- modulus (mf.modulus)
- ,up_mod (mf.up_mod)
- ,lo_mod (mf.lo_mod)
- ,lmodulus (mf.lmodulus)
- ,zero(mf.zero),one(mf.one),mOne(mf.mOne)
- {}
-
-#if 1
- const ModularCrooked &operator= (const ModularCrooked<double> &F)
- {
- modulus = F.modulus;
- up_mod = F.up_mod;
- lo_mod = F.lo_mod;
- lmodulus= F.lmodulus;
- return *this;
- }
-#endif
-
-
- inline integer &cardinality (integer &c) const
- {
- return c = integer(modulus);
- }
-
- inline integer &characteristic (integer &c) const
- {
- return c = integer(modulus);
- }
-
- inline unsigned long &characteristic (unsigned long &c) const
- {
- return c = (unsigned long)lmodulus;
- }
-
- inline size_t characteristic () const
- {
- return (size_t)modulus;
- }
-
-
- inline integer &convert (integer &x, const Element &y) const
- {
- if ( y < 0. ) return x = integer (y + modulus) ;
- else return x = integer (y);
- }
-
- inline double &convert (double &x, const Element& y) const
- {
- return x=y;
- }
-
- inline float &convert (float &x, const Element& y) const
- {
- return x=(float)y;
- }
-
- std::ostream &write (std::ostream &os) const
- {
- // os << modulus << '(' << lo_mod << ',' << up_mod << ')' << std::endl;
- os << "crooked double mod " << int(modulus) << " @ " ;
- os.precision(2) ;
- os << (double)up_mod/(modulus-1);
- os.precision();
- return os ;
- }
-
- std::istream &read (std::istream &is)
- {
- is >> modulus;
-#ifdef DEBUG
- if(modulus <= 1)
- throw PreconditionFailed (__func__,
- __LINE__,
- "modulus must be > 1");
- if(modulus > getMaxModulus())
- throw PreconditionFailed (__func__,
- __LINE__,
- "modulus is too big");
-#endif
- return is;
- }
-
- std::ostream &write (std::ostream &os, const Element &x) const
- {
- return os << int(x);
- }
-
- std::istream &read (std::istream &is, Element &x) const
- {
- integer tmp;
- // JGD : should'nt it be double tmp ???
- is >> tmp;
- init(x,tmp);
- return is;
- }
-
-
- inline Element &init (Element &x, const integer &y) const {
- x = (Element)(y%lmodulus);
- if (x < lo_mod) return x += modulus;
- if (x > up_mod) x -= modulus;
-
- return x;
- }
-
- inline Element& init(Element& x, const double y=0) const
- {
-
- // x = (Element)((long unsigned)y)%(lmodulus);
- // x = ((long int)y) % (lmodulus);
- x = fmod(y,modulus);
- if (x < lo_mod) return x += modulus;
- if (x > up_mod) x -= modulus;
- return x;
- }
-
- inline Element& assign(Element& x, const Element& y) const
- {
- return x = y;
- }
-
- inline bool areEqual (const Element &x, const Element &y) const
- {
- return x == y;
- }
-
- inline bool isZero (const Element &x) const
- {
- return x == 0.;
- }
-
- inline bool isOne (const Element &x) const
- {
- return x == 1.;
- }
-
- inline bool isMinusOne (const Element &x) const
- {
- return (x == -1.);
- }
-
- inline Element &add (Element &x,
- const Element &y,
- const Element &z) const
- {
- x = y + z;
- if ( x < lo_mod ) return x += modulus;
- if ( x > up_mod ) x -= modulus;
- return x;
- }
-
- inline Element &sub (Element &x,
- const Element &y,
- const Element &z) const
- {
- x = y - z;
- if (x < lo_mod ) return x += modulus;
- if (x > up_mod ) x -= modulus;
- return x;
- }
-
- inline Element &mul (Element &x, const Element &y, const Element &z) const
- {
- x = y * z;
- return init (x,x);
- }
-
- inline Element &div (Element &x, const Element &y, const Element &z) const
- {
- Element temp;
- inv (temp, z);
- return mul (x, y, temp);
- }
-
- inline Element &neg (Element &x, const Element &y) const
- {
- return x = -y;
- }
-
- inline Element &inv (Element &x, const Element &y) const
- {
- // The extended Euclidean algoritm
- int x_int, y_int, q, tx, ty, temp;
- x_int = int (modulus);
- y_int = (y < 0.) ? int(y + modulus) : int(y);
- tx = 0;
- ty = 1;
-
- while (y_int != 0) {
- // always: gcd (modulus,residue) = gcd (x_int,y_int)
- // sx*modulus + tx*residue = x_int
- // sy*modulus + ty*residue = y_int
- q = x_int / y_int; // integer quotient
- temp = y_int; y_int = x_int - q * y_int;
- x_int = temp;
- temp = ty; ty = tx - q * ty;
- tx = temp;
- }
- if ( tx < lo_mod ) return x = tx + modulus;
- if ( tx > up_mod ) return x = tx - modulus;
- return x = (double) tx;
- }
-
- inline Element &axpy (Element &r,
- const Element &a,
- const Element &x,
- const Element &y) const
- {
- r = a * x + y;
- return init (r, r);
- }
-
- inline Element &addin (Element &x, const Element &y) const
- {
- x += y;
- if ( x < lo_mod ) return x += modulus;
- if ( x > up_mod ) x -= modulus;
- return x;
- }
-
- inline Element &subin (Element &x, const Element &y) const
- {
- x -= y;
- if ( x < lo_mod ) return x += modulus;
- if ( x > up_mod ) x -= modulus;
- return x;
- }
-
- inline Element &mulin (Element &x, const Element &y) const
- {
- return mul(x,x,y);
- }
-
- inline Element &divin (Element &x, const Element &y) const
- {
- return div(x,x,y);
- }
-
- inline Element &negin (Element &x) const
- {
- return x = -x;
- }
-
- inline Element &invin (Element &x) const
- {
- return inv (x, x);
- }
-
- inline Element &axpyin (Element &r, const Element &a, const Element &x) const
- {
- r += a * x;
- return init (r, r);
- }
-
- unsigned long AccBound(const Element&r) const
- {
- double max_double = (double) (1ULL<<DBL_MANT_DIG) - modulus ;
- double p = std::max(up_mod,-lo_mod) ;
- if (areEqual(zero,r))
- return (unsigned long) (double(max_double)/p) ;
- else if (areEqual(one,r))
- {
- if (modulus>= getMaxModulus())
- return 0 ;
- else
- return (unsigned long) (double(max_double)/(p*p)) ;
- }
- else
- throw LinboxError("Bad input, expecting 0 or 1");
- return 0;
- }
-
-
- static inline double getMaxModulus()
- { return 67108864.0; } // 2^26
-
- };
-
-#define SQR(A) \
- ((A)*(A))
-
- template <>
- class FieldAXPY<ModularCrooked<double> > {
- public:
-
- typedef double Element;
- typedef ModularCrooked<double> Field;
-
- FieldAXPY (const Field &F) :
- _field (F), _y(0.) , _bound( (double) ((1ULL << 53) - (int) (SQR(std::max(_field.up_mod,-_field.lo_mod)))))
- {}
-
- FieldAXPY (const FieldAXPY &faxpy) :
- _field (faxpy._field),
- _y(faxpy._y), _bound(faxpy._bound)
- {}
-
- FieldAXPY<ModularCrooked<double> > &operator = (const FieldAXPY &faxpy)
- {
- _field = faxpy._field;
- _y= faxpy._y;
- _bound= faxpy._bound;
- return *this;
- }
-
- inline Element& mulacc (const Element &a, const Element &x) {
- // Element tmp= a*x;
- // return accumulate(tmp);
- return accumulate(a*x);
- }
-
- inline Element& accumulate (const Element &tmp) {
- _y += tmp;
- if (_y > _bound)
- return _y = drem (_y, _field.modulus);
- else
- return _y;
- }
- inline Element& subumulate (const Element &tmp) {
- _y -= tmp;
- if (_y < 0)
- return _y += _field.modulus;
- else
- return _y;
- }
-
- inline Element& get (Element &y) {
- _y = drem (_y, _field.modulus);
- return y=_y ;
- }
-
- inline FieldAXPY &assign (const Element y) {
- _y = y;
- return *this;
- }
-
- inline void reset() {
- _y = 0.;
- }
-
- inline Element& set (const Element &tmp) {
- _y = tmp;
- if (_y > _bound)
- return _y = drem (_y, _field.modulus);
- else
- return _y;
- }
-
- private:
-
- Field _field;
- double _y;
- double _bound;
- };
-
- template <>
- class DotProductDomain<ModularCrooked<double> > : private virtual VectorDomainBase<ModularCrooked<double> > {
- private:
- double _bound;
- size_t _nmax;
-
- public:
- typedef double Element;
- DotProductDomain (const ModularCrooked<double> &F) :
- VectorDomainBase<ModularCrooked<double> > (F), _bound( (double) ( (1ULL<<53) - (int) (SQR(std::max(_field.up_mod,-_field.lo_mod)))))
- {
- _nmax= (size_t)floor((double(1<<26)* double(1<<26)*2.)/ (SQR(std::max(_field.up_mod,-_field.lo_mod))));
- }
-
- protected:
- template <class Vector1, class Vector2>
- inline Element &dotSpecializedDD (Element &res, const Vector1 &v1, const Vector2 &v2) const
- {
-
- double y = 0.;
- double t = 0.;
- if (v1.size() < _nmax) {
- for (size_t i = 0; i< v1.size();++i)
- y += v1[i] * v2[i] ;
- y = drem(y, _field.modulus);
- }
- else{
- size_t i=0;
- for (;i< v1.size()- _nmax ;i=i+_nmax){
- for (size_t j=i;j<i+_nmax;++j)
- y += v1[j] * v2[j];
- t+=drem(y, _field.modulus);
- y=0.;
- }
- for (;i < v1.size();++i)
- y += v1[i] * v2[i];
- t+=drem(y, _field.modulus);
- y = drem(t, _field.modulus);
- }
- return res = y;
- }
-
- template <class Vector1, class Vector2>
- inline Element &dotSpecializedDSP (Element &res, const Vector1 &v1, const Vector2 &v2) const
- {
-
- double y = 0.;
- double t =0.;
-
-
- if (v1.first.size() < _nmax) {
- for (size_t i=0;i<v1.first.size();++i)
- y+= v1.second[i] * v2[v1.first[i]];
- y = drem(y, _field.modulus);
- }
- else {
- size_t i=0;
- for (;i< v1.first.size()- _nmax ;i=i+_nmax){
- for (size_t j=i;j<i+_nmax;++j)
- y += v1.second[j] * v2[v1.first[j]];
- t+=drem(y, _field.modulus);
- y=0.;
- }
- for (;i < v1.first.size();++i)
- y += v1.second[i] * v2[v1.first[i]];
- t+= drem(y, _field.modulus);
- y = drem(t, _field.modulus);
- }
- return res = y;
- }
- };
-
- template<class T>
- std::ostream& operator<< (std::ostream & o, const ModularCrooked<T> & F)
- {
- return F.write(o);
- }
-
-}
-#endif //__LINBOX_modular_crooked_double_H
-
-
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
-// Local Variables:
-// mode: C++
-// tab-width: 8
-// indent-tabs-mode: nil
-// c-basic-offset: 8
-// End:
-
diff --git a/linbox/field/Modular/modular-double.h b/linbox/field/Modular/modular-double.h
deleted file mode 100644
index d630b37..0000000
--- a/linbox/field/Modular/modular-double.h
+++ /dev/null
@@ -1,381 +0,0 @@
-/* linbox/field/modular-double.h
- * Copyright (C) 2003 Pascal Giorgi
- *
- * Written by Pascal Giorgi <pascal.giorgi at ens-lyon.fr>
- *
- * ------------------------------------
- *
- *
- * ========LICENCE========
- * This file is part of the library LinBox.
- *
- * LinBox is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- * ========LICENCE========
- *.
- */
-
-/*! @file field/Modular/modular-double.h
- * @ingroup field
- * @brief Standard representation of <code>Z/mZ</code> over \c double .
- */
-
-#ifndef __LINBOX_modular_double_H
-#define __LINBOX_modular_double_H
-
-
-#include "linbox/linbox-config.h"
-#include "linbox/integer.h"
-#include "linbox/vector/vector-domain.h"
-#include "linbox/field/field-interface.h"
-#include "linbox/field/field-traits.h"
-#include "linbox/util/field-axpy.h"
-#include "linbox/util/debug.h"
-#include <math.h>
-#include "linbox/randiter/nonzero.h"
-#include "linbox/randiter/modular.h"
-
-#include <fflas-ffpack/field/modular-double.h>
-
-
-// Namespace in which all LinBox code resides
-namespace LinBox
-{
-
- template< class Element >
- class Modular;
-
- template< class Element >
- class ModularRandIter;
-
- template< class Field, class RandIter >
- class NonzeroRandIter;
-
- template <class Ring>
- struct ClassifyRing;
-
- template <class Element>
- struct ClassifyRing<Modular<Element> >;
-
- template <>
- struct ClassifyRing<Modular<double> > {
- typedef RingCategories::ModularTag categoryTag;
- };
-
- class MultiModDouble;
-
- /*! \ingroup modular
- * Standard representation of \f$\mathbf{Z}/m\mathbf{Z}\f$.
- * If \c m is the modulus, then elements are represented in \f[ \left
- * \llbracket 0, m-1 \right \rrbracket.\f]
- */
- template <>
- class Modular<double> :
- public FFPACK::Modular<double>,public FieldInterface {
- public:
- typedef double Element;
-
- protected:
-
- public:
- typedef FFPACK::Modular<double> Father_t;
- friend class FieldAXPY<Modular<Element> >;
- friend class DotProductDomain<Modular<Element> >;
- friend class MultiModDouble;
-
- public:
-
- typedef ModularRandIter<Element> RandIter;
-
- static ClassifyRing<Modular<Element> >::categoryTag getCategory()
- {
- return ClassifyRing<Modular<Element> >::categoryTag();
- }
-
- Modular (const integer& p, int e=1) :
- Father_t((unsigned long) p)
- {
- linbox_check(e==1);
-#ifdef DEBUG
- if(modulus <= 1)
- throw PreconditionFailed(__func__,__FILE__,__LINE__,"modulus must be > 1");
- if(modulus > getMaxModulus())
- throw PreconditionFailed(__func__,__FILE__,__LINE__,"modulus is too big");
-#endif
- }
-
- Modular () : Father_t() {};
-
- using Father_t ::cardinality ;
- integer &cardinality (integer &c) const
- {
- return c = integer(modulus);
- }
-
- using Father_t ::characteristic;
- integer &characteristic (integer &c) const
- {
- return c = integer(modulus);
- }
-
- using Father_t ::convert;
- integer &convert (integer &x, const Element &y) const
- {
- return x = integer(y);
- }
-
-
-
- //!@bug use FFPACK operator
- const Modular<double> &operator=(const Modular<double> &F)
- {
- if ( this == &F)
- return *this;
- modulus = F.modulus;
- lmodulus = F.lmodulus;
-
- F.assign(const_cast<Element&>(one),F.one);
- F.assign(const_cast<Element&>(zero),F.zero);
- F.assign(const_cast<Element&>(mOne),F.mOne);
- return *this;
- }
-
-
- using Father_t ::init;
- Element &init (Element &x, const integer &y) const
- {
- x = (Element)(y%lmodulus);
- if (x<0) x+= modulus ;
- linbox_check(x < lmodulus);
- linbox_check(!(x < 0));
- return x ;
- }
-
- Element &init (Element &x) const
- {
- return x = 0 ;
- }
-
- bool isMinusOne (const Element &x) const
- {
- return (x == mOne);
- }
-
- /** Max number of operations before reducing
- * @param r if \c r=0, we consider how many \c += are performable.
- * if \c r=1, then we look for the maximum \c axpy operations doable.
- * @return \p 0 if the field is too big, a positive number otherwise, \p -1 if infinity
- * on general fields, it is \p 1.
- */
- unsigned long AccBound(const Element r) const
- {
- // Element One, Zero ; init(One,1UL) ; init(Zero,0UL);
- Element max_Element = (Element) (1ULL<<DBL_MANT_DIG) - modulus ; /* other wise 2^52+(2^52-1) */
- Element p = modulus-1 ;
- if (areEqual(zero,r))
- return (unsigned long) (Element(max_Element)/p) ;
- else if (areEqual(one,r))
- {
- if (modulus>= getMaxModulus())
- return 0 ;
- else
- return (unsigned long) (Element(max_Element)/(modulus*modulus)) ;
- }
- else
- throw LinboxError("Bad input, expecting 0 or 1");
- return 0;
- }
-
- };
-
-} // LinBox
-
-// FieldAXPY/DotProductDomain
-namespace LinBox
-{
-
- template <>
- class FieldAXPY<Modular<double> > {
- public:
-
- typedef double Element;
- typedef Modular<double> Field;
-
- FieldAXPY (const Field &F) :
- _field (F) , //_invmod(1./_field.modulus),
- _y(0.) , _bound( (double) ((1ULL << 53) - (unsigned long int) (_field.modulus*_field.modulus)))
- {}
-
- FieldAXPY (const FieldAXPY &faxpy) :
- _field (faxpy._field),// _invmod(faxpy._invmod) ,
- _y(faxpy._y), _bound(faxpy._bound)
- {}
-
-#if 0
- FieldAXPY<Modular<double> > &operator = (const FieldAXPY &faxpy)
- {
- _field = faxpy._field;
- //_invmod= faxpy._invmod;
- _y= faxpy._y;
- _bound= faxpy._bound;
- return *this;
- }
-#endif
-
- Element& mulacc (const Element &a, const Element &x)
- {
- // Element tmp= a*x;
- // return accumulate(tmp);
- return accumulate(a*x);
- }
-
- Element& accumulate (const Element &tmp)
- {
- _y += tmp;
- if (_y > _bound)
- return _y = fmod (_y, _field.modulus);
- else
- return _y;
- }
-
- Element& subumulate (const Element &tmp)
- {
- _y -= tmp;
- if (_y < 0)
- return _y += _field.modulus;
- else
- return _y;
- }
-
- Element& get (Element &y)
- {
- _y = fmod (_y, _field.modulus);
- return y=_y ;
- }
-
- FieldAXPY &assign (const Element y)
- {
- _y = y;
- return *this;
- }
-
- void reset()
- {
- _y = 0.;
- }
-
- Element& set (const Element &tmp)
- {
- _y = tmp;
- if (_y > _bound)
- return _y = fmod (_y, _field.modulus);
- else
- return _y;
- }
-
- private:
-
- Field _field;
- //double _invmod;
- double _y;
- double _bound;
- };
-
- template <>
- class DotProductDomain<Modular<double> > : private virtual VectorDomainBase<Modular<double> > {
- private:
- double _bound;
- size_t _nmax;
- //double _invmod;
-
- public:
- typedef double Element;
- DotProductDomain (const Modular<double> &F) :
- VectorDomainBase<Modular<double> > (F), _bound( (double) ( (1ULL<<53) - (unsigned long int) (F.modulus*F.modulus)))//, _invmod(1./_field.modulus)
- {
- _nmax= (size_t)floor((double(1<<26)* double(1<<26)*2.)/ (F.modulus * F.modulus));
- _nmax = (_nmax>0?_nmax:1);
- }
-
- protected:
- template <class Vector1, class Vector2>
- Element &dotSpecializedDD (Element &res, const Vector1 &v1, const Vector2 &v2) const
- {
-
- double y = 0.;
- double t = 0.;
- if (v1.size() < _nmax) {
- for (size_t i = 0; i< v1.size();++i)
- y += v1[i] * v2[i] ;
- y = fmod(y, _field.modulus);
- }
- else{
- size_t i=0;
- for (;i< v1.size()- _nmax ;i=i+_nmax){
- for (size_t j=i;j<i+_nmax;++j)
- y += v1[j] * v2[j];
- t+=fmod(y, _field.modulus);
- y=0.;
- }
- for (;i < v1.size();++i)
- y += v1[i] * v2[i];
- t+=fmod(y, _field.modulus);
- y = fmod(t, _field.modulus);
- }
- return res = y;
- }
-
- template <class Vector1, class Vector2>
- Element &dotSpecializedDSP (Element &res, const Vector1 &v1, const Vector2 &v2) const
- {
-
- double y = 0.;
- double t =0.;
-
-
- if (v1.first.size() < _nmax) {
- for (size_t i=0;i<v1.first.size();++i)
- y+= v1.second[i] * v2[v1.first[i]];
- y = fmod(y, _field.modulus);
- }
- else {
- size_t i=0;
- for (;i< v1.first.size()- _nmax ;i=i+_nmax){
- for (size_t j=i;j<i+_nmax;++j)
- y += v1.second[j] * v2[v1.first[j]];
- t+=fmod(y, this->_field.modulus);
- y=0.;
- }
- for (;i < v1.first.size();++i)
- y += v1.second[i] * v2[v1.first[i]];
- t+= fmod(y, _field.modulus);
- y = fmod(t, _field.modulus);
- }
- return res = y;
- }
- };
-}
-
-
-#endif //__LINBOX_modular_double_H
-
-
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
-// Local Variables:
-// mode: C++
-// tab-width: 8
-// indent-tabs-mode: nil
-// c-basic-offset: 8
-// End:
-
diff --git a/linbox/field/Modular/modular-float.h b/linbox/field/Modular/modular-float.h
deleted file mode 100644
index 8c4c5db..0000000
--- a/linbox/field/Modular/modular-float.h
+++ /dev/null
@@ -1,335 +0,0 @@
-/* linbox/field/modular-float.h
- * Copyright (C) 2003 Pascal Giorgi
- * 2007 Clement Pernet
- * Written by Clement Pernet <cpernet at uwaterloo.ca>
- *
- * ------------------------------------
- *
- *
- * ========LICENCE========
- * This file is part of the library LinBox.
- *
- * LinBox is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- * ========LICENCE========
- *.
- */
-
-/*! @file field/Modular/modular-float.h
- * @ingroup field
- * @brief representation of <code>Z/mZ</code> over \c float .
- */
-
-#ifndef __LINBOX_modular_float_H
-#define __LINBOX_modular_float_H
-
-#ifdef __INTEL_COMPILER
-#define FmodF fmodf
-#else
-#define FmodF fmod
-#endif
-
-
-
-#include "linbox/linbox-config.h"
-#include "linbox/integer.h"
-#include "linbox/vector/vector-domain.h"
-#include "linbox/field/field-interface.h"
-#include "linbox/field/field-traits.h"
-#include "linbox/util/field-axpy.h"
-#include "linbox/util/debug.h"
-#include <math.h>
-#include "linbox/field/field-traits.h"
-#include "linbox/randiter/nonzero.h"
-
-#include <fflas-ffpack/field/modular-float.h>
-
-// Namespace in which all LinBox code resides
-namespace LinBox
-{
-
- template< class Element >
- class Modular;
- template< class Element >
- class ModularRandIter;
-
- template< class Field, class RandIter >
- class NonzeroRandIter;
-
- template <class Ring>
- struct ClassifyRing;
- template <class Element>
- struct ClassifyRing<Modular<Element> >;
- template <>
- struct ClassifyRing<Modular<float> > {
- typedef RingCategories::ModularTag categoryTag;
- };
-
- class MultiModFloat;
-
- /// \ingroup field
- template <>
- class Modular<float> : public FieldInterface,
- public FFPACK::Modular<float> {
-
- public :
- typedef float Element;
- typedef FFPACK::Modular<float> Father_t ;
- using Father_t::one ;
- using Father_t::zero ;
- using Father_t::mOne ;
-
- public:
- friend class FieldAXPY<Modular<Element> >;
- friend class DotProductDomain<Modular<Element> >;
- friend class MultiModFloat;
-
- typedef ModularRandIter<Element> RandIter;
-
- static ClassifyRing<Modular<Element> >::categoryTag getCategory()
- {
- return ClassifyRing<Modular<Element> >::categoryTag();
- }
-
- Modular (const integer& p, int e = 1) :
- Father_t((unsigned long)p)
- {
-#ifdef DEBUG
- if(modulus <= 1)
- throw PreconditionFailed(__func__,__FILE__,__LINE__,"modulus must be > 1");
- integer max;
- if(modulus > (Element) FieldTraits<Modular<Element> >::maxModulus(max))
- throw PreconditionFailed(__func__,__FILE__,__LINE__,"modulus is too big");
-#endif
-
- }
-
- using Father_t ::cardinality ;
- integer &cardinality (integer &c) const
- {
- return c = integer(modulus);
- }
-
- using Father_t ::characteristic;
- integer &characteristic (integer &c) const
- {
- return c = integer(modulus);
- }
-
- using Father_t ::convert;
- integer &convert (integer &x, const Element &y) const
- {
- return x = integer(y);
- }
-
- using Father_t ::init;
- Element &init (Element &x, const integer &y) const
- {
- x = (Element)(y%lmodulus);
-
- if (x<0) return x+=modulus ;
- return x;
- }
-
- Element &init(Element &x) const
- {
- return x = 0 ;
- }
-
- unsigned long AccBound(const Element&r) const
- {
- double max_double = (double) (1ULL<<FLT_MANT_DIG) - modulus ;
- double p = modulus-1 ;
- if (areEqual(zero,r))
- return (unsigned long) (double(max_double)/p) ;
- else if (areEqual(one,r))
- {
- if (modulus>= getMaxModulus())
- return 0 ;
- else
- return (unsigned long) (double(max_double)/(modulus*modulus)) ;
- }
- else
- throw LinboxError("Bad input, expecting 0 or 1");
- return 0;
- }
-
- };
-
- template <>
- class FieldAXPY<Modular<float> > {
- public:
-
- typedef float Element;
- typedef Modular<float> Field;
-
- FieldAXPY (const Field &F) :
- _field (F) , //_invmod(1./_field.modulus),
- _y(0.) , _bound( (float) ( (1UL << 23) - (unsigned long int) (_field.modulus*_field.modulus)))
- {}
-
- FieldAXPY (const FieldAXPY &faxpy) :
- _field (faxpy._field),// _invmod(faxpy._invmod) ,
- _y(faxpy._y), _bound(faxpy._bound)
- {}
-
-#if 0
- FieldAXPY<Modular<float> > &operator = (const FieldAXPY &faxpy)
- {
- _field = faxpy._field ;
- //_invmod= faxpy._invmod;
- _y = faxpy._y;
- _bound= faxpy._bound;
- return *this;
- }
-#endif
-
- inline Element& mulacc (const Element &a, const Element &x)
- {
- Element tmp= a*x;
- return accumulate(tmp);
- }
-
- inline Element& accumulate (const Element &tmp)
- {
- _y += tmp;
- if (_y > _bound)
- return _y = fmodf (_y, _field.modulus);
- else
- return _y;
- }
-
- inline Element& get (Element &y)
- {
- _y = fmodf (_y, _field.modulus);
- return y=_y ;
- }
-
- inline FieldAXPY &assign (const Element y)
- {
- _y = y;
- return *this;
- }
-
- inline void reset()
- {
- _y = 0.;
- }
-
- private:
-
- Field _field;
- //float _invmod;
- float _y;
- float _bound;
- };
-
-
- template <>
- class DotProductDomain<Modular<float> > : private virtual VectorDomainBase<Modular<float> > {
- private:
- float _bound;
- size_t _nmax;
- //float _invmod;
-
- public:
- typedef float Element;
- DotProductDomain (const Modular<float> &F) :
- VectorDomainBase<Modular<float> > (F)
- , _bound( (float) ( (1<<23) - (int) (_field.modulus*_field.modulus)))
- //, _invmod(1./_field.modulus)
- {
- _nmax= (size_t)floor((float(1<<11)* float(1<<12))/ (_field.modulus * _field.modulus));
- }
-
- protected:
- template <class Vector1, class Vector2>
- inline Element &dotSpecializedDD (Element &res, const Vector1 &v1, const Vector2 &v2) const
- {
-
- float y = 0.;
- float t = 0.;
- if (v1.size() < _nmax)
- {
- for (size_t i = 0; i< v1.size();++i)
- y += v1[i] * v2[i] ;
- y = fmodf(y, _field.modulus);
- }
- else
- {
- size_t i=0;
- for (;i< v1.size()- _nmax ;i=i+_nmax)
- {
- for (size_t j=i;j<i+_nmax;++j)
- y += v1[j] * v2[j];
- t+=fmodf(y, _field.modulus);
- y=0.;
- }
- for (;i < v1.size();++i)
- y += v1[i] * v2[i];
- t+=fmodf(y, _field.modulus);
- y = fmodf(t, _field.modulus);
- }
- return res = y;
- }
-
- template <class Vector1, class Vector2>
- inline Element &dotSpecializedDSP (Element &res, const Vector1 &v1, const Vector2 &v2) const
- {
-
- float y = 0.;
- float t =0.;
-
-
- if (v1.first.size() < _nmax)
- {
- for (size_t i=0;i<v1.first.size();++i)
- y+= v1.second[i] * v2[v1.first[i]];
- y = fmodf(y, _field.modulus);
- }
- else
- {
- size_t i=0;
- for (;i< v1.first.size()- _nmax ;i=i+_nmax)
- {
- for (size_t j=i;j<i+_nmax;++j)
- y += v1.second[j] * v2[v1.first[j]];
- t+=fmodf(y, _field.modulus);
- y=0.;
- }
- for (;i < v1.first.size();++i)
- y += v1.second[i] * v2[v1.first[i]];
- t+= fmodf(y, _field.modulus);
- y = fmodf(t, _field.modulus);
- }
- return res = y;
- }
- };
-}
-
-#include "linbox/randiter/modular.h"
-
-#undef FmodF
-
-#endif //__LINBOX_modular_float_H
-
-
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
-// Local Variables:
-// mode: C++
-// tab-width: 8
-// indent-tabs-mode: nil
-// c-basic-offset: 8
-// End:
-
diff --git a/linbox/field/Modular/modular-int32.h b/linbox/field/Modular/modular-int32.h
deleted file mode 100644
index dbb69ba..0000000
--- a/linbox/field/Modular/modular-int32.h
+++ /dev/null
@@ -1,526 +0,0 @@
-/* Copyright (C) 2010 LinBox
- *
- *
- *
- * ========LICENCE========
- * This file is part of the library LinBox.
- *
- * LinBox is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- * ========LICENCE========
- */
-
-/*! @file field/Modular/modular-int32.h
- * @ingroup field
- * @brief representation of <code>Z/mZ</code> over \c int32_t .
- */
-#ifndef __LINBOX_modular_int32_H
-#define __LINBOX_modular_int32_H
-
-
-#include <math.h>
-#include "linbox/linbox-config.h"
-#include "linbox/integer.h"
-#include "linbox/vector/vector-domain.h"
-#include "linbox/field/field-interface.h"
-#include "linbox/field/field-traits.h"
-#include "linbox/util/debug.h"
-#include "linbox/field/field-traits.h"
-
-#include <fflas-ffpack/field/modular-int32.h>
-
-#ifndef LINBOX_MAX_INT /* 2147483647 */
-#define LINBOX_MAX_INT INT32_MAX
-#endif
-
-// Namespace in which all LinBox code resides
-namespace LinBox
-{
-
- template< class Element >
- class Modular;
- template< class Element >
- class ModularRandIter;
- template< class Field, class RandIter >
- class NonzeroRandIter;
-
- template<class Field>
- class DotProductDomain;
- template<class Field>
- class FieldAXPY;
- template<class Field>
- class MVProductDomain;
-
- template <class Ring>
- struct ClassifyRing;
-
- template <class Element>
- struct ClassifyRing<Modular<Element> >;
-
- template <>
- struct ClassifyRing<Modular<int32_t> > {
- typedef RingCategories::ModularTag categoryTag;
- };
-
-
-
- /** \brief Specialization of Modular to int32_t element type with efficient dot product.
- *
- * Efficient element operations for dot product, mul, axpy, by using floating point
- * inverse of modulus (borrowed from NTL) and some use of non-normalized intermediate values.
- *
- * For some uses this is the most efficient field for primes in the range from half word
- * to 2^30.
- *
- * Requires: Modulus < 2^30.
- * Intended use: 2^15 < prime modulus < 2^30.
- \ingroup field
- */
- template <>
- class Modular<int32_t> : public FieldInterface ,
- public ::FFPACK::Modular<int32_t> {
-
- protected:
-
- public:
-
- friend class FieldAXPY<Modular<int32_t> >;
- friend class DotProductDomain<Modular<int32_t> >;
- friend class MVProductDomain<Modular<int32_t> >;
-
- typedef FFPACK::Modular<int32_t> Father_t;
-
- typedef int32_t Element;
- typedef ModularRandIter<int32_t> RandIter;
-
- Modular (integer &p) :
- Father_t((unsigned long)p)
- {}
-
- Modular (int32_t value, int32_t exp=1) :
- Father_t(value,exp)
- {}
-#if (FFLAFLAS_VERSIONW>10400)
- Modular (long value) :
- Father_t(value)
- {}
-#endif
-
- Modular (unsigned long value) :
- Father_t(value)
- {}
-
- using Father_t ::cardinality;
- integer &cardinality (integer &c) const
- {
- return c = modulus;
- }
-
- using Father_t ::characteristic;
- integer &characteristic (integer &c) const
- {
- return c = modulus;
- }
-
-
-
- using Father_t ::convert;
- integer &convert (integer &x, const Element &y) const
- {
- return x = y;
- }
-
-
- using Father_t ::init;
- Element &init (Element &x, const integer &y) const
- {
- x = Element (y % lmodulus);
- if (x < 0) x += modulus;
- return x;
- }
-
- unsigned long AccBound(const Element&r) const
- {
- // Element one, zero ; init(one,1UL) ; init(zero,0UL);
- double max_double = (double) (INT_MAX) - modulus ;
- double p = modulus-1 ;
- if (areEqual(zero,r))
- return (unsigned long) (max_double/p) ;
- else if (areEqual(one,r))
- {
- if (modulus>= getMaxModulus())
- return 0 ;
- else
- return (unsigned long) max_double/(unsigned long)(modulus*modulus) ;
- }
- else
- throw LinboxError("Bad input, expecting 0 or 1");
- return 0;
- }
-
- private:
-
- };
-
- template <>
- class FieldAXPY<Modular<int32_t> > {
- public:
-
- typedef int32_t Element;
- typedef Modular<int32_t> Field;
-
- FieldAXPY (const Field &F) :
- _field (F),_y(0)
- { }
-
-
- FieldAXPY (const FieldAXPY &faxpy) :
- _field (faxpy._field), _y (0)
- {}
-
- FieldAXPY<Modular<int32_t> > &operator = (const FieldAXPY &faxpy)
- {
- _field = faxpy._field;
- _y = faxpy._y;
- return *this;
- }
-
- uint64_t& mulacc (const Element &a, const Element &x)
- {
- uint64_t t = (uint64_t) a * (uint64_t) x;
- _y += t;
- if (_y < t) {
- _y += (uint64_t)_field._two64;
- return _y ;
- }
- else
- return _y;
- }
-
- uint64_t& accumulate (const Element &t)
- {
- _y += (uint64_t) t;
- if (_y < (uint64_t)t)
- return _y += (uint64_t) _field._two64;
- else
- return _y;
- }
-
- Element& get (Element &y)
- {
- y = Element (_y % (uint64_t) _field.modulus);
- return y;
- }
-
- FieldAXPY &assign (const Element y)
- {
- _y = (uint64_t) y;
- return *this;
- }
-
- void reset()
- {
- _y = 0;
- }
-
- protected:
- Field _field;
- uint64_t _y;
- };
-
-
- template <>
- class DotProductDomain<Modular<int32_t> > : private virtual VectorDomainBase<Modular<int32_t> > {
-
- public:
- typedef int32_t Element;
- DotProductDomain (const Modular<int32_t> &F) :
- VectorDomainBase<Modular<int32_t> > (F)
- {}
-
-
- protected:
- template <class Vector1, class Vector2>
- Element &dotSpecializedDD (Element &res, const Vector1 &v1, const Vector2 &v2) const
- {
-
- typename Vector1::const_iterator i;
- typename Vector2::const_iterator j;
-
- uint64_t y = 0;
- uint64_t t;
-
- for (i = v1.begin (), j = v2.begin (); i < v1.end (); ++i, ++j)
- {
- t = ( (uint64_t) *i ) * ( (uint64_t) *j );
- y += t;
-
- if (y < t)
- y += (uint64_t) _field._two64;
- }
-
- y %= (uint64_t) _field.modulus;
- return res = Element(y);
-
- }
-
- template <class Vector1, class Vector2>
- Element &dotSpecializedDSP (Element &res, const Vector1 &v1, const Vector2 &v2) const
- {
- typename Vector1::first_type::const_iterator i_idx;
- typename Vector1::second_type::const_iterator i_elt;
-
- uint64_t y = 0;
- uint64_t t;
-
- for (i_idx = v1.first.begin (), i_elt = v1.second.begin (); i_idx != v1.first.end (); ++i_idx, ++i_elt)
- {
- t = ( (uint64_t) *i_elt ) * ( (uint64_t) v2[*i_idx] );
- y += t;
-
- if (y < t)
- y += (uint64_t) _field._two64;
- }
-
-
- y %= (uint64_t) _field.modulus;
-
- return res = (Element) y;
- }
- };
-
- // Specialization of MVProductDomain for int32_t modular field
-
- template <>
- class MVProductDomain<Modular<int32_t> > {
- public:
-
- typedef int32_t Element;
-
- protected:
- template <class Vector1, class Matrix, class Vector2>
- Vector1 &mulColDense
- (const VectorDomain<Modular<int32_t> > &VD, Vector1 &w, const Matrix &A, const Vector2 &v) const
- {
- return mulColDenseSpecialized
- (VD, w, A, v, typename VectorTraits<typename Matrix::Column>::VectorCategory ());
- }
-
- private:
- template <class Vector1, class Matrix, class Vector2>
- Vector1 &mulColDenseSpecialized
- (const VectorDomain<Modular<int32_t> > &VD, Vector1 &w, const Matrix &A, const Vector2 &v,
- VectorCategories::DenseVectorTag) const;
- template <class Vector1, class Matrix, class Vector2>
- Vector1 &mulColDenseSpecialized
- (const VectorDomain<Modular<int32_t> > &VD, Vector1 &w, const Matrix &A, const Vector2 &v,
- VectorCategories::SparseSequenceVectorTag) const;
- template <class Vector1, class Matrix, class Vector2>
- Vector1 &mulColDenseSpecialized
- (const VectorDomain<Modular<int32_t> > &VD, Vector1 &w, const Matrix &A, const Vector2 &v,
- VectorCategories::SparseAssociativeVectorTag) const;
- template <class Vector1, class Matrix, class Vector2>
- Vector1 &mulColDenseSpecialized
- (const VectorDomain<Modular<int32_t> > &VD, Vector1 &w, const Matrix &A, const Vector2 &v,
- VectorCategories::SparseParallelVectorTag) const;
-
- mutable std::vector<uint64_t> _tmp;
- };
-
- template <class Vector1, class Matrix, class Vector2>
- Vector1 &MVProductDomain<Modular<int32_t> >::mulColDenseSpecialized
- (const VectorDomain<Modular<int32_t> > &VD, Vector1 &w, const Matrix &A, const Vector2 &v,
- VectorCategories::DenseVectorTag) const
- {
-
- linbox_check (A.coldim () == v.size ());
- linbox_check (A.rowdim () == w.size ());
-
- typename Matrix::ConstColIterator i = A.colBegin ();
- typename Vector2::const_iterator j;
- typename Matrix::Column::const_iterator k;
- std::vector<uint64_t>::iterator l;
-
- uint64_t t;
-
- if (_tmp.size () < w.size ())
- _tmp.resize (w.size ());
-
- std::fill (_tmp.begin (), _tmp.begin () + w.size (), 0);
-
- for (j = v.begin (); j != v.end (); ++j, ++i)
- {
- for (k = i->begin (), l = _tmp.begin (); k != i->end (); ++k, ++l)
- {
- t = ((uint64_t) *k) * ((uint64_t) *j);
-
- *l += t;
-
- if (*l < t)
- *l += (uint64_t) VD.field ()._two64;
- }
- }
-
- typename Vector1::iterator w_j;
- typedef typename Vector1::value_type elements ;
-
- for (w_j = w.begin (), l = _tmp.begin (); w_j != w.end (); ++w_j, ++l)
- *w_j = elements(*l % VD.field ().modulus);
-
- return w;
- }
-
- template <class Vector1, class Matrix, class Vector2>
- Vector1 &MVProductDomain<Modular<int32_t> >::mulColDenseSpecialized
- (const VectorDomain<Modular<int32_t> > &VD, Vector1 &w, const Matrix &A, const Vector2 &v,
- VectorCategories::SparseSequenceVectorTag) const
- {
- linbox_check (A.coldim () == v.size ());
- linbox_check (A.rowdim () == w.size ());
-
- typename Matrix::ConstColIterator i = A.colBegin ();
- typename Vector2::const_iterator j;
- typename Matrix::Column::const_iterator k;
- std::vector<uint64_t>::iterator l;
-
- uint64_t t;
-
- if (_tmp.size () < w.size ())
- _tmp.resize (w.size ());
-
- std::fill (_tmp.begin (), _tmp.begin () + w.size (), 0);
-
- for (j = v.begin (); j != v.end (); ++j, ++i) {
- for (k = i->begin (), l = _tmp.begin (); k != i->end (); ++k, ++l) {
- t = ((uint64_t) k->second) * ((uint64_t) *j);
-
- _tmp[k->first] += t;
-
- if (_tmp[k->first] < t)
- _tmp[k->first] += VD.field ()._two64;
- }
- }
-
- typename Vector1::iterator w_j;
- typedef typename Vector1::value_type val_t;
-
- for (w_j = w.begin (), l = _tmp.begin (); w_j != w.end (); ++w_j, ++l)
- *w_j = (val_t)( *l % VD.field ().modulus );
-
- return w;
- }
-
- template <class Vector1, class Matrix, class Vector2>
- Vector1 &MVProductDomain<Modular<int32_t> >::mulColDenseSpecialized
- (const VectorDomain<Modular<int32_t> > &VD, Vector1 &w, const Matrix &A, const Vector2 &v,
- VectorCategories::SparseAssociativeVectorTag) const
- {
-
- linbox_check (A.coldim () == v.size ());
- linbox_check (A.rowdim () == w.size ());
-
- typename Matrix::ConstColIterator i = A.colBegin ();
- typename Vector2::const_iterator j;
- typename Matrix::Column::const_iterator k;
- std::vector<uint64_t>::iterator l;
-
- uint64_t t;
-
- if (_tmp.size () < w.size ())
- _tmp.resize (w.size ());
-
- std::fill (_tmp.begin (), _tmp.begin () + w.size (), 0);
-
- for (j = v.begin (); j != v.end (); ++j, ++i)
- {
- for (k = i->begin (), l = _tmp.begin (); k != i->end (); ++k, ++l)
- {
- t = ((uint64_t) k->second) * ((uint64_t) *j);
-
- _tmp[k->first] += t;
-
- if (_tmp[k->first] < t)
- _tmp[k->first] += VD.field ()._two64;
- }
- }
-
- typename Vector1::iterator w_j;
-
- for (w_j = w.begin (), l = _tmp.begin (); w_j != w.end (); ++w_j, ++l)
- *w_j = *l % VD.field ().modulus;
-
- return w;
- }
-
- template <class Vector1, class Matrix, class Vector2>
- Vector1 &MVProductDomain<Modular<int32_t> >::mulColDenseSpecialized
- (const VectorDomain<Modular<int32_t> > &VD, Vector1 &w, const Matrix &A, const Vector2 &v,
- VectorCategories::SparseParallelVectorTag) const
- {
-
- linbox_check (A.coldim () == v.size ());
- linbox_check (A.rowdim () == w.size ());
-
- typename Matrix::ConstColIterator i = A.colBegin ();
- typename Vector2::const_iterator j;
- typename Matrix::Column::first_type::const_iterator k_idx;
- typename Matrix::Column::second_type::const_iterator k_elt;
- std::vector<uint64_t>::iterator l;
-
- uint64_t t;
-
- if (_tmp.size () < w.size ())
- _tmp.resize (w.size ());
-
- std::fill (_tmp.begin (), _tmp.begin () + w.size (), 0);
-
- for (j = v.begin (); j != v.end (); ++j, ++i)
- {
- for (k_idx = i->first.begin (), k_elt = i->second.begin (), l = _tmp.begin ();
- k_idx != i->first.end ();
- ++k_idx, ++k_elt, ++l)
- {
- t = ((uint64_t) *k_elt) * ((uint64_t) *j);
-
- _tmp[*k_idx] += t;
-
- if (_tmp[*k_idx] < t)
- _tmp[*k_idx] += VD.field ()._two64;
- }
- }
-
- typename Vector1::iterator w_j;
-
- for (w_j = w.begin (), l = _tmp.begin (); w_j != w.end (); ++w_j, ++l)
- *w_j = *l % VD.field ().modulus;
-
- return w;
- }
-
-
-}
-
-#include "linbox/randiter/modular.h"
-
-#endif //__LINBOX_modular_int32_H
-
-
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
-// Local Variables:
-// mode: C++
-// tab-width: 8
-// indent-tabs-mode: nil
-// c-basic-offset: 8
-// End:
-
diff --git a/linbox/field/Modular/modular-int64.h b/linbox/field/Modular/modular-int64.h
deleted file mode 100644
index 8a0e35d..0000000
--- a/linbox/field/Modular/modular-int64.h
+++ /dev/null
@@ -1,505 +0,0 @@
-/* Copyright (C) 2010 LinBox
- * Adapted by B Boyer <brice.boyer at imag.fr>
- * (from other modular-balanced* files)
- *
- *
- * ========LICENCE========
- * This file is part of the library LinBox.
- *
- * LinBox is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- * ========LICENCE========
- */
-
-/*! @file field/Modular/modular-int64.h
- * @ingroup field
- * @brief representation of <code>Z/mZ</code> over \c int64_t .
- */
-#ifndef __LINBOX_modular_int64_H
-#define __LINBOX_modular_int64_H
-
-
-#include <math.h>
-#include "linbox/linbox-config.h"
-#include "linbox/integer.h"
-#include "linbox/vector/vector-domain.h"
-#include "linbox/field/field-interface.h"
-#include "linbox/field/field-traits.h"
-#include "linbox/util/debug.h"
-#include "linbox/field/field-traits.h"
-
-#include <fflas-ffpack/field/modular-int64.h>
-
-#ifndef LINBOX_MAX_INT64 /* 18446744073709551615L(L) is UINT64_MAX*/
-#ifdef __x86_64__
-#define LINBOX_MAX_INT64 INT64_MAX
-#else
-#define LINBOX_MAX_INT64 INT64_MAX
-#endif
-#endif
-
-// Namespace in which all LinBox code resides
-namespace LinBox
-{
-
- template< class Element >
- class Modular;
- template< class Element >
- class ModularRandIter;
- template<class Field>
- class DotProductDomain;
- template<class Field>
- class FieldAXPY;
- template<class Field>
- class MVProductDomain;
-
- template <class Ring>
- struct ClassifyRing;
-
- template <class Element>
- struct ClassifyRing<Modular<Element> >;
-
- template <>
- struct ClassifyRing<Modular<int64_t> > {
- typedef RingCategories::ModularTag categoryTag;
- };
-
-
-
- /** \brief Specialization of Modular to int64_t element type with efficient dot product.
- *
- * Efficient element operations for dot product, mul, axpy, by using floating point
- * inverse of modulus (borrowed from NTL) and some use of non-normalized intermediate values.
- *
- * For some uses this is the most efficient field for primes in the range from half word
- * to 2^62.
- *
- * Requires: Modulus < 2^62.
- * Intended use: 2^30 < prime modulus < 2^62.
- \ingroup field
- */
- template <>
- class Modular<int64_t> : public FieldInterface,
- public FFPACK::Modular<int64_t> {
-
- public:
- typedef int64_t Element;
-
- typedef FFPACK::Modular<int64_t> Father_t
- friend class FieldAXPY<Modular<int64_t> >;
- friend class DotProductDomain<Modular<int64_t> >;
- friend class MVProductDomain<Modular<int64_t> >;
-
- typedef ModularRandIter<int64_t> RandIter;
-
- using Father_t ::cardinality;
- inline integer &cardinality (integer &c) const
- {
- return c = modulus;
- }
-
- using Father_t ::characteristic;
- inline integer &characteristic (integer &c) const
- {
- return c = modulus;
- }
-
- inline integer characteristic () const
- {
- return modulus;
- }
-
- using Father_t ::convert;
- inline integer &convert (integer &x, const Element &y) const
- {
- return x = y;
- }
-
- using Father_t ::init;
- inline Element &init (Element &x, const integer &y) const
- {
- x = Element (y % lmodulus);
- if (x < 0) x += modulus;
- return x;
- }
-
-
- private:
-
-
- };
-
- template <>
- class FieldAXPY<Modular<int64_t> > {
- public:
-
- typedef int64_t Element;
- typedef Modular<int64_t> Field;
-
- FieldAXPY (const Field &F) :
- _field (F),_y(0)
- {}
-
-
- FieldAXPY (const FieldAXPY &faxpy) :
- _field (faxpy._field), _y (0)
- {}
-
- FieldAXPY<Modular<int64_t> > &operator = (const FieldAXPY &faxpy)
- {
- _field = faxpy._field;
- _y = faxpy._y;
- return *this;
- }
-
- inline uint64_t& mulacc (const Element &a, const Element &x)
- {
- uint64_t t = (uint64_t) a * (uint64_t) x;
- _y += t;
- if (_y < t)
- return _y += _field._two64;
- else
- return _y;
- }
-
- inline uint64_t& accumulate (const Element &t)
- {
- _y += t;
- if (_y < (uint64_t)t)
- return _y += _field._two64;
- else
- return _y;
- }
-
- inline Element& get (Element &y)
- {
- y =_y % (uint64_t) _field.modulus;
- return y;
- }
-
- inline FieldAXPY &assign (const Element y)
- {
- _y = y;
- return *this;
- }
-
- inline void reset()
- {
- _y = 0;
- }
-
- protected:
- Field _field;
- uint64_t _y;
- };
-
-
- template <>
- class DotProductDomain<Modular<int64_t> > : private virtual VectorDomainBase<Modular<int64_t> > {
-
- public:
- typedef int64_t Element;
- DotProductDomain (const Modular<int64_t> &F) :
- VectorDomainBase<Modular<int64_t> > (F)
- {}
-
-
- protected:
- template <class Vector1, class Vector2>
- inline Element &dotSpecializedDD (Element &res, const Vector1 &v1, const Vector2 &v2) const
- {
-
- typename Vector1::const_iterator i;
- typename Vector2::const_iterator j;
-
- uint64_t y = 0;
- uint64_t t;
-
- for (i = v1.begin (), j = v2.begin (); i < v1.end (); ++i, ++j)
- {
- t = ( (uint64_t) *i ) * ( (uint64_t) *j );
- y += t;
-
- if (y < t)
- y += _field._two64;
- }
-
- y %= (uint64_t) _field.modulus;
- return res = y;
-
- }
-
- template <class Vector1, class Vector2>
- inline Element &dotSpecializedDSP (Element &res, const Vector1 &v1, const Vector2 &v2) const
- {
- typename Vector1::first_type::const_iterator i_idx;
- typename Vector1::second_type::const_iterator i_elt;
-
- uint64_t y = 0;
- uint64_t t;
-
- for (i_idx = v1.first.begin (), i_elt = v1.second.begin (); i_idx != v1.first.end (); ++i_idx, ++i_elt)
- {
- t = ( (uint64_t) *i_elt ) * ( (uint64_t) v2[*i_idx] );
- y += t;
-
- if (y < t)
- y += _field._two64;
- }
-
-
- y %= (uint64_t) _field.modulus;
-
- return res = y;
- }
- };
-
- // Specialization of MVProductDomain for int64_t modular field
-
- template <>
- class MVProductDomain<Modular<int64_t> > {
- public:
-
- typedef int64_t Element;
-
- protected:
- template <class Vector1, class Matrix, class Vector2>
- inline Vector1 &mulColDense
- (const VectorDomain<Modular<int64_t> > &VD, Vector1 &w, const Matrix &A, const Vector2 &v) const
- {
- return mulColDenseSpecialized
- (VD, w, A, v, typename VectorTraits<typename Matrix::Column>::VectorCategory ());
- }
-
- private:
- template <class Vector1, class Matrix, class Vector2>
- Vector1 &mulColDenseSpecialized
- (const VectorDomain<Modular<int64_t> > &VD, Vector1 &w, const Matrix &A, const Vector2 &v,
- VectorCategories::DenseVectorTag) const;
- template <class Vector1, class Matrix, class Vector2>
- Vector1 &mulColDenseSpecialized
- (const VectorDomain<Modular<int64_t> > &VD, Vector1 &w, const Matrix &A, const Vector2 &v,
- VectorCategories::SparseSequenceVectorTag) const;
- template <class Vector1, class Matrix, class Vector2>
- Vector1 &mulColDenseSpecialized
- (const VectorDomain<Modular<int64_t> > &VD, Vector1 &w, const Matrix &A, const Vector2 &v,
- VectorCategories::SparseAssociativeVectorTag) const;
- template <class Vector1, class Matrix, class Vector2>
- Vector1 &mulColDenseSpecialized
- (const VectorDomain<Modular<int64_t> > &VD, Vector1 &w, const Matrix &A, const Vector2 &v,
- VectorCategories::SparseParallelVectorTag) const;
-
- mutable std::vector<uint64_t> _tmp;
- };
-
- template <class Vector1, class Matrix, class Vector2>
- Vector1 & MVProductDomain<Modular<int64_t> >::
- mulColDenseSpecialized (const VectorDomain<Modular<int64_t> > &VD,
- Vector1 &w,
- const Matrix &A,
- const Vector2 &v,
- VectorCategories::DenseVectorTag) const
- {
-
- linbox_check (A.coldim () == v.size ());
- linbox_check (A.rowdim () == w.size ());
-
- typename Matrix::ConstColIterator i = A.colBegin ();
- typename Vector2::const_iterator j;
- typename Matrix::Column::const_iterator k;
- std::vector<uint64_t>::iterator l;
-
- uint64_t t;
-
- if (_tmp.size () < w.size ())
- _tmp.resize (w.size ());
-
- std::fill (_tmp.begin (), _tmp.begin () + w.size (), 0);
-
- for (j = v.begin (); j != v.end (); ++j, ++i)
- {
- for (k = i->begin (), l = _tmp.begin (); k != i->end (); ++k, ++l)
- {
- t = ((uint64_t) *k) * ((uint64_t) *j);
-
- *l += t;
-
- if (*l < t)
- *l += VD.field ()._two64;
- }
- }
-
- typename Vector1::iterator w_j;
-
- for (w_j = w.begin (), l = _tmp.begin (); w_j != w.end (); ++w_j, ++l)
- *w_j = *l % VD.field ().modulus;
-
- return w;
- }
-
- template <class Vector1, class Matrix, class Vector2>
- Vector1 &MVProductDomain<Modular<int64_t> >::
- mulColDenseSpecialized (const VectorDomain<Modular<int64_t> > &VD,
- Vector1 &w,
- const Matrix &A,
- const Vector2 &v,
- VectorCategories::SparseSequenceVectorTag) const
- {
- linbox_check (A.coldim () == v.size ());
- linbox_check (A.rowdim () == w.size ());
-
- typename Matrix::ConstColIterator i = A.colBegin ();
- typename Vector2::const_iterator j;
- typename Matrix::Column::const_iterator k;
- std::vector<uint64_t>::iterator l;
-
- uint64_t t;
-
- if (_tmp.size () < w.size ())
- _tmp.resize (w.size ());
-
- std::fill (_tmp.begin (), _tmp.begin () + w.size (), 0);
-
- for (j = v.begin (); j != v.end (); ++j, ++i)
- {
- for (k = i->begin (), l = _tmp.begin (); k != i->end (); ++k, ++l)
- {
- t = ((uint64_t) k->second) * ((uint64_t) *j);
-
- _tmp[k->first] += t;
-
- if (_tmp[k->first] < t)
- _tmp[k->first] += VD.field ()._two64;
- }
- }
-
- typename Vector1::iterator w_j;
-
- for (w_j = w.begin (), l = _tmp.begin (); w_j != w.end (); ++w_j, ++l)
- *w_j = *l % VD.field ().modulus;
-
- return w;
- }
-
- template <class Vector1, class Matrix, class Vector2>
- Vector1 &MVProductDomain<Modular<int64_t> > ::
- mulColDenseSpecialized(const VectorDomain<Modular<int64_t> > &VD,
- Vector1 &w,
- const Matrix &A,
- const Vector2 &v,
- VectorCategories::SparseAssociativeVectorTag) const
- {
-
- linbox_check (A.coldim () == v.size ());
- linbox_check (A.rowdim () == w.size ());
-
- typename Matrix::ConstColIterator i = A.colBegin ();
- typename Vector2::const_iterator j;
- typename Matrix::Column::const_iterator k;
- std::vector<uint64_t>::iterator l;
-
- uint64_t t;
-
- if (_tmp.size () < w.size ())
- _tmp.resize (w.size ());
-
- std::fill (_tmp.begin (), _tmp.begin () + w.size (), 0);
-
- for (j = v.begin (); j != v.end (); ++j, ++i)
- {
- for (k = i->begin (), l = _tmp.begin (); k != i->end (); ++k, ++l)
- {
- t = ((uint64_t) k->second) * ((uint64_t) *j);
-
- _tmp[k->first] += t;
-
- if (_tmp[k->first] < t)
- _tmp[k->first] += VD.field ()._two64;
- }
- }
-
- typename Vector1::iterator w_j;
-
- for (w_j = w.begin (), l = _tmp.begin (); w_j != w.end (); ++w_j, ++l)
- *w_j = *l % VD.field ().modulus;
-
- return w;
- }
-
- template <class Vector1, class Matrix, class Vector2>
- Vector1 &MVProductDomain<Modular<int64_t> > ::
- mulColDenseSpecialized (const VectorDomain<Modular<int64_t> > &VD,
- Vector1 &w,
- const Matrix &A,
- const Vector2 &v,
- VectorCategories::SparseParallelVectorTag) const
- {
-
- linbox_check (A.coldim () == v.size ());
- linbox_check (A.rowdim () == w.size ());
-
- typename Matrix::ConstColIterator i = A.colBegin ();
- typename Vector2::const_iterator j;
- typename Matrix::Column::first_type::const_iterator k_idx;
- typename Matrix::Column::second_type::const_iterator k_elt;
- std::vector<uint64_t>::iterator l;
-
- uint64_t t;
-
- if (_tmp.size () < w.size ())
- _tmp.resize (w.size ());
-
- std::fill (_tmp.begin (), _tmp.begin () + w.size (), 0);
-
- for (j = v.begin (); j != v.end (); ++j, ++i)
- {
- for (k_idx = i->first.begin (), k_elt = i->second.begin (), l = _tmp.begin ();
- k_idx != i->first.end ();
- ++k_idx, ++k_elt, ++l)
- {
- t = ((uint64_t) *k_elt) * ((uint64_t) *j);
-
- _tmp[*k_idx] += t;
-
- if (_tmp[*k_idx] < t)
- _tmp[*k_idx] += VD.field ()._two64;
- }
- }
-
- typename Vector1::iterator w_j;
-
- for (w_j = w.begin (), l = _tmp.begin (); w_j != w.end (); ++w_j, ++l)
- *w_j = *l % VD.field ().modulus;
-
- return w;
- }
-
-
-}
-
-#undef LINBOX_MAX_INT64
-
-#include "linbox/randiter/modular.h"
-
-#endif //__LINBOX_modular_int64_H
-
-
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
-// Local Variables:
-// mode: C++
-// tab-width: 8
-// indent-tabs-mode: nil
-// c-basic-offset: 8
-// End:
-
diff --git a/linbox/field/Modular/modular-short.h b/linbox/field/Modular/modular-short.h
deleted file mode 100644
index e3236e2..0000000
--- a/linbox/field/Modular/modular-short.h
+++ /dev/null
@@ -1,794 +0,0 @@
-/* Copyright (C) 2010 LinBox
- * Written by <?>
- *
- *
- *
- * ========LICENCE========
- * This file is part of the library LinBox.
- *
- * LinBox is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- * ========LICENCE========
- */
-
-/*! @file field/Modular/modular-short.h
- * @ingroup field
- * @brief representation of <code>Z/mZ</code> over \c short .
- */
-#ifndef __LINBOX_modular_short_H
-#define __LINBOX_modular_short_H
-
-
-#include "math.h"
-#include "linbox/linbox-config.h"
-#include "linbox/integer.h"
-#include "linbox/vector/vector-domain.h"
-#include "linbox/field/field-interface.h"
-#include "linbox/util/debug.h"
-#include "linbox/field/field-traits.h"
-
-#ifndef LINBOX_MAX_INT16 /* 32767 */
-#define LINBOX_MAX_INT16 INT16_MAX
-#endif
-
-#ifdef __ICC /* pas content avec x = -x par exemple */
-#pragma warning(disable:2259)
-#endif
-
-// Namespace in which all LinBox code resides
-namespace LinBox
-{
-
- template<class Element>
- class Modular;
-
- template<class Element>
- class ModularRandIter;
-
- template<class Field>
- class FieldAXPY;
-
- template<class Field>
- class DotProductDomain;
-
- template<class Field>
- class MVProductDomain;
-
- template <class Ring>
- struct ClassifyRing;
-
- template <class Element>
- struct ClassifyRing<Modular<Element> >;
-
- template <>
- struct ClassifyRing<Modular<short> >{
- typedef RingCategories::ModularTag categoryTag;
- };
-
- /** \brief Specialization of Modular to short element type with efficient dot product.
- *
- * Efficient element operations for dot product, mul, axpy, by using floating point
- * inverse of modulus (borrowed from NTL) and some use of non-normalized intermediate values.
- *
- * Requires: modulus < 2^15.
- * Intended use: 2^7 < prime modulus < 2^15.
- \ingroup field
- */
- template <>
- class Modular<int16_t> : public FieldInterface {
- public:
- typedef int16_t Element;
- protected:
- Element modulus;
- unsigned long lmodulus;
- double modulusinv;
-
- public:
- const Element one,zero,mOne;
- friend class FieldAXPY<Modular<Element> >;
- friend class DotProductDomain<Modular<Element> >;
- friend class MVProductDomain<Modular<Element> >;
-
- typedef ModularRandIter<Element> RandIter;
-
- //default modular field,taking 251 as default modulus
- Modular () :
- modulus(251),lmodulus((unsigned long)modulus)
- ,one((Element)1),zero((Element)0),mOne(Element(modulus-(Element)1))
- {
- modulusinv=1/(double)modulus;
- }
-
- Modular (int value, int exp = 1) :
- modulus((Element)value),lmodulus((unsigned long) value)
- ,one((Element)1),zero((Element)0),mOne(Element(modulus-(Element)1))
- {
- modulusinv = 1 / ((double) value);
-#ifdef DEBUG
- if(value<=1)
- throw PreconditionFailed(__func__,__FILE__,__LINE__,"modulus must be > 1");
- integer max;
- if(value>FieldTraits< Modular<Element> >::maxModulus(max))
- throw PreconditionFailed(__func__,__FILE__,__LINE__,"modulus is too big");
- if(exp != 1)
- throw PreconditionFailed(__func__,__FILE__,__LINE__,"exponent must be 1");
-#endif
- }
-
- Modular(const Modular<Element>& mf) :
- modulus(mf.modulus),lmodulus(mf. lmodulus),modulusinv(mf.modulusinv)
- ,one(mf.one),zero(mf.zero),mOne(mf.mOne)
- {}
-
- const Modular &operator=(const Modular<Element> &F)
- {
- modulus = F. modulus;
- lmodulus = F. lmodulus ;
- modulusinv = F. modulusinv;
- F.assign(const_cast<Element&>(one),F.one);
- F.assign(const_cast<Element&>(zero),F.zero);
- F.assign(const_cast<Element&>(mOne),F.mOne);
-
-
- return *this;
- }
-
- inline integer &cardinality (integer &c) const
- {
- return c = modulus;
- }
-
- inline integer &characteristic (integer &c) const
- {
- return c = modulus;
- }
-
- inline unsigned long cardinality () const
- {
- return lmodulus;
- }
-
- inline unsigned long characteristic () const
- {
- return lmodulus;
- }
-
-
- inline integer &convert (integer &x, const Element &y) const
- {
- return x = y;
- }
-
- inline std::ostream &write (std::ostream &os) const
- {
- return os << "Element mod " << modulus;
- }
-
- inline std::istream &read (std::istream &is)
- {
- int prime;
- is >> prime;
-#ifdef DEBUG
- if(prime <= 1) throw PreconditionFailed(__func__,__FILE__,__LINE__,"modulus must be > 1");
- integer max;
- if(prime > FieldTraits< Modular<Element> >::maxModulus(max)) throw PreconditionFailed(__func__,__FILE__,__LINE__,"modulus is too big");
-#endif
- modulus = (Element) prime;
- modulusinv = 1 /((double) modulus );
-
- return is;
- }
-
- inline std::ostream &write (std::ostream &os, const Element &x) const
- {
- return os << x;
- }
-
- inline std::istream &read (std::istream &is, Element &x) const
- {
- integer tmp;
- is >> tmp;
- init(x,tmp);
- return is;
- }
-
- template<class T>
- inline Element &init (Element &x, const T& y) const
- {
- return init( x, static_cast<integer>(y) );
- }
-
- inline Element &init (Element &x, const integer &y) const
- {
- x = Element(y % lmodulus);
- if (x < 0)
- x = Element((int) x + (int)modulus);
- return x;
- }
-
- inline Element& init(Element& x, int y) const
- {
- x = (Element)(y % int(modulus));
- if ( x < 0 )
- x = Element((int) x + (int)modulus);
- return x;
- }
-
- inline Element& init(Element& x, long y) const
- {
- x = Element(y % (long)modulus);
- if ( x < 0 )
- x = Element((int) x + (int)modulus);
- return x;
- }
-
- inline Element &init (Element & x, const double &y) const
- {
- double z = fmod(y, (double)modulus);
- if (z < 0) z += (double)modulus;
- //z += 0.5; // C Pernet Sounds nasty and not necessary
- return x = static_cast<Element>(z); //rounds towards 0
- }
-
- inline Element &init (Element &x, const float &y) const
- {
- return init (x, (double) y);
- }
-
- Element &init(Element &x) const
- {
- return x = 0 ;
- }
- inline Element& assign(Element& x, const Element& y) const
- {
- return x = y;
- }
-
-
- inline bool areEqual (const Element &x, const Element &y) const
- {
- return x == y;
- }
-
- inline bool isZero (const Element &x) const
- {
- return x == 0;
- }
-
- inline bool isOne (const Element &x) const
- {
- return x == 1;
- }
-
- inline Element &add (Element &x, const Element &y, const Element &z) const
- {
- x = Element((int)y + (int)z);
- if ( (uint16_t)x >= (uint16_t)modulus )
- x = (Element) (( (uint16_t)x )- modulus);
- return x;
- }
-
- inline Element &sub (Element &x, const Element &y, const Element &z) const
- {
- x = Element(y - z);
- if (x < 0)
- x = Element((int) x + (int)modulus);
- return x;
- }
-
- inline Element &mul (Element &x, const Element &y, const Element &z) const
- {
- Element q;
-
- double ab=((double) y)* ((double) z);
- q = (Element)(ab*modulusinv); // q could be off by (+/-) 1
- x = (Element) (ab - ((double) q )* ((double) modulus));
-
-
- if (x >= modulus)
- x = Element((int) x - (int)modulus);
- else if (x < 0)
- x = Element((int) x + (int)modulus);
-
- return x;
- }
-
- inline Element &div (Element &x, const Element &y, const Element &z) const
- {
- Element temp;
- inv (temp, z);
- return mul (x, y, temp);
- }
-
- inline Element &neg (Element &x, const Element &y) const
- {
- if(y==0)
- return x=0;
- else
- return x= Element(modulus-y);
- }
-
- inline Element &inv (Element &x, const Element &y) const
- {
- Element d, t;
- XGCD(d, x, t, y, modulus);
-#ifdef DEBUG
- if (d != 1)
- throw PreconditionFailed(__func__,__FILE__,__LINE__,"InvMod: inverse undefined");
-#endif
- if (x < 0)
- return x = Element((int) x + (int)modulus);
- else
- return x;
-
- }
-
- inline Element &axpy (Element &r,
- const Element &a,
- const Element &x,
- const Element &y) const
- {
- Element q;
-
- double ab=((double) a)* ((double) x) + ( double ) y;
- q = (Element)(ab*modulusinv); // q could be off by (+/-) 1
- r = (Element) (ab - ((double) q )* ((double) modulus));
-
-
- if (r >= modulus)
- r = Element((int) r - (int)modulus);
- else if (r < 0)
- r = Element((int) r + (int)modulus);
-
- return r;
-
- }
-
- inline Element &addin (Element &x, const Element &y) const
- {
- x = Element(x+y);
- if ( ((uint16_t) x) >= (uint16_t)modulus )
- x = Element( ((uint16_t) x)-modulus );
- return x;
- }
-
- inline Element &subin (Element &x, const Element &y) const
- {
- x = Element(x - y);
- if (x < 0) x = Element(x+modulus);
- return x;
- }
-
- inline Element &mulin (Element &x, const Element &y) const
- {
- return mul(x,x,y);
- }
-
- inline Element &divin (Element &x, const Element &y) const
- {
- return div(x,x,y);
- }
-
- inline Element &negin (Element &x) const
- {
- if (x == 0) return x;
- else return x = Element(modulus - x);
- }
-
- inline Element &invin (Element &x) const
- {
- return inv (x, x);
- }
-
- inline Element &axpyin (Element &r, const Element &a, const Element &x) const
- {
-
- Element q;
-
- double ab = ((double) a)* ((double) x) + ( double ) r;
- q = (Element)(ab*modulusinv); // q could be off by (+/-) 1
- r = (Element) (ab - ((double) q )* ((double) modulus));
-
-
- if (r >= modulus)
- r = Element(r - modulus);
- else if (r < 0)
- r = Element( r + modulus );
-
- return r;
- }
-
- static inline Element getMaxModulus()
- {
- return 32767; // 2^15 - 1
- // linbox_check(180*181 < INT16_MAX);
- // return 181 ;
- }
-
- private:
-
- static void XGCD(int16_t& d, int16_t& s, int16_t& t, int16_t a, int16_t b)
- {
- int32_t u, v, u0, v0, u1, v1, u2, v2, q, r;
-
- Element aneg = 0, bneg = 0;
-
- if (a < 0) {
-#ifdef DEBUG
- if (a < -LINBOX_MAX_INT16) throw PreconditionFailed(__func__,__FILE__,__LINE__,"XGCD: integer overflow");
-#endif
- a = Element(-a);
- aneg = 1;
- }
-
- if (b < 0) {
-#ifdef DEBUG
- if (b < -LINBOX_MAX_INT16) throw PreconditionFailed(__func__,__FILE__,__LINE__,"XGCD: integer overflow");
-#endif
- b = Element(-b);
- bneg = 1;
- }
-
- u1 = 1; v1 = 0;
- u2 = 0; v2 = 1;
- u = a; v = b;
-
-
- while (v != 0) {
- q = u / v;
- r = Element(u % v);
- u = v;
- v = r;
- u0 = u2;
- v0 = v2;
- u2 = u1 - q*u2;
- v2 = v1- q*v2;
- u1 = u0;
- v1 = v0;
- }
-
- if (aneg)
- u1 = -u1;
-
- if (bneg)
- v1 = -v1;
-
- d = Element(u);
- s = Element(u1);
- t = Element(v1);
- }
-
- };
-
- template <>
- class FieldAXPY<Modular<int16_t> > {
- public:
-
- typedef int16_t Element;
- typedef Modular<int16_t> Field;
-
- FieldAXPY (const Field &F) :
- _field (F),_y(0)
- {
- }
-
- FieldAXPY (const FieldAXPY &faxpy) :
- _field (faxpy._field), _y (0)
- {}
-
- FieldAXPY<Modular<int16_t> > &operator = (const FieldAXPY &faxpy)
- {
- _field = faxpy._field;
- _y = faxpy._y;
- return *this;
- }
-
- inline uint64_t& mulacc (const Element &a, const Element &x)
- {
- uint64_t t = ( (uint32_t) a ) * ( (uint32_t) x );
- return _y+=t;
- }
-
- inline uint64_t& accumulate (const Element &t)
- {
- return _y += (uint64_t) t;
- }
-
- inline Element& get (Element &y)
- {
- y = Element(_y % (uint64_t) _field.modulus);
- return y;
- }
-
- inline FieldAXPY &assign (const Element y)
- {
- _y = (uint64_t) y;
- return *this;
- }
-
- inline void reset()
- {
- _y = 0;
- }
-
- private:
-
- Field _field;
- uint64_t _y;
- uint16_t _two_64;
- };
-
-
- template <>
- class DotProductDomain<Modular<int16_t> > : private virtual VectorDomainBase<Modular<int16_t> > {
-
- public:
- typedef int16_t Element;
- DotProductDomain (const Modular<int16_t> &F) :
- VectorDomainBase<Modular<int16_t> > (F)
- { }
-
-
- protected:
- template <class Vector1, class Vector2>
- inline Element &dotSpecializedDD (Element &res, const Vector1 &v1, const Vector2 &v2) const
- {
-
- typename Vector1::const_iterator i;
- typename Vector2::const_iterator j;
-
- uint64_t y = 0;
- // uint64_t t;
-
- for (i = v1.begin (), j = v2.begin (); i < v1.end (); ++i, ++j) {
- y += ( (uint32_t) *i ) * ( (uint32_t) *j );
- }
-
- y %= (uint64_t) _field.modulus;
-
- return res = (Element) y;
-
- }
-
- template <class Vector1, class Vector2>
- inline Element &dotSpecializedDSP (Element &res, const Vector1 &v1, const Vector2 &v2) const
- {
- typename Vector1::first_type::const_iterator i_idx;
- typename Vector1::second_type::const_iterator i_elt;
-
- uint64_t y = 0;
-
- for (i_idx = v1.first.begin (), i_elt = v1.second.begin (); i_idx != v1.first.end (); ++i_idx, ++i_elt) {
- y += ( (uint32_t) *i_elt ) * ( (uint32_t) v2[*i_idx] );
- }
-
- y %= (uint64_t) _field.modulus;
-
- return res = (Element) y;
- }
-
- };
- // Specialization of MVProductDomain for int16_t modular field
-
- template <>
- class MVProductDomain<Modular<int16_t> >
- {
- public:
-
- typedef int16_t Element;
-
- protected:
- template <class Vector1, class Matrix, class Vector2>
- inline Vector1 &mulColDense
- (const VectorDomain<Modular<int16_t> > &VD, Vector1 &w, const Matrix &A, const Vector2 &v) const
- {
- return mulColDenseSpecialized
- (VD, w, A, v, typename VectorTraits<typename Matrix::Column>::VectorCategory ());
- }
-
- private:
- template <class Vector1, class Matrix, class Vector2>
- Vector1 &mulColDenseSpecialized
- (const VectorDomain<Modular<int16_t> > &VD, Vector1 &w, const Matrix &A, const Vector2 &v,
- VectorCategories::DenseVectorTag) const;
- template <class Vector1, class Matrix, class Vector2>
- Vector1 &mulColDenseSpecialized
- (const VectorDomain<Modular<int16_t> > &VD, Vector1 &w, const Matrix &A, const Vector2 &v,
- VectorCategories::SparseSequenceVectorTag) const;
- template <class Vector1, class Matrix, class Vector2>
- Vector1 &mulColDenseSpecialized
- (const VectorDomain<Modular<int16_t> > &VD, Vector1 &w, const Matrix &A, const Vector2 &v,
- VectorCategories::SparseAssociativeVectorTag) const;
- template <class Vector1, class Matrix, class Vector2>
- Vector1 &mulColDenseSpecialized
- (const VectorDomain<Modular<int16_t> > &VD, Vector1 &w, const Matrix &A, const Vector2 &v,
- VectorCategories::SparseParallelVectorTag) const;
-
- mutable std::vector<uint64_t> _tmp;
- };
-
- template <class Vector1, class Matrix, class Vector2>
- Vector1 &MVProductDomain<Modular<int16_t> >::mulColDenseSpecialized
- (const VectorDomain<Modular<int16_t> > &VD, Vector1 &w, const Matrix &A, const Vector2 &v,
- VectorCategories::DenseVectorTag) const
- {
-
- linbox_check (A.coldim () == v.size ());
- linbox_check (A.rowdim () == w.size ());
-
- typename Matrix::ConstColIterator i = A.colBegin ();
- typename Vector2::const_iterator j;
- typename Matrix::Column::const_iterator k;
- std::vector<uint64_t>::iterator l;
-
- uint64_t t;
-
- if (_tmp.size () < w.size ())
- _tmp.resize (w.size ());
-
- std::fill (_tmp.begin (), _tmp.begin () + w.size (), 0);
-
- for (j = v.begin (); j != v.end (); ++j, ++i) {
- for (k = i->begin (), l = _tmp.begin (); k != i->end (); ++k, ++l) {
- t = ((uint32_t) *k) * ((uint32_t) *j);
-
- *l += t;
-
- }
- }
-
- typename Vector1::iterator w_j;
-
- for (w_j = w.begin (), l = _tmp.begin (); w_j != w.end (); ++w_j, ++l)
- *w_j = *l % VD.field ().modulus;
-
- return w;
- }
-
- template <class Vector1, class Matrix, class Vector2>
- Vector1 &MVProductDomain<Modular<int16_t> >::mulColDenseSpecialized
- (const VectorDomain<Modular<int16_t> > &VD, Vector1 &w, const Matrix &A, const Vector2 &v,
- VectorCategories::SparseSequenceVectorTag) const
- {
- linbox_check (A.coldim () == v.size ());
- linbox_check (A.rowdim () == w.size ());
-
- typename Matrix::ConstColIterator i = A.colBegin ();
- typename Vector2::const_iterator j;
- typename Matrix::Column::const_iterator k;
- std::vector<uint64_t>::iterator l;
-
- uint64_t t;
-
- if (_tmp.size () < w.size ())
- _tmp.resize (w.size ());
-
- std::fill (_tmp.begin (), _tmp.begin () + w.size (), 0);
-
- for (j = v.begin (); j != v.end (); ++j, ++i) {
- for (k = i->begin (), l = _tmp.begin (); k != i->end (); ++k, ++l) {
- t = ((uint32_t) k->second) * ((uint32_t) *j);
-
- _tmp[k->first] += t;
-
- }
- }
-
- typename Vector1::iterator w_j;
-
- for (w_j = w.begin (), l = _tmp.begin (); w_j != w.end (); ++w_j, ++l)
- *w_j = *l % VD.field ().modulus;
-
- return w;
- }
-
- template <class Vector1, class Matrix, class Vector2>
- Vector1 &MVProductDomain<Modular<int16_t> >::mulColDenseSpecialized
- (const VectorDomain<Modular<int16_t> > &VD, Vector1 &w, const Matrix &A, const Vector2 &v,
- VectorCategories::SparseAssociativeVectorTag) const
- {
-
- linbox_check (A.coldim () == v.size ());
- linbox_check (A.rowdim () == w.size ());
-
- typename Matrix::ConstColIterator i = A.colBegin ();
- typename Vector2::const_iterator j;
- typename Matrix::Column::const_iterator k;
- std::vector<uint64_t>::iterator l;
-
- uint64_t t;
-
- if (_tmp.size () < w.size ())
- _tmp.resize (w.size ());
-
- std::fill (_tmp.begin (), _tmp.begin () + w.size (), 0);
-
- for (j = v.begin (); j != v.end (); ++j, ++i) {
- for (k = i->begin (), l = _tmp.begin (); k != i->end (); ++k, ++l) {
- t = ((uint32_t) k->second) * ((uint32_t) *j);
-
- _tmp[k->first] += t;
-
- }
- }
-
- typename Vector1::iterator w_j;
-
- for (w_j = w.begin (), l = _tmp.begin (); w_j != w.end (); ++w_j, ++l)
- *w_j = *l % VD.field ().modulus;
-
- return w;
- }
-
- template <class Vector1, class Matrix, class Vector2>
- Vector1 &MVProductDomain<Modular<int16_t> >::mulColDenseSpecialized
- (const VectorDomain<Modular<int16_t> > &VD, Vector1 &w, const Matrix &A, const Vector2 &v,
- VectorCategories::SparseParallelVectorTag) const
- {
-
- linbox_check (A.coldim () == v.size ());
- linbox_check (A.rowdim () == w.size ());
-
- typename Matrix::ConstColIterator i = A.colBegin ();
- typename Vector2::const_iterator j;
- typename Matrix::Column::first_type::const_iterator k_idx;
- typename Matrix::Column::second_type::const_iterator k_elt;
- std::vector<uint64_t>::iterator l;
-
- uint64_t t;
-
- if (_tmp.size () < w.size ())
- _tmp.resize (w.size ());
-
- std::fill (_tmp.begin (), _tmp.begin () + w.size (), 0);
-
- for (j = v.begin (); j != v.end (); ++j, ++i) {
- for (k_idx = i->first.begin (), k_elt = i->second.begin (), l = _tmp.begin ();
- k_idx != i->first.end ();
- ++k_idx, ++k_elt, ++l)
- {
- t = ((uint32_t) *k_elt) * ((uint32_t) *j);
-
- _tmp[*k_idx] += t;
-
- }
- }
-
- typename Vector1::iterator w_j;
-
- for (w_j = w.begin (), l = _tmp.begin (); w_j != w.end (); ++w_j, ++l)
- *w_j = *l % VD.field ().modulus;
-
- return w;
- }
-
-
-}
-
-#ifdef __ICC
-#pragma warning(enable:2259)
-#endif
-
-#include "linbox/randiter/modular.h"
-#endif //__LINBOX_modular_short_H
-
-
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
-// Local Variables:
-// mode: C++
-// tab-width: 8
-// indent-tabs-mode: nil
-// c-basic-offset: 8
-// End:
-
diff --git a/linbox/field/Modular/modular-unsigned.h b/linbox/field/Modular/modular-unsigned.h
deleted file mode 100644
index f407611..0000000
--- a/linbox/field/Modular/modular-unsigned.h
+++ /dev/null
@@ -1,1102 +0,0 @@
-/* linbox/field/modular.h
- * Copyright (C) 1999-2001 William J Turner,
- * 2001 Bradford Hovinen
- * Copyright (C) 2011 LinBox
- *
- * Written by William J Turner <wjturner at math.ncsu.edu>,
- * Bradford Hovinen <hovinen at cis.udel.edu>
- *
- * ------------------------------------
- * 2002-04-10 Bradford Hovinen <hovinen at cis.udel.edu>
- *
- * LargeModular is now replace by a class Modular parameterized on the element
- * type. So, the old LargeModular is equivalent to Modular<integer>. All other
- * interface details are exactly the same.
- *
- * Renamed from large-modular.h to modular.h
- * ------------------------------------
- *
- *
- * ========LICENCE========
- * This file is part of the library LinBox.
- *
- * LinBox is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- * ========LICENCE========
- *.
- */
-
-#ifndef __LINBOX_field_modular_unsigned_H
-#define __LINBOX_field_modular_unsigned_H
-namespace LinBox
-{
- /** @brief Allows compact storage when the modulus is less than 2^8.
- *
- * Requires <code>1 < modulus < 2^8</code>, normally prime. See \ref
- * FieldArchetype for member specifications.
- */
- template <>
- class Modular<uint8_t> : public FieldInterface, public ModularBase<uint8_t> {
- public:
- typedef uint8_t Element;
- const Element zero,one, mOne;
-
- Modular () :
- zero(0),one(1),mOne(0),_k (0)
- {}
- Modular (uint32_t modulus) :
- ModularBase<Element> (modulus),
- zero(0),one(1),mOne((Element)(modulus-1)),
- _k (((uint64_t) -1LL) / ((modulus - 1) * (modulus - 1))),
- _pinv (1.0 / (double) ((Element) modulus))
- {
- linbox_check(modulus < UINT8_MAX);
- }
- Modular (const integer &modulus) :
- ModularBase<Element> ((unsigned long) modulus),
- zero(0),one(1),mOne(modulus-1),
- _k (((uint64_t) -1LL) / (((Element)modulus - 1) * ((Element)modulus - 1))),
- _pinv (1.0 / (double) ((Element) modulus))
- {
- linbox_check(modulus < UINT8_MAX);
- }
-
- const Modular &operator=(const Modular &F)
- {
- ModularBase<Element>::_modulus = F._modulus;
- _k = F._k;
- _pinv = F._pinv;
- F.assign(const_cast<Element&>(one),F.one);
- F.assign(const_cast<Element&>(zero),F.zero);
- F.assign(const_cast<Element&>(mOne),F.mOne);
-
-
- return *this;
- }
-
- Element &init (Element &x, const integer &y = 0) const
- {
- x = (Element) (abs (y) % integer (ModularBase<Element>::_modulus));
- if (y < 0)
- x = Element(ModularBase<Element>::_modulus - x);
- return x;
- }
-
- Element &init (Element &x, const double &y) const
- {
- double z = fmod(y, (double)_modulus);
- if (z < 0) z += (double) _modulus;
- return x = (Element) (z);
- }
-
- Element &init (Element &x, const long int &y ) const
- {
- x = (Element)(abs (y) % (long int) (ModularBase<Element>::_modulus));
- if (y < 0L)
- x = Element(ModularBase<Element>::_modulus - x);
- return x;
- }
-
- Element &init (Element &x, const int &y ) const
- {
- x = (Element)(abs (y) % (int) (ModularBase<Element>::_modulus));
- if (y < 0)
- x = Element(ModularBase<Element>::_modulus - x);
- return x;
- }
-
- /*! add elements
- * @todo is it faster to use uint32 and multiple casts ?
- */
- Element &add (Element &x, const Element &y, const Element &z) const
- {
- uint32_t t = (uint32_t) y + (uint32_t) z;
- if (t >= (uint32_t) ModularBase<Element>::_modulus)
- t -= ModularBase<Element>::_modulus;
- return x = (Element)t;
- }
-
- Element &sub (Element &x, const Element &y, const Element &z) const
- {
- int32_t t = (int32_t) y - (int32_t) z;
- if (t < 0)
- t += ModularBase<Element>::_modulus;
- return x = (Element)t;
- }
-
- Element &mul (Element &x, const Element &y, const Element &z) const
- {
- return x = Element( ((uint32_t) y * (uint32_t) z) % (uint32_t) ModularBase<Element>::_modulus );
- }
-
- Element &div (Element &x, const Element &y, const Element &z) const
- {
- Element temp;
- inv (temp, z);
- return mul (x, y, temp);
- }
-
- Element &neg (Element &x, const Element &y) const
- {
- if (y == 0)
- return x = y;
- else
- return x = (Element) (ModularBase<Element>::_modulus - y);
- }
-
- Element &inv (Element &x, const Element &y) const
- {
- // The extended Euclidean algoritm
- int32_t x_int, y_int, q, tx, ty, temp;
- x_int = ModularBase<Element>::_modulus;
- y_int = y;
- tx = 0;
- ty = 1;
-
- while (y_int != 0) {
- // always: gcd (modulus,residue) = gcd (x_int,y_int)
- // sx*modulus + tx*residue = x_int
- // sy*modulus + ty*residue = y_int
- q = x_int / y_int; // integer quotient
- temp = y_int; y_int = x_int - q * y_int;
- x_int = temp;
- temp = ty; ty = tx - q * ty;
- tx = temp;
- }
-
- if (tx < 0) tx += ModularBase<Element>::_modulus;
-
- // now x_int = gcd (modulus,residue)
- return x = (Element) tx;
- }
-
- Element &axpy (Element &r,
- const Element &a,
- const Element &x,
- const Element &y) const
- {
- r = Element(((uint32_t) a * (uint32_t) x + (uint32_t) y) % (uint32_t) ModularBase<Element>::_modulus) ;
- return r;
- }
-
- Element &addin (Element &x, const Element &y) const
- {
- uint32_t t = uint32_t((long) x + (long) y);
- if (t >= (uint32_t) ModularBase<Element>::_modulus) t -= ModularBase<Element>::_modulus;
- return x = (Element) t;
- }
-
- /*! subin.
- * @todo why \c long here ?
- */
- Element &subin (Element &x, const Element &y) const
- {
- long t = x - y;
- if (t < 0) t += ModularBase<Element>::_modulus;
- return x = (Element) t;
- }
-
- Element &mulin (Element &x, const Element &y) const
- {
- x = (Element)( ((uint32_t) x * (uint32_t) y) % (uint32_t) ModularBase<Element>::_modulus );
- return x;
- }
-
- Element &divin (Element &x, const Element &y) const
- {
- Element temp;
- inv (temp, y);
- return mulin (x, temp);
- }
-
- Element &negin (Element &x) const
- {
- if (x == 0)
- return x;
- else
- return x = Element(ModularBase<Element>::_modulus - x);
- }
-
- Element &invin (Element &x) const
- {
- return inv (x, x);
- }
-
- Element &axpyin (Element &r, const Element &a, const Element &x) const
- {
- r = (Element)( ((uint32_t) r + (uint32_t) a * (uint32_t) x) % (uint32_t) ModularBase<Element>::_modulus);
- return r;
- }
-
- private:
-
- friend class FieldAXPY<Modular<Element> >;
- friend class DotProductDomain<Modular<Element> >;
- friend class MVProductDomain<Modular<Element> >;
-
- // Number of times one can perform an axpy into a long long
- // before modding out is mandatory.
- uint64_t _k;
-
- // Inverse of modulus in floating point
- double _pinv;
-
- }; // class Modular<uint8_t>
-
- /*! Specialization of FieldAXPY for uint8_t modular field */
-
- template <>
- class FieldAXPY<Modular<uint8_t> > {
- public:
-
- typedef uint8_t Element;
- typedef Modular<uint8_t> Field;
-
- FieldAXPY (const Field &F) :
- _field (F),
- i ( (int)F._k)
- {
- _y = 0;
- }
-
- FieldAXPY (const FieldAXPY &faxpy) :
- _field (faxpy._field),
- _y (0),
- i ((int)faxpy._field._k)
- {}
-
- FieldAXPY<Modular<uint8_t> > &operator = (const FieldAXPY &faxpy)
- {
- _field = faxpy._field;
- _y = faxpy._y;
- return *this;
- }
-
- inline uint64_t& mulacc (const Element &a, const Element &x)
- {
- uint32_t t = (uint32_t) a * (uint32_t) x;
-
- if (!i--) {
- i = int(_field._k);
- return _y = _y % (uint32_t) _field._modulus + t;
- }
- else
- return _y += t;
- }
-
- inline uint64_t& accumulate (const Element &t)
- {
-
- if (!i--) {
- i = int( _field._k );
- return _y = _y % (uint32_t) _field._modulus + t;
- }
- else
- return _y += t;
- }
-
- inline Element &get (Element &y)
- {
- _y %= (uint32_t) _field._modulus;
- if ((int32_t) _y < 0) _y += _field._modulus;
- y = (uint8_t) _y;
- i = int(_field._k);
- return y;
- }
-
- inline FieldAXPY &assign (const Element y)
- {
- _y = y;
- i = int(_field._k);
- return *this;
- }
-
- inline void reset()
- {
- _y = 0;
- }
-
- private:
-
- Field _field;
- uint64_t _y;
- int i;
- };
-
- //! Specialization of DotProductDomain for unsigned short modular field
-
- template <>
- class DotProductDomain<Modular<uint8_t> > : private virtual VectorDomainBase<Modular<uint8_t> > {
- public:
-
- typedef uint8_t Element;
-
- DotProductDomain (const Modular<uint8_t> &F) :
- VectorDomainBase<Modular<uint8_t> > (F)
- {}
-
- protected:
- template <class Vector1, class Vector2>
- inline Element &dotSpecializedDD (Element &res, const Vector1 &v1, const Vector2 &v2) const;
-
- template <class Vector1, class Vector2>
- inline Element &dotSpecializedDSP (Element &res, const Vector1 &v1, const Vector2 &v2) const;
- };
-
- //! Specialization of MVProductDomain for uint8_t modular field
-
- template <>
- class MVProductDomain<Modular<uint8_t> > {
- public:
-
- typedef uint8_t Element;
-
- protected:
- template <class Vector1, class Matrix, class Vector2>
- inline Vector1 &mulColDense
- (const VectorDomain<Modular<uint8_t> > &VD, Vector1 &w, const Matrix &A, const Vector2 &v) const
- {
- return mulColDenseSpecialized (VD, w, A, v, typename VectorTraits<typename Matrix::Column>::VectorCategory ());
- }
-
- private:
- template <class Vector1, class Matrix, class Vector2>
- Vector1 &mulColDenseSpecialized
- (const VectorDomain<Modular<uint8_t> > &VD, Vector1 &w, const Matrix &A, const Vector2 &v,
- VectorCategories::DenseVectorTag) const;
- template <class Vector1, class Matrix, class Vector2>
- Vector1 &mulColDenseSpecialized
- (const VectorDomain<Modular<uint8_t> > &VD, Vector1 &w, const Matrix &A, const Vector2 &v,
- VectorCategories::SparseSequenceVectorTag) const;
- template <class Vector1, class Matrix, class Vector2>
- Vector1 &mulColDenseSpecialized
- (const VectorDomain<Modular<uint8_t> > &VD, Vector1 &w, const Matrix &A, const Vector2 &v,
- VectorCategories::SparseAssociativeVectorTag) const;
- template <class Vector1, class Matrix, class Vector2>
- Vector1 &mulColDenseSpecialized
- (const VectorDomain<Modular<uint8_t> > &VD, Vector1 &w, const Matrix &A, const Vector2 &v,
- VectorCategories::SparseParallelVectorTag) const;
-
- mutable std::vector<uint32_t> _tmp;
- };
-
-}
-
-namespace LinBox
-{
- /** @brief Specialization of class Modular for uint16_t element type */
- template <>
- class Modular<uint16_t> : public FieldInterface, public ModularBase<uint16_t> {
- public:
-
- typedef uint16_t Element;
-
- const Element zero,one, mOne;
-
- Modular () :
- zero(0),one(1),mOne(0),_k (0)
- {}
- Modular (uint32_t modulus) :
- ModularBase<Element> (modulus),
- zero(0),one(1),mOne((Element)(modulus-1)),
- _k (((uint64_t) -1LL) / ((ModularBase<Element>::_modulus - 1) * (ModularBase<Element>::_modulus - 1))),
- _pinv (1.0 / (double) ((Element) ModularBase<Element>::_modulus))
- {
- linbox_check(modulus<UINT16_MAX);
- }
- Modular (const integer &modulus) :
- ModularBase<Element> ((unsigned long) modulus),
- zero(0),one(1),mOne(Element(modulus-1)),
- _k (((uint64_t) -1LL) / ((ModularBase<Element>::_modulus - 1) * (ModularBase<Element>::_modulus - 1))),
- _pinv (1.0 / (double) ((Element) ModularBase<Element>::_modulus))
- {
- linbox_check(modulus<UINT16_MAX);
- }
-
- const Modular &operator=(const Modular &F)
- {
- ModularBase<Element>::_modulus = F._modulus;
- _k = F._k;
- _pinv = F._pinv;
- F.assign(const_cast<Element&>(one),F.one);
- F.assign(const_cast<Element&>(zero),F.zero);
- F.assign(const_cast<Element&>(mOne),F.mOne);
- return *this;
- }
-
- Element &init (Element &x, const integer &y) const
- {
- x = abs (y) % integer (ModularBase<Element>::_modulus);
- if (y < 0)
- x = Element(ModularBase<Element>::_modulus - x);
- return x;
- }
-
- Element &init (Element &x, const double &y) const
- {
- double z = fmod(y, (double)_modulus);
- if (z < 0)
- z += (double) _modulus;
- return x = (Element) (z);
- }
-
- Element &init (Element &x, const long int &y ) const
- {
- x = Element(abs (y) % (long int) (ModularBase<Element>::_modulus));
- if (y < 0)
- x = Element(ModularBase<Element>::_modulus - x);
- return x;
- }
-
- Element &init (Element &x, const int &y ) const
- {
- x = Element(abs (y) % (int) (ModularBase<Element>::_modulus));
- if (y < 0)
- x = Element(ModularBase<Element>::_modulus - x);
- return x;
- }
-
- Element &init(Element &x) const
- {
- return x = 0 ;
- }
-
- Element &add (Element &x, const Element &y, const Element &z) const
- {
- uint32_t t = (uint32_t) y + (uint32_t) z;
- if (t >= (uint32_t) ModularBase<Element>::_modulus)
- t -= ModularBase<Element>::_modulus;
- return x = (Element) t;
- }
-
- Element &sub (Element &x, const Element &y, const Element &z) const
- {
- int32_t t = (int32_t) y - (int32_t) z;
- if (t < 0) t += ModularBase<Element>::_modulus;
- return x = (Element) t;
- }
-
- Element &mul (Element &x, const Element &y, const Element &z) const
- {
- return x = (Element) ( ((uint32_t) y * (uint32_t) z) % (uint32_t) ModularBase<Element>::_modulus);
- }
-
- Element &div (Element &x, const Element &y, const Element &z) const
- {
- Element temp;
- inv (temp, z);
- return mul (x, y, temp);
- }
-
- Element &neg (Element &x, const Element &y) const
- {
- if (y == 0)
- return x = y;
- else
- return x = (Element)( ModularBase<Element>::_modulus - y);
- }
-
- Element &inv (Element &x, const Element &y) const
- {
- // The extended Euclidean algoritm
- int32_t x_int, y_int, q, tx, ty, temp;
- x_int = ModularBase<Element>::_modulus;
- y_int = y;
- tx = 0;
- ty = 1;
-
- while (y_int != 0) {
- // always: gcd (modulus,residue) = gcd (x_int,y_int)
- // sx*modulus + tx*residue = x_int
- // sy*modulus + ty*residue = y_int
- q = x_int / y_int; // integer quotient
- temp = y_int; y_int = x_int - q * y_int;
- x_int = temp;
- temp = ty; ty = tx - q * ty;
- tx = temp;
- }
-
- if (tx < 0) tx += ModularBase<Element>::_modulus;
-
- // now x_int = gcd (modulus,residue)
- return x = (Element) tx;
- }
-
- Element &axpy (Element &r,
- const Element &a,
- const Element &x,
- const Element &y) const
- {
- r = (Element)( ((uint32_t) a * (uint32_t) x + (uint32_t) y) % (uint32_t) ModularBase<Element>::_modulus );
- return r;
- }
-
- Element &addin (Element &x, const Element &y) const
- {
- uint32_t t = uint32_t( (long) x + (long) y );
- if (t >= (uint32_t) ModularBase<Element>::_modulus) t -= ModularBase<Element>::_modulus;
- return x = (Element) t;
- }
-
- Element &subin (Element &x, const Element &y) const
- {
- long t = x - y;
- if (t < 0) t += ModularBase<Element>::_modulus;
- return x = (Element) t;
- }
-
- Element &mulin (Element &x, const Element &y) const
- {
- x = (Element)( ((uint32_t) x * (uint32_t) y) % (uint32_t) ModularBase<Element>::_modulus);
- return x;
- }
-
- Element &divin (Element &x, const Element &y) const
- {
- Element temp;
- inv (temp, y);
- return mulin (x, temp);
- }
-
- Element &negin (Element &x) const
- {
- if (x == 0)
- return x;
- else
- return x = (Element) ( ModularBase<Element>::_modulus - x);
- }
-
- Element &invin (Element &x) const
- {
- return inv (x, x);
- }
-
- Element &axpyin (Element &r, const Element &a, const Element &x) const
- {
- r = (Element) ( ((uint32_t) r + (uint32_t) a * (uint32_t) x) % (uint32_t) ModularBase<Element>::_modulus);
- return r;
- }
-
- private:
-
- friend class FieldAXPY<Modular<Element> >;
- friend class DotProductDomain<Modular<Element> >;
- friend class MVProductDomain<Modular<Element> >;
-
- // Number of times one can perform an axpy into a long long
- // before modding out is mandatory.
- uint64_t _k;
-
- // Inverse of modulus in floating point
- double _pinv;
-
- }; // class Modular<uint16_t>
-
- /*! Specialization of FieldAXPY for uint16_t modular field */
- template <>
- class FieldAXPY<Modular<uint16_t> > {
- public:
-
- typedef uint16_t Element;
- typedef Modular<uint16_t> Field;
-
- FieldAXPY (const Field &F) :
- _field (F),
- i ((int)F._k)
- { _y = 0; }
- FieldAXPY (const FieldAXPY &faxpy) :
- _field (faxpy._field), _y (0), i ((int) faxpy._field._k)
- {}
-
- FieldAXPY<Modular<uint16_t> > &operator = (const FieldAXPY &faxpy)
- {
- _field = faxpy._field;
- _y = faxpy._y;
- return *this;
- }
-
- inline uint64_t& mulacc (const Element &a, const Element &x)
- {
- uint64_t t = (uint64_t) ((long long) a * (long long) x);
-
- if (!i--) {
- i = (int) _field._k;
- return _y = _y % (uint64_t) _field._modulus + t;
- }
- else
- return _y += t;
- }
-
- inline uint64_t& accumulate (const Element &t)
- {
- if (!i--) {
- i = (int) _field._k;
- return _y = _y % (uint64_t) _field._modulus + t;
- }
- else
- return _y += t;
- }
-
- inline Element &get (Element &y)
- {
- _y %= (uint64_t) _field._modulus;
- if ((int64_t) _y < 0) _y += _field._modulus;
- y = (uint16_t) _y;
- i = (int) _field._k;
- return y;
- }
-
- inline FieldAXPY &assign (const Element y)
- {
- _y = y;
- i = (int) _field._k;
- return *this;
- }
-
- inline void reset()
- {
- _y = 0;
- }
-
- private:
-
- Field _field;
- uint64_t _y;
- int i;
- };
-
- //! Specialization of DotProductDomain for unsigned short modular field
-
- template <>
- class DotProductDomain<Modular<uint16_t> > : private virtual VectorDomainBase<Modular<uint16_t> > {
- public:
-
- typedef uint16_t Element;
-
- DotProductDomain (const Modular<uint16_t> &F) :
- VectorDomainBase<Modular<uint16_t> > (F)
- {}
-
- protected:
- template <class Vector1, class Vector2>
- inline Element &dotSpecializedDD (Element &res, const Vector1 &v1, const Vector2 &v2) const;
-
- template <class Vector1, class Vector2>
- inline Element &dotSpecializedDSP (Element &res, const Vector1 &v1, const Vector2 &v2) const;
- };
-
- //! Specialization of MVProductDomain for uint16_t modular field
-
- template <>
- class MVProductDomain<Modular<uint16_t> > {
- public:
-
- typedef uint16_t Element;
-
- protected:
- template <class Vector1, class Matrix, class Vector2>
- inline Vector1 &mulColDense
- (const VectorDomain<Modular<uint16_t> > &VD, Vector1 &w, const Matrix &A, const Vector2 &v) const
- {
- return mulColDenseSpecialized (VD, w, A, v, VectorTraits<typename Matrix::Column>::VectorCategory ());
- }
-
- private:
- template <class Vector1, class Matrix, class Vector2>
- Vector1 &mulColDenseSpecialized
- (const VectorDomain<Modular<uint16_t> > &VD, Vector1 &w, const Matrix &A, const Vector2 &v,
- VectorCategories::DenseVectorTag) const;
- template <class Vector1, class Matrix, class Vector2>
- Vector1 &mulColDenseSpecialized
- (const VectorDomain<Modular<uint16_t> > &VD, Vector1 &w, const Matrix &A, const Vector2 &v,
- VectorCategories::SparseSequenceVectorTag) const;
- template <class Vector1, class Matrix, class Vector2>
- Vector1 &mulColDenseSpecialized
- (const VectorDomain<Modular<uint16_t> > &VD, Vector1 &w, const Matrix &A, const Vector2 &v,
- VectorCategories::SparseAssociativeVectorTag) const;
- template <class Vector1, class Matrix, class Vector2>
- Vector1 &mulColDenseSpecialized
- (const VectorDomain<Modular<uint16_t> > &VD, Vector1 &w, const Matrix &A, const Vector2 &v,
- VectorCategories::SparseParallelVectorTag) const;
-
- mutable std::vector<uint64_t> _tmp;
- };
-
-}
-
-namespace LinBox
-{
- /** @brief Specialization of class Modular for uint32_t element type */
- template <>
- class Modular<uint32_t> : public FieldInterface, public ModularBase<uint32_t> {
- public:
-
- typedef uint32_t Element;
- typedef Modular<Element> Self_t;
- // typedef ModularBase<Element> Father_t;
- typedef Modular<uint32_t> Father_t;
- typedef ModularBase<Element>::RandIter RandIter;
-
- const Element zero,one,mOne ;
-
- Modular () :
- zero(0),one(1),mOne(0)
- {}
- Modular (uint32_t modulus) :
- ModularBase<uint32_t> (modulus),zero(0),one(1),mOne(modulus-1)
- {
- init_two_64 ();
- }
- Modular (const integer &modulus) :
- ModularBase<uint32_t> (modulus),zero(0),one(1),mOne(modulus-1)
- {
- init_two_64 ();
- }
-
- const Modular &operator=(const Modular &F)
- {
- ModularBase<Element>::_modulus = F._modulus;
- _two_64 = F._two_64;
- F.assign(const_cast<Element&>(one),F.one);
- F.assign(const_cast<Element&>(zero),F.zero);
- F.assign(const_cast<Element&>(mOne),F.mOne);
-
- return *this;
- }
-
- Element &init (Element &x, const integer &y ) const
- {
- x = abs (y) % integer (ModularBase<Element>::_modulus);
- if (y < 0) x = ModularBase<Element>::_modulus - x;
- return x;
- }
-
- Element &init (Element &x, const long int &y ) const
- {
- x = abs (y) % integer (ModularBase<Element>::_modulus);
- if (y < 0) x = ModularBase<Element>::_modulus - x;
- return x;
- }
-
- Element &init (Element &x, const int &y ) const
- {
- x = abs (y) % integer (ModularBase<Element>::_modulus);
- if (y < 0) x = ModularBase<Element>::_modulus - x;
- return x;
- }
-
- Element &init (Element &x, const long unsigned int &y ) const
- {
- x = Element(y % (ModularBase<Element>::_modulus));
- return x;
- }
-
- Element &init (Element &x, const double &y) const
- {
- double z = fmod(y, (double)_modulus);
- if (z < 0) z += (double) _modulus;
- return x = (Element) (z);
- }
-
- template< class XXX>
- Element& init(Element & x, const XXX & y) const
- {
- return init(x,double(y));
- }
-
- Element &init (Element &x) const
- {
- return x = zero ;
- }
-
-
- Element &add (Element &x, const Element &y, const Element &z) const
- {
- x = y + z;
- if ((uint32_t) x >= (uint32_t) ModularBase<Element>::_modulus) x -= ModularBase<Element>::_modulus;
- return x;
- }
-
- Element &sub (Element &x, const Element &y, const Element &z) const
- {
- x = y - z;
- if ((int32_t) x < 0) x += ModularBase<Element>::_modulus;
- return x;
- }
-
- Element &mul (Element &x, const Element &y, const Element &z) const
- {
- return x = Element( ((uint64_t) y * (uint64_t) z) % (uint64_t) ModularBase<Element>::_modulus);
- }
-
- Element &div (Element &x, const Element &y, const Element &z) const
- {
- Element temp;
- inv (temp, z);
- return mul (x, y, temp);
- }
-
- Element &neg (Element &x, const Element &y) const
- {
- if (y == 0)
- return x = y;
- else
- return x = ModularBase<Element>::_modulus - y;
- }
-
- Element &inv (Element &x, const Element &y) const
- {
- // The extended Euclidean algoritm
- int64_t x_int, y_int, q, tx, ty, temp;
- x_int = ModularBase<Element>::_modulus;
- y_int = y;
- tx = 0;
- ty = 1;
-
- while (y_int != 0) {
- // always: gcd (modulus,residue) = gcd (x_int,y_int)
- // sx*modulus + tx*residue = x_int
- // sy*modulus + ty*residue = y_int
- q = x_int / y_int; // integer quotient
- temp = y_int; y_int = x_int - q * y_int;
- x_int = temp;
- temp = ty; ty = tx - q * ty;
- tx = temp;
- }
-
- if (tx < 0) tx += ModularBase<Element>::_modulus;
-
- // now x_int = gcd (modulus,residue)
- return x = Element(tx);
- }
-
- Element &axpy (Element &r,
- const Element &a,
- const Element &x,
- const Element &y) const
- {
- r = Element( ((uint64_t) a * (uint64_t) x + (uint64_t) y) % (uint64_t) ModularBase<Element>::_modulus );
- if ((int32_t) r < 0) r += ModularBase<Element>::_modulus;
- return r;
- }
-
- Element &addin (Element &x, const Element &y) const
- {
- x += y;
- if ((uint32_t) x >= (uint32_t) ModularBase<Element>::_modulus) x -= ModularBase<Element>::_modulus;
- return x;
- }
-
- Element &subin (Element &x, const Element &y) const
- {
- x -= y;
- if ((int32_t) x < 0) x += ModularBase<Element>::_modulus;
- return x;
- }
-
- Element &mulin (Element &x, const Element &y) const
- {
- x = Element( ((uint64_t) x * (uint64_t) y) % (uint64_t) ModularBase<Element>::_modulus );
- return x;
- }
-
- Element &divin (Element &x, const Element &y) const
- {
- Element temp;
- inv (temp, y);
- return mulin (x, temp);
- }
-
- Element &negin (Element &x) const
- {
- if (x == 0)
- return x;
- else
- return x = ModularBase<Element>::_modulus - x;
- }
-
- Element &invin (Element &x) const
- {
- return inv (x, x);
- }
-
- Element &axpyin (Element &r, const Element &a, const Element &x) const
- {
- r = Element( ((uint64_t) r + (uint64_t) a * (uint64_t) x) % (uint64_t) ModularBase<Element>::_modulus );
- if ((int32_t) r < 0) r += ModularBase<Element>::_modulus;
- return r;
- }
-
- private:
-
- void init_two_64 ()
- {
- uint64_t two_64 = 2;
-
- for (int i = 0; i < 6; ++i)
- two_64 = (two_64 * two_64) % ModularBase<Element>::_modulus;
-
- _two_64 = (Element) two_64;
- }
-
- friend class FieldAXPY<Modular<uint32_t> >;
- friend class DotProductDomain<Modular<uint32_t> >;
- friend class MVProductDomain<Modular<uint32_t> >;
-
- Element _two_64;
-
- }; // class Modular<uint32_t>
-
- /*! Specialization of FieldAXPY for unsigned short modular field */
-
- template <>
- class FieldAXPY<Modular<uint32_t> > {
- public:
-
- typedef uint32_t Element;
- typedef Modular<uint32_t> Field;
-
- FieldAXPY (const Field &F) :
- _field (F), _y(0)
- { }
-
- FieldAXPY (const FieldAXPY &faxpy) :
- _field (faxpy._field), _y (0)
- {}
-
- FieldAXPY<Modular<uint32_t> > &operator = (const FieldAXPY &faxpy)
- {
- _field = faxpy._field;
- _y = faxpy._y;
- return *this;
- }
-
- inline uint64_t& mulacc (const Element &a, const Element &x)
- {
- uint64_t t = (uint64_t) a * (uint64_t) x;
- _y += t;
-
- if (_y < t)
- return _y += _field._two_64;
- else
- return _y;
- }
-
- inline uint64_t& accumulate (const Element &t)
- {
- _y += t;
-
- if (_y < t)
- return _y += _field._two_64;
- else
- return _y;
- }
-
- inline uint64_t& accumulate_special (const Element &t)
- {
- return _y += t;
- }
-
- inline Element &get (Element &y) {
- _y %= (uint64_t) _field._modulus;
- //if ((int64_t) _y < 0) _y += _field._modulus;
- return y = (uint32_t) _y;
- }
-
- inline FieldAXPY &assign (const Element y)
- {
- _y = y;
- return *this;
- }
-
- inline void reset() {
- _y = 0;
- }
-
- private:
-
- Field _field;
- uint64_t _y;
- };
-
- //! Specialization of DotProductDomain for uint32_t modular field
-
- template <>
- class DotProductDomain<Modular<uint32_t> > : private virtual VectorDomainBase<Modular<uint32_t> > {
- public:
-
- typedef uint32_t Element;
-
- DotProductDomain (const Modular<uint32_t> &F) :
- VectorDomainBase<Modular<uint32_t> > (F)
- {}
-
- protected:
- template <class Vector1, class Vector2>
- inline Element &dotSpecializedDD (Element &res, const Vector1 &v1, const Vector2 &v2) const;
-
- template <class Vector1, class Vector2>
- inline Element &dotSpecializedDSP (Element &res, const Vector1 &v1, const Vector2 &v2) const;
- };
-
- //! Specialization of MVProductDomain for uint32_t modular field
-
- template <>
- class MVProductDomain<Modular<uint32_t> > {
- public:
-
- typedef uint32_t Element;
-
- protected:
- template <class Vector1, class Matrix, class Vector2>
- inline Vector1 &mulColDense
- (const VectorDomain<Modular<uint32_t> > &VD, Vector1 &w, const Matrix &A, const Vector2 &v) const
- {
- return mulColDenseSpecialized (VD, w, A, v, typename VectorTraits<typename Matrix::Column>::VectorCategory ());
- }
-
- private:
- template <class Vector1, class Matrix, class Vector2>
- Vector1 &mulColDenseSpecialized
- (const VectorDomain<Modular<uint32_t> > &VD, Vector1 &w, const Matrix &A, const Vector2 &v,
- VectorCategories::DenseVectorTag) const;
- template <class Vector1, class Matrix, class Vector2>
- Vector1 &mulColDenseSpecialized
- (const VectorDomain<Modular<uint32_t> > &VD, Vector1 &w, const Matrix &A, const Vector2 &v,
- VectorCategories::SparseSequenceVectorTag) const;
- template <class Vector1, class Matrix, class Vector2>
- Vector1 &mulColDenseSpecialized
- (const VectorDomain<Modular<uint32_t> > &VD, Vector1 &w, const Matrix &A, const Vector2 &v,
- VectorCategories::SparseAssociativeVectorTag) const;
- template <class Vector1, class Matrix, class Vector2>
- Vector1 &mulColDenseSpecialized
- (const VectorDomain<Modular<uint32_t> > &VD, Vector1 &w, const Matrix &A, const Vector2 &v,
- VectorCategories::SparseParallelVectorTag) const;
-
- mutable std::vector<uint64_t> _tmp;
- };
-
-}
-
-#include "linbox/field/Modular/modular.inl"
-#endif // __LINBOX_field_modular_unsigned_H
-
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
-// Local Variables:
-// mode: C++
-// tab-width: 8
-// indent-tabs-mode: nil
-// c-basic-offset: 8
-// End:
-
diff --git a/linbox/field/Modular/modular.inl b/linbox/field/Modular/modular.inl
deleted file mode 100644
index 8223eeb..0000000
--- a/linbox/field/Modular/modular.inl
+++ /dev/null
@@ -1,771 +0,0 @@
-/* linbox/field/modular.inl
- * Copyright (C) 2002 Bradford Hovinen
- * Copyright (C) 2002 Ahmet Duran
- * Copyright (C) 2002 B. David Saunders
- *
- * Written by Bradford Hovinen <hovinen at cis.udel.edu>,
- * Ahmet Duran <duran at cis.udel.edu>,
- * Dave Saunders <saunders at cis.udel.edu>
- *
- * ------------------------------------
- *
- *
- * ========LICENCE========
- * This file is part of the library LinBox.
- *
- * LinBox is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- * ========LICENCE========
- *.
- */
-
-#ifndef __LINBOX_field_modular_INL
-#define __LINBOX_field_modular_INL
-
-//Dan Roche 7-2-04
-#ifndef __LINBOX_MIN
-#define __LINBOX_MIN(a,b) ( (a) < (b) ? (a) : (b) )
-#endif
-
-#include <iostream>
-
-namespace LinBox {
-
- template <class Vector1, class Vector2>
- inline uint8_t &DotProductDomain<Modular<uint8_t> >::dotSpecializedDD
- (uint8_t &res, const Vector1 &v1, const Vector2 &v2) const
- {
- typename Vector1::const_iterator i = v1.begin ();
- typename Vector2::const_iterator j = v2.begin ();
-
- typename Vector1::const_iterator iterend = v1.begin () + v1.size() % _field._k;
-
- uint64_t y = 0;
-
- for (; i != iterend; ++i, ++j)
- y += (uint64_t) *i * (uint64_t) *j;
-
- y %= (uint64_t) _field._modulus;
-
- for (; iterend != v1.end (); j += _field._k) {
- typename Vector1::const_iterator iter_i = iterend;
- typename Vector2::const_iterator iter_j;
-
- iterend += _field._k;
-
- for (iter_j = j; iter_i != iterend; ++iter_i, ++iter_j)
- y += (uint64_t) *iter_i * (uint64_t) *j;
-
- y %= (uint64_t) _field._modulus;
- }
-
- return res = (uint8_t) y;
- }
-
- template <class Vector1, class Vector2>
- inline uint8_t &DotProductDomain<Modular<uint8_t> >::dotSpecializedDSP
- (uint8_t &res, const Vector1 &v1, const Vector2 &v2) const
- {
- typename Vector1::first_type::const_iterator i_idx = v1.first.begin ();
- typename Vector1::second_type::const_iterator i_elt = v1.second.begin ();
-
- uint64_t y = 0;
-
- if (v1.first.size () < _field._k) {
- for (; i_idx != v1.first.end (); ++i_idx, ++i_elt)
- y += (uint64_t) *i_elt * (uint64_t) v2[*i_idx];
-
- return res = uint8_t (y % (uint64_t) _field._modulus);
- }
- else {
- typename Vector1::first_type::const_iterator iterend = v1.first.begin () + v1.first.size() % _field._k;
-
- for (; i_idx != iterend; ++i_idx, ++i_elt)
- y += (uint64_t) *i_elt * (uint64_t) v2[*i_idx];
-
- y %= (uint64_t) _field._modulus;
-
- while (iterend != v1.first.end ()) {
- typename Vector1::first_type::const_iterator iter_i_idx = iterend;
- typename Vector1::second_type::const_iterator iter_i_elt = i_elt;
-
- iterend += _field._k;
- i_elt += _field._k;
-
- for (; iter_i_idx != iterend; ++iter_i_idx, ++iter_i_elt)
- y += (uint64_t) *iter_i_elt * (uint64_t) v2[*iter_i_idx];
-
- y %= (uint64_t) _field._modulus;
- }
-
- return res = (uint8_t) y;
- }
- }
-
- template <class Vector1, class Vector2>
- inline uint16_t &DotProductDomain<Modular<uint16_t> >::dotSpecializedDD
- (uint16_t &res, const Vector1 &v1, const Vector2 &v2) const
- {
- typename Vector1::const_iterator i = v1.begin ();
- typename Vector2::const_iterator j = v2.begin ();
-
- typename Vector1::const_iterator iterend = v1.begin () + v1.size() % _field._k;
-
- uint64_t y = 0;
-
- for (; i != iterend; ++i, ++j)
- y += (uint64_t) *i * (uint64_t) *j;
-
- y %= (uint64_t) _field._modulus;
-
- for (; iterend != v1.end (); j += _field._k) {
- typename Vector1::const_iterator iter_i = iterend;
- typename Vector2::const_iterator iter_j;
-
- iterend += _field._k;
-
- for (iter_j = j; iter_i != iterend; ++iter_i, ++iter_j)
- y += (uint64_t) *iter_i * (uint64_t) *j;
-
- y %= (uint64_t) _field._modulus;
- }
-
- return res = (uint16_t) y;
- }
-
- template <class Vector1, class Vector2>
- inline uint16_t &DotProductDomain<Modular<uint16_t> >::dotSpecializedDSP
- (uint16_t &res, const Vector1 &v1, const Vector2 &v2) const
- {
- typename Vector1::first_type::const_iterator i_idx = v1.first.begin ();
- typename Vector1::second_type::const_iterator i_elt = v1.second.begin ();
-
- uint64_t y = 0;
-
- if (v1.first.size () < _field._k) {
- for (; i_idx != v1.first.end (); ++i_idx, ++i_elt)
- y += (uint64_t) *i_elt * (uint64_t) v2[*i_idx];
-
- return res = (uint16_t) (y % (uint64_t) _field._modulus);
- }
- else {
- typename Vector1::first_type::const_iterator iterend = v1.first.begin () + v1.first.size() % _field._k;
-
- for (; i_idx != iterend; ++i_idx, ++i_elt)
- y += (uint64_t) *i_elt * (uint64_t) v2[*i_idx];
-
- y %= (uint64_t) _field._modulus;
-
- while (iterend != v1.first.end ()) {
- typename Vector1::first_type::const_iterator iter_i_idx = iterend;
- typename Vector1::second_type::const_iterator iter_i_elt = i_elt;
-
- iterend += _field._k;
- i_elt += _field._k;
-
- for (; iter_i_idx != iterend; ++iter_i_idx, ++iter_i_elt)
- y += (uint64_t) *iter_i_elt * (uint64_t) v2[*iter_i_idx];
-
- y %= (uint64_t) _field._modulus;
- }
-
- return res = (Element) y;
- }
- }
-
- template <class Vector1, class Vector2>
- inline uint32_t &DotProductDomain<Modular<uint32_t> >::dotSpecializedDD
- (uint32_t &res, const Vector1 &v1, const Vector2 &v2) const
- {
- typename Vector1::const_iterator i;
- typename Vector2::const_iterator j;
-
- uint64_t y = 0;
- uint64_t t;
-
- for (i = v1.begin (), j = v2.begin (); i < v1.end (); ++i, ++j) {
- t = (uint64_t) *i * (uint64_t) *j;
- y += t;
-
- if (y < t)
- y += _field._two_64;
- }
-
- y %= (uint64_t) _field._modulus;
-
- return res = (uint32_t) y;
- }
-
- template <class Vector1, class Vector2>
- inline uint32_t &DotProductDomain<Modular<uint32_t> >::dotSpecializedDSP
- (uint32_t &res, const Vector1 &v1, const Vector2 &v2) const
- {
- typename Vector1::first_type::const_iterator i_idx;
- typename Vector1::second_type::const_iterator i_elt;
-
- uint64_t y = 0;
- uint64_t t;
-
- for (i_idx = v1.first.begin (), i_elt = v1.second.begin (); i_idx != v1.first.end (); ++i_idx, ++i_elt) {
- t = (uint64_t) *i_elt * (uint64_t) v2[*i_idx];
- y += t;
-
- if (y < t)
- y += _field._two_64;
- }
-
- y %= (uint64_t) _field._modulus;
-
- return res = (uint32_t)y;
- }
-
- template <class Vector1, class Matrix, class Vector2>
- Vector1 &MVProductDomain<Modular<uint8_t> >::mulColDenseSpecialized
- (const VectorDomain<Modular<uint8_t> > &VD, Vector1 &w, const Matrix &A, const Vector2 &v,
- VectorCategories::DenseVectorTag) const
- {
- linbox_check (A.coldim () == v.size ());
- linbox_check (A.rowdim () == w.size ());
-
- typename Matrix::ConstColIterator i = A.colBegin ();
- typename Vector2::const_iterator j, j_end;
- typename Matrix::Column::const_iterator k;
- std::vector<uint32_t>::iterator l, l_end;
-
- if (_tmp.size () < w.size ())
- _tmp.resize (w.size ());
-
- std::fill (_tmp.begin (), _tmp.begin () + w.size (), 0);
-
- l_end = _tmp.begin () + w.size ();
-
- do {
- j = v.begin ();
- j_end = j + __LINBOX_MIN (A->coldim (), VD.field ()._k);
-
- for (; j != j_end; ++j, ++i)
- for (k = i->begin (), l = _tmp.begin (); k != i->end (); ++k, ++l)
- *l += *k * *j;
-
- j_end += __LINBOX_MIN (A->coldim () - (j_end - v.begin ()), VD.field ()._k);
-
- for (l =_tmp.begin (); l != l_end; ++l)
- *l %= VD.field ()._modulus;
-
- } while (j_end != v.end ());
-
- typename Vector1::iterator w_j;
-
- for (w_j = w.begin (), l = _tmp.begin (); w_j != w.end (); ++w_j, ++l)
- *w_j = *l;
-
- return w;
- }
-
- template <class Vector1, class Matrix, class Vector2>
- Vector1 &MVProductDomain<Modular<uint8_t> >::mulColDenseSpecialized
- (const VectorDomain<Modular<uint8_t> > &VD, Vector1 &w, const Matrix &A, const Vector2 &v,
- VectorCategories::SparseSequenceVectorTag) const
- {
- linbox_check (A.coldim () == v.size ());
- linbox_check (A.rowdim () == w.size ());
-
- typename Matrix::ConstColIterator i = A.colBegin ();
- typename Vector2::const_iterator j, j_end;
- typename Matrix::Column::const_iterator k;
- std::vector<uint32_t>::iterator l, l_end;
-
- if (_tmp.size () < w.size ())
- _tmp.resize (w.size ());
-
- std::fill (_tmp.begin (), _tmp.begin () + w.size (), 0);
-
- l_end = _tmp.begin () + w.size ();
-
-
- do {
- j = v.begin ();
- j_end = j + __LINBOX_MIN (A->coldim (), VD.field ()._k);
-
- for (; j != j_end; ++j, ++i)
- for (k = i->begin (), l = _tmp.begin (); k != i->end (); ++k, ++l)
- _tmp[k->first] += k->second * *j;
-
- j_end += __LINBOX_MIN (A->coldim () - (j_end - v.begin ()), VD.field ()._k);
-
- for (l =_tmp.begin (); l != l_end; ++l)
- *l %= VD.field ()._modulus;
-
- } while (j_end != v.end ());
-
- typename Vector1::iterator w_j;
-
- for (w_j = w.begin (), l = _tmp.begin (); w_j != w.end (); ++w_j, ++l)
- *w_j = *l;
-
- return w;
- }
-
- template <class Vector1, class Matrix, class Vector2>
- Vector1 &MVProductDomain<Modular<uint8_t> >::mulColDenseSpecialized
- (const VectorDomain<Modular<uint8_t> > &VD, Vector1 &w, const Matrix &A, const Vector2 &v,
- VectorCategories::SparseAssociativeVectorTag) const
- {
- linbox_check (A.coldim () == v.size ());
- linbox_check (A.rowdim () == w.size ());
-
- typename Matrix::ConstColIterator i = A.colBegin ();
- typename Vector2::const_iterator j, j_end;
- typename Matrix::Column::const_iterator k;
- std::vector<uint32_t>::iterator l, l_end;
-
- if (_tmp.size () < w.size ())
- _tmp.resize (w.size ());
-
- std::fill (_tmp.begin (), _tmp.begin () + w.size (), 0);
-
- l_end = _tmp.begin () + w.size ();
-
- do {
- j = v.begin ();
- j_end = j + __LINBOX_MIN (A->coldim (), VD.field ()._k);
-
- for (; j != j_end; ++j, ++i)
- for (k = i->begin (), l = _tmp.begin (); k != i->end (); ++k, ++l)
- _tmp[k->first] += k->second * *j;
-
- j_end += __LINBOX_MIN (A->coldim () - (j_end - v.begin ()), VD.field ()._k);
-
- for (l =_tmp.begin (); l != l_end; ++l)
- *l %= VD.field ()._modulus;
-
- } while (j_end != v.end ());
-
- typename Vector1::iterator w_j;
-
- for (w_j = w.begin (), l = _tmp.begin (); w_j != w.end (); ++w_j, ++l)
- *w_j = *l;
-
- return w;
- }
-
- template <class Vector1, class Matrix, class Vector2>
- Vector1 &MVProductDomain<Modular<uint8_t> >::mulColDenseSpecialized
- (const VectorDomain<Modular<uint8_t> > &VD, Vector1 &w, const Matrix &A, const Vector2 &v,
- VectorCategories::SparseParallelVectorTag) const
- {
- linbox_check (A.coldim () == v.size ());
- linbox_check (A.rowdim () == w.size ());
-
- typename Matrix::ConstColIterator i = A.colBegin ();
- typename Vector2::const_iterator j, j_end;
- typename Matrix::Column::first_type::const_iterator k_idx;
- typename Matrix::Column::second_type::const_iterator k_elt;
- std::vector<uint32_t>::iterator l, l_end;
-
- if (_tmp.size () < w.size ())
- _tmp.resize (w.size ());
-
- std::fill (_tmp.begin (), _tmp.begin () + w.size (), 0);
-
- l_end = _tmp.begin () + w.size ();
-
- do {
- j = v.begin ();
- j_end = j + __LINBOX_MIN (uint64_t (A.coldim ()), VD.field ()._k);
-
- for (; j != j_end; ++j, ++i)
- for (k_idx = i->first.begin (), k_elt = i->second.begin (), l = _tmp.begin ();
- k_idx != i->first.end ();
- ++k_idx, ++k_elt, ++l)
- _tmp[*k_idx] += *k_elt * *j;
-
- j_end += __LINBOX_MIN (uint64_t (A.coldim () - (j_end - v.begin ())), VD.field ()._k);
-
- for (l =_tmp.begin (); l != l_end; ++l)
- *l %= VD.field ()._modulus;
-
- } while (j_end != v.end ());
-
- typename Vector1::iterator w_j;
- typedef typename Vector1::value_type val_t ;
-
- for (w_j = w.begin (), l = _tmp.begin (); w_j != w.end (); ++w_j, ++l)
- *w_j = (val_t) *l;
-
- return w;
- }
-
- template <class Vector1, class Matrix, class Vector2>
- Vector1 &MVProductDomain<Modular<uint16_t> >::mulColDenseSpecialized
- (const VectorDomain<Modular<uint16_t> > &VD, Vector1 &w, const Matrix &A, const Vector2 &v,
- VectorCategories::DenseVectorTag) const
- {
- linbox_check (A.coldim () == v.size ());
- linbox_check (A.rowdim () == w.size ());
-
- typename Matrix::ConstColIterator i = A.colBegin ();
- typename Vector2::const_iterator j = v.begin (), j_end;
- typename Matrix::Column::const_iterator k;
- // Dan Roche, 7-1-04
- // std::vector<uint32_t>::iterator l, l_end;
- std::vector<uint64_t>::iterator l, l_end;
-
- if (_tmp.size () < w.size ())
- _tmp.resize (w.size ());
-
- std::fill (_tmp.begin (), _tmp.begin () + w.size (), 0);
-
- l_end = _tmp.begin () + w.size ();
-
- do {
- j = v.begin ();
- j_end = j + __LINBOX_MIN (A->coldim (), VD.field ()._k);
-
- for (; j != j_end; ++j, ++i)
- for (k = i->begin (), l = _tmp.begin (); k != i->end (); ++k, ++l)
- *l += *k * *j;
-
- j_end += __LINBOX_MIN (A->coldim () - (j_end - v.begin ()), VD.field ()._k);
-
- for (l =_tmp.begin (); l != l_end; ++l)
- *l %= VD.field ()._modulus;
-
- } while (j_end != v.end ());
-
- typename Vector1::iterator w_j;
-
- for (w_j = w.begin (), l = _tmp.begin (); w_j != w.end (); ++w_j, ++l)
- *w_j = *l;
-
- return w;
- }
-
- template <class Vector1, class Matrix, class Vector2>
- Vector1 &MVProductDomain<Modular<uint16_t> >::mulColDenseSpecialized
- (const VectorDomain<Modular<uint16_t> > &VD, Vector1 &w, const Matrix &A, const Vector2 &v,
- VectorCategories::SparseSequenceVectorTag) const
- {
- linbox_check (A.coldim () == v.size ());
- linbox_check (A.rowdim () == w.size ());
-
- typename Matrix::ConstColIterator i = A.colBegin ();
- typename Vector2::const_iterator j, j_end;
- typename Matrix::Column::const_iterator k;
- // Dan Roche, 7-1-04
- // std::vector<uint32_t>::iterator l, l_end;
- std::vector<uint64_t>::iterator l, l_end;
-
- if (_tmp.size () < w.size ())
- _tmp.resize (w.size ());
-
- std::fill (_tmp.begin (), _tmp.begin () + w.size (), 0);
-
- l_end = _tmp.begin () + w.size ();
-
- do {
- j = v.begin ();
- j_end = j + __LINBOX_MIN (A->coldim (), VD.field ()._k);
-
- for (; j != j_end; ++j, ++i)
- for (k = i->begin (), l = _tmp.begin (); k != i->end (); ++k, ++l)
- _tmp[k->first] += k->second * *j;
-
- j_end += __LINBOX_MIN (A->coldim () - (j_end - v.begin ()), VD.field ()._k);
-
- for (l =_tmp.begin (); l != l_end; ++l)
- *l %= VD.field ()._modulus;
-
- } while (j_end != v.end ());
-
- typename Vector1::iterator w_j;
-
- for (w_j = w.begin (), l = _tmp.begin (); w_j != w.end (); ++w_j, ++l)
- *w_j = *l;
-
- return w;
- }
-
- template <class Vector1, class Matrix, class Vector2>
- Vector1 &MVProductDomain<Modular<uint16_t> >::mulColDenseSpecialized
- (const VectorDomain<Modular<uint16_t> > &VD, Vector1 &w, const Matrix &A, const Vector2 &v,
- VectorCategories::SparseAssociativeVectorTag) const
- {
- linbox_check (A.coldim () == v.size ());
- linbox_check (A.rowdim () == w.size ());
-
- typename Matrix::ConstColIterator i = A.colBegin ();
- typename Vector2::const_iterator j, j_end;
- typename Matrix::Column::const_iterator k;
- // Dan Roche, 7-1-04
- // std::vector<uint32_t>::iterator l, l_end;
- std::vector<uint64_t>::iterator l, l_end;
-
- if (_tmp.size () < w.size ())
- _tmp.resize (w.size ());
-
- std::fill (_tmp.begin (), _tmp.begin () + w.size (), 0);
-
- l_end = _tmp.begin () + w.size ();
-
- do {
- j = v.begin ();
- j_end = j + __LINBOX_MIN (A->coldim (), VD.field ()._k);
-
- for (; j != j_end; ++j, ++i)
- for (k = i->begin (), l = _tmp.begin (); k != i->end (); ++k, ++l)
- _tmp[k->first] += k->second * *j;
-
- j_end += __LINBOX_MIN (A->coldim () - (j_end - v.begin ()), VD.field ()._k);
-
- for (l =_tmp.begin (); l != l_end; ++l)
- *l %= VD.field ()._modulus;
-
- } while (j_end != v.end ());
-
- typename Vector1::iterator w_j;
-
- for (w_j = w.begin (), l = _tmp.begin (); w_j != w.end (); ++w_j, ++l)
- *w_j = *l;
-
- return w;
- }
-
- template <class Vector1, class Matrix, class Vector2>
- Vector1 &MVProductDomain<Modular<uint16_t> >::mulColDenseSpecialized
- (const VectorDomain<Modular<uint16_t> > &VD, Vector1 &w, const Matrix &A, const Vector2 &v,
- VectorCategories::SparseParallelVectorTag) const
- {
- linbox_check (A.coldim () == v.size ());
- linbox_check (A.rowdim () == w.size ());
-
- typename Matrix::ConstColIterator i = A.colBegin ();
- typename Vector2::const_iterator j, j_end;
- typename Matrix::Column::first_type::const_iterator k_idx;
- typename Matrix::Column::second_type::const_iterator k_elt;
- // Dan Roche, 7-1-04
- // std::vector<uint32_t>::iterator l, l_end;
- std::vector<uint64_t>::iterator l, l_end;
-
- if (_tmp.size () < w.size ())
- _tmp.resize (w.size ());
-
- std::fill (_tmp.begin (), _tmp.begin () + w.size (), 0);
-
- l_end = _tmp.begin () + w.size ();
-
- do {
- j = v.begin ();
- //Dan Roche, 7-2-04
- //j_end = j + __LINBOX_MIN (A->coldim (), VD.field ()._k);
- j_end = j + __LINBOX_MIN (A.coldim (), VD.field ()._k);
-
- for (; j != j_end; ++j, ++i)
- for (k_idx = i->first.begin (), k_elt = i->second.begin (), l = _tmp.begin ();
- k_idx != i->first.end ();
- ++k_idx, ++k_elt, ++l)
- _tmp[*k_idx] += *k_elt * *j;
-
- //j_end += __LINBOX_MIN (A->coldim () - (j_end - v.begin ()), VD.field ()._k);
- j_end += __LINBOX_MIN (A.coldim () - (j_end - v.begin ()), VD.field ()._k);
-
- for (l =_tmp.begin (); l != l_end; ++l)
- *l %= VD.field ()._modulus;
-
- } while (j_end != v.end ());
-
- typename Vector1::iterator w_j;
-
- for (w_j = w.begin (), l = _tmp.begin (); w_j != w.end (); ++w_j, ++l)
- *w_j = *l;
-
- return w;
- }
-
- template <class Vector1, class Matrix, class Vector2>
- Vector1 &MVProductDomain<Modular<uint32_t> >::mulColDenseSpecialized
- (const VectorDomain<Modular<uint32_t> > &VD, Vector1 &w, const Matrix &A, const Vector2 &v,
- VectorCategories::DenseVectorTag) const
- {
- linbox_check (A.coldim () == v.size ());
- linbox_check (A.rowdim () == w.size ());
-
- typename Matrix::ConstColIterator i = A.colBegin ();
- typename Vector2::const_iterator j;
- typename Matrix::Column::const_iterator k;
- std::vector<uint64_t>::iterator l;
-
- uint64_t t;
-
- if (_tmp.size () < w.size ())
- _tmp.resize (w.size ());
-
- std::fill (_tmp.begin (), _tmp.begin () + w.size (), 0);
-
- for (j = v.begin (); j != v.end (); ++j, ++i) {
- for (k = i->begin (), l = _tmp.begin (); k != i->end (); ++k, ++l) {
- t = ((uint64_t) *k) * ((uint64_t) *j);
-
- *l += t;
-
- if (*l < t)
- *l += VD.field ()._two_64;
- }
- }
-
- typename Vector1::iterator w_j;
- typedef typename Vector1::value_type element;
-
- for (w_j = w.begin (), l = _tmp.begin (); w_j != w.end (); ++w_j, ++l)
- *w_j = (element)(*l % VD.field ()._modulus);
-
- return w;
- }
-
- template <class Vector1, class Matrix, class Vector2>
- Vector1 &MVProductDomain<Modular<uint32_t> >::mulColDenseSpecialized
- (const VectorDomain<Modular<uint32_t> > &VD, Vector1 &w, const Matrix &A, const Vector2 &v,
- VectorCategories::SparseSequenceVectorTag) const
- {
- linbox_check (A.coldim () == v.size ());
- linbox_check (A.rowdim () == w.size ());
-
- typename Matrix::ConstColIterator i = A.colBegin ();
- typename Vector2::const_iterator j;
- typename Matrix::Column::const_iterator k;
- std::vector<uint64_t>::iterator l;
-
- uint64_t t;
-
- if (_tmp.size () < w.size ())
- _tmp.resize (w.size ());
-
- std::fill (_tmp.begin (), _tmp.begin () + w.size (), 0);
-
- for (j = v.begin (); j != v.end (); ++j, ++i) {
- for (k = i->begin (), l = _tmp.begin (); k != i->end (); ++k, ++l) {
- t = ((uint64_t) k->second) * ((uint64_t) *j);
-
- _tmp[k->first] += t;
-
- if (_tmp[k->first] < t)
- _tmp[k->first] += VD.field ()._two_64;
- }
- }
-
- typename Vector1::iterator w_j;
- typedef typename Vector1::value_type val_t;
-
- for (w_j = w.begin (), l = _tmp.begin (); w_j != w.end (); ++w_j, ++l)
- *w_j = val_t(*l % VD.field ()._modulus);
-
- return w;
- }
-
- template <class Vector1, class Matrix, class Vector2>
- Vector1 &MVProductDomain<Modular<uint32_t> >::mulColDenseSpecialized
- (const VectorDomain<Modular<uint32_t> > &VD, Vector1 &w, const Matrix &A, const Vector2 &v,
- VectorCategories::SparseAssociativeVectorTag) const
- {
- linbox_check (A.coldim () == v.size ());
- linbox_check (A.rowdim () == w.size ());
-
- typename Matrix::ConstColIterator i = A.colBegin ();
- typename Vector2::const_iterator j;
- typename Matrix::Column::const_iterator k;
- std::vector<uint64_t>::iterator l;
-
- uint64_t t;
-
- if (_tmp.size () < w.size ())
- _tmp.resize (w.size ());
-
- std::fill (_tmp.begin (), _tmp.begin () + w.size (), 0);
-
- for (j = v.begin (); j != v.end (); ++j, ++i) {
- for (k = i->begin (), l = _tmp.begin (); k != i->end (); ++k, ++l) {
- t = ((uint64_t) k->second) * ((uint64_t) *j);
-
- _tmp[k->first] += t;
-
- if (_tmp[k->first] < t)
- _tmp[k->first] += VD.field ()._two_64;
- }
- }
-
- typename Vector1::iterator w_j;
-
- for (w_j = w.begin (), l = _tmp.begin (); w_j != w.end (); ++w_j, ++l)
- *w_j = *l % VD.field ()._modulus;
-
- return w;
- }
-
- template <class Vector1, class Matrix, class Vector2>
- Vector1 &MVProductDomain<Modular<uint32_t> >::mulColDenseSpecialized
- (const VectorDomain<Modular<uint32_t> > &VD, Vector1 &w, const Matrix &A, const Vector2 &v,
- VectorCategories::SparseParallelVectorTag) const
- {
- linbox_check (A.coldim () == v.size ());
- linbox_check (A.rowdim () == w.size ());
-
- typename Matrix::ConstColIterator i = A.colBegin ();
- typename Vector2::const_iterator j;
- typename Matrix::Column::first_type::const_iterator k_idx;
- typename Matrix::Column::second_type::const_iterator k_elt;
- std::vector<uint64_t>::iterator l;
-
- uint64_t t;
-
- if (_tmp.size () < w.size ())
- _tmp.resize (w.size ());
-
- std::fill (_tmp.begin (), _tmp.begin () + w.size (), 0);
-
- for (j = v.begin (); j != v.end (); ++j, ++i) {
- for (k_idx = i->first.begin (), k_elt = i->second.begin (), l = _tmp.begin ();
- k_idx != i->first.end ();
- ++k_idx, ++k_elt, ++l)
- {
- t = ((uint64_t) *k_elt) * ((uint64_t) *j);
-
- _tmp[*k_idx] += t;
-
- if (_tmp[*k_idx] < t)
- _tmp[*k_idx] += VD.field ()._two_64;
- }
- }
-
- typename Vector1::iterator w_j;
- typedef typename Vector1::value_type val_t;
-
- for (w_j = w.begin (), l = _tmp.begin (); w_j != w.end (); ++w_j, ++l)
- *w_j = val_t(*l % VD.field ()._modulus);
-
- return w;
- }
-
-}
-
-#endif // __LINBOX_field_modular_INL
-
-
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
-// Local Variables:
-// mode: C++
-// tab-width: 8
-// indent-tabs-mode: nil
-// c-basic-offset: 8
-// End:
-
diff --git a/linbox/field/NTL/Makefile.am b/linbox/field/NTL/Makefile.am
deleted file mode 100644
index f42b93d..0000000
--- a/linbox/field/NTL/Makefile.am
+++ /dev/null
@@ -1,46 +0,0 @@
-# Copyright (c) 2010 the LinBox group
-# ========LICENCE========
-# This file is part of the library LinBox.
-#
-# LinBox is free software: you can redistribute it and/or modify
-# it under the terms of the GNU Lesser General Public
-# License as published by the Free Software Foundation; either
-# version 2.1 of the License, or (at your option) any later version.
-#
-# This library 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
-# Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public
-# License along with this library; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
-# ========LICENCE========
-
-
-
-pkgincludesubdir=$(pkgincludedir)/field/NTL
-
-
-NTL_HDRS = \
- ntl-RR.h \
- ntl-ZZ_p.h \
- ntl-ZZ_pE.h \
- ntl-ZZ_pX.h \
- ntl-lzz_p.h \
- ntl-ZZ.h \
- ntl-lzz_pE.h \
- ntl-lzz_pX.h \
- ntl-GF2E.h
-
-
-if LINBOX_HAVE_NTL
-USE_NTL_HDRS = $(NTL_HDRS)
-endif
-
-
-pkgincludesub_HEADERS = \
- $(USE_NTL_HDRS)
-
-# EXTRA_DIST = \
- # ntl.doxy
diff --git a/linbox/field/NTL/Makefile.in b/linbox/field/NTL/Makefile.in
deleted file mode 100644
index 520e9ee..0000000
--- a/linbox/field/NTL/Makefile.in
+++ /dev/null
@@ -1,592 +0,0 @@
-# Makefile.in generated by automake 1.11.5 from Makefile.am.
-# @configure_input@
-
-# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software
-# Foundation, Inc.
-# This Makefile.in is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
-# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
-# PARTICULAR PURPOSE.
-
- at SET_MAKE@
-
-# Copyright (c) 2010 the LinBox group
-# ========LICENCE========
-# This file is part of the library LinBox.
-#
-# LinBox is free software: you can redistribute it and/or modify
-# it under the terms of the GNU Lesser General Public
-# License as published by the Free Software Foundation; either
-# version 2.1 of the License, or (at your option) any later version.
-#
-# This library 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
-# Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public
-# License along with this library; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
-# ========LICENCE========
-
-VPATH = @srcdir@
-am__make_dryrun = \
- { \
- am__dry=no; \
- case $$MAKEFLAGS in \
- *\\[\ \ ]*) \
- echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \
- | grep '^AM OK$$' >/dev/null || am__dry=yes;; \
- *) \
- for am__flg in $$MAKEFLAGS; do \
- case $$am__flg in \
- *=*|--*) ;; \
- *n*) am__dry=yes; break;; \
- esac; \
- done;; \
- esac; \
- test $$am__dry = yes; \
- }
-pkgdatadir = $(datadir)/@PACKAGE@
-pkgincludedir = $(includedir)/@PACKAGE@
-pkglibdir = $(libdir)/@PACKAGE@
-pkglibexecdir = $(libexecdir)/@PACKAGE@
-am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
-install_sh_DATA = $(install_sh) -c -m 644
-install_sh_PROGRAM = $(install_sh) -c
-install_sh_SCRIPT = $(install_sh) -c
-INSTALL_HEADER = $(INSTALL_DATA)
-transform = $(program_transform_name)
-NORMAL_INSTALL = :
-PRE_INSTALL = :
-POST_INSTALL = :
-NORMAL_UNINSTALL = :
-PRE_UNINSTALL = :
-POST_UNINSTALL = :
-build_triplet = @build@
-host_triplet = @host@
-subdir = linbox/field/NTL
-DIST_COMMON = $(am__pkgincludesub_HEADERS_DIST) $(srcdir)/Makefile.am \
- $(srcdir)/Makefile.in
-ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-am__aclocal_m4_deps = $(top_srcdir)/macros/aclocal-include.m4 \
- $(top_srcdir)/macros/config-header.m4 \
- $(top_srcdir)/macros/debug.m4 \
- $(top_srcdir)/macros/expat-check.m4 \
- $(top_srcdir)/macros/fflas-ffpack-check.m4 \
- $(top_srcdir)/macros/fplll-check.m4 \
- $(top_srcdir)/macros/givaro-check.m4 \
- $(top_srcdir)/macros/gmp-check.m4 \
- $(top_srcdir)/macros/iml-check.m4 \
- $(top_srcdir)/macros/lapack-check.m4 \
- $(top_srcdir)/macros/libtool.m4 \
- $(top_srcdir)/macros/lidia-check.m4 \
- $(top_srcdir)/macros/linbox-benchmark.m4 \
- $(top_srcdir)/macros/linbox-doc.m4 \
- $(top_srcdir)/macros/linbox-misc.m4 \
- $(top_srcdir)/macros/linbox-opt.m4 \
- $(top_srcdir)/macros/ltoptions.m4 \
- $(top_srcdir)/macros/ltsugar.m4 \
- $(top_srcdir)/macros/ltversion.m4 \
- $(top_srcdir)/macros/lt~obsolete.m4 \
- $(top_srcdir)/macros/m4ri-check.m4 \
- $(top_srcdir)/macros/m4rie-check.m4 \
- $(top_srcdir)/macros/maple-check.m4 \
- $(top_srcdir)/macros/mpfr-check.m4 \
- $(top_srcdir)/macros/ntl-check.m4 \
- $(top_srcdir)/macros/saclib-check.m4 \
- $(top_srcdir)/macros/sage-check.m4 $(top_srcdir)/configure.ac
-am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
- $(ACLOCAL_M4)
-mkinstalldirs = $(install_sh) -d
-CONFIG_HEADER = $(top_builddir)/config.h
-CONFIG_CLEAN_FILES =
-CONFIG_CLEAN_VPATH_FILES =
-depcomp =
-am__depfiles_maybe =
-SOURCES =
-DIST_SOURCES =
-am__can_run_installinfo = \
- case $$AM_UPDATE_INFO_DIR in \
- n|no|NO) false;; \
- *) (install-info --version) >/dev/null 2>&1;; \
- esac
-am__pkgincludesub_HEADERS_DIST = ntl-RR.h ntl-ZZ_p.h ntl-ZZ_pE.h \
- ntl-ZZ_pX.h ntl-lzz_p.h ntl-ZZ.h ntl-lzz_pE.h ntl-lzz_pX.h \
- ntl-GF2E.h
-am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
-am__vpath_adj = case $$p in \
- $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
- *) f=$$p;; \
- esac;
-am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
-am__install_max = 40
-am__nobase_strip_setup = \
- srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
-am__nobase_strip = \
- for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
-am__nobase_list = $(am__nobase_strip_setup); \
- for p in $$list; do echo "$$p $$p"; done | \
- sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
- $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
- if (++n[$$2] == $(am__install_max)) \
- { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
- END { for (dir in files) print dir, files[dir] }'
-am__base_list = \
- sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
- sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
-am__uninstall_files_from_dir = { \
- test -z "$$files" \
- || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \
- || { echo " ( cd '$$dir' && rm -f" $$files ")"; \
- $(am__cd) "$$dir" && rm -f $$files; }; \
- }
-am__installdirs = "$(DESTDIR)$(pkgincludesubdir)"
-HEADERS = $(pkgincludesub_HEADERS)
-ETAGS = etags
-CTAGS = ctags
-DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
-ACLOCAL = @ACLOCAL@
-AMTAR = @AMTAR@
-AR = @AR@
-AUTOCONF = @AUTOCONF@
-AUTOHEADER = @AUTOHEADER@
-AUTOMAKE = @AUTOMAKE@
-AWK = @AWK@
-BLAS_CFLAGS = @BLAS_CFLAGS@
-BLAS_LIBS = @BLAS_LIBS@
-CC = @CC@
-CCNAM = @CCNAM@
-CFLAGS = @CFLAGS@
-CPPFLAGS = @CPPFLAGS@
-CXX = @CXX@
-CXXCPP = @CXXCPP@
-CXXFLAGS = @CXXFLAGS@
-CYGPATH_W = @CYGPATH_W@
-DBG = @DBG@
-DEBUG_CFLAGS = @DEBUG_CFLAGS@
-DEFAULT_CFLAGS = @DEFAULT_CFLAGS@
-DEFS = @DEFS@
-DLLTOOL = @DLLTOOL@
-DSYMUTIL = @DSYMUTIL@
-DUMPBIN = @DUMPBIN@
-ECHO_C = @ECHO_C@
-ECHO_N = @ECHO_N@
-ECHO_T = @ECHO_T@
-EGREP = @EGREP@
-EXEEXT = @EXEEXT@
-EXPAT_CFLAGS = @EXPAT_CFLAGS@
-EXPAT_LIBS = @EXPAT_LIBS@
-FFLAS_FFPACK_CFLAGS = @FFLAS_FFPACK_CFLAGS@
-FFLAS_FFPACK_LIBS = @FFLAS_FFPACK_LIBS@
-FFLAS_FFPACK_LOC = @FFLAS_FFPACK_LOC@
-FGREP = @FGREP@
-FPLLL_CFLAGS = @FPLLL_CFLAGS@
-FPLLL_LIBS = @FPLLL_LIBS@
-GIVARO_CFLAGS = @GIVARO_CFLAGS@
-GIVARO_LIBS = @GIVARO_LIBS@
-GMP_CFLAGS = @GMP_CFLAGS@
-GMP_LIBS = @GMP_LIBS@
-GMP_VERSION = @GMP_VERSION@
-GREP = @GREP@
-IML_CFLAGS = @IML_CFLAGS@
-IML_LIBS = @IML_LIBS@
-INSTALL = @INSTALL@
-INSTALL_DATA = @INSTALL_DATA@
-INSTALL_PROGRAM = @INSTALL_PROGRAM@
-INSTALL_SCRIPT = @INSTALL_SCRIPT@
-INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
-LD = @LD@
-LDFLAGS = @LDFLAGS@
-LIBOBJS = @LIBOBJS@
-LIBS = @LIBS@
-LIBTOOL = @LIBTOOL@
-LIDIA_CFLAGS = @LIDIA_CFLAGS@
-LIDIA_LIBS = @LIDIA_LIBS@
-LINBOX_BENCH_PATH = @LINBOX_BENCH_PATH@
-LINBOX_DOC_PATH = @LINBOX_DOC_PATH@
-LIPO = @LIPO@
-LN_S = @LN_S@
-LTLIBOBJS = @LTLIBOBJS@
-M4RIE_CFLAGS = @M4RIE_CFLAGS@
-M4RIE_LIBS = @M4RIE_LIBS@
-M4RI_CFLAGS = @M4RI_CFLAGS@
-M4RI_LIBS = @M4RI_LIBS@
-MAINT = @MAINT@
-MAKEINFO = @MAKEINFO@
-MANIFEST_TOOL = @MANIFEST_TOOL@
-MAPLE_CFLAGS = @MAPLE_CFLAGS@
-MAPLE_HOME = @MAPLE_HOME@
-MAPLE_LIBS = @MAPLE_LIBS@
-MAPLE_VERSION = @MAPLE_VERSION@
-MKDIR_P = @MKDIR_P@
-MPFR_CFLAGS = @MPFR_CFLAGS@
-MPFR_LIBS = @MPFR_LIBS@
-NM = @NM@
-NMEDIT = @NMEDIT@
-NTL_CFLAGS = @NTL_CFLAGS@
-NTL_LIBS = @NTL_LIBS@
-OBJDUMP = @OBJDUMP@
-OBJEXT = @OBJEXT@
-OTOOL = @OTOOL@
-OTOOL64 = @OTOOL64@
-PACKAGE = @PACKAGE@
-PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
-PACKAGE_NAME = @PACKAGE_NAME@
-PACKAGE_STRING = @PACKAGE_STRING@
-PACKAGE_TARNAME = @PACKAGE_TARNAME@
-PACKAGE_URL = @PACKAGE_URL@
-PACKAGE_VERSION = @PACKAGE_VERSION@
-PATH_SEPARATOR = @PATH_SEPARATOR@
-PROF = @PROF@
-RANLIB = @RANLIB@
-RM = @RM@
-SACLIB_CFLAGS = @SACLIB_CFLAGS@
-SACLIB_LIBS = @SACLIB_LIBS@
-SED = @SED@
-SET_MAKE = @SET_MAKE@
-SHELL = @SHELL@
-STRIP = @STRIP@
-TESTS_CFLAGS = @TESTS_CFLAGS@
-VERSION = @VERSION@
-WARN = @WARN@
-abs_builddir = @abs_builddir@
-abs_srcdir = @abs_srcdir@
-abs_top_builddir = @abs_top_builddir@
-abs_top_srcdir = @abs_top_srcdir@
-ac_ct_AR = @ac_ct_AR@
-ac_ct_CC = @ac_ct_CC@
-ac_ct_CXX = @ac_ct_CXX@
-ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
-am__leading_dot = @am__leading_dot@
-am__tar = @am__tar@
-am__untar = @am__untar@
-bindir = @bindir@
-build = @build@
-build_alias = @build_alias@
-build_cpu = @build_cpu@
-build_os = @build_os@
-build_vendor = @build_vendor@
-builddir = @builddir@
-datadir = @datadir@
-datarootdir = @datarootdir@
-docdir = @docdir@
-dvidir = @dvidir@
-exec_prefix = @exec_prefix@
-host = @host@
-host_alias = @host_alias@
-host_cpu = @host_cpu@
-host_os = @host_os@
-host_vendor = @host_vendor@
-htmldir = @htmldir@
-includedir = @includedir@
-infodir = @infodir@
-install_sh = @install_sh@
-libdir = @libdir@
-libexecdir = @libexecdir@
-localedir = @localedir@
-localstatedir = @localstatedir@
-mandir = @mandir@
-mkdir_p = @mkdir_p@
-oldincludedir = @oldincludedir@
-pdfdir = @pdfdir@
-prefix = @prefix@
-program_transform_name = @program_transform_name@
-psdir = @psdir@
-sbindir = @sbindir@
-sharedstatedir = @sharedstatedir@
-srcdir = @srcdir@
-sysconfdir = @sysconfdir@
-target_alias = @target_alias@
-top_build_prefix = @top_build_prefix@
-top_builddir = @top_builddir@
-top_srcdir = @top_srcdir@
-pkgincludesubdir = $(pkgincludedir)/field/NTL
-NTL_HDRS = \
- ntl-RR.h \
- ntl-ZZ_p.h \
- ntl-ZZ_pE.h \
- ntl-ZZ_pX.h \
- ntl-lzz_p.h \
- ntl-ZZ.h \
- ntl-lzz_pE.h \
- ntl-lzz_pX.h \
- ntl-GF2E.h
-
- at LINBOX_HAVE_NTL_TRUE@USE_NTL_HDRS = $(NTL_HDRS)
-pkgincludesub_HEADERS = \
- $(USE_NTL_HDRS)
-
-all: all-am
-
-.SUFFIXES:
-$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps)
- @for dep in $?; do \
- case '$(am__configure_deps)' in \
- *$$dep*) \
- ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
- && { if test -f $@; then exit 0; else break; fi; }; \
- exit 1;; \
- esac; \
- done; \
- echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu --ignore-deps linbox/field/NTL/Makefile'; \
- $(am__cd) $(top_srcdir) && \
- $(AUTOMAKE) --gnu --ignore-deps linbox/field/NTL/Makefile
-.PRECIOUS: Makefile
-Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
- @case '$?' in \
- *config.status*) \
- cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
- *) \
- echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
- cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
- esac;
-
-$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
- cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-
-$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
- cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
- cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-$(am__aclocal_m4_deps):
-
-mostlyclean-libtool:
- -rm -f *.lo
-
-clean-libtool:
- -rm -rf .libs _libs
-install-pkgincludesubHEADERS: $(pkgincludesub_HEADERS)
- @$(NORMAL_INSTALL)
- @list='$(pkgincludesub_HEADERS)'; test -n "$(pkgincludesubdir)" || list=; \
- if test -n "$$list"; then \
- echo " $(MKDIR_P) '$(DESTDIR)$(pkgincludesubdir)'"; \
- $(MKDIR_P) "$(DESTDIR)$(pkgincludesubdir)" || exit 1; \
- fi; \
- for p in $$list; do \
- if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
- echo "$$d$$p"; \
- done | $(am__base_list) | \
- while read files; do \
- echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(pkgincludesubdir)'"; \
- $(INSTALL_HEADER) $$files "$(DESTDIR)$(pkgincludesubdir)" || exit $$?; \
- done
-
-uninstall-pkgincludesubHEADERS:
- @$(NORMAL_UNINSTALL)
- @list='$(pkgincludesub_HEADERS)'; test -n "$(pkgincludesubdir)" || list=; \
- files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
- dir='$(DESTDIR)$(pkgincludesubdir)'; $(am__uninstall_files_from_dir)
-
-ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
- list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
- unique=`for i in $$list; do \
- if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
- done | \
- $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
- END { if (nonempty) { for (i in files) print i; }; }'`; \
- mkid -fID $$unique
-tags: TAGS
-
-TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
- $(TAGS_FILES) $(LISP)
- set x; \
- here=`pwd`; \
- list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
- unique=`for i in $$list; do \
- if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
- done | \
- $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
- END { if (nonempty) { for (i in files) print i; }; }'`; \
- shift; \
- if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
- test -n "$$unique" || unique=$$empty_fix; \
- if test $$# -gt 0; then \
- $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
- "$$@" $$unique; \
- else \
- $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
- $$unique; \
- fi; \
- fi
-ctags: CTAGS
-CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
- $(TAGS_FILES) $(LISP)
- list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
- unique=`for i in $$list; do \
- if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
- done | \
- $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
- END { if (nonempty) { for (i in files) print i; }; }'`; \
- test -z "$(CTAGS_ARGS)$$unique" \
- || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
- $$unique
-
-GTAGS:
- here=`$(am__cd) $(top_builddir) && pwd` \
- && $(am__cd) $(top_srcdir) \
- && gtags -i $(GTAGS_ARGS) "$$here"
-
-distclean-tags:
- -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
-
-distdir: $(DISTFILES)
- @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
- topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
- list='$(DISTFILES)'; \
- dist_files=`for file in $$list; do echo $$file; done | \
- sed -e "s|^$$srcdirstrip/||;t" \
- -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
- case $$dist_files in \
- */*) $(MKDIR_P) `echo "$$dist_files" | \
- sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
- sort -u` ;; \
- esac; \
- for file in $$dist_files; do \
- if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
- if test -d $$d/$$file; then \
- dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
- if test -d "$(distdir)/$$file"; then \
- find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
- fi; \
- if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
- cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
- find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
- fi; \
- cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
- else \
- test -f "$(distdir)/$$file" \
- || cp -p $$d/$$file "$(distdir)/$$file" \
- || exit 1; \
- fi; \
- done
-check-am: all-am
-check: check-am
-all-am: Makefile $(HEADERS)
-installdirs:
- for dir in "$(DESTDIR)$(pkgincludesubdir)"; do \
- test -z "$$dir" || $(MKDIR_P) "$$dir"; \
- done
-install: install-am
-install-exec: install-exec-am
-install-data: install-data-am
-uninstall: uninstall-am
-
-install-am: all-am
- @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
-
-installcheck: installcheck-am
-install-strip:
- if test -z '$(STRIP)'; then \
- $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
- install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
- install; \
- else \
- $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
- install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
- "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
- fi
-mostlyclean-generic:
-
-clean-generic:
-
-distclean-generic:
- -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
- -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
-
-maintainer-clean-generic:
- @echo "This command is intended for maintainers to use"
- @echo "it deletes files that may require special tools to rebuild."
-clean: clean-am
-
-clean-am: clean-generic clean-libtool mostlyclean-am
-
-distclean: distclean-am
- -rm -f Makefile
-distclean-am: clean-am distclean-generic distclean-tags
-
-dvi: dvi-am
-
-dvi-am:
-
-html: html-am
-
-html-am:
-
-info: info-am
-
-info-am:
-
-install-data-am: install-pkgincludesubHEADERS
-
-install-dvi: install-dvi-am
-
-install-dvi-am:
-
-install-exec-am:
-
-install-html: install-html-am
-
-install-html-am:
-
-install-info: install-info-am
-
-install-info-am:
-
-install-man:
-
-install-pdf: install-pdf-am
-
-install-pdf-am:
-
-install-ps: install-ps-am
-
-install-ps-am:
-
-installcheck-am:
-
-maintainer-clean: maintainer-clean-am
- -rm -f Makefile
-maintainer-clean-am: distclean-am maintainer-clean-generic
-
-mostlyclean: mostlyclean-am
-
-mostlyclean-am: mostlyclean-generic mostlyclean-libtool
-
-pdf: pdf-am
-
-pdf-am:
-
-ps: ps-am
-
-ps-am:
-
-uninstall-am: uninstall-pkgincludesubHEADERS
-
-.MAKE: install-am install-strip
-
-.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \
- clean-libtool ctags distclean distclean-generic \
- distclean-libtool distclean-tags distdir dvi dvi-am html \
- html-am info info-am install install-am install-data \
- install-data-am install-dvi install-dvi-am install-exec \
- install-exec-am install-html install-html-am install-info \
- install-info-am install-man install-pdf install-pdf-am \
- install-pkgincludesubHEADERS install-ps install-ps-am \
- install-strip installcheck installcheck-am installdirs \
- maintainer-clean maintainer-clean-generic mostlyclean \
- mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
- tags uninstall uninstall-am uninstall-pkgincludesubHEADERS
-
-
-# EXTRA_DIST = \
-# # ntl.doxy
-
-# Tell versions [3.59,3.63) of GNU make to not export all variables.
-# Otherwise a system limit (for SysV at least) may be exceeded.
-.NOEXPORT:
diff --git a/linbox/field/NTL/ntl-GF2E.h b/linbox/field/NTL/ntl-GF2E.h
deleted file mode 100644
index 6b3add3..0000000
--- a/linbox/field/NTL/ntl-GF2E.h
+++ /dev/null
@@ -1,242 +0,0 @@
-/* linbox/field/ntl-z_pE.h
- * Copyright (C) 2004 Pascal Giorgi
- * Copyright (C) 2011 LinBox
- *
- * Written by Pascal Giorgi <pascal.giorgi at ens-lyon.fr>
- *
- * Modified by W. J. Turner <wjturner at acm.org>
- *
- * ========LICENCE========
- * This file is part of the library LinBox.
- *
- * LinBox is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- * ========LICENCE========
- */
-
-/*! @file field/NTL/ntl-GF2E.h
- * @ingroup field
- * @ingroup NTL
- * @brief NO DOC
- */
-
-#ifndef __LINBOX_field_ntl_gf2e_H
-#define __LINBOX_field_ntl_gf2e_H
-
-#ifndef __LINBOX_HAVE_NTL
-#error "you need NTL here"
-#endif
-
-#include <NTL/GF2XFactoring.h>
-#include <NTL/GF2E.h>
-#include <time.h>
-
-#include "linbox/linbox-config.h"
-#include "linbox/util/debug.h"
-
-#include "linbox/field/unparametric.h"
-#include "linbox/randiter/unparametric.h"
-#include "linbox/field/field-traits.h"
-
-
-#include "linbox/integer.h"
-
-namespace Givaro
-{
- template<>
- // NTL::GF2E& UnparametricField<NTL::GF2E>::init (NTL::GF2E &x, const Integer &y) const
- NTL::GF2E& Caster(NTL::GF2E &x, const Integer &y)
- {
- x=NTL::to_GF2E(static_cast<long>(y));
- return x;
- }
- template<>
- // NTL::GF2E& UnparametricField<NTL::GF2E>::init (NTL::GF2E &x, const double &y) const
- NTL::GF2E& Caster(NTL::GF2E &x, const double &y)
- {
- x=NTL::to_GF2E(static_cast<long>(y));
- return x;
- }
-
-
- template<>
- // Integer& UnparametricField<NTL::GF2E>::convert (Integer& x, const NTL::GF2E &y) const {
- Integer& Caster(Integer& x, const NTL::GF2E &y)
- {
- NTL::GF2X poly = rep(y);
-
- long i;
- x = 0;
- for(i = deg(poly); i >= 0; --i) {
- x <<= 1;
- x += rep(coeff(poly, i));
- }
- return x;
- }
-
-} // namespace Givaro
-
-
-
-
-// Namespace in which all LinBox library code resides
-namespace LinBox
-{
- /// \ingroup field
-
- class NTL_GF2E_Initialiser {
- public :
- NTL_GF2E_Initialiser( const Integer & p, size_t k = 1) {
- linbox_check(p == 2);
- // if(p != 2) throw PreconditionFailed(__func__,__FILE__,__LINE__,"modulus must be 2");
- NTL::GF2X irredPoly = NTL::BuildSparseIrred_GF2X((long) k);
- NTL::GF2E::init(irredPoly);
-
- }
-
- // template <class ElementInt>
- // NTL_GF2E_Initialiser(const ElementInt& d) {
- // NTL::ZZ_p::init (NTL::to_ZZ(d));
- // }
-
- // NTL_GF2E_Initialiser (const NTL::ZZ& d) {
- // NTL::ZZ_p::init(d);
- // }
-
- };
-
-
- /*
- * Define a parameterized class to easily handle UnparametricField<NTL::GF2E> field
- */
-
- class NTL_GF2E : public NTL_GF2E_Initialiser, public FFPACK::UnparametricOperations<NTL::GF2E> {
- public:
- typedef NTL::GF2E Element ;
- typedef FFPACK::UnparametricOperations<Element> Father_t ;
- typedef UnparametricRandIter<Element> RandIter;
-
- const Element zero,one,mOne ;
-
- NTL_GF2E (const integer &p, const integer &k) :
- NTL_GF2E_Initialiser(p,k),Father_t ()
- ,zero( NTL::to_GF2E(0)),one( NTL::to_GF2E(1)),mOne(-one)
- { }
-
- bool isZero (const Element& a) const
- {
- return NTL::IsZero(a);
- }
-
-
- bool isOne (const Element& a) const
- {
- return NTL::IsOne(a);
- }
-
- integer& characteristic (integer &c) const
- {
- return c = 2;
- }
-
- integer& cardinality(integer& c) const
- {
- c=1;
- c<<= Element::degree();
- return c;
- }
-
- Element& inv(Element& x, const Element& y) const
- {
- x=NTL::to_GF2E(1)/y;
- return x;
- }
-
- Element& invin(Element& x) const
- {
- x=NTL::to_GF2E(1)/x;
- return x;
- }
-
- std::istream& read(std::istream& is, Element& x) const
- {
- long tmp;
- is>>tmp;
- x=NTL::to_GF2E(tmp);
- return is;
- }
- }; // end o class NTL_GF2E
-
- template <class Ring>
- struct ClassifyRing;
-
- template <class Element>
- struct ClassifyRing<UnparametricRandIter<Element> >;
-
- template <>
- struct ClassifyRing<UnparametricRandIter<NTL::GF2E> > {
- typedef RingCategories::ModularTag categoryTag;
- };
-
- template<>
- class UnparametricRandIter<NTL::GF2E> {
- public:
- typedef NTL::GF2E Element;
- UnparametricRandIter<NTL::GF2E>(const NTL_GF2E & F,
- const size_t& size = 0,
- const size_t& seed = 0
- ) :
- _size(size), _seed(seed)
- {
- if(_seed == 0)
- NTL::SetSeed(NTL::to_ZZ(time(0)));
- else
- NTL::SetSeed(NTL::to_ZZ(_seed));
- }
-
- UnparametricRandIter<NTL::GF2E>(const UnparametricRandIter<NTL::GF2E>& R) :
- _size(R._size), _seed(R._seed)
-
- {
- if(_seed == 0)
- NTL::SetSeed(NTL::to_ZZ(time(0)));
- else
- NTL::SetSeed(NTL::to_ZZ(_seed));
- }
-
- Element& random (Element& x) const
- {
- NTL::random(x);
- return x;
- }
-
- protected:
- size_t _size;
- size_t _seed;
- };
-
-
-}
-
-#endif //__LINBOX_ntl_gf2e_H
-
-
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
-// Local Variables:
-// mode: C++
-// tab-width: 8
-// indent-tabs-mode: nil
-// c-basic-offset: 8
-// End:
-
diff --git a/linbox/field/NTL/ntl-RR.h b/linbox/field/NTL/ntl-RR.h
deleted file mode 100644
index d15ce01..0000000
--- a/linbox/field/NTL/ntl-RR.h
+++ /dev/null
@@ -1,334 +0,0 @@
-/* linbox/field/ntl-RR.h
- * Copyright (C) 1999-2005 William J Turner,
- * 2001 Bradford Hovinen
- * Copyright (C) 2011 LinBox
- *
- * Written by W. J. Turner <wjturner at acm.org>,
- * Bradford Hovinen <hovinen at cis.udel.edu>
- *
- * ------------------------------------
- *
- *
- * ========LICENCE========
- * This file is part of the library LinBox.
- *
- * LinBox is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- * ========LICENCE========
- *.
- */
-
-/*! @file field/NTL/ntl-RR.h
- * @ingroup field
- * @ingroup NTL
- * @brief NO DOC
- */
-
-#ifndef __LINBOX_field_ntl_rr_H
-#define __LINBOX_field_ntl_rr_H
-
-#include "linbox/linbox-config.h"
-
-#ifndef __LINBOX_HAVE_NTL
-#error "you need NTL here"
-#endif
-
-
-#include <NTL/tools.h>
-#include <NTL/RR.h>
-
-#include "linbox/util/debug.h"
-
-#include "linbox/field/unparametric.h"
-#include "linbox/randiter/unparametric.h"
-#include "linbox/field/field-traits.h"
-
-#include "linbox/integer.h"
-
-namespace Givaro
-{
- /** Initialization of field element from an integer.
- * Behaves like C++ allocator construct.
- * This function assumes the output field element x has already been
- * constructed, but that it is not already initialized.
- * For now, this is done by converting the integer type to a C++
- * long and then to the element type through the use of static cast and
- * NTL's to_RR function.
- * This, of course, assumes such static casts are possible.
- * This function should be changed in the future to avoid using long.
- * @return reference to field element.
- * @param x field element to contain output (reference returned).
- * @param y integer.
- */
- template <>
- NTL::RR& Caster(NTL::RR& x, const Integer& y)
- {
- return x = NTL::to_RR(static_cast<const long&>(y));
- }
- template <>
- NTL::RR& Caster(NTL::RR& x, const double& y)
- {
- return x = NTL::to_RR((long)(y));
- }
- template <>
- NTL::RR& Caster(NTL::RR& x, const int& y)
- {
- return x = NTL::to_RR((long)(y));
- }
-
- template <>
- NTL::RR& Caster(NTL::RR& x, const long int& y)
- {
- return x = NTL::to_RR((long)(y));
- }
-
- /** Conversion of field element to an integer.
- * This function assumes the output field element x has already been
- * constructed, but that it is not already initialized.
- * For now, this is done by converting the element type to a C++
- * long and then to the integer type through the use of static cast and
- * NTL's to_long function.
- * This, of course, assumes such static casts are possible.
- * This function should be changed in the future to avoid using long.
- * @return reference to integer.
- * @param x reference to integer to contain output (reference returned).
- * @param y constant reference to field element.
- */
- template <>
- Integer& Caster(Integer& x, const NTL::RR& y)
- {
- return x = static_cast<Integer>(to_long(y));
- }
-} // namespace Givaro
-
-
-
-
-// Namespace in which all LinBox library code resides
-namespace LinBox
-{
-
- class NTL_RR_Initialiser {
- public :
- NTL_RR_Initialiser () { }
- };
-
-
-
- /** @name class RR.
- \brief
- * Rational number field.
- * This field is provided as a convenience in a few places.
- * Use with caution because expression swell.
- *
- * This specialization allows the \ref UnparametricField template class to be
- * used to wrap NTL's RR class as a LinBox field.
- \ingroup field
- */
- //@{
-
-
- struct NTL_RR: public NTL_RR_Initialiser, public FFPACK::UnparametricOperations<NTL::RR> {
- typedef NTL::RR Element ;
- typedef FFPACK::UnparametricOperations<Element> Father_t ;
- typedef UnparametricRandIter<Element> RandIter;
-
- const Element zero,one,mOne ;
-
- NTL_RR() :
- NTL_RR_Initialiser(),Father_t ()
- ,zero( NTL::to_RR(0)),one( NTL::to_RR(1)),mOne(-one)
- {
- // no default - allow initialization of ZZ_p directly by user.
- }
-
-
- /** Multiplicative Inverse.
- * x = 1 / y
- * This function assumes both field elements have already been
- * constructed and initialized.
- * @return reference to x.
- * @param x field element (reference returned).
- * @param y field element.
- */
- Element& inv(Element& x, const Element& y) const
- {
- return x = NTL::inv(y);
- }
-
- /** Zero equality.
- * Test if field element is equal to zero.
- * This function assumes the field element has already been
- * constructed and initialized.
- * In this specialization, NTL's IsZero function is called.
- * @return boolean true if equals zero, false if not.
- * @param x field element.
- */
- bool isZero(const Element& x) const
- {
- return static_cast<bool>(IsZero(x));
- }
-
- /** One equality.
- * Test if field element is equal to one.
- * This function assumes the field element has already been
- * constructed and initialized.
- * In this specialization, NTL's IsOne function is called.
- * @return boolean true if equals one, false if not.
- * @param x field element.
- */
- bool isOne(const Element& x) const
- {
- return static_cast<bool>(IsOne(x));
- }
-
- /** Inplace Multiplicative Inverse.
- * x = 1 / x
- * This function assumes both field elements have already been
- * constructed and initialized.
- * @return reference to x.
- * @param x field element (reference returned).
- */
- Element& invin(Element& x) const
- {
- return x = NTL::inv(x);
- }
-
- /** Print field.
- * @return output stream to which field is written.
- * @param os output stream to which field is written.
- */
- std::ostream& write(std::ostream& os) const
- {
- return os << "unparameterized field Element";
- }
-
- integer & cardinality(integer &c) const
- {
- return c = -1L;
- }
-
- integer & characteristic(integer &c) const
- {
- return c = 0UL;
- }
-
- std::ostream &write (std::ostream &os, const Element &x) const {
- return FFPACK::UnparametricOperations<Element>::write(os,x);
- }
-
- Element& init (Element& x) const
- {
- return x;
- }
-
- template <typename Src>
- Element& init (Element& x, const Src& s) const
- {
- return Caster (x, s);
- }
-
- template <typename T>
- T& convert (T &x, const Element &y) const
- {
- return Caster (x,y);
- }
-
-
- };
-
- template <>
- class UnparametricRandIter<NTL::RR> {
- typedef NTL::RR Element ;
- protected:
- integer _size,_seed;
- public:
-
- UnparametricRandIter<NTL::RR> (const NTL_RR & F,
- const integer& size = 0,
- const integer& seed = 0) :
- _size(size), _seed(seed)
- {
- if (_seed == integer(0)) _seed = integer(time(NULL));
-
- // integer cardinality;
- // F.cardinality(cardinality);
- // if (_size > cardinality)
- // _size = 0;
-
-#ifdef TRACE
- std::cout << "created random generator with size " << _size
- << " and seed " << _seed << std::endl;
-#endif // TRACE
-
- // Seed random number generator
- NTL::SetSeed(NTL::to_ZZ(static_cast<long>(_seed)));
- }
-
-
- /** Random field element creator.
- * This returns a random field element from the information supplied
- * at the creation of the generator.
- * This generator uses the built-in C++ random number generator instead of
- * NTL's random function because the NTL function does not allow as much
- * control over the sampling size as the generic LinBox template. This
- * specialization is included only to allow conversion to an NTL
- * object.
- * @return random field element
- */
- Element& random(Element &elt) const
- {
- // NTL::random(elt);
- // Create new random elements
- if (_size == 0)
- elt = rand();
- else
- elt = static_cast<double>((double(rand())/RAND_MAX)*double(_size));
-
-#ifdef TRACE
- double temp ;
- NTL::conv(temp, elt);
- std::cout << "random double = " << temp << " random Element = " << elt << std::endl;
-#endif // TRACE
-
- return elt;
-
- } // element& operator() (void)
-
- };
-
- template <class Ring>
- struct ClassifyRing;
-
- template<class Element>
- struct ClassifyRing<UnparametricField<Element> >;
-
- template<>
- struct ClassifyRing<NTL_RR >{
- typedef RingCategories::ModularTag categoryTag;
- };
- //@}
-} // namespace LinBox
-
-#endif // __LINBOX_field_ntl_rr_H
-
-
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
-// Local Variables:
-// mode: C++
-// tab-width: 8
-// indent-tabs-mode: nil
-// c-basic-offset: 8
-// End:
-
diff --git a/linbox/field/NTL/ntl-ZZ.h b/linbox/field/NTL/ntl-ZZ.h
deleted file mode 100644
index ab6053f..0000000
--- a/linbox/field/NTL/ntl-ZZ.h
+++ /dev/null
@@ -1,771 +0,0 @@
-/* Copyright (C) LinBox
- * Author: Zhendong Wan
- *
- *
- *
- * ========LICENCE========
- * This file is part of the library LinBox.
- *
- * LinBox is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- * ========LICENCE========
- */
-
-/** @file field/NTL/ntl-ZZ.h
- * @ingroup field
- * @brief NO DOC
- */
-
-#ifndef __LINBOX_ntl_zz_H
-#define __LINBOX_ntl_zz_H
-
-#include <NTL/ZZ.h>
-#include "linbox/integer.h"
-#include <iostream>
-#include "linbox/util/debug.h"
-#include "linbox/randiter/ntl-ZZ.h"
-#include "linbox/field/field-traits.h"
-
-namespace LinBox
-{
-
- template <class Ring>
- struct ClassifyRing ;
-
- class NTL_ZZ;
-
- template <>
- struct ClassifyRing<NTL_ZZ>
- {
- typedef RingCategories::IntegerTag categoryTag;
- };
-
- template<class Field>
- class FieldAXPY;
-
- /// \brief the integer ring. \ingroup ring
- class NTL_ZZ {
-
- public:
- typedef NTL_ZZRandIter RandIter;
- typedef NTL_ZZ Father_t ;
-
- typedef NTL::ZZ Element;
- Element zero,one,mOne;
-
- NTL_ZZ(int p = 0, int exp = 1)
- {
- if( p != 0 ) throw PreconditionFailed(__func__,__FILE__,__LINE__,"modulus must be 0 (no modulus)");
- if( exp != 1 ) throw PreconditionFailed(__func__,__FILE__,__LINE__,"exponent must be 1");
- }
-
- inline integer& cardinality (integer& c) const
- {
- return c = -1;
- }
-
- inline integer& characteristic (integer& c)const
- {
- return c = 0;
- }
-
- template<class IntType>
- inline IntType & characteristic (IntType& c)const
- {
- return c = 0;
- }
-
- std::ostream& write (std::ostream& out) const
- {
- return out << "NTL ZZ Ring";
- }
-
- std::istream& read (std::istream& in) const
- {
- return in;
- }
-
- /** @brief
- * Init x from y.
- */
- template<class Element2>
- inline Element& init (Element& x, const Element2& y) const
- {
-
- NTL::conv (x, y);
-
- return x;
- }
-
- /** @brief
- * Init from a NTL::ZZ
- */
- inline Element& init (Element& x, const Element& y) const
- {
-
- x = y;
-
- return x;
- }
-
- /** @brief
- * Init from an int64_t
- */
- inline Element& init (Element& x, const int64_t& y) const
- {
- bool isNeg = false;
- uint64_t t;
- if( y < 0 ) {
- isNeg = true;
- t = uint64_t(y * -1);
- }
- else t = (uint64_t) y;
- init(x,t);
- if( isNeg ) x *= -1;
- return x;
- }
-
- /** @brief
- * Init from a uint64_t
- */
- inline Element& init (Element& x, const uint64_t& y) const
- {
- uint64_t shift = (uint64_t)1 << 32;
- uint32_t temp = uint32_t(y % shift);
- NTL::conv (x,temp);
- x <<= 32;
- temp = (uint32_t)(y / shift);
- x += temp;
- return x;
- }
-
- /** @brief
- * I don't know how to init from integer efficiently.
- */
- // c_str is safer than data, Z. W and BDS
- inline Element& init (Element& x, const integer& y) const
- {
-
- return x=NTL::to_ZZ((std::string(y)).c_str());
- }
-
- /** @brief
- * Convert y to an Element.
- */
- inline integer& convert (integer& x, const Element& y) const
- {
- bool Neg=false;
- if (sign(y) <0)
- Neg=true;
- long b = NumBytes(y);
- unsigned char* byteArray;
- byteArray = new unsigned char[(size_t)b ];
- BytesFromZZ(byteArray, y, b);
-
- integer base(256);
- x= integer(0);
-
- for(long i = b - 1; i >= 0; --i) {
- x *= base;
- x += integer(byteArray[i]);
- }
- delete [] byteArray;
- if (Neg)
- x=-x;
- return x;
- }
-
- inline double& convert (double& x, const Element& y) const
- {
- return x=NTL::to_double(y);
- }
-
-
-
- /** @brief
- * x = y.
- */
- inline Element& assign (Element& x, const Element& y) const
- {
- return x = y;
- }
-
- /** @brief
- * Test if x == y
- */
- inline bool areEqual (const Element& x ,const Element& y) const
- {
- return x == y;
- }
-
- /** @brief
- * Test if x == 0
- */
- inline bool isZero (const Element& x) const
- {
- return NTL::IsZero (x);
- }
-
- /** @brief
- * Test if x == 1
- */
- inline bool isOne (const Element& x) const
- {
- return NTL::IsOne (x);
- }
-
- // arithmetic
-
- /** @brief
- * return x = y + z
- */
- inline Element& add (Element& x, const Element& y, const Element& z) const
- {
-
- NTL::add (x, y, z);
-
- return x;
- }
-
- /** @brief
- * return x = y - z
- */
- inline Element& sub (Element& x, const Element& y, const Element& z) const
- {
-
- NTL::sub (x, y, z);
-
- return x;
- }
-
- /** @brief
- * return x = y * z
- */
- template <class Int>
- inline Element& mul (Element& x, const Element& y, const Int& z) const
- {
-
- NTL::mul (x, y, z);
-
- return x;
- }
-
- /** @brief
- * If z divides y, return x = y / z,
- * otherwise, throw an exception
- */
- inline Element& div (Element& x, const Element& y, const Element& z) const
- {
-
- Element q, r;
-
- NTL::DivRem (q, r, y, z);
-
- if (NTL::IsZero (r))
- return x = q;
-
- else
- throw PreconditionFailed(__func__,__FILE__,__LINE__,"Div: not dividable");
- }
-
- /** @brief
- * If y is a unit, return x = 1 / y,
- * otherwsie, throw an exception
- */
- inline Element& inv (Element& x, const Element& y) const
- {
-
- if ( NTL::IsOne (y)) return x = y;
-
- else if ( NTL::IsOne (-y)) return x = y;
-
- else
- throw PreconditionFailed(__func__,__FILE__,__LINE__,"Inv: Not invertible");
- }
-
- /** @brief
- * return x = -y;
- */
- inline Element& neg (Element& x, const Element& y) const
- {
-
- NTL::negate (x, y);
-
- return x;
- }
-
-
- /** @brief
- * return r = a x + y
- */
- template <class Int>
- inline Element& axpy (Element& r, const Element& a, const Int& x, const Element& y) const
- {
-
- NTL::mul (r, a, x);
-
- return r += y;
- }
-
-
- // inplace operator
-
- /** @brief
- * return x += y;
- */
- inline Element& addin (Element& x, const Element& y) const
- {
-
- return x += y;
- }
-
- /** @brief
- * return x -= y;
- */
- inline Element& subin (Element& x, const Element& y) const
- {
-
- return x -= y;
- }
-
- /** @brief
- * return x *= y;
- */
- template<class Int>
- inline Element& mulin (Element& x, const Int& y) const
- {
-
- return x *= y;
- }
-
- /** @brief
- * If y divides x, return x /= y,
- * otherwise throw an exception
- */
- inline Element& divin (Element& x, const Element& y) const
- {
-
- div (x, x, y);
-
- return x;
- }
-
- /** @brief
- * If x is a unit, x = 1 / x,
- * otherwise, throw an exception.
- */
- inline Element& invin (Element& x) {
-
- if (NTL::IsOne (x)) return x;
-
- else if (NTL::IsOne (-x)) return x;
-
- else throw PreconditionFailed(__func__,__FILE__,__LINE__,"Div: not dividable");
- }
-
- /** @brief
- * return x = -x;
- */
- inline Element& negin (Element& x) const
- {
-
- NTL::negate (x, x);
-
- return x;
- }
-
- /** @brief
- * return r += a x
- */
- template <class Int>
- inline Element& axpyin (Element& r, const Element& a, const Int& x) const
- {
-
- return r += a * x;
- }
-
-
- // IO
-
- /** @brief
- * out << y;
- */
- std::ostream& write(std::ostream& out,const Element& y) const
- {
-
- out << y;
-
- return out;
- }
-
-
- /** @brief
- * read x from istream in
- */
- std::istream& read(std::istream& in, Element& x) const
- {
-
- return in >> x;
- }
-
-
- /** some PIR function
- */
-
- /** @brief
- * Test if x is a unit.
- */
- inline bool isUnit (const Element& x) const
- {
-
- return (NTL::IsOne (x) || NTL::IsOne (-x));
- }
-
- /** @brief
- * return g = gcd (a, b)
- */
- inline Element& gcd (Element& g, const Element& a, const Element& b) const
- {
-
- NTL::GCD (g, a, b);
-
- return g;
- }
-
- /** @brief
- * return g = gcd (g, b)
- */
- inline Element& gcdin (Element& g, const Element& b) const
- {
-
- NTL::GCD (g, g, b);
-
- return g;
- }
-
- /** @brief
- * g = gcd(a, b) = a*s + b*t.
- * The coefficients s and t are defined according to the standard
- * Euclidean algorithm applied to |a| and |b|, with the signs then
- * adjusted according to the signs of a and b.
- */
- inline Element& xgcd (Element& g, Element& s, Element& t, const Element& a, const Element& b)const
- {
-
- NTL::XGCD (g,s,t,a,b);
-
- return g;
- }
-
- /** @brief
- * c = lcm (a, b)
- */
- inline Element& lcm (Element& c, const Element& a, const Element& b) const
- {
-
-
- if (NTL::IsZero (a) || NTL::IsZero (b)) return c = NTL::ZZ::zero();
-
- else {
- Element g;
-
- NTL::GCD (g, a, b);
-
- NTL::mul (c, a, b);
-
- c /= g;
-
- NTL::abs (c, c);
-
- return c;
- }
- }
-
- /** @brief
- * l = lcm (l, b)
- */
- inline Element& lcmin (Element& l, const Element& b) const
- {
-
- if (NTL::IsZero (l) || NTL::IsZero (b))
-
- return l = NTL::ZZ::zero();
-
- else {
-
- Element g;
-
- NTL::GCD (g, l, b);
-
- l *= b;
-
- l /= g;
-
- NTL::abs (l, l);
-
- return l;
- }
- }
-
-
-
-
-
- // some specail function
-
- /** @brief
- * x = floor ( sqrt(y)).
- */
-
- inline Element& sqrt (Element& x, const Element& y) const
- {
-
- NTL::SqrRoot(x,y);
-
- return x;
- }
-
- /** @brief
- * Requires 0 <= x < m, m > 2 * a_bound * b_bound,
- * a_bound >= 0, b_bound > 0
- * This routine either returns 0, leaving a and b unchanged,
- * or returns 1 and sets a and b so that
- * (1) a = b x (mod m),
- * (2) |a| <= a_bound, 0 < b <= b_bound, and
- * (3) gcd(m, b) = gcd(a, b).
- */
-
- inline long reconstructRational (Element& a, Element& b, const Element& x, const Element& m,
- const Element& a_bound, const Element& b_bound) const
- {
-
- return NTL::ReconstructRational(a,b,x,m,a_bound,b_bound);
- }
-
-
- /** @brief
- * q = floor (x/y);
- */
- inline Element& quo (Element& q, const Element& a, const Element& b) const
- {
-
- NTL::div (q, a, b);
-
- return q;
- }
-
- /** @brief
- * r = remindar of a / b
- */
- inline Element& rem (Element& r, const Element& a, const Element& b) const
- {
-
- NTL::rem (r, a, b);
-
- return r;
- }
-
- /** @brief
- * a = quotient (a, b)
- */
- inline Element& quoin (Element& a, const Element& b) const
- {
-
- return a /= b;
-
- }
-
- /** @brief
- * a = quotient (a, b)
- */
- inline Element& remin (Element& x, const Element& y) const
- {
- return x %= y;
- }
-
-
- /** @brief
- * q = [a/b], r = a - b*q
- * |r| < |b|, and if r != 0, sign(r) = sign(b)
- */
- inline void quoRem (Element& q, Element& r, const Element& a, const Element& b) const
- {
-
- NTL::DivRem(q,r,a,b);
- }
-
- /** @brief
- * Test if b | a.
- */
- inline bool isDivisor (const Element& a, const Element& b) const
- {
-
- if ( NTL::IsZero (a) ) return true;
-
- else if (NTL::IsZero (b)) return false;
-
- else {
- Element r;
-
- NTL::rem (r, a, b); //weird order changed, dpritcha 2004-07-19
-
- return NTL::IsZero (r);
- }
- }
-
- /** compare two elements, a and b
- * return 1, if a > b
- * return 0, if a = b;
- * return -1. if a < b
- */
- inline long compare (const Element& a, const Element& b) const
- {
-
- return NTL::compare (a, b);
- }
-
- /** return the absolute value
- * x = abs (a);
- */
- inline Element& abs (Element& x, const Element& a) const
- {
-
- NTL::abs (x, a);
-
- return x;
- }
-
-
- static inline int getMaxModulus()
- {
- return 0;
- } // no modulus
-
- };
-
-
- template<>
- class FieldAXPY<NTL_ZZ> {
- public:
- typedef NTL_ZZ Field;
- typedef Field::Element Element;
-
- /** Constructor.
- * A faxpy object if constructed from a Field and a field element.
- * Copies of this objects are stored in the faxpy object.
- * @param F field F in which arithmetic is done
- */
- FieldAXPY (const Field &F) :
- _field (F)
- {
- _y = 0;
- }
-
- /** Copy constructor.
- * @param faxpy
- */
- FieldAXPY (const FieldAXPY<Field> &faxpy) :
- _field (faxpy._field), _y (faxpy._y)
- {}
-
- /** Assignment operator
- * @param faxpy
- */
- FieldAXPY<Field> &operator = (const FieldAXPY &faxpy)
- {
- _y = faxpy._y;
- return *this;
- }
-
- /** Add a*x to y
- * y += a*x.
- * @param a constant reference to element a
- * @param x constant reference to element x
- * allow optimal multiplication, such as integer * int
- */
- template<class Element1>
- inline Element& mulacc (const Element &a, const Element1 &x)
- {
- return _y += a * x;
- }
-
- inline Element& accumulate (const Element &t)
- {
- return _y += t;
- }
-
- /** Add a*x to y
- * y += a*x.
- * @param a constant reference to element a
- * @param x constant reference to element x
- * allow optimal multiplication, such as integer * int
- */
- template<class Element1>
- inline Element& mulacc (const Element1 &a, const Element &x)
- {
- return _y += a * x;
- }
-
- inline Element& mulacc (const Element& a, const Element& b)
- {
-
- return _y += a * b;
- }
-
-
- /** Retrieve y
- *
- * Performs the delayed modding out if necessary
- */
- inline Element &get (Element &y) { y = _y; return y; }
-
- /** Assign method.
- * Stores new field element for arithmetic.
- * @return reference to self
- * @param y constant reference to element a
- */
- inline FieldAXPY &assign (const Element& y)
- {
- _y = y;
- return *this;
- }
-
- inline void reset()
- {
- _y = 0;
- }
-
- private:
-
- /// Field in which arithmetic is done
- /// Not sure why it must be mutable, but the compiler complains otherwise
- Field _field;
-
- /// Field element for arithmetic
- Element _y;
-
- };
-}
-
-#endif //__LINBOX_ntl_zz_H
-
-
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
-// Local Variables:
-// mode: C++
-// tab-width: 8
-// indent-tabs-mode: nil
-// c-basic-offset: 8
-// End:
-
diff --git a/linbox/field/NTL/ntl-ZZ_p.h b/linbox/field/NTL/ntl-ZZ_p.h
deleted file mode 100644
index 332f96b..0000000
--- a/linbox/field/NTL/ntl-ZZ_p.h
+++ /dev/null
@@ -1,500 +0,0 @@
-/* linbox/field/ntl.h
- * Copyright (C) 1999-2005 William J Turner,
- * 2001 Bradford Hovinen
- * Copyright (C) 2011 LinBox
- *
- * Written by W. J. Turner <wjturner at acm.org>,
- * Bradford Hovinen <hovinen at cis.udel.edu>
- *
- *
- * ========LICENCE========
- * This file is part of the library LinBox.
- *
- * LinBox is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- * ========LICENCE========
- *.
- */
-
-/*! @file field/NTL/ntl-ZZ_p.h
- * @ingroup field
- * @ingroup NTL
- * @brief NO DOC
- */
-
-#ifndef __LINBOX_field_ntl_zz_p_H
-#define __LINBOX_field_ntl_zz_p_H
-
-#ifndef __LINBOX_HAVE_NTL
-#error "you need NTL here"
-#endif
-
-#include <sys/time.h>
-#include <NTL/ZZ_p.h>
-#include <NTL/ZZ.h>
-
-#include "linbox/linbox-config.h"
-#include "linbox/util/debug.h"
-
-#include "linbox/field/unparametric.h"
-#include "linbox/randiter/unparametric.h"
-#include "linbox/field/field-traits.h"
-
-
-
-#include "linbox/integer.h"
-
-namespace Givaro
-{
-
-
- /** Conversion of field element to an Integer.
- * This function assumes the output field element x has already been
- * constructed, but that it is not already initialized.
- * This done by converting to a std::string : inefficient but correct.
- * @return reference to Integer.
- * @param x reference to Integer to contain output (reference returned).
- * @param y constant reference to field element.
- */
- template <>
- Integer& Caster(Integer& x, const NTL::ZZ_p& y)
- {
- NTL::ZZ iy = y._ZZ_p__rep;
-
- long nb = NTL::NumBytes(iy);
- unsigned char *txt;
- typedef unsigned char u_char;
- txt = new u_char[nb + 68];
- // if (!txt) Error("out of memory");
- BytesFromZZ(txt, iy, nb);
-
- x = 0;
- for (long i = 0; i < nb; i++) {
- x += Integer( (unsigned long)txt[i] )<<(8*i) ;
- }
- delete [] txt;
- return x;
- }
-
- //dpritcha
- template<>
- double& Caster(double& x, const NTL::ZZ_p& y)
- {
- x = NTL::to_double(NTL::rep(y));
- return x;
- }
-
- /**\brief Initialization of field element from an Integer.
- * Behaves like C++ allocator construct.
- * This function assumes the output field element x has already been
- * constructed, but that it is not already initialized.
- * This done by converting to a std::string : inefficient but correct.
- * @return reference to field element.
- * @param x field element to contain output (reference returned).
- * @param y Integer.
- \ingroup field
- */
- template <>
- NTL::ZZ_p& Caster(NTL::ZZ_p& x, const Integer& y)
- {
- return x = NTL::to_ZZ_p( NTL::to_ZZ( (static_cast<const std::string>(y)).c_str() ) );
- }
- template <>
- NTL::ZZ_p& Caster(NTL::ZZ_p& x, const double& y)
- {
- return x = NTL::to_ZZ_p( NTL::to_ZZ((long)(y) ) );
- }
- template <>
- NTL::ZZ_p& Caster(NTL::ZZ_p& x, const int& y)
- {
- return x = NTL::to_ZZ_p( NTL::to_ZZ((long)(y) ) );
- }
- template <>
- NTL::ZZ_p& Caster(NTL::ZZ_p& x, const unsigned long& y)
- {
- return x = NTL::to_ZZ_p( NTL::to_ZZ((long)(y) ) );
- }
- template <>
- NTL::ZZ_p& Caster(NTL::ZZ_p& x, const unsigned int& y)
- {
- return x = NTL::to_ZZ_p( NTL::to_ZZ((long)(y) ) );
- }
-} // namespace Givaro
-
-
-// Namespace in which all LinBox library code resides
-namespace LinBox
-{
-
-
- class NTL_ZZ_p_Initialiser {
- public :
- NTL_ZZ_p_Initialiser( const Integer & q, size_t e = 1) {
- linbox_check(e == 1);
- if ( q > 0 )
- NTL::ZZ_p::init(NTL::to_ZZ((std::string(q)).data())); // it's an error if q not prime, e not 1
- }
-
- template <class ElementInt>
- NTL_ZZ_p_Initialiser(const ElementInt& d) {
- NTL::ZZ_p::init (NTL::to_ZZ(d));
- }
-
- NTL_ZZ_p_Initialiser (const NTL::ZZ& d) {
- NTL::ZZ_p::init(d);
- }
-
- NTL_ZZ_p_Initialiser () { }
-
- };
-
- /**
- *
- * @brief Wrapper of zz_p from NTL.
- * Uses nice mod p via floating pt trick.
- *
- */
- struct NTL_ZZ_p: public NTL_ZZ_p_Initialiser, public FFPACK::UnparametricOperations<NTL::ZZ_p> {
- typedef NTL::ZZ_p Element ;
- typedef FFPACK::UnparametricOperations<Element> Father_t ;
-
- typedef UnparametricRandIter<Element> RandIter;
-
- const Element zero,one,mOne ;
-
- /** @name NTL_ZZ_p
- * @brief Arbitrary precision integers modulus a positive integer.
-
- * While NTL allows any integer to serve as the modulus, only prime
- * moduli yield fields. Therefore, while arthmetic operations may be
- * valid for any modulus, only prime moduli are supported in this
- * implementation. The primality of the modulus will not be checked, so
- * it is the programmer's responsibility to supply a prime modulus.
- * These specializations allow the \ref UnparametricField template class to be
- * used to wrap NTL's <code>ZZ_p</code> class as a LinBox field.
- */
- //@{
- //! @param q,e
- NTL_ZZ_p(integer q, size_t e = 1) :
- NTL_ZZ_p_Initialiser(q,e),Father_t ()
- ,zero( NTL::to_ZZ_p(0)),one( NTL::to_ZZ_p(1)),mOne(-one)
- {
- // no default - allow initialization of ZZ_p directly by user.
- }
-
- //! @param d,e
- NTL_ZZ_p( NTL::ZZ d, size_t e = 1) :
- NTL_ZZ_p_Initialiser(d),Father_t()
- ,zero( NTL::to_ZZ_p(0)),one( NTL::to_ZZ_p(1)),mOne(-one)
- {
- linbox_check(e == 1);
- }
-
- //! NULL constructor
- NTL_ZZ_p() :
- NTL_ZZ_p_Initialiser(), Father_t()
- ,zero( NTL::to_ZZ_p(0)),one( NTL::to_ZZ_p(1)),mOne(-one)
- {}
- //@}
-
- Element& init(Element& x, const integer& y) const
- {
- return Caster(x,y);
- }
-
- Element& init(Element& x, const double& y) const
- {
- double z = fmod(y,NTL::to_double(Element::modulus()));
- if (z > 0) z += 0.5;
- else z -= 0.5;
- return x = NTL::to_ZZ_p(static_cast<long>(z)); //rounds towards 0
- }
-
- /** Specialization for NTL::ZZ
- *
- * @return reference to field element.
- * @param x field element to contain output (reference returned)
- * @param y NTL::ZZ.
- */
- Element& init(Element& x, const NTL::ZZ& y) const
- {
- return x = NTL::to_ZZ_p( y );
- }
-
- Element& init(Element& x) const
- {
- return x = NTL::to_ZZ_p( 0L );
- }
-
- Element& init(Element& x, const Element& y) const
- {
- return x = y ;
- }
-
- template <class ANY> //dpritcha--FIX
- Element& init(Element& x, const ANY& y) const
- {
- return x = NTL::to_ZZ_p((long)(y));
- }
-
- /** Specialization for NTL::ZZ.
- *
- * @return reference to NTL::ZZ
- * @param x NTL::ZZ to contain output (reference returned).
- * @param y constant reference to field element.
- */
- NTL::ZZ& convert(NTL::ZZ& x, const Element& y) const
- {
- return x = y._ZZ_p__rep;
- }
-
- /** Conversion of field element to an integer.
- * This function assumes the output field element x has already been
- * constructed, but that it is not already initialized.
- * This done by converting to a std::string : inefficient but correct.
- * @return reference to integer.
- * @param x reference to integer to contain output (reference returned).
- * @param y constant reference to field element.
- */
- integer& convert(integer& x, const Element& y) const
- {
- NTL::ZZ iy = y._ZZ_p__rep;
-
- long nb = NTL::NumBytes(iy);
- unsigned char *txt;
- typedef unsigned char u_char;
- txt = new u_char[nb + 68];
- // if (!txt) Error("out of memory");
- BytesFromZZ(txt, iy, nb);
-
- x = 0;
- for (long i = 0; i < nb; i++) {
- x += LinBox::integer( (unsigned long)txt[i] )<<(8*i) ;
- }
- delete [] txt;
- return x;
- };
-
- double& convert(double& x, const Element& y) const
- {
- x = NTL::to_double(NTL::rep(y));
- return x;
- }
-
- template <class ANY>
- ANY& convert(ANY& x, const Element& y) const
- {
- return x = (ANY)(rep(y));
- }
-
- static inline integer getMaxModulus()
- {
- return integer( -1 );
- }
-
- Element& pow( Element& res, const Element& x, long exp ) const
- {
- NTL::power( res, x, exp );
- return res;
- }
-
- Element& powin( Element& x, long exp ) const
- {
- return x = NTL::power(x,exp);
- }
-
- /** Cardinality.
- * Return integer representing cardinality of the field.
- * Returns the modulus of the field, which should be prime.
- * @return integer representing cardinality of the field
- */
- integer& cardinality(integer& c) const
- {
- return c = static_cast<integer>(to_long(Element::modulus()));
- }
-
- integer cardinality() const
- {
- return static_cast<integer>(to_long(Element::modulus()));
- }
-
- /** Characteristic.
- * Return integer representing characteristic of the field.
- * Returns the modulus of the field, which should be prime.
- * @return integer representing characteristic of the field.
- */
- integer& characteristic(integer& c) const
- //FIXME we shouldn't go thru long here as p may be larger than that.
- // check if NTL has cast ZZp to gmp integers.
- {
- return c = static_cast<integer>(to_long(Element::modulus()));
- }
-
- size_t& characteristic(size_t & c) const
- {
- return c = to_long(Element::modulus());
- }
-
- integer characteristic() const
- {
- return static_cast<integer>(to_long(Element::modulus()));
- }
-
- /** Multiplicative Inverse.
- * x = 1 / y
- * This function assumes both field elements have already been
- * constructed and initialized.
- * @return reference to x.
- * @param x field element (reference returned).
- * @param y field element.
- */
- Element&
- inv(Element& x, const Element& y) const
- {
- return x = NTL::inv(y);
- }
-
- /** Zero equality.
- * Test if field element is equal to zero.
- * This function assumes the field element has already been
- * constructed and initialized.
- * In this specialization, NTL's IsZero function is called.
- * @return boolean true if equals zero, false if not.
- * @param x field element.
- */
- bool isZero(const Element& x) const
- {
- return static_cast<bool>(IsZero(x));
- }
-
- /** One equality.
- * Test if field element is equal to one.
- * This function assumes the field element has already been
- * constructed and initialized.
- * In this specialization, NTL's IsOne function is called.
- * @return boolean true if equals one, false if not.
- * @param x field element.
- */
- bool isOne(const Element& x) const
- {
- return static_cast<bool>(IsOne(x));
- }
-
- /** Inplace Multiplicative Inverse.
- * x = 1 / x
- * This function assumes both field elements have already been
- * constructed and initialized.
- * @return reference to x.
- * @param x field element (reference returned).
- */
- Element& invin(Element& x) const
- {
- return x = NTL::inv(x);
- }
-
- /** Print field.
- * @return output stream to which field is written.
- * @param os output stream to which field is written.
- */
- std::ostream& write(std::ostream& os) const
- {
- return os << "unparameterized field Element with p = "
- << Element::modulus();
- }
-
- /** Print field.
- * @return output stream to which field is written.
- * @param os output stream to which field is written.
- * @param x
- */
- std::ostream &write (std::ostream &os, const Element &x) const
- {
- return FFPACK::UnparametricOperations<Element>::write(os,x);
- }
- };
-
- template <class Ring>
- struct ClassifyRing;
-
- template <>
- struct ClassifyRing<NTL_ZZ_p > {
- typedef RingCategories::ModularTag categoryTag;
- };
-
- /// Constructor for random field element generator
- template <>
- class UnparametricRandIter<NTL::ZZ_p> {
- protected:
- integer _size,_seed;
- public:
-
- UnparametricRandIter<NTL::ZZ_p> (const NTL_ZZ_p & F,
- const integer& size = 0,
- const integer& seed = 0) :
- _size(size), _seed(seed)
- {
- if (_seed == integer(0)) _seed = integer(time(NULL));
-
- integer cardinality;
- F.cardinality(cardinality);
- if (_size > cardinality)
- _size = 0;
-
-#ifdef TRACE
- std::cout << "created random generator with size " << _size
- << " and seed " << _seed << std::endl;
-#endif // TRACE
-
- // Seed random number generator
- NTL::SetSeed(NTL::to_ZZ(static_cast<long>(_seed)));
- }
-
- // UnparametricRandIter<NTL::ZZ_p>(const NTL_ZZ_p& R) :
- // _size(R._size), _seed(R._seed)
- // {
- // if(_seed == 0)
- // NTL::SetSeed(NTL::to_ZZ(time(0)));
- // else
- // NTL::SetSeed(NTL::to_ZZ( static_cast<long>(_seed)) );
- // }
-
-
- /// Random field element creator.
- NTL::ZZ_p& random(NTL::ZZ_p& x) const
- {
- if (_size == 0) {
- return x = NTL::random_ZZ_p();
- }
- else {
- return x = NTL::to_ZZ_p(NTL::RandomBnd(static_cast<long>(_size)));
- }
- }
-
-
- };
-
-
-} // namespace LinBox
-
-#endif // __LINBOX_field_ntl_zz_p_H
-
-
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
-// Local Variables:
-// mode: C++
-// tab-width: 8
-// indent-tabs-mode: nil
-// c-basic-offset: 8
-// End:
-
diff --git a/linbox/field/NTL/ntl-ZZ_pE.h b/linbox/field/NTL/ntl-ZZ_pE.h
deleted file mode 100644
index 15234e8..0000000
--- a/linbox/field/NTL/ntl-ZZ_pE.h
+++ /dev/null
@@ -1,419 +0,0 @@
-/* Copyright (C) LinBox
- *
- *
- *
- * ========LICENCE========
- * This file is part of the library LinBox.
- *
- * LinBox is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- * ========LICENCE========
- */
-
-/*! @file field/NTL/ntl-ZZ_pE.h
- * @ingroup field
- * @ingroup NTL
- * @brief NO DOC
- */
-
-#ifndef __LINBOX_field_ntl_zz_pe_H
-#define __LINBOX_field_ntl_zz_pe_H
-
-#ifndef __LINBOX_HAVE_NTL
-#error "you need NTL here"
-#endif
-
-#include <time.h>
-#include "linbox/linbox-config.h"
-#include "linbox/util/debug.h"
-#include <NTL/ZZ_pXFactoring.h>
-#include <NTL/ZZ_pE.h>
-#include <NTL/ZZ.h>
-
-#include "linbox/field/unparametric.h"
-#include "linbox/randiter/unparametric.h"
-#include "linbox/field/field-traits.h"
-
-#ifdef __LINBOX_XMLENABLED
-
-#include "linbox/util/xml/linbox-reader.h"
-#include "linbox/util/xml/linbox-writer.h"
-
-#include <iostream>
-#include <sstream>
-#include <string>
-#include <vector>
-
-#endif //__LINBOX_XMLENABLED
-
-
-
-#include "linbox/integer.h"
-
-namespace Givaro
-{
-
- template<>
- NTL::ZZ_pE& Caster(NTL::ZZ_pE &x, const Integer &y)
- {
- x=NTL::to_ZZ_pE(static_cast<long>(y));
- return x;
- }
- template<>
- NTL::ZZ_pE& Caster(NTL::ZZ_pE &x, const double &y)
- {
- x=NTL::to_ZZ_pE(static_cast<long>(y));
- return x;
- }
-
- // Rich Seagraves, 7-15-03
- // On the orders of Dr Saunders, I'm re-writing init & convert so that
- // they convert a ZZpE into a padic number, ie a0 + a1x + a2x^2 +... ->
- // a0 + a1*p + a2*p^2 + ...
- //
-
- Integer& Caster(Integer& c, const NTL::ZZ_pE& e)
- {
- NTL::ZZ_pX poly = rep(e);
- //Integer base = _p;
- Integer base = static_cast<Integer>(to_long(NTL::ZZ_p::modulus()));
- long i;
-
- c = 0;
- for(i = deg(poly); i >= 0; --i) {
- c *= base;
- c += NTL::to_long(rep(coeff(poly, i)));
- }
-
- return c;
- }
-} // namespace Givaro
-
-// Namespace in which all LinBox library code resides
-namespace LinBox
-{
-
- class NTL_ZZ_pE_Initialiser {
- public :
- NTL_ZZ_pE_Initialiser( const Integer & p, size_t k ) {
- // linbox_check(e == 1);
- // if ( q > 0 )
- // NTL::ZZ_p::init(NTL::to_ZZ((std::string(q)).data())); // it's an error if q not prime, e not 1
- NTL::ZZ_p::init(NTL::to_ZZ(std::string(p).data()));
- NTL::ZZ_pX irredPoly = NTL::BuildIrred_ZZ_pX ((long) k);
- NTL::ZZ_pE::init(irredPoly);
-
- }
-
- // template <class ElementInt>
- // NTL_ZZ_pE_Initialiser(const ElementInt& d) {
- // NTL::ZZ_p::init (NTL::to_ZZ(d));
- // }
-
- // NTL_ZZ_pE_Initialiser (const NTL::ZZ& d) {
- // NTL::ZZ_p::init(d);
- // }
-
- };
-
-
-
- /**
- * @brief Wrapper of ZZ_pE from NTL
- * Define a parameterized class to handle easily UnparametricField<NTL::ZZ_pE> field
- */
- class NTL_ZZ_pE : public NTL_ZZ_pE_Initialiser, public UnparametricOperations<NTL::ZZ_pE> {
- public:
- typedef NTL::ZZ_pE Element ;
- typedef FFPACK::UnparametricOperations<Element> Father_t ;
-
- const Element zero,one,mOne ;
-
-
- NTL_ZZ_pE (const integer &p, const integer &k) :
- NTL_ZZ_pE_Initialiser(p,k),Father_t ()
- ,zero( NTL::to_ZZ_pE(0)),one( NTL::to_ZZ_pE(1)),mOne(-one)
-
-
- {
-
- }
-
-
- bool isZero (const Element& a) const
- {
- return NTL::IsZero(a);
- }
-
-
- bool isOne (const Element& a) const
- {
- return NTL::IsOne(a);
- }
-
-
-
- integer& characteristic (integer &c) const
- {
- return c=static_cast<integer>(to_long(NTL::ZZ_p::modulus()));
- //NTL::ZZ_p::modulus();
- }
-
-
- integer& cardinality(integer& c) const
- {
- c=static_cast<integer>(to_long(NTL::ZZ_p::modulus()));
- c=pow(c,Element::degree());
- return c;
- }
-
- Element& inv(Element& x, const Element& y) const
- {
- x=NTL::to_ZZ_pE(1)/y;
- return x;
- }
-
- Element& invin(Element& x) const
- {
- x=NTL::to_ZZ_pE(1)/x;
- return x;
- }
-
-
- std::istream& read(std::istream& is, Element& x) const
- {
- long tmp;
- is>>tmp;
- x=NTL::to_ZZ_pE(tmp);
- return is;
- }
-
-
-
-#ifdef __LINBOX_XMLENABLED
-
-
- bool toTag(LinBox::Writer &W) const
- {
- std::string s;
- NTL::ZZ_pX poly = Element::modulus();
- long i;
-
- W.setTagName("field");
- W.setAttribute("implDetail", "ntl-ZZpE");
- W.setAttribute("cardinality", LinBox::Writer::numToString(s, _card));
-
- W.addTagChild();
- W.setTagName("finite");
-
- W.addTagChild();
- W.setTagName("characteristic");
- W.addNum(_p);
- W.upToParent();
-
- W.addTagChild();
- W.setTagName("extension");
- W.addNum(deg(poly) + 1);
- W.upToParent();
-
- W.addTagChild();
- W.setTagName("polynomial");
-
- for(i = 0; i <= deg(poly); ++i) {
- W.addNum(coeff(poly, i));
- }
- W.upToParent();
- W.upToParent();
- W.upToParent();
-
- return true;
- }
-
-
- std::ostream &write(std::ostream &os) const
- {
- LinBox::Writer W;
- if( toTag(W) )
- W.write(os);
-
- return os;
- }
-
-
- // Elemnt Reading & writing functions
- // BIG NOTE: It was decided that for extension fields, the elements
- // would be represented using a single number that has the following
- // property: for an element e in ZZp[x], with e = a0 + a1x + a2x^2 + ...,
- // represent e as "<cn>n</cn>" where n = a0 + a1 * p + a2 * p^2 + ...
- //
-
-
- bool toTag(LinBox::Writer &W, const Element &e) const
- {
- NTL::ZZ_pX poly = rep(e);
- NTL::ZZ accum, base = NTL::ZZ_p::modulus();
- long i;
- std::string s;
-
- accum = 0;
- for(i = deg(poly); i >= 0; --i) {
- accum *= base;
- accum += rep(coeff(poly, i));
- }
-
-
- W.setTagName("cn");
- W.addDataChild(LinBox::Writer::numToString(s, accum));
-
- return true;
- }
-
-
- std::ostream &write(std::ostream &os, const Element &e) const
- {
-
- LinBox::Writer W;
- if( toTag(W, e))
- W.write(os);
-
- return os;
- }
-
-
-
-
- bool fromTag(LinBox::Reader &R, Element &e) const
- {
- NTL::ZZ total, base = NTL::ZZ_p::modulus(), rem;
- std::stringstream ss;
-
- if(!R.expectTagName("cn") || !R.expectChildTextNum(total))
- return false;
-
- ss << "[";
- while(total > 0) {
- rem = total % base;
- total /= base;
- ss << rem;
- if(total > 0) ss << " ";
- }
-
- ss << "]";
-
- ss >> e; // use the extraction stream operator
-
- return true;
- }
-
-
- std::istream &read(std::istream &is, Element &e) const
- {
- LinBox::Reader R(is);
- if( !fromTag(R, e)) {
- is.setstate(std::istream::failbit);
- if(!R.initalized()) {
- is.setstate(std::istream::badbit);
- }
- }
-
- return is;
- }
-
-
-#endif
-
-
- }; // end of class NTL_ZZ_pE
-
-
-
-
-
-
- template <class Ring>
- struct ClassifyRing;
-
- template<>
- struct ClassifyRing<UnparametricRandIter<NTL::ZZ_pE> > {
- typedef RingCategories::ModularTag categoryTag;
- };
-
-
-
-}
-
-namespace LinBox
-{
-
-
- template<>
- class UnparametricRandIter<NTL::ZZ_pE> {
- public:
- typedef NTL::ZZ_pE Element;
- UnparametricRandIter<NTL::ZZ_pE>(const NTL_ZZ_pE & F ,
- const integer& size =0,
- const integer& seed =0
- ) :
- _size(size), _seed(seed)
- {
- if(_seed == 0)
- NTL::SetSeed(NTL::to_ZZ(time(0)));
- else
- NTL::SetSeed( NTL::to_ZZ(static_cast<long>(seed)) );
- }
-
-#ifdef __LINBOX_XMLENABLED
- UnparametricRandIter<NTL::ZZ_pE>(LinBox::Reader &R)
- {
- if(!R.expectTagName("randiter")) return;
- if(!R.expectAttributeNum("seed", _seed) || !R.expectAttributeNum("size", _size)) return;
-
- if(_seed == 0) _seed = time(NULL);
-
- NTL::SetSeed(NTL::to_ZZ(_seed));
- }
-#endif
-
-
- UnparametricRandIter<NTL::ZZ_pE>(const UnparametricRandIter<NTL::ZZ_pE>& R) :
- _size(R._size), _seed(R._seed)
-
- {
- if(_seed == 0)
- NTL::SetSeed(NTL::to_ZZ(time(0)));
- else
- NTL::SetSeed(NTL::to_ZZ( static_cast<long>(_seed)) );
- }
-
- NTL::ZZ_pE& random (NTL::ZZ_pE& x) const
- {
- NTL::random(x);
- return x;
- }
-
- protected:
- size_t _size;
- size_t _seed;
- };
-}
-#endif //__LINBOX_field_ntl_zz_pe_H
-
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
-// Local Variables:
-// mode: C++
-// tab-width: 8
-// indent-tabs-mode: nil
-// c-basic-offset: 8
-// End:
-
diff --git a/linbox/field/NTL/ntl-ZZ_pX.h b/linbox/field/NTL/ntl-ZZ_pX.h
deleted file mode 100644
index e7a0003..0000000
--- a/linbox/field/NTL/ntl-ZZ_pX.h
+++ /dev/null
@@ -1,341 +0,0 @@
-/* Copyright (C) 2005 LinBox
- * written by Daniel Roche, August 2005
- * Copyright (C) 2011 LinBox
- *
- *
- *
- * ========LICENCE========
- * This file is part of the library LinBox.
- *
- * LinBox is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- * ========LICENCE========
- */
-
-/*! @file field/NTL/ntl-ZZ_p.h
- * @ingroup field
- * @ingroup NTL
- * @brief NO DOC
- */
-
-#ifndef __LINBOX_field_ntl_zz_px_H
-#define __LINBOX_field_ntl_zz_px_H
-
-#ifndef __LINBOX_HAVE_NTL
-#error "you need NTL here"
-#endif
-
-#include <vector>
-#include <NTL/ZZ_pX.h>
-
-#include "linbox/linbox-config.h"
-#include "linbox/util/debug.h"
-
-#include "linbox/field/unparametric.h"
-#include "linbox/field/NTL/ntl-ZZ_p.h"
-#include "linbox/integer.h"
-
-
-// namespace in which all LinBox code resides
-namespace LinBox
-{
- class NTL_ZZ_pX_Initialiser {
- public :
- NTL_ZZ_pX_Initialiser( const Integer & q, size_t e = 1) {
- // linbox_check(e == 1);
- if ( q > 0 )
- NTL::ZZ_p::init(NTL::to_ZZ((std::string(q)).data())); // it's an error if q not prime, e not 1
- }
-
- // template <class ElementInt>
- // NTL_ZZ_p_Initialiser(const ElementInt& d) {
- // NTL::ZZ_p::init (NTL::to_ZZ(d));
- // }
-
- // NTL_ZZ_p_Initialiser (const NTL::ZZ& d) {
- // NTL::ZZ_p::init(d);
- // }
-
- };
-
- /** Ring (in fact, a unique factorization domain) of polynomial with
- * coefficients in class NTL_ZZ_p (integers mod a wordsize prime).
- * All the same functions as any other ring, with the addition of:
- * Coeff (type), CoeffField (type), getCoeffField, setCoeff, getCoeff,
- * leadCoeff, deg
- */
- class NTL_ZZ_pX : public NTL_ZZ_pX_Initialiser, public FFPACK::UnparametricOperations<NTL::ZZ_pX> {
- public:
- typedef NTL::ZZ_pX Element ;
- typedef FFPACK::UnparametricOperations<Element> Father_t ;
- typedef UnparametricRandIter<Element> RandIter;
-
- const Element zero,one,mOne ;
-
-
- typedef NTL_ZZ_p CoeffField;
- typedef NTL::ZZ_p Coeff;
- // typedef NTL::ZZ_pX Element;
-
- /** Standard LinBox field constructor. The paramters here
- * (prime, exponent) are only used to initialize the coefficient field.
- */
- NTL_ZZ_pX( const integer& p, size_t e = 1 ) :
- NTL_ZZ_pX_Initialiser(p,e),Father_t ()
- , zero( NTL::to_ZZ_pX(0)),one( NTL::to_ZZ_pX(1)),mOne(-one)
- , _CField(p,e)
- {}
-
- /** Constructor from a coefficient field */
- NTL_ZZ_pX( CoeffField cf ) :
- NTL_ZZ_pX_Initialiser(cf.cardinality()),Father_t ()
- ,zero( NTL::to_ZZ_pX(0)),one( NTL::to_ZZ_pX(1)),mOne(-one)
- ,_CField(cf)
- {}
-
- /** Initialize p to the constant y (p = y*x^0) */
- template <class ANY>
- Element& init( Element& p, const ANY& y ) const
- {
- Coeff temp;
- _CField.init( temp, y );
- return p = temp;
- }
-
- /** Initialize p to the constant y (p = y*x^0) */
- Element& init( Element& p, const Coeff& y ) const
- {
- return p = y;
- }
-
- /** Initialize p from a vector of coefficients.
- * The vector should be ordered the same way NTL does it: the front
- * of the vector corresponds to the trailing coefficients, and the back
- * of the vector corresponds to the leading coefficients. That is,
- * v[i] = coefficient of x^i.
- */
- template <class ANY>
- Element& init( Element& p, const std::vector<ANY>& v ) const
- {
- p = 0;
- Coeff temp;
- for( long i = 0; i < (long)v.size(); ++i ) {
- _CField.init( temp, v[ (size_t) i ] );
- if( !_CField.isZero(temp) )
- NTL::SetCoeff( p, i, temp );
- }
- return p;
- }
-
- /** Initialize p from a vector of coefficients.
- * The vector should be ordered the same way NTL does it: the front
- * of the vector corresponds to the trailing coefficients, and the back
- * of the vector corresponds to the leading coefficients. That is,
- * v[i] = coefficient of x^i.
- */
- Element& init( Element& p, const std::vector<Coeff>& v ) const
- {
- p = 0;
- for( long i = 0; i < (long)v.size(); ++i )
- NTL::SetCoeff( p, i, v[ (size_t) i ] );
- return p;
- }
-
- /** Convert p to a vector of coefficients.
- * The vector will be ordered the same way NTL does it: the front
- * of the vector corresponds to the trailing coefficients, and the back
- * of the vector corresponds to the leading coefficients. That is,
- * v[i] = coefficient of x^i.
- */
- template< class ANY >
- std::vector<ANY>& convert( std::vector<ANY>& v, const Element& p ) const
- {
- v.clear();
- ANY temp;
- for( long i = 0; i <= this->deg(p); ++i ) {
- _CField.convert( temp, NTL::coeff( p, i ) );
- v.push_back( temp );
- }
- return v;
- }
-
- /** Convert p to a vector of coefficients.
- * The vector will be ordered the same way NTL does it: the front
- * of the vector corresponds to the trailing coefficients, and the back
- * of the vector corresponds to the leading coefficients. That is,
- * v[i] = coefficient of x^i.
- */
- std::vector<Coeff>& convert( std::vector<Coeff>& v, const Element& p ) const
- {
- v.clear();
- for( long i = 0; i <= (long)this->deg(p); ++i )
- v.push_back( NTL::coeff(p,i) );
- return v;
- }
-
- /** Test if an element equals zero */
- bool isZero( const Element& x ) const
- {
- return ( (this->deg(x) == 0) &&
- ( _CField.isZero( NTL::ConstTerm(x) ) ) );
- }
-
- /** Test if an element equals one */
- bool isOne( const Element& x ) const
- {
- return ( (this->deg(x) == 0) &&
- ( _CField.isOne( NTL::ConstTerm(x) ) ) );
- }
-
- /** The LinBox field for coefficients */
- const CoeffField& getCoeffField() const
- {
- return _CField;
- }
-
- /** Get the degree of a polynomial
- * Unlike NTL, deg(0)=0.
- */
- size_t deg( const Element& p ) const
- {
- long temp = NTL::deg(p);
- if( temp == -1 ) return 0;
- else return static_cast<size_t>(temp);
- }
-
- /** r will be set to the reverse of p. */
- Element& rev( Element& r, const Element& p ) {
- NTL::reverse(r,p);
- return r;
- }
-
- /** r is itself reversed. */
- Element& revin( Element& r ) {
- return r = NTL::reverse(r);
- }
-
- /** Get the leading coefficient of this polynomial. */
- Coeff& leadCoeff( Coeff& c, const Element& p ) const
- {
- c = NTL::LeadCoeff(p);
- return c;
- }
-
- /** Get the coefficient of x^i in a given polynomial */
- Coeff& getCoeff( Coeff& c, const Element& p, size_t i ) const
- {
- c = NTL::coeff( p, (long)i );
- return c;
- }
-
- /** Set the coefficient of x^i in a given polynomial */
- Element& setCoeff( Element& p, size_t i, const Coeff& c ) const
- {
- NTL::SetCoeff(p,(long)i,c);
- return p;
- }
-
- /** Get the quotient of two polynomials */
- Element& quo( Element& res, const Element& a, const Element& b ) const
- {
- NTL::div(res,a,b);
- return res;
- }
-
- /** a = quotient of a, b */
- Element& quoin( Element& a, const Element& b ) const
- {
- return a /= b;
- }
-
- /** Get the remainder under polynomial division */
- Element& rem( Element& res, const Element& a, const Element& b ) const
- {
- NTL::rem(res,a,b);
- return res;
- }
-
- /** a = remainder of a,b */
- Element& remin( Element& a, const Element& b ) const
- {
- return a %= b;
- }
-
- /** Get the quotient and remainder under polynomial division */
- void quorem( Element& q, Element& r,
- const Element& a, const Element& b ) const
- {
- NTL::DivRem(q,r,a,b);
- }
-
- /** Get characteristic of the field - same as characteristic of
- * coefficient field. */
- integer& characteristic( integer& c ) const
- {
- return _CField.characteristic(c);
- }
-
- /** Get the cardinality of the field. Since the cardinality is
- * infinite, by convention we return -1.
- */
- integer& cardinality( integer& c ) const
- {
- return c = static_cast<integer>(-1);
- }
-
- static inline integer getMaxModulus()
- {
- return CoeffField::getMaxModulus();
- }
-
- /** Write a description of the field */
- // Oustide of class definition so write(ostream&,const Element&) from
- // UnparametricField still works.
- std::ostream& write( std::ostream& os ) const
- {
- return os << "Polynomial ring using NTL::ZZ_pX";
- }
-
- std::ostream &write (std::ostream &os, const Element &x) const { return FFPACK::UnparametricOperations<Element>::write(os,x); }
-
-
- private:
- /** Conversion to scalar types doesn't make sense and should not be
- * used. Use getCoeff or leadCoeff to get the scalar values of
- * specific coefficients, and then convert them using coeffField()
- * if needed.
- */
- template< class ANY >
- ANY& convert( ANY& x, const Element& y ) const
- {
- return x;
- }
-
- CoeffField _CField;
- }; // end of class NTL_ZZ_pX
-
-
-} // end of namespace LinBox
-
-#endif // __LINBOX_field_ntl_zz_px_H
-
-
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
-// Local Variables:
-// mode: C++
-// tab-width: 8
-// indent-tabs-mode: nil
-// c-basic-offset: 8
-// End:
-
diff --git a/linbox/field/NTL/ntl-lzz_p.h b/linbox/field/NTL/ntl-lzz_p.h
deleted file mode 100644
index 17dd533..0000000
--- a/linbox/field/NTL/ntl-lzz_p.h
+++ /dev/null
@@ -1,348 +0,0 @@
-/* linbox/field/ntl-lzz_p.h
- * Copyright (C) 1999-2005 W. J. Turner,
- * 2001 Bradford Hovinen
- * Copyright (C) 2011 LinBox
- *
- * Written by W. J. Turner <wjturner at acm.org>,
- * Bradford Hovinen <hovinen at cis.udel.edu>
- *
- *
- * ========LICENCE========
- * This file is part of the library LinBox.
- *
- * LinBox is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- * ========LICENCE========
- *.
- *
- */
-
-/*! @file field/NTL/ntl-lzz_p.h
- * @ingroup field
- * @ingroup NTL
- * @brief NO DOC
- */
-
-#ifndef __LINBOX_field_ntl_lzz_p_H
-#define __LINBOX_field_ntl_lzz_p_H
-
-#ifndef __LINBOX_HAVE_NTL
-#error "you need NTL here"
-#endif
-
-#include <time.h>
-#include "linbox/linbox-config.h"
-#include "linbox/util/debug.h"
-#include <NTL/lzz_p.h>
-#include <NTL/ZZ.h>
-
-#include "linbox/field/unparametric.h"
-#include "linbox/randiter/unparametric.h"
-#include "linbox/field/field-traits.h"
-#include "linbox/integer.h"
-
-#include "linbox/integer.h"
-
-namespace Givaro
-{
-
- /** Initialization of field element from an integer.
- * This Uses NTL's <code>to_zz_p</code> function.
- *
- * @return reference to field element.
- * @param x field element to contain output (reference returned).
- * @param y Integer.
- */
- template <>
- NTL::zz_p& Caster(NTL::zz_p& x, const Integer& y)
- {
- return x = NTL::to_zz_p( y%NTL::zz_p::modulus() );
- }
- template <>
- NTL::zz_p& Caster(NTL::zz_p& x, const double& y)
- {
- return x = NTL::to_zz_p((long)(y)%NTL::zz_p::modulus());
- }
-
- /** Conversion of field element to an Integer.
- * This function assumes the output field element x has already been
- * constructed, but that it is not already initialized.
- * For now, this is done by converting the element type to a C++
- * long and then to the Integer type through the use of static cast and
- * NTL's to_long function.
- * This, of course, assumes such static casts are possible.
- * This function should be changed in the future to avoid using long.
- * @return reference to Integer.
- * @param x reference to Integer to contain output (reference returned).
- * @param y constant reference to field element.
- */
- template <>
- Integer& Caster(Integer& x, const NTL::zz_p& y)
- {
- return x = static_cast<Integer>(rep(y));
- }
-} // namespace Givaro
-
-// Namespace in which all LinBox library code resides
-namespace LinBox
-{
-
- class NTL_zz_p_Initialiser {
- public :
- NTL_zz_p_Initialiser( const Integer & q, size_t e = 1) {
- linbox_check(e == 1);
- if ( q > 0 )
- // NTL::zz_p::init(NTL::to_ZZ((std::string(q)).data())); // it's an error if q not prime, e not 1
- NTL::zz_p::init(q); // it's an error if q not prime, e not 1
- }
-
- template <class ElementInt>
- NTL_zz_p_Initialiser(const ElementInt& d) {
- NTL::zz_p::init (NTL::to_ZZ(d));
- }
-
- NTL_zz_p_Initialiser () { }
-
- };
-
- /**
- * \brief long ints modulo a positive integer.
- *
- * While NTL allows any int to serve as the modulus, only prime
- * moduli yield fields. The primality of the modulus will not be checked, so
- * it is the programmer's responsibility to supply a prime modulus if a field is
- * wanted.
- * These specializations allow the \ref UnparametricField template class to be
- * used to wrap NTL's <code>zz_p</code> class as a LinBox field.
- * Uses nice trick for mod p via floating point.
- \ingroup field
- */
- struct NTL_zz_p: public NTL_zz_p_Initialiser, public FFPACK::UnparametricOperations<NTL::zz_p> {
- typedef NTL::zz_p Element ;
- typedef FFPACK::UnparametricOperations<Element> Father_t ;
- typedef UnparametricRandIter<NTL::zz_p> RandIter;
-
- const Element zero,one,mOne ;
-
-
- //public UnparametricField<Element> {
- NTL_zz_p(integer p, size_t e = 1) :
- NTL_zz_p_Initialiser(p,e),Father_t ()
- ,zero( NTL::to_zz_p(0)),one( NTL::to_zz_p(1)),mOne(-one)
- {}
-
- NTL_zz_p() :
- NTL_zz_p_Initialiser(2,1), Father_t()
- ,zero( NTL::to_zz_p(0)),one( NTL::to_zz_p(1)),mOne(-one)
- {}
-
- Element& init(Element& x, const double& y) const
- {
- double z = fmod(y,(double)Element::modulus());
- if (z > 0) z += 0.5;
- else z -= 0.5;
- return x = NTL::to_zz_p(static_cast<long>(z)); //rounds towards 0
- }
-
- Element &init (Element &x, const integer &y=0) const
- {
- NTL::ZZ tmp= NTL::to_ZZ(std::string(y).data());
- return x = NTL::to_zz_p(tmp);
- }
-
- template <class ANY>
- Element& init(Element& x, const ANY& y) const
- {
- return x = NTL::to_zz_p((long)(y));
- }
-
- template <class ANY>
- ANY& convert(ANY& x, const Element& y) const
- {
- return x = (ANY)(rep(y));
- }
-
- static inline integer getMaxModulus()
- {
- return integer( NTL_SP_BOUND );
- }
-
- Element& pow( Element& res, const Element& x, long exp ) const
- {
- NTL::power( res, x, exp );
- return res;
- }
-
- Element& powin( Element& x, long exp ) const
- {
- return x = NTL::power(x,exp);
- }
- /** Cardinality.
- * Return integer representing cardinality of the field.
- * Returns the modulus of the field, which should be prime.
- * @return integer representing cardinality of the field
- */
-
- integer& cardinality(integer& c) const
- {
- return c = static_cast<integer>(Element::modulus());
- }
-
- integer cardinality() const
- {
- return static_cast<integer>(Element::modulus());
- }
-
- /** Characteristic.
- * Return integer representing characteristic of the field.
- * Returns the modulus of the field, which should be prime.
- * @return integer representing characteristic of the field.
- */
-
- integer& characteristic(integer& c) const
- {
- return c = static_cast<integer>(Element::modulus());
- }
-
- integer characteristic() const
- {
- return static_cast<integer>(Element::modulus());
- }
-
- /** Multiplicative Inverse.
- * x = 1 / y
- * This function assumes both field elements have already been
- * constructed and initialized.
- * @return reference to x.
- * @param x field element (reference returned).
- * @param y field element.
- */
- Element&
- inv(Element& x, const Element& y) const
- {
- return x = NTL::inv(y);
- }
-
- /** Zero equality.
- * Test if field element is equal to zero.
- * This function assumes the field element has already been
- * constructed and initialized.
- * In this specialization, NTL's IsZero function is called.
- * @return boolean true if equals zero, false if not.
- * @param x field element.
- */
- bool isZero(const Element& x) const
- {
- return static_cast<bool>(NTL::IsZero(x));
- }
-
- /** One equality.
- * Test if field element is equal to one.
- * This function assumes the field element has already been
- * constructed and initialized.
- * In this specialization, NTL's IsOne function is called.
- * @return boolean true if equals one, false if not.
- * @param x field element.
- */
- bool isOne(const Element& x) const
- {
- return static_cast<bool>(NTL::IsOne(x));
- }
-
- /** Inplace Multiplicative Inverse.
- * x = 1 / x
- * This function assumes both field elements have already been
- * constructed and initialized.
- * @return reference to x.
- * @param x field element (reference returned).
- */
- Element& invin(Element& x) const
- {
- return x = NTL::inv(x);
- }
-
- /** Print field.
- * @return output stream to which field is written.
- * @param os output stream to which field is written.
- */
- std::ostream& write(std::ostream& os) const
- {
- return os << "unparameterized field Element with p = "
- << Element::modulus();
- }
-
- std::ostream &write (std::ostream &os, const Element &x) const { return FFPACK::UnparametricOperations<Element>::write(os,x); }
- };
-
- template <class Ring>
- struct ClassifyRing;
-
- template <>
- struct ClassifyRing<NTL_zz_p> {
- typedef RingCategories::ModularTag categoryTag;
- };
-
- template<>
- class UnparametricRandIter<NTL::zz_p> {
- public:
- /// Constructor for random field element generator
-
- UnparametricRandIter<NTL::zz_p> (const NTL_zz_p & F=NTL_zz_p(),
- const integer& size=0,
- const integer& seed=0) :
- _size(size), _seed(seed)
- {
- if (_seed == integer(0)) _seed = integer(time(NULL));
-
- integer cardinality;
- F.cardinality(cardinality);
- if (_size > cardinality)
- _size = 0;
-
-#ifdef TRACE
- std::cout << "created random generator with size " << _size
- << " and seed " << _seed << std::endl;
-#endif // TRACE
-
- // Seed random number generator
- NTL::SetSeed(NTL::to_ZZ(static_cast<long>(_seed)));
- }
-
- /// Random field element creator.
- NTL::zz_p& random(NTL::zz_p& x) const
- {
- if (_size == 0) {
- return x = NTL::random_zz_p();
- }
- else {
- return x = NTL::to_zz_p(NTL::RandomBnd(static_cast<long>(_size)));
- }
- }
- protected :
- integer _size,_seed ;
- };
-
-} // namespace LinBox
-
-#endif // __LINBOX_field_ntl_lzz_p_H
-
-
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
-// Local Variables:
-// mode: C++
-// tab-width: 8
-// indent-tabs-mode: nil
-// c-basic-offset: 8
-// End:
-
diff --git a/linbox/field/NTL/ntl-lzz_pE.h b/linbox/field/NTL/ntl-lzz_pE.h
deleted file mode 100644
index bc81612..0000000
--- a/linbox/field/NTL/ntl-lzz_pE.h
+++ /dev/null
@@ -1,268 +0,0 @@
-/* linbox/field/ntl-z_pE.h
- * Copyright (C) 2004 Pascal Giorgi
- * Copyright (C) 2011 LinBox
- *
- * Written by Pascal Giorgi <pascal.giorgi at ens-lyon.fr>
- *
- * Modified by W. J. Turner <wjturner at acm.org>
- *
- * ========LICENCE========
- * This file is part of the library LinBox.
- *
- * LinBox is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- * ========LICENCE========
- */
-
-/*! @file field/NTL/ntl-lzz_pE.h
- * @ingroup field
- * @ingroup NTL
- * @brief NO DOC
- */
-
-#ifndef __LINBOX_field_ntl_lzz_pe_H
-#define __LINBOX_field_ntl_lzz_pe_H
-
-#ifndef __LINBOX_HAVE_NTL
-#error "you need NTL here"
-#endif
-
-#include <NTL/lzz_pXFactoring.h>
-#include <NTL/lzz_pE.h>
-#include <time.h>
-#include "linbox/linbox-config.h"
-#include "linbox/util/debug.h"
-
-#include "linbox/field/unparametric.h"
-#include "linbox/randiter/unparametric.h"
-#include "linbox/field/field-traits.h"
-
-
-
-#include "linbox/integer.h"
-
-namespace Givaro
-{
- template<>
- NTL::zz_pE& Caster(NTL::zz_pE &x, const Integer &y)
- {
- x=NTL::to_zz_pE(static_cast<long>(y));
- return x;
- }
- template<>
- NTL::zz_pE& Caster(NTL::zz_pE &x, const double &y)
- {
- x=NTL::to_zz_pE(static_cast<long>(y));
- return x;
- }
-
- template<>
- Integer& Caster (Integer& x, const NTL::zz_pE &y) {
- NTL::zz_pX poly = rep(y);
- Integer base = static_cast<Integer>(NTL::zz_p::modulus());
- long i = deg(poly)+1;
- x = 0;
- for( ; i-- ; ) {
- x *= base;
- x += NTL::to_long(rep(coeff(poly, i)));
- }
- return x;
- }
-} // namespace Givaro
-
-
-
-// Namespace in which all LinBox library code resides
-namespace LinBox
-{
-
- //! use ZZ_pEBak mechanism too ?
- class NTL_zz_pE_Initialiser {
- public :
- NTL_zz_pE_Initialiser( const Integer & p, const Integer & k) {
- NTL::zz_p::init( (long) p);
- NTL::zz_pX irredPoly = NTL::BuildIrred_zz_pX ((long) k);
- NTL::zz_pE::init(irredPoly);
-
- }
-
- // template <class ElementInt>
- // NTL_zz_pE_Initialiser(const ElementInt& d) {
- // NTL::ZZ_p::init (NTL::to_ZZ(d));
- // }
-
- // NTL_zz_pE_Initialiser (const NTL::ZZ& d) {
- // NTL::ZZ_p::init(d);
- // }
-
- };
-
-
-
-
-
- /*! @brief zz_pE
- * Define a parameterized class to easily handle UnparametricField<NTL::zz_pE> field
- */
-
- /// \brief for large cardinality, small prime. \ingroup field
- class NTL_zz_pE : public NTL_zz_pE_Initialiser, public FFPACK::UnparametricOperations<NTL::zz_pE> {
- public:
- typedef NTL::zz_pE Element ;
- typedef FFPACK::UnparametricOperations<Element> Father_t ;
- typedef UnparametricRandIter<Element> RandIter;
-
- const Element zero,one,mOne ;
-
- NTL_zz_pE (const integer &p, const integer &k) :
- NTL_zz_pE_Initialiser(p,k),Father_t ()
- ,zero( NTL::to_zz_pE(0)),one( NTL::to_zz_pE(1)),mOne(-one)
-
- {
-
- }
-
- Element& random (Element& x) const
- {
- NTL::random(x);
- return x;
- }
-
-
- bool isZero (const Element& a) const
- {
- return NTL::IsZero(a);
- }
-
-
- bool isOne (const Element& a) const
- {
- return NTL::IsOne(a);
- }
-
-
-
- integer& characteristic (integer &c) const
- {
- return c = static_cast<integer>(NTL::zz_p::modulus());
- }
-
-
- integer& cardinality(integer& c) const
- {
- NTL::ZZ card = Element::cardinality();
- long b = NumBytes(card);
- unsigned char* byteArray;
- byteArray = new unsigned char[(size_t)b ];
- BytesFromZZ(byteArray, card, b);
-
- integer base(256);
- c= integer(0);
-
- for(long i = b - 1; i >= 0; --i) {
- c *= base;
- c += integer(byteArray[i]);
- }
- delete [] byteArray;
-
- return c;
- }
-
-
-
- Element& inv(Element& x, const Element& y) const
- {
- x=one/y;
- return x;
- }
-
- Element& invin(Element& x) const
- {
- x=one/x;
- return x;
- }
-
-
-
- std::istream& read(std::istream& is, Element& x) const
- {
- long tmp;
- is>>tmp;
- x=NTL::to_zz_pE(tmp);
- return is;
- }
- }; // end o class NTL_zz_pE
-
-
-
-
-
-
- template <class Ring>
- struct ClassifyRing;
-
- template<>
- struct ClassifyRing<UnparametricRandIter<NTL::zz_pE> > {
- typedef RingCategories::ModularTag categoryTag;
- };
-
- template<>
- class UnparametricRandIter<NTL::zz_pE> {
- public:
- typedef NTL::zz_pE Element;
- UnparametricRandIter<NTL::zz_pE>(const NTL_zz_pE & F ,
- const size_t& size = 0,
- const size_t& seed = 0
- ) :
- _size(size), _seed(seed)
- {
- if(_seed == 0)
- NTL::SetSeed(NTL::to_ZZ(time(0)));
- else
- NTL::SetSeed(NTL::to_ZZ(_seed));
- }
-
- UnparametricRandIter<NTL::zz_pE>(const UnparametricRandIter<NTL::zz_pE>& R) :
- _size(R._size), _seed(R._seed)
-
- {
- if(_seed == 0)
- NTL::SetSeed(NTL::to_ZZ(time(0)));
- else
- NTL::SetSeed(NTL::to_ZZ(_seed));
- }
-
- Element& random (Element& x) const
- {
- NTL::random(x);
- return x;
- }
-
- protected:
- size_t _size;
- size_t _seed;
- };
-}
-
-#endif //__LINBOX_ntl_lzz_pe_H
-
-
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
-// Local Variables:
-// mode: C++
-// tab-width: 8
-// indent-tabs-mode: nil
-// c-basic-offset: 8
-// End:
-
diff --git a/linbox/field/NTL/ntl-lzz_pX.h b/linbox/field/NTL/ntl-lzz_pX.h
deleted file mode 100644
index 74167d4..0000000
--- a/linbox/field/NTL/ntl-lzz_pX.h
+++ /dev/null
@@ -1,329 +0,0 @@
-/* Copyright (C) 2005 LinBox
- * Copyright (C) 2011 LinBox
- *
- *
- * Written by Daniel Roche, August 2005
- *
- * ========LICENCE========
- * This file is part of the library LinBox.
- *
- * LinBox is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- * ========LICENCE========
- */
-
-/*! @file field/NTL/ntl-lzz_pX.h
- * @ingroup field
- * @ingroup NTL
- * @brief NO DOC
- */
-
-#ifndef __LINBOX_field_ntl_lzz_px_H
-#define __LINBOX_field_ntl_lzz_px_H
-
-#ifndef __LINBOX_HAVE_NTL
-#error "you need NTL here"
-#endif
-
-#include <vector>
-#include <NTL/lzz_pX.h>
-
-
-#include "linbox/linbox-config.h"
-#include "linbox/util/debug.h"
-
-#include "linbox/field/unparametric.h"
-#include "linbox/field/NTL/ntl-lzz_p.h"
-#include "linbox/integer.h"
-
-
-// Namespace in which all LinBox code resides
-namespace LinBox
-{
- class NTL_zz_pX_Initialiser {
- public :
- NTL_zz_pX_Initialiser( const Integer & q, size_t e = 1) {
- linbox_check(e == 1);
- if ( q > 0 )
- NTL::zz_p::init(q); // it's an error if q not prime, e not 1
- }
-
- // template <class ElementInt>
- // NTL_zz_pX_Initialiser(const ElementInt& d) {
- // NTL::ZZ_p::init (NTL::to_ZZ(d));
- // }
-
- NTL_zz_pX_Initialiser () { }
-
- };
-
- /** Ring (in fact, a unique factorization domain) of polynomial with
- * coefficients in class NTL_zz_p (integers mod a wordsize prime).
- * All the same functions as any other ring, with the addition of:
- * Coeff (type), CoeffField (type), getCoeffField, setCoeff, getCoeff,
- * leadCoeff, deg
- */
- class NTL_zz_pX : public NTL_zz_pX_Initialiser, public FFPACK::UnparametricOperations<NTL::zz_pX> {
- public:
- typedef NTL::zz_pX Element ;
- typedef FFPACK::UnparametricOperations<Element> Father_t ;
- typedef UnparametricRandIter<Element> RandIter;
-
-
- typedef NTL_zz_p CoeffField;
- typedef NTL::zz_p Coeff;
- // typedef NTL::zz_pX Element;
-
- const Element zero,one,mOne ;
-
-
- /** Standard LinBox field constructor. The paramters here
- * (prime, exponent) are only used to initialize the coefficient field.
- */
- NTL_zz_pX( const integer& p, size_t e = 1 ) :
- // UnparametricField<NTL::zz_pX>(p, e), _CField(p,e)
- NTL_zz_pX_Initialiser(p,e),Father_t ()
- , zero( NTL::to_zz_pX(0)),one( NTL::to_zz_pX(1)),mOne(-one)
- , _CField(p,e)
- {}
-
- /** Constructor from a coefficient field */
- NTL_zz_pX( CoeffField cf ) :
- NTL_zz_pX_Initialiser(cf.cardinality()),Father_t ()
- ,zero( NTL::to_zz_pX(0)),one( NTL::to_zz_pX(1)),mOne(-one)
- ,_CField(cf)
- {}
-
- /** Initialize p to the constant y (p = y*x^0) */
- template <class ANY>
- Element& init( Element& p, const ANY& y ) const
- {
- Coeff temp;
- _CField.init( temp, y );
- return p = temp;
- }
-
- /** Initialize p to the constant y (p = y*x^0) */
- Element& init( Element& p, const Coeff& y ) const
- {
- return p = y;
- }
-
- /** Initialize p from a vector of coefficients.
- * The vector should be ordered the same way NTL does it: the front
- * of the vector corresponds to the trailing coefficients, and the back
- * of the vector corresponds to the leading coefficients. That is,
- * v[i] = coefficient of x^i.
- */
- template <class ANY>
- Element& init( Element& p, const std::vector<ANY>& v ) const
- {
- p = 0;
- Coeff temp;
- for( long i = 0; i < (long)v.size(); ++i ) {
- _CField.init( temp, v[ (size_t) i ] );
- if( !_CField.isZero(temp) )
- NTL::SetCoeff( p, i, temp );
- }
- return p;
- }
-
- /** Initialize p from a vector of coefficients.
- * The vector should be ordered the same way NTL does it: the front
- * of the vector corresponds to the trailing coefficients, and the back
- * of the vector corresponds to the leading coefficients. That is,
- * v[i] = coefficient of x^i.
- */
- Element& init( Element& p, const std::vector<Coeff>& v ) const
- {
- p = 0;
- for( long i = 0; i < (long)v.size(); ++i )
- NTL::SetCoeff( p, i, v[ (size_t) i ] );
- return p;
- }
-
- /** Convert p to a vector of coefficients.
- * The vector will be ordered the same way NTL does it: the front
- * of the vector corresponds to the trailing coefficients, and the back
- * of the vector corresponds to the leading coefficients. That is,
- * v[i] = coefficient of x^i.
- */
- template< class ANY >
- std::vector<ANY>& convert( std::vector<ANY>& v, const Element& p ) const
- {
- v.clear();
- ANY temp;
- for( long i = 0; i <= this->deg(p); ++i ) {
- _CField.convert( temp, NTL::coeff( p, i ) );
- v.push_back( temp );
- }
- return v;
- }
-
- /** Convert p to a vector of coefficients.
- * The vector will be ordered the same way NTL does it: the front
- * of the vector corresponds to the trailing coefficients, and the back
- * of the vector corresponds to the leading coefficients. That is,
- * v[i] = coefficient of x^i.
- */
- std::vector<Coeff>& convert( std::vector<Coeff>& v, const Element& p ) const
- {
- v.clear();
- for( long i = 0; i <= (long)this->deg(p); ++i )
- v.push_back( NTL::coeff(p,i) );
- return v;
- }
-
- /** Test if an element equals zero */
- bool isZero( const Element& x ) const
- {
- return ( (this->deg(x) == 0) &&
- ( _CField.isZero( NTL::ConstTerm(x) ) ) );
- }
-
- /** Test if an element equals one */
- bool isOne( const Element& x ) const
- {
- return ( (this->deg(x) == 0) &&
- ( _CField.isOne( NTL::ConstTerm(x) ) ) );
- }
-
- /** The LinBox field for coefficients */
- const CoeffField& getCoeffField() const
- { return _CField; }
-
- /** Get the degree of a polynomial
- * Unlike NTL, deg(0)=0.
- */
- size_t deg( const Element& p ) const
- {
- long temp = NTL::deg(p);
- if( temp == -1 ) return 0;
- else return static_cast<size_t>(temp);
- }
-
- /** r will be set to the reverse of p. */
- Element& rev( Element& r, const Element& p ) {
- NTL::reverse(r,p);
- return r;
- }
-
- /** r is itself reversed. */
- Element& revin( Element& r ) {
- return r = NTL::reverse(r);
- }
-
- /** Get the leading coefficient of this polynomial. */
- Coeff& leadCoeff( Coeff& c, const Element& p ) const
- {
- c = NTL::LeadCoeff(p);
- return c;
- }
-
- /** Get the coefficient of x^i in a given polynomial */
- Coeff& getCoeff( Coeff& c, const Element& p, size_t i ) const
- {
- c = NTL::coeff( p, (long)i );
- return c;
- }
-
- /** Set the coefficient of x^i in a given polynomial */
- Element& setCoeff( Element& p, size_t i, const Coeff& c ) const
- {
- NTL::SetCoeff(p,(long)i,c);
- return p;
- }
-
- /** Get the quotient of two polynomials */
- Element& quo( Element& res, const Element& a, const Element& b ) const
- {
- NTL::div(res,a,b);
- return res;
- }
-
- /** a = quotient of a, b */
- Element& quoin( Element& a, const Element& b ) const
- {
- return a /= b;
- }
-
- /** Get the remainder under polynomial division */
- Element& rem( Element& res, const Element& a, const Element& b ) const
- {
- NTL::rem(res,a,b);
- return res;
- }
-
- /** a = remainder of a,b */
- Element& remin( Element& a, const Element& b ) const
- {
- return a %= b;
- }
-
- /** Get the quotient and remainder under polynomial division */
- void quorem( Element& q, Element& r,
- const Element& a, const Element& b ) const
- {
- NTL::DivRem(q,r,a,b);
- }
-
- /** Get characteristic of the field - same as characteristic of
- * coefficient field. */
- integer& characteristic( integer& c ) const
- { return _CField.characteristic(c); }
-
- /** Get the cardinality of the field. Since the cardinality is
- * infinite, by convention we return -1.
- */
- integer& cardinality( integer& c ) const
- { return c = static_cast<integer>(-1); }
-
- static inline integer getMaxModulus()
- { return CoeffField::getMaxModulus(); }
- /** Write a description of the field */
- // Oustide of class definition so write(ostream&,const Element&) from
- // UnparametricField still works.
- std::ostream& write( std::ostream& os ) const
- {
- return os << "Polynomial ring using NTL::zz_pX";
- }
-
- private:
- /** Conversion to scalar types doesn't make sense and should not be
- * used. Use getCoeff or leadCoeff to get the scalar values of
- * specific coefficients, and then convert them using coeffField()
- * if needed.
- */
- template< class ANY >
- ANY& convert( ANY& x, const Element& y ) const
- { return x; }
-
- CoeffField _CField;
- }; // end of class NTL_zz_pX
-
-
-
-} // end of namespace LinBox
-
-#endif // __LINBOX_field_ntl_lzz_px_H
-
-
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
-// Local Variables:
-// mode: C++
-// tab-width: 8
-// indent-tabs-mode: nil
-// c-basic-offset: 8
-// End:
-
diff --git a/linbox/field/PID-double.h b/linbox/field/PID-double.h
deleted file mode 100644
index 790f126..0000000
--- a/linbox/field/PID-double.h
+++ /dev/null
@@ -1,347 +0,0 @@
-/* linbox/field/PID-double.h
- * Copyright (C) 2004 Pascal Giorgi
- *
- * Written by :
- * Pascal Giorgi pascal.giorgi at ens-lyon.fr
- *
- *
- * ========LICENCE========
- * This file is part of the library LinBox.
- *
- * LinBox is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- * ========LICENCE========
- */
-
-
-/*! @file field/PID-double.h
- * @ingroup field
- * @brief NO DOC
- */
-
-#ifndef __LINBOX_pid_double_H
-#define __LINBOX_pid_double_H
-
-#include "linbox/field/unparametric.h"
-#include "linbox/field/field-traits.h"
-
-namespace LinBox
-{
-
-
- /*! \ingroup integers
- * @brief NO DOC
- */
- class PID_double : public UnparametricField<double> {
-
- public:
-
- typedef double Element;
-
- /// test if unit (1 or -1)
- inline static bool isUnit (const Element& x)
- {
-
- return (x == double(1)) || (x== double(-1));
- }
-
- /// return absolute value
- inline static Element& abs (Element& x, const Element& a)
- {
- x= (a>0)? a: -a;
- return x;
- }
-
- /// return absolute value
- inline static Element abs (const Element& a)
- {
- return (a>0)? a: -a;
- }
-
- /** compare two elements, a and b.
- * return 1, if a > b
- * return 0, if a = b;
- * return -1. if a < b
- */
- inline long compare (const Element& a, const Element& b) const
- {
-
- return (a>b)? 1: ((a<b)? -1 : 0);
- }
-
-
- /** @brief gcd (g, a, b).
- * return g = gcd (a, b)
- */
- inline static Element& gcd (Element& g, const Element& a, const Element& b)
- {
-
- double u, v, q, r;
- u = a; v = b;
-
- if (u < 0) {
- u = -u;
- }
-
- if (v < 0) {
- v = -v;
- }
-
- while (v != 0) {
- q = floor(u/v);
- r = u -q*v;
- u = v;
- v = r;
- }
-
- g = u;
-
- return g;
- }
-
- /** @brief gcding (g, b).
- * return g = gcd (g, b)
- */
- inline static Element& gcdin (Element& g, const Element& b)
- {
-
- gcd(g, g, b);
-
- return g;
- }
-
- /** @brief xgcd (g, s, t, a, b)
- * g = gcd(a, b) = a*s + b*t.
- * The coefficients s and t are defined according to the standard
- * Euclidean algorithm applied to |a| and |b|, with the signs then
- * adjusted according to the signs of a and b.
- */
- inline static Element& xgcd (Element& g, Element& s, Element& t, const Element& a, const Element& b)
- {
- double u, v, u0, v0, u1, v1, u2, v2, q, r;
-
- int aneg = 0, bneg = 0;
- u = a; v = b;
- if (u < 0) {
- u = -u;
- aneg = 1;
- }
-
- if (v < 0) {
- v = -v;
- bneg = 1;
- }
-
- u1 = 1; v1 = 0;
- u2 = 0; v2 = 1;
-
-
- while (v != 0) {
- q = floor(u / v);
- r = u -q*v;
- u = v;
- v = r;
- u0 = u2;
- v0 = v2;
- u2 = u1 - q*u2;
- v2 = v1- q*v2;
- u1 = u0;
- v1 = v0;
- }
-
- if (aneg)
- u1 = -u1;
-
- if (bneg)
- v1 = -v1;
-
- g = u;
- s = u1;
- t = v1;
-
- return g;
- }
-
- /** @brief lcm (c, a, b)
- * c = lcm (a, b)
- */
- inline static Element& lcm (Element& c, const Element& a, const Element& b)
- {
-
- if ((a==0.) || (b==0.)) return c = 0.;
-
- else {
- Element g;
-
- gcd (g, a, b);
-
- c= a*b;
- c /= g;
-
- if (c<0) c = -c; //no abs for double, dpritcha
- // c=abs (c);
-
- return c;
- }
- }
-
- /** @brief lcmin (l, b)
- * l = lcm (l, b)
- */
- inline static Element& lcmin (Element& l, const Element& b)
- {
-
- if ((l==0.) || (b==0.)) return l = 0.;
-
- else {
- Element g;
-
- gcd (g, l, b);
-
- l*= b;
- l/= g;
-
- //l=abs (l);
- if (l < 0) l = -l;
- return l;
- }
-
- }
-
-
- inline static long reconstructRational (Element& a, Element& b, const Element& x, const Element& m,
- const Element& a_bound, const Element& b_bound)
- {
-
- double u, v, u0, u1, u2, q, r;
-
- u1 = 0;
- u2 = 1;
- u = m; v = x;
-
- while ((v != 0) && ( v > a_bound)) {
- q = floor(u / v);
- r = u -q*v;
- u = v;
- v = r;
- u0 = u2;
- u2 = u1 - q*u2;
- u1 = u0;
- }
-
- if (u2 < 0.) { u2= -u2; v=-v;}
- a = v;
- b = u2;
-
- return (b > b_bound)? 0: 1;
-
- }
-
-
- /** @brief quo (q, x, y)
- * q = floor (x/y);
- */
- inline static Element& quo (Element& q, const Element& a, const Element& b)
- {
- return q = floor (a/b);
- }
-
- /** @brief rem (r, a, b)
- * r = remindar of a / b
- */
- inline static Element& rem (Element& r, const Element& a, const Element& b)
- {
- Element q;
- return r= a - quo(q,a,b)*b ;
- }
-
- /** @brief quoin (a, b)
- * a = quotient (a, b)
- */
- inline static Element& quoin (Element& a, const Element& b)
- {
- return quo(a,a,b);
- }
-
- /** @brief quoin (a, b)
- * a = quotient (a, b)
- */
- inline static Element& remin (Element& a, const Element& b)
- {
- return rem(a,a,b);
- }
-
-
- /** @brief quoRem (q, r, a, b)
- * q = [a/b], r = a - b*q
- * |r| < |b|, and if r != 0, sign(r) = sign(b)
- */
- inline static void quoRem (Element& q, Element& r, const Element& a, const Element& b)
- {
- quo(q,a,b);
- r = a - q*b;
- }
-
- /** @brief isDivisor (a, b)
- * Test if a | b.
- */
- inline static bool isDivisor (const Element& a, const Element& b)
- {
- double r;
- return rem(r,a,b)==0.;
- }
-
- // some specializations and conversions
- double& convert(double& x, const Element& y) const
- {
- return x=y;
- }
-
- Element& init(Element& x, const double& y) const
- {
- return x=y;
- }
-
- integer& convert(integer& x, const Element& y) const
- {
- return x=(integer)y;
- }
-
- Element& init(Element& x, const integer& y) const
- {
- return x=(double)y;
- }
-
-
- }; //end of class PID_double
-
- template<>
- std::ostream &UnparametricField<double>::write (std::ostream &os) const
- {
- return os << "unparam<double>";
- }
-
-} //end of namespace LinBox
-#endif //__LINBOX_pid_double_H
-
-
-
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
-// Local Variables:
-// mode: C++
-// tab-width: 8
-// indent-tabs-mode: nil
-// c-basic-offset: 8
-// End:
-
diff --git a/linbox/field/PID-integer.h b/linbox/field/PID-integer.h
deleted file mode 100644
index 19262c5..0000000
--- a/linbox/field/PID-integer.h
+++ /dev/null
@@ -1,576 +0,0 @@
-/* linbox/field/PID-integer.h
- * Copyright (C) 2004 Pascal Giorgi
- *
- * Written by :
- * Pascal Giorgi pascal.giorgi at ens-lyon.fr
- *
- *
- * ========LICENCE========
- * This file is part of the library LinBox.
- *
- * LinBox is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- * ========LICENCE========
- */
-
-/** @file field/PID-integer.h
- * @ingroup field
- * @brief NO DOC
-*/
-
-#ifndef __LINBOX_pid_integer_H
-#define __LINBOX_pid_integer_H
-
-#include <limits.h>
-#include <iostream>
-// #include <gmp++/gmp++_int.h>
-#include "linbox/integer.h"
-#include "linbox/field/unparametric.h"
-#include "linbox/field/field-traits.h"
-#include "linbox/field/gmp-rational.h"
-
-
-namespace LinBox
-{
-
- template <class Ring>
- struct ClassifyRing;
-
- /*! \ingroup integers
- * @brief Domain for integer operations.
- */
- class PID_integer : public LinBox::UnparametricField<integer>
- {
-
- public:
-
- //PID_integer(){}
- //PID_integer& operator=(PID_integer& K) { return *this; }
-
- typedef integer Element;
-
- /// axpyin
- inline Element& axpyin (integer &r, const integer& a, const integer& x) const
- {
- return Integer::axpyin(r,a,x);
- }
-
- /// axmyin
- inline Element& axmyin (integer &r, const integer& a, const integer& x) const
- {
- return Integer::axmyin(r,a,x);
- }
-
- /// maxpyin
- inline Element& maxpyin (integer &r, const integer& a, const integer& x) const
- {
- // return Integer::maxpyin(r,a,x);
- return Integer::axpyin(r,-a,x);
- }
-
- /// axpy
- inline Element& axpy (integer &r, const integer& a, const integer& x, const integer& y) const
- {
- return Integer::axpy(r,a,x,y);//r = ax+y
- }
-
- /// isUnit
- inline bool isUnit (const Element& x) const
- {
-
- return (x == Element(1)) || (x== Element(-1));
- }
-
- /// abs
- inline Element& abs(Element& x, const Element& a) const
- {
- x= (a>0)? a: -a;
- return x;
- }
-
- /// abs
- inline Element abs(const Element& a) const
- {
- return (a>0)? a: -a;
- }
-
- /** compare two elements, a and b.
- * return 1, if a > b
- * return 0, if a = b;
- * return -1. if a < b
- */
- inline long compare (const Element& a, const Element& b) const
- {
-
- return (a>b)? 1: ((a<b)? -1 : 0);
- }
-
- /** @brief gcd (g, a, b)
- * return g = gcd (a, b)
- */
- inline Element& gcd (Element& g, const Element& a, const Element& b) const
- {
- return Givaro::gcd(g,a,b);
- }
-
- /** @brief gcdin(g, b)
- * return g = gcd (g, b)
- */
- inline Element& gcdin (Element& g, const Element& b) const
- {
- gcd(g, g, b);
- return g;
- }
-
- /** @brief xgcd (g, s, t, a, b)
- * g = gcd(a, b) = a*s + b*t.
- * The coefficients s and t are defined according to the standard
- * Euclidean algorithm applied to |a| and |b|, with the signs then
- * adjusted according to the signs of a and b.
- */
- inline Element& xgcd (Element& g, Element& s, Element& t, const Element& a, const Element& b) const
- {
-#if (GIVARO_VERSION < 30500) // newer givaro has gcd with constant signature "guvab"
- return Givaro::gcd(g,a,b,s,t);
-#else
- return Givaro::gcd(g,s,t,a,b);
-#endif
- }
-
- /** @brief lcm (c, a, b)
- * c = lcm (a, b)
- */
- inline Element& lcm (Element& c, const Element& a, const Element& b) const
- {
-
- if ((a==Element(0)) || (b==Element(0))) return c = Element(0);
-
- else {
- Element g;
- gcd (g, a, b);
- c= a*b;
- c /= g;
- c=abs (c);
- return c;
- }
- }
-
- /** @brief lcmin (l, b)
- * l = lcm (l, b)
- */
- inline Element& lcmin (Element& l, const Element& b) const
- {
-
- if ((l==Element(0)) || (b==Element(0))) return l = Element(0);
-
- else {
- Element g;
- gcd (g, l, b);
- l*= b;
- l/= g;
- l=abs (l);
- return l;
- }
- }
-
- inline void reconstructRational (Element& a, Element& b, const Element& x, const Element& m) const
- {
- RationalReconstruction(a,b, x, m, Givaro::sqrt(m), true, true);
- }
-
- inline void reconstructRational (Element& a, Element& b, const Element& x, const Element& m, const Element& bound) const
- {
- RationalReconstruction(a,b, x, m, bound, true, true);
- }
-
- inline long reconstructRational (Element& a, Element& b,
- const Element& x, const Element& m,
- const Element& a_bound, const Element& b_bound) const
- {
- Element bound = x/b_bound;
- // if (bound>a_bound) std::cerr << "a_bound: " << a_bound << ", x/b_bound: " << bound << std::endl;
-
- RationalReconstruction(a,b,x,m, (bound>a_bound?bound:a_bound), true, false);
- return (b > b_bound)? 0: 1;
- }
-
-
-
- /** @brief quo (q, x, y)
- * q = floor (x/y);
- */
- inline Element& quo (Element& q, const Element& a, const Element& b) const
- {
- return q = a/b;
- }
-
- /** @brief rem (r, a, b)
- * r = remindar of a / b
- */
- inline Element& rem (Element& r, const Element& a, const Element& b) const
- {
- return Integer::mod(r,a,b);
- }
-
- /** @brief quoin (a, b)
- * a = quotient (a, b)
- */
- inline Element& quoin (Element& a, const Element& b) const
- {
- return quo(a,a,b);
- }
-
- /** @brief quoin (a, b)
- * a = quotient (a, b)
- */
- inline Element& remin (Element& a, const Element& b) const
- {
- return rem(a,a,b);
- }
-
-
- /** @brief quoRem (q, r, a, b)
- * q = [a/b], r = a - b*q
- * |r| < |b|, and if r != 0, sign(r) = sign(b)
- */
- inline void quoRem (Element& q, Element& r, const Element& a, const Element& b) const
- {
- quo(q,a,b);
- r = a - q*b;
- }
-
- /** @brief isDivisor (a, b)
- * Test if b | a.
- */
- inline bool isDivisor (const Element& a, const Element& b) const
- {
- Element r;
- return rem(r,a,b)==Element(0);
- }
-
- /** @brief sqrt(x,y)
- * x=floor(sqrt(y))
- */
- inline Element& sqrt(Element& x, const Element& y) const
- {
- return Givaro::sqrt(x,y);
- }
-
- inline Element powtwo(Element& z, const Element& x) const
- {
- z = 1;
- if (x < 0) return z;
- if (x < ULONG_MAX) {
- z<<=(unsigned long int)x;
- //cout << "z"<< z;
- return z;
- }
- else {
- Element n,m;
- quoRem(n,m,x,(Element)(LONG_MAX-1));
- for (int i=0; i < n; ++i) {
- z <<=(long int)(LONG_MAX-1);
- }
- z <= (long int)m;
- return z;
- }
-
- //for (Element i=0; i < x; ++i) {
- // z <<= 1;
- //}
- //return z; // BB peut pas !
- }
-
- inline Element logtwo(Element& z, const Element& x) const
- {
- z = x.bitsize()-1;
- return z;
- /*
- if (x<1) return z=-1;
- z = 0;
- Element cur = x;
- cur >>=1;//cout << "cur" << cur;
- while (cur > 0) {
- //cout << "cur" << cur;
- ++z;
- cur >>=1;
- }
- //cout << "z" << z;
- return z;
- */
- }
-
-
-
- // some specializations and conversions
- inline double& convert(double& x, const Element& y) const
- {
- return x= (double)y;
- }
-
- inline Element& init(Element& x, const double& y) const
- {
- return x=Element(y);
- }
-
- inline Element& init(Element& x, const unsigned long& y) const
- {
- return x=Element(y);
- }
-
- inline Element& init(Element& x, const long& y) const
- {
- return x=Element(y);
- }
-
- inline Element& init(Element& x, const unsigned int & y) const
- {
- return x=Element(y);
- }
-
- inline Element& init(Element& x, const int& y) const
- {
- return x=Element(y);
- }
-
-
-
- inline integer& convert(integer& x, const Element& y) const
- {
- return x=y;
- }
-
- inline Element& init(Element& x, const integer& y = 0) const
- {
- return x=y;
- }
- /*
- * aniau at astronet.pl 06/2009 initialization form GMPRationalElement
- */
- inline Element& init(Element& x, const GMPRationalElement& q) const
- {
- GMPRationalField Q;
- return Q.convert(x,q);
- }
-
- inline std::ostream &write (std::ostream &os) const
- {
- return os << "PID_integer extends unparam<integer>";
- }
-
- inline std::ostream &write (std::ostream &os, const Integer& I) const
- {
- return os << I;
- }
-
- protected:
- /*! Rational number reconstruction.
- * \f$\frac{n}{d} \equiv f \mod m\f$, with \f$\vert n
- \vert <k\f$ and \f$0 < \vert d \vert \leq \frac{f}{k}\f$.
- * @bib
- * - von zur Gathen & Gerhard, <i>Modern Computer Algebra</i>,
- * 5.10, Cambridge Univ. Press 1999
- */
- inline void RationalReconstruction( Element& a, Element& b,
- const Element& f, const Element& m,
- const Element& k,
- bool reduce, bool recursive ) const
- {
- Element x(f);
- if (x<0) {
- if ((-x)>m)
- x %= m;
- if (x<0)
- x += m;
- }
- else {
- if (x>m)
- x %= m;
- }
-
- if (x == 0) {
- a = 0;
- b = 1;
- }
- else {
- bool res = ratrecon(a,b,x,m,k, reduce, recursive);
- if (recursive)
- for( Element newk = k + 1; (!res) && (newk<f) ; ++newk)
- res = ratrecon(a,b,x,m,newk,reduce, true);
- }
- }
-
- // Precondition f is suppposed strictly positive and strictly less than m
- inline bool ratrecon( Element& num, Element& den,
- const Element& f, const Element& m,
- const Element& k,
- bool reduce, bool recursive ) const
- {
-
- //std::cerr << "RatRecon : " << f << " " << m << " " << k << std::endl;
- Element r0, t0, q, u;
- r0=m;
- t0=0;
- num=f;
- den=1;
- while(num>=k)
- {
- q = r0;
- q /= num; // r0/num
- u = num;
- num = r0; // num <-- r0
- r0 = u; // r0 <-- num
- maxpyin(num,u,q);
- //Integer::maxpyin(num,u,q);
- if (num == 0) return false;
-
- u = den;
- den = t0; // num <-- r0
- t0 = u; // r0 <-- num
- maxpyin(den,u,q);
- //Integer::maxpyin(den,u,q);
- }
-
- if (reduce) {
- // [GG, MCA, 1999] Theorem 5.26
-
- // (ii)
- Element gg;
- if (gcd(gg,num,den) != 1) {
-
- Element ganum, gar2;
- for( q = 1, ganum = r0-num, gar2 = r0 ; (ganum < k) && (gar2>=k); ++q ) {
- ganum -= num;
- gar2 -= num;
- }
-
- maxpyin(r0,q,num);
- //Integer::maxpyin(r0,q,num);
- maxpyin(t0,q,den);
- //Integer::maxpyin(t0,q,den);
-
- if (t0 < 0) {
- num = -r0;
- den = -t0;
- }
- else {
- num = r0;
- den = t0;
- }
-
- // if (t0 > m/k)
- if (den > m/k) {
- if (!recursive)
- std::cerr
- << "*** Error *** No rational reconstruction of "
- << f
- << " modulo "
- << m
- << " with denominator <= "
- << (m/k)
- << std::endl;
- }
- if (gcd(gg,num,den) != 1) {
- if (!recursive)
- std::cerr
- << "*** Error *** There exists no rational reconstruction of "
- << f
- << " modulo "
- << m
- << " with |numerator| < "
- << k
- << std::endl
- << "*** Error *** But "
- << num
- << " = "
- << den
- << " * "
- << f
- << " modulo "
- << m
- << std::endl;
- return false;
- }
- }
- }
- // (i)
- if (den < 0) {
- Integer::negin(num);
- Integer::negin(den);
- }
-
- // std::cerr << "RatRecon End " << num << "/" << den << std::endl;
- return true;
- }
-
- }; //end of class PID_integer
-
- template<>
- struct ClassifyRing<PID_integer> {
- typedef RingCategories::IntegerTag categoryTag;
- };
-
-
-#if 0 // Specialization for Homomorphism
- template <class _Target>
- class Hom<PID_integer, _Target>
- {
- public:
- typedef PID_integer Source;
- typedef _Target Target;
- typedef typename Source::Element SrcElt;
- typedef typename Target::Element Elt;
-
- Hom(const Source& S, const Target& T) :
- _source (S), _target(T)
- {}
-
- Elt& image(Elt& t, const SrcElt& s) {
- if (s.bitsize() > 52 )
- _target.init(t,s);
- else
- _target.init(t, (double)s);
- return t;
- }
-
- SrcElt& preimage(SrcElt& s, const Elt& t) {
- _source.convert(s,t);
- return s;
- }
-
- const Source& source() { return _source;}
-
- const Target& target() { return _target;}
-
- protected:
- double tmp;
- Source _source;
- Target _target;
-
- };
-
-#endif
-} //end of namespace LinBox
-
-#endif //__LINBOX_pid_integer_H
-
-
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
-// Local Variables:
-// mode: C++
-// tab-width: 8
-// indent-tabs-mode: nil
-// c-basic-offset: 8
-// End:
-
diff --git a/linbox/field/PID-ntl-zz_p.h b/linbox/field/PID-ntl-zz_p.h
deleted file mode 100644
index e48429d..0000000
--- a/linbox/field/PID-ntl-zz_p.h
+++ /dev/null
@@ -1,93 +0,0 @@
-/* Copyright (C) 2010 LinBox
- * written by bds
- *
- *
- *
- * ========LICENCE========
- * This file is part of the library LinBox.
- *
- * LinBox is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- * ========LICENCE========
- */
-
-
-#ifndef __LINBOX_ntl_pid_zz_p_H
-#define __LINBOX_ntl_pid_zz_p_H
-
-#include "linbox/field/NTL/ntl-lzz_p.h"
-#include "linbox/util/debug.h"
-#include "linbox/linbox-config.h"
-#include <NTL/ZZ.h>
-#include "linbox/field/field-traits.h"
-
-// Namespace in which all LinBox library code resides
-namespace LinBox
-{
- template <class Ring>
- struct ClassifyRing;
-
- class NTL_PID_zz_p;
-
- template<>
- struct ClassifyRing<NTL_PID_zz_p> {
- typedef RingCategories::ModularTag categoryTag;
- };
-
- /** \brief extend Wrapper of zz_p from NTL. Add PID functions
- \ingroup field
- */
- struct NTL_PID_zz_p: public NTL_zz_p
- {
- protected: long _modulus;
- public:
- NTL_PID_zz_p(long pp, int exp = 1) :
- NTL_zz_p(pp), _modulus(pp)
- {
- if( exp != 1 ) throw PreconditionFailed(__func__,__FILE__,__LINE__,"exponent must be 1");
- }
-
- Element& gcd(Element& g, const Element& a, const Element& b) const
- { g = NTL::GCD(NTL::rep(a), NTL::rep(b));
- g = NTL::GCD(NTL::rep(g), _modulus);
- return g;
- }
-
- Element& gcdin(Element& a, const Element& b) const
- { return gcd(a,a, b); }
-
- bool isUnit(const Element& a) const
- { return 1 == NTL::GCD(NTL::rep(a), _modulus); }
-
- Element& div(Element& c, const Element& a, const Element& b) const
- { return c = NTL::rep(a)/NTL::GCD(NTL::rep(a),NTL::rep(b)); }
- Element& divin(Element& a, const Element& b) const
- { return div(a, a, b); }
-
- static inline double getMaxModulus() { return (double)NTL_SP_BOUND; }
- };
-
-} // namespace LinBox
-
-#endif // __LINBOX_ntl_pid_zz_p_H
-
-
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
-// Local Variables:
-// mode: C++
-// tab-width: 8
-// indent-tabs-mode: nil
-// c-basic-offset: 8
-// End:
-
diff --git a/linbox/field/PIR-modular-int32.h b/linbox/field/PIR-modular-int32.h
deleted file mode 100644
index ae1168a..0000000
--- a/linbox/field/PIR-modular-int32.h
+++ /dev/null
@@ -1,700 +0,0 @@
-/* Copyright (C) 2010 LinBox
- *
- *
- *
- * ========LICENCE========
- * This file is part of the library LinBox.
- *
- * LinBox is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- * ========LICENCE========
- */
-
-
-#ifndef __LINBOX_pir_modular_int32_H
-#define __LINBOX_pir_modular_int32_H
-
-#include "linbox/field/modular.h"
-#ifndef LINBOX_MAX_INT
-#define LINBOX_MAX_INT 2147483647
-#endif
-
-#ifndef LINBOX_MAX_MODULUS
-#define LINBOX_MAX_MODULUS 1073741824
-#endif
-#include "linbox/field/field-traits.h"
-
-// Namespace in which all LinBox code resides
-namespace LinBox
-{
-
- template< class Element>
- class PIRModular;
-
- template< class Element >
- class ModularRandIter;
-
- template<class Field>
- class DotProductDomain;
-
- template<class Field>
- class FieldAXPY;
-
- template<class Field>
- class MVProductDomain;
-
- template <class Ring>
- struct ClassifyRIng;
-
- template <class Element>
- struct ClassifyRIng<PIRModular<Element> >;
-
- template <>
- struct ClassifyRIng<PIRModular<int32_t> > {
- typedef RingCategories::ModularTag categoryTag;
- };
-
- /// \ingroup ring
- template <>
- class PIRModular<int32_t> : public Modular<int32_t> {
-
- public:
-
- friend class FieldAXPY<PIRModular<int32_t> >;
-
- friend class DotProductDomain<PIRModular<int32_t> >;
-
- friend class MVProductDomain<PIRModular<int32_t> >;
-
- typedef int32_t Element;
-
- typedef ModularRandIter<int32_t> RandIter;
-
- //default modular field,taking 65521 as default modulus
- PIRModular () :
- Modular<int32_t>(65521)
- {
- }
-
- PIRModular (int32_t value, int32_t exp = 1) :
- Modular<int32_t>(value,exp)
- { }
-
-
- /** PIR functions, gcd, xgcd, dxgcd */
-
- Element& gcd (Element& g, const Element& a, const Element& b) const
- {
-
- GCD (g, a, b);
-
- return g;
-
- }
-
- Element& xgcd (Element& g, Element& s, Element& t, const Element& a, const Element& b) const
- {
-
- XGCD (g, s, t, a, b);
-
- if (s < 0)
- s += modulus;
-
- if (t < 0)
- t += modulus;
-
-
- return g;
- }
-
- Element& dxgcd (Element& g, Element& s, Element& t, Element& a1, Element& b1,
- const Element& a, const Element& b) const
- {
-
-
- xgcd (g, s, t, a, b);
-
- if (g != 0) {
-
- a1 = a / g;
-
- b1 = b / g;
- }
-
- else {
-
- a1 = s;
-
- b1 = t;
- }
-
-
- return g;
-
- }
-
- bool isDivisor (const Element& a, const Element& b) const
- {
-
- Element g;
-
- if (a == 0) return false;
-
- else if (b == 0) return true;
-
- else {
-
- gcd (g, a, modulus);
-
- return (b % g) == 0;
- }
-
- }
-
- Element& div (Element& d, const Element& a, const Element& b) const
- {
-
- Element g, s;
-
- HXGCD (g, s, b, modulus);
-
- Element r;
-
- r = a % g;
-
- if (r != 0) throw PreconditionFailed(__func__,__FILE__,__LINE__,"Div: not dividable");
-
- else {
-
- d = a / g;
-
- mulin (d, s);
- }
-
- return d;
-
- }
-
- Element& normal (Element& a, const Element& b) const
- {
-
- if (b == 0) return a = 0;
- else {
- GCD (a, b, modulus);
-
- return a;
- }
- }
-
-
- Element& gcdin (Element& a, const Element& b) const
- {
-
- GCD (a, a, b);
-
-
- return a;
- }
-
- Element& normalIn (Element& a) const
- {
- if (a == 0) return a;
- else {
- GCD (a, a, modulus);
-
- return a;
- }
-
- }
-
-
- Element& divin (Element& a, const Element& b) const
- {
-
- div (a, a, b);
-
- return a;
- }
-
-
- bool isUnit(const Element& a) const
- {
-
- Element g;
-
- GCD (g, a, modulus);
-
-
- // std::cout << a << " is a unit or not " << g;
-
- // std::cout << "modulus = " << modulus <<"\n";
-
- return g == 1;
-
- }
-
- private:
- static void GCD (int32_t& g, int32_t a, int32_t b) {
-
- int32_t u, v, /* q,*/ r;
-
- if (a < 0) {
- if (a < -LINBOX_MAX_INT) throw PreconditionFailed(__func__,__FILE__,__LINE__,"XGCD: integer overflow");
- a = -a;
-
- }
-
- if (b < 0) {
- if (b < -LINBOX_MAX_INT) throw PreconditionFailed(__func__,__FILE__,__LINE__,"XGCD: integer overflow");
- b = -b;
- }
-
- u = a; v = b;
-
- while (v != 0) {
- // q = u / v;
- r = u % v;
- u = v;
- v = r;
- }
-
- g = u;
-
- }
-
- static void XGCD(int32_t& d, int32_t& s, int32_t& t, int32_t a, int32_t b) {
- int32_t u, v, u0, v0, u1, v1, u2, v2, q, r;
-
- int32_t aneg = 0, bneg = 0;
-
- if (a < 0) {
- if (a < -LINBOX_MAX_INT) throw PreconditionFailed(__func__,__FILE__,__LINE__,"XGCD: integer overflow");
- a = -a;
- aneg = 1;
- }
-
- if (b < 0) {
- if (b < -LINBOX_MAX_INT) throw PreconditionFailed(__func__,__FILE__,__LINE__,"XGCD: integer overflow");
- b = -b;
- bneg = 1;
- }
-
- u1 = 1; v1 = 0;
- u2 = 0; v2 = 1;
- u = a; v = b;
-
- while (v != 0) {
- q = u / v;
- r = u % v;
- u = v;
- v = r;
- u0 = u2;
- v0 = v2;
- u2 = u1 - q*u2;
- v2 = v1- q*v2;
- u1 = u0;
- v1 = v0;
- }
-
- if (aneg)
- u1 = -u1;
-
- if (bneg)
- v1 = -v1;
-
- d = u;
- s = u1;
- t = v1;
- }
-
-
- static void HXGCD (int32_t& d, int32_t& s, int32_t a, int32_t b) {
-
- int32_t u, v, u0, u1, u2, q, r;
-
- int32_t aneg = 0;
-
- if (a < 0) {
- if (a < -LINBOX_MAX_INT) throw PreconditionFailed(__func__,__FILE__,__LINE__,"XGCD: integer overflow");
- a = -a;
- aneg = 1;
- }
-
- if (b < 0) {
- if (b < -LINBOX_MAX_INT) throw PreconditionFailed(__func__,__FILE__,__LINE__,"XGCD: integer overflow");
- b = -b;
- }
-
- u1 = 1;
- u2 = 0;
- u = a; v = b;
-
- while (v != 0) {
- q = u / v;
- r = u % v;
- u = v;
- v = r;
- u0 = u2;
-
- u2 = u1 - q*u2;
-
- u1 = u0;
-
- }
-
- if (aneg)
- u1 = -u1;
-
-
- d = u;
- s = u1;
-
- }
-
- };
-
- template <>
- class FieldAXPY<PIRModular<int32_t> > {
- public:
-
- typedef int32_t Element;
- typedef PIRModular<int32_t> Field;
-
- FieldAXPY (const Field &F) :
- _field (F),_y(0)
- {}
-
-
- FieldAXPY (const FieldAXPY &faxpy) :
- _field (faxpy._field), _y (0)
- {}
-
- FieldAXPY<PIRModular<int32_t> > &operator = (const FieldAXPY &faxpy) {
- _field = faxpy._field;
- _y = faxpy._y;
- return *this;
- }
-
- inline uint64_t& mulacc (const Element &a, const Element &x) {
- uint64_t t = (uint64_t) a * (uint64_t) x;
- _y += t;
- if (_y < t)
- return _y += _field._two64;
- else
- return _y;
- }
-
- inline uint64_t& accumulate (const Element &t) {
- _y += t;
- if (_y < (uint64_t)t)
- return _y += _field._two64;
- else
- return _y;
- }
-
- inline Element& get (Element &y) {
- y = Element(_y % (uint64_t) _field.modulus);
- return y;
- }
-
- inline FieldAXPY &assign (const Element y) {
- _y = y;
- return *this;
- }
-
- inline void reset() {
- _y = 0;
- }
-
-
- protected:
- Field _field;
- uint64_t _y;
- };
-
-
- template <>
- class DotProductDomain<PIRModular<int32_t> > : public virtual VectorDomainBase<PIRModular<int32_t> > {
-
- public:
- typedef int32_t Element;
- DotProductDomain (const PIRModular<int32_t> &F) :
- VectorDomainBase<PIRModular<int32_t> > (F)
- {}
-
-
- protected:
- template <class Vector1, class Vector2>
- inline Element &dotSpecializedDD (Element &res, const Vector1 &v1, const Vector2 &v2) const
- {
-
- typename Vector1::const_iterator i;
- typename Vector2::const_iterator j;
-
- uint64_t y = 0;
- uint64_t t;
-
- for (i = v1.begin (), j = v2.begin (); i < v1.end (); ++i, ++j) {
- t = ( (uint64_t) *i ) * ( (uint64_t) *j );
- y += t;
-
- if (y < t)
- y += _field._two64;
- }
-
- y %= (uint64_t) _field.modulus;
- return res = Element(y);
-
- }
-
- template <class Vector1, class Vector2>
- inline Element &dotSpecializedDSP (Element &res, const Vector1 &v1, const Vector2 &v2) const
- {
- typename Vector1::first_type::const_iterator i_idx;
- typename Vector1::second_type::const_iterator i_elt;
-
- uint64_t y = 0;
- uint64_t t;
-
- for (i_idx = v1.first.begin (), i_elt = v1.second.begin (); i_idx != v1.first.end (); ++i_idx, ++i_elt) {
- t = ( (uint64_t) *i_elt ) * ( (uint64_t) v2[*i_idx] );
- y += t;
-
- if (y < t)
- y += _field._two64;
- }
-
-
- y %= (uint64_t) _field.modulus;
-
- return res = (Element)y;
- }
- };
-
-
- // Specialization of MVProductDomain for int32_t modular field
- template <>
- class MVProductDomain<PIRModular<int32_t> > {
- public:
-
- typedef int32_t Element;
-
- protected:
- template <class Vector1, class Matrix, class Vector2>
- inline Vector1 &mulColDense
- (const VectorDomain<PIRModular<int32_t> > &VD, Vector1 &w, const Matrix &A, const Vector2 &v) const
- {
- return mulColDenseSpecialized
- (VD, w, A, v, typename VectorTraits<typename Matrix::Column>::VectorCategory ());
- }
-
- private:
- template <class Vector1, class Matrix, class Vector2>
- Vector1 &mulColDenseSpecialized
- (const VectorDomain<PIRModular<int32_t> > &VD, Vector1 &w, const Matrix &A, const Vector2 &v,
- VectorCategories::DenseVectorTag) const;
- template <class Vector1, class Matrix, class Vector2>
- Vector1 &mulColDenseSpecialized
- (const VectorDomain<PIRModular<int32_t> > &VD, Vector1 &w, const Matrix &A, const Vector2 &v,
- VectorCategories::SparseSequenceVectorTag) const;
- template <class Vector1, class Matrix, class Vector2>
- Vector1 &mulColDenseSpecialized
- (const VectorDomain<PIRModular<int32_t> > &VD, Vector1 &w, const Matrix &A, const Vector2 &v,
- VectorCategories::SparseAssociativeVectorTag) const;
- template <class Vector1, class Matrix, class Vector2>
- Vector1 &mulColDenseSpecialized
- (const VectorDomain<PIRModular<int32_t> > &VD, Vector1 &w, const Matrix &A, const Vector2 &v,
- VectorCategories::SparseParallelVectorTag) const;
-
- mutable std::vector<uint64_t> _tmp;
- };
-
- template <class Vector1, class Matrix, class Vector2>
- Vector1 &MVProductDomain<PIRModular<int32_t> >::mulColDenseSpecialized
- (const VectorDomain<PIRModular<int32_t> > &VD, Vector1 &w, const Matrix &A, const Vector2 &v,
- VectorCategories::DenseVectorTag) const
- {
-
- linbox_check (A.coldim () == v.size ());
- linbox_check (A.rowdim () == w.size ());
-
- typename Matrix::ConstColIterator i = A.colBegin ();
- typename Vector2::const_iterator j;
- typename Matrix::Column::const_iterator k;
- std::vector<uint64_t>::iterator l;
-
- uint64_t t;
-
- if (_tmp.size () < w.size ())
- _tmp.resize (w.size ());
-
- std::fill (_tmp.begin (), _tmp.begin () + w.size (), 0);
-
- for (j = v.begin (); j != v.end (); ++j, ++i) {
- for (k = i->begin (), l = _tmp.begin (); k != i->end (); ++k, ++l) {
- t = ((uint64_t) *k) * ((uint64_t) *j);
-
- *l += t;
-
- if (*l < t)
- *l += VD.field ()._two64;
- }
- }
-
- typename Vector1::iterator w_j;
-
- for (w_j = w.begin (), l = _tmp.begin (); w_j != w.end (); ++w_j, ++l)
- *w_j = *l % VD.field ().modulus;
-
- return w;
- }
-
- template <class Vector1, class Matrix, class Vector2>
- Vector1 &MVProductDomain<PIRModular<int32_t> >::mulColDenseSpecialized
- (const VectorDomain<PIRModular<int32_t> > &VD, Vector1 &w, const Matrix &A, const Vector2 &v,
- VectorCategories::SparseSequenceVectorTag) const
- {
- linbox_check (A.coldim () == v.size ());
- linbox_check (A.rowdim () == w.size ());
-
- typename Matrix::ConstColIterator i = A.colBegin ();
- typename Vector2::const_iterator j;
- typename Matrix::Column::const_iterator k;
- std::vector<uint64_t>::iterator l;
-
- uint64_t t;
-
- if (_tmp.size () < w.size ())
- _tmp.resize (w.size ());
-
- std::fill (_tmp.begin (), _tmp.begin () + w.size (), 0);
-
- for (j = v.begin (); j != v.end (); ++j, ++i) {
- for (k = i->begin (), l = _tmp.begin (); k != i->end (); ++k, ++l) {
- t = ((uint64_t) k->second) * ((uint64_t) *j);
-
- _tmp[k->first] += t;
-
- if (_tmp[k->first] < t)
- _tmp[k->first] += VD.field ()._two64;
- }
- }
-
- typename Vector1::iterator w_j;
-
- for (w_j = w.begin (), l = _tmp.begin (); w_j != w.end (); ++w_j, ++l)
- *w_j = *l % VD.field ().modulus;
-
- return w;
- }
-
- template <class Vector1, class Matrix, class Vector2>
- Vector1 &MVProductDomain<PIRModular<int32_t> >::mulColDenseSpecialized
- (const VectorDomain<PIRModular<int32_t> > &VD, Vector1 &w, const Matrix &A, const Vector2 &v,
- VectorCategories::SparseAssociativeVectorTag) const
- {
-
- linbox_check (A.coldim () == v.size ());
- linbox_check (A.rowdim () == w.size ());
-
- typename Matrix::ConstColIterator i = A.colBegin ();
- typename Vector2::const_iterator j;
- typename Matrix::Column::const_iterator k;
- std::vector<uint64_t>::iterator l;
-
- uint64_t t;
-
- if (_tmp.size () < w.size ())
- _tmp.resize (w.size ());
-
- std::fill (_tmp.begin (), _tmp.begin () + w.size (), 0);
-
- for (j = v.begin (); j != v.end (); ++j, ++i) {
- for (k = i->begin (), l = _tmp.begin (); k != i->end (); ++k, ++l) {
- t = ((uint64_t) k->second) * ((uint64_t) *j);
-
- _tmp[k->first] += t;
-
- if (_tmp[k->first] < t)
- _tmp[k->first] += VD.field ()._two64;
- }
- }
-
- typename Vector1::iterator w_j;
-
- for (w_j = w.begin (), l = _tmp.begin (); w_j != w.end (); ++w_j, ++l)
- *w_j = *l % VD.field ().modulus;
-
- return w;
- }
-
- template <class Vector1, class Matrix, class Vector2>
- Vector1 &MVProductDomain<PIRModular<int32_t> >::mulColDenseSpecialized
- (const VectorDomain<PIRModular<int32_t> > &VD, Vector1 &w, const Matrix &A, const Vector2 &v,
- VectorCategories::SparseParallelVectorTag) const
- {
-
- linbox_check (A.coldim () == v.size ());
- linbox_check (A.rowdim () == w.size ());
-
- typename Matrix::ConstColIterator i = A.colBegin ();
- typename Vector2::const_iterator j;
- typename Matrix::Column::first_type::const_iterator k_idx;
- typename Matrix::Column::second_type::const_iterator k_elt;
- std::vector<uint64_t>::iterator l;
-
- uint64_t t;
-
- if (_tmp.size () < w.size ())
- _tmp.resize (w.size ());
-
- std::fill (_tmp.begin (), _tmp.begin () + w.size (), 0);
-
- for (j = v.begin (); j != v.end (); ++j, ++i) {
- for (k_idx = i->first.begin (), k_elt = i->second.begin (), l = _tmp.begin ();
- k_idx != i->first.end ();
- ++k_idx, ++k_elt, ++l)
- {
- t = ((uint64_t) *k_elt) * ((uint64_t) *j);
-
- _tmp[*k_idx] += t;
-
- if (_tmp[*k_idx] < t)
- _tmp[*k_idx] += VD.field ()._two64;
- }
- }
-
- typename Vector1::iterator w_j;
-
- for (w_j = w.begin (), l = _tmp.begin (); w_j != w.end (); ++w_j, ++l)
- *w_j = *l % VD.field ().modulus;
-
- return w;
- }
-
-
-}
-
-#include "linbox/randiter/modular.h"
-#endif //__LINBOX_pir_modular_int32_H
-
-
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
-// Local Variables:
-// mode: C++
-// tab-width: 8
-// indent-tabs-mode: nil
-// c-basic-offset: 8
-// End:
-
diff --git a/linbox/field/PIR-ntl-ZZ_p.h b/linbox/field/PIR-ntl-ZZ_p.h
deleted file mode 100644
index 8575a02..0000000
--- a/linbox/field/PIR-ntl-ZZ_p.h
+++ /dev/null
@@ -1,905 +0,0 @@
-/* Copyright (C) 2010 LinBox
- * written by Zhendong Wan
- *
- *
- *
- * ========LICENCE========
- * This file is part of the library LinBox.
- *
- * LinBox is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- * ========LICENCE========
- */
-
-
-#ifndef __LINBOX_pir_ntl_zz_p_H
-#define __LINBOX_pir_ntl_zz_p_H
-
-#include "linbox/field/unparametric.h"
-#include "linbox/linbox-config.h"
-#include "linbox/util/debug.h"
-#include <NTL/ZZ.h>
-#include <NTL/ZZ_p.h>
-#include "linbox/field/NTL/ntl-ZZ_p.h"
-#include "linbox/vector/vector-domain.h"
-#include <sstream>
-#include "linbox/integer.h"
-#include "linbox/field/field-traits.h"
-
-namespace LinBox
-{
-
- template<class Field>
- class FieldAXPY;
-
- template <class Ring>
- struct ClassifyRIng;
-
- class PIR_ntl_ZZ_p;
-
- template <>
- struct ClassifyRIng<PIR_ntl_ZZ_p> {
- typedef RingCategories::ModularTag categoryTag;
- };
-
- /** \brief extend Wrapper of ZZ_p from NTL. Add PIR functions
- \ingroup field
- */
-
- class PIR_ntl_ZZ_p : public NTL_ZZ_p {
- //public UnparametricField<NTL::ZZ_p> {
-
- // typedef UnparametricField<NTL::ZZ_p> Father_t ;
- typedef NTL_ZZ_p Father_t ;
- public:
- typedef Father_t::Element Element;
-
- template <class Int_t>
- PIR_ntl_ZZ_p(const Int_t& d) :
- Father_t(d)
- {
- // NTL::ZZ_p::init (NTL::to_ZZ(d));
- }
-
- PIR_ntl_ZZ_p (const NTL::ZZ& d) :
- Father_t(d)
- {
- // NTL::ZZ_p::init(d);
- }
-
- PIR_ntl_ZZ_p (const integer& d, int e = 1 ) :
- Father_t(d,e)
- {
-
- // if(e != 1) throw PreconditionFailed(__func__,__FILE__,__LINE__,"exponent must be 1");
- linbox_check(e == 1);
-
- // NTL::ZZ_p::init (NTL::to_ZZ(((std::string)d). c_str()));
-
- }
-
- inline static integer& cardinality (integer& c) {
-
- std::stringstream io;
-
- io << NTL::ZZ_p::modulus();
-
- io >> c;
-
- return c;
- }
-
- inline static NTL::ZZ& cardinality (NTL::ZZ& c) {
-
- return c = NTL::ZZ_p::modulus();
- }
-
- inline static integer& characteristic (integer& c) {
-
- std::stringstream io;
-
- io << NTL::ZZ_p::modulus();
-
- io >> c;
-
- return c;
- }
-
- static std::ostream& write (std::ostream& out) {
- return out << "PIR_NTL_ZZ_p Ring";
- }
-
- std::istream& read (std::istream& in) {
- return in;
- }
-
- /** @brief
- * Init x from y.
- */
- template<class Element2>
- inline static Element& init (Element& x, const Element2& y) {
-
- NTL::conv (x, y);
-
- return x;
- }
-
- /** @brief
- * Init from a NTL::ZZ_p
- */
- inline static Element& init (Element& x, const Element& y) {
-
- x = y;
-
- return x;
- }
-
- /** @brief
- * I don't know how to init from integer.
- */
- inline static Element& init (Element& x, const integer& y) {
-
-
- NTL::conv(x, NTL::to_ZZ( (static_cast<const std::string>(y)).c_str() ) );
- return x;
- }
-
- /** @brief
- * Convert y to an Element.
- */
- static integer& convert (integer& x, const Element& y) {
- bool neg=false;
- if (NTL::sign(NTL::rep(y)) <0)
- neg=true;
- long b = NTL::NumBytes(NTL::rep(y));
- unsigned char* byteArray; byteArray = new unsigned char[(size_t)b ];
- NTL::BytesFromZZ(byteArray, NTL::rep(y), b);
- integer base(256);
- x= integer(0);
- for(long i = b - 1; i >= 0; --i) {
- x *= base;
- x += integer(byteArray[i]);
- }
- delete [] byteArray;
- if (neg)
- x=-x;
- return x;
- }
-
-
- /** @brief
- * x = y.
- */
- inline static Element& assign (Element& x, const Element& y) {
- return x = y;
- }
-
- /** @brief
- * Test if x == y
- */
- inline static bool areEqual (const Element& x ,const Element& y) {
- return x == y;
- }
-
- /** @brief
- * Test if x == 0
- */
- inline static bool isZero (const Element& x) {
-
- return NTL::IsZero (x);
- }
-
- /** @brief
- * Test if x == 1
- */
- inline static bool isOne (const Element& x) {
-
- return NTL::IsOne (x);
- }
-
- // arithmetic
-
- /** @brief
- * return x = y + z
- */
- inline static Element& add (Element& x, const Element& y, const Element& z) {
-
- NTL::add (x, y, z);
-
- return x;
- }
-
- /** @brief
- * return x = y - z
- */
- inline static Element& sub (Element& x, const Element& y, const Element& z) {
-
- NTL::sub (x, y, z);
-
- return x;
- }
-
- /** @brief
- * return x = y * z
- */
- template <class Int>
- inline static Element& mul (Element& x, const Element& y, const Int& z) {
-
- NTL::mul (x, y, z);
-
- return x;
- }
-
- /** @brief
- * If exists a, such that a * z =y,
- * return x = one of them.
- * Otherwise, throw an exception
- */
- inline static Element& div (Element& x, const Element& y, const Element& z) {
-
- NTL::ZZ g, s, t;
-
- NTL::XGCD (g, s, t, NTL::rep(z), NTL::ZZ_p::modulus());
-
- NTL::ZZ q, r;
-
- NTL::DivRem (q, r, NTL::rep(y), g);
-
- if (NTL::IsZero (r)) {
-
- Element tmp1, tmp2;
-
- NTL::conv (tmp1, s);
-
- NTL::conv (tmp2, q);
-
- NTL::mul (x, tmp1, tmp2);
-
- }
-
- else
- throw PreconditionFailed(__func__,__FILE__,__LINE__,"Div: not dividable");
-
-
- return x;
-
- }
-
- /** @brief
- * If y is a unit, return x = 1 / y,
- * otherwsie, throw an exception
- */
- inline static Element& inv (Element& x, const Element& y) {
-
- NTL::inv (x, y);
-
- return x;
- }
-
- /** @brief
- * return x = -y;
- */
- inline static Element& neg (Element& x, const Element& y) {
-
- NTL::negate (x, y);
-
- return x;
- }
-
-
- /** @brief
- * return r = a x + y
- */
-
- template <class Int>
- inline static Element& axpy (Element& r, const Element& a, const Int& x, const Element& y) {
-
- NTL::mul (r, a, x);
-
- return r += y;
- }
-
-
- // inplace operator
-
- /** @brief
- * return x += y;
- */
- inline static Element& addin (Element& x, const Element& y) {
-
- return x += y;
- }
-
- /** @brief
- * return x -= y;
- */
- inline static Element& subin (Element& x, const Element& y) {
-
- return x -= y;
- }
-
- /** @brief
- * return x *= y;
- */
- template<class Int>
- inline static Element& mulin (Element& x, const Int& y) {
-
- return x *= y;
- }
-
- /** @brief
- * If y divides x, return x /= y,
- * otherwise throw an exception
- */
- inline static Element& divin (Element& x, const Element& y) {
-
- div (x, x, y);
-
- return x;
- }
-
- /** @brief
- * If x is a unit, x = 1 / x,
- * otherwise, throw an exception.
- */
- inline static Element& invin (Element& x) {
-
- return x = NTL::inv(x);
- }
-
- /** @brief
- * return x = -x;
- */
- inline static Element& negin (Element& x) {
-
- NTL::negate (x, x);
-
- return x;
- }
-
- /** @brief
- * return r += a x
- */
- template <class Int>
- inline static Element& axpyin (Element& r, const Element& a, const Int& x) {
-
- return r += a * x;
- }
-
-
- // IO
-
- /** @brief
- * out << y;
- */
- static std::ostream& write(std::ostream& out,const Element& y) {
-
- out << y;
-
- return out;
- }
-
-
- /** @brief
- * read x from istream in
- */
- static std::istream& read(std::istream& in, Element& x) {
-
- return in >> x;
- }
-
-
- /** some PIR function
- */
-
- /** @brief
- * Test if x is a unit.
- */
- inline static bool isUnit (const Element& x) {
-
- NTL::ZZ g;
-
- NTL::GCD (g, NTL::rep(x), NTL::ZZ_p::modulus());
-
- return NTL::IsOne (g);
- }
-
- /** @brief
- * return g = gcd (a, b)
- */
- inline static Element& gcd (Element& g, const Element& a, const Element& b) {
-
- NTL::ZZ d;
-
- NTL::GCD (d, NTL::rep(a), NTL::rep(b));
-
- NTL::conv (g, d);
-
- return g;
- }
-
- /** @brief
- * return g = gcd (g, b)
- */
- inline static Element& gcdin (Element& g, const Element& b) {
-
- gcd (g, g, b);
-
- return g;
- }
-
- /** @brief
- * g = gcd(a, b) = a*s + b*t.
- * and gcd (s, t) is a unit.
- */
- inline static Element& xgcd (Element& g, Element& s, Element& t, const Element& a, const Element& b){
-
- NTL::ZZ g1, s1, t1;
-
- NTL::XGCD (g1, s1, t1, NTL::rep(a), NTL::rep(b));
-
- NTL::conv (g, g1);
-
- NTL::conv (s, s1);
-
- NTL::conv (t, t1);
-
- return g;
- }
-
- /** @brief
- * g = gcd(a, b) = a*s + b*t.
- * and gcd (s, t) is a unit.
- * s * a1 + t * b1 = a unit.
- */
- inline static Element& dxgcd (Element& g, Element& s, Element& t, Element& a1, Element& b1,
- const Element& a, const Element& b){
-
- NTL::ZZ g1, s1, t1, a2, b2;
-
- NTL::XGCD (g1, s1, t1, NTL::rep(a), NTL::rep(b));
-
- NTL::conv (g, g1);
-
- NTL::conv (s, s1);
-
- NTL::conv (t, t1);
-
- if (NTL::IsZero (g1)) {
-
- a1 = s;
-
- b1 = t;
- }
-
- else {
-
- NTL::div (a2, NTL::rep(a), g1);
-
- NTL::div (b2, NTL::rep(b), g1);
-
- NTL::conv (a1, a2);
-
- NTL::conv (b1, b2);
- }
-
- return g;
- }
-
- /** @brief
- * Test if a | b.
- */
- inline static bool isDivisor (const Element& a, const Element& b) {
-
- if ( NTL::IsZero (a) ) return false;
-
- else if (NTL::IsZero (b)) return true;
-
- else {
- NTL::ZZ g, r;
-
- NTL::GCD (g, NTL::rep(a), NTL::ZZ_p::modulus());
-
- NTL::rem (r, NTL::rep(b), g);
-
- return NTL::IsZero (r);
- }
- }
-
- /** @brief
- * a = normalization of b.
- */
-
- inline static Element& normal (Element& a, const Element& b) {
-
- NTL::ZZ a1;
-
- NTL::GCD (a1, NTL::rep(b), NTL::ZZ_p::modulus());
-
- NTL::conv (a, a1);
-
- return a;
- }
-
- /** @brief
- */
-
- inline static Element& normalIn (Element& a) {
-
-
- NTL::ZZ a1;
-
- NTL::GCD (a1, NTL::rep(a), NTL::ZZ_p::modulus());
-
- NTL::conv (a, a1);
-
- return a;
- }
-
- inline static integer getMaxModulus()
- { return integer( "4294967295" ); } // 2^32 - 1
-
- };
-
-
-
- template <>
- class FieldAXPY<PIR_ntl_ZZ_p> {
- public:
- typedef PIR_ntl_ZZ_p Field;
- typedef Field::Element Element;
-
- /** Constructor.
- * A faxpy object if constructed from a Field.
- * Copies of this objects are stored in the faxpy object.
- * @param F field F in which arithmetic is done
- */
- FieldAXPY (const Field &F) :
- _field (F)
- { _y = NTL::ZZ::zero(); }
-
- /** Copy constructor.
- * @param faxpy
- */
- FieldAXPY (const FieldAXPY<Field> &faxpy) :
- _field (faxpy._field), _y (faxpy._y)
- {}
-
- /** Assignment operator
- * @param faxpy
- */
- FieldAXPY<Field> &operator = (const FieldAXPY &faxpy)
- { _y = faxpy._y; return *this; }
-
- /** Add a*x to y
- * y += a*x.
- * @param a constant reference to element a
- * @param x constant reference to element x
- */
- inline NTL::ZZ& mulacc (const Element &a, const Element &x)
- {
- return _y += NTL::rep(a) * NTL::rep(x) ;
- }
-
- inline NTL::ZZ& accumulate (const Element &t)
- {
- return _y += NTL::rep(t);
- }
-
- /** Retrieve y
- *
- * Performs the delayed modding out if necessary
- */
- inline Element &get (Element &y) { NTL::conv (y, _y); return y; }
-
- /** Assign method.
- * Stores new field element for arithmetic.
- * @return reference to self
- * @param y constant reference to element a
- */
- inline FieldAXPY &assign (const Element& y)
- {
- _y = NTL::rep(y);
-
- return *this;
- }
-
- inline void reset() {
- _y = NTL::ZZ::zero();
- }
-
- private:
-
- /// Field in which arithmetic is done
- /// Not sure why it must be mutable, but the compiler complains otherwise
- Field _field;
-
- /// Field element for arithmetic
- NTL::ZZ _y;
-
- };
-
- template<class Field>
- class DotProductDomain;
-
- template <>
- class DotProductDomain<PIR_ntl_ZZ_p> : private virtual VectorDomainBase<PIR_ntl_ZZ_p> {
-
- public:
- typedef PIR_ntl_ZZ_p::Element Element;
- DotProductDomain (const PIR_ntl_ZZ_p& F) :
- VectorDomainBase<PIR_ntl_ZZ_p> (F) {}
-
-
- protected:
- template <class Vector1, class Vector2>
- inline Element &dotSpecializedDD (Element &res, const Vector1 &v1, const Vector2 &v2) const
- {
-
- typename Vector1::const_iterator i;
- typename Vector2::const_iterator j;
-
- NTL::ZZ y;
- //NTL::ZZ t;
-
- for (i = v1.begin (), j = v2.begin (); i < v1.end (); ++i, ++j) {
-
- y += NTL::rep (*i) * NTL::rep(*j);
-
- }
-
- //NTL::rem (t, y, NTL::ZZ_p::modulus());
-
- NTL::conv (res, y);
-
- return res;
-
- }
-
- template <class Vector1, class Vector2>
- inline Element &dotSpecializedDSP (Element &res, const Vector1 &v1, const Vector2 &v2) const
- {
- typename Vector1::first_type::const_iterator i_idx;
- typename Vector1::second_type::const_iterator i_elt;
-
- NTL::ZZ y;
- y = (long)0;
- //NTL::ZZ t;
-
- for (i_idx = v1.first.begin (), i_elt = v1.second.begin (); i_idx != v1.first.end (); ++i_idx, ++i_elt) {
-
- y += NTL::rep(*i_elt) * NTL::rep(v2[*i_idx]);
-
- }
-
-
- //NTL::rem (t, y, NTL::ZZ_p::modulus());
-
- NTL::conv (res, y);
-
- return res;
- }
- };
-
- // Specialization of MVProductDomain for PIR_ntl_ZZ_p field
-
- template <class Field>
- class MVProductDomain;
-
- template <>
- class MVProductDomain<PIR_ntl_ZZ_p>
- {
- public:
-
- typedef PIR_ntl_ZZ_p::Element Element;
-
- protected:
- template <class Vector1, class Matrix, class Vector2>
- inline Vector1 &mulColDense
- (const VectorDomain<PIR_ntl_ZZ_p> &VD, Vector1 &w, const Matrix &A, const Vector2 &v) const
- {
- return mulColDenseSpecialized
- (VD, w, A, v, VectorTraits<typename Matrix::Column>::VectorCategory ());
- }
-
- private:
-
- template <class Vector1, class Matrix, class Vector2>
- Vector1 &mulColDenseSpecialized
- (const VectorDomain<PIR_ntl_ZZ_p> &VD, Vector1 &w, const Matrix &A, const Vector2 &v,
- VectorCategories::DenseVectorTag) const;
-
- template <class Vector1, class Matrix, class Vector2>
- Vector1 &mulColDenseSpecialized
- (const VectorDomain<PIR_ntl_ZZ_p> &VD, Vector1 &w, const Matrix &A, const Vector2 &v,
- VectorCategories::SparseSequenceVectorTag) const;
-
- template <class Vector1, class Matrix, class Vector2>
- Vector1 &mulColDenseSpecialized
- (const VectorDomain<PIR_ntl_ZZ_p> &VD, Vector1 &w, const Matrix &A, const Vector2 &v,
- VectorCategories::SparseAssociativeVectorTag) const;
-
- template <class Vector1, class Matrix, class Vector2>
- Vector1 &mulColDenseSpecialized
- (const VectorDomain<PIR_ntl_ZZ_p> &VD, Vector1 &w, const Matrix &A, const Vector2 &v,
- VectorCategories::SparseParallelVectorTag) const;
-
- };
-
- template <class Vector1, class Matrix, class Vector2>
- Vector1 &MVProductDomain<PIR_ntl_ZZ_p>::mulColDenseSpecialized
- (const VectorDomain<PIR_ntl_ZZ_p> &VD, Vector1 &w, const Matrix &A, const Vector2 &v,
- VectorCategories::DenseVectorTag) const
- {
-
- linbox_check (A.coldim () == v.size ());
- linbox_check (A.rowdim () == w.size ());
-
- typename Matrix::ConstColIterator i = A.colBegin ();
- typename Vector2::const_iterator j;
- typename Matrix::Column::const_iterator k;
- std::vector<NTL::ZZ>::iterator l;
- std::vector<NTL::ZZ> _tmp(w.size());
-
- //NTL::ZZ t;
-
- for (j = v.begin (); j != v.end (); ++j, ++i) {
- for (k = i->begin (), l = _tmp.begin (); k != i->end (); ++k, ++l)
-
- *l += NTL::rep (*k) + NTL::rep (*j);
-
- }
-
- typename Vector1::iterator w_j;
-
- for (w_j = w.begin (), l = _tmp.begin (); w_j != w.end (); ++w_j, ++l) {
-
- //NTL::rem (t, *l, NTL::ZZ_p::modulus());
-
- NTL::conv (*w_j, *l);
- }
-
-
- return w;
- }
-
- template <class Vector1, class Matrix, class Vector2>
- Vector1 &MVProductDomain<PIR_ntl_ZZ_p>::mulColDenseSpecialized
- (const VectorDomain<PIR_ntl_ZZ_p> &VD, Vector1 &w, const Matrix &A, const Vector2 &v,
- VectorCategories::SparseSequenceVectorTag) const
- {
- linbox_check (A.coldim () == v.size ());
- linbox_check (A.rowdim () == w.size ());
-
- typename Matrix::ConstColIterator i = A.colBegin ();
- typename Vector2::const_iterator j;
- typename Matrix::Column::const_iterator k;
- std::vector<NTL::ZZ>::iterator l;
- std::vector<NTL::ZZ> _tmp(w.size());
-
- //NTL::ZZ t;
-
- for (j = v.begin (); j != v.end (); ++j, ++i) {
- for (k = i->begin (), l = _tmp.begin (); k != i->end (); ++k, ++l) {
-
- _tmp[k->first] += NTL::rep (k->second) * NTL::rep (*j);
-
- }
- }
-
- typename Vector1::iterator w_j;
-
- for (w_j = w.begin (), l = _tmp.begin (); w_j != w.end (); ++w_j, ++l) {
-
- //NTL::rem (t, *l, NTL::ZZ_p::modulus());
-
- NTL::conv (*w_j, *l);
- }
-
- return w;
- }
-
- template <class Vector1, class Matrix, class Vector2>
- Vector1 &MVProductDomain<PIR_ntl_ZZ_p >::mulColDenseSpecialized
- (const VectorDomain<PIR_ntl_ZZ_p > &VD, Vector1 &w, const Matrix &A, const Vector2 &v,
- VectorCategories::SparseAssociativeVectorTag) const
- {
-
- linbox_check (A.coldim () == v.size ());
- linbox_check (A.rowdim () == w.size ());
-
- typename Matrix::ConstColIterator i = A.colBegin ();
- typename Vector2::const_iterator j;
- typename Matrix::Column::const_iterator k;
- std::vector<NTL::ZZ>::iterator l;
-
- std::vector<NTL::ZZ> _tmp(w.size());
-
- //NTL::ZZ t;
-
- for (j = v.begin (); j != v.end (); ++j, ++i) {
- for (k = i->begin (), l = _tmp.begin (); k != i->end (); ++k, ++l) {
-
- _tmp[k->first] += NTL::rep(k -> second) * NTL::rep(*j);
-
- }
- }
-
- typename Vector1::iterator w_j;
-
- for (w_j = w.begin (), l = _tmp.begin (); w_j != w.end (); ++w_j, ++l) {
-
- //NTL::rem (t, *l, NTL::ZZ_p::modulus());
-
- NTL::conv (*w_j, *l);
- }
-
-
- return w;
- }
-
- template <class Vector1, class Matrix, class Vector2>
- Vector1 &MVProductDomain<PIR_ntl_ZZ_p>::mulColDenseSpecialized
- (const VectorDomain<PIR_ntl_ZZ_p> &VD, Vector1 &w, const Matrix &A, const Vector2 &v,
- VectorCategories::SparseParallelVectorTag) const
- {
-
- linbox_check (A.coldim () == v.size ());
- linbox_check (A.rowdim () == w.size ());
-
- typename Matrix::ConstColIterator i = A.colBegin ();
- typename Vector2::const_iterator j;
- typename Matrix::Column::first_type::const_iterator k_idx;
- typename Matrix::Column::second_type::const_iterator k_elt;
- std::vector<NTL::ZZ>::iterator l;
-
- std::vector<NTL::ZZ> _tmp(w.size());
- //NTL::ZZ t;
-
- for (j = v.begin (); j != v.end (); ++j, ++i) {
- for (k_idx = i->first.begin (), k_elt = i->second.begin (), l = _tmp.begin ();
- k_idx != i->first.end ();
- ++k_idx, ++k_elt, ++l)
-
- _tmp[*k_idx] += NTL::rep(*k_elt) * NTL::rep(*j);
-
- }
-
- typename Vector1::iterator w_j;
-
- for (w_j = w.begin (), l = _tmp.begin (); w_j != w.end (); ++w_j, ++l) {
-
- //NTL::rem (t, *l, NTL::ZZ_p::modulus());
-
- NTL::conv (*w_j, *l);
- }
-
- return w;
- }
-
-
-
-}
-
-#endif //__LINBOX_pir_ntl_zz_p_H
-
-
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
-// Local Variables:
-// mode: C++
-// tab-width: 8
-// indent-tabs-mode: nil
-// c-basic-offset: 8
-// End:
-
diff --git a/linbox/field/abstract.h b/linbox/field/abstract.h
index 8b41378..a82614b 100644
--- a/linbox/field/abstract.h
+++ b/linbox/field/abstract.h
@@ -285,6 +285,16 @@ namespace LinBox
*/
virtual bool isOne (const Element &x) const = 0;
+ /** MOne equality.
+ * Test if field element is equal to one.
+ * This function assumes the field element has already been
+ * constructed and initialized.
+ * Purely virtual.
+ * @return boolean true if equals one, false if not.
+ * @param x field element.
+ */
+ virtual bool isMOne (const Element &x) const = 0;
+
/** Inplace Addition.
* x += y
* This function assumes both field elements have already been
@@ -375,13 +385,6 @@ namespace LinBox
*/
virtual std::ostream &write (std::ostream &os) const = 0;
- /** Read field.
- * Purely virtual.
- * @return input stream from which field is read.
- * @param is input stream from which field is read.
- */
- virtual std::istream &read (std::istream &is) = 0;
-
/** Print field element.
* This function assumes the field element has already been
* constructed and initialized.
diff --git a/linbox/field/archetype.h b/linbox/field/archetype.h
index 03136e8..7f5ae61 100644
--- a/linbox/field/archetype.h
+++ b/linbox/field/archetype.h
@@ -44,6 +44,8 @@
#define __LINBOX_field_archetype_H
#include <iostream>
+#include "linbox/linbox-config.h"
+#include "linbox/util/error.h"
#include "linbox/util/debug.h"
#include "linbox/field/field-interface.h"
#include "linbox/field/abstract.h"
@@ -54,8 +56,6 @@
#include "linbox/randiter/abstract.h"
#include "linbox/randiter/envelope.h"
#include "linbox/integer.h"
-#include "linbox/linbox-config.h"
-#include "linbox/util/error.h"
namespace LinBox
{
@@ -110,9 +110,10 @@ namespace LinBox
FieldArchetype (const FieldArchetype &F) :
one(F.one),zero(F.zero),mOne(F.mOne)
{
- if (F._field_ptr != 0) _field_ptr = F._field_ptr->clone ();
- if (F._elem_ptr != 0) _elem_ptr = F._elem_ptr->clone ();
+ if (F._field_ptr != 0) _field_ptr = F._field_ptr ->clone ();
+ if (F._elem_ptr != 0) _elem_ptr = F._elem_ptr ->clone ();
if (F._randIter_ptr != 0) _randIter_ptr = F._randIter_ptr->clone ();
+
}
/** \brief Destructor.
@@ -128,9 +129,11 @@ namespace LinBox
*/
~FieldArchetype (void)
{
- if (_field_ptr != 0) delete _field_ptr;
- if (_elem_ptr != 0) delete _elem_ptr;
- if (_randIter_ptr != 0) delete _randIter_ptr;
+ if (_field_ptr != NULL) delete _field_ptr;
+ if (_elem_ptr != NULL) delete _elem_ptr;
+ if (_randIter_ptr != NULL) delete _randIter_ptr;
+
+
}
/** \brief Assignment operator.
@@ -145,13 +148,16 @@ namespace LinBox
FieldArchetype &operator=(const FieldArchetype &F)
{
if (this != &F) { // guard against self-assignment
- if (_field_ptr != 0) delete _field_ptr;
- if (_elem_ptr != 0) delete _elem_ptr;
- if (_randIter_ptr != 0) delete _randIter_ptr;
- if (F._field_ptr != 0) _field_ptr = F._field_ptr->clone ();
- if (F._elem_ptr != 0) _elem_ptr = F._elem_ptr->clone ();
+
+ if (_field_ptr != 0) delete _field_ptr;
+ if (_elem_ptr != 0) delete _elem_ptr;
+ if (_randIter_ptr != 0) delete _randIter_ptr;
+
+ if (F._field_ptr != 0) _field_ptr = F._field_ptr ->clone ();
+ if (F._elem_ptr != 0) _elem_ptr = F._elem_ptr ->clone ();
if (F._randIter_ptr != 0) _randIter_ptr = F._randIter_ptr->clone ();
- one = F.one ;
+
+ one = F.one ;
zero = F.zero ;
mOne = F.mOne ;
}
@@ -180,7 +186,7 @@ namespace LinBox
// if (x._elem_ptr != 0) delete x._elem_ptr;
// x._elem_ptr = _elem_ptr->clone ();
if (x._elem_ptr == 0)
- x._elem_ptr = _elem_ptr->clone ();
+ x._elem_ptr = _elem_ptr->clone ();
_field_ptr->init (*x._elem_ptr, n);
return x;
}
@@ -420,6 +426,21 @@ namespace LinBox
*/
bool isOne (const Element &x) const
{ return _field_ptr->isOne (*x._elem_ptr); }
+
+ /** MOne equality.
+ * Test if field element is equal to one.
+ * This function assumes the field element has already been
+ * constructed and initialized.
+ *
+ * In this implementation, this means the <tt> _elem_ptr</tt>
+ *of x exists and does not point to null.
+ *
+ * @return boolean true if equals one, false if not.
+ * @param x field element.
+ */
+ bool isMOne (const Element &x) const
+ { return _field_ptr->isMOne (*x._elem_ptr); }
+
//@}
/** @name Inplace Arithmetic Operations
@@ -565,13 +586,7 @@ namespace LinBox
* @return output stream to which field is written.
* @param os output stream to which field is written.
*/
- std::ostream &write (std::ostream &os) const { return _field_ptr->write (os); }
-
- /** Read field.
- * @return input stream from which field is read.
- * @param is input stream from which field is read.
- */
- std::istream &read (std::istream &is) { return _field_ptr->read (is); }
+ std::ostream &write (std::ostream &os) const { return _field_ptr->write (os<<"Archetype of "); }
/** Print field element.
* This function assumes the field element has already been
@@ -627,12 +642,11 @@ namespace LinBox
*/
FieldArchetype (FieldAbstract *field_ptr,
ElementAbstract *elem_ptr,
- RandIterAbstract *randIter_ptr = 0) :
+ RandIterAbstract *randIter_ptr) :
_field_ptr (field_ptr->clone ()),
- _elem_ptr (elem_ptr->clone ())
- {
- if (randIter_ptr != 0) _randIter_ptr = randIter_ptr->clone ();
- }
+ _elem_ptr (elem_ptr->clone ()),
+ _randIter_ptr (randIter_ptr->clone ())
+ {}
/** Constructor.
@@ -687,9 +701,18 @@ namespace LinBox
_field_ptr = field_ptr->clone ();
_elem_ptr = static_cast<ElementAbstract*> (new typename Field_qcq::Element ());
_randIter_ptr = static_cast<RandIterAbstract*> (new typename Field_qcq::RandIter (*field_ptr));
- one = static_cast<ElementAbstract*> (new typename Field_qcq::Element (field_ptr->one) );
- zero = static_cast<ElementAbstract*> (new typename Field_qcq::Element (field_ptr->zero ) );
- mOne = static_cast<ElementAbstract*> (new typename Field_qcq::Element (field_ptr->mOne ) );
+
+ //! @bug leaks here (new not deleted)
+ // one = field_ptr->one .clone();
+ // zero = field_ptr->zero.clone();
+ // mOne = field_ptr->mOne.clone();
+ one = & field_ptr->one;
+ zero = & field_ptr->zero;
+ mOne = & field_ptr->mOne;
+
+ // one = static_cast<ElementAbstract*> (new typename Field_qcq::Element (field_ptr->one ) );
+ // zero = static_cast<ElementAbstract*> (new typename Field_qcq::Element (field_ptr->zero ) );
+ // mOne = static_cast<ElementAbstract*> (new typename Field_qcq::Element (field_ptr->mOne ) );
}
/** Template method for constructing archetype from a class not derived
diff --git a/linbox/field/block-ring.h b/linbox/field/block-ring.h
deleted file mode 100644
index a4252da..0000000
--- a/linbox/field/block-ring.h
+++ /dev/null
@@ -1,622 +0,0 @@
-/* linbox/fields/blas-ring.h
- * Copyright (C) 2007 LinBox Team
- *
- * Written by JP May, with tweaks by D. Saunders, Z. Wan
- *
- *
- * ========LICENCE========
- * This file is part of the library LinBox.
- *
- * LinBox is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- * ========LICENCE========
- *.
- */
-
-
-#ifndef __LINBOX_blockring_H
-#define __LINBOX_blockring_H
-#include <iostream>
-#include "linbox/matrix/blas-matrix.h"
-#include "linbox/field/field-interface.h"
-#include "linbox/algorithms/blas-domain.h"
-#include <fflas-ffpack/fflas/fflas.h>
-
-namespace LinBox
-{
-
-
- /** Elements are wrapped BlasMatrix objects.
-
- Operations expect conformal sizes for inputs and outputs.
-
- You can expect good performance due to BLAS usage,
- especially when the Field is Modular<double> or Modular<float>.
- */
-
- template < class _Field >
- class BlockRing : public FieldInterface {
- public:
- _Field _field;
- BlasMatrixDomain<_Field> _blasMatrixDomain;
- size_t _b;
-
- typedef BlasMatrix<_Field> Matrix;
- typedef typename _Field::Element Scalar;
-
-
-
- /// default constructable wrapper for BlasMatrix
- class Element {
-
- public:
-
- typedef _Field Field;
- typedef Scalar Entry;
-
- Element() :
- matrix(0)
- {}
-
- ~Element() {
- release();
- }
-
- // copy constructor
- Element(const Element& e) :
- matrix(0)
- {
- if (e.matrix != 0) {
- matrix = new Matrix(*(e.matrix));
- // memory leak of previous value?
- }
- }
-
- // overload assignment
- Element& operator= (const Element& e) {
- if (matrix == e.matrix) {
- return *this;
- }
- else if (e.matrix == 0) {
- release();
- return *this;
- }
- else {
- //set(new Matrix(*(e.matrix))); // does this really copy?
- clone(e);
- return *this;
- }
- }
-
- void clone(const Element& A) {
- // make this a deep copy of A
- // BlasMatrix copy constructor is shallow!
-
- release();
-
- if(A.matrix == 0) return;
-
- size_t rows = A.matrix->rowdim();
- size_t cols = A.matrix->coldim();
-
- set(new Matrix(A.matrix->field(),rows, cols));
-
- Scalar* a=A.matrix->getPointer();
- Scalar* b= matrix->getPointer();
-
- for(size_t i=0; i < rows*cols; ++i) {
- *b=*a;
- ++a; ++b;
- }
-
-
- }
-
- // cleanly deletes the current stored value
- // before assigning to the new value
- void set(Matrix* thematrix) {
- this -> release();
- matrix = thematrix;
- }
-
- Matrix* matrix;
-
- private:
-
- void release() {
- if (matrix != 0 )
- delete matrix;
- matrix = 0;
- }
-
- }; // class Element
-
- Element one,zero,mOne;
-
- class RandIter {
- typedef typename _Field::RandIter FieldRandIter;
-
- FieldRandIter r;
- size_t dim;
-
- public:
- RandIter(const BlockRing<_Field>& BR,
- const integer size=0,
- const integer seed=0) :
- r(BR._field, size, seed), dim(BR._b) {}
-
- Element& random(Element& e) const
- {
- // e must be init'd
- for(size_t i=0; i < e. matrix -> rowdim(); ++i)
- for(size_t j=0; j < e. matrix -> coldim(); ++j)
- r.random(e.matrix->refEntry(i,j));
- return e;
- }
-
- }; //class RandIter
-
-
- BlockRing(const _Field& F, size_t d=1) :
- _field(F), _blasMatrixDomain(F), _b(d)
- {
- one.set(new Matrix(_field,d,d));
- zero.set(new Matrix(_field,d,d));
- mOne.set(new Matrix(_field,d,d)) ;
- _blasMatrixDomain.setIdentity(*(one.matrix));
- _blasMatrixDomain.setZero(*(zero.matrix));
- for (size_t i = 0 ;i < d ;++i)
- mOne.matrix->setEntry(i,i,_field.mOne);
- }
-
- Element& init(Element& B) const
- {
- // B is garbage from memory
- B.set(new Matrix(_field,_b,_b));
- return B;
- }
-
- template <typename ints>
- Element& init(Element& B, ints n, size_t r = 0, size_t c = 0) const
- // n supposed to be integer, r num rows, c num cols
- {
- // default block dim is default dim of ring, but others are allowed.
- if (r == 0) r = _b;
- if (c == 0) c = _b;
-
- B.set(new Matrix(_field,r,c));
-
- size_t k = ( (r < c) ? r : c );
-
- typename _Field::Element N; _field.init(N, n);
-
- for (size_t i = 0; i < k; ++i) (B.matrix)->setEntry(i, i, N);
-
- return B;
-
- }
-
-
- template <typename ints>
- ints& convert(ints& x) const
- {
- return _field.convert(x);
- }
-
-
- template <typename ints>
- ints& convert(ints& x, const Element &A) const
- {
- return _field.convert(x, *(A.matrix->getPointer()));
- }
-
- Element& assign(Element &A, const Element &B) const
- {
- return A = B;
- }
-
-
- integer& cardinality(integer &c) const
- {
- // c = p^(b^2)
-
- _field.cardinality(c);
-
- if(c > 1) // _field is a finite field
- {
- integer tmp, n;
- n = _b*_b;
- c = expt(tmp, c, n);
- } // else c = -1
-
- return c;
- }
-
- integer& characteristic(integer &c) const
- {
- return _field.characteristic(c);
- }
-
- unsigned long cardinality() const
- {
- return _field. cardinality() ;
- }
-
- unsigned long characteristic() const
- {
- return _field. characteristic() ;
- }
-
-
-
- size_t dim() const
- {
- return _b;
- }
-
-
- //Operations
- //
- // All operations will work for matrices of dim != _b
- // but assume that the dimensions of all the given matrices
- // are compatible with the dimensions of the A operand.
-
- //Operations from the Matrix Domain:
-
- Element& mul(Element& C, const Element& A, const Element& B) const
- {
- _blasMatrixDomain.mul(*(C.matrix), *(A.matrix), *(B.matrix));
- return C;
- }
-
-
- //non-commutative: use mulin_left: A = A*B
- Element& mulin(Element& A, const Element& B) const
- {
- _blasMatrixDomain.mulin_left(*(A.matrix), *(B.matrix));
- return A;
- }
-
- // D = A*X+Y
- Element& axpy(Element& D, const Element& A, const Element& X, const Element& Y) const
- {
- _blasMatrixDomain.axpy(*(D.matrix), *(A.matrix), *(X.matrix), *(Y.matrix));
- return D;
- }
-
- // R = A*X+R
- Element& axpyin(Element& R, const Element& A, const Element& X) const
- {
- _blasMatrixDomain.axpyin(*(R.matrix), *(A.matrix), *(X.matrix));
- return R;
- }
-
-
- // These operations will not work for all elements
- // and no checks are provided!
-
- // B = A^{-1}
- Element& inv(Element& B, const Element& A) const
- {
-
- int nullflag = 0;
-
- _blasMatrixDomain.inv(*(B.matrix), *(A.matrix), nullflag);
-
- if (nullflag)
- throw PreconditionFailed(__func__,__FILE__,__LINE__,"InvMatrix: inverse undefined");
-
- return B;
- }
-
- // A=A^{-1} not really inplace!
- Element& invin(Element& A) const
- {
-
- int nullflag = 0;
-
- //_blasMatrixDomain.invin(A, A, nullflag);
-
- Element B; init(B, A.matrix->rowdim(), A.matrix->coldim());
- _blasMatrixDomain.inv(*(B.matrix), *(A.matrix), nullflag);
-
- if (nullflag)
- throw PreconditionFailed(__func__,__FILE__,__LINE__,"InvMatrix: inverse undefined");
-
- A=B;
-
- return A;
- }
-
-
- // C = A*B^{-1}
- Element& div(Element& C, const Element& A, const Element& B) const
- {
-
- _blasMatrixDomain.right_solve(*(C.matrix),*(B.matrix),*(A.matrix));
- return C;
- }
-
-
- //A = A*B^{-1};
- Element& divin( Element& A, const Element& B) const
- {
- _blasMatrixDomain.right_solve(*(B.matrix),*(A.matrix));
- return A;
- }
-
-
-
-
- // Unwrapped operations using simple loops:
-
- // C = A + B
- Element& add(Element& C, const Element& A, const Element& B) const
- {
- size_t rows = A.matrix->rowdim();
- size_t cols = A.matrix->coldim();
-
- Scalar* a=A.matrix->getPointer();
- Scalar* b=B.matrix->getPointer();
- Scalar* c=C.matrix->getPointer();
-
- //FFLAS::fcopy((typename Field::Father_t)_field, rows*cols, b, 1, c, 1); // C = B
-
-
- for(size_t i=0; i < rows*cols; ++i) {
- _field.add(*c,*a,*b);
- ++a; ++b; c++;
- }
-
- //Scalar alpha; _field.init(alpha, 1);
- //FFLAS::faxpy((typename Field::Father_t)_field, rows*cols, alpha, a, 1, c, 1);
-
- return C;
- }
-
- // A = A + B
- Element& addin(Element& A, const Element& B) const
- {
- size_t r = A.matrix->rowdim();
- size_t c = A.matrix->coldim();
-
- Scalar* a=A.matrix->getPointer();
- Scalar* b=B.matrix->getPointer();
-
- for(size_t i=0; i < r*c; ++i) {
- _field.addin(*a,*b);
- ++a; ++b;
- }
-
- return A;
-
- }
-
-
- // C = A - B
- Element& sub(Element& C, const Element& A, const Element& B) const
- {
- size_t rows = A.matrix->rowdim();
- size_t cols = A.matrix->coldim();
-
- Scalar* a=A.matrix->getPointer();
- Scalar* b=B.matrix->getPointer();
- Scalar* c=C.matrix->getPointer();
-
-
- for(size_t i=0; i < rows*cols; ++i) {
- _field.sub(*c,*a,*b);
- ++a; ++b; c++;
- }
-
- return C;
- }
-
-
- // A = A - B
- Element& subin(Element& A, const Element& B) const
- {
- size_t r = A.matrix->rowdim();
- size_t c = A.matrix->coldim();
-
- Scalar* a=A.matrix->getPointer();
- Scalar* b=B.matrix->getPointer();
-
- for(size_t i=0; i < r*c; ++i) {
- _field.subin(*a,*b);
- ++a; ++b;
- }
-
- return A;
- }
-
-
- //B = -1*A
- Element& neg(Element& B, const Element& A) const
- {
- size_t r = A.matrix->rowdim();
- size_t c = A.matrix->coldim();
-
- Scalar* a=A.matrix->getPointer();
- Scalar* b=B.matrix->getPointer();
-
- for(size_t i=0; i < r*c; ++i) {
- _field.neg(*b,*a);
- ++a; ++b;
- }
-
- return B;
- }
-
-
- //A = -1*A
- Element& negin(Element& A) const
- {
- size_t r = A.matrix->rowdim();
- size_t c = A.matrix->coldim();
-
- Scalar* a=A.matrix->getPointer();
-
- for(size_t i=0; i < r*c; ++i) {
- _field.negin(*a);
- ++a;
- }
-
- return A;
- }
-
- bool areEqual(const Element& A, const Element& B) const
- {
-
- size_t r = A.matrix->rowdim();
- size_t c = A.matrix->coldim();
-
- Scalar* a=A.matrix->getPointer();
- Scalar* b=B.matrix->getPointer();
-
- for(size_t i=0; i < r*c; ++i) {
-
- if(!_field.areEqual(*a,*b)) {
- return false;
- }
-
- ++a; ++b;
- }
- return true;
- }
-
-
- bool isOne(const Element& X) const
- {
- size_t n = X.matrix->rowdim();
-
- if(n != X.matrix->coldim()) {
- return false;
- }
-
- Scalar* x=X.matrix->getPointer();
-
- for(size_t i=1; i <= n; ++i)
- for(size_t j=1; j <= n; ++j)
- {
- if(i==j) { // on the diagonal
- if(!_field.isOne(*x)) {
- return false;
- }
- }
- else {
- if(!_field.isZero(*x)) {
- return false;
- }
- }
-
- x++;
- }
-
-
- return true;
- }
-
-
- bool isZero(const Element& X) const
- {
-
- size_t r = X.matrix->rowdim();
- size_t c = X.matrix->coldim();
-
- Scalar* x=X.matrix->getPointer();
-
- for(size_t i=0; i < r*c; ++i)
- {
- if(!_field.isZero(*x)) {
- return false;
- }
-
- x++;
- }
-
- return true;
- }
-
-
- //stubs for read and write field
- std::ostream& write(std::ostream& os) const
- {
- return _field.write(os << "Dimension " << _b << " square matrices over ");
- }
-
-
-
- std::istream& read(std::istream& is)
- {
- return is;
- }
-
- // wrapped read and write element
- std::ostream& write(std::ostream& os, const Element& A) const
- {
- return (A.matrix)->write(os << std::endl);
- }
-
-
- std::istream& read(std::istream& is, const Element& A) const
- {
-
- return (A.matrix)->read(is, _field);
- }
-
-
- private:
-
-
- // recursive helper to compute exponentiation of integers
- static integer& expt (integer& res, integer& a, integer& n)
- {
- if (n == 0) {
- res=1;
- }
- else if (n == 1) {
- res=a;
- }
- else if (n[0] & 1) {
- n -= 1;
- expt(res, a, n);
- res*=a;
- }
- else {
- n /= 2;
- expt(res, a, n);
- res*=res;
- }
-
- return res;
- }
-
-
-
- }; // BlockRing
-
-} // LinBox
-
-#endif // __LINBOX_blockring_H
-
-
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
-// Local Variables:
-// mode: C++
-// tab-width: 8
-// indent-tabs-mode: nil
-// c-basic-offset: 8
-// End:
-
diff --git a/linbox/field/envelope.h b/linbox/field/envelope.h
index 497e593..902c238 100644
--- a/linbox/field/envelope.h
+++ b/linbox/field/envelope.h
@@ -381,6 +381,17 @@ namespace LinBox
bool isOne (const ElementAbstract& x) const
{ return _field.isOne (static_cast<const ElementEnvelope<Field>&> (x)._elem); }
+ /** MOne equality.
+ * Test if field base element is equal to one.
+ * This function assumes the field base element has already been
+ * constructed and initialized.
+ * @return boolean true if equals one, false if not.
+ * @param x field base element.
+ */
+ bool isMOne (const ElementAbstract& x) const
+ { return _field.isMOne (static_cast<const ElementEnvelope<Field>&> (x)._elem); }
+
+
/** Inplace Addition.
* x += y
* This function assumes both field base elements have already been
@@ -499,12 +510,6 @@ namespace LinBox
*/
std::ostream& write (std::ostream& os) const { return _field.write (os); }
- /** Read field.
- * @return input stream from which field is read.
- * @param is input stream from which field is read.
- */
- std::istream& read (std::istream& is) { return _field.read (is); }
-
/** Print field base element.
* This function assumes the field base element has already been
* constructed and initialized.
diff --git a/linbox/field/field-interface.h b/linbox/field/field-interface.h
index 641c8ec..a68fc25 100644
--- a/linbox/field/field-interface.h
+++ b/linbox/field/field-interface.h
@@ -37,7 +37,7 @@ namespace LinBox
* \c convert(), \c init(), \c assign(), \c characteristic(), \c cardinality().
*
* Predicates on field elements:
- * \c areEqual(), \c isZero(), \c isOne().
+ * \c areEqual(), \c isZero(), \c isOne(), \c isMOne().
*
* Basic arithmetic functions:
* \c axpy(), \c add(), \c neg(), \c sub(), \c mul(), \c inv(),\c div().
diff --git a/linbox/field/field-traits.h b/linbox/field/field-traits.h
index af9c9c2..903b2c2 100644
--- a/linbox/field/field-traits.h
+++ b/linbox/field/field-traits.h
@@ -23,6 +23,10 @@
#define __LINBOX_field_traits_H
#include "linbox/integer.h"
+#include <givaro/givcaster.h>
+#include <givaro/givinteger.h>
+#include <givaro/givrational.h>
+#include <givaro/zring.h>
// Namespace in which all LinBox library code resides
namespace LinBox {
@@ -43,6 +47,8 @@ namespace LinBox {
struct GenericTag{};
//! If it is isomorphic to Z/mZ, for some m or its extensions.
struct ModularTag : public virtual GenericTag{};
+ //! Galois Field GF(p^e)
+ struct GaloisTag : public virtual GenericTag {};
//! If it is isomorphic to Z
struct IntegerTag : public virtual GenericTag{};
//! If it is isomorphic to Q
@@ -56,30 +62,57 @@ namespace LinBox {
typedef RingCategories::GenericTag categoryTag;
};
+ using Givaro::Caster;
+
+ template<>
+ struct ClassifyRing<Givaro::QField<Givaro::Rational>> {
+ typedef RingCategories::RationalTag categoryTag;
+ };
+ template<>
+ struct ClassifyRing<Givaro::ZRing<Givaro::Integer>> {
+ typedef RingCategories::IntegerTag categoryTag;
+ };
+ template<>
+ struct ClassifyRing<Givaro::IntegerDom> {
+ typedef RingCategories::IntegerTag categoryTag;
+ };
+
+
/*! FieldTrait.
*/
template <class Field>
struct FieldTraits {
+
typedef typename ClassifyRing<Field>::categoryTag categoryTag;
static integer& maxModulus( integer& i )
{
- return i = static_cast<integer>(Field::getMaxModulus());
+ return Caster(i, Field::maxCardinality());
}
static uint64_t & maxModulus( uint64_t& i )
{
- return i = static_cast<uint64_t>(Field::getMaxModulus());
+ return Caster(i, Field::maxCardinality());
+// return i = static_cast<uint64_t>(Field::maxCardinality());
}
static uint32_t & maxModulus( uint32_t& i )
{
- return i = static_cast<uint32_t>(Field::getMaxModulus());
+ return Caster(i, Field::maxCardinality());
+// return i = static_cast<uint32_t>(Field::maxCardinality());
+ }
+
+ template<class T>
+ static T & maxModulus( T & i )
+ {
+ return i = static_cast<T>(Field::maxCardinality());
}
static integer maxModulus()
{
- return static_cast<integer>(Field::getMaxModulus());
+ integer maxm;
+ return Caster(maxm, Field::maxCardinality());
+// return static_cast<integer>(Field::maxCardinality());
}
static bool goodModulus( const integer& i )
@@ -108,6 +141,7 @@ namespace LinBox {
else
return ( i >= 1 && i <= max );
}
+
};
@@ -147,11 +181,11 @@ namespace LinBox { /* areFieldEqual */
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
// Local Variables:
// mode: C++
// tab-width: 8
// indent-tabs-mode: nil
// c-basic-offset: 8
// End:
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/field/gf2.h b/linbox/field/gf2.h
index 79a4b36..97c039b 100644
--- a/linbox/field/gf2.h
+++ b/linbox/field/gf2.h
@@ -5,20 +5,20 @@
*
* ------------------------------------
*
- *
+ *
* ========LICENCE========
* This file is part of the library LinBox.
- *
+ *
* LinBox is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
- *
+ *
* This library 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
* Lesser General Public License for more details.
- *
+ *
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
@@ -29,11 +29,11 @@
#ifndef __LINBOX_field_gf2_H
#define __LINBOX_field_gf2_H
+#include "linbox/linbox-config.h"
#include <iostream>
#include <climits>
#include <cmath>
-#include "linbox/linbox-config.h"
#include "linbox/util/debug.h"
#include "linbox/integer.h"
#include "linbox/field/field-interface.h"
@@ -41,7 +41,7 @@
#include "linbox/field/field-traits.h"
// #include "linbox/vector/vector-domain.h"
-#ifndef __PATHCC__
+#if !defined(__PATHCC__) && !(defined(__APPLE__) && defined(__clang__))
#define stdBitReference std::_Bit_reference
#else
#define stdBitReference std::vector<bool>::reference
@@ -81,6 +81,7 @@ namespace LinBox
/** Element type
*/
typedef bool Element;
+ typedef bool Residu_t;
/** Random iterator generator type.
* It must meet the common object interface of random element generators
@@ -100,15 +101,15 @@ namespace LinBox
GF2 (int p, int exp = 1) :
zero(false),one(true),mOne(true)
{
- if(p != 2) throw PreconditionFailed(__func__,__FILE__,__LINE__,"modulus must be 2");
- if(exp != 1) throw PreconditionFailed(__func__,__FILE__,__LINE__,"exponent must be 1");
+ if(p != 2) throw PreconditionFailed(LB_FILE_LOC,"modulus must be 2");
+ if(exp != 1) throw PreconditionFailed(LB_FILE_LOC,"exponent must be 1");
}
/** Copy constructor.
- * Constructs Modular object by copying the field.
+ * Constructs Givaro::Modular object by copying the field.
* This is required to allow field objects to be passed by value
* into functions.
- * @param F Modular object.
+ * @param F Givaro::Modular object.
*/
GF2 (const GF2 & F ) :
zero(false),one(true),mOne(true) {}
@@ -116,10 +117,10 @@ namespace LinBox
/** Assignment operator.
* Required by the archetype
*
- * @param F constant reference to Modular object
- * @return reference to Modular object for self
+ * @param F constant reference to Givaro::Modular object
+ * @return reference to Givaro::Modular object for self
*/
- const GF2 &operator = (const GF2 &F)
+ GF2 &operator = (const GF2 &F)
{
return *this;
}
@@ -134,16 +135,17 @@ namespace LinBox
* @param x field base element to contain output (reference returned).
* @param y integer.
*/
- Element &init (Element &x, const int &y ) const
+ Element &init (Element &x, const int64_t &y ) const
{
return x = y & 1;
}
- Element &init (Element &x, const unsigned int &y ) const
+ Element &init (Element &x, const uint64_t &y ) const
{
return x = y & 1;
}
+/*
Element &init (Element &x, const long &y ) const
{
return x = y & 1;
@@ -159,6 +161,7 @@ namespace LinBox
return x = static_cast<unsigned char>(y) & 1;
}
+*/
Element &init (Element &x, const double &y) const
{
return x = static_cast<unsigned char>(y) & 1;
@@ -166,7 +169,8 @@ namespace LinBox
Element &init (Element &x, const integer &y) const
{
- return x = static_cast<long>(y) & 1;
+ //return x = static_cast<long>(y) & 1;
+ return x = y & (uint32_t)1;
}
@@ -177,12 +181,12 @@ namespace LinBox
BitVector::reference init (BitVector::reference x, const integer &y = 0) const
{
- return x = long (y) & 1;
+ return x = y & (uint32_t)1;
}
stdBitReference init (stdBitReference x, const integer &y = 0) const
{
- return x = long (y) & 1;
+ return x = y & (uint32_t)1;
}
/** Conversion of field base element to a template class T.
@@ -331,6 +335,18 @@ namespace LinBox
return x;
}
+ /** MOne equality.
+ * Test if field base element is equal to one.
+ * This function assumes the field base element has already been
+ * constructed and initialized.
+ * @return boolean true if equals one, false if not.
+ * @param x field base element.
+ */
+ bool isMOne (Element x) const
+ {
+ return x;
+ }
+
//@} Arithmetic Operations
/** @name Input/Output Operations */
@@ -392,7 +408,11 @@ namespace LinBox
* @return \c is
*/
std::istream &read (std::istream &is, stdBitReference x) const
- { bool a; is >> a; x=a; return is;
+ {
+ bool a = true;
+ is >> a;
+ x=a;
+ return is;
}
//@}
@@ -962,13 +982,18 @@ namespace LinBox
//@} Inplace Arithmetic Operations
- static inline int getMaxModulus()
+ static inline int maxCardinality()
{
return 2;
}
}; // class GF2
+ template<>
+ struct DenseVectorChooser<GF2> {
+ typedef BitVector type;
+ };
+
} // namespace LinBox
// #define LINBOX_field_gf2_H
@@ -978,8 +1003,14 @@ namespace LinBox
// Specialization of homomorphism for basefield
#include "linbox/randiter/gf2.h"
+#if __cplusplus >= 201103L
+#if defined( __APPLE__) && defined(__clang__)
+#include <__bit_reference>
+#else
+#include <bits/stl_bvector.h>
+#endif /* __clang__ */
+#else
// #include <bits/stl_bvector.h>
-namespace std
{
//! @todo JGD 05.11.2009 : it should be in bits/stl_bvector.h ...
inline void swap(stdBitReference __x, stdBitReference __y)
@@ -989,6 +1020,7 @@ namespace std
__y = __tmp;
}
}
+#endif
#include "linbox/field/gf2.inl"
diff --git a/linbox/field/givaro.h b/linbox/field/givaro.h
deleted file mode 100644
index 6f35ff4..0000000
--- a/linbox/field/givaro.h
+++ /dev/null
@@ -1,48 +0,0 @@
-/* linbox/field/givaro.h
- * Copyright (C) 2002 Pascal Giorgi
- *
- * Written by Pascal Giorgi <pascal.giorgi at ens-lyon.fr>
- *
- *
- * ========LICENCE========
- * This file is part of the library LinBox.
- *
- * LinBox is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- * ========LICENCE========
- *.
- */
-
-#ifndef __LINBOX_field_givaro_H
-#define __LINBOX_field_givaro_H
-
-#include "linbox/field/field-traits.h"
-#include "linbox/field/Givaro/givaro-zpz.h"
-#include "linbox/field/Givaro/givaro-montg.h"
-#include "linbox/field/Givaro/givaro-gfq.h"
-#include "linbox/field/Givaro/givaro-rational.h"
-#include "linbox/field/Givaro/givaro-extension.h"
-#include "linbox/field/Givaro/givaro-field.h"
-#include "linbox/field/Givaro/givaro-field-gf2.h"
-
-#endif // __LINBOX_field_givaro_H
-
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
-// Local Variables:
-// mode: C++
-// tab-width: 8
-// indent-tabs-mode: nil
-// c-basic-offset: 8
-// End:
-
diff --git a/linbox/field/gmp-rational.h b/linbox/field/gmp-rational.h
index c300923..011f317 100644
--- a/linbox/field/gmp-rational.h
+++ b/linbox/field/gmp-rational.h
@@ -5,20 +5,20 @@
*
* ----------------------------------------
*
- *
+ *
* ========LICENCE========
* This file is part of the library LinBox.
- *
+ *
* LinBox is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
- *
+ *
* This library 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
* Lesser General Public License for more details.
- *
+ *
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
@@ -41,7 +41,6 @@
#include "linbox/util/debug.h"
#include "linbox/field/field-traits.h"
-// Namespace in which all LinBox library code resides
namespace LinBox
{
@@ -155,34 +154,40 @@ namespace LinBox
return x;
}
+ /* this is assign(x,y)
Element &init (Element &x, const Element &y) const
{
mpq_set (x.rep, y.rep);
return x;
- }
+ }*/
+
+ /*
+ Element &init (Element &x, int32_t &y ) const
- Element &init (Element &x, const int &y ) const
{
mpq_set_si (x. rep, (long)y,1L);
//mpq_canonicalize (x.rep);
return x;
}
+ */
- Element &init (Element &x, const long int &y ) const
+ Element &init (Element &x, const int64_t &y ) const
{
mpq_set_si (x. rep, (long)y,1L);
//mpq_canonicalize (x.rep);
return x;
}
- Element &init (Element &x, const unsigned int &y ) const
+ /*
+ Element &init (Element &x, const uint32_t &y ) const
{
mpq_set_ui (x. rep, (unsigned long)y,1L);
//mpq_canonicalize (x.rep);
return x;
}
+ */
- Element &init (Element &x, const long unsigned int &y ) const
+ Element &init (Element &x, const uint64_t &y ) const
{
mpq_set_ui (x. rep, (long unsigned)y,1L);
//mpq_canonicalize (x.rep);
@@ -428,6 +433,19 @@ namespace LinBox
bool isOne (const Element &x) const
{ return mpq_cmp_ui (x.rep, 1L, 1L) == 0; }
+ /** MOne equality.
+ * Test if field element is equal to one.
+ * This function assumes the field element has already been
+ * constructed and initialized.
+ * In this implementation, this means the _elem_ptr of x
+ * exists and does not point to null.
+ * @return boolean true if equals one, false if not.
+ * @param x field element.
+ */
+ bool isMOne (const Element &x) const
+ { return mpq_cmp_ui (x.rep, 1L, 1L) == 0; }
+
+
/** Inplace Addition.
* x += y
* This function assumes both field elements have already been
@@ -751,12 +769,12 @@ namespace LinBox
_cardinality (0), _characteristic (0), _zero (0), _one (1), _mOne (-1),
zero (_zero, _one), one (_one, _one), mOne (_mOne, _one)
{
- if(p != 0) throw PreconditionFailed(__func__,__FILE__,__LINE__,"modulus must be 0 (no modulus)");
- if(exp != 1) throw PreconditionFailed(__func__,__FILE__,__LINE__,"exponent must be 1");
+ if(p != 0) throw PreconditionFailed(LB_FILE_LOC,"modulus must be 0 (no modulus)");
+ if(exp != 1) throw PreconditionFailed(LB_FILE_LOC,"exponent must be 1");
}
/// max modulus.
- static inline int getMaxModulus() { return 0; } // no modulus
+ static inline int maxCardinality() { return 0; } // no modulus
/*! get numerator.
* @param x numerator of y
@@ -793,11 +811,11 @@ namespace LinBox
* @param q
* @return \c bs
*/
- integer& bitsize(integer& bs, const Element q) const
+ integer& bitsize(integer& bs, const Element & q) const
{
integer y; get_den(y,q);
integer x; get_num(x,q);
- bs = x.bitsize() + y.bitsize();
+ bs = uint64_t (x.bitsize() + y.bitsize());
return bs;
}
@@ -833,11 +851,10 @@ namespace LinBox
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
// Local Variables:
// mode: C++
// tab-width: 8
// indent-tabs-mode: nil
// c-basic-offset: 8
// End:
-
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/field/hom.h b/linbox/field/hom.h
index 76e9e51..a46b0ce 100644
--- a/linbox/field/hom.h
+++ b/linbox/field/hom.h
@@ -1,20 +1,20 @@
/* linbox/field/hom.h
* Copyright(C) LinBox
* Written by David Saunders
- *
+ *
* ========LICENCE========
* This file is part of the library LinBox.
- *
+ *
* LinBox is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
- *
+ *
* This library 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
* Lesser General Public License for more details.
- *
+ *
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
@@ -26,14 +26,19 @@
#define __LINBOX_hom_H
#include "linbox/linbox-config.h"
-#include "linbox/field/modular.h"
-#include "linbox/field/PID-integer.h"
#include "linbox/util/error.h"
+#include "linbox/integer.h"
+#include <givaro/givcaster.h>
+#include <givaro/givrational.h>
+#include <givaro/modular.h>
+#include <givaro/zring.h>
#ifdef __LINBOX_HAVE_NTL
-#include "linbox/field/NTL/ntl-ZZ.h"
+#include "linbox/ring/ntl/ntl-zz.h"
#endif //__LINBOX_HAVE_NTL
+#include "givaro/givrational.h"
+
namespace LinBox
{
/// Error object for attempt to establish a Hom that cannot exist.
@@ -46,16 +51,16 @@ namespace LinBox
* to a ring (usually field) of type Target. The intended use is that
* it will be a natural mapping. For instance:
*
- * Hom<Unparametric<Integers>, Modular<integer> >(Z, Zp) nat; // is the mod p mapping.
+ * Hom<Unparametric<Integers>, Givaro::Modular<integer> >(Z, Zp) nat; // is the mod p mapping.
*
- * Hom<<NTL_ZZp, Modular<integer> >(Zp, Mp) nat;
+ * Hom<<NTL_ZZp, Givaro::Modular<integer> >(Zp, Mp) nat;
*
* // is an isomorphism, provided the Zp and Mp have same characteristic.
* Hom<Unparametric<NTL_ZZp, Unparameteric<NTL_ZZpEx> >(Z3, Z27) nat;
* // is the embedding of the prime field in the extension.
*/
- template< class Source, class Target >
+ template< class Source, class Target, class Enabled = void > // Enabled is just for std::enable_if
class Hom {
public:
typedef typename Source::Element SrcElt;
@@ -96,8 +101,8 @@ namespace LinBox
private:
integer tmp;
- Source _source;
- Target _target;
+ const Source& _source;
+ const Target& _target;
}; // end Hom
@@ -115,127 +120,98 @@ namespace LinBox
Hom(const Source& S, const Target& T) :
_source (S)
{}
+
Elt& image(Elt& t, const SrcElt& s)
{
- _source. assign (t, s);
+ _source.assign (t, s);
return t;
}
+
SrcElt& preimage(SrcElt& s, const Elt& t)
{
- _source. assign (s, t);
+ _source.assign (s, t);
return s;
}
+
const Source& source() { return _source;}
const Target& target() { return _source;}
protected:
- Source _source;
- }; // end Hom
+ const Source& _source;
+ };
}
-#ifdef __LINBOX_field_modular_H
-// including specialization to modular
-//#include "linbox/field/modular.h"
-/// Specialization to Modular<uint16_t> --> Modular<uint_32>.
-// Just a trial. delete this when better examples exist.
-namespace LinBox
-{
- template<> inline Hom<Modular<uint16_t>, Modular<uint32_t> >::
- Hom(const Modular<uint16_t>& S, const Modular<uint32_t>& T ) :
- _source(S),_target(T)
- {
- integer ps, pt;
- if (S.characteristic(ps) != T.characteristic(pt)) throw NoHomError();
- }
-
- template<> inline Modular<uint32_t>::Element& Hom<Modular<uint16_t>, Modular<uint32_t> >::
- image(Modular<uint32_t>::Element& t, const Modular<uint16_t>::Element& s)
- {
- return t = s;
- }
-
- // assumes t normalized.
- template<> inline Modular<uint16_t>::Element& Hom<Modular<uint16_t>, Modular<uint32_t> >::
- preimage(Modular<uint16_t>::Element& s, const Modular<uint32_t>::Element& t)
- {
- linbox_check(t < UINT8_MAX) ;
- return s = (uint16_t) t;
- }
-
-}// namespace LinBox
-#endif //__LINBOX_field_modular_H
-
-#ifdef __LINBOX_field_unparametric_H
+// // Specialization to modular
+// namespace LinBox
+// {
+// // GENERIC SPECIALISATION FOR MODULAR HOMORMOPHISM
+// // The enable_if is to protect undetermination with Hom<Source, Source>
+// template<typename T1, typename C1, typename T2, typename C2>
+// class Hom<Givaro::Modular<T1, C1>, Givaro::Modular<T2, C2>,
+// typename std::enable_if<!std::is_same<Givaro::Modular<T1, C1>, Givaro::Modular<T2, C2>>::value>::type>
+// {
+// public:
+// using Element1 = typename Givaro::Modular<T1, C1>::Element;
+// using Element2 = typename Givaro::Modular<T2, C2>::Element;
+
+// Hom(const Givaro::Modular<T1, C1>& S, const Givaro::Modular<T2, C2>& T)
+// {
+// integer ps, pt;
+// if (S.characteristic(ps) != T.characteristic(pt)) throw NoHomError();
+// }
+
+// inline Element2& image(Element2& t, const Element1& s) const
+// {
+// return Givaro::Caster<Element2,Element1>(t,s);
+// }
+
+// // assumes t normalized.
+// inline Element1& preimage(Element1& s, const Element2& t) const
+// {
+// return Givaro::Caster<Element1,Element2>(s,t);
+// }
+// };
+// }// namespace LinBox
+
namespace LinBox
{
- template<class _Target>
- class Hom<UnparametricField<integer>, _Target> {
+ template<class _Source>
+ class Hom<_Source, Givaro::ZRing<Integer> > {
public:
- typedef UnparametricField<integer> Source;
- typedef _Target Target;
+ typedef Givaro::ZRing<Integer> Target;
+ typedef _Source Source;
typedef typename Source::Element SrcElt;
- typedef typename Target::Element Elt;
+ typedef Integer Elt;
Hom(const Source& S, const Target& T) :
_source (S), _target (T)
{}
- inline Elt& image(Elt& t, const SrcElt& s)
+ inline Integer& image(Integer& t, const SrcElt& s)
{
- _target. init (t, s);
- return t;
+ return Givaro::Caster(t,s);
}
- inline SrcElt& preimage(SrcElt& s, const Elt& t)
+ inline SrcElt& preimage(SrcElt& s, const Integer& t)
{
- _target. convert (s, t);
- return s;
+ return Givaro::Caster(s,t);
}
const Source& source() { return _source;}
const Target& target() { return _target;}
protected:
- Source _source;
- Target _target;
- }; // end Hom
-
- template<>
- class Hom<UnparametricField<integer>, UnparametricField<integer> > {
-
- public:
- typedef UnparametricField<integer> Source;
- typedef UnparametricField<integer> Target;
- typedef Source::Element SrcElt;
- typedef Target::Element Elt;
-
- Hom(const Source& S, const Target& T) :
- _source (S), _target (T)
- {}
- inline Elt& image(Elt& t, const SrcElt& s)
- {
- t = s;
- return t;
- }
- inline SrcElt& preimage(SrcElt& s, const Elt& t)
- {
- s = t;
- return s;
- }
- const Source& source() { return _source;}
- const Target& target() { return _target;}
-
- protected:
- Source _source;
- Target _target;
+ const Source& _source;
+ const Target& _target;
}; // end Hom
+
template<class _Target>
- class Hom<PID_integer, _Target> {
+ class Hom<Givaro::ZRing<Integer>, _Target> {
public:
- typedef PID_integer Source;
+ typedef Givaro::ZRing<Integer> Source;
typedef _Target Target;
typedef typename Source::Element SrcElt;
typedef typename Target::Element Elt;
@@ -243,11 +219,13 @@ namespace LinBox
Hom(const Source& S, const Target& T) :
_source (S), _target (T)
{}
- inline Elt& image(Elt& t, const SrcElt& s) {
+ inline Elt& image(Elt& t, const SrcElt& s)
+ {
_target. init (t, s);
return t;
}
- inline SrcElt& preimage(SrcElt& s, const Elt& t) {
+ inline SrcElt& preimage(SrcElt& s, const Elt& t)
+ {
_target. convert (s, t);
return s;
}
@@ -255,80 +233,82 @@ namespace LinBox
const Target& target() { return _target;}
protected:
- Source _source;
- Target _target;
+ const Source& _source;
+ const Target& _target;
}; // end Hom
-
template<>
- class Hom<PID_integer, PID_integer> {
+ class Hom<Givaro::ZRing<Integer>, Givaro::ZRing<Integer> > {
public:
- typedef PID_integer Source;
+ typedef Givaro::ZRing<Integer> Source;
typedef Source Target;
- typedef Source::Element SrcElt;
- typedef Target::Element Elt;
+ typedef Integer SrcElt;
+ typedef Integer Elt;
Hom(const Source& S, const Target& T) :
_source (S), _target (T)
{}
inline Elt& image(Elt& t, const SrcElt& s)
- {
- _target. assign (t, s);
- return t;
+ {
+ return t=s;
}
- inline SrcElt& preimage(SrcElt& s, const Elt& t) {
- _target. assign (s, t);
- return s;
+ inline SrcElt& preimage(SrcElt& s, const Elt& t)
+ {
+ return s=t;
}
const Source& source() { return _source;}
const Target& target() { return _target;}
protected:
- Source _source;
- Target _target;
+ const Source& _source;
+ const Target& _target;
}; // end Hom
-
-#if 0
-#ifdef __FIELD_MODULAR_H
- // Dan Roche mapping from UnparametricField to Modular - for integer
- // computations that use mod one or more primes and possibly chinese
- // remaindering.
- template<class _INT1, class _INT2>
- class Hom<UnparametricField<_INT1 >,Modular<_INT2 > > {
+ template <class _Target>
+ class Hom<Givaro::QField<Givaro::Rational>, _Target> {
public:
- typedef UnparametricField<_INT1 > Source;
- typedef Modular<_INT2 > Target;
- typedef _INT1 SrcElt;
- typedef _INT2 Elt;
+ typedef Givaro::QField<Givaro::Rational> Source;
+ typedef _Target Target;
+ typedef typename Source::Element SrcElt;
+ typedef typename Target::Element Elt;
Hom(const Source& S, const Target& T) :
- _source(S), _target(T)
- {}
-
- inline Elt& image(Elt& t, const SrcElt& s) {
- integer temp;
- return _target.init(t,_source.convert(temp,s));
+ _source (S), _target(T)
+ { }
+ Elt& image(Elt& t, const SrcElt& s) {
+ if (_source.isOne(s.deno())) {
+ return _target.init(t,s.nume());
+ }
+ else if (_source.isOne(s.nume())) {
+ _target.init(t,s.deno());
+ return _target.invin(t);
+ }
+ else {
+ _target. init (tmp, s.deno());
+ _target. init (t, s.nume());
+ return _target. divin (t, tmp);
+ }
}
- inline SrcElt& preimage(SrcElt& s, const Elt& t) {
- integer temp;
- return _source.init(s,_source.convert(temp,t));
+ // Warning, by default convert only the numerator
+ SrcElt& preimage(SrcElt& s, const Elt& t) {
+ _target. convert (s.nume(), t);
+ _source. init (s, s.nume());
+ return s;
}
- const Source& source() { return _source; }
- const Target& target() { return _target; }
+ const Source& source() { return _source;}
+ const Target& target() { return _target;}
protected:
+ Elt tmp;
Source _source;
Target _target;
}; // end Hom
-#endif // __FIELD_MODULAR_H
-#endif
} // namespace LinBox
-#endif //__LINBOX_field_unparametric_H
+
#ifdef __LINBOX_HAVE_NTL
namespace LinBox
@@ -356,7 +336,7 @@ namespace LinBox
const Target& target() { return _target;}
protected:
- integer tmp;
+ Integer tmp;
Source _source;
Target _target;
}; // end Hom
@@ -389,83 +369,6 @@ namespace LinBox
}
#endif //__LINBOX_HAVE_NTL
-#ifdef __LINBOX_field_gmp_rational_H
-namespace LinBox
-{
- template <class _Target>
- class Hom<GMPRationalField, _Target> {
-
- public:
- typedef GMPRationalField Source;
- typedef _Target Target;
- typedef typename Source::Element SrcElt;
- typedef typename Target::Element Elt;
-
- Hom(const Source& S, const Target& T) :
- _source (S), _target(T)
- { }
- Elt& image(Elt& t, const SrcElt& s) {
- _source. get_num (num, s);
- _source. get_den (den, s);
- if (den == 1) {
- return _target.init(t,num);
- }
- else if (num == 1) {
- _target.init(t,den);
- return _target.invin(t);
- }
- else {
- _target. init (tmp, den);
- _target. init (t, num);
- return _target. divin (t, tmp);
- }
- // _target. init (t, den);
- // return _target. invin (t);
- }
- SrcElt& preimage(SrcElt& s, const Elt& t) {
- _target. convert (num, t);
- _source. init (s, num);
- return s;
- }
- const Source& source() { return _source;}
- const Target& target() { return _target;}
-
- protected:
- integer num, den;
- Elt tmp;
- Source _source;
- Target _target;
- }; // end Hom
-
- template <>
- class Hom<GMPRationalField, GMPRationalField> {
-
- public:
- typedef GMPRationalField Source;
- typedef Source Target;
- typedef Source::Element SrcElt;
- typedef Target::Element Elt;
-
- Hom(const Source& S, const Target& T) :
- _source (S), _target(T)
- {}
- Elt& image(Elt& t, const SrcElt& s) {
- _target.assign(t, s);
- return t;
- }
- SrcElt& preimage(SrcElt& s, const Elt& t) {
- _source.assign(s, t);
- return s;
- }
- const Source& source() { return _source;}
- const Target& target() { return _target;}
-
- protected:
- Source _source;
- Target _target;
- }; // end Hom
-}
-#endif //__LINBOX_field_gmp_rational_H
#ifdef __LINBOX_field_gf2_H
namespace LinBox
@@ -545,13 +448,14 @@ namespace LinBox
}
-#include "linbox/field/Givaro/givaro-extension.h"
+#include <givaro/extension.h>
+
namespace LinBox
{
template<>
- class Hom < GF2, GivaroExtension<GF2> > {
+ class Hom < GF2, Givaro::Extension<GF2> > {
typedef GF2 Source;
- typedef GivaroExtension<GF2> Target;
+ typedef Givaro::Extension<GF2> Target;
public:
typedef Source::Element SrcElt;
typedef Target::Element Elt;
@@ -614,10 +518,10 @@ namespace LinBox
namespace LinBox
{
template<>
- class Hom <GivaroGfq,GivaroGfq> {
+ class Hom <Givaro::GFq,Givaro::GFq> {
public:
- typedef GivaroGfq Source;
- typedef GivaroGfq Target;
+ typedef Givaro::GFq Source;
+ typedef Givaro::GFq Target;
typedef Source::Element SrcElt;
typedef Target::Element Elt;
@@ -636,7 +540,7 @@ namespace LinBox
* image(t, s) implements the homomorphism, assigning the
* t the value of the image of s under the mapping.
*
- * The default behaviour goes through integers.
+ * The default behaviour goes through Integers.
*/
Elt& image(Elt& t, const SrcElt& s)
{
@@ -648,7 +552,7 @@ namespace LinBox
* An error may be thrown, a conventional value may be set, or
* an arb value set.
*
- * The default behaviour goes through integers.
+ * The default behaviour goes through Integers.
*/
SrcElt& preimage(SrcElt& s, const Elt& t)
{
@@ -658,7 +562,7 @@ namespace LinBox
const Target& target() { return _target;}
private:
- integer tmp;
+ Integer tmp;
Source _source;
Target _target;
}; // end Hom
diff --git a/linbox/field/image-field.h b/linbox/field/image-field.h
new file mode 100644
index 0000000..135a9ac
--- /dev/null
+++ b/linbox/field/image-field.h
@@ -0,0 +1,86 @@
+/* -*- mode: C++; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
+
+/* linbox/field/image-field.h
+ * Written by David Saunders
+ * See COPYING for license information.
+ */
+
+#ifndef __IMAGE_FIELD_H
+#define __IMAGE_FIELD_H
+
+#include "linbox/field/hom.h"
+namespace LinBox
+{
+
+/**
+ * ImageFields are fields which are targets of a ring homomorphism from a source ring.
+ * Usually the source ring is ZZ or another field.
+ * The ImageField can be viewed as a module over the source ring. Hence we could think
+ * of the source as the scalar domain. Thus a mul of a source element times a
+ * image element can be thought of as a scalar multiplication and we call the op smul().
+ * Often this can be done faster than taking the image of the scalar and multiplying
+ * in the image field.
+ *
+ * ImageFields provide smul() and saxpy() as well as the image() and preimage() maps of the
+ * homomorphism.
+ *
+ * The generic default is to build the ImageField functions directly from a Hom object,
+ * but the intention is to provide efficient specializations for specific cases.
+ *
+ * Issues abound. How do we convey that the scalars are small so a implementation
+ * of a modular image can be efficient in that case?
+ */
+template<class Source, class Target>
+class ImageField: public Target
+{ protected:
+ typedef typename Target::Element Elt;
+ typedef typename Source::Element SrcElt;
+ Hom<Source, Target> _nat;
+ public:
+ ImageField(){}
+ ImageField(Hom<Source, Target> nat):Target(nat.target()),_nat(nat) {}
+
+ ImageField(Source& S, Target& T) : Target(T),_nat(Hom<Source,Target>(S, T)) {}
+
+ Elt & image(Elt& t, const SrcElt& s)
+ { return _nat.image(t, s); }
+
+ SrcElt& preimage(SrcElt& s, const Elt& t)
+ { return _nat.preimage(s, t); }
+
+ /// y <-- a*x
+ Elt& smul(Elt& y, const SrcElt& a, const Elt& x)
+ { Elt w;mul(y,_nat.image(w,a),x);}
+
+ /// x <-- a*x
+ Elt& smulin(Elt& x, const SrcElt& a)
+ { Elt w; return this->mulin(x, _nat.image(w, a)); }
+
+ /// z <-- a*x + y
+ Elt& saxpy(Elt& z, const SrcElt& a, const Elt& x, const Elt& y)
+ { Elt w; return this->axpy(z, _nat.image(w, a), x, y); }
+
+ /// y <-- a*x + y
+ Elt& saxpyin(Elt& y, const SrcElt& a, const Elt& x)
+ { Elt w; return this->axpyin(y, _nat.image(w, a), x); }
+
+ /*
+ /// dot product of source vector and image vector
+ Elt& dot(vector of src, vector of target)
+ { allocate vector of target; map vector of src to it; target dot }
+
+ /// accumulator of source * target product (i.e accum results of smul's).
+ accumulator...
+ */
+}; // ImageField<Source, Target>
+
+
+// Trial specialization. Try one member. one could similarly do other member functions.
+// Delete this when better examples are available later.
+//
+template<> uint32_t& ImageField<Givaro::Modular<uint16_t>, Givaro::Modular<uint32_t> >::
+smul(uint32_t& y, const uint16_t& a, const uint32_t & x)
+ { return mul(y, static_cast<uint32_t>(a), x); }
+
+}// namespace LinBox
+#endif // __IMAGE_FIELD_H
diff --git a/linbox/field/integers.doxy b/linbox/field/integers.doxy
index df1b199..9ca2a2e 100644
--- a/linbox/field/integers.doxy
+++ b/linbox/field/integers.doxy
@@ -29,9 +29,8 @@
* LinBox provides :
* - LinBox::Integer is the Givaro representation of an integer (Givaro::Integer).
* - LinBox::integer is a synonym
- * - LinBox::PID_integer is a domain (ref ???) to perform integers operation on.
- * - Others ?
- *
+ *
+ * The Ring of integers is provided by Givaro: Givaro::ZRing<Integer>
*
* other use of integers ?
*
diff --git a/linbox/field/lidia-gfq.h b/linbox/field/lidia-gfq.h
deleted file mode 100644
index 9a4d5f4..0000000
--- a/linbox/field/lidia-gfq.h
+++ /dev/null
@@ -1,776 +0,0 @@
-/* linbox/field/lidia-gfq.h
- * Copyright (C) 2002 Pascal Giorgi
- *
- * Written by Pascal Giorgi <pascal.giorgi at ens-lyon.fr>
- *
- * ------------------------------------
- *
- *
- * ========LICENCE========
- * This file is part of the library LinBox.
- *
- * LinBox is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- * ========LICENCE========
- *.
- */
-
-
-#ifndef __LINBOX_lidia_gfq_H
-#define __LINBOX_lidia_gfq_H
-
-//-----------------------------------
-// Files of C/C++ library
-#include <iostream>
-
-//-----------------------------------
-// Files of LiDIA library
-#include "LiDIA/gf_element.h"
-#include "LiDIA/bigint.h"
-
-//-----------------------------------
-// Files of LinBox library
-#include "linbox/integer.h"
-#include "linbox/field/field-interface.h"
-#include "linbox/randiter/lidia-gfq.h"
-#include "linbox/linbox-config.h"
-#include "linbox/field/field-traits.h"
-
-#ifdef __LINBOX_XMLENABLED
-
-#include "linbox/util/xml/linbox-reader.h"
-#include "linbox/util/xml/linbox-writer.h"
-
-#include <string>
-#include <vector>
-
-#endif
-
-//------------------------------------
-
-/*! @file field/lidia-gfq.h
- * @brief LiDIA : NO DOC
-* \ingroup field
-*/
-
-// Namespace in which all LinBox library code resides
-namespace LinBox
-{
-
- template <class Ring>
- struct ClassifyRing;
-
- class LidiaGfq;
-
- template<>
- struct ClassifyRing<LidiaGfq> {
- typedef RingCategories::ModularTag categoryTag;
- };
-
- /** @brief defines the Galois Field GF(p<sup>k</sup>).
-
- * Inherits from \c galois_field of \ref LiDIA.
- * @pre \p p must be prime.
- \ingroup field
- */
- class LidiaGfq : public LiDIA::galois_field, public FieldInterface {
- public:
-
- /** Element type.
- * This type is inherited from the LiDIA class LiDIA::gf_element
- */
- typedef LiDIA::gf_element Element;
-
-
- /** Random element generator which is define in the wrapper LIDIA_randiter
- */
- typedef LidiaGfqRandIter<LidiaGfq> RandIter;
-
-
-
- /** Default constructor of the field
- */
- LidiaGfq() {}
-
-
- /** @brief Constructor of GF(p^k).
-
- * A GF(p^k) field is constructed through
- * the constructor of LiDIA LiDIA::galois_field
- * We need a double cast to pass integer arguments to the LiDIA constructor
- */
- LidiaGfq(const integer& p , const integer& k=1) :
- LiDIA::galois_field(static_cast<LiDIA::bigint>(double(p)),
- static_cast<LiDIA::lidia_size_t>(int(k))) {}
-
-
- /** Copy constructor
- */
- LidiaGfq(const LidiaGfq& F) :
- LiDIA::galois_field(F)
- {}
-
-#ifdef __LINBOX_XMLENABLED
- // XML LinBox::Reader constructor
- LidiaGfq(LinBox::Reader &R) :
- LiDIA::galois_field()
- {
- integer p, k;
- if(!R.expectTagName("field") || !R.expectChildTag()) return;
- R.traverseChild();
- if(!R.expectTagName("finite") || !R.expectChildTag()) return;
- R.traverseChild();
- if(!R.expectTagName("characteristic") || !R.expectChildTag()) return;
- R.traverseChild();
- if(!R.expectTagNum(p)) return;
- R.upToParent();
- R.upToParent();
-
- if(R.getNextChild()) {
- if(!R.expectChildTag()) return;
- R.traverseChild();
- if(!R.expectTagName("extension") || !R.expectChildTag()) return;
- R.traverseChild();
- if(!R.expectTagNum(k)) return;
-
- R.upToParent();
- R.upToParent();
- R.getPrevChild();
- }
- else {
- k = Integer(1);
- }
- R.upToParent();
-
- LidiaGfq oth(p, k);
- *this = oth;
-
- return;
-
- }
-#endif
-
-
- /** Destructor
- */
- ~LidiaGfq() {}
-
-
-
-
- /** Assignment operator.
- * Assigns unparam_field object F to field.
- * @param F unparam_field object.
- */
- LidiaGfq& operator=(const LidiaGfq& F)
- {
- return *this = F;
- }
-
- /** @name Object management
- */
-
- //@{
-
-
- /** Initialization of field Element from an integer.
- * Behaves like C++ allocator construct.
- * This function assumes the output field Element x has already been
- * constructed, but that it is not already initialized.
- * We also need to define the Element over the field.
- * So what we always initialize the Element with the zero field value.
- * If an integer different from zero is passed to the function the Element
- * is initialized to a constant polynom of Z/pZ
- * @return reference to field Element.
- * @param x field Element to contain output (reference returned).
- * @param y integer.
- */
- Element& init(Element& x , const integer& y=0) const
- {
- x.assign_zero(*this);
- if (y==1)
- x.assign_one(*this);
- else
- {
- if (y!=0)
- if (this->degree() > 1)
- {
- LiDIA::Fp_polynomial Pol;
- LiDIA::bigint p=static_cast<const LiDIA::galois_field&>(*this).characteristic();
- Pol.set_modulus(p);
- //Pol.set_max_degree((x.get_field()).degree());
-
- //integer rem, quo,tmp=y;
- LiDIA::bigint rem, quo ,tmp;
- LiDIA::string_to_bigint(std::string(y).data(),tmp);
- LiDIA::lidia_size_t deg = this->degree();
- for(LiDIA::lidia_size_t i=0;i<deg;i++)
- {
- quo=tmp/p;
- rem=tmp%p;
- tmp=quo;
- if (rem != LiDIA::bigint(0))
- Pol.set_coefficient(rem,i);
- }
- //Element e(x.get_field());
- x.set_polynomial_rep(Pol);
- //x.assign(e);
- }
- else {
- LiDIA::bigint tmp;
- LiDIA::string_to_bigint(std::string(y).data(),tmp);
- x.assign(tmp);
- }
- }
- return x;
- }
-
-
-
- /** Conversion of field base Element to an integer.
- * This function assumes the output field base Element x has already been
- * constructed, but that it is not already initialized.
- * As Elements are represented by polynom the convert function return
- * the valuation of polynom in characteristic by the Horner Method.
- * That keeps unicity of each Element.
- * @return reference to an integer.
- * @param x integer to contain output (reference returned).
- * @param y constant field base Element.
- */
- integer& convert(integer& x , const Element& y ) const
- {
- LiDIA::bigint fx(0) , X((y.get_field()).characteristic());
- LiDIA::bigint tmp;
-
-
- for(int i=(int)(y.get_field()).degree();i>0;i--)
- {
- (y.polynomial_rep()).get_coefficient(tmp,i);
- fx=fx+tmp;
- fx=fx*X;
- }
- (y.polynomial_rep()).get_coefficient(tmp,0);
- fx= fx + tmp;
-
- //long i;
- //fx.longify(i);
- unsigned int size= fx.bit_length();
-
- char s[(size>>2)+4];
- LiDIA::bigint_to_string(fx,s);
-
- return x=integer(s);
- }
-
-
-
-
- /** Assignment of one field Element to another.
- * This function assumes both field Elements have already been
- * constructed and initialized.
- * @return reference to x
- * @param x field Element (reference returned).
- * @param y field Element.
- */
- Element& assign(Element& x, const Element& y) const
- {
- x.assign(y);
- return x;
- }
-
-
-
-
- /** Cardinality.
- * Return integer representing cardinality of the field.
- * Returns p^k.
- * @return constant reference to integer representing cardinality
- * of the field.
- */
- integer& cardinality(integer& c) const
- {
- LiDIA::bigint tmp=number_of_elements();
- unsigned int size= tmp.bit_length();
- char s[(size>>2)+4];
- LiDIA::bigint_to_string(tmp,s);
-
- return c=integer(s);
-
- }
-
-
-
- /** Characteristic.
- * Return integer representing characteristic of the field.
- * Returns p.
- * @return constant reference to integer representing characteristic
- * of the field.
- */
- integer& characteristic(integer& c) const
- {
-
- LiDIA::bigint tmp = static_cast<const LiDIA::galois_field&>(*this).characteristic();
- unsigned int size= tmp.bit_length();
- char s[(size>>2)+4];
- LiDIA::bigint_to_string(tmp,s);
-
- return c= integer(s);
- }
-
-
- //@} Object Management
-
- /** @name Arithmetic Operations
- * x <- y op z; x <- op y
- * These operations require all Elements, including x, to be initialized
- * before the operation is called. Uninitialized field Elements will
- * give undefined results.
- */
- //@{
-
- /** Equality of two Elements.
- * This function assumes both field Elements have already been
- * constructed and initialized.
- * @return boolean true if equal, false if not.
- * @param x field Element
- * @param y field Element
- */
- bool areEqual(const Element& x, const Element& y) const
- {
- return x==y;
- }
-
-
- /** Addition.
- * x = y + z
- * This function assumes all the field Elements have already been
- * constructed and initialized.
- * @return reference to x.
- * @param x field Element (reference returned).
- * @param y field Element.
- * @param z field Element.
- */
- Element& add(Element& x, const Element& y, const Element& z) const
- {
- LiDIA::add(x,y,z);
- return x;
- }
-
- /** Subtraction.
- * x = y - z
- * This function assumes all the field Elements have already been
- * constructed and initialized.
- * @return reference to x.
- * @param x field Element (reference returned).
- * @param y field Element.
- * @param z field Element.
- */
- Element& sub(Element& x, const Element& y, const Element& z) const
- {
- LiDIA::subtract(x,y,z);
- return x;
- }
-
- /** Multiplication.
- * x = y * z
- * This function assumes all the field Elements have already been
- * constructed and initialized.
- * @return reference to x.
- * @param x field Element (reference returned).
- * @param y field Element.
- * @param z field Element.
- */
- Element& mul(Element& x, const Element& y, const Element& z) const
- {
- LiDIA::multiply(x,y,z);
- return x;
- }
-
- /** Division.
- * x = y / z
- * This function assumes all the field Elements have already been
- * constructed and initialized.
- * @return reference to x.
- * @param x field Element (reference returned).
- * @param y field Element.
- * @param z field Element.
- */
- Element& div(Element& x, const Element& y, const Element& z) const
- {
- LiDIA::divide(x,y,z);
- return x;
- }
-
-
- /** Additive Inverse (Negation).
- * x = - y
- * This function assumes both field Elements have already been
- * constructed and initialized.
- * @return reference to x.
- * @param x field Element (reference returned).
- * @param y field Element.
- */
- Element& neg(Element& x, const Element& y) const
- {
- LiDIA::negate(x,y);
- return x;
- }
-
-
-
- /** Multiplicative Inverse.
- * x = 1 / y
- * This function assumes both field Elements have already been
- * constructed and initialized.
- * @return reference to x.
- * @param x field Element (reference returned).
- * @param y field Element.
- */
- Element& inv(Element& x, const Element& y) const
- {
- LiDIA::invert(x,y);
- return x;
- }
-
-
-
- /** Natural AXPY.
- * r = a * x + y
- * This function assumes all field Elements have already been
- * constructed and initialized.
- * @return reference to r.
- * @param r field Element (reference returned).
- * @param a field Element.
- * @param x field Element.
- * @param y field Element.
- */
- Element& axpy(Element& r,
- const Element& a,
- const Element& x,
- const Element& y) const
- {
- return r=a*x+y;
- }
-
-
-
- /** Zero equality.
- * Test if field Element is equal to zero of field.
- * This function assumes the field Element has already been
- * constructed and initialized.
- * @return boolean true if equals zero of field, false if not.
- * @param x field Element.
- */
- bool isZero(const Element& x) const
- {
- return x.is_zero();
- }
-
-
-
- /** One equality.
- * Test if field Element is equal to one of field.
- * This function assumes the field Element has already been
- * constructed and initialized.
- * @return boolean true if equals one of field, false if not.
- * @param x field Element.
- */
- bool isOne(const Element& x) const
- {
- return x.is_one();
- }
-
-
-
- /** Inplace Addition.
- * x += y
- * This function assumes both field Elements have already been
- * constructed and initialized.
- * @return reference to x.
- * @param x field Element (reference returned).
- * @param y field Element.
- */
- Element& addin(Element& x, const Element& y) const {
- return x+=y;
- }
-
- /** Inplace Subtraction.
- * x -= y
- * This function assumes both field Elements have already been
- * constructed and initialized.
- * @return reference to x.
- * @param x field Element (reference returned).
- * @param y field Element.
- */
- Element& subin(Element& x, const Element& y) const {
- return x-=y;
- }
-
- /** Inplace Multiplication.
- * x *= y
- * This function assumes both field Elements have already been
- * constructed and initialized.
- * @return reference to x.
- * @param x field Element (reference returned).
- * @param y field Element.
- */
- Element& mulin(Element& x, const Element& y) const {
- return x*=y;
- }
-
- /** Inplace Division.
- * x /= y
- * This function assumes both field Elements have already been
- * constructed and initialized.
- * @return reference to x.
- * @param x field Element (reference returned).
- * @param y field Element.
- */
- Element& divin(Element& x, const Element& y) const {
- return x/=y;
- }
-
-
- /** Inplace Additive Inverse (Inplace Negation).
- * x = - x
- * This function assumes the field Element has already been
- * constructed and initialized.
- * @return reference to x.
- * @param x field Element (reference returned).
- */
- Element& negin(Element& x) const
- {
- x.negate();
- return x;
- }
-
-
-
- /** Inplace Multiplicative Inverse.
- * x = 1 / x
- * This function assumes the field Elementhas already been
- * constructed and initialized.
- * @return reference to x.
- * @param x field Element (reference returned).
- */
- Element& invin(Element& x) const
- {
- x.invert();
- return x;
- }
-
-
-
- /** Inplace AXPY.
- * r += a * x
- * This function assumes all field Elements have already been
- * constructed and initialized.
- * @return reference to r.
- * @param r field Element (reference returned).
- * @param a field Element.
- * @param x field Element.
- */
- Element& axpyin(Element& r, const Element& a, const Element& x) const
- {
- return r+=a*x;
- }
-
- //@} Inplace Arithmetic Operations
-
-#ifndef __LINBOX_XMLENABLED
- /** @name Input/Output Operations */
- //@{
-
- /** Print field.
- * @return output stream to which field is written.
- * @param os output stream to which field is written.
- */
- std::ostream& write(std::ostream& os) const
- {
- integer c;
- return os<<"corps de Galois GF("<<
- characteristic(c)<<"^"<<degree()<<")";
- }
-
-
- /** Read field.
- * @return input stream from which field is read.
- * @param is input stream from which field is read.
- */
- std::istream& read(std::istream& is) const
- {
- return is ;
- }
-
-
- /** Print field Element like a polynom.
- * @return output stream to which field Element is written.
- * @param os output stream to which field Element is written.
- * @param e field Element.
- */
- std::ostream& write(std::ostream& os,const Element& e) const
- {
- /*integer tmp;
- (*this).convert(tmp,e);
- return os<<tmp;
- */
- return os<<e;
- }
-
-
-
- /** Read field Element.
- * @return input stream from which field Element is read.
- * @param is input stream from which field Element is read.
- * @param e field Element.
- */
- std::istream& read(std::istream& is, Element& e) const
- {
- // return is>>e;
- integer tmp;
- is>> tmp;
- (*this).init(e,tmp);
- return is;
-
- }
-
- //@}
-
-#else
- std::ostream &write(std::ostream &os) const
- {
- LinBox::Writer W;
- if( toTag(W))
- W.write(os);
-
- return os;
- }
-
- bool toTag(LinBox::Writer &W) const
- {
- LiDIA::bigint card, charac;
- LiDIA::lidia_size_t deg;
- std::string s;
-
- W.setTagName("field");
- W.setAttribute("implDetail", "lidia-gfq");
-
- card = LiDIA::galois_field::number_of_elements();
- W.setAttribute("cardinality", LinBox::Writer::numToString(s, card));
- W.addTagChild();
- W.setTagName("finite");
-
- W.addTagChild();
- W.setTagName("characteristic");
- charac = LiDIA::galois_field::characteristic();
- W.addNum(charac);
- W.upToParent();
-
- W.addTagChild();
- W.setTagName("extension");
- deg = LiDIA::galois_field::degree();
- W.addNum(deg);
- W.upToParent();
-
- W.upToParent();
-
- return true;
- }
-
- std::ostream &write(std::ostream &os, const Element &e) const
- {
- LinBox::Writer W;
- if (toTag(W, e))
- W.write(os);
-
- return os;
- }
-
- bool toTag(LinBox::Writer &W, const Element &e) const
- {
- std::string s;
- LiDIA::Fp_polynomial poly = e.polynomial_rep();
- LiDIA::bigint accum = 0, base = LiDIA::galois_field::characteristic();
- LiDIA::lidia_size_t i;
-
- for(i = poly.degree(); i >= 0; i--) {
- accum *= base;
- accum += poly[i];
- }
-
- W.setTagName("cn");
- W.addDataChild(LinBox::Writer::numToString(s, accum));
-
- return true;
- }
-
- std::istream &read(std::istream &is, Element &e) const
- {
- LinBox::Reader R(is);
- if( !fromTag(R, e)) {
- is.setstate(std::istream::failbit);
- if(!R.initalized())
- is.setstate(std::istream::badbit);
- }
-
- return is;
- }
-
- bool fromTag(LinBox::Reader &R, Element &e) const
- {
- LiDIA::bigint total, base = LiDIA::galois_field::characteristic();
- LiDIA::lidia_size_t deg = LiDIA::galois_field::degree(), i = 0;
-
- if(!R.expectTagName("cn") || !R.expectTextNum(total)) return false;
- LiDIA::Fp_polynomial f;
- f.set_modulus(base);
- f.set_max_degree(deg); // ensure the poly is correct size
-
- // initalize the polynomial
- while(total > 0) {
- f[i] = total % base;
- total /= base;
- ++i;
- }
-
-
- e.set_polynomial_rep(f);
-
- return true;
- }
-#endif
-
-
- static inline integer getMaxModulus()
- { return integer( "9007199254740881" ); } // prevprime(2^53)
-
- }; // class lidia-gfq
-
- integer& FieldTraits< LidiaGfq >::maxExponent( integer& i )
- { return i = integer(2147483647); } // 2^31-1
-
-} // namespace LinBox
-
-
-#endif // __LINBOX_lidia_gfq_H
-
-
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
-// Local Variables:
-// mode: C++
-// tab-width: 8
-// indent-tabs-mode: nil
-// c-basic-offset: 8
-// End:
-
diff --git a/linbox/field/lidia.doxy b/linbox/field/lidia.doxy
deleted file mode 100644
index 55c60a4..0000000
--- a/linbox/field/lidia.doxy
+++ /dev/null
@@ -1,29 +0,0 @@
-// Copyright (C) 2010 Brice Boyer, part of LinBox, GNU LGPL, see COPYING
-/*
- * ========LICENCE========
- * This file is part of the library LinBox.
- *
- * LinBox is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- * ========LICENCE========
- */
-
-/*! @ingroup field
- at defgroup LiDIA LiDIA
-
- at brief NO DOC
-
-*/
-
-// vim:syntax=doxygen
diff --git a/linbox/field/lidia.h b/linbox/field/lidia.h
deleted file mode 100644
index 0574b13..0000000
--- a/linbox/field/lidia.h
+++ /dev/null
@@ -1,42 +0,0 @@
-/* linbox/field/lidia.h
- * Copyright (C) 2002 Pascal Giorgi
- *
- * Written by Pascal Giorgi <pascal.giorgi at ens-lyon.fr>
- *
- *
- * ========LICENCE========
- * This file is part of the library LinBox.
- *
- * LinBox is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- * ========LICENCE========
- *.
- */
-
-#ifndef __LINBOX_field_lidia_H
-#define __LINBOX_field_lidia_H
-
-#include "linbox/field/lidia-gfq.h"
-
-#endif // __LINBOX_field_lidia_H
-
-
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
-// Local Variables:
-// mode: C++
-// tab-width: 8
-// indent-tabs-mode: nil
-// c-basic-offset: 8
-// End:
-
diff --git a/linbox/field/local2_32.h b/linbox/field/local2_32.h
deleted file mode 100644
index d8ef40a..0000000
--- a/linbox/field/local2_32.h
+++ /dev/null
@@ -1,337 +0,0 @@
-/* Copyright (C) 2010 LinBox
- * written by bds, wan
- *
- *
- *
- * ========LICENCE========
- * This file is part of the library LinBox.
- *
- * LinBox is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- * ========LICENCE========
- */
-
-
-#ifndef __LINBOX_local2_32_H
-#define __LINBOX_local2_32_H
-
-#include "linbox/field/unparametric.h"
-#include "linbox/util/debug.h"
-#include "linbox/linbox-config.h"
-#include "linbox/field/field-traits.h"
-#include "linbox/integer.h"
-#include "linbox/field/field-traits.h"
-
-namespace LinBox
-{
-
- template<typename Ring>
- struct ClassifyRing;
-
- struct Local2_32;
-
- template<>
- struct ClassifyRing<Local2_32> {
- typedef RingCategories::ModularTag categoryTag;
- };
-
- /** \brief Fast arithmetic mod 2^32, including gcd.
- *
- * Extend UnparametricField<uint32_t> which is a representation
- * of Z_2^32. It is especially fast because it uses hardware arithmetic
- * directly. This ring is a Local Principal Ideal Ring.
- *
- * These needed PIR functions are added:
- * gcdin(), isUnit(), also inv() is modified to work correctly.
- * The type Exponent is added: more effective rep of the powers of 2,
- * which are important because gcds are powers of 2).
- * This entails some new versions of divin(), mulin(), isUnit().
- *
- * Those are the function needed for the LocalSmith algorithm.
- * Further appropriate PIR functions may be added later.
- * \ingroup field
- */
-
- struct Local2_32: public UnparametricField<uint32_t>
- {
- public:
-
- typedef UnparametricField<uint32_t>::Element Element;
- typedef enum {_min=0,_max=32} Exponent; // enum?
- //Exponent& init(Exponent& a) { return a = 32; }
-
- Local2_32 (int p=2, int exp=32) :
- UnparametricField<uint32_t>(p,exp)
- {
- if(p != 2) throw PreconditionFailed(__func__,__FILE__,__LINE__,"modulus must be 2");
- if(exp != 32) throw PreconditionFailed(__func__,__FILE__,__LINE__,"exponent must be 32");
- }
-
- /*
- static inline Element& gcd(Element& c, Element& a, const Element& b)
- { c = a | b; Exponent k = 0;
- while (! (c & 1)) {c >>= 1; ++k;}
- //gcdin (k, b);
- cout << "gcd called" << endl;
- return c = 1 << k;
- }
-
-*/
- // assume k is an exponent of 2.
- static inline Exponent& gcdin(Exponent& k, const Element& b)
- { /*
- Element c = b >> k;
- c <<= k;
- Element d = b;
- std::cout << "c, b" << c << " " << b << "\n";
- if (c != b) for(k = 0; ! (d & 1); ++k) d >>= 1;
- std::cout << "g, b =" << (int)k << " " << b << "\n";
- */
- Element d = b;
- int i;
- for ( i = 0; (i < k) && (!(d&1)); ++ i) d >>= 1;
- return k = Exponent(i);
- }
-
- static inline bool isUnit(const Exponent& a)
- { return a == 0; }
-
- static inline bool isZero(const Element& a)
- { return a == 0; }
-
- static inline bool isZero(const Exponent& a)
- { return a >= 32; }
-
- // not used ...
- static inline bool isUnit(const Element& a)
- { return a & 1; }
-
- //Element& div(Element& c, const Element& a, const Element& b) const
- //{ return c = NTL::rep(a)/NTL::GCD(NTL::rep(a),NTL::rep(b)); }
- //
-
- static inline Element& mulin(Element& a, const Exponent& k)
- {
- if (k >= 32) return a = 0;
- else return a <<= k;
- }
-
- static inline Element& mulin(Element& a, const Element& b) {
- return a *= b;
- }
-
- static inline Element& axpyin(Element& r, const Element& x, const Element& y) {
- return r += x * y;
- }
-
- /*
- static inline bool isDivisor(Element a, Element b)
- { while (! (a ^ 1))
- { if (b ^ 1) return false;
- a = a >> 1; b = b >> 1;
- }
- return true;
- }
- */
-
- // assume k is an exponent of 2 and the power of 2 exactly divides a
- static inline Element& divin(Element& a, const Exponent& k)
- { return a >>= k; }
-
- static inline Element& inv(Element& a, const Element& b) {
-
- if (!isUnit(b))
- throw PreconditionFailed(__func__,__FILE__,__LINE__,"inv: not a unit");
- else {
-
- Element g, s, t;
-
- xgcd(g, s, t, b, -b);
-
- return a = s - t;
- }
- }
-
- static inline integer getMaxModulus()
- { return integer( "4294967296" ); } // 2^32
-
- protected:
-
- static Element& xgcd(Element& d, Element& s, Element& t, const Element& a, const Element& b)
- {
-
- Element u, v, u0, v0, u1, v1, u2, v2, q, r;
-
- u1 = 1; v1 = 0;
- u2 = 0; v2 = 1;
- u = a; v = b;
-
- while (v != 0) {
- q = u / v;
- //r = u % v;
- r = u - q*v;
- u = v;
- v = r;
- u0 = u2;
- v0 = v2;
- u2 = u1 - q*u2;
- v2 = v1- q*v2;
- u1 = u0;
- v1 = v0;
- }
-
-
- d = u;
- s = u1;
- t = v1;
- //std::cout << "XGCD is called: d, s, t, a, b, sa + tb: " << d << ' '
- // << s << ' ' << t << ' ' << a << ' ' << b << ' ' << s * a + t * b << '\n';
- return d;
-
- /*
-
- //Element u, v, u0, v0, u1, v1, u2, v2, q, r;
-
- Element u, v, q, r;
-
- int64_t u0, u1, u2;
-
- u1 = 1; //v1 = 0;
- u2 = 0; //v2 = 1;
- u = a; v = b;
-
- if ( b == 0) {
- s = 1;
- t = 0;
- return d = a ;
- }
-
- if (v != 0) {
- q = u / v;
- //r = u % v;
- r = u - q*v;
- u = v;
- v = r;
- u0 = u2;
- //v0 = v2;
- u2 = u1 - q * u2;
- //v2 = v1- q * v2;
- u1 = u0;
- //v1 = v0;
-
- }
-
- while (v != 0) {
- r = u;
- while ( r >= v) {
- r = u - v;
-
- u2 = u1 - u2;
- }
- u0 = u2;
- u1 = u0;
- u = v;
- v = r;
-
-
- }
-
-
- while (v != 0) {
- q = u / v;
- //r = u % v;
- r = u - q*v;
- u = v;
- v = r;
-
- u0 = u2;
- //v0 = v2;
- u2 = u1 - q * u2;
- //v2 = v1- q * v2;
- u1 = u0;
- //v1 = v0;
- }
-
-
- d = u;
- s = u1;
-
- t = ((int64_t) d - u1 * (int64_t) a) / (int64_t)b;
-
- //std::cout << "XGCD is called: d, s, t, a, b, sa + tb: " << d << ' '
- //<< s << ' ' << t << ' ' << a << ' ' << b << ' ' << s * a + t * b << '\n';
- return d;
-
-
- */
- }
-
-
- /** @brief
- * Half GCD
- * g = gcd (a, b).
- * exists t, such that: s * a + t * b = g.
- * return g.
- */
- static Element& HGCD (Element& g, Element& s, const Element& a, const Element& b) {
-
- Element u, v, u0, u1, u2, q, r;
-
- u1 = 1;
- u2 = 0;
- u = a; v = b;
-
- while (v != 0) {
- q = u / v;
- //r = u % v;
- r = u - q*v;
- u = v;
- v = r;
-
- u0 = u2;
-
- u2 = u1 - q*u2;
-
- u1 = u0;
-
- }
-
-
- g = u;
- s = u1;
-
- return g;
-
- }
-
- };
-
- template<>
- bool FieldTraits< Local2_32 >::goodModulus( const integer& i ) {
- return i == Local2_32::getMaxModulus();
- }
-
-} // namespace LinBox
-
-#endif // __LINBOX_local2_32_H
-
-
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
-// Local Variables:
-// mode: C++
-// tab-width: 8
-// indent-tabs-mode: nil
-// c-basic-offset: 8
-// End:
-
diff --git a/linbox/field/modular-balanced.h b/linbox/field/modular-balanced.h
deleted file mode 100644
index 5dd8d17..0000000
--- a/linbox/field/modular-balanced.h
+++ /dev/null
@@ -1,52 +0,0 @@
-/* linbox/field/modular-balanced.h
- * Copyright (C) 2010 LinBox
- * Written by Brice Boyer <brice.boyer at imag.fr>
- *
- *
- * ========LICENCE========
- * This file is part of the library LinBox.
- *
- * LinBox is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- * ========LICENCE========
- *.
- */
-
-/** @file field/modular-balanced.h
- * @ingroup field
- * @brief Common header for any modular-balanced field.
- * Use <code>\#include<modular-balanced></code> to get access to any modular
- * balanced representation.
- */
-
-#ifndef __LINBOX_modular_balanced_H
-#define __LINBOX_modular_balanced_H
-
-#include "linbox/field/Modular/modular-balanced-float.h"
-#include "linbox/field/Modular/modular-balanced-double.h"
-#include "linbox/field/Modular/modular-balanced-int32.h"
-#ifdef __LINBOX_HAVE_INT64
-#include "linbox/field/Modular/modular-balanced-int64.h"
-#endif
-
-#endif
-
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
-// Local Variables:
-// mode: C++
-// tab-width: 8
-// indent-tabs-mode: nil
-// c-basic-offset: 8
-// End:
-
diff --git a/linbox/field/modular.doxy b/linbox/field/modular.doxy
deleted file mode 100644
index 19ec321..0000000
--- a/linbox/field/modular.doxy
+++ /dev/null
@@ -1,33 +0,0 @@
-// Copyright (C) 2010 Brice Boyer, part of LinBox, GNU LGPL, see COPYING
-/*
- * ========LICENCE========
- * This file is part of the library LinBox.
- *
- * LinBox is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- * ========LICENCE========
- */
-
-/*! @ingroup field
- @defgroup modular Modular
-
- @brief Modular Field is a representation of \f$\mathbf{Z}/p\mathbf{Z}\f$.
-
- - Modular
- - Modular Balanced
-
- */
-
-// vim:syntax=doxygen
-
diff --git a/linbox/field/modular.h b/linbox/field/modular.h
deleted file mode 100644
index b98f955..0000000
--- a/linbox/field/modular.h
+++ /dev/null
@@ -1,842 +0,0 @@
-/* linbox/field/modular.h
- * Copyright (C) 1999-2001 William J Turner,
- * 2001 Bradford Hovinen
- *
- * Written by William J Turner <wjturner at math.ncsu.edu>,
- * Bradford Hovinen <hovinen at cis.udel.edu>
- *
- * ------------------------------------
- * 2002-04-10 Bradford Hovinen <hovinen at cis.udel.edu>
- *
- * LargeModular is now replace by a class Modular parameterized on the element
- * type. So, the old LargeModular is equivalent to Modular<integer>. All other
- * interface details are exactly the same.
- *
- * Renamed from large-modular.h to modular.h
- * ------------------------------------
- *
- *
- * ========LICENCE========
- * This file is part of the library LinBox.
- *
- * LinBox is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- * ========LICENCE========
- *.
- */
-
-/*! @file field/modular.h
- * @ingroup field
- * @brief A Modular field is a representations of <code>Z/mZ</code>.
- * This file groups many implementations/specialisations of modular fields.
- * - Modular arithmetic is provided in the <code>ModularXXX<T></code> classes.
- * - Specialisations for \ref FieldAXPY, \ref MVProductDomain, \ref DotProductDomain.
- * - Random Iterators
- * .
- *
- * @bug move Element& init(const Element&) to FFPACK. use using more..
- */
-
-#ifndef __LINBOX_field_modular_H
-#define __LINBOX_field_modular_H
-
-#include <iostream>
-#include <climits>
-#include <cmath>
-
-#include "linbox/integer.h"
-#include "linbox/vector/vector-domain.h"
-#include "linbox/matrix/matrix-domain.h"
-#include "linbox/field/field-interface.h"
-#include "linbox/util/field-axpy.h"
-#include "linbox/vector/vector-traits.h"
-#include "linbox/linbox-config.h"
-#include "linbox/field/field-traits.h"
-
-
-// Namespace in which all LinBox code resides
-namespace LinBox
-{
- template <class Element>
- class Modular;
-
- template <class Ring>
- struct ClassifyRing;
-
- template <class Element>
- struct ClassifyRing<Modular<Element> >
- {
- typedef RingCategories::ModularTag categoryTag;
- };
-
- template <class Element>
- struct ClassifyRing<Modular<Element> const>
- {
- typedef RingCategories::ModularTag categoryTag;
- };
-
-
- /** * <!-- @name ModularBase-->
- * \brief Base for prime fields where the elements are represented by various primitive types (and their operations).
- * \ingroup field
- * \defgroup Fields Fields <!--for old \ref Fields...-->
- *
- *
- * Normally use it's children. This class is of interest for the
- * developer of a new field representation.
- *
- *
- * This parameterized field can be used to construct any prime field.
- * Typical use would be Modular<integer> for integers modulo a large
- * prime, Modular<long> Modular<long long> for integers modulo a wordsize
- * prime, etc. for integers modulo a half-wordsize prime.
- */
- template <class _Element>
- class ModularBase {
- public:
-
- /*- Element type
- */
- typedef _Element Element;
-
- /*- Random iterator generator type.
- * It must meet the common object interface of random element generators
- * as given in the the archetype RandIterArchetype.
- */
- class RandIter;
-
- /*- @name Object Management
- */
- //@{
-
- /*- Default constructor.
- */
- ModularBase (void) {}
-
- /*- Constructor from an element type.
- * Sets the modulus of the field throug the static member of the
- * element type.
- * @param modulus constant reference to integer prime modulus
- */
- ModularBase (unsigned long modulus, int e = 1) :
- _modulus ((Element)modulus)
- {}
-
- /*- Constructor from an integer.
- * Sets the modulus of the field throug the static member of the
- * element type.
- * @param modulus constant reference to integer prime modulus
- */
- ModularBase (const integer &modulus) :
- _modulus ((Element) modulus)
- {}
-
- /*- Copy constructor.
- * Constructs Modular object by copying the field.
- * This is required to allow field objects to be passed by value
- * into functions.
- * @param F Modular object.
- */
- ModularBase (const ModularBase<Element> &F) :
- _modulus (F._modulus)
- {}
-
- /*- Conversion of field base element to a template class T.
- * This function assumes the output field base element x has already been
- * constructed, but that it is not already initialized.
- * @return reference to template class T.
- * @param x template class T to contain output (reference returned).
- * @param y constant field base element.
- */
- integer &convert (integer &x, const Element &y) const
- {
- return x = y;
- }
-
- double &convert (double& x, const Element &y) const
- {
- return x= (double) y;
- }
-
- float &convert (float& x, const Element &y) const
- {
- return x= (float) y;
- }
-
- /*- Assignment of one field base element to another.
- * This function assumes both field base elements have already been
- * constructed and initialized.
- * @return reference to x
- * @param x field base element (reference returned).
- * @param y field base element.
- */
- Element &assign (Element &x, const Element &y) const
- {
- return x = y;
- }
-
- /*- Cardinality.
- * Return integer representing cardinality of the domain.
- * Returns a non-negative integer for all domains with finite
- * cardinality, and returns -1 to signify a domain of infinite
- * cardinality.
- * @return integer representing cardinality of the domain
- */
- integer &cardinality (integer &c) const
- {
- return c = _modulus;
- }
-
- integer cardinality () const
- {
- return _modulus;
- }
-
- /*- Characteristic.
- * Return integer representing characteristic of the domain.
- * Returns a positive integer to all domains with finite characteristic,
- * and returns 0 to signify a domain of infinite characteristic.
- * @return integer representing characteristic of the domain.
- */
- integer &characteristic (integer &c) const
- {
- return c = _modulus;
- }
-
- unsigned long &characteristic (unsigned long &c) const
- {
- return c = _modulus;
- }
-
-
- integer characteristic () const
- {
- return _modulus;
- }
-
- //@} Object Management
-
- /*- @name Arithmetic Operations
- * x <- y op z; x <- op y
- * These operations require all elements, including x, to be initialized
- * before the operation is called. Uninitialized field base elements will
- * give undefined results.
- */
- //@{
-
- /*- Equality of two elements.
- * This function assumes both field base elements have already been
- * constructed and initialized.
- * @return boolean true if equal, false if not.
- * @param x field base element
- * @param y field base element
- */
- bool areEqual (const Element &x, const Element &y) const
- {
- return x == y;
- }
-
- /*- Zero equality.
- * Test if field base element is equal to zero.
- * This function assumes the field base element has already been
- * constructed and initialized.
- * @return boolean true if equals zero, false if not.
- * @param x field base element.
- */
- bool isZero (const Element &x) const
- {
- return x == 0;
- }
-
- /*- One equality.
- * Test if field base element is equal to one.
- * This function assumes the field base element has already been
- * constructed and initialized.
- * @return boolean true if equals one, false if not.
- * @param x field base element.
- */
- bool isOne (const Element &x) const
- {
- return x == 1;
- }
-
-
- //@} Arithmetic Operations
-
- /*- @name Input/Output Operations */
- //@{
-
- /*- Print field.
- * @return output stream to which field is written.
- * @param os output stream to which field is written.
- */
- std::ostream &write (std::ostream &os) const
- {
- return os << "Modular field, mod " << _modulus;
- }
-
- /*- Read field.
- * @return input stream from which field is read.
- * @param is input stream from which field is read.
- */
- std::istream &read (std::istream &is) {
- return is >> _modulus;
- }
-
-
- /*- Print field base element.
- * This function assumes the field base element has already been
- * constructed and initialized.
- * @return output stream to which field base element is written.
- * @param os output stream to which field base element is written.
- * @param x field base element.
- */
- std::ostream &write (std::ostream &os, const Element &x) const
- {
- return os << (int) x;
- }
-
-
- /*- Read field base element.
- * This function assumes the field base element has already been
- * constructed and initialized.
- * @return input stream from which field base element is read.
- * @param is input stream from which field base element is read.
- * @param x field base element.
- */
- std::istream &read (std::istream &is, Element &x) const
- {
- integer tmp;
-
- is >> tmp;
-
- x = abs (tmp) % integer (_modulus);
- if (tmp < 0) x = _modulus - x;
-
- return is;
- }
-
- //@}
-
- protected:
-
- /// Private (non-static) element for modulus
- Element _modulus;
-
- }; // class ModularBase
-
- /* .. such comments as here should be on specialization...
- * @param element Element type, e.g. long or integer
- * @param Intermediate Type to use for intermediate computations. This
- * should be a data type that can support integers
- * twice the length of the maximal modulus used.
- *
- * The primality of the modulus will not be checked, so it is the
- * programmer's responsibility to supply a prime modulus. This class
- * implements a field of unparameterized integers modulo a prime integer.
- * Field has (non-static) member to contain modulus of field.
- */
-
- /** @brief Prime fields of positive characteristic implemented directly in LinBox.
- *
- * This parameterized field can be used to construct prime fields.
- * Typical use would be Modular<integer> for integers modulo a large
- * prime, Modular<uint32_t>, Modular<int32_t>, or Modular<double> for
- * integers modulo a wordsize prime. Each of those has specialized
- * performance features suitable to certain applications.
- */
- template <class _Element>
- class Modular : public ModularBase<_Element> {
- public:
- typedef _Element Element;
- typedef Modular<_Element> Self_t;
- typedef ModularBase<_Element> Father_t;
- typedef typename ModularBase<_Element>::RandIter RandIter;
- const Element zero,one, mOne;
-
- /*- @name Object Management
- * @brief see \ref FieldArchetype for member specs.
- */
- //@{
-
- //private:
- /*- Default constructor.
- */
- Modular () :
- zero(0),one(1),mOne(0)
- {}
-
- /*- Constructor from an element type
- * Sets the modulus of the field throug the static member of the
- * element type.
- * @param modulus constant reference to integer prime modulus
- */
- Modular (unsigned long modulus, unsigned long = 1) :
- ModularBase<_Element> (modulus),zero(0),one(1),mOne(modulus-1)
- {}
-
-
- /*- Constructor from an integer
- * Sets the modulus of the field throug the static member of the
- * element type.
- * @param modulus constant reference to integer prime modulus
- */
- Modular (const integer &modulus) :
- ModularBase<_Element> (modulus),zero(0),one(1),mOne(modulus-1)
- {}
-
- /* Assignment operator
- * Required by the archetype
- *
- * @param F constant reference to Modular object
- * @return reference to Modular object for self
- */
- const Modular &operator=(const Modular &F)
- {
- ModularBase<Element>::_modulus = F._modulus;
- F.assign(const_cast<Element&>(one),F.one);
- F.assign(const_cast<Element&>(zero),F.zero);
- F.assign(const_cast<Element&>(mOne),F.mOne);
-
- return *this;
- }
- public:
-
- static inline Element getMaxModulus()
- {
- return Element((1ULL<<(sizeof(Element)*8-1))-1);
- }
-
-
- /*- Initialization of field base element from an integer.
- * Behaves like C++ allocator construct.
- * This function assumes the output field base element x has already been
- * constructed, but that it is not already initialized.
- * This is not a specialization of the template function because
- * such a specialization is not allowed inside the class declaration.
- * @return reference to field base element.
- * @param x field base element to contain output (reference returned).
- * @param y integer.
- */
- Element &init (Element &x, const integer &y ) const
- {
- x = y % ModularBase<Element>::_modulus;
- if (x < 0) x += ModularBase<Element>::_modulus;
- return x;
- }
-
- Element &init (Element &x, const size_t &y ) const
- {
- x = (Element) y % ModularBase<Element>::_modulus;
- if (x < 0) x += ModularBase<Element>::_modulus;
- return x;
- }
-
- Element &init (Element &x, const int y ) const
- {
- x = y % ModularBase<Element>::_modulus;
- if (x < 0) x += ModularBase<Element>::_modulus;
- return x;
- }
-
- Element &init (Element &x, const long int y) const
- {
- x = y % ModularBase<Element>::_modulus;
- if (x < 0) x += ModularBase<Element>::_modulus;
- return x;
- }
-
- /*- Initialization of field base element from a double.
- * Behaves like C++ allocator construct.
- * This function assumes the output field base element x has already been
- * constructed, but that it is not already initialized.
- * This is not a specialization of the template function because
- * such a specialization is not allowed inside the class declaration.
- * @return reference to field base element.
- * @param x field base element to contain output (reference returned).
- * @param y integer.
- */
- Element &init (Element &x, const double &y) const
- {
- double z = fmod(y, (double)ModularBase<Element>::_modulus);
- if (z < 0) z += (double) ModularBase<Element>::_modulus;
- return x = (Element) (z+.5);
- }
-
- Element &init (Element &x, const float &y) const
- {
- float z = fmod(y, (float)ModularBase<Element>::_modulus);
- if (z < 0) z += (float) ModularBase<Element>::_modulus;
- return x = (Element) (z+.5);
- }
-
- Element &init(Element &x) const
- {
- return x = 0 ;
- }
-
- //@}
- /*- @name Arithmetic Operations
- * @brief see \ref FieldArchetype for member specs.
- * x <- y op z; x <- op y
- * These operations require all elements, including x, to be initialized
- * before the operation is called. Uninitialized field base elements will
- * give undefined results.
- */
- //@{
-
- /*- Addition.
- * x = y + z
- * This function assumes all the field base elements have already been
- * constructed and initialized.
- * @return reference to x.
- * @param x field base element (reference returned).
- * @param y field base element.
- * @param z field base element.
- */
- Element &add (Element &x, const Element &y, const Element &z) const
- {
- x = y + z;
- if (x >= ModularBase<Element>::_modulus) x -= ModularBase<Element>::_modulus;
- return x;
- }
-
- /* Subtraction.
- * x = y - z
- * This function assumes all the field base elements have already been
- * constructed and initialized.
- * @return reference to x.
- * @param x field base element (reference returned).
- * @param y field base element.
- * @param z field base element.
- */
- Element &sub (Element &x, const Element &y, const Element &z) const
- {
- x = y - z;
- if (x < 0) x += ModularBase<Element>::_modulus;
- return x;
- }
-
- /* Multiplication.
- * x = y * z
- * This function assumes all the field base elements have already been
- * constructed and initialized.
- * @return reference to x.
- * @param x field base element (reference returned).
- * @param y field base element.
- * @param z field base element.
- */
- Element &mul (Element &x, const Element &y, const Element &z) const
- {
- return x = (y * z) % ModularBase<Element>::_modulus;
- }
-
- /* Division.
- * x = y / z
- * This function assumes all the field base elements have already been
- * constructed and initialized.
- * @return reference to x.
- * @param x field base element (reference returned).
- * @param y field base element.
- * @param z field base element.
- */
- Element &div (Element &x, const Element &y, const Element &z) const
- {
- Element temp;
- inv (temp, z);
- return mul (x, y, temp);
- }
-
- /* Additive Inverse (Negation).
- * x = - y
- * This function assumes both field base elements have already been
- * constructed and initialized.
- * @return reference to x.
- * @param x field base element (reference returned).
- * @param y field base element.
- */
- Element &neg (Element &x, const Element &y) const
- {
- if (y == 0)
- return x = y;
- else
- return x = ModularBase<Element>::_modulus - y;
- }
-
- /* Multiplicative Inverse.
- * x = 1 / y
- * This function assumes both field base elements have already been
- * constructed and initialized.
- * @return reference to x.
- * @param x field base element (reference returned).
- * @param y field base element.
- */
- Element &inv (Element &x, const Element &y) const
- {
- // The extended Euclidean algoritm
- Element x_int, y_int, q, tx, ty, temp;
- x_int = ModularBase<Element>::_modulus;
- y_int = y;
- tx = 0;
- ty = 1;
-
- while (y_int != 0) {
- // always: gcd (modulus,residue) = gcd (x_int,y_int)
- // sx*modulus + tx*residue = x_int
- // sy*modulus + ty*residue = y_int
- q = x_int / y_int; // integer quotient
- temp = y_int; y_int = x_int - q*y_int; x_int = temp;
- temp = ty; ty = tx - q*ty; tx = temp;
- }
-
- // now x_int = gcd (modulus,residue)
- x = tx;
- if (x < 0) x += ModularBase<Element>::_modulus;
-
- return x;
- }
-
- /* Natural AXPY.
- * r = a * x + y
- * This function assumes all field elements have already been
- * constructed and initialized.
- * @return reference to r.
- * @param r field element (reference returned).
- * @param a field element.
- * @param x field element.
- * @param y field element.
- */
- Element &axpy (Element &r,
- const Element &a,
- const Element &x,
- const Element &y) const
- {
- r = (a * x + y) % ModularBase<Element>::_modulus;
- if (r < 0) r += ModularBase<Element>::_modulus;
- return r;
- }
-
- //@} Arithmetic Operations
-
- /*- @name Inplace Arithmetic Operations
- * @brief see \ref FieldArchetype for member specs.
- * x <- x op y; x <- op x
- */
- //@{
-
- /*- Inplace Addition.
- * x += y
- * This function assumes both field base elements have already been
- * constructed and initialized.
- * @return reference to x.
- * @param x field base element (reference returned).
- * @param y field base element.
- */
- Element &addin (Element &x, const Element &y) const
- {
- x += y;
- if (x >= ModularBase<Element>::_modulus) x -= ModularBase<Element>::_modulus;
- return x;
- }
-
- /* Inplace Subtraction.
- * x -= y
- * This function assumes both field base elements have already been
- * constructed and initialized.
- * @return reference to x.
- * @param x field base element (reference returned).
- * @param y field base element.
- */
- Element &subin (Element &x, const Element &y) const
- {
- x -= y;
- if (x < 0) x += ModularBase<Element>::_modulus;
- return x;
- }
-
- /* Inplace Multiplication.
- * x *= y
- * This function assumes both field base elements have already been
- * constructed and initialized.
- * @return reference to x.
- * @param x field base element (reference returned).
- * @param y field base element.
- */
- Element &mulin (Element &x, const Element &y) const
- {
- x *= y;
- x %= ModularBase<Element>::_modulus;
- return x;
- }
-
- /* Inplace Division.
- * x /= y
- * This function assumes both field base elements have already been
- * constructed and initialized.
- * @return reference to x.
- * @param x field base element (reference returned).
- * @param y field base element.
- */
- Element &divin (Element &x, const Element &y) const
- {
- Element temp;
- inv (temp, y);
- return mulin (x, temp);
- }
-
- /* Inplace Additive Inverse (Inplace Negation).
- * x = - x
- * This function assumes the field base element has already been
- * constructed and initialized.
- * @return reference to x.
- * @param x field base element (reference returned).
- */
- Element &negin (Element &x) const
- {
- if (x == 0)
- return x;
- else
- return x = ModularBase<Element>::_modulus - x;
- }
-
- /* Inplace Multiplicative Inverse.
- * x = 1 / x
- * This function assumes the field base elementhas already been
- * constructed and initialized.
- * @return reference to x.
- * @param x field base element (reference returned).
- */
- Element &invin (Element &x) const
- {
- return inv (x, x);
- }
-
- /* Inplace AXPY.
- * r += a * x
- * This function assumes all field elements have already been
- * constructed and initialized.
- * Purely virtual
- * @return reference to r.
- * @param r field element (reference returned).
- * @param a field element.
- * @param x field element.
- */
- Element &axpyin (Element &r, const Element &a, const Element &x) const
- {
- r = (r + a * x) % ModularBase<Element>::_modulus;
- if (r < 0) r += ModularBase<Element>::_modulus;
- return r;
- }
-
- //@} Inplace Arithmetic Operations
-
- private:
-
- friend class FieldAXPY<Modular<Element> >;
-
- }; // class Modular
-
-
- /*! Specialization of FieldAXPY for parameterized modular field */
-
- template <class _Element>
- class FieldAXPY<Modular<_Element> > {
- public:
-
- typedef _Element Element;
- typedef Modular<_Element> Field;
-
- FieldAXPY (const Field &F) :
- _field (F)
- { _y = 0; }
- FieldAXPY (const FieldAXPY<Modular<Element> > &faxpy) :
- _field (faxpy._field), _y (faxpy._y)
- {}
-
- FieldAXPY<Modular <Element> > &operator = (const FieldAXPY &faxpy)
- {
- _field = faxpy._field;
- _y = faxpy._y;
- return *this;
- }
-
- inline Element& mulacc (const Element &a, const Element &x)
- {
- return accumulate(a * x);
- }
-
- inline Element& accumulate (const Element &t)
- {
- return _y+=t;
- }
-
- inline Element &get (Element &y) { _y %= _field._modulus; y = _y; return y;
- }
-
- inline FieldAXPY &assign (const Element y)
- {
- _y = y;
- return *this;
- }
-
- inline void reset() {
- _field.init(_y, 0);
- }
-
- private:
-
- Field _field;
- Element _y;
- };
-
-
- template <>
- inline std::ostream& ModularBase<Integer>::write (std::ostream &os) const
- {
- return os << "GMP integers mod " << _modulus;
- }
-
- template <>
- inline integer& Modular<integer>::init (integer& x, const double& y) const
- {
- integer tmp = (integer)y % _modulus;
- if (tmp<0) tmp += _modulus;
- return x = tmp;
- }
-
-
-} // namespace LinBox
-
-#include "linbox/field/Modular/modular-unsigned.h"
-#include "linbox/randiter/modular.h"
-#include "linbox/field/Modular/modular-int32.h"
-#ifdef __LINBOX_HAVE_INT64
-#include "linbox/field/Modular/modular-int64.h"
-#endif
-#include "linbox/field/Modular/modular-short.h"
-#include "linbox/field/Modular/modular-byte.h"
-#include "linbox/field/Modular/modular-double.h"
-#include "linbox/field/Modular/modular-float.h"
-
-#endif // __LINBOX_field_modular_H
-
-
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
-// Local Variables:
-// mode: C++
-// tab-width: 8
-// indent-tabs-mode: nil
-// c-basic-offset: 8
-// End:
-
diff --git a/linbox/field/multimod-field.h b/linbox/field/multimod-field.h
index 7c0ff36..20a2ee7 100644
--- a/linbox/field/multimod-field.h
+++ b/linbox/field/multimod-field.h
@@ -5,20 +5,20 @@
*
* ------------------------------------
*
- *
+ *
* ========LICENCE========
* This file is part of the library LinBox.
- *
+ *
* LinBox is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
- *
+ *
* This library 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
* Lesser General Public License for more details.
- *
+ *
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
@@ -36,7 +36,7 @@
#include "linbox/linbox-config.h"
#include "linbox/util/debug.h"
#include "linbox/integer.h"
-#include "linbox/field/modular.h"
+#include <givaro/modular.h>
#include "linbox/vector/vector-domain.h"
#include "linbox/field/field-interface.h"
@@ -67,7 +67,7 @@ namespace LinBox
protected:
- std::vector<Modular<double> > _fields;
+ std::vector<Givaro::Modular<double> > _fields;
size_t _size;
std::vector<integer> _crt_constant;
std::vector<double > _crt_inverse;
@@ -93,7 +93,7 @@ namespace LinBox
{
_crt_modulo=1;
for (size_t i=0; i<_size; ++i){
- _fields[i] .assign( Modular<double> (primes[i]) );
+ _fields[i] = ( Givaro::Modular<double> (primes[i]) );
_crt_modulo *= primes[i];
}
double tmp;
@@ -112,7 +112,7 @@ namespace LinBox
{
_crt_modulo=1;
for (size_t i=0; i<_size; ++i){
- _fields[i] .assign( Modular<double> (primes[i]) );
+ _fields[i] = ( Givaro::Modular<double> (primes[i]) );
_crt_modulo *= primes[i];
}
double tmp;
@@ -129,7 +129,7 @@ namespace LinBox
_crt_constant(F._crt_constant), _crt_inverse(F._crt_inverse),
_crt_modulo(F._crt_modulo) {}
- const MultiModDouble &operator=(const MultiModDouble &F)
+ MultiModDouble &operator=(const MultiModDouble &F)
{
_fields = F._fields;
_size = F._size;
@@ -143,11 +143,11 @@ namespace LinBox
size_t size() const
{return this->_size;}
- const Modular<double>& getBase(size_t i) const
+ const Givaro::Modular<double>& getBase(size_t i) const
{ return this->_fields[i]; }
- double getModulo(size_t i) const
- { return this->_fields[i].modulus;}
+ Givaro::Modular<double>::Residu_t getModulo(size_t i) const
+ { return this->_fields[i].characteristic();}
const integer& getCRTmodulo() const
@@ -157,7 +157,7 @@ namespace LinBox
{
c=1;
for (size_t i=0; i<_size; ++i){
- c*=_fields[i].modulus;
+ c*=getModulo(i);
}
return c;
}
@@ -192,8 +192,8 @@ namespace LinBox
{
os << "multimod double (";
for (size_t i=0;i<_size-1;++i)
- os<<integer(_fields[i].modulus)<<",";
- os<<integer(_fields[_size-1].modulus)<<")\n";
+ os<<integer(getModulo(i))<<",";
+ os<<integer(getModulo(_size-1))<<")\n";
return os;
}
@@ -201,9 +201,9 @@ namespace LinBox
#if 0
is >> modulus;
if(modulus <= 1)
- throw PreconditionFailed(__func__,__FILE__,__LINE__,"modulus must be > 1");
+ throw PreconditionFailed(LB_FILE_LOC,"modulus must be > 1");
if(modulus > 94906265)
- throw PreconditionFailed(__func__,__FILE__,__LINE__,"modulus is too big");
+ throw PreconditionFailed(LB_FILE_LOC,"modulus is too big");
#endif
return is;
}
@@ -264,6 +264,11 @@ namespace LinBox
return x == std::vector<double>(_size, 1.);
}
+ inline bool isMOne (const Element &x) const
+ {
+ return x == std::vector<double>(_size, -1.); // bug
+ }
+
inline Element &add (Element &x, const Element &y, const Element &z) const
{
for (size_t i=0;i<_size;++i) {
@@ -379,7 +384,7 @@ namespace LinBox
return r;
}
- static inline double getMaxModulus()
+ static inline double maxCardinality()
{ return 94906265.0; } // floor( 2^26.5 )
};// end of class MultiModField
@@ -392,16 +397,21 @@ namespace LinBox
MultiModRandIter(const MultiModDouble &F,
const integer &size=0,
- const integer &seed=0) :
+ const size_t &seed=0) :
_field(F), _size(size), _seed(seed), _randiter(F._size)
{
for (size_t i=0;i< F._size;++i)
- _randiter[i] = new Modular<double>::RandIter(F._fields[i],size,seed) ;
+ _randiter[i] = new Givaro::Modular<double>::RandIter(F._fields[i],seed) ;
}
- ~MultiModRandIter() {for (size_t i=0;i< _randiter.size();++i) delete _randiter[i]; }
+ ~MultiModRandIter()
+ {
+ for (size_t i=0;i< _randiter.size();++i)
+ if (_randiter[i])
+ delete _randiter[i];
+ }
- const MultiModRandIter& operator= (const MultiModRandIter &R)
+ MultiModRandIter& operator= (const MultiModRandIter &R)
{
_seed = R._seed;
_size = R._size;
@@ -420,14 +430,14 @@ namespace LinBox
protected:
MultiModDouble _field;
integer _size;
- integer _seed;
- std::vector<Modular<double>::RandIter*> _randiter;
+ size_t _seed;
+ std::vector<Givaro::Modular<double>::RandIter*> _randiter;
}; // end of class MultiModRandIter
#if 0
template <>
- class DotProductDomain<MultiModDouble > : private virtual VectorDomainBase<MultiModDouble> {
+ class DotProductDomain<MultiModDouble > : private VectorDomainBase<MultiModDouble> {
private:
//std::vector<double> _bound;
std::vector<size_t> _nmax;
@@ -514,11 +524,10 @@ namespace LinBox
#endif // __LINBOX_multimod_field_H
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
// Local Variables:
// mode: C++
// tab-width: 8
// indent-tabs-mode: nil
// c-basic-offset: 8
// End:
-
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/field/ntl.doxy b/linbox/field/ntl.doxy
deleted file mode 100644
index bc64a83..0000000
--- a/linbox/field/ntl.doxy
+++ /dev/null
@@ -1,30 +0,0 @@
-// Copyright (C) 2010 Brice Boyer, part of LinBox, GNU LGPL, see COPYING
-/*
- * ========LICENCE========
- * This file is part of the library LinBox.
- *
- * LinBox is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- * ========LICENCE========
- */
-
-/*! @ingroup field
- at defgroup NTL NTL
-
- at brief NO DOC
-
-*/
-
-
-// vim:syntax=doxygen
diff --git a/linbox/field/ntl.h b/linbox/field/ntl.h
deleted file mode 100644
index 627cc17..0000000
--- a/linbox/field/ntl.h
+++ /dev/null
@@ -1,59 +0,0 @@
-/* linbox/field/ntl.h
- * Copyright (C) 1999-2002 William J Turner,
- * 2001 Bradford Hovinen
- *
- * Written by William J Turner <wjturner at math.ncsu.edu>,
- * Bradford Hovinen <hovinen at cis.udel.edu>
- *
- * ------------------------------------
- * Modified by William J. Turner <wjturner at acm.org>. 4 April 2002.
- *
- * Broke NTL field wrappers into separate files.
- * ------------------------------------
- *
- *
- * ========LICENCE========
- * This file is part of the library LinBox.
- *
- * LinBox is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- * ========LICENCE========
- *.
- */
-
-#ifndef __LINBOX_field_ntl_H
-#define __LINBOX_field_ntl_H
-
-#include "linbox/field/NTL/ntl-RR.h"
-#include "linbox/field/NTL/ntl-ZZ_p.h"
-#include "linbox/field/NTL/ntl-ZZ.h"
-#include "linbox/field/NTL/ntl-ZZ_pX.h"
-#include "linbox/field/NTL/ntl-lzz_p.h"
-#include "linbox/field/NTL/ntl-lzz_pX.h"
-#include "linbox/field/NTL/ntl-ZZ_pE.h"
-#include "linbox/field/NTL/ntl-lzz_pE.h"
-#include "linbox/field/NTL/ntl-GF2E.h"
-
-
-#endif // __LINBOX_field_ntl_H
-
-
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
-// Local Variables:
-// mode: C++
-// tab-width: 8
-// indent-tabs-mode: nil
-// c-basic-offset: 8
-// End:
-
diff --git a/linbox/field/param-fuzzy.h b/linbox/field/param-fuzzy.h
index 52e1c66..6a77dd8 100644
--- a/linbox/field/param-fuzzy.h
+++ b/linbox/field/param-fuzzy.h
@@ -86,7 +86,7 @@ namespace LinBox
* @param F ParamFuzzy object.
*/
ParamFuzzy (const ParamFuzzy &F) :
- _fuzz (F._fuzz)
+ _fuzz (F.fuzz())
,one(F.one),zero(F.zero),mOne(F.mOne)
{}
@@ -95,7 +95,13 @@ namespace LinBox
* @param F constant reference to ParamFuzzy object
*/
ParamFuzzy &operator= (const ParamFuzzy &F)
- { return *this; }
+ {
+ if (&F == this)
+ return *this ;
+ this->_fuzz = F.fuzz() ;
+
+ return *this;
+ }
/** Initialization of field base element from an integer.
* Behaves like C++ allocator construct.
@@ -291,6 +297,13 @@ namespace LinBox
bool isOne (const Element &x) const
{ return ( ( x - 1 <= _fuzz ) && ( 1 - x <= _fuzz ) ); }
+ bool isMOne (const Element& x) const
+ {
+ Element y ; neg(y,x);
+ return isOne(y);
+ }
+
+
/** Inplace Addition.
* x += y
* This function assumes both field base elements have already been
@@ -406,6 +419,10 @@ namespace LinBox
//@}
+ double fuzz() const
+ {
+ return _fuzz ;
+ }
private:
/// Private static double for fuzz value
@@ -424,11 +441,10 @@ namespace LinBox
#endif // __LINBOX_param_fuzzy_H
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
// Local Variables:
// mode: C++
// tab-width: 8
// indent-tabs-mode: nil
// c-basic-offset: 8
// End:
-
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/field/rebind.h b/linbox/field/rebind.h
index 5c3ada5..f4c5318 100644
--- a/linbox/field/rebind.h
+++ b/linbox/field/rebind.h
@@ -30,7 +30,7 @@ namespace LinBox
/** \brief used in support of Hom, MatrixHom
- Helps define rebind for vector types. See blackbox/sparse.h for example of use.
+ Helps define rebind for vector types. See matrix/sparse-matrix.h for example of use.
*/
template<class XXX, class U>
struct Rebind
diff --git a/linbox/field/unparametric.h b/linbox/field/unparametric.h
deleted file mode 100644
index 9aec440..0000000
--- a/linbox/field/unparametric.h
+++ /dev/null
@@ -1,337 +0,0 @@
-
-/* linbox/field/unparametric.h
- * Copyright (C) 1999-2005 William J Turner,
- * 2001 Bradford Hovinen
- * 2005 Clement Pernet
- *
- * Written by W. J. Turner <wjturner at acm.org>,
- * Bradford Hovinen <hovinen at cis.udel.edu>
- *
- * ========LICENCE========
- * This file is part of the library LinBox.
- *
- * LinBox is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- * ========LICENCE========
- */
-
-#ifndef __LINBOX_field_unparametric_H
-#define __LINBOX_field_unparametric_H
-#include <typeinfo>
-
-#include <string>
-#include <algorithm>
-
-
-#include "linbox/linbox-config.h"
-#include "linbox/integer.h"
-#include "linbox/field/field-interface.h"
-#include "linbox/randiter/unparametric.h"
-#include "linbox/field/field-traits.h"
-#include <fflas-ffpack/field/unparametric.h>
-#include "linbox/randiter/nonzero.h"
-//#if __LINBOX_HAVE_NTL
-//#include "linbox/field/ntl-RR.h"
-//#endif // __LINBOX_HAVE_NTL
-
-
-namespace LinBox
-{
-
- using Givaro::Caster;
-
-#if 0
-#if __LINBOX_HAVE_NTL
- typedef NTL::RR Targ;
- template <>
- Targ& Caster<Targ, int> (Targ& t, const int& s)
- {
- return t = s;
- }
-#endif // __LINBOX_HAVE_NTL
-#endif
-
- template <class Ring>
- struct ClassifyRing;
-
- template <class K>
- class UnparametricField;
-
- // using FFPACK::UnparametricField ;
- using FFPACK::UnparametricOperations;
-
- template <class K>
- struct ClassifyRing<UnparametricField<K> > {
- typedef RingCategories::GenericTag categoryTag;
- };
-
- template <>
- struct ClassifyRing<UnparametricField<integer> > {
- typedef RingCategories::IntegerTag categoryTag;
- };
-
-
- /** \brief Unparameterized field adapter.
- * \ingroup field
- * \defgroup UnparametricField UnparametricField
- *
- * A field having an interface similar to that of floats is adapted to
- * LinBox.
- *
- * Used to generate efficient field classes for unparameterized fields
- * (or hidden parameter fields).
- *
- * Some fields are implemented by definition of the C++ arithmetic
- * operators, such as <code>z = x*y</code>, for \c x, \c y, \c z
- * instances of a type \c K. The LinBox field LinBox::Unparametric<K>
- * is the adaptation to LinBox.
- *
- * For a typical unparametric field, some of the methods must be
- * defined in a specialization.
- */
- template <class K>
- class UnparametricField : public FieldInterface,
- public FFPACK::UnparametricField<K> {
- protected:
- integer _p; integer _card;
- public:
- typedef typename FFPACK::UnparametricField<K> Father_t ;
-
- /** @name Common Object Interface for a LinBox Field.
- * These methods and member types are required of all LinBox fields.
- * See \ref FieldArchetype for detailed specifications.
- */
- //@{
-
- /** The field's element type.
- * Type K must provide a default constructor,
- * a copy constructor, a destructor, and an assignment operator.
- */
-
- typedef K Element;
-
- /// Type of random field element generators.
- typedef UnparametricRandIter<K> RandIter;
-
- /** @name Field Object Basics.
- */
- //@{
-
- /** Builds this field to have characteristic q and cardinality q<sup>e</sup>.
- * This constructor must be defined in a specialization.
- */
- UnparametricField(integer q = 0, size_t e = 1) :
- Father_t(q, e),
- //Father_t((unsigned long)q,(unsigned long)e)
- _p(q),
- _card(q == 0 ?
- integer(-1) :
- pow(q, e) )
- {} // assuming q is a prime or zero.
-
- /// construct this field as copy of F.
- UnparametricField (const UnparametricField &F) :
- Father_t(F),_p(F._p), _card(F._card)
- {}
-
-
- // field/ntl-ZZ_p.h me les demande... //
-
- using Father_t::inv ;
- //using Father_t::read ;
- std::istream &read(std::istream & is) { return Father_t::read(is); }
-
- std::istream &read(std::istream & s, Element &a) const
- {
- Integer tmp;
- s >> tmp;
- init(a, tmp);
- return s;
- }
- using Father_t::invin;
- using Father_t::write;
- using Father_t::isZero;
- using Father_t::isOne;
-
- template<typename Src>
- Element&init(Element&x, const Src&s) const
- {
- return Caster (x, s);
- }
- Element&init(Element&x)const
- {
- return Caster (x, 0);
- }
- template<typename T>
- T&convert(T&x, const Element&y) const
- {
- return Caster(x,y);
- }
-
- // fin des trucs zarbs //
-
- /// c := cardinality of this field (-1 if infinite).
- using Father_t::cardinality ;
- integer &cardinality (integer &c) const
- {
- return c = _card;
- }
-
- /// c := characteristic of this field (zero or prime).
- using Father_t::characteristic;
- integer &characteristic (integer &c) const
- {
- return c = _p;
- }
-
- //@} Data Object Management
-
-
-
-
- //@} Common Object Interface
-
- /** @name Implementation-Specific Methods.
- * These methods are not required of all LinBox fields
- * and are included only for the implementation of this field
- * template.
- */
- //@{
-
- //- Default constructor
- //UnparametricField (void) {}
-
- /** Constructor from field object.
- * @param A unparameterized field object
- */
- UnparametricField (const K &A) {}
-
- /** Constant access operator.
- * @return constant reference to field object
- */
- const K &operator () (void) const
- {
- return Element ();
- }
-
- /** Access operator.
- * @return reference to field object
- */
- K &operator () (void)
- {
- return Element ();
- }
-
- //@} Implementation-Specific Methods
-
- }; // template <class K> class UnparametricField
-
- template<class Field>
- class FieldAXPY;
-
- /*! @ingroup integers
- * @brief NO DOc
- */
- template<>
- class FieldAXPY<UnparametricField<integer> > {
- public:
- typedef UnparametricField<integer> Field;
- typedef integer Element;
-
- /** Constructor.
- * A faxpy object if constructed from a Field and a field element.
- * Copies of this objects are stored in the faxpy object.
- * @param F field F in which arithmetic is done
- */
- FieldAXPY (const Field &F) :
- _field (F)
- { _y = 0; }
-
- /** Copy constructor.
- * @param faxpy
- */
- FieldAXPY (const FieldAXPY<Field> &faxpy) :
- _field (faxpy._field), _y (faxpy._y)
- {}
-
- /** Assignment operator
- * @param faxpy
- */
- FieldAXPY<Field> &operator = (const FieldAXPY &faxpy)
- { _y = faxpy._y; return *this; }
-
- /** Add a*x to y
- * y += a*x.
- * @param a constant reference to element a
- * @param x constant reference to element x
- * allow optimal multiplication, such as integer * int
- */
- template<class Element1>
- inline Element& mulacc (const Element &a, const Element1 &x)
- {
- return _y += (a * x);
- }
-
- template<class Element1>
- inline Element& accumulate (const Element1 &t)
- {
- return _y += t;
- }
-
- /** Retrieve y
- *
- * Performs the delayed modding out if necessary
- */
- inline Element &get (Element &y) { y = _y; return y; }
-
- /** Assign method.
- * Stores new field element for arithmetic.
- * @return reference to self
- * @param y constant reference to element a
- */
- inline FieldAXPY &assign (const Element& y)
- {
- _y = y;
- return *this;
- }
-
- inline void reset() {
- _y = 0;
- }
-
- private:
-
- /// Field in which arithmetic is done
- Field _field;
-
- /// Field element for arithmetic
- Element _y;
-
- };
-
-} // namespace LinBox
-
-#include "linbox/randiter/unparametric.h"
-
-#endif // __LINBOX_field_unparametric_H
-
-
-// Local Variables:
-// mode: C++
-// tab-width: 8
-// indent-tabs-mode: nil
-// c-basic-offset: 8
-// End:
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
-
diff --git a/linbox/integer.h b/linbox/integer.h
index f810e82..92bcdd2 100644
--- a/linbox/integer.h
+++ b/linbox/integer.h
@@ -35,34 +35,15 @@
* It is a wrapper of <a href=http://gmplib.org>GMP</a> integers. Arithmetic operations are via
* \c C++ infix operator forms (eg. \c a*b) . It is for ``casual'' uses such as characteristics and
* cardinalities and when initializing field elements. The integers are also represented as a
- * LinBox ring for use in integer matrix computation, see PID-integer.h or see field/ntl-ZZ.h.
+ * ring for use in integer matrix computation, see <givaro/zring.h> or ring/ntl/ntl-zz.h.
*/
#ifndef __LINBOX_integer_H
#define __LINBOX_integer_H
-//#include <cstdint>
+#include <givaro/givconfig.h>
#include "linbox/linbox-config.h"
-#include "givaro/givconfig.h"
-#include "gmp++/gmp++.h"
-#include <cfloat> // BB : needed on some rare platforms...
-
-
-#ifdef __LINBOX_HAVE_STDINT_H
-#ifndef __STDC_LIMIT_MACROS
-#define __STDC_LIMIT_MACROS
-// else ??
-#endif
-#include <stdint.h>
-#ifndef INT32_MAX
-#error "INT32_MAX is not defined. It should at least be defined in Givaro..."
-#endif
-#endif
-
-
-#ifndef FFLAFLAS_VERSION
-#define FFLAFLAS_VERSION __LINBOX_FFLAFFLAS_VERSION
-#endif
+#include <gmp++/gmp++.h>
namespace LinBox
@@ -74,83 +55,35 @@ namespace LinBox
typedef Givaro::Integer integer;
typedef Givaro::Integer Integer;
-#if 0
-// These integer types are defined by Givaro
- /// int8_t.
- typedef signed __LINBOX_INT8 int8_t;
- /// int16_t.
- typedef signed __LINBOX_INT16 int16_t;
-
- /** @brief This is a representation of 32 bit ints, usually equivalent to \c int.
- *
- * The use of \c int32_t ensures you are working with
- * 32 bit signed ints, \f$[-2^{31}\dots2^{31})\f$. Similarly, \ref int8_t, \ref int16_t, and \ref int64_t are defined.
- */
- typedef signed __LINBOX_INT32 int32_t;
-
- /// int64_t.
- typedef signed __LINBOX_INT64 int64_t;
-
- /// unsigned int8_t.
- typedef unsigned __LINBOX_INT8 uint8_t;
- /// unsigned int16_t.
- typedef unsigned __LINBOX_INT16 uint16_t;
-
- /** This is a representation of 32 bit unsigned ints, usually
- * equivalent to `<code>unsigned int</code>'.
- *
- * The use of `uint32_t' ensures you are working with
- * 32 bit unsigned ints, \f$[0\cdots 2^32[\f$. Similarly, uint8_t, uint16_t, and uint64_t are defined.
- */
- typedef unsigned __LINBOX_INT32 uint32_t;
-
- /// unsigned int64_t.
- typedef unsigned __LINBOX_INT64 uint64_t;
-
-#endif
-
// Huh? -bds
template< class T >
T abs( const T& a ) { return( a <= 0 ? a * -1 : a ); }
+} // LinBox namespace
- /*! @internal
+// Dependency to GIVARO >= 3.7.2
+#include <givaro/givspyinteger.h>
+
+namespace LinBox
+{
+
+ /*! @internal
* Spy structure to have access to protected members of Givaro::Integer.
*/
- struct SpyInteger
- {
+ using Givaro::SpyInteger;
- struct InHeritsInteger : public integer {
- protected:
- friend struct SpyInteger;
- };
+} // LinBox namespace
- static const InHeritsInteger::Rep* get_rep(const integer& i) {
- return static_cast<const InHeritsInteger&>(i).get_rep();
- }
- static mpz_ptr get_mpz(integer& i) {
- return static_cast<InHeritsInteger&>(i).get_mpz();
- }
- static mpz_ptr get_mpz(const integer& i) {
- return const_cast<InHeritsInteger&>(static_cast<const InHeritsInteger&>(i)).get_mpz();
- }
- static mpz_srcptr get_mpz_const(const integer& i) {
- return static_cast<const InHeritsInteger&>(i).get_mpz_const();
- }
- };
-}
-
// Dependency to GIVARO >= 3.3.4
/* givaro/givconfig.h so provides the fixed width integer types such as
* int16_t, uint8_t, etc. The typenames int16, uint8, etc are no longer used
* in LinBox or Givaro.
*/
#include <givaro/givconfig.h>
-#include <math.h>
#ifndef GIVARO_VERSION
#error "Givaro didn't tell us about his version !"
@@ -165,19 +98,16 @@ namespace LinBox
* @param a integer.
* @return ln(a).
*/
-#if (GIVARO_VERSION < 30305)
- inline double naturallog(const Givaro::Integer& a) {
- signed long int exp;
- double d = (double)mpz_get_d_2exp( &exp, (mpz_srcptr)(LinBox::SpyInteger::get_rep(a) ) );
- return (double)exp*0.69314718055994531+log(d);
- }
-#else
inline double naturallog(const Givaro::Integer& a) {
return Givaro::naturallog(a);
}
-#endif
}
+
+#include <givaro/givcaster.h>
+
+
+
namespace LinBox { /* signedness of integers */
/*! Positiveness of an integer.
* Essentially usefull in debug mode to avoid compiler warnings
@@ -213,28 +143,99 @@ namespace LinBox { /* signedness of integers */
return true ;
}
//@}
-}
-#if (GIVARO_VERSION < 30601)
-namespace Givaro {
- template <typename Target, typename Source>
- Target& Caster (Target& t, const Source& s) {
- return t = static_cast<Target>(s);
+ template<class U>
+ inline bool IsNegative(const U & p)
+ {
+ return (!isPositive<U>(p));
+ }
+
+ //! @todo or use integer_traits<T>::is_unsigned ??
+ template<>
+ inline bool IsNegative(const uint8_t & p)
+ {
+ return false;
+ }
+
+ template<>
+ inline bool IsNegative(const uint16_t & p)
+ {
+ return false;
+ }
+
+ template<>
+ inline bool IsNegative(const uint32_t & p)
+ {
+ return false;
}
+
+ template<>
+ inline bool IsNegative(const uint64_t & p)
+ {
+ return false;
+ }
+
+ template<class T>
+ bool isOdd ( const T & p)
+ {
+ return Givaro::isOdd(p) ;
+ }
+
+ template<class T>
+ bool isEven ( const T & p)
+ {
+ return ! isOdd(p) ;
+ }
+
+}
+
+namespace LinBox
+{ /* indexDomain : used only once in linbox/algorithms/rational-solver.inl */
+
+
+ /** Class used for permuting indices.
+ * For example, create a vector <code>(0 1 2 ...)</code> over \c
+ * size_t, then apply a permutation to it using a \c BlasMatrixDomain to
+ * get the natural representation of the permutation.
+ * @bug does not belong here
+ */
+ class indexDomain
+ {
+ public:
+ typedef size_t Element;
+ typedef Element* Element_ptr ;
+ typedef const Element* ConstElement_ptr ;
+
+ public:
+ typedef indexDomain Father_t;
+ indexDomain() {};
+
+ size_t init(size_t& dst) const {
+ return dst = static_cast<size_t>(0);
+ }
+
+ template <class ANY>
+ size_t init(size_t& dst, const ANY& src) const {
+ return dst = static_cast<size_t>(src);
+ }
+
+ template <class ANY>
+ size_t assign(ANY& dst, const size_t& src) const {
+ return dst = static_cast<ANY>(src);
+ }
+
+ int characteristic() const { return 0 ; }
+ };
}
-#else
-#include <givaro/givcaster.h>
-#endif
#endif // __LINBOX_integer_H
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
// Local Variables:
// mode: C++
// tab-width: 8
// indent-tabs-mode: nil
// c-basic-offset: 8
// End:
-
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/iterators/Makefile.am b/linbox/iterators/Makefile.am
new file mode 100644
index 0000000..369794b
--- /dev/null
+++ b/linbox/iterators/Makefile.am
@@ -0,0 +1,26 @@
+# Copyright (c) 2010 the LinBox group
+# This file is part of LinBox
+# ========LICENCE========
+# This file is part of the library LinBox.
+#
+# LinBox is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+#
+# This library 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
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+# ========LICENCE========
+#/
+
+pkgincludesubdir=$(pkgincludedir)/iterators
+
+pkgincludesub_HEADERS=\
+ blackbox-symmetrize-iterator.h \
+ blackbox-symmetric-iterator.h
diff --git a/linbox/iterators/blackbox-symmetric-iterator.h b/linbox/iterators/blackbox-symmetric-iterator.h
new file mode 100644
index 0000000..7e8ea5a
--- /dev/null
+++ b/linbox/iterators/blackbox-symmetric-iterator.h
@@ -0,0 +1,91 @@
+/* Copyright (C) 1999 LinBox
+ * Written by <Jean-Guillaume.Dumas at imag.fr>
+ *
+ *
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ * ========LICENCE========
+ */
+
+// ================================================================
+// Black Box iterator and container
+// For symmetric matrix with same left and right vector
+// the sequence is u^t v, u^t A v, ..., u^t A^n v,
+// ================================================================
+
+
+#ifndef __LINBOX_bbcontainer_symmetric_H
+#define __LINBOX_bbcontainer_symmetric_H
+
+#error "this file will never compile !"
+
+#include <LinBox/lin_rand.h>
+#include <LinBox/lin_base_bbit.h>
+
+template<class BlackBoxDomain, class Vecteur = typename BlackBoxDomain::PreferredInMatrix_t, class RandIter = Random>
+class BB_Symmetric_Container : public Base_BB_Container< BlackBoxDomain, Vecteur > {
+public:
+ BB_Symmetric_Container() {}
+
+ BB_Symmetric_Container(BlackBoxDomain_t * D, const Vecteur& u0) :
+ Base_BB_Container< BlackBoxDomain, Vecteur>(D) { init(u0,u0); }
+
+ BB_Symmetric_Container(BlackBoxDomain_t * D, RandIter& g ) :
+ Base_BB_Container< BlackBoxDomain, Vecteur>(D) { init(g); }
+
+protected:
+ void _launch () {
+ if (casenumber > 0) {
+ if (casenumber == 1) {
+ casenumber = 2;
+ _BB_domain->Apply( v, u); // v <- B(B^i u_0) = B^(i+1) u_0
+ DOTPROD(_value,u,v); // t <- u^t v = u_0^t B^(2i+1) u_0
+ }
+ else {
+ casenumber = -1;
+ DOTPROD(_value,v,v); // t <- v^t v = u_0^t B^(2i+2) u_0
+ }
+ }
+ else {
+ if (casenumber == 0) {
+ casenumber = 1;
+ DOTPROD(_value,u,u); // t <- u^t u = u_0^t B^(2i+4) u_0
+ }
+ else {
+ casenumber = 0;
+ _BB_domain->Apply( u, v); // u <- B(B^(i+1) u_0) = B^(i+2) u_0
+ DOTPROD(_value,v,u); // t <- v^t u = u_0^t B^(2i+3) u_0
+ }
+ }
+ }
+
+ void _wait () {}
+};
+
+
+#endif // __LINBOX_bbcontainer_symmetric_H
+
+
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+
diff --git a/linbox/iterators/blackbox-symmetrize-iterator.h b/linbox/iterators/blackbox-symmetrize-iterator.h
new file mode 100644
index 0000000..8cf9527
--- /dev/null
+++ b/linbox/iterators/blackbox-symmetrize-iterator.h
@@ -0,0 +1,84 @@
+/* linbox/algorithms/blackbox-symmetrize-iterator.h
+ * Copyright (C) 1999, 2001, 2003 Jean-Guillaume Dumas
+ *
+ * Written by Jean-Guillaume Dumas <Jean-Guillaume.Dumas at imag.fr>
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ * ========LICENCE========
+ */
+
+#ifndef __LINBOX_bbcontainer_symmetrize_H
+#define __LINBOX_bbcontainer_symmetrize_H
+
+// ================================================================
+// Symmetrizing iterator (for rank computations)
+// Same left and right vector
+// A is supposed to have tranpose-vector product
+// the sequence is u^t u, (A u)^t (A u) = u^t (A^t A) u,
+// (A^t (A u))^t (A^t (A u)) = u^t (A^t A)^2 u , etc.
+// ================================================================
+
+
+#include "linbox/algorithms/blackbox-container-base.h"
+
+namespace LinBox
+{
+
+ template<class Field, class Vector>
+ class BlackboxSymmetrizeIterator : public BlackboxContainerBase< Field, Vector > {
+ public:
+ BlackboxSymmetrizeIterator() {}
+
+ BlackboxSymmetrizeIterator(Blackbox * D, const Field& F, const Vector& u0) :
+ BlackboxContainerBase< Field, Vector >(D, F) { init(u0); }
+
+ BlackboxSymmetrizeIterator(Blackbox * D, const Field& F) :
+ BlackboxContainerBase< Field, Vector >(D, F) { init( Field::RandIter(_field) ); }
+
+ private:
+ void _launch () {
+ if (casenumber) {
+ casenumber = 0;
+ _BB_domain->Apply(v, u);
+ DOTPROD(_value,v,v);
+ }
+ else {
+ casenumber = 1;
+ _BB_domain->ApplyTrans( u, v);
+ DOTPROD(_value,u,u);
+ }
+ }
+
+ void _wait () {}
+
+ };
+
+};
+
+
+#endif // __LINBOX_bbcontainer_symmetrize_H
+
+
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+
diff --git a/linbox/linbox-config.h b/linbox/linbox-config.h
index f516211..2aadc0b 100644
--- a/linbox/linbox-config.h
+++ b/linbox/linbox-config.h
@@ -1,269 +1,99 @@
-#ifndef _LINBOX_LINBOX_CONFIG_H
-#define _LINBOX_LINBOX_CONFIG_H 1
-
-/* linbox/linbox-config.h. Generated automatically at end of configure. */
-/* config.h. Generated from config.h.in by configure. */
-/* config.h.in. Generated from configure.ac by autoheader. */
-
-/* Define if building universal (internal helper macro) */
-/* #undef __LINBOX_AC_APPLE_UNIVERSAL_BUILD */
-
-/* what version of FFLAS-FFPACK is installed */
-#ifndef __LINBOX_FFLAS_FFPACK_VERSION
-#define __LINBOX_FFLAS_FFPACK_VERSION 10600
-#endif
-
-/* Define if GMP is version 3.xxx */
-/* #undef __LINBOX_GMP_VERSION_3 */
-
-/* Define that architecture uses big endian storage */
-/* #undef __LINBOX_HAVE_BIG_ENDIAN */
-
-/* Define to 1 if you have the <dlfcn.h> header file. */
-#ifndef __LINBOX_HAVE_DLFCN_H
-#define __LINBOX_HAVE_DLFCN_H 1
-#endif
-
-/* Define if FFLAS-FFPACK is installed */
-#ifndef __LINBOX_HAVE_FFLAS_FFPACK
-#define __LINBOX_HAVE_FFLAS_FFPACK 1
-#endif
-
-/* Define to 1 if you have the <float.h> header file. */
-#ifndef __LINBOX_HAVE_FLOAT_H
-#define __LINBOX_HAVE_FLOAT_H 1
-#endif
-
-/* Define if FPLLL is installed */
-#ifndef __LINBOX_HAVE_FPLLL
-#define __LINBOX_HAVE_FPLLL 1
-#endif
-
-/* ps2pdf available as external program */
-#ifndef __LINBOX_HAVE_GHOSTSCRIPT
-#define __LINBOX_HAVE_GHOSTSCRIPT 1
-#endif
-
-/* Define if GIVARO is installed */
-#ifndef __LINBOX_HAVE_GIVARO
-#define __LINBOX_HAVE_GIVARO 1
-#endif
-
-/* Define if GMP is installed */
-#ifndef __LINBOX_HAVE_GMP
-#define __LINBOX_HAVE_GMP 1
-#endif
-
-/* gnuplot available as external program */
-#ifndef __LINBOX_HAVE_GNUPLOT
-#define __LINBOX_HAVE_GNUPLOT 1
-#endif
-
-/* Define if IML is installed */
-#ifndef __LINBOX_HAVE_IML
-#define __LINBOX_HAVE_IML 1
-#endif
-
-/* Define to 1 if you have the <inttypes.h> header file. */
-#ifndef __LINBOX_HAVE_INTTYPES_H
-#define __LINBOX_HAVE_INTTYPES_H 1
-#endif
-
-/* Define if LAPACK is available */
-/* #undef __LINBOX_HAVE_LAPACK */
-
-/* Define if LIDIA is installed */
-/* #undef __LINBOX_HAVE_LIDIA */
-
-/* Define to 1 if you have the <limits.h> header file. */
-#ifndef __LINBOX_HAVE_LIMITS_H
-#define __LINBOX_HAVE_LIMITS_H 1
-#endif
-
-/* Define that architecture uses little endian storage */
-#ifndef __LINBOX_HAVE_LITTLE_ENDIAN
-#define __LINBOX_HAVE_LITTLE_ENDIAN 1
-#endif
-
-/* Define if M4RI is installed */
-#ifndef __LINBOX_HAVE_M4RI
-#define __LINBOX_HAVE_M4RI 1
-#endif
-
-/* Define if M4RIE is installed */
-#ifndef __LINBOX_HAVE_M4RIE
-#define __LINBOX_HAVE_M4RIE 1
-#endif
-
-/* Define if MAPLE is installed */
-/* #undef __LINBOX_HAVE_MAPLE */
-
-/* Define to 1 if you have the <memory.h> header file. */
-#ifndef __LINBOX_HAVE_MEMORY_H
-#define __LINBOX_HAVE_MEMORY_H 1
-#endif
-
-/* Define if MPFR is installed */
-#ifndef __LINBOX_HAVE_MPFR
-#define __LINBOX_HAVE_MPFR 1
-#endif
-
-/* Define if NTL is installed */
-#ifndef __LINBOX_HAVE_NTL
-#define __LINBOX_HAVE_NTL 1
-#endif
-
-/* Define if SACLIB is installed */
-/* #undef __LINBOX_HAVE_SACLIB */
-
-/* Define to 1 if you have the <stddef.h> header file. */
-#ifndef __LINBOX_HAVE_STDDEF_H
-#define __LINBOX_HAVE_STDDEF_H 1
-#endif
-
-/* Define to 1 if you have the <stdint.h> header file. */
-#ifndef __LINBOX_HAVE_STDINT_H
-#define __LINBOX_HAVE_STDINT_H 1
-#endif
-
-/* Define to 1 if you have the <stdlib.h> header file. */
-#ifndef __LINBOX_HAVE_STDLIB_H
-#define __LINBOX_HAVE_STDLIB_H 1
-#endif
-
-/* Define to 1 if you have the <strings.h> header file. */
-#ifndef __LINBOX_HAVE_STRINGS_H
-#define __LINBOX_HAVE_STRINGS_H 1
-#endif
-
-/* Define to 1 if you have the <string.h> header file. */
-#ifndef __LINBOX_HAVE_STRING_H
-#define __LINBOX_HAVE_STRING_H 1
-#endif
-
-/* Define to 1 if you have the <sys/stat.h> header file. */
-#ifndef __LINBOX_HAVE_SYS_STAT_H
-#define __LINBOX_HAVE_SYS_STAT_H 1
-#endif
-
-/* Define to 1 if you have the <sys/time.h> header file. */
-#ifndef __LINBOX_HAVE_SYS_TIME_H
-#define __LINBOX_HAVE_SYS_TIME_H 1
-#endif
-
-/* Define to 1 if you have the <sys/types.h> header file. */
-#ifndef __LINBOX_HAVE_SYS_TYPES_H
-#define __LINBOX_HAVE_SYS_TYPES_H 1
-#endif
-
-/* Define to 1 if you have the <unistd.h> header file. */
-#ifndef __LINBOX_HAVE_UNISTD_H
-#define __LINBOX_HAVE_UNISTD_H 1
-#endif
-
-/* Define to the sub-directory in which libtool stores uninstalled libraries.
- */
-#ifndef __LINBOX_LT_OBJDIR
-#define __LINBOX_LT_OBJDIR ".libs/"
-#endif
-
-/* define is the version of Maple have access function to gmp data */
-/* #undef __LINBOX_MAPLE_GMP_ACCESS */
-
-/* Name of package */
-#ifndef __LINBOX_PACKAGE
-#define __LINBOX_PACKAGE "linbox"
-#endif
-
-/* Define to the address where bug reports for this package should be sent. */
-#ifndef __LINBOX_PACKAGE_BUGREPORT
-#define __LINBOX_PACKAGE_BUGREPORT "linbox-use at googlegroups.com"
-#endif
-
-/* Define to the full name of this package. */
-#ifndef __LINBOX_PACKAGE_NAME
-#define __LINBOX_PACKAGE_NAME "LinBox"
-#endif
-
-/* Define to the full name and version of this package. */
-#ifndef __LINBOX_PACKAGE_STRING
-#define __LINBOX_PACKAGE_STRING "LinBox 1.3.2"
-#endif
-
-/* Define to the one symbol short name of this package. */
-#ifndef __LINBOX_PACKAGE_TARNAME
-#define __LINBOX_PACKAGE_TARNAME "linbox"
-#endif
-
-/* Define to the home page for this package. */
-#ifndef __LINBOX_PACKAGE_URL
-#define __LINBOX_PACKAGE_URL "http://www.linalg.org/"
-#endif
-
-/* Define to the version of this package. */
-#ifndef __LINBOX_PACKAGE_VERSION
-#define __LINBOX_PACKAGE_VERSION "1.3.2"
-#endif
-
-/* The size of `char', as computed by sizeof. */
-#ifndef __LINBOX_SIZEOF_CHAR
-#define __LINBOX_SIZEOF_CHAR 1
+/* Copyright (C) 2013 the members of the LinBox group
+ * Written by Brice Boyer (briceboyer) <boyer.brice at gmail.com>
+ *
+ * This file is part of the LinBox library.
+ *
+ * ========LICENCE========
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * LinBox 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ * ========LICENCE========
+ *
+ */
+
+#ifndef __LINBOX_linbox_config_H
+#define __LINBOX_linbox_config_H
+
+/** @file linbox-config.h
+ * @brief linbox base configuration file
+ */
+#include <fflas-ffpack/fflas-ffpack-config.h>
+#include "config.h"
+// #include "linbox-configuration.h"
+
+#ifndef INT32_MAX
+#define INT32_MAX (2147483647L)
+#endif
+
+//#include <cstdint>
+// #include <givaro/givconfig.h>
+// #include <gmp++/gmp++.h>
+#include <cfloat> // BB : needed on some rare platforms...
+#include <cmath>
+
+#include <cctype>
+#include <iostream>
+
+using std::ptrdiff_t;
+
+
+#ifdef __LINBOX_HAVE_STDINT_H
+#ifndef __STDC_LIMIT_MACROS
+#define __STDC_LIMIT_MACROS
+// else ??
+#endif
+#include <stdint.h>
+#ifndef INT32_MAX
+#error "INT32_MAX is not defined. It should at least be defined in Givaro..."
+#endif
+#endif
+
+#ifdef __FFLASFFPACK_USE_SIMD
+#define __LINBOX_USE_SIMD
+#else
+#define __LINBOX_NO_SIMD
#endif
-/* The size of `int', as computed by sizeof. */
-#ifndef __LINBOX_SIZEOF_INT
-#define __LINBOX_SIZEOF_INT 4
-#endif
-/* The size of `long', as computed by sizeof. */
-#ifndef __LINBOX_SIZEOF_LONG
-#define __LINBOX_SIZEOF_LONG 8
-#endif
+namespace LinBox {
-/* The size of `long long', as computed by sizeof. */
-#ifndef __LINBOX_SIZEOF_LONG_LONG
-#define __LINBOX_SIZEOF_LONG_LONG 8
-#endif
+ typedef ptrdiff_t index_t;
-/* The size of `short', as computed by sizeof. */
-#ifndef __LINBOX_SIZEOF_SHORT
-#define __LINBOX_SIZEOF_SHORT 2
-#endif
+ const int BlasBound = 1 << 26;
-/* The size of `__int64', as computed by sizeof. */
-#ifndef __LINBOX_SIZEOF___INT64
-#define __LINBOX_SIZEOF___INT64 0
-#endif
+ //! used to separate BLAS2 and BLAS3 operations
+ struct ContainerCategories {
+ struct Any {} ;
+ struct Vector : public Any {};
+ struct Matrix : public Any {};
+ struct Other : public Any {};
+ } ;
-/* Define to 1 if you have the ANSI C header files. */
-#ifndef __LINBOX_STDC_HEADERS
-#define __LINBOX_STDC_HEADERS 1
-#endif
+ //! Trait for the Category
+ template<class Container>
+ struct ContainerTraits {
+ typedef ContainerCategories::Any ContainerCategory ;
+ } ;
+}
-/* Version number of package */
-#ifndef __LINBOX_VERSION
-#define __LINBOX_VERSION "1.3.2"
-#endif
-/* optimized threshold for switching to strassen matrix multiplication */
-#ifndef __LINBOX_WINOTHRESHOLD
-#define __LINBOX_WINOTHRESHOLD 1896
-#endif
+#endif // __LINBOX_linbox_config_H
-/* Define WORDS_BIGENDIAN to 1 if your processor stores words with the most
- significant byte first (like Motorola and SPARC, unlike Intel). */
-#if defined AC_APPLE_UNIVERSAL_BUILD
-# if defined __BIG_ENDIAN__
-# define WORDS_BIGENDIAN 1
-# endif
-#else
-# ifndef WORDS_BIGENDIAN
-/* # undef WORDS_BIGENDIAN */
-# endif
-#endif
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
-/* Define if Expat is installed */
-/* #undef __LINBOX_XMLENABLED */
-
-/* once: _LINBOX_LINBOX_CONFIG_H */
-#endif
diff --git a/linbox/linbox-tags.h b/linbox/linbox-tags.h
new file mode 100644
index 0000000..a307ccc
--- /dev/null
+++ b/linbox/linbox-tags.h
@@ -0,0 +1,139 @@
+/* Copyright (C) 2010,2011,2012 LinBox
+ * Written by Brice Boyer (briceboyer) <boyer.brice at gmail.com>
+ *
+ *
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ * ========LICENCE========
+ */
+
+/*! @file linbox-tags.h
+ * @ingroup algorithms
+ * @brief Provides tags for various algorithms/solutions, à la \c FFLAS.
+ * This is a subset of Fflas* enums.
+ */
+
+#ifndef __LINBOX_linbox_tags_H
+#define __LINBOX_linbox_tags_H
+
+#include <fflas-ffpack/fflas/fflas_enum.h>
+#include "linbox/linbox-config.h"
+
+#define LINBOX_enum(name) name
+
+#if HAVE_CXX11
+#define SCOPED(name) struct name : int32_t
+#else
+#define SCOPED(name) name
+#endif
+
+namespace LinBox
+{
+
+ /*! Structure for tags.
+ * Tags are simple enums that set a choice in a routine.
+ * For instance, if the user wants a <i>right</i> nullspace,
+ * she will use a \c Tag::Right parameter.
+ *
+ * There it total compatiblity with \c FFLAS tags (cross link)
+ * For instance, in LinBox, it is similar to use \c Tag::Upper and
+ * <code>(Tag::Shape) FFLAS::FflasUpper</code>.
+ *
+ * @note Tags are not Methods.
+ */
+ namespace Tag {
+ //! Left/Right Tag
+ enum SCOPED(Side)
+ {
+ Left = FFLAS::FflasLeft, //!< Left
+ Right = FFLAS::FflasRight //!< Right
+ };
+
+ //! (No)Transpose Tag
+ enum SCOPED(Transpose)
+ {
+
+ NoTrans = FFLAS::FflasNoTrans,
+ Trans = FFLAS::FflasTrans
+ };
+
+ //! (Upp/Low)er Tag
+ enum SCOPED(UpLo)
+ {
+ Upper = FFLAS::FflasUpper,
+ Lower = FFLAS::FflasLower
+ } ;
+
+ using Shape = UpLo;
+
+ //! (Non)Unit Diagonal Tag
+ enum SCOPED(Diag)
+ {
+ NonUnit = FFLAS::FflasNonUnit,
+ Unit = FFLAS::FflasUnit
+ } ;
+
+ //! Dense format (table) output Tag
+ enum SCOPED(FileFormat)
+ {
+ Plain = 0,
+ Maple = 1,
+ HTML = 2,
+ LaTeX = 3,
+ Detect,
+ Guillaume,
+ Turner,
+ Matlab,
+ Pretty,
+ MagmaCpt,
+ OneBased,
+ MatrixMarket
+
+ } ;
+
+
+
+ enum SCOPED(Direction)
+ {
+ Row = 10 ,
+ Col = 11
+ } ;
+
+ enum SCOPED(Sign)
+ {
+ Positive = 500 , //! is >0 (strictement positif)
+ Negative = 501 , //! is <0 (strictement négatif)
+ NonNegative = 502 , //! is >=0 (positif)
+ NonPositive = 503 , //! is <=0 (négatif)
+ NonZero = 504 , //! is !=0 (non nul)
+ Zero = 505 //! is ==0 (nul)
+
+ };
+
+ } // namespace Tag
+
+} // namespace LinBox
+#undef SCOPE
+#endif // __LINBOX_linbox_tags_H
+
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/matrix/Makefile.am b/linbox/matrix/Makefile.am
index 7cd215d..6cfe185 100644
--- a/linbox/matrix/Makefile.am
+++ b/linbox/matrix/Makefile.am
@@ -18,50 +18,48 @@
# ========LICENCE========
-
pkgincludesubdir=$(pkgincludedir)/matrix
-BASIC_HDRS = \
- archetype.h \
- matrix-category.h \
- sparse.h sparse.inl \
- transpose-matrix.h \
- dense-rows-matrix.h \
- matrix-domain.h matrix-domain.inl \
- matrix-domain-gf2.h \
- blas-matrix.h \
- blas-matrix.inl blas-submatrix.inl \
- blas-matrix-multimod.h \
- factorized-matrix.h factorized-matrix.inl \
- blas-triangularmatrix.inl \
- permutation-matrix.h permutation-matrix.inl \
- random-matrix.h random-matrix.inl
+SUBDIRS= sparsematrix densematrix matrixdomain sliced3
+
+BASIC_HDRS = \
+ archetype.h \
+ matrix-category.h \
+ matrix-traits.h \
+ transpose-matrix.h \
+ plain-matrix.h \
+ dense-matrix.h \
+ matrix-domain.h \
+ sparse-matrix.h \
+ sparse-formats.h \
+ factorized-matrix.h \
+ factorized-matrix.inl \
+ permutation-matrix.h \
+ permutation-matrix.inl \
+ abnormal-matrix.h \
+ abnormal-helpers.h \
+ random-matrix.h \
+ random-matrix.inl \
+ sliced3.h \
+ polynomial-matrix.h
NTL_HDRS =
-GIVARO_HDRS =
-LIDIA_HDRS =
if LINBOX_HAVE_NTL
USE_NTL_HDRS = $(NTL_HDRS)
endif
-if LINBOX_HAVE_GIVARO
-USE_GIVARO_HDRS = $(GIVARO_HDRS)
-endif
-
-if LINBOX_HAVE_LIDIA
-USE_LIDIA_HDRS = $(LIDIA_HDRS)
-endif
-
pkgincludesub_HEADERS = \
$(BASIC_HDRS) \
- $(USE_NTL_HDRS) \
- $(USE_GIVARO_HDRS) \
- $(USE_LIDIA_HDRS)
+ $(USE_NTL_HDRS)
EXTRA_DIST = \
$(NTL_HDRS) \
- $(GIVARO_HDRS) \
- $(LIDIA_HDRS) \
- matrix.doxy
+ matrix.doxy \
+ sparse-matrix.doxy \
+ dense-matrix.doxy \
+ sliced3.doxy \
+ permutation-matrix.doxy \
+ matrix-domain.doxy \
+ matrix-iterators.doxy
diff --git a/linbox/matrix/Makefile.in b/linbox/matrix/Makefile.in
deleted file mode 100644
index 7c54307..0000000
--- a/linbox/matrix/Makefile.in
+++ /dev/null
@@ -1,605 +0,0 @@
-# Makefile.in generated by automake 1.11.5 from Makefile.am.
-# @configure_input@
-
-# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software
-# Foundation, Inc.
-# This Makefile.in is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
-# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
-# PARTICULAR PURPOSE.
-
- at SET_MAKE@
-
-# Copyright (c) 2010 the LinBox group
-# ========LICENCE========
-# This file is part of the library LinBox.
-#
-# LinBox is free software: you can redistribute it and/or modify
-# it under the terms of the GNU Lesser General Public
-# License as published by the Free Software Foundation; either
-# version 2.1 of the License, or (at your option) any later version.
-#
-# This library 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
-# Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public
-# License along with this library; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
-# ========LICENCE========
-
-VPATH = @srcdir@
-am__make_dryrun = \
- { \
- am__dry=no; \
- case $$MAKEFLAGS in \
- *\\[\ \ ]*) \
- echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \
- | grep '^AM OK$$' >/dev/null || am__dry=yes;; \
- *) \
- for am__flg in $$MAKEFLAGS; do \
- case $$am__flg in \
- *=*|--*) ;; \
- *n*) am__dry=yes; break;; \
- esac; \
- done;; \
- esac; \
- test $$am__dry = yes; \
- }
-pkgdatadir = $(datadir)/@PACKAGE@
-pkgincludedir = $(includedir)/@PACKAGE@
-pkglibdir = $(libdir)/@PACKAGE@
-pkglibexecdir = $(libexecdir)/@PACKAGE@
-am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
-install_sh_DATA = $(install_sh) -c -m 644
-install_sh_PROGRAM = $(install_sh) -c
-install_sh_SCRIPT = $(install_sh) -c
-INSTALL_HEADER = $(INSTALL_DATA)
-transform = $(program_transform_name)
-NORMAL_INSTALL = :
-PRE_INSTALL = :
-POST_INSTALL = :
-NORMAL_UNINSTALL = :
-PRE_UNINSTALL = :
-POST_UNINSTALL = :
-build_triplet = @build@
-host_triplet = @host@
-subdir = linbox/matrix
-DIST_COMMON = $(pkgincludesub_HEADERS) $(srcdir)/Makefile.am \
- $(srcdir)/Makefile.in
-ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-am__aclocal_m4_deps = $(top_srcdir)/macros/aclocal-include.m4 \
- $(top_srcdir)/macros/config-header.m4 \
- $(top_srcdir)/macros/debug.m4 \
- $(top_srcdir)/macros/expat-check.m4 \
- $(top_srcdir)/macros/fflas-ffpack-check.m4 \
- $(top_srcdir)/macros/fplll-check.m4 \
- $(top_srcdir)/macros/givaro-check.m4 \
- $(top_srcdir)/macros/gmp-check.m4 \
- $(top_srcdir)/macros/iml-check.m4 \
- $(top_srcdir)/macros/lapack-check.m4 \
- $(top_srcdir)/macros/libtool.m4 \
- $(top_srcdir)/macros/lidia-check.m4 \
- $(top_srcdir)/macros/linbox-benchmark.m4 \
- $(top_srcdir)/macros/linbox-doc.m4 \
- $(top_srcdir)/macros/linbox-misc.m4 \
- $(top_srcdir)/macros/linbox-opt.m4 \
- $(top_srcdir)/macros/ltoptions.m4 \
- $(top_srcdir)/macros/ltsugar.m4 \
- $(top_srcdir)/macros/ltversion.m4 \
- $(top_srcdir)/macros/lt~obsolete.m4 \
- $(top_srcdir)/macros/m4ri-check.m4 \
- $(top_srcdir)/macros/m4rie-check.m4 \
- $(top_srcdir)/macros/maple-check.m4 \
- $(top_srcdir)/macros/mpfr-check.m4 \
- $(top_srcdir)/macros/ntl-check.m4 \
- $(top_srcdir)/macros/saclib-check.m4 \
- $(top_srcdir)/macros/sage-check.m4 $(top_srcdir)/configure.ac
-am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
- $(ACLOCAL_M4)
-mkinstalldirs = $(install_sh) -d
-CONFIG_HEADER = $(top_builddir)/config.h
-CONFIG_CLEAN_FILES =
-CONFIG_CLEAN_VPATH_FILES =
-depcomp =
-am__depfiles_maybe =
-SOURCES =
-DIST_SOURCES =
-am__can_run_installinfo = \
- case $$AM_UPDATE_INFO_DIR in \
- n|no|NO) false;; \
- *) (install-info --version) >/dev/null 2>&1;; \
- esac
-am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
-am__vpath_adj = case $$p in \
- $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
- *) f=$$p;; \
- esac;
-am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
-am__install_max = 40
-am__nobase_strip_setup = \
- srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
-am__nobase_strip = \
- for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
-am__nobase_list = $(am__nobase_strip_setup); \
- for p in $$list; do echo "$$p $$p"; done | \
- sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
- $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
- if (++n[$$2] == $(am__install_max)) \
- { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
- END { for (dir in files) print dir, files[dir] }'
-am__base_list = \
- sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
- sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
-am__uninstall_files_from_dir = { \
- test -z "$$files" \
- || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \
- || { echo " ( cd '$$dir' && rm -f" $$files ")"; \
- $(am__cd) "$$dir" && rm -f $$files; }; \
- }
-am__installdirs = "$(DESTDIR)$(pkgincludesubdir)"
-HEADERS = $(pkgincludesub_HEADERS)
-ETAGS = etags
-CTAGS = ctags
-DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
-ACLOCAL = @ACLOCAL@
-AMTAR = @AMTAR@
-AR = @AR@
-AUTOCONF = @AUTOCONF@
-AUTOHEADER = @AUTOHEADER@
-AUTOMAKE = @AUTOMAKE@
-AWK = @AWK@
-BLAS_CFLAGS = @BLAS_CFLAGS@
-BLAS_LIBS = @BLAS_LIBS@
-CC = @CC@
-CCNAM = @CCNAM@
-CFLAGS = @CFLAGS@
-CPPFLAGS = @CPPFLAGS@
-CXX = @CXX@
-CXXCPP = @CXXCPP@
-CXXFLAGS = @CXXFLAGS@
-CYGPATH_W = @CYGPATH_W@
-DBG = @DBG@
-DEBUG_CFLAGS = @DEBUG_CFLAGS@
-DEFAULT_CFLAGS = @DEFAULT_CFLAGS@
-DEFS = @DEFS@
-DLLTOOL = @DLLTOOL@
-DSYMUTIL = @DSYMUTIL@
-DUMPBIN = @DUMPBIN@
-ECHO_C = @ECHO_C@
-ECHO_N = @ECHO_N@
-ECHO_T = @ECHO_T@
-EGREP = @EGREP@
-EXEEXT = @EXEEXT@
-EXPAT_CFLAGS = @EXPAT_CFLAGS@
-EXPAT_LIBS = @EXPAT_LIBS@
-FFLAS_FFPACK_CFLAGS = @FFLAS_FFPACK_CFLAGS@
-FFLAS_FFPACK_LIBS = @FFLAS_FFPACK_LIBS@
-FFLAS_FFPACK_LOC = @FFLAS_FFPACK_LOC@
-FGREP = @FGREP@
-FPLLL_CFLAGS = @FPLLL_CFLAGS@
-FPLLL_LIBS = @FPLLL_LIBS@
-GIVARO_CFLAGS = @GIVARO_CFLAGS@
-GIVARO_LIBS = @GIVARO_LIBS@
-GMP_CFLAGS = @GMP_CFLAGS@
-GMP_LIBS = @GMP_LIBS@
-GMP_VERSION = @GMP_VERSION@
-GREP = @GREP@
-IML_CFLAGS = @IML_CFLAGS@
-IML_LIBS = @IML_LIBS@
-INSTALL = @INSTALL@
-INSTALL_DATA = @INSTALL_DATA@
-INSTALL_PROGRAM = @INSTALL_PROGRAM@
-INSTALL_SCRIPT = @INSTALL_SCRIPT@
-INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
-LD = @LD@
-LDFLAGS = @LDFLAGS@
-LIBOBJS = @LIBOBJS@
-LIBS = @LIBS@
-LIBTOOL = @LIBTOOL@
-LIDIA_CFLAGS = @LIDIA_CFLAGS@
-LIDIA_LIBS = @LIDIA_LIBS@
-LINBOX_BENCH_PATH = @LINBOX_BENCH_PATH@
-LINBOX_DOC_PATH = @LINBOX_DOC_PATH@
-LIPO = @LIPO@
-LN_S = @LN_S@
-LTLIBOBJS = @LTLIBOBJS@
-M4RIE_CFLAGS = @M4RIE_CFLAGS@
-M4RIE_LIBS = @M4RIE_LIBS@
-M4RI_CFLAGS = @M4RI_CFLAGS@
-M4RI_LIBS = @M4RI_LIBS@
-MAINT = @MAINT@
-MAKEINFO = @MAKEINFO@
-MANIFEST_TOOL = @MANIFEST_TOOL@
-MAPLE_CFLAGS = @MAPLE_CFLAGS@
-MAPLE_HOME = @MAPLE_HOME@
-MAPLE_LIBS = @MAPLE_LIBS@
-MAPLE_VERSION = @MAPLE_VERSION@
-MKDIR_P = @MKDIR_P@
-MPFR_CFLAGS = @MPFR_CFLAGS@
-MPFR_LIBS = @MPFR_LIBS@
-NM = @NM@
-NMEDIT = @NMEDIT@
-NTL_CFLAGS = @NTL_CFLAGS@
-NTL_LIBS = @NTL_LIBS@
-OBJDUMP = @OBJDUMP@
-OBJEXT = @OBJEXT@
-OTOOL = @OTOOL@
-OTOOL64 = @OTOOL64@
-PACKAGE = @PACKAGE@
-PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
-PACKAGE_NAME = @PACKAGE_NAME@
-PACKAGE_STRING = @PACKAGE_STRING@
-PACKAGE_TARNAME = @PACKAGE_TARNAME@
-PACKAGE_URL = @PACKAGE_URL@
-PACKAGE_VERSION = @PACKAGE_VERSION@
-PATH_SEPARATOR = @PATH_SEPARATOR@
-PROF = @PROF@
-RANLIB = @RANLIB@
-RM = @RM@
-SACLIB_CFLAGS = @SACLIB_CFLAGS@
-SACLIB_LIBS = @SACLIB_LIBS@
-SED = @SED@
-SET_MAKE = @SET_MAKE@
-SHELL = @SHELL@
-STRIP = @STRIP@
-TESTS_CFLAGS = @TESTS_CFLAGS@
-VERSION = @VERSION@
-WARN = @WARN@
-abs_builddir = @abs_builddir@
-abs_srcdir = @abs_srcdir@
-abs_top_builddir = @abs_top_builddir@
-abs_top_srcdir = @abs_top_srcdir@
-ac_ct_AR = @ac_ct_AR@
-ac_ct_CC = @ac_ct_CC@
-ac_ct_CXX = @ac_ct_CXX@
-ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
-am__leading_dot = @am__leading_dot@
-am__tar = @am__tar@
-am__untar = @am__untar@
-bindir = @bindir@
-build = @build@
-build_alias = @build_alias@
-build_cpu = @build_cpu@
-build_os = @build_os@
-build_vendor = @build_vendor@
-builddir = @builddir@
-datadir = @datadir@
-datarootdir = @datarootdir@
-docdir = @docdir@
-dvidir = @dvidir@
-exec_prefix = @exec_prefix@
-host = @host@
-host_alias = @host_alias@
-host_cpu = @host_cpu@
-host_os = @host_os@
-host_vendor = @host_vendor@
-htmldir = @htmldir@
-includedir = @includedir@
-infodir = @infodir@
-install_sh = @install_sh@
-libdir = @libdir@
-libexecdir = @libexecdir@
-localedir = @localedir@
-localstatedir = @localstatedir@
-mandir = @mandir@
-mkdir_p = @mkdir_p@
-oldincludedir = @oldincludedir@
-pdfdir = @pdfdir@
-prefix = @prefix@
-program_transform_name = @program_transform_name@
-psdir = @psdir@
-sbindir = @sbindir@
-sharedstatedir = @sharedstatedir@
-srcdir = @srcdir@
-sysconfdir = @sysconfdir@
-target_alias = @target_alias@
-top_build_prefix = @top_build_prefix@
-top_builddir = @top_builddir@
-top_srcdir = @top_srcdir@
-pkgincludesubdir = $(pkgincludedir)/matrix
-BASIC_HDRS = \
- archetype.h \
- matrix-category.h \
- sparse.h sparse.inl \
- transpose-matrix.h \
- dense-rows-matrix.h \
- matrix-domain.h matrix-domain.inl \
- matrix-domain-gf2.h \
- blas-matrix.h \
- blas-matrix.inl blas-submatrix.inl \
- blas-matrix-multimod.h \
- factorized-matrix.h factorized-matrix.inl \
- blas-triangularmatrix.inl \
- permutation-matrix.h permutation-matrix.inl \
- random-matrix.h random-matrix.inl
-
-NTL_HDRS =
-GIVARO_HDRS =
-LIDIA_HDRS =
- at LINBOX_HAVE_NTL_TRUE@USE_NTL_HDRS = $(NTL_HDRS)
- at LINBOX_HAVE_GIVARO_TRUE@USE_GIVARO_HDRS = $(GIVARO_HDRS)
- at LINBOX_HAVE_LIDIA_TRUE@USE_LIDIA_HDRS = $(LIDIA_HDRS)
-pkgincludesub_HEADERS = \
- $(BASIC_HDRS) \
- $(USE_NTL_HDRS) \
- $(USE_GIVARO_HDRS) \
- $(USE_LIDIA_HDRS)
-
-EXTRA_DIST = \
- $(NTL_HDRS) \
- $(GIVARO_HDRS) \
- $(LIDIA_HDRS) \
- matrix.doxy
-
-all: all-am
-
-.SUFFIXES:
-$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps)
- @for dep in $?; do \
- case '$(am__configure_deps)' in \
- *$$dep*) \
- ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
- && { if test -f $@; then exit 0; else break; fi; }; \
- exit 1;; \
- esac; \
- done; \
- echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu --ignore-deps linbox/matrix/Makefile'; \
- $(am__cd) $(top_srcdir) && \
- $(AUTOMAKE) --gnu --ignore-deps linbox/matrix/Makefile
-.PRECIOUS: Makefile
-Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
- @case '$?' in \
- *config.status*) \
- cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
- *) \
- echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
- cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
- esac;
-
-$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
- cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-
-$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
- cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
- cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-$(am__aclocal_m4_deps):
-
-mostlyclean-libtool:
- -rm -f *.lo
-
-clean-libtool:
- -rm -rf .libs _libs
-install-pkgincludesubHEADERS: $(pkgincludesub_HEADERS)
- @$(NORMAL_INSTALL)
- @list='$(pkgincludesub_HEADERS)'; test -n "$(pkgincludesubdir)" || list=; \
- if test -n "$$list"; then \
- echo " $(MKDIR_P) '$(DESTDIR)$(pkgincludesubdir)'"; \
- $(MKDIR_P) "$(DESTDIR)$(pkgincludesubdir)" || exit 1; \
- fi; \
- for p in $$list; do \
- if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
- echo "$$d$$p"; \
- done | $(am__base_list) | \
- while read files; do \
- echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(pkgincludesubdir)'"; \
- $(INSTALL_HEADER) $$files "$(DESTDIR)$(pkgincludesubdir)" || exit $$?; \
- done
-
-uninstall-pkgincludesubHEADERS:
- @$(NORMAL_UNINSTALL)
- @list='$(pkgincludesub_HEADERS)'; test -n "$(pkgincludesubdir)" || list=; \
- files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
- dir='$(DESTDIR)$(pkgincludesubdir)'; $(am__uninstall_files_from_dir)
-
-ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
- list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
- unique=`for i in $$list; do \
- if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
- done | \
- $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
- END { if (nonempty) { for (i in files) print i; }; }'`; \
- mkid -fID $$unique
-tags: TAGS
-
-TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
- $(TAGS_FILES) $(LISP)
- set x; \
- here=`pwd`; \
- list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
- unique=`for i in $$list; do \
- if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
- done | \
- $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
- END { if (nonempty) { for (i in files) print i; }; }'`; \
- shift; \
- if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
- test -n "$$unique" || unique=$$empty_fix; \
- if test $$# -gt 0; then \
- $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
- "$$@" $$unique; \
- else \
- $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
- $$unique; \
- fi; \
- fi
-ctags: CTAGS
-CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
- $(TAGS_FILES) $(LISP)
- list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
- unique=`for i in $$list; do \
- if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
- done | \
- $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
- END { if (nonempty) { for (i in files) print i; }; }'`; \
- test -z "$(CTAGS_ARGS)$$unique" \
- || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
- $$unique
-
-GTAGS:
- here=`$(am__cd) $(top_builddir) && pwd` \
- && $(am__cd) $(top_srcdir) \
- && gtags -i $(GTAGS_ARGS) "$$here"
-
-distclean-tags:
- -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
-
-distdir: $(DISTFILES)
- @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
- topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
- list='$(DISTFILES)'; \
- dist_files=`for file in $$list; do echo $$file; done | \
- sed -e "s|^$$srcdirstrip/||;t" \
- -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
- case $$dist_files in \
- */*) $(MKDIR_P) `echo "$$dist_files" | \
- sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
- sort -u` ;; \
- esac; \
- for file in $$dist_files; do \
- if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
- if test -d $$d/$$file; then \
- dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
- if test -d "$(distdir)/$$file"; then \
- find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
- fi; \
- if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
- cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
- find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
- fi; \
- cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
- else \
- test -f "$(distdir)/$$file" \
- || cp -p $$d/$$file "$(distdir)/$$file" \
- || exit 1; \
- fi; \
- done
-check-am: all-am
-check: check-am
-all-am: Makefile $(HEADERS)
-installdirs:
- for dir in "$(DESTDIR)$(pkgincludesubdir)"; do \
- test -z "$$dir" || $(MKDIR_P) "$$dir"; \
- done
-install: install-am
-install-exec: install-exec-am
-install-data: install-data-am
-uninstall: uninstall-am
-
-install-am: all-am
- @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
-
-installcheck: installcheck-am
-install-strip:
- if test -z '$(STRIP)'; then \
- $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
- install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
- install; \
- else \
- $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
- install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
- "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
- fi
-mostlyclean-generic:
-
-clean-generic:
-
-distclean-generic:
- -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
- -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
-
-maintainer-clean-generic:
- @echo "This command is intended for maintainers to use"
- @echo "it deletes files that may require special tools to rebuild."
-clean: clean-am
-
-clean-am: clean-generic clean-libtool mostlyclean-am
-
-distclean: distclean-am
- -rm -f Makefile
-distclean-am: clean-am distclean-generic distclean-tags
-
-dvi: dvi-am
-
-dvi-am:
-
-html: html-am
-
-html-am:
-
-info: info-am
-
-info-am:
-
-install-data-am: install-pkgincludesubHEADERS
-
-install-dvi: install-dvi-am
-
-install-dvi-am:
-
-install-exec-am:
-
-install-html: install-html-am
-
-install-html-am:
-
-install-info: install-info-am
-
-install-info-am:
-
-install-man:
-
-install-pdf: install-pdf-am
-
-install-pdf-am:
-
-install-ps: install-ps-am
-
-install-ps-am:
-
-installcheck-am:
-
-maintainer-clean: maintainer-clean-am
- -rm -f Makefile
-maintainer-clean-am: distclean-am maintainer-clean-generic
-
-mostlyclean: mostlyclean-am
-
-mostlyclean-am: mostlyclean-generic mostlyclean-libtool
-
-pdf: pdf-am
-
-pdf-am:
-
-ps: ps-am
-
-ps-am:
-
-uninstall-am: uninstall-pkgincludesubHEADERS
-
-.MAKE: install-am install-strip
-
-.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \
- clean-libtool ctags distclean distclean-generic \
- distclean-libtool distclean-tags distdir dvi dvi-am html \
- html-am info info-am install install-am install-data \
- install-data-am install-dvi install-dvi-am install-exec \
- install-exec-am install-html install-html-am install-info \
- install-info-am install-man install-pdf install-pdf-am \
- install-pkgincludesubHEADERS install-ps install-ps-am \
- install-strip installcheck installcheck-am installdirs \
- maintainer-clean maintainer-clean-generic mostlyclean \
- mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
- tags uninstall uninstall-am uninstall-pkgincludesubHEADERS
-
-
-# Tell versions [3.59,3.63) of GNU make to not export all variables.
-# Otherwise a system limit (for SysV at least) may be exceeded.
-.NOEXPORT:
diff --git a/linbox/matrix/abnormal-helpers.h b/linbox/matrix/abnormal-helpers.h
new file mode 100644
index 0000000..fc5b8f2
--- /dev/null
+++ b/linbox/matrix/abnormal-helpers.h
@@ -0,0 +1,171 @@
+/* Copyright (C) 2013 LinBox
+ * Written by AJS <stachnik at udel.edu>
+ *
+ *
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ * ========LICENCE========
+ */
+
+/*! @file linbox/matrix/abnormal-helpers.h
+ * @ingroup linbox/matrix
+ * @brief
+ */
+
+#ifndef __LINBOX_ABNORMAL_HELPERS_H
+#define __LINBOX_ABNORMAL_HELPERS_H
+
+#include <stdlib.h>
+#include <fstream>
+
+namespace LinBox
+{
+
+template <class Field>
+class AbnormalHelper {
+public:
+ typedef typename Field::Element Element;
+ typedef typename Field::Element Abnormal;
+
+ AbnormalHelper () {}
+
+ AbnormalHelper(const Field& F) : field_(&F) {}
+
+ void init(const Field& field) { field_=&field; }
+
+ inline Abnormal& mulacc(Abnormal& x, const Element& y, const Element& z) const {
+ field_->mulacc(x,y,z);
+ return x;
+ }
+
+ inline Element normalize(Abnormal& elt) const {
+ Element d;
+ field_->init(d,elt);
+ return d;
+ }
+
+protected:
+ Field* field_;
+};
+
+template <>
+class AbnormalHelper<Givaro::Modular<double> > {
+public:
+ typedef Givaro::Modular<double> Field;
+ typedef double Element;
+ typedef double Abnormal;
+
+ AbnormalHelper () {}
+
+ AbnormalHelper(const Field& field) {init(field);}
+
+ void init(const Field& field) {
+ modulus_=(double)field.characteristic();
+ unsigned long long maxDouble = 1ULL<<52;
+ bound_=(double)maxDouble;
+ field_=&field;
+ }
+
+ inline Abnormal& mulacc(Abnormal& x, const Element& y, const Element& z) const
+ {
+ Element d;
+ d=y*z;//at most (2**26-1)**2
+ x=x+d;//at most (2**26-1)**2+(2**52-1)<2**53
+ maybeNormalize(x);
+ return x;
+ }
+
+ inline Element& normalize(Abnormal& elt) const
+ {
+ return elt=fmod(elt,modulus_);
+ }
+
+protected:
+ inline Abnormal& maybeNormalize(Abnormal& elt) const
+ {
+ if (elt>=bound_) {
+ elt=fmod(elt,modulus_);
+ }
+ return elt;
+ }
+
+ double modulus_;
+
+ double bound_;
+
+ const Field* field_;
+};
+
+template <>
+class AbnormalHelper<Givaro::Modular<uint64_t> > {
+public:
+ typedef Givaro::Modular<uint64_t> Field;
+ typedef uint64_t Element;
+ typedef uint64_t Abnormal;
+
+ AbnormalHelper () {}
+
+ AbnormalHelper(const Field& field) {init(field);}
+
+ void init(const Field& field) {
+ modulus_=field.characteristic();
+ bound_=(uint64_t)(1ULL<<62);
+ field_=&field;
+ }
+
+ inline Abnormal& mulacc(Abnormal& x, const Element& y, const Element& z) const
+ {
+ Abnormal d;
+ d=y*z;
+ x=x+d;
+ maybeNormalize(x);
+ return x;
+ }
+
+ inline Element normalize(Abnormal& elt) const
+ {
+ return elt=elt%modulus_;
+ }
+
+protected:
+ inline Abnormal& maybeNormalize(Abnormal& elt) const
+ {
+ if (elt>=bound_) {
+ elt=elt%modulus_;
+ }
+ return elt;
+ }
+
+ Abnormal modulus_;
+
+ Abnormal bound_;
+
+ const Field* field_;
+};
+
+}
+
+#endif // __LINBOX_ABNORMAL_HELPERS_H
+
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/matrix/abnormal-matrix.h b/linbox/matrix/abnormal-matrix.h
new file mode 100644
index 0000000..97115a7
--- /dev/null
+++ b/linbox/matrix/abnormal-matrix.h
@@ -0,0 +1,107 @@
+/* Copyright (C) 2013 LinBox
+ * Written by AJS <stachnik at udel.edu>
+ *
+ *
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ * ========LICENCE========
+ */
+
+/*! @file linbox/matrix/abnormal-matrix.h
+ * @ingroup matrix
+ * @brief
+ */
+
+#ifndef __LINBOX_ABNORMAL_MATRIX
+#define __LINBOX_ABNORMAL_MATRIX
+
+#include <stdlib.h>
+#include <fstream>
+#include "linbox/matrix/abnormal-helpers.h"
+
+namespace LinBox
+{
+
+template <class Field, class Matrix>
+class AbnormalMatrix {
+public:
+ typedef size_t Index;
+ typedef typename Field::Element Element;
+
+ AbnormalMatrix() {}
+
+ AbnormalMatrix(const Field& F, Matrix& mat) {init(F,mat);}
+
+ void init (const Field& F, Matrix& mat) {
+ mat_=&mat;
+ cols_=mat_->coldim();
+ rows_=mat_->rowdim();
+ field_=&F;
+ helper_.init(F);
+ }
+
+ inline Element& getEntry(Element& e, Index i, Index j) {
+ return mat_->getEntry(e,i,j);
+ }
+
+ inline void setEntry(Index i, Index j, const Element& e) {
+ mat_->setElement(i,j,e);
+ }
+
+ template <class Mat2>
+ void saxpyin(const Element& e, const Mat2& rhs,
+ Index startRow, Index startCol,
+ Index numRows, Index numCols) {
+ for (Index i=0;i<numRows;++i) {
+ for (Index j=0;j<numCols;++j) {
+ helper_.mulacc(mat_->refEntry(i+startRow,j+startCol),
+ e,
+ rhs.getEntry(i,j));
+ }
+ }
+ }
+
+ void normalize() {
+ for (Index i=0;i<rows_;++i) {
+ for (Index j=0;j<cols_;++j) {
+ helper_.normalize(mat_->refEntry(i,j));
+ }
+ }
+ }
+
+protected:
+ Matrix* mat_;
+
+ AbnormalHelper<Field> helper_;
+
+ const Field* field_;
+
+ Index cols_, rows_;
+};
+
+}
+
+#endif // __LINBOX_ABNORMAL_MATRIX
+
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/matrix/blas-matrix-multimod.h b/linbox/matrix/blas-matrix-multimod.h
deleted file mode 100644
index db588a4..0000000
--- a/linbox/matrix/blas-matrix-multimod.h
+++ /dev/null
@@ -1,218 +0,0 @@
-/* linbox/matrix/blas-matrix-multimod.h
- * Copyright (C) 2004 Pascal Giorgi, Clément Pernet
- *
- * Written by :
- * Pascal Giorgi pascal.giorgi at ens-lyon.fr
- * Clément Pernet clement.pernet at imag.fr
- *
- * ========LICENCE========
- * This file is part of the library LinBox.
- *
- * LinBox is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- * ========LICENCE========
- */
-
-/*! @file matrix/blas-matrix-multimod.h
- * @ingroup matrix
- * A \c BlasMatrix<\c _Field > represents a matrix as an array of
- * <code>_Field::Element</code>s. It also has the BlasBlackbox interface.
- *
- */
-
-/*! @file matrix/blas-matrix-multimod.h
- * @brief specialisation for mutlimod field.
- */
-
-#ifndef __LINBOX_blas_matrix_multimod_H
-#define __LINBOX_blas_matrix_multimod_H
-
-#include "linbox/util/debug.h"
-
-#include "linbox/vector/subiterator.h"
-#include "linbox/vector/subvector.h"
-
-#include "linbox/matrix/matrix-category.h"
-#include "linbox/algorithms/linbox-tags.h"
-#include "linbox/matrix/blas-matrix.h"
-
-THIS_CODE_MAY_NOT_COMPILE_AND_IS_NOT_TESTED
-
-namespace LinBox
-{ /* Specialisation of BlasMatrix for MultiModDouble field */
-
- /*! No Doc.
- */
- template<>
- class BlasMatrix<MultiModDouble> {
-
- public:
-
- typedef MultiModDouble Field;
- typedef std::vector<double> Element;
- typedef BlasMatrix<MultiModDouble> Self_t;
-
- protected:
-
- MultiModDouble _field;
- const std::vector<MatrixDomain<Modular<double> > > _MD;
- size_t _row,_col;
- Element _One,_Zero;
- std::vector<BlasMatrix<Modular<double> >* > _rep;
- std::vector<double> _entry;
- public:
-
-
- //BlasMatrix () {}
-
- BlasMatrix (const MultiModDouble& F) :
- _field(F) , _rep(F.size()), _entry(F.size())
- {}
-
- BlasMatrix (const Field& F, size_t m, size_t n, bool alloc=true) :
- _field(F), _row(m) , _col(n) , _rep(F.size()), _entry(F.size())
- {
- for (size_t i=0;i<_rep.size();++i)
- _rep[i] = new BlasMatrix<Modular<double> > (F.getBase(i), m, n);
- }
-
- BlasMatrix (const BlasMatrix<MultiModDouble> & A):
- _field(A._field),_row(A._row), _col(A._col),
- _rep(A._rep.size()), _entry(A._entry)
- {
-
- for (size_t i=0;i<_rep.size();++i)
- _rep[i]= new BlasMatrix<Modular<double> > (const_cast<BlasMatrix<Modular<double> >& >( *A._rep[i]));
- }
-
-
- const BlasMatrix<MultiModDouble>& operator=(const BlasMatrix<MultiModDouble> & A)
- {
- _field = A._field;
- _row = A._row;
- _col = A._col;
- _rep = std::vector<BlasMatrix<Modular<double> >* >(A._rep.size());
- _entry = A._entry;
- for (size_t i=0;i<_rep.size();++i)
- _rep[i]= new BlasMatrix<Modular<double> > (const_cast<BlasMatrix<Modular<double> >& >( *A._rep[i]));
- return *this;
- }
-
-
- ~BlasMatrix() {for (size_t i=0; i< _rep.size();++i) {delete _rep[i];} }
-
- template <class Vector1, class Vector2>
- Vector1& apply (Vector1& y, const Vector2& x) const
- {
- for (size_t i=0;i<_rep.size();++i) {
- std::vector<double> x_tmp(x.size()), y_tmp(y.size());
- for (size_t j=0;j<x.size();++j)
- x_tmp[j]= x[j][i];
-
- _rep[i]->apply(y_tmp, x_tmp);
-
- for (size_t j=0;j<y.size();++j){
- y[j][i]=y_tmp[j];
-
- }
- }
-
- return y;
- }
-
- template <class Vector1, class Vector2>
- Vector1& applyTranspose (Vector1& y, const Vector2& x) const
- {
- for (size_t i=0;i<_rep.size();++i) {
- std::vector<double> x_tmp(x.size()), y_tmp(y.size());
- for (size_t j=0;j<x.size();++j)
- x_tmp[i]= x[j][i];
-
- _rep[i]->applyTranspose(y_tmp, x_tmp);
-
- for (size_t j=0;j<y.size();++j)
- y[j][i]=y_tmp[i];
- }
-
- return y;
- }
-
-#if 0
- template<typename _Tp1>
- struct rebind
- {
- typedef BlasMatrix<_Tp1> other;
-
- void operator() (other *& Ap, const Self_t& A, const _Tp1& F) {
- Ap = new other(F, A.rowdim(), A.coldim());
- Hom<Field, _Tp1> hom(A. field(), F);
-
- hom.image (*Ap_p, *A_p);
- }
- };
-#endif
-
- size_t rowdim() const {return _row;}
-
- size_t coldim() const {return _col;}
-
-
- const Field &field() const {return _field;}
-
-
- std::ostream& write(std::ostream& os) const
- {
- for (size_t i=0;i<_rep.size();++i)
- _rep[i]->write(os);
- return os;
- }
-
-
- void setEntry (size_t , size_t j, const Element &a_ij)
- {
- for (size_t i=0; i< _rep.size();++i)
- _rep[i]->setEntry(i,j,a_ij[i]);
- }
-
-
- const Element& getEntry (size_t , size_t j)
- {
- for (size_t i=0; i< _rep.size();++i)
- _entry[i]=_rep[i]->getEntry(i,j);
- return _entry;
- }
-
- BlasMatrix<Modular<double> >*& getMatrix(size_t i) {return _rep[i];}
-
- };
-
-
- template <>
- class MatrixContainerTrait<BlasMatrix<MultiModDouble> > {
- public:
- typedef MatrixContainerCategory::Blackbox Type;
- };
-} // LinBox
-
-#endif // __LINBOX_blas_matrix_H
-
-
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
-// Local Variables:
-// mode: C++
-// tab-width: 8
-// indent-tabs-mode: nil
-// c-basic-offset: 8
-// End:
-
diff --git a/linbox/matrix/blas-matrix.h b/linbox/matrix/blas-matrix.h
deleted file mode 100644
index c7f8b59..0000000
--- a/linbox/matrix/blas-matrix.h
+++ /dev/null
@@ -1,1210 +0,0 @@
-/* linbox/matrix/blas-matrix.h
- * Copyright (C) 2004 Pascal Giorgi, Clément Pernet
- *
- * Written by :
- * Pascal Giorgi pascal.giorgi at ens-lyon.fr
- * Clément Pernet clement.pernet at imag.fr
- *
- * ========LICENCE========
- * This file is part of the library LinBox.
- *
- * LinBox is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- * ========LICENCE========
- */
-
-/*! @file matrix/blas-matrix.h
- * @ingroup matrix
- * A \c BlasMatrix<\c _Field > represents a matrix as an array of
- * <code>_Field::Element</code>s. It also has the BlasBlackbox interface.
- *
- */
-
-#ifndef __LINBOX_blas_matrix_H
-#define __LINBOX_blas_matrix_H
-
-#include "linbox/vector/subiterator.h"
-#include "linbox/vector/subvector.h"
-
-#include "linbox/util/debug.h"
-#include "linbox/matrix/matrix-category.h"
-#include "linbox/algorithms/linbox-tags.h"
-
-namespace LinBox
-{ /* not generic wrt Field (eg NTL_ZZ_p) */
- namespace Protected
- {
-
- template <class Field>
- bool checkBlasApply(const Field &F, size_t n)
- {
-
- integer chara, card;
- F.characteristic(chara);
- F.cardinality(card);
-
- if ((chara != card) || chara == 0)
- return false;
- else
- if (n*chara*chara < integer("9007199254740992"))
- return true;
- else
- return false;
- }
- }
-}
-
-namespace LinBox
-{ /* Blas Matrix */
- template<class _Field>
- class BlasSubmatrix ;
-
- /*! Dense matrix representation.
- * @ingroup matrix
- * A BlasMatrix is a matrix of \p _Field::Element, with the structure of BLAS matrices.
- * It is basically a vector of \p _Field::Element.
- * In the Mother model, a BlasMatrix is allocated by the user.
- */
- template <class _Field>
- class BlasMatrix {
- // private :
-
- public:
- typedef _Field Field;
- typedef typename Field::Element Element; //!< Element type
- typedef typename RawVector<Element>::Dense Rep; //!< Actually a <code>std::vector<Element></code> (or alike.)
- typedef typename Rep::pointer pointer; //!< pointer type to elements
- typedef const pointer const_pointer; //!< const pointer type
- typedef BlasMatrix<_Field> Self_t; //!< Self type
-
- protected:
- size_t _row;
- size_t _col;
- Rep _rep;
- pointer _ptr;
- const Field & _field;
- const MatrixDomain<Field> _MD;
- const VectorDomain<Field> _VD;
- bool _use_fflas ;
-
-
- private:
-
-#if 0
- void makePointer()
- {
-#if 0
- if (_row && _col) {
- _ptr = malloc( _row*_col*sizeof(_Element) ) ;
- linbox_check(_ptr);
- }
- else
- _ptr = NULL ;
-#endif
- _rep = Rep(_row*_col);
- _ptr = &_rep[0];
- }
-#endif
-
- /*! @internal
- * @name create BlasMatrix
- * @{ */
-
- /*! @internal
- * Copy data according to blas container structure.
- * Specialisation for BlasContainer.
- */
- void createBlasMatrix (const BlasMatrix<_Field> & A) ;
-
- /*! @internal
- * Copy data according to blas container structure.
- * Specialisation for BlasContainer.
- */
- template <class _Matrix>
- void createBlasMatrix (const _Matrix& A, MatrixContainerCategory::BlasContainer) ;
-
- /*! @internal
- * Copy data according to Matrix container structure.
- * Specialisation for Container
- */
- template <class Matrix>
- void createBlasMatrix (const Matrix& A, MatrixContainerCategory::Container) ;
-
- /*! @internal
- * Copy data according to blackbox structure.
- * Specialisation for Blackbox.
- */
- template <class Matrix>
- void createBlasMatrix (const Matrix& A, MatrixContainerCategory::Blackbox) ;
-
- /*! @internal
- * Copy data according to Matrix container structure (allow submatrix).
- * Specialisation for Container
- */
- template <class _Matrix>
- void createBlasMatrix (const _Matrix& A,
- const size_t i0,const size_t j0,
- const size_t m, const size_t n,
- MatrixContainerCategory::Container) ;
-
- /*! @internal
- * Copy data according to Matrix container structure (allow submatrix).
- * Specialisation for BlasContainer.
- */
- template <class Matrix>
- void createBlasMatrix (const Matrix& A,
- const size_t i0,const size_t j0,
- const size_t m, const size_t n,
- MatrixContainerCategory::BlasContainer) ;
-
- /*! @internal
- * Copy data according to blackbox structure (allow submatrix).
- * Specialisation for Blackbox matrices
- * @todo need to be implemented by succesive apply
- */
- template <class Matrix>
- void createBlasMatrix (const Matrix& A,
- const size_t i0,const size_t j0,
- const size_t m, const size_t n,
- MatrixContainerCategory::Blackbox) ;
-
- /*!@internal constructor from vector of elements.
- * @param v pointer to \c Element s
- */
- void createBlasMatrix ( const Element * v) ;
-
- /*!@internal constructor from vector of elements.
- * @param v std::vector of \c Element s
- */
- void createBlasMatrix ( const std::vector<Element> & v) ;
- /*! @internal
- * @}
- */
-
- public:
-
- //////////////////
- // CONSTRUCTORS //
- //////////////////
-
-
- /*! Allocates a new \f$ 0 \times 0\f$ matrix.
- */
- BlasMatrix (const _Field &F) ;
-
- /*! Allocates a new \f$ 0 \times 0\f$ matrix.
- */
- BlasMatrix () ;
-
- /*! Allocates a new \f$ m \times n\f$ matrix.
- * @param F
- * @param m rows
- * @param n cols
- */
- //@{
-#ifdef __GNUC__
-#ifndef __x86_64__
-#if (__GNUC__ == 4 && __GNUC_MINOR__ ==4 && __GNUC_PATCHLEVEL__==5)
- template<class T>
- BlasMatrix (const _Field &F, const long &m, const T &n) ;
-#endif
-#endif
-#endif
-
- // Pascal Giorgi: fix a bug with MAC OSX
- // MAC OSX defines in stdint.h the int64_t to be a long long which causes trouble here
- // might be useful to add signed type either but need to resolve conflict with pathch version above for GCC-4.4.5
-#ifdef __APPLE__
-
- template<class T>
- BlasMatrix (const _Field &F, const unsigned long &m, const T &n) ;
-#endif
-
- template<class T>
- BlasMatrix (const _Field &F, const uint64_t &m, const T &n) ;
-
- template<class T>
- BlasMatrix (const _Field &F, const int64_t &m, const T &n) ;
-
- template<class T>
- BlasMatrix (const _Field &F, const uint32_t &m, const T &n) ;
-
- template<class T>
- BlasMatrix (const _Field &F, const int32_t &m, const T &n) ;
-
- template<class T>
- BlasMatrix (const _Field &F, const Integer & m, const T &n) ;
-
- //@}
-
-
- /*! Constructor from a matrix stream.
- * @param ms matrix stream.
- */
- BlasMatrix(MatrixStream<_Field>& ms) ;
-
- /*! Generic copy constructor from either a blackbox or a matrix container.
- * @param A matrix to be copied
- */
- template <class Matrix>
- BlasMatrix (const Matrix &A) ;
-
- /*! Generic copy constructor from either a blackbox or a matrix container (allow submatrix).
- * @param A matrix to be copied
- * @param i0
- * @param j0
- * @param m rows
- * @param n columns
- */
- template <class Matrix>
- BlasMatrix (const Matrix& A,
- const size_t i0, const size_t j0,
- const size_t m, const size_t n) ;
-
- /*! Constructor.
- * @param A matrix to be copied
- * @param F Field
- */
- template<class _Matrix>
- BlasMatrix (const _Matrix &A, const _Field &F) ;
-
- /*! Copy Constructor of a matrix (copying data).
- * @param A matrix to be copied.
- */
- BlasMatrix (const BlasMatrix<_Field>& A) ;
-
- /*- Copy Constructor of a matrix (copying data).
- * @param A matrix to be copied.
- */
- // BlasMatrix (const BlasSubmatrix<_Field>& A) ;
-
- /*! Create a BlasMatrix from a vector of elements
- * @param F
- * @param v
- * @param m
- * @param n
- */
- BlasMatrix (const _Field &F, const std::vector<Element>& v,
- size_t m, size_t n) ;
-
- /*! Create a BlasMatrix from an array of elements
- * @param F
- * @param v
- * @param m
- * @param n
- */
- BlasMatrix (const _Field &F, const Element * v,
- size_t m, size_t n) ;
-
-
- /** Constructor using a finite vector stream (stream of the rows).
- * @param F The field of entries; passed so that arithmetic may be done
- * on elements
- * @param stream A vector stream to use as a source of vectors for this
- * matrix
- */
- template <class StreamVector>
- BlasMatrix (const Field &F, VectorStream<StreamVector> &stream) ;
-
- /// Destructor.
- ~BlasMatrix () ;
-
- //! operator = (copying data)
- BlasMatrix<_Field>& operator= (const BlasMatrix<_Field>& A) ;
-
- //! Rebind operator
- template<typename _Tp1>
- struct rebind ;
-
- //////////////////
- // DIMENSIONS //
- //////////////////
-
- /** Get the number of rows in the matrix.
- * @returns Number of rows in matrix
- */
- size_t rowdim() const ;
-
- /** Get the number of columns in the matrix.
- * @returns Number of columns in matrix
- */
- size_t coldim() const ;
-
- /*! Get the stride of the matrix.
- */
- size_t getStride() const;
-
- /*!Get a reference to the stride of the matrix.
- * Modify stride this way.
- */
- size_t& getWriteStride();
-
-
- /** Resize the matrix to the given dimensions.
- * The state of the matrix's entries after a call to this method is
- * undefined
- * @param m Number of rows
- * @param n Number of columns
- * @param val
- */
- void resize (size_t m, size_t n, const Element& val = Element()) ;
-
- //////////////////
- // ELEMENTS //
- //////////////////
-
- /*! @internal
- * Get read-only pointer to the matrix data.
- */
- pointer getPointer() const ;
-
- const_pointer &getConstPointer() const ;
-
-
- /*! @internal
- * Get write pointer to the matrix data.
- * Data may be changed this way.
- */
- pointer& getWritePointer() ;
-
- /** Set the entry at the (i, j) position to a_ij.
- * @param i Row number, 0...rowdim () - 1
- * @param j Column number 0...coldim () - 1
- * @param a_ij Element to set
- */
- void setEntry (size_t i, size_t j, const Element &a_ij) ;
-
- /** Get a writeable reference to the entry in the (i, j) position.
- * @param i Row index of entry
- * @param j Column index of entry
- * @returns Reference to matrix entry
- */
- Element &refEntry (size_t i, size_t j) ;
-
- /** Get a read-only reference to the entry in the (i, j) position.
- * @param i Row index
- * @param j Column index
- * @returns Const reference to matrix entry
- */
- const Element &getEntry (size_t i, size_t j) const ;
-
- /** Copy the (i, j) entry into x, and return a reference to x.
- * This form is more in the Linbox style and is provided for interface
- * compatibility with other parts of the library
- * @param x Element in which to store result
- * @param i Row index
- * @param j Column index
- * @returns Reference to x
- */
- Element &getEntry (Element &x, size_t i, size_t j) const ;
-
- ///////////////////
- // TRANSPOSE &AL //
- ///////////////////
-
- /*! Creates a transposed matrix of \c *this.
- * @param[in] tM
- * @return the transposed matrix of this.
- */
- BlasMatrix<_Field> transpose(BlasMatrix<_Field> & tM) const ;
-
-
- /*! Transpose (inplace).
- * If rows and columns agree, we can transpose inplace.
- */
- template<bool _IP>
- void transpose() ;
-
- void transpose() ;
-
- /*! Reverse the rows of a matrix.
- * This is done inplace.
- * Let J=antiDiag(1) (or the matrix of the reverse
- * permutation or the matrix (i,j) = (i+j+1==m)). Then,
- * we compute A <- J.A;
- */
- void reverseRows() ;
-
- /*! Reverse the columns of a matrix.
- * This is done inplace.
- * This is A <- J.A
- */
- void reverseCols() ;
-
- /*! Reverse the rows/columns of a matrix.
- * This is done inplace.
- * This is A <- J.A.J
- */
- void reverse() ;
-
- ///////////////////
- // I/O //
- ///////////////////
-
- /** Read the matrix from an input stream.
- * The stream is in SMS or DENSE format and is autodetected.
- * @param file Input stream from which to read
- */
- std::istream &read (std::istream &file);
-
- /** Write the matrix to an output stream.
- * @param os Output stream to which to write
- * @param f write in some format (@ref LinBoxTag::Format). Default is Maple's.
- */
- std::ostream &write (std::ostream &os,
- enum LinBoxTag::Format f = LinBoxTag::FormatMaple) const;
-
- /*! @deprecated Only for compatiblity.
- */
- std::ostream &write (std::ostream &os,
- bool mapleFormat) const
- {
- if (mapleFormat)
- return write(os,LinBoxTag::FormatMaple);
- else
- return write(os);
- }
-
-
-
-
- ///////////////////
- // ITERATORS //
- ///////////////////
-
- /** @name Column of rows iterator
- * \brief
- * The column of rows iterator traverses the rows of the
- * matrix in ascending order. Dereferencing the iterator yields
- * a row vector in dense format
- */
- //@{
- typedef Subvector<typename Rep::iterator, typename Rep::const_iterator> Row;
- typedef Subvector<typename Rep::const_iterator> ConstRow;
-
- /*! Row Iterator.
- * @ingroup iterators
- * @brief NO DOC
- */
- class RowIterator;
- /*! Const Row Iterator.
- * @ingroup iterators
- * @brief NO DOC
- */
- class ConstRowIterator;
-
- RowIterator rowBegin ();
- RowIterator rowEnd ();
- ConstRowIterator rowBegin () const;
- ConstRowIterator rowEnd () const;
- //@}
-
- /** @name Row of columns iterator
- * \brief
- * The row of columns iterator traverses the columns of the
- * matrix in ascending order. Dereferencing the iterator yields
- * a column vector in dense format
- */
- //@{
- typedef Subvector<Subiterator<typename Rep::iterator> > Col;
- typedef Subvector<Subiterator<typename Rep::const_iterator> > ConstCol;
- typedef Col Column;
- typedef ConstCol ConstColumn;
-
- /*! Col Iterator.
- * @ingroup iterators
- * @brief NO DOC
- */
- class ColIterator;
- /*! Const Col Iterator.
- * @ingroup iterators
- * @brief NO DOC
- */
- class ConstColIterator;
-
- ColIterator colBegin ();
- ColIterator colEnd ();
- ConstColIterator colBegin () const;
- ConstColIterator colEnd () const;
- //@}
-
- /** @name Iterator
- * \brief
- *
- * The iterator is a method for accessing all entries in the matrix
- * in some unspecified order. This can be used, e.g. to reduce all
- * matrix entries modulo a prime before passing the matrix into an
- * algorithm.
- */
- //@{
- typedef typename Rep::iterator Iterator;
- typedef typename Rep::const_iterator ConstIterator;
-
- Iterator Begin ();
- Iterator End ();
- ConstIterator Begin () const;
- ConstIterator End () const;
- //@}
-
- /** @name Raw Indexed iterator
- * \brief
- *
- * Like the raw iterator, the indexed iterator is a method for
- * accessing all entries in the matrix in some unspecified order.
- * At each position of the the indexed iterator, it also provides
- * the row and column indices of the currently referenced entry.
- * This is provided through it's \c rowIndex() and \c colIndex() functions.
- */
- //@{
- class IndexedIterator;
- /*! Const Indexed Iterator.
- * @ingroup iterators
- * @brief NO DOC
- */
- class ConstIndexedIterator;
-
- IndexedIterator IndexedBegin ();
- IndexedIterator IndexedEnd ();
- ConstIndexedIterator IndexedBegin () const;
- ConstIndexedIterator IndexedEnd () const;
- //@}
-
- /** Retrieve a reference to a row.
- * Since rows may also be indexed, this allows A[i][j] notation
- * to be used.
- * @param i Row index
- */
- //@{
- Row operator[] (size_t i) ;
- ConstRow operator[] (size_t i) const ;
- //@}
-
- ///////////////////
- // MISC //
- ///////////////////
-
-
- /** Compute column density.
- * @param v
- */
- template <class Vector>
- Vector &columnDensity (Vector &v) const ;
-
- ///////////////////
- // BLACK BOX //
- ///////////////////
-
-
- template <class Vector1, class Vector2>
- Vector1& apply (Vector1& y, const Vector2& x) const ;
-
- template <class Vector1, class Vector2>
- Vector1& applyTranspose (Vector1& y, const Vector2& x) const ;
-
- const _Field& field() const;
- _Field& field() ;
- // void setField(const _Field & F) { _field = F ; };
-
- template<class uselessTag>
- void changeFieldSpecialised( _Field & G,
- MatrixDomain<_Field> & MD,
- VectorDomain<_Field> & VD,
- const _Field & F,
- const uselessTag & m)
- {
- return;
- }
-
- void changeFieldSpecialised( _Field & G,
- MatrixDomain<_Field> & MD,
- VectorDomain<_Field> & VD,
- const _Field & F,
- const RingCategories::ModularTag & m)
- {
- G=F ;
- MD = MatrixDomain<_Field>(F);
- VD = VectorDomain<_Field>(F);
- return;
- }
-
-
- void changeField(const _Field &F)
- {
- changeFieldSpecialised(const_cast<_Field&>(_field),
- const_cast<MatrixDomain<_Field>&>(_MD),
- const_cast<VectorDomain<_Field>&>(_VD),
- F,
- typename FieldTraits<_Field>::categoryTag());
- }
-
-
-
- }; // end of class BlasMatrix
-
- template <class _Field>
- struct MatrixTraits< BlasMatrix<_Field> > {
- typedef BlasMatrix<_Field> MatrixType;
- typedef typename MatrixCategories::RowColMatrixTag MatrixCategory;
- };
-
- template <class _Field>
- struct MatrixTraits< const BlasMatrix<_Field> > {
- typedef const BlasMatrix<_Field> MatrixType;
- typedef typename MatrixCategories::RowColMatrixTag MatrixCategory;
- };
-
- /*! Write a matrix to a stream.
- * The \c C++ way using <code>operator<<</code>
- * @param o output stream
- * @param Mat matrix to write.
- */
- template<class T>
- std::ostream& operator<< (std::ostream & o, const BlasMatrix<T> & Mat)
- {
- return Mat.write(o);
- }
-
-} // end of namespace LinBox
-
-namespace LinBox
-{ /* Blas Submatrix */
- /*! Dense Submatrix representation.
- * @ingroup matrix
- * A @ref BlasSubmatrix is a matrix of \p _Field::Element, with the structure of BLAS matrices.
- * It is basically a read/write view on a vector of \p _Field::Element.
- * In the Mother model, a @ref BlasSubmatrix is not allocated.
- * <p>
- * This matrix type conforms to the same interface as @ref BlasMatrix,
- * except that you cannot resize it. It represents a submatrix of a dense
- * matrix. Upon construction, one can freely manipulate the entries in the
- * DenseSubmatrix, and the corresponding entries in the underlying
- * @ref BlasMatrix will be modified.
-
-
- */
- template <class _Field>
- class BlasSubmatrix {
- public :
- typedef _Field Field;
- typedef typename Field::Element Element; //!< Element type
- typedef BlasSubmatrix<_Field> Self_t; //!< Self type
- typedef typename RawVector<Element>::Dense Rep; //!< Actually a <code>std::vector<Element></code> (or alike.)
- typedef typename Rep::pointer pointer; //!< pointer type to elements
- typedef const pointer const_pointer; //!< const pointer type
-
-
- protected:
- BlasMatrix<_Field> *_Mat; //!< Parent BlasMatrix (ie raw vector)
- size_t _row; //!< row dimension of Submatrix
- size_t _col; //!< col dimension of Submatrix
- size_t _r0; //!< upper left corner row of Submatrix in \p _Mat
- size_t _c0; //!< upper left corner row of Submatrix in \p _Mat
- size_t _stride ; //!< number of columns in \p _Mat (or stride of \p _Mat)
- size_t _off;
-
- public:
-
- //////////////////
- // CONSTRUCTORS //
- //////////////////
-
-
- /* constructors */
-
- /** NULL constructor. */
- BlasSubmatrix () ;
-
- /** Constructor from an existing @ref BlasMatrix and dimensions.
- * \param M Pointer to @ref BlasMatrix of which to construct submatrix
- * \param rowbeg Starting row
- * \param colbeg Starting column
- * \param Rowdim Row dimension
- * \param Coldim Column dimension
- */
- BlasSubmatrix (const BlasMatrix<_Field> &M,
- size_t rowbeg,
- size_t colbeg,
- size_t Rowdim,
- size_t Coldim);
-
- /** Constructor from an existing @ref BlasMatrix
- * \param M Pointer to @ref BlasMatrix of which to construct submatrix
- */
- BlasSubmatrix (const BlasMatrix<_Field> &M);
-
-
- /** Constructor from an existing submatrix and dimensions
- * @param SM Constant reference to BlasSubmatrix from which to
- * construct submatrix
- * @param rowbeg Starting row
- * @param colbeg Starting column
- * @param Rowdim Row dimension
- * @param Coldim Column dimension
- */
- BlasSubmatrix (const BlasSubmatrix<_Field> &SM,
- size_t rowbeg,
- size_t colbeg,
- size_t Rowdim,
- size_t Coldim);
-
- /** Copy constructor.
- * @param SM Submatrix to copy
- */
- BlasSubmatrix (const BlasSubmatrix<_Field> &SM);
-
-
- /* Members */
-
- /** Assignment operator.
- * Assign the given submatrix to this one
- * This is <i>only</i> renaming !
- * There is no copy because BlasSubmatrix owns nothing.
- * @param SM Submatrix to assign
- * @return Reference to this submatrix
- */
- BlasSubmatrix &operator = (const BlasSubmatrix<_Field> &SM);
-
- template<typename _Tp1>
- struct rebind ;
-
- //////////////////
- // DIMENSIONS //
- //////////////////
-
- /** Get the number of rows in the matrix
- * @return Number of rows in matrix
- */
- size_t rowdim () const;
-
- /** Get the number of columns in the matrix
- * @return Number of columns in matrix
- */
- size_t coldim () const ;
-
- /*! Get the stride of the matrix.
- * @return stride of submatrix (number of cols of dense base matrix)
- */
- size_t getStride() const;
-
-
- ///////////////////
- // I/O //
- ///////////////////
-
- /** Read the matrix from an input stream.
- * @param file Input stream from which to read
- * @bug reading a submatrix should not be allowed !!
- */
- // template<class Field>
- std::istream& read (std::istream &file/*, const Field& field*/);
-
-
- /** Write the matrix to an output stream.
- * @param os Output stream to which to write
- * @param f write in some format (@ref LinBoxTag::Format). Default is Maple's.
- */
- std::ostream &write (std::ostream &os,
- enum LinBoxTag::Format f = LinBoxTag::FormatMaple) const;
-
- /*! @deprecated Only for compatiblity.
- */
- std::ostream &write (std::ostream &os,
- bool mapleFormat) const
- {
- if (mapleFormat)
- return write(os,LinBoxTag::FormatMaple);
- else
- return write(os);
- }
-
- //////////////////
- // ELEMENTS //
- //////////////////
-
- /*! @internal
- * Get read-only pointer to the matrix data.
- */
- pointer getPointer() const ;
-
- const_pointer &getConstPointer() const ;
-
-
- /*! @internal
- * Get write pointer to the matrix data.
- * Data may be changed this way.
- */
- pointer& getWritePointer() ;
-
-
- /** Set the entry at (i, j).
- * @param i Row number, 0...rowdim () - 1
- * @param j Column number 0...coldim () - 1
- * @param a_ij Element to set
- */
- void setEntry (size_t i, size_t j, const Element &a_ij) ;
-
- /** Get a writeable reference to an entry in the matrix.
- * @param i Row index of entry
- * @param j Column index of entry
- * @return Reference to matrix entry
- */
- Element &refEntry (size_t i, size_t j) ;
-
- /** Get a read-only individual entry from the matrix.
- * @param i Row index
- * @param j Column index
- * @return Const reference to matrix entry
- */
- const Element &getEntry (size_t i, size_t j) const ;
-
- /** Get an entry and store it in the given value.
- * This form is more in the Linbox style and is provided for interface
- * compatibility with other parts of the library
- * @param x Element in which to store result
- * @param i Row index
- * @param j Column index
- * @return Reference to x
- */
- Element &getEntry (Element &x, size_t i, size_t j) const ;
-
-
- ///////////////////
- // ITERATORS //
- ///////////////////
-
- //! @name Forward declaration of Raw Iterators.
- //@{
- class Iterator ;
- class ConstIterator ;
-
- class IndexedIterator ;
- class ConstIndexedIterator ;
- //@}
-
-
- /** @name typedef'd Row Iterators.
- *\brief
- * The row iterator gives the rows of the
- * matrix in ascending order. Dereferencing the iterator yields
- * a row vector in dense format
- * @{
- */
- typedef typename BlasMatrix<_Field>::RowIterator RowIterator;
- typedef typename BlasMatrix<_Field>::ConstRowIterator ConstRowIterator;
- typedef typename BlasMatrix<_Field>::Row Row;
- typedef typename BlasMatrix<_Field>::ConstRow ConstRow;
- //@} Row Iterators
-
- /** @name typedef'd Column Iterators.
- *\brief
- * The columns iterator gives the columns of the
- * matrix in ascending order. Dereferencing the iterator yields
- * a column vector in dense format
- * @{
- */
- typedef typename BlasMatrix<_Field>::ColIterator ColIterator;
- typedef typename BlasMatrix<_Field>::ConstColIterator ConstColIterator;
- typedef typename BlasMatrix<_Field>::Col Col;
- typedef typename BlasMatrix<_Field>::Column Column;
- typedef typename BlasMatrix<_Field>::ConstCol ConstCol;
- //@} // Column Iterators
-
-
-
- RowIterator rowBegin (); //!< iterator to the begining of a row
- RowIterator rowEnd (); //!< iterator to the end of a row
- ConstRowIterator rowBegin () const; //!< const iterator to the begining of a row
- ConstRowIterator rowEnd () const; //!< const iterator to the end of a row
-
- ColIterator colBegin ();
- ColIterator colEnd ();
- ConstColIterator colBegin () const;
- ConstColIterator colEnd () const;
-
- Iterator Begin ();
- Iterator End ();
- ConstIterator Begin () const;
- ConstIterator End () const;
-
-
- IndexedIterator IndexedBegin();
- IndexedIterator IndexedEnd();
- ConstIndexedIterator IndexedBegin() const;
- ConstIndexedIterator IndexedEnd() const;
-
- /*! operator[].
- * Retrieve a reference to a row
- * @param i Row index
- */
- Row operator[] (size_t i) ;
- ConstRow operator[] (size_t i) const ;
-
- ///////////////////
- // BLACK BOX //
- ///////////////////
-
-
- template <class Vector1, class Vector2>
- Vector1& apply (Vector1& y, const Vector2& x) const
- {
- //_stride ?
- if (_Mat->_use_fflas){
- //!@bug this supposes &x[0]++ == &x[1]
- FFLAS::fgemv((typename Field::Father_t) _Mat->_field, FFLAS::FflasNoTrans,
- _row, _col,
- _Mat->_field.one,
- _Mat->_ptr, getStride(),
- &x[0],1,
- _Mat->_field.zero,
- &y[0],1);
- }
- else {
- _Mat->_MD. vectorMul (y, *this, x);
-#if 0
- typename BlasMatrix<_Field>::ConstRowIterator i = this->rowBegin ();
- typename Vector1::iterator j = y.begin ();
-
- for (; j != y.end (); ++j, ++i)
- _VD.dot (*j, *i, x);
-#endif
- }
- return y;
- }
-
- template <class Vector1, class Vector2>
- Vector1& applyTranspose (Vector1& y, const Vector2& x) const
- {
-
- //_stride ?
- if (_Mat->_use_fflas) {
- FFLAS::fgemv((typename Field::Father_t) _Mat->_field, FFLAS::FflasTrans,
- _row, _col,
- _Mat->_field.one,
- _Mat->_ptr, getStride(),
- &x[0],1,
- _Mat->_field.zero,
- &y[0],1);
- }
- else {
- typename BlasMatrix<_Field>::ConstColIterator i = this->colBegin ();
- typename Vector1::iterator j = y.begin ();
- for (; j != y.end (); ++j, ++i)
- _Mat->_VD.dot (*j, x, *i);
- }
-
- return y;
- }
-
- const _Field& field() const { return _Mat->field() ;}
- _Field & field() { return _Mat->field(); }
- };
-
- template <class _Field>
- struct MatrixTraits< BlasSubmatrix<_Field> > {
- typedef BlasSubmatrix<_Field> MatrixType;
- typedef typename MatrixCategories::RowColMatrixTag MatrixCategory;
- };
-
- template <class _Field>
- struct MatrixTraits< const BlasSubmatrix<_Field> > {
- typedef const BlasSubmatrix<_Field> MatrixType;
- typedef typename MatrixCategories::RowColMatrixTag MatrixCategory;
- };
-
- /*! Write a matrix to a stream.
- * The C++ way using <code>operator<<</code>
- * @param o output stream
- * @param Mat matrix to write.
- */
- template<class T>
- std::ostream& operator<< (std::ostream & o, const BlasSubmatrix<T> & Mat)
- {
- return Mat.write(o);
- }
-
-}
-
-namespace LinBox
-{ /* Triangular, Transposed Matrix */
- //! Triangular BLAS matrix.
- template <class _Field>
- class TriangularBlasMatrix: public BlasMatrix<_Field> {
-
- protected:
-
- LinBoxTag::Shape _uplo; //!< upper or lower triangular
- LinBoxTag::Diag _diag; //!< unit or non unit diagonal
-
- public:
- typedef _Field Field;
- typedef typename Field::Element Element; //!< Element type
- typedef BlasMatrix<_Field> Father_t;
- typedef TriangularBlasMatrix<_Field> Self_t;
-
-
- /*! Constructor for a new \c TriangularBlasMatrix.
- * @param F
- * @param m rows
- * @param n cols
- * @param y (non)unit diagonal
- * @param x (upp/low)er matrix
- */
- TriangularBlasMatrix (const Field & F,
- const size_t m, const size_t n,
- LinBoxTag::Shape x=LinBoxTag::Upper,
- LinBoxTag::Diag y= LinBoxTag::NonUnit) ;
-
- /*! Constructor from a \c BlasMatrix (copy).
- * @param A matrix
- * @param y (non)unit diagonal
- * @param x (upp/low)er matrix
- */
- TriangularBlasMatrix (const BlasMatrix<_Field>& A,
- LinBoxTag::Shape x=LinBoxTag::Upper,
- LinBoxTag::Diag y= LinBoxTag::NonUnit) ;
-
- /*! Constructor from a \c BlasMatrix (no copy).
- * @param A matrix
- * @param y (non)unit diagonal
- * @param x (upp/low)er matrix
- */
- TriangularBlasMatrix (BlasMatrix<_Field>& A,
- LinBoxTag::Shape x=LinBoxTag::Upper,
- LinBoxTag::Diag y= LinBoxTag::NonUnit) ;
-
- /*! Constructor from a \c TriangularBlasMatrix (copy).
- * @param A matrix
- */
- TriangularBlasMatrix (const TriangularBlasMatrix<_Field>& A) ;
-
- /*! Generic constructor from a \c Matrix (no copy).
- * @param A matrix
- * @param y (non)unit diagonal
- * @param x (upp/low)er matrix
- */
- template<class Matrix>
- TriangularBlasMatrix (const Matrix& A,
- LinBoxTag::Shape x=LinBoxTag::Upper,
- LinBoxTag::Diag y= LinBoxTag::NonUnit) ;
-
- /// get the shape of the matrix (upper or lower)
- LinBoxTag::Shape getUpLo() const ;
-
- /// Is the diagonal implicitly unit ?
- LinBoxTag::Diag getDiag() const ;
-
- }; // end of class TriangularBlasMatrix
-
-} // LinBox
-
-namespace LinBox
-{ /* indexDomain : used only once in linbox/algorithms/rational-solver.inl */
-
-
- /** Class used for permuting indices.
- * For example, create a vector <code>(0 1 2 ...)</code> over \c
- * size_t, then apply a permutation to it using a \c BlasMatrixDomain to
- * get the natural representation of the permutation.
- */
- class indexDomain {
- public:
- typedef size_t Element;
- public:
- typedef indexDomain Father_t;
- indexDomain() {};
- template <class ANY>
- size_t init(size_t& dst, const ANY& src) const {
- return dst = static_cast<size_t>(src);
- }
- template <class ANY>
- size_t assign(ANY& dst, const size_t& src) const {
- return dst = static_cast<ANY>(src);
- }
- int characteristic() const { return 0 ; }
- };
-}
-
-namespace LinBox
-{ /* Transposed Matrix */
- /*! TransposedBlasMatrix.
- * NO DOC
- */
- template< class Matrix >
- class TransposedBlasMatrix {
-
- public:
-
- /*! NO DOC
- * @param Mat
- */
- TransposedBlasMatrix ( Matrix& Mat ) :
- _Mat(Mat)
- {}
-
- /*! NO DOC
- */
- Matrix& getMatrix() const
- {
- return _Mat;
- }
-
- protected:
- Matrix& _Mat; //!< NO DOC
- };
-
- /*! TransposedBlasMatrix.
- * NO DOC
- */
-#if !defined(__INTEL_COMPILER) && !defined(__CUDACC__) & !defined(__clang__)
- template <>
-#endif
- template< class Matrix >
- class TransposedBlasMatrix< TransposedBlasMatrix< Matrix > > : public Matrix {
-
- public:
- /*! TransposedBlasMatrix.
- * NO DOC
- */
- TransposedBlasMatrix ( Matrix& Mat ) :
- Matrix(Mat)
- {}
-
- /*! TransposedBlasMatrix.
- * NO DOC
- */
- TransposedBlasMatrix ( const Matrix& Mat ) :
- Matrix(Mat)
- {}
-
- };
-
-
-}
-
-
-#include "blas-matrix.inl"
-#include "blas-submatrix.inl"
-#include "blas-triangularmatrix.inl"
-
-#endif // __LINBOX_blas_matrix_H
-
-
-// Local Variables:
-// mode: C++
-// tab-width: 8
-// indent-tabs-mode: nil
-// c-basic-offset: 8
-// End:
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
-
diff --git a/linbox/matrix/blas-matrix.inl b/linbox/matrix/blas-matrix.inl
deleted file mode 100644
index 6400e00..0000000
--- a/linbox/matrix/blas-matrix.inl
+++ /dev/null
@@ -1,1742 +0,0 @@
-/* linbox/matrix/blas-matrix.h
- * Copyright (C) 2004 Pascal Giorgi, Clément Pernet
- *
- * Written by :
- * Pascal Giorgi <pascal.giorgi at ens-lyon.fr>
- * Clément Pernet <clement.pernet at imag.fr>
- * Brice Boyer <bboyer at imag.fr>
- *
- * ========LICENCE========
- * This file is part of the library LinBox.
- *
- * LinBox is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- * ========LICENCE========
- */
-
-/*!@internal
- * @file matrix/blas-matrix.inl
- * @ingroup matrix
- * A \c BlasMatrix<\c _Field > represents a matrix as an array of
- * <code>_Field</code>s.
- */
-
-#ifndef __LINBOX_blas_matrix_INL
-#define __LINBOX_blas_matrix_INL
-
-/////////////////
-// PRIVATE //
-/////////////////
-
-namespace LinBox
-{
- template<class _Field>
- void BlasMatrix<_Field>::createBlasMatrix (const BlasMatrix<_Field>& A)
- {
-#ifndef NDEBUG
- if (!areFieldEqual(A.field(),_field)) {
- A.field().write(std::cout) << "!=" ;
- _field.write(std::cout) << std::endl;
- }
-#endif
- linbox_check( areFieldEqual(A.field(),_field));
- createBlasMatrix(A,MatrixContainerCategory::BlasContainer());
- }
-
- template<class _Field>
- void BlasMatrix<_Field>::createBlasMatrix (const Element * v)
- {
- const_pointer iter_v = v ;
- const_pointer v_end = v+(_col*_row) ;
- Iterator iter_addr = this->Begin();
- for (; v != v_end ; ++v, ++iter_addr)
- _field.init(*iter_addr,*v);
- }
-
- template<class _Field>
- void BlasMatrix<_Field>::createBlasMatrix (const std::vector<Element> & v)
- {
- typename std::vector< Element>::const_iterator iter_value = v.begin();
- Iterator iter_addr = this->Begin();
- for (;iter_value != v.end(); ++iter_value,++iter_addr)
- _field.init(*iter_addr,*iter_value);
- }
-
-
- template<class _Field>
- template <class _Matrix>
- void BlasMatrix<_Field>::createBlasMatrix (const _Matrix& A,
- MatrixContainerCategory::BlasContainer)
- {
- linbox_check( areFieldEqual(A.field(),_field));
- typename _Matrix::ConstIterator iter_value = A.Begin();
- Iterator iter_addr = this->Begin();
- for (;iter_value != A.End(); ++iter_value,++iter_addr)
- _field.init(*iter_addr, *iter_value);
- }
-
- template<class _Field>
- template <class Matrix>
- void BlasMatrix<_Field>::createBlasMatrix (const Matrix& A,
- MatrixContainerCategory::Container)
- {
- linbox_check( areFieldEqual(A.field(),_field));
- // const Field & F = A.field();
- //!@bug With both iterators, it is Segfaulting !!!!
- typename Matrix::ConstIndexedIterator iter_index = A.IndexedBegin();
- for (;iter_index != A.IndexedEnd(); ++iter_index)
- setEntry( iter_index.rowIndex(),
- iter_index.colIndex(),
- A.getEntry(iter_index.rowIndex(),iter_index.colIndex())
- );
- }
-
- template<class _Field>
- template <class Matrix>
- void BlasMatrix<_Field>::createBlasMatrix (const Matrix& A,
- MatrixContainerCategory::Blackbox)
- {
- linbox_check( areFieldEqual(A.field(),_field) );
-
- std::vector<Element> e(A.coldim(), _field.zero), tmp(A.rowdim());
- ColIterator col_p;
-
- typename BlasMatrix< _Field>::Col::iterator elt_p;
- typename std::vector<Element>::iterator e_p, tmp_p;
-
-
- for (col_p = colBegin(), e_p = e.begin();
- e_p != e.end(); ++ col_p, ++ e_p)
- {
-
- _field.assign(*e_p, _field.one);
-
- A.apply (tmp, e);
-
- for (tmp_p = tmp.begin(), elt_p = col_p -> begin();
- tmp_p != tmp.end(); ++ tmp_p, ++ elt_p)
-
- _field.assign(*elt_p, *tmp_p);
-
- _field.assign(*e_p, _field.zero);
- }
- }
-
- template<class _Field>
- template <class _Matrix>
- void BlasMatrix<_Field>::createBlasMatrix (const _Matrix& A,
- const size_t i0,const size_t j0,
- const size_t m, const size_t n,
- MatrixContainerCategory::Container)
- {
- linbox_check( areFieldEqual(A.field(),_field ) );
-
- typename _Matrix::ConstIterator iter_value = A.Begin();
- typename _Matrix::ConstIndexedIterator iter_index = A.IndexedBegin();
-
- for (;iter_value != A.End(); ++iter_value,++iter_index){
- int i,j;
- i=(int)iter_index.rowIndex()-(int)i0;
- j=(int)iter_index.colIndex()-(int)j0;
- if (( i >= 0) && (j >= 0) && (i< (int)m) && (j < (int)n))
- setEntry(i, j, *iter_value);
- }
- }
-
- template<class _Field>
- template <class Matrix>
- void BlasMatrix<_Field>::createBlasMatrix (const Matrix& A,
- const size_t i0,const size_t j0,
- const size_t m, const size_t n,
- MatrixContainerCategory::BlasContainer)
- {
- linbox_check( areFieldEqual(A.field(),_field ) );
-
- typename Matrix::ConstIterator iter_value = A.Begin();
- typename Matrix::ConstIndexedIterator iter_index = A.IndexedBegin();
-
- for (;iter_value != A.End(); ++iter_value,++iter_index){
- int i,j;
- i=(int)iter_index.rowIndex()-(int)i0;
- j=(int)iter_index.colIndex()-(int)j0;
- if ( (i>=0) && (j>=0) && (i< (int)m) && (j < (int)n))
- setEntry(i, j, *iter_value);
- }
- }
-
- template<class _Field>
- template <class Matrix>
- void BlasMatrix<_Field>::createBlasMatrix (const Matrix& A,
- const size_t i0,const size_t j0,
- const size_t m, const size_t n,
- MatrixContainerCategory::Blackbox)
- {
- linbox_check( areFieldEqual(A.field(),_field ) );
-
-
- std::vector<Element> e(A.coldim(), _field.zero), tmp(A.rowdim());
- ColIterator col_p;
-
- typename BlasMatrix< _Field>::Col::iterator elt_p;
- typename std::vector<Element>::iterator e_p, tmp_p;
-
-
- for (col_p = colBegin(), e_p = e.begin()+j0;
- e_p != e.begin()+j0+n; ++ col_p, ++ e_p) {
-
- _field.assign(*e_p, _field.one);
-
- A.apply (tmp, e);
-
- for (tmp_p = tmp.begin()+i0, elt_p = col_p -> begin();
- elt_p != col_p.end(); ++ tmp_p, ++ elt_p) {
- _field.assign(*elt_p, *tmp_p);
- }
-
- _field.assign(*e_p, _field.zero);
- }
- }
-
-} // LinBox
-
-//////////////////
-// CONSTRUCTORS //
-//////////////////
-
-namespace LinBox
-{
-
-
- template <class _Field>
- BlasMatrix< _Field>::BlasMatrix (const _Field &F) :
- _row(0),_col(0),_rep(0),_ptr(NULL),
- _field(F),_MD(F),_VD(F),_use_fflas(false)
- { }
-
- template <class _Field>
- BlasMatrix< _Field>::BlasMatrix () :
- _row(0),_col(0),_rep(0),_ptr(NULL),
- _field(Field()),_MD(_field ),_VD(_field )
- {}
-
-
- template <class _Field>
- template<class T>
- BlasMatrix< _Field>::BlasMatrix ( const _Field &F, const uint32_t& m, const T& n) :
- _row(m),_col(n),_rep(_row*_col),_ptr(&_rep[0]),
- _field(F),_MD(F),_VD(F)
- {
- _use_fflas = Protected::checkBlasApply(_field,_col);
- }
-
- template <class _Field>
- template<class T>
- BlasMatrix< _Field>::BlasMatrix (const _Field &F, const int64_t& m, const T& n) :
- _row((size_t)m),_col((size_t)n),_rep(_row*_col),_ptr(&_rep[0]),
- _field(F),_MD(F),_VD(F)
- {
- linbox_check(n>=0);
- linbox_check(m>=0);
- _use_fflas = Protected::checkBlasApply(_field,_col);
- }
-
-#ifdef __GNUC__
-#ifndef __x86_64__
-#if (__GNUC__ == 4 && __GNUC_MINOR__ ==4 && __GNUC_PATCHLEVEL__==5)
- template <class _Field>
- template<class T>
- BlasMatrix< _Field>::BlasMatrix (const _Field &F, const long & m, const T& n) :
- _row(m),_col(n),_rep(_row*_col),_ptr(&_rep[0]),
- _field(F),_MD(F),_VD(F)
- {
- linbox_check(n>=0);
- linbox_check(m>=0);
- _use_fflas = Protected::checkBlasApply(_field,_col);
- }
-#endif
-#endif
-#endif
-
-#ifdef __APPLE__
- template <class _Field>
- template<class T>
- BlasMatrix< _Field>::BlasMatrix (const _Field &F, const unsigned long & m, const T& n) :
- _row(m),_col(n),_rep(_row*_col),_ptr(&_rep[0]),
- _field(F),_MD(F),_VD(F)
- {
- linbox_check(n>=0);
- linbox_check(m>=0);
- _use_fflas = Protected::checkBlasApply(_field,_col);
- }
-#endif
-
-
- template <class _Field>
- template<class T>
- BlasMatrix< _Field>::BlasMatrix (const _Field &F, const uint64_t &m, const T & n) :
- _row(m),_col(n),_rep(_row*_col),_ptr(&_rep[0]),
- _field(F),_MD(F),_VD(F)
- {
- //!@todo
- // linbox_check_non_neg(n);
- // linbox_check(n>=0);
- // makePointer();
- _use_fflas = Protected::checkBlasApply(_field, _col);
- }
-
- template <class _Field>
- template<class T>
- BlasMatrix< _Field>::BlasMatrix (const _Field &F, const int32_t & m, const T &n) :
- _row((size_t) m),_col((size_t)n),_rep(_row*_col),_ptr(&_rep[0]),
- _field(F),_MD(F),_VD(F)
- {
- linbox_check(isPositive<T>(n));
- linbox_check(m>=0);
- // makePointer();
- _use_fflas = Protected::checkBlasApply(_field, _col);
- }
-
- template <class _Field>
- template<class T>
- BlasMatrix< _Field>::BlasMatrix ( const _Field &F, const Integer & m, const T &n) :
- _row(m),_col(n),_rep(_row*_col),_ptr(&_rep[0]),
- _field(F),_MD(F),_VD(F)
- {
- //!@todo check m,n not too big ?
- linbox_check(n>=0);
- linbox_check(m>=0);
- // makePointer();
- _use_fflas = Protected::checkBlasApply(_field, _col);
- }
-
-
-
- template <class _Field>
- BlasMatrix< _Field>::BlasMatrix(MatrixStream<_Field>& ms) :
- _row(0),_col(0),_rep(0),
- _field(ms.getField()),_MD(_field ),_VD(_field )
- {
- if( !ms.getArray(_rep) || !ms.getRows(_row) || !ms.getColumns(_col) )
- throw ms.reportError(__FUNCTION__,__LINE__);
- _ptr = &_rep[0];
- _use_fflas = Protected::checkBlasApply(_field, _col);
- }
-
- template <class _Field>
- template <class StreamVector>
- BlasMatrix< _Field>::BlasMatrix (const Field &F, VectorStream<StreamVector> &stream) :
- _row(stream.size ()), _col(stream.dim ()), _rep(_row*_col), _ptr(&_rep[0]),
- _field (F), _MD (F), _VD(F)
- {
- StreamVector tmp;
- typename BlasMatrix<Field>::RowIterator p;
-
- VectorWrapper::ensureDim (tmp, stream.dim ());
-
- for (p = BlasMatrix<Field>::rowBegin (); p != BlasMatrix<Field>::rowEnd (); ++p) {
- stream >> tmp;
- _VD.copy (*p, tmp);
- }
- _use_fflas = Protected::checkBlasApply(_field, _col);
- }
-
-
- template <class _Field>
- template <class Matrix>
- BlasMatrix< _Field>::BlasMatrix (const Matrix &A) :
- _row(A.rowdim()),_col(A.coldim()),_rep(_row*_col),_ptr(&_rep[0]),
- _field(A.field()),_MD(_field ),_VD(_field )
- {
- // makePointer();
- _use_fflas = Protected::checkBlasApply(_field, _col);
- createBlasMatrix(A, typename MatrixContainerTrait<Matrix>::Type());
- }
-
- template <class _Field>
- template <class Matrix>
- BlasMatrix< _Field>::BlasMatrix (const Matrix& A,
- const size_t i0, const size_t j0,
- const size_t m, const size_t n) :
- _row(m),_col(n),_rep(_row*_col),_ptr(&_rep[0]),
- _field(A.field()),_MD(_field ),_VD(_field )
- {
- _use_fflas = Protected::checkBlasApply(_field, _col);
- // makePointer();
- createBlasMatrix(A, i0, j0, m, n,
- typename MatrixContainerTrait<Matrix>::Type());
- }
-
- template <class _Field>
- template<class _Matrix>
- BlasMatrix< _Field>::BlasMatrix (const _Matrix &A, const _Field &F) :
- _row(A.rowdim()), _col(A.coldim()),_rep(_row*_col),_ptr(&_rep[0]),
- _field(F),_MD(_field ),_VD(_field )
- {
- _use_fflas = Protected::checkBlasApply(_field, _col);
- typename _Matrix::template rebind<_Field>()(*this,A);
- }
-
- template <class _Field>
- BlasMatrix< _Field>::BlasMatrix (const BlasMatrix< _Field>& A) :
- _row(A.rowdim()), _col(A.coldim()),_rep(_row*_col),_ptr(&_rep[0]),
- _field(A.field()),_MD(_field ),_VD(_field )
- {
- _use_fflas = Protected::checkBlasApply(_field, _col);
- // makePointer();
- createBlasMatrix(A);
- }
-
- template <class _Field>
- BlasMatrix< _Field>::BlasMatrix (const _Field &F,
- const std::vector<typename _Field::Element>& v,
- size_t m, size_t n) :
- _row(m), _col(n),_rep(_row*_col),_ptr(&_rep[0]),
- _field(F),_MD(_field ),_VD(_field )
- {
- linbox_check(v.size() == m*n);
- // makePointer();
- _use_fflas = Protected::checkBlasApply(_field, _col);
- createBlasMatrix(v);
- }
-
- template <class _Field>
- BlasMatrix< _Field>::BlasMatrix (const _Field &F,
- const typename _Field::Element * v,
- size_t m, size_t n) :
- _row(m), _col(n),_rep(_row*_col),_ptr(&_rep[0]),
- _field(F), _MD(_field ),_VD(_field )
- {
- // makePointer();
- _use_fflas = Protected::checkBlasApply(_field, _col);
- createBlasMatrix(_field,v);
- }
-
- template <class _Field>
- BlasMatrix< _Field>::~BlasMatrix ()
- {
- // if (_ptr)
- // free(_ptr);
- }
-
-} // LinBox
-
-///////////////////
-// I/O //
-///////////////////
-
-namespace LinBox
-{
-
- template <class _Field>
- // template <class Field>
- std::istream &BlasMatrix< _Field>::read (std::istream &file)
- {
-#if 0
- Iterator p;
- int m,n;
- char c;
- file>>m>>n>>c;
-
- if (m*n < _row*_col)
- cerr<<"NOT ENOUGH ELEMENT TO READ\n";
- else {
- for (p = Begin (); p != End (); ++p) {
- integer tmp;
- file>>tmp;cout<<tmp<<endl;
- //file.ignore(1);
- F.read (file, *p);
- }
- }
-#endif
-
-
- Iterator p;
- int m,n;
- char c;
- file>>m>>n>>c;
- // std::cout << m << 'x' << n << ':' << c << std::endl;
- _row = m; _col = n;
-
- // _ptr.resize(_row * _col, zero);
- resize(_row,_col);
-
- if ((c != 'M') && (c != 'm')) {
- for (p = Begin (); p != End (); ++p) {
- //file.ignore(1);
- _field.read (file, *p);
- }
- }
- else { // sparse file format - needs fixing
- int i, j;
- while (true) {
- file >> i >> j;
- //file.ignore(1);
- //if (! file) break;
- if (i+j <= 0) break;
- // std::cout << i << ',' << j << ':' ;
- _field.read (file, _ptr[_col*(i-1) + j-1]);
- // std::cout << _ptr[_col*(i-1) + j-1] << std::endl;
- }
- }
-
- return file;
- }
-
- template <class _Field>
- std::ostream& BlasMatrix< _Field>::write (std::ostream &os,
- enum LinBoxTag::Format f) const
- {
-
- ConstRowIterator p;
-
- switch(f) {
- case (LinBoxTag::FormatPlain) : /* raw output */
- {
- integer c;
- int wid;
-
- _field.cardinality (c);
-
- if (c >0) {
- wid = (int) ceil (log ((double) c) / M_LN10);
- }
- else {
- integer tmp;
- size_t max=0;
- ConstIterator it = Begin();
- for (; it != End(); ++it){
- _field.convert(tmp,*it);
- if (tmp.bitsize() > max)
- max= tmp.bitsize();
- }
- wid= (int) ceil ((double)max / M_LN10)+1;
- }
-
- for (p = rowBegin (); p != rowEnd ();++p) {
- typename ConstRow::const_iterator pe;
-
- os << " [ ";
-
- for (pe = p->begin (); pe != p->end (); ++pe) {
- os.width (wid);
- /*! @warning
- * matrix base does not provide this field(), maybe should?
- * _Mat.field ().write (os, *pe);
- * os << *pe;
- * fixed by using extra field
- */
-
- _field.write (os, *pe);
- os << " ";
- }
-
- os << "]" << std::endl;
- }
- }
- break;
- case (LinBoxTag::FormatMaple) : /* maple format */
- {
- os << "Matrix( " << rowdim() << ',' << coldim() << ",[" ;
- for (p = rowBegin (); p != rowEnd (); ) {
- typename ConstRow::const_iterator pe;
-
- os << " [ ";
-
- for (pe = p->begin (); pe != p->end (); ) {
- _field.write (os, *pe);
- ++pe ;
- if (pe != p->end())
- os << ", ";
- }
-
- os << "]" ;
- ++p ;
- if (p != rowEnd() )
- os << ',' << std::endl;;
-
- }
- os << "])" ;
- }
- break;
- case (LinBoxTag::FormatHTML) : /* html format */
- {
- os << "<table border=\"1\">" ;
- for (p = rowBegin (); p != rowEnd (); ) {
- typename ConstRow::const_iterator pe;
-
- os << "<tr>";
-
- for (pe = p->begin (); pe != p->end (); ) {
- _field.write (os << "<td>", *pe)<<"</td>";
- ++pe ;
- }
-
- os << "</tr>" << std::endl;
- ++p ;
- }
- os << "</table>" ;
- }
- break;
- case (LinBoxTag::FormatLaTeX) : /* latex format (pmatrix) */
- {
-
- os << "\\begin{pmatrix} " << std::endl;
- for (p = rowBegin (); p != rowEnd (); ) {
- typename ConstRow::const_iterator pe;
-
-
- for (pe = p->begin (); pe != p->end (); ) {
- _field.write (os, *pe);
- ++pe ;
- if (pe != p->end())
- os << "& ";
- }
-
- os << "\\\\" << std::endl;
- ++p ;
-
- }
- os << "\\end{pmatrix}" ;
- }
- break;
- default : /* this is an error */
- {
- throw LinBoxError("unknown format to write matrix in");
- }
- }
- return os;
- }
-
- template <class _Field>
- BlasMatrix< _Field>& BlasMatrix< _Field>::operator= (const BlasMatrix< _Field>& A)
- {
- if ( &A == this)
- return *this;
-
- _col = A.coldim();
- _row = A.rowdim();
- _rep = Rep(_row*_col);
- _ptr = &_rep[0] ;
- // const_cast<_Field&>(_field ) = A.field();
- // changeField( A.field() );
- createBlasMatrix(A);
-
- return *this;
- }
-
-#if 0 /* loop rebind */
- template <class _Field>
- template<typename _Tp1>
- struct BlasMatrix< _Field>::rebind {
- typedef BlasMatrix<_Tp1> other;
-
- void operator() (other & Ap, const Self_t& A, const _Tp1& F) {
- // typedef typename BlasMatrix< _Field>::ConstIndexedIterator ConstIndexedIterator ;
- // typedef typename BlasMatrix< _Field>::ConstIterator ConstIterator ;
- ConstIterator iter_value = A.Begin();
- ConstIndexedIterator iter_index = A.IndexedBegin();
- typename _Tp1::Element tmp;
- for (;iter_value != A.End(); ++iter_value,++iter_index){
- Ap.field().init( tmp, *iter_value );
- Ap.setEntry(iter_index.rowIndex(), iter_index.colIndex(),tmp);
- }
- }
- };
-#endif
-
-#if 1 /* HOM */
- template <class _Field>
- template<typename _Tp1>
- struct BlasMatrix< _Field>::rebind {
- typedef BlasMatrix<_Tp1> other;
-
- void operator() (other & Ap, const Self_t& A) {
- typedef typename BlasMatrix<_Field>::ConstIterator ConstSelfIterator ;
- typedef typename other::Iterator OtherIterator ;
- OtherIterator Ap_i = Ap.Begin();
- ConstSelfIterator A_i = A.Begin();
- Hom<Field, _Tp1> hom(A. field(), Ap. field()) ;
- for ( ; A_i != A. End(); ++ A_i, ++ Ap_i)
- hom.image (*Ap_i, *A_i);
- }
- };
-#endif
-
-
- } // LinBox
-
-//////////////////
-// DIMENSIONS //
-//////////////////
-
-namespace LinBox
-{
-
- template <class _Field>
- size_t BlasMatrix< _Field>::rowdim() const
- {
- return _row ;
- }
-
- template <class _Field>
- size_t BlasMatrix< _Field>::coldim() const
- {
- return _col ;
- }
-
- template <class _Field>
- size_t BlasMatrix< _Field>::getStride() const
- {
- return _col;
- }
-
- template <class _Field>
- size_t& BlasMatrix< _Field>::getWriteStride()
- {
- return _col;
- }
-
- template <class _Field>
- void BlasMatrix< _Field>::resize (size_t m, size_t n, const Element& val )
- {
-#ifndef NDEBUG
- if (_col != n)
- std::cerr << " ***Warning*** you are resizing a matrix, possibly loosing data. " << std::endl;
-#endif
- _row = m;
- _col = n;
- _rep.resize (m * n, val);
-#if 0
- if (_ptr) {
- if (m && n)
- realloc(_ptr,m*n*sizeof(Element));
- else {
- free(_ptr);
- _ptr=NULL ;
- }
- }
- else
- makePointer();
-#endif
- }
-
-} // LinBox
-
-//////////////////
-// ELEMENTS //
-//////////////////
-
-namespace LinBox
-{
-
-
- template <class _Field>
- typename BlasMatrix< _Field>::pointer
- BlasMatrix< _Field>::getPointer() const
- {
- return _ptr;
- }
-
- template <class _Field>
- typename BlasMatrix< _Field>::const_pointer &
- BlasMatrix< _Field>::getConstPointer() const
- {
- return (const_pointer)_ptr;
- }
-
-
- template <class _Field>
- typename BlasMatrix< _Field>::pointer&
- BlasMatrix< _Field>::getWritePointer()
- {
- return _ptr;
- }
-
- template <class _Field>
- void BlasMatrix< _Field>::setEntry (size_t i, size_t j, const Element &a_ij)
- {
- _ptr[i * _col + j] = a_ij;
- }
-
- template <class _Field>
- typename _Field::Element & BlasMatrix< _Field>::refEntry (size_t i, size_t j)
- {
- return _ptr[i * _col + j];
- }
-
- template <class _Field>
- const typename _Field::Element & BlasMatrix< _Field>::getEntry (size_t i, size_t j) const
- {
- return _ptr[i * _col + j];
- }
-
- template <class _Field>
- typename _Field::Element & BlasMatrix< _Field>::getEntry (Element &x, size_t i, size_t j) const
- {
- x = _ptr[i * _col + j];
- return x;
- }
-
-} // LinBox
-
-///////////////////
-// TRANSPOSE &AL //
-///////////////////
-
-namespace LinBox
-{
- template <class _Field>
- BlasMatrix< _Field> BlasMatrix< _Field>::transpose(BlasMatrix< _Field> & tM) const
- {
- size_t r = this->rowdim() ;
- size_t c = this->coldim() ;
- linbox_check(tM.coldim() == r );
- linbox_check(tM.rowdim() == c);
- for (size_t i = 0 ; i < r ; ++i)
- for (size_t j = 0 ; j < c ; ++j)
- tM.setEntry(j,i,this->getEntry(i,j));
- return tM;
- }
-
- namespace Protected
- {
- /*! @internal
- * @brief In-Place Tranpose.
- * Adapted from the Wikipedia article.
- * @todo make it for strides and Submatrices
- * @todo use specialized versions when available (eg dgetmi)
- * @todo make transpose have an inplace=true default parameter
- * (execpt maybe when below a threshold).
- * @param m pointer to the beginning of a row-major matrix vector
- * @param w rows in the matrix
- * @param h cols in the matrix
- */
- template<class T>
- void transposeIP(T *m, size_t h, size_t w)
- {
- size_t start, next, i;
- T tmp;
-
- for (start = 0; start <= w * h - 1; ++start) {
- next = start;
- i = 0;
- do {
- ++i;
- next = (next % h) * w + next / h;
- } while (next > start);
- if (next < start || i == 1)
- continue;
-
- tmp = m[next = start];
- do {
- i = (next % h) * w + next / h;
- m[next] = (i == start) ? tmp : m[i];
- next = i;
- } while (next > start);
- }
- }
- } // Protected
-
- template <class _Field>
- template<bool _IP>
- void BlasMatrix< _Field>::transpose()
- {
- size_t r = this->rowdim() ;
- size_t c = this->coldim() ;
-
- if ( r == c) {
- for (size_t i = 0 ; i < r ; ++i)
- for (size_t j = i+1 ; j < c ; ++j)
- std::swap(this->refEntry(i,j),this->refEntry(j,i));
- }
- else {
- if (!_IP) {
- BlasMatrix<_Field> MM(*this);
- std::swap(_row,_col);
- // iterating row first seems faster.
-#ifdef _BLOCKIT
- size_t B ;
- B = 1024;
-
- for (size_t bi = 0 ; bi < r/B ; ++bi) {
- for (size_t bj = 0 ; bj < c/B ; ++bj){
- for (size_t i = 0 ; i < B ; ++i)
- for (size_t j = 0 ; j < B ; ++j)
- this->setEntry(bj*B+j,bi*B+i,
- MM.getEntry(bi*B+i,bj*B+j));
- }
- }
- for (size_t i = r/B*B ; i < r ; ++i)
- for (size_t j = c/B*B ; j < c ; ++j)
- this->setEntry(j,i,
- MM.getEntry(i,j));
-#else
- for (size_t i = 0 ; i < r ; ++i)
- for (size_t j = 0 ; j < c ; ++j)
- this->setEntry(j,i,
- MM.getEntry(i,j));
-#endif
-
- }
- else {
- Protected::transposeIP<Element>(_ptr,_row,_col);
- std::swap(_row,_col);
- }
- }
- }
-
- template <class _Field>
- void BlasMatrix< _Field>::transpose()
- {
- this->transpose<false>();
- }
-
- template <class _Field>
- void BlasMatrix< _Field>::reverseRows()
- {
- size_t r = this->rowdim()/2 ;
- for (size_t i = 0 ; i < r ; ++i) {
- _VD.swap( this->rowBegin()+i,
- this->rowBegin()+(r-1-i) );
- }
-
- }
-
- template <class _Field>
- void BlasMatrix< _Field>::reverseCols()
- {
- size_t r = this->rowdim() ;
- size_t c = this->coldim()/2 ;
- for (size_t j = 0 ; j < c ; ++j) {
- for (size_t i = 0 ; i < r ; ++i) {
- std::swap(this->refEntry(i,j),
- this->refEntry(i,c-j-1));
-
- }
- }
- }
-
- template <class _Field>
- void BlasMatrix< _Field>::reverse()
- {
- size_t r = this->rowdim() ;
- size_t c = this->coldim() ;
- for (size_t j = 0 ; j < c ; ++j) {
- for (size_t i = 0 ; i < r ; ++i) {
- std::swap(this->refEntry(i,j),
- this->refEntry(r-i-1,c-j-1));
-
- }
- }
- }
-} // LinBox
-
-///////////////////
-// ITERATORS //
-///////////////////
-
-namespace LinBox
-{
-
- template <class _Field>
- class BlasMatrix< _Field>::ConstRowIterator {
- public:
- ConstRowIterator (const typename Rep::const_iterator& p, size_t len, size_t d) :
- _row (p, p + len), _dis (d)
- {}
-
- ConstRowIterator () {}
-
- ConstRowIterator (const ConstRowIterator& colp) :
- _row (colp._row), _dis (colp._dis)
- {}
-
- ConstRowIterator& operator = (const ConstRowIterator& colp)
- {
- _row = colp._row;
- _dis = colp._dis;
- return *this;
- }
-
- ConstRowIterator& operator --()
- {
- _row = ConstRow (_row.begin () - _dis, _row.end () - _dis);
- return *this;
- }
-
- ConstRowIterator operator-- (int)
- {
- ConstRowIterator tmp (*this);
- --*this;
- return tmp;
- }
-
-
- ConstRowIterator& operator++ ()
- {
- _row = ConstRow (_row.begin () + _dis, _row.end () + _dis);
- return *this;
- }
-
- ConstRowIterator operator++ (int)
- {
- ConstRowIterator tmp (*this);
- ++*this;
- return tmp;
- }
-
- ConstRowIterator operator+ (int i)
- {
- return ConstRowIterator (_row.begin () + _dis * i, _row.size (), _dis);
- }
-
- ConstRowIterator& operator += (int i)
- {
- _row = ConstRow (_row.begin () + _dis * i, _row.end () + _dis * i);
- return *this;
- }
-
- ConstRow operator[] (int i) const
- {
- return ConstRow (_row.begin () + _dis * i, _row.end () + _dis * i);
- }
-
- ConstRow* operator-> ()
- {
- return &_row;
- }
-
- ConstRow& operator* ()
- {
- return _row;
- }
-
- bool operator!= (const ConstRowIterator& c) const
- {
- return (_row.begin () != c._row.begin ()) || (_row.end () != c._row.end ()) || (_dis != c._dis);
- }
-
- private:
- ConstRow _row;
- size_t _dis;
- };
-
- template <class _Field>
- class BlasMatrix< _Field>::RowIterator {
- public:
- RowIterator (const typename Rep::iterator& p, size_t len, size_t d) :
- _row (p, p + len), _dis (d)
- {}
-
- RowIterator () {}
-
- RowIterator (const RowIterator& colp) :
- _row (colp._row), _dis (colp._dis)
- {}
-
- RowIterator& operator = (const RowIterator& colp)
- {
- _row = colp._row;
- _dis = colp._dis;
- return *this;
- }
-
- RowIterator& operator ++ ()
- {
- _row = Row (_row.begin () + _dis, _row.end () + _dis);
- return *this;
- }
-
- RowIterator operator ++ (int)
- {
- RowIterator tmp (*this);
- ++*this;
- return tmp;
- }
-
- RowIterator& operator -- ()
- {
- _row = Row (_row.begin () - _dis, _row.end () - _dis);
- return *this;
- }
-
- RowIterator operator -- (int)
- {
- RowIterator tmp (*this);
- --*this;
- return tmp;
- }
-
- RowIterator operator + (int i)
- {
- return RowIterator (_row.begin () + _dis * i, _row.size (), _dis);
- }
-
- RowIterator& operator += (int i)
- {
- _row = Row (_row.begin () + _dis * i, _row.end () + _dis * i);
- return *this;
- }
-
- Row operator[] (int i) const
- {
- return Row (const_cast<Row&> (_row).begin () + _dis * i,
- const_cast<Row&> (_row).end () + _dis * i);
- }
-
- Row* operator-> ()
- {
- return &_row;
- }
-
- Row& operator* ()
- {
- return _row;
- }
-
- bool operator!= (const RowIterator& c) const
- {
- return (_row.begin () != c._row.begin ()) || (_row.end () != c._row.end ()) || (_dis != c._dis);
- }
-
- operator ConstRowIterator ()
- {
- return ConstRowIterator (_row.begin (), _row.size (), _dis);
- }
-
- private:
- Row _row;
- size_t _dis;
- };
-
- template <class _Field>
- class BlasMatrix< _Field>::ConstColIterator {
- public:
- ConstColIterator (typename Rep::const_iterator p, size_t stride, size_t len) :
- _col (Subiterator<typename Rep::const_iterator> (p, stride),
- Subiterator<typename Rep::const_iterator> (p + len * stride, stride)),
- _stride (stride)
- {}
-
- ConstColIterator (const ConstCol& col, size_t stride) :
- _col (col),
- _stride (stride)
- {}
-
- ConstColIterator () {}
-
- ConstColIterator (const ConstColIterator& rowp) :
- _col (rowp._col)
- {}
-
- ConstColIterator& operator= (const ConstColIterator& rowp)
- {
- _col = rowp._col;
- _stride = rowp._stride;
- return *this;
- }
-
- ConstColIterator& operator++ ()
- {
- _col = ConstCol (Subiterator<typename Rep::const_iterator> (_col.begin ().operator-> () + 1, _stride),
- Subiterator<typename Rep::const_iterator> (_col.end ().operator-> () + 1, _stride));
- return *this;
- }
-
- ConstColIterator operator++ (int)
- {
- ConstColIterator old(*this);
- this->operator++ ();
- return old;
- }
-
- ConstColIterator operator + (int i)
- {
- return ConstColIterator (_col.begin ().operator-> () + i, _stride, _col.size ());
- }
-
- ConstColIterator& operator += (int i)
- {
- _col = ConstCol (Subiterator<typename Rep::const_iterator> (_col.begin ().operator-> () + i, _stride),
- Subiterator<typename Rep::const_iterator> (_col.end ().operator-> () + i, _stride));
- return *this;
- }
-
- ConstCol operator[] (int i) const
- {
- return ConstCol (Subiterator<typename Rep::const_iterator> (_col.begin ().operator-> () + i, _stride),
- Subiterator<typename Rep::const_iterator> (_col.end ().operator-> () + i, _stride));
- }
-
- ConstCol* operator-> ()
- {
- return &_col;
- }
-
- ConstCol& operator* ()
- {
- return _col;
- }
-
- bool operator!= (const ConstColIterator& c) const
- {
- return (_col.begin () != c._col.begin ()) || (_col.end () != c._col.end ());
- }
-
- private:
- ConstCol _col;
- size_t _stride;
- };
-
- template <class _Field>
- class BlasMatrix< _Field>::ColIterator {
- public:
- ColIterator (typename Rep::iterator p, size_t stride, size_t len) :
- _col (Subiterator<typename Rep::iterator> (p, stride),
- Subiterator<typename Rep::iterator> (p + len * stride, stride)), _stride (stride)
- {}
-
- ColIterator () {}
-
- ColIterator (const ColIterator& rowp) :
- _col (rowp._col)
- {}
-
- ColIterator& operator= (const ColIterator& rowp)
- {
- _col = rowp._col;
- _stride = rowp._stride;
- return *this;
- }
-
- const ColIterator& operator= (const ColIterator& rowp) const
- {
- const_cast<ColIterator*> (this)->_col = rowp._col;
- return *this;
- }
-
- ColIterator& operator++ ()
- {
- _col = Col (Subiterator<typename Rep::iterator> (_col.begin ().operator-> () + 1, _stride),
- Subiterator<typename Rep::iterator> (_col.end ().operator-> () + 1, _stride));
- return *this;
- }
-
- ColIterator operator++ (int)
- {
- Col tmp (_col);
- this->operator++ ();
- return tmp;
- }
-
- ColIterator operator + (int i)
- {
- return ColIterator (_col.begin ().operator-> () + i, _stride, _col.size ());
- }
-
- ColIterator& operator += (int i)
- {
- _col = Col (Subiterator<typename Rep::iterator> (_col.begin ().operator-> () + i, _stride),
- Subiterator<typename Rep::iterator> (_col.end ().operator-> () + i, _stride));
- return *this;
- }
-
- Col operator[] (int i) const
- {
- return Col (Subiterator<typename Rep::iterator> (const_cast<Col&> (_col).begin ().operator-> () + i, _stride),
- Subiterator<typename Rep::iterator> (const_cast<Col&> (_col).end ().operator-> () + i, _stride));
- }
-
- Col* operator-> ()
- {
- return &_col;
- }
-
- Col& operator* ()
- {
- return _col;
- }
-
- bool operator!= (const ColIterator& c) const
- {
- return (_col.begin () != c._col.begin ()) || (_col.end () != c._col.end ());
- }
-
- operator ConstColIterator ()
- {
- return ConstColIterator (reinterpret_cast<ConstCol&> (_col) , _stride);
- }
-
- private:
-
- Col _col;
- size_t _stride;
- };
-
- /*! Indexed Iterator.
- * @ingroup iterators
- * @brief NO DOC
- */
- template <class _Field>
- class BlasMatrix< _Field>::IndexedIterator {
- size_t _r_index;
- size_t _c_index;
- size_t _dim;
- typename Rep::iterator _begin;
- typedef typename _Field::Element value_type;
-
- public:
- IndexedIterator (const size_t &dim,
- const size_t &r_index,
- const size_t &c_index,
- const typename Rep::iterator &begin) :
- _r_index (r_index), _c_index (c_index), _dim (dim), _begin (begin)
- {}
-
- IndexedIterator () :
- _r_index (0), _c_index (0), _dim (1), _begin (0)
- {}
-
- IndexedIterator (const IndexedIterator& r) :
- _r_index (r._r_index), _c_index (r._c_index), _dim (r._dim), _begin (r._begin)
- {}
-
- IndexedIterator& operator = (const IndexedIterator &iter)
- {
- _r_index = iter._r_index;
- _c_index = iter._c_index;
- _dim = iter._dim;
- _begin = iter._begin;
- return *this;
- }
-
- bool operator == (const IndexedIterator &iter) const
- {
- return (_r_index == iter._r_index) &&
- (_c_index == iter._c_index) &&
- (_dim == iter._dim) &&
- (_begin==iter._begin);
- }
-
- bool operator != (const IndexedIterator& iter) const
- {
- return (_r_index != iter._r_index) ||
- (_c_index != iter._c_index) ||
- (_dim != iter._dim) ||
- (_begin!=iter._begin);
- }
-
- IndexedIterator &operator ++ ()
- {
- ++_c_index;
-
- if (_c_index == _dim) {
- _c_index = 0;
- ++_r_index;
- }
-
- return *this;
- }
-
-
- IndexedIterator operator ++ (int)
- {
- IndexedIterator tmp = *this;
- ++(*this);
- return tmp;
- }
-
- IndexedIterator &operator -- ()
- {
- if (_c_index)
- --_c_index;
- else {
- --_r_index;
- _c_index = _dim - 1;
- }
-
- return *this;
- }
-
-
- IndexedIterator operator -- (int)
- {
- IndexedIterator tmp = *this;
- --(*this);
- return tmp;
- }
-
- value_type &operator * () const
- {
- return *(_begin + (_r_index * _dim + _c_index));
- }
-
-
- value_type * operator -> () const
- {
- return _begin + (_r_index * _dim + _c_index);
- }
-
-
- size_t rowIndex () const
- {
- return _r_index;
- }
-
- size_t colIndex () const
- {
- return _c_index;
- }
-
- const value_type &value () const
- {
- return *(_begin + (_r_index * _dim + _c_index));
- }
-
-
- };
-
- template <class _Field>
- class BlasMatrix< _Field>::ConstIndexedIterator {
- size_t _r_index;
- size_t _c_index;
- size_t _dim;
- typedef typename _Field::Element value_type;
- typename Rep::const_iterator _begin;
-
- public:
- ConstIndexedIterator (const size_t &my_dim,
- const size_t &r_index,
- const size_t &c_index,
- const typename Rep::const_iterator &begin) :
- _r_index (r_index), _c_index (c_index), _dim (my_dim), _begin (begin)
- {}
-
- ConstIndexedIterator () :
- _r_index (0), _c_index (0), _dim (1), _begin (0)
- {}
-
- ConstIndexedIterator (const ConstIndexedIterator& r) :
- _r_index (r._r_index), _c_index (r._c_index), _dim (r._dim), _begin (r._begin)
- {}
-
- ConstIndexedIterator& operator = (const ConstIndexedIterator &iter)
- {
- _r_index = iter._r_index;
- _c_index = iter._c_index;
- _dim = iter._dim;
- _begin = iter._begin;
- return *this;
- }
-
- bool operator == (const ConstIndexedIterator &iter) const
- {
- return (_r_index == iter._r_index) &&
- (_c_index == iter._c_index) &&
- (_dim == iter._dim) &&
- (_begin==iter._begin);
- }
-
- bool operator != (const ConstIndexedIterator& iter) const
- {
- return (_r_index != iter._r_index) ||
- (_c_index != iter._c_index) ||
- (_dim != iter._dim) ||
- (_begin!=iter._begin);
- }
-
- ConstIndexedIterator &operator ++ ()
- {
- ++_c_index;
-
- if (_c_index == _dim) {
- _c_index = 0;
- ++_r_index;
- }
-
- return *this;
- }
-
-
- ConstIndexedIterator operator ++ (int)
- {
- ConstIndexedIterator tmp = *this;
- ++(*this);
- return tmp;
- }
-
- ConstIndexedIterator &operator -- ()
- {
- if (_c_index)
- --_c_index;
- else {
- --_r_index;
- _c_index = _dim - 1;
- }
-
- return *this;
- }
-
- ConstIndexedIterator operator -- (int)
- {
- ConstIndexedIterator tmp = *this;
- --(*this);
- return tmp;
- }
-
- const value_type &operator * () const
- {
- return *(_begin + (_r_index * _dim + _c_index));
- }
-
- const value_type *operator -> () const
- {
- return _begin + (_r_index * _dim + _c_index);
- }
-
- size_t rowIndex () const
- {
- return _r_index;
- }
-
- size_t colIndex () const
- {
- return _c_index;
- }
-
- const value_type &value() const
- {
- return *(_begin + (_r_index * _dim + _c_index));
- }
- };
-
- /* */
-
- // Entry access view. Size m*n vector in C (row major) order.
- template <class _Field>
- typename BlasMatrix< _Field>::Iterator BlasMatrix< _Field>::Begin ()
- {
- return _rep.begin ();
- }
-
- template <class _Field>
- typename BlasMatrix< _Field>::Iterator BlasMatrix< _Field>::End ()
- {
- return _rep.end ();
- }
-
- template <class _Field>
- typename BlasMatrix< _Field>::ConstIterator BlasMatrix< _Field>::Begin () const
- {
- return _rep.begin ();
- }
-
- template <class _Field>
- typename BlasMatrix< _Field>::ConstIterator BlasMatrix< _Field>::End () const
- {
- return _rep.end ();
- }
-
- /* Indexed */
-
- template <class _Field>
- typename BlasMatrix< _Field>::IndexedIterator BlasMatrix< _Field>::IndexedBegin ()
- {
- return IndexedIterator (coldim (), 0, 0, _rep.begin ());
- }
-
- template <class _Field>
- typename BlasMatrix< _Field>::IndexedIterator BlasMatrix< _Field>::IndexedEnd ()
- {
- return IndexedIterator (coldim (), rowdim (), 0, _rep.begin ());
- }
-
- template <class _Field>
- typename BlasMatrix< _Field>::ConstIndexedIterator BlasMatrix< _Field>::IndexedBegin () const
- {
- return ConstIndexedIterator (coldim (), 0, 0, _rep.begin ());
- }
-
- template <class _Field>
- typename BlasMatrix< _Field>::ConstIndexedIterator BlasMatrix< _Field>::IndexedEnd () const
- {
- return ConstIndexedIterator (coldim (), rowdim (), 0, _rep.begin ());
- }
-
- /* Row */
-
- template <class _Field>
- typename BlasMatrix< _Field>::RowIterator BlasMatrix< _Field>::rowBegin ()
- {
- return RowIterator (_rep.begin (), _col, _col);
- }
-
- template <class _Field>
- typename BlasMatrix< _Field>::RowIterator BlasMatrix< _Field>::rowEnd ()
- {
- return RowIterator (_rep.end (), _col, _col);
- }
-
- template <class _Field>
- typename BlasMatrix< _Field>::ConstRowIterator BlasMatrix< _Field>::rowBegin () const
- {
- return ConstRowIterator (_rep.begin (), _col, _col);
- }
-
- template <class _Field>
- typename BlasMatrix< _Field>::ConstRowIterator BlasMatrix< _Field>::rowEnd () const
- {
- return ConstRowIterator (_rep.end (), _col, _col);
- }
-
- /* Col */
-
- template <class _Field>
- typename BlasMatrix< _Field>::ColIterator BlasMatrix< _Field>::colBegin ()
- {
- return typename BlasMatrix< _Field>::ColIterator (_rep.begin (), _col, _row);
- }
-
- template <class _Field>
- typename BlasMatrix< _Field>::ColIterator BlasMatrix< _Field>::colEnd ()
- {
- return typename BlasMatrix< _Field>::ColIterator (_rep.begin ()+_col, _col, _row);
- }
-
- template <class _Field>
- typename BlasMatrix< _Field>::ConstColIterator BlasMatrix< _Field>::colBegin () const
- {
- return typename BlasMatrix< _Field>::ConstColIterator (_rep.begin (), _col, _row);
- }
-
- template <class _Field>
- typename BlasMatrix< _Field>::ConstColIterator BlasMatrix< _Field>::colEnd () const
- {
- return typename BlasMatrix< _Field>::ConstColIterator (_rep.begin ()+_col, _col, _row);
- }
-
- /* operators */
- template <class _Field>
- typename BlasMatrix< _Field>::Row BlasMatrix< _Field>::operator[] (size_t i)
- {
- return Row (_rep.begin () + i * _col, _rep.begin () + (i * _col +_col));
- }
-
- template <class _Field>
- typename BlasMatrix< _Field>::ConstRow BlasMatrix< _Field>::operator[] (size_t i) const
- {
- return Row (_rep.begin () + i * _col, _rep.begin () + ( i * _col + _col));
- }
-
-} // LinBox
-
-//////////////////
-// MISC //
-//////////////////
-
-namespace LinBox
-{
- template <class _Field>
- template <class Vector>
- Vector& BlasMatrix< _Field>::columnDensity (Vector &v) const
- {
- std::fill (v.begin (), v.end (), _row);
- return v;
- }
-
-} // LinBox
-
-///////////////////
-// BLACK BOX //
-///////////////////
-
-namespace LinBox
-{
- template <class _Field>
- template <class Vector1, class Vector2>
- Vector1& BlasMatrix< _Field>::apply (Vector1& y, const Vector2& x) const
- {
- //_stride ?
- if (_use_fflas){
- //!@bug this supposes &x[0]++ == &x[1]
- FFLAS::fgemv((typename Field::Father_t) _field, FFLAS::FflasNoTrans,
- _row, _col,
- _field.one,
- _ptr, getStride(),
- &x[0],1,
- _field.zero,
- &y[0],1);
- }
- else {
- _MD. vectorMul (y, *this, x);
-#if 0
- typename BlasMatrix<_Field>::ConstRowIterator i = this->rowBegin ();
- typename Vector1::iterator j = y.begin ();
-
- for (; j != y.end (); ++j, ++i)
- _VD.dot (*j, *i, x);
-#endif
- }
- return y;
- }
-
- template <class _Field>
- template <class Vector1, class Vector2>
- Vector1& BlasMatrix< _Field>::applyTranspose (Vector1& y, const Vector2& x) const
- {
-
- //_stride ?
- if (_use_fflas) {
- FFLAS::fgemv((typename Field::Father_t) _field, FFLAS::FflasTrans,
- _row, _col,
- _field.one,
- _ptr, getStride(),
- &x[0],1,
- _field.zero,
- &y[0],1);
- }
- else {
- typename BlasMatrix<_Field>::ConstColIterator i = this->colBegin ();
- typename Vector1::iterator j = y.begin ();
- for (; j != y.end (); ++j, ++i)
- _VD.dot (*j, x, *i);
- }
-
- return y;
- }
-
- template <class _Field>
- const _Field& BlasMatrix< _Field>::field() const
- {
- return _field;
- }
-
- template <class _Field>
- _Field& BlasMatrix< _Field>::field()
- {
- return const_cast<_Field&>(_field );
- }
-}
-
-
-#endif // __LINBOX_blas_matrix_INL
-
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
-// Local Variables:
-// mode: C++
-// tab-width: 8
-// indent-tabs-mode: nil
-// c-basic-offset: 8
-// End:
-
diff --git a/linbox/matrix/blas-submatrix.inl b/linbox/matrix/blas-submatrix.inl
deleted file mode 100644
index 7abbe54..0000000
--- a/linbox/matrix/blas-submatrix.inl
+++ /dev/null
@@ -1,1085 +0,0 @@
-/* linbox/matrix/blas-matrix.h
- * Copyright (C) 2004 Pascal Giorgi, Clément Pernet
- *
- * Written by :
- * Pascal Giorgi <pascal.giorgi at ens-lyon.fr>
- * Clément Pernet <clement.pernet at imag.fr>
- * Brice Boyer <bboyer at imag.fr>
- *
- * ========LICENCE========
- * This file is part of the library LinBox.
- *
- * LinBox is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- * ========LICENCE========
- */
-
-/*!@internal
- * @file matrix/blas-matrix.inl
- * @ingroup matrix
- * A \c BlasMatrix<\c _Field > represents a matrix as an array of
- * <code>_Field</code>s.
- */
-
-#ifndef __LINBOX_blas_submatrix_INL
-#define __LINBOX_blas_submatrix_INL
-
-/////////////////
-// PRIVATE //
-/////////////////
-
-namespace LinBox
-{
-}
-
-//////////////////
-// CONSTRUCTORS //
-//////////////////
-
-namespace LinBox
-{
- template <class _Field>
- BlasSubmatrix<_Field>::BlasSubmatrix () :
- _Mat(NULL),_row(0),_col(0),_r0(0),_c0(0),_stride(0),_off(0)
- {
-#ifndef NDEBUG
- std::cerr << "***Warning*** you are creating a NULL BlasSubmatrix. You are stuck with it now." << std::endl;
-#endif
- }
-
- template <class _Field>
- BlasSubmatrix<_Field>::BlasSubmatrix (const BlasMatrix<_Field> &Mat,
- size_t row,
- size_t col,
- size_t Rowdim,
- size_t Coldim) :
- _Mat (&(const_cast<BlasMatrix<Field>& >(Mat))),
- _row (Rowdim), _col(Coldim),
- _r0(row),_c0(col),
- _stride(Mat.coldim()),_off(row*_stride+col)
- {
- linbox_check ( _r0 <= Mat.rowdim() ); // allow for NULL matrix
- linbox_check ( _c0 <= Mat.coldim() );
- // linbox_check ( _row <= Mat.rowdim() );
- linbox_check ( _off <= Mat.rowdim()*Mat.coldim() );
- linbox_check ( _col <= Mat.coldim() );
- }
-
-
- template <class _Field>
- BlasSubmatrix<_Field>::BlasSubmatrix (const BlasMatrix<_Field> &Mat) :
- _Mat(&(const_cast<BlasMatrix<Field>& >(Mat))),
- _row(Mat.rowdim()), _col(Mat.coldim()),
- _r0(0), _c0(0),
- _stride(Mat.coldim()),_off(0)
- {}
-
-
-
- template <class _Field>
- BlasSubmatrix<_Field>::BlasSubmatrix (const BlasSubmatrix<_Field> &SM,
- size_t row,
- size_t col,
- size_t Rowdim,
- size_t Coldim) :
- _Mat (SM._Mat),
- _row ( Rowdim ), _col ( Coldim ) ,
- _r0 ( SM._r0 + row ), _c0 ( SM._c0 + col ),
- _stride(SM._stride),_off(SM._off+(row*_stride+col))
- {
- linbox_check ( _r0 <= SM._Mat->rowdim() ); // allow for NULL matrix
- linbox_check ( _c0 <= SM._stride );
- linbox_check ( _row <= SM._Mat->rowdim() );
- linbox_check ( _col <= SM._stride );
- linbox_check ( _off <= SM._Mat->rowdim()*(SM._Mat->coldim()+1) );
- }
-
- template <class _Field>
- BlasSubmatrix<_Field>::BlasSubmatrix (const BlasSubmatrix<_Field> &SM) :
- _Mat (SM._Mat),
- _row ( SM._row ), _col ( SM._col ) ,
- _r0 ( SM._r0 ), _c0 (SM._c0 ),
- _stride(SM._stride),_off(SM._off)
- {
- linbox_check ( _r0 <= SM._Mat->rowdim() ); // allow for NULL matrix
- linbox_check ( _c0 <= SM._stride );
- linbox_check ( _row <= SM._Mat->rowdim() );
- linbox_check ( _col <= SM._stride );
- linbox_check ( _off <= SM._Mat->rowdim()*(SM._Mat->coldim()+1) );
- }
-
- template <class _Field>
- BlasSubmatrix<_Field>& BlasSubmatrix<_Field>::operator=(const BlasSubmatrix<_Field> &SM)
- {
- if ( &SM == this)
- return *this ;
-
- _Mat = SM._Mat ;
- _r0 = SM._r0 ;
- _row = SM._row;
- _c0 = SM._c0 ;
- _col = SM._col;
- _stride = SM._stride;
- _off = SM._off ;
-
- return *this;
- }
-
-} // LinBox
-
-
-//////////////////
-// DIMENSIONS //
-//////////////////
-
-namespace LinBox
-{
-
- template <class _Field>
- size_t BlasSubmatrix< _Field>::rowdim() const
- {
- return _row ;
- }
-
- template <class _Field>
- size_t BlasSubmatrix< _Field>::coldim() const
- {
- return _col ;
- }
-
- template <class _Field>
- size_t BlasSubmatrix< _Field>::getStride() const
- {
- return _stride;
- }
-
-
-} // LinBox
-
-//////////////////
-// ELEMENTS //
-//////////////////
-
-namespace LinBox
-{
-
-
- template <class _Field>
- typename BlasSubmatrix< _Field>::pointer
- BlasSubmatrix< _Field>::getPointer() const
- {
- return _Mat->getPointer()+_off;
- }
-
- template <class _Field>
- typename BlasSubmatrix< _Field>::const_pointer &
- BlasSubmatrix< _Field>::getConstPointer() const
- {
- return _Mat->getConstPointer()+_off;
- }
-
-
- template <class _Field>
- typename BlasSubmatrix< _Field>::pointer&
- BlasSubmatrix< _Field>::getWritePointer()
- {
- return _Mat->getWritePointer()+_off;
- }
-
- template <class _Field>
- void BlasSubmatrix< _Field>::setEntry (size_t i, size_t j, const Element &a_ij)
- {
- _Mat->setEntry (_r0 + i, _c0 + j, a_ij);
- }
-
- template <class _Field>
- typename _Field:: Element &BlasSubmatrix< _Field>::refEntry (size_t i, size_t j)
- {
- return _Mat->refEntry ( _r0+i, _c0+j );
- }
-
- template <class _Field>
- const typename _Field:: Element &BlasSubmatrix< _Field>::getEntry (size_t i, size_t j) const
- {
- return _Mat->getEntry ( _r0+i , _c0+j );
- }
-
- template <class _Field>
-typename _Field:: Element &BlasSubmatrix< _Field>::getEntry (Element &x, size_t i, size_t j) const
- {
- return _Mat->getEntry (x, _r0+i , _c0+j );
- }
-
-}
-
-///////////////////
-// TRANSPOSE &AL //
-///////////////////
-
-namespace LinBox
-{
-}
-
-///////////////////
-// ITERATORS //
-///////////////////
-
-namespace LinBox
-{
-
-
- /*! Raw Iterators.
- * @ingroup iterators
- *
- * The raw iterator is a method for accessing all entries in the matrix
- * in some unspecified order. This can be used, e.g. to reduce all
- * matrix entries modulo a prime before passing the matrix into an
- * algorithm.
- */
- template <class _Field>
- class BlasSubmatrix<_Field>::Iterator {
- public:
- Iterator (){}
-
- /*! @internal
- * @brief NO DOC
- */
- Iterator (const typename BlasMatrix<_Field>::Iterator& cur,
- const size_t c_dim,
- const size_t stride,
- const size_t c_idx) :
- _cur (cur), _c_dim (c_dim), _stride(stride), _c_idx (c_idx)
- {}
-
- /*! @internal
- * @brief copy operator.
- * @param r Iterator to copy.
- */
- Iterator& operator = (const Iterator& r)
- {
- _cur = r._cur;
- _c_dim = r._c_dim;
- _stride = r._stride;
- _c_idx = r._c_idx;
- return *this;
- }
-
- /*! @internal
- * increment.
- * ??
- */
- Iterator& operator ++()
- {
- if (_c_idx < _c_dim - 1){
- ++_cur; ++_c_idx;
- }
- else {
- _cur = _cur + _stride - _c_dim + 1;
- _c_idx = 0;
- }
-
- return *this;
- }
-
- /*! @internal
- * increment.
- * ??
- */
- Iterator& operator++ (int)
- {
- return this->operator++ ();
- }
-
-
- /*! @internal
- * @brief operator !=.
- * @param r Iterator to test inequaltity from.
- */
- bool operator != (const Iterator& r) const
- {
- return (_cur != r._cur || _c_dim != r._c_dim) || (_stride != r._stride) || (_c_idx != r._c_idx);
- }
-
- //! @internal operator *.
- _Field& operator * ()
- {
- return *_cur;
- }
-
- //! @internal operator *.
- const _Field& operator * () const
- {
- return *_cur;
- }
-
- protected:
- typename BlasMatrix<_Field>::Iterator _cur;
- size_t _c_dim;
- size_t _stride;
- size_t _c_idx;
- };
-
- /*! Raw Iterators (const version).
- * @ingroup iterators
- * The raw iterator is a method for accessing all entries in the matrix
- * in some unspecified order. This can be used, e.g. to reduce all
- * matrix entries modulo a prime before passing the matrix into an
- * algorithm.
- */
- template <class _Field>
- class BlasSubmatrix<_Field>::ConstIterator {
- public:
- //! @internal Null constructor
- ConstIterator (){}
-
-
- /*! @internal
- * @brief NO DOC
- */
- ConstIterator (const typename BlasMatrix<_Field>::ConstIterator& cur,
- const size_t c_dim,
- const size_t stride,
- const size_t c_idx) :
- _cur (cur), _c_dim (c_dim), _stride(stride), _c_idx (c_idx)
- {}
-
- /*! @internal
- * @brief copy operator.
- * @param r Iterator to copy.
- */
- ConstIterator& operator = (const ConstIterator& r)
- {
- _cur = r._cur;
- _c_dim = r._c_dim;
- _stride = r._stride;
- _c_idx = r._c_idx;
- return *this;
- }
-
- /*! @internal
- * increment.
- * ??
- */
- ConstIterator& operator ++()
- {
- if (_c_idx < _c_dim - 1){
- ++_cur; ++_c_idx;
- }
- else {
- _cur = _cur + _stride - _c_dim + 1;
- _c_idx = 0;
- }
-
- return *this;
- }
-
- /*! @internal
- * increment.
- * ??
- */
- ConstIterator& operator++ (int)
- {
- return this->operator++ ();
- }
-
- /*! @internal
- * @brief operator !=.
- * @param r Iterator to test inequaltity from.
- */
- bool operator != (const ConstIterator& r) const
- {
- return (_cur != r._cur) || (_c_dim != r._c_dim) || (_stride != r._stride) || (_c_idx != r._c_idx);
- }
-
- //! @internal operator *.
- const _Field& operator * () const
- {
- return *_cur;
- }
-
- protected:
- typename BlasMatrix<_Field>::ConstIterator _cur;
- size_t _c_dim;
- size_t _stride;
- size_t _c_idx;
- };
-
-#if 0
- template <class _Field>
- class BlasSubmatrix< _Field>::ConstIterator {
- public:
- ConstIterator (){}
-
- ConstIterator ( const typename BlasMatrix< _Field>::ConstIterator& cur,
- size_t cont_len,
- size_t gap_len) :
- _beg (beg), _cur (cur), _cont_len (cont_len), _gap_len (gap_len)
- {}
-
- ConstIterator& operator = (const Iterator& r)
- {
- _cur = r._cur;
- _beg = r._beg;
- _cont_len = r._cont_len;
- _gap_len = r._gap_len;
- return *this;
- }
-
- ConstIterator& operator = (const ConstIterator& r)
- {
- _cur = r._cur;
- _beg = r._beg;
- _cont_len = r._cont_len;
- _gap_len = r._gap_len;
- return *this;
- }
-
- ConstIterator& operator++()
- {
- if (((_cur - _beg + 1) % _cont_len) != 0)
- ++_cur;
- else {
- _cur = _cur + _gap_len + 1;
- _beg = _beg + _gap_len + _cont_len;
- }
- return *this;
- }
-
- ConstIterator operator++(int)
- {
- ConstIterator tmp = *this;
- this->operator++();
- return tmp;
- }
-
- bool operator != (const ConstIterator& r) const
- {
- return (_cur != r._cur) || (_beg != r._beg) || (_cont_len != r._cont_len) || (_gap_len != r._gap_len);
- }
-
- const _Field& operator*()
- { return *_cur; }
-
- _Field& operator*()
- { return *_cur; }
-
- const _Field& operator*() const
- { return *_cur; }
-
- protected:
- typename BlasMatrix< _Field>::ConstIterator _beg;
- typename BlasMatrix< _Field>::ConstIterator _cur;
- size_t _cont_len;
- size_t _gap_len;
- };
-#endif
-
- template <class _Field>
- typename BlasSubmatrix<_Field>::Iterator BlasSubmatrix<_Field>::Begin ()
- {
- return Iterator (_Mat->Begin () + ( _off ),
- _col, _stride, 0);
- }
-
- template <class _Field>
- typename BlasSubmatrix<_Field>::Iterator BlasSubmatrix<_Field>::End ()
- {
- return Iterator (_Mat->Begin () + ( (_row) * _stride + _off ),
- _col, _stride, 0);
- }
-
- template <class _Field>
- typename BlasSubmatrix<_Field>::ConstIterator BlasSubmatrix<_Field>::Begin () const
- {
- return ConstIterator (_Mat->Begin () + ( _off ),
- _col, _stride, 0);
- }
-
- template <class _Field>
- typename BlasSubmatrix<_Field>::ConstIterator BlasSubmatrix<_Field>::End () const
- {
- return ConstIterator (_Mat->Begin () + ( (_row) * _stride + _off ),
- _col, _stride, 0);
- }
-
-#if 0
- template <class _Field>
- typename BlasSubmatrix< _Field>::ConstIterator BlasSubmatrix< _Field>::Begin () const
- {
- return ConstIterator (_Mat->Begin () + ( _off ),
- _Mat->Begin () + ( _off ),
- _col, _stride - _col);
- }
-
- template <class _Field>
- typename BlasSubmatrix< _Field>::ConstIterator BlasSubmatrix< _Field>::End () const
- {
- return ConstIterator (_Mat->Begin () + ( (_row) * _stride + _off ),
- _Mat->Begin () + ( (_row) * _stride + _off ),
- _col, _stride - _col);
- }
-#endif
-
- /*! Raw Indexed Iterator.
- * @ingroup iterators
- *
- * Like the raw iterator, the indexed iterator is a method for
- * accessing all entries in the matrix in some unspecified order.
- * At each position of the the indexed iterator, it also provides
- * the row and column indices of the currently referenced entry.
- * This is provided through it's \c rowIndex() and \c colIndex() functions.
- */
- template <class _Field>
- class BlasSubmatrix<_Field>::IndexedIterator {
- public:
- IndexedIterator (){}
-
- IndexedIterator (const typename BlasMatrix<_Field>::Iterator& cur,
- size_t c_dim,
- size_t stride,
- size_t r_idx,
- size_t c_idx) :
- _cur (cur), _c_dim (c_dim), _stride (stride), _r_idx(r_idx), _c_idx (c_idx)
- {}
-
- IndexedIterator& operator = (const IndexedIterator& r)
- {
- _cur = r._cur;
- _stride = r._stride;
- _c_dim = r._c_dim;
- _r_idx = r._r_idx;
- _c_idx = r._c_idx;
- return *this;
- }
-
- IndexedIterator& operator++()
- {
- if (_c_idx < _c_dim - 1){
- ++_c_idx;
- ++_cur;
- }
- else {
- _cur = _cur + _stride - _c_dim + 1;
- _c_idx = 0;
- ++_r_idx;
- }
- return *this;
- }
-
- IndexedIterator& operator--()
- {
- if (_c_idx > 0){
- --_c_idx;
- --_cur;
- }
- else {
- _cur = _cur - _stride + _c_dim -1;
- _c_idx = 0;
- --_r_idx;
- }
- return *this;
- }
-
- IndexedIterator operator++(int)
- {
- IndexedIterator tmp = *this;
- this->operator++();
- return tmp;
- }
-
- IndexedIterator operator--(int)
- {
- IndexedIterator tmp = *this;
- this->operator--();
- return tmp;
- }
-
- bool operator != (const IndexedIterator& r) const
- {
- return ((_c_idx != r._c_idx) || (_r_idx != r._r_idx) ||(_stride != r._stride) || (_c_dim != r._c_dim) );
- }
-
- const _Field& operator*() const {return *_cur;}
-
- _Field& operator*() {return *_cur;}
-
- size_t rowIndex () const { return _r_idx; }
-
- size_t colIndex () const { return _c_idx; }
-
- const _Field& value () const {return *_cur;}
-
- protected:
- typename BlasMatrix<_Field>::Iterator _cur;
- size_t _stride;
- size_t _c_dim;
- size_t _r_idx;
- size_t _c_idx;
- };
-
- template <class _Field>
- typename BlasSubmatrix<_Field>::IndexedIterator BlasSubmatrix<_Field>::IndexedBegin ()
- {
- return IndexedIterator (_Mat->Begin () + ( (_off) ),
- _col , _stride, 0, 0);
- }
-
- template <class _Field>
- typename BlasSubmatrix<_Field>::IndexedIterator BlasSubmatrix<_Field>::IndexedEnd ()
- {
- return IndexedIterator (_Mat->Begin () + ( (_row) * _stride + (_col+_off) ),
- _col, _stride, _row-1, _col-1);
- }
-
- /*! Raw Indexed Iterator (const version).
- * @ingroup iterators
- *
- * Like the raw iterator, the indexed iterator is a method for
- * accessing all entries in the matrix in some unspecified order.
- * At each position of the the indexed iterator, it also provides
- * the row and column indices of the currently referenced entry.
- * This is provided through it's \c rowIndex() and \c colIndex() functions.
- */
- template <class _Field>
- class BlasSubmatrix<_Field>::ConstIndexedIterator {
- public:
- ConstIndexedIterator (){}
-
- ConstIndexedIterator (const typename BlasMatrix<_Field>::ConstIterator& cur,
- size_t c_dim,
- size_t stride,
- size_t r_idx,
- size_t c_idx) :
- _cur (cur), _stride (stride), _c_dim (c_dim), _r_idx(r_idx), _c_idx (c_idx)
- {}
-
- ConstIndexedIterator& operator = (const IndexedIterator& r)
- {
- _cur = r._cur;
- _stride = r._stride;
- _c_dim = r._c_dim;
- _r_idx = r._r_idx;
- _c_idx = r._c_idx;
- return *this;
- }
-
- ConstIndexedIterator& operator = (const ConstIndexedIterator& r)
- {
- _cur = r._cur;
- _stride = r._stride;
- _c_dim = r._c_dim;
- _r_idx = r._r_idx;
- _c_idx = r._c_idx;
- return *this;
- }
-
- ConstIndexedIterator& operator++()
- {
- if (_c_idx < _c_dim - 1){
- ++_c_idx;
- ++_cur;
- }
- else {
- _cur = _cur + _stride - _c_dim +1;
- _c_idx = 0;
- ++_r_idx;
- }
- return *this;
- }
-
- IndexedIterator& operator--()
- {
- if (_c_idx > 0){
- --_c_idx;
- --_cur;
- }
- else {
- _cur = _cur - _stride + _c_dim -1;
- _c_idx = 0;
- --_r_idx;
- }
- return *this;
- }
-
- ConstIndexedIterator operator++(int)
- {
- ConstIndexedIterator tmp = *this;
- this->operator++();
- return tmp;
- }
-
- ConstIndexedIterator operator--(int)
- {
- ConstIndexedIterator tmp = *this;
- this->operator--();
- return tmp;
- }
-
- size_t rowIndex () const
- {
- return _r_idx;
- }
-
- size_t colIndex () const
- {
- return _c_idx;
- }
-
- bool operator != (const ConstIndexedIterator& r) const
- {
- return ((_c_idx != r._c_idx) || (_r_idx != r._r_idx) ||(_stride != r._stride) || (_c_dim != r._c_dim) );
- }
-
- const _Field& operator*() const
- {
- return *_cur;
- }
-
-
- friend std::ostream& operator<<(std::ostream& out, const ConstIndexedIterator m)
- {
- return out /* << m._cur << ' ' */
- << m._stride << ' '
- << m._c_dim << ' '
- << m._r_idx << ' '
- << m._c_idx;
- }
-
- const _Field & value() const
- {
- return this->operator*();
-
- }
-
- protected:
- typename BlasMatrix<_Field>::ConstIterator _cur;
- size_t _stride;
- size_t _c_dim;
- size_t _r_idx;
- size_t _c_idx;
- };
-
- template <class _Field>
- typename BlasSubmatrix<_Field>::ConstIndexedIterator BlasSubmatrix<_Field>::IndexedBegin () const
- {
- return ConstIndexedIterator (_Mat->Begin () + ( _off ),
- _row, _stride, 0, 0);
- }
-
- template <class _Field>
- typename BlasSubmatrix<_Field>::ConstIndexedIterator BlasSubmatrix<_Field>::IndexedEnd () const
- {
- return ConstIndexedIterator (_Mat->Begin () + ( (_row) * _stride + (_off+_col) ),
- _col, _stride, _row-1, _col-1);
- }
-
- ////////
- template <class _Field>
- typename BlasSubmatrix<_Field>::RowIterator BlasSubmatrix<_Field>::rowBegin ()
- {
- return RowIterator (_Mat->Begin () + ( _off ),
- _col, _stride);
- }
-
- template <class _Field>
- typename BlasSubmatrix<_Field>::RowIterator BlasSubmatrix<_Field>::rowEnd ()
- {
- return RowIterator (_Mat->Begin () + ( (_row) * _stride + _off ),
- _col, _stride);
- }
-
- template <class _Field>
- typename BlasSubmatrix<_Field>::ConstRowIterator BlasSubmatrix<_Field>::rowBegin () const
- {
- return ConstRowIterator (_Mat->Begin () + ( _off ),
- _col, _stride);
- }
-
- template <class _Field>
- typename BlasSubmatrix<_Field>::ConstRowIterator BlasSubmatrix<_Field>::rowEnd () const
- {
- return ConstRowIterator (_Mat->Begin () + ( (_row) * _stride + _off ),
- _col, _stride);
- }
-
- template <class _Field>
- typename BlasSubmatrix<_Field>::ColIterator BlasSubmatrix<_Field>::colBegin ()
- {
- return ColIterator (_Mat->Begin () + ( _off ),
- _stride, _row);
- }
-
- template <class _Field>
- typename BlasSubmatrix<_Field>::ColIterator BlasSubmatrix<_Field>::colEnd ()
- {
- return ColIterator (_Mat->Begin () + ( (_col) + _off ),
- _stride, _row);
- }
-
- template <class _Field>
- typename BlasSubmatrix<_Field>::ConstColIterator BlasSubmatrix<_Field>::colBegin () const
- {
- return ConstColIterator (_Mat->Begin () + ( _off ),
- _stride, _row);
- }
-
- template <class _Field>
- typename BlasSubmatrix<_Field>::ConstColIterator BlasSubmatrix<_Field>::colEnd () const
- {
- return ConstColIterator (_Mat->Begin () + ( (_col) + _off ),
- _stride, _row);
- }
-
- /* operators */
- template <class _Field>
- typename BlasSubmatrix< _Field>::Row BlasSubmatrix< _Field>::operator[] (size_t i)
- {
- return Row (_Mat->Begin () + (_r0+i) * _stride, _Mat->Begin () + ((_r0+i) * _stride + _stride) );
- }
-
- template <class _Field>
- typename BlasSubmatrix< _Field>::ConstRow BlasSubmatrix< _Field>::operator[] (size_t i) const
- {
- return Row (_Mat->Begin () + (_r0+i) * _stride, _Mat->Begin () + ((_r0+i) * _stride + _stride) );
- }
-
-} // LinBox
-
-///////////////////
-// I/O //
-///////////////////
-
-namespace LinBox
-{
-
- template <class _Field>
- std::istream& BlasSubmatrix< _Field>::read (std::istream &file)
- {
-#if 0
- Iterator p;
- int m,n;
- char c;
- file>>m>>n>>c;
-
- if (m*n < _row*_col)
- cerr<<"NOT ENOUGH ELEMENT TO READ\n";
- else {
- for (p = Begin (); p != End (); ++p) {
- integer tmp;
- file>>tmp;cout<<tmp<<endl;
- //file.ignore(1);
- _Mat->_field.read (file, *p);
- }
- }
-#endif
-
-
- Iterator p;
- int m,n;
- char c;
- file>>m>>n>>c;
- // std::cout << m << 'x' << n << ':' << c << std::endl;
- _row = m; _col = n;
-
- _Field zero;
- _Mat->_field.init(zero,0UL);
- // resize(_row,_col);
-
- if ((c != 'M') && (c != 'm')) {
- for (p = Begin (); p != End (); ++p) {
- //file.ignore(1);
- _Mat->_field.read (file, *p);
- }
-
- }
- else { // sparse file format - needs fixing
- int i, j;
- while (true)
- {
- file >> i >> j;
- //file.ignore(1);
- //if (! file) break;
- if (i+j <= 0) break;
- // std::cout << i << ',' << j << ':' ;
- _Mat->_field.read (file, _Mat->refEntry(i-1, j-1));
- }
- }
-
- return file;
- }
-
- template <class _Field>
- std::ostream &BlasSubmatrix< _Field>::write (std::ostream &os,
- enum LinBoxTag::Format f) const
- {
-
- ConstRowIterator p;
- switch(f) {
- case (LinBoxTag::FormatPlain) : /* raw output */
- {
- integer c;
- int wid;
-
-
-
-
- _Mat->_field.cardinality (c);
-
- if (c >0)
- wid = (int) ceil (log ((double) c) / M_LN10);
- else {
- integer tmp;
- size_t max=0;
- ConstIterator it = Begin();
- for (; it != End(); ++it){
- _Mat->_field.convert(tmp,*it);
- if (tmp.bitsize() > max)
- max= tmp.bitsize();
- }
- wid= (int) ceil ((double)max / M_LN10)+1;
- }
-
- for (p = rowBegin (); p != rowEnd ();++p) {
- typename ConstRow::const_iterator pe;
-
- os << " [ ";
-
- for (pe = p->begin (); pe != p->end (); ++pe) {
- os.width (wid);
- /*! @warning
- * matrix base does not provide this field(), maybe should?
- * _Mat.field ().write (os, *pe);
- * os << *pe;
- * fixed by using extra field
- */
-
- _Mat->_field.write (os, *pe);
- os << " ";
- }
-
- os << "]" << std::endl;
- }
- }
- break;
- case (LinBoxTag::FormatMaple) : /* maple format */
- {
-
- os << "Matrix( " << rowdim() << ',' << coldim() << ",[" ;
- for (p = rowBegin (); p != rowEnd (); ) {
- typename ConstRow::const_iterator pe;
-
- os << " [ ";
-
- for (pe = p->begin (); pe != p->end (); ) {
- _Mat->_field.write (os, *pe);
- ++pe ;
- if (pe != p->end())
- os << ", ";
- }
-
- os << "]" ;
- ++p ;
- if (p != rowEnd() )
- os << ',' << std::endl;;
-
- }
- os << "])" ;
- }
- break;
- case (LinBoxTag::FormatHTML) : /* HTML format */
- {
-
- os << "<table border=\"1\">" ;
- for (p = rowBegin (); p != rowEnd (); ) {
- typename ConstRow::const_iterator pe;
-
- os << "<tr>";
-
- for (pe = p->begin (); pe != p->end (); ) {
- _Mat->_field.write (os<< "<td>", *pe)<<"</td>";
- ++pe ;
- }
-
- os << "</tr>" << std::endl;
- ++p ;
-
- }
- os << "</table>" ;
- }
- break;
- case (LinBoxTag::FormatLaTeX) : /* LaTex format */
- {
- os << "\\begin{pmatrix} " << std::endl;
- for (p = rowBegin (); p != rowEnd (); ) {
- typename ConstRow::const_iterator pe;
-
- for (pe = p->begin (); pe != p->end (); ) {
- _Mat->_field.write (os, *pe);
- ++pe ;
- if (pe != p->end())
- os << "& ";
- }
-
- os << "\\\\" << std::endl;
- ++p ;
-
- }
- os << "\\end{pmatrix}" ;
- }
- break;
- default : /* this is an error */
- {
- throw LinBoxError("unknown format to write matrix in");
- }
- }
-
- return os;
- }
-
- template <class _Field>
- template<typename _Tp1>
- struct BlasSubmatrix< _Field>::rebind {
- typedef BlasMatrix<_Tp1> other;
-
- void operator() (other & Ap, const Self_t& A) {
- typedef typename BlasSubmatrix<_Field>::ConstIterator ConstSelfIterator ;
- typedef typename other::Iterator OtherIterator ;
- OtherIterator Ap_i;
- ConstSelfIterator A_i;
- Hom<Field, _Tp1> hom(A. field(), Ap. field());
- for (A_i = A. Begin(), Ap_i = Ap.Begin();
- A_i != A. End(); ++ A_i, ++ Ap_i)
- hom.image (*Ap_i, *A_i);
- }
- };
-
-} // LinBox
-
-//////////////////
-// MISC //
-//////////////////
-
-namespace LinBox
-{
-} // LinBox
-#endif // __LINBOX_blas_submatrix_INL
-
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
-// Local Variables:
-// mode: C++
-// tab-width: 8
-// indent-tabs-mode: nil
-// c-basic-offset: 8
-// End:
-
diff --git a/linbox/matrix/blas-triangularmatrix.inl b/linbox/matrix/blas-triangularmatrix.inl
deleted file mode 100644
index 0bae2cd..0000000
--- a/linbox/matrix/blas-triangularmatrix.inl
+++ /dev/null
@@ -1,144 +0,0 @@
-/* linbox/matrix/blas-matrix.h
- * Copyright (C) 2004 Pascal Giorgi, Clément Pernet
- *
- * Written by :
- * Pascal Giorgi <pascal.giorgi at ens-lyon.fr>
- * Clément Pernet <clement.pernet at imag.fr>
- * Brice Boyer <bboyer at imag.fr>
- *
- * ========LICENCE========
- * This file is part of the library LinBox.
- *
- * LinBox is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- * ========LICENCE========
- */
-
-/*!@internal
- * @file matrix/blas-matrix.inl
- * @ingroup matrix
- * A \c BlasMatrix<\c _Field > represents a matrix as an array of
- * <code>_Field</code>s.
- */
-
-#ifndef __LINBOX_blas_triangularmatrix_INL
-#define __LINBOX_blas_triangularmatrix_INL
-namespace LinBox
-{
- template<class _Field>
- TriangularBlasMatrix<_Field>::TriangularBlasMatrix (const _Field & F, const size_t m, const size_t n,
- LinBoxTag::Shape x,
- LinBoxTag::Diag y) :
- BlasMatrix<_Field>(F, m, n ) , _uplo(x), _diag(y)
- {}
-
- template<class _Field>
- TriangularBlasMatrix<_Field>::TriangularBlasMatrix (const BlasMatrix<_Field>& A,
- LinBoxTag::Shape x,
- LinBoxTag::Diag y) :
- BlasMatrix<_Field>(A) , _uplo(x), _diag(y)
- {}
-
- template<class _Field>
- TriangularBlasMatrix<_Field>::TriangularBlasMatrix (BlasMatrix<_Field>& A,
- LinBoxTag::Shape x,
- LinBoxTag::Diag y) :
- BlasMatrix<_Field>(A), _uplo(x), _diag(y)
- {}
-
- template<class _Field>
- TriangularBlasMatrix<_Field>::TriangularBlasMatrix (const TriangularBlasMatrix<_Field>& A) :
- BlasMatrix<_Field>(A.field(), A.rowdim(),A.coldim()), _uplo(A._uplo), _diag(A._diag)
- {
- switch (A._uplo) {
- case LinBoxTag::Upper:
- {
- for (size_t i=0;i<A.rowdim();++i)
- for (size_t j=i;j<A.coldim();++j)
- this->setEntry(i,j,A.getEntry(i,j));
- break;
- }
- case LinBoxTag::Lower:
- {
- for (size_t i=0;i<A.rowdim();++i) {
- for (size_t j=0;j<=i;++j)
- this->setEntry(i,j,A.getEntry(i,j));
- }
-
- break;
- }
- default:
- throw LinboxError ("Error in copy constructor of TriangularBlasMatrix (incorrect argument)");
- }
- }
-
- template<class _Field>
- template<class Matrix>
- TriangularBlasMatrix<_Field>::TriangularBlasMatrix (const Matrix& A,
- LinBoxTag::Shape x,
- LinBoxTag::Diag y) :
- BlasMatrix<_Field>(A.field(),A.rowdim(),A.coldim()), _uplo(x), _diag(y)
- {
- switch (x) {
- case LinBoxTag::Upper:
- {
- for (size_t i=0;i<A.rowdim();++i){
- for (size_t j=i;j<A.coldim();++j) {
- Element tmp = A.getEntry(i,j) ;
- this->setEntry(i,j,tmp);
- }
- }
- break;
- }
- case LinBoxTag::Lower:
- {
- for (size_t i=0;i<A.rowdim();++i) {
- for (size_t j=0;j<=i;++j) {
- Element tmp = A.getEntry(i,j);
- this->setEntry(i,j,tmp);
- }
- }
-
- break;
- }
- default:
- throw LinboxError ("Error in copy constructor of TriangularBlasMatrix (incorrect argument)");
- }
- }
-
- template<class _Field>
- LinBoxTag::Shape TriangularBlasMatrix<_Field>::getUpLo() const
- {
- return _uplo;
- }
-
- template<class _Field>
- LinBoxTag::Diag TriangularBlasMatrix<_Field>::getDiag() const
- {
- return _diag;
- }
-
-}
-#endif // __LINBOX_blas_triangularmatrix_INL
-
-
-
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
-// Local Variables:
-// mode: C++
-// tab-width: 8
-// indent-tabs-mode: nil
-// c-basic-offset: 8
-// End:
-
diff --git a/linbox/matrix/dense-matrix.doxy b/linbox/matrix/dense-matrix.doxy
new file mode 100644
index 0000000..e6c22bb
--- /dev/null
+++ b/linbox/matrix/dense-matrix.doxy
@@ -0,0 +1,32 @@
+// Copyright 2014 LinBox. See COPYING for licence information.
+/*
+ * Written by Brice Boyer (briceboyer) <boyer.brice at gmail.com>
+
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ * ========LICENCE========
+ */
+
+/** \ingroup matrix
+ * \defgroup densematrix Dense Matrix
+ * \brief These are dense matrix reprensentations
+ *
+ * NO DOC YET
+ *
+ */
+
+// vim:syn=doxygen
diff --git a/linbox/matrix/dense-matrix.h b/linbox/matrix/dense-matrix.h
new file mode 100644
index 0000000..b352f5c
--- /dev/null
+++ b/linbox/matrix/dense-matrix.h
@@ -0,0 +1,190 @@
+/* linbox/matrix/dense-matrix.h
+ * Copyright (C) 2014 the LinBox
+ *
+ * Written by :
+ * Brice Boyer (briceboyer) <boyer.brice at gmail.com>
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ * ========LICENCE========
+ */
+
+/*! @file matrix/dense-matrix.h
+ * @ingroup densematrix
+ * @brief NODOC
+ */
+
+#ifndef __LINBOX_matrix_dense_matrix_H
+#define __LINBOX_matrix_dense_matrix_H
+
+
+//! @bug those are not just traits:
+#include "linbox/linbox-config.h"
+#include "linbox/vector/vector-traits.h"
+#include "linbox/matrix/matrix-traits.h"
+
+namespace LinBox { /* forward declarations */
+
+ template <class _Field, class _blasRep=typename Vector<_Field>::Dense >
+ class BlasMatrix ;
+
+ template <class _Field>
+ using DenseMatrix = BlasMatrix<_Field> ;
+
+ template<class _Matrix>
+ class BlasSubmatrix ;
+
+ template <class _Field>
+ using DenseSubmatrix = BlasSubmatrix<DenseMatrix<_Field> > ;
+
+ template <class _Field, class _Storage=typename Vector<_Field>::Dense >
+ class TriangularBlasMatrix ;
+
+ template <class _Field>
+ using TriangularMatrix = TriangularBlasMatrix<_Field> ;
+
+ /*! Write a matrix to a stream.
+ * The \c C++ way using <code>operator<< </code>
+ * @param o output stream
+ * @param Mat matrix to write.
+ */
+ template <class _Field, class _Storage>
+ std::ostream& operator<< (std::ostream & os, const BlasMatrix<_Field,_Storage> & Mat)
+ {
+ return Mat.write(os);
+ }
+
+ template <class _Matrix>
+ std::ostream& operator<< (std::ostream & os, const BlasSubmatrix<_Matrix> & Mat)
+ {
+ return Mat.write(os);
+ }
+
+}
+
+#include "linbox/matrix/densematrix/blas-matrix.h"
+// #include "linbox/matrix/densematrix/blas-matrix-multimod.h"
+// #include "linbox/matrix/densematrix/m4ri-matrix.h"
+
+namespace LinBox { /* MatrixContainerTrait */
+
+
+ template <class Field, class Rep>
+ class MatrixContainerTrait<BlasMatrix<Field,Rep> > {
+ public:
+ typedef MatrixContainerCategory::BlasContainer Type;
+ };
+
+ template <class Field, class Rep>
+ class MatrixContainerTrait<const BlasMatrix<Field,Rep> > {
+ public:
+ typedef MatrixContainerCategory::BlasContainer Type;
+ };
+
+ template <class _Matrix>
+ class MatrixContainerTrait<BlasSubmatrix<_Matrix> > {
+ public:
+ typedef MatrixContainerCategory::BlasContainer Type;
+ };
+
+ template <class _Matrix>
+ class MatrixContainerTrait<const BlasSubmatrix<_Matrix> > {
+ public:
+ typedef MatrixContainerCategory::BlasContainer Type;
+ };
+
+} // LinBox
+
+namespace LinBox { /* MatrixTraits */
+
+ template <class _Field, class _Rep>
+ struct MatrixTraits< BlasMatrix<_Field,_Rep> > {
+ typedef BlasMatrix<_Field,_Rep> MatrixType;
+ typedef typename MatrixCategories::RowColMatrixTag MatrixCategory;
+ };
+
+ template <class _Field, class _Rep>
+ struct MatrixTraits< const BlasMatrix<_Field,_Rep> > {
+ typedef const BlasMatrix<_Field,_Rep> MatrixType;
+ typedef typename MatrixCategories::RowColMatrixTag MatrixCategory;
+ };
+
+ template <class _Matrix>
+ struct MatrixTraits< BlasSubmatrix<_Matrix> > {
+ typedef BlasSubmatrix<_Matrix> MatrixType;
+ typedef typename MatrixCategories::RowColMatrixTag MatrixCategory;
+ };
+
+ template <class _Matrix>
+ struct MatrixTraits< const BlasSubmatrix<_Matrix> > {
+ typedef const BlasSubmatrix<_Matrix> MatrixType;
+ typedef typename MatrixCategories::RowColMatrixTag MatrixCategory;
+ };
+
+}
+
+namespace LinBox { /* MatrixHomTrait */
+
+ //non working partial specialisation
+ // template <class Ring, class Field, class _Rep>
+ // struct MatrixHomTrait<BlasMatrix<Ring, _Rep>, Field> {
+ // typedef BlasMatrix<Field,_Rep> value_type;
+ // };
+
+ template <class Ring, class Field>
+ struct MatrixHomTrait<BlasMatrix<Ring, typename Vector<Ring>::Dense >, Field> {
+ typedef BlasMatrix<Field,typename Vector<Field>::Dense > value_type;
+ };
+
+
+}
+
+namespace LinBox { /* IndexedCategory */
+
+ //! @bug this is trait, not a Category
+ template<class Field, class _Rep>
+ struct IndexedCategory< BlasMatrix<Field,_Rep> > {
+ typedef IndexedTags::HasIndexed Tag;
+ };
+
+} // LinBox
+
+namespace LinBox { /* ContainerTraits */
+
+ // this could also be a member of BlasVector
+ template<class _Field, class _Rep>
+ struct ContainerTraits<BlasMatrix<_Field,_Rep> > {
+ typedef ContainerCategories::Matrix ContainerCategory ;
+ };
+
+ template<class _Matrix>
+ struct ContainerTraits<BlasSubmatrix<_Matrix> > {
+ typedef ContainerCategories::Matrix ContainerCategory ;
+ };
+
+}
+
+#endif // __LINBOX_matrix_dense_matrix_H
+
+
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/matrix/dense-rows-matrix.h b/linbox/matrix/dense-rows-matrix.h
deleted file mode 100644
index 329aedf..0000000
--- a/linbox/matrix/dense-rows-matrix.h
+++ /dev/null
@@ -1,264 +0,0 @@
-/* linbox/matrix/dense-rows-matrix.h
- * Copyright (C) 2003 Bradford Hovinen
- *
- * Written by Bradford Hovinen <bghovinen at math.uwaterloo.ca>
- *
- * --------------------------------------------------------
- *
- *
- * ========LICENCE========
- * This file is part of the library LinBox.
- *
- * LinBox is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- * ========LICENCE========
- *.
- */
-
-#ifndef __LINBOX_dense_rows_matrix_H
-#define __LINBOX_dense_rows_matrix_H
-
-#include <vector>
-#include <utility>
-#include <iostream>
-#include <algorithm>
-
-#include "linbox/blackbox/factory.h"
-#include "linbox/vector/vector-traits.h"
-#include "linbox/util/debug.h"
-#include "linbox/matrix/matrix-domain.h"
-
-namespace LinBox
-{
-
- /** @brief Dense row-wise matrix container
- *
- * This class implements a dense matrix, storing the data as a vector of vectors
- * of the given type, in the same manner as @ref SparseMatrixBase. It provides
- * only row iterators.
- *
- * @param Vector Row vector type
- */
- template <class _Row>
- class DenseRowsMatrix {
- public:
-
- typedef _Row Row;
- typedef typename Row::value_type Element;
- typedef typename std::vector<Row> Rep;
-
- /** Constructor.
- * Note: the copy constructor and operator= will work as intended
- * because of STL's container design
- * @param m row dimension
- * @param n column dimension
- */
- DenseRowsMatrix (size_t m, size_t n);
-
- /** Copy constructor.
- */
- DenseRowsMatrix (const DenseRowsMatrix &A) :
- _Mat (A._Mat), _m (A._m), _n (A._n)
- {}
-
- /** Destructor. */
- ~DenseRowsMatrix () {}
-
- /** Retreive row dimension of the matrix.
- * @return integer number of rows of DenseRowsMatrix matrix.
- */
- size_t rowdim () const { return _m; }
-
- /** Retreive column dimension of matrix.
- * @return integer number of columns of DenseRowsMatrix matrix.
- */
- size_t coldim () const { return _n; }
-
- /** @name Input and output
- */
- //@{
-
- /** Read a matrix from the given input stream using field read/write
- * @param is Input stream from which to read the matrix
- * @param F Field with which to read
- */
- template <class Field>
- std::istream &read (std::istream &is, const Field &F);
-
- /** Read a matrix from the given input stream using standard operators
- * @param is Input stream from which to read the matrix
- */
- std::istream &read (std::istream &is);
-
- /** Write a matrix to the given output stream using field read/write
- * @param os Output stream to which to write the matrix
- * @param F Field with which to write
- */
- template <class Field>
- std::ostream &write (std::ostream &os, const Field &F) const;
-
- /** Write a matrix to the given output stream using standard operators
- * @param os Output stream to which to write the matrix
- */
- std::ostream &write (std::ostream &os) const;
-
- //@}
-
- /** @name Access to matrix elements
- */
- //@{
-
- /** Set an individual entry
- * Setting the entry to 0 will remove it from the matrix
- * @param i Row index of entry
- * @param j Column index of entry
- * @param value Value of the new entry
- */
- void setEntry (size_t i, size_t j, const Element &value)
- { _Mat[i][j] = value; }
-
- /** Get a writeable reference to an entry in the matrix
- * If there is no entry at the position (i, j), then a new entry
- * with a value of zero is inserted and a reference to it is
- * returned.
- * @param i Row index of entry
- * @param j Column index of entry
- * @return Reference to matrix entry
- */
- Element &refEntry (size_t i, size_t j)
- { return _Mat[i][j]; }
-
- /** Get a read-only individual entry from the matrix
- * @param i Row index
- * @param j Column index
- * @return Const reference to matrix entry
- */
- const Element &getEntry (size_t i, size_t j) const
- { return _Mat[i][j]; }
-
- /** Get an entry and store it in the given value
- * This form is more in the Linbox style and is provided for interface
- * compatibility with other parts of the library
- * @param x Element in which to store result
- * @param i Row index
- * @param j Column index
- * @return Reference to x
- */
- Element &getEntry (Element &x, size_t i, size_t j) const
- { return x = _Mat[i][j]; }
-
- /** @name Columns of rows iterator
- * The columns of row iterator gives each of the rows of the
- * matrix in ascending order. Dereferencing the iterator yields
- * a row vector in sparse sequence format
- */
-
- typedef typename Rep::iterator RowIterator;
- typedef typename Rep::const_iterator ConstRowIterator;
-
- ///
- RowIterator rowBegin () { return _Mat.begin (); }
- ///
- RowIterator rowEnd () { return _Mat.end (); }
- ///
- ConstRowIterator rowBegin () const { return _Mat.begin (); }
- ///
- ConstRowIterator rowEnd () const { return _Mat.end (); }
-
- /** @name Raw iterator
- * The raw iterator is a method for accessing all nonzero
- * entries in the matrix in some unspecified order. This can be
- * used, e.g. to reduce all matrix entries modulo a prime before
- * passing the matrix into an algorithm.
- */
-
- ///
- class Iterator;
- ///
- class ConstIterator;
-
- /// Begin
- Iterator Begin ();
- /// End
- Iterator End ();
- /// const Begin
- ConstIterator Begin () const;
- /// const End
- ConstIterator End () const;
-
- /** @name Index iterator
- * The index iterator gives the row, column indices of all matrix
- * elements in the same order as the raw iterator above. Its value type
- * is an STL pair with the row and column indices, starting at 0, in the
- * first and second positions, respectively.
- */
-
- /// IndexedIterator
- class IndexedIterator;
- /// ConstIndexedIterator
- class ConstIndexedIterator;
-
- /// IndexedBegin
- IndexedIterator IndexedBegin ();
- /// IndexedEnd
- IndexedIterator IndexedEnd ();
- /// const IndexedBegin
- ConstIndexedIterator IndexedBegin () const;
- /// const IndexedEnd
- ConstIndexedIterator IndexedEnd () const;
-
- /** Retrieve a row as a writeable reference
- * @param i Row index
- */
- Row &getRow (size_t i)
- { return _Mat[i]; }
-
- /** Construct the transpose of this matrix and place it in the
- * DenseRowsMatrix given.
- * @param AT
- */
- DenseRowsMatrix &transpose (DenseRowsMatrix &AT) const;
-
- //@}
-
- protected:
-
- friend class SparseMatrixWriteHelper<Element, Row>;
- friend class SparseMatrixReadWriteHelper<Element, Row>;
-
- Rep _Mat;
- size_t _m;
- size_t _n;
- };
-
- template <class Row>
- struct MatrixTraits< DenseRowsMatrix<Row> >
- {
- typedef DenseRowsMatrix<Row> MatrixType;
- typedef typename MatrixCategories::RowMatrixTag<MatrixTraits<MatrixType> > MatrixCategory;
- };
-
-} // namespace LinBox
-
-#endif // __LINBOX_dense_rows_matrix_H
-
-
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
-// Local Variables:
-// mode: C++
-// tab-width: 8
-// indent-tabs-mode: nil
-// c-basic-offset: 8
-// End:
-
diff --git a/linbox/matrix/densematrix/Makefile.am b/linbox/matrix/densematrix/Makefile.am
new file mode 100644
index 0000000..d82fb95
--- /dev/null
+++ b/linbox/matrix/densematrix/Makefile.am
@@ -0,0 +1,34 @@
+# Copyright (c) 2014 the LinBox group
+# written by BB
+# ========LICENCE========
+# This file is part of the library LinBox.
+#
+# LinBox is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+#
+# This library 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
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+# ========LICENCE========
+
+
+
+pkgincludesubdir=$(pkgincludedir)/matrix/densematrix
+
+
+pkgincludesub_HEADERS = \
+ blas-matrix.h \
+ blas-submatrix.inl \
+ blas-matrix.inl \
+ blas-triangularmatrix.inl \
+ blas-transposed-matrix.h \
+ blas-matrix-multimod.h
+
+
diff --git a/linbox/matrix/densematrix/blas-matrix-multimod.h b/linbox/matrix/densematrix/blas-matrix-multimod.h
new file mode 100644
index 0000000..1fec123
--- /dev/null
+++ b/linbox/matrix/densematrix/blas-matrix-multimod.h
@@ -0,0 +1,217 @@
+/* linbox/matrix/blas-matrix-multimod.h
+ * Copyright (C) 2004 Pascal Giorgi, Clément Pernet
+ *
+ * Written by :
+ * Pascal Giorgi pascal.giorgi at ens-lyon.fr
+ * Clément Pernet clement.pernet at imag.fr
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ * ========LICENCE========
+ */
+
+/*! @file matrix/blas-matrix-multimod.h
+ * @ingroup matrix
+ * A \c BlasMatrix<\c _Field > represents a matrix as an array of
+ * <code>_Field::Element</code>s. It also has the BlasBlackbox interface.
+ *
+ */
+
+/*! @file matrix/blas-matrix-multimod.h
+ * @brief specialisation for mutlimod field.
+ */
+
+#ifndef __LINBOX_blas_matrix_multimod_H
+#define __LINBOX_blas_matrix_multimod_H
+
+#include "linbox/util/debug.h"
+
+// #include "linbox/vector/subiterator.h"
+// #include "linbox/vector/subvector.h"
+
+#include "linbox/matrix/matrix-category.h"
+#include "linbox/linbox-tags.h"
+#include "linbox/matrix/dense-matrix.h"
+
+THIS_CODE_MAY_NOT_COMPILE_AND_IS_NOT_TESTED
+
+namespace LinBox
+{ /* Specialisation of BlasMatrix for MultiModDouble field */
+
+ /*! No Doc.
+ */
+ template<>
+ class BlasMatrix<MultiModDouble> {
+
+ public:
+
+ typedef MultiModDouble Field;
+ typedef std::vector<double> Element;
+ typedef BlasMatrix<MultiModDouble> Self_t;
+
+ protected:
+
+ MultiModDouble _field;
+ const std::vector<MatrixDomain<Givaro::Modular<double> > > _MD;
+ size_t _row,_col;
+ Element _One,_Zero; //! @warning used ?
+ std::vector<BlasMatrix<Givaro::Modular<double> >* > _rep;
+ std::vector<double> _entry;
+ public:
+
+
+ //BlasMatrix () {}
+
+ BlasMatrix (const MultiModDouble& F) :
+ _field(F) , _rep(F.size()), _entry(F.size())
+ {}
+
+ BlasMatrix (const Field& F, size_t m, size_t n, bool alloc=true) :
+ _field(F), _row(m) , _col(n) , _rep(F.size()), _entry(F.size())
+ {
+ for (size_t i=0;i<_rep.size();++i)
+ _rep[i] = new BlasMatrix<Givaro::Modular<double> > (F.getBase(i), m, n);
+ }
+
+ BlasMatrix (const BlasMatrix<MultiModDouble> & A):
+ _field(A._field),_row(A._row), _col(A._col),
+ _rep(A._rep.size()), _entry(A._entry)
+ {
+
+ for (size_t i=0;i<_rep.size();++i)
+ _rep[i]= new BlasMatrix<Givaro::Modular<double> > (const_cast<BlasMatrix<Givaro::Modular<double> >& >( *A._rep[i]));
+ }
+
+
+ const BlasMatrix<MultiModDouble>& operator=(const BlasMatrix<MultiModDouble> & A)
+ {
+ _field = A._field;
+ _row = A._row;
+ _col = A._col;
+ _rep = std::vector<BlasMatrix<Givaro::Modular<double> >* >(A._rep.size());
+ _entry = A._entry;
+ for (size_t i=0;i<_rep.size();++i)
+ _rep[i]= new BlasMatrix<Givaro::Modular<double> > (const_cast<BlasMatrix<Givaro::Modular<double> >& >( *A._rep[i]));
+ return *this;
+ }
+
+
+ ~BlasMatrix() {for (size_t i=0; i< _rep.size();++i) {delete _rep[i];} }
+
+ template <class Vector1, class Vector2>
+ Vector1& apply (Vector1& y, const Vector2& x) const
+ {
+ for (size_t i=0;i<_rep.size();++i) {
+ std::vector<double> x_tmp(x.size()), y_tmp(y.size());
+ for (size_t j=0;j<x.size();++j)
+ x_tmp[j]= x[j][i];
+
+ _rep[i]->apply(y_tmp, x_tmp);
+
+ for (size_t j=0;j<y.size();++j){
+ y[j][i]=y_tmp[j];
+
+ }
+ }
+
+ return y;
+ }
+
+ template <class Vector1, class Vector2>
+ Vector1& applyTranspose (Vector1& y, const Vector2& x) const
+ {
+ for (size_t i=0;i<_rep.size();++i) {
+ std::vector<double> x_tmp(x.size()), y_tmp(y.size());
+ for (size_t j=0;j<x.size();++j)
+ x_tmp[i]= x[j][i];
+
+ _rep[i]->applyTranspose(y_tmp, x_tmp);
+
+ for (size_t j=0;j<y.size();++j)
+ y[j][i]=y_tmp[i];
+ }
+
+ return y;
+ }
+
+#if 0
+ template<typename _Tp1>
+ struct rebind
+ {
+ typedef BlasMatrix<_Tp1> other;
+
+ void operator() (other *& Ap, const Self_t& A, const _Tp1& F) {
+ Ap = new other(F, A.rowdim(), A.coldim());
+ Hom<Field, _Tp1> hom(A. field(), F);
+
+ hom.image (*Ap_p, *A_p);
+ }
+ };
+#endif
+
+ size_t rowdim() const {return _row;}
+
+ size_t coldim() const {return _col;}
+
+
+ const Field &field() const {return _field;}
+
+
+ std::ostream& write(std::ostream& os) const
+ {
+ for (size_t i=0;i<_rep.size();++i)
+ _rep[i]->write(os);
+ return os;
+ }
+
+
+ void setEntry (size_t , size_t j, const Element &a_ij)
+ {
+ for (size_t i=0; i< _rep.size();++i)
+ _rep[i]->setEntry(i,j,a_ij[i]);
+ }
+
+
+ const Element& getEntry (size_t , size_t j)
+ {
+ for (size_t i=0; i< _rep.size();++i)
+ _entry[i]=_rep[i]->getEntry(i,j);
+ return _entry;
+ }
+
+ BlasMatrix<Givaro::Modular<double> >*& getMatrix(size_t i) {return _rep[i];}
+
+ };
+
+
+ template <>
+ class MatrixContainerTrait<BlasMatrix<MultiModDouble> > {
+ public:
+ typedef MatrixContainerCategory::Blackbox Type;
+ };
+} // LinBox
+
+#endif // __LINBOX_blas_matrix_H
+
+
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/matrix/densematrix/blas-matrix.h b/linbox/matrix/densematrix/blas-matrix.h
new file mode 100644
index 0000000..8c45d7f
--- /dev/null
+++ b/linbox/matrix/densematrix/blas-matrix.h
@@ -0,0 +1,1254 @@
+/*
+ * Copyright (C) 2004 Pascal Giorgi, Clément Pernet
+ * 2013, 2014 the LinBox group
+ *
+ * Written by :
+ * Pascal Giorgi pascal.giorgi at ens-lyon.fr
+ * Clément Pernet clement.pernet at imag.fr
+ * Brice Boyer (briceboyer) <boyer.brice at gmail.com>
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ * ========LICENCE========
+ */
+
+/*! @file matrix/densematrix/blas-matrix.h
+ * @ingroup densematrix
+ * A \c BlasMatrix<\c _Field > represents a matrix as an array of
+ * <code>_Field::Element</code>s. It also has the BlasBlackbox interface.
+ *
+ */
+
+#ifndef __LINBOX_matrix_densematrix_blas_matrix_H
+#define __LINBOX_matrix_densematrix_blas_matrix_H
+
+#include <linbox/linbox-config.h>
+#include "linbox/util/debug.h"
+#include "linbox/linbox-tags.h"
+#include "linbox/vector/stream.h"
+#include "linbox/field/hom.h"
+#include "linbox/vector/blas-vector.h"
+
+#include "linbox/matrix/matrix-category.h"
+#include "linbox/matrix/matrix-traits.h"
+#include "linbox/util/matrix-stream.h"
+
+#include "linbox/ring/modular.h" // just for checkBlasApply
+#include <givaro/modular-balanced.h> // just for checkBlasApply
+#include "givaro/zring.h"
+//! @bug this does not belong here.
+#include "blas-transposed-matrix.h"
+#include "linbox/matrix/matrixdomain/matrix-domain.h"
+#include "linbox/matrix/matrixdomain/apply-domain.h"
+
+#include <givaro/modular.h>
+
+namespace LinBox
+{ /* not generic wrt Field (eg NTL_ZZ_p) */
+ namespace Protected
+ {
+
+ //!@bug this does not seem right for float or any non M/modular field: doing blas wherever we have a fflas-ffpack field (?)
+ //! @bug should return true for some Givaro::ZRing
+ template <class Field>
+ bool checkBlasApply(const Field &F, size_t n)
+ {
+
+ return false;
+ // integer chara, card;
+ // F.characteristic(chara);
+ // F.cardinality(card);
+
+ // if ((chara != card) || chara == 0)
+ // return false;
+ // else
+ // if (n*chara*chara < integer("9007199254740992"))
+ // return true;
+ // else
+ // return false;
+ }
+
+ template<>
+ bool checkBlasApply(const Givaro::Modular<double> &, size_t)
+ {
+ return true;
+ }
+
+ template<>
+ bool checkBlasApply(const Givaro::ModularBalanced<double> &, size_t)
+ {
+ return true;
+ }
+
+ template<>
+ bool checkBlasApply(const Givaro::Modular<float> &, size_t)
+ {
+ return true;
+ }
+
+ template<>
+ bool checkBlasApply(const Givaro::ModularBalanced<float> &, size_t)
+ {
+ return true;
+ }
+
+ template<>
+ bool checkBlasApply(const Givaro::Modular<int64_t> &, size_t)
+ {
+ return true;
+ }
+
+ template<>
+ bool checkBlasApply(const Givaro::ModularBalanced<int64_t> &, size_t)
+ {
+ return true;
+ }
+
+ template<>
+ bool checkBlasApply(const Givaro::Modular<int32_t> &, size_t)
+ {
+ return true;
+ }
+
+ template<>
+ bool checkBlasApply(const Givaro::ModularBalanced<int32_t> &, size_t)
+ {
+ return true;
+ }
+ template<>
+ bool checkBlasApply(const Givaro::Modular<int16_t> &, size_t)
+ {
+ return true;
+ }
+
+ template<>
+ bool checkBlasApply(const Givaro::ModularBalanced<int16_t> &, size_t)
+ {
+ return true;
+ }
+
+ }
+}
+
+namespace LinBox
+{ /* Blas Matrix */
+ template<class Matrix>
+ class MatrixDomain;
+
+ /*! Dense matrix representation.
+ * @ingroup matrix
+ * A \p BlasMatrix is a matrix of \p _Field::Element, with the structure of BLAS matrices.
+ * It is basically a vector of \p _Field::Element.
+ * In the Mother model, a \p BlasMatrix is allocated by the user.
+ *@bug why not BlasMatrixDomain ?
+ */
+ template <class _Field, class _Storage>
+ class BlasMatrix {
+ // private :
+
+ public:
+ typedef _Field Field;
+ typedef typename Field::Element Element; //!< Element type
+ typedef _Storage Rep; //!< Actually a <code>std::vector<Element></code> (or alike: cstor(n), cstor(n, val), operator[], resize(n).)
+ typedef typename Rep::pointer pointer; //!< pointer type to elements
+ typedef const pointer const_pointer; //!< const pointer type
+ typedef BlasMatrix<Field,Rep> Self_t; //!< Self typeype
+ typedef const BlasMatrix<Field,Rep> constSelf_t; //!< Self typeype
+
+ typedef BlasSubmatrix<Self_t> subMatrixType; //!< Submatrix type
+ typedef BlasSubmatrix<constSelf_t> constSubMatrixType; //!< Submatrix type
+ typedef Self_t matrixType; //!< matrix type
+ typedef constSelf_t constMatrixType; //!< matrix type
+ typedef Self_t blasType; //!< blas matrix type
+
+ protected:
+ size_t _row;
+ size_t _col;
+ Rep _rep;
+ public:
+ bool _use_fflas ; //! @bug why public ?
+ //protected:
+ pointer _ptr;
+ public:
+ // protected:
+ const Field * _field; //! @bug why public ?
+ MatrixDomain<Field> _MD; //! @bug why public ?
+ VectorDomain<Field> _VD;
+ // applyDomain<subMatrixType> _AD; //! @bug why public ?
+ // applyDomain<Self_t> _AD; //! @bug why public ?
+
+
+ private:
+
+#if 0
+ void makePointer()
+ {
+#if 0
+ if (_row && _col) {
+ _ptr = malloc( _row*_col*sizeof(_Element) ) ;
+ linbox_check(_ptr);
+ }
+ else
+ _ptr = NULL ;
+#endif
+ _rep = Rep(_row*_col);
+ _ptr = &_rep[0];
+ }
+#endif
+
+ /*! @internal
+ * @name create BlasMatrix
+ * @{ */
+
+ /*! @internal
+ * Copy data according to blas container structure.
+ * Specialisation for BlasContainer.
+ */
+ void createBlasMatrix (const Self_t & A) ;
+
+ /*! @internal
+ * Copy data according to blas container structure.
+ * Specialisation for BlasContainer.
+ */
+ template <class _Matrix>
+ void createBlasMatrix (const _Matrix& A, MatrixContainerCategory::BlasContainer) ;
+
+ /*! @internal
+ * Copy data according to Matrix container structure.
+ * Specialisation for Container
+ */
+ template <class Matrix>
+ void createBlasMatrix (const Matrix& A, MatrixContainerCategory::Container) ;
+
+ /*! @internal
+ * Copy data according to blackbox structure.
+ * Specialisation for Blackbox.
+ */
+ template <class Matrix>
+ void createBlasMatrix (const Matrix& A, MatrixContainerCategory::Blackbox) ;
+
+ /*! @internal
+ * Copy data according to Matrix container structure (allow submatrix).
+ * Specialisation for Container
+ */
+ template <class _Matrix>
+ void createBlasMatrix (const _Matrix& A,
+ const size_t i0,const size_t j0,
+ const size_t m, const size_t n,
+ MatrixContainerCategory::Container) ;
+
+ /*! @internal
+ * Copy data according to Matrix container structure (allow submatrix).
+ * Specialisation for BlasContainer.
+ */
+ template <class Matrix>
+ void createBlasMatrix (const Matrix& A,
+ const size_t i0,const size_t j0,
+ const size_t m, const size_t n,
+ MatrixContainerCategory::BlasContainer) ;
+
+ /*! @internal
+ * Copy data according to blackbox structure (allow submatrix).
+ * Specialisation for Blackbox matrices
+ * @todo need to be implemented by succesive apply
+ */
+ template <class Matrix>
+ void createBlasMatrix (const Matrix& A,
+ const size_t i0,const size_t j0,
+ const size_t m, const size_t n,
+ MatrixContainerCategory::Blackbox) ;
+
+ /*!@internal constructor from vector of elements.
+ * @param v pointer to \c Element s
+ */
+ void createBlasMatrix ( const Element * v) ;
+
+ /*!@internal constructor from vector of elements.
+ * @param v std::vector of \c Element s
+ */
+ void createBlasMatrix ( const std::vector<Element> & v) ;
+ /*! @internal
+ * @}
+ */
+
+ public:
+
+ //////////////////
+ // CONSTRUCTORS //
+ //////////////////
+
+
+ /*! Allocates a new \f$ 0 \times 0\f$ matrix (shaped and ready).
+ */
+ BlasMatrix (const _Field &F) ;
+
+ // /*! Allocates a new bare \f$ 0 \times 0\f$ matrix (unshaped, unready).
+ // */
+ // BlasMatrix () ;
+
+ /// (Re)allocates a new \f$ m \times n\f$ zero matrix (shaped and ready).
+ void init(const _Field & F, const size_t & r = 0, const size_t & c = 0);
+
+ /*! Allocates a new \f$ m \times n\f$ zero matrix (shaped and ready).
+ * @param F
+ * @param m rows
+ * @param n cols
+ */
+ //@{
+
+ BlasMatrix (const _Field &F, const size_t & m, const size_t &n) ;
+
+ //@}
+
+
+ /*! Constructor from a matrix stream.
+ * @param ms matrix stream.
+ */
+ BlasMatrix(MatrixStream<_Field>& ms) ;
+
+ /*! Generic copy constructor from either a blackbox or a matrix container.
+ * @param A matrix to be copied
+ */
+ template <class Matrix>
+ BlasMatrix (const Matrix &A) ;
+
+ /*! Generic copy constructor from either a blackbox or a matrix container (allow submatrix).
+ * @param A matrix to be copied
+ * @param i0
+ * @param j0
+ * @param m rows
+ * @param n columns
+ */
+ template <class Matrix>
+ BlasMatrix (const Matrix& A,
+ const size_t & i0, const size_t & j0,
+ const size_t & m, const size_t & n) ;
+
+ /*! Constructor.
+ * @param A matrix to be copied
+ * @param F Field
+ */
+ template<class _Matrix>
+ BlasMatrix (const _Matrix &A, const _Field &F) ;
+
+ /*! Copy Constructor of a matrix (copying data).
+ * @param A matrix to be copied.
+ */
+ BlasMatrix (const Self_t & A) ;
+
+ /*- Copy Constructor of a matrix (copying data).
+ * @param A matrix to be copied.
+ */
+ // BlasMatrix (const BlasSubmatrix<Field,Rep>& A) ;
+
+ /*! Create a BlasMatrix from a vector of elements
+ * @param F
+ * @param v
+ * @param m
+ * @param n
+ */
+ BlasMatrix (const _Field &F, const std::vector<Element>& v,
+ const size_t &m , const size_t &n) ;
+
+ /*! Create a BlasMatrix from an array of elements
+ * @param F
+ * @param v
+ * @param m
+ * @param n
+ */
+ BlasMatrix (const _Field &F, const Element * v,
+ const size_t & m, const size_t & n) ;
+
+
+ /** Constructor using a finite vector stream (stream of the rows).
+ * @param F The field of entries; passed so that arithmetic may be done
+ * on elements
+ * @param stream A vector stream to use as a source of vectors for this
+ * matrix
+ */
+ template <class StreamVector>
+ BlasMatrix (const Field &F, VectorStream<StreamVector> &stream) ;
+
+ /// Destructor.
+ ~BlasMatrix () ;
+
+ //! operator = (copying data)
+ Self_t& operator= (const Self_t& A) ;
+
+ /// Make this a (deep)copy of B. Assumes same shape.
+ //! make sure we actually copy
+ template<class Matrix>
+ BlasMatrix ©( const Matrix & B)
+ {
+ Element x; field().init(x);
+ for (size_t i = 0 ; i < rowdim() ; ++i)
+ for (size_t j = 0 ; j < coldim() ; ++j) {
+ setEntry(i,j,B.getEntry(x,i,j));
+ }
+ return *this;
+
+ }
+
+
+ //! Rebind operator
+ template<typename _Tp1>
+ struct rebind ;
+
+ //////////////////
+ // DIMENSIONS //
+ //////////////////
+
+ /** Get the number of rows in the matrix.
+ * @returns Number of rows in matrix
+ */
+ size_t rowdim() const ;
+
+ /** Get the number of columns in the matrix.
+ * @returns Number of columns in matrix
+ */
+ size_t coldim() const ;
+
+ /*! Get the stride of the matrix.
+ */
+ size_t getStride() const;
+ size_t stride() const { return getStride() ;}
+
+ /*!Get a reference to the stride of the matrix.
+ * Modify stride this way.
+ */
+ size_t& getWriteStride();
+
+
+ /** Resize the matrix to the given dimensions.
+ * The state of the matrix's entries after a call to this method is
+ * undefined
+ * @param m Number of rows
+ * @param n Number of columns
+ * @param val
+ */
+ void resize (const size_t &m, const size_t &n, const Element& val = Element()) ;
+
+ //////////////////
+ // ELEMENTS //
+ //////////////////
+
+ /*! @internal
+ * Get read-only pointer to the matrix data.
+ */
+ pointer getPointer() const ;
+
+ const_pointer &getConstPointer() const ;
+
+ Rep & refRep() { return _rep ;}
+ const Rep & getRep() const { return _rep ;}
+
+
+ /*! @internal
+ * Get write pointer to the matrix data.
+ * Data may be changed this way.
+ */
+ pointer& getWritePointer() ;
+
+ /** Set the entry at the (i, j) position to a_ij.
+ * @param i Row number, 0...rowdim () - 1
+ * @param j Column number 0...coldim () - 1
+ * @param a_ij Element to set
+ */
+ void setEntry (size_t i, size_t j, const Element &a_ij) ;
+
+ /** Get a writeable reference to the entry in the (i, j) position.
+ * @param i Row index of entry
+ * @param j Column index of entry
+ * @returns Reference to matrix entry
+ */
+ Element &refEntry (size_t i, size_t j) ;
+
+ /** Get a read-only reference to the entry in the (i, j) position.
+ * @param i Row index
+ * @param j Column index
+ * @returns Const reference to matrix entry
+ */
+ const Element &getEntry (size_t i, size_t j) const ;
+
+ /** Copy the (i, j) entry into x, and return a reference to x.
+ * This form is more in the Linbox style and is provided for interface
+ * compatibility with other parts of the library
+ * @param x Element in which to store result
+ * @param i Row index
+ * @param j Column index
+ * @returns Reference to x
+ */
+ Element &getEntry (Element &x, size_t i, size_t j) const ;
+
+ ///////////////////
+ // TRANSPOSE &AL //
+ ///////////////////
+
+ /*! Creates a transposed matrix of \c *this.
+ * @param[in] tM
+ * @return the transposed matrix of this.
+ */
+ Self_t transpose(Self_t & tM) const ;
+
+
+ /*! Transpose (inplace).
+ * If rows and columns agree, we can transpose inplace.
+ */
+ template<bool _IP>
+ void transpose() ;
+
+ void transpose() ;
+
+ /*! Reverse the rows of a matrix.
+ * This is done inplace.
+ * Let J=antiDiag(1) (or the matrix of the reverse
+ * permutation or the matrix (i,j) = (i+j+1==m)). Then,
+ * we compute A <- J.A;
+ */
+ void reverseRows() ;
+
+ /*! Reverse the columns of a matrix.
+ * This is done inplace.
+ * This is A <- J.A
+ */
+ void reverseCols() ;
+
+ /*! Reverse the rows/columns of a matrix.
+ * This is done inplace.
+ * This is A <- J.A.J
+ */
+ void reverse() ;
+
+ // init to field zero elements
+ void zero() ;
+ // init to random field elements
+ void random()
+ {
+ subMatrixType B(*this, 0, 0, rowdim(), coldim());
+ B.random();
+ }
+
+ template<class Rand>
+ void random(const Rand&)
+ {
+ return random();
+ }
+
+ ///////////////////
+ // I/O //
+ ///////////////////
+
+ /** Read the matrix from an input stream.
+ * The stream is in SMS, DENSE, or MatrixMarket format and is autodetected.
+ * @param file Input stream from which to read
+ */
+ std::istream &read (std::istream &file);
+
+ /// Write the matrix in MatrixMarket format.
+ std::ostream &write (std::ostream &os) const
+ {
+ // std::cout << "writing" << std::endl;
+ constSubMatrixType B(*this, 0, 0, rowdim(), coldim());
+ // std::cout << "......." << std::endl;
+ return B.write(os);
+ }
+
+ /** Write the matrix to an output stream.
+ * @param os Output stream to which to write
+ * @param f write in some format (@ref Tag::FileFormat::Format). Default is Maple's.
+ */
+ std::ostream &write (std::ostream &os,
+ LINBOX_enum (Tag::FileFormat) f/* = Tag::FileFormat::Maple*/) const
+ {
+ constSubMatrixType B(*this, 0, 0, rowdim(), coldim());
+ return B.write(os, f);
+ }
+
+ /*! @deprecated Only for compatiblity.
+ */
+ std::ostream &write (std::ostream &os,
+ bool mapleFormat) const
+ {
+ constSubMatrixType B(*this, 0, 0, rowdim(), coldim());
+ return B.write(os, mapleFormat);
+ }
+
+
+
+
+ ///////////////////
+ // ITERATORS //
+ ///////////////////
+
+ /** @name Column of rows iterator
+ * \brief
+ * The column of rows iterator traverses the rows of the
+ * matrix in ascending order. Dereferencing the iterator yields
+ * a row vector in dense format
+ */
+ //@{
+ typedef Subvector<typename Rep::iterator, typename Rep::const_iterator> Row;
+ typedef Subvector<typename Rep::const_iterator> ConstRow;
+
+ /*! Row Iterator.
+ * @ingroup iterators
+ * @brief NO DOC
+ */
+ class RowIterator;
+ /*! Const Row Iterator.
+ * @ingroup iterators
+ * @brief NO DOC
+ */
+ class ConstRowIterator;
+
+ RowIterator rowBegin ();
+ RowIterator rowEnd ();
+ ConstRowIterator rowBegin () const;
+ ConstRowIterator rowEnd () const;
+ //@}
+
+ /** @name Row of columns iterator
+ * \brief
+ * The row of columns iterator traverses the columns of the
+ * matrix in ascending order. Dereferencing the iterator yields
+ * a column vector in dense format
+ */
+ //@{
+ typedef Subvector<Subiterator<typename Rep::iterator> > Col;
+ typedef Subvector<Subiterator<typename Rep::const_iterator> > ConstCol;
+ typedef Col Column;
+ typedef ConstCol ConstColumn;
+
+ /*! Col Iterator.
+ * @ingroup iterators
+ * @brief NO DOC
+ */
+ class ColIterator;
+ /*! Const Col Iterator.
+ * @ingroup iterators
+ * @brief NO DOC
+ */
+ class ConstColIterator;
+
+ ColIterator colBegin ();
+ ColIterator colEnd ();
+ ConstColIterator colBegin () const;
+ ConstColIterator colEnd () const;
+ //@}
+
+ /** @name Iterator
+ * \brief
+ *
+ * The iterator is a method for accessing all entries in the matrix
+ * in some unspecified order. This can be used, e.g. to reduce all
+ * matrix entries modulo a prime before passing the matrix into an
+ * algorithm.
+ */
+ //@{
+ typedef typename Rep::iterator Iterator;
+ typedef typename Rep::const_iterator ConstIterator;
+
+ Iterator Begin ();
+ Iterator End ();
+ ConstIterator Begin () const;
+ ConstIterator End () const;
+ //@}
+
+ /** @name Raw Indexed iterator
+ * \brief
+ *
+ * Like the raw iterator, the indexed iterator is a method for
+ * accessing all entries in the matrix in some unspecified order.
+ * At each position of the the indexed iterator, it also provides
+ * the row and column indices of the currently referenced entry.
+ * This is provided through it's \c rowIndex() and \c colIndex() functions.
+ */
+ //@{
+ class IndexedIterator;
+ /*! Const Indexed Iterator.
+ * @ingroup iterators
+ * @brief NO DOC
+ */
+ class ConstIndexedIterator;
+
+ IndexedIterator IndexedBegin ();
+ IndexedIterator IndexedEnd ();
+ ConstIndexedIterator IndexedBegin () const;
+ ConstIndexedIterator IndexedEnd () const;
+ //@}
+
+ /** Retrieve a reference to a row.
+ * Since rows may also be indexed, this allows A[i][j] notation
+ * to be used.
+ * @param i Row index
+ * @bug Rows and Cols should be BlasVectors
+ */
+ //@{
+ Row operator[] (size_t i) ;
+ ConstRow operator[] (size_t i) const ;
+ //@}
+
+ ///////////////////
+ // MISC //
+ ///////////////////
+
+
+ /** Compute column density.
+ * @param v
+ */
+ template <class Vector>
+ Vector &columnDensity (Vector &v) const ;
+
+ size_t size()
+ {
+ return _row * _col;
+ }
+
+ void finalize() {}
+
+ ///////////////////
+ // BLACK BOX //
+ ///////////////////
+
+
+ template <class Vector1, class Vector2>
+ Vector1& apply (Vector1& y, const Vector2& x) const ;
+
+ template<class _VRep>
+ BlasVector<Field,_VRep>& apply (BlasVector<Field,_VRep>& y, const BlasVector<Field,_VRep>& x) const ;
+
+ template <class Vector1, class Vector2>
+ Vector1& applyTranspose (Vector1& y, const Vector2& x) const ;
+
+ subMatrixType& applyRight(subMatrixType& Y, const subMatrixType& X)
+ { return Y; } // temp
+ subMatrixType& applyLeft(subMatrixType& Y, const subMatrixType& X)
+ { return Y; } // temp
+
+ const _Field& field() const;
+ //_Field& field() ;
+ // void setField(const _Field & F) { _field = F ; };
+
+ template<class uselessTag>
+ void changeFieldSpecialised( _Field & G,
+ // MatrixDomain<_Field> & MD,
+ VectorDomain<_Field> & VD,
+ const _Field & F,
+ const uselessTag & m)
+ {
+ // don't do anything (?)
+ return;
+ }
+
+ void changeFieldSpecialised( _Field & G,
+ // MatrixDomain<_Field> & MD,
+ VectorDomain<_Field> & VD,
+ const _Field & F,
+ const RingCategories::ModularTag & m)
+ {
+ G=F ;
+ // _MD = MatrixDomain<_Field>(F);
+ VD = VectorDomain<_Field>(F);
+ return;
+ }
+
+
+ void changeField(const _Field &F)
+ {
+ changeFieldSpecialised(const_cast<_Field&>(_field),
+ // const_cast<MatrixDomain<_Field>&>(_MD),
+ const_cast<VectorDomain<_Field>&>(_VD),
+ F,
+ typename FieldTraits<_Field>::categoryTag());
+ }
+
+
+
+ }; // end of class BlasMatrix
+
+
+} // end of namespace LinBox
+
+namespace LinBox
+{ /* Blas Submatrix */
+ /*! Dense Submatrix representation.
+ * @ingroup matrix
+ * A @ref BlasSubmatrix is a matrix of \p _Field::Element, with the structure of BLAS matrices.
+ * It is basically a read/write view on a vector of \p _Field::Element.
+ * In the Mother model, a @ref BlasSubmatrix is not allocated.
+ * <p>
+ * This matrix type conforms to the same interface as @ref BlasMatrix,
+ * except that you cannot resize it. It represents a submatrix of a dense
+ * matrix. Upon construction, one can freely manipulate the entries in the
+ * DenseSubmatrix, and the corresponding entries in the underlying
+ * @ref BlasMatrix will be modified.
+
+
+ */
+ template <class _Matrix>
+ class BlasSubmatrix {
+ public :
+ typedef typename _Matrix::Field Field;
+ typedef typename Field::Element Element; //!< Element type
+ typedef typename _Matrix::Rep Rep;
+ typedef BlasSubmatrix<_Matrix> Self_t; //!< Self type
+ typedef const BlasSubmatrix<typename _Matrix::constSelf_t> constSelf_t; //!< Self type (const)
+
+ typedef typename Rep::pointer pointer; //!< pointer type to elements
+ typedef const pointer const_pointer; //!< const pointer type
+ typedef Self_t subMatrixType; //!< Submatrix type
+ typedef constSelf_t constSubMatrixType; //!< Submatrix type (const)
+ typedef typename _Matrix::Self_t matrixType; //!< non const matrix type
+ typedef typename _Matrix::constSelf_t constMatrixType; //!< matrix type (const)
+ typedef matrixType blasType; //!< blas matrix type
+ typedef BlasVector<Field,Rep> vectorType; //!< blas matrix type
+
+
+ protected:
+ _Matrix &_Mat; //!< Parent BlasMatrix (ie encapsulated raw std::vector)
+ size_t _row; //!< row dimension of Submatrix
+ size_t _col; //!< col dimension of Submatrix
+ size_t _r0; //!< upper left corner row of Submatrix in \p _Mat
+ size_t _c0; //!< upper left corner row of Submatrix in \p _Mat
+ size_t _stride ; //!< number of columns in \p _Mat (or stride of \p _Mat)
+ size_t _off; //!< offset in \p _Mat, precomputed \c (_row*_stride+_col)
+
+ // applyDomain<matrixType> _AD;
+ applyDomain<constMatrixType> _AD;
+ public:
+ VectorDomain<Field> _VD; //!@bug NOT HERE
+
+ //////////////////
+ // CONSTRUCTORS //
+ //////////////////
+
+
+ /* constructors */
+
+ // /** NULL constructor. */
+ // BlasSubmatrix () ;
+
+ /** Constructor from an existing @ref BlasMatrix and dimensions.
+ * \param M Pointer to @ref BlasMatrix of which to construct submatrix
+ * \param rowbeg Starting row
+ * \param colbeg Starting column
+ * \param Rowdim Row dimension
+ * \param Coldim Column dimension
+ */
+ BlasSubmatrix (constMatrixType &M,
+ size_t rowbeg,
+ size_t colbeg,
+ size_t Rowdim,
+ size_t Coldim);
+
+ BlasSubmatrix (matrixType &M,
+ size_t rowbeg,
+ size_t colbeg,
+ size_t Rowdim,
+ size_t Coldim);
+
+
+
+ /** Constructor from an existing @ref BlasMatrix
+ * \param M Pointer to @ref BlasMatrix of which to construct submatrix
+ */
+ BlasSubmatrix (constMatrixType &M);
+
+ BlasSubmatrix (matrixType &M);
+
+ //! @todo BlasSub from (sub)Vector
+ // BlasSubmatrix (const vectorType &V);
+
+
+ /** Constructor from an existing submatrix and dimensions
+ * @param SM Constant reference to BlasSubmatrix from which to
+ * construct submatrix
+ * @param rowbeg Starting row
+ * @param colbeg Starting column
+ * @param Rowdim Row dimension
+ * @param Coldim Column dimension
+ */
+ BlasSubmatrix (constSelf_t &SM,
+ size_t rowbeg,
+ size_t colbeg,
+ size_t Rowdim,
+ size_t Coldim);
+
+ BlasSubmatrix (Self_t &SM,
+ size_t rowbeg,
+ size_t colbeg,
+ size_t Rowdim,
+ size_t Coldim);
+
+ /** Copy constructor.
+ * @param SM Submatrix to copy
+ */
+ BlasSubmatrix (constSelf_t &SM);
+ BlasSubmatrix (Self_t &SM);
+
+
+ /* Members */
+
+ /** Assignment operator.
+ * Assign the given submatrix to this one
+ * This is <i>only</i> renaming !
+ * There is no copy because BlasSubmatrix owns nothing.
+ * @param SM Submatrix to assign
+ * @return Reference to this submatrix
+ */
+ BlasSubmatrix &operator = (const BlasSubmatrix<_Matrix> &SM);
+
+ // function for repurposing Submatrices.
+ BlasSubmatrix &submatrix(constSelf_t &SM,
+ size_t rowbeg,
+ size_t colbeg,
+ size_t Rowdim,
+ size_t Coldim);
+
+ /// This is deep copy of the data, operator= is a shallow copy.
+ template<class Matrix>
+ BlasSubmatrix ©( const Matrix & B);
+
+ /// Swap contents. Shapes must be the same.
+ BlasSubmatrix &swap( Self_t & B);
+
+ /// Overwrite with zeroes.
+ BlasSubmatrix &zero();
+
+ /// Overwrite with random elements.
+ void random();
+
+ template<class T>
+ void random(const T&)
+ {
+ return random() ;
+ }
+
+ template<typename _Tp1, class _Rep2 = Rep>
+ struct rebind ;
+
+ //////////////////
+ // DIMENSIONS //
+ //////////////////
+
+ /** Get the number of rows in the matrix
+ * @return Number of rows in matrix
+ */
+ size_t rowdim () const;
+
+ /** Get the number of columns in the matrix
+ * @return Number of columns in matrix
+ */
+ size_t coldim () const ;
+
+ /*! Get the stride of the matrix.
+ * @return stride of submatrix (number of cols of dense base matrix)
+ */
+ size_t getStride() const;
+ size_t stride() const { return getStride() ;}
+ size_t offset() const { return _off ; }
+
+
+ ///////////////////
+ // I/O //
+ ///////////////////
+
+ /** Read the matrix from an input stream.
+ * @param file Input stream from which to read
+ * @bug reading a submatrix should not be allowed !!
+ */
+ // template<class Field>
+ std::istream& read (std::istream &file); // autodetect ?
+
+
+ /** Write the matrix to an output stream.
+ * @param os Output stream to which to write
+ * @param f write in some format (@ref Tag::FileFormat::Format). Default is MM's.
+ */
+ std::ostream &write (std::ostream &os,
+ LINBOX_enum (Tag::FileFormat) f = Tag::FileFormat::MatrixMarket )const;
+
+ //////////////////
+ // ELEMENTS //
+ //////////////////
+
+ /*! @internal
+ * Get read-only pointer to the matrix data.
+ */
+ pointer getPointer() const ;
+
+ const_pointer &getConstPointer() const ;
+
+
+ /*! @internal
+ * Get write pointer to the matrix data.
+ * Data may be changed this way.
+ */
+ pointer/* & */ getWritePointer() ;
+
+
+ /** Set the entry at (i, j).
+ * @param i Row number, 0...rowdim () - 1
+ * @param j Column number 0...coldim () - 1
+ * @param a_ij Element to set
+ */
+ void setEntry (size_t i, size_t j, const Element &a_ij) ;
+
+ /** Get a writeable reference to an entry in the matrix.
+ * @param i Row index of entry
+ * @param j Column index of entry
+ * @return Reference to matrix entry
+ */
+ Element &refEntry (size_t i, size_t j) ;
+
+ /** Get a read-only individual entry from the matrix.
+ * @param i Row index
+ * @param j Column index
+ * @return Const reference to matrix entry
+ */
+ const Element &getEntry (size_t i, size_t j) const ;
+
+ /** Get an entry and store it in the given value.
+ * This form is more in the Linbox style and is provided for interface
+ * compatibility with other parts of the library
+ * @param x Element in which to store result
+ * @param i Row index
+ * @param j Column index
+ * @return Reference to x
+ */
+ Element &getEntry (Element &x, size_t i, size_t j) const ;
+
+
+ ///////////////////
+ // ITERATORS //
+ ///////////////////
+
+ //! @name Forward declaration of Raw Iterators.
+ //@{
+ class Iterator ;
+ class ConstIterator ;
+
+ class IndexedIterator ;
+ class ConstIndexedIterator ;
+ //@}
+
+
+ /** @name typedef'd Row Iterators.
+ *\brief
+ * The row iterator gives the rows of the
+ * matrix in ascending order. Dereferencing the iterator yields
+ * a row vector in dense format
+ * @{
+ */
+ typedef typename matrixType::RowIterator RowIterator;
+ typedef typename matrixType::ConstRowIterator ConstRowIterator;
+ typedef typename matrixType::Row Row;
+ typedef typename matrixType::ConstRow ConstRow;
+ //@} Row Iterators
+
+ /** @name typedef'd Column Iterators.
+ *\brief
+ * The columns iterator gives the columns of the
+ * matrix in ascending order. Dereferencing the iterator yields
+ * a column vector in dense format
+ * @{
+ */
+ typedef typename matrixType::ColIterator ColIterator;
+ typedef typename matrixType::ConstColIterator ConstColIterator;
+ typedef typename matrixType::Col Col;
+ typedef typename matrixType::Column Column;
+ typedef typename matrixType::ConstCol ConstCol;
+ //@} // Column Iterators
+
+
+
+ RowIterator rowBegin (); //!< iterator to the begining of a row
+ RowIterator rowEnd (); //!< iterator to the end of a row
+ ConstRowIterator rowBegin () const; //!< const iterator to the begining of a row
+ ConstRowIterator rowEnd () const; //!< const iterator to the end of a row
+
+ ColIterator colBegin ();
+ ColIterator colEnd ();
+ ConstColIterator colBegin () const;
+ ConstColIterator colEnd () const;
+
+ Iterator Begin ();
+ Iterator End ();
+ ConstIterator Begin () const;
+ ConstIterator End () const;
+
+
+
+ IndexedIterator IndexedBegin();
+ IndexedIterator IndexedEnd();
+ ConstIndexedIterator IndexedBegin() const;
+ ConstIndexedIterator IndexedEnd() const;
+
+ /*! operator[].
+ * Retrieve a reference to a row
+ * @param i Row index
+ */
+ Row operator[] (size_t i) ;
+ ConstRow operator[] (size_t i) const ;
+
+ ///////////////////
+ // BLACK BOX //
+ ///////////////////
+
+
+ //!@bug every vector we use here should have a stride/be blas vectors so it's not really templated by Vector1 Vector2 in general
+ template <class Vector1, class Vector2>
+ Vector1& apply (Vector1& y, const Vector2& x) const
+ {
+ // std::cout << "prepare apply subMatrix" << std::endl;
+ // constSelf_t A(*this);
+ // std::cout << "........................" << std::endl;
+ // _AD.apply(Tag::Transpose::NoTrans,y,field().one,A,field().zero,x);
+ _AD.apply(Tag::Transpose::NoTrans,y,field().one,*this,field().zero,x);
+ // std::cout << "........done............" << std::endl;
+ return y;
+ }
+
+ //! @bug use Matrix domain
+ template <class Vector1, class Vector2>
+ Vector1& applyTranspose (Vector1& y, const Vector2& x) const
+ {
+ // std::cout << "prepare applyT subMatrix" << std::endl;
+ // constSelf_t A(*this);
+ // std::cout << "........................" << std::endl;
+ // _AD.apply(Tag::Transpose::Trans,y,field().one,A,field().zero,x);
+ _AD.apply(Tag::Transpose::Trans,y,field().one,*this,field().zero,x);
+ // std::cout << "........done............" << std::endl;
+
+ return y;
+ }
+
+ const Field& field() const { return _Mat.field() ;}
+ // Field & field() { return _Mat.field(); }
+ };
+
+}
+
+namespace LinBox
+{ /* Triangular Matrix */
+ //! Triangular BLAS matrix.
+ template <class _Field, class _Storage >
+ class TriangularBlasMatrix: public BlasMatrix<_Field,_Storage> {
+
+ protected:
+
+ LINBOX_enum (Tag::Shape) _uplo; //!< upper or lower triangular
+ LINBOX_enum (Tag::Diag) _diag; //!< unit or non unit diagonal
+
+ public:
+ typedef _Field Field;
+ typedef _Storage Rep;
+ typedef typename Field::Element Element; //!< Element type
+ typedef BlasMatrix<Field,Rep> Father_t;
+ typedef TriangularBlasMatrix<Field,Rep> Self_t;
+
+
+ /*! Constructor for a new \c TriangularBlasMatrix.
+ * @param F
+ * @param m rows
+ * @param n cols
+ * @param y (non)unit diagonal
+ * @param x (upp/low)er matrix
+ */
+ TriangularBlasMatrix (const Field & F,
+ const size_t m, const size_t n,
+ LINBOX_enum (Tag::Shape) x=Tag::Shape::Upper,
+ LINBOX_enum (Tag::Diag) y= Tag::Diag::NonUnit) ;
+
+ /*! Constructor from a \c BlasMatrix (copy).
+ * @param A matrix
+ * @param y (non)unit diagonal
+ * @param x (upp/low)er matrix
+ */
+ TriangularBlasMatrix (const BlasMatrix<Field,Rep>& A,
+ LINBOX_enum (Tag::Shape) x=Tag::Shape::Upper,
+ LINBOX_enum (Tag::Diag) y= Tag::Diag::NonUnit) ;
+
+ /*! Constructor from a \c BlasMatrix (no copy).
+ * @param A matrix
+ * @param y (non)unit diagonal
+ * @param x (upp/low)er matrix
+ */
+ TriangularBlasMatrix (BlasMatrix<Field,Rep>& A,
+ LINBOX_enum (Tag::Shape) x=Tag::Shape::Upper,
+ LINBOX_enum (Tag::Diag) y= Tag::Diag::NonUnit) ;
+
+ /*! Constructor from a \c TriangularBlasMatrix (copy).
+ * @param A matrix
+ */
+ TriangularBlasMatrix (const TriangularBlasMatrix<Field,Rep>& A) ;
+
+ /*! Generic constructor from a \c Matrix (no copy).
+ * @param A matrix
+ * @param y (non)unit diagonal
+ * @param x (upp/low)er matrix
+ */
+ template<class Matrix>
+ TriangularBlasMatrix (const Matrix& A,
+ LINBOX_enum (Tag::Shape) x=Tag::Shape::Upper,
+ LINBOX_enum (Tag::Diag) y= Tag::Diag::NonUnit) ;
+
+ /// get the shape of the matrix (upper or lower)
+ LINBOX_enum (Tag::Shape) getUpLo() const ;
+
+ /// Is the diagonal implicitly unit ?
+ LINBOX_enum (Tag::Diag) getDiag() const ;
+
+ }; // end of class TriangularBlasMatrix
+
+} // LinBox
+
+#include <givaro/zring.h>
+
+namespace LinBox
+{
+ //! @bug does not work for submatrices.
+ //! @todo b should be the random generator
+ template<>
+ template<>
+ void BlasMatrix<Givaro::ZRing<Integer>, Vector<Givaro::ZRing<Integer>>::Dense >::random<size_t>(const size_t & b)
+ {
+ // std::cout << "randomized " << b << std::endl;
+ typedef Givaro::ZRing<Integer> ZZ_t;
+ ZZ_t::RandIter R(ZZ_t(), b);
+ for (size_t i = 0 ; i < rowdim() ; ++i)
+ for (size_t j = 0 ; j < coldim() ; ++j)
+ R.random(refEntry(i,j));
+
+ }
+
+} // LinBox
+
+#include "blas-matrix.inl"
+#include "blas-submatrix.inl"
+#include "blas-triangularmatrix.inl"
+
+#endif // __LINBOX_densematrix_blas_matrix_H
+
+
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/matrix/densematrix/blas-matrix.inl b/linbox/matrix/densematrix/blas-matrix.inl
new file mode 100644
index 0000000..0888411
--- /dev/null
+++ b/linbox/matrix/densematrix/blas-matrix.inl
@@ -0,0 +1,1548 @@
+/*
+ * Copyright (C) 2004 Pascal Giorgi, Clément Pernet
+ * 2013, 2014 the LinBox group
+ *
+ * Written by :
+ * Pascal Giorgi <pascal.giorgi at ens-lyon.fr>
+ * Clément Pernet <clement.pernet at imag.fr>
+ * Brice Boyer (briceboyer) <boyer.brice at gmail.com>
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ * ========LICENCE========
+ */
+
+/*!@internal
+ * @file matrix/densematrix/blas-matrix.inl
+ * @ingroup densematrix
+ * A \c BlasMatrix<\c _Field > represents a matrix as an array of
+ * <code>_Field</code>s.
+ */
+
+#ifndef __LINBOX_densematrix_blas_matrix_INL
+#define __LINBOX_densematrix_blas_matrix_INL
+
+/////////////////
+// PRIVATE //
+/////////////////
+
+namespace LinBox
+{
+ template<class _Field, class _Rep>
+ void BlasMatrix< _Field, _Rep >::createBlasMatrix (const BlasMatrix< _Field, _Rep >& A)
+ {
+#ifndef NDEBUG
+ if (!areFieldEqual(A.field(),field())) {
+ A.field().write(std::cout) << "!=" ;
+ field().write(std::cout) << std::endl;
+ }
+#endif
+ linbox_check( areFieldEqual(A.field(),field()));
+ createBlasMatrix(A,MatrixContainerCategory::BlasContainer());
+ }
+
+ template<class _Field, class _Rep>
+ void BlasMatrix< _Field, _Rep >::createBlasMatrix (const Element * v)
+ {
+ // Element * iter_v = const_cast<Element*>(v) ;
+ Element * v_end = const_cast<Element*>(v+(_col*_row)) ;
+ // Iterator iter_addr = this->Begin();
+ Element * iter_addr = _ptr ;
+ for (; v != v_end ; ++v, ++iter_addr)
+ {
+ field().init(*iter_addr);
+ field().assign(*iter_addr,*v);
+ }
+ }
+
+ template<class _Field, class _Rep>
+ void BlasMatrix< _Field, _Rep >::createBlasMatrix (const std::vector<Element> & v)
+ {
+ typename std::vector< Element>::const_iterator iter_value = v.begin();
+ Iterator iter_addr = this->Begin();
+ for (;iter_value != v.end(); ++iter_value,++iter_addr)
+ {
+ field().init(*iter_addr);
+ field().assign(*iter_addr,*iter_value);
+ }
+ }
+
+
+ template<class _Field, class _Rep>
+ template <class _Matrix>
+ void BlasMatrix< _Field, _Rep >::createBlasMatrix (const _Matrix& A,
+ MatrixContainerCategory::BlasContainer)
+ {
+ // std::cout << "creator 4" << std::endl;
+ linbox_check( areFieldEqual(A.field(),field()));
+#if 0
+ typename _Matrix::ConstIterator iter_value = A.Begin();
+ Iterator iter_addr = this->Begin();
+ for (;iter_value != A.End(); ++iter_value,++iter_addr)
+ {
+ field().init(*iter_addr);
+ field().assign(*iter_addr, *iter_value);
+ }
+#else
+ for (size_t i = 0 ; i < A.rowdim() ; ++i)
+ for (size_t j = 0 ; j < A.coldim() ; ++j)
+ _rep[i*_col+j] = A.getEntry(i,j) ;
+#endif
+ }
+
+ template<class _Field, class _Rep>
+ template <class Matrix>
+ void BlasMatrix< _Field, _Rep >::createBlasMatrix (const Matrix& A,
+ MatrixContainerCategory::Container)
+ {
+ // std::cout << "creator 5" << std::endl;
+ linbox_check( areFieldEqual(A.field(),field()));
+ // const Field & F = A.field();
+ //!@bug With both iterators, it is Segfaulting !!!!
+ typename Matrix::ConstIndexedIterator iter_index = A.IndexedBegin();
+ for (;iter_index != A.IndexedEnd(); ++iter_index)
+ setEntry( iter_index.rowIndex(),
+ iter_index.colIndex(),
+ A.getEntry(iter_index.rowIndex(),iter_index.colIndex())
+ );
+ }
+
+ template<class _Field, class _Rep>
+ template <class Matrix>
+ void BlasMatrix< _Field, _Rep >::createBlasMatrix (const Matrix& A,
+ MatrixContainerCategory::Blackbox)
+ {
+ // std::cout << "creator 6" << std::endl;
+ linbox_check( areFieldEqual(A.field(),field()) );
+
+ BlasVector<Field> e(A.field(),A.coldim(), field().zero), tmp(A.field(),A.rowdim());
+ ColIterator col_p;
+
+ typename BlasMatrix< _Field, _Rep >::Col::iterator elt_p;
+ typename BlasVector<Field>::iterator e_p, tmp_p;
+
+
+ for (col_p = colBegin(), e_p = e.begin();
+ e_p != e.end(); ++ col_p, ++ e_p)
+ {
+
+ field().assign(*e_p, field().one);
+
+ A.apply (tmp, e);
+
+ for (tmp_p = tmp.begin(), elt_p = col_p -> begin();
+ tmp_p != tmp.end(); ++ tmp_p, ++ elt_p)
+
+ field().assign(*elt_p, *tmp_p);
+
+ field().assign(*e_p, field().zero);
+ }
+ }
+
+ template<class _Field, class _Rep>
+ template <class _Matrix>
+ void BlasMatrix< _Field, _Rep >::createBlasMatrix (const _Matrix& A,
+ const size_t i0,const size_t j0,
+ const size_t m, const size_t n,
+ MatrixContainerCategory::Container)
+ {
+ linbox_check( areFieldEqual(A.field(),field() ) );
+
+ typename _Matrix::ConstIterator iter_value = A.Begin();
+ typename _Matrix::ConstIndexedIterator iter_index = A.IndexedBegin();
+
+ for (;iter_value != A.End(); ++iter_value,++iter_index){
+ int i,j;
+ i=(int)iter_index.rowIndex()-(int)i0;
+ j=(int)iter_index.colIndex()-(int)j0;
+ if (( i >= 0) && (j >= 0) && (i< (int)m) && (j < (int)n))
+ setEntry(i, j, *iter_value);
+ }
+ }
+
+ template<class _Field, class _Rep>
+ template <class Matrix>
+ void BlasMatrix< _Field, _Rep >::createBlasMatrix (const Matrix& A,
+ const size_t i0,const size_t j0,
+ const size_t m, const size_t n,
+ MatrixContainerCategory::BlasContainer)
+ {
+ linbox_check( areFieldEqual(A.field(),field() ) );
+
+ typename Matrix::ConstIterator iter_value = A.Begin();
+ typename Matrix::ConstIndexedIterator iter_index = A.IndexedBegin();
+
+ for (;iter_value != A.End(); ++iter_value,++iter_index){
+ int i,j;
+ i=(int)iter_index.rowIndex()-(int)i0;
+ j=(int)iter_index.colIndex()-(int)j0;
+ if ( (i>=0) && (j>=0) && (i< (int)m) && (j < (int)n))
+ setEntry((size_t)i, (size_t)j, *iter_value);
+ }
+ }
+
+ template<class _Field, class _Rep>
+ template <class Matrix>
+ void BlasMatrix< _Field, _Rep >::createBlasMatrix (const Matrix& A,
+ const size_t i0,const size_t j0,
+ const size_t m, const size_t n,
+ MatrixContainerCategory::Blackbox)
+ {
+ linbox_check( areFieldEqual(A.field(),field() ) );
+
+
+ BlasVector<Field> e(A.field(),A.coldim(), field().zero), tmp(A.field(),A.rowdim());
+ ColIterator col_p;
+
+ typename BlasMatrix< _Field, _Rep >::Col::iterator elt_p;
+ typename BlasVector<Element>::iterator e_p, tmp_p;
+
+
+ for (col_p = colBegin(), e_p = e.begin()+(ptrdiff_t)j0;
+ e_p != e.begin()+(ptrdiff_t)(j0+n); ++ col_p, ++ e_p) {
+
+ field().assign(*e_p, field().one);
+
+ A.apply (tmp, e);
+
+ for (tmp_p = tmp.begin()+(ptrdiff_t)i0, elt_p = col_p -> begin();
+ elt_p != col_p.end(); ++ tmp_p, ++ elt_p) {
+ field().assign(*elt_p, *tmp_p);
+ }
+
+ field().assign(*e_p, field().zero);
+ }
+ }
+
+} // LinBox
+
+//////////////////
+// CONSTRUCTORS //
+//////////////////
+
+namespace LinBox
+{
+
+
+ template < class _Field, class _Rep >
+ BlasMatrix< _Field, _Rep >::BlasMatrix (const _Field &F) :
+ _row(0),_col(0),_rep(0)
+ // ,_use_fflas(false)
+ ,_ptr(NULL)
+ ,_field(&F),_MD(F),_VD(F)
+ // ,_AD(F)
+ {
+ //std::cout << "cstor 1 called" << std::endl;
+ _use_fflas = Protected::checkBlasApply(field(),_col);
+ }
+
+#if 0
+ template < class _Field, class _Rep >
+ BlasMatrix< _Field, _Rep >::BlasMatrix () :
+ _row(0),_col(0),_rep(0),_ptr(NULL),
+ _field(Field()),_MD(_field ),_VD(_field )
+ {}
+#endif
+
+ template < class _Field, class _Rep >
+ void BlasMatrix< _Field, _Rep >::init(const _Field &F, const size_t & r, const size_t & c)
+ {
+ _field = &F; _row = r; _col = c;
+ _rep.resize(r*c, F.zero);
+ _ptr = &_rep[0];
+ _VD.init(F); _MD.init(F);
+ // _AD.init(F);
+ }
+
+ template < class _Field, class _Rep >
+ BlasMatrix< _Field, _Rep >::BlasMatrix ( const _Field &F, const size_t & m, const size_t & n) :
+ _row(m),_col(n),_rep(_row*_col, F.zero),_ptr(&_rep[0]),
+ _field(&F),_MD(F),_VD(F)
+ // ,_AD(F)
+ {
+ // std::cout << "cstor 2 called" << std::endl;
+ _use_fflas = Protected::checkBlasApply(field(),_col);
+ }
+
+
+ template < class _Field, class _Rep >
+ BlasMatrix< _Field, _Rep >::BlasMatrix(MatrixStream<_Field>& ms) :
+ _row(0),_col(0),_rep(0),
+ _field(&(ms.getField())),_MD(field() ),_VD(field() )
+ // ,_AD(field())
+ {
+ // std::cout << "cstor 3 called" << std::endl;
+ if( !ms.getArray(_rep) || !ms.getDimensions(_row, _col) )
+ throw ms.reportError(__FUNCTION__,__LINE__);
+ _ptr = &_rep[0];
+ _use_fflas = Protected::checkBlasApply(field(), _col);
+ }
+
+ template < class _Field, class _Rep >
+ template <class StreamVector>
+ BlasMatrix< _Field, _Rep >::BlasMatrix (const Field &F, VectorStream<StreamVector> &stream) :
+ _row(stream.size ()), _col(stream.dim ()), _rep(_row*_col), _ptr(&_rep[0]),
+ _field (&F), _MD (F), _VD(F)
+ // ,_AD(F)
+ {
+ // std::cout << "cstor 4 called" << std::endl;
+ StreamVector tmp(F);
+ typename BlasMatrix<Field,_Rep>::RowIterator p;
+
+ VectorWrapper::ensureDim (tmp, stream.dim ());
+
+ for (p = BlasMatrix<Field,_Rep>::rowBegin (); p != BlasMatrix<Field,_Rep>::rowEnd (); ++p) {
+ stream >> tmp;
+ _VD.copy (*p, tmp);
+ }
+ _use_fflas = Protected::checkBlasApply(field(), _col);
+ }
+
+ template < class _Field, class _Rep >
+ template <class Matrix>
+ BlasMatrix< _Field, _Rep >::BlasMatrix (const Matrix &A) :
+ _row(A.rowdim()),_col(A.coldim()),_rep(_row*_col),_ptr(&_rep[0]),
+ _field(&(A.field())),_MD(field() ),_VD(field() )
+ // ,_AD(field())
+ {
+ // std::cout << "cstor 5 called" << std::endl;
+ // makePointer();
+ _use_fflas = Protected::checkBlasApply(field(), _col);
+ createBlasMatrix(A, typename MatrixContainerTrait<Matrix>::Type());
+ }
+
+ template < class _Field, class _Rep >
+ template <class Matrix>
+ BlasMatrix< _Field, _Rep >::BlasMatrix (const Matrix& A,
+ const size_t &i0, const size_t &j0,
+ const size_t &m, const size_t &n) :
+ _row(m),_col(n),_rep(_row*_col),_ptr(&_rep[0]),
+ _field(&(A.field())),_MD(field() ),_VD(field() )
+ // ,_AD(field())
+ {
+ // std::cout << "cstor 6 called" << std::endl;
+ _use_fflas = Protected::checkBlasApply(field(), _col);
+ // makePointer();
+ createBlasMatrix(A, i0, j0, m, n,
+ typename MatrixContainerTrait<Matrix>::Type());
+ }
+
+ template < class _Field, class _Rep >
+ template<class _Matrix>
+ BlasMatrix< _Field, _Rep >::BlasMatrix (const _Matrix &A, const _Field &F) :
+ _row(A.rowdim()), _col(A.coldim()),_rep(_row*_col),_ptr(&_rep[0]),
+ _field(&F),_MD(field() ),_VD(field() )
+ // ,_AD(field())
+ {
+ // std::cout << "cstor 7 called" << std::endl;
+ _use_fflas = Protected::checkBlasApply(field(), _col);
+ typename _Matrix::template rebind<_Field>()(*this,A);
+ }
+
+ template < class _Field, class _Rep >
+ BlasMatrix< _Field, _Rep >::BlasMatrix (const BlasMatrix< _Field, _Rep >& A) :
+ _row(A.rowdim()), _col(A.coldim()),_rep(_row*_col),_ptr(&_rep[0]),
+ _field(&(A.field())),_MD(field() ),_VD(field() )
+ // ,_AD(field())
+ {
+ // std::cout << "cstor 8 called" << std::endl;
+ _use_fflas = Protected::checkBlasApply(field(), _col);
+ // makePointer();
+ createBlasMatrix(A);
+ }
+
+ template < class _Field, class _Rep >
+ BlasMatrix< _Field, _Rep >::BlasMatrix (const _Field &F,
+ const std::vector<typename _Field::Element>& v,
+ const size_t & m, const size_t & n) :
+ _row(m), _col(n),_rep(_row*_col),_ptr(&_rep[0]),
+ _field(&F),_MD(field() ),_VD(field() )
+ // ,_AD(field())
+ {
+ // std::cout << "cstor 9 called" << std::endl;
+ linbox_check(v.size() == m*n);
+ // makePointer();
+ _use_fflas = Protected::checkBlasApply(field(), _col);
+ createBlasMatrix(v);
+ }
+
+ template < class _Field, class _Rep >
+ BlasMatrix< _Field, _Rep >::BlasMatrix (const _Field &F,
+ const typename _Field::Element * v,
+ const size_t & m, const size_t & n) :
+ _row(m), _col(n),_rep(_row*_col),_ptr(&_rep[0]),
+ _field(&F), _MD(field() ),_VD(field() )
+ // ,_AD(field())
+ {
+ // std::cout << "cstor 10 called" << std::endl;
+ // makePointer();
+ _use_fflas = Protected::checkBlasApply(field(), _col);
+ createBlasMatrix(v);
+ }
+
+ template < class _Field, class _Rep >
+ BlasMatrix< _Field, _Rep >::~BlasMatrix ()
+ {
+ // if (_ptr)
+ // free(_ptr);
+ }
+
+ template < class _Field, class _Rep >
+ void BlasMatrix< _Field, _Rep >::zero()
+ {
+ typename _Field::Element x; field().init(x);
+ for (size_t i = 0; i < rowdim(); ++i)
+ for (size_t j = 0; j < coldim(); ++j)
+ setEntry(i, j, field().zero);
+ }
+
+} // LinBox
+
+///////////////////
+// I/O //
+///////////////////
+
+namespace LinBox
+{
+
+ template < class _Field, class _Rep >
+ std::istream &BlasMatrix< _Field, _Rep >::read (std::istream &file)
+ {
+ MatrixStream<Field> ms(field(), file);
+ if( !ms.getArray(_rep) || !ms.getDimensions(_row, _col) )
+ throw ms.reportError(__FUNCTION__,__LINE__);
+ _ptr = &_rep[0];
+ _use_fflas = Protected::checkBlasApply(field(), _col);
+ return file;
+ }
+
+ template < class _Field, class _Rep >
+ BlasMatrix< _Field, _Rep >& BlasMatrix< _Field, _Rep >::operator= (const BlasMatrix< _Field, _Rep >& A)
+ {
+ if ( &A == this)
+ return *this;
+
+ _col = A.coldim();
+ _row = A.rowdim();
+ _rep = Rep(_row*_col);
+ _ptr = &_rep[0] ;
+ // const_cast<_Field&>(_field ) = A.field();
+ // changeField( A.field() );
+ createBlasMatrix(A);
+
+ return *this;
+ }
+
+#if 0 /* loop rebind */
+ template < class _Field, class _Rep >
+ template<typename _Tp1>
+ struct BlasMatrix< _Field, _Rep >::rebind {
+ typedef BlasMatrix<_Tp1> other;
+
+ void operator() (other & Ap, const Self_t& A, const _Tp1& F) {
+ // typedef typename BlasMatrix< _Field, _Rep >::ConstIndexedIterator ConstIndexedIterator ;
+ // typedef typename BlasMatrix< _Field, _Rep >::ConstIterator ConstIterator ;
+ ConstIterator iter_value = A.Begin();
+ ConstIndexedIterator iter_index = A.IndexedBegin();
+ typename _Tp1::Element tmp;
+ for (;iter_value != A.End(); ++iter_value,++iter_index){
+ Ap.field().init(tmp);
+ Ap.field().assign(tmp, *iter_value);
+ Ap.setEntry(iter_index.rowIndex(), iter_index.colIndex(),tmp);
+ }
+ }
+ };
+#endif
+
+#if 1 /* HOM */
+ //! @bug other rep
+ template < class _Field, class _Rep >
+ template<typename _Tp1>
+ struct BlasMatrix< _Field, _Rep >::rebind {
+ typedef BlasMatrix<_Tp1,typename Vector<_Tp1>::Dense> other;
+
+ void operator() (other & Ap, const Self_t& A) {
+ // typedef Self_t::ConstIterator ConstSelfIterator ;
+ typedef typename BlasMatrix< _Field, _Rep >::ConstIterator ConstSelfIterator ;
+ typedef typename other::Iterator OtherIterator ;
+ OtherIterator Ap_i = Ap.Begin();
+ ConstSelfIterator A_i = A.Begin();
+ Hom<Field, _Tp1> hom(A. field(), Ap. field()) ;
+ for ( ; A_i != A. End(); ++ A_i, ++ Ap_i)
+ hom.image (*Ap_i, *A_i);
+ }
+ };
+#endif
+
+
+} // LinBox
+
+//////////////////
+// DIMENSIONS //
+//////////////////
+
+namespace LinBox
+{
+
+ template < class _Field, class _Rep >
+ size_t BlasMatrix< _Field, _Rep >::rowdim() const
+ {
+ return _row ;
+ }
+
+ template < class _Field, class _Rep >
+ size_t BlasMatrix< _Field, _Rep >::coldim() const
+ {
+ return _col ;
+ }
+
+ template < class _Field, class _Rep >
+ size_t BlasMatrix< _Field, _Rep >::getStride() const
+ {
+ return _col;
+ }
+
+ template < class _Field, class _Rep >
+ size_t& BlasMatrix< _Field, _Rep >::getWriteStride()
+ {
+ return _col;
+ }
+
+ template < class _Field, class _Rep >
+ void BlasMatrix< _Field, _Rep >::resize (const size_t & m, const size_t & n, const Element& val )
+ {
+#ifndef NDEBUG
+ if (_col > 0 && _col != n)
+ std::cerr << " ***Warning*** you are resizing a matrix, possibly loosing data. " << std::endl;
+#endif
+ _row = m;
+ _col = n;
+ _rep.resize (m * n, val);
+ _ptr = (m*n == 0 ? 0 : &_rep[0]);
+#if 0
+ if (_ptr) {
+ if (m && n)
+ realloc(_ptr,m*n*sizeof(Element));
+ else {
+ free(_ptr);
+ _ptr=NULL ;
+ }
+ }
+ else
+ makePointer();
+#endif
+ }
+
+} // LinBox
+
+//////////////////
+// ELEMENTS //
+//////////////////
+
+namespace LinBox
+{
+
+
+ template < class _Field, class _Rep >
+ typename BlasMatrix< _Field, _Rep >::pointer
+ BlasMatrix< _Field, _Rep >::getPointer() const
+ {
+ return _ptr;
+ }
+
+ template < class _Field, class _Rep >
+ typename BlasMatrix< _Field, _Rep >::const_pointer &
+ BlasMatrix< _Field, _Rep >::getConstPointer() const
+ {
+ return (const_pointer)_ptr;
+ }
+
+
+ template < class _Field, class _Rep >
+ typename BlasMatrix< _Field, _Rep >::pointer&
+ BlasMatrix< _Field, _Rep >::getWritePointer()
+ {
+ return _ptr;
+ }
+
+ template < class _Field, class _Rep >
+ void BlasMatrix< _Field, _Rep >::setEntry (size_t i, size_t j, const Element &a_ij)
+ {
+ _ptr[i * _col + j] = a_ij;
+ }
+
+ template < class _Field, class _Rep >
+ typename _Field::Element & BlasMatrix< _Field, _Rep >::refEntry (size_t i, size_t j)
+ {
+ return _ptr[i * _col + j];
+ }
+
+ template < class _Field, class _Rep >
+ const typename _Field::Element & BlasMatrix< _Field, _Rep >::getEntry (size_t i, size_t j) const
+ {
+ return _rep[i * _col + j];
+ }
+
+ template < class _Field, class _Rep >
+ typename _Field::Element & BlasMatrix< _Field, _Rep >::getEntry (Element &x, size_t i, size_t j) const
+ {
+ return x = _rep[i * _col + j];
+ }
+
+} // LinBox
+
+///////////////////
+// TRANSPOSE &AL //
+///////////////////
+
+namespace LinBox
+{
+ template < class _Field, class _Rep >
+ BlasMatrix< _Field, _Rep > BlasMatrix< _Field, _Rep >::transpose(BlasMatrix< _Field, _Rep > & tM) const
+ {
+ size_t r = this->rowdim() ;
+ size_t c = this->coldim() ;
+ linbox_check(tM.coldim() == r );
+ linbox_check(tM.rowdim() == c);
+ for (size_t i = 0 ; i < r ; ++i)
+ for (size_t j = 0 ; j < c ; ++j)
+ tM.setEntry(j,i,this->getEntry(i,j));
+ return tM;
+ }
+
+ namespace Protected
+ {
+ /*! @internal
+ * @brief In-Place Tranpose.
+ * Adapted from the Wikipedia article.
+ * @todo make it for strides and Submatrices
+ * @todo use specialized versions when available (eg dgetmi)
+ * @todo make transpose have an inplace=true default parameter
+ * (execpt maybe when below a threshold).
+ * @param m pointer to the beginning of a row-major matrix vector
+ * @param w rows in the matrix
+ * @param h cols in the matrix
+ */
+ template<class T>
+ void transposeIP(T *m, size_t h, size_t w)
+ {
+ size_t start;
+ T tmp;
+
+ for (start = 0; start <= w * h - 1; ++start) {
+ size_t next, i ;
+ next = start;
+ i = 0;
+ do {
+ ++i;
+ next = (next % h) * w + next / h;
+ } while (next > start);
+ if (next < start || i == 1)
+ continue;
+
+ tmp = m[next = start];
+ do {
+ i = (next % h) * w + next / h;
+ m[next] = (i == start) ? tmp : m[i];
+ next = i;
+ } while (next > start);
+ }
+ }
+ } // Protected
+
+ template < class _Field, class _Rep >
+ template<bool _IP>
+ void BlasMatrix< _Field, _Rep >::transpose()
+ {
+ size_t r = this->rowdim() ;
+ size_t c = this->coldim() ;
+
+ if ( r == c) {
+ for (size_t i = 0 ; i < r ; ++i)
+ for (size_t j = i+1 ; j < c ; ++j)
+ std::swap(this->refEntry(i,j),this->refEntry(j,i));
+ }
+ else {
+ if (!_IP) {
+ BlasMatrix< _Field, _Rep > MM(*this);
+ std::swap(_row,_col);
+ // iterating row first seems faster.
+#ifdef _BLOCKIT
+ size_t B ;
+ B = 1024;
+
+ for (size_t bi = 0 ; bi < r/B ; ++bi) {
+ for (size_t bj = 0 ; bj < c/B ; ++bj){
+ for (size_t i = 0 ; i < B ; ++i)
+ for (size_t j = 0 ; j < B ; ++j)
+ this->setEntry(bj*B+j,bi*B+i,
+ MM.getEntry(bi*B+i,bj*B+j));
+ }
+ }
+ for (size_t i = r/B*B ; i < r ; ++i)
+ for (size_t j = c/B*B ; j < c ; ++j)
+ this->setEntry(j,i,
+ MM.getEntry(i,j));
+#else
+ for (size_t i = 0 ; i < r ; ++i)
+ for (size_t j = 0 ; j < c ; ++j)
+ this->setEntry(j,i,
+ MM.getEntry(i,j));
+#endif
+
+ }
+ else {
+ Protected::transposeIP<Element>(_ptr,_row,_col);
+ std::swap(_row,_col);
+ }
+ }
+ }
+
+ template < class _Field, class _Rep >
+ void BlasMatrix< _Field, _Rep >::transpose()
+ {
+ this->transpose<false>();
+ }
+
+ template < class _Field, class _Rep >
+ void BlasMatrix< _Field, _Rep >::reverseRows()
+ {
+ size_t r = this->rowdim()/2 ;
+ for (size_t i = 0 ; i < r ; ++i) {
+ _VD.swap( this->rowBegin()+i,
+ this->rowBegin()+(r-1-i) );
+ }
+
+ }
+
+ template < class _Field, class _Rep >
+ void BlasMatrix< _Field, _Rep >::reverseCols()
+ {
+ size_t r = this->rowdim() ;
+ size_t c = this->coldim()/2 ;
+ for (size_t j = 0 ; j < c ; ++j) {
+ for (size_t i = 0 ; i < r ; ++i) {
+ std::swap(this->refEntry(i,j),
+ this->refEntry(i,c-j-1));
+
+ }
+ }
+ }
+
+ template < class _Field, class _Rep >
+ void BlasMatrix< _Field, _Rep >::reverse()
+ {
+ size_t r = this->rowdim() ;
+ size_t c = this->coldim() ;
+ for (size_t j = 0 ; j < c ; ++j) {
+ for (size_t i = 0 ; i < r ; ++i) {
+ std::swap(this->refEntry(i,j),
+ this->refEntry(r-i-1,c-j-1));
+
+ }
+ }
+ }
+} // LinBox
+
+///////////////////
+// ITERATORS //
+///////////////////
+
+namespace LinBox
+{
+
+ template < class _Field, class _Rep >
+ class BlasMatrix< _Field, _Rep >::ConstRowIterator {
+ public:
+ ConstRowIterator (const typename Rep::const_iterator& p, size_t len, size_t d) :
+ _row (p, p + (ptrdiff_t)len), _dis (d)
+ {}
+
+ ConstRowIterator () {}
+
+ ConstRowIterator (const ConstRowIterator& colp) :
+ _row (colp._row), _dis (colp._dis)
+ {}
+
+ ConstRowIterator& operator = (const ConstRowIterator& colp)
+ {
+ _row = colp._row;
+ _dis = colp._dis;
+ return *this;
+ }
+
+ ConstRowIterator& operator --()
+ {
+ _row = ConstRow (_row.begin () - (ptrdiff_t)_dis, _row.end () - (ptrdiff_t)_dis);
+ return *this;
+ }
+
+ ConstRowIterator operator-- (int)
+ {
+ ConstRowIterator tmp (*this);
+ --*this;
+ return tmp;
+ }
+
+
+ ConstRowIterator& operator++ ()
+ {
+ _row = ConstRow (_row.begin () + (ptrdiff_t)_dis, _row.end () + (ptrdiff_t) _dis);
+ return *this;
+ }
+
+ ConstRowIterator operator++ (int)
+ {
+ ConstRowIterator tmp (*this);
+ ++*this;
+ return tmp;
+ }
+
+ ConstRowIterator operator+ (int i)
+ {
+ return ConstRowIterator (_row.begin () + (ptrdiff_t)((int)_dis * i), _row.size (), _dis);
+ }
+
+ ConstRowIterator& operator += (int i)
+ {
+ _row = ConstRow (_row.begin () + (ptrdiff_t)((int)_dis * i), _row.end () + (ptrdiff_t)((int)_dis * i));
+ return *this;
+ }
+
+ ConstRow operator[] (int i) const
+ {
+ return ConstRow (_row.begin () + (ptrdiff_t)((int)_dis * i), _row.end () + (ptrdiff_t)((int)_dis * i));
+ }
+
+ ConstRow* operator-> ()
+ {
+ return &_row;
+ }
+
+ ConstRow& operator* ()
+ {
+ return _row;
+ }
+
+ bool operator!= (const ConstRowIterator& c) const
+ {
+ return (_row.begin () != c._row.begin ()) || (_row.end () != c._row.end ()) || (_dis != c._dis);
+ }
+
+ private:
+ ConstRow _row;
+ size_t _dis;
+ };
+
+ template < class _Field, class _Rep >
+ class BlasMatrix< _Field, _Rep >::RowIterator {
+ public:
+ RowIterator (const typename Rep::iterator& p, size_t len, size_t d) :
+ _row (p, p + (ptrdiff_t)len), _dis (d)
+ {}
+
+ RowIterator () {}
+
+ RowIterator (const RowIterator& colp) :
+ _row (colp._row), _dis (colp._dis)
+ {}
+
+ RowIterator& operator = (const RowIterator& colp)
+ {
+ _row = colp._row;
+ _dis = colp._dis;
+ return *this;
+ }
+
+ RowIterator& operator ++ ()
+ {
+ _row = Row (_row.begin () + (ptrdiff_t)_dis, _row.end () + (ptrdiff_t)_dis);
+ return *this;
+ }
+
+ RowIterator operator ++ (int)
+ {
+ RowIterator tmp (*this);
+ ++*this;
+ return tmp;
+ }
+
+ RowIterator& operator -- ()
+ {
+ _row = Row (_row.begin () - (ptrdiff_t)_dis, _row.end () - (ptrdiff_t)_dis);
+ return *this;
+ }
+
+ RowIterator operator -- (int)
+ {
+ RowIterator tmp (*this);
+ --*this;
+ return tmp;
+ }
+
+ RowIterator operator + (int i)
+ {
+ return RowIterator (_row.begin () + (ptrdiff_t)((int)_dis * i), _row.size (), _dis);
+ }
+
+ RowIterator& operator += (int i)
+ {
+ _row = Row (_row.begin () + (ptrdiff_t)((int)_dis * i), _row.end () + (ptrdiff_t)((int)_dis * i));
+ return *this;
+ }
+
+ Row operator[] (int i) const
+ {
+ return Row (const_cast<Row&> (_row).begin () + (ptrdiff_t)((int)_dis * i),
+ const_cast<Row&> (_row).end () + (ptrdiff_t)((int)_dis * i));
+ }
+
+ Row* operator-> ()
+ {
+ return &(this->_row);
+ }
+
+ Row& operator* ()
+ {
+ return _row;
+ }
+
+ bool operator!= (const RowIterator& c) const
+ {
+ return (_row.begin () != c._row.begin ()) || (_row.end () != c._row.end ()) || (_dis != c._dis);
+ }
+
+ operator ConstRowIterator ()
+ {
+ return ConstRowIterator (_row.begin (), _row.size (), _dis);
+ }
+
+ private:
+ Row _row;
+ size_t _dis;
+ };
+
+ template < class _Field, class _Rep >
+ class BlasMatrix< _Field, _Rep >::ConstColIterator {
+ public:
+ ConstColIterator (typename Rep::const_iterator p, size_t stride, size_t len) :
+ _col (Subiterator<typename Rep::const_iterator> (p, (ptrdiff_t)stride),
+ Subiterator<typename Rep::const_iterator> (p + (ptrdiff_t)(len * stride), (ptrdiff_t)stride)),
+ _stride (stride)
+ {}
+
+ ConstColIterator (const ConstCol& col, size_t stride) :
+ _col (col),
+ _stride (stride)
+ {}
+
+ ConstColIterator () {}
+
+ ConstColIterator (const ConstColIterator& rowp) :
+ _col (rowp._col)
+ {}
+
+ ConstColIterator& operator= (const ConstColIterator& rowp)
+ {
+ _col = rowp._col;
+ _stride = rowp._stride;
+ return *this;
+ }
+
+ ConstColIterator& operator++ ()
+ {
+ _col = ConstCol (Subiterator<typename Rep::const_iterator> (_col.begin ().operator-> () + 1, (ptrdiff_t)_stride),
+ Subiterator<typename Rep::const_iterator> (_col.end ().operator-> () + 1, (ptrdiff_t)_stride));
+ return *this;
+ }
+
+ ConstColIterator operator++ (int)
+ {
+ ConstColIterator old(*this);
+ this->operator++ ();
+ return old;
+ }
+
+ ConstColIterator operator + (int i)
+ {
+ return ConstColIterator (_col.begin ().operator-> () + i, _stride, _col.size ());
+ }
+
+ ConstColIterator& operator += (int i)
+ {
+ _col = ConstCol (Subiterator<typename Rep::const_iterator> (_col.begin ().operator-> () + i, _stride),
+ Subiterator<typename Rep::const_iterator> (_col.end ().operator-> () + i, _stride));
+ return *this;
+ }
+
+ ConstCol operator[] (int i) const
+ {
+ return ConstCol (Subiterator<typename Rep::const_iterator> (_col.begin ().operator-> () + i, _stride),
+ Subiterator<typename Rep::const_iterator> (_col.end ().operator-> () + i, _stride));
+ }
+
+ ConstCol* operator-> ()
+ {
+ return &_col;
+ }
+
+ ConstCol& operator* ()
+ {
+ return _col;
+ }
+
+ bool operator!= (const ConstColIterator& c) const
+ {
+ return (_col.begin () != c._col.begin ()) || (_col.end () != c._col.end ());
+ }
+
+ private:
+ ConstCol _col;
+ size_t _stride;
+ };
+
+ template < class _Field, class _Rep >
+ class BlasMatrix< _Field, _Rep >::ColIterator {
+ public:
+ ColIterator (typename Rep::iterator p, size_t stride, size_t len) :
+ _col (Subiterator<typename Rep::iterator> (p, (long)stride),
+ Subiterator<typename Rep::iterator> (p + (ptrdiff_t)(len * stride),(long) stride)), _stride (stride)
+ {}
+
+ ColIterator () {}
+
+ ColIterator (const ColIterator& rowp) :
+ _col (rowp._col)
+ {}
+
+ ColIterator& operator= (const ColIterator& rowp)
+ {
+ _col = rowp._col;
+ _stride = rowp._stride;
+ return *this;
+ }
+
+ const ColIterator& operator= (const ColIterator& rowp) const
+ {
+ const_cast<ColIterator*> (this)->_col = rowp._col;
+ return *this;
+ }
+
+ ColIterator& operator++ ()
+ {
+ _col = Col (Subiterator<typename Rep::iterator> (_col.begin ().operator-> () + 1, (const long)_stride),
+ Subiterator<typename Rep::iterator> (_col.end ().operator-> () + 1,(const long) _stride));
+ return *this;
+ }
+
+ ColIterator operator++ (int)
+ {
+ Col tmp (_col);
+ this->operator++ ();
+ return tmp;
+ }
+
+ ColIterator operator + (int i)
+ {
+ return ColIterator (_col.begin ().operator-> () + i, _stride, _col.size ());
+ }
+
+ ColIterator& operator += (int i)
+ {
+ _col = Col (Subiterator<typename Rep::iterator> (_col.begin ().operator-> () + i, _stride),
+ Subiterator<typename Rep::iterator> (_col.end ().operator-> () + i, _stride));
+ return *this;
+ }
+
+ Col operator[] (int i) const
+ {
+ return Col (Subiterator<typename Rep::iterator> (const_cast<Col&> (_col).begin ().operator-> () + i, _stride),
+ Subiterator<typename Rep::iterator> (const_cast<Col&> (_col).end ().operator-> () + i, _stride));
+ }
+
+ Col* operator-> ()
+ {
+ return &(this->_col);
+ }
+
+ Col& operator* ()
+ {
+ return _col;
+ }
+
+ bool operator!= (const ColIterator& c) const
+ {
+ return (_col.begin () != c._col.begin ()) || (_col.end () != c._col.end ());
+ }
+
+ operator ConstColIterator ()
+ {
+ return ConstColIterator (reinterpret_cast<ConstCol&> (_col) , _stride);
+ }
+
+ private:
+
+ Col _col;
+ size_t _stride;
+ };
+
+ /*! Indexed Iterator.
+ * @ingroup iterators
+ * @brief NO DOC
+ */
+ template < class _Field, class _Rep >
+ class BlasMatrix< _Field, _Rep >::IndexedIterator {
+ size_t _r_index;
+ size_t _c_index;
+ size_t _dim;
+ typename Rep::iterator _begin;
+ typedef typename _Field::Element value_type;
+
+ public:
+ IndexedIterator (const size_t &dim,
+ const size_t &r_index,
+ const size_t &c_index,
+ const typename Rep::iterator &begin) :
+ _r_index (r_index), _c_index (c_index), _dim (dim), _begin (begin)
+ {}
+
+ IndexedIterator () :
+ _r_index (0), _c_index (0), _dim (1), _begin (0)
+ {}
+
+ IndexedIterator (const IndexedIterator& r) :
+ _r_index (r._r_index), _c_index (r._c_index), _dim (r._dim), _begin (r._begin)
+ {}
+
+ IndexedIterator& operator = (const IndexedIterator &iter)
+ {
+ _r_index = iter._r_index;
+ _c_index = iter._c_index;
+ _dim = iter._dim;
+ _begin = iter._begin;
+ return *this;
+ }
+
+ bool operator == (const IndexedIterator &iter) const
+ {
+ return (_r_index == iter._r_index) &&
+ (_c_index == iter._c_index) &&
+ (_dim == iter._dim) &&
+ (_begin==iter._begin);
+ }
+
+ bool operator != (const IndexedIterator& iter) const
+ {
+ return (_r_index != iter._r_index) ||
+ (_c_index != iter._c_index) ||
+ (_dim != iter._dim) ||
+ (_begin!=iter._begin);
+ }
+
+ IndexedIterator &operator ++ ()
+ {
+ ++_c_index;
+
+ if (_c_index == _dim) {
+ _c_index = 0;
+ ++_r_index;
+ }
+
+ return *this;
+ }
+
+
+ IndexedIterator operator ++ (int)
+ {
+ IndexedIterator tmp = *this;
+ ++(*this);
+ return tmp;
+ }
+
+ IndexedIterator &operator -- ()
+ {
+ if (_c_index)
+ --_c_index;
+ else {
+ --_r_index;
+ _c_index = _dim - 1;
+ }
+
+ return *this;
+ }
+
+
+ IndexedIterator operator -- (int)
+ {
+ IndexedIterator tmp = *this;
+ --(*this);
+ return tmp;
+ }
+
+ value_type &operator * () const
+ {
+ return *(_begin +(ptrdiff_t) (_r_index * _dim + _c_index));
+ }
+
+
+ value_type * operator -> () const
+ {
+ return _begin + (ptrdiff_t)(_r_index * _dim + _c_index);
+ }
+
+
+ size_t rowIndex () const
+ {
+ return _r_index;
+ }
+
+ size_t colIndex () const
+ {
+ return _c_index;
+ }
+
+ const value_type &value () const
+ {
+ return *(_begin + (ptrdiff_t)(_r_index * _dim + _c_index));
+ }
+
+
+ };
+
+ template < class _Field, class _Rep >
+ class BlasMatrix< _Field, _Rep >::ConstIndexedIterator {
+ size_t _r_index;
+ size_t _c_index;
+ size_t _dim;
+ typedef typename _Field::Element value_type;
+ typename Rep::const_iterator _begin;
+
+ public:
+ ConstIndexedIterator (const size_t &my_dim,
+ const size_t &r_index,
+ const size_t &c_index,
+ const typename Rep::const_iterator &begin) :
+ _r_index (r_index), _c_index (c_index), _dim (my_dim), _begin (begin)
+ {}
+
+ ConstIndexedIterator () :
+ _r_index (0), _c_index (0), _dim (1), _begin (0)
+ {}
+
+ ConstIndexedIterator (const ConstIndexedIterator& r) :
+ _r_index (r._r_index), _c_index (r._c_index), _dim (r._dim), _begin (r._begin)
+ {}
+
+ ConstIndexedIterator& operator = (const ConstIndexedIterator &iter)
+ {
+ _r_index = iter._r_index;
+ _c_index = iter._c_index;
+ _dim = iter._dim;
+ _begin = iter._begin;
+ return *this;
+ }
+
+ bool operator == (const ConstIndexedIterator &iter) const
+ {
+ return (_r_index == iter._r_index) &&
+ (_c_index == iter._c_index) &&
+ (_dim == iter._dim) &&
+ (_begin==iter._begin);
+ }
+
+ bool operator != (const ConstIndexedIterator& iter) const
+ {
+ return (_r_index != iter._r_index) ||
+ (_c_index != iter._c_index) ||
+ (_dim != iter._dim) ||
+ (_begin!=iter._begin);
+ }
+
+ ConstIndexedIterator &operator ++ ()
+ {
+ ++_c_index;
+
+ if (_c_index == _dim) {
+ _c_index = 0;
+ ++_r_index;
+ }
+
+ return *this;
+ }
+
+
+ ConstIndexedIterator operator ++ (int)
+ {
+ ConstIndexedIterator tmp = *this;
+ ++(*this);
+ return tmp;
+ }
+
+ ConstIndexedIterator &operator -- ()
+ {
+ if (_c_index)
+ --_c_index;
+ else {
+ --_r_index;
+ _c_index = _dim - 1;
+ }
+
+ return *this;
+ }
+
+ ConstIndexedIterator operator -- (int)
+ {
+ ConstIndexedIterator tmp = *this;
+ --(*this);
+ return tmp;
+ }
+
+ const value_type &operator * () const
+ {
+ return *(_begin + (ptrdiff_t)(_r_index * _dim + _c_index));
+ }
+
+ const value_type *operator -> () const
+ {
+ return _begin + (ptrdiff_t)(_r_index * _dim + _c_index);
+ }
+
+ size_t rowIndex () const
+ {
+ return _r_index;
+ }
+
+ size_t colIndex () const
+ {
+ return _c_index;
+ }
+
+ const value_type &value() const
+ {
+ return *(_begin + (ptrdiff_t)(_r_index * _dim + _c_index));
+ }
+ };
+
+ /* */
+
+ // Entry access view. Size m*n vector in C (row major) order.
+ template < class _Field, class _Rep >
+ typename BlasMatrix< _Field, _Rep >::Iterator BlasMatrix< _Field, _Rep >::Begin ()
+ {
+ return _rep.begin ();
+ }
+
+ template < class _Field, class _Rep >
+ typename BlasMatrix< _Field, _Rep >::Iterator BlasMatrix< _Field, _Rep >::End ()
+ {
+ return _rep.end ();
+ }
+
+ template < class _Field, class _Rep >
+ typename BlasMatrix< _Field, _Rep >::ConstIterator BlasMatrix< _Field, _Rep >::Begin () const
+ {
+ return _rep.begin ();
+ }
+
+ template < class _Field, class _Rep >
+ typename BlasMatrix< _Field, _Rep >::ConstIterator BlasMatrix< _Field, _Rep >::End () const
+ {
+ return _rep.end ();
+ }
+
+ /* Indexed */
+
+ template < class _Field, class _Rep >
+ typename BlasMatrix< _Field, _Rep >::IndexedIterator BlasMatrix< _Field, _Rep >::IndexedBegin ()
+ {
+ return IndexedIterator (coldim (), 0, 0, _rep.begin ());
+ }
+
+ template < class _Field, class _Rep >
+ typename BlasMatrix< _Field, _Rep >::IndexedIterator BlasMatrix< _Field, _Rep >::IndexedEnd ()
+ {
+ return IndexedIterator (coldim (), rowdim (), 0, _rep.begin ());
+ }
+
+ template < class _Field, class _Rep >
+ typename BlasMatrix< _Field, _Rep >::ConstIndexedIterator BlasMatrix< _Field, _Rep >::IndexedBegin () const
+ {
+ return ConstIndexedIterator (coldim (), 0, 0, _rep.begin ());
+ }
+
+ template < class _Field, class _Rep >
+ typename BlasMatrix< _Field, _Rep >::ConstIndexedIterator BlasMatrix< _Field, _Rep >::IndexedEnd () const
+ {
+ return ConstIndexedIterator (coldim (), rowdim (), 0, _rep.begin ());
+ }
+
+ /* Row */
+
+ template < class _Field, class _Rep >
+ typename BlasMatrix< _Field, _Rep >::RowIterator BlasMatrix< _Field, _Rep >::rowBegin ()
+ {
+ return RowIterator (_rep.begin (), _col, _col);
+ }
+
+ template < class _Field, class _Rep >
+ typename BlasMatrix< _Field, _Rep >::RowIterator BlasMatrix< _Field, _Rep >::rowEnd ()
+ {
+ return RowIterator (_rep.end (), _col, _col);
+ }
+
+ template < class _Field, class _Rep >
+ typename BlasMatrix< _Field, _Rep >::ConstRowIterator BlasMatrix< _Field, _Rep >::rowBegin () const
+ {
+ return ConstRowIterator (_rep.begin (), _col, _col);
+ }
+
+ template < class _Field, class _Rep >
+ typename BlasMatrix< _Field, _Rep >::ConstRowIterator BlasMatrix< _Field, _Rep >::rowEnd () const
+ {
+ return ConstRowIterator (_rep.end (), _col, _col);
+ }
+
+ /* Col */
+
+ template < class _Field, class _Rep >
+ typename BlasMatrix< _Field, _Rep >::ColIterator BlasMatrix< _Field, _Rep >::colBegin ()
+ {
+ return typename BlasMatrix< _Field, _Rep >::ColIterator (_rep.begin (), _col, _row);
+ }
+
+ template < class _Field, class _Rep >
+ typename BlasMatrix< _Field, _Rep >::ColIterator BlasMatrix< _Field, _Rep >::colEnd ()
+ {
+ return typename BlasMatrix< _Field, _Rep >::ColIterator (_rep.begin ()+(ptrdiff_t)_col, _col, _row);
+ }
+
+ template < class _Field, class _Rep >
+ typename BlasMatrix< _Field, _Rep >::ConstColIterator BlasMatrix< _Field, _Rep >::colBegin () const
+ {
+ return typename BlasMatrix< _Field, _Rep >::ConstColIterator (_rep.begin (), _col, _row);
+ }
+
+ template < class _Field, class _Rep >
+ typename BlasMatrix< _Field, _Rep >::ConstColIterator BlasMatrix< _Field, _Rep >::colEnd () const
+ {
+ return typename BlasMatrix< _Field, _Rep >::ConstColIterator (_rep.begin ()+(ptrdiff_t)_col, _col, _row);
+ }
+
+ /* operators */
+ template < class _Field, class _Rep >
+ typename BlasMatrix< _Field, _Rep >::Row BlasMatrix< _Field, _Rep >::operator[] (size_t i)
+ {
+ return Row (_rep.begin () +(ptrdiff_t)( i * _col), _rep.begin () + (ptrdiff_t)(i * _col +_col));
+ }
+
+ template < class _Field, class _Rep >
+ typename BlasMatrix< _Field, _Rep >::ConstRow BlasMatrix< _Field, _Rep >::operator[] (size_t i) const
+ {
+ return Row (_rep.begin () +(ptrdiff_t) (i * _col), _rep.begin () + (ptrdiff_t)( i * _col + _col));
+ }
+
+} // LinBox
+
+//////////////////
+// MISC //
+//////////////////
+
+namespace LinBox
+{
+ template < class _Field, class _Rep >
+ template <class Vector>
+ Vector& BlasMatrix< _Field, _Rep >::columnDensity (Vector &v) const
+ {
+ std::fill (v.begin (), v.end (), _row);
+ return v;
+ }
+
+} // LinBox
+
+///////////////////
+// BLACK BOX //
+///////////////////
+
+namespace LinBox
+{
+#if 1
+ template < class _Field, class _Rep >
+ template <class Vector1, class Vector2>
+ Vector1& BlasMatrix< _Field, _Rep >::apply (Vector1& y, const Vector2& x) const
+ {
+ // std::cout << "prepare apply1 Matrix" << std::endl;
+ BlasSubmatrix<constSelf_t> A(*this);
+ // std::cout << "...................." << std::endl;
+ A.apply(y,x);
+ // std::cout << ".......done........." << std::endl;
+ return y;
+ }
+#endif
+
+#if 1
+ template < class _Field, class _Rep >
+ template<class _Vrep>
+ BlasVector<_Field,_Vrep>& BlasMatrix< _Field, _Rep >::apply (BlasVector<_Field,_Vrep>& y, const BlasVector<_Field,_Vrep>& x) const
+ {
+ // std::cout << "prepare apply2 Matrix" << std::endl;
+ BlasSubmatrix<constSelf_t> A(*this);
+ // std::cout << "...................." << std::endl;
+ A.apply(y,x);
+ // std::cout << ".......done........." << std::endl;
+
+ return y;
+ }
+#endif
+
+ template < class _Field, class _Rep >
+ template <class Vector1, class Vector2>
+ Vector1& BlasMatrix< _Field, _Rep >::applyTranspose (Vector1& y, const Vector2& x) const
+ {
+ // std::cout << "prepare applyT Matrix" << std::endl;
+ BlasSubmatrix<constSelf_t> A(*this);
+ // std::cout << "...................." << std::endl;
+ A.applyTranspose(y,x);
+ // std::cout << ".......done........." << std::endl;
+
+ return y;
+ }
+
+ template < class _Field, class _Rep >
+ const _Field& BlasMatrix< _Field, _Rep >::field() const
+ {
+ return *_field;
+ }
+
+#if 0 /* why not ? */
+ template < class _Field, class _Rep >
+ _Field& BlasMatrix< _Field, _Rep >::field()
+ {
+ return const_cast<_Field&>(_field );
+ }
+#endif
+}
+
+
+#endif // __LINBOX_densematrix_blas_matrix_INL
+
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/matrix/densematrix/blas-submatrix.inl b/linbox/matrix/densematrix/blas-submatrix.inl
new file mode 100644
index 0000000..aa5234a
--- /dev/null
+++ b/linbox/matrix/densematrix/blas-submatrix.inl
@@ -0,0 +1,1239 @@
+/*
+ * Copyright (C) 2004 Pascal Giorgi, Clément Pernet
+ * 2013, 2014 the LinBox group
+ *
+ * Written by :
+ * Pascal Giorgi <pascal.giorgi at ens-lyon.fr>
+ * Clément Pernet <clement.pernet at imag.fr>
+ * Brice Boyer (briceboyer) <boyer.brice at gmail.com>
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ * ========LICENCE========
+ */
+
+/*!@internal
+ * @file matrix/densematrix/blas-matrix.inl
+ * @ingroup densematrix
+ * A \c BlasMatrix<\c _Field > represents a matrix as an array of
+ * <code>_Field</code>s.
+ */
+
+#ifndef __LINBOX_densematrix_blas_submatrix_INL
+#define __LINBOX_densematrix_blas_submatrix_INL
+
+/////////////////
+// PRIVATE //
+/////////////////
+
+namespace LinBox
+{
+}
+
+//////////////////
+// CONSTRUCTORS //
+//////////////////
+
+namespace LinBox
+{
+#if 0
+ template < class _Matrix >
+ BlasSubmatrix<_Matrix>::BlasSubmatrix () :
+ _Mat(NULL),_row(0),_col(0),_r0(0),_c0(0),_stride(0),_off(0)
+ {
+ }
+#endif
+
+ template < class _Matrix >
+ BlasSubmatrix<_Matrix>::BlasSubmatrix (typename BlasSubmatrix<_Matrix>::matrixType &Mat,
+ size_t row,
+ size_t col,
+ size_t Rowdim,
+ size_t Coldim) :
+ _Mat (Mat),
+ _row (Rowdim), _col(Coldim),
+ _r0(row),_c0(col),
+ _stride(Mat.coldim()),_off(row*_stride+col)
+ ,_AD(Mat.field())
+ ,_VD(Mat.field())
+ {
+ // std::cout << "sub cstor 0 called" << std::endl;
+ linbox_check ( _r0 <= Mat.rowdim() ); // allow for NULL matrix
+ linbox_check ( _c0 <= Mat.coldim() );
+ // linbox_check ( _row <= Mat.rowdim() );
+ linbox_check ( _off <= Mat.rowdim()*Mat.coldim() );
+ linbox_check ( _col <= Mat.coldim() );
+ }
+
+ template < class _Matrix >
+ BlasSubmatrix<_Matrix>::BlasSubmatrix (typename BlasSubmatrix<_Matrix>::constMatrixType &Mat,
+ size_t row,
+ size_t col,
+ size_t Rowdim,
+ size_t Coldim) :
+ _Mat (Mat),
+ _row (Rowdim), _col(Coldim),
+ _r0(row),_c0(col),
+ _stride(Mat.coldim()),_off(row*_stride+col)
+ ,_AD(Mat.field())
+ ,_VD(Mat.field())
+ {
+ // std::cout << "sub const cstor 0 called" << std::endl;
+ linbox_check ( _r0 <= Mat.rowdim() ); // allow for NULL matrix
+ linbox_check ( _c0 <= Mat.coldim() );
+ // linbox_check ( _row <= Mat.rowdim() );
+ linbox_check ( _off <= Mat.rowdim()*Mat.coldim() );
+ linbox_check ( _col <= Mat.coldim() );
+ }
+
+
+ template < class _Matrix >
+ BlasSubmatrix<_Matrix>::BlasSubmatrix (typename BlasSubmatrix<_Matrix>::matrixType &Mat) :
+ _Mat (Mat),
+ _row(Mat.rowdim()), _col(Mat.coldim()),
+ _r0(0), _c0(0),
+ _stride(Mat.coldim()),_off(0)
+ ,_AD(Mat.field())
+ ,_VD(Mat.field())
+ {
+ // std::cout << "sub cstor 2 called" << std::endl;
+ }
+
+ template < class _Matrix >
+ BlasSubmatrix<_Matrix>::BlasSubmatrix (typename BlasSubmatrix<_Matrix>::constMatrixType &Mat) :
+ _Mat (Mat),
+ _row(Mat.rowdim()), _col(Mat.coldim()),
+ _r0(0), _c0(0),
+ _stride(Mat.coldim()),_off(0)
+ ,_AD(Mat.field())
+ ,_VD(Mat.field())
+ {
+ // std::cout << "sub const cstor 2 called" << std::endl;
+ }
+
+ template < class _Matrix >
+ BlasSubmatrix<_Matrix>::BlasSubmatrix (typename BlasSubmatrix<_Matrix>::constSubMatrixType &SM,
+ size_t row,
+ size_t col,
+ size_t Rowdim,
+ size_t Coldim) :
+ _Mat (SM._Mat),
+ _row ( Rowdim ), _col ( Coldim ) ,
+ _r0 ( SM._r0 + row ), _c0 ( SM._c0 + col ),
+ _stride(SM._stride),_off(SM._off+(row*_stride+col))
+ ,_AD(SM.field())
+ ,_VD(SM.field())
+ {
+ // std::cout << "sub const cstor 3 called" << std::endl;
+ linbox_check ( _r0 <= SM._Mat.rowdim() ); // allow for NULL matrix
+ linbox_check ( _c0 <= SM._stride );
+ linbox_check ( _row <= SM._Mat.rowdim() );
+ linbox_check ( _col <= SM._stride );
+ linbox_check ( _off <= SM._Mat.rowdim()*(SM._Mat.coldim()+1) );
+ }
+
+
+ template < class _Matrix >
+ BlasSubmatrix<_Matrix>::BlasSubmatrix (typename BlasSubmatrix<_Matrix>::subMatrixType &SM,
+ size_t row,
+ size_t col,
+ size_t Rowdim,
+ size_t Coldim) :
+ _Mat (SM._Mat),
+ _row ( Rowdim ), _col ( Coldim ) ,
+ _r0 ( SM._r0 + row ), _c0 ( SM._c0 + col ),
+ _stride(SM._stride),_off(SM._off+(row*_stride+col))
+ ,_AD(SM.field())
+ ,_VD(SM.field())
+ {
+ // std::cout << "sub cstor 3 called" << std::endl;
+ linbox_check ( _r0 <= SM._Mat.rowdim() ); // allow for NULL matrix
+ linbox_check ( _c0 <= SM._stride );
+ linbox_check ( _row <= SM._Mat.rowdim() );
+ linbox_check ( _col <= SM._stride );
+ linbox_check ( _off <= SM._Mat.rowdim()*(SM._Mat.coldim()+1) );
+ }
+
+ template < class _Matrix >
+ BlasSubmatrix<_Matrix>::BlasSubmatrix (typename BlasSubmatrix<_Matrix>::subMatrixType &SM) :
+ _Mat (SM._Mat),
+ _row ( SM._row ), _col ( SM._col ) ,
+ _r0 ( SM._r0 ), _c0 (SM._c0 ),
+ _stride(SM._stride),_off(SM._off)
+ ,_AD(SM.field())
+ ,_VD(SM.field())
+ {
+ // std::cout << "sub cstor 4 called" << std::endl;
+ linbox_check ( _r0 <= SM._Mat.rowdim() ); // allow for NULL matrix
+ linbox_check ( _c0 <= SM._stride );
+ linbox_check ( _row <= SM._Mat.rowdim() );
+ linbox_check ( _col <= SM._stride );
+ linbox_check ( _off <= SM._Mat.rowdim()*(SM._Mat.coldim()+1) );
+ }
+
+ template < class _Matrix >
+ BlasSubmatrix<_Matrix>::BlasSubmatrix (typename BlasSubmatrix<_Matrix>::constSubMatrixType &SM) :
+ _Mat (SM._Mat),
+ _row ( SM._row ), _col ( SM._col ) ,
+ _r0 ( SM._r0 ), _c0 (SM._c0 ),
+ _stride(SM._stride),_off(SM._off)
+ ,_AD(SM.field())
+ ,_VD(SM.field())
+ {
+ // std::cout << "sub const cstor 4 called" << std::endl;
+ linbox_check ( _r0 <= SM._Mat.rowdim() ); // allow for NULL matrix
+ linbox_check ( _c0 <= SM._stride );
+ linbox_check ( _row <= SM._Mat.rowdim() );
+ linbox_check ( _col <= SM._stride );
+ linbox_check ( _off <= SM._Mat.rowdim()*(SM._Mat.coldim()+1) );
+ }
+
+ // shallow copy
+ template < class _Matrix >
+ BlasSubmatrix<_Matrix>& BlasSubmatrix<_Matrix>::operator=(const BlasSubmatrix<_Matrix> &SM)
+ {
+ if ( &SM == this)
+ return *this ;
+
+ _Mat = SM._Mat ;
+ _r0 = SM._r0 ;
+ _row = SM._row;
+ _c0 = SM._c0 ;
+ _col = SM._col;
+ _stride = SM._stride;
+ _off = SM._off ;
+ _AD = SM._AD ;
+ _VD = SM._VD ;
+
+ return *this;
+ }
+
+ // function for repurposing Submatrices.
+ template < class _Matrix >
+ BlasSubmatrix<_Matrix>& BlasSubmatrix<_Matrix>::submatrix(typename BlasSubmatrix<_Matrix>::constSelf_t &SM,
+ size_t row, size_t col, size_t Rowdim, size_t Coldim)
+ {
+ _Mat = SM._Mat;
+ _row = Rowdim; _col = Coldim;
+ _r0 = SM._r0 + row; _c0 = SM._c0 + col;
+ _stride = SM._stride; _off = SM._off+(row*_stride+col);
+ _AD = SM._AD;
+ _VD = SM._VD;
+
+ return *this;
+ }
+
+ // deep copy
+ template < class _Matrix >
+ template<class Matrix>
+ BlasSubmatrix<_Matrix>& BlasSubmatrix<_Matrix>::copy( const Matrix & B)
+ {
+ for (size_t i = 0 ; i < rowdim() ; ++i)
+ for (size_t j = 0 ; j < coldim() ; ++j) {
+ setEntry(i,j,B.getEntry(i,j));
+ }
+ return *this;
+ }
+
+ template < class _Matrix >
+ BlasSubmatrix<_Matrix> &BlasSubmatrix<_Matrix>::swap( typename BlasSubmatrix<_Matrix>::Self_t & B)
+ {
+ Element temp; _Mat.field().init(temp);
+ Element hold; _Mat.field().init(hold);
+ for (size_t i = 0 ; i < rowdim() ; ++i)
+ for (size_t j = 0 ; j < coldim() ; ++j) {
+ getEntry(hold,i,j);
+ setEntry(i,j,B.getEntry(temp,i,j));
+ B.setEntry(i,j,hold);
+ }
+ return *this;
+ }
+
+ template < class _Matrix >
+ BlasSubmatrix<_Matrix> &BlasSubmatrix<_Matrix>::zero()
+ {
+ for (size_t i = 0 ; i < rowdim() ; ++i)
+ for (size_t j = 0 ; j < coldim() ; ++j) {
+ setEntry(i,j,_Mat.field().zero);
+ }
+ return *this;
+ }
+
+ template < class _Matrix >
+ void BlasSubmatrix<_Matrix>::random()
+ {
+ typename Field::RandIter r(_Mat.field());
+ Element temp; _Mat.field().init(temp);
+ for (size_t i = 0 ; i < rowdim() ; ++i)
+ for (size_t j = 0 ; j < coldim() ; ++j) {
+ setEntry(i,j,r.random(temp));
+ }
+ return ;
+ }
+
+} // LinBox
+
+
+//////////////////
+// DIMENSIONS //
+//////////////////
+
+namespace LinBox
+{
+
+ template < class _Matrix >
+ size_t BlasSubmatrix<_Matrix>::rowdim() const
+ {
+ return _row ;
+ }
+
+ template < class _Matrix >
+ size_t BlasSubmatrix<_Matrix>::coldim() const
+ {
+ return _col ;
+ }
+
+ template < class _Matrix >
+ size_t BlasSubmatrix<_Matrix>::getStride() const
+ {
+ return _stride;
+ }
+
+
+} // LinBox
+
+//////////////////
+// ELEMENTS //
+//////////////////
+
+namespace LinBox
+{
+
+
+ template < class _Matrix >
+ typename BlasSubmatrix<_Matrix>::pointer
+ BlasSubmatrix<_Matrix>::getPointer() const
+ {
+ return _Mat.getPointer()+_off;
+ }
+
+ template < class _Matrix >
+ typename BlasSubmatrix<_Matrix>::const_pointer &
+ BlasSubmatrix<_Matrix>::getConstPointer() const
+ {
+ return _Mat.getConstPointer()+_off;
+ }
+
+
+ template < class _Matrix >
+ typename BlasSubmatrix<_Matrix>::pointer
+ BlasSubmatrix<_Matrix>::getWritePointer()
+ {
+ return (_Mat.getWritePointer()+_off);
+ }
+
+ template < class _Matrix >
+ void BlasSubmatrix<_Matrix>::setEntry (size_t i, size_t j, const Element &a_ij)
+ {
+ _Mat.setEntry (_r0 + i, _c0 + j, a_ij);
+ }
+
+ template < class _Matrix >
+ typename LinBox::BlasSubmatrix<_Matrix>::Element &BlasSubmatrix<_Matrix>::refEntry (size_t i, size_t j)
+ {
+ return _Mat.refEntry ( _r0+i, _c0+j );
+ }
+
+ template < class _Matrix >
+ const typename LinBox::BlasSubmatrix<_Matrix>::Element &BlasSubmatrix<_Matrix>::getEntry (size_t i, size_t j) const
+ {
+ return _Mat.getEntry ( _r0+i , _c0+j );
+ }
+
+ template < class _Matrix >
+typename LinBox::BlasSubmatrix<_Matrix>::Element &BlasSubmatrix<_Matrix>::getEntry (Element &x, size_t i, size_t j) const
+ {
+ return _Mat.getEntry (x, _r0+i , _c0+j );
+ }
+
+}
+
+///////////////////
+// TRANSPOSE &AL //
+///////////////////
+
+namespace LinBox
+{
+}
+
+///////////////////
+// ITERATORS //
+///////////////////
+
+namespace LinBox
+{
+
+
+ /*! Raw Iterators.
+ * @ingroup iterators
+ *
+ * The raw iterator is a method for accessing all entries in the matrix
+ * in some unspecified order. This can be used, e.g. to reduce all
+ * matrix entries modulo a prime before passing the matrix into an
+ * algorithm.
+ */
+ template < class _Matrix >
+ class BlasSubmatrix<_Matrix>::Iterator {
+ public:
+ Iterator (){}
+
+ /*! @internal
+ * @brief NO DOC
+ */
+ Iterator (const typename BlasMatrix<typename _Matrix::Field, typename _Matrix::Rep>::Iterator& cur,
+ const size_t c_dim,
+ const size_t stride,
+ const size_t c_idx) :
+ _cur (cur), _c_dim (c_dim), _stride(stride), _c_idx (c_idx)
+ {}
+
+ /*! @internal
+ * @brief copy operator.
+ * @param r Iterator to copy.
+ */
+ Iterator& operator = (const Iterator& r)
+ {
+ _cur = r._cur;
+ _c_dim = r._c_dim;
+ _stride = r._stride;
+ _c_idx = r._c_idx;
+ return *this;
+ }
+
+ /*! @internal
+ * increment.
+ * ??
+ */
+ Iterator& operator ++()
+ {
+ if (_c_idx < _c_dim - 1){
+ ++_cur; ++_c_idx;
+ }
+ else {
+ _cur = _cur + _stride - _c_dim + 1;
+ _c_idx = 0;
+ }
+
+ return *this;
+ }
+
+ /*! @internal
+ * increment.
+ * ??
+ */
+ Iterator& operator++ (int)
+ {
+ return this->operator++ ();
+ }
+
+
+ /*! @internal
+ * @brief operator !=.
+ * @param r Iterator to test inequaltity from.
+ */
+ bool operator != (const Iterator& r) const
+ {
+ return (_cur != r._cur || _c_dim != r._c_dim) || (_stride != r._stride) || (_c_idx != r._c_idx);
+ }
+
+ //! @internal operator *.
+ typename _Matrix::Element& operator * ()
+ {
+ return *_cur;
+ }
+
+ //! @internal operator *.
+ const typename _Matrix::Element& operator * () const
+ {
+ return *_cur;
+ }
+
+ protected:
+ typename BlasMatrix<typename _Matrix::Field,typename _Matrix::Rep>::Iterator _cur;
+ size_t _c_dim;
+ size_t _stride;
+ size_t _c_idx;
+ };
+
+ /*! Raw Iterators (const version).
+ * @ingroup iterators
+ * The raw iterator is a method for accessing all entries in the matrix
+ * in some unspecified order. This can be used, e.g. to reduce all
+ * matrix entries modulo a prime before passing the matrix into an
+ * algorithm.
+ */
+ template < class _Matrix >
+ class BlasSubmatrix<_Matrix>::ConstIterator {
+ public:
+ //! @internal Null constructor
+ ConstIterator (){}
+
+
+ /*! @internal
+ * @brief NO DOC
+ */
+ ConstIterator (const typename BlasMatrix<typename _Matrix::Field, typename _Matrix::Rep>::ConstIterator& cur,
+ const size_t c_dim,
+ const size_t stride,
+ const size_t c_idx) :
+ _cur (cur), _c_dim (c_dim), _stride(stride), _c_idx (c_idx)
+ {}
+
+ /*! @internal
+ * @brief copy operator.
+ * @param r Iterator to copy.
+ */
+ ConstIterator& operator = (const ConstIterator& r)
+ {
+ _cur = r._cur;
+ _c_dim = r._c_dim;
+ _stride = r._stride;
+ _c_idx = r._c_idx;
+ return *this;
+ }
+
+ /*! @internal
+ * increment.
+ * ??
+ */
+ ConstIterator& operator ++()
+ {
+ if (_c_idx < _c_dim - 1){
+ ++_cur; ++_c_idx;
+ }
+ else {
+ linbox_check(_stride > _c_dim);
+ _cur = _cur + (ptrdiff_t)(_stride - _c_dim + 1);
+ _c_idx = 0;
+ }
+
+ return *this;
+ }
+
+ /*! @internal
+ * increment.
+ * ??
+ */
+ ConstIterator& operator++ (int)
+ {
+ return this->operator++ ();
+ }
+
+ /*! @internal
+ * @brief operator !=.
+ * @param r Iterator to test inequaltity from.
+ */
+ bool operator != (const ConstIterator& r) const
+ {
+ return (_cur != r._cur) || (_c_dim != r._c_dim) || (_stride != r._stride) || (_c_idx != r._c_idx);
+ }
+
+ //! @internal operator *.
+ const typename BlasSubmatrix<_Matrix>::Element& operator * () const
+ {
+ return *_cur;
+ }
+
+ protected:
+ typename BlasMatrix<typename _Matrix::Field, typename _Matrix::Rep>::ConstIterator _cur;
+ size_t _c_dim;
+ size_t _stride;
+ size_t _c_idx;
+ };
+
+#if 0
+ template < class _Matrix >
+ class BlasSubmatrix<_Matrix>::ConstIterator {
+ public:
+ ConstIterator (){}
+
+ ConstIterator ( const typename BlasMatrix< _Field>::ConstIterator& cur,
+ size_t cont_len,
+ size_t gap_len) :
+ _beg (beg), _cur (cur), _cont_len (cont_len), _gap_len (gap_len)
+ {}
+
+ ConstIterator& operator = (const Iterator& r)
+ {
+ _cur = r._cur;
+ _beg = r._beg;
+ _cont_len = r._cont_len;
+ _gap_len = r._gap_len;
+ return *this;
+ }
+
+ ConstIterator& operator = (const ConstIterator& r)
+ {
+ _cur = r._cur;
+ _beg = r._beg;
+ _cont_len = r._cont_len;
+ _gap_len = r._gap_len;
+ return *this;
+ }
+
+ ConstIterator& operator++()
+ {
+ if (((_cur - _beg + 1) % _cont_len) != 0)
+ ++_cur;
+ else {
+ _cur = _cur + _gap_len + 1;
+ _beg = _beg + _gap_len + _cont_len;
+ }
+ return *this;
+ }
+
+ ConstIterator operator++(int)
+ {
+ ConstIterator tmp = *this;
+ this->operator++();
+ return tmp;
+ }
+
+ bool operator != (const ConstIterator& r) const
+ {
+ return (_cur != r._cur) || (_beg != r._beg) || (_cont_len != r._cont_len) || (_gap_len != r._gap_len);
+ }
+
+ const typename _Field::Element& operator*()
+ { return *_cur; }
+
+ _Field& operator*()
+ { return *_cur; }
+
+ const _Field& operator*() const
+ { return *_cur; }
+
+ protected:
+ typename BlasMatrix< _Field>::ConstIterator _beg;
+ typename BlasMatrix< _Field>::ConstIterator _cur;
+ size_t _cont_len;
+ size_t _gap_len;
+ };
+#endif
+
+ template < class _Matrix >
+ typename BlasSubmatrix<_Matrix>::Iterator BlasSubmatrix<_Matrix>::Begin ()
+ {
+ return Iterator (_Mat.Begin () + (ptrdiff_t)( _off ),
+ _col, _stride, 0);
+ }
+
+ template < class _Matrix >
+ typename BlasSubmatrix<_Matrix>::Iterator BlasSubmatrix<_Matrix>::End ()
+ {
+ return Iterator (_Mat.Begin () +(ptrdiff_t) ( (_row) * _stride + _off ),
+ _col, _stride, 0);
+ }
+
+ template < class _Matrix >
+ typename BlasSubmatrix<_Matrix>::ConstIterator BlasSubmatrix<_Matrix>::Begin () const
+ {
+ return ConstIterator (_Mat.Begin () +(ptrdiff_t) ( _off ),
+ _col, _stride, 0);
+ }
+
+ template < class _Matrix >
+ typename BlasSubmatrix<_Matrix>::ConstIterator BlasSubmatrix<_Matrix>::End () const
+ {
+ return ConstIterator (_Mat.Begin () +(ptrdiff_t) ( (_row) * _stride + _off ),
+ _col, _stride, 0);
+ }
+
+#if 0
+ template < class _Matrix >
+ typename BlasSubmatrix<_Matrix>::ConstIterator BlasSubmatrix<_Matrix>::Begin () const
+ {
+ return ConstIterator (_Mat.Begin () +(ptrdiff_t) ( _off ),
+ _Mat.Begin () +(ptrdiff_t) ( _off ),
+ _col, _stride - _col);
+ }
+
+ template < class _Matrix >
+ typename BlasSubmatrix<_Matrix>::ConstIterator BlasSubmatrix<_Matrix>::End () const
+ {
+ return ConstIterator (_Mat.Begin () +(ptrdiff_t) ( (_row) * _stride + _off ),
+ _Mat.Begin () +(ptrdiff_t) ( (_row) * _stride + _off ),
+ _col, _stride - _col);
+ }
+#endif
+
+ /*! Raw Indexed Iterator.
+ * @ingroup iterators
+ *
+ * Like the raw iterator, the indexed iterator is a method for
+ * accessing all entries in the matrix in some unspecified order.
+ * At each position of the the indexed iterator, it also provides
+ * the row and column indices of the currently referenced entry.
+ * This is provided through it's \c rowIndex() and \c colIndex() functions.
+ */
+ template < class _Matrix >
+ class BlasSubmatrix<_Matrix>::IndexedIterator {
+ public:
+ IndexedIterator (){}
+
+ IndexedIterator (const typename BlasMatrix<typename _Matrix::Field,typename _Matrix::Rep>::Iterator& cur,
+ size_t c_dim,
+ size_t stride,
+ size_t r_idx,
+ size_t c_idx) :
+ _cur (cur), _c_dim (c_dim), _stride (stride), _r_idx(r_idx), _c_idx (c_idx)
+ {}
+
+ IndexedIterator& operator = (const IndexedIterator& r)
+ {
+ _cur = r._cur;
+ _stride = r._stride;
+ _c_dim = r._c_dim;
+ _r_idx = r._r_idx;
+ _c_idx = r._c_idx;
+ return *this;
+ }
+
+ IndexedIterator& operator++()
+ {
+ if (_c_idx < _c_dim - 1){
+ ++_c_idx;
+ ++_cur;
+ }
+ else {
+ _cur = _cur + _stride - _c_dim + 1;
+ _c_idx = 0;
+ ++_r_idx;
+ }
+ return *this;
+ }
+
+ IndexedIterator& operator--()
+ {
+ if (_c_idx > 0){
+ --_c_idx;
+ --_cur;
+ }
+ else {
+ _cur = _cur - _stride + _c_dim -1;
+ _c_idx = 0;
+ --_r_idx;
+ }
+ return *this;
+ }
+
+ IndexedIterator operator++(int)
+ {
+ IndexedIterator tmp = *this;
+ this->operator++();
+ return tmp;
+ }
+
+ IndexedIterator operator--(int)
+ {
+ IndexedIterator tmp = *this;
+ this->operator--();
+ return tmp;
+ }
+
+ bool operator != (const IndexedIterator& r) const
+ {
+ return ((_c_idx != r._c_idx) || (_r_idx != r._r_idx) ||(_stride != r._stride) || (_c_dim != r._c_dim) );
+ }
+
+ const typename _Matrix::Field& operator*() const {return *_cur;}
+
+ typename _Matrix::Element& operator*() {return *_cur;}
+
+ size_t rowIndex () const { return _r_idx; }
+
+ size_t colIndex () const { return _c_idx; }
+
+ const typename _Matrix::Element& value () const {return *_cur;}
+
+ protected:
+ typename BlasMatrix<typename _Matrix::Field, typename _Matrix::Rep>::Iterator _cur;
+ size_t _stride;
+ size_t _c_dim;
+ size_t _r_idx;
+ size_t _c_idx;
+ };
+
+ template < class _Matrix >
+ typename BlasSubmatrix<_Matrix>::IndexedIterator BlasSubmatrix<_Matrix>::IndexedBegin ()
+ {
+ return IndexedIterator (_Mat.Begin () +(ptrdiff_t) ( (_off) ),
+ _col , _stride, 0, 0);
+ }
+
+ template < class _Matrix >
+ typename BlasSubmatrix<_Matrix>::IndexedIterator BlasSubmatrix<_Matrix>::IndexedEnd ()
+ {
+ return IndexedIterator (_Mat.Begin () +(ptrdiff_t) ( (_row) * _stride + (_col+_off) ),
+ _col, _stride, _row-1, _col-1);
+ }
+
+ /*! Raw Indexed Iterator (const version).
+ * @ingroup iterators
+ *
+ * Like the raw iterator, the indexed iterator is a method for
+ * accessing all entries in the matrix in some unspecified order.
+ * At each position of the the indexed iterator, it also provides
+ * the row and column indices of the currently referenced entry.
+ * This is provided through it's \c rowIndex() and \c colIndex() functions.
+ */
+ template < class _Matrix >
+ class BlasSubmatrix<_Matrix>::ConstIndexedIterator {
+ public:
+ ConstIndexedIterator (){}
+
+ ConstIndexedIterator (const typename BlasMatrix<typename _Matrix::Field, typename _Matrix::Rep>::ConstIterator& cur,
+ size_t c_dim,
+ size_t stride,
+ size_t r_idx,
+ size_t c_idx) :
+ _cur (cur), _stride (stride), _c_dim (c_dim), _r_idx(r_idx), _c_idx (c_idx)
+ {}
+
+ ConstIndexedIterator& operator = (const IndexedIterator& r)
+ {
+ _cur = r._cur;
+ _stride = r._stride;
+ _c_dim = r._c_dim;
+ _r_idx = r._r_idx;
+ _c_idx = r._c_idx;
+ return *this;
+ }
+
+ ConstIndexedIterator& operator = (const ConstIndexedIterator& r)
+ {
+ _cur = r._cur;
+ _stride = r._stride;
+ _c_dim = r._c_dim;
+ _r_idx = r._r_idx;
+ _c_idx = r._c_idx;
+ return *this;
+ }
+
+ ConstIndexedIterator& operator++()
+ {
+ if (_c_idx < _c_dim - 1){
+ ++_c_idx;
+ ++_cur;
+ }
+ else {
+ _cur = _cur + _stride - _c_dim +1;
+ _c_idx = 0;
+ ++_r_idx;
+ }
+ return *this;
+ }
+
+ IndexedIterator& operator--()
+ {
+ if (_c_idx > 0){
+ --_c_idx;
+ --_cur;
+ }
+ else {
+ _cur = _cur - _stride + _c_dim -1;
+ _c_idx = 0;
+ --_r_idx;
+ }
+ return *this;
+ }
+
+ ConstIndexedIterator operator++(int)
+ {
+ ConstIndexedIterator tmp = *this;
+ this->operator++();
+ return tmp;
+ }
+
+ ConstIndexedIterator operator--(int)
+ {
+ ConstIndexedIterator tmp = *this;
+ this->operator--();
+ return tmp;
+ }
+
+ size_t rowIndex () const
+ {
+ return _r_idx;
+ }
+
+ size_t colIndex () const
+ {
+ return _c_idx;
+ }
+
+ bool operator != (const ConstIndexedIterator& r) const
+ {
+ return ((_c_idx != r._c_idx) || (_r_idx != r._r_idx) ||(_stride != r._stride) || (_c_dim != r._c_dim) );
+ }
+
+ const typename _Matrix::Element& operator*() const
+ {
+ return *_cur;
+ }
+
+
+ friend std::ostream& operator<<(std::ostream& out, const ConstIndexedIterator m)
+ {
+ return out /* << m._cur << ' ' */
+ << m._stride << ' '
+ << m._c_dim << ' '
+ << m._r_idx << ' '
+ << m._c_idx;
+ }
+
+ const typename _Matrix::Element & value() const
+ {
+ return this->operator*();
+
+ }
+
+ protected:
+ typename BlasMatrix<typename _Matrix::Field, typename _Matrix::Rep>::ConstIterator _cur;
+ size_t _stride;
+ size_t _c_dim;
+ size_t _r_idx;
+ size_t _c_idx;
+ };
+
+ template < class _Matrix >
+ typename BlasSubmatrix<_Matrix>::ConstIndexedIterator BlasSubmatrix<_Matrix>::IndexedBegin () const
+ {
+ return ConstIndexedIterator (_Mat.Begin () +(ptrdiff_t) ( _off ),
+ _row, _stride, 0, 0);
+ }
+
+ template < class _Matrix >
+ typename BlasSubmatrix<_Matrix>::ConstIndexedIterator BlasSubmatrix<_Matrix>::IndexedEnd () const
+ {
+ return ConstIndexedIterator (_Mat.Begin () +(ptrdiff_t) ( (_row) * _stride + (_off+_col) ),
+ _col, _stride, _row-1, _col-1);
+ }
+
+ ////////
+ template < class _Matrix >
+ typename BlasSubmatrix<_Matrix>::RowIterator BlasSubmatrix<_Matrix>::rowBegin ()
+ {
+ return RowIterator (_Mat.Begin () +(ptrdiff_t) ( _off ),
+ _col, _stride);
+ }
+
+ template < class _Matrix >
+ typename BlasSubmatrix<_Matrix>::RowIterator BlasSubmatrix<_Matrix>::rowEnd ()
+ {
+ return RowIterator (_Mat.Begin () +(ptrdiff_t) ( (_row) * _stride + _off ),
+ _col, _stride);
+ }
+
+ template < class _Matrix >
+ typename BlasSubmatrix<_Matrix>::ConstRowIterator BlasSubmatrix<_Matrix>::rowBegin () const
+ {
+ return ConstRowIterator (_Mat.Begin () + (ptrdiff_t)( _off ),
+ _col, _stride);
+ }
+
+ template < class _Matrix >
+ typename BlasSubmatrix<_Matrix>::ConstRowIterator BlasSubmatrix<_Matrix>::rowEnd () const
+ {
+ return ConstRowIterator (_Mat.Begin () + (ptrdiff_t)( (_row) * _stride + _off ),
+ _col, _stride);
+ }
+
+ template < class _Matrix >
+ typename BlasSubmatrix<_Matrix>::ColIterator BlasSubmatrix<_Matrix>::colBegin ()
+ {
+ return ColIterator (_Mat.Begin () + (ptrdiff_t)( _off ),
+ _stride, _row);
+ }
+
+ template < class _Matrix >
+ typename BlasSubmatrix<_Matrix>::ColIterator BlasSubmatrix<_Matrix>::colEnd ()
+ {
+ return ColIterator (_Mat.Begin () + (ptrdiff_t)( (_col) + _off ),
+ _stride, _row);
+ }
+
+ template < class _Matrix >
+ typename BlasSubmatrix<_Matrix>::ConstColIterator BlasSubmatrix<_Matrix>::colBegin () const
+ {
+ return ConstColIterator (_Mat.Begin () + (ptrdiff_t)( _off ),
+ _stride, _row);
+ }
+
+ template < class _Matrix >
+ typename BlasSubmatrix<_Matrix>::ConstColIterator BlasSubmatrix<_Matrix>::colEnd () const
+ {
+ return ConstColIterator (_Mat.Begin () + (ptrdiff_t)( (_col) + _off ),
+ _stride, _row);
+ }
+
+ /* operators */
+ template < class _Matrix >
+ typename BlasSubmatrix<_Matrix>::Row BlasSubmatrix<_Matrix>::operator[] (size_t i)
+ {
+ return Row (_Mat.Begin () +(ptrdiff_t) (_r0+i) * _stride, _Mat.Begin () + (ptrdiff_t)((_r0+i) * _stride + _stride) );
+ }
+
+ template < class _Matrix >
+ typename BlasSubmatrix<_Matrix>::ConstRow BlasSubmatrix<_Matrix>::operator[] (size_t i) const
+ {
+ return Row (_Mat.Begin () + (ptrdiff_t)(_r0+i) * _stride, _Mat.Begin () + (ptrdiff_t)((_r0+i) * _stride + _stride) );
+ }
+
+} // LinBox
+
+///////////////////
+// I/O //
+///////////////////
+
+namespace LinBox
+{
+
+ template < class _Matrix >
+ std::istream& BlasSubmatrix<_Matrix>::read (std::istream &file)
+ {
+#if 0
+ Iterator p;
+ int m,n;
+ char c;
+ file>>m>>n>>c;
+
+ if (m*n < _row*_col)
+ cerr<<"NOT ENOUGH ELEMENT TO READ\n";
+ else {
+ for (p = Begin (); p != End (); ++p) {
+ integer tmp;
+ file>>tmp;cout<<tmp<<endl;
+ //file.ignore(1);
+ _Mat.field().read (file, *p);
+ }
+ }
+#endif
+
+
+ Iterator p;
+ int m=0,n=0;
+ char c='\0';
+ file>>m>>n>>c;
+ // std::cout << m << 'x' << n << ':' << c << std::endl;
+
+ // this is bogus!! -bds
+ _row = m; _col = n;
+
+ // resize(_row,_col);
+
+ if ((c != 'M') && (c != 'm')) {
+ for (p = Begin (); p != End (); ++p) {
+ //file.ignore(1);
+ _Mat.field().read (file, *p);
+ }
+
+ }
+ else { // sparse file format - needs fixing
+ int i=0, j=0;
+ while (true)
+ {
+ file >> i >> j;
+ //file.ignore(1);
+ //if (! file) break;
+ if (i+j <= 0) break;
+ // std::cout << i << ',' << j << ':' ;
+ _Mat.field().read (file, _Mat.refEntry(i-1, j-1));
+ }
+ }
+
+ return file;
+ }
+
+ template <class _Matrix>
+ std::ostream &BlasSubmatrix< _Matrix >::write (std::ostream &os,
+ LINBOX_enum (Tag::FileFormat) f ) const
+ {
+
+ ConstRowIterator p;
+ switch(f) {
+ case (Tag::FileFormat::MatrixMarket ) : /* Matrix Market */
+ {
+ writeMMArray(os, *this, "BlasSubmatrix");
+ }
+ break;
+ case (Tag::FileFormat::Plain) : /* raw output */
+ {
+ integer c;
+ int wid;
+
+ _Mat.field().cardinality (c);
+
+ if (c >0)
+ wid = (int) ceil (log ((double) c) / M_LN10);
+ else {
+// integer tmp;
+// size_t max=0;
+// ConstIterator it = Begin();
+// for (; it != End(); ++it){
+// _Mat.field().convert(tmp,*it);
+// if (tmp.bitsize() > max)
+// max= tmp.bitsize();
+// }
+// wid= (int) ceil ((double)max / M_LN10)+1;
+ wid=1000;
+
+ }
+
+ for (p = rowBegin (); p != rowEnd ();++p) {
+ typename ConstRow::const_iterator pe;
+
+ os << " [ ";
+
+ for (pe = p->begin (); pe != p->end (); ++pe) {
+ os.width (wid);
+ /*! @warning
+ * matrix base does not provide this field(), maybe should?
+ * _Mat.field ().write (os, *pe);
+ * os << *pe;
+ * fixed by using extra field
+ */
+
+ _Mat.field().write (os, *pe);
+ os << " ";
+ }
+
+ os << "]" << std::endl;
+ }
+ }
+ break;
+ case (Tag::FileFormat::Maple) : /* maple format */
+ {
+
+ os << "Matrix( " << rowdim() << ',' << coldim() << ",\n[" ;
+ for (p = rowBegin (); p != rowEnd (); ) {
+ typename ConstRow::const_iterator pe;
+ if (p!=rowBegin()) os << ' ';
+ os << "[ ";
+
+ for (pe = p->begin (); pe != p->end (); ) {
+ _Mat.field().write (os, *pe);
+ ++pe ;
+ if (pe != p->end())
+ os << ", ";
+ }
+
+ os << "]" ;
+ ++p ;
+ if (p != rowEnd() )
+ os << ',' << std::endl;;
+
+ }
+ os << "])" ;
+ }
+ break;
+ case (Tag::FileFormat::HTML) : /* HTML format */
+ {
+
+ os << "<table border=\"1\">" ;
+ for (p = rowBegin (); p != rowEnd (); ) {
+ typename ConstRow::const_iterator pe;
+
+ os << "<tr>";
+
+ for (pe = p->begin (); pe != p->end (); ) {
+ _Mat.field().write (os<< "<td>", *pe)<<"</td>";
+ ++pe ;
+ }
+
+ os << "</tr>" << std::endl;
+ ++p ;
+
+ }
+ os << "</table>" ;
+ }
+ break;
+ case (Tag::FileFormat::LaTeX) : /* LaTex format */
+ {
+ os << "\\begin{pmatrix} " << std::endl;
+ for (p = rowBegin (); p != rowEnd (); ) {
+ typename ConstRow::const_iterator pe;
+
+ for (pe = p->begin (); pe != p->end (); ) {
+ _Mat.field().write (os, *pe);
+ ++pe ;
+ if (pe != p->end())
+ os << "& ";
+ }
+
+ os << "\\\\" << std::endl;
+ ++p ;
+
+ }
+ os << "\\end{pmatrix}" ;
+ }
+ break;
+ default : /* this is an error */
+ {
+ throw LinBoxError("unknown format to write matrix in");
+ }
+ }
+
+ return os;
+ }
+
+ template <class _Matrix>
+ template<typename _Tp1, class _Rep2>
+ struct BlasSubmatrix< _Matrix>::rebind {
+ typedef BlasMatrix<_Tp1,_Rep2> other;
+
+ void operator() (other & Ap, const Self_t& A) {
+ typedef typename BlasSubmatrix<_Matrix>::ConstIterator ConstSelfIterator ;
+ typedef typename other::Iterator OtherIterator ;
+ OtherIterator Ap_i;
+ ConstSelfIterator A_i;
+ Hom<Field, _Tp1> hom(A. field(), Ap. field());
+ for (A_i = A. Begin(), Ap_i = Ap.Begin();
+ A_i != A. End(); ++ A_i, ++ Ap_i)
+ hom.image (*Ap_i, *A_i);
+ }
+ };
+
+} // LinBox
+
+//////////////////
+// MISC //
+//////////////////
+
+namespace LinBox
+{
+} // LinBox
+#endif // __LINBOX_densematrix_blas_submatrix_INL
+
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+
diff --git a/linbox/matrix/densematrix/blas-transposed-matrix.h b/linbox/matrix/densematrix/blas-transposed-matrix.h
new file mode 100644
index 0000000..7eb1bb9
--- /dev/null
+++ b/linbox/matrix/densematrix/blas-transposed-matrix.h
@@ -0,0 +1,106 @@
+/*
+ * Copyright (C) 2004,2014 Pascal Giorgi, Clément Pernet, the LinBox group
+ *
+ * Written by :
+ * Pascal Giorgi pascal.giorgi at ens-lyon.fr
+ * Clément Pernet clement.pernet at imag.fr
+ * Brice Boyer (briceboyer) <boyer.brice at gmail.com>
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ * ========LICENCE========
+ */
+
+/*! @file matrix/densematrix/blas-tranposed-matrix.h
+ * @ingroup densematrix
+ * @brief Transposed Matrix
+ * not much.
+ *
+ */
+
+#ifndef __LINBOX_matrix_densematrix_blas_transposed_matrix_H
+#define __LINBOX_matrix_densematrix_blas_transposed_matrix_H
+
+
+namespace LinBox
+{ /* Transposed Matrix */
+ /*! TransposedBlasMatrix.
+ * NO DOC
+ */
+ template< class Matrix >
+ class TransposedBlasMatrix {
+
+ public:
+
+ /*! NO DOC
+ * @param Mat
+ */
+ TransposedBlasMatrix ( Matrix& Mat ) :
+ _Mat(Mat)
+ {}
+
+ /*! NO DOC
+ */
+ Matrix& getMatrix() const
+ {
+ return _Mat;
+ }
+
+ protected:
+ Matrix& _Mat; //!< NO DOC
+ };
+
+ /*! TransposedBlasMatrix.
+ * NO DOC
+ */
+#if !defined(__INTEL_COMPILER) && !defined(__CUDACC__) & !defined(__clang__)
+ template <>
+#endif
+ template< class Matrix >
+ class TransposedBlasMatrix< TransposedBlasMatrix< Matrix > > : public Matrix {
+
+ public:
+ /*! TransposedBlasMatrix.
+ * NO DOC
+ */
+ TransposedBlasMatrix ( Matrix& Mat ) :
+ Matrix(Mat)
+ {}
+
+ /*! TransposedBlasMatrix.
+ * NO DOC
+ */
+ TransposedBlasMatrix ( const Matrix& Mat ) :
+ Matrix(Mat)
+ {}
+
+ };
+
+
+}
+
+#endif // __LINBOX_matrix_densematrix_blas_transposed_matrix_H
+
+
+
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/matrix/densematrix/blas-triangularmatrix.inl b/linbox/matrix/densematrix/blas-triangularmatrix.inl
new file mode 100644
index 0000000..c46656d
--- /dev/null
+++ b/linbox/matrix/densematrix/blas-triangularmatrix.inl
@@ -0,0 +1,145 @@
+/* linbox/matrix/blas-triangularmatrix.inl
+ * Copyright (C) 2004 Pascal Giorgi, Clément Pernet
+ *
+ * Written by :
+ * Pascal Giorgi <pascal.giorgi at ens-lyon.fr>
+ * Clément Pernet <clement.pernet at imag.fr>
+ * Brice Boyer (briceboyer) <boyer.brice at gmail.com>
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ * ========LICENCE========
+ */
+
+/*!@internal
+ * @file matrix/blas-triangularmatrix.inl
+ * @ingroup matrix
+ * A \c BlasMatrix<\c _Field > represents a matrix as an array of
+ * <code>_Field</code>s.
+ */
+
+#ifndef __LINBOX_blas_triangularmatrix_INL
+#define __LINBOX_blas_triangularmatrix_INL
+
+namespace LinBox
+{
+ template < class _Field, class _Rep >
+ TriangularBlasMatrix< _Field, _Rep >::TriangularBlasMatrix (const _Field & F, const size_t m, const size_t n,
+ LINBOX_enum (Tag::Shape) x,
+ LINBOX_enum (Tag::Diag) y) :
+ BlasMatrix< _Field, _Rep >(F, m, n ) , _uplo(x), _diag(y)
+ {}
+
+ template < class _Field, class _Rep >
+ TriangularBlasMatrix< _Field, _Rep >::TriangularBlasMatrix (const BlasMatrix< _Field, _Rep >& A,
+ LINBOX_enum (Tag::Shape) x,
+ LINBOX_enum (Tag::Diag) y) :
+ BlasMatrix< _Field, _Rep >(A) , _uplo(x), _diag(y)
+ {}
+
+ template < class _Field, class _Rep >
+ TriangularBlasMatrix< _Field, _Rep >::TriangularBlasMatrix (BlasMatrix< _Field, _Rep >& A,
+ LINBOX_enum (Tag::Shape) x,
+ LINBOX_enum (Tag::Diag) y) :
+ BlasMatrix< _Field, _Rep >(A), _uplo(x), _diag(y)
+ {}
+
+ template < class _Field, class _Rep >
+ TriangularBlasMatrix< _Field, _Rep >::TriangularBlasMatrix (const TriangularBlasMatrix< _Field, _Rep >& A) :
+ BlasMatrix< _Field, _Rep >(A.field(), A.rowdim(),A.coldim()), _uplo(A._uplo), _diag(A._diag)
+ {
+ switch (A._uplo) {
+ case Tag::Shape::Upper:
+ {
+ for (size_t i=0;i<A.rowdim();++i)
+ for (size_t j=i;j<A.coldim();++j)
+ this->setEntry(i,j,A.getEntry(i,j));
+ break;
+ }
+ case Tag::Shape::Lower:
+ {
+ for (size_t i=0;i<A.rowdim();++i) {
+ for (size_t j=0;j<=i;++j)
+ this->setEntry(i,j,A.getEntry(i,j));
+ }
+
+ break;
+ }
+ default:
+ throw LinboxError ("Error in copy constructor of TriangularBlasMatrix (incorrect argument)");
+ }
+ }
+
+ template < class _Field, class _Rep >
+ template<class Matrix>
+ TriangularBlasMatrix< _Field, _Rep >::TriangularBlasMatrix (const Matrix& A,
+ LINBOX_enum (Tag::Shape) x,
+ LINBOX_enum (Tag::Diag) y) :
+ BlasMatrix< _Field, _Rep >(A.field(),A.rowdim(),A.coldim()), _uplo(x), _diag(y)
+ {
+ switch (x) {
+ case Tag::Shape::Upper:
+ {
+ for (size_t i=0;i<A.rowdim();++i){
+ for (size_t j=i;j<A.coldim();++j) {
+ Element tmp = A.getEntry(i,j) ;
+ this->setEntry(i,j,tmp);
+ }
+ }
+ break;
+ }
+ case Tag::Shape::Lower:
+ {
+ for (size_t i=0;i<A.rowdim();++i) {
+ for (size_t j=0;j<=i;++j) {
+ Element tmp = A.getEntry(i,j);
+ this->setEntry(i,j,tmp);
+ }
+ }
+
+ break;
+ }
+ default:
+ throw LinboxError ("Error in copy constructor of TriangularBlasMatrix (incorrect argument)");
+ }
+ }
+
+ template < class _Field, class _Rep >
+ LINBOX_enum (Tag::Shape) TriangularBlasMatrix< _Field, _Rep >::getUpLo() const
+ {
+ return _uplo;
+ }
+
+ template < class _Field, class _Rep >
+ LINBOX_enum (Tag::Diag) TriangularBlasMatrix< _Field, _Rep >::getDiag() const
+ {
+ return _diag;
+ }
+
+}
+
+#endif // __LINBOX_blas_triangularmatrix_INL
+
+
+
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/matrix/factorized-matrix.h b/linbox/matrix/factorized-matrix.h
index 0f6e129..347344e 100644
--- a/linbox/matrix/factorized-matrix.h
+++ b/linbox/matrix/factorized-matrix.h
@@ -31,9 +31,9 @@
#include <vector>
-#include "linbox/matrix/blas-matrix.h"
-#include "linbox/algorithms/blas-domain.h"
-#include <fflas-ffpack/ffpack/ffpack.h>
+#include <fflas-ffpack/fflas-ffpack.h>
+
+#include "linbox/matrix/densematrix/blas-matrix.h"
#include "linbox/matrix/permutation-matrix.h"
@@ -63,6 +63,7 @@ namespace LinBox
* a finite field. There are methods for retrieving \p L,\p Q,\p U and \p P
* matrices and methods for solving systems.
*/
+ //! @bug Should really be tempalted by Matrix and be a (sub)domain
template <class Field>
class LQUPMatrix {
@@ -73,7 +74,7 @@ namespace LinBox
protected:
Field _field;
- BlasMatrix<Field> &_factLU;
+ BlasMatrix<Field,typename Vector<Field>::Dense > &_factLU;
BlasPermutation<size_t> &_permP;
BlasPermutation<size_t> &_permQ; //note: this is actually Qt!
size_t _m;
@@ -86,8 +87,8 @@ namespace LinBox
#if 0
//! Contruction of LQUP factorization of A (making a copy of A)
- LQUPMatrix (const Field& F, const BlasMatrix<Field>& A) :
- _field(F), _factLU(*(new BlasMatrix<Field> (A))) ,
+ LQUPMatrix (const Field& F, const BlasMatrix<Field,_Rep>& A) :
+ _field(F), _factLU(*(new BlasMatrix<Field,_Rep> (A))) ,
_permP(*(new BlasPermutation<size_t>(A.coldim()))),
_permQ(*(new BlasPermutation<size_t>(A.rowdim()))),
_m(A.rowdim()), _n(A.coldim()),
@@ -95,7 +96,7 @@ namespace LinBox
{
//std::cerr<<"Je passe par le constructeur const"<<std::endl;
- _rank= FFPACK::LUdivine((typename Field::Father_t) _field,FFLAS::FflasNonUnit, FFLAS::FflasNoTrans, _m, _n,
+ _rank= FFPACK::LUdivine( _field,FFLAS::FflasNonUnit, FFLAS::FflasNoTrans, _m, _n,
_factLU.getPointer(),_factLU.getStride(),
_permP.getWritePointer(), _permQ.getWritePointer(), FFPACK::FfpackLQUP );
_permP.setOrder(_rank);
@@ -104,7 +105,7 @@ namespace LinBox
}
//! Contruction of LQUP factorization of A (in-place in A)
- LQUPMatrix (const Field& F, BlasMatrix<Field>& A) :
+ LQUPMatrix (const Field& F, BlasMatrix<Field,_Rep>& A) :
_field(F), _factLU(A) ,
_permP(*(new BlasPermutation<size_t>(A.coldim()))),
_permQ(*(new BlasPermutation<size_t>(A.rowdim()))),
@@ -117,21 +118,20 @@ namespace LinBox
}
else {
//std::cerr<<"Je passe par le constructeur non const"<<std::endl;
- _rank= FFPACK::LUdivine((typename Field::Father_t) _field,FFLAS::FflasNonUnit, FFLAS::FflasNoTrans, _m, _n,
- _factLU.getPointer(),_factLU.getStride(),
+ _rank= FFPACK::LUdivine( _field,FFLAS::FflasNonUnit, FFLAS::FflasNoTrans, _m, _n,
+ _factLU.getPointer(),_factLU.getStride(),
_permP.getWritePointer(), _permQ.getWritePointer(), FFPACK::FfpackLQUP );
- }
+ }
_permP.setOrder(_rank);
_permQ.setOrder(_rank);
-
}
/*! Contruction of LQUP factorization of A (making a copy of A).
* P and Q are arguments !
*/
- LQUPMatrix (const BlasMatrix<Field>& A,
+ LQUPMatrix (const BlasMatrix<Field,_Rep>& A,
BlasPermutation<size_t> & P, BlasPermutation<size_t> & Q) :
- _field(F), _factLU(*(new BlasMatrix<Field> (A))) ,
+ _field(F), _factLU(*(new BlasMatrix<Field,_Rep> (A))) ,
_permP(P), _permQ(Q),
_m(A.rowdim()), _n(A.coldim()),
_alloc(true),_plloc(false)
@@ -140,7 +140,7 @@ namespace LinBox
linbox_check(_permQ.getOrder()==A.rowdim());
linbox_check(_permP.getOrder()==A.coldim());
- _rank= FFPACK::LUdivine((typename Field::Father_t) _field,FFLAS::FflasNonUnit, FFLAS::FflasNoTrans, _m, _n,
+ _rank= FFPACK::LUdivine( _field,FFLAS::FflasNonUnit, FFLAS::FflasNoTrans, _m, _n,
_factLU.getPointer(),_factLU.getStride(),
_permP.getWritePointer(), _permQ.getWritePointer(), FFPACK::FfpackLQUP );
_permP.setOrder(_rank);
@@ -152,7 +152,7 @@ namespace LinBox
/*! Contruction of LQUP factorization of A (in-place in A).
* P and Q are arguments !
*/
- LQUPMatrix ( BlasMatrix<Field>& A,
+ LQUPMatrix ( BlasMatrix<Field,_Rep>& A,
BlasPermutation<size_t> & P, BlasPermutation<size_t> & Q) :
_field(F), _factLU(A) , _permP(P), _permQ(Q),
_m(A.rowdim()), _n(A.coldim()),
@@ -166,7 +166,7 @@ namespace LinBox
if (_permP.getOrder() == 0)
_permP.resize(A.coldim());
- _rank= FFPACK::LUdivine((typename Field::Father_t) _field,FFLAS::FflasNonUnit, FFLAS::FflasNoTrans, _m, _n,
+ _rank= FFPACK::LUdivine( _field,FFLAS::FflasNonUnit, FFLAS::FflasNoTrans, _m, _n,
_factLU.getPointer(),_factLU.getStride(),
_permP.getWritePointer(), _permQ.getWritePointer(), FFPACK::FfpackLQUP );
_permP.setOrder(_rank);
@@ -175,23 +175,27 @@ namespace LinBox
}
#endif
//! Contruction of LQUP factorization of A (making a copy of A)
- LQUPMatrix (const BlasMatrix<Field>& A) ;
+ template<class _Rep>
+ LQUPMatrix (const BlasMatrix<Field,_Rep>& A) ;
//! Contruction of LQUP factorization of A (in-place in A)
- LQUPMatrix (BlasMatrix<Field>& A) ;
+ template<class _Rep>
+ LQUPMatrix (BlasMatrix<Field,_Rep>& A) ;
/*! Contruction of LQUP factorization of A (making a copy of A).
* P and Q are arguments !
*/
- LQUPMatrix (const BlasMatrix<Field>& A,
+ template<class _Rep>
+ LQUPMatrix (const BlasMatrix<Field,_Rep>& A,
BlasPermutation<size_t> & P, BlasPermutation<size_t> & Q) ;
/*! Contruction of LQUP factorization of A (in-place in A).
* P and Q are arguments !
* @bug in place ?
*/
- LQUPMatrix (BlasMatrix<Field>& A,
+ template<class _Rep>
+ LQUPMatrix (BlasMatrix<Field,_Rep>& A,
BlasPermutation<size_t> & P, BlasPermutation<size_t> & Q) ;
//! destructor.
@@ -244,17 +248,21 @@ namespace LinBox
* else \c L is form \c LQUP decomposition.
* @pre \c L has unit diagonal
*/
- TriangularBlasMatrix<Field>& getL(TriangularBlasMatrix<Field>& L, bool _QLUP = false) const;
+
+ template<class _Rep>
+ TriangularBlasMatrix<Field,_Rep>& getL(TriangularBlasMatrix<Field,_Rep>& L, bool _QLUP = false) const;
/*! get the matrix \c U.
* @pre \c U has non-unit diagonal
*/
- TriangularBlasMatrix<Field>& getU(TriangularBlasMatrix<Field>& U) const;
+ template<class _Rep>
+ TriangularBlasMatrix<Field,_Rep>& getU(TriangularBlasMatrix<Field,_Rep>& U) const;
/*! get the matrix S.
* from the LSP factorization of A deduced from LQUP)
*/
- BlasMatrix<Field>& getS( BlasMatrix<Field>& S) const;
+ template<class _Rep>
+ BlasMatrix<Field,_Rep>& getS( BlasMatrix<Field,_Rep>& S) const;
/*! @internal get a pointer to the begin of storage.
*/
@@ -266,7 +274,7 @@ namespace LinBox
/*!
* Solvers with matrices or vectors
- * Operand can be a BlasMatrix<Field> or a std::vector<Element>
+ * Operand can be a BlasMatrix<Field,_Rep> or a std::vector<Element>
*/
//@{
// solve AX=B
diff --git a/linbox/matrix/factorized-matrix.inl b/linbox/matrix/factorized-matrix.inl
index a24af3e..e508ca8 100644
--- a/linbox/matrix/factorized-matrix.inl
+++ b/linbox/matrix/factorized-matrix.inl
@@ -29,30 +29,42 @@
namespace LinBox
{
+
namespace Protected
{
/// @internal
- template <class Field, class Operand>
+ template <class Field, class Operand1, class Operand2=Operand1>
class FactorizedMatrixLeftSolve {
public:
- Operand& operator() ( const Field& F,
- const LQUPMatrix<Field>& A,
- Operand& X, const Operand& B ) const;
- Operand& operator() ( const Field& F,
- const LQUPMatrix<Field>& A,
- Operand& B ) const;
+ Operand1& operator() ( const Field& F,
+ const LQUPMatrix<Field>& A,
+ Operand1& X,
+ const Operand2& B ) const;
+ }; // end of class FactorizedMatrixLeftSolve
+ template <class Field, class Operand1>
+ class FactorizedMatrixLeftSolveIP {
+ public:
+ Operand1& operator() ( const Field& F,
+ const LQUPMatrix<Field>& A,
+ Operand1& B ) const;
}; // end of class FactorizedMatrixLeftSolve
/// @internal
- template <class Field, class Operand>
+ template <class Field, class Operand1, class Operand2=Operand1>
class FactorizedMatrixRightSolve {
public:
- Operand& operator() ( const Field& F,
- const LQUPMatrix<Field>& A,
- Operand& X, const Operand& B ) const;
- Operand& operator() ( const Field& F,
- const LQUPMatrix<Field>& A,
- Operand& B ) const;
+ Operand1& operator() ( const Field& F,
+ const LQUPMatrix<Field>& A,
+ Operand1& X,
+ const Operand2& B ) const;
+ };
+ template <class Field, class Operand1>
+ class FactorizedMatrixRightSolveIP {
+ public:
+
+ Operand1& operator() ( const Field& F,
+ const LQUPMatrix<Field>& A,
+ Operand1& B ) const;
}; // end of class FactorizedMatrixRightSolve
/// @internal
@@ -104,120 +116,136 @@ namespace LinBox
}; // end of class FactorizedMatrixRightUSolve
/*
- * Solvers with Matrices: Operand=BlasMatrix<Field>
+ * Solvers with Matrices: Operand= BlasMatrix<Field,_Rep>
*/
- template <class Field>
- class FactorizedMatrixLeftSolve<Field, BlasMatrix<Field> > {
- public:
-
- BlasMatrix<Field>& operator() (const Field& F,
+ template <class Field, class Matrix1, class Matrix2>
+ Matrix1&
+ FactorizedMatrixLeftSolve<Field,Matrix1,Matrix2>::operator() ( const Field& F,
const LQUPMatrix<Field>& A,
- BlasMatrix<Field>& X,
- const BlasMatrix<Field>& B) const
- {
- linbox_check (A.coldim() == X.rowdim());
- linbox_check (A.rowdim() == B.rowdim());
- linbox_check (B.coldim() == X.coldim());
- int info;
-
- FFPACK::fgetrs ((typename Field::Father_t)F, FFLAS::FflasLeft, A.rowdim(), A.coldim(), B.coldim(), A.getRank(),
- A.getPointer(), A.getStride(), A.getP().getPointer(), A.getQ().getPointer(),
- X.getPointer(), X.getStride(),
- B.getPointer(), B.getStride(), &info);
- if (info > 0)
- throw LinboxMathInconsistentSystem ("Linear system is inconsistent");
-
- return X;
- }
-
- BlasMatrix<Field>& operator() (const Field& F,
- const LQUPMatrix<Field>& A,
- BlasMatrix<Field>& B) const
- {
-
- int info;
- linbox_check (A.coldim() == A.rowdim());
- linbox_check (A.coldim() == B.rowdim());
-
- FFPACK::fgetrs ((typename Field::Father_t)F, FFLAS::FflasLeft, B.rowdim(), B.coldim(), A.getRank(),
- A.getPointer(), A.getStride(),
- A.getP().getPointer(), A.getQ().getPointer(),
- B.getPointer(), B.getStride(), &info);
- if (info > 0)
- throw LinboxMathInconsistentSystem ("Linear system is inconsistent");
+ Matrix1& X,
+ const Matrix2& B) const
+ {
+ linbox_check (A.coldim() == X.rowdim());
+ linbox_check (A.rowdim() == B.rowdim());
+ linbox_check (B.coldim() == X.coldim());
+ int info;
+ // we don't really need that...
+ typedef typename Matrix1::subMatrixType subMatrixType ;
+ typedef typename Matrix1::constSubMatrixType constSubMatrixType ;
+ subMatrixType X_v(X);
+ constSubMatrixType B_v(B);
+
+
+ FFPACK::fgetrs (F, FFLAS::FflasLeft, A.rowdim(), A.coldim(), B_v.coldim(), A.getRank(),
+ A.getPointer(), A.getStride(), A.getP().getPointer(), A.getQ().getPointer(),
+ X_v.getPointer(), X_v.getStride(),
+ B_v.getPointer(), B_v.getStride(), &info);
+ if (info > 0)
+ throw LinboxMathInconsistentSystem ("Linear system is inconsistent");
+
+ return X;
+ }
- return B;
- }
- }; // end of class FactorizedMatrixLeftSolve
+ template <class Field, class Matrix1>
+ Matrix1&
+ FactorizedMatrixLeftSolveIP<Field,Matrix1>::operator() ( const Field& F,
+ const LQUPMatrix<Field>& A,
+ Matrix1& B ) const
+ {
- template <class Field>
- class FactorizedMatrixRightSolve<Field, BlasMatrix<Field> > {
- public:
+ int info;
+ linbox_check (A.coldim() == A.rowdim());
+ linbox_check (A.coldim() == B.rowdim());
- BlasMatrix<Field>& operator() ( const Field& F,
- const LQUPMatrix<Field>& A,
- BlasMatrix<Field>& X,
- const BlasMatrix<Field>& B ) const
- {
- linbox_check (A.rowdim() == X.coldim());
- linbox_check (A.coldim() == B.coldim());
- linbox_check (B.rowdim() == X.rowdim());
- int info;
+ typedef typename Matrix1::subMatrixType subMatrixType ;
+ subMatrixType B_v(B);
- FFPACK::fgetrs ((typename Field::Father_t)F, FFLAS::FflasRight, A.rowdim(), A.coldim(), B.rowdim(), A.getRank(),
- A.getPointer(), A.getStride(),
- A.getP().getPointer(), A.getQ().getPointer(),
- X.getPointer(), X.getStride(),
- B.getPointer(), B.getStride(), &info);
- if (info > 0)
- throw LinboxMathInconsistentSystem ("Linear system is inconsistent");
- return X;
- }
+ FFPACK::fgetrs (F, FFLAS::FflasLeft, B_v.rowdim(), B_v.coldim(), A.getRank(),
+ A.getPointer(), A.getStride(),
+ A.getP().getPointer(), A.getQ().getPointer(),
+ B_v.getPointer(), B_v.getStride(), &info);
+ if (info > 0)
+ throw LinboxMathInconsistentSystem ("Linear system is inconsistent");
- BlasMatrix<Field>& operator() ( const Field& F,
- const LQUPMatrix<Field>& A,
- BlasMatrix<Field>& B ) const
- {
-
- int info;
- linbox_check (A.coldim() == A.rowdim());
- linbox_check (A.rowdim() == B.coldim());
-
- FFPACK::fgetrs ((typename Field::Father_t)F, FFLAS::FflasRight, B.rowdim(), B.coldim(), A.getRank(),
- A.getPointer(), A.getStride(),
- A.getP().getPointer(), A.getQ().getPointer(),
- B.getPointer(), B.getStride(), &info);
- if (info > 0)
- throw LinboxMathInconsistentSystem ("Linear system is inconsistent");
+ return B;
+ }
+ // end of class FactorizedMatrixLeftSolve
+
+ template <class Field, class Matrix1, class Matrix2>
+ Matrix1&
+ FactorizedMatrixRightSolve<Field,Matrix1,Matrix2>::operator() ( const Field& F,
+ const LQUPMatrix<Field>& A,
+ Matrix1& X,
+ const Matrix2& B ) const
+ {
+ linbox_check (A.rowdim() == X.coldim());
+ linbox_check (A.coldim() == B.coldim());
+ linbox_check (B.rowdim() == X.rowdim());
+ int info;
+ typedef typename Matrix1::subMatrixType subMatrixType ;
+ typedef typename Matrix1::constSubMatrixType constSubMatrixType ;
+ subMatrixType X_v(X);
+ constSubMatrixType B_v(B);
+
+ FFPACK::fgetrs (F, FFLAS::FflasRight, A.rowdim(), A.coldim(), B_v.rowdim(), A.getRank(),
+ A.getPointer(), A.getStride(),
+ A.getP().getPointer(), A.getQ().getPointer(),
+ X_v.getPointer(), X_v.getStride(),
+ B_v.getPointer(), B_v.getStride(), &info);
+ if (info > 0)
+ throw LinboxMathInconsistentSystem ("Linear system is inconsistent");
+
+ return X;
+ }
- return B;
- }
+ template <class Field, class Matrix1>
+ Matrix1&
+ FactorizedMatrixRightSolveIP<Field,Matrix1>::operator() ( const Field& F,
+ const LQUPMatrix<Field>& A,
+ Matrix1& B ) const
+ {
+
+ int info;
+ linbox_check (A.coldim() == A.rowdim());
+ linbox_check (A.rowdim() == B.coldim());
+ typedef typename Matrix1::subMatrixType subMatrixType ;
+ subMatrixType B_v(B);
+
+ FFPACK::fgetrs (F, FFLAS::FflasRight, B_v.rowdim(), B_v.coldim(), A.getRank(),
+ A.getPointer(), A.getStride(),
+ A.getP().getPointer(), A.getQ().getPointer(),
+ B_v.getPointer(), B_v.getStride(), &info);
+ if (info > 0)
+ throw LinboxMathInconsistentSystem ("Linear system is inconsistent");
+
+ return B;
+ }
- }; // end of class FactorizedMatrixRightSolve
+ // end of class FactorizedMatrixRightSolve
- template <class Field>
- class FactorizedMatrixLeftLSolve<Field, BlasMatrix<Field> > {
+ template <class Field,class _Rep>
+ class FactorizedMatrixLeftLSolve<Field, BlasMatrix<Field,_Rep> > {
public:
- BlasMatrix<Field>& operator() ( const Field& F,
+ BlasMatrix<Field,_Rep>& operator() ( const Field& F,
const LQUPMatrix<Field>& A,
- BlasMatrix<Field>& X,
- const BlasMatrix<Field>& B ) const
+ BlasMatrix<Field,_Rep>& X,
+ const BlasMatrix<Field,_Rep>& B ) const
{
linbox_check (A.rowdim() == B.rowdim());
X = B;
return (*this)(F, A, X);
}
- BlasMatrix<Field>& operator() ( const Field& F,
+ BlasMatrix<Field,_Rep>& operator() ( const Field& F,
const LQUPMatrix<Field>& A,
- BlasMatrix<Field>& B ) const
+ BlasMatrix<Field,_Rep>& B ) const
{
linbox_check (A.rowdim() == B.rowdim());
- FFPACK::solveLB2 ((typename Field::Father_t)F, FFLAS::FflasLeft, B.rowdim(), B.coldim(), A.getRank(),
+ FFPACK::solveLB2 (F, FFLAS::FflasLeft, B.rowdim(), B.coldim(), A.getRank(),
A.getPointer(), A.getStride(),
A.getQ().getPointer(),
B.getPointer(), B.getStride());
@@ -226,41 +254,41 @@ namespace LinBox
}
}; // end of class FactorizedMatrixLeftLSolve
- template <class Field>
- class FactorizedMatrixRightLSolve<Field, BlasMatrix<Field> > {
+ template <class Field, class _Rep>
+ class FactorizedMatrixRightLSolve<Field, BlasMatrix<Field,_Rep> > {
public:
- BlasMatrix<Field>& operator() (const Field& F,
+ BlasMatrix<Field,_Rep>& operator() (const Field& F,
const LQUPMatrix<Field>& A,
- BlasMatrix<Field>& X,
- const BlasMatrix<Field>& B) const
+ BlasMatrix<Field,_Rep>& X,
+ const BlasMatrix<Field,_Rep>& B) const
{
linbox_check (A.rowdim() == B.coldim());
X = B;
return (*this)( F, A, X );
}
- BlasMatrix<Field>& operator() (const Field& F,
- const BlasMatrix<Field>& A,
- BlasMatrix<Field>& B) const
+ BlasMatrix<Field,_Rep>& operator() (const Field& F,
+ const BlasMatrix<Field,_Rep>& A,
+ BlasMatrix<Field,_Rep>& B) const
{
linbox_check( A.rowdim() == B.coldim() );
- FFPACK::solveLB2 ((typename Field::Father_t)F, FFLAS::FflasRight, B.rowdim(), B.coldim(), A.getRank(),
+ FFPACK::solveLB2 (F, FFLAS::FflasRight, B.rowdim(), B.coldim(), A.getRank(),
A.getPointer(), A.getStride(),
A.getQ().getPointer(), B.getPointer(), B.getStride());
return B;
}
}; // end of class FactorizedMatrixRightLsolve
- template <class Field>
- class FactorizedMatrixLeftUSolve<Field, BlasMatrix<Field> > {
+ template <class Field, class _Rep>
+ class FactorizedMatrixLeftUSolve<Field, BlasMatrix<Field,_Rep> > {
public:
- BlasMatrix<Field>& operator() ( const Field& F,
+ BlasMatrix<Field,_Rep>& operator() ( const Field& F,
const LQUPMatrix<Field>& A,
- BlasMatrix<Field>& X,
- const BlasMatrix<Field>& B ) const
+ BlasMatrix<Field,_Rep>& X,
+ const BlasMatrix<Field,_Rep>& B ) const
{
linbox_check (A.coldim() == X.rowdim());
@@ -282,10 +310,11 @@ namespace LinBox
// The last rows of B are now supposed to be 0
- for (size_t i=0; i < A.getRank(); ++i)
- FFLAS::fcopy ((typename Field::Father_t)F, B.coldim(), Xp + i*ldx, 1, Bp + i*ldx,1);
+ // for (size_t i=0; i < A.getRank(); ++i)
+ // FFLAS::fassign (F, B.coldim(), Bp + i*ldx,1, Xp + i*ldx, 1);
+ FFLAS::fassign(F, A.getRank(),B.coldim(),Bp ,ldx, Xp, ldx);
- FFLAS::ftrsm ((typename Field::Father_t)F, FFLAS::FflasLeft, FFLAS::FflasUpper, FFLAS::FflasNoTrans, FFLAS::FflasNonUnit,
+ FFLAS::ftrsm (F, FFLAS::FflasLeft, FFLAS::FflasUpper, FFLAS::FflasNoTrans, FFLAS::FflasNonUnit,
A.getRank(), X.coldim(), F.one, A.getPointer(), A.getStride(), X.getPointer(), X.getStride());
for (size_t i=A.getRank(); i < X.rowdim(); ++i)
@@ -295,9 +324,9 @@ namespace LinBox
return X;
}
- BlasMatrix<Field>& operator() ( const Field& F,
- const BlasMatrix<Field>& A,
- BlasMatrix<Field>& B ) const
+ BlasMatrix<Field,_Rep>& operator() ( const Field& F,
+ const BlasMatrix<Field,_Rep>& A,
+ BlasMatrix<Field,_Rep>& B ) const
{
linbox_check (A.coldim() == A.rowdim());
@@ -313,7 +342,7 @@ namespace LinBox
if (!consistent)
throw LinboxMathInconsistentSystem ("Linear system is inconsistent");
- FFLAS::ftrsm ((typename Field::Father_t)F, FFLAS::FflasLeft, FFLAS::FflasUpper, FFLAS::FflasNoTrans, FFLAS::FflasNonUnit,
+ FFLAS::ftrsm (F, FFLAS::FflasLeft, FFLAS::FflasUpper, FFLAS::FflasNoTrans, FFLAS::FflasNonUnit,
A.getRank(), B.coldim(), F.one, A.getPointer(), A.getStride(), Bp, ldb);
return B;
@@ -321,13 +350,13 @@ namespace LinBox
}; // end of class FactorizedMatrixLeftUSolve
- template <class Field>
- class FactorizedMatrixRightUSolve<Field, BlasMatrix<Field> > {
+ template <class Field, class _Rep>
+ class FactorizedMatrixRightUSolve<Field, BlasMatrix<Field,_Rep> > {
public:
- BlasMatrix<Field>& operator() ( const Field& F,
+ BlasMatrix<Field,_Rep>& operator() ( const Field& F,
const LQUPMatrix<Field>& A,
- BlasMatrix<Field>& X,
- const BlasMatrix<Field>& B ) const
+ BlasMatrix<Field,_Rep>& X,
+ const BlasMatrix<Field,_Rep>& B ) const
{
linbox_check (X.coldim() == A.rowdim());
linbox_check (X.rowdim() == B.rowdim());
@@ -338,10 +367,11 @@ namespace LinBox
size_t ldb = B.getStride();
size_t ldx = X.getStride();
- for (size_t i = 0; i < X.getrowdim(); ++i)
- FFLAS::fcopy ((typename Field::Father_t)F, R, Xp + i*ldx, 1, Bp + i*ldb,1);
+ // for (size_t i = 0; i < X.getrowdim(); ++i)
+ // FFLAS::fassign (F, R, Xp + i*ldx, 1, Bp + i*ldb,1);
+ FFLAS::fassign (F, R, X.getrowdim(), Bp , ldb, Xp , ldx);
- FFLAS::ftrsm ((typename Field::Father_t)F, FFLAS::FflasRight, FFLAS::FflasUpper, FFLAS::FflasNoTrans, FFLAS::FflasNonUnit,
+ FFLAS::ftrsm (F, FFLAS::FflasRight, FFLAS::FflasUpper, FFLAS::FflasNoTrans, FFLAS::FflasNonUnit,
X.rowdim(), R, F.one, A.getPointer(), A.getStride(), X.getPointer(), X.getStride());
bool consistent = true;
@@ -349,7 +379,7 @@ namespace LinBox
typename Field::Element* W = new typename Field::Element [B.rowdim() * (B.coldim() - R)];
size_t ldw = B.rowdim();
- FFLAS::fgemm ((typename Field::Father_t) F, FFLAS::FflasNoTrans, FFLAS::FflasNoTrans,
+ FFLAS::fgemm ( F, FFLAS::FflasNoTrans, FFLAS::FflasNoTrans,
X.rowdim(), B.coldim() - R, R,
F.one, Xp, X.getStride(), A.getPointer() + R, A.getStride,
F.zero, W, ldw);
@@ -361,7 +391,7 @@ namespace LinBox
delete[] W;
}
else {
- FFLAS::fgemm ((typename Field::Father_t)F, FFLAS::FflasNoTrans, FFLAS::FflasNoTrans,
+ FFLAS::fgemm (F, FFLAS::FflasNoTrans, FFLAS::FflasNoTrans,
X.rowdim(), B.coldim() - R, R,
F.one, Xp, X.getStride(), A.getPointer() + R, A.getStride,
F.zero, Xp + R, X.getStride());
@@ -380,9 +410,9 @@ namespace LinBox
return X;
}
- BlasMatrix<Field>& operator() ( const Field& F,
+ BlasMatrix<Field,_Rep>& operator() ( const Field& F,
const LQUPMatrix<Field>& A,
- BlasMatrix<Field>& B ) const
+ BlasMatrix<Field,_Rep>& B ) const
{
linbox_check (A.coldim() == A.rowdim());
linbox_check (B.coldim() == A.rowdim());
@@ -391,10 +421,10 @@ namespace LinBox
size_t ldb = B.getStride();
size_t R = A.getRank();
- FFLAS::ftrsm ((typename Field::Father_t)F, FFLAS::FflasRight, FFLAS::FflasUpper, FFLAS::FflasNoTrans, FFLAS::FflasNonUnit,
+ FFLAS::ftrsm (F, FFLAS::FflasRight, FFLAS::FflasUpper, FFLAS::FflasNoTrans, FFLAS::FflasNonUnit,
B.rowdim(), R, F.one, A.getPointer(), A.getStride(), B.getPointer(), B.getStride());
- FFLAS::fgemm ((typename Field::Father_t)F, FFLAS::FflasNoTrans, FFLAS::FflasNoTrans,
+ FFLAS::fgemm (F, FFLAS::FflasNoTrans, FFLAS::FflasNoTrans,
B.rowdim(), B.coldim() - R, R,
F.one, Bp, B.getStride(), A.getPointer() + R, A.getStride,
F.mOne, Bp + R, B.getStride());
@@ -429,7 +459,7 @@ namespace LinBox
linbox_check (A.rowdim() == b.size());
int info;
- FFPACK::fgetrs ((typename Field::Father_t)F, FFLAS::FflasLeft, A.rowdim(), A.coldim(), 1, A.getRank(),
+ FFPACK::fgetrs (F, FFLAS::FflasLeft, A.rowdim(), A.coldim(), 1, A.getRank(),
A.getPointer(), A.getStride(), A.getP().getPointer(), A.getQ().getPointer(),
&x[0], 1, &b[0], 1, &info);
if (info > 0)
@@ -447,7 +477,7 @@ namespace LinBox
linbox_check (A.coldim() == A.rowdim());
linbox_check (A.coldim() == b.size());
- FFPACK::fgetrs ((typename Field::Father_t)F, FFLAS::FflasLeft, b.size(), 1, A.getRank(),
+ FFPACK::fgetrs (F, FFLAS::FflasLeft, b.size(), 1, A.getRank(),
A.getPointer(), A.getStride(),
A.getP().getPointer(), A.getQ().getPointer(),
&b[0], 1, &info);
@@ -471,7 +501,7 @@ namespace LinBox
linbox_check (A.coldim() == b.size());
int info;
- FFPACK::fgetrs ((typename Field::Father_t)F, FFLAS::FflasRight, A.rowdim(), A.coldim(), 1, A.getRank(),
+ FFPACK::fgetrs (F, FFLAS::FflasRight, A.rowdim(), A.coldim(), 1, A.getRank(),
A.getPointer(), A.getStride(),
A.getP().getPointer(), A.getQ().getPointer(),
&x[0], x.size(), &b[0], b.size(), &info);
@@ -490,7 +520,7 @@ namespace LinBox
linbox_check (A.coldim() == A.rowdim());
linbox_check (A.rowdim() == b.size());
- FFPACK::fgetrs ((typename Field::Father_t)F, FFLAS::FflasRight, 1, b.size(), A.getRank(),
+ FFPACK::fgetrs (F, FFLAS::FflasRight, 1, b.size(), A.getRank(),
A.getPointer(), A.getStride(),
A.getP().getPointer(), A.getQ().getPointer(),
&b[0], b.size(), &info);
@@ -520,7 +550,7 @@ namespace LinBox
{
linbox_check (A.rowdim() == b.size());
- FFPACK::solveLB2 ((typename Field::Father_t)F, FFLAS::FflasLeft, b.size(), 1, A.getRank(),
+ FFPACK::solveLB2 (F, FFLAS::FflasLeft, b.size(), 1, A.getRank(),
A.getPointer(), A.getStride(),
A.getQ().getPointer(), &b[0], 1);
@@ -533,11 +563,11 @@ namespace LinBox
// To be changed: solveLB is designed for matrices, not for vectors
if ( A.rowdim() <= A.coldim() ) {
- FFPACK::solveLB((typename Field::Father_t) F, FFLAS::FflasLeft, n, 1, r, A.getPointer(), A.getStride(),
+ FFPACK::solveLB( F, FFLAS::FflasLeft, n, 1, r, A.getPointer(), A.getStride(),
A.getQ().getPointer(), &b[0], b.size() );
}
else
- FFPACK::solveLB2((typename Field::Father_t) F, FFLAS::FflasLeft, n, 1, r, A.getPointer(), A.getStride(),
+ FFPACK::solveLB2( F, FFLAS::FflasLeft, n, 1, r, A.getPointer(), A.getStride(),
A.getQ().getPointer(), b.getPointer(), b.getStride() );
return b;
@@ -564,7 +594,7 @@ namespace LinBox
{
linbox_check (A.rowdim() == b.size());
- FFPACK::solveLB2 ((typename Field::Father_t)F, FFLAS::FflasRight, 1, b.size(), A.getRank(),
+ FFPACK::solveLB2 (F, FFLAS::FflasRight, 1, b.size(), A.getRank(),
A.getPointer(), A.getStride(),
A.getQ().getPointer(), &b[0], b.size());
return b;
@@ -583,7 +613,7 @@ namespace LinBox
linbox_check (A.rowdim() == b.size());
bool consistent = true;
- typename Field::Element * bp = &b[0]; ;
+ // typename Field::Element * bp = &b[0]; ;
typename Field::Element * xp = &x[0];
for (size_t i = A.getRank(); i < b.size(); ++i)
@@ -597,7 +627,7 @@ namespace LinBox
for (size_t i=0; i < A.getRank(); ++i)
F.assign (x[i], b[i]);
- FFLAS::ftrsv ((typename Field::Father_t)F, FFLAS::FflasUpper, FFLAS::FflasNoTrans, FFLAS::FflasNonUnit,
+ FFLAS::ftrsv (F, FFLAS::FflasUpper, FFLAS::FflasNoTrans, FFLAS::FflasNonUnit,
A.getRank(), A.getPointer(), A.getStride(), xp, 1);
for (size_t i=A.getRank(); i < x.size(); ++i)
@@ -621,7 +651,7 @@ namespace LinBox
if (!consistent)
throw LinboxMathInconsistentSystem ("Linear system is inconsistent");
- FFLAS::ftrsv ((typename Field::Father_t)F, FFLAS::FflasUpper, FFLAS::FflasNoTrans, FFLAS::FflasNonUnit,
+ FFLAS::ftrsv (F, FFLAS::FflasUpper, FFLAS::FflasNoTrans, FFLAS::FflasNonUnit,
A.getRank(), A.getPointer(), A.getStride(), &b[0], 1);
return b;
@@ -639,21 +669,21 @@ namespace LinBox
{
linbox_check (x.size() == A.rowdim());
linbox_check (A.coldim() == b.size());
- typename Field::Element * bp = b.getPointer();
+ // typename Field::Element * bp = b.getPointer();
typename Field::Element * xp = x.getPointer();
size_t R = A.getRank();
for (size_t i = 0; i < R; ++i)
F.assign (x[i], b[i]);
- FFLAS::ftrsv ((typename Field::Father_t)F, FFLAS::FflasUpper, FFLAS::FflasTrans, FFLAS::FflasNonUnit,
+ FFLAS::ftrsv (F, FFLAS::FflasUpper, FFLAS::FflasTrans, FFLAS::FflasNonUnit,
R, A.getPointer(), A.getStride(), xp, 1);
bool consistent = true;
if (b.size() > x.size()) {
typename Field::Element* W = new typename Field::Element [b.size() - R];
- FFLAS::fgemv ((typename Field::Father_t)F, FFLAS::FflasTrans,
+ FFLAS::fgemv (F, FFLAS::FflasTrans,
R, b.size() - R,
F.one, A.getPointer() + R, A.getStride, xp, 1,
F.zero, W, 1);
@@ -664,7 +694,7 @@ namespace LinBox
delete[] W;
}
else {
- FFLAS::fgemv ((typename Field::Father_t)F, FFLAS::FflasTrans,
+ FFLAS::fgemv (F, FFLAS::FflasTrans,
R, b.size() - R,
F.one, A.getPointer() + R, A.getStride, xp, 1,
F.zero, xp + R, 1);
@@ -691,10 +721,10 @@ namespace LinBox
typename Field::Element * bp = &b[0];
size_t R = A.getRank();
- FFLAS::ftrsv ((typename Field::Father_t)F, FFLAS::FflasUpper, FFLAS::FflasTrans, FFLAS::FflasNonUnit,
+ FFLAS::ftrsv (F, FFLAS::FflasUpper, FFLAS::FflasTrans, FFLAS::FflasNonUnit,
R, F.one, A.getPointer(), A.getStride(), bp, 1);
- FFLAS::fgemv ((typename Field::Father_t)F, FFLAS::FflasTrans,
+ FFLAS::fgemv (F, FFLAS::FflasTrans,
R, b.size() - R,
F.one, A.getPointer() + R, A.getStride, bp, 1,
F.mOne, bp + R, 1);
@@ -710,6 +740,303 @@ namespace LinBox
}
}; // end of class FactorizedMatrixRightUSolve
+ /*
+ * Solvers with vectors: Operand=BlasVector<Field>
+ */
+
+
+ template <class Field>
+ class FactorizedMatrixLeftSolve<Field, BlasVector<Field> > {
+ public:
+ BlasVector<Field>& operator() ( const Field& F,
+ const LQUPMatrix<Field>& A,
+ BlasVector<Field>& x,
+ const BlasVector<Field>& b ) const
+ {
+ linbox_check (A.coldim() == x.size());
+ linbox_check (A.rowdim() == b.size());
+ int info;
+
+ FFPACK::fgetrs (F, FFLAS::FflasLeft, A.rowdim(), A.coldim(), 1, A.getRank(),
+ A.getPointer(), A.getStride(), A.getP().getPointer(), A.getQ().getPointer(),
+ &x[0], 1, &b[0], 1, &info);
+ if (info > 0)
+ throw LinboxMathInconsistentSystem ("Linear system is inconsistent");
+
+ return x;
+ }
+
+ BlasVector<Field>& operator() ( const Field& F,
+ const LQUPMatrix<Field>& A,
+ BlasVector<Field>& b ) const
+ {
+
+ int info;
+ linbox_check (A.coldim() == A.rowdim());
+ linbox_check (A.coldim() == b.size());
+
+ FFPACK::fgetrs (F, FFLAS::FflasLeft, b.size(), 1, A.getRank(),
+ A.getPointer(), A.getStride(),
+ A.getP().getPointer(), A.getQ().getPointer(),
+ &b[0], 1, &info);
+ if (info > 0)
+ throw LinboxMathInconsistentSystem ("Linear system is inconsistent");
+
+ return b;
+ }
+ }; // end of class FactorizedMatrixLeftSolve
+
+ template <class Field>
+ class FactorizedMatrixRightSolve<Field, BlasVector<Field> > {
+ public:
+
+ BlasVector<Field>& operator() ( const Field& F,
+ const LQUPMatrix<Field>& A,
+ BlasVector<Field>& x,
+ const BlasVector<Field>& b ) const
+ {
+ linbox_check (A.rowdim() == x.size());
+ linbox_check (A.coldim() == b.size());
+ int info;
+
+ FFPACK::fgetrs (F, FFLAS::FflasRight, A.rowdim(), A.coldim(), 1, A.getRank(),
+ A.getPointer(), A.getStride(),
+ A.getP().getPointer(), A.getQ().getPointer(),
+ &x[0], x.size(), &b[0], b.size(), &info);
+ if (info > 0)
+ throw LinboxMathInconsistentSystem ("Linear system is inconsistent");
+
+ return x;
+ }
+
+ BlasVector<Field>& operator() ( const Field& F,
+ const LQUPMatrix<Field>& A,
+ BlasVector<Field>& b ) const
+ {
+
+ int info;
+ linbox_check (A.coldim() == A.rowdim());
+ linbox_check (A.rowdim() == b.size());
+
+ FFPACK::fgetrs (F, FFLAS::FflasRight, 1, b.size(), A.getRank(),
+ A.getPointer(), A.getStride(),
+ A.getP().getPointer(), A.getQ().getPointer(),
+ &b[0], b.size(), &info);
+ if (info > 0)
+ throw LinboxMathInconsistentSystem ("Linear system is inconsistent");
+
+ return b;
+ }
+ }; // end of class FactorizedMatrixRightSolve
+
+ template <class Field>
+ class FactorizedMatrixLeftLSolve<Field, BlasVector<Field> > {
+ public:
+ BlasVector<Field>& operator() ( const Field& F,
+ const LQUPMatrix<Field>& A,
+ BlasVector<Field>& x,
+ const BlasVector<Field>& b ) const
+ {
+ linbox_check( A.rowdim() == b.size() );
+ x = b;
+ return (*this)( F, A, x );
+ }
+
+ BlasVector<Field>& operator() ( const Field& F,
+ const LQUPMatrix<Field>& A,
+ BlasVector<Field>& b ) const
+ {
+ linbox_check (A.rowdim() == b.size());
+
+ FFPACK::solveLB2 (F, FFLAS::FflasLeft, b.size(), 1, A.getRank(),
+ A.getPointer(), A.getStride(),
+ A.getQ().getPointer(), &b[0], 1);
+
+ return b;
+
+#if 0 /* BB: unreachable ! */
+ size_t n = b.size(); // bds: b not B
+ linbox_check( A.rowdim() == n );
+ size_t r = A.getRank();
+
+ // To be changed: solveLB is designed for matrices, not for vectors
+ if ( A.rowdim() <= A.coldim() ) {
+ FFPACK::solveLB( F, FFLAS::FflasLeft, n, 1, r, A.getPointer(), A.getStride(),
+ A.getQ().getPointer(), &b[0], b.size() );
+ }
+ else
+ FFPACK::solveLB2( F, FFLAS::FflasLeft, n, 1, r, A.getPointer(), A.getStride(),
+ A.getQ().getPointer(), b.getPointer(), b.getStride() );
+ return b;
+
+#endif
+ }
+ }; // end of class FactorizedMatrixLeftLSolve
+
+ template <class Field>
+ class FactorizedMatrixRightLSolve<Field, BlasVector<Field> > {
+ public:
+ BlasVector<Field>& operator() ( const Field& F,
+ const LQUPMatrix<Field>& A,
+ BlasVector<Field>& x,
+ const BlasVector<Field>& b ) const
+ {
+ linbox_check( A.rowdim() == b.size() );
+ x = b;
+ return (*this)( F, A, x );
+ }
+
+ BlasVector<Field>& operator() ( const Field& F,
+ const LQUPMatrix<Field>& A,
+ BlasVector<Field>& b ) const
+ {
+ linbox_check (A.rowdim() == b.size());
+
+ FFPACK::solveLB2 (F, FFLAS::FflasRight, 1, b.size(), A.getRank(),
+ A.getPointer(), A.getStride(),
+ A.getQ().getPointer(), &b[0], b.size());
+ return b;
+ }
+ }; // end of class FactorizedMatrixRightLsolve
+
+ template <class Field>
+ class FactorizedMatrixLeftUSolve<Field, BlasVector<Field> > {
+ public:
+ BlasVector<Field>& operator() ( const Field& F,
+ const LQUPMatrix<Field>& A,
+ BlasVector<Field>& x,
+ const BlasVector<Field>& b ) const
+ {
+ linbox_check (A.coldim() == x.size());
+ linbox_check (A.rowdim() == b.size());
+
+ bool consistent = true;
+ // typename Field::Element * bp = &b[0]; ;
+ typename Field::Element * xp = &x[0];
+
+ for (size_t i = A.getRank(); i < b.size(); ++i)
+ if (!F.isZero (b[i]))
+ consistent = false;
+ if (!consistent)
+ throw LinboxMathInconsistentSystem ("Linear system is inconsistent");
+
+ // The last rows of B are now supposed to be 0
+
+ for (size_t i=0; i < A.getRank(); ++i)
+ F.assign (x[i], b[i]);
+
+ FFLAS::ftrsv (F, FFLAS::FflasUpper, FFLAS::FflasNoTrans, FFLAS::FflasNonUnit,
+ A.getRank(), A.getPointer(), A.getStride(), xp, 1);
+
+ for (size_t i=A.getRank(); i < x.size(); ++i)
+ F.assign (x[i], F.zero);
+ return x;
+
+ }
+
+ BlasVector<Field>& operator() ( const Field& F,
+ const LQUPMatrix<Field>& A,
+ BlasVector<Field>& b ) const
+ {
+
+ linbox_check (A.coldim() == A.rowdim());
+ linbox_check (A.coldim() == b.size());
+ bool consistent = true;
+
+ for (size_t i = A.getRank(); i < b.size(); ++i)
+ if (!F.isZero (b[i]))
+ consistent = false;
+ if (!consistent)
+ throw LinboxMathInconsistentSystem ("Linear system is inconsistent");
+
+ FFLAS::ftrsv (F, FFLAS::FflasUpper, FFLAS::FflasNoTrans, FFLAS::FflasNonUnit,
+ A.getRank(), A.getPointer(), A.getStride(), &b[0], 1);
+
+ return b;
+ }
+
+ }; // end of class FactorizedMatrixLeftUSolve
+
+ template <class Field>
+ class FactorizedMatrixRightUSolve<Field, BlasVector<Field> > {
+ public:
+ BlasVector<Field>& operator() ( const Field& F,
+ const LQUPMatrix<Field>& A,
+ BlasVector<Field>& x,
+ const BlasVector<Field>& b ) const
+ {
+ linbox_check (x.size() == A.rowdim());
+ linbox_check (A.coldim() == b.size());
+ // typename Field::Element * bp = b.getPointer();
+ typename Field::Element * xp = x.getPointer();
+ size_t R = A.getRank();
+
+ for (size_t i = 0; i < R; ++i)
+ F.assign (x[i], b[i]);
+
+ FFLAS::ftrsv (F, FFLAS::FflasUpper, FFLAS::FflasTrans, FFLAS::FflasNonUnit,
+ R, A.getPointer(), A.getStride(), xp, 1);
+
+ bool consistent = true;
+ if (b.size() > x.size()) {
+ typename Field::Element* W = new typename Field::Element [b.size() - R];
+
+ FFLAS::fgemv (F, FFLAS::FflasTrans,
+ R, b.size() - R,
+ F.one, A.getPointer() + R, A.getStride, xp, 1,
+ F.zero, W, 1);
+
+ for (size_t i = 0; i < b.size() - R; ++i)
+ if (!F.areEqual (W[i], b[i + R]))
+ consistent = false;
+ delete[] W;
+ }
+ else {
+ FFLAS::fgemv (F, FFLAS::FflasTrans,
+ R, b.size() - R,
+ F.one, A.getPointer() + R, A.getStride, xp, 1,
+ F.zero, xp + R, 1);
+
+ for (size_t i = R; i < b.size(); ++i)
+ if (!F.areEqual (x[i], b[i]))
+ consistent = false;
+ }
+
+ if (!consistent)
+ throw LinboxMathInconsistentSystem ("Linear system is inconsistent");
+
+ for (size_t j = R; j < x.size(); ++j)
+ F.assign (x[j], F.zero);
+ return x;
+ }
+ BlasVector<Field>& operator() ( const Field& F,
+ const LQUPMatrix<Field>& A,
+ BlasVector<Field>& b ) const
+ {
+ linbox_check (A.coldim() == A.rowdim());
+ linbox_check (b.size() == A.rowdim());
+
+ typename Field::Element * bp = &b[0];
+ size_t R = A.getRank();
+
+ FFLAS::ftrsv (F, FFLAS::FflasUpper, FFLAS::FflasTrans, FFLAS::FflasNonUnit,
+ R, F.one, A.getPointer(), A.getStride(), bp, 1);
+
+ FFLAS::fgemv (F, FFLAS::FflasTrans,
+ R, b.size() - R,
+ F.one, A.getPointer() + R, A.getStride, bp, 1,
+ F.mOne, bp + R, 1);
+
+ bool consistent = true;
+ for (size_t j = R; j < b.size(); ++j)
+ if (!F.isZero (b[j]))
+ consistent = false;
+ if (!consistent)
+ throw LinboxMathInconsistentSystem ("Linear system is inconsistent");
+
+ return b;
+ }
+ }; // end of class FactorizedMatrixRightUSolve
}
}
@@ -717,8 +1044,9 @@ namespace LinBox
namespace LinBox
{
template <class Field>
- LQUPMatrix<Field>::LQUPMatrix (const BlasMatrix<Field>& A) :
- _field(A.field()), _factLU(*(new BlasMatrix<Field> (A))) ,
+ template <class _Rep>
+ LQUPMatrix<Field>::LQUPMatrix (const BlasMatrix<Field,_Rep>& A) :
+ _field(A.field()), _factLU(*(new BlasMatrix<Field,_Rep> (A))) ,
_permP(*(new BlasPermutation<size_t>(A.coldim()))),
_permQ(*(new BlasPermutation<size_t>(A.rowdim()))),
_m(A.rowdim()), _n(A.coldim()),
@@ -729,11 +1057,11 @@ namespace LinBox
_rank = 0 ;
}
else {
- _rank= FFPACK::LUdivine((typename Field::Father_t) _field,FFLAS::FflasNonUnit, FFLAS::FflasNoTrans,
+ _rank= FFPACK::LUdivine( _field,FFLAS::FflasNonUnit, FFLAS::FflasNoTrans,
_m, _n,
_factLU.getPointer(),_factLU.getStride(),
- _permP.getWritePointer(), _permQ.getWritePointer(),
- FFPACK::FfpackLQUP );
+ _permP.getWritePointer(), _permQ.getWritePointer());
+/* FFPACK::FfpackLQUP );*/
}
_permP.setOrder(_rank);
_permQ.setOrder(_rank);
@@ -741,8 +1069,9 @@ namespace LinBox
}
template <class Field>
- LQUPMatrix<Field>::LQUPMatrix (BlasMatrix<Field>& A) :
- _field(A.field()), _factLU(static_cast<BlasMatrix<Field>&> (A)) ,
+ template <class _Rep>
+ LQUPMatrix<Field>::LQUPMatrix (BlasMatrix<Field,_Rep>& A) :
+ _field(A.field()), _factLU(static_cast<BlasMatrix<Field,_Rep>&> (A)) ,
_permP(*(new BlasPermutation<size_t>(A.coldim()))),
_permQ(*(new BlasPermutation<size_t>(A.rowdim()))),
// _permP(A.coldim()), _permQ(A.rowdim()),
@@ -754,11 +1083,11 @@ namespace LinBox
_rank = 0 ;
}
else {
- _rank= FFPACK::LUdivine((typename Field::Father_t) _field,FFLAS::FflasNonUnit, FFLAS::FflasNoTrans,
+ _rank= FFPACK::LUdivine( _field,FFLAS::FflasNonUnit, FFLAS::FflasNoTrans,
_m, _n,
_factLU.getPointer(),_factLU.getStride(),
- _permP.getWritePointer(), _permQ.getWritePointer(),
- FFPACK::FfpackLQUP );
+ _permP.getWritePointer(), _permQ.getWritePointer());
+/* FFPACK::FfpackLQUP );*/
}
_permP.setOrder(_rank);
_permQ.setOrder(_rank);
@@ -766,9 +1095,10 @@ namespace LinBox
}
template <class Field>
- LQUPMatrix<Field>::LQUPMatrix (const BlasMatrix<Field>& A,
+ template <class _Rep>
+ LQUPMatrix<Field>::LQUPMatrix (const BlasMatrix<Field,_Rep>& A,
BlasPermutation<size_t> & P, BlasPermutation<size_t> & Q) :
- _field(A.field()), _factLU(*(new BlasMatrix<Field> (A))) ,
+ _field(A.field()), _factLU(*(new BlasMatrix<Field,_Rep> (A))) ,
_permP(P), _permQ(Q),
_m(A.rowdim()), _n(A.coldim()),
_alloc(true),_plloc(false)
@@ -778,11 +1108,11 @@ namespace LinBox
linbox_check(_permP.getOrder()==A.coldim());
- _rank= FFPACK::LUdivine((typename Field::Father_t) _field,FFLAS::FflasNonUnit, FFLAS::FflasNoTrans,
+ _rank= FFPACK::LUdivine( _field,FFLAS::FflasNonUnit, FFLAS::FflasNoTrans,
_m, _n,
_factLU.getPointer(),_factLU.getStride(),
- _permP.getWritePointer(), _permQ.getWritePointer(),
- FFPACK::FfpackLQUP );
+ _permP.getWritePointer(), _permQ.getWritePointer());
+/* FFPACK::FfpackLQUP );*/
_permP.setOrder(_rank);
_permQ.setOrder(_rank);
@@ -790,9 +1120,10 @@ namespace LinBox
}
template <class Field>
- LQUPMatrix<Field>::LQUPMatrix (BlasMatrix<Field>& A,
+ template <class _Rep>
+ LQUPMatrix<Field>::LQUPMatrix (BlasMatrix<Field,_Rep>& A,
BlasPermutation<size_t> & P, BlasPermutation<size_t> & Q) :
- _field(A.field()), _factLU(static_cast<BlasMatrix<Field>&> (A)) ,
+ _field(A.field()), _factLU(static_cast<BlasMatrix<Field,_Rep>&> (A)) ,
_permP(P), _permQ(Q),
_m(A.rowdim()), _n(A.coldim()),
_alloc(false),_plloc(false)
@@ -807,11 +1138,14 @@ namespace LinBox
_permP.resize(A.coldim());
- _rank= FFPACK::LUdivine((typename Field::Father_t) _field,FFLAS::FflasNonUnit, FFLAS::FflasNoTrans,
- _m, _n,
- _factLU.getPointer(),_factLU.getStride(),
- _permP.getWritePointer(), _permQ.getWritePointer(),
- FFPACK::FfpackLQUP );
+ _rank= FFPACK::LUdivine<Field>( _field,FFLAS::FflasNonUnit, FFLAS::FflasNoTrans,
+ _m, _n,
+ _factLU.getPointer(),_factLU.getStride(),
+ _permP.getWritePointer(), _permQ.getWritePointer());
+
+ /* FFPACK::FfpackLQUP );*/
+
+
_permP.setOrder(_rank);
_permQ.setOrder(_rank);
@@ -881,15 +1215,16 @@ namespace LinBox
// get the Matrix L
template <class Field>
- inline TriangularBlasMatrix<Field>&
- LQUPMatrix<Field>::getL( TriangularBlasMatrix<Field>& L,
+ template<class _Rep>
+ inline TriangularBlasMatrix<Field,_Rep>&
+ LQUPMatrix<Field>::getL( TriangularBlasMatrix<Field,_Rep>& L,
bool _QLUP ) const
{
linbox_check( L.coldim() == _m);
linbox_check( L.rowdim() == _m);
- linbox_check( L.getUpLo() == LinBoxTag::Lower);
- linbox_check( L.getDiag() == LinBoxTag::Unit);
+ linbox_check( L.getUpLo() == Tag::Shape::Lower);
+ linbox_check( L.getDiag() == Tag::Diag::Unit);
#if 0
if (_m > _n) {
@@ -932,17 +1267,17 @@ namespace LinBox
#endif
if (!_permQ.isIdentity())
- FFPACK::applyP((typename Field::Father_t) _field, FFLAS::FflasRight, FFLAS::FflasNoTrans,
+ FFPACK::applyP( _field, FFLAS::FflasRight, FFLAS::FflasNoTrans,
_m,0,(int)_permQ.getOrder(),
L.getWritePointer(), _m, _permQ.getPointer() );
for ( size_t i=0; i<_m; ++i )
L.setEntry( i, i, _field.one );
if (_QLUP) {
if (!_permQ.isIdentity()) {
- FFPACK::applyP((typename Field::Father_t) _field, FFLAS::FflasLeft, FFLAS::FflasNoTrans,
+ FFPACK::applyP( _field, FFLAS::FflasLeft, FFLAS::FflasNoTrans,
_m,0,(int)_permQ.getOrder(),
L.getWritePointer(), _m, _permQ.getPointer() );
- FFPACK::applyP((typename Field::Father_t) _field, FFLAS::FflasRight, FFLAS::FflasTrans,
+ FFPACK::applyP( _field, FFLAS::FflasRight, FFLAS::FflasTrans,
_m,0,(int)_permQ.getOrder(),
L.getWritePointer(), _m, _permQ.getPointer() );
@@ -955,14 +1290,15 @@ namespace LinBox
// get the matrix U
template <class Field>
- inline TriangularBlasMatrix<Field>&
- LQUPMatrix<Field>::getU( TriangularBlasMatrix<Field>& U ) const
+ template<class _Rep>
+ inline TriangularBlasMatrix<Field,_Rep>&
+ LQUPMatrix<Field>::getU( TriangularBlasMatrix<Field,_Rep>& U ) const
{
linbox_check( U.rowdim() == _m);
linbox_check( U.coldim() == _n);
- linbox_check( U.getUpLo() == LinBoxTag::Upper);
- linbox_check( U.getDiag() == LinBoxTag::NonUnit);
+ linbox_check( U.getUpLo() == Tag::Shape::Upper);
+ linbox_check( U.getDiag() == Tag::Diag::NonUnit);
for ( size_t i=0; i<_m; ++i )
for ( size_t j=i; j<_n; ++j )
U.setEntry( i, j, _factLU.getEntry(i,j) );
@@ -971,8 +1307,9 @@ namespace LinBox
// get the Matrix S (from the LSP factorization of A deduced from LQUP)
template <class Field>
- inline BlasMatrix<Field>&
- LQUPMatrix<Field>::getS( BlasMatrix<Field>& S) const
+ template<class _Rep>
+ inline BlasMatrix<Field,_Rep>&
+ LQUPMatrix<Field>::getS( BlasMatrix<Field,_Rep>& S) const
{
linbox_check( S.rowdim() == _m);
@@ -985,7 +1322,7 @@ namespace LinBox
}
if (!_permQ.isIdentity())
- FFPACK::applyP((typename Field::Father_t) _field, FFLAS::FflasLeft, FFLAS::FflasTrans,
+ FFPACK::applyP( _field, FFLAS::FflasLeft, FFLAS::FflasTrans,
_n, 0,(int) _permQ.getOrder(),
S.getWritePointer(), _n, _permQ.getPointer() );
return S;
@@ -1018,7 +1355,7 @@ namespace LinBox
template <class Operand>
Operand& LQUPMatrix<Field>::left_solve(Operand& B) const
{
- return Protected::FactorizedMatrixLeftSolve<Field,Operand>()( _field, *this, B );
+ return Protected::FactorizedMatrixLeftSolveIP<Field,Operand>()( _field, *this, B );
}
// solve XA=B
@@ -1034,7 +1371,7 @@ namespace LinBox
template <class Operand>
Operand& LQUPMatrix<Field>::right_solve(Operand& B) const
{
- return Protected::FactorizedMatrixRightSolve<Field,Operand>()( _field, *this, B );
+ return Protected::FactorizedMatrixRightSolveIP<Field,Operand>()( _field, *this, B );
}
// solve LX=B (L from LQUP)
@@ -1108,11 +1445,10 @@ namespace LinBox
#endif // __LINBOX_factorized_matrix_INL
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
// Local Variables:
// mode: C++
// tab-width: 8
// indent-tabs-mode: nil
// c-basic-offset: 8
// End:
-
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/matrix/grid.h b/linbox/matrix/grid.h
new file mode 100644
index 0000000..8fedc54
--- /dev/null
+++ b/linbox/matrix/grid.h
@@ -0,0 +1,612 @@
+/* Copyright (C) LinBox
+ *
+ *
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ * ========LICENCE========
+ */
+
+#ifndef __LINBOX_matrix_grid_H
+#define __LINBOX_matrix_grid_H
+
+#include <iostream>
+
+#include <vector>
+#include <queue>
+
+#include "linbox/linbox-config.h"
+#include "linbox/integer.h"
+
+
+namespace LinBox
+{
+
+ template <class Element>
+ class ijElement {
+
+ public:
+ size_t i;
+ size_t j;
+ Element x;
+
+ ijElement(size_t ii, size_t jj, Element xx) {i=ii;j=jj;x=xx;}
+ ijElement(ijElement& Y) {i = Y.i; j = Y.j; x = Y.x;}
+ ~ijElement() {};
+ //Element& setElement(Element& y) {return x=y;}
+ };
+
+ template <class Element>
+ class GridElement {
+
+ public:
+ GridElement* prev;
+ GridElement* next;
+ GridElement* down;
+ GridElement* up;
+ ijElement<Element> X;
+
+ GridElement(ijElement<Element>& Y) :
+ X(Y)
+ {
+ prev = NULL;
+ next = NULL;
+ down = NULL;
+ up = NULL;
+ }
+
+ GridElement(size_t i, size_t j, Element x) :
+ X(i,j,x)
+ {
+ prev = NULL;
+ next = NULL;
+ down = NULL;
+ up = NULL;
+ }
+
+ ~GridElement()
+ {
+ //prev = NULL; next = NULL; down = NULL; up = NUll;
+ }
+
+ Element& getX() {return X.x;}
+ size_t getI() {return X.i;}
+ size_t getJ() {return X.j;}
+
+ Element& setElement(Element& y) {return X.x=y;}
+ ijElement<Element>& setijElement(size_t i, size_t j, Element& x) {X.i=i; X.j = j; X.x = x; return X;}
+ };
+
+ template <class Field, class Element>
+ class Grid {
+
+ public:
+ Field _field;
+ size_t _n;
+ size_t _m;
+ std::vector<int> rowOcc;
+ //std::vector<Element> rowGcd;
+ std::vector<int> colOcc;
+ //std::vector<Element> colGcd;
+
+ std::queue<size_t> Q; //change to priority queue?
+ std::vector<GridElement<Element>*> A; //std::vector of row heads
+ std::vector<GridElement<Element>*> AT; //std::vector of column heads
+
+ /*
+ * Creates Grid from file using read procedure
+ * file is sorted in sms format
+ */
+ Grid (Field F, std::istream& in, std::vector<int>& mR, std::vector<int>& mC) :
+ _field(F)
+ {
+ read(F, in, mR, mC);
+ in >> _m >> _n;
+ }
+
+
+ /*
+ * reads the matrix from the file, deletes mC[i]=1 columns
+ * sets row/col Occ and Gcd
+ * file is sorted in sms format
+ */
+ void read(Field F, std::istream& in, std::vector<int>& mR, std::vector<int>& mC)
+ {
+ in >> _m >> _n;
+ /* !!! */
+ //int t= _m;
+ //_m = _n;
+ //_n = t;
+ rowOcc.resize(_m,0);
+ colOcc.resize(_n,0);
+ //rowGcd.resize(_m,0);
+ //colGcd.resize(_n,0);
+ A.resize(_m, NULL);
+ AT.resize(_n, NULL);
+
+ mR.resize(_m);
+ mC.resize(_n);
+ char c;
+ do in >> c; while (isspace (c));
+
+ std::vector<GridElement<Element>*> ends(_n, NULL);
+
+ if (c == 'M') {
+ // size_t i, i_prev, j, j_prev;
+ size_t i = 0, j = 0 ;
+ // i_prev = 0;
+ // j_prev = 0;
+
+ Element x, x_prev; x_prev = 0; x=0;
+ while (in >> i) {
+ in >> j;
+ /* !!! */
+ //int t = i; i=j; j=t;
+ if ( (i > _m) || (j > _n) ) {
+ std::cout << "InvalidMatrixInput \n"<< std::flush;
+ return;
+ }
+ F.read(in, x);
+ if ((j > 0) && (F.isZero(x))) continue;
+ if ((j > 0) && (mC[j-1]==1)){
+ continue; //mC are to be ignored;
+ }
+ if ((i!=0) && (j !=0 )) {
+ ijElement<Element> X(i-1,j-1,x);
+ ends[j-1] = addElement(ends[j-1], X);
+ }
+ if ((i==0) && (j ==0 )) break;
+ }
+ for (int k=0; k < rowOcc.size(); ++k) {
+ if ((rowOcc[k]==1) && (/*colGcd[A[k]->getJ()]*/1==abs(A[k]->getX()))) {
+ //std::cout << "1 row" << i_prev << "\n";
+ //std::cout << "Adding " << k+1 << " to Q\n" << std::flush;
+ Q.push(k);
+ }
+ }
+ }
+ mC.clear();
+ mC.resize(_n,0);
+
+ }
+
+ /*
+ * deletes the non-null element Aij
+ */
+ GridElement<Element>* deleteElement(GridElement<Element>* Aij)
+ {
+ if (Aij->prev != NULL) Aij->prev->next = Aij->next;
+ else A[Aij->getI()] = Aij->next;
+ if (Aij->next != NULL) Aij->next->prev = Aij->prev;
+ if (Aij->down != NULL) Aij->down->up = Aij->up;
+ else AT[Aij->getJ()] = Aij->up;
+ if (Aij->up != NULL) Aij->up->down = Aij->down;
+ --rowOcc[Aij->getI()];
+ if (rowOcc[Aij->getI()]==1) {
+ //std::cout << "Adding " << Aij->getI()+1 << " to Q\n" << std::flush;
+ if (1/*colGcd[A[Aij->getI()]->getJ()]*/ == abs (A[Aij->getI()]->getX()))
+ Q.push(Aij->getI());
+ }
+ --colOcc[Aij->getJ()];
+ GridElement<Element>* tmp = Aij->up;
+ delete Aij;
+ return tmp;
+ }
+
+ void deleteColumn (size_t j)
+ {
+ colOcc[j] = 0;
+ GridElement<Element>* tmp = AT[j];
+ while (tmp != NULL) {
+ --rowOcc[tmp->getI()];
+ if (rowOcc[tmp->getI()] ==1) {
+ //std::cout << "Adding " << tmp->getI()+1 << " to Q\n" << std::flush;
+ if ( 1/*colGcd[A[tmp->getI()]->getJ()]*/ == abs (A[tmp->getI()]->getX()))
+ Q.push(tmp->getI());
+ }
+ if (tmp->prev != NULL) tmp->prev->next = tmp->next;
+ else A[tmp->getI()] = tmp->next;
+ if (tmp->next != NULL) tmp->next->prev = tmp->prev;
+ GridElement<Element>* tmp2 = tmp->up;
+ delete tmp;
+ tmp = tmp2;
+ }
+ }
+
+ void deleteRow (size_t i)
+ {
+ rowOcc[i] = 0;
+ GridElement<Element>* tmp = A[i];
+ while (tmp != NULL) {
+ --colOcc[tmp->getJ()];
+ if (tmp->down != NULL) tmp->down->up = tmp->up;
+ else AT[tmp->getJ()] = tmp->up;
+ if (tmp->up != NULL) tmp->up->down = tmp->down;
+ GridElement<Element>* tmp2 = tmp->next;
+ delete tmp;
+ tmp = tmp2;
+ }
+ }
+
+ /*
+ * adds a new Grid Element after (at ''up'') the given GridElement
+ * if lower==NULL Y should be the lowest element of the column
+ * returns a pointer to the new element
+ */
+ GridElement<Element>* addElement(GridElement<Element>* lower, ijElement<Element>& Y)
+ {
+ ++rowOcc[Y.i];
+ ++colOcc[Y.j];
+ //rowGcd[Y.i]=gcd(rowGcd[Y.i], Y.x);
+ //colGcd[Y.j]=gcd(colGcd[Y.j], Y.x);
+ GridElement<Element>* X = new GridElement<Element>(Y);
+ if (lower != NULL) {
+ GridElement<Element>* tmp = lower->up;
+ lower->up = X;
+ X->down = lower;
+ X->up = tmp;
+ if (tmp != NULL) tmp->down = X;
+ tmp = A[Y.i];
+ A[Y.i] = X;
+ X->next = tmp;
+ if (tmp != NULL) tmp->prev = X;
+ }
+ else {
+ GridElement<Element>* tmp = AT[Y.j];
+ AT[Y.j] = X;
+ X->up = tmp;
+ if (tmp != NULL) tmp->down = X;
+ tmp = A[Y.i];
+ A[Y.i] = X;
+ X->next = tmp;
+ if (tmp != NULL) tmp->prev = X;
+ }
+ return X;
+ }
+
+ /*
+ * recursive procedure to reduce the grid
+ * returns precomputed rank
+ */
+
+ int reduce(int& rank, int S, std::vector<int>& mR, std::vector<int>& mC, std::ostream& os)
+ {
+ std::cout << "rank at begin reduce " << rank << "\n" << std::flush;
+ while (!Q.empty()) {
+ size_t i=Q.front();
+ Q.pop();
+ if (rowOcc[i]==1) {//if row not deleted
+ size_t j = A[i]->getJ();
+ Element x; _field.init(x, A[i]->getX());
+ if (mC[j]==1) {//if col deleted (not needed as we delete at once)
+ mR[i]=2;
+ }
+ else if (abs(x)==1/*colGcd[j]*/) {
+ //std::cout << "Row/column "<< i+1 << "," << j+1<< "," << x << "to reduce\n" <<std::flush;
+ if (abs(x) > 1) std::cout << "adds " << x << "to the diagonal\n"<< std::flush;
+ if (mC[j] !=1 ) {//if col not deleted then delete, update rank
+ ++rank;
+ mC[j]=1;
+ mR[i]=1;
+ deleteColumn(j);//do not mark 0 rows
+ //deleteRow(i);//not needed
+ }
+ } //else std::cout << "NOT Row/column "<< i+1 << "," << j+1<< "," << x << "to reduce\n" <<std::flush;
+ }
+ }
+
+ std::cout << "Rank at end reduce/begin elimination" << rank <<"\n" << std::flush;
+
+ size_t ini=0;
+
+ size_t row2;
+ size_t j1,j2;
+ Element x,x1,x2;
+ x1=1;x2=1;x=0;
+
+ while (1) {
+ bool pivotFound;
+ pivotFound =false;
+ if (ini>=mR.size()) ini=0;
+ for (size_t i=ini; i < mR.size(); ++i) {
+ if (rowOcc[i]==2) {
+ //std::cout << "2 row found " << i <<"\n" << std::flush;
+ j1 = A[i]->getJ();
+ _field.init(x1,A[i]->getX());
+ j2 = A[i]->next->getJ();
+ _field.init(x2,A[i]->next->getX());
+ if ((abs(x1)==1/*rowGcd[i]*/) && (abs(x1)== 1/*colGcd[j1]*/)) {
+ if ((abs(x2)== 1/*rowGcd[i]*/) && (abs(x2)==1/*colGcd[j2]*/) && (colOcc[j1]> colOcc[j2])) {
+ size_t jj = j1;
+ Element xx = x1;
+ j1 =j2;x1=x2;
+ j2 = jj;x2=xx;
+ }
+ pivotFound = true;
+ row2=i;
+ ini = i+1; break;
+ }
+ else
+ if ((abs(x2)==1/*rowGcd[i]*/) && (abs(x2)== 1/*colGcd[j2]*/)) {
+ size_t jj = j1;
+ Element xx = x1;
+ j1 =j2;x1=x2;
+ j2 = jj;x2=xx;
+ pivotFound = true;
+ row2=i;
+ ini = i+1;break;
+ }
+
+ }
+ }
+
+ //pivotFound =false;
+ if (pivotFound) {
+ if (abs(x1)>1) std::cout << "adds " << x1 << "to the diagonal\n" << std::flush;
+ mC[j1]=1;
+ ++rank;
+ mR[row2]=1;
+ _field.init(x, -x2/x1);
+ //std::cout << "found " << j1 << "," << x2 << "," << j2 << "," << x2 << "\n"<< std::flush;
+ ////std::cout << "reducing column " << j2+1 << " by (" << j1+1 << "," << x << "}\n" << std::flush;
+ //std::cout << "row " << row2 << "\n"<<std::flush;
+
+ GridElement<Element>* p1=AT[j1];
+ GridElement<Element>* p2=NULL;
+ GridElement<Element>* p2next=AT[j2];
+
+ while (p1 != NULL) {
+ while (p2next != NULL) {
+ if (p2next->getI() >= p1->getI()) break;
+ p2 = p2next;
+ p2next = p2next->up;
+ }
+ Element y; _field.init(y, p1->getX());
+ Element z;
+ if ((p2next!= NULL) && (p2next->getI()==p1->getI()) ) {
+ //std::cout << "updating " << p2next->getI() << " row" << std::flush;
+ _field.init (z, x*y) ;
+ _field.addin(z, p2next->getX());
+ if (z==0) {
+ //std::cout << ".....deleting \n" << std::flush;
+ p2next = deleteElement(p2next);
+ }
+ else {
+ //std::cout << ".....new value\n" << std::flush;
+ p2next->setElement(z);
+ p2 = p2next;
+ p2next = p2next->up;
+ }
+ }
+ else {
+ //std::cout << "adding " << p1->getI() << " row\n" << std::flush;
+ _field.init(z, x*y);
+ ijElement<Element> X(p1->getI(), j2, z);
+ p2=addElement(p2, X);
+ }
+
+ p1 = deleteElement(p1);
+ }
+
+ if (!Q.empty()) {
+ size_t i = Q.front();
+ while (rowOcc[i] != 1) {
+ Q.pop();
+ if (Q.empty()) break;
+ i = Q.front();
+ }
+ if (!Q.empty()) {
+ //std::cout << "Adding " << i+1 << " to Q \n" << std::flush;
+ reduce(rank, S, mR, mC,os);
+ break;
+ }
+ }
+ }
+ else {
+ std::cout << "Elimination of " << S-1<< " rows at rank " <<rank << "\n" << std::flush;
+
+ size_t i =0;
+ // bool tworow=false;
+ int init_rank = rank;
+ while (1) {
+ while (i < _m) {
+ if (rowOcc[i]==0) ++i;
+ else if (rowOcc[i]<S) break;
+ else ++i;
+ }
+ if (i>=_m) break;
+ //std::cout << "Elimination of row " << i+1 << std::endl << std::flush;
+ //std::cout << "RowGcd=" << rowGcd[i] << "\n" << std::flush;
+ GridElement<Element>* r_p = A[i];
+ int min_col = _m+1;
+ Element xx1;
+ int j=-1;
+ std::vector<std::pair< size_t, GridElement<Element>*> > j_pts ;
+ std::vector<std::pair< Element, GridElement<Element>*> > jnext_pts ;
+ while (r_p != NULL) {
+ if ((colOcc[r_p->getJ()] < _m+1) && (colOcc[r_p->getJ()] < min_col)) {
+ if ((abs(r_p->getX()) == 1/*rowGcd[i]*/) && (abs(r_p->getX())==1/*colGcd[r_p->getJ()]*/)) {
+ if (j != -1) {
+ j_pts.push_back(std::pair<size_t, GridElement<Element>*> (j, NULL) );
+ jnext_pts.push_back(std::pair<Element, GridElement<Element>*> (xx1, AT[j]));
+ }
+ min_col = colOcc[r_p->getJ()];
+ _field.init(xx1, r_p->getX());
+ j = r_p->getJ();
+ }
+ else {
+ j_pts.push_back( std::pair<size_t, GridElement<Element>*> (r_p->getJ(), NULL));
+ jnext_pts.push_back( std::pair<Element, GridElement<Element>*> (r_p->getX(), AT[r_p->getJ()]));
+ }
+ }
+ else {
+ j_pts.push_back(std::pair<size_t, GridElement<Element>*> (r_p->getJ(), NULL));
+ jnext_pts.push_back(std::pair<Element, GridElement<Element>*> (r_p->getX(), AT[r_p->getJ()]));
+ }
+
+ r_p = r_p->next;
+ }
+
+ j_pts.resize(rowOcc[i]-1);
+ jnext_pts.resize(rowOcc[i]-1);
+ if (j < 0) {
+ ++i; continue;
+ }
+
+ if ((abs(xx1) == 1/*rowGcd[i]*/) && (abs(xx1)==1/*colGcd[j]*/)) {
+ if (abs(xx1) > 1) std::cout << "adds " << xx1 << "to the diagonal\n"<<std::flush;
+ //std::cout << "Eliminating row "<< i+1 << " by column "<< j+1 << "\n";
+ //std::cout << "Element x" << x << "\n" << std::flush;
+
+ mR[i] = 1;
+ mC[j] = 1;
+ ++rank;
+
+ GridElement<Element>* p1=AT[j];
+
+ while (p1 != NULL) {
+ typename std::vector<std::pair< size_t, GridElement<Element>*> >::iterator p2 = j_pts.begin();
+ typename std::vector<std::pair< Element, GridElement<Element>*> >::iterator p2next = jnext_pts.begin();
+ for (; p2 != j_pts.end(); ++p2, ++p2next) {
+ //std::cout << "eliminating column " << p2->first << "\n" << std::flush;
+ Element x; _field.init(x, -(p2next->first)/xx1);
+
+ while (p2next->second != NULL) {
+ if (p2next->second->getI() >= p1->getI()) break;
+ p2->second = p2next->second;
+ p2next->second = p2next->second->up;
+ }
+ Element y; _field.init(y, p1->getX());
+ Element z;
+ if ((p2next->second!= NULL) && (p2next->second->getI()==p1->getI()) ) {
+ //std::cout << "updating " << p2next->second->getI() << " row" << std::flush;
+ _field.init (z, x*y) ;
+ _field.addin(z, p2next->second->getX());
+ if (z==0) {
+ //std::cout << ".....deleting \n" << std::flush;
+ p2next->second = deleteElement(p2next->second);
+ }
+ else {
+ //std::cout << ".....new value\n" << std::flush;
+ p2next->second->setElement(z);
+ p2->second = p2next->second;
+ p2next->second = p2next->second->up;
+ }
+ }
+ else {
+ //std::cout << "adding " << p1->getI() << " row\n" << std::flush;
+ _field.init(z, x*y);
+ ijElement<Element> X(p1->getI(), p2->first, z);
+ p2->second=addElement(p2->second, X);
+ }
+ }
+ p1 = deleteElement(p1);
+ }
+ }
+ ++i;
+ if (!Q.empty()) {
+ size_t k = Q.front();
+ while (rowOcc[k] != 1) {
+ Q.pop();
+ if (Q.empty()) break;
+ k = Q.front();
+ }
+ if (!Q.empty()) {
+ //std::cout << "breaking at " << i << " row\n" << std::flush;
+ break;
+ }
+ }
+ }
+
+ if ((!Q.empty()) || (rank - init_rank > 100)) {
+ reduce(rank, S, mR, mC,os);
+ }
+ break;
+ }
+ }
+ return rank;
+ }
+
+ void write (std::ostream& out)
+ {
+ size_t Omega =0;
+ out << _n << " " << _m << " M\n";
+ std::vector<int>::iterator occ_iter = colOcc.begin();
+ int j =0;
+ for (;occ_iter != colOcc.end(); ++occ_iter,++j) {
+ if (*occ_iter > 0) {
+ *occ_iter = 0;
+ GridElement<Element>* tmp = AT[j];
+ GridElement<Element>* tmp2;
+ while (tmp != NULL) {
+ ++Omega;
+ out << tmp->getJ()+1 <<" " << tmp->getI()+1 << " " << tmp->getX() << "\n";
+ tmp2 = tmp->up;
+ delete tmp;
+ tmp = tmp2;
+ }
+ }
+ }
+ out << "0 0 0\n";
+ std::cout << "Omega: " << Omega << "\n" << std::flush;
+ rowOcc.clear();
+ colOcc.clear();
+ //rowGcd.clear();
+ //colGcd.clear();
+ A.clear();
+ AT.clear();
+
+ }
+
+ ~Grid()
+ {
+
+ std::vector<int>::iterator occ_iter = colOcc.begin();
+ int j =0;
+ for (;occ_iter != colOcc.end(); ++occ_iter,++j) {
+ if (*occ_iter > 0) {
+ GridElement<Element>* tmp = AT[j];
+ GridElement<Element>* tmp2;
+ while (tmp != NULL) {
+ tmp2 = tmp->up;
+ delete tmp;
+ tmp = tmp2;
+ }
+ }
+ }
+
+ rowOcc.clear();
+ colOcc.clear();
+ //rowGcd.clear();
+ //colGcd.clear();
+ A.clear();
+ AT.clear();
+
+ }
+ };
+
+}
+
+#endif //__LINBOX_matrix_grid_H
+
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/matrix/matrix-category.h b/linbox/matrix/matrix-category.h
index 6eed813..675befe 100644
--- a/linbox/matrix/matrix-category.h
+++ b/linbox/matrix/matrix-category.h
@@ -26,20 +26,27 @@
#ifndef __LINBOX_matrix_category_H
#define __LINBOX_matrix_category_H
-#include "linbox/matrix/sparse.h"
-// #include "linbox/matrix/blas-matrix.h"
-
-#include "linbox/blackbox/sparse.h"
-
namespace LinBox
{
- template<class _Field>
- class BlasMatrix ;
- template<class _Field>
- class BlasSubmatrix ;
+ /** \brief For specializing matrix arithmetic
+ *
+ * This class defines matrix categories that allow us to specialize the matrix
+ * arithmetic in \ref MatrixDomain for different matrix representations. For
+ * example, a sparse matrix may have an efficient iterator over row vectors but
+ * not over column vectors. Therefore, an algorithm that tries to iterate over
+ * column vectors will run very slowly. Hence a specialization that avoids using
+ * column vectors is used instead.
+ */
+ struct MatrixCategories {
+ struct BlackboxTag { };
+ struct IndexedMatrixTag : public virtual BlackboxTag { } ;
+ struct RowMatrixTag : public virtual BlackboxTag { };
+ struct ColMatrixTag : public virtual BlackboxTag { };
+ struct RowColMatrixTag : public RowMatrixTag, public ColMatrixTag { };
+ };
struct MatrixContainerCategory {
@@ -48,60 +55,18 @@ namespace LinBox
struct Blackbox{};
};
- template <class Matrix>
- class MatrixContainerTrait {
- public:
- typedef MatrixContainerCategory::Blackbox Type;
- };
-
- template <class Field>
- class MatrixContainerTrait<BlasMatrix<Field> > {
- public:
- typedef MatrixContainerCategory::BlasContainer Type;
- };
- template <class Field>
- class MatrixContainerTrait<const BlasMatrix<Field> > {
- public:
- typedef MatrixContainerCategory::BlasContainer Type;
- };
-#if 0
- template <class Field>
- class MatrixContainerTrait<BlasMatrix<Field> > {
- public:
- typedef MatrixContainerCategory::BlasContainer Type;
- };
-#endif
-
- template <class Field>
- class MatrixContainerTrait<const BlasSubmatrix<Field> > {
- public:
- typedef MatrixContainerCategory::BlasContainer Type;
- };
-
- template <class Element>
- class MatrixContainerTrait<SparseMatrixBase<Element> > {
- public:
- typedef MatrixContainerCategory::Container Type;
- };
-
- template <class Field>
- class MatrixContainerTrait<SparseMatrix<Field> > {
- public:
- typedef MatrixContainerCategory::Container Type;
- };
}
#endif //__LINBOX_matrix_category_H
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
// Local Variables:
// mode: C++
// tab-width: 8
// indent-tabs-mode: nil
// c-basic-offset: 8
// End:
-
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/matrix/matrix-domain.doxy b/linbox/matrix/matrix-domain.doxy
new file mode 100644
index 0000000..bbe3348
--- /dev/null
+++ b/linbox/matrix/matrix-domain.doxy
@@ -0,0 +1,32 @@
+// Copyright 2014 LinBox. See COPYING for licence information.
+/*
+ * Written by Brice Boyer (briceboyer) <boyer.brice at gmail.com>
+
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ * ========LICENCE========
+ */
+
+/** \ingroup matrix
+ * \defgroup matrixdomain Matrix Domain
+ * \brief Matrix domain operations
+ *
+ * NO DOC YET
+ *
+ */
+
+// vim:syn=doxygen
diff --git a/linbox/matrix/matrix-domain.h b/linbox/matrix/matrix-domain.h
index 2113b28..f855eb4 100644
--- a/linbox/matrix/matrix-domain.h
+++ b/linbox/matrix/matrix-domain.h
@@ -1,71 +1,50 @@
-/* linbox/matrix/matrix-domain.h
- * Copyright (C) 2002 Zhendong Wan, Bradford Hovinen
- *
- * Written by Zhendong Wan <wan at mail.eecis.udel.edu>,
- * Bradford Hovinen <bghovinen at math.uwaterloo.ca>
- *
- * ------------------------------------------------------------
- * 2002-11-26 Bradford Hovinen <bghovinen at math.uwaterloo.ca>
- *
- * Added detailed documentation, cleaned up the interface slightly, and added
- * support for matrix traits. Added read, write, neg, negin, axpy, and
- * matrix-vector and matrix-black box operations.
- * ------------------------------------------------------------
+/*
+ * Copyright (C) 2014 the LinBox
*
+ * Written by :
+ * Brice Boyer (briceboyer) <boyer.brice at gmail.com>
*
* ========LICENCE========
* This file is part of the library LinBox.
*
- * LinBox is free software: you can redistribute it and/or modify
+ * LinBox is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library 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
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
* ========LICENCE========
- *.
*/
-#ifndef __LINBOX_matrix_domain_H
-#define __LINBOX_matrix_domain_H
+/*! @file matrix/matrix-domain.h
+ * @ingroup matrixdomain
+ * @brief NODOC
+ */
-#include <iostream>
+#ifndef __LINBOX_matrix_matrix_domain_H
+#define __LINBOX_matrix_matrix_domain_H
-#include "linbox/blackbox/archetype.h"
+#include <linbox/linbox-config.h>
#include "linbox/vector/vector-domain.h"
+// #include "linbox/matrix/densematrix/blas-matrix.h"
-namespace LinBox
-{
+namespace LinBox {
+#if 1
+ //! @bug necessitates the inclusion of those things after of before. We should not include directly this but just the matrices and they automatically need their domain (for now)
+ template<class Field, class Rep> class BlasMatrix;
+ template<class Matrix> class BlasSubmatrix;
+ template<class _Field, class _Rep> class BlasVector ;
+ template<class Field, class _Rep> class TriangularBlasMatrix ;
+ template<class Matrix> class TransposedBlasMatrix ;
+#endif
- /** \brief For specializing matrix arithmetic
- *
- * This class defines matrix categories that allow us to specialize the matrix
- * arithmetic in \ref MatrixDomain for different matrix representations. For
- * example, a sparse matrix may have an efficient iterator over row vectors but
- * not over column vectors. Therefore, an algorithm that tries to iterate over
- * column vectors will run very slowly. Hence a specialization that avoids using
- * column vectors is used instead.
- */
-
- struct MatrixCategories {
- struct BlackboxTag { };
- struct RowMatrixTag : public virtual BlackboxTag { };
- struct ColMatrixTag : public virtual BlackboxTag { };
- struct RowColMatrixTag : public RowMatrixTag, public ColMatrixTag { };
- };
-
- template <class Matrix>
- struct MatrixTraits {
- typedef Matrix MatrixType;
- typedef typename Matrix::MatrixCategory MatrixCategory;
- };
/** \brief Helper class to allow specializations of certain matrix-vector products
*
@@ -83,1117 +62,18 @@ namespace LinBox
template <class Vector1, class Matrix, class Vector2>
inline Vector1 &mulColDense (const VectorDomain<Field> &VD, Vector1 &w, const Matrix &A, const Vector2 &v) const;
};
+}
- /** Class of matrix arithmetic functions.
- *
- * This class encapuslated matrix-matrix and matrix-vector operations, roughly
- * equivalent to BLAS levels 2 and 3. The arithmetic methods are parameterized
- * by matrix type so that they may be used the same way with sparse matrices,
- * dense matrices, and dense submatrices. Except where otherwise noted, they
- * require the matrix inputs to meet the \ref BlasMatrix archetype.
- *
- * These methods are specialized so that they can run efficiently with different
- * matrix representations. If a matrix has an efficient row iterator, but not an
- * efficient column iterator, a specialization that makes use of the former will
- * be selected. This allows a great deal of flexibility when dealing with sparse
- * matrix arithmetic.
- *
- * For all of the arithmetic operations that output matrices, it is assumed that
- * the output matrix has an efficient row iterator. In typical use, the output
- * matrix will be a \ref BlasMatrix or a \ref BlasSubmatrix, which has
- * efficient row and column iterators. In particular, one should not perform
- * these arithmetic operations outputting to a \ref SparseMatrixBase.
- *
- * There are other restrictions. See the method-specific documentation for more
- * details.
- */
- template <class Field>
- class MatrixDomain : public MVProductDomain<Field> {
- public:
-
- /// Constructor.
- //! @param F field for MatrixDomain operations.
- MatrixDomain (const Field &F) :
- _field (F), _VD (F)
- {}
-
- /// Copy operator.
- MatrixDomain& operator= (const MatrixDomain& MD)
- {
- _field = MD._field;
- _VD = MD._VD;
- return *this;
- }
-
- /** Retrieve the underlying field.
- * Return a reference to the field that this matrix domain
- * object uses
- * @returns reference to field
- */
- //@{
- const Field &field () const
- {
- return _field;
- }
- Field &field ()
- {
- return _field;
- }
- //@}
-
- /** Print matrix.
- * @param os Output stream to which matrix is written.
- * @param A Matrix.
- * @returns reference to os.
- */
- template <class Matrix>
- inline std::ostream &write (std::ostream &os, const Matrix &A) const
- {
- return A.write (os);
- }
-
- /** Read matrix.
- * @param is Input stream from which matrix is read.
- * @param A Matrix.
- * @returns reference to is.
- */
- template <class Matrix>
- inline std::istream &read (std::istream &is, Matrix &A) const
- {
- return A.read (is, _field);
- }
-
- /** Matrix copy
- * B <- A.
- * Copy the contents of the matrix B to the matrix A
- *
- * Both matrices must support the same iterators, row or column.
- *
- * @param B Matrix B
- * @param A Matrix A
- * @returns Reference to B
- */
- template <class Matrix1, class Matrix2>
- inline Matrix1 © (Matrix1 &B, const Matrix2 &A) const
- {
- return copySpecialized (B, A,
- typename MatrixTraits<Matrix1>::MatrixCategory (),
- typename MatrixTraits<Matrix2>::MatrixCategory ());
- }
-
- /** Matrix equality.
- * Test whether the matrices A and B are equal
- * @param A Input vector
- * @param B Input vector
- * @returns true if and only if the matrices A and B are equal
- */
- template <class Matrix1, class Matrix2>
- bool areEqual (const Matrix1 &A, const Matrix2 &B) const
- {
- return areEqualSpecialized (B, A,
- typename MatrixTraits<Matrix1>::MatrixCategory (),
- typename MatrixTraits<Matrix2>::MatrixCategory ());
- }
-
- /** Matrix equality with zero.
- * @param A Input matrix
- * @returns true if and only if the matrix A is zero
- */
- template <class Matrix>
- inline bool isZero (const Matrix &A) const
- {
- return isZeroSpecialized (A, typename MatrixTraits<Matrix>::MatrixCategory ());
- }
-
- /** Matrix-matrix addition
- * C <- A + B.
- *
- * Each of A, B, and C must support the same iterator, either row or
- * column
- *
- * @param C Output matrix C
- * @param A Input matrix A
- * @param B Input matrix B
- * @returns Reference to C
- */
- template <class Matrix1, class Matrix2, class Matrix3>
- inline Matrix1& add (Matrix1 &C, const Matrix2 &A, const Matrix3 &B) const
- {
- return addSpecialized (C, A, B,
- typename MatrixTraits<Matrix1>::MatrixCategory (),
- typename MatrixTraits<Matrix2>::MatrixCategory (),
- typename MatrixTraits<Matrix3>::MatrixCategory ());
- }
-
- /** Matrix-matrix in-place addition
- * A <- A + B.
- *
- * Each of A and B must support the same iterator, either row or column
- *
- * @param A Input matrix A
- * @param B Input matrix B
- * @returns Reference to A
- */
- template <class Matrix1, class Matrix2>
- inline Matrix1& addin (Matrix1 &A, const Matrix2 &B) const
- {
- return addinSpecialized (A, B,
- typename MatrixTraits<Matrix1>::MatrixCategory (),
- typename MatrixTraits<Matrix2>::MatrixCategory ());
- }
-
- /** Matrix-matrix subtraction
- * C <- A - B.
- *
- * Each of A, B, and C must support the same iterator, either row or
- * column
- *
- * @param C Output matrix C
- * @param A Input matrix A
- * @param B Input matrix B
- * @returns Reference to C
- */
- template <class Matrix1, class Matrix2, class Matrix3>
- inline Matrix1 &sub (Matrix1 &C, const Matrix2 &A, const Matrix3 &B) const
- {
- return subSpecialized (C, A, B,
- typename MatrixTraits<Matrix1>::MatrixCategory (),
- typename MatrixTraits<Matrix2>::MatrixCategory (),
- typename MatrixTraits<Matrix3>::MatrixCategory ());
- }
-
- /** Matrix-matrix in-place subtraction
- * A <- A - B.
- *
- * Each of A and B must support the same iterator, either row or column
- *
- * @param A Input matrix A
- * @param B Input matrix B
- * @returns Reference to A
- */
- template <class Matrix1, class Matrix2>
- inline Matrix1 &subin (Matrix1 &A, const Matrix2 &B) const
- {
- return subinSpecialized (A, B,
- typename MatrixTraits<Matrix1>::MatrixCategory (),
- typename MatrixTraits<Matrix2>::MatrixCategory ());
- }
-
- /** Matrix negate
- * B <- -A.
- *
- * Each of A and B must support the same iterator, either row or column
- *
- * @param B Output matrix B
- * @param A Input matrix A
- * @returns reference to B
- */
- template <class Matrix1, class Matrix2>
- inline Matrix1 &neg (Matrix1 &B, const Matrix2 &A) const
- {
- return negSpecialized (B, A,
- typename MatrixTraits<Matrix1>::MatrixCategory (),
- typename MatrixTraits<Matrix2>::MatrixCategory ());
- }
-
- /** Matrix in-place negate
- * A <- -A.
- * @param A Input matrix A; result is stored here
- */
- template <class Matrix>
- inline Matrix &negin (Matrix &A) const
- {
- return neginSpecialized (A, typename MatrixTraits<Matrix>::MatrixCategory ());
- }
-
- /** Matrix-matrix multiply
- * C <- A * B.
- *
- * C must support both row and column iterators, and the vector
- * representations must be dense. Examples of supported matrices are
- * \ref BlasMatrix and \ref BlasSubmatrix.
- *
- * Either A or B, or both, may have limited iterators. However, either A
- * must support row iterators or B must support column iterators. If
- * both A and B lack support for an iterator (either row or column),
- * then C must support the same type of iterator as A and B.
- *
- * @param C Output matrix C
- * @param A Input matrix A
- * @param B Input matrix B
- * @returns Reference to C
- */
- template <class Matrix1, class Matrix2, class Matrix3>
- inline Matrix1 &mul (Matrix1 &C, const Matrix2 &A, const Matrix3 &B) const
- {
- return mulSpecialized (C, A, B,
- typename MatrixTraits<Matrix1>::MatrixCategory (),
- typename MatrixTraits<Matrix2>::MatrixCategory (),
- typename MatrixTraits<Matrix3>::MatrixCategory ());
- }
-
- /** Matrix-matrix in-place multiply on the left
- * B <- A * B.
- *
- * B should support both row and column iterators, and must be dense. A
- * must support row iterators.
- *
- * @param A Input matrix A
- * @param B Input matrix B
- * @returns Reference to B
- */
- template <class Matrix1, class Matrix2>
- inline Matrix2 &leftMulin (const Matrix1 &A, Matrix2 &B) const;
-
- /** Matrix-matrix in-place multiply on the right
- * A <- A * B.
- *
- * A should support both row and column iterators, and must be dense. B
- * must support column iterators.
- *
- * @param A Input matrix A
- * @param B Input matrix B
- * @returns Reference to A
- */
- template <class Matrix1, class Matrix2>
- inline Matrix1 &rightMulin (Matrix1 &A, const Matrix2 &B) const;
-
- /** Matrix-matrix in-place multiply
- * A <- A * B.
- *
- * This is an alias for \ref rightMulin
- *
- * @param A Input matrix A
- * @param B Input matrix B
- * @returns Reference to A
- */
- template <class Matrix1, class Matrix2>
- inline Matrix1 &mulin (Matrix1 &A, const Matrix2 &B) const
- {
- return rightMulin (A, B);
- }
-
- /** Matrix-scalar multiply
- * C <- B * a.
- *
- * Multiply B by the scalar element a and store the result in C. B and C
- * must support the same iterators.
- *
- * @param C Output matrix C
- * @param B Input matrix B
- * @param a Input scalar a
- * @returns Reference to C
- */
- template <class Matrix1, class Matrix2>
- inline Matrix1 &mul (Matrix1 &C, const Matrix2 &B, const typename Field::Element &a) const
- {
- return mulSpecialized (C, B, a,
- typename MatrixTraits<Matrix1>::MatrixCategory (),
- typename MatrixTraits<Matrix2>::MatrixCategory ());
- }
-
- /** Matrix-scalar in-place multiply
- * B <- B * a.
- *
- * Multiply B by the scalar element a in-place.
- *
- * @param B Input matrix B
- * @param a Input scalar a
- * @returns Reference to B
- */
- template <class Matrix>
- inline Matrix &mulin (Matrix &B, const typename Field::Element &a) const
- {
- return mulinSpecialized (B, a, typename MatrixTraits<Matrix>::MatrixCategory ());
- }
-
- /** Matrix-matrix in-place axpy
- * Y <- Y + A*X.
- *
- * This function combines \ref mul and \ref add, eliminating the need
- * for an additional temporary in expressions of the form $Y = Y +
- * AX$. Only one row of additional storage is required. Y may have
- * either efficient row iterators or efficient column iterators, and the
- * same restrictions on A and X apply as in \ref mul.
- *
- * Note that no out-of-place axpy is provided, since it gives no
- * benefit. One may just as easily multiply into the result and call
- * \ref addin.
- *
- * @param Y Input matrix Y; result is stored here
- * @param A Input matrix A
- * @param X Input matrix X
- */
- template <class Matrix1, class Matrix2, class Matrix3>
- inline Matrix1 &axpyin (Matrix1 &Y, const Matrix2 &A, const Matrix3 &X) const
- {
- return axpyinSpecialized (Y, A, X,
- typename MatrixTraits<Matrix1>::MatrixCategory (),
- typename MatrixTraits<Matrix2>::MatrixCategory (),
- typename MatrixTraits<Matrix3>::MatrixCategory ());
- }
-
- //! Y <- AX-Y
- template <class Matrix1, class Matrix2, class Matrix3>
- inline Matrix1 &axmyin (Matrix1 &Y, const Matrix2 &A, const Matrix3 &X) const
- {
- negin(Y);
- axpyin(Y,A,X);
- return Y;
- }
-
-
- /*! General matrix multiply
- * \f$ D \gets \alpha A B + \beta C\f$.
- * @todo not efficient...
- */
- template <class Matrix1, class Matrix2, class Matrix3>
- inline Matrix1 &muladd (Matrix1 & D,
- const typename Field::Element & beta,
- const Matrix1 & C,
- const typename Field::Element & alpha,
- const Matrix2 & A,
- const Matrix3 & B) const
- {
- mul(D,A,B); // D = AB
- mulin(D,alpha); // D = alpha D
- Matrix1 CC(C);
- mulin(CC,beta); // C = beta C
- addin(D,CC); // D = D+C
- return D;
- }
-
- /*! @todo Need documentation of these methods */
- //@{
- template<class Matrix1, class Matrix2>
- Matrix1 &pow_apply (Matrix1 &M1, const Matrix2 &M2, unsigned long int k) const;
-
- template<class Matrix1, class Matrix2>
- Matrix1 &pow_horn (Matrix1 &M1, const Matrix2 &M2, unsigned long int k) const;
- //@}
-
-
- /*! @name Matrix-vector arithmetic operations
- * These operations take a matrix satisfying the \ref DenseMatrix
- * archetype and LinBox vectors as inputs. They involve matrix-vector
- * product and matrix-vector AXPY
- */
- //@{
- /** Matrix-vector multiply
- * w <- A * v.
- *
- * The vectors v and w must be of the same representation (dense, sparse
- * sequence, sparse associative, or sparse parallel), but they may be of
- * different types. The matrix A may have any representation.
- *
- * @param w Output vector w
- * @param A Input matrix A
- * @param v Input vector v
- * @returns Reference to w
- */
- template <class Vector1, class Matrix, class Vector2>
- inline Vector1 &vectorMul (Vector1 &w, const Matrix &A, const Vector2 &v) const
- {
- return mulSpecialized (w, A, v, typename MatrixTraits<Matrix>::MatrixCategory ());
- }
-
- /** Matrix-vector in-place axpy
- * \f$y \gets y + A x\f$.
- *
- * This function eliminates the requirement for temporary storage when
- * one is computing an expression of the form given above.
- *
- * The vectors y and x must be of the same representation (dense, sparse
- * sequence, sparse associative, or sparse parallel), but they may be of
- * different types. The matrix A may have any representation.
- *
- * Note that out-of-place axpy is not provided since it provides no
- * benefit -- one can use mul and then addin to exactly the same effect,
- * with no additional storage or performance cost.
- *
- * @param y Input vector y; result is stored here
- * @param A Input matrix A
- * @param x Input vector x
- */
- template <class Vector1, class Matrix, class Vector2>
- inline Vector1 &vectorAxpyin (Vector1 &y, const Matrix &A, const Vector2 &x) const
- {
- return axpyinSpecialized (y, A, x, typename MatrixTraits<Matrix>::MatrixCategory ());
- }
- //@}
-
- /*! @name Matrix-black box arithmetic operations
- * These operations mimic the matrix-matrix arithmetic operations above,
- * but one of the parameters is a \ref BlackboxArchetype.
- */
- //@{
- /** Matrix-black box left-multiply
- * C <- A * B.
- *
- * Both C and B must support column iterators
- *
- * @param C Output matrix
- * @param A Black box for A
- * @param B Matrix B
- */
- template <class Matrix1, class Blackbox, class Matrix2>
- inline Matrix1 &blackboxMulLeft (Matrix1 &C, const Blackbox &A, const Matrix2 &B) const;
-
- /** Matrix-black box right-multiply
- * C <- A * B.
- *
- * Both C and A must support row iterators
- *
- * @param C Output matrix
- * @param A Matrix A
- * @param B Black box for B
- */
- template <class Matrix1, class Matrix2, class Blackbox>
- inline Matrix1 &blackboxMulRight (Matrix1 &C, const Matrix2 &A, const Blackbox &B) const;
- //@}
-
- /*! @name Matrix permutations
- * @brief
- * These operations permute the rows or columns of a matrix based on
- * the given permutation. They are intended for use with Gauss-Jordan
- * elimination
- */
- //@{
- /// Transposition.
- typedef std::pair<unsigned int, unsigned int> Transposition;
- /** Permutation.
- *
- * A permutation is represented as a vector of pairs, each
- * pair representing a transposition.
- */
- typedef std::vector<Transposition> Permutation;
-
-
- /** Permute the rows of the given matrix.
- *
- * @param A Output matrix
- * @param P_start Start of permutation
- * @param P_end End of permutation
- * @returns Reference to A
- */
- template <class Matrix, class Iterator>
- inline Matrix &permuteRows (Matrix &A,
- Iterator P_start,
- Iterator P_end) const
- {
- return permuteRowsSpecialized (A, P_start, P_end,
- typename MatrixTraits<Matrix>::MatrixCategory ());
- }
-
- /** Permute the columns of the given matrix.
- *
- * @param A Output matrix
- * @param P_start Start of permutation
- * @param P_end End of permutation
- * @returns Reference to A
- */
- template <class Matrix, class Iterator>
- inline Matrix &permuteColumns (Matrix &A,
- Iterator P_start,
- Iterator P_end) const
- {
- return permuteColsSpecialized (A, P_start, P_end,
- typename MatrixTraits<Matrix>::MatrixCategory ());
- }
- //@}
-
- private:
-
- // Specialized function implementations
- template <class Matrix1, class Matrix2> Matrix1 ©Row (Matrix1 &B, const Matrix2 &A) const;
- template <class Matrix1, class Matrix2> Matrix1 ©Col (Matrix1 &B, const Matrix2 &A) const;
-
- template <class Matrix1, class Matrix2>
- inline Matrix1 ©Specialized (Matrix1 &B, const Matrix2 &A,
- MatrixCategories::RowMatrixTag,
- MatrixCategories::RowMatrixTag) const
- {
- return copyRow (B, A);
- }
- template <class Matrix1, class Matrix2>
- inline Matrix1 ©Specialized (Matrix1 &B, const Matrix2 &A,
- MatrixCategories::ColMatrixTag,
- MatrixCategories::ColMatrixTag) const
- {
- return copyCol (B, A);
- }
- template <class Matrix1, class Matrix2>
- inline Matrix1 ©Specialized (Matrix1 &B, const Matrix2 &A,
- MatrixCategories::RowColMatrixTag,
- MatrixCategories::RowColMatrixTag) const
- {
- return copyRow (B, A);
- }
-
- template <class Matrix1, class Matrix2> bool areEqualRow (const Matrix1 &A, const Matrix2 &B) const;
- template <class Matrix1, class Matrix2> bool areEqualCol (const Matrix1 &A, const Matrix2 &B) const;
-
- template <class Matrix1, class Matrix2>
- inline bool areEqualSpecialized (const Matrix1 &A, const Matrix2 &B,
- MatrixCategories::RowMatrixTag,
- MatrixCategories::RowMatrixTag) const
- {
- return areEqualRow (A, B);
- }
- template <class Matrix1, class Matrix2>
- inline bool areEqualSpecialized (const Matrix1 &A, const Matrix2 &B,
- MatrixCategories::ColMatrixTag,
- MatrixCategories::ColMatrixTag) const
- {
- return areEqualCol (A, B);
- }
- template <class Matrix1, class Matrix2>
- inline bool areEqualSpecialized (const Matrix1 &A, const Matrix2 &B,
- MatrixCategories::RowColMatrixTag,
- MatrixCategories::RowColMatrixTag) const
- {
- return areEqualRow (A, B);
- }
-
- template <class Matrix> bool isZeroRow (const Matrix &v) const;
- template <class Matrix> bool isZeroCol (const Matrix &v) const;
-
- template <class Matrix>
- bool isZeroSpecialized (const Matrix &A, MatrixCategories::RowMatrixTag) const
- {
- return isZeroRow (A);
- }
- template <class Matrix>
- bool isZeroSpecialized (const Matrix &A, MatrixCategories::ColMatrixTag) const
- {
- return isZeroCol (A);
- }
- template <class Matrix>
- bool isZeroSpecialized (const Matrix &A, MatrixCategories::RowColMatrixTag) const
- {
- return isZeroRow (A);
- }
-
- template <class Matrix1, class Matrix2, class Matrix3>
- Matrix1& addRow (Matrix1 &C, const Matrix2 &A, const Matrix3 &B) const;
- template <class Matrix1, class Matrix2, class Matrix3>
- Matrix1& addCol (Matrix1 &C, const Matrix2 &A, const Matrix3 &B) const;
-
- template <class Matrix1, class Matrix2, class Matrix3>
- Matrix1& addSpecialized (Matrix1 &C, const Matrix2 &A, const Matrix3 &B,
- MatrixCategories::RowMatrixTag,
- MatrixCategories::RowMatrixTag,
- MatrixCategories::RowMatrixTag) const
- {
- return addRow (C, A, B);
- }
- template <class Matrix1, class Matrix2, class Matrix3>
- Matrix1& addSpecialized (Matrix1 &C, const Matrix2 &A, const Matrix3 &B,
- MatrixCategories::ColMatrixTag,
- MatrixCategories::ColMatrixTag,
- MatrixCategories::ColMatrixTag) const
- {
- return addCol (C, A, B);
- }
- template <class Matrix1, class Matrix2, class Matrix3>
- Matrix1& addSpecialized (Matrix1 &C, const Matrix2 &A, const Matrix3 &B,
- MatrixCategories::RowColMatrixTag,
- MatrixCategories::RowColMatrixTag,
- MatrixCategories::RowColMatrixTag) const
- {
- return addRow (C, A, B);
- }
-
- template <class Matrix1, class Matrix2> Matrix1& addinRow (Matrix1 &A, const Matrix2 &B) const;
- template <class Matrix1, class Matrix2> Matrix1& addinCol (Matrix1 &A, const Matrix2 &B) const;
-
- template <class Matrix1, class Matrix2>
- inline Matrix1& addinSpecialized (Matrix1 &A, const Matrix2 &B,
- MatrixCategories::RowMatrixTag,
- MatrixCategories::RowMatrixTag) const
- {
- return addinRow (A, B);
- }
- template <class Matrix1, class Matrix2>
- inline Matrix1& addinSpecialized (Matrix1 &A, const Matrix2 &B,
- MatrixCategories::ColMatrixTag,
- MatrixCategories::ColMatrixTag) const
- {
- return addinCol (A, B);
- }
- template <class Matrix1, class Matrix2>
- inline Matrix1& addinSpecialized (Matrix1 &A, const Matrix2 &B,
- MatrixCategories::RowColMatrixTag,
- MatrixCategories::RowColMatrixTag) const
- {
- return addinRow (A, B);
- }
-
- template <class Matrix1, class Matrix2, class Matrix3>
- Matrix1& subRow (Matrix1 &C, const Matrix2 &A, const Matrix3 &B) const;
- template <class Matrix1, class Matrix2, class Matrix3>
- Matrix1& subCol (Matrix1 &C, const Matrix2 &A, const Matrix3 &B) const;
-
- template <class Matrix1, class Matrix2, class Matrix3>
- Matrix1& subSpecialized (Matrix1 &C, const Matrix2 &A, const Matrix3 &B,
- MatrixCategories::RowMatrixTag,
- MatrixCategories::RowMatrixTag,
- MatrixCategories::RowMatrixTag) const
- {
- return subRow (C, A, B);
- }
- template <class Matrix1, class Matrix2, class Matrix3>
- Matrix1& subSpecialized (Matrix1 &C, const Matrix2 &A, const Matrix3 &B,
- MatrixCategories::ColMatrixTag,
- MatrixCategories::ColMatrixTag,
- MatrixCategories::ColMatrixTag) const
- {
- return subCol (C, A, B);
- }
- template <class Matrix1, class Matrix2, class Matrix3>
- Matrix1& subSpecialized (Matrix1 &C, const Matrix2 &A, const Matrix3 &B,
- MatrixCategories::RowColMatrixTag,
- MatrixCategories::RowColMatrixTag,
- MatrixCategories::RowColMatrixTag) const
- {
- return subRow (C, A, B);
- }
-
- template <class Matrix1, class Matrix2> Matrix1& subinRow (Matrix1 &A, const Matrix2 &B) const;
- template <class Matrix1, class Matrix2> Matrix1& subinCol (Matrix1 &A, const Matrix2 &B) const;
-
- template <class Matrix1, class Matrix2>
- Matrix1& subinSpecialized (Matrix1 &A, const Matrix2 &B,
- MatrixCategories::RowMatrixTag,
- MatrixCategories::RowMatrixTag) const
- {
- return subinRow (A, B);
- }
- template <class Matrix1, class Matrix2>
- Matrix1& subinSpecialized (Matrix1 &A, const Matrix2 &B,
- MatrixCategories::ColMatrixTag,
- MatrixCategories::ColMatrixTag) const
- {
- return subinCol (A, B);
- }
- template <class Matrix1, class Matrix2>
- Matrix1& subinSpecialized (Matrix1 &A, const Matrix2 &B,
- MatrixCategories::RowColMatrixTag,
- MatrixCategories::RowColMatrixTag) const
- {
- return subinRow (A, B);
- }
-
- template <class Matrix1, class Matrix2> Matrix1& negRow (Matrix1 &A, const Matrix2 &B) const;
- template <class Matrix1, class Matrix2> Matrix1& negCol (Matrix1 &A, const Matrix2 &B) const;
-
- template <class Matrix1, class Matrix2>
- inline Matrix1& negSpecialized (Matrix1 &A, const Matrix2 &B,
- MatrixCategories::RowMatrixTag,
- MatrixCategories::RowMatrixTag) const
- {
- return negRow (A, B);
- }
- template <class Matrix1, class Matrix2>
- inline Matrix1& negSpecialized (Matrix1 &A, const Matrix2 &B,
- MatrixCategories::ColMatrixTag,
- MatrixCategories::ColMatrixTag) const
- {
- return negCol (A, B);
- }
- template <class Matrix1, class Matrix2>
- inline Matrix1& negSpecialized (Matrix1 &A, const Matrix2 &B,
- MatrixCategories::RowColMatrixTag,
- MatrixCategories::RowColMatrixTag) const
- {
- return negRow (A, B);
- }
-
- template <class Matrix> Matrix &neginRow (Matrix &A) const;
- template <class Matrix> Matrix &neginCol (Matrix &A) const;
-
- template <class Matrix>
- Matrix &neginSpecialized (Matrix &A, MatrixCategories::RowMatrixTag) const
- {
- return neginRow (A);
- }
- template <class Matrix>
- Matrix &neginSpecialized (Matrix &A, MatrixCategories::ColMatrixTag) const
- {
- return neginCol (A);
- }
- template <class Matrix>
- Matrix &neginSpecialized (Matrix &A, MatrixCategories::RowColMatrixTag) const
- {
- return neginRow (A);
- }
-
- template <class Matrix1, class Matrix2, class Matrix3>
- Matrix1 &mulRowRowCol (Matrix1 &C, const Matrix2 &A, const Matrix3 &B) const;
- template <class Matrix1, class Matrix2, class Matrix3>
- Matrix1 &mulColRowCol (Matrix1 &C, const Matrix2 &A, const Matrix3 &B) const;
- template <class Matrix1, class Matrix2, class Matrix3>
- Matrix1 &mulRowRowRow (Matrix1 &C, const Matrix2 &A, const Matrix3 &B) const;
- template <class Matrix1, class Matrix2, class Matrix3>
- Matrix1 &mulColColCol (Matrix1 &C, const Matrix2 &A, const Matrix3 &B) const;
-
- template <class Matrix1, class Matrix2, class Matrix3>
- Matrix1 &mulSpecialized (Matrix1 &C, const Matrix2 &A, const Matrix3 &B,
- MatrixCategories::RowMatrixTag,
- MatrixCategories::RowMatrixTag,
- MatrixCategories::ColMatrixTag) const
- {
- return mulRowRowCol (C, A, B);
- }
- template <class Matrix1, class Matrix2, class Matrix3>
- Matrix1 &mulSpecialized (Matrix1 &C, const Matrix2 &A, const Matrix3 &B,
- MatrixCategories::ColMatrixTag,
- MatrixCategories::RowMatrixTag,
- MatrixCategories::ColMatrixTag) const
- {
- return mulColRowCol (C, A, B);
- }
- template <class Matrix1, class Matrix2, class Matrix3>
- Matrix1 &mulSpecialized (Matrix1 &C, const Matrix2 &A, const Matrix3 &B,
- MatrixCategories::RowColMatrixTag,
- MatrixCategories::RowMatrixTag,
- MatrixCategories::ColMatrixTag) const
- {
- return mulRowRowCol (C, A, B);
- }
- template <class Matrix1, class Matrix2, class Matrix3>
- Matrix1 &mulSpecialized (Matrix1 &C, const Matrix2 &A, const Matrix3 &B,
- MatrixCategories::RowMatrixTag,
- MatrixCategories::RowMatrixTag,
- MatrixCategories::RowMatrixTag) const
- {
- return mulRowRowRow (C, A, B);
- }
- template <class Matrix1, class Matrix2, class Matrix3>
- Matrix1 &mulSpecialized (Matrix1 &C, const Matrix2 &A, const Matrix3 &B,
- MatrixCategories::ColMatrixTag,
- MatrixCategories::ColMatrixTag,
- MatrixCategories::ColMatrixTag) const
- {
- return mulColColCol (C, A, B);
- }
- template <class Matrix1, class Matrix2, class Matrix3>
- Matrix1 &mulSpecialized (Matrix1 &C, const Matrix2 &A, const Matrix3 &B,
- MatrixCategories::RowColMatrixTag,
- MatrixCategories::RowColMatrixTag,
- MatrixCategories::RowColMatrixTag) const
- {
- return mulRowRowCol (C, A, B);
- }
-
- template <class Matrix1, class Matrix2>
- Matrix1 &mulRow (Matrix1 &C, const Matrix2 &B, const typename Field::Element &a) const;
- template <class Matrix1, class Matrix2>
- Matrix1 &mulCol (Matrix1 &C, const Matrix2 &B, const typename Field::Element &a) const;
-
- template <class Matrix1, class Matrix2>
- Matrix1 &mulSpecialized (Matrix1 &C, const Matrix2 &B, const typename Field::Element &a,
- MatrixCategories::RowMatrixTag,
- MatrixCategories::RowMatrixTag) const
- {
- return mulRow (C, B, a);
- }
- template <class Matrix1, class Matrix2>
- Matrix1 &mulSpecialized (Matrix1 &C, const Matrix2 &B, const typename Field::Element &a,
- MatrixCategories::ColMatrixTag,
- MatrixCategories::ColMatrixTag) const
- {
- return mulCol (C, B, a);
- }
- template <class Matrix1, class Matrix2>
- Matrix1 &mulSpecialized (Matrix1 &C, const Matrix2 &B, const typename Field::Element &a,
- MatrixCategories::RowColMatrixTag,
- MatrixCategories::RowColMatrixTag) const
- {
- return mulRow (C, B, a);
- }
-
- template <class Matrix> Matrix &mulinRow (Matrix &B, const typename Field::Element &a) const;
- template <class Matrix> Matrix &mulinCol (Matrix &B, const typename Field::Element &a) const;
-
- template <class Matrix>
- Matrix &mulinSpecialized (Matrix &B, const typename Field::Element &a,
- MatrixCategories::RowMatrixTag) const
- {
- return mulinRow (B, a);
- }
- template <class Matrix>
- Matrix &mulinSpecialized (Matrix &B, const typename Field::Element &a,
- MatrixCategories::ColMatrixTag) const
- {
- return mulinCol (B, a);
- }
- template <class Matrix>
- Matrix &mulinSpecialized (Matrix &B, const typename Field::Element &a,
- MatrixCategories::RowColMatrixTag) const
- {
- return mulinRow (B, a);
- }
-
- template <class Matrix1, class Matrix2, class Matrix3>
- Matrix1 &axpyinRowRowCol (Matrix1 &Y, const Matrix2 &A, const Matrix3 &X) const;
- template <class Matrix1, class Matrix2, class Matrix3>
- Matrix1 &axpyinColRowCol (Matrix1 &Y, const Matrix2 &A, const Matrix3 &X) const;
- template <class Matrix1, class Matrix2, class Matrix3>
- Matrix1 &axpyinRowRowRow (Matrix1 &Y, const Matrix2 &A, const Matrix3 &X) const;
- template <class Matrix1, class Matrix2, class Matrix3>
- Matrix1 &axpyinColColCol (Matrix1 &Y, const Matrix2 &A, const Matrix3 &X) const;
-
- template <class Matrix1, class Matrix2, class Matrix3>
- Matrix1 &axpyinSpecialized (Matrix1 &Y, const Matrix2 &A, const Matrix3 &X,
- MatrixCategories::RowMatrixTag,
- MatrixCategories::RowMatrixTag,
- MatrixCategories::ColMatrixTag) const
- {
- return axpyinRowRowCol (Y, A, X);
- }
- template <class Matrix1, class Matrix2, class Matrix3>
- Matrix1 &axpyinSpecialized (Matrix1 &Y, const Matrix2 &A, const Matrix3 &X,
- MatrixCategories::ColMatrixTag,
- MatrixCategories::RowMatrixTag,
- MatrixCategories::ColMatrixTag) const
- {
- return axpyinColRowCol (Y, A, X);
- }
- template <class Matrix1, class Matrix2, class Matrix3>
- Matrix1 &axpyinSpecialized (Matrix1 &Y, const Matrix2 &A, const Matrix3 &X,
- MatrixCategories::RowColMatrixTag,
- MatrixCategories::RowMatrixTag,
- MatrixCategories::ColMatrixTag) const
- {
- return axpyinRowRowCol (Y, A, X);
- }
- template <class Matrix1, class Matrix2, class Matrix3>
- Matrix1 &axpyinSpecialized (Matrix1 &Y, const Matrix2 &A, const Matrix3 &X,
- MatrixCategories::RowMatrixTag,
- MatrixCategories::RowMatrixTag,
- MatrixCategories::RowMatrixTag) const
- {
- return axpyinRowRowRow (Y, A, X);
- }
-
- template <class Matrix1, class Matrix2, class Matrix3>
- Matrix1 &axpyinSpecialized (Matrix1 &Y, const Matrix2 &A, const Matrix3 &X,
- MatrixCategories::ColMatrixTag,
- MatrixCategories::ColMatrixTag,
- MatrixCategories::ColMatrixTag) const
- {
- return axpyinColColCol (Y, A, X);
- }
-
- template <class Matrix1, class Matrix2, class Matrix3>
- Matrix1 &axpyinSpecialized (Matrix1 &Y, const Matrix2 &A, const Matrix3 &X,
- MatrixCategories::RowColMatrixTag,
- MatrixCategories::RowColMatrixTag,
- MatrixCategories::RowColMatrixTag) const
- {
- return axpyinRowRowCol (Y, A, X);
- }
-
- template <class Vector1, class Matrix, class Vector2>
- Vector1 &mulRowSpecialized (Vector1 &w, const Matrix &A, const Vector2 &v,
- VectorCategories::DenseVectorTag) const;
- template <class Vector1, class Matrix, class Vector2>
- Vector1 &mulRowSpecialized (Vector1 &w, const Matrix &A, const Vector2 &v,
- VectorCategories::SparseSequenceVectorTag) const;
- template <class Vector1, class Matrix, class Vector2>
- Vector1 &mulRowSpecialized (Vector1 &w, const Matrix &A, const Vector2 &v,
- VectorCategories::SparseAssociativeVectorTag) const;
- template <class Vector1, class Matrix, class Vector2>
- Vector1 &mulRowSpecialized (Vector1 &w, const Matrix &A, const Vector2 &v,
- VectorCategories::SparseParallelVectorTag) const;
-
- template <class Vector1, class Matrix, class Vector2>
- Vector1 &mulColSpecialized (Vector1 &w, const Matrix &A, const Vector2 &v,
- VectorCategories::DenseVectorTag,
- VectorCategories::DenseVectorTag) const
- {
- return this->mulColDense (_VD, w, A, v);
- }
- template <class Vector1, class Matrix, class Vector2>
- Vector1 &mulColSpecialized (Vector1 &w, const Matrix &A, const Vector2 &v,
- VectorCategories::DenseVectorTag,
- VectorCategories::SparseSequenceVectorTag) const;
- template <class Vector1, class Matrix, class Vector2>
- Vector1 &mulColSpecialized (Vector1 &w, const Matrix &A, const Vector2 &v,
- VectorCategories::DenseVectorTag,
- VectorCategories::SparseAssociativeVectorTag) const;
- template <class Vector1, class Matrix, class Vector2>
- Vector1 &mulColSpecialized (Vector1 &w, const Matrix &A, const Vector2 &v,
- VectorCategories::DenseVectorTag,
- VectorCategories::SparseParallelVectorTag) const;
-
- template <class Vector1, class Matrix, class Vector2>
- inline Vector1 &mulColSpecialized (Vector1 &w, const Matrix &A, const Vector2 &v,
- VectorCategories::GenericVectorTag,
- VectorCategories::GenericVectorTag) const
- {
- typename LinBox::Vector<Field>::Dense y;
-
- VectorWrapper::ensureDim (y, w.size ());
-
- VectorWrapper::ensureDim (y, w.size ());
-
- vectorMul (y, A, v);
- _VD.copy (w, y);
-
- return w;
- }
-
- template <class Vector1, class Matrix, class Vector2>
- Vector1 &mulSpecialized (Vector1 &w, const Matrix &A, const Vector2 &v,
- MatrixCategories::RowMatrixTag) const
- {
- return mulRowSpecialized (w, A, v, typename VectorTraits<Vector1>::VectorCategory ());
- }
- template <class Vector1, class Matrix, class Vector2>
- Vector1 &mulSpecialized (Vector1 &w, const Matrix &A, const Vector2 &v,
- MatrixCategories::ColMatrixTag) const
- {
- return mulColSpecialized (w, A, v,
- typename VectorTraits<Vector1>::VectorCategory (),
- typename VectorTraits<Vector2>::VectorCategory ());
- }
- template <class Vector1, class Matrix, class Vector2>
- Vector1 &mulSpecialized (Vector1 &w, const Matrix &A, const Vector2 &v,
- MatrixCategories::RowColMatrixTag) const
- {
- return mulRowSpecialized (w, A, v, typename VectorTraits<Vector1>::VectorCategory ());
- }
-
- template <class Vector1, class Matrix, class Vector2>
- Vector1 &axpyinRowSpecialized (Vector1 &y, const Matrix &A, const Vector2 &x,
- VectorCategories::DenseVectorTag) const;
- template <class Vector1, class Matrix, class Vector2>
- Vector1 &axpyinRowSpecialized (Vector1 &y, const Matrix &A, const Vector2 &x,
- VectorCategories::SparseSequenceVectorTag) const;
- template <class Vector1, class Matrix, class Vector2>
- Vector1 &axpyinRowSpecialized (Vector1 &y, const Matrix &A, const Vector2 &x,
- VectorCategories::SparseAssociativeVectorTag) const;
- template <class Vector1, class Matrix, class Vector2>
- Vector1 &axpyinRowSpecialized (Vector1 &y, const Matrix &A, const Vector2 &x,
- VectorCategories::SparseParallelVectorTag) const;
-
- template <class Vector1, class Matrix, class Vector2>
- Vector1 &axpyinColSpecialized (Vector1 &y, const Matrix &A, const Vector2 &x,
- VectorCategories::DenseVectorTag) const;
- template <class Vector1, class Matrix, class Vector2>
- Vector1 &axpyinColSpecialized (Vector1 &y, const Matrix &A, const Vector2 &x,
- VectorCategories::SparseSequenceVectorTag) const;
- template <class Vector1, class Matrix, class Vector2>
- Vector1 &axpyinColSpecialized (Vector1 &y, const Matrix &A, const Vector2 &x,
- VectorCategories::SparseAssociativeVectorTag) const;
- template <class Vector1, class Matrix, class Vector2>
- Vector1 &axpyinColSpecialized (Vector1 &y, const Matrix &A, const Vector2 &x,
- VectorCategories::SparseParallelVectorTag) const;
-
- template <class Vector1, class Matrix, class Vector2>
- Vector1 &axpyinSpecialized (Vector1 &y, const Matrix &A, const Vector2 &x,
- MatrixCategories::RowMatrixTag) const
- {
- return axpyinRowSpecialized (y, A, x, typename VectorTraits<Vector1>::VectorCategory ());
- }
- template <class Vector1, class Matrix, class Vector2>
- Vector1 &axpyinSpecialized (Vector1 &y, const Matrix &A, const Vector2 &x,
- MatrixCategories::ColMatrixTag) const
- {
- return axpyinColSpecialized (y, A, x, typename VectorTraits<Vector1>::VectorCategory ());
- }
- template <class Vector1, class Matrix, class Vector2>
- Vector1 &axpyinSpecialized (Vector1 &y, const Matrix &A, const Vector2 &x,
- MatrixCategories::RowColMatrixTag) const
- {
- return axpyinRowSpecialized (y, A, x, typename VectorTraits<Vector1>::VectorCategory ());
- }
-
- template <class Matrix, class Iterator>
- inline Matrix &permuteRowsByRow (Matrix &A,
- Iterator P_start,
- Iterator P_end) const;
-
- template <class Matrix, class Iterator>
- inline Matrix &permuteRowsByCol (Matrix &A,
- Iterator P_start,
- Iterator P_end) const;
-
- template <class Matrix, class Iterator>
- inline Matrix &permuteRowsSpecialized (Matrix &A,
- Iterator P_start,
- Iterator P_end,
- MatrixCategories::RowColMatrixTag) const
- {
- return permuteRowsByCol (A, P_start, P_end);
- }
-
- template <class Matrix, class Iterator>
- inline Matrix &permuteRowsSpecialized (Matrix &A,
- Iterator P_start,
- Iterator P_end,
- MatrixCategories::RowMatrixTag) const
- {
- return permuteRowsByRow (A, P_start, P_end);
- }
-
- template <class Matrix, class Iterator>
- inline Matrix &permuteRowsSpecialized (Matrix &A,
- Iterator P_start,
- Iterator P_end,
- MatrixCategories::ColMatrixTag) const
- {
- return permuteRowsByCol (A, P_start, P_end);
- }
-
- template <class Matrix, class Iterator>
- inline Matrix &permuteColsByRow (Matrix &A,
- Iterator P_start,
- Iterator P_end) const;
-
- template <class Matrix, class Iterator>
- inline Matrix &permuteColsByCol (Matrix &A,
- Iterator P_start,
- Iterator P_end) const;
-
- template <class Matrix, class Iterator>
- inline Matrix &permuteColsSpecialized (Matrix &A,
- Iterator P_start,
- Iterator P_end,
- MatrixCategories::RowColMatrixTag) const
- {
- return permuteColsByRow (A, P_start, P_end);
- }
-
- template <class Matrix, class Iterator>
- inline Matrix &permuteColsSpecialized (Matrix &A,
- Iterator P_start,
- Iterator P_end,
- MatrixCategories::RowMatrixTag) const
- {
- return permuteColsByRow (A, P_start, P_end);
- }
-
- template <class Matrix, class Iterator>
- inline Matrix &permuteColsSpecialized (Matrix &A,
- Iterator P_start,
- Iterator P_end,
- MatrixCategories::ColMatrixTag) const
- {
- return permuteColsByCol (A, P_start, P_end);
- }
-
- Field _field;
- VectorDomain<Field> _VD;
- };
+#include "matrixdomain/matrix-domain.h" // needed by BlasMatrix
+#include "matrixdomain/blas-matrix-domain.h"
+#include "matrixdomain/matrix-domain-gf2.h"
+// #include "matrixdomain/matrix-domain-m4ri.h"
+#include "matrixdomain/plain-domain.h"
-}
+#include "matrixdomain/opencl-domain.h"
-#include "linbox/matrix/matrix-domain.inl"
-#endif // __LINBOX_matrix_domain_H
+#endif // __LINBOX_matrix_matrix_domain_H
// Local Variables:
@@ -1203,4 +83,3 @@ namespace LinBox
// c-basic-offset: 8
// End:
// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
-
diff --git a/linbox/matrix/matrix-domain.inl b/linbox/matrix/matrix-domain.inl
deleted file mode 100644
index edd8a3e..0000000
--- a/linbox/matrix/matrix-domain.inl
+++ /dev/null
@@ -1,1183 +0,0 @@
-
-/* linbox/matrix/matrix-domain.inl
- * Copyright (C) 2002 Bradford Hovinen
- *
- * Written by Bradford Hovinen <bghovinen at math.uwaterloo.ca>
- *
- * ------------------------------------
- *
- *
- * ========LICENCE========
- * This file is part of the library LinBox.
- *
- * LinBox is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- * ========LICENCE========
- *.
- */
-
-#ifndef __LINBOX_matrix_domain_INL
-#define __LINBOX_matrix_domain_INL
-
-#include "linbox/matrix/transpose-matrix.h"
-
-namespace LinBox
-{
-
- template <class Field>
- template <class Matrix1, class Matrix2>
- Matrix1 &MatrixDomain<Field>::copyRow (Matrix1 &A, const Matrix2 &B) const
- {
- linbox_check (A.rowdim () == B.rowdim ());
- linbox_check (A.coldim () == B.coldim ());
-
- typename Matrix1::RowIterator i;
- typename Matrix2::ConstRowIterator j;
-
- i = A.rowBegin ();
- j = B.rowBegin ();
-
- for (; i != A.rowEnd (); ++i, ++j)
- _VD.copy (*i, *j);
-
- return A;
- }
-
- template <class Field>
- template <class Matrix1, class Matrix2>
- Matrix1 &MatrixDomain<Field>::copyCol (Matrix1 &A, const Matrix2 &B) const
- {
- linbox_check (A.rowdim () == B.rowdim ());
- linbox_check (A.coldim () == B.coldim ());
-
- typename Matrix1::ColIterator i;
- typename Matrix2::ConstColIterator j;
-
- i = A.colBegin ();
- j = B.colBegin ();
-
- for (; i != A.colEnd (); ++i, ++j)
- _VD.copy (*i, *j);
-
- return A;
- }
-
- template <class Field>
- template <class Matrix1, class Matrix2>
- bool MatrixDomain<Field>::areEqualRow (const Matrix1 &A, const Matrix2 &B) const
- {
- linbox_check (A.rowdim () == B.rowdim ());
- linbox_check (A.coldim () == B.coldim ());
-
- typename Matrix1::ConstRowIterator i;
- typename Matrix2::ConstRowIterator j;
-
- i = A.rowBegin ();
- j = B.rowBegin ();
-
- for (; i != A.rowEnd (); ++i, ++j)
- if (!_VD.areEqual (*i, *j))
- return false;
-
- return true;
- }
-
- template <class Field>
- template <class Matrix1, class Matrix2>
- bool MatrixDomain<Field>::areEqualCol (const Matrix1 &A, const Matrix2 &B) const
- {
- linbox_check (A.rowdim () == B.rowdim ());
- linbox_check (A.coldim () == B.coldim ());
-
- typename Matrix1::ConstColIterator i;
- typename Matrix2::ConstColIterator j;
-
- i = A.colBegin ();
- j = B.colBegin ();
-
- for (; i != A.colEnd (); ++i, ++j)
- if (!_VD.areEqual (*i, *j))
- return false;
-
- return true;
- }
-
- template <class Field>
- template <class Matrix>
- bool MatrixDomain<Field>::isZeroRow (const Matrix &A) const
- {
- typename Matrix::ConstRowIterator i;
-
- i = A.rowBegin ();
-
- for (; i != A.rowEnd (); ++i)
- if (!_VD.isZero (*i))
- return false;
-
- return true;
- }
-
- template <class Field>
- template <class Matrix>
- bool MatrixDomain<Field>::isZeroCol (const Matrix &A) const
- {
- typename Matrix::ConstColIterator i;
-
- i = A.colBegin ();
-
- for (; i != A.colEnd (); ++i)
- if (!_VD.isZero (*i))
- return false;
-
- return true;
- }
-
- template <class Field>
- template <class Matrix1, class Matrix2, class Matrix3>
- Matrix1 &MatrixDomain<Field>::addRow (Matrix1 &C, const Matrix2 &A, const Matrix3 &B) const
- {
- linbox_check (A.rowdim () == B.rowdim ());
- linbox_check (A.coldim () == B.coldim ());
- linbox_check (A.rowdim () == C.rowdim ());
- linbox_check (A.coldim () == C.coldim ());
-
- typename Matrix1::RowIterator i;
- typename Matrix2::ConstRowIterator j;
- typename Matrix3::ConstRowIterator k;
-
- i = C.rowBegin ();
- j = A.rowBegin ();
- k = B.rowBegin ();
-
- for (; i != C.rowEnd (); ++i, ++j, ++k)
- _VD.add (*i, *j, *k);
-
- return C;
- }
-
- template <class Field>
- template <class Matrix1, class Matrix2, class Matrix3>
- Matrix1 &MatrixDomain<Field>::addCol (Matrix1 &C, const Matrix2 &A, const Matrix3 &B) const
- {
- linbox_check (A.rowdim () == B.rowdim ());
- linbox_check (A.coldim () == B.coldim ());
- linbox_check (A.rowdim () == C.rowdim ());
- linbox_check (A.coldim () == C.coldim ());
-
- typename Matrix1::ColIterator i;
- typename Matrix2::ConstColIterator j;
- typename Matrix3::ConstColIterator k;
-
- i = C.colBegin ();
- j = A.colBegin ();
- k = B.colBegin ();
-
- for (; i != C.colEnd (); ++i, ++j, ++k)
- _VD.add (*i, *j, *k);
-
- return C;
- }
-
- template <class Field>
- template <class Matrix1, class Matrix2>
- Matrix1 &MatrixDomain<Field>::addinRow (Matrix1 &A, const Matrix2 &B) const
- {
- linbox_check (A.rowdim () == B.rowdim ());
- linbox_check (A.coldim () == B.coldim ());
-
- typename Matrix1::RowIterator i;
- typename Matrix2::ConstRowIterator j;
-
- i = A.rowBegin ();
- j = B.rowBegin ();
-
- for (; i != A.rowEnd (); ++i, ++j)
- _VD.addin (*i, *j);
-
- return A;
- }
-
- template <class Field>
- template <class Matrix1, class Matrix2>
- Matrix1 &MatrixDomain<Field>::addinCol (Matrix1 &A, const Matrix2 &B) const
- {
- linbox_check (A.rowdim () == B.rowdim ());
- linbox_check (A.coldim () == B.coldim ());
-
- typename Matrix1::ColIterator i;
- typename Matrix2::ConstColIterator j;
-
- i = A.colBegin ();
- j = B.colBegin ();
-
- for (; i != A.colEnd (); ++i, ++j)
- _VD.addin (*i, *j);
-
- return A;
- }
-
- template <class Field>
- template <class Matrix1, class Matrix2, class Matrix3>
- Matrix1 &MatrixDomain<Field>::subRow (Matrix1 &C, const Matrix2 &A, const Matrix3 &B) const
- {
- linbox_check (A.rowdim () == B.rowdim ());
- linbox_check (A.coldim () == B.coldim ());
- linbox_check (A.rowdim () == C.rowdim ());
- linbox_check (A.coldim () == C.coldim ());
-
- typename Matrix1::RowIterator i;
- typename Matrix2::ConstRowIterator j;
- typename Matrix3::ConstRowIterator k;
-
- i = C.rowBegin ();
- j = A.rowBegin ();
- k = B.rowBegin ();
-
- for (; i != C.rowEnd (); ++i, ++j, ++k)
- _VD.sub (*i, *j, *k);
-
- return C;
- }
-
- template <class Field>
- template <class Matrix1, class Matrix2, class Matrix3>
- Matrix1 &MatrixDomain<Field>::subCol (Matrix1 &C, const Matrix2 &A, const Matrix3 &B) const
- {
- linbox_check (A.rowdim () == B.rowdim ());
- linbox_check (A.coldim () == B.coldim ());
- linbox_check (A.rowdim () == C.rowdim ());
- linbox_check (A.coldim () == C.coldim ());
-
- typename Matrix1::ColIterator i;
- typename Matrix2::ConstColIterator j;
- typename Matrix3::ConstColIterator k;
-
- i = C.colBegin ();
- j = A.colBegin ();
- k = B.colBegin ();
-
- for (; i != C.colEnd (); ++i, ++j, ++k)
- _VD.sub (*i, *j, *k);
-
- return C;
- }
-
- template <class Field>
- template <class Matrix1, class Matrix2>
- Matrix1 &MatrixDomain<Field>::subinRow (Matrix1 &A, const Matrix2 &B) const
- {
- linbox_check (A.rowdim () == B.rowdim ());
- linbox_check (A.coldim () == B.coldim ());
-
- typename Matrix1::RowIterator i;
- typename Matrix2::ConstRowIterator j;
-
- i = A.rowBegin ();
- j = B.rowBegin ();
-
- for (; i != A.rowEnd (); ++i, ++j)
- _VD.subin (*i, *j);
-
- return A;
- }
-
- template <class Field>
- template <class Matrix1, class Matrix2>
- Matrix1 &MatrixDomain<Field>::subinCol (Matrix1 &A, const Matrix2 &B) const
- {
- linbox_check (A.rowdim () == B.rowdim ());
- linbox_check (A.coldim () == B.coldim ());
-
- typename Matrix1::ColIterator i;
- typename Matrix2::ConstColIterator j;
-
- i = A.colBegin ();
- j = B.colBegin ();
-
- for (; i != A.colEnd (); ++i, ++j)
- _VD.subin (*i, *j);
-
- return A;
- }
-
- template <class Field>
- template <class Matrix1, class Matrix2>
- Matrix1 &MatrixDomain<Field>::negRow (Matrix1 &A, const Matrix2 &B) const
- {
- linbox_check (A.rowdim () == B.rowdim ());
- linbox_check (A.coldim () == B.coldim ());
-
- typename Matrix1::RowIterator i;
- typename Matrix2::ConstRowIterator j;
-
- i = A.rowBegin ();
- j = B.rowBegin ();
-
- for (; i != A.rowEnd (); ++i, ++j)
- _VD.neg (*i, *j);
-
- return A;
- }
-
- template <class Field>
- template <class Matrix1, class Matrix2>
- Matrix1 &MatrixDomain<Field>::negCol (Matrix1 &A, const Matrix2 &B) const
- {
- linbox_check (A.rowdim () == B.rowdim ());
- linbox_check (A.coldim () == B.coldim ());
-
- typename Matrix1::ColIterator i;
- typename Matrix2::ConstColIterator j;
-
- i = A.colBegin ();
- j = B.colBegin ();
-
- for (; i != A.colEnd (); ++i, ++j)
- _VD.neg (*i, *j);
-
- return A;
- }
-
- template <class Field>
- template <class Matrix>
- Matrix &MatrixDomain<Field>::neginRow (Matrix &A) const
- {
- typename Matrix::RowIterator i;
-
- for (i = A.rowBegin (); i != A.rowEnd (); ++i)
- _VD.negin (*i);
-
- return A;
- }
-
- template <class Field>
- template <class Matrix>
- Matrix &MatrixDomain<Field>::neginCol (Matrix &A) const
- {
- typename Matrix::ColIterator i;
-
- for (i = A.colBegin (); i != A.colEnd (); ++i)
- _VD.negin (*i);
-
- return A;
- }
-
- template <class Field>
- template <class Matrix1, class Matrix2, class Matrix3>
- Matrix1 &MatrixDomain<Field>::mulRowRowCol (Matrix1 &C, const Matrix2 &A, const Matrix3 &B) const
- {
- linbox_check (A.coldim () == B.rowdim ());
- linbox_check (A.rowdim () == C.rowdim ());
- linbox_check (B.coldim () == C.coldim ());
-
- typename Matrix2::ConstRowIterator i;
- typename Matrix3::ConstColIterator j;
- typename Matrix1::RowIterator l1;
- typename Matrix1::Row::iterator l2;
-
- for (i = A.rowBegin (), l1 = C.rowBegin (); i != A.rowEnd (); ++i, ++l1)
- for (j = B.colBegin (), l2 = l1->begin (); j != B.colEnd (); ++j, ++l2)
- _VD.dot (*l2, *i, *j);
-
- return C;
- }
-
- template <class Field>
- template <class Matrix1, class Matrix2, class Matrix3>
- Matrix1 &MatrixDomain<Field>::mulColRowCol (Matrix1 &C, const Matrix2 &A, const Matrix3 &B) const
- {
- linbox_check (A.coldim () == B.rowdim ());
- linbox_check (A.rowdim () == C.rowdim ());
- linbox_check (B.coldim () == C.coldim ());
-
- typename Matrix2::ConstRowIterator i;
- typename Matrix3::ConstColIterator j;
- typename Matrix1::ColIterator l1;
- typename Matrix1::Col::iterator l2;
-
- for (j = B.colBegin (), l1 = C.colBegin (); j != B.colEnd (); ++j, ++l1)
- for (i = A.rowBegin (), l2 = l1->begin (); i != A.rowEnd (); ++i, ++l2)
- _VD.dot (*l2, *i, *j);
-
- return C;
- }
-
- template <class Field>
- template <class Matrix1, class Matrix2, class Matrix3>
- Matrix1 &MatrixDomain<Field>::mulRowRowRow (Matrix1 &C, const Matrix2 &A, const Matrix3 &B) const
- {
- linbox_check (A.coldim () == B.rowdim ());
- linbox_check (A.rowdim () == C.rowdim ());
- linbox_check (B.coldim () == C.coldim ());
-
- typename Matrix2::ConstRowIterator i = A.rowBegin ();
- typename Matrix1::RowIterator j = C.rowBegin ();
-
- TransposeMatrix<const Matrix3> BT (B);
-
- for (; i != A.rowEnd (); ++i, ++j)
- vectorMul (*j, BT, *i);
-
- return C;
- }
-
- template <class Field>
- template <class Matrix1, class Matrix2, class Matrix3>
- Matrix1 &MatrixDomain<Field>::mulColColCol (Matrix1 &C, const Matrix2 &A, const Matrix3 &B) const
- {
- linbox_check (A.coldim () == B.rowdim ());
- linbox_check (A.rowdim () == C.rowdim ());
- linbox_check (B.coldim () == C.coldim ());
-
- typename Matrix3::ConstColIterator i = B.colBegin ();
- typename Matrix1::ColIterator j = C.colBegin ();
-
- for (; i != B.colEnd (); ++i, ++j)
- vectorMul (*j, A, *i);
-
- return C;
- }
-
- template <class Field>
- template <class Matrix1, class Matrix2>
- Matrix2 &MatrixDomain<Field>::leftMulin (const Matrix1 &A, Matrix2 &B) const
- {
- linbox_check (A.rowdim () == A.coldim ());
- linbox_check (A.coldim () == B.rowdim ());
-
- typename LinBox::Vector<Field>::Dense t (A.rowdim ());
-
- typename Matrix2::ColIterator i;
- typename Matrix1::ConstRowIterator j;
-
- typename LinBox::Vector<Field>::Dense::iterator k;
-
- for (i = B.colBegin (); i != B.colEnd (); ++i) {
- for (j = A.rowBegin (), k = t.begin (); j != A.rowEnd (); ++j, ++k)
- _VD.dot (*k, *j, *i);
-
- _VD.copy (*i, t);
- }
-
- return B;
- }
-
- template <class Field>
- template <class Matrix1, class Matrix2>
- Matrix1 &MatrixDomain<Field>::rightMulin (Matrix1 &A, const Matrix2 &B) const
- {
- linbox_check (A.coldim () == B.rowdim ());
- linbox_check (B.rowdim () == B.coldim ());
-
- typename LinBox::Vector<Field>::Dense t (B.coldim ());
-
- typename Matrix1::RowIterator i;
- typename Matrix2::ConstColIterator j;
-
- typename LinBox::Vector<Field>::Dense::iterator k;
-
- for (i = A.rowBegin (); i != A.rowEnd (); ++i) {
- for (j = B.colBegin (), k = t.begin (); j != B.colEnd (); ++j, ++k)
- _VD.dot (*k, *i, *j);
-
- _VD.copy (*i, t);
- }
-
- return A;
- }
-
- template <class Field>
- template <class Matrix1, class Matrix2>
- Matrix1 &MatrixDomain<Field>::mulRow (Matrix1 &C, const Matrix2 &B, const typename Field::Element &a) const
- {
- linbox_check (C.rowdim () == B.rowdim ());
- linbox_check (C.coldim () == B.coldim ());
-
- typename Matrix1::RowIterator i;
- typename Matrix2::ConstRowIterator j;
-
- i = C.rowBegin ();
- j = B.rowBegin ();
-
- for (; i != C.rowEnd (); ++i, ++j)
- _VD.mul (*i, *j, a);
-
- return C;
- }
-
- template <class Field>
- template <class Matrix1, class Matrix2>
- Matrix1 &MatrixDomain<Field>::mulCol (Matrix1 &C, const Matrix2 &B, const typename Field::Element &a) const
- {
- linbox_check (C.rowdim () == B.rowdim ());
- linbox_check (C.coldim () == B.coldim ());
-
- typename Matrix1::ColIterator i;
- typename Matrix2::ConstColIterator j;
-
- i = C.colBegin ();
- j = B.colBegin ();
-
- for (; i != C.colEnd (); ++i, ++j)
- _VD.mul (*i, *j, a);
-
- return C;
- }
-
- template <class Field>
- template <class Matrix>
- Matrix &MatrixDomain<Field>::mulinRow (Matrix &B, const typename Field::Element &a) const
- {
- typename Matrix::RowIterator i;
-
- for (i = B.rowBegin (); i != B.rowEnd (); ++i)
- _VD.mulin (*i, a);
-
- return B;
- }
-
- template <class Field>
- template <class Matrix>
- Matrix &MatrixDomain<Field>::mulinCol (Matrix &B, const typename Field::Element &a) const
- {
- typename Matrix::ColIterator i;
-
- for (i = B.colBegin (); i != B.colEnd (); ++i)
- _VD.mulin (*i, a);
-
- return B;
- }
-
- template <class Field>
- template <class Matrix1, class Matrix2, class Matrix3>
- Matrix1 &MatrixDomain<Field>::axpyinRowRowCol (Matrix1 &Y, const Matrix2 &A, const Matrix3 &X) const
- {
- linbox_check (A.coldim () == X.rowdim ());
- linbox_check (A.rowdim () == Y.rowdim ());
- linbox_check (X.coldim () == Y.coldim ());
-
- typename Matrix2::ConstRowIterator i;
- typename Matrix3::ConstColIterator j;
- typename Matrix1::RowIterator l1;
- typename Matrix1::Row::iterator l2;
-
- typename Field::Element t;
-
- for (i = A.rowBegin (), l1 = Y.rowBegin (); i != A.rowEnd (); ++i, ++l1) {
- for (j = X.colBegin (), l2 = l1->begin (); j != X.colEnd (); ++j, ++l2) {
- _VD.dot (t, *i, *j);
- _field.addin (*l2, t);
- }
- }
-
- return Y;
- }
-
- template <class Field>
- template <class Matrix1, class Matrix2, class Matrix3>
- Matrix1 &MatrixDomain<Field>::axpyinColRowCol (Matrix1 &Y, const Matrix2 &A, const Matrix3 &X) const
- {
- linbox_check (A.coldim () == X.rowdim ());
- linbox_check (A.rowdim () == Y.rowdim ());
- linbox_check (X.coldim () == Y.coldim ());
-
- typename Matrix2::ConstRowIterator i;
- typename Matrix3::ConstColIterator j;
- typename Matrix1::ColIterator l1;
- typename Matrix1::Col::iterator l2;
-
- typename Field::Element t;
-
- for (j = X.colBegin (), l1 = Y.colBegin (); j != X.colEnd (); ++j, ++l1) {
- for (i = A.rowBegin (), l2 = l1->begin (); i != A.rowEnd (); ++i, ++l2) {
- _VD.dot (t, *i, *j);
- _field.addin (*l2, t);
- }
- }
-
- return Y;
- }
-
- template <class Field>
- template <class Matrix1, class Matrix2, class Matrix3>
- Matrix1 &MatrixDomain<Field>::axpyinRowRowRow (Matrix1 &Y, const Matrix2 &A, const Matrix3 &X) const
- {
- linbox_check (A.coldim () == X.rowdim ());
- linbox_check (A.rowdim () == Y.rowdim ());
- linbox_check (X.coldim () == Y.coldim ());
-
- typename LinBox::Vector<Field>::Dense t (X.coldim ());
-
- typename Matrix2::ConstRowIterator i = A.rowBegin ();
- typename Matrix1::RowIterator j = Y.rowBegin ();
-
- TransposeMatrix<const Matrix3> XT (X);
-
- for (; i != A.rowEnd (); ++i, ++j) {
- vectorMul (t, XT, *i);
- _VD.addin (*j, t);
- }
-
- return Y;
- }
-
- template <class Field>
- template <class Matrix1, class Matrix2, class Matrix3>
- Matrix1 &MatrixDomain<Field>::axpyinColColCol (Matrix1 &Y, const Matrix2 &A, const Matrix3 &X) const
- {
- linbox_check (A.coldim () == X.rowdim ());
- linbox_check (A.rowdim () == Y.rowdim ());
- linbox_check (X.coldim () == Y.coldim ());
-
- typename LinBox::Vector<Field>::Dense t (A.rowdim ());
-
- typename Matrix3::ConstColIterator i = X.colBegin ();
- typename Matrix1::ColIterator j = Y.colBegin ();
-
- for (; i != X.colEnd (); ++i, ++j) {
- vectorMul (t, A, *i);
- _VD.addin (*j, t);
- }
-
- return Y;
- }
-
- template <class Field>
- template <class Vector1, class Matrix, class Vector2>
- Vector1 &MatrixDomain<Field>::mulRowSpecialized (Vector1 &w, const Matrix &A, const Vector2 &v,
- VectorCategories::DenseVectorTag) const
- {
- linbox_check (A.coldim () == v.size ());
- linbox_check (A.rowdim () == w.size ());
-
- typename Matrix::ConstRowIterator i = A.rowBegin ();
- typename Vector1::iterator j = w.begin ();
-
- // JGD 02.09.2008 : when sizes differ
- // A must decide if dot is possible, not w
- // for (; j != w.end (); ++j, ++i)
- // _VD.dot (*j, v, *i);
- for (; i != A.rowEnd (); ++j, ++i) {
- linbox_check(j != w.end());
- _VD.dot (*j, v, *i);
- }
-
- return w;
- }
-
- template <class Field>
- template <class Vector1, class Matrix, class Vector2>
- Vector1 &MatrixDomain<Field>::mulRowSpecialized (Vector1 &w, const Matrix &A, const Vector2 &v,
- VectorCategories::SparseSequenceVectorTag) const
- {
- typename Matrix::ConstRowIterator i = A.rowBegin ();
- typename Field::Element t;
- unsigned int idx = 0;
-
- w.clear ();
-
- for (; i != A.rowEnd (); ++i, ++idx) {
- _VD.dot (t, v, *i);
-
- if (!_field.isZero (t))
- w.push_back (std::pair<size_t, typename Field::Element> (idx, t));
- }
-
- return w;
- }
-
- template <class Field>
- template <class Vector1, class Matrix, class Vector2>
- Vector1 &MatrixDomain<Field>::mulRowSpecialized (Vector1 &w, const Matrix &A, const Vector2 &v,
- VectorCategories::SparseAssociativeVectorTag) const
- {
- typename Matrix::ConstRowIterator i = A.rowBegin ();
- typename Field::Element t;
- unsigned int idx = 0;
-
- w.clear ();
-
- for (; i != A.rowEnd (); ++i, ++idx) {
- _VD.dot (t, v, *i);
-
- if (!_field.isZero (t))
- w[idx] = t;
- }
-
- return w;
- }
-
- template <class Field>
- template <class Vector1, class Matrix, class Vector2>
- Vector1 &MatrixDomain<Field>::mulRowSpecialized (Vector1 &w, const Matrix &A, const Vector2 &v,
- VectorCategories::SparseParallelVectorTag) const
- {
- typename Matrix::ConstRowIterator i = A.rowBegin ();
- typename Field::Element t;
- unsigned int idx = 0;
-
- w.first.clear ();
- w.second.clear ();
-
- for (; i != A.rowEnd (); ++i, ++idx) {
- _VD.dot (t, v, *i);
-
- if (!_field.isZero (t)) {
- w.first.push_back (idx);
- w.second.push_back (t);
- }
- }
-
- return w;
- }
-
- template <class Field>
- template <class Vector1, class Matrix, class Vector2>
- Vector1 &MVProductDomain<Field>::mulColDense
- (const VectorDomain<Field> &VD, Vector1 &w, const Matrix &A, const Vector2 &v) const
- {
- linbox_check (A.coldim () == v.size ());
- linbox_check (A.rowdim () == w.size ());
-
- typename Matrix::ConstColIterator i = A.colBegin ();
- typename Vector2::const_iterator j = v.begin ();
-
- VD.subin (w, w);
-
- for (; j != v.end (); ++j, ++i)
- VD.axpyin (w, *j, *i);
-
- return w;
- }
-
- template <class Field>
- template <class Vector1, class Matrix, class Vector2>
- Vector1 &MatrixDomain<Field>::mulColSpecialized (Vector1 &w, const Matrix &A, const Vector2 &v,
- VectorCategories::DenseVectorTag,
- VectorCategories::SparseSequenceVectorTag) const
- {
- linbox_check (A.rowdim () == w.size ());
-
- typename Vector2::const_iterator j = v.begin ();
-
- _VD.subin (w, w);
-
- for (; j != v.end (); ++j) {
- typename Matrix::ConstColIterator i = A.colBegin () + j->first;
- _VD.axpyin (w, j->second, *i);
- }
-
- return w;
- }
-
- template <class Field>
- template <class Vector1, class Matrix, class Vector2>
- Vector1 &MatrixDomain<Field>::mulColSpecialized (Vector1 &w, const Matrix &A, const Vector2 &v,
- VectorCategories::DenseVectorTag,
- VectorCategories::SparseAssociativeVectorTag) const
- {
- linbox_check (A.rowdim () == w.size ());
-
- typename Vector2::const_iterator j = v.begin ();
-
- _VD.subin (w, w);
-
- for (; j != v.end (); ++j) {
- typename Matrix::ConstColIterator i = A.colBegin () + j->first;
- _VD.axpyin (w, j->second, *i);
- }
-
- return w;
- }
-
- template <class Field>
- template <class Vector1, class Matrix, class Vector2>
- Vector1 &MatrixDomain<Field>::mulColSpecialized (Vector1 &w, const Matrix &A, const Vector2 &v,
- VectorCategories::DenseVectorTag,
- VectorCategories::SparseParallelVectorTag) const
- {
- linbox_check (A.rowdim () == w.size ());
-
- typename Vector2::first_type::const_iterator j_idx = v.first.begin ();
- typename Vector2::second_type::const_iterator j_elt = v.second.begin ();
-
- _VD.subin (w, w);
-
- for (; j_idx != v.first.end (); ++j_idx, ++j_elt) {
- typename Matrix::ConstColIterator i = A.colBegin () + *j_idx;
- _VD.axpyin (w, *j_elt, *i);
- }
-
- return w;
- }
-
- template <class Field>
- template <class Vector1, class Matrix, class Vector2>
- Vector1 &MatrixDomain<Field>::axpyinRowSpecialized (Vector1 &y, const Matrix &A, const Vector2 &x,
- VectorCategories::DenseVectorTag) const
- {
- linbox_check (A.coldim () == x.size ());
- linbox_check (A.rowdim () == y.size ());
-
- typename Matrix::ConstRowIterator i = A.rowBegin ();
- typename Vector1::iterator j = y.begin ();
-
- typename Field::Element t;
-
- for (; j != y.end (); ++j, ++i) {
- _VD.dot (t, x, *i);
- _field.addin (*j, t);
- }
-
- return y;
- }
-
- template <class Field>
- template <class Vector1, class Matrix, class Vector2>
- Vector1 &MatrixDomain<Field>::axpyinRowSpecialized (Vector1 &y, const Matrix &A, const Vector2 &x,
- VectorCategories::SparseSequenceVectorTag) const
- {
- typename LinBox::Vector<Field>::Dense t1 (A.coldim ()), t2 (A.rowdim ());
-
- _VD.copy (t1, x);
- _VD.copy (t2, y);
- axpyin (t2, A, t1);
- _VD.copy (y, t2);
-
- return y;
- }
-
- template <class Field>
- template <class Vector1, class Matrix, class Vector2>
- Vector1 &MatrixDomain<Field>::axpyinRowSpecialized (Vector1 &y, const Matrix &A, const Vector2 &x,
- VectorCategories::SparseAssociativeVectorTag) const
- {
- typename LinBox::Vector<Field>::Dense t1 (A.coldim ()), t2 (A.rowdim ());
-
- _VD.copy (t1, x);
- _VD.copy (t2, y);
- axpyin (t2, A, t1);
- _VD.copy (y, t2);
-
- return y;
- }
-
- template <class Field>
- template <class Vector1, class Matrix, class Vector2>
- Vector1 &MatrixDomain<Field>::axpyinRowSpecialized (Vector1 &y, const Matrix &A, const Vector2 &x,
- VectorCategories::SparseParallelVectorTag) const
- {
- typename LinBox::Vector<Field>::Dense t1 (A.coldim ()), t2 (A.rowdim ());
-
- _VD.copy (t1, x);
- _VD.copy (t2, y);
- axpyin (t2, A, t1);
- _VD.copy (y, t2);
-
- return y;
- }
-
- template <class Field>
- template <class Vector1, class Matrix, class Vector2>
- Vector1 &MatrixDomain<Field>::axpyinColSpecialized (Vector1 &y, const Matrix &A, const Vector2 &x,
- VectorCategories::DenseVectorTag) const
- {
- linbox_check (A.coldim () == x.size ());
- linbox_check (A.rowdim () == y.size ());
-
- typename Matrix::ConstColIterator i = A.colBegin ();
- typename Vector2::const_iterator j = x.begin ();
-
- for (; j != x.end (); ++j, ++i)
- _VD.axpyin (y, *j, *i);
-
- return y;
- }
-
- template <class Field>
- template <class Vector1, class Matrix, class Vector2>
- Vector1 &MatrixDomain<Field>::axpyinColSpecialized (Vector1 &y, const Matrix &A, const Vector2 &x,
- VectorCategories::SparseSequenceVectorTag) const
- {
- typename Matrix::ConstColIterator i = A.colBegin ();
- typename Vector2::iterator j = x.begin ();
-
- int diff;
-
- typename LinBox::Vector<Field>::Dense t (A.rowdim ());
-
- _VD.copy (t, y);
-
- while (j != x.end ()) {
- _VD.axpyin (t, j->second, *i);
- diff = j->first; ++j;
- diff -= j->first;
- i -= diff;
- }
-
- _VD.copy (y, t);
-
- return y;
- }
-
- template <class Field>
- template <class Vector1, class Matrix, class Vector2>
- Vector1 &MatrixDomain<Field>::axpyinColSpecialized (Vector1 &y, const Matrix &A, const Vector2 &x,
- VectorCategories::SparseAssociativeVectorTag) const
- {
- typename Matrix::ConstColIterator i = A.colBegin ();
- typename Vector2::iterator j = x.begin ();
-
- int diff;
-
- typename LinBox::Vector<Field>::Dense t (A.rowdim ());
-
- _VD.copy (t, y);
-
- while (j != x.end ()) {
- _VD.axpyin (t, j->second, *i);
- diff = j->first; ++j;
- diff -= j->first;
- i -= diff;
- }
-
- _VD.copy (y, t);
-
- return y;
- }
-
- template <class Field>
- template <class Vector1, class Matrix, class Vector2>
- Vector1 &MatrixDomain<Field>::axpyinColSpecialized (Vector1 &y, const Matrix &A, const Vector2 &x,
- VectorCategories::SparseParallelVectorTag) const
- {
- typename Matrix::ConstColIterator i = A.colBegin ();
- typename Vector2::iterator j_idx = x.first.begin ();
- typename Vector2::iterator j_elt = x.second.begin ();
-
- int diff;
-
- typename LinBox::Vector<Field>::Dense t (A.rowdim ());
-
- _VD.copy (t, y);
-
- for (; j_idx != x.first.end (); ++j_elt) {
- _VD.axpyin (t, *j_elt, *i);
- diff = *j_idx; ++j_idx;
- diff -= *j_idx;
- i -= diff;
- }
-
- _VD.copy (y, t);
-
- return y;
- }
-
- template <class Field>
- template <class Matrix1, class Blackbox, class Matrix2>
- Matrix1 &MatrixDomain<Field>::blackboxMulLeft (Matrix1 &C, const Blackbox &A, const Matrix2 &B) const
- {
- linbox_check (A.coldim () == B.rowdim ());
- linbox_check (A.rowdim () == C.rowdim ());
- linbox_check (B.coldim () == C.coldim ());
-
- typename Matrix1::ColIterator i = C.colBegin ();
- typename Matrix2::ConstColIterator j = B.colBegin ();
-
- for (; i != C.colEnd (); ++i, ++j)
- A.apply (*i, *j);
-
- return C;
- }
-
- template <class Field>
- template <class Matrix1, class Matrix2, class Blackbox>
- Matrix1 &MatrixDomain<Field>::blackboxMulRight (Matrix1 &C, const Matrix2 &A, const Blackbox &B) const
- {
- linbox_check (A.coldim () == B.rowdim ());
- linbox_check (A.rowdim () == C.rowdim ());
- linbox_check (B.coldim () == C.coldim ());
-
- typename Matrix1::RowIterator i = C.rowBegin ();
- typename Matrix2::ConstRowIterator j = A.rowBegin ();
-
- for (; i != C.rowEnd (); ++i, ++j)
- B.applyTranspose (*i, *j);
-
- return C;
- }
-
- template <class Field>
- template <class Matrix, class Iterator>
- Matrix &MatrixDomain<Field>::permuteRowsByRow (Matrix &A,
- Iterator P_start,
- Iterator P_end) const
- {
- Iterator i;
- typename Matrix::RowIterator j, k;
-
- for (i = P_start; i != P_end; ++i) {
- j = A.rowBegin () + i->first;
- k = A.rowBegin () + i->second;
-
- _VD.swap (*j, *k);
- }
-
- return A;
- }
-
- template <class Field>
- template <class Matrix, class Iterator>
- Matrix &MatrixDomain<Field>::permuteRowsByCol (Matrix &A,
- Iterator P_start,
- Iterator P_end) const
- {
- typename Matrix::ColIterator j;
-
- for (j = A.colBegin (); j != A.colEnd (); ++j)
- _VD.permute (*j, P_start, P_end);
-
- return A;
- }
-
- template <class Field>
- template <class Matrix, class Iterator>
- Matrix &MatrixDomain<Field>::permuteColsByRow (Matrix &A,
- Iterator P_start,
- Iterator P_end) const
- {
- typename Matrix::RowIterator j;
-
- for (j = A.rowBegin (); j != A.rowEnd (); ++j)
- _VD.permute (*j, P_start, P_end);
-
- return A;
- }
-
- template <class Field>
- template <class Matrix, class Iterator>
- Matrix &MatrixDomain<Field>::permuteColsByCol (Matrix &A,
- Iterator P_start,
- Iterator P_end) const
- {
- Iterator i;
- typename Matrix::ColIterator j, k;
-
- for (i = P_start; i != P_end; ++i) {
- j = A.colBegin () + i->first;
- k = A.colBegin () + i->second;
-
- _VD.swap (*j, *k);
- }
-
- return A;
- }
-
- /* FIXME: These methods are undocumented, and I'm unclear what they are supposed
- * to do
- */
-
-#if 0
-
- /*M1<-M2**k;
- */
- template<class Matrix1, class Matrix2>
- Matrix1& MatrixDomain::pow_apply(Matrix1& M1, const Matrix2& M2, unsigned long int k) const
- {
- linbox_check((M1.rowdim()==M1.coldim())&&
- (M2.rowdim()==M2.coldim())&&
- (M1.rowdim()==M2.rowdim()));
-
-
- typename Matrix1::Iterator p=M1.Begin();
- for(;p!=M1.End();++p)
- M1.field().init(*p,0);
- for(p=M1.Begin();p<M1.End();)
- {
- M1.field().init(*p,1);
- p=p+M1.rowdim()+1;
- }
-
-
- for(int i=0;i<k;++i)
- mulin_R(M1,M2);
-
- return M1;
- }
-
-
- template<class Matrix1, class Matrix2>
- Matrix1& MatrixDomain::pow_horn(Matrix1& M1, const Matrix2& M2, unsigned long int k) const
- {
- linbox_check((M1.rowdim()==M1.coldim())&&
- (M2.rowdim()==M2.coldim())&&
- (M1.rowdim()==M2.rowdim()));
-
- if(k==0)
- {
- typename Matrix1::Iterator p=M1.Begin();
- for(;p!=M1.End();++p)
- M1.field().init(*p,0);
- for(p=M1.Begin();p<M1.End();)
- {
- M1.field().init(*p,1);
- p+=M1.rowdim()+1;
- }
- return M1;
- }
-
- typename Matrix1::Iterator p1;
- typename Matrix2::ConstIterator p2;
- for(p1=M1.Begin(),p2=M2.Begin();p1!=M1.End();++p1,++p2)
- M1.field().assign(*p1,*p2);
-
- std::vector<bool> bit;
- bit.reserve(sizeof(unsigned long)*4);
- while(k>0)
- {
- bit.push_back(k%2);
- k/=2;
- };
-
-
- std::vector<bool>::reverse_iterator p=bit.rbegin();
- ++p;
- Matrix1 temp(M1);
- for(;p!=bit.rend();++p)
- {
- temp=M1;
- mulin_L(M1,temp);
- if(*p)
- mulin_L(M1,M2);
-
- }
-
- return M1;
- }
-
-#endif
-
-} // namespace LinBox
-
-#endif // __LINBOX_matrix_domain_INL
-
-
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
-// Local Variables:
-// mode: C++
-// tab-width: 8
-// indent-tabs-mode: nil
-// c-basic-offset: 8
-// End:
-
diff --git a/linbox/matrix/matrix-iterators.doxy b/linbox/matrix/matrix-iterators.doxy
new file mode 100644
index 0000000..dee40ee
--- /dev/null
+++ b/linbox/matrix/matrix-iterators.doxy
@@ -0,0 +1,45 @@
+// Copyright 2014 LinBox. See COPYING for licence information.
+/*
+ * Written by:
+ * Brice Boyer (briceboyer) <boyer.brice at gmail.com>
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ * ========LICENCE========
+ */
+
+ /*! @ingroup matrix
+ * @defgroup matrixiterators Iterators
+ * @brief NO DOC YET
+ *
+ * Matrices in general may omit one of the iterators, either the row iterator or
+ * the column iterator. This is useful for, e.g. sparse matrices that are
+ * represented by sparse row vectors, since column vectors are computationally
+ * expensive to compute without directly building the transpose of the matrix.
+ *
+ * \par RowIterator
+ *
+ * \par ColIterator
+ *
+ * \par Iterator
+ *
+ * \par IndexedIterator
+ *
+ */
+
+
+// vim:syn=doxygen
diff --git a/linbox/matrix/matrix-traits.h b/linbox/matrix/matrix-traits.h
new file mode 100644
index 0000000..15a551f
--- /dev/null
+++ b/linbox/matrix/matrix-traits.h
@@ -0,0 +1,92 @@
+/* linbox/matrix/matrix-traits.h
+ * Copyright (C) 2013 the LinBox group
+ *
+ * Written by :
+ * Brice Boyer (briceboyer) <boyer.brice at gmail.com>
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ * ========LICENCE========
+ */
+
+#ifndef __LINBOX_matrix_matrix_traits_H
+#define __LINBOX_matrix_matrix_traits_H
+
+#include "linbox/util/debug.h"
+#include "linbox/linbox-config.h"
+#include "linbox/matrix/matrix-category.h"
+
+namespace LinBox {
+
+
+ //! @brief NO DOC.
+ template <class Matrix>
+ struct MatrixTraits {
+ typedef Matrix MatrixType;
+ typedef typename MatrixCategories::BlackboxTag MatrixCategory;
+ };
+
+
+ //! NODOC
+ template <class Matrix>
+ class MatrixContainerTrait {
+ public:
+ typedef MatrixContainerCategory::Blackbox Type;
+ };
+
+
+ //! try to map a blackbox over a homorphic ring
+ //! The most suitable type
+ template <class Blackbox, class Field>
+ struct MatrixHomTrait {
+ // static_assert(false,"should not be instanciated");
+ //typedef ... FBlackbox
+ // donot know
+ // typedef Blackbox value_type;
+ };
+
+ /// limited doc so far
+ namespace IndexedTags
+ {
+ struct HasIndexed{};
+ struct HasNext{};
+ struct NoIndexed{};
+ }
+
+ /// Trait to show whether or not the BB class has a Indexed iterator
+ template<class BB>
+ struct IndexedCategory {
+ typedef IndexedTags::NoIndexed Tag;
+ };
+
+ template<class Field, class Vect>
+ struct SparseVectorTranslate {
+ typedef Vect other_t;
+ };
+
+
+} // LinBox
+
+#endif // __LINBOX_matrix_matrix_traits_H
+
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/matrix/matrix.doxy b/linbox/matrix/matrix.doxy
index a431893..ab18a33 100644
--- a/linbox/matrix/matrix.doxy
+++ b/linbox/matrix/matrix.doxy
@@ -1,5 +1,8 @@
-// Copyright 2010 LinBox. See COPYING for licence information.
+// Copyright 2010,2014 LinBox. See COPYING for licence information.
/*
+ * Written by:
+ * Brice Boyer (briceboyer) <boyer.brice at gmail.com>
+ *
* ========LICENCE========
* This file is part of the library LinBox.
*
@@ -20,44 +23,38 @@
*/
/** \ingroup linbox
- \defgroup matrix matrix
- \brief These matrix representations provide iterators for element access.
-
- The class \c LinBox::DenseMatrixBase provides an archetype for matrices that
- are "directly represented", that is, where the user has direct access to
- iterators over the rows and columns, and to all of the elements themselves by
- position.
-
- The class \c LinBox::SparseMatrixBase provides an archetype for matrices that
- are partially "directly represented", that is, where the user has direct
- access to (sparse) iterators over the rows and columns, and to all of the
- nonzero elements themselves by position.
-
- The directly represented matrices are pure containers; they provide no matrix
- arithmetic and do not implement the black box interface (but this is added in
- their counterparts \c LinBox::DenseMatrix and \c LinBox::SparseMatrix in \ref
- blackbox) They are parameterized solely by element type. The field is not
- necessary.
-
- Matrices in general may omit one of the iterators, either the row iterator or
- the column iterator. This is useful for, e.g. sparse matrices that are
- represented by sparse row vectors, since column vectors are computationally
- expensive to compute without directly building the transpose of the matrix.
-
- The class \link LinBox::MatrixDomain MatrixDomain \endlink provides a
- complete suite of matrix arithmetic that works transparently with any class
- meeting the interface defined by the classes below. This includes
- matrix-matrix addition and multiplication, matrix-vector multiplication, and
- matrix-blackbox (c.f. \link LinBox::BlackboxArchetype BlackboxArchetype
- \endlink ) multiplication.
-
- @todo talk about Linux::BlasPermutation
+ * \defgroup matrix matrix
+ * \brief Matrices in LinBox
+ *
+ * All matrices are containers that present the blackbox interface.
+ * (\sa blackbox Interface. )
+ *
+ * Matrices are templated by a Field and a Storage type.
+ *
+ * \par Dense Matrices.
+ * Dense matrices can be represented in the BLAS representation (row major, row
+ * and column dimension, stride).
+ * The container is <code>BlasMatrix<Field,Rep></code> and the view is \c BlasSubmatrix.
+ * @todo vector of rows ?
+ * \sa densematrix.
+ *
+ * \par Sparse Matrices.
+ * Sparse Matrices are reprenseted in various ways. They are
+ * <code>SparseMatrix<Field,Rep></code>.
+ * \sa sparsematrix.
+ *
+ * \par Permutation Matrix
+ * \sa permuation matrix
+ *
+ * \par Matrix Domain.
+ * The class \link LinBox::MatrixDomain MatrixDomain \endlink provides a
+ * complete suite of matrix arithmetic that works transparently with any class
+ * meeting the interface defined by the classes below. This includes
+ * matrix-matrix addition and multiplication, matrix-vector multiplication,
+ * and matrix-blackbox multiplication.
+ * \sa matrixdomain
*/
- /*! @ingroup matrix
- * @defgroup iterators Iterators
- * @brief NO DOC YET
- */
// vim:syn=doxygen
diff --git a/linbox/matrix/matrixdomain/Makefile.am b/linbox/matrix/matrixdomain/Makefile.am
new file mode 100644
index 0000000..1846675
--- /dev/null
+++ b/linbox/matrix/matrixdomain/Makefile.am
@@ -0,0 +1,51 @@
+# Copyright (c) 2013 the LinBox group
+# written by BB
+# ========LICENCE========
+# This file is part of the library LinBox.
+#
+# LinBox is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+#
+# This library 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
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+# ========LICENCE========
+
+
+
+pkgincludesubdir=$(pkgincludedir)/matrix/matrixdomain
+
+
+OCL_HDRS = \
+ opencl-domain.h \
+ opencl-domain.inl \
+ opencl-domain-util.inl \
+ opencl-domain-memory.inl \
+ opencl-domain-factory.h
+
+# if LINBOX_HAVE_OCL // we include them anyway. (for make dist when OCL not available)
+USE_OCL_HDRS = $(OCL_HDRS)
+# endif
+
+
+
+pkgincludesub_HEADERS = \
+ matrix-domain.h \
+ matrix-domain.inl \
+ matrix-domain-gf2.h \
+ blas-matrix-domain.h \
+ blas-matrix-domain.inl \
+ apply-domain.h \
+ plain-domain.h \
+ $(USE_OCL_HDRS)
+
+
+
+
diff --git a/linbox/matrix/matrixdomain/apply-domain.h b/linbox/matrix/matrixdomain/apply-domain.h
new file mode 100644
index 0000000..82d4bb2
--- /dev/null
+++ b/linbox/matrix/matrixdomain/apply-domain.h
@@ -0,0 +1,462 @@
+/*
+ * Copyright (C) 2014 the LinBox group
+ *
+ * Written by:
+ * Brice Boyer (briceboyer) <boyer.brice at gmail.com>
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ * ========LICENCE========
+ *.
+ */
+
+/** @file linbox/matrix/matrixdomain/apply-domain.h
+ * @brief NO DOC
+ */
+
+#ifndef __LINBOX_matrixdomain_apply_domain_H
+#define __LINBOX_matrixdomain_apply_domain_H
+
+#include "linbox/integer.h"
+#include "linbox/linbox-tags.h"
+
+namespace LinBox {
+
+ struct applyMethod {
+ struct Sequential {} ;
+ struct OpenMP {} ;
+ struct OpenCL {} ;
+ struct Cuda {};
+ } ;
+
+ template<class _Matrix/*, class Method = applyMethod::Sequential */>
+ class applyDomain {
+ public:
+ typedef typename _Matrix::Field Field;
+ typedef typename Field::Element Element;
+ private :
+ const Field & _field ;
+ MatrixDomain<Field> _MD ;
+ private :
+ // y = a A x + b y
+ template<class _In, class _Out, class Matrix>
+ _Out& _apply( LINBOX_enum(Tag::Transpose) t
+ , _Out& y
+ , const Element & a
+ , const Matrix & A
+ , const Element & b
+ , const _In & x
+ , typename ContainerCategories::Vector
+ , typename ContainerCategories::Vector
+ ) const
+ {
+ if (_field.isZero(a)) {
+ _MD.vectorDomain().mulin(y,b);
+ return y ;
+ }
+
+ if (t == Tag::Transpose::Trans ) {
+#if 0
+ typename Matrix::ConstColIterator i = A.colBegin ();
+ typename _Out::iterator j = y.begin ();
+ for (; j != y.end (); ++j, ++i)
+ A._VD.dot (*j, x, *i);
+#else
+ TransposeMatrix<const Matrix> At(A);
+ if (_field.isZero(b)) { /* y = a A x */
+ _MD.vectorMul(y,At,x); /* y = Ax */
+
+ if (_field.isOne(a)) {
+ // return y ;
+ }
+ else if (_field.isMOne(a) ) { /* y = -y */
+ _MD.vectorDomain().negin(y);
+ }
+ else {/* y = a y */
+ _MD.vectorDomain().mulin(y,a);
+ }
+ }
+ else if (_field.isOne(b)) { /* y = a A x + y */
+ throw LinBoxError("not implemented yet");
+ }
+ else if (_field.isMOne(b)) { /* y = a A x - y */
+ throw LinBoxError("not implemented yet");
+ }
+ else { /* y = a A x + b y */
+ _MD.vectorDomain().mulin(y,b);
+ _In xx(x);
+ _MD.vectorDomain().mulin(xx,a);
+ _MD.vectorAxpyin(y,At,xx) ;
+ }
+#endif
+ }
+ else { /* not Transpose */
+ linbox_check( t == Tag::Transpose::NoTrans ) ;
+ if (_field.isZero(b)) {/* y = a A x */
+ _MD.vectorMul(y,A,x);
+ if (_field.isOne(a)) {
+
+ }
+ else if (_field.isMOne(a) )
+ _MD.vectorDomain().negin(y);
+ else {
+ _MD.vectorDomain().mulin(y,a);
+ }
+ }
+ else if (_field.isOne(b)) {/* y = a A x + y */
+ throw LinBoxError("not implemented yet");
+ }
+ else if (_field.isMOne(b)) {/* y = a A x - y */
+ throw LinBoxError("not implemented yet");
+ }
+ else {/* y = a A x + b y */
+ _MD.vectorDomain().mulin(y,b);
+ _In xx(x);
+ _MD.vectorDomain().mulin(xx,a);
+ _MD.vectorAxpyin(y,A,xx);
+ }
+
+ }
+ return y ;
+ }
+
+ template<class _In, class _Out, class Matrix>
+ _Out& _apply( LINBOX_enum(Tag::Transpose) t
+ , _Out& y
+ , const Element & a
+ , const Matrix & A
+ , const Element & b
+ , const _In & x
+ , typename ContainerCategories::Any
+ , typename ContainerCategories::Any
+ ) const
+ {
+ // linbox_check(_field.isZero(a) && _field.isOne(a));
+ if (t == Tag::Transpose::Trans ) {
+ typename Matrix::ConstColIterator i = A.colBegin ();
+ typename _Out::iterator j = y.begin ();
+ for (; j != y.end (); ++j, ++i)
+ A._VD.dot (*j, x, *i);
+ }
+ else {
+ _MD.vectorMul(y,A,x);
+ }
+ return y;
+ }
+
+ public:
+ applyDomain(const Field & F) :
+ _field(F)
+ , _MD(F)
+ {}
+ /*! Operation \f$y gets a A x + b y\f$ or \f$y gets a A^t x + b y\f$ .
+ * General axpy with x and y vectors or matrices
+ */
+ template<class _In, class _Out, class Matrix>
+ _Out& apply( LINBOX_enum(Tag::Transpose) t
+ , _Out& y
+ , const Element & a
+ , const Matrix & A
+ , const Element & b
+ , const _In & x
+ // , Method & m
+ ) const
+ {
+ // std::cout << "called generic" << std::endl;
+ return _apply(t,y,a,A,b,x
+ ,typename ContainerTraits<_In> ::ContainerCategory()
+ ,typename ContainerTraits<_Out>::ContainerCategory()
+ );
+ }
+
+#if 0
+ /*! Operation \f$y gets a A x + b y\f$ or \f$y gets a A^t x + b y\f$ .
+ *(can overwrite A, uses less memory that \c apply)
+ */
+ template<class _In, class _Out>
+ _Out& applyIn( LINBOX_enum(Tag::Transpose) t
+ , _Out& y
+ , const Element & a
+ , Matrix & A
+ , const Element & b
+ , const _In & x
+ // , Method & m
+ );
+#endif
+
+ };
+
+ template<class T, class R>
+ class applyDomain<const BlasMatrix<Givaro::Modular<T>, R > >{
+ public:
+ typedef Givaro::Modular<T> Field;
+ typedef typename Field::Element Element;
+ private:
+ const Field & _field ;
+
+ // y = a A x + b y
+ template<class _In, class _Out, class Matrix>
+ _Out& _apply( LINBOX_enum(Tag::Transpose) t
+ , _Out& y
+ , const Element & a
+ , const Matrix & A
+ , const Element & b
+ , const _In & x
+ , typename ContainerCategories::Vector
+ , typename ContainerCategories::Vector ) const
+ {
+ // std::cout << "here V" << std::endl;
+ // A.write(std::cout,Tag::FileFormat::Maple) << std::endl;
+ // std::cout << x << std::endl;
+
+
+ FFLAS::fgemv(_field
+ , (FFLAS::FFLAS_TRANSPOSE)t,
+ A.rowdim(), A.coldim(),
+ _field.one,
+ A.getPointer(), A.getStride(),
+ x.getPointer(), x.getStride(),
+ _field.zero,
+ y.getWritePointer(),y.getStride());
+
+ // FFLAS::fgemm(_field
+ // , (FFLAS::FFLAS_TRANSPOSE)t
+ // , FFLAS::FflasNoTrans
+ // , A.rowdim(), 1, A.coldim()
+ // , _field.one,
+ // A.getPointer(), A.getStride(),
+ // x.getPointer(),x.getStride(),
+ // _field.zero,
+ // y.getWritePointer(),y.getStride());
+
+ // std::cout << y << std::endl;
+
+ return y ;
+ }
+
+
+ // y = a A x + b y
+ template<class Matrix>
+ std::vector<Element>& _apply(LINBOX_enum(Tag::Transpose) t
+ , std::vector<Element> & y
+ , const Element & a
+ , const Matrix & A
+ , const Element & b
+ , const std::vector<Element> & x
+ , typename ContainerCategories::Vector
+ , typename ContainerCategories::Vector ) const
+ {
+
+ FFLAS::fgemv(_field
+ , (FFLAS::FFLAS_TRANSPOSE)t,
+ A.rowdim(), A.coldim(),
+ _field.one,
+ A.getPointer(), A.getStride(),
+ &x[0], 1,
+ _field.zero,
+ &y[0],1);
+
+ return y ;
+ }
+
+ // y = a A x + b y
+ template<class _In, class _Out, class Matrix>
+ _Out& _apply( LINBOX_enum(Tag::Transpose) t
+ , _Out& y
+ , const Element & a
+ , const Matrix & A
+ , const Element & b
+ , const _In & x
+ , typename ContainerCategories::Matrix
+ , typename ContainerCategories::Matrix
+ ) const
+ {
+ // needs to be debuged (trans?). Never Used.
+ // std::cout << "here M" << std::endl;
+ FFLAS::fgemm(_field
+ , (FFLAS::FFLAS_TRANSPOSE)t
+ , FFLAS::FflasNoTrans
+ , A.rowdim(), x.coldim(), A.coldim()
+ , _field.one,
+ A.getPointer(), A.getStride(),
+ x.getPointer(),x.getStride(),
+ _field.zero,
+ y.getWritePointer(),y.getStride());
+
+ return y ;
+ }
+
+ public:
+ applyDomain(const Field & F) :
+ _field(F)
+ {}
+
+ /*! Operation \f$y gets a A x + b y\f$ or \f$y gets a A^t x + b y\f$ .
+ * General axpy with x and y vectors or matrices
+ */
+ template<class _In, class _Out, class Matrix>
+ _Out& apply( LINBOX_enum(Tag::Transpose) t
+ , _Out& y
+ , const Element & a
+ , const Matrix & A
+ , const Element & b
+ , const _In & x
+ // , Method & m
+ ) const
+ {
+ // std::cout << "called Givaro::Modular<T>" << std::endl;
+ return _apply(t,y,a,A,b,x
+ ,typename ContainerTraits<_In> ::ContainerCategory()
+ ,typename ContainerTraits<_Out>::ContainerCategory() );
+ }
+
+ };
+
+ template<class T, class R>
+ class applyDomain<const BlasMatrix<Givaro::ModularBalanced<T>, R > >{
+ public:
+ typedef Givaro::ModularBalanced<T> Field;
+ typedef typename Field::Element Element;
+ private:
+ const Field & _field ;
+
+ // y = a A x + b y
+ template<class _In, class _Out, class Matrix>
+ _Out& _apply( LINBOX_enum(Tag::Transpose) t
+ , _Out& y
+ , const Element & a
+ , const Matrix & A
+ , const Element & b
+ , const _In & x
+ , typename ContainerCategories::Vector
+ , typename ContainerCategories::Vector
+ ) const
+ {
+ // std::cout << "here V" << std::endl;
+ FFLAS::fgemv(_field, (FFLAS::FFLAS_TRANSPOSE)t,
+ A.rowdim(), A.coldim(),
+ _field.one,
+ A.getPointer(), A.getStride(),
+ x.getPointer(),x.getStride(),
+ // &x[0],ldx,
+ _field.zero,
+ y.getWritePointer(),y.getStride());
+
+ return y ;
+ }
+
+ // y = a A x + b y
+ template<class _In, class _Out, class Matrix>
+ _Out& _apply( LINBOX_enum(Tag::Transpose) t
+ , _Out& y
+ , const Element & a
+ , const Matrix & A
+ , const Element & b
+ , const _In & x
+ , typename ContainerCategories::Matrix
+ , typename ContainerCategories::Matrix
+ ) const
+ {
+ // needs to be debuged (trans?). Never Used.
+ // std::cout << "here M" << std::endl;
+ FFLAS::fgemm(_field
+ , (FFLAS::FFLAS_TRANSPOSE)t
+ , FFLAS::FflasNoTrans
+ , A.rowdim(), x.coldim(), A.coldim()
+ , _field.one,
+ A.getPointer(), A.getStride(),
+ x.getPointer(),x.getStride(),
+ _field.zero,
+ y.getWritePointer(),y.getStride());
+
+ return y ;
+ }
+
+ public:
+ applyDomain(const Field & F) :
+ _field(F)
+ {}
+
+ /*! Operation \f$y gets a A x + b y\f$ or \f$y gets a A^t x + b y\f$ .
+ * General axpy with x and y vectors or matrices
+ */
+ template<class _In, class _Out, class Matrix>
+ _Out& apply( LINBOX_enum(Tag::Transpose) t
+ , _Out& y
+ , const Element & a
+ , const Matrix & A
+ , const Element & b
+ , const _In & x
+ // , Method & m
+ ) const
+ {
+ // std::cout << "called Givaro::ModularBalanced<T>" << std::endl;
+ return _apply(t,y,a,A,b,x
+ ,typename ContainerTraits<_In >::ContainerCategory()
+ ,typename ContainerTraits<_Out>::ContainerCategory() );
+ }
+
+ };
+
+#if 0
+ template<class _Field, class _Rep>
+ class applyDomain<BlasMatrix<_Field,_Rep> > {
+ // dispatch according to field.
+ // if modular and p small -> Givaro::ModularBalanced<float>
+ // if modular and p medium -> Givaro::ModularBalanced<float>
+ // default to triple loop in MatrixDomain
+ };
+
+ template<class _Field, class _Rep>
+ class applyDomain<BlasMatrix<Givaro::Extension<_Field>,_Rep> > {
+ // if large enough: Toom Cook
+ };
+
+ template<class _Rep>
+ class applyDomain<BlasMatrix<Givaro::ZRing<Integer>,_Rep> > {
+ // if large : flint
+ };
+
+ template<class T, class _Rep>
+ class applyDomain<BlasMatrix<Unparametric<T>,_Rep> > {
+ // if T == float/double -> BLAS
+
+ };
+
+ template<class _Rep>
+ class applyDomain<BlasMatrix<Givaro::Modular<double>,_Rep> > {
+ // Blas
+ };
+
+ template<class _Rep>
+ class applyDomain<BlasMatrix<Givaro::Modular<float>,_Rep> > {
+ // Blas
+ };
+#endif
+
+
+} // LinBox
+
+#endif
+
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/matrix/matrixdomain/blas-matrix-domain.h b/linbox/matrix/matrixdomain/blas-matrix-domain.h
new file mode 100644
index 0000000..b28625d
--- /dev/null
+++ b/linbox/matrix/matrixdomain/blas-matrix-domain.h
@@ -0,0 +1,980 @@
+/* linbox/matrix/blas-matrix-domain.h
+ * Copyright (C) 2004 Pascal Giorgi, Clément Pernet
+ *
+ * Written by :
+ * Pascal Giorgi pascal.giorgi at ens-lyon.fr
+ * Clément Pernet clement.pernet at imag.fr
+ *
+ * originally placed as ../algorithms/blas-domain.h
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ * ========LICENCE========
+ */
+
+/*! @file matrix/matrixdomain/blas-domain.h
+ * @ingroup matrixdomain
+ * @brief NO DOC
+ * @warning A <code>BlasMatrixDomain<Field></code> should be templated by a
+ * \link Givaro::Modular Modular\endlink field. In particular, this domain
+ * is not suitable for integers.
+ * @warning A \e Field does mean here a \e Field and not a general \f$\mathbf{Z}/m\mathbf{Z}\f$ \e ring. You'll be warned...
+ */
+
+#ifndef __LINBOX_blas_matrix_domain_H
+#define __LINBOX_blas_matrix_domain_H
+
+#include <linbox/linbox-config.h>
+#include <iostream>
+#include <vector>
+
+#include <fflas-ffpack/ffpack/ffpack.h>
+#include <fflas-ffpack/fflas/fflas.h>
+
+#include "linbox/linbox-config.h"
+#include "linbox/util/debug.h"
+
+#include "linbox/matrix/dense-matrix.h"
+#include "linbox/matrix/permutation-matrix.h"
+#include "linbox/matrix/factorized-matrix.h"
+
+
+
+namespace LinBox
+{
+
+ /** @internal
+ * Class handling multiplication of a Matrix by an Operand with accumulation and scaling.
+ * Operand can be either a matrix or a vector.
+ *
+ * The only function: operator () is defined :
+ * - D = beta.C + alpha. A*B
+ * - C = beta.C + alpha. A*B
+ */
+ template<class Operand1, class Operand2, class Operand3/*, class MatrixVectorType*/>
+ class BlasMatrixDomainMulAdd
+#if 0
+ {
+ public:
+ typedef typename Operand1::Field Field;
+ Operand1 &operator() (//const Field &F,
+ Operand1 &D,
+ const typename Field::Element &beta, const Operand1 &C,
+ const typename Field::Element &alpha, const Operand2 &A, const Operand3 &B) const;
+
+ Operand1 &operator() (//const Field &F,
+ const typename Field::Element &beta, Operand1 &C,
+ const typename Field::Element &alpha, const Operand2 &A, const Operand3 &B) const;
+
+
+#if 0 /* compiles without... */
+ // allowing disymetry of Operand2 and Operand3 (only if different type)
+ Operand1 &operator() (const Field &F,
+ Operand1 &D,
+ const typename Field::Element &beta, const Operand1 &C,
+ const typename Field::Element &alpha, const Operand3 &A, const Operand2 &B) const;
+
+ Operand1 &operator() (const Field &F,
+ const typename Field::Element &beta, Operand1 &C,
+ const typename Field::Element &alpha, const Operand3 &A, const Operand2 &B) const;
+#endif
+
+
+
+ }
+#endif
+ ;
+
+ /*!@internal
+ * Adding two matrices
+ */
+ template< class Field, class Operand1, class Operand2, class Operand3>
+ class BlasMatrixDomainAdd {
+ public:
+ Operand1 &operator() (const Field &F,
+ Operand1 &C, const Operand2 &A, const Operand3 &B) const;
+
+ };
+
+ /*!@internal
+ * Substracting two matrices
+ */
+ template< class Field, class Operand1, class Operand2, class Operand3>
+ class BlasMatrixDomainSub {
+ public:
+ Operand1 &operator() (const Field &F,
+ Operand1 &C, const Operand2 &A, const Operand3 &B) const;
+
+ };
+ //! C -= A
+ template< class Field, class Operand1, class Operand2>
+ class BlasMatrixDomainSubin {
+ public:
+ Operand1 &operator() (const Field &F,
+ Operand1 &C, const Operand2 &A) const;
+
+ };
+ //! C += A
+ template< class Field, class Operand1, class Operand2>
+ class BlasMatrixDomainAddin {
+ public:
+ Operand1 &operator() (const Field &F,
+ Operand1 &C, const Operand2 &A) const;
+
+ };
+
+
+ /*!@internal
+ * Copying a matrix
+ */
+ template< class Field, class Operand1, class Operand2>
+ class BlasMatrixDomainCopy {
+ public:
+ Operand1 &operator() (const Field &F,
+ Operand1 &B, const Operand2 &A) const;
+
+ };
+
+ /*!@internal
+ * multiplying two matrices.
+ */
+ template< class Field, class Operand1, class Operand2, class Operand3>
+ class BlasMatrixDomainMul {
+ public:
+ Operand1 &operator() (const Field &F,
+ Operand1 &C, const Operand2 &A, const Operand3 &B) const
+ {
+ return BlasMatrixDomainMulAdd<Operand1,Operand2,Operand3/*,Operand1::MatrixVectorType*/>()( F.zero, C, F.one, A, B );
+ }
+ };
+
+ /*! @internal
+ * Class handling in-place multiplication of a Matrix by an Operand.
+ * Operand can be either a matrix a permutation or a vector
+ *
+ * only function: operator () are defined :
+ * - A = A*B
+ * - B = A*B
+ * .
+ * @note In-place multiplications are proposed for the specialization
+ * with a matrix and a permutation.
+ * @warning Using mulin with two matrices is still defined but is
+ * non-sense
+ */
+ // Operand 2 is always the type of the matrix which is not modified
+ // ( for example: BlasPermutation TriangularBlasMatrix )
+ template< class Field, class Operand1, class Operand2>
+ class BlasMatrixDomainMulin {
+ public:
+ // Defines a dummy mulin over generic matrices using a temporary
+ Operand1 &operator() (const Field &F,
+ Operand1 &A, const Operand2 &B) const
+ {
+ Operand1* tmp = new Operand1(A);
+ // Effective copy of A
+ *tmp = A;
+ BlasMatrixDomainMulAdd<Operand1,Operand1,Operand2/*,Operand1::MatrixVectorType()*/>()( F.zero, A, F.one, *tmp, B );
+ delete tmp;
+ return A;
+ }
+
+ Operand1 &operator() (const Field &F,
+ const Operand2 &A, Operand1 &B ) const
+ {
+ Operand1* tmp = new Operand1(B);
+ // Effective copy of B
+ *tmp = B;
+ BlasMatrixDomainMulAdd<Operand1,Operand1,Operand2/*,Operand1::MatrixVectorType()*/>()( F.zero, B, F.one, A, *tmp );
+ delete tmp;
+ return B;
+ }
+ };
+
+ namespace Protected {
+ template <class Field, class MatrixView>
+ class BlasMatrixDomainInv;
+ template <class Field, class MatrixView>
+ class BlasMatrixDomainDet;
+ template <class Field, class MatrixView>
+ class BlasMatrixDomainRank;
+ }
+
+ /*! @internal
+ * Class handling inversion of a Matrix.
+ *
+ * only function: operator () are defined :
+ * - Ainv = A^(-1)
+ *
+ * Returns nullity of matrix (0 iff inversion was ok)
+ *
+ * @warning Beware, if A is not const this allows an inplace computation
+ * and so A will be modified
+ *
+ */
+ template< class Field, class Matrix1, class Matrix2>
+ class BlasMatrixDomainInv {
+ public:
+ int operator() (const Field &F, Matrix1 &Ainv, const Matrix2 &A) const ;
+ int operator() (const Field &F, Matrix1 &Ainv, Matrix2 &A) const ;
+
+ };
+
+ /*! @internal
+ * Class handling rank computation of a Matrix.
+ *
+ * only function: operator () are defined :
+ * - return the rank of A
+ *
+ * @warning Beware, if A is not const this allows an inplace computation
+ * and so A will be modified
+ */
+ template< class Field, class Matrix>
+ class BlasMatrixDomainRank {
+ public:
+ unsigned int operator() (const Field &F, const Matrix& A) const;
+ unsigned int operator() (const Field &F, Matrix& A) const;
+ };
+
+ /*! @internal
+ * Class handling determinant computation of a Matrix.
+ *
+ * only function: operator () are defined :
+ * - return the determinant of A
+ *
+ * @warning Beware, if A is not const this allows an inplace computation
+ * and so A will be modified
+ */
+ template< class Field, class Matrix>
+ class BlasMatrixDomainDet {
+ public:
+ typename Field::Element operator() (const Field &F, const Matrix& A) const;
+ typename Field::Element operator() (const Field &F, Matrix& A) const;
+ };
+
+ /*! @internal
+ * Class handling resolution of linear system of a Matrix.
+ * with Operand as right or left and side
+ *
+ * only function: operator () are defined :
+ * - X = A^(-1).B
+ * - B = A^(-1).B
+ */
+ template< class Field, class Operand1, class Matrix, class Operand2=Operand1>
+ class BlasMatrixDomainLeftSolve {
+ public:
+ Operand1 &operator() (const Field &F, Operand1 &X, const Matrix &A, const Operand2 &B) const;
+ Operand1 &operator() (const Field &F, const Matrix &A, Operand1 &B) const;
+ };
+
+ /*! @internal
+ * Class handling resolution of linear system of a Matrix.
+ * with Operand as right or left and side
+ *
+ * only function: operator () are defined :
+ * - X = B.A^(-1)
+ * - B = B.A^(-1)
+ */
+ template< class Field, class Operand1, class Matrix, class Operand2=Operand1>
+ class BlasMatrixDomainRightSolve {
+ public:
+ Operand1 &operator() (const Field &F, Operand1 &X, const Matrix &A, const Operand2 &B) const;
+ Operand1 &operator() (const Field &F, const Matrix &A, Operand1 &B) const;
+ };
+
+ /*! @internal
+ * Class handling the minimal polynomial of a Matrix.
+ */
+ template< class Field, class Polynomial, class Matrix>
+ class BlasMatrixDomainMinpoly {
+ public:
+ Polynomial& operator() (const Field &F, Polynomial& P, const Matrix& A) const;
+ };
+
+ /*! @internal
+ * Class handling the characteristic polynomial of a Matrix.
+ * \p ContPol is either:
+ */
+ template< class Field, class ContPol, class Matrix>
+ class BlasMatrixDomainCharpoly {
+ public:
+ ContPol& operator() (const Field &F, ContPol& P, const Matrix& A) const;
+ };
+
+ template< class Field, class Matrix, class _Vrep>
+ class BlasMatrixDomainCharpoly<Field,BlasVector<Field,_Vrep>,Matrix> {
+ public:
+ BlasVector<Field,_Vrep>& operator() (const Field &F, BlasVector<Field,_Vrep>& P, const Matrix& A) const;
+ };
+
+ /**
+ * Interface for all functionnalities provided
+ * for BlasMatrix.
+ * @internal
+ * Done through specialization of all
+ * classes defined above.
+ */
+ template <class Field_>
+ class BlasMatrixDomain {
+
+ public:
+ typedef Field_ Field;
+ typedef typename Field::Element Element;
+ typedef typename RawVector<Element >::Dense Rep;
+ typedef BlasMatrix<Field,Rep> OwnMatrix;
+ typedef BlasSubmatrix<OwnMatrix> Matrix;
+ typedef BlasSubmatrix<OwnMatrix> Submatrix;
+
+ protected:
+
+ const Field * _field;
+
+ public:
+
+ //! Constructor of BlasDomain.
+/*
+ BlasMatrixDomain ()
+ BlasMatrixDomain (const Field& F )
+ void init(const Field& F )
+ BlasMatrixDomain (const BlasMatrixDomain<Field> & BMD)
+ const Field& field() const
+ T1& copy(T1& B, const T2& A) const
+ T1& add(T1& C, const T2& A, const T3& B) const
+ T1& sub(T1& C, const T2& A, const T3& B) const
+ T1& mul(T1& C, const T2& A, const T3& B) const
+ T1& mul(T1& C, const Elt& alpha, const T2& A, const T3& B) const
+ T1& axpy(T1& D, const T2& A, const T3& B, const T1& C) const
+ T1& maxpy(T1& D, const T2& A, const T3& B, const T1& C) const
+ T1& axmy(T1& D, const T2& A, const T3& B, const T1& C) const
+ T1& muladd(T1& D, const Elt& beta, const T1& C, const Elt& alpha, const T2& A, const T3& B) const
+ Matrix& inv( Matrix &B, Matrix &A) const
+ M1& inv( M1 &Ainv, const M2 &A, int& nullity) const // ?
+ Matrix& div( Matrix &C, const Matrix &A, const Matrix &B) const
+ T1& addin(T1& A, const T2& B) const
+ T1& subin(T1& A, const T2& B) const
+ T1& mulin_left(T1& A, const T2& B) const // A <- AB
+ T1& mulin_right(T1& A, const T2& B) const // A <- BA
+ T1& axpyin(T1& C, const T2& A, const T3& B) const
+ T1& maxpyin(T1& C, const T2& A, const T3& B) const
+ T1& axmyin(T1& C, const T2& A, const T3& B) const
+ const
+ T1& muladdin(const Elt& beta, T1& C, const Elt& alpha, const T2& A, const T3& B) const
+
+ Matrix& invin( Matrix &Ainv, Matrix &A) const //?
+ Matrix& invin(Matrix &A) const
+ M1& invin( M1 &Ainv, M2 &A, int& nullity) const
+ unsigned int rank(const Matrix &A) const
+ unsigned int rankin(Matrix &A) const
+ Element det(const Matrix &A) const
+ Element detin(Matrix &A) const
+ T& left_solve (T& X, const Matrix& A, const T& B) const
+ T& left_solve (const Matrix& A, T& B) const
+ T1& right_solve (T1& X, const Matrix& A, const T2& B) const
+ T& right_solve (const Matrix& A, T& B) const
+ Polynomial& minpoly( Polynomial& P, const Matrix& A ) const
+ Polynomial& charpoly( Polynomial& P, const Matrix& A ) const
+ std::list<Polynomial>& charpoly( std::list<Polynomial>& P, const Matrix& A ) const
+ bool isZero(const Matrix1 & A) const
+ bool areEqual(const Matrix1 & A, const Matrix2 & B) const
+ void setIdentity(Matrix & I) const
+ void setZero(Matrix & I) const
+ bool isIdentity(const Matrix1 & A) const
+ bool isIdentityGeneralized(const Matrix1 & A) const
+ Element& Magnitude(Element&r, const myBlasMatrix &A) const
+ inline std::ostream &write (std::ostream &os, const Matrix &A) const
+ inline std::ostream &write (std::ostream &os, const Matrix &A, bool maple_format) const
+ inline std::istream &read (std::istream &is, Matrix &A) const
+*/
+ BlasMatrixDomain () {}
+ BlasMatrixDomain (const Field& F ) { init(F); }
+
+ void init(const Field& F )
+ {
+ _field = &F;
+#if 0 // NO MORE USEFUL
+#ifndef NDEBUG
+ if (!Givaro::probab_prime(F.characteristic())) {
+ std::cout << " *** WARNING *** " << std::endl;
+ std::cout << " You are using a BLAS Domain where your field is not prime " <<
+ F.characteristic() << std::endl;
+ }
+#endif
+#endif
+ }
+
+ //! Copy constructor
+ BlasMatrixDomain (const BlasMatrixDomain<Field> & BMD) :
+ _field(BMD._field)
+ {
+#if 0 // NO MORE USEFUL
+#ifndef NDEBUG
+ if (!Givaro::probab_prime(field().characteristic())) {
+ std::cout << " *** WARNING *** " << std::endl;
+ std::cout << " You are using a BLAS Domain where your field is not prime " << std::endl;
+ }
+#endif
+#endif
+ }
+
+ //! Field accessor
+ const Field& field() const { return *_field; }
+
+ /*
+ * Basics operation available matrix respecting BlasMatrix interface
+ */
+
+ //! multiplication.
+ //! C = A*B
+ template <class Operand1, class Operand2, class Operand3>
+ Operand1& mul(Operand1& C, const Operand2& A, const Operand3& B) const
+ {
+ return BlasMatrixDomainMul<Field,Operand1,Operand2,Operand3>()(field(),C,A,B);
+ }
+
+ //! addition.
+ //! C = A+B
+ template <class Operand1, class Operand2, class Operand3>
+ Operand1& add(Operand1& C, const Operand2& A, const Operand3& B) const
+ {
+ return BlasMatrixDomainAdd<Field,Operand1,Operand2,Operand3>()(field(),C,A,B);
+ }
+
+ //! copy.
+ //! B = A
+ template <class Operand1, class Operand2>
+ Operand1& copy(Operand1& B, const Operand2& A) const
+ {
+ return BlasMatrixDomainCopy<Field,Operand1,Operand2>()(field(),B,A);
+ }
+
+ //! substraction
+ //! C = A-B
+ template <class Operand1, class Operand2, class Operand3>
+ Operand1& sub(Operand1& C, const Operand2& A, const Operand3& B) const
+ {
+ return BlasMatrixDomainSub<Field,Operand1,Operand2,Operand3>()(field(),C,A,B);
+ }
+
+ //! substraction (in place)
+ //! C -= B
+ template <class Operand1, class Operand3>
+ Operand1& subin(Operand1& C, const Operand3& B) const
+ {
+ return BlasMatrixDomainSubin<Field,Operand1,Operand3>()(field(),C,B);
+ }
+
+ //! addition (in place)
+ //! C += B
+ template <class Operand1, class Operand3>
+ Operand1& addin(Operand1& C, const Operand3& B) const
+ {
+ return BlasMatrixDomainAddin<Field,Operand1,Operand3>()(field(),C,B);
+ }
+
+ //! multiplication with scaling.
+ //! C = alpha.A*B
+ template <class Operand1, class Operand2, class Operand3>
+ Operand1& mul(Operand1& C, const Element& alpha, const Operand2& A, const Operand3& B) const
+ {
+ return muladdin(field().zero,C,alpha,A,B);
+ }
+
+ //! In place multiplication.
+ //! A = A*B
+ template <class Operand1, class Operand2>
+ Operand1& mulin_left(Operand1& A, const Operand2& B ) const
+ {
+ return BlasMatrixDomainMulin<Field,Operand1,Operand2>()(field(),A,B);
+ }
+
+ //! In place multiplication.
+ //! B = A*B
+ template <class Operand1, class Operand2>
+ Operand2& mulin_right(const Operand1& A, Operand2& B ) const
+ {
+ return BlasMatrixDomainMulin<Field,Operand2,Operand1>()(field(),A,B);
+ }
+
+ template <class Matrix1, class Matrix2>
+ inline Matrix1 &mulin (Matrix1 &A, const Matrix2 &B) const
+ {
+ return mulin_left (A, B);
+ }
+
+ //! axpy.
+ //! D = A*B + C
+ template <class Operand1, class Operand2, class Operand3>
+ Operand1& axpy(Operand1& D, const Operand2& A, const Operand3& B, const Operand1& C) const
+ {
+ return muladd(D,field().one,C,field().one,A,B);
+ }
+
+ //! axpyin.
+ //! C += A*B
+ template <class Operand1, class Operand2, class Operand3>
+ Operand1& axpyin(Operand1& C, const Operand2& A, const Operand3& B) const
+ {
+ return muladdin(field().one,C,field().one,A,B);
+ }
+
+ //! maxpy.
+ //! D = C - A*B
+ template <class Operand1, class Operand2, class Operand3>
+ Operand1& maxpy(Operand1& D, const Operand2& A, const Operand3& B, const Operand1& C)const
+ {
+ return muladd(D,field().one,C,field().mOne,A,B);
+ }
+
+ //! maxpyin.
+ //! C -= A*B
+ template <class Operand1, class Operand2, class Operand3>
+ Operand1& maxpyin(Operand1& C, const Operand2& A, const Operand3& B) const
+ {
+ return muladdin(field().one,C,field().mOne,A,B);
+ }
+
+ //! axmy.
+ //! D= A*B - C
+ template <class Operand1, class Operand2, class Operand3>
+ Operand1& axmy(Operand1& D, const Operand2& A, const Operand3& B, const Operand1& C) const
+ {
+ return muladd(D,field().mOne,C,field().one,A,B);
+ }
+
+ //! axmyin.
+ //! C = A*B - C
+ template <class Operand1, class Operand2, class Operand3>
+ Operand1& axmyin(Operand1& C, const Operand2& A, const Operand3& B) const
+ {
+ return muladdin(field().mOne,C,field().one,A,B);
+ }
+
+ //! general matrix-matrix multiplication and addition with scaling.
+ //! D= beta.C + alpha.A*B
+ template <class Operand1, class Operand2, class Operand3>
+ Operand1& muladd(Operand1& D, const Element& beta, const Operand1& C,
+ const Element& alpha, const Operand2& A, const Operand3& B) const
+ {
+ return BlasMatrixDomainMulAdd<Operand1,Operand2,Operand3/*,Operand1::MatrixVectorType()*/>()(D,beta,C,alpha,A,B);
+ }
+
+ //! muladdin.
+ //! C= beta.C + alpha.A*B.
+ template <class Operand1, class Operand2, class Operand3>
+ Operand1& muladdin(const Element& beta, Operand1& C,
+ const Element& alpha, const Operand2& A, const Operand3& B) const
+ {
+ return BlasMatrixDomainMulAdd<Operand1,Operand2,Operand3/*,Operand1::MatrixVectorType()*/>()(beta,C,alpha,A,B);
+ }
+
+
+ /*!
+ * @name Solutions available for matrix respecting BlasMatrix interface
+ */
+ //@{
+
+ //! Inversion
+ template <class Matrix1, class Matrix2>
+ Matrix1& inv( Matrix1 &Ainv, const Matrix2 &A) const
+ {
+ BlasMatrixDomainInv<Field,Matrix1,Matrix2>()(field(),Ainv,A);
+ return Ainv;
+ }
+
+ //! Inversion (in place)
+ template <class Matrix>
+ Matrix& invin( Matrix &Ainv, Matrix &A) const
+ {
+ BlasMatrixDomainInv<Field,Matrix,Matrix>()(field(),Ainv,A);
+ return Ainv;
+ }
+
+ //! Inversion (the matrix A is modified)
+ template <class Matrix>
+ Matrix& invin(Matrix &A) const
+ {
+ Matrix tmp(A);
+ //Matrix tmp(A.rowdim(), A.coldim());
+ //tmp = A;
+ //BlasMatrixDomainInv<Field,Matrix,Matrix>()(field(),A,tmp);
+ return inv(A, tmp);
+ }
+
+
+ /*! Division.
+ * C = A B^{-1} ==> C . B = A
+ */
+ template <class Matrix>
+ Matrix& div( Matrix &C, const Matrix &A, const Matrix &B) const
+ {
+ return this->right_solve(C,B,A);
+ }
+
+ /** Matrix swap
+ * B <--> A. They must already have the same shape.
+ * @returns Reference to B
+ */
+ inline Matrix &swap(Matrix &B, Matrix &A) const {
+ return B.swap(A);
+ }
+
+
+ //- Inversion w singular check
+ // template <class Matrix>
+ // Matrix& inv( Matrix &Ainv, const Matrix &A, int& nullity) const
+ // {
+ // nullity = BlasMatrixDomainInv<Field,Matrix,Matrix>()(field(),Ainv,A);
+ // return Ainv;
+ // }
+
+ //! Inversion w singular check
+ template <class Matrix1, class Matrix2>
+ Matrix1& inv( Matrix1 &Ainv, const Matrix2 &A, int& nullity) const
+ {
+ nullity = BlasMatrixDomainInv<Field,Matrix1,Matrix2>()(field(),Ainv,A);
+ return Ainv;
+ }
+
+
+ //! Inversion (the matrix A is modified) w singular check
+ template <class Matrix1, class Matrix2>
+ Matrix1& invin( Matrix1 &Ainv, Matrix2 &A, int& nullity) const
+ {
+ nullity = BlasMatrixDomainInv<Field,Matrix1,Matrix2>()(field(),Ainv,A);
+ return Ainv;
+ }
+
+ //! Rank
+ template <class Matrix>
+ unsigned int rank(const Matrix &A) const
+ {
+ return BlasMatrixDomainRank<Field,Matrix>()(field(),A);
+ }
+
+ //! in-place Rank (the matrix is modified)
+ template <class Matrix>
+ unsigned int rankin(Matrix &A) const
+ {
+ return BlasMatrixDomainRank<Field, Matrix>()(field(),A);
+ }
+
+ //! determinant
+ template <class Matrix>
+ Element det(const Matrix &A) const
+ {
+ return BlasMatrixDomainDet<Field, Matrix>()(field(),A);
+ }
+
+ //! in-place Determinant (the matrix is modified)
+ template <class Matrix>
+ Element detin(Matrix &A) const
+ {
+
+ return BlasMatrixDomainDet<Field, Matrix>()(field(),A);
+ }
+ //@}
+
+ /*!
+ * @name Solvers for Matrix (respecting BlasMatrix interface)
+ * with Operand as right or left hand side
+ */
+ //@{
+ //! linear solve with matrix right hand side.
+ //! AX=B
+ template <class Operand, class Matrix>
+ Operand& left_solve (Operand& X, const Matrix& A, const Operand& B) const
+ {
+ return BlasMatrixDomainLeftSolve<Field,Operand,Matrix>()(field(),X,A,B);
+ }
+
+ //! linear solve with matrix right hand side, the result is stored in-place in B.
+ //! @pre A must be square
+ //! AX=B , (B<-X)
+ template <class Operand,class Matrix>
+ Operand& left_solve (const Matrix& A, Operand& B) const
+ {
+ return BlasMatrixDomainLeftSolve<Field,Operand,Matrix>()(field(),A,B);
+ }
+
+ //! linear solve with matrix right hand side.
+ //! XA=B
+ template <class Operand1, class Matrix, class Operand2>
+ Operand1& right_solve (Operand1& X, const Matrix& A, const Operand2& B) const
+ {
+ return BlasMatrixDomainRightSolve<Field,Operand1,Matrix,Operand2>()(field(),X,A,B);
+ }
+
+ //! linear solve with matrix right hand side, the result is stored in-place in B.
+ //! @pre A must be square
+ //! XA=B , (B<-X)
+ template <class Operand, class Matrix>
+ Operand& right_solve (const Matrix& A, Operand& B) const
+ {
+ return BlasMatrixDomainRightSolve<Field,Operand,Matrix>()(field(),A,B);
+ }
+
+ //! minimal polynomial computation.
+ template <class Polynomial, class Matrix>
+ Polynomial& minpoly( Polynomial& P, const Matrix& A ) const
+ {
+ return BlasMatrixDomainMinpoly<Field, Polynomial, Matrix>()(field(),P,A);
+ }
+
+ //! characteristic polynomial computation.
+ template <class Polynomial, class Matrix >
+ Polynomial& charpoly( Polynomial& P, const Matrix& A ) const
+ {
+
+ typedef typename Polynomial::Rep PolyRep ;
+ commentator().start ("Givaro::Modular Dense Charpoly ", "MDCharpoly");
+ std::list<PolyRep> P_list;
+ P_list.clear();
+ BlasMatrixDomainCharpoly<Field, std::list<PolyRep>, Matrix >()(field(),P_list,A);
+
+
+ PolyRep tmp(A.rowdim()+1);
+ PolyRep Pt ;
+ typename std::list<PolyRep>::iterator it = P_list.begin();
+ Pt = *(it++);
+ while( it!=P_list.end() ){
+ // Waiting for an implementation of a domain of polynomials
+ mulpoly( tmp, Pt, *it);
+ Pt = tmp;
+ // delete &(*it);
+ ++it;
+ }
+ commentator().stop ("done", NULL, "MDCharpoly");
+
+ P=Pt;
+
+ return P;
+ }
+
+ //! characteristic polynomial computation.
+ template <class Polynomial, class Matrix >
+ std::list<Polynomial>& charpoly( std::list<Polynomial>& P, const Matrix& A ) const
+ {
+ return BlasMatrixDomainCharpoly<Field, std::list<Polynomial>, Matrix >()(field(),P,A);
+ }
+
+ //private:
+ //! @todo Temporary: waiting for an implementation of a domain of polynomial
+ template<class Polynomial>
+ Polynomial &
+ mulpoly(Polynomial &res, const Polynomial & P1, const Polynomial & P2) const
+ {
+ size_t i,j;
+ res.resize(P1.size()+P2.size()-1);
+ for (i=0;i<res.size();i++)
+ field().assign(res[i],field().zero);
+ for ( i=0;i<P1.size();i++)
+ for ( j=0;j<P2.size();j++)
+ field().axpyin(res[i+j],P1[i],P2[j]);
+ return res;
+
+ }
+ //@}
+
+ template<class Matrix1, class Matrix2>
+ bool areEqual(const Matrix1 & A, const Matrix2 & B) const
+ {
+ if ( (A.rowdim() != B.rowdim()) || (A.coldim() != B.coldim()) )
+ return false ;
+ Element a, b; field().init(a); field().init(b);
+ for (size_t i = 0 ; i < A.rowdim() ; ++i)
+ for (size_t j = 0 ; j < A.coldim() ; ++j)
+ if (!field().areEqual(A.getEntry(a,i,j),B.getEntry(b,i,j))) //!@bug use refs
+ return false ;
+ return true ;
+ }
+
+ template<class Matrix>
+ void setIdentity(Matrix & I) const
+ {
+ for (size_t i = 0 ; i< I.rowdim() ; ++i)
+ for (size_t j = 0 ; j < I.coldim() ; ++j) {
+ if (i == j)
+ I.setEntry(i,j,field().one);
+ else
+ I.setEntry(i,j,field().zero);
+ }
+
+ }
+
+ //!@bug use fflas-ffpack
+ template<class Matrix>
+ void setZero(Matrix & I) const
+ {
+ // use Iterator
+ for (size_t i = 0 ; i< I.rowdim() ; ++i)
+ for (size_t j = 0 ; j < I.coldim() ; ++j) {
+ I.setEntry(i,j,field().zero);
+ }
+ }
+
+ template<class Matrix1>
+ bool isZero(const Matrix1 & A) const
+ {
+ for (size_t i = 0 ; i < A.rowdim() ; ++i)
+ for (size_t j = 0 ; j < A.coldim() ; ++j)
+ if (!field().isZero(A.getEntry(i,j))) //!@bug use refs
+ return false ;
+ return true ;
+ }
+
+ template<class Matrix1>
+ bool isIdentity(const Matrix1 & A) const
+ {
+ if (A.rowdim() != A.coldim())
+ return false ;
+ for (size_t i = 0 ; i < A.rowdim() ; ++i)
+ if (!field().isOne(A.getEntry(i,i)))
+ return false;
+
+ for (size_t i = 0 ; i < A.rowdim() ; ++i)
+ for (size_t j = 0 ; j < i ; ++j)
+ if (!field().isZero(A.getEntry(i,j))) //!@bug use refs
+ return false ;
+ for (size_t i = 0 ; i < A.rowdim() ; ++i)
+ for (size_t j = i+1 ; j < A.coldim() ; ++j)
+ if (!field().isZero(A.getEntry(i,j))) //!@bug use refs
+ return false ;
+ return true ;
+ }
+
+ template<class Matrix1>
+ bool isIdentityGeneralized(const Matrix1 & A) const
+ {
+ size_t mn = std::min(A.rowdim(),A.coldim());
+ for (size_t i = 0 ; i < mn ; ++i)
+ if (!field().isOne(A.getEntry(i,i)))
+ return false;
+
+ for (size_t i = 0 ; i < A.rowdim() ; ++i)
+ for (size_t j = 0 ; j < std::min(i,mn) ; ++j)
+ if (!field().isZero(A.getEntry(i,j))) //!@bug use refs
+ return false ;
+ for (size_t i = 0 ; i < A.rowdim() ; ++i)
+ for (size_t j = i+1 ; j < A.coldim() ; ++j)
+ if (!field().isZero(A.getEntry(i,j))) //!@bug use refs
+ return false ;
+ return true ;
+ }
+
+ // if there is some comparison on the elements, max abs of elements.
+ // whenever a max exists
+ template<class myBlasMatrix>
+ Element& Magnitude(Element&r, const myBlasMatrix &A) const
+ {
+ r = 0;
+ for (size_t i = 0 ; i < A.rowdim(); ++i)
+ for (size_t j = 0 ; j < A.coldim(); ++j) {
+ Element z = A.getEntry(i,j);
+ if (z < 0) z = -z ;
+ if (r < z )
+ r = z;
+ }
+ return r;
+ }
+
+#if 0
+ template<class myBlasMatrix>
+ Integer & Magnitude(Integer &r, const myBlasMatrix1 &A)
+ {
+ r = 0;
+ Integer z;
+ for (size_t i = 0 ; i < A.rowdim(); ++i)
+ for (size_t j = 0 ; j < A.coldim(); ++j) {
+ z = Integer::abs((Integer)A.refEntry(i,j));
+ if (r > z)
+ r = z;
+ }
+ return r;
+ }
+
+ // all entries in A are smaller than a long
+ template<class myBlasMatrix>
+ size_t & Magnitude(size_t &r, const myBlasMatrix1 &A)
+ {
+ r = 0;
+ for (size_t i = 0 ; i < A.rowdim(); ++i)
+ for (size_t j = 0 ; j < A.coldim(); ++j) {
+ if (r > (size_t)std::abs(A.refEntry(i,j)))
+ r = z;
+ }
+ return r;
+ }
+
+ template<class myBlasMatrix>
+ double & Magnitude(double &r, const myBlasMatrix1 &A)
+ {
+ r = 0;
+ for (size_t i = 0 ; i < A.rowdim(); ++i)
+ for (size_t j = 0 ; j < A.coldim(); ++j) {
+ if (r > (double)std::abs(A.refEntry(i,j)))
+ r = z;
+ }
+ return r;
+ }
+#endif
+
+ public:
+
+ /** Print matrix.
+ * @param os Output stream to which matrix is written.
+ * @param A Matrix.
+ * @returns reference to os.
+ */
+ template <class Matrix>
+ inline std::ostream &write (std::ostream &os, const Matrix &A) const
+ {
+ return A.write (os);
+ }
+
+ template <class Matrix>
+ inline std::ostream &write (std::ostream &os, const Matrix &A, bool maple_format) const
+ {
+ return A.write (os, field(), maple_format);
+ }
+
+ /** Read matrix
+ * @param is Input stream from which matrix is read.
+ * @param A Matrix.
+ * @returns reference to is.
+ */
+ template <class Matrix>
+ inline std::istream &read (std::istream &is, Matrix &A) const
+ {
+ return A.read (is, field());
+ }
+
+ }; /* end of class BlasMatrixDomain */
+
+} /* end of namespace LinBox */
+
+#include "linbox/matrix/matrixdomain/blas-matrix-domain.inl"
+
+#endif /* __LINBOX_blas_matrix_domain_H */
+
+
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
+
diff --git a/linbox/matrix/matrixdomain/blas-matrix-domain.inl b/linbox/matrix/matrixdomain/blas-matrix-domain.inl
new file mode 100644
index 0000000..2890745
--- /dev/null
+++ b/linbox/matrix/matrixdomain/blas-matrix-domain.inl
@@ -0,0 +1,2101 @@
+/* linbox/matrix/blas-matrix-domain.inl
+ * Copyright (C) 2004 Pascal Giorgi, Clément Pernet
+ *
+ * Written by :
+ * Pascal Giorgi pascal.giorgi at ens-lyon.fr
+ * Clément Pernet clement.pernet at imag.fr
+ * Brice Boyer (briceboyer) <boyer.brice at gmail.com>
+ *
+ * originally linbox/algorithms/blas-domain.inl
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ * ========LICENCE========
+ */
+
+
+
+#ifndef __LINBOX_matrix_matrixdomain_blas_matrix_domain_INL
+#define __LINBOX_matrix_matrixdomain_blas_matrix_domain_INL
+
+namespace LinBox { namespace Protected {
+
+ /*
+ * **********************************************
+ * *** Specialization for BlasSubmatrix<Matrix> ***
+ * the BlasMatrixDomain have template Matrix parameters
+ * and the specialized one are only for views.
+ * **********************************************
+ */
+ // Inversion
+ // dpritcha: now returns nullity. (2004-07-19)
+ // previously returned Ainv but this is passed back anyway.
+ template <class Matrix>
+ class BlasMatrixDomainInv<typename Matrix::Field, BlasSubmatrix<Matrix> > {
+ public:
+
+ int operator() (const typename Matrix::Field &F,
+ BlasSubmatrix<Matrix> &Ainv,
+ BlasSubmatrix<Matrix> &A) const
+ {
+
+ linbox_check( A.rowdim() == A.coldim());
+ linbox_check( A.rowdim() == Ainv.rowdim());
+ linbox_check( A.coldim() == Ainv.coldim());
+ int nullity;
+ FFPACK::Invert2 (F, A.rowdim(), A.getPointer(), A.getStride(),
+ Ainv.getPointer(), Ainv.getStride(),nullity);
+ return nullity;
+ }
+
+ };
+
+ // determinant
+ template <class Matrix>
+ class BlasMatrixDomainDet<typename Matrix::Field, BlasSubmatrix<Matrix> > {
+ public:
+
+ inline typename Matrix::Element operator() (const typename Matrix::Field &F,
+ BlasSubmatrix<Matrix> &A) const
+ {
+
+ return FFPACK::Det(F, A.rowdim(), A.coldim(), A.getPointer(), A.getStride());
+ }
+ };
+
+
+ // rank
+ template <class Matrix>
+ class BlasMatrixDomainRank<typename Matrix::Field, BlasSubmatrix<Matrix> > {
+ public:
+ inline unsigned int operator() (const typename Matrix::Field &F,
+ BlasSubmatrix<Matrix> &A) const
+ {
+ return (unsigned int) FFPACK::Rank(F,
+ A.rowdim(), A.coldim(), A.getPointer(), A.getStride());
+ }
+ };
+
+} // Protected
+} // LinBox
+
+namespace LinBox
+{ /* Det */
+
+ // Det
+ template< class Field, class Matrix>
+ typename Field::Element
+ BlasMatrixDomainDet<Field, Matrix>::operator() (const Field &F, const Matrix& A) const
+ {
+ typedef typename Matrix::constSubMatrixType constSubMatrixType ;
+ typedef typename Matrix::matrixType matrixType ;
+ matrixType A_c(A); // do copy
+ constSubMatrixType A_v(A_c);
+ return Protected::BlasMatrixDomainDet<Field, constSubMatrixType>()(F, A_v);
+ }
+
+ template< class Field, class Matrix>
+ typename Field::Element
+ BlasMatrixDomainDet<Field, Matrix>::operator() (const Field &F, Matrix& A) const
+ {
+ typedef typename Matrix::subMatrixType subMatrixType ;
+ subMatrixType A_v(A);
+ return Protected::BlasMatrixDomainDet<Field, subMatrixType>()(F, A_v);
+ }
+
+ template< class Field, class _Rep>
+ // template<class _Rep>
+ class BlasMatrixDomainDet<Field, TriangularBlasMatrix<Field,_Rep> > {
+ typename Field::Element operator() (const Field &F, const TriangularBlasMatrix<Field,_Rep> & A) const
+ {
+ typename Field::Element d ;
+ F.init(d);
+ // is A unit ? return 1
+ // while not 0, mulin
+ return d;
+ }
+ };
+
+} // LinBox
+
+namespace LinBox
+{ /* Rank */
+
+ // what about transpose ?
+
+ // Rank
+ template<class Field, class Matrix>
+ inline unsigned int
+ BlasMatrixDomainRank<Field, Matrix>::operator() (const Field &F,
+ const Matrix &A) const
+ {
+ typedef typename Matrix::constSubMatrixType constSubMatrixType ;
+ typedef typename Matrix::matrixType matrixType ;
+ matrixType A_c(A); // do copy
+ constSubMatrixType A_v(A_c);
+
+ return Protected::BlasMatrixDomainRank<Field, constSubMatrixType>()(F, A_v);
+ }
+
+ template<class Field, class Matrix>
+ inline unsigned int
+ BlasMatrixDomainRank<Field, Matrix>::operator() (const Field &F,
+ Matrix &A) const
+ {
+ typedef typename Matrix::subMatrixType subMatrixType ;
+ subMatrixType A_v(A);
+
+ return Protected::BlasMatrixDomainRank<Field, subMatrixType>()(F, A_v);
+ }
+
+} // LinBox
+
+namespace LinBox
+{ /* Inverse */
+ // Inverse
+ template<class Field, class Matrix1, class Matrix2>
+ int BlasMatrixDomainInv<Field, Matrix1, Matrix2>::operator() (const Field &F, Matrix1 &Ainv, const Matrix2 &A) const
+ {
+ typedef typename Matrix1::subMatrixType subMatrixType ;
+ // typedef typename Matrix1::constSubMatrixType constSubMatrixType ;
+ typedef typename Matrix1::matrixType matrixType ;
+ subMatrixType Ai_v(Ainv);
+ //! @todo check equal submatrix types
+ matrixType A_c(A); // do copy
+ subMatrixType A_v(A_c);
+ return Protected::BlasMatrixDomainInv<Field, subMatrixType>()(F, Ai_v, A_v);
+ }
+
+ template<class Field, class Matrix1, class Matrix2>
+ int BlasMatrixDomainInv<Field, Matrix1, Matrix2>::operator() (const Field &F, Matrix1 &Ainv, Matrix2 &A) const
+ {
+ typedef typename Matrix1::subMatrixType subMatrixType ;
+ subMatrixType Ai_v(Ainv);
+ subMatrixType A_v(A);
+ return Protected::BlasMatrixDomainInv<Field, subMatrixType>()(F, Ai_v, A_v);
+ }
+} // LinBox
+
+namespace LinBox
+{ /* Add Sub */
+
+ // Add
+ template<class Field, class Matrix1, class Matrix2, class Matrix3>
+ Matrix1&
+ BlasMatrixDomainAdd<Field, Matrix1, Matrix2, Matrix3 >::operator()(const Field& F,
+ Matrix1& C,
+ const Matrix2& A,
+ const Matrix3& B) const
+ {
+ linbox_check( A.rowdim() == B.rowdim());
+ linbox_check( C.rowdim() == A.rowdim());
+ linbox_check( A.coldim() == B.coldim());
+ linbox_check( C.coldim() == A.coldim());
+ typedef typename Matrix1::subMatrixType subMatrixType ;
+ typedef typename Matrix1::constSubMatrixType constSubMatrixType ;
+ constSubMatrixType A_v(A);
+ constSubMatrixType B_v(B);
+ subMatrixType C_v(C);
+
+ FFLAS::fadd (F, C_v.rowdim(), C_v.coldim(),
+ A_v.getPointer(), A_v.getStride(),
+ B_v.getPointer(), B_v.getStride(),
+ C_v.getPointer(), C_v.getStride());
+ return C;
+ }
+
+ // AddIn
+ template<class Field, class Matrix1, class Matrix3>
+ Matrix1&
+ BlasMatrixDomainAddin<Field, Matrix1, Matrix3 >::operator()(const Field& F,
+ Matrix1& C,
+ const Matrix3& B) const
+ {
+ linbox_check( C.rowdim() == B.rowdim());
+ linbox_check( C.coldim() == B.coldim());
+ typedef typename Matrix1::subMatrixType subMatrixType ;
+ typedef typename Matrix1::constSubMatrixType constSubMatrixType ;
+ constSubMatrixType B_v(B);
+ subMatrixType C_v(C);
+
+ FFLAS::faddin (F, C_v.rowdim(), C_v.coldim(),
+ B_v.getPointer(), B_v.getStride(),
+ C_v.getPointer(), C_v.getStride());
+ return C;
+ }
+
+
+ // Sub
+ template<class Field, class Matrix1, class Matrix2, class Matrix3>
+ Matrix1&
+ BlasMatrixDomainSub<Field, Matrix1, Matrix2, Matrix3 >::operator()(const Field& F,
+ Matrix1& C,
+ const Matrix2& A,
+ const Matrix3& B) const
+ {
+ linbox_check( A.rowdim() == B.rowdim());
+ linbox_check( C.rowdim() == A.rowdim());
+ linbox_check( A.coldim() == B.coldim());
+ linbox_check( C.coldim() == A.coldim());
+ typedef typename Matrix1::subMatrixType subMatrixType ;
+ typedef typename Matrix1::constSubMatrixType constSubMatrixType ;
+ constSubMatrixType A_v(A);
+ constSubMatrixType B_v(B);
+ subMatrixType C_v(C);
+
+ FFLAS::fsub (F, C_v.rowdim(), C_v.coldim(),
+ A_v.getPointer(), A_v.getStride(),
+ B_v.getPointer(), B_v.getStride(),
+ C_v.getPointer(), C_v.getStride());
+ return C;
+ }
+
+ // SubIn
+ template<class Field, class Matrix1, class Matrix3>
+ Matrix1&
+ BlasMatrixDomainSubin<Field, Matrix1, Matrix3 >::operator()(const Field& F,
+ Matrix1& C,
+ const Matrix3& B) const
+ {
+ linbox_check( C.rowdim() == B.rowdim());
+ linbox_check( C.coldim() == B.coldim());
+ typedef typename Matrix1::subMatrixType subMatrixType ;
+ typedef typename Matrix1::constSubMatrixType constSubMatrixType ;
+ constSubMatrixType B_v(B);
+ subMatrixType C_v(C);
+
+ FFLAS::fsubin (F, C_v.rowdim(), C_v.coldim(),
+ B_v.getPointer(), B_v.getStride(),
+ C_v.getPointer(), C_v.getStride());
+ return C;
+ }
+
+} // LinBox
+
+namespace LinBox
+{ /* Copy */
+ //Copy
+ template<class Field, class Matrix1, class Matrix2>
+ Matrix1&
+ BlasMatrixDomainCopy<Field, Matrix1, Matrix2 >::operator()(const Field& F,
+ Matrix1& B,
+ const Matrix2& A) const
+ {
+ linbox_check( A.rowdim() == B.rowdim());
+ linbox_check( A.coldim() == B.coldim());
+ typedef typename Matrix1::subMatrixType subMatrixType ;
+ typedef typename Matrix1::constSubMatrixType constSubMatrixType ;
+ constSubMatrixType A_v(A);
+ subMatrixType B_v(B);
+
+ for (size_t i=0; i<A.rowdim(); i++)
+ FFLAS::fassign (F, A_v.coldim(),
+ A_v.getPointer() + i*A_v.getStride(), 1,
+ B_v.getPointer() + i*B_v.getStride(), 1);
+ return B;
+ }
+} // LinBox
+
+namespace LinBox
+{ /* MulAdd */
+
+ // general matrix-matrix multiplication and addition with scaling
+ // D= b11eta.C + alpha.A*B
+#if 0
+ template<class Field>
+ class BlasMatrixDomainMulAdd<BlasMatrix<Field, _Rep>, BlasMatrix<Field, _Rep>, BlasMatrix<Field, _Rep> > {
+ public:
+ BlasMatrix<Field, _Rep>&
+ operator()(//const Field & F,
+ BlasMatrix<Field, _Rep> & D,
+ const typename Field::Element & beta,
+ const BlasMatrix<Field, _Rep>& C,
+ const typename Field::Element & alpha,
+ const BlasMatrix<Field, _Rep>& A,
+ const BlasMatrix<Field, _Rep>& B) const
+ {
+ linbox_check( A.coldim() == B.rowdim());
+ linbox_check( C.rowdim() == A.rowdim());
+ linbox_check( C.coldim() == B.coldim());
+ linbox_check( D.rowdim() == C.rowdim());
+ linbox_check( D.coldim() == C.coldim());
+
+ D=C;
+
+ FFLAS::fgemm( C.field(), FFLAS::FflasNoTrans, FFLAS::FflasNoTrans,
+ C.rowdim(), C.coldim(), A.coldim(),
+ alpha,
+ A.getPointer(), A.getStride(),
+ B.getPointer(), B.getStride(),
+` beta,
+ D.getPointer(), D.getStride());
+ return D;
+ }
+
+
+ BlasMatrix<Field, _Rep>&
+ operator() (//const Field & F,
+ const typename Field::Element & beta,
+ BlasMatrix<Field, _Rep> & C,
+ const typename Field::Element & alpha,
+ const BlasMatrix<Field, _Rep>& A,
+ const BlasMatrix<Field, _Rep>& B) const
+ {
+ linbox_check( A.coldim() == B.rowdim());
+ linbox_check( C.rowdim() == A.rowdim());
+ linbox_check( C.coldim() == B.coldim());
+
+ FFLAS::fgemm( C.field(), FFLAS::FflasNoTrans, FFLAS::FflasNoTrans,
+ C.rowdim(), C.coldim(), A.coldim(),
+ alpha,
+ A.getPointer(), A.getStride(),
+ B.getPointer(), B.getStride(),
+ beta,
+ C.getPointer(), C.getStride());
+ return C;
+ }
+ };
+#endif
+
+
+#if 1
+ template<class Matrix1, class Matrix2, class Matrix3>
+ class BlasMatrixDomainMulAdd {
+ public:
+ typedef typename Matrix1::Field Field;
+
+ template<class _Rep>
+ Matrix1&
+ operator()( Matrix1 & D,
+ const typename Field::Element & beta,
+ const BlasMatrix<Field, _Rep> & C,
+ const typename Field::Element & alpha,
+ const Matrix1 & A,
+ const Matrix2 & B) const
+ {
+ linbox_check( A.coldim() == B.rowdim());
+ linbox_check( C.rowdim() == A.rowdim());
+ linbox_check( C.coldim() == B.coldim());
+ linbox_check( D.rowdim() == C.rowdim());
+ linbox_check( D.coldim() == C.coldim());
+ typedef typename Matrix1::subMatrixType subMatrixType ;
+ typedef typename Matrix1::constSubMatrixType constSubMatrixType ;
+
+ D.copy(C);
+
+ constSubMatrixType A_v(A);
+ constSubMatrixType B_v(B);
+ constSubMatrixType C_v(C);
+ subMatrixType D_v(D);
+
+ FFLAS::fgemm( C.field(), FFLAS::FflasNoTrans, FFLAS::FflasNoTrans,
+ C_v.rowdim(), C_v.coldim(), A_v.coldim(),
+ alpha,
+ A_v.getPointer(), A_v.getStride(),
+ B_v.getPointer(), B_v.getStride(),
+ beta,
+ D_v.getWritePointer(), D_v.getStride());
+ return D;
+ }
+
+ Matrix1&
+ operator() ( const typename Field::Element & beta,
+ Matrix1 & C,
+ const typename Field::Element & alpha,
+ const Matrix2 & A,
+ const Matrix3 & B) const
+ {
+ linbox_check( A.coldim() == B.rowdim());
+ linbox_check( C.rowdim() == A.rowdim());
+ linbox_check( C.coldim() == B.coldim());
+ typedef typename Matrix1::subMatrixType subMatrixType ;
+ typedef typename Matrix1::constSubMatrixType constSubMatrixType ;
+ constSubMatrixType A_v(A);
+ constSubMatrixType B_v(B);
+ subMatrixType C_v(C);
+
+ FFLAS::fgemm( C.field(), FFLAS::FflasNoTrans, FFLAS::FflasNoTrans,
+ C_v.rowdim(), C_v.coldim(), A_v.coldim(),
+ alpha,
+ A_v.getPointer(), A_v.getStride(),
+ B_v.getPointer(), B_v.getStride(),
+ beta,
+ C_v.getWritePointer(), C_v.getStride());
+ return C;
+ }
+ };
+
+#endif
+
+ // One specialization with BlasSubmatrix (needed by BlockMasseyDomain
+ // other specialisation need to be done ...
+ template<class Matrix, class _Rep>
+ class BlasMatrixDomainMulAdd<BlasSubmatrix<Matrix>, BlasSubmatrix<Matrix>, BlasMatrix<typename Matrix::Field, _Rep> > {
+ public:
+ typedef typename Matrix::Field Field;
+ BlasSubmatrix<Matrix>&
+ operator()( BlasSubmatrix<Matrix> & D,
+ const typename Field::Element & beta,
+ const BlasSubmatrix<Matrix> & C,
+ const typename Field::Element & alpha,
+ const BlasSubmatrix<Matrix> & A,
+ const BlasMatrix<Field, _Rep> & B) const
+ {
+ linbox_check( A.coldim() == B.rowdim());
+ linbox_check( C.rowdim() == A.rowdim());
+ linbox_check( C.coldim() == B.coldim());
+ linbox_check( D.rowdim() == C.rowdim());
+ linbox_check( D.coldim() == C.coldim());
+
+ D.copy(C);
+
+ FFLAS::fgemm( C.field(), FFLAS::FflasNoTrans, FFLAS::FflasNoTrans,
+ C.rowdim(), C.coldim(), A.coldim(),
+ alpha,
+ A.getPointer(), A.getStride(),
+ B.getPointer(), B.getStride(),
+ beta,
+ D.getPointer(), D.getStride());
+ return D;
+ }
+
+
+ BlasSubmatrix<Matrix>&
+ operator() ( const typename Field::Element & beta,
+ BlasSubmatrix<Matrix> & C,
+ const typename Field::Element & alpha,
+ const BlasSubmatrix<Matrix> & A,
+ const BlasMatrix<Field, _Rep> & B) const
+ {
+ linbox_check( A.coldim() == B.rowdim());
+ linbox_check( C.rowdim() == A.rowdim());
+ linbox_check( C.coldim() == B.coldim());
+
+ FFLAS::fgemm( C.field(), FFLAS::FflasNoTrans, FFLAS::FflasNoTrans,
+ C.rowdim(), C.coldim(), A.coldim(),
+ alpha,
+ A.getPointer(), A.getStride(),
+ B.getPointer(), B.getStride(),
+ beta,
+ C.getPointer(), C.getStride());
+ return C;
+ }
+ };
+
+ template<class Matrix>
+ class BlasMatrixDomainMulAdd<BlasSubmatrix<Matrix>, BlasSubmatrix<Matrix>, BlasSubmatrix<Matrix> > {
+ public:
+ typedef typename Matrix::Field Field;
+ BlasSubmatrix<Matrix>&
+ operator()( BlasSubmatrix<Matrix> & D,
+ const typename Field::Element & beta,
+ const BlasSubmatrix<Matrix> & C,
+ const typename Field::Element & alpha,
+ const BlasSubmatrix<Matrix> & A,
+ const BlasSubmatrix<Matrix> & B) const
+ {
+ linbox_check( A.coldim() == B.rowdim());
+ linbox_check( C.rowdim() == A.rowdim());
+ linbox_check( C.coldim() == B.coldim());
+ linbox_check( D.rowdim() == C.rowdim());
+ linbox_check( D.coldim() == C.coldim());
+
+ D.copy(C);
+
+ FFLAS::fgemm( C.field(), FFLAS::FflasNoTrans, FFLAS::FflasNoTrans,
+ C.rowdim(), C.coldim(), A.coldim(),
+ alpha,
+ A.getPointer(), A.getStride(),
+ B.getPointer(), B.getStride(),
+ beta,
+ D.getPointer(), D.getStride());
+ return D;
+ }
+
+
+ BlasSubmatrix<Matrix>&
+ operator() ( const typename Field::Element & beta,
+ BlasSubmatrix<Matrix> & C,
+ const typename Field::Element & alpha,
+ const BlasSubmatrix<Matrix> & A,
+ const BlasSubmatrix<Matrix> & B) const
+ {
+ linbox_check( A.coldim() == B.rowdim());
+ linbox_check( C.rowdim() == A.rowdim());
+ linbox_check( C.coldim() == B.coldim());
+
+ FFLAS::fgemm( C.field(), FFLAS::FflasNoTrans, FFLAS::FflasNoTrans,
+ C.rowdim(), C.coldim(), A.coldim(),
+ alpha,
+ A.getPointer(), A.getStride(),
+ B.getPointer(), B.getStride(),
+ beta,
+ C.getWritePointer(), C.getStride());
+ return C;
+ }
+ };
+
+
+ template<class Field, class _Rep>
+ class BlasMatrixDomainMulAdd< BlasMatrix<Field, _Rep>, TransposedBlasMatrix<BlasMatrix<Field, _Rep> >, BlasMatrix<Field, _Rep> > {
+ public:
+ BlasMatrix<Field, _Rep>&
+ operator()( BlasMatrix<Field, _Rep> & D,
+ const typename Field::Element & beta,
+ const BlasMatrix<Field, _Rep> & C,
+ const typename Field::Element & alpha,
+ const TransposedBlasMatrix<BlasMatrix<Field, _Rep> > & A,
+ const BlasMatrix<Field, _Rep> & B) const
+ {
+ linbox_check( A.getMatrix().rowdim() == B.rowdim());
+ linbox_check( C.rowdim() == A.getMatrix().coldim());
+ linbox_check( C.coldim() == B.coldim());
+ linbox_check( D.rowdim() == C.rowdim());
+ linbox_check( D.coldim() == C.coldim());
+
+ D=C;
+
+ FFLAS::fgemm( B.field(), FFLAS::FflasTrans, FFLAS::FflasNoTrans,
+ C.rowdim(), C.coldim(), B.rowdim(),
+ alpha,
+ A.getMatrix().getPointer(), A.getMatrix().getStride(),
+ B.getPointer(), B.getStride(),
+ beta,
+ D.getPointer(), D.getStride());
+
+ return D;
+ }
+
+
+ BlasMatrix<Field, _Rep>&
+ operator() ( const typename Field::Element & beta,
+ BlasMatrix<Field, _Rep> & C,
+ const typename Field::Element & alpha,
+ const TransposedBlasMatrix<BlasMatrix<Field, _Rep> > & A,
+ const BlasMatrix<Field, _Rep> & B) const
+ {
+ linbox_check( A.getMatrix().rowdim() == B.rowdim());
+ linbox_check( C.rowdim() == A.getMatrix().coldim());
+ linbox_check( C.coldim() == B.coldim());
+
+ FFLAS::fgemm( B.field(), FFLAS::FflasTrans, FFLAS::FflasNoTrans,
+ C.rowdim(), C.coldim(), B.rowdim(),
+ alpha,
+ A.getMatrix().getPointer(), A.getMatrix().getStride(),
+ B.getPointer(), B.getStride(),
+ beta,
+ C.getPointer(), C.getStride());
+ return C;
+ }
+ };
+
+ template<class Field, class _Rep>
+ class BlasMatrixDomainMulAdd< BlasMatrix<Field, _Rep>, TransposedBlasMatrix<BlasMatrix<Field, _Rep> >, TransposedBlasMatrix<BlasMatrix<Field, _Rep> > > {
+ public:
+ BlasMatrix<Field, _Rep>&
+ operator()( BlasMatrix<Field, _Rep> & D,
+ const typename Field::Element & beta,
+ const BlasMatrix<Field, _Rep> & C,
+ const typename Field::Element & alpha,
+ const TransposedBlasMatrix<BlasMatrix<Field, _Rep> > & A,
+ const TransposedBlasMatrix<BlasMatrix<Field, _Rep> > & B) const
+ {
+ linbox_check( A.getMatrix().rowdim() == B.getMatrix().coldim());
+ linbox_check( C.rowdim() == A.getMatrix().coldim());
+ linbox_check( C.coldim() == B.getMatrix().rowdim());
+ linbox_check( D.rowdim() == C.rowdim());
+ linbox_check( D.coldim() == C.coldim());
+
+ D=C;
+
+ FFLAS::fgemm( C.field(), FFLAS::FflasTrans, FFLAS::FflasTrans,
+ C.rowdim(), C.coldim(), A.getMatrix().rowdim(),
+ alpha,
+ A.getMatrix().getPointer(), A.getMatrix().getStride(),
+ B.getMatrix().getPointer(), B.getMatrix().getStride(),
+ beta,
+ D.getPointer(), D.getStride());
+ return D;
+ }
+
+
+ BlasMatrix<Field, _Rep>&
+ operator() ( const typename Field::Element & beta,
+ BlasMatrix<Field, _Rep> & C,
+ const typename Field::Element & alpha,
+ const TransposedBlasMatrix<BlasMatrix<Field, _Rep> > & A,
+ const TransposedBlasMatrix<BlasMatrix<Field, _Rep> > & B) const
+ {
+ linbox_check( A.getMatrix().rowdim() == B.getMatrix().coldim());
+ linbox_check( C.rowdim() == A.getMatrix().coldim());
+ linbox_check( C.coldim() == B.getMatrix().rowdim());
+
+ FFLAS::fgemm( C.field(), FFLAS::FflasTrans, FFLAS::FflasTrans,
+ C.rowdim(), C.coldim(), A.getMatrix().rowdim(),
+ alpha,
+ A.getMatrix().getPointer(), A.getMatrix().getStride(),
+ B.getMatrix().getPointer(), B.getMatrix().getStride(),
+ beta,
+ C.getPointer(), C.getStride());
+ return C;
+ }
+ };
+
+ template<class Field, class _Rep>
+ class BlasMatrixDomainMulAdd< BlasMatrix<Field, _Rep>, BlasMatrix<Field, _Rep>, TransposedBlasMatrix<BlasMatrix<Field, _Rep> > > {
+ public:
+ BlasMatrix<Field, _Rep>&
+ operator()( BlasMatrix<Field, _Rep> & D,
+ const typename Field::Element & beta,
+ const BlasMatrix<Field, _Rep> & C,
+ const typename Field::Element & alpha,
+ const BlasMatrix<Field, _Rep> & A,
+ const TransposedBlasMatrix<BlasMatrix<Field, _Rep> > & B) const
+ {
+ linbox_check( A.coldim() == B.getMatrix().coldim());
+ linbox_check( C.rowdim() == A.rowdim());
+ linbox_check( C.coldim() == B.getMatrix().rowdim());
+ linbox_check( D.rowdim() == C.rowdim());
+ linbox_check( D.coldim() == C.coldim());
+
+ D=C;
+ FFLAS::fgemm( C.field(), FFLAS::FflasNoTrans, FFLAS::FflasTrans,
+ C.rowdim(), C.coldim(), A.coldim(),
+ alpha,
+ A.getPointer(), A.getStride(),
+ B.getMatrix().getPointer(), B.getMatrix().getStride(),
+ beta,
+ D.getPointer(), D.getStride());
+ return D;
+ }
+
+
+ BlasMatrix<Field, _Rep>&
+ operator() ( const typename Field::Element & beta,
+ BlasMatrix<Field, _Rep> & C,
+ const typename Field::Element & alpha,
+ const BlasMatrix<Field, _Rep> & A,
+ const TransposedBlasMatrix<BlasMatrix<Field, _Rep> > & B) const
+ {
+ linbox_check( A.coldim() == B.getMatrix().coldim());
+ linbox_check( C.rowdim() == A.rowdim());
+ linbox_check( C.coldim() == B.getMatrix().rowdim());
+
+ FFLAS::fgemm( C.field(), FFLAS::FflasNoTrans, FFLAS::FflasTrans,
+ C.rowdim(), C.coldim(), A.coldim(),
+ alpha,
+ A.getPointer(), A.getStride(),
+ B.getMatrix().getPointer(), B.getMatrix().getStride(),
+ beta,
+ C.getPointer(), C.getStride());
+ return C;
+ }
+ };
+
+#if 1
+ /*
+ * specialization for Operand1 and Operand3 of type std::vector<Element>
+ * and Operand2 of type BlasMatrix<Field, _Rep>
+ */
+
+ // general matrix-vector multiplication and addition with scaling
+ // d = beta.c + alpha.A*b
+ template<class Field, class _Rep>
+ class BlasMatrixDomainMulAdd<std::vector<typename Field::Element>, BlasMatrix<Field, _Rep>, std::vector<typename Field::Element> > {
+ public:
+ std::vector<typename Field::Element>&
+ operator() ( std::vector<typename Field::Element> & d,
+ const typename Field::Element & beta,
+ const std::vector<typename Field::Element> & c,
+ const typename Field::Element & alpha,
+ const BlasMatrix<Field, _Rep> & A,
+ const std::vector<typename Field::Element> & b) const
+ {
+ linbox_check( A.coldim() == b.size());
+ linbox_check( c.size() == b.size());
+ linbox_check( d.size() == c.size());
+ d=c;
+
+ FFLAS::fgemv( A.field(), FFLAS::FflasNoTrans,
+ A.rowdim(), A.coldim(),
+ alpha,
+ A.getPointer(), A.getStride(),
+ &b[0],1,
+ beta,
+ &d[0],1);
+ return d;
+ }
+
+
+ std::vector<typename Field::Element>&
+ operator() ( const typename Field::Element & beta,
+ std::vector<typename Field::Element> & c,
+ const typename Field::Element & alpha,
+ const BlasMatrix<Field, _Rep> & A,
+ const std::vector<typename Field::Element> & b) const
+ {
+ linbox_check( A.coldim() == b.size());
+ linbox_check( A.rowdim() == c.size()); //fixed: dpritcha
+
+ FFLAS::fgemv( A.field(), FFLAS::FflasNoTrans,
+ A.rowdim(), A.coldim(),
+ alpha,
+ A.getPointer(), A.getStride(),
+ &b[0],1,
+ beta,
+ &c[0],1);
+ return c;
+ }
+ };
+
+
+ // general matrix-vector multiplication and addition with scaling
+ // d = beta.c + alpha.A*b
+ //! what about subvector/submatrices ?
+ template<class Field, class _Rep>
+ class BlasMatrixDomainMulAdd<BlasVector<Field>, BlasMatrix<Field, _Rep>, BlasVector<Field> > {
+ public:
+ BlasVector<Field>&
+ operator() ( BlasVector<Field> & d,
+ const typename Field::Element & beta,
+ const BlasVector<Field> & c,
+ const typename Field::Element & alpha,
+ const BlasMatrix<Field, _Rep> & A,
+ const BlasVector<Field> & b) const
+ {
+ linbox_check( A.coldim() == b.size());
+ linbox_check( c.size() == b.size());
+ linbox_check( d.size() == c.size());
+ d=c;
+
+ FFLAS::fgemv( A.field(), FFLAS::FflasNoTrans,
+ A.rowdim(), A.coldim(),
+ alpha,
+ A.getPointer(), A.getStride(),
+ b.getPointer(),b.getStride(),
+ beta,
+ d.getWritePointer(),d.getStride());
+ return d;
+ }
+
+
+ BlasVector<Field>&
+ operator() ( const typename Field::Element & beta,
+ BlasVector<Field> & c,
+ const typename Field::Element & alpha,
+ const BlasMatrix<Field, _Rep> & A,
+ const BlasVector<Field> & b) const
+ {
+ linbox_check( A.coldim() == b.size());
+ linbox_check( A.rowdim() == c.size()); //fixed: dpritcha
+
+ FFLAS::fgemv( A.field(), FFLAS::FflasNoTrans,
+ A.rowdim(), A.coldim(),
+ alpha,
+ A.getPointer(), A.getStride(),
+ b.getPointer(),b.getStride(),
+ beta,
+ c.getWritePointer(),c.getStride());
+ return c;
+ }
+ };
+
+ // general vector-matrix multiplication and addition with scaling
+ // d = beta.c + alpha.a*B -- note order of coldim, rowdim passed to fgemv is switched
+ template<class Field, class _Rep>
+ class BlasMatrixDomainMulAdd<std::vector<typename Field::Element>,std::vector<typename Field::Element>, BlasMatrix<Field, _Rep> > {
+ public:
+ std::vector<typename Field::Element>&
+ operator() ( std::vector<typename Field::Element> & d,
+ const typename Field::Element & beta,
+ const std::vector<typename Field::Element> & c,
+ const typename Field::Element & alpha,
+ const std::vector<typename Field::Element> & a,
+ const BlasMatrix<Field, _Rep> & B) const
+ {
+ linbox_check( B.rowdim() == a.size());
+ linbox_check( B.coldim() == c.size());
+ linbox_check( d.size() == c.size());
+ d=c;
+
+ FFLAS::fgemv( B.field(), FFLAS::FflasTrans,
+ B.rowdim(), B.coldim(),
+ alpha,
+ B.getPointer(), B.getStride(),
+ &a[0],1,
+ beta,
+ &d[0],1);
+ return d;
+ }
+
+
+ std::vector<typename Field::Element>&
+ operator() ( const typename Field::Element & beta,
+ std::vector<typename Field::Element> & c,
+ const typename Field::Element & alpha,
+ const std::vector<typename Field::Element> & a,
+ const BlasMatrix<Field, _Rep> & B) const
+ {
+ linbox_check( B.rowdim() == a.size());
+ linbox_check( B.coldim() == c.size());
+
+ FFLAS::fgemv( B.field(), FFLAS::FflasTrans,
+ B.rowdim(), B.coldim(),
+ alpha,
+ B.getPointer(), B.getStride(),
+ &a[0],1,
+ beta,
+
+ &c[0],1);
+ return c;
+ }
+ };
+
+ template<class Field, class _Rep>
+ class BlasMatrixDomainMulAdd<BlasVector<Field>, BlasVector<Field>, BlasMatrix<Field, _Rep> > {
+ public:
+ BlasVector<Field>&
+ operator() ( BlasVector<Field> & d,
+ const typename Field::Element & beta,
+ const BlasVector<Field> & c,
+ const typename Field::Element & alpha,
+ const BlasVector<Field> & a,
+ const BlasMatrix<Field, _Rep> & B) const
+ {
+ linbox_check( B.rowdim() == a.size());
+ linbox_check( B.coldim() == c.size());
+ linbox_check( d.size() == c.size());
+ d=c;
+
+ FFLAS::fgemv( B.field(), FFLAS::FflasTrans,
+ B.rowdim(), B.coldim(),
+ alpha,
+ B.getPointer(), B.getStride(),
+ a.getPonter(),a.getStride(),
+ beta,
+ a.getWritePointer(),a.getStride());
+ return d;
+ }
+
+
+ BlasVector<Field>&
+ operator() ( const typename Field::Element & beta,
+ BlasVector<Field> & c,
+ const typename Field::Element & alpha,
+ const BlasVector<Field> & a,
+ const BlasMatrix<Field, _Rep> & B) const
+ {
+ linbox_check( B.rowdim() == a.size());
+ linbox_check( B.coldim() == c.size());
+
+ FFLAS::fgemv( B.field(), FFLAS::FflasTrans,
+ B.rowdim(), B.coldim(),
+ alpha,
+ B.getPointer(), B.getStride(),
+ a.getPointer(),a.getStride(),
+ beta,
+ c.getWritePointer(),c.getStride());
+ return c;
+ }
+ };
+
+#endif
+
+
+ /*
+ * Specialization for Operand1, Operand2 of type BlasMatrix<Field, _Rep>
+ * and Operand3 of type BlasPermutation
+ */
+
+ // Matrix permutation product C = A*B
+ template<class Field, class _Rep>
+ class BlasMatrixDomainMul<Field, BlasMatrix<Field, _Rep>, BlasMatrix<Field, _Rep>, BlasPermutation<size_t> > {
+ public:
+ BlasMatrix<Field, _Rep>& operator()(const Field& F,
+ BlasMatrix<Field, _Rep>& C,
+ const BlasMatrix<Field, _Rep>& A,
+ const BlasPermutation<size_t>& B) const
+ {
+ C = A;
+ return BlasMatrixDomainMulin<Field, BlasMatrix<Field, _Rep>, BlasPermutation<size_t> >()( F, C, B);
+ }
+ };
+
+ template<class Field, class _Rep>
+ class BlasMatrixDomainMul<Field, BlasMatrix<Field, _Rep>, BlasPermutation<size_t>, BlasMatrix<Field, _Rep> > {
+ public:
+ BlasMatrix<Field, _Rep>& operator()(const Field& F,
+ BlasMatrix<Field, _Rep>& C,
+ const BlasPermutation<size_t>& B,
+ const BlasMatrix<Field, _Rep>& A) const
+ {
+ C = A;
+ return BlasMatrixDomainMulin<Field, BlasMatrix<Field,_Rep>, BlasPermutation<size_t> >()( F, B, C);
+ }
+ };
+
+ /*
+ * specialization for Operand1, Operand2 of type BlasMatrix<Field, _Rep> and Operand3 of type TransposedBlasMatrix<BlasPermutation<size_t> >
+ */
+
+ // Matrix permutation product C = A*B
+ template<class Field, class _Rep>
+ class BlasMatrixDomainMul<Field, BlasMatrix<Field,_Rep>, BlasMatrix<Field,_Rep>, TransposedBlasMatrix<BlasPermutation<size_t> > > {
+ public:
+ BlasMatrix<Field, _Rep>& operator()(const Field& F,
+ BlasMatrix<Field, _Rep>& C,
+ const BlasMatrix<Field, _Rep>& A,
+ const TransposedBlasMatrix<BlasPermutation<size_t> >& B) const
+ {
+ C = A;
+ return BlasMatrixDomainMulin<Field, BlasMatrix<Field,_Rep>, TransposedBlasMatrix<BlasPermutation<size_t> > >()( F, C, B);
+ }
+ };
+
+ template<class Field, class _Rep>
+ class BlasMatrixDomainMul<Field, BlasMatrix<Field,_Rep>, TransposedBlasMatrix<BlasPermutation<size_t> >, BlasMatrix<Field,_Rep> > {
+ public:
+ BlasMatrix<Field, _Rep>& operator()(const Field& F,
+ BlasMatrix<Field, _Rep>& C,
+ const TransposedBlasMatrix<BlasPermutation<size_t> >& B,
+ const BlasMatrix<Field, _Rep>& A) const
+ {
+ C = A;
+ return BlasMatrixDomainMulin<Field, BlasMatrix<Field,_Rep>, TransposedBlasMatrix<BlasPermutation<size_t> > >()( F, B, C);
+ }
+ };
+
+ /*
+ * specialization for Operand1 of type BlasMatrix<Field, _Rep> and Operand2 of type BlasPermutation
+ */
+
+} // LinBox
+
+namespace LinBox
+{ /* Mulin */
+ // In-place matrix permutation product
+ template<class Field, class _Rep>
+ class BlasMatrixDomainMulin<Field, BlasMatrix<Field,_Rep>, BlasPermutation<size_t> > {
+ public:
+ BlasMatrix<Field, _Rep>& operator()( const Field& F,
+ BlasMatrix<Field, _Rep>& A,
+ const BlasPermutation<size_t>& B) const
+ {
+ if (B.isIdentity()) return A ;
+ linbox_check( A.coldim() >= B.getSize() );
+ FFPACK::applyP( F, FFLAS::FflasRight, FFLAS::FflasNoTrans,
+ A.rowdim(), 0,(int) B.getOrder(),
+ A.getPointer(), A.getStride(), B.getPointer() );
+ return A;
+ }
+
+ BlasMatrix<Field, _Rep>& operator()( const Field& F,
+ const BlasPermutation<size_t>& B,
+ BlasMatrix<Field, _Rep>& A) const
+ {
+ if (B.isIdentity()) return A ;
+ linbox_check( A.rowdim() >= B.getSize() );
+ FFPACK::applyP( F, FFLAS::FflasLeft, FFLAS::FflasNoTrans,
+ A.coldim(), 0,(int) B.getOrder(), A.getPointer(), A.getStride(), B.getPointer() );
+ return A;
+ }
+
+ };
+
+ template<class Field, class _Rep>
+ class BlasMatrixDomainMulin<Field, BlasMatrix<Field,_Rep>, TransposedBlasMatrix<BlasPermutation<size_t> > > {
+ public:
+ BlasMatrix<Field, _Rep>& operator()( const Field& F,
+ BlasMatrix<Field, _Rep>& A,
+ const TransposedBlasMatrix<BlasPermutation<size_t> >& B) const
+ {
+ if (B.getMatrix().isIdentity()) return A ;
+ linbox_check( A.coldim() >= B.getMatrix().getSize() );
+ FFPACK::applyP( F, FFLAS::FflasRight, FFLAS::FflasTrans,
+ A.rowdim(), 0,(int) B.getMatrix().getOrder(),
+ A.getPointer(), A.getStride(), B.getMatrix().getPointer() );
+ return A;
+ }
+ BlasMatrix<Field, _Rep>& operator()( const Field& F,
+ const TransposedBlasMatrix<BlasPermutation<size_t> >& B,
+ BlasMatrix<Field, _Rep>& A) const
+ {
+ if (B.getMatrix().isIdentity()) return A ;
+ linbox_check( A.rowdim() >= B.getMatrix().getSize() );
+ FFPACK::applyP( F, FFLAS::FflasLeft, FFLAS::FflasTrans,
+ A.coldim(), 0,(int) B.getMatrix().getOrder(), A.getPointer(), A.getStride(), B.getMatrix().getPointer() );
+ return A;
+ }
+ };
+
+
+
+#if 1
+ /*
+ * specialization for Operand1, Operand2 of type std::vector<Element> and Operand3 of type BlasPermutation
+ */
+
+ // Matrix permutation product C = A*B
+ template<class Field>
+ class BlasMatrixDomainMul<Field,std::vector<typename Field::Element>,std::vector<typename Field::Element>, BlasPermutation<size_t> > {
+ public:
+ std::vector<typename Field::Element>& operator()(const Field& F,
+ std::vector<typename Field::Element>& C,
+ const std::vector<typename Field::Element>& A,
+ const BlasPermutation<size_t>& B) const
+ {
+ C = A;
+ return BlasMatrixDomainMulin<Field,std::vector<typename Field::Element>, BlasPermutation<size_t> >()( F, C, B);
+ }
+ };
+
+ template<class Field>
+ class BlasMatrixDomainMul<Field,std::vector<typename Field::Element>, BlasPermutation<size_t>,std::vector<typename Field::Element> > {
+ public:
+ std::vector<typename Field::Element>& operator()(const Field& F,
+ std::vector<typename Field::Element>& C,
+ const BlasPermutation<size_t>& B,
+ const std::vector<typename Field::Element>& A) const
+ {
+ C = A;
+ return BlasMatrixDomainMulin<Field,std::vector<typename Field::Element>, BlasPermutation<size_t> >()( F, B, C);
+ }
+ };
+
+
+ template<class Field>
+ class BlasMatrixDomainMul<Field, BlasVector<Field >, BlasVector<Field >, BlasPermutation<size_t> > {
+ public:
+ BlasVector<Field >& operator()(const Field& F,
+ BlasVector<Field >& C,
+ const BlasVector<Field >& A,
+ const BlasPermutation<size_t>& B) const
+ {
+ C = A;
+ return BlasMatrixDomainMulin<Field, BlasVector<Field >, BlasPermutation<size_t> >()( F, C, B);
+ }
+ };
+
+ template<class Field>
+ class BlasMatrixDomainMul<Field, BlasVector<Field >, BlasPermutation<size_t>, BlasVector<Field > > {
+ public:
+ BlasVector<Field >& operator()(const Field& F,
+ BlasVector<Field >& C,
+ const BlasPermutation<size_t>& B,
+ const BlasVector<Field >& A) const
+ {
+ C = A;
+ return BlasMatrixDomainMulin<Field, BlasVector<Field >, BlasPermutation<size_t> >()( F, B, C);
+ }
+ };
+
+
+ /*
+ * specialization for Operand1, Operand2 of type std::vector<Element> and Operand3 of type TransposedBlasMatrix<BlasPermutation<size_t> >
+ */
+
+ // Matrix permutation product C = A*B
+ template<class Field>
+ class BlasMatrixDomainMul<Field,std::vector<typename Field::Element>,std::vector<typename Field::Element>, TransposedBlasMatrix<BlasPermutation<size_t> > > {
+ public:
+ std::vector<typename Field::Element>& operator()(const Field& F,
+ std::vector<typename Field::Element>& C,
+ const std::vector<typename Field::Element>& A,
+ const TransposedBlasMatrix<BlasPermutation<size_t> >& B) const
+ {
+ C = A;
+ return BlasMatrixDomainMulin<Field,std::vector<typename Field::Element>, TransposedBlasMatrix<BlasPermutation<size_t> > >()( F, C, B);
+ }
+ };
+
+ template<class Field>
+ class BlasMatrixDomainMul<Field,std::vector<typename Field::Element>, TransposedBlasMatrix<BlasPermutation<size_t> >,std::vector<typename Field::Element> > {
+ public:
+ std::vector<typename Field::Element>& operator()(const Field& F,
+ std::vector<typename Field::Element>& C,
+ const TransposedBlasMatrix<BlasPermutation<size_t> >& B,
+ const std::vector<typename Field::Element>& A) const
+ {
+ C = A;
+ return BlasMatrixDomainMulin<Field,std::vector<typename Field::Element>, TransposedBlasMatrix<BlasPermutation<size_t> > >()( F, B, C);
+ }
+ };
+
+ template<class Field>
+ class BlasMatrixDomainMul<Field, BlasVector<Field>, BlasVector<Field>, TransposedBlasMatrix<BlasPermutation<size_t> > > {
+ public:
+ BlasVector<Field>& operator()(const Field& F,
+ BlasVector<Field>& C,
+ const BlasVector<Field>& A,
+ const TransposedBlasMatrix<BlasPermutation<size_t> >& B) const
+ {
+ C = A;
+ return BlasMatrixDomainMulin<Field, BlasVector<Field>, TransposedBlasMatrix<BlasPermutation<size_t> > >()( F, C, B);
+ }
+ };
+
+ template<class Field>
+ class BlasMatrixDomainMul<Field, BlasVector<Field>, TransposedBlasMatrix<BlasPermutation<size_t> >, BlasVector<Field> > {
+ public:
+ BlasVector<Field>& operator()(const Field& F,
+ BlasVector<Field>& C,
+ const TransposedBlasMatrix<BlasPermutation<size_t> >& B,
+ const BlasVector<Field>& A) const
+ {
+ C = A;
+ return BlasMatrixDomainMulin<Field, BlasVector<Field>, TransposedBlasMatrix<BlasPermutation<size_t> > >()( F, B, C);
+ }
+ };
+
+ /*
+ * specialization for Operand1 of type std::vector<Element> and Operand2 of type BlasPermutation
+ */
+
+ // In-place matrix permutation product
+ template<class Field>
+ class BlasMatrixDomainMulin<Field,std::vector<typename Field::Element>, BlasPermutation<size_t> > {
+ public:
+ std::vector<typename Field::Element>& operator()( const Field& F,
+ std::vector<typename Field::Element>& A,
+ const BlasPermutation<size_t>& B) const
+ {
+ if (B.isIdentity()) return A ;
+ //linbox_check( A.size() == B.getSize() );
+ linbox_check( A.size() == B.getOrder() );
+ FFPACK::applyP( F, FFLAS::FflasRight, FFLAS::FflasNoTrans,
+ 1, 0,(int) B.getOrder(), &A[0], 1, B.getPointer() );
+ return A;
+ }
+
+ std::vector<typename Field::Element>& operator()( const Field& F,
+ const BlasPermutation<size_t>& B,
+ std::vector<typename Field::Element>& A) const
+ {
+ if (B.isIdentity()) return A ;
+ //linbox_check( A.size() >= B.getSize() );
+ linbox_check( A.size() == B.getOrder() );
+ FFPACK::applyP( F, FFLAS::FflasLeft, FFLAS::FflasNoTrans,
+ 1, 0,(int) B.getOrder(), &A[0], 1, B.getPointer() );
+ return A;
+ }
+
+ };
+
+ template<class Field>
+ class BlasMatrixDomainMulin<Field, BlasVector<Field>, BlasPermutation<size_t> > {
+ public:
+ BlasVector< Field >& operator()( const Field& F,
+ BlasVector< Field>& A,
+ const BlasPermutation<size_t>& B) const
+ {
+ if (B.isIdentity()) return A ;
+ linbox_check( A.size() == B.getSize() );
+ FFPACK::applyP( F, FFLAS::FflasRight, FFLAS::FflasNoTrans,
+ 1, 0,(int) B.getOrder(), A.getPointer(), 1, B.getPointer() );
+ return A;
+ }
+
+ BlasVector< Field >& operator()( const Field& F,
+ const BlasPermutation<size_t>& B,
+ BlasVector< Field>& A) const
+ {
+ if (B.isIdentity()) return A ;
+ linbox_check( A.size() >= B.getSize() );
+ FFPACK::applyP( F, FFLAS::FflasLeft, FFLAS::FflasNoTrans,
+ 1, 0,(int) B.getOrder(), A.getPointer(), 1, B.getPointer() );
+ return A;
+ }
+
+ };
+
+ template<class Field>
+ class BlasMatrixDomainMulin<Field,std::vector<typename Field::Element>, TransposedBlasMatrix<BlasPermutation<size_t> > > {
+ public:
+ std::vector<typename Field::Element>& operator()( const Field& F,
+ std::vector<typename Field::Element>& A,
+ const TransposedBlasMatrix<BlasPermutation<size_t> >& B) const
+ {
+ if (B.getMatrix().isIdentity()) return A ;
+ linbox_check( A.size() >= B.getMatrix().getSize() );
+ FFPACK::applyP( F, FFLAS::FflasRight, FFLAS::FflasTrans,
+ 1, 0,(int) B.getMatrix().getOrder(),
+ &A[0], 1, B.getMatrix().getPointer() );
+ return A;
+ }
+ std::vector<typename Field::Element>& operator()( const Field& F,
+ const TransposedBlasMatrix<BlasPermutation<size_t> >& B,
+ std::vector<typename Field::Element>& A) const
+ {
+ if (B.getMatrix().isIdentity()) return A ;
+ linbox_check( A.size() >= B.getMatrix().getSize() );
+ FFPACK::applyP( F, FFLAS::FflasLeft, FFLAS::FflasTrans,
+ 1, 0,(int) B.getMatrix().getOrder(), &A[0], 1, B.getMatrix().getPointer() );
+ return A;
+ }
+ };
+
+ template<class Field>
+ class BlasMatrixDomainMulin<Field, BlasVector<Field>, TransposedBlasMatrix<BlasPermutation<size_t> > > {
+ public:
+ BlasVector<Field>& operator()( const Field& F,
+ BlasVector<Field>& A,
+ const TransposedBlasMatrix<BlasPermutation<size_t> >& B) const
+ {
+ if (B.getMatrix().isIdentity()) return A ;
+ linbox_check( A.size() >= B.getMatrix().getSize() );
+ FFPACK::applyP( F, FFLAS::FflasRight, FFLAS::FflasTrans,
+ 1, 0,(int) B.getMatrix().getOrder(),
+ &A[0], 1, B.getMatrix().getPointer() );
+ return A;
+ }
+ BlasVector<Field>& operator()( const Field& F,
+ const TransposedBlasMatrix<BlasPermutation<size_t> >& B,
+ BlasVector<Field>& A) const
+ {
+ if (B.getMatrix().isIdentity()) return A ;
+ linbox_check( A.size() >= B.getMatrix().getSize() );
+ FFPACK::applyP( F, FFLAS::FflasLeft, FFLAS::FflasTrans,
+ 1, 0,(int) B.getMatrix().getOrder(), &A[0], 1, B.getMatrix().getPointer() );
+ return A;
+ }
+ };
+
+#endif
+
+ /*
+ * specialization for Operand1 of type BlasMatrix<Field, _Rep> and Operand2
+ * of type TriangularBlasMatrix<Field,_Rep>
+ */
+
+ // Matrix/Triangular product C = A*B
+ template<class Field, class _Rep>
+ class BlasMatrixDomainMul<Field, BlasMatrix<Field,_Rep>, BlasMatrix<Field,_Rep>, TriangularBlasMatrix<Field,_Rep> > {
+ public:
+ BlasMatrix<Field, _Rep>& operator()(const Field& F,
+ BlasMatrix<Field, _Rep>& C,
+ const BlasMatrix<Field, _Rep>& A,
+ const TriangularBlasMatrix<Field,_Rep>& B) const
+ {
+ C = A;
+ return BlasMatrixDomainMulin<Field, BlasMatrix<Field,_Rep>, TriangularBlasMatrix<Field,_Rep> >()( F, C, B);
+ }
+ };
+
+ template<class Field, class _Rep>
+ class BlasMatrixDomainMul<Field, BlasMatrix<Field,_Rep>, TriangularBlasMatrix<Field,_Rep>, BlasMatrix<Field,_Rep> > {
+ public:
+ BlasMatrix<Field, _Rep>& operator()(const Field& F,
+ BlasMatrix<Field, _Rep>& C,
+ const TriangularBlasMatrix<Field,_Rep>& B,
+ const BlasMatrix<Field, _Rep>& A) const
+ {
+ C = A;
+ return BlasMatrixDomainMulin<Field, BlasMatrix<Field,_Rep>, TriangularBlasMatrix<Field,_Rep> >()( F, B, C);
+ }
+ };
+
+ /*
+ * specialization for Operand1 of type BlasMatrix<Field, _Rep> and Operand2 of type TriangularBlasMatrix<Field,_Rep>
+ */
+
+ // In-place matrix*triangular matrix product
+ template<class Field, class _Rep>
+ class BlasMatrixDomainMulin<Field, BlasMatrix<Field,_Rep>,
+ TriangularBlasMatrix<Field,_Rep> >{
+ public:
+ BlasMatrix<Field, _Rep>& operator()( const Field& F,
+ BlasMatrix<Field, _Rep>& A,
+ const TriangularBlasMatrix<Field,_Rep>& B) const
+ {
+ linbox_check( A.coldim() == B.rowdim() );
+
+ FFLAS::ftrmm( F, FFLAS::FflasRight, (FFLAS::FFLAS_UPLO) (B.getUpLo()),
+ FFLAS::FflasNoTrans,(FFLAS::FFLAS_DIAG) (B.getDiag()),
+ A.rowdim(), A.coldim(), F.one,
+ B.getPointer(), B.getStride(), A.getPointer(), A.getStride() );
+ return A;
+ }
+
+ BlasMatrix<Field, _Rep>& operator()( const Field& F,
+ const TriangularBlasMatrix<Field,_Rep>& B,
+ BlasMatrix<Field, _Rep>& A) const
+ {
+ linbox_check( B.coldim() == A.rowdim() );
+ FFLAS::ftrmm( F, FFLAS::FflasLeft, (FFLAS::FFLAS_UPLO)(B.getUpLo()),
+ FFLAS::FflasNoTrans, (FFLAS::FFLAS_DIAG) (B.getDiag()),
+ A.rowdim(), A.coldim(), F.one,
+ B.getPointer(), B.getStride(),
+ A.getPointer(), A.getStride() );
+ return A;
+ }
+ };
+
+
+ /*! @internal In-place matrix*triangular matrix product with transpose.
+ */
+ template<class Field, class _Rep>
+ class BlasMatrixDomainMulin<Field, BlasMatrix<Field,_Rep>,
+ TransposedBlasMatrix<TriangularBlasMatrix<Field,_Rep> > >{
+ public:
+ BlasMatrix<Field, _Rep>& operator()( const Field& F,
+ BlasMatrix<Field, _Rep>& A,
+ const TransposedBlasMatrix< TriangularBlasMatrix<Field,_Rep> >& B) const
+ {
+ linbox_check( B.getMatrix().coldim() == A.coldim() );
+
+ FFLAS::ftrmm( F, FFLAS::FflasRight,
+ (FFLAS::FFLAS_UPLO)(B.getMatrix().getUpLo()),
+ FFLAS::FflasTrans,
+ (FFLAS::FFLAS_DIAG) (B.getMatrix().getDiag()),
+ A.rowdim(), A.coldim(),
+ F.one,
+ B.getMatrix().getPointer(), B.getMatrix().getStride(),
+ A.getPointer(), A.getStride() );
+ return A;
+ }
+
+ BlasMatrix<Field, _Rep>& operator()( const Field& F,
+ const TransposedBlasMatrix< TriangularBlasMatrix<Field,_Rep> >& B,
+ BlasMatrix<Field, _Rep>& A) const
+ {
+ linbox_check( B.getMatrix().coldim() == A.rowdim() );
+ FFLAS::ftrmm( F, FFLAS::FflasLeft,
+ (FFLAS::FFLAS_UPLO) (B.getMatrix().getUpLo()),
+ FFLAS::FflasTrans,
+ (FFLAS::FFLAS_DIAG) (B.getMatrix().getDiag()),
+ A.rowdim(), A.coldim(), F.one,
+ B.getMatrix().getPointer(), B.getMatrix().getStride(),
+ A.getPointer(), A.getStride() );
+ return A;
+ }
+ };
+
+
+
+ /*
+ * specialization for Operand1 of type TriangularBlasMatrix<Field,_Rep> and Operand2 of type BlasPermutation
+ */
+
+ // Matrix permutation product C = A*B
+ template<class Field, class _Rep>
+ class BlasMatrixDomainMul<Field, BlasMatrix<Field,_Rep>, TriangularBlasMatrix<Field,_Rep>, BlasPermutation<size_t> > {
+ public:
+ BlasMatrix<Field, _Rep>& operator()(const Field& F,
+ BlasMatrix<Field, _Rep>& C,
+ const TriangularBlasMatrix<Field,_Rep>& A,
+ const BlasPermutation<size_t>& B) const
+ {
+ C = A;
+ return BlasMatrixDomainMulin<Field, BlasMatrix<Field,_Rep>, BlasPermutation<size_t> >()( F, C, B);
+ }
+ };
+
+ template<class Field, class _Rep>
+ class BlasMatrixDomainMul<Field, BlasMatrix<Field,_Rep>, BlasPermutation<size_t>, TriangularBlasMatrix<Field,_Rep> > {
+ public:
+ BlasMatrix<Field, _Rep>& operator()(const Field& F,
+ BlasMatrix<Field, _Rep>& C,
+ const BlasPermutation<size_t>& B,
+ const TriangularBlasMatrix<Field,_Rep>& A) const
+ {
+ C = A;
+ return BlasMatrixDomainMulin<Field, BlasMatrix<Field,_Rep>, BlasPermutation<size_t> >()( F, B, C);
+ }
+ };
+
+} // LinBox
+
+namespace LinBox
+{ /* Solve */
+
+ /*
+ * Specialization for Operand of type BlasMatrix<Field, _Rep>
+ */
+
+ template <class Field, class Operand1, class Matrix, class Operand2>
+ Operand1&
+ BlasMatrixDomainLeftSolve<Field, Operand1, Matrix, Operand2 >::operator() (const Field& F,
+ Operand1& X,
+ const Matrix& A,
+ const Operand2& B) const
+ {
+ LQUPMatrix<Field> LQUP(A);
+ LQUP.left_solve(X, B);
+ return X;
+ }
+
+ template <class Field, class Operand1, class Matrix, class Operand2>
+ Operand1&
+ BlasMatrixDomainLeftSolve<Field, Operand1, Matrix, Operand2 >::operator() (const Field& F,
+ const Matrix& A,
+ Operand1& B) const
+ {
+ LQUPMatrix<Field> LQUP(A);
+ LQUP.left_solve(B);
+ return B;
+ }
+
+ template <class Field, class Operand1, class Matrix, class Operand2>
+ Operand1&
+ BlasMatrixDomainRightSolve<Field, Operand1, Matrix, Operand2 >::operator() (const Field& F,
+ Operand1& X,
+ const Matrix& A,
+ const Operand2& B) const
+ {
+ // typename Matrix::subMatrixType subMatrixType ;
+ LQUPMatrix<Field> LQUP(A);
+ LQUP.right_solve(X, B);
+ return X;
+ }
+
+ template <class Field, class Operand1, class Matrix, class Operand2>
+ Operand1&
+ BlasMatrixDomainRightSolve<Field, Operand1, Matrix, Operand2 >::operator() (const Field& F,
+ const Matrix& A,
+ Operand1& B) const
+ {
+ LQUPMatrix<Field> LQUP(A);
+ LQUP.right_solve(B);
+ return B;
+ }
+
+
+ template <class Matrix>
+ class BlasMatrixDomainRightSolve<typename Matrix::Field, BlasSubmatrix<Matrix>, BlasSubmatrix<Matrix> > {
+ public:
+ typedef typename Matrix::Field Field;
+ BlasSubmatrix<Matrix>& operator() (const Field& F,
+ BlasSubmatrix<Matrix>& X,
+ const BlasSubmatrix<Matrix>& A,
+ const BlasSubmatrix<Matrix>& B) const
+ {
+ LQUPMatrix<Field> LQUP(A);
+ LQUP.right_solve(X, B);
+ return X;
+ }
+
+
+ BlasSubmatrix<Matrix>& operator() (const Field& F,
+ const BlasSubmatrix<Matrix>& A,
+ BlasSubmatrix<Matrix>& B) const
+ {
+ LQUPMatrix<Field> LQUP(A);
+ LQUP.right_solve(B);
+ return B;
+ }
+
+ };
+
+#if 1
+ /*
+ * Specialization for Operand of type std::vector<Element>
+ */
+
+ template <class Field, class _Rep>
+ class BlasMatrixDomainLeftSolve<Field, std::vector<typename Field::Element>, BlasMatrix<Field, _Rep> > {
+ public:
+ std::vector<typename Field::Element>& operator() (const Field& F,
+ std::vector<typename Field::Element>& X,
+ const BlasMatrix<Field, _Rep>& A,
+ const std::vector<typename Field::Element>& B) const
+ {
+ LQUPMatrix<Field> LQUP(A);
+ LQUP.left_solve(X, B);
+ return X;
+ }
+
+ std::vector<typename Field::Element>& operator()(const Field& F,
+ const BlasMatrix<Field, _Rep>& A,
+ std::vector<typename Field::Element>& B) const
+ {
+ LQUPMatrix<Field> LQUP(A);
+ LQUP.left_solve(B);
+ return B;
+ }
+
+ };
+
+ template <class Field, class _Rep>
+ class BlasMatrixDomainRightSolve<Field, std::vector<typename Field::Element>, BlasMatrix<Field, _Rep> > {
+ public:
+ std::vector<typename Field::Element>& operator() (const Field& F,
+ std::vector<typename Field::Element>& X,
+ const BlasMatrix<Field, _Rep>& A,
+ const std::vector<typename Field::Element>& B) const
+ {
+ LQUPMatrix<Field> LQUP(A);
+ LQUP.right_solve(X, B);
+ return X;
+ }
+
+ std::vector<typename Field::Element>& operator() (const Field& F,
+ const BlasMatrix<Field, _Rep>& A,
+ std::vector<typename Field::Element>& B) const
+ {
+ LQUPMatrix<Field> LQUP(A);
+ LQUP.right_solve(B);
+ return B;
+ }
+
+ };
+
+ template <class Field, class _Rep>
+ class BlasMatrixDomainLeftSolve<Field, BlasVector<Field>, BlasMatrix<Field, _Rep> > {
+ public:
+ BlasVector<Field>& operator() (const Field& F,
+ BlasVector<Field>& X,
+ const BlasMatrix<Field, _Rep>& A,
+ const BlasVector<Field>& B) const
+ {
+ LQUPMatrix<Field> LQUP(A);
+ LQUP.left_solve(X, B);
+ return X;
+ }
+
+ BlasVector<Field>& operator()(const Field& F,
+ const BlasMatrix<Field, _Rep>& A,
+ BlasVector<Field>& B) const
+ {
+ LQUPMatrix<Field> LQUP(A);
+ LQUP.left_solve(B);
+ return B;
+ }
+
+ };
+
+ template <class Field, class _Rep>
+ class BlasMatrixDomainRightSolve<Field, BlasVector<Field>, BlasMatrix<Field, _Rep> > {
+ public:
+ BlasVector<Field>& operator() (const Field& F,
+ BlasVector<Field>& X,
+ const BlasMatrix<Field, _Rep>& A,
+ const BlasVector<Field>& B) const
+ {
+ LQUPMatrix<Field> LQUP(A);
+ LQUP.right_solve(X, B);
+ return X;
+ }
+
+ BlasVector<Field>& operator() (const Field& F,
+ const BlasMatrix<Field, _Rep>& A,
+ BlasVector<Field>& B) const
+ {
+ LQUPMatrix<Field> LQUP(A);
+ LQUP.right_solve(B);
+ return B;
+ }
+
+ };
+
+#endif
+
+
+ /*
+ * ********************************************************
+ * *** Specialization for TriangularBlasMatrix<Field,_Rep> ***
+ * ********************************************************
+ */
+
+
+ /*
+ * specialization for Operand of type BlasMatrix<Field, _Rep>
+ */
+
+ template <class Field, class _Rep>
+ class BlasMatrixDomainLeftSolve<Field, BlasMatrix<Field, _Rep>, TriangularBlasMatrix<Field,_Rep> > {
+ public:
+ BlasMatrix<Field, _Rep>& operator() (const Field& F,
+ BlasMatrix<Field, _Rep>& X,
+ const TriangularBlasMatrix<Field,_Rep>& A,
+ const BlasMatrix<Field, _Rep>& B) const
+ {
+
+ linbox_check( X.rowdim() == B.rowdim());
+ linbox_check( X.coldim() == B.coldim());
+
+ //! @bug use copy
+ typename BlasMatrix<Field, _Rep>::ConstIterator Biter = B.Begin();
+ typename BlasMatrix<Field, _Rep>::Iterator Xiter = X.Begin();
+
+ for (; Biter != B.End(); ++Biter,++Xiter)
+ F.assign(*Xiter,*Biter);
+
+ return (*this)(F, A, X);
+
+ }
+
+ BlasMatrix<Field, _Rep>& operator() (const Field& F,
+ const TriangularBlasMatrix<Field,_Rep>& A,
+ BlasMatrix<Field, _Rep>& B) const
+ {
+ linbox_check( A.rowdim() == A.coldim());
+ linbox_check( A.coldim() == B.rowdim());
+
+ FFLAS::ftrsm( F,
+ FFLAS::FflasLeft, (FFLAS::FFLAS_UPLO) A.getUpLo(),
+ FFLAS::FflasNoTrans,(FFLAS::FFLAS_DIAG) A.getDiag(),
+ A.rowdim(), B.coldim(),
+ F.one, A.getPointer(), A.getStride(),
+ B.getPointer(), B.getStride());
+
+ return B;
+ }
+ };
+
+ template <class Field, class _Rep>
+ class BlasMatrixDomainRightSolve<Field, BlasMatrix<Field,_Rep>, TriangularBlasMatrix<Field,_Rep> > {
+ public:
+ BlasMatrix<Field, _Rep>& operator() (const Field& F,
+ BlasMatrix<Field, _Rep>& X,
+ const TriangularBlasMatrix<Field,_Rep>& A,
+ const BlasMatrix<Field, _Rep>& B) const
+ {
+
+ linbox_check( X.rowdim() == B.rowdim());
+ linbox_check( X.coldim() == B.coldim());
+
+ typename BlasMatrix<Field, _Rep>::ConstIterator Biter = B.Begin();
+ typename BlasMatrix<Field, _Rep>::Iterator Xiter = X.Begin();
+
+ for (; Biter != B.End(); ++Biter,++Xiter)
+ F.assign(*Xiter,*Biter);
+
+ return (*this)(F, A, X);
+ }
+
+ BlasMatrix<Field, _Rep>& operator() (const Field& F,
+ const TriangularBlasMatrix<Field,_Rep>& A,
+ BlasMatrix<Field, _Rep>& B) const
+ {
+
+ linbox_check( A.rowdim() == A.coldim());
+ linbox_check( B.coldim() == A.rowdim());
+
+ FFLAS::ftrsm( F,
+ FFLAS::FflasRight,(FFLAS::FFLAS_UPLO) A.getUpLo(),
+ FFLAS::FflasNoTrans,(FFLAS::FFLAS_DIAG) A.getDiag() ,
+ B.rowdim(), A.coldim(),
+ F.one, A.getPointer(), A.getStride(),
+ B.getPointer(), B.getStride());
+
+
+ return B;
+ }
+ };
+
+ template <class Matrix, class _Rep>
+ class BlasMatrixDomainRightSolve<typename Matrix::Field, BlasSubmatrix<Matrix>, TriangularBlasMatrix<typename Matrix::Field, _Rep> > {
+ public:
+ typedef typename Matrix::Field Field;
+ BlasSubmatrix<Matrix>& operator() (const typename Matrix::Field& F,
+ BlasSubmatrix<Matrix>& X,
+ const TriangularBlasMatrix<Field,_Rep>& A,
+ const BlasSubmatrix<Matrix>& B) const
+ {
+
+ linbox_check( X.rowdim() == B.rowdim());
+ linbox_check( X.coldim() == B.coldim());
+
+ typename BlasSubmatrix<Matrix>::ConstIterator Biter = B.Begin();
+ typename BlasSubmatrix<Matrix>::Iterator Xiter = X.Begin();
+
+ for (; Biter != B.End(); ++Biter,++Xiter)
+ F.assign(*Xiter,*Biter);
+
+ return (*this)(F, A, X);
+ }
+
+ BlasSubmatrix<Matrix>& operator() (const typename Matrix::Field& F,
+ const TriangularBlasMatrix<Field,_Rep>& A,
+ BlasSubmatrix<Matrix>& B) const
+ {
+
+ linbox_check( A.rowdim() == A.coldim());
+ linbox_check( B.coldim() == A.rowdim());
+
+ FFLAS::ftrsm( F,
+ FFLAS::FflasRight,(FFLAS::FFLAS_UPLO) A.getUpLo(),
+ FFLAS::FflasNoTrans,(FFLAS::FFLAS_DIAG) A.getDiag() ,
+ B.rowdim(), A.coldim(),
+ F.one, A.getPointer(), A.getStride(),
+ B.getPointer(), B.getStride());
+
+
+ return B;
+ }
+ };
+
+
+#if 1
+
+ /*
+ * specialization for Operand of type std::vector<Element>
+ */
+
+ template <class Field, class _Rep>
+ class BlasMatrixDomainLeftSolve<Field, std::vector<typename Field::Element>, TriangularBlasMatrix<Field,_Rep> > {
+ public:
+ std::vector<typename Field::Element>& operator() (const Field& F,
+ std::vector<typename Field::Element>& x,
+ const TriangularBlasMatrix<Field,_Rep>& A,
+ const std::vector<typename Field::Element>& b) const
+ {
+
+ linbox_check (x.size() == b.size());
+ typename std::vector<typename Field::Element>::const_iterator biter = b.begin();
+ typename std::vector<typename Field::Element>::iterator xiter = x.begin();
+ for (;biter!=b.end();++biter,++xiter)
+ F.assign(*xiter,*biter);
+
+ return (*this)(F, A,x);
+ }
+
+ std::vector<typename Field::Element>& operator() (const Field& F,
+ const TriangularBlasMatrix<Field,_Rep>& A,
+ std::vector<typename Field::Element>& b) const
+ {
+
+ linbox_check( A.rowdim() == A.coldim());
+ linbox_check( A.rowdim() == b.size());
+
+ switch (A.getUpLo()) {
+ case Tag::Shape::Upper:
+ switch(A.getDiag()) {
+ case Tag::Diag::Unit:
+ FFLAS::ftrsv( F,
+ FFLAS::FflasUpper, FFLAS::FflasNoTrans, FFLAS::FflasUnit,
+ b.size(), A.getPointer(), A.getStride(),&b[0],1);
+ break;
+ case Tag::Diag::NonUnit:
+ FFLAS::ftrsv( F,
+ FFLAS::FflasUpper, FFLAS::FflasNoTrans, FFLAS::FflasNonUnit,
+ b.size(), A.getPointer(), A.getStride(),&b[0],1);
+ break;
+ default:
+ throw LinboxError ("Error in BlasMatrixDomain (triangular matrix not well defined)");
+ }
+ break;
+ case Tag::Shape::Lower:
+ switch(A.getDiag()) {
+ case Tag::Diag::Unit:
+ FFLAS::ftrsv( F,
+ FFLAS::FflasLower, FFLAS::FflasNoTrans, FFLAS::FflasUnit,
+ b.size(), A.getPointer(), A.getStride(),&b[0],1);
+ break;
+ case Tag::Diag::NonUnit:
+ FFLAS::ftrsv( F,
+ FFLAS::FflasLower, FFLAS::FflasNoTrans, FFLAS::FflasNonUnit,
+ b.size(), A.getPointer(), A.getStride(),&b[0],1);
+ break;
+ default:
+ throw LinboxError ("Error in BlasMatrixDomain (triangular matrix not well defined)");
+ }
+ break;
+ default:
+ throw LinboxError ("Error in BlasMatrixDomain (triangular matrix not well defined)");
+
+ }
+ return b;
+ }
+ };
+
+ template <class Field, class _Rep>
+ class BlasMatrixDomainRightSolve<Field, std::vector<typename Field::Element>, TriangularBlasMatrix<Field,_Rep> > {
+ public:
+ std::vector<typename Field::Element>& operator() (const Field& F,
+ std::vector<typename Field::Element>& x,
+ const TriangularBlasMatrix<Field,_Rep>& A,
+ const std::vector<typename Field::Element>& b) const
+ {
+
+ linbox_check (x.size() == b.size());
+ typename std::vector<typename Field::Element>::const_iterator biter = b.begin();
+ typename std::vector<typename Field::Element>::iterator xiter = x.begin();
+ for (;biter!=b.end();++biter,++xiter)
+ F.assign(*xiter,*biter);
+
+ return (*this)(F, A,x);
+ }
+
+ std::vector<typename Field::Element>& operator() (const Field& F,
+ const TriangularBlasMatrix<Field,_Rep>& A,
+ std::vector<typename Field::Element>& b) const
+ {
+
+ linbox_check( A.rowdim() == A.coldim());
+ linbox_check( A.coldim() == b.size());
+
+
+ switch (A.getUpLo()) {
+ case Tag::Shape::Upper:
+ switch(A.getDiag()) {
+ case Tag::Diag::Unit:
+ FFLAS::ftrsv( F,
+ FFLAS::FflasUpper, FFLAS::FflasTrans, FFLAS::FflasUnit,
+ b.size(), A.getPointer(), A.getStride(),&b[0],1);
+ break;
+ case Tag::Diag::NonUnit:
+ FFLAS::ftrsv( F,
+ FFLAS::FflasUpper, FFLAS::FflasTrans, FFLAS::FflasNonUnit,
+ b.size(), A.getPointer(), A.getStride(),&b[0],1);
+ break;
+ default:
+ throw LinboxError ("Error in BlasMatrixDomain (triangular matrix not well defined)");
+ }
+ break;
+ case Tag::Shape::Lower:
+ switch(A.getDiag()) {
+ case Tag::Diag::Unit:
+ FFLAS::ftrsv( F,
+ FFLAS::FflasLower, FFLAS::FflasTrans, FFLAS::FflasUnit,
+ b.size(), A.getPointer(), A.getStride(),&b[0],1);
+ break;
+ case Tag::Diag::NonUnit:
+ FFLAS::ftrsv( F,
+ FFLAS::FflasLower, FFLAS::FflasTrans, FFLAS::FflasNonUnit,
+ b.size(), A.getPointer(), A.getStride(),&b[0],1);
+ break;
+ default:
+ throw LinboxError ("Error in BlasMatrixDomain (triangular matrix not well defined)");
+ }
+ break;
+ default:
+ throw LinboxError ("Error in BlasMatrixDomain (triangular matrix not well defined)");
+
+ }
+ return b;
+ }
+ };
+
+ template <class Field, class _Rep>
+ class BlasMatrixDomainLeftSolve<Field, BlasVector<Field>, TriangularBlasMatrix<Field,_Rep> > {
+ public:
+ BlasVector<Field>& operator() (const Field& F,
+ BlasVector<Field>& x,
+ const TriangularBlasMatrix<Field,_Rep>& A,
+ const BlasVector<Field>& b) const
+ {
+
+ linbox_check (x.size() == b.size());
+ typename BlasVector<Field>::const_iterator biter = b.begin();
+ typename BlasVector<Field>::iterator xiter = x.begin();
+ for (;biter!=b.end();++biter,++xiter)
+ F.assign(*xiter,*biter);
+
+ return (*this)(F, A,x);
+ }
+
+ BlasVector<Field>& operator() (const Field& F,
+ const TriangularBlasMatrix<Field,_Rep>& A,
+ BlasVector<Field>& b) const
+ {
+
+ linbox_check( A.rowdim() == A.coldim());
+ linbox_check( A.rowdim() == b.size());
+
+ switch (A.getUpLo()) {
+ case Tag::Shape::Upper:
+ switch(A.getDiag()) {
+ case Tag::Diag::Unit:
+ FFLAS::ftrsv( F,
+ FFLAS::FflasUpper, FFLAS::FflasNoTrans, FFLAS::FflasUnit,
+ b.size(), A.getPointer(), A.getStride(),&b[0],1);
+ break;
+ case Tag::Diag::NonUnit:
+ FFLAS::ftrsv( F,
+ FFLAS::FflasUpper, FFLAS::FflasNoTrans, FFLAS::FflasNonUnit,
+ b.size(), A.getPointer(), A.getStride(),&b[0],1);
+ break;
+ default:
+ throw LinboxError ("Error in BlasMatrixDomain (triangular matrix not well defined)");
+ }
+ break;
+ case Tag::Shape::Lower:
+ switch(A.getDiag()) {
+ case Tag::Diag::Unit:
+ FFLAS::ftrsv( F,
+ FFLAS::FflasLower, FFLAS::FflasNoTrans, FFLAS::FflasUnit,
+ b.size(), A.getPointer(), A.getStride(),&b[0],1);
+ break;
+ case Tag::Diag::NonUnit:
+ FFLAS::ftrsv( F,
+ FFLAS::FflasLower, FFLAS::FflasNoTrans, FFLAS::FflasNonUnit,
+ b.size(), A.getPointer(), A.getStride(),&b[0],1);
+ break;
+ default:
+ throw LinboxError ("Error in BlasMatrixDomain (triangular matrix not well defined)");
+ }
+ break;
+ default:
+ throw LinboxError ("Error in BlasMatrixDomain (triangular matrix not well defined)");
+
+ }
+ return b;
+ }
+ };
+
+ template <class Field, class _Rep>
+ class BlasMatrixDomainRightSolve<Field, BlasVector<Field>, TriangularBlasMatrix<Field,_Rep> > {
+ public:
+ BlasVector<Field>& operator() (const Field& F,
+ BlasVector<Field>& x,
+ const TriangularBlasMatrix<Field,_Rep>& A,
+ const BlasVector<Field>& b) const
+ {
+
+ linbox_check (x.size() == b.size());
+ typename BlasVector<Field>::const_iterator biter = b.begin();
+ typename BlasVector<Field>::iterator xiter = x.begin();
+ for (;biter!=b.end();++biter,++xiter)
+ F.assign(*xiter,*biter);
+
+ return (*this)(F, A,x);
+ }
+
+ BlasVector<Field>& operator() (const Field& F,
+ const TriangularBlasMatrix<Field,_Rep>& A,
+ BlasVector<Field>& b) const
+ {
+
+ linbox_check( A.rowdim() == A.coldim());
+ linbox_check( A.coldim() == b.size());
+
+
+ switch (A.getUpLo()) {
+ case Tag::Shape::Upper:
+ switch(A.getDiag()) {
+ case Tag::Diag::Unit:
+ FFLAS::ftrsv( F,
+ FFLAS::FflasUpper, FFLAS::FflasTrans, FFLAS::FflasUnit,
+ b.size(), A.getPointer(), A.getStride(),&b[0],1);
+ break;
+ case Tag::Diag::NonUnit:
+ FFLAS::ftrsv( F,
+ FFLAS::FflasUpper, FFLAS::FflasTrans, FFLAS::FflasNonUnit,
+ b.size(), A.getPointer(), A.getStride(),&b[0],1);
+ break;
+ default:
+ throw LinboxError ("Error in BlasMatrixDomain (triangular matrix not well defined)");
+ }
+ break;
+ case Tag::Shape::Lower:
+ switch(A.getDiag()) {
+ case Tag::Diag::Unit:
+ FFLAS::ftrsv( F,
+ FFLAS::FflasLower, FFLAS::FflasTrans, FFLAS::FflasUnit,
+ b.size(), A.getPointer(), A.getStride(),&b[0],1);
+ break;
+ case Tag::Diag::NonUnit:
+ FFLAS::ftrsv( F,
+ FFLAS::FflasLower, FFLAS::FflasTrans, FFLAS::FflasNonUnit,
+ b.size(), A.getPointer(), A.getStride(),&b[0],1);
+ break;
+ default:
+ throw LinboxError ("Error in BlasMatrixDomain (triangular matrix not well defined)");
+ }
+ break;
+ default:
+ throw LinboxError ("Error in BlasMatrixDomain (triangular matrix not well defined)");
+
+ }
+ return b;
+ }
+ };
+
+#endif
+
+} // LinBox
+
+namespace LinBox
+{ /* Minpoly Charpoly */
+
+ template< class Field, class Polynomial, class Matrix>
+ Polynomial&
+ BlasMatrixDomainMinpoly< Field, Polynomial, Matrix >::operator() (const Field &F, Polynomial& P, const Matrix& A) const
+ {
+ commentator().start ("Givaro::Modular Dense Minpoly ", "MDMinpoly");
+
+ size_t n = A.coldim();
+ linbox_check( n == A.rowdim());
+ typename Field::Element * X = new typename Field::Element[n*(n+1)];
+ size_t *Perm = new size_t[n];
+ for ( size_t i=0; i<n; ++i)
+ Perm[i] = 0;
+ //
+ typedef typename Matrix::constSubMatrixType constSubMatrixType ;
+ constSubMatrixType A_v(A);
+
+ FFPACK::MinPoly<Field, Polynomial>( F, P, n, A_v.getPointer(), A_v.getStride(), X, n, Perm);
+
+ commentator().report(Commentator::LEVEL_IMPORTANT, INTERNAL_DESCRIPTION) << "minpoly with " << P.size() << " coefficients" << std::endl;
+
+ delete[] Perm;
+ delete[] X;
+ commentator().stop ("done", NULL, "MDMinpoly");
+ return P;
+ }
+
+ template< class Field, class ContPol, class Matrix >
+ ContPol&
+ BlasMatrixDomainCharpoly<Field, ContPol, Matrix>::operator() ( const Field &F,
+ ContPol &P,
+ const Matrix &A) const
+ {
+
+ size_t n = A.coldim();
+ P.clear();
+ linbox_check( n == A.rowdim());
+ typedef typename Matrix::constSubMatrixType constSubMatrixType ;
+ constSubMatrixType A_v(A);
+
+ FFPACK::CharPoly( F, P, n, A_v.getPointer(), A_v.getStride());
+
+ return P;
+ }
+
+ template< class Field, class Matrix, class _Vrep >
+ BlasVector<Field, _Vrep> &
+ BlasMatrixDomainCharpoly<Field, BlasVector<Field, _Vrep>, Matrix>::operator() ( const Field &F,
+ BlasVector<Field, _Vrep> &P,
+ const Matrix &A) const
+ {
+
+ size_t n = A.coldim();
+ P.clear();
+ linbox_check( n == A.rowdim());
+ typedef typename Matrix::constSubMatrixType constSubMatrixType ;
+ constSubMatrixType A_v(A);
+
+ linbox_check(P.stride() == 1);
+ FFPACK::CharPoly( F, P.getWritePointer(), n, A_v.getPointer(), A_v.getStride());
+
+ return P;
+ }
+
+
+} //end of namespace LinBox
+
+#endif // __LINBOX_matrix_matrixdomain_blas_matrix_domain_INL
+
+
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=
diff --git a/linbox/matrix/matrix-domain-gf2.h b/linbox/matrix/matrixdomain/matrix-domain-gf2.h
similarity index 100%
rename from linbox/matrix/matrix-domain-gf2.h
rename to linbox/matrix/matrixdomain/matrix-domain-gf2.h
diff --git a/linbox/matrix/matrixdomain/matrix-domain.h b/linbox/matrix/matrixdomain/matrix-domain.h
new file mode 100644
index 0000000..41a570c
--- /dev/null
+++ b/linbox/matrix/matrixdomain/matrix-domain.h
@@ -0,0 +1,1245 @@
+/*
+ * Copyright (C) 2002 Zhendong Wan, Bradford Hovinen
+ * Copyright (C) 2013,2014 the LinBox group
+ *
+ * Written by Zhendong Wan <wan at mail.eecis.udel.edu>,
+ * Bradford Hovinen <bghovinen at math.uwaterloo.ca>
+ * Brice Boyer (briceboyer) <boyer.brice at gmail.com>
+ *
+ * ------------------------------------------------------------
+ * 2002-11-26 Bradford Hovinen <bghovinen at math.uwaterloo.ca>
+ *
+ * Added detailed documentation, cleaned up the interface slightly, and added
+ * support for matrix traits. Added read, write, neg, negin, axpy, and
+ * matrix-vector and matrix-black box operations.
+ * ------------------------------------------------------------
+ *
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ * ========LICENCE========
+ *.
+ */
+
+/** @file linbox/matrix/matrixdomain/matrix-domain.h
+ * @brief NO DOC
+ */
+
+#ifndef __LINBOX_matrixdomain_matrix_domain_H
+#define __LINBOX_matrixdomain_matrix_domain_H
+
+#include <linbox/linbox-config.h>
+#include <iostream>
+#include <vector>
+
+#include "linbox/blackbox/archetype.h"
+#include "linbox/matrix/matrix-traits.h"
+// #include "linbox/vector/blas-vector.h"
+
+namespace LinBox
+{
+
+
+ /** Class of matrix arithmetic functions.
+ *
+ * This class encapuslated matrix-matrix and matrix-vector operations, roughly
+ * equivalent to BLAS levels 2 and 3. The arithmetic methods are parameterized
+ * by matrix type so that they may be used the same way with sparse matrices,
+ * dense matrices, and dense submatrices. Except where otherwise noted, they
+ * require the matrix inputs to meet the \ref BlasMatrix archetype.
+ *
+ * These methods are specialized so that they can run efficiently with different
+ * matrix representations. If a matrix has an efficient row iterator, but not an
+ * efficient column iterator, a specialization that makes use of the former will
+ * be selected. This allows a great deal of flexibility when dealing with sparse
+ * matrix arithmetic.
+ *
+ * For all of the arithmetic operations that output matrices, it is assumed that
+ * the output matrix has an efficient row iterator. In typical use, the output
+ * matrix will be a \ref BlasMatrix or a \ref BlasSubmatrix, which has
+ * efficient row and column iterators. In particular, one should not perform
+ * these arithmetic operations outputting to a \ref SparseMatrixBase.
+ *
+ * There are other restrictions. See the method-specific documentation for more
+ * details.
+ */
+ template <class Field_ >
+ class MatrixDomain : public MVProductDomain<Field_> {
+ public:
+ typedef size_t Index;
+ typedef Field_ Field;
+ typedef typename Field::Element Element;
+ typedef Element Scalar;
+ //! @bug should be BlasVector
+ typedef typename Vector<Field>::Dense Rep_;
+ // typedef Rep_ DenseVector;
+ typedef BlasVector<Field_,Rep_> DenseVector;
+ typedef BlasMatrix<Field,Rep_> OwnMatrix;
+ typedef BlasSubmatrix<OwnMatrix> Matrix;
+
+ // MatrixDomain () {/*std::cerr << "MD def cstor" << std::endl;*/ }
+
+ void init(const Field & F) { _field = &F; _VD.init(F); }
+
+ MatrixDomain() {}
+
+ /// Constructor.
+ //! @param F field for MatrixDomain operations.
+ MatrixDomain (const Field &F) :
+ _field (&F), _VD (F)
+ { /*std::cerr << "MD cstor " << this << std::endl;*/ }
+
+ /// Copy operator.
+ MatrixDomain& operator= (const MatrixDomain& MD)
+ {
+ _field = MD._field;
+ _VD = MD._VD;
+ return *this;
+ }
+
+ /** Retrieve the underlying field.
+ * Return a reference to the field that this matrix domain
+ * object uses
+ * @returns reference to field
+ */
+ //@{
+ const Field &field () const
+ {
+ return *_field;
+ }
+
+ //@}
+
+ /** Print matrix.
+ * @param os Output stream to which matrix is written.
+ * @param A Matrix.
+ * @returns reference to os.
+ */
+ template <class Matrix_>
+ inline std::ostream &write (std::ostream &os, const Matrix_ &A) const
+ {
+ return A.write (os);
+ }
+
+ /** Read matrix.
+ * @param is Input stream from which matrix is read.
+ * @param A Matrix.
+ * @returns reference to is.
+ */
+ template <class Matrix_>
+ inline std::istream &read (std::istream &is, Matrix_ &A) const
+ {
+ return A.read (is, _field);
+ }
+
+ /** Matrix copy
+ * B <- A.
+ * Copy the contents of the matrix B to the matrix A
+ *
+ * Both matrices must support the same iterators, row or column.
+ *
+ * @param B Matrix B
+ * @param A Matrix A
+ * @returns Reference to B
+ */
+ template <class Matrix1, class Matrix2>
+ inline Matrix1 © (Matrix1 &B, const Matrix2 &A) const
+ {
+ return copySpecialized (B, A,
+ typename MatrixTraits<Matrix1>::MatrixCategory (),
+ typename MatrixTraits<Matrix2>::MatrixCategory ());
+ }
+ /// B <-- A. They must already have the same shape.
+ inline Matrix © (Matrix &B, const Matrix &A) const {
+ return B.copy(A);
+ }
+
+ /** Matrix swap
+ * B <--> A. They must already have the same shape.
+ * @returns Reference to B
+ */
+ inline Matrix &swap(Matrix &B, Matrix &A) const {
+ return B.swap(A);
+ }
+
+ /** Matrix equality.
+ * Test whether the matrices A and B are equal
+ * @param A Input vector
+ * @param B Input vector
+ * @returns true if and only if the matrices A and B are equal
+ */
+ template <class Matrix1, class Matrix2>
+ bool areEqual (const Matrix1 &A, const Matrix2 &B) const
+ {
+ return areEqualSpecialized (B, A,
+ typename MatrixTraits<Matrix1>::MatrixCategory (),
+ typename MatrixTraits<Matrix2>::MatrixCategory ());
+ }
+
+ /** Matrix equality with zero.
+ * @param A Input matrix
+ * @returns true if and only if the matrix A is zero
+ */
+ template <class Matrix_>
+ inline bool isZero (const Matrix_ &A) const
+ {
+ return isZeroSpecialized (A, typename MatrixTraits<Matrix_>::MatrixCategory ());
+ }
+
+ /** Matrix-matrix addition
+ * C <- A + B.
+ *
+ * Each of A, B, and C must support the same iterator, either row or
+ * column
+ *
+ * @param C Output matrix C
+ * @param A Input matrix A
+ * @param B Input matrix B
+ * @returns Reference to C
+ */
+ template <class Matrix1, class Matrix2, class Matrix3>
+ inline Matrix1& add (Matrix1 &C, const Matrix2 &A, const Matrix3 &B) const
+ {
+ return addSpecialized (C, A, B,
+ typename MatrixTraits<Matrix1>::MatrixCategory (),
+ typename MatrixTraits<Matrix2>::MatrixCategory (),
+ typename MatrixTraits<Matrix3>::MatrixCategory ());
+ }
+
+ /** Matrix-matrix in-place addition
+ * A <- A + B.
+ *
+ * Each of A and B must support the same iterator, either row or column
+ *
+ * @param A Input matrix A
+ * @param B Input matrix B
+ * @returns Reference to A
+ */
+ template <class Matrix1, class Matrix2>
+ inline Matrix1& addin (Matrix1 &A, const Matrix2 &B) const
+ {
+ return addinSpecialized (A, B,
+ typename MatrixTraits<Matrix1>::MatrixCategory (),
+ typename MatrixTraits<Matrix2>::MatrixCategory ());
+ }
+
+ /** Matrix-matrix subtraction
+ * C <- A - B.
+ *
+ * Each of A, B, and C must support the same iterator, either row or
+ * column
+ *
+ * @param C Output matrix C
+ * @param A Input matrix A
+ * @param B Input matrix B
+ * @returns Reference to C
+ */
+ template <class Matrix1, class Matrix2, class Matrix3>
+ inline Matrix1 &sub (Matrix1 &C, const Matrix2 &A, const Matrix3 &B) const
+ {
+ return subSpecialized (C, A, B,
+ typename MatrixTraits<Matrix1>::MatrixCategory (),
+ typename MatrixTraits<Matrix2>::MatrixCategory (),
+ typename MatrixTraits<Matrix3>::MatrixCategory ());
+ }
+
+ /** Matrix-matrix in-place subtraction
+ * A <- A - B.
+ *
+ * Each of A and B must support the same iterator, either row or column
+ *
+ * @param A Input matrix A
+ * @param B Input matrix B
+ * @returns Reference to A
+ */
+ template <class Matrix1, class Matrix2>
+ inline Matrix1 &subin (Matrix1 &A, const Matrix2 &B) const
+ {
+ return subinSpecialized (A, B,
+ typename MatrixTraits<Matrix1>::MatrixCategory (),
+ typename MatrixTraits<Matrix2>::MatrixCategory ());
+ }
+
+ /** Matrix negate
+ * B <- -A.
+ *
+ * Each of A and B must support the same iterator, either row or column
+ *
+ * @param B Output matrix B
+ * @param A Input matrix A
+ * @returns reference to B
+ */
+ template <class Matrix1, class Matrix2>
+ inline Matrix1 &neg (Matrix1 &B, const Matrix2 &A) const
+ {
+ return negSpecialized (B, A,
+ typename MatrixTraits<Matrix1>::MatrixCategory (),
+ typename MatrixTraits<Matrix2>::MatrixCategory ());
+ }
+
+ /** Matrix in-place negate
+ * A <- -A.
+ * @param A Input matrix A; result is stored here
+ */
+ template <class Matrix_>
+ inline Matrix_ &negin (Matrix_ &A) const
+ {
+ return neginSpecialized (A, typename MatrixTraits<Matrix_>::MatrixCategory ());
+ }
+
+ /** Matrix-matrix multiply
+ * C <- A * B.
+ *
+ * C must support both row and column iterators, and the vector
+ * representations must be dense. Examples of supported matrices are
+ * \ref BlasMatrix and \ref BlasSubmatrix.
+ *
+ * Either A or B, or both, may have limited iterators. However, either A
+ * must support row iterators or B must support column iterators. If
+ * both A and B lack support for an iterator (either row or column),
+ * then C must support the same type of iterator as A and B.
+ *
+ * @param C Output matrix C
+ * @param A Input matrix A
+ * @param B Input matrix B
+ * @returns Reference to C
+ */
+ template <class Matrix1, class Matrix2, class Matrix3>
+ inline Matrix1 &mul (Matrix1 &C, const Matrix2 &A, const Matrix3 &B) const
+ {
+ return mulSpecialized (C, A, B,
+ typename MatrixTraits<Matrix1>::MatrixCategory (),
+ typename MatrixTraits<Matrix2>::MatrixCategory (),
+ typename MatrixTraits<Matrix3>::MatrixCategory ());
+ }
+
+ /** Matrix-matrix in-place multiply on the left
+ * B <- A * B.
+ *
+ * B should support both row and column iterators, and must be dense. A
+ * must support row iterators.
+ *
+ * @param A Input matrix A
+ * @param B Input matrix B
+ * @returns Reference to B
+ */
+ template <class Matrix1, class Matrix2>
+ inline Matrix2 &leftMulin (const Matrix1 &A, Matrix2 &B) const;
+
+ /** Matrix-matrix in-place multiply on the right
+ * A <- A * B.
+ *
+ * A should support both row and column iterators, and must be dense. B
+ * must support column iterators.
+ *
+ * @param A Input matrix A
+ * @param B Input matrix B
+ * @returns Reference to A
+ */
+ template <class Matrix1, class Matrix2>
+ inline Matrix1 &rightMulin (Matrix1 &A, const Matrix2 &B) const;
+
+ /** Matrix-matrix in-place multiply
+ * A <- A * B.
+ *
+ * This is an alias for \ref rightMulin
+ *
+ * @param A Input matrix A
+ * @param B Input matrix B
+ * @returns Reference to A
+ */
+ template <class Matrix1, class Matrix2>
+ inline Matrix1 &mulin (Matrix1 &A, const Matrix2 &B) const
+ {
+ return rightMulin (A, B);
+ }
+
+ /** Matrix-scalar multiply
+ * C <- B * a.
+ *
+ * Multiply B by the scalar element a and store the result in C. B and C
+ * must support the same iterators.
+ *
+ * @param C Output matrix C
+ * @param B Input matrix B
+ * @param a Input scalar a
+ * @returns Reference to C
+ */
+ template <class Matrix1, class Matrix2>
+ inline Matrix1 &mul (Matrix1 &C, const Matrix2 &B, const typename Field::Element &a) const
+ {
+ return mulSpecialized (C, B, a,
+ typename MatrixTraits<Matrix1>::MatrixCategory (),
+ typename MatrixTraits<Matrix2>::MatrixCategory ());
+ }
+
+ /** Matrix-scalar in-place multiply
+ * B <- B * a.
+ *
+ * Multiply B by the scalar element a in-place.
+ *
+ * @param B Input matrix B
+ * @param a Input scalar a
+ * @returns Reference to B
+ */
+ template <class Matrix_>
+ inline Matrix_ &mulin (Matrix_ &B, const typename Field::Element &a) const
+ {
+ return mulinSpecialized (B, a, typename MatrixTraits<Matrix_>::MatrixCategory ());
+ }
+
+ /** Matrix-matrix in-place axpy
+ * Y <- Y + A*X.
+ *
+ * This function combines \ref mul and \ref add, eliminating the need
+ * for an additional temporary in expressions of the form $Y = Y +
+ * AX$. Only one row of additional storage is required. Y may have
+ * either efficient row iterators or efficient column iterators, and the
+ * same restrictions on A and X apply as in \ref mul.
+ *
+ * Note that no out-of-place axpy is provided, since it gives no
+ * benefit. One may just as easily multiply into the result and call
+ * \ref addin.
+ *
+ * @param Y Input matrix Y; result is stored here
+ * @param A Input matrix A
+ * @param X Input matrix X
+ */
+ template <class Matrix1, class Matrix2, class Matrix3>
+ inline Matrix1 &axpyin (Matrix1 &Y, const Matrix2 &A, const Matrix3 &X) const
+ {
+ return axpyinSpecialized (Y, A, X,
+ typename MatrixTraits<Matrix1>::MatrixCategory (),
+ typename MatrixTraits<Matrix2>::MatrixCategory (),
+ typename MatrixTraits<Matrix3>::MatrixCategory ());
+ }
+
+ //! Y <- AX-Y
+ template <class Matrix1, class Matrix2, class Matrix3>
+ inline Matrix1 &axmyin (Matrix1 &Y, const Matrix2 &A, const Matrix3 &X) const
+ {
+ negin(Y);
+ axpyin(Y,A,X);
+ return Y;
+ }
+
+ // Y <- Y + aX
+ template <class Matrix1, class Matrix3>
+ inline Matrix1 &saxpyin (Matrix1 &Y, const Element &a, const Matrix3 &X) const
+ { // a crude hack for now
+ Element x, y;
+ for (size_t i = 0; i < X.rowdim(); ++i)
+ for (size_t j = 0; j < X.coldim(); ++j)
+ Y.setEntry(i,j,field().axpyin(Y.getEntry(y,i,j), a, X.getEntry(x, i, j)));
+ return Y;
+ }
+
+ /*! General matrix multiply
+ * \f$ D \gets \alpha A B + \beta C\f$.
+ * @todo not efficient...
+ */
+ template <class Matrix1, class Matrix2, class Matrix3>
+ inline Matrix1 &muladd (Matrix1 & D,
+ const typename Field::Element & beta,
+ const Matrix1 & C,
+ const typename Field::Element & alpha,
+ const Matrix2 & A,
+ const Matrix3 & B) const
+ {
+ mul(D,A,B); // D = AB
+ mulin(D,alpha); // D = alpha D
+ Matrix1 CC(C);
+ mulin(CC,beta); // C = beta C
+ addin(D,CC); // D = D+C
+ return D;
+ }
+
+ /*! @todo Need documentation of these methods */
+ //@{
+ template<class Matrix1, class Matrix2>
+ Matrix1 &pow_apply (Matrix1 &M1, const Matrix2 &M2, unsigned long int k) const;
+
+ template<class Matrix1, class Matrix2>
+ Matrix1 &pow_horn (Matrix1 &M1, const Matrix2 &M2, unsigned long int k) const;
+ //@}
+
+
+ /*! @name Matrix-vector arithmetic operations
+ * These operations take a matrix satisfying the \ref DenseMatrix
+ * archetype and LinBox vectors as inputs. They involve matrix-vector
+ * product and matrix-vector AXPY
+ */
+ //@{
+ /** Matrix-vector multiply
+ * w <- A * v.
+ *
+ * The vectors v and w must be of the same representation (dense, sparse
+ * sequence, sparse associative, or sparse parallel), but they may be of
+ * different types. The matrix A may have any representation.
+ *
+ * @param w Output vector w
+ * @param A Input matrix A
+ * @param v Input vector v
+ * @returns Reference to w
+ */
+ template <class Vector1, class Matrix_, class Vector2>
+ inline Vector1 &vectorMul (Vector1 &w, const Matrix_ &A, const Vector2 &v) const
+ {
+ return mulSpecialized (w, A, v, typename MatrixTraits<Matrix_>::MatrixCategory ());
+ }
+
+ /** Matrix-vector in-place axpy
+ * \f$y \gets y + A x\f$.
+ *
+ * This function eliminates the requirement for temporary storage when
+ * one is computing an expression of the form given above.
+ *
+ * The vectors y and x must be of the same representation (dense, sparse
+ * sequence, sparse associative, or sparse parallel), but they may be of
+ * different types. The matrix A may have any representation.
+ *
+ * Note that out-of-place axpy is not provided since it provides no
+ * benefit -- one can use mul and then addin to exactly the same effect,
+ * with no additional storage or performance cost.
+ *
+ * @param y Input vector y; result is stored here
+ * @param A Input matrix A
+ * @param x Input vector x
+ */
+ template <class Vector1, class Matrix_, class Vector2>
+ inline Vector1 &vectorAxpyin (Vector1 &y, const Matrix_ &A, const Vector2 &x) const
+ {
+ return axpyinSpecialized (y, A, x, typename MatrixTraits<Matrix_>::MatrixCategory ());
+ }
+ //@}
+
+ /*! @name Matrix-black box arithmetic operations
+ * These operations mimic the matrix-matrix arithmetic operations above,
+ * but one of the parameters is a \ref BlackboxArchetype.
+ */
+ //@{
+ /** Matrix-black box left-multiply
+ * C <- A * B.
+ *
+ * Both C and B must support column iterators
+ *
+ * @param C Output matrix
+ * @param A Black box for A
+ * @param B Matrix B
+ */
+ template <class Matrix1, class Blackbox, class Matrix2>
+ inline Matrix1 &blackboxMulLeft (Matrix1 &C, const Blackbox &A, const Matrix2 &B) const;
+
+ /** Matrix-black box right-multiply
+ * C <- A * B.
+ *
+ * Both C and A must support row iterators
+ *
+ * @param C Output matrix
+ * @param A Matrix A
+ * @param B Black box for B
+ */
+ template <class Matrix1, class Matrix2, class Blackbox>
+ inline Matrix1 &blackboxMulRight (Matrix1 &C, const Matrix2 &A, const Blackbox &B) const;
+ //@}
+
+ /*! @name Matrix permutations
+ * @brief
+ * These operations permute the rows or columns of a matrix based on
+ * the given permutation. They are intended for use with Gauss-Jordan
+ * elimination
+ */
+ //@{
+ /// Transposition.
+ typedef std::pair<unsigned int, unsigned int> Transposition;
+ /** Permutation.
+ *
+ * A permutation is represented as a vector of pairs, each
+ * pair representing a transposition.
+ */
+ typedef std::vector<Transposition> Permutation;
+
+
+ /** Permute the rows of the given matrix.
+ *
+ * @param A Output matrix
+ * @param P_start Start of permutation
+ * @param P_end End of permutation
+ * @returns Reference to A
+ */
+ template <class Matrix_, class Iterator>
+ inline Matrix_ &permuteRows (Matrix_ &A,
+ Iterator P_start,
+ Iterator P_end) const
+ {
+ return permuteRowsSpecialized (A, P_start, P_end,
+ typename MatrixTraits<Matrix_>::MatrixCategory ());
+ }
+
+ /** Permute the columns of the given matrix.
+ *
+ * @param A Output matrix
+ * @param P_start Start of permutation
+ * @param P_end End of permutation
+ * @returns Reference to A
+ */
+ template <class Matrix_, class Iterator>
+ inline Matrix_ &permuteColumns (Matrix_ &A,
+ Iterator P_start,
+ Iterator P_end) const
+ {
+ return permuteColsSpecialized (A, P_start, P_end,
+ typename MatrixTraits<Matrix_>::MatrixCategory ());
+ }
+ //@}
+
+ const VectorDomain<Field> & vectorDomain() const
+ {
+ return _VD ;
+ }
+ protected:
+
+ // Specialized function implementations
+ template <class Matrix1, class Matrix2> Matrix1 ©Row (Matrix1 &B, const Matrix2 &A) const;
+ template <class Matrix1, class Matrix2> Matrix1 ©Col (Matrix1 &B, const Matrix2 &A) const;
+
+ template <class Matrix1, class Matrix2>
+ inline Matrix1 ©Specialized (Matrix1 &B, const Matrix2 &A,
+ MatrixCategories::RowMatrixTag,
+ MatrixCategories::RowMatrixTag) const
+ {
+ return copyRow (B, A);
+ }
+ template <class Matrix1, class Matrix2>
+ inline Matrix1 ©Specialized (Matrix1 &B, const Matrix2 &A,
+ MatrixCategories::ColMatrixTag,
+ MatrixCategories::ColMatrixTag) const
+ {
+ return copyCol (B, A);
+ }
+ template <class Matrix1, class Matrix2>
+ inline Matrix1 ©Specialized (Matrix1 &B, const Matrix2 &A,
+ MatrixCategories::RowColMatrixTag,
+ MatrixCategories::RowColMatrixTag) const
+ {
+ return copyRow (B, A);
+ }
+
+ template <class Matrix1, class Matrix2> bool areEqualBB (const Matrix1 &A, const Matrix2 &B) const;
+ template <class Matrix1, class Matrix2> bool areEqualRow (const Matrix1 &A, const Matrix2 &B) const;
+ template <class Matrix1, class Matrix2> bool areEqualCol (const Matrix1 &A, const Matrix2 &B) const;
+
+ template <class Matrix1, class Matrix2>
+ inline bool areEqualSpecialized (const Matrix1 &A, const Matrix2 &B,
+ MatrixCategories::BlackboxTag,
+ MatrixCategories::BlackboxTag) const
+ {
+ return areEqualBB(A, B);
+ }
+ template <class Matrix1, class Matrix2>
+ inline bool areEqualSpecialized (const Matrix1 &A, const Matrix2 &B,
+ MatrixCategories::RowMatrixTag,
+ MatrixCategories::RowMatrixTag) const
+ {
+ return areEqualRow (A, B);
+ }
+ template <class Matrix1, class Matrix2>
+ inline bool areEqualSpecialized (const Matrix1 &A, const Matrix2 &B,
+ MatrixCategories::ColMatrixTag,
+ MatrixCategories::ColMatrixTag) const
+ {
+ return areEqualCol (A, B);
+ }
+ template <class Matrix1, class Matrix2>
+ inline bool areEqualSpecialized (const Matrix1 &A, const Matrix2 &B,
+ MatrixCategories::RowColMatrixTag,
+ MatrixCategories::RowColMatrixTag) const
+ {
+ return areEqualRow (A, B);
+ }
+
+ template <class Matrix_> bool isZeroBB (const Matrix_ &v) const;
+ template <class Matrix_> bool isZeroRow (const Matrix_ &v) const;
+ template <class Matrix_> bool isZeroCol (const Matrix_ &v) const;
+
+ template <class Matrix_>
+ bool isZeroSpecialized (const Matrix_ &A, MatrixCategories::BlackboxTag) const
+ {
+ return isZeroBB (A);
+ }
+ template <class Matrix_>
+ bool isZeroSpecialized (const Matrix_ &A, MatrixCategories::RowMatrixTag) const
+ {
+ return isZeroRow (A);
+ }
+ template <class Matrix_>
+ bool isZeroSpecialized (const Matrix_ &A, MatrixCategories::ColMatrixTag) const
+ {
+ return isZeroCol (A);
+ }
+ template <class Matrix_>
+ bool isZeroSpecialized (const Matrix_ &A, MatrixCategories::RowColMatrixTag) const
+ {
+ return isZeroRow (A);
+ }
+
+ template <class Matrix1, class Matrix2, class Matrix3>
+ Matrix1& addRow (Matrix1 &C, const Matrix2 &A, const Matrix3 &B) const;
+ template <class Matrix1, class Matrix2, class Matrix3>
+ Matrix1& addCol (Matrix1 &C, const Matrix2 &A, const Matrix3 &B) const;
+
+ template <class Matrix1, class Matrix2, class Matrix3>
+ Matrix1& addSpecialized (Matrix1 &C, const Matrix2 &A, const Matrix3 &B,
+ MatrixCategories::RowMatrixTag,
+ MatrixCategories::RowMatrixTag,
+ MatrixCategories::RowMatrixTag) const
+ {
+ return addRow (C, A, B);
+ }
+ template <class Matrix1, class Matrix2, class Matrix3>
+ Matrix1& addSpecialized (Matrix1 &C, const Matrix2 &A, const Matrix3 &B,
+ MatrixCategories::ColMatrixTag,
+ MatrixCategories::ColMatrixTag,
+ MatrixCategories::ColMatrixTag) const
+ {
+ return addCol (C, A, B);
+ }
+ template <class Matrix1, class Matrix2, class Matrix3>
+ Matrix1& addSpecialized (Matrix1 &C, const Matrix2 &A, const Matrix3 &B,
+ MatrixCategories::RowColMatrixTag,
+ MatrixCategories::RowColMatrixTag,
+ MatrixCategories::RowColMatrixTag) const
+ {
+ return addRow (C, A, B);
+ }
+
+ template <class Matrix1, class Matrix2> Matrix1& addinRow (Matrix1 &A, const Matrix2 &B) const;
+ template <class Matrix1, class Matrix2> Matrix1& addinCol (Matrix1 &A, const Matrix2 &B) const;
+
+ template <class Matrix1, class Matrix2>
+ inline Matrix1& addinSpecialized (Matrix1 &A, const Matrix2 &B,
+ MatrixCategories::RowMatrixTag,
+ MatrixCategories::RowMatrixTag) const
+ {
+ return addinRow (A, B);
+ }
+ template <class Matrix1, class Matrix2>
+ inline Matrix1& addinSpecialized (Matrix1 &A, const Matrix2 &B,
+ MatrixCategories::ColMatrixTag,
+ MatrixCategories::ColMatrixTag) const
+ {
+ return addinCol (A, B);
+ }
+ template <class Matrix1, class Matrix2>
+ inline Matrix1& addinSpecialized (Matrix1 &A, const Matrix2 &B,
+ MatrixCategories::RowColMatrixTag,
+ MatrixCategories::RowColMatrixTag) const
+ {
+ return addinRow (A, B);
+ }
+
+ template <class Matrix1, class Matrix2, class Matrix3>
+ Matrix1& subRow (Matrix1 &C, const Matrix2 &A, const Matrix3 &B) const;
+ template <class Matrix1, class Matrix2, class Matrix3>
+ Matrix1& subCol (Matrix1 &C, const Matrix2 &A, const Matrix3 &B) const;
+
+ template <class Matrix1, class Matrix2, class Matrix3>
+ Matrix1& subSpecialized (Matrix1 &C, const Matrix2 &A, const Matrix3 &B,
+ MatrixCategories::RowMatrixTag,
+ MatrixCategories::RowMatrixTag,
+ MatrixCategories::RowMatrixTag) const
+ {
+ return subRow (C, A, B);
+ }
+ template <class Matrix1, class Matrix2, class Matrix3>
+ Matrix1& subSpecialized (Matrix1 &C, const Matrix2 &A, const Matrix3 &B,
+ MatrixCategories::ColMatrixTag,
+ MatrixCategories::ColMatrixTag,
+ MatrixCategories::ColMatrixTag) const
+ {
+ return subCol (C, A, B);
+ }
+ template <class Matrix1, class Matrix2, class Matrix3>
+ Matrix1& subSpecialized (Matrix1 &C, const Matrix2 &A, const Matrix3 &B,
+ MatrixCategories::RowColMatrixTag,
+ MatrixCategories::RowColMatrixTag,
+ MatrixCategories::RowColMatrixTag) const
+ {
+ return subRow (C, A, B);
+ }
+
+ template <class Matrix1, class Matrix2> Matrix1& subinRow (Matrix1 &A, const Matrix2 &B) const;
+ template <class Matrix1, class Matrix2> Matrix1& subinCol (Matrix1 &A, const Matrix2 &B) const;
+
+ template <class Matrix1, class Matrix2>
+ Matrix1& subinSpecialized (Matrix1 &A, const Matrix2 &B,
+ MatrixCategories::RowMatrixTag,
+ MatrixCategories::RowMatrixTag) const
+ {
+ return subinRow (A, B);
+ }
+ template <class Matrix1, class Matrix2>
+ Matrix1& subinSpecialized (Matrix1 &A, const Matrix2 &B,
+ MatrixCategories::ColMatrixTag,
+ MatrixCategories::ColMatrixTag) const
+ {
+ return subinCol (A, B);
+ }
+ template <class Matrix1, class Matrix2>
+ Matrix1& subinSpecialized (Matrix1 &A, const Matrix2 &B,
+ MatrixCategories::RowColMatrixTag,
+ MatrixCategories::RowColMatrixTag) const
+ {
+ return subinRow (A, B);
+ }
+
+ template <class Matrix1, class Matrix2> Matrix1& negRow (Matrix1 &A, const Matrix2 &B) const;
+ template <class Matrix1, class Matrix2> Matrix1& negCol (Matrix1 &A, const Matrix2 &B) const;
+
+ template <class Matrix1, class Matrix2>
+ inline Matrix1& negSpecialized (Matrix1 &A, const Matrix2 &B,
+ MatrixCategories::RowMatrixTag,
+ MatrixCategories::RowMatrixTag) const
+ {
+ return negRow (A, B);
+ }
+ template <class Matrix1, class Matrix2>
+ inline Matrix1& negSpecialized (Matrix1 &A, const Matrix2 &B,
+ MatrixCategories::ColMatrixTag,
+ MatrixCategories::ColMatrixTag) const
+ {
+ return negCol (A, B);
+ }
+ template <class Matrix1, class Matrix2>
+ inline Matrix1& negSpecialized (Matrix1 &A, const Matrix2 &B,
+ MatrixCategories::RowColMatrixTag,
+ MatrixCategories::RowColMatrixTag) const
+ {
+ return negRow (A, B);
+ }
+
+ template <class Matrix_> Matrix_ &neginRow (Matrix_ &A) const;
+ template <class Matrix_> Matrix_ &neginCol (Matrix_ &A) const;
+
+ template <class Matrix_>
+ Matrix_ &neginSpecialized (Matrix_ &A, MatrixCategories::RowMatrixTag) const
+ {
+ return neginRow (A);
+ }
+ template <class Matrix_>
+ Matrix_ &neginSpecialized (Matrix_ &A, MatrixCategories::ColMatrixTag) const
+ {
+ return neginCol (A);
+ }
+ template <class Matrix_>
+ Matrix_ &neginSpecialized (Matrix_ &A, MatrixCategories::RowColMatrixTag) const
+ {
+ return neginRow (A);
+ }
+
+ template <class Matrix1, class Matrix2, class Matrix3>
+ Matrix1 &mulRowRowCol (Matrix1 &C, const Matrix2 &A, const Matrix3 &B) const;
+ template <class Matrix1, class Matrix2, class Matrix3>
+ Matrix1 &mulColRowCol (Matrix1 &C, const Matrix2 &A, const Matrix3 &B) const;
+ template <class Matrix1, class Matrix2, class Matrix3>
+ Matrix1 &mulRowRowRow (Matrix1 &C, const Matrix2 &A, const Matrix3 &B) const;
+ template <class Matrix1, class Matrix2, class Matrix3>
+ Matrix1 &mulColColCol (Matrix1 &C, const Matrix2 &A, const Matrix3 &B) const;
+
+ template <class Matrix1, class Matrix2, class Matrix3>
+ Matrix1 &mulSpecialized (Matrix1 &C, const Matrix2 &A, const Matrix3 &B,
+ MatrixCategories::RowMatrixTag,
+ MatrixCategories::RowMatrixTag,
+ MatrixCategories::BlackboxTag) const
+ {
+ return blackboxMulRight(C, A, B);
+ }
+ template <class Matrix1, class Matrix2, class Matrix3>
+ Matrix1 &mulSpecialized (Matrix1 &C, const Matrix2 &A, const Matrix3 &B,
+ MatrixCategories::ColMatrixTag,
+ MatrixCategories::BlackboxTag,
+ MatrixCategories::ColMatrixTag) const
+ {
+ return blackboxMulLeft(C, A, B);
+ }
+ template <class Matrix1, class Matrix2, class Matrix3>
+ Matrix1 &mulSpecialized (Matrix1 &C, const Matrix2 &A, const Matrix3 &B,
+ MatrixCategories::RowMatrixTag,
+ MatrixCategories::RowMatrixTag,
+ MatrixCategories::ColMatrixTag) const
+ {
+ return mulRowRowCol (C, A, B);
+ }
+ template <class Matrix1, class Matrix2, class Matrix3>
+ Matrix1 &mulSpecialized (Matrix1 &C, const Matrix2 &A, const Matrix3 &B,
+ MatrixCategories::ColMatrixTag,
+ MatrixCategories::RowMatrixTag,
+ MatrixCategories::ColMatrixTag) const
+ {
+ return mulColRowCol (C, A, B);
+ }
+ template <class Matrix1, class Matrix2, class Matrix3>
+ Matrix1 &mulSpecialized (Matrix1 &C, const Matrix2 &A, const Matrix3 &B,
+ MatrixCategories::RowColMatrixTag,
+ MatrixCategories::RowMatrixTag,
+ MatrixCategories::ColMatrixTag) const
+ {
+ return mulRowRowCol (C, A, B);
+ }
+ template <class Matrix1, class Matrix2, class Matrix3>
+ Matrix1 &mulSpecialized (Matrix1 &C, const Matrix2 &A, const Matrix3 &B,
+ MatrixCategories::RowMatrixTag,
+ MatrixCategories::RowMatrixTag,
+ MatrixCategories::RowMatrixTag) const
+ {
+ return mulRowRowRow (C, A, B);
+ }
+ template <class Matrix1, class Matrix2, class Matrix3>
+ Matrix1 &mulSpecialized (Matrix1 &C, const Matrix2 &A, const Matrix3 &B,
+ MatrixCategories::ColMatrixTag,
+ MatrixCategories::ColMatrixTag,
+ MatrixCategories::ColMatrixTag) const
+ {
+ return mulColColCol (C, A, B);
+ }
+ template <class Matrix1, class Matrix2, class Matrix3>
+ Matrix1 &mulSpecialized (Matrix1 &C, const Matrix2 &A, const Matrix3 &B,
+ MatrixCategories::RowColMatrixTag,
+ MatrixCategories::RowColMatrixTag,
+ MatrixCategories::RowColMatrixTag) const
+ {
+ return mulRowRowCol (C, A, B);
+ }
+
+ template <class Matrix1, class Matrix2>
+ Matrix1 &mulRow (Matrix1 &C, const Matrix2 &B, const typename Field::Element &a) const;
+ template <class Matrix1, class Matrix2>
+ Matrix1 &mulCol (Matrix1 &C, const Matrix2 &B, const typename Field::Element &a) const;
+
+ template <class Matrix1, class Matrix2>
+ Matrix1 &mulSpecialized (Matrix1 &C, const Matrix2 &B, const typename Field::Element &a,
+ MatrixCategories::RowMatrixTag,
+ MatrixCategories::RowMatrixTag) const
+ {
+ return mulRow (C, B, a);
+ }
+ template <class Matrix1, class Matrix2>
+ Matrix1 &mulSpecialized (Matrix1 &C, const Matrix2 &B, const typename Field::Element &a,
+ MatrixCategories::ColMatrixTag,
+ MatrixCategories::ColMatrixTag) const
+ {
+ return mulCol (C, B, a);
+ }
+ template <class Matrix1, class Matrix2>
+ Matrix1 &mulSpecialized (Matrix1 &C, const Matrix2 &B, const typename Field::Element &a,
+ MatrixCategories::RowColMatrixTag,
+ MatrixCategories::RowColMatrixTag) const
+ {
+ return mulRow (C, B, a);
+ }
+
+ template <class Matrix_> Matrix_ &mulinRow (Matrix_ &B, const typename Field::Element &a) const;
+ template <class Matrix_> Matrix_ &mulinCol (Matrix_ &B, const typename Field::Element &a) const;
+
+ template <class Matrix_>
+ Matrix_ &mulinSpecialized (Matrix_ &B, const typename Field::Element &a,
+ MatrixCategories::RowMatrixTag) const
+ {
+ return mulinRow (B, a);
+ }
+ template <class Matrix_>
+ Matrix_ &mulinSpecialized (Matrix_ &B, const typename Field::Element &a,
+ MatrixCategories::ColMatrixTag) const
+ {
+ return mulinCol (B, a);
+ }
+ template <class Matrix_>
+ Matrix_ &mulinSpecialized (Matrix_ &B, const typename Field::Element &a,
+ MatrixCategories::RowColMatrixTag) const
+ {
+ return mulinRow (B, a);
+ }
+
+ template <class Matrix1, class Matrix2, class Matrix3>
+ Matrix1 &axpyinRowRowCol (Matrix1 &Y, const Matrix2 &A, const Matrix3 &X) const;
+ template <class Matrix1, class Matrix2, class Matrix3>
+ Matrix1 &axpyinColRowCol (Matrix1 &Y, const Matrix2 &A, const Matrix3 &X) const;
+ template <class Matrix1, class Matrix2, class Matrix3>
+ Matrix1 &axpyinRowRowRow (Matrix1 &Y, const Matrix2 &A, const Matrix3 &X) const;
+ template <class Matrix1, class Matrix2, class Matrix3>
+ Matrix1 &axpyinColColCol (Matrix1 &Y, const Matrix2 &A, const Matrix3 &X) const;
+
+ template <class Matrix1, class Matrix2, class Matrix3>
+ Matrix1 &axpyinSpecialized (Matrix1 &Y, const Matrix2 &A, const Matrix3 &X,
+ MatrixCategories::RowMatrixTag,
+ MatrixCategories::RowMatrixTag,
+ MatrixCategories::ColMatrixTag) const
+ {
+ return axpyinRowRowCol (Y, A, X);
+ }
+ template <class Matrix1, class Matrix2, class Matrix3>
+ Matrix1 &axpyinSpecialized (Matrix1 &Y, const Matrix2 &A, const Matrix3 &X,
+ MatrixCategories::ColMatrixTag,
+ MatrixCategories::RowMatrixTag,
+ MatrixCategories::ColMatrixTag) const
+ {
+ return axpyinColRowCol (Y, A, X);
+ }
+ template <class Matrix1, class Matrix2, class Matrix3>
+ Matrix1 &axpyinSpecialized (Matrix1 &Y, const Matrix2 &A, const Matrix3 &X,
+ MatrixCategories::RowColMatrixTag,
+ MatrixCategories::RowMatrixTag,
+ MatrixCategories::ColMatrixTag) const
+ {
+ return axpyinRowRowCol (Y, A, X);
+ }
+ template <class Matrix1, class Matrix2, class Matrix3>
+ Matrix1 &axpyinSpecialized (Matrix1 &Y, const Matrix2 &A, const Matrix3 &X,
+ MatrixCategories::RowMatrixTag,
+ MatrixCategories::RowMatrixTag,
+ MatrixCategories::RowMatrixTag) const
+ {
+ return axpyinRowRowRow (Y, A, X);
+ }
+
+ template <class Matrix1, class Matrix2, class Matrix3>
+ Matrix1 &axpyinSpecialized (Matrix1 &Y, const Matrix2 &A, const Matrix3 &X,
+ MatrixCategories::ColMatrixTag,
+ MatrixCategories::ColMatrixTag,
+ MatrixCategories::ColMatrixTag) const
+ {
+ return axpyinColColCol (Y, A, X);
+ }
+
+ template <class Matrix1, class Matrix2, class Matrix3>
+ Matrix1 &axpyinSpecialized (Matrix1 &Y, const Matrix2 &A, const Matrix3 &X,
+ MatrixCategories::RowColMatrixTag,
+ MatrixCategories::RowColMatrixTag,
+ MatrixCategories::RowColMatrixTag) const
+ {
+ return axpyinRowRowCol (Y, A, X);
+ }
+
+ template <class Vector1, class Matrix_, class Vector2>
+ Vector1 &mulRowSpecialized (Vector1 &w, const Matrix_ &A, const Vector2 &v,
+ VectorCategories::DenseVectorTag) const;
+ template <class Vector1, class Matrix_, class Vector2>
+ Vector1 &mulRowSpecialized (Vector1 &w, const Matrix_ &A, const Vector2 &v,
+ VectorCategories::SparseSequenceVectorTag) const;
+ template <class Vector1, class Matrix_, class Vector2>
+ Vector1 &mulRowSpecialized (Vector1 &w, const Matrix_ &A, const Vector2 &v,
+ VectorCategories::SparseAssociativeVectorTag) const;
+ template <class Vector1, class Matrix_, class Vector2>
+ Vector1 &mulRowSpecialized (Vector1 &w, const Matrix_ &A, const Vector2 &v,
+ VectorCategories::SparseParallelVectorTag) const;
+
+ template <class Vector1, class Matrix_, class Vector2>
+ Vector1 &mulColSpecialized (Vector1 &w, const Matrix_ &A, const Vector2 &v,
+ VectorCategories::DenseVectorTag,
+ VectorCategories::DenseVectorTag) const
+ {
+ return this->mulColDense (_VD, w, A, v);
+ }
+ template <class Vector1, class Matrix_, class Vector2>
+ Vector1 &mulColSpecialized (Vector1 &w, const Matrix_ &A, const Vector2 &v,
+ VectorCategories::DenseVectorTag,
+ VectorCategories::SparseSequenceVectorTag) const;
+ template <class Vector1, class Matrix_, class Vector2>
+ Vector1 &mulColSpecialized (Vector1 &w, const Matrix_ &A, const Vector2 &v,
+ VectorCategories::DenseVectorTag,
+ VectorCategories::SparseAssociativeVectorTag) const;
+ template <class Vector1, class Matrix_, class Vector2>
+ Vector1 &mulColSpecialized (Vector1 &w, const Matrix_ &A, const Vector2 &v,
+ VectorCategories::DenseVectorTag,
+ VectorCategories::SparseParallelVectorTag) const;
+
+ template <class Vector1, class Matrix_, class Vector2>
+ inline Vector1 &mulColSpecialized (Vector1 &w, const Matrix_ &A, const Vector2 &v,
+ VectorCategories::GenericVectorTag,
+ VectorCategories::GenericVectorTag) const
+ {
+ DenseVector y(field());
+
+ VectorWrapper::ensureDim (y, w.size ());
+
+ VectorWrapper::ensureDim (y, w.size ());
+
+ vectorMul (y, A, v);
+ _VD.copy (w, y);
+
+ return w;
+ }
+
+ template <class Vector1, class Matrix_, class Vector2>
+ Vector1 &mulSpecialized (Vector1 &w, const Matrix_ &A, const Vector2 &v,
+ MatrixCategories::RowMatrixTag) const
+ {
+ return mulRowSpecialized (w, A, v, typename VectorTraits<Vector1>::VectorCategory ());
+ }
+ template <class Vector1, class Matrix_, class Vector2>
+ Vector1 &mulSpecialized (Vector1 &w, const Matrix_ &A, const Vector2 &v,
+ MatrixCategories::ColMatrixTag) const
+ {
+ return mulColSpecialized (w, A, v,
+ typename VectorTraits<Vector1>::VectorCategory (),
+ typename VectorTraits<Vector2>::VectorCategory ());
+ }
+ template <class Vector1, class Matrix_, class Vector2>
+ Vector1 &mulSpecialized (Vector1 &w, const Matrix_ &A, const Vector2 &v,
+ MatrixCategories::RowColMatrixTag) const
+ {
+ return mulRowSpecialized (w, A, v, typename VectorTraits<Vector1>::VectorCategory ());
+ }
+
+ template <class Vector1, class Matrix_, class Vector2>
+ Vector1 &axpyinRowSpecialized (Vector1 &y, const Matrix_ &A, const Vector2 &x,
+ VectorCategories::DenseVectorTag) const;
+ template <class Vector1, class Matrix_, class Vector2>
+ Vector1 &axpyinRowSpecialized (Vector1 &y, const Matrix_ &A, const Vector2 &x,
+ VectorCategories::SparseSequenceVectorTag) const;
+ template <class Vector1, class Matrix_, class Vector2>
+ Vector1 &axpyinRowSpecialized (Vector1 &y, const Matrix_ &A, const Vector2 &x,
+ VectorCategories::SparseAssociativeVectorTag) const;
+ template <class Vector1, class Matrix_, class Vector2>
+ Vector1 &axpyinRowSpecialized (Vector1 &y, const Matrix_ &A, const Vector2 &x,
+ VectorCategories::SparseParallelVectorTag) const;
+
+ template <class Vector1, class Matrix_, class Vector2>
+ Vector1 &axpyinColSpecialized (Vector1 &y, const Matrix_ &A, const Vector2 &x,
+ VectorCategories::DenseVectorTag) const;
+ template <class Vector1, class Matrix_, class Vector2>
+ Vector1 &axpyinColSpecialized (Vector1 &y, const Matrix_ &A, const Vector2 &x,
+ VectorCategories::SparseSequenceVectorTag) const;
+ template <class Vector1, class Matrix_, class Vector2>
+ Vector1 &axpyinColSpecialized (Vector1 &y, const Matrix_ &A, const Vector2 &x,
+ VectorCategories::SparseAssociativeVectorTag) const;
+ template <class Vector1, class Matrix_, class Vector2>
+ Vector1 &axpyinColSpecialized (Vector1 &y, const Matrix_ &A, const Vector2 &x,
+ VectorCategories::SparseParallelVectorTag) const;
+
+ template <class Vector1, class Matrix_, class Vector2>
+ Vector1 &axpyinSpecialized (Vector1 &y, const Matrix_ &A, const Vector2 &x,
+ MatrixCategories::RowMatrixTag) const
+ {
+ return axpyinRowSpecialized (y, A, x, typename VectorTraits<Vector1>::VectorCategory ());
+ }
+ template <class Vector1, class Matrix_, class Vector2>
+ Vector1 &axpyinSpecialized (Vector1 &y, const Matrix_ &A, const Vector2 &x,
+ MatrixCategories::ColMatrixTag) const
+ {
+ return axpyinColSpecialized (y, A, x, typename VectorTraits<Vector1>::VectorCategory ());
+ }
+ template <class Vector1, class Matrix_, class Vector2>
+ Vector1 &axpyinSpecialized (Vector1 &y, const Matrix_ &A, const Vector2 &x,
+ MatrixCategories::RowColMatrixTag) const
+ {
+ return axpyinRowSpecialized (y, A, x, typename VectorTraits<Vector1>::VectorCategory ());
+ }
+
+ template <class Matrix_, class Iterator>
+ inline Matrix_ &permuteRowsByRow (Matrix_ &A,
+ Iterator P_start,
+ Iterator P_end) const;
+
+ template <class Matrix_, class Iterator>
+ inline Matrix_ &permuteRowsByCol (Matrix_ &A,
+ Iterator P_start,
+ Iterator P_end) const;
+
+ template <class Matrix_, class Iterator>
+ inline Matrix_ &permuteRowsSpecialized (Matrix_ &A,
+ Iterator P_start,
+ Iterator P_end,
+ MatrixCategories::RowColMatrixTag) const
+ {
+ return permuteRowsByCol (A, P_start, P_end);
+ }
+
+ template <class Matrix_, class Iterator>
+ inline Matrix_ &permuteRowsSpecialized (Matrix_ &A,
+ Iterator P_start,
+ Iterator P_end,
+ MatrixCategories::RowMatrixTag) const
+ {
+ return permuteRowsByRow (A, P_start, P_end);
+ }
+
+ template <class Matrix_, class Iterator>
+ inline Matrix_ &permuteRowsSpecialized (Matrix_ &A,
+ Iterator P_start,
+ Iterator P_end,
+ MatrixCategories::ColMatrixTag) const
+ {
+ return permuteRowsByCol (A, P_start, P_end);
+ }
+
+ template <class Matrix_, class Iterator>
+ inline Matrix_ &permuteColsByRow (Matrix_ &A,
+ Iterator P_start,
+ Iterator P_end) const;
+
+ template <class Matrix_, class Iterator>
+ inline Matrix_ &permuteColsByCol (Matrix_ &A,
+ Iterator P_start,
+ Iterator P_end) const;
+
+ template <class Matrix_, class Iterator>
+ inline Matrix_ &permuteColsSpecialized (Matrix_ &A,
+ Iterator P_start,
+ Iterator P_end,
+ MatrixCategories::RowColMatrixTag) const
+ {
+ return permuteColsByRow (A, P_start, P_end);
+ }
+
+ template <class Matrix_, class Iterator>
+ inline Matrix_ &permuteColsSpecialized (Matrix_ &A,
+ Iterator P_start,
+ Iterator P_end,
+ MatrixCategories::RowMatrixTag) const
+ {
+ return permuteColsByRow (A, P_start, P_end);
+ }
+
+ template <class Matrix_, class Iterator>
+ inline Matrix_ &permuteColsSpecialized (Matrix_ &A,
+ Iterator P_start,
+ Iterator P_end,
+ MatrixCategories::ColMatrixTag) const
+ {
+ return permuteColsByCol (A, P_start, P_end);
+ }
+
+ const Field *_field;
+ VectorDomain<Field> _VD;
+ }; //MatrixDomain
+
+}
+
+#include "linbox/matrix/matrixdomain/matrix-domain.inl"
+
+#endif // __LINBOX_matrix_domain_H
+
+
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
+
diff --git a/linbox/matrix/matrixdomain/matrix-domain.inl b/linbox/matrix/matrixdomain/matrix-domain.inl
new file mode 100644
index 0000000..a057043
--- /dev/null
+++ b/linbox/matrix/matrixdomain/matrix-domain.inl
@@ -0,0 +1,1200 @@
+
+/* linbox/matrix/matrix-domain.inl
+ * Copyright (C) 2002 Bradford Hovinen
+ *
+ * Written by Bradford Hovinen <bghovinen at math.uwaterloo.ca>
+ *
+ * ------------------------------------
+ *
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ * ========LICENCE========
+ *.
+ */
+
+#ifndef __LINBOX_matrix_domain_INL
+#define __LINBOX_matrix_domain_INL
+
+#include <linbox/linbox-config.h>
+#include "linbox/matrix/transpose-matrix.h"
+#include "linbox/blackbox/dif.h"
+
+namespace LinBox
+{
+
+ template<class Field>
+ template <class Matrix1, class Matrix2>
+ Matrix1 &MatrixDomain<Field>::copyRow (Matrix1 &A, const Matrix2 &B) const
+ {
+ linbox_check (A.rowdim () == B.rowdim ());
+ linbox_check (A.coldim () == B.coldim ());
+
+ typename Matrix1::RowIterator i;
+ typename Matrix2::ConstRowIterator j;
+
+ i = A.rowBegin ();
+ j = B.rowBegin ();
+
+ for (; i != A.rowEnd (); ++i, ++j)
+ _VD.copy (*i, *j);
+
+ return A;
+ }
+
+ template<class Field>
+ template <class Matrix1, class Matrix2>
+ Matrix1 &MatrixDomain<Field>::copyCol (Matrix1 &A, const Matrix2 &B) const
+ {
+ linbox_check (A.rowdim () == B.rowdim ());
+ linbox_check (A.coldim () == B.coldim ());
+
+ typename Matrix1::ColIterator i;
+ typename Matrix2::ConstColIterator j;
+
+ i = A.colBegin ();
+ j = B.colBegin ();
+
+ for (; i != A.colEnd (); ++i, ++j)
+ _VD.copy (*i, *j);
+
+ return A;
+ }
+
+ template<class Field>
+ template <class Matrix1, class Matrix2>
+ bool MatrixDomain<Field>::areEqualBB (const Matrix1 &A, const Matrix2 &B) const
+ { Dif<Matrix1, Matrix2> C(A, B); return isZero(C); }
+
+ template<class Field>
+ template <class Matrix1, class Matrix2>
+ bool MatrixDomain<Field>::areEqualRow (const Matrix1 &A, const Matrix2 &B) const
+ {
+ linbox_check (A.rowdim () == B.rowdim ());
+ linbox_check (A.coldim () == B.coldim ());
+
+ typename Matrix1::ConstRowIterator i;
+ typename Matrix2::ConstRowIterator j;
+
+ i = A.rowBegin ();
+ j = B.rowBegin ();
+
+ for (; i != A.rowEnd (); ++i, ++j)
+ if (!_VD.areEqual (*i, *j))
+ return false;
+
+ return true;
+ }
+
+ template<class Field>
+ template <class Matrix1, class Matrix2>
+ bool MatrixDomain<Field>::areEqualCol (const Matrix1 &A, const Matrix2 &B) const
+ {
+ linbox_check (A.rowdim () == B.rowdim ());
+ linbox_check (A.coldim () == B.coldim ());
+
+ typename Matrix1::ConstColIterator i;
+ typename Matrix2::ConstColIterator j;
+
+ i = A.colBegin ();
+ j = B.colBegin ();
+
+ for (; i != A.colEnd (); ++i, ++j)
+ if (!_VD.areEqual (*i, *j))
+ return false;
+
+ return true;
+ }
+
+ template<class Field>
+ template <class Matrix_>
+ bool MatrixDomain<Field>::isZeroBB (const Matrix_ &A) const
+ {
+ VectorDomain<Field> VD(A.field());
+ std::vector<typename Field::Element> x(A.coldim()), y(A.rowdim());
+ VD.random(x);
+ A.apply(y, x);
+ return VD.isZero(y);
+ }
+
+ template<class Field>
+ template <class Matrix_>
+ bool MatrixDomain<Field>::isZeroRow (const Matrix_ &A) const
+ {
+ typename Matrix_::ConstRowIterator i;
+
+ i = A.rowBegin ();
+
+ for (; i != A.rowEnd (); ++i)
+ if (!_VD.isZero (*i))
+ return false;
+
+ return true;
+ }
+
+ template<class Field>
+ template <class Matrix_>
+ bool MatrixDomain<Field>::isZeroCol (const Matrix_ &A) const
+ {
+ typename Matrix::ConstColIterator i;
+
+ i = A.colBegin ();
+
+ for (; i != A.colEnd (); ++i)
+ if (!_VD.isZero (*i))
+ return false;
+
+ return true;
+ }
+
+ template<class Field>
+ template <class Matrix1, class Matrix2, class Matrix3>
+ Matrix1 &MatrixDomain<Field>::addRow (Matrix1 &C, const Matrix2 &A, const Matrix3 &B) const
+ {
+ linbox_check (A.rowdim () == B.rowdim ());
+ linbox_check (A.coldim () == B.coldim ());
+ linbox_check (A.rowdim () == C.rowdim ());
+ linbox_check (A.coldim () == C.coldim ());
+
+ typename Matrix1::RowIterator i;
+ typename Matrix2::ConstRowIterator j;
+ typename Matrix3::ConstRowIterator k;
+
+ i = C.rowBegin ();
+ j = A.rowBegin ();
+ k = B.rowBegin ();
+
+ for (; i != C.rowEnd (); ++i, ++j, ++k)
+ _VD.add (*i, *j, *k);
+
+ return C;
+ }
+
+ template<class Field>
+ template <class Matrix1, class Matrix2, class Matrix3>
+ Matrix1 &MatrixDomain<Field>::addCol (Matrix1 &C, const Matrix2 &A, const Matrix3 &B) const
+ {
+ linbox_check (A.rowdim () == B.rowdim ());
+ linbox_check (A.coldim () == B.coldim ());
+ linbox_check (A.rowdim () == C.rowdim ());
+ linbox_check (A.coldim () == C.coldim ());
+
+ typename Matrix1::ColIterator i;
+ typename Matrix2::ConstColIterator j;
+ typename Matrix3::ConstColIterator k;
+
+ i = C.colBegin ();
+ j = A.colBegin ();
+ k = B.colBegin ();
+
+ for (; i != C.colEnd (); ++i, ++j, ++k)
+ _VD.add (*i, *j, *k);
+
+ return C;
+ }
+
+ template<class Field>
+ template <class Matrix1, class Matrix2>
+ Matrix1 &MatrixDomain<Field>::addinRow (Matrix1 &A, const Matrix2 &B) const
+ {
+ linbox_check (A.rowdim () == B.rowdim ());
+ linbox_check (A.coldim () == B.coldim ());
+
+ typename Matrix1::RowIterator i;
+ typename Matrix2::ConstRowIterator j;
+
+ i = A.rowBegin ();
+ j = B.rowBegin ();
+
+ for (; i != A.rowEnd (); ++i, ++j)
+ _VD.addin (*i, *j);
+
+ return A;
+ }
+
+ template<class Field>
+ template <class Matrix1, class Matrix2>
+ Matrix1 &MatrixDomain<Field>::addinCol (Matrix1 &A, const Matrix2 &B) const
+ {
+ linbox_check (A.rowdim () == B.rowdim ());
+ linbox_check (A.coldim () == B.coldim ());
+
+ typename Matrix1::ColIterator i;
+ typename Matrix2::ConstColIterator j;
+
+ i = A.colBegin ();
+ j = B.colBegin ();
+
+ for (; i != A.colEnd (); ++i, ++j)
+ _VD.addin (*i, *j);
+
+ return A;
+ }
+
+ template<class Field>
+ template <class Matrix1, class Matrix2, class Matrix3>
+ Matrix1 &MatrixDomain<Field>::subRow (Matrix1 &C, const Matrix2 &A, const Matrix3 &B) const
+ {
+ linbox_check (A.rowdim () == B.rowdim ());
+ linbox_check (A.coldim () == B.coldim ());
+ linbox_check (A.rowdim () == C.rowdim ());
+ linbox_check (A.coldim () == C.coldim ());
+
+ typename Matrix1::RowIterator i;
+ typename Matrix2::ConstRowIterator j;
+ typename Matrix3::ConstRowIterator k;
+
+ i = C.rowBegin ();
+ j = A.rowBegin ();
+ k = B.rowBegin ();
+
+ for (; i != C.rowEnd (); ++i, ++j, ++k)
+ _VD.sub (*i, *j, *k);
+
+ return C;
+ }
+
+ template<class Field>
+ template <class Matrix1, class Matrix2, class Matrix3>
+ Matrix1 &MatrixDomain<Field>::subCol (Matrix1 &C, const Matrix2 &A, const Matrix3 &B) const
+ {
+ linbox_check (A.rowdim () == B.rowdim ());
+ linbox_check (A.coldim () == B.coldim ());
+ linbox_check (A.rowdim () == C.rowdim ());
+ linbox_check (A.coldim () == C.coldim ());
+
+ typename Matrix1::ColIterator i;
+ typename Matrix2::ConstColIterator j;
+ typename Matrix3::ConstColIterator k;
+
+ i = C.colBegin ();
+ j = A.colBegin ();
+ k = B.colBegin ();
+
+ for (; i != C.colEnd (); ++i, ++j, ++k)
+ _VD.sub (*i, *j, *k);
+
+ return C;
+ }
+
+ template<class Field>
+ template <class Matrix1, class Matrix2>
+ Matrix1 &MatrixDomain<Field>::subinRow (Matrix1 &A, const Matrix2 &B) const
+ {
+ linbox_check (A.rowdim () == B.rowdim ());
+ linbox_check (A.coldim () == B.coldim ());
+
+ typename Matrix1::RowIterator i;
+ typename Matrix2::ConstRowIterator j;
+
+ i = A.rowBegin ();
+ j = B.rowBegin ();
+
+ for (; i != A.rowEnd (); ++i, ++j)
+ _VD.subin (*i, *j);
+
+ return A;
+ }
+
+ template<class Field>
+ template <class Matrix1, class Matrix2>
+ Matrix1 &MatrixDomain<Field>::subinCol (Matrix1 &A, const Matrix2 &B) const
+ {
+ linbox_check (A.rowdim () == B.rowdim ());
+ linbox_check (A.coldim () == B.coldim ());
+
+ typename Matrix1::ColIterator i;
+ typename Matrix2::ConstColIterator j;
+
+ i = A.colBegin ();
+ j = B.colBegin ();
+
+ for (; i != A.colEnd (); ++i, ++j)
+ _VD.subin (*i, *j);
+
+ return A;
+ }
+
+ template<class Field>
+ template <class Matrix1, class Matrix2>
+ Matrix1 &MatrixDomain<Field>::negRow (Matrix1 &A, const Matrix2 &B) const
+ {
+ linbox_check (A.rowdim () == B.rowdim ());
+ linbox_check (A.coldim () == B.coldim ());
+
+ typename Matrix1::RowIterator i;
+ typename Matrix2::ConstRowIterator j;
+
+ i = A.rowBegin ();
+ j = B.rowBegin ();
+
+ for (; i != A.rowEnd (); ++i, ++j)
+ _VD.neg (*i, *j);
+
+ return A;
+ }
+
+ template<class Field>
+ template <class Matrix1, class Matrix2>
+ Matrix1 &MatrixDomain<Field>::negCol (Matrix1 &A, const Matrix2 &B) const
+ {
+ linbox_check (A.rowdim () == B.rowdim ());
+ linbox_check (A.coldim () == B.coldim ());
+
+ typename Matrix1::ColIterator i;
+ typename Matrix2::ConstColIterator j;
+
+ i = A.colBegin ();
+ j = B.colBegin ();
+
+ for (; i != A.colEnd (); ++i, ++j)
+ _VD.neg (*i, *j);
+
+ return A;
+ }
+
+ template<class Field>
+ template <class Matrix_>
+ Matrix_ &MatrixDomain<Field>::neginRow (Matrix_ &A) const
+ {
+ typename Matrix_::RowIterator i;
+
+ for (i = A.rowBegin (); i != A.rowEnd (); ++i)
+ _VD.negin (*i);
+
+ return A;
+ }
+
+ template<class Field>
+ template <class Matrix_>
+ Matrix_ &MatrixDomain<Field>::neginCol (Matrix_ &A) const
+ {
+ typename Matrix_::ColIterator i;
+
+ for (i = A.colBegin (); i != A.colEnd (); ++i)
+ _VD.negin (*i);
+
+ return A;
+ }
+
+ template<class Field>
+ template <class Matrix1, class Matrix2, class Matrix3>
+ Matrix1 &MatrixDomain<Field>::mulRowRowCol (Matrix1 &C, const Matrix2 &A, const Matrix3 &B) const
+ {
+ linbox_check (A.coldim () == B.rowdim ());
+ linbox_check (A.rowdim () == C.rowdim ());
+ linbox_check (B.coldim () == C.coldim ());
+
+ typename Matrix2::ConstRowIterator i;
+ typename Matrix3::ConstColIterator j;
+ typename Matrix1::RowIterator l1;
+ typename Matrix1::Row::iterator l2;
+
+ for (i = A.rowBegin (), l1 = C.rowBegin (); i != A.rowEnd (); ++i, ++l1)
+ for (j = B.colBegin (), l2 = l1->begin (); j != B.colEnd (); ++j, ++l2)
+ _VD.dot (*l2, *i, *j);
+
+ return C;
+ }
+
+ template<class Field>
+ template <class Matrix1, class Matrix2, class Matrix3>
+ Matrix1 &MatrixDomain<Field>::mulColRowCol (Matrix1 &C, const Matrix2 &A, const Matrix3 &B) const
+ {
+ linbox_check (A.coldim () == B.rowdim ());
+ linbox_check (A.rowdim () == C.rowdim ());
+ linbox_check (B.coldim () == C.coldim ());
+
+ typename Matrix2::ConstRowIterator i;
+ typename Matrix3::ConstColIterator j;
+ typename Matrix1::ColIterator l1;
+ typename Matrix1::Col::iterator l2;
+
+ for (j = B.colBegin (), l1 = C.colBegin (); j != B.colEnd (); ++j, ++l1)
+ for (i = A.rowBegin (), l2 = l1->begin (); i != A.rowEnd (); ++i, ++l2)
+ _VD.dot (*l2, *i, *j);
+
+ return C;
+ }
+
+ template<class Field>
+ template <class Matrix1, class Matrix2, class Matrix3>
+ Matrix1 &MatrixDomain<Field>::mulRowRowRow (Matrix1 &C, const Matrix2 &A, const Matrix3 &B) const
+ {
+ linbox_check (A.coldim () == B.rowdim ());
+ linbox_check (A.rowdim () == C.rowdim ());
+ linbox_check (B.coldim () == C.coldim ());
+
+ typename Matrix2::ConstRowIterator i = A.rowBegin ();
+ typename Matrix1::RowIterator j = C.rowBegin ();
+
+ TransposeMatrix<const Matrix3> BT (B);
+
+ for (; i != A.rowEnd (); ++i, ++j)
+ vectorMul (*j, BT, *i);
+
+ return C;
+ }
+
+ template<class Field>
+ template <class Matrix1, class Matrix2, class Matrix3>
+ Matrix1 &MatrixDomain<Field>::mulColColCol (Matrix1 &C, const Matrix2 &A, const Matrix3 &B) const
+ {
+ linbox_check (A.coldim () == B.rowdim ());
+ linbox_check (A.rowdim () == C.rowdim ());
+ linbox_check (B.coldim () == C.coldim ());
+
+ typename Matrix3::ConstColIterator i = B.colBegin ();
+ typename Matrix1::ColIterator j = C.colBegin ();
+
+ for (; i != B.colEnd (); ++i, ++j)
+ vectorMul (*j, A, *i);
+
+ return C;
+ }
+
+ template<class Field>
+ template <class Matrix1, class Matrix2>
+ Matrix2 &MatrixDomain<Field>::leftMulin (const Matrix1 &A, Matrix2 &B) const
+ {
+ linbox_check (A.rowdim () == A.coldim ());
+ linbox_check (A.coldim () == B.rowdim ());
+
+ DenseVector t (field(),A.rowdim ());
+
+ typename Matrix2::ColIterator i;
+ typename Matrix1::ConstRowIterator j;
+
+ typename DenseVector::iterator k;
+
+ for (i = B.colBegin (); i != B.colEnd (); ++i) {
+ for (j = A.rowBegin (), k = t.begin (); j != A.rowEnd (); ++j, ++k)
+ _VD.dot (*k, *j, *i);
+
+ _VD.copy (*i, t);
+ }
+
+ return B;
+ }
+
+ template<class Field>
+ template <class Matrix1, class Matrix2>
+ Matrix1 &MatrixDomain<Field>::rightMulin (Matrix1 &A, const Matrix2 &B) const
+ {
+ linbox_check (A.coldim () == B.rowdim ());
+ linbox_check (B.rowdim () == B.coldim ());
+
+ DenseVector t (field(),B.coldim ());
+
+ typename Matrix1::RowIterator i;
+ typename Matrix2::ConstColIterator j;
+
+ typename DenseVector::iterator k;
+
+ for (i = A.rowBegin (); i != A.rowEnd (); ++i) {
+ for (j = B.colBegin (), k = t.begin (); j != B.colEnd (); ++j, ++k)
+ _VD.dot (*k, *i, *j);
+
+ _VD.copy (*i, t);
+ }
+
+ return A;
+ }
+
+ template<class Field>
+ template <class Matrix1, class Matrix2>
+ Matrix1 &MatrixDomain<Field>::mulRow (Matrix1 &C, const Matrix2 &B, const typename Field::Element &a) const
+ {
+ linbox_check (C.rowdim () == B.rowdim ());
+ linbox_check (C.coldim () == B.coldim ());
+
+ typename Matrix1::RowIterator i;
+ typename Matrix2::ConstRowIterator j;
+
+ i = C.rowBegin ();
+ j = B.rowBegin ();
+
+ for (; i != C.rowEnd (); ++i, ++j)
+ _VD.mul (*i, *j, a);
+
+ return C;
+ }
+
+ template<class Field>
+ template <class Matrix1, class Matrix2>
+ Matrix1 &MatrixDomain<Field>::mulCol (Matrix1 &C, const Matrix2 &B, const typename Field::Element &a) const
+ {
+ linbox_check (C.rowdim () == B.rowdim ());
+ linbox_check (C.coldim () == B.coldim ());
+
+ typename Matrix1::ColIterator i;
+ typename Matrix2::ConstColIterator j;
+
+ i = C.colBegin ();
+ j = B.colBegin ();
+
+ for (; i != C.colEnd (); ++i, ++j)
+ _VD.mul (*i, *j, a);
+
+ return C;
+ }
+
+ template<class Field>
+ template <class Matrix_>
+ Matrix_ &MatrixDomain<Field>::mulinRow (Matrix_ &B, const typename Field::Element &a) const
+ {
+ typename Matrix_::RowIterator i;
+
+ for (i = B.rowBegin (); i != B.rowEnd (); ++i)
+ _VD.mulin (*i, a);
+
+ return B;
+ }
+
+ template<class Field>
+ template <class Matrix_>
+ Matrix_ &MatrixDomain<Field>::mulinCol (Matrix_ &B, const typename Field::Element &a) const
+ {
+ typename Matrix_::ColIterator i;
+
+ for (i = B.colBegin (); i != B.colEnd (); ++i)
+ _VD.mulin (*i, a);
+
+ return B;
+ }
+
+ template<class Field>
+ template <class Matrix1, class Matrix2, class Matrix3>
+ Matrix1 &MatrixDomain<Field>::axpyinRowRowCol (Matrix1 &Y, const Matrix2 &A, const Matrix3 &X) const
+ {
+ linbox_check (A.coldim () == X.rowdim ());
+ linbox_check (A.rowdim () == Y.rowdim ());
+ linbox_check (X.coldim () == Y.coldim ());
+
+ typename Matrix2::ConstRowIterator i;
+ typename Matrix3::ConstColIterator j;
+ typename Matrix1::RowIterator l1;
+ typename Matrix1::Row::iterator l2;
+
+ typename Field::Element t;
+
+ for (i = A.rowBegin (), l1 = Y.rowBegin (); i != A.rowEnd (); ++i, ++l1) {
+ for (j = X.colBegin (), l2 = l1->begin (); j != X.colEnd (); ++j, ++l2) {
+ _VD.dot (t, *i, *j);
+ field().addin (*l2, t);
+ }
+ }
+
+ return Y;
+ }
+
+ template<class Field>
+ template <class Matrix1, class Matrix2, class Matrix3>
+ Matrix1 &MatrixDomain<Field>::axpyinColRowCol (Matrix1 &Y, const Matrix2 &A, const Matrix3 &X) const
+ {
+ linbox_check (A.coldim () == X.rowdim ());
+ linbox_check (A.rowdim () == Y.rowdim ());
+ linbox_check (X.coldim () == Y.coldim ());
+
+ typename Matrix2::ConstRowIterator i;
+ typename Matrix3::ConstColIterator j;
+ typename Matrix1::ColIterator l1;
+ typename Matrix1::Col::iterator l2;
+
+ typename Field::Element t;
+
+ for (j = X.colBegin (), l1 = Y.colBegin (); j != X.colEnd (); ++j, ++l1) {
+ for (i = A.rowBegin (), l2 = l1->begin (); i != A.rowEnd (); ++i, ++l2) {
+ _VD.dot (t, *i, *j);
+ field().addin (*l2, t);
+ }
+ }
+
+ return Y;
+ }
+
+ template<class Field>
+ template <class Matrix1, class Matrix2, class Matrix3>
+ Matrix1 &MatrixDomain<Field>::axpyinRowRowRow (Matrix1 &Y, const Matrix2 &A, const Matrix3 &X) const
+ {
+ linbox_check (A.coldim () == X.rowdim ());
+ linbox_check (A.rowdim () == Y.rowdim ());
+ linbox_check (X.coldim () == Y.coldim ());
+
+ DenseVector t (field(),X.coldim ());
+
+ typename Matrix2::ConstRowIterator i = A.rowBegin ();
+ typename Matrix1::RowIterator j = Y.rowBegin ();
+
+ TransposeMatrix<const Matrix3> XT (X);
+
+ for (; i != A.rowEnd (); ++i, ++j) {
+ vectorMul (t, XT, *i);
+ _VD.addin (*j, t);
+ }
+
+ return Y;
+ }
+
+ template<class Field>
+ template <class Matrix1, class Matrix2, class Matrix3>
+ Matrix1 &MatrixDomain<Field>::axpyinColColCol (Matrix1 &Y, const Matrix2 &A, const Matrix3 &X) const
+ {
+ linbox_check (A.coldim () == X.rowdim ());
+ linbox_check (A.rowdim () == Y.rowdim ());
+ linbox_check (X.coldim () == Y.coldim ());
+
+ DenseVector t (field(),A.rowdim ());
+
+ typename Matrix3::ConstColIterator i = X.colBegin ();
+ typename Matrix1::ColIterator j = Y.colBegin ();
+
+ for (; i != X.colEnd (); ++i, ++j) {
+ vectorMul (t, A, *i);
+ _VD.addin (*j, t);
+ }
+
+ return Y;
+ }
+
+ template<class Field>
+ template <class Vector1, class Matrix_, class Vector2>
+ Vector1 &MatrixDomain<Field>::mulRowSpecialized (Vector1 &w, const Matrix_ &A, const Vector2 &v,
+ VectorCategories::DenseVectorTag) const
+ {
+ linbox_check (A.coldim () == v.size ());
+ linbox_check (A.rowdim () == w.size ());
+
+ typename Matrix_::ConstRowIterator i = A.rowBegin ();
+ typename Vector1::iterator j = w.begin ();
+
+ // JGD 02.09.2008 : when sizes differ
+ // A must decide if dot is possible, not w
+ // for (; j != w.end (); ++j, ++i)
+ // _VD.dot (*j, v, *i);
+ for (; i != A.rowEnd (); ++j, ++i) {
+ linbox_check(j != w.end());
+ this->_VD.dot (*j, v, *i);
+ }
+
+ return w;
+ }
+
+ template<class Field>
+ template <class Vector1, class Matrix_, class Vector2>
+ Vector1 &MatrixDomain<Field>::mulRowSpecialized (Vector1 &w, const Matrix_ &A, const Vector2 &v,
+ VectorCategories::SparseSequenceVectorTag) const
+ {
+ typename Matrix_::ConstRowIterator i = A.rowBegin ();
+ typename Field::Element t;
+ unsigned int idx = 0;
+
+ w.clear ();
+
+ for (; i != A.rowEnd (); ++i, ++idx) {
+ _VD.dot (t, v, *i);
+
+ if (!field().isZero (t))
+ w.push_back (std::pair<size_t, typename Field::Element> (idx, t));
+ }
+
+ return w;
+ }
+
+ template<class Field>
+ template <class Vector1, class Matrix_, class Vector2>
+ Vector1 &MatrixDomain<Field>::mulRowSpecialized (Vector1 &w, const Matrix_ &A, const Vector2 &v,
+ VectorCategories::SparseAssociativeVectorTag) const
+ {
+ typename Matrix_::ConstRowIterator i = A.rowBegin ();
+ typename Field::Element t;
+ unsigned int idx = 0;
+
+ w.clear ();
+
+ for (; i != A.rowEnd (); ++i, ++idx) {
+ _VD.dot (t, v, *i);
+
+ if (!field().isZero (t))
+ w[idx] = t;
+ }
+
+ return w;
+ }
+
+ template<class Field>
+ template <class Vector1, class Matrix_, class Vector2>
+ Vector1 &MatrixDomain<Field>::mulRowSpecialized (Vector1 &w, const Matrix_ &A, const Vector2 &v,
+ VectorCategories::SparseParallelVectorTag) const
+ {
+ typename Matrix_::ConstRowIterator i = A.rowBegin ();
+ typename Field::Element t;
+ unsigned int idx = 0;
+
+ w.first.clear ();
+ w.second.clear ();
+
+ for (; i != A.rowEnd (); ++i, ++idx) {
+ _VD.dot (t, v, *i);
+
+ if (!field().isZero (t)) {
+ w.first.push_back (idx);
+ w.second.push_back (t);
+ }
+ }
+
+ return w;
+ }
+
+ template<class Field>
+ template <class Vector1, class Matrix_, class Vector2>
+ Vector1 &MVProductDomain<Field>::mulColDense
+ (const VectorDomain<Field> &VD, Vector1 &w, const Matrix_ &A, const Vector2 &v) const
+ {
+ linbox_check (A.coldim () == v.size ());
+ linbox_check (A.rowdim () == w.size ());
+
+ typename Matrix_::ConstColIterator i = A.colBegin ();
+ typename Vector2::const_iterator j = v.begin ();
+
+ VD.subin (w, w);
+
+ for (; j != v.end (); ++j, ++i)
+ VD.axpyin (w, *j, *i);
+
+ return w;
+ }
+
+ template<class Field>
+ template <class Vector1, class Matrix_, class Vector2>
+ Vector1 &MatrixDomain<Field>::mulColSpecialized (Vector1 &w, const Matrix_ &A, const Vector2 &v,
+ VectorCategories::DenseVectorTag,
+ VectorCategories::SparseSequenceVectorTag) const
+ {
+ linbox_check (A.rowdim () == w.size ());
+
+ typename Vector2::const_iterator j = v.begin ();
+
+ _VD.subin (w, w);
+
+ for (; j != v.end (); ++j) {
+ typename Matrix_::ConstColIterator i = A.colBegin () + j->first;
+ _VD.axpyin (w, j->second, *i);
+ }
+
+ return w;
+ }
+
+ template<class Field>
+ template <class Vector1, class Matrix_, class Vector2>
+ Vector1 &MatrixDomain<Field>::mulColSpecialized (Vector1 &w, const Matrix_ &A, const Vector2 &v,
+ VectorCategories::DenseVectorTag,
+ VectorCategories::SparseAssociativeVectorTag) const
+ {
+ linbox_check (A.rowdim () == w.size ());
+
+ typename Vector2::const_iterator j = v.begin ();
+
+ _VD.subin (w, w);
+
+ for (; j != v.end (); ++j) {
+ typename Matrix_::ConstColIterator i = A.colBegin () + j->first;
+ _VD.axpyin (w, j->second, *i);
+ }
+
+ return w;
+ }
+
+ template<class Field>
+ template <class Vector1, class Matrix_, class Vector2>
+ Vector1 &MatrixDomain<Field>::mulColSpecialized (Vector1 &w, const Matrix_ &A, const Vector2 &v,
+ VectorCategories::DenseVectorTag,
+ VectorCategories::SparseParallelVectorTag) const
+ {
+ linbox_check (A.rowdim () == w.size ());
+
+ typename Vector2::first_type::const_iterator j_idx = v.first.begin ();
+ typename Vector2::second_type::const_iterator j_elt = v.second.begin ();
+
+ _VD.subin (w, w);
+
+ for (; j_idx != v.first.end (); ++j_idx, ++j_elt) {
+ typename Matrix_::ConstColIterator i = A.colBegin () + (ptrdiff_t)*j_idx;
+ _VD.axpyin (w, *j_elt, *i);
+ }
+
+ return w;
+ }
+
+ template<class Field>
+ template <class Vector1, class Matrix_, class Vector2>
+ Vector1 &MatrixDomain<Field>::axpyinRowSpecialized (Vector1 &y, const Matrix_ &A, const Vector2 &x,
+ VectorCategories::DenseVectorTag) const
+ {
+ linbox_check (A.coldim () == x.size ());
+ linbox_check (A.rowdim () == y.size ());
+
+ typename Matrix_::ConstRowIterator i = A.rowBegin ();
+ typename Vector1::iterator j = y.begin ();
+
+ typename Field::Element t;
+
+ for (; j != y.end (); ++j, ++i) {
+ _VD.dot (t, x, *i);
+ field().addin (*j, t);
+ }
+
+ return y;
+ }
+
+ template<class Field>
+ template <class Vector1, class Matrix_, class Vector2>
+ Vector1 &MatrixDomain<Field>::axpyinRowSpecialized (Vector1 &y, const Matrix_ &A, const Vector2 &x,
+ VectorCategories::SparseSequenceVectorTag) const
+ {
+ DenseVector t1 (field(),A.coldim ()), t2 (field(),A.rowdim ());
+
+ _VD.copy (t1, x);
+ _VD.copy (t2, y);
+ axpyin (t2, A, t1);
+ _VD.copy (y, t2);
+
+ return y;
+ }
+
+ template<class Field>
+ template <class Vector1, class Matrix_, class Vector2>
+ Vector1 &MatrixDomain<Field>::axpyinRowSpecialized (Vector1 &y, const Matrix_ &A, const Vector2 &x,
+ VectorCategories::SparseAssociativeVectorTag) const
+ {
+ DenseVector t1 (field(),A.coldim ()), t2 (field(),A.rowdim ());
+
+ _VD.copy (t1, x);
+ _VD.copy (t2, y);
+ axpyin (t2, A, t1);
+ _VD.copy (y, t2);
+
+ return y;
+ }
+
+ template<class Field>
+ template <class Vector1, class Matrix_, class Vector2>
+ Vector1 &MatrixDomain<Field>::axpyinRowSpecialized (Vector1 &y, const Matrix_ &A, const Vector2 &x,
+ VectorCategories::SparseParallelVectorTag) const
+ {
+ DenseVector t1 (field(),A.coldim ()), t2 (field(),A.rowdim ());
+
+ _VD.copy (t1, x);
+ _VD.copy (t2, y);
+ axpyin (t2, A, t1);
+ _VD.copy (y, t2);
+
+ return y;
+ }
+
+ template<class Field>
+ template <class Vector1, class Matrix_, class Vector2>
+ Vector1 &MatrixDomain<Field>::axpyinColSpecialized (Vector1 &y, const Matrix_ &A, const Vector2 &x,
+ VectorCategories::DenseVectorTag) const
+ {
+ linbox_check (A.coldim () == x.size ());
+ linbox_check (A.rowdim () == y.size ());
+
+ typename Matrix_::ConstColIterator i = A.colBegin ();
+ typename Vector2::const_iterator j = x.begin ();
+
+ for (; j != x.end (); ++j, ++i)
+ _VD.axpyin (y, *j, *i);
+
+ return y;
+ }
+
+ template<class Field>
+ template <class Vector1, class Matrix_, class Vector2>
+ Vector1 &MatrixDomain<Field>::axpyinColSpecialized (Vector1 &y, const Matrix_ &A, const Vector2 &x,
+ VectorCategories::SparseSequenceVectorTag) const
+ {
+ typename Matrix_::ConstColIterator i = A.colBegin ();
+ typename Vector2::iterator j = x.begin ();
+
+
+ DenseVector t (field(),A.rowdim ());
+
+ _VD.copy (t, y);
+
+ while (j != x.end ()) {
+ int diff;
+ _VD.axpyin (t, j->second, *i);
+ diff = j->first; ++j;
+ diff -= j->first;
+ i -= diff;
+ }
+
+ _VD.copy (y, t);
+
+ return y;
+ }
+
+ template<class Field>
+ template <class Vector1, class Matrix_, class Vector2>
+ Vector1 &MatrixDomain<Field>::axpyinColSpecialized (Vector1 &y, const Matrix_ &A, const Vector2 &x,
+ VectorCategories::SparseAssociativeVectorTag) const
+ {
+ typename Matrix_::ConstColIterator i = A.colBegin ();
+ typename Vector2::iterator j = x.begin ();
+
+
+ DenseVector t (field(),A.rowdim ());
+
+ _VD.copy (t, y);
+
+ while (j != x.end ()) {
+ int diff;
+ _VD.axpyin (t, j->second, *i);
+ diff = j->first; ++j;
+ diff -= j->first;
+ i -= diff;
+ }
+
+ _VD.copy (y, t);
+
+ return y;
+ }
+
+ template<class Field>
+ template <class Vector1, class Matrix_, class Vector2>
+ Vector1 &MatrixDomain<Field>::axpyinColSpecialized (Vector1 &y, const Matrix_ &A, const Vector2 &x,
+ VectorCategories::SparseParallelVectorTag) const
+ {
+ typename Matrix_::ConstColIterator i = A.colBegin ();
+ typename Vector2::iterator j_idx = x.first.begin ();
+ typename Vector2::iterator j_elt = x.second.begin ();
+
+
+ DenseVector t (field(),A.rowdim ());
+
+ _VD.copy (t, y);
+
+ for (; j_idx != x.first.end (); ++j_elt) {
+ int diff;
+ _VD.axpyin (t, *j_elt, *i);
+ diff = *j_idx; ++j_idx;
+ diff -= *j_idx;
+ i -= diff;
+ }
+
+ _VD.copy (y, t);
+
+ return y;
+ }
+
+ template<class Field>
+ template <class Matrix1, class Blackbox, class Matrix2>
+ Matrix1 &MatrixDomain<Field>::blackboxMulLeft (Matrix1 &C, const Blackbox &A, const Matrix2 &B) const
+ {
+ linbox_check (A.coldim () == B.rowdim ());
+ linbox_check (A.rowdim () == C.rowdim ());
+ linbox_check (B.coldim () == C.coldim ());
+
+ typename Matrix1::ColIterator i = C.colBegin ();
+ typename Matrix2::ConstColIterator j = B.colBegin ();
+
+ for (; i != C.colEnd (); ++i, ++j)
+ A.apply (*i, *j);
+
+ return C;
+ }
+
+ template<class Field>
+ template <class Matrix1, class Matrix2, class Blackbox>
+ Matrix1 &MatrixDomain<Field>::blackboxMulRight (Matrix1 &C, const Matrix2 &A, const Blackbox &B) const
+ {
+ linbox_check (A.coldim () == B.rowdim ());
+ linbox_check (A.rowdim () == C.rowdim ());
+ linbox_check (B.coldim () == C.coldim ());
+
+ typename Matrix1::RowIterator i = C.rowBegin ();
+ typename Matrix2::ConstRowIterator j = A.rowBegin ();
+
+ for (; i != C.rowEnd (); ++i, ++j)
+ B.applyTranspose (*i, *j);
+
+ return C;
+ }
+
+ template<class Field>
+ template <class Matrix_, class Iterator>
+ Matrix_ &MatrixDomain<Field>::permuteRowsByRow (Matrix_ &A,
+ Iterator P_start,
+ Iterator P_end) const
+ {
+ Iterator i;
+ typename Matrix_::RowIterator j, k;
+
+ for (i = P_start; i != P_end; ++i) {
+ j = A.rowBegin () + i->first;
+ k = A.rowBegin () + i->second;
+
+ _VD.swap (*j, *k);
+ }
+
+ return A;
+ }
+
+ template<class Field>
+ template <class Matrix_, class Iterator>
+ Matrix_ &MatrixDomain<Field>::permuteRowsByCol (Matrix_ &A,
+ Iterator P_start,
+ Iterator P_end) const
+ {
+ typename Matrix_::ColIterator j;
+
+ for (j = A.colBegin (); j != A.colEnd (); ++j)
+ _VD.permute (*j, P_start, P_end);
+
+ return A;
+ }
+
+ template<class Field>
+ template <class Matrix_, class Iterator>
+ Matrix_ &MatrixDomain<Field>::permuteColsByRow (Matrix_ &A,
+ Iterator P_start,
+ Iterator P_end) const
+ {
+ typename Matrix_::RowIterator j;
+
+ for (j = A.rowBegin (); j != A.rowEnd (); ++j)
+ _VD.permute (*j, P_start, P_end);
+
+ return A;
+ }
+
+ template<class Field>
+ template <class Matrix_, class Iterator>
+ Matrix_ &MatrixDomain<Field>::permuteColsByCol (Matrix_ &A,
+ Iterator P_start,
+ Iterator P_end) const
+ {
+ Iterator i;
+ typename Matrix_::ColIterator j, k;
+
+ for (i = P_start; i != P_end; ++i) {
+ j = A.colBegin () + i->first;
+ k = A.colBegin () + i->second;
+
+ _VD.swap (*j, *k);
+ }
+
+ return A;
+ }
+
+ /* FIXME: These methods are undocumented, and I'm unclear what they are supposed
+ * to do
+ */
+
+#if 0
+
+ /*M1<-M2**k;
+ */
+ template<class Matrix1, class Matrix2>
+ Matrix1& MatrixDomain::pow_apply(Matrix1& M1, const Matrix2& M2, unsigned long int k) const
+ {
+ linbox_check((M1.rowdim()==M1.coldim())&&
+ (M2.rowdim()==M2.coldim())&&
+ (M1.rowdim()==M2.rowdim()));
+
+
+ typename Matrix1::Iterator p=M1.Begin();
+ for(;p!=M1.End();++p)
+ M1.field().assign(*p,M1.field().zero);
+ for(p=M1.Begin();p<M1.End();)
+ {
+ M1.field().assign(*p,M1.field().one);
+ p=p+M1.rowdim()+1;
+ }
+
+
+ for(int i=0;i<k;++i)
+ mulin_R(M1,M2);
+
+ return M1;
+ }
+
+
+ template<class Matrix1, class Matrix2>
+ Matrix1& MatrixDomain::pow_horn(Matrix1& M1, const Matrix2& M2, unsigned long int k) const
+ {
+ linbox_check((M1.rowdim()==M1.coldim())&&
+ (M2.rowdim()==M2.coldim())&&
+ (M1.rowdim()==M2.rowdim()));
+
+ if(k==0)
+ {
+ typename Matrix1::Iterator p=M1.Begin();
+ for(;p!=M1.End();++p)
+ M1.field().assign(*p,M1.field().zero);
+ for(p=M1.Begin();p<M1.End();)
+ {
+ M1.field().assign(*p,M1.field().one);
+ p+=M1.rowdim()+1;
+ }
+ return M1;
+ }
+
+ typename Matrix1::Iterator p1;
+ typename Matrix2::ConstIterator p2;
+ for(p1=M1.Begin(),p2=M2.Begin();p1!=M1.End();++p1,++p2)
+ M1.field().assign(*p1,*p2);
+
+ std::vector<bool> bit;
+ bit.reserve(sizeof(unsigned long)*4);
+ while(k>0)
+ {
+ bit.push_back(k%2);
+ k/=2;
+ };
+
+
+ std::vector<bool>::reverse_iterator p=bit.rbegin();
+ ++p;
+ Matrix1 temp(M1);
+ for(;p!=bit.rend();++p)
+ {
+ temp=M1;
+ mulin_L(M1,temp);
+ if(*p)
+ mulin_L(M1,M2);
+
+ }
+
+ return M1;
+ }
+
+#endif
+
+} // namespace LinBox
+
+#endif // __LINBOX_matrix_domain_INL
+
+
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/matrix/matrixdomain/opencl-domain-factory.h b/linbox/matrix/matrixdomain/opencl-domain-factory.h
new file mode 100644
index 0000000..9d2a9b2
--- /dev/null
+++ b/linbox/matrix/matrixdomain/opencl-domain-factory.h
@@ -0,0 +1,750 @@
+/*
+ * Copyright (C) 2011-2012 Matthew Wezowicz
+ *
+ * Written by Matthew Wezowicz <mwezz at udel.edu>
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ * ========LICENCE========
+ *.
+ */
+
+
+/** @file linbox/matrix/MatrixDoamin/opencl-domain-factory.h
+ * @brief NO DOC
+ */
+
+#ifndef __LINBOX_opencl_matrix_domain_factory_H
+#define __LINBOX_opencl_matrix_domain_factory_H
+
+#include <cstdio>
+#include <cstdlib>
+#include <cstring>
+#include <pthread.h>
+
+#include <vector>
+
+#include <CL/cl.h>
+
+#include "linbox/matrix/matrixdomain/opencl-domain.h"
+
+#include "linbox/algorithms/opencl-environ.h"
+#include "linbox/algorithms/opencl-resource-controller.h"
+#include "linbox/algorithms/opencl-kernels/opencl-domain-kernels.inl"
+
+
+#define NUM_KERNELS 20
+
+namespace LinBox{
+
+ const char* dpKernelSources[] = {
+ matrixMulKernelModular1DP, matrixMulKernelModular8DP,
+ matrixMulKernelModular32DP, matrixMulKernelModular1024DP,
+ matrixMuladdKernelModular1DP, matrixMuladdKernelModular8DP,
+ matrixMuladdKernelModular32DP, matrixMuladdKernelModular1024DP,
+ matrixAxpyKernelModular1DP, matrixAxpyKernelModular8DP,
+ matrixAxpyKernelModular32DP, matrixAxpyKernelModular1024DP,
+ matrixMaxpyKernelModular1DP, matrixMaxpyKernelModular8DP,
+ matrixMaxpyKernelModular32DP, matrixMaxpyKernelModular1024DP,
+ matrixAxmyKernelModular1DP, matrixAxmyKernelModular8DP,
+ matrixAxmyKernelModular32DP, matrixAxmyKernelModular1024DP};
+
+ const char* dpKernelNames[] = {
+ "matrixMulKernelModular1DP", "matrixMulKernelModular8DP",
+ "matrixMulKernelModular32DP", "matrixMulKernelModular1024DP",
+ "matrixMuladdKernelModular1DP", "matrixMuladdKernelModular8DP",
+ "matrixMuladdKernelModular32DP", "matrixMuladdKernelModular1024DP",
+ "matrixAxpyKernelModular1DP", "matrixAxpyKernelModular8DP",
+ "matrixAxpyKernelModular32DP", "matrixAxpyKernelModular1024DP",
+ "matrixMaxpyKernelModular1DP", "matrixMaxpyKernelModular8DP",
+ "matrixMaxpyKernelModular32DP", "matrixMaxpyKernelModular1024DP",
+ "matrixAxmyKernelModular1DP", "matrixAxmyKernelModular8DP",
+ "matrixAxmyKernelModular32DP", "matrixAxmyKernelModular1024DP"};
+
+ const char* spKernelSources[] = {
+ matrixMulKernelModular1SP, matrixMulKernelModular16SP,
+ matrixMulKernelModular32SP, matrixMulKernelModular1024SP,
+ matrixMuladdKernelModular1SP, matrixMuladdKernelModular16SP,
+ matrixMuladdKernelModular32SP, matrixMuladdKernelModular1024SP,
+ matrixAxpyKernelModular1SP, matrixAxpyKernelModular16SP,
+ matrixAxpyKernelModular32SP, matrixAxpyKernelModular1024SP,
+ matrixMaxpyKernelModular1SP, matrixMaxpyKernelModular16SP,
+ matrixMaxpyKernelModular32SP, matrixMaxpyKernelModular1024SP,
+ matrixAxmyKernelModular1SP, matrixAxmyKernelModular16SP,
+ matrixAxmyKernelModular32SP, matrixAxmyKernelModular1024SP};
+
+ const char* spKernelNames[] = {
+ "matrixMulKernelModular1SP", "matrixMulKernelModular16SP",
+ "matrixMulKernelModular32SP", "matrixMulKernelModular1024SP",
+ "matrixMuladdKernelModular1SP", "matrixMuladdKernelModular16SP",
+ "matrixMuladdKernelModular32SP", "matrixMuladdKernelModular1024SP",
+ "matrixAxpyKernelModular1SP", "matrixAxpyKernelModular16SP",
+ "matrixAxpyKernelModular32SP", "matrixAxpyKernelModular1024SP",
+ "matrixMaxpyKernelModular1SP", "matrixMaxpyKernelModular16SP",
+ "matrixMaxpyKernelModular32SP", "matrixMaxpyKernelModular1024SP",
+ "matrixAxmyKernelModular1SP", "matrixAxmyKernelModular16SP",
+ "matrixAxmyKernelModular32SP", "matrixAxmyKernelModular1024SP"};
+
+ class OpenCLMatrixDomainFactory{
+
+ protected:
+ /*--- This class is a Singleton ---*/
+ //No one can construct the class
+ OpenCLMatrixDomainFactory();
+ //No one can copy the class
+ OpenCLMatrixDomainFactory(const OpenCLMatrixDomainFactory&);
+ //No one can assign the class
+ OpenCLMatrixDomainFactory& operator=(const OpenCLMatrixDomainFactory&);
+ //No one can destroy the class
+ ~OpenCLMatrixDomainFactory();
+
+ struct oclEnviron{
+ //OpenCL specific variables
+ cl_context context;
+ cl_device_id device;
+ cl_command_queue commandQue;
+ cl_int errcode;
+
+ //Storage for memory levels
+ unsigned long memCapacity;
+ unsigned long maxBufferSize;
+
+ //Type and status flags
+ bool GPUcontainer;
+ bool CPUcontainer;
+ bool setupCorrect;
+ bool doubleSupported;
+
+ //Storage for kernels
+ cl_kernel* dpKernels;
+ bool* dpKernelsAvailable;
+ cl_kernel* spKernels;
+ bool* spKernelsAvailable;
+
+ //Mutex
+ pthread_mutex_t* deviceLock;
+ };
+
+ public:
+ typedef struct oclEnviron oclEnviron;
+
+ protected:
+
+ //Storage for all OpenCL evironments created by the factory
+ static std::vector<oclEnviron>* environs;
+ static std::vector<int>* instances;
+
+ //Initialization flag
+ static bool initialized;
+
+ //Storage for the error code
+ static cl_int errcode;
+
+ //Factory mutex
+ static pthread_mutex_t factoryLock;
+
+ /**
+ * @internal
+ * Picks the platform used
+ */
+ static cl_int oclGetPlatformID(cl_platform_id& selectedPlatform){
+ //Allocate temporary char array for platform name
+ char chBuffer[256];
+ cl_uint numPlatforms;
+ cl_platform_id* platforms;
+ selectedPlatform = NULL;
+
+ //Get OpenCL platform count
+ //return custom error codes if there are no platforms
+ //or could not get number of platforms
+ errcode = clGetPlatformIDs(0, NULL, &numPlatforms);
+ if(errcode != CL_SUCCESS){
+ return -1000;
+ }
+ if(numPlatforms == 0){
+ return -2000;
+ }
+
+ //Allocate space to store cl_platform_id's
+ platforms = (cl_platform_id*)malloc(numPlatforms * sizeof(cl_platform_id));
+ errcode = clGetPlatformIDs(numPlatforms, platforms, NULL);
+
+ //Search through the platforms looking for a prefered one specified by a
+ //string
+ for(int i = 0; i < (int)numPlatforms; i++){
+ errcode = clGetPlatformInfo(
+ platforms[i],
+ CL_PLATFORM_NAME,
+ 256,
+ (void*)chBuffer,
+ NULL);
+
+ if(errcode == CL_SUCCESS && !(strcmp(chBuffer,"NVIDIA CUDA"))){
+ selectedPlatform = platforms[i];
+ break;
+ }
+ }
+
+ //If prefered platform could not be found use first platform
+ if(selectedPlatform == NULL){
+ selectedPlatform = platforms[0];
+ }
+
+ //Clean up memory
+ free(platforms);
+
+ return CL_SUCCESS;
+ }
+
+ /**
+ * @internal
+ * Computes a score for all devices
+ */
+ static std::vector<long> oclComputeDeviceScores(
+ cl_device_id* devices,
+ cl_uint numDevices){
+
+ std::vector<long> ret;
+
+ //For all devices, query information about them and compute a score
+ for(int i = 0; i < (int)numDevices; i++){
+
+ cl_device_type type;
+ errcode = clGetDeviceInfo(
+ devices[i],
+ CL_DEVICE_TYPE,
+ sizeof(cl_device_type),
+ &type,
+ NULL);
+
+ bool GPU = (type == CL_DEVICE_TYPE_GPU);
+
+ cl_uint computeUnits;
+ errcode = clGetDeviceInfo(
+ devices[i],
+ CL_DEVICE_MAX_COMPUTE_UNITS,
+ sizeof(cl_uint),
+ &computeUnits,
+ NULL);
+
+ cl_uint clockFrequency;
+ errcode = clGetDeviceInfo(
+ devices[i],
+ CL_DEVICE_MAX_CLOCK_FREQUENCY,
+ sizeof(cl_uint),
+ &clockFrequency,
+ NULL);
+
+ cl_ulong maxGlobalMemoryAllocSize;
+ errcode = clGetDeviceInfo(
+ devices[i],
+ CL_DEVICE_MAX_MEM_ALLOC_SIZE,
+ sizeof(cl_ulong),
+ &maxGlobalMemoryAllocSize,
+ NULL);
+
+ cl_ulong globalMemory;
+ errcode = clGetDeviceInfo(
+ devices[i],
+ CL_DEVICE_GLOBAL_MEM_SIZE,
+ sizeof(cl_ulong),
+ &globalMemory,
+ NULL);
+
+ long score = (computeUnits * clockFrequency);
+ score *= (GPU ? 8 : 1);
+ score += (maxGlobalMemoryAllocSize / (1024 * 1024));
+ score += (globalMemory / (1024 * 1024));
+
+ ret.push_back(score);
+ }
+
+ return ret;
+ }
+
+ /**
+ * @internal
+ * Creates a kernel given a file name and kernel name
+ * Returns the kernel
+ */
+ static cl_kernel oclCreateKernel(
+ const char* kernel,
+ const char* kernelName,
+ cl_context& context){
+
+ //find length of the kernel
+ size_t kernelLength = strlen(kernel);
+
+ //Create program from file
+ cl_program program = clCreateProgramWithSource(
+ context,
+ 1,
+ (const char**)&kernel,
+ &kernelLength,
+ &errcode);
+
+ //Build the program into executable
+ if(errcode == CL_SUCCESS){
+ const char* options = {"-cl-mad-enable -cl-no-signed-zeros "
+ "-cl-finite-math-only\0"};
+ errcode = clBuildProgram(program, 0, NULL, options, NULL, NULL);
+ }
+
+ //Create kernel from executable
+ cl_kernel tempKernel = NULL;
+ if(errcode == CL_SUCCESS){
+ tempKernel = clCreateKernel(program, kernelName, &errcode);
+ }
+
+ //Releasing program
+ clReleaseProgram(program);
+
+ //Return kernel
+ return tempKernel;
+ }
+
+ /**
+ * @internal
+ * Builds a single oclEnviron
+ */
+ static oclEnviron& oclBuildEnviron(
+ oclEnviron& environ,
+ cl_platform_id& platform,
+ cl_device_id& device){
+
+ //Create OpenCL context
+ cl_context_properties properties[3] = {CL_CONTEXT_PLATFORM,
+ (cl_context_properties)platform,
+ 0};
+ environ.context = clCreateContext(
+ properties,
+ 1,
+ &device,
+ NULL,
+ NULL,
+ &errcode);
+
+ //Assign device to environ
+ environ.device = device;
+
+ //Create OpenCL command queue
+ environ.commandQue = clCreateCommandQueue(
+ environ.context,
+ device,
+ 0,
+ &errcode);
+
+ //Get amount of memory that the device has
+ errcode = clGetDeviceInfo(
+ device,
+ CL_DEVICE_GLOBAL_MEM_SIZE,
+ sizeof(cl_ulong),
+ &(environ.memCapacity),
+ NULL);
+ errcode = clGetDeviceInfo(
+ device,
+ CL_DEVICE_MAX_MEM_ALLOC_SIZE,
+ sizeof(cl_ulong),
+ &(environ.maxBufferSize),
+ NULL);
+
+ //Get the device type for the selected device
+ cl_device_type type;
+ errcode = clGetDeviceInfo(
+ device,
+ CL_DEVICE_TYPE,
+ sizeof(cl_device_type),
+ &type,
+ NULL);
+
+ //Set container type
+ environ.GPUcontainer = (type == CL_DEVICE_TYPE_GPU);
+ environ.CPUcontainer = (type == CL_DEVICE_TYPE_CPU);
+
+
+ //Determine double precision support for device by getting a
+ //listing of all OpenCL device extensions supported by the device
+ //and searching through them for the string "cl_khr_fp64"
+ environ.doubleSupported = false;
+
+ size_t sizeReturn;
+
+ errcode = clGetDeviceInfo(
+ device,
+ CL_DEVICE_EXTENSIONS,
+ 0,
+ NULL,
+ &sizeReturn);
+ char* deviceExtensions = (char*)malloc(sizeReturn);
+ errcode = clGetDeviceInfo(
+ device,
+ CL_DEVICE_EXTENSIONS,
+ sizeReturn,
+ deviceExtensions,
+ NULL);
+
+ char* exten[200];
+
+ exten[0] = strtok(deviceExtensions, " ");
+
+ if(exten[0] != NULL){
+ for(int i = 1; i < 200; i++){
+ exten[i] = strtok(NULL, " ");
+ if(exten[i] == NULL){
+ break;
+ }
+ }
+
+ for(int i = 0; i < 200; i++){
+ if(exten[i] == NULL){
+ break;
+ }
+ if(!strcmp(exten[i], "cl_khr_fp64")){
+ environ.doubleSupported = true;
+ }
+ }
+ }
+
+ free(deviceExtensions);
+
+ //Copy current errcode to environ as starting errcode
+ environ.errcode = errcode;
+ if(environ.errcode != CL_SUCCESS){
+ environ.setupCorrect = false;
+ }
+ else{
+ environ.setupCorrect = true;
+ }
+
+ //Allocate memory for kernels and kernel flags
+ environ.dpKernels = (cl_kernel*)malloc(NUM_KERNELS * sizeof(cl_kernel));
+ environ.spKernels = (cl_kernel*)malloc(NUM_KERNELS * sizeof(cl_kernel));
+ environ.dpKernelsAvailable = (bool*)malloc(NUM_KERNELS * sizeof(bool));
+ environ.spKernelsAvailable = (bool*)malloc(NUM_KERNELS * sizeof(bool));
+
+ //Set kernel flags to default false
+ for(int i = 0; i < NUM_KERNELS; i++){
+ environ.dpKernelsAvailable[i] = false;
+ environ.spKernelsAvailable[i] = false;
+ }
+
+ //Compile all of the kernels
+ if(errcode == CL_SUCCESS){
+ for(int i = 0; i < NUM_KERNELS; i++){
+ environ.dpKernels[i] = oclCreateKernel(
+ dpKernelSources[i],
+ dpKernelNames[i],
+ environ.context);
+ if(errcode == CL_SUCCESS){environ.dpKernelsAvailable[i] = true;}
+ }
+
+ for(int i = 0; i < NUM_KERNELS; i++){
+ environ.spKernels[i] = oclCreateKernel(
+ spKernelSources[i],
+ spKernelNames[i],
+ environ.context);
+ if(errcode == CL_SUCCESS){environ.spKernelsAvailable[i] = true;}
+ }
+ }
+
+ //Allocate and initialize the device mutex
+ environ.deviceLock = (pthread_mutex_t*)malloc(sizeof(pthread_mutex_t));
+ pthread_mutex_init(environ.deviceLock, NULL);
+
+ return environ;
+ }
+
+ /**
+ * @internal
+ * Builds the vector of oclEnvirons
+ */
+ static std::vector<oclEnviron>* oclGetEnvirons(
+ std::vector<oclEnviron>* myenvirons,
+ cl_platform_id& platform,
+ cl_device_id* devices,
+ cl_uint numDevices){
+
+ //Compute a score for all devices
+ std::vector<long> rankings = oclComputeDeviceScores(devices, numDevices);
+
+ //Find the max score and calculate a lower bound for device selection
+ long maxScore = *(std::max_element(rankings.begin(), rankings.end()));
+ long lowerBound = (long)((double)maxScore * 0.90);
+
+ //Build OpenCL compute environments only for devices within 10% of
+ //the top device. This should keep run times for identical computations
+ //relatively similar across different intstances of OpenCLMatrixDomain
+ //and eliminate the primary graphics adapter if there is one.
+ for(int i = 0; i < (int)numDevices; i++){
+ if(rankings.at((size_t)i) < lowerBound){
+ continue;
+ }
+
+ oclEnviron temp;
+
+ temp = oclBuildEnviron(temp, platform, devices[i]);
+
+ myenvirons->push_back(temp);
+ }
+
+ return myenvirons;
+ }
+
+ /**
+ * @internal
+ * Initializes the OpenCL compute environment
+ */
+ static void oclEnvironInit(){
+ //Declare OpenCL specific variables
+ cl_platform_id platform;
+ cl_uint numDevices = 0;
+ cl_device_id* devices;
+
+ //Get the platform to be used
+ errcode = oclGetPlatformID(platform);
+
+ //Proceed only if successful with previous phase
+ if(errcode == CL_SUCCESS){
+ //Get number of GPU's in the platform
+ errcode = clGetDeviceIDs(
+ platform,
+ CL_DEVICE_TYPE_GPU,
+ 0,
+ NULL,
+ &numDevices);
+ }
+
+ //Allocate the oclEnviron and instance count arrays
+ environs = new std::vector<oclEnviron>();
+ instances = new std::vector<int>();
+
+ //Proceed only if successful with previous phase
+ if(errcode == CL_SUCCESS && numDevices != 0){
+ //Allocate memory for device array and read the devices into it
+ devices = (cl_device_id*)malloc(numDevices * sizeof(cl_device_id));
+ errcode = clGetDeviceIDs(
+ platform,
+ CL_DEVICE_TYPE_GPU,
+ numDevices,
+ devices,
+ NULL);
+
+ //Build environs from devices
+ environs = oclGetEnvirons(environs, platform, devices, numDevices);
+
+ //Set intial instance count to zero
+ for(int i = 0; i < (int)environs->size(); i++){
+ instances->push_back(0);
+ }
+
+ free(devices);
+ }
+ //If there are no devices or if an error occured make a default
+ //oclEnviron that disables the OpenCLMatrixDomain and defaults it
+ //to BlasMatrixDomain methods.
+ else{
+ oclEnviron temp;
+
+ temp.context = NULL;
+ temp.device = NULL;
+ temp.commandQue = NULL;
+ temp.errcode = CL_INVALID_PLATFORM;
+ temp.memCapacity = 0UL;
+ temp.maxBufferSize = 0UL;
+ temp.GPUcontainer = false;
+ temp.CPUcontainer = false;
+ temp.setupCorrect = false;
+ temp.doubleSupported = false;
+
+ temp.dpKernels = (cl_kernel*)malloc(NUM_KERNELS * sizeof(cl_kernel));
+ temp.spKernels = (cl_kernel*)malloc(NUM_KERNELS * sizeof(cl_kernel));
+ temp.dpKernelsAvailable = (bool*)malloc(NUM_KERNELS * sizeof(bool));
+ temp.spKernelsAvailable = (bool*)malloc(NUM_KERNELS * sizeof(bool));
+
+ for(int i = 0; i < NUM_KERNELS; i++){
+ temp.dpKernels[i] = NULL;
+ temp.spKernels[i] = NULL;
+ temp.dpKernelsAvailable[i] = false;
+ temp.spKernelsAvailable[i] = false;
+ }
+
+ temp.deviceLock = NULL;
+
+ environs->push_back(temp);
+ instances->push_back(0);
+ }
+
+ }
+
+ /**
+ * @internal
+ * Handles the releasing of resources at program exit
+ */
+ static void oclResourceCleanUp(){
+ //Release all reources held in each oclEnviron
+ for(int i = 0; i < (int)environs->size(); i++){
+ oclEnviron current = environs->at((size_t)i);
+
+ //Release the kernels
+ for(int j = 0; j < NUM_KERNELS; j++){
+ errcode = clReleaseKernel(current.dpKernels[j]);
+ errcode = clReleaseKernel(current.spKernels[j]);
+ }
+
+ //Deallocate the array memory
+ free(current.dpKernels);
+ free(current.spKernels);
+ free(current.dpKernelsAvailable);
+ free(current.spKernelsAvailable);
+
+ //Destroy mutex and deallocate memory
+ if (current.deviceLock != NULL) {
+ pthread_mutex_destroy(current.deviceLock);
+ free(current.deviceLock);
+ }
+
+ //Release the command queue and context
+ errcode = clReleaseCommandQueue(current.commandQue);
+ errcode = clReleaseContext(current.context);
+ }
+
+
+ //Delete vectors
+ delete instances;
+ delete environs;
+
+ //Destroy factory mutex
+ pthread_mutex_destroy(&factoryLock);
+
+ //Set state to unitialized incase exit is aborted
+ initialized = false;
+ }
+
+ public:
+ template <class Field>
+ static void oclMatrixDomainInstance(OpenCLMatrixDomain<Field>* target){
+
+ //Check if the OpenCL environment has been initialized
+ //It will only need to be initialized when the first OpenCLMatrixDomain
+ //instance is created. Double check locking ensures Singleton
+ if(!initialized){
+ pthread_mutex_lock(&factoryLock);
+
+ if(!initialized){
+ oclEnvironInit();
+ initialized = true;
+ atexit(oclResourceCleanUp);
+ }
+
+ pthread_mutex_unlock(&factoryLock);
+ }
+
+ pthread_mutex_lock(&factoryLock);
+
+ //Selected least used oclEnviron
+ int leastUsedIndex = 0;
+ for(int i = 0; i < (int)instances->size(); i++){
+ if(instances->at((size_t)i) < instances->at((size_t)leastUsedIndex)){
+ leastUsedIndex = i;
+ }
+ }
+
+ //Increment use count
+ (instances->at((size_t)leastUsedIndex))++;
+
+ //Copy all of the data required for the OpenCLMatrixDomain instance to
+ //function
+ target->context = environs->at((size_t)leastUsedIndex).context;
+ target->device = environs->at((size_t)leastUsedIndex).device;
+ target->commandQue = environs->at((size_t)leastUsedIndex).commandQue;
+ target->errcode = environs->at((size_t)leastUsedIndex).errcode;
+
+ target->memCapacity = environs->at((size_t)leastUsedIndex).memCapacity;
+ target->maxBufferSize = environs->at((size_t)leastUsedIndex).maxBufferSize;
+
+ target->GPUcontainer = environs->at((size_t)leastUsedIndex).GPUcontainer;
+ target->CPUcontainer = environs->at((size_t)leastUsedIndex).CPUcontainer;
+ target->setupCorrect = environs->at((size_t)leastUsedIndex).setupCorrect;
+ target->doubleSupported = environs->at((size_t)leastUsedIndex).doubleSupported;
+
+ for(int i = 0; i < 20; i++){
+ target->dpKernels[i] = environs->at((size_t)leastUsedIndex).dpKernels[i];
+ target->spKernels[i] = environs->at((size_t)leastUsedIndex).spKernels[i];
+
+ target->dpKernelsAvailable[i] =
+ environs->at((size_t)leastUsedIndex).dpKernelsAvailable[i];
+ target->spKernelsAvailable[i] =
+ environs->at((size_t)leastUsedIndex).spKernelsAvailable[i];
+ }
+
+ //Assign an ID number the OpenCLMatrixDomain instance to be used for
+ //locking and releasing the OpenCL resources
+ target->IDnum = (unsigned int)leastUsedIndex;
+
+ //Point OpenCLMatrixDomain to the mutex
+ target->deviceLock = environs->at((size_t)leastUsedIndex).deviceLock;
+
+ pthread_mutex_unlock(&factoryLock);
+ }
+
+ static void oclMatrixDomainDeallocate(unsigned int IDnum){
+ pthread_mutex_lock(&factoryLock);
+
+ (instances->at(IDnum))--;
+
+ pthread_mutex_unlock(&factoryLock);
+ }
+
+ static int oclGetNumberOfDevices(){
+
+ //Check if the OpenCL environment has been initialized
+ //It will only need to be initialized when the first OpenCLMatrixDomain
+ //instance is created. Double check locking ensures Singleton
+ if(!initialized){
+ pthread_mutex_lock(&factoryLock);
+
+ if(!initialized){
+ oclEnvironInit();
+ initialized = true;
+ atexit(oclResourceCleanUp);
+ }
+
+ pthread_mutex_unlock(&factoryLock);
+ }
+
+ return (int) environs->size();
+
+ }
+ };
+
+ //Static data fields used by OpenCLMatrixDomainFactory
+ std::vector<OpenCLMatrixDomainFactory::oclEnviron>* OpenCLMatrixDomainFactory::environs = NULL;
+ std::vector<int>* OpenCLMatrixDomainFactory::instances = NULL;
+ bool OpenCLMatrixDomainFactory::initialized = false;
+ cl_int OpenCLMatrixDomainFactory::errcode = CL_SUCCESS;
+ pthread_mutex_t OpenCLMatrixDomainFactory::factoryLock = PTHREAD_MUTEX_INITIALIZER;
+}
+
+#endif // __LINBOX_opencl_domain_fatory
+
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/matrix/matrixdomain/opencl-domain-memory.inl b/linbox/matrix/matrixdomain/opencl-domain-memory.inl
new file mode 100644
index 0000000..c52a825
--- /dev/null
+++ b/linbox/matrix/matrixdomain/opencl-domain-memory.inl
@@ -0,0 +1,333 @@
+/*
+ * Copyright (C) 2011-2012 Matthew Wezowicz
+ *
+ * Written by Matthew Wezowicz <mwezz at udel.edu>
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ * ========LICENCE========
+ *.
+ */
+
+/** @internal
+ * @file linbox/matrix/matrixdomain/opencl-domain-setup.inl
+ * @brief NO DOC
+ */
+
+#ifndef __LINBOX_opencl_matrix_domain_memory_INL
+#define __LINBOX_opencl_matrix_domain_memory_INL
+
+#include <cstdlib>
+
+#include <CL/cl.h>
+
+namespace LinBox{
+
+ /**
+ * @internal
+ * Pads a BlasMatrix into a form appropriate for OpenCL use
+ * and returns the OpenCL buffer
+ */
+ template <class Field>
+ template <typename T, class Operand1>
+ cl_mem OpenCLMatrixDomain<Field>::oclPadMatrix(
+ cl_mem matrixBuffer,
+ int matrixBufferSize,
+ int newDimX,
+ const Operand1 &matrix) const{
+
+ //Set starting positions
+ int matrixBufferPosition = 0;
+ int dataOffset = 0;
+ int elementsPadded = 0;
+
+ //Allocates a 32mb buffer for padding
+ T* paddingBuffer = (T*)malloc(32 * 1024 * 1024);
+
+ //Calculate the size of the padding buffer in number of elements
+ const int paddingBufferSize = (32 * 1024 * 1024 / (int)sizeof(T));
+
+ //Loops while there is still space in the matrixBuffer
+ while(matrixBufferPosition < matrixBufferSize){
+
+ //Sets the starting position in the buffer
+ int paddingBufferPosition = 0;
+
+ //Loops while there is still space in the buffer
+ while(paddingBufferPosition < paddingBufferSize){
+ int count = 0;
+
+ //Puts one row of data into the buffer while there is space
+ //in the buffer and data left
+ while(count < (int)matrix.coldim() &&
+ paddingBufferPosition < paddingBufferSize &&
+ dataOffset < (int)(matrix.coldim() * matrix.rowdim())){
+
+ //Put entry of matrix into the padding buffer
+ int row = (int) ((size_t)dataOffset / matrix.coldim());
+ int col = (int) ((size_t)dataOffset % matrix.coldim());
+ paddingBuffer[paddingBufferPosition] = matrix.getEntry((size_t)row, (size_t)col);
+
+ //Increment the count for the row, paddingBuffer, and matrix
+ count++;
+ paddingBufferPosition++;
+ dataOffset++;
+ elementsPadded++;
+ }
+
+ //Padds 0's until end of padded row while there is still space in the
+ //buffer
+ while(count < newDimX && paddingBufferPosition < paddingBufferSize){
+
+ //Place a zero into the paddingBuffer
+ paddingBuffer[paddingBufferPosition] = 0.0;
+
+ //Increment the count for the rwo and the paddingBuffer
+ count++;
+ paddingBufferPosition++;
+ elementsPadded++;
+ }
+
+ if(elementsPadded >= matrixBufferSize){
+ break;
+ }
+ }
+
+ int transferSize;
+
+ //Transfer the paddingBuffer to the matrixBuffer
+ if((matrixBufferPosition + paddingBufferSize) <= matrixBufferSize){
+ transferSize = (32 * 1024 * 1024);
+ }
+ //Transfer the partial paddingBuffer to the matrixBuffer
+ else{
+ transferSize = (int) ((size_t)(matrixBufferSize - matrixBufferPosition) * sizeof(T));
+ }
+
+ // cl_int tempErrcode;
+ // tempErrcode =
+ clEnqueueWriteBuffer(
+ commandQue,
+ matrixBuffer,
+ CL_TRUE,
+ ((size_t)matrixBufferPosition * sizeof(T)),
+ (size_t)transferSize,
+ paddingBuffer,
+ 0,
+ NULL,
+ NULL);
+
+ //Increment position in matrixBuffer by the size of the paddingBuffer
+ matrixBufferPosition += paddingBufferSize;
+ }
+
+ //Deallocates buffer
+ free(paddingBuffer);
+
+ return matrixBuffer;
+ }
+
+ /**
+ * @internal
+ * Dedads an OpenCL buffer and puts it back into a BlasMatrix
+ */
+ template <class Field>
+ template <typename T, class Operand1>
+ Operand1& OpenCLMatrixDomain<Field>::oclDepadMatrix(
+ cl_mem matrixBuffer,
+ int matrixBufferSize,
+ int outputSize,
+ int newDimX,
+ Operand1& matrix) const{
+
+ //Set starting positions
+ int matrixBufferPosition = 0;
+ int dataOffset = 0;
+
+ //Allocates a 32mb buffer for depadding
+ T* depaddingBuffer = (T*)malloc(32 * 1024 * 1024);
+
+ //Calculate the size of the depadding buffer in number of elements
+ const int depaddingBufferSize = (32 * 1024 * 1024 / (int)sizeof(T));
+
+ //Loops while there are still elements in the matrixBuffer
+ while(dataOffset < outputSize){
+ int transferSize;
+
+ //Transfer a full depaddingBuffer worth of elements back to the host
+ if((matrixBufferPosition + depaddingBufferSize) <= matrixBufferSize){
+ transferSize = (32 * 1024 * 1024);
+ }
+ //Transfer a partial depaddingBuffer worth of elements back to the host
+ else{
+ transferSize = (int) ( (size_t)(matrixBufferSize - matrixBufferPosition) * sizeof(T) );
+ }
+
+ // cl_int tempErrcode;
+ // tempErrcode =
+ clEnqueueReadBuffer(
+ commandQue,
+ matrixBuffer,
+ CL_TRUE,
+ ((size_t)matrixBufferPosition * sizeof(T)),
+ (size_t)transferSize,
+ depaddingBuffer,
+ 0,
+ NULL,
+ NULL);
+
+ //Set depaddiingBuffer start position
+ int depaddingBufferPosition = 0;
+
+ //Loops while there are still elements in the depaddingBuffer
+ while(depaddingBufferPosition < depaddingBufferSize){
+ int count = 0;
+
+ //Puts one row of data into the matrix while there are elements in the
+ //depaddingBuffer
+ while(count < (int)matrix.coldim() &&
+ depaddingBufferPosition < depaddingBufferSize &&
+ dataOffset < outputSize){
+
+ //Put entry of depadding buffer into the matrix
+ int row = (int) ((size_t)dataOffset / matrix.coldim());
+ int col = (int) ((size_t)dataOffset % matrix.coldim());
+ matrix.setEntry((size_t)row, (size_t)col, depaddingBuffer[depaddingBufferPosition]);
+
+ //Increment the count for the row, depadding buffer, and matrix
+ count++;
+ depaddingBufferPosition++;
+ dataOffset++;
+ }
+
+ //Skip over the padding zero's
+ depaddingBufferPosition += (newDimX - count);
+ }
+
+ //Increment position in matrixBuffer by the size of the paddingBuffer
+ matrixBufferPosition += depaddingBufferSize;
+ }
+
+ //Deallocates buffer
+ free(depaddingBuffer);
+
+ return matrix;
+ }
+
+ /**
+ * @internal
+ * Creates an empty matrix buffer on the OpenCL device from
+ * the dimensions of the matrix
+ */
+ template <class Field>
+ template <typename T, class Operand1>
+ cl_mem OpenCLMatrixDomain<Field>::oclCreateMatrixBuffer(
+ Operand1& matrix) const{
+
+ //Calculate dimensions after padding of matrix
+ //((A.coldim() / 16) + (A.coldim() % 16 == 0 ? 0 : 1)) * 16
+ int newDimX = (int) (((matrix.coldim() + 15) / 16) * 16);
+ int newDimY = (int) (((matrix.rowdim() + 15) / 16) * 16);
+
+ //Allocate buffer
+ cl_int tempErrcode;
+ cl_mem matrixBuffer = clCreateBuffer(
+ context,
+ CL_MEM_READ_WRITE,
+ ((size_t)newDimX * (size_t)newDimY * sizeof(T)),
+ 0,
+ &tempErrcode);
+
+ return matrixBuffer;
+ }
+
+ /**
+ * @internal
+ * Creates a matrix buffer on the OpenCL device from the dimensions
+ * of the passed in matrix and load the contents of the matrix into
+ * the matrix buffer
+ */
+ template<class Field>
+ template<typename T, class Operand1>
+ cl_mem OpenCLMatrixDomain<Field>::oclCreateAndLoadMatrixBuffer(
+ const Operand1 &matrix) const{
+
+ //Calculate dimensions after padding of matrix
+ //((A.coldim() / 16) + (A.coldim() % 16 == 0 ? 0 : 1)) * 16
+ int newDimX = (int) (((matrix.coldim() + 15) / 16) * 16);
+ int newDimY = (int) (((matrix.rowdim() + 15) / 16) * 16);
+
+ //Allocate buffer
+ cl_int tempErrcode;
+ cl_mem matrixBuffer = clCreateBuffer(
+ context,
+ CL_MEM_READ_WRITE,
+ ((size_t)newDimX * (size_t)newDimY * sizeof(T)),
+ 0,
+ &tempErrcode);
+
+ //Calculate number of elements in the matrixBuffer
+ int matrixBufferSize = newDimX * newDimY;
+
+ return oclPadMatrix<T, Operand1>(
+ matrixBuffer,
+ matrixBufferSize,
+ newDimX,
+ matrix);
+ }
+
+ /**
+ * @internal
+ * Read back the contents of the matrix buffer into the matrix and
+ * return a refence to the matrix
+ */
+ template <class Field>
+ template <typename T, class Operand2>
+ Operand2& OpenCLMatrixDomain<Field>::oclReadMatrixBuffer(
+ cl_mem matrixBuffer,
+ Operand2 &matrix) const{
+
+ //Calculate dimensions after padding of matrix
+ //((A.coldim() / 16) + (A.coldim() % 16 == 0 ? 0 : 1)) * 16
+ int newDimX = (int) (((matrix.coldim() + 15) / 16) * 16);
+ int newDimY = (int) (((matrix.rowdim() + 15) / 16) * 16);
+
+ //Calculate number of elements in the matrixBuffer
+ int matrixBufferSize = newDimX * newDimY;
+
+ //Calculate number of elements in the matrix
+ int outputSize = (int)( matrix.coldim() * matrix.rowdim() ); //BB here we assume the size of a matrix is small, not a size_t
+
+ return oclDepadMatrix<T, Operand2>(
+ matrixBuffer,
+ matrixBufferSize,
+ outputSize,
+ newDimX,
+ matrix);
+ }
+
+} //end of namespace LinBox
+
+#endif // __LINBOX_opencl_matrix_domain_memory_INL
+
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
diff --git a/linbox/matrix/matrixdomain/opencl-domain-util.inl b/linbox/matrix/matrixdomain/opencl-domain-util.inl
new file mode 100644
index 0000000..677b13c
--- /dev/null
+++ b/linbox/matrix/matrixdomain/opencl-domain-util.inl
@@ -0,0 +1,898 @@
+/*
+ * Copyright (C) 2012 Matthew Wezowicz
+ *
+ * Written by Matthew Wezowicz <mwezz at udel.edu>
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ * ========LICENCE========
+ *.
+ */
+
+/** @internal
+ * @file linbox/matrix/matrixdomain/opencl-domain-setup.inl
+ * @brief NO DOC
+ */
+
+
+#ifndef __LINBOX_opencl_matrix_domain_util_INL
+#define __LINBOX_opencl_matrix_domain_util_INL
+
+#include <cstdio>
+
+#include <utility>
+
+#include "linbox/matrix/matrixdomain/opencl-domain-factory.h"
+
+namespace LinBox{
+
+ /**
+ * @internal
+ * Initializes the OpenCL compute environment
+ */
+ template <class Field>
+ void OpenCLMatrixDomain<Field>::oclMatrixDomainAcquire(){
+
+ OpenCLMatrixDomainFactory::oclMatrixDomainInstance(this);
+ }
+
+ /**
+ * @internal
+ * Releases OpenCL cumpute resources
+ */
+ template <class Field>
+ void OpenCLMatrixDomain<Field>::oclMatrixDomainRelease(unsigned int IDnum_){
+
+ OpenCLMatrixDomainFactory::oclMatrixDomainDeallocate(IDnum_);
+ }
+
+ /**
+ * @internal
+ * Checks to see if the memory levels required are possible
+ */
+ template <>
+ template <class Operand1, class Operand2, class Operand3>
+ bool OpenCLMatrixDomain<Givaro::Modular<double> >::oclMemCheck(
+ Operand1& D,
+ const Operand2& A,
+ const Operand3& B,
+ const Operand1& C) const{
+
+ //Calculate dimensions after padding of matrices
+ //((A.coldim() / 16) + (A.coldim() % 16 == 0 ? 0 : 1)) * 16
+ int newDDimX = (int) ((D.coldim() + 15) / 16) * 16;
+ int newDDimY = (int) ((D.rowdim() + 15) / 16) * 16;
+ int newADimX = (int) ((A.coldim() + 15) / 16) * 16;
+ int newADimY = (int) ((A.rowdim() + 15) / 16) * 16;
+ int newBDimX = (int) ((B.coldim() + 15) / 16) * 16;
+ int newBDimY = (int) ((B.rowdim() + 15) / 16) * 16;
+ int newCDimX = (int) ((C.coldim() + 15) / 16) * 16;
+ int newCDimY = (int) ((C.rowdim() + 15) / 16) * 16;
+
+ //Determine if each individual matrix will fit in a buffer
+ bool temp = (maxBufferSize >= ((size_t)(newDDimX * newDDimY) * sizeof(cl_double)));
+ temp &= (maxBufferSize >= (size_t)(newADimX * newADimY) * sizeof(cl_double));
+ temp &= (maxBufferSize >= (size_t)(newBDimX * newBDimY) * sizeof(cl_double));
+ temp &= (maxBufferSize >= (size_t)(newCDimX * newCDimY) * sizeof(cl_double));
+
+ //Determine if all three buffers will fit at the same time
+ temp &= (memCapacity >= ((size_t)(newDDimX * newDDimY) + (size_t)(newADimX * newADimY) +
+ (size_t)(newBDimX * newBDimY) + (size_t)(newCDimX * newCDimY)) * sizeof(cl_double));
+
+ return temp;
+ }
+
+ template <>
+ template <class Operand1, class Operand2, class Operand3>
+ bool OpenCLMatrixDomain<Givaro::Modular<float> >::oclMemCheck(
+ Operand1& D,
+ const Operand2& A,
+ const Operand3& B,
+ const Operand1& C) const{
+
+ //Calculate dimensions after padding of matrices
+ //((A.coldim() / 16) + (A.coldim() % 16 == 0 ? 0 : 1)) * 16
+ int newDDimX = (int) ((D.coldim() + 15) / 16) * 16;
+ int newDDimY = (int) ((D.rowdim() + 15) / 16) * 16;
+ int newADimX = (int) ((A.coldim() + 15) / 16) * 16;
+ int newADimY = (int) ((A.rowdim() + 15) / 16) * 16;
+ int newBDimX = (int) ((B.coldim() + 15) / 16) * 16;
+ int newBDimY = (int) ((B.rowdim() + 15) / 16) * 16;
+ int newCDimX = (int) ((C.coldim() + 15) / 16) * 16;
+ int newCDimY = (int) ((C.rowdim() + 15) / 16) * 16;
+
+ //Determine if each individual matrix will fit in a buffer
+ bool temp = (maxBufferSize >= ((size_t)(newDDimX * newDDimY) * sizeof(cl_float)));
+ temp &= (maxBufferSize >= (size_t)(newADimX * newADimY) * sizeof(cl_float));
+ temp &= (maxBufferSize >= (size_t)(newBDimX * newBDimY) * sizeof(cl_float));
+ temp &= (maxBufferSize >= (size_t)(newCDimX * newCDimY) * sizeof(cl_float));
+
+ //Determine if all three buffers will fit at the same time
+ temp &= (memCapacity >= ((size_t)(newDDimX * newDDimY) + (size_t)(newADimX * newADimY) +
+ (size_t)(newBDimX * newBDimY) + (size_t)(newCDimX * newCDimY)) * sizeof(cl_float));
+
+ return temp;
+ }
+
+ template <>
+ template <>
+ bool OpenCLMatrixDomain<Givaro::Modular<double> >::oclMemCheck<std::pair<int,int> >(
+ std::pair<int,int>& D,
+ std::pair<int,int>& A,
+ std::pair<int,int>& B,
+ std::pair<int,int>& C) const{
+
+ //Calculate dimensions after padding of matrices
+ //((A.second / 16) + (A.second % 16 == 0 ? 0 : 1)) * 16
+ int newDDimX = ((D.second + 15) / 16) * 16;
+ int newDDimY = ((D.first + 15) / 16) * 16;
+ int newADimX = ((A.second + 15) / 16) * 16;
+ int newADimY = ((A.first + 15) / 16) * 16;
+ int newBDimX = ((B.second + 15) / 16) * 16;
+ int newBDimY = ((B.first + 15) / 16) * 16;
+ int newCDimX = ((C.second + 15) / 16) * 16;
+ int newCDimY = ((C.first + 15) / 16) * 16;
+
+ //Determine if each individual matrix will fit in a buffer
+ bool temp = (maxBufferSize >= (size_t)(newDDimX * newDDimY) * sizeof(cl_double));
+ temp &= (maxBufferSize >= (size_t)(newADimX * newADimY) * sizeof(cl_double));
+ temp &= (maxBufferSize >= (size_t)(newBDimX * newBDimY) * sizeof(cl_double));
+ temp &= (maxBufferSize >= (size_t)(newCDimX * newCDimY) * sizeof(cl_double));
+
+ //Determine if all three buffers will fit at the same time
+ temp &= (memCapacity >= ((size_t)(newDDimX * newDDimY) + (size_t)(newADimX * newADimY) +
+ (size_t)(newBDimX * newBDimY) + (size_t)(newCDimX * newCDimY)) * sizeof(cl_double));
+
+ return temp;
+ }
+
+ template <>
+ template <>
+ bool OpenCLMatrixDomain<Givaro::Modular<float> >::oclMemCheck<std::pair<int,int> >(
+ std::pair<int,int>& D,
+ std::pair<int,int>& A,
+ std::pair<int,int>& B,
+ std::pair<int,int>& C) const{
+
+ //Calculate dimensions after padding of matrices
+ //((A.second / 16) + (A.second % 16 == 0 ? 0 : 1)) * 16
+ int newDDimX = ((D.second + 15) / 16) * 16;
+ int newDDimY = ((D.first + 15) / 16) * 16;
+ int newADimX = ((A.second + 15) / 16) * 16;
+ int newADimY = ((A.first + 15) / 16) * 16;
+ int newBDimX = ((B.second + 15) / 16) * 16;
+ int newBDimY = ((B.first + 15) / 16) * 16;
+ int newCDimX = ((C.second + 15) / 16) * 16;
+ int newCDimY = ((C.first + 15) / 16) * 16;
+
+ //Determine if each individual matrix will fit in a buffer
+ bool temp = (maxBufferSize >= (size_t)(newDDimX * newDDimY) * sizeof(cl_float));
+ temp &= (maxBufferSize >= (size_t)(newADimX * newADimY) * sizeof(cl_float));
+ temp &= (maxBufferSize >= (size_t)(newBDimX * newBDimY) * sizeof(cl_float));
+ temp &= (maxBufferSize >= (size_t) (newCDimX * newCDimY) * sizeof(cl_float));
+
+ //Determine if all three buffers will fit at the same time
+ temp &= (memCapacity >= ((size_t)(newDDimX * newDDimY) + (size_t)(newADimX * newADimY) +
+ (size_t)(newBDimX * newBDimY) + (size_t)(newCDimX * newCDimY)) * sizeof(cl_float));
+
+ return temp;
+ }
+
+ /**
+ * @internal
+ * Functions to call the passed kernel on the passed buffers
+ */
+ template <class Field>
+ template <typename T, typename U>
+ void OpenCLMatrixDomain<Field>::oclCallKernel(
+ cl_mem bufferC,
+ cl_mem bufferA,
+ cl_mem bufferB,
+ int widthA,
+ int heightA,
+ int widthB,
+ T p,
+ cl_kernel selectedKernel) const{
+
+ //Pass kernel arguments
+ cl_int tempErrcode;
+ tempErrcode = clSetKernelArg(
+ selectedKernel,
+ 0,
+ sizeof(cl_mem),
+ (void*)&bufferC);
+ linbox_check(tempErrcode == CL_SUCCESS);
+
+ tempErrcode = clSetKernelArg(
+ selectedKernel,
+ 1,
+ sizeof(cl_mem),
+ (void*)&bufferA);
+ linbox_check(tempErrcode == CL_SUCCESS);
+
+ tempErrcode = clSetKernelArg(
+ selectedKernel,
+ 2,
+ sizeof(cl_mem),
+ (void*)&bufferB);
+ linbox_check(tempErrcode == CL_SUCCESS);
+
+ tempErrcode = clSetKernelArg(
+ selectedKernel,
+ 3,
+ sizeof(cl_int),
+ (void*)&widthA);
+ linbox_check(tempErrcode == CL_SUCCESS);
+
+ tempErrcode = clSetKernelArg(
+ selectedKernel,
+ 4,
+ sizeof(cl_int),
+ (void*)&widthB);
+ linbox_check(tempErrcode == CL_SUCCESS);
+
+ tempErrcode = clSetKernelArg(selectedKernel, 5, sizeof(U), (void*)&p);
+ linbox_check(tempErrcode == CL_SUCCESS);
+
+
+ //Set NDRange
+ size_t localWorkSize[2];
+ size_t globalWorkSize[2];
+ localWorkSize[0] = 16;
+ localWorkSize[1] = 16;
+ globalWorkSize[0] = (size_t)widthB;
+ globalWorkSize[1] = (size_t)heightA;
+
+ //Launch kernel
+ tempErrcode = clEnqueueNDRangeKernel(
+ commandQue,
+ selectedKernel,
+ 2,
+ NULL,
+ globalWorkSize,
+ localWorkSize,
+ 0,
+ NULL,
+ NULL);
+ linbox_check(tempErrcode == CL_SUCCESS);
+ }
+
+ template <class Field>
+ template <typename T, typename U>
+ void OpenCLMatrixDomain<Field>::oclCallKernel(
+ cl_mem bufferD,
+ cl_mem bufferA,
+ cl_mem bufferB,
+ cl_mem bufferC,
+ int widthA,
+ int heightA,
+ int widthB,
+ T p,
+ cl_kernel selectedKernel) const{
+
+ //Pass kernel arguments
+ cl_int tempErrcode;
+ tempErrcode = clSetKernelArg(
+ selectedKernel,
+ 0,
+ sizeof(cl_mem),
+ (void*)&bufferD);
+ linbox_check(tempErrcode == CL_SUCCESS);
+
+ tempErrcode = clSetKernelArg(
+ selectedKernel,
+ 1,
+ sizeof(cl_mem),
+ (void*)&bufferA);
+ linbox_check(tempErrcode == CL_SUCCESS);
+
+ tempErrcode = clSetKernelArg(
+ selectedKernel,
+ 2,
+ sizeof(cl_mem),
+ (void*)&bufferB);
+ linbox_check(tempErrcode == CL_SUCCESS);
+
+ tempErrcode = clSetKernelArg(
+ selectedKernel,
+ 3,
+ sizeof(cl_mem),
+ (void*)&bufferC);
+ linbox_check(tempErrcode == CL_SUCCESS);
+
+ tempErrcode = clSetKernelArg(
+ selectedKernel,
+ 4,
+ sizeof(cl_int),
+ (void*)&widthA);
+ linbox_check(tempErrcode == CL_SUCCESS);
+
+ tempErrcode = clSetKernelArg(
+ selectedKernel,
+ 5,
+ sizeof(cl_int),
+ (void*)&widthB);
+ linbox_check(tempErrcode == CL_SUCCESS);
+
+ tempErrcode = clSetKernelArg(selectedKernel, 6, sizeof(U), (void*)&p);
+ linbox_check(tempErrcode == CL_SUCCESS);
+
+ //Set NDRange
+ size_t localWorkSize[2];
+ size_t globalWorkSize[2];
+ localWorkSize[0] = 16;
+ localWorkSize[1] = 16;
+ globalWorkSize[0] = (size_t)widthB;
+ globalWorkSize[1] = (size_t)heightA;
+
+ //Launch kernel
+ tempErrcode = clEnqueueNDRangeKernel(
+ commandQue,
+ selectedKernel,
+ 2,
+ NULL,
+ globalWorkSize,
+ localWorkSize,
+ 0,
+ NULL,
+ NULL);
+ linbox_check(tempErrcode == CL_SUCCESS);
+ }
+
+ template <class Field>
+ template <typename T, typename U>
+ void OpenCLMatrixDomain<Field>::oclCallKernel(
+ cl_mem bufferD,
+ cl_mem bufferA,
+ cl_mem bufferB,
+ cl_mem bufferC,
+ T alpha,
+ T beta,
+ int widthA,
+ int heightA,
+ int widthB,
+ T p,
+ cl_kernel selectedKernel) const{
+
+ //Pass kernel arguments
+ cl_int tempErrcode;
+ tempErrcode = clSetKernelArg(
+ selectedKernel,
+ 0,
+ sizeof(cl_mem),
+ (void*)&bufferD);
+ linbox_check(tempErrcode == CL_SUCCESS);
+
+ tempErrcode = clSetKernelArg(
+ selectedKernel,
+ 1,
+ sizeof(U),
+ (void*)&alpha);
+ linbox_check(tempErrcode == CL_SUCCESS);
+
+ tempErrcode = clSetKernelArg(
+ selectedKernel,
+ 2,
+ sizeof(cl_mem),
+ (void*)&bufferA);
+ linbox_check(tempErrcode == CL_SUCCESS);
+
+ tempErrcode = clSetKernelArg(
+ selectedKernel,
+ 3,
+ sizeof(cl_mem),
+ (void*)&bufferB);
+ linbox_check(tempErrcode == CL_SUCCESS);
+
+ tempErrcode = clSetKernelArg(
+ selectedKernel,
+ 4,
+ sizeof(U),
+ (void*)&beta);
+ linbox_check(tempErrcode == CL_SUCCESS);
+
+ tempErrcode = clSetKernelArg(
+ selectedKernel,
+ 5,
+ sizeof(cl_mem),
+ (void*)&bufferC);
+ linbox_check(tempErrcode == CL_SUCCESS);
+
+ tempErrcode = clSetKernelArg(
+ selectedKernel,
+ 6,
+ sizeof(cl_int),
+ (void*)&widthA);
+ linbox_check(tempErrcode == CL_SUCCESS);
+
+ tempErrcode = clSetKernelArg(
+ selectedKernel,
+ 7,
+ sizeof(cl_int),
+ (void*)&widthB);
+ linbox_check(tempErrcode == CL_SUCCESS);
+
+ tempErrcode = clSetKernelArg(selectedKernel, 8, sizeof(U), (void*)&p);
+ linbox_check(tempErrcode == CL_SUCCESS);
+
+
+ //Set NDRange
+ size_t localWorkSize[2];
+ size_t globalWorkSize[2];
+ localWorkSize[0] = 16;
+ localWorkSize[1] = 16;
+ globalWorkSize[0] = (size_t)widthB;
+ globalWorkSize[1] = (size_t)heightA;
+
+ //Launch kernel
+ tempErrcode = clEnqueueNDRangeKernel(
+ commandQue,
+ selectedKernel,
+ 2,
+ NULL,
+ globalWorkSize,
+ localWorkSize,
+ 0,
+ NULL,
+ NULL);
+ linbox_check(tempErrcode == CL_SUCCESS);
+
+ }
+
+
+ /**
+ * @internal
+ * Functions to partition the matrices into submatrix views
+ */
+ template <class Field>
+ template <class Operand1, class Operand2, class Operand3>
+ std::vector<int> OpenCLMatrixDomain<Field>::oclPartition(
+ Operand1& C,
+ const Operand2& A,
+ const Operand3& B,
+ std::vector<SubmatrixAdapter<Operand1> >& VC,
+ std::vector<SubmatrixAdapter<Operand2> >& VA,
+ std::vector<SubmatrixAdapter<Operand3> >& VB) const{
+
+ std::vector<SubmatrixAdapter<Operand1> > VT;
+ return oclPartition<Operand1,Operand2,Operand3>(C,A,B,C,VT,VA,VB,VC);
+ }
+
+ template <class Field>
+ template <class Operand1, class Operand2, class Operand3>
+ std::vector<int> OpenCLMatrixDomain<Field>::oclPartition(
+ Operand1& D,
+ const Operand2& A,
+ const Operand3& B,
+ const Operand1& C,
+ std::vector<SubmatrixAdapter<Operand1> >& VD,
+ std::vector<SubmatrixAdapter<Operand2> >& VA,
+ std::vector<SubmatrixAdapter<Operand3> >& VB,
+ std::vector<SubmatrixAdapter<Operand1> >& VC) const{
+
+ //Compute if the OpenCL device is capable of working with the required ammounts of memory
+ bool memLevelsAllowed = oclMemCheck<Operand1,Operand2,Operand3>(D,A,B,C);
+
+ std::vector<int> temp;
+
+ if(memLevelsAllowed){
+ // Create Submatrix views
+ SubmatrixAdapter<Operand1> SD(D);
+ SubmatrixAdapter<Operand2> SA(A);
+ SubmatrixAdapter<Operand3> SB(B);
+ SubmatrixAdapter<Operand1> SC(C);
+
+ // Place Submatrices at the beginning of the vectors
+ VD.push_back(SD);
+ VA.push_back(SA);
+ VB.push_back(SB);
+ VC.push_back(SC);
+
+ // Return the block dimensions
+ temp.push_back(1); //DBlocksX & CBlocksX
+ temp.push_back(1); //DBlocksY & CBlocksY
+ temp.push_back(1); //ABlocksY
+ temp.push_back(1); //ABlocksY
+ temp.push_back(1); //CBlocksY
+ temp.push_back(1); //CBlocksY
+
+ return temp;
+ }
+
+ //Begin search for Submatrices small enough to search on the device
+ int DRows = (int) D.rowdim();
+ int DCols = (int) D.coldim();
+ int ARows = (int) A.rowdim();
+ int ACols = (int) A.rowdim();
+ int BRows = (int) B.rowdim();
+ int BCols = (int) B.coldim();
+
+ if(true){ //Default partitioning scheme
+
+ //Loop until Submatrices that fit on the device have been found
+ while(!memLevelsAllowed){
+ int divisionFactor = 1;
+ //Increase the number of subsections
+ divisionFactor++;
+
+ //Compute the number of rows and columns in each subsections
+ int subRows = DRows / divisionFactor;
+ int subCols = DCols / divisionFactor;
+ int subSharedDim = ACols / divisionFactor;
+
+ //Check if adjustment is need for some of the subsections
+ bool addToSubRows = false;
+ bool addToSubCols = false;
+ bool addToSubSharedDim = false;
+
+ if((subRows * divisionFactor) != DRows){
+ addToSubRows = true;
+ }
+ if((subCols * divisionFactor) != DCols){
+ addToSubCols = true;
+ }
+ if((subSharedDim * divisionFactor) != ACols){
+ addToSubSharedDim = true;
+ }
+
+ //Determine of the largest subsections will fit on the device together
+ int largestSubRows = (addToSubRows ? subRows : (subRows + 1));
+ int largestSubCols = (addToSubCols ? subCols : (subCols + 1));
+ int largestSubSharedDim = (addToSubSharedDim ? subSharedDim :
+ (subSharedDim + 1));
+
+ std::pair<int,int> largestSubD(largestSubRows, largestSubCols);
+ std::pair<int,int> largestSubA(largestSubRows, largestSubSharedDim);
+ std::pair<int,int> largestSubB(largestSubSharedDim, largestSubCols);
+ std::pair<int,int> largestSubC(largestSubRows, largestSubCols);
+
+ memLevelsAllowed = oclMemCheck<std::pair<int,int> >(
+ largestSubD,
+ largestSubA,
+ largestSubB,
+ largestSubC);
+
+ //If the largest subsections can fit on the device together
+ //Begin partitioning the input matrices
+ if(memLevelsAllowed){
+ // Return the block dimensions
+ temp.push_back(divisionFactor); //DBlocksX & CBlocksX
+ temp.push_back(divisionFactor); //DBlocksY & CBlocksY
+ temp.push_back(divisionFactor); //ABlocksY
+ temp.push_back(divisionFactor); //ABlocksY
+ temp.push_back(divisionFactor); //CBlocksY
+ temp.push_back(divisionFactor); //CBlocksY
+
+ //Loop through all but the last row
+ for(int blockY = 0; blockY < (divisionFactor - 1); blockY++){
+ int DRowsOffset = blockY * subRows;
+ int ARowsOffset = blockY * subRows;
+ int BRowsOffset = blockY * subSharedDim;
+
+ //Loop through all but the last column
+ for(int blockX = 0; blockX < (divisionFactor - 1); blockX++){
+ int DColsOffset = blockX * subCols;
+ int AColsOffset = blockX * subSharedDim;
+ int BColsOffset = blockX * subCols;
+
+ SubmatrixAdapter<Operand1> SD(
+ D,
+ (size_t)DRowsOffset,
+ (size_t)DColsOffset,
+ (size_t)subRows,
+ (size_t)subCols);
+ SubmatrixAdapter<Operand2> SA(
+ A,
+ (size_t)ARowsOffset,
+ (size_t)AColsOffset,
+ (size_t)subRows,
+ (size_t)subSharedDim);
+ SubmatrixAdapter<Operand3> SB(
+ B,
+ (size_t)BRowsOffset,
+ (size_t)BColsOffset,
+ (size_t)subSharedDim,
+ (size_t)subCols);
+ SubmatrixAdapter<Operand1> SC(
+ C,
+ (size_t)DRowsOffset,
+ (size_t)DColsOffset,
+ (size_t)subRows,
+ (size_t)subCols);
+
+ VD.push_back(SD);
+ VA.push_back(SA);
+ VB.push_back(SB);
+ VC.push_back(SC);
+ }
+
+ int DColsOffset = (divisionFactor - 1) * subCols;
+ int AColsOffset = (divisionFactor - 1) * subSharedDim;
+ int BColsOffset = (divisionFactor - 1) * subCols;
+
+ SubmatrixAdapter<Operand1> SD(
+ D,
+ (size_t)DRowsOffset,
+ (size_t)DColsOffset,
+ (size_t)subRows,
+ (size_t)(DCols - DColsOffset));
+ SubmatrixAdapter<Operand2> SA(
+ A,
+ (size_t)ARowsOffset,
+ (size_t)AColsOffset,
+ (size_t)subRows,
+ (size_t)(ACols - AColsOffset));
+ SubmatrixAdapter<Operand3> SB(
+ B,
+ (size_t)BRowsOffset,
+ (size_t)BColsOffset,
+ (size_t)subSharedDim,
+ (size_t)(BCols - BColsOffset));
+ SubmatrixAdapter<Operand1> SC(
+ C,
+ (size_t)DRowsOffset,
+ (size_t)DColsOffset,
+ (size_t)subRows,
+ (size_t)(DCols - DColsOffset));
+
+ VD.push_back(SD);
+ VA.push_back(SA);
+ VB.push_back(SB);
+ VC.push_back(SC);
+ }
+
+ //Partition the last row
+ int DRowsOffset = (divisionFactor - 1) * subRows;
+ int ARowsOffset = (divisionFactor - 1) * subRows;
+ int BRowsOffset = (divisionFactor - 1) * subSharedDim;
+
+ for(int blockX = 0; blockX < (divisionFactor - 1); blockX++){
+ int DColsOffset = blockX * subCols;
+ int AColsOffset = blockX * subSharedDim;
+ int BColsOffset = blockX * subCols;
+
+ SubmatrixAdapter<Operand1> SD(
+ D,
+ (size_t)DRowsOffset,
+ (size_t)DColsOffset,
+ (size_t)(DRows - DRowsOffset),
+ (size_t)subCols);
+ SubmatrixAdapter<Operand2> SA(
+ A,
+ (size_t)ARowsOffset,
+ (size_t)AColsOffset,
+ (size_t)(ARows - ARowsOffset),
+ (size_t)subSharedDim);
+ SubmatrixAdapter<Operand3> SB(
+ B,
+ (size_t)BRowsOffset,
+ (size_t)BColsOffset,
+ (size_t)(BRows - BRowsOffset),
+ (size_t)subCols);
+ SubmatrixAdapter<Operand1> SC(
+ C,
+ (size_t)DRowsOffset,
+ (size_t)DColsOffset,
+ (size_t)(DRows - DRowsOffset),
+ (size_t)subCols);
+
+ VD.push_back(SD);
+ VA.push_back(SA);
+ VB.push_back(SB);
+ VC.push_back(SC);
+ }
+
+ int DColsOffset = (divisionFactor - 1) * subCols;
+ int AColsOffset = (divisionFactor - 1) * subSharedDim;
+ int BColsOffset = (divisionFactor - 1) * subCols;
+
+ SubmatrixAdapter<Operand1> SD(
+ D,
+ (size_t)DRowsOffset,
+ (size_t)DColsOffset,
+ (size_t)(DRows - DRowsOffset),
+ (size_t)(DCols - DColsOffset));
+ SubmatrixAdapter<Operand2> SA(
+ A,
+ (size_t)ARowsOffset,
+ (size_t)AColsOffset,
+ (size_t)(ARows - ARowsOffset),
+ (size_t)(ACols - AColsOffset));
+ SubmatrixAdapter<Operand3> SB(
+ B,
+ (size_t)BRowsOffset,
+ (size_t)BColsOffset,
+ (size_t)(BRows - BRowsOffset),
+ (size_t)(BCols - BColsOffset));
+ SubmatrixAdapter<Operand1> SC(
+ C,
+ (size_t)DRowsOffset,
+ (size_t)DColsOffset,
+ (size_t)(DRows - DRowsOffset),
+ (size_t)(DCols - DColsOffset));
+
+ VD.push_back(SD);
+ VA.push_back(SA);
+ VB.push_back(SB);
+ VC.push_back(SC);
+
+ }
+ }
+ }
+
+ return temp;
+ }
+
+ //Prints the appropriate error message
+ template <class Field>
+ void OpenCLMatrixDomain<Field>::printClErrstring(cl_int err) const{
+ switch (err) {
+ case CL_SUCCESS:
+ std::cout << "Success!\n";
+ break;
+ case CL_DEVICE_NOT_FOUND:
+ std::cout << "Device not found\n";
+ break;
+ case CL_DEVICE_NOT_AVAILABLE:
+ std::cout << "Device not available\n";
+ break;
+ case CL_COMPILER_NOT_AVAILABLE:
+ std::cout << "Compiler not available\n";
+ break;
+ case CL_MEM_OBJECT_ALLOCATION_FAILURE:
+ std::cout << "Memory object allocation failure\n";
+ break;
+ case CL_OUT_OF_RESOURCES:
+ std::cout << "Out of resources\n";
+ break;
+ case CL_OUT_OF_HOST_MEMORY:
+ std::cout << "Out of host memory\n";
+ break;
+ case CL_PROFILING_INFO_NOT_AVAILABLE:
+ std::cout << "Profiling information not available\n";
+ break;
+ case CL_MEM_COPY_OVERLAP:
+ std::cout << "Memory copy overlap\n";
+ break;
+ case CL_IMAGE_FORMAT_MISMATCH:
+ std::cout << "Image format mismatch\n";
+ break;
+ case CL_IMAGE_FORMAT_NOT_SUPPORTED:
+ std::cout << "Image format not supported\n";
+ break;
+ case CL_BUILD_PROGRAM_FAILURE:
+ std::cout << "Program build failure\n";
+ break;
+ case CL_MAP_FAILURE:
+ std::cout << "Map failure\n";
+ break;
+ case CL_INVALID_VALUE:
+ std::cout << "Invalid value\n";
+ break;
+ case CL_INVALID_DEVICE_TYPE:
+ std::cout << "Invalid device type\n";
+ break;
+ case CL_INVALID_PLATFORM:
+ std::cout << "Invalid platform\n";
+ break;
+ case CL_INVALID_DEVICE:
+ std::cout << "Invalid device\n";
+ break;
+ case CL_INVALID_CONTEXT:
+ std::cout << "Invalid context\n";
+ break;
+ case CL_INVALID_QUEUE_PROPERTIES:
+ std::cout << "Invalid queue properties\n";
+ break;
+ case CL_INVALID_COMMAND_QUEUE:
+ std::cout << "Invalid command queue\n";
+ break;
+ case CL_INVALID_HOST_PTR:
+ std::cout << "Invalid host pointer\n";
+ break;
+ case CL_INVALID_MEM_OBJECT:
+ std::cout << "Invalid memory object\n";
+ break;
+ case CL_INVALID_IMAGE_FORMAT_DESCRIPTOR:
+ std::cout << "Invalid image format descriptor\n";
+ break;
+ case CL_INVALID_IMAGE_SIZE:
+ std::cout << "Invalid image size\n";
+ break;
+ case CL_INVALID_SAMPLER:
+ std::cout << "Invalid sampler\n";
+ break;
+ case CL_INVALID_BINARY:
+ std::cout << "Invalid binary\n";
+ break;
+ case CL_INVALID_BUILD_OPTIONS:
+ std::cout << "Invalid build options\n";
+ break;
+ case CL_INVALID_PROGRAM:
+ std::cout << "Invalid program\n";
+ break;
+ case CL_INVALID_PROGRAM_EXECUTABLE:
+ std::cout << "Invalid program executable\n";
+ break;
+ case CL_INVALID_KERNEL_NAME:
+ std::cout << "Invalid kernel name\n";
+ break;
+ case CL_INVALID_KERNEL_DEFINITION:
+ std::cout << "Invalid kernel definition\n";
+ break;
+ case CL_INVALID_KERNEL:
+ std::cout << "Invalid kernel\n";
+ break;
+ case CL_INVALID_ARG_INDEX:
+ std::cout << "Invalid argument index\n";
+ break;
+ case CL_INVALID_ARG_VALUE:
+ std::cout << "Invalid argument value\n";
+ break;
+ case CL_INVALID_ARG_SIZE:
+ std::cout << "Invalid argument size\n";
+ break;
+ case CL_INVALID_KERNEL_ARGS:
+ std::cout << "Invalid kernel arguments\n";
+ break;
+ case CL_INVALID_WORK_DIMENSION:
+ std::cout << "Invalid work dimension\n";
+ break;
+ case CL_INVALID_WORK_GROUP_SIZE:
+ std::cout << "Invalid work group size\n";
+ break;
+ case CL_INVALID_WORK_ITEM_SIZE:
+ std::cout << "Invalid work item size\n";
+ break;
+ case CL_INVALID_GLOBAL_OFFSET:
+ std::cout << "Invalid global offset\n";
+ break;
+ case CL_INVALID_EVENT_WAIT_LIST:
+ std::cout << "Invalid event wait list\n";
+ break;
+ case CL_INVALID_EVENT:
+ std::cout << "Invalid event\n";
+ break;
+ case CL_INVALID_OPERATION:
+ std::cout << "Invalid operation\n";
+ break;
+ case CL_INVALID_GL_OBJECT:
+ std::cout << "Invalid OpenGL object\n";
+ break;
+ case CL_INVALID_BUFFER_SIZE:
+ std::cout << "Invalid buffer size\n";
+ break;
+ case CL_INVALID_MIP_LEVEL:
+ std::cout << "Invalid mip-map level\n";
+ break;
+ default:
+ std::cout << "Unknown\n";
+ break;
+ }
+ }
+
+} //end of namespace LinBox
+
+#endif // __LINBOX_opencl_matrix_domain_util_INL
+
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
diff --git a/linbox/matrix/matrixdomain/opencl-domain.h b/linbox/matrix/matrixdomain/opencl-domain.h
new file mode 100644
index 0000000..a73eff7
--- /dev/null
+++ b/linbox/matrix/matrixdomain/opencl-domain.h
@@ -0,0 +1,995 @@
+/*
+ * Copyright (C) 2011 David Saunders
+ * 2011-2012 Matthew Wezowicz
+ *
+ * Written by Matthew Wezowicz <mwezz at udel.edu>
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ * ========LICENCE========
+ *.
+ */
+
+/*! @file matrix/matrixdomain/opencl-domain.h
+ * @ingroup matrixdomain
+ * @ingroup opencl
+ * @brief NO DOC
+ * @warning An <code>OpenCLMatrixDomain<Field></code> should be templated by a
+ * Givaro::Modular<double> or Givaro::Modular<float> field only.
+ */
+
+#ifndef __LINBOX_opencl_matrix_domain_H
+#define __LINBOX_opencl_matrix_domain_H
+
+#include <vector>
+#include <iostream>
+#include <pthread.h>
+
+#ifdef __LINBOX_HAVE_OCL
+#include <CL/cl.h>
+#endif
+
+#include "linbox/linbox-config.h"
+#include "linbox/util/debug.h"
+#include "linbox/matrix/matrixdomain/blas-matrix-domain.h"
+
+namespace LinBox{
+
+ /**
+ * Generic submatrix view adapter used internally in the OpenCLMatrixDomain
+ */
+ template <class _Matrix>
+ class SubmatrixAdapter{
+ public:
+ //Access to underlying types
+ typedef typename _Matrix::Field Field;
+ typedef typename Field::Element Element;
+ typedef SubmatrixAdapter<_Matrix> Self_t;
+
+ private:
+ _Matrix* _Mat; //!< Parent Matrix (ie raw vector)
+ size_t _row; //!< row dimension of Submatrix
+ size_t _col; //!< col dimension of Submatrix
+ size_t _r0; //!< upper left corner row of Submatrix in \p _Mat
+ size_t _c0; //!< upper left corner row of Submatrix in \p _Mat
+ size_t _stride; //!< number of columns in \p _Mat (or stride of \p _Mat)
+ size_t _off; //!< offset from start of parent matrix
+
+ public:
+ /** NULL constructor. */
+ SubmatrixAdapter() :
+ _Mat(NULL),
+ _row(0),
+ _col(0),
+ _r0(0),
+ _c0(0),
+ _stride(0),
+ _off(0){}
+
+ /** Constructor from an existing @refMatrix
+ * \param M Pointer to @ref Matrix of which to construct submatrix
+ */
+ SubmatrixAdapter(const _Matrix& M) :
+ _Mat(&(const_cast<_Matrix&>(M))),
+ _row(M.rowdim()),
+ _col(M.coldim()),
+ _r0(0),
+ _c0(0),
+ _stride(M.coldim()),
+ _off(0){}
+
+ /** Constructor from an existing @ref Matrix and dimensions.
+ * \param M Pointer to @ref Matrix of which to construct submatrix
+ * \param row Starting row
+ * \param col Starting column
+ * \param Rowdim Row dimension
+ * \param Coldim Column dimension
+ */
+ SubmatrixAdapter(
+ const _Matrix& M,
+ size_t row,
+ size_t col,
+ size_t Rowdim,
+ size_t Coldim) :
+ //Init list starts here
+ _Mat(&(const_cast<_Matrix&>(M))),
+ _row(Rowdim),
+ _col(Coldim),
+ _r0(row),
+ _c0(col),
+ _stride(M.coldim()),
+ _off(row * _stride + col){}
+
+ //! BB constructor to reduce warnings in clang
+ SubmatrixAdapter(
+ const _Matrix& M,
+ int row,
+ int col,
+ int Rowdim,
+ int Coldim) :
+ //Init list starts here
+ _Mat(&(const_cast<_Matrix&>(M))),
+ _row((size_t) Rowdim),
+ _col((size_t) Coldim),
+ _r0((size_t) row),
+ _c0((size_t) col),
+ _stride( M.coldim()),
+ _off((size_t) row * _stride + (size_t)col){}
+
+ /** Constructor from an existing @ref SubmatrixAdapter
+ * \param SM Pointer to @ref SubmatrixAdapter of which to construct submatrix
+ */
+ SubmatrixAdapter(const SubmatrixAdapter<_Matrix>& SM) :
+ _Mat(SM._Mat),
+ _row(SM._row),
+ _col(SM._col),
+ _r0(SM._r0),
+ _c0(SM._c0),
+ _stride(SM._stride),
+ _off(SM._off){}
+
+ /** Constructor from an existing submatrix and dimensions
+ * @param SM Constant reference to SubmatrixAdapter from which to
+ * construct submatrix
+ * @param rowbeg Starting row
+ * @param colbeg Starting column
+ * @param Rowdim Row dimension
+ * @param Coldim Column dimension
+ */
+ SubmatrixAdapter(
+ const SubmatrixAdapter<_Matrix>& SM,
+ size_t row,
+ size_t col,
+ size_t Rowdim,
+ size_t Coldim) :
+ //Init list starts here
+ _Mat(SM._Mat),
+ _row(Rowdim),
+ _col(Coldim),
+ _r0(SM._r0 + row),
+ _c0(SM._c0 + col),
+ _stride(SM._stride),
+ _off(SM._off + (row * _stride + col)){}
+
+ //! BB constructor to reduce warnings in clang
+ SubmatrixAdapter(
+ const SubmatrixAdapter<_Matrix>& SM,
+ int row,
+ int col,
+ int Rowdim,
+ int Coldim) :
+ //Init list starts here
+ _Mat(SM._Mat),
+ _row((size_t)Rowdim),
+ _col((size_t)Coldim),
+ _r0(SM._r0 + (size_t)row),
+ _c0(SM._c0 + (size_t)col),
+ _stride(SM._stride),
+ _off(SM._off + ((size_t)row * _stride + (size_t)col)){}
+
+
+ /** Get the number of rows in the matrix
+ * @return Number of rows in matrix
+ */
+ size_t rowdim() const{
+ return _row;
+ }
+
+ /** Get the number of columns in the matrix
+ * @return Number of columns in matrix
+ */
+ size_t coldim() const{
+ return _col;
+ }
+
+ /*!�Get the stride of the matrix.
+ * @return stride of submatrix (number of cols of parent matrix)
+ */
+ size_t getStride() const{
+ return _stride;
+ }
+
+ /** Set the entry at (i, j).
+ * @param i Row index of entry, 0...rowdim() - 1
+ * @param j Column index of entry, 0...coldim() - 1
+ * @param a_ij Element to set
+ */
+ void setEntry(size_t i, size_t j, const Element& a_ij){
+ _Mat->setEntry(_r0 + i, _c0 + j, a_ij);
+ }
+
+ /** Get a writeable reference to an entry in the matrix.
+ * @param i Row index of entry, 0...rowdim() - 1
+ * @param j Column index of entry, 0...coldim() - 1
+ * @return Reference to matrix entry
+ */
+ Element& refEntry(size_t i, size_t j){
+ _Mat->refEntry(_r0 + i, _c0 + j);
+ }
+
+ /** Get a read-only individual entry from the matrix.
+ * @param i Row index of entry, 0...rowdim() - 1
+ * @param j Column index of entry, 0...coldim() - 1
+ * @return Const reference to matrix entry
+ */
+ const Element& getEntry(size_t i, size_t j) const{
+ return _Mat->getEntry(_r0 + i, _c0 + j);
+ }
+
+ /** Get an entry and store it in the given value.
+ * This form is more in the Linbox style and is provided for interface
+ * compatibility with other parts of the library
+ * @param x Element in which to store result
+ * @param i Row index of entry, 0...rowdim() - 1
+ * @param j Column index of entry, 0...coldim() - 1
+ * @return Reference to x
+ */
+ Element& getEntry(Element& x, size_t i, size_t j){
+ return _Mat->getEntry(x, _r0 + i, _c0 + j);
+ }
+
+ /** Access the parent matrix
+ * @return Reference to _Mat
+ */
+ _Matrix& getMatrix(){
+ return *_Mat;
+ }
+ };
+
+ /**
+ * Interface for all functionnalities provided
+ * for BlasMatrix using GPUs.
+ * @internal
+ * Done through specialization of some of the member funcions
+ * defined below. Otherwise, by default the single processor
+ * BlasMatrixDomain funcions are invoked.
+ */
+ template <class Field_>
+ class OpenCLMatrixDomain {
+
+ public:
+ typedef Field_ Field;
+ typedef typename Field::Element Element;
+ typedef BlasMatrix<Field,typename Vector<Field>::Dense > Matrix;
+#ifdef __LINBOX_HAVE_OCL
+ friend class OpenCLMatrixDomainFactory;
+#endif
+
+ protected:
+
+ const Field& _F;
+
+#ifdef __LINBOX_HAVE_OCL
+ //OpenCL specific variables
+ cl_context context;
+ cl_device_id device;
+ cl_command_queue commandQue;
+ cl_int errcode;
+
+ //Storage for memory levels
+ unsigned long memCapacity;
+ unsigned long maxBufferSize;
+
+ //Container type flag
+ bool GPUcontainer;
+ bool CPUcontainer;
+ bool setupCorrect;
+ bool doubleSupported;
+
+ //Storage for kernels and flags for availability
+ cl_kernel dpKernels[20];
+ bool dpKernelsAvailable[20];
+ cl_kernel spKernels[20];
+ bool spKernelsAvailable[20];
+
+ //ID number assigned by OpenCLMatrixDomainFactory
+ unsigned int IDnum;
+
+ //Mutex
+ pthread_mutex_t* deviceLock;
+
+ /**
+ * @internal
+ * Initializes the OpenCL compute environment
+ */
+ void oclMatrixDomainAcquire();
+
+ /**
+ * @internal
+ * Releases OpenCL cumpute resources
+ */
+ void oclMatrixDomainRelease(unsigned int IDnum);
+
+ /**
+ * @internal
+ * Checks to see if the memory levels required are possible
+ */
+ template <class Operand1, class Operand2, class Operand3>
+ bool oclMemCheck(
+ Operand1& D,
+ const Operand2& A,
+ const Operand3& B,
+ const Operand1& C) const;
+
+ template <class Operand1>
+ bool oclMemCheck(
+ Operand1& D,
+ Operand1& A,
+ Operand1& B,
+ Operand1& C) const;
+
+ /**
+ * @internal
+ * OpenCL memory management functions
+ */
+ template <typename T, class Operand1>
+ cl_mem oclCreateMatrixBuffer(Operand1 &matrix) const;
+
+ template <typename T, class Operand1>
+ cl_mem oclCreateAndLoadMatrixBuffer(const Operand1 &matrix) const;
+
+ template <typename T, class Operand2>
+ Operand2& oclReadMatrixBuffer(cl_mem buffer, Operand2 &matrix) const;
+
+ template <typename T, class Operand1>
+ cl_mem oclPadMatrix(
+ cl_mem matrixBuffer,
+ int matrixBufferSize,
+ int newDimX,
+ const Operand1 &matrix) const;
+
+ template <typename T, class Operand1>
+ Operand1& oclDepadMatrix(
+ cl_mem matrixBuffer,
+ int matrixBufferSize,
+ int outputSize,
+ int newDimX,
+ Operand1& matrix) const;
+
+ /**
+ * @internal
+ * Functions to call the passed kernel on the passed buffers
+ */
+ template <typename T, typename U>
+ void oclCallKernel(
+ cl_mem bufferC,
+ cl_mem bufferA,
+ cl_mem bufferB,
+ int widthA,
+ int heightA,
+ int widthB,
+ T p,
+ cl_kernel selectedKernel) const;
+
+ template <typename T, typename U>
+ void oclCallKernel(
+ cl_mem bufferD,
+ cl_mem bufferA,
+ cl_mem bufferB,
+ cl_mem bufferC,
+ int widthA,
+ int heightA,
+ int widthB,
+ T p,
+ cl_kernel selectedKernel) const;
+
+ template <typename T, typename U>
+ void oclCallKernel(
+ cl_mem bufferD,
+ cl_mem bufferA,
+ cl_mem bufferB,
+ cl_mem bufferC,
+ T alpha,
+ T beta,
+ int widthA,
+ int heightA,
+ int widthB,
+ T p,
+ cl_kernel selectedKernel) const;
+
+ /**
+ * @internal
+ * Functions to partition the matrices into submatrix views
+ */
+ template <class Operand1, class Operand2, class Operand3>
+ std::vector<int> oclPartition(
+ Operand1& C,
+ const Operand2& A,
+ const Operand3& B,
+ std::vector<SubmatrixAdapter<Operand1> >& VC,
+ std::vector<SubmatrixAdapter<Operand2> >& VA,
+ std::vector<SubmatrixAdapter<Operand3> >& VB) const;
+
+ template <class Operand1, class Operand2, class Operand3>
+ std::vector<int> oclPartition(
+ Operand1& D,
+ const Operand2& A,
+ const Operand3& B,
+ const Operand1& C,
+ std::vector<SubmatrixAdapter<Operand1> >& VD,
+ std::vector<SubmatrixAdapter<Operand2> >& VA,
+ std::vector<SubmatrixAdapter<Operand3> >& VB,
+ std::vector<SubmatrixAdapter<Operand1> >& VC) const;
+
+ void printClErrstring(cl_int err) const;
+#else
+ bool setupCorrect;
+#endif
+ public:
+
+ //! Constructor of OpenCLDomain.
+ OpenCLMatrixDomain(const Field& F ) : _F(F), setupCorrect(false){
+
+#ifndef NDEBUG
+ if(!Givaro::Protected::probab_prime(_F.characteristic())){
+ std::cout << " *** WARNING *** " << std::endl;
+ std::cout << " You are using a OpenCL Matrix Domain"
+ << " where your field is not prime "
+ << std::endl;
+ }
+#endif
+
+#ifdef __LINBOX_HAVE_OCL
+ //Initialize OpenCL environment
+ oclMatrixDomainAcquire();
+#endif
+ }
+
+ //! Copy constructor
+ OpenCLMatrixDomain(const OpenCLMatrixDomain<Field> & OMD) :
+ _F(OMD._F),
+ setupCorrect(false){
+
+#ifndef NDEBUG
+ if(!Givaro::Protected::probab_prime(_F.characteristic())){
+ std::cout << " *** WARNING *** " << std::endl;
+ std::cout << " You are using a OpenCL Matrix Domain"
+ << " where your field is not prime "
+ << std::endl;
+ }
+#endif
+
+#ifdef __LINBOX_HAVE_OCL
+ //Initialize OpenCL environment
+ oclMatrixDomainAcquire();
+#endif
+ }
+
+ //! Deconstructor
+ ~OpenCLMatrixDomain(){
+#ifdef __LINBOX_HAVE_OCL
+ oclMatrixDomainRelease(IDnum);
+#endif
+ }
+
+ //! Field accessor
+ const Field& field() const{
+ return _F;
+ }
+
+ /*
+ * Basics operation available matrix respecting BlasMatrix interface
+ */
+
+ //! multiplication.
+ //! C = A*B
+ template <class Operand1, class Operand2, class Operand3>
+ Operand1& mul(Operand1& C, const Operand2& A, const Operand3& B) const{
+ return BlasMatrixDomainMul<Field,Operand1,Operand2,Operand3>()(_F,C,A,B);
+ }
+
+ //! addition.
+ //! C = A+B
+ template <class Operand1, class Operand2, class Operand3>
+ Operand1& add(Operand1& C, const Operand2& A, const Operand3& B) const{
+ return BlasMatrixDomainAdd<Field,Operand1,Operand2,Operand3>()(_F,C,A,B);
+ }
+
+ //! copy.
+ //! B = A
+ template <class Operand1, class Operand2>
+ Operand1& copy(Operand1& B, const Operand2& A) const{
+ return BlasMatrixDomainCopy<Field,Operand1,Operand2>()(_F,B,A);
+ }
+
+ //! substraction
+ //! C = A-B
+ template <class Operand1, class Operand2, class Operand3>
+ Operand1& sub(Operand1& C, const Operand2& A, const Operand3& B) const{
+ return BlasMatrixDomainSub<Field,Operand1,Operand2,Operand3>()(_F,C,A,B);
+ }
+
+ //! substraction (in place)
+ //! C -= B
+ template <class Operand1, class Operand3>
+ Operand1& subin(Operand1& C, const Operand3& B) const{
+ return BlasMatrixDomainSubin<Field,Operand1,Operand3>()(_F,C,B);
+ }
+
+ //! addition (in place)
+ //! C += B
+ template <class Operand1, class Operand3>
+ Operand1& addin(Operand1& C, const Operand3& B) const{
+ return BlasMatrixDomainAddin<Field,Operand1,Operand3>()(_F,C,B);
+ }
+
+ //! multiplication with scaling.
+ //! C = alpha.A*B
+ template <class Operand1, class Operand2, class Operand3>
+ Operand1& mul(
+ Operand1& C,
+ const Element& alpha,
+ const Operand2& A,
+ const Operand3& B) const{
+
+ return muladdin(_F.zero,C,alpha,A,B);
+ }
+
+ //! In place multiplication.
+ //! A = A*B
+ template <class Operand1, class Operand2>
+ Operand1& mulin_left(Operand1& A, const Operand2& B) const{
+ return BlasMatrixDomainMulin<Field,Operand1,Operand2>()(_F,A,B);
+ }
+
+ //! In place multiplication.
+ //! B = A*B
+ template <class Operand1, class Operand2>
+ Operand2& mulin_right(const Operand1& A, Operand2& B) const{
+ return BlasMatrixDomainMulin<Field,Operand2,Operand1>()(_F,A,B);
+ }
+
+ //! axpy.
+ //! D = A*B + C
+ template <class Operand1, class Operand2, class Operand3>
+ Operand1& axpy(
+ Operand1& D,
+ const Operand2& A,
+ const Operand3& B,
+ const Operand1& C) const{
+
+ return muladd(D,_F.one,C,_F.one,A,B);
+ }
+
+ //! axpyin.
+ //! C += A*B
+ template <class Operand1, class Operand2, class Operand3>
+ Operand1& axpyin(Operand1& C, const Operand2& A, const Operand3& B) const{
+ return muladdin(_F.one,C,_F.one,A,B);
+ }
+
+ //! maxpy.
+ //! D = C - A*B
+ template <class Operand1, class Operand2, class Operand3>
+ Operand1& maxpy(
+ Operand1& D,
+ const Operand2& A,
+ const Operand3& B,
+ const Operand1& C) const{
+
+ return muladd(D,_F.one,C,_F.mOne,A,B);
+ }
+
+ //! maxpyin.
+ //! C -= A*B
+ template <class Operand1, class Operand2, class Operand3>
+ Operand1& maxpyin(Operand1& C, const Operand2& A, const Operand3& B) const{
+ return muladdin(_F.one,C,_F.mOne,A,B);
+ }
+
+ //! axmy.
+ //! D= A*B - C
+ template <class Operand1, class Operand2, class Operand3>
+ Operand1& axmy(
+ Operand1& D,
+ const Operand2& A,
+ const Operand3& B,
+ const Operand1& C) const{
+
+ return muladd(D,_F.mOne,C,_F.one,A,B);
+ }
+
+ //! axmyin.
+ //! C = A*B - C
+ template <class Operand1, class Operand2, class Operand3>
+ Operand1& axmyin(Operand1& C, const Operand2& A, const Operand3& B) const{
+ return muladdin(_F.mOne,C,_F.one,A,B);
+ }
+
+ //! general matrix-matrix multiplication and addition with scaling.
+ //! D= beta.C + alpha.A*B
+ template <class Operand1, class Operand2, class Operand3>
+ Operand1& muladd(
+ Operand1& D,
+ const Element& beta,
+ const Operand1& C,
+ const Element& alpha,
+ const Operand2& A,
+ const Operand3& B) const{
+
+ return BlasMatrixDomainMulAdd<Operand1,Operand2,Operand3>()(
+ D,
+ beta,
+ C,
+ alpha,
+ A,
+ B);
+ }
+
+ //! muladdin.
+ //! C= beta.C + alpha.A*B.
+ template <class Operand1, class Operand2, class Operand3>
+ Operand1& muladdin(
+ const Element& beta,
+ Operand1& C,
+ const Element& alpha,
+ const Operand2& A,
+ const Operand3& B) const{
+
+ return BlasMatrixDomainMulAdd<Operand1,Operand2,Operand3>()(
+ _F,
+ beta,
+ C,
+ alpha,
+ A,
+ B);
+ }
+
+ /*!
+ * @name Solutions available for matrix respecting BlasMatrix interface
+ */
+ //@{
+
+ //! Inversion
+ template <class Matrix>
+ Matrix& inv( Matrix &Ainv, const Matrix &A) const{
+ BlasMatrixDomainInv<Field,Matrix,Matrix>()(_F,Ainv,A);
+ return Ainv;
+ }
+
+ //! Inversion (in place)
+ template <class Matrix>
+ Matrix& invin( Matrix &Ainv, Matrix &A) const{
+ BlasMatrixDomainInv<Field,Matrix,Matrix>()(_F,Ainv,A);
+ return Ainv;
+ }
+
+ //! Inversion (the matrix A is modified)
+ template <class Matrix>
+ Matrix& invin(Matrix &A) const{
+ Matrix tmp(A.rowdim(), A.coldim());
+ tmp = A;
+ BlasMatrixDomainInv<Field,Matrix,Matrix>()(_F,A,tmp);
+ return A;
+ }
+
+ /*! Division.
+ * C = A B^{-1} ==> C . B = A
+ */
+ template <class Matrix>
+ Matrix& div(Matrix &C, const Matrix &A, const Matrix &B) const{
+ return this->right_solve(C,B,A);
+ }
+
+
+ //! Inversion w singular check
+ template <class Matrix>
+ Matrix& inv(Matrix &Ainv, const Matrix &A, int& nullity) const{
+ nullity = BlasMatrixDomainInv<Field,Matrix,Matrix>()(_F,Ainv,A);
+ return Ainv;
+ }
+
+ //! Inversion (the matrix A is modified) w singular check
+ template <class Matrix>
+ Matrix& invin(Matrix &Ainv, Matrix &A, int& nullity) const{
+ nullity = BlasMatrixDomainInv<Field,Matrix,Matrix>()(_F,Ainv,A);
+ return Ainv;
+ }
+
+ //! Rank
+ template <class Matrix>
+ unsigned int rank(const Matrix &A) const{
+ return BlasMatrixDomainRank<Field,Matrix>()(_F,A);
+ }
+
+ //! in-place Rank (the matrix is modified)
+ template <class Matrix>
+ unsigned int rankin(Matrix &A) const{
+ return BlasMatrixDomainRank<Field, Matrix>()(_F,A);
+ }
+
+ //! determinant
+ template <class Matrix>
+ Element det(const Matrix &A) const{
+ return BlasMatrixDomainDet<Field, Matrix>()(_F,A);
+ }
+
+ //! in-place Determinant (the matrix is modified)
+ template <class Matrix>
+ Element detin(Matrix &A) const{
+ return BlasMatrixDomainDet<Field, Matrix>()(_F,A);
+ }
+ //@}
+
+ /*!
+ * @name Solvers for Matrix (respecting BlasMatrix interface)
+ * with Operand as right or left hand side
+ */
+ //@{
+ //! linear solve with matrix right hand side.
+ //! AX=B
+ template <class Operand, class Matrix>
+ Operand& left_solve (Operand& X, const Matrix& A, const Operand& B) const{
+ return BlasMatrixDomainLeftSolve<Field,Operand,Matrix>()(_F,X,A,B);
+ }
+
+ //! linear solve with matrix right hand side, the result is stored in-place in B.
+ //! @pre A must be square
+ //! AX=B , (B<-X)
+ template <class Operand,class Matrix>
+ Operand& left_solve (const Matrix& A, Operand& B) const{
+ return BlasMatrixDomainLeftSolve<Field,Operand,Matrix>()(_F,A,B);
+ }
+
+ //! linear solve with matrix right hand side.
+ //! XA=B
+ template <class Operand, class Matrix>
+ Operand& right_solve (Operand& X, const Matrix& A, const Operand& B) const{
+ return BlasMatrixDomainRightSolve<Field,Operand,Matrix>()(_F,X,A,B);
+ }
+
+ //! linear solve with matrix right hand side, the result is stored in-place in B.
+ //! @pre A must be square
+ //! XA=B , (B<-X)
+ template <class Operand, class Matrix>
+ Operand& right_solve (const Matrix& A, Operand& B) const{
+ return BlasMatrixDomainRightSolve<Field,Operand,Matrix>()(_F,A,B);
+ }
+
+ //! minimal polynomial computation.
+ template <class Polynomial, class Matrix>
+ Polynomial& minpoly( Polynomial& P, const Matrix& A ) const{
+ return BlasMatrixDomainMinpoly<Field, Polynomial, Matrix>()(_F,P,A);
+ }
+
+ //! characteristic polynomial computation.
+ template <class Polynomial, class Matrix >
+ Polynomial& charpoly( Polynomial& P, const Matrix& A ) const{
+
+ commentator().start ("Givaro::Modular Dense Charpoly ", "MDCharpoly");
+ std::list<Polynomial> P_list;
+ P_list.clear();
+ BlasMatrixDomainCharpoly<Field, std::list<Polynomial>, Matrix >()(
+ _F,
+ P_list,
+ A);
+
+ Polynomial tmp(A.rowdim() + 1);
+ typename std::list<Polynomial>::iterator it = P_list.begin();
+ P = *(it++);
+ while(it != P_list.end()){
+ // Waiting for an implementation of a domain of polynomials
+ mulpoly(tmp, P, *it);
+ P = tmp;
+ //delete &(*it);
+ ++it;
+ }
+ commentator().stop ("done", NULL, "MDCharpoly");
+
+ return P;
+ }
+
+ //! characteristic polynomial computation.
+ template <class Polynomial, class Matrix >
+ std::list<Polynomial>& charpoly(
+ std::list<Polynomial>& P,
+ const Matrix& A ) const{
+
+ return BlasMatrixDomainCharpoly<
+ Field,
+ std::list<Polynomial>,
+ Matrix >()(_F,P,A);
+ }
+
+
+ //private:
+ //! @todo Temporary: waiting for an implementation of a domain of polynomial
+ template<class Polynomial>
+ Polynomial& mulpoly(
+ Polynomial &res,
+ const Polynomial & P1,
+ const Polynomial & P2) const{
+
+ res.resize(P1.size() + P2.size() - 1);
+
+ for(int i = 0; i < res.size(); i++){
+ _F.assign(res[i],_F.zero);
+ }
+
+ for(int i = 0; i < P1.size(); i++){
+ for(int j = 0; j < P2.size(); j++){
+ _F.axpyin(res[i + j],P1[i],P2[j]);
+ }
+ }
+
+ return res;
+ }
+ //@}
+
+ template<class Matrix1, class Matrix2>
+ bool areEqual(const Matrix1 & A, const Matrix2 & B){
+ if((A.rowdim() != B.rowdim()) || (A.coldim() != B.coldim())){
+ return false ;
+ }
+
+ for(size_t i = 0 ; i < A.rowdim() ; ++i){
+ for(size_t j = 0 ; j < A.coldim() ; ++j){
+ if(!_F.areEqual(A.getEntry(i,j),B.getEntry(i,j))){ //!@bug use refs
+ return false ;
+ }
+ }
+ }
+
+ return true ;
+ }
+
+ template<class Matrix>
+ void setIdentity(Matrix & I){
+ for(size_t i = 0 ; i < I.rowdim() ; ++i){
+ for(size_t j = 0 ; j < I.coldim() ; ++j){
+ if(i == j){
+ I.setEntry(i,j,_F.one);
+ }
+ else{
+ I.setEntry(i,j,_F.zero);
+ }
+ }
+ }
+ }
+
+ template<class Matrix>
+ void setZero(Matrix & I){
+ // use Iterator
+ for(size_t i = 0 ; i < I.rowdim() ; ++i){
+ for(size_t j = 0 ; j < I.coldim() ; ++j){
+ I.setEntry(i,j,_F.zero);
+ }
+ }
+ }
+
+ template<class Matrix1>
+ bool isZero(const Matrix1 & A){
+ for(size_t i = 0 ; i < A.rowdim() ; ++i){
+ for(size_t j = 0 ; j < A.coldim() ; ++j){
+ if(!_F.isZero(A.getEntry(i,j))){ //!@bug use refs
+ return false;
+ }
+ }
+ }
+
+ return true ;
+ }
+
+ template<class Matrix1>
+ bool isIdentity(const Matrix1 & A){
+ if(A.rowdim() != A.coldim()){
+ return false;
+ }
+
+ for(size_t i = 0 ; i < A.rowdim() ; ++i){
+ if(!_F.isOne(A.getEntry(i,i))){
+ return false;
+ }
+ }
+
+ for(size_t i = 0 ; i < A.rowdim() ; ++i){
+ for(size_t j = 0 ; j < i ; ++j){
+ if(!_F.isZero(A.getEntry(i,j))){ //!@bug use refs
+ return false;
+ }
+ }
+ }
+
+ for(size_t i = 0 ; i < A.rowdim() ; ++i){
+ for(size_t j = i + 1 ; j < A.coldim() ; ++j){
+ if(!_F.isZero(A.getEntry(i,j))){ //!@bug use refs
+ return false;
+ }
+ }
+ }
+
+ return true ;
+ }
+
+ template<class Matrix1>
+ bool isIdentityGeneralized(const Matrix1 & A){
+ size_t mn = std::min(A.rowdim(),A.coldim());
+ for(size_t i = 0 ; i < mn ; ++i){
+ if(!_F.isOne(A.getEntry(i,i))){
+ return false;
+ }
+ }
+
+ for(size_t i = 0 ; i < A.rowdim() ; ++i){
+ for(size_t j = 0 ; j < std::min(i,mn) ; ++j){
+ if(!_F.isZero(A.getEntry(i,j))){ //!@bug use refs
+ return false;
+ }
+ }
+ }
+
+ for(size_t i = 0 ; i < A.rowdim() ; ++i){
+ for(size_t j = i+1 ; j < A.coldim() ; ++j){
+ if(!_F.isZero(A.getEntry(i,j))){ //!@bug use refs
+ return false;
+ }
+ }
+ }
+
+ return true;
+ }
+
+ //public:
+
+ /** Print matrix.
+ * @param os Output stream to which matrix is written.
+ * @param A Matrix.
+ * @returns reference to os.
+ */
+ template <class Matrix>
+ inline std::ostream &write(std::ostream &os, const Matrix &A) const{
+ return A.write(os, _F);
+ }
+
+ template <class Matrix>
+ inline std::ostream &write(std::ostream &os,
+ const Matrix &A,
+ bool maple_format) const{
+
+ return A.write(os, _F, maple_format);
+ }
+
+ /** Read matrix
+ * @param is Input stream from which matrix is read.
+ * @param A Matrix.
+ * @returns reference to is.
+ */
+ template <class Matrix>
+ inline std::istream &read(std::istream &is, Matrix &A) const{
+ return A.read (is, _F);
+ }
+
+ }; /* end of class OpenCLMatrixDomain */
+
+} /* end of namespace LinBox */
+
+#ifdef __LINBOX_HAVE_OCL
+ #include "linbox/matrix/matrixdomain/opencl-domain-factory.h"
+ #include "linbox/matrix/matrixdomain/opencl-domain-util.inl"
+ #include "linbox/matrix/matrixdomain/opencl-domain-memory.inl"
+ #include "linbox/matrix/matrixdomain/opencl-domain.inl"
+#endif
+
+#endif // __LINBOX_opencl_matrix_domain_H
+
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/matrix/matrixdomain/opencl-domain.inl b/linbox/matrix/matrixdomain/opencl-domain.inl
new file mode 100644
index 0000000..ff6521c
--- /dev/null
+++ b/linbox/matrix/matrixdomain/opencl-domain.inl
@@ -0,0 +1,2459 @@
+/*
+ * Copyright (C) 2011 David Saunders
+ * 2011-2012 Matthew Wezowicz
+ *
+ * Written by Matthew Wezowicz <mwezz at udel.edu>
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ * ========LICENCE========
+ *.
+ */
+
+/** @internal
+ * @file linbox/matrix/matrixdomain/opencl-domain.inl
+ * @brief NO DOC
+ */
+
+#ifndef __LINBOX_opencl_matrix_domain_INL
+#define __LINBOX_opencl_matrix_domain_INL
+
+#include <pthread.h>
+
+#include "linbox/matrix/densematrix/blas-matrix.h"
+
+#include "CL/cl.h"
+
+namespace LinBox
+{
+
+ /*
+ * ******************************************************
+ * *** Specializations for BlasMatrix<Field> where ***
+ * *** the Field is Givaro::Modular<float> or Givaro::Modular<double> ***
+ * ******************************************************
+ */
+
+ /*
+ * Specialization of Mul for
+ * multiplying two general dense matrices
+ * over a Givaro::Modular<double> Field.
+ * C = A*B
+ */
+ template <>
+ template <class Operand1, class Operand2, class Operand3>
+ Operand1& OpenCLMatrixDomain<Givaro::Modular<double> >::mul(
+ Operand1& C,
+ const Operand2& A,
+ const Operand3& B) const{
+
+ //Check if kernels are available
+ bool kernelsAvailable = dpKernelsAvailable[0];
+ kernelsAvailable &= dpKernelsAvailable[1];
+ kernelsAvailable &= dpKernelsAvailable[2];
+ kernelsAvailable &= dpKernelsAvailable[3];
+ kernelsAvailable &= dpKernelsAvailable[8];
+ kernelsAvailable &= dpKernelsAvailable[9];
+ kernelsAvailable &= dpKernelsAvailable[10];
+ kernelsAvailable &= dpKernelsAvailable[11];
+
+ //If it is not capable or not setup properly use default implementation
+ if(!setupCorrect || !doubleSupported || !kernelsAvailable){
+ return BlasMatrixDomainMul<Givaro::Modular<double>,Operand1,Operand2,Operand3>()(
+ _F,
+ C,
+ A,
+ B);
+ }
+
+ //Check dimensions
+ linbox_check( A.coldim() == B.rowdim());
+ linbox_check( C.rowdim() == A.rowdim());
+ linbox_check( C.coldim() == B.coldim());
+
+ //Lock the device
+ pthread_mutex_lock(deviceLock);
+
+ //Partition the input matrices into chuncks that can fit onto the device
+ std::vector<SubmatrixAdapter<Operand1> > VC;
+ std::vector<SubmatrixAdapter<Operand2> > VA;
+ std::vector<SubmatrixAdapter<Operand3> > VB;
+ std::vector<int> partitionDims = oclPartition<Operand1,Operand2,Operand3>(
+ C,
+ A,
+ B,
+ VC,
+ VA,
+ VB);
+
+ //Break out the partitioned dimensions
+ int CBlocksX = partitionDims.at(0);
+ int CBlocksY = partitionDims.at(1);
+ int ABlocksX = partitionDims.at(2);
+ //int ABlocksY = partitionDims.at(3);
+ int BBlocksX = partitionDims.at(4);
+ //nt BBlocksY = partitionDims.at(5);
+
+ double p = (double) _F.characteristic();
+
+ //Select OpenCL kernel based on the size of the modulus factor for
+ //maximum performance
+ //p^2 * n < 2^53
+ cl_kernel selectedMulKernel;
+ cl_kernel selectedAxpyKernel;
+ if(p <= (1 << 21)){
+ selectedMulKernel = dpKernels[3];
+ selectedAxpyKernel = dpKernels[11];
+ }
+ else if(p <= (1 << 24)){
+ selectedMulKernel = dpKernels[2];
+ selectedAxpyKernel = dpKernels[10];
+ }
+ else if(p <= (1 << 25)){
+ selectedMulKernel = dpKernels[1];
+ selectedAxpyKernel = dpKernels[9];
+ }
+ else{
+ selectedMulKernel = dpKernels[0];
+ selectedAxpyKernel = dpKernels[8];
+ }
+
+ for(int blockCol = 0; blockCol < CBlocksX; blockCol++){
+ for(int blockRow = 0; blockRow < CBlocksY; blockRow++){
+
+ SubmatrixAdapter<Operand1> SC = VC.at((size_t)(blockRow * CBlocksX + blockCol));
+ SubmatrixAdapter<Operand2> SA = VA.at((size_t)(blockRow * ABlocksX));
+ SubmatrixAdapter<Operand3> SB = VB.at((size_t)blockCol);
+
+ //Allocate buffers
+ cl_mem bufferC = oclCreateMatrixBuffer<cl_double,
+ SubmatrixAdapter<Operand1> >(SC);
+ cl_mem bufferA = oclCreateAndLoadMatrixBuffer<cl_double,
+ SubmatrixAdapter<Operand2> >(SA);
+ cl_mem bufferB = oclCreateAndLoadMatrixBuffer<cl_double,
+ SubmatrixAdapter<Operand3> >(SB);
+
+ //((A.coldim() / 16) + (A.coldim() % 16 == 0 ? 0 : 1)) * 16
+ int widthA = (int) ((SA.coldim() + 15) / 16) * 16;
+ int heightA = (int) ((SA.rowdim() + 15) / 16) * 16;
+ int widthB = (int) ((SB.coldim() + 15) / 16) * 16;
+
+ //Call the kernel
+ oclCallKernel<double, cl_double>(
+ bufferC,
+ bufferA,
+ bufferB,
+ widthA,
+ heightA,
+ widthB,
+ p,
+ selectedMulKernel);
+
+ //Block until kernel finishes
+ cl_int tempErrcode;
+ tempErrcode = clFinish(commandQue);
+ linbox_check(tempErrcode == CL_SUCCESS);
+
+ //Delete OpenCL buffers
+ tempErrcode = clReleaseMemObject(bufferA);
+ linbox_check(tempErrcode == CL_SUCCESS);
+
+ tempErrcode = clReleaseMemObject(bufferB);
+ linbox_check(tempErrcode == CL_SUCCESS);
+
+ //Create temporary accumulation buffer
+ cl_mem tempBuffer = oclCreateMatrixBuffer<cl_double,
+ SubmatrixAdapter<Operand1> >(SC);
+
+ for(int sharedDim = 1; sharedDim < ABlocksX; sharedDim++){
+ //Load next blocks onto the device
+ SA = VA.at((size_t)(blockRow * ABlocksX + sharedDim));
+ SB = VB.at((size_t)(blockCol + BBlocksX * sharedDim));
+
+ bufferA = oclCreateAndLoadMatrixBuffer<cl_double,
+ SubmatrixAdapter<Operand2> >(SA);
+ bufferB = oclCreateAndLoadMatrixBuffer<cl_double,
+ SubmatrixAdapter<Operand3> >(SB);
+
+ //((A.coldim() / 16) + (A.coldim() % 16 == 0 ? 0 : 1)) * 16
+ int widthA_ = (int) ((SA.coldim() + 15) / 16) * 16;
+ int heightA_ = (int) ((SA.rowdim() + 15) / 16) * 16;
+ int widthB_ = (int) ((SB.coldim() + 15) / 16) * 16;
+
+ //Call the kernel
+ oclCallKernel<double,cl_double>(tempBuffer,
+ bufferA,
+ bufferB,
+ bufferC,
+ widthA_,
+ heightA_,
+ widthB_,
+ p,
+ selectedAxpyKernel);
+
+ //Block until kernel finishes
+ tempErrcode = clFinish(commandQue);
+ linbox_check(tempErrcode == CL_SUCCESS);
+
+ //Delete OpenCL buffers
+ tempErrcode = clReleaseMemObject(bufferA);
+ linbox_check(tempErrcode == CL_SUCCESS);
+
+ tempErrcode = clReleaseMemObject(bufferB);
+ linbox_check(tempErrcode == CL_SUCCESS);
+
+ //Shuffle buffer variables
+ cl_mem placeHolder = bufferC;
+ bufferC = tempBuffer;
+ tempBuffer = placeHolder;
+ }
+
+ //Read back buffer
+ SC = oclReadMatrixBuffer<cl_double,SubmatrixAdapter<Operand1> >(
+ bufferC,
+ SC);
+
+ //Delete OpenCL buffers
+ tempErrcode = clReleaseMemObject(bufferC);
+ linbox_check(tempErrcode == CL_SUCCESS);
+
+ tempErrcode = clReleaseMemObject(tempBuffer);
+ linbox_check(tempErrcode == CL_SUCCESS);
+
+ }
+ }
+
+ //Unlock the device
+ pthread_mutex_unlock(deviceLock);
+
+ return C;
+ }
+
+ /*
+ * Specialization of Mul for
+ * multiplying two general dense matrices
+ * over a Givaro::Modular<float> Field.
+ * C = A*B
+ */
+ template <>
+ template <class Operand1, class Operand2, class Operand3>
+ Operand1& OpenCLMatrixDomain<Givaro::Modular<float> >::mul(
+ Operand1& C,
+ const Operand2& A,
+ const Operand3& B) const{
+
+ //Check if kernels are available
+ bool kernelsAvailable = spKernelsAvailable[0];
+ kernelsAvailable &= spKernelsAvailable[1];
+ kernelsAvailable &= spKernelsAvailable[2];
+ kernelsAvailable &= spKernelsAvailable[3];
+ kernelsAvailable &= spKernelsAvailable[8];
+ kernelsAvailable &= spKernelsAvailable[9];
+ kernelsAvailable &= spKernelsAvailable[10];
+ kernelsAvailable &= spKernelsAvailable[11];
+
+ //If it is not capable or not setup properly use default implementation
+ if(!setupCorrect || !kernelsAvailable){
+ return BlasMatrixDomainMul<Givaro::Modular<float>,Operand1,Operand2,Operand3>()(
+ _F,
+ C,
+ A,
+ B);
+ }
+
+ //Check dimensions
+ linbox_check( A.coldim() == B.rowdim());
+ linbox_check( C.rowdim() == A.rowdim());
+ linbox_check( C.coldim() == B.coldim());
+
+ //Lock the device
+ pthread_mutex_lock(deviceLock);
+
+ //Partition the input matrices into chuncks that can fit onto the device
+ std::vector<SubmatrixAdapter<Operand1> > VC;
+ std::vector<SubmatrixAdapter<Operand2> > VA;
+ std::vector<SubmatrixAdapter<Operand3> > VB;
+ std::vector<int> partitionDims = oclPartition<Operand1,Operand2,Operand3>(
+ C,
+ A,
+ B,
+ VC,
+ VA,
+ VB);
+
+ //Break out the partitioned dimensions
+ int CBlocksX = partitionDims.at(0);
+ int CBlocksY = partitionDims.at(1);
+ int ABlocksX = partitionDims.at(2);
+ //int ABlocksY = partitionDims.at(3);
+ int BBlocksX = partitionDims.at(4);
+ //nt BBlocksY = partitionDims.at(5);
+
+ float p = (float) _F.characteristic();
+
+ //Select OpenCL kernel based on the size of the modulus factor for
+ //maximum performance
+ //p^2 * n < 2^53
+ cl_kernel selectedMulKernel;
+ cl_kernel selectedAxpyKernel;
+ if(p <= (1 << 21)){
+ selectedMulKernel = spKernels[3];
+ selectedAxpyKernel = spKernels[11];
+ }
+ else if(p <= (1 << 24)){
+ selectedMulKernel = spKernels[2];
+ selectedAxpyKernel = spKernels[10];
+ }
+ else if(p <= (1 << 25)){
+ selectedMulKernel = spKernels[1];
+ selectedAxpyKernel = spKernels[9];
+ }
+ else{
+ selectedMulKernel = spKernels[0];
+ selectedAxpyKernel = spKernels[8];
+ }
+
+ for(int blockCol = 0; blockCol < CBlocksX; blockCol++){
+ for(int blockRow = 0; blockRow < CBlocksY; blockRow++){
+
+ SubmatrixAdapter<Operand1> SC = VC.at((size_t)(blockRow * CBlocksX + blockCol));
+ SubmatrixAdapter<Operand2> SA = VA.at((size_t)(blockRow * ABlocksX));
+ SubmatrixAdapter<Operand3> SB = VB.at((size_t)blockCol);
+
+ //Allocate buffers
+ cl_mem bufferC = oclCreateMatrixBuffer<cl_float,
+ SubmatrixAdapter<Operand1> >(SC);
+ cl_mem bufferA = oclCreateAndLoadMatrixBuffer<cl_float,
+ SubmatrixAdapter<Operand2> >(SA);
+ cl_mem bufferB = oclCreateAndLoadMatrixBuffer<cl_float,
+ SubmatrixAdapter<Operand3> >(SB);
+
+ //((A.coldim() / 16) + (A.coldim() % 16 == 0 ? 0 : 1)) * 16
+ int widthA = (int) ((SA.coldim() + 15) / 16) * 16;
+ int heightA = (int) ((SA.rowdim() + 15) / 16) * 16;
+ int widthB = (int) ((SB.coldim() + 15) / 16) * 16;
+
+ //Call the kernel
+ oclCallKernel<float,cl_float>(bufferC,
+ bufferA,
+ bufferB,
+ widthA,
+ heightA,
+ widthB,
+ p,
+ selectedMulKernel);
+
+ //Block until kernel finishes
+ cl_int tempErrcode;
+ tempErrcode = clFinish(commandQue);
+ linbox_check(tempErrcode == CL_SUCCESS);
+
+ //Delete OpenCL buffers
+ tempErrcode = clReleaseMemObject(bufferA);
+ linbox_check(tempErrcode == CL_SUCCESS);
+
+ tempErrcode = clReleaseMemObject(bufferB);
+ linbox_check(tempErrcode == CL_SUCCESS);
+
+ //Create temporary accumulation buffer
+ cl_mem tempBuffer = oclCreateMatrixBuffer<cl_float,
+ SubmatrixAdapter<Operand1> >(SC);
+
+ for(int sharedDim = 1; sharedDim < ABlocksX; sharedDim++){
+ //Load next blocks onto the device
+ SA = VA.at((size_t)(blockRow * ABlocksX + sharedDim));
+ SB = VB.at((size_t)(blockCol + BBlocksX * sharedDim));
+ bufferA = oclCreateAndLoadMatrixBuffer<cl_float,
+ SubmatrixAdapter<Operand2> >(SA);
+ bufferB = oclCreateAndLoadMatrixBuffer<cl_float,
+ SubmatrixAdapter<Operand3> >(SB);
+
+ //((A.coldim() / 16) + (A.coldim() % 16 == 0 ? 0 : 1)) * 16
+ int widthA_ = (int) ((SA.coldim() + 15) / 16) * 16;
+ int heightA_ = (int) ((SA.rowdim() + 15) / 16) * 16;
+ int widthB_ = (int) ((SB.coldim() + 15) / 16) * 16;
+
+ //Call the kernel
+ oclCallKernel<float, cl_float>(
+ tempBuffer,
+ bufferA,
+ bufferB,
+ bufferC,
+ widthA_,
+ heightA_,
+ widthB_,
+ p,
+ selectedAxpyKernel);
+
+ //Block until kernel finishes
+ tempErrcode = clFinish(commandQue);
+ linbox_check(tempErrcode == CL_SUCCESS);
+
+ //Delete OpenCL buffers
+ tempErrcode = clReleaseMemObject(bufferA);
+ linbox_check(tempErrcode == CL_SUCCESS);
+
+ tempErrcode = clReleaseMemObject(bufferB);
+ linbox_check(tempErrcode == CL_SUCCESS);
+
+ //Shuffle buffer variables
+ cl_mem placeHolder = bufferC;
+ bufferC = tempBuffer;
+ tempBuffer = placeHolder;
+ }
+
+ //Read back buffer
+ SC = oclReadMatrixBuffer<cl_float,SubmatrixAdapter<Operand1> >(
+ bufferC,
+ SC);
+
+ //Delete OpenCL buffers
+ tempErrcode = clReleaseMemObject(bufferC);
+ linbox_check(tempErrcode == CL_SUCCESS);
+
+ tempErrcode = clReleaseMemObject(tempBuffer);
+ linbox_check(tempErrcode == CL_SUCCESS);
+
+ }
+ }
+
+ //Unlock the device
+ pthread_mutex_unlock(deviceLock);
+
+ return C;
+ }
+
+ /*
+ * Specialization of mulin_left for
+ * multiplying two general dense matrices
+ * over a Givaro::Modular<double> Field.
+ * Places result into the left matrix.
+ * A = A*B
+ */
+ template <>
+ template <class Operand1, class Operand2>
+ Operand1& OpenCLMatrixDomain<Givaro::Modular<double> >::mulin_left(
+ Operand1& A,
+ const Operand2& B) const{
+
+ //Check if kernels are available
+ bool kernelsAvailable = dpKernelsAvailable[0];
+ kernelsAvailable &= dpKernelsAvailable[1];
+ kernelsAvailable &= dpKernelsAvailable[2];
+ kernelsAvailable &= dpKernelsAvailable[3];
+ kernelsAvailable &= dpKernelsAvailable[8];
+ kernelsAvailable &= dpKernelsAvailable[9];
+ kernelsAvailable &= dpKernelsAvailable[10];
+ kernelsAvailable &= dpKernelsAvailable[11];
+
+ //If it is not capable or not setup properly use default implementation
+ if(!setupCorrect || !doubleSupported || !kernelsAvailable){
+ return BlasMatrixDomainMulin<Givaro::Modular<double>,Operand1,Operand2>()(_F,A,B);
+ }
+
+ Operand1 T(A);
+ return mul<Operand1,Operand1,Operand2>(A,T,B);
+ }
+
+ /*
+ * Specialization of mulin_left for
+ * multiplying two general dense matrices
+ * over a Givaro::Modular<float> Field.
+ * Places the result into the left matrix.
+ * A = A*B
+ */
+ template <>
+ template <class Operand1, class Operand2>
+ Operand1& OpenCLMatrixDomain<Givaro::Modular<float> >::mulin_left(
+ Operand1& A,
+ const Operand2& B) const{
+
+ //Check if kernels are available
+ bool kernelsAvailable = spKernelsAvailable[0];
+ kernelsAvailable &= spKernelsAvailable[1];
+ kernelsAvailable &= spKernelsAvailable[2];
+ kernelsAvailable &= spKernelsAvailable[3];
+ kernelsAvailable &= spKernelsAvailable[8];
+ kernelsAvailable &= spKernelsAvailable[9];
+ kernelsAvailable &= spKernelsAvailable[10];
+ kernelsAvailable &= spKernelsAvailable[11];
+
+
+ //If it is not capable or not setup properly use default implementation
+ if(!setupCorrect || !kernelsAvailable){
+ return BlasMatrixDomainMulin<Givaro::Modular<float>,Operand1,Operand2>()(_F,A,B);
+ }
+
+ Operand1 T(A);
+ return mul<Operand1,Operand1,Operand2>(A,T,B);
+ }
+
+ /*
+ * Specialization of mulin_right for
+ * multiplying two general dense matrices
+ * over a Givaro::Modular<double> Field.
+ * Places the result into the right matrix.
+ * B = A*B
+ */
+ template <>
+ template <class Operand1, class Operand2>
+ Operand2& OpenCLMatrixDomain<Givaro::Modular<double> >::mulin_right(
+ const Operand1& A,
+ Operand2& B) const{
+
+ //Check if kernels are available
+ bool kernelsAvailable = dpKernelsAvailable[0];
+ kernelsAvailable &= dpKernelsAvailable[1];
+ kernelsAvailable &= dpKernelsAvailable[2];
+ kernelsAvailable &= dpKernelsAvailable[3];
+ kernelsAvailable &= dpKernelsAvailable[8];
+ kernelsAvailable &= dpKernelsAvailable[9];
+ kernelsAvailable &= dpKernelsAvailable[10];
+ kernelsAvailable &= dpKernelsAvailable[11];
+
+ //If it is not capable or not setup properly use default implementation
+ if(!setupCorrect || !doubleSupported || !kernelsAvailable){
+ return BlasMatrixDomainMulin<Givaro::Modular<double>,Operand2,Operand1>()(_F,A,B);
+ }
+
+ Operand2 T(B);
+ return mul<Operand2,Operand1,Operand2>(B,A,T);
+ }
+
+ /*
+ * Specialization of mulin_right for
+ * multiplying two general dense matrices
+ * over a Givaro::Modular<float> Field.
+ * Places the result into the right matrix.
+ * B = A*B
+ */
+ template <>
+ template <class Operand1, class Operand2>
+ Operand2& OpenCLMatrixDomain<Givaro::Modular<float> >::mulin_right(
+ const Operand1& A,
+ Operand2& B) const{
+
+ //Check if kernels are available
+ bool kernelsAvailable = spKernelsAvailable[0];
+ kernelsAvailable &= spKernelsAvailable[1];
+ kernelsAvailable &= spKernelsAvailable[2];
+ kernelsAvailable &= spKernelsAvailable[3];
+ kernelsAvailable &= spKernelsAvailable[8];
+ kernelsAvailable &= spKernelsAvailable[9];
+ kernelsAvailable &= spKernelsAvailable[10];
+ kernelsAvailable &= spKernelsAvailable[11];
+
+
+ //If it is not capable or not setup properly use default implementation
+ if(!setupCorrect || !kernelsAvailable){
+ return BlasMatrixDomainMulin<Givaro::Modular<float>,Operand2,Operand1>()(_F,A,B);
+ }
+
+ Operand2 T(B);
+ return mul<Operand2,Operand1,Operand2>(B,A,T);
+ }
+
+ /*
+ * Specialization of general matrix-matrix multiplication and
+ * addition with scaling over a Givaro::Modular<double> Field
+ * D = beta.C + alpha.A*B
+ */
+ template <>
+ template <class Operand1, class Operand2, class Operand3>
+ Operand1& OpenCLMatrixDomain<Givaro::Modular<double> >::muladd(
+ Operand1& D,
+ const double& beta,
+ const Operand1& C,
+ const double& alpha,
+ const Operand2& A,
+ const Operand3& B) const{
+
+ //Check if kernels are available
+ bool kernelsAvailable = dpKernelsAvailable[4];
+ kernelsAvailable &= dpKernelsAvailable[5];
+ kernelsAvailable &= dpKernelsAvailable[6];
+ kernelsAvailable &= dpKernelsAvailable[7];
+
+ //If it is not capable or not setup properly use default implementation
+ if(!setupCorrect || !doubleSupported || !kernelsAvailable){
+ return BlasMatrixDomainMulAdd<//Givaro::Modular<double>,
+ Operand1,
+ Operand2,
+ Operand3>()(D,beta,C,alpha,A,B);
+ }
+
+ //Check dimensions
+ linbox_check( A.coldim() == B.rowdim());
+ linbox_check( C.rowdim() == A.rowdim());
+ linbox_check( C.coldim() == B.coldim());
+ linbox_check( D.rowdim() == C.rowdim());
+ linbox_check( D.coldim() == C.coldim());
+
+ //Lock the device
+ pthread_mutex_lock(deviceLock);
+
+ //Partition the input matrices into chuncks that can fit onto the device
+ std::vector<SubmatrixAdapter<Operand1> > VD;
+ std::vector<SubmatrixAdapter<Operand2> > VA;
+ std::vector<SubmatrixAdapter<Operand3> > VB;
+ std::vector<SubmatrixAdapter<Operand1> > VC;
+ std::vector<int> partitionDims = oclPartition<Operand1,Operand2,Operand3>(
+ D,
+ A,
+ B,
+ C,
+ VD,
+ VA,
+ VB,
+ VC);
+
+ //Break out the partitioned dimensions
+ int DBlocksX = partitionDims.at(0);
+ int DBlocksY = partitionDims.at(1);
+ int ABlocksX = partitionDims.at(2);
+ //int ABlocksY = partitionDims.at(3);
+ int BBlocksX = partitionDims.at(4);
+ //nt BBlocksY = partitionDims.at(5);
+
+ double p = (double) _F.characteristic();
+ double tempAlpha = fmod(alpha, p);
+ double tempBeta = fmod(beta, p);
+
+ // Select OpenCL kernel based on the size of the modulus factor for
+ //maximum performance
+ //p^2 * n < 2^53
+ cl_kernel selectedKernel;
+ if(p <= (1 << 21)){
+ selectedKernel = dpKernels[7];
+ }
+ else if(p <=(1 << 24)){
+ selectedKernel = dpKernels[6];
+ }
+ else if(p <=(1 << 25)){
+ selectedKernel = dpKernels[5];
+ }
+ else{
+ selectedKernel = dpKernels[4];
+ }
+
+ for(int blockCol = 0; blockCol < DBlocksX; blockCol++){
+ for(int blockRow = 0; blockRow < DBlocksY; blockRow++){
+
+ SubmatrixAdapter<Operand1> SD = VD.at((size_t)(blockRow * DBlocksX + blockCol));
+ SubmatrixAdapter<Operand2> SA = VA.at((size_t)(blockRow * ABlocksX));
+ SubmatrixAdapter<Operand3> SB = VB.at((size_t)(blockCol));
+ SubmatrixAdapter<Operand1> SC = VC.at((size_t)(blockRow * DBlocksX + blockCol));
+
+ //Allocate buffers
+ cl_mem bufferD = oclCreateMatrixBuffer<cl_double,
+ SubmatrixAdapter<Operand1> >(SD);
+ cl_mem bufferA = oclCreateAndLoadMatrixBuffer<cl_double,
+ SubmatrixAdapter<Operand2> >(SA);
+ cl_mem bufferB = oclCreateAndLoadMatrixBuffer<cl_double,
+ SubmatrixAdapter<Operand3> >(SB);
+ cl_mem bufferC = oclCreateAndLoadMatrixBuffer<cl_double,
+ SubmatrixAdapter<Operand1> >(SC);
+
+ //((A.coldim() / 16) + (A.coldim() % 16 == 0 ? 0 : 1)) * 16
+ int widthA = (int) ((SA.coldim() + 15) / 16) * 16;
+ int heightA = (int) ((SA.rowdim() + 15) / 16) * 16;
+ int widthB = (int) ((SB.coldim() + 15) / 16) * 16;
+
+ //Call the kernel
+ oclCallKernel<double,cl_double>(
+ bufferD,
+ bufferA,
+ bufferB,
+ bufferC,
+ tempAlpha,
+ tempBeta,
+ widthA,
+ heightA,
+ widthB,
+ p,
+ selectedKernel);
+
+ //Block until kernel finishes
+ cl_int tempErrcode;
+ tempErrcode = clFinish(commandQue);
+ linbox_check(tempErrcode == CL_SUCCESS);
+
+ //Delete OpenCL buffers
+ tempErrcode = clReleaseMemObject(bufferA);
+ linbox_check(tempErrcode == CL_SUCCESS);
+
+ tempErrcode = clReleaseMemObject(bufferB);
+ linbox_check(tempErrcode == CL_SUCCESS);
+
+ //Create temporary accumulation buffer
+ cl_mem tempBuffer = bufferC;
+ bufferC = bufferD;
+
+ for(int sharedDim = 1; sharedDim < ABlocksX; sharedDim++){
+ //Load next blocks onto the device
+ SA = VA.at((size_t)(blockRow * ABlocksX + sharedDim));
+ SB = VB.at((size_t)(blockCol + BBlocksX * sharedDim));
+ bufferA = oclCreateAndLoadMatrixBuffer<cl_double,
+ SubmatrixAdapter<Operand2> >(SA);
+ bufferB = oclCreateAndLoadMatrixBuffer<cl_double,
+ SubmatrixAdapter<Operand3> >(SB);
+
+ //((A.coldim() / 16) + (A.coldim() % 16 == 0 ? 0 : 1)) * 16
+ int widthA_ = (int) ((SA.coldim() + 15) / 16) * 16;
+ int heightA_ = (int) ((SA.rowdim() + 15) / 16) * 16;
+ int widthB_ = (int) ((SB.coldim() + 15) / 16) * 16;
+
+ //Call the kernel
+ oclCallKernel<double,cl_double>(
+ tempBuffer,
+ bufferA,
+ bufferB,
+ bufferC,
+ tempAlpha,
+ _F.one,
+ widthA_,
+ heightA_,
+ widthB_,
+ p,
+ selectedKernel);
+
+ //Block until kernel finishes
+ tempErrcode = clFinish(commandQue);
+ linbox_check(tempErrcode == CL_SUCCESS);
+
+ //Delete OpenCL buffers
+ tempErrcode = clReleaseMemObject(bufferA);
+ linbox_check(tempErrcode == CL_SUCCESS);
+
+ tempErrcode = clReleaseMemObject(bufferB);
+ linbox_check(tempErrcode == CL_SUCCESS);
+
+ //Shuffle buffer variables
+ cl_mem placeHolder = bufferC;
+ bufferC = tempBuffer;
+ tempBuffer = placeHolder;
+ }
+
+ //Read back buffer
+ SD = oclReadMatrixBuffer<cl_double,SubmatrixAdapter<Operand1> >(
+ bufferC,
+ SD);
+
+ //Delete OpenCL buffers
+ tempErrcode = clReleaseMemObject(bufferC);
+ linbox_check(tempErrcode == CL_SUCCESS);
+
+ tempErrcode = clReleaseMemObject(tempBuffer);
+ linbox_check(tempErrcode == CL_SUCCESS);
+
+ }
+ }
+
+ //Unlock the device
+ pthread_mutex_unlock(deviceLock);
+
+ return D;
+ }
+
+ /*
+ * Specialization of general matrix-matrix multiplication and
+ * addition with scaling over a Givaro::Modular<float> Field
+ * D = beta.C + alpha.A*B
+ */
+ template <>
+ template <class Operand1, class Operand2, class Operand3>
+ Operand1& OpenCLMatrixDomain<Givaro::Modular<float> >::muladd(
+ Operand1& D,
+ const float& beta,
+ const Operand1& C,
+ const float& alpha,
+ const Operand2& A,
+ const Operand3& B) const{
+
+ //Check if kernels are available
+ bool kernelsAvailable = spKernelsAvailable[4];
+ kernelsAvailable &= spKernelsAvailable[5];
+ kernelsAvailable &= spKernelsAvailable[6];
+ kernelsAvailable &= spKernelsAvailable[7];
+
+ //If it is not capable or not setup properly use default implementation
+ if(!setupCorrect || !kernelsAvailable){
+ return BlasMatrixDomainMulAdd<//Givaro::Modular<float>,
+ Operand1,
+ Operand2,
+ Operand3>()(D,beta,C,alpha,A,B);
+ }
+
+ //Check dimensions
+ linbox_check( A.coldim() == B.rowdim());
+ linbox_check( C.rowdim() == A.rowdim());
+ linbox_check( C.coldim() == B.coldim());
+ linbox_check( D.rowdim() == C.rowdim());
+ linbox_check( D.coldim() == C.coldim());
+
+ //Lock the device
+ pthread_mutex_lock(deviceLock);
+
+ //Partition the input matrices into chuncks that can fit onto the device
+ std::vector<SubmatrixAdapter<Operand1> > VD;
+ std::vector<SubmatrixAdapter<Operand2> > VA;
+ std::vector<SubmatrixAdapter<Operand3> > VB;
+ std::vector<SubmatrixAdapter<Operand1> > VC;
+ std::vector<int> partitionDims = oclPartition<Operand1,Operand2,Operand3>(
+ D,
+ A,
+ B,
+ C,
+ VD,
+ VA,
+ VB,
+ VC);
+
+ //Break out the partitioned dimensions
+ int DBlocksX = partitionDims.at(0);
+ int DBlocksY = partitionDims.at(1);
+ int ABlocksX = partitionDims.at(2);
+ //int ABlocksY = partitionDims.at(3);
+ int BBlocksX = partitionDims.at(4);
+ //nt BBlocksY = partitionDims.at(5);
+
+ float p = (float) _F.characteristic();
+ float tempAlpha = fmodf(alpha, p);
+ float tempBeta = fmodf(beta, p);
+
+ // Select OpenCL kernel based on the size of the modulus factor for
+ //maximum performance
+ //p^2 * n < 2^23
+ cl_kernel selectedKernel;
+ if(p <= (1 << 7)){
+ selectedKernel = spKernels[7];
+ }
+ else if(p <=(1 << 9)){
+ selectedKernel = spKernels[6];
+ }
+ else if(p <=(1 << 10)){
+ selectedKernel = spKernels[5];
+ }
+ else{
+ selectedKernel = spKernels[4];
+ }
+
+ for(int blockCol = 0; blockCol < DBlocksX; blockCol++){
+ for(int blockRow = 0; blockRow < DBlocksY; blockRow++){
+
+ SubmatrixAdapter<Operand1> SD = VD.at((size_t)(blockRow * DBlocksX + blockCol));
+ SubmatrixAdapter<Operand2> SA = VA.at((size_t)(blockRow * ABlocksX));
+ SubmatrixAdapter<Operand3> SB = VB.at((size_t)(blockCol));
+ SubmatrixAdapter<Operand1> SC = VC.at((size_t)(blockRow * DBlocksX + blockCol));
+
+ //Allocate buffers
+ cl_mem bufferD = oclCreateMatrixBuffer<cl_float,
+ SubmatrixAdapter<Operand1> >(SD);
+ cl_mem bufferA = oclCreateAndLoadMatrixBuffer<cl_float,
+ SubmatrixAdapter<Operand2> >(SA);
+ cl_mem bufferB = oclCreateAndLoadMatrixBuffer<cl_float,
+ SubmatrixAdapter<Operand3> >(SB);
+ cl_mem bufferC = oclCreateAndLoadMatrixBuffer<cl_float,
+ SubmatrixAdapter<Operand1> >(SC);
+
+ //((A.coldim() / 16) + (A.coldim() % 16 == 0 ? 0 : 1)) * 16
+ int widthA = (int) ((SA.coldim() + 15) / 16) * 16;
+ int heightA = (int) ((SA.rowdim() + 15) / 16) * 16;
+ int widthB = (int) ((SB.coldim() + 15) / 16) * 16;
+
+ //Call the kernel
+ oclCallKernel<float,cl_float>(
+ bufferD,
+ bufferA,
+ bufferB,
+ bufferC,
+ tempAlpha,
+ tempBeta,
+ widthA,
+ heightA,
+ widthB,
+ p,
+ selectedKernel);
+
+ //Block until kernel finishes
+ cl_int tempErrcode;
+ tempErrcode = clFinish(commandQue);
+ linbox_check(tempErrcode == CL_SUCCESS);
+
+ //Delete OpenCL buffers
+ tempErrcode = clReleaseMemObject(bufferA);
+ linbox_check(tempErrcode == CL_SUCCESS);
+
+ tempErrcode = clReleaseMemObject(bufferB);
+ linbox_check(tempErrcode == CL_SUCCESS);
+
+ //Create temporary accumulation buffer
+ cl_mem tempBuffer = bufferC;
+ bufferC = bufferD;
+
+ for(int sharedDim = 1; sharedDim < ABlocksX; sharedDim++){
+ //Load next blocks onto the device
+ SA = VA.at((size_t)(blockRow * ABlocksX + sharedDim));
+ SB = VB.at((size_t)(blockCol + BBlocksX *sharedDim));
+ bufferA = oclCreateAndLoadMatrixBuffer<cl_float,
+ SubmatrixAdapter<Operand2> >(SA);
+ bufferB = oclCreateAndLoadMatrixBuffer<cl_float,
+ SubmatrixAdapter<Operand3> >(SB);
+
+ //((A.coldim() / 16) + (A.coldim() % 16 == 0 ? 0 : 1)) * 16
+ int widthA_ = (int) ((SA.coldim() + 15) / 16) * 16;
+ int heightA_ = (int) ((SA.rowdim() + 15) / 16) * 16;
+ int widthB_ = (int) ((SB.coldim() + 15) / 16) * 16;
+
+ //Call the kernel
+ oclCallKernel<float,cl_float>(
+ tempBuffer,
+ bufferA,
+ bufferB,
+ bufferC,
+ tempAlpha,
+ _F.one,
+ widthA_,
+ heightA_,
+ widthB_,
+ p,
+ selectedKernel);
+
+ //Block until kernel finishes
+ tempErrcode = clFinish(commandQue);
+ linbox_check(tempErrcode == CL_SUCCESS);
+
+ //Delete OpenCL buffers
+ tempErrcode = clReleaseMemObject(bufferA);
+ linbox_check(tempErrcode == CL_SUCCESS);
+
+ tempErrcode = clReleaseMemObject(bufferB);
+ linbox_check(tempErrcode == CL_SUCCESS);
+
+ //Shuffle buffer variables
+ cl_mem placeHolder = bufferC;
+ bufferC = tempBuffer;
+ tempBuffer = placeHolder;
+ }
+
+ //Read back buffer
+ SD = oclReadMatrixBuffer<cl_float,SubmatrixAdapter<Operand1> >(
+ bufferC,
+ SD);
+
+ //Delete OpenCL buffers
+ tempErrcode = clReleaseMemObject(bufferC);
+ linbox_check(tempErrcode == CL_SUCCESS);
+
+ tempErrcode = clReleaseMemObject(tempBuffer);
+ linbox_check(tempErrcode == CL_SUCCESS);
+
+ }
+ }
+
+ //Unlock the device
+ pthread_mutex_unlock(deviceLock);
+
+ return D;
+ }
+
+ /*
+ * Specialization of general matrix-matrix multiplication and
+ * addition with scaling over a Givaro::Modular<double> Field
+ * Places the results into the first genreral dense matrix
+ * C = beta.C + alpha.A*B
+ */
+ template <>
+ template <class Operand1, class Operand2, class Operand3>
+ Operand1& OpenCLMatrixDomain<Givaro::Modular<double> >::muladdin(
+ const double& beta,
+ Operand1& C,
+ const double& alpha,
+ const Operand2& A,
+ const Operand3& B) const{
+
+ //Check if kernels are available
+ bool kernelsAvailable = dpKernelsAvailable[4];
+ kernelsAvailable &= dpKernelsAvailable[5];
+ kernelsAvailable &= dpKernelsAvailable[6];
+ kernelsAvailable &= dpKernelsAvailable[7];
+
+ //If it is not capable or not setup properly use default implementation
+ if(!setupCorrect || !doubleSupported || !kernelsAvailable){
+ return BlasMatrixDomainMulAdd<//Givaro::Modular<double>,
+ Operand1,
+ Operand2,
+ Operand3>()(beta,C,alpha,A,B);
+ }
+
+ Operand1 T(C);
+ return muladd<Operand1,Operand2,Operand3>(C,beta,T,alpha,A,B);
+ }
+
+ /*
+ * Specialization of general matrix-matrix multiplication and
+ * addition with scaling over a Givaro::Modular<float> Field
+ * Places the results into the first genreral dense matrix
+ * C = beta.C + alpha.A*B
+ */
+ template <>
+ template <class Operand1, class Operand2, class Operand3>
+ Operand1& OpenCLMatrixDomain<Givaro::Modular<float> >::muladdin(
+ const float& beta,
+ Operand1& C,
+ const float& alpha,
+ const Operand2& A,
+ const Operand3& B) const{
+
+ //Check if kernels are available
+ bool kernelsAvailable = spKernelsAvailable[4];
+ kernelsAvailable &= spKernelsAvailable[5];
+ kernelsAvailable &= spKernelsAvailable[6];
+ kernelsAvailable &= spKernelsAvailable[7];
+
+ //If it is not capable or not setup properly use default implementation
+ if(!setupCorrect || !kernelsAvailable){
+ return BlasMatrixDomainMulAdd<//Givaro::Modular<float>,
+ Operand1,
+ Operand2,
+ Operand3>()(beta,C,alpha,A,B);
+ }
+
+ Operand1 T(C);
+ return muladd<Operand1,Operand2,Operand3>(C,beta,T,alpha,A,B);
+ }
+
+ /*
+ * Specialization of multiplication with scaling over
+ * a Givaro::Modular<double> Field
+ * C = alpha.A*B
+ */
+ template <>
+ template <class Operand1, class Operand2, class Operand3>
+ Operand1& OpenCLMatrixDomain<Givaro::Modular<double> >::mul(
+ Operand1& C,
+ const double& alpha,
+ const Operand2& A,
+ const Operand3& B) const{
+
+ return muladdin<Operand1,Operand2,Operand3>(0,C,alpha,A,B);
+ }
+
+ /*
+ * Specialization of multiplication with scaling over
+ * a Givaro::Modular<float> Field
+ * C = alpha.A*B
+ */
+ template <>
+ template <class Operand1, class Operand2, class Operand3>
+ Operand1& OpenCLMatrixDomain<Givaro::Modular<float> >::mul(
+ Operand1& C,
+ const float& alpha,
+ const Operand2& A,
+ const Operand3& B) const{
+
+ return muladdin<Operand1,Operand2,Operand3>(0,C,alpha,A,B);
+ }
+
+ /*
+ * Specialization of apxy for
+ * multiplying two general dense matrices
+ * and adding a third general dense matrix
+ * over a Givaro::Modular<double> Field.
+ * D = A*B + C
+ */
+ template <>
+ template <class Operand1, class Operand2, class Operand3>
+ Operand1& OpenCLMatrixDomain<Givaro::Modular<double> >::axpy(
+ Operand1& D,
+ const Operand2& A,
+ const Operand3& B,
+ const Operand1& C) const{
+
+ //Check if kernels are available
+ bool kernelsAvailable = dpKernelsAvailable[8];
+ kernelsAvailable &= dpKernelsAvailable[9];
+ kernelsAvailable &= dpKernelsAvailable[10];
+ kernelsAvailable &= dpKernelsAvailable[11];
+
+ //If it is not capable or not setup properly use default implementation
+ if(!setupCorrect || !doubleSupported || !kernelsAvailable){
+ return BlasMatrixDomainMulAdd<//Givaro::Modular<double>,
+ Operand1,
+ Operand2,
+ Operand3>()(D,_F.one,C,_F.one,A,B);
+ }
+
+ //Check dimensions
+ linbox_check( A.coldim() == B.rowdim());
+ linbox_check( C.rowdim() == A.rowdim());
+ linbox_check( C.coldim() == B.coldim());
+ linbox_check( D.rowdim() == C.rowdim());
+ linbox_check( D.coldim() == C.coldim());
+
+ //Lock the device
+ pthread_mutex_lock(deviceLock);
+
+ //Partition the input matrices into chuncks that can fit onto the device
+ std::vector<SubmatrixAdapter<Operand1> > VD;
+ std::vector<SubmatrixAdapter<Operand2> > VA;
+ std::vector<SubmatrixAdapter<Operand3> > VB;
+ std::vector<SubmatrixAdapter<Operand1> > VC;
+ std::vector<int> partitionDims = oclPartition<Operand1,Operand2,Operand3>(
+ D,
+ A,
+ B,
+ C,
+ VD,
+ VA,
+ VB,
+ VC);
+
+ //Break out the partitioned dimensions
+ int DBlocksX = partitionDims.at(0);
+ int DBlocksY = partitionDims.at(1);
+ int ABlocksX = partitionDims.at(2);
+ //int ABlocksY = partitionDims.at(3);
+ int BBlocksX = partitionDims.at(4);
+ //nt BBlocksY = partitionDims.at(5);
+
+ double p = (double)_F.characteristic();
+
+ // Select OpenCL kernel based on the size of the modulus factor for
+ //maximum performance
+ //p^2 * n < 2^53
+ cl_kernel selectedKernel;
+ if(p <= (1 << 21)){
+ selectedKernel = dpKernels[11];
+ }
+ else if(p <= (1 << 24)){
+ selectedKernel = dpKernels[10];
+ }
+ else if(p <= (1 << 25)){
+ selectedKernel = dpKernels[9];
+ }
+ else{
+ selectedKernel = dpKernels[8];
+ }
+
+ for(int blockCol = 0; blockCol < DBlocksX; blockCol++){
+ for(int blockRow = 0; blockRow < DBlocksY; blockRow++){
+
+ SubmatrixAdapter<Operand1> SD = VD.at((size_t)(blockRow * DBlocksX + blockCol));
+ SubmatrixAdapter<Operand2> SA = VA.at((size_t)(blockRow * ABlocksX));
+ SubmatrixAdapter<Operand3> SB = VB.at((size_t)(blockCol));
+ SubmatrixAdapter<Operand1> SC = VC.at((size_t)(blockRow * DBlocksX + blockCol));
+
+ //Allocate buffers
+ cl_mem bufferD = oclCreateMatrixBuffer<cl_double,
+ SubmatrixAdapter<Operand1> >(SD);
+ cl_mem bufferA = oclCreateAndLoadMatrixBuffer<cl_double,
+ SubmatrixAdapter<Operand2> >(SA);
+ cl_mem bufferB = oclCreateAndLoadMatrixBuffer<cl_double,
+ SubmatrixAdapter<Operand3> >(SB);
+ cl_mem bufferC = oclCreateAndLoadMatrixBuffer<cl_double,
+ SubmatrixAdapter<Operand1> >(SC);
+
+ //((A.coldim() / 16) + (A.coldim() % 16 == 0 ? 0 : 1)) * 16
+ int widthA = (int) ((SA.coldim() + 15) / 16) * 16;
+ int heightA = (int) ((SA.rowdim() + 15) / 16) * 16;
+ int widthB = (int) ((SB.coldim() + 15) / 16) * 16;
+
+ //Call the kernel
+ oclCallKernel<double,cl_double>(
+ bufferD,
+ bufferA,
+ bufferB,
+ bufferC,
+ widthA,
+ heightA,
+ widthB,
+ p,
+ selectedKernel);
+
+ //Block until kernel finishes
+ cl_int tempErrcode;
+ tempErrcode = clFinish(commandQue);
+ linbox_check(tempErrcode == CL_SUCCESS);
+
+ //Delete OpenCL buffers
+ tempErrcode = clReleaseMemObject(bufferA);
+ linbox_check(tempErrcode == CL_SUCCESS);
+
+ tempErrcode = clReleaseMemObject(bufferB);
+ linbox_check(tempErrcode == CL_SUCCESS);
+
+ //Create temporary accumulation buffer
+ cl_mem tempBuffer = bufferC;
+ bufferC = bufferD;
+
+ for(int sharedDim = 1; sharedDim < ABlocksX; sharedDim++){
+ //Load next blocks onto the device
+ SA = VA.at((size_t)(blockRow * ABlocksX + sharedDim));
+ SB = VB.at((size_t)(blockCol + BBlocksX * sharedDim));
+ bufferA = oclCreateAndLoadMatrixBuffer<cl_double,
+ SubmatrixAdapter<Operand2> >(SA);
+ bufferB = oclCreateAndLoadMatrixBuffer<cl_double,
+ SubmatrixAdapter<Operand3> >(SB);
+
+ //((A.coldim() / 16) + (A.coldim() % 16 == 0 ? 0 : 1)) * 16
+ int widthA_ = (int) ((SA.coldim() + 15) / 16) * 16;
+ int heightA_ = (int) ((SA.rowdim() + 15) / 16) * 16;
+ int widthB_ = (int) ((SB.coldim() + 15) / 16) * 16;
+
+ //Call the kernel
+ oclCallKernel<double,cl_double>(
+ tempBuffer,
+ bufferA,
+ bufferB,
+ bufferC,
+ widthA_,
+ heightA_,
+ widthB_,
+ p,
+ selectedKernel);
+
+ //Block until kernel finishes
+ tempErrcode = clFinish(commandQue);
+ linbox_check(tempErrcode == CL_SUCCESS);
+
+ //Delete OpenCL buffers
+ tempErrcode = clReleaseMemObject(bufferA);
+ linbox_check(tempErrcode == CL_SUCCESS);
+
+ tempErrcode = clReleaseMemObject(bufferB);
+ linbox_check(tempErrcode == CL_SUCCESS);
+
+ //Shuffle buffer variables
+ cl_mem placeHolder = bufferC;
+ bufferC = tempBuffer;
+ tempBuffer = placeHolder;
+ }
+
+ //Read back buffer
+ SD = oclReadMatrixBuffer<cl_double,SubmatrixAdapter<Operand1> >(
+ bufferC,
+ SD);
+
+ //Delete OpenCL buffers
+ tempErrcode = clReleaseMemObject(bufferC);
+ linbox_check(tempErrcode == CL_SUCCESS);
+
+ tempErrcode = clReleaseMemObject(tempBuffer);
+ linbox_check(tempErrcode == CL_SUCCESS);
+ }
+ }
+
+ //Unlock the device
+ pthread_mutex_unlock(deviceLock);
+
+ return D;
+ }
+
+ /*
+ * Specialization of apxy for
+ * multiplying two general dense matrices
+ * and adding a third general dense matrix
+ * over a Givaro::Modular<float> Field.
+ * D = A*B + C
+ */
+ template <>
+ template <class Operand1, class Operand2, class Operand3>
+ Operand1& OpenCLMatrixDomain<Givaro::Modular<float> >::axpy(
+ Operand1& D,
+ const Operand2& A,
+ const Operand3& B,
+ const Operand1& C) const{
+
+ //Check if kernels are available
+ bool kernelsAvailable = spKernelsAvailable[8];
+ kernelsAvailable &= spKernelsAvailable[9];
+ kernelsAvailable &= spKernelsAvailable[10];
+ kernelsAvailable &= spKernelsAvailable[11];
+
+ //If it is not capable or not setup properly use default implementation
+ if(!setupCorrect || !kernelsAvailable){
+ return BlasMatrixDomainMulAdd<//Givaro::Modular<float>,
+ Operand1,
+ Operand2,
+ Operand3>()(D,_F.one,C,_F.one,A,B);
+ }
+
+ //Check dimensions
+ linbox_check( A.coldim() == B.rowdim());
+ linbox_check( C.rowdim() == A.rowdim());
+ linbox_check( C.coldim() == B.coldim());
+ linbox_check( D.rowdim() == C.rowdim());
+ linbox_check( D.coldim() == C.coldim());
+
+ //Lock the device
+ pthread_mutex_lock(deviceLock);
+
+ //Partition the input matrices into chuncks that can fit onto the device
+ std::vector<SubmatrixAdapter<Operand1> > VD;
+ std::vector<SubmatrixAdapter<Operand2> > VA;
+ std::vector<SubmatrixAdapter<Operand3> > VB;
+ std::vector<SubmatrixAdapter<Operand1> > VC;
+ std::vector<int> partitionDims = oclPartition<Operand1,Operand2,Operand3>(
+ D,
+ A,
+ B,
+ C,
+ VD,
+ VA,
+ VB,
+ VC);
+
+ //Break out the partitioned dimensions
+ int DBlocksX = partitionDims.at(0);
+ int DBlocksY = partitionDims.at(1);
+ int ABlocksX = partitionDims.at(2);
+ //int ABlocksY = partitionDims.at(3);
+ int BBlocksX = partitionDims.at(4);
+ //nt BBlocksY = partitionDims.at(5);
+
+ float p = (float)_F.characteristic();
+
+ // Select OpenCL kernel based on the size of the modulus factor for
+ //maximum performance
+ //p^2 * n < 2^23
+ cl_kernel selectedKernel;
+ if(p <= (1 << 7)){
+ selectedKernel = spKernels[11];
+ }
+ else if(p <= (1 << 9)){
+ selectedKernel = spKernels[10];
+ }
+ else if(p <= (1 << 10)){
+ selectedKernel = spKernels[9];
+ }
+ else{
+ selectedKernel = spKernels[8];
+ }
+
+ for(int blockCol = 0; blockCol < DBlocksX; blockCol++){
+ for(int blockRow = 0; blockRow < DBlocksY; blockRow++){
+
+ SubmatrixAdapter<Operand1> SD = VD.at((size_t)(blockRow * DBlocksX + blockCol));
+ SubmatrixAdapter<Operand2> SA = VA.at((size_t)(blockRow * ABlocksX));
+ SubmatrixAdapter<Operand3> SB = VB.at((size_t)(blockCol));
+ SubmatrixAdapter<Operand1> SC = VC.at((size_t)(blockRow * DBlocksX + blockCol));
+
+ //Allocate buffers
+ cl_mem bufferD = oclCreateMatrixBuffer<cl_float,
+ SubmatrixAdapter<Operand1> >(SD);
+ cl_mem bufferA = oclCreateAndLoadMatrixBuffer<cl_float,
+ SubmatrixAdapter<Operand2> >(SA);
+ cl_mem bufferB = oclCreateAndLoadMatrixBuffer<cl_float,
+ SubmatrixAdapter<Operand3> >(SB);
+ cl_mem bufferC = oclCreateAndLoadMatrixBuffer<cl_float,
+ SubmatrixAdapter<Operand1> >(SC);
+
+ //((A.coldim() / 16) + (A.coldim() % 16 == 0 ? 0 : 1)) * 16
+ int widthA = (int) ((SA.coldim() + 15) / 16) * 16;
+ int heightA = (int) ((SA.rowdim() + 15) / 16) * 16;
+ int widthB = (int) ((SB.coldim() + 15) / 16) * 16;
+
+ //Call the kernel
+ oclCallKernel<float,cl_float>(
+ bufferD,
+ bufferA,
+ bufferB,
+ bufferC,
+ widthA,
+ heightA,
+ widthB,
+ p,
+ selectedKernel);
+
+ //Block until kernel finishes
+ cl_int tempErrcode;
+ tempErrcode = clFinish(commandQue);
+ linbox_check(tempErrcode == CL_SUCCESS);
+
+ //Delete OpenCL buffers
+ tempErrcode = clReleaseMemObject(bufferA);
+ linbox_check(tempErrcode == CL_SUCCESS);
+
+ tempErrcode = clReleaseMemObject(bufferB);
+ linbox_check(tempErrcode == CL_SUCCESS);
+
+
+ //Create temporary accumulation buffer
+ cl_mem tempBuffer = bufferC;
+ bufferC = bufferD;
+
+ for(int sharedDim = 1; sharedDim < ABlocksX; sharedDim++){
+ //Load next blocks onto the device
+ SA = VA.at((size_t)(blockRow * ABlocksX + sharedDim));
+ SB = VB.at((size_t)(blockCol + BBlocksX * sharedDim));
+ bufferA = oclCreateAndLoadMatrixBuffer<cl_float,
+ SubmatrixAdapter<Operand2> >(SA);
+ bufferB = oclCreateAndLoadMatrixBuffer<cl_float,
+ SubmatrixAdapter<Operand3> >(SB);
+
+ //((A.coldim() / 16) + (A.coldim() % 16 == 0 ? 0 : 1)) * 16
+ int widthA_ = (int) ((SA.coldim() + 15) / 16) * 16;
+ int heightA_ = (int) ((SA.rowdim() + 15) / 16) * 16;
+ int widthB_ = (int) ((SB.coldim() + 15) / 16) * 16;
+
+ //Call the kernel
+ oclCallKernel<float,cl_float>(
+ tempBuffer,
+ bufferA,
+ bufferB,
+ bufferC,
+ widthA_,
+ heightA_,
+ widthB_,
+ p,
+ selectedKernel);
+
+ //Block until kernel finishes
+ tempErrcode = clFinish(commandQue);
+ linbox_check(tempErrcode == CL_SUCCESS);
+
+ //Delete OpenCL buffers
+ tempErrcode = clReleaseMemObject(bufferA);
+ linbox_check(tempErrcode == CL_SUCCESS);
+
+ tempErrcode = clReleaseMemObject(bufferB);
+ linbox_check(tempErrcode == CL_SUCCESS);
+
+ //Shuffle buffer variables
+ cl_mem placeHolder = bufferC;
+ bufferC = tempBuffer;
+ tempBuffer = placeHolder;
+ }
+
+ //Read back buffer
+ SD = oclReadMatrixBuffer<cl_float,SubmatrixAdapter<Operand1> >(
+ bufferC,
+ SD);
+
+ //Delete OpenCL buffers
+ tempErrcode = clReleaseMemObject(bufferC);
+ linbox_check(tempErrcode == CL_SUCCESS);
+
+ tempErrcode = clReleaseMemObject(tempBuffer);
+ linbox_check(tempErrcode == CL_SUCCESS);
+ }
+ }
+
+ //Unlock the device
+ pthread_mutex_unlock(deviceLock);
+
+ return D;
+ }
+
+ /*
+ * Specialization of apxyin for
+ * multiplying two general dense matrices
+ * and adding a third general dense matrix
+ * over a Givaro::Modular<double> Field.
+ * Places the result into the first matrix.
+ * C += A*B
+ */
+ template <>
+ template <class Operand1, class Operand2, class Operand3>
+ Operand1& OpenCLMatrixDomain<Givaro::Modular<double> >::axpyin(
+ Operand1& C,
+ const Operand2& A,
+ const Operand3& B) const{
+
+ //Check if kernels are available
+ bool kernelsAvailable = dpKernelsAvailable[8];
+ kernelsAvailable &= dpKernelsAvailable[9];
+ kernelsAvailable &= dpKernelsAvailable[10];
+ kernelsAvailable &= dpKernelsAvailable[11];
+
+ //If it is not capable or not setup properly use default implementation
+ if(!setupCorrect || !doubleSupported || !kernelsAvailable){
+ return muladdin<Operand1,Operand2,Operand3>(_F.one,C,_F.one,A,B);
+ }
+
+ Operand1 T(C);
+ return axpy<Operand1,Operand2,Operand3>(C,A,B,T);
+ }
+
+ /*
+ * Specialization of apxyin for
+ * multiplying two general dense matrices
+ * and adding a third general dense matrix
+ * over a Givaro::Modular<float> Field.
+ * Places the result into the first matrix.
+ * C += A*B
+ */
+ template <>
+ template <class Operand1, class Operand2, class Operand3>
+ Operand1& OpenCLMatrixDomain<Givaro::Modular<float> >::axpyin(
+ Operand1& C,
+ const Operand2& A,
+ const Operand3& B) const{
+
+ //Check if kernels are available
+ bool kernelsAvailable = spKernelsAvailable[8];
+ kernelsAvailable &= spKernelsAvailable[9];
+ kernelsAvailable &= spKernelsAvailable[10];
+ kernelsAvailable &= spKernelsAvailable[11];
+
+ //If it is not capable or not setup properly use default implementation
+ if(!setupCorrect || !kernelsAvailable){
+ return muladdin<Operand1,Operand2,Operand3>(_F.one,C,_F.one,A,B);
+ }
+
+ Operand1 T(C);
+ return axpy<Operand1,Operand2,Operand3>(C,A,B,T);
+ }
+
+ /*
+ * Specialization of maxpy for
+ * multiplying two general dense matrices
+ * and subtracts it from a third general dense matrix
+ * over a Givaro::Modular<double> Field.
+ * D = C - A*B
+ */
+ template <>
+ template <class Operand1, class Operand2, class Operand3>
+ Operand1& OpenCLMatrixDomain<Givaro::Modular<double> >::maxpy(
+ Operand1& D,
+ const Operand2& A,
+ const Operand3& B,
+ const Operand1& C) const{
+
+ //Check if kernels are available
+ bool kernelsAvailable = dpKernelsAvailable[12];
+ kernelsAvailable &= dpKernelsAvailable[13];
+ kernelsAvailable &= dpKernelsAvailable[14];
+ kernelsAvailable &= dpKernelsAvailable[15];
+
+ //If it is not capable or not setup properly use default implementation
+ if(!setupCorrect || !doubleSupported || !kernelsAvailable){
+ return BlasMatrixDomainMulAdd<//Givaro::Modular<double>,
+ Operand1,
+ Operand2,
+ Operand3>()(D,_F.one,C,_F.mOne,A,B);
+ }
+
+ //Check dimensions
+ linbox_check( A.coldim() == B.rowdim());
+ linbox_check( C.rowdim() == A.rowdim());
+ linbox_check( C.coldim() == B.coldim());
+ linbox_check( D.rowdim() == C.rowdim());
+ linbox_check( D.coldim() == C.coldim());
+
+ //Lock the device
+ pthread_mutex_lock(deviceLock);
+
+ //Partition the input matrices into chuncks that can fit onto the device
+ std::vector<SubmatrixAdapter<Operand1> > VD;
+ std::vector<SubmatrixAdapter<Operand2> > VA;
+ std::vector<SubmatrixAdapter<Operand3> > VB;
+ std::vector<SubmatrixAdapter<Operand1> > VC;
+ std::vector<int> partitionDims = oclPartition<Operand1,Operand2,Operand3>(
+ D,
+ A,
+ B,
+ C,
+ VD,
+ VA,
+ VB,
+ VC);
+
+ //Break out the partitioned dimensions
+ int DBlocksX = partitionDims.at(0);
+ int DBlocksY = partitionDims.at(1);
+ int ABlocksX = partitionDims.at(2);
+ //int ABlocksY = partitionDims.at(3);
+ int BBlocksX = partitionDims.at(4);
+ //nt BBlocksY = partitionDims.at(5);
+
+ double p = (double)_F.characteristic();
+
+ // Select OpenCL kernel based on the size of the modulus factor for
+ //maximum performance
+ //p^2 * n < 2^53
+ cl_kernel selectedKernel;
+ if(p <= (1 << 21)){
+ selectedKernel = dpKernels[15];
+ }
+ else if(p <= (1 << 24)){
+ selectedKernel = dpKernels[14];
+ }
+ else if(p <= (1 << 25)){
+ selectedKernel = dpKernels[13];
+ }
+ else{
+ selectedKernel = dpKernels[12];
+ }
+
+ for(int blockCol = 0; blockCol < DBlocksX; blockCol++){
+ for(int blockRow = 0; blockRow < DBlocksY; blockRow++){
+
+ SubmatrixAdapter<Operand1> SD = VD.at((size_t)(blockRow * DBlocksX + blockCol));
+ SubmatrixAdapter<Operand2> SA = VA.at((size_t)(blockRow * ABlocksX));
+ SubmatrixAdapter<Operand3> SB = VB.at((size_t)(blockCol));
+ SubmatrixAdapter<Operand1> SC = VC.at((size_t)(blockRow * DBlocksX + blockCol));
+
+ //Allocate buffers
+ cl_mem bufferD = oclCreateMatrixBuffer<cl_double,
+ SubmatrixAdapter<Operand1> >(SD);
+ cl_mem bufferA = oclCreateAndLoadMatrixBuffer<cl_double,
+ SubmatrixAdapter<Operand2> >(SA);
+ cl_mem bufferB = oclCreateAndLoadMatrixBuffer<cl_double,
+ SubmatrixAdapter<Operand3> >(SB);
+ cl_mem bufferC = oclCreateAndLoadMatrixBuffer<cl_double,
+ SubmatrixAdapter<Operand1> >(SC);
+
+ //((A.coldim() / 16) + (A.coldim() % 16 == 0 ? 0 : 1)) * 16
+ int widthA = (int) ((SA.coldim() + 15) / 16) * 16;
+ int heightA = (int) ((SA.rowdim() + 15) / 16) * 16;
+ int widthB = (int) ((SB.coldim() + 15) / 16) * 16;
+
+ //Call the kernel
+ oclCallKernel<double,cl_double>(
+ bufferD,
+ bufferA,
+ bufferB,
+ bufferC,
+ widthA,
+ heightA,
+ widthB,
+ p,
+ selectedKernel);
+
+ //Block until kernel finishes
+ cl_int tempErrcode;
+ tempErrcode = clFinish(commandQue);
+ linbox_check(tempErrcode == CL_SUCCESS);
+
+ //Delete OpenCL buffers
+ tempErrcode = clReleaseMemObject(bufferA);
+ linbox_check(tempErrcode == CL_SUCCESS);
+
+ tempErrcode = clReleaseMemObject(bufferB);
+ linbox_check(tempErrcode == CL_SUCCESS);
+
+ //Create temporary accumulation buffer
+ cl_mem tempBuffer = bufferC;
+ bufferC = bufferD;
+
+ for(int sharedDim = 1; sharedDim < ABlocksX; sharedDim++){
+ //Load next blocks onto the device
+ SA = VA.at((size_t)(blockRow * ABlocksX + sharedDim));
+ SB = VB.at((size_t)(blockCol + BBlocksX * sharedDim));
+ bufferA = oclCreateAndLoadMatrixBuffer<cl_double,
+ SubmatrixAdapter<Operand2> >(SA);
+ bufferB = oclCreateAndLoadMatrixBuffer<cl_double,
+ SubmatrixAdapter<Operand3> >(SB);
+
+ //((A.coldim() / 16) + (A.coldim() % 16 == 0 ? 0 : 1)) * 16
+ int widthA_ = (int) ((SA.coldim() + 15) / 16) * 16;
+ int heightA_ = (int) ((SA.rowdim() + 15) / 16) * 16;
+ int widthB_ = (int) ((SB.coldim() + 15) / 16) * 16;
+
+ //Call the kernel
+ oclCallKernel<double,cl_double>(
+ tempBuffer,
+ bufferA,
+ bufferB,
+ bufferC,
+ widthA_,
+ heightA_,
+ widthB_,
+ p,
+ selectedKernel);
+
+ //Block until kernel finishes
+ tempErrcode = clFinish(commandQue);
+ linbox_check(tempErrcode == CL_SUCCESS);
+
+ //Delete OpenCL buffers
+ tempErrcode = clReleaseMemObject(bufferA);
+ linbox_check(tempErrcode == CL_SUCCESS);
+
+ tempErrcode = clReleaseMemObject(bufferB);
+ linbox_check(tempErrcode == CL_SUCCESS);
+
+ //Shuffle buffer variables
+ cl_mem placeHolder = bufferC;
+ bufferC = tempBuffer;
+ tempBuffer = placeHolder;
+ }
+
+ //Read back buffer
+ SD = oclReadMatrixBuffer<cl_double,SubmatrixAdapter<Operand1> >(
+ bufferC,
+ SD);
+
+ //Delete OpenCL buffers
+ tempErrcode = clReleaseMemObject(bufferC);
+ linbox_check(tempErrcode == CL_SUCCESS);
+
+ tempErrcode = clReleaseMemObject(tempBuffer);
+ linbox_check(tempErrcode == CL_SUCCESS);
+ }
+ }
+
+ //Unlock the device
+ pthread_mutex_unlock(deviceLock);
+
+ return D;
+ }
+
+ /*
+ * Specialization of maxpy for
+ * multiplying two general dense matrices
+ * and subtracts it from a third general dense matrix
+ * over a Givaro::Modular<float> Field.
+ * D = C - A*B
+ */
+ template <>
+ template <class Operand1, class Operand2, class Operand3>
+ Operand1& OpenCLMatrixDomain<Givaro::Modular<float> >::maxpy(
+ Operand1& D,
+ const Operand2& A,
+ const Operand3& B,
+ const Operand1& C) const{
+
+ //Check if kernels are available
+ bool kernelsAvailable = spKernelsAvailable[12];
+ kernelsAvailable &= spKernelsAvailable[13];
+ kernelsAvailable &= spKernelsAvailable[14];
+ kernelsAvailable &= spKernelsAvailable[15];
+
+ //If it is not capable or not setup properly use default implementation
+ if(!setupCorrect || !kernelsAvailable){
+ return BlasMatrixDomainMulAdd<//Givaro::Modular<float>,
+ Operand1,
+ Operand2,
+ Operand3>()(D,_F.one,C,_F.mOne,A,B);
+ }
+
+ //Check dimensions
+ linbox_check( A.coldim() == B.rowdim());
+ linbox_check( C.rowdim() == A.rowdim());
+ linbox_check( C.coldim() == B.coldim());
+ linbox_check( D.rowdim() == C.rowdim());
+ linbox_check( D.coldim() == C.coldim());
+
+ //Lock the device
+ pthread_mutex_lock(deviceLock);
+
+ //Partition the input matrices into chuncks that can fit onto the device
+ std::vector<SubmatrixAdapter<Operand1> > VD;
+ std::vector<SubmatrixAdapter<Operand2> > VA;
+ std::vector<SubmatrixAdapter<Operand3> > VB;
+ std::vector<SubmatrixAdapter<Operand1> > VC;
+ std::vector<int> partitionDims = oclPartition<Operand1,Operand2,Operand3>(
+ D,
+ A,
+ B,
+ C,
+ VD,
+ VA,
+ VB,
+ VC);
+
+ //Break out the partitioned dimensions
+ int DBlocksX = partitionDims.at(0);
+ int DBlocksY = partitionDims.at(1);
+ int ABlocksX = partitionDims.at(2);
+ //int ABlocksY = partitionDims.at(3);
+ int BBlocksX = partitionDims.at(4);
+ //nt BBlocksY = partitionDims.at(5);
+
+ float p = (float) _F.characteristic();
+
+ // Select OpenCL kernel based on the size of the modulus factor for
+ //maximum performance
+ //p^2 * n < 2^23
+ cl_kernel selectedKernel;;
+ if(p <= (1 << 7)){
+ selectedKernel = spKernels[15];
+ }
+ else if(p <= (1 << 9)){
+ selectedKernel = spKernels[14];
+ }
+ else if(p <= (1 << 10)){
+ selectedKernel = spKernels[13];
+ }
+ else{
+ selectedKernel = spKernels[12];
+ }
+
+ for(int blockCol = 0; blockCol < DBlocksX; blockCol++){
+ for(int blockRow = 0; blockRow < DBlocksY; blockRow++){
+
+ SubmatrixAdapter<Operand1> SD = VD.at((size_t)(blockRow * DBlocksX + blockCol));
+ SubmatrixAdapter<Operand2> SA = VA.at((size_t)(blockRow * ABlocksX));
+ SubmatrixAdapter<Operand3> SB = VB.at((size_t)(blockCol));
+ SubmatrixAdapter<Operand1> SC = VC.at((size_t)(blockRow * DBlocksX + blockCol));
+
+ //Allocate buffers
+ cl_mem bufferD = oclCreateMatrixBuffer<cl_float,
+ SubmatrixAdapter<Operand1> >(SD);
+ cl_mem bufferA = oclCreateAndLoadMatrixBuffer<cl_float,
+ SubmatrixAdapter<Operand2> >(SA);
+ cl_mem bufferB = oclCreateAndLoadMatrixBuffer<cl_float,
+ SubmatrixAdapter<Operand3> >(SB);
+ cl_mem bufferC = oclCreateAndLoadMatrixBuffer<cl_float,
+ SubmatrixAdapter<Operand1> >(SC);
+
+ //((A.coldim() / 16) + (A.coldim() % 16 == 0 ? 0 : 1)) * 16
+ int widthA = (int) ((SA.coldim() + 15) / 16) * 16;
+ int heightA = (int) ((SA.rowdim() + 15) / 16) * 16;
+ int widthB = (int) ((SB.coldim() + 15) / 16) * 16;
+
+ //Call the kernel
+ oclCallKernel<float,cl_float>(
+ bufferD,
+ bufferA,
+ bufferB,
+ bufferC,
+ widthA,
+ heightA,
+ widthB,
+ p,
+ selectedKernel);
+
+ //Block until kernel finishes
+ cl_int tempErrcode;
+ tempErrcode = clFinish(commandQue);
+ linbox_check(tempErrcode == CL_SUCCESS);
+
+ //Delete OpenCL buffers
+ tempErrcode = clReleaseMemObject(bufferA);
+ linbox_check(tempErrcode == CL_SUCCESS);
+
+ tempErrcode = clReleaseMemObject(bufferB);
+ linbox_check(tempErrcode == CL_SUCCESS);
+
+ //Create temporary accumulation buffer
+ cl_mem tempBuffer = bufferC;
+ bufferC = bufferD;
+
+ for(int sharedDim = 1; sharedDim < ABlocksX; sharedDim++){
+ //Load next blocks onto the device
+ SA = VA.at((size_t)(blockRow * ABlocksX + sharedDim));
+ SB = VB.at((size_t)(blockCol + BBlocksX * sharedDim));
+ bufferA = oclCreateAndLoadMatrixBuffer<cl_float,
+ SubmatrixAdapter<Operand2> >(SA);
+ bufferB = oclCreateAndLoadMatrixBuffer<cl_float,
+ SubmatrixAdapter<Operand3> >(SB);
+
+ //((A.coldim() / 16) + (A.coldim() % 16 == 0 ? 0 : 1)) * 16
+ int widthA_ = (int) ((SA.coldim() + 15) / 16) * 16;
+ int heightA_ = (int) ((SA.rowdim() + 15) / 16) * 16;
+ int widthB_ = (int) ((SB.coldim() + 15) / 16) * 16;
+
+ //Call the kernel
+ oclCallKernel<float,cl_float>(
+ tempBuffer,
+ bufferA,
+ bufferB,
+ bufferC,
+ widthA_,
+ heightA_,
+ widthB_,
+ p,
+ selectedKernel);
+
+ //Block until kernel finishes
+ tempErrcode = clFinish(commandQue);
+ linbox_check(tempErrcode == CL_SUCCESS);
+
+ //Delete OpenCL buffers
+ tempErrcode = clReleaseMemObject(bufferA);
+ linbox_check(tempErrcode == CL_SUCCESS);
+
+ tempErrcode = clReleaseMemObject(bufferB);
+ linbox_check(tempErrcode == CL_SUCCESS);
+
+ //Shuffle buffer variables
+ cl_mem placeHolder = bufferC;
+ bufferC = tempBuffer;
+ tempBuffer = placeHolder;
+ }
+
+ //Read back buffer
+ SD = oclReadMatrixBuffer<cl_float,SubmatrixAdapter<Operand1> >(
+ bufferC,
+ SD);
+
+ //Delete OpenCL buffers
+ tempErrcode = clReleaseMemObject(bufferC);
+ linbox_check(tempErrcode == CL_SUCCESS);
+
+ tempErrcode = clReleaseMemObject(tempBuffer);
+ linbox_check(tempErrcode == CL_SUCCESS);
+ }
+ }
+
+ //Unlock the device
+ pthread_mutex_unlock(deviceLock);
+
+ return D;
+ }
+
+ /*
+ * Specialization of maxpyin for
+ * multiplying two general dense matrices
+ * and subtracts it from a third general dense matrix
+ * over a Givaro::Modular<double> Field.
+ * Places the results into the first gernal dense matrix.
+ * C -= A*B
+ */
+ template <>
+ template <class Operand1, class Operand2, class Operand3>
+ Operand1& OpenCLMatrixDomain<Givaro::Modular<double> >::maxpyin(
+ Operand1& C,
+ const Operand2& A,
+ const Operand3& B) const{
+
+ //Check if kernels are available
+ bool kernelsAvailable = dpKernelsAvailable[12];
+ kernelsAvailable &= dpKernelsAvailable[13];
+ kernelsAvailable &= dpKernelsAvailable[14];
+ kernelsAvailable &= dpKernelsAvailable[15];
+
+ //If it is not capable or not setup properly use default implementation
+ if(!setupCorrect || !doubleSupported || !kernelsAvailable){
+ return muladdin<Operand1,Operand2,Operand3>(_F.one,C,_F.mOne,A,B);
+ }
+
+ Operand1 T(C);
+ return maxpy<Operand1,Operand2,Operand3>(C,A,B,T);
+ }
+
+ /*
+ * Specialization of maxpyin for
+ * multiplying two general dense matrices
+ * and subtracts it from a third general dense matrix
+ * over a Givaro::Modular<float> Field.
+ * Places the results into the first gernal dense matrix.
+ * C -= A*B
+ */
+ template <>
+ template <class Operand1, class Operand2, class Operand3>
+ Operand1& OpenCLMatrixDomain<Givaro::Modular<float> >::maxpyin(
+ Operand1& C,
+ const Operand2& A,
+ const Operand3& B) const{
+
+ //Check if kernels are available
+ bool kernelsAvailable = spKernelsAvailable[12];
+ kernelsAvailable &= spKernelsAvailable[13];
+ kernelsAvailable &= spKernelsAvailable[14];
+ kernelsAvailable &= spKernelsAvailable[15];
+
+ //If it is not capable or not setup properly use default implementation
+ if(!setupCorrect || !kernelsAvailable){
+ return muladdin<Operand1,Operand2,Operand3>(_F.one,C,_F.mOne,A,B);
+ }
+
+ Operand1 T(C);
+ return maxpy<Operand1,Operand2,Operand3>(C,A,B,T);
+ }
+
+ /*
+ * Specialization of axmy for
+ * multiplying two general dense matrices
+ * and subtracts a third general dense matrix from it
+ * over a Givaro::Modular<double> Field.
+ * D = A*B - C
+ */
+ template <>
+ template <class Operand1, class Operand2, class Operand3>
+ Operand1& OpenCLMatrixDomain<Givaro::Modular<double> >::axmy(
+ Operand1& D,
+ const Operand2& A,
+ const Operand3& B,
+ const Operand1& C) const{
+
+ //Check if kernels are available
+ bool kernelsAvailable = dpKernelsAvailable[16];
+ kernelsAvailable &= dpKernelsAvailable[17];
+ kernelsAvailable &= dpKernelsAvailable[18];
+ kernelsAvailable &= dpKernelsAvailable[19];
+ kernelsAvailable &= dpKernelsAvailable[8];
+ kernelsAvailable &= dpKernelsAvailable[9];
+ kernelsAvailable &= dpKernelsAvailable[10];
+ kernelsAvailable &= dpKernelsAvailable[11];
+
+ //If it is not capable or not setup properly use default implementation
+ if(!setupCorrect || !doubleSupported || !kernelsAvailable){
+ return BlasMatrixDomainMulAdd<//Givaro::Modular<double>,
+ Operand1,
+ Operand2,
+ Operand3>()(D,_F.mOne,C,_F.one,A,B);
+ }
+
+ //Check dimensions
+ linbox_check( A.coldim() == B.rowdim());
+ linbox_check( C.rowdim() == A.rowdim());
+ linbox_check( C.coldim() == B.coldim());
+ linbox_check( D.rowdim() == C.rowdim());
+ linbox_check( D.coldim() == C.coldim());
+
+ //Lock the device
+ pthread_mutex_lock(deviceLock);
+
+ //Partition the input matrices into chuncks that can fit onto the device
+ std::vector<SubmatrixAdapter<Operand1> > VD;
+ std::vector<SubmatrixAdapter<Operand2> > VA;
+ std::vector<SubmatrixAdapter<Operand3> > VB;
+ std::vector<SubmatrixAdapter<Operand1> > VC;
+ std::vector<int> partitionDims = oclPartition<Operand1,Operand2,Operand3>(
+ D,
+ A,
+ B,
+ C,
+ VD,
+ VA,
+ VB,
+ VC);
+
+ //Break out the partitioned dimensions
+ int DBlocksX = partitionDims.at(0);
+ int DBlocksY = partitionDims.at(1);
+ int ABlocksX = partitionDims.at(2);
+ //int ABlocksY = partitionDims.at(3);
+ int BBlocksX = partitionDims.at(4);
+ //nt BBlocksY = partitionDims.at(5);
+
+ double p = (double)_F.characteristic();
+
+ // Select OpenCL kernel based on the size of the modulus factor for
+ //maximum performance
+ //p^2 * n < 2^53
+ cl_kernel selectedAxmyKernel;
+ cl_kernel selectedAxpyKernel;
+ if(p <= (1 << 21)){
+ selectedAxmyKernel = dpKernels[19];
+ selectedAxpyKernel = dpKernels[11];
+ }
+ else if(p <= (1 << 24)){
+ selectedAxmyKernel = dpKernels[18];
+ selectedAxpyKernel = dpKernels[10];
+ }
+ else if(p <= (1 << 25)){
+ selectedAxmyKernel = dpKernels[17];
+ selectedAxpyKernel = dpKernels[9];
+ }
+ else{
+ selectedAxmyKernel = dpKernels[16];
+ selectedAxpyKernel = dpKernels[8];
+ }
+
+ for(int blockCol = 0; blockCol < DBlocksX; blockCol++){
+ for(int blockRow = 0; blockRow < DBlocksY; blockRow++){
+
+ SubmatrixAdapter<Operand1> SD = VD.at((size_t)(blockRow * DBlocksX + blockCol));
+ SubmatrixAdapter<Operand2> SA = VA.at((size_t)(blockRow * ABlocksX));
+ SubmatrixAdapter<Operand3> SB = VB.at((size_t)(blockCol));
+ SubmatrixAdapter<Operand1> SC = VC.at((size_t)(blockRow * DBlocksX + blockCol));
+
+ //Allocate buffers
+ cl_mem bufferD = oclCreateMatrixBuffer<cl_double,
+ SubmatrixAdapter<Operand1> >(SD);
+ cl_mem bufferA = oclCreateAndLoadMatrixBuffer<cl_double,
+ SubmatrixAdapter<Operand2> >(SA);
+ cl_mem bufferB = oclCreateAndLoadMatrixBuffer<cl_double,
+ SubmatrixAdapter<Operand3> >(SB);
+ cl_mem bufferC = oclCreateAndLoadMatrixBuffer<cl_double,
+ SubmatrixAdapter<Operand1> >(SC);
+
+ //((A.coldim() / 16) + (A.coldim() % 16 == 0 ? 0 : 1)) * 16
+ int widthA = (int) ((SA.coldim() + 15) / 16) * 16;
+ int heightA = (int) ((SA.rowdim() + 15) / 16) * 16;
+ int widthB = (int) ((SB.coldim() + 15) / 16) * 16;
+
+ //Call the kernel
+ oclCallKernel<double,cl_double>(
+ bufferD,
+ bufferA,
+ bufferB,
+ bufferC,
+ widthA,
+ heightA,
+ widthB,
+ p,
+ selectedAxmyKernel);
+
+ //Block until kernel finishes
+ cl_int tempErrcode;
+ tempErrcode = clFinish(commandQue);
+ linbox_check(tempErrcode == CL_SUCCESS);
+
+ //Delete OpenCL buffers
+ tempErrcode = clReleaseMemObject(bufferA);
+ linbox_check(tempErrcode == CL_SUCCESS);
+
+ tempErrcode = clReleaseMemObject(bufferB);
+ linbox_check(tempErrcode == CL_SUCCESS);
+
+ //Create temporary accumulation buffer
+ cl_mem tempBuffer = bufferC;
+ bufferC = bufferD;
+
+ for(int sharedDim = 1; sharedDim < ABlocksX; sharedDim++){
+ //Load next blocks onto the device
+ SA = VA.at((size_t)(blockRow * ABlocksX + sharedDim));
+ SB = VB.at((size_t)(blockCol + BBlocksX * sharedDim));
+ bufferA = oclCreateAndLoadMatrixBuffer<cl_double,
+ SubmatrixAdapter<Operand2> >(SA);
+ bufferB = oclCreateAndLoadMatrixBuffer<cl_double,
+ SubmatrixAdapter<Operand3> >(SB);
+
+ //((A.coldim() / 16) + (A.coldim() % 16 == 0 ? 0 : 1)) * 16
+ int widthA_ = (int) ((SA.coldim() + 15) / 16) * 16;
+ int heightA_ = (int) ((SA.rowdim() + 15) / 16) * 16;
+ int widthB_ = (int) ((SB.coldim() + 15) / 16) * 16;
+
+ //Call the kernel
+ oclCallKernel<double,cl_double>(
+ tempBuffer,
+ bufferA,
+ bufferB,
+ bufferC,
+ widthA_,
+ heightA_,
+ widthB_,
+ p,
+ selectedAxpyKernel);
+
+ //Block until kernel finishes
+ tempErrcode = clFinish(commandQue);
+ linbox_check(tempErrcode == CL_SUCCESS);
+
+ //Delete OpenCL buffers
+ tempErrcode = clReleaseMemObject(bufferA);
+ linbox_check(tempErrcode == CL_SUCCESS);
+
+ tempErrcode = clReleaseMemObject(bufferB);
+ linbox_check(tempErrcode == CL_SUCCESS);
+
+ //Shuffle buffer variables
+ cl_mem placeHolder = bufferC;
+ bufferC = tempBuffer;
+ tempBuffer = placeHolder;
+ }
+
+ //Read back buffer
+ SD = oclReadMatrixBuffer<cl_double,SubmatrixAdapter<Operand1> >(
+ bufferC,
+ SD);
+
+ //Delete OpenCL buffers
+ tempErrcode = clReleaseMemObject(bufferC);
+ linbox_check(tempErrcode == CL_SUCCESS);
+
+ tempErrcode = clReleaseMemObject(tempBuffer);
+ linbox_check(tempErrcode == CL_SUCCESS);
+ }
+ }
+
+ //Unlock the device
+ pthread_mutex_unlock(deviceLock);
+
+ return D;
+ }
+
+ /*
+ * Specialization of axmy for
+ * multiplying two general dense matrices
+ * and subtracts a third general dense matrix from it
+ * over a Givaro::Modular<float> Field.
+ * D = A*B - C
+ */
+ template <>
+ template <class Operand1, class Operand2, class Operand3>
+ Operand1& OpenCLMatrixDomain<Givaro::Modular<float> >::axmy(
+ Operand1& D,
+ const Operand2& A,
+ const Operand3& B,
+ const Operand1& C) const{
+
+ //Check if kernels are available
+ bool kernelsAvailable = spKernelsAvailable[16];
+ kernelsAvailable &= spKernelsAvailable[17];
+ kernelsAvailable &= spKernelsAvailable[18];
+ kernelsAvailable &= spKernelsAvailable[19];
+ kernelsAvailable &= spKernelsAvailable[8];
+ kernelsAvailable &= spKernelsAvailable[9];
+ kernelsAvailable &= spKernelsAvailable[10];
+ kernelsAvailable &= spKernelsAvailable[11];
+
+ //If it is not capable or not setup properly use default implementation
+ if(!setupCorrect || !kernelsAvailable){
+ return BlasMatrixDomainMulAdd<//Givaro::Modular<float>,
+ Operand1,
+ Operand2,
+ Operand3>()(D,_F.mOne,C,_F.one,A,B);
+ }
+
+ //Check dimensions
+ linbox_check( A.coldim() == B.rowdim());
+ linbox_check( C.rowdim() == A.rowdim());
+ linbox_check( C.coldim() == B.coldim());
+ linbox_check( D.rowdim() == C.rowdim());
+ linbox_check( D.coldim() == C.coldim());
+
+ //Lock the device
+ pthread_mutex_lock(deviceLock);
+
+ //Partition the input matrices into chuncks that can fit onto the device
+ std::vector<SubmatrixAdapter<Operand1> > VD;
+ std::vector<SubmatrixAdapter<Operand2> > VA;
+ std::vector<SubmatrixAdapter<Operand3> > VB;
+ std::vector<SubmatrixAdapter<Operand1> > VC;
+ std::vector<int> partitionDims = oclPartition<Operand1,Operand2,Operand3>(
+ D,
+ A,
+ B,
+ C,
+ VD,
+ VA,
+ VB,
+ VC);
+
+ //Break out the partitioned dimensions
+ int DBlocksX = partitionDims.at(0);
+ int DBlocksY = partitionDims.at(1);
+ int ABlocksX = partitionDims.at(2);
+ //int ABlocksY = partitionDims.at(3);
+ int BBlocksX = partitionDims.at(4);
+ //nt BBlocksY = partitionDims.at(5);
+
+ float p = (float)_F.characteristic();
+
+ // Select OpenCL kernel based on the size of the modulus factor for
+ //maximum performance
+ //p^2 * n < 2^23
+ cl_kernel selectedAxmyKernel;
+ cl_kernel selectedAxpyKernel;
+ if(p <= (1 << 7)){
+ selectedAxmyKernel = spKernels[19];
+ selectedAxpyKernel = spKernels[11];
+ }
+ else if(p <= (1 << 9)){
+ selectedAxmyKernel = spKernels[18];
+ selectedAxpyKernel = spKernels[10];
+ }
+ else if(p <= (1 << 10)){
+ selectedAxmyKernel = spKernels[17];
+ selectedAxpyKernel = spKernels[9];
+ }
+ else{
+ selectedAxmyKernel = spKernels[16];
+ selectedAxpyKernel = spKernels[8];
+ }
+
+ for(int blockCol = 0; blockCol < DBlocksX; blockCol++){
+ for(int blockRow = 0; blockRow < DBlocksY; blockRow++){
+
+ SubmatrixAdapter<Operand1> SD = VD.at((size_t)(blockRow * DBlocksX + blockCol));
+ SubmatrixAdapter<Operand2> SA = VA.at((size_t)(blockRow * ABlocksX));
+ SubmatrixAdapter<Operand3> SB = VB.at((size_t)(blockCol));
+ SubmatrixAdapter<Operand1> SC = VC.at((size_t)(blockRow * DBlocksX + blockCol));
+
+ //Allocate buffers
+ cl_mem bufferD = oclCreateMatrixBuffer<cl_float,
+ SubmatrixAdapter<Operand1> >(SD);
+ cl_mem bufferA = oclCreateAndLoadMatrixBuffer<cl_float,
+ SubmatrixAdapter<Operand2> >(SA);
+ cl_mem bufferB = oclCreateAndLoadMatrixBuffer<cl_float,
+ SubmatrixAdapter<Operand3> >(SB);
+ cl_mem bufferC = oclCreateAndLoadMatrixBuffer<cl_float,
+ SubmatrixAdapter<Operand1> >(SC);
+
+ //((A.coldim() / 16) + (A.coldim() % 16 == 0 ? 0 : 1)) * 16
+ int widthA = (int) ((SA.coldim() + 15) / 16) * 16;
+ int heightA = (int) ((SA.rowdim() + 15) / 16) * 16;
+ int widthB = (int) ((SB.coldim() + 15) / 16) * 16;
+
+ //Call the kernel
+ oclCallKernel<float,cl_float>(
+ bufferD,
+ bufferA,
+ bufferB,
+ bufferC,
+ widthA,
+ heightA,
+ widthB,
+ p,
+ selectedAxmyKernel);
+
+ //Block until kernel finishes
+ cl_int tempErrcode;
+ tempErrcode = clFinish(commandQue);
+ linbox_check(tempErrcode == CL_SUCCESS);
+
+ //Delete OpenCL buffers
+ tempErrcode = clReleaseMemObject(bufferA);
+ linbox_check(tempErrcode == CL_SUCCESS);
+
+ tempErrcode = clReleaseMemObject(bufferB);
+ linbox_check(tempErrcode == CL_SUCCESS);
+
+ //Create temporary accumulation buffer
+ cl_mem tempBuffer = bufferC;
+ bufferC = bufferD;
+
+ for(int sharedDim = 1; sharedDim < ABlocksX; sharedDim++){
+ //Load next blocks onto the device
+ SA = VA.at((size_t)(blockRow * ABlocksX + sharedDim));
+ SB = VB.at((size_t)(blockCol + BBlocksX * sharedDim));
+ bufferA = oclCreateAndLoadMatrixBuffer<cl_float,
+ SubmatrixAdapter<Operand2> >(SA);
+ bufferB = oclCreateAndLoadMatrixBuffer<cl_float,
+ SubmatrixAdapter<Operand3> >(SB);
+
+ //((A.coldim() / 16) + (A.coldim() % 16 == 0 ? 0 : 1)) * 16
+ int widthA_ = (int) ((SA.coldim() + 15) / 16) * 16;
+ int heightA_ = (int) ((SA.rowdim() + 15) / 16) * 16;
+ int widthB_ = (int) ((SB.coldim() + 15) / 16) * 16;
+
+ //Call the kernel
+ oclCallKernel<float,cl_float>(
+ tempBuffer,
+ bufferA,
+ bufferB,
+ bufferC,
+ widthA_,
+ heightA_,
+ widthB_,
+ p,
+ selectedAxpyKernel);
+
+ //Block until kernel finishes
+ tempErrcode = clFinish(commandQue);
+ linbox_check(tempErrcode == CL_SUCCESS);
+
+ //Delete OpenCL buffers
+ tempErrcode = clReleaseMemObject(bufferA);
+ linbox_check(tempErrcode == CL_SUCCESS);
+
+ tempErrcode = clReleaseMemObject(bufferB);
+ linbox_check(tempErrcode == CL_SUCCESS);
+
+ //Shuffle buffer variables
+ cl_mem placeHolder = bufferC;
+ bufferC = tempBuffer;
+ tempBuffer = placeHolder;
+ }
+
+ //Read back buffer
+ SD = oclReadMatrixBuffer<cl_float,SubmatrixAdapter<Operand1> >(
+ bufferC,
+ SD);
+
+ //Delete OpenCL buffers
+ tempErrcode = clReleaseMemObject(bufferC);
+ linbox_check(tempErrcode == CL_SUCCESS);
+
+ tempErrcode = clReleaseMemObject(tempBuffer);
+ linbox_check(tempErrcode == CL_SUCCESS);
+ }
+ }
+
+ //Unlock the device
+ pthread_mutex_unlock(deviceLock);
+
+ return D;
+ }
+
+ /*
+ * Specialization of axmyin for
+ * multiplying two general dense matrices
+ * and subtracts a third general dense matrix from it
+ * over a Givaro::Modular<double> Field.
+ * Places the results into the first general dense matrix
+ * C = A*B - C
+ */
+ template <>
+ template <class Operand1, class Operand2, class Operand3>
+ Operand1& OpenCLMatrixDomain<Givaro::Modular<double> >::axmyin(
+ Operand1& C,
+ const Operand2& A,
+ const Operand3& B) const{
+
+ //Check if kernels are available
+ bool kernelsAvailable = dpKernelsAvailable[16];
+ kernelsAvailable &= dpKernelsAvailable[17];
+ kernelsAvailable &= dpKernelsAvailable[18];
+ kernelsAvailable &= dpKernelsAvailable[19];
+ kernelsAvailable &= dpKernelsAvailable[8];
+ kernelsAvailable &= dpKernelsAvailable[9];
+ kernelsAvailable &= dpKernelsAvailable[10];
+ kernelsAvailable &= dpKernelsAvailable[11];
+
+ //If it is not capable or not setup properly use default implementation
+ if(!setupCorrect || !doubleSupported || !kernelsAvailable){
+ return muladdin<Operand1,Operand2,Operand3>(_F.mOne,C,_F.one,A,B);
+ }
+
+ Operand1 T(C);
+ return axmy<Operand1,Operand2,Operand3>(C,A,B,T);
+ }
+
+ /*
+ * Specialization of axmyin for
+ * multiplying two general dense matrices
+ * and subtracts a third general dense matrix from it
+ * over a Givaro::Modular<float> Field.
+ * Places the results into the first general dense matrix
+ * C = A*B - C
+ */
+ template <>
+ template <class Operand1, class Operand2, class Operand3>
+ Operand1& OpenCLMatrixDomain<Givaro::Modular<float> >::axmyin(
+ Operand1& C,
+ const Operand2& A,
+ const Operand3& B) const{
+
+ //Check if kernels are available
+ bool kernelsAvailable = spKernelsAvailable[16];
+ kernelsAvailable &= spKernelsAvailable[17];
+ kernelsAvailable &= spKernelsAvailable[18];
+ kernelsAvailable &= spKernelsAvailable[19];
+ kernelsAvailable &= spKernelsAvailable[8];
+ kernelsAvailable &= spKernelsAvailable[9];
+ kernelsAvailable &= spKernelsAvailable[10];
+ kernelsAvailable &= spKernelsAvailable[11];
+
+ //If it is not capable or not setup properly use default implementation
+ if(!setupCorrect || !kernelsAvailable){
+ return muladdin<Operand1,Operand2,Operand3>(_F.mOne,C,_F.one,A,B);
+ }
+
+ Operand1 T(C);
+ return axmy<Operand1,Operand2,Operand3>(C,A,B,T);
+ }
+
+} //end of namespace LinBox
+
+#endif // __LINBOX_opencl_matrix_domain_INL
+
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/matrix/matrixdomain/plain-domain.h b/linbox/matrix/matrixdomain/plain-domain.h
new file mode 100644
index 0000000..22827fa
--- /dev/null
+++ b/linbox/matrix/matrixdomain/plain-domain.h
@@ -0,0 +1,240 @@
+#ifndef __LINBOX_plain_domain_h
+#define __LINBOX_plain_domain_h
+
+#include "linbox/util/error.h"
+#include "linbox/matrix/plain-matrix.h"
+
+namespace LinBox {
+/*
+ PlainDomain is a reference implementation of a matrix domain.
+ It makes a domain from any field by contributing very basic matrix functions using
+ the getEntry/setEntry functions of the DenseMatrix interface.
+
+PlainDomain has a constructor from field,
+it's PlainDomain::Matrix type meets the dense submatrix concept
+and it is the interface for working with dense matrices. When you need to allocate a new matrix use
+PlainDomain::NewMatrix.
+
+A Blackbox over PlainDomain<Field> is any matrix type that has apply and applyTranspose applicable to PlainDomain<Field>::Matrix. That is to say the signature of apply is
+ Matrix& Blackbox::apply(Matrix& Y, const Matrix& X)
+
+PlainDomain provides, for dense Submatrices A,B,C
+ mul(C, A, B) // C = A * B
+ axpyin(C, A, B) // C += A * B
+ addin(A, B) // A += B
+
+ functions on Submatrix
+ add sub neg mul div inv axpy (both scalar and matrix
+ inplace forms of those
+ areEqual isZero
+
+ alternative functions
+ gemm (rplace axpy) (trans)
+ additional functions
+ trsm (trans, uplo) trmm(trans, uplo) symm (trans, uplo)
+ (in particular triangular solving must be included
+*/
+
+template<class Field_>
+struct PlainDomain : public Field_
+{
+ typedef PlainDomain<Field_> Self_t;
+ typedef Field_ Father_t;
+ typedef size_t Index;
+ // A domain provides distinct types: Scalar, Matrix, and Blackbox.
+ typedef typename Father_t::Element Scalar;
+ typedef typename Father_t::Element Element;
+ typedef PlainSubmatrix<Self_t> Submatrix;
+ typedef PlainMatrix<Self_t> Matrix;
+ // but matrix should admit triangular forms
+
+ // constructors and assignment
+ //PlainDomain (size_t p = 0, size_t e = 1): Field(p) {}
+ PlainDomain()
+ {}
+ PlainDomain(const Element& p)
+ : Father_t(p) {}
+ PlainDomain(const Father_t& F)
+ : Father_t(F) {}
+ PlainDomain(const PlainDomain<Father_t>& D)
+ : Father_t(D) {}
+ //~PlainDomain()
+ // {} // default dstor is fine.
+ using Father_t::operator=;
+ const Father_t& field() const // transitional
+ { return *this; }
+
+// A domain provides field functions and (dense) matrix functions.
+
+// field functions
+ using Father_t::init;
+ using Father_t::add;
+ using Father_t::sub;
+ using Father_t::neg;
+ using Father_t::mul;
+ using Father_t::div;
+ using Father_t::inv;
+ using Father_t::axpy;
+ using Father_t::addin;
+ using Father_t::subin;
+ using Father_t::negin;
+ using Father_t::mulin;
+ using Father_t::divin;
+ using Father_t::invin;
+ using Father_t::axpyin;
+ using Father_t::isZero;
+ using Father_t::isOne;
+ using Father_t::areEqual;
+ using Father_t::cardinality;
+ using Father_t::characteristic;
+ using Father_t::write;
+ using Father_t::read;
+
+// matrix arithmetic functions
+
+ Submatrix& add (Submatrix& C, const Submatrix& A, const Submatrix& B) const // C = A + B, where A, B, C have the same shape.
+ { C = B; return addin(C,A); }
+ Submatrix& neg (Submatrix& B, const Submatrix& A) const // B = -A, where B and A have the same shape.
+ { B = A; return negin(B); }
+ Submatrix& sub (Submatrix& C, const Submatrix& A, const Submatrix& B) const // C = A - B, where A, B, C have the same shape.
+ { C = B; return subin(C,A); }
+ Submatrix& smul (Submatrix& B, const Scalar& a, const Submatrix& A) const // B = a*A.
+ { B = A; return smulin(B,a); }
+ Submatrix& saxpy (Submatrix& C, const Scalar& a, const Submatrix& A, const Submatrix& B) const // C = a*A + B.
+ { C = B; return saxpyin(C,a,A); }
+ Submatrix& mul (Submatrix& C, const Submatrix& A, const Submatrix& B) const // C = A*B, conformal shapes required.
+ { for (Index i = 0; i < C.rowdim(); ++i)
+ for (Index j = 0; j < C.coldim(); ++j)
+ { Scalar x,y,z; field().assign(x, field().zero); field().assign(y,field().zero); field().assign(z,field().zero);
+ for (Index k = 0; k < B.coldim(); ++k)
+ field().axpyin(x, A.getEntry(y,i,k), B.getEntry(z,k,j));
+ C.setEntry(i,j,x);
+ }
+ return C;
+ }
+ Submatrix& inv (Submatrix& B, const Submatrix& A) const // B = A^{-1}
+ { B = A; return invin(B); }
+ /*?*/Submatrix& div (Submatrix& C, const Submatrix& A, const Submatrix& B) const // C = A/B, B nonsingular required.
+ { throw(LinboxError("PlainDomain - what is div?")); return C; }
+ Submatrix& axpy( Submatrix& D, const Submatrix& C, const Submatrix& A, const Submatrix &B) const // D = C + A*B, conformal shapes required.
+ { D = C; return axpyin(D,A,B); }
+ Submatrix& addin (Submatrix& B, const Submatrix& A) const // B += A, where B and A have the same shape.
+ { for (Index i = 0; i < B.rowdim(); ++i)
+ for (Index j = 0; j < B.coldim(); ++j)
+ { Scalar x = field().zero, y = field().zero;
+ A.getEntry(x,i,j); B.getEntry(y,i,j);
+ B.setEntry(i,j, field().addin(x, y));
+ }
+ return B;
+ }
+ Submatrix& negin (Submatrix& A) const // A = -A.
+ { for (Index i = 0; i < A.rowdim(); ++i)
+ for (Index j = 0; j < A.coldim(); ++j)
+ { Scalar x = field().zero;
+ A.getEntry(x,i,j);
+ A.setEntry(i,j,field().negin(x));
+ }
+ return A;
+ }
+ Submatrix& subin (Submatrix& B, const Submatrix& A) const // B -= A, where B and A have the same shape.
+ { for (Index i = 0; i < B.rowdim(); ++i)
+ for (Index j = 0; j < B.coldim(); ++j)
+ { Scalar x = field().zero, y = field().zero;
+ A.getEntry(x,i,j);
+ B.setEntry(i,j, field().subin(x, y));
+ }
+ return B;
+ }
+ Submatrix& smulin (Submatrix& B, const Scalar& a) const // B = aB
+ { for (Index i = 0; i < B.rowdim(); ++i)
+ for (Index j = 0; j < B.coldim(); ++j)
+ { Scalar x; init(x);
+ B.getEntry(x,i,j);
+ B.setEntry(i,j, mulin(x, a));
+ }
+ // this could use a _private_ refEntry...
+ return B;
+ }
+ Submatrix& saxpyin( Submatrix& A, const Scalar& a, const Submatrix &B) const // A += a*B, shapes must conform.
+ { for (Index i = 0; i < B.rowdim(); ++i)
+ for (Index j = 0; j < B.coldim(); ++j)
+ { Scalar x = field().zero, y = field().zero;
+ A.getEntry(x,i,j); B.getEntry(y,i,j);
+ A.setEntry(i,j, field().axpyin(x, a, y));
+ }
+ // this could use a _private_ refEntry...
+ return A;
+ }
+ Submatrix& mulin_left (Submatrix& A, const Submatrix& B) const // A = A*B, for square, same dim A and B.
+ { Matrix C(*this, B.rowdim(), A.coldim());
+ mul(C,A,B); return A = C;
+ }
+ Submatrix& mulin_right (const Submatrix& A, Submatrix& B) const // B = A*B, for square, same dim A and B.
+ { Matrix C(*this, B.rowdim(), A.coldim());
+ mul(C,A,B); return B = C;
+ }
+ /*?*/Submatrix& invin (Submatrix& A) const // A = A^{-1}
+ { throw(LinboxError("PlainDomain invin for nonsing Submatrix not yet impl.")); return A; }
+ /*?*/Submatrix& divin (Submatrix& A, const Submatrix& B) const // A /= B, B nonsingular required.
+ { throw(LinboxError("PlainDomain what is divin?")); return A; }
+ Submatrix& axpyin( Submatrix& C, const Submatrix& A, const Submatrix &B) const // C += A*B, shapes must conform.
+ { for (Index i = 0; i < C.rowdim(); ++i)
+ for (Index j = 0; j < C.coldim(); ++j)
+ { Scalar x,y,z; field().assign(x, field().zero); field().assign(y,field().zero); field().assign(z,field().zero);
+ C.getEntry(x,i,j);
+ for (Index k = 0; k < B.coldim(); ++k)
+ field().axpyin(x, A.getEntry(y,i,k), B.getEntry(z,k,j));
+ C.setEntry(i,j,x);
+ }
+ return C;
+ }
+ //Submatrix& copy(Submatrix &dst, const Submatrix& src) // deep copy, same as assignment
+
+
+ bool areEqual(const Submatrix& A, const Submatrix &B) const // A == B, same shape not required
+ {
+ Scalar a = field().zero, b = field().zero;
+ for (size_t i = 0; i < A.rowdim(); ++i)
+ for (size_t j = 0; j < A.coldim(); ++j)
+ { A.getEntry(a, i, j);
+ B.getEntry(b, i, j);
+ if (not field().areEqual(a, b) )
+ return false;
+ }
+ return true;
+ }
+
+// simple write
+ std::ostream& write(std::ostream& out, const Submatrix& A) const
+ {
+ Scalar a;
+ //out << "%%MatrixMarketExtended array" << std::endl;
+ out << A.rowdim() << " " << A.coldim() << std::endl;
+ for (size_t i = 0; i < A.rowdim(); ++i){
+ for (size_t j = 0; j < A.coldim(); ++j)
+ write(out, A.getEntry(a, i, j)) << " ";
+ out << std::endl;
+ }
+ return out << std::endl;
+ }
+
+// simple read. should use matrix reader
+ std::istream& read(std::istream& in, Submatrix& A) const
+ {
+ Scalar a;
+ size_t r, c;
+ in >> r >> c;
+ A.init(r, c);
+ for (size_t i = 0; i < A.rowdim(); ++i)
+ for (size_t j = 0; j < A.coldim(); ++j){
+ read(in, a);
+ A.setEntry(i, j, a);
+ }
+ return in;
+ }
+
+}; // PlainDomain
+
+} // LinBox
+#endif // __LINBOX_plain_domain_h
+
diff --git a/linbox/matrix/permutation-matrix.doxy b/linbox/matrix/permutation-matrix.doxy
new file mode 100644
index 0000000..363d2a4
--- /dev/null
+++ b/linbox/matrix/permutation-matrix.doxy
@@ -0,0 +1,32 @@
+// Copyright 2014 LinBox. See COPYING for licence information.
+/*
+ * Written by Brice Boyer (briceboyer) <boyer.brice at gmail.com>
+
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ * ========LICENCE========
+ */
+
+/** \ingroup matrix
+ * \defgroup permutationmatrix Permutation Matrix
+ * \brief These are permutation matrix reprensentations
+ *
+ * NO DOC YET
+ *
+ */
+
+// vim:syn=doxygen
diff --git a/linbox/matrix/permutation-matrix.h b/linbox/matrix/permutation-matrix.h
index ad3c41d..3ffb1cd 100644
--- a/linbox/matrix/permutation-matrix.h
+++ b/linbox/matrix/permutation-matrix.h
@@ -1,6 +1,6 @@
/* Copyright (C) 2010 LinBox
- * Written by <brice.boyer at imag.fr>
+ * Written by Brice Boyer (briceboyer) <boyer.brice at gmail.com>
*
*
*
@@ -25,6 +25,8 @@
/** @file matrix/permutation-matrix.h
* @ingroup matrix
+ * @defgroup permutationmatrix
+ *
* A permutation class for operations on permutations, their representations
* and matrix row/column permuting.
*
diff --git a/linbox/matrix/permutation-matrix.inl b/linbox/matrix/permutation-matrix.inl
index 8f5edba..8207d42 100644
--- a/linbox/matrix/permutation-matrix.inl
+++ b/linbox/matrix/permutation-matrix.inl
@@ -1,6 +1,6 @@
/* Copyright (C) 2010 LinBox
- * Written by <brice.boyer at imag.fr>
+ * Written by Brice Boyer (briceboyer) <boyer.brice at gmail.com>
*
*
*
@@ -526,7 +526,7 @@ namespace LinBox
template<class _UnsignedInt>
void MatrixPermutation<_UnsignedInt>::Invert()
{
- Transpose() ;
+ this->Transpose() ;
}
template<class _UnsignedInt>
diff --git a/linbox/matrix/plain-matrix.h b/linbox/matrix/plain-matrix.h
new file mode 100644
index 0000000..80eb23a
--- /dev/null
+++ b/linbox/matrix/plain-matrix.h
@@ -0,0 +1,203 @@
+/* -*- mode: C++; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
+/* linbox/matrix/plain-matrix.h
+ * -bds 2013
+ * See COPYING for license information
+ *
+ * evolved from Dense-submatrix and blas-matrix
+ */
+
+/*! @file matrix/plain-matrix.h
+ * @ingroup matrix
+ * @brief Reference representation of a PlainMatrix (dense, memory allocating) class
+ * and PlainSubmatrix (dense, non-allocating) class.
+ * \c other dense submatrix classes such as LinBox::BlasSubmatrix exihibit this functionality.
+ */
+
+#ifndef __LINBOX_plain_matrix_h
+#define __LINBOX_plain_matrix_h
+
+#include "linbox/util/error.h"
+
+#include "linbox/util/debug.h"
+
+#include "linbox/matrix/matrixdomain/plain-domain.h"
+
+namespace LinBox
+{
+
+ /** @brief to be used in reference matrix domain (PlainDomain).
+
+ * Matrix variable declaration, sizing, entry initialization may involve one to 3 steps.
+ * Matrix ops are container ops. (sizing, copying)
+ *
+ * Mathematical operations are to be found only in an associated matrix domain ).
+ * (exceptions are some use of domain scalars in, eg., zero(), random(), setEntry(), getEntry().
+ *
+ * A Submatrix does not allocate heap memory. It shares (subset of) the memory of a (memory allocating) DenseMatrix.
+ * When a DenseMatrix goes out of scope or is reinitialized with init(), the memory is released
+ * and all Submatrices of it become invalid.
+ *
+ * Allocating:
+ * Given a matrix domain, MatDom MD,
+
+ * MatDom::Matrix A(MD, 2, 3); // allocation of mem for 6 entries at construction
+ * MatDom::Matrix B; B.init(MD, 10, 10); // default constr and subsequent allocation.
+ *
+ * Allocation of memory plus entry initialization:
+ * // a meaningful value of DenseMatrix::Entry x is set by a field.
+ * MatDom::Matrix B(A); // allocation at copy construction. A could be a submatrix of another.
+ * MatDom::Matrix A; A.read(stream); // allocation at read time.
+ * MatDom::Submatrix A(MD, n, m); A.read(stream); // no allocation at read time. Shape must match.
+ *
+ * Nonallocation sizing:
+ * MatDom::Submatrix S,T;
+ * S.submatrix(A, 1, 0, 2, A.coldim()); // S is second 2 rows of A
+ * T.submatrix(S, 0, S.coldim()-2, 2, 2); // T is 2by2 at right end of S, shares mem with S and A.
+ *
+ * Entry initialization (and overwriting) in already sized matrices:
+ * S.setEntry(i, j, x);
+ * S.copy(B); S = B; // A and B must have the same shape.
+ * S.read(stream); // A and matrix in stream must have the same shape.
+
+ * Entry read access. OK on const matrices
+ * S.getEntry(x,i,j), S.write(stream)
+
+ \ingroup matrix
+ */
+ /* defined here:
+ class PlainSubmatrix<Dom>;
+ class PlainMatrix<Dom>: PlainSubmatrix<Dom>;
+ */
+
+ template<class MatDom>
+ class PlainSubmatrix /*: public DenseMatrixInterface<MatDom>*/ {
+ public:
+ typedef PlainSubmatrix<MatDom> Self_t;
+ typedef MatDom MatrixDomain;
+ typedef size_t Index;
+ typedef typename MatrixDomain::Scalar Entry;
+ protected:
+ Entry *rep_; // matrix entries on the heap.
+ const MatrixDomain* domain_; // scalar, vector, matrix arithmetic context
+ Index rows_;
+ Index cols_;
+ Index row_stride_; // stride from row to row. Entries in a row are contiguous.
+ public:
+ Index rowdim() const
+ { return rows_; }
+ Index coldim() const
+ { return cols_; }
+ inline const MatrixDomain& domain() const
+ { return *domain_; }
+ const MatrixDomain& field() const // transitional
+ { return *domain_; }
+
+ Entry& getEntry(Entry& x, Index i, Index j) const
+ { return x = rep_[i*row_stride_ + j]; }
+ void setEntry(Index i, Index j, const Entry& x )
+ { rep_[i*row_stride_ + j] = x; }
+
+ void submatrix(const Self_t & A, Index i, Index j, Index m, Index n)
+ { rep_ = A.rep_ + i*row_stride_ + j;
+ rows_ = m; cols_= n, row_stride_ = A.row_stride_;
+ domain_ = A.domain();
+ }
+
+ Self_t& zero() // set to zeroes, no shape change
+ { for (Index i = 0; i < rowdim(); ++ i)
+ for (Index j = 0; j < coldim(); ++ j)
+ setEntry(i, j, field().zero);
+ }
+ Self_t& identity() // set to I, must be square, no shape change
+ { this->zero();
+ for (Index i = 0; i < rowdim(); ++i)
+ setEntry(i, i, field().one);
+ }
+ Self_t& random() // set to random entries, no shape change
+ { Entry x; field().assign(x,field().zero);
+ typename MatrixDomain::RandIter r(field());
+ for (Index i = 0; i < rowdim(); ++ i)
+ for (Index j = 0; j < coldim(); ++ j)
+ setEntry(i, j, r.random(x));
+ }
+
+ std::istream& read (std::istream &is) // The matrix read must have the same shape.
+ { throw(LinboxError("no PlainSubmatrix read yet")); return is; }
+ std::ostream& write (std::ostream &os) const
+ { throw(LinboxError("no PlainSubmatrix write yet")); return os; }
+
+ PlainSubmatrix() :rep_(0), rows_(0), cols_(0), row_stride_(1)
+ {}
+ PlainSubmatrix(const Self_t& A)
+ { submatrix(A, 0, 0, A.rowdim(), A.coldim()); }
+
+ Self_t& copy(const Self_t& B) // deep copy
+ { linbox_check(rowdim() == B.rowdim() and coldim() == B.coldim());
+ linbox_check(&(domain()) == &(B.domain()));
+ Entry x; domain().assign(x, domain().zero);
+ for (Index i = 0; i < rowdim(); ++ i)
+ for (Index j = 0; j < coldim(); ++ j)
+ setEntry(i, j, B.getEntry(x, i,j));
+ return *this;
+ }
+ Self_t& operator=(const Self_t& B)
+ { return copy(B); }
+
+ // can have trace, rank, det, etc.
+
+ }; // PlainSubmatrix
+
+ template<class Domain_>
+ class PlainMatrix : public PlainSubmatrix<Domain_> {
+ public:
+ typedef PlainMatrix<Domain_> Self_t;
+ typedef PlainSubmatrix<Domain_> Father_t;
+ typedef typename Father_t::MatrixDomain MatrixDomain;
+ typedef typename Father_t::Index Index;
+ typedef typename Father_t::Entry Entry;
+ protected:
+ using Father_t::domain_;
+ using Father_t::rep_;
+ using Father_t::rows_;
+ using Father_t::cols_;
+ using Father_t::row_stride_;
+ public:
+ PlainMatrix()
+ : Father_t() {}
+ //~PlainMatrix()
+ //{} // default dstor works
+ PlainMatrix(const MatrixDomain& D, Index m, Index n)
+ : Father_t() { init(D, m, n); }
+ PlainMatrix(const PlainMatrix& A) // deep copy
+ : Father_t() { init(A.domain(), A.rowdim(), A.coldim()); this->copy(A); }
+
+ void init(const MatrixDomain& D, Index m, Index n)
+ { domain_ = &D;
+ if (rows_*cols_ != m*n) // must replace current mem.
+ { if (rep_) delete(rep_);
+ rep_ = new(Entry[m*n]);
+ }
+ rows_ = m; cols_ = n; row_stride_ = 1;
+ }
+ PlainMatrix& operator=(const PlainMatrix& A) // deep copy, reallocate if necessary
+ { init(A.domain(), A.rowdim(), A.coldim()); copy(A); }
+
+ std::istream& read (std::istream &is) // Will be reshaped to match the matrix read.
+ { throw(LinboxError("no PlainMatrix read yet")); return is; }
+
+ using Father_t::rowdim;
+ using Father_t::coldim;
+ using Father_t::field;
+ using Father_t::domain;
+
+ using Father_t::getEntry;
+ using Father_t::setEntry;
+ using Father_t::submatrix;
+ using Father_t::zero;
+ using Father_t::random;
+ using Father_t::write;
+ using Father_t::copy;
+ }; //PlainMatrix
+} //LinBox
+#endif //__LINBOX_plain_matrix_h
diff --git a/linbox/matrix/polynomial-matrix.h b/linbox/matrix/polynomial-matrix.h
new file mode 100755
index 0000000..afe31cc
--- /dev/null
+++ b/linbox/matrix/polynomial-matrix.h
@@ -0,0 +1,687 @@
+/* -*- mode: C++; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
+/*
+ * Copyright (C) 2013 Pascal Giorgi
+ * Romain Lebreton
+ *
+ * Written by Pascal Giorgi <pascal.giorgi at lirmm.fr>
+ * Romain Lebreton <lebreton at lirmm.fr>
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ * ========LICENCE========
+ */
+#ifndef __LINBOX_polynomial_matrix_H
+#define __LINBOX_polynomial_matrix_H
+#include <vector>
+#include "linbox/vector/subvector.h"
+#include "linbox/matrix/dense-matrix.h"
+#include "linbox/field/hom.h"
+#include "fflas-ffpack/utils/align-allocator.h"
+#include "givaro/modular.h"
+#include <algorithm>
+
+
+#define COPY_BLOCKSIZE 32
+
+namespace LinBox{
+
+ enum PMType {polfirst, matfirst};
+ enum PMStorage {plain, view, const_view};
+
+ // Generic handler class for Polynomial Matrix
+ template<size_t type, size_t storage, class Field>
+ class PolynomialMatrix;
+
+ // Class for Polynomial Matrix stored as a Matrix of Polynomials
+ template<class _Field>
+ class PolynomialMatrix<PMType::polfirst,PMStorage::plain,_Field> {
+ public:
+ typedef _Field Field;
+ typedef typename Field::Element Element;
+ typedef BlasMatrix<Field> Matrix;
+ //typedef typename std::vector<Element>::iterator Iterator;
+ //typedef typename std::vector<Element>::const_iterator ConstIterator;
+ typedef std::vector<Element,AlignedAllocator<Element, Alignment::DEFAULT>> VECT;
+ typedef typename VECT::iterator Iterator;
+ typedef typename VECT::const_iterator ConstIterator;
+ //typedef vector<Element> Polynomial;
+ typedef Subvector<Iterator,ConstIterator> Polynomial;
+ typedef PolynomialMatrix<PMType::polfirst,PMStorage::plain,_Field> Self_t;
+ typedef PolynomialMatrix<PMType::matfirst,PMStorage::plain,_Field> Other_t;
+
+ //PolynomialMatrix() {}
+
+ // construct a polynomial matrix in f[x]^(m x n) of degree (s-1)
+ PolynomialMatrix(const Field& f, size_t r, size_t c, size_t s, size_t stor=0) :
+ _store((stor?stor:s)), _repview(r*c),_rep(r*c*_store,f.zero), _row(r), _col(c), _size(s), _fld(&f) {
+ for (size_t i=0;i<_row;i++)
+ for (size_t j=0;j<_col;j++)
+ _repview[i*_col+j]= Polynomial(_rep.begin()+(i*_col+j)*_store,_size);
+ //integer p;
+ //std::cout<<"MatrixP allocating : "<<r*c*s*length(f.characteristic(p))/1000000.<<"Mo"<<std::endl;
+ }
+
+ ~PolynomialMatrix(){
+ //integer p;
+ //std::cout<<"MatrixP Desallocating : "<<_row*_col*_store*length(_fld->characteristic(p))/1000000.<<"Mo"<<std::endl;
+
+ }
+
+ void clear(){
+ _rep.resize(0);
+ }
+
+ // set the matrix A to the matrix of degree k in the polynomial matrix
+ void setMatrix(Matrix& A, size_t k) const {
+ typename Matrix::Iterator it=A.Begin();
+ for(size_t i=0;i<_row*_col;i++,it++)
+ *it = get(i,k);
+ }
+ // retrieve the matrix of degree k in the polynomial matrix
+ Matrix operator[](size_t k)const {
+ Matrix A(field(), _row, _col);
+ setMatrix(A,k);
+ return A;
+ }
+ // retrieve the polynomial at entry (i,j) in the matrix
+ inline Polynomial& operator()(size_t i, size_t j) {return operator()(i*_col+j);}
+ inline const Polynomial& operator()(size_t i, size_t j)const {return operator()(i*_col+j);}
+ // retrieve the polynomial at the position i in the storage of the matrix
+ inline Polynomial& operator()(size_t i) {return _repview[i];}
+ inline const Polynomial& operator()(size_t i)const {return _repview[i];}
+
+ // resize the polynomial length of the polynomial matrix
+ void resize(size_t s){
+ if (s>_store){
+ _rep.resize(s*_row*_col);
+ size_t k=s*_row*_col-1;
+ for(size_t i=0;i<_row*_col;i++){
+ size_t j=s;
+ for(;j>=_size;j--,k--)
+ _rep[k]=_fld->zero;
+ for(;j>size_t(-1);j--,k--)
+ _rep[k]=_rep[i*_store+j];
+ }
+ }
+ else {
+ size_t k=0;
+ for(size_t i=0;i<_row*_col;i++)
+ for (size_t j=0;j<s;j++,k++)
+ _rep[k]=_rep[i*_store+j];
+ _rep.resize(s*_row*_col);
+ }
+ _store=s;
+ setsize(s);
+ }
+
+ void changesize(size_t s){
+ if (s <=_store){
+ for (size_t i=0;i<_row*_col;i++)
+ _repview[i]= Polynomial(_rep.begin()+i*_store,s);
+ _size=s;
+ }
+ else {
+ std::cerr<<"ERROR: in PolynomialMatrix<polfirs> -> setsize with too large size"<<std::endl;
+ throw LinboxError("LinBox ERROR: PolynomialMatrix setsize \n");
+ }
+
+ }
+ void setsize(size_t s){
+ if (s <=_store){
+ for(size_t i=0;i<_row*_col;i++){
+ for(size_t j=_size ;j<s;j++)
+ _rep[i*_store+j]=_fld->zero;
+ }
+ for (size_t i=0;i<_row*_col;i++)
+ _repview[i]= Polynomial(_rep.begin()+i*_store,s);
+ _size=s;
+ }
+ else {
+ std::cerr<<"ERROR: in PolynomialMatrix<polfirs> -> setsize with too large size"<<std::endl;
+ throw LinboxError("LinBox ERROR: PolynomialMatrix setsize \n");
+ }
+ }
+
+
+ // copy elt from M[beg..end], _size must be >= j-i
+ void copy(const Self_t& M, size_t beg, size_t end){
+ //cout<<"copying.....polfirst to polfirst.....same field"<<endl;
+ for (size_t k=0;k<_row*_col;k++){
+ size_t j=0;
+ for (size_t i=beg;i<=end;i++){
+ ref(k,j)=M.get(k,i);
+ j++;
+ }
+ }
+ }
+ template<typename OtherField>
+ void copy(const PolynomialMatrix<PMType::polfirst,PMStorage::plain,OtherField> & M, size_t beg, size_t end){
+ //cout<<"copying.....polfirst to polfirst.....other field"<<endl;
+ Hom<OtherField,Field> hom(M.field(),field()) ;
+ for (size_t k=0;k<_row*_col;k++){
+ size_t j=0;
+ for (size_t i=beg;i<=end;i++,j++){
+ hom.image(ref(k,j),M.get(k,i));
+ }
+ }
+ }
+
+ // copy elt from M[beg..end], _size must be >= end-beg+1
+ // M is stored as a Polynomial of Matrices
+ template <size_t storage>
+ void copy(const PolynomialMatrix<PMType::matfirst,storage,Field>& M, size_t beg, size_t end){
+ //std::cout<<"copying.....matfirst to polfirst.....same field"<<std::endl;
+ const size_t ls = COPY_BLOCKSIZE;
+ for (size_t i = beg; i <= end; i+=ls)
+ for (size_t j = 0; j < _col * _row; j+=ls)
+ // Rk: the two loop must be interchanged in some cases
+ for (size_t _i = i; _i < std::min(end+1, i + ls); _i++)
+ for (size_t _j = j; _j < std::min(_col * _row, j + ls);++_j)
+ ref(_j,_i-beg)= M.get(_j,_i);
+ }
+
+ // copy elt from M[beg..end], _size must be >= end-beg+1
+ // M is stored as a Polynomial of Matrices with a different field
+ template<size_t storage, typename OtherField>
+ void copy(const PolynomialMatrix<PMType::matfirst,storage,OtherField> & M, size_t beg, size_t end){
+ //std::cout<<"copying.....matfirst to polfirst.....other field"<<std::endl;
+ const size_t ls = COPY_BLOCKSIZE;
+ Hom<OtherField,Field> hom(M.field(),field()) ;
+ for (size_t i = beg; i <= end; i+=ls)
+ for (size_t j = 0; j < _col * _row; j+=ls)
+ for (size_t _i = i; _i < std::min(end+1, i + ls); _i++) {
+ for (size_t _j = j; _j < std::min(_col * _row, j + ls);++_j)
+ hom.image(ref(_j,_i-beg),M.get(_j,_i) );
+ }
+ }
+
+ template<typename Mat>
+ void copy(const Mat& M){
+ linbox_check (M.size()==_size && M.rowdim()== _row && M.coldim()== _col);
+ copy(M,0,M.size()-1);
+ }
+
+ // rebind functor to change base field (e.g. apply modulo reduction)
+ template<typename _Tp1>
+ struct rebind {
+ typedef PolynomialMatrix<PMType::polfirst,PMStorage::plain, Field> Self_t;
+ typedef PolynomialMatrix<PMType::polfirst,PMStorage::plain, _Tp1> Other_t;
+
+ void operator() (Other_t& Ap,
+ const Self_t& A){
+ Hom<Field, _Tp1> hom(A.field(), Ap.field()) ;
+ for (size_t i = 0; i < A._row * A._col; i++)
+ for (size_t j = 0; j < A._size; j++)
+ hom.image (Ap.ref(i,j), A.get(i,j));
+ }
+ };
+
+ // get access to the the k-th coeff of the ith matrix entry
+ inline Element& ref(size_t i, size_t k){
+ return _rep[i*_store+k];
+ }
+ inline Element& ref(size_t i, size_t j, size_t k){
+ return ref(i*_col+j,k);
+ }
+ inline Element get(size_t i, size_t k)const {
+ return _rep[i*_store+k];
+ }
+ inline Element get(size_t i, size_t j, size_t k) const{
+ return get(i*_col+j,k);
+ }
+
+ size_t rowdim() const {return _row;}
+ size_t coldim() const {return _col;}
+ size_t degree() const {return _size-1;}
+ size_t size() const {return _size;}
+ size_t storage() const {return _store;}
+ const Field& field() const {return *_fld;}
+
+ std::ostream& write(std::ostream& os) const { return write(os,0,_size-1);}
+
+ std::ostream& write(std::ostream& os, size_t deg_min, size_t deg_max) const {
+ integer c;
+ int wid=-1,b;
+ field().cardinality (c);
+
+ if (c >0){
+ wid = (int) ceil (log ((double) c) / M_LN10);
+ b= ((int) ceil (log ((double) _size) / M_LN10));
+ wid*=10*(b*(b-1)/2.);
+ }
+ std::cout<<"Matrix([";
+ for (size_t i = 0; i< _row;++i) {
+ os << " [ ";
+ for (size_t j = 0;j<_col;++j){
+ os.width (wid);
+ field().write(os,get(i,j,deg_min));
+ for (size_t k=deg_min+1;k<deg_max;++k){
+ os<<"+";
+ field().write(os,get(i,j,k))<<"*x^"<<k-deg_min;
+ }
+ if (deg_max-deg_min>0){
+ os<<"+";
+ field().write(os,get(i,j,deg_max))<<"*x^"<<deg_max-deg_min;
+ }
+ os<<(j<_col-1?",":"" );
+ }
+ os << (i<_row-1?"],":"]" )<< std::endl;
+ }
+ std::cout<<"]);";
+
+ return os;
+ }
+
+ Element* getWritePointer(){return &_rep[0];}
+ const Element* getPointer() const {return &_rep[0];}
+
+ size_t realmeminfo()const { return _rep.capacity()*sizeof(Element)+_repview.capacity()*sizeof(Polynomial);}
+ size_t meminfo()const { return _rep.size()*sizeof(Element);}
+
+ void changeField(const Field& F){_fld=&F;}
+
+ private:
+ size_t _store;
+ std::vector<Polynomial> _repview;
+ //std::vector<Element> _rep;
+ VECT _rep;
+ size_t _row;
+ size_t _col;
+ size_t _size;
+ const Field* _fld;
+ };
+
+ // Class for Polynomial Matrix stored as a Polynomial of Matrices
+ template<class _Field>
+ class PolynomialMatrix<PMType::matfirst,PMStorage::plain,_Field> {
+ public:
+ typedef _Field Field;
+ typedef typename Field::Element Element;
+ typedef BlasMatrix<Field> Matrix;
+ typedef std::vector<Element> Polynomial;
+ typedef PolynomialMatrix<PMType::matfirst,PMStorage::plain,_Field> Self_t;
+ typedef PolynomialMatrix<PMType::polfirst,PMStorage::plain,_Field> Other_t;
+
+ typedef Matrix value_type;
+
+ PolynomialMatrix() {}
+
+ PolynomialMatrix(const Field& f, size_t r, size_t c, size_t s) :
+ _rep(s,Matrix(f)), _row(r), _col(c), _size(s), _fld(&f) {
+ //_row(r), _col(c), _size(s), _fld(&f) {
+ for(size_t i=0;i<s;i++)
+ _rep[i].init(f,r,c);
+ //integer p;
+ //std::cout<<"PMatrix allocating : "<<r*c*s*length(f.characteristic(p))/1000000.<<"Mo"<<std::endl;
+ }
+
+ ~PolynomialMatrix(){
+ //integer p;
+ //std::cout<<"PMatrix Desallocating : "<<_row*_col*_size*length(_fld->characteristic(p))/1000000.<<"Mo"<<std::endl;
+ }
+
+ void clear(){
+ _rep.resize(0,Matrix(*_fld));
+ }
+
+
+ // retrieve the matrix of degree k in the polynomial matrix
+ inline Matrix& operator[](size_t k) {return _rep[k];}
+ inline const Matrix& operator[](size_t k)const {return _rep[k];}
+
+ // retrieve the polynomial at entry (i,j) in the matrix
+ inline Polynomial operator()(size_t i, size_t j) const {
+ Polynomial A(_size);
+ for(size_t k=0;k<_size;k++)
+ A[k]=_rep[k].getEntry(i,j);
+ return A;
+ }
+ // retrieve the polynomial at psotion (i) in the storage of the matrix
+ inline Polynomial operator()(size_t i) const {
+ Polynomial A(_size);
+ for(size_t k=0;k<_size;k++)
+ A[k]=*(_rep[k].Begin()+i);
+ return A;
+ }
+
+ // resize the polynomial length of the polynomial matrix
+ void resize(size_t s){
+ _rep.resize(s,Matrix(*_fld));
+ if (s>_size){
+ for(size_t i=_size;i<s;i++)
+ _rep[i].init(field(),_row,_col);
+ }
+ _size=s;
+ }
+
+ void setsize(size_t s){resize(s);}
+
+ // copy elt from M[beg..end], _size must be >= j-i
+ template <size_t storage>
+ void copy(const PolynomialMatrix<PMType::matfirst,storage,Field>& M, size_t beg, size_t end, size_t start=0){
+ //cout<<"copying.....matfirst to matfirst.....same field"<<endl;
+ for (size_t i=beg;i<=end;i++)
+ _rep[start+i-beg]=M[i];
+
+ }
+
+ template<size_t storage, typename OtherField>
+ void copy(const PolynomialMatrix<PMType::matfirst,storage,OtherField> & M, size_t beg, size_t end, size_t start=0){
+ //cout<<"copying.....matfirst to matfirst.....other field"<<endl;
+ Hom<OtherField,Field> hom(M.field(),field()) ;
+ for (size_t i=beg;i<=end;i++)
+ for (size_t j=0;j<_row*_col;j++)
+ hom.image(ref(j,start+i-beg) , M.get(j,i));
+ }
+
+ // copy elt from M[beg..end], _size must be >= end-beg+1
+ // M is stored as a Matrix of Polynomials
+ void copy(const Other_t& M, size_t beg, size_t end, size_t start=0){
+ //cout<<"copying.....polfirst to matfirst.....same field"<<endl;
+ const size_t ls = COPY_BLOCKSIZE; // Loop unrooling to be more cache-friendly (cache block transposition)
+ for(size_t i = beg; i < end+1; i+=ls)
+ for (size_t j = 0; j < _col * _row; j+=ls)
+ for (size_t _i = i; _i < std::min(end+1, i + ls); _i++) {
+ for (size_t _j = j; _j < std::min(_col * _row, j + ls); _j++)
+ ref(_j,start+_i-beg) = M.get(_j,_i);
+ }
+ }
+
+ // copy elt from M[beg..end], _size must be >= end-beg+1
+ // M is stored as a Matrix of Polynomials with a different field
+ template<typename OtherField>
+ void copy(const PolynomialMatrix<PMType::polfirst,PMStorage::plain,OtherField> & M, size_t beg, size_t end, size_t start=0){
+ //cout<<"copying.....polfirst to matfirst.....other field"<<endl;
+ const size_t ls = COPY_BLOCKSIZE;
+ Hom<OtherField,Field> hom(M.field(),field()) ;
+ for(size_t i = beg; i < end+1; i+=ls)
+ for (size_t j = 0; j < _col * _row; j+=ls)
+ for (size_t _i = i; _i < std::min(end+1, i + ls); _i++) {
+ for (size_t _j = j; _j < std::min(_col * _row, j + ls); _j++)
+ hom.image(ref(_j,start+_i-beg) , M.get(_j,_i));
+ }
+ }
+
+ template<typename Mat>
+ void copy(const Mat& M){
+ linbox_check (M.size()==_size && M.rowdim()== _row && M.coldim()== _col);
+ copy(M,0,M.size()-1);
+ }
+
+ // rebind functor to change base field (e.g. apply modulo reduction)
+ template<typename _Tp1>
+ struct rebind {
+ typedef PolynomialMatrix<PMType::matfirst, PMStorage::plain,Field> Self_t;
+ typedef PolynomialMatrix<PMType::matfirst, PMStorage::plain,_Tp1> Other_t;
+
+ template<size_t storage>
+ void operator() (PolynomialMatrix<PMType::matfirst, storage,_Tp1>& Ap,
+ const PolynomialMatrix<PMType::matfirst, storage,Field>& A){
+ Hom<Field, _Tp1> hom(A.field(), Ap.field()) ;
+ for (size_t j = 0; j < A._size; j++)
+ for (size_t i = 0; i < A._row * A._col; i++)
+ hom.image (Ap.ref(i,j), A.get(i,j));
+ }
+ };
+
+ typedef PolynomialMatrix<PMType::matfirst,PMStorage::plain,Field> plain;
+ typedef PolynomialMatrix<PMType::matfirst,PMStorage::view,Field> view;
+ typedef PolynomialMatrix<PMType::matfirst,PMStorage::const_view,Field> const_view;
+
+ inline view at(size_t i, size_t j) {return view(*this,i,j);}
+ inline const_view at(size_t i, size_t j)const {return const_view(*this,i,j);}
+
+
+ // get access to the the k-th coeff of the ith matrix entry
+ inline Element& ref(size_t i, size_t k){
+ return _rep[k].refRep()[i];
+ //return *(_rep[k].Begin()+i);
+ }
+ inline Element& ref(size_t i, size_t j, size_t k){
+ return ref(i*_col+j,k);
+ }
+ inline Element get(size_t i, size_t k)const {
+ return *(_rep[k].Begin()+i);
+ }
+ inline Element get(size_t i, size_t j, size_t k) const{
+ return get(i*_col+j,k);
+ }
+
+ inline size_t rowdim() const {return _row;}
+ inline size_t coldim() const {return _col;}
+ inline size_t degree() const {return _size-1;}
+ inline size_t real_degree() const {
+ MatrixDomain<Field> MD(field());
+ size_t d= _size-1;
+ while(d>0 && MD.isZero(_rep[d])) d--;
+ return d;
+ }
+ inline size_t size() const {return _size;}
+ inline size_t storage()const {return _size;}
+
+ inline const Field& field() const {return *_fld;}
+
+ std::ostream& write(std::ostream& os) const { return write(os,0,real_degree());}
+
+ std::ostream& write(std::ostream& os, size_t deg_min, size_t deg_max) const {
+ integer c;
+ int wid,b;
+ field().cardinality (c);
+
+ if (c >0)
+ wid = (int) ceil (log ((double) c) / M_LN10);
+ else
+ wid=(int) ceil (log ((double) _rep[0].getEntry(0,0)) / M_LN10);
+
+ b= ((int) ceil (log ((double) (deg_max-deg_min+1)) / M_LN10));
+ wid*=10*(b*(b-1)/2.);
+ std::cout<<"Matrix([";
+ for (size_t i = 0; i< _row;++i) {
+ os << " [ ";
+ for (size_t j = 0;j<_col;++j){
+ os.width (wid);
+ field().write(os,_rep[deg_min].getEntry(i,j));
+ for (size_t k=deg_min+1;k<deg_max;++k){
+ os<<"+";
+ field().write(os,_rep[k].getEntry(i,j))<<"*x^"<<k-deg_min;
+ }
+ if (deg_max-deg_min>0){
+ os<<"+";
+ field().write(os,_rep[deg_max].getEntry(i,j))<<"*x^"<<deg_max-deg_min;
+ }
+ os<<(j<_col-1?",":"" );
+ }
+ os << (i<_row-1?"],":"]" )<< std::endl;
+ }
+ std::cout<<"]);";
+ return os;
+ }
+
+ // NEED FOR YUHASZ
+ typedef typename std::vector<Matrix>::const_iterator const_iterator;
+ const_iterator begin() const {return _rep.begin();}
+
+ private:
+ std::vector<Matrix> _rep;
+ size_t _row;
+ size_t _col;
+ size_t _size;
+ const Field* _fld;
+ };
+
+ template<typename _Field, size_t T, size_t S>
+ std::ostream& operator<<(std::ostream& os, const PolynomialMatrix<T,S,_Field>& P) {
+ return P.write(os);
+ }
+
+ // Class to handle the view of a Polynomial Matrix according to some degree range
+ // the view is read/write
+ template<class _Field>
+ class PolynomialMatrix<PMType::matfirst,PMStorage::view,_Field> {
+ public:
+ typedef _Field Field;
+ typedef typename Field::Element Element;
+ typedef BlasMatrix<Field> Matrix;
+ typedef std::vector<Element> Polynomial;
+
+ PolynomialMatrix() {}
+
+ // constructor of a view between i and j from a plain Polynomial Matrix
+ PolynomialMatrix(PolynomialMatrix<PMType::matfirst,PMStorage::plain,Field>& M, size_t i,size_t j)
+ : _ptr(&M), _size(j-i+1), _shift(i)
+ {//cout<<i<<"-"<<j<<" -> "<<M.size()<<endl;
+ linbox_check(i<M.size() && i<=j && j< M.size());}
+
+ // constructor of a view between i and j from a view Polynomial Matrix
+ PolynomialMatrix(PolynomialMatrix<PMType::matfirst,PMStorage::view,Field>& M, size_t i,size_t j)
+ : _ptr(M._ptr), _size(j-i+1), _shift(i+M._shift)
+ {//cout<<i<<"-"<<j<<" -> "<<M.size()<<endl;
+ linbox_check(i<M.size() && i<=j && j< M.size());}
+
+
+ // retrieve the matrix of degree k in the polynomial matrix
+ inline Matrix& operator[](size_t k) {return (*_ptr)[k+_shift];}
+ inline const Matrix& operator[](size_t k)const {return (*_ptr)[k+_shift];}
+
+ // retrieve the polynomial at entry (i,j) in the matrix
+ Polynomial operator()(size_t i, size_t j){
+ Polynomial A(_size, Matrix(_ptr->field()));
+ for(size_t k=0;k<_size;k++)
+ A[k]=(*_ptr)[k+_shift].refEntry(i,j);
+ return A;
+ }
+
+ // get access to the the k-th coeff of the ith matrix entry
+ inline Element& ref(size_t i, size_t k){
+ return _ptr->ref(i,k+_shift);
+ }
+ inline Element& ref(size_t i, size_t j, size_t k){
+ return ref(i*coldim()+j,k);
+ }
+ inline Element get(size_t i, size_t k)const {
+ return _ptr->get(i,k+_shift);
+ }
+ inline Element get(size_t i, size_t j, size_t k) const{
+ return get(i*coldim()+j,k);
+ }
+
+ inline size_t rowdim() const {return _ptr->rowdim();}
+ inline size_t coldim() const {return _ptr->coldim();}
+ inline size_t degree() const {return _size-1;}
+ inline size_t size() const {return _size;}
+ inline const Field& field() const {return _ptr->field();}
+
+ typedef PolynomialMatrix<PMType::matfirst,PMStorage::plain,Field> plain;
+ typedef PolynomialMatrix<PMType::matfirst,PMStorage::view,Field> view;
+ typedef PolynomialMatrix<PMType::matfirst,PMStorage::const_view,Field> const_view;
+
+ template<typename Mat>
+ void copy(const Mat& M){
+ this->copy(M,0,M.size()-1);
+ }
+
+ template<typename Mat>
+ void copy(const Mat& M, size_t beg, size_t end){_ptr->copy(M,beg,end,_shift);}
+
+
+ inline view at(size_t i, size_t j) {return view(*this,i,j);}
+ inline const_view at(size_t i, size_t j)const {return const_view(*this,i,j);}
+
+ std::ostream& write(std::ostream& os) const { return _ptr->write(os,_shift,_shift+_size-1);}
+
+ friend class PolynomialMatrix<PMType::matfirst,PMStorage::const_view,Field>;
+
+ private:
+ PolynomialMatrix<PMType::matfirst,PMStorage::plain,Field>* _ptr;
+ size_t _size;
+ size_t _shift;
+ };
+
+ // Class to handle the view of a Polynomial Matrix according to some degree range
+ // the view is read only
+ template<class _Field>
+ class PolynomialMatrix<PMType::matfirst,PMStorage::const_view,_Field> {
+ public:
+ typedef _Field Field;
+ typedef typename Field::Element Element;
+ typedef BlasMatrix<Field> Matrix;
+ typedef std::vector<Element> Polynomial;
+
+ PolynomialMatrix() {}
+
+ // constructor of a view between i and j from a plain Polynomial Matrix
+ PolynomialMatrix(const PolynomialMatrix<PMType::matfirst,PMStorage::plain,Field>& M, size_t i,size_t j)
+ : _ptr(&M), _size(j-i+1), _shift(i)
+ {linbox_check(i<M.size() && i<=j && j< M.size());}
+
+ // constructor of a view between i and j from a view Polynomial Matrix
+ PolynomialMatrix(const PolynomialMatrix<PMType::matfirst,PMStorage::view,Field>& M, size_t i,size_t j)
+ : _ptr(M._ptr), _size(j-i+1), _shift(i+M._shift)
+ {linbox_check(i<M.size() && i<=j && j< M.size());}
+
+
+ // constructor of a view between i and j from a view Polynomial Matrix
+ PolynomialMatrix(const PolynomialMatrix<PMType::matfirst,PMStorage::const_view,Field>& M, size_t i,size_t j)
+ : _ptr(M._ptr), _size(j-i+1), _shift(i+M._shift)
+ {//cout<<"("<<i<<","<<j<<") -> "<<M.size()<<endl;
+ linbox_check(i<M.size()&& i<=j && j<= M.size());}
+
+
+ // retrieve the matrix of degree k in the polynomial matrix
+ inline const Matrix& operator[](size_t k)const {return (*_ptr)[k+_shift];}
+
+ // retrieve the polynomial at entry (i,j) in the matrix
+ inline Polynomial operator()(size_t i, size_t j){
+ Polynomial A(_size, Matrix(_ptr->field()));
+ for(size_t k=0;k<_size;k++)
+ A[k]=(*_ptr)[k+_shift].refEntry(i,j);
+ return A;
+ }
+
+ inline Element get(size_t i, size_t k) const {
+ return _ptr->get(i,k+_shift);
+ }
+ inline Element get(size_t i, size_t j, size_t k) const{
+ return get(i*coldim()+j,k);
+ }
+
+
+ inline size_t rowdim() const {return _ptr->rowdim();}
+ inline size_t coldim() const {return _ptr->coldim();}
+ inline size_t degree() const {return _size-1;}
+ inline size_t size() const {return _size;}
+ inline const Field& field() const {return _ptr->field();}
+
+ typedef PolynomialMatrix<PMType::matfirst,PMStorage::plain,Field> plain;
+ typedef PolynomialMatrix<PMType::matfirst,PMStorage::const_view,Field> const_view;
+
+ inline const_view at(size_t i, size_t j)const {return const_view(*this,i,j);}
+ std::ostream& write(std::ostream& os) const { return _ptr->write(os,_shift,_shift+_size-1);}
+
+ private:
+ const PolynomialMatrix<PMType::matfirst,PMStorage::plain,Field>* _ptr;
+ size_t _size;
+ size_t _shift;
+ };
+
+
+
+
+
+} //end of namespace LinBox
+
+#endif // __LINBOX_polynomial_matrix_H
diff --git a/linbox/matrix/random-matrix.h b/linbox/matrix/random-matrix.h
index eb8650c..7153993 100644
--- a/linbox/matrix/random-matrix.h
+++ b/linbox/matrix/random-matrix.h
@@ -1,5 +1,5 @@
/* Copyright (C) 2010 LinBox
- * Written by Brice Boyer <brice.boyer at imag.fr>
+ * Written by Brice Boyer (briceboyer) <boyer.brice at gmail.com>
*
*
*
@@ -22,6 +22,9 @@
* ========LICENCE========
*/
+#ifndef __LINBOX_matrix_random_matrix_H
+#define __LINBOX_matrix_random_matrix_H
+
/** @file matrix/random-matrix.h
* @ingroup matrix
* @brief Implementation of random matrices.
@@ -31,19 +34,21 @@
* and make it easier to write tests/ examples/.
*
* @todo à la vector/stream.h
+ * @bug this belongs to algorithms...
*/
-#include "linbox/matrix/blas-matrix.h"
-#include "linbox/randiter/random-integer.h"
+#include "linbox/matrix/dense-matrix.h"
#include "linbox/randiter/random-prime.h"
#include "linbox/matrix/permutation-matrix.h"
-#include "linbox/algorithms/blas-domain.h"
+#include "linbox/matrix/matrix-domain.h"
#include "linbox/algorithms/cra-domain.h"
#include "linbox/algorithms/cra-full-multip-fixed.h"
+#include "linbox/solutions/rank.h"
namespace LinBox
{
+ template<class Field> class BlasMatrixDomain ;
// non dependant struct -> out of class.
struct RankBuildMethod {
@@ -102,6 +107,12 @@ namespace LinBox
template<class Matrix>
Matrix & random(Matrix & A) ;
+ /*! Create a random matrix with rank=min(rowdim,coldim)
+ * @param A
+ */
+ template<class Matrix>
+ Matrix& randomFullRank(Matrix& A);
+
/*! provide a matrix with prescribed rank.
* Default method.
* @param A
@@ -144,10 +155,11 @@ namespace LinBox
/// @todo To be factorized.
void RandomBlasPermutation(BlasPermutation<size_t> & P) ;
-}
+} // LinBox
#include "linbox/matrix/random-matrix.inl"
+#endif // __LINBOX_matrix_random_matrix_H
// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
// Local Variables:
diff --git a/linbox/matrix/random-matrix.inl b/linbox/matrix/random-matrix.inl
index 0760044..760e10c 100644
--- a/linbox/matrix/random-matrix.inl
+++ b/linbox/matrix/random-matrix.inl
@@ -1,5 +1,5 @@
/* Copyright (C) 2011 LinBox
- * Written by Brice Boyer <brice.boyer at imag.fr>
+ * Written by Brice Boyer (briceboyer) <boyer.brice at gmail.com>
*
*
*
@@ -53,27 +53,24 @@ namespace LinBox
rank = (int) ( (double)std::min(m,n)*drand48() );
linbox_check(!(rank<0 || rank>(int)std::min(m,n)));
- typedef typename Field::Element Element ;
+ // typedef typename Field::Element Element ;
// be ready for PLUQ
//size_t * P = new size_t [m] ;
BlasPermutation<size_t> P(m);
//Element * L = new Element[m*m] ;
- //TriangularBlasMatrix<Element> L(m,m,LinBoxTag::Lower,LinBoxTag::Unit);
+ //TriangularBlasMatrix<Field> L(F,m,m,Tag::Lower,Tag::Unit);
//! @todo !!!
BlasMatrix<Field> L(F,m,m);
// Element * U = new Element[m*n] ;
- // TriangularBlasMatrix<Element> U(m,n,LinBoxTag::Upper,LinBoxTag::NonUnit);
+ // TriangularBlasMatrix<Field> U(F,m,n,Tag::Upper,Tag::NonUnit);
//
BlasMatrix<Field> U(F,m,n);
//size_t * Q = new size_t [n] ;
BlasPermutation<size_t> Q(n);
// be ready for random elements
- NonzeroRandIter<Field> Rnz(F,R);
- Element one,zero;
- F.init(one,1UL);
- F.init(zero,0UL);
+ Givaro::GeneralRingNonZeroRandIter<Field> Rnz(R);
/* Create L a random invertible lower unit triangular matrix (m x m format) */
for (size_t j=0 ; j<m ; ++j)
@@ -84,7 +81,7 @@ namespace LinBox
Rnz.random( L.refEntry( i,i ) ); // non zero diagonal
for (size_t j=0 ; j<m ; ++j)
for (size_t i=0; i<j;++i)
- L.setEntry( i,j,zero );
+ L.setEntry( i,j,F.zero );
#endif
@@ -96,9 +93,9 @@ namespace LinBox
for (size_t i = 0; i < (size_t) rank; ++i)
Rnz.random( U.refEntry( i,i ) ); // non zero diagonal on rank first lines
#if 1
- for (size_t i = rank ; i < m ; ++i)
+ for (size_t i = (size_t)rank ; i < m ; ++i)
for (size_t j = i ; j < n ; ++j)
- U.setEntry( i,j,zero ) ; // zero on remaining 'triangular' lines
+ U.setEntry( i,j,F.zero ) ; // zero on remaining 'triangular' lines
#endif
/**
@@ -119,7 +116,7 @@ namespace LinBox
BMD.mul(A,L,U);
/*!
- * @todo create BMD.applyP(A,P,LinBoxTag::Left) ;
+ * @todo create BMD.applyP(A,P,Tag::Left) ;
* avec P : BlasPermutation
* ou P : MatrixPermutation
* @todo BlasPermutation a un ordre \p p et une taille \p r distinctes !!!
@@ -143,7 +140,7 @@ namespace LinBox
const RingCategories::IntegerTag & tag)
{
- typedef typename Ring::Element Int ;
+ // typedef typename Ring::Element Int ;
size_t m = A.rowdim() ;
size_t n = A.coldim() ;
@@ -163,10 +160,9 @@ namespace LinBox
// be ready for random elements
Randiter S_(R);
S_.setBits(R.getBits()-1);
- RandomIntegerIter<false> T_(3);
- NonzeroRandIter<Ring,RandomIntegerIter<false> > U_(ZZ,T_);
+ typename Ring::Randiter T_(ZZ,3);
+ Givaro::GeneralRingNonZeroRandIter<Ring > U_(T_);
- Int one(1),zero(0);
/* Create L a random invertible lower unit triangular matrix (m x m format) */
for (size_t j=0 ; j<m ; ++j)
@@ -177,7 +173,7 @@ namespace LinBox
U_.random( L.refEntry( i,i ) ); // non zero diagonal
for (size_t j=0 ; j<m ; ++j)
for (size_t i=0; i<j;++i)
- L.setEntry( i,j,zero );
+ L.setEntry( i,j,ZZ.zero );
#endif
@@ -189,9 +185,9 @@ namespace LinBox
for (size_t i = 0; i < (size_t) rank; ++i)
U_.random( U.refEntry( i,i ) ); // non zero diagonal on rank first lines
#if 1
- for (size_t i = rank ; i < m ; ++i)
+ for (size_t i = (size_t)rank ; i < m ; ++i)
for (size_t j = i ; j < n ; ++j)
- U.setEntry( i,j,zero ) ; // zero on remaining 'triangular' lines
+ U.setEntry( i,j,ZZ.zero ) ; // zero on remaining 'triangular' lines
#endif
RandomBlasPermutation(P);
@@ -203,9 +199,6 @@ namespace LinBox
// L.write(std::cout << "L:=",true ) << ';' << std::endl;
// L.write(std::cout << "U:=",true ) << ';' << std::endl;
- typedef typename Ring::Element Element;
- // BlasMatrix<Element> A_ptr(A) ;
-
MD.mul(A,L,U);
// A.write(std::cout << "pre A=",true) << std::endl;
@@ -221,10 +214,10 @@ namespace LinBox
#if 0
template<class Randiter,class Field>
- BlasMatrix<typename Field::Element> &
+ BlasMatrix<Field> &
random_lu_rank(const Field & F,
const Randiter & R,
- BlasMatrix<typename Field::Element> & A,
+ BlasMatrix<Field> & A,
int & rank,
const RingCategories::IntegerTag & tag)
{
@@ -258,10 +251,10 @@ namespace LinBox
}
template<class Randiter>
- BlasBlackbox<PID_integer> &
- random_rankupdate( PID_integer & F //!@bug const !
+ BlasBlackbox<Givaro::ZRing<Integer> > &
+ random_rankupdate( Givaro::ZRing<Integer> & F //!@bug const !
,const Randiter & R
- ,BlasBlackbox<PID_integer> & A
+ ,BlasBlackbox<Givaro::ZRing<Integer> > & A
, int & rank
)
{
@@ -269,16 +262,16 @@ namespace LinBox
size_t m = A.rowdim();
size_t n = A.coldim();
- BlasBlackbox<PID_integer> D(F,(size_t)m,(size_t)rank) ;
- BlasBlackbox<PID_integer> G(F,(size_t)rank,(size_t)n) ;
+ BlasBlackbox<Givaro::ZRing<Integer> > D(F,(size_t)m,(size_t)rank) ;
+ BlasBlackbox<Givaro::ZRing<Integer> > G(F,(size_t)rank,(size_t)n) ;
Randiter S_(R);
S_.setBits(R.getBits()-1);
- RandomBlasBlackbox<Randiter,PID_integer > RandMatGen(F,S_);
+ RandomBlasBlackbox<Randiter,Givaro::ZRing<Integer> > RandMatGen(F,S_);
RandMatGen.random(D) ;
- RandomIntegerIter<false> T_(3);
- RandomBlasBlackbox<RandomIntegerIter<false>,PID_integer > RandSmallMatGen(F,T_);
+ Givaro::ZRing<Integer> >::RandIter T_(F,3);
+ RandomBlasBlackbox<Givaro::ZRing<Integer> >::RandIter,Givaro::ZRing<Integer> > RandSmallMatGen(F,T_);
RandMatGen.random(G) ;
- MatrixDomain<PID_integer> MD(F);
+ MatrixDomain<Givaro::ZRing<Integer> > MD(F);
MD.mul(A,D,G);
return A ;
}
@@ -293,7 +286,6 @@ namespace LinBox
, const RingCategories::IntegerTag &tag
)
{
- typedef typename Field::Element Int ;
size_t m = A.rowdim();
size_t n = A.coldim();
@@ -303,8 +295,8 @@ namespace LinBox
S_.setBits(R.getBits()-1);
RandomDenseMatrix<Randiter,Field > RandMatGen(F,S_);
RandMatGen.random(D) ;
- RandomIntegerIter<false> T_(3);
- RandomDenseMatrix<RandomIntegerIter<false>,Field > RandSmallMatGen(F,T_);
+ typename Field::Randiter T_(F,3);
+ RandomDenseMatrix<typename Field::Randiter, Field> RandSmallMatGen(F,T_);
RandMatGen.random(G) ;
MatrixDomain<Field> MD(F);
@@ -319,8 +311,8 @@ namespace LinBox
RandomBlasPermutation(P);
RandomBlasPermutation(Q);
- PID_integer ZZ ;
- BlasMatrixDomain< PID_integer > BMD(ZZ) ;
+ Givaro::ZRing<Integer> ZZ ;
+ BlasMatrixDomain< Givaro::ZRing<Integer> > BMD(ZZ) ;
BMD.mulin_left (A,Q);
BMD.mulin_right(P,A);
@@ -336,9 +328,27 @@ namespace LinBox
Matrix &
RandomDenseMatrix<Randiter, Field>::random( Matrix & A)
{
+ typename Field::Element d;
for (size_t i = 0 ; i < A.rowdim() ; ++i)
- for (size_t j = 0 ; j < A.coldim() ; ++j)
- R_.random(A.refEntry(i,j));
+ for (size_t j = 0 ; j < A.coldim() ; ++j) {
+ R_.random(d);
+ A.setEntry(i,j,d);
+ }
+ return A;
+ }
+
+ template<class Randiter, class Field>
+ template<class Matrix>
+ Matrix&
+ RandomDenseMatrix<Randiter, Field>::randomFullRank(Matrix &A)
+ {
+ long unsigned r,b,m,n;
+ m=A.rowdim();
+ n=A.coldim();
+ b=m<n?m:n;
+ do {
+ random(A);
+ } while(LinBox::rank(r,A,Method::Hybrid()) < b);
return A;
}
@@ -351,7 +361,7 @@ namespace LinBox
int rank
, const Method & meth )
{
- throw NotImplementedYet(__func__,__FILE__,__LINE__);
+ throw NotImplementedYet(LB_FILE_LOC);
}
#endif
diff --git a/linbox/matrix/sliced3.doxy b/linbox/matrix/sliced3.doxy
new file mode 100644
index 0000000..040c2cc
--- /dev/null
+++ b/linbox/matrix/sliced3.doxy
@@ -0,0 +1,32 @@
+// Copyright 2014 LinBox. See COPYING for licence information.
+/*
+ * Written by Brice Boyer (briceboyer) <boyer.brice at gmail.com>
+
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ * ========LICENCE========
+ */
+
+/** \ingroup matrix
+ * \defgroup sliced3 Sliced Matrix
+ * \brief These are files related to a special bitsliced GF(3) representation
+ *
+ * NO DOC YET
+ *
+ */
+
+// vim:syn=doxygen
diff --git a/linbox/matrix/sliced3.h b/linbox/matrix/sliced3.h
new file mode 100644
index 0000000..c4b661f
--- /dev/null
+++ b/linbox/matrix/sliced3.h
@@ -0,0 +1,44 @@
+/* linbox/matrix/sparse-matrix.h
+ * Copyright (C) 2013 the LinBox
+ *
+ * Written by :
+ * bsy <bryouse at udel.edu>
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ * ========LICENCE========
+ */
+
+/*! @file matrix/sliced3.h
+ * @ingroup matrix
+ */
+
+#ifndef __LINBOX_matrix_sliced3_H
+#define __LINBOX_matrix_sliced3_H
+
+#include "sliced3/dense-sliced.h"
+#include "sliced3/sliced-domain.h"
+
+#endif // __LINBOX_matrix_sliced3_H
+
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/matrix/sliced3/Makefile.am b/linbox/matrix/sliced3/Makefile.am
new file mode 100644
index 0000000..225e6d5
--- /dev/null
+++ b/linbox/matrix/sliced3/Makefile.am
@@ -0,0 +1,30 @@
+# Copyright (c) 2013 the LinBox group
+# ========LICENCE========
+# This file is part of the library LinBox.
+#
+# LinBox is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+#
+# This library 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
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+# ========LICENCE========
+
+pkgincludesubdir=$(pkgincludedir)/matrix/sliced3
+
+
+pkgincludesub_HEADERS = \
+ dense-matrix.h \
+ dense-sliced.h \
+ dense-sliced.inl \
+ sliced-domain.h \
+ sliced-stepper.h \
+ submat-iterator.h
+
diff --git a/linbox/matrix/sliced3/dense-matrix.h b/linbox/matrix/sliced3/dense-matrix.h
new file mode 100644
index 0000000..e3739f8
--- /dev/null
+++ b/linbox/matrix/sliced3/dense-matrix.h
@@ -0,0 +1,524 @@
+/* -*- mode: C++; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
+/* linbox/matrix/dense-matrix.h
+ * Copyright (C) 2011 B. David Saunders,
+ * See COPYING for license information
+ *
+ * evolved from dense-submatrix and blas-matrix by B. David Saunders <saunders at cis.udel.edu>, BSY
+ */
+
+/*! @file matrix/sliced3/dense-submatrix.h
+ * @ingroup matrix
+ * @brief Representation of a submatrix of a dense matrix, not resizeable.
+ * This matrix type conforms to the \c LinBox::DenseMat interface.
+ * \c LinBox::BlasMatrix is an example of DenseSubmatrix.
+ */
+
+#ifndef __LINBOX_dense_matrix_H
+#define __LINBOX_dense_matrix_H
+
+#include <utility>
+#include "linbox/linbox-config.h"
+
+//#include "linbox/util/debug.h"
+//#include "linbox/matrix/matrix-domain.h"
+#include "linbox/vector/subvector.h"
+#include "submat-iterator.h"
+
+namespace LinBox
+{
+
+ /** @brief to be used in standard matrix domain
+
+ * Matrix variable declaration, sizing, entry initialization may involve one to 3 steps.
+ * Matrix ops are container ops. (sizing, copying)
+ * Mathematically meaningful operations are to be found only in an associated matrix domain
+ *
+ * A matrix may be allocated or not. A matrix initialized by a submatrix() call is not allocated.
+ * When an allocated matrix goes out of scope or is reinitialized with init(), the memory is released
+ * and all submatrices of it become invalid.
+ *
+ * Allocating:
+ * DenseMat A(2, 3); // allocation of mem for 6 entries at construction
+ * DenseMat B; B.init(10, 10); // default constr and subsequent allocation for 100 entries.
+ *
+ * Allocation of memory plus entry initialization:
+ * // a meaningful value of DenseMat::Entry x is set by a field or matrix domain.
+ * DenseMat A(10, 10, x);
+ * DenseMat B: B.init(10, 10, x);
+ * DenseMat C(A); // allocation at copy construction. A could be a submatrix of another.
+ * A.read(istream)
+ *
+ * Nonallocation sizing:
+ * // assume D declared, A initialized, n = A.coldim().
+ * D.submatrix(A, 0, 1, 2, n-1); // D is 2 by n-1 in upper right of A.
+ *
+ * Entry initialization (and overwriting) in already sized matrices:
+ * A.setEntry(i, j, x);
+ * A = B; // A and B must have the same shape.
+
+ * Entry read access. OK on const matrices
+ * getEntry, write
+
+ * Under consideration: Require A.clear() on an allocated matrix before any action that would abandon
+ * the allocated mem (init or submatrix).
+ \ingroup matrix
+ */
+ template<class _Element>
+ class DenseMat {
+ typedef _Element Entry;
+ public: // protected: //TODO scope
+ Entry *_rep; // matrix entries on the heap.
+ bool _alloc; // iff _alloc, I am responsible for _rep allocation/deallocation.
+ size_t _rows;
+ size_t _cols;
+ size_t _stride; // stride from row to row. Entries in a row are contiguous.
+
+ public:
+ size_t rowdim() const { return _rows; }
+ size_t coldim() const { return _cols; }
+
+ Entry& getEntry(Entry& x, size_t i, size_t j) const {
+ linbox_check(i < _rows && j < _cols);
+ return x = *(_rep + i*_stride + j);
+ }
+
+ Entry& setEntry(size_t i, size_t j, const Entry& x ) {
+ //linbox_check((i < _rows && j < _cols));
+ return *(_rep + i*_stride + j) = x;
+ }
+ // no refEntry - not well supportable in some matrix domains.
+
+ DenseMat() : _rep(NULL), _alloc(false), _rows(0), _cols(0), _stride(0) {}
+
+ void init(size_t m = 0, size_t n = 0) {
+ //std::cerr << m << " " << n << " <<<<<<" << std::endl;
+ if (_alloc) delete _rep; // abandon any prior def
+ if (m*n != 0) {
+ _rep = new Entry[m*n]; _alloc = true;
+ } else {
+ _rep = NULL; _alloc = false;
+ }
+ size(m, n);
+ }
+
+ void init(size_t m, size_t n, const Entry& filler) {
+ if (_alloc) delete _rep; // abandon any prior def
+ if (m*n != 0) {
+ _rep = new Entry[m*n]; _alloc = true;
+ for (size_t i = 0; i < m*n; ++i) _rep[i] = filler;
+ } else {
+ _rep = NULL; _alloc = false;
+ }
+ size(m, n);
+ }
+
+ /* Copy construction makes this a completely distinct copy of A.
+ * Entries of this are stored contiguously even if A is not contiguous (is a submatrix of another).
+ *
+ * If memcpy is not valid for your entry type, specialize DenseMat for it.
+ */
+ DenseMat(const DenseMat& A)
+ : _rep(new Entry[A._rows*A._cols]), _alloc(true), _rows(A._rows), _cols(A._cols), _stride(A._cols)
+ {
+ //std::cout << "copy construction " << _rep << std::endl;
+ //std::cout << "copy cons " << _rows << " " << _cols << std::endl;
+ *this = A; // copy A's data into _rep
+ }
+
+ ~DenseMat() {
+ if (_alloc) delete _rep;
+ }
+
+ // For assignment, the matrices must have same size and not overlap in memory.
+ // This restriction could be loosened...
+ DenseMat& operator=(const DenseMat& B) {
+ linbox_check(_rows == B._rows && _cols == B._cols);
+ if (_cols == _stride && B._cols == B._stride) // both are contiguous
+ memcpy(_rep, B._rep, sizeof(Entry)*_rows*_cols);
+ else
+ for (size_t i = 0; i < _rows; ++i) // copy row by row
+ memcpy(_rep + i*_stride, B._rep + i*B._stride, sizeof(Entry)*_cols);
+ return *this;
+ }
+
+ /** Set this to be an m by n submatrix of A with upper left corner at i,j position of A.
+ * Requires i+m <= A.rowdim(), j+n <= A.coldim().
+ *
+ * For instance, B.submatrix(A, i, 0, 1, A.coldim()) makes B the i-th row of A.
+ */
+ void submatrix(const DenseMat & A, size_t i, size_t j, size_t m, size_t n) {
+ linbox_check(i+m <= A._rows && j+n <= A._cols);
+ if (_alloc) delete _rep; // abandon any prior def
+ _rep = A._rep + (i*A._stride + j);
+ _alloc = false;
+ _rows = m; _cols = n; _stride = A._stride;
+ }
+
+ /* SLICED helper functions... maybe shouldn't be public */
+
+ // size a matrix w/o allocating memory
+ void size(size_t m, size_t n){
+ _rows = m; _cols = _stride = n;
+ }
+
+ template<class vp>
+ int did_swapback(vp &swaps, size_t hot, size_t l, size_t r){
+ for(size_t i=l; i<r; ++i){
+ if(swaps[i].second == hot)
+ return swaps[i].first;
+ }
+ return -1;
+ }
+
+ template<class vp>
+ void flocs(vp & tos, vp & swaps){
+ std::vector<size_t> pos;
+ for(size_t i =0; i < coldim(); ++i) pos.push_back(i);
+
+ for(int i = coldim()-1; i>= 0; --i){
+ //std::cerr << swaps[i] << std::endl;
+ swap(pos[swaps[i].first], pos[swaps[i].second]);
+ }
+
+ for(size_t i = 0; i < coldim(); ++i){
+ std::pair<size_t, size_t> p(i, pos[i]);
+ tos.push_back(p);
+ }
+ }
+
+ template<class vp>
+ size_t final_loc(vp &swaps, size_t j){
+ // first check if we were swapped back prior to being reached
+ int to = did_swapback(swaps, j, 0, j+1);
+ if(to >= 0) return to;
+ // next check if we get swapped back from our immediate neightbor
+ //size_t nbor = swaps[j].second;
+ //to = did_swapback(swaps, nbor, j+1, nbor);
+ //if(to >= 0) return to;
+ // bad luck, we are chained forward, so
+ size_t i = j;
+ while(to < 0){
+ size_t lc = swaps[i].first;
+ size_t rc = swaps[i].second;
+ to = did_swapback(swaps, rc, lc+1, rc+1);
+ //std::cerr << j << ": " << to << "= ds(swps, " << rc << "," << lc+1 << "," << rc+1 << ")" << std::endl;
+
+ i = rc;
+ if(to < 0 && rc == swaps.size() - 1){
+ to = swaps.size() - 1;
+ }
+ }
+ return to;
+ }
+
+ void randomColPermutation() {
+ typedef std::pair<size_t, size_t> pair;
+ typedef std::vector<pair> vp;
+ vp swaps;
+ vp tos;
+ vp tos2;
+ // create pairs
+ for (size_t j = 0; j < coldim(); ++j){
+ // Each iteration swap col j with a random col in range [j..n-1].
+ int k = j + rand()%(coldim()-j);
+ //std::cerr << j << "->" << k << std::endl;
+ pair p(j,k);
+ swaps.push_back(p);
+ //for (size_t i = 0; i < rowdim(); ++i)
+ //swap( _rep[i*_stride + j], _rep[i*_stride + k]);
+ }
+ /*
+ //flocs(tos2, swaps);
+ // find each final location
+ for(size_t j = 0; j < coldim(); ++j){
+ size_t to = final_loc(swaps, j);
+ pair p(j, to);
+ if(p != tos2[j]){
+ std::cerr << "HOUSTON: PROBLEM" << std::endl;
+ }
+ else{
+ std::cout << "YAY ";
+ }
+ tos.push_back(p);
+ }
+ */
+ flocs(tos, swaps);
+ // tos is the correct mapping now permute
+ Entry *perm_row = new Entry[coldim()];
+ for(size_t i = 0; i < rowdim(); ++i){
+ for(vp::iterator ti = tos.begin(); ti!= tos.end(); ++ti)
+ perm_row[(*ti).second] = _rep[i*_stride + (*ti).first];
+ memcpy(&(_rep[i*_stride]), perm_row, coldim()*sizeof(Entry));
+ }
+ delete[] perm_row;
+
+ // CHECKING CODE
+ /*
+ std::cerr << "swaps: ";
+ for(vp::iterator i = swaps.begin(); i!= swaps.end(); ++i){
+ std::cerr << *i << " ";
+ }
+ std::cerr << std::endl;
+ std::cerr << "tos: ";
+ for(vp::iterator i = tos.begin(); i!= tos.end(); ++i){
+ std::cerr << *i << " ";
+ }
+ std::cerr << std::endl;
+ std::vector<int> orig;
+ for(size_t i = 0; i < coldim(); ++i) orig.push_back((int)i);
+ std::vector<int> out(orig);
+ std::vector<int> out2(orig);
+ for(vp::iterator i = swaps.begin(); i!= swaps.end(); ++i){
+ std::swap(out[(*i).first], out[(*i).second]);
+ }
+ for(vp::iterator i = tos.begin(); i!= tos.end(); ++i){
+ out2[(*i).second] = orig[(*i).first];
+ }
+ for(std::vector<int>::iterator i=out.begin(), i2=out2.begin(); i!=out.end(); ++i, ++i2){
+ if(*i != *i2){
+ std::cerr << "LOSER: ";
+ std::cerr << *i << " v " << *i2 << std::endl;
+ }
+ }
+ */
+ }
+
+ void randomLowerTriangularColTransform() {
+ for (size_t j = 0; j < coldim(); ++j){
+ // Each iteration swap col j with a random col in range [j..n-1].
+ //int l = 1, k = 0;
+ //do { l *= RAND_MAX; k = k*RAND_MAX + rand(); } while (l < j);
+ //k = k%j;
+ int k = rand()%j;
+ for (size_t i = 0; i < rowdim(); ++i)
+ _rep[i*_stride + j] += _rep[i*_stride + k];
+ }
+ }
+ /* Iterators */
+
+ typedef SubMatIterator<_Element> RawIterator;
+ typedef ConstSubMatIterator<_Element> ConstRawIterator;
+
+ RawIterator rawBegin() {
+ return RawIterator(_rep, _cols, _stride); };
+ RawIterator rawEnd() {
+ return RawIterator(_rep + _rows*_stride); }
+ RawIterator rowBegin(size_t i) {
+ //return rawBegin() + i*_cols;
+ return RawIterator(_rep+i*_stride, _cols, _stride);
+ }
+ RawIterator rowEnd(size_t i) {
+ return rowBegin(i + 1);
+ }
+ /*
+ RawIterator rowBegin(size_t i) {
+ return rawBegin() + i*_cols; }
+ RawIterator rowEnd(size_t i) {
+ return rowBegin(i + 1); }
+ */
+
+ ConstRawIterator rawBegin() const {
+ return ConstRawIterator(_rep, _cols, _stride); }
+ ConstRawIterator rawEnd() const {
+ return ConstRawIterator(_rep + _rows*_stride); }
+ ConstRawIterator rowBegin(size_t i) const {
+ return rawBegin() + i*_cols; }
+ ConstRawIterator rowEnd(size_t i) const {
+ return rowBegin(i + 1); }
+
+ typedef DenseMat<_Element> Self_t; //!< Self type
+
+#if 0 // TODO factor out
+ /** @name typedef'd Row Iterators.
+ *\brief
+ * The row iterator gives the rows of the
+ * matrix in ascending order. Dereferencing the iterator yields
+ * a row vector in dense format
+ * @{
+ */
+ typedef Entry* RowIterator;
+ typedef const Entry* ConstRowIterator;
+ typedef Subvector<Entry*> Row;
+ typedef Subvector<const Entry*> ConstRow;
+ //@} Row Iterators
+
+ /** @name typedef'd Column Iterators.
+ *\brief
+ * The columns iterator gives the columns of the
+ * matrix in ascending order. Dereferencing the iterator yields
+ * a column vector in dense format
+ * @{
+ */
+ typedef Subiterator<Entry> ColIterator;
+ typedef Subiterator<const Entry> ConstColIterator;
+ typedef Subvector<ColIterator> Col;
+ typedef Subvector<ConstColIterator> ConstCol;
+ //@} // Column Iterators
+#endif
+
+ template<typename _Tp1>
+ struct rebind {
+ typedef DenseMat<typename _Tp1::Element> other;
+ };
+
+ /** Read the matrix from an input stream.
+ * @param file Input stream from which to read
+ * @param field
+ */
+ template<class Field>
+ std::istream& read (std::istream &file, const Field& field);
+
+ /** Write the matrix to an output stream.
+ * @param os Output stream to which to write
+ * @param field
+ * @param mapleFormat write in Maple(r) format ?
+ */
+ template<class Field>
+ std::ostream& write (std::ostream &os, const Field& field,
+ bool mapleFormat = false) const;
+
+ /** Write the matrix to an output stream.
+ * This a raw version of \c write(os,F) (no field is given).
+ * @param os Output stream to which to write
+ * @param mapleFormat write in Maple(r) format ?
+ */
+ std::ostream& write (std::ostream &os,
+ bool mapleFormat = false) const;
+
+ /* TODO factor out row/col iterator
+ RowIterator rowBegin ();
+ RowIterator rowEnd ();
+ ConstRowIterator rowBegin () const;
+ ConstRowIterator rowEnd () const;
+
+ ColIterator colBegin ();
+ ColIterator colEnd ();
+ ConstColIterator colBegin () const;
+ ConstColIterator colEnd () const;
+ */
+
+};
+ /*! Write a matrix to a stream.
+ * The C++ way using <code>operator<<</code>
+ * @param o output stream
+ * @param Mat matrix to write.
+ */
+ template<class T>
+ std::ostream& operator<< (std::ostream & o, const DenseMat<T> & Mat)
+ {
+ return Mat.write(o);
+ }
+
+ /*! @internal
+ * @brief MatrixTraits
+ */
+ /* necessary?
+ template <class Element>
+ struct MatrixTraits< DenseMat<Element> > {
+ typedef DenseMat<Element> MatrixType;
+ typedef typename MatrixCategories::RowColMatrixTag MatrixCategory;
+ };
+ */
+
+ template <class _Element>
+ template <class Field>
+ std::istream& DenseMat<_Element>::read (std::istream &file, const Field& field)
+ {
+ RawIterator p;
+
+ for (p = rawBegin (); p != rawEnd (); ++p) {
+ // each entry is seperated by one space.
+ file.ignore (1);
+ field.read (file, *p);
+ }
+
+ return file;
+ }
+
+ template <class _Element>
+ template <class Field>
+ std::ostream &DenseMat<_Element>::write (std::ostream &os, const Field& field,
+ bool mapleFormat) const
+ {
+ return os;
+ }
+/* TODO factor out RowIterator
+ ConstRowIterator p;
+
+ // integer c;
+ //int wid;
+
+ // field.cardinality (c);
+ //wid = (int) ceil (log ((double) c) / M_LN10); //BB : not used !
+
+ typename ConstRow::const_iterator pe;
+
+ if (mapleFormat) os << "[";
+
+ for (p = rowBegin (); p != rowEnd (); ++p) {
+ if (mapleFormat && (p != rowBegin()))
+ os << ',';
+ if (mapleFormat) os << "[";
+
+ for (pe = p->begin (); pe != p->end (); ++pe) {
+ if (mapleFormat && (pe != p->begin())) os << ',';
+ // matrix base does not provide this field(), maybe should?
+ //_M.field ().write (os, *pe);
+ //os << *pe;
+ //fixed by using extra field
+
+ field.write (os, *pe);
+ os << " ";
+ }
+
+ if (!mapleFormat)
+ os << std::endl;
+ else os << ']';
+ }
+
+ if (mapleFormat) os << ']';
+ return os;
+ }
+ */
+
+ template <class _Element>
+ std::ostream &DenseMat<_Element>::write (std::ostream &os, bool mapleFormat) const
+ {
+ return os;
+ }
+ /*
+ ConstRowIterator p;
+
+
+
+ typename ConstRow::const_iterator pe;
+
+ if (mapleFormat) os << "[";
+
+ for (p = rowBegin (); p != rowEnd (); ++p) {
+ if (mapleFormat && (p != rowBegin()))
+ os << ',';
+ if (mapleFormat) os << "[";
+
+ for (pe = p->begin (); pe != p->end (); ++pe) {
+ if (mapleFormat && (pe != p->begin())) os << ',';
+
+ os << *pe;
+ os << " ";
+ }
+
+ if (!mapleFormat)
+ os << std::endl;
+ else os << ']';
+ }
+
+ if (mapleFormat) os << ']';
+ return os;
+ }
+ */
+
+} // namespace LinBox
+
+#endif // __LINBOX_dense_matrix_H
+
diff --git a/linbox/matrix/sliced3/dense-sliced.h b/linbox/matrix/sliced3/dense-sliced.h
new file mode 100644
index 0000000..1c739a0
--- /dev/null
+++ b/linbox/matrix/sliced3/dense-sliced.h
@@ -0,0 +1,691 @@
+#ifndef __DENSE_SLICED_H
+#define __DENSE_SLICED_H
+
+#include <sys/mman.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <sys/fcntl.h>
+
+/**
+ The matrix class Sliced is defined.
+ It adheres to the LinBox dense matrix interface.
+
+ It depends on SlicedBase, also defined here, which packs GF(3) elements
+ into a pair of ints. The int type is a template parameter.
+*/
+
+#include "dense-matrix.h"
+//#include <linbox/util/timer.h>
+//#include "sliced-stepper.h"
+
+
+namespace LinBox {
+
+/* SLICED BASE CODE
+ SlicedBase implements functios on a vector of GF(3) elements.
+ T is an integer type of some length n.
+ The vectors are of length n, packed into two T words in sliced fashion.
+ (Each element partakes of one bit from b0 and one bit from b1).
+
+ Most of the SlicedBase functios are in C++ operator form.
+ */
+template<class T>
+struct SlicedBase
+{
+public:
+ T& bits0(){return b0;}
+ T& bits1(){return b1;}
+
+ SlicedBase & operator=(const T &rhs){
+ b0 = rhs;
+ b1 = rhs;
+ return *this;
+ }
+
+ SlicedBase & operator=(const SlicedBase &rhs){
+ b0 = rhs.b0;
+ b1 = rhs.b1;
+ return *this;
+ }
+
+ // only nontrivial multiplication in F(3) is *=2
+ // which is negation, which is word swap
+ // between the bits
+ SlicedBase & operator*=(const T &two){
+ // this is multiplication by two only!!!!
+ // we never even read the arg.
+ b1 ^= b0;
+ return *this;
+ }
+
+ SlicedBase operator*(const T &two) const{
+ return SlicedBase(*this) *= two;
+ }
+
+ // used for masking both words
+ SlicedBase & operator&=(const T &mask){
+ b1 &= mask;
+ b0 &= mask;
+ return *this;
+ }
+
+ SlicedBase operator & (const T &rhs){
+ return SlicedBase(*this) &= rhs;
+ }
+
+ // used for shifting both words
+ SlicedBase & operator>>=(const T &shift){
+ b1 >>= shift;
+ b0 >>= shift;
+ return *this;
+ }
+
+ SlicedBase operator >> (const T &rhs){
+ return SlicedBase(*this) >>= rhs;
+ }
+
+ // used for shifting both words
+ SlicedBase & operator<<=(const T &shift){
+ b1 <<= shift;
+ b0 <<= shift;
+ return *this;
+ }
+
+ SlicedBase operator << (const T &rhs){
+ return SlicedBase(*this) <<= rhs;
+ }
+
+ // used for combining value into both words
+ SlicedBase & operator|=(const T &val){
+ b1 |= val;
+ b0 |= val;
+ return *this;
+ }
+
+ // used for combining two units
+ SlicedBase & operator|=(const SlicedBase &rhs){
+ b1 |= rhs.b1;
+ b0 |= rhs.b0;
+ return *this;
+ }
+
+ SlicedBase & operator+=(const SlicedBase &rhs){
+ T a = b0 ^ rhs.b1;
+ T b = b1 ^ rhs.b0;
+ T s = a ^ b1;
+ T t = b ^ rhs.b1;
+ b1 = a & b;
+ b0 = s | t;
+
+ return *this;
+ }
+
+ const SlicedBase operator+(const SlicedBase &rhs){
+ return SlicedBase(*this) += rhs;
+ }
+
+ // comparison ops
+ bool operator==(const SlicedBase &rhs){
+ return b0 == rhs.bo && b1 == rhs.b1;
+ }
+
+ // used for combining two units
+ bool operator!=(const SlicedBase &rhs){
+ return b0 != rhs.b0 || b1 != rhs.b1;
+ }
+
+ SlicedBase & zero(){
+ b0 = 0;
+ b1 = 0;
+ return *this;
+ }
+
+//protected:
+ T b0;
+ T b1;
+};
+
+/**
+ The Sliced Matrix class
+ _Domain must be a GF(3) rep, BaseT must be an unsigned int type.
+ TODO more docs, discuss row/col slicing
+*/
+template <class _Domain>
+class Sliced : public DenseMat<SlicedBase<typename _Domain::Word_T> >
+{
+public:
+ typedef _Domain Domain;
+ typedef typename Domain::Scalar Scalar;
+ typedef typename Domain::Word_T SlicedWord;
+ typedef SlicedBase<SlicedWord> SlicedUnit;
+
+ typedef DenseMat<SlicedBase<typename _Domain::Word_T> > Base_T;
+ using Base_T::rawBegin;
+ using Base_T::rawEnd;
+ using Base_T::rowBegin;
+ using Base_T::rowEnd;
+ using Base_T::_stride;
+ using Base_T::_rep;
+ using Base_T::_alloc;
+ typedef typename Base_T::RawIterator RawIterator;
+ typedef Base_T Matrix;
+
+ enum op_t { ADD, SMUL, AXPY, ZERO, COPY };
+
+ Sliced() : Matrix(), _domain(Domain()), _m(0), _n(0), _colPacked(false),
+ _SIZE(8*sizeof(SlicedWord)), _sub(false) {}
+
+ Sliced(Domain d) : Matrix(), _domain(d), _m(0), _n(0), _colPacked(false),
+ _SIZE(8*sizeof(SlicedWord)), _sub(false) {}
+
+ // Constructor taking dims and bool defaulting ROWPACKED
+ Sliced (Domain d, size_t m, size_t n, bool colP = false) :
+ Matrix(), _domain(d), _m(m), _n(n), _colPacked(colP), _i(0),
+ _SIZE(8*sizeof(SlicedWord)),
+ _j(0), _loff(0), _roff(0), _sub(0) {
+ Matrix::init(colP ? (m + _SIZE - 1)/_SIZE : m,
+ colP ? n : (n + _SIZE - 1)/_SIZE);
+ }
+
+ // need to override parent size, because we are a different size
+ void size(size_t m = 0, size_t n = 0, bool cp = false){
+ _m = m; _n = n; _colPacked = cp;
+ _i = _j = _roff = _loff = _sub = 0;
+
+ if(_colPacked)
+ Matrix::size((m + _SIZE - 1)/_SIZE, n);
+ else
+ Matrix::size(m, (n + _SIZE - 1)/_SIZE);
+ }
+
+ // need to override parent inits, because we are a different size
+ void init(size_t m = 0, size_t n = 0) {
+ _m = m; _n = n;
+ _i = _j = _roff = _loff = _sub = 0;
+ if(_colPacked)
+ Matrix::size((m + _SIZE - 1)/_SIZE, n);
+ else
+ Matrix::init(m, (n + _SIZE - 1)/_SIZE);
+ }
+
+ void init(size_t m, size_t n, const Scalar &filler){
+ init(m,n);
+
+ // TODO stepper functionality, more efficient.
+ for(size_t i=0; i<m; ++i)
+ for(size_t j=0; j<n; ++j)
+ setEntry(i, j, filler);
+ }
+
+ void shiftSubMatDown(int i) {
+ _i=i+_i;
+ _rep=_rep+i*_stride;
+ }
+
+ Sliced & submatrix(Sliced &other, size_t i, size_t j, size_t m, size_t n){
+ _m = m;
+ _n = n;
+ _colPacked = other._colPacked;
+ _i = i;
+ _sub = true;
+
+ size_t headStart = other._loff ? _SIZE - other._loff : 0;
+ _j = j + headStart;
+ // determine in which of parents' columns do we begin
+ size_t firstCol = _j/_SIZE;
+
+ _loff = (_SIZE-(_j%_SIZE))%_SIZE; // could prob. omit final mod?
+ _roff = (_j+n)%_SIZE;
+
+ // _roff really an offset? or just goes to "parent" matrix's normal end
+ //if( (_j+n) == other.coldim() )
+ // _roff = 0;
+ // AND IF our super matrix is < SIZE, special case we don't account for
+ /* ^ this can cause the writing of a superfluous zero word in s_write_bin
+ if last word is next to first word in a submat */
+
+ //std::cerr << _j << " " << n << other.coldim();
+ //cerr << "LOFF: " << _loff << " ROFF: " << _roff << endl;
+ //std::cerr << "ijmn?" << i << " " << j << " " << m << " " << n << std::endl;
+ //cerr << "firstCol: " << firstCol << " _j: " << _j << " cols(): " << _cols << " other.cols(): " << other.cols() << endl;
+
+ //TODO colpacked version
+ this->Matrix::submatrix(other, i, firstCol, m, (n + (_j%_SIZE) + (_SIZE - 1))/_SIZE);
+
+ return *this;
+ }
+
+ const Domain& field() const {return _domain;}
+ Domain& field() {return _domain;}
+
+ // blindly assumes "other" matrix is rowpacked...
+ Sliced (Sliced &other, size_t i, size_t j, size_t m, size_t n) : Matrix(), _domain(other._domain) {
+ // we currently can't handle submatrices that reside entirely within
+ // a single sliced unit, width-wise...
+ // meaning < _SIZE columns, while both borders are in the same word
+ size_t begin = j+other._loff;
+ size_t end = begin+n;
+ size_t endTest = other._n < _SIZE ? other._n : _SIZE;
+ // check if we're small enough, then check if we're on a border (which is OK)
+ if(n < _SIZE && begin%_SIZE && end%endTest){
+ size_t test = other._loff ? other._loff : _SIZE;
+ if((j+n) <= test){
+ std::cerr << "Unsupported submatrix request. Submatrix entirely within a word" <<
+ " while not aligned with a left or right border" << std::endl;
+ //exit(-1);
+ }
+ }
+
+ // passed the security checkpoint. on to business
+ submatrix(other, i, j, m, n);
+ }
+
+// incl functions to handle specialized cases (where submats are not word-aligned)
+#include "dense-sliced.inl"
+
+ // typical addin, barge right through with the raw iterator
+ Sliced& addin(Sliced &other){
+ if(_loff || _roff)
+ return s_addin(other);
+
+ RawIterator a = rawBegin();
+ RawIterator c = rawEnd();
+ RawIterator b = other.rawBegin();
+
+ //for(; &(*a) != &(*c); ++a, ++b)
+ for(; a != c; ++a, ++b)
+ (*a) += (*b);
+
+ return *this;
+ }
+
+ Sliced& smulin(Scalar &x){
+ if(x == 1)
+ return *this;
+
+ if(_loff || _roff)
+ return s_smulin(x);
+
+ if(x == 0)
+ return zero();
+
+ // x == 2
+ //int j = 0;
+ //for(RawIterator a = rawBegin(); j < rows()*cols() ; j+=_SIZE, ++a)
+ for(RawIterator a = rawBegin(); a != rawEnd(); ++a)
+ (*a)*=2;
+
+ return *this;
+ }
+
+ /*
+ Sliced& smul(Scalar &x){
+ return Sliced(*this).copy(*this).smulin(x);
+ }
+ */
+
+ void setEntry(size_t i, size_t j, const Scalar &a_ij){
+ SlicedWord e = static_cast<SlicedWord>(a_ij);
+ // determine location
+ // TODO: THIS SEEMS TO EXCPET _rep isn't adjusted for submatrix
+ // whereas in dense-matrix.h, submatrix adjusts _rep. need to study
+ // the pros/cons of either approach but CANNOT MIX THEM
+ // I think
+ //size_t word = (_i+i)*_stride + ((j+(_j%_SIZE))/_SIZE);
+ size_t word = i*_stride + ((j+(_j%_SIZE))/_SIZE);
+ //int w = i*Matrix::coldim() + ((j+(_j%_SIZE))/_SIZE);
+ //int w = ((j+(_j%_SIZE))/_SIZE);
+ //RawIterator word = rowBegin(i) + w;
+ //word += w;
+
+ size_t index = (_j+j) % _SIZE;
+
+ SlicedWord b1 = (e & 2) >> 1;
+ SlicedWord b0 = (e & 1) | b1;
+ SlicedWord one = 1;
+
+ //(*word) &= ~(one << index);
+ //(*word).b0 |= b0 << index;
+ //(*word).b1 |= b1 << index;
+
+ _rep[word] &= ~(one << index);
+
+ _rep[word].b0 |= b0 << index;
+ _rep[word].b1 |= b1 << index;
+ }
+
+ Scalar getEntry(size_t i, size_t j) {
+ Scalar retVal;
+ getEntry(retVal,i,j);
+ return retVal;
+ }
+
+ Scalar& getEntry(Scalar &x, size_t i, size_t j){
+ //int w = ((j+(_j%_SIZE))/_SIZE);
+ // TODO: see note in setEntry
+ size_t word = (_i+i)*_stride + ((j+(_j%_SIZE))/_SIZE);
+ //RawIterator word = rowBegin(i) + w;
+ //word += w;
+
+ size_t index = (_j+j) % _SIZE;
+
+ //cerr << "(w" << w << ",i" << index << ")";
+ //std::cerr << (*word).b0 << "x" << (*word).b1 << std::endl;
+
+ //int answer = (int)((((*word).b1 >> index) & 1) + (((*word).b0 >> index) & 1));
+ size_t answer = (size_t)(((_rep[word].b1 >> index) & 1) +
+ ((_rep[word].b0 >> index) & 1));
+ //_domain.init(x, answer);
+ x = answer;
+ return x;
+ }
+
+ // begin, end, scalar, other begin
+ Sliced & axpyin(RawIterator &b, RawIterator &e, Scalar &s, RawIterator &ob){
+ RawIterator x = b;
+ RawIterator y = ob;
+
+ switch(static_cast<int>(s)){
+ case 0:
+ return *this;
+ case 1:
+ if(_loff || _roff)
+ return s_axpyin(b, s, ob);
+ for(; x!=e; ++x,++y)
+ (*x) += (*y);
+ return *this;
+ case 2:
+ if(_loff || _roff)
+ return s_axpyin(b, s, ob);
+ for(; x!=e; ++x,++y){
+ (*x) += (*y)*2;
+ }
+ return *this;
+ }
+ return *this;
+ }
+
+ // MUL:
+ // become the product of two sliced matrices
+ // (only seems to work if row packed so far)
+ // (does not check for compatible sizes)
+ // (does NOT work yet for two submatrices)
+ template <class Gettable>
+ Sliced & mul(Gettable& A, Sliced& B){
+ zero();
+
+ Scalar a_ij;
+ // c&b - begin and end
+ RawIterator c_b, c_e, b_b; //, b_e;
+
+ size_t count = 0;
+ // axpyin to C individual entries of A with rows of B
+ for(; count < rowdim(); ++count){
+ c_b = rowBegin(count);
+ c_e = rowEnd(count);
+
+ //Timer t;
+ //t.clear(); t.start();
+ for(size_t len = 0; len < A.coldim(); ++len){
+ // element of A goes down rows of A.
+ // (could improve on speed of method to get this value [step?])
+ a_ij = A.getEntry(a_ij, count, len);
+
+ // this is axpy'd to THAT row of B.
+ b_b = B.rowBegin(len);
+ axpyin(c_b, c_e, a_ij, b_b);
+ }
+ //t.stop(); std::cerr << t << std::endl;
+ }
+ return *this;
+ }
+
+ std::ostream& write(std::ostream &os = std::cerr, size_t offset = 0){
+ Scalar t;
+ for(size_t i = 0; i<_m; i++){
+ for(size_t q=0; q<offset; ++q)
+ os << " ";
+ for(size_t j = 0; j<_n; j++){
+ os << (size_t)getEntry(t, i, j);
+ /* DEBUG _SIZE-BIT BOUNDARIES
+ if(offset && j && ! ((_j+j+1)%_SIZE)){
+ if(j && ! ((_j+j+1)%_SIZE))
+ os << "|";
+ else
+ os << " ";
+ }
+ else
+ */
+ os << " ";
+ }
+ os << std::endl;
+ }
+ os << std::endl;
+ return os;
+ }
+
+ // returns an (approximately) random _SIZE-bit word
+ SlicedWord randomLL(){
+ SlicedWord swr = 0;
+ for(size_t i=0; i<(_SIZE/8); ++i)
+ swr |= ((SlicedWord)(rand()%256) << (i << 3));
+ return swr;
+ }
+
+ // completely randomizes sliced block entries
+ Sliced& random(size_t seed = 0){
+ if(seed) srand(seed);
+ //srand(seed);
+
+ RawIterator a = rawBegin();
+ // TODO: problem here is that
+ // this will cause about 1/2 0's, 1/4 1's & 2's
+ for(; a != rawEnd(); ++a){
+ (*a).b0 = randomLL();
+ (*a).b1 = randomLL() & (*a).b0;
+
+ //std::cerr << (*a).b0 << "x" << (*a).b1 << std::endl;
+ }
+ return *this;
+ }
+
+ // completely zeros out a sliced block
+ Sliced& zero(){
+ if(_sub && (_loff || _roff)){
+ Scalar t;
+ // TODO (can do [[[slightly]]] better if we specialize for 0
+ return s_smulin(_domain.init(t,0));
+ }
+
+ // there has to be a way to use a
+ // low level mem* function to zero out a memory block
+ RawIterator a = rawBegin();
+ RawIterator b = rawEnd();
+ for(;a != b; ++a)
+ (*a).zero();
+
+ return *this;
+ }
+
+ bool isEqual(Sliced &other){
+ if (rows() != other.rows() || cols() != other.cols()) {
+ //std::cout << "shape mismatch" << std::endl;
+ return false;
+ }
+ // if(_loff || _roff || other._loff || other._roff){
+ // very slow... could be improved if both mats are aligned
+ Scalar x, y;
+ for(size_t i = 0; i<rows(); ++i)
+ for(size_t j = 0; j<cols(); ++j){
+ //std::cerr << getEntry(x, i, j) << "vs" << other.getEntry(y, i, j) << std::endl;
+ if(getEntry(x, i, j) != other.getEntry(y, i, j)) {
+ //std::cout << "entry mismatch " << i << " " << j << std::endl;
+ return false;
+ }
+ }
+ /* fails for very small (1 by 1) matrix.
+ }
+ else{
+ // otherwise just check _SIZE-bits at a time
+ // TODO could be faster w/ memcmp, but not applicable for breaks "aligned" submats
+ for(RawIterator a = rawBegin(), b=other.rawBegin(); a != rawEnd(); ++a, ++b){
+ //int count = 0;
+ if((*a) != (*b)){
+ //cerr << (*a).b0 << "ver" << (*b).b0 << endl;
+ //cerr << (*a).b1 << "ver" << (*b).b1 << endl;
+ return false;
+ }
+ }
+ }
+ */
+ return true;
+ }
+
+ bool isZero(){
+ if(_loff || _roff){
+ Scalar x;
+ for(size_t i = 0; i<rows(); ++i)
+ for(size_t j = 0; j<cols(); ++j)
+ if(getEntry(x, i, j))
+ return false;
+ }
+ else{
+ // otherwise just check _SIZE-bits at a time
+ // could prob be faster
+ for(RawIterator a = rawBegin(); a != rawEnd(); ++a){
+ if((*a).b0 || (*a).b1)
+ return false;
+ }
+ }
+ return true;
+ }
+
+ Sliced& deepcopy(Sliced &other){
+ if(_sub) return s_copy(other);
+
+ *this = other;
+ return *this;
+ }
+
+ std::ostream& writeRep(std::ostream &os = std::cerr){
+ for(RawIterator i=rawBegin(); i!=rawEnd(); ++i){
+ os << "0th bits: " << (SlicedWord)(*i).b0 << " 1st bits: " << (SlicedWord)(*i).b1 << std::endl;
+ }
+ os << std::endl;
+ return os;
+ }
+
+ size_t memSize(){
+ size_t bytesPerRow = ((_n + _SIZE-1)/_SIZE) * 2 * sizeof(SlicedWord);
+ return bytesPerRow * _m;
+ }
+
+ std::ostream& writeBinary(std::ostream &os){
+ if(_sub){ //std::cerr << "\n\nNear death!\n\n" << std::endl;
+ return s_wb(os); } // TODO fix
+
+ size_t bytes = memSize();
+ //std::cerr << "WRITE " << bytes << " BYTES." << std::endl;
+ os.write((char *)&(*_rep), bytes);
+
+ return os;
+ }
+
+ // assumes we're NOT a submatrix (read into contiguous block)
+ std::istream& readBinary(std::istream& is){
+ if(_sub){ //std::cerr << "\n\nDeath!\n\n" << std::endl;
+ return s_rb(is); }
+ size_t bytes = memSize();
+ is.read((char *)&(*_rep), bytes);
+ // std::cerr << "READ " << bytes << " BYTES." << std::endl;
+ return is;
+ }
+ /*
+ bool writeBinaryFile(const char *file){
+ ofstream bin;
+ bin.open(file, ios::out | ios::binary);
+ if(!bin){ std::cerr << "failure opening " << file << std::endl; return false; }
+ writeBinary(bin);
+ bin.close();
+ return true;
+ }
+
+ bool readBinaryFile(const char *file){
+ ifstream in;
+ in.open(file, ios::in | ios::binary);
+ if(!in){ std::cerr << "failure opening " << file << std::endl; return false; }
+ readBinary(in);
+ in.close();
+ return true;
+ }
+
+ void mmapFile(int fd){
+ if(_alloc){
+ std::cerr << "alloc'd matrix trying to mmap." << std::endl;
+ close(fd);
+ return;
+ }
+ size_t bytes = memSize();
+
+ //_rep = (Sliced::SlicedUnit *)mmap(0, bytes, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
+ //TODO MAP_HUGETLB
+ _rep = (Sliced::SlicedUnit *)mmap(0, bytes, PROT_READ | PROT_WRITE, MAP_SHARED , fd, 0);
+ if((void *)_rep == MAP_FAILED) {
+ close(fd);
+ perror("Error mapping the file.");
+ }
+ }
+
+ void mmapBinaryFile(const char *file){
+ int fd = open(file, O_RDWR);
+ if(fd == -1) {
+ perror("Error opening file to mmap.");
+ }
+ mmapFile(fd);
+ }
+ */
+ void munmapBinaryFile(){
+ size_t bytes = memSize();
+ munmap((void *)_rep, bytes);
+ }
+
+ _Domain& domain(){ return _domain; }
+
+ size_t rows(){ return _m; }
+ size_t cols(){ return _n; }
+ size_t rowdim()const{ return _m; }
+ size_t coldim()const{ return _n; }
+
+ size_t l(){ return _loff; }
+ size_t r(){ return _roff; }
+
+ // pointer/offset info for debugging
+ void pinfo(){
+ std::cerr << "Matrix @ ";
+ RawIterator i = rawBegin();
+ i.pinfo();
+ std::cerr << "\t" << _m << " x " << _n << std::endl;
+ std::cerr << "\tLO: " << _loff << " RO: " << _roff << std::endl;
+ std::cerr << std::endl;
+ }
+
+ // size info for debugging
+ void sinfo(){
+ std::cerr << "Matrix " << _m << " by " << _n << std::endl;
+ std::cerr << "... " << _m * _n / 4 << " bytes." << std::endl;
+ }
+
+private:
+ _Domain _domain;
+ size_t _m, _n;
+ bool _colPacked;
+ // SUBMATRIX
+ size_t _i, _j;
+ size_t _loff, _roff; //left & right offsets
+ size_t _SIZE;
+ bool _sub;
+}; // Sliced
+
+}
+
+#endif // __DENSE_SLICED_H
diff --git a/linbox/matrix/sliced3/dense-sliced.inl b/linbox/matrix/sliced3/dense-sliced.inl
new file mode 100644
index 0000000..72fb645
--- /dev/null
+++ b/linbox/matrix/sliced3/dense-sliced.inl
@@ -0,0 +1,391 @@
+#ifndef SLICED_INL
+#define SLICED_INL
+// This is designed to be included in the middle of the Sliced class declaration.
+
+/*
+ void splitOp(SlicedUnit &a, op_t t, bool first, int offset, int arg = 0, SlicedUnit &b = 0);
+ Sliced& s_addin(Sliced &other);
+ Sliced& s_smulin(Scalar &x);
+ Sliced & s_axpyin(RawIterator &b, RawIterator &e, Scalar &s, RawIterator &ob);
+*/
+
+ // addin, axpyin,
+ void compatible(){
+
+ }
+
+ // if we're a submatrix, we must not touch bits outside
+ // our boundary if we begin or end in the middle of a sliced word
+ // this helper function will do the operation
+ // a is the input/output sliced word. t is the operation
+ // "last" is false if [0,offset] part of word, true if [offset,_SIZE-1]
+ // arg is in case of smul or axpy, the scalar multiple
+ // b is the other word in case of a binary operation
+ void splitOp(SlicedUnit &a, op_t t, bool last, int offset, Scalar &arg, SlicedUnit &b){
+ //std::cerr << "DSINL" << std::endl;
+
+ SlicedWord computeMask;
+ SlicedWord one = (SlicedWord)1;
+
+ if(last)
+ computeMask = (one << offset) - 1; // 2^offset - 1
+ else
+ computeMask = ~((one << (_SIZE-offset)) - 1);
+
+ /*
+ cerr << "arg: " << arg << endl;
+ cerr << "COMPUTEMASK: " << computeMask << endl;
+ cerr << "0: " << a.b0 << " 1: " << a.b1 << endl;
+ */
+
+ SlicedUnit save = a & (~computeMask);
+
+ switch(t){
+ case AXPY:
+ if(arg == 2){
+ a += b*arg;
+ break;
+ }
+ // else arg will be 1, fall to add
+ case ADD:
+ a += b;
+ break;
+ case SMUL:
+ if(arg){
+ a *= arg;
+ break;
+ }
+ // else arg will be 0, fall to zero
+ case ZERO:
+ a.zero();
+ break;
+ case COPY:
+ a = b;
+ break;
+ }
+
+ a &= computeMask; // zero out bits that aren't "ours"
+ a |= save; // retrieve bits that we "never touched"
+ }
+
+ // specialized addin, care must be taken at beg. and end of rows
+ Sliced& s_addin(Sliced &other){
+ RawIterator rit = rawBegin();
+ RawIterator o = other.rawBegin();
+ Scalar t;
+
+ size_t i, j;
+ // loop all rows
+ for(i=0; i<rows(); ++i){
+ j = 0;
+ // do first elt
+ if(_loff){
+ splitOp(*rit, ADD, false, _loff, t, *o);
+ ++rit; ++o;
+ j+=_loff;
+ }
+ // do "middle" elts
+ for(; j<cols()-_roff; j+=_SIZE, ++rit, ++o)
+ (*rit) += (*o);
+ // do "last" elt
+ if(_roff){
+ splitOp(*rit, ADD, true, _roff, t, *o);
+ ++rit; ++o;
+ }
+ }
+ return *this;
+ }
+
+ // specialized smulin, care must be taken at beg. and end of rows
+ Sliced& s_smulin(Scalar &x){
+ RawIterator rit = rawBegin();
+ size_t i, j;
+ // loop all rows
+ for(i=0; i<rows(); ++i){
+ j = 0;
+ // do first elt
+ if(_loff){
+ splitOp(*rit, SMUL, false, _loff, x, *rit);
+ ++rit;
+ j+=_loff;
+ }
+ // do "middle" elts
+ if(x == 0){
+ for(; j<cols()-_roff; j+=_SIZE, ++rit){
+ //rit.pinfo();
+ (*rit).zero();
+ }
+ }
+ else{
+ for(; j<cols()-_roff; j+=_SIZE, ++rit){
+ (*rit) *= x;
+ }
+ }
+ // do "last" elt
+ if(_roff){
+ //cerr << "ROFF" << _roff << endl;
+ //rit.pinfo();
+ splitOp(*rit, SMUL, true, _roff, x, *rit);
+ ++rit;
+ }
+ }
+ return *this;
+ }
+
+ // arguments: begin iter, scalar, other mat's begin iter
+ Sliced & s_axpyin(RawIterator &rit, Scalar &s, RawIterator &o){
+ size_t j = 0;
+ // NO ROWS, WE ASSUME TO WORK ON A SINGLE ROW
+ j = 0;
+ // do first elt
+ if(_loff){
+ splitOp(*rit, AXPY, false, _loff, s, *o);
+ ++rit; ++o;
+ j+=_loff;
+ }
+ // do "middle" elts
+ if(s == 1){
+ for(; j<cols()-_roff; j+=_SIZE, ++rit, ++o)
+ (*rit) += (*o);
+ }
+ else if(s == 2){
+ for(; j<cols()-_roff; j+=_SIZE, ++rit, ++o)
+ (*rit) += (*o)*2;
+ }
+ // do "last" elt
+ if(_roff)
+ splitOp(*rit, ADD, true, _roff, s, *o);
+ // END OF (NO) ROWS
+ return *this;
+ }
+
+ // specialized copy, care must be taken at beg. and end of rows
+ Sliced & s_copy(Sliced &other){
+ RawIterator rit = rawBegin();
+ RawIterator o = other.rawBegin();
+
+ Scalar t;
+
+ /* for an undeveloped,
+ more complicated but likely faster
+ memcpy for middle of rows
+ int midSection = ((cols()-(_loff+_roff))+_SIZE-1)/_SIZE;
+ int bytes = midSection * 2 * sizeof(SlicedWord);
+ int data_offset = 0;
+ */
+
+ size_t i, j;
+ // loop all rows
+ for(i=0; i<rows(); ++i){
+ j = 0;
+ // do first elt
+ if(_loff){
+ splitOp(*rit, COPY, false, _loff, t, *o);
+ ++rit; ++o;
+ j+=_loff;
+ }
+ // do "middle" elts // TODO could be memcpy -> faster
+ for(; j<cols()-_roff; j+=_SIZE, ++rit, ++o)
+ (*rit) = (*o);
+ // do "last" elt
+ if(_roff){
+ splitOp(*rit, COPY, true, _roff, t, *o);
+ ++rit; ++o;
+ }
+ }
+ return *this;
+ }
+
+ // IF THERE IS A LEFT OFFSET (RIGHT OFFSET POSSIBLE, TOO)
+ // specialized copy, care must be taken at beg. and end of rows
+ std::ostream & s_write_bin(std::ostream &os){
+ // how many bits do we have room for?
+ int A = _SIZE - _loff;
+ int spill = _roff ? _roff - A : _SIZE - A;
+
+ SlicedWord one = (SlicedWord)1;
+ // lower bits mask
+ SlicedWord mask_lowbits = (one << A) - one;
+ // for last word, move _roff bits if _roff < A
+ SlicedWord last_mask;
+ last_mask = spill < 0 ? (one << _roff) - one : mask_lowbits;
+
+ // storing temp values
+ SlicedUnit lower, upper;
+ int SWsize = 2 * sizeof(SlicedWord);
+
+ // for rare case of only one sliced-word per row (< _SIZE elts)
+ bool onlyOne = false; // robusto
+
+ RawIterator rit, e;
+ // loop all rows
+ for(size_t i=0; i<rows(); ++i){
+
+ rit = rowBegin(i); // first in the row
+ e = ((rowEnd(i))); // e is after the last in the row
+ --e; // e is now the last in the row
+ if(rit == e) onlyOne=true; // if there's only one sliced word in this row
+ else --e; // e will now be the 2nd-to-last in the row
+
+ // iterate until 2nd to last word:
+ for( ; rit!=e; ){
+ // get "end" of "current" word and make it our beginning
+ lower = (*rit);
+ lower >>=A;
+ // move to next word
+ ++rit;
+ // get "beginning" of "next" word and make it our end
+ upper = (*rit);
+ (upper &= mask_lowbits) <<= _loff;
+ lower |= upper; // lower now has values we want
+ os.write((char *)&lower, SWsize); // write to file
+ }
+ // process the end of the row
+ lower = (*rit);
+ lower >>= A;
+ // no further data
+ if(onlyOne){
+ os.write((char *)&lower, SWsize);
+ }
+ else{ // one more word to split up
+ ++rit;
+ upper = (*rit);
+ (upper &= last_mask) <<= _loff;
+ lower |= upper;
+ os.write((char *)&lower, SWsize);
+ // process final word, if necessary
+ if(spill > 0){
+ lower = (*rit);
+ lower >>= A;
+ // mask to "our" bits
+ if(_roff)
+ lower &= ((one << spill) - one);
+ os.write((char *)&lower, SWsize); // write 2nd-to-final
+ }
+ }
+ }
+ return os;
+ }
+
+ // IF THERE IS A RIGHT-OFFSET ONLY
+ // specialized copy, care must only be taken at end of rows
+ std::ostream & s_write_bin_r(std::ostream &os){
+ // TODO - I can't just declare these
+ RawIterator rit = rowBegin(0); RawIterator e = rowEnd(0);
+
+ SlicedWord one = (SlicedWord)1;
+ // lower bits mask
+ SlicedWord right_mask = (one << _roff) - one;
+
+ // storing last word's temp value
+ SlicedUnit final;
+
+ // size of a sliced unit
+ int SWsize = 2 * sizeof(SlicedWord);
+ // accounts for all but the last sliced unit (the -1)
+ int bytesPerRow = (((_n + _SIZE-1)/_SIZE) - 1) * SWsize;
+
+ // loop all rows
+ for(size_t i=0; i<rows(); ++i){
+ // set up pointers
+ rit = rowBegin(i);
+ e = (--(rowEnd(i))); // the last sliced unit
+
+ // block write all but the last sliced unit:
+ os.write((char *)&(*rit), bytesPerRow);
+
+ // process the last unit:
+ final = (*e);
+ final &= right_mask; // cut down to size
+ os.write((char *)&final, SWsize);
+ }
+ return os;
+ }
+
+ // if we're a submatrix
+ std::ostream & s_wb(std::ostream &os){
+ if(_loff) return s_write_bin(os);
+ else if(_roff) return s_write_bin_r(os);
+
+ // else we're totally aligned,
+ // safe to write row at a time
+ int bytesPerRow = ((_n + _SIZE-1)/_SIZE) * 2 * sizeof(SlicedWord);
+
+ for(size_t i = 0; i < _m; ++i){
+ os.write((char *)(&*rowBegin(i)), bytesPerRow);
+ }
+
+ return os;
+ }
+
+ // ------------------------------------------------------------
+ // TODO: there is a major major hack here
+ // TODO: and it's serious.
+ // right now we're assuming we WANT zeroes in the last word
+ // there is NO MAINTAINING of the right half of the last word
+ // the way the fn is written.
+
+ // IF THERE IS A RIGHT-OFFSET ONLY
+ // specialized copy, care must only be taken at end of rows
+ std::istream & s_read_bin_r(std::istream &is){
+ //std::cerr << "Well, here we are..." << std::endl;
+ // TODO - I can't just declare these
+ RawIterator rit = rowBegin(0); RawIterator e = rowEnd(0);
+
+ //SlicedWord one = (SlicedWord)1;
+ // lower bits mask
+ //SlicedWord right_mask = (one << _roff) - one;
+ // storing last word's temp value
+ //SlicedUnit final;
+
+ // size of a sliced unit
+ int SWsize = 2 * sizeof(SlicedWord);
+ // accounts for all but the last sliced unit (the -1)
+ int bytesPerRow = (((_n + _SIZE-1)/_SIZE) - 1) * SWsize;
+
+ // loop all rows
+ for(size_t i=0; i<rows(); ++i){
+ // set up pointers
+ rit = rowBegin(i);
+ e = (--(rowEnd(i))); // the last sliced unit
+
+ // block read all but the last sliced unit:
+ is.read((char *)&(*rit), bytesPerRow);
+
+ // read the last one (should have zeros automatically
+ is.read((char *)&(*e), SWsize);
+
+ // should have zeroes automatically...
+ // following lines (form above) not needed
+
+ // process the last unit:
+ //final = (*e);
+ //final &= right_mask; // cut down to SWsize
+ //os.write((char *)&final, SWsize);
+ }
+ return is;
+ }
+
+ // if we're a submatrix
+ std::istream& s_rb(std::istream &is){
+ if(_loff){ std::cerr << "MEGA DEATH" << std::endl; exit(-1); }
+ if(_roff) return s_read_bin_r(is);
+
+ // else we're totally aligned,
+ // safe to write row at a time
+ int bytesPerRow = ((_n + _SIZE-1)/_SIZE) * 2 * sizeof(SlicedWord);
+
+ for(size_t i = 0; i < _m; ++i){
+ is.read((char *)(&*rowBegin(i)), bytesPerRow);
+ }
+
+ return is;
+ }
+
+/* // MUL:
+ Sliced & s_mul(Sliced& A, Sliced& B){
+ return *this;
+ }
+*/
+
+#endif // __SLICED_INL
diff --git a/linbox/matrix/sliced3/sliced-domain.h b/linbox/matrix/sliced3/sliced-domain.h
new file mode 100644
index 0000000..f31f964
--- /dev/null
+++ b/linbox/matrix/sliced3/sliced-domain.h
@@ -0,0 +1,165 @@
+#ifndef __SLICED_DOMAIN_H
+#define __SLICED_DOMAIN_H
+
+#include "dense-sliced.h"
+#include "linbox/matrix/matrix-domain.h"
+
+/*
+The SlicedDomain template over a Field type parameter has constructor from an instance of Field which must represent GF(3).
+The SlicedDomain::Matrix subtype meets the sliced dense matrix concept
+and it is the interface for working with sliced matrices.
+A Blackbox is any matrix type that has apply and applyTranspose applicable to Matrix. That is to say the signature of apply is
+ Matrix& Blackbox::apply(Matrix& Y, const Matrix& X)
+
+SlicedDomain provides, for A a Matrix and B a Blackbox(preconditioner)
+ mulin(A, B) // A *= B
+ addin(A, A2) // A += A2
+*/
+
+namespace LinBox {
+
+template<class Field, class WordT=unsigned long long int>
+class SlicedField : public Field {
+public:
+ SlicedField():Field(3) {}
+ SlicedField(size_t p, size_t e=1) : Field(p)
+ { if (p != 3 || e != 1) throw LinBoxError("bad field"); }
+};
+
+//template<>
+template<class _Field,class _WordT>
+class MatrixDomain<SlicedField<_Field,_WordT> > : public _Field {
+public:
+ typedef _Field Field;
+ typedef _WordT Word_T;
+ typedef typename _Field::Element Element;
+ typedef Element Scalar;
+ typedef Sliced<MatrixDomain> Matrix;
+ typedef Sliced<MatrixDomain> OwnMatrix;
+
+ MatrixDomain () : Field(3) {}
+ //MatrixDomain (size_t p, size_t e = 1) : Field(p, e) {}
+ MatrixDomain (size_t p, size_t e = 1) : Field(p)
+ { if (p != 3 || e != 1) throw LinBoxError("bad field"); }
+ MatrixDomain(const Field& F) : Field(3) {}
+ MatrixDomain(Field& F) : Field(3) {}
+
+ MatrixDomain& operator=(const MatrixDomain<SlicedField<Field, Word_T> >& R)
+ { static_cast<Field*>(this)->operator= (R); return *this; }
+
+// A domain provides field functions and (dense) matrix functions.
+
+// field functions
+ using Field::mOne;
+ using Field::zero;
+ using Field::one;
+ using Field::init;
+ using Field::add;
+ using Field::sub;
+ using Field::neg;
+ using Field::mul;
+ using Field::div;
+ using Field::inv;
+ using Field::axpy;
+ using Field::addin;
+ using Field::subin;
+ using Field::negin;
+ using Field::mulin;
+ using Field::divin;
+ using Field::invin;
+ using Field::axpyin;
+ using Field::isZero;
+ using Field::isOne;
+ using Field::areEqual;
+ using Field::cardinality;
+ using Field::characteristic;
+ using Field::write;
+ using Field::read;
+
+// matrix functions
+
+ // Y += X, where X and Y are conformally packed (both row or both col).
+ Matrix& addin (Matrix& Y, Matrix& X) {
+ return Y.addin(X);
+ }
+
+ // X *= a
+ Matrix& smulin (Matrix& X, Scalar& a) {
+ return X.smulin(a);
+ }
+
+ // X -= X
+ Matrix& neg (Matrix& X) {
+ return X.smulin(mOne);
+ }
+
+ // return C <-- A * B
+ // is assuming row sliced
+ template <class Gettable> // any matrix rep with getEntry().
+ Matrix & mul (Matrix& C, Gettable& A, Matrix& B){
+ return C.mul(A,B);
+ }
+
+ // A += x*B
+ Matrix& axpyin( Matrix& A, Scalar& x, Matrix &B) {
+ typename Matrix::RawIterator Ab(A.rawBegin()), Ae(A.rawEnd()), Bb(B.rawBegin());
+ return A.axpyin(Ab, Ae, x, Bb);
+ }
+
+ // C += A * B
+ Matrix& axpyin(Matrix& C, Matrix& A, Matrix &B) {
+ // temp mat to store mul
+ Matrix T;
+ T.init(A.rowdim(), B.coldim());
+ mul(T, A, B);
+ return addin(C, T);
+ }
+
+ Matrix& saxpyin(Matrix& Y, Scalar& a, Matrix& B) {
+ return axpyin(Y,a,B);
+ }
+
+ Matrix& random(Matrix &A, size_t seed=0) const {
+ return A.random(seed);
+ }
+
+ Matrix& clear(Matrix &A) const {
+ return A.zero();
+ }
+
+ // assignment operator will not be a deep copy
+ Matrix& deepcopy(Matrix &dst, Matrix& src) const {
+ return dst.deepcopy(src);
+ }
+
+ // submatrix is a Matrix member function, not here.
+ /*
+ Matrix& submatrix(Matrix& super, size_t i, size_t j, size_t m, size_t n) const {
+ return *(new Matrix(super, i, j, m, n));
+ }
+ */
+
+ bool areEqual(Matrix& A, Matrix &B) const {
+ return A.isEqual(B);
+ }
+
+ std::ostream& write(std::ostream& os, Matrix& A) const {
+ return A.write(os << A.rowdim() << " " << A.coldim() << std::endl);
+ }
+ std::istream& read(std::istream& is, Matrix& A) const {
+ size_t r, c;
+ Element x; init(x);
+ is >> r >> c;
+ A.init(r, c);
+ for (size_t i = 0; i < r; ++i)
+ for (size_t j = 0; j < c; ++j){
+ read(is, x);
+ A.setEntry(i, j, x);
+ }
+ return is;
+ }
+};
+
+}
+
+#endif // __SLICED_DOMAIN_H
diff --git a/linbox/matrix/sliced3/sliced-stepper.h b/linbox/matrix/sliced3/sliced-stepper.h
new file mode 100644
index 0000000..f304056
--- /dev/null
+++ b/linbox/matrix/sliced3/sliced-stepper.h
@@ -0,0 +1,63 @@
+#ifndef __SLICED_STEPPER_H
+#define __SLICED_STEPPER_H
+
+#include "dense-sliced.h"
+#include "sliced-domain.h"
+#include <linbox/field/modular.h>
+
+namespace LinBox{
+
+// To fill a sliced vector
+struct stepper {
+
+ typedef SlicedDomain<Givaro::Modular<uint8_t> > Domain;
+ typedef Sliced<Domain > Matrix;
+ typedef Matrix::Scalar Scalar;
+ typedef Matrix::RawIterator RawIterator;
+ typedef Matrix::SlicedUnit SlicedUnit;
+
+ Matrix &_A;
+ RawIterator _r;
+ size_t _i;
+ const static size_t SIZE = sizeof(Domain::Word_T)*8;
+ Scalar _store[SIZE];
+
+ stepper(Matrix & A) : _A(A), _r(_A.rawBegin()), _i(SIZE-1) { }
+
+ virtual inline void flush(){
+ //_r.pinfo();
+ //std::cerr << std::endl;
+ SlicedUnit &t = (*_r);
+ t.zero();
+ for(size_t i = _i + 1; i < SIZE; ++i){
+ //std::cerr << (int)_store[i] << " ";
+ /*
+ t <<= 1;
+ if(_store[i] > 1) t |= 1;
+ else t.b0 |= _store[i];
+ */
+ t <<= 1;
+ t.b1 |= ((_store[i] & 2) >> 1);
+ t.b0 |= ((_store[i] & 1) | t.b1);
+ //std::cerr << (int)t.b0 << " & " << (int)t.b1 << std::endl;
+ }
+ //std::cerr << "----------------" << std::endl;
+ _i = SIZE-1;
+ ++_r;
+ }
+
+ inline void step(Scalar e) {
+ //std::cerr << (int)e << " ";
+ _store[_i--] = e;
+ if(_i > SIZE) flush();
+ }
+
+ inline void row(){
+ if(_i != SIZE-1) flush();
+ }
+
+};
+
+} // LinBox
+
+#endif // __SLICED_STEPPER_H
diff --git a/linbox/matrix/sliced3/submat-iterator.h b/linbox/matrix/sliced3/submat-iterator.h
new file mode 100644
index 0000000..2454296
--- /dev/null
+++ b/linbox/matrix/sliced3/submat-iterator.h
@@ -0,0 +1,125 @@
+#ifndef __LINBOX_sliced3_SMI_H
+#define __LINBOX_sliced3_SMI_H
+
+namespace LinBox{
+
+template<typename E>
+struct SubMatIterator { // periodic gaps iterator
+ E * _me, * _end;
+ size_t _s1; //stride from end of a row to beginning of next.
+ size_t _s2; //stride from one row the next (same position in each).
+
+ SubMatIterator () : _me(0), _end(0), _s1(0), _s2(0) {
+ }
+
+ SubMatIterator (E* loc, size_t c = 0, size_t stride = 0)
+ : _me(loc), _end(loc+c), _s1(stride - c), _s2(stride) {
+// std::cerr << "created with " << c << std::endl;
+ }
+
+ SubMatIterator(const SubMatIterator& p)
+ : _me(p._me), _end(p._end), _s1(p._s1), _s2(p._s2) {
+ }
+
+ SubMatIterator& operator=(const SubMatIterator& p) {
+ _me = p._me; _end = p._end; _s1 = p._s1; _s2 = p._s2;
+ return *this;
+ }
+
+ /* debugging */
+ void pinfo(){
+ std::cerr << "Iterator info; me: " << _me << " end: " << _end << std::endl;
+ }
+
+ E& operator*() const { return *_me;
+ }
+
+ // untested
+ SubMatIterator operator+(int n) {
+ SubMatIterator p(*this); return p += n;
+ }
+
+ SubMatIterator& operator+=(size_t n) {
+ size_t q = n/(_s2 - _s1); // q is number of whole rows to jump
+ std::ptrdiff_t r = n - q*(_s2 - _s1);
+ size_t m = q*_s2;
+ _me += m + r; _end += m;
+ if (_end <= _me) { _me += _s1; _end += _s2; }
+ return *this;
+ }
+
+ SubMatIterator& operator++() {
+ if (++_me == _end) { _me += _s1; _end += _s2; }
+ return *this;
+ /*
+ bool a = (++_me == _end);
+ _me += (_s1 && a);
+ _end += (_s2 && a)
+ */
+ }
+
+ // untested
+ SubMatIterator operator++(int) {
+ SubMatIterator p(*this); ++*this; return p;
+ }
+
+ // untested
+ SubMatIterator& operator--() {
+ //if (--_me == _end + (_s2-_s1) - 1) { _me -= _s1; _end -= _s2; }
+ //Above broken. I think this fixes it: Bryan
+ if (--_me == (_end - (_s2-_s1+1))) { _me -= _s1; _end -= _s2; }
+ return *this;
+ }
+
+ // untested
+ SubMatIterator operator--(int) {
+ SubMatIterator p = *this; --*this; return p;
+ }
+
+ bool operator==(const SubMatIterator& b) const { return _me == b._me;
+ }
+
+ bool operator!=(const SubMatIterator& b) const { return _me != b._me;
+ }
+}; // SubMatIterator
+
+template<typename E>
+struct ConstSubMatIterator { // periodic gaps iterator
+ E * _me, * _end;
+ size_t _s1, _s2;
+
+ ConstSubMatIterator () : _me(0), _end(0), _s1(0), _s2(0) {
+ }
+ ConstSubMatIterator (E * loc, size_t c = 0, size_t stride = 0) : _me(loc), _end(loc+c), _s1(stride - c), _s2(stride) {
+ }
+
+ ConstSubMatIterator(const ConstSubMatIterator& p) : _me(p._me), _end(p._end), _s1(p._s1), _s2(p._s2) {
+ }
+
+ const E& operator*() const {
+ return *_me;
+ }
+
+ ConstSubMatIterator& operator++() {
+ ++_me; if (_me == _end) { _me += _s1; _end += _s2; } return *this;
+ }
+
+ bool operator==(const ConstSubMatIterator& b) const {
+ return _me == b._me;
+ }
+
+ bool operator!=(const ConstSubMatIterator& b) const {
+ return _me != b._me;
+ }
+
+}; // ConstSubMatIterator
+
+/*
+std::ostream& operator<< (std::ostream &out, const SubMatIterator& smi){
+ smi.pinfo();
+}
+*/
+
+} // LinBox
+
+#endif //__LINBOX_sliced3_SMI_H
diff --git a/linbox/matrix/slicedpolynomialmatrix/SlicedPolynomialMatrix.h b/linbox/matrix/slicedpolynomialmatrix/SlicedPolynomialMatrix.h
new file mode 100644
index 0000000..e9e68e1
--- /dev/null
+++ b/linbox/matrix/slicedpolynomialmatrix/SlicedPolynomialMatrix.h
@@ -0,0 +1,197 @@
+#ifndef __LINBOX_matrix_SlicedPolynomialMatrix_SlicedPolynomialMatrix_H
+#define __LINBOX_matrix_SlicedPolynomialMatrix_SlicedPolynomialMatrix_H
+
+#include <vector>
+#include "linbox/matrix/densematrix/blas-matrix.h"
+#include <givaro/modular.h>
+#include <givaro/givpoly1dense.h>
+#include <givaro/givpoly1denseops.inl>
+
+namespace Linbox
+{
+ template <class _Field, class _Storage, class _MatrixElement = double>
+ class SlicedPolynomialMatrix
+ /*Requirement: variable class _Field must be a representation of a field of order p^n
+ *and have functions that return p (characteristic()) and p^n(cardinality()).
+ *For example, GivaroGfq or LidiaGfq can be used.
+ */
+
+ /*Description: this class implements representation of a matrix over GF
+ *as a vector of length n of matrices over F (BlasMatrices),
+ *which corresponds to representation of this matrix as a polynomial of degree n-1 with matrix-coefficients.
+ */
+ {
+ public:
+ typedef _Field Field;
+ typedef typename Field::Element Element;
+ typedef _Storage Rep;
+ typedef _MatrixElement MatrixElement;
+ typedef Givaro::Modular<MatrixElement, MatrixElement> IntField;
+ typedef SlicedPolynomialMatrix<Field, Rep, MatrixElement> Self_t;
+ typedef Givaro::Poly1Dom<IntField, Dense>::Rep polynomial;
+ private:
+ Field GF;
+ IntField F;
+ private:
+ int n;//GF.cardinality() == p^n
+ std::vector<BlasMatrix<IntField>> V;
+ public:
+ polynomial irreducible;
+ private:
+ polynomial& modulo(polynomial& g, polynomial&h, polynomial& f);
+ bool rabin(int n, int q, int a, int b);
+ void setIrreduciblePlynomial(int max_steps = 1000000);
+
+ ////////////////
+ //Constructors//
+ ////////////////
+
+ public:
+ /*! Allocates a vector of new \f$ 0 \times 0\f$ matrices (shaped and ready). Irreducible polynomial is chosen randomly.
+ */
+ SlicedPolynomialMatrix (const Field &BF);
+
+ /*Allocates a vector of $ m1 \times m2\f$ zero matrices (shaped and ready). Irreducible polynomial is chosen randomly.
+ */
+ SlicedPolynomialMatrix (const Field &BF, const size_t & m1, const size_t &m2);
+
+ /*! Allocates a vector of new \f$ 0 \times 0\f$ matrices (shaped and ready).
+ */
+ SlicedPolynomialMatrix (const Field &BF, polynomial& pp);
+
+ /*Allocates a vector of $ m1 \times m2\f$ zero matrices (shaped and ready).
+ */
+ SlicedPolynomialMatrix (const Field &BF, const size_t & m1, const size_t &m2, polynomial& pp);
+
+ ///////////////
+ // Destructor//
+ ///////////////
+
+ public:
+ ~SlicedPolynomialMatrix();
+
+ ////////////////////////
+ //dimensions of vector//
+ ////////////////////////
+
+ public:
+ /*Get length of V.
+ * @returns length of V
+ */
+ size_t length() const;
+
+ /*Get the number of rows in a matrix.
+ * @returns Number of rows in a matrix
+ */
+ size_t rowdim() const;
+
+ /* Get the number of columns in a matrix.
+ * @returns Number of columns in a matrix
+ */
+ size_t coldim() const;
+
+ /////////////////
+ //return fields//
+ /////////////////
+
+ public:
+ const Field& fieldGF() const;
+
+ const IntField& fieldF() const;
+
+ /////////////////////////
+ //functions for entries//
+ /////////////////////////
+
+ public:
+ /* Set the entry of the m-th matrix-coefficient at the (i, j) position to a_mij.
+ * @param m matrix-coefficient number, 0...length() - 1
+ * @param i Row number, 0...rowdim () - 1
+ * @param j Column number 0...coldim () - 1
+ * @param a_mij Element to set
+ */
+ void setEntry (size_t m, size_t i, size_t j, const MatrixElement &a_mij);
+
+ private:
+ /* Get a writeable reference to the m-th matrix-coefficient at the (i, j) position.
+ * @param m matrix-coefficient number, 0...length() - 1
+ * @param i Row index of entry
+ * @param j Column index of entry
+ * @returns Reference to matrix entry
+ */
+ MatrixElement &refEntry (size_t m, size_t i, size_t j);
+
+ public:
+ /* Get a read-only reference to the m-th matrix-coefficient at the (i, j) position.
+ * @param m matrix-coefficient number, 0...length() - 1
+ * @param i Row index
+ * @param j Column index
+ * @returns Const reference to matrix entry
+ */
+ MatrixElement &getEntry (size_t m, size_t i, size_t j);
+
+ /////////////////////////////////////
+ //functions for matrix-coefficients//
+ /////////////////////////////////////
+
+ public:
+ /* Set the m-th matrix-coefficient to V_m.
+ * @param m matrix-coefficient number, 0...length() - 1
+ * @param V_m matrix to set
+ */
+ void setMatrixCoefficient (size_t m, const BlasMatrix<IntField> &V_m) ;
+
+ private:
+ /* Get a writeable reference to the m-th matrix-coefficient.
+ * @param m matrix-coefficient number, 0...length() - 1
+ * @returns Reference to matrix-coefficent
+ */
+ BlasMatrix<IntField> &refMatrixCoefficient (size_t m) ;
+
+ public:
+ /** Get a read-only reference to the m-th matrix-coefficient
+ * @param m matrix-coefficient number, 0...length() - 1
+ * @returns Const reference to matrix-coefficent
+ */
+ const BlasMatrix<IntField> &getMatrixCoefficient (size_t m) const ;
+
+ /////////
+ //swaps//
+ /////////
+
+ public:
+ /* Swap i1-th and i2-th rows of matrices.
+ * This is done inplace.
+ */
+ void swapRows(size_t i1, size_t i2);
+
+ /* Swap j1-th and j2-th columns of matrices.
+ * This is done inplace.
+ */
+ void swapCols(size_t j1, size_t j2);
+
+ /////////////
+ //transpose//
+ /////////////
+
+ public:
+ /* Creates a transposed polynomial matrix of this.
+ * @param[in] tV
+ * @return the transposed polynomial matrix of this.
+ */
+ Self_t transpose(Self_t & tV) const;
+
+ //////////////////
+ //input / output//
+ //////////////////
+
+ public:
+ std::istream &read (std::istream &file);
+
+ std::ostream &write (std::ostream &os) const;
+ };
+}
+
+#include "SlicedPolynomialMatrix.inl"
+
+#endif
diff --git a/linbox/matrix/slicedpolynomialmatrix/SlicedPolynomialMatrix.inl b/linbox/matrix/slicedpolynomialmatrix/SlicedPolynomialMatrix.inl
new file mode 100644
index 0000000..59b92be
--- /dev/null
+++ b/linbox/matrix/slicedpolynomialmatrix/SlicedPolynomialMatrix.inl
@@ -0,0 +1,376 @@
+#ifndef __LINBOX_matrix_SlicedPolynomialMatrix_SlicedPolynomialMatrix_INL
+#define __LINBOX_matrix_SlicedPolynomialMatrix_SlicedPolynomialMatrix_INL
+
+namespace Linbox
+{
+ //////////////////////////
+ //irreducible polynomial//
+ //////////////////////////
+
+ template < class _Field, class _Rep, class _MatrixElement >
+ polynomial& SlicedPolynomialMatrix< _Field, _Rep, _MatrixElement >::modulo(polynomial& g, polynomial&h, polynomial& f)
+ {
+ polynomial w1;
+ Poly1Dom<Domain,Dense>::div(w1, h, f);
+ polynomial w2;
+ Poly1Dom<Domain,Dense>::mul(w2, w1, f);
+ Poly1Dom<Domain,Dense>::sub(g, h, w2);
+ return g;
+ }
+
+ /*
+ algorithm description
+ http://en.wikipedia.org/wiki/Factorization_of_polynomials_over_finite_fields#Rabin.27s_test_of_irreducibility
+ Algorithm Rabin Irreducibility Test
+ Input: A monic polynomial f in Fq[x] of degree n,
+ p1, ..., pk all distinct prime divisors of n.
+ Output: Either "f is irreducible" or "f is reducible".
+ Begin
+ for j = 1 to k do
+ n_j=n/p_j;
+ for i = 1 to k do
+ h:=x^{q^{n_i}}-x \bmod f;
+ g := gcd(f, h);
+ if g ? 1, then return 'f is reducible' and STOP;
+ end for;
+ h:= x^{q^{n}}-x \bmod f;
+ if h = 0, then return "f is irreducible",
+ else return "f is reducible"
+ end.
+ */
+ /*
+ function description
+ Fq[x], f = x^n + bx + a
+ returns true if f is irreducible and false if f is reducible
+ */
+ template < class _Field, class _Rep, class _MatrixElement >
+ bool SlicedPolynomialMatrix< _Field, _Rep, _MatrixElement >::rabin(int n, int q, int a, int b)
+ {
+ polynomial f(n + 1);
+ f[0] = a;
+ f[1] = b;
+ for (int i = 2; i < n; i++)
+ {
+ f[i] = 0;
+ }
+ f[n] = 1;
+ std::vector<int> pd;
+ factorize(n, pd); //factorizes n into primes
+ //n = pd[0]^alpha[0] * ... * pd[k - 1]^alpha[k - 1]
+ int k = pd.size();
+ std::vector<int> nd(k);
+ for (int j = 0; j < k; j++)
+ {
+ nd[j] = n / pd[j];
+ }
+ polynomial vector_zero();
+ assign(vector_zero, 0);
+ polynomial vector_one();
+ assign(vector_one, 1);
+ for (int j = 0; j < k; j++)
+ {
+ int h_size = pow(q, nd[j]) + 1;
+ polynomial h(h_size);
+ h[0] = 0;
+ h[1] = -1;
+ for (int i = 2; i < h_size - 1; i++)
+ {
+ h[i] = 0;
+ }
+ h[h_size - 1] = 1;
+ polynomial g;
+ Poly1Dom<IntField, Dense>::gcd (g, f, h);
+ bool g_equals_1 = g.areEqual(vector_one);
+ if (! g_equals_1)
+ {
+ return true; //f is irreducible
+ }
+ }
+ int h_size = pow(q, n) + 1;
+ polynomial h(h_size);
+ h[0] = 0;
+ h[1] = -1;
+ for (int i = 2; i < h_size - 1; i++)
+ {
+ h[i] = 0;
+ }
+ h[h_size - 1] = 1;
+ polynomial g;
+ modulo(g, h, f);//!!!
+ bool g_equals_0 = g.areEqual(vector_zero);
+ return g_equals_0; //if g = 0, then return "f is irreducible", else return "f is reducible"
+ }
+
+ template < class _Field, class _Rep, class _MatrixElement >
+ void SlicedPolynomialMatrix< _Field, _Rep, _MatrixElement >::setIrreduciblePlynomial(int max_steps)
+ {
+ bool found = false;
+ int w = F.characteristic();
+ for (int step = 0; (step < max_steps) && (!found); step++)
+ {
+ int a = rand() % w;
+ int b = rand() % w;
+ if (a + b > 0)
+ {
+ found = rabin(n, w, a, b);
+ }
+ }
+ irreducible.push_back(a);
+ irreducible.push_back(b);
+ for (int i = 1; i < n; i++)
+ {
+ irreducible.push_back(0);
+ }
+ irreducible.push_back(1);
+ return;
+ }
+
+ ////////////////
+ //Constructors//
+ ////////////////
+
+ template < class _Field, class _Rep, class _MatrixElement >
+ SlicedPolynomialMatrix< _Field, _Rep, _MatrixElement >::SlicedPolynomialMatrix (const _Field &BF)
+ {
+ GF = BF;
+ F_temp = IntField(GF.characteristic()); //public function to set characteristic?
+ F = F_temp;
+ int n = GF.exponent(); //GF = GF(p^n)
+ for (size_t m = 0; m < n; m++)
+ {
+ V.emplace_back(BlasMatrix<IntField>(F));
+ }
+ setIrreduciblePolynomial();
+ }
+
+ template < class _Field, class _Rep, class _MatrixElement >
+ SlicedPolynomialMatrix< _Field, _Rep, _MatrixElement >::SlicedPolynomialMatrix (const _Field &BF, const size_t & m1, const size_t &m2)
+ {
+ GF = BF;
+ F_temp = IntField(GF.characteristic()); //public function to set characteristic?
+ F = F_temp;
+ int n = GF.exponent(); //GF = GF(p^n)
+ for (size_t m = 0; m < n; m++)
+ {
+ V.emplace_back(BlasMatrix<IntField>(F, m1, m2));
+ }
+ setIrreduciblePolynomial();
+ }
+
+ template < class _Field, class _Rep, class _MatrixElement >
+ SlicedPolynomialMatrix< _Field, _Rep, _MatrixElement >::SlicedPolynomialMatrix (const _Field &BF, polynomial& pp)
+ {
+ GF = BF;
+ F_temp = IntField(GF.characteristic()); //public function to set characteristic?
+ F = F_temp;
+ int n = GF.exponent(); //GF = GF(p^n)
+ for (size_t m = 0; m < n; m++)
+ {
+ V.emplace_back(BlasMatrix<IntField>(F));
+ }
+ irreducible = pp;
+ }
+
+ template < class _Field, class _Rep, class _MatrixElement >
+ SlicedPolynomialMatrix< _Field, _Rep, _MatrixElement >::SlicedPolynomialMatrix (const _Field &BF, const size_t & m1, const size_t &m2, polynomial& pp)
+ {
+ GF = BF;
+ F_temp = IntField(GF.characteristic()); //public function to set characteristic?
+ F = F_temp;
+ int n = GF.exponent(); //GF = GF(p^n)
+ for (size_t m = 0; m < n; m++)
+ {
+ V.emplace_back(BlasMatrix<IntField>(F, m1, m2));
+ }
+ irreducible = pp;
+ }
+
+ ///////////////
+ // Destructor//
+ ///////////////
+
+ template < class _Field, class _Rep, class _MatrixElement >
+ SlicedPolynomialMatrix< _Field, _Rep, _MatrixElement >::~SlicedPolynomialMatrix()
+ {
+ //LidiaGfq has a destructor, GivaroGfq doesn't, so currently field type members GF and F are not destroyed
+ V.~vector();
+ //if some members are added, delete them
+ }
+ ////////////////////////
+ //dimensions of vector//
+ ////////////////////////
+
+ template < class _Field, class _Rep, class _MatrixElement >
+ size_t SlicedPolynomialMatrix< _Field, _Rep, _MatrixElement >::length() const
+ {
+ return V.size();
+ }
+
+ template < class _Field, class _Rep, class _MatrixElement >
+ size_t SlicedPolynomialMatrix< _Field, _Rep, _MatrixElement >::rowdim() const
+ {
+ return V[0].rowdim();
+ }
+
+ template < class _Field, class _Rep, class _MatrixElement >
+ size_t SlicedPolynomialMatrix< _Field, _Rep, _MatrixElement >::coldim() const
+ {
+ return V[0].coldim();
+ }
+
+ /////////////////
+ //return fields//
+ /////////////////
+
+ template < class _Field, class _Rep, class _MatrixElement >
+ const Field& SlicedPolynomialMatrix< _Field, _Rep, _MatrixElement >::fieldGF() const
+ {
+ return GF;
+ }
+
+ template < class _Field, class _Rep, class _MatrixElement >
+ const IntField& SlicedPolynomialMatrix< _Field, _Rep, _MatrixElement >::fieldF() const
+ {
+ return F;
+ }
+
+ /////////////////////////
+ //functions for entries//
+ /////////////////////////
+
+ template < class _Field, class _Rep, class _MatrixElement >
+ void SlicedPolynomialMatrix< _Field, _Rep, _MatrixElement >::setEntry (size_t m, size_t i, size_t j, const MatrixElement &a_mij)
+ {
+ V[m].setEntry(i, j, a_mij);
+ }
+
+ template < class _Field, class _Rep, class _MatrixElement >
+ _MatrixElement & SlicedPolynomialMatrix< _Field, _Rep, _MatrixElement >::refEntry (size_t m, size_t i, size_t j)
+ {
+ return V[m].refEntry(i, j);
+
+ }
+
+ template < class _Field, class _Rep, class _MatrixElement >
+ _MatrixElement & SlicedPolynomialMatrix< _Field, _Rep, _MatrixElement >::getEntry (size_t m, size_t i, size_t j)
+ {
+ return V[m].getEntry(i, j);
+
+ }
+
+ /////////////////////////////////////
+ //functions for matrix-coefficients//
+ /////////////////////////////////////
+
+ template < class _Field, class _Rep, class _MatrixElement >
+ void SlicedPolynomialMatrix< _Field, _Rep, _MatrixElement >::setMatrixCoefficient (size_t m, const BlasMatrix<IntField> &V_m)
+ {
+ V[m] = V_m;
+ }
+
+ template < class _Field, class _Rep, class _MatrixElement >
+ BlasMatrix<IntField> &SlicedPolynomialMatrix< _Field, _Rep, _MatrixElement >::refMatrixCoefficient (size_t m)
+ {
+ return V[m];
+ }
+
+ template < class _Field, class _Rep, class _MatrixElement >
+ const BlasMatrix<IntField> &SlicedPolynomialMatrix< _Field, _Rep, _MatrixElement >::getMatrixCoefficient (size_t m) const
+ {
+ return V[m];
+ }
+
+ /////////
+ //swaps//
+ /////////
+
+ template < class _Field, class _Rep, class _MatrixElement >
+ void SlicedPolynomialMatrix< _Field, _Rep, _MatrixElement >::swapRows(size_t i1, size_t i2)
+ {
+ for (size_t m = 0; m < this->length(); m++)
+ {
+ for (size_t j = 0; j < this->coldim(); j++)
+ {
+ MatrixElement c = this->getEntry(m, i1, j);
+ this->setEntry(m, i1, j, this->getEntry(m, i2, j));
+ this->setEntry(m, i2, j, c);
+ }
+ }
+ }
+
+ template < class _Field, class _Rep, class _MatrixElement >
+ void SlicedPolynomialMatrix< _Field, _Rep, _MatrixElement >::swapCols(size_t j1, size_t j2)
+ {
+ for (size_t m = 0; m < this->length(); m++)
+ {
+ for (size_t i = 0; i < this->colrow(); i++)
+ {
+ MatrixElement c = this->getEntry(m, i, j1);
+ this->setEntry(m, i, j1, this->getEntry(m, i, j2));
+ this->setEntry(m, i, j2, c);
+ }
+ }
+ }
+
+ /////////////
+ //transpose//
+ /////////////
+
+ template < class _Field, class _Rep, class _MatrixElement >
+ SlicedPolynomialMatrix< _Field, _Rep, _MatrixElement > SlicedPolynomialMatrix< _Field, _Rep, _MatrixElement >::transpose(SlicedPolynomialMatrix< _Field, _Rep, _MatrixElement > & tV) const
+ {
+ //check dimensions
+ for (size_t m = 0; m < this->length(); m++)
+ {
+ this->getMatrixCoefficent(m).transpose(tV.refMatrixCoefficent(m));
+ }
+ return tV;
+ }
+
+ //////////////////
+ //input / output//
+ //////////////////
+ template < class _Field, class _Rep, class _MatrixElement >
+ std::istream& SlicedPolynomialMatrix< _Field, _Rep, _MatrixElement >::read (std::istream &file)
+ {
+ int K = this->length();
+ int I = this->rowdim();
+ int J = this->coldim();
+ MatrixElement c;
+ for (int k = 0; k < K; k++)
+ {
+ for (int i = 0; i < I; i++)
+ {
+ for (int j = 0; j < J; j++)
+ {
+ file >> c;
+ this->setEntry(k, i, j, c);
+ }
+ }
+ }
+ return file;
+ }
+
+ template < class _Field, class _Rep, class _MatrixElement >
+ std::ostream& SlicedPolynomialMatrix< _Field, _Rep, _MatrixElement >::write (std::ostream &file)
+ {
+ int K = this->length();
+ int I = this->rowdim();
+ int J = this->coldim();
+ for (int k = 0; k < K; k++)
+ {
+ for (int i = 0; i < I; i++)
+ {
+ for (int j = 0; j < J; j++)
+ {
+ file << this->getEntry(k, i, j) << " ";
+ }
+ file << std::endl;
+ }
+ file << std::endl;
+ }
+ return file;
+ }
+}
+
+#endif
\ No newline at end of file
diff --git a/linbox/matrix/slicedpolynomialmatrix/SlicedPolynomialMatrixAddSub.h b/linbox/matrix/slicedpolynomialmatrix/SlicedPolynomialMatrixAddSub.h
new file mode 100644
index 0000000..cfdf21b
--- /dev/null
+++ b/linbox/matrix/slicedpolynomialmatrix/SlicedPolynomialMatrixAddSub.h
@@ -0,0 +1,53 @@
+#ifndef __LINBOX_matrix_SlicedPolynomialMatrix_SlicedPolynomialMatrixAddSub_H
+#define __LINBOX_matrix_SlicedPolynomialMatrix_SlicedPolynomialMatrixAddSub_H
+
+#include <vector>
+#include "linbox/matrix/matrixdomain/blas-matrix-domain.h"
+#include "linbox/matrix/slicedpolynomialmatrix/SlicedPolynomialMatrix.h"
+
+namespace LinBox
+{
+ /* internal
+ * Adding two matrices
+ */
+ template< class Field, class Operand1, class Operand2, class Operand3>
+ class SlicedPolynomialMatrixAdd
+ {
+ public:
+ Operand1 &operator() (const Field &F, Operand1 &C, const Operand2 &A, const Operand3 &B) const;
+
+ };
+
+ /* internal
+ * Substracting two matrices
+ */
+ template< class Field, class Operand1, class Operand2, class Operand3>
+ class SlicedPolynomialMatrixSub
+ {
+ public:
+ Operand1 &operator() (const Field &F, Operand1 &C, const Operand2 &A, const Operand3 &B) const;
+
+ };
+
+ //! C += A
+ template< class Field, class Operand1, class Operand2>
+ class SlicedPolynomialMatrixAddin
+ {
+ public:
+ Operand1 &operator() (const Field &F, Operand1 &C, const Operand2 &A) const;
+
+ };
+
+ //! C -= A
+ template< class Field, class Operand1, class Operand2>
+ class SlicedPolynomialMatrixSubin
+ {
+ public:
+ Operand1 &operator() (const Field &F, Operand1 &C, const Operand2 &A) const;
+
+ };
+} /* end of namespace LinBox */
+
+#include "SlicedPolynomialMatrixAddSub.inl"
+
+#endif
diff --git a/linbox/matrix/slicedpolynomialmatrix/SlicedPolynomialMatrixAddSub.inl b/linbox/matrix/slicedpolynomialmatrix/SlicedPolynomialMatrixAddSub.inl
new file mode 100644
index 0000000..0b2f2e3
--- /dev/null
+++ b/linbox/matrix/slicedpolynomialmatrix/SlicedPolynomialMatrixAddSub.inl
@@ -0,0 +1,75 @@
+#ifndef __LINBOX_matrix_SlicedPolynomialMatrix_SlicedPolynomialMatrixAddSub_INL
+#define __LINBOX_matrix_SlicedPolynomialMatrix_SlicedPolynomialMatrixAddSub_INL
+
+namespace LinBox
+{
+ template<class Field, class Vector1, class Vector2, class Vector3>
+ Vector1& SlicedPolynomialMatrixAdd<Field, Vector1, Vector2, Vector3 >::operator()(const Field& F,
+ Vector1& C,
+ const Vector2& A,
+ const Vector3& B) const
+ {
+ //check dimensions
+ BlasMatrix<Vector1::IntField> M(C.fieldF(), A.rowdim(), B.coldim());
+ for (int m = 0; m < C.length(); m++)
+ {
+ BlasMatrixDomainAdd<Vector1::IntField, BlasMatrix<Vector1::IntField>, BlasMatrix<Vector2::IntField>, BlasMatrix<Vector3::IntField>>()(C.fieldF(),
+ M, A.getMatrixCoefficient(m), B.getMatrixCoefficient(m));
+ C.setMatrixCoefficient(m, M);
+ }
+ return C;
+ }
+
+ template<class Field, class Vector1, class Vector2, class Vector3>
+ Vecto1r& SlicedPolynomialMatrixSub<Field, Vector1, Vector2, Vector3 >::operator()(const Field& F,
+ Vector1& C,
+ const Vector2& A,
+ const Vector3& B) const
+ {
+ //check dimensions
+ BlasMatrix<Vector1::IntField> M(F, A.rowdim(), B.coldim());
+ for (int m = 0; m < C.length(); m++)
+ {
+ BlasMatrixDomainSub<Vector1::IntField, BlasMatrix<Vector1::IntField>, BlasMatrix<Vector2::IntField>, BlasMatrix<Vector3::IntField>>()(C.fieldF(),
+ M, A.getMatrixCoefficient(m), B.getMatrixCoefficient(m));
+ C.setMatrixCoefficient(m, M);
+ }
+ return C;
+ }
+
+ template<class Field, class Vector1, class Vector3>
+ Vector1& SlicedPolynomialMatrixAddin<Field, Vector1, Vector3 >::operator()(const Field& F,
+ Vector1& C,
+ const Vector3& B) const
+ {
+ //check dimensions
+ BlasMatrix<Vector1::IntField> M(F, B.rowdim(), B.coldim());
+ for (int m = 0; m < C.length(); m++)
+ {
+ M = C.getMatrixCoefficient(m);
+ BlasMatrixDomainAddin<Vector1::IntField, BlasMatrix<Vector1::IntField>, BlasMatrix<Vector3::IntField>>()(C.fieldF(),
+ M, A.getMatrixCoefficient(m), B.getMatrixCoefficient(m));
+ C.setMatrixCoefficient(m, M);
+ }
+ return C;
+ }
+
+ template<class Field, class Vector1, class Vector3>
+ Vector1& SlicedPolynomialMatrixSubin<Field, Vector1, Vector3 >::operator()(const Field& F,
+ Vector1& C,
+ const Vector3& B) const
+ {
+ //check dimensions
+ BlasMatrix<Vector1::IntField> M(F, B.rowdim(), B.coldim());
+ for (int m = 0; m < C.length(); m++)
+ {
+ M = C.getMatrixCoefficient(m);
+ BlasMatrixDomainAddin<Vector1::IntField, BlasMatrix<Vector1::IntField>, BlasMatrix<Vector3::IntField>>()(C.fieldF(),
+ M, A.getMatrixCoefficient(m), B.getMatrixCoefficient(m));
+ C.setMatrixCoefficient(m, M);
+ }
+ return C;
+ }
+} // LinBox
+
+#endif
\ No newline at end of file
diff --git a/linbox/matrix/slicedpolynomialmatrix/SlicedPolynomialMatrixMulKaratsuba.h b/linbox/matrix/slicedpolynomialmatrix/SlicedPolynomialMatrixMulKaratsuba.h
new file mode 100644
index 0000000..93c6e76
--- /dev/null
+++ b/linbox/matrix/slicedpolynomialmatrix/SlicedPolynomialMatrixMulKaratsuba.h
@@ -0,0 +1,26 @@
+#ifndef __LINBOX_matrix_SlicedPolynomialMatrix_SlicedPolynomialMatrixMulKaratsuba_H
+#define __LINBOX_matrix_SlicedPolynomialMatrix_SlicedPolynomialMatrixMulKaratsuba_H
+
+#include "SlicedPolynomialMatrix.h"
+#include "SlicedPolynomialMatrixAddSub.h"
+
+namespace LinBox
+{
+ template< class Field, class Operand1, class Operand2, class Operand3>
+ class SlicedPolynomialMatrixMulKaratsuba
+ {
+ private:
+ typedef Operand1::IntField IntField;
+ typedef BlasMatrix<IntField> Matrix;
+ typedef std::vector<BlasMatrix<Operand1::IntField>> vec;
+ typedef Operand1::polynomial polynomial;
+ vec& modulo(vec& C, int n, polynomial irreducible);
+ vec& karatsuba(IntField& F, vec& A, vec& B, vec& C);
+ public:
+ Operand1 &operator() (const Field &GF, Operand1 &C, const Operand2 &A, const Operand3 &B) const;
+ };
+} /* end of namespace LinBox */
+
+#include "SlicedPolynomialMatrixMulKaratsuba.inl"
+
+#endif
\ No newline at end of file
diff --git a/linbox/matrix/slicedpolynomialmatrix/SlicedPolynomialMatrixMulKaratsuba.inl b/linbox/matrix/slicedpolynomialmatrix/SlicedPolynomialMatrixMulKaratsuba.inl
new file mode 100644
index 0000000..c988bb1
--- /dev/null
+++ b/linbox/matrix/slicedpolynomialmatrix/SlicedPolynomialMatrixMulKaratsuba.inl
@@ -0,0 +1,258 @@
+#ifndef __LINBOX_matrix_SlicedPolynomialMatrix_SlicedPolynomialMatrixMulKaratsuba_INL
+#define __LINBOX_matrix_SlicedPolynomialMatrix_SlicedPolynomialMatrixMulKaratsuba_INL
+
+#include <givaro/givpoly1dense.h>
+#include <givaro/givpoly1denseops.inl>
+
+namespace LinBox
+{
+ template<class Field, class Vector3, class Vector1, class Vector2>
+ SlicedPolynomialMatrixMulKaratsuba<Field, Vector3, Vector1, Vector2 >::vec&
+ SlicedPolynomialMatrixMulKaratsuba<Field, Vector3, Vector1, Vector2 >::modulo(vec& C, int n, polynomial irreducible)
+ {
+ int m = C.size();
+ int mi = C[0].rowdim();
+ int mj = C[0].coldim();
+ vec result(n, mi, mj);
+ for (int i = 0; i < mi; i++)
+ {
+ for (int j = 0; j < mj; j++)
+ {
+ polynomial entry;
+ for (int k = 0; k < mk; k++)
+ {
+ entry.push_back(C[k].getEntry(i, j));
+ }
+ polynomial w1;
+ Poly1Dom<IntField,Dense>::div(w1, entry, irreducible);
+ polynomial w2;
+ Poly1Dom<IntField,Dense>::mul(w2, w1, irreducible);
+ Poly1Dom<IntField,Dense>::sub(w1, entry, w2);
+ for (int k = 0; k < n; k++)
+ {
+ result[k].setEntry(i, j, w1[k]);
+ }
+ }
+ }
+ C = result;
+ return C;
+ }
+
+ template<class Field, class Vector3, class Vector1, class Vector2>
+ SlicedPolynomialMatrixMulKaratsuba<Field, Vector3, Vector1, Vector2 >::vec&
+ SlicedPolynomialMatrixMulKaratsuba<Field, Vector3, Vector1, Vector2 >::karatsuba(IntField& F, vec& C, vec& A, vec& B)
+ {
+ if (A.size() == 1)
+ {
+ for (int i = 0; i <B.size(); i++)
+ {
+ BlasMatrixDomainMul<IntField, Matrix, Matrix, Matrix>()(F, C[i], A[0], B[i]);
+ }
+ return C;
+ }
+ if (B.size() == 1)
+ {
+ for (int i = 0; i < A.size(); i++)
+ {
+ BlasMatrixDomainMul<IntField, Matrix, Matrix, Matrix>()(F, C[i], A[i], B[0]);
+ }
+ return C;
+ }
+ int m = (A.size() < B.size()) ? (B.size() / 2) : (A.size() / 2);
+ if ((m < A.size()) && (m < B.size()))
+ {
+ vec A1(A.begin(), A.begin() + m);
+ vec A2(A.begin() + m, A.end());
+ vec B1(B.begin(), B.begin() + m);
+ vec B2(B.begin() + m, B.end());
+ vec A3;
+ int minlength_a = (A1.size() < A2.size()) ? A1.size() : A2.size();
+ int minlength_a = (A1.size() < A2.size()) ? A2.size() : A1.size();
+ for (int i = 0; i < minlength_a; i++)
+ {
+ Matrix AA(F, A.rowdim(), A.coldim());
+ A3.push_back(BlasMatrixDomainAdd<IntField, Matrix, Matrix, Matrix>()(F, AA, A1[i], A2[i]));
+ }
+ if (maxlength_a == A1.size())
+ {
+ for (int i = minlength_a; i < maxlength_a; i++)
+ {
+ A3.push_back(A1[i]);
+ }
+ }
+ else
+ {
+ for (int i = minlength_a; i < maxlength_a; i++)
+ {
+ A3.push_back(A2[i]);
+ }
+ }
+ vec B3;
+ int minlength_b = (B1.size() < B2.size()) ? B1.size() : B2.size();
+ int maxlength_b = (B1.size() < B2.size()) ? B2.size() : B1.size();
+ for (int i = 0; i < minlength_b; i++)
+ {
+ Matrix BB(F, B.rowdim(), B.coldim());
+ B3.push_back(BlasMatrixDomainAdd<IntField, Matrix, Matrix, Matrix>()(F, BB, B1[i], B2[i]));
+ }
+ if (maxlength_b == B1.size())
+ {
+ for (int i = minlength_b; i < maxlength_b; i++)
+ {
+ B3.push_back(B1[i]);
+ }
+ }
+ else
+ {
+ for (int i = minlength_b; i < maxlength_b; i++)
+ {
+ B3.push_back(B1[i]);
+ }
+ }
+ vec C1;
+ vec C2;
+ vec C3;
+ Matrix CC(F, A.rowdim(), B.coldim());
+ int xx;
+ xx = A1.size() + B1.size() - 1;
+ for (int i = 0; i < xx; i++)
+ {
+ C1.push_back(CC);
+ }
+ xx = A2.size() + B2.size() - 1;
+ for (int i = 0; i < xx; i++)
+ {
+ C2.push_back(CC);
+ }
+ xx = A3.size() + B3.size() - 1;
+ for (int i = 0; i < xx; i++)
+ {
+ C3.push_back(CC);
+ }
+ karatsuba(F, C1, A1, B1);
+ karatsuba(F, C2, A2, B2);
+ karatsuba(F, C3, A3, B3);
+ for (int i = 0; i < C1.size(); i++)
+ {
+ BlasMatrixDomainAddin<IntField, Matrix, Matrix>()(F, C[i], C1[i]);
+ }
+ int mm = 2 * m;
+ for (int i = 0; i < C2.size(); i++)
+ {
+ BlasMatrixDomainAddin<IntField, Matrix, Matrix>()(F, C[mm + i], C2[i]);
+ }
+ for (int i = 0; i < C3.size(); i++)
+ {
+ BlasMatrixDomainAddin()<IntField, Matrix, Matrix>(F, C[m + i], C3[i]);
+ }
+ for (int i = 0; i < C1.size(); i++)
+ {
+ BlasMatrixDomainSubin()<IntField, Matrix, Matrix>(F, C[m + i], C1[i]);
+ }
+ for (int i = 0; i < C2.size(); i++)
+ {
+ BlasMatrixDomainSubin()<IntField, Matrix, Matrix>(F, C[m + i], C2[i]);
+ }
+ return C;
+ }
+ if (A.size() <= m)
+ {
+ vec B1(B.begin(), B.begin() + m);
+ vec B2(B.begin() + m, B.end());
+ vec C1;
+ vec C2;
+ Matrix CC(F, A.rowdim(), B.coldim());
+ int xx;
+ xx = A.size() + B1.size() - 1;
+ for (int i = 0; i < xx; i++)
+ {
+ C1.push_back(CC);
+ }
+ xx = A.size() + B2.size() - 1;
+ for (int i = 0; i < xx; i++)
+ {
+ C2.push_back(CC);
+ }
+ karatsuba(F, C1, A, B1);
+ karatsuba(F, C2, A, B2);
+ for (int i = 0; i < C1.size(); i++)
+ {
+ BlasMatrixDomainAddin<IntField, Matrix, Matrix>()(F, C[i], C1[i]);
+ }
+ for (int i = 0; i < C2.size(); i++)
+ {
+ BlasMatrixDomainAddin<IntField, Matrix, Matrix>()(F, C[m + i], C2[i]);
+ }
+ return C;
+ }
+ if (B.size() <= m)
+ {
+ vec A1(A.begin(), A.begin() + m);
+ vec A2(A.begin() + m, A.end());
+ vec C1;
+ vec C2;
+ Matrix CC(F, A.rowdim(), B.coldim());
+ int xx;
+ xx = A1.size() + B.size() - 1;
+ for (int i = 0; i < xx; i++)
+ {
+ C1.push_back(CC);
+ }
+ xx = A2.size() + B.size() - 1;
+ for (int i = 0; i < xx; i++)
+ {
+ C2.push_back(CC);
+ }
+ karatsuba(F, C1, A1, B);
+ karatsuba(F, C2, A2, B);
+ for (int i = 0; i < C1.size(); i++)
+ {
+ BlasMatrixDomainAddin<IntField, Matrix, Matrix>()(F, C[i], C1[i]);
+ }
+ for (int i = 0; i < C2.size(); i++)
+ {
+ BlasMatrixDomainAddin<IntField, Matrix, Matrix>()(F, C[m + i], C2[i]);
+ }
+ return C;
+ }
+ return C;
+ }
+
+ template<class Field, class Vector3, class Vector1, class Vector2>
+ Vector1& SlicedPolynomialMatrixMulKaratsuba<Field, Vector3, Vector1, Vector2 >::operator()(const Field& GF,
+ Vector3& C,
+ const Vector1& A,
+ const Vector2& B) const
+ {
+ //check dimensions
+ int xx;
+ vec A1;
+ vec B1;
+ xx = A.length();
+ for (int m = 0; m < xx; m++)
+ {
+ A1.push_back(A.getMatrixCoefficient(m));
+ }
+ xx = B.length();
+ for (int m = 0; m < xx; m++)
+ {
+ B1.push_back(B.getMatrixCoefficient(m));
+ }
+ vec C1;
+ xx = A1.size() + B1.size() - 1;
+ Matrix CC(C.fieldF(), A.rowdim(), B.coldim());
+ for (int i = 0; i < xx; i++)
+ {
+ C1.push_back(CC);
+ }
+ karatsuba(C.fieldF(), C1, A1, B1);
+ modulo(C1, C.length(), C.irreducible);
+ for (int m = 0; m < C.length(); m++)
+ {
+ C.setMatrixCoefficient(m, C1[m]);
+ }
+ return C;
+ }
+} // LinBox
+
+#endif
\ No newline at end of file
diff --git a/linbox/matrix/slicedpolynomialmatrix/SlicedPolynomialMatrixMulToomCook.h b/linbox/matrix/slicedpolynomialmatrix/SlicedPolynomialMatrixMulToomCook.h
new file mode 100644
index 0000000..a9450f5
--- /dev/null
+++ b/linbox/matrix/slicedpolynomialmatrix/SlicedPolynomialMatrixMulToomCook.h
@@ -0,0 +1,29 @@
+#ifndef __LINBOX_matrix_SlicedPolynomialMatrix_SlicedPolynomialMatrixMulToomCook_H
+#define __LINBOX_matrix_SlicedPolynomialMatrix_SlicedPolynomialMatrixMulToomCook_H
+
+#include "SlicedPolynomialMatrix.h"
+
+namespace LinBox
+{
+ template< class Field, class Vector3, class Vector1, class Vector2>
+ class SlicedPolynomialMatrixMulToomCook
+ {
+ private:
+ typedef SlicedPolynomialMatrixtoBlasMatrix<Field, Vector1::Rep, Vector1::MatrixElement, Vector1::IntField, Vector1::Rep> conversionAtoAm;
+ typedef SlicedPolynomialMatrixtoBlasMatrix<Field, Vector2::Rep, Vector2::MatrixElement, Vector2::IntField, Vector2::Rep> conversionBtoBm;
+ typedef Vector3::IntField IntField;
+ typedef BlasMatrix<IntField> Matrix;
+ typedef BlasMatrixtoSlicedPolynomialMatrix<Vector3::IntField, Vector3::Rep, Field, Vector3::Rep, Vector3::MatrixElement> conversionCmtoC;
+ typedef Vector3::polynomial polynomial;
+ Matrix& EvaluationInterpolationMatrices (Matrix& TC, Matrix& iTC);
+ template<class Field, class Vector3, class Vector1, class Vector2>
+ Matrix& mul (IntField& F, Matrix& CMatBloc, const Matrix& AMatBloc, const Matrix& BMatBloc,
+ const size_t m, const size_t k, const size_t n, const size_t e, polynomial irreducible);
+ public:
+ Operand1 &operator() (const Field &GF, Operand1 &C, const Operand2 &A, const Operand3 &B) const;
+ };
+} /* end of namespace LinBox */
+
+#include "SlicedPolynomialMatrixMulToomCook.inl"
+
+#endif
\ No newline at end of file
diff --git a/linbox/matrix/slicedpolynomialmatrix/SlicedPolynomialMatrixMulToomCook.inl b/linbox/matrix/slicedpolynomialmatrix/SlicedPolynomialMatrixMulToomCook.inl
new file mode 100644
index 0000000..e90d5a6
--- /dev/null
+++ b/linbox/matrix/slicedpolynomialmatrix/SlicedPolynomialMatrixMulToomCook.inl
@@ -0,0 +1,188 @@
+#ifndef __LINBOX_matrix_SlicedPolynomialMatrix_SlicedPolynomialMatrixMulToomCook_INL
+#define __LINBOX_matrix_SlicedPolynomialMatrix_SlicedPolynomialMatrixMulToomCook_INL
+
+#include <fflas-ffpack/fflas/fflas.h>
+#include <fflas-ffpack/ffpack/ffpack.h>
+#include "linbox/algorithms/matrix-hom.h"
+#include <givaro/givpoly1denseops.inl>
+#include "linbox/matrix/SlicedPolynomialMatrix/conversion.h"
+
+namespace LinBox
+{
+ template<class Field, class Vector3, class Vector1, class Vector2>
+ BlasMatrix<Vector3::IntField>&
+ SlicedPolynomialMatrixMulToomCook<Field, Vector3, Vector1, Vector2 >::EvaluationInterpolationMatrices
+ (BlasMatrix<Vector3::IntField>& TC, BlasMatrix<Vector3::IntField>& iTC)
+ {
+ size_t E = TC.rowdim();
+ for (size_t i = 0 ; i < E ; ++i)
+ {
+ for (size_t j = 0 ; j < E ; ++j)
+ {
+ TC.field().init(TC.refEntry(i,j), pow((Integer)i,j));
+ }
+ }
+ int null;
+ FFPACK::Invert(TC.field(),E,TC.getPointer(),E,iTC.getWritePointer(),E,null);
+ return TC;
+ }
+
+ template<class Field, class Vector3, class Vector1, class Vector2>
+ BlasMatrix<Vector3::IntField>&
+ SlicedPolynomialMatrixMulToomCook<Field, Vector3, Vector1, Vector2 >::mul
+ (Vector3::IntField& F,
+ BlasMatrix<Vector3::IntField>& CMatBloc,
+ const BlasMatrix<Vector3::IntField>& AMatBloc,
+ const BlasMatrix<Vector3::IntField>& BMatBloc,
+ const size_t m,
+ const size_t k,
+ const size_t n, const size_t e,
+ polynomial irreducible)
+ {
+ #if (__LINBOX_FFLAS_FFPACK_VERSION < 10501)
+ #warning "Invert is buggy in your fflas-ffpack version. please consider upgrading to >=1.5.1."
+ #endif
+ size_t E = 2*e - 1 ;
+
+ Matrix TC (F, E, E);
+ Matrix iTC (F, E, E);
+ Matrix iEval (F, E, E);
+ EvaluationInterpolationMatrices(TC, iTC);
+
+ // each row is a result matrix
+ Matrix TMatBloc( F, E, m*n);
+ Matrix AEval( F , E, m*k);
+ Matrix BEval( F , E, k*n);
+
+ FFLAS::fgemm(F,
+ FFLAS::FflasNoTrans, FFLAS::FflasNoTrans,
+ E, m*k, e,
+ F.one,
+ TC.getPointer(),E,
+ AMatBloc.getPointer(), m*k,
+ F.zero,
+ AEval.getWritePointer(), m*k);
+
+ FFLAS::fgemm(F,
+ FFLAS::FflasNoTrans, FFLAS::FflasNoTrans,
+ E ,n*k, e,
+ F.one,
+ TC.getPointer(),E,
+ BMatBloc.getPointer(), n*k,
+ F.zero,
+ BEval.getWritePointer(), n*k);
+
+ for (size_t i = 0 ; i < E ; ++i)
+ {
+ FFLAS::fgemm(F,
+ FFLAS::FflasNoTrans, FFLAS::FflasNoTrans,
+ m, n, k,
+ F.one,
+ AEval.getPointer()+i*m*k, k,
+ BEval.getPointer()+i*n*k, n,
+ F.zero,
+ TMatBloc.getWritePointer()+i*m*n, n);
+ }
+
+ FFLAS::fgemm(F,
+ FFLAS::FflasNoTrans, FFLAS::FflasNoTrans,
+ E, m * n, E,
+ F.one,
+ iTC.getPointer(),E, //lda
+ TMatBloc.getWritePointer()+i*m*n, m*n, //ldb
+ F.zero,
+ CMatBloc.getWritePointer()+i*m*n, m*n);
+
+ return CMatBloc;
+ }
+
+ // all matrix classes should be SlicedPolynomialMatrices
+ template<class Field, class Vector3, class Vector1, class Vector2>
+ Vector3& SlicedPolynomialMatrixMulToomCook<Field, Vector3, Vector1, Vector2 >::operator()
+ (const Field& GF,
+ Vector3& C,
+ const Vector1& A,
+ const Vector2& B)
+ {
+ size_t e = C.length();
+ size_t m = C.rowdim();
+ size_t k = B.rowdim();
+ size_t n = C.coldim();
+
+ IntField F = A.filedF();
+
+ if (e == 1) {
+ BlasMatrix<Vector1::IntField, Vector1::Rep> Am(A.fieldF(), A.rowdim(), A.coldim());
+ conversionAtoAm()(Am, A);
+ BlasMatrix<Vector2::IntField, Vector2::Rep> Bm(B.fieldF(), B.rowdim(), B.coldim());
+ conversionBtoBm()(Bm, B);
+ BlasMatrix<Vector3::IntField, Vector3::Rep> Cm(C.fieldF(), C.rowdim(), C.coldim());
+ Matrix Af(Am,F);
+ Matrix Bf(Bm,F);
+ Matrix Cf(Cm,F);
+ FFLAS::fgemm((typename IntField::Father_t)F,
+ FFLAS::FflasNoTrans, FFLAS::FflasNoTrans,
+ // m, k , n,
+ m,n,k,
+ F.one,
+ Af.getPointer(), Am.getStride(), //lda
+ Bf.getPointer(), Bm.getStride(), //ldb
+ F.zero,
+ Cf.getWritePointer(), Cm.getStride());
+ MatrixHom::map(Cm,Cf);
+ conversionCmtoC()(C, Cm); //change when convertation is done
+ return C;
+ }
+
+ Matrix Cbloc(F,e,m*n);
+ Matrix Abloc(F,e,m*k);
+ Matrix Bbloc(F,e,k*n);
+
+
+ for (size_t l = 0 ; l < e ; ++l)
+ {
+ for (size_t i = 0 ; i < m ; ++i)
+ {
+ for (size_t j = 0 ; j < k ; ++j)
+ {
+ Abloc.setEntry(l, i*k+j, A.getEntry(l, i, j));
+ }
+ }
+ }
+
+ for (size_t l = 0 ; l < e ; ++l)
+ {
+ for (size_t i = 0 ; i < k ; ++i)
+ {
+ for (size_t j = 0 ; j < n ; ++j)
+ {
+ Bbloc.setEntry(l, i*n+j, B.getEntry(l, i, j));
+ }
+ }
+ }
+
+ Protected::mul(C.fieldF(), Cbloc, Abloc, Bbloc, m, k, n, e, C.irreducible);
+
+ size_t E = 2 * E - 1;
+ polynomial x(E);
+ for (size_t i = 0 ; i < m ; ++i)
+ {
+ for (size_t j = 0 ; j < n ; ++j)
+ {
+ for (size_t l = 0 ; l < E ; ++l)
+ {
+ x[l] = Cbloc.getEntry(l, i*n+j);
+ }
+ Poly1Dom<IntField>.modin(x, C.irreducible);
+ for (size_t l = 0 ; l < e ; ++l)
+ {
+ C.setEntry(l, i, j, x[l]);
+ }
+ }
+ }
+
+ return C ;
+ }
+} // LinBox
+
+#endif
\ No newline at end of file
diff --git a/linbox/matrix/slicedpolynomialmatrix/conversion.h b/linbox/matrix/slicedpolynomialmatrix/conversion.h
new file mode 100644
index 0000000..59cf37d
--- /dev/null
+++ b/linbox/matrix/slicedpolynomialmatrix/conversion.h
@@ -0,0 +1,55 @@
+#ifndef __LINBOX_matrix_SlicedPolynomialMatrix_conversion_H
+#define __LINBOX_matrix_SlicedPolynomialMatrix_conversion_H
+
+#include "SlicedPolynomialMatrix.h"
+#include "linbox/matrix/polynomial-matrix.h"
+#include "linbox/matrix/densematrix/blas-matrix.h"
+#include <givaro/gfq.h>
+
+namespace LinBox
+{
+ //FieldF == SlicedPolynomialMatrix::IntField
+ template <class _FieldGF, class _Storage, class _MatrixElement = double, class _FieldF>
+ class SlicedPolynomialMatrixtoPolynomialMatrix
+ {
+ public:
+ PolynomialMatrix<PMType::polfirst,PMStorage::plain,_FieldF>
+ &operator() (PolynomialMatrix<PMType::polfirst,PMStorage::plain,_FieldF> &PM,
+ SlicedPolynomialMatrix<_FieldGF, _Storage, _MatrixElement> &SPM);
+ };
+
+ //FieldF == SlicedPolynomialMatrix::IntField
+ template <class _FieldF, class _FieldGF, class _Storage, class _MatrixElement = double>
+ class PolynomialMatrixtoSlicedPolynomialMatrix
+ {
+ public:
+ SlicedPolynomialMatrix<_FieldGF, _Storage, _MatrixElement>
+ &operator() (SlicedPolynomialMatrix<_FieldGF, _Storage, _MatrixElement> &SPM),
+ PolynomialMatrix<PMType::polfirst,PMStorage::plain,_FieldF> &PM);
+ };
+
+ template <class _FieldGF, class _Storage1, class _MatrixElement = double, class TT, class _Storage2>
+ class SlicedPolynomialMatrixtoBlasMatrix
+ {
+ private:
+ typedef SlicedPolynomialMatrixtoBlasMatrix<_FieldGF, _Storage1,
+ _MatrixElement, TT, _Storage2> spm;
+ public:
+ BlasMatrix<Givaro::GFqDom<TT>, _Storage2>
+ &operator() (BlasMatrix<Givaro::GFqDom<TT>, _Storage2> &BM,
+ SlicedPolynomialMatrix<_FieldGF, _Storage1, _MatrixElement> &SPM);
+ };
+
+ template <class TT, class _Storage2, class _FieldGF, class _Storage1, class _MatrixElement = double>
+ class BlasMatrixtoSlicedPolynomialMatrix
+ {
+ public:
+ SlicedPolynomialMatrix<_FieldGF, _Storage1, _MatrixElement>
+ &operator() (SlicedPolynomialMatrix<_FieldGF, _Storage1, _MatrixElement> &SPM,
+ BlasMatrix<Givaro::GFqDom<TT>, _Storage2> &BM);
+ };
+} /* end of namespace LinBox */
+
+#include "conversion.inl"
+
+#endif
diff --git a/linbox/matrix/slicedpolynomialmatrix/conversion.inl b/linbox/matrix/slicedpolynomialmatrix/conversion.inl
new file mode 100644
index 0000000..526b281
--- /dev/null
+++ b/linbox/matrix/slicedpolynomialmatrix/conversion.inl
@@ -0,0 +1,114 @@
+#ifndef __LINBOX_matrix_SlicedPolynomialMatrix_conversion_INL
+#define __LINBOX_matrix_SlicedPolynomialMatrix_conversion_INL
+
+namespace LinBox
+{
+ template <class _FieldGF, class _Storage, class _MatrixElement, class _FieldF>
+ PolynomialMatrix<PMType::polfirst,PMStorage::plain,_FieldF>&
+ SlicedPolynomialMatrixtoPolynomialMatrix<_FieldGF, _Storage,
+ _MatrixElement, _FieldF>::operator()
+ (PolynomialMatrix<PMType::polfirst, PMStorage::plain,_FieldF>& PM,
+ SlicedPolynomialMatrix<_FieldGF, _Storage, _MatrixElement> &SPM)
+ {
+ size_t rd = SPM.rowdim();
+ size_t cd = SPM.coldim();
+ size_t l = SPM.length();
+ for (size_t i = 0; i < rd; i++)
+ {
+ for (size_t j = 0; j < cd; j++)
+ {
+ for (size_t k = 0; k < l; k++)
+ {
+ PM.ref(i, j, k) = SPM.getEntry(k, i, j);
+ }
+ }
+ }
+ return PM;
+ }
+
+ template <class _FieldF, class _FieldGF, class _Storage, class _MatrixElement>
+ SlicedPolynomialMatrix<_FieldGF, _Storage, _MatrixElement>&
+ PolynomialMatrixtoSlicedPolynomialMatrix<_FieldF, _FieldGF,
+ _Storage, _MatrixElement>::operator()
+ (SlicedPolynomialMatrix<_FieldGF, _Storage, _MatrixElement> &SPM,
+ PolynomialMatrix<PMType::polfirst,PMStorage::plain,_FieldF> &PM)
+ {
+ size_t rd = SPM.rowdim();
+ size_t cd = SPM.coldim();
+ size_t l = SPM.length();
+ for (size_t k = 0; k < l; k++)
+ {
+ SPM.setMatrixCoefficient(k, PM[k]);
+ }
+ return SPM;
+ }
+
+ template <class _FieldGF, class _Storage1, class _MatrixElement, class TT, class _Storage2>
+ BlasMatrix<Givaro::GFqDom<TT>, _Storage2>&
+ SlicedPolynomialMatrixtoBlasMatrix<_FieldGF, _Storage1,
+ _MatrixElement, TT, _Storage2>::operator()
+ (BlasMatrix<Givaro::GFqDom<TT>, _Storage2> &BM,
+ SlicedPolynomialMatrix<_FieldGF, _Storage1, _MatrixElement> &SPM)
+ {
+ size_t rd = SPM.rowdim();
+ size_t cd = SPM.coldim();
+ size_t l = SPM.length();
+ GFqDom<TT> GF(SPM.fieldGF().characteristic(), SPM.fieldGF().exponent());
+ GFqDom<TT>::Element el;
+ PolynomialMatrix<PMType::polfirst,PMStorage::plain, spm::IntField> PM(
+ SPM.fieldF(), rd, cd, l);
+ SlicedPolynomialMatrixtoPolynomialMatrix<_FieldGF, _Storage1,
+ _MatrixElement, spm::IntField>()(PM, SPM);
+ for (size_t i = 0; i < rd; i++)
+ {
+ for (size_t j = 0; j < cd; j++)
+ {
+ GF.init(el, PM(i, j));
+ BM.setEntry(i, j, el);
+ }
+ }
+ return BM;
+ }
+
+ template <class TT, class _Storage2, class _FieldGF, class _Storage1, class _MatrixElement>
+ SlicedPolynomialMatrix<_FieldGF, _Storage1, _MatrixElement>&
+ BlasMatrixtoSlicedPolynomialMatrix<TT, _Storage2,
+ _FieldGF, _Storage1, _MatrixElement>::operator()
+ (SlicedPolynomialMatrix<_FieldGF, _Storage1, _MatrixElement> &SPM,
+ BlasMatrix<Givaro::GFqDom<TT>, _Storage2> &BM)
+ {
+ size_t rd = SPM.rowdim();
+ size_t cd = SPM.coldim();
+ size_t l = SPM.length();
+ if (l == 1)
+ {
+ for (size_t i = 0; i < rd; i++)
+ {
+ for (size_t j = 0; j < cd; j++)
+ {
+ SPM.setEntry(0, i, j, BM.getEntry(i, j));
+ }
+ }
+ return SPM;
+ }
+ else
+ {
+ size_t p = SPM.fieldGF().characteristic();
+ for (size_t i = 0; i < rd; i++)
+ {
+ for (size_t j = 0; j < cd; j++)
+ {
+ size_t el = log2pol(BM.getEntry(i, j));
+ for (size_t k = 0; k < l; k++)
+ {
+ SPM.setEntry(k, i, j, el % p);
+ el /= p;
+ }
+ }
+ }
+ return SPM;
+ }
+ }
+} // LinBox
+
+#endif
\ No newline at end of file
diff --git a/linbox/matrix/sparse-formats.h b/linbox/matrix/sparse-formats.h
new file mode 100644
index 0000000..9895ad8
--- /dev/null
+++ b/linbox/matrix/sparse-formats.h
@@ -0,0 +1,98 @@
+/* linbox/matrix/sparse-formats.h
+ * Copyright (C) 2013 the LinBox group
+ *
+ * Written by Brice Boyer (briceboyer) <boyer.brice at gmail.com>,
+ *
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ * ========LICENCE========
+ *.
+ */
+
+#ifndef __LINBOX_matrix_sparse_formats_H
+#define __LINBOX_matrix_sparse_formats_H
+
+#include "linbox/linbox-tags.h"
+
+namespace LinBox {
+
+ /** Exception class for invalid matrix input
+ */
+ namespace Exceptions {
+ class InvalidMatrixInput {};
+ }
+
+
+
+
+ //! Sparse matrix format (memory storage)
+ namespace SparseMatrixFormat {
+ class ANY {} ;
+ // template<typename Row_t>
+ class COO : public ANY {} ; //!< Cordinate
+ // template<typename Row_t>
+ class COO1 : public ANY {} ; //!< implicit value COO (with only ones, or mones, or..)
+ // template<typename Row_t>
+ class CSR : public ANY {} ; //!< compressed row
+ // template<typename Row_t>
+ class CSR1 : public ANY {} ; //!< implicit value CSR (with only ones, or mones, or..)
+ // template<typename Row_t>
+ class ELL : public ANY {} ; //!< ellpack
+ // template<typename Row_t>
+ class ELL_R : public ANY {} ; //!< ellpack fixed row
+ // template<typename Row_t>
+ class ELL_R1 : public ANY {} ; // ELL_R with only ones (or mones, or..)
+ class DIA : public ANY {} ; //!< Diagonal
+ class BCSR : public ANY {} ; //!< Block CSR
+ class HYB : public ANY {} ; //!< hybrid
+ class TPL : public ANY {} ; //!< vector of triples
+ class TPL_omp : public ANY {} ; //!< triplesbb for openmp
+ class LIL : public ANY {} ; //!< vector of pairs
+ class SMM : public ANY {} ; //!< Sparse Map of Maps
+
+ // the old sparse matrix reps.
+ // class VVP : public ANY {} ; // vector of vector of pairs
+ // class VPV : public ANY {} ; // vector of pair of vectors
+ // class VMap : public ANY {} ; // vector of index to value maps.
+ // template<class Row_t>
+ class SparseSeq /* CoP */ : public ANY {} ;//!< vector/list of pairs (Container of Pairs). SparseSequence.
+ // template<class Row_t>
+ class SparsePar /* CoM */ : public ANY {} ;//!< vector/list of pairs (Container of Maps). SparseAssociative.
+ // template<class Row_t>
+ class SparseMap /* PoC */ : public ANY {} ;//!< pair of vector/list (Pair of Containers). SparseParallel.
+
+ } // SparseMatrixFormat
+
+
+ //! Sparse matrix format (file storage) @bug use the enum!!!!
+ namespace SparseFileFormat {
+ class SMS {} ; // JG format
+ class CSR {} ; // Raleigh 11 format
+ class COO {} ; // more standard coo format
+ } // SparseFileFormat
+}
+
+#endif // __LINBOX_matrix_sparse_formats_H
+
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/matrix/sparse-matrix.doxy b/linbox/matrix/sparse-matrix.doxy
new file mode 100644
index 0000000..4846c3b
--- /dev/null
+++ b/linbox/matrix/sparse-matrix.doxy
@@ -0,0 +1,32 @@
+// Copyright 2014 LinBox. See COPYING for licence information.
+/*
+ * Written by Brice Boyer (briceboyer) <boyer.brice at gmail.com>
+
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ * ========LICENCE========
+ */
+
+/** \ingroup matrix
+ * \defgroup sparsematrix Sparse Matrix
+ * \brief These are sparse matrix reprensentations
+ *
+ * NO DOC YET
+ *
+ */
+
+// vim:syn=doxygen
diff --git a/linbox/matrix/sparse-matrix.h b/linbox/matrix/sparse-matrix.h
new file mode 100644
index 0000000..3c563b2
--- /dev/null
+++ b/linbox/matrix/sparse-matrix.h
@@ -0,0 +1,287 @@
+/* linbox/matrix/sparse-matrix.h
+ * Copyright (C) 2013 the LinBox
+ *
+ * Written by :
+ * Brice Boyer (briceboyer) <boyer.brice at gmail.com>
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ * ========LICENCE========
+ */
+
+/*! @file matrix/sparse-matrix.h
+ * @ingroup matrix
+ * @ingroup sparsematrix
+ * A <code>SparseMatrix<_Field, _Storage></code> ....
+ */
+
+#ifndef __LINBOX_matrix_sparse_matrix_H
+#define __LINBOX_matrix_sparse_matrix_H
+
+#ifndef index_t
+#define index_t ptrdiff_t
+#endif
+
+#include "linbox/matrix/sparse-formats.h"
+#include "linbox/matrix/matrix-traits.h"
+
+namespace LinBox {
+
+
+ // Forward definition
+ template<class _Field, class _Storage = SparseMatrixFormat::SparseSeq >
+ class SparseMatrix ;
+
+
+ template <class _Field, class _Storage>
+ std::ostream& operator<< (std::ostream & os, const SparseMatrix<_Field,_Storage> & Mat)
+ {
+ return Mat.write(os);
+ }
+
+ template <class _Field, class _Storage>
+ std::istream &operator >> (std::istream &is, SparseMatrix<_Field, _Storage> &A)
+ {
+ return A.read (is);
+ }
+
+
+ template<class _Field, class _Storage>
+ class SparseMatrixDomain ;
+
+} // LinBox
+
+#include "sparsematrix/read-write-sparse.h"
+
+#include "sparsematrix/sparse-generic.h"
+
+#include "sparsematrix/sparse-coo-matrix.h"
+// #include "sparsematrix/sparse-coo-1-matrix.h"
+#include "sparsematrix/sparse-csr-matrix.h"
+// #include "sparsematrix/sparse-csr-1-matrix.h"
+#include "sparsematrix/sparse-ell-matrix.h"
+#include "sparsematrix/sparse-ellr-matrix.h"
+// #include "sparsematrix/sparse-ellr-1-matrix.h"
+// #include "sparsematrix/sparse-bcsr-matrix.h"
+// #include "sparsematrix/sparse-dia-matrix.h"
+// #include "sparsematrix/sparse-hyb-matrix.h"
+
+#include "sparsematrix/sparse-tpl-matrix.h"
+// #ifdef __LINBOX_USES_OPENMP
+#ifdef _OPENMP
+#include "sparsematrix/sparse-tpl-matrix-omp.h"
+#endif
+
+namespace LinBox { /* MatrixContainerTraits */
+
+ template <class Field, class Storage>
+ class MatrixContainerTrait<SparseMatrix<Field,Storage> > {
+ public:
+ //typedef MatrixContainerCategory::Blackbox Type;
+ typedef MatrixContainerCategory::Container Type;
+ };
+
+ // template <class _Field, class _Storage>
+ // struct MatrixTraits< SparseMatrix<_Field, _Storage> > {
+ // typedef SparseMatrix<_Field, _Storage> MatrixType;
+ // typedef typename MatrixCategories::RowMatrixTag MatrixCategory;
+ // };
+
+
+ // template <class _Field, class _Storage>
+ // struct GetEntryCategory<SparseMatrix<_Field,_Storage> > {
+ // typedef SolutionTags::Local Tag;
+ // };
+}
+
+namespace LinBox { /* MatrixTraits */
+
+ template <class Field>
+ struct MatrixTraits< SparseMatrix<Field, SparseMatrixFormat::CSR> >
+ {
+ typedef SparseMatrix<Field, SparseMatrixFormat::CSR> MatrixType;
+ typedef typename MatrixCategories::IndexedMatrixTag MatrixCategory;
+ };
+
+ template <class Field>
+ struct MatrixTraits< const SparseMatrix<Field, SparseMatrixFormat::CSR> >
+ {
+ typedef SparseMatrix<Field, SparseMatrixFormat::CSR> MatrixType;
+ typedef typename MatrixCategories::IndexedMatrixTag MatrixCategory;
+ };
+
+ template <class Field>
+ struct MatrixTraits< SparseMatrix<Field, SparseMatrixFormat::SparseMap> >
+ {
+ typedef SparseMatrix<Field, SparseMatrixFormat::SparseMap> MatrixType;
+ typedef typename MatrixCategories::RowMatrixTag MatrixCategory;
+ };
+
+ template <class Field>
+ struct MatrixTraits< const SparseMatrix<Field, SparseMatrixFormat::SparseMap> >
+ {
+ typedef SparseMatrix<Field, SparseMatrixFormat::SparseMap> MatrixType;
+ typedef typename MatrixCategories::RowMatrixTag MatrixCategory;
+ };
+
+ template <class Field>
+ struct MatrixTraits< SparseMatrix<Field, SparseMatrixFormat::SparsePar> >
+ {
+ typedef SparseMatrix<Field, SparseMatrixFormat::SparsePar> MatrixType;
+ typedef typename MatrixCategories::RowMatrixTag MatrixCategory;
+ };
+
+ template <class Field>
+ struct MatrixTraits< const SparseMatrix<Field, SparseMatrixFormat::SparsePar> >
+ {
+ typedef SparseMatrix<Field, SparseMatrixFormat::SparsePar> MatrixType;
+ typedef typename MatrixCategories::RowMatrixTag MatrixCategory;
+ };
+
+ template <class Field>
+ struct MatrixTraits< SparseMatrix<Field, SparseMatrixFormat::SparseSeq> >
+ {
+ typedef SparseMatrix<Field, SparseMatrixFormat::SparseSeq> MatrixType;
+ typedef typename MatrixCategories::RowMatrixTag MatrixCategory;
+ };
+
+ template <class Field>
+ struct MatrixTraits< const SparseMatrix<Field, SparseMatrixFormat::SparseSeq> >
+ {
+ typedef SparseMatrix<Field, SparseMatrixFormat::SparseSeq> MatrixType;
+ typedef typename MatrixCategories::RowMatrixTag MatrixCategory;
+ };
+
+} // LinBox
+
+namespace LinBox { /* MatrixHomTrait */
+ template <class Ring, class Field>
+ struct MatrixHomTrait<SparseMatrix<Ring, SparseMatrixFormat::SparseSeq>, Field> {
+ typedef SparseMatrix<Field, SparseMatrixFormat::SparseSeq> value_type;
+ };
+
+ template <class Ring, class Field>
+ struct MatrixHomTrait<SparseMatrix<Ring, SparseMatrixFormat::SparsePar>, Field> {
+ typedef SparseMatrix<Field, SparseMatrixFormat::SparsePar> value_type;
+ };
+
+ template <class Ring, class Field>
+ struct MatrixHomTrait<SparseMatrix<Ring, SparseMatrixFormat::SparseMap>, Field> {
+ typedef SparseMatrix<Field, SparseMatrixFormat::SparseMap> value_type;
+ };
+
+} // LinBox
+
+namespace LinBox { /* IndexedCategory */
+
+ template<class Field, class Row>
+ struct IndexedCategory< SparseMatrix<Field,Row> > {
+ typedef IndexedTags::HasIndexed Tag;
+ };
+
+#if 1
+ template<class Field>
+ struct IndexedCategory< SparseMatrix<Field,SparseMatrixFormat::CSR> > {
+ typedef IndexedTags::HasNext Tag;
+ };
+
+ template<class Field>
+ struct IndexedCategory< SparseMatrix<Field,SparseMatrixFormat::COO> > {
+ typedef IndexedTags::HasNext Tag;
+ };
+
+ template<class Field>
+ struct IndexedCategory< SparseMatrix<Field,SparseMatrixFormat::ELL> > {
+ typedef IndexedTags::HasNext Tag;
+ };
+
+ template<class Field>
+ struct IndexedCategory< SparseMatrix<Field,SparseMatrixFormat::ELL_R> > {
+ typedef IndexedTags::HasNext Tag;
+ };
+
+#endif
+
+
+
+
+} // LinBox
+
+namespace LinBox { /* ContainerTraits */
+
+ // this could also be a member of BlasVector
+ template<class _Field>
+ struct ContainerTraits<SparseMatrix<_Field, SparseMatrixFormat::COO> > {
+ typedef ContainerCategories::Matrix ContainerCategory ;
+ };
+
+ template<class _Field>
+ struct ContainerTraits<SparseMatrix<_Field, SparseMatrixFormat::CSR> > {
+ typedef ContainerCategories::Matrix ContainerCategory ;
+ };
+
+ template<class _Field>
+ struct ContainerTraits<SparseMatrix<_Field, SparseMatrixFormat::ELL> > {
+ typedef ContainerCategories::Matrix ContainerCategory ;
+ };
+
+ template<class _Field>
+ struct ContainerTraits<SparseMatrix<_Field, SparseMatrixFormat::ELL_R> > {
+ typedef ContainerCategories::Matrix ContainerCategory ;
+ };
+
+}
+
+namespace LinBox { /* Junk */
+
+#if 1 /* make correspond SparseMatrixFormat::XXXSeq and Vector<Field>::XXXSeq */
+
+ template<class Field>
+ struct SparseVectorTranslate<Field,SparseMatrixFormat::SparseSeq> {
+ typedef typename Vector<Field>::SparseSeq other_t;
+ };
+
+ template<class Field>
+ struct SparseVectorTranslate<Field,typename Vector<Field>::SparseSeq> {
+ typedef SparseMatrixFormat::SparseSeq other_t;
+ };
+
+
+ template<class Field>
+ struct SparseVectorTranslate<Field,SparseMatrixFormat::SparsePar> {
+ typedef typename Vector<Field>::SparsePar other_t;
+ };
+
+ template<class Field>
+ struct SparseVectorTranslate<Field,SparseMatrixFormat::SparseMap> {
+ typedef typename Vector<Field>::SparseMap other_t;
+ };
+
+#endif
+
+} // LinBox
+
+#endif // __LINBOX_matrix_sparse_matrix_H
+
+
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/matrix/sparse.h b/linbox/matrix/sparse.h
deleted file mode 100644
index 3451313..0000000
--- a/linbox/matrix/sparse.h
+++ /dev/null
@@ -1,1724 +0,0 @@
-/* linbox/matrix/sparse.h
- * Copyright (C) 2001-2002 Bradford Hovinen
- * 1999-2001 William J Turner,
- *
- * Written by William J Turner <wjturner at math.ncsu.edu>,
- * Bradford Hovinen <hovinen at cis.udel.edu>
- *
- * --------------------------------------------------------
- * 2003-01-11 Bradford Hovinen <bghovinen at math.uwaterloo.ca>
- *
- * Move from blackbox/sparse-base.h to matrix/sparse.h
- * ------------------------------------
- * 2002-11-28 Bradford Hovinen <bghovinen at math.uwaterloo.ca>
- *
- * - Renamed ColOfRowsIterator to RowIterator
- * - Named template argument _Row rather than Row; add a typedef to Row
- * - Named template argument _Element rather than Row; add a typedef to Element
- * - Renamed IndexIterator as IndexedIterator, and adjusted to match
- * interface in DenseMatrixBase
- * ------------------------------------
- * 2002-08-06 Bradford Hovinen <hovinen at cis.udel.edu>
- *
- * Renamed to sparse-base.h from sparse0-base.h
- * ------------------------------------
- * Modified by Bradford Hovinen <hovinen at cis.udel.edu>
- *
- * Refactoring:
- * - Eliminated SparseMatrixAux and moved that functionality into Sparse0
- * - Made SparseMatrixBase parameterized only on the element type
- * - New read/write implementations for SparseMatrixBase, supporting multiple
- * formats
- * - Eliminated Gaussian elimination code
- * - Added iterators, including ColOfRowsIterator, Iterator, and
- * IndexIterator
- * - Eliminated operator []; added getEntry; changed put_value to setEntry
- * ------------------------------------
- *
- *
- * ========LICENCE========
- * This file is part of the library LinBox.
- *
- * LinBox is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- * ========LICENCE========
- *.
- */
-
-#ifndef __LINBOX_matrix_sparse_H
-#define __LINBOX_matrix_sparse_H
-
-#ifndef _SP_BB_VECTOR_
-#include <vector>
-#define _SP_BB_VECTOR_ std::vector
-#endif
-
-#include <utility>
-#include <iostream>
-#include <algorithm>
-
-#include "linbox/linbox-config.h"
-#include "linbox/blackbox/factory.h"
-#include "linbox/vector/vector-traits.h"
-#include "linbox/util/debug.h"
-#include "linbox/matrix/matrix-domain.h"
-#include "linbox/util/matrix-stream.h"
-
-namespace LinBox
-{
-
-
- /** Exception class for invalid matrix input
- */
-
- class InvalidMatrixInput {};
-
- // use this in place of NoField member, to avoid code duplication.
- // better yet. Don't do it at all.
- /// Dummy field for conceptually unclear io.
- template<class _Element>
- class FieldIO {
- public:
- typedef _Element Element;
-
- std::istream &read (std::istream &stream, Element &elt) const
- {
- return stream >> elt;
- }
- std::ostream &write (std::ostream &stream, const Element &elt) const
- {
- return stream << elt;
- }
- };
-
- // made global to avoid duplicate code.
- /// tags for SparseMatrixBase::read() and write()
- enum FileFormatTag {
- FORMAT_DETECT, FORMAT_GUILLAUME, FORMAT_TURNER, FORMAT_MATLAB, FORMAT_MAPLE, FORMAT_PRETTY, FORMAT_MAGMACPT, FORMAT_ONE_BASED
- };
-
- // Forward declaration
- template <class _Element,
- class _Row = typename RawVector<_Element>::Sparse,
- class Trait = typename VectorTraits<_Row>::VectorCategory>
- class SparseMatrixBase;
-
-
- // Small helper classes to make read and write easier
- template <class _Element, class Row, class Trait = typename VectorTraits<Row>::VectorCategory>
- class SparseMatrixWriteHelper {
- public:
- typedef _Element Element;
-
- // Dummy class to avoid code duplication
- class NoField {
- public:
- typedef _Element Element;
-
- template<class T>
- Element & init(Element & a, const T & b = 0) const { return a = b ; }
-
- std::istream &read (std::istream &stream, Element &elt) const
- {
- return stream >> elt;
- }
- std::ostream &write (std::ostream &stream, const Element &elt) const
- {
- return stream << elt;
- }
- };
-
- template <class Field>
- static std::ostream &write (const SparseMatrixBase<Element, Row> &A, std::ostream &os, const Field &F, FileFormatTag format);
- };
-
- template <class Element, class Row, class Trait = typename VectorTraits<Row>::VectorCategory>
- class SparseMatrixReadWriteHelper : public SparseMatrixWriteHelper<Element, Row, Trait> {
- template <class Field>
- static std::istream &readTurner (SparseMatrixBase<Element, Row> &A, std::istream &is, const Field &F, char *buf);
- template <class Field>
- static std::istream &readGuillaume (SparseMatrixBase<Element, Row> &A, std::istream &is, const Field &F, char *buf);
- template <class Field>
- static std::istream &readMatlab (SparseMatrixBase<Element, Row> &A, std::istream &is, const Field &F, char *buf);
- template <class Field>
- static std::istream &readPretty (SparseMatrixBase<Element, Row> &A, std::istream &is, const Field &F, char *buf);
- template <class Field>
- static std::istream &readMagmaCpt (SparseMatrixBase<Element, Row> &A, std::istream &is, const Field &F, char *buf);
-
- public:
-
- template <class Field>
- static std::istream &read (SparseMatrixBase<Element, Row> &A, std::istream &is, const Field &F, FileFormatTag format);
- };
-
- // Specialization of the above for sparse parallel vectors
- template <class _Element, class Row>
- class SparseMatrixWriteHelper<_Element, Row, VectorCategories::SparseParallelVectorTag > {
- public:
- typedef _Element Element;
-
- // Dummy class to avoid code duplication
- class NoField {
- public:
- typedef _Element Element;
-
- template<class T>
- Element & init(Element & a, const T & b = 0) const { return a = b ; }
-
- std::istream &read (std::istream &stream, Element &elt) const
- {
- return stream >> elt;
- }
- std::ostream &write (std::ostream &stream, const Element &elt) const
- {
- return stream << elt;
- }
- };
-
- template <class Field>
- static std::ostream &write (const SparseMatrixBase<Element, Row> &A, std::ostream &os, const Field &F, FileFormatTag format);
- };
-
- /** Sparse matrix container
- * This class acts as a generic row-wise container for sparse
- * matrices. It is designed to provide various methods to access the
- * entries of the matrix. In particular, it does not meet the black box
- * archetype; see \ref SparseMatrix for an appropriate sparse matrix
- * black box.
- *
- * @param Element Element type
- * @param Row LinBox sparse vector type to use for rows of matrix
- \ingroup matrix
- */
- template <class _Element, class _Row, class Trait>
- class SparseMatrixBase {
- public:
-
- typedef _Element Element;
- typedef _Row Row;
- typedef const Row ConstRow;
- typedef typename _SP_BB_VECTOR_<Row> Rep;
-
- template<typename _Tp1, typename _R1 = typename Rebind<_Row,_Tp1>::other >
- struct rebind {
- typedef SparseMatrixBase<typename _Tp1::Element, _R1, Trait> other;
- };
-
- /** Constructor.
- * Note: the copy constructor and operator= will work as intended
- * because of STL's container design
- * @param m row dimension
- * @param n column dimension
- */
- SparseMatrixBase (size_t m, size_t n) :
- _matA(m), _m(m), _n(n)
- {};
-
-
- /** Constructor from a MatrixStream
- */
- template <class Field>
- SparseMatrixBase ( MatrixStream<Field>& ms );
-
-
- /** Copy constructor.
- */
- SparseMatrixBase (const SparseMatrixBase<Element, Row, Trait> &A);
-
- /** Convert constructor.
- */
- template<class VectorType>
- SparseMatrixBase (const SparseMatrixBase<Element, VectorType, Trait> &A);
- /** Destructor. */
- ~SparseMatrixBase () {}
-
- /** Retreive row dimension of the matrix.
- * @return integer number of rows of SparseMatrixBase matrix.
- */
- size_t rowdim () const
- {
- return _m;
- }
-
- /** Retreive column dimension of matrix.
- * @return integer number of columns of SparseMatrixBase matrix.
- */
- size_t coldim () const
- {
- return _n;
- }
-
- /** Retreive number of elements in the matrix.
- * @return integer number of elements of SparseMatrixBase matrix.
- */
- size_t size () const
- {
- size_t s(0);
- for(typename Rep::const_iterator it = _matA.begin(); it != _matA.end(); ++it)
- s+= LinBox::RawVector<_Element>::size(*it);
- return s;
- }
- /** Read a matrix from the given input stream using field read/write
- * @param is Input stream from which to read the matrix
- * @param F Field with which to read
- * @param format Format of input matrix
- */
- template <class Field>
- std::istream &read (std::istream &is, const Field &F, FileFormatTag format = FORMAT_DETECT);
- /** Read a matrix from the given input stream using standard operators
- * @param is Input stream from which to read the matrix
- * @param format Format of input matrix
- */
- std::istream &read (std::istream &is, FileFormatTag format = FORMAT_DETECT);
-
-
- /** Write a matrix to the given output stream using field read/write
- * @param os Output stream to which to write the matrix
- * @param F Field with which to write
- * @param format Format with which to write
- */
- template <class Field>
- std::ostream &write (std::ostream &os, const Field &F, FileFormatTag format = FORMAT_PRETTY) const;
-
- /** Write a matrix to the given output stream using standard operators
- * @param os Output stream to which to write the matrix
- * @param format Format with which to write
- */
- std::ostream &write (std::ostream &os, FileFormatTag format = FORMAT_PRETTY) const;
-
- /** Set an individual entry
- * Setting the entry to 0 will remove it from the matrix
- * @param i Row index of entry
- * @param j Column index of entry
- * @param value Value of the new entry
- */
- void setEntry (size_t i, size_t j, const Element &value);
-
- /** Get a writeable reference to an entry in the matrix
- * If there is no entry at the position (i, j), then a new entry
- * with a value of zero is inserted and a reference to it is
- * returned.
- * @param i Row index of entry
- * @param j Column index of entry
- * @return Reference to matrix entry
- */
- Element &refEntry (size_t i, size_t j);
-
- /** Get a read-only individual entry from the matrix
- * @param i Row index
- * @param j Column index
- * @return Const reference to matrix entry
- */
- const Element &getEntry (size_t i, size_t j) const;
-
- /** Get an entry and store it in the given value
- * This form is more in the Linbox style and is provided for interface
- * compatibility with other parts of the library
- * @param x Element in which to store result
- * @param i Row index
- * @param j Column index
- * @return Reference to x
- */
- Element &getEntry (Element &x, size_t i, size_t j) const;
-
- /** @name Columns of rows iterator
- * The columns of row iterator gives each of the rows of the
- * matrix in ascending order. Dereferencing the iterator yields
- * a row vector in sparse sequence format
- */
-
- typedef typename Rep::iterator RowIterator;
- typedef typename Rep::const_iterator ConstRowIterator;
-
- RowIterator rowBegin ();
- RowIterator rowEnd ();
- ConstRowIterator rowBegin () const;
- ConstRowIterator rowEnd () const;
-
- /** @name Raw iterator
- * The raw iterator is a method for accessing all nonzero
- * entries in the matrix in some unspecified order. This can be
- * used, e.g. to reduce all matrix entries modulo a prime before
- * passing the matrix into an algorithm.
- */
-
- class Iterator;
- class ConstIterator;
-
- /// Begin.
- Iterator Begin ();
- /// End.
- Iterator End ();
- /// const Begin.
- ConstIterator Begin () const;
- /// const End
- ConstIterator End () const;
-
- /** @name Index iterator
- * The index iterator gives the row, column indices of all matrix
- * elements in the same order as the raw iterator above. Its value type
- * is an STL pair with the row and column indices, starting at 0, in the
- * first and second positions, respectively.
- */
-
- class IndexedIterator;
- class ConstIndexedIterator;
-
- /// IndexedBegin
- IndexedIterator IndexedBegin ();
- /// IndexedEnd
- IndexedIterator IndexedEnd ();
- /// const IndexedBegin
- ConstIndexedIterator IndexedBegin () const;
- /// const IndexedEnd
- ConstIndexedIterator IndexedEnd () const;
-
- /** Retrieve a row as a writeable reference
- * @param i Row index
- */
- Row &getRow (size_t i);
-
- /** Retrieve a row as a writeable reference.
- * @param i Row index
- */
- Row &operator [] (size_t i);
-
- /** Retrieve a row as a read-only reference.
- * @param i Row index
- */
- ConstRow &operator [] (size_t i) const;
-
- /** Compute the column density, i.e the number of entries per column.
- * @param v Vector in which to store column density
- */
- template <class Vector>
- Vector &columnDensity (Vector &v) const;
-
- /** Construct the transpose of this matrix and place it in the
- * matrix given.
- * @param AT
- */
- SparseMatrixBase &transpose (SparseMatrixBase &AT) const;
-
- protected:
-
- friend class SparseMatrixWriteHelper<Element, Row>;
- friend class SparseMatrixReadWriteHelper<Element, Row>;
-
- Rep _matA;
- size_t _m;
- size_t _n;
-
- template<class F, class R, class T> friend class SparseMatrixBase;
- };
-
- /* Specialization for sparse sequence vectors */
-
- template <class _Element, class _Row>
- class SparseMatrixBase<_Element, _Row, VectorCategories::SparseSequenceVectorTag > {
- public:
-
- typedef _Element Element;
- typedef _Row Row;
- typedef const Row ConstRow;
- typedef _SP_BB_VECTOR_<Row> Rep;
-
- template<typename _Tp1, typename _R1 = typename Rebind<_Row,_Tp1>::other >
- struct rebind {
- typedef SparseMatrixBase<typename _Tp1::Element, _R1, VectorCategories::SparseSequenceVectorTag> other;
- };
-
- SparseMatrixBase (size_t m, size_t n) :
- _matA (m), _m (m), _n (n)
- {}
-
- /** Constructor from a MatrixStream
- */
- template <class Field>
- SparseMatrixBase ( MatrixStream<Field>& ms );
-
- SparseMatrixBase (const SparseMatrixBase<Element, Row> &A) :
- _matA (A._matA), _m (A._m), _n (A._n)
- {}
-
- template<class VectorType>
- SparseMatrixBase (const SparseMatrixBase<Element, VectorType> &A) :
- _matA(A._m), _m (A._m), _n (A._n)
- {
- typename Rep::iterator meit = this->_matA.begin();
- typename SparseMatrixBase<Element, VectorType>::Rep::const_iterator copit = A._matA.begin();
- for( ; meit != this->_matA.end(); ++meit, ++copit)
- LinBox::RawVector<Element>::convert(*meit, *copit);
- }
-
- ~SparseMatrixBase () {}
-
- size_t rowdim () const
- {
- return _m;
- }
- size_t coldim () const
- {
- return _n;
- }
-
- size_t size () const
- {
- size_t s(0);
- for(typename Rep::const_iterator it = _matA.begin(); it != _matA.end(); ++it)
- s+= LinBox::RawVector<_Element>::size(*it);
- return s;
- }
-
- template <class Field>
- std::istream &read (std::istream &is, const Field &F, FileFormatTag format = FORMAT_DETECT)
- {
- return SparseMatrixReadWriteHelper<Element, Row>::read
- (*this, is, F, format);
- }
-
- std::istream &read (std::istream &is, FileFormatTag format = FORMAT_DETECT)
- {
- return SparseMatrixReadWriteHelper<Element, Row>::read
- (*this, is, SparseMatrixReadWriteHelper<Element, Row>::NoField (),
- format);
- }
-
- template <class Field>
- std::ostream &write (std::ostream &os, const Field &F, FileFormatTag format = FORMAT_PRETTY) const
- {
- return SparseMatrixReadWriteHelper<Element, Row>::write
- (*this, os, F, format);
- }
-
- std::ostream &write (std::ostream &os, FileFormatTag format = FORMAT_PRETTY) const
- {
- return SparseMatrixReadWriteHelper<Element, Row>::write
- (*this, os, SparseMatrixReadWriteHelper<Element, Row>::NoField (),
- format);
- }
-
- std::ostream &write(std::ostream &) const;
-
- void setEntry (size_t i, size_t j, const Element &value);
-
- Element &refEntry (size_t i, size_t j);
-
- const Element &getEntry (size_t i, size_t j) const;
-
- Element &getEntry (Element &x, size_t i, size_t j) const
- {
- return x = getEntry (i, j);
- }
-
- typedef typename Rep::iterator RowIterator;
- typedef typename Rep::const_iterator ConstRowIterator;
-
- ConstRowIterator rowBegin () const
- {
- return _matA.begin ();
- }
-
- ConstRowIterator rowEnd () const
- {
- return _matA.end ();
- }
-
- RowIterator rowBegin ()
- {
- return _matA.begin ();
- }
-
- RowIterator rowEnd ()
- {
- return _matA.end ();
- }
-
- template <class RepIterator, class RowIterator, class _I_Element>
- class _Iterator {
- public:
- typedef _I_Element value_type;
-
- _Iterator (const RepIterator &i, const RowIterator &j, const RepIterator &A_end) :
- _i (i), _j (j), _A_end (A_end)
- {
- if( _i == _A_end ) return;
- while ( _j == _i->end () ) {
- if (++_i == _A_end) return;
- _j = _i->begin ();
- }
- }
-
- _Iterator (const _Iterator &iter) :
- _i (iter._i), _j (iter._j), _A_end (iter._A_end)
- {}
-
- _Iterator () {}
-
- _Iterator &operator = (const _Iterator &iter)
- {
- _i = iter._i;
- _j = iter._j;
- _A_end = iter._A_end;
-
- return *this;
- }
-
- bool operator == (const _Iterator &i) const
- {
- return (_i == i._i) && (_j == i._j);
- }
-
- bool operator != (const _Iterator &i) const
- {
- return (_i != i._i) || (_j != i._j);
- }
-
- _Iterator &operator ++ ()
- {
- ++_j;
- while( _j == _i->end ()) {
- if (++_i == _A_end) return *this;
- _j = _i->begin ();
- }
-
- // if (++_j == _i->end ())
- // if (++_i != _A_end)
- // _j = _i->begin ();
- return *this;
- }
-
- _Iterator operator ++ (int)
- {
- _Iterator tmp = *this;
- ++(*this);
- return tmp;
- }
-
- _Iterator &operator -- ()
- {
- while (_j == _i->begin ())
- _j = (--_i)->end ();
- --_j;
- return *this;
- }
-
- _Iterator operator -- (int)
- {
- _Iterator tmp = *this;
- --(*this);
- return tmp;
- }
-
- value_type &operator * ()
- {
- return _j->second;
- }
- // Dan Roche 2005-7-7 I believe this was a memory leak.
- value_type *operator -> ()
- {
- return &(_j->second);
- }
- const value_type &operator*() const
- {
- return _j->second;
- }
- const value_type *operator-> () const
- {
- return &(_j->second);
- }
-
- private:
- RepIterator _i;
- RowIterator _j;
- RepIterator _A_end;
- };
-
- typedef _Iterator<typename Rep::iterator, typename Row::iterator, Element> Iterator;
- typedef _Iterator<typename Rep::const_iterator, typename Row::const_iterator, const Element> ConstIterator;
-
- Iterator Begin ()
- {
- return Iterator (_matA.begin (), _matA.front ().begin (), _matA.end ());
- }
- Iterator End ()
- {
- return Iterator (_matA.end (), _matA.back ().end (), _matA.end ());
- }
- ConstIterator Begin () const
- {
- return ConstIterator (_matA.begin (), _matA.front ().begin (), _matA.end ());
- }
- ConstIterator End () const
- {
- return ConstIterator (_matA.end (), _matA.back ().end (), _matA.end ());
- }
-
-
-
- /* Generic trait for iterators without type */
- template<typename U>
- struct IteratorValueType {
- typedef typename U::value_type value_type;
- };
-
- template<typename X>
- struct IteratorValueType<const X*> {
- typedef X value_type;
- };
-
- /* Generic trait for iterators without type */
-
-
-
- template <class RepIterator, class RowIdxIterator>
- class _IndexedIterator {
- public:
-#if 0
- typedef std::pair<size_t, size_t> value_type;
- typedef typename RowIdxIterator/*::value_type*/::second_type value_type;
- typedef typename RowIdxIterator::value_type::second_type value_type;
-#endif
- typedef typename IteratorValueType< RowIdxIterator >::value_type::second_type value_type;
-
- _IndexedIterator (size_t idx, const RepIterator &i, const RowIdxIterator &j, const RepIterator &A_end) :
- _i (i), _j (j), _A_end (A_end), _r_index (idx)
- {
- if( _i == _A_end ) return;
- while(_j == _i->end ()) {
- ++_r_index;
- if (++_i == _A_end) return;
- _j = _i->begin ();
- }
- _c_index =_j->first;
- }
-
- _IndexedIterator (const _IndexedIterator &iter) :
- _i (iter._i), _j (iter._j), _A_end (iter._A_end), _r_index (iter._r_index), _c_index (iter._c_index)
- {}
-
- _IndexedIterator ()
- {}
-
- _IndexedIterator &operator = (const _IndexedIterator &iter)
- {
- _A_end = iter._A_end;
- _i = iter._i;
- _j = iter._j;
- _r_index = iter._r_index;
- _c_index = iter._c_index;
-
- return *this;
- }
-
- bool operator == (const _IndexedIterator &i) const
- {
- return (_i == i._i) && (_j == i._j);
- }
-
- bool operator != (const _IndexedIterator &i) const
- {
- return (_i != i._i) || (_j != i._j);
- }
-
- _IndexedIterator &operator ++ ()
- {
- ++_j;
- while(_j == _i->end ()){
- ++_r_index;
- if (++_i == _A_end) return *this;
- _j = _i->begin ();
- }
- _c_index = _j->first;
-#if 0
- if (++_j == _i->end ()) {
- if (++_i != _A_end) {
- _j = _i->begin ();
- ++_r_index;
- }
- }
-
- _c_index = _j->first;
-#endif
-
- return *this;
- }
-
- _IndexedIterator operator ++ (int)
- {
- _IndexedIterator tmp = *this;
- ++(*this);
- return tmp;
- }
-
- _IndexedIterator &operator -- ()
- {
- while (_j == _i->begin ()) {
- _j = (--_i)->end ();
- --_r_index;
- }
-
- --_j;
- _c_index = _j->first;
- return *this;
- }
-
- _IndexedIterator operator -- (int)
- {
- _IndexedIterator tmp = *this;
- --(*this);
- return tmp;
- }
-
- value_type &operator * ()
- {
- return _j->second;
- }
- const value_type &operator * () const
- {
- return _j->second;
- }
- value_type *operator -> ()
- {
- return &(_j->second);
- }
- const value_type *operator -> () const
- {
- return &(_j->second);
- }
-
- size_t rowIndex () const
- {
- return _r_index;
- }
- size_t colIndex () const
- {
- return _c_index;
- }
- const value_type &value() const
- {
- return _j->second;
- }
-
- private:
- RepIterator _i;
- RowIdxIterator _j;
- RepIterator _A_end;
-
- mutable size_t _r_index;
- mutable size_t _c_index;
- };
-
- typedef _IndexedIterator<typename Rep::iterator, typename Row::iterator> IndexedIterator;
- typedef _IndexedIterator<typename Rep::const_iterator, typename Row::const_iterator> ConstIndexedIterator;
-
- IndexedIterator IndexedBegin ()
- {
- return IndexedIterator (0, _matA.begin (), _matA.front ().begin (), _matA.end ());
- }
- IndexedIterator IndexedEnd ()
- {
- return IndexedIterator (_m, _matA.end (), _matA.back ().end (), _matA.end ());
- }
- ConstIndexedIterator IndexedBegin () const
- {
- return ConstIndexedIterator (0, _matA.begin (), _matA.front ().begin (), _matA.end ());
- }
- ConstIndexedIterator IndexedEnd () const
- {
- return ConstIndexedIterator (_m, _matA.end (), _matA.back ().end (), _matA.end ());
- }
-
- Row &getRow (size_t i) {
- return _matA[i];
- }
- Row &operator [] (size_t i) {
- return _matA[i];
- }
- ConstRow &operator [] (size_t i) const
- {
- return _matA[i];
- }
-
- template <class Vector> Vector &columnDensity (Vector &v) const;
- SparseMatrixBase &transpose (SparseMatrixBase &AT) const;
-
-protected:
-
- friend class SparseMatrixWriteHelper<Element, Row>;
- friend class SparseMatrixReadWriteHelper<Element, Row>;
-
- Rep _matA;
- size_t _m;
- size_t _n;
-
- template<class F, class R, class T> friend class SparseMatrixBase;
-};
-
-/* Specialization for sparse associative vectors */
-
-template <class _Element, class _Row>
-class SparseMatrixBase<_Element, _Row, VectorCategories::SparseAssociativeVectorTag > {
-public:
-
- typedef _Element Element;
- typedef _Row Row;
- typedef const Row ConstRow;
- typedef _SP_BB_VECTOR_<Row> Rep;
-
- template<typename _Tp1, typename _R1 = typename Rebind<_Row,_Tp1>::other >
- struct rebind {
- typedef SparseMatrixBase<typename _Tp1::Element, _R1, VectorCategories::SparseAssociativeVectorTag> other;
- };
-
- SparseMatrixBase (size_t m, size_t n) :
- _matA (m), _m (m), _n (n)
- {}
- SparseMatrixBase (const SparseMatrixBase<Element, Row> &A) :
- _matA (A._matA), _m (A._m), _n (A._n)
- {}
-
- template<class VectorType>
- SparseMatrixBase (const SparseMatrixBase<Element, VectorType> &A) :
- _matA(A.m), _m (A._m), _n (A._n)
- {
- typename Rep::iterator meit = this->_matA.begin();
- typename SparseMatrixBase<Element, VectorType>::Rep::const_iterator copit = A._matA.begin();
- for( ; meit != this->_matA.end(); ++meit, ++copit)
- LinBox::RawVector<Element>::convert(*meit, *copit);
- }
-
- /** Constructor from a MatrixStream
- */
- template <class Field>
- SparseMatrixBase ( MatrixStream<Field>& ms );
- ~SparseMatrixBase () {}
-
- size_t rowdim () const
- {
- return _m;
- }
- size_t coldim () const
- {
- return _n;
- }
- size_t size () const
- {
- size_t s(0);
- for(typename Rep::const_iterator it = _matA.begin(); it != _matA.end(); ++it)
- s+= LinBox::RawVector<_Element>::size(*it);
- return s;
- }
-
- template <class Field>
- std::istream &read (std::istream &is, const Field &F, FileFormatTag format = FORMAT_DETECT)
- {
- return SparseMatrixReadWriteHelper<Element, Row>::read
- (*this, is, F, format);
- }
- std::istream &read (std::istream &is, FileFormatTag format = FORMAT_DETECT)
- {
- return SparseMatrixReadWriteHelper<Element, Row>::read
- (*this, is, SparseMatrixReadWriteHelper<Element, Row>::NoField (),
- format);
- }
- template <class Field>
- std::ostream &write (std::ostream &os, const Field &F, FileFormatTag format = FORMAT_PRETTY) const
- {
- return SparseMatrixReadWriteHelper<Element, Row>::write
- (*this, os, F, format);
- }
- std::ostream &write (std::ostream &os, FileFormatTag format = FORMAT_PRETTY) const
- {
- return SparseMatrixReadWriteHelper<Element, Row>::write
- (*this, os, SparseMatrixReadWriteHelper<Element, Row>::NoField (),
- format);
- }
-
- void setEntry (size_t i, size_t j, const Element &value) { _matA[i][j] = value;
- }
- Element &refEntry (size_t i, size_t j) {
- return _matA[i][j];
- }
- const Element &getEntry (size_t i, size_t j) const;
- Element &getEntry (Element &x, size_t i, size_t j) const
- {
- return x = _matA[i][j];
- }
-
- typedef typename Rep::iterator RowIterator;
- typedef typename Rep::const_iterator ConstRowIterator;
-
- ConstRowIterator rowBegin () const
- {
- return _matA.begin ();
- }
- ConstRowIterator rowEnd () const
- {
- return _matA.end ();
- }
- RowIterator rowBegin ()
- {
- return _matA.begin ();
- }
- RowIterator rowEnd ()
- {
- return _matA.end ();
- }
-
- template <class RepIterator, class RowEltIterator, class _I_Element>
- class _Iterator {
- public:
- typedef _I_Element value_type;
-
- _Iterator (const RepIterator &i, const RowEltIterator &j, const RepIterator &A_end) :
- _i (i), _j (j), _A_end (A_end)
- {
- if( _i == _A_end ) return;
- while( _j == _i->end() ) {
- if( ++_i == _A_end ) return;
- _j = _i->begin();
- }
- }
-
- _Iterator (const _Iterator &iter) :
- _i (iter._i), _j (iter._j), _A_end (iter._A_end)
- {}
-
- _Iterator () {}
-
- _Iterator &operator = (const _Iterator &iter)
- {
- _i = iter._i;
- _j = iter._j;
- _A_end = iter._A_end;
-
- return *this;
- }
-
- bool operator == (const _Iterator &i) const
- {
- return (_i == i._i) && (_j == i._j);
- }
-
- bool operator != (const _Iterator &i) const
- {
- return (_i != i._i) || (_j != i._j);
- }
-
- _Iterator &operator ++ ()
- {
- while (++_j == _i->end ()) {
- if (++_i == _A_end ()) return *this;
- _j = _i->begin ();
- }
- return *this;
- }
-
- _Iterator operator ++ (int)
- {
- _Iterator tmp = *this;
- ++(*this);
- return tmp;
- }
-
- _Iterator &operator -- ()
- {
- while (_j == _i->begin ())
- _j = (--_i)->end ();
- --_j;
- return *this;
- }
-
- _Iterator operator -- (int)
- {
- _Iterator tmp = *this;
- --(*this);
- return tmp;
- }
-
- value_type &operator * ()
- {
- return _j->second;
- }
- value_type *operator -> ()
- {
- return &(_j->second);
- }
-
- private:
- RepIterator _i;
- RowEltIterator _j;
- RepIterator _A_end;
- };
-
- typedef _Iterator<typename Rep::iterator, typename Row::iterator, Element> Iterator;
- typedef _Iterator<typename Rep::const_iterator, typename Row::const_iterator, const Element> ConstIterator;
-
- Iterator Begin ()
- {
- return Iterator (_matA.begin (), _matA.front ().begin (), _matA.end ());
- }
- Iterator End ()
- {
- return Iterator (_matA.end (), _matA.back ().end (), _matA.end ());
- }
- ConstIterator Begin () const
- {
- return ConstIterator (_matA.begin (), _matA.front ().begin (), _matA.end ());
- }
- ConstIterator End () const
- {
- return ConstIterator (_matA.end (), _matA.back ().end (), _matA.end ());
- }
-
- template <class RepIterator, class RowIdxIterator>
- class _IndexedIterator {
- public:
- typedef std::pair<size_t, size_t> value_type;
-
- _IndexedIterator (size_t idx, const RepIterator &i, const RowIdxIterator &j, const RepIterator &A_end) :
- _i (i), _j (j), _A_end (A_end), _r_index (idx), _c_index (0)
- {
- if( _i == _A_end ) return;
- while( _j == _i->end() ) {
- ++_r_index;
- if( ++_i == _A_end ) return;
- _j = _i->begin();
- }
- _c_index = _j->second;
- }
-
- _IndexedIterator (const _IndexedIterator &iter) :
- _i (iter._i), _j (iter._j), _A_end (iter._A_end), _r_index (iter._r_index), _c_index (iter._c_index)
- {}
-
- _IndexedIterator ()
- {}
-
- _IndexedIterator &operator = (const _IndexedIterator &iter)
- {
- _A_end = iter._A_end;
- _i = iter._i;
- _j = iter._j;
- _r_index = iter._r_index;
- _c_index = iter._c_index;
-
- return *this;
- }
-
- bool operator == (const _IndexedIterator &i) const
- {
- return (_i == i._i) && (_j == i._j);
- }
-
- bool operator != (const _IndexedIterator &i) const
- {
- return (_i != i._i) || (_j != i._j);
- }
-
- _IndexedIterator &operator ++ ()
- {
- ++_j;
- while (_j == _i->end ()) {
- ++_r_index;
- if (++_i == _A_end ()) return *this;
- _j = _i->begin ();
- }
-
- _c_index = _j->second;
-
- return *this;
- }
-
- _IndexedIterator operator ++ (int)
- {
- _IndexedIterator tmp = *this;
- ++(*this);
- return tmp;
- }
-
- _IndexedIterator &operator -- ()
- {
- while (_j == _i->begin ()) {
- _j = (--_i)->end ();
- --_r_index;
- }
-
- --_j;
- _c_index = _j->second;
- return *this;
- }
-
- _IndexedIterator operator -- (int)
- {
- _IndexedIterator tmp = *this;
- --(*this);
- return tmp;
- }
-
- value_type &operator * ()
- {
- return *_j;
- }
- const value_type &operator * () const
- {
- return *_j;
- }
- value_type *operator -> ()
- {
- return &(*_j);
- }
- const value_type *operator -> () const
- {
- return &(*_j);
- }
-
- size_t rowIndex () const
- {
- return _r_index;
- }
- size_t colIndex () const
- {
- return _c_index;
- }
- const value_type &value() const
- {
- return *_j;
- }
-
- private:
- RepIterator _i;
- RowIdxIterator _j;
- RepIterator _A_end;
-
- mutable size_t _r_index;
- mutable size_t _c_index;
- };
-
- typedef _IndexedIterator<typename Rep::iterator, typename Row::iterator> IndexedIterator;
- typedef _IndexedIterator<typename Rep::const_iterator, typename Row::const_iterator> ConstIndexedIterator;
-
- IndexedIterator IndexedBegin ()
- {
- return IndexedIterator (0, _matA.begin (), _matA.front ().begin (), _matA.end ());
- }
- IndexedIterator IndexedEnd ()
- {
- return IndexedIterator (_m, _matA.end (), _matA.back ().end (), _matA.end ());
- }
- ConstIndexedIterator IndexedBegin () const
- {
- return ConstIndexedIterator (0, _matA.begin (), _matA.front ().begin (), _matA.end ());
- }
- ConstIndexedIterator IndexedEnd () const
- {
- return ConstIndexedIterator (_m, _matA.end (), _matA.back ().end (), _matA.end ());
- }
-
- Row &getRow (size_t i) {
- return _matA[i];
- }
- Row &operator [] (size_t i) {
- return _matA[i];
- }
- ConstRow &operator [] (size_t i) const
- {
- return _matA[i];
- }
-
- template <class Vector> Vector &columnDensity (Vector &v) const;
- SparseMatrixBase &transpose (SparseMatrixBase &AT) const;
-
-protected:
-
- friend class SparseMatrixWriteHelper<Element, Row>;
- friend class SparseMatrixReadWriteHelper<Element, Row>;
-
- Rep _matA;
- size_t _m;
- size_t _n;
-
- template<class F, class R, class T> friend class SparseMatrixBase;
-};
-
-/* Specialization for sparse parallel vectors */
-
-template <class _Element, class _Row>
-class SparseMatrixBase<_Element, _Row, VectorCategories::SparseParallelVectorTag > {
-public:
-
- typedef _Element Element;
- typedef _Row Row;
- typedef const Row ConstRow;
- typedef _SP_BB_VECTOR_<Row> Rep;
-
- template<typename _Tp1, typename _R1 = typename Rebind<_Row,_Tp1>::other >
- struct rebind {
- typedef SparseMatrixBase<typename _Tp1::Element, _R1, VectorCategories::SparseParallelVectorTag> other;
- };
-
- SparseMatrixBase (size_t m, size_t n) :
- _matA (m), _m (m), _n (n)
- {}
-
- template<class Field>
- SparseMatrixBase (Field & F, size_t m, size_t n) :
- _matA (m), _m (m), _n (n)
- {}
-
-
- SparseMatrixBase (const SparseMatrixBase<Element, Row> &A) :
- _matA (A._matA), _m (A._m), _n (A._n)
- {}
-
- template<class VectorType>
- SparseMatrixBase (const SparseMatrixBase<Element, VectorType> &A) :
- _matA(A._m), _m (A._m), _n (A._n)
- {
- typename Rep::iterator meit = this->_matA.begin();
- typename SparseMatrixBase<Element, VectorType>::Rep::const_iterator copit = A._matA.begin();
- for( ; meit != this->_matA.end(); ++meit, ++copit)
- LinBox::RawVector<Element>::convert(*meit, *copit);
- }
-
- /** Constructor from a MatrixStream
- */
- template <class Field>
- SparseMatrixBase ( MatrixStream<Field>& ms );
-
- ~SparseMatrixBase () {}
-
- size_t rowdim () const
- {
- return _m;
- }
- size_t coldim () const
- {
- return _n;
- }
- size_t size () const
- {
- size_t s(0);
- for(typename Rep::const_iterator it = _matA.begin(); it != _matA.end(); ++it)
- s+= LinBox::RawVector<_Element>::size(*it);
- return s;
- }
-
- template <class Field>
- std::istream &read (std::istream &is, const Field &F, FileFormatTag format = FORMAT_DETECT)
- {
- return SparseMatrixReadWriteHelper<Element, Row>::read
- (*this, is, F, format);
- }
-
- std::istream &read (std::istream &is, FileFormatTag format = FORMAT_DETECT)
- {
- return SparseMatrixReadWriteHelper<Element, Row>::read
- (*this, is, SparseMatrixReadWriteHelper<Element, Row>::NoField (),
- format);
- }
-
- template <class Field>
- std::ostream &write (std::ostream &os, const Field &F, FileFormatTag format = FORMAT_PRETTY) const
- {
- return SparseMatrixReadWriteHelper<Element, Row>::write
- (*this, os, F, format);
- }
-
- std::ostream &write (std::ostream &os, FileFormatTag format = FORMAT_PRETTY) const
- {
- return SparseMatrixReadWriteHelper<Element, Row>::write
- (*this, os, typename SparseMatrixReadWriteHelper<Element, Row>::NoField (),
- format);
- }
-
- void setEntry (size_t i, size_t j, const Element &value);
- Element &refEntry (size_t i, size_t j);
- const Element &getEntry (size_t i, size_t j) const;
- Element &getEntry (Element &x, size_t i, size_t j) const
- {
- return x = getEntry (i, j);
- }
-
- typedef typename Rep::iterator RowIterator;
- typedef typename Rep::const_iterator ConstRowIterator;
-
- ConstRowIterator rowBegin () const
- {
- return _matA.begin ();
- }
- ConstRowIterator rowEnd () const
- {
- return _matA.end ();
- }
- RowIterator rowBegin ()
- {
- return _matA.begin ();
- }
- RowIterator rowEnd ()
- {
- return _matA.end ();
- }
-
- template <class RepIterator, class RowEltIterator, class _I_Element>
- class _Iterator {
- public:
- typedef _I_Element value_type;
-
- _Iterator (const RepIterator &i, const RowEltIterator &j, const RepIterator &A_end) :
- _i (i), _j (j), _A_end (A_end)
- {
- if( _i == _A_end ) return;
- while( _j == _i->second.end() ) {
- if( ++_i == _A_end ) return;
- _j = _i->second.begin();
- }
- }
-
- _Iterator (const _Iterator &iter) :
- _i (iter._i), _j (iter._j), _A_end (iter._A_end)
- {}
-
- _Iterator () {}
-
- _Iterator &operator = (const _Iterator &iter)
- {
- _i = iter._i;
- _j = iter._j;
- _A_end = iter._A_end;
-
- return *this;
- }
-
- bool operator == (const _Iterator &i) const
- {
- return (_i == i._i) && (_j == i._j);
- }
-
- bool operator != (const _Iterator &i) const
- {
- return (_i != i._i) || (_j != i._j);
- }
-
- _Iterator &operator ++ ()
- {
- ++_j;
- while( _j == _i->second.end() ) {
- if( ++_i == _A_end ) return *this;
- _j = _i->second.begin();
- }
- return *this;
- }
-
- _Iterator operator ++ (int)
- {
- _Iterator tmp = *this;
- ++(*this);
- return tmp;
- }
-
- _Iterator &operator -- ()
- {
- while (_j == _i->second.begin ())
- _j = (--_i)->second.end ();
- --_j;
- return *this;
- }
-
- _Iterator operator -- (int)
- {
- _Iterator tmp = *this;
- --(*this);
- return tmp;
- }
-
- value_type &operator * ()
- {
- return static_cast<value_type&>(*_j);
- }
- value_type *operator -> ()
- {
- return &(*_j);
- }
-
- private:
- RepIterator _i;
- RowEltIterator _j;
- RepIterator _A_end;
- };
-
- typedef _Iterator<typename Rep::iterator, typename Row::second_type::iterator, Element> Iterator;
- typedef _Iterator<typename Rep::const_iterator, typename Row::second_type::const_iterator, const Element> ConstIterator;
-
- Iterator Begin ()
- {
- return Iterator (_matA.begin (), _matA.front ().second.begin (), _matA.end ());
- }
- Iterator End ()
- {
- return Iterator (_matA.end (), _matA.back ().second.end (), _matA.end ());
- }
- ConstIterator Begin () const
- {
- return ConstIterator (_matA.begin (), _matA.front ().second.begin (), _matA.end ());
- }
- ConstIterator End () const
- {
- return ConstIterator (_matA.end (), _matA.back ().second.end (), _matA.end ());
- }
-
- /* Generic trait for iterators without type */
- template<typename U>
- struct IteratorValueType {
- typedef typename U::value_type value_type;
- };
-
- template<typename X>
- struct IteratorValueType<const X*> {
- typedef X value_type;
- };
-
-
- template <class RepIterator, class RowIdxIterator>
- class _IndexedIterator {
- public:
- typedef typename IteratorValueType<RepIterator>::value_type PairValue ;
- typedef typename PairValue::second_type::value_type value_type;
-
- // typedef typename IteratorValueType< RepIterator >::second_type::value_type value_type;
-
- // Dan Roche 7-6-05 Fixed a seg fault this code was causing
- _IndexedIterator (size_t idx, const RepIterator &i,
- const RowIdxIterator &j, const RepIterator &A_end) :
- _i (i), _j (j), _A_end (A_end), _r_index (idx), _c_index(0), _value_index(0)
- {
- if( _i == _A_end ) return;
- while( _j == _i->first.end() ) {
- if( ++_i == _A_end ) return;
- ++_r_index;
- _j = _i->first.begin();
- }
-
- _c_index = *_j;
- _value_index = _j-_i->first.begin();
- }
-
- _IndexedIterator (const _IndexedIterator &iter) :
- _i (iter._i), _j (iter._j),
- _A_end (iter._A_end), _r_index (iter._r_index),
- _c_index (iter._c_index), _value_index( iter._value_index )
- {}
-
- _IndexedIterator ()
- {}
-
- _IndexedIterator &operator = (const _IndexedIterator &iter)
- {
- _A_end = iter._A_end;
- _i = iter._i;
- _j = iter._j;
- _r_index = iter._r_index;
- _c_index = iter._c_index;
- _value_index = iter._value_index;
-
- return *this;
- }
-
- bool operator == (const _IndexedIterator &i) const
- {
- return (_i == i._i) && (_j == i._j);
- }
-
- bool operator != (const _IndexedIterator &i) const
- {
- return (_i != i._i) || (_j != i._j);
- }
-
- _IndexedIterator &operator ++ ()
- {
- if(_j != _i->first.end ()) {
- ++_j ;
- ++_value_index;
- }
- while(_j == _i->first.end ()) {
- ++_r_index;
- if (++_i == _A_end) return *this;
- _j = _i->first.begin ();
- _value_index = 0;
- }
- _c_index = *_j;
-
- return *this;
- }
-
- _IndexedIterator operator ++ (int)
- {
- _IndexedIterator tmp = *this;
- ++(*this);
- return tmp;
- }
-
- _IndexedIterator &operator -- ()
- {
- while (_j == _i->first.begin ()) {
- _j = (--_i)->first.end ();
- _value_index = _i->first.size();
- --_r_index;
- }
-
- --_j;
- --_value_index;
- _c_index = *_j;
- return *this;
- }
-
- _IndexedIterator operator -- (int)
- {
- _IndexedIterator tmp = *this;
- --(*this);
- return tmp;
- }
-
-#if 0
- const value_type &operator * () const
- {
- return *(_i->second.begin () + _c_index);
- }
-#endif
- value_type &operator * ()
- {
- return (value_type&)(_i->second)[_value_index];
- }
-#if 0
- value_type *operator -> ()
- {
- return &(*(_i->second.begin () + _c_index));
- }
- const value_type *operator -> () const
- {
- return &(*(_i->second.begin () + _c_index));
- }
-#endif
-
- size_t rowIndex () const
- {
- return _r_index;
- }
- size_t colIndex () const
- {
- return _c_index;
- }
- const value_type &value () const
- {
- return (const value_type&)(_i->second)[_value_index];
- }
-
- private:
- RepIterator _i;
- RowIdxIterator _j;
- RepIterator _A_end;
-
- mutable size_t _r_index;
- mutable size_t _c_index;
- mutable size_t _value_index;
- };
-
- typedef _IndexedIterator<typename Rep::iterator, typename Row::first_type::iterator> IndexedIterator;
- typedef _IndexedIterator<typename Rep::const_iterator, typename Row::first_type::const_iterator> ConstIndexedIterator;
-
- IndexedIterator IndexedBegin ()
- {
- return IndexedIterator (0, _matA.begin (), _matA.front ().first.begin (), _matA.end ());
- }
- IndexedIterator IndexedEnd ()
- {
- return IndexedIterator (_m, _matA.end (), _matA.back ().first.end (), _matA.end ());
- }
- ConstIndexedIterator IndexedBegin () const
- {
- return ConstIndexedIterator (0, _matA.begin (), _matA.front ().first.begin (), _matA.end ());
- }
- ConstIndexedIterator IndexedEnd () const
- {
- return ConstIndexedIterator (_m, _matA.end (), _matA.back ().first.end (), _matA.end ());
- }
-
- Row &getRow (size_t i) {
- return _matA[i];
- }
- Row &operator [] (size_t i) {
- return _matA[i];
- }
- ConstRow &operator [] (size_t i) const
- {
- return _matA[i];
- }
-
- template <class Vector> Vector &columnDensity (Vector &v) const;
- SparseMatrixBase &transpose (SparseMatrixBase &AT) const;
-
-protected:
-
- friend class SparseMatrixWriteHelper<Element, Row>;
- friend class SparseMatrixReadWriteHelper<Element, Row>;
-
- Rep _matA;
- size_t _m;
- size_t _n;
-
- template<class F, class R, class T> friend class SparseMatrixBase;
-};
-
-template <class Element, class Row>
-std::ostream &operator << (std::ostream &os, const SparseMatrixBase<Element, Row> &A)
-{
- return A.write (os);
-}
-
-template <class Element, class Row>
-std::istream &operator >> (std::istream &is, SparseMatrixBase<Element, Row> &A)
-{
- return A.read (is);
-}
-
-template <class Element, class Row, class Trait>
-struct MatrixTraits< SparseMatrixBase<Element, Row, Trait> >
-{
- typedef SparseMatrixBase<Element, Row, Trait> MatrixType;
- typedef typename MatrixCategories::RowMatrixTag MatrixCategory;
-};
-
-template <class Element, class Row, class Trait>
-struct MatrixTraits< const SparseMatrixBase<Element, Row, Trait> >
-{
- typedef const SparseMatrixBase<Element, Row, Trait> MatrixType;
- typedef typename MatrixCategories::RowMatrixTag MatrixCategory;
-};
-
-} // namespace LinBox
-
-#include "linbox/matrix/sparse.inl"
-
-#endif // __LINBOX_matrix_sparse_H
-
-
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
-// Local Variables:
-// mode: C++
-// tab-width: 8
-// indent-tabs-mode: nil
-// c-basic-offset: 8
-// End:
-
diff --git a/linbox/matrix/sparse.inl b/linbox/matrix/sparse.inl
deleted file mode 100644
index 3873b9c..0000000
--- a/linbox/matrix/sparse.inl
+++ /dev/null
@@ -1,983 +0,0 @@
-/* linbox/matrix/sparse.inl
- * Copyright (C) 2001-2002 Bradford Hovinen
- * 1999-2001 William J Turner,
- *
- * Written by Bradford Hovinen <hovinen at cis.udel.edu>
- * Based on sparse-base.h by William J Turner <wjturner at math.ncsu.edu>
- *
- * --------------------------------------------------------
- * 2003-01-11 Bradford Hovinen <bghovinen at math.uwaterloo.ca>
- *
- * Move from blackbox/sparse-base.inl to matrix/sparse.inl
- * ------------------------------------
- * 2002-11-28 Bradford Hovinen <bghovinen at math.uwaterloo.ca>
- *
- * - Renamed ColOfRowsIterator to RowIterator
- * - Named template argument _Row rather than Row; add a typedef to Row
- * ------------------------------------
- *
- *
- * ========LICENCE========
- * This file is part of the library LinBox.
- *
- * LinBox is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- * ========LICENCE========
- *.
- */
-
-#ifndef __LINBOX_matrix_sparse_INL
-#define __LINBOX_matrix_sparse_INL
-
-#include "linbox/linbox-config.h"
-
-#include <iostream>
-#include <sstream>
-#include <algorithm>
-#include <cmath>
-#include <cctype>
-#include <cstring>
-
-#include "linbox/matrix/sparse.h"
-#include "linbox/vector/vector-traits.h"
-#include "linbox/vector/vector-domain.h"
-#include "linbox/util/debug.h"
-#include "linbox/util/commentator.h"
-
-namespace LinBox
-{
-
- template <class Element, class Row, class Trait>
- template <class Field>
- std::istream &SparseMatrixReadWriteHelper<Element, Row, Trait> ::readTurner (SparseMatrixBase<Element, Row> &A, std::istream &is, const Field &F, char *buf)
- {
- size_t i, j;
-
- A._matA.clear ();
- A._matA.resize (A._m);
-
- do {
- std::istringstream str (buf);
-
- str >> i;
-
- if (i == (size_t) -1) break; // return also if row index is -1
- str >> j;
- F.read (str, A.refEntry (i, j));
-
- is.getline (buf, 80);
- } while (is);
-
- return is;
- }
-
- template <class Element, class Row, class Trait>
- template <class Field>
- std::istream &SparseMatrixReadWriteHelper<Element, Row, Trait> ::readGuillaume (SparseMatrixBase<Element, Row> &A, std::istream &is, const Field &F, char *buf)
- {
- size_t i, j;
-
- std::istringstream str (buf);
- str >> A._m >> A._n;
-
- A._matA.clear ();
- A._matA.resize (A._m);//cerr<<A.coldim()<<" "<<A.rowdim()<<endl;
-
- Element x;
- while (is >> i) {
- if (i == 0 || i == (size_t) -1) {is >> j; F.read(is, x); break;}
- is >> j;
- if (i > A._m || j > A._n)
- throw InvalidMatrixInput ();
- F.read (is, x);
- if (! F.isZero(x)) A.setEntry (i - 1, j - 1, x);
- }
-
- return is;
-
- }
-
- template <class Element, class Row, class Trait>
- template <class Field>
- std::istream &SparseMatrixReadWriteHelper<Element, Row, Trait> ::readMatlab (SparseMatrixBase<Element, Row> &A, std::istream &is, const Field &F, char *buf)
- {
- size_t i = 0, j = 0;
- char c;
- Element a_ij;
-
- while (1) {
- do is >> c; while (is && !std::isdigit (c));
- if (!is) break;
-
- is.putback (c);
-
- F.read (is, a_ij);
- A.setEntry (i, j++, a_ij);
-
- do is >> c; while (is && c != ',' && c != ';' && c != ']');
- if (!is) break;;
-
- if (c == ';') {
- ++i;
- j = 0;
- }
- else if (c == ']') break;
- }
-
- return is;
- }
-
- template <class Element, class Row, class Trait>
- template <class Field>
- std::istream &SparseMatrixReadWriteHelper<Element, Row, Trait> ::readPretty (SparseMatrixBase<Element, Row> &A, std::istream &is, const Field &F, char *buf)
- {
- size_t i, j;
- Element a_ij;
- char c;
-
- A._m = 0;
- A._matA.clear ();
-
- i = 0;
-
- do {
- A._m++;
- A._matA.push_back (Row ());
-
- std::istringstream str (buf);
-
- do str >> c; while (isspace (c));
- if (c != '[')
- throw InvalidMatrixInput ();
-
- j = 0;
-
- while (str) {
- do str >> c; while (isspace (c));
- if (!str || c == ']') break;
- F.read (str, a_ij);
-
- j++;
- if (j > A._n)
- A._n++;
-
- if (!F.isZero(a_ij))
- A.setEntry (i, j, a_ij);
- }
-
- is.getline (buf, 80);
-
- i++;
- } while (is);
-
- return is;
-
- }
-
- template <class Element, class Row, class Trait>
- template <class Field>
- std::istream &SparseMatrixReadWriteHelper<Element, Row, Trait> ::readMagmaCpt (SparseMatrixBase<Element, Row> &A, std::istream &is, const Field &F, char *buf)
- {
- size_t i, j;
- Element a_ij;
- char c;
- const char matrixstart = '[', matrixend = ']';
- const char rowstart = '[', rowend = ']';
- const char pairstart = '[', pairend = ']';
-
- A._m = A._n = 0;
- A._matA.clear ();
-
- do {is.get(c);} while (c != matrixstart ); // find matrix start
- i = 0;
- while (true)
- {
- do {is.get(c);} while (c != matrixend && c != rowstart);
- if (c == matrixend) return is;
- else
- {
- A._m++;
- A._matA.push_back (Row ());
- //processrow(i)
- while (true)
- {
- do {is.get(c);} while (c != pairstart && c != rowend );
- if (c == rowend) break;
- else
- { //processpair( j v for row i);
- is >> j;
- if (j > A._n) A._n = j;
- do {is.get(c);} while (!std::isdigit(c) && c != '-' && c != '+');
- is.unget();
- F.read(is, a_ij);
- if (!F.isZero(a_ij)) A.setEntry (i, j-1, a_ij);
- do {is.get(c);} while (c != pairend);
- }
- }
- ++i;
- }
- }
- //return is; //BB: unreachable
- }
-
- template <class Element, class Row, class Trait>
- template <class Field>
- std::istream &SparseMatrixReadWriteHelper<Element, Row, Trait> ::read (SparseMatrixBase<Element, Row> &A, std::istream &is, const Field &F,
- FileFormatTag format)
- {
- char buf[80];
- buf[0]=0;
- char c;
-
- switch (format) {
- case FORMAT_DETECT: {
- is.getline (buf, 80);
- std::istringstream str (buf);
- do str >> c; while (isspace (c));
-
- if (c == '[') {
- if (strchr (buf, ';') != NULL)
- readMatlab (A, is, F, buf);
- else
- readPretty (A, is, F, buf);
- }
- else if (std::isdigit (c)) {
- do str >> c; while (str && (isspace (c) || std::isdigit (c)));
-
- if (c == 'M')
- return readGuillaume (A, is, F, buf);
- else
- return readTurner (A, is, F, buf);
- }
- else
- throw InvalidMatrixInput ();
- break;
- }
-
- case FORMAT_TURNER:
- return readTurner (A, is, F, buf);
- case FORMAT_GUILLAUME:
- return readGuillaume (A, is, F, buf);
- case FORMAT_MATLAB:
- return readMatlab (A, is, F, buf);
- case FORMAT_PRETTY:
- return readPretty (A, is, F, buf);
- case FORMAT_MAGMACPT:
- return readMagmaCpt (A, is, F, buf);
- default:
- throw InvalidMatrixInput();
- }
-
- return is;
- }
-
- template <class Element, class Row, class Trait>
- template <class Field>
- std::ostream &SparseMatrixWriteHelper<Element, Row, Trait> ::write (const SparseMatrixBase<Element, Row> &A, std::ostream &os, const Field &F,
- FileFormatTag format)
- {
- typename SparseMatrixBase<Element, Row>::Rep::const_iterator i;
- typename Row::const_iterator j;
- typename Field::Element zero;
- size_t i_idx, j_idx;
- // int col_width;
- integer c;
- bool firstrow;
-
- // Avoid massive unneeded overhead in the case that this
- // printing is disabled
- if (commentator().isNullStream (os))
- return os;
-
- switch (format) {
- case FORMAT_DETECT:
- throw PreconditionFailed (__func__, __LINE__, "format != FORMAT_DETECT");
- //break;//BB: unreachable
-
- case FORMAT_TURNER:
- // The i j v triples, with zero based indices.
- for (i = A._matA.begin (), i_idx = 0; i != A._matA.end (); i++, i_idx++) {
- for (j = i->begin (), j_idx = 0; j != i->end (); j++, j_idx++) {
- os << i_idx << ' ' << j->first << ' ';
- F.write (os, j->second);
- os << std::endl;
- }
- }
- break;
-
- case FORMAT_ONE_BASED:
- // The i j v triples, with zero based indices.
- for (i = A._matA.begin (), i_idx = 0; i != A._matA.end (); i++, i_idx++) {
- for (j = i->begin (), j_idx = 0; j != i->end (); j++, j_idx++) {
- os << i_idx + 1 << ' ' << j->first + 1 << ' ';
- F.write (os, j->second);
- os << std::endl;
- }
- }
- break;
-
- case FORMAT_GUILLAUME:
- // row col 'M' header line followed by the i j v triples, one based,
- // followed by 0 0 0.
- os << A._m << ' ' << A._n << " M" << std::endl;
-
- for (i = A._matA.begin (), i_idx = 0; i != A._matA.end (); i++, i_idx++) {
- for (j = i->begin (), j_idx = 0; j != i->end (); j++, j_idx++) {
- os << i_idx + 1 << ' ' << j->first + 1 << ' ';
- F.write (os, j->second);
- os << std::endl;
- }
- }
-
- os << "0 0 0" << std::endl;
-
- break;
-
- case FORMAT_MATLAB:
- F.init (zero, 0);
-
- os << "[";
-
- for (i = A._matA.begin (), i_idx = 0; i != A._matA.end (); i++, i_idx++) {
- j = i->begin ();
-
- for (j_idx = 0; j_idx < A._n; j_idx++) {
- if (j == i->end () || j_idx != j->first)
- F.write (os, zero);
- else {
- F.write (os, j->second);
- j++;
- }
-
- if (j_idx < A._n - 1)
- os << ", ";
- }
-
- os << "; ";
- }
-
- os << "]";
-
- break;
-
- case FORMAT_MAPLE:
- F.init (zero, 0);
-
- os << "[";
- firstrow=true;
-
- for (i = A._matA.begin (), i_idx = 0; i != A._matA.end (); ++i, ++i_idx) {
- if (firstrow) {
- os << "[";
- firstrow =false;
- }
- else
- os << ", [";
-
- j = i->begin ();
-
- for (j_idx = 0; j_idx < A._n; j_idx++) {
- if (j == i->end () || j_idx != j->first)
- F.write (os, zero);
- else {
- F.write (os, j->second);
- j++;
- }
-
- if (j_idx < A._n - 1)
- os << ", ";
- }
-
- os << " ]";
- }
-
- os << "]";
-
- break;
-
- case FORMAT_PRETTY:
- //F.characteristic (c);
- //col_width = (int) ceil (log ((double) c) / M_LN10);
- F.init (zero, 0);
-
- for (i = A._matA.begin (), i_idx = 0; i != A._matA.end (); i++, i_idx++) {
- os << " [ ";
-
- j = i->begin ();
-
- for (j_idx = 0; j_idx < A._n; j_idx++) {
- //os.width (col_width);
-
- if (j == i->end () || j_idx != j->first)
- F.write (os, zero);
- else {
- F.write (os, j->second);
- j++;
- }
-
- os << ' ';
- }
-
- os << ']' << std::endl;
- }
-
- break;
-
- case FORMAT_MAGMACPT:
- os << "sparse matrix written in MagmaCpt form is not implemented" << std::endl;
- break;
- }
-
- return os;
- }
-
- template <class Element, class Row>
- template <class Field>
- std::ostream &SparseMatrixWriteHelper<Element, Row, VectorCategories::SparseParallelVectorTag > ::write (const SparseMatrixBase<Element, Row> &A, std::ostream &os, const Field &F,
- FileFormatTag format)
- {
- typename SparseMatrixBase<Element, Row>::Rep::const_iterator i;
- typename Row::first_type::const_iterator j_idx;
- typename Row::second_type::const_iterator j_elt;
- typename Field::Element zero;
- size_t i_idx, j_idx_1, col_idx;
- //int col_width;
- integer c;
- bool firstrow;
-
- // Avoid massive unneeded overhead in the case that this
- // printing is disabled
- if (commentator().isNullStream (os))
- return os;
-
- switch (format) {
- case FORMAT_DETECT:
- throw PreconditionFailed (__func__, __LINE__, "format != FORMAT_DETECT");
- //break//BB: unreachable;
-
- case FORMAT_TURNER:
- for (i = A._matA.begin (), i_idx = 0; i != A._matA.end (); i++, i_idx++) {
- for (j_idx = i->first.begin (), j_elt = i->second.begin ();
- j_idx != i->first.end ();
- ++j_idx, ++j_elt)
- {
- os << i_idx << ' ' << *j_idx << ' ';
- F.write (os, *j_elt);
- os << std::endl;
- }
- }
-
- break;
-
- case FORMAT_ONE_BASED:
- for (i = A._matA.begin (), i_idx = 0; i != A._matA.end (); i++, i_idx++) {
- for (j_idx = i->first.begin (), j_elt = i->second.begin ();
- j_idx != i->first.end ();
- ++j_idx, ++j_elt)
- {
- os << i_idx + 1 << ' ' << *j_idx + 1 << ' ';
- F.write (os, *j_elt);
- os << std::endl;
- }
- }
-
- break;
-
- case FORMAT_GUILLAUME:
- os << A._m << ' ' << A._n << " M" << std::endl;
-
- for (i = A._matA.begin (), i_idx = 0; i != A._matA.end (); i++, i_idx++) {
- for (j_idx = i->first.begin (), j_elt = i->second.begin ();
- j_idx != i->first.end ();
- ++j_idx, ++j_elt)
- {
- os << i_idx + 1 << ' ' << *j_idx + 1 << ' ';
- F.write (os, *j_elt);
- os << std::endl;
- }
- }
-
- os << "0 0 0" << std::endl;
-
- break;
-
- case FORMAT_MAPLE:
- F.init (zero, 0);
- firstrow=true;
-
- os << "[";
-
- for (i = A._matA.begin (), i_idx = 0; i != A._matA.end (); i++, i_idx++) {
- if (firstrow) {
- os << "[";
- firstrow =false;
- }
- else
- os << ", [";
-
- j_idx = i->first.begin ();
- j_elt = i->second.begin ();
-
- for (j_idx_1 = 0; j_idx_1 < A._n; j_idx_1++) {
- if (j_idx == i->first.end () || j_idx_1 != *j_idx)
- F.write (os, zero);
- else {
- F.write (os, *j_elt);
- ++j_idx;
- ++j_elt;
- }
-
- if (j_idx_1 < A._n - 1)
- os << ", ";
- }
-
- os << "]";
- }
-
- os << "]";
-
- break;
-
- case FORMAT_MATLAB:
- F.init (zero, 0);
-
- os << "[";
-
- for (i = A._matA.begin (), i_idx = 0; i != A._matA.end (); i++, i_idx++) {
- j_idx = i->first.begin ();
- j_elt = i->second.begin ();
-
- for (j_idx_1 = 0; j_idx_1 < A._n; j_idx_1++) {
- if (j_idx == i->first.end () || j_idx_1 != *j_idx)
- F.write (os, zero);
- else {
- F.write (os, *j_elt);
- ++j_idx;
- ++j_elt;
- }
-
- if (j_idx_1 < A._n - 1)
- os << ", ";
- }
-
- os << "; ";
- }
-
- os << "]";
-
- break;
-
- case FORMAT_PRETTY:
- //F.characteristic (c);
- //col_width = (int) ceil (log ((double) c) / M_LN10);
- F.init (zero, 0);
-
- for (i = A._matA.begin (), i_idx = 0; i != A._matA.end (); i++, i_idx++) {
- os << " [ ";
-
- j_idx = i->first.begin ();
- j_elt = i->second.begin ();
-
- for (col_idx = 0; col_idx < A._n; col_idx++) {
- //os.width (col_width);
-
- if (j_idx == i->first.end () || col_idx != *j_idx)
- F.write (os, zero);
- else {
- F.write (os, *j_elt);
- ++j_idx; ++j_elt;
- }
-
- os << ' ';
- }
-
- os << ']';
- }
-
- break;
- case FORMAT_MAGMACPT:
- os << "sparse matrix written in MagmaCpt form is not implemented" << std::endl;
- break;
- }
-
- return os;
- }
-
- template <class Element, class Row, class Tag>
- template <class Field>
- SparseMatrixBase<Element,Row,Tag> ::SparseMatrixBase( MatrixStream<Field>& ms ) :
- _matA(0), _m(0), _n(0)
- {
- Element val;
- size_t i, j;
- while( ms.nextTriple(i,j,val) ) {
- if( i >= _m ) {
- _m = i + 1;
- _matA.resize( _m );
- }
- if( j >= _n ) _n = j + 1;
- setEntry(i,j,val);
- }
- if( ms.getError() > END_OF_MATRIX )
- throw ms.reportError(__func__,__LINE__);
- if( !ms.getDimensions( i, _n ) )
- throw ms.reportError(__func__,__LINE__);
- if( i > _m ) {
- _m = i;
- _matA.resize(_m);
- }
- }
-
- template <class Element, class Row>
- template <class Field>
- SparseMatrixBase<Element,Row,VectorCategories::SparseSequenceVectorTag> ::SparseMatrixBase( MatrixStream<Field>& ms ) :
- _matA(0), _m(0), _n(0)
- {
- Element val;
- size_t i, j;
- while( ms.nextTriple(i,j,val) ) {
- if( i >= _m ) {
- _m = i + 1;
- _matA.resize( _m );
- }
- if( j >= _n ) _n = j + 1;
- setEntry(i,j,val);
- }
- if( ms.getError() > END_OF_MATRIX )
- throw ms.reportError(__func__,__LINE__);
- if( !ms.getDimensions( i, _n ) )
- throw ms.reportError(__func__,__LINE__);
- if( i > _m ) {
- _m = i;
- _matA.resize(_m);
- }
- }
-
- template <class Element, class Row>
- template <class Field>
- SparseMatrixBase<Element,Row,VectorCategories::SparseAssociativeVectorTag> ::SparseMatrixBase( MatrixStream<Field>& ms ) :
- _matA(0), _m(0), _n(0)
- {
- Element val;
- size_t i, j;
- while( ms.nextTriple(i,j,val) ) {
- if( i >= _m ) {
- _m = i + 1;
- _matA.resize( _m );
- }
- if( j >= _n ) _n = j + 1;
- setEntry(i,j,val);
- }
- if( ms.getError() > END_OF_MATRIX )
- throw ms.reportError(__func__,__LINE__);
- if( !ms.getDimensions( i, _n ) )
- throw ms.reportError(__func__,__LINE__);
- if( i > _m ) {
- _m = i;
- _matA.resize(_m);
- }
- }
-
- template <class Element, class Row>
- template <class Field>
- SparseMatrixBase<Element,Row,VectorCategories::SparseParallelVectorTag> ::SparseMatrixBase( MatrixStream<Field>& ms ) :
- _matA(0), _m(0), _n(0)
- {
- Element val;
- size_t i, j;
- while( ms.nextTriple(i,j,val) ) {
- if( i >= _m ) {
- _m = i + 1;
- _matA.resize( _m );
- }
- if( j >= _n ) _n = j + 1;
- setEntry(i,j,val);
- }
- if( ms.getError() > END_OF_MATRIX )
- throw ms.reportError(__func__,__LINE__);
- if( !ms.getDimensions( i, _n ) )
- throw ms.reportError(__func__,__LINE__);
- if( i > _m ) {
- _m = i;
- _matA.resize(_m);
- }
- }
-
- template <class Element, class Row>
- void SparseMatrixBase<Element, Row, VectorCategories::SparseSequenceVectorTag > ::setEntry (size_t i, size_t j, const Element &value)
- {
- typedef typename Row::value_type value_type;
- Row &v = _matA[i];
- typename Row::iterator iter;
-
- if (v.size () == 0) {
- v.push_back ( value_type((unsigned)j, value));
- }
- else {
- iter = std::lower_bound (v.begin (), v.end (), j, VectorWrapper::CompareSparseEntries<Element> ());
-
- if (iter == v.end () || iter->first != j)
- iter = v.insert (iter, value_type((unsigned)j, value));
- else
- iter->second = value;
- }
- }
-
- template <class Element, class Row>
- Element &SparseMatrixBase<Element, Row, VectorCategories::SparseSequenceVectorTag > ::refEntry (size_t i, size_t j)
- {
- static Element zero;
-
- Row &v = _matA[i];
- typename Row::iterator iter;
-
- if (v.size () == 0) {
- v.push_back (std::pair <size_t, Element> (j, zero));
- return v.front ().second;
- }
- else {
- iter = std::lower_bound (v.begin (), v.end (), j, VectorWrapper::CompareSparseEntries<Element> ());
-
- if (iter == v.end () || iter->first != j)
- iter = v.insert (iter, std::pair <size_t, Element> (j, zero));
-
- return iter->second;
- }
- }
-
- template <class Element, class Row>
- const Element &SparseMatrixBase<Element, Row, VectorCategories::SparseSequenceVectorTag > ::getEntry (size_t i, size_t j) const
- {
- static Element zero;
-
- const Row &v = _matA[i];
- typename Row::const_iterator iter;
-
- if (v.size () == 0)
- return zero;
- else {
- iter = std::lower_bound (v.begin (), v.end (), j, VectorWrapper::CompareSparseEntries<Element> ());
-
- if (iter == v.end () || iter->first != j)
- return zero;
- else
- return iter->second;
- }
- }
-
- template <class Element, class Row>
- const Element &SparseMatrixBase<Element, Row, VectorCategories::SparseAssociativeVectorTag > ::getEntry (size_t i, size_t j) const
- {
- static Element zero;
-
- const Row &v = _matA[i];
- typename Row::const_iterator iter;
-
- if (v.size () == 0)
- return zero;
- else {
- iter = v.find (j);
-
- if (iter == v.end () || iter->first != j)
- return zero;
- else
- return iter->second;
- }
- }
-
- template <class Element, class Row>
- void SparseMatrixBase<Element, Row, VectorCategories::SparseParallelVectorTag > ::setEntry (size_t i, size_t j, const Element &value)
- {
- while (_matA.size() < i + 1) _matA.push_back(Row());
- _m = _matA.size();
-
- Row &v = _matA[i];
- typename Row::first_type::iterator iter;
-
- if (v.first.size () == 0) {
- v.first.push_back (j);
- v.second.push_back (value);
- }
- else {
- iter = std::lower_bound (v.first.begin (), v.first.end (), j);
-
- if (iter == v.first.end () || *iter != j) {
- iter = v.first.insert (iter, j);
- v.second.insert (v.second.begin () + (iter - v.first.begin ()), value);
- }
- else
- *(v.second.begin () + (iter - v.first.begin ())) = value;
- }
- }
-
- template <class Element, class Row>
- Element &SparseMatrixBase<Element, Row, VectorCategories::SparseParallelVectorTag > ::refEntry (size_t i, size_t j)
- {
- static Element zero;
-
- Row &v = _matA[i];
- typename Row::first_type::iterator iter;
- typename Row::second_type::iterator iter_elt;
-
- if (v.first.size () == 0) {
- v.first.push_back (j);
- v.second.push_back (zero);
- return v.second.front ();
- }
- else {
- iter = std::lower_bound (v.first.begin (), v.first.end (), j);
-
- if (iter == v.first.end () || *iter != j) {
- iter = v.first.insert (iter, j);
- iter_elt = v.second.insert (v.second.begin () + (iter - v.first.begin ()), zero);
- }
- else
- iter_elt = v.second.begin () + (iter - v.first.begin ());
-
- return *iter_elt;
- }
- }
-
- template <class Element, class Row>
- const Element &SparseMatrixBase<Element, Row, VectorCategories::SparseParallelVectorTag > ::getEntry (size_t i, size_t j) const
- {
- static Element zero;
-
- const Row &v = _matA[i];
- typename Row::first_type::const_iterator iter;
-
- if (v.first.size () == 0)
- return zero;
- else {
- iter = std::lower_bound (v.first.begin (), v.first.end (), j);
-
- if (iter == v.first.end () || *iter != j)
- return zero;
- else
- return *(v.second.begin () + (iter - v.first.begin ()));
- }
- }
-
- template <class Element, class Row>
- template <class Vector>
- Vector &SparseMatrixBase<Element, Row, VectorCategories::SparseSequenceVectorTag >::columnDensity (Vector &v) const
- {
- unsigned int row = 0;
-
- for (ConstRowIterator i = rowBegin (); i != rowEnd (); ++i, ++row) {
- typename Row::const_iterator j = i.begin ();
-
- for (; j != i->begin (); ++j)
- ++v[j->first];
- }
-
- return v;
- }
-
- template <class Element, class Row>
- template <class Vector>
- Vector &SparseMatrixBase<Element, Row, VectorCategories::SparseParallelVectorTag >::columnDensity (Vector &v) const
- {
- unsigned int row = 0;
-
- for (ConstRowIterator i = rowBegin (); i != rowEnd (); ++i, ++row) {
- typename Row::first_type::const_iterator j_idx = i->first.begin ();
-
- for (; j_idx != i->first.end (); ++j_idx)
- ++v[*j_idx];
- }
-
- return v;
- }
-
- template <class Element, class Row>
- template <class Vector>
- Vector &SparseMatrixBase<Element, Row, VectorCategories::SparseAssociativeVectorTag >::columnDensity (Vector &v) const
- {
- unsigned int row = 0;
-
- for (ConstRowIterator i = rowBegin (); i != rowEnd (); ++i, ++row) {
- typename Row::const_iterator j = i.begin ();
-
- for (; j != i->begin (); ++j)
- ++v[j->first];
- }
-
- return v;
- }
-
- template <class Element, class Row>
- SparseMatrixBase<Element, Row, VectorCategories::SparseSequenceVectorTag >
- &SparseMatrixBase<Element, Row, VectorCategories::SparseSequenceVectorTag >::transpose (SparseMatrixBase &AT) const
- {
- unsigned int row = 0;
-
- for (ConstRowIterator i = rowBegin (); i != rowEnd (); ++i, ++row) {
- typename Row::const_iterator j = i.begin ();
-
- for (; j != i->begin (); ++j)
- AT._matA[j->first].push_back (std::pair<size_t, Element> (row, j->second));
- }
-
- return AT;
- }
-
- template <class Element, class Row>
- SparseMatrixBase<Element, Row, VectorCategories::SparseAssociativeVectorTag >
- &SparseMatrixBase<Element, Row, VectorCategories::SparseAssociativeVectorTag >::transpose (SparseMatrixBase &AT) const
- {
- unsigned int row = 0;
-
- for (ConstRowIterator i = rowBegin (); i != rowEnd (); ++i, ++row) {
- typename Row::const_iterator j = i.begin ();
-
- for (; j != i->begin (); ++j)
- AT._matA[j->first][row] = j->second;
- }
-
- return AT;
- }
-
- template <class Element, class Row>
- SparseMatrixBase<Element, Row, VectorCategories::SparseParallelVectorTag >
- &SparseMatrixBase<Element, Row, VectorCategories::SparseParallelVectorTag >::transpose (SparseMatrixBase &AT) const
- {
- unsigned int row = 0;
-
- for (ConstRowIterator i = rowBegin (); i != rowEnd (); ++i, ++row) {
- typename Row::first_type::const_iterator j_idx = i->first.begin ();
- typename Row::second_type::const_iterator j_elt = i->second.begin ();
-
- for (; j_idx != i->first.end (); ++j_idx, ++j_elt) {
- AT._matA[*j_idx].first.push_back (row);
- AT._matA[*j_idx].second.push_back (*j_elt);
- }
- }
-
- return AT;
- }
-
-} // namespace LinBox
-
-#endif // __LINBOX_matrix_sparse_INL
-
-
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
-// Local Variables:
-// mode: C++
-// tab-width: 8
-// indent-tabs-mode: nil
-// c-basic-offset: 8
-// End:
-
diff --git a/linbox/matrix/sparsematrix/Makefile.am b/linbox/matrix/sparsematrix/Makefile.am
new file mode 100644
index 0000000..239659a
--- /dev/null
+++ b/linbox/matrix/sparsematrix/Makefile.am
@@ -0,0 +1,59 @@
+# Copyright (c) 2013 the LinBox group
+# ========LICENCE========
+# This file is part of the library LinBox.
+#
+# LinBox is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+#
+# This library 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
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+# ========LICENCE========
+
+
+
+pkgincludesubdir=$(pkgincludedir)/matrix/sparsematrix
+
+
+pkgincludesub_HEADERS = \
+ sparse-domain.h \
+ sparse-coo-matrix.h \
+ sparse-coo-implicit-matrix.h \
+ sparse-csr-matrix.h \
+ sparse-ell-matrix.h \
+ sparse-ellr-matrix.h \
+ sparse-hyb-matrix.h \
+ sparse-tpl-matrix.h \
+ sparse-tpl-matrix.inl \
+ sparse-tpl-matrix-omp.h \
+ sparse-tpl-matrix-omp.inl \
+ sparse-generic.h \
+ sparse-generic.inl \
+ sparse-associative-vector.h \
+ sparse-associative-vector.inl \
+ sparse-parallel-vector.h \
+ sparse-parallel-vector.inl \
+ sparse-sequence-vector.h \
+ triples-coord.h \
+ read-write-sparse.h \
+ read-write-sparse.inl \
+ sparse-sequence-vector.inl
+
+
+
+
+# sparse-coo-1-matrix.h \
+# sparse-csr-1-matrix.h \
+# sparse-ellr-1-matrix.h \
+# sparse-bcsr-matrix.h \
+# sparse-dia-matrix.h \
+# sparse-tpl-matrix.h \
+# sparse-csc-matrix.h \
+#
diff --git a/linbox/matrix/sparsematrix/read-write-sparse.h b/linbox/matrix/sparsematrix/read-write-sparse.h
new file mode 100644
index 0000000..e05e7e4
--- /dev/null
+++ b/linbox/matrix/sparsematrix/read-write-sparse.h
@@ -0,0 +1,158 @@
+/*
+ * Copyright (C) the LinBox group
+ *
+ * Written by Brice Boyer (briceboyer) <boyer.brice at gmail.com>
+ *
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ * ========LICENCE========
+ *.
+ */
+
+/** @file linbox/matrix/sparsematrix/read-write-sparse.h
+ * @ingroup sparsematrix
+ * @brief
+ */
+
+#ifndef __LINBOX_matrix_sparse_matrix_read_write_sparse_H
+#define __LINBOX_matrix_sparse_matrix_read_write_sparse_H
+
+#include "linbox/matrix/matrix-traits.h"
+#include "linbox/matrix/matrix-category.h"
+#include "linbox/util/matrix-stream.h"
+
+namespace LinBox {
+
+ //! Write helper
+ template <class Matrix>
+ class SparseMatrixWriteHelper {
+ public:
+ typedef typename Matrix::Field Field;
+ typedef typename Field::Element Element;
+
+ private:
+ static std::ostream &writeTriple (const Matrix &A
+ , std::ostream &os
+ , MatrixCategories::RowMatrixTag
+ , bool oneBased = false);
+
+ static std::ostream &writeTriple (const Matrix &A
+ , std::ostream &os
+ , MatrixCategories::BlackboxTag
+ , bool oneBased = false);
+
+
+ static std::ostream &writePretty (const Matrix &A
+ , std::ostream &os
+ , std::string begmat
+ , std::string endmat
+ , std::string begrow
+ , std::string endrow
+ , std::string sepelt
+ , std::string seprow
+ , MatrixCategories::RowMatrixTag
+ );
+
+ static std::ostream &writePretty (const Matrix &A
+ , std::ostream &os
+ , std::string begmat
+ , std::string endmat
+ , std::string begrow
+ , std::string endrow
+ , std::string sepelt
+ , std::string seprow
+ , MatrixCategories::BlackboxTag
+ );
+
+
+
+ public:
+ static std::ostream &write (const Matrix &A
+ , std::ostream &os
+ , LINBOX_enum(Tag::FileFormat) format);
+ };
+
+ //! Read helper
+ template <class Matrix>
+ class SparseMatrixReadHelper {
+
+ public:
+ typedef typename Matrix::Field Field;
+ typedef typename Field::Element Element;
+
+ private:
+
+#if 0
+ static std::istream &readTurner (Matrix &A
+ , std::istream &is
+ , char *buf);
+
+ static std::istream &readMagmaCpt (Matrix &A
+ , std::istream &is
+ , char *buf);
+#endif
+
+ static std::istream &readGuillaume (Matrix &A
+ , std::istream &is
+ , char *buf);
+
+ static std::istream &readMatlab (Matrix &A
+ , std::istream &is
+ , char *buf);
+
+ static std::istream &readPretty (Matrix &A
+ , std::istream &is
+ , char *buf
+ , MatrixCategories::RowMatrixTag);
+
+ static std::istream &readPretty (Matrix &A
+ , std::istream &is
+ , char *buf
+ , MatrixCategories::BlackboxTag);
+
+ static std::istream &readMatrixMarket (Matrix &A
+ , std::istream &is
+ , char *buf);
+
+
+
+
+ public:
+ static std::istream &read (Matrix &A
+ , std::istream &is
+ , LINBOX_enum(Tag::FileFormat) format)
+ ;
+ // return read(A,is,format, typename MatrixTraits<Matrix>::MatrixCategory ());
+ };
+
+
+
+} // LinBox
+
+
+#include "linbox/matrix/sparsematrix/read-write-sparse.inl"
+#endif // __LINBOX_matrix_sparse_matrix_read_write_sparse_H
+
+
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/matrix/sparsematrix/read-write-sparse.inl b/linbox/matrix/sparsematrix/read-write-sparse.inl
new file mode 100644
index 0000000..fcf73c5
--- /dev/null
+++ b/linbox/matrix/sparsematrix/read-write-sparse.inl
@@ -0,0 +1,604 @@
+/*
+ * Copyright (C) the LinBox group
+ *
+ * Written by Brice Boyer (briceboyer) <boyer.brice at gmail.com>
+ *
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ * ========LICENCE========
+ *.
+ */
+
+#ifndef __LINBOX_matrix_sparse_matrix_read_write_sparse_INL
+#define __LINBOX_matrix_sparse_matrix_read_write_sparse_INL
+
+/**** Read Iterators ***/
+namespace LinBox {
+
+#if 0 /* dubious (where are size set, why is it not checked ?) */
+ template<class Matrix>
+ std::istream &SparseMatrixReadHelper<Matrix>::readTurner (Matrix &A, std::istream &is
+ , char *buf)
+ {
+ size_t i, j;
+
+ A.refRep().clear ();
+ A.refRep().resize (A.rowdim());
+
+ do {
+ std::istringstream str (buf);
+
+ str >> i;
+
+ if (i == (size_t) -1) break; // return also if row index is -1
+ str >> j;
+ A.field().read (str, A.refEntry (i, j));
+
+ is.getline (buf, 80);
+ } while (is);
+
+ return is;
+ }
+#endif
+
+ template<class Matrix>
+ std::istream &SparseMatrixReadHelper<Matrix>::readGuillaume (Matrix &A, std::istream &is
+ , char *buf)
+ {
+ typedef typename Matrix::Field::Element Element;
+ size_t i = 0, j = 0 ;
+
+ std::istringstream str (buf);
+ size_t m, n ;
+ str >> m >> n;
+ A.resize(m,n);
+
+ Element x;
+ while (is >> i) {
+ if (i == 0 || i == (size_t) -1) {is >> j; A.field().read(is, x); break;}
+ is >> j;
+ if (i > A.rowdim() || j > A.coldim())
+ throw Exceptions::InvalidMatrixInput ();
+ A.field().read (is, x);
+ if (! A.field().isZero(x)) // this is probably tested in setEntry (hopefully)
+ A.appendEntry (i - 1, j - 1, x);
+ }
+
+ A.finalize();
+
+ return is;
+
+ }
+
+ //! @bug buf is not used (hence the first line is always lost.
+ template<class Matrix>
+ std::istream &SparseMatrixReadHelper<Matrix>::readMatlab (Matrix &A, std::istream &is
+ , char *buf)
+ {
+ typedef typename Matrix::Field::Element Element;
+ size_t i = 0, j = 0;
+ char c;
+ Element a_ij;
+
+ while (1) {
+ do is >> c; while (is && !std::isdigit (c));
+ if (!is) break;
+
+ is.putback (c);
+
+ A.field().read (is, a_ij);
+ A.appendEntry (i, j++, a_ij);
+
+ do is >> c; while (is && c != ',' && c != ';' && c != ']');
+ if (!is) break;;
+
+ if (c == ';') {
+ ++i;
+ j = 0;
+ }
+ else if (c == ']') break;
+ }
+
+ A.finalize();
+ return is;
+ }
+
+ template<class Matrix>
+ std::istream &SparseMatrixReadHelper<Matrix>::readPretty (Matrix &A
+ , std::istream &is
+ , char *buf
+ , MatrixCategories::RowMatrixTag)
+ {
+ typedef typename Matrix::Field::Element Element;
+ size_t i;
+ Element a_ij;
+
+ A._m = 0;
+ A.refRep().clear ();
+
+ i = 0;
+
+ do {
+ char c;
+ size_t j;
+ ++(A._m);
+ A.refRep().push_back ( typename Matrix::Row ());
+
+ std::istringstream str (buf);
+
+ do {str >> c; std::cout << "x" << c << "x" << std::endl;} while (isspace (c));
+ if (c != '[')
+ throw Exceptions::InvalidMatrixInput ();
+
+ j = 0;
+
+ while (str) {
+ do str >> c; while (isspace (c));
+ if (!str || c == ']') break;
+ A.field().read (str, a_ij);
+
+ ++j;
+ if (j > A.coldim())
+ ++(A._n);
+
+ if (!A.field().isZero(a_ij)) { // probably tested
+ A.appendEntry (i, j, a_ij);
+ }
+ }
+
+ is.getline (buf, 80);
+
+ ++i;
+ } while (is);
+
+ A.finalize();
+ return is;
+
+ }
+
+ template<class Matrix>
+ std::istream &SparseMatrixReadHelper<Matrix>::readPretty (Matrix &A
+ , std::istream &is
+ , char *buf
+ , MatrixCategories::BlackboxTag)
+ {
+ typedef typename Matrix::Field::Element Element;
+ size_t i;
+ Element a_ij;
+
+ A.resize(0,0);
+
+ i = 0;
+
+ do {
+ char c;
+ size_t j;
+
+ A.resize(i+1,A.coldim());
+ std::istringstream str (buf);
+
+ do {
+ str >> c;
+ } while (isspace (c));
+
+ if (c != '[')
+ throw Exceptions::InvalidMatrixInput ();
+
+ j = 0;
+
+ while (str) {
+ do str >> c; while (isspace (c));
+ if (!str || c == ']') break;
+ A.field().read (str, a_ij);
+
+ ++j;
+
+ if (!A.field().isZero(a_ij)) {
+ if (j >= A.coldim())
+ A.resize(i,j+1);
+
+ A.appendEntry (i, j, a_ij);
+ }
+ }
+
+ is.getline (buf, 80);
+
+ ++i;
+ } while (is);
+
+ A.finalize();
+ return is;
+
+ }
+
+#if 0 /* there is no writer for this, no autodetect, should we care ? */
+
+ template<class Matrix>
+ std::istream &SparseMatrixReadHelper<Matrix>::readMagmaCpt (Matrix &A, std::istream &is
+ , char *buf)
+ {
+ typedef typename Matrix::Field::Element Element;
+ size_t i, j;
+ Element a_ij;
+ char c;
+ const char matrixstart = '[', matrixend = ']';
+ const char rowstart = '[', rowend = ']';
+ const char pairstart = '[', pairend = ']';
+
+ A.resize(0,0);
+
+ do {is.get(c);} while (c != matrixstart ); // find matrix start
+ i = 0;
+ while (true)
+ {
+ do {is.get(c);} while (c != matrixend && c != rowstart);
+ if (c == matrixend) return is;
+ else
+ {
+ ++(A._m);
+ A.refRep().push_back (typename Matrix::Row ());
+ //processrow(i)
+ while (true)
+ {
+ do {is.get(c);} while (c != pairstart && c != rowend );
+ if (c == rowend) break;
+ else
+ { //processpair( j v for row i);
+ is >> j;
+ if (j > A.coldim()) A._n = j;
+ do {is.get(c);} while (!std::isdigit(c) && c != '-' && c != '+');
+ is.unget();
+ A.field().read(is, a_ij);
+ if (!A.field().isZero(a_ij)) A.setEntry (i, j-1, a_ij);
+ do {is.get(c);} while (c != pairend);
+ }
+ }
+ ++i;
+ }
+ }
+ }
+#endif
+
+ template<class Matrix>
+ std::istream &SparseMatrixReadHelper<Matrix>::readMatrixMarket (Matrix &A, std::istream &is
+ , char *buf)
+ {
+ typedef typename Matrix::Field Field;
+ typedef typename Field::Element Element;
+
+ MatrixStream<Field> ms(A.field(), is);
+ size_t m,n ;
+ if( !ms.getDimensions( m, n ) )
+ throw ms.reportError(__func__,__LINE__);
+ A.resize(m,n);
+ Element val;
+ size_t i, j;
+ while( ms.nextTriple(i,j,val) ) {
+ A.appendEntry(i,j,val);
+ }
+ if( ms.getError() > END_OF_MATRIX )
+ throw ms.reportError(__func__,__LINE__);
+
+ A.finalize();
+ return is;
+ }
+} // LinBox
+
+/**** Write Iterators ***/
+namespace LinBox {
+ template<class Matrix>
+ std::ostream &SparseMatrixWriteHelper<Matrix>::writeTriple (const Matrix &A
+ , std::ostream &os
+ , MatrixCategories::RowMatrixTag
+ , bool oneBased)
+ {
+ typename Matrix::Rep::const_iterator i;
+ typename Matrix::Row::const_iterator j;
+ size_t i_idx, j_idx;
+
+
+ // The i j v triples, with zero based indices.
+ for (i = A.getRep().begin (), i_idx = 0; i != A.getRep().end (); ++i, ++i_idx) {
+ for (j = i->begin (), j_idx = 0; j != i->end (); ++j, ++j_idx) {
+ if (oneBased)
+ os << i_idx + 1 << ' ' << j->first + 1 << ' ';
+ else
+ os << i_idx << ' ' << j->first << ' ';
+ A.field().write (os, j->second);
+ os << std::endl;
+ }
+ }
+ return os;
+
+ }
+
+ template<class Matrix>
+ std::ostream &SparseMatrixWriteHelper<Matrix>::writeTriple (const Matrix &A
+ , std::ostream &os
+ , MatrixCategories::BlackboxTag
+ , bool oneBased)
+ {
+ size_t i,j ;
+ Element e ;
+
+ A.firstTriple();
+
+ while (A.nextTriple(i,j,e)) {
+ if (oneBased)
+ os << i + 1 << ' ' << j + 1 << ' ';
+ else
+ os << i << ' ' << j << ' ';
+ A.field().write (os, e);
+ os << std::endl;
+ }
+ return os;
+ }
+
+
+ template<class Matrix>
+ std::ostream &SparseMatrixWriteHelper<Matrix>::writePretty (const Matrix &A, std::ostream &os
+ , std::string begmat
+ , std::string endmat
+ , std::string begrow
+ , std::string endrow
+ , std::string sepelt
+ , std::string seprow
+ , MatrixCategories::RowMatrixTag
+ )
+ {
+ typename Matrix::Rep::const_iterator i;
+ typename Matrix::Row::const_iterator j;
+ size_t i_idx, j_idx;
+ bool firstrow;
+
+ os << begmat;
+ firstrow=true;
+
+ for (i = A.getRep().begin (), i_idx = 0; i != A.getRep().end (); ++i, ++i_idx) {
+ j = i->begin ();
+
+ if (firstrow) {
+ os << begrow;
+ firstrow =false;
+ }
+ else
+ os << seprow << begrow;
+
+
+ for (j_idx = 0; j_idx < A.coldim(); ++j_idx) {
+ if (j == i->end () || j_idx != j->first)
+ A.field().write (os, A.field().zero);
+ else {
+ A.field().write (os, j->second);
+ ++j;
+ }
+
+ if (j_idx < A.coldim() - 1)
+ os << sepelt << ' ';
+ }
+
+ os << endrow;
+ }
+
+ os << endmat;
+
+ return os ;
+ }
+
+ template<class Matrix>
+ std::ostream &SparseMatrixWriteHelper<Matrix>::writePretty (const Matrix &A, std::ostream &os
+ , std::string begmat
+ , std::string endmat
+ , std::string begrow
+ , std::string endrow
+ , std::string sepelt
+ , std::string seprow
+ , MatrixCategories::BlackboxTag
+ )
+ {
+ size_t i_idx=0, j_idx=0;
+ Element e;
+
+ A.firstTriple();
+
+ os << begmat;
+
+ bool ok = A.nextTriple(i_idx,j_idx,e);
+
+ for (size_t i = 0 ; i < A.rowdim() ; ++i) {
+
+ if (i != 0 ) { /* not first row */
+ os << seprow ;
+ }
+
+ os << begrow;
+
+ for (size_t j = 0 ; j < A.coldim() ; ++j) {
+ if (ok && i == i_idx && j == j_idx) {
+ A.field().write (os, e);
+ ok = A.nextTriple(i_idx,j_idx,e);
+ }
+ else {
+ A.field().write (os, A.field().zero);
+ }
+ if (j < A.coldim() - 1)
+ os << sepelt << ' ';
+ }
+ os << endrow ;
+ }
+
+ os << endmat;
+
+ return os ;
+ }
+
+} // namespace LinBox
+
+namespace LinBox {
+ // read
+ template<class Matrix>
+ std::istream &SparseMatrixReadHelper<Matrix> ::read (Matrix &A
+ , std::istream &is
+ , LINBOX_enum(Tag::FileFormat) format
+ )
+ {
+ char buf[80];
+ buf[0]=0;
+
+ switch (format) {
+ case Tag::FileFormat::Detect:
+ {
+ char c;
+ is.getline (buf, 80);
+ std::istringstream str (buf);
+ do str >> c; while (isspace (c));
+
+ if (c == '[') {
+ if (strchr (buf, ';') != NULL)
+ readMatlab (A, is, buf);
+ else
+ readPretty (A, is, buf, typename MatrixTraits<Matrix>::MatrixCategory ());
+ }
+ else if (c == '%') {
+ size_t un = (size_t) is.gcount() ;
+ for (size_t i = 0 ; i < un ; ++i)
+ is.unget();
+ readMatrixMarket(A,is,buf);
+ }
+ else if (std::isdigit (c)) {
+ do str >> c; while (str && (isspace (c) || std::isdigit (c)));
+
+ if (c == 'M')
+ return readGuillaume (A, is, buf);
+ // else return readTurner (A, is, buf);
+ }
+ else {
+#ifndef NDEBUG
+ std::cout << "buffer :" << buf << std::endl;
+#endif
+ throw Exceptions::InvalidMatrixInput ();
+ }
+ break;
+ }
+
+ // case Tag::FileFormat::Turner: return readTurner (A, is, buf);
+ case Tag::FileFormat::Guillaume:
+ return readGuillaume (A, is, buf);
+ case Tag::FileFormat::Matlab:
+ return readMatlab (A, is, buf);
+ case Tag::FileFormat::Pretty:
+ return readPretty (A, is, buf, typename MatrixTraits<Matrix>::MatrixCategory ());
+ // case Tag::FileFormat::MagmaCpt:
+ // return readMagmaCpt (A, is, buf);
+ case Tag::FileFormat::MatrixMarket:
+ return readMatrixMarket (A, is, buf);
+ default:
+ throw Exceptions::InvalidMatrixInput();
+ }
+
+ return is;
+ }
+
+ // write
+ template<class Matrix>
+ std::ostream &SparseMatrixWriteHelper<Matrix> ::write (const Matrix &A
+ , std::ostream &os
+ , LINBOX_enum(Tag::FileFormat) format
+ )
+ {
+ // Avoid massive unneeded overhead in the case that this
+ // printing is disabled
+ if (not os)
+ return os;
+
+ switch (format) {
+ case Tag::FileFormat::Detect:
+ throw PreconditionFailed (__func__, __LINE__, "format != Tag::FileFormat::Detect");
+
+ // case Tag::FileFormat::Turner:
+ // return writeTriple(A,os);
+
+ case Tag::FileFormat::OneBased:
+ return writeTriple(A,os,typename MatrixTraits<Matrix>::MatrixCategory (),true);
+
+ case Tag::FileFormat::Guillaume:
+ // row col 'M' header line followed by the i j v triples, one based,
+ // followed by 0 0 0.
+ os << A.rowdim() << ' ' << A.coldim() << " M" << std::endl;
+ writeTriple(A,os,typename MatrixTraits<Matrix>::MatrixCategory (),true);
+ os << "0 0 0" << std::endl;
+
+ return os;
+
+ case Tag::FileFormat::Matlab:
+ return writePretty(A,os,"[","]","","; ",",","",typename MatrixTraits<Matrix>::MatrixCategory ());
+ // std::string begmat = "[";
+ // std::string endmat = "]";
+ // std::string begrow = "";
+ // std::string endrow = "; ";
+ // std::string sepelt = ",";
+ // std::string seprow = "";
+
+ case Tag::FileFormat::Maple:
+ return writePretty(A,os,"[","]","["," ]",",",", ",typename MatrixTraits<Matrix>::MatrixCategory ());
+ // std::string begmat = "[";
+ // std::string endmat = "]";
+ // std::string begrow = "[";
+ // std::string endrow = " ]";
+ // std::string sepelt = ",";
+ // std::string seprow = ", "
+
+ break;
+
+ case Tag::FileFormat::Pretty:
+ return writePretty(A,os,"",""," [ ","]\n"," ","",typename MatrixTraits<Matrix>::MatrixCategory ());
+ // std::string begmat = "";
+ // std::string endmat = "";
+ // std::string begrow = " [ ";
+ // std::string endrow = "]\n";
+ // std::string sepelt = " ";
+ // std::string seprow = "";
+
+ case Tag::FileFormat::MatrixMarket:
+ writeMMCoordHeader(os, A, A.size(), "SparseMatrix");
+ return writeTriple(A,os,typename MatrixTraits<Matrix>::MatrixCategory (),true);
+
+
+ case Tag::FileFormat::MagmaCpt:
+ os << "sparse matrix written in MagmaCpt form is not implemented" << std::endl;
+ break;
+
+ default:
+ os << "sparse matrix written in Tag::FileFormat::" << (int)format << " is not implemented" << std::endl;
+ }
+
+ return os;
+ }
+
+} // namespace LinBox
+
+#endif // __LINBOX_matrix_sparse_matrix_read_write_sparse_INL
+
+
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/matrix/sparsematrix/sparse-associative-vector.h b/linbox/matrix/sparsematrix/sparse-associative-vector.h
new file mode 100644
index 0000000..266a5c2
--- /dev/null
+++ b/linbox/matrix/sparsematrix/sparse-associative-vector.h
@@ -0,0 +1,672 @@
+/* linbox/matrix/sparse-matrix.h
+ * Copyright (C) 2001-2002 Bradford Hovinen
+ * 1999-2001 William J Turner,
+ *
+ * Written by William J Turner <wjturner at math.ncsu.edu>,
+ * Bradford Hovinen <hovinen at cis.udel.edu>
+ *
+ * --------------------------------------------------------
+ * 2003-01-11 Bradford Hovinen <bghovinen at math.uwaterloo.ca>
+ *
+ * Move from blackbox/sparse-base.h to matrix/sparse-matrix.h
+ * ------------------------------------
+ * 2002-11-28 Bradford Hovinen <bghovinen at math.uwaterloo.ca>
+ *
+ * - Renamed ColOfRowsIterator to RowIterator
+ * - Named template argument _Row rather than Row; add a typedef to Row
+ * - Named template argument _Element rather than Row; add a typedef to Element
+ * - Renamed IndexIterator as IndexedIterator, and adjusted to match
+ * interface in DenseMatrixBase
+ * ------------------------------------
+ * 2002-08-06 Bradford Hovinen <hovinen at cis.udel.edu>
+ *
+ * Renamed to sparse-base.h from sparse0-base.h
+ * ------------------------------------
+ * Modified by Bradford Hovinen <hovinen at cis.udel.edu>
+ *
+ * Refactoring:
+ * - Eliminated SparseMatrixAux and moved that functionality into Sparse0
+ * - Made SparseMatrix parameterized only on the element type
+ * - New read/write implementations for SparseMatrix, supporting multiple
+ * formats
+ * - Eliminated Gaussian elimination code
+ * - Added iterators, including ColOfRowsIterator, Iterator, and
+ * IndexIterator
+ * - Eliminated operator []; added getEntry; changed put_value to setEntry
+ * ------------------------------------
+ *
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ * ========LICENCE========
+ *.
+ */
+
+/** @file linbox/matrix/sparsematrix/sparse-associative-vector.h
+ * @ingroup sparsematrix
+ * @brief
+ */
+
+#ifndef __LINBOX_matrix_sparsematrix_sparse_associative_vector_H
+#define __LINBOX_matrix_sparsematrix_sparse_associative_vector_H
+
+
+namespace LinBox { namespace Protected {
+
+ /* Specialization for sparse associative vectors */
+ template <class _Field, class _Row>
+ class SparseMatrixGeneric<_Field, _Row, VectorCategories::SparseAssociativeVectorTag > {
+ public:
+
+ typedef _Field Field;
+ typedef typename Field::Element Element;
+
+ typedef _Row Row;
+ typedef const Row ConstRow;
+ typedef _SP_BB_VECTOR_<Row> Rep;
+ typedef VectorCategories::SparseAssociativeVectorTag myTrait;
+ typedef SparseMatrixGeneric<_Field, _Row, myTrait> Self_t;
+
+#ifdef __LINBOX_PARALLEL
+ BB_list_list sub_list;
+#endif
+
+
+ template<typename _Tp1, typename _R1 = typename Rebind<_Row,_Tp1>::other >
+ struct rebind {
+ typedef SparseMatrixGeneric<_Tp1, _R1> other;
+
+ void operator() (other & Ap, const Self_t& A) {
+
+ typename _Tp1::Element e;
+
+ Hom<typename Self_t::Field, _Tp1> hom(A.field(), Ap.field());
+ for( typename Self_t::ConstIndexedIterator
+ indices = A.IndexedBegin();
+ (indices != A.IndexedEnd()) ;
+ ++indices ) {
+ // hom. image (e, A.getEntry(indices.rowIndex(),indices.colIndex()) );
+ hom. image (e, indices.value() );
+ if (!Ap.field().isZero(e))
+ Ap.setEntry (indices.rowIndex(),
+ indices.colIndex(), e);
+ }
+ }
+
+ };
+
+ template<typename _Tp1, typename _Rw1>
+ SparseMatrixGeneric (const SparseMatrixGeneric<_Tp1, _Rw1, myTrait> &Mat, const Field& F) :
+ _field (F),
+ _MD (F), _AT (*this)
+ , _matA (Mat.rowdim()), _m (Mat.rowdim()), _n (Mat.coldim())
+ {
+ typename SparseMatrixGeneric<_Tp1,_Rw1, myTrait>::template rebind<Field,_Row>()(*this, Mat);
+ }
+
+ SparseMatrixGeneric (const Field & F, size_t m, size_t n) :
+ _field(F),
+ _MD(F),_AT(*this),
+ _matA (m), _m (m), _n (n)
+ {}
+
+ SparseMatrixGeneric (const Field & F) :
+ _field (F),
+ _MD(F),_AT(*this),
+ _matA(0), _m(0), _n(0)
+ {};
+
+
+ SparseMatrixGeneric (const SparseMatrixGeneric<Field, Row> &A) :
+ _field(A.field()),
+ _MD(A.field()),_AT(*this),
+ _matA (A._matA), _m (A._m), _n (A._n)
+ {}
+
+ template<class VectorType>
+ SparseMatrixGeneric (const SparseMatrixGeneric<Field, VectorType> &A) :
+ _field(A.field()),
+ _MD(A.field()),_AT(*this),
+ _matA(A.rowdim()), _m (A.rowdim()), _n (A.coldim())
+ {
+ typename Rep::iterator meit = this->_matA.begin();
+ typename SparseMatrixGeneric<Field, VectorType>::Rep::const_iterator copit = A._matA.begin();
+ for( ; meit != this->_matA.end(); ++meit, ++copit)
+ LinBox::RawVector<Element>::convert(*meit, *copit);
+ }
+
+ /** Constructor from a MatrixStream
+ */
+ SparseMatrixGeneric ( MatrixStream<Field>& ms );
+
+ template<class VectStream>
+ SparseMatrixGeneric (const Field &F, VectStream &stream) :
+ _field (F), _MD (F), _AT (*this)
+ , _matA (stream.size()), _m (stream.size()), _n (stream.dim())
+ {
+ typename Self_t::RowIterator i;
+
+ for (i = Self_t::rowBegin (); i != Self_t::rowEnd (); ++i)
+ stream >> *i;
+ }
+
+ ~SparseMatrixGeneric () {}
+
+ size_t rowdim () const
+ {
+ return _m;
+ }
+
+ size_t coldim () const
+ {
+ return _n;
+ }
+
+ size_t size () const
+ {
+ size_t s(0);
+ for(typename Rep::const_iterator it = _matA.begin(); it != _matA.end(); ++it)
+ s+= LinBox::RawVector<Element>::size(*it);
+ return s;
+ }
+
+ std::istream &read (std::istream &is
+ , LINBOX_enum(Tag::FileFormat) format = Tag::FileFormat::Detect)
+ {
+ return SparseMatrixReadHelper<Self_t>::read (*this, is
+ , format);
+ }
+
+
+ std::ostream &write (std::ostream &os
+ , LINBOX_enum(Tag::FileFormat) format = Tag::FileFormat::MatrixMarket) const
+ {
+ return SparseMatrixWriteHelper<Self_t>::write (*this, os, format);
+ }
+
+ void appendEntry(size_t i, size_t j, const Element & value) { setEntry(i,j,value) ;}
+ void finalize(){}
+
+ void setEntry (size_t i, size_t j, const Element &value)
+ {
+ _matA[i][j] = value;
+ }
+
+ Element &refEntry (size_t i, size_t j)
+ {
+ return _matA[i][j];
+ }
+
+ const Element &getEntry (size_t i, size_t j) const;
+
+ Element &getEntry (Element &x, size_t i, size_t j) const
+ {
+ return x = _matA[i][j];
+ }
+
+ typedef typename Rep::iterator RowIterator;
+ typedef typename Rep::const_iterator ConstRowIterator;
+
+ ConstRowIterator rowBegin () const
+ {
+ return _matA.begin ();
+ }
+
+ ConstRowIterator rowEnd () const
+ {
+ return _matA.end ();
+ }
+
+ RowIterator rowBegin ()
+ {
+ return _matA.begin ();
+ }
+
+ RowIterator rowEnd ()
+ {
+ return _matA.end ();
+ }
+
+ template <class RepIterator, class RowEltIterator, class _I_Element>
+ class _Iterator {
+ public:
+ typedef _I_Element value_type;
+
+ _Iterator (const RepIterator &i, const RowEltIterator &j, const RepIterator &A_end) :
+ _i (i), _j (j), _A_end (A_end)
+ {
+ if( _i == _A_end ) return;
+ while( _j == _i->end() ) {
+ if( ++_i == _A_end ) return;
+ _j = _i->begin();
+ }
+ }
+
+ _Iterator (const _Iterator &iter) :
+ _i (iter._i), _j (iter._j), _A_end (iter._A_end)
+ {}
+
+ _Iterator () {}
+
+ _Iterator &operator = (const _Iterator &iter)
+ {
+ _i = iter._i;
+ _j = iter._j;
+ _A_end = iter._A_end;
+
+ return *this;
+ }
+
+ bool operator == (const _Iterator &i) const
+ {
+ return (_i == i._i) && (_j == i._j);
+ }
+
+ bool operator != (const _Iterator &i) const
+ {
+ return (_i != i._i) || (_j != i._j);
+ }
+
+ _Iterator &operator ++ ()
+ {
+ while (++_j == _i->end ()) {
+ if (++_i == _A_end ()) return *this;
+ _j = _i->begin ();
+ }
+ return *this;
+ }
+
+ _Iterator operator ++ (int)
+ {
+ _Iterator tmp = *this;
+ ++(*this);
+ return tmp;
+ }
+
+ _Iterator &operator -- ()
+ {
+ while (_j == _i->begin ())
+ _j = (--_i)->end ();
+ --_j;
+ return *this;
+ }
+
+ _Iterator operator -- (int)
+ {
+ _Iterator tmp = *this;
+ --(*this);
+ return tmp;
+ }
+
+ value_type &operator * ()
+ {
+ return _j->second;
+ }
+
+ value_type *operator -> ()
+ {
+ return &(_j->second);
+ }
+
+ private:
+ RepIterator _i;
+ RowEltIterator _j;
+ RepIterator _A_end;
+ };
+
+ typedef _Iterator<typename Rep::iterator, typename Row::iterator, Element> Iterator;
+ typedef _Iterator<typename Rep::const_iterator, typename Row::const_iterator, const Element> ConstIterator;
+
+ Iterator Begin ()
+ {
+ return Iterator (_matA.begin (), _matA.front ().begin (), _matA.end ());
+ }
+ Iterator End ()
+ {
+ return Iterator (_matA.end (), _matA.back ().end (), _matA.end ());
+ }
+ ConstIterator Begin () const
+ {
+ return ConstIterator (_matA.begin (), _matA.front ().begin (), _matA.end ());
+ }
+ ConstIterator End () const
+ {
+ return ConstIterator (_matA.end (), _matA.back ().end (), _matA.end ());
+ }
+
+ //! no doc
+ template <class RepIterator, class RowIdxIterator, class _I_Element>
+ class _IndexedIterator {
+ public:
+ // typedef std::pair<size_t, size_t> value_type;
+ typedef _I_Element value_type;
+
+ _IndexedIterator (size_t idx, const RepIterator &i, const RowIdxIterator &j, const RepIterator &A_end) :
+ _i (i), _j (j), _A_end (A_end), _r_index (idx), _c_index (0)
+ {
+ if( _i == _A_end ) return;
+ while( _j == _i->end() ) {
+ ++_r_index;
+ if( ++_i == _A_end ) return;
+ _j = _i->begin();
+ }
+ _c_index = _j->first;
+ }
+
+ _IndexedIterator (const _IndexedIterator &iter) :
+ _i (iter._i), _j (iter._j), _A_end (iter._A_end), _r_index (iter._r_index), _c_index (iter._c_index)
+ {}
+
+ _IndexedIterator ()
+ {}
+
+ _IndexedIterator &operator = (const _IndexedIterator &iter)
+ {
+ _A_end = iter._A_end;
+ _i = iter._i;
+ _j = iter._j;
+ _r_index = iter._r_index;
+ _c_index = iter._c_index;
+
+ return *this;
+ }
+
+ bool operator == (const _IndexedIterator &i) const
+ {
+ return (_i == i._i) && (_j == i._j);
+ }
+
+ bool operator != (const _IndexedIterator &i) const
+ {
+ return (_i != i._i) || (_j != i._j);
+ }
+
+ _IndexedIterator &operator ++ ()
+ {
+ ++_j;
+ while (_j == _i->end ()) {
+ ++_r_index;
+ if (++_i == _A_end ) return *this;
+ _j = _i->begin ();
+ }
+
+ _c_index = _j->first;
+
+ return *this;
+ }
+
+ _IndexedIterator operator ++ (int)
+ {
+ _IndexedIterator tmp = *this;
+ ++(*this);
+ return tmp;
+ }
+
+ _IndexedIterator &operator -- ()
+ {
+ while (_j == _i->begin ()) {
+ _j = (--_i)->end ();
+ --_r_index;
+ }
+
+ --_j;
+ _c_index = _j->second;
+ return *this;
+ }
+
+ _IndexedIterator operator -- (int)
+ {
+ _IndexedIterator tmp = *this;
+ --(*this);
+ return tmp;
+ }
+
+ value_type &operator * ()
+ {
+ return _j->second;
+ }
+ const value_type &operator * () const
+ {
+ return _j->second;
+ }
+ value_type *operator -> ()
+ {
+ return &(_j->second);
+ }
+ const value_type *operator -> () const
+ {
+ return &(_j->second);
+ }
+
+ size_t rowIndex () const
+ {
+ return _r_index;
+ }
+ size_t colIndex () const
+ {
+ return _c_index;
+ }
+ const value_type &value() const
+ {
+ return _j->second;
+ }
+
+ private:
+ RepIterator _i;
+ RowIdxIterator _j;
+ RepIterator _A_end;
+
+ mutable size_t _r_index;
+ mutable size_t _c_index;
+ };
+
+ typedef _IndexedIterator<typename Rep::iterator, typename Row::iterator, Element> IndexedIterator;
+ typedef _IndexedIterator<typename Rep::const_iterator, typename Row::const_iterator, Element> ConstIndexedIterator;
+
+ IndexedIterator IndexedBegin ()
+ {
+ return IndexedIterator (0, _matA.begin (), _matA.front ().begin (), _matA.end ());
+ }
+ IndexedIterator IndexedEnd ()
+ {
+ return IndexedIterator (_m, _matA.end (), _matA.back ().end (), _matA.end ());
+ }
+ ConstIndexedIterator IndexedBegin () const
+ {
+ return ConstIndexedIterator (0, _matA.begin (), _matA.front ().begin (), _matA.end ());
+ }
+ ConstIndexedIterator IndexedEnd () const
+ {
+ return ConstIndexedIterator (_m, _matA.end (), _matA.back ().end (), _matA.end ());
+ }
+
+ Row &getRow (size_t i) {
+ return _matA[i];
+ }
+ Row &operator [] (size_t i) {
+ return _matA[i];
+ }
+ ConstRow &operator [] (size_t i) const
+ {
+ return _matA[i];
+ }
+
+ template <class Vector> Vector &columnDensity (Vector &v) const;
+ SparseMatrixGeneric &transpose (SparseMatrixGeneric &AT) const;
+
+ const Field & field() const
+ {
+ return _field ;
+ }
+ /** Matrix-vector product
+ * \f$y = A x\f$.
+ * @return reference to output vector y
+ * @param x input vector
+ * @param y
+ */
+ template <class OutVector, class InVector>
+ OutVector &apply (OutVector &y, const InVector &x) const
+ {
+#ifdef __LINBOX_PARALLEL
+ return BlackboxParallel (y, *this, x, BBBase::Apply);
+#else
+ return _MD.vectorMul (y, *this, x);
+#endif
+ }
+
+ /** Transpose matrix-vector product
+ * \f$ y = A^T x\f$.
+ * @return reference to output vector y
+ * @param x input vector
+ * @param y
+ */
+ template <class OutVector, class InVector>
+ OutVector &applyTranspose (OutVector& y, const InVector &x) const
+ {
+#ifdef __LINBOX_PARALLEL
+ return BlackboxParallel (y, *this, x, BBBase::ApplyTranspose);
+#else
+ return _MD.vectorMul (y, _AT, x);
+#endif
+ }
+
+ const Rep & getRep() const
+ {
+ return _matA;
+ }
+
+ Rep & refRep()
+ {
+ return _matA;
+ }
+
+ void resize( const size_t & m, const size_t & n, const size_t & z = 0)
+ {
+ _m = m ;
+ _n = n ;
+ _matA.clear();
+ _matA.resize(m);
+
+ }
+
+
+ protected:
+
+ friend class SparseMatrixWriteHelper<Self_t>;
+ friend class SparseMatrixReadHelper<Self_t>;
+
+ const Field & _field;
+
+ MatrixDomain<Field> _MD; // Matrix domain for matrix operations
+ TransposeMatrix<SparseMatrixGeneric<_Field, _Row> > _AT;
+ Rep _matA;
+ size_t _m;
+ size_t _n;
+
+ // template<class F, class R, class T> friend class SparseMatrix;
+ };
+
+} // namespace Protected
+} // namespace LinBox
+
+#include "linbox/matrix/sparsematrix/sparse-associative-vector.inl"
+
+namespace LinBox
+{ /* SparseMatrix for SparseMatrixFormat::SparseMap */
+
+ template <class _Field /*, class _Row */ >
+ class SparseMatrix<_Field, SparseMatrixFormat::SparseMap/* <_Row> */ > : public Protected::SparseMatrixGeneric<_Field,/* _Row */ typename Vector<_Field>::SparseMap,VectorCategories::SparseAssociativeVectorTag> {
+ public:
+ typedef VectorCategories::SparseAssociativeVectorTag myTrait ;
+ typedef _Field Field ; //!< Field
+ typedef typename _Field::Element Element ; //!< Element
+ typedef const Element constElement ; //!< const Element
+ typedef typename Vector<_Field>::SparseMap Row ;
+ typedef SparseMatrixFormat::SparseMap Storage ; //!< Matrix Storage Format
+ typedef SparseMatrix<_Field,Storage> Self_t ; //!< Self type
+ typedef Protected::SparseMatrixGeneric<_Field,Row,myTrait > Father_t ;
+
+ public:
+ template<class VectStream>
+ SparseMatrix (const Field &F, VectStream &stream) :
+ Father_t(F,stream)
+ {}
+
+ SparseMatrix(const Field & F, size_t m, size_t n) :
+ Father_t(F, m, n)
+ {}
+
+ SparseMatrix(const Field & F) :
+ Father_t(F)
+ {}
+
+ SparseMatrix ( MatrixStream<Field>& ms ) :
+ Father_t(ms)
+ {}
+
+ template<class _Tp1, class _Storage>
+ SparseMatrix(const SparseMatrix<_Tp1,_Storage> & Mat, const Field & F) :
+ Father_t(F, Mat.rowdim(), Mat.coldim())
+ {
+ typename SparseMatrix<_Tp1,_Storage>::template rebind<Field,Storage>()(*this, Mat);
+
+ }
+
+
+
+ // using Father_t::RowIterator;
+
+ template<typename _Tp1, typename _R1 = SparseMatrixFormat::SparseMap >
+ struct rebind {
+ typedef SparseMatrix<_Tp1, _R1> other;
+
+ void operator() (other & Ap, const Self_t& A) {
+
+ typename _Tp1::Element e;
+
+ Hom<typename Self_t::Field, _Tp1> hom(A.field(), Ap.field());
+ for( typename Self_t::ConstIndexedIterator
+ indices = A.IndexedBegin();
+ (indices != A.IndexedEnd()) ;
+ ++indices ) {
+ hom. image (e, indices.value() );
+ if (!Ap.field().isZero(e))
+ Ap.setEntry (indices.rowIndex(),
+ indices.colIndex(), e);
+ }
+ }
+
+ };
+
+
+ } ; // SparseMatrix
+
+
+
+} // namespace LinBox
+
+
+#endif // __LINBOX_matrix_sparsematrix_sparse_associative_vector_H
+
+
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/matrix/sparsematrix/sparse-associative-vector.inl b/linbox/matrix/sparsematrix/sparse-associative-vector.inl
new file mode 100644
index 0000000..2a4e17f
--- /dev/null
+++ b/linbox/matrix/sparsematrix/sparse-associative-vector.inl
@@ -0,0 +1,139 @@
+/* linbox/matrix/sparse.inl
+ * Copyright (C) 2001-2002 Bradford Hovinen
+ * 1999-2001 William J Turner,
+ *
+ * Written by Bradford Hovinen <hovinen at cis.udel.edu>
+ * Based on sparse-base.h by William J Turner <wjturner at math.ncsu.edu>
+ *
+ * --------------------------------------------------------
+ * 2003-01-11 Bradford Hovinen <bghovinen at math.uwaterloo.ca>
+ *
+ * Move from blackbox/sparse-base.inl to matrix/sparse.inl
+ * ------------------------------------
+ * 2002-11-28 Bradford Hovinen <bghovinen at math.uwaterloo.ca>
+ *
+ * - Renamed ColOfRowsIterator to RowIterator
+ * - Named template argument _Row rather than Row; add a typedef to Row
+ * ------------------------------------
+ *
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ * ========LICENCE========
+ *.
+ */
+
+#ifndef __LINBOX_matrix_sparse_associative_INL
+#define __LINBOX_matrix_sparse_associative_INL
+
+namespace LinBox { namespace Protected {
+
+ template <class Field, class Row>
+ SparseMatrixGeneric<Field,Row,VectorCategories::SparseAssociativeVectorTag> ::SparseMatrixGeneric( MatrixStream<Field>& ms ) :
+ _field(ms.field()),
+ _MD(ms.field()),_AT(*this),
+ _matA(0), _m(0), _n(0)
+ {
+ Element val;
+ size_t i, j;
+ while( ms.nextTriple(i,j,val) ) {
+ if( i >= _m ) {
+ _m = i + 1;
+ _matA.resize( _m );
+ }
+ if( j >= _n ) _n = j + 1;
+ setEntry(i,j,val);
+ }
+ if( ms.getError() > END_OF_MATRIX )
+ throw ms.reportError(__func__,__LINE__);
+ if( !ms.getDimensions( i, _n ) )
+ throw ms.reportError(__func__,__LINE__);
+ if( i > _m ) {
+ _m = i;
+ _matA.resize(_m);
+ }
+ }
+
+
+ template <class Field, class Row>
+ const typename Field::Element &SparseMatrixGeneric<Field, Row, VectorCategories::SparseAssociativeVectorTag > ::getEntry (size_t i, size_t j) const
+ {
+
+ const Row &v = _matA[i];
+ typename Row::const_iterator iter;
+
+ if (v.size () == 0)
+ return field().zero;
+ else {
+ iter = v.find (j);
+
+ if (iter == v.end () || iter->first != j)
+ return field().zero;
+ else
+ return iter->second;
+ }
+ }
+
+
+ template <class Field, class Row>
+ template <class Vector>
+ Vector &SparseMatrixGeneric<Field, Row, VectorCategories::SparseAssociativeVectorTag >::columnDensity (Vector &v) const
+ {
+ unsigned int row = 0;
+
+ for (ConstRowIterator i = rowBegin (); i != rowEnd (); ++i, ++row) {
+ typename Row::const_iterator j = i.begin ();
+
+ for (; j != i->begin (); ++j)
+ ++v[j->first];
+ }
+
+ return v;
+ }
+
+
+ template <class Field, class Row>
+ SparseMatrixGeneric<Field, Row, VectorCategories::SparseAssociativeVectorTag >
+ &SparseMatrixGeneric<Field, Row, VectorCategories::SparseAssociativeVectorTag >::transpose (SparseMatrixGeneric &AT) const
+ {
+ unsigned int row = 0;
+
+ for (ConstRowIterator i = rowBegin (); i != rowEnd (); ++i, ++row) {
+ typename Row::const_iterator j = i.begin ();
+
+ for (; j != i->begin (); ++j)
+ AT._matA[j->first][row] = j->second;
+ }
+
+ return AT;
+ }
+
+
+} // namespace Protected
+} // namespace LinBox
+
+#endif // __LINBOX_matrix_sparse_INL
+
+
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+
diff --git a/linbox/matrix/sparsematrix/sparse-coo-implicit-matrix.h b/linbox/matrix/sparsematrix/sparse-coo-implicit-matrix.h
new file mode 100644
index 0000000..ecc799b
--- /dev/null
+++ b/linbox/matrix/sparsematrix/sparse-coo-implicit-matrix.h
@@ -0,0 +1,977 @@
+/* linbox/matrix/sparse-csr-matrix.h
+ * Copyright (C) 2013 the LinBox
+ *
+ * Written by :
+ * Brice Boyer (briceboyer) <boyer.brice at gmail.com>
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ * ========LICENCE========
+ */
+
+/*! @file matrix/sparsematrix/sparse-coo-implicit-matrix.h
+ * @ingroup sparsematrix
+ * @brief
+ */
+
+#ifndef __LINBOX_matrix_sparsematrix_sparse_coo_implicit_matrix_H
+#define __LINBOX_matrix_sparsematrix_sparse_coo_implicit_matrix_H
+
+#include <utility>
+#include <iostream>
+#include <algorithm>
+
+#include "linbox/linbox-config.h"
+#include "linbox/util/debug.h"
+#include "sparse-domain.h"
+
+
+namespace LinBox
+{
+
+ /** Sparse matrix, Coordinate storage.
+ *
+ * \ingroup matrix
+ * \ingroup sparse
+ */
+ template<class _Field>
+ class SparseMatrix<_Field, SparseMatrixFormat::COO::implicit> {
+ public :
+ typedef _Field Field ; //!< Field
+ typedef typename _Field::Element Element ; //!< Element
+ typedef const Element constElement ; //!< const Element
+ typedef SparseMatrixFormat::COO::implicit Storage ; //!< Matrix Storage Format
+ typedef SparseMatrix<_Field,Storage> Self_t ; //!< Self type
+
+ /*! Constructors.
+ * @todo convert from other matrix.
+ *
+ */
+ //@{
+ SparseMatrix<_Field, SparseMatrixFormat::COO::implicit> () :
+ _rownb(0),_colnb(0),
+ _nbnz(0),
+ _rowid(0),_colid(0)
+ , _field()
+ {
+ }
+
+ SparseMatrix<_Field, SparseMatrixFormat::COO::implicit> (const _Field & F) :
+ _rownb(0),_colnb(0),
+ _nbnz(0),
+ _rowid(0),_colid(0),_data(F.zero)
+ , _field(F)
+ {
+ }
+
+ SparseMatrix<_Field, SparseMatrixFormat::COO::implicit> (const _Field & F, size_t m, size_t n) :
+ _rownb(m),_colnb(n),
+ _nbnz(0),
+ _rowid(0),_colid(0),_data(F.zero)
+ , _field(F)
+ {
+ }
+
+ SparseMatrix<_Field, SparseMatrixFormat::COO::implicit> (const _Field & F,
+ size_t m, size_t n,
+ size_t z) :
+ _rownb(m),_colnb(n),
+ _nbnz(z),
+ _rowid(z),_colid(z),_data(F.zero),
+ _field(F)
+ {
+ }
+
+ SparseMatrix<_Field, SparseMatrixFormat::COO::implicit> (const SparseMatrix<_Field, SparseMatrixFormat::COO::implicit> & S) :
+ _rownb(S._rownb),_colnb(S._colnb),
+ _nbnz(S._nbnz),
+ _rowid(S._rowid),_colid(S._colid),_data(S._data),
+ _field(S._field)
+ {}
+
+#if 0
+ template<class _OtherField>
+ SparseMatrix<_Field, SparseMatrixFormat::COO::implicit> (const SparseMatrix<_OtherField, SparseMatrixFormat::COO::implicit> & S) :
+ _rownb(S._rownb),_colnb(S._colnb),
+ _nbnz(S._nbnz),
+ _rowid(S._rowid),_colid(S._colid),_data(S._data),
+ _field(S._field)
+ {}
+#endif
+
+ // XXX only for COO::implicit
+ template<typename _Tp1, typename _Rw1 = SparseMatrixFormat::COO::implicit>
+ struct rebind ;
+
+ template<typename _Tp1>
+ struct rebind<_Tp1/* ,SparseMatrixFormat::COO::implicit */ > {
+ typedef SparseMatrix<_Tp1, SparseMatrixFormat::COO::implicit> other;
+
+ void operator() (other & Ap, const Self_t& A)
+ {
+ // Ap = new other(F, A.rowdim(), A.coldim());
+
+ typename _Tp1::Element e;
+
+ Hom<typename Self_t::Field, _Tp1> hom(A.field(), Ap.field());
+ hom. image ( e, A.getData() );
+ if (!Ap.field().isZero(e)) {
+ Ap.setData(e);
+ }
+ }
+ };
+
+ template<typename _Tp1, typename _Rw1>
+ SparseMatrix (const SparseMatrix<_Tp1, _Rw1> &S, const Field& F) :
+ _rownb(S.rowdim()),_colnb(S.coldim()),
+ _nbnz(S.size()),
+ _rowid(S.size()),_colid(S.size()),_data(S.size()),
+ _field(F)
+ {
+ typename SparseMatrix<_Tp1,_Rw1>::template rebind<Field,SparseMatrixFormat::COO::implicit>()(*this, S);
+ }
+
+
+
+#if 0
+
+ template<class VectStream>
+ SparseMatrix<_Field, SparseMatrixFormat::COO::implicit> (const _Field & F, VectStream & stream) :
+ _rownb(stream.size()),_colnb(stream.dim()),
+ _rowid(0),_colid(0),_data(F.zero)
+ , _nbnz(0)
+ , _field(F)
+ {
+ // VectStream == RandomSparseStream<Field, typename Vector<Field>::SparseSeq>
+ {
+
+ }
+ for (size_t i = 0 ; i< _rownb ; ++i) {
+ typename Vector<Field>::SparseSeq lig_i ;
+ stream >> lig_i ;
+ for (size_t j = 0 ; j < lig_i.size() ; ++j) {
+ size_t nbnz = _nbnz++ ;
+ resize(_nbnz);
+ _rowid[nbnz] = i ;
+ _colid[nbnz] = lig_i[j].first ;
+ F.init(_data[nbnz], lig_i[j].second) ; //!@bug may be 0...
+ }
+ }
+ }
+#endif
+
+
+ void resize(size_t nn)
+ {
+#ifndef NDEBUG
+ if (nn < _nbnz) {
+ std::cerr << "*** Warning *** you are possibly loosing data (COO::implicit resize)" << std::endl;
+ // could be a commentator()...
+ }
+#endif
+ _rowid.resize(nn);
+ _colid.resize(nn);
+ _nbnz = nn ;
+ }
+
+ void resize(const size_t & mm, const size_t & nn, const size_t & zz)
+ {
+ _rownb = mm ;
+ _colnb = nn ;
+ _nbnz = zz;
+
+ _rowid.resize(zz);
+ _colid.resize(zz);
+ }
+
+ /*! Default converter.
+ * @param S a sparse matrix in any storage.
+ */
+ template<class _OtherStorage>
+ SparseMatrix<_Field, SparseMatrixFormat::COO::implicit> (const SparseMatrix<_Field, _OtherStorage> & S) :
+ _rownb(S._rownb),_colnb(S._colnb),
+ _rowid(S.size()),_colid(S.size()),_data(S.size()),
+ _field(S._field)
+ {
+ SparseMatrix<_Field,SparseMatrixFormat::CSR> Temp(_field,_rownb,_colnb) ;
+ S.exporte(Temp); // convert S to CSR
+ this->importe(Temp); // convert Temp from COO::implicit
+ }
+
+
+ //@}
+ /*! Conversions.
+ * Any sparse matrix has a converter to/from CSR.
+ * A specialisation can skip the temporary CSR matrix created.
+ */
+ //@{
+ /*! Import a matrix in CSR format to COO::implicit.
+ * @param S CSR matrix to be converted in COO::implicit
+ */
+ void importe(const SparseMatrix<_Field,SparseMatrixFormat::CSR> &S)
+ {
+ resize( S.rowdim() , S.coldim() , S.size() );
+ _colid = S.getColid();
+ _data = S.getData();
+ for (size_t i = 0 ; i < _rownb ; ++i)
+ for (size_t j = S.getStart(i) ; j < S.getEnd(i); ++j)
+ _rowid[j] = i ;
+
+ }
+
+ void importe(const SparseMatrix<_Field,SparseMatrixFormat::COO::implicit> &S)
+ {
+ resize( S.rowdim(), S.coldim(), S.size() );
+
+ setRowid(S.getRowid());
+ setColid(S.getColid());
+ setData(S.getData());
+ }
+
+ /*! Export a matrix in CSR format from COO::implicit.
+ * @param S CSR matrix to be converted from COO::implicit
+ */
+ SparseMatrix<_Field,SparseMatrixFormat::CSR > &
+ exporte(SparseMatrix<_Field,SparseMatrixFormat::CSR> &S)
+ {
+ S.resize(_rownb,_colnb,_nbnz) ;
+ S.setData( _data ) ;
+ S.setColid (_colid );
+
+ for(size_t i = 0 ; i <= _rownb ; ++i)
+ S.setStart(i,0);
+
+ for (size_t i = 0 ; i < _nbnz ; ++i) {
+ size_t idx = _rowid[i]+1 ;
+ S.setStart(idx,S.getStart(idx) + 1) ;
+ }
+ for (size_t i= 0 ; i < _rownb ; ++i)
+ S.setStart(i+1, S.getEnd(i)+ S.getStart(i)) ;
+
+ return S ;
+ }
+
+ SparseMatrix<_Field,SparseMatrixFormat::COO::implicit > &
+ exporte(SparseMatrix<_Field,SparseMatrixFormat::COO::implicit> &S)
+ {
+ S.resize(_rownb,_colnb,_nbnz) ;
+ S.setData( _data ) ;
+ S.setColid( _colid ) ;
+ S.setRowid( _rowid ) ;
+ }
+
+ //@}
+
+ /*! In place transpose. Not quite...
+ */
+ void transposeIn()
+ {
+ // SparseMatrix<_Field,SparseMatrixFormat::CSR> Temp(*this);
+ SparseMatrix<_Field,SparseMatrixFormat::COO::implicit> Temp(*this);
+ Temp.transposeIn();
+ importe(Temp);
+ }
+
+ /*! Transpose the matrix.
+ * @param S [out] transpose of self.
+ * @return a reference to \p S.
+ */
+ SparseMatrix<_Field,SparseMatrixFormat::COO::implicit> &
+ transpose(SparseMatrix<_Field,SparseMatrixFormat::COO::implicit> &S)
+ {
+ linbox_check(S.rowdim() == _colnb);
+ linbox_check(S.coldim() == _rownb);
+
+ // outStart
+ std::vector<size_t> start (_colnb+1,0);
+ for (size_t i = 0 ; i < size() ; ++i)
+ start[_colid[i]+1] += 1 ;
+ for (size_t i = 0 ; i < _colnb ; ++i)
+ start[i+1] += start[i] ;
+ // inStart;
+ std::vector<size_t> _start (_rownb+1,0);
+ for (size_t i = 0 ; i < size() ; ++i)
+ _start[_rowid[i]+1] += 1 ;
+ for (size_t i = 0 ; i < _rownb ; ++i)
+ _start[i+1] += _start[i] ;
+
+ {
+ size_t i = 0 ;
+ std::vector<size_t> done_col(_colnb,0);
+ for (size_t nextlig = 1 ; nextlig <= _rownb ; ++nextlig) {
+ // treating line before nextlig
+ while (i < _start[nextlig]){
+ size_t cur_place ;
+ cur_place = start[_colid[i]] + done_col[_colid[i]] ;
+ S._data[ cur_place ] = _data[i] ;
+ S._colid[ cur_place ] = nextlig-1 ;
+ done_col[_colid[i]] += 1 ;
+ ++i;
+ }
+ }
+ }
+
+ std::swap(_rownb,_colnb);
+ for (size_t i = 0 ; i < _rownb ; ++i)
+ for (size_t j = start[i] ; j < start[i+1]; ++j)
+ S._rowid[j] = i ;
+ }
+
+ /*! number of rows.
+ * @return row dimension.
+ */
+ size_t rowdim() const
+ {
+ return _rownb ;
+ }
+
+ /*! number of columns.
+ * @return column dimension
+ */
+ size_t coldim() const
+ {
+ return _colnb ;
+ }
+
+ /*! Number of non zero elements in the matrix.
+ * or at least the size of the _data if
+ * @return size of the _data.
+ */
+ size_t size() const
+ {
+ // return _data.size();
+ return _nbnz ;
+ }
+
+ /** Get a read-only individual entry from the matrix.
+ * @param i Row _colid
+ * @param j Column _colid
+ * @return Const reference to matrix entry
+ */
+ constElement &getEntry(const size_t &i, const size_t &j) const
+ {
+ // std::cout << "get entry : " << i << ',' << j << std::endl;
+ linbox_check(i<_rownb);
+ linbox_check(j<_colnb);
+ // Could be improved by adding an initial guess j/rodim*size()
+ // typedef typename std::vector<size_t>::iterator myIterator ;
+ typedef typename std::vector<size_t>::const_iterator myConstIterator ;
+
+ std::pair<myConstIterator,myConstIterator> bounds = std::equal_range (_rowid.begin(), _rowid.end(), i);
+ size_t ibeg = (size_t)(bounds.first-_rowid.begin());
+ size_t iend = (size_t)(bounds.second-_rowid.begin())-ibeg;
+ if (!iend) {
+ return field().zero;
+ }
+
+ myConstIterator beg = _colid.begin()+(ptrdiff_t)ibeg ;
+ myConstIterator low = std::lower_bound (beg, beg+(ptrdiff_t)iend, j);
+ if (low == beg+(ptrdiff_t)iend) {
+ return field().zero;
+ }
+ else {
+ // not sure
+ size_t la = (size_t)(low-_colid.begin()) ;
+ return _data[la] ;
+ }
+ }
+
+ Element &getEntry (Element &x, size_t i, size_t j) const
+ {
+ return x = getEntry (i, j);
+ }
+
+ /** Set an individual entry.
+ * Setting the entry to 0 will not remove it from the matrix
+ * @param i Row _colid of entry
+ * @param j Column _colid of entry
+ * @param value Value of the new entry
+ * @todo make it faster if i is 0 or m-1 ?
+ */
+ void setEntry(const size_t &i, const size_t &j, const Element& e)
+ {
+ linbox_check(i<_rownb);
+ linbox_check(j<_colnb);
+
+ if (field().isZero(e)) {
+ return clearEntry(i,j);
+ }
+ typedef typename std::vector<size_t>::iterator myIterator ;
+ std::pair<myIterator,myIterator> bounds = std::equal_range (_rowid.begin(), _rowid.end(), i);
+ size_t ibeg = bounds.first-_rowid.begin();
+ size_t iend = (bounds.second-_rowid.begin())-ibeg;
+ if (!iend) {
+ _rowid.insert(_rowid.begin()+ibeg,i);
+ _colid.insert(_colid.begin()+ibeg,j);
+ _data.insert( _data.begin() +ibeg,e);
+ return ;
+ }
+ myIterator beg = _colid.begin()+(ptrdiff_t)ibeg ;
+ myIterator low = std::lower_bound (beg, beg+(ptrdiff_t)iend, j);
+ ibeg = low-_colid.begin();
+ if (low == beg+(ptrdiff_t)iend) {
+ _rowid.insert(_rowid.begin()+(ptrdiff_t)ibeg,i);
+ _colid.insert(_colid.begin() +(ptrdiff_t)ibeg,j);
+ _data.insert( _data. begin() +(ptrdiff_t)ibeg,e);
+ return ;
+ }
+ else {
+ _data[ibeg] = e ;
+ return ;
+ }
+ }
+
+
+ /** Get a writeable reference to an entry in the matrix.
+ * If there is no entry at the position (i, j), then a new entry
+ * with a value of zero is inserted and a reference to it is
+ * returned.
+ * @param i Row _colid of entry
+ * @param j Column _colid of entry
+ * @return Reference to matrix entry
+ */
+ Element &refEntry(const size_t &i, const size_t&j)
+ {
+ linbox_check(i<_rownb);
+ linbox_check(j<_colnb);
+ // Could be improved by adding an initial guess j/rodim*size()
+ typedef typename std::vector<size_t>::iterator myIterator ;
+
+ std::pair<myIterator,myIterator> bounds = std::equal_range (_rowid.begin(), _rowid.end(), i);
+ size_t ibeg = bounds.first-_rowid.begin();
+ size_t iend = (bounds.second-_rowid.begin())-ibeg;
+ if (!iend) {
+ _rowid.insert(_rowid.begin()+ibeg,i);
+ _colid.insert(_colid.begin()+ibeg,j);
+ _data.insert( _data.begin() +ibeg,field().zero);
+ return _data[ibeg];
+ }
+ myIterator beg = _colid.begin()+ibeg ;
+ myIterator low = std::lower_bound (beg, beg+(ptrdiff_t)iend, j);
+ if (low == beg+(ptrdiff_t)iend) {
+ _rowid.insert(_rowid.begin()+ibeg,i);
+ _colid.insert(_colid.begin()+ibeg,j);
+ _data.insert( _data.begin() +ibeg,field().zero);
+ return _data[ibeg];
+ }
+ else {
+ size_t la = low-_colid.begin() ;
+ return _data[la] ;
+ }
+ }
+
+ /** Write a matrix to the given output stream using field read/write.
+ * @param os Output stream to which to write the matrix
+ * @param format Format with which to write
+ */
+ template<class Format>
+ std::ostream & write(std::ostream &os,
+ Format = SparseFileFormat::CSR()) const
+ {
+ return this->writeSpecialized(os,Format());
+ }
+
+ std::ostream & write(std::ostream &os,
+ enum LINBOX_enum(Tag::FileFormat) ff = Tag::FileFormat::Maple) const
+ {
+ return this->writeSpecialized(os,ff);
+ }
+
+
+ /** Read a matrix from the given input stream using field read/write
+ * @param file Input stream from which to read the matrix
+ * @param format Format of input matrix
+ * @return ref to \p file.
+ */
+ template<class Format>
+ std::istream& read (std::istream &file,
+ Format = SparseFileFormat::CSR())
+ {
+ return readSpecialized(file,Format());
+ }
+
+ /*! @internal
+ * @brief Deletes the entry.
+ * Deletes \c A(i,j) if it exists.
+ * @param i row _colid
+ * @param j col _colid
+ */
+ void clearEntry(const size_t &i, const size_t &j)
+ {
+ linbox_check(i<_rownb);
+ linbox_check(j<_colnb);
+ // Could be improved by adding an initial guess j/rodim*size()
+ typedef typename std::vector<size_t>::iterator myIterator ;
+
+ std::pair<myIterator,myIterator> bounds = std::equal_range (_rowid.begin(), _rowid.end(), i);
+ size_t ibeg = bounds.first-_rowid.begin();
+ size_t iend = (bounds.second-_rowid.begin())-ibeg;
+ if (!iend)
+ return ;
+
+ myIterator beg = _colid.begin()+ibeg ;
+ myIterator low = std::lower_bound (beg, beg+(ptrdiff_t)iend, j);
+ if (low == beg+(ptrdiff_t)iend)
+ return ;
+ else {
+ // not sure
+ size_t la = low-_colid.begin() ;
+ _rowid.erase(_rowid.begin()+la);
+ _colid.erase(_colid.begin()+la);
+ _data. erase(_data. begin()+la);
+ return ;
+ }
+ }
+
+ /*! @internal
+ * @brief cleans 0 entries.
+ */
+ void clean()
+ {
+ size_t i = 0 ;
+ while ( i < _data.size() ) {
+ if ( field().isZero(_data[i]) ) {
+ _rowid.erase(_rowid.begin()+i);
+ _colid.erase(_colid.begin()+i);
+ _data. erase(_data. begin()+i);
+ }
+ else
+ ++i ;
+ }
+ return ;
+ }
+
+ // y = A x + a * y ;
+ template<class Vector>
+ Vector& apply(Vector &y, const Vector& x, const Element & a ) const
+ {
+
+ prepare(field(),y,a);
+
+ for (size_t i = 0 ; i < _nbnz ; ++i)
+ field().axpyin( y[_rowid[i]], _data[i], x[_colid[i]] ); //!@bug may be 0...
+
+ return y;
+ }
+
+ class Helper ; // transpose
+
+ template<class Vector>
+ Vector& applyTranspose(Vector &y, const Vector& x, const Element & a ) const
+ {
+ prepare(field(),y,a);
+
+ for (size_t i = 0 ; i < _nbnz ; ++i)
+ field().axpyin( y[_colid[i]], _data[i], x[_rowid[i]] );
+
+ return y;
+ }
+
+ template<class Vector>
+ Vector& apply(Vector &y, const Vector& x ) const
+ {
+ return apply(y,x,field().zero);
+ }
+ template<class Vector>
+ Vector& applyTranspose(Vector &y, const Vector& x ) const
+ {
+ return apply(y,x,field().zero);
+ }
+
+
+
+ const Field & field() const
+ {
+ return _field ;
+ }
+
+ //! @todo
+ bool consistent() const
+ {
+ return true ;
+ }
+
+ private :
+
+ std::ostream & writeSpecialized(std::ostream &os,
+ LINBOX_enum(Tag::FileFormat) format) const
+ {
+ switch (format) {
+ case (Tag::FileFormat::Maple):
+ {
+
+ linbox_check(_colnb > 0);
+ os << "[";
+ bool firstrow=true;
+ size_t idx = 0 ;
+
+ linbox_check(_nbnz == _rowid.size());
+ linbox_check(_nbnz == _data.size());
+ linbox_check(_nbnz == _colid.size());
+ for (size_t i = 0 ; i < _rownb ; ++i ) {
+ if (firstrow) {
+ os << "[";
+ firstrow =false;
+ }
+ else
+ os << ", [";
+
+
+ for (size_t j = 0; j < _colnb ; ++j) {
+ if (idx == _nbnz)
+ field().write (os, field().zero);
+ else if (_colid[idx] == j &&
+ _rowid[idx] ==i) {
+ field().write (os, _data[idx]);
+ ++idx;
+ }
+ else {
+ field().write (os, field().zero);
+ }
+
+ if (j < _colnb - 1)
+ os << ", ";
+ }
+
+ os << " ]";
+ }
+
+ os << "]";
+ linbox_check(idx == _nbnz);
+
+ break;
+ }
+ default :
+ os << "I don't know" << std::endl;
+
+ }
+ return os ;
+
+ }
+
+#if 0 /* not updated and to be cleaned */
+ /*! @internal
+ * write for CSR format.
+ */
+ std::ostream & writeSpecialized(std::ostream &os,
+ SparseFileFormat::CSR) const
+ {
+ os << _rownb << ' ' << _colnb << ' ' << size() << std::endl;
+ size_t lig = 0 ;
+ size_t i = 0 ;
+ while(i < size()) {
+ while(lig < _rowid[i]) {
+ os << "-1" << std::endl;
+ ++lig ;
+ }
+ while (lig == _rowid[i]) {
+ field().write(_data[i], os << _colid[i] << ' ') << std::endl;
+ ++i;
+ }
+ ++lig ;
+ }
+ return os << "0 0 0" << std::endl;
+ }
+
+ /*! @internal
+ * write for COO::implicit format.
+ */
+ std::ostream & writeSpecialized(std::ostream &os,
+ SparseFileFormat::COO::implicit) const
+ {
+ os << _rownb << ' ' << _colnb << ' ' << size() << std::endl;
+ size_t i = 0 ;
+ while(i < size()) {
+ field().write(_data[i], os << _rowid[i] << ' ' << _colid[i] << ' ') << std::endl;
+ ++i;
+ }
+ return os << "0 0 0" << std::endl;
+ }
+
+
+
+ /*! @internal
+ * Read for CSR format.
+ */
+ std::istream & readSpecialized(std::istream &is,
+ SparseFileFormat::CSR)
+ {
+ size_t nnz = 0 ;
+ bool sms = true ;
+ std::string firstLine ;
+ std::string x ;
+ getline(is, firstLine);
+ std::istringstream line(firstLine);
+ line >> _rownb >> _colnb >> x ;
+ size_t mem = 10 ;
+ if (!_rownb || _colnb)
+ throw LinBoxError("bad input");
+ if (x.empty() || x.compare("M")) { /* SMS */
+ // mem = m ;
+ _rowid.reserve(mem);
+ _colid.reserve(mem);
+ _data.reserve(mem);
+ }
+ else { /* SMF */
+ sms = false ;
+ std::istringstream (x) >> nnz ;
+ if (!nnz)
+ throw LinBoxError("bad input");
+ mem = nnz ;
+ _rowid.reserve(nnz);
+ _colid.reserve(nnz);
+ _data.reserve(nnz);
+ }
+ Element z ;
+ if (sms) { /* SMS */
+ size_t lig = 0 ;
+ nnz = 0 ;
+ int n ;
+ while (is>>n) {
+ if (n == 0)
+ break;
+ while (n == -1) {
+ ++lig ;
+ is >> n ;
+ }
+ field().read(is,z) ;
+ if (n<0 || lig >=_rownb || n >> _colnb)
+ throw LinBoxError("bad input");
+ if (!field().isZero(z)){
+ if (mem == nnz) {
+ mem+=20 ;
+ _rowid.resize(mem);
+ _colid.resize(mem);
+ _data.resize (mem);
+ }
+
+ _rowid[nnz]= lig ;
+ _colid[nnz]= n ;
+ _data[nnz] = z ;
+ ++nnz ;
+ }
+ }
+ _rowid.resize(nnz);
+ _colid.resize(nnz);
+ _data.resize (nnz);
+
+ }
+ else { /* SMF */
+ size_t lig = 0 ;
+ int n ;
+ size_t loc = 0;
+ while (is>>n) {
+ if (n == 0)
+ break;
+ while (n == -1) {
+ ++lig ;
+ is >> n ;
+ }
+ field().read(is,z) ;
+ if (n<0 || lig >=_rownb || n >> _colnb)
+ throw LinBoxError("bad input");
+ if (!field().isZero(z)){
+ _rowid[loc]= lig ;
+ _colid[loc]= n ;
+ _data[loc] = z ;
+ ++loc ;
+ }
+ }
+ if (loc > nnz)
+ throw LinBoxError("bad input");
+ _rowid.resize(loc);
+ _colid.resize(loc);
+ _data.resize (loc);
+ }
+ return is ;
+ }
+
+ /*! @internal
+ * Read for COO::implicit format.
+ */
+ std::istream & readSpecialized(std::istream &is,
+ SparseFileFormat::COO::implicit)
+ {
+ size_t nnz = 0;
+ bool sms = true ;
+ std::string firstLine ;
+ getline(is, firstLine);
+ std::istringstream line(firstLine);
+ std::string x ;
+ line >> _rownb >> _colnb >> x ;
+ size_t mem = 10 ;
+ if (!_rownb || _colnb)
+ throw LinBoxError("bad input");
+ if (x.empty() || x.compare("M")) { /* SMS */
+ // mem = m ;
+ _rowid.reserve(mem);
+ _colid.reserve(mem);
+ _data.reserve(mem);
+ }
+ else { /* SMF */
+ sms = false ;
+ std::istringstream (x) >> nnz ;
+ if (!nnz)
+ throw LinBoxError("bad input");
+ mem = nnz ;
+ _rowid.reserve(nnz);
+ _colid.reserve(nnz);
+ _data.reserve(nnz);
+ }
+ Element z ;
+ if (sms) { /* SMS */
+ // size_t lig = 0 ;
+ nnz = 0 ;
+ int m,n ;
+ while (is>>m >> n) {
+ if (m == 0 && n == 0)
+ break;
+ if (n<0 || m<0 || m >=_rownb || n >> _colnb)
+ throw LinBoxError("bad input");
+ field().read(is,z) ;
+ if (!field().isZero(z)){
+ if (mem == nnz) {
+ mem+=20 ;
+ _rowid.resize(mem);
+ _colid.resize(mem);
+ _data.resize (mem);
+ }
+ _rowid[nnz]= m ;
+ _colid[nnz]= n ;
+ _data[nnz] = z ;
+ ++nnz ;
+ }
+ }
+ _rowid.resize(nnz);
+ _colid.resize(nnz);
+ _data.resize (nnz);
+
+ }
+ else { /* SMF */
+ size_t loc = 0 ;
+ int m,n ;
+ while (is>>m >> n) {
+ if (m == 0 && n == 0)
+ break;
+ if (n<0 || m<0 || m >=_rownb || n >> _colnb)
+ throw LinBoxError("bad input");
+ field().read(is,z) ;
+ if (!field().isZero(z)){
+ _rowid[loc]= m ;
+ _colid[loc]= n ;
+ _data[loc] = z ;
+ ++loc ;
+ }
+ }
+
+ if (loc > nnz)
+ throw LinBoxError("bad input");
+ _rowid.resize(loc);
+ _colid.resize(loc);
+ _data.resize (loc);
+
+ }
+ return is ;
+ }
+#endif
+
+
+ public:
+ // pseudo iterators
+ size_t getRowid(const size_t & i) const
+ {
+ return _rowid[i];
+ }
+
+ void setRowid(const size_t &i, const size_t & j)
+ {
+ if (i>=_nbnz) this->resize(i);
+ _rowid[i]=j;
+ }
+
+ void setRowid(const std::vector<size_t> & new_rowid)
+ {
+ // linbox_check(_rowid.size() == new_rowid.size());
+ _rowid = new_rowid ;
+ }
+
+ std::vector<size_t> getRowid( ) const
+ {
+ return _rowid ;
+ }
+
+ size_t getColid(const size_t & i) const
+ {
+ return _colid[i];
+ }
+
+ void setColid(const size_t & i, const size_t & j)
+ {
+ if (i>=_nbnz) this->resize(i);
+ _colid[i]=j;
+ }
+
+ void setColid(std::vector<size_t> new_colid)
+ {
+ // linbox_check(_colid.size() == new_colid.size());
+ _colid = new_colid ;
+ }
+
+ std::vector<size_t> getColid( ) const
+ {
+ return _colid ;
+ }
+
+
+
+ void setData(Element & new_data)
+ {
+ _data = new_data ;
+ }
+
+ Element getData( ) const
+ {
+ return _data ;
+ }
+
+ protected :
+
+ size_t _rownb ;
+ size_t _colnb ;
+ size_t _nbnz ;
+
+ std::vector<size_t> _rowid ;
+ std::vector<size_t> _colid ;
+ Element _data ;
+
+ const _Field & _field;
+ };
+
+
+
+
+} // namespace LinBox
+
+#endif // __LINBOX_matrix_sparsematrix_sparse_coo_implicit_matrix_H
+
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/matrix/sparsematrix/sparse-coo-matrix.h b/linbox/matrix/sparsematrix/sparse-coo-matrix.h
new file mode 100644
index 0000000..65a8f21
--- /dev/null
+++ b/linbox/matrix/sparsematrix/sparse-coo-matrix.h
@@ -0,0 +1,1282 @@
+/* linbox/matrix/sparse-csr-matrix.h
+ * Copyright (C) 2013 the LinBox
+ *
+ * Written by :
+ * Brice Boyer (briceboyer) <boyer.brice at gmail.com>
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ * ========LICENCE========
+ */
+
+/*! @file matrix/sparsematrix/sparse-coo-matrix.h
+ * @ingroup sparsematrix
+ * @brief
+ */
+
+
+#ifndef __LINBOX_matrix_sparsematrix_sparse_coo_matrix_H
+#define __LINBOX_matrix_sparsematrix_sparse_coo_matrix_H
+
+#include <utility>
+#include <iostream>
+#include <algorithm>
+
+#include "linbox/linbox-config.h"
+#include "linbox/util/debug.h"
+#include "linbox/field/hom.h"
+#include "sparse-domain.h"
+
+#ifndef LINBOX_COO_TRANSPOSE
+#define LINBOX_COO_TRANSPOSE 1000
+#endif
+
+namespace LinBox
+{
+
+
+ /** Sparse matrix, Coordinate storage.
+ *
+ * \ingroup matrix
+ * \ingroup sparse
+ */
+ template<class _Field>
+ class SparseMatrix<_Field, SparseMatrixFormat::COO> {
+ public :
+ typedef _Field Field ; //!< Field
+ typedef typename _Field::Element Element ; //!< Element
+ typedef const Element constElement ; //!< const Element
+ typedef SparseMatrixFormat::COO Storage ; //!< Matrix Storage Format
+ typedef SparseMatrix<_Field,Storage> Self_t ; //!< Self type
+ typedef typename Vector<Field>::SparseSeq Row ; //!< @warning this is not the row type. Just used for streams.
+ // typedef Vector<_Field,VectorStorage::Sparse> Rep ;
+
+ /*! Constructors.
+ * @todo convert from other matrix.
+ *
+ */
+ //@{
+#if 0 /* No empty CSTOR */
+ SparseMatrix<_Field, SparseMatrixFormat::COO> () :
+ _rownb(0),_colnb(0)
+ ,_nbnz(0)
+ ,_rowid(0),_colid(0),_data(0)
+ , _field()
+ , _helper()
+ {
+ }
+#endif
+
+ SparseMatrix<_Field, SparseMatrixFormat::COO> (const _Field & F) :
+ _rownb(0),_colnb(0)
+ ,_nbnz(0)
+ ,_rowid(0)
+ ,_colid(0)
+ ,_data(0)
+ , _field(F)
+ , _helper()
+ {
+ }
+
+ SparseMatrix<_Field, SparseMatrixFormat::COO> (const _Field & F, size_t m, size_t n) :
+ _rownb(m),_colnb(n)
+ ,_nbnz(0)
+ ,_rowid(0)
+ ,_colid(0)
+ ,_data(0)
+ , _field(F)
+ , _helper()
+ {
+ }
+
+ SparseMatrix<_Field, SparseMatrixFormat::COO> (const _Field & F,
+ size_t m, size_t n,
+ size_t z) :
+ _rownb(m),_colnb(n)
+ , _nbnz(z)
+ ,_rowid(z)
+ , _colid(z)
+ ,_data(z)
+ , _field(F)
+ , _helper()
+ {
+ }
+
+ SparseMatrix<_Field, SparseMatrixFormat::COO> (const SparseMatrix<_Field, SparseMatrixFormat::COO> & S) :
+ _rownb(S._rownb),_colnb(S._colnb)
+ ,_nbnz(S._nbnz)
+ ,_rowid(S._rowid)
+ , _colid(S._colid)
+ ,_data(S._data)
+ , _field(S._field)
+ , _helper()
+ {
+ }
+
+#if 0
+ template<class _OtherField>
+ SparseMatrix<_Field, SparseMatrixFormat::COO> (const SparseMatrix<_OtherField, SparseMatrixFormat::COO> & S) :
+ _rownb(S._rownb),_colnb(S._colnb),
+ _nbnz(S._nbnz),
+ _rowid(S._rowid),_colid(S._colid),_data(S._data),
+ _field(S._field)
+ {}
+#endif
+
+ template<typename _Tp1, typename _Rw1 = SparseMatrixFormat::COO>
+ struct rebind {
+ typedef SparseMatrix<_Tp1, _Rw1> other;
+ private:
+
+ template<class _Rw>
+ void rebindMethod(SparseMatrix<_Tp1, _Rw> & Ap, const Self_t & A /*, IndexedCategory::HasNext */)
+ {
+ typename _Tp1::Element e;
+ Hom<typename Self_t::Field, _Tp1> hom(A.field(), Ap.field());
+
+ size_t i, j ;
+ Element f ;
+ A.firstTriple();
+ while ( A.nextTriple(i,j,f) ) {
+ linbox_check(i < A.rowdim() && j < A.coldim()) ;
+ hom. image ( e, f) ;
+ if (! Ap.field().isZero(e) )
+ Ap.appendEntry(i,j,e);
+ }
+ A.firstTriple();
+ Ap.finalize();
+ }
+
+ void rebindMethod(SparseMatrix<_Tp1, SparseMatrixFormat::COO> & Ap, const Self_t & A /*, IndexedCategory::HasNext*/)
+ {
+ // we don't use nextTriple because we can do better.
+
+ typename _Tp1::Element e;
+
+ Hom<typename Self_t::Field, _Tp1> hom(A.field(), Ap.field());
+ size_t j = 0 ;
+ for (size_t i = 0 ; i < A.size() ; ++i) {
+ hom. image ( e, A.getData(i) );
+ if (!Ap.field().isZero(e)) {
+ Ap.setTriple(j,A.getRowid(i),A.getColid(i),e);
+ ++j;
+ }
+ }
+
+
+ if (j != Ap.size())
+ Ap.resize(j);
+
+ }
+
+ public:
+
+ void operator() (other & Ap, const Self_t& A)
+ {
+ rebindMethod(Ap, A );
+
+ }
+
+ };
+
+ template<typename _Tp1, typename _Rw1>
+ SparseMatrix (const SparseMatrix<_Tp1, _Rw1> &S, const Field& F) :
+ _rownb(S.rowdim()),_colnb(S.coldim())
+ ,_nbnz(S.size())
+ , _rowid(S.size())
+ , _colid(S.size())
+ ,_data(S.size())
+ , _field(F)
+ {
+ typename SparseMatrix<_Tp1,_Rw1>::template rebind<Field,Storage>()(*this, S);
+ finalize();
+ }
+
+
+
+
+ template<class VectStream>
+ SparseMatrix<_Field, SparseMatrixFormat::COO> (const _Field & F, VectStream & stream) :
+ _rownb(stream.size()),_colnb(stream.dim())
+ , _nbnz(0)
+ , _rowid(0)
+ , _colid(0)
+ ,_data(0)
+ , _field(F)
+ {
+ {
+
+ }
+ for (size_t i = 0 ; i< _rownb ; ++i) {
+ typename Vector<Field>::SparseSeq lig_i ;
+ stream >> lig_i ;
+ for (size_t j = 0 ; j < lig_i.size() ; ++j) {
+ size_t nbnz = _nbnz++ ;
+ resize(_nbnz);
+ _rowid[nbnz] = i ;
+ _colid[nbnz] = lig_i[j].first ;
+ F.init(_data[nbnz], lig_i[j].second) ; //!@bug may be 0...
+ }
+ }
+ }
+
+ SparseMatrix<_Field, SparseMatrixFormat::COO> ( MatrixStream<Field>& ms ):
+ _rownb(0),_colnb(0)
+ ,_nbnz(0)
+ ,_rowid(0)
+ ,_colid(0)
+ ,_data(0)
+ ,_field(ms.field())
+ {
+ firstTriple();
+
+ Element val;
+ size_t i, j;
+ while( ms.nextTriple(i,j,val) ) {
+ if (! field().isZero(val)) {
+ if( i >= _rownb ) {
+ _rownb = i + 1;
+ }
+ if( j >= _colnb ) {
+ _colnb = j + 1;
+ }
+ appendEntry(i,j,val);
+ }
+ }
+ if( ms.getError() > END_OF_MATRIX )
+ throw ms.reportError(__func__,__LINE__);
+ if( !ms.getDimensions( i, j ) )
+ throw ms.reportError(__func__,__LINE__);
+#ifndef NDEBUG
+ if( i != _rownb || j != _colnb) {
+ std::cout << " ***Warning*** the sizes got changed" << __func__ << ',' << __LINE__ << std::endl;
+ // _rownb = i;
+ // _matA.resize(_m);
+ }
+#endif
+
+ firstTriple();
+ finalize();
+ }
+
+ void resize(size_t nn)
+ {
+#ifndef NDEBUG
+ if (nn < _nbnz) {
+ std::cerr << "*** Warning *** you are possibly loosing data (COO resize)" << std::endl;
+ // could be a commentator()...
+ }
+#endif
+ _rowid.resize(nn);
+ _colid.resize(nn);
+ _data.resize(nn);
+ _nbnz = nn ;
+ }
+
+ void resize(const size_t & mm, const size_t & nn, const size_t & zz = 0)
+ {
+ _rownb = mm ;
+ _colnb = nn ;
+
+ resize(zz);
+ }
+
+ /*! Default converter.
+ * @param S a sparse matrix in any storage.
+ */
+ template<class _OtherStorage>
+ SparseMatrix<_Field, SparseMatrixFormat::COO> (const SparseMatrix<_Field, _OtherStorage> & S) :
+ _rownb(S._rownb),_colnb(S._colnb),
+ _rowid(S.size()),_colid(S.size()),_data(S.size()),
+ _field(S._field)
+ {
+ SparseMatrix<_Field,SparseMatrixFormat::CSR> Temp(_field,_rownb,_colnb) ;
+ S.exporte(Temp); // convert S to CSR
+ this->importe(Temp); // convert Temp from COO
+ finalize();
+ }
+
+
+
+ //@}
+ /*! Conversions.
+ * Any sparse matrix has a converter to/from CSR.
+ * A specialisation can skip the temporary CSR matrix created.
+ */
+ //@{
+ /*! Import a matrix in CSR format to COO.
+ * @param S CSR matrix to be converted in COO
+ */
+ void importe(const SparseMatrix<_Field,SparseMatrixFormat::CSR> &S)
+ {
+ resize( S.rowdim() , S.coldim() , S.size() );
+ _colid = S.getColid();
+ _data = S.getData();
+ for (size_t i = 0 ; i < _rownb ; ++i)
+ for (size_t j = S.getStart(i) ; j < S.getEnd(i); ++j)
+ _rowid[j] = i ;
+
+ }
+
+ void importe(const SparseMatrix<_Field,SparseMatrixFormat::COO> &S)
+ {
+ resize( S.rowdim(), S.coldim(), S.size() );
+
+ setRowid(S.getRowid());
+ setColid(S.getColid());
+ setData(S.getData());
+ }
+
+ /*! Export a matrix in CSR format from COO.
+ * @param S CSR matrix to be converted from COO
+ */
+ SparseMatrix<_Field,SparseMatrixFormat::CSR > &
+ exporte(SparseMatrix<_Field,SparseMatrixFormat::CSR> &S)
+ {
+ linbox_check(consistent());
+
+ S.resize(_rownb, _colnb, _nbnz);
+ S.setData( _data ) ;
+ S.setColid (_colid );
+
+ for(size_t i = 0 ; i <= _rownb ; ++i)
+ S.setStart(i,0);
+
+ for (size_t i = 0 ; i < _nbnz ; ++i) {
+ size_t idx = _rowid[i]+1 ;
+ S.setStart(idx,S.getStart(idx) + 1) ;
+ }
+ for (size_t i= 0 ; i < _rownb ; ++i)
+ S.setStart(i+1, S.getEnd(i)+ S.getStart(i)) ;
+
+ return S ;
+ }
+
+ SparseMatrix<_Field,SparseMatrixFormat::COO > &
+ exporte(SparseMatrix<_Field,SparseMatrixFormat::COO> &S)
+ {
+ S.resize(_rownb, _colnb, _nbnz);
+ S.setData( _data ) ;
+ S.setColid( _colid ) ;
+ S.setRowid( _rowid ) ;
+ S.finalize();
+
+ return S ;
+ }
+
+
+ //@}
+
+ /*! In place transpose. Not quite...
+ */
+ void transposeIn()
+ {
+ Self_t Temp(*this);
+ Temp.transpose(*this);
+ }
+
+ /*! Transpose the matrix.
+ * @param S [out] transpose of self.
+ * @return a reference to \p S.
+ */
+ Self_t &
+ transpose(Self_t &S) const
+ {
+ // outStart
+ std::vector<size_t> start (coldim()+1,0);
+
+ for (size_t i = 0 ; i < size() ; ++i)
+ start[_colid[i]+1] += 1 ;
+
+ for (size_t i = 0 ; i < coldim() ; ++i)
+ start[i+1] += start[i] ;
+
+ // inStart;
+ std::vector<size_t> _start (rowdim()+1,0);
+ for (size_t i = 0 ; i < size() ; ++i)
+ _start[_rowid[i]+1] += 1 ;
+
+ for (size_t i = 0 ; i < rowdim() ; ++i)
+ _start[i+1] += _start[i] ;
+
+ S.resize((size_t)_colnb, (size_t)_rownb, (size_t)_nbnz ); // necessary copy to temp, no const ref
+
+ {
+ size_t i = 0 ;
+ std::vector<size_t> done_col(coldim(),0);
+ for (size_t nextlig = 1 ; nextlig <= rowdim() ; ++nextlig) {
+ // treating line before nextlig
+ while (i < _start[nextlig]){
+ size_t cur_place ;
+ cur_place = start[_colid[i]] + done_col[_colid[i]] ;
+ linbox_check(cur_place < size());
+ S._data [ cur_place ] = _data[i] ;
+ S._colid[ cur_place ] = nextlig-1 ;
+ done_col[ _colid[i] ] += 1 ;
+ ++i;
+ }
+ }
+ }
+
+ for (size_t i = 0 ; i < coldim() ; ++i)
+ for (size_t j = start[i] ; j < start[i+1]; ++j)
+ S._rowid[j] = i ;
+
+ S.finalize();
+
+ return S ;
+ }
+
+ /*! number of rows.
+ * @return row dimension.
+ */
+ size_t rowdim() const
+ {
+ return _rownb ;
+ }
+
+ /*! number of columns.
+ * @return column dimension
+ */
+ size_t coldim() const
+ {
+ return _colnb ;
+ }
+
+ /*! Number of non zero elements in the matrix.
+ * or at least the size of the _data if
+ * @return size of the _data.
+ */
+ size_t size() const
+ {
+ // return _data.size();
+ return _nbnz ;
+ }
+
+ void setSize(const size_t & z)
+ {
+ _nbnz = z ;
+ }
+
+
+ /** Get a read-only individual entry from the matrix.
+ * @param i Row _colid
+ * @param j Column _colid
+ * @return Const reference to matrix entry
+ */
+ constElement &getEntry(const size_t &i, const size_t &j) const
+ {
+ linbox_check(i<_rownb);
+ linbox_check(j<_colnb);
+ ptrdiff_t nnz = _triples.next();
+
+ // linbox_check(nnz < _colid.size());
+ // linbox_check(nnz < _rowid.size());
+ // linbox_check(nnz < _data.size());
+
+ if ( nnz < (ptrdiff_t)_nbnz && _colid[nnz] == j && i ==_rowid[nnz] ) { /* sort of nextTriple */
+ linbox_check(!field().isZero(_data[nnz]));
+ return _data[nnz];
+ }
+ else { /* searching */
+ typedef typename std::vector<size_t>::const_iterator myConstIterator ;
+ std::pair<myConstIterator,myConstIterator> bounds = std::equal_range (_rowid.begin(), _rowid.end(), i);
+ size_t ibeg = bounds.first-_rowid.begin();
+ size_t iend = bounds.second-_rowid.begin();
+ if (ibeg == iend) {
+ return field().zero;
+ }
+ // element may exist
+ myConstIterator beg = _colid.begin() + (ptrdiff_t)ibeg ;
+ myConstIterator end = _colid.begin() + (ptrdiff_t)iend ;
+ myConstIterator low = std::lower_bound (beg, end, j);
+ ibeg = (size_t)(low-_colid.begin());
+ // insert
+ if ( low == end || j != _colid[ibeg] ) {
+ return field().zero;
+ }
+ // replace
+ else {
+ _triples._nnz = ibeg ;// just in case it can be used, after all that work...
+ return _data[ibeg];
+ }
+ }
+
+ }
+
+ Element &getEntry (Element &x, size_t i, size_t j) const
+ {
+ return x = getEntry (i, j);
+ }
+
+ void appendEntry(const size_t &i, const size_t &j, const Element& e)
+ {
+ linbox_check(i < rowdim());
+ linbox_check(j < coldim());
+
+ if (field().isZero(e)) { /* probably already tested */
+ return ;
+ }
+
+#if 0 /* reserve is slow */
+ if (_nbnz % 10 == 0 ) {
+ _rowid.reserve(_nbnz+10);
+ _colid.reserve(_nbnz+10);
+ _data. reserve(_nbnz+10);
+ }
+#endif
+ _rowid.push_back(i);
+ _colid.push_back(j);
+ _data .push_back(e);
+ ++_nbnz ;
+ return;
+
+ }
+
+ /// make matrix ready to use after a sequence of setEntry calls.
+ void finalize()
+ {
+ _triples.reset();
+ } // end construction after a sequence of setEntry calls.
+
+ /** Set an individual entry.
+ * Setting the entry to 0 will not remove it from the matrix
+ * @param i Row _colid of entry
+ * @param j Column _colid of entry
+ * @param value Value of the new entry
+ * @todo make it faster if i is 0 or m-1 ?
+ * @warning if this is used to build a matrix and this matrix is "well formed",
+ * it can be sped up (no checking that the entry already exists).
+ */
+ void setEntry(const size_t &i, const size_t &j, const Element& e
+ )
+ {
+ linbox_check(i<_rownb);
+ linbox_check(j<_colnb);
+
+ if (field().isZero(e)) {
+ return clearEntry(i,j);
+ }
+
+ // nothing has been done yet
+ typedef typename std::vector<size_t>::iterator myIterator ;
+ std::pair<myIterator,myIterator> bounds = std::equal_range (_rowid.begin(), _rowid.end(), i);
+ size_t ibeg = bounds.first-_rowid.begin();
+ size_t iend = bounds.second-_rowid.begin();
+ // element does not exist, insert
+ if (ibeg == iend) {
+ // std::cout << "# insert " << i << ',' << j << ':' << e << std::endl;
+ _rowid.insert(_rowid.begin()+ibeg,i);
+ _colid.insert(_colid.begin()+ibeg,j);
+ _data.insert( _data.begin() +ibeg,e);
+ ++_nbnz;
+ return ;
+ }
+ // element may exist
+ myIterator beg = _colid.begin() + (ptrdiff_t)ibeg ;
+ myIterator end = _colid.begin() + (ptrdiff_t)iend ;
+ myIterator low = std::lower_bound (beg, end, j);
+ ibeg = (size_t)(low-_colid.begin());
+ // insert
+ if ( low == end || j != _colid[ibeg] ) {
+ // std::cout << "# 2 insert " << i << ',' << j << ':' << e << std::endl;
+ _rowid.insert(_rowid.begin() + (ptrdiff_t)ibeg,i);
+ _colid.insert(_colid.begin() + (ptrdiff_t)ibeg,j);
+ _data.insert (_data. begin() + (ptrdiff_t)ibeg,e);
+ ++_nbnz;
+ return ;
+ }
+ // replace
+ else {
+ // std::cout << "# replace " << i << ',' << j << ':' << e << std::endl;
+ _data[ibeg] = e ;
+ return ;
+ }
+ }
+
+#if 0
+ /** Get a writeable reference to an entry in the matrix.
+ * If there is no entry at the position (i, j), then a new entry
+ * with a value of zero is inserted and a reference to it is
+ * returned.
+ * @param i Row _colid of entry
+ * @param j Column _colid of entry
+ * @return Reference to matrix entry
+ */
+ Element &refEntry(const size_t &i, const size_t&j)
+ {
+ linbox_check(i<_rownb);
+ linbox_check(j<_colnb);
+ // Could be improved by adding an initial guess j/rowdim*size()
+ typedef typename std::vector<size_t>::iterator myIterator ;
+
+ std::pair<myIterator,myIterator> bounds = std::equal_range (_rowid.begin(), _rowid.end(), i);
+ size_t ibeg = bounds.first-_rowid.begin();
+ size_t iend = (bounds.second-_rowid.begin())-ibeg;
+ if (!iend) {
+ _rowid.insert(_rowid.begin()+ibeg,i);
+ _colid.insert(_colid.begin()+ibeg,j);
+ _data.insert( _data.begin() +ibeg,field().zero);
+ return _data[ibeg];
+ }
+ myIterator beg = _colid.begin()+ibeg ;
+ myIterator low = std::lower_bound (beg, beg+(ptrdiff_t)iend, j);
+ if (low == beg+(ptrdiff_t)iend) {
+ _rowid.insert(_rowid.begin()+ibeg,i);
+ _colid.insert(_colid.begin()+ibeg,j);
+ _data.insert( _data.begin() +ibeg,field().zero);
+ return _data[ibeg];
+ }
+ else {
+ size_t la = low-_colid.begin() ;
+ return _data[la] ;
+ }
+ }
+#endif
+
+ /** Write a matrix to the given output stream using field read/write.
+ * @param os Output stream to which to write the matrix
+ * @param format Format with which to write
+ */
+ std::ostream & write(std::ostream &os
+ , LINBOX_enum(Tag::FileFormat) format = Tag::FileFormat::MatrixMarket) const
+ {
+ return SparseMatrixWriteHelper<Self_t>::write(*this,os,format);
+ }
+
+
+ /** Read a matrix from the given input stream using field read/write
+ * @param is Input stream from which to read the matrix
+ * @param format Format of input matrix
+ * @return ref to \p is.
+ */
+ std::istream& read (std::istream &is
+ , LINBOX_enum(Tag::FileFormat) format = Tag::FileFormat::Detect)
+ {
+ return SparseMatrixReadHelper<Self_t>::read(*this,is,format);
+ }
+
+ /*! @internal
+ * @brief Deletes the entry.
+ * Deletes \c A(i,j) if it exists.
+ * @param i row _colid
+ * @param j col _colid
+ */
+ void clearEntry(const size_t &i, const size_t &j)
+ {
+ linbox_check(i<_rownb);
+ linbox_check(j<_colnb);
+ typedef typename std::vector<size_t>::iterator myIterator ;
+
+ std::pair<myIterator,myIterator> bounds = std::equal_range (_rowid.begin(), _rowid.end(), i);
+ size_t ibeg = bounds.first-_rowid.begin();
+ size_t iend = (bounds.second-_rowid.begin());
+ if (ibeg == iend)
+ return ;
+
+ myIterator beg = _colid.begin() +(ptrdiff_t)ibeg;
+ myIterator end = _colid.begin() +(ptrdiff_t)iend;
+ myIterator low = std::lower_bound (beg, end, j);
+ if (low == end)
+ return ;
+ else {
+ // not sure
+ size_t la = low-_colid.begin() ;
+ _rowid.erase(_rowid.begin()+(ptrdiff_t)la);
+ _colid.erase(_colid.begin()+(ptrdiff_t)la);
+ _data. erase(_data. begin()+(ptrdiff_t)la);
+ --_nbnz;
+ return ;
+ }
+ }
+
+ /*! @internal
+ * @brief cleans 0 entries.
+ */
+ void clean()
+ {
+ size_t i = 0 ;
+ while ( i < _data.size() ) {
+ if ( field().isZero(_data[i]) ) {
+ _rowid.erase(_rowid.begin()+i);
+ _colid.erase(_colid.begin()+i);
+ _data. erase(_data. begin()+i);
+ }
+ else
+ ++i ;
+ }
+ return ;
+ }
+
+ // y = A x + a * y ;
+ template<class Vector>
+ Vector& apply(Vector &y, const Vector& x, const Element & a ) const
+ {
+ // linbox_check(consistent());
+ prepare(field(),y,a);
+
+ size_t z = 0 ;
+ size_t last_i = 0 ;
+
+#if 0
+ for (size_t i = 0 ; i < _nbnz ; ++i)
+ field().axpyin( y[_rowid[i]], _data[i], x[_colid[i]] );
+#else
+ FieldAXPY<Field> accu(field());
+ while ( z < _nbnz) {
+ if (_rowid[z] == last_i) {
+ accu.mulacc( _data[z], x[_colid[z]] );
+ }
+ else {
+ accu.get(y[last_i]);
+ last_i = _rowid[z] ;
+ accu.reset();
+ accu.mulacc( _data[z], x[_colid[z]] );
+ }
+ ++z ;
+ }
+ accu.get(y[last_i]);
+#endif
+
+ return y;
+ }
+
+
+ template<class Vector>
+ Vector& applyTranspose(Vector &y, const Vector& x, const Element & a ) const
+ {
+ linbox_check(consistent());
+ if (_helper.optimized(*this)) {
+ return _helper.matrix().apply(y,x,a) ; // NEVER use applyTranspose on that thing.
+ }
+
+ prepare(field(),y,a);
+
+#if 0
+ for (size_t i = 0 ; i < _nbnz ; ++i)
+ field().axpyin( y[_colid[i]], _data[i], x[_rowid[i]] );
+#else
+ const FieldAXPY<Field> accu0(field());
+ std::vector<FieldAXPY<Field> > Y(_colnb, accu0);
+ for (size_t i = 0 ; i < _nbnz ; ++i)
+ Y[_colid[i]].mulacc( _data[i], x[_rowid[i]] );
+ for (size_t i = 0 ; i < _colnb ; ++i)
+ Y[i].get(y[i]) ;
+#endif
+
+
+
+
+ return y;
+ }
+
+
+
+ template<class inVector, class outVector>
+ outVector& apply(outVector &y, const inVector& x ) const
+ {
+ return apply(y,x,field().zero);
+ }
+
+ template<class inVector, class outVector>
+ outVector& applyTranspose(outVector &y, const inVector& x ) const
+ {
+ return applyTranspose(y,x,field().zero);
+ }
+
+ const Field & field() const
+ {
+ return _field ;
+ }
+
+ //! @todo
+ bool consistent() const
+ {
+ return true ;
+ }
+
+ private :
+
+ class Helper {
+ bool _useable ;
+ bool _optimized ;
+ bool blackbox_usage ;
+ Self_t *_AT ;
+ public:
+
+ Helper() :
+ _useable(false)
+ ,_optimized(false)
+ , blackbox_usage(true)
+ , _AT(NULL)
+ {}
+
+ ~Helper()
+ {
+ if ( _AT ) {
+ delete _AT ;
+ }
+ }
+
+ bool optimized(const Self_t & A)
+ {
+ if (!_useable) {
+ getHelp(A);
+ _useable = true;
+ }
+ return _optimized;
+ }
+
+ void getHelp(const Self_t & A)
+ {
+ if ( A.size() > LINBOX_COO_TRANSPOSE ) { // and/or A.rowDensity(), A.coldim(),...
+ // std::cout << "optimizing..." ;
+ _optimized = true ;
+ _AT = new Self_t(A.field(),A.coldim(),A.rowdim());
+ A.transpose(*_AT);
+ // std::cout << "done!" << std::endl;
+ }
+ }
+
+ const Self_t & matrix() const
+ {
+ return *_AT ;
+ }
+
+ };
+
+ public:
+ // pseudo iterators
+ size_t getRowid(const size_t & i) const
+ {
+ return _rowid[i];
+ }
+
+ void setTriple(const size_t &loc, const size_t & i, const size_t & j, const Element & e)
+ {
+ linbox_check(loc <= _nbnz);
+ linbox_check( _rowid.size() == _nbnz);
+ linbox_check( _colid.size() == _nbnz);
+ linbox_check( _data.size() == _nbnz);
+ if (loc==_nbnz) {
+#if 0 /* reserve is slow */
+ if (loc % 10 == 0) {
+ _rowid.reserve(loc+10);
+ _colid.reserve(loc+10);
+ _data.reserve(loc+10);
+ }
+#endif
+ _rowid.push_back(i);
+ _colid.push_back(j);
+ _data.push_back(e);
+ ++_nbnz;
+ return;
+ }
+ _rowid[loc]=i;
+ _colid[loc]=j;
+ _data[loc]=e;
+
+ }
+
+ void setRowid(const std::vector<size_t> & new_rowid)
+ {
+ _rowid = new_rowid ;
+ }
+
+ std::vector<size_t> getRowid( ) const
+ {
+ return _rowid ;
+ }
+
+ size_t getColid(const size_t & i) const
+ {
+ return _colid[i];
+ }
+
+
+ void setColid(std::vector<size_t> new_colid)
+ {
+ _colid = new_colid ;
+ }
+
+ std::vector<size_t> getColid( ) const
+ {
+ return _colid ;
+ }
+
+ const Element & getData(const size_t & i) const
+ {
+ return _data[i];
+ }
+
+
+ void setData(const std::vector<Element> & new_data)
+ {
+ _data = new_data ;
+ }
+
+ std::vector<Element> getData( ) const
+ {
+ return _data ;
+ }
+
+ void firstTriple() const
+ {
+ _triples.reset();
+ }
+
+ bool nextTriple(size_t & i, size_t &j, Element &e) const
+ {
+ ptrdiff_t idx = _triples.next();
+ if (idx >= (ptrdiff_t)_nbnz) {
+ _triples.reset() ;
+ return false;
+ }
+
+ i = _rowid[(size_t)idx];
+ j = _colid[(size_t)idx];
+ e = _data[(size_t)idx];
+
+ return true;
+ }
+
+ template<class element_iterator, class Element>
+ class _Iterator {
+ private :
+ element_iterator _data_it ;
+ const element_iterator _data_beg ;
+ const element_iterator _data_end ;
+ public:
+ typedef Element value_type ;
+ _Iterator(element_iterator e_beg, element_iterator e_end) :
+ _data_it(e_beg)
+ , _data_beg(e_beg)
+ , _data_end(e_end)
+ {}
+
+ _Iterator (const _Iterator &iter) :
+ _data_it(iter._data_it)
+ , _data_beg(iter._data_beg)
+ , _data_end(iter._data_end)
+ {}
+
+ _Iterator &operator = (const _Iterator &iter)
+ {
+ _data_it = iter._data_it ;
+ _data_beg = iter._data_beg ;
+ _data_end = iter._data_end ;
+
+ return *this;
+ }
+
+ bool operator == (const _Iterator &i) const
+ {
+ return (_data_it == i._data_it) && (_data_beg == i._data_beg) && (_data_end == i._data_end);
+ }
+
+ bool operator != (const _Iterator &i) const
+ {
+ return (_data_it != i._data_it) || (_data_beg != i._data_beg) || (_data_end != i._data_end);
+ }
+
+ _Iterator &operator ++ ()
+ {
+ ++_data_it ;
+
+ if (_data_it == _data_end)
+ return *this ;
+ }
+
+ _Iterator operator ++ (int)
+ {
+ _Iterator tmp = *this;
+ ++(*this);
+ return tmp;
+ }
+
+ _Iterator &operator -- ()
+ {
+ --_data_it ;
+
+ if (_data_it == _data_beg)
+ return *this ;
+ }
+
+ _Iterator operator -- (int)
+ {
+ _Iterator tmp = *this;
+ --(*this);
+ return tmp;
+ }
+
+ value_type &operator * ()
+ {
+ return *_data_it;
+ }
+
+ value_type *operator -> ()
+ {
+ return _data_it ;
+ }
+
+ const value_type &operator*() const
+ {
+ return *_data_it;
+ }
+
+ const value_type *operator -> () const
+ {
+ return _data_it ;
+ }
+
+ const value_type &value() const
+ {
+ return *_data_it;
+ }
+
+ };
+
+ template<class index_iterator, class element_iterator, class Element>
+ class _IndexedIterator {
+ private :
+ typedef index_iterator index_it ;
+ typedef element_iterator data_it ;
+ index_it _rowid_it ;
+ index_it _colid_it ;
+ data_it _data_it ;
+ const data_it _data_beg ;
+ const data_it _data_end ;
+ public:
+ typedef Element value_type ;
+ _IndexedIterator( const index_it &i
+ , const index_it &j
+ , const data_it &e
+ , const data_it &e_e) :
+ _rowid_it(i)
+ , _colid_it(j)
+ , _data_it(e)
+ , _data_beg(e)
+ , _data_end(e_e)
+ {}
+
+ _IndexedIterator (const _IndexedIterator &iter) :
+ _rowid_it(iter._rowid_it)
+ , _colid_it(iter._colid_it)
+ , _data_it(iter._data_it)
+ , _data_beg(iter._data_beg)
+ , _data_end(iter._data_end)
+ {}
+
+ _IndexedIterator &operator = (const _IndexedIterator &iter)
+ {
+ _rowid_it = iter._rowid_it ;
+ _colid_it = iter._colid_it ;
+ _data_it = iter._data_it ;
+ _data_beg = iter._data_beg ;
+ _data_end = iter._data_end ;
+
+ return *this;
+ }
+
+ bool operator == (const _IndexedIterator &i) const
+ {
+ // we assume consistency
+ return (_data_it == i._data_it);
+ }
+
+ bool operator != (const _IndexedIterator &i) const
+ {
+ // we assume consistency
+ return (_data_it != i._data_it) ;
+ }
+
+ _IndexedIterator &operator ++ ()
+ {
+
+ ++_data_it ;
+ if (_data_it == _data_end) {
+ return *this ;
+ }
+ ++_colid_it ;
+ ++_rowid_it ;
+
+ return *this;
+ }
+
+ _IndexedIterator operator ++ (int)
+ {
+ _IndexedIterator tmp = *this;
+ ++(*this);
+ return tmp;
+ }
+
+ _IndexedIterator &operator -- ()
+ {
+ throw NotImplementedYet("not sure");
+ --_data_it ;
+ if (_data_it == _data_beg) {
+ return *this ;
+ }
+ --_colid_it ;
+ --_rowid_it ;
+
+ return *this;
+ }
+
+ _IndexedIterator operator -- (int)
+ {
+ _IndexedIterator tmp = *this;
+ --(*this);
+ return tmp;
+ }
+
+ value_type &operator * ()
+ {
+ return *_data_it;
+ }
+
+ value_type *operator -> ()
+ {
+ return _data_it ;
+ }
+
+ const value_type &operator*() const
+ {
+ return *_data_it;
+ }
+
+ const value_type *operator -> () const
+ {
+ return _data_it ;
+ }
+
+ size_t rowIndex () const
+ {
+ return *_rowid_it;
+ }
+
+ size_t colIndex () const
+ {
+ return *_colid_it;
+ }
+
+ const value_type &value() const
+ {
+ return *_data_it;
+ }
+
+
+ };
+
+ typedef _Iterator<typename std::vector<Element>::iterator, Element> Iterator;
+ typedef _Iterator<typename std::vector<Element>::const_iterator, constElement> ConstIterator;
+
+ typedef _IndexedIterator<std::vector<size_t>::iterator, typename std::vector<Element>::iterator, Element> IndexedIterator;
+ typedef _IndexedIterator<std::vector<size_t>::const_iterator, typename std::vector<Element>::const_iterator, constElement> ConstIndexedIterator;
+
+
+ Iterator Begin ()
+ {
+ return Iterator(_data.begin(),_data.end()) ;
+ }
+
+ Iterator End ()
+ {
+ return Iterator(_data.end(), _data.end()) ;
+ }
+
+ ConstIterator Begin () const
+ {
+ return ConstIterator(_data.begin(),_data.end()) ;
+ }
+
+ ConstIterator End () const
+ {
+ return ConstIterator(_data.end(), _data.end()) ;
+ }
+
+ IndexedIterator IndexedBegin ()
+ {
+ return IndexedIterator(_rowid.begin(), _colid.begin(), _data.begin(),_data.end()) ;
+ }
+
+ IndexedIterator IndexedEnd ()
+ {
+ return IndexedIterator(_rowid.end(), _colid.end(), _data.end(),_data.end()) ;
+ }
+
+ ConstIndexedIterator IndexedBegin () const
+ {
+ return ConstIndexedIterator(_rowid.begin(), _colid.begin(), _data.begin(),_data.end()) ;
+ }
+
+ ConstIndexedIterator IndexedEnd () const
+ {
+ return ConstIndexedIterator(_rowid.end(), _colid.end(), _data.end(),_data.end()) ;
+ }
+
+
+ protected :
+ friend class SparseMatrixWriteHelper<Self_t >;
+ friend class SparseMatrixReadHelper<Self_t >;
+
+
+ size_t _rownb ;
+ size_t _colnb ;
+ size_t _nbnz ;
+
+ std::vector<size_t> _rowid ;
+ std::vector<size_t> _colid ;
+ std::vector<Element> _data ;
+
+ const _Field & _field;
+
+ mutable Helper _helper ;
+
+ mutable struct _triples {
+ ptrdiff_t _nnz ;
+ _triples() :
+ _nnz(-1)
+ {}
+
+ ptrdiff_t next()
+ {
+ return _nnz +=1 ;
+ }
+
+ void reset()
+ {
+ _nnz = -1 ;
+ }
+ }_triples;
+ };
+
+
+
+
+
+} // namespace LinBox
+
+#endif // __LINBOX_matrix_sparsematrix_sparse_coo_matrix_H
+
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/matrix/sparsematrix/sparse-csr-matrix.h b/linbox/matrix/sparsematrix/sparse-csr-matrix.h
new file mode 100644
index 0000000..f60d125
--- /dev/null
+++ b/linbox/matrix/sparsematrix/sparse-csr-matrix.h
@@ -0,0 +1,1615 @@
+/* linbox/matrix/sparse-csr-matrix.h
+ * Copyright (C) 2013 the LinBox
+ *
+ * Written by :
+ * Brice Boyer (briceboyer) <boyer.brice at gmail.com>
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ * ========LICENCE========
+ */
+
+/*! @file matrix/sparsematrix/sparse-csr-matrix.h
+ * @ingroup sparsematrix
+ * @brief
+ */
+
+
+#ifndef __LINBOX_sparse_matrix_sparse_csr_matrix_H
+#define __LINBOX_sparse_matrix_sparse_csr_matrix_H
+
+#include <utility>
+#include <iostream>
+#include <algorithm>
+
+#include "linbox/linbox-config.h"
+#include "linbox/util/debug.h"
+#include "linbox/field/hom.h"
+#include "sparse-domain.h"
+#include "givaro/zring.h"
+
+#ifndef LINBOX_CSR_TRANSPOSE
+#define LINBOX_CSR_TRANSPOSE 1000
+#endif
+
+namespace LinBox {
+#if 0
+ template<class _Field>
+ struct AutoField {
+ typedef _Field Base ;
+ };
+
+ template<>
+ struct AutoField<Givaro::ZRing<Integer> > {
+ typedef Givaro::ModularBalanced<double> Base ;
+
+ };
+
+ template<Field>
+ struct AutoField<Givaro::Extension<Field>> {
+ // typedef AutoField<Field>::Base Base ;
+ typedef Field Base ;
+ };
+
+ template<>
+ struct AutoField<Givaro::Modular<float> > {
+ typedef Unparametric<float> Base ;
+ };
+
+ template<>
+ struct AutoField<Givaro::ModularBalanced<float> > {
+ typedef Unparametric<float> Base ;
+ };
+
+ template<>
+ struct AutoField<Givaro::Modular<double> > {
+ // sometimes, could be Unparametric<float>...
+ typedef Unparametric<double> Base ;
+ };
+
+ template<>
+ struct AutoField<Givaro::ModularBalanced<double> > {
+ typedef Unparametric<double> Base ;
+ };
+
+
+
+ template<>
+ struct AutoField<Givaro::Modular<float> > {
+ typedef Unparametric<float> Base ;
+ };
+#endif
+
+}
+
+namespace LinBox {
+
+
+ /** Sparse matrix, Coordinate storage.
+ *
+ * \ingroup matrix
+ * \ingroup sparse
+ */
+ template<class _Field>
+ class SparseMatrix<_Field, SparseMatrixFormat::CSR > {
+ private :
+ typedef std::vector<index_t> svector_t ;
+ public :
+ typedef _Field Field ; //!< Field
+ typedef typename _Field::Element Element ; //!< Element
+ typedef const Element constElement ; //!< const Element
+ typedef SparseMatrixFormat::CSR Storage ; //!< Matrix Storage Format
+ typedef SparseMatrix<_Field,Storage> Self_t ; //!< Self type
+ typedef typename Vector<Field>::SparseSeq Row ; //!< @warning this is not the row type. Just used for streams.
+ // typedef Vector<_Field,VectorStorage::Sparse> Rep ;
+
+ /*! Constructors.
+ * @todo convert from other matrix.
+ *
+ */
+ //@{
+#if 0 /* No empty CSTOR */
+ SparseMatrix<_Field, SparseMatrixFormat::CSR> () :
+ _rownb(0),_colnb(0)
+ ,_nbnz(0)
+ ,_start(1,0),_colid(0),_data(0)
+ , _field()
+ , _helper()
+ {
+ _start[0] = 0 ;
+ }
+#endif
+
+ SparseMatrix<_Field, SparseMatrixFormat::CSR> (const _Field & F) :
+ _rownb(0),_colnb(0)
+ ,_nbnz(0)
+ ,_start(1,0)
+ ,_colid(0)
+ ,_data(0)
+ , _field(F)
+ , _helper()
+ {
+ _start[0] = 0 ;
+ }
+
+ SparseMatrix<_Field, SparseMatrixFormat::CSR> (const _Field & F, size_t m, size_t n) :
+ _rownb(m),_colnb(n)
+ ,_nbnz(0)
+ ,_start(m+1,0)
+ ,_colid(0)
+ ,_data(0)
+ , _field(F)
+ , _helper()
+ {
+ _start[0] = 0 ;
+ }
+
+ SparseMatrix<_Field, SparseMatrixFormat::CSR> (const _Field & F,
+ size_t m, size_t n,
+ size_t z) :
+ _rownb(m),_colnb(n)
+ , _nbnz(z)
+ ,_start(m+1,0)
+ , _colid(z)
+ ,_data(z)
+ , _field(F)
+ , _helper()
+ {
+ _start[0] = 0 ;
+ }
+
+ SparseMatrix<_Field, SparseMatrixFormat::CSR> (const SparseMatrix<_Field, SparseMatrixFormat::CSR> & S) :
+ _rownb(S._rownb),_colnb(S._colnb)
+ ,_nbnz(S._nbnz)
+ ,_start(S._start)
+ , _colid(S._colid)
+ ,_data(S._data)
+ , _field(S._field)
+ , _helper()
+ {
+ }
+
+#if 0
+ template<class _OtherField>
+ SparseMatrix<_Field, SparseMatrixFormat::COO> (const SparseMatrix<_OtherField, SparseMatrixFormat::COO> & S) :
+ _rownb(S._rownb),_colnb(S._colnb),
+ _nbnz(S._nbnz),
+ _rowid(S._rowid),_colid(S._colid),_data(S._data),
+ _field(S._field)
+ {}
+#endif
+
+ template<typename _Tp1, typename _Rw1 = SparseMatrixFormat::CSR>
+ struct rebind {
+ typedef SparseMatrix<_Tp1, _Rw1> other;
+ private:
+
+ template<class _Rw>
+ void rebindMethod(SparseMatrix<_Tp1, _Rw> & Ap, const Self_t & A /*, IndexedCategory::HasNext */)
+ {
+ typename _Tp1::Element e;
+ Hom<typename Self_t::Field, _Tp1> hom(A.field(), Ap.field());
+
+ size_t i, j ;
+ Element f ;
+ A.firstTriple();
+ while ( A.nextTriple(i,j,f) ) {
+ linbox_check(i < A.rowdim() && j < A.coldim()) ;
+ hom. image ( e, f) ;
+ if (! Ap.field().isZero(e) )
+ Ap.appendEntry(i,j,e);
+ }
+ A.firstTriple();
+ Ap.finalize();
+ }
+
+ void rebindMethod(SparseMatrix<_Tp1, SparseMatrixFormat::CSR> & Ap, const Self_t & A /*, IndexedCategory::HasNext*/)
+ {
+ // we don't use nextTriple because we can do better.
+
+ typename _Tp1::Element e;
+
+ Hom<typename Self_t::Field, _Tp1> hom(A.field(), Ap.field());
+ size_t j = 0 ;
+ Ap.setStart(A.getStart());
+ svector_t offset(A.rowdim()+1,0);
+ bool changed = false ;
+ for (size_t i = 0 ; i < A.rowdim() ; ++i) {
+ for (size_t k = A.getStart(i) ; k < A.getEnd(i) ; ++k) {
+ hom. image ( e, A.getData(k) );
+ if (!Ap.field().isZero(e)) {
+ Ap.setColid(j,A.getColid(k));
+ Ap.setData(j,e);
+ ++j;
+ }
+ else
+ {
+ offset[i+1] += 1 ;
+ changed = true ;
+ }
+ }
+ }
+ if (changed) {
+ for (size_t i = 0 ; i < A.rowdim() ; ++i) {
+ offset[i+1] += offset[i] ;
+ }
+ for (size_t i = 1 ; i <= A.rowdim() ; ++i) {
+ Ap.setStart(i,A.getStart(i)-offset[i]);
+ }
+ }
+
+
+ if (j != Ap.size())
+ Ap.resize(j);
+
+ }
+
+ public:
+
+ void operator() (other & Ap, const Self_t& A)
+ {
+ rebindMethod(Ap, A );
+
+ }
+
+ };
+
+ template<typename _Tp1, typename _Rw1>
+ SparseMatrix (const SparseMatrix<_Tp1, _Rw1> &S, const Field& F) :
+ _rownb(S.rowdim()),_colnb(S.coldim())
+ ,_nbnz(S.size())
+ , _start(S.rowdim()+1,0)
+ , _colid(S.size())
+ ,_data(S.size())
+ , _field(F)
+ {
+ typename SparseMatrix<_Tp1,_Rw1>::template rebind<Field,Storage>()(*this, S);
+ finalize();
+ }
+
+
+#if 0
+ void merge(const SparseMatrix<_Field, SparseMatrixFormat::CSR> & S)
+ {
+ for (size_t i_ex = 0 ; i_ex < S.rowdim() ; ++i_ex)
+ for (size_t k = S.getStart(i_ex) ; k < S.getEnd(i_ex) ; ++k) {
+ // can be faster by iterating over both matrices
+ setEntry(i_ex,S.getColid(k),S.getData(k));
+ }
+ }
+#endif
+
+
+ template<class VectStream>
+ SparseMatrix<_Field, SparseMatrixFormat::CSR> (const _Field & F, VectStream & stream) :
+ _rownb(stream.size()),_colnb(stream.dim())
+ , _nbnz(0)
+ , _start(_rownb+1,0)
+ , _colid(0)
+ ,_data(0)
+ , _field(F)
+ {
+ {
+ _start[0] = 0 ;
+ }
+ for (size_t i = 0 ; i< _rownb ; ++i) {
+ typename Vector<Field>::SparseSeq lig_i ;
+ stream >> lig_i ;
+ _start[i+1] = (index_t) lig_i.size();
+ for (size_t j = 0 ; j < lig_i.size() ; ++j) {
+ size_t nbnz = _nbnz++ ;
+ resize(_nbnz);
+ _colid[nbnz] = (index_t)lig_i[j].first ;
+ F.init(_data[nbnz], lig_i[j].second) ; //!@bug may be 0...
+ }
+ }
+ for (size_t i = 0 ; i < rowdim() ; ++i)
+ _start[i+1] += _start[i];
+ linbox_check(_start[rowdim()] == _nbnz );
+
+ finalize();
+ }
+
+ SparseMatrix<_Field, SparseMatrixFormat::CSR> ( MatrixStream<Field>& ms ):
+ _rownb(0),_colnb(0)
+ ,_nbnz(0)
+ ,_start(1,0)
+ ,_colid(0)
+ ,_data(0)
+ ,_field(ms.field())
+ {
+ firstTriple();
+
+ Element val;
+ size_t i, j;
+ while( ms.nextTriple(i,j,val) ) {
+ if (! field().isZero(val)) {
+ if( i >= _rownb ) {
+ // _rownb = i + 1;
+ resize(i+1,_colnb,_nbnz);
+ }
+ if( j >= _colnb ) {
+ // _colnb = j + 1;
+ resize(_rownb,j+1,_nbnz);
+ }
+ appendEntry(i,j,val);
+ }
+ }
+ if( ms.getError() > END_OF_MATRIX )
+ throw ms.reportError(__func__,__LINE__);
+ if( !ms.getDimensions( i, j ) )
+ throw ms.reportError(__func__,__LINE__);
+#ifndef NDEBUG
+ if( i != _rownb || j != _colnb) {
+ std::cout << " ***Warning*** the sizes got changed" << __func__ << ',' << __LINE__ << std::endl;
+ }
+#endif
+
+ firstTriple();
+ finalize();
+ }
+
+ void resize(size_t nn)
+ {
+#ifndef NDEBUG
+ if (nn < _nbnz) {
+ std::cerr << "*** Warning *** you are possibly loosing data (CSR resize)" << std::endl;
+ // could be a commentator()...
+ }
+#endif
+ _colid.resize(nn);
+ _data.resize(nn);
+ _nbnz = nn ;
+ }
+
+ void resize(const size_t & mm, const size_t & nn, const size_t & zz = 0)
+ {
+ _rownb = mm ;
+ _colnb = nn ;
+
+ _start.resize(mm+1);
+ resize(zz);
+ }
+
+ /*! Default converter.
+ * @param S a sparse matrix in any storage.
+ */
+ template<class _OtherStorage>
+ SparseMatrix<_Field, SparseMatrixFormat::CSR> (const SparseMatrix<_Field, _OtherStorage> & S) :
+ _rownb(S.rowdim()),_colnb(S.coldim()),
+ _start(S.rowdim()+1,0),_colid(S.size()),_data(S.size()),
+ _field(S.field())
+ {
+ this->importe(S); // convert Temp from anything
+ finalize();
+ }
+
+
+
+ //@}
+ /*! Conversions.
+ * Any sparse matrix has a converter to/from CSR.
+ * A specialisation can skip the temporary CSR matrix created.
+ */
+ //@{
+ /*! Import a matrix in COO format to CSR.
+ * @param S COO matrix to be converted in CSR
+ */
+ void importe(const SparseMatrix<_Field,SparseMatrixFormat::COO> &S)
+ {
+ resize(S.rowdim(), S.coldim(), S.size());
+
+ setData(S.getData());
+ setColdim(S.setColdim());
+
+ _start[0] = 0 ;
+ for (size_t i = 0 ; i < _nbnz ; ++i)
+ _start[S.rowid(i)+1] += 1 ;
+
+ finalize();
+
+ }
+
+ /*! Import a matrix in CSR format to CSR.
+ * @param S CSR matrix to be converted in CSR
+ */
+
+ void importe(const SparseMatrix<_Field,SparseMatrixFormat::CSR> &S)
+ {
+ resize( S.rowdim(), S.coldim(), S.size() );
+
+ setStart(S.getStart());
+ setColid(S.getColid());
+ setData(S.getData());
+ finalize();
+ }
+
+ /*! Export a matrix in CSR format from COO.
+ * @param S CSR matrix to be converted from COO
+ */
+ SparseMatrix<_Field,SparseMatrixFormat::CSR > &
+ exporte(SparseMatrix<_Field,SparseMatrixFormat::CSR> &S)
+ {
+ linbox_check(consistent());
+
+ S.resize(_rownb, _colnb, _nbnz);
+ S.setStart( _start );
+ S.setColid (_colid );
+ S.setData( _data ) ;
+ S.finalize();
+
+ return S ;
+ }
+
+ SparseMatrix<_Field,SparseMatrixFormat::COO > &
+ exporte(SparseMatrix<_Field,SparseMatrixFormat::COO> &S)
+ {
+ S.resize(_rownb, _colnb, _nbnz);
+ S.setData( _data ) ;
+ S.setColid( _colid ) ;
+ for(size_t i = 0 ; i < rowdim() ; ++i)
+ for (index_t j = _start[i] ; j < _start[i+1] ; ++j)
+ S.setRowid(j,i);
+ S.finalize();
+
+ return S ;
+ }
+
+
+ //@}
+
+ /*! In place transpose. Not quite...
+ */
+ void transposeIn()
+ {
+ Self_t Temp(*this);
+ Temp.transpose(*this);
+ }
+
+ /*! Transpose the matrix.
+ * @param S [out] transpose of self.
+ * @return a reference to \p S.
+ */
+ Self_t &
+ transpose(Self_t &S) const
+ {
+
+ // outStart
+ for (size_t i = 0 ; i <= coldim() ; ++i)
+ S._start[i] = 0 ;
+
+ for (size_t i = 0 ; i < size() ; ++i)
+ S._start[_colid[i]+1] += 1 ;
+
+ S.resize((size_t)_colnb, (size_t)_rownb, (size_t)_nbnz ); // necessary copy to temp, no const ref
+
+ for (size_t i = 0 ; i < coldim() ; ++i)
+ S._start[i+1] += S._start[i] ;
+
+ {
+ size_t i = 0 ;
+ svector_t done_col(S.rowdim(),0);
+ for (size_t nextlig = 1 ; nextlig <= rowdim() ; ++nextlig) {
+ // treating line before nextlig
+ while (i < _start[nextlig]){
+ size_t cur_place ;
+ cur_place = S._start[_colid[i]] + done_col[_colid[i]] ;
+ linbox_check(cur_place < size());
+ S._data [ cur_place ] = _data[i] ;
+ S._colid[ cur_place ] = (index_t) nextlig-1 ;
+ done_col[_colid[i]] += 1 ;
+ ++i;
+ }
+ }
+ }
+
+ S.finalize();
+
+ return S;
+
+
+ }
+
+ /*! number of rows.
+ * @return row dimension.
+ */
+ size_t rowdim() const
+ {
+ return _rownb ;
+ }
+
+ /*! number of columns.
+ * @return column dimension
+ */
+ size_t coldim() const
+ {
+ return _colnb ;
+ }
+
+ /*! Number of non zero elements in the matrix.
+ * or at least the size of the _data if
+ * @return size of the _data.
+ */
+ size_t size() const
+ {
+ // return _data.size();
+ return _nbnz ;
+ }
+
+ void setSize(const size_t & z)
+ {
+ _nbnz = z ;
+ }
+
+
+ /** Get a read-only individual entry from the matrix.
+ * @param i Row _colid
+ * @param j Column _colid
+ * @return Const reference to matrix entry
+ */
+ constElement &getEntry(const size_t &i, const size_t &j) const
+ {
+ linbox_check(i<_rownb);
+ linbox_check(j<_colnb);
+
+ ptrdiff_t nnz = _triples.next(_start);
+ if ( nnz < (ptrdiff_t)_nbnz && _colid[nnz] == j && (ptrdiff_t)i == _triples._row ) { /* sort of nextTriple */
+ linbox_check(!field().isZero(_data[nnz]));
+ return _data[nnz];
+ }
+ else { /* searching */
+ typedef typename svector_t::const_iterator myConstIterator ;
+ index_t ibeg = _start[i] ;
+ index_t iend = _start[i+1] ;
+
+ if (ibeg == iend) {
+ return field().zero;
+ }
+ // element may exist
+ myConstIterator beg = _colid.begin() + (ptrdiff_t)ibeg ;
+ myConstIterator end = _colid.begin() + (ptrdiff_t)iend ;
+ myConstIterator low = std::lower_bound (beg, end, j);
+ ibeg = (size_t)(low-_colid.begin());
+ // insert
+ if ( low == end || j != _colid[ibeg] ) {
+ return field().zero;
+ }
+ // replace
+ else {
+ _triples._nnz = ibeg ;// just in case it can be used, after all that work...
+ _triples._row = i ;
+ return _data[ibeg] ;
+ }
+ }
+
+ }
+
+ Element &getEntry (Element &x, size_t i, size_t j) const
+ {
+ return x = getEntry (i, j);
+ }
+
+ void appendEntry(const size_t &i, const index_t &j, const Element& e)
+ {
+ linbox_check(i < rowdim());
+ linbox_check(j < coldim());
+
+ if (field().isZero(e)) { /* probably already tested */
+ return ;
+ }
+
+ if ( rowdim() +1 != _start.size()) {
+ if (rowdim() % 100 == 0)
+ _start.reserve(rowdim()+100);
+ _start.resize(rowdim()+1,0);
+ }
+
+ _start[i+1] += 1 ;
+#if 0 /* reserve is slow */
+ if (_nbnz % 100 == 0 ) {
+ _colid.reserve(_nbnz + 100);
+ _data.reserve(_nbnz + 100);
+ }
+#endif
+ _colid.push_back(j);
+ _data .push_back(e);
+ ++_nbnz ;
+ return;
+
+ }
+
+ /// make matrix ready to use after a sequence of setEntry calls.
+ void finalize()
+ {
+ if (_start[rowdim()] != _nbnz) { /* if it is so, then all before are 0 and we are fine... */
+ for (size_t i = 2 ; i <= rowdim() ; ++i)
+ _start[i] += _start[i-1];
+ linbox_check(_start[rowdim()] == _nbnz);
+ }
+ _triples.reset();
+
+ } // end construction after a sequence of setEntry calls.
+
+ /** Set an individual entry.
+ * Setting the entry to 0 will not remove it from the matrix
+ * @param i Row _colid of entry
+ * @param j Column _colid of entry
+ * @param value Value of the new entry
+ * @todo make it faster if i is 0 or m-1 ?
+ * @warning if this is used to build a matrix and this matrix is "well formed",
+ * it can be sped up (no checking that the entry already exists).
+ */
+ void setEntry(const size_t &i, const size_t &j, const Element& e
+ )
+ {
+ linbox_check(i<_rownb);
+ linbox_check(j<_colnb);
+ linbox_check(_start.size() == _rownb+1);
+ linbox_check(_start[0] == 0);
+
+ if (field().isZero(e)) {
+ return clearEntry(i,j);
+ }
+
+ // nothing has been done yet
+ typedef typename svector_t::iterator myIterator ;
+ index_t ibeg = _start[i];
+ index_t iend = _start[i+1];
+ // element does not exist, insert
+ if (ibeg == iend) {
+ // std::cout << "# insert " << i << ',' << j << ':' << e << std::endl;
+ for (size_t k = i+1 ; k <= _rownb ; ++k)
+ _start[k] += 1 ;
+ _colid.insert(_colid.begin()+ibeg,j);
+ _data.insert( _data.begin() +ibeg,e);
+ ++_nbnz;
+ return ;
+ }
+ // element may exist
+ myIterator beg = _colid.begin() + (ptrdiff_t)ibeg ;
+ myIterator end = _colid.begin() + (ptrdiff_t)iend ;
+ myIterator low = std::lower_bound (beg, end, j);
+ ibeg = (index_t)(low-_colid.begin());
+ // insert
+ if ( low == end || j != _colid[ibeg] ) {
+ // std::cout << "# 2 insert " << i << ',' << j << ':' << e << std::endl;
+ for (size_t k = i+1 ; k <= _rownb ; ++k)
+ _start[k] += 1 ;
+ _colid.insert(_colid.begin() + (ptrdiff_t)ibeg,j);
+ _data.insert (_data. begin() + (ptrdiff_t)ibeg,e);
+ ++_nbnz;
+ return ;
+ }
+ // replace
+ else {
+ // std::cout << "# replace " << i << ',' << j << ':' << e << std::endl;
+ _data[ibeg] = e ;
+ return ;
+ }
+ }
+
+#if 0
+ /** Get a writeable reference to an entry in the matrix.
+ * If there is no entry at the position (i, j), then a new entry
+ * with a value of zero is inserted and a reference to it is
+ * returned.
+ * @param i Row _colid of entry
+ * @param j Column _colid of entry
+ * @return Reference to matrix entry
+ */
+ Element &refEntry(const size_t &i, const size_t&j)
+ {
+ linbox_check(i<_rownb);
+ linbox_check(j<_colnb);
+ // Could be improved by adding an initial guess j/rowdim*size()
+ typedef typename svector_t::iterator myIterator ;
+
+ size_t ibeg = _start[i];
+ size_t iend = _start[i+1];
+ if (ibeg==iend) {
+ for (size_t k = i+1 ; k <= _rownb ; ++k) _start[k] +=1 ;
+ _colid.insert(_colid.begin()+ibeg,j);
+ _data.insert( _data.begin() +ibeg,field().zero);
+ return _data[ibeg];
+ }
+ myIterator beg = _colid.begin() ;
+ myIterator low = std::lower_bound (beg+(ptrdiff_t)ibeg, beg+(ptrdiff_t)iend, j);
+ if (low == beg+(ptrdiff_t)iend) {
+ for (size_t k = i+1 ; k <= _rownb ; ++k) _start[k] +=1 ;
+ _colid.insert(_colid.begin()+ibeg,j);
+ _data.insert( _data.begin() +ibeg,field().zero);
+ return _data[ibeg];
+ }
+ else {
+ size_t la = low-_colid.begin() ;
+ return _data[la] ;
+ }
+ }
+#endif
+
+ /** Write a matrix to the given output stream using field read/write.
+ * @param os Output stream to which to write the matrix
+ * @param format Format with which to write
+ */
+ std::ostream & write(std::ostream &os
+ , LINBOX_enum(Tag::FileFormat) format = Tag::FileFormat::MatrixMarket) const
+ {
+ return SparseMatrixWriteHelper<Self_t>::write(*this,os,format);
+ }
+
+
+ /** Read a matrix from the given input stream using field read/write
+ * @param is Input stream from which to read the matrix
+ * @param format Format of input matrix
+ * @return ref to \p is.
+ */
+ std::istream& read (std::istream &is
+ , LINBOX_enum(Tag::FileFormat) format = Tag::FileFormat::Detect)
+ {
+ return SparseMatrixReadHelper<Self_t>::read(*this,is,format);
+ }
+
+ /*! @internal
+ * @brief Deletes the entry.
+ * Deletes \c A(i,j) if it exists.
+ * @param i row _colid
+ * @param j col _colid
+ */
+ void clearEntry(const size_t &i, const size_t &j)
+ {
+ linbox_check(i<_rownb);
+ linbox_check(j<_colnb);
+ typedef typename svector_t::iterator myIterator ;
+
+ index_t ibeg = _start[i];
+ index_t iend = _start[i+1];
+ if (ibeg == iend)
+ return ;
+
+ myIterator beg = _colid.begin() +(ptrdiff_t)ibeg;
+ myIterator end = _colid.begin() +(ptrdiff_t)iend;
+ myIterator low = std::lower_bound (beg, end, j);
+ if (low == end)
+ return ;
+ else {
+ // not sure
+ size_t la = (size_t)(low-_colid.begin()) ;
+ for (size_t k = i+1 ; k <= _rownb ; ++k)
+ _start[k] -= 1 ;
+ _colid.erase(_colid.begin()+(ptrdiff_t)la);
+ _data. erase(_data. begin()+(ptrdiff_t)la);
+ --_nbnz;
+ return ;
+ }
+ }
+
+ /*! @internal
+ * @brief cleans 0 entries.
+ */
+ void clean()
+ {
+ size_t i = 0 ;
+ while ( i < _data.size() ) {
+ if ( field().isZero(_data[i]) ) {
+ for (size_t k = i+1 ; k <= _rownb ; ++k)
+ _start[k] -= 1 ;
+ _colid.erase(_colid.begin()+i);
+ _data. erase(_data. begin()+i);
+ }
+ else
+ ++i ;
+ }
+ return ;
+ }
+
+ // y= Ax
+ // y[i] = sum(A(i,j) x(j)
+ // start(i)<k < start(i+1) : _delta[k] = A(i,colid(k))
+ template<class inVector, class outVector>
+ outVector& apply(outVector &y, const inVector& x, const Element & a ) const
+ {
+ // linbox_check(consistent());
+ prepare(field(),y,a);
+
+
+ // std::cout << "apply" << std::endl;
+ FieldAXPY<Field> accu(field());
+ for (size_t i = 0 ; i < _rownb ; ++i) {
+ accu.reset();
+ for (index_t k = _start[i] ; k < _start[i+1] ; ++k)
+ // field().axpyin( y[i], _data[k], x[_colid[k]] ); //! @todo delay !!!
+ accu.mulacc(_data[k],x[_colid[k]]);
+ accu.get(y[i]);
+ }
+
+ return y;
+ }
+
+
+ // y= A^t x
+ // y[i] = sum(A(j,i) x(j)
+ template<class inVector, class outVector>
+ outVector& applyTranspose(outVector &y, const inVector& x, const Element & a) const
+ {
+ linbox_check(consistent());
+ if (_helper.optimized(*this)) {
+ return _helper.matrix().apply(y,x,a) ; // NEVER use applyTranspose on that thing.
+ }
+
+ prepare(field(),y,a);
+
+ const FieldAXPY<Field> accu0(field());
+ std::vector<FieldAXPY<Field> > Y(_colnb, accu0);
+
+ for (size_t i = 0 ; i < _rownb ; ++i)
+ for (index_t k = _start[i] ; k < _start[i+1] ; ++k) {
+ Y[_colid[k]].mulacc(_data[k], x[i] );
+ }
+
+ for (size_t i = 0 ; i < _colnb ; ++i)
+ Y[i].get(y[i]) ;
+
+ return y;
+ }
+
+
+
+ template<class inVector, class outVector>
+ outVector& apply(outVector &y, const inVector& x ) const
+ {
+ return apply(y,x,field().zero);
+ }
+
+ template<class inVector, class outVector>
+ outVector& applyTranspose(outVector &y, const inVector& x ) const
+ {
+ return applyTranspose(y,x,field().zero);
+ }
+
+ const Field & field() const
+ {
+ return _field ;
+ }
+
+ //! @todo
+ bool consistent() const
+ {
+ return true ;
+ }
+
+ // Element magnitude() const ;
+
+ size_t maxrow() const
+ {
+ size_t maxr = _start[1]-_start[0] ;
+ for (size_t i = 1 ; i < _rownb ; ++i)
+ maxr = std::max(maxr,(size_t)(_start[i+1]-_start[i]));
+ return maxr;
+ }
+
+ private :
+
+ class Helper {
+ bool _useable ;
+ bool _optimized ;
+ bool blackbox_usage ;
+ Self_t *_AT ;
+ public:
+
+ Helper() :
+ _useable(false)
+ ,_optimized(false)
+ , blackbox_usage(true)
+ , _AT(NULL)
+ {}
+
+ ~Helper()
+ {
+ if ( _AT ) {
+ delete _AT ;
+ }
+ }
+
+ bool optimized(const Self_t & A)
+ {
+ if (!_useable) {
+ getHelp(A);
+ _useable = true;
+ }
+ return _optimized;
+ }
+
+ void getHelp(const Self_t & A)
+ {
+ if ( A.size() > LINBOX_CSR_TRANSPOSE ) { // and/or A.rowDensity(), A.coldim(),...
+ // std::cout << "optimizing..." ;
+ _optimized = true ;
+ _AT = new Self_t(A.field(),A.coldim(),A.rowdim());
+ A.transpose(*_AT);
+ // std::cout << "done!" << std::endl;
+ }
+ }
+
+ const Self_t & matrix() const
+ {
+ return *_AT ;
+ }
+
+ };
+
+ public:
+ // pseudo iterators
+ index_t getStart(const size_t & i) const
+ {
+ return _start[i];
+ }
+
+ index_t getEnd(const size_t & i) const
+ {
+ return _start[i+1];
+ }
+
+
+ void setStart(const size_t &i, const index_t & j)
+ {
+ if (i > _rownb) this->resize(i,_colnb,_nbnz);
+ _start[i] = j ;
+ }
+
+ void setStart(const svector_t & new_start)
+ {
+ // linbox_check(_start.size() == new_start.size());
+ _start = new_start ;
+ }
+
+ svector_t getStart( ) const
+ {
+ return _start ;
+ }
+
+ size_t rowLength(const size_t & i)
+ {
+ return getEnd(i) - getStart(i) ;
+ }
+
+ // remove empty last lines
+ void compress()
+ {
+ size_t i = rowdim();
+ for ( ; i != 0 ; --i) {
+ if ( _start[i] != _start[i-1] )
+ break;
+ }
+ _rownb = i ;
+
+ }
+
+ size_t getColid(const size_t & i) const
+ {
+ return _colid[i];
+ }
+
+ void setColid(const size_t & i, const size_t & j)
+ {
+ if (i>=_nbnz) this->resize(i+1);
+ linbox_check(i <= _colid.size())
+ _colid[i]=(index_t)j;
+ }
+
+ void setColid(svector_t new_colid)
+ {
+ _colid = new_colid ;
+ }
+
+ svector_t getColid( ) const
+ {
+ return _colid ;
+ }
+
+ const Element & getData(const size_t & i) const
+ {
+ return _data[i];
+ }
+
+ void setData(const size_t & i, const Element & e)
+ {
+ if (i>=_nbnz) this->resize(i+1);
+ linbox_check(i <= _data.size());
+ field().assign(_data[i],e);
+ }
+
+ void setData(const std::vector<Element> & new_data)
+ {
+ _data = new_data ;
+ }
+
+ std::vector<Element> getData( ) const
+ {
+ return _data ;
+ }
+
+ void firstTriple() const
+ {
+ _triples.reset();
+ }
+
+ bool nextTriple(size_t & i, size_t &j, Element &e) const
+ {
+ size_t idx = (size_t)_triples.next( _start );
+ i = (size_t)_triples._row ;
+ if (idx >= _nbnz || i >= _rownb ) {
+ _triples.reset() ;
+ return false;
+ }
+
+
+ j = _colid[idx];
+ e = _data[idx];
+
+ return true;
+ }
+
+ template<class element_iterator, class Element>
+ class _Iterator {
+ private :
+ element_iterator _data_it ;
+ const element_iterator _data_beg ;
+ const element_iterator _data_end ;
+ public:
+ typedef Element value_type ;
+ _Iterator(element_iterator e_beg, element_iterator e_end) :
+ _data_it(e_beg)
+ , _data_beg(e_beg)
+ , _data_end(e_end)
+ {}
+
+ _Iterator (const _Iterator &iter) :
+ _data_it(iter._data_it)
+ , _data_beg(iter._data_beg)
+ , _data_end(iter._data_end)
+ {}
+
+ _Iterator &operator = (const _Iterator &iter)
+ {
+ _data_it = iter._data_it ;
+ _data_beg = iter._data_beg ;
+ _data_end = iter._data_end ;
+
+ return *this;
+ }
+
+ bool operator == (const _Iterator &i) const
+ {
+ return (_data_it == i._data_it) && (_data_beg == i._data_beg) && (_data_end == i._data_end);
+ }
+
+ bool operator != (const _Iterator &i) const
+ {
+ return (_data_it != i._data_it) || (_data_beg != i._data_beg) || (_data_end != i._data_end);
+ }
+
+ _Iterator &operator ++ ()
+ {
+ ++_data_it ;
+
+ if (_data_it == _data_end)
+ return *this ;
+ }
+
+ _Iterator operator ++ (int)
+ {
+ _Iterator tmp = *this;
+ ++(*this);
+ return tmp;
+ }
+
+ _Iterator &operator -- ()
+ {
+ --_data_it ;
+
+ if (_data_it == _data_beg)
+ return *this ;
+ }
+
+ _Iterator operator -- (int)
+ {
+ _Iterator tmp = *this;
+ --(*this);
+ return tmp;
+ }
+
+ value_type &operator * ()
+ {
+ return *_data_it;
+ }
+
+ value_type *operator -> ()
+ {
+ return _data_it ;
+ }
+
+ const value_type &operator*() const
+ {
+ return *_data_it;
+ }
+
+ const value_type *operator -> () const
+ {
+ return _data_it ;
+ }
+
+ const value_type &value() const
+ {
+ return *_data_it;
+ }
+
+ };
+
+#if 1
+ // This simplified indexed iterator conquers a bug and
+ // supports all tested uses.
+
+ /** a forward iterator.
+
+ Allows traversing the nonzero values, with position info.
+ Used, for example, in building an equivalent dense matrix.
+
+ Preincrement, ++i, is provided, but not postincrement, i++.
+ Dereference, *i, is replaced by i.rowIndex(), i.colIndex(), i.value().
+
+ No distinction is made between IndexedIterator and ConstIndexedIterator.
+ In particular, value() is not a reference.
+ To modify the matrix use setEntry().
+ */
+ class IndexedIterator {
+ public:
+ typedef SparseMatrix<Field, Storage> CSR_Matrix;
+ typedef CSR_Matrix::Element value_type;
+ private:
+ const CSR_Matrix *Ap_;
+ index_t row_; // row number, index for Ap_->_start
+ index_t i_; // index for Ap_->_colid, Ap_->_data
+ public:
+ IndexedIterator(){}
+
+ // cstor used by indexedBegin and indexedEnd
+ IndexedIterator(const CSR_Matrix * A, index_t m, index_t n)
+ : Ap_(A), row_(m), i_(n) {}
+
+ IndexedIterator & operator++() {
+ i_ += 1;
+ // Deal with arrival at end
+ if (i_ == Ap_->_data.size()) row_ = Ap_->rowdim();
+ // Attend to empty rows
+ else if (i_ == Ap_->_start[row_+1]) row_ += 1;
+ while(Ap_->_start[row_] == Ap_->_start[row_+1]) ++row_;
+ return *this;
+ }
+
+ index_t rowIndex() const { return row_; }
+
+ index_t colIndex() const { return Ap_->_colid[i_]; }
+
+ value_type value() const { return Ap_->_data[i_]; }
+
+ bool operator == (const IndexedIterator & I) const {
+ return row_ == I.row_ and i_ == I.i_;
+ }
+
+ bool operator != (const IndexedIterator & I) const {
+ return row_ != I.row_ or i_ != I.i_;
+ }
+ };
+
+ typedef typename Self_t::IndexedIterator ConstIndexedIterator;
+#else
+ template<class index_iterator, class element_iterator, class Element>
+ class _IndexedIterator {
+ private :
+ typedef index_iterator index_it ;
+ typedef element_iterator data_it ;
+ index_it _start_it ;
+ index_it _start_beg ;
+ index_it _colid_it ;
+ data_it _data_it ;
+ const data_it _data_beg ;
+ const data_it _data_end ;
+ public:
+ typedef Element value_type ;
+ _IndexedIterator( const index_it &i
+ , const index_it &j
+ , const data_it &e
+ , const data_it &e_e) :
+ _start_it(i)
+ , _start_beg(i)
+ , _colid_it(j)
+ , _data_it(e)
+ , _data_beg(e)
+ , _data_end(e_e)
+ {}
+ _IndexedIterator (const _IndexedIterator &iter) :
+ _start_it(iter._start_it)
+ , _start_beg(iter._start_beg)
+ , _colid_it(iter._colid_it)
+ , _data_it(iter._data_it)
+ , _data_beg(iter._data_beg)
+ , _data_end(iter._data_end)
+ {}
+
+ _IndexedIterator &operator = (const _IndexedIterator &iter)
+ {
+ _start_it = iter._start_it ;
+ _start_beg = iter._start_beg ;
+ _colid_it = iter._colid_it ;
+ _data_it = iter._data_it ;
+ _data_beg = iter._data_beg ;
+ _data_end = iter._data_end ;
+
+ return *this;
+ }
+
+ bool operator == (const _IndexedIterator &i) const
+ {
+ // we assume consistency
+ return (_data_it == i._data_it);
+ }
+
+ bool operator != (const _IndexedIterator &i) const
+ {
+ // we assume consistency
+ return (_data_it != i._data_it) ;
+ }
+
+ _IndexedIterator &operator ++ ()
+ {
+
+ ++_data_it ;
+ if (_data_it == _data_end) {
+ return *this ;
+ }
+ ++_colid_it ;
+
+ while (std::distance(_data_beg, _data_it) >= *(_start_it+1)) {
+ ++_start_it ;
+ }
+ return *this;
+ }
+
+ _IndexedIterator operator ++ (int)
+ {
+ _IndexedIterator tmp = *this;
+ ++(*this);
+ return tmp;
+ }
+
+ _IndexedIterator &operator -- ()
+ {
+ throw NotImplementedYet("not sure");
+ --_data_it ;
+ if (_data_it == _data_beg) {
+ return *this ;
+ }
+ --_colid_it ;
+ while (std::distance(_data_beg, _data_it) > *(_start_it)) {
+ --_start_it ;
+ }
+
+ return *this;
+ }
+
+ _IndexedIterator operator -- (int)
+ {
+ _IndexedIterator tmp = *this;
+ --(*this);
+ return tmp;
+ }
+
+ value_type &operator * ()
+ {
+ return *_data_it;
+ }
+
+ value_type *operator -> ()
+ {
+ return _data_it ;
+ }
+
+ const value_type &operator*() const
+ {
+ return *_data_it;
+ }
+
+ const value_type *operator -> () const
+ {
+ return _data_it ;
+ }
+
+ size_t rowIndex () const
+ {
+ return std::distance(_start_beg, _start_it);
+ }
+
+ size_t colIndex () const
+ {
+ return *_colid_it;
+ }
+
+ const value_type &value() const
+ {
+ return *_data_it;
+ }
+
+
+ };
+#endif
+ typedef _Iterator<typename std::vector<Element>::iterator, Element> Iterator;
+ typedef _Iterator<typename std::vector<Element>::const_iterator, constElement> ConstIterator;
+
+// typedef _IndexedIterator<svector_t::iterator, typename std::vector<Element>::iterator, Element> IndexedIterator;
+// typedef _IndexedIterator<svector_t::const_iterator, typename std::vector<Element>::const_iterator, constElement> ConstIndexedIterator;
+
+
+ Iterator Begin ()
+ {
+ return Iterator(_data.begin(),_data.end()) ;
+ }
+
+ Iterator End ()
+ {
+ return Iterator(_data.end(), _data.end()) ;
+ }
+
+ ConstIterator Begin () const
+ {
+ return ConstIterator(_data.begin(),_data.end()) ;
+ }
+
+ ConstIterator End () const
+ {
+ return ConstIterator(_data.end(), _data.end()) ;
+ }
+
+ IndexedIterator IndexedBegin () const
+ {
+ if (_data.size() == 0) return IndexedEnd();
+ // Take care for empty first row(s).
+ index_t i = 0;
+ while (_start[i] == _start[i+1]) ++i;
+ return IndexedIterator(this, i, 0);
+
+ // bug for empty first row
+ //return IndexedIterator(_start.begin(), _colid.begin(), _data.begin(),_data.end()) ;
+ }
+
+ IndexedIterator IndexedEnd () const
+ {
+ return IndexedIterator(this, rowdim(), _data.size());
+ //return IndexedIterator(_start.end(), _colid.end(), _data.end(),_data.end()) ;
+ }
+
+#if 0
+
+ ConstIndexedIterator IndexedBegin () const
+ { // bug for empty first row.
+ return ConstIndexedIterator(_start.begin(), _colid.begin(), _data.begin(),_data.end()) ;
+ }
+
+ ConstIndexedIterator IndexedEnd () const
+ {
+ return ConstIndexedIterator(_start.end(), _colid.end(), _data.end(),_data.end()) ;
+ }
+#endif
+
+ Integer magnitude() const
+ {
+ Integer M = 0;
+ for (size_t i = 0 ; i < _nbnz ; ++i)
+ M = std::max(M,Givaro::abs(_data[i]));
+ return M;
+ }
+
+ protected :
+ friend class SparseMatrixWriteHelper<Self_t >;
+ friend class SparseMatrixReadHelper<Self_t >;
+
+ // friend class SparseMatrixDomain<Self_t > ;
+
+ // bool is_upper ;
+ // bool zero_based;
+ // bool implicit_diag ;
+
+ size_t _rownb ;
+ size_t _colnb ;
+ size_t _nbnz ;
+
+ svector_t _start ;
+ svector_t _colid ;
+ std::vector<Element> _data ;
+
+ const _Field & _field;
+
+ mutable Helper _helper ;
+
+ mutable struct _triples {
+ ptrdiff_t _row ;
+ ptrdiff_t _nnz ;
+ _triples() :
+ _row(-1)
+ , _nnz(-1)
+ {}
+
+ ptrdiff_t next( const svector_t & start)
+ {
+ _nnz +=1 ;
+ while (_row+1 < (ptrdiff_t)start.size() && _nnz >= (ptrdiff_t)start[(size_t)_row+1]) {
+ _row += 1;
+ }
+ return _nnz ;
+ }
+
+ void reset()
+ {
+ _row = -1 ;
+ _nnz = -1 ;
+ }
+ }_triples;
+ };
+
+#if 1
+
+ // template<>
+ // template<class inVector, class outVector>
+ // outVector & SparseMatrix<Givaro::Modular<double>, SparseMatrixFormat::CSR >::apply(outVector &Y, const inVector& X, const Element & a ) const
+ // {
+ // FFLAS::CSR_sub<typename Field::Element> A ;
+ // // FFLAS::CSR_sub<typename Field::Element> A ;
+ // A.m = rowdim();
+ // A.n = coldim();
+ // A.st = const_cast<index_t*>(&_start[0]);
+ // A.col = const_cast<index_t*>(&_colid[0]);
+ // A.dat = const_cast<typename Field::Element*>(&_data[0]);
+ // // A.i0 = 0 ;
+ // // A.j0 = 0 ;
+ // FFLAS::VECT<typename Field::Element> x ;
+ // x.inc = 1 ;
+ // x.m = X.size();
+ // x.dat = X.getPointer();
+ // FFLAS::VECT<typename Field::Element> y ;
+ // y.inc = 1;
+ // y.m = Y.size();
+ // y.dat = Y.getWritePointer();
+ // // std::cout << "called" << std::endl ;
+ // FFLAS::sp_fgemv(field(), A, x, a, y);
+ // return Y ;
+ // }
+
+ // template<>
+ // Integer SparseMatrix<Givaro::ZRing<Integer>, SparseMatrixFormat::CSR >::magnitude() const
+ // {
+ // // XXX this is a vector magnitude
+ // Integer max_elt(0);
+ // for (size_t i = 0 ; i < _nbnz ; ++i)
+ // if (max_elt < Givaro::abs(_data[i]))
+ // max_elt = Givaro::abs(_data[i]) ;
+ // return max_elt ;
+ // }
+#endif
+
+} // LinBox
+
+namespace LinBox {
+
+#if 0
+ template<class _Field>
+ SparseMatrixDomain<SparseMatrix<_Field, SparseMatrixFormat::CSR> {
+ public:
+ typedef typename _Field Field ;
+ typedef typename SparseMatrix<Field, SparseMatrixFormat::CSR> Matrix_t ;
+ typedef typename SparseMatrixDomain<Matrix_t> Self_t ;
+
+ Self_t(Matrix_t & M) :
+ _mat(M)
+ {}
+
+ // template<class inMatrix, class outMatrix>
+ // outMatrix & apply( outMatrix & y, const inMatrix & x, Element & alpha, const LINBOX_enum(Tag::Side) lr)
+
+ template<class inMatrix, class outMatrix>
+ outMatrix & applyLeft( outMatrix & y, const inMatrix & x, Element & alpha)
+ {
+ return applyLeft(y,x,alpha
+ , typename ContainerTraits<inMatrix>::ContainerCategory()
+ , typename FieldTraits<typename inMatrix::Field>::categoryTag() );
+ }
+
+ template<class inMatrix, class outMatrix>
+ outMatrix & applyRight( outMatrix & y, const inMatrix & x, Element & alpha)
+ {
+ return applyRight(y,x,alpha
+ , typename ContainerTraits<inMatrix>::ContainerCategory()
+ , typename FieldTraits<typename inMatrix::Field>::categoryTag() );
+ }
+
+#if 0 /* allow y to be transposed */
+ template<class inMatrix, class outMatrix>
+ outMatrix & applyRight( outMatrix & y, const Transpose<inMatrix> & x, Element & alpha)
+ {
+ return applyRight(y,x,alpha,lr, typename ContainerTraits<inMatrix>::ContainerCategory() );
+ }
+#endif
+
+
+ private :
+ // XXX generic Tag
+ // axpy, trans
+
+ // XXX generic Tag
+ // MKL
+
+ // Givaro::Modular Tag
+ // sum of matrices
+ template<class inMatrix, class outMatrix>
+ outMatrix & applyLeft( outMatrix & y, const inMatrix & x, Element & alpha
+ , typename ContainerCategories::Vector
+ , typename RingCategories::ModularTag);
+
+ template<class inMatrix, class outMatrix>
+ outMatrix & applyLeft( outMatrix & y, const inMatrix & x, Element & alpha
+ , typename ContainerCategories::Matrix
+ , typename RingCategories::ModularTag);
+
+ template<class inMatrix, class outMatrix>
+ outMatrix & applyRight( outMatrix & y, const inMatrix & x, Element & alpha
+ , typename ContainerCategories::Vector
+ , typename RingCategories::ModularTag);
+
+ template<class inMatrix, class outMatrix>
+ outMatrix & applyRight( outMatrix & y, const inMatrix & x, Element & alpha
+ , typename ContainerCategories::Matrix
+ , typename RingCategories::ModularTag);
+
+
+ // XXX Integer Tag
+ // RNS (needs _Field -> ModularField)
+
+ // XXX Galois Tag
+ // Toom Cook or the like (needs _Field -> Base(_Field)=ModularField)
+
+ private :
+ Matrix_t & _mat ;
+
+ SparseMatrix< AutoField<Field>::Base, SparseMatrixFormat::HYB > N_mat ;
+ SparseMatrix< AutoField<Field>::Base, SparseMatrixFormat::HYB > T_mat ;
+ // Helper
+
+ }
+#endif
+
+
+} // namespace LinBox
+
+
+
+#endif // __LINBOX_sparse_matrix_sparse_csr_matrix_H
+
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/matrix/sparsematrix/sparse-domain.h b/linbox/matrix/sparsematrix/sparse-domain.h
new file mode 100644
index 0000000..c7b53dc
--- /dev/null
+++ b/linbox/matrix/sparsematrix/sparse-domain.h
@@ -0,0 +1,70 @@
+/* linbox/matrix/sparse-domain.h
+ * Copyright (C) 2013 the LinBox
+ *
+ * Written by :
+ * Brice Boyer (briceboyer) <boyer.brice at gmail.com>
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ * ========LICENCE========
+ */
+
+/*! @file matrix/sparsematrix/sparse-domain.h
+ * @ingroup sparsematrix
+ */
+
+
+#ifndef __LINBOX_matrix_sparsematrix_sparse_domain_H
+#define __LINBOX_matrix_sparsematrix_sparse_domain_H
+
+#include "linbox/linbox-config.h"
+#include "linbox/util/debug.h"
+
+namespace LinBox {
+
+ /// y <- ay. @todo Vector knows Field
+ template<class Field, class Vector>
+ Vector & prepare(const Field & F , Vector & y, const typename Field::Element & a) {
+ if ( !F.isOne(a) ) {
+ if ( F.isZero(a) ) {
+ for (size_t i = 0 ; i < y.size() ; ++i)
+ F.assign(y[i],F.zero);
+ }
+ else if (F.isMOne(a)) {
+ for (size_t i = 0 ; i < y.size() ; ++i)
+ F.negin(y[i]);
+ }
+ else {
+ for (size_t i = 0 ; i < y.size() ; ++i)
+ F.mulin(y[i],a);
+ }
+
+ }
+ return y ;
+ }
+
+} // LinBox
+
+#endif // __LINBOX_matrix_sparsematrix_sparse_domain_H
+
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/matrix/sparsematrix/sparse-ell-matrix.h b/linbox/matrix/sparsematrix/sparse-ell-matrix.h
new file mode 100644
index 0000000..a4ea65b
--- /dev/null
+++ b/linbox/matrix/sparsematrix/sparse-ell-matrix.h
@@ -0,0 +1,1489 @@
+/* linbox/matrix/sparse-csr-matrix.h
+ * Copyright (C) 2013 the LinBox
+ *
+ * Written by :
+ * Brice Boyer (briceboyer) <boyer.brice at gmail.com>
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ * ========LICENCE========
+ */
+
+/*! @file matrix/sparsematrix/sparse-ell-matrix.h
+ * @ingroup sparsematrix
+ * @brief
+ */
+
+
+#ifndef __LINBOX_matrix_sparsematrix_sparse_ell_matrix_H
+#define __LINBOX_matrix_sparsematrix_sparse_ell_matrix_H
+
+#include <utility>
+#include <iostream>
+#include <algorithm>
+
+#include "linbox/linbox-config.h"
+#include "linbox/util/debug.h"
+#include "linbox/field/hom.h"
+#include "sparse-domain.h"
+
+#ifndef LINBOX_ELL_TRANSPOSE
+#define LINBOX_ELL_TRANSPOSE 1000
+#endif
+
+namespace LinBox
+{
+
+
+ /** Sparse matrix, Coordinate storage.
+ *
+ * \ingroup matrix
+ * \ingroup sparse
+ */
+ template<class _Field>
+ class SparseMatrix<_Field, SparseMatrixFormat::ELL > {
+ public :
+ typedef _Field Field ; //!< Field
+ typedef typename _Field::Element Element ; //!< Element
+ typedef const Element constElement ; //!< const Element
+ typedef SparseMatrixFormat::ELL Storage ; //!< Matrix Storage Format
+ typedef SparseMatrix<_Field,Storage> Self_t ; //!< Self type
+ typedef typename Vector<Field>::SparseSeq Row ; //!< @warning this is not the row type. Just used for streams.
+ // typedef Vector<_Field,VectorStorage::Sparse> Rep ;
+
+ /*! Constructors.
+ * @todo convert from other matrix.
+ *
+ */
+ //@{
+#if 0 /* No empty CSTOR */
+ SparseMatrix<_Field, SparseMatrixFormat::ELL> () :
+ _rownb(0),_colnb(0),_maxc(0)
+ ,_nbnz(0)
+ ,_colid(0),_data(0)
+ , _field()
+ , _helper()
+ {
+ }
+#endif
+
+ SparseMatrix<_Field, SparseMatrixFormat::ELL> (const _Field & F) :
+ _rownb(0),_colnb(0)
+ ,_maxc(0)
+ ,_nbnz(0)
+ ,_colid(0)
+ ,_data(0)
+ , _field(F)
+ , _helper()
+ {
+ }
+
+ SparseMatrix<_Field, SparseMatrixFormat::ELL> (const _Field & F, size_t m, size_t n) :
+ _rownb(m),_colnb(n)
+ ,_maxc(0)
+ ,_nbnz(0)
+ ,_colid(0)
+ ,_data(0)
+ , _field(F)
+ , _helper()
+ {
+ }
+
+ SparseMatrix<_Field, SparseMatrixFormat::ELL> (const _Field & F,
+ size_t m, size_t n,
+ size_t z) :
+ _rownb(m),_colnb(n)
+ , _maxc(0)
+ , _nbnz(z)
+ , _colid(z)
+ ,_data(z)
+ , _field(F)
+ , _helper()
+ {
+ }
+
+ SparseMatrix<_Field, SparseMatrixFormat::ELL> (const SparseMatrix<_Field, SparseMatrixFormat::CSR> & S) :
+ _rownb(S._rownb),_colnb(S._colnb)
+ ,_maxc(S._maxc)
+ ,_nbnz(S._nbnz)
+ , _colid(S._colid)
+ ,_data(S._data)
+ , _field(S._field)
+ , _helper()
+ {
+ }
+
+#if 0
+ template<class _OtherField>
+ SparseMatrix<_Field, SparseMatrixFormat::COO> (const SparseMatrix<_OtherField, SparseMatrixFormat::COO> & S) :
+ _rownb(S._rownb),_colnb(S._colnb),
+ _nbnz(S._nbnz),
+ _rowid(S._rowid),_colid(S._colid),_data(S._data),
+ _field(S._field)
+ {}
+#endif
+
+ template<typename _Tp1, typename _Rw1 = SparseMatrixFormat::ELL>
+ struct rebind {
+ typedef SparseMatrix<_Tp1, _Rw1> other;
+ private:
+
+ template<class _Rw>
+ void rebindMethod(SparseMatrix<_Tp1, _Rw> & Ap, const Self_t & A /*, IndexedCategory::HasNext */)
+ {
+ typename _Tp1::Element e;
+ Hom<typename Self_t::Field, _Tp1> hom(A.field(), Ap.field());
+
+ size_t i, j ;
+ Element f ;
+ A.firstTriple();
+ while ( A.nextTriple(i,j,f) ) {
+ linbox_check(i < A.rowdim() && j < A.coldim()) ;
+ hom. image ( e, f) ;
+ if (! Ap.field().isZero(e) )
+ Ap.appendEntry(i,j,e);
+ }
+ A.firstTriple();
+ Ap.finalize();
+ }
+
+ void rebindMethod(SparseMatrix<_Tp1, Storage> & Ap, const Self_t & A /*, IndexedCategory::HasNext*/)
+ {
+ // we don't use nextTriple because we can do better.
+ linbox_check(A.consistent());
+ // Ap = new other(F, A.rowdim(), A.coldim());
+ Ap.resize(A.rowdim(),A.coldim(),A.size(),A.ld());
+
+ typename _Tp1::Element e;
+
+ Hom<typename Self_t::Field, _Tp1> hom(A.field(), Ap.field());
+ size_t newz = 0 ;
+ for (size_t i = 0 ; i < A.rowdim() ; ++i) {
+ size_t j = 0 ;
+ for (size_t k = 0 ; k < A.ld() ; ++k) {
+ if (A.field().isZero(A.getData(i,k))) {
+ break;
+ }
+ hom. image ( e, A.getData(i,k) );
+ if (!Ap.field().isZero(e)) {
+ Ap.setColid(i,j,A.getColid(i,k));
+ Ap.setData(i,j,e);
+ ++j;
+ }
+ else {
+ ++newz ;
+ }
+ }
+ }
+ Ap.setSize(Ap.size() - newz) ;
+ }
+
+ public:
+
+ void operator() (other & Ap, const Self_t& A)
+ {
+ rebindMethod(Ap, A );
+
+ }
+
+ };
+
+ template<typename _Tp1, typename _Rw1>
+ SparseMatrix (const SparseMatrix<_Tp1, _Rw1> &S, const Field& F) :
+ _rownb(S.rowdim()),_colnb(S.coldim())
+ ,_maxc(0)
+ ,_nbnz(S.size())
+ , _colid(0)
+ ,_data(0)
+ , _field(F)
+ {
+ typename SparseMatrix<_Tp1,_Rw1>::template rebind<Field,Storage>()(*this, S);
+ finalize();
+ }
+
+
+
+
+ template<class VectStream>
+ SparseMatrix<_Field, SparseMatrixFormat::ELL> (const _Field & F, VectStream & stream) :
+ _rownb(stream.size()),_colnb(stream.dim())
+ , _maxc(0)
+ , _nbnz(0)
+ , _colid(0)
+ ,_data(0)
+ , _field(F)
+ {
+ //! @todo
+ SparseMatrix<_Field,SparseMatrixFormat::CSR> Tmp(F,stream);
+ importe(Tmp);
+ finalize();
+ }
+
+ SparseMatrix<_Field, SparseMatrixFormat::ELL> ( MatrixStream<Field>& ms ):
+ _rownb(0),_colnb(0)
+ ,_maxc(0)
+ ,_nbnz(0)
+ ,_colid(0)
+ ,_data(0)
+ ,_field(ms.field())
+ {
+ firstTriple();
+
+ Element val;
+ size_t i, j;
+ while( ms.nextTriple(i,j,val) ) {
+ if (! field().isZero(val)) {
+ if( i >= _rownb ) {
+ // _rownb = i + 1;
+ resize(i+1,_colnb,_nbnz,(size_t)_maxc);
+ }
+ if( j >= _colnb ) {
+ // _colnb = j + 1;
+ resize(_rownb,j+1,_nbnz,(size_t)_maxc);
+ }
+ appendEntry(i,j,val);
+ }
+ }
+ if( ms.getError() > END_OF_MATRIX )
+ throw ms.reportError(__func__,__LINE__);
+ if( !ms.getDimensions( i, j ) )
+ throw ms.reportError(__func__,__LINE__);
+#ifndef NDEBUG
+ if( i != _rownb || j != _colnb) {
+ std::cout << " ***Warning*** the sizes got changed" << __func__ << ',' << __LINE__ << std::endl;
+ }
+#endif
+
+ firstTriple();
+ finalize();
+ linbox_check(consistent());
+ }
+
+
+ void resize(const size_t mm, const size_t nn, const size_t zz = 0, const size_t ll = 0)
+ {
+ // linbox_check(_rownb*_maxc == _colid.size());
+ // attention RowMajor/ColMajor
+ if (!_maxc || mm == _maxc) {
+ _colid.resize(mm*ll,0);
+ _data .resize(mm*ll,field().zero);
+ }
+ else if ( ll > _maxc) {
+ reshape(ll);
+ }
+ else {
+#ifndef NDEBUG
+ if (_maxc && ll != _maxc)
+ std::cout << " ***Warning*** possibly loosing data in ELL resize " << std::endl;
+#endif
+ _colid.resize(mm*ll,0);
+ _data .resize(mm*ll,field().zero);
+ }
+ _rownb = mm ;
+ _colnb = nn ;
+ _nbnz = zz;
+ _maxc = ll;
+
+ linbox_check(_rownb*_maxc == _colid.size());
+ }
+
+ /*! Default converter.
+ * @param S a sparse matrix in any storage.
+ */
+ template<class _OtherStorage>
+ SparseMatrix<_Field, SparseMatrixFormat::ELL> (const SparseMatrix<_Field, _OtherStorage> & S) :
+ _rownb(S.rowdim()),_colnb(S.coldim())
+ ,_nbnz(S.size())
+ ,_maxc(0)
+ ,_colid(0)
+ ,_data(0)
+ ,_field(S.field())
+ {
+ // _nbnz is set there:
+ this->importe(S); // convert Temp from anything
+ }
+
+
+
+ //@}
+ /*! Conversions.
+ * Any sparse matrix has a converter to/from CSR.
+ * A specialisation can skip the temporary CSR matrix created.
+ */
+ //@{
+ /*! Import a matrix in COO format to CSR.
+ * @param S COO matrix to be converted in CSR
+ */
+ void importe(const SparseMatrix<_Field,SparseMatrixFormat::CSR> &S)
+ {
+ // can be sped up on multicores.
+ for (size_t i = 0 ; i < S.rowdim() ; ++i)
+ _maxc = std::max(_maxc, (size_t)(S.getEnd(i)-S.getStart(i)));
+
+ resize(S.rowdim(), S.coldim(), S.size(),(size_t)_maxc);
+
+ for (size_t i = 0 ; i < S.rowdim() ; ++i) {
+ size_t k = 0 ;
+ for (size_t j = S.getStart(i) ; j < S.getEnd(i) ; ++j, ++k) {
+ setColid(i,k,S.getColid(j));
+ setData(i,k,S.getData(j));
+ }
+ }
+
+ }
+
+ /*! Import a matrix in CSR format to CSR.
+ * @param S CSR matrix to be converted in CSR
+ */
+
+ void importe(const SparseMatrix<_Field,SparseMatrixFormat::ELL> &S)
+ {
+ resize( S.rowdim(), S.coldim(), S.size() , S.ld());
+
+ setColid(S.getColid());
+ setData(S.getData());
+
+ }
+
+ template<class _OtherStorage>
+ void importe(const SparseMatrix<_Field,_OtherStorage> &S)
+ {
+ SparseMatrix<_Field,SparseMatrixFormat::CSR> Tmp(S);
+ this->importe(S);
+
+ }
+
+ /*! Export a matrix in CSR format from COO.
+ * @param S CSR matrix to be converted from COO
+ */
+ SparseMatrix<_Field,SparseMatrixFormat::CSR > &
+ exporte(SparseMatrix<_Field,SparseMatrixFormat::CSR> &S) const
+ {
+ linbox_check(consistent());
+
+ S.resize(_rownb, _colnb, _nbnz);
+ S.setStart(0,0);
+ size_t k = 0 ;
+ for (size_t i = 0 ; i < S.rowdim() ; ++i) {
+ for (size_t j = 0 ; j < _maxc; ++j ) {
+ if (field().isZero(getData(i,j)))
+ break;
+ S.setColid(k,getColid(i,j));
+ S.setData(k,getData(i,j));
+ ++k;
+ }
+ S.setStart(i+1,k);
+ }
+ linbox_check(k == _nbnz);
+
+ return S ;
+ }
+
+
+ //@}
+
+ /*! In place transpose. Not quite...
+ */
+ void transposeIn()
+ {
+ Self_t Temp(*this);
+ Temp.transpose(*this);
+ }
+
+ /*! Transpose the matrix.
+ * @param S [out] transpose of self.
+ * @return a reference to \p S.
+ */
+ Self_t &
+ transpose(Self_t &S) const
+ {
+ // outStart
+ size_t maxc = 0;
+ {
+ std::vector<size_t> start(coldim(),0);
+
+ for (size_t i = 0 ; i < rowdim() ; ++i) {
+ for (size_t j = 0 ; j < _maxc ; ++j) {
+ if (!field().isZero(getData(i,j)))
+ start[getColid(i,j)] += 1 ;
+ else
+ break;
+ }
+ }
+
+ maxc = start[0] ;
+ for (size_t i = 1 ; i < coldim() ; ++i)
+ maxc= std::max(maxc, start[i]);
+ }
+
+
+
+ S.resize((size_t)_colnb, (size_t)_rownb, (size_t)_nbnz, (size_t)maxc ); // necessary copy to temp, no const ref
+
+ {
+ std::vector<size_t> done_col(coldim(),0);
+
+
+ for (size_t i = 0 ; i < rowdim() ; ++i) {
+ for (size_t j = 0 ; j < _maxc ; ++j) {
+ if (!field().isZero(getData(i,j))) {
+ size_t loc_col = getColid(i,j) ;
+ S.setData (loc_col,done_col[loc_col],getData(i,j));
+ S.setColid(loc_col,done_col[loc_col],i);
+
+ linbox_check(done_col[loc_col] < maxc);
+ done_col[loc_col] += 1 ;
+
+ }
+ else
+ break;
+ }
+ }
+ }
+
+ S.finalize();
+
+
+ return S;
+
+
+ }
+
+ /*! number of rows.
+ * @return row dimension.
+ */
+ size_t rowdim() const
+ {
+ return _rownb ;
+ }
+
+ /*! number of columns.
+ * @return column dimension
+ */
+ size_t coldim() const
+ {
+ return _colnb ;
+ }
+
+ /*! Number of non zero elements in the matrix.
+ * or at least the size of the _data if
+ * @return size of the _data.
+ */
+ size_t size() const
+ {
+ // return _data.size();
+ return _nbnz ;
+ }
+
+ void setSize(const size_t z)
+ {
+ _nbnz = z ;
+ }
+
+
+ /** Get a read-only individual entry from the matrix.
+ * @param i Row _colid
+ * @param j Column _colid
+ * @return Const reference to matrix entry
+ */
+ constElement &getEntry(const size_t &i, const size_t &j) const
+ {
+ ptrdiff_t off = _triples.next(_maxc);
+ size_t ii = i ;
+ while ( field().isZero(_data[ii*_maxc+off]) ) {
+ _triples._off = off = 0;
+ _triples._row = ii = ii+1 ;
+ }
+ if ( i == ii && _colid[ii*_maxc+off] == j ) { /* sort of nextTriple */
+ linbox_check(!field().isZero(_data[ii*_maxc+off]));
+ return _data[ii*_maxc+off];
+ }
+ else { /* searching */
+
+ linbox_check(consistent());
+
+ linbox_check(i<_rownb);
+ linbox_check(j<_colnb);
+
+ const size_t * beg = &_colid[i*_maxc];
+ const Element * dat = &_data[i*_maxc];
+ for (size_t k = 0 ; k < _maxc ; ++k) {
+ if ( field().isZero(dat[k])) {
+ return field().zero;
+ }
+ // replace
+ if (beg[k] == j) {
+ _triples._off = k;
+ _triples._row = i;
+ return dat[k];
+ }
+ if (beg[k] > j) {
+ return field().zero;
+ }
+ }
+ return field().zero;
+ }
+
+ }
+
+ Element &getEntry (Element &x, size_t i, size_t j) const
+ {
+ return x = getEntry (i, j);
+ }
+
+ void appendEntry(const size_t &i, const size_t &j, const Element& e)
+ {
+ linbox_check(i < rowdim());
+ linbox_check(j < coldim());
+ linbox_check(_colid.size() == _data.size());
+ linbox_check(_rownb*_maxc == _colid.size());
+
+ if (field().isZero(e)) {
+ return ;
+ }
+ ptrdiff_t row = _triples._row ;
+ ptrdiff_t off = _triples._off ;
+ if (row != (ptrdiff_t)i) { /* new row */
+ linbox_check((ptrdiff_t)i>row);
+ _triples._row = i ;
+ _triples._off = 0 ;
+ if (_maxc == 0) {
+ insert(i,_maxc,j,e);
+ }
+ else {
+ linbox_check(i*_maxc < _colid.size());
+ _colid[i*_maxc] = j ;
+ _data [i*_maxc] = e ;
+ ++_nbnz;
+ }
+ }
+ else { /* same row */
+ linbox_check(_triples._row == i);
+ _triples._off = off = off + 1 ;
+ if (off == (ptrdiff_t)_maxc) {
+ insert(i,_maxc,j,e);
+ }
+ else {
+ linbox_check(i*_maxc+off < _colid.size());
+ _colid[i*_maxc+off] = j ;
+ _data [i*_maxc+off] = e ;
+ ++_nbnz;
+ }
+
+ }
+ linbox_check(_rownb*_maxc == _colid.size());
+ }
+
+ /// make matrix ready to use after a sequence of setEntry calls.
+ void finalize(){
+ // could check that maxc is not too large and shrink ? Is is optimize job ?
+ _triples.reset();
+ } // end construction after a sequence of setEntry calls.
+
+ /** Set an individual entry.
+ * Setting the entry to 0 will not remove it from the matrix
+ * @param i Row _colid of entry
+ * @param j Column _colid of entry
+ * @param value Value of the new entry
+ * @todo make it faster if i is 0 or m-1 ?
+ * @warning if this is used to build a matrix and this matrix is "well formed",
+ * it can be sped up (no checking that the entry already exists).
+ */
+ void setEntry(const size_t &i, const size_t &j, const Element& e
+ )
+ {
+ linbox_check(i<_rownb);
+ linbox_check(j<_colnb);
+
+ linbox_check(consistent());
+
+ if (field().isZero(e)) {
+ return clearEntry(i,j);
+ }
+
+ size_t * beg = &_colid[i*_maxc];
+ Element * dat = &_data[i*_maxc];
+ bool found = false;
+ for (size_t k = 0 ; k < _maxc ; ++k) {
+ if ( field().isZero(dat[k])) {
+ field().assign(dat[k], e) ;
+ beg[k] = j;
+ found = true;
+ ++_nbnz ;
+ break;
+ }
+ if (beg[k] == j) {
+ if (field().isZero(dat[k])) {
+ ++_nbnz ;
+ }
+ field().assign(dat[k], e) ;
+ beg[k] = j;
+ found = true;
+ break;
+ }
+ if (beg[k] > j) {
+ found = true;
+ insert(i,k,j,e);
+ break;
+ }
+ }
+ if (!found) {
+ insert(i,_maxc,j,e);
+ }
+ }
+
+#if 0
+ /** Get a writeable reference to an entry in the matrix.
+ * If there is no entry at the position (i, j), then a new entry
+ * with a value of zero is inserted and a reference to it is
+ * returned.
+ * @param i Row _colid of entry
+ * @param j Column _colid of entry
+ * @return Reference to matrix entry
+ */
+ Element &refEntry(const size_t &i, const size_t&j)
+ {
+ linbox_check(i<_rownb);
+ linbox_check(j<_colnb);
+ // Could be improved by adding an initial guess j/rowdim*size()
+
+ size_t ibeg = _start[i];
+ size_t iend = _start[i+1];
+ if (ibeg==iend) {
+ for (size_t k = i+1 ; k <= _rownb ; ++k) _start[k] +=1 ;
+ _colid.insert(_colid.begin()+ibeg,j);
+ _data.insert( _data.begin() +ibeg,field().zero);
+ return _data[ibeg];
+ }
+ typedef typename std::vector<size_t>::iterator myIterator ;
+ myIterator beg = _colid.begin() ;
+ myIterator low = std::lower_bound (beg+(ptrdiff_t)ibeg, beg+(ptrdiff_t)iend, j);
+ if (low == beg+(ptrdiff_t)iend) {
+ for (size_t k = i+1 ; k <= _rownb ; ++k) _start[k] +=1 ;
+ _colid.insert(_colid.begin()+ibeg,j);
+ _data.insert( _data.begin() +ibeg,field().zero);
+ return _data[ibeg];
+ }
+ else {
+ size_t la = low-_colid.begin() ;
+ return _data[la] ;
+ }
+ }
+#endif
+
+ /** Write a matrix to the given output stream using field read/write.
+ * @param os Output stream to which to write the matrix
+ * @param format Format with which to write
+ */
+ std::ostream & write(std::ostream &os
+ , LINBOX_enum(Tag::FileFormat) format = Tag::FileFormat::MatrixMarket) const
+ {
+ return SparseMatrixWriteHelper<Self_t>::write(*this,os,format);
+ }
+
+
+ /** Read a matrix from the given input stream using field read/write
+ * @param is Input stream from which to read the matrix
+ * @param format Format of input matrix
+ * @return ref to \p is.
+ */
+ std::istream& read (std::istream &is
+ , LINBOX_enum(Tag::FileFormat) format = Tag::FileFormat::Detect)
+ {
+ return SparseMatrixReadHelper<Self_t>::read(*this,is,format);
+ }
+
+ /*! @internal
+ * @brief Deletes the entry.
+ * Deletes \c A(i,j) if it exists.
+ * @param i row _colid
+ * @param j col _colid
+ * @bug rows are increasing order => faster search.
+ */
+ void clearEntry(const size_t &i, const size_t &j)
+ {
+ linbox_check(i<_rownb);
+ linbox_check(j<_colnb);
+
+ size_t k = 0 ;
+ for ( ; k < _maxc ; ++k) {
+ if (_colid[i*_maxc+k] == j)
+ break;
+ if (_colid[i*_maxc+k] > j)
+ return;
+ }
+ if (k == _maxc)
+ return; // not found
+
+ if (field().isZero(_data[i*_maxc+k]) && _colid[i*_maxc+k] == 0)
+ return;
+
+ for (size_t l = k ; l < _maxc-1 ; ++l) {
+ field().assign(_data[i*_maxc+l],_data[i*_maxc+l+1]);
+ _colid[i*_maxc+l] = _colid[i*_maxc+l+1];
+ }
+ field().assign(_data[i*_maxc+_maxc-1],field().zero) ;
+ _colid[i*_maxc+_maxc-1] = 0;
+ --_nbnz;
+ }
+
+ /*! @internal
+ * @brief cleans 0 entries.
+ */
+ void clean()
+ {
+#if 0
+ size_t i = 0 ;
+ while(i < _data.size()) {
+ if ( field().isZero(_data[i]) ) {
+ for (size_t k = i+1 ; k <= _rownb ; ++k) _start[k] -= 1 ;
+ _colid.erase(_colid.begin()+i);
+ _data. erase(_data. begin()+i);
+ }
+ else
+ ++i ;
+ }
+ return ;
+#endif
+ }
+
+ // y= Ax
+ // y[i] = sum(A(i,j) x(j)
+ template<class Vector>
+ Vector& apply(Vector &y, const Vector& x, const Element & a ) const
+ {
+ // linbox_check(consistent());
+ prepare(field(),y,a);
+
+
+ FieldAXPY<Field> accu(field());
+ for (size_t i = 0 ; i < _rownb ; ++i) {
+ accu.reset();
+ for (size_t k = 0 ; k < _maxc ; ++k)
+ if (!field().isZero(getData(i,k)))
+ // field().axpyin( y[i], getData(i,k), x[getColid(i,k)] ); //! @todo delay !!!
+ accu.mulacc( getData(i,k), x[getColid(i,k)] );
+ else {
+ break;
+ }
+ accu.get(y[i]);
+ }
+
+ return y;
+ }
+
+
+ // y= A^t x
+ // y[i] = sum(A(j,i) x(j)
+ template<class Vector>
+ Vector& applyTranspose(Vector &y, const Vector& x, const Element & a ) const
+ {
+ linbox_check(consistent());
+ if (_helper.optimized(*this)) {
+ return _helper.matrix().apply(y,x,a) ; // NEVER use applyTranspose on that thing.
+ }
+
+ prepare(field(),y,a);
+
+
+#if 0
+ for (size_t i = 0 ; i < _rownb ; ++i)
+ for (size_t k = 0 ; k < _maxc ; ++k)
+ if (!field().isZero(getData(i,k)))
+ field().axpyin(y[getColid(i,k)], getData(i,k), x[i] ); //! @todo delay !!!
+ else
+ break;
+#else
+ const FieldAXPY<Field> accu0(field());
+ std::vector<FieldAXPY<Field> > Y(_colnb, accu0);
+
+
+ for (size_t i = 0 ; i < _rownb ; ++i)
+ for (size_t k = 0 ; k < _maxc ; ++k)
+ if (!field().isZero(getData(i,k)))
+ Y[getColid(i,k)].mulacc( getData(i,k), x[i] );
+ else
+ break;
+
+ for (size_t i = 0 ; i < _colnb ; ++i)
+ Y[i].get(y[i]) ;
+#endif
+
+ return y;
+ }
+
+
+
+ template<class inVector, class outVector>
+ outVector& apply(outVector &y, const inVector& x ) const
+ {
+ return apply(y,x,field().zero);
+ }
+
+ template<class inVector, class outVector>
+ outVector& applyTranspose(outVector &y, const inVector& x ) const
+ {
+ return applyTranspose(y,x,field().zero);
+ }
+
+ const Field & field() const
+ {
+ return _field ;
+ }
+
+ /** @todo Non element marker.
+ * We could end up a line with a marker.
+ * A field F would contain an element that does not belong to
+ * it. eg a nan for a Givaro::Modular<double>. It could act as a
+ * marker.
+ */
+ bool consistent() const
+ {
+ size_t nbnz = 0 ;
+ if (_rownb * _maxc != _data.size()) {
+ std::cout << "bad data size" << std::endl;
+ return false;
+ }
+ if (_data.size() != _colid.size()) {
+ std::cout << "bad colid size" << std::endl;
+ return false;
+ }
+ // bool ok = true ;
+ for (size_t i = 0 ; i < _rownb ; ++i) {
+ // bool row_ok = true ;
+ bool zero = false ;
+ for (size_t j = 0 ; j < _maxc ; ++j) {
+ if (field().isZero(getData(i,j))) {
+ zero = true ;
+ }
+ else {
+ if (zero) {
+ std::cout << "non zero after a 0" << std::endl;
+ return false ; // elements after a 0...
+ }
+ ++nbnz ;
+
+ }
+ }
+ }
+ if (nbnz != _nbnz)
+ std::cout << "bad number of non zero" << std::endl;
+ return (nbnz == _nbnz);
+
+ }
+
+
+
+ private :
+
+ class Helper {
+ bool _useable ;
+ bool _optimized ;
+ bool blackbox_usage ;
+ Self_t *_AT ;
+ public:
+
+ Helper() :
+ _useable(false)
+ ,_optimized(false)
+ , blackbox_usage(true)
+ , _AT(NULL)
+ {}
+
+ ~Helper()
+ {
+ if ( _AT ) {
+ delete _AT ;
+ }
+ }
+
+ bool optimized(const Self_t & A)
+ {
+ if (!_useable) {
+ getHelp(A);
+ _useable = true;
+ }
+ return _optimized;
+ }
+
+ void getHelp(const Self_t & A)
+ {
+ if ( A.size() > LINBOX_ELL_TRANSPOSE ) { // and/or A.rowDensity(), A.coldim(),...
+ // std::cout << "optimizing..." ;
+ _optimized = true ;
+ _AT = new Self_t(A.field(),A.coldim(),A.rowdim());
+ A.transpose(*_AT);
+ // std::cout << "done!" << std::endl;
+ }
+ }
+
+ const Self_t & matrix() const
+ {
+ return *_AT ;
+ }
+
+ };
+
+
+
+ void reshape(const size_t ll)
+ {
+ linbox_check(_rownb*_maxc == _colid.size());
+ linbox_check(ll > _maxc);
+
+ _data .resize(ll*_rownb);
+ _colid.resize(ll*_rownb);
+ for (size_t i = _rownb ; i>0 ; --i ) {
+ // std::copy(_data.begin()+(i-1)*_maxc, _data.begin()+(i)*_maxc, _data.begin()+(i-1)*ll);
+ std::copy_backward(_data.begin()+(ptrdiff_t)((i-1)*_maxc), _data.begin()+(ptrdiff_t)((i)*_maxc), _data.begin()+(ptrdiff_t)((i-1)*ll+_maxc));
+ for (size_t j = (i-1)*ll+_maxc ; j < (i)*ll ; ++j )
+ _data[j] = field().zero ;
+ }
+ for (size_t i = _rownb ; i>0 ; --i ) {
+ // std::copy(_colid.begin()+(i-1)*_maxc, _colid.begin()+(i)*_maxc, _colid.begin()+(i-1)*ll);
+ std::copy_backward(_colid.begin()+(ptrdiff_t)((i-1)*_maxc), _colid.begin()+(ptrdiff_t)((i)*_maxc), _colid.begin()+(ptrdiff_t)((i-1)*ll+_maxc));
+ for (size_t j = (i-1)*ll+_maxc ; j < (i)*ll ; ++j )
+ _colid[j] = 0 ;
+ }
+
+ _maxc = ll ;
+ linbox_check(_rownb*_maxc == _colid.size());
+ }
+
+ public:
+ // pseudo iterators
+
+ size_t getColid(const size_t & i, const size_t j) const
+ {
+ linbox_check(i < _rownb);
+ linbox_check(_maxc*_rownb == _colid.size());
+ return _colid[i*_maxc+j];
+ }
+
+ void setColid(const size_t & i, const size_t & j, const size_t & k)
+ {
+ linbox_check(i < _rownb);
+ linbox_check(i*_maxc+j < _colid.size());
+ linbox_check(_maxc*_rownb == _colid.size());
+
+ _colid[i*_maxc+j]=k;
+ }
+
+ void setColid(std::vector<size_t> new_colid)
+ {
+ _colid = new_colid ;
+ }
+
+ std::vector<size_t> getColid( ) const
+ {
+ return _colid ;
+ }
+
+ const Element & getData(const size_t & i, const size_t & j) const
+ {
+ linbox_check(i < _rownb);
+ linbox_check(j < _colnb);
+ linbox_check(_maxc*_rownb == _colid.size());
+ return _data[ i*_maxc+j ];
+ }
+
+ void setData(const size_t & i, const size_t & j, const Element & e)
+ {
+ linbox_check(i*_maxc+j < _data.size());
+ linbox_check(_maxc*_rownb == _colid.size());
+ field().assign(_data[i*_maxc+j],e);
+ }
+
+ void setData(const std::vector<Element> & new_data)
+ {
+ _data = new_data ;
+ }
+
+ std::vector<Element> getData( ) const
+ {
+ return _data ;
+ }
+
+ size_t ld() const
+ {
+ return _maxc;
+ }
+
+ void firstTriple() const
+ {
+ _triples.reset();
+ }
+
+ // a zero means end of line
+ bool nextTriple(size_t & i, size_t &j, Element &e) const
+ {
+ size_t off = (size_t)_triples.next(_maxc);
+
+ i = (size_t)_triples._row ;
+
+ if ( i >= rowdim() ) {
+ _triples.reset() ;
+ return false ;
+ }
+
+ while ( field().isZero(_data[i*_maxc+off]) ) {
+ off = 0 ; i++;
+ _triples._off = (ptrdiff_t)off ;
+ _triples._row = (ptrdiff_t)i ;
+ if (i >= rowdim()) {
+ _triples.reset();
+ return false;
+ }
+ }
+
+ j = _colid[i*_maxc+off];
+ e = _data[i*_maxc+off];
+
+ return true;
+ }
+
+ template<class element_iterator, class Field>
+ class _Iterator {
+ private :
+ element_iterator _data_it ;
+ const element_iterator _data_beg ;
+ const element_iterator _data_end ;
+ const Field & _field ;
+ typedef typename Field::Element Element;
+ public:
+ typedef Element value_type ;
+ _Iterator(const Field & F , const element_iterator & e_beg, const element_iterator & e_end) :
+ _data_it(e_beg)
+ , _data_beg(e_beg)
+ , _data_end(e_end)
+ ,_field(F)
+ {}
+
+ _Iterator (const _Iterator &iter) :
+ _data_it(iter._data_it)
+ , _data_beg(iter._data_beg)
+ , _data_end(iter._data_end)
+ ,_field(iter._field)
+
+ {}
+
+ _Iterator &operator = (const _Iterator &iter)
+ {
+ _data_it = iter._data_it ;
+ _data_beg = iter._data_beg ;
+ _data_end = iter._data_end ;
+ _field = iter._field ;
+
+ return *this;
+ }
+
+ bool operator == (const _Iterator &i) const
+ {
+ return (_data_it == i._data_it) ;
+ }
+
+ bool operator != (const _Iterator &i) const
+ {
+ return (_data_it != i._data_it) ;
+ }
+
+ _Iterator &operator ++ ()
+ {
+ do {
+ ++_data_it ;
+ } while (_data_it != _data_end && _field.isZero(*_data_it));
+ if (_data_it == _data_end)
+ return *this ;
+ }
+
+ _Iterator operator ++ (int)
+ {
+ _Iterator tmp = *this;
+ ++(*this);
+ return tmp;
+ }
+
+ _Iterator &operator -- ()
+ {
+ throw NotImplementedYet("not sure");
+ do {
+ --_data_it ;
+ } while (_data_it != _data_beg && _field.isZero(*_data_it));
+ if (_data_it == _data_beg)
+ return *this ;
+ }
+
+ _Iterator operator -- (int)
+ {
+ _Iterator tmp = *this;
+ --(*this);
+ return tmp;
+ }
+
+ value_type &operator * ()
+ {
+ return *_data_it;
+ }
+
+ value_type *operator -> ()
+ {
+ return _data_it ;
+ }
+
+ const value_type &operator*() const
+ {
+ return *_data_it;
+ }
+
+ const value_type *operator -> () const
+ {
+ return _data_it ;
+ }
+
+ const value_type &value() const
+ {
+ return *_data_it;
+ }
+
+ };
+
+ template<class index_iterator, class element_iterator, class Field>
+ class _IndexedIterator {
+ private :
+ typedef index_iterator index_it ;
+ typedef element_iterator data_it ;
+ index_it _colid_beg ;
+ index_it _colid_it ;
+ data_it _data_it ;
+ const data_it _data_beg ;
+ const data_it _data_end ;
+ const Field & _field ;
+ const size_t & _ld ;
+ size_t _row ;
+ typedef typename Field::Element Element;
+ public:
+ typedef Element value_type ;
+ _IndexedIterator( const Field & F
+ , const size_t & ld
+ , const index_it &j
+ , const data_it &e
+ , const data_it &e_e) :
+ _colid_beg(j)
+ , _colid_it(j)
+ , _data_it(e)
+ , _data_beg(e)
+ , _data_end(e_e)
+ , _field(F)
+ , _ld(ld)
+ , _row(0)
+ {}
+
+ _IndexedIterator (const _IndexedIterator &iter) :
+ _colid_beg(iter._colid_beg)
+ , _colid_it(iter._colid_it)
+ , _data_it(iter._data_it)
+ , _data_beg(iter._data_beg)
+ , _data_end(iter._data_end)
+ , _field(iter._field)
+ , _ld(iter._ld)
+ , _row(iter._row)
+ {}
+
+ _IndexedIterator &operator = (const _IndexedIterator &iter)
+ {
+ _colid_beg = iter._colid_beg ;
+ _colid_it = iter._colid_it ;
+ _data_it = iter._data_it ;
+ _data_beg = iter._data_beg ;
+ _data_end = iter._data_end ;
+ _field = iter._field ;
+ _ld = iter._ld ;
+ _row = iter._row ;
+
+ return *this;
+ }
+
+ bool operator == (const _IndexedIterator &i) const
+ {
+ // we assume consistency
+ return (_data_it == i._data_it);
+ }
+
+ bool operator != (const _IndexedIterator &i) const
+ {
+ // we assume consistency
+ return (_data_it != i._data_it) ;
+ }
+
+ _IndexedIterator &operator ++ ()
+ {
+
+ ++_data_it ;
+ if (_data_it == _data_end) {
+ return *this ;
+ }
+ if (std::distance(_data_beg,_data_it) % _ld == 0)
+ ++_row ;
+
+ ++_colid_it ;
+ while (_field.isZero(*_data_it)) {
+ ++_row ;
+ _data_it = _data_beg + _row * _ld ;
+ _colid_it = _colid_beg + _row * _ld ;
+ if (_data_it == _data_end) {
+ return *this;
+ }
+ }
+
+ return *this;
+ }
+
+ _IndexedIterator operator ++ (int)
+ {
+ _IndexedIterator tmp = *this;
+ ++(*this);
+ return tmp;
+ }
+
+ _IndexedIterator &operator -- ()
+ {
+ throw NotImplementedYet("not sure");
+
+ --_data_it ;
+ if (_data_it == _data_beg) {
+ return *this ;
+ }
+ if (std::distance(_data_beg,_data_it) % _ld == 0)
+ --_row ;
+
+ --_colid_it ;
+ while (_field.isZero(*_data_it)) {
+ --_row ;
+ _data_it = _data_beg + _row * _ld ;
+ _colid_it = _colid_beg + _row * _ld ;
+ if (_data_it == _data_beg) {
+ return *this;
+ }
+ }
+
+ return *this;
+ }
+
+ _IndexedIterator operator -- (int)
+ {
+ _IndexedIterator tmp = *this;
+ --(*this);
+ return tmp;
+ }
+
+ value_type &operator * ()
+ {
+ return *_data_it;
+ }
+
+ value_type *operator -> ()
+ {
+ return _data_it ;
+ }
+
+ const value_type &operator*() const
+ {
+ return *_data_it;
+ }
+
+ const value_type *operator -> () const
+ {
+ return _data_it ;
+ }
+
+ size_t rowIndex () const
+ {
+ return _row;
+ }
+
+ size_t colIndex () const
+ {
+ return *_colid_it;
+ }
+
+ const value_type &value() const
+ {
+ return *_data_it;
+ }
+
+
+ };
+
+ typedef _Iterator<typename std::vector<Element>::iterator, Element> Iterator;
+ typedef _Iterator<typename std::vector<Element>::const_iterator, constElement> ConstIterator;
+
+ typedef _IndexedIterator<std::vector<size_t>::iterator, typename std::vector<Element>::iterator, Field> IndexedIterator;
+ typedef _IndexedIterator<std::vector<size_t>::const_iterator, typename std::vector<Element>::const_iterator, const Field> ConstIndexedIterator;
+
+
+ Iterator Begin ()
+ {
+ return Iterator(field(),_data.begin(),_data.end()) ;
+ }
+
+ Iterator End ()
+ {
+ return Iterator(field(),_data.end(), _data.end()) ;
+ }
+
+ ConstIterator Begin () const
+ {
+ return ConstIterator(field(),_data.begin(),_data.end()) ;
+ }
+
+ ConstIterator End () const
+ {
+ return ConstIterator(field(),_data.end(), _data.end()) ;
+ }
+
+ IndexedIterator IndexedBegin ()
+ {
+ return IndexedIterator(field(), _maxc , _colid.begin(), _data.begin(),_data.end()) ;
+ }
+
+ IndexedIterator IndexedEnd ()
+ {
+ return IndexedIterator(field(), _maxc, _colid.end(), _data.end(),_data.end()) ;
+ }
+
+ ConstIndexedIterator IndexedBegin () const
+ {
+ return ConstIndexedIterator(field(), _maxc, _colid.begin(), _data.begin(),_data.end()) ;
+ }
+
+ ConstIndexedIterator IndexedEnd () const
+ {
+ return ConstIndexedIterator(field(), _maxc, _colid.end(), _data.end(),_data.end()) ;
+ }
+
+
+
+ private:
+
+ void insert (const size_t i, const size_t k, const size_t j, const Element e)
+ {
+ linbox_check(_rownb*_maxc == _colid.size());
+ if (k == _maxc) {
+ resize(_rownb,_colnb,_nbnz,_maxc+1);
+ linbox_check(_rownb*_maxc == _colid.size());
+ _colid[_maxc*i+k] = j;
+ field().assign(_data[_maxc*i+k],e);
+ ++_nbnz;
+ return;
+ }
+ size_t l = k;
+ for ( ; l < _maxc ; ++l)
+ if (field().isZero(_data[i*_maxc+l]))
+ break;
+ if (l == _maxc)
+ resize(_rownb,_colnb,_nbnz,_maxc+1);
+
+ for (size_t u = l ; u > k ; --u) {
+ _colid[_maxc*i+u] = _colid[_maxc*i+u-1] ;
+ field().assign(_data[_maxc*i+u],_data[_maxc*i+u-1]);
+ }
+ _colid[_maxc*i+k] = j;
+ field().assign(_data[_maxc*i+k],e);
+ ++_nbnz;
+ linbox_check(_rownb*_maxc == _colid.size());
+ return;
+ }
+
+ void write_raw() const
+ {
+ std::cout << "colids" << std::endl;
+ for (size_t i = 0 ; i < _rownb ; ++i){
+ for (size_t j = 0 ; j < _maxc ; ++j)
+ std::cout << _colid[i*_maxc+j] << ' ' ;
+ std::cout << std::endl;
+ }
+
+ std::cout << "data" << std::endl;
+ for (size_t i = 0 ; i < _rownb ; ++i){
+ for (size_t j = 0 ; j < _maxc ; ++j)
+ std::cout << _data[i*_maxc+j] << ' ' ;
+ std::cout << std::endl;
+ }
+ }
+
+ protected :
+ friend class SparseMatrixWriteHelper<Self_t >;
+ friend class SparseMatrixReadHelper<Self_t >;
+
+
+ size_t _rownb ;
+ size_t _colnb ;
+ size_t _maxc ; //!< longest row
+ size_t _nbnz ;
+
+ std::vector<size_t> _colid ; //!< \p _colid is \p _rownb x \p _maxc in RowMajor
+ std::vector<Element> _data ; //!< \p _data is \p _rownb x \p _maxc in RowMajor
+
+ const _Field & _field;
+
+ mutable Helper _helper ;
+
+ mutable struct _triples {
+ ptrdiff_t _row ;
+ ptrdiff_t _off ;
+ _triples() :
+ _row(-1)
+ , _off(-1)
+ {}
+
+ ptrdiff_t next(size_t maxc)
+ {
+ ++ _off ;
+ if (_row == -1) {
+ ++_row ;
+ return _off ;
+ }
+ if (_off >= (ptrdiff_t)maxc) {
+ _row += 1 ;
+ _off = 0 ;
+ }
+ return _off;
+ }
+
+ void reset()
+ {
+ _row = -1 ;
+ _off = -1 ;
+ }
+ }_triples;
+ };
+
+
+
+
+
+} // namespace LinBox
+
+#endif // __LINBOX_matrix_sparsematrix_sparse_ell_matrix_H
+
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/matrix/sparsematrix/sparse-ellr-matrix.h b/linbox/matrix/sparsematrix/sparse-ellr-matrix.h
new file mode 100644
index 0000000..7aebf80
--- /dev/null
+++ b/linbox/matrix/sparsematrix/sparse-ellr-matrix.h
@@ -0,0 +1,1542 @@
+/* linbox/matrix/sparse-csr-matrix.h
+ * Copyright (C) 2013 the LinBox
+ *
+ * Written by :
+ * Brice Boyer (briceboyer) <boyer.brice at gmail.com>
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ * ========LICENCE========
+ */
+
+/*! @file matrix/sparsematrix/sparse-ellr-matrix.h
+ * @ingroup sparsematrix
+ * @brief
+ */
+
+
+#ifndef __LINBOX_matrix_sparsematrix_sparse_ellr_matrix_H
+#define __LINBOX_matrix_sparsematrix_sparse_ellr_matrix_H
+
+#include <utility>
+#include <iostream>
+#include <algorithm>
+
+#include "linbox/linbox-config.h"
+#include "linbox/util/debug.h"
+#include "linbox/field/hom.h"
+#include "sparse-domain.h"
+
+#ifndef LINBOX_ELLR_TRANSPOSE
+#define LINBOX_ELLR_TRANSPOSE 1000
+#endif
+
+namespace LinBox
+{
+
+
+ /** Sparse matrix, Coordinate storage.
+ *
+ * \ingroup matrix
+ * \ingroup sparse
+ */
+ template<class _Field>
+ class SparseMatrix<_Field, SparseMatrixFormat::ELL_R > {
+ public :
+ typedef _Field Field ; //!< Field
+ typedef typename _Field::Element Element ; //!< Element
+ typedef const Element constElement ; //!< const Element
+ typedef SparseMatrixFormat::ELL_R Storage ; //!< Matrix Storage Format
+ typedef SparseMatrix<_Field,Storage> Self_t ; //!< Self type
+ typedef typename Vector<Field>::SparseSeq Row ; //!< @warning this is not the row type. Just used for streams.
+ // typedef Vector<_Field,VectorStorage::Sparse> Rep ;
+
+ /*! Constructors.
+ * @todo convert from other matrix.
+ *
+ */
+ //@{
+#if 0 /* No empty CSTOR */
+ SparseMatrix<_Field, SparseMatrixFormat::ELL_R> () :
+ _rownb(0),_colnb(0),_maxc(0)
+ ,_nbnz(0)
+ ,_colid(0),_data(0)
+ ,_rowid(0)
+ , _field()
+ , _helper()
+ {
+ }
+#endif
+
+ SparseMatrix<_Field, SparseMatrixFormat::ELL_R> (const _Field & F) :
+ _rownb(0),_colnb(0)
+ ,_maxc(0)
+ ,_nbnz(0)
+ ,_rowid(0)
+ ,_colid(0)
+ ,_data(0)
+ , _field(F)
+ , _helper()
+ {
+ }
+
+ SparseMatrix<_Field, SparseMatrixFormat::ELL_R> (const _Field & F, size_t m, size_t n) :
+ _rownb(m),_colnb(n)
+ ,_maxc(0)
+ ,_nbnz(0)
+ ,_rowid(m,0)
+ ,_colid(0)
+ ,_data(0)
+ , _field(F)
+ , _helper()
+ {
+ }
+
+ SparseMatrix<_Field, SparseMatrixFormat::ELL_R> (const _Field & F,
+ size_t m, size_t n,
+ size_t z) :
+ _rownb(m),_colnb(n)
+ , _maxc(0)
+ , _nbnz(z)
+ , _rowid(m,0)
+ , _colid(z)
+ ,_data(z)
+ , _field(F)
+ , _helper()
+ {
+ }
+
+ SparseMatrix<_Field, SparseMatrixFormat::ELL_R> (const SparseMatrix<_Field, SparseMatrixFormat::CSR> & S) :
+ _rownb(S._rownb),_colnb(S._colnb)
+ ,_maxc(S._maxc)
+ ,_nbnz(S._nbnz)
+ ,_rowid(S._rownb,0)
+ , _colid(S._colid)
+ ,_data(S._data)
+ , _field(S._field)
+ , _helper()
+ {
+ }
+
+#if 0
+ template<class _OtherField>
+ SparseMatrix<_Field, SparseMatrixFormat::COO> (const SparseMatrix<_OtherField, SparseMatrixFormat::COO> & S) :
+ _rownb(S._rownb),_colnb(S._colnb),
+ _nbnz(S._nbnz),
+ _rowid(S._rowid),_colid(S._colid),_data(S._data),
+ _field(S._field)
+ {}
+#endif
+
+ template<typename _Tp1, typename _Rw1 = SparseMatrixFormat::ELL_R>
+ struct rebind {
+ typedef SparseMatrix<_Tp1, _Rw1> other;
+ private:
+
+ template<class _Rw>
+ void rebindMethod(SparseMatrix<_Tp1, _Rw> & Ap, const Self_t & A /*, IndexedCategory::HasNext */)
+ {
+ typename _Tp1::Element e;
+ Hom<typename Self_t::Field, _Tp1> hom(A.field(), Ap.field());
+
+ size_t i, j ;
+ Element f ;
+ A.firstTriple();
+ while ( A.nextTriple(i,j,f) ) {
+ linbox_check(i < A.rowdim() && j < A.coldim()) ;
+ hom. image ( e, f) ;
+ if (! Ap.field().isZero(e) )
+ Ap.appendEntry(i,j,e);
+ }
+ A.firstTriple();
+ Ap.finalize();
+ }
+
+ void rebindMethod(SparseMatrix<_Tp1, Storage> & Ap, const Self_t & A /*, IndexedCategory::HasNext*/)
+ {
+ // we don't use nextTriple because we can do better.
+ linbox_check(A.consistent());
+ // Ap = new other(F, A.rowdim(), A.coldim());
+ Ap.resize(A.rowdim(),A.coldim(),A.size(),A.ld());
+
+ typename _Tp1::Element e;
+
+ Hom<typename Self_t::Field, _Tp1> hom(A.field(), Ap.field());
+ size_t newz = 0 ;
+ for (size_t i = 0 ; i < A.rowdim() ; ++i) {
+ size_t j = 0 ;
+ for (size_t k = 0 ; k < A.ld() ; ++k) {
+ if (A.field().isZero(A.getData(i,k))) {
+ Ap.setRowid(i, k) ;
+ break;
+ }
+ hom. image ( e, A.getData(i,k) );
+ if (!Ap.field().isZero(e)) {
+ Ap.setColid(i,j,A.getColid(i,k));
+ Ap.setData(i,j,e);
+ ++j;
+ }
+ else {
+ ++newz ;
+ }
+ }
+ if (Ap.getRowid(i) == 0 && j>0)
+ Ap.setRowid(i, A.ld()) ;
+ }
+ Ap.setSize(Ap.size() - newz) ;
+ }
+
+ public:
+
+ void operator() (other & Ap, const Self_t& A)
+ {
+ rebindMethod(Ap, A );
+
+ }
+
+ };
+
+ template<typename _Tp1, typename _Rw1>
+ SparseMatrix (const SparseMatrix<_Tp1, _Rw1> &S, const Field& F) :
+ _rownb(S.rowdim()),_colnb(S.coldim())
+ ,_maxc(0)
+ ,_nbnz(S.size())
+ , _rowid(S.rowdim(),0)
+ , _colid(0)
+ ,_data(0)
+ , _field(F)
+ {
+ typename SparseMatrix<_Tp1,_Rw1>::template rebind<Field,Storage>()(*this, S);
+ finalize();
+ }
+
+
+
+
+ template<class VectStream>
+ SparseMatrix<_Field, SparseMatrixFormat::ELL_R> (const _Field & F, VectStream & stream) :
+ _rownb(stream.size()),_colnb(stream.dim())
+ , _maxc(0)
+ , _nbnz(0)
+ , _rowid(_rownb,0)
+ , _colid(0)
+ ,_data(0)
+ , _field(F)
+ {
+ //! @todo
+ SparseMatrix<_Field,SparseMatrixFormat::CSR> Tmp(F,stream);
+ importe(Tmp);
+ finalize();
+ }
+
+ SparseMatrix<_Field, SparseMatrixFormat::ELL_R> ( MatrixStream<Field>& ms ):
+ _rownb(0),_colnb(0)
+ ,_maxc(0)
+ ,_nbnz(0)
+ ,_colid(0)
+ ,_data(0)
+ ,_field(ms.field())
+ {
+ firstTriple();
+
+ Element val;
+ size_t i, j;
+ while( ms.nextTriple(i,j,val) ) {
+ if (! field().isZero(val)) {
+ if( i >= _rownb ) {
+ // _rownb = i + 1;
+ resize(i+1,_colnb,_nbnz,(size_t)_maxc);
+ }
+ if( j >= _colnb ) {
+ // _colnb = j + 1;
+ resize(_rownb,j+1,_nbnz,(size_t)_maxc);
+ }
+ appendEntry(i,j,val);
+ }
+ }
+ if( ms.getError() > END_OF_MATRIX )
+ throw ms.reportError(__func__,__LINE__);
+ if( !ms.getDimensions( i, j ) )
+ throw ms.reportError(__func__,__LINE__);
+#ifndef NDEBUG
+ if( i != _rownb || j != _colnb) {
+ std::cout << " ***Warning*** the sizes got changed" << __func__ << ',' << __LINE__ << std::endl;
+ }
+#endif
+
+ firstTriple();
+ finalize();
+ linbox_check(consistent());
+ }
+
+
+ void resize(const size_t mm, const size_t nn, const size_t zz = 0, const size_t ll = 0)
+ {
+ // linbox_check(_rownb*_maxc == _colid.size());
+ // attention RowMajor/ColMajor
+ if (!_maxc || mm == _maxc) {
+ _colid.resize(mm*ll,0);
+ _data .resize(mm*ll,field().zero);
+ _rowid.resize(mm ,0);
+ }
+ else if ( ll > _maxc) {
+ reshape(ll);
+ }
+ else {
+#ifndef NDEBUG
+ if (_maxc && ll != _maxc)
+ std::cout << " ***Warning*** possibly loosing data in ELL resize " << std::endl;
+#endif
+ _colid.resize(mm*ll,0);
+ _data .resize(mm*ll,field().zero);
+ _rowid.resize(mm ,0);
+ }
+ _rownb = mm ;
+ _colnb = nn ;
+ _nbnz = zz;
+ _maxc = ll;
+
+ linbox_check(_rownb*_maxc == _colid.size());
+ }
+
+ /*! Default converter.
+ * @param S a sparse matrix in any storage.
+ */
+ template<class _OtherStorage>
+ SparseMatrix<_Field, SparseMatrixFormat::ELL_R> (const SparseMatrix<_Field, _OtherStorage> & S) :
+ _rownb(S.rowdim()),_colnb(S.coldim())
+ ,_nbnz(S.size())
+ ,_rowid(S.rowdim(),0)
+ , _maxc(0)
+ ,_colid(0)
+ ,_data(0)
+ ,_field(S.field())
+ {
+ // _nbnz is set there:
+ this->importe(S); // convert Temp from anything
+ }
+
+
+
+ //@}
+ /*! Conversions.
+ * Any sparse matrix has a converter to/from CSR.
+ * A specialisation can skip the temporary CSR matrix created.
+ */
+ //@{
+ /*! Import a matrix in COO format to CSR.
+ * @param S COO matrix to be converted in CSR
+ */
+ void importe(const SparseMatrix<_Field,SparseMatrixFormat::CSR> &S)
+ {
+ // can be sped up on multicores.
+ for (size_t i = 0 ; i < S.rowdim() ; ++i)
+ _maxc = std::max(_maxc, (size_t)(S.getEnd(i)-S.getStart(i)));
+
+ resize(S.rowdim(), S.coldim(), S.size(),(size_t)_maxc);
+
+ for (size_t i = 0 ; i < S.rowdim() ; ++i) {
+ size_t k = 0 ;
+ for (size_t j = S.getStart(i) ; j < S.getEnd(i) ; ++j, ++k) {
+ setColid(i,k,S.getColid(j));
+ setData(i,k,S.getData(j));
+ }
+ _rowid[i] = S.getEnd(i)-S.getStart(i);
+ }
+
+ }
+
+ /*! Import a matrix in CSR format to CSR.
+ * @param S CSR matrix to be converted in CSR
+ */
+
+ void importe(const SparseMatrix<_Field,SparseMatrixFormat::ELL_R> &S)
+ {
+ resize( S.rowdim(), S.coldim(), S.size() , S.ld());
+
+ setRowid(S.getRowid());
+ setColid(S.getColid());
+ setData(S.getData());
+
+ }
+
+ template<class _OtherStorage>
+ void importe(const SparseMatrix<_Field,_OtherStorage> &S)
+ {
+ SparseMatrix<_Field,SparseMatrixFormat::CSR> Tmp(S);
+ this->importe(S);
+
+ }
+
+ /*! Export a matrix in CSR format from COO.
+ * @param S CSR matrix to be converted from COO
+ */
+ SparseMatrix<_Field,SparseMatrixFormat::CSR > &
+ exporte(SparseMatrix<_Field,SparseMatrixFormat::CSR> &S) const
+ {
+ linbox_check(consistent());
+
+ S.resize(_rownb, _colnb, _nbnz);
+ S.setStart(0,0);
+ size_t k = 0 ;
+ for (size_t i = 0 ; i < S.rowdim() ; ++i) {
+ for (size_t j = 0 ; j < _rowid[i]; ++j ) {
+ S.setColid(k,getColid(i,j));
+ S.setData(k,getData(i,j));
+ ++k;
+ }
+ S.setStart(i+1,S.getStart(i)+_rowid[i]);
+ }
+ linbox_check(k == _nbnz);
+
+ return S ;
+ }
+
+
+ //@}
+
+ /*! In place transpose. Not quite...
+ */
+ void transposeIn()
+ {
+ Self_t Temp(*this);
+ Temp.transpose(*this);
+ }
+
+ /*! Transpose the matrix.
+ * @param S [out] transpose of self.
+ * @return a reference to \p S.
+ */
+ Self_t &
+ transpose(Self_t &S) const
+ {
+ // outStart
+ size_t maxc = 0;
+ {
+ S._rowid.resize(coldim());
+ for (size_t i = 0 ; i < coldim() ; ++i)
+ S._rowid[i] = 0 ;
+
+ for (size_t i = 0 ; i < rowdim() ; ++i) {
+ for (size_t j = 0 ; j < _maxc ; ++j) {
+ if (!field().isZero(getData(i,j)))
+ S._rowid[getColid(i,j)] += 1 ;
+ else
+ break;
+ }
+ }
+
+ maxc = S._rowid[0] ;
+ for (size_t i = 1 ; i < coldim() ; ++i)
+ maxc= std::max(maxc, S._rowid[i]);
+ }
+
+
+
+ S.resize((size_t)_colnb, (size_t)_rownb, (size_t)_nbnz, (size_t)maxc ); // necessary copy to temp, no const ref
+
+ {
+ std::vector<size_t> done_col(coldim(),0);
+
+
+ for (size_t i = 0 ; i < rowdim() ; ++i) {
+ for (size_t j = 0 ; j < _maxc ; ++j) {
+ if (!field().isZero(getData(i,j))) {
+ size_t loc_col = getColid(i,j) ;
+ S.setData (loc_col,done_col[loc_col],getData(i,j));
+ S.setColid(loc_col,done_col[loc_col],i);
+
+ linbox_check(done_col[loc_col] < maxc);
+ done_col[loc_col] += 1 ;
+
+ }
+ else
+ break;
+ }
+ }
+ }
+
+ S.finalize();
+
+
+ return S;
+
+
+ }
+
+ /*! number of rows.
+ * @return row dimension.
+ */
+ size_t rowdim() const
+ {
+ return _rownb ;
+ }
+
+ /*! number of columns.
+ * @return column dimension
+ */
+ size_t coldim() const
+ {
+ return _colnb ;
+ }
+
+ /*! Number of non zero elements in the matrix.
+ * or at least the size of the _data if
+ * @return size of the _data.
+ */
+ size_t size() const
+ {
+ // return _data.size();
+ return _nbnz ;
+ }
+
+ void setSize(const size_t z)
+ {
+ _nbnz = z ;
+ }
+
+
+ /** Get a read-only individual entry from the matrix.
+ * @param i Row _colid
+ * @param j Column _colid
+ * @return Const reference to matrix entry
+ */
+ constElement &getEntry(const size_t &i, const size_t &j) const
+ {
+ ptrdiff_t off = _triples.next(_rowid);
+ if ( (_triples._row == (ptrdiff_t)i) && _colid[i*_maxc+off] == j ) { /* sort of nextTriple */
+ linbox_check(!field().isZero(_data[i*_maxc+off]));
+ return _data[i*_maxc+off];
+ }
+ else { /* searching */
+
+ linbox_check(consistent());
+
+ linbox_check(i<_rownb);
+ linbox_check(j<_colnb);
+
+ const size_t * beg = &_colid[i*_maxc];
+ const Element * dat = &_data[i*_maxc];
+ for (size_t k = 0 ; k < _maxc ; ++k) {
+ if ( field().isZero(dat[k])) {
+ return field().zero;
+ }
+ // replace
+ if (beg[k] == j) {
+ _triples._off = k;
+ _triples._row = i;
+ return dat[k];
+ }
+ if (beg[k] > j) {
+ return field().zero;
+ }
+ }
+ return field().zero;
+ }
+
+ }
+
+ Element &getEntry (Element &x, size_t i, size_t j) const
+ {
+ return x = getEntry (i, j);
+ }
+
+ void appendEntry(const size_t &i, const size_t &j, const Element& e)
+ {
+ linbox_check(i < rowdim());
+ linbox_check(j < coldim());
+ linbox_check(_colid.size() == _data.size());
+ linbox_check(_rownb*_maxc == _colid.size());
+
+ if (field().isZero(e)) {
+ return ;
+ }
+ ptrdiff_t row = _triples._row ;
+ ptrdiff_t off = _triples._off ;
+ if (row != (ptrdiff_t)i) { /* new row */
+ linbox_check((ptrdiff_t)i>row);
+ _triples._row = i ;
+ _triples._off = 0 ;
+ if (_maxc == 0) {
+ insert(i,_maxc,j,e);
+ }
+ else {
+ linbox_check(i*_maxc < _colid.size());
+ _colid[i*_maxc] = j ;
+ _data [i*_maxc] = e ;
+ _rowid[i] +=1;
+ ++_nbnz;
+ }
+ }
+ else { /* same row */
+ linbox_check(_triples._row == i);
+ _triples._off = off = off + 1 ;
+ if (off == (ptrdiff_t)_maxc) {
+ insert(i,_maxc,j,e);
+ }
+ else {
+ linbox_check(i*_maxc+off < _colid.size());
+ _colid[i*_maxc+off] = j ;
+ _data [i*_maxc+off] = e ;
+ _rowid[i] +=1;
+ ++_nbnz;
+ }
+
+ }
+ linbox_check(_rownb*_maxc == _colid.size());
+ }
+
+ /// make matrix ready to use after a sequence of setEntry calls.
+ void finalize(){
+ // could check that maxc is not too large and shrink ? Is is optimize job ?
+ _triples.reset();
+ } // end construction after a sequence of setEntry calls.
+
+ /** Set an individual entry.
+ * Setting the entry to 0 will not remove it from the matrix
+ * @param i Row _colid of entry
+ * @param j Column _colid of entry
+ * @param value Value of the new entry
+ * @todo make it faster if i is 0 or m-1 ?
+ * @warning if this is used to build a matrix and this matrix is "well formed",
+ * it can be sped up (no checking that the entry already exists).
+ */
+ void setEntry(const size_t &i, const size_t &j, const Element& e
+ )
+ {
+ linbox_check(i<_rownb);
+ linbox_check(j<_colnb);
+
+ linbox_check(consistent());
+
+ if (field().isZero(e)) {
+ return clearEntry(i,j);
+ }
+
+ size_t * beg = &_colid[i*_maxc];
+ Element * dat = &_data[i*_maxc];
+ bool found = false;
+ for (size_t k = 0 ; k < _maxc ; ++k) {
+ if ( field().isZero(dat[k])) {
+ field().assign(dat[k], e) ;
+ beg[k] = j;
+ found = true;
+ _rowid[i] +=1;
+ ++_nbnz ;
+ break;
+ }
+ if (beg[k] == j) {
+ if (field().isZero(dat[k])) {
+ _rowid[i] +=1;
+ ++_nbnz ;
+ }
+ field().assign(dat[k], e) ;
+ beg[k] = j;
+ found = true;
+ break;
+ }
+ if (beg[k] > j) {
+ found = true;
+ insert(i,k,j,e);
+ break;
+ }
+ }
+ if (!found) {
+ insert(i,_maxc,j,e);
+ }
+ }
+
+#if 0
+ /** Get a writeable reference to an entry in the matrix.
+ * If there is no entry at the position (i, j), then a new entry
+ * with a value of zero is inserted and a reference to it is
+ * returned.
+ * @param i Row _colid of entry
+ * @param j Column _colid of entry
+ * @return Reference to matrix entry
+ */
+ Element &refEntry(const size_t &i, const size_t&j)
+ {
+ linbox_check(i<_rownb);
+ linbox_check(j<_colnb);
+ // Could be improved by adding an initial guess j/rowdim*size()
+
+ size_t ibeg = _start[i];
+ size_t iend = _start[i+1];
+ if (ibeg==iend) {
+ for (size_t k = i+1 ; k <= _rownb ; ++k) _start[k] +=1 ;
+ _colid.insert(_colid.begin()+ibeg,j);
+ _data.insert( _data.begin() +ibeg,field().zero);
+ return _data[ibeg];
+ }
+ typedef typename std::vector<size_t>::iterator myIterator ;
+ myIterator beg = _colid.begin() ;
+ myIterator low = std::lower_bound (beg+(ptrdiff_t)ibeg, beg+(ptrdiff_t)iend, j);
+ if (low == beg+(ptrdiff_t)iend) {
+ for (size_t k = i+1 ; k <= _rownb ; ++k) _start[k] +=1 ;
+ _colid.insert(_colid.begin()+ibeg,j);
+ _data.insert( _data.begin() +ibeg,field().zero);
+ return _data[ibeg];
+ }
+ else {
+ size_t la = low-_colid.begin() ;
+ return _data[la] ;
+ }
+ }
+#endif
+
+ /** Write a matrix to the given output stream using field read/write.
+ * @param os Output stream to which to write the matrix
+ * @param format Format with which to write
+ */
+ std::ostream & write(std::ostream &os
+ , LINBOX_enum(Tag::FileFormat) format = Tag::FileFormat::MatrixMarket) const
+ {
+ return SparseMatrixWriteHelper<Self_t>::write(*this,os,format);
+ }
+
+
+ /** Read a matrix from the given input stream using field read/write
+ * @param is Input stream from which to read the matrix
+ * @param format Format of input matrix
+ * @return ref to \p is.
+ */
+ std::istream& read (std::istream &is
+ , LINBOX_enum(Tag::FileFormat) format = Tag::FileFormat::Detect)
+ {
+ return SparseMatrixReadHelper<Self_t>::read(*this,is,format);
+ }
+
+ /*! @internal
+ * @brief Deletes the entry.
+ * Deletes \c A(i,j) if it exists.
+ * @param i row _colid
+ * @param j col _colid
+ * @bug rows are increasing order => faster search.
+ */
+ void clearEntry(const size_t &i, const size_t &j)
+ {
+ linbox_check(i<_rownb);
+ linbox_check(j<_colnb);
+
+ size_t k = 0 ;
+ for ( ; k < _rowid[i] ; ++k) {
+ if (_colid[i*_maxc+k] == j)
+ break;
+ if (_colid[i*_maxc+k] > j)
+ return;
+ }
+ if (k == _rowid[i])
+ return; // not found
+
+ linbox_check(!field().isZero(_data[i*_maxc+k]));
+ return;
+
+ for (size_t l = k ; l <_rowid[i]-1 ; ++l) {
+ field().assign(_data[i*_maxc+l],_data[i*_maxc+l+1]);
+ _colid[i*_maxc+l] = _colid[i*_maxc+l+1];
+ }
+ field().assign(_data[i*_maxc+_rowid[i]-1],field().zero) ;
+ _colid[i*_maxc+_rowid[i]] = 0;
+ _rowid[i] -= 1 ;
+ --_nbnz;
+ }
+
+ /*! @internal
+ * @brief cleans 0 entries.
+ */
+ void clean()
+ {
+#if 0
+ size_t i = 0 ;
+ while(i < _data.size()) {
+ if ( field().isZero(_data[i]) ) {
+ for (size_t k = i+1 ; k <= _rownb ; ++k) _start[k] -= 1 ;
+ _colid.erase(_colid.begin()+i);
+ _data. erase(_data. begin()+i);
+ }
+ else
+ ++i ;
+ }
+ return ;
+#endif
+ }
+
+ // y= Ax
+ // y[i] = sum(A(i,j) x(j)
+ template<class Vector>
+ Vector& apply(Vector &y, const Vector& x, const Element & a ) const
+ {
+ // linbox_check(consistent());
+ prepare(field(),y,a);
+
+
+ FieldAXPY<Field> accu(field());
+ for (size_t i = 0 ; i < _rownb ; ++i) {
+ accu.reset();
+ for (size_t k = 0 ; k < _rowid[i] ; ++k)
+ // field().axpyin( y[i], getData(i,k), x[getColid(i,k)] ); //! @todo delay !!!
+ accu.mulacc( getData(i,k), x[getColid(i,k)] );
+ accu.get(y[i]);
+ }
+
+ return y;
+ }
+
+
+ // y= A^t x
+ // y[i] = sum(A(j,i) x(j)
+ template<class Vector>
+ Vector& applyTranspose(Vector &y, const Vector& x, const Element & a ) const
+ {
+ // linbox_check(consistent());
+ if (_helper.optimized(*this)) {
+ return _helper.matrix().apply(y,x,a) ; // NEVER use applyTranspose on that thing.
+ }
+
+ prepare(field(),y,a);
+
+#if 0
+ for (size_t i = 0 ; i < _rownb ; ++i)
+ for (size_t k = 0 ; k < _rowid[i] ; ++k)
+ field().axpyin( y[getColid(i,k)], getData(i,k), x[i] ); //! @todo delay !!!
+#else
+ const FieldAXPY<Field> accu0(field());
+ std::vector<FieldAXPY<Field> > Y(_colnb, accu0);
+
+ for (size_t i = 0 ; i < _rownb ; ++i)
+ for (size_t k = 0 ; k < _rowid[i] ; ++k) {
+ Y[getColid(i,k)].mulacc( getData(i,k), x[i] );
+ // Y[_colid[ i*_maxc+k ]].mulacc( _data[ i*_maxc+k ], x[i] );
+ }
+
+ for (size_t i = 0 ; i < _colnb ; ++i)
+ Y[i].get(y[i]) ;
+#endif
+
+
+
+ return y;
+ }
+
+
+
+ template<class inVector, class outVector>
+ outVector& apply(outVector &y, const inVector& x ) const
+ {
+ return apply(y,x,field().zero);
+ }
+
+ template<class inVector, class outVector>
+ outVector& applyTranspose(outVector &y, const inVector& x ) const
+ {
+ return applyTranspose(y,x,field().zero);
+ }
+
+ const Field & field() const
+ {
+ return _field ;
+ }
+
+ bool consistent() const
+ {
+ size_t nbnz = 0 ;
+ // bool ok = true ;
+ for (size_t i = 0 ; i < _rownb ; ++i) {
+ // bool row_ok = true ;
+ bool zero = false ;
+ for (size_t j = 0 ; j < _maxc ; ++j) {
+ if (field().isZero(getData(i,j))) {
+ if (_rowid[i] != j && !zero) {
+ std::cout << "@" << i << " : " << _rowid[i] <<"!=" << j << std::endl;
+ return false ;
+ }
+ zero = true ;
+ }
+ else {
+ if (zero) {
+ std::cout << "@" << i << " : " << _rowid[i] <<"!= 0 (should be)" << std::endl;
+ return false ; // elements after a 0...
+ }
+ ++nbnz ;
+
+ }
+ }
+ if(!zero)
+ if (_rowid[i] != _maxc) {
+ std::cout << "@" << i << " : " << _rowid[i] <<"!= " << _maxc << " (should be)" << std::endl;
+ return false;
+ }
+ }
+ if (nbnz != _nbnz)
+ std::cout << "bad number of non zero" << std::endl;
+ return (nbnz == _nbnz);
+
+ }
+
+
+
+ private :
+
+ class Helper {
+ bool _useable ;
+ bool _optimized ;
+ bool blackbox_usage ;
+ Self_t *_AT ;
+ public:
+
+ Helper() :
+ _useable(false)
+ ,_optimized(false)
+ , blackbox_usage(true)
+ , _AT(NULL)
+ {}
+
+ ~Helper()
+ {
+ if ( _AT ) {
+ delete _AT ;
+ }
+ }
+
+ bool optimized(const Self_t & A)
+ {
+ if (!_useable) {
+ getHelp(A);
+ _useable = true;
+ }
+ return _optimized;
+ }
+
+ void getHelp(const Self_t & A)
+ {
+ if ( A.size() > LINBOX_ELL_TRANSPOSE ) { // and/or A.rowDensity(), A.coldim(),...
+ // std::cout << "optimizing..." ;
+ _optimized = true ;
+ _AT = new Self_t(A.field(),A.coldim(),A.rowdim());
+ A.transpose(*_AT);
+ // std::cout << "done!" << std::endl;
+ }
+ }
+
+ const Self_t & matrix() const
+ {
+ return *_AT ;
+ }
+
+ };
+
+
+ //! @todo much less needs to be copied (faster?)
+ void reshape(const size_t ll)
+ {
+ linbox_check(_rownb*_maxc == _colid.size());
+ linbox_check(ll > _maxc);
+
+ _data .resize(ll*_rownb);
+ _colid.resize(ll*_rownb);
+ for (size_t i = _rownb ; i>0 ; --i ) {
+ // std::copy(_data.begin()+(i-1)*_maxc, _data.begin()+(i)*_maxc, _data.begin()+(i-1)*ll);
+ std::copy_backward(_data.begin()+(ptrdiff_t)((i-1)*_maxc), _data.begin()+(ptrdiff_t)((i)*_maxc), _data.begin()+(ptrdiff_t)((i-1)*ll+_maxc));
+ for (size_t j = (i-1)*ll+_maxc ; j < (i)*ll ; ++j )
+ _data[j] = field().zero ;
+ }
+ for (size_t i = _rownb ; i>0 ; --i ) {
+ // std::copy(_colid.begin()+(i-1)*_maxc, _colid.begin()+(i)*_maxc, _colid.begin()+(i-1)*ll);
+ std::copy_backward(_colid.begin()+(ptrdiff_t)((i-1)*_maxc), _colid.begin()+(ptrdiff_t)((i)*_maxc), _colid.begin()+(ptrdiff_t)((i-1)*ll+_maxc));
+ for (size_t j = (i-1)*ll+_maxc ; j < (i)*ll ; ++j )
+ _colid[j] = 0 ;
+ }
+
+ _maxc = ll ;
+ linbox_check(_rownb*_maxc == _colid.size());
+ }
+
+ public:
+ // pseudo iterators
+ size_t getRowid(const size_t & i) const
+ {
+ return _rowid[i];
+ }
+
+ void setRowid(const size_t & i, const size_t & k)
+ {
+ linbox_check(i <= _rownb);
+ _rowid[i]=k;
+ }
+
+ void setRowid(std::vector<size_t> new_rowid)
+ {
+ _rowid = new_rowid ;
+ }
+
+ size_t getColid(const size_t & i, const size_t j) const
+ {
+ linbox_check(i < _rownb);
+ linbox_check(_maxc*_rownb == _colid.size());
+ return _colid[i*_maxc+j];
+ }
+
+ void setColid(const size_t & i, const size_t & j, const size_t & k)
+ {
+ linbox_check(i < _rownb);
+ linbox_check(i*_maxc+j < _colid.size());
+ linbox_check(_maxc*_rownb == _colid.size());
+
+ _colid[i*_maxc+j]=k;
+ }
+
+ void setColid(std::vector<size_t> new_colid)
+ {
+ _colid = new_colid ;
+ }
+
+ std::vector<size_t> getColid( ) const
+ {
+ return _colid ;
+ }
+
+ const Element & getData(const size_t & i, const size_t & j) const
+ {
+ linbox_check(i < _rownb);
+ linbox_check(j < _colnb);
+ linbox_check(_maxc*_rownb == _colid.size());
+ return _data[ i*_maxc+j ];
+ }
+
+ void setData(const size_t & i, const size_t & j, const Element & e)
+ {
+ linbox_check(i*_maxc+j < _data.size());
+ linbox_check(_maxc*_rownb == _colid.size());
+ field().assign(_data[i*_maxc+j],e);
+ }
+
+ void setData(const std::vector<Element> & new_data)
+ {
+ _data = new_data ;
+ }
+
+ std::vector<Element> getData( ) const
+ {
+ return _data ;
+ }
+
+ size_t ld() const
+ {
+ return _maxc;
+ }
+
+ void firstTriple() const
+ {
+ _triples.reset();
+ }
+
+ bool nextTriple(size_t & i, size_t &j, Element &e) const
+ {
+ size_t off = (size_t)_triples.next(_rowid);
+
+ i = (size_t)_triples._row ;
+
+ if ( i >= rowdim() ) {
+ _triples.reset() ;
+ return false ;
+ }
+
+ j = _colid[i*_maxc+off];
+ e = _data[i*_maxc+off];
+
+ return true;
+ }
+
+ template<class element_iterator, class Field>
+ class _Iterator {
+ private :
+ element_iterator _data_it ;
+ const element_iterator _data_beg ;
+ const element_iterator _data_end ;
+ const Field & _field ;
+ const std::vector<size_t> & _rowid ;
+ const size_t & _ld ;
+ size_t _row ;
+ typedef typename Field::Element Element;
+ public:
+ typedef Element value_type ;
+ _Iterator(const Field & F , const std::vector<size_t> & rowid, const size_t & ld, const element_iterator & e_beg, const element_iterator & e_end) :
+ _data_it(e_beg)
+ , _data_beg(e_beg)
+ , _data_end(e_end)
+ ,_field(F)
+ ,_rowid (rowid)
+ ,_ld(ld)
+ ,_row(0)
+
+ {}
+
+ _Iterator (const _Iterator &iter) :
+ _data_it(iter._data_it)
+ , _data_beg(iter._data_beg)
+ , _data_end(iter._data_end)
+ ,_field(iter._field)
+ ,_rowid(iter._rowid)
+ ,_ld(iter._ld)
+ ,_row(iter._row)
+
+ {}
+
+ _Iterator &operator = (const _Iterator &iter)
+ {
+ _data_it = iter._data_it ;
+ _data_beg = iter._data_beg ;
+ _data_end = iter._data_end ;
+ _field = iter._field ;
+ _rowid = iter._rowid;
+ _ld = iter._ld ;
+ _row = iter._row ;
+
+ return *this;
+ }
+
+ bool operator == (const _Iterator &i) const
+ {
+ return (_data_it == i._data_it) ;
+ }
+
+ bool operator != (const _Iterator &i) const
+ {
+ return (_data_it != i._data_it) ;
+ }
+
+ _Iterator &operator ++ ()
+ {
+ size_t idx = std::distance(_data_beg,_data_it) % _ld ;
+ while (_row < _rowid.size() && idx >= _rowid[_row]) {
+ idx = 0 ;
+ ++_row ;
+ }
+
+ if (_row == _rowid.size()) {
+ _data_it = _data_end ;
+ return *this;
+ }
+
+ _data_it = _data_beg + _ld * _row + idx ;
+ if (_data_it == _data_end)
+ return *this ;
+ }
+
+ _Iterator operator ++ (int)
+ {
+ _Iterator tmp = *this;
+ ++(*this);
+ return tmp;
+ }
+
+ _Iterator &operator -- ()
+ {
+ throw NotImplementedYet("not sure");
+ size_t idx = std::distance(_data_beg,_data_it) % _ld ;
+ while ((ptrdiff_t)_row >= 0 && idx >= _rowid[_row]) {
+ idx = 0 ;
+ --_row ;
+ }
+
+ if ((ptrdiff_t)_row < 0) {
+ _data_it = _data_beg ;
+ return *this;
+ }
+
+ _data_it = _data_beg + _ld * _row + idx ;
+ if (_data_it == _data_beg)
+ return *this ;
+ }
+
+ _Iterator operator -- (int)
+ {
+ _Iterator tmp = *this;
+ --(*this);
+ return tmp;
+ }
+
+ value_type &operator * ()
+ {
+ return *_data_it;
+ }
+
+ value_type *operator -> ()
+ {
+ return _data_it ;
+ }
+
+ const value_type &operator*() const
+ {
+ return *_data_it;
+ }
+
+ const value_type *operator -> () const
+ {
+ return _data_it ;
+ }
+
+ const value_type &value() const
+ {
+ return *_data_it;
+ }
+
+ };
+
+ template<class index_iterator, class element_iterator, class Field>
+ class _IndexedIterator {
+ private :
+ typedef index_iterator index_it ;
+ typedef element_iterator data_it ;
+ index_it _rowid_it ;
+ index_it _colid_beg ;
+ index_it _colid_it ;
+ data_it _data_it ;
+ const data_it _data_beg ;
+ const data_it _data_end ;
+ const Field & _field ;
+ const size_t & _ld ;
+ size_t _row ;
+ typedef typename Field::Element Element;
+ public:
+ typedef Element value_type ;
+ _IndexedIterator( const Field & F
+ , const size_t & ld
+ , const index_it &i
+ , const index_it &j
+ , const data_it &e
+ , const data_it &e_e) :
+ _rowid_it(i)
+ , _colid_beg(j)
+ , _colid_it(j)
+ , _data_it(e)
+ , _data_beg(e)
+ , _data_end(e_e)
+ , _field(F)
+ , _ld(ld)
+ , _row(0)
+ {}
+
+ _IndexedIterator (const _IndexedIterator &iter) :
+ _rowid_it(iter._rowid_it)
+ , _colid_beg(iter._colid_beg)
+ , _colid_it(iter._colid_it)
+ , _data_it(iter._data_it)
+ , _data_beg(iter._data_beg)
+ , _data_end(iter._data_end)
+ , _field(iter._field)
+ , _ld(iter._ld)
+ , _row(iter._row)
+ {}
+
+ _IndexedIterator &operator = (const _IndexedIterator &iter)
+ {
+ _rowid_it = iter._rowid_it ;
+ _colid_beg = iter._colid_beg ;
+ _colid_it = iter._colid_it ;
+ _data_it = iter._data_it ;
+ _data_beg = iter._data_beg ;
+ _data_end = iter._data_end ;
+ _field = iter._field ;
+ _ld = iter._ld ;
+ _row = iter._row ;
+
+ return *this;
+ }
+
+ bool operator == (const _IndexedIterator &i) const
+ {
+ // we assume consistency
+ return (_data_it == i._data_it);
+ }
+
+ bool operator != (const _IndexedIterator &i) const
+ {
+ // we assume consistency
+ return (_data_it != i._data_it) ;
+ }
+
+ _IndexedIterator &operator ++ ()
+ {
+
+ ++_data_it ;
+ if (_data_it == _data_end) {
+ return *this ;
+ }
+ ++_colid_it ;
+
+ bool new_row = false ;
+
+ while (std::distance(_data_beg,_data_it) % _ld >= *_rowid_it) {
+ ++_row ;
+ ++_rowid_it ;
+ new_row = true;
+ }
+
+ if (new_row) {
+ _data_it = _data_beg + _row * _ld ;
+ _colid_it = _colid_beg + _row * _ld ;
+ }
+
+ return *this;
+ }
+
+ _IndexedIterator operator ++ (int)
+ {
+ _IndexedIterator tmp = *this;
+ ++(*this);
+ return tmp;
+ }
+
+ _IndexedIterator &operator -- ()
+ {
+ throw NotImplementedYet("not sure");
+
+ --_data_it ;
+ if (_data_it == _data_beg) {
+ return *this ;
+ }
+ --_colid_it ;
+
+ bool new_row = false ;
+
+ // will not work
+ while (std::distance(_data_beg,_data_it) % _ld >= *_rowid_it ) {
+ --_row ;
+ --_rowid_it ;
+ new_row = true;
+ }
+
+ if (new_row) {
+ _data_it = _data_beg + _row * _ld ;
+ _colid_it = _colid_beg + _row * _ld ;
+ }
+
+ return *this;
+ }
+
+ _IndexedIterator operator -- (int)
+ {
+ _IndexedIterator tmp = *this;
+ --(*this);
+ return tmp;
+ }
+
+ value_type &operator * ()
+ {
+ return *_data_it;
+ }
+
+ value_type *operator -> ()
+ {
+ return _data_it ;
+ }
+
+ const value_type &operator*() const
+ {
+ return *_data_it;
+ }
+
+ const value_type *operator -> () const
+ {
+ return _data_it ;
+ }
+
+ size_t rowIndex () const
+ {
+ return _row;
+ }
+
+ size_t colIndex () const
+ {
+ return *_colid_it;
+ }
+
+ const value_type &value() const
+ {
+ return *_data_it;
+ }
+
+
+ };
+
+ typedef _Iterator<typename std::vector<Element>::iterator, Element> Iterator;
+ typedef _Iterator<typename std::vector<Element>::const_iterator, constElement> ConstIterator;
+
+ typedef _IndexedIterator<std::vector<size_t>::iterator, typename std::vector<Element>::iterator, Field> IndexedIterator;
+ typedef _IndexedIterator<std::vector<size_t>::const_iterator, typename std::vector<Element>::const_iterator, const Field> ConstIndexedIterator;
+
+
+ Iterator Begin ()
+ {
+ return Iterator(field(),_rowid,_maxc,_data.begin(),_data.end()) ;
+ }
+
+ Iterator End ()
+ {
+ return Iterator(field(),_rowid,_maxc,_data.end(), _data.end()) ;
+ }
+
+ ConstIterator Begin () const
+ {
+ return ConstIterator(field(),_rowid,_maxc,_data.begin(),_data.end()) ;
+ }
+
+ ConstIterator End () const
+ {
+ return ConstIterator(field(),_rowid,_maxc,_data.end(), _data.end()) ;
+ }
+
+ IndexedIterator IndexedBegin ()
+ {
+ return IndexedIterator(field(), _maxc , _rowid.begin(), _colid.begin(), _data.begin(),_data.end()) ;
+ }
+
+ IndexedIterator IndexedEnd ()
+ {
+ return IndexedIterator(field(), _maxc, _rowid.begin(), _colid.end(), _data.end(),_data.end()) ;
+ }
+
+ ConstIndexedIterator IndexedBegin () const
+ {
+ return ConstIndexedIterator(field(), _maxc, _rowid.begin(), _colid.begin(), _data.begin(),_data.end()) ;
+ }
+
+ ConstIndexedIterator IndexedEnd () const
+ {
+ return ConstIndexedIterator(field(), _maxc, _rowid.begin(), _colid.end(), _data.end(),_data.end()) ;
+ }
+
+
+
+ private:
+
+ void insert (const size_t i, const size_t k, const size_t j, const Element e)
+ {
+ linbox_check(_rownb*_maxc == _colid.size());
+ if (k == _maxc) {
+ resize(_rownb,_colnb,_nbnz,_maxc+1);
+ linbox_check(_rownb*_maxc == _colid.size());
+ _colid[_maxc*i+k] = j;
+ field().assign(_data[_maxc*i+k],e);
+ ++_nbnz;
+ _rowid[i] += 1;
+ return;
+ }
+ size_t l = k;
+ for ( ; l < _maxc ; ++l)
+ if (field().isZero(_data[i*_maxc+l]))
+ break;
+ if (l == _maxc)
+ resize(_rownb,_colnb,_nbnz,_maxc+1);
+
+ for (size_t u = l ; u > k ; --u) {
+ _colid[_maxc*i+u] = _colid[_maxc*i+u-1] ;
+ field().assign(_data[_maxc*i+u],_data[_maxc*i+u-1]);
+ }
+ _colid[_maxc*i+k] = j;
+ field().assign(_data[_maxc*i+k],e);
+ ++_nbnz;
+ _rowid[i] += 1;
+ linbox_check(_rownb*_maxc == _colid.size());
+ return;
+ }
+
+ void write_raw() const
+ {
+ std::cout << "rowids" << std::endl;
+ std::cout << _rowid << std::endl;
+ std::cout << "colids" << std::endl;
+ for (size_t i = 0 ; i < _rownb ; ++i){
+ for (size_t j = 0 ; j < _maxc ; ++j)
+ std::cout << _colid[i*_maxc+j] << ' ' ;
+ std::cout << std::endl;
+ }
+
+ std::cout << "data" << std::endl;
+ for (size_t i = 0 ; i < _rownb ; ++i){
+ for (size_t j = 0 ; j < _maxc ; ++j)
+ std::cout << _data[i*_maxc+j] << ' ' ;
+ std::cout << std::endl;
+ }
+ }
+
+ protected :
+ friend class SparseMatrixWriteHelper<Self_t >;
+ friend class SparseMatrixReadHelper<Self_t >;
+
+
+ size_t _rownb ;
+ size_t _colnb ;
+ size_t _maxc ; //!< longest row
+ size_t _nbnz ;
+
+ std::vector<size_t> _rowid ;
+ std::vector<size_t> _colid ; //!< \p _colid is \p _rownb x \p _maxc in RowMajor
+ std::vector<Element> _data ; //!< \p _data is \p _rownb x \p _maxc in RowMajor
+
+ const _Field & _field;
+
+ mutable Helper _helper ;
+
+ mutable struct _triples {
+ ptrdiff_t _row ;
+ ptrdiff_t _off ;
+ _triples() :
+ _row(-1)
+ , _off(-1)
+ {}
+
+ ptrdiff_t next(const std::vector<size_t> & rowid)
+ {
+ ++ _off ;
+ if (_row == -1) {
+ ++_row ;
+ }
+ while (_off >= (ptrdiff_t)rowid[(size_t)_row]) {
+ _row += 1 ;
+ _off = 0 ;
+ if (_row >= (ptrdiff_t)rowid.size())
+ break;
+ }
+ return _off;
+ }
+
+ void reset()
+ {
+ _row = -1 ;
+ _off = -1 ;
+ }
+ }_triples;
+ };
+
+
+
+
+
+} // namespace LinBox
+
+#endif // __LINBOX_matrix_sparsematrix_sparse_ellr_matrix_H
+
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/matrix/sparsematrix/sparse-generic.h b/linbox/matrix/sparsematrix/sparse-generic.h
new file mode 100644
index 0000000..26db2fd
--- /dev/null
+++ b/linbox/matrix/sparsematrix/sparse-generic.h
@@ -0,0 +1,538 @@
+/* linbox/matrix/sparse-matrix.h
+ * Copyright (C) 2001-2002 Bradford Hovinen
+ * 1999-2001 William J Turner,
+ *
+ * Written by William J Turner <wjturner at math.ncsu.edu>,
+ * Bradford Hovinen <hovinen at cis.udel.edu>
+ *
+ * --------------------------------------------------------
+ * 2003-01-11 Bradford Hovinen <bghovinen at math.uwaterloo.ca>
+ *
+ * Move from blackbox/sparse-base.h to matrix/sparse-matrix.h
+ * ------------------------------------
+ * 2002-11-28 Bradford Hovinen <bghovinen at math.uwaterloo.ca>
+ *
+ * - Renamed ColOfRowsIterator to RowIterator
+ * - Named template argument _Row rather than Row; add a typedef to Row
+ * - Named template argument _Element rather than Row; add a typedef to Element
+ * - Renamed IndexIterator as IndexedIterator, and adjusted to match
+ * interface in DenseMatrixBase
+ * ------------------------------------
+ * 2002-08-06 Bradford Hovinen <hovinen at cis.udel.edu>
+ *
+ * Renamed to sparse-base.h from sparse0-base.h
+ * ------------------------------------
+ * Modified by Bradford Hovinen <hovinen at cis.udel.edu>
+ *
+ * Refactoring:
+ * - Eliminated SparseMatrixAux and moved that functionality into Sparse0
+ * - Made SparseMatrixGeneric parameterized only on the element type
+ * - New read/write implementations for SparseMatrixGeneric, supporting multiple
+ * formats
+ * - Eliminated Gaussian elimination code
+ * - Added iterators, including ColOfRowsIterator, Iterator, and
+ * IndexIterator
+ * - Eliminated operator []; added getEntry; changed put_value to setEntry
+ * ------------------------------------
+ *
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ * ========LICENCE========
+ *.
+ */
+
+/** @file linbox/matrix/sparsematrix/sparse-generic.h
+ * @brief
+ */
+
+#ifndef __LINBOX_matrix_sparsematrix_sparse_generic_H
+#define __LINBOX_matrix_sparsematrix_sparse_generic_H
+
+
+#ifndef _SP_BB_VECTOR_
+#include <vector>
+#define _SP_BB_VECTOR_ std::vector
+#endif
+
+#include <utility>
+#include <iostream>
+#include <algorithm>
+
+#include "linbox/linbox-config.h"
+#include "linbox/util/debug.h"
+#include "linbox/linbox-tags.h"
+#include "linbox/matrix/sparse-formats.h"
+#include "linbox/matrix/matrix-domain.h"
+#include "linbox/matrix/transpose-matrix.h"
+#include "linbox/vector/vector-traits.h"
+#include "linbox/util/matrix-stream.h"
+#include "linbox/solutions/solution-tags.h"
+#include "linbox/matrix/matrix-traits.h"
+#include "linbox/field/hom.h"
+
+
+
+
+namespace LinBox { /* forward declarations */
+ template<class Field>
+ class MatrixDomain ;
+} // LinBox
+
+namespace LinBox { namespace Protected { /* SparseMatrixGeneric defaults */
+ template <class _Field,
+ class _Row = typename RawVector<typename _Field::Element>::Sparse,
+ class Trait = typename VectorTraits<_Row>::VectorCategory >
+ class SparseMatrixGeneric;
+} // Protected
+} // LinBox
+
+namespace LinBox { /* read write helper */
+ template<class Matrix>
+ class SparseMatrixWriteHelper ;
+
+ template<class Matrix>
+ class SparseMatrixReadHelper ;
+} // LinBox
+
+namespace LinBox { namespace Protected { /* SparseMatrixGeneric */
+
+ /** Sparse matrix container
+ * This class acts as a generic row-wise container for sparse
+ * matrices. It is designed to provide various methods to access the
+ * entries of the matrix.
+ * It meets the blackbox archetype
+ * @tparam _Field Field type
+ * @tparam _Row LinBox sparse vector type to use for rows of matrix
+ \ingroup matrix
+ */
+ template <class _Field, class _Row, class Trait>
+ class SparseMatrixGeneric {
+ public:
+
+ typedef _Field Field;
+ typedef typename Field::Element Element;
+ typedef _Row Row;
+ typedef const Row ConstRow;
+ typedef typename _SP_BB_VECTOR_<Row> Rep;
+ typedef SparseMatrixGeneric<_Field, _Row, Trait> Self_t;
+
+#ifdef __LINBOX_PARALLEL
+ BB_list_list sub_list;
+#endif
+
+
+
+ /** Constructor.
+ * Note: the copy constructor and operator= will work as intended
+ * because of STL's container design
+ * @param m row dimension
+ * @param n column dimension
+ */
+ SparseMatrixGeneric (const Field & F,size_t m, size_t n) :
+ _field (F),
+ _MD(F),_AT(*this),
+ _matA(m), _m(m), _n(n)
+ {};
+
+ SparseMatrixGeneric (const Field & F) :
+ _field (F),
+ _MD(F),_AT(*this),
+ _matA(0), _m(0), _n(0)
+ {};
+
+
+
+ /** Constructor from a MatrixStream
+ */
+ SparseMatrixGeneric ( MatrixStream<Field>& ms );
+
+
+ /** Copy constructor.
+ */
+ SparseMatrixGeneric (const SparseMatrixGeneric<Field, Row, Trait> &A);
+
+ /** Convert constructor.
+ */
+ template<class VectorType>
+ SparseMatrixGeneric (const SparseMatrixGeneric<Field, VectorType, Trait> &A);
+
+ template<typename _Tp1, typename _R1 = typename Rebind<_Row,_Tp1>::other >
+ struct rebind {
+ typedef SparseMatrixGeneric<_Tp1, _R1> other;
+
+ void operator() (other & Ap, const Self_t& A) {
+
+ typename _Tp1::Element e;
+
+ Hom<typename Self_t::Field, _Tp1> hom(A.field(), Ap.field());
+ for( typename Self_t::ConstIndexedIterator
+ indices = A.IndexedBegin();
+ indices != A.IndexedEnd() ;
+ ++indices ) {
+ hom. image (e, indices.value() );
+ if (!Ap.field().isZero(e))
+ Ap.setEntry (indices.rowIndex(),
+ indices.colIndex(), e);
+ }
+ }
+
+ };
+
+ template<typename _Tp1, typename _Rw1, typename _myT>
+ SparseMatrixGeneric (const SparseMatrixGeneric<_Tp1, _Rw1, _myT> &Mat, const Field& F) :
+ _field (&F),
+ _MD (F), _AT (*this)
+ , _matA (Mat.rowdim()), _m (Mat.rowdim()), _n (Mat.coldim())
+ {
+ typename SparseMatrixGeneric<_Tp1,_Rw1, _myT>::template rebind<Field,_Row>()(*this, Mat);
+ }
+
+ template<class VectStream>
+ SparseMatrixGeneric (const Field &F, VectStream &stream) :
+ _field (F), _MD (F), _AT (*this)
+ , _matA (stream.size()), _m (stream.size()), _n (stream.dim())
+ {
+ typename Self_t::RowIterator i;
+
+ for (i = Self_t::rowBegin (); i != Self_t::rowEnd (); ++i)
+ stream >> *i;
+ }
+
+
+
+ /** Destructor. */
+ ~SparseMatrixGeneric () {
+#ifdef __LINBOX_PARALLEL
+
+ BB_list_list::iterator p;
+
+ BB_list::iterator e_p;
+
+ for (p = sub_list. begin(); p != sub_list. end(); ++ p)
+ for (e_p = p -> second. begin();
+ e_p != p -> second. end(); ++ e_p) {
+
+ Thread::terminate_thread (*e_p);
+
+ delete (*e_p);
+ }
+#endif
+
+ }
+
+ /** Retreive row dimension of the matrix.
+ * @return integer number of rows of SparseMatrixGeneric matrix.
+ */
+ size_t rowdim () const
+ {
+ return _m;
+ }
+
+ /** Retreive column dimension of matrix.
+ * @return integer number of columns of SparseMatrixGeneric matrix.
+ */
+ size_t coldim () const
+ {
+ return _n;
+ }
+
+ /** Retreive number of elements in the matrix.
+ * @return integer number of elements of SparseMatrixGeneric matrix.
+ * @bug should it be elements or non zero elements ? @see ELL
+ */
+ size_t size () const
+ {
+ size_t s(0);
+ for(typename Rep::const_iterator it = _matA.begin(); it != _matA.end(); ++it)
+ s+= LinBox::RawVector<Element>::size(*it);
+ return s;
+ }
+
+ /** Read a matrix from the given input stream using field read/write
+ * @param is Input stream from which to read the matrix
+ * @param format Format of input matrix
+ */
+ std::istream &read (std::istream &is, LINBOX_enum(Tag::FileFormat) format = Tag::FileFormat::Detect );
+
+ /** Write a matrix to the given output stream using field read/write
+ * @param os Output stream to which to write the matrix
+ * @param F Field with which to write
+ * @param format Format with which to write
+ */
+ std::ostream &write (std::ostream &os, LINBOX_enum(Tag::FileFormat) format = Tag::FileFormat::MatrixMarket) const;
+
+ /** Set an individual entry
+ * Setting the entry to 0 will remove it from the matrix
+ * @param i Row index of entry
+ * @param j Column index of entry
+ * @param value Value of the new entry
+ */
+ void setEntry (size_t i, size_t j, const Element &value);
+ void appendEntry(size_t i, size_t j, const Element & value) { setEntry(i,j,value) ;}
+ void finalize(){}
+
+ /** Get a writeable reference to an entry in the matrix
+ * If there is no entry at the position (i, j), then a new entry
+ * with a value of zero is inserted and a reference to it is
+ * returned.
+ * @param i Row index of entry
+ * @param j Column index of entry
+ * @return Reference to matrix entry
+ */
+ Element &refEntry (size_t i, size_t j);
+
+ /** Get a read-only individual entry from the matrix
+ * @param i Row index
+ * @param j Column index
+ * @return Const reference to matrix entry
+ */
+ const Element &getEntry (size_t i, size_t j) const;
+
+ /** Get an entry and store it in the given value
+ * This form is more in the Linbox style and is provided for interface
+ * compatibility with other parts of the library
+ * @param x Element in which to store result
+ * @param i Row index
+ * @param j Column index
+ * @return Reference to x
+ */
+ Element &getEntry (Element &x, size_t i, size_t j) const;
+
+ /** @name Columns of rows iterator
+ * The columns of row iterator gives each of the rows of the
+ * matrix in ascending order. Dereferencing the iterator yields
+ * a row vector in sparse sequence format
+ */
+
+ typedef typename Rep::iterator RowIterator;
+ typedef typename Rep::const_iterator ConstRowIterator;
+
+ RowIterator rowBegin ();
+ RowIterator rowEnd ();
+ ConstRowIterator rowBegin () const;
+ ConstRowIterator rowEnd () const;
+
+ /** @name Raw iterator
+ * The raw iterator is a method for accessing all nonzero
+ * entries in the matrix in some unspecified order. This can be
+ * used, e.g. to reduce all matrix entries modulo a prime before
+ * passing the matrix into an algorithm.
+ */
+
+ class Iterator;
+ class ConstIterator;
+
+ /// Begin.
+ Iterator Begin ();
+ /// End.
+ Iterator End ();
+ /// const Begin.
+ ConstIterator Begin () const;
+ /// const End
+ ConstIterator End () const;
+
+ /** @name Index iterator
+ * The index iterator gives the row, column indices of all matrix
+ * elements in the same order as the raw iterator above. Its value type
+ * is an STL pair with the row and column indices, starting at 0, in the
+ * first and second positions, respectively.
+ */
+
+ class IndexedIterator;
+ class ConstIndexedIterator;
+
+ /// IndexedBegin
+ IndexedIterator IndexedBegin ();
+ /// IndexedEnd
+ IndexedIterator IndexedEnd ();
+ /// const IndexedBegin
+ ConstIndexedIterator IndexedBegin () const;
+ /// const IndexedEnd
+ ConstIndexedIterator IndexedEnd () const;
+
+ /** Retrieve a row as a writeable reference
+ * @param i Row index
+ */
+ Row &getRow (size_t i);
+
+ /** Retrieve a row as a writeable reference.
+ * @param i Row index
+ */
+ Row &operator [] (size_t i);
+
+ /** Retrieve a row as a read-only reference.
+ * @param i Row index
+ */
+ ConstRow &operator [] (size_t i) const;
+
+ /** Compute the column density, i.e the number of entries per column.
+ * @param v Vector in which to store column density
+ */
+ template <class Vector>
+ Vector &columnDensity (Vector &v) const;
+
+ /** Construct the transpose of this matrix and place it in the
+ * matrix given.
+ * @param AT
+ */
+ SparseMatrixGeneric &transpose (SparseMatrixGeneric &AT) const;
+
+ const Field & field() const
+ {
+ return _field;
+ }
+
+ /** Matrix-vector product
+ * \f$y = A x\f$.
+ * @return reference to output vector y
+ * @param x input vector
+ * @param y
+ */
+ template <class OutVector, class InVector>
+ OutVector &apply (OutVector &y, const InVector &x) const
+ {
+#ifdef __LINBOX_PARALLEL
+ return BlackboxParallel (y, *this, x, BBBase::Apply);
+#else
+ return _MD.vectorMul (y, *this, x);
+#endif
+ }
+
+ /** Transpose matrix-vector product
+ * \f$ y = A^T x\f$.
+ * @return reference to output vector y
+ * @param x input vector
+ * @param y
+ */
+ template <class OutVector, class InVector>
+ OutVector &applyTranspose (OutVector& y, const InVector &x) const
+ {
+#ifdef __LINBOX_PARALLEL
+ return BlackboxParallel (y, *this, x, BBBase::ApplyTranspose);
+#else
+ return _MD.vectorMul (y, _AT, x);
+#endif
+ }
+
+ const Rep & getRep() const
+ {
+ return _matA;
+ }
+
+ Rep & refRep()
+ {
+ return _matA;
+ }
+
+ void resize( const size_t & m, const size_t & n, const size_t & z = 0)
+ {
+ _m = m ;
+ _n = n ;
+ _matA.clear();
+ _matA.resize(m);
+
+ }
+
+ protected:
+
+ friend class SparseMatrixWriteHelper<Self_t >;
+ friend class SparseMatrixReadHelper<Self_t >;
+
+ Rep _matA;
+ size_t _m;
+ size_t _n;
+ const Field & _field;
+
+ MatrixDomain<Field> _MD; // Matrix domain for matrix operations
+ TransposeMatrix<SparseMatrixGeneric<_Field, _Row> > _AT;
+
+
+ // template<class F, class R, class T> friend class SparseMatrixGeneric;
+ };
+
+} // Protected
+
+
+} // Linbox
+
+
+#include "linbox/matrix/sparsematrix/sparse-sequence-vector.h"
+#include "linbox/matrix/sparsematrix/sparse-parallel-vector.h"
+#include "linbox/matrix/sparsematrix/sparse-associative-vector.h"
+
+#include "linbox/matrix/sparsematrix/sparse-generic.inl"
+
+namespace LinBox { /* IO / Traits */
+
+ template <class Field, class Row>
+ std::ostream &operator << (std::ostream &os, const Protected::SparseMatrixGeneric<Field, Row> &A)
+ {
+ return A.write (os);
+ }
+
+ template <class Field, class Row>
+ std::istream &operator >> (std::istream &is, Protected::SparseMatrixGeneric<Field, Row> &A)
+ {
+ return A.read (is);
+ }
+
+ template <class Field, class Row, class Trait>
+ struct MatrixTraits< Protected::SparseMatrixGeneric<Field, Row, Trait> >
+ {
+ typedef Protected::SparseMatrixGeneric<Field, Row, Trait> MatrixType;
+ typedef typename MatrixCategories::RowMatrixTag MatrixCategory;
+ };
+
+ template <class Field, class Row, class Trait>
+ struct MatrixTraits< const Protected::SparseMatrixGeneric<Field, Row, Trait> >
+ {
+ typedef const Protected::SparseMatrixGeneric<Field, Row, Trait> MatrixType;
+ typedef typename MatrixCategories::RowMatrixTag MatrixCategory;
+ };
+
+ template<class A, class B, class C>
+ struct GetEntryCategory<Protected::SparseMatrixGeneric<A,B,C> > {
+ typedef SolutionTags::Local Tag;
+ } ;
+
+ template <class Field, class _Row>
+ struct MatrixTraits< Protected::SparseMatrixGeneric<Field, _Row> >
+ {
+ typedef Protected::SparseMatrixGeneric<Field, _Row> MatrixType;
+ typedef MatrixCategories::RowMatrixTag MatrixCategory;
+ };
+
+ template<class A, class B>
+ struct GetEntryCategory<Protected::SparseMatrixGeneric<A,B> >
+ {
+ typedef SolutionTags::Local Tag;
+ };
+
+} // namespace LinBox
+
+
+#endif // __LINBOX_matrix_sparsematrix_sparse_generic_H
+
+
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/matrix/sparsematrix/sparse-generic.inl b/linbox/matrix/sparsematrix/sparse-generic.inl
new file mode 100644
index 0000000..45e41a7
--- /dev/null
+++ b/linbox/matrix/sparsematrix/sparse-generic.inl
@@ -0,0 +1,100 @@
+/* linbox/matrix/sparse.inl
+ * Copyright (C) 2001-2002 Bradford Hovinen
+ * 1999-2001 William J Turner,
+ *
+ * Written by Bradford Hovinen <hovinen at cis.udel.edu>
+ * Based on sparse-base.h by William J Turner <wjturner at math.ncsu.edu>
+ *
+ * --------------------------------------------------------
+ * 2003-01-11 Bradford Hovinen <bghovinen at math.uwaterloo.ca>
+ *
+ * Move from blackbox/sparse-base.inl to matrix/sparse.inl
+ * ------------------------------------
+ * 2002-11-28 Bradford Hovinen <bghovinen at math.uwaterloo.ca>
+ *
+ * - Renamed ColOfRowsIterator to RowIterator
+ * - Named template argument _Row rather than Row; add a typedef to Row
+ * ------------------------------------
+ *
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ * ========LICENCE========
+ *.
+ */
+
+#ifndef __LINBOX_matrix_sparse_INL
+#define __LINBOX_matrix_sparse_INL
+
+#include "linbox/linbox-config.h"
+
+#include <iostream>
+#include <sstream>
+#include <algorithm>
+#include <cmath>
+#include <cctype>
+#include <cstring>
+
+#include "linbox/matrix/sparse-matrix.h"
+#include "linbox/vector/vector-traits.h"
+#include "linbox/vector/vector-domain.h"
+#include "linbox/util/debug.h"
+
+
+
+
+
+namespace LinBox { namespace Protected {
+ template <class Field, class Row, class Tag>
+ SparseMatrixGeneric<Field,Row,Tag> ::SparseMatrixGeneric( MatrixStream<Field>& ms ) :
+ _matA(0), _m(0), _n(0)
+ {
+ Element val;
+ size_t i, j;
+ while( ms.nextTriple(i,j,val) ) {
+ if( i >= _m ) {
+ _m = i + 1;
+ _matA.resize( _m );
+ }
+ if( j >= _n ) _n = j + 1;
+ setEntry(i,j,val);
+ }
+ if( ms.getError() > END_OF_MATRIX )
+ throw ms.reportError(__func__,__LINE__);
+ if( !ms.getDimensions( i, _n ) )
+ throw ms.reportError(__func__,__LINE__);
+ if( i > _m ) {
+ _m = i;
+ _matA.resize(_m);
+ }
+ }
+
+
+
+} // namespace LinBox
+} // namespace Protected
+
+#endif // __LINBOX_matrix_sparse_INL
+
+
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/matrix/sparsematrix/sparse-hyb-matrix.h b/linbox/matrix/sparsematrix/sparse-hyb-matrix.h
new file mode 100644
index 0000000..32bdc77
--- /dev/null
+++ b/linbox/matrix/sparsematrix/sparse-hyb-matrix.h
@@ -0,0 +1,923 @@
+/* linbox/matrix/sparse-csr-matrix.h
+ * Copyright (C) 2013 the LinBox
+ *
+ * Written by :
+ * Brice Boyer (briceboyer) <boyer.brice at gmail.com>
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ * ========LICENCE========
+ */
+
+/*! @file matrix/sparsematrix/sparse-hyb-matrix.h
+ * @ingroup sparsematrix
+ */
+
+
+#ifndef __LINBOX_matrix_sparsematrix_sparse_hyb_matrix_H
+#define __LINBOX_matrix_sparsematrix_sparse_hyb_matrix_H
+
+#include <utility>
+#include <iostream>
+#include <algorithm>
+
+#include "linbox/linbox-config.h"
+#include "linbox/util/debug.h"
+#include "sparse-domain.h"
+#include "sparse-coo-matrix.h"
+#include "sparse-csr-matrix.h"
+#include "sparse-ellr-matrix.h"
+
+/*! @todo benchmark me */
+#define HYB_ELL_THRESHOLD 0.9
+/*! @todo benchmark me */
+#define HYB_ELL_COO_THRESHOLD 0.1
+
+namespace LinBox
+{
+
+ template<class Field>
+ class Stats {
+ const SparseMatrix<Field,SparseMatrixFormat::CSR> & _Mat;
+ const Field & _field ;
+ public:
+ size_t one ;
+ size_t mone ;
+ size_t avg ;
+ // size_t avg_one ;
+ // size_t avg_mone ;
+ std::vector<size_t> row ;
+ std::vector<size_t> row_one ;
+ std::vector<size_t> row_mone ;
+ std::vector<size_t> null_row ;
+ // size_t mean ;
+ size_t ell ;
+ size_t ell_nbnz ;
+ size_t ell_one ;
+ size_t ell_mone ;
+ public :
+ Stats( const SparseMatrix<Field,SparseMatrixFormat::CSR> & Mat) :
+ _Mat(Mat),_field(_Mat.field())
+ ,one(0),mone(0)
+ ,row(Mat.rowdim(),0)
+ ,row_one(Mat.rowdim(),0)
+ ,row_mone(Mat.rowdim(),0)
+ ,null_row(0)
+ ,avg(0)
+ ,ell(0)
+ ,ell_nbnz(0)
+ // ,_off_ell(Mat.rowdim(),0);
+ {
+ if (Mat.size() > 100) { /*! @todo what is small ? */
+ for (size_t i = 0 ; i < Mat.rowdim() ; ++i) {
+ if (Mat.getStart(i) == Mat.getEnd(i)) {
+ null_row.push_back(i);
+ }
+ for (size_t k = Mat.getStart(i) ; k < Mat.getEnd(i) ; ++k) {
+ if (_field.isOne(Mat.getEntry(k))) {
+ ++one ;
+ row_one[i] += 1 ;
+ }
+ else if (_field.isMOne(Mat.getEntry(k))) {
+ ++mone ;
+ row_mone[i] += 1 ;
+ }
+ row[i] += 1;
+ }
+ }
+ }
+ avg = std::ceil((Mat.rowdim()-null_row.size())/Mat.size());
+ }
+
+ void getOptimsedFormat(SparseMatrix<Field,SparseMatrixFormat::HYB> & hyb)
+ {
+ // std::sort(row.start(), row.end());
+ // std::vector<size_t>::iterator up;
+ // up= std::upper_bound (row.begin(), row.end(), 0); //
+ // linbox_check(null_row.size() == (size_t)(up-row.begin()));
+ size_t t1 = 0 , t2 = 0 , t3 = 0 ;
+ size_t e1 = avg-1 , e2 = avg , e3 = avg+1 ;
+ for (size_t i = 0 ; i < row.size() ; ++i) {
+ t1 += std::min(e1,row[i]);
+ t2 += std::min(e2,row[i]);
+ t3 += std::min(e3,row[i]);
+ }
+ double r1 = (double)t1/double(hyb.size()) ;
+ double r2 = (double)t2/double(hyb.size()) ;
+ double r3 = (double)t3/double(hyb.size()) ;
+ ell = 0 ;
+ if ( r1 > HYB_ELL_THRESHOLD) {
+ ell = e1 ;
+ ell_nbnz =t1;
+ }
+ if (r2 > std::min(r1, HYB_ELL_THRESHOLD)) { /*! @todo benchmark me */
+ ell = e2 ;
+ ell_nbnz =t2;
+ }
+ if (r3 > std::min( std::min(r2,r1), HYB_ELL_THRESHOLD) ) { /*! @todo benchmark me */
+ ell = e3 ;
+ ell_nbnz =t3;
+ }
+
+ size_t choose_ell = 0 ; // 0 is nothing, 1 is ell, 2 is ellr
+ size_t choose_coo = 0 ; // 0 is nothing, 1 is coo, 2 is csr
+
+ if (ell != 0) {
+ if (ell*hyb.rowdim() == hyb.size())
+ choose_ell = 1 ;
+ else
+ choose_ell = 2 ;
+ }
+
+ size_t rem = (hyb.size()-ell*hyb.rowdim()) ;
+ if (rem > 0) {
+ double r4 = rem/hyb.rowdim();
+ if (r4 < HYB_ELL_COO_THRESHOLD)
+ choose_coo = 1 ;
+ else
+ choose_coo = 2 ;
+ }
+
+ switch(choose_ell) {
+ case (1) :
+ // hyb.newELL();
+ case (2) :
+ hyb.newELL_R();
+ default :
+ {}
+ }
+
+ switch(choose_coo) {
+ case (1) :
+ hyb.newCOO();
+ case (2) :
+ hyb.newCSR();
+ default :
+ {}
+ }
+
+
+ //! @todo ±1 !
+
+ }
+ };
+
+ /** Sparse matrix, Coordinate storage.
+ *
+ * \ingroup matrix
+ * \ingroup sparse
+ */
+ template<class _Field>
+ class SparseMatrix<_Field, SparseMatrixFormat::HYB > {
+ public :
+ typedef _Field Field ; //!< Field
+ typedef typename _Field::Element Element ; //!< Element
+ typedef const Element constElement ; //!< const Element
+ typedef SparseMatrixFormat::HYB Storage ; //!< Matrix Storage Format
+ typedef SparseMatrix<_Field,Storage> Self_t ; //!< Self type
+ // typedef Vector<_Field,VectorStorage::Sparse> Rep ;
+
+ /*! Constructors.
+ * @todo convert from other matrix.
+ *
+ */
+ //@{
+ SparseMatrix<_Field, SparseMatrixFormat::HYB> () :
+ _rownb(0),_colnb(0) ,_nbnz(0)
+ ,_coo(NULL),_csr(NULL),_ell_r(NULL)
+ , _field()
+ {
+ }
+
+ SparseMatrix<_Field, SparseMatrixFormat::HYB> (const _Field & F) :
+ _rownb(0),_colnb(0) ,_nbnz(0)
+ ,_coo(NULL),_csr(NULL),_ell_r(NULL)
+ , _field(F)
+ {
+ }
+
+ SparseMatrix<_Field, SparseMatrixFormat::HYB> (const _Field & F, size_t m, size_t n) :
+ _rownb(m),_colnb(n) ,_nbnz(0)
+ ,_coo(NULL),_csr(NULL),_ell_r(NULL)
+ , _field(F)
+ {
+ }
+
+ SparseMatrix<_Field, SparseMatrixFormat::HYB> (const SparseMatrix<_Field, SparseMatrixFormat::CSR> & S) :
+ _rownb(S._rownb),_colnb(S._colnb), _nbnz(S._nbnz)
+ ,_coo(NULL),_csr(NULL),_ell_r(NULL)
+ ,_field(S._field)
+ {
+ importe(S);
+
+ }
+
+
+ // XXX only for CSR
+ template<typename _Tp1, typename _Rw1 = SparseMatrixFormat::HYB>
+ struct rebind ;
+
+ template<typename _Tp1>
+ struct rebind<_Tp1 > {
+ typedef SparseMatrix<_Tp1, SparseMatrixFormat::HYB> other;
+
+ void operator() (other & Ap, const Self_t& A)
+ {
+ Ap.resize(A.rowdim(),A.coldim(),A.size());
+ // size might decrease...
+
+ if (A.have_reader()) {
+ Ap.newReader();
+ typename SparseMatrix<Field,SparseMatrixFormat::CSR>::template
+ rebind<_Tp1,SparseMatrixFormat::CSR>()(Ap.reader(),A.reader());
+ }
+
+ if (A.have_coo()) {
+ Ap.newCOO();
+ typename SparseMatrix<Field,SparseMatrixFormat::COO>::template
+ rebind<_Tp1,SparseMatrixFormat::COO>()(Ap.coo(),A.coo());
+ }
+
+ if (A.have_csr()) {
+ Ap.newCSR();
+ typename SparseMatrix<Field,SparseMatrixFormat::CSR>::template
+ rebind<_Tp1,SparseMatrixFormat::CSR>()(Ap.csr(),A.csr());
+ }
+
+ if (A.have_ell_r()) {
+ Ap.newELL_R();
+ typename SparseMatrix<Field,SparseMatrixFormat::ELL_R>::template
+ rebind<_Tp1,SparseMatrixFormat::ELL_R>()(Ap.ell_r(),A.ell_r());
+ }
+ }
+ };
+
+ template<typename _Tp1, typename _Rw1>
+ SparseMatrix (const SparseMatrix<_Tp1, _Rw1> &S, const Field& F) :
+ _rownb(S.rowdim()),_colnb(S.coldim()), _nbnz(S.size())
+ ,_coo(NULL)
+ ,_csr(NULL)
+ ,_ell_r(NULL)
+ ,_field(F)
+ {
+ typename SparseMatrix<_Tp1,_Rw1>::template
+ rebind<Field,SparseMatrixFormat::HYB>()(*this, S);
+ }
+
+
+
+
+ template<class VectStream>
+ SparseMatrix<_Field, SparseMatrixFormat::HYB> (const _Field & F, VectStream & stream) :
+ _rownb(stream.size()),_colnb(stream.dim()), _nbnz(0)
+ ,_coo(NULL),_csr(NULL),_ell_r(NULL)
+ , _field(F)
+ {
+ _csr = (new SparseMatrix<Field,SparseMatrixFormat::CSR>(F,stream));
+ }
+
+
+ void resize(const size_t & mm, const size_t & nn, const size_t & zz)
+ {
+ _rownb = mm ;
+ _colnb = nn ;
+ _nbnz = zz;
+ }
+
+ /*! Default converter.
+ * @param S a sparse matrix in any storage.
+ */
+ template<class _OtherStorage>
+ SparseMatrix<_Field, SparseMatrixFormat::HYB> (const SparseMatrix<_Field, _OtherStorage> & S) :
+ _rownb(S._rownb),_colnb(S._colnb),_nbnz(S._nbnz)
+ ,_coo(NULL),_csr(NULL),_ell_r(NULL)
+ ,_field(S._field)
+ {
+ this->importe(S); // convert Temp from anything
+ }
+
+ ~SparseMatrix<_Field, SparseMatrixFormat::HYB>()
+ {
+ if(have_coo()) {
+ delete _coo ;
+ _coo = NULL ;
+ }
+ if(have_csr()) {
+ delete _csr;
+ _csr = NULL ;
+ }
+ if(have_reader()) {
+ delete _reader;
+ _reader = NULL ;
+ }
+
+ if(have_ell_r()) {
+ delete _ell_r;
+ _ell_r = NULL ;
+ }
+ }
+
+ //@}
+ /*! Conversions.
+ * Any sparse matrix has a converter to/from CSR.
+ * A specialisation can skip the temporary CSR matrix created.
+ */
+ //@{
+ /*! Import a matrix in CSR format to HYB.
+ * @param S HYB matrix to be converted in HYB and optimsed
+ */
+ void importe(const SparseMatrix<_Field,SparseMatrixFormat::CSR> &S)
+ {
+ optimise();
+ }
+
+ void optimise()
+ {
+ Stats<Field> stats(*this);
+ //! @todo ±1 !
+ if (have_ell_r()) {
+ ell_r().resize(rowdim(),coldim(),stats.ell_nbnz,stats.ell);
+ size_t l = 0 ;
+ for (size_t i = 0 ; i < rowdim() ;++i) {
+ size_t j = 0 ;
+ ell_r.setRowid(i,std::min(reader().rowLength(i),stats.ell));
+ for (size_t k = reader().getStart(i) ; k < reader().getStart(i)+ell_r.getRowid(i) ; ++k, ++j) {
+ ell_r().setColid(i,j,reader().getColid(k));
+ ell_r().setData (i,j,reader().getData (k));
+
+ }
+ for (size_t k = reader().getStart(i)+ell_r.getRowid(i) ; k < reader.getEnd(i) ; ++k , ++l) {
+ if (have_coo()) {
+ coo().setRowid(l,i);
+ coo().setColid(l,reader().getColid(k));
+ coo().setData (l,reader().getData (k));
+ }
+ else {
+ csr().setEnd(i,csr.getEnd(i)+1);
+ csr().setColid(l,reader().getColid(k));
+ csr().setData (l,reader().getData (k));
+ }
+ }
+ }
+ if (have_csr()) {
+ for (size_t i = 0 ; i < rowdim() ;++i) {
+ csr().setEnd(i,csr().getStart(i)+csr().getEnd(i));
+ }
+ csr().compress();
+ }
+
+ }
+ else if (have_csr()) {
+ csr().importe(reader());
+
+ }
+ else if (have_coo()) {
+ coo().importe(reader());
+ }
+ }
+
+ /*! Import a matrix in CSR format to CSR.
+ * @param S CSR matrix to be converted in CSR
+ */
+
+ void importe(const SparseMatrix<_Field,SparseMatrixFormat::HYB> &A)
+ {
+ resize( A.rowdim(), A.coldim(), A.size() );
+
+ if (A.have_coo()) {
+ newCOO();
+ coo().importe(A.coo());
+ }
+ if (A.have_csr()) {
+ newCSR();
+ csr().importe(A.csr());
+ }
+ if (A.have_ell_r()) {
+ newELL_R();
+ ell_r().importe(A.ell_r());
+ }
+
+
+ }
+
+ /*! Export a matrix in CSR format from COO.
+ * @param S CSR matrix to be converted from COO
+ */
+ SparseMatrix<_Field,SparseMatrixFormat::HYB > &
+ exporte(SparseMatrix<_Field,SparseMatrixFormat::HYB> &S) const
+ {
+
+ // could save memory by doing that iteratively and resize to 0,0,0
+ SparseMatrix<_Field,SparseMatrixFormat::CSR> S1(field());
+ SparseMatrix<_Field,SparseMatrixFormat::CSR> S2(field());
+ SparseMatrix<_Field,SparseMatrixFormat::CSR> S3(field());
+ if (have_coo()) {
+ S1.importe(coo());
+ }
+ if (have_csr()) {
+ S1.importe(csr());
+ }
+ if (have_ell_r()) {
+ S1.importe(ell_r());
+ }
+ S.merge(S1);
+ S.merge(S2);
+ S.merge(S3);
+
+ return S ;
+
+ }
+
+
+ //@}
+
+ /*! In place transpose. Not quite...
+ */
+ void transposeIn()
+ {
+ if (have_coo()) {
+ coo().transposeIn();
+ }
+ if (have_csr()) {
+ csr().transposeIn();
+ }
+ if (have_ell_r()) {
+ ell_r().transposeIn();
+ }
+ if (have_reader()) {
+ reader().transposeIn();
+ }
+
+ }
+
+ /*! Transpose the matrix.
+ * @param S [out] transpose of self.
+ * @return a reference to \p S.
+ */
+ SparseMatrix<_Field,SparseMatrixFormat::HYB> &
+ transpose(SparseMatrix<_Field,SparseMatrixFormat::HYB> &S)
+ {
+ if (have_coo()) {
+ S.newCoo();
+ coo().transpose(S.coo());
+ }
+ if (have_csr()) {
+ S.newCSR();
+ csr().transpose(S.csr());
+ }
+ if (have_ell_r()) {
+ S.newELLR();
+ ell_r().transpose(S.ell_r());
+ }
+ if (have_reader()) {
+ S.newCSR();
+ reader().transpose(S.reader());
+ }
+
+ return S;
+ }
+
+ /*! number of rows.
+ * @return row dimension.
+ */
+ size_t rowdim() const
+ {
+ return _rownb ;
+ }
+
+ /*! number of columns.
+ * @return column dimension
+ */
+ size_t coldim() const
+ {
+ return _colnb ;
+ }
+
+ /*! Number of non zero elements in the matrix.
+ * or at least the size of the _data if
+ * @return size of the _data.
+ */
+ size_t size() const
+ {
+ // return _data.size();
+ return _nbnz ;
+ }
+
+ void setSize(const size_t & z)
+ {
+ _nbnz = z ;
+ }
+
+ /** Get a read-only individual entry from the matrix.
+ * @param i Row _colid
+ * @param j Column _colid
+ * @return Const reference to matrix entry
+ */
+ constElement &getEntry(const size_t &i, const size_t &j) const
+ {
+ std::cout << " *** Warning/Error **** un optimised" << std::endl;
+ // get Entry in various opt, then reader
+ return reader().getEntry(i,j);
+ }
+
+
+ Element &getEntry (Element &x, size_t i, size_t j) const
+ {
+ std::cout << " *** Warning/Error **** un optimised" << std::endl;
+ return x = getEntry (i, j);
+ }
+
+ void finalize(){ optimise(); } // end construction after a sequence of setEntry calls.
+
+ /** Set an individual entry.
+ * Setting the entry to 0 will not remove it from the matrix
+ * @param i Row _colid of entry
+ * @param j Column _colid of entry
+ * @param value Value of the new entry
+ * @todo make it faster if i is 0 or m-1 ?
+ */
+ void setEntry(const size_t &i, const size_t &j, const Element& e)
+ {
+ // only setentry on _reader, destroy other ?
+ // or add in coo/ wherever possible ? (seems doable)
+ std::cout << " *** Warning/Error **** un optimised" << std::endl;
+ return reader().setEntry(i,j,e);
+ }
+
+
+ /** Get a writeable reference to an entry in the matrix.
+ * If there is no entry at the position (i, j), then a new entry
+ * with a value of zero is inserted and a reference to it is
+ * returned.
+ * @param i Row _colid of entry
+ * @param j Column _colid of entry
+ * @return Reference to matrix entry
+ */
+ Element &refEntry(const size_t &i, const size_t&j)
+ {
+ // dangerous if ref is 0, but doable.
+ std::cout << " *** Warning/Error **** un optimised" << std::endl;
+ return reader().refEntry(i,j);
+ }
+
+ /** Write a matrix to the given output stream using field read/write.
+ * @param os Output stream to which to write the matrix
+ * @param format Format with which to write
+ */
+ template<class Format>
+ std::ostream & write(std::ostream &os,
+ Format = SparseFileFormat::CSR()) const
+ {
+ return this->writeSpecialized(os,Format());
+ }
+
+ std::ostream & write(std::ostream &os,
+ enum LINBOX_enum(Tag::FileFormat) ff = Tag::FileFormat::Maple) const
+ {
+ return this->writeSpecialized(os,ff);
+ }
+
+
+ /** Read a matrix from the given input stream using field read/write
+ * @param file Input stream from which to read the matrix
+ * @param format Format of input matrix
+ * @return ref to \p file.
+ */
+ template<class Format>
+ std::istream& read (std::istream &file,
+ Format fmt = SparseFileFormat::CSR())
+ {
+ if ( ! have_reader() )
+ newReader();
+ return reader().read(file,fmt);
+ }
+
+ /*! @internal
+ * @brief Deletes the entry.
+ * Deletes \c A(i,j) if it exists.
+ * @param i row _colid
+ * @param j col _colid
+ */
+ void clearEntry(const size_t &i, const size_t &j)
+ {
+#if 0
+ linbox_check(i<_rownb);
+ linbox_check(j<_colnb);
+
+ size_t ibeg = _start[i];
+ size_t iend = _start[i+1];
+ if (ibeg == iend)
+ return ;
+
+ typedef typename std::vector<size_t>::iterator myIterator ;
+ myIterator beg = _colid.begin() ;
+ myIterator low = std::lower_bound (beg+(ptrdiff_t)ibeg, beg+(ptrdiff_t)iend, j);
+ if (low == beg+(ptrdiff_t)iend)
+ return ;
+ else {
+ // not sure
+ size_t la = low-beg ;
+ for (size_t k = i+1 ; k <= _rownb ; ++k) _start[k] -= 1 ;
+ _colid.erase(_colid.begin()+la);
+ _data. erase(_data. begin()+la);
+ return ;
+ }
+#endif
+ }
+
+ /*! @internal
+ * @brief cleans 0 entries.
+ */
+ void clean()
+ {
+#if 0
+ size_t i = 0 ;
+ while(i < _data.size()) {
+ if ( field().isZero(_data[i]) ) {
+ for (size_t k = i+1 ; k <= _rownb ; ++k) _start[k] -= 1 ;
+ _colid.erase(_colid.begin()+i);
+ _data. erase(_data. begin()+i);
+ }
+ else
+ ++i ;
+ }
+ return ;
+#endif
+ }
+
+ // y= Ax
+ // y[i] = sum(A(i,j) x(j)
+ template<class Vector>
+ Vector& apply(Vector &y, const Vector& x, const Element & a ) const
+ {
+ linbox_check(consistent());
+ prepare(field(),y,a);
+
+ bool is_optimised = (have_ell_r() || have_coo() || have_csr());
+ if (is_optimised) {
+ if (have_ell_r())
+ ell_r().apply(y,x,field().one);
+ if (have_coo())
+ coo() .apply(y,x,field().one);
+ if (have_csr())
+ csr() .apply(y,x,field().one);
+ }
+ else {
+ reader(). apply(y,x,field().one);
+ }
+
+
+
+ return y;
+ }
+
+ class Helper ; // transpose
+
+ // y= A^t x
+ // y[i] = sum(A(j,i) x(j)
+ template<class Vector>
+ Vector& applyTranspose(Vector &y, const Vector& x, const Element & a ) const
+ {
+ linbox_check(consistent());
+ //! @bug if too big, create transpose.
+ prepare(field(),y,a);
+ bool is_optimised = (have_ell_r() || have_coo() || have_csr());
+ if (is_optimised) {
+
+ if (have_ell_r())
+ ell_r().applyTranspose(y,x,field().one);
+ if (have_coo())
+ coo() .applyTranspose(y,x,field().one);
+ if (have_csr())
+ csr() .applyTranspose(y,x,field().one);
+ }
+ else {
+ reader(). applyTranspose(y,x,field().one);
+ }
+
+
+ return y;
+ }
+
+ template<class Vector>
+ Vector& apply(Vector &y, const Vector& x ) const
+ {
+ return apply(y,x,field().zero);
+ }
+ template<class Vector>
+ Vector& applyTranspose(Vector &y, const Vector& x ) const
+ {
+ return apply(y,x,field().zero);
+ }
+
+ const Field & field() const
+ {
+ return _field ;
+ }
+
+
+ /** @todo Non element marker.
+ * We could end up a line with a marker.
+ * A field F would contain an element that does not belong to
+ * it. eg a nan for a Givaro::Modular<double>. It could act as a
+ * marker.
+ */
+ bool consistent() const
+ {
+ size_t nbnz = 0 ;
+ size_t col = 0 ;
+ size_t row = 0 ;
+ if (have_coo()) {
+ if (!coo().consistent()) return false ;
+ nbnz += coo().size();
+ col = std::max(col,coo().coldim());
+ row = std::max(row,coo().rowdim());
+ }
+ if (have_csr()) {
+ if (!csr().consistent()) return false ;
+ nbnz += csr().size();
+ col = std::max(col,csr().coldim());
+ row = std::max(row,csr().rowdim());
+ }
+ if (have_ell_r()) {
+ if (!ell_r().consistent()) return false ;
+ nbnz += ell_r().size();
+ col = std::max(col,ell_r().coldim());
+ row = std::max(row,ell_r().rowdim());
+ }
+ if (nbnz != size())
+ return false ;
+ if (col > coldim())
+ return false;
+ if (row > rowdim())
+ return false;
+
+ return true ;
+ }
+
+
+ private :
+
+ std::ostream & writeSpecialized(std::ostream &os,
+ LINBOX_enum(Tag::FileFormat) format) const
+ {
+ if (have_reader()) {
+ return reader().write(os,format);
+ }
+
+ // SparseMatrix<Field,SparseMatrixFormat::CSR> Temp(field());
+ // this->exporte(Temp);
+ // Temp.write(os,format);
+ return os << "no export yet in HYB" << __FILE__ << ',' << __LINE__ ;
+
+ }
+
+
+ public:
+
+
+
+ void newCOO ()
+ {
+ linbox_check (!have_coo())
+ _coo= new SparseMatrix<Field,SparseMatrixFormat::COO>(_field);
+
+ }
+
+ void newCSR ()
+ {
+ linbox_check (!have_csr()) ;
+ _csr= new SparseMatrix<Field,SparseMatrixFormat::CSR>(_field);
+
+ }
+
+ void newELL_R ()
+ {
+ linbox_check (!have_ell_r()) ;
+ _ell_r= new SparseMatrix<Field,SparseMatrixFormat::ELL_R>(_field);
+
+ }
+
+ void newReader ()
+ {
+ linbox_check(!have_reader()) ;
+ _reader= new SparseMatrix<Field,SparseMatrixFormat::CSR>(_field);
+ }
+
+
+
+ bool have_coo() const
+ {
+ return _coo != NULL ;
+ }
+ bool have_csr() const
+ {
+ return _csr != NULL ;
+ }
+ bool have_ell_r() const
+ {
+ return _ell_r != NULL ;
+ }
+ bool have_reader() const
+ {
+ return _reader != NULL ;
+ }
+
+ SparseMatrix<Field,SparseMatrixFormat::COO> & coo(void)
+ {
+ linbox_check(have_coo());
+ return _coo[0] ;
+ }
+
+ const SparseMatrix<Field,SparseMatrixFormat::COO> & coo(void) const
+ {
+ linbox_check(have_coo());
+ return _coo[0] ;
+ }
+
+
+
+ SparseMatrix<Field,SparseMatrixFormat::CSR> & csr(void)
+ {
+ linbox_check(have_csr());
+ return _csr[0] ;
+ }
+
+ const SparseMatrix<Field,SparseMatrixFormat::CSR> & csr(void) const
+ {
+ linbox_check(have_csr());
+ return _csr[0] ;
+ }
+
+ SparseMatrix<Field,SparseMatrixFormat::ELL_R> & ell_r(void)
+ {
+ linbox_check(have_ell_r());
+ return _ell_r[0] ;
+ }
+
+ const SparseMatrix<Field,SparseMatrixFormat::ELL_R> & ell_r(void) const
+ {
+ linbox_check(have_ell_r());
+ return _ell_r[0] ;
+ }
+
+ SparseMatrix<Field,SparseMatrixFormat::CSR> & reader(void)
+ {
+ linbox_check(have_reader());
+ return _reader[0] ;
+ }
+
+ const SparseMatrix<Field,SparseMatrixFormat::CSR> & reader(void) const
+ {
+ linbox_check(have_reader());
+ return _reader[0] ;
+ }
+
+
+
+ protected :
+
+
+ size_t _rownb ;
+ size_t _colnb ;
+ size_t _nbnz ;
+
+ SparseMatrix<Field,SparseMatrixFormat::COO> * _coo ;
+ SparseMatrix<Field,SparseMatrixFormat::CSR> * _csr ;
+ SparseMatrix<Field,SparseMatrixFormat::ELL_R> * _ell_r ;
+
+ SparseMatrix<Field,SparseMatrixFormat::CSR> * _reader ;
+
+ const _Field & _field ;
+
+ };
+
+
+
+
+
+} // namespace LinBox
+
+#endif // __LINBOX_matrix_sparsematrix_sparse_hyb_matrix_H
+
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/matrix/sparsematrix/sparse-map-map-matrix.h b/linbox/matrix/sparsematrix/sparse-map-map-matrix.h
new file mode 100644
index 0000000..a0460c1
--- /dev/null
+++ b/linbox/matrix/sparsematrix/sparse-map-map-matrix.h
@@ -0,0 +1,216 @@
+/* Copyright (C) 2013 LinBox
+ * Written by AJS <stachnik at udel.edu>
+ *
+ *
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ * ========LICENCE========
+ */
+
+/*! @file matrix/sparsematrix/sparse-map-map-matrix.h
+ * @ingroup sparsematrix
+ * @brief Supports fast elementary row AND column operations simultaneously
+ */
+
+#ifndef __LINBOX_SPARSE_MAP_MAP_MATRIX_H
+#define __LINBOX_SPARSE_MAP_MAP_MATRIX_H
+
+#include <stdlib.h>
+#include <fstream>
+#include <map>
+#include <iostream>
+
+#include <linbox/linbox-config.h>
+#include <linbox/matrix/sparse-formats.h>
+#include <linbox/util/debug.h>
+#include <linbox/util/field-axpy.h>
+#include <linbox/blackbox/blackbox-interface.h>
+#include <linbox/field/hom.h>
+
+
+namespace LinBox
+{
+
+template<class Field_>
+class SparseMatrix<Field_,SparseMatrixFormat::SMM> : public BlackboxInterface {
+public:
+ typedef Field_ Field;
+ typedef typename Field::Element Element;
+ typedef size_t Index;
+ typedef SparseMatrix<Field_,SparseMatrixFormat::SMM> Self_t;
+ typedef std::map<Index,Element> VectorType;
+ typedef typename VectorType::iterator VectorIt;
+ typedef typename VectorType::const_iterator VectorConstIt;
+ typedef std::map<Index,VectorType> MapType;
+ typedef typename MapType::iterator MapIt;
+ typedef typename MapType::const_iterator MapConstIt;
+
+ SparseMatrix();
+
+ SparseMatrix(const Field& F);
+
+ SparseMatrix(const Field& F, Index r, Index c);
+
+ SparseMatrix(const SparseMatrix& M);
+
+ void init(const Field& F, Index r, Index c);
+
+ void shape(Index r, Index c);
+
+ SparseMatrix& operator=(const SparseMatrix& M);
+
+ ~SparseMatrix();
+
+ void finalize() {}
+
+ Index rowdim() const;
+
+ Index coldim() const;
+
+ const Field& field() const;
+
+ void setEntry(Index i, Index j, const Element& e);
+
+ const Element& getEntry(Index i, Index j) const;
+
+ const Element& getEntry(Element& d, Index i, Index j) const;
+
+ // For debugging only
+ bool verify();
+
+ // y <- Ax
+ template<class OutVector, class InVector>
+ OutVector& apply(OutVector& y, const InVector& x) const;
+
+ // y <- xA
+ template<class OutVector, class InVector>
+ OutVector& applyTranspose(OutVector& y, const InVector& x) const;
+
+ //forall r: A_{i,r}<-A_{i,r}+k*A_{j,r}
+ void addRow(const Element& k, Index i, Index j);
+
+ //forall r: A_{r,i}<-A_{r,i}+k*A_{r,j}
+ void addCol(const Element& k, Index i, Index j);
+
+ //forall r: A_{i,r}<-k*A_{i,r}
+ void timesRow(const Element& k, Index i);
+
+ //forall r: A_{r,j}<-k*A_{r,j}
+ void timesCol(const Element& k, Index j);
+
+ void swapRows(Index i, Index j);
+
+ void swapCols(Index i, Index j);
+
+ //forall i,j: A_{i,j} <- k*A_{i,j}
+ void scaleMat(const Element& k);
+
+ // A<-A^{t}
+ void transpose();
+
+ Index nnz() const;
+
+ // A -> A' = SAS^{-1}, and A' has about nnz nonzero entries.
+ void randomSim(Index nnz, int seed = 0);
+
+ // A -> A' = UAV, with U and V nonsingular, and A' has about nnz nonzero entries.
+ void randomEquiv(Index nnz, int seed = 0);
+
+ bool areEqual(Self_t& rhs) const;
+
+ std::istream& read(std::istream& in);
+
+ // Output pretty-printed matrix
+ std::ostream& print(std::ostream& out) const;
+
+ std::ostream& write(std::ostream& out) const;
+
+ // Initialize argument from this matrix using mat.read()
+ template<class Matrix>
+ void copy(Matrix& mat) const;
+
+ // Initialize this matrix from argument using mat.write()
+ template<class Matrix>
+ void copyFrom(Matrix& mat);
+
+ // Initializes the given vector using the entries from this matrix
+ // Requires an n-by-1 or 1-by-n matrix
+ template<class Vector>
+ void toVector(Vector& vec) const;
+
+ // Initializes this matrix from the given vector
+ // For a row vector use r=vec.size(), c=1
+ // For a column vector use c=vec.size(), r=1
+ template<class Vector>
+ void fromVector(const Vector& vec, Index r, Index c);
+
+ // Initialize mat to be a companion matrix of the polynomial
+ // s.t. mat[i,n-1]==coeffs[i]
+ // Assumes mat is n-by-n with n==coeffs.size()
+ static void generateCompanion(Self_t& mat,std::vector<Element>& coeffs);
+
+ // Initializes each entry of mat with a random field element
+ static void generateDenseRandMat(Self_t& mat, int seed=0);
+
+ // Initialize mat with nnz non-zero random elements at random locations
+ // Warning: Very inefficient as nnz approaches n*m (keep nnz < about 0.2 n*m)
+ static void generateRandMat(Self_t& mat, int nnz, int seed=0);
+
+ // Initializes mat to dI
+ static void generateScaledIdent(Self_t& mat, const Element& d);
+
+ // Initializes mat with at least approxNNZ entries
+ // Assumes mat is n-by-n
+ // Mat is guaranteed to be non-singular
+ // Warning: Very inefficient as nnz approaches n*m (keep nnz < about 0.2 n*m)
+ static void generateSparseNonSingular(Self_t& mat, int approxNNZ, int seed=0);
+
+protected:
+
+ static int randRange(int start, int end);
+
+ static Element& nonzerorandom(const Field& F, typename Field::RandIter& r,Element& e);
+
+ MatrixDomain<Field> MD_;
+
+ MapType rowMap_;
+
+ MapType colMap_;
+
+ Index numCols_;
+
+ Index numRows_;
+
+ Index nnz_;
+
+ Element zero_;
+};
+
+}
+
+#include <linbox/matrix/sparsematrix/sparse-map-map-matrix.inl>
+
+#endif // __SPARSE_MAP_MAP_MATRIX_H
+
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/matrix/sparsematrix/sparse-map-map-matrix.inl b/linbox/matrix/sparsematrix/sparse-map-map-matrix.inl
new file mode 100644
index 0000000..84e37c8
--- /dev/null
+++ b/linbox/matrix/sparsematrix/sparse-map-map-matrix.inl
@@ -0,0 +1,672 @@
+/* Copyright (C) 2013 LinBox
+ * Written by AJS <stachnik at udel.edu>
+ *
+ *
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ * ========LICENCE========
+ */
+
+/*! @file matrix/sparsematrix/sparse-map-map-matrix.inl
+ * @ingroup sparsematrix
+ * @brief Supports fast elementary row AND column operations simultaneously
+ */
+
+#ifndef __LINBOX_SPARSE_MAP_MAP_MATRIX_INL
+#define __LINBOX_SPARSE_MAP_MAP_MATRIX_INL
+
+#include <stdlib.h>
+#include <fstream>
+#include <sstream>
+#include <set>
+#include <utility>
+#include <linbox/util/matrix-stream.h>
+
+namespace LinBox
+{
+
+template<class Field_>
+SparseMatrix<Field_,SparseMatrixFormat::SMM>::SparseMatrix() : MD_(),numCols_(0), numRows_(0), nnz_(0) {}
+
+template<class Field_>
+SparseMatrix<Field_,SparseMatrixFormat::SMM>::SparseMatrix(const Field& F) :
+ MD_(F),numCols_(0), numRows_(0), nnz_(0) {F.assign(zero_,F.zero);}
+
+template<class Field_>
+SparseMatrix<Field_,SparseMatrixFormat::SMM>::SparseMatrix(const Field& F, Index r, Index c):
+ MD_(F), numCols_(c), numRows_(r), nnz_(0) {F.assign(zero_,F.zero);}
+
+template<class Field_>
+void SparseMatrix<Field_,SparseMatrixFormat::SMM>::init(const Field& F, Index r, Index c) {
+ MD_=F;
+ F.assign(zero_,F.zero);
+ shape(r,c);
+}
+
+template<class Field_>
+void SparseMatrix<Field_,SparseMatrixFormat::SMM>::shape(Index r, Index c) {
+ rowMap_.clear();
+ colMap_.clear();
+ numRows_=r;
+ numCols_=c;
+ nnz_=0;
+}
+
+template<class Field_>
+template<class Vector>
+void SparseMatrix<Field_,SparseMatrixFormat::SMM>::fromVector(const Vector& vec, Index r, Index c) {
+ shape(r,c);
+ if (numCols_==1) {
+ for (Index i=0;i<numRows_;++i) {
+ setEntry(i,0,vec[i]);
+ }
+ } else {
+ for (Index j=0;j<numCols_;++j) {
+ setEntry(0,j,vec[j]);
+ }
+ }
+}
+
+template<class Field_>
+SparseMatrix<Field_,SparseMatrixFormat::SMM>::SparseMatrix(const SparseMatrix<Field_,SparseMatrixFormat::SMM>& M):
+ MD_(M.field()),
+ rowMap_(M.rowMap_), colMap_(M.colMap_),
+ numCols_(M.numCols_), numRows_(M.numRows_),
+ nnz_(M.nnz_), zero_(M.zero_) {}
+
+template<class Field_>
+SparseMatrix<Field_,SparseMatrixFormat::SMM>& SparseMatrix<Field_,SparseMatrixFormat::SMM>::operator=(const SparseMatrix<Field_,SparseMatrixFormat::SMM>& rhs)
+{
+ if (rhs==this) return;
+ MD_.init(rhs.MD_);
+ numCols_=rhs.numCols_;
+ numRows_=rhs.numRows_;
+ rowMap_=rhs.rowMap_;
+ colMap_=rhs.colMap_;
+ nnz_=rhs.nnz_;
+ zero_=rhs.zero_;
+
+ return *this;
+}
+
+template<class Field_>
+SparseMatrix<Field_,SparseMatrixFormat::SMM>::~SparseMatrix() {}
+
+template<class Field_>
+const Field_& SparseMatrix<Field_,SparseMatrixFormat::SMM>::field() const
+{
+ return MD_.field();
+}
+
+template<class Field_>
+bool SparseMatrix<Field_,SparseMatrixFormat::SMM>::verify()
+{
+ for (int i=0;i<rowdim();++i) {
+ for (int j=0;j<coldim();++j) {
+ Element d=zero_;
+ MapConstIt row=rowMap_.find(i);
+ if (row != rowMap_.end()) {
+ VectorConstIt entry=(row->second).find(j);
+ if (entry != (row->second.end())) {
+ d=entry->second;
+ }
+ }
+ Element e=zero_;
+ MapConstIt col=colMap_.find(j);
+ if (col != colMap_.end()) {
+ VectorConstIt entry=(col->second).find(i);
+ if (entry != (col->second.end())) {
+ e=entry->second;
+ }
+ }
+ if (d!=e) {
+ return false;
+ }
+ }
+ }
+ return true;
+}
+
+template<class Field_>
+void SparseMatrix<Field_,SparseMatrixFormat::SMM>::setEntry(Index i, Index j, const Element& e)
+{
+ VectorIt it=rowMap_[i].find(j);
+ if (it != rowMap_[i].end()) {
+ --nnz_;
+ rowMap_[i].erase(it);
+ VectorIt colIt=colMap_[j].find(i);
+ colMap_[j].erase(colIt);
+ }
+
+ if (!field().isZero(e)) {
+ ++nnz_;
+ field().assign(rowMap_[i][j],e);
+ field().assign(colMap_[j][i],e);
+ }
+}
+
+template<class Field_> const typename SparseMatrix<Field_,SparseMatrixFormat::SMM>::Element&
+SparseMatrix<Field_,SparseMatrixFormat::SMM>::getEntry(Index i, Index j) const
+{
+ MapConstIt row=rowMap_.find(i);
+ if (row != rowMap_.end()) {
+ VectorConstIt entry=(row->second).find(j);
+ if (entry != (row->second.end())) {
+ return (entry->second);
+ }
+ }
+ return zero_;
+}
+
+template<class Field_> const typename SparseMatrix<Field_,SparseMatrixFormat::SMM>::Element&
+SparseMatrix<Field_,SparseMatrixFormat::SMM>::getEntry(Element& d, Index i, Index j) const
+{
+ MapConstIt row=rowMap_.find(i);
+ if (row != rowMap_.end()) {
+ VectorConstIt entry=(row->second).find(j);
+ if (entry != (row->second.end())) {
+ d=entry->second;
+ return (entry->second);
+ }
+ }
+ d=zero_;
+ return zero_;
+}
+
+template<class Field_>
+template<class OutVector, class InVector>
+OutVector& SparseMatrix<Field_,SparseMatrixFormat::SMM>::apply(OutVector& y, const InVector& x) const
+{
+ linbox_check(rowdim()==y.size());
+ linbox_check(coldim()==x.size());
+ for (int i=0;i<rowdim();++i) {
+ Element d,e;
+ field().init(d,0);
+ MapConstIt rowI=rowMap_.find(i);
+ if (rowI != rowMap_.end()) {
+ for (VectorConstIt it=rowI->second.begin();
+ it!=rowI->second.end();++it) {
+ field().mul(e,it->second,x[it->first]);
+ field().addin(d,e);
+ }
+ }
+ y[i]=d;
+ }
+ return y;
+}
+
+template<class Field_>
+template<class OutVector, class InVector>
+OutVector& SparseMatrix<Field_,SparseMatrixFormat::SMM>::applyTranspose(OutVector& y, const InVector& x) const
+{
+ linbox_check(coldim()==y.size());
+ linbox_check(rowdim()==x.size());
+ for (int i=0;i<coldim();++i) {
+ Element d,e;
+ field().init(d,0);
+ MapConstIt colI=colMap_.find(i);
+ if (colI != colMap_.end()) {
+ for (VectorConstIt it=colI->second.begin();
+ it!=colI->second.end();++it) {
+ field().mul(e,it->second,x[it->first]);
+ field().addin(d,e);
+ }
+ }
+ y[i]=d;
+ }
+ return y;
+}
+
+//forall r: A_{i,r}<-A_{i,r}+k*A_{j,r}
+template<class Field_>
+void SparseMatrix<Field_,SparseMatrixFormat::SMM>::addRow(const Element& k, Index i, Index j)
+{
+ MapIt rowJ=rowMap_.find(j);
+ if (rowJ != rowMap_.end()) {
+ for (VectorIt it=rowJ->second.begin();it!=rowJ->second.end();++it) {
+ Index col=it->first;
+ Element d=getEntry(i,col);
+ field().axpyin(d,k,it->second);
+ setEntry(i,col,d);
+ }
+ }
+}
+
+//forall r: A_{r,i}<-A_{r,i}+k*A_{r,j}
+template<class Field_>
+void SparseMatrix<Field_,SparseMatrixFormat::SMM>::addCol(const Element& k, Index i, Index j)
+{
+ MapIt colJ=colMap_.find(j);
+ if (colJ != colMap_.end()) {
+ for (VectorIt it=colJ->second.begin();it!=colJ->second.end();++it) {
+ Index row=it->first;
+ Element d = getEntry(row,i);
+ field().axpyin(d,k,it->second);
+ setEntry(row,i,d);
+ }
+ }
+}
+
+//forall r: A_{i,r}<-k*A_{i,r}
+template<class Field_>
+void SparseMatrix<Field_,SparseMatrixFormat::SMM>::timesRow(const Element& k, Index i)
+{
+ linbox_check(!(field().isZero(k)));
+
+ MapIt row=rowMap_.find(i);
+ if (row != rowMap_.end()) {
+ for (VectorIt it=row->second.begin();it!=row->second.end();++it) {
+ Index col=it->first;
+ field().mulin(rowMap_[i][col],k);
+ field().mulin(colMap_[col][i],k);
+ }
+ }
+}
+
+//forall r: A_{r,j}<-k*A_{r,j}
+template<class Field_>
+void SparseMatrix<Field_,SparseMatrixFormat::SMM>::timesCol(const Element& k, Index j)
+{
+ linbox_check(!(field().isZero(k)));
+
+ MapIt col=colMap_.find(j);
+ if (col != colMap_.end()) {
+ for (VectorIt it=col->second.begin();it!=col->second.end();++it) {
+ Index row=it->first;
+ field().mulin(rowMap_[row][j],k);
+ field().mulin(colMap_[j][row],k);
+ }
+ }
+}
+
+template<class Field_>
+void SparseMatrix<Field_,SparseMatrixFormat::SMM>::swapRows(Index i, Index j)
+{
+ VectorType oldRowI=rowMap_[i];
+ VectorType oldRowJ=rowMap_[j];
+
+ rowMap_[i].clear();
+ rowMap_[j].clear();
+
+ for (VectorIt it=oldRowI.begin();it!=oldRowI.end();++it) {
+ Index col=it->first;
+ colMap_[col].erase(colMap_[col].find(i));
+ }
+
+ for (VectorIt it=oldRowJ.begin();it!=oldRowJ.end();++it) {
+ Index col=it->first;
+ colMap_[col].erase(colMap_[col].find(j));
+ }
+
+ for (VectorIt it=oldRowI.begin();it!=oldRowI.end();++it) {
+ Index col=it->first;
+ rowMap_[j][col]=oldRowI[col];
+ colMap_[col][j]=oldRowI[col];
+ }
+
+ for (VectorIt it=oldRowJ.begin();it!=oldRowJ.end();++it) {
+ Index col=it->first;
+ rowMap_[i][col]=oldRowJ[col];
+ colMap_[col][i]=oldRowJ[col];
+ }
+}
+
+template<class Field_>
+void SparseMatrix<Field_,SparseMatrixFormat::SMM>::swapCols(Index i, Index j)
+{
+ VectorType oldColI=colMap_[i];
+ VectorType oldColJ=colMap_[j];
+
+ colMap_[i].clear();
+ colMap_[j].clear();
+
+ for (VectorIt it=oldColI.begin();it!=oldColI.end();++it) {
+ Index row=it->first;
+ rowMap_[row].erase(rowMap_[row].find(i));
+ }
+
+ for (VectorIt it=oldColJ.begin();it!=oldColJ.end();++it) {
+ Index row=it->first;
+ rowMap_[row].erase(rowMap_[row].find(j));
+ }
+
+ for (VectorIt it=oldColI.begin();it!=oldColI.end();++it) {
+ Index row=it->first;
+ colMap_[j][row]=oldColI[row];
+ rowMap_[row][j]=oldColI[row];
+ }
+
+ for (VectorIt it=oldColJ.begin();it!=oldColJ.end();++it) {
+ Index row=it->first;
+ colMap_[i][row]=oldColJ[row];
+ rowMap_[row][i]=oldColJ[row];
+ }
+}
+
+template<class Field_>
+typename SparseMatrix<Field_,SparseMatrixFormat::SMM>::Index SparseMatrix<Field_,SparseMatrixFormat::SMM>::nnz() const
+{
+ return nnz_;
+}
+
+// A -> A' = SAS^{-1}, and A' has about nnz nonzero entries.
+template<class Field_>
+void SparseMatrix<Field_,SparseMatrixFormat::SMM>::randomSim(Index nz, int seed)
+{ typename Field::Element a;
+ Index i,j;
+ MersenneTwister ri;
+ typename Field::RandIter r(field(),0, seed);
+ //if (seed != 0) { ri.setSeed(seed); r.setSeed(seed); }
+ if (seed != 0)
+ { ri.setSeed(seed);
+ // ridiculous constructor only seeding!
+ typename Field::RandIter s(field(), 0, seed);
+ r = s;
+ }
+ while (nnz() < nz) {
+ nonzerorandom(field(),r,a);
+ i = ri.randomIntRange(0, rowdim()); j = ri.randomIntRange(0, coldim());
+ if (i!=j) {
+ addCol(a, j, i);
+ //std::cout << nnz() << std::endl;
+ field().negin(a);
+ addRow(a, i, j);
+ }
+ }
+}
+
+// A -> A' = UAV, with U and V nonsingular, and A' has about nnz nonzero entries.
+template<class Field_>
+void SparseMatrix<Field_,SparseMatrixFormat::SMM>::randomEquiv(Index nz, int seed)
+{ typename Field::Element a;
+ Index i,j;
+ MersenneTwister ri;
+ typename Field::RandIter r(field(),0,seed);
+ if (seed != 0)
+ { ri.setSeed(seed);
+ // ridiculous seeding!
+ typename Field::RandIter s(field(), 0, seed);
+ r = s;
+ }
+ bool flip = true;
+ int count=0;
+ while (nnz() < nz) {
+ nonzerorandom(field(),r,a);
+ i = ri.randomIntRange(0, rowdim()); j = ri.randomIntRange(0, coldim());
+ if (i!=j){
+ if (flip) addCol(a, i, j);
+ else addRow(a, i, j);
+ flip = not flip;
+ }
+ ++count;
+ }
+}
+
+template<class Field_>
+std::ostream& SparseMatrix<Field_,SparseMatrixFormat::SMM>::print(std::ostream& out) const
+{
+ for (Index i=0;i<numRows_;++i) {
+ for (Index j=0;j<numCols_;++j) {
+ field().write(out,getEntry(i,j));
+ if (j != (numCols_-1)) {
+ out << " ";
+ }
+ }
+ out << std::endl;
+ }
+ return out;
+}
+
+template<class Field_>
+std::ostream& SparseMatrix<Field_,SparseMatrixFormat::SMM>::write(std::ostream& out) const
+{
+ writeMMCoordHeader(out,*this,nnz(),"SparseMatrix<SMM>","");
+
+ for (MapConstIt p = rowMap_.begin(); p != rowMap_.end(); ++p)
+ for (VectorConstIt rp = p->second.begin(); rp != p->second.end(); ++rp)
+ field().write(out << 1+p->first << " " << 1+rp->first << " ", rp->second) << std::endl;
+ out << std::endl;
+ return out;
+}
+
+template<class Field_>
+std::istream& SparseMatrix<Field_,SparseMatrixFormat::SMM>::read(std::istream& in) {
+ Index r,c;
+ Element d;
+ field().init(d);
+ MatrixStream<Field_> ms(field(),in);
+ ms.getDimensions(r,c);
+ shape(r,c);
+ while (ms.nextTriple(r,c,d)) setEntry(r,c,d);
+ return in;
+}
+
+template<class Field_>
+typename SparseMatrix<Field_,SparseMatrixFormat::SMM>::Index SparseMatrix<Field_,SparseMatrixFormat::SMM>::rowdim() const
+{
+ return numRows_;
+}
+
+template<class Field_>
+typename SparseMatrix<Field_,SparseMatrixFormat::SMM>::Index SparseMatrix<Field_,SparseMatrixFormat::SMM>::coldim() const
+{
+ return numCols_;
+}
+
+template<class Field_>
+void SparseMatrix<Field_,SparseMatrixFormat::SMM>::transpose()
+{
+ rowMap_.swap(colMap_);
+ int temp=numCols_;numCols_=numRows_;numRows_=temp;
+}
+
+template<class Field_>
+template<class Matrix>
+void SparseMatrix<Field_,SparseMatrixFormat::SMM>::copy(Matrix& mat) const
+{
+ std::stringstream ss;
+ write(ss);
+ mat.read(ss);
+ mat.finalize();
+}
+
+template<class Field_>
+template<class Matrix>
+void SparseMatrix<Field_,SparseMatrixFormat::SMM>::copyFrom(Matrix& mat)
+{
+ std::stringstream ss;
+ mat.write(ss);
+ read(ss);
+}
+
+template<class Field_>
+template<class Vector>
+void SparseMatrix<Field_,SparseMatrixFormat::SMM>::toVector(Vector& vec) const
+{
+ if (numCols_ == 1) {
+ vec.resize(numRows_);
+ for (Index i=0;i<numRows_;++i) {
+ vec[i]=getEntry(i,0);
+ }
+ } else {
+ vec.resize(numCols_);
+ for (Index j=0;j<numCols_;++j) {
+ vec[j]=getEntry(0,j);
+ }
+ }
+}
+
+template<class Field_>
+void SparseMatrix<Field_,SparseMatrixFormat::SMM>::scaleMat(const Element& k)
+{
+ for (size_t i=0;i<numRows_;++i) {
+ timesRow(k,i);
+ }
+}
+
+template<class Field_>
+bool SparseMatrix<Field_,SparseMatrixFormat::SMM>::areEqual(SparseMatrix<Field_,SparseMatrixFormat::SMM>& rhs) const
+{
+ if (rhs.numCols_ != numCols_) {
+ return false;
+ }
+ if (rhs.numRows_ != numRows_) {
+ return false;
+ }
+ if (nnz_ != rhs.nnz_) {
+ return false;
+ }
+
+ for (MapConstIt rowIt=rowMap_.begin();rowIt!=rowMap_.end();++rowIt) {
+ for (VectorConstIt eltIt=rowIt->second.begin();eltIt!=rowIt->second.end();++eltIt) {
+ if (eltIt->second != rhs.getEntry(rowIt->first,eltIt->first)) {
+ return false;
+ }
+ }
+ }
+ return true;
+}
+
+template<class Field_>
+void SparseMatrix<Field_,SparseMatrixFormat::SMM>::generateDenseRandMat(SparseMatrix<Field_,SparseMatrixFormat::SMM>& mat,int seed)
+{
+ typedef typename Field::Element Element;
+
+ size_t m=mat.rowdim(),n=mat.coldim();
+ Element d;
+
+ typename Field::RandIter ri(field(),0,seed);
+
+ for (size_t i=0;i<m;++i) {
+ for (size_t j=0;j<n;++j) {
+ ri.random(d);
+ mat.setEntry(i,j,d);
+ }
+ }
+}
+
+template<class Field_>
+void SparseMatrix<Field_,SparseMatrixFormat::SMM>::generateRandMat(SparseMatrix<Field_,SparseMatrixFormat::SMM>& mat, int nnz, int seed)
+{
+ typedef typename Field::Element Element;
+
+
+ size_t m=mat.rowdim(),n=mat.coldim();
+ Element d;
+ typename Field::RandIter ri(field(),0,seed);
+ srand(seed);
+
+ typedef std::pair<size_t,size_t> CoordPair;
+ typedef std::set<CoordPair> PairSet;
+ PairSet pairs;
+
+ for(int i = 0; i < (int)nnz; ++i) {
+ size_t row,col;
+ do {
+ row = randRange(0,(int)m);
+ col = randRange(0,(int)n);
+ } while (pairs.count(CoordPair(row,col))!=0);
+
+ nonzerorandom(field(),ri,d);
+ mat.setEntry(row,col,d);
+ pairs.insert(CoordPair(row,col));
+ }
+}
+
+template<class Field_>
+void SparseMatrix<Field_,SparseMatrixFormat::SMM>::
+generateScaledIdent(SparseMatrix<Field_,SparseMatrixFormat::SMM>& mat,
+ const typename Field_::Element& d)
+{
+ size_t m=mat.rowdim(),n=mat.coldim();
+ size_t minDim=(m<n)?m:n;
+
+ for (size_t i=0;i<minDim;++i) {
+ mat.setEntry(i,i,d);
+ }
+}
+
+template<class Field_>
+void SparseMatrix<Field_,SparseMatrixFormat::SMM>::generateSparseNonSingular(SparseMatrix<Field_,SparseMatrixFormat::SMM>& mat, int approxNNZ, int seed)
+{
+ typedef typename Field::Element Element;
+ int n=mat.rowdim();
+ linbox_check(mat.rowdim()==mat.coldim());
+
+ typename Field::RandIter r(mat.field(),0,seed);
+
+ Element d;
+
+ for (int i=0;i<n;++i) {
+ nonzerorandom(field(),r,d);
+ mat.setEntry(i,i,d);
+ }
+
+ mat.randomEquiv(approxNNZ,seed);
+}
+
+template<class Field_>
+void SparseMatrix<Field_,SparseMatrixFormat::SMM>::generateCompanion(SparseMatrix<Field_,SparseMatrixFormat::SMM>& mat,std::vector<typename Field::Element>& coeffs)
+{
+ typedef typename Field::Element Element;
+ int n=mat.rowdim();
+ linbox_check(mat.rowdim()==mat.coldim());
+ linbox_check(n==coeffs.size());
+
+ Element d;
+ mat.field().assign(d,mat.field().one);
+ for (int i=1;i<n;++i) {
+ mat.setEntry(i,i-1,d);
+ }
+ for (int i=0;i<n;++i) {
+ mat.setEntry(i,n-1,coeffs[i]);
+ }
+}
+
+template<class Field_>
+int SparseMatrix<Field_,SparseMatrixFormat::SMM>::randRange(int start, int end)
+{
+ double rval = rand();
+ static const double NORMALIZING_CONSTANT = 1.0/(1.0+RAND_MAX);
+ double normedRVal = rval*NORMALIZING_CONSTANT;
+ double rangeSize = end-start;
+ int offset = (int)(rangeSize*normedRVal);
+ return start+offset;
+}
+
+template<class Field_>
+typename Field_::Element&
+SparseMatrix<Field_,SparseMatrixFormat::SMM>::nonzerorandom(const Field_& F,typename Field_::RandIter&r,typename Field_::Element& e)
+{
+ do {
+ r.random(e);
+ } while (F.isZero(e));
+ return e;
+}
+
+}
+
+#endif // __LINBOX_SPARSE_MAP_MAP_MATRIX_INL
+
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/matrix/sparsematrix/sparse-parallel-vector.h b/linbox/matrix/sparsematrix/sparse-parallel-vector.h
new file mode 100644
index 0000000..9d57a86
--- /dev/null
+++ b/linbox/matrix/sparsematrix/sparse-parallel-vector.h
@@ -0,0 +1,735 @@
+/* linbox/matrix/sparse-matrix.h
+ * Copyright (C) 2001-2002 Bradford Hovinen
+ * 1999-2001 William J Turner,
+ *
+ * Written by William J Turner <wjturner at math.ncsu.edu>,
+ * Bradford Hovinen <hovinen at cis.udel.edu>
+ *
+ * --------------------------------------------------------
+ * 2003-01-11 Bradford Hovinen <bghovinen at math.uwaterloo.ca>
+ *
+ * Move from blackbox/sparse-base.h to matrix/sparse-matrix.h
+ * ------------------------------------
+ * 2002-11-28 Bradford Hovinen <bghovinen at math.uwaterloo.ca>
+ *
+ * - Renamed ColOfRowsIterator to RowIterator
+ * - Named template argument _Row rather than Row; add a typedef to Row
+ * - Named template argument _Element rather than Row; add a typedef to Element
+ * - Renamed IndexIterator as IndexedIterator, and adjusted to match
+ * interface in DenseMatrixBase
+ * ------------------------------------
+ * 2002-08-06 Bradford Hovinen <hovinen at cis.udel.edu>
+ *
+ * Renamed to sparse-base.h from sparse0-base.h
+ * ------------------------------------
+ * Modified by Bradford Hovinen <hovinen at cis.udel.edu>
+ *
+ * Refactoring:
+ * - Eliminated SparseMatrixAux and moved that functionality into Sparse0
+ * - Made SparseMatrixGeneric parameterized only on the element type
+ * - New read/write implementations for SparseMatrixGeneric, supporting multiple
+ * formats
+ * - Eliminated Gaussian elimination code
+ * - Added iterators, including ColOfRowsIterator, Iterator, and
+ * IndexIterator
+ * - Eliminated operator []; added getEntry; changed put_value to setEntry
+ * ------------------------------------
+ *
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ * ========LICENCE========
+ *.
+ */
+
+/** @file linbox/matrix/sparsematrix/sparse-parallel-vector.h
+ * @brief
+ */
+
+#ifndef __LINBOX_matrix_sparsematrix_sparse_parallel_vector_H
+#define __LINBOX_matrix_sparsematrix_sparse_parallel_vector_H
+
+
+namespace LinBox {
+
+
+ // Specialization of the above for sparse parallel vectors
+ template <class _Field, class Row>
+ class SparseMatrixWriteHelper<Protected::SparseMatrixGeneric<_Field, Row, VectorCategories::SparseParallelVectorTag > > {
+ public:
+ typedef _Field Field;
+ typedef typename Field::Element Element;
+ typedef typename Protected::SparseMatrixGeneric<Field, Row> Matrix ;
+ private:
+ static std::ostream &writeTriple (const Matrix &A, std::ostream &os, bool oneBased = false);
+
+ static std::ostream &writePretty (const Matrix &A, std::ostream &os
+ , std::string begmat
+ , std::string endmat
+ , std::string begrow
+ , std::string endrow
+ , std::string sepelt
+ , std::string seprow
+ );
+
+
+ public:
+
+ static std::ostream &write (const Matrix &A, std::ostream &os
+ , LINBOX_enum(Tag::FileFormat) format);
+ };
+
+} // LinBox
+
+
+namespace LinBox { namespace Protected {
+ /* Specialization for sparse parallel vectors */
+ template <class _Field, class _Row>
+ class SparseMatrixGeneric<_Field, _Row, VectorCategories::SparseParallelVectorTag > {
+ public:
+
+ typedef _Field Field;
+ typedef typename Field::Element Element;
+
+ typedef _Row Row;
+ typedef const Row ConstRow;
+ typedef _SP_BB_VECTOR_<Row> Rep;
+ typedef VectorCategories::SparseParallelVectorTag myTrait;
+ typedef SparseMatrixGeneric<_Field, _Row, myTrait> Self_t;
+
+#ifdef __LINBOX_PARALLEL
+ BB_list_list sub_list;
+#endif
+
+
+ template<typename _Tp1, typename _R1 = typename Rebind<_Row,_Tp1>::other >
+ struct rebind {
+ typedef SparseMatrixGeneric<_Tp1, _R1> other;
+
+ void operator() (other & Ap, const Self_t& A) {
+
+ typename _Tp1::Element e;
+
+ Hom<typename Self_t::Field, _Tp1> hom(A.field(), Ap.field());
+ for( typename Self_t::ConstIndexedIterator
+ indices = A.IndexedBegin();
+ (indices != A.IndexedEnd()) ;
+ ++indices ) {
+ // hom. image (e, A.getEntry(indices.rowIndex(),indices.colIndex()) );
+ hom. image (e, indices.value() );
+ if (!Ap.field().isZero(e))
+ Ap.setEntry (indices.rowIndex(),
+ indices.colIndex(), e);
+ }
+ }
+
+ };
+
+ template<typename _Tp1, typename _Rw1>
+ SparseMatrixGeneric (const SparseMatrixGeneric<_Tp1, _Rw1, myTrait> &Mat, const Field& F) :
+ _field (F),
+ _MD (F), _AT (*this)
+ , _matA (Mat.rowdim()), _m (Mat.rowdim()), _n (Mat.coldim())
+ {
+ typename SparseMatrixGeneric<_Tp1,_Rw1, myTrait>::template rebind<Field,_Row>()(*this, Mat);
+ }
+
+ SparseMatrixGeneric (const Field & F, size_t m, size_t n) :
+ _field(F),
+ _MD(F),_AT(*this),
+ _matA (m), _m (m), _n (n)
+ {}
+
+ SparseMatrixGeneric (const Field & F) :
+ _field (F),
+ _MD(F),_AT(*this),
+ _matA(0), _m(0), _n(0)
+ {};
+
+
+ SparseMatrixGeneric (const SparseMatrixGeneric<Field, Row> &A) :
+ _field(A.field()),
+ _MD(A.field()),_AT(*this),
+ _matA (A._matA), _m (A._m), _n (A._n)
+ {}
+
+ template<class VectorType>
+ SparseMatrixGeneric (const SparseMatrixGeneric<Field, VectorType> &A) :
+ _field(A.field()),
+ _MD(A.field()),_AT(*this),
+ _matA(A.rowdim()), _m (A.rowdim()), _n (A.coldim())
+ {
+ typename Rep::iterator meit = this->_matA.begin();
+ typename SparseMatrixGeneric<Field, VectorType>::Rep::const_iterator copit = A._matA.begin();
+ for( ; meit != this->_matA.end(); ++meit, ++copit)
+ LinBox::RawVector<Element>::convert(*meit, *copit);
+ }
+
+ /** Constructor from a MatrixStream
+ */
+ SparseMatrixGeneric ( MatrixStream<Field>& ms );
+
+ template<class VectStream>
+ SparseMatrixGeneric (const Field &F, VectStream &stream) :
+ _field (F), _MD (F), _AT (*this)
+ , _matA (stream.size()), _m (stream.size()), _n (stream.dim())
+ {
+ typename Self_t::RowIterator i;
+
+ for (i = Self_t::rowBegin (); i != Self_t::rowEnd (); ++i)
+ stream >> *i;
+ }
+
+ ~SparseMatrixGeneric () {}
+
+ size_t rowdim () const
+ {
+ return _m;
+ }
+
+ size_t coldim () const
+ {
+ return _n;
+ }
+
+ size_t size () const
+ {
+ size_t s(0);
+ for(typename Rep::const_iterator it = _matA.begin(); it != _matA.end(); ++it)
+ s+= LinBox::RawVector<Element>::size(*it);
+ return s;
+ }
+
+ std::istream &read (std::istream &is
+ , LINBOX_enum(Tag::FileFormat) format = Tag::FileFormat::Detect )
+ {
+ return SparseMatrixReadHelper<Self_t>::read (*this, is , format);
+ }
+
+
+ std::ostream &write (std::ostream &os
+ , LINBOX_enum(Tag::FileFormat) format = Tag::FileFormat::MatrixMarket ) const
+ {
+ return SparseMatrixWriteHelper<Self_t>::write (*this, os, format);
+ }
+
+ void appendEntry(size_t i, size_t j, const Element & value) { setEntry(i,j,value) ;}
+ void finalize(){}
+
+ void setEntry (size_t i, size_t j, const Element &value);
+
+
+ Element &refEntry (size_t i, size_t j);
+
+ const Element &getEntry (size_t i, size_t j) const;
+
+ Element &getEntry (Element &x, size_t i, size_t j) const
+ {
+ return x = getEntry (i, j);
+ }
+
+ typedef typename Rep::iterator RowIterator;
+ typedef typename Rep::const_iterator ConstRowIterator;
+
+ ConstRowIterator rowBegin () const
+ {
+ return _matA.begin ();
+ }
+
+ ConstRowIterator rowEnd () const
+ {
+ return _matA.end ();
+ }
+
+ RowIterator rowBegin ()
+ {
+ return _matA.begin ();
+ }
+
+ RowIterator rowEnd ()
+ {
+ return _matA.end ();
+ }
+
+ template <class RepIterator, class RowEltIterator, class _I_Element>
+ class _Iterator {
+ public:
+ typedef _I_Element value_type;
+
+ _Iterator (const RepIterator &i, const RowEltIterator &j, const RepIterator &A_end) :
+ _i (i), _j (j), _A_end (A_end)
+ {
+ if( _i == _A_end ) return;
+ while( _j == _i->second.end() ) {
+ if( ++_i == _A_end ) return;
+ _j = _i->second.begin();
+ }
+ }
+
+ _Iterator (const _Iterator &iter) :
+ _i (iter._i), _j (iter._j), _A_end (iter._A_end)
+ {}
+
+ _Iterator () {}
+
+ _Iterator &operator = (const _Iterator &iter)
+ {
+ _i = iter._i;
+ _j = iter._j;
+ _A_end = iter._A_end;
+
+ return *this;
+ }
+
+ bool operator == (const _Iterator &i) const
+ {
+ return (_i == i._i) && (_j == i._j);
+ }
+
+ bool operator != (const _Iterator &i) const
+ {
+ return (_i != i._i) || (_j != i._j);
+ }
+
+ _Iterator &operator ++ ()
+ {
+ ++_j;
+ while( _j == _i->second.end() ) {
+ if( ++_i == _A_end ) return *this;
+ _j = _i->second.begin();
+ }
+ return *this;
+ }
+
+ _Iterator operator ++ (int)
+ {
+ _Iterator tmp = *this;
+ ++(*this);
+ return tmp;
+ }
+
+ _Iterator &operator -- ()
+ {
+ while (_j == _i->second.begin ())
+ _j = (--_i)->second.end ();
+ --_j;
+ return *this;
+ }
+
+ _Iterator operator -- (int)
+ {
+ _Iterator tmp = *this;
+ --(*this);
+ return tmp;
+ }
+
+ value_type &operator * ()
+ {
+ return static_cast<value_type&>(*_j);
+ }
+
+ value_type *operator -> ()
+ {
+ return &(*_j);
+ }
+
+ private:
+ RepIterator _i;
+ RowEltIterator _j;
+ RepIterator _A_end;
+ };
+
+ typedef _Iterator<typename Rep::iterator, typename Row::second_type::iterator, Element> Iterator;
+ typedef _Iterator<typename Rep::const_iterator, typename Row::second_type::const_iterator, const Element> ConstIterator;
+
+ Iterator Begin ()
+ {
+ return Iterator (_matA.begin (), _matA.front ().second.begin (), _matA.end ());
+ }
+ Iterator End ()
+ {
+ return Iterator (_matA.end (), _matA.back ().second.end (), _matA.end ());
+ }
+ ConstIterator Begin () const
+ {
+ return ConstIterator (_matA.begin (), _matA.front ().second.begin (), _matA.end ());
+ }
+ ConstIterator End () const
+ {
+ return ConstIterator (_matA.end (), _matA.back ().second.end (), _matA.end ());
+ }
+
+ /* Generic trait for iterators without type */
+ template<typename U>
+ struct IteratorValueType {
+ typedef typename U::value_type value_type;
+ };
+
+ template<typename X>
+ struct IteratorValueType<const X*> {
+ typedef X value_type;
+ };
+
+
+ template <class RepIterator, class RowIdxIterator>
+ class _IndexedIterator {
+ public:
+ typedef typename IteratorValueType<RepIterator>::value_type PairValue ;
+ typedef typename PairValue::second_type::value_type value_type;
+
+ typedef _IndexedIterator<RepIterator,RowIdxIterator> Self_t;
+
+ // typedef typename IteratorValueType< RepIterator >::second_type::value_type value_type;
+
+ // Dan Roche 7-6-05 Fixed a seg fault this code was causing
+ _IndexedIterator (size_t idx, const RepIterator &i,
+ const RowIdxIterator &j, const RepIterator &A_end) :
+ _i (i), _j (j), _A_end (A_end), _r_index (idx), _c_index(0), _value_index(0)
+ {
+ if( _i == _A_end ) return;
+ while( _j == _i->first.end() ) {
+ if( ++_i == _A_end ) return;
+ ++_r_index;
+ _j = _i->first.begin();
+ }
+
+ _c_index = *_j;
+ _value_index = (size_t)( _j-_i->first.begin());
+ }
+
+ _IndexedIterator (const _IndexedIterator &iter) :
+ _i (iter._i), _j (iter._j),
+ _A_end (iter._A_end), _r_index (iter._r_index),
+ _c_index (iter._c_index), _value_index( iter._value_index )
+ {}
+
+ _IndexedIterator ()
+ {}
+
+ _IndexedIterator &operator = (const _IndexedIterator &iter)
+ {
+ _A_end = iter._A_end;
+ _i = iter._i;
+ _j = iter._j;
+ _r_index = iter._r_index;
+ _c_index = iter._c_index;
+ _value_index = iter._value_index;
+
+ return *this;
+ }
+
+ bool operator == (const _IndexedIterator &i) const
+ {
+ return (_i == i._i) && (_j == i._j);
+ }
+
+ bool operator != (const _IndexedIterator &i) const
+ {
+ return (_i != i._i) || (_j != i._j);
+ }
+
+ _IndexedIterator &operator ++ ()
+ {
+ if(_j != _i->first.end ()) {
+ ++_j ;
+ ++_value_index;
+ }
+ while(_j == _i->first.end ()) {
+ ++_r_index;
+ if (++_i == _A_end) return *this;
+ _j = _i->first.begin ();
+ _value_index = 0;
+ }
+ _c_index = *_j;
+
+ return *this;
+ }
+
+ _IndexedIterator operator ++ (int)
+ {
+ _IndexedIterator tmp = *this;
+ ++(*this);
+ return tmp;
+ }
+
+ _IndexedIterator &operator -- ()
+ {
+ while (_j == _i->first.begin ()) {
+ _j = (--_i)->first.end ();
+ _value_index = _i->first.size();
+ --_r_index;
+ }
+
+ --_j;
+ --_value_index;
+ _c_index = *_j;
+ return *this;
+ }
+
+ _IndexedIterator operator -- (int)
+ {
+ _IndexedIterator tmp = *this;
+ --(*this);
+ return tmp;
+ }
+
+
+#if 0
+ // JGD 26.11.2012
+ // Since some compliers would not choose it even though they are
+ // called via a ConstIterator, const version is removed,
+ // call to const is now only explicit
+ // via call to "value()" below instead
+ const value_type &operator * () const
+ {
+ return *(_i->second.begin () + _c_index);
+ }
+#endif
+
+ value_type &operator * ()
+ {
+ return (_i->second)[_value_index];
+ }
+
+#if 0
+ value_type *operator -> ()
+ {
+ return &(*(_i->second.begin () + _c_index));
+ }
+ const value_type *operator -> () const
+ {
+ return &(*(_i->second.begin () + _c_index));
+ }
+#endif
+
+ size_t rowIndex () const
+ {
+ return _r_index;
+ }
+ size_t colIndex () const
+ {
+ return _c_index;
+ }
+ const value_type &value () const
+ {
+ return (const value_type&)(_i->second)[_value_index];
+ }
+
+ private:
+ RepIterator _i;
+ RowIdxIterator _j;
+ RepIterator _A_end;
+
+ mutable size_t _r_index;
+ mutable size_t _c_index;
+ mutable size_t _value_index;
+ };
+
+ typedef _IndexedIterator<typename Rep::iterator, typename Row::first_type::iterator> IndexedIterator;
+ typedef _IndexedIterator<typename Rep::const_iterator, typename Row::first_type::const_iterator> ConstIndexedIterator;
+
+ IndexedIterator IndexedBegin ()
+ {
+ return IndexedIterator (0, _matA.begin (), _matA.front ().first.begin (), _matA.end ());
+ }
+ IndexedIterator IndexedEnd ()
+ {
+ return IndexedIterator (_m, _matA.end (), _matA.back ().first.end (), _matA.end ());
+ }
+ ConstIndexedIterator IndexedBegin () const
+ {
+ return ConstIndexedIterator (0, _matA.begin (), _matA.front ().first.begin (), _matA.end ());
+ }
+ ConstIndexedIterator IndexedEnd () const
+ {
+ return ConstIndexedIterator (_m, _matA.end (), _matA.back ().first.end (), _matA.end ());
+ }
+
+ Row &getRow (size_t i) {
+ return _matA[i];
+ }
+ Row &operator [] (size_t i) {
+ return _matA[i];
+ }
+ ConstRow &operator [] (size_t i) const
+ {
+ return _matA[i];
+ }
+
+ template <class Vector> Vector &columnDensity (Vector &v) const;
+ SparseMatrixGeneric &transpose (SparseMatrixGeneric &AT) const;
+
+ const Field & field() const
+ {
+ return _field ;
+ }
+ /** Matrix-vector product
+ * \f$y = A x\f$.
+ * @return reference to output vector y
+ * @param x input vector
+ * @param y
+ */
+ template <class OutVector, class InVector>
+ OutVector &apply (OutVector &y, const InVector &x) const
+ {
+#ifdef __LINBOX_PARALLEL
+ return BlackboxParallel (y, *this, x, BBBase::Apply);
+#else
+ return _MD.vectorMul (y, *this, x);
+#endif
+ }
+
+ /** Transpose matrix-vector product
+ * \f$ y = A^T x\f$.
+ * @return reference to output vector y
+ * @param x input vector
+ * @param y
+ */
+ template <class OutVector, class InVector>
+ OutVector &applyTranspose (OutVector& y, const InVector &x) const
+ {
+#ifdef __LINBOX_PARALLEL
+ return BlackboxParallel (y, *this, x, BBBase::ApplyTranspose);
+#else
+ return _MD.vectorMul (y, _AT, x);
+#endif
+ }
+
+ const Rep & getRep() const
+ {
+ return _matA;
+ }
+
+ Rep & refRep()
+ {
+ return _matA;
+ }
+
+ void resize( const size_t & m, const size_t & n, const size_t & z = 0)
+ {
+ _m = m ;
+ _n = n ;
+ _matA.clear();
+ _matA.resize(m);
+
+ }
+
+ protected:
+
+ friend class SparseMatrixWriteHelper<Self_t>;
+ friend class SparseMatrixReadHelper<Self_t>;
+
+ const Field & _field;
+
+ MatrixDomain<Field> _MD; // Matrix domain for matrix operations
+ TransposeMatrix<SparseMatrixGeneric<_Field, _Row> > _AT;
+ Rep _matA;
+ size_t _m;
+ size_t _n;
+
+ // template<class F, class R, class T> friend class SparseMatrixGeneric;
+ };
+
+} // namespace LinBox
+} // namespace Protected
+
+#include "linbox/matrix/sparsematrix/sparse-parallel-vector.inl"
+
+namespace LinBox
+{
+
+ template <class _Field /*, class _Row */ >
+ class SparseMatrix<_Field, SparseMatrixFormat::SparsePar/* <_Row> */ > : public Protected::SparseMatrixGeneric<_Field,/* _Row */ typename Vector<_Field>::SparsePar,VectorCategories::SparseParallelVectorTag>
+ {
+ public:
+ typedef VectorCategories::SparseParallelVectorTag myTrait ;
+ typedef _Field Field ; //!< Field
+ typedef typename _Field::Element Element ; //!< Element
+ typedef const Element constElement ; //!< const Element
+ typedef typename Vector<_Field>::SparsePar Row ;
+ typedef SparseMatrixFormat::SparsePar Storage ; //!< Matrix Storage Format
+ typedef SparseMatrix<_Field,Storage> Self_t ; //!< Self type
+ typedef Protected::SparseMatrixGeneric<_Field,Row,myTrait > Father_t ;
+
+ public:
+ template<class VectStream>
+ SparseMatrix (const Field &F, VectStream &stream) :
+ Father_t(F,stream)
+ {}
+
+ SparseMatrix(const Field & F, size_t m, size_t n) :
+ Father_t(F, m, n)
+ {}
+
+ SparseMatrix(const Field & F) :
+ Father_t(F)
+ {}
+
+ SparseMatrix ( MatrixStream<Field>& ms ) :
+ Father_t(ms)
+ {}
+
+ template<class _Tp1, class _Storage>
+ SparseMatrix(const SparseMatrix<_Tp1,_Storage> & Mat, const Field & F) :
+ Father_t(F, Mat.rowdim(), Mat.coldim())
+ {
+ typename SparseMatrix<_Tp1,_Storage>::template rebind<Field,Storage>()(*this, Mat);
+
+ }
+
+
+
+ // using Father_t::RowIterator;
+
+ template<typename _Tp1, typename _R1 = SparseMatrixFormat::SparsePar >
+ struct rebind {
+ typedef SparseMatrix<_Tp1, _R1> other;
+
+ void operator() (other & Ap, const Self_t& A) {
+
+ typename _Tp1::Element e;
+
+ Hom<typename Self_t::Field, _Tp1> hom(A.field(), Ap.field());
+ for( typename Self_t::ConstIndexedIterator
+ indices = A.IndexedBegin();
+ indices != A.IndexedEnd() ;
+ ++indices ) {
+ hom. image (e, indices.value() );
+ if (!Ap.field().isZero(e))
+ Ap.setEntry (indices.rowIndex(),
+ indices.colIndex(), e);
+ }
+ }
+
+ };
+
+ } ; // SparseMatrix
+
+
+
+} // namespace LinBox
+
+#endif // __LINBOX_matrix_sparsematrix_sparse_parallel_vector_H
+
+
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/matrix/sparsematrix/sparse-parallel-vector.inl b/linbox/matrix/sparsematrix/sparse-parallel-vector.inl
new file mode 100644
index 0000000..28cc788
--- /dev/null
+++ b/linbox/matrix/sparsematrix/sparse-parallel-vector.inl
@@ -0,0 +1,359 @@
+/* linbox/matrix/sparse.inl
+ * Copyright (C) 2001-2002 Bradford Hovinen
+ * 1999-2001 William J Turner,
+ *
+ * Written by Bradford Hovinen <hovinen at cis.udel.edu>
+ * Based on sparse-base.h by William J Turner <wjturner at math.ncsu.edu>
+ *
+ * --------------------------------------------------------
+ * 2003-01-11 Bradford Hovinen <bghovinen at math.uwaterloo.ca>
+ *
+ * Move from blackbox/sparse-base.inl to matrix/sparse.inl
+ * ------------------------------------
+ * 2002-11-28 Bradford Hovinen <bghovinen at math.uwaterloo.ca>
+ *
+ * - Renamed ColOfRowsIterator to RowIterator
+ * - Named template argument _Row rather than Row; add a typedef to Row
+ * ------------------------------------
+ *
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ * ========LICENCE========
+ *.
+ */
+
+#ifndef __LINBOX_matrix_sparse_parallel_INL
+#define __LINBOX_matrix_sparse_parallel_INL
+
+namespace LinBox {
+
+ template <class Field, class Row>
+ std::ostream &SparseMatrixWriteHelper<Protected::SparseMatrixGeneric<Field, Row,
+ VectorCategories::SparseParallelVectorTag > >::writeTriple (const Protected::SparseMatrixGeneric<Field, Row> &A
+ , std::ostream &os
+ , bool oneBased)
+ {
+ typename Matrix::Rep::const_iterator i;
+ typename Row::first_type::const_iterator j_idx;
+ typename Row::second_type::const_iterator j_elt;
+ const Field & F = A.field();
+
+ size_t i_idx;
+ for (i = A.getRep().begin (), i_idx = 0; i != A.getRep().end (); i++, i_idx++) {
+ for (j_idx = i->first.begin (), j_elt = i->second.begin ();
+ j_idx != i->first.end ();
+ ++j_idx, ++j_elt)
+ {
+ if (oneBased)
+ os << i_idx +1 << ' ' << *j_idx +1 << ' ';
+ else
+ os << i_idx << ' ' << *j_idx << ' ';
+ F.write (os, *j_elt);
+ os << std::endl;
+ }
+ }
+ return os ;
+
+
+ }
+
+ template <class Field, class Row>
+ std::ostream &SparseMatrixWriteHelper<Protected::SparseMatrixGeneric<Field, Row,
+ VectorCategories::SparseParallelVectorTag > >::writePretty (const Protected::SparseMatrixGeneric<Field, Row> &A
+ , std::ostream &os
+ , std::string begmat
+ , std::string endmat
+ , std::string begrow
+ , std::string endrow
+ , std::string sepelt
+ , std::string seprow
+ )
+ {
+ typename Matrix::Rep::const_iterator i;
+ typename Row::first_type::const_iterator j_idx;
+ typename Row::second_type::const_iterator j_elt;
+ const Field & F = A.field();
+
+ size_t i_idx, j_idx_1;
+ bool firstrow=true;
+
+ os << begmat;
+
+ for (i = A.getRep().begin (), i_idx = 0; i != A.getRep().end (); i++, i_idx++) {
+ if (firstrow) {
+ os << begrow;
+ firstrow =false;
+ }
+ else
+ os << seprow << begrow ;
+
+ j_idx = i->first.begin ();
+ j_elt = i->second.begin ();
+
+ for (j_idx_1 = 0; j_idx_1 < A.coldim(); j_idx_1++) {
+ if (j_idx == i->first.end () || j_idx_1 != *j_idx)
+ F.write (os, F.zero);
+ else {
+ F.write (os, *j_elt);
+ ++j_idx;
+ ++j_elt;
+ }
+
+ if (j_idx_1 < A.coldim() - 1)
+ os << sepelt << ' ';
+ }
+
+ os << endrow;
+ }
+
+ os << endmat;
+
+ return os ;
+ }
+
+
+ //! @bug this is reall the "generic" one
+ template <class Field, class Row>
+ std::ostream &SparseMatrixWriteHelper<Protected::SparseMatrixGeneric<Field, Row,
+ VectorCategories::SparseParallelVectorTag > >::write (const Protected::SparseMatrixGeneric<Field, Row> &A
+ , std::ostream &os
+ , LINBOX_enum(Tag::FileFormat) format)
+ {
+
+ // Avoid massive unneeded overhead in the case that this
+ // printing is disabled
+ if (not os)
+ return os;
+
+ switch (format) {
+ case Tag::FileFormat::Detect:
+ throw PreconditionFailed (__func__, __LINE__, "format != Tag::FileFormat::Detect");
+ //break//BB: unreachable;
+
+ case Tag::FileFormat::Turner:
+ return writeTriple(A,os,false);
+
+
+ case Tag::FileFormat::OneBased:
+ return writeTriple(A,os,true);
+
+ case Tag::FileFormat::Guillaume:
+ os << A.rowdim() << ' ' << A.coldim() << " M" << std::endl;
+
+ writeTriple(A,os,true);
+
+ os << "0 0 0" << std::endl;
+
+ return os;
+
+ case Tag::FileFormat::Matlab:
+ return writePretty(A,os,"[","]","","; ",",","");
+ // std::string begmat = "[";
+ // std::string endmat = "]";
+ // std::string begrow = "";
+ // std::string endrow = "; ";
+ // std::string sepelt = ",";
+ // std::string seprow = "";
+
+ case Tag::FileFormat::Maple:
+ return writePretty(A,os,"[","]","["," ]",",",", ");
+ // std::string begmat = "[";
+ // std::string endmat = "]";
+ // std::string begrow = "[";
+ // std::string endrow = " ]";
+ // std::string sepelt = ",";
+ // std::string seprow = ", "
+
+ case Tag::FileFormat::Pretty:
+ return writePretty(A,os,"",""," [ ","]\n"," ","");
+ // std::string begmat = "";
+ // std::string endmat = "";
+ // std::string begrow = " [ ";
+ // std::string endrow = "]\n";
+ // std::string sepelt = " ";
+ // std::string seprow = "";
+
+ case Tag::FileFormat::MatrixMarket:
+ writeMMCoordHeader(os, A, A.size(), "SparseMatrixGeneric");
+ return writeTriple(A,os,true);
+
+
+ case Tag::FileFormat::MagmaCpt:
+ os << "sparse matrix written in MagmaCpt form is not implemented" << std::endl;
+ break;
+ default:
+ os << "sparse matrix written in Tag::FileFormat::" << (int)format << " is not implemented" << std::endl;
+ }
+
+ return os;
+ }
+
+} // LinBox
+
+namespace LinBox { namespace Protected {
+
+ template <class Field, class Row>
+ SparseMatrixGeneric<Field,Row,VectorCategories::SparseParallelVectorTag> ::SparseMatrixGeneric( MatrixStream<Field>& ms ) :
+ _field(ms.field())
+ ,_MD(ms.field()),_AT(*this)
+ ,_matA(0), _m(0), _n(0)
+ {
+ Element val;
+ size_t i, j;
+ while( ms.nextTriple(i,j,val) ) {
+ if( i >= _m ) {
+ _m = i + 1;
+ _matA.resize( _m );
+ }
+ if( j >= _n ) _n = j + 1;
+ setEntry(i,j,val);
+ }
+ if( ms.getError() > END_OF_MATRIX )
+ throw ms.reportError(__func__,__LINE__);
+ if( !ms.getDimensions( i, _n ) )
+ throw ms.reportError(__func__,__LINE__);
+ if( i > _m ) {
+ _m = i;
+ _matA.resize(_m);
+ }
+ }
+
+
+ template <class Field, class Row>
+ void SparseMatrixGeneric<Field, Row, VectorCategories::SparseParallelVectorTag > ::setEntry (size_t i, size_t j, const typename Field::Element &value)
+ {
+ while (_matA.size() < i + 1) _matA.push_back(Row());
+ _m = _matA.size();
+
+ Row &v = _matA[i];
+ typename Row::first_type::iterator iter;
+
+ if (v.first.size () == 0) {
+ v.first.push_back (j);
+ v.second.push_back (value);
+ }
+ else {
+ iter = std::lower_bound (v.first.begin (), v.first.end (), j);
+
+ if (iter == v.first.end () || *iter != j) {
+ iter = v.first.insert (iter, j);
+ v.second.insert (v.second.begin () + (iter - v.first.begin ()), value);
+ }
+ else
+ *(v.second.begin () + (iter - v.first.begin ())) = value;
+ }
+ }
+
+ template <class Field, class Row>
+ typename Field::Element &SparseMatrixGeneric<Field, Row, VectorCategories::SparseParallelVectorTag > ::refEntry (size_t i, size_t j)
+ {
+
+ Row &v = _matA[i];
+ typename Row::first_type::iterator iter;
+ typename Row::second_type::iterator iter_elt;
+
+ if (v.first.size () == 0) {
+ v.first.push_back (j);
+ v.second.push_back (field().zero);
+ return v.second.front ();
+ }
+ else {
+ iter = std::lower_bound (v.first.begin (), v.first.end (), j);
+
+ if (iter == v.first.end () || *iter != j) {
+ iter = v.first.insert (iter, j);
+ iter_elt = v.second.insert (v.second.begin () + (iter - v.first.begin ()), field().zero);
+ }
+ else
+ iter_elt = v.second.begin () + (iter - v.first.begin ());
+
+ return *iter_elt;
+ }
+ }
+
+ template <class Field, class Row>
+ const typename Field::Element &SparseMatrixGeneric<Field, Row, VectorCategories::SparseParallelVectorTag > ::getEntry (size_t i, size_t j) const
+ {
+
+ const Row &v = _matA[i];
+ typename Row::first_type::const_iterator iter;
+
+ if (v.first.size () == 0)
+ return field().zero;
+ else {
+ iter = std::lower_bound (v.first.begin (), v.first.end (), j);
+
+ if (iter == v.first.end () || *iter != j)
+ return field().zero;
+ else
+ return *(v.second.begin () + (iter - v.first.begin ()));
+ }
+ }
+
+
+ template <class Field, class Row>
+ template <class Vector>
+ Vector &SparseMatrixGeneric<Field, Row, VectorCategories::SparseParallelVectorTag >::columnDensity (Vector &v) const
+ {
+ unsigned int row = 0;
+
+ for (ConstRowIterator i = rowBegin (); i != rowEnd (); ++i, ++row) {
+ typename Row::first_type::const_iterator j_idx = i->first.begin ();
+
+ for (; j_idx != i->first.end (); ++j_idx)
+ ++v[*j_idx];
+ }
+
+ return v;
+ }
+
+
+
+ template <class Field, class Row>
+ SparseMatrixGeneric<Field, Row, VectorCategories::SparseParallelVectorTag >
+ &SparseMatrixGeneric<Field, Row, VectorCategories::SparseParallelVectorTag >::transpose (SparseMatrixGeneric &AT) const
+ {
+ unsigned int row = 0;
+
+ for (ConstRowIterator i = rowBegin (); i != rowEnd (); ++i, ++row) {
+ typename Row::first_type::const_iterator j_idx = i->first.begin ();
+ typename Row::second_type::const_iterator j_elt = i->second.begin ();
+
+ for (; j_idx != i->first.end (); ++j_idx, ++j_elt) {
+ AT._matA[*j_idx].first.push_back (row);
+ AT._matA[*j_idx].second.push_back (*j_elt);
+ }
+ }
+
+ return AT;
+ }
+
+
+} // namespace LinBox
+} // namespace Protected
+
+#endif // __LINBOX_matrix_sparse_parallel_INL
+
+
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/matrix/sparsematrix/sparse-sequence-vector.h b/linbox/matrix/sparsematrix/sparse-sequence-vector.h
new file mode 100644
index 0000000..07b7a2a
--- /dev/null
+++ b/linbox/matrix/sparsematrix/sparse-sequence-vector.h
@@ -0,0 +1,713 @@
+/* linbox/matrix/sparse-matrix.h
+ * Copyright (C) 1998-2015 Jean-Guillaume Dumas,
+ *
+ * Written by Jean-Guillaume.Dumas at imag.fr
+ *
+ * --------------------------------------------------------
+ * 2003-01-11 Bradford Hovinen <bghovinen at math.uwaterloo.ca>
+ *
+ * Move from blackbox/sparse-base.h to matrix/sparse-matrix.h
+ * ------------------------------------
+ * 2002-11-28 Bradford Hovinen <bghovinen at math.uwaterloo.ca>
+ *
+ * - Renamed ColOfRowsIterator to RowIterator
+ * - Named template argument _Row rather than Row; add a typedef to Row
+ * - Named template argument _Element rather than Row; add a typedef to Element
+ * - Renamed IndexIterator as IndexedIterator, and adjusted to match
+ * interface in DenseMatrixBase
+ * ------------------------------------
+ * 2002-08-06 Bradford Hovinen <hovinen at cis.udel.edu>
+ *
+ * Renamed to sparse-base.h from sparse0-base.h
+ * ------------------------------------
+ * Modified by Bradford Hovinen <hovinen at cis.udel.edu>
+ *
+ * Refactoring:
+ * - Eliminated SparseMatrixAux and moved that functionality into Sparse0
+ * - Made SparseMatrixGeneric parameterized only on the element type
+ * - New read/write implementations for SparseMatrixGeneric, supporting multiple
+ * formats
+ * - Eliminated Gaussian elimination code
+ * - Added iterators, including ColOfRowsIterator, Iterator, and
+ * IndexIterator
+ * - Eliminated operator []; added getEntry; changed put_value to setEntry
+ * ------------------------------------
+ *
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ * ========LICENCE========
+ *.
+ */
+
+/** @file linbox/matrix/sparsematrix/sparse-sequence-vector.h
+ * @brief
+ */
+
+#ifndef __LINBOX_matrix_sparsematrix_sparse_sequence_vector_H
+#define __LINBOX_matrix_sparsematrix_sparse_sequence_vector_H
+
+
+namespace LinBox { namespace Protected {
+
+
+ /* Specialization for sparse sequence vectors */
+ template <class _Field, class _Row>
+ class SparseMatrixGeneric<_Field, _Row, VectorCategories::SparseSequenceVectorTag > {
+ public:
+
+ typedef _Field Field;
+ typedef typename Field::Element Element;
+
+ typedef _Row Row;
+ typedef const Row ConstRow;
+ typedef _SP_BB_VECTOR_<Row> Rep;
+ typedef VectorCategories::SparseSequenceVectorTag myTrait;
+ typedef SparseMatrixGeneric<_Field, _Row, myTrait> Self_t;
+
+#ifdef __LINBOX_PARALLEL
+ BB_list_list sub_list;
+#endif
+
+
+ template<typename _Tp1, typename _R1 = typename Rebind<_Row,_Tp1>::other >
+ struct rebind {
+ typedef SparseMatrixGeneric<_Tp1, _R1> other;
+
+ void operator() (other & Ap, const Self_t& A) {
+
+ typename _Tp1::Element e;
+
+ Hom<typename Self_t::Field, _Tp1> hom(A.field(), Ap.field());
+ for( typename Self_t::ConstIndexedIterator
+ indices = A.IndexedBegin();
+ (indices != A.IndexedEnd()) ;
+ ++indices ) {
+ // hom. image (e, A.getEntry(indices.rowIndex(),indices.colIndex()) );
+ hom. image (e, indices.value() );
+ if (!Ap.field().isZero(e))
+ Ap.setEntry (indices.rowIndex(),
+ indices.colIndex(), e);
+ }
+ }
+
+ };
+
+ template<typename _Tp1, typename _Rw1>
+ SparseMatrixGeneric (const SparseMatrixGeneric<_Tp1, _Rw1, myTrait> &Mat, const Field& F) :
+ _field (F),
+ _MD (F), _AT (*this)
+ , _matA (Mat.rowdim()), _m (Mat.rowdim()), _n (Mat.coldim())
+ {
+ typename SparseMatrixGeneric<_Tp1,_Rw1, myTrait>::template rebind<Field,_Row>()(*this, Mat);
+ }
+
+ SparseMatrixGeneric (const Field & F, size_t m, size_t n) :
+ _field(F),
+ _MD(F),_AT(*this),
+ _matA (m), _m (m), _n (n)
+ {}
+
+ SparseMatrixGeneric (const Field & F) :
+ _field (F),
+ _MD(F),_AT(*this),
+ _matA(0), _m(0), _n(0)
+ {};
+
+
+ SparseMatrixGeneric (const SparseMatrixGeneric<Field, Row> &A) :
+ _field(A.field()),
+ _MD(A.field()),_AT(*this),
+ _matA (A._matA), _m (A._m), _n (A._n)
+ {}
+
+ template<class VectorType>
+ SparseMatrixGeneric (const SparseMatrixGeneric<Field, VectorType> &A) :
+ _field(A.field()),
+ _MD(A.field()),_AT(*this),
+ _matA(A.rowdim()), _m (A.rowdim()), _n (A.coldim())
+ {
+ typename Rep::iterator meit = this->_matA.begin();
+ typename SparseMatrixGeneric<Field, VectorType>::Rep::const_iterator copit = A.getRep().begin();
+ for( ; meit != this->_matA.end(); ++meit, ++copit)
+ LinBox::RawVector<Element>::convert(*meit, *copit);
+ }
+
+ /** Constructor from a MatrixStream
+ */
+ SparseMatrixGeneric ( MatrixStream<Field>& ms );
+
+ template<class VectStream>
+ SparseMatrixGeneric (const Field &F, VectStream &stream) :
+ _field (F), _MD (F), _AT (*this)
+ , _matA (stream.size()), _m (stream.size()), _n (stream.dim())
+ {
+ typename Self_t::RowIterator i;
+
+ for (i = Self_t::rowBegin (); i != Self_t::rowEnd (); ++i)
+ stream >> *i;
+ }
+
+ ~SparseMatrixGeneric () {}
+
+ size_t rowdim () const
+ {
+ return _m;
+ }
+
+ size_t coldim () const
+ {
+ return _n;
+ }
+
+ size_t size () const
+ {
+ size_t s(0);
+ for(typename Rep::const_iterator it = _matA.begin(); it != _matA.end(); ++it)
+ s+= LinBox::RawVector<Element>::size(*it);
+ return s;
+ }
+
+ std::istream &read (std::istream &is
+ , LINBOX_enum(Tag::FileFormat) format = Tag::FileFormat::Detect )
+ {
+ return SparseMatrixReadHelper<Self_t>::read (*this, is
+ , format);
+ }
+
+ std::ostream &write (std::ostream &os
+ , LINBOX_enum(Tag::FileFormat) format = Tag::FileFormat::MatrixMarket ) const
+ {
+ return SparseMatrixWriteHelper<Self_t>::write (*this, os, format);
+ }
+
+
+ void appendEntry(size_t i, size_t j, const Element & value) { setEntry(i,j,value) ;}
+ void finalize(){}
+
+ void setEntry (size_t i, size_t j, const Element &value);
+
+
+ Element &refEntry (size_t i, size_t j);
+
+ const Element &getEntry (size_t i, size_t j) const;
+
+ Element &getEntry (Element &x, size_t i, size_t j) const
+ {
+ return x = getEntry (i, j);
+ }
+
+ typedef typename Rep::iterator RowIterator;
+ typedef typename Rep::const_iterator ConstRowIterator;
+
+ ConstRowIterator rowBegin () const
+ {
+ return _matA.begin ();
+ }
+
+ ConstRowIterator rowEnd () const
+ {
+ return _matA.end ();
+ }
+
+ RowIterator rowBegin ()
+ {
+ return _matA.begin ();
+ }
+
+ RowIterator rowEnd ()
+ {
+ return _matA.end ();
+ }
+
+ template <class RepIterator, class RowIterator, class _I_Element>
+ class _Iterator {
+ public:
+ typedef _I_Element value_type;
+
+ _Iterator (const RepIterator &i, const RowIterator &j, const RepIterator &A_end) :
+ _i (i), _j (j), _A_end (A_end)
+ {
+ if( _i == _A_end ) return;
+ while ( _j == _i->end () ) {
+ if (++_i == _A_end) return;
+ _j = _i->begin ();
+ }
+ }
+
+ _Iterator (const _Iterator &iter) :
+ _i (iter._i), _j (iter._j), _A_end (iter._A_end)
+ {}
+
+ _Iterator () {}
+
+ _Iterator &operator = (const _Iterator &iter)
+ {
+ _i = iter._i;
+ _j = iter._j;
+ _A_end = iter._A_end;
+
+ return *this;
+ }
+
+ bool operator == (const _Iterator &i) const
+ {
+ return (_i == i._i) && (_j == i._j);
+ }
+
+ bool operator != (const _Iterator &i) const
+ {
+ return (_i != i._i) || (_j != i._j);
+ }
+
+ _Iterator &operator ++ ()
+ {
+ ++_j;
+ while( _j == _i->end ()) {
+ if (++_i == _A_end) return *this;
+ _j = _i->begin ();
+ }
+ return *this;
+ }
+
+ _Iterator operator ++ (int)
+ {
+ _Iterator tmp = *this;
+ ++(*this);
+ return tmp;
+ }
+
+ _Iterator &operator -- ()
+ {
+ while (_j == _i->begin ())
+ _j = (--_i)->end ();
+ --_j;
+ return *this;
+ }
+
+ _Iterator operator -- (int)
+ {
+ _Iterator tmp = *this;
+ --(*this);
+ return tmp;
+ }
+
+ value_type &operator * ()
+ {
+ return _j->second;
+ }
+
+ // Dan Roche 2005-7-7 I believe this was a memory leak.
+ value_type *operator -> ()
+ {
+ return &(_j->second);
+ }
+
+ const value_type &operator*() const
+ {
+ return _j->second;
+ }
+
+ const value_type *operator-> () const
+ {
+ return &(_j->second);
+ }
+
+ private:
+ RepIterator _i;
+ RowIterator _j;
+ RepIterator _A_end;
+ };
+
+ typedef _Iterator<typename Rep::iterator, typename Row::iterator, Element> Iterator;
+ typedef _Iterator<typename Rep::const_iterator, typename Row::const_iterator, const Element> ConstIterator;
+
+ Iterator Begin ()
+ {
+ return Iterator (_matA.begin (), _matA.front ().begin (), _matA.end ());
+ }
+
+ Iterator End ()
+ {
+ return Iterator (_matA.end (), _matA.back ().end (), _matA.end ());
+ }
+ ConstIterator Begin () const
+ {
+ return ConstIterator (_matA.begin (), _matA.front ().begin (), _matA.end ());
+ }
+ ConstIterator End () const
+ {
+ return ConstIterator (_matA.end (), _matA.back ().end (), _matA.end ());
+ }
+
+
+
+ /* Generic trait for iterators without type */
+ template<typename U>
+ struct IteratorValueType {
+ typedef typename U::value_type value_type;
+ };
+
+ template<typename X>
+ struct IteratorValueType<const X*> {
+ typedef X value_type;
+ };
+
+ /* Generic trait for iterators without type */
+
+
+
+ template <class RepIterator, class RowIdxIterator>
+ class _IndexedIterator {
+ public:
+#if 0
+ typedef std::pair<size_t, size_t> value_type;
+ typedef typename RowIdxIterator/*::value_type*/::second_type value_type;
+ typedef typename RowIdxIterator::value_type::second_type value_type;
+#endif
+ typedef typename IteratorValueType< RowIdxIterator >::value_type::second_type value_type;
+
+ _IndexedIterator (size_t idx, const RepIterator &i, const RowIdxIterator &j, const RepIterator &A_end) :
+ _i (i), _j (j), _A_end (A_end), _r_index (idx)
+ {
+ if( _i == _A_end ) return;
+ while(_j == _i->end ()) {
+ ++_r_index;
+ if (++_i == _A_end) return;
+ _j = _i->begin ();
+ }
+ _c_index =_j->first;
+ }
+
+ _IndexedIterator (const _IndexedIterator &iter) :
+ _i (iter._i), _j (iter._j), _A_end (iter._A_end), _r_index (iter._r_index), _c_index (iter._c_index)
+ {}
+
+ _IndexedIterator ()
+ {}
+
+ _IndexedIterator &operator = (const _IndexedIterator &iter)
+ {
+ _A_end = iter._A_end;
+ _i = iter._i;
+ _j = iter._j;
+ _r_index = iter._r_index;
+ _c_index = iter._c_index;
+
+ return *this;
+ }
+
+ bool operator == (const _IndexedIterator &i) const
+ {
+ return (_i == i._i) && (_j == i._j);
+ }
+
+ bool operator != (const _IndexedIterator &i) const
+ {
+ return (_i != i._i) || (_j != i._j);
+ }
+
+ _IndexedIterator &operator ++ ()
+ {
+ ++_j;
+ while(_j == _i->end ()){
+ ++_r_index;
+ if (++_i == _A_end) return *this;
+ _j = _i->begin ();
+ }
+ _c_index = _j->first;
+#if 0
+ if (++_j == _i->end ()) {
+ if (++_i != _A_end) {
+ _j = _i->begin ();
+ ++_r_index;
+ }
+ }
+
+ _c_index = _j->first;
+#endif
+
+ return *this;
+ }
+
+ _IndexedIterator operator ++ (int)
+ {
+ _IndexedIterator tmp = *this;
+ ++(*this);
+ return tmp;
+ }
+
+ _IndexedIterator &operator -- ()
+ {
+ while (_j == _i->begin ()) {
+ _j = (--_i)->end ();
+ --_r_index;
+ }
+
+ --_j;
+ _c_index = _j->first;
+ return *this;
+ }
+
+ _IndexedIterator operator -- (int)
+ {
+ _IndexedIterator tmp = *this;
+ --(*this);
+ return tmp;
+ }
+
+ value_type &operator * ()
+ {
+ return *const_cast<value_type*> (&(_j->second));
+ // Ugh. This hack is because ConstIndexedIterator is not right. -bds
+
+ }
+ const value_type &operator * () const
+ {
+ return _j->second;
+ }
+ value_type *operator -> ()
+ {
+ return &(_j->second);
+ }
+ const value_type *operator -> () const
+ {
+ return &(_j->second);
+ }
+
+ size_t rowIndex () const
+ {
+ return _r_index;
+ }
+ size_t colIndex () const
+ {
+ return _c_index;
+ }
+ const value_type &value() const
+ {
+ return _j->second;
+ }
+
+ private:
+ RepIterator _i;
+ RowIdxIterator _j;
+ RepIterator _A_end;
+
+ mutable size_t _r_index;
+ mutable size_t _c_index;
+ };
+
+ typedef _IndexedIterator<typename Rep::iterator, typename Row::iterator> IndexedIterator;
+ typedef _IndexedIterator<typename Rep::const_iterator, typename Row::const_iterator> ConstIndexedIterator;
+
+ IndexedIterator IndexedBegin ()
+ {
+ return IndexedIterator (0, _matA.begin (), _matA.front ().begin (), _matA.end ());
+ }
+ IndexedIterator IndexedEnd ()
+ {
+ return IndexedIterator (_m, _matA.end (), _matA.back ().end (), _matA.end ());
+ }
+ ConstIndexedIterator IndexedBegin () const
+ {
+ return ConstIndexedIterator (0, _matA.begin (), _matA.front ().begin (), _matA.end ());
+ }
+ ConstIndexedIterator IndexedEnd () const
+ {
+ return ConstIndexedIterator (_m, _matA.end (), _matA.back ().end (), _matA.end ());
+ }
+
+ Row &getRow (size_t i) {
+ return _matA[i];
+ }
+ Row &operator [] (size_t i) {
+ return _matA[i];
+ }
+ ConstRow &operator [] (size_t i) const
+ {
+ return _matA[i];
+ }
+
+ template <class Vector> Vector &columnDensity (Vector &v) const;
+ SparseMatrixGeneric &transpose (SparseMatrixGeneric &AT) const;
+
+ const Field & field() const
+ {
+ return _field ;
+ }
+ /** Matrix-vector product
+ * \f$y = A x\f$.
+ * @return reference to output vector y
+ * @param x input vector
+ * @param y
+ */
+ template <class OutVector, class InVector>
+ OutVector &apply (OutVector &y, const InVector &x) const
+ {
+#ifdef __LINBOX_PARALLEL
+ return BlackboxParallel (y, *this, x, BBBase::Apply);
+#else
+ return _MD.vectorMul (y, *this, x);
+#endif
+ }
+
+ /** Transpose matrix-vector product
+ * \f$ y = A^T x\f$.
+ * @return reference to output vector y
+ * @param x input vector
+ * @param y
+ */
+ template <class OutVector, class InVector>
+ OutVector &applyTranspose (OutVector& y, const InVector &x) const
+ {
+#ifdef __LINBOX_PARALLEL
+ return BlackboxParallel (y, *this, x, BBBase::ApplyTranspose);
+#else
+ return _MD.vectorMul (y, _AT, x);
+#endif
+ }
+
+ const Rep & getRep() const
+ {
+ return _matA;
+ }
+
+ Rep & refRep()
+ {
+ return _matA;
+ }
+
+ void resize( const size_t & m, const size_t & n, const size_t & z = 0)
+ {
+ _m = m ;
+ _n = n ;
+ _matA.clear();
+ _matA.resize(m);
+
+ }
+
+ protected:
+
+ friend class SparseMatrixWriteHelper<Self_t>;
+ friend class SparseMatrixReadHelper<Self_t>;
+
+ const Field & _field;
+
+ MatrixDomain<Field> _MD; // Matrix domain for matrix operations
+ TransposeMatrix<SparseMatrixGeneric<_Field, _Row> > _AT;
+ Rep _matA;
+ size_t _m;
+ size_t _n;
+
+ // template<class F, class R, class T> friend class SparseMatrixGeneric;
+ };
+
+} // namespace LinBox
+} // namespace Protected
+
+
+
+#include "linbox/matrix/sparsematrix/sparse-sequence-vector.inl"
+
+namespace LinBox
+{
+
+ template <class _Field /*, class _Row */ >
+ class SparseMatrix<_Field, SparseMatrixFormat::SparseSeq/* <_Row> */ > : public Protected::SparseMatrixGeneric<_Field,/* _Row */ typename Vector<_Field>::SparseSeq ,VectorCategories::SparseSequenceVectorTag>
+ {
+ public:
+ typedef VectorCategories::SparseSequenceVectorTag myTrait ;
+ typedef _Field Field ; //!< Field
+ typedef typename _Field::Element Element ; //!< Element
+ typedef const Element constElement ; //!< const Element
+ typedef typename Vector<_Field>::SparseSeq Row ;
+ typedef SparseMatrixFormat::SparseSeq Storage ; //!< Matrix Storage Format
+ typedef SparseMatrix<_Field,Storage> Self_t ; //!< Self type
+ typedef Protected::SparseMatrixGeneric<_Field,Row,myTrait > Father_t ;
+
+ public:
+ template<class VectStream>
+ SparseMatrix (const Field &F, VectStream &stream) :
+ Father_t(F,stream)
+ {}
+
+ SparseMatrix(const Field & F, size_t m, size_t n) :
+ Father_t(F, m, n)
+ {}
+
+ SparseMatrix(const Field & F) :
+ Father_t(F)
+ {}
+
+ SparseMatrix ( MatrixStream<Field>& ms ) :
+ Father_t(ms)
+ {}
+
+ template<typename _Tp1, typename _Rw1>
+ SparseMatrix (const SparseMatrix<_Tp1, _Rw1> &Mat, const Field& F) :
+ Father_t(F,Mat.rowdim(),Mat.coldim())
+ {
+ typename SparseMatrix<_Tp1,_Rw1>::template rebind<Field,Storage>()(*this, Mat);
+ }
+
+ template<typename _Tp1, typename _Rw1>
+ SparseMatrix (const SparseMatrix<_Tp1, _Rw1> &Mat) :
+ Father_t(Mat.field(),Mat.rowdim(),Mat.coldim())
+ {
+ typename SparseMatrix<_Tp1,_Rw1>::template rebind<Field,Storage>()(*this, Mat);
+ }
+
+
+ template<typename _Tp1, typename _R1 = SparseMatrixFormat::SparseSeq >
+ struct rebind {
+ typedef SparseMatrix<_Tp1, _R1> other;
+
+ void operator() (other & Ap, const Self_t& A) {
+
+ typename _Tp1::Element e;
+
+ Hom<typename Self_t::Field, _Tp1> hom(A.field(), Ap.field());
+ for( typename Self_t::ConstIndexedIterator
+ indices = A.IndexedBegin();
+ (indices != A.IndexedEnd()) ;
+ ++indices ) {
+ // hom. image (e, A.getEntry(indices.rowIndex(),indices.colIndex()) );
+ hom. image (e, indices.value() );
+ if (!Ap.field().isZero(e))
+ Ap.setEntry (indices.rowIndex(),
+ indices.colIndex(), e);
+ }
+ }
+
+ };
+
+ // using Father_t::rebind;
+ } ; // SparseMatrix
+
+
+} // namespace LinBox
+
+#endif // __LINBOX_matrix_sparsematrix_sparse_sequence_vector_H
+
+
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/matrix/sparsematrix/sparse-sequence-vector.inl b/linbox/matrix/sparsematrix/sparse-sequence-vector.inl
new file mode 100644
index 0000000..5fc69fa
--- /dev/null
+++ b/linbox/matrix/sparsematrix/sparse-sequence-vector.inl
@@ -0,0 +1,179 @@
+/* linbox/matrix/sparse.inl
+ * Copyright (C) 2001-2002 Bradford Hovinen
+ * 1999-2001 William J Turner,
+ *
+ * Written by Bradford Hovinen <hovinen at cis.udel.edu>
+ * Based on sparse-base.h by William J Turner <wjturner at math.ncsu.edu>
+ *
+ * --------------------------------------------------------
+ * 2003-01-11 Bradford Hovinen <bghovinen at math.uwaterloo.ca>
+ *
+ * Move from blackbox/sparse-base.inl to matrix/sparse.inl
+ * ------------------------------------
+ * 2002-11-28 Bradford Hovinen <bghovinen at math.uwaterloo.ca>
+ *
+ * - Renamed ColOfRowsIterator to RowIterator
+ * - Named template argument _Row rather than Row; add a typedef to Row
+ * ------------------------------------
+ *
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ * ========LICENCE========
+ *.
+ */
+
+#ifndef __LINBOX_matrix_sparse_sequence_INL
+#define __LINBOX_matrix_sparse_sequence_INL
+
+namespace LinBox { namespace Protected {
+
+ template <class Field, class Row>
+ SparseMatrixGeneric<Field,Row,VectorCategories::SparseSequenceVectorTag> ::SparseMatrixGeneric( MatrixStream<Field>& ms ) :
+ _field(ms.field())
+ ,_MD(ms.field()),_AT(*this)
+ ,_matA(0), _m(0), _n(0)
+
+ {
+ Element val;
+ size_t i, j;
+ while( ms.nextTriple(i,j,val) ) {
+ if( i >= _m ) {
+ _m = i + 1;
+ _matA.resize( _m );
+ }
+ if( j >= _n ) _n = j + 1;
+ setEntry(i,j,val);
+ }
+ if( ms.getError() > END_OF_MATRIX )
+ throw ms.reportError(__func__,__LINE__);
+ if( !ms.getDimensions( i, _n ) )
+ throw ms.reportError(__func__,__LINE__);
+ if( i > _m ) {
+ _m = i;
+ _matA.resize(_m);
+ }
+ }
+
+ template <class Field, class Row>
+ void SparseMatrixGeneric<Field, Row, VectorCategories::SparseSequenceVectorTag > ::setEntry (size_t i, size_t j, const typename Field::Element &value)
+ {
+ typedef typename Row::value_type value_type;
+ Row &v = _matA[i];
+ typename Row::iterator iter;
+
+ if (v.size () == 0) {
+ v.push_back ( value_type((unsigned)j, value));
+ }
+ else {
+ iter = std::lower_bound (v.begin (), v.end (), j, VectorWrapper::CompareSparseEntries<Element> ());
+
+ if (iter == v.end () || iter->first != j)
+ iter = v.insert (iter, value_type((unsigned)j, value));
+ else
+ iter->second = value;
+ }
+ }
+
+ template <class Field, class Row>
+ typename Field::Element &SparseMatrixGeneric<Field, Row, VectorCategories::SparseSequenceVectorTag > ::refEntry (size_t i, size_t j)
+ {
+
+ Row &v = _matA[i];
+ typename Row::iterator iter;
+
+ if (v.size () == 0) {
+ v.push_back (std::pair <size_t, Element> (j, field().zero));
+ return v.front ().second;
+ }
+ else {
+ iter = std::lower_bound (v.begin (), v.end (), j, VectorWrapper::CompareSparseEntries<Element> ());
+
+ if (iter == v.end () || iter->first != j)
+ iter = v.insert (iter, std::pair <size_t, Element> (j, field().zero));
+
+ return iter->second;
+ }
+ }
+
+ template <class Field, class Row>
+ const typename Field::Element &SparseMatrixGeneric<Field, Row, VectorCategories::SparseSequenceVectorTag > ::getEntry (size_t i, size_t j) const
+ {
+
+ const Row &v = _matA[i];
+ typename Row::const_iterator iter;
+
+ if (v.size () == 0)
+ return field().zero;
+ else {
+ iter = std::lower_bound (v.begin (), v.end (), j, VectorWrapper::CompareSparseEntries<Element> ());
+
+ if (iter == v.end () || iter->first != j)
+ return field().zero;
+ else
+ return iter->second;
+ }
+ }
+
+
+ template <class Field, class Row>
+ template <class Vector>
+ Vector &SparseMatrixGeneric<Field, Row, VectorCategories::SparseSequenceVectorTag >::columnDensity (Vector &v) const
+ {
+ unsigned int row = 0;
+
+ for (ConstRowIterator i = rowBegin (); i != rowEnd (); ++i, ++row) {
+ typename Row::const_iterator j = i.begin ();
+
+ for (; j != i->begin (); ++j)
+ ++v[j->first];
+ }
+
+ return v;
+ }
+
+
+ template <class Field, class Row>
+ SparseMatrixGeneric<Field, Row, VectorCategories::SparseSequenceVectorTag >
+ &SparseMatrixGeneric<Field, Row, VectorCategories::SparseSequenceVectorTag >::transpose (SparseMatrixGeneric &AT) const
+ {
+ unsigned int row = 0;
+
+ for (ConstRowIterator i = rowBegin (); i != rowEnd (); ++i, ++row) {
+ typename Row::const_iterator j = i.begin ();
+
+ for (; j != i->begin (); ++j)
+ AT._matA[j->first].push_back (std::pair<size_t, Element> (row, j->second));
+ }
+
+ return AT;
+ }
+
+
+} // namespace LinBox
+} // namespace Protected
+
+#endif // __LINBOX_matrix_sparse_sequence_INL
+
+
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/matrix/sparsematrix/sparse-tpl-matrix-omp.h b/linbox/matrix/sparsematrix/sparse-tpl-matrix-omp.h
new file mode 100644
index 0000000..346aaac
--- /dev/null
+++ b/linbox/matrix/sparsematrix/sparse-tpl-matrix-omp.h
@@ -0,0 +1,415 @@
+/* linbox/matrix/sparsematrix/sparse-tpl-matrix-omp.h
+ * Copyright (c) Linbox
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ * ========LICENCE========
+
+ * Written by Alex Stachnik <stachnik at udel.edu>
+ */
+
+/*! @file matrix/sparsematrix/sparse-tpl-matrix-omp.h
+ * @ingroup sparsematrix
+ * @ingroup omp
+ * @brief NO DOC
+ */
+
+#ifndef __LINBOX_matrix_sparsematrix_sparse_tpl_matrix_omp_H
+#define __LINBOX_matrix_sparsematrix_sparse_tpl_matrix_omp_H
+
+
+#include <algorithm>
+#include <iostream>
+#include <map>
+#include "linbox/linbox-config.h"
+#include "linbox/util/debug.h"
+#include "linbox/util/field-axpy.h"
+#include "linbox/blackbox/blackbox-interface.h"
+#include "linbox/field/hom.h"
+#include "linbox/matrix/sparsematrix/triples-coord.h"
+
+#include <vector>
+
+
+namespace LinBox
+{
+
+union TriplesSmallCoord {
+ uint8_t c[8];
+ uint16_t s[4];
+ uint32_t i[2];
+ uint64_t l;
+};
+
+template <class Element>
+struct TriplesBBTriple {
+ TriplesBBTriple(TriplesCoord c):coord_(c) {}
+ TriplesBBTriple(Index r, Index c, const Element& e){init(r, c, e);}
+ void init(Index r, Index c, const Element& e)
+ {
+ row()=r;
+ col()=c;
+ elt_ = e;
+ }
+ inline Index& row() {return coord_.rowCol[0];}
+ inline Index& col() {return coord_.rowCol[1];}
+ inline Element& elt() {return elt_;}
+ inline const Index& getRow() const {return coord_.rowCol[0];}
+ inline const Index& getCol() const {return coord_.rowCol[1];}
+ inline const Element& getElt() const {return elt_;}
+ void toBlock() {coordToBlock(coord_);}
+ void fromBlock() {coordFromBlock(coord_);}
+ static bool compareBlockTriples(const TriplesBBTriple<Element>& lhs,
+ const TriplesBBTriple<Element>& rhs) {
+ return lhs.coord_<rhs.coord_;
+ }
+ TriplesCoord coord_;
+ Element elt_;
+};
+
+struct TriplesBlock {
+ Index start_,end_;
+ TriplesCoord blockStart_, blockEnd_;
+
+ TriplesBlock(Index start,Index end,TriplesCoord blockStart,TriplesCoord blockEnd) :
+ start_(start),end_(end),
+ blockStart_(blockStart),blockEnd_(blockEnd) {
+ }
+ Index nnz() const {return end_-start_;}
+ TriplesCoord blockSize() const {return blockEnd_-blockStart_;}
+ void toBlock() {
+ coordToBlock(blockStart_);
+ coordToBlock(blockEnd_);
+ }
+ void fromBlock() {
+ coordFromBlock(blockStart_);
+ coordFromBlock(blockEnd_);
+
+ }
+ inline const Index& getStartRow() const {
+ return blockStart_.rowCol[0];
+ }
+ inline const Index& getStartCol() const {
+ return blockStart_.rowCol[1];
+ }
+ inline const Index& getEndRow() const {
+ return blockEnd_.rowCol[0];
+ }
+ inline const Index& getEndCol() const {
+ return blockEnd_.rowCol[1];
+ }
+ static bool compareBlockSizes(const TriplesBlock& lhs,
+ const TriplesBlock& rhs) {
+ return lhs.blockSize()<rhs.blockSize();
+ }
+};
+
+
+template <class Element>
+struct TriplesDataBlock {
+ TriplesCoord blockStart_, blockEnd_, blockSize_;
+ std::vector<TriplesSmallCoord> rowIxs_,colIxs_;
+ std::vector<Element> elts_;
+ int ccf_;
+
+ typedef TriplesBBTriple<Element> Triple;
+ typedef typename std::vector<Triple> TripleList;
+ typedef typename TripleList::const_iterator TripleListIt;
+
+ inline Index getRow(int ix) const {
+ Index retVal=getStartRow();
+ const TriplesSmallCoord *rowIxPtr=&(rowIxs_[ix>>ccf_]);
+ switch (ccf_) {
+ case 0:
+ return rowIxPtr->l;
+ case 1:
+ return (retVal|(rowIxPtr->i[ix&1]));
+ case 2:
+ return (retVal|(rowIxPtr->s[ix&3]));
+ case 3:
+ default:
+ return (retVal|(rowIxPtr->c[ix&7]));
+ }
+ }
+ inline Index getCol(int ix) const {
+ Index retVal=getStartCol();
+ const TriplesSmallCoord *colIxPtr=&(colIxs_[ix>>ccf_]);
+ switch (ccf_) {
+ case 0:
+ return colIxPtr->l;
+ case 1:
+ return (retVal|(colIxPtr->i[ix&1]));
+ case 2:
+ return (retVal|(colIxPtr->s[ix&3]));
+ case 3:
+ default:
+ return (retVal|(colIxPtr->c[ix&7]));
+ }
+ }
+
+ void init(TriplesCoord blockStart,
+ TriplesCoord blockEnd,
+ TriplesCoord myBlockSize, // blockSize shadows blockSize()
+ TripleListIt triplesStart,
+ TripleListIt triplesEnd,
+ int ccf) {
+ blockStart_=blockStart;
+ blockEnd_=blockEnd;
+ blockSize_=myBlockSize;
+ ccf_=ccf;
+ int numElts=(int)(triplesEnd-triplesStart);
+ rowIxs_.resize(1+(numElts>>ccf));
+ colIxs_.resize(1+(numElts>>ccf));
+ elts_.reserve(numElts);
+
+ int coordOffset=0, coordIx=0;
+ while (triplesStart != triplesEnd) {
+ elts_.push_back(triplesStart->getElt());
+
+ switch (ccf) {
+ case 0:
+ rowIxs_[coordIx].l=(uint64_t)(triplesStart->getRow());
+ colIxs_[coordIx].l=(uint64_t)(triplesStart->getCol());
+ break;
+ case 1:
+ rowIxs_[coordIx].i[coordOffset]=
+ (uint32_t)(triplesStart->getRow());
+ colIxs_[coordIx].i[coordOffset]=
+ (uint32_t)(triplesStart->getCol());
+ break;
+ case 2:
+ rowIxs_[coordIx].s[coordOffset]=
+ (uint16_t)(triplesStart->getRow());
+ colIxs_[coordIx].s[coordOffset]=
+ (uint16_t)(triplesStart->getCol());
+ break;
+ case 3:
+ rowIxs_[coordIx].c[coordOffset]=
+ (uint8_t)(triplesStart->getRow());
+ colIxs_[coordIx].c[coordOffset]=
+ (uint8_t)(triplesStart->getCol());
+ break;
+ }
+
+ ++coordOffset;
+ if (coordOffset==(1<<ccf)) {
+ coordOffset=0;
+ ++coordIx;
+ }
+ ++triplesStart;
+ }
+ }
+
+ inline TriplesCoord blockSize() const {
+ return blockSize_;
+ }
+ inline Index getStartRow() const {
+ return blockStart_.rowCol[0];
+ }
+ inline Index getStartCol() const {
+ return blockStart_.rowCol[1];
+ }
+ inline Index getEndRow() const {
+ return blockEnd_.rowCol[0];
+ }
+ inline Index getEndCol() const {
+ return blockEnd_.rowCol[1];
+ }
+};
+
+
+/**
+ *
+ \ingroup blackbox
+ * Sparse matrix representation which stores nonzero entries by i,j,value triples.
+ */
+template<class Field_>
+class SparseMatrix<Field_, SparseMatrixFormat::TPL_omp> : public BlackboxInterface {
+
+ public:
+ typedef Field_ Field;
+ typedef typename MatrixDomain<Field>::Matrix Matrix;
+ typedef typename Field::Element Element;
+ typedef SparseMatrix<Field, SparseMatrixFormat::TPL_omp> Self_t;
+
+ // Default constructor.
+ SparseMatrix();
+
+ SparseMatrix(const SparseMatrix & B);
+
+ SparseMatrix(const Field& F, std::istream& in);
+
+ std::istream& read(std::istream& in);
+
+ std::ostream& write(std::ostream& out);
+
+ ~SparseMatrix();
+
+ SparseMatrix(const Field& F, Index r = 0, Index c = 0);
+
+ void finalize();
+
+ // (re)shape the matrix. Any prior entries are abandoned.
+ SparseMatrix& shape(const Field& F, Index r = 0, Index c = 0);
+
+ // need cstor from matrix stream, read, write
+
+ // Element e is added in the i,j position.
+ void setEntry(Index i, Index j, const Element & e);
+
+ // Element e is set to the i,j entry.
+ Element& getEntry(Element& e, Index i, Index j) const;
+
+ /** y <- A x.
+ */
+ template<class OutVector, class InVector>
+ OutVector & apply(OutVector &, const InVector &) const;
+
+ // Mul with this on left: Y <- AX. Requires conformal shapes.
+ // Requires Y != X
+ template<class Mat1, class Mat2>
+ Mat1 & applyLeft(Mat1 &Y, const Mat2 &X) const;
+
+ // Mul with this on right: Y <- XA. Requires conformal shapes.
+ // Requires Y != X
+ template<class Mat1, class Mat2>
+ Mat1 & applyRight(Mat1 &Y, const Mat2 &X) const;
+
+ /** y <- A^T x.
+ */
+ template<class OutVector, class InVector>
+ OutVector & applyTranspose(OutVector &, const InVector &) const;
+
+ Index rowdim() const;
+
+ Index coldim() const;
+
+ const Field & field() const;
+
+ /* Returns number of non-zero entries */
+ size_t size() const;
+
+ template<typename Tp1_>
+ struct rebind {
+ typedef SparseMatrix<Tp1_> other;
+ // BB : is this working at all ?
+ void operator() (other & Ap, const Self_t& A)
+ {
+ Hom <typename Self_t::Field, Tp1_> hom( A.field(), Ap.field());
+
+ typedef typename Tp1_::Element otherElt;
+ typedef typename std::vector<otherElt> othervec;
+ typedef typename std::vector<Element> selfvec;
+ typedef typename othervec::iterator otheriter;
+ typedef typename selfvec::const_iterator selfiter;
+ otheriter vp_p; selfiter v_p;
+
+ Ap.data_.resize(A.data.size());
+ for (v_p = A.data_.begin(), vp_p = Ap.data_.begin();
+ v_p != A.data.end(); ++ v_p, ++ vp_p)
+ hom.image (vp_p->elt, v_p->elt);
+ }
+ };
+
+ //For debugging:
+ typename std::vector<std::vector<std::vector<TriplesDataBlock<Element> > > >& getRowBlocks() {
+ return rowBlocks_;
+ }
+
+protected:
+
+ const static Index MAX_BLOCK_NNZ=1024;
+ const static size_t CACHE_ALIGNMENT=64;
+
+ inline static int roundUpIndex(Index val) {
+ int exponent=0;
+ --val;
+ while (val > 0) {
+ ++exponent;
+ val=val>>1;
+ }
+ return 1<<exponent;
+ }
+
+ typedef TriplesBBTriple<Element> Triple;
+ typedef TriplesDataBlock<Element> DataBlock;
+
+ typedef std::vector<TriplesBlock> RefBlockList;
+
+ typedef std::vector<DataBlock> BlockList;
+ typedef typename BlockList::iterator BlockListIt;
+ typedef std::vector<BlockList> VectorChunks;
+ typedef typename VectorChunks::iterator VectorChunkIt;
+ typedef std::vector<VectorChunks> SizedChunks;
+
+ typedef std::map<Index,Index> IntervalSet;
+ typedef typename IntervalSet::iterator IntervalIterator;
+ typedef std::pair<Index,Index> Interval;
+
+ void splitBlock(RefBlockList &superBlocks, TriplesBlock block);
+
+ void toDataBlock(const RefBlockList& superBlocks,
+ BlockList& dataBlocks);
+
+ void computeVectors(SizedChunks &sizedChunks,
+ BlockList &superBlocks,
+ const int rowOrCol);
+
+ void combineIntervals(BlockListIt startIt,
+ BlockListIt endIt,
+ IntervalSet& intervals,
+ VectorChunks& chunksOut,
+ const int rowOrCol);
+
+ void nonOverlappingIntervals(BlockListIt startIt,
+ BlockListIt endIt,
+ IntervalSet& intervals,
+ const int rowOrCol);
+
+ MatrixDomain<Field> MD_;
+
+ std::vector<Triple> data_;
+
+ Index rows_, cols_;
+
+#define TRIPLES_UNSORTED 1
+#define TRIPLES_SORTED 2
+
+ //Either TRIPLES_SORTED or TRIPLES_UNSORTED
+ int sortType_;
+
+#define CHUNK_BY_ROW 1
+#define CHUNK_BY_COL 2
+
+ SizedChunks rowBlocks_;
+
+ SizedChunks colBlocks_;
+ }; // SparseMatrix
+
+} // namespace LinBox
+
+#include "sparse-tpl-matrix-omp.inl"
+
+#endif // __LINBOX_matrix_sparsematrix_sparse_tpl_matrix_omp_H
+
+
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/matrix/sparsematrix/sparse-tpl-matrix-omp.inl b/linbox/matrix/sparsematrix/sparse-tpl-matrix-omp.inl
new file mode 100644
index 0000000..4de533e
--- /dev/null
+++ b/linbox/matrix/sparsematrix/sparse-tpl-matrix-omp.inl
@@ -0,0 +1,614 @@
+/* linbox/matrix/sparsematrix/sparse-tpl-matrix-omp.h
+ * Copyright (c) Linbox
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ * ========LICENCE========
+
+ * Written by Alex Stachnik <stachnik at udel.edu>
+ */
+
+/** @file matrix/sparsematrix/sparse-tpl-matrix-omp.inl
+ * @ingroup sparsematrix
+ * @brief NO DOC
+ */
+
+#ifndef __LINBOX_triplesbb_omp_INL
+#define __LINBOX_triplesbb_omp_INL
+
+#include <algorithm>
+#include <iostream>
+#include <omp.h>
+#include "linbox/linbox-config.h"
+#include "linbox/util/debug.h"
+#include "linbox/util/field-axpy.h"
+#include "linbox/blackbox/blackbox-interface.h"
+#include "linbox/field/hom.h"
+#include "linbox/util/matrix-stream.h"
+#include "linbox/matrix/abnormal-matrix.h"
+
+#include <vector>
+
+namespace LinBox
+{
+
+template<class Field_>
+void SparseMatrix<Field_,SparseMatrixFormat::TPL_omp>::nonOverlappingIntervals(BlockListIt startIt,
+ BlockListIt endIt,
+ IntervalSet& intervals,
+ const int rowOrCol)
+{
+ for (;startIt!=endIt;++startIt) {
+ Index start,end;
+ if (rowOrCol==CHUNK_BY_ROW) {
+ start=(*startIt).getStartRow();
+ end=(*startIt).getEndRow();
+ } else {
+ start=(*startIt).getStartCol();
+ end=(*startIt).getEndCol();
+ }
+
+ //invariant: no existing interval is dominated by any other
+
+ //if the new interval is not dominated by any other, insert it
+ IntervalIterator it=intervals.lower_bound(start);
+ bool insert=false;
+ if (it == intervals.end()) {
+ insert=true;
+ } else if (it->first == start) {
+ if (it->second < end) {
+ insert=true;
+ }
+ } else {
+ if (it != intervals.begin()) {
+ --it;
+ }
+ if (it->first > start) {
+ insert=true;
+ } else if (it->second < start) {
+ insert=true;
+ }
+ }
+ if (insert) {
+ intervals[start]=end;
+ it=intervals.upper_bound(start);
+
+ //remove all intervals dominated by the new one
+ while ((it!=intervals.end()) && (it->first <= end)) {
+ ++it;
+ }
+ intervals.erase(intervals.upper_bound(start),it);
+ }
+ }
+}
+
+template<class Field_>
+void SparseMatrix<Field_,SparseMatrixFormat::TPL_omp>::combineIntervals(BlockListIt startIt,
+ BlockListIt endIt,
+ IntervalSet& intervals,
+ VectorChunks& chunksOut,
+ const int rowOrCol)
+{
+ typedef std::map<Index,BlockList> VectorBlockMap;
+
+ VectorBlockMap vectorMap;
+ for (IntervalIterator it=intervals.begin();it!=intervals.end();++it) {
+ vectorMap[it->first];
+ }
+
+ for (;startIt!=endIt;++startIt) {
+ Index start;
+ if (rowOrCol==CHUNK_BY_ROW) {
+ start=startIt->getStartRow();
+ } else {
+ start=startIt->getStartCol();
+ }
+
+ IntervalIterator it=intervals.lower_bound(start);
+ if (it != intervals.begin()) {
+ --it;
+ }
+ vectorMap[it->first].push_back(*startIt);
+ }
+
+ chunksOut.clear();
+ for (typename VectorBlockMap::iterator it=vectorMap.begin();
+ it!=vectorMap.end();
+ ++it) {
+ chunksOut.push_back(it->second);
+ }
+}
+
+template<class Field_>
+void SparseMatrix<Field_,SparseMatrixFormat::TPL_omp>::computeVectors(SizedChunks& sizedChunks,
+ BlockList& superBlocks,
+ const int rowOrCol)
+{
+ IntervalSet intervals;
+ VectorChunks chunks;
+
+ Index k=0;
+ Index numSuperBlocks=superBlocks.size();
+ while (k<numSuperBlocks) {
+ TriplesCoord blockSize=superBlocks[k].blockSize();
+ BlockListIt start=superBlocks.begin()+k;
+ while (superBlocks[k].blockSize()==blockSize) {
+ ++k;
+ if (k>=numSuperBlocks) {
+ break;
+ }
+ }
+ BlockListIt end=superBlocks.begin()+k;
+
+ intervals.clear();
+ nonOverlappingIntervals(start,end,intervals,rowOrCol);
+ chunks.clear();
+ combineIntervals(start,end,intervals,chunks,rowOrCol);
+ sizedChunks.push_back(chunks);
+ }
+}
+
+template<class Field_> SparseMatrix<Field_,SparseMatrixFormat::TPL_omp>::SparseMatrix() {}
+template<class Field_> SparseMatrix<Field_,SparseMatrixFormat::TPL_omp>::~SparseMatrix() {}
+
+template<class Field_> SparseMatrix<Field_,SparseMatrixFormat::TPL_omp>::
+SparseMatrix(const Field_& F, std::istream& in) : MD_(F)
+{
+ read(in);
+}
+
+template<class Field_>
+std::istream& SparseMatrix<Field_,SparseMatrixFormat::TPL_omp>::read(std::istream& in){
+ Index r, c;
+ typename Field::Element v; field().init(v);
+ MatrixStream<Field> ms(field(), in);
+ ms.getDimensions((size_t&)r, (size_t&)c);
+ shape(field(), r, c);
+ while (ms.nextTriple((size_t&)r, (size_t&)c, v)) setEntry((size_t)r, (size_t)c, v);
+ return in;
+}
+
+template<class Field_>
+std::ostream& SparseMatrix<Field_,SparseMatrixFormat::TPL_omp>::write(std::ostream& out){
+ out << "%%MatrixMarket matrix coordinate integer general" << std::endl;
+ out << "% written from a LinBox TriplesBBOMP" << std::endl;
+ out << rowdim() <<" " << coldim() << " " << size() << std::endl;
+ for (Index k = 0; k < size(); ++k) {
+ Triple t = data_[k];
+ field().write(out << t.getRow()+1 << " " << t.getCol()+1 << " ", t.getElt()) << std::endl;
+ }
+ return out;
+}
+
+template<class Field_>
+SparseMatrix<Field_,SparseMatrixFormat::TPL_omp>& SparseMatrix<Field_,SparseMatrixFormat::TPL_omp>::shape(const Field& F, Index r, Index c)
+{ MD_=F; data_.clear(); rows_ = r; cols_ = c; sortType_ = TRIPLES_UNSORTED; return *this; }
+
+template<class Field_> SparseMatrix<Field_,SparseMatrixFormat::TPL_omp>::
+SparseMatrix(const Field& F, Index r, Index c)
+ : MD_(F), rows_(r), cols_(c),
+ sortType_(TRIPLES_UNSORTED) {}
+
+template<class Field_>
+SparseMatrix<Field_,SparseMatrixFormat::TPL_omp>::SparseMatrix(const SparseMatrix<Field_,SparseMatrixFormat::TPL_omp> & B)
+ : MD_(B.MD_), data_ ( B.data_ ),
+ rows_ ( B.rows_ ), cols_ ( B.cols_ ),
+ sortType_ ( B.sortType_ ),
+ rowBlocks_(B.rowBlocks_),colBlocks_(B.colBlocks_)
+{}
+
+// template<class Field_>
+// SparseMatrix<Field_,SparseMatrixFormat::TPL_omp> & SparseMatrix<Field_,SparseMatrixFormat::TPL_omp>::operator=(const SparseMatrix<Field_,SparseMatrixFormat::TPL_omp> & rhs)
+// {
+// if (rhs == this)
+// return *this;
+// MD_.init(rhs.field);
+// data_ = rhs.data_;
+// rows_ = rhs.rows_;
+// cols_ = rhs.cols_;
+// sortType_ = rhs.sortType_;
+// rowBlocks_=rhs.rowBlocks_;
+// colBlocks_=rhs.colBlocks_;
+// return *this;
+// }
+
+template<class Field_>
+template<class Mat1, class Mat2> Mat1& SparseMatrix<Field_,SparseMatrixFormat::TPL_omp>::
+applyLeft(Mat1 &Y, const Mat2 &X) const
+{
+ Y.zero();
+
+#ifdef __LINBOX_USE_OPENMP
+#pragma omp parallel
+#endif
+ {
+ Index numBlockSizes=rowBlocks_.size();
+ for (Index chunkSizeIx=0;chunkSizeIx<numBlockSizes;++chunkSizeIx) {
+ const VectorChunks *rowChunks=&(rowBlocks_[chunkSizeIx]);
+ Index numChunks=rowChunks->size();
+#ifdef __LINBOX_USE_OPENMP
+#pragma omp for schedule (static,1)
+#endif
+ for (Index rowChunk=0;rowChunk<numChunks;++rowChunk) {
+ const BlockList *blocks=&((*rowChunks)[rowChunk]);
+ Index numBlocks=blocks->size();
+ for (Index block=0;block<numBlocks;++block) {
+ const DataBlock *dataBlock=&((*blocks)[block]);
+ for (Index k=0;k<dataBlock->elts_.size();++k) {
+ const Index row=dataBlock->getRow((int)k);
+ const Index col=dataBlock->getCol((int)k);
+ typename Matrix::constSubMatrixType Xr(X,col,0,1,X.coldim());
+ typename Matrix::subMatrixType Yr(Y,row,0,1,Y.coldim());
+ MD_.saxpyin(Yr,dataBlock->elts_[k],Xr);
+ }
+ }
+ }
+ }
+ }
+ return Y;
+}
+
+template<class Field_>
+template<class Mat1, class Mat2> Mat1& SparseMatrix<Field_,SparseMatrixFormat::TPL_omp>::
+applyRight(Mat1 &Y, const Mat2 &X) const
+{
+ Y.zero();
+ typedef AbnormalMatrix<Field_,Mat1> AbnormalMat;
+ AbnormalMat YTemp(field(),Y);
+
+#ifdef __LINBOX_USE_OPENMP
+#pragma omp parallel
+#endif
+ {
+ Index numBlockSizes=colBlocks_.size();
+ for (Index chunkSizeIx=0;chunkSizeIx<numBlockSizes;++chunkSizeIx) {
+ const VectorChunks *colChunks=&(colBlocks_[chunkSizeIx]);
+ Index numChunks=colChunks->size();
+#ifdef __LINBOX_USE_OPENMP
+#pragma omp for schedule (static,1)
+#endif
+ for (Index colChunk=0;colChunk<numChunks;++colChunk) {
+ const BlockList *blocks=&((*colChunks)[colChunk]);
+ Index numBlocks=blocks->size();
+ for (Index block=0;block<numBlocks;++block) {
+ const DataBlock *dataBlock=&((*blocks)[block]);
+ for (Index k=0;k<dataBlock->elts_.size();++k) {
+ const Index row=dataBlock->getRow((int)k);
+ const Index col=dataBlock->getCol((int)k);
+ typename Matrix::constSubMatrixType Xc(X,0,row,X.rowdim(),1);
+ YTemp.saxpyin(dataBlock->elts_[k],Xc,
+ 0,col,Y.rowdim(),1);
+ }
+ }
+ }
+ }
+ }
+ YTemp.normalize();
+ return Y;
+}
+
+template<class Field_>
+template<class OutVector, class InVector>
+OutVector & SparseMatrix<Field_,SparseMatrixFormat::TPL_omp>::apply(OutVector & y, const InVector & x) const
+{
+ linbox_check( coldim() == x.size() );
+ linbox_check( rowdim() == y.size() );
+
+ uint8_t* yTempSpace=new uint8_t[sizeof(Field_)*y.size()+CACHE_ALIGNMENT];
+ size_t spacePtr=(size_t)yTempSpace;
+ FieldAXPY<Field_>* yTemp=(FieldAXPY<Field_>*)(spacePtr+CACHE_ALIGNMENT-(spacePtr%CACHE_ALIGNMENT));
+
+
+#ifdef __LINBOX_USE_OPENMP
+#pragma omp parallel
+#endif
+ {
+ const Field_& fieldRef=field();
+#ifdef __LINBOX_USE_OPENMP
+#pragma omp for schedule (static,1024)
+#endif
+ for (size_t i=0;i<y.size();++i) {
+ new ((void*)(yTemp+i)) FieldAXPY<Field_>(fieldRef);
+ }
+
+ Index numBlockSizes=rowBlocks_.size();
+ for (Index chunkSizeIx=0;chunkSizeIx<numBlockSizes;++chunkSizeIx) {
+ const VectorChunks *rowChunks=&(rowBlocks_[chunkSizeIx]);
+ Index numChunks=rowChunks->size();
+#ifdef __LINBOX_USE_OPENMP
+#pragma omp for schedule (static,1)
+#endif
+ for (Index rowChunk=0;rowChunk<numChunks;++rowChunk) {
+ const BlockList *blocks=&((*rowChunks)[rowChunk]);
+ Index numBlocks=blocks->size();
+ for (Index block=0;block<numBlocks;++block) {
+ const DataBlock *dataBlock=&((*blocks)[block]);
+ for (Index k=0;k<dataBlock->elts_.size();++k) {
+ const Index row=dataBlock->getRow((int)k);
+ const Index col=dataBlock->getCol((int)k);
+ yTemp[row].mulacc(dataBlock->elts_[k],x[col]);
+ }
+ }
+ }
+ //implicit barrier
+ }
+#ifdef __LINBOX_USE_OPENMP
+#pragma omp for schedule (static,1024)
+#endif
+ for (Index i = 0; i < y.size(); ++i) {
+ yTemp[i].get(y[i]);
+ yTemp[i].~FieldAXPY<Field_>();
+ }
+ }
+
+ delete[] yTempSpace;
+ return y;
+}
+
+template<class Field_>
+template<class OutVector, class InVector>
+OutVector & SparseMatrix<Field_,SparseMatrixFormat::TPL_omp>::applyTranspose(OutVector & y, const InVector & x) const
+{
+ linbox_check( coldim() == y.size() );
+ linbox_check( rowdim() == x.size() );
+
+ uint8_t* yTempSpace=new uint8_t[sizeof(Field_)*y.size()+CACHE_ALIGNMENT];
+ size_t spacePtr=(size_t)yTempSpace;
+ FieldAXPY<Field_>* yTemp=(FieldAXPY<Field_>*)(spacePtr+CACHE_ALIGNMENT-(spacePtr%CACHE_ALIGNMENT));
+
+
+#ifdef __LINBOX_USE_OPENMP
+#pragma omp parallel
+#endif
+ {
+ const Field_& fieldRef=field();
+#ifdef __LINBOX_USE_OPENMP
+#pragma omp for schedule (static,1024)
+#endif
+ for (size_t i=0;i<y.size();++i) {
+ new ((void*)(yTemp+i)) FieldAXPY<Field_>(fieldRef);
+ }
+
+ Index numBlockSizes=colBlocks_.size();
+ for (Index chunkSizeIx=0;chunkSizeIx<numBlockSizes;++chunkSizeIx) {
+ const VectorChunks *colChunks=&(colBlocks_[chunkSizeIx]);
+ Index numChunks=colChunks->size();
+#ifdef __LINBOX_USE_OPENMP
+#pragma omp for schedule (static,1)
+#endif
+ for (Index colChunk=0;colChunk<numChunks;++colChunk) {
+ const BlockList *blocks=&((*colChunks)[colChunk]);
+ Index numBlocks=blocks->size();
+ for (Index block=0;block<numBlocks;++block) {
+ const DataBlock *dataBlock=&((*blocks)[block]);
+ for (Index k=0;k<dataBlock->elts_.size();++k) {
+ const Index row=dataBlock->getRow((int)k);
+ const Index col=dataBlock->getCol((int)k);
+ yTemp[col].mulacc(dataBlock->elts_[k],x[row]);
+ }
+ }
+ }
+ //implicit barrier
+ }
+#ifdef __LINBOX_USE_OPENMP
+#pragma omp for schedule (static,1024)
+#endif
+ for (Index i = 0; i < y.size(); ++i) {
+ yTemp[i].get(y[i]);
+ yTemp[i].~FieldAXPY<Field_>();
+ }
+ }
+
+ delete[] yTempSpace;
+ return y;
+}
+
+template<class Field_>
+Index SparseMatrix<Field_,SparseMatrixFormat::TPL_omp>::rowdim() const { return rows_; }
+
+template<class Field_>
+Index SparseMatrix<Field_,SparseMatrixFormat::TPL_omp>::coldim() const { return cols_; }
+
+template<class Field_>
+const Field_& SparseMatrix<Field_,SparseMatrixFormat::TPL_omp>::
+field() const { return MD_.field();}
+
+template<class Field_>
+size_t SparseMatrix<Field_,SparseMatrixFormat::TPL_omp>::size() const { return data_.size(); }
+
+template<class Field_>
+void SparseMatrix<Field_,SparseMatrixFormat::TPL_omp>::splitBlock(RefBlockList& superBlocks,TriplesBlock startBlock)
+{
+ typedef typename std::vector<Triple>::iterator BlockVecIt;
+
+ std::vector<TriplesBlock> blocks;
+ if (startBlock.nnz()<MAX_BLOCK_NNZ) {
+ --startBlock.blockEnd_;
+ superBlocks.push_back(startBlock);
+ } else {
+ blocks.push_back(startBlock);
+ }
+
+ while(!(blocks.empty())) {
+ TriplesBlock block=blocks.back();
+ blocks.pop_back();
+
+ Triple blockStart(block.blockStart_);
+ Triple blockEnd(block.blockEnd_);
+ TriplesCoord blockSize=block.blockSize();
+ TriplesCoord quarterSize=blockSize>>2;
+ Triple midOne(blockStart.coord_+quarterSize);
+ Triple midTwo(midOne.coord_+quarterSize);
+ Triple midThree(midTwo.coord_+quarterSize);
+
+ BlockVecIt dataBegin=data_.begin()+block.start_;
+ BlockVecIt dataEnd=data_.begin()+block.end_;
+ Index midOneData,midTwoData,midThreeData;
+
+ Triple midOneMM(midOne), midTwoMM(midTwo), midThreeMM(midThree);
+ --midOneMM.coord_; --midTwoMM.coord_; --midThreeMM.coord_;
+ midOneData=std::upper_bound(dataBegin,dataEnd,midOneMM,Triple::compareBlockTriples)-data_.begin();
+ midTwoData=std::upper_bound(dataBegin,dataEnd,midTwoMM,Triple::compareBlockTriples)-data_.begin();
+ midThreeData=std::upper_bound(dataBegin,dataEnd,midThreeMM,Triple::compareBlockTriples)-data_.begin();
+
+ TriplesBlock blockOne(block.start_,midOneData,block.blockStart_,midOne.coord_);
+ TriplesBlock blockTwo(midOneData,midTwoData,midOne.coord_,midTwo.coord_);
+ TriplesBlock blockThree(midTwoData,midThreeData,midTwo.coord_,midThree.coord_);
+ TriplesBlock blockFour(midThreeData,block.end_,midThree.coord_,block.blockEnd_);
+
+ if (blockOne.nnz()<MAX_BLOCK_NNZ) {
+ --blockOne.blockEnd_;
+ superBlocks.push_back(blockOne);
+ } else {
+ blocks.push_back(blockOne);
+ }
+ if (blockTwo.nnz()<MAX_BLOCK_NNZ) {
+ --blockTwo.blockEnd_;
+ superBlocks.push_back(blockTwo);
+ } else {
+ blocks.push_back(blockTwo);
+ }
+ if (blockThree.nnz()<MAX_BLOCK_NNZ) {
+ --blockThree.blockEnd_;
+ superBlocks.push_back(blockThree);
+ } else {
+ blocks.push_back(blockThree);
+ }
+ if (blockFour.nnz()<MAX_BLOCK_NNZ) {
+ --blockFour.blockEnd_;
+ superBlocks.push_back(blockFour);
+ } else {
+ blocks.push_back(blockFour);
+ }
+ }
+}
+
+template<class Field_>
+void SparseMatrix<Field_,SparseMatrixFormat::TPL_omp>::toDataBlock(const RefBlockList& superBlocks,
+ BlockList& dataBlocks)
+{
+ dataBlocks.clear();
+ dataBlocks.resize(superBlocks.size());
+ for (size_t i=0;i<superBlocks.size();++i) {
+ TriplesBlock block=superBlocks[i];
+ int ccf;
+
+ Index rowDiff=block.getStartRow()^block.getEndRow();
+ Index colDiff=block.getStartCol()^block.getEndCol();
+ Index combinedDiff=rowDiff|colDiff;
+ if ((combinedDiff>>8)==0) {
+ ccf=3;
+ } else if ((combinedDiff>>16) == 0) {
+ ccf=2;
+ } else if ((combinedDiff>>32) == 0) {
+ ccf=1;
+ } else {
+ ccf=0;
+ }
+
+ typename DataBlock::TripleListIt startIt=data_.begin()+block.start_;
+ typename DataBlock::TripleListIt endIt=data_.begin()+block.end_;
+ block.toBlock();
+ TriplesCoord blockSize=block.blockSize();
+ ++blockSize;
+ block.fromBlock();
+ dataBlocks[i].init(block.blockStart_,block.blockEnd_,
+ blockSize,startIt,endIt,ccf);
+
+ }
+}
+
+template<class Field_>
+void SparseMatrix<Field_,SparseMatrixFormat::TPL_omp>::finalize()
+{
+ if ((sortType_ & TRIPLES_SORTED) != 0) {return; }
+ for (Index k=0; k<data_.size();++k) {
+ data_[k].toBlock();
+ }
+
+ std::stable_sort(data_.begin(),data_.end(),Triple::compareBlockTriples);
+ std::vector<Triple> tempData;
+ tempData.reserve(data_.size());
+ if (!(data_.empty())) {
+ tempData.push_back(data_[0]);
+ }
+ for (size_t k=1;k<data_.size();++k) {
+ if (!(data_[k].coord_==tempData.back().coord_)) {
+ tempData.push_back(data_[k]);
+ }
+ }
+ data_.swap(tempData);
+
+ RefBlockList superBlocks;
+ Index rowBound=roundUpIndex(rowdim());
+ Index colBound=roundUpIndex(coldim());
+ Index rowColBound=(rowBound<colBound)?colBound:rowBound;
+ TriplesCoord startBlockIx(0,0),endBlockIx(0,rowColBound);
+ coordToBlock(endBlockIx);
+ TriplesBlock initialBlock(0,data_.size(),startBlockIx,endBlockIx);
+
+ splitBlock(superBlocks,initialBlock);
+
+ for (Index k=0;k<data_.size();++k) {
+ data_[k].fromBlock();
+ }
+
+ std::sort(superBlocks.begin(),superBlocks.end(),TriplesBlock::compareBlockSizes);
+
+ for (Index i=0;i<superBlocks.size();++i) {
+ superBlocks[i].fromBlock();
+ }
+
+ std::vector<DataBlock> dataBlocks;
+ toDataBlock(superBlocks,dataBlocks);
+
+ rowBlocks_.clear();
+ computeVectors(rowBlocks_,dataBlocks,CHUNK_BY_ROW);
+ colBlocks_.clear();
+ computeVectors(colBlocks_,dataBlocks,CHUNK_BY_COL);
+
+ sortType_=TRIPLES_SORTED;
+}
+
+template<class Field_>
+void SparseMatrix<Field_,SparseMatrixFormat::TPL_omp>::setEntry(Index i, Index j, const typename Field::Element & e)
+{
+ sortType_ = TRIPLES_UNSORTED;
+ data_.push_back(Triple(i, j, e));
+}
+
+template<class Field_>
+typename Field_::Element& SparseMatrix<Field_,SparseMatrixFormat::TPL_omp>::
+getEntry(typename Field::Element& e, Index i, Index j) const
+{
+ for (Index k = data_.size(); k > 0; --k)
+ if (data_[k-1].getRow() == i and data_[k-1].getCol() == j)
+ return e = data_[k-1].getElt();
+ return e = field().zero;
+}
+
+} // namespace LinBox
+
+#endif // __LINBOX_triplesbb_INL
+
+
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/matrix/sparsematrix/sparse-tpl-matrix.h b/linbox/matrix/sparsematrix/sparse-tpl-matrix.h
new file mode 100644
index 0000000..3aed88d
--- /dev/null
+++ b/linbox/matrix/sparsematrix/sparse-tpl-matrix.h
@@ -0,0 +1,241 @@
+/* linbox/blackbox/matrix/sparsematrix/sparse-tpl-matrix.h
+ * Copyright (c) Linbox
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ * ========LICENCE========
+
+ * Written by Rich Seagraves <seagrave at cis.udel.edu>
+ * with mods by bds
+ */
+
+/** @file matrix/sparsematrix/sparse-tpl-matrix.h
+ * @ingroup sparsematrix
+ * @brief
+ * A <code>SparseMatrix<_Field, SparseMatrixFormat::TPL ></code>
+ * is a vector of (i,j,value) triples.
+ *
+ * This is a variant of COO format.
+ */
+
+
+#ifndef __LINBOX_matrix_sparsematrix_sparse_tpl_matrix_H
+#define __LINBOX_matrix_sparsematrix_sparse_tpl_matrix_H
+
+#include <algorithm>
+#include <iostream>
+#include "linbox/linbox-config.h"
+#include "linbox/util/debug.h"
+#include "linbox/util/field-axpy.h"
+#include "linbox/blackbox/blackbox-interface.h"
+#include "linbox/field/hom.h"
+#include "linbox/matrix/matrix-domain.h"
+
+#include <vector>
+
+namespace LinBox
+{
+
+ /** \brief Sparse Matrix in Triples storage
+ *
+ \ingroup blackbox
+ * Sparse matrix representation which stores nonzero entries by i,j,value triples.
+ */
+ template<class Field_>
+ class SparseMatrix<Field_, SparseMatrixFormat::TPL> : public BlackboxInterface {
+
+ public:
+ typedef Field_ Field;
+ typedef typename MatrixDomain<Field>::Matrix Matrix;
+ typedef typename Field::Element Element;
+ typedef SparseMatrix<Field,SparseMatrixFormat::TPL> Self_t;
+ typedef size_t Index; // would prefer a signed type
+ enum sortPolicy {unsorted, cacheOpt, rowMajor, colMajor};
+
+ // Default constructor.
+ // SparseMatrix();
+
+ SparseMatrix(const SparseMatrix & B);
+
+ SparseMatrix(const Field& F, std::istream& in);
+ SparseMatrix(MatrixStream<Field>& ms);
+
+ std::istream& read(std::istream& in);
+
+ template<class Format>
+ std::ostream& write(std::ostream& out, Format f) const;
+
+ std::ostream& write(std::ostream& out) const;
+
+
+ ~SparseMatrix();
+
+ SparseMatrix(const Field& F, Index r = 0, Index c = 0);
+
+ // (re)initialize the matrix. Any prior entries are abandoned.
+ SparseMatrix& init(const Field& F, Index r = 0, Index c = 0);
+
+ // need cstor from matrix stream, read, write
+
+ // Element e is added in the i,j position.
+ void setEntry(Index i, Index j, const Element & e);
+
+ /// Establish triples order. Use after setEntry's, before any applies.
+ void finalize(sortPolicy s = cacheOpt);
+
+ // Element e is set to the i,j entry.
+ Element& getEntry(Element& e, Index i, Index j) const;
+
+ const Element /* & */getEntry(Index i, Index j) const
+ {
+ Element x ;
+ getEntry(x,i,j);
+ return x;
+ }
+
+ /// Mul with this on left: Y <- AX. Requires conformal shapes.
+ template<class Mat1, class Mat2>
+ Mat1 & applyLeft(Mat1 &Y, const Mat2 &X) const;
+ //Matrix & applyLeft(Matrix &Y, const Matrix &X) const;
+
+ /// Mul with this on right: Y <- XA. Requires conformal shapes.
+ template<class Mat1, class Mat2>
+ Mat1 & applyRight(Mat1 &Y, const Mat2 &X) const;
+ //Matrix & applyRight(Matrix &Y, const Matrix &X) const;
+
+ /** y <- A x.
+ *
+ * Performance will generally be best if A is in cacheOpt order,
+ * and rowMajor, colMajor orders are generally better than random.
+ *
+ */
+ template<class OutVector, class InVector>
+ OutVector & apply(OutVector &y, const InVector &x) const;
+
+ /** y <- A^T x.
+ *
+ * Performance will generally be best if A is in cacheOpt order,
+ * and rowMajor, colMajor orders are generally better than random.
+ *
+ */
+ template<class OutVector, class InVector>
+ OutVector & applyTranspose(OutVector &, const InVector &) const;
+
+ size_t rowdim() const;
+
+ size_t coldim() const;
+
+ const Field & field() const;
+
+ /*! Returns number of non-zero entries
+ * @warning (some could be zero, for instance after a rebind...
+ */
+ size_t size() const;
+
+
+ void resize( size_t row, size_t col, size_t nbnz = 0)
+ {
+ rows_ = row ;
+ cols_ = col ;
+ data_.resize(nbnz);
+ }
+
+ template<typename _Tp1, typename _Rw1 >
+ struct rebind ;
+
+
+ template<typename Tp1_, typename _Rw1 = SparseMatrixFormat::TPL>
+ struct rebind {
+ typedef SparseMatrix<Tp1_, SparseMatrixFormat::TPL> other;
+ void operator() (other & Ap, const Self_t& A)
+ {
+ Hom <typename Self_t::Field, Tp1_> hom( A.field(), Ap.field( ));
+
+ // typedef typename Tp1_::Element otherElt;
+ typedef typename other::Rep othervec;
+ typedef typename othervec::iterator otheriter;
+ otheriter vp_i;
+ typedef Rep selfvec;
+ typedef typename selfvec::const_iterator selfiter;
+ selfiter v_i;
+
+ Ap.resize(A.rowdim(),A.coldim(),A.size());
+ // Ap.data_.resize(A.data.size()); !!! this is protected
+
+ for (v_i = A.refDataConst().begin(), vp_i = Ap.refData().begin();
+ v_i != A.refDataConst().end(); ++ v_i, ++ vp_i)
+ hom.image (vp_i->elt, v_i->elt);
+ }
+ };
+
+ template<typename _Tp1, typename _Rw1>
+ SparseMatrix (const SparseMatrix<_Tp1, _Rw1> &S, const Field& F) :
+ MD_(F), data_(), rows_(0), cols_(0), sort_(unsorted)
+ {
+ typename SparseMatrix<_Tp1,_Rw1>::template rebind<Field,SparseMatrixFormat::TPL>()(*this, S);
+ }
+
+
+
+ protected:
+ MatrixDomain<Field> MD_; // Contains the field and dense mat ops for applyLeft and applyRight
+
+ struct Triple { Index row; Index col; Element elt;
+ Triple(Index& r, Index& c, const Element& e)
+ { init(r, c, e); }
+ Triple() {} ;
+ void init(Index& r, Index& c, const Element& e)
+ { row = r; col = c; elt = e; }
+ };
+
+ // the data
+ std::vector<Triple> data_;
+
+ /// The number of rows, columns
+ Index rows_, cols_;
+
+ sortPolicy sort_;
+ // 0 = unsorted, 1 = cache optimized, 2 = row major, 3 = col major.
+ //int sort_;
+ public:
+ typedef std::vector<Triple> Rep ;
+ const std::vector<Triple> & refDataConst() const
+ {
+ return data_ ;
+ }
+ std::vector<Triple> & refData()
+ {
+ return data_ ;
+ }
+
+
+
+ }; // SparseMatrix
+
+} // namespace LinBox
+
+#include "sparse-tpl-matrix.inl"
+
+#endif // __LINBOX_matrix_sparsematrix_sparse_tpl_matrix_H
+
+
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/matrix/sparsematrix/sparse-tpl-matrix.inl b/linbox/matrix/sparsematrix/sparse-tpl-matrix.inl
new file mode 100644
index 0000000..d6856a2
--- /dev/null
+++ b/linbox/matrix/sparsematrix/sparse-tpl-matrix.inl
@@ -0,0 +1,253 @@
+/* linbox/matrix/sparsematrix/sparse-tpl-matrix-omp.inl
+ * Copyright (c) LinBox
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ * ========LICENCE========
+
+ * Written by Rich Seagraves <seagrave at cis.udel.edu>
+ * with mods by bds and Alex Stachnik
+ */
+
+/** @file matrix/sparsematrix/sparse-tpl-matrix-omp.inl
+ * @ingroup blackbox
+ * @brief A COO (vector of i,j,v triples) sparse matrix rep.
+ */
+
+#ifndef __LINBOX_triplesbb_INL
+#define __LINBOX_triplesbb_INL
+
+#include <algorithm>
+#include <iostream>
+//#include <vector>
+
+#include "linbox/util/matrix-stream.h"
+
+namespace LinBox
+{
+
+// template<class Field_> SparseMatrix<Field_,SparseMatrixFormat::TPL>::
+// SparseMatrix() : MD_(), data_(), rows_(0), cols_(0), sort_(unsorted) {}
+
+template<class Field_>
+ SparseMatrix<Field_,SparseMatrixFormat::TPL>::
+~SparseMatrix() {}
+
+template<class Field_>
+ SparseMatrix<Field_,SparseMatrixFormat::TPL>::
+SparseMatrix(const Field& F, std::istream& in)
+: MD_(F), data_(), rows_(0), cols_(0), sort_(unsorted)
+{ read(in); }
+
+template<class Field_>
+SparseMatrix<Field_,SparseMatrixFormat::TPL>::
+SparseMatrix(MatrixStream<Field_> &ms):
+ MD_(ms.field()), data_(), rows_(0), cols_(0), sort_(unsorted)
+{
+ Index r, c;
+ typename Field::Element v; field().init(v);
+ ms.getDimensions(r, c);
+ init(field(), r, c);
+ while (ms.nextTriple(r, c, v)) setEntry(r, c, v);
+ finalize();
+}
+
+
+template<class Field_>
+ std::istream& SparseMatrix<Field_,SparseMatrixFormat::TPL>::
+read(std::istream& in){
+ Index r, c;
+ typename Field::Element v; field().init(v);
+ MatrixStream<Field> ms(field(), in);
+ ms.getDimensions(r, c);
+ init(field(), r, c);
+ while (ms.nextTriple(r, c, v)) setEntry(r, c, v);
+ finalize();
+ return in;
+}
+
+template<class Field_>
+template<class Format>
+ std::ostream& SparseMatrix<Field_,SparseMatrixFormat::TPL>::
+write(std::ostream& out,
+ Format f ) const{
+ return write(out);
+}
+template<class Field_>
+ std::ostream& SparseMatrix<Field_,SparseMatrixFormat::TPL>::
+write(std::ostream& out ) const{
+ // linbox_check(f == SparseFileFormat::COO());
+ //! @bug we should not support too many formats
+ out << "%%MatrixMarket matrix coordinate integer general" << std::endl;
+ out << "% written from a LinBox SparseMatrix" << std::endl;
+ out << rowdim() <<" " << coldim() << " " << size() << std::endl;
+ for (Index k = 0; k < size(); ++k) {
+ Triple t = data_[k];
+ field().write(out << t.row+1 << " " << t.col+1 << " ", t.elt) << std::endl;
+ }
+ return out;
+}
+
+template<class Field_>
+ SparseMatrix<Field_,SparseMatrixFormat::TPL>& SparseMatrix<Field_,SparseMatrixFormat::TPL>::
+init(const Field& F, Index r, Index c)
+{ MD_.init(F), data_.clear(); rows_ = r; cols_ = c; sort_ = unsorted; return *this; }
+
+template<class Field_>
+ SparseMatrix<Field_,SparseMatrixFormat::TPL>::
+SparseMatrix(const Field& F, Index r, Index c)
+: MD_(F), data_(), rows_(r), cols_(c), sort_(unsorted) {}
+
+template<class Field_>
+ SparseMatrix<Field_,SparseMatrixFormat::TPL>::
+SparseMatrix(const SparseMatrix<Field_,SparseMatrixFormat::TPL> & B)
+: MD_(B.field()), data_ ( B.data_ ), rows_ ( B.rows_ ), cols_ ( B.cols_ ),
+ sort_ ( B.sort_ )
+{}
+
+ // template<class Field_>
+// SparseMatrix<Field_,SparseMatrixFormat::TPL>& SparseMatrix<Field_,SparseMatrixFormat::TPL>::
+// operator=(const SparseMatrix<Field_,SparseMatrixFormat::TPL> & rhs)
+// { if (rhs == this) return *this;
+// MD_.init(rhs.field_);
+// data_ = rhs.data_;
+// rows_ = rhs.rows_;
+// cols_ = rhs.cols_;
+// sort_ = rhs.sort_;
+// return *this;
+// }
+
+template<class Field_>
+template<class Mat1, class Mat2> Mat1& SparseMatrix<Field_,SparseMatrixFormat::TPL>::
+// I do not like this need to templatize -bds
+//typename SparseMatrix<Field_,SparseMatrixFormat::TPL>::Matrix& SparseMatrix<Field_,SparseMatrixFormat::TPL>::
+applyLeft // Y = AX
+ ( /*typename SparseMatrix<Field_,SparseMatrixFormat::TPL>::Matrix*/Mat1 &Y,
+ const /*typename SparseMatrix<Field_,SparseMatrixFormat::TPL>::Matrix*/Mat2 &X
+ ) const
+{ Y.zero();
+ // Matrix Yc(field()) ;
+ // const Matrix Xc(field());// row submatrices
+ for (Index k = 0; k < data_.size(); ++k) {
+ Triple t = data_[k];
+ Matrix Yc (Y,t.row,0,1,Y.coldim());
+ // Yc.submatrix(Y,t.row,0,1,Y.coldim());
+ typename Matrix::constSubMatrixType Xc(X,t.col,0,1,X.coldim());
+ // Xc.submatrix(X,t.col,0,1,X.coldim());
+ MD_.saxpyin(Yc, t.elt, Xc);
+ }
+ return Y;
+}
+
+//template<class Field_> typename SparseMatrix<Field_,SparseMatrixFormat::TPL>::Matrix& SparseMatrix<Field_,SparseMatrixFormat::TPL>::
+template<class Field_>
+template<class Mat1, class Mat2> Mat1& SparseMatrix<Field_,SparseMatrixFormat::TPL>::
+applyRight // Y = XA
+ ( /*SparseMatrix<Field_,SparseMatrixFormat::TPL>::Matrix*/Mat1 &Y,
+ const /*typename SparseMatrix<Field_,SparseMatrixFormat::TPL>::Matrix*/Mat2 &X
+ ) const
+{ Y.zero();
+ // Matrix Yr(field());
+ // const Matrix Xr(field()); // row submatrices
+ for (Index k = 0; k < data_.size(); ++k) {
+ Triple t = data_[k];
+ Matrix Yr(Y,0,t.col,Y.rowdim(),1);
+ // Yr.submatrix(Y,0,t.col,Y.rowdim(),1);
+ typename Matrix::constSubMatrixType Xr(X,0,t.row,X.rowdim(),1);
+ // Xr.submatrix(X,0,t.row,X.rowdim(),1);
+ MD_.saxpyin(Yr, t.elt, Xr);
+ }
+ return Y;
+}
+
+template<class Field_>
+template<class OutVector, class InVector>
+OutVector & SparseMatrix<Field_,SparseMatrixFormat::TPL>::apply(OutVector & y, const InVector & x) const
+{
+ linbox_check( rowdim() == y.size() );
+ linbox_check( coldim() == x.size() );
+ for (Index i = 0; i < y.size(); ++i) field().assign(y[i], field().zero);
+ for (Index k = 0; k < data_.size(); ++k) {
+ Triple t = data_[k];
+ field().axpyin(y[t.row], t.elt, x[t.col]);
+ }
+ return y;
+}
+
+template<class Field_>
+
+template<class OutVector, class InVector>
+OutVector & SparseMatrix<Field_,SparseMatrixFormat::TPL>::applyTranspose(OutVector & y, const InVector & x) const
+{
+ linbox_check( coldim() == y.size() );
+ linbox_check( rowdim() == x.size() );
+ for (Index i = 0; i < y.size(); ++i) field().assign(y[i], field().zero);
+ for (Index k = 0; k < data_.size(); ++k) {
+ const Triple& t = data_[k];
+ field().axpyin(y[t.col], t.elt, x[t.row]);
+ }
+ return y;
+}
+
+template<class Field_>
+ size_t SparseMatrix<Field_,SparseMatrixFormat::TPL>::
+rowdim() const { return rows_; }
+
+template<class Field_>
+ size_t SparseMatrix<Field_,SparseMatrixFormat::TPL>::
+coldim() const { return cols_; }
+
+template<class Field_>
+ const Field_& SparseMatrix<Field_,SparseMatrixFormat::TPL>::
+field() const { return MD_.field(); }
+
+template<class Field_>
+ size_t SparseMatrix<Field_,SparseMatrixFormat::TPL>::
+size() const { return data_.size(); }
+
+template<class Field_>
+ void SparseMatrix<Field_,SparseMatrixFormat::TPL>::
+setEntry(Index i, Index j, const typename Field::Element & e)
+{
+ sort_ = unsorted;
+ data_.push_back(Triple(i, j, e));
+}
+
+template<class Field_>
+ void SparseMatrix<Field_,SparseMatrixFormat::TPL>::
+finalize(sortPolicy s) { /* sort according to policy */ sort_ = s; }
+
+template<class Field_>
+ typename Field_::Element& SparseMatrix<Field_,SparseMatrixFormat::TPL>::
+getEntry(typename Field_::Element& e, Index i, Index j) const
+{
+ for (Index k = 0; k < data_.size(); ++k)
+ if (data_[k].row == i and data_[k].col == j)
+ return e = data_[k].elt;
+ return e = field().zero;
+}
+
+} // namespace LinBox
+
+#endif // __LINBOX_triplesbb_INL
+
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/matrix/sparsematrix/triples-coord.h b/linbox/matrix/sparsematrix/triples-coord.h
new file mode 100644
index 0000000..2d704d4
--- /dev/null
+++ b/linbox/matrix/sparsematrix/triples-coord.h
@@ -0,0 +1,200 @@
+/* Copyright (C) 2013 LinBox
+ * Written by AJS <stachnik at udel.edu>
+ *
+ *
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ * ========LICENCE========
+ */
+
+/*! @file linbox/matrix/sparsematrix/tripples-coord.h
+ * @brief
+ */
+
+#ifndef __LINBOX_matrix_sparsematrix_triples_coord_H
+#define __LINBOX_matrix_sparsematrix_triples_coord_H
+
+#include <stdlib.h>
+#include <fstream>
+#include <limits.h>
+
+namespace LinBox
+{
+
+//typedef size_t Index;
+ typedef uint64_t Index;
+
+union TriplesCoord {
+ Index rowCol[2];
+ Index blockIxArr[2]; // little endian
+
+ TriplesCoord() {};
+
+ TriplesCoord(Index row, Index col) {rowCol[0]=row;rowCol[1]=col;}
+
+ inline TriplesCoord operator--() {
+ linbox_check(!((blockIxArr[0]==0)&&(blockIxArr[1]==0)));
+ if (blockIxArr[0] == 0) {
+ --blockIxArr[1];
+ }
+ --blockIxArr[0];
+ return *this;
+ }
+
+ inline TriplesCoord operator++() {
+ ++blockIxArr[0];
+ if (blockIxArr[0] == 0) {
+ ++blockIxArr[1];
+ }
+ return *this;
+ }
+};
+
+std::ostream& operator<<(std::ostream& out, const TriplesCoord& coord)
+{
+ out << coord.rowCol[0] << "," << coord.rowCol[1];
+ return out;
+}
+
+inline TriplesCoord operator>>(const TriplesCoord& coord,unsigned int shift) {
+ TriplesCoord retVal;
+ retVal.blockIxArr[1]=coord.blockIxArr[1]>>shift;
+ retVal.blockIxArr[0]=
+ ((((1<<shift)-1)&coord.blockIxArr[1])<<(64-shift))|
+ (coord.blockIxArr[0]>>shift);
+ return retVal;
+}
+
+inline TriplesCoord operator+(const TriplesCoord& lhs,const TriplesCoord& rhs) {
+ TriplesCoord retVal;
+ retVal.blockIxArr[0]=lhs.blockIxArr[0]+rhs.blockIxArr[0];
+ retVal.blockIxArr[1]=lhs.blockIxArr[1]+rhs.blockIxArr[1];
+ if (retVal.blockIxArr[0]<lhs.blockIxArr[0]) {
+ ++(retVal.blockIxArr[1]);
+ }
+ return retVal;
+}
+
+inline bool operator==(const TriplesCoord& lhs,const TriplesCoord& rhs) {
+ return (lhs.blockIxArr[1]==rhs.blockIxArr[1]) &&
+ (lhs.blockIxArr[0]==rhs.blockIxArr[0]);
+
+}
+
+inline bool operator<(const TriplesCoord& lhs,const TriplesCoord& rhs) {
+ return (lhs.blockIxArr[1]<rhs.blockIxArr[1])||
+ ((!(lhs.blockIxArr[1]>rhs.blockIxArr[1])) &&
+ (lhs.blockIxArr[0]<rhs.blockIxArr[0]));
+}
+
+inline TriplesCoord operator-(const TriplesCoord& lhs,const TriplesCoord& rhs) {
+ TriplesCoord retVal;
+ linbox_check(!(lhs<rhs));
+ retVal.blockIxArr[0]=lhs.blockIxArr[0]-rhs.blockIxArr[0];
+ retVal.blockIxArr[1]=lhs.blockIxArr[1]-rhs.blockIxArr[1];
+ if (lhs.blockIxArr[0]<rhs.blockIxArr[0]) {
+ --(retVal.blockIxArr[1]);
+ }
+ return retVal;
+}
+
+void coordFromBlock(TriplesCoord& coord)
+{
+ Index temp,final;
+ Index localRow=0,localCol=0;
+ if (coord.blockIxArr[1]!=0) {
+ final=coord.blockIxArr[1];
+ temp=(final^(final>>1))&0x2222222222222222;
+ final^=temp^(temp<<1);
+ temp=(final^(final>>2))&0x0C0C0C0C0C0C0C0C;
+ final^=temp^(temp<<2);
+ temp=(final^(final>>4))&0x00F000F000F000F0;
+ final^=temp^(temp<<4);
+ temp=(final^(final>>8))&0x0000FF000000FF00;
+ final^=temp^(temp<<8);
+ temp=(final^(final>>16))&0x00000000FFFF0000;
+ final^=temp^(temp<<16);
+ localRow=(Index)(final&(~0xFFFFFFFF));
+ localCol=(Index)((final<<32)&(~0xFFFFFFFF));
+ }
+ final=coord.blockIxArr[0];
+ temp=(final^(final>>1))&0x2222222222222222;
+ final^=temp^(temp<<1);
+ temp=(final^(final>>2))&0x0C0C0C0C0C0C0C0C;
+ final^=temp^(temp<<2);
+ temp=(final^(final>>4))&0x00F000F000F000F0;
+ final^=temp^(temp<<4);
+ temp=(final^(final>>8))&0x0000FF000000FF00;
+ final^=temp^(temp<<8);
+ temp=(final^(final>>16))&0x00000000FFFF0000;
+ final^=temp^(temp<<16);
+ localRow|=(Index)((final>>32)&0xFFFFFFFF);
+ localCol|=(Index)(final&0xFFFFFFFF);
+ coord.rowCol[0]=localRow;
+ coord.rowCol[1]=localCol;
+}
+
+void coordToBlock(TriplesCoord& coord)
+{
+ Index temp,final;
+ Index localRow=coord.rowCol[0],localCol=coord.rowCol[1];
+ Index highOrderLocalRow=localRow&(~0xFFFFFFFF);
+ Index highOrderLocalCol=localCol&(~0xFFFFFFFF);
+ Index highOrderFinal;
+ coord.blockIxArr[1]=0;
+ if ((highOrderLocalRow != 0) || (highOrderLocalCol != 0)) {
+ highOrderFinal=localRow|(localCol>>32);
+ temp=(highOrderFinal^(highOrderFinal>>16))&0x00000000FFFF0000;
+ highOrderFinal^=temp^(temp<<16);
+ temp=(highOrderFinal^(highOrderFinal>>8))&0x0000FF000000FF00;
+ highOrderFinal^=temp^(temp<<8);
+ temp=(highOrderFinal^(highOrderFinal>>4))&0x00F000F000F000F0;
+ highOrderFinal^=temp^(temp<<4);
+ temp=(highOrderFinal^(highOrderFinal>>2))&0x0C0C0C0C0C0C0C0C;
+ highOrderFinal^=temp^(temp<<2);
+ temp=(highOrderFinal^(highOrderFinal>>1))&0x2222222222222222;
+ highOrderFinal^=temp^(temp<<1);
+ coord.blockIxArr[1]=highOrderFinal;
+ }
+ localCol&=0xFFFFFFFF;
+ localRow&=0xFFFFFFFF;
+ final=(localRow<<32)|localCol;
+ temp=(final^(final>>16))&0x00000000FFFF0000;
+ final^=temp^(temp<<16);
+ temp=(final^(final>>8))&0x0000FF000000FF00;
+ final^=temp^(temp<<8);
+ temp=(final^(final>>4))&0x00F000F000F000F0;
+ final^=temp^(temp<<4);
+ temp=(final^(final>>2))&0x0C0C0C0C0C0C0C0C;
+ final^=temp^(temp<<2);
+ temp=(final^(final>>1))&0x2222222222222222;
+ final^=temp^(temp<<1);
+ coord.blockIxArr[0]=final;
+}
+
+}
+
+#endif // __LINBOX_matrix_sparsematrix_triples_coord_H
+
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/matrix/transpose-matrix.h b/linbox/matrix/transpose-matrix.h
index 2e9c89e..022f5df 100644
--- a/linbox/matrix/transpose-matrix.h
+++ b/linbox/matrix/transpose-matrix.h
@@ -35,18 +35,23 @@
#ifndef __LINBOX_matrix_transpose_INL
#define __LINBOX_matrix_transpose_INL
+#include <linbox/linbox-config.h>
#include <iostream>
#include <vector>
#include <fstream>
-#include "linbox/vector/subiterator.h"
-#include "linbox/vector/subvector.h"
-#include "linbox/vector/stream.h"
+// #include "linbox/vector/subiterator.h" // BB: not used
+// #include "linbox/vector/subvector.h"
+#include "linbox/matrix/matrix-traits.h"
+// #include "linbox/vector/stream.h"
#include "linbox/matrix/matrix-domain.h"
namespace LinBox
{
+ template<class Matrix>
+ struct MatrixTraits ;
+
/** @brief Matrix transpose.
*
* This class takes a matrix meeting the @ref BlasMatrix archetype
@@ -690,11 +695,10 @@ namespace LinBox
#endif // __LINBOX_matrix_transpose_INL
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
// Local Variables:
// mode: C++
// tab-width: 8
// indent-tabs-mode: nil
// c-basic-offset: 8
// End:
-
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/randiter/Makefile.am b/linbox/randiter/Makefile.am
index 5ca624b..f43e836 100644
--- a/linbox/randiter/Makefile.am
+++ b/linbox/randiter/Makefile.am
@@ -18,11 +18,13 @@
# ========LICENCE========
+AM_CPPFLAGS= -I$(top_srcdir)/linbox $(DEPS_CFLAGS)
+LDADD = $(DEPS_LIBS) $(LDFLAGS)
-AM_CPPFLAGS=-I$(top_srcdir)/linbox
pkgincludesubdir=$(pkgincludedir)/randiter
-
-AM_CXXFLAGS = @DEFAULT_CFLAGS@ -DDISABLE_COMMENTATOR $(GMP_CFLAGS) $(NTL_CFLAGS) $(ATLAS_CFLAGS) $(GIVARO_CFLAGS) $(FFLAS_FFPACK_CFLAGS)
+
+#AM_CPPFLAGS=-I$(top_srcdir)/linbox
+#AM_CXXFLAGS = @DEFAULT_CFLAGS@ -DDISABLE_COMMENTATOR $(GMP_CFLAGS) $(NTL_CFLAGS) $(ATLAS_CFLAGS)
BASIC_HDRS = \
abstract.h \
@@ -30,50 +32,28 @@ BASIC_HDRS = \
envelope.h \
gmp-rational.h \
param-fuzzy.h \
- modular.h \
modular-balanced.h \
modular-crooked.h \
- unparametric.h \
gf2.h \
- nonzero.h \
mersenne-twister.h \
- ntl-ZZ.h \
random-prime.h \
- random-integer.h \
gmp-random-prime.h \
random-fftprime.h \
- multimod-randomprime.h
-
-NTL_HDRS =
+ multimod-randomprime.h \
+ givaro-poly.h
-GIVARO_HDRS =
-
-LIDIA_HDRS = \
- lidia.h \
- lidia-gfq.h
+NTL_HDRS = ntl-zz.h
if LINBOX_HAVE_NTL
USE_NTL_HDRS = $(NTL_HDRS)
endif
-if LINBOX_HAVE_GIVARO
-USE_GIVARO_HDRS = $(GIVARO_HDRS)
-endif
-
-if LINBOX_HAVE_LIDIA
-USE_LIDIA_HDRS = $(LIDIA_HDRS)
-endif
-
pkgincludesub_HEADERS = \
$(BASIC_HDRS) \
- $(USE_NTL_HDRS) \
- $(USE_GIVARO_HDRS) \
- $(USE_LIDIA_HDRS)
+ $(USE_NTL_HDRS)
EXTRA_DIST = \
$(NTL_HDRS) \
- $(GIVARO_HDRS) \
- $(LIDIA_HDRS) \
randiter.doxy \
archetype.doxy \
randiter-wrappers.doxy
diff --git a/linbox/randiter/Makefile.in b/linbox/randiter/Makefile.in
deleted file mode 100644
index 3112567..0000000
--- a/linbox/randiter/Makefile.in
+++ /dev/null
@@ -1,672 +0,0 @@
-# Makefile.in generated by automake 1.11.5 from Makefile.am.
-# @configure_input@
-
-# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software
-# Foundation, Inc.
-# This Makefile.in is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
-# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
-# PARTICULAR PURPOSE.
-
- at SET_MAKE@
-
-# Copyright (c) 2010 the LinBox group
-# ========LICENCE========
-# This file is part of the library LinBox.
-#
-# LinBox is free software: you can redistribute it and/or modify
-# it under the terms of the GNU Lesser General Public
-# License as published by the Free Software Foundation; either
-# version 2.1 of the License, or (at your option) any later version.
-#
-# This library 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
-# Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public
-# License along with this library; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
-# ========LICENCE========
-
-
-VPATH = @srcdir@
-am__make_dryrun = \
- { \
- am__dry=no; \
- case $$MAKEFLAGS in \
- *\\[\ \ ]*) \
- echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \
- | grep '^AM OK$$' >/dev/null || am__dry=yes;; \
- *) \
- for am__flg in $$MAKEFLAGS; do \
- case $$am__flg in \
- *=*|--*) ;; \
- *n*) am__dry=yes; break;; \
- esac; \
- done;; \
- esac; \
- test $$am__dry = yes; \
- }
-pkgdatadir = $(datadir)/@PACKAGE@
-pkgincludedir = $(includedir)/@PACKAGE@
-pkglibdir = $(libdir)/@PACKAGE@
-pkglibexecdir = $(libexecdir)/@PACKAGE@
-am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
-install_sh_DATA = $(install_sh) -c -m 644
-install_sh_PROGRAM = $(install_sh) -c
-install_sh_SCRIPT = $(install_sh) -c
-INSTALL_HEADER = $(INSTALL_DATA)
-transform = $(program_transform_name)
-NORMAL_INSTALL = :
-PRE_INSTALL = :
-POST_INSTALL = :
-NORMAL_UNINSTALL = :
-PRE_UNINSTALL = :
-POST_UNINSTALL = :
-build_triplet = @build@
-host_triplet = @host@
-subdir = linbox/randiter
-DIST_COMMON = $(am__pkgincludesub_HEADERS_DIST) $(srcdir)/Makefile.am \
- $(srcdir)/Makefile.in
-ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-am__aclocal_m4_deps = $(top_srcdir)/macros/aclocal-include.m4 \
- $(top_srcdir)/macros/config-header.m4 \
- $(top_srcdir)/macros/debug.m4 \
- $(top_srcdir)/macros/expat-check.m4 \
- $(top_srcdir)/macros/fflas-ffpack-check.m4 \
- $(top_srcdir)/macros/fplll-check.m4 \
- $(top_srcdir)/macros/givaro-check.m4 \
- $(top_srcdir)/macros/gmp-check.m4 \
- $(top_srcdir)/macros/iml-check.m4 \
- $(top_srcdir)/macros/lapack-check.m4 \
- $(top_srcdir)/macros/libtool.m4 \
- $(top_srcdir)/macros/lidia-check.m4 \
- $(top_srcdir)/macros/linbox-benchmark.m4 \
- $(top_srcdir)/macros/linbox-doc.m4 \
- $(top_srcdir)/macros/linbox-misc.m4 \
- $(top_srcdir)/macros/linbox-opt.m4 \
- $(top_srcdir)/macros/ltoptions.m4 \
- $(top_srcdir)/macros/ltsugar.m4 \
- $(top_srcdir)/macros/ltversion.m4 \
- $(top_srcdir)/macros/lt~obsolete.m4 \
- $(top_srcdir)/macros/m4ri-check.m4 \
- $(top_srcdir)/macros/m4rie-check.m4 \
- $(top_srcdir)/macros/maple-check.m4 \
- $(top_srcdir)/macros/mpfr-check.m4 \
- $(top_srcdir)/macros/ntl-check.m4 \
- $(top_srcdir)/macros/saclib-check.m4 \
- $(top_srcdir)/macros/sage-check.m4 $(top_srcdir)/configure.ac
-am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
- $(ACLOCAL_M4)
-mkinstalldirs = $(install_sh) -d
-CONFIG_HEADER = $(top_builddir)/config.h
-CONFIG_CLEAN_FILES =
-CONFIG_CLEAN_VPATH_FILES =
-LTLIBRARIES = $(noinst_LTLIBRARIES)
-libranditer_la_LIBADD =
-am_libranditer_la_OBJECTS = mersenne-twister.lo
-libranditer_la_OBJECTS = $(am_libranditer_la_OBJECTS)
-DEFAULT_INCLUDES = -I. at am__isrc@ -I$(top_builddir)
-depcomp =
-am__depfiles_maybe =
-CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
- $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
-LTCXXCOMPILE = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
- --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
- $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
-CXXLD = $(CXX)
-CXXLINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
- --mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \
- $(LDFLAGS) -o $@
-SOURCES = $(libranditer_la_SOURCES)
-DIST_SOURCES = $(libranditer_la_SOURCES)
-am__can_run_installinfo = \
- case $$AM_UPDATE_INFO_DIR in \
- n|no|NO) false;; \
- *) (install-info --version) >/dev/null 2>&1;; \
- esac
-am__pkgincludesub_HEADERS_DIST = abstract.h archetype.h envelope.h \
- gmp-rational.h param-fuzzy.h modular.h modular-balanced.h \
- modular-crooked.h unparametric.h gf2.h nonzero.h \
- mersenne-twister.h ntl-ZZ.h random-prime.h random-integer.h \
- gmp-random-prime.h random-fftprime.h multimod-randomprime.h \
- lidia.h lidia-gfq.h
-am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
-am__vpath_adj = case $$p in \
- $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
- *) f=$$p;; \
- esac;
-am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
-am__install_max = 40
-am__nobase_strip_setup = \
- srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
-am__nobase_strip = \
- for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
-am__nobase_list = $(am__nobase_strip_setup); \
- for p in $$list; do echo "$$p $$p"; done | \
- sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
- $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
- if (++n[$$2] == $(am__install_max)) \
- { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
- END { for (dir in files) print dir, files[dir] }'
-am__base_list = \
- sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
- sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
-am__uninstall_files_from_dir = { \
- test -z "$$files" \
- || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \
- || { echo " ( cd '$$dir' && rm -f" $$files ")"; \
- $(am__cd) "$$dir" && rm -f $$files; }; \
- }
-am__installdirs = "$(DESTDIR)$(pkgincludesubdir)"
-HEADERS = $(pkgincludesub_HEADERS)
-ETAGS = etags
-CTAGS = ctags
-DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
-ACLOCAL = @ACLOCAL@
-AMTAR = @AMTAR@
-AR = @AR@
-AUTOCONF = @AUTOCONF@
-AUTOHEADER = @AUTOHEADER@
-AUTOMAKE = @AUTOMAKE@
-AWK = @AWK@
-BLAS_CFLAGS = @BLAS_CFLAGS@
-BLAS_LIBS = @BLAS_LIBS@
-CC = @CC@
-CCNAM = @CCNAM@
-CFLAGS = @CFLAGS@
-CPPFLAGS = @CPPFLAGS@
-CXX = @CXX@
-CXXCPP = @CXXCPP@
-CXXFLAGS = @CXXFLAGS@
-CYGPATH_W = @CYGPATH_W@
-DBG = @DBG@
-DEBUG_CFLAGS = @DEBUG_CFLAGS@
-DEFAULT_CFLAGS = @DEFAULT_CFLAGS@
-DEFS = @DEFS@
-DLLTOOL = @DLLTOOL@
-DSYMUTIL = @DSYMUTIL@
-DUMPBIN = @DUMPBIN@
-ECHO_C = @ECHO_C@
-ECHO_N = @ECHO_N@
-ECHO_T = @ECHO_T@
-EGREP = @EGREP@
-EXEEXT = @EXEEXT@
-EXPAT_CFLAGS = @EXPAT_CFLAGS@
-EXPAT_LIBS = @EXPAT_LIBS@
-FFLAS_FFPACK_CFLAGS = @FFLAS_FFPACK_CFLAGS@
-FFLAS_FFPACK_LIBS = @FFLAS_FFPACK_LIBS@
-FFLAS_FFPACK_LOC = @FFLAS_FFPACK_LOC@
-FGREP = @FGREP@
-FPLLL_CFLAGS = @FPLLL_CFLAGS@
-FPLLL_LIBS = @FPLLL_LIBS@
-GIVARO_CFLAGS = @GIVARO_CFLAGS@
-GIVARO_LIBS = @GIVARO_LIBS@
-GMP_CFLAGS = @GMP_CFLAGS@
-GMP_LIBS = @GMP_LIBS@
-GMP_VERSION = @GMP_VERSION@
-GREP = @GREP@
-IML_CFLAGS = @IML_CFLAGS@
-IML_LIBS = @IML_LIBS@
-INSTALL = @INSTALL@
-INSTALL_DATA = @INSTALL_DATA@
-INSTALL_PROGRAM = @INSTALL_PROGRAM@
-INSTALL_SCRIPT = @INSTALL_SCRIPT@
-INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
-LD = @LD@
-LDFLAGS = @LDFLAGS@
-LIBOBJS = @LIBOBJS@
-LIBS = @LIBS@
-LIBTOOL = @LIBTOOL@
-LIDIA_CFLAGS = @LIDIA_CFLAGS@
-LIDIA_LIBS = @LIDIA_LIBS@
-LINBOX_BENCH_PATH = @LINBOX_BENCH_PATH@
-LINBOX_DOC_PATH = @LINBOX_DOC_PATH@
-LIPO = @LIPO@
-LN_S = @LN_S@
-LTLIBOBJS = @LTLIBOBJS@
-M4RIE_CFLAGS = @M4RIE_CFLAGS@
-M4RIE_LIBS = @M4RIE_LIBS@
-M4RI_CFLAGS = @M4RI_CFLAGS@
-M4RI_LIBS = @M4RI_LIBS@
-MAINT = @MAINT@
-MAKEINFO = @MAKEINFO@
-MANIFEST_TOOL = @MANIFEST_TOOL@
-MAPLE_CFLAGS = @MAPLE_CFLAGS@
-MAPLE_HOME = @MAPLE_HOME@
-MAPLE_LIBS = @MAPLE_LIBS@
-MAPLE_VERSION = @MAPLE_VERSION@
-MKDIR_P = @MKDIR_P@
-MPFR_CFLAGS = @MPFR_CFLAGS@
-MPFR_LIBS = @MPFR_LIBS@
-NM = @NM@
-NMEDIT = @NMEDIT@
-NTL_CFLAGS = @NTL_CFLAGS@
-NTL_LIBS = @NTL_LIBS@
-OBJDUMP = @OBJDUMP@
-OBJEXT = @OBJEXT@
-OTOOL = @OTOOL@
-OTOOL64 = @OTOOL64@
-PACKAGE = @PACKAGE@
-PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
-PACKAGE_NAME = @PACKAGE_NAME@
-PACKAGE_STRING = @PACKAGE_STRING@
-PACKAGE_TARNAME = @PACKAGE_TARNAME@
-PACKAGE_URL = @PACKAGE_URL@
-PACKAGE_VERSION = @PACKAGE_VERSION@
-PATH_SEPARATOR = @PATH_SEPARATOR@
-PROF = @PROF@
-RANLIB = @RANLIB@
-RM = @RM@
-SACLIB_CFLAGS = @SACLIB_CFLAGS@
-SACLIB_LIBS = @SACLIB_LIBS@
-SED = @SED@
-SET_MAKE = @SET_MAKE@
-SHELL = @SHELL@
-STRIP = @STRIP@
-TESTS_CFLAGS = @TESTS_CFLAGS@
-VERSION = @VERSION@
-WARN = @WARN@
-abs_builddir = @abs_builddir@
-abs_srcdir = @abs_srcdir@
-abs_top_builddir = @abs_top_builddir@
-abs_top_srcdir = @abs_top_srcdir@
-ac_ct_AR = @ac_ct_AR@
-ac_ct_CC = @ac_ct_CC@
-ac_ct_CXX = @ac_ct_CXX@
-ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
-am__leading_dot = @am__leading_dot@
-am__tar = @am__tar@
-am__untar = @am__untar@
-bindir = @bindir@
-build = @build@
-build_alias = @build_alias@
-build_cpu = @build_cpu@
-build_os = @build_os@
-build_vendor = @build_vendor@
-builddir = @builddir@
-datadir = @datadir@
-datarootdir = @datarootdir@
-docdir = @docdir@
-dvidir = @dvidir@
-exec_prefix = @exec_prefix@
-host = @host@
-host_alias = @host_alias@
-host_cpu = @host_cpu@
-host_os = @host_os@
-host_vendor = @host_vendor@
-htmldir = @htmldir@
-includedir = @includedir@
-infodir = @infodir@
-install_sh = @install_sh@
-libdir = @libdir@
-libexecdir = @libexecdir@
-localedir = @localedir@
-localstatedir = @localstatedir@
-mandir = @mandir@
-mkdir_p = @mkdir_p@
-oldincludedir = @oldincludedir@
-pdfdir = @pdfdir@
-prefix = @prefix@
-program_transform_name = @program_transform_name@
-psdir = @psdir@
-sbindir = @sbindir@
-sharedstatedir = @sharedstatedir@
-srcdir = @srcdir@
-sysconfdir = @sysconfdir@
-target_alias = @target_alias@
-top_build_prefix = @top_build_prefix@
-top_builddir = @top_builddir@
-top_srcdir = @top_srcdir@
-AM_CPPFLAGS = -I$(top_srcdir)/linbox
-pkgincludesubdir = $(pkgincludedir)/randiter
-AM_CXXFLAGS = @DEFAULT_CFLAGS@ -DDISABLE_COMMENTATOR $(GMP_CFLAGS) $(NTL_CFLAGS) $(ATLAS_CFLAGS) $(GIVARO_CFLAGS) $(FFLAS_FFPACK_CFLAGS)
-BASIC_HDRS = \
- abstract.h \
- archetype.h \
- envelope.h \
- gmp-rational.h \
- param-fuzzy.h \
- modular.h \
- modular-balanced.h \
- modular-crooked.h \
- unparametric.h \
- gf2.h \
- nonzero.h \
- mersenne-twister.h \
- ntl-ZZ.h \
- random-prime.h \
- random-integer.h \
- gmp-random-prime.h \
- random-fftprime.h \
- multimod-randomprime.h
-
-NTL_HDRS =
-GIVARO_HDRS =
-LIDIA_HDRS = \
- lidia.h \
- lidia-gfq.h
-
- at LINBOX_HAVE_NTL_TRUE@USE_NTL_HDRS = $(NTL_HDRS)
- at LINBOX_HAVE_GIVARO_TRUE@USE_GIVARO_HDRS = $(GIVARO_HDRS)
- at LINBOX_HAVE_LIDIA_TRUE@USE_LIDIA_HDRS = $(LIDIA_HDRS)
-pkgincludesub_HEADERS = \
- $(BASIC_HDRS) \
- $(USE_NTL_HDRS) \
- $(USE_GIVARO_HDRS) \
- $(USE_LIDIA_HDRS)
-
-EXTRA_DIST = \
- $(NTL_HDRS) \
- $(GIVARO_HDRS) \
- $(LIDIA_HDRS) \
- randiter.doxy \
- archetype.doxy \
- randiter-wrappers.doxy
-
-noinst_LTLIBRARIES = libranditer.la
-libranditer_la_SOURCES = \
- mersenne-twister.C
-
-all: all-am
-
-.SUFFIXES:
-.SUFFIXES: .C .lo .o .obj
-$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps)
- @for dep in $?; do \
- case '$(am__configure_deps)' in \
- *$$dep*) \
- ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
- && { if test -f $@; then exit 0; else break; fi; }; \
- exit 1;; \
- esac; \
- done; \
- echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu --ignore-deps linbox/randiter/Makefile'; \
- $(am__cd) $(top_srcdir) && \
- $(AUTOMAKE) --gnu --ignore-deps linbox/randiter/Makefile
-.PRECIOUS: Makefile
-Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
- @case '$?' in \
- *config.status*) \
- cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
- *) \
- echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
- cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
- esac;
-
-$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
- cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-
-$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
- cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
- cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-$(am__aclocal_m4_deps):
-
-clean-noinstLTLIBRARIES:
- -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES)
- @list='$(noinst_LTLIBRARIES)'; for p in $$list; do \
- dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \
- test "$$dir" != "$$p" || dir=.; \
- echo "rm -f \"$${dir}/so_locations\""; \
- rm -f "$${dir}/so_locations"; \
- done
-libranditer.la: $(libranditer_la_OBJECTS) $(libranditer_la_DEPENDENCIES) $(EXTRA_libranditer_la_DEPENDENCIES)
- $(CXXLINK) $(libranditer_la_OBJECTS) $(libranditer_la_LIBADD) $(LIBS)
-
-mostlyclean-compile:
- -rm -f *.$(OBJEXT)
-
-distclean-compile:
- -rm -f *.tab.c
-
-.C.o:
- $(CXXCOMPILE) -c -o $@ $<
-
-.C.obj:
- $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
-
-.C.lo:
- $(LTCXXCOMPILE) -c -o $@ $<
-
-mostlyclean-libtool:
- -rm -f *.lo
-
-clean-libtool:
- -rm -rf .libs _libs
-install-pkgincludesubHEADERS: $(pkgincludesub_HEADERS)
- @$(NORMAL_INSTALL)
- @list='$(pkgincludesub_HEADERS)'; test -n "$(pkgincludesubdir)" || list=; \
- if test -n "$$list"; then \
- echo " $(MKDIR_P) '$(DESTDIR)$(pkgincludesubdir)'"; \
- $(MKDIR_P) "$(DESTDIR)$(pkgincludesubdir)" || exit 1; \
- fi; \
- for p in $$list; do \
- if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
- echo "$$d$$p"; \
- done | $(am__base_list) | \
- while read files; do \
- echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(pkgincludesubdir)'"; \
- $(INSTALL_HEADER) $$files "$(DESTDIR)$(pkgincludesubdir)" || exit $$?; \
- done
-
-uninstall-pkgincludesubHEADERS:
- @$(NORMAL_UNINSTALL)
- @list='$(pkgincludesub_HEADERS)'; test -n "$(pkgincludesubdir)" || list=; \
- files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
- dir='$(DESTDIR)$(pkgincludesubdir)'; $(am__uninstall_files_from_dir)
-
-ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
- list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
- unique=`for i in $$list; do \
- if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
- done | \
- $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
- END { if (nonempty) { for (i in files) print i; }; }'`; \
- mkid -fID $$unique
-tags: TAGS
-
-TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
- $(TAGS_FILES) $(LISP)
- set x; \
- here=`pwd`; \
- list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
- unique=`for i in $$list; do \
- if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
- done | \
- $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
- END { if (nonempty) { for (i in files) print i; }; }'`; \
- shift; \
- if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
- test -n "$$unique" || unique=$$empty_fix; \
- if test $$# -gt 0; then \
- $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
- "$$@" $$unique; \
- else \
- $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
- $$unique; \
- fi; \
- fi
-ctags: CTAGS
-CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
- $(TAGS_FILES) $(LISP)
- list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
- unique=`for i in $$list; do \
- if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
- done | \
- $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
- END { if (nonempty) { for (i in files) print i; }; }'`; \
- test -z "$(CTAGS_ARGS)$$unique" \
- || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
- $$unique
-
-GTAGS:
- here=`$(am__cd) $(top_builddir) && pwd` \
- && $(am__cd) $(top_srcdir) \
- && gtags -i $(GTAGS_ARGS) "$$here"
-
-distclean-tags:
- -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
-
-distdir: $(DISTFILES)
- @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
- topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
- list='$(DISTFILES)'; \
- dist_files=`for file in $$list; do echo $$file; done | \
- sed -e "s|^$$srcdirstrip/||;t" \
- -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
- case $$dist_files in \
- */*) $(MKDIR_P) `echo "$$dist_files" | \
- sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
- sort -u` ;; \
- esac; \
- for file in $$dist_files; do \
- if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
- if test -d $$d/$$file; then \
- dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
- if test -d "$(distdir)/$$file"; then \
- find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
- fi; \
- if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
- cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
- find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
- fi; \
- cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
- else \
- test -f "$(distdir)/$$file" \
- || cp -p $$d/$$file "$(distdir)/$$file" \
- || exit 1; \
- fi; \
- done
-check-am: all-am
-check: check-am
-all-am: Makefile $(LTLIBRARIES) $(HEADERS)
-installdirs:
- for dir in "$(DESTDIR)$(pkgincludesubdir)"; do \
- test -z "$$dir" || $(MKDIR_P) "$$dir"; \
- done
-install: install-am
-install-exec: install-exec-am
-install-data: install-data-am
-uninstall: uninstall-am
-
-install-am: all-am
- @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
-
-installcheck: installcheck-am
-install-strip:
- if test -z '$(STRIP)'; then \
- $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
- install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
- install; \
- else \
- $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
- install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
- "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
- fi
-mostlyclean-generic:
-
-clean-generic:
-
-distclean-generic:
- -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
- -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
-
-maintainer-clean-generic:
- @echo "This command is intended for maintainers to use"
- @echo "it deletes files that may require special tools to rebuild."
-clean: clean-am
-
-clean-am: clean-generic clean-libtool clean-noinstLTLIBRARIES \
- mostlyclean-am
-
-distclean: distclean-am
- -rm -f Makefile
-distclean-am: clean-am distclean-compile distclean-generic \
- distclean-tags
-
-dvi: dvi-am
-
-dvi-am:
-
-html: html-am
-
-html-am:
-
-info: info-am
-
-info-am:
-
-install-data-am: install-pkgincludesubHEADERS
-
-install-dvi: install-dvi-am
-
-install-dvi-am:
-
-install-exec-am:
-
-install-html: install-html-am
-
-install-html-am:
-
-install-info: install-info-am
-
-install-info-am:
-
-install-man:
-
-install-pdf: install-pdf-am
-
-install-pdf-am:
-
-install-ps: install-ps-am
-
-install-ps-am:
-
-installcheck-am:
-
-maintainer-clean: maintainer-clean-am
- -rm -f Makefile
-maintainer-clean-am: distclean-am maintainer-clean-generic
-
-mostlyclean: mostlyclean-am
-
-mostlyclean-am: mostlyclean-compile mostlyclean-generic \
- mostlyclean-libtool
-
-pdf: pdf-am
-
-pdf-am:
-
-ps: ps-am
-
-ps-am:
-
-uninstall-am: uninstall-pkgincludesubHEADERS
-
-.MAKE: install-am install-strip
-
-.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \
- clean-libtool clean-noinstLTLIBRARIES ctags distclean \
- distclean-compile distclean-generic distclean-libtool \
- distclean-tags distdir dvi dvi-am html html-am info info-am \
- install install-am install-data install-data-am install-dvi \
- install-dvi-am install-exec install-exec-am install-html \
- install-html-am install-info install-info-am install-man \
- install-pdf install-pdf-am install-pkgincludesubHEADERS \
- install-ps install-ps-am install-strip installcheck \
- installcheck-am installdirs maintainer-clean \
- maintainer-clean-generic mostlyclean mostlyclean-compile \
- mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
- tags uninstall uninstall-am uninstall-pkgincludesubHEADERS
-
-
-# Tell versions [3.59,3.63) of GNU make to not export all variables.
-# Otherwise a system limit (for SysV at least) may be exceeded.
-.NOEXPORT:
diff --git a/linbox/randiter/abstract.h b/linbox/randiter/abstract.h
old mode 100644
new mode 100755
index 7efc851..cb2176d
--- a/linbox/randiter/abstract.h
+++ b/linbox/randiter/abstract.h
@@ -96,7 +96,7 @@ namespace LinBox
* Purely virtual.
* @return reference to ElementAbstract object
*/
- virtual Element &random (Element &a) const = 0;
+ virtual Element &random (Element &a) = 0;
protected:
diff --git a/linbox/randiter/archetype.h b/linbox/randiter/archetype.h
index e5a7e17..ea138eb 100644
--- a/linbox/randiter/archetype.h
+++ b/linbox/randiter/archetype.h
@@ -90,7 +90,7 @@ namespace LinBox
RandIterArchetype (const FieldArchetype &F,
const integer &size = 0,
const integer &seed = 0)
- { _randIter_ptr = F._randIter_ptr->construct (*F._field_ptr, size, seed); }
+ {_randIter_ptr = F._randIter_ptr->construct (*(F._field_ptr), size, seed);}
/** Copy constructor.
* Constructs RandIterArchetype object by copying the random field
diff --git a/linbox/randiter/envelope.h b/linbox/randiter/envelope.h
index 5e2441f..ab2590f 100644
--- a/linbox/randiter/envelope.h
+++ b/linbox/randiter/envelope.h
@@ -70,7 +70,7 @@ namespace LinBox
RandIterEnvelope (const FieldEnvelope<Field> &F,
const integer &size = 0,
const integer &seed = 0) :
- _randIter (F._field, size, seed)
+ _randIter (F._field, seed)
{}
/** Constructor from random field element generator to be wrapped
@@ -129,7 +129,7 @@ namespace LinBox
const integer &size = 0,
const integer &seed = 0) const
{
- return new RandIterEnvelope (static_cast<const FieldEnvelope<Field>&> (F)._field, size, seed);
+ return new RandIterEnvelope (static_cast<const FieldEnvelope<Field>&> (F), size, seed);
}
/** Virtual copy constructor.
@@ -147,7 +147,7 @@ namespace LinBox
* Required by abstract base class.
* @return reference to random field element
*/
- ElementAbstract &random (ElementAbstract &a) const
+ ElementAbstract &random (ElementAbstract &a)
//{ return _randIter.random (a); }
// GV Thu Apr 18 14:46:46 MEST 2002
// modify by P.G. 2004-07-16
diff --git a/linbox/randiter/generic.h b/linbox/randiter/generic.h
new file mode 100644
index 0000000..84a311b
--- /dev/null
+++ b/linbox/randiter/generic.h
@@ -0,0 +1,179 @@
+/* linbox/randiter/generic.h
+ * 2004 june, bds and Dan Roche starting from:
+ * Copyright (C) 1999-2001 William J Turner,
+ * 2002 Bradford Hovinen
+ *
+ * Written by William J Turner <wjturner at math.ncsu.edu>,
+ * Bradford Hovinen <hovinen at cis.udel.edu>
+ *
+ * ------------------------------------
+ * 2002-04-10 Bradford Hovinen <hovinen at cis.udel.edu>
+ *
+ * Changed LargeModularRandIter to ModularRandIter, parameterized on the
+ * element type. This change is for compatibility with the changes in
+ * field/modular.h
+ *
+ * Renamed from large-modular.h to modular.h
+ * ------------------------------------
+ * 2002-05-14 William J. Turner <wjturner at acm.org>
+ *
+ * Seeded random number generator in constructor. _seed was never used
+ * before.
+ * ------------------------------------
+ *
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ * ========LICENCE========
+ *.
+ */
+
+/*! @file randiter/generic.h
+ * @ingroup randiter
+ * @brief Genric random iterator.
+ */
+//#error "deprecated and not tested"
+
+#ifndef __LINBOX_generic_randiter_H
+#define __LINBOX_generic_randiter_H
+
+#include <iostream>
+#include <vector>
+
+#include "time.h"
+#include "linbox/integer.h"
+#include "linbox/element/abstract.h"
+#include "linbox/element/envelope.h"
+#include "linbox/util/commentator.h"
+#include "linbox/randiter/mersenne-twister.h"
+#include "linbox/linbox-config.h"
+
+namespace LinBox
+{
+
+ /** Random field base element generator.
+ * This is a generator of random field elements that can be used with
+ * any field. It initializes elements using rand(). For prime fields
+ * with p < 2^32, a near-uniform distrubution can be expected. For
+ * larger fields or non-prime fields, a near-uniform distribution on an
+ * unspecified subset of the elements can be expected.
+ */
+ template <class Field>
+ class GenericRandIter {
+ public:
+
+ typedef typename Field::Element Element;
+
+ /** Constructor from field, sampling size, and seed.
+ * The random field element iterator works in the field F, is seeded
+ * by seed, and it returns any one element with probability no more
+ * than <code>1/min (size, F.characteristic(c))</code>.
+ * A sampling size of zero means to sample from the entire prime subfield.
+ * A seed of zero means to use some arbitrary seed for the generator which will vary from run to run.
+ * @param F LinBox field in which to do arithmetic
+ * @param size constant integer reference of sample size from which to
+ * sample (default = modulus of field)
+ * @param seed constant integer reference from which to seed random number
+ * generator (default = 0)
+ */
+ GenericRandIter (const Field &F,
+ const integer &size = 0,
+ const integer &seed = 0) :
+ _field (F), _size (size), _seed (seed)
+ {
+ if (_seed == 0) _seed = time (NULL);
+
+ integer cardinality;
+
+ F.cardinality (cardinality);
+
+ if ((_size == 0) || (_size > cardinality))
+ _size = cardinality;
+
+ linbox_check(cardinality>0); // could be -1
+
+ commentator().report (10, INTERNAL_DESCRIPTION)
+ << "Created random generator with size " << _size
+ << " and seed " << _seed << std::endl;
+
+ // Seed random number generator
+ srand (_seed);
+ }
+
+ GenericRandIter (const GenericRandIter<Field> &R) :
+ _field (R._field), _size (R._size), _seed (R._seed)
+ {}
+
+ ~GenericRandIter () {}
+
+ GenericRandIter<Field> &operator=(const GenericRandIter<Field> &R)
+ {
+ if (this != &R) { // guard against self-assignment
+ _size = R._size;
+ _seed = R._seed;
+ }
+
+ return *this;
+ }
+
+ /** Random field element creator.
+ * This returns a random field element from the information supplied
+ * at the creation of the generator.
+ * Required by abstract base class.
+ * @return reference to random field element
+ */
+ Element &random (Element &a) const
+ { return _field.init(a,rand()); }
+
+ /** Random field element creator.
+ * This returns a random field element from the information supplied
+ * at the creation of the generator.
+ * Required by abstract base class.
+ * @return reference to random field element
+ */
+ ElementAbstract &random (ElementAbstract &a) const
+ {
+ Element tmp;
+
+ random (tmp);
+ return (a = ElementEnvelope <Field> (tmp));
+ }
+
+ private:
+
+ /// Field in which arithmetic is done
+ Field _field;
+
+ /// Sampling size
+ integer _size;
+
+ /// Seed
+ long _seed;
+
+ }; // class GenericRandIter
+}
+#endif //__LINBOX_generic_randiter_H
+
+
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+
diff --git a/linbox/randiter/gf2.h b/linbox/randiter/gf2.h
index a4d9568..c4e44f7 100644
--- a/linbox/randiter/gf2.h
+++ b/linbox/randiter/gf2.h
@@ -66,9 +66,9 @@ namespace LinBox
const integer &size = 0 ,
const integer &seed = 0)
{
- long _seed = seed;
+ int32_t _seed = seed;
- if (_seed == 0) _seed = time (NULL);
+ if (_seed == 0) _seed = (int32_t)time (NULL);
MT.setSeed ((uint32_t)_seed);
}
diff --git a/linbox/randiter/givaro-poly.h b/linbox/randiter/givaro-poly.h
new file mode 100644
index 0000000..48308c8
--- /dev/null
+++ b/linbox/randiter/givaro-poly.h
@@ -0,0 +1,75 @@
+
+/* randiter/givaro-poly.h
+ * Copyright (C) 2014 Gavin Harrison,
+ *
+ * Written by Gavin Harrison <gmh33 at drexel.edu>,
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ * ========LICENCE========
+ *.
+ */
+
+#include <givaro/givpoly1.h>
+#include <givaro/givranditer.h>
+
+#ifndef __LINBOX_randiter_givaro_poly_H
+#define __LINBOX_randiter_givaro_poly_H
+
+namespace LinBox
+{
+ template<class Field>
+ class GivaroPolyRandIter {
+ typedef typename Field::Domain_t Domain;
+ typedef typename Domain::Domain_t SubDomain;
+
+ Field _pd;
+ Givaro::GIV_randIter<SubDomain,integer> _randIter;
+
+ integer _size;
+ integer _seed;
+ public:
+ typedef typename Field::Element Element;
+
+ GivaroPolyRandIter(Field pd,
+ const integer& size = 0,
+ const integer& seed = 0) :
+ _randIter(Givaro::GIV_randIter<SubDomain,integer>(pd.subdomain(), size, seed))
+ {_pd = pd;}
+
+ GivaroPolyRandIter(const GivaroPolyRandIter &R)
+ : _pd(R._pd), _randIter(R._randIter), _size(R._size), _seed(R._seed) {}
+
+ GivaroPolyRandIter &operator=(const GivaroPolyRandIter &R) {
+ return *this;
+ }
+
+ Element &random(Element &a) {
+ return _pd.domain().random(_randIter, a);
+ }
+
+ Element &random(Element &a, Givaro::Degree d) {
+ return _pd.domain().random(_randIter, a, d);
+ }
+
+ Element &random(Element &a, long s) const {
+ return _pd.domain().random(_randIter, a, s);
+ }
+ };
+}
+
+#endif // __LINBOX_randiter_givaro_poly_H
diff --git a/linbox/randiter/gmp-rational.h b/linbox/randiter/gmp-rational.h
index b854f9e..8eb02ce 100644
--- a/linbox/randiter/gmp-rational.h
+++ b/linbox/randiter/gmp-rational.h
@@ -64,7 +64,7 @@ namespace LinBox
_field (F), _size (size), _seed (seed)
{
if (seed == 0)
- _seed = time (NULL);
+ _seed = uint32_t(time (NULL));
}
@@ -98,18 +98,19 @@ namespace LinBox
*/
Element &random (Element &a) const
{
- int value = 0;
if (_size == 0) {
- unsigned int s;
+ unsigned int s;
s = _seed;
- value = rand_r (&s);
+ //(rand_r is obsolete)
+ srand (s);
+ int value = rand();
mpz_set_si (mpq_numref (a.rep), value);
do {
- value = rand_r (&s);
+ value = rand();
} while (value == 0);
const_cast<integer&>(_seed) = s;
@@ -120,7 +121,8 @@ namespace LinBox
int num, den;
s = _seed;
- num = rand_r (&s);
+ srand (s);
+ num = rand();
if (_size > 0) {
int tmp = (int)_size;
@@ -128,7 +130,8 @@ namespace LinBox
den = 1L;
}
else {
- den = rand_r (&s);
+ srand (s);
+ den = rand();
}
const_cast<integer&>(_seed) = s;
@@ -156,6 +159,10 @@ namespace LinBox
random (tmp);
return (a = ElementEnvelope <GMPRationalField> (tmp));
}
+
+ const GMPRationalField& ring() const { return _field; }
+
+
private:
@@ -170,11 +177,10 @@ namespace LinBox
#endif // __LINBOX_randiter_gmp_random_H
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
// Local Variables:
// mode: C++
// tab-width: 8
// indent-tabs-mode: nil
// c-basic-offset: 8
// End:
-
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/randiter/mersenne-twister.h b/linbox/randiter/mersenne-twister.h
index 8932fc0..4687176 100644
--- a/linbox/randiter/mersenne-twister.h
+++ b/linbox/randiter/mersenne-twister.h
@@ -42,7 +42,17 @@
#include <vector>
-#include "linbox/integer.h"
+#ifdef __LINBOX_HAVE_STDINT_H
+#ifndef __STDC_LIMIT_MACROS
+#define __STDC_LIMIT_MACROS
+// else ??
+#endif
+#include <stdint.h>
+#ifndef INT32_MAX
+#error "INT32_MAX is not defined. It should at least be defined in Givaro..."
+#endif
+#endif
+
namespace LinBox
{
@@ -83,7 +93,7 @@ namespace LinBox
}
-#ifdef LinBoxSrcOnly
+#if defined(LinBoxSrcOnly) or defined(LinBoxTestOnly)
#include "linbox/randiter/mersenne-twister.C"
#endif
#endif // __LINBOX_mersenne_twister_H
diff --git a/linbox/randiter/modular-balanced.h b/linbox/randiter/modular-balanced.h
index 9b2a1f0..860ea3b 100644
--- a/linbox/randiter/modular-balanced.h
+++ b/linbox/randiter/modular-balanced.h
@@ -63,8 +63,9 @@
namespace LinBox
{
- template <class Element>
- class ModularBalanced;
+#if 0
+ template <class Element>
+ class Givaro::ModularBalanced<Element>;
/** Random field base element generator.
* This encapsulated class is a generator of random field base elements for
@@ -79,7 +80,7 @@ namespace LinBox
* and also returned as a reference.
*/
template <class Element>
- class ModularBalancedRandIter {
+ class Givaro::ModularBalancedRandIter {
public:
/** Constructor from field, sampling size, and seed.
@@ -95,7 +96,7 @@ namespace LinBox
* @param seed constant integer reference from which to seed random number
* generator (default = 0)
*/
- ModularBalancedRandIter (const ModularBalanced<Element> &F,
+ Givaro::ModularBalancedRandIter (const Givaro::ModularBalanced<Element> &F,
const integer &size = 0,
const integer &seed = 0) :
_field (F), _size (size), _seed (seed)
@@ -118,30 +119,31 @@ namespace LinBox
}
/** Copy constructor.
- * Constructs ModularBalancedRandIter object by copying the random field
+ * Constructs Givaro::ModularBalancedRandIter object by copying the random field
* element generator.
* This is required to allow generator objects to be passed by value
* into functions.
- * @param R ModularBalancedRandIter object.
+ * @param R Givaro::ModularBalancedRandIter object.
*/
- ModularBalancedRandIter (const ModularBalancedRandIter<Element> &R) :
+ Givaro::ModularBalancedRandIter (const Givaro::ModularBalancedRandIter<Element> &R) :
_field (R._field), _size (R._size), _seed (R._seed)
{}
/** Destructor.
* This destructs the random field element generator object.
*/
- ~ModularBalancedRandIter () {}
+ ~Givaro::ModularBalancedRandIter () {}
/** Assignment operator.
- * Assigns ModularBalancedRandIter object R to generator.
- * @param R ModularBalancedRandIter object.
+ * Assigns Givaro::ModularBalancedRandIter object R to generator.
+ * @param R Givaro::ModularBalancedRandIter object.
*/
- ModularBalancedRandIter<Element> &operator=(const ModularBalancedRandIter<Element> &R)
+ Givaro::ModularBalancedRandIter<Element> &operator=(const Givaro::ModularBalancedRandIter<Element> &R)
{
if (this != &R) { // guard against self-assignment
_size = R._size;
_seed = R._seed;
+ _field = R._field;
}
return *this;
@@ -168,12 +170,12 @@ namespace LinBox
Element tmp;
random (tmp);
- return (a = ElementEnvelope <ModularBalanced<Element> > (tmp));
+ return (a = ElementEnvelope <Givaro::ModularBalanced<Element> > (tmp));
}
private:
/// Field in which arithmetic is done
- ModularBalanced<Element> _field;
+ Givaro::ModularBalanced<Element> _field;
/// Sampling size
integer _size;
@@ -181,8 +183,8 @@ namespace LinBox
/// Seed
long _seed;
- }; // class ModularBalancedRandIter
-
+ }; // class Givaro::ModularBalancedRandIter
+#endif
} // namespace LinBox
#endif //__LINBOX_randiter_modular_balanced_H
diff --git a/linbox/randiter/modular-crooked.h b/linbox/randiter/modular-crooked.h
index 65f861d..bc06bf2 100644
--- a/linbox/randiter/modular-crooked.h
+++ b/linbox/randiter/modular-crooked.h
@@ -3,7 +3,7 @@
* Copyright (C) 2010 LinBox
*
* Adapted from randiter/modular-dense.h
- * by Brice Boyer <brice.boyer at imag.fr>
+ * by Brice Boyer (briceboyer) <boyer.brice at gmail.com>
*
*
* ========LICENCE========
@@ -122,6 +122,7 @@ namespace LinBox
if (this != &R) { // guard against self-assignment
_size = R._size;
_seed = R._seed;
+ _field = R._field;
}
return *this;
diff --git a/linbox/randiter/modular.h b/linbox/randiter/modular.h
deleted file mode 100644
index 2f67e47..0000000
--- a/linbox/randiter/modular.h
+++ /dev/null
@@ -1,393 +0,0 @@
-/* linbox/randiter/modular.h
- * Copyright (C) 1999-2005 William J Turner,
- * 2002 Bradford Hovinen
- *
- * Written by William J Turner <wjturner at acm.org>,
- * Bradford Hovinen <hovinen at cis.udel.edu>
- *
- * ------------------------------------
- * 2002-04-10 Bradford Hovinen <hovinen at cis.udel.edu>
- *
- * Changed LargeModularRandIter to ModularRandIter, parameterized on the
- * element type. This change is for compatibility with the changes in
- * field/modular.h
- *
- * Renamed from large-modular.h to modular.h
- * ------------------------------------
- * 2002-05-14 William J. Turner <wjturner at acm.org>
- *
- * Seeded random number generator in constructor. _seed was never used
- * before.
- * ------------------------------------
- * 2005-06-24 William J. Turner <wjturner at acm.org>
- *
- * Removed using declarations.
- * ------------------------------------
- *
- *
- * ========LICENCE========
- * This file is part of the library LinBox.
- *
- * LinBox is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- * ========LICENCE========
- *.
- */
-
-#ifndef __LINBOX_randiter_modular_H
-#define __LINBOX_randiter_modular_H
-
-#include <iostream>
-#include <vector>
-#include <cstdlib>
-
-#include "time.h"
-#include "linbox/integer.h"
-#include "linbox/field/modular.h"
-#include "linbox/element/abstract.h"
-#include "linbox/element/envelope.h"
-#include "linbox/util/commentator.h"
-#include "linbox/randiter/mersenne-twister.h"
-#include "linbox/linbox-config.h"
-
-namespace LinBox
-{
-
- /** Random field base element generator.
- * This encapsulated class is a generator of random field base elements for
- * the encapsulating field.
- * It is required to contain constructors from a field object and
- * two integers. The first integer being a cardinality of a set to
- * draw the random elements from, and the second being a seed for the
- * random number generator.
- * It is also required to contain a copy constructor, a destructor, and
- * an operator () which acts on a reference to a field base element. In this
- * operator (), the random element is placed into the input field base element
- * and also returned as a reference.
- */
- template <class Element>
- class ModularRandIter {
- public:
-
- /** Constructor from field, sampling size, and seed.
- * The random field element iterator works in the field F, is seeded
- * by seed, and it returns any one element with probability no more
- * than <code>1/min (size, F.cardinality (c))</code>.
- * A sampling size of zero means to sample from the entire field.
- * A seed of zero means to use some arbitrary seed for the generator.
- * Purely virtual.
- * @param F LinBox field archetype object in which to do arithmetic
- * @param size constant integer reference of sample size from which to
- * sample (default = modulus of field)
- * @param seed constant integer reference from which to seed random number
- * generator (default is 0 and new seed is generated)
- */
- ModularRandIter (const Modular<Element> &F,
- const integer &size = 0,
- const integer &seed = 0) :
- _field (F), _size (size), _seed (seed)
- {
- if (_seed == 0) _seed = time (NULL);
-
- integer cardinality;
-
- F.cardinality (cardinality);
-
- if ((_size == 0) || (_size > cardinality))
- _size = cardinality;
-
- /*commentator().report (10, INTERNAL_DESCRIPTION)
- << "Created random generator with size " << _size
- << " and seed " << _seed << std::endl;
- */
-
- // Seed random number generator
- srandom ((unsigned)_seed);
- }
-
- /** Copy constructor.
- * Constructs ModularRandIter object by copying the random field
- * element generator.
- * This is required to allow generator objects to be passed by value
- * into functions.
- * @param R ModularRandIter object.
- */
- ModularRandIter (const ModularRandIter<Element> &R) :
- _field (R._field), _size (R._size), _seed (R._seed)
- {}
-
- /** Destructor.
- * This destructs the random field element generator object.
- */
- ~ModularRandIter () {}
-
- /** Assignment operator.
- * Assigns ModularRandIter object R to generator.
- * @param R ModularRandIter object.
- */
- ModularRandIter<Element> &operator=(const ModularRandIter<Element> &R)
- {
- if (this != &R) { // guard against self-assignment
- _size = R._size;
- _seed = R._seed;
- }
-
- return *this;
- }
-
- /** Random field element creator.
- * This returns a random field element from the information supplied
- * at the creation of the generator.
- * Required by abstract base class.
- * @return reference to random field element
- */
- Element &random (Element &a) const
- {
- return _field.init(a, ::random()); // need init from long int
- }
-
- /** Random field element creator.
- * This returns a random field element from the information supplied
- * at the creation of the generator.
- * Required by abstract base class.
- * @return reference to random field element
- */
- Element &nonzerorandom (Element &a) const
- {
- //return a = random() % (_field.modulus -1) + 1;
-
- // CPernet: stupidly slow, but now way to get _field.modulus without changing the interface
- while (_field.isZero (random(a))) ;
- return a;
- }
-
- /** Random field element creator.
- * This returns a random field element from the information supplied
- * at the creation of the generator.
- * Required by abstract base class.
- * @return reference to random field element
- */
- ElementAbstract &random (ElementAbstract &a) const
- {
- Element tmp;
-
- random (tmp);
- return (a = ElementEnvelope <Modular<Element> > (tmp));
- }
-
- private:
-
- /// Field in which arithmetic is done
- Modular<Element> _field;
-
- /// Sampling size
- integer _size;
-
- /// Seed
- long _seed;
-
- }; // class ModularRandIter
-
- template <class Element>
- class ModularBase<Element>::RandIter {
- ModularRandIter<Element> _r;
-
- public:
- RandIter (const Modular<Element> &F, const integer &size = 0, const integer &seed = 0) :
- _r (F, size, seed)
- {}
- RandIter (const ModularBase<Element>::RandIter &r) :
- _r (r._r)
- {}
-
- ~RandIter () {}
- RandIter &operator= (const RandIter &r)
- {
- _r = r._r;
- return *this;
- }
- Element &random (Element &a) const
- {
- return _r.random (a);
- }
- ElementAbstract &random (ElementAbstract &a) const
- {
- return _r.random (a);
- }
-
- };
-
- template <>
- class ModularBase<uint16_t>::RandIter {
- MersenneTwister _r;
- uint16_t _size;
- time_t _seed;
-
- public:
- typedef uint16_t Element;
-
- RandIter (const Modular<Element> &F, const integer &size = 0, const integer &seed = 0)
- {
- _seed = seed;
- _size = size;
-
- if (_seed == 0) _seed = time (NULL);
-
- integer c;
-
- F.cardinality (c);
-
- linbox_check (c != -1);
-
- if ((_size == 0) || (_size > double (c)))
- _size = c;
-
- _r.setSeed ((uint32_t)_seed);
- }
-
- RandIter (const ModularBase<Element>::RandIter &r) :
- _r (r._r), _size (r._size), _seed (r._seed)
- {}
-
- ~RandIter () {}
- RandIter &operator= (const RandIter &r)
- {
- _r = r._r;
- return *this;
- }
- Element &random (Element &a) const
- {
- return a = (Element)_r.randomIntRange (0, _size);
- }
- ElementAbstract &random (ElementAbstract &a) const
- {
- return a = ElementEnvelope <Modular<Element> >
- ((Element)_r.randomIntRange (0, _size));
- }
-
- };
-
- template <>
- class ModularBase<uint32_t>::RandIter {
- MersenneTwister _r;
- uint32_t _size;
- time_t _seed;
-
- public:
- typedef uint32_t Element;
-
- RandIter (const Modular<Element> &F, const integer &size = 0, const integer &seed = 0)
- {
- _seed = seed;
- _size = size;
-
- if (_seed == 0) _seed = time (NULL);
-
- integer c;
-
- F.cardinality (c);
-
- linbox_check (c != -1);
-
- if ((_size == 0) || (_size > double (c)))
- _size = c;
-
- _r.setSeed ((uint32_t)_seed);
- }
-
- RandIter (const ModularBase<Element>::RandIter &r) :
- _r (r._r), _size (r._size), _seed (r._seed)
- {}
-
- ~RandIter () {}
- RandIter &operator= (const RandIter &r)
- {
- _r = r._r;
- return *this;
- }
- Element &random (Element &a) const
- {
- return a = _r.randomIntRange (0, _size);
- }
- ElementAbstract &random (ElementAbstract &a) const
- {
- return a = ElementEnvelope <Modular<Element> >
- (_r.randomIntRange (0, _size));
- }
-
- };
-
- template <>
- class ModularBase<uint64_t>::RandIter {
- MersenneTwister _r;
- uint64_t _size;
- time_t _seed;
-
- public:
- typedef uint64_t Element;
-
- RandIter (const Modular<Element> &F, const integer &size = 0, const integer &seed = 0)
- {
- _seed = seed;
- _size = size;
-
- if (_seed == 0) _seed = time (NULL);
-
- integer c;
-
- F.cardinality (c);
-
- linbox_check (c != -1);
-
- if ((_size == 0) || (_size > double (c)))
- _size = c;
-
- _r.setSeed ((uint32_t)_seed);
- }
-
- RandIter (const ModularBase<Element>::RandIter &r) :
- _r (r._r), _size (r._size), _seed (r._seed)
- {}
-
- ~RandIter () {}
- RandIter &operator= (const RandIter &r)
- {
- _r = r._r;
- return *this;
- }
- Element &random (Element &a) const
- {
- return a = (Element)_r.randomIntRange (0, (uint32_t)_size);
- }
- ElementAbstract &random (ElementAbstract &a) const
- {
- return a = ElementEnvelope <Modular<Element> >
- ((Element)_r.randomIntRange (0, (uint32_t)_size));
- }
-
- };
-
-}// namespace LinBox
-
-#endif // __LINBOX_randiter_modular_H
-
-
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
-// Local Variables:
-// mode: C++
-// tab-width: 8
-// indent-tabs-mode: nil
-// c-basic-offset: 8
-// End:
-
diff --git a/linbox/randiter/multimod-randomprime.h b/linbox/randiter/multimod-randomprime.h
index 62cb6b1..af17ffb 100644
--- a/linbox/randiter/multimod-randomprime.h
+++ b/linbox/randiter/multimod-randomprime.h
@@ -5,20 +5,20 @@
*
* ------------------------------------
*
- *
+ *
* ========LICENCE========
* This file is part of the library LinBox.
- *
+ *
* LinBox is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
- *
+ *
* This library 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
* Lesser General Public License for more details.
- *
+ *
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
@@ -40,22 +40,22 @@ namespace LinBox
class MultiModRandomPrime {
protected:
- size_t _bits;
+ uint64_t _bits;
size_t _size;
integer _shift;
public:
- MultiModRandomPrime(size_t n=1, size_t bits = 30, unsigned long seed = 0) :
+ MultiModRandomPrime(size_t n=1, uint64_t bits = 30, unsigned long seed = 0) :
_bits(bits), _size(n)
{
_shift = integer(1)<<_bits;
if (! seed)
- MultiModRandomPrime::setSeed( (unsigned long) BaseTimer::seed() );
+ setSeed( (unsigned long) BaseTimer::seed() );
else
- MultiModRandomPrime::setSeed( seed );
+ setSeed( seed );
}
// define the prime type
@@ -68,12 +68,13 @@ namespace LinBox
{
std::cout<<"ist used\n";
std::vector<integer> tmp(_size);
+ Givaro::IntPrimeDom IPD;
for (size_t i=0;i<_size; ++i){
do {
integer::random(tmp[i],_bits-1);
tmp[i]= _shift-tmp[i];
- nextprime(tmp[i],tmp[i]);
- }
+ IPD.nextprimein(tmp[i]);
+ }
while (std::find(tmp.begin(), tmp.begin()+(long)i, tmp[i]) != (tmp.begin()+(long)i ));
}
return tmp;
@@ -84,12 +85,13 @@ namespace LinBox
*/
inline Prime_Type randomPrime (Prime_Type& p) const
{
+ Givaro::IntPrimeDom IPD;
for (size_t i=0;i<p.size(); ++i){
do {
integer::random(p[i],_bits-1);
p[i]= _shift-p[i];
- nextprime(p[i],p[i]);
- }
+ IPD.nextprimein(p[i]);
+ }
while (std::find(p.begin(), p.begin()+(long)(i-1), p[i]) != (p.begin()+(long)(i-1) ));
}
return p;
@@ -109,9 +111,9 @@ namespace LinBox
{
Prime_Type tmp;
integer acc=1, cur=maxPrime;
-
+ Givaro::IntPrimeDom IPD;
do {
- prevprime(cur, cur);
+ IPD.prevprimein(cur);
tmp.push_back(cur);
acc*=cur;
} while (acc < productBound);
diff --git a/linbox/randiter/nonzero.h b/linbox/randiter/nonzero.h
deleted file mode 100644
index ed122c5..0000000
--- a/linbox/randiter/nonzero.h
+++ /dev/null
@@ -1,117 +0,0 @@
-/* linbox/randiter/nonzero.h
- * Copyright (C) 2001-2002 Bradford Hovinen
- *
- * Written by William J Turner <wjturner at math.ncsu.edu>,
- * Bradford Hovinen <hovinen at cis.udel.edu>
- *
- * ------------------------------------
- *
- *
- * ========LICENCE========
- * This file is part of the library LinBox.
- *
- * LinBox is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- * ========LICENCE========
- *.
- */
-
-#ifndef __LINBOX_randiter_nonzero_H
-#define __LINBOX_randiter_nonzero_H
-
-#include "linbox/field/archetype.h"
-#include "linbox/randiter/archetype.h"
-#include "linbox/element/archetype.h"
-#include "linbox/element/abstract.h"
-#include "linbox/element/envelope.h"
-#include "linbox/linbox-config.h"
-
-#include <sys/time.h>
-#include <stdlib.h>
-
-namespace LinBox
-{
- /** Random iterator for nonzero random numbers
- *
- * Wraps around an existing random iterator and ensures that the output
- * is entirely nonzero numbers.
- **/
- template <class Field, class RandIter = typename Field::RandIter>
- class NonzeroRandIter {
- public:
-
- typedef typename Field::Element Element;
-
- NonzeroRandIter (const Field &F, const RandIter &r) :
- _field (F), _r (r)
- {}
-
- NonzeroRandIter (const NonzeroRandIter& R) :
- _field (R._field), _r (R._r)
- {}
-
- ~NonzeroRandIter()
- {}
-
- NonzeroRandIter& operator=(const NonzeroRandIter& R)
- {
- if (this != &R) { // guard against self-assignment
- _field = R._field;
- _r = R._r;
- }
-
- return *this;
- }
-
- template<class Elt>
- Elt &random (Elt &a) const
- {
- do _r.random (a); while (_field.isZero (a));
- return a;
- }
-
- /** Random field element creator.
- * This returns a random field element from the information supplied
- * at the creation of the generator.
- * Required by abstract base class.
- * @return reference to random field element
- */
- ElementAbstract &random (ElementAbstract &a) const
- {
- Element tmp;
-
- random (tmp);
- return (a = ElementEnvelope <Field> (tmp));
- }
-
- private:
-
- Field _field;
- RandIter _r;
-
- }; // class NonzeroRandIter
-
-} // namespace LinBox
-
-#endif // __LINBOX_randiter_nonzero_H
-
-
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
-// Local Variables:
-// mode: C++
-// tab-width: 8
-// indent-tabs-mode: nil
-// c-basic-offset: 8
-// End:
-
diff --git a/linbox/randiter/ntl-ZZ.h b/linbox/randiter/ntl-zz.h
similarity index 100%
rename from linbox/randiter/ntl-ZZ.h
rename to linbox/randiter/ntl-zz.h
diff --git a/linbox/randiter/param-fuzzy.h b/linbox/randiter/param-fuzzy.h
index d1e0895..d79841d 100644
--- a/linbox/randiter/param-fuzzy.h
+++ b/linbox/randiter/param-fuzzy.h
@@ -50,10 +50,10 @@ namespace LinBox
ParamFuzzyRandIter (/*const ParamFuzzy &F, */
const integer &size = 0,
const integer &seed = 0) :
- /*_field (F),*/ _size (size), _seed (seed)
+ _field (ParamFuzzy()), _size (size), _seed (seed)
{
/*if (_size == 0) F.cardinality (_size);*/
- if (_seed == 0) _seed = time (NULL);
+ if (_seed == 0) _seed = (int64_t)time (NULL);
}
ParamFuzzyRandIter (const ParamFuzzy &F,
@@ -62,11 +62,11 @@ namespace LinBox
_field (F), _size (size), _seed (seed)
{
if (_size == 0) F.cardinality (_size);
- if (_seed == 0) _seed = time (NULL);
+ if (_seed == 0) _seed = (int64_t)time (NULL);
}
ParamFuzzyRandIter (const ParamFuzzyRandIter &R) :
- /*_field (R._field),*/ _size (R._size), _seed (R._seed)
+ _field (R._field), _size (R._size), _seed (R._seed)
{}
~ParamFuzzyRandIter () {}
@@ -76,6 +76,7 @@ namespace LinBox
if (this != &R) { // guard against self-assignment
_size = R._size;
_seed = R._seed;
+ _field = R._field;
}
return *this;
@@ -98,6 +99,8 @@ namespace LinBox
return (a = ElementEnvelope <ParamFuzzy> (tmp));
}
+ const ParamFuzzy& ring() { return _field; }
+
private:
/// Field in which arithmetic is done
@@ -116,11 +119,10 @@ namespace LinBox
#endif // __LINBOX_randiter_param_fuzzy_H
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
// Local Variables:
// mode: C++
// tab-width: 8
// indent-tabs-mode: nil
// c-basic-offset: 8
// End:
-
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/randiter/random-fftprime.h b/linbox/randiter/random-fftprime.h
index d3b60d0..bd4bb18 100644
--- a/linbox/randiter/random-fftprime.h
+++ b/linbox/randiter/random-fftprime.h
@@ -25,8 +25,9 @@
#ifndef __LINBOX_random_fftprime_H
#define __LINBOX_random_fftprime_H
-
+#include <vector>
#include "linbox/integer.h"
+#include "linbox/util/debug.h"
#include "linbox/util/timer.h"
namespace LinBox
@@ -34,11 +35,14 @@ namespace LinBox
class RandomFFTPrime {
public:
-
- int _bits;
-
- RandomFFTPrime(int bits = 20, unsigned long seed = 0) :
- _bits(bits)
+ // define the prime type
+ typedef integer Prime_Type;
+
+ uint64_t _bits;
+ Prime_Type _prime_bound;
+
+ RandomFFTPrime(Prime_Type pbound=0x100000, unsigned long seed = 0) :
+ _bits(pbound.bitsize()), _prime_bound(pbound)
{
if (! seed)
RandomFFTPrime::setSeed( (unsigned long)BaseTimer::seed() );
@@ -46,46 +50,68 @@ namespace LinBox
RandomFFTPrime::setSeed( seed );
}
- // define the prime type
- typedef integer Prime_Type;
+
+ /** @brief randomPrime(size_t b)
+ * return a random FFT prime with a 2-valuation larger than b in its order
+ * the randomness is on the FFT primes lying in the given range
+ * an error is thrown if no such prime exist
+ */
+ inline Prime_Type randomPrime (size_t b) const
+ {
+ integer tmp;
+ randomPrime(tmp,b);
+ return tmp;
+ }
- /** @brief randomPrime()
- * return a random prime
+ /** @brief randomPrime(Prime_Type& p, size_t b)
+ * return a random FFT prime with a 2-valuation larger than b in its order
+ * the randomness is on the FFT primes lying in the given range
+ * an error is thrown if no such prime exist
*/
- inline Prime_Type randomPrime() const
+ inline Prime_Type randomPrime (Prime_Type& t, uint64_t b) const
{
- integer tmp;
- size_t cbits=5;
+ linbox_check(b<_bits);
size_t tresh;
do {
+ size_t cbits= (size_t)rand() %(_bits-b);
tresh = 1<<(cbits);
- size_t p = 1<<((size_t)_bits-cbits);
+ uint64_t p = 1<<((size_t)_bits-cbits);
do {
- integer::random(tmp,cbits);
- tmp = tmp*p+1;
+ integer::random(t,cbits);
+ t = t*integer(p)+1;
tresh--;
- } while (( Givaro::probab_prime(tmp)<2) && (tresh));
- cbits++;
+ } while (!Givaro::Protected::probab_prime(t,25) && (tresh));
}
while(tresh==0);
+ linbox_check(Givaro::Protected::probab_prime(t,25))
+ return t;
+ }
+
+ /** @brief generatePrime()
+ * return a FFT prime with the largest 2-valuation in its order
+ */
+ inline Prime_Type generatePrime() const
+ {
+ integer tmp;
+ generatePrime(tmp);
return tmp;
}
- /** @brief randomPrime(Prime_Type& p)
- * return a random prime
+ /** @brief generatePrime(Prime_Type& p)
+ * return a FFT prime with the largest 2-valuation in its order
*/
- inline Prime_Type randomPrime (Prime_Type& t) const
+ inline Prime_Type generatePrime (Prime_Type& t) const
{
- size_t cbits=5;
+ size_t cbits=1;
size_t tresh;
do {
tresh = 1<<(cbits);
- size_t p = 1<<((size_t)_bits-cbits);
+ uint64_t p = 1<<((size_t)_bits-cbits);
do {
integer::random(t,cbits);
- t = t*p+1;
+ t = t*integer(p)+1;
tresh--;
- } while (!Givaro::probab_prime(t) && (tresh));
+ } while (!Givaro::Protected::probab_prime(t,25) && (tresh));
cbits++;
}
while(tresh==0);
@@ -93,6 +119,98 @@ namespace LinBox
return t;
}
+ // generate a vector of distinct FFT primes with largest 2-valuation
+ // s.t. their product is larger than a given bound
+ inline std::vector<Prime_Type> generatePrimes (const Prime_Type & bound) const {
+ std::vector<Prime_Type> primes;
+ Prime_Type prod=1;
+ integer tmp;
+ for (int64_t b = _bits - 1; b >= 0; b--)
+ for (int64_t l = ((int64_t)1 << (_bits - b - 1)) + 1; l < (1L << (_bits - b)); l +=2) {
+ tmp = ((int64_t)1 << b) * l + 1;
+ if (Givaro::Protected::probab_prime(tmp, 25) >= 1) {
+ primes.push_back(tmp);
+ prod*=tmp;
+ if (prod > bound)
+ return primes;
+ }
+ }
+ linbox_check(prod > bound ); // Could not find enough primes
+ return primes;
+ }
+
+ // generate a vector of distinct FFT primes with largest 2-valuation
+ // s.t. their product is larger than a given bound
+ inline bool generatePrimes (const Prime_Type & bound, std::vector<Prime_Type> &primes) const {
+ primes.clear();
+ Prime_Type prod=1;
+ integer tmp;
+ for (int64_t b = (int64_t)_bits - 1; b >= 0; b--)
+ for (int64_t l = (1L << ((int64_t)_bits - b - 1)) + 1; l < (1L << ((int64_t)_bits - b)); l +=2) {
+ tmp = (1L << b) * l + 1;
+ if (Givaro::Protected::probab_prime(tmp, 25) >= 1) {
+ primes.push_back(tmp);
+ prod*=tmp;
+ if (prod > bound){
+ return true;
+ }
+ }
+ }
+ return false; // false -> Could not find enough primes
+ }
+
+ size_t twoVal(integer t) const {
+ integer x=t;
+ size_t v=0;
+ while(x%2 == 0) {v++;x/=2;}
+ return v;
+ }
+
+ // generate a vector of distinct FFT primes with 2-valuation largest than val
+ // s.t. their product is larger than a given bound
+ inline bool generatePrimes ( uint64_t val, const Prime_Type & bound, std::vector<Prime_Type> &primes) const {
+ primes.clear();
+ Prime_Type prod=1;
+ integer tmp;
+ // std::cout<<"rns bound: "<<bound<<std::endl;
+ // std::cout<<"2 valuation: "<<val<<std::endl;
+ // std::cout<<"prime bitmax: "<<_bits<<std::endl;
+ // std::cout<<"prime max: "<<_prime_bound<<std::endl;
+
+ if (val > _bits) return false;
+
+#if 0
+ for (int64_t b = (int64_t)_bits; b >= (int64_t)val; b--)
+ // for (uint64_t l = (1ULL << ((int64_t)_bits - b - 1)) + 1; l < (1ULL << ((int64_t)_bits - b)); l +=2) {
+ for (int64_t l = ((int64_t)1 << ((int64_t)_bits - b)) - 1; l >=1; l -=2) {
+ tmp = ((int64_t)1 << b) * l + 1;
+ if (Givaro::Protected::probab_prime(tmp, 25) >= 1) {
+ primes.push_back(tmp);
+ prod*=tmp;
+ //std::cout<<tmp<<" -> "<<tmp.bitsize()<<" (order="<<twoVal(tmp-1)<<") "<<prod<<std::endl;
+ if (prod > bound){
+ return true;
+ }
+ }
+ }
+#else
+ for (int64_t l = (_prime_bound -1) >>val ; l >=1; l -=1) {
+ tmp = ((int64_t)1 << val) * l + 1;
+ if (Givaro::Protected::probab_prime(tmp, 25) >= 1) {
+ primes.push_back(tmp);
+ prod*=tmp;
+ //std::cout<<tmp<<" -> "<<tmp.bitsize()<<" (order="<<twoVal(tmp-1)<<") "<<prod<<std::endl;
+ if (prod > bound){
+ return true;
+ }
+ }
+ }
+
+
+#endif
+ return false; // false -> Could not find enough primes
+ }
+
/** @brief setSeed (unsigned long ul)
* Set the random seed to be ul.
*/
@@ -100,8 +218,6 @@ namespace LinBox
{
integer::seeding(ul);
}
-
-
};
}
diff --git a/linbox/randiter/random-integer.h b/linbox/randiter/random-integer.h
deleted file mode 100644
index e10fb96..0000000
--- a/linbox/randiter/random-integer.h
+++ /dev/null
@@ -1,205 +0,0 @@
-/* Copyright (C) 2010 LinBox
- * Written by <brice.boyer at imag.fr>
- * (adapted form random-prime.h)
- *
- *
- *
- * ========LICENCE========
- * This file is part of the library LinBox.
- *
- * LinBox is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- * ========LICENCE========
- */
-
-/*! @file randiter/random-integer.h
- * @ingroup randiter
- * @ingroup integer
- * @brief Generates random \ref integers.
- */
-
-#ifndef __LINBOX_random_integer_iterator_H
-#define __LINBOX_random_integer_iterator_H
-
-#include "linbox/integer.h"
-#include "linbox/util/timer.h"
-#include "linbox/util/debug.h"
-
-namespace LinBox
-{
-
- /*!@brief Random Prime Generator.
- * @ingroup integers
- * @ingroup randiter
- *
- * Generates integers of specified length.
- * @tparam _Unsigned if \c true, then only non negative integers
- * are generated, if \c false, their sign is random.
- */
- template<bool _Unsigned=true>
- class RandomIntegerIterator {
-
- unsigned int _bits; //!< common lenght of all integers
- integer _integer; //!< the generated integer.
-
- public:
- /*! Constructor.
- * @param bits size of integers (in bits)
- * @param seed if \c 0 a seed will be generated, otherwise, the
- * provided seed will be use.
- */
- RandomIntegerIterator(unsigned int bits = 30, unsigned long seed = 0) :
- _bits(bits)
- {
- linbox_check(bits>1);
- if (! seed)
- RandomIntegerIterator::setSeed( BaseTimer::seed() );
- else
- RandomIntegerIterator::setSeed( seed );
-
- integer::random_exact<_Unsigned>(_integer,_bits);
- }
-
- typedef integer Integer_Type ;
-
- /** @brief operator++()
- * creates a new random integer.
- */
- inline RandomIntegerIterator &operator ++ ()
- {
- integer::random_exact<_Unsigned>(_integer,_bits);
- return *this;
- }
-
- /** @brief get the random integer.
- * returns the actual integer.
- */
- const Integer_Type &operator * () const
- {
- return _integer;
- }
-
- /** @brief get the random integer.
- * returns the actual integer.
- * @warning a new integer is not generated.
- */
- const Integer_Type & randomInteger() const
- {
- return _integer;
- }
-
- /** @brief Sets the seed.
- * Set the random seed to be \p ul.
- * @param ul the new seed.
- */
- void static setSeed(unsigned long ul)
- {
- integer::seeding(ul);
- }
-
-
- };
-
- /*! @brief Random Integer Iterator.
- * @ingroup integers
- * @ingroup randiter
- *
- * Generates integers of size smaller than a prescribed one.
- * This class is closer to the LinBox::RandIterArchetype.
- * @todo
- * one could create the same one on a LinBox::PID_double ?
- * @tparam _Unsigned if \c true, then only non negative integers
- * are generated, if \c false, their sign is random.
- */
- template<bool _Unsigned=true>
- class RandomIntegerIter {
-
- unsigned int _bits; //!< max length for all integers
- integer _seed; //!< the generated integer.
-
- public:
- /*! Constructor.
- * @param bits max size of integers (in bits)
- * @param seed if \c 0 a seed will be generated, otherwise, the
- * provided seed will be use.
- */
- RandomIntegerIter(unsigned int bits = 30, unsigned long seed = 0) :
- _bits(bits)
- {
- linbox_check(bits>1);
- if (! seed)
- _seed = BaseTimer::seed() ;
- else
- _seed = seed ;
-
- integer::seeding(_seed);
- }
-
- /// destructor.
- ~RandomIntegerIter() {}
-
- /// copy constructor.
- /// @param R random iterator to be copied.
- RandomIntegerIter (const RandomIntegerIter &R) :
- _bits(R._bits), _seed(R._seed)
- {}
-
- typedef integer Element ;
-
- /// copy.
- /// @param R random iterator to be copied.
- RandomIntegerIter &operator=(const RandomIntegerIter &R)
- {
- if (this != &R) {
- _bits = R._bits;
- _seed = R._seed;
- }
- return *this;
- }
-
- /** @brief get the random integer.
- * @param[out] a the new integer number
- */
- const integer & random (integer & a) const
- {
- integer::random_lessthan<_Unsigned>(a,_bits);
-
- return a;
- }
-
- void setBits (unsigned int bits)
- {
- _bits = bits;
- }
-
- unsigned int getBits () const
- {
- return _bits ;
- }
-
- };
-
-}
-
-#endif //__LINBOX_random_integer_iterator_H
-
-
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
-// Local Variables:
-// mode: C++
-// tab-width: 8
-// indent-tabs-mode: nil
-// c-basic-offset: 8
-// End:
-
diff --git a/linbox/randiter/random-prime.h b/linbox/randiter/random-prime.h
index 62534d4..fec86da 100644
--- a/linbox/randiter/random-prime.h
+++ b/linbox/randiter/random-prime.h
@@ -1,6 +1,6 @@
/* Copyright (C) 2007,2010 LinBox
* Written by <Jean-Guillaume.Dumas at imag.fr>
- * Modified by <brice.boyer at imag.fr> (RandomPrimeIter)
+ * Modified by Brice Boyer (briceboyer) <boyer.brice at gmail.com> (RandomPrimeIter)
*
*
*
@@ -30,10 +30,13 @@
#ifndef __LINBOX_random_prime_iterator_H
#define __LINBOX_random_prime_iterator_H
-#include "linbox/integer.h"
+
+
+#include <givaro/givinteger.h>
+#include <givaro/givintprime.h>
#include "linbox/util/timer.h"
#include "linbox/util/debug.h"
-#include <cstdlib> // drand48, temporary
+#include "linbox/field/field-traits.h"
namespace LinBox
{
@@ -50,30 +53,32 @@ namespace LinBox
*/
//template<class Prime_Type = integer>
class RandomPrimeIterator {
+ private:
- unsigned int _bits; //!< common lenght of all primes
+ uint64_t _bits; //!< common lenght of all primes
integer _shift; //!< @internal used to set proper bit size
integer _prime; //!< the generated prime.
+ Givaro::IntPrimeDom _IPD; //!< empty struct dealing with primality.
public:
/*! Constructor.
- * @param bits size of primes (in bits). Default is 30 so it
+ * @param bits size of primes (in bits). Default is 27 so it
* can fit in a <code>Linbox::Modular<double></code>.
* @param seed if \c 0 a seed will be generated, otherwise, the
* provided seed will be use.
*/
- RandomPrimeIterator(unsigned int bits = 30, unsigned long seed = 0) :
+ RandomPrimeIterator(uint64_t bits = 27, uint64_t seed = 0) :
_bits(bits), _shift(integer(1)<<_bits)
{
linbox_check(bits >1);
if (! seed)
- RandomPrimeIterator::setSeed( BaseTimer::seed() );
+ setSeed( BaseTimer::seed() );
else
- RandomPrimeIterator::setSeed( seed );
+ setSeed( seed );
integer::random(_prime,_bits-1);
_prime = _shift - _prime;
- nextprime( _prime, _prime);
+ _IPD.nextprimein(_prime);
}
typedef integer Prime_Type ;
@@ -85,7 +90,7 @@ namespace LinBox
{
integer::random(_prime,_bits-1);
_prime = _shift - _prime;
- nextprime( _prime, _prime);
+ _IPD.nextprimein(_prime);
return *this;
}
@@ -110,14 +115,58 @@ namespace LinBox
* Set the random seed to be \p ul.
* @param ul the new seed.
*/
- void static setSeed(unsigned long ul)
+ void static setSeed(uint64_t ul)
{
integer::seeding(ul);
}
+ void setBits(uint64_t bits) {
+ _bits = bits;
+ _shift=(integer(1)<<_bits);
+
+ linbox_check(bits >1);
+
+ integer::random(_prime,_bits-1);
+ _prime = _shift - _prime;
+ _IPD.nextprimein(_prime);
+
+ }
+
+ template<class _ModField>
+ void setBitsField()
+ {
+ // std::cout << _bits << std::endl;
+ integer k = FieldTraits<_ModField >::maxModulus();
+ // std::cout << k << std::endl;
+ uint64_t bits = (uint64_t)(k.bitsize());
+ if (!bits)
+ throw("weird");
+ --bits;
+ // std::cout << bits << std::endl;
+ if (bits < _bits)
+ setBits(bits);
+ // std::cout << _bits << std::endl;
+ }
+
+ template<class _ModField>
+ bool setBitsDelayedField(size_t n)
+ {
+ integer k = FieldTraits<_ModField >::maxModulus();
+ int bits = (int)(k.bitsize());
+ //std::cout << "maxmodbits: " << bits << std::endl;
+ if (!bits) throw("weird");
+ --bits;
+ bits -= (int)((log((double)n)/2./M_LN2));
+ //std::cout << "delcorrect: " << bits << std::endl;
+ if (bits < 0) return false;
+ if (bits < (int64_t)_bits) setBits((uint64_t)bits);
+ return true;
+ }
+
};
+
/*! @brief Random Prime Iterator.
* @ingroup primes
* @ingroup randiter
@@ -129,8 +178,10 @@ namespace LinBox
*/
class RandomPrimeIter {
- unsigned int _bits; //!< max length for all primes
+ uint64_t _bits; //!< max length for all primes
integer _seed; //!< the generated prime.
+ Givaro::GivRandom _generator;
+ Givaro::IntPrimeDom _IPD;
public:
/*! Constructor.
@@ -139,12 +190,12 @@ namespace LinBox
* @param seed if \c 0 a seed will be generated, otherwise, the
* provided seed will be use.
*/
- RandomPrimeIter(unsigned int bits = 30, unsigned long seed = 0) :
- _bits(bits)
+ RandomPrimeIter(uint64_t bits = 30, uint64_t seed = 0) :
+ _bits(bits), _generator(seed)
{
linbox_check(bits >1);
if (! seed)
- _seed = BaseTimer::seed() ;
+ seed = BaseTimer::seed() ;
else
_seed = seed ;
@@ -159,7 +210,7 @@ namespace LinBox
/// copy constructor.
/// @param R random iterator to be copied.
RandomPrimeIter (const RandomPrimeIter &R) :
- _bits(R._bits), _seed(R._seed)
+ _bits(R._bits), _seed(R._seed), _generator(R._generator)
{}
typedef integer Element ;
@@ -182,9 +233,9 @@ namespace LinBox
{
integer::random(a,_bits);
- nextprime( a, a);
+ _IPD.nextprimein(a);
while (a.bitsize()>_bits)
- prevprime(a,a);
+ _IPD.prevprimein(a);
return a;
}
@@ -201,9 +252,9 @@ namespace LinBox
integer::random(a,_bits-1); //!@todo uses random_exact when givaro is released.
a = (integer(1)<<_bits) - a;
- nextprime( a, a);
+ _IPD.nextprimein(a);
while (a.bitsize()>_bits)
- prevprime(a,a);
+ _IPD.prevprimein(a);
return a;
}
@@ -214,25 +265,25 @@ namespace LinBox
return random_exact(a);
}
- integer & random_between (integer & a, unsigned long _low_bits) const
+ integer & random_between (integer & a, uint64_t _low_bits) const
{
linbox_check(_low_bits < _bits);
// integer::random_exact(a,_bits);
- unsigned long ze_bits = (unsigned long)(_low_bits+(unsigned long)(double(_bits - _low_bits)*drand48())) ;
+ uint64_t ze_bits = (_low_bits + ((_bits - _low_bits)*_generator())) ;
linbox_check (!(ze_bits<_low_bits) && !(ze_bits>_bits));
integer::random(a,ze_bits-1); //!@todo uses random_between when givaro is released.
a = (integer(1)<<ze_bits) - a;
- nextprime( a, a);
+ _IPD.nextprimein(a);
while (a.bitsize()>_bits)
- prevprime(a,a);
+ _IPD.prevprimein(a);
linbox_check(a.bitsize() >= _low_bits && a.bitsize() <= _bits) ;
return a;
}
- integer random_between ( unsigned long _low_bits) const
+ integer random_between ( uint64_t _low_bits) const
{
// std::cout << "random between " << _low_bits << " and " << _bits << std::endl;
integer a ;
@@ -241,7 +292,7 @@ namespace LinBox
return a ;
}
- void setBits (unsigned int bits)
+ void setBits (uint64_t bits)
{
_bits = bits;
}
@@ -253,11 +304,10 @@ namespace LinBox
#endif //__LINBOX_random_prime_iterator_H
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
// Local Variables:
// mode: C++
// tab-width: 8
// indent-tabs-mode: nil
// c-basic-offset: 8
// End:
-
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/randiter/unparametric.h b/linbox/randiter/unparametric.h
deleted file mode 100644
index d05d9d7..0000000
--- a/linbox/randiter/unparametric.h
+++ /dev/null
@@ -1,207 +0,0 @@
-/* Copyright (C) 2010 LinBox
- * Written by William J Turner
- *
- *
- *
- * ========LICENCE========
- * This file is part of the library LinBox.
- *
- * LinBox is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- * ========LICENCE========
- */
-
-#ifndef __LINBOX_randiter_unparametric_H
-#define __LINBOX_randiter_unparametric_H
-
-#include <ctime>
-#include <vector>
-#include "linbox/field/unparametric.h"
-
-// #include <fflas-ffpack/field/unparametric.h>
-
-// Namespace in which all LinBox library code resides
-namespace LinBox
-{
- using Givaro::Caster;
-
- // forward declarations
- template <class K> class UnparametricField;
- // using FFPACK::UnparametricField ;
-
- /** Unparameterized random field element generator template.
- * Implements LinBox random field element generator common object interface
- * for unparameterized fields.
- * Used to generate efficient field classes for unparameterized fields.
- * Constructs LinBox unparameterized random field element generators from
- * field types K.
- * In particular, constructs LinBox random field element generators for
- * unparameterized fields from field types that
- * adhere to the operations for double, for
- * example UnparametricRandIter< float >.
- * Can be used as a pattern to write a particular
- * field interface, such as, UnparametricRandIter< SaclibQ > as
- * a template specialization.
- * This implementation uses the standard C++ random number generator. Thus,
- * only one random field element generator can be used at a time since
- * creating a new one will re-seed the built-in generator and affect all
- * current LinBox generators.
- * @param K unparameterized field class
- */
- template <class K> class UnparametricRandIter
- {
- public:
-
- /** @name Common Object Interface.
- * These methods are required of all LinBox random field element generators.
- */
- //@{
-
- /** Field element type.
- * The field element must contain a default constructor,
- * a copy constructor, a destructor, and an assignment operator.
- */
- typedef K Element;
-
- /** Constructor from field, sampling size, and seed.
- * The random field element iterator works in the field F, is seeded
- * by seed, and it returns any one element with probability no more
- * than 1/min(size, F.cardinality(c)).
- * A sampling size of zero means to sample from the entire field.
- * A seed of zero means to use some arbitrary seed for the generator.
- * This implementation sets the sampling size to be no more than the
- * cardinality of the field.
- * @param F LinBox field archetype object in which to do arithmetic
- * @param size constant integer reference of sample size from which to
- * sample (default = 0)
- * @param seed constant integer reference from which to seed random number
- * generator (default = 0)
- */
- UnparametricRandIter(
- const UnparametricField<K>& F,
- const integer& size = 0,
- const integer& seed = 0
- ) :
- _size(size), _seed(seed)
- {
- if (_seed == integer(0))
- _seed = Integer::random();
-
- integer cardinality; F.cardinality(cardinality);
- if ( (cardinality != integer(-1)) && (_size > cardinality) )
- _size = cardinality;
-
-#ifdef TRACE
- cout << "created random generator with size " << _size
- << " and seed " << _seed << endl;
-#endif // TRACE
-
- // Seed random number generator
- srand((unsigned)_seed);
-
- } // UnparametricRandIter(const UnparametricField<K>&, const integer&, const integer&)
-
- /** Copy constructor.
- * Constructs UnparametricRandIter object by copying the random field
- * element generator.
- * This is required to allow generator objects to be passed by value
- * into functions.
- * In this implementation, this means copying the random field element
- * generator to which R._randIter_ptr points.
- * @param R UnparametricRandIter object.
- */
- UnparametricRandIter(const UnparametricRandIter& R) :
- _size(R._size), _seed(R._seed)
- {}
-
- /** Destructor.
- * This destructs the random field element generator object.
- * In this implementation, this destroys the generator by deleting
- * the random generator object to which _randIter_ptr points.
- */
- ~UnparametricRandIter(void) {}
-
- /** Assignment operator.
- * Assigns UnparametricRandIter object R to generator.
- * In this implementation, this means copying the generator to
- * which R._randIter_ptr points.
- * @param R UnparametricRandIter object.
- */
- UnparametricRandIter& operator=(const UnparametricRandIter& R)
- {
- if (this != &R) // guard against self-assignment
- {
- _size = R._size;
- _seed = R._seed;
- }
-
- return *this;
- }
-
- /** Random field element creator.
- * This returns a random field element from the information supplied
- * at the creation of the generator.
- * @return random field element
- */
- Element& random (Element& x) const
- {
- // Create new random elements
- if (_size == 0)
- return x = (Element) rand();
- else
- return Caster (x, (double(rand())/RAND_MAX)*double(_size));
-
- } // element& operator() (void)
-
- //@} Common Object Iterface
-
- /** @name Implementation-Specific Methods.
- * These methods are not required of all
- * \ref LinBox\ Random\ field\ element\ generators
- * and are included only for this implementation of the archetype.
- */
- //@{
-
- /// Default constructor
- UnparametricRandIter(void) :
- _size(0), _seed(0)
- {
- time(NULL);
- }
-
- //@}
-
- private:
-
- /// Sampling size
- integer _size;
-
- /// Seed
- integer _seed;
-
- }; // template <class K> class UnparametricRandIter
-
-} // namespace LinBox
-
-#endif // __LINBOX_randiter_unparametric_H
-
-
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
-// Local Variables:
-// mode: C++
-// tab-width: 8
-// indent-tabs-mode: nil
-// c-basic-offset: 8
-// End:
-
diff --git a/linbox/ring/Makefile.am b/linbox/ring/Makefile.am
index db8a61f..ca571cd 100644
--- a/linbox/ring/Makefile.am
+++ b/linbox/ring/Makefile.am
@@ -21,18 +21,36 @@
pkgincludesubdir=$(pkgincludedir)/ring
+SUBDIRS=ntl modular
+
BASIC_HDRS = \
ring-interface.h \
+ givaro-poly.h \
givaro-polynomial.h \
+ modular.h \
+ local-pir-modular.h \
+ pir-modular-int32.h \
+ local2_32.h \
abstract.h \
archetype.h \
envelope.h \
poweroftwomodular.h
-EXTRA_DIST = \
- ring.doxy \
- polynomial.doxy
+NTL_HDRS = \
+ ntl.h \
+ pid-ntl-zz_p.h \
+ pir-ntl-zz_p.h
-pkgincludesub_HEADERS = \
- $(BASIC_HDRS)
+if LINBOX_HAVE_NTL
+USE_NTL_HDRS = $(NTL_HDRS)
+endif
+pkgincludesub_HEADERS = \
+ $(BASIC_HDRS) \
+ $(USE_NTL_HDRS)
+
+EXTRA_DIST = \
+ $(NTL_HDRS) \
+ ring.doxy \
+ polynomial.doxy \
+ ntl.doxy
diff --git a/linbox/ring/Makefile.in b/linbox/ring/Makefile.in
deleted file mode 100644
index b919fc5..0000000
--- a/linbox/ring/Makefile.in
+++ /dev/null
@@ -1,586 +0,0 @@
-# Makefile.in generated by automake 1.11.5 from Makefile.am.
-# @configure_input@
-
-# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software
-# Foundation, Inc.
-# This Makefile.in is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
-# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
-# PARTICULAR PURPOSE.
-
- at SET_MAKE@
-
-# Copyright (c) 2010 the LinBox group
-# ========LICENCE========
-# This file is part of the library LinBox.
-#
-# LinBox is free software: you can redistribute it and/or modify
-# it under the terms of the GNU Lesser General Public
-# License as published by the Free Software Foundation; either
-# version 2.1 of the License, or (at your option) any later version.
-#
-# This library 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
-# Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public
-# License along with this library; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
-# ========LICENCE========
-
-VPATH = @srcdir@
-am__make_dryrun = \
- { \
- am__dry=no; \
- case $$MAKEFLAGS in \
- *\\[\ \ ]*) \
- echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \
- | grep '^AM OK$$' >/dev/null || am__dry=yes;; \
- *) \
- for am__flg in $$MAKEFLAGS; do \
- case $$am__flg in \
- *=*|--*) ;; \
- *n*) am__dry=yes; break;; \
- esac; \
- done;; \
- esac; \
- test $$am__dry = yes; \
- }
-pkgdatadir = $(datadir)/@PACKAGE@
-pkgincludedir = $(includedir)/@PACKAGE@
-pkglibdir = $(libdir)/@PACKAGE@
-pkglibexecdir = $(libexecdir)/@PACKAGE@
-am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
-install_sh_DATA = $(install_sh) -c -m 644
-install_sh_PROGRAM = $(install_sh) -c
-install_sh_SCRIPT = $(install_sh) -c
-INSTALL_HEADER = $(INSTALL_DATA)
-transform = $(program_transform_name)
-NORMAL_INSTALL = :
-PRE_INSTALL = :
-POST_INSTALL = :
-NORMAL_UNINSTALL = :
-PRE_UNINSTALL = :
-POST_UNINSTALL = :
-build_triplet = @build@
-host_triplet = @host@
-subdir = linbox/ring
-DIST_COMMON = $(pkgincludesub_HEADERS) $(srcdir)/Makefile.am \
- $(srcdir)/Makefile.in
-ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-am__aclocal_m4_deps = $(top_srcdir)/macros/aclocal-include.m4 \
- $(top_srcdir)/macros/config-header.m4 \
- $(top_srcdir)/macros/debug.m4 \
- $(top_srcdir)/macros/expat-check.m4 \
- $(top_srcdir)/macros/fflas-ffpack-check.m4 \
- $(top_srcdir)/macros/fplll-check.m4 \
- $(top_srcdir)/macros/givaro-check.m4 \
- $(top_srcdir)/macros/gmp-check.m4 \
- $(top_srcdir)/macros/iml-check.m4 \
- $(top_srcdir)/macros/lapack-check.m4 \
- $(top_srcdir)/macros/libtool.m4 \
- $(top_srcdir)/macros/lidia-check.m4 \
- $(top_srcdir)/macros/linbox-benchmark.m4 \
- $(top_srcdir)/macros/linbox-doc.m4 \
- $(top_srcdir)/macros/linbox-misc.m4 \
- $(top_srcdir)/macros/linbox-opt.m4 \
- $(top_srcdir)/macros/ltoptions.m4 \
- $(top_srcdir)/macros/ltsugar.m4 \
- $(top_srcdir)/macros/ltversion.m4 \
- $(top_srcdir)/macros/lt~obsolete.m4 \
- $(top_srcdir)/macros/m4ri-check.m4 \
- $(top_srcdir)/macros/m4rie-check.m4 \
- $(top_srcdir)/macros/maple-check.m4 \
- $(top_srcdir)/macros/mpfr-check.m4 \
- $(top_srcdir)/macros/ntl-check.m4 \
- $(top_srcdir)/macros/saclib-check.m4 \
- $(top_srcdir)/macros/sage-check.m4 $(top_srcdir)/configure.ac
-am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
- $(ACLOCAL_M4)
-mkinstalldirs = $(install_sh) -d
-CONFIG_HEADER = $(top_builddir)/config.h
-CONFIG_CLEAN_FILES =
-CONFIG_CLEAN_VPATH_FILES =
-depcomp =
-am__depfiles_maybe =
-SOURCES =
-DIST_SOURCES =
-am__can_run_installinfo = \
- case $$AM_UPDATE_INFO_DIR in \
- n|no|NO) false;; \
- *) (install-info --version) >/dev/null 2>&1;; \
- esac
-am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
-am__vpath_adj = case $$p in \
- $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
- *) f=$$p;; \
- esac;
-am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
-am__install_max = 40
-am__nobase_strip_setup = \
- srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
-am__nobase_strip = \
- for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
-am__nobase_list = $(am__nobase_strip_setup); \
- for p in $$list; do echo "$$p $$p"; done | \
- sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
- $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
- if (++n[$$2] == $(am__install_max)) \
- { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
- END { for (dir in files) print dir, files[dir] }'
-am__base_list = \
- sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
- sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
-am__uninstall_files_from_dir = { \
- test -z "$$files" \
- || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \
- || { echo " ( cd '$$dir' && rm -f" $$files ")"; \
- $(am__cd) "$$dir" && rm -f $$files; }; \
- }
-am__installdirs = "$(DESTDIR)$(pkgincludesubdir)"
-HEADERS = $(pkgincludesub_HEADERS)
-ETAGS = etags
-CTAGS = ctags
-DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
-ACLOCAL = @ACLOCAL@
-AMTAR = @AMTAR@
-AR = @AR@
-AUTOCONF = @AUTOCONF@
-AUTOHEADER = @AUTOHEADER@
-AUTOMAKE = @AUTOMAKE@
-AWK = @AWK@
-BLAS_CFLAGS = @BLAS_CFLAGS@
-BLAS_LIBS = @BLAS_LIBS@
-CC = @CC@
-CCNAM = @CCNAM@
-CFLAGS = @CFLAGS@
-CPPFLAGS = @CPPFLAGS@
-CXX = @CXX@
-CXXCPP = @CXXCPP@
-CXXFLAGS = @CXXFLAGS@
-CYGPATH_W = @CYGPATH_W@
-DBG = @DBG@
-DEBUG_CFLAGS = @DEBUG_CFLAGS@
-DEFAULT_CFLAGS = @DEFAULT_CFLAGS@
-DEFS = @DEFS@
-DLLTOOL = @DLLTOOL@
-DSYMUTIL = @DSYMUTIL@
-DUMPBIN = @DUMPBIN@
-ECHO_C = @ECHO_C@
-ECHO_N = @ECHO_N@
-ECHO_T = @ECHO_T@
-EGREP = @EGREP@
-EXEEXT = @EXEEXT@
-EXPAT_CFLAGS = @EXPAT_CFLAGS@
-EXPAT_LIBS = @EXPAT_LIBS@
-FFLAS_FFPACK_CFLAGS = @FFLAS_FFPACK_CFLAGS@
-FFLAS_FFPACK_LIBS = @FFLAS_FFPACK_LIBS@
-FFLAS_FFPACK_LOC = @FFLAS_FFPACK_LOC@
-FGREP = @FGREP@
-FPLLL_CFLAGS = @FPLLL_CFLAGS@
-FPLLL_LIBS = @FPLLL_LIBS@
-GIVARO_CFLAGS = @GIVARO_CFLAGS@
-GIVARO_LIBS = @GIVARO_LIBS@
-GMP_CFLAGS = @GMP_CFLAGS@
-GMP_LIBS = @GMP_LIBS@
-GMP_VERSION = @GMP_VERSION@
-GREP = @GREP@
-IML_CFLAGS = @IML_CFLAGS@
-IML_LIBS = @IML_LIBS@
-INSTALL = @INSTALL@
-INSTALL_DATA = @INSTALL_DATA@
-INSTALL_PROGRAM = @INSTALL_PROGRAM@
-INSTALL_SCRIPT = @INSTALL_SCRIPT@
-INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
-LD = @LD@
-LDFLAGS = @LDFLAGS@
-LIBOBJS = @LIBOBJS@
-LIBS = @LIBS@
-LIBTOOL = @LIBTOOL@
-LIDIA_CFLAGS = @LIDIA_CFLAGS@
-LIDIA_LIBS = @LIDIA_LIBS@
-LINBOX_BENCH_PATH = @LINBOX_BENCH_PATH@
-LINBOX_DOC_PATH = @LINBOX_DOC_PATH@
-LIPO = @LIPO@
-LN_S = @LN_S@
-LTLIBOBJS = @LTLIBOBJS@
-M4RIE_CFLAGS = @M4RIE_CFLAGS@
-M4RIE_LIBS = @M4RIE_LIBS@
-M4RI_CFLAGS = @M4RI_CFLAGS@
-M4RI_LIBS = @M4RI_LIBS@
-MAINT = @MAINT@
-MAKEINFO = @MAKEINFO@
-MANIFEST_TOOL = @MANIFEST_TOOL@
-MAPLE_CFLAGS = @MAPLE_CFLAGS@
-MAPLE_HOME = @MAPLE_HOME@
-MAPLE_LIBS = @MAPLE_LIBS@
-MAPLE_VERSION = @MAPLE_VERSION@
-MKDIR_P = @MKDIR_P@
-MPFR_CFLAGS = @MPFR_CFLAGS@
-MPFR_LIBS = @MPFR_LIBS@
-NM = @NM@
-NMEDIT = @NMEDIT@
-NTL_CFLAGS = @NTL_CFLAGS@
-NTL_LIBS = @NTL_LIBS@
-OBJDUMP = @OBJDUMP@
-OBJEXT = @OBJEXT@
-OTOOL = @OTOOL@
-OTOOL64 = @OTOOL64@
-PACKAGE = @PACKAGE@
-PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
-PACKAGE_NAME = @PACKAGE_NAME@
-PACKAGE_STRING = @PACKAGE_STRING@
-PACKAGE_TARNAME = @PACKAGE_TARNAME@
-PACKAGE_URL = @PACKAGE_URL@
-PACKAGE_VERSION = @PACKAGE_VERSION@
-PATH_SEPARATOR = @PATH_SEPARATOR@
-PROF = @PROF@
-RANLIB = @RANLIB@
-RM = @RM@
-SACLIB_CFLAGS = @SACLIB_CFLAGS@
-SACLIB_LIBS = @SACLIB_LIBS@
-SED = @SED@
-SET_MAKE = @SET_MAKE@
-SHELL = @SHELL@
-STRIP = @STRIP@
-TESTS_CFLAGS = @TESTS_CFLAGS@
-VERSION = @VERSION@
-WARN = @WARN@
-abs_builddir = @abs_builddir@
-abs_srcdir = @abs_srcdir@
-abs_top_builddir = @abs_top_builddir@
-abs_top_srcdir = @abs_top_srcdir@
-ac_ct_AR = @ac_ct_AR@
-ac_ct_CC = @ac_ct_CC@
-ac_ct_CXX = @ac_ct_CXX@
-ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
-am__leading_dot = @am__leading_dot@
-am__tar = @am__tar@
-am__untar = @am__untar@
-bindir = @bindir@
-build = @build@
-build_alias = @build_alias@
-build_cpu = @build_cpu@
-build_os = @build_os@
-build_vendor = @build_vendor@
-builddir = @builddir@
-datadir = @datadir@
-datarootdir = @datarootdir@
-docdir = @docdir@
-dvidir = @dvidir@
-exec_prefix = @exec_prefix@
-host = @host@
-host_alias = @host_alias@
-host_cpu = @host_cpu@
-host_os = @host_os@
-host_vendor = @host_vendor@
-htmldir = @htmldir@
-includedir = @includedir@
-infodir = @infodir@
-install_sh = @install_sh@
-libdir = @libdir@
-libexecdir = @libexecdir@
-localedir = @localedir@
-localstatedir = @localstatedir@
-mandir = @mandir@
-mkdir_p = @mkdir_p@
-oldincludedir = @oldincludedir@
-pdfdir = @pdfdir@
-prefix = @prefix@
-program_transform_name = @program_transform_name@
-psdir = @psdir@
-sbindir = @sbindir@
-sharedstatedir = @sharedstatedir@
-srcdir = @srcdir@
-sysconfdir = @sysconfdir@
-target_alias = @target_alias@
-top_build_prefix = @top_build_prefix@
-top_builddir = @top_builddir@
-top_srcdir = @top_srcdir@
-pkgincludesubdir = $(pkgincludedir)/ring
-BASIC_HDRS = \
- ring-interface.h \
- givaro-polynomial.h \
- abstract.h \
- archetype.h \
- envelope.h \
- poweroftwomodular.h
-
-EXTRA_DIST = \
- ring.doxy \
- polynomial.doxy
-
-pkgincludesub_HEADERS = \
- $(BASIC_HDRS)
-
-all: all-am
-
-.SUFFIXES:
-$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps)
- @for dep in $?; do \
- case '$(am__configure_deps)' in \
- *$$dep*) \
- ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
- && { if test -f $@; then exit 0; else break; fi; }; \
- exit 1;; \
- esac; \
- done; \
- echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu --ignore-deps linbox/ring/Makefile'; \
- $(am__cd) $(top_srcdir) && \
- $(AUTOMAKE) --gnu --ignore-deps linbox/ring/Makefile
-.PRECIOUS: Makefile
-Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
- @case '$?' in \
- *config.status*) \
- cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
- *) \
- echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
- cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
- esac;
-
-$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
- cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-
-$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
- cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
- cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-$(am__aclocal_m4_deps):
-
-mostlyclean-libtool:
- -rm -f *.lo
-
-clean-libtool:
- -rm -rf .libs _libs
-install-pkgincludesubHEADERS: $(pkgincludesub_HEADERS)
- @$(NORMAL_INSTALL)
- @list='$(pkgincludesub_HEADERS)'; test -n "$(pkgincludesubdir)" || list=; \
- if test -n "$$list"; then \
- echo " $(MKDIR_P) '$(DESTDIR)$(pkgincludesubdir)'"; \
- $(MKDIR_P) "$(DESTDIR)$(pkgincludesubdir)" || exit 1; \
- fi; \
- for p in $$list; do \
- if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
- echo "$$d$$p"; \
- done | $(am__base_list) | \
- while read files; do \
- echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(pkgincludesubdir)'"; \
- $(INSTALL_HEADER) $$files "$(DESTDIR)$(pkgincludesubdir)" || exit $$?; \
- done
-
-uninstall-pkgincludesubHEADERS:
- @$(NORMAL_UNINSTALL)
- @list='$(pkgincludesub_HEADERS)'; test -n "$(pkgincludesubdir)" || list=; \
- files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
- dir='$(DESTDIR)$(pkgincludesubdir)'; $(am__uninstall_files_from_dir)
-
-ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
- list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
- unique=`for i in $$list; do \
- if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
- done | \
- $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
- END { if (nonempty) { for (i in files) print i; }; }'`; \
- mkid -fID $$unique
-tags: TAGS
-
-TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
- $(TAGS_FILES) $(LISP)
- set x; \
- here=`pwd`; \
- list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
- unique=`for i in $$list; do \
- if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
- done | \
- $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
- END { if (nonempty) { for (i in files) print i; }; }'`; \
- shift; \
- if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
- test -n "$$unique" || unique=$$empty_fix; \
- if test $$# -gt 0; then \
- $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
- "$$@" $$unique; \
- else \
- $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
- $$unique; \
- fi; \
- fi
-ctags: CTAGS
-CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
- $(TAGS_FILES) $(LISP)
- list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
- unique=`for i in $$list; do \
- if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
- done | \
- $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
- END { if (nonempty) { for (i in files) print i; }; }'`; \
- test -z "$(CTAGS_ARGS)$$unique" \
- || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
- $$unique
-
-GTAGS:
- here=`$(am__cd) $(top_builddir) && pwd` \
- && $(am__cd) $(top_srcdir) \
- && gtags -i $(GTAGS_ARGS) "$$here"
-
-distclean-tags:
- -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
-
-distdir: $(DISTFILES)
- @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
- topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
- list='$(DISTFILES)'; \
- dist_files=`for file in $$list; do echo $$file; done | \
- sed -e "s|^$$srcdirstrip/||;t" \
- -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
- case $$dist_files in \
- */*) $(MKDIR_P) `echo "$$dist_files" | \
- sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
- sort -u` ;; \
- esac; \
- for file in $$dist_files; do \
- if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
- if test -d $$d/$$file; then \
- dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
- if test -d "$(distdir)/$$file"; then \
- find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
- fi; \
- if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
- cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
- find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
- fi; \
- cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
- else \
- test -f "$(distdir)/$$file" \
- || cp -p $$d/$$file "$(distdir)/$$file" \
- || exit 1; \
- fi; \
- done
-check-am: all-am
-check: check-am
-all-am: Makefile $(HEADERS)
-installdirs:
- for dir in "$(DESTDIR)$(pkgincludesubdir)"; do \
- test -z "$$dir" || $(MKDIR_P) "$$dir"; \
- done
-install: install-am
-install-exec: install-exec-am
-install-data: install-data-am
-uninstall: uninstall-am
-
-install-am: all-am
- @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
-
-installcheck: installcheck-am
-install-strip:
- if test -z '$(STRIP)'; then \
- $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
- install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
- install; \
- else \
- $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
- install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
- "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
- fi
-mostlyclean-generic:
-
-clean-generic:
-
-distclean-generic:
- -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
- -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
-
-maintainer-clean-generic:
- @echo "This command is intended for maintainers to use"
- @echo "it deletes files that may require special tools to rebuild."
-clean: clean-am
-
-clean-am: clean-generic clean-libtool mostlyclean-am
-
-distclean: distclean-am
- -rm -f Makefile
-distclean-am: clean-am distclean-generic distclean-tags
-
-dvi: dvi-am
-
-dvi-am:
-
-html: html-am
-
-html-am:
-
-info: info-am
-
-info-am:
-
-install-data-am: install-pkgincludesubHEADERS
-
-install-dvi: install-dvi-am
-
-install-dvi-am:
-
-install-exec-am:
-
-install-html: install-html-am
-
-install-html-am:
-
-install-info: install-info-am
-
-install-info-am:
-
-install-man:
-
-install-pdf: install-pdf-am
-
-install-pdf-am:
-
-install-ps: install-ps-am
-
-install-ps-am:
-
-installcheck-am:
-
-maintainer-clean: maintainer-clean-am
- -rm -f Makefile
-maintainer-clean-am: distclean-am maintainer-clean-generic
-
-mostlyclean: mostlyclean-am
-
-mostlyclean-am: mostlyclean-generic mostlyclean-libtool
-
-pdf: pdf-am
-
-pdf-am:
-
-ps: ps-am
-
-ps-am:
-
-uninstall-am: uninstall-pkgincludesubHEADERS
-
-.MAKE: install-am install-strip
-
-.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \
- clean-libtool ctags distclean distclean-generic \
- distclean-libtool distclean-tags distdir dvi dvi-am html \
- html-am info info-am install install-am install-data \
- install-data-am install-dvi install-dvi-am install-exec \
- install-exec-am install-html install-html-am install-info \
- install-info-am install-man install-pdf install-pdf-am \
- install-pkgincludesubHEADERS install-ps install-ps-am \
- install-strip installcheck installcheck-am installdirs \
- maintainer-clean maintainer-clean-generic mostlyclean \
- mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
- tags uninstall uninstall-am uninstall-pkgincludesubHEADERS
-
-
-# Tell versions [3.59,3.63) of GNU make to not export all variables.
-# Otherwise a system limit (for SysV at least) may be exceeded.
-.NOEXPORT:
diff --git a/linbox/ring/gcd32.h b/linbox/ring/gcd32.h
new file mode 100644
index 0000000..70dbda4
--- /dev/null
+++ b/linbox/ring/gcd32.h
@@ -0,0 +1,196 @@
+/* Copyright (C) LinBox
+ *
+ *
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ * ========LICENCE========
+ */
+
+#ifndef __LINBOX_ring_gcd32_H
+#define __LINBOX_ring_gcd32_H
+
+template<typename Ints> Ints GCD2E32( const Ints p)
+{
+ if( p & 65535UL) {
+ if( p & 255UL) {
+ if( p & 15UL) {
+ if( p & 3UL) {
+ if( p & 1UL) {
+ return 1UL;
+ }
+ else {
+ return 2UL;
+ }
+ }
+ else {
+ if( p & 7UL) {
+ return 4UL;
+ }
+ else {
+ return 8UL;
+ }
+ }
+ }
+ else {
+ if( p & 63UL) {
+ if( p & 31UL) {
+ return 16UL;
+ }
+ else {
+ return 32UL;
+ }
+ }
+ else {
+ if( p & 127UL) {
+ return 64UL;
+ }
+ else {
+ return 128UL;
+ }
+ }
+ }
+ }
+ else {
+ if( p & 4095UL) {
+ if( p & 1023UL) {
+ if( p & 511UL) {
+ return 256UL;
+ }
+ else {
+ return 512UL;
+ }
+ }
+ else {
+ if( p & 2047UL) {
+ return 1024UL;
+ }
+ else {
+ return 2048UL;
+ }
+ }
+ }
+ else {
+ if( p & 16383UL) {
+ if( p & 8191UL) {
+ return 4096UL;
+ }
+ else {
+ return 8192UL;
+ }
+ }
+ else {
+ if( p & 32767UL) {
+ return 16384UL;
+ }
+ else {
+ return 32768UL;
+ }
+ }
+ }
+ }
+ }
+ else {
+ if( p & 16777215UL) {
+ if( p & 1048575UL) {
+ if( p & 262143UL) {
+ if( p & 131071UL) {
+ return 65536UL;
+ }
+ else {
+ return 131072UL;
+ }
+ }
+ else {
+ if( p & 524287UL) {
+ return 262144UL;
+ }
+ else {
+ return 524288UL;
+ }
+ }
+ }
+ else {
+ if( p & 4194303UL) {
+ if( p & 2097151UL) {
+ return 1048576UL;
+ }
+ else {
+ return 2097152UL;
+ }
+ }
+ else {
+ if( p & 8388607UL) {
+ return 4194304UL;
+ }
+ else {
+ return 8388608UL;
+ }
+ }
+ }
+ }
+ else {
+ if( p & 268435455UL) {
+ if( p & 67108863UL) {
+ if( p & 33554431UL) {
+ return 16777216UL;
+ }
+ else {
+ return 33554432UL;
+ }
+ }
+ else {
+ if( p & 134217727UL) {
+ return 67108864UL;
+ }
+ else {
+ return 134217728UL;
+ }
+ }
+ }
+ else {
+ if( p & 1073741823UL) {
+ if( p & 536870911UL) {
+ return 268435456UL;
+ }
+ else {
+ return 536870912UL;
+ }
+ }
+ else {
+ if( p & 2147483647UL) {
+ return 1073741824UL;
+ }
+ else {
+ return 2147483648UL;
+ }
+ }
+ }
+ }
+ }
+}
+
+#endif //__LINBOX_ring_gcd32_H
+
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+
diff --git a/linbox/ring/gcd64.h b/linbox/ring/gcd64.h
new file mode 100644
index 0000000..543eaf9
--- /dev/null
+++ b/linbox/ring/gcd64.h
@@ -0,0 +1,356 @@
+/* Copyright (C) LinBox
+ *
+ *
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ * ========LICENCE========
+ */
+
+#ifndef __LINBOX_ring_gcd64_H
+#define __LINBOX_ring_gcd64_H
+
+template<typename Ints> Ints GCD2E64( const Ints p)
+{
+ if( p & 4294967295UL) {
+ if( p & 65535UL) {
+ if( p & 255UL) {
+ if( p & 15UL) {
+ if( p & 3UL) {
+ if( p & 1UL) {
+ return 1UL;
+ }
+ else {
+ return 2UL;
+ }
+ }
+ else {
+ if( p & 7UL) {
+ return 4UL;
+ }
+ else {
+ return 8UL;
+ }
+ }
+ }
+ else {
+ if( p & 63UL) {
+ if( p & 31UL) {
+ return 16UL;
+ }
+ else {
+ return 32UL;
+ }
+ }
+ else {
+ if( p & 127UL) {
+ return 64UL;
+ }
+ else {
+ return 128UL;
+ }
+ }
+ }
+ }
+ else {
+ if( p & 4095UL) {
+ if( p & 1023UL) {
+ if( p & 511UL) {
+ return 256UL;
+ }
+ else {
+ return 512UL;
+ }
+ }
+ else {
+ if( p & 2047UL) {
+ return 1024UL;
+ }
+ else {
+ return 2048UL;
+ }
+ }
+ }
+ else {
+ if( p & 16383UL) {
+ if( p & 8191UL) {
+ return 4096UL;
+ }
+ else {
+ return 8192UL;
+ }
+ }
+ else {
+ if( p & 32767UL) {
+ return 16384UL;
+ }
+ else {
+ return 32768UL;
+ }
+ }
+ }
+ }
+ }
+ else {
+ if( p & 16777215UL) {
+ if( p & 1048575UL) {
+ if( p & 262143UL) {
+ if( p & 131071UL) {
+ return 65536UL;
+ }
+ else {
+ return 131072UL;
+ }
+ }
+ else {
+ if( p & 524287UL) {
+ return 262144UL;
+ }
+ else {
+ return 524288UL;
+ }
+ }
+ }
+ else {
+ if( p & 4194303UL) {
+ if( p & 2097151UL) {
+ return 1048576UL;
+ }
+ else {
+ return 2097152UL;
+ }
+ }
+ else {
+ if( p & 8388607UL) {
+ return 4194304UL;
+ }
+ else {
+ return 8388608UL;
+ }
+ }
+ }
+ }
+ else {
+ if( p & 268435455UL) {
+ if( p & 67108863UL) {
+ if( p & 33554431UL) {
+ return 16777216UL;
+ }
+ else {
+ return 33554432UL;
+ }
+ }
+ else {
+ if( p & 134217727UL) {
+ return 67108864UL;
+ }
+ else {
+ return 134217728UL;
+ }
+ }
+ }
+ else {
+ if( p & 1073741823UL) {
+ if( p & 536870911UL) {
+ return 268435456UL;
+ }
+ else {
+ return 536870912UL;
+ }
+ }
+ else {
+ if( p & 2147483647UL) {
+ return 1073741824UL;
+ }
+ else {
+ return 2147483648UL;
+ }
+ }
+ }
+ }
+ }
+ }
+ else {
+ if( p & 281474976710655ULL) {
+ if( p & 1099511627775ULL) {
+ if( p & 68719476735ULL) {
+ if( p & 17179869183ULL) {
+ if( p & 8589934591ULL) {
+ return 4294967296ULL;
+ }
+ else {
+ return 8589934592ULL;
+ }
+ }
+ else {
+ if( p & 34359738367ULL) {
+ return 17179869184ULL;
+ }
+ else {
+ return 34359738368ULL;
+ }
+ }
+ }
+ else {
+ if( p & 274877906943ULL) {
+ if( p & 137438953471ULL) {
+ return 68719476736ULL;
+ }
+ else {
+ return 137438953472ULL;
+ }
+ }
+ else {
+ if( p & 549755813887ULL) {
+ return 274877906944ULL;
+ }
+ else {
+ return 549755813888ULL;
+ }
+ }
+ }
+ }
+ else {
+ if( p & 17592186044415ULL) {
+ if( p & 4398046511103ULL) {
+ if( p & 2199023255551ULL) {
+ return 1099511627776ULL;
+ }
+ else {
+ return 2199023255552ULL;
+ }
+ }
+ else {
+ if( p & 8796093022207ULL) {
+ return 4398046511104ULL;
+ }
+ else {
+ return 8796093022208ULL;
+ }
+ }
+ }
+ else {
+ if( p & 70368744177663ULL) {
+ if( p & 35184372088831ULL) {
+ return 17592186044416ULL;
+ }
+ else {
+ return 35184372088832ULL;
+ }
+ }
+ else {
+ if( p & 140737488355327ULL) {
+ return 70368744177664ULL;
+ }
+ else {
+ return 140737488355328ULL;
+ }
+ }
+ }
+ }
+ }
+ else {
+ if( p & 72057594037927935ULL) {
+ if( p & 4503599627370495ULL) {
+ if( p & 1125899906842623ULL) {
+ if( p & 562949953421311ULL) {
+ return 281474976710656ULL;
+ }
+ else {
+ return 562949953421312ULL;
+ }
+ }
+ else {
+ if( p & 2251799813685247ULL) {
+ return 1125899906842624ULL;
+ }
+ else {
+ return 2251799813685248ULL;
+ }
+ }
+ }
+ else {
+ if( p & 18014398509481983ULL) {
+ if( p & 9007199254740991ULL) {
+ return 4503599627370496ULL;
+ }
+ else {
+ return 9007199254740992ULL;
+ }
+ }
+ else {
+ if( p & 36028797018963967ULL) {
+ return 18014398509481984ULL;
+ }
+ else {
+ return 36028797018963968ULL;
+ }
+ }
+ }
+ }
+ else {
+ if( p & 1152921504606846975ULL) {
+ if( p & 288230376151711743ULL) {
+ if( p & 144115188075855871ULL) {
+ return 72057594037927936ULL;
+ }
+ else {
+ return 144115188075855872ULL;
+ }
+ }
+ else {
+ if( p & 576460752303423487ULL) {
+ return 288230376151711744ULL;
+ }
+ else {
+ return 576460752303423488ULL;
+ }
+ }
+ }
+ else {
+ if( p & 4611686018427387903ULL) {
+ if( p & 2305843009213693951ULL) {
+ return 1152921504606846976ULL;
+ }
+ else {
+ return 2305843009213693952ULL;
+ }
+ }
+ else {
+ if( p & 9223372036854775807ULL) {
+ return 4611686018427387904ULL;
+ }
+ else {
+ return 9223372036854775808ULL;
+ }
+ }
+ }
+ }
+ }
+ }
+}
+
+#endif //__LINBOX_ring_gcd64_H
+
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+
diff --git a/linbox/ring/givaro-poly-mod-poly.h b/linbox/ring/givaro-poly-mod-poly.h
new file mode 100644
index 0000000..e6c752f
--- /dev/null
+++ b/linbox/ring/givaro-poly-mod-poly.h
@@ -0,0 +1,41 @@
+
+#ifndef _GIVARO_POLY_MOD_POLY_H
+#define _GIVARO_POLY_MOD_POLY_H
+
+#include <givaro/extension.h>
+#include <givaro/givindeter.h>
+//#include "linbox/field/Givaro/givaro-field.h"
+
+namespace LinBox {
+
+template <class BaseField>
+class GivaroPolyModPoly {
+public:
+ typedef Givaro::Extension<BaseField> Parent_t;
+ typedef typename Parent_t::PolElement Element;
+
+ typedef BaseField Domain_t;
+ typedef typename BaseField::Element Type_t;
+
+ GivaroPolyModPoly(BaseField& F,Element p,Givaro::Indeter Y="Y") :
+ F_(&F),
+ FactorDom_(*F_,Y),
+ ExtensionField_(FactorDom_,BaseField(p)) {}
+
+ Parent_t* getExtension() {
+ return &ExtensionField_;
+ }
+
+private:
+
+ BaseField *F_;
+
+ Givaro::Poly1FactorDom<BaseField,Givaro::Dense> FactorDom_;
+
+ Givaro::Extension<BaseField> ExtensionField_;
+
+};
+
+}
+
+#endif // _GIVARO_POLY_MOD_POLY_H
diff --git a/linbox/ring/givaro-poly.h b/linbox/ring/givaro-poly.h
new file mode 100644
index 0000000..211ea62
--- /dev/null
+++ b/linbox/ring/givaro-poly.h
@@ -0,0 +1,348 @@
+
+/* ring/givaro-poly.h
+ * Copyright (C) 2014 Gavin Harrison,
+ *
+ * Written by Gavin Harrison <gmh33 at drexel.edu>,
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ * ========LICENCE========
+ *.
+ */
+
+#include <iostream>
+
+#include "linbox/integer.h"
+#include <givaro/givpoly1.h>
+
+#ifndef LINBOX_ring_givaro_poly_H
+#define LINBOX_ring_givaro_poly_H
+
+namespace LinBox
+{
+ template<class Field>
+ class GivaroPolyRandIter;
+
+ template<class Domain>
+ class GivaroPoly {
+ Domain _pd;
+ public:
+ typedef Domain Domain_t;
+ typedef typename Domain::Element Element;
+ typedef typename Domain::Type_t Scalar_t;
+
+ typedef GivaroPolyRandIter<GivaroPoly<Domain> > RandIter;
+
+ Element zero, one, mOne;
+
+ GivaroPoly(){}
+
+ GivaroPoly(const Domain &pd) : _pd(pd) {
+ _pd.assign(zero, _pd.zero);
+ _pd.assign(one, _pd.one);
+ _pd.assign(mOne, _pd.mOne);
+ }
+
+ GivaroPoly(const GivaroPoly &P)
+ : _pd(P._pd), zero(P.zero), one(P.one), mOne(P.mOne) {}
+
+ GivaroPoly &operator=(const GivaroPoly &F) {
+ return *this;
+ }
+
+ const Domain_t domain() const {
+ return _pd;
+ }
+
+ const typename Domain_t::Domain_t &subdomain() const {
+ return _pd.subdomain();
+ }
+
+ Element &init(Element &x) const {
+ _pd.init(x, Givaro::Degree(0), 0);
+ return x;
+ }
+
+ Element &init(Element &x, const integer &y) const {
+ _pd.init(x, Givaro::Degree(0), 0);
+
+ integer q = subdomain().cardinality();
+
+ integer i = 0;
+ integer tmp = y;
+
+ while (tmp != 0)
+ {
+ Element xi;
+ _pd.init(xi, Givaro::Degree(int64_t(i)), tmp % q);
+ _pd.addin(x, xi);
+
+ i++;
+ tmp /= q;
+ }
+
+ return x;
+ }
+
+ Element &init(Element &x, const std::vector<integer> &y) const {
+ _pd.init(x, Givaro::Degree(0), 0);
+
+ for (int i = 0; i < y.size(); i++)
+ {
+ Element xi;
+ _pd.init(xi, Givaro::Degree(i), y[i]);
+ _pd.addin(x, xi);
+ }
+
+ return x;
+ }
+
+ integer &convert(integer &x, const Element &y) const {
+ x = 0;
+ integer q = _pd.characteristic();
+ Givaro::Degree d = _pd.degree(y);
+
+ while (d >= 0) {
+ integer tmp;
+ Scalar_t e;
+
+ x *= q;
+ _pd.getEntry(e, d, y);
+ x += _pd.subdomain().convert(tmp, e);
+
+ d--;
+ }
+
+ return x;
+ }
+
+ Element &assign(Element &x, const Element &y) const {
+ return _pd.assign(x, y);
+ }
+
+ integer &cardinality(integer &c) const {
+ return c = -1;
+ }
+
+ integer &characteristic(integer &c) const {
+ return c = _pd.characteristic(c);
+ }
+
+ bool areEqual(const Element &x, const Element &y) const {
+ return _pd.areEqual(x, y);
+ }
+
+ Element &normalize(Element &z, const Element &x) const {
+ Scalar_t a;
+ domain().leadcoef(a, x);
+ domain().div(z, x, a);
+ return z;
+ }
+
+ Element &normalizeIn(Element &x) const {
+ Scalar_t a;
+ domain().leadcoef(a, x);
+ domain().divin(x, a);
+ return x;
+ }
+
+ bool areAssociates(const Element &x, const Element &y) const {
+ Scalar_t a, b;
+ Element z;
+
+ domain().leadcoef(a, x);
+ domain().leadcoef(b, y);
+
+ subdomain().divin(a, b);
+
+ domain().mul(z, y, a);
+
+ return _pd.areEqual(x, z);
+ }
+
+ bool isZero(const Element &x) const {
+ return _pd.isZero(x);
+ }
+
+ bool isOne(const Element &x) const {
+ return _pd.isOne(x);
+ }
+
+ bool isMOne(const Element &x) const {
+ return _pd.isMOne(x);
+ }
+
+ std::ostream &write(std::ostream &os) const {
+ return os << "polynomials";
+ }
+
+ std::istream &read(std::istream &is) {
+ return is;
+ }
+
+ std::ostream &write(std::ostream &os, const Element &x) const {
+ return _pd.write(os, x);
+ }
+
+ std::istream &read(std::istream &is, Element &x) const {
+ _pd.read(is, x);
+ return is;
+ }
+
+ Element &add(Element &x, const Element &y, const Element &z) const {
+ return _pd.add(x, y, z);
+ }
+
+ Element &sub(Element &x, const Element &y, const Element &z) const {
+ return _pd.sub(x, y, z);
+ }
+
+ Element &mul(Element &x, const Element &y, const Element &z) const {
+ return _pd.mul(x, y, z);
+ }
+
+ Element &div(Element &x, const Element &y, const Element &z) const {
+ return _pd.div(x, y, z);
+ }
+
+ Element &neg(Element &x, const Element &y) const {
+ return _pd.neg(x, y);
+ }
+
+ Element &inv(Element &x, const Element &y) const {
+ if (_pd.degree(y) == 0 && !_pd.isZero(y)) {
+ Scalar_t tmp;
+ _pd.subdomain().inv(tmp, _pd.getEntry(tmp, Givaro::Degree(0), y));
+ return _pd.assign(x, tmp);
+ }
+
+ return _pd.assign(x,zero);
+ }
+
+ Element &axpy(Element &r, const Element &a, const Element &x, const Element &y) const {
+ return _pd.axpy(r,a,x,y);
+ }
+
+ Element &addin(Element &x, const Element &y) const {
+ return _pd.addin(x, y);
+ }
+
+ Element &subin(Element &x, const Element &y) const {
+ return _pd.subin(x, y);
+ }
+
+ Element &mulin(Element &x, const Element &y) const {
+ return _pd.mulin(x, y);
+ }
+
+ Element &divin(Element &x, const Element &y) const {
+ return _pd.divin(x, y);
+ }
+
+ Element &negin(Element &x) const {
+ return _pd.negin(x);
+ }
+
+ Element &invin(Element &x) const {
+ Element tmp;
+ inv(tmp, x);
+ x = tmp;
+ return x;
+ }
+
+ Element &axpyin(Element &r, const Element &a, const Element &x) const {
+ return _pd.axpyin(r, a, x);
+ }
+
+ // PIR Functions
+
+ bool isDivisor(const Element &a, const Element &b) const {
+ Element tmp;
+ rem(tmp, a, b);
+ return _pd.isZero(tmp);
+ }
+
+ // a = q b + r
+ Element &quo(Element &q, const Element &a, const Element &b) const {
+ return div(q,a,b);
+ }
+
+ Element &rem(Element &r, const Element &a, const Element &b) const {
+ return _pd.mod(r,a,b);
+ }
+
+ Element &divrem(Element &q, Element &r, const Element &a, const Element &b) const {
+ return _pd.divmod(q,r,a,b);
+ }
+
+ Element &modin(Element &a, const Element &b) const {
+ return _pd.modin(a, b);
+ }
+
+ Element& normalIn(Element &x) const
+ {
+ return x;
+ }
+
+ bool isUnit(const Element& x) const
+ {
+ return _pd.degree(x).value()==0;
+ }
+
+ // g = gcd(a,b)
+ Element& gcd(Element &g, const Element &a, const Element &b) const {
+ return _pd.gcd(g,a,b);
+ }
+
+ // g = gcd(a,b)
+ Element& gcd(Element &g, Element &s, Element &t, const Element &a, const Element &b) const {
+ return _pd.gcd(g,s,t,a,b);
+ }
+
+ // g = gcd(a,b) = a*s + b*t
+ Element &xgcd(Element &g, Element &s, Element &t, const Element &a, const Element &b) const {
+ return _pd.gcd(g,s,t,a,b);
+ }
+
+ /**
+ * g = gcd(a,b) = a*s + b*t
+ * 1 = s*u + t*v
+ * u = a/g
+ * v = b/g
+ */
+ Element &dxgcd(
+ Element &g,
+ Element &s,
+ Element &t,
+ Element &u,
+ Element &v,
+ const Element &a,
+ const Element &b) const
+ {
+ xgcd(g,s,t,a,b);
+
+ div(u,a,g);
+ div(v,b,g);
+
+ return g;
+ }
+ };
+}
+
+#include "linbox/randiter/givaro-poly.h"
+
+#endif // LINBOX_ring_givaro_poly_H
diff --git a/linbox/ring/givaro-polynomial.h b/linbox/ring/givaro-polynomial.h
index a3ede28..3882052 100644
--- a/linbox/ring/givaro-polynomial.h
+++ b/linbox/ring/givaro-polynomial.h
@@ -35,9 +35,9 @@
#include <iostream>
#include <givaro/givpoly1.h>
#include <givaro/givpoly1factor.h>
+#include <givaro/zring.h>
+
#include "linbox/integer.h"
-#include "linbox/field/unparametric.h"
-#include "linbox/field/givaro.h"
//#include "linbox/element/givaro-polynomial.h"
@@ -53,26 +53,28 @@ namespace LinBox
* @tparam StorageTag
*/
template <class Domain, class StorageTag= Givaro::Dense>
- class GivPolynomialRing : public Givaro::Poly1FactorDom< GivaroField<Domain>,StorageTag> {
+ class GivPolynomialRing : public Givaro::Poly1FactorDom< Domain,StorageTag> {
public:
// using Givaro::Poly1FactorDom<Domain,StorageTag>::eval;
- typedef typename Givaro::Poly1FactorDom<GivaroField<Domain>,StorageTag> Father_t;
+ typedef typename Givaro::Poly1FactorDom<Domain,StorageTag> Father_t;
typedef typename Father_t::Element Element;
typedef Element Polynomial;
- GivPolynomialRing () {}
+ typedef Father_t Rep;
+
+ // GivPolynomialRing () {}
- GivPolynomialRing (const Domain& D) : Father_t( GivaroField<Domain>(D) )
+ GivPolynomialRing (const Domain& D) : Father_t( Domain(D) )
{}
GivPolynomialRing (const Domain& D, const Givaro::Indeter& I) :
- Father_t(GivaroField<Domain>(D), I)
+ Father_t(Domain(D), I)
{}
template<class PolyCont>
PolyCont& factor (PolyCont& factors,
- std::vector<unsigned long>& exp,
+ std::vector<uint64_t>& exp,
const Polynomial& P)
{
@@ -80,9 +82,9 @@ namespace LinBox
// at least without pointers ...
std::vector<Polynomial> Lf;
CZfactor(Lf, exp, P); // Cantor-Zassenhaus factorization
- factors.resize(Lf.size());
+ factors.resize((size_t)Lf.size());
for(size_t i=0; i<Lf.size(); ++i)
- factors[i] = new Polynomial(Lf[i]);
+ factors[(size_t)i] = new Polynomial(Lf[(size_t)i]);
return factors;
}
@@ -93,23 +95,24 @@ namespace LinBox
#ifdef __LINBOX_HAVE_NTL
}
-#include "linbox/field/ntl.h"
+
+#include "linbox/ring/ntl.h"
#include "NTL/ZZXFactoring.h"
namespace LinBox
{
- typedef GivPolynomialRing<UnparametricField<integer>, Givaro::Dense> GivPolIntDense;
+ typedef GivPolynomialRing<Givaro::ZRing<integer>, Givaro::Dense> GivPolIntDense;
template <>
template <>
std::vector<GivPolIntDense::Element* >&
GivPolIntDense::factor (std::vector<GivPolIntDense::Element* >& factors,
- std::vector<unsigned long>& exp,
+ std::vector<uint64_t>& exp,
const GivPolIntDense::Element &P)
{
NTL::ZZXFac_InitNumPrimes = 1;
NTL::ZZX f;
for (size_t i = 0; i < P.size(); ++i){
- NTL::SetCoeff (f, i, NTL::to_ZZ((std::string( P[i] )).c_str()) );
+ NTL::SetCoeff (f, (long)i, NTL::to_ZZ((std::string( P[(size_t)i] )).c_str()) );
}
NTL::vec_pair_ZZX_long ntlfactors;
NTL::ZZ c;
@@ -117,54 +120,54 @@ namespace LinBox
NTL::ZZ t;
NTL_ZZ NTLIntDom;
- factors.resize(ntlfactors.length());
- exp.resize(ntlfactors.length());
+ factors.resize((size_t)ntlfactors.length());
+ exp.resize((size_t)ntlfactors.length());
for (int i= 0; i<ntlfactors.length(); ++i) {
- factors[i] = new GivPolIntDense::Element( deg(ntlfactors[i].a)+1 );
+ factors[(size_t)i] = new GivPolIntDense::Element( (size_t)( deg(ntlfactors[i].a)+1 ));
for(int j = 0; j <= deg(ntlfactors[i].a); ++j) {
NTL::GetCoeff(t,ntlfactors[i].a,j);
- NTLIntDom.convert( factors[i]->operator[](j), t );
+ NTLIntDom.convert( factors[(size_t)i]->operator[]((size_t)j), t );
}
- exp[i] = ntlfactors[i].b;
+ exp[(size_t)i] =(unsigned long) ntlfactors[i].b;
}
return factors;
}
}
-#include "linbox/field/PID-integer.h"
-namespace LinBox
-{
- typedef GivPolynomialRing<PID_integer, Givaro::Dense> GivPolPIDIntDense;
- template <>
- template <>
- std::vector<GivPolPIDIntDense::Element* >&
- GivPolPIDIntDense::factor<std::vector<GivPolPIDIntDense::Element* > > (std::vector<GivPolPIDIntDense::Element* >& factors,
- std::vector<unsigned long>& exp,
- const GivPolPIDIntDense::Element &P)
- {
- NTL::ZZXFac_InitNumPrimes = 1;
- NTL::ZZX f;
- for (size_t i = 0; i < P.size(); ++i){
- NTL::SetCoeff (f, i, NTL::to_ZZ((std::string( P[i] )).c_str()) );
- }
- NTL::vec_pair_ZZX_long ntlfactors;
- NTL::ZZ c;
- NTL::factor (c, ntlfactors, f);
-
- NTL::ZZ t;
- NTL_ZZ NTLIntDom;
- factors.resize(ntlfactors.length());
- exp.resize(ntlfactors.length());
- for (int i= 0; i<ntlfactors.length(); ++i) {
- factors[i] = new GivPolPIDIntDense::Element( deg(ntlfactors[i].a)+1 );
- for(int j = 0; j <= deg(ntlfactors[i].a); ++j) {
- NTL::GetCoeff(t,ntlfactors[i].a,j);
- NTLIntDom.convert( factors[i]->operator[](j), t );
- }
- exp[i] = ntlfactors[i].b;
- }
- return factors;
- }
+// #include "givaro/zring.h"
+ namespace LinBox
+ {
+// typedef GivPolynomialRing<Givaro::ZRing<Integer>, Givaro::Dense> GivPolPIDIntDense;
+// template <>
+// template <>
+// std::vector<GivPolPIDIntDense::Element* >&
+// GivPolPIDIntDense::factor<std::vector<GivPolPIDIntDense::Element* > > (std::vector<GivPolPIDIntDense::Element* >& factors,
+// std::vector<unsigned long>& exp,
+// const GivPolPIDIntDense::Element &P)
+// {
+// NTL::ZZXFac_InitNumPrimes = 1;
+// NTL::ZZX f;
+// for (size_t i = 0; i < P.size(); ++i){
+// NTL::SetCoeff (f, (long)i, NTL::to_ZZ((std::string( P[(size_t)i] )).c_str()) );
+// }
+// NTL::vec_pair_ZZX_long ntlfactors;
+// NTL::ZZ c;
+// NTL::factor (c, ntlfactors, f);
+
+// NTL::ZZ t;
+// NTL_ZZ NTLIntDom;
+// factors.resize((size_t)ntlfactors.length());
+// exp.resize((size_t)ntlfactors.length());
+// for (int i= 0; i<ntlfactors.length(); ++i) {
+// factors[(size_t)i] = new GivPolPIDIntDense::Element( (size_t)deg(ntlfactors[i].a)+1 );
+// for(int j = 0; j <= deg(ntlfactors[i].a); ++j) {
+// NTL::GetCoeff(t,ntlfactors[i].a,j);
+// NTLIntDom.convert( factors[(size_t)i]->operator[]((size_t)j), t );
+// }
+// exp[(size_t)i] = (unsigned long)ntlfactors[i].b;
+// }
+// return factors;
+// }
typedef GivPolynomialRing< NTL_ZZ , Givaro::Dense> GivPolZZDense;
template <>
@@ -172,46 +175,46 @@ namespace LinBox
std::vector<GivPolZZDense::Element* >&
GivPolZZDense::factor<std::vector<GivPolZZDense::Element* > >
(std::vector<GivPolZZDense::Element* >& factors,
- std::vector<unsigned long>& exp,
+ std::vector<uint64_t>& exp,
const GivPolZZDense::Element &P)
{
NTL::ZZXFac_InitNumPrimes = 1;
NTL::ZZX f;
for (size_t i = 0; i < P.size(); ++i){
- NTL::SetCoeff (f, i, P[i]);
+ NTL::SetCoeff (f, (long)i, P[(size_t)i]);
}
NTL::vec_pair_ZZX_long ntlfactors;
NTL::ZZ c;
NTL::factor (c, ntlfactors, f);
NTL::ZZ t;
- factors.resize(ntlfactors.length());
- exp.resize(ntlfactors.length());
+ factors.resize((size_t)ntlfactors.length());
+ exp.resize((size_t)ntlfactors.length());
for (int i= 0; i<ntlfactors.length(); ++i) {
- factors[i] = new GivPolZZDense::Element( deg(ntlfactors[i].a)+1 );
+ factors[(size_t)i] = new GivPolZZDense::Element((size_t) deg(ntlfactors[i].a)+1 );
for(int j = 0; j <= deg(ntlfactors[i].a); ++j) {
- NTL::GetCoeff( factors[i]->operator[](j),ntlfactors[i].a,j);
+ NTL::GetCoeff( factors[(size_t)i]->operator[]((size_t)j),ntlfactors[i].a,j);
}
- exp[i] = ntlfactors[i].b;
+ exp[(size_t)i] = (unsigned long)ntlfactors[i].b;
}
return factors;
}
#endif
- typedef GivPolynomialRing<Modular<double>, Givaro::Dense> GivPolMdDense;
+ typedef GivPolynomialRing<Givaro::Modular<double>, Givaro::Dense> GivPolMdDense;
template <>
template <>
std::vector<GivPolMdDense::Element *>&
GivPolMdDense::factor (std::vector<GivPolMdDense::Element* > & factors,
- std::vector<unsigned long>& exp,
+ std::vector<uint64_t>& exp,
const GivPolMdDense::Element& P)
{
integer charac;
_domain.characteristic(charac);
double p = charac;
- typedef GivaroField<Modular<double> > GivModDouble;
+ typedef Givaro::Modular<double> GivModDouble;
typedef Givaro::Poly1FactorDom< GivModDouble, Givaro::Dense, GivModDouble::RandIter> PolysDouble;
@@ -220,7 +223,7 @@ namespace LinBox
PFD.CZfactor ( factors2, exp, static_cast<PolysDouble::Element>(P),p);
//std::cerr<<"factorization done"<<std::endl;
- factors.resize(factors2.size());
+ factors.resize((size_t)factors2.size());
std::vector<GivPolMdDense::Element* >::iterator itf = factors.begin();
std::vector<PolysDouble::Element >::const_iterator itf2 = factors2.begin();
for (; itf2 != factors2.end();++itf,++itf2){
diff --git a/linbox/ring/local-pir-modular.h b/linbox/ring/local-pir-modular.h
new file mode 100644
index 0000000..64aa45e
--- /dev/null
+++ b/linbox/ring/local-pir-modular.h
@@ -0,0 +1,174 @@
+/* Copyright (C) 2010 LinBox
+ *
+ *
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ * ========LICENCE========
+ */
+
+
+#ifndef __LINBOX_local_pir_modular_H
+#define __LINBOX_local_pir_modular_H
+
+#include <string>
+#include <givaro/modular.h>
+#include <givaro/givpower.h>
+
+#include "linbox/field/field-traits.h"
+
+// Namespace in which all LinBox code resides
+namespace LinBox
+{
+
+
+ template <typename intType>
+ class LocalPIRModular;
+
+ template <typename intType>
+ struct ClassifyRing<LocalPIRModular<intType> > {
+ typedef RingCategories::ModularTag categoryTag;
+ };
+
+ /// \ingroup ring
+ template <typename intType>
+ class LocalPIRModular : public Givaro::Modular<intType> {
+
+ public:
+
+ using Parent_t = Givaro::Modular<intType>;
+
+ using typename Givaro::Modular<intType>::Element;
+ //typedef typename Givaro::Modular<intType>::Element Element;
+
+ using typename Givaro::Modular<intType>::RandIter;
+
+ //No default cstor
+
+ LocalPIRModular (intType value, uint32_t exp = 1) :
+ Givaro::Modular<intType>(Givaro::power(value, exp)),
+ _irred(value),
+ _exponent(exp)
+ {}
+
+ ~LocalPIRModular() noexcept {};
+
+ using Parent_t:: zero;
+ using Parent_t:: one;
+ using Parent_t:: mOne;
+
+ using Parent_t:: minElement;
+ using Parent_t:: maxElement;
+
+ using Parent_t:: characteristic;
+ using Parent_t:: cardinality;
+
+ using Parent_t:: maxCardinality;
+ using Parent_t:: minCardinality;
+
+ // ----- Checkers
+ using Parent_t:: isZero;
+ using Parent_t:: isOne ;
+ using Parent_t:: isMOne;
+ using Parent_t:: areEqual;
+ using Parent_t:: length;
+
+ // ----- Ring-wise operators
+ using Parent_t:: operator==;
+ using Parent_t:: operator!=;
+ using Parent_t:: operator=;
+
+ // ----- Initialisation
+ using Parent_t:: init ;
+
+ using Parent_t:: assign ;
+
+ using Parent_t:: convert;
+
+ using Parent_t:: reduce ;
+
+ using Parent_t:: mul;
+ using Parent_t:: div;
+ using Parent_t:: add;
+ using Parent_t:: sub;
+ using Parent_t:: neg;
+ using Parent_t:: inv;
+
+ using Parent_t:: mulin;
+ using Parent_t:: divin;
+ using Parent_t:: addin;
+ using Parent_t:: subin;
+ using Parent_t:: negin;
+ using Parent_t:: invin;
+
+ using Parent_t:: axpy ;
+ using Parent_t:: axpyin;
+
+ using Parent_t:: axmy;
+ using Parent_t:: axmyin;
+
+ using Parent_t:: maxpy;
+ using Parent_t:: maxpyin;
+
+ // ----- Random generators
+ using typename Parent_t:: NonZeroRandIter;
+ using Parent_t:: random;
+ using Parent_t:: nonzerorandom;
+
+ // --- IO methods
+ using Parent_t:: read ;
+ using Parent_t:: write;
+
+ std::istream& read (std::istream& is)
+ { std::string s; return Parent_t::read(is >> s)>> s >> _irred >> s >> _exponent; }
+ std::ostream& write(std::ostream& os) const
+ { return Parent_t::write(os<<"Local- ") << "irred: " << _irred << ", exponent: " << _exponent; }
+
+ Element& gcdin (Element& a, const Element& b) const
+ {
+ Givaro::gcd(a, a, b);
+ Givaro::gcd(a, a, Parent_t::residu());
+ return reduce(a);
+ }
+
+
+ bool isUnit(const Element& a) const
+ {
+ Element g;
+ Givaro::gcd(g, a, _irred);
+ return isOne(g);
+ }
+
+
+ protected:
+ intType _irred;
+ uint32_t _exponent;
+ };
+
+}
+
+
+#endif //__LINBOX_local_pir_modular_H
+
+
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/ring/local2_32.h b/linbox/ring/local2_32.h
new file mode 100644
index 0000000..bdf0a83
--- /dev/null
+++ b/linbox/ring/local2_32.h
@@ -0,0 +1,262 @@
+/* Copyright (C) 2010 LinBox
+ * written by bds, wan
+ *
+ *
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ * ========LICENCE========
+ */
+
+
+#ifndef __LINBOX_local2_32_H
+#define __LINBOX_local2_32_H
+
+#include <givaro/zring.h>
+#include "linbox/util/debug.h"
+#include "linbox/linbox-config.h"
+#include "linbox/field/field-traits.h"
+#include "linbox/integer.h"
+
+namespace LinBox
+{
+
+ template<typename Ring>
+ struct ClassifyRing;
+
+ struct Local2_32;
+
+ template<>
+ struct ClassifyRing<Local2_32> {
+ typedef RingCategories::ModularTag categoryTag;
+ };
+
+ /** \brief Fast arithmetic mod 2^32, including gcd.
+ *
+ * Extend Givaro::ZRing<uint32_t> which is a representation
+ * of Z_2^32. It is especially fast because it uses hardware arithmetic
+ * directly. This ring is a Local Principal Ideal Ring.
+ *
+ * These needed PIR functions are added:
+ * gcdin(), isUnit(), also inv() is modified to work correctly.
+ * The type Exponent is added: more effective rep of the powers of 2,
+ * which are important because gcds are powers of 2).
+ * This entails some new versions of divin(), mulin(), isUnit().
+ *
+ * Those are the function needed for the LocalSmith algorithm.
+ * Further appropriate PIR functions may be added later.
+ * \ingroup field
+ */
+
+ struct Local2_32: public Givaro::ZRing<uint32_t>
+ {
+ public:
+
+ typedef Givaro::ZRing<uint32_t>::Element Element;
+ typedef enum {_min=0,_max=32} Exponent; // enum?
+ //Exponent& init(Exponent& a) { return a = 32; }
+
+ Local2_32 (int p=2, int exp=32) :
+ Givaro::ZRing<uint32_t>()
+ {
+ if(p != 2) throw PreconditionFailed(LB_FILE_LOC,"modulus must be 2");
+ if(exp != 32) throw PreconditionFailed(LB_FILE_LOC,"exponent must be 32");
+ }
+
+ inline Element& gcd(Element& c, const Element& a, const Element& b) const
+ { c = a | b;
+ if (c == 0) return c;
+ uint32_t i = 0;
+ while (! (c & 1)) {c >>= 1; ++i;}
+ return c = 1 << i;
+ }
+
+ inline Element& gcdin(Element& b, const Element& a) const
+ {
+ Element c = b; return gcd(b, c, a); }
+ /*
+ if (isZero(b)) return b = a;
+ Element d = b;
+ Exponent k;
+ int32_t i;
+ for ( i = 0; (i < k) && (!(d&1)); ++ i) d >>= 1;
+ k = Exponent(i);
+ gcdin(k, a);
+ return b = 1 << k;
+ }
+ */
+ // assume k is an exponent of 2.
+ inline Exponent& gcdin(Exponent& k, const Element& b) const
+ {
+ Element d = b;
+ int32_t i;
+ for ( i = 0; (i < k) && (!(d&1)); ++ i) d >>= 1;
+ return k = Exponent(i);
+ }
+
+ inline bool isUnit(const Element& a) const
+ { return a & 1; }
+
+ inline bool isUnit(const Exponent& a) const
+ { return a == 0; }
+
+ inline bool isZero(const Element& a) const
+ { return a == 0; }
+
+ inline bool isZero(const Exponent& a) const
+ { return a >= 32; }
+
+ //Element& div(Element& c, const Element& a, const Element& b) const
+ //{ return c = NTL::rep(a)/NTL::GCD(NTL::rep(a),NTL::rep(b)); }
+ //
+
+ inline Element& mulin(Element& a, const Exponent& k) const
+ {
+ if (k >= 32) return a = 0;
+ else return a <<= k;
+ }
+
+ inline Element& mulin(Element& a, const Element& b) const {
+ return a *= b;
+ }
+
+ inline Element& axpyin(Element& r, const Element& x, const Element& y) const{
+ return r += x * y;
+ }
+
+ /*
+ static inline bool isDivisor(Element a, Element b)
+ { while (! (a ^ 1))
+ { if (b ^ 1) return false;
+ a = a >> 1; b = b >> 1;
+ }
+ return true;
+ }
+ */
+
+ // assume k is an exponent of 2 and the power of 2 exactly divides a
+ inline Element& divin(Element& a, const Exponent& k) const
+ { return a >>= k; }
+
+ inline Element& inv(Element& a, const Element& b) const {
+
+ if (!isUnit(b))
+ throw PreconditionFailed(LB_FILE_LOC,"inv: not a unit");
+ else {
+
+ Element g, s, t;
+
+ xgcd(g, s, t, b, -b);
+
+ return a = s - t;
+ }
+ }
+
+ static inline integer maxCardinality()
+ { return integer( "4294967296" ); } // 2^32
+
+ protected:
+
+ Element& xgcd(Element& d, Element& s, Element& t, const Element& a, const Element& b) const
+ {
+
+ Element u, v, u0, v0, u1, v1, u2, v2, q, r;
+
+ u1 = 1; v1 = 0;
+ u2 = 0; v2 = 1;
+ u = a; v = b;
+
+ while (v != 0) {
+ q = u / v;
+ //r = u % v;
+ r = u - q*v;
+ u = v;
+ v = r;
+ u0 = u2;
+ v0 = v2;
+ u2 = u1 - q*u2;
+ v2 = v1- q*v2;
+ u1 = u0;
+ v1 = v0;
+ }
+
+
+ d = u;
+ s = u1;
+ t = v1;
+ return d;
+
+ }
+
+
+ /** @brief
+ * Half GCD
+ * g = gcd (a, b).
+ * exists t, such that: s * a + t * b = g.
+ * return g.
+ */
+ Element& HGCD (Element& g, Element& s, const Element& a, const Element& b) const {
+
+ Element u, v, u0, u1, u2, q, r;
+
+ u1 = 1;
+ u2 = 0;
+ u = a; v = b;
+
+ while (v != 0) {
+ q = u / v;
+ //r = u % v;
+ r = u - q*v;
+ u = v;
+ v = r;
+
+ u0 = u2;
+
+ u2 = u1 - q*u2;
+
+ u1 = u0;
+
+ }
+
+
+ g = u;
+ s = u1;
+
+ return g;
+
+ }
+
+ };
+
+ template<>
+ bool FieldTraits< Local2_32 >::goodModulus( const integer& i ) {
+ return i == Local2_32::maxCardinality();
+ }
+
+} // namespace LinBox
+
+#endif // __LINBOX_local2_32_H
+
+
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+
diff --git a/linbox/ring/modular.h b/linbox/ring/modular.h
new file mode 100644
index 0000000..9d5badd
--- /dev/null
+++ b/linbox/ring/modular.h
@@ -0,0 +1,156 @@
+/* linbox/ring/modular.h
+ * Copyright (C) 1999-2001 William J Turner,
+ * 2001 Bradford Hovinen
+ *
+ * Written by William J Turner <wjturner at math.ncsu.edu>,
+ * Bradford Hovinen <hovinen at cis.udel.edu>
+ *
+ * ------------------------------------
+ * 2002-04-10 Bradford Hovinen <hovinen at cis.udel.edu>
+ *
+ * LargeGivaro::Modular is now replace by a class Givaro::Modular parameterized on the element
+ * type. So, the old LargeGivaro::Modular is equivalent to Givaro::Modular<integer>. All other
+ * interface details are exactly the same.
+ *
+ * Renamed from large-modular.h to modular.h
+ * ------------------------------------
+ *
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ * ========LICENCE========
+ *.
+ */
+
+/*! @file ring/modular.h
+ * @ingroup ring
+ * @brief A Givaro::Modular ring is a representations of <code>Z/mZ</code>.
+ * This file groups many implementations/specialisations of modular rings.
+ * - Givaro::Modular arithmetic is provided in the <code>ModularXXX<T></code> classes.
+ * - Specialisations for \ref FieldAXPY, \ref MVProductDomain, \ref DotProductDomain.
+ * - Random Iterators
+ * .
+ *
+ * @bug move Element& init(const Element&) to FFPACK. use using more..
+ */
+
+#ifndef __LINBOX_ring_modular_H
+#define __LINBOX_ring_modular_H
+
+#include <givaro/modular.h>
+#include <givaro/modular-balanced.h>
+#include <givaro/gfq.h>
+#include <iostream>
+#include <climits>
+#include <cmath>
+
+#include "linbox/integer.h"
+#include "linbox/field/field-interface.h"
+#include "linbox/util/field-axpy.h"
+#include "linbox/util/write-mm.h"
+#include "linbox/vector/vector-traits.h"
+#include "linbox/linbox-config.h"
+#include "linbox/field/field-traits.h"
+
+
+// Namespace in which all LinBox code resides
+namespace LinBox
+{ /* Givaro::Modular Base */
+
+ using Givaro::Caster;
+
+ template <class Ring>
+ struct ClassifyRing;
+
+ template <class Element, class Compute>
+ struct ClassifyRing<Givaro::Modular<Element,Compute> const>
+ {
+ typedef RingCategories::ModularTag categoryTag;
+ };
+
+ template <class Element, class Compute>
+ struct ClassifyRing<Givaro::Modular<Element,Compute>>
+ {
+ typedef RingCategories::ModularTag categoryTag;
+ };
+
+ template<class Element>
+ struct ClassifyRing<Givaro::ModularBalanced<Element> > {
+ typedef RingCategories::ModularTag categoryTag;
+ };
+
+ template<typename XXX>
+ struct ClassifyRing<Givaro::GFqDom<XXX>> {
+ typedef RingCategories::ModularTag categoryTag;
+ };
+
+
+
+
+
+/*
+ template <>
+ inline std::ostream& Givaro::ModularBase<Integer>::write (std::ostream &os) const
+ {
+ return os << "GMP integers mod " << _modulus;
+ }
+*/
+
+ // template <>
+ // inline integer& Givaro::Modular<integer>::init (integer& x, const double& y) const
+ // {
+ // integer tmp = (integer)y % _modulus;
+ // if (tmp<0) tmp += _modulus;
+ // return x = tmp;
+ // }
+
+
+
+
+
+} // namespace LinBox
+
+
+#include "linbox/vector/vector-domain.h"
+
+namespace LinBox {
+ template<class Field>
+ class MVProductDomain ;
+
+} // LinBox
+
+
+/*! Specialization of FieldAXPY and DotProducts for parameterized modular field */
+#include "linbox/ring/modular/modular-int32.h"
+#include "linbox/ring/modular/modular-int64.h"
+#include "linbox/ring/modular/modular-short.h"
+#include "linbox/ring/modular/modular-byte.h"
+#include "linbox/ring/modular/modular-double.h"
+#include "linbox/ring/modular/modular-float.h"
+#include "linbox/ring/modular/modular-unsigned.h"
+
+#endif // __LINBOX_field_modular_H
+
+
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
+
diff --git a/linbox/ring/modular/Makefile.am b/linbox/ring/modular/Makefile.am
new file mode 100644
index 0000000..7234edb
--- /dev/null
+++ b/linbox/ring/modular/Makefile.am
@@ -0,0 +1,43 @@
+# Copyright (c) 2010 the LinBox group
+# ========LICENCE========
+# This file is part of the library LinBox.
+#
+# LinBox is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+#
+# This library 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
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+# ========LICENCE========
+
+
+
+pkgincludesubdir=$(pkgincludedir)/ring/modular
+
+BASIC_HDRS = \
+ modular-unsigned.h \
+ modular-unsigned.inl \
+ modular-int32.h \
+ modular-int64.h \
+ modular-short.h \
+ modular-byte.h \
+ modular-balanced-double.h \
+ modular-balanced-float.h \
+ modular-balanced-int32.h \
+ modular-balanced-int64.h \
+ modular-double.h \
+ modular-float.h
+
+
+pkgincludesub_HEADERS = \
+ $(BASIC_HDRS)
+
+# EXTRA_DIST = \
+ # modular.doxy
diff --git a/linbox/ring/modular/modular-balanced-double.h b/linbox/ring/modular/modular-balanced-double.h
new file mode 100644
index 0000000..b6868a6
--- /dev/null
+++ b/linbox/ring/modular/modular-balanced-double.h
@@ -0,0 +1,237 @@
+/* linbox/field/modular-balanced-double.h
+ * Copyright (C) 2003 Pascal Giorgi
+ * 2005,2008 Clement Pernet
+ * Written by Pascal Giorgi <pascal.giorgi at ens-lyon.fr>
+ * and Clement Pernet <Clement.Pernet at imag.fr>
+ *
+ * ------------------------------------
+ *
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ * ========LICENCE========
+ *.
+ */
+
+/*! @file field/modular/modular-balanced-double.h
+ * @ingroup field
+ * @brief Balanced representation of <code>Z/mZ</code> over \c double .
+ */
+
+#ifndef __LINBOX_modular_balanced_double_H
+#define __LINBOX_modular_balanced_double_H
+
+#ifdef __INTEL_COMPILER
+#define FmodF fmodf
+#else
+#define FmodF fmod
+#endif
+
+#include "linbox/linbox-config.h"
+#include "linbox/ring/modular.h"
+#include "linbox/integer.h"
+#include "linbox/vector/vector-domain.h"
+#include "linbox/field/field-interface.h"
+#include "linbox/field/field-traits.h"
+#include "linbox/util/field-axpy.h"
+#include "linbox/util/debug.h"
+#include <cmath>
+#include "linbox/field/field-traits.h"
+#include "linbox/randiter/modular-balanced.h"
+
+#include <givaro/modular-balanced-double.h>
+
+
+// Namespace in which all LinBox code resides
+namespace LinBox
+{
+
+ class MultiModDouble;
+
+ //! Specialization of FieldAXPY.
+ template <>
+ class FieldAXPY<Givaro::ModularBalanced<double> > {
+ public:
+
+ typedef double Element;
+ typedef double Abnormal;
+ typedef Givaro::ModularBalanced<double> Field;
+
+ FieldAXPY (const Field &F) :
+ _field (&F),
+ _y(0.) , _bound( (double) ((1ULL << 53) - (unsigned long) (field().characteristic()*field().characteristic())))
+ {}
+
+ FieldAXPY (const FieldAXPY &faxpy) :
+ _field (faxpy._field),
+ _y(faxpy._y), _bound(faxpy._bound)
+ {}
+
+ FieldAXPY<Givaro::ModularBalanced<double> > &operator = (const FieldAXPY &faxpy)
+ {
+ _field = faxpy._field;
+ _y= faxpy._y;
+ _bound= faxpy._bound;
+ return *this;
+ }
+
+ inline Element& mulacc (const Element &a, const Element &x)
+ {
+ // Element tmp= a*x;
+ // return accumulate(tmp);
+ return accumulate(a*x);
+ }
+
+ inline Element& accumulate (const Element &tmp)
+ {
+ _y += tmp;
+ if (_y > _bound)
+ return _y = fmod (_y, field().characteristic());
+ else
+ return _y;
+ }
+ inline Element& subumulate (const Element &tmp)
+ {
+ _y -= tmp;
+ if (_y < 0)
+ return _y += field().characteristic();
+ else
+ return _y;
+ }
+
+ inline Element& get (Element &y) {
+ _y = fmod (_y, field().characteristic());
+ return y=_y ;
+ }
+
+ inline FieldAXPY &assign (const Element y) {
+ _y = y;
+ return *this;
+ }
+
+ inline void reset() {
+ _y = 0.;
+ }
+
+ inline Element& set (const Element &tmp) {
+ _y = tmp;
+ if (_y > _bound)
+ return _y = fmod (_y, field().characteristic());
+ else
+ return _y;
+ }
+
+ inline const Field & field() const { return *_field; }
+ private:
+
+ const Field *_field;
+ double _y;
+ double _bound;
+ };
+
+
+ //! Specialization of DotProductDomain.
+ template <>
+ class DotProductDomain<Givaro::ModularBalanced<double> > : public VectorDomainBase<Givaro::ModularBalanced<double> > {
+ private:
+ double _bound;
+ size_t _nmax;
+
+ public:
+ typedef double Element;
+ DotProductDomain(){}
+ DotProductDomain (const Givaro::ModularBalanced<double> &F) :
+ VectorDomainBase<Givaro::ModularBalanced<double> > (F), _bound( (double) ( (1ULL<<53) - (unsigned long) (field().characteristic()*field().characteristic())))
+ {
+ _nmax= (size_t)floor((double(1<<26)* double(1<<26)*2.)/ (field().characteristic() * field().characteristic()));
+ }
+
+ using VectorDomainBase<Givaro::ModularBalanced<double> >::field;
+ protected:
+ template <class Vector1, class Vector2>
+ inline Element &dotSpecializedDD (Element &res, const Vector1 &v1, const Vector2 &v2) const
+ {
+
+ double y = 0.;
+ if (v1.size() < _nmax) {
+ for (size_t i = 0; i< v1.size();++i)
+ y += v1[i] * v2[i] ;
+ // y = fmod(y, field().characteristic());
+ field().init(res, y);
+ }
+ else{
+ size_t i=0;
+ double t = 0.;
+ for (;i< v1.size()- _nmax ;i=i+_nmax){
+ for (size_t j=i;j<i+_nmax;++j)
+ y += v1[j] * v2[j];
+ t+=fmod(y, field().characteristic());
+ y=0.;
+ }
+ for (;i < v1.size();++i)
+ y += v1[i] * v2[i];
+ t+=fmod(y, field().characteristic());
+ // y = fmod(t, field().characteristic());
+ field().init(res, t);
+ }
+ return res;
+ }
+
+ template <class Vector1, class Vector2>
+ inline Element &dotSpecializedDSP (Element &res, const Vector1 &v1, const Vector2 &v2) const
+ {
+
+ double y = 0.;
+
+
+ if (v1.first.size() < _nmax) {
+ for (size_t i=0;i<v1.first.size();++i)
+ y+= v1.second[i] * v2[v1.first[i]];
+ // y = fmod(y, field().characteristic());
+ field().init(res, y);
+ }
+ else {
+ double t =0.;
+ size_t i=0;
+ for (;i< v1.first.size()- _nmax ;i=i+_nmax){
+ for (size_t j=i;j<i+_nmax;++j)
+ y += v1.second[j] * v2[v1.first[j]];
+ t+=fmod(y, field().characteristic());
+ y=0.;
+ }
+ for (;i < v1.first.size();++i)
+ y += v1.second[i] * v2[v1.first[i]];
+ t+= fmod(y, field().characteristic());
+ // y = fmod(t, field().characteristic());
+ field().init(res, t);
+ }
+ return res ;
+ }
+ };
+}
+
+#endif //__LINBOX_modular_balanced_double_H
+
+
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+
diff --git a/linbox/ring/modular/modular-balanced-float.h b/linbox/ring/modular/modular-balanced-float.h
new file mode 100644
index 0000000..2f63eff
--- /dev/null
+++ b/linbox/ring/modular/modular-balanced-float.h
@@ -0,0 +1,232 @@
+/* field/modular-balanced-float.h
+ * Copyright (C) 2003 Pascal Giorgi
+ * 2005,2008 Clement Pernet
+ * Written by Clement Pernet <clement.pernet at gmail.com>
+ * Pascal Giorgi <pascal.giorgi at ens-lyon.fr>
+ * Modified Brice Boyer (briceboyer) <boyer.brice at gmail.com>
+ * ------------------------------------
+ *
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ * ========LICENCE========
+ *.
+ */
+
+/*! @file field/modular/modular-balanced-float.h
+ * @ingroup field
+ * @brief Balanced representation of <code>Z/mZ</code> over \c float .
+ */
+
+#ifndef __LINBOX_modular_balanced_float_H
+#define __LINBOX_modular_balanced_float_H
+
+#ifdef __INTEL_COMPILER
+#define FmodF fmodf
+#else
+#define FmodF fmod
+#endif
+
+#include "linbox/linbox-config.h"
+#include "linbox/integer.h"
+#include "linbox/ring/modular.h"
+#include "linbox/vector/vector-domain.h"
+#include "linbox/field/field-interface.h"
+#include "linbox/field/field-traits.h"
+#include "linbox/util/field-axpy.h"
+#include "linbox/util/debug.h"
+#include <cmath>
+#include "linbox/field/field-traits.h"
+#include "linbox/randiter/modular-balanced.h"
+
+#include <givaro/modular-balanced-float.h>
+
+
+// Namespace in which all LinBox code resides
+namespace LinBox
+{
+
+ class MultiModFloat;
+
+ template <>
+ class FieldAXPY<Givaro::ModularBalanced<float> > {
+ public:
+ typedef float Element;
+ typedef float Abnormal;
+ typedef Givaro::ModularBalanced<Element> Field;
+
+ FieldAXPY (const Field &F) :
+ _field (&F),
+ _y(0.) , _bound( (Element) (((1UL << 24) - (unsigned long) (field().characteristic()*field().characteristic()))))
+ {}
+
+ FieldAXPY (const FieldAXPY &faxpy) :
+ _field (faxpy._field),
+ _y(faxpy._y), _bound(faxpy._bound)
+ {}
+
+ FieldAXPY<Givaro::ModularBalanced<Element> > &operator = (const FieldAXPY &faxpy) {
+ _field = faxpy._field;
+ _y= faxpy._y;
+ _bound= faxpy._bound;
+ return *this;
+ }
+
+ inline Element& mulacc (const Element &a, const Element &x) {
+ // Element tmp= a*x;
+ // return accumulate(tmp);
+ return accumulate(a*x);
+ }
+
+ inline Element& accumulate (const Element &tmp) {
+ _y += tmp;
+ if (_y > _bound)
+ return _y = fmodf (_y, field().characteristic());
+ else
+ return _y;
+ }
+ inline Element& subumulate (const Element &tmp) {
+ _y -= tmp;
+ if (_y < 0)
+ return _y += field().characteristic();
+ else
+ return _y;
+ }
+
+ inline Element& get (Element &y) {
+ _y = fmodf (_y, field().characteristic());
+ return y=_y ;
+ }
+
+ inline FieldAXPY &assign (const Element y) {
+ _y = y;
+ return *this;
+ }
+
+ inline void reset() {
+ _y = 0.;
+ }
+
+ inline Element& set (const Element &tmp) {
+ _y = tmp;
+ if (_y > _bound)
+ return _y = fmodf (_y, field().characteristic());
+ else
+ return _y;
+ }
+
+ inline const Field & field() const { return *_field; }
+
+ private:
+ const Field *_field;
+ Element _y;
+ Element _bound;
+ };
+
+
+ template <>
+ class DotProductDomain<Givaro::ModularBalanced<float> > : public VectorDomainBase<Givaro::ModularBalanced<float> > {
+ public:
+ typedef float Element;
+ DotProductDomain(){}
+ DotProductDomain (const Givaro::ModularBalanced<Element> &F) :
+ VectorDomainBase<Givaro::ModularBalanced<Element> > (F), _bound( (Element) ( (1UL<<24) - (unsigned long) (field().characteristic()*field().characteristic())))
+ {
+ _nmax= (size_t)floor((Element(1<<11)* Element(1<<11)*2.)/ (field().characteristic() * field().characteristic()));
+ }
+
+ using VectorDomainBase<Givaro::ModularBalanced<Element> >::field;
+ protected:
+ template <class Vector1, class Vector2>
+ inline Element &dotSpecializedDD (Element &res, const Vector1 &v1, const Vector2 &v2) const
+ {
+
+ Element y = 0.;
+ if (v1.size() < _nmax) {
+ for (size_t i = 0; i< v1.size();++i)
+ y += v1[i] * v2[i] ;
+ y = fmodf(y, field().characteristic());
+ }
+ else{
+ Element t = 0.;
+ size_t i=0;
+ for (;i< v1.size()- _nmax ;i=i+_nmax){
+ for (size_t j=i;j<i+_nmax;++j)
+ y += v1[j] * v2[j];
+ t+= fmodf(y, field().characteristic());
+ y=0.;
+ }
+ for (;i < v1.size();++i)
+ y += v1[i] * v2[i];
+ t+= fmodf(y, field().characteristic());
+ y = fmodf(t, field().characteristic());
+ }
+ //!@bug should not be neccessary (use assign)
+ return field().init(res, y);
+ }
+
+ template <class Vector1, class Vector2>
+ inline Element &dotSpecializedDSP (Element &res, const Vector1 &v1, const Vector2 &v2) const
+ {
+
+ Element y = 0.;
+
+
+ if (v1.first.size() < _nmax) {
+ for (size_t i=0;i<v1.first.size();++i)
+ y+= v1.second[i] * v2[v1.first[i]];
+ y = fmodf(y, field().characteristic());
+ }
+ else {
+ Element t =0.;
+ size_t i=0;
+ for (;i< v1.first.size()- _nmax ;i=i+_nmax){
+ for (size_t j=i;j<i+_nmax;++j)
+ y += v1.second[j] * v2[v1.first[j]];
+ t+=fmodf(y, field().characteristic());
+ y=0.;
+ }
+ for (;i < v1.first.size();++i)
+ y += v1.second[i] * v2[v1.first[i]];
+ t+= fmodf(y, field().characteristic());
+ y = fmodf(t, field().characteristic());
+ }
+ //!@bug should not be neccessary (use assign)
+ return field().init(res, y);
+ }
+ private:
+ Element _bound;
+ size_t _nmax;
+
+ };
+} // Namespace LinBox
+
+#include "linbox/randiter/modular-balanced.h"
+
+#undef FmodF
+
+#endif //__LINBOX_modular_balanced_float_H
+
+
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+
diff --git a/linbox/ring/modular/modular-balanced-int32.h b/linbox/ring/modular/modular-balanced-int32.h
new file mode 100644
index 0000000..d5af755
--- /dev/null
+++ b/linbox/ring/modular/modular-balanced-int32.h
@@ -0,0 +1,265 @@
+/* Copyright (C) 2009 LinBox
+ * Written by C Pernet
+ * updated to compilable condition by Brice Boyer (briceboyer) <boyer.brice at gmail.com>
+ *
+ *
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ * ========LICENCE========
+ */
+
+
+/*! @file field/modular/modular-balanced-int32.h
+ * @ingroup field
+ * @brief Balanced representation of <code>Z/mZ</code> over \c int32_t .
+ */
+
+#ifndef __LINBOX_modular_balanced_int32_H
+#define __LINBOX_modular_balanced_int32_H
+
+
+#include "linbox/linbox-config.h"
+#include "linbox/integer.h"
+#include "linbox/vector/vector-domain.h"
+#include "linbox/ring/modular.h"
+#include "linbox/field/field-interface.h"
+#include "linbox/field/field-traits.h"
+#include "linbox/util/field-axpy.h"
+#include "linbox/util/debug.h"
+#include "linbox/field/field-traits.h"
+#include "linbox/field/modular/modular-int32.h"
+
+#include <givaro/modular-balanced-int32.h>
+
+#ifndef LINBOX_MAX_INT /* 2147483647 */
+#define LINBOX_MAX_INT INT32_MAX
+#endif
+
+
+// Namespace in which all LinBox code resides
+namespace LinBox
+{
+
+ template <>
+ class FieldAXPY<Givaro::ModularBalanced<int32_t> > {
+ public:
+
+ typedef int32_t Element;
+ typedef int64_t Abnormal;
+ typedef Givaro::ModularBalanced<int32_t> Field;
+
+ FieldAXPY (const Field &F) :
+ _field (&F),_y(0),_times(0)
+ {
+ }
+
+
+ FieldAXPY (const FieldAXPY &faxpy) :
+ _field (faxpy._field), _y (0),_times(0)
+ {}
+
+ FieldAXPY<Givaro::ModularBalanced<int32_t> > &operator = (const FieldAXPY &faxpy)
+ {
+ _field = faxpy._field;
+ _y = faxpy._y;
+ _times = faxpy._times;
+ return *this;
+ }
+
+ inline int64_t& mulacc (const Element &a, const Element &x)
+ {
+ int64_t t = (int64_t) a * (int64_t) x;
+ if (_times < blocksize) {
+ ++_times;
+ return _y += t;
+ }
+
+ else {
+ _times = 1;
+ normalize();
+ return _y += t;
+ }
+ }
+
+ inline int64_t& accumulate (const Element &t)
+ {
+ if (_times < blocksize) {
+ ++_times;
+ return _y += t;
+ }
+
+ else {
+ _times = 1;
+ normalize();
+ return _y += t;
+ }
+ }
+
+ inline Element& get (Element &y)
+ {
+
+ normalize();
+
+ y = Element(_y);
+
+ if (y > field().half_mod)
+ y -= field().characteristic();
+ else if (y < field().mhalf_mod)
+ y += field().characteristic();
+
+ return y;
+ }
+
+ inline FieldAXPY &assign (const Element y)
+ {
+ _y = y;
+ return *this;
+ }
+
+ inline void reset()
+ {
+ _y = 0;
+ }
+
+ inline const Field & field() const { return *_field; }
+
+ private:
+
+ const Field *_field;
+ int64_t _y;
+ int32_t _times;
+ static const int32_t blocksize = 32;
+
+ inline void normalize()
+ {
+ _y = (int32_t)_y -(int32_t)(int64_t)((double) _y * field().modulusinv) * (int32_t)field().characteristic();
+ }
+
+ };
+
+
+ template <>
+ class DotProductDomain<Givaro::ModularBalanced<int32_t> > : public VectorDomainBase<Givaro::ModularBalanced<int32_t> > {
+
+ private:
+ int32_t blocksize;
+
+ public:
+ typedef int32_t Element;
+ DotProductDomain(){}
+ DotProductDomain (const Givaro::ModularBalanced<int32_t> &F) :
+ VectorDomainBase<Givaro::ModularBalanced<int32_t> > (F) ,blocksize(32)
+ { }
+
+ using VectorDomainBase<Givaro::ModularBalanced<int32_t> >::field;
+ protected:
+ template <class Vector1, class Vector2>
+ inline Element &dotSpecializedDD (Element &res, const Vector1 &v1, const Vector2 &v2) const
+ {
+
+ typename Vector1::const_iterator pv1,pv1e;
+ typename Vector2::const_iterator pv2;
+
+ int64_t y = 0;
+ int64_t t;
+ // int32_t times = 0;
+
+ pv1 = pv1e = v1.begin();
+ pv2 = v2.begin();
+
+ for(size_t i = 0; i < v1.size() / (size_t)blocksize ;++i) {
+ pv1e = pv1e + blocksize;
+ for(;pv1 != pv1e;++pv1,++pv2) {
+ t = (((int64_t) *pv1 ) * ((int64_t) *pv2 ));
+ y += t;
+ }
+ normalize(y);
+ }
+
+ for(;pv1 != v1.end(); ++pv1, ++pv2) {
+ t = (((int64_t) *pv1 ) * ((int64_t) *pv2 ));
+ y += t;
+ }
+
+ normalize(y);
+ res = (Element) y;
+
+ if (res > field().half_mod) res -= field().characteristic();
+ else if(res < field().mhalf_mod) res += field().characteristic();
+
+ return res;
+
+ }
+
+ template <class Vector1, class Vector2>
+ inline Element &dotSpecializedDSP (Element &res, const Vector1 &v1, const Vector2 &v2) const
+ {
+
+ typename Vector1::first_type::const_iterator i_idx, i_idxe;
+ typename Vector1::second_type::const_iterator i_elt;
+
+ int64_t y = 0;
+ int64_t t;
+
+ i_idx = i_idxe = v1.first.begin();
+ i_elt = v1.second.begin();
+
+ for(size_t i = 0; i < v1.first.size() / (size_t)blocksize ; ++i) {
+ i_idxe = i_idxe + blocksize;
+ for(;i_idx!= i_idxe;++i_idx, ++i_elt) {
+ t = ( (int64_t) *i_elt ) * ( (int64_t) v2[*i_idx] );
+ y += t;
+ }
+ normalize(y);
+ }
+
+
+ for(;i_idx!= v1.first.end();++i_idx, ++i_elt) {
+ t = ( (int64_t) *i_elt ) * ( (int64_t) v2[*i_idx] );
+ y += t;
+ }
+
+ normalize(y);
+
+ res = (Element) y;
+ if (res > field().half_mod) res -= field().characteristic();
+ else if(res < field().mhalf_mod) res += field().characteristic();
+
+ return res;
+ }
+
+ inline void normalize(int64_t& _y) const
+ {
+ _y = (int32_t)_y -(int32_t)(int64_t)((double) _y * field().modulusinv) * (int32_t)field().characteristic();
+ }
+
+ };
+}
+
+#include "linbox/randiter/modular-balanced.h"
+
+#endif //__LINBOX_modular_balanced_int32_H
+
+
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/ring/modular/modular-balanced-int64.h b/linbox/ring/modular/modular-balanced-int64.h
new file mode 100644
index 0000000..c5790ce
--- /dev/null
+++ b/linbox/ring/modular/modular-balanced-int64.h
@@ -0,0 +1,271 @@
+/* Copyright (C) 2010 LinBox
+ * Adapted by Brice Boyer (briceboyer) <boyer.brice at gmail.com>
+ * (from other modular-balanced* files)
+ *
+ *
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ * ========LICENCE========
+ */
+
+
+/*! @file field/modular/modular-balanced-int64.h
+ * @ingroup field
+ * @brief Balanced representation of <code>Z/mZ</code> over \c int64_t .
+ */
+
+#ifndef __LINBOX_modular_balanced_int64_H
+#define __LINBOX_modular_balanced_int64_H
+
+#include "linbox/linbox-config.h"
+#include "linbox/integer.h"
+#include "linbox/vector/vector-domain.h"
+#include "linbox/ring/modular.h"
+#include "linbox/field/field-interface.h"
+#include "linbox/field/field-traits.h"
+#include "linbox/util/field-axpy.h"
+#include "linbox/util/debug.h"
+#include "linbox/field/field-traits.h"
+#include "linbox/field/modular/modular-int64.h"
+
+#include <givaro/modular-balanced-int64.h>
+
+#ifndef LINBOX_MAX_INT64
+#ifdef __x86_64__
+#define LINBOX_MAX_INT64 INT64_MAX
+#else
+#define LINBOX_MAX_INT64 INT64_MAX
+#endif
+#endif
+
+
+// Namespace in which all LinBox code resides
+namespace LinBox
+{
+
+
+ template <>
+ class FieldAXPY<Givaro::ModularBalanced<int64_t> > {
+ public:
+
+ typedef int64_t Element;
+ typedef int64_t Abnormal;
+ typedef Givaro::ModularBalanced<int64_t> Field;
+
+ FieldAXPY (const Field &F) :
+ _field (&F),_y(0),_times(0)
+ {
+ }
+
+
+ FieldAXPY (const FieldAXPY &faxpy) :
+ _field (faxpy._field), _y (0),_times(0)
+ {}
+
+ FieldAXPY<Givaro::ModularBalanced<int64_t> > &operator = (const FieldAXPY &faxpy)
+ {
+ _field = faxpy._field;
+ _y = faxpy._y;
+ _times = faxpy._times;
+ return *this;
+ }
+
+ inline int64_t& mulacc (const Element &a, const Element &x)
+ {
+ int64_t t = (int64_t) a * (int64_t) x;
+ if (_times < blocksize) {
+ ++_times;
+ return _y += t;
+ }
+
+ else {
+ _times = 1;
+ normalize();
+ return _y += t;
+ }
+ }
+
+ inline int64_t& accumulate (const Element &t)
+ {
+ if (_times < blocksize) {
+ ++_times;
+ return _y += t;
+ }
+
+ else {
+ _times = 1;
+ normalize();
+ return _y += t;
+ }
+ }
+
+ inline Element& get (Element &y)
+ {
+
+ normalize();
+
+ y = Element(_y);
+
+ if (y > field().half_mod)
+ y -= field().characteristic();
+ else if (y < field().mhalf_mod)
+ y += field().characteristic();
+
+ return y;
+ }
+
+ inline FieldAXPY &assign (const Element y)
+ {
+ _y = y;
+ return *this;
+ }
+
+ inline void reset()
+ {
+ _y = 0;
+ }
+
+ inline const Field & field() const { return *_field; }
+
+ private:
+
+ const Field *_field;
+ int64_t _y;
+ int64_t _times;
+ //!@todo tune me ?
+ static const int64_t blocksize = 32;
+
+ inline void normalize()
+ {
+ _y = (int64_t)_y -(int64_t)(int64_t)((double) _y * field().modulusinv) * (int64_t)field().characteristic();
+ }
+
+ };
+
+
+ template <>
+ class DotProductDomain<Givaro::ModularBalanced<int64_t> > : public virtual VectorDomainBase<Givaro::ModularBalanced<int64_t> > {
+
+ private:
+ int64_t blocksize;
+
+ public:
+ typedef int64_t Element;
+ DotProductDomain(){}
+ DotProductDomain (const Givaro::ModularBalanced<int64_t> &F) :
+ VectorDomainBase<Givaro::ModularBalanced<int64_t> > (F) ,blocksize(32)
+ { }
+
+ using VectorDomainBase<Givaro::ModularBalanced<int64_t> >::field;
+ protected:
+ template <class Vector1, class Vector2>
+ inline Element &dotSpecializedDD (Element &res, const Vector1 &v1, const Vector2 &v2) const
+ {
+
+ typename Vector1::const_iterator pv1,pv1e;
+ typename Vector2::const_iterator pv2;
+
+ int64_t y = 0;
+ int64_t t;
+ // int64_t times = 0;
+
+ pv1 = pv1e = v1.begin();
+ pv2 = v2.begin();
+
+ for(size_t i = 0; i < v1.size() / (size_t)blocksize ;++i) {
+ pv1e = pv1e + blocksize;
+ for(;pv1 != pv1e;++pv1,++pv2) {
+ t = (((int64_t) *pv1 ) * ((int64_t) *pv2 ));
+ y += t;
+ }
+ normalize(y);
+ }
+
+ for(;pv1 != v1.end(); ++pv1, ++pv2) {
+ t = (((int64_t) *pv1 ) * ((int64_t) *pv2 ));
+ y += t;
+ }
+
+ normalize(y);
+ res = (Element) y;
+
+ if (res > field().half_mod) res -= field().characteristic();
+ else if(res < field().mhalf_mod) res += field().characteristic();
+
+ return res;
+
+ }
+
+ template <class Vector1, class Vector2>
+ inline Element &dotSpecializedDSP (Element &res, const Vector1 &v1, const Vector2 &v2) const
+ {
+
+ typename Vector1::first_type::const_iterator i_idx, i_idxe;
+ typename Vector1::second_type::const_iterator i_elt;
+
+ int64_t y = 0;
+ int64_t t;
+
+ i_idx = i_idxe = v1.first.begin();
+ i_elt = v1.second.begin();
+
+ for(size_t i = 0; i < v1.first.size() / (size_t)blocksize ; ++i) {
+ i_idxe = i_idxe + blocksize;
+ for(;i_idx!= i_idxe;++i_idx, ++i_elt) {
+ t = ( (int64_t) *i_elt ) * ( (int64_t) v2[*i_idx] );
+ y += t;
+ }
+ normalize(y);
+ }
+
+
+ for(;i_idx!= v1.first.end();++i_idx, ++i_elt) {
+ t = ( (int64_t) *i_elt ) * ( (int64_t) v2[*i_idx] );
+ y += t;
+ }
+
+ normalize(y);
+
+ res = (Element) y;
+ if (res > field().half_mod) res -= field().characteristic();
+ else if(res < field().mhalf_mod) res += field().characteristic();
+
+ return res;
+ }
+
+ inline void normalize(int64_t& _y) const
+ {
+ _y = (int64_t)_y -(int64_t)(int64_t)((double) _y * field().modulusinv) * (int64_t)field().characteristic();
+ }
+
+ };
+}
+
+#undef LINBOX_MAX_INT64
+
+#endif //__LINBOX_modular_balanced_int64_H
+
+
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+
diff --git a/linbox/ring/modular/modular-byte.h b/linbox/ring/modular/modular-byte.h
new file mode 100644
index 0000000..57a83cb
--- /dev/null
+++ b/linbox/ring/modular/modular-byte.h
@@ -0,0 +1,388 @@
+/* Copyright (C) 2010 LinBox
+ *
+ *
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ * ========LICENCE========
+ */
+
+/*! @file field/modular/modular-byte.h
+ * @ingroup field
+ * @brief representation of <code>Z/mZ</code> over \c byte .
+ */
+#ifndef __LINBOX_modular_bit_H
+#define __LINBOX_modular_bit_H
+
+
+#include "linbox/linbox-config.h"
+#include "linbox/integer.h"
+#include "linbox/vector/vector-domain.h"
+#include "linbox/field/field-interface.h"
+#include "linbox/ring/modular.h"
+#include "linbox/field/field-traits.h"
+#include "linbox/util/debug.h"
+#include "linbox/field/field-traits.h"
+
+#ifndef LINBOX_MAX_INT8 /* 127 */
+#define LINBOX_MAX_INT8 INT8_MAX
+#endif
+
+#ifdef __ICC
+#pragma warning(disable:2259)
+#endif
+
+// Namespace in which all LinBox code resides
+namespace LinBox
+{
+
+ template<class Field>
+ class FieldAXPY;
+
+ template<class Field>
+ class DotProductDomain;
+
+ template<class Field>
+ class MVProductDomain;
+
+ template <>
+ class FieldAXPY<Givaro::Modular<int8_t> > {
+ public:
+
+ typedef int8_t Element;
+ typedef int64_t Abnormal;
+ typedef Givaro::Modular<int8_t> Field;
+
+ FieldAXPY (const Field &F) :
+ _field (&F),_y(0)
+ {
+ }
+
+ FieldAXPY (const FieldAXPY &faxpy) :
+ _field (faxpy._field), _y (0)
+ {}
+
+ FieldAXPY<Givaro::Modular<int8_t> > &operator = (const FieldAXPY &faxpy)
+ {
+ _field = faxpy._field;
+ _y = faxpy._y;
+
+ return *this;
+ }
+
+ inline uint64_t& mulacc (const Element &a, const Element &x)
+ {
+ uint64_t t = ( (uint16_t) a ) * ( (uint16_t) x );
+ return _y +=t;
+ }
+
+ inline uint64_t& accumulate (const Element &t)
+ {
+ return _y += (uint64_t)t;
+ }
+
+ inline Element& get (Element &y)
+ {
+ y = Element(_y % (uint64_t) field().characteristic());
+ return y;
+ }
+
+ inline FieldAXPY &assign (const Element y)
+ {
+ _y = (uint64_t) y;
+ return *this;
+ }
+
+ inline void reset()
+ {
+ _y = 0;
+ }
+
+ inline const Field & field() const { return *_field; }
+
+ private:
+
+ const Field *_field;
+ uint64_t _y;
+ // uint8_t _two_64; // BB : not used
+ };
+
+
+ template <>
+ class DotProductDomain<Givaro::Modular<int8_t> > : public VectorDomainBase<Givaro::Modular<int8_t> > {
+
+ public:
+ typedef int8_t Element;
+ DotProductDomain(){}
+ DotProductDomain (const Givaro::Modular<int8_t> &F) :
+ VectorDomainBase<Givaro::Modular<int8_t> > (F)
+ { }
+
+ using VectorDomainBase<Givaro::Modular<int8_t> >::field;
+ protected:
+ template <class Vector1, class Vector2>
+ inline Element &dotSpecializedDD (Element &res, const Vector1 &v1, const Vector2 &v2) const
+ {
+
+ typename Vector1::const_iterator i;
+ typename Vector2::const_iterator j;
+
+ uint64_t y = 0;
+ // uint64_t t;
+
+ for (i = v1.begin (), j = v2.begin (); i < v1.end (); ++i, ++j) {
+ y += ( (uint16_t) *i ) * ( (uint16_t) *j );
+ }
+
+
+ y %= (uint64_t) field().characteristic();
+
+ return res = (Element) y;
+
+ }
+
+ template <class Vector1, class Vector2>
+ inline Element &dotSpecializedDSP (Element &res, const Vector1 &v1, const Vector2 &v2) const
+ {
+ typename Vector1::first_type::const_iterator i_idx;
+ typename Vector1::second_type::const_iterator i_elt;
+
+ uint64_t y = 0;
+
+ for (i_idx = v1.first.begin (), i_elt = v1.second.begin (); i_idx != v1.first.end (); ++i_idx, ++i_elt) {
+ y += ( (uint16_t) *i_elt ) * ( (uint16_t) v2[*i_idx] );
+ }
+
+ y %= (uint64_t) field().characteristic();
+
+ return res = (Element)y;
+
+ }
+
+ };
+
+
+ template <>
+ class MVProductDomain<Givaro::Modular<int8_t> >
+ {
+ public:
+
+ typedef int8_t Element;
+
+ protected:
+ template <class Vector1, class Matrix, class Vector2>
+ inline Vector1 &mulColDense
+ (const VectorDomain<Givaro::Modular<int8_t> > &VD, Vector1 &w, const Matrix &A, const Vector2 &v) const
+ {
+ return mulColDenseSpecialized
+ (VD, w, A, v, VectorTraits<typename Matrix::Column>::VectorCategory ());
+ }
+
+ private:
+ template <class Vector1, class Matrix, class Vector2>
+ Vector1 &mulColDenseSpecialized
+ (const VectorDomain<Givaro::Modular<int8_t> > &VD, Vector1 &w, const Matrix &A, const Vector2 &v,
+ VectorCategories::DenseVectorTag) const;
+ template <class Vector1, class Matrix, class Vector2>
+ Vector1 &mulColDenseSpecialized
+ (const VectorDomain<Givaro::Modular<int8_t> > &VD, Vector1 &w, const Matrix &A, const Vector2 &v,
+ VectorCategories::SparseSequenceVectorTag) const;
+ template <class Vector1, class Matrix, class Vector2>
+ Vector1 &mulColDenseSpecialized
+ (const VectorDomain<Givaro::Modular<int8_t> > &VD, Vector1 &w, const Matrix &A, const Vector2 &v,
+ VectorCategories::SparseAssociativeVectorTag) const;
+ template <class Vector1, class Matrix, class Vector2>
+ Vector1 &mulColDenseSpecialized
+ (const VectorDomain<Givaro::Modular<int8_t> > &VD, Vector1 &w, const Matrix &A, const Vector2 &v,
+ VectorCategories::SparseParallelVectorTag) const;
+
+ mutable std::vector<uint64_t> _tmp;
+ };
+
+ template <class Vector1, class Matrix, class Vector2>
+ Vector1 &MVProductDomain<Givaro::Modular<int8_t> >::mulColDenseSpecialized
+ (const VectorDomain<Givaro::Modular<int8_t> > &VD, Vector1 &w, const Matrix &A, const Vector2 &v,
+ VectorCategories::DenseVectorTag) const
+ {
+
+ linbox_check (A.coldim () == v.size ());
+ linbox_check (A.rowdim () == w.size ());
+
+ typename Matrix::ConstColIterator i = A.colBegin ();
+ typename Vector2::const_iterator j;
+ typename Matrix::Column::const_iterator k;
+ std::vector<uint64_t>::iterator l;
+
+ uint64_t t;
+
+ if (_tmp.size () < w.size ())
+ _tmp.resize (w.size ());
+
+ std::fill (_tmp.begin (), _tmp.begin () + w.size (), 0);
+
+ for (j = v.begin (); j != v.end (); ++j, ++i) {
+ for (k = i->begin (), l = _tmp.begin (); k != i->end (); ++k, ++l) {
+ t = ((uint16_t) *k) * ((uint16_t) *j);
+
+ *l += t;
+
+ }
+ }
+
+ typename Vector1::iterator w_j;
+
+ for (w_j = w.begin (), l = _tmp.begin (); w_j != w.end (); ++w_j, ++l)
+ *w_j = *l % VD.field().characteristic();
+
+ return w;
+ }
+
+ template <class Vector1, class Matrix, class Vector2>
+ Vector1 &MVProductDomain<Givaro::Modular<int8_t> >::mulColDenseSpecialized
+ (const VectorDomain<Givaro::Modular<int8_t> > &VD, Vector1 &w, const Matrix &A, const Vector2 &v,
+ VectorCategories::SparseSequenceVectorTag) const
+ {
+ linbox_check (A.coldim () == v.size ());
+ linbox_check (A.rowdim () == w.size ());
+
+ typename Matrix::ConstColIterator i = A.colBegin ();
+ typename Vector2::const_iterator j;
+ typename Matrix::Column::const_iterator k;
+ std::vector<uint64_t>::iterator l;
+
+ uint64_t t;
+
+ if (_tmp.size () < w.size ())
+ _tmp.resize (w.size ());
+
+ std::fill (_tmp.begin (), _tmp.begin () + w.size (), 0);
+
+ for (j = v.begin (); j != v.end (); ++j, ++i) {
+ for (k = i->begin (), l = _tmp.begin (); k != i->end (); ++k, ++l) {
+ t = ((uint16_t) k->second) * ((uint16_t) *j);
+
+ _tmp[k->first] += t;
+
+ }
+ }
+
+ typename Vector1::iterator w_j;
+
+ for (w_j = w.begin (), l = _tmp.begin (); w_j != w.end (); ++w_j, ++l)
+ *w_j = *l % VD.field().characteristic();
+
+ return w;
+ }
+
+ template <class Vector1, class Matrix, class Vector2>
+ Vector1 &MVProductDomain<Givaro::Modular<int8_t> >::mulColDenseSpecialized
+ (const VectorDomain<Givaro::Modular<int8_t> > &VD, Vector1 &w, const Matrix &A, const Vector2 &v,
+ VectorCategories::SparseAssociativeVectorTag) const
+ {
+
+ linbox_check (A.coldim () == v.size ());
+ linbox_check (A.rowdim () == w.size ());
+
+ typename Matrix::ConstColIterator i = A.colBegin ();
+ typename Vector2::const_iterator j;
+ typename Matrix::Column::const_iterator k;
+ std::vector<uint64_t>::iterator l;
+
+ uint64_t t;
+
+ if (_tmp.size () < w.size ())
+ _tmp.resize (w.size ());
+
+ std::fill (_tmp.begin (), _tmp.begin () + w.size (), 0);
+
+ for (j = v.begin (); j != v.end (); ++j, ++i) {
+ for (k = i->begin (), l = _tmp.begin (); k != i->end (); ++k, ++l) {
+ t = ((uint16_t) k->second) * ((uint16_t) *j);
+
+ _tmp[k->first] += t;
+
+ }
+ }
+
+ typename Vector1::iterator w_j;
+
+ for (w_j = w.begin (), l = _tmp.begin (); w_j != w.end (); ++w_j, ++l)
+ *w_j = *l % VD.field().characteristic();
+
+ return w;
+ }
+
+ template <class Vector1, class Matrix, class Vector2>
+ Vector1 &MVProductDomain<Givaro::Modular<int8_t> >::mulColDenseSpecialized
+ (const VectorDomain<Givaro::Modular<int8_t> > &VD, Vector1 &w, const Matrix &A, const Vector2 &v,
+ VectorCategories::SparseParallelVectorTag) const
+ {
+
+ linbox_check (A.coldim () == v.size ());
+ linbox_check (A.rowdim () == w.size ());
+
+ typename Matrix::ConstColIterator i = A.colBegin ();
+ typename Vector2::const_iterator j;
+ typename Matrix::Column::first_type::const_iterator k_idx;
+ typename Matrix::Column::second_type::const_iterator k_elt;
+ std::vector<uint64_t>::iterator l;
+
+ uint64_t t;
+
+ if (_tmp.size () < w.size ())
+ _tmp.resize (w.size ());
+
+ std::fill (_tmp.begin (), _tmp.begin () + w.size (), 0);
+
+ for (j = v.begin (); j != v.end (); ++j, ++i) {
+ for (k_idx = i->first.begin (), k_elt = i->second.begin (), l = _tmp.begin ();
+ k_idx != i->first.end ();
+ ++k_idx, ++k_elt, ++l)
+ {
+ t = ((uint16_t) *k_elt) * ((uint16_t) *j);
+
+ _tmp[*k_idx] += t;
+
+ }
+ }
+
+ typename Vector1::iterator w_j;
+
+ for (w_j = w.begin (), l = _tmp.begin (); w_j != w.end (); ++w_j, ++l)
+ *w_j = *l % VD.field().characteristic();
+
+ return w;
+ }
+
+}
+
+#ifdef __ICC
+#pragma warning(enable:2259)
+#endif
+
+
+#endif //__LINBOX_modular_bit_H
+
+
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+
diff --git a/linbox/ring/modular/modular-double.h b/linbox/ring/modular/modular-double.h
new file mode 100644
index 0000000..28add17
--- /dev/null
+++ b/linbox/ring/modular/modular-double.h
@@ -0,0 +1,242 @@
+/* linbox/field/modular-double.h
+ * Copyright (C) 2003 Pascal Giorgi
+ *
+ * Written by Pascal Giorgi <pascal.giorgi at ens-lyon.fr>
+ *
+ * ------------------------------------
+ *
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ * ========LICENCE========
+ *.
+ */
+
+/*! @file field/modular/modular-double.h
+ * @ingroup field
+ * @brief Standard representation of <code>Z/mZ</code> over \c double .
+ */
+
+#ifndef __LINBOX_modular_double_H
+#define __LINBOX_modular_double_H
+
+#include <cmath>
+#include <givaro/modular-double.h>
+
+#include "linbox/linbox-config.h"
+#include "linbox/integer.h"
+#include "linbox/vector/vector-domain.h"
+#include "linbox/ring/modular.h"
+#include "linbox/field/field-interface.h"
+#include "linbox/field/field-traits.h"
+#include "linbox/util/field-axpy.h"
+#include "linbox/util/debug.h"
+
+#include "linbox/util/write-mm.h"
+
+
+// Namespace in which all LinBox code resides
+namespace LinBox
+{
+ class MultiModDouble;
+
+}
+
+
+// FieldAXPY/DotProductDomain
+namespace LinBox
+{
+ template <>
+ class FieldAXPY<Givaro::Modular<double> > {
+ public:
+
+ typedef double Element;
+ typedef double Abnormal;
+ typedef Givaro::Modular<double> Field;
+
+ FieldAXPY (const Field &F) :
+ _field (&F) , //_invmod(1./field().fcharacteristic()),
+ _y(0.) , _bound( (double) ((1_i64 << 53) - (uint64_t) (field().characteristic()*field().characteristic())))
+ {}
+
+ FieldAXPY (const FieldAXPY &faxpy) :
+ _field (faxpy._field),// _invmod(faxpy._invmod) ,
+ _y(faxpy._y), _bound(faxpy._bound)
+ {}
+
+#if 0
+ FieldAXPY<Givaro::Modular<double> > &operator = (const FieldAXPY &faxpy)
+ {
+ _field = faxpy._field;
+ //_invmod= faxpy._invmod;
+ _y= faxpy._y;
+ _bound= faxpy._bound;
+ return *this;
+ }
+#endif
+
+ Element& mulacc (const Element &a, const Element &x)
+ {
+ // Element tmp= a*x;
+ // return accumulate(tmp);
+ return accumulate(a*x);
+ }
+
+ Element& accumulate (const Element &tmp)
+ {
+ _y += tmp;
+ if (_y > _bound)
+ return _y = fmod (_y, field().fcharacteristic());
+ else
+ return _y;
+ }
+
+ Element& subumulate (const Element &tmp)
+ {
+ _y -= tmp;
+ if (_y < 0)
+ return _y += field().fcharacteristic();
+ else
+ return _y;
+ }
+
+ Element& get (Element &y)
+ {
+ _y = fmod (_y, field().fcharacteristic());
+ return y=_y ;
+ }
+
+ FieldAXPY &assign (const Element y)
+ {
+ _y = y;
+ return *this;
+ }
+
+ void reset()
+ {
+ _y = 0.;
+ }
+
+ Element& set (const Element &tmp)
+ {
+ _y = tmp;
+ if (_y > _bound)
+ return _y = fmod (_y, field().fcharacteristic());
+ else
+ return _y;
+ }
+
+ inline const Field & field() const { return *_field; }
+
+ protected:
+
+ const Field *_field;
+ //double _invmod;
+ double _y;
+ double _bound;
+ };
+
+ template <>
+ class DotProductDomain<Givaro::Modular<double> > : public VectorDomainBase<Givaro::Modular<double> > {
+ private:
+ // double _bound; // BB : not used
+ size_t _nmax;
+ //double _invmod;
+
+ public:
+ //DotProductDomain () { /*std::cerr << "DPD-Md def cstor" << std::endl;*/ }
+ typedef double Element;
+ DotProductDomain (const Givaro::Modular<double> &F) :
+ VectorDomainBase<Givaro::Modular<double> > (F)
+ // , _bound( (double) ( (1ULL<<53) - (unsigned long int) (F.characteristic()*F.characteristic())))
+ , _nmax(0)//, _invmod(1./field().characteristic())
+ {
+ _nmax= (size_t)floor((double(1<<26)* double(1<<26)*2.)/ (F.fcharacteristic() * F.fcharacteristic()));
+ _nmax = (_nmax>0?_nmax:1);
+ }
+
+ using VectorDomainBase<Givaro::Modular<double> >::field;
+
+ protected:
+ template <class Vector1, class Vector2>
+ Element &dotSpecializedDD (Element &res, const Vector1 &v1, const Vector2 &v2) const
+ {
+
+ double y = 0.;
+ if (v1.size() < _nmax) {
+ for (size_t i = 0; i< v1.size();++i)
+ y += v1[i] * v2[i] ;
+ y = fmod(y, field().fcharacteristic());
+ }
+ else{
+ double t = 0.;
+ size_t i=0;
+ for (;i< v1.size()- _nmax ;i=i+_nmax){
+ for (size_t j=i;j<i+_nmax;++j)
+ y += v1[j] * v2[j];
+ t+=fmod(y, field().fcharacteristic());
+ y=0.;
+ }
+ for (;i < v1.size();++i)
+ y += v1[i] * v2[i];
+ t+=fmod(y, field().fcharacteristic());
+ y = fmod(t, field().fcharacteristic());
+ }
+ return res = y;
+ }
+
+
+ template <class Vector1, class Vector2>
+ Element &dotSpecializedDSP (Element &res, const Vector1 &v1, const Vector2 &v2) const
+ {
+
+ double y = 0.;
+
+ if (v1.first.size() < _nmax) {
+ for (size_t i=0;i<v1.first.size();++i)
+ y+= v1.second[i] * v2[v1.first[i]];
+ y = fmod(y, field().fcharacteristic());
+ } else {
+ double t = 0.;
+ size_t i=0;
+ for (;i< v1.first.size()- _nmax ;i=i+_nmax){
+ for (size_t j=i;j<i+_nmax;++j)
+ y += v1.second[j] * v2[v1.first[j]];
+ t+=fmod(y, field().fcharacteristic());
+ y=0.;
+ }
+ for (;i < v1.first.size();++i)
+ y += v1.second[i] * v2[v1.first[i]];
+ t+= fmod(y, field().fcharacteristic());
+ y = fmod(t, field().fcharacteristic());
+ }
+ return res = y;
+ }
+ };
+}
+
+
+#endif //__LINBOX_modular_double_H
+
+
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/ring/modular/modular-float.h b/linbox/ring/modular/modular-float.h
new file mode 100644
index 0000000..c18d0fe
--- /dev/null
+++ b/linbox/ring/modular/modular-float.h
@@ -0,0 +1,214 @@
+/* linbox/field/modular-float.h
+ * Copyright (C) 2003 Pascal Giorgi
+ * 2007 Clement Pernet
+ * Written by Clement Pernet <cpernet at uwaterloo.ca>
+ *
+ * ------------------------------------
+ *
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ * ========LICENCE========
+ *.
+ */
+
+/*! @file field/modular/modular-float.h
+ * @ingroup field
+ * @brief representation of <code>Z/mZ</code> over \c float .
+ */
+
+#ifndef __LINBOX_modular_float_H
+#define __LINBOX_modular_float_H
+
+#ifdef __INTEL_COMPILER
+#define FmodF fmodf
+#else
+#define FmodF fmod
+#endif
+
+#include <cmath>
+#include <givaro/modular-float.h>
+
+#include "linbox/linbox-config.h"
+#include "linbox/integer.h"
+#include "linbox/vector/vector-domain.h"
+#include "linbox/ring/modular.h"
+#include "linbox/field/field-interface.h"
+#include "linbox/field/field-traits.h"
+#include "linbox/util/field-axpy.h"
+#include "linbox/util/debug.h"
+#include "linbox/field/field-traits.h"
+
+// Namespace in which all LinBox code resides
+namespace LinBox
+{
+ class MultiModFloat;
+
+ template <>
+ class FieldAXPY<Givaro::Modular<float> > {
+ public:
+
+ typedef float Element;
+ typedef float Abnormal;
+ typedef Givaro::Modular<float> Field;
+
+ FieldAXPY (const Field &F) :
+ _field (&F) , //_invmod(1./field().fcharacteristic()),
+ _y(0.) , _bound( (float) ( (1_i32 << 23) - (uint32_t) (field().characteristic()*field().characteristic())))
+ {}
+
+ FieldAXPY (const FieldAXPY &faxpy) :
+ _field (faxpy._field),// _invmod(faxpy._invmod) ,
+ _y(faxpy._y), _bound(faxpy._bound)
+ {}
+
+ inline Element& mulacc (const Element &a, const Element &x)
+ {
+ Element tmp= a*x;
+ return accumulate(tmp);
+ }
+
+ inline Element& accumulate (const Element &tmp)
+ {
+ _y += tmp;
+ if (_y > _bound)
+ return _y = fmodf (_y, field().fcharacteristic());
+ else
+ return _y;
+ }
+
+ inline Element& get (Element &y)
+ {
+ _y = fmodf (_y, field().fcharacteristic());
+ return y=_y ;
+ }
+
+ inline FieldAXPY &assign (const Element y)
+ {
+ _y = y;
+ return *this;
+ }
+
+ inline void reset()
+ {
+ _y = 0.;
+ }
+
+ inline const Field & field() const { return *_field; }
+
+ private:
+
+ const Field *_field;
+ //float _invmod;
+ float _y;
+ float _bound;
+ };
+
+
+ template <>
+ class DotProductDomain<Givaro::Modular<float> > : public VectorDomainBase<Givaro::Modular<float> > {
+ private:
+ float _bound;
+ size_t _nmax;
+ //float _invmod;
+
+ public:
+ typedef float Element;
+ DotProductDomain (const Givaro::Modular<float> &F) :
+ VectorDomainBase<Givaro::Modular<float> > (F)
+ , _bound( (float) ( (1<<23) - (uint32_t) (F.characteristic()*F.characteristic())))
+ //, _invmod(1./field().fcharacteristic())
+ {
+ _nmax= (size_t)floor((double(1<<11)* double(1<<12))/ double(F.fcharacteristic() * F.fcharacteristic()));
+ }
+
+ using VectorDomainBase<Givaro::Modular<float> >::field;
+ protected:
+ template <class Vector1, class Vector2>
+ inline Element &dotSpecializedDD (Element &res, const Vector1 &v1, const Vector2 &v2) const
+ {
+
+ float y = 0.;
+ if (v1.size() < _nmax) {
+ for (size_t i = 0; i< v1.size();++i)
+ y += v1[i] * v2[i] ;
+ y = fmodf(y, field().fcharacteristic());
+ }
+ else {
+ float t = 0.;
+ size_t i=0;
+ for (;i< v1.size()- _nmax ;i=i+_nmax)
+ {
+ for (size_t j=i;j<i+_nmax;++j)
+ y += v1[j] * v2[j];
+ t+=fmodf(y, field().fcharacteristic());
+ y=0.;
+ }
+ for (;i < v1.size();++i)
+ y += v1[i] * v2[i];
+ t+=fmodf(y, field().fcharacteristic());
+ y = fmodf(t, field().fcharacteristic());
+ }
+ return res = y;
+ }
+
+ template <class Vector1, class Vector2>
+ inline Element &dotSpecializedDSP (Element &res, const Vector1 &v1, const Vector2 &v2) const
+ {
+
+ float y = 0.;
+
+
+ if (v1.first.size() < _nmax)
+ {
+ for (size_t i=0;i<v1.first.size();++i)
+ y+= v1.second[i] * v2[v1.first[i]];
+ y = fmodf(y, field().fcharacteristic());
+ }
+ else
+ {
+ float t =0.;
+ size_t i=0;
+ for (;i< v1.first.size()- _nmax ;i=i+_nmax)
+ {
+ for (size_t j=i;j<i+_nmax;++j)
+ y += v1.second[j] * v2[v1.first[j]];
+ t+=fmodf(y, field().fcharacteristic());
+ y=0.;
+ }
+ for (;i < v1.first.size();++i)
+ y += v1.second[i] * v2[v1.first[i]];
+ t+= fmodf(y, field().fcharacteristic());
+ y = fmodf(t, field().fcharacteristic());
+ }
+ return res = y;
+ }
+ };
+}
+
+#undef FmodF
+
+#endif //__LINBOX_modular_float_H
+
+
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/ring/modular/modular-int32.h b/linbox/ring/modular/modular-int32.h
new file mode 100644
index 0000000..7c02cff
--- /dev/null
+++ b/linbox/ring/modular/modular-int32.h
@@ -0,0 +1,428 @@
+/* Copyright (C) 2010 LinBox
+ *
+ *
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ * ========LICENCE========
+ */
+
+/*! @file field/modular/modular-int32.h
+ * @ingroup field
+ * @brief representation of <code>Z/mZ</code> over \c int32_t .
+ */
+#ifndef __LINBOX_modular_int32_H
+#define __LINBOX_modular_int32_H
+
+
+#include <cmath>
+#include <givaro/modular-int32.h>
+
+#include "linbox/linbox-config.h"
+#include "linbox/integer.h"
+#include "linbox/vector/vector-domain.h"
+#include "linbox/field/field-interface.h"
+#include "linbox/field/field-traits.h"
+#include "linbox/ring/modular.h"
+#include "linbox/util/debug.h"
+#include "linbox/field/field-traits.h"
+#include "linbox/util/write-mm.h"
+
+#ifndef LINBOX_MAX_INT /* 2147483647 */
+#define LINBOX_MAX_INT INT32_MAX
+#endif
+
+// Namespace in which all LinBox code resides
+namespace LinBox
+{
+
+ template<class Field>
+ class DotProductDomain;
+ template<class Field>
+ class FieldAXPY;
+ template<class Field>
+ class MVProductDomain;
+
+ template <>
+ template<class Compute>
+ class FieldAXPY<Givaro::Modular<int32_t,Compute> > {
+ public:
+
+ typedef int32_t Element;
+ typedef int64_t Abnormal;
+ typedef Givaro::Modular<int32_t,Compute> Field;
+
+ FieldAXPY (const Field &F) : _field (&F), _y(0)
+ {
+ _two_64 = (uint64_t(1) << 32) % uint64_t(F.characteristic());
+ _two_64 = (_two_64 * _two_64) % uint64_t(F.characteristic());
+ }
+
+ FieldAXPY (const FieldAXPY &faxpy) :
+ _two_64 (faxpy._two_64), _field (faxpy._field), _y (0)
+ {}
+
+ FieldAXPY<Field > &operator = (const FieldAXPY &faxpy)
+ {
+ _field = faxpy._field;
+ _y = faxpy._y;
+ _two_64 = faxpy._two_64;
+ return *this;
+ }
+
+ uint64_t& mulacc (const Element &a, const Element &x)
+ {
+ uint64_t t = (uint64_t) a * (uint64_t) x;
+ _y += t;
+ if (_y < t) {
+ _y += _two_64;
+ return _y ;
+ }
+ else
+ return _y;
+ }
+
+ uint64_t& accumulate (const Element &t)
+ {
+ _y += (uint64_t) t;
+ if (_y < (uint64_t)t)
+ return _y += _two_64;
+ else
+ return _y;
+ }
+
+ Element& get (Element &y)
+ {
+ y = Element (_y % (uint64_t) field().characteristic());
+ return y;
+ }
+
+ FieldAXPY &assign (const Element y)
+ {
+ _y = (uint64_t) y;
+ return *this;
+ }
+
+ void reset()
+ {
+ _y = 0;
+ }
+
+ inline const Field & field() const { return *_field; }
+
+ public:
+ uint64_t _two_64;
+
+ protected:
+ const Field * _field;
+ uint64_t _y;
+ };
+
+
+ template <>
+ template <class Compute>
+ class DotProductDomain<Givaro::Modular<int32_t,Compute> > : public VectorDomainBase<Givaro::Modular<int32_t,Compute> > {
+
+ public:
+ typedef int32_t Element;
+ typedef Givaro::Modular<int32_t,Compute> Field;
+ DotProductDomain(){}
+ DotProductDomain (const Field&F) :
+ VectorDomainBase<Field> (F)
+ {}
+
+ using VectorDomainBase<Givaro::Modular<int32_t,Compute>>::faxpy;
+ using VectorDomainBase<Givaro::Modular<int32_t,Compute>>::field;
+
+
+ protected:
+ template <class Vector1, class Vector2>
+ Element &dotSpecializedDD (Element &res, const Vector1 &v1, const Vector2 &v2) const
+ {
+
+ typename Vector1::const_iterator i;
+ typename Vector2::const_iterator j;
+
+ uint64_t y = 0;
+ uint64_t t;
+
+ for (i = v1.begin (), j = v2.begin (); i < v1.end (); ++i, ++j)
+ {
+ t = ( (uint64_t) *i ) * ( (uint64_t) *j );
+ y += t;
+
+ if (y < t)
+ y += (uint64_t) faxpy()._two_64;
+ }
+
+ y %= (uint64_t) field().characteristic();
+ return res = Element(y);
+
+ }
+
+ template <class Vector1, class Vector2>
+ Element &dotSpecializedDSP (Element &res, const Vector1 &v1, const Vector2 &v2) const
+ {
+ typename Vector1::first_type::const_iterator i_idx;
+ typename Vector1::second_type::const_iterator i_elt;
+
+ uint64_t y = 0;
+ uint64_t t;
+
+ for (i_idx = v1.first.begin (), i_elt = v1.second.begin (); i_idx != v1.first.end (); ++i_idx, ++i_elt)
+ {
+ t = ( (uint64_t) *i_elt ) * ( (uint64_t) v2[*i_idx] );
+ y += t;
+
+ if (y < t)
+ y += (uint64_t) faxpy()._two_64;
+ }
+
+
+ y %= (uint64_t) field().characteristic();
+
+ return res = (Element) y;
+ }
+ };
+
+ // Specialization of MVProductDomain for int32_t modular field
+
+ template <>
+ template <class Compute>
+ class MVProductDomain<Givaro::Modular<int32_t,Compute> > {
+ public:
+
+ typedef int32_t Element;
+ typedef Givaro::Modular<int32_t,Compute> Field;
+
+ protected:
+ template <class Vector1, class Matrix, class Vector2>
+ Vector1 &mulColDense
+ (const VectorDomain<Field> &VD, Vector1 &w, const Matrix &A, const Vector2 &v) const
+ {
+ return mulColDenseSpecialized
+ (VD, w, A, v, typename VectorTraits<typename Matrix::Column>::VectorCategory ());
+ }
+
+ private:
+ template <class Vector1, class Matrix, class Vector2>
+ Vector1 &mulColDenseSpecialized
+ (const VectorDomain<Field > &VD, Vector1 &w, const Matrix &A, const Vector2 &v,
+ VectorCategories::DenseVectorTag) const;
+ template <class Vector1, class Matrix, class Vector2>
+ Vector1 &mulColDenseSpecialized
+ (const VectorDomain<Field > &VD, Vector1 &w, const Matrix &A, const Vector2 &v,
+ VectorCategories::SparseSequenceVectorTag) const;
+ template <class Vector1, class Matrix, class Vector2>
+ Vector1 &mulColDenseSpecialized
+ (const VectorDomain<Field > &VD, Vector1 &w, const Matrix &A, const Vector2 &v,
+ VectorCategories::SparseAssociativeVectorTag) const;
+ template <class Vector1, class Matrix, class Vector2>
+ Vector1 &mulColDenseSpecialized
+ (const VectorDomain<Field > &VD, Vector1 &w, const Matrix &A, const Vector2 &v,
+ VectorCategories::SparseParallelVectorTag) const;
+
+ mutable std::vector<uint64_t> _tmp;
+ };
+
+ template <class Compute>
+ template <class Vector1, class Matrix, class Vector2>
+ Vector1 &MVProductDomain<Givaro::Modular<int32_t,Compute> >::mulColDenseSpecialized
+ (const VectorDomain<Givaro::Modular<int32_t,Compute> > &VD, Vector1 &w, const Matrix &A, const Vector2 &v,
+ VectorCategories::DenseVectorTag) const
+ {
+
+ linbox_check (A.coldim () == v.size ());
+ linbox_check (A.rowdim () == w.size ());
+
+ typename Matrix::ConstColIterator i = A.colBegin ();
+ typename Vector2::const_iterator j;
+ typename Matrix::Column::const_iterator k;
+ std::vector<uint64_t>::iterator l;
+
+ uint64_t t;
+
+ if (_tmp.size () < w.size ())
+ _tmp.resize (w.size ());
+
+ std::fill (_tmp.begin (), _tmp.begin () +(ptrdiff_t) w.size (), 0);
+
+ for (j = v.begin (); j != v.end (); ++j, ++i)
+ {
+ for (k = i->begin (), l = _tmp.begin (); k != i->end (); ++k, ++l)
+ {
+ t = ((uint64_t) *k) * ((uint64_t) *j);
+
+ *l += t;
+
+ if (*l < t)
+ *l += (uint64_t) VD.faxpy ()._two_64;
+ }
+ }
+
+ typename Vector1::iterator w_j;
+ typedef typename Vector1::value_type elements ;
+
+ for (w_j = w.begin (), l = _tmp.begin (); w_j != w.end (); ++w_j, ++l)
+ *w_j = elements(*l % VD.field ().characteristic());
+
+ return w;
+ }
+
+ template <class Compute>
+ template <class Vector1, class Matrix, class Vector2>
+ Vector1 &MVProductDomain<Givaro::Modular<int32_t,Compute> >::mulColDenseSpecialized
+ (const VectorDomain<Givaro::Modular<int32_t,Compute> > &VD, Vector1 &w, const Matrix &A, const Vector2 &v,
+ VectorCategories::SparseSequenceVectorTag) const
+ {
+ linbox_check (A.coldim () == v.size ());
+ linbox_check (A.rowdim () == w.size ());
+
+ typename Matrix::ConstColIterator i = A.colBegin ();
+ typename Vector2::const_iterator j;
+ typename Matrix::Column::const_iterator k;
+ std::vector<uint64_t>::iterator l;
+
+ uint64_t t;
+
+ if (_tmp.size () < w.size ())
+ _tmp.resize (w.size ());
+
+ std::fill (_tmp.begin (), _tmp.begin () +(ptrdiff_t) w.size (), 0);
+
+ for (j = v.begin (); j != v.end (); ++j, ++i) {
+ for (k = i->begin (), l = _tmp.begin (); k != i->end (); ++k, ++l) {
+ t = ((uint64_t) k->second) * ((uint64_t) *j);
+
+ _tmp[k->first] += t;
+
+ if (_tmp[k->first] < t)
+ _tmp[k->first] += (uint64_t)VD.faxpy ()._two_64;
+ }
+ }
+
+ typename Vector1::iterator w_j;
+ typedef typename Vector1::value_type val_t;
+
+ for (w_j = w.begin (), l = _tmp.begin (); w_j != w.end (); ++w_j, ++l)
+ *w_j = (val_t)( (int32_t)(*l) % VD.field ().characteristic() );
+
+ return w;
+ }
+
+ template <class Compute>
+ template <class Vector1, class Matrix, class Vector2>
+ Vector1 &MVProductDomain<Givaro::Modular<int32_t,Compute> >::mulColDenseSpecialized
+ (const VectorDomain<Givaro::Modular<int32_t,Compute> > &VD, Vector1 &w, const Matrix &A, const Vector2 &v,
+ VectorCategories::SparseAssociativeVectorTag) const
+ {
+
+ linbox_check (A.coldim () == v.size ());
+ linbox_check (A.rowdim () == w.size ());
+
+ typename Matrix::ConstColIterator i = A.colBegin ();
+ typename Vector2::const_iterator j;
+ typename Matrix::Column::const_iterator k;
+ std::vector<uint64_t>::iterator l;
+
+ uint64_t t;
+
+ if (_tmp.size () < w.size ())
+ _tmp.resize (w.size ());
+
+ std::fill (_tmp.begin (), _tmp.begin () +(ptrdiff_t) w.size (), 0);
+
+ for (j = v.begin (); j != v.end (); ++j, ++i)
+ {
+ for (k = i->begin (), l = _tmp.begin (); k != i->end (); ++k, ++l)
+ {
+ t = ((uint64_t) k->second) * ((uint64_t) *j);
+
+ _tmp[k->first] += t;
+
+ if (_tmp[k->first] < t)
+ _tmp[k->first] += VD.faxpy ()._two_64;
+ }
+ }
+
+ typename Vector1::iterator w_j;
+
+ for (w_j = w.begin (), l = _tmp.begin (); w_j != w.end (); ++w_j, ++l)
+ *w_j = *l % VD.field ().characteristic();
+
+ return w;
+ }
+
+ template <class Compute>
+ template <class Vector1, class Matrix, class Vector2>
+ Vector1 &MVProductDomain<Givaro::Modular<int32_t,Compute> >::mulColDenseSpecialized
+ (const VectorDomain<Givaro::Modular<int32_t,Compute> > &VD, Vector1 &w, const Matrix &A, const Vector2 &v,
+ VectorCategories::SparseParallelVectorTag) const
+ {
+
+ linbox_check (A.coldim () == v.size ());
+ linbox_check (A.rowdim () == w.size ());
+
+ typename Matrix::ConstColIterator i = A.colBegin ();
+ typename Vector2::const_iterator j;
+ typename Matrix::Column::first_type::const_iterator k_idx;
+ typename Matrix::Column::second_type::const_iterator k_elt;
+ std::vector<uint64_t>::iterator l;
+
+ uint64_t t;
+
+ if (_tmp.size () < w.size ())
+ _tmp.resize (w.size ());
+
+ std::fill (_tmp.begin (), _tmp.begin () +(ptrdiff_t) w.size (), 0);
+
+ for (j = v.begin (); j != v.end (); ++j, ++i)
+ {
+ for (k_idx = i->first.begin (), k_elt = i->second.begin (), l = _tmp.begin ();
+ k_idx != i->first.end ();
+ ++k_idx, ++k_elt, ++l)
+ {
+ t = ((uint64_t) *k_elt) * ((uint64_t) *j);
+
+ _tmp[*k_idx] += t;
+
+ if (_tmp[*k_idx] < t)
+ _tmp[*k_idx] += VD.faxpy()._two_64;
+ }
+ }
+
+ typename Vector1::iterator w_j;
+
+ for (w_j = w.begin (), l = _tmp.begin (); w_j != w.end (); ++w_j, ++l)
+ *w_j = *l % VD.field().characteristic();
+
+ return w;
+ }
+
+
+}
+
+#endif //__LINBOX_modular_int32_H
+
+
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/ring/modular/modular-int64.h b/linbox/ring/modular/modular-int64.h
new file mode 100644
index 0000000..7a860a7
--- /dev/null
+++ b/linbox/ring/modular/modular-int64.h
@@ -0,0 +1,445 @@
+/* Copyright (C) 2010 LinBox
+ * Adapted by Brice Boyer (briceboyer) <boyer.brice at gmail.com>
+ * (from other modular-balanced* files)
+ *
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ * ========LICENCE========
+ */
+
+/*! @file field/modular/modular-int64.h
+ * @ingroup field
+ * @brief representation of <code>Z/mZ</code> over \c int64_t .
+ */
+#ifndef __LINBOX_modular_int64_H
+#define __LINBOX_modular_int64_H
+
+
+#include <cmath>
+#include "linbox/linbox-config.h"
+#include "linbox/integer.h"
+#include "linbox/ring/modular.h"
+#include "linbox/vector/vector-domain.h"
+#include "linbox/field/field-interface.h"
+#include "linbox/field/field-traits.h"
+#include "linbox/util/debug.h"
+#include "linbox/field/field-traits.h"
+
+#include <givaro/modular-int64.h>
+
+#ifndef LINBOX_MAX_INT64 /* 18446744073709551615L(L) is UINT64_MAX*/
+#ifdef __x86_64__
+#define LINBOX_MAX_INT64 INT64_MAX
+#else
+#define LINBOX_MAX_INT64 INT64_MAX
+#endif
+#endif
+
+// Namespace in which all LinBox code resides
+namespace LinBox
+{
+
+ template<class Field>
+ class DotProductDomain;
+ template<class Field>
+ class FieldAXPY;
+ template<class Field>
+ class MVProductDomain;
+
+ template <>
+ template <typename Compute_t>
+ class FieldAXPY<Givaro::Modular<int64_t,Compute_t> > {
+ public:
+
+ typedef int64_t Element;
+ typedef Givaro::Modular<int64_t,Compute_t> Field;
+
+ FieldAXPY (const Field &F) : _field (&F), _y(0)
+ {
+ _two_64 = (uint64_t(1) << 32) % uint64_t(F.characteristic());
+ _two_64 = (_two_64 * _two_64) % uint64_t(F.characteristic());
+ }
+
+ FieldAXPY (const FieldAXPY &faxpy) :
+ _two_64 (faxpy._two_64), _field (faxpy._field), _y (0)
+ {}
+
+ FieldAXPY<Field> &operator = (const FieldAXPY &faxpy)
+ {
+ _field = faxpy._field;
+ _y = faxpy._y;
+ _two_64 = faxpy._two_64;
+ return *this;
+ }
+
+ inline const Field & field() const { return *_field; }
+
+ inline uint64_t& mulacc (const Element &a, const Element &x)
+ {
+ uint64_t t = (uint64_t) a * (uint64_t) x;
+ _y += t;
+ if (_y < t)
+ return _y += _two_64;
+ else
+ return _y;
+ }
+
+ inline uint64_t& accumulate (const Element &t)
+ {
+ _y += (uint64_t)t;
+ if (_y < (uint64_t)t)
+ return _y += _two_64;
+ else
+ return _y;
+ }
+
+ inline Element& get (Element &y)
+ {
+ y =Element(_y % (uint64_t) field().characteristic());
+ return y;
+ }
+
+ inline FieldAXPY &assign (const Element y)
+ {
+ _y = (uint64_t)y;
+ return *this;
+ }
+
+ inline void reset()
+ {
+ _y = 0;
+ }
+
+ public:
+ uint64_t _two_64;
+
+ protected:
+ const Field *_field;
+ uint64_t _y;
+ };
+
+
+ template <>
+ template <typename Compute_t>
+ class DotProductDomain<Givaro::Modular<int64_t,Compute_t> > : public VectorDomainBase<Givaro::Modular<int64_t,Compute_t> > {
+
+ public:
+ typedef int64_t Element;
+ typedef Givaro::Modular<int64_t,Compute_t> Field;
+ using VectorDomainBase<Field>::faxpy;
+ using VectorDomainBase<Field>::field;
+ DotProductDomain(){}
+ DotProductDomain (const Field &F) :
+ VectorDomainBase<Field> (F)
+ {}
+
+
+ protected:
+ template <class Vector1, class Vector2>
+ inline Element &dotSpecializedDD (Element &res, const Vector1 &v1, const Vector2 &v2) const
+ {
+
+ typename Vector1::const_iterator i;
+ typename Vector2::const_iterator j;
+
+ uint64_t y = 0;
+ uint64_t t;
+
+ for (i = v1.begin (), j = v2.begin (); i < v1.end (); ++i, ++j)
+ {
+ t = ( (uint64_t) *i ) * ( (uint64_t) *j );
+ y += t;
+
+ if (y < t)
+ y += faxpy()._two_64;
+ }
+
+ y %= (uint64_t) field().characteristic();
+ return res = (Element)y;
+
+ }
+
+ template <class Vector1, class Vector2>
+ inline Element &dotSpecializedDSP (Element &res, const Vector1 &v1, const Vector2 &v2) const
+ {
+ typename Vector1::first_type::const_iterator i_idx;
+ typename Vector1::second_type::const_iterator i_elt;
+
+ uint64_t y = 0;
+ uint64_t t;
+
+ for (i_idx = v1.first.begin (), i_elt = v1.second.begin (); i_idx != v1.first.end (); ++i_idx, ++i_elt)
+ {
+ t = ( (uint64_t) *i_elt ) * ( (uint64_t) v2[*i_idx] );
+ y += t;
+
+ if (y < t)
+ y += faxpy()._two_64;
+ }
+
+
+ y %= (uint64_t) field().characteristic();
+
+ return res = (Element) y;
+ }
+ };
+
+ // Specialization of MVProductDomain for int64_t modular field
+
+ template <>
+ template <typename Compute_t>
+ class MVProductDomain<Givaro::Modular<int64_t,Compute_t> > {
+ public:
+
+ typedef int64_t Element;
+ typedef Givaro::Modular<int64_t,Compute_t> Field;
+
+ protected:
+ template <class Vector1, class Matrix, class Vector2>
+ inline Vector1 &mulColDense
+ (const VectorDomain<Field> &VD, Vector1 &w, const Matrix &A, const Vector2 &v) const
+ {
+ return mulColDenseSpecialized
+ (VD, w, A, v, typename VectorTraits<typename Matrix::Column>::VectorCategory ());
+ }
+
+ private:
+ template <class Vector1, class Matrix, class Vector2>
+ Vector1 &mulColDenseSpecialized
+ (const VectorDomain<Field> &VD, Vector1 &w, const Matrix &A, const Vector2 &v,
+ VectorCategories::DenseVectorTag) const;
+ template <class Vector1, class Matrix, class Vector2>
+ Vector1 &mulColDenseSpecialized
+ (const VectorDomain<Field > &VD, Vector1 &w, const Matrix &A, const Vector2 &v,
+ VectorCategories::SparseSequenceVectorTag) const;
+ template <class Vector1, class Matrix, class Vector2>
+ Vector1 &mulColDenseSpecialized
+ (const VectorDomain<Field > &VD, Vector1 &w, const Matrix &A, const Vector2 &v,
+ VectorCategories::SparseAssociativeVectorTag) const;
+ template <class Vector1, class Matrix, class Vector2>
+ Vector1 &mulColDenseSpecialized
+ (const VectorDomain<Field > &VD, Vector1 &w, const Matrix &A, const Vector2 &v,
+ VectorCategories::SparseParallelVectorTag) const;
+
+ mutable std::vector<uint64_t> _tmp;
+ };
+
+ template <typename Compute_t>
+ template <class Vector1, class Matrix, class Vector2>
+ Vector1 & MVProductDomain<Givaro::Modular<int64_t,Compute_t> >::
+ mulColDenseSpecialized (const VectorDomain<Givaro::Modular<int64_t,Compute_t> > &VD,
+ Vector1 &w,
+ const Matrix &A,
+ const Vector2 &v,
+ VectorCategories::DenseVectorTag) const
+ {
+
+ linbox_check (A.coldim () == v.size ());
+ linbox_check (A.rowdim () == w.size ());
+
+ typename Matrix::ConstColIterator i = A.colBegin ();
+ typename Vector2::const_iterator j;
+ typename Matrix::Column::const_iterator k;
+ std::vector<uint64_t>::iterator l;
+
+ uint64_t t;
+
+ if (_tmp.size () < w.size ())
+ _tmp.resize (w.size ());
+
+ std::fill (_tmp.begin (), _tmp.begin () + w.size (), 0);
+
+ for (j = v.begin (); j != v.end (); ++j, ++i)
+ {
+ for (k = i->begin (), l = _tmp.begin (); k != i->end (); ++k, ++l)
+ {
+ t = ((uint64_t) *k) * ((uint64_t) *j);
+
+ *l += t;
+
+ if (*l < t)
+ *l += VD.faxpy()._two_64;
+ }
+ }
+
+ typename Vector1::iterator w_j;
+
+ for (w_j = w.begin (), l = _tmp.begin (); w_j != w.end (); ++w_j, ++l)
+ *w_j = *l % VD.field ().characteristic();
+
+ return w;
+ }
+
+ template <typename Compute_t>
+ template <class Vector1, class Matrix, class Vector2>
+ Vector1 &MVProductDomain<Givaro::Modular<int64_t,Compute_t> >::
+ mulColDenseSpecialized (const VectorDomain<Givaro::Modular<int64_t,Compute_t> > &VD,
+ Vector1 &w,
+ const Matrix &A,
+ const Vector2 &v,
+ VectorCategories::SparseSequenceVectorTag) const
+ {
+ linbox_check (A.coldim () == v.size ());
+ linbox_check (A.rowdim () == w.size ());
+
+ typename Matrix::ConstColIterator i = A.colBegin ();
+ typename Vector2::const_iterator j;
+ typename Matrix::Column::const_iterator k;
+ std::vector<uint64_t>::iterator l;
+
+ uint64_t t;
+
+ if (_tmp.size () < w.size ())
+ _tmp.resize (w.size ());
+
+ std::fill (_tmp.begin (), _tmp.begin () + w.size (), 0);
+
+ for (j = v.begin (); j != v.end (); ++j, ++i)
+ {
+ for (k = i->begin (), l = _tmp.begin (); k != i->end (); ++k, ++l)
+ {
+ t = ((uint64_t) k->second) * ((uint64_t) *j);
+
+ _tmp[k->first] += t;
+
+ if (_tmp[k->first] < t)
+ _tmp[k->first] += VD.faxpy()._two_64;
+ }
+ }
+
+ typename Vector1::iterator w_j;
+
+ for (w_j = w.begin (), l = _tmp.begin (); w_j != w.end (); ++w_j, ++l)
+ *w_j = *l % VD.field ().characteristic();
+
+ return w;
+ }
+
+ template <typename Compute_t>
+ template <class Vector1, class Matrix, class Vector2>
+ Vector1 &MVProductDomain<Givaro::Modular<int64_t,Compute_t> > ::
+ mulColDenseSpecialized(const VectorDomain<Givaro::Modular<int64_t,Compute_t> > &VD,
+ Vector1 &w,
+ const Matrix &A,
+ const Vector2 &v,
+ VectorCategories::SparseAssociativeVectorTag) const
+ {
+
+ linbox_check (A.coldim () == v.size ());
+ linbox_check (A.rowdim () == w.size ());
+
+ typename Matrix::ConstColIterator i = A.colBegin ();
+ typename Vector2::const_iterator j;
+ typename Matrix::Column::const_iterator k;
+ std::vector<uint64_t>::iterator l;
+
+ uint64_t t;
+
+ if (_tmp.size () < w.size ())
+ _tmp.resize (w.size ());
+
+ std::fill (_tmp.begin (), _tmp.begin () + w.size (), 0);
+
+ for (j = v.begin (); j != v.end (); ++j, ++i)
+ {
+ for (k = i->begin (), l = _tmp.begin (); k != i->end (); ++k, ++l)
+ {
+ t = ((uint64_t) k->second) * ((uint64_t) *j);
+
+ _tmp[k->first] += t;
+
+ if (_tmp[k->first] < t)
+ _tmp[k->first] += VD.faxpy()._two_64;
+ }
+ }
+
+ typename Vector1::iterator w_j;
+
+ for (w_j = w.begin (), l = _tmp.begin (); w_j != w.end (); ++w_j, ++l)
+ *w_j = *l % VD.field ().characteristic();
+
+ return w;
+ }
+
+ template <typename Compute_t>
+ template <class Vector1, class Matrix, class Vector2>
+ Vector1 &MVProductDomain<Givaro::Modular<int64_t,Compute_t> > ::
+ mulColDenseSpecialized (const VectorDomain<Givaro::Modular<int64_t,Compute_t> > &VD,
+ Vector1 &w,
+ const Matrix &A,
+ const Vector2 &v,
+ VectorCategories::SparseParallelVectorTag) const
+ {
+
+ linbox_check (A.coldim () == v.size ());
+ linbox_check (A.rowdim () == w.size ());
+
+ typename Matrix::ConstColIterator i = A.colBegin ();
+ typename Vector2::const_iterator j;
+ typename Matrix::Column::first_type::const_iterator k_idx;
+ typename Matrix::Column::second_type::const_iterator k_elt;
+ std::vector<uint64_t>::iterator l;
+
+ uint64_t t;
+
+ if (_tmp.size () < w.size ())
+ _tmp.resize (w.size ());
+
+ std::fill (_tmp.begin (), _tmp.begin () + w.size (), 0);
+
+ for (j = v.begin (); j != v.end (); ++j, ++i)
+ {
+ for (k_idx = i->first.begin (), k_elt = i->second.begin (), l = _tmp.begin ();
+ k_idx != i->first.end ();
+ ++k_idx, ++k_elt, ++l)
+ {
+ t = ((uint64_t) *k_elt) * ((uint64_t) *j);
+
+ _tmp[*k_idx] += t;
+
+ if (_tmp[*k_idx] < t)
+ _tmp[*k_idx] += VD.faxpy()._two_64;
+ }
+ }
+
+ typename Vector1::iterator w_j;
+
+ for (w_j = w.begin (), l = _tmp.begin (); w_j != w.end (); ++w_j, ++l)
+ *w_j = *l % VD.field ().characteristic();
+
+ return w;
+ }
+
+
+}
+
+#undef LINBOX_MAX_INT64
+
+
+
+#endif //__LINBOX_modular_int64_H
+
+
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
+
diff --git a/linbox/ring/modular/modular-short.h b/linbox/ring/modular/modular-short.h
new file mode 100644
index 0000000..189b40e
--- /dev/null
+++ b/linbox/ring/modular/modular-short.h
@@ -0,0 +1,386 @@
+/* Copyright (C) 2010 LinBox
+ * Written by <?>
+ *
+ *
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ * ========LICENCE========
+ */
+
+/*! @file field/modular/modular-short.h
+ * @ingroup field
+ * @brief representation of <code>Z/mZ</code> over \c short .
+ */
+#ifndef __LINBOX_modular_short_H
+#define __LINBOX_modular_short_H
+
+
+#include "cmath"
+#include "linbox/linbox-config.h"
+#include "linbox/integer.h"
+#include "linbox/vector/vector-domain.h"
+#include "linbox/ring/modular.h"
+#include "linbox/field/field-interface.h"
+#include "linbox/util/debug.h"
+#include "linbox/field/field-traits.h"
+
+#ifndef LINBOX_MAX_INT16 /* 32767 */
+#define LINBOX_MAX_INT16 INT16_MAX
+#endif
+
+#ifdef __ICC /* pas content avec x = -x par exemple */
+#pragma warning(disable:2259)
+#endif
+
+// Namespace in which all LinBox code resides
+namespace LinBox
+{
+
+ template<class Field>
+ class FieldAXPY;
+
+ template<class Field>
+ class DotProductDomain;
+
+ template<class Field>
+ class MVProductDomain;
+
+ template <>
+ class FieldAXPY<Givaro::Modular<int16_t> > {
+ public:
+
+ typedef int16_t Element;
+ typedef int64_t Abnormal;
+ typedef Givaro::Modular<int16_t> Field;
+
+ FieldAXPY (const Field &F) :
+ _field (&F),_y(0)
+ {
+ }
+
+ FieldAXPY (const FieldAXPY &faxpy) :
+ _field (faxpy._field), _y (0)
+ {}
+
+ FieldAXPY<Givaro::Modular<int16_t> > &operator = (const FieldAXPY &faxpy)
+ {
+ _field = faxpy._field;
+ _y = faxpy._y;
+ return *this;
+ }
+
+ inline uint64_t& mulacc (const Element &a, const Element &x)
+ {
+ uint64_t t = ( (uint32_t) a ) * ( (uint32_t) x );
+ return _y+=t;
+ }
+
+ inline uint64_t& accumulate (const Element &t)
+ {
+ return _y += (uint64_t) t;
+ }
+
+ inline Element& get (Element &y)
+ {
+ y = Element(_y % (uint64_t) field().characteristic());
+ return y;
+ }
+
+ inline FieldAXPY &assign (const Element y)
+ {
+ _y = (uint64_t) y;
+ return *this;
+ }
+
+ inline void reset()
+ {
+ _y = 0;
+ }
+
+ inline const Field & field() const { return *_field; }
+
+ private:
+
+ const Field *_field;
+ uint64_t _y;
+ // uint16_t _two_64; // bb : NOT USED
+ };
+
+
+ template <>
+ class DotProductDomain<Givaro::Modular<int16_t> > : public VectorDomainBase<Givaro::Modular<int16_t> > {
+
+ public:
+ typedef int16_t Element;
+ DotProductDomain(){}
+ DotProductDomain (const Givaro::Modular<int16_t> &F) :
+ VectorDomainBase<Givaro::Modular<int16_t> > (F)
+ { }
+
+ using VectorDomainBase<Givaro::Modular<int16_t> >::field;
+
+ protected:
+ template <class Vector1, class Vector2>
+ inline Element &dotSpecializedDD (Element &res, const Vector1 &v1, const Vector2 &v2) const
+ {
+
+ typename Vector1::const_iterator i;
+ typename Vector2::const_iterator j;
+
+ uint64_t y = 0;
+ // uint64_t t;
+
+ for (i = v1.begin (), j = v2.begin (); i < v1.end (); ++i, ++j) {
+ y += ( (uint32_t) *i ) * ( (uint32_t) *j );
+ }
+
+ y %= (uint64_t) field().characteristic();
+
+ return res = (Element) y;
+
+ }
+
+ template <class Vector1, class Vector2>
+ inline Element &dotSpecializedDSP (Element &res, const Vector1 &v1, const Vector2 &v2) const
+ {
+ typename Vector1::first_type::const_iterator i_idx;
+ typename Vector1::second_type::const_iterator i_elt;
+
+ uint64_t y = 0;
+
+ for (i_idx = v1.first.begin (), i_elt = v1.second.begin (); i_idx != v1.first.end (); ++i_idx, ++i_elt) {
+ y += ( (uint32_t) *i_elt ) * ( (uint32_t) v2[*i_idx] );
+ }
+
+ y %= (uint64_t) field().characteristic();
+
+ return res = (Element) y;
+ }
+
+ };
+ // Specialization of MVProductDomain for int16_t modular field
+
+ template <>
+ class MVProductDomain<Givaro::Modular<int16_t> >
+ {
+ public:
+
+ typedef int16_t Element;
+
+ protected:
+ template <class Vector1, class Matrix, class Vector2>
+ inline Vector1 &mulColDense
+ (const VectorDomain<Givaro::Modular<int16_t> > &VD, Vector1 &w, const Matrix &A, const Vector2 &v) const
+ {
+ return mulColDenseSpecialized
+ (VD, w, A, v, typename VectorTraits<typename Matrix::Column>::VectorCategory ());
+ }
+
+ private:
+ template <class Vector1, class Matrix, class Vector2>
+ Vector1 &mulColDenseSpecialized
+ (const VectorDomain<Givaro::Modular<int16_t> > &VD, Vector1 &w, const Matrix &A, const Vector2 &v,
+ VectorCategories::DenseVectorTag) const;
+ template <class Vector1, class Matrix, class Vector2>
+ Vector1 &mulColDenseSpecialized
+ (const VectorDomain<Givaro::Modular<int16_t> > &VD, Vector1 &w, const Matrix &A, const Vector2 &v,
+ VectorCategories::SparseSequenceVectorTag) const;
+ template <class Vector1, class Matrix, class Vector2>
+ Vector1 &mulColDenseSpecialized
+ (const VectorDomain<Givaro::Modular<int16_t> > &VD, Vector1 &w, const Matrix &A, const Vector2 &v,
+ VectorCategories::SparseAssociativeVectorTag) const;
+ template <class Vector1, class Matrix, class Vector2>
+ Vector1 &mulColDenseSpecialized
+ (const VectorDomain<Givaro::Modular<int16_t> > &VD, Vector1 &w, const Matrix &A, const Vector2 &v,
+ VectorCategories::SparseParallelVectorTag) const;
+
+ mutable std::vector<uint64_t> _tmp;
+ };
+
+ template <class Vector1, class Matrix, class Vector2>
+ Vector1 &MVProductDomain<Givaro::Modular<int16_t> >::mulColDenseSpecialized
+ (const VectorDomain<Givaro::Modular<int16_t> > &VD, Vector1 &w, const Matrix &A, const Vector2 &v,
+ VectorCategories::DenseVectorTag) const
+ {
+
+ linbox_check (A.coldim () == v.size ());
+ linbox_check (A.rowdim () == w.size ());
+
+ typename Matrix::ConstColIterator i = A.colBegin ();
+ typename Vector2::const_iterator j;
+ typename Matrix::Column::const_iterator k;
+ std::vector<uint64_t>::iterator l;
+
+ uint64_t t;
+
+ if (_tmp.size () < w.size ())
+ _tmp.resize (w.size ());
+
+ std::fill (_tmp.begin (), _tmp.begin () + w.size (), 0);
+
+ for (j = v.begin (); j != v.end (); ++j, ++i) {
+ for (k = i->begin (), l = _tmp.begin (); k != i->end (); ++k, ++l) {
+ t = ((uint32_t) *k) * ((uint32_t) *j);
+
+ *l += t;
+
+ }
+ }
+
+ typename Vector1::iterator w_j;
+
+ for (w_j = w.begin (), l = _tmp.begin (); w_j != w.end (); ++w_j, ++l)
+ *w_j = *l % VD.field().characteristic();
+
+ return w;
+ }
+
+ template <class Vector1, class Matrix, class Vector2>
+ Vector1 &MVProductDomain<Givaro::Modular<int16_t> >::mulColDenseSpecialized
+ (const VectorDomain<Givaro::Modular<int16_t> > &VD, Vector1 &w, const Matrix &A, const Vector2 &v,
+ VectorCategories::SparseSequenceVectorTag) const
+ {
+ linbox_check (A.coldim () == v.size ());
+ linbox_check (A.rowdim () == w.size ());
+
+ typename Matrix::ConstColIterator i = A.colBegin ();
+ typename Vector2::const_iterator j;
+ typename Matrix::Column::const_iterator k;
+ std::vector<uint64_t>::iterator l;
+
+ uint64_t t;
+
+ if (_tmp.size () < w.size ())
+ _tmp.resize (w.size ());
+
+ std::fill (_tmp.begin (), _tmp.begin () + w.size (), 0);
+
+ for (j = v.begin (); j != v.end (); ++j, ++i) {
+ for (k = i->begin (), l = _tmp.begin (); k != i->end (); ++k, ++l) {
+ t = ((uint32_t) k->second) * ((uint32_t) *j);
+
+ _tmp[k->first] += t;
+
+ }
+ }
+
+ typename Vector1::iterator w_j;
+
+ for (w_j = w.begin (), l = _tmp.begin (); w_j != w.end (); ++w_j, ++l)
+ *w_j = *l % VD.field().characteristic();
+
+ return w;
+ }
+
+ template <class Vector1, class Matrix, class Vector2>
+ Vector1 &MVProductDomain<Givaro::Modular<int16_t> >::mulColDenseSpecialized
+ (const VectorDomain<Givaro::Modular<int16_t> > &VD, Vector1 &w, const Matrix &A, const Vector2 &v,
+ VectorCategories::SparseAssociativeVectorTag) const
+ {
+
+ linbox_check (A.coldim () == v.size ());
+ linbox_check (A.rowdim () == w.size ());
+
+ typename Matrix::ConstColIterator i = A.colBegin ();
+ typename Vector2::const_iterator j;
+ typename Matrix::Column::const_iterator k;
+ std::vector<uint64_t>::iterator l;
+
+ uint64_t t;
+
+ if (_tmp.size () < w.size ())
+ _tmp.resize (w.size ());
+
+ std::fill (_tmp.begin (), _tmp.begin () + w.size (), 0);
+
+ for (j = v.begin (); j != v.end (); ++j, ++i) {
+ for (k = i->begin (), l = _tmp.begin (); k != i->end (); ++k, ++l) {
+ t = ((uint32_t) k->second) * ((uint32_t) *j);
+
+ _tmp[k->first] += t;
+
+ }
+ }
+
+ typename Vector1::iterator w_j;
+
+ for (w_j = w.begin (), l = _tmp.begin (); w_j != w.end (); ++w_j, ++l)
+ *w_j = *l % VD.field().characteristic();
+
+ return w;
+ }
+
+ template <class Vector1, class Matrix, class Vector2>
+ Vector1 &MVProductDomain<Givaro::Modular<int16_t> >::mulColDenseSpecialized
+ (const VectorDomain<Givaro::Modular<int16_t> > &VD, Vector1 &w, const Matrix &A, const Vector2 &v,
+ VectorCategories::SparseParallelVectorTag) const
+ {
+
+ linbox_check (A.coldim () == v.size ());
+ linbox_check (A.rowdim () == w.size ());
+
+ typename Matrix::ConstColIterator i = A.colBegin ();
+ typename Vector2::const_iterator j;
+ typename Matrix::Column::first_type::const_iterator k_idx;
+ typename Matrix::Column::second_type::const_iterator k_elt;
+ std::vector<uint64_t>::iterator l;
+
+ uint64_t t;
+
+ if (_tmp.size () < w.size ())
+ _tmp.resize (w.size ());
+
+ std::fill (_tmp.begin (), _tmp.begin () + w.size (), 0);
+
+ for (j = v.begin (); j != v.end (); ++j, ++i) {
+ for (k_idx = i->first.begin (), k_elt = i->second.begin (), l = _tmp.begin ();
+ k_idx != i->first.end ();
+ ++k_idx, ++k_elt, ++l)
+ {
+ t = ((uint32_t) *k_elt) * ((uint32_t) *j);
+
+ _tmp[*k_idx] += t;
+
+ }
+ }
+
+ typename Vector1::iterator w_j;
+
+ for (w_j = w.begin (), l = _tmp.begin (); w_j != w.end (); ++w_j, ++l)
+ *w_j = *l % VD.field().characteristic();
+
+ return w;
+ }
+
+
+}
+
+#ifdef __ICC
+#pragma warning(enable:2259)
+#endif
+
+#endif //__LINBOX_modular_short_H
+
+
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/ring/modular/modular-unsigned.h b/linbox/ring/modular/modular-unsigned.h
new file mode 100755
index 0000000..ec7230a
--- /dev/null
+++ b/linbox/ring/modular/modular-unsigned.h
@@ -0,0 +1,686 @@
+/* linbox/ring/modular.h
+ * Copyright (C) 1999-2001 William J Turner,
+ * 2001 Bradford Hovinen
+ * Copyright (C) 2011 LinBox
+ *
+ * Written by William J Turner <wjturner at math.ncsu.edu>,
+ * Bradford Hovinen <hovinen at cis.udel.edu>
+ *
+ * ------------------------------------
+ * 2002-04-10 Bradford Hovinen <hovinen at cis.udel.edu>
+ *
+ * LargeModular is now replace by a class Givaro::Modular parameterized on the element
+ * type. So, the old LargeModular is equivalent to Givaro::Modular<integer>. All other
+ * interface details are exactly the same.
+ *
+ * Renamed from large-modular.h to modular.h
+ * ------------------------------------
+ *
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ * ========LICENCE========
+ *.
+ */
+
+#ifndef __LINBOX_field_modular_unsigned_H
+#define __LINBOX_field_modular_unsigned_H
+
+namespace LinBox { /* uint8_t */
+
+ /*! Specialization of FieldAXPY for uint8_t modular field */
+
+ template <>
+ template<class Compute_t>
+ class FieldAXPY<Givaro::Modular<uint8_t,Compute_t > > {
+ public:
+
+ typedef uint8_t Element;
+ typedef uint64_t Abnormal;
+ typedef Givaro::Modular<uint8_t, Compute_t> Field;
+
+ FieldAXPY (const Field &F) :
+ _k (((uint64_t) -1LL) / ((F.characteristic() - 1) * (F.characteristic() - 1))),
+ _field (&F),
+ _y (0),
+ i (_k)
+ {
+ }
+
+ FieldAXPY (const FieldAXPY &faxpy) :
+ _k (faxpy._k),
+ _field (faxpy._field),
+ _y (0),
+ i (_k)
+ {}
+
+ FieldAXPY<Field> &operator = (const FieldAXPY &faxpy)
+ {
+ _field = faxpy._field;
+ _y = faxpy._y;
+ _k = faxpy._k;
+ return *this;
+ }
+
+ inline uint64_t& mulacc (const Element &a, const Element &x)
+ {
+ uint32_t t = (uint32_t) a * (uint32_t) x;
+
+ if (!i--) {
+ i = int(_k);
+ return _y = _y % (uint32_t) field().characteristic() + t;
+ }
+ else
+ return _y += t;
+ }
+
+ inline uint64_t& accumulate (const Element &t)
+ {
+
+ if (!i--) {
+ i = int(_k);
+ return _y = _y % (uint32_t) field().characteristic() + t;
+ }
+ else
+ return _y += t;
+ }
+
+ inline Element &get (Element &y) const
+ {
+ const_cast<FieldAXPY<Field>*>(this)->_y %= (uint32_t) field().characteristic();
+ if ((int32_t) _y < 0) const_cast<FieldAXPY<Field>*>(this)->_y += field().characteristic();
+ y = (uint8_t) _y;
+ const_cast<FieldAXPY<Field>*>(this)->i = int(_k);
+ return y;
+ }
+
+ inline FieldAXPY &assign (const Element y)
+ {
+ _y = y;
+ i = int(_k);
+ return *this;
+ }
+
+ inline void reset()
+ {
+ _y = 0;
+ }
+
+ inline const Field & field() const { return *_field; }
+
+ public:
+ uint64_t _k;
+
+ private:
+ const Field *_field;
+ uint64_t _y;
+ int64_t i;
+ };
+
+ //! Specialization of DotProductDomain for unsigned short modular field
+
+ template <>
+ template <class Compute_t>
+ class DotProductDomain<Givaro::Modular<uint8_t, Compute_t> > : public VectorDomainBase<Givaro::Modular<uint8_t, Compute_t> > {
+ public:
+
+ typedef uint8_t Element;
+ typedef Givaro::Modular<uint8_t, Compute_t> Field;
+
+ DotProductDomain(){}
+ DotProductDomain (const Field &F) :
+ VectorDomainBase<Field> (F)
+ {}
+ using VectorDomainBase<Field>::field;
+ using VectorDomainBase<Field>::faxpy;
+
+ protected:
+ template <class Vector1, class Vector2>
+ inline Element &dotSpecializedDD (Element &res, const Vector1 &v1, const Vector2 &v2) const;
+ template <class Vector1, class Vector2>
+ inline Element &dotSpecializedDSP (Element &res, const Vector1 &v1, const Vector2 &v2) const;
+
+ };
+
+ //! Specialization of MVProductDomain for uint8_t modular field
+
+ template <>
+ template<class Compute_t>
+ class MVProductDomain<Givaro::Modular<uint8_t,Compute_t> > {
+ public:
+
+ typedef uint8_t Element;
+ typedef Givaro::Modular<uint8_t,Compute_t> Field;
+
+ protected:
+ template <class Vector1, class Matrix, class Vector2>
+ inline Vector1 &mulColDense
+ (const VectorDomain<Field> &VD, Vector1 &w, const Matrix &A, const Vector2 &v) const
+ {
+ return mulColDenseSpecialized (VD, w, A, v, typename VectorTraits<typename Matrix::Column>::VectorCategory ());
+ }
+
+ private:
+ template <class Vector1, class Matrix, class Vector2>
+ Vector1 &mulColDenseSpecialized
+ (const VectorDomain<Field> &VD, Vector1 &w, const Matrix &A, const Vector2 &v,
+ VectorCategories::DenseVectorTag) const;
+ template <class Vector1, class Matrix, class Vector2>
+ Vector1 &mulColDenseSpecialized
+ (const VectorDomain<Field> &VD, Vector1 &w, const Matrix &A, const Vector2 &v,
+ VectorCategories::SparseSequenceVectorTag) const;
+ template <class Vector1, class Matrix, class Vector2>
+ Vector1 &mulColDenseSpecialized
+ (const VectorDomain<Field > &VD, Vector1 &w, const Matrix &A, const Vector2 &v,
+ VectorCategories::SparseAssociativeVectorTag) const;
+ template <class Vector1, class Matrix, class Vector2>
+ Vector1 &mulColDenseSpecialized
+ (const VectorDomain<Field > &VD, Vector1 &w, const Matrix &A, const Vector2 &v,
+ VectorCategories::SparseParallelVectorTag) const;
+
+ mutable std::vector<uint32_t> _tmp;
+ };
+
+}
+
+namespace LinBox { /* uint16_t */
+
+ /*! Specialization of FieldAXPY for uint16_t modular field */
+ template <>
+ template<class Compute_t>
+ class FieldAXPY<Givaro::Modular<uint16_t,Compute_t> > {
+ public:
+
+ typedef uint16_t Element;
+ typedef Givaro::Modular<uint16_t,Compute_t> Field;
+
+ FieldAXPY (const Field &F) :
+ _k (((uint64_t) -1LL) / ((F.characteristic() - 1) * (F.characteristic() - 1))),
+ _field (&F),
+ _y (0),
+ i (_k)
+ {}
+
+ FieldAXPY (const FieldAXPY &faxpy) :
+ _k (faxpy._k), _field (faxpy._field), _y (0), i (_k)
+ {}
+
+ FieldAXPY<Field > &operator = (const FieldAXPY &faxpy)
+ {
+ _field = faxpy._field;
+ _y = faxpy._y;
+ _k = faxpy._k;
+ return *this;
+ }
+
+ inline uint64_t& mulacc (const Element &a, const Element &x)
+ {
+ uint64_t t = (uint64_t) ((long long) a * (long long) x);
+
+ if (!i--) {
+ i = (int)_k;
+ return _y = _y % (uint64_t) field().characteristic() + t;
+ }
+ else
+ return _y += t;
+ }
+
+ inline uint64_t& accumulate (const Element &t)
+ {
+ if (!i--) {
+ i = (int)_k;
+ return _y = _y % (uint64_t) field().characteristic() + t;
+ }
+ else
+ return _y += t;
+ }
+
+ inline Element &get (Element &y) const
+ {
+ const_cast<FieldAXPY<Field>*>(this)->_y %= (uint64_t) field().characteristic();
+ if ((int64_t) _y < 0) const_cast<FieldAXPY<Field>*>(this)->_y += field().characteristic();
+ y = (uint16_t) _y;
+ const_cast<FieldAXPY<Field>*>(this)->i = int(_k);
+ return y;
+ }
+
+ inline FieldAXPY &assign (const Element y)
+ {
+ _y = y;
+ i = (int)_k;
+ return *this;
+ }
+
+ inline void reset()
+ {
+ _y = 0;
+ }
+
+ inline const Field & field() const {return *_field;}
+
+ public:
+ uint64_t _k;
+
+ private:
+ const Field *_field;
+ uint64_t _y;
+ int64_t i;
+ };
+
+ //! Specialization of DotProductDomain for unsigned short modular field
+
+ template <>
+ template<class Compute_t>
+ class DotProductDomain<Givaro::Modular<uint16_t,Compute_t> > : public VectorDomainBase<Givaro::Modular<uint16_t,Compute_t> > {
+ public:
+
+ typedef uint16_t Element;
+ typedef Givaro::Modular<uint16_t,Compute_t> Field;
+
+ DotProductDomain () {}
+ DotProductDomain (const Field &F) :
+ VectorDomainBase<Field > (F)
+ {}
+ using VectorDomainBase<Field>::field;
+ using VectorDomainBase<Field>::faxpy;
+
+ protected:
+ template <class Vector1, class Vector2>
+ inline Element &dotSpecializedDD (Element &res, const Vector1 &v1, const Vector2 &v2) const;
+
+ template <class Vector1, class Vector2>
+ inline Element &dotSpecializedDSP (Element &res, const Vector1 &v1, const Vector2 &v2) const;
+
+ };
+
+ //! Specialization of MVProductDomain for uint16_t modular field
+
+ template <>
+ template<class Compute_t>
+ class MVProductDomain<Givaro::Modular<uint16_t,Compute_t> > {
+ public:
+
+ typedef uint16_t Element;
+ typedef Givaro::Modular<uint16_t,Compute_t> Field;
+ protected:
+ template <class Vector1, class Matrix, class Vector2>
+ inline Vector1 &mulColDense
+ (const VectorDomain<Field > &VD, Vector1 &w, const Matrix &A, const Vector2 &v) const
+ {
+ return mulColDenseSpecialized (VD, w, A, v, VectorTraits<typename Matrix::Column>::VectorCategory ());
+ }
+
+ private:
+ template <class Vector1, class Matrix, class Vector2>
+ Vector1 &mulColDenseSpecialized
+ (const VectorDomain<Field > &VD, Vector1 &w, const Matrix &A, const Vector2 &v,
+ VectorCategories::DenseVectorTag) const;
+ template <class Vector1, class Matrix, class Vector2>
+ Vector1 &mulColDenseSpecialized
+ (const VectorDomain<Field > &VD, Vector1 &w, const Matrix &A, const Vector2 &v,
+ VectorCategories::SparseSequenceVectorTag) const;
+ template <class Vector1, class Matrix, class Vector2>
+ Vector1 &mulColDenseSpecialized
+ (const VectorDomain<Field > &VD, Vector1 &w, const Matrix &A, const Vector2 &v,
+ VectorCategories::SparseAssociativeVectorTag) const;
+ template <class Vector1, class Matrix, class Vector2>
+ Vector1 &mulColDenseSpecialized
+ (const VectorDomain<Field > &VD, Vector1 &w, const Matrix &A, const Vector2 &v,
+ VectorCategories::SparseParallelVectorTag) const;
+
+ mutable std::vector<uint64_t> _tmp;
+ };
+
+}
+
+#include <givaro/modular-uint32.h>
+
+namespace LinBox { /* uint32_t */
+
+ template<class Field>
+ class DotProductDomain;
+ template<class Field>
+ class FieldAXPY;
+ template<class Field>
+ class MVProductDomain;
+
+
+ /*! Specialization of FieldAXPY for unsigned short modular field */
+
+ template <>
+ template<class Compute_t>
+ class FieldAXPY<Givaro::Modular<uint32_t, Compute_t> > {
+ public:
+
+ typedef uint32_t Element;
+ typedef Givaro::Modular<uint32_t, Compute_t> Field;
+
+ FieldAXPY (const Field &F) :
+ _field (&F), _y(0)
+ {
+ _two_64 = (uint64_t(1) << 32) % uint64_t(F.characteristic());
+ _two_64 = (_two_64 * _two_64) % uint64_t(F.characteristic());
+ }
+
+ FieldAXPY (const FieldAXPY &faxpy) :
+ _two_64 (faxpy._two_64), _field (faxpy._field), _y (0)
+ {}
+
+ FieldAXPY<Field > &operator = (const FieldAXPY &faxpy)
+ {
+ _field = faxpy._field;
+ _y = faxpy._y;
+ _two_64 = faxpy._two_64;
+ return *this;
+ }
+
+ inline uint64_t& mulacc (const Element &a, const Element &x)
+ {
+ uint64_t t = (uint64_t) a * (uint64_t) x;
+ _y += t;
+
+ if (_y < t)
+ return _y += _two_64;
+ else
+ return _y;
+ }
+
+ inline uint64_t& accumulate (const Element &t)
+ {
+ _y += t;
+
+ if (_y < t)
+ return _y += _two_64;
+ else
+ return _y;
+ }
+
+ inline uint64_t& accumulate_special (const Element &t)
+ {
+ return _y += t;
+ }
+
+ inline Element &get (Element &y) const
+ {
+ const_cast<FieldAXPY<Field>*>(this)->_y %= (uint64_t) field().characteristic();
+ //if ((int64_t) _y < 0) const_cast<FieldAXPY<Field>*>(this)->_y += field().characteristic();
+ return y = (uint32_t) _y;
+ }
+
+ inline FieldAXPY &assign (const Element y)
+ {
+ _y = y;
+ return *this;
+ }
+
+ inline void reset() {
+ _y = 0;
+ }
+
+ inline const Field & field() const { return *_field; }
+
+ public:
+
+ uint64_t _two_64;
+
+ private:
+
+ const Field *_field;
+ uint64_t _y;
+ };
+
+ //! Specialization of DotProductDomain for uint32_t modular field
+
+ template <>
+ template<class Compute_t>
+ class DotProductDomain<Givaro::Modular<uint32_t,Compute_t> > : public VectorDomainBase<Givaro::Modular<uint32_t,Compute_t> > {
+ public:
+
+ typedef uint32_t Element;
+ typedef Givaro::Modular<uint32_t, Compute_t> Field;
+
+ DotProductDomain () {}
+ DotProductDomain (const Field &F) :
+ VectorDomainBase<Field > (F)
+ {}
+ using VectorDomainBase<Field >::field;
+ using VectorDomainBase<Field >::faxpy;
+
+ protected:
+ template <class Vector1, class Vector2>
+ inline Element &dotSpecializedDD (Element &res, const Vector1 &v1, const Vector2 &v2) const;
+
+
+ template <class Vector1, class Vector2>
+ inline Element &dotSpecializedDSP (Element &res, const Vector1 &v1, const Vector2 &v2) const;
+
+ };
+
+ //! Specialization of MVProductDomain for uint32_t modular field
+
+ template <>
+ template <class Compute_t>
+ class MVProductDomain<Givaro::Modular<uint32_t,Compute_t> > {
+ public:
+
+ typedef uint32_t Element;
+ typedef Givaro::Modular<uint32_t,Compute_t> Field;
+
+ protected:
+ template <class Vector1, class Matrix, class Vector2>
+ inline Vector1 &mulColDense
+ (const VectorDomain<Field > &VD, Vector1 &w, const Matrix &A, const Vector2 &v) const
+ {
+ return mulColDenseSpecialized (VD, w, A, v, typename VectorTraits<typename Matrix::Column>::VectorCategory ());
+ }
+
+ private:
+ template <class Vector1, class Matrix, class Vector2>
+ Vector1 &mulColDenseSpecialized
+ (const VectorDomain<Field > &VD, Vector1 &w, const Matrix &A, const Vector2 &v,
+ VectorCategories::DenseVectorTag) const;
+ template <class Vector1, class Matrix, class Vector2>
+ Vector1 &mulColDenseSpecialized
+ (const VectorDomain<Field > &VD, Vector1 &w, const Matrix &A, const Vector2 &v,
+ VectorCategories::SparseSequenceVectorTag) const;
+ template <class Vector1, class Matrix, class Vector2>
+ Vector1 &mulColDenseSpecialized
+ (const VectorDomain<Field > &VD, Vector1 &w, const Matrix &A, const Vector2 &v,
+ VectorCategories::SparseAssociativeVectorTag) const;
+ template <class Vector1, class Matrix, class Vector2>
+ Vector1 &mulColDenseSpecialized
+ (const VectorDomain<Field > &VD, Vector1 &w, const Matrix &A, const Vector2 &v,
+ VectorCategories::SparseParallelVectorTag) const;
+
+ mutable std::vector<uint64_t> _tmp;
+ };
+
+}
+
+#include <givaro/modular-uint64.h>
+
+namespace LinBox { /* uint64_t */
+
+ template<class Field>
+ class DotProductDomain;
+ template<class Field>
+ class FieldAXPY;
+ template<class Field>
+ class MVProductDomain;
+
+ /*! Specialization of FieldAXPY for unsigned short modular field */
+
+ template <>
+ template<typename Compute_t>
+ class FieldAXPY<Givaro::Modular<uint64_t,Compute_t> > {
+ public:
+
+ typedef uint64_t Element;
+ typedef Givaro::Modular<uint64_t,Compute_t> Field;
+
+ FieldAXPY (const Field &F) :
+ _field (&F), _y(0)
+ {
+ _two_64 = (uint64_t(1) << 32) % uint64_t(F.characteristic());
+ _two_64 = (_two_64 * _two_64) % uint64_t(F.characteristic());
+ }
+
+ FieldAXPY (const FieldAXPY &faxpy) :
+ _two_64 (faxpy._two_64), _field (faxpy._field), _y (0)
+ {}
+
+ FieldAXPY<Field > &operator = (const FieldAXPY &faxpy)
+ {
+ _field = faxpy._field;
+ _y = faxpy._y;
+ return *this;
+ }
+
+ inline uint64_t& mulacc (const Element &a, const Element &x)
+ {
+ uint64_t t = (uint64_t) a * (uint64_t) x;
+ _y += t;
+
+ if (_y < t)
+ return _y += _two_64;
+ else
+ return _y;
+ }
+
+ inline uint64_t& accumulate (const Element &t)
+ {
+ _y += t;
+
+ if (_y < t)
+ return _y += _two_64;
+ else
+ return _y;
+ }
+
+ inline uint64_t& accumulate_special (const Element &t)
+ {
+ return _y += t;
+ }
+
+ inline Element &get (Element &y) const
+ {
+ const_cast<FieldAXPY<Field>*>(this)->_y %= (uint64_t) field().characteristic();
+ //if ((int64_t) _y < 0) const_cast<FieldAXPY<Field>*>(this)->_y += field().characteristic();
+ return y = (uint64_t) _y;
+ }
+
+ inline FieldAXPY &assign (const Element y)
+ {
+ _y = y;
+ return *this;
+ }
+
+ inline void reset() {
+ _y = 0;
+ }
+
+ inline const Field & field() const { return *_field; }
+
+ public:
+
+ uint64_t _two_64;
+
+ private:
+
+ const Field *_field;
+ uint64_t _y;
+ };
+
+ //! Specialization of DotProductDomain for uint64_t modular field
+
+ template <>
+ template <typename Compute_t>
+ class DotProductDomain<Givaro::Modular<uint64_t,Compute_t>> : public VectorDomainBase<Givaro::Modular<uint64_t,Compute_t> > {
+ public:
+
+ typedef uint64_t Element;
+ typedef Givaro::Modular<uint64_t,Compute_t> Field;
+
+ DotProductDomain () {}
+ DotProductDomain (const Field &F) :
+ VectorDomainBase<Field > (F)
+ {}
+ using VectorDomainBase<Field >::field;
+ using VectorDomainBase<Field >::faxpy;
+
+ protected:
+ template <class Vector1, class Vector2>
+ inline Element &dotSpecializedDD (Element &res, const Vector1 &v1, const Vector2 &v2) const;
+
+
+ template <class Vector1, class Vector2>
+ inline Element &dotSpecializedDSP (Element &res, const Vector1 &v1, const Vector2 &v2) const;
+
+ };
+
+ //! Specialization of MVProductDomain for uint64_t modular field
+
+ template <>
+ template <typename Compute_t>
+ class MVProductDomain<Givaro::Modular<uint64_t,Compute_t> > {
+ public:
+
+ typedef uint64_t Element;
+ typedef Givaro::Modular<uint64_t,Compute_t> Field;
+
+ protected:
+ template <class Vector1, class Matrix, class Vector2>
+ inline Vector1 &mulColDense
+ (const VectorDomain<Field > &VD, Vector1 &w, const Matrix &A, const Vector2 &v) const
+ {
+ return mulColDenseSpecialized (VD, w, A, v, typename VectorTraits<typename Matrix::Column>::VectorCategory ());
+ }
+
+ private:
+ template <class Vector1, class Matrix, class Vector2>
+ Vector1 &mulColDenseSpecialized
+ (const VectorDomain<Field > &VD, Vector1 &w, const Matrix &A, const Vector2 &v,
+ VectorCategories::DenseVectorTag) const;
+ template <class Vector1, class Matrix, class Vector2>
+ Vector1 &mulColDenseSpecialized
+ (const VectorDomain<Field > &VD, Vector1 &w, const Matrix &A, const Vector2 &v,
+ VectorCategories::SparseSequenceVectorTag) const;
+ template <class Vector1, class Matrix, class Vector2>
+ Vector1 &mulColDenseSpecialized
+ (const VectorDomain<Field > &VD, Vector1 &w, const Matrix &A, const Vector2 &v,
+ VectorCategories::SparseAssociativeVectorTag) const;
+ template <class Vector1, class Matrix, class Vector2>
+ Vector1 &mulColDenseSpecialized
+ (const VectorDomain<Field > &VD, Vector1 &w, const Matrix &A, const Vector2 &v,
+ VectorCategories::SparseParallelVectorTag) const;
+
+ mutable std::vector<uint64_t> _tmp;
+ };
+
+}
+
+#include "linbox/ring/modular/modular-unsigned.inl"
+
+#endif // __LINBOX_field_modular_unsigned_H
+
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/ring/modular/modular-unsigned.inl b/linbox/ring/modular/modular-unsigned.inl
new file mode 100755
index 0000000..d50ad34
--- /dev/null
+++ b/linbox/ring/modular/modular-unsigned.inl
@@ -0,0 +1,828 @@
+/* linbox/field/modular.inl
+ * Copyright (C) 2002 Bradford Hovinen
+ * Copyright (C) 2002 Ahmet Duran
+ * Copyright (C) 2002 B. David Saunders
+ *
+ * Written by Bradford Hovinen <hovinen at cis.udel.edu>,
+ * Ahmet Duran <duran at cis.udel.edu>,
+ * Dave Saunders <saunders at cis.udel.edu>
+ *
+ * ------------------------------------
+ *
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ * ========LICENCE========
+ *.
+ */
+
+#ifndef __LINBOX_field_modular_INL
+#define __LINBOX_field_modular_INL
+
+//Dan Roche 7-2-04
+#ifndef __LINBOX_MIN
+#define __LINBOX_MIN(a,b) ( (a) < (b) ? (a) : (b) )
+#endif
+
+#include <iostream>
+
+namespace LinBox {
+
+ template<typename Compute_t>
+ template <class Vector1, class Vector2>
+ inline uint8_t &DotProductDomain<Givaro::Modular<uint8_t,Compute_t> >::dotSpecializedDD
+ (uint8_t &res, const Vector1 &v1, const Vector2 &v2) const
+ {
+ typename Vector1::const_iterator i = v1.begin ();
+ typename Vector2::const_iterator j = v2.begin ();
+
+ typename Vector1::const_iterator iterend = v1.begin () + (ptrdiff_t)(v1.size() % faxpy()._k);
+
+ uint64_t y = 0;
+
+ for (; i != iterend; ++i, ++j)
+ y += (uint64_t) *i * (uint64_t) *j;
+
+ y %= (uint64_t) field().characteristic();
+
+ for (; iterend != v1.end (); j += (ptrdiff_t)faxpy()._k) {
+ typename Vector1::const_iterator iter_i = iterend;
+ typename Vector2::const_iterator iter_j;
+
+ iterend += (ptrdiff_t)faxpy()._k;
+
+ for (iter_j = j; iter_i != iterend; ++iter_i, ++iter_j)
+ y += (uint64_t) *iter_i * (uint64_t) *j;
+
+ y %= (uint64_t) field().characteristic();
+ }
+
+ return res = (uint8_t) y;
+ }
+
+ template<typename Compute_t>
+ template <class Vector1, class Vector2>
+ inline uint8_t &DotProductDomain<Givaro::Modular<uint8_t,Compute_t> >::dotSpecializedDSP
+ (uint8_t &res, const Vector1 &v1, const Vector2 &v2) const
+ {
+ typename Vector1::first_type::const_iterator i_idx = v1.first.begin ();
+ typename Vector1::second_type::const_iterator i_elt = v1.second.begin ();
+
+ uint64_t y = 0;
+
+ if (v1.first.size () < faxpy()._k) {
+ for (; i_idx != v1.first.end (); ++i_idx, ++i_elt)
+ y += (uint64_t) *i_elt * (uint64_t) v2[*i_idx];
+
+ return res = uint8_t (y % (uint64_t) field().characteristic());
+ }
+ else {
+ typename Vector1::first_type::const_iterator iterend = v1.first.begin () +(ptrdiff_t)( v1.first.size() % faxpy()._k);
+
+ for (; i_idx != iterend; ++i_idx, ++i_elt)
+ y += (uint64_t) *i_elt * (uint64_t) v2[*i_idx];
+
+ y %= (uint64_t) field().characteristic();
+
+ while (iterend != v1.first.end ()) {
+ typename Vector1::first_type::const_iterator iter_i_idx = iterend;
+ typename Vector1::second_type::const_iterator iter_i_elt = i_elt;
+
+ iterend += (ptrdiff_t)faxpy()._k;
+ i_elt += (ptrdiff_t)faxpy()._k;
+
+ for (; iter_i_idx != iterend; ++iter_i_idx, ++iter_i_elt)
+ y += (uint64_t) *iter_i_elt * (uint64_t) v2[*iter_i_idx];
+
+ y %= (uint64_t) field().characteristic();
+ }
+
+ return res = (uint8_t) y;
+ }
+ }
+
+ template<typename Compute_t>
+ template <class Vector1, class Vector2>
+ inline uint16_t &DotProductDomain<Givaro::Modular<uint16_t,Compute_t> >::dotSpecializedDD
+ (uint16_t &res, const Vector1 &v1, const Vector2 &v2) const
+ {
+ typename Vector1::const_iterator i = v1.begin ();
+ typename Vector2::const_iterator j = v2.begin ();
+
+ typename Vector1::const_iterator iterend = v1.begin () + (ptrdiff_t)(v1.size() % faxpy()._k);
+
+ uint64_t y = 0;
+
+ for (; i != iterend; ++i, ++j)
+ y += (uint64_t) *i * (uint64_t) *j;
+
+ y %= (uint64_t) field().characteristic();
+
+ for (; iterend != v1.end (); j += faxpy()._k) {
+ typename Vector1::const_iterator iter_i = iterend;
+ typename Vector2::const_iterator iter_j;
+
+ iterend += faxpy()._k;
+
+ for (iter_j = j; iter_i != iterend; ++iter_i, ++iter_j)
+ y += (uint64_t) *iter_i * (uint64_t) *j;
+
+ y %= (uint64_t) field().characteristic();
+ }
+
+ return res = (uint16_t) y;
+ }
+
+ template<typename Compute_t> template <class Vector1, class Vector2>
+ inline uint16_t &DotProductDomain<Givaro::Modular<uint16_t,Compute_t> >::dotSpecializedDSP
+ (uint16_t &res, const Vector1 &v1, const Vector2 &v2) const
+ {
+ typename Vector1::first_type::const_iterator i_idx = v1.first.begin ();
+ typename Vector1::second_type::const_iterator i_elt = v1.second.begin ();
+
+ uint64_t y = 0;
+
+ if (v1.first.size () < faxpy()._k) {
+ for (; i_idx != v1.first.end (); ++i_idx, ++i_elt)
+ y += (uint64_t) *i_elt * (uint64_t) v2[*i_idx];
+
+ return res = (uint16_t) (y % (uint64_t) field().characteristic());
+ }
+ else {
+ typename Vector1::first_type::const_iterator iterend = v1.first.begin () +(ptrdiff_t)( v1.first.size() % faxpy()._k );
+
+ for (; i_idx != iterend; ++i_idx, ++i_elt)
+ y += (uint64_t) *i_elt * (uint64_t) v2[*i_idx];
+
+ y %= (uint64_t) field().characteristic();
+
+ while (iterend != v1.first.end ()) {
+ typename Vector1::first_type::const_iterator iter_i_idx = iterend;
+ typename Vector1::second_type::const_iterator iter_i_elt = i_elt;
+
+ iterend += faxpy()._k;
+ i_elt += faxpy()._k;
+
+ for (; iter_i_idx != iterend; ++iter_i_idx, ++iter_i_elt)
+ y += (uint64_t) *iter_i_elt * (uint64_t) v2[*iter_i_idx];
+
+ y %= (uint64_t) field().characteristic();
+ }
+
+ return res = (Element) y;
+ }
+ }
+
+ template<typename Compute_t> template <class Vector1, class Vector2>
+ inline uint32_t &DotProductDomain<Givaro::Modular<uint32_t,Compute_t> >::dotSpecializedDD
+ (uint32_t &res, const Vector1 &v1, const Vector2 &v2) const
+ {
+ typename Vector1::const_iterator i;
+ typename Vector2::const_iterator j;
+
+ uint64_t y = 0;
+ uint64_t t;
+
+ for (i = v1.begin (), j = v2.begin (); i < v1.end (); ++i, ++j) {
+ t = (uint64_t) *i * (uint64_t) *j;
+ y += t;
+
+ if (y < t)
+ y += faxpy()._two_64;
+ }
+
+ y %= (uint64_t) field().characteristic();
+
+ return res = (uint32_t) y;
+ }
+
+ template<typename Compute_t> template <class Vector1, class Vector2>
+ inline uint32_t &DotProductDomain<Givaro::Modular<uint32_t,Compute_t> >::dotSpecializedDSP
+ (uint32_t &res, const Vector1 &v1, const Vector2 &v2) const
+ {
+ typename Vector1::first_type::const_iterator i_idx;
+ typename Vector1::second_type::const_iterator i_elt;
+
+ uint64_t y = 0;
+ uint64_t t = 0;
+
+ for (i_idx = v1.first.begin (), i_elt = v1.second.begin (); i_idx != v1.first.end (); ++i_idx, ++i_elt) {
+ t = (uint64_t) *i_elt * (uint64_t) v2[*i_idx];
+ y += t;
+ if (y < t)
+ y += faxpy()._two_64;
+ }
+
+ y %= (uint64_t) field().characteristic();
+
+ return res = (uint32_t)y;
+ }
+
+ template<typename Compute_t> template <class Vector1, class Vector2>
+ inline uint64_t &DotProductDomain<Givaro::Modular<uint64_t,Compute_t> >::dotSpecializedDD
+ (uint64_t &res, const Vector1 &v1, const Vector2 &v2) const
+ {
+
+ typename Vector1::const_iterator i;
+ typename Vector2::const_iterator j;
+
+ uint64_t y = 0;
+ uint64_t t;
+
+ for (i = v1.begin (), j = v2.begin (); i < v1.end (); ++i, ++j)
+ {
+ t = ( (uint64_t) *i ) * ( (uint64_t) *j );
+ y += t;
+
+ if (y < t)
+ y += faxpy()._two_64;
+ }
+
+ y %= (uint64_t) field().characteristic();
+ return res = (Element)y;
+
+ }
+
+
+ template<typename Compute_t> template <class Vector1, class Vector2>
+ inline uint64_t &DotProductDomain<Givaro::Modular<uint64_t,Compute_t> >::dotSpecializedDSP
+ (uint64_t &res, const Vector1 &v1, const Vector2 &v2) const
+ {
+ typename Vector1::first_type::const_iterator i_idx;
+ typename Vector1::second_type::const_iterator i_elt;
+
+ uint64_t y = 0;
+ uint64_t t;
+
+ for (i_idx = v1.first.begin (), i_elt = v1.second.begin (); i_idx != v1.first.end (); ++i_idx, ++i_elt)
+ {
+ t = ( (uint64_t) *i_elt ) * ( (uint64_t) v2[*i_idx] );
+ y += t;
+
+ if (y < t)
+ y += faxpy()._two_64;
+ }
+
+
+ y %= (uint64_t) field().characteristic();
+
+ return res = (Element) y;
+ }
+
+
+
+
+
+ template<typename Compute_t> template <class Vector1, class Matrix, class Vector2>
+ Vector1 &MVProductDomain<Givaro::Modular<uint8_t,Compute_t> >::mulColDenseSpecialized
+ (const VectorDomain<Givaro::Modular<uint8_t,Compute_t> > &VD, Vector1 &w, const Matrix &A, const Vector2 &v,
+ VectorCategories::DenseVectorTag) const
+ {
+ linbox_check (A.coldim () == v.size ());
+ linbox_check (A.rowdim () == w.size ());
+
+ typename Matrix::ConstColIterator i = A.colBegin ();
+ typename Vector2::const_iterator j, j_end;
+ typename Matrix::Column::const_iterator k;
+ std::vector<uint32_t>::iterator l, l_end;
+
+ if (_tmp.size () < w.size ())
+ _tmp.resize (w.size ());
+
+ std::fill (_tmp.begin (), _tmp.begin () + (ptrdiff_t)w.size (), 0);
+
+ l_end = _tmp.begin () +(ptrdiff_t) w.size ();
+
+ do {
+ j = v.begin ();
+ j_end = j + __LINBOX_MIN (A->coldim (), VD.faxpy()._k);
+
+ for (; j != j_end; ++j, ++i)
+ for (k = i->begin (), l = _tmp.begin (); k != i->end (); ++k, ++l)
+ *l += *k * *j;
+
+ j_end += __LINBOX_MIN (A->coldim () - (j_end - v.begin ()), VD.faxpy()._k);
+
+ for (l =_tmp.begin (); l != l_end; ++l)
+ *l %= VD.field ().characteristic();
+
+ } while (j_end != v.end ());
+
+ typename Vector1::iterator w_j;
+
+ for (w_j = w.begin (), l = _tmp.begin (); w_j != w.end (); ++w_j, ++l)
+ *w_j = *l;
+
+ return w;
+ }
+
+ template<typename Compute_t> template <class Vector1, class Matrix, class Vector2>
+ Vector1 &MVProductDomain<Givaro::Modular<uint8_t,Compute_t> >::mulColDenseSpecialized
+ (const VectorDomain<Givaro::Modular<uint8_t,Compute_t> > &VD, Vector1 &w, const Matrix &A, const Vector2 &v,
+ VectorCategories::SparseSequenceVectorTag) const
+ {
+ linbox_check (A.coldim () == v.size ());
+ linbox_check (A.rowdim () == w.size ());
+
+ typename Matrix::ConstColIterator i = A.colBegin ();
+ typename Vector2::const_iterator j, j_end;
+ typename Matrix::Column::const_iterator k;
+ std::vector<uint32_t>::iterator l, l_end;
+
+ if (_tmp.size () < w.size ())
+ _tmp.resize (w.size ());
+
+ std::fill (_tmp.begin (), _tmp.begin () + (ptrdiff_t)w.size (), 0);
+
+ l_end = _tmp.begin () + (ptrdiff_t)w.size ();
+
+
+ do {
+ j = v.begin ();
+ j_end = j + __LINBOX_MIN (A->coldim (), VD.faxpy()._k);
+
+ for (; j != j_end; ++j, ++i)
+ for (k = i->begin (), l = _tmp.begin (); k != i->end (); ++k, ++l)
+ _tmp[k->first] += k->second * *j;
+
+ j_end += __LINBOX_MIN (A->coldim () - (j_end - v.begin ()), VD.faxpy()._k);
+
+ for (l =_tmp.begin (); l != l_end; ++l)
+ *l %= VD.field ().characteristic();
+
+ } while (j_end != v.end ());
+
+ typename Vector1::iterator w_j;
+
+ for (w_j = w.begin (), l = _tmp.begin (); w_j != w.end (); ++w_j, ++l)
+ *w_j = *l;
+
+ return w;
+ }
+
+ template<typename Compute_t> template <class Vector1, class Matrix, class Vector2>
+ Vector1 &MVProductDomain<Givaro::Modular<uint8_t,Compute_t> >::mulColDenseSpecialized
+ (const VectorDomain<Givaro::Modular<uint8_t,Compute_t> > &VD, Vector1 &w, const Matrix &A, const Vector2 &v,
+ VectorCategories::SparseAssociativeVectorTag) const
+ {
+ linbox_check (A.coldim () == v.size ());
+ linbox_check (A.rowdim () == w.size ());
+
+ typename Matrix::ConstColIterator i = A.colBegin ();
+ typename Vector2::const_iterator j, j_end;
+ typename Matrix::Column::const_iterator k;
+ std::vector<uint32_t>::iterator l, l_end;
+
+ if (_tmp.size () < w.size ())
+ _tmp.resize (w.size ());
+
+ std::fill (_tmp.begin (), _tmp.begin () + (ptrdiff_t)w.size (), 0);
+
+ l_end = _tmp.begin () +(ptrdiff_t) w.size ();
+
+ do {
+ j = v.begin ();
+ j_end = j + __LINBOX_MIN (A->coldim (), VD.faxpy()._k);
+
+ for (; j != j_end; ++j, ++i)
+ for (k = i->begin (), l = _tmp.begin (); k != i->end (); ++k, ++l)
+ _tmp[k->first] += k->second * *j;
+
+ j_end += __LINBOX_MIN (A->coldim () - (j_end - v.begin ()), VD.faxpy()._k);
+
+ for (l =_tmp.begin (); l != l_end; ++l)
+ *l %= VD.field ().characteristic();
+
+ } while (j_end != v.end ());
+
+ typename Vector1::iterator w_j;
+
+ for (w_j = w.begin (), l = _tmp.begin (); w_j != w.end (); ++w_j, ++l)
+ *w_j = *l;
+
+ return w;
+ }
+
+ template<typename Compute_t> template <class Vector1, class Matrix, class Vector2>
+ Vector1 &MVProductDomain<Givaro::Modular<uint8_t,Compute_t> >::mulColDenseSpecialized
+ (const VectorDomain<Givaro::Modular<uint8_t,Compute_t> > &VD, Vector1 &w, const Matrix &A, const Vector2 &v,
+ VectorCategories::SparseParallelVectorTag) const
+ {
+ linbox_check (A.coldim () == v.size ());
+ linbox_check (A.rowdim () == w.size ());
+
+ typename Matrix::ConstColIterator i = A.colBegin ();
+ typename Vector2::const_iterator j, j_end;
+ typename Matrix::Column::first_type::const_iterator k_idx;
+ typename Matrix::Column::second_type::const_iterator k_elt;
+ std::vector<uint32_t>::iterator l, l_end;
+
+ if (_tmp.size () < w.size ())
+ _tmp.resize (w.size ());
+
+ std::fill (_tmp.begin (), _tmp.begin () + (ptrdiff_t)w.size (), 0);
+
+ l_end = _tmp.begin () + (ptrdiff_t)w.size ();
+
+ do {
+ j = v.begin ();
+ j_end = j + (ptrdiff_t)__LINBOX_MIN (uint64_t (A.coldim ()), VD.faxpy()._k);
+
+ for (; j != j_end; ++j, ++i)
+ for (k_idx = i->first.begin (), k_elt = i->second.begin (), l = _tmp.begin ();
+ k_idx != i->first.end ();
+ ++k_idx, ++k_elt, ++l)
+ _tmp[*k_idx] += *k_elt * *j;
+
+ j_end += (ptrdiff_t) __LINBOX_MIN (uint64_t (A.coldim () - (size_t)(j_end - v.begin ())), VD.faxpy()._k);
+
+ for (l =_tmp.begin (); l != l_end; ++l)
+ *l %= VD.field ().characteristic();
+
+ } while (j_end != v.end ());
+
+ typename Vector1::iterator w_j;
+ typedef typename Vector1::value_type val_t ;
+
+ for (w_j = w.begin (), l = _tmp.begin (); w_j != w.end (); ++w_j, ++l)
+ *w_j = (val_t) *l;
+
+ return w;
+ }
+
+ template<typename Compute_t> template <class Vector1, class Matrix, class Vector2>
+ Vector1 &MVProductDomain<Givaro::Modular<uint16_t,Compute_t> >::mulColDenseSpecialized
+ (const VectorDomain<Givaro::Modular<uint16_t,Compute_t> > &VD, Vector1 &w, const Matrix &A, const Vector2 &v,
+ VectorCategories::DenseVectorTag) const
+ {
+ linbox_check (A.coldim () == v.size ());
+ linbox_check (A.rowdim () == w.size ());
+
+ typename Matrix::ConstColIterator i = A.colBegin ();
+ typename Vector2::const_iterator j = v.begin (), j_end;
+ typename Matrix::Column::const_iterator k;
+ // Dan Roche, 7-1-04
+ // std::vector<uint32_t>::iterator l, l_end;
+ std::vector<uint64_t>::iterator l, l_end;
+
+ if (_tmp.size () < w.size ())
+ _tmp.resize (w.size ());
+
+ std::fill (_tmp.begin (), _tmp.begin () +(ptrdiff_t) w.size (), 0);
+
+ l_end = _tmp.begin () +(ptrdiff_t) w.size ();
+
+ do {
+ j = v.begin ();
+ j_end = j + __LINBOX_MIN (A->coldim (), VD.faxpy()._k);
+
+ for (; j != j_end; ++j, ++i)
+ for (k = i->begin (), l = _tmp.begin (); k != i->end (); ++k, ++l)
+ *l += *k * *j;
+
+ j_end += __LINBOX_MIN (A->coldim () - (j_end - v.begin ()), VD.faxpy()._k);
+
+ for (l =_tmp.begin (); l != l_end; ++l)
+ *l %= VD.field ().characteristic();
+
+ } while (j_end != v.end ());
+
+ typename Vector1::iterator w_j;
+
+ for (w_j = w.begin (), l = _tmp.begin (); w_j != w.end (); ++w_j, ++l)
+ *w_j = *l;
+
+ return w;
+ }
+
+ template<typename Compute_t> template <class Vector1, class Matrix, class Vector2>
+ Vector1 &MVProductDomain<Givaro::Modular<uint16_t,Compute_t> >::mulColDenseSpecialized
+ (const VectorDomain<Givaro::Modular<uint16_t,Compute_t> > &VD, Vector1 &w, const Matrix &A, const Vector2 &v,
+ VectorCategories::SparseSequenceVectorTag) const
+ {
+ linbox_check (A.coldim () == v.size ());
+ linbox_check (A.rowdim () == w.size ());
+
+ typename Matrix::ConstColIterator i = A.colBegin ();
+ typename Vector2::const_iterator j, j_end;
+ typename Matrix::Column::const_iterator k;
+ // Dan Roche, 7-1-04
+ // std::vector<uint32_t>::iterator l, l_end;
+ std::vector<uint64_t>::iterator l, l_end;
+
+ if (_tmp.size () < w.size ())
+ _tmp.resize (w.size ());
+
+ std::fill (_tmp.begin (), _tmp.begin () +(ptrdiff_t) w.size (), 0);
+
+ l_end = _tmp.begin () +(ptrdiff_t) w.size ();
+
+ do {
+ j = v.begin ();
+ j_end = j + __LINBOX_MIN (A->coldim (), VD.faxpy()._k);
+
+ for (; j != j_end; ++j, ++i)
+ for (k = i->begin (), l = _tmp.begin (); k != i->end (); ++k, ++l)
+ _tmp[k->first] += k->second * *j;
+
+ j_end += __LINBOX_MIN (A->coldim () - (j_end - v.begin ()), VD.faxpy()._k);
+
+ for (l =_tmp.begin (); l != l_end; ++l)
+ *l %= VD.field ().characteristic();
+
+ } while (j_end != v.end ());
+
+ typename Vector1::iterator w_j;
+
+ for (w_j = w.begin (), l = _tmp.begin (); w_j != w.end (); ++w_j, ++l)
+ *w_j = *l;
+
+ return w;
+ }
+
+ template<typename Compute_t> template <class Vector1, class Matrix, class Vector2>
+ Vector1 &MVProductDomain<Givaro::Modular<uint16_t,Compute_t> >::mulColDenseSpecialized
+ (const VectorDomain<Givaro::Modular<uint16_t,Compute_t> > &VD, Vector1 &w, const Matrix &A, const Vector2 &v,
+ VectorCategories::SparseAssociativeVectorTag) const
+ {
+ linbox_check (A.coldim () == v.size ());
+ linbox_check (A.rowdim () == w.size ());
+
+ typename Matrix::ConstColIterator i = A.colBegin ();
+ typename Vector2::const_iterator j, j_end;
+ typename Matrix::Column::const_iterator k;
+ // Dan Roche, 7-1-04
+ // std::vector<uint32_t>::iterator l, l_end;
+ std::vector<uint64_t>::iterator l, l_end;
+
+ if (_tmp.size () < w.size ())
+ _tmp.resize (w.size ());
+
+ std::fill (_tmp.begin (), _tmp.begin () +(ptrdiff_t) w.size (), 0);
+
+ l_end = _tmp.begin () +(ptrdiff_t) w.size ();
+
+ do {
+ j = v.begin ();
+ j_end = j + __LINBOX_MIN (A->coldim (), VD.faxpy()._k);
+
+ for (; j != j_end; ++j, ++i)
+ for (k = i->begin (), l = _tmp.begin (); k != i->end (); ++k, ++l)
+ _tmp[k->first] += k->second * *j;
+
+ j_end += __LINBOX_MIN (A->coldim () - (j_end - v.begin ()), VD.faxpy()._k);
+
+ for (l =_tmp.begin (); l != l_end; ++l)
+ *l %= VD.field ().characteristic();
+
+ } while (j_end != v.end ());
+
+ typename Vector1::iterator w_j;
+
+ for (w_j = w.begin (), l = _tmp.begin (); w_j != w.end (); ++w_j, ++l)
+ *w_j = *l;
+
+ return w;
+ }
+
+ template<typename Compute_t> template <class Vector1, class Matrix, class Vector2>
+ Vector1 &MVProductDomain<Givaro::Modular<uint16_t,Compute_t> >::mulColDenseSpecialized
+ (const VectorDomain<Givaro::Modular<uint16_t,Compute_t> > &VD, Vector1 &w, const Matrix &A, const Vector2 &v,
+ VectorCategories::SparseParallelVectorTag) const
+ {
+ linbox_check (A.coldim () == v.size ());
+ linbox_check (A.rowdim () == w.size ());
+
+ typename Matrix::ConstColIterator i = A.colBegin ();
+ typename Vector2::const_iterator j, j_end;
+ typename Matrix::Column::first_type::const_iterator k_idx;
+ typename Matrix::Column::second_type::const_iterator k_elt;
+ // Dan Roche, 7-1-04
+ // std::vector<uint32_t>::iterator l, l_end;
+ std::vector<uint64_t>::iterator l, l_end;
+
+ if (_tmp.size () < w.size ())
+ _tmp.resize (w.size ());
+
+ std::fill (_tmp.begin (), _tmp.begin () +(ptrdiff_t) w.size (), 0);
+
+ l_end = _tmp.begin () +(ptrdiff_t) w.size ();
+
+ do {
+ j = v.begin ();
+ //Dan Roche, 7-2-04
+ //j_end = j + __LINBOX_MIN (A->coldim (), VD.faxpy()._k);
+ j_end = j + __LINBOX_MIN (A.coldim (), VD.faxpy()._k);
+
+ for (; j != j_end; ++j, ++i)
+ for (k_idx = i->first.begin (), k_elt = i->second.begin (), l = _tmp.begin ();
+ k_idx != i->first.end ();
+ ++k_idx, ++k_elt, ++l)
+ _tmp[*k_idx] += *k_elt * *j;
+
+ //j_end += __LINBOX_MIN (A->coldim () - (j_end - v.begin ()), VD.faxpy()._k);
+ j_end += __LINBOX_MIN (A.coldim () - (j_end - v.begin ()), VD.faxpy()._k);
+
+ for (l =_tmp.begin (); l != l_end; ++l)
+ *l %= VD.field ().characteristic();
+
+ } while (j_end != v.end ());
+
+ typename Vector1::iterator w_j;
+
+ for (w_j = w.begin (), l = _tmp.begin (); w_j != w.end (); ++w_j, ++l)
+ *w_j = *l;
+
+ return w;
+ }
+
+ template<typename Compute_t> template <class Vector1, class Matrix, class Vector2>
+ Vector1 &MVProductDomain<Givaro::Modular<uint32_t,Compute_t> >::mulColDenseSpecialized
+ (const VectorDomain<Givaro::Modular<uint32_t,Compute_t> > &VD, Vector1 &w, const Matrix &A, const Vector2 &v,
+ VectorCategories::DenseVectorTag) const
+ {
+ linbox_check (A.coldim () == v.size ());
+ linbox_check (A.rowdim () == w.size ());
+
+ typename Matrix::ConstColIterator i = A.colBegin ();
+ typename Vector2::const_iterator j;
+ typename Matrix::Column::const_iterator k;
+ std::vector<uint64_t>::iterator l;
+
+ uint64_t t;
+
+ if (_tmp.size () < w.size ())
+ _tmp.resize (w.size ());
+
+ std::fill (_tmp.begin (), _tmp.begin () +(ptrdiff_t) w.size (), 0);
+
+ for (j = v.begin (); j != v.end (); ++j, ++i) {
+ for (k = i->begin (), l = _tmp.begin (); k != i->end (); ++k, ++l) {
+ t = ((uint64_t) *k) * ((uint64_t) *j);
+
+ *l += t;
+
+ if (*l < t)
+ *l += VD.faxpy()._two_64;
+ }
+ }
+
+ typename Vector1::iterator w_j;
+ typedef typename Vector1::value_type element;
+
+ for (w_j = w.begin (), l = _tmp.begin (); w_j != w.end (); ++w_j, ++l)
+ *w_j = (element)(*l % VD.field ().characteristic());
+
+ return w;
+ }
+
+ template<typename Compute_t> template <class Vector1, class Matrix, class Vector2>
+ Vector1 &MVProductDomain<Givaro::Modular<uint32_t,Compute_t> >::mulColDenseSpecialized
+ (const VectorDomain<Givaro::Modular<uint32_t,Compute_t> > &VD, Vector1 &w, const Matrix &A, const Vector2 &v,
+ VectorCategories::SparseSequenceVectorTag) const
+ {
+ linbox_check (A.coldim () == v.size ());
+ linbox_check (A.rowdim () == w.size ());
+
+ typename Matrix::ConstColIterator i = A.colBegin ();
+ typename Vector2::const_iterator j;
+ typename Matrix::Column::const_iterator k;
+ std::vector<uint64_t>::iterator l;
+
+ uint64_t t;
+
+ if (_tmp.size () < w.size ())
+ _tmp.resize (w.size ());
+
+ std::fill (_tmp.begin (), _tmp.begin () + (ptrdiff_t) w.size (), 0);
+
+ for (j = v.begin (); j != v.end (); ++j, ++i) {
+ for (k = i->begin (), l = _tmp.begin (); k != i->end (); ++k, ++l) {
+ t = ((uint64_t) k->second) * ((uint64_t) *j);
+
+ _tmp[k->first] += t;
+
+ if (_tmp[k->first] < t)
+ _tmp[k->first] += VD.faxpy()._two_64;
+ }
+ }
+
+ typename Vector1::iterator w_j;
+ typedef typename Vector1::value_type val_t;
+
+ for (w_j = w.begin (), l = _tmp.begin (); w_j != w.end (); ++w_j, ++l)
+ *w_j = val_t(*l % VD.field ().characteristic());
+
+ return w;
+ }
+
+ template<typename Compute_t> template <class Vector1, class Matrix, class Vector2>
+ Vector1 &MVProductDomain<Givaro::Modular<uint32_t,Compute_t> >::mulColDenseSpecialized
+ (const VectorDomain<Givaro::Modular<uint32_t,Compute_t> > &VD, Vector1 &w, const Matrix &A, const Vector2 &v,
+ VectorCategories::SparseAssociativeVectorTag) const
+ {
+ linbox_check (A.coldim () == v.size ());
+ linbox_check (A.rowdim () == w.size ());
+
+ typename Matrix::ConstColIterator i = A.colBegin ();
+ typename Vector2::const_iterator j;
+ typename Matrix::Column::const_iterator k;
+ std::vector<uint64_t>::iterator l;
+
+ uint64_t t;
+
+ if (_tmp.size () < w.size ())
+ _tmp.resize (w.size ());
+
+ std::fill (_tmp.begin (), _tmp.begin () +(ptrdiff_t) w.size (), 0);
+
+ for (j = v.begin (); j != v.end (); ++j, ++i) {
+ for (k = i->begin (), l = _tmp.begin (); k != i->end (); ++k, ++l) {
+ t = ((uint64_t) k->second) * ((uint64_t) *j);
+
+ _tmp[k->first] += t;
+
+ if (_tmp[k->first] < t)
+ _tmp[k->first] += VD.faxpy()._two_64;
+ }
+ }
+
+ typename Vector1::iterator w_j;
+
+ for (w_j = w.begin (), l = _tmp.begin (); w_j != w.end (); ++w_j, ++l)
+ *w_j = (uint32_t) (uint32_t)*l % VD.field ().characteristic();
+
+ return w;
+ }
+
+ template<typename Compute_t> template <class Vector1, class Matrix, class Vector2>
+ Vector1 &MVProductDomain<Givaro::Modular<uint32_t,Compute_t> >::mulColDenseSpecialized
+ (const VectorDomain<Givaro::Modular<uint32_t,Compute_t> > &VD, Vector1 &w, const Matrix &A, const Vector2 &v,
+ VectorCategories::SparseParallelVectorTag) const
+ {
+ linbox_check (A.coldim () == v.size ());
+ linbox_check (A.rowdim () == w.size ());
+
+ typename Matrix::ConstColIterator i = A.colBegin ();
+ typename Vector2::const_iterator j;
+ typename Matrix::Column::first_type::const_iterator k_idx;
+ typename Matrix::Column::second_type::const_iterator k_elt;
+ std::vector<uint64_t>::iterator l;
+
+ uint64_t t;
+
+ if (_tmp.size () < w.size ())
+ _tmp.resize (w.size ());
+
+ std::fill (_tmp.begin (), _tmp.begin () +(ptrdiff_t) w.size (), 0);
+
+ for (j = v.begin (); j != v.end (); ++j, ++i) {
+ for (k_idx = i->first.begin (), k_elt = i->second.begin (), l = _tmp.begin ();
+ k_idx != i->first.end ();
+ ++k_idx, ++k_elt, ++l)
+ {
+ t = ((uint64_t) *k_elt) * ((uint64_t) *j);
+
+ _tmp[*k_idx] += t;
+
+ if (_tmp[*k_idx] < t)
+ _tmp[*k_idx] += VD.faxpy()._two_64;
+ }
+ }
+
+ typename Vector1::iterator w_j;
+ typedef typename Vector1::value_type val_t;
+
+ for (w_j = w.begin (), l = _tmp.begin (); w_j != w.end (); ++w_j, ++l)
+ *w_j = val_t(*l % VD.field ().characteristic());
+
+ return w;
+ }
+
+}
+
+#endif // __LINBOX_field_modular_INL
+
+
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+
diff --git a/linbox/ring/ntl.doxy b/linbox/ring/ntl.doxy
new file mode 100644
index 0000000..5a93172
--- /dev/null
+++ b/linbox/ring/ntl.doxy
@@ -0,0 +1,30 @@
+// Copyright (C) 2010 Brice Boyer (briceboyer), part of LinBox, GNU LGPL, see COPYING
+/*
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ * ========LICENCE========
+ */
+
+/*! @ingroup field
+ at defgroup NTL NTL
+
+ at brief NO DOC
+
+*/
+
+
+// vim:syntax=doxygen
diff --git a/linbox/ring/ntl.h b/linbox/ring/ntl.h
new file mode 100644
index 0000000..0e56a0d
--- /dev/null
+++ b/linbox/ring/ntl.h
@@ -0,0 +1,60 @@
+/* linbox/ring/ntl.h
+ * Copyright (C) 1999-2002 William J Turner,
+ * 2001 Bradford Hovinen
+ *
+ * Written by William J Turner <wjturner at math.ncsu.edu>,
+ * Bradford Hovinen <hovinen at cis.udel.edu>
+ *
+ * ------------------------------------
+ * Modified by William J. Turner <wjturner at acm.org>. 4 April 2002.
+ *
+ * Broke NTL ring wrappers into separate files.
+ * ------------------------------------
+ *
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ * ========LICENCE========
+ *.
+ */
+
+#ifndef __LINBOX_ring_ntl_H
+#define __LINBOX_ring_ntl_H
+
+#include "linbox/ring/ntl/ntl-rr.h"
+#include "linbox/ring/ntl/ntl-zz_p.h"
+#include "linbox/ring/ntl/ntl-zz.h"
+#include "linbox/ring/ntl/ntl-zz_px.h"
+#include "linbox/ring/ntl/ntl-zz_pe.h"
+#include "linbox/ring/ntl/ntl-lzz_p.h"
+#include "linbox/ring/ntl/ntl-lzz_px.h"
+#include "linbox/ring/ntl/ntl-lzz_pe.h"
+#include "linbox/ring/ntl/ntl-lzz_pex.h"
+#include "linbox/ring/ntl/ntl-gf2e.h"
+
+
+#endif // __LINBOX_ring_ntl_H
+
+
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+
diff --git a/linbox/ring/ntl/Makefile.am b/linbox/ring/ntl/Makefile.am
new file mode 100644
index 0000000..a02b6d8
--- /dev/null
+++ b/linbox/ring/ntl/Makefile.am
@@ -0,0 +1,47 @@
+# Copyright (c) 2010 the LinBox group
+# ========LICENCE========
+# This file is part of the library LinBox.
+#
+# LinBox is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+#
+# This library 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
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+# ========LICENCE========
+
+
+
+pkgincludesubdir=$(pkgincludedir)/ring/ntl
+
+
+NTL_HDRS = \
+ ntl-rr.h \
+ ntl-zz_p.h \
+ ntl-zz_pe.h \
+ ntl-zz_px.h \
+ ntl-zz.h \
+ ntl-lzz_p.h \
+ ntl-lzz_pe.h \
+ ntl-lzz_px.h \
+ ntl-lzz_pex.h \
+ ntl-gf2e.h
+
+
+if LINBOX_HAVE_NTL
+USE_NTL_HDRS = $(NTL_HDRS)
+endif
+
+
+pkgincludesub_HEADERS = \
+ $(USE_NTL_HDRS)
+
+# EXTRA_DIST = \
+ # ntl.doxy
diff --git a/linbox/ring/ntl/ntl-gf2e.h b/linbox/ring/ntl/ntl-gf2e.h
new file mode 100644
index 0000000..77b0457
--- /dev/null
+++ b/linbox/ring/ntl/ntl-gf2e.h
@@ -0,0 +1,247 @@
+/* linbox/field/ntl-z_pE.h
+ * Copyright (C) 2004 Pascal Giorgi
+ * Copyright (C) 2011 LinBox
+ *
+ * Written by Pascal Giorgi <pascal.giorgi at ens-lyon.fr>
+ *
+ * Modified by W. J. Turner <wjturner at acm.org>
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ * ========LICENCE========
+ */
+
+/*! @file field/ntl/ntl-GF2E.h
+ * @ingroup field
+ * @ingroup NTL
+ * @brief NO DOC
+ */
+
+#ifndef __LINBOX_field_ntl_gf2e_H
+#define __LINBOX_field_ntl_gf2e_H
+
+#ifndef __LINBOX_HAVE_NTL
+#error "you need NTL here"
+#endif
+
+#include <NTL/GF2XFactoring.h>
+#include <NTL/GF2E.h>
+#include <time.h>
+
+#include "linbox/linbox-config.h"
+#include "linbox/util/debug.h"
+
+#include <givaro/zring.h>
+#include "linbox/field/field-traits.h"
+
+
+#include "linbox/integer.h"
+
+namespace Givaro
+{
+ template<>
+ // NTL::GF2E& Givaro::ZRing<NTL::GF2E>::init (NTL::GF2E &x, const Integer &y) const
+ NTL::GF2E& Caster(NTL::GF2E &x, const Integer &y)
+ {
+ x=NTL::to_GF2E(static_cast<int64_t>(y));
+ return x;
+ }
+ template<>
+ // NTL::GF2E& Givaro::ZRing<NTL::GF2E>::init (NTL::GF2E &x, const double &y) const
+ NTL::GF2E& Caster(NTL::GF2E &x, const double &y)
+ {
+ x=NTL::to_GF2E(static_cast<long>(y));
+ return x;
+ }
+
+
+ template<>
+ // Integer& Givaro::ZRing<NTL::GF2E>::convert (Integer& x, const NTL::GF2E &y) const {
+ Integer& Caster(Integer& x, const NTL::GF2E &y)
+ {
+ NTL::GF2X poly = rep(y);
+
+ long i;
+ x = 0;
+ for(i = deg(poly); i >= 0; --i) {
+ x <<= 1;
+ x += static_cast<int64_t>(rep(coeff(poly, i)));
+ }
+ return x;
+ }
+
+} // namespace Givaro
+
+
+
+
+// Namespace in which all LinBox library code resides
+namespace LinBox
+{
+ /// \ingroup field
+
+ class NTL_GF2E_Initialiser {
+ public :
+ NTL_GF2E_Initialiser( const Integer & p, size_t k = 1) {
+ linbox_check(p == 2);
+ // if(p != 2) throw PreconditionFailed(LB_FILE_LOC,"modulus must be 2");
+ NTL::GF2X irredPoly = NTL::BuildSparseIrred_GF2X((long) k);
+ NTL::GF2E::init(irredPoly);
+
+ }
+
+ // template <class ElementInt>
+ // NTL_GF2E_Initialiser(const ElementInt& d) {
+ // NTL::ZZ_p::init (NTL::to_ZZ(d));
+ // }
+
+ // NTL_GF2E_Initialiser (const NTL::ZZ& d) {
+ // NTL::ZZ_p::init(d);
+ // }
+
+ };
+
+
+ /*
+ * Define a parameterized class to easily handle Givaro::ZRing<NTL::GF2E> field
+ */
+
+ class NTL_GF2E : public NTL_GF2E_Initialiser, public Givaro::UnparametricOperations<NTL::GF2E> {
+ public:
+ typedef NTL::GF2E Element ;
+ typedef Givaro::UnparametricOperations<Element> Father_t ;
+ typedef UnparametricRandIter<Element> RandIter;
+
+ const Element zero,one,mOne ;
+
+ NTL_GF2E (const integer &p, const integer &k) :
+ NTL_GF2E_Initialiser(p,k),Father_t ()
+ ,zero( NTL::to_GF2E(0)),one( NTL::to_GF2E(1)),mOne(-one)
+ { }
+
+ bool isZero (const Element& a) const
+ {
+ return NTL::IsZero(a);
+ }
+
+
+ bool isOne (const Element& a) const
+ {
+ return NTL::IsOne(a);
+ }
+
+ bool isMOne (const Element& x) const
+ {
+ Element y ; neg(y,x);
+ return isOne(y);
+ }
+
+ integer& characteristic (integer &c) const
+ {
+ return c = 2;
+ }
+
+ integer& cardinality(integer& c) const
+ {
+ c=1;
+ c<<= static_cast<int64_t>(Element::degree());
+ return c;
+ }
+
+ Element& inv(Element& x, const Element& y) const
+ {
+ x=NTL::to_GF2E(1)/y;
+ return x;
+ }
+
+ Element& invin(Element& x) const
+ {
+ x=NTL::to_GF2E(1)/x;
+ return x;
+ }
+
+ std::istream& read(std::istream& is, Element& x) const
+ {
+ long tmp= 0;
+ is>>tmp;
+ x=NTL::to_GF2E(tmp);
+ return is;
+ }
+ }; // end o class NTL_GF2E
+
+ template <class Ring>
+ struct ClassifyRing;
+
+ template <class Element>
+ struct ClassifyRing<UnparametricRandIter<Element> >;
+
+ template <>
+ struct ClassifyRing<UnparametricRandIter<NTL::GF2E> > {
+ typedef RingCategories::ModularTag categoryTag;
+ };
+
+ template<>
+ class UnparametricRandIter<NTL::GF2E> {
+ public:
+ typedef NTL::GF2E Element;
+ UnparametricRandIter<NTL::GF2E>(const NTL_GF2E & F,
+ const size_t& size = 0,
+ const size_t& seed = 0
+ ) :
+ _size(size), _seed(seed)
+ {
+ if(_seed == 0)
+ NTL::SetSeed(NTL::to_ZZ(time(0)));
+ else
+ NTL::SetSeed(NTL::to_ZZ(_seed));
+ }
+
+ UnparametricRandIter<NTL::GF2E>(const UnparametricRandIter<NTL::GF2E>& R) :
+ _size(R._size), _seed(R._seed)
+
+ {
+ if(_seed == 0)
+ NTL::SetSeed(NTL::to_ZZ(time(0)));
+ else
+ NTL::SetSeed(NTL::to_ZZ(_seed));
+ }
+
+ Element& random (Element& x) const
+ {
+ NTL::random(x);
+ return x;
+ }
+
+ protected:
+ size_t _size;
+ size_t _seed;
+ };
+
+
+}
+
+#endif //__LINBOX_ntl_gf2e_H
+
+
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+
diff --git a/linbox/ring/ntl/ntl-lzz_p.h b/linbox/ring/ntl/ntl-lzz_p.h
new file mode 100644
index 0000000..c675c2b
--- /dev/null
+++ b/linbox/ring/ntl/ntl-lzz_p.h
@@ -0,0 +1,379 @@
+/* linbox/field/ntl-lzz_p.h
+ * Copyright (C) 1999-2005 W. J. Turner,
+ * 2001 Bradford Hovinen
+ * Copyright (C) 2011 LinBox
+ *
+ * Written by W. J. Turner <wjturner at acm.org>,
+ * Bradford Hovinen <hovinen at cis.udel.edu>
+ *
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ * ========LICENCE========
+ *.
+ *
+ */
+
+/*! @file field/ntl/ntl-lzz_p.h
+ * @ingroup field
+ * @ingroup NTL
+ * @brief NO DOC
+ */
+
+#ifndef __LINBOX_field_ntl_lzz_p_H
+#define __LINBOX_field_ntl_lzz_p_H
+
+#ifndef __LINBOX_HAVE_NTL
+#error "you need NTL here"
+#endif
+
+#include <time.h>
+#include "linbox/linbox-config.h"
+#include "linbox/util/debug.h"
+#include <NTL/lzz_p.h>
+#include <NTL/ZZ.h>
+
+#include <givaro/zring.h>
+#include <givaro/unparametric-operations.h>
+#include "linbox/field/field-traits.h"
+#include "linbox/integer.h"
+
+namespace Givaro
+{
+
+ /** Initialization of field element from an integer.
+ * This Uses NTL's <code>to_zz_p</code> function.
+ *
+ * @return reference to field element.
+ * @param x field element to contain output (reference returned).
+ * @param y Integer.
+ */
+ template <>
+ NTL::zz_p& Caster(NTL::zz_p& x, const Integer& y)
+ {
+ return x = NTL::to_zz_p( static_cast<int64_t>(y)%NTL::zz_p::modulus() );
+ }
+ template <>
+ NTL::zz_p& Caster(NTL::zz_p& x, const double& y)
+ {
+ return x = NTL::to_zz_p(long(y)%NTL::zz_p::modulus());
+ }
+
+ /** Conversion of field element to an Integer.
+ * This function assumes the output field element x has already been
+ * constructed, but that it is not already initialized.
+ * For now, this is done by converting the element type to a C++
+ * long and then to the Integer type through the use of static cast and
+ * NTL's to_long function.
+ * This, of course, assumes such static casts are possible.
+ * This function should be changed in the future to avoid using long.
+ * @return reference to Integer.
+ * @param x reference to Integer to contain output (reference returned).
+ * @param y constant reference to field element.
+ */
+ template <>
+ Integer& Caster(Integer& x, const NTL::zz_p& y)
+ {
+ return x = int64_t(rep(y));
+ }
+} // namespace Givaro
+
+// Namespace in which all LinBox library code resides
+namespace LinBox
+{
+
+ class NTL_zz_p_Initialiser {
+ public :
+ NTL_zz_p_Initialiser( const Integer & q, size_t e = 1) {
+ linbox_check(e == 1);
+ if ( q > 0 )
+ // NTL::zz_p::init(NTL::to_ZZ((std::string(q)).data())); // it's an error if q not prime, e not 1
+ NTL::zz_p::init(int64_t(q)); // it's an error if q not prime, e not 1
+ }
+
+ template <class ElementInt>
+ NTL_zz_p_Initialiser(const ElementInt& d) {
+ NTL::zz_p::init (NTL::to_ZZ(d));
+ }
+
+ NTL_zz_p_Initialiser () { }
+
+ };
+
+ /**
+ * \brief long ints modulo a positive integer.
+ *
+ * While NTL allows any int to serve as the modulus, only prime
+ * moduli yield fields. The primality of the modulus will not be checked, so
+ * it is the programmer's responsibility to supply a prime modulus if a field is
+ * wanted.
+ * These specializations allow the \ref Givaro::ZRing template class to be
+ * used to wrap NTL's <code>zz_p</code> class as a LinBox field.
+ * Uses nice trick for mod p via floating point.
+ \ingroup field
+ */
+ struct NTL_zz_p: public NTL_zz_p_Initialiser, public Givaro::UnparametricOperations<NTL::zz_p> {
+ typedef NTL::zz_p Element ;
+ typedef Givaro::UnparametricOperations<Element> Father_t ;
+ typedef UnparametricRandIter<NTL::zz_p> RandIter;
+
+ const Element zero,one,mOne ;
+
+
+ //public Givaro::ZRing<Element> {
+ NTL_zz_p(integer p, size_t e = 1) :
+ NTL_zz_p_Initialiser(p,e),Father_t ()
+ ,zero( NTL::to_zz_p(0)),one( NTL::to_zz_p(1)),mOne(-one)
+ {}
+
+ NTL_zz_p() :
+ NTL_zz_p_Initialiser(2,1), Father_t()
+ ,zero( NTL::to_zz_p(0)),one( NTL::to_zz_p(1)),mOne(-one)
+ {}
+
+ Element& init(Element& x, const double& y) const
+ {
+ double z = fmod(y,(double)Element::modulus());
+ if (z > 0) z += 0.5;
+ else z -= 0.5;
+ return x = NTL::to_zz_p(static_cast<long>(z)); //rounds towards 0
+ }
+
+ Element &init (Element &x, const integer &y=0) const
+ {
+ NTL::ZZ tmp= NTL::to_ZZ(std::string(y).data());
+ return x = NTL::to_zz_p(tmp);
+ }
+
+/*
+ template <class ANY>
+ Element& init(Element& x, const ANY& y) const
+ {
+ return x = NTL::to_zz_p((long)(y));
+ }
+*/
+
+ Element& init(Element& x, const NTL::zz_p & y) const
+ {
+ return x = y ;
+ }
+
+ template <class ANY>
+ ANY& convert(ANY& x, const Element& y) const
+ {
+ return Givaro::Caster(x,y);
+ }
+
+ static inline integer maxCardinality()
+ {
+ return integer( int64_t(NTL_SP_BOUND) );
+ }
+
+ Element& pow( Element& res, const Element& x, long exp ) const
+ {
+ NTL::power( res, x, exp );
+ return res;
+ }
+
+ Element& powin( Element& x, long exp ) const
+ {
+ return x = NTL::power(x,exp);
+ }
+ /** Cardinality.
+ * Return integer representing cardinality of the field.
+ * Returns the modulus of the field, which should be prime.
+ * @return integer representing cardinality of the field
+ */
+
+ integer& cardinality(integer& c) const
+ {
+ return characteristic(c);
+ }
+
+ integer cardinality() const
+ {
+ return characteristic();
+ }
+
+ /** Characteristic.
+ * Return integer representing characteristic of the field.
+ * Returns the modulus of the field, which should be prime.
+ * @return integer representing characteristic of the field.
+ */
+
+ integer& characteristic(integer& c) const
+ {
+ return c = static_cast<int64_t>(Element::modulus());
+ }
+
+ integer characteristic() const
+ {
+ return static_cast<int64_t>(Element::modulus());
+ }
+
+ /** Multiplicative Inverse.
+ * x = 1 / y
+ * This function assumes both field elements have already been
+ * constructed and initialized.
+ * @return reference to x.
+ * @param x field element (reference returned).
+ * @param y field element.
+ */
+ Element&
+ inv(Element& x, const Element& y) const
+ {
+ return x = NTL::inv(y);
+ }
+
+ /** Zero equality.
+ * Test if field element is equal to zero.
+ * This function assumes the field element has already been
+ * constructed and initialized.
+ * In this specialization, NTL's IsZero function is called.
+ * @return boolean true if equals zero, false if not.
+ * @param x field element.
+ */
+ bool isZero(const Element& x) const
+ {
+ return static_cast<bool>(NTL::IsZero(x));
+ }
+
+ /** One equality.
+ * Test if field element is equal to one.
+ * This function assumes the field element has already been
+ * constructed and initialized.
+ * In this specialization, NTL's IsOne function is called.
+ * @return boolean true if equals one, false if not.
+ * @param x field element.
+ */
+ bool isOne(const Element& x) const
+ {
+ return static_cast<bool>(NTL::IsOne(x));
+ }
+
+ /** MOne equality.
+ * Test if field element is equal to one.
+ * This function assumes the field element has already been
+ * constructed and initialized.
+ * In this specialization, NTL's IsMOne function is called.
+ * @return boolean true if equals one, false if not.
+ * @param x field element.
+ */
+ bool isMOne(const Element& x) const
+ {
+ Element y = x ; negin(y);
+ return isOne(y);
+ }
+
+
+ /** Inplace Multiplicative Inverse.
+ * x = 1 / x
+ * This function assumes both field elements have already been
+ * constructed and initialized.
+ * @return reference to x.
+ * @param x field element (reference returned).
+ */
+ Element& invin(Element& x) const
+ {
+ return x = NTL::inv(x);
+ }
+
+ /** Print field.
+ * @return output stream to which field is written.
+ * @param os output stream to which field is written.
+ */
+ std::ostream& write(std::ostream& os) const
+ {
+ return os << "unparameterized field Element with p = "
+ << Element::modulus();
+ }
+ std::ostream& write(std::ostream& os, const std::string& ) const
+ {
+ return os << "unparameterized field Element with p = "
+ << Element::modulus();
+ }
+
+ std::ostream &write (std::ostream &os, const Element &x) const { return Givaro::UnparametricOperations<Element>::write(os,x); }
+ };
+
+ template <class Ring>
+ struct ClassifyRing;
+
+ template <>
+ struct ClassifyRing<NTL_zz_p> {
+ typedef RingCategories::ModularTag categoryTag;
+ };
+
+ template<>
+ class UnparametricRandIter<NTL::zz_p> {
+ public:
+ /// Constructor for random field element generator
+
+ UnparametricRandIter<NTL::zz_p> (const NTL_zz_p & F,
+ const integer& size=0,
+ const integer& seed=0) :
+ _size(size), _seed(seed), _ring(F)
+ {
+ if (_seed == integer(0)) _seed = int64_t(time(NULL));
+
+ integer cardinality;
+ F.cardinality(cardinality);
+ if (_size > cardinality)
+ _size = 0;
+
+#ifdef TRACE
+ std::cout << "created random generator with size " << _size
+ << " and seed " << _seed << std::endl;
+#endif // TRACE
+
+ // Seed random number generator
+ std::stringstream s;
+ NTL::ZZ x;
+ s << _seed;
+ s >> x;
+ NTL::SetSeed(x);//NTL::to_ZZ(static_cast<long>(_seed)));
+ }
+
+ /// Random field element creator.
+ NTL::zz_p& random(NTL::zz_p& x) const
+ {
+ if (_size == 0) {
+ return x = NTL::random_zz_p();
+ }
+ else {
+ return x = NTL::to_zz_p(NTL::RandomBnd(static_cast<int64_t>(_size)));
+ }
+ }
+ const NTL_zz_p& ring() const { return _ring; }
+ protected :
+ integer _size,_seed ;
+ const NTL_zz_p& _ring;
+ };
+
+} // namespace LinBox
+
+#endif // __LINBOX_field_ntl_lzz_p_H
+
+
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+
diff --git a/linbox/ring/ntl/ntl-lzz_pe.h b/linbox/ring/ntl/ntl-lzz_pe.h
new file mode 100644
index 0000000..6f09b6e
--- /dev/null
+++ b/linbox/ring/ntl/ntl-lzz_pe.h
@@ -0,0 +1,313 @@
+/* linbox/field/ntl-z_pE.h
+ * Copyright (C) 2004 Pascal Giorgi
+ * Copyright (C) 2011 LinBox
+ *
+ * Written by Pascal Giorgi <pascal.giorgi at ens-lyon.fr>
+ *
+ * Modified by W. J. Turner <wjturner at acm.org>
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ * ========LICENCE========
+ */
+
+/*! @file field/ntl/ntl-lzz_pE.h
+ * @ingroup field
+ * @ingroup NTL
+ * @brief NO DOC
+ */
+
+#ifndef __LINBOX_field_ntl_lzz_pe_H
+#define __LINBOX_field_ntl_lzz_pe_H
+
+#ifndef __LINBOX_HAVE_NTL
+#error "you need NTL here"
+#endif
+
+#include <NTL/lzz_pXFactoring.h>
+#include <NTL/lzz_pE.h>
+#include <time.h>
+#include "linbox/linbox-config.h"
+#include "linbox/util/debug.h"
+
+#include <givaro/zring.h>
+#include "linbox/field/field-traits.h"
+
+
+
+#include "linbox/integer.h"
+
+namespace Givaro
+{
+ template<>
+ NTL::zz_pE& Caster(NTL::zz_pE &x, const Integer &y)
+ {
+ x=NTL::to_zz_pE(static_cast<int64_t>(y));
+ return x;
+ }
+ template<>
+ NTL::zz_pE& Caster(NTL::zz_pE &x, const double &y)
+ {
+ x=NTL::to_zz_pE(static_cast<long>(y));
+ return x;
+ }
+
+ template<>
+ Integer& Caster (Integer& x, const NTL::zz_pE &y) {
+ NTL::zz_pX poly = rep(y);
+ Integer base = static_cast<int64_t>(NTL::zz_p::modulus());
+ long i = deg(poly)+1;
+ x = 0;
+ for( ; i-- ; ) {
+ x *= base;
+ x += int64_t(NTL::to_long(rep(coeff(poly, i))));
+ }
+ return x;
+ }
+} // namespace Givaro
+
+
+
+// Namespace in which all LinBox library code resides
+namespace LinBox
+{
+
+ //! use ZZ_pEBak mechanism too ?
+ class NTL_zz_pE_Initialiser {
+ public :
+ NTL_zz_pE_Initialiser( const Integer & p, const Integer & k) {
+ NTL::zz_p::init( (int64_t) p);
+ NTL::zz_pX irredPoly = NTL::BuildIrred_zz_pX ((int64_t) k);
+ NTL::zz_pE::init(irredPoly);
+
+ }
+
+ // template <class ElementInt>
+ // NTL_zz_pE_Initialiser(const ElementInt& d) {
+ // NTL::ZZ_p::init (NTL::to_ZZ(d));
+ // }
+
+ // NTL_zz_pE_Initialiser (const NTL::ZZ& d) {
+ // NTL::ZZ_p::init(d);
+ // }
+
+ };
+
+
+
+
+
+ /*! @brief zz_pE
+ * Define a parameterized class to easily handle Givaro::ZRing<NTL::zz_pE> field
+ */
+
+ /// \brief for large cardinality, small prime. \ingroup field
+ class NTL_zz_pE : public NTL_zz_pE_Initialiser, public Givaro::UnparametricOperations<NTL::zz_pE> {
+ public:
+ typedef NTL::zz_pE Element ;
+ typedef Givaro::UnparametricOperations<Element> Father_t ;
+ typedef UnparametricRandIter<Element> RandIter;
+
+ const Element zero,one,mOne ;
+
+ NTL_zz_pE (const integer &p, const integer &k) :
+ NTL_zz_pE_Initialiser(p,k),Father_t ()
+ //,zero( NTL::to_zz_pE(0)),one( NTL::to_zz_pE(1)),mOne(-one)
+
+ { init(const_cast<Element &>(zero), 0);
+ init(const_cast<Element &>(one), 1);
+ init(const_cast<Element &>(mOne), p-1);
+
+ /*
+ NTL::clear(const_cast<Element &>(zero));
+ NTL::set(const_cast<Element &>(one));
+ init(const_cast<Element &>(mOne));
+ neg(const_cast<Element &>(mOne), one);
+ */
+ }
+
+ Element& random (Element& x) const
+ {
+ NTL::random(x);
+ return x;
+ }
+
+
+ bool isZero (const Element& a) const
+ {
+ return NTL::IsZero(a);
+ }
+
+
+ bool isOne (const Element& a) const
+ {
+ return NTL::IsOne(a);
+ }
+
+ bool isMOne (const Element& x) const
+ {
+ Element y ; neg(y,x);
+ return isOne(y);
+ }
+
+ NTL::zz_pX & init(NTL::zz_pX & f, integer n, int e) const
+ { integer base = characteristic();
+ NTL::zz_pX x; SetCoeff(x, 1);
+ if ( n != 0 and e > 0 )
+ f = static_cast<int64_t>(n%base) + x*init(f, n/base, e-1);
+ return f;
+ }
+
+ Element & init(Element & x, integer n = 0) const
+ { // assumes n >= 0.
+ int e = exponent();
+ n %= cardinality();
+ init(const_cast<NTL::zz_pX &>(rep(x)), n, e);
+ //write(std::cout << "init-ed ", x) << std::endl;
+ return x;
+ }
+
+ integer & convert(integer & x, const Element & y) const
+ {
+ NTL::zz_pX poly = rep(y);
+ integer base = characteristic();
+ long i = deg(poly)+1;
+ x = 0;
+ for( ; i-- ; ) {
+ x *= base;
+ x += static_cast<int64_t>(NTL::to_long(rep(coeff(poly, i))));
+ }
+ return x;
+ }
+
+ integer& characteristic (integer &c) const
+ { return c = characteristic(); }
+ integer characteristic () const
+ {
+ return static_cast<int64_t>(NTL::zz_p::modulus());
+ }
+
+
+ integer& cardinality(integer& c) const
+ { return c = cardinality(); }
+
+ int exponent() const
+ {
+ return (int) NTL::zz_pE::degree();
+ }
+
+ integer cardinality() const
+ {
+ int32_t e = exponent();
+ int64_t p = characteristic();
+ integer c(1);
+ for(int32_t i = 0; i < e; ++i)
+ c *= p;
+ return c;
+ }
+
+ static inline integer maxCardinality()
+ { return NTL_zz_p::maxCardinality(); }
+
+
+ Element& inv(Element& x, const Element& y) const
+ {
+ x=one/y;
+ return x;
+ }
+
+ Element& invin(Element& x) const
+ {
+ x=one/x;
+ return x;
+ }
+
+
+
+ std::istream& read(std::istream& is, Element& x) const
+ {
+ long tmp = 0;
+ is>>tmp;
+ x=NTL::to_zz_pE(tmp);
+ return is;
+ }
+ }; // end of class NTL_zz_pE
+
+
+
+
+
+
+ template <class Ring>
+ struct ClassifyRing;
+
+ template<>
+ struct ClassifyRing<UnparametricRandIter<NTL::zz_pE> > {
+ typedef RingCategories::ModularTag categoryTag;
+ };
+
+ template<>
+ class UnparametricRandIter<NTL::zz_pE> {
+ public:
+ typedef NTL::zz_pE Element;
+ UnparametricRandIter<NTL::zz_pE>(const NTL_zz_pE & F ,
+ const size_t& size = 0,
+ const size_t& seed = 0
+ ) :
+ _size(size), _seed(seed), _ring(F)
+ {
+ if(_seed == 0)
+ NTL::SetSeed(NTL::to_ZZ(time(0)));
+ else
+ NTL::SetSeed(NTL::to_ZZ(_seed));
+ }
+
+ const NTL_zz_pE& ring() const { return _ring; }
+ UnparametricRandIter<NTL::zz_pE>(const UnparametricRandIter<NTL::zz_pE>& R) :
+ _size(R._size), _seed(R._seed), _ring(R._ring)
+
+ {
+ if(_seed == 0)
+ NTL::SetSeed(NTL::to_ZZ(time(0)));
+ else
+ NTL::SetSeed(NTL::to_ZZ(_seed));
+ }
+
+ Element& random (Element& x) const
+ {
+ NTL::random(x);
+ return x;
+ }
+
+ protected:
+ size_t _size;
+ size_t _seed;
+ const NTL_zz_pE& _ring;
+ }; // class UnparametricRandIters
+} // LinBox
+
+#endif //__LINBOX_ntl_lzz_pe_H
+
+
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+
diff --git a/linbox/ring/ntl/ntl-lzz_pex.h b/linbox/ring/ntl/ntl-lzz_pex.h
new file mode 100644
index 0000000..a34fef5
--- /dev/null
+++ b/linbox/ring/ntl/ntl-lzz_pex.h
@@ -0,0 +1,447 @@
+/* Copyright (C) 2005 LinBox
+ * Copyright (C) 2011 LinBox
+ *
+ *
+ * Written by Daniel Roche, August 2005
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ * ========LICENCE========
+ */
+
+/*! @file ring/ntl/ntl-lzz_pEX.h
+ * @ingroup ring
+ * @ingroup NTL
+ * @brief NO DOC
+ */
+
+#ifndef __LINBOX_field_ntl_lzz_pEX_H
+#define __LINBOX_field_ntl_lzz_pEX_H
+
+#ifndef __LINBOX_HAVE_NTL
+#error "you need NTL here"
+#endif
+
+#include <vector>
+#include <NTL/lzz_pEX.h>
+
+
+#include "linbox/linbox-config.h"
+#include "linbox/util/debug.h"
+
+#include <givaro/zring.h>
+#include "linbox/ring/ntl/ntl-lzz_pe.h"
+#include "linbox/integer.h"
+
+
+// Namespace in which all LinBox code resides
+namespace LinBox
+{
+ class NTL_zz_pEX_Initialiser {
+ public :
+ NTL_zz_pEX_Initialiser( const Integer & q, size_t e = 1) {
+ if ( q > 0 )
+ NTL::zz_p::init(static_cast<int64_t>(q)); // it's an error if q not prime
+ NTL::zz_pX irredPoly = NTL::BuildIrred_zz_pX ((long) e);
+ NTL::zz_pE::init(irredPoly);
+ }
+
+ // template <class ElementInt>
+ // NTL_zz_pEX_Initialiser(const ElementInt& d) {
+ // NTL::ZZ_p::init (NTL::to_ZZ(d));
+ // }
+
+ NTL_zz_pEX_Initialiser () { }
+
+ };
+
+ /** Ring (in fact, a unique factorization domain) of polynomial with
+ * coefficients in class NTL_zz_p (integers mod a wordsize prime).
+ * All the same functions as any other ring, with the addition of:
+ * Coeff (type), CoeffField (type), getCoeffField, setCoeff, getCoeff,
+ * leadCoeff, deg
+ */
+ class NTL_zz_pEX : public NTL_zz_pEX_Initialiser, public Givaro::UnparametricOperations<NTL::zz_pEX> {
+ public:
+ typedef NTL::zz_pEX Element ;
+ typedef Givaro::UnparametricOperations<Element> Father_t ;
+ typedef UnparametricRandIter<Element> RandIter;
+
+
+ typedef NTL_zz_pE CoeffField;
+ typedef NTL::zz_pE Coeff;
+ // typedef NTL::zz_pEX Element;
+
+ const Element zero,one,mOne ;
+
+
+ /** Standard LinBox field constructor. The paramters here
+ * (prime, exponent) are only used to initialize the coefficient field.
+ */
+ NTL_zz_pEX( const integer& p, size_t e = 1 ) :
+ // Givaro::ZRing<NTL::zz_pEX>(p, e), _CField(p,e)
+ NTL_zz_pEX_Initialiser(p,e),Father_t ()
+ , zero( NTL::to_zz_pEX(0)),one( NTL::to_zz_pEX(1)),mOne(-one)
+ , _CField(p,e)
+ {}
+
+ /** Constructor from a coefficient field */
+ NTL_zz_pEX( CoeffField cf ) :
+ NTL_zz_pEX_Initialiser(cf.cardinality()),Father_t ()
+ ,zero( NTL::to_zz_pEX(0)),one( NTL::to_zz_pEX(1)),mOne(-one)
+ ,_CField(cf)
+ {}
+
+ Element& init( Element& p) const
+ { return init(p, 0); }
+
+ Element& init( Element& p, integer n ) const
+ {
+ p = 0;
+ integer base;
+ Coeff a;
+ _CField.cardinality(base);
+ for (int i = 0; n > 0; n /= base, ++i)
+ {
+ _CField.init(a, n%base);
+ NTL::SetCoeff( p, i, a );
+ }
+ return p;
+ }
+
+ integer& convert( integer& n, Element& p ) const
+ {
+ integer base;
+ integer d;
+ _CField.cardinality(base);
+ n = 0;
+ for (int i = (int)deg(p); i >= 0; --i)
+ {
+ n *= base;
+ n += _CField.convert(d, NTL::coeff(p, i));
+ }
+ return n;
+ }
+
+#if 0
+ /** Initialize p to the constant y (p = y*x^0) */
+ template <class ANY>
+ Element& init( Element& p, const ANY& y = 0) const
+ {
+ Coeff temp;
+ _CField.init( temp, y );
+ return p = temp;
+ }
+#endif
+
+ /** Initialize p to the constant y (p = y*x^0) */
+ Element& init( Element& p, const Coeff& y ) const
+ {
+ return p = y;
+ }
+
+ /** Initialize p from a vector of coefficients.
+ * The vector should be ordered the same way NTL does it: the front
+ * of the vector corresponds to the trailing coefficients, and the back
+ * of the vector corresponds to the leading coefficients. That is,
+ * v[i] = coefficient of x^i.
+ */
+ template <class ANY>
+ Element& init( Element& p, const std::vector<ANY>& v ) const
+ {
+ p = 0;
+ Coeff temp;
+ for( long i = 0; i < (long)v.size(); ++i ) {
+ _CField.init( temp, v[ (size_t) i ] );
+ if( !_CField.isZero(temp) )
+ NTL::SetCoeff( p, i, temp );
+ }
+ return p;
+ }
+ template <class ANY>
+ Element& init( Element& p, const BlasVector<ANY>& v ) const
+ {
+ p = 0;
+ Coeff temp;
+ for( long i = 0; i < (long)v.size(); ++i ) {
+ _CField.init( temp, v[ (size_t) i ] );
+ if( !_CField.isZero(temp) )
+ NTL::SetCoeff( p, i, temp );
+ }
+ return p;
+ }
+
+
+ /** Initialize p from a vector of coefficients.
+ * The vector should be ordered the same way NTL does it: the front
+ * of the vector corresponds to the trailing coefficients, and the back
+ * of the vector corresponds to the leading coefficients. That is,
+ * v[i] = coefficient of x^i.
+ */
+ Element& init( Element& p, const std::vector<Coeff>& v ) const
+ {
+ p = 0;
+ for( long i = 0; i < (long)v.size(); ++i )
+ NTL::SetCoeff( p, i, v[ (size_t) i ] );
+ return p;
+ }
+
+ /** Convert p to a vector of coefficients.
+ * The vector will be ordered the same way NTL does it: the front
+ * of the vector corresponds to the trailing coefficients, and the back
+ * of the vector corresponds to the leading coefficients. That is,
+ * v[i] = coefficient of x^i.
+ */
+ template< class ANY >
+ std::vector<ANY>& convert( std::vector<ANY>& v, const Element& p ) const
+ {
+ v.clear();
+ ANY temp;
+ for( long i = 0; i <= (long)this->deg(p); ++i ) {
+ _CField.convert( temp, NTL::coeff( p, i ) );
+ v.push_back( temp );
+ }
+ return v;
+ }
+
+ /** Convert p to a vector of coefficients.
+ * The vector will be ordered the same way NTL does it: the front
+ * of the vector corresponds to the trailing coefficients, and the back
+ * of the vector corresponds to the leading coefficients. That is,
+ * v[i] = coefficient of x^i.
+ */
+ std::vector<Coeff>& convert( std::vector<Coeff>& v, const Element& p ) const
+ {
+ v.clear();
+ for( long i = 0; i <= (long)this->deg(p); ++i )
+ v.push_back( NTL::coeff(p,i) );
+ return v;
+ }
+
+ /** Test if an element equals zero */
+ bool isZero( const Element& x ) const
+ {
+ return ( (this->deg(x) == 0) &&
+ ( _CField.isZero( NTL::ConstTerm(x) ) ) );
+ }
+
+ /** Test if an element equals one */
+ bool isOne( const Element& x ) const
+ {
+ return ( (this->deg(x) == 0) &&
+ ( _CField.isOne( NTL::ConstTerm(x) ) ) );
+ }
+
+ bool isMOne (const Element& x) const
+ {
+ return ( (this->deg(x) == 0) &&
+ ( _CField.isMOne( NTL::ConstTerm(x) ) ) );
+
+ }
+
+ /** The LinBox field for coefficients */
+ const CoeffField& getCoeffField() const
+ { return _CField; }
+
+ /** Get the degree of a polynomial
+ * Unlike NTL, deg(0)=0.
+ */
+ size_t deg( const Element& p ) const
+ {
+ long temp = NTL::deg(p);
+ if( temp == -1 ) return 0;
+ else return static_cast<size_t>(temp);
+ }
+
+ /** r will be set to the reverse of p. */
+ Element& rev( Element& r, const Element& p ) {
+ NTL::reverse(r,p);
+ return r;
+ }
+
+ /** r is itself reversed. */
+ Element& revin( Element& r ) {
+ return r = NTL::reverse(r);
+ }
+
+ /** Get the leading coefficient of this polynomial. */
+ Coeff& leadCoeff( Coeff& c, const Element& p ) const
+ {
+ c = NTL::LeadCoeff(p);
+ return c;
+ }
+
+ /** Get the coefficient of x^i in a given polynomial */
+ Coeff& getCoeff( Coeff& c, const Element& p, size_t i ) const
+ {
+ c = NTL::coeff( p, (long)i );
+ return c;
+ }
+
+ /** Set the coefficient of x^i in a given polynomial */
+ Element& setCoeff( Element& p, size_t i, const Coeff& c ) const
+ {
+ NTL::SetCoeff(p,(long)i,c);
+ return p;
+ }
+
+ /** Get the quotient of two polynomials */
+ Element& quo( Element& res, const Element& a, const Element& b ) const
+ {
+ NTL::div(res,a,b);
+ return res;
+ }
+
+ /** a = quotient of a, b */
+ Element& quoin( Element& a, const Element& b ) const
+ {
+ return a /= b;
+ }
+
+ /** Get the remainder under polynomial division */
+ Element& rem( Element& res, const Element& a, const Element& b ) const
+ {
+ NTL::rem(res,a,b);
+ return res;
+ }
+
+ /** a = remainder of a,b */
+ Element& remin( Element& a, const Element& b ) const
+ {
+ return a %= b;
+ }
+
+ /** Get the quotient and remainder under polynomial division */
+ void quorem( Element& q, Element& r,
+ const Element& a, const Element& b ) const
+ {
+ NTL::DivRem(q,r,a,b);
+ }
+
+ Element& inv( Element& y, const Element& x ) const
+ {
+ // Element one(0, 1);
+ return quo(y,one,x);
+ }
+
+ Element& invin( Element& y ) const
+ {
+ Element x = y;
+ return inv(y, x);
+ }
+
+ /** Get characteristic of the field - same as characteristic of
+ * coefficient field. */
+ integer& characteristic( integer& c ) const
+ { return _CField.characteristic(c); }
+
+ /** Get the cardinality of the field. Since the cardinality is
+ * infinite, by convention we return -1.
+ */
+ integer& cardinality( integer& c ) const
+ { return c = static_cast<integer>(-1); }
+
+ static inline integer maxCardinality()
+ { return NTL_zz_p::maxCardinality(); }
+ /** Write a description of the field */
+ // Oustide of class definition so write(ostream&,const Element&) from
+ // Givaro::ZRing still works.
+
+ std::ostream& write( std::ostream& os ) const
+ {
+ return os << "Polynomial ring using NTL::zz_pEX";
+ }
+ std::ostream& write( std::ostream& os, const Element& x) const
+ { return Father_t::write(os, x); }
+
+ /** Conversion to scalar types doesn't make sense and should not be
+ * used. Use getCoeff or leadCoeff to get the scalar values of
+ * specific coefficients, and then convert them using coeffField()
+ * if needed.
+ */
+ template< class ANY >
+ ANY& convert( ANY& x, const Element& y ) const
+ { return x; }
+
+ protected:
+ CoeffField _CField;
+ }; // end of class NTL_zz_pEX
+
+
+
+
+ template <class Ring>
+ struct ClassifyRing;
+
+ template<>
+ struct ClassifyRing<UnparametricRandIter<NTL::zz_pEX> > {
+ typedef RingCategories::ModularTag categoryTag;
+ };
+
+ template<>
+ class UnparametricRandIter<NTL::zz_pEX> {
+ public:
+ typedef NTL::zz_pEX Element;
+ UnparametricRandIter<NTL::zz_pEX>(const NTL_zz_pEX & F ,
+ const size_t& size = 0,
+ const size_t& seed = 0
+ ) :
+ _size(size), _seed(seed), _ring(F)
+ {
+ if(_seed == 0)
+ NTL::SetSeed(NTL::to_ZZ(time(0)));
+ else
+ NTL::SetSeed(NTL::to_ZZ(_seed));
+ }
+
+ const NTL_zz_pEX& ring() const { return _ring; }
+
+ UnparametricRandIter<NTL::zz_pEX>(const UnparametricRandIter<NTL::zz_pEX>& R) :
+ _size(R._size), _seed(R._seed), _ring(R._ring)
+
+ {
+ if(_seed == 0)
+ NTL::SetSeed(NTL::to_ZZ(time(0)));
+ else
+ NTL::SetSeed(NTL::to_ZZ(_seed));
+ }
+
+ Element& random (Element& x) const
+ {
+ NTL::random(x, 1);
+ return x;
+ }
+
+ protected:
+ size_t _size;
+ size_t _seed;
+ const NTL_zz_pEX& _ring;
+ }; // class UnparametricRandIters
+
+} // end of namespace LinBox
+
+#endif // __LINBOX_field_ntl_lzz_pEX_H
+
+
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+
diff --git a/linbox/ring/ntl/ntl-lzz_px.h b/linbox/ring/ntl/ntl-lzz_px.h
new file mode 100644
index 0000000..fa43878
--- /dev/null
+++ b/linbox/ring/ntl/ntl-lzz_px.h
@@ -0,0 +1,442 @@
+/* Copyright (C) 2005 LinBox
+ * Copyright (C) 2011 LinBox
+ *
+ *
+ * Written by Daniel Roche, August 2005
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ * ========LICENCE========
+ */
+
+/*! @file ring/ntl/ntl-lzz_pX.h
+ * @ingroup ring
+ * @ingroup NTL
+ * @brief NO DOC
+ */
+
+#ifndef __LINBOX_field_ntl_lzz_px_H
+#define __LINBOX_field_ntl_lzz_px_H
+
+#ifndef __LINBOX_HAVE_NTL
+#error "you need NTL here"
+#endif
+
+#include <vector>
+#include <NTL/lzz_pX.h>
+
+
+#include "linbox/linbox-config.h"
+#include "linbox/util/debug.h"
+
+#include <givaro/zring.h>
+#include "linbox/ring/ntl/ntl-lzz_p.h"
+#include "linbox/integer.h"
+
+
+// Namespace in which all LinBox code resides
+namespace LinBox
+{
+ class NTL_zz_pX_Initialiser {
+ public :
+ NTL_zz_pX_Initialiser( const Integer & q, size_t e = 1) {
+ linbox_check(e == 1);
+ if ( q > 0 )
+ NTL::zz_p::init(int64_t(q)); // it's an error if q not prime, e not 1
+ }
+
+ // template <class ElementInt>
+ // NTL_zz_pX_Initialiser(const ElementInt& d) {
+ // NTL::ZZ_p::init (NTL::to_ZZ(d));
+ // }
+
+ NTL_zz_pX_Initialiser () { }
+
+ };
+
+ /** Ring (in fact, a unique factorization domain) of polynomial with
+ * coefficients in class NTL_zz_p (integers mod a wordsize prime).
+ * All the same functions as any other ring, with the addition of:
+ * Coeff (type), CoeffField (type), getCoeffField, setCoeff, getCoeff,
+ * leadCoeff, deg
+ */
+ class NTL_zz_pX : public NTL_zz_pX_Initialiser, public Givaro::UnparametricOperations<NTL::zz_pX> {
+ public:
+ typedef NTL::zz_pX Element ;
+ typedef Givaro::UnparametricOperations<Element> Father_t ;
+ typedef UnparametricRandIter<Element> RandIter;
+
+
+ typedef NTL_zz_p CoeffField;
+ typedef NTL::zz_p Coeff;
+ // typedef NTL::zz_pX Element;
+
+ const Element zero,one,mOne ;
+
+
+ /** Standard LinBox field constructor. The paramters here
+ * (prime, exponent) are only used to initialize the coefficient field.
+ */
+ NTL_zz_pX( const integer& p, size_t e = 1 ) :
+ // Givaro::ZRing<NTL::zz_pX>(p, e), _CField(p,e)
+ NTL_zz_pX_Initialiser(p,e),Father_t ()
+ , zero( NTL::to_zz_pX(0)),one( NTL::to_zz_pX(1)),mOne(-one)
+ , _CField(p,e)
+ {}
+
+ /** Constructor from a coefficient field */
+ NTL_zz_pX( CoeffField cf ) :
+ NTL_zz_pX_Initialiser(cf.cardinality()),Father_t ()
+ ,zero( NTL::to_zz_pX(0)),one( NTL::to_zz_pX(1)),mOne(-one)
+ ,_CField(cf)
+ {}
+
+ Element& init( Element& p) const
+ { return init(p, 0); }
+
+ Element& init( Element& p, integer n ) const
+ {
+ p = 0;
+ integer base;
+ _CField.cardinality(base);
+ for (int i = 0; n > 0; n /= base, ++i)
+ NTL::SetCoeff( p, i, int64_t(n%base) );
+ return p;
+ }
+
+ integer& convert( integer& n, Element& p ) const
+ {
+ integer base;
+ Coeff x; integer a;
+ _CField.cardinality(base);
+ n = 0;
+ for (int i = (int)deg(p); i >= 0; --i)
+ {
+ n *= base;
+ NTL::GetCoeff(x, p, i );
+ n += _CField.convert(a, x);
+ }
+ return n;
+ }
+
+#if 0
+ /** Initialize p to the constant y (p = y*x^0) */
+ template <class ANY>
+ Element& init( Element& p, const ANY& y = 0) const
+ {
+ Coeff temp;
+ _CField.init( temp, y );
+ return p = temp;
+ }
+#endif
+
+ /** Initialize p to the constant y (p = y*x^0) */
+ Element& init( Element& p, const Coeff& y ) const
+ {
+ return p = y;
+ }
+
+ /** Initialize p from a vector of coefficients.
+ * The vector should be ordered the same way NTL does it: the front
+ * of the vector corresponds to the trailing coefficients, and the back
+ * of the vector corresponds to the leading coefficients. That is,
+ * v[i] = coefficient of x^i.
+ */
+ template <class ANY>
+ Element& init( Element& p, const std::vector<ANY>& v ) const
+ {
+ p = 0;
+ Coeff temp;
+ for( long i = 0; i < (long)v.size(); ++i ) {
+ _CField.init( temp, v[ (size_t) i ] );
+ if( !_CField.isZero(temp) )
+ NTL::SetCoeff( p, i, temp );
+ }
+ return p;
+ }
+ template <class ANY>
+ Element& init( Element& p, const BlasVector<ANY>& v ) const
+ {
+ p = 0;
+ Coeff temp;
+ for( long i = 0; i < (long)v.size(); ++i ) {
+ _CField.init( temp, v[ (size_t) i ] );
+ if( !_CField.isZero(temp) )
+ NTL::SetCoeff( p, i, temp );
+ }
+ return p;
+ }
+
+
+ /** Initialize p from a vector of coefficients.
+ * The vector should be ordered the same way NTL does it: the front
+ * of the vector corresponds to the trailing coefficients, and the back
+ * of the vector corresponds to the leading coefficients. That is,
+ * v[i] = coefficient of x^i.
+ */
+ Element& init( Element& p, const std::vector<Coeff>& v ) const
+ {
+ p = 0;
+ for( long i = 0; i < (long)v.size(); ++i )
+ NTL::SetCoeff( p, i, v[ (size_t) i ] );
+ return p;
+ }
+
+ /** Convert p to a vector of coefficients.
+ * The vector will be ordered the same way NTL does it: the front
+ * of the vector corresponds to the trailing coefficients, and the back
+ * of the vector corresponds to the leading coefficients. That is,
+ * v[i] = coefficient of x^i.
+ */
+ template< class ANY >
+ std::vector<ANY>& convert( std::vector<ANY>& v, const Element& p ) const
+ {
+ v.clear();
+ ANY temp;
+ for( long i = 0; i <= (long)this->deg(p); ++i ) {
+ _CField.convert( temp, NTL::coeff( p, i ) );
+ v.push_back( temp );
+ }
+ return v;
+ }
+
+ /** Convert p to a vector of coefficients.
+ * The vector will be ordered the same way NTL does it: the front
+ * of the vector corresponds to the trailing coefficients, and the back
+ * of the vector corresponds to the leading coefficients. That is,
+ * v[i] = coefficient of x^i.
+ */
+ std::vector<Coeff>& convert( std::vector<Coeff>& v, const Element& p ) const
+ {
+ v.clear();
+ for( long i = 0; i <= (long)this->deg(p); ++i )
+ v.push_back( NTL::coeff(p,i) );
+ return v;
+ }
+
+ /** Test if an element equals zero */
+ bool isZero( const Element& x ) const
+ {
+ return ( (this->deg(x) == 0) &&
+ ( _CField.isZero( NTL::ConstTerm(x) ) ) );
+ }
+
+ /** Test if an element equals one */
+ bool isOne( const Element& x ) const
+ {
+ return ( (this->deg(x) == 0) &&
+ ( _CField.isOne( NTL::ConstTerm(x) ) ) );
+ }
+
+ bool isMOne (const Element& x) const
+ {
+ return ( (this->deg(x) == 0) &&
+ ( _CField.isMOne( NTL::ConstTerm(x) ) ) );
+
+ }
+
+ /** The LinBox field for coefficients */
+ const CoeffField& getCoeffField() const
+ { return _CField; }
+
+ /** Get the degree of a polynomial
+ * Unlike NTL, deg(0)=0.
+ */
+ size_t deg( const Element& p ) const
+ {
+ long temp = NTL::deg(p);
+ if( temp == -1 ) return 0;
+ else return static_cast<size_t>(temp);
+ }
+
+ /** r will be set to the reverse of p. */
+ Element& rev( Element& r, const Element& p ) {
+ NTL::reverse(r,p);
+ return r;
+ }
+
+ /** r is itself reversed. */
+ Element& revin( Element& r ) {
+ return r = NTL::reverse(r);
+ }
+
+ /** Get the leading coefficient of this polynomial. */
+ Coeff& leadCoeff( Coeff& c, const Element& p ) const
+ {
+ c = NTL::LeadCoeff(p);
+ return c;
+ }
+
+ /** Get the coefficient of x^i in a given polynomial */
+ Coeff& getCoeff( Coeff& c, const Element& p, size_t i ) const
+ {
+ c = NTL::coeff( p, (long)i );
+ return c;
+ }
+
+ /** Set the coefficient of x^i in a given polynomial */
+ Element& setCoeff( Element& p, size_t i, const Coeff& c ) const
+ {
+ NTL::SetCoeff(p,(long)i,c);
+ return p;
+ }
+
+ /** Get the quotient of two polynomials */
+ Element& quo( Element& res, const Element& a, const Element& b ) const
+ {
+ NTL::div(res,a,b);
+ return res;
+ }
+
+ /** a = quotient of a, b */
+ Element& quoin( Element& a, const Element& b ) const
+ {
+ return a /= b;
+ }
+
+ /** Get the remainder under polynomial division */
+ Element& rem( Element& res, const Element& a, const Element& b ) const
+ {
+ NTL::rem(res,a,b);
+ return res;
+ }
+
+ /** a = remainder of a,b */
+ Element& remin( Element& a, const Element& b ) const
+ {
+ return a %= b;
+ }
+
+ /** Get the quotient and remainder under polynomial division */
+ void quorem( Element& q, Element& r,
+ const Element& a, const Element& b ) const
+ {
+ NTL::DivRem(q,r,a,b);
+ }
+
+ Element& inv( Element& y, const Element& x ) const
+ {
+ // Element one(0, 1);
+ return quo(y,one,x);
+ }
+
+ Element& invin( Element& y ) const
+ {
+ Element x = y;
+ return inv(y, x);
+ }
+
+ /** Get characteristic of the field - same as characteristic of
+ * coefficient field. */
+ integer& characteristic( integer& c ) const
+ { return _CField.characteristic(c); }
+
+ /** Get the cardinality of the field. Since the cardinality is
+ * infinite, by convention we return -1.
+ */
+ integer& cardinality( integer& c ) const
+ { return c = static_cast<integer>(-1); }
+
+ static inline integer maxCardinality()
+ { return CoeffField::maxCardinality(); }
+ /** Write a description of the field */
+ // Oustide of class definition so write(ostream&,const Element&) from
+ // Givaro::ZRing still works.
+
+ std::ostream& write( std::ostream& os ) const
+ {
+ return os << "Polynomial ring using NTL::zz_pX";
+ }
+ std::ostream& write( std::ostream& os, const Element& x) const
+ { return Father_t::write(os, x); }
+
+ /** Conversion to scalar types doesn't make sense and should not be
+ * used. Use getCoeff or leadCoeff to get the scalar values of
+ * specific coefficients, and then convert them using coeffField()
+ * if needed.
+ */
+ template< class ANY >
+ ANY& convert( ANY& x, const Element& y ) const
+ { return x; }
+
+ protected:
+ CoeffField _CField;
+ }; // end of class NTL_zz_pX
+
+
+
+
+ template <class Ring>
+ struct ClassifyRing;
+
+ template<>
+ struct ClassifyRing<UnparametricRandIter<NTL::zz_pX> > {
+ typedef RingCategories::ModularTag categoryTag;
+ };
+
+ template<>
+ class UnparametricRandIter<NTL::zz_pX> {
+ public:
+ typedef NTL::zz_pX Element;
+ UnparametricRandIter<NTL::zz_pX>(const NTL_zz_pX & F ,
+ const size_t& size = 0,
+ const size_t& seed = 0
+ ) :
+ _size(size), _seed(seed), _ring(F)
+ {
+ if(_seed == 0)
+ NTL::SetSeed(NTL::to_ZZ(time(0)));
+ else
+ NTL::SetSeed(NTL::to_ZZ(_seed));
+ }
+
+ const NTL_zz_pX& ring() const { return _ring; }
+ UnparametricRandIter<NTL::zz_pX>(const UnparametricRandIter<NTL::zz_pX>& R) :
+ _size(R._size), _seed(R._seed), _ring(R._ring)
+
+ {
+ if(_seed == 0)
+ NTL::SetSeed(NTL::to_ZZ(time(0)));
+ else
+ NTL::SetSeed(NTL::to_ZZ(_seed));
+ }
+
+ Element& random (Element& x) const
+ {
+ NTL::random(x, 1);
+ return x;
+ }
+
+ protected:
+ size_t _size;
+ size_t _seed;
+ const NTL_zz_pX& _ring;
+ }; // class UnparametricRandIters
+
+} // end of namespace LinBox
+
+#endif // __LINBOX_field_ntl_lzz_px_H
+
+
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+
diff --git a/linbox/ring/ntl/ntl-rr.h b/linbox/ring/ntl/ntl-rr.h
new file mode 100644
index 0000000..c9c57b2
--- /dev/null
+++ b/linbox/ring/ntl/ntl-rr.h
@@ -0,0 +1,356 @@
+/* linbox/field/ntl-RR.h
+ * Copyright (C) 1999-2005 William J Turner,
+ * 2001 Bradford Hovinen
+ * Copyright (C) 2011 LinBox
+ *
+ * Written by W. J. Turner <wjturner at acm.org>,
+ * Bradford Hovinen <hovinen at cis.udel.edu>
+ *
+ * ------------------------------------
+ *
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ * ========LICENCE========
+ *.
+ */
+
+/*! @file field/ntl/ntl-RR.h
+ * @ingroup field
+ * @ingroup NTL
+ * @brief NO DOC
+ */
+
+#ifndef __LINBOX_field_ntl_rr_H
+#define __LINBOX_field_ntl_rr_H
+
+#include <sstream>
+#include "linbox/linbox-config.h"
+
+#ifndef __LINBOX_HAVE_NTL
+#error "you need NTL here"
+#endif
+
+
+#include <NTL/tools.h>
+#include <NTL/RR.h>
+
+#include "linbox/util/debug.h"
+
+#include <givaro/zring.h>
+#include <givaro/unparametric-operations.h>
+#include "linbox/field/field-traits.h"
+
+#include "linbox/integer.h"
+
+namespace Givaro
+{
+ /** Initialization of field element from an integer.
+ * Behaves like C++ allocator construct.
+ * This function assumes the output field element x has already been
+ * constructed, but that it is not already initialized.
+ * For now, this is done by converting the integer type to a C++
+ * long and then to the element type through the use of static cast and
+ * NTL's to_RR function.
+ * This, of course, assumes such static casts are possible.
+ * This function should be changed in the future to avoid using long.
+ * @return reference to field element.
+ * @param x field element to contain output (reference returned).
+ * @param y integer.
+ */
+ template <>
+ NTL::RR& Caster(NTL::RR& x, const Integer& y)
+ {
+ std::stringstream s;
+ s << y;
+ s >> x;
+ return x;
+ //return x = NTL::to_RR(static_cast<long>(y));
+ }
+ template <> NTL::RR& Caster(NTL::RR& x, const double& y) { return x = NTL::to_RR((long)(y)); }
+
+ template <> NTL::RR& Caster(NTL::RR& x, const int32_t& y) { return x = NTL::to_RR((long)(y)); }
+
+ template <> NTL::RR& Caster(NTL::RR& x, const int64_t& y) { return x = NTL::to_RR((long)(y)); }
+
+ template <> NTL::RR& Caster(NTL::RR& x, const uint32_t& y) { return x = NTL::to_RR((unsigned long)(y)); }
+
+ template <> NTL::RR& Caster(NTL::RR& x, const uint64_t& y) { return x = NTL::to_RR((unsigned long)(y)); }
+
+ /** Conversion of field element to an integer.
+ * This function assumes the output field element x has already been
+ * constructed, but that it is not already initialized.
+ * For now, this is done by converting the element type to a C++
+ * long and then to the integer type through the use of static cast and
+ * NTL's to_long function.
+ * This, of course, assumes such static casts are possible.
+ * This function should be changed in the future to avoid using long.
+ * @return reference to integer.
+ * @param x reference to integer to contain output (reference returned).
+ * @param y constant reference to field element.
+ */
+ template <>
+ Integer& Caster(Integer& x, const NTL::RR& y)
+ {
+ std::stringstream s;
+ s << y;
+ s >> x;
+ return x;
+ //return x = static_cast<Integer>(to_long(y));
+ }
+} // namespace Givaro
+
+
+
+
+// Namespace in which all LinBox library code resides
+namespace LinBox
+{
+
+ class NTL_RR_Initialiser {
+ public :
+ NTL_RR_Initialiser () { }
+ };
+
+ template<class XXX> class UnparametricRandIter;
+
+
+ /** @name class RR.
+ \brief
+ * Rational number field.
+ * This field is provided as a convenience in a few places.
+ * Use with caution because expression swell.
+ *
+ * This specialization allows the \ref Givaro::ZRing template class to be
+ * used to wrap NTL's RR class as a LinBox field.
+ \ingroup field
+ */
+ //@{
+
+
+ struct NTL_RR: public NTL_RR_Initialiser, public Givaro::UnparametricOperations<NTL::RR> {
+ typedef NTL::RR Element ;
+ typedef Givaro::UnparametricOperations<Element> Father_t ;
+ typedef UnparametricRandIter<Element> RandIter;
+
+ const Element zero,one,mOne ;
+
+ NTL_RR() :
+ NTL_RR_Initialiser(),Father_t ()
+ ,zero( NTL::to_RR(0)),one( NTL::to_RR(1)),mOne(-one)
+ {
+ // no default - allow initialization of ZZ_p directly by user.
+ }
+
+
+ /** Multiplicative Inverse.
+ * x = 1 / y
+ * This function assumes both field elements have already been
+ * constructed and initialized.
+ * @return reference to x.
+ * @param x field element (reference returned).
+ * @param y field element.
+ */
+ Element& inv(Element& x, const Element& y) const
+ {
+ return x = NTL::inv(y);
+ }
+
+ /** Zero equality.
+ * Test if field element is equal to zero.
+ * This function assumes the field element has already been
+ * constructed and initialized.
+ * In this specialization, NTL's IsZero function is called.
+ * @return boolean true if equals zero, false if not.
+ * @param x field element.
+ */
+ bool isZero(const Element& x) const
+ {
+ return static_cast<bool>(IsZero(x));
+ }
+
+ /** One equality.
+ * Test if field element is equal to one.
+ * This function assumes the field element has already been
+ * constructed and initialized.
+ * In this specialization, NTL's IsOne function is called.
+ * @return boolean true if equals one, false if not.
+ * @param x field element.
+ */
+ bool isOne(const Element& x) const
+ {
+ return static_cast<bool>(IsOne(x));
+ }
+ /** MOne equality.
+ * Test if field element is equal to one.
+ * This function assumes the field element has already been
+ * constructed and initialized.
+ * In this specialization, NTL's IsMOne function is called.
+ * @return boolean true if equals one, false if not.
+ * @param x field element.
+ */
+ bool isMOne(const Element& x) const
+ {
+ Element y ; neg(y,x);
+ return isOne(y);
+ }
+
+
+ /** Inplace Multiplicative Inverse.
+ * x = 1 / x
+ * This function assumes both field elements have already been
+ * constructed and initialized.
+ * @return reference to x.
+ * @param x field element (reference returned).
+ */
+ Element& invin(Element& x) const
+ {
+ return x = NTL::inv(x);
+ }
+
+ /** Print field.
+ * @return output stream to which field is written.
+ * @param os output stream to which field is written.
+ */
+ std::ostream& write(std::ostream& os) const
+ {
+ return os << "unparameterized field Element";
+ }
+
+ integer & cardinality(integer &c) const
+ {
+ return c = -1;
+ }
+
+ integer & characteristic(integer &c) const
+ {
+ return c = 0;
+ }
+
+ std::ostream &write (std::ostream &os, const Element &x) const {
+ return Givaro::UnparametricOperations<Element>::write(os,x);
+ }
+
+ Element& init (Element& x) const
+ {
+ return x;
+ }
+
+ template <typename Src>
+ Element& init (Element& x, const Src& s) const
+ {
+ return Caster (x, s);
+ }
+
+ template <typename T>
+ T& convert (T &x, const Element &y) const
+ {
+ return Caster (x,y);
+ }
+
+
+ };
+
+ template <>
+ class UnparametricRandIter<NTL::RR> {
+ typedef NTL::RR Element ;
+ protected:
+ integer _size,_seed;
+ const NTL_RR& _ring;
+ public:
+
+ UnparametricRandIter<NTL::RR> (const NTL_RR & F,
+ const integer& size = 0,
+ const integer& seed = 0) :
+ _size(size), _seed(seed), _ring(F)
+ {
+ if (_seed == integer(0)) _seed = int64_t(time(NULL));
+
+ // integer cardinality;
+ // F.cardinality(cardinality);
+ // if (_size > cardinality)
+ // _size = 0;
+
+#ifdef TRACE
+ std::cout << "created random generator with size " << _size
+ << " and seed " << _seed << std::endl;
+#endif // TRACE
+
+ // Seed random number generator
+ std::stringstream s; NTL::ZZ x;
+ s << _seed;
+ s >> x;
+ NTL::SetSeed(NTL::to_ZZ(x));
+ }
+
+ const NTL_RR& ring() const { return _ring; }
+
+ /** Random field element creator.
+ * This returns a random field element from the information supplied
+ * at the creation of the generator.
+ * This generator uses the built-in C++ random number generator instead of
+ * NTL's random function because the NTL function does not allow as much
+ * control over the sampling size as the generic LinBox template. This
+ * specialization is included only to allow conversion to an NTL
+ * object.
+ * @return random field element
+ */
+ Element& random(Element &elt) const
+ {
+ // NTL::random(elt);
+ // Create new random elements
+ if (_size == 0)
+ elt = rand();
+ else
+ elt = static_cast<double>((double(rand())/RAND_MAX)*double(_size));
+
+#ifdef TRACE
+ double temp ;
+ NTL::conv(temp, elt);
+ std::cout << "random double = " << temp << " random Element = " << elt << std::endl;
+#endif // TRACE
+
+ return elt;
+
+ } // element& operator() (void)
+
+ };
+
+ template <class Ring>
+ struct ClassifyRing;
+
+ template<class Element>
+ struct ClassifyRing<Givaro::ZRing<Element> >;
+
+ template<>
+ struct ClassifyRing<NTL_RR >{
+ typedef RingCategories::ModularTag categoryTag;
+ };
+ //@}
+} // namespace LinBox
+
+#endif // __LINBOX_field_ntl_rr_H
+
+
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+
diff --git a/linbox/ring/ntl/ntl-zz.h b/linbox/ring/ntl/ntl-zz.h
new file mode 100644
index 0000000..7b44bb1
--- /dev/null
+++ b/linbox/ring/ntl/ntl-zz.h
@@ -0,0 +1,782 @@
+/* Copyright (C) LinBox
+ * Author: Zhendong Wan
+ *
+ *
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ * ========LICENCE========
+ */
+
+/** @file field/ntl/ntl-ZZ.h
+ * @ingroup field
+ * @brief NO DOC
+ */
+
+#ifndef __LINBOX_ntl_zz_H
+#define __LINBOX_ntl_zz_H
+
+#include <NTL/ZZ.h>
+#include "linbox/integer.h"
+#include <iostream>
+#include "linbox/util/debug.h"
+#include "linbox/randiter/ntl-zz.h"
+#include "linbox/field/field-traits.h"
+
+namespace LinBox
+{
+
+ template <class Ring>
+ struct ClassifyRing ;
+
+ class NTL_ZZ;
+
+ template <>
+ struct ClassifyRing<NTL_ZZ>
+ {
+ typedef RingCategories::IntegerTag categoryTag;
+ };
+
+ template<class Field>
+ class FieldAXPY;
+
+ /// \brief the integer ring. \ingroup ring
+ class NTL_ZZ {
+
+ public:
+ typedef NTL_ZZRandIter RandIter;
+ typedef NTL_ZZ Father_t ;
+
+ typedef NTL::ZZ Element;
+ typedef NTL::ZZ Residu_t;
+ Element zero,one,mOne;
+
+ NTL_ZZ(int p = 0, int exp = 1)
+ {
+ if( p != 0 ) throw PreconditionFailed(LB_FILE_LOC,"modulus must be 0 (no modulus)");
+ if( exp != 1 ) throw PreconditionFailed(LB_FILE_LOC,"exponent must be 1");
+ }
+
+ inline integer& cardinality (integer& c) const
+ {
+ return c = -1;
+ }
+
+ inline integer& characteristic (integer& c)const
+ {
+ return c = 0;
+ }
+
+ template<class IntType>
+ inline IntType & characteristic (IntType& c)const
+ {
+ return c = 0;
+ }
+
+ std::ostream& write (std::ostream& out) const
+ {
+ return out << "NTL ZZ Ring";
+ }
+
+ std::istream& read (std::istream& in) const
+ {
+ return in;
+ }
+
+ /** @brief
+ * Init x from y.
+ */
+ template<class Element2>
+ inline Element& init (Element& x, const Element2& y) const
+ {
+
+ NTL::conv (x, y);
+
+ return x;
+ }
+
+ /** @brief
+ * Init from a NTL::ZZ
+ */
+ inline Element& init (Element& x, const Element& y) const
+ {
+
+ x = y;
+
+ return x;
+ }
+
+ /** @brief
+ * Init from an int64_t
+ */
+ inline Element& init (Element& x, const int64_t& y) const
+ {
+ bool isNeg = false;
+ uint64_t t;
+ if( y < 0 ) {
+ isNeg = true;
+ t = uint64_t(y * -1);
+ }
+ else t = (uint64_t) y;
+ init(x,t);
+ if( isNeg ) x *= -1;
+ return x;
+ }
+
+ /** @brief
+ * Init from a uint64_t
+ */
+ inline Element& init (Element& x, const uint64_t& y) const
+ {
+ uint64_t shift = (uint64_t)1 << 32;
+ uint32_t temp = uint32_t(y % shift);
+ NTL::conv (x,temp);
+ x <<= 32;
+ temp = (uint32_t)(y / shift);
+ x += temp;
+ return x;
+ }
+
+ /** @brief
+ * I don't know how to init from integer efficiently.
+ */
+ // c_str is safer than data, Z. W and BDS
+ inline Element& init (Element& x, const integer& y) const
+ {
+
+ return x=NTL::to_ZZ((std::string(y)).c_str());
+ }
+
+ /** @brief
+ * Convert y to an Element.
+ */
+ inline integer& convert (integer& x, const Element& y) const
+ {
+ bool Neg=false;
+ if (sign(y) <0)
+ Neg=true;
+ long b = NumBytes(y);
+ unsigned char* byteArray;
+ byteArray = new unsigned char[(size_t)b ];
+ BytesFromZZ(byteArray, y, b);
+
+ integer base(256);
+ x= integer(0);
+
+ for(long i = b - 1; i >= 0; --i) {
+ x *= base;
+ x += integer(byteArray[i]);
+ }
+ delete [] byteArray;
+ if (Neg)
+ x=-x;
+ return x;
+ }
+
+ inline double& convert (double& x, const Element& y) const
+ {
+ return x=NTL::to_double(y);
+ }
+
+
+
+ /** @brief
+ * x = y.
+ */
+ inline Element& assign (Element& x, const Element& y) const
+ {
+ return x = y;
+ }
+
+ /** @brief
+ * Test if x == y
+ */
+ inline bool areEqual (const Element& x ,const Element& y) const
+ {
+ return x == y;
+ }
+
+ /** @brief
+ * Test if x == 0
+ */
+ inline bool isZero (const Element& x) const
+ {
+ return NTL::IsZero (x);
+ }
+
+ /** @brief
+ * Test if x == 1
+ */
+ inline bool isOne (const Element& x) const
+ {
+ return NTL::IsOne (x);
+ }
+ /** @brief
+ * Test if x == -1
+ */
+ inline bool isMOne (const Element& x) const
+ {
+ Element y ; neg(y,x);
+ return isOne(y);
+
+ }
+
+
+ // arithmetic
+
+ /** @brief
+ * return x = y + z
+ */
+ inline Element& add (Element& x, const Element& y, const Element& z) const
+ {
+
+ NTL::add (x, y, z);
+
+ return x;
+ }
+
+ /** @brief
+ * return x = y - z
+ */
+ inline Element& sub (Element& x, const Element& y, const Element& z) const
+ {
+
+ NTL::sub (x, y, z);
+
+ return x;
+ }
+
+ /** @brief
+ * return x = y * z
+ */
+ template <class Int>
+ inline Element& mul (Element& x, const Element& y, const Int& z) const
+ {
+
+ NTL::mul (x, y, z);
+
+ return x;
+ }
+
+ /** @brief
+ * If z divides y, return x = y / z,
+ * otherwise, throw an exception
+ */
+ inline Element& div (Element& x, const Element& y, const Element& z) const
+ {
+
+ Element q, r;
+
+ NTL::DivRem (q, r, y, z);
+
+ if (NTL::IsZero (r))
+ return x = q;
+
+ else
+ throw PreconditionFailed(LB_FILE_LOC,"Div: not dividable");
+ }
+
+ /** @brief
+ * If y is a unit, return x = 1 / y,
+ * otherwsie, throw an exception
+ */
+ inline Element& inv (Element& x, const Element& y) const
+ {
+
+ if ( NTL::IsOne (y)) return x = y;
+
+ else if ( NTL::IsOne (-y)) return x = y;
+
+ else
+ throw PreconditionFailed(LB_FILE_LOC,"Inv: Not invertible");
+ }
+
+ /** @brief
+ * return x = -y;
+ */
+ inline Element& neg (Element& x, const Element& y) const
+ {
+
+ NTL::negate (x, y);
+
+ return x;
+ }
+
+
+ /** @brief
+ * return r = a x + y
+ */
+ template <class Int>
+ inline Element& axpy (Element& r, const Element& a, const Int& x, const Element& y) const
+ {
+
+ NTL::mul (r, a, x);
+
+ return r += y;
+ }
+
+
+ // inplace operator
+
+ /** @brief
+ * return x += y;
+ */
+ inline Element& addin (Element& x, const Element& y) const
+ {
+
+ return x += y;
+ }
+
+ /** @brief
+ * return x -= y;
+ */
+ inline Element& subin (Element& x, const Element& y) const
+ {
+
+ return x -= y;
+ }
+
+ /** @brief
+ * return x *= y;
+ */
+ template<class Int>
+ inline Element& mulin (Element& x, const Int& y) const
+ {
+
+ return x *= y;
+ }
+
+ /** @brief
+ * If y divides x, return x /= y,
+ * otherwise throw an exception
+ */
+ inline Element& divin (Element& x, const Element& y) const
+ {
+
+ div (x, x, y);
+
+ return x;
+ }
+
+ /** @brief
+ * If x is a unit, x = 1 / x,
+ * otherwise, throw an exception.
+ */
+ inline Element& invin (Element& x) {
+
+ if (NTL::IsOne (x)) return x;
+
+ else if (NTL::IsOne (-x)) return x;
+
+ else throw PreconditionFailed(LB_FILE_LOC,"Div: not dividable");
+ }
+
+ /** @brief
+ * return x = -x;
+ */
+ inline Element& negin (Element& x) const
+ {
+
+ NTL::negate (x, x);
+
+ return x;
+ }
+
+ /** @brief
+ * return r += a x
+ */
+ template <class Int>
+ inline Element& axpyin (Element& r, const Element& a, const Int& x) const
+ {
+
+ return r += a * x;
+ }
+
+
+ // IO
+
+ /** @brief
+ * out << y;
+ */
+ std::ostream& write(std::ostream& out,const Element& y) const
+ {
+
+ out << y;
+
+ return out;
+ }
+
+
+ /** @brief
+ * read x from istream in
+ */
+ std::istream& read(std::istream& in, Element& x) const
+ {
+
+ return in >> x;
+ }
+
+
+ /** some PIR function
+ */
+
+ /** @brief
+ * Test if x is a unit.
+ */
+ inline bool isUnit (const Element& x) const
+ {
+
+ return (NTL::IsOne (x) || NTL::IsOne (-x));
+ }
+
+ /** @brief
+ * return g = gcd (a, b)
+ */
+ inline Element& gcd (Element& g, const Element& a, const Element& b) const
+ {
+
+ NTL::GCD (g, a, b);
+
+ return g;
+ }
+
+ /** @brief
+ * return g = gcd (g, b)
+ */
+ inline Element& gcdin (Element& g, const Element& b) const
+ {
+
+ NTL::GCD (g, g, b);
+
+ return g;
+ }
+
+ /** @brief
+ * g = gcd(a, b) = a*s + b*t.
+ * The coefficients s and t are defined according to the standard
+ * Euclidean algorithm applied to |a| and |b|, with the signs then
+ * adjusted according to the signs of a and b.
+ */
+ inline Element& xgcd (Element& g, Element& s, Element& t, const Element& a, const Element& b)const
+ {
+
+ NTL::XGCD (g,s,t,a,b);
+
+ return g;
+ }
+
+ /** @brief
+ * c = lcm (a, b)
+ */
+ inline Element& lcm (Element& c, const Element& a, const Element& b) const
+ {
+
+
+ if (NTL::IsZero (a) || NTL::IsZero (b)) return c = NTL::ZZ::zero();
+
+ else {
+ Element g;
+
+ NTL::GCD (g, a, b);
+
+ NTL::mul (c, a, b);
+
+ c /= g;
+
+ NTL::abs (c, c);
+
+ return c;
+ }
+ }
+
+ /** @brief
+ * l = lcm (l, b)
+ */
+ inline Element& lcmin (Element& l, const Element& b) const
+ {
+
+ if (NTL::IsZero (l) || NTL::IsZero (b))
+
+ return l = NTL::ZZ::zero();
+
+ else {
+
+ Element g;
+
+ NTL::GCD (g, l, b);
+
+ l *= b;
+
+ l /= g;
+
+ NTL::abs (l, l);
+
+ return l;
+ }
+ }
+
+
+
+
+
+ // some specail function
+
+ /** @brief
+ * x = floor ( sqrt(y)).
+ */
+
+ inline Element& sqrt (Element& x, const Element& y) const
+ {
+
+ NTL::SqrRoot(x,y);
+
+ return x;
+ }
+
+ /** @brief
+ * Requires 0 <= x < m, m > 2 * a_bound * b_bound,
+ * a_bound >= 0, b_bound > 0
+ * This routine either returns 0, leaving a and b unchanged,
+ * or returns 1 and sets a and b so that
+ * (1) a = b x (mod m),
+ * (2) |a| <= a_bound, 0 < b <= b_bound, and
+ * (3) gcd(m, b) = gcd(a, b).
+ */
+
+ inline long reconstructRational (Element& a, Element& b, const Element& x, const Element& m,
+ const Element& a_bound, const Element& b_bound) const
+ {
+
+ return NTL::ReconstructRational(a,b,x,m,a_bound,b_bound);
+ }
+
+
+ /** @brief
+ * q = floor (x/y);
+ */
+ inline Element& quo (Element& q, const Element& a, const Element& b) const
+ {
+
+ NTL::div (q, a, b);
+
+ return q;
+ }
+
+ /** @brief
+ * r = remindar of a / b
+ */
+ inline Element& rem (Element& r, const Element& a, const Element& b) const
+ {
+
+ NTL::rem (r, a, b);
+
+ return r;
+ }
+
+ /** @brief
+ * a = quotient (a, b)
+ */
+ inline Element& quoin (Element& a, const Element& b) const
+ {
+
+ return a /= b;
+
+ }
+
+ /** @brief
+ * a = quotient (a, b)
+ */
+ inline Element& remin (Element& x, const Element& y) const
+ {
+ return x %= y;
+ }
+
+
+ /** @brief
+ * q = [a/b], r = a - b*q
+ * |r| < |b|, and if r != 0, sign(r) = sign(b)
+ */
+ inline void quoRem (Element& q, Element& r, const Element& a, const Element& b) const
+ {
+
+ NTL::DivRem(q,r,a,b);
+ }
+
+ /** @brief
+ * Test if b | a.
+ */
+ inline bool isDivisor (const Element& a, const Element& b) const
+ {
+
+ if ( NTL::IsZero (a) ) return true;
+
+ else if (NTL::IsZero (b)) return false;
+
+ else {
+ Element r;
+
+ NTL::rem (r, a, b); //weird order changed, dpritcha 2004-07-19
+
+ return NTL::IsZero (r);
+ }
+ }
+
+ /** compare two elements, a and b
+ * return 1, if a > b
+ * return 0, if a = b;
+ * return -1. if a < b
+ */
+ inline long compare (const Element& a, const Element& b) const
+ {
+
+ return NTL::compare (a, b);
+ }
+
+ /** return the absolute value
+ * x = abs (a);
+ */
+ inline Element& abs (Element& x, const Element& a) const
+ {
+
+ NTL::abs (x, a);
+
+ return x;
+ }
+
+
+ static inline int maxCardinality()
+ {
+ return 0;
+ } // no modulus
+
+ };
+
+
+ template<>
+ class FieldAXPY<NTL_ZZ> {
+ public:
+ typedef NTL_ZZ Field;
+ typedef Field::Element Element;
+
+ /** Constructor.
+ * A faxpy object if constructed from a Field and a field element.
+ * Copies of this objects are stored in the faxpy object.
+ * @param F field F in which arithmetic is done
+ */
+ FieldAXPY (const Field &F) :
+ _field (F)
+ {
+ _y = 0;
+ }
+
+ /** Copy constructor.
+ * @param faxpy
+ */
+ FieldAXPY (const FieldAXPY<Field> &faxpy) :
+ _field (faxpy._field), _y (faxpy._y)
+ {}
+
+ /** Assignment operator
+ * @param faxpy
+ */
+ FieldAXPY<Field> &operator = (const FieldAXPY &faxpy)
+ {
+ _y = faxpy._y;
+ return *this;
+ }
+
+ /** Add a*x to y
+ * y += a*x.
+ * @param a constant reference to element a
+ * @param x constant reference to element x
+ * allow optimal multiplication, such as integer * int
+ */
+ template<class Element1>
+ inline Element& mulacc (const Element &a, const Element1 &x)
+ {
+ return _y += a * x;
+ }
+
+ inline Element& accumulate (const Element &t)
+ {
+ return _y += t;
+ }
+
+ /** Add a*x to y
+ * y += a*x.
+ * @param a constant reference to element a
+ * @param x constant reference to element x
+ * allow optimal multiplication, such as integer * int
+ */
+ template<class Element1>
+ inline Element& mulacc (const Element1 &a, const Element &x)
+ {
+ return _y += a * x;
+ }
+
+ inline Element& mulacc (const Element& a, const Element& b)
+ {
+
+ return _y += a * b;
+ }
+
+
+ /** Retrieve y
+ *
+ * Performs the delayed modding out if necessary
+ */
+ inline Element &get (Element &y) { y = _y; return y; }
+
+ /** Assign method.
+ * Stores new field element for arithmetic.
+ * @return reference to self
+ * @param y constant reference to element a
+ */
+ inline FieldAXPY &assign (const Element& y)
+ {
+ _y = y;
+ return *this;
+ }
+
+ inline void reset()
+ {
+ _y = 0;
+ }
+
+ private:
+
+ /// Field in which arithmetic is done
+ /// Not sure why it must be mutable, but the compiler complains otherwise
+ Field _field;
+
+ /// Field element for arithmetic
+ Element _y;
+
+ };
+}
+
+#endif //__LINBOX_ntl_zz_H
+
+
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+
diff --git a/linbox/ring/ntl/ntl-zz_p.h b/linbox/ring/ntl/ntl-zz_p.h
new file mode 100644
index 0000000..dda2dc6
--- /dev/null
+++ b/linbox/ring/ntl/ntl-zz_p.h
@@ -0,0 +1,525 @@
+/* linbox/field/ntl.h
+ * Copyright (C) 1999-2005 William J Turner,
+ * 2001 Bradford Hovinen
+ * Copyright (C) 2011 LinBox
+ *
+ * Written by W. J. Turner <wjturner at acm.org>,
+ * Bradford Hovinen <hovinen at cis.udel.edu>
+ *
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ * ========LICENCE========
+ *.
+ */
+
+/*! @file field/ntl/ntl-ZZ_p.h
+ * @ingroup field
+ * @ingroup NTL
+ * @brief NO DOC
+ */
+
+#ifndef __LINBOX_field_ntl_zz_p_H
+#define __LINBOX_field_ntl_zz_p_H
+
+#ifndef __LINBOX_HAVE_NTL
+#error "you need NTL here"
+#endif
+
+#include <sys/time.h>
+#include <NTL/ZZ_p.h>
+#include <NTL/ZZ.h>
+
+#include "linbox/linbox-config.h"
+#include "linbox/util/debug.h"
+
+#include <givaro/zring.h>
+#include "linbox/field/field-traits.h"
+
+#include "linbox/vector/blas-vector.h"
+
+
+#include "linbox/integer.h"
+
+namespace Givaro
+{
+
+
+ /** Conversion of field element to an Integer.
+ * This function assumes the output field element x has already been
+ * constructed, but that it is not already initialized.
+ * This done by converting to a std::string : inefficient but correct.
+ * @return reference to Integer.
+ * @param x reference to Integer to contain output (reference returned).
+ * @param y constant reference to field element.
+ */
+ template <>
+ Integer& Caster(Integer& x, const NTL::ZZ_p& y)
+ {
+ NTL::ZZ iy = y._ZZ_p__rep;
+
+ long nb = NTL::NumBytes(iy);
+ unsigned char *txt;
+ typedef unsigned char u_char;
+ txt = new u_char[nb + 68];
+ // if (!txt) Error("out of memory");
+ BytesFromZZ(txt, iy, nb);
+
+ x = 0;
+ for (ptrdiff_t i = 0; i < nb; i++) {
+ x += Integer( txt[i] )<<(8*i) ;
+ }
+ delete [] txt;
+ return x;
+ }
+
+ //dpritcha
+ template<>
+ double& Caster(double& x, const NTL::ZZ_p& y)
+ {
+ x = NTL::to_double(NTL::rep(y));
+ return x;
+ }
+
+ /**\brief Initialization of field element from an Integer.
+ * Behaves like C++ allocator construct.
+ * This function assumes the output field element x has already been
+ * constructed, but that it is not already initialized.
+ * This done by converting to a std::string : inefficient but correct.
+ * @return reference to field element.
+ * @param x field element to contain output (reference returned).
+ * @param y Integer.
+ \ingroup field
+ */
+ template <>
+ NTL::ZZ_p& Caster(NTL::ZZ_p& x, const Integer& y)
+ {
+ return x = NTL::to_ZZ_p( NTL::to_ZZ( (static_cast<const std::string>(y)).c_str() ) );
+ }
+ template <>
+ NTL::ZZ_p& Caster(NTL::ZZ_p& x, const double& y)
+ {
+ return x = NTL::to_ZZ_p( NTL::to_ZZ((long)(y) ) );
+ }
+ template <>
+ NTL::ZZ_p& Caster(NTL::ZZ_p& x, const int& y)
+ {
+ return x = NTL::to_ZZ_p( NTL::to_ZZ((long)(y) ) );
+ }
+ template <>
+ NTL::ZZ_p& Caster(NTL::ZZ_p& x, const unsigned long& y)
+ {
+ return x = NTL::to_ZZ_p( NTL::to_ZZ((long)(y) ) );
+ }
+ template <>
+ NTL::ZZ_p& Caster(NTL::ZZ_p& x, const unsigned int& y)
+ {
+ return x = NTL::to_ZZ_p( NTL::to_ZZ((long)(y) ) );
+ }
+} // namespace Givaro
+
+
+// Namespace in which all LinBox library code resides
+namespace LinBox
+{
+
+
+ class NTL_ZZ_p_Initialiser {
+ public :
+ NTL_ZZ_p_Initialiser( const Integer & q, size_t e = 1) {
+ linbox_check(e == 1);
+ if ( q > 0 )
+ NTL::ZZ_p::init(NTL::to_ZZ((std::string(q)).data())); // it's an error if q not prime, e not 1
+ }
+
+ template <class ElementInt>
+ NTL_ZZ_p_Initialiser(const ElementInt& d) {
+ NTL::ZZ_p::init (NTL::to_ZZ(d));
+ }
+
+ NTL_ZZ_p_Initialiser (const NTL::ZZ& d) {
+ NTL::ZZ_p::init(d);
+ }
+
+ NTL_ZZ_p_Initialiser () { }
+
+ };
+
+ // CP: to be changed in to a Givaro::GeneralRingRandIter ?
+ template <class Element>
+ class UnparametricRandIter;
+ /**
+ *
+ * @brief Wrapper of zz_p from NTL.
+ * Uses nice mod p via floating pt trick.
+ *
+ */
+ struct NTL_ZZ_p: public NTL_ZZ_p_Initialiser, public Givaro::UnparametricOperations<NTL::ZZ_p> {
+ typedef NTL::ZZ_p Element ;
+ typedef Givaro::UnparametricOperations<Element> Father_t ;
+
+ typedef UnparametricRandIter<Element> RandIter;
+
+ const Element zero,one,mOne ;
+
+ /** @name NTL_ZZ_p
+ * @brief Arbitrary precision integers modulus a positive integer.
+
+ * While NTL allows any integer to serve as the modulus, only prime
+ * moduli yield fields. Therefore, while arthmetic operations may be
+ * valid for any modulus, only prime moduli are supported in this
+ * implementation. The primality of the modulus will not be checked, so
+ * it is the programmer's responsibility to supply a prime modulus.
+ * These specializations allow the \ref Givaro::ZRing template class to be
+ * used to wrap NTL's <code>ZZ_p</code> class as a LinBox field.
+ */
+ //@{
+ //! @param q,e
+ NTL_ZZ_p(integer q, size_t e = 1) :
+ NTL_ZZ_p_Initialiser(q,e),Father_t ()
+ ,zero( NTL::to_ZZ_p(0)),one( NTL::to_ZZ_p(1)),mOne(-one)
+ {
+ // no default - allow initialization of ZZ_p directly by user.
+ }
+
+ //! @param d,e
+ NTL_ZZ_p( NTL::ZZ d, size_t e = 1) :
+ NTL_ZZ_p_Initialiser(d),Father_t()
+ ,zero( NTL::to_ZZ_p(0)),one( NTL::to_ZZ_p(1)),mOne(-one)
+ {
+ linbox_check(e == 1);
+ }
+
+ //! NULL constructor
+ NTL_ZZ_p() :
+ NTL_ZZ_p_Initialiser(), Father_t()
+ ,zero( NTL::to_ZZ_p(0)),one( NTL::to_ZZ_p(1)),mOne(-one)
+ {}
+ //@}
+
+ Element& init(Element& x, const integer& y) const
+ {
+ return Caster(x,y);
+ }
+
+ Element& init(Element& x, const double& y) const
+ {
+ double z = fmod(y,NTL::to_double(Element::modulus()));
+ if (z > 0) z += 0.5;
+ else z -= 0.5;
+ return x = NTL::to_ZZ_p(static_cast<long>(z)); //rounds towards 0
+ }
+
+ /** Specialization for NTL::ZZ
+ *
+ * @return reference to field element.
+ * @param x field element to contain output (reference returned)
+ * @param y NTL::ZZ.
+ */
+ Element& init(Element& x, const NTL::ZZ& y) const
+ {
+ return x = NTL::to_ZZ_p( y );
+ }
+
+ Element& init(Element& x) const
+ {
+ return x = NTL::to_ZZ_p( 0L );
+ }
+
+ Element& init(Element& x, const Element& y) const
+ {
+ return x = y ;
+ }
+
+ template <class ANY> //dpritcha--FIX
+ Element& init(Element& x, const ANY& y) const
+ {
+ return x = NTL::to_ZZ_p((long)(y));
+ }
+
+ /** Specialization for NTL::ZZ.
+ *
+ * @return reference to NTL::ZZ
+ * @param x NTL::ZZ to contain output (reference returned).
+ * @param y constant reference to field element.
+ */
+ NTL::ZZ& convert(NTL::ZZ& x, const Element& y) const
+ {
+ return x = y._ZZ_p__rep;
+ }
+
+ /** Conversion of field element to an integer.
+ * This function assumes the output field element x has already been
+ * constructed, but that it is not already initialized.
+ * This done by converting to a std::string : inefficient but correct.
+ * @return reference to integer.
+ * @param x reference to integer to contain output (reference returned).
+ * @param y constant reference to field element.
+ */
+ integer& convert(integer& x, const Element& y) const
+ {
+ NTL::ZZ iy = y._ZZ_p__rep;
+
+ long nb = NTL::NumBytes(iy);
+ unsigned char *txt;
+ typedef unsigned char u_char;
+ txt = new u_char[nb + 68];
+ // if (!txt) Error("out of memory");
+ BytesFromZZ(txt, iy, nb);
+
+ x = 0;
+ for (ptrdiff_t i = 0; i < nb; i++) {
+ x += LinBox::integer( txt[i] )<<(8*i) ;
+ }
+ delete [] txt;
+ return x;
+ };
+
+ double& convert(double& x, const Element& y) const
+ {
+ x = NTL::to_double(NTL::rep(y));
+ return x;
+ }
+
+ template <class ANY>
+ ANY& convert(ANY& x, const Element& y) const
+ {
+ return x = (ANY)(rep(y));
+ }
+
+ static inline integer maxCardinality()
+ {
+ return integer( -1 );
+ }
+
+ Element& pow( Element& res, const Element& x, long exp ) const
+ {
+ NTL::power( res, x, exp );
+ return res;
+ }
+
+ Element& powin( Element& x, long exp ) const
+ {
+ return x = NTL::power(x,exp);
+ }
+
+ /** Cardinality.
+ * Return integer representing cardinality of the field.
+ * Returns the modulus of the field, which should be prime.
+ * @return integer representing cardinality of the field
+ */
+ integer& cardinality(integer& c) const
+ {
+ return characteristic(c);
+ }
+
+ integer cardinality() const
+ {
+ return characteristic();
+ }
+
+ /** Characteristic.
+ * Return integer representing characteristic of the field.
+ * Returns the modulus of the field, which should be prime.
+ * @return integer representing characteristic of the field.
+ */
+ integer& characteristic(integer& c) const
+ //FIXME we shouldn't go thru long here as p may be larger than that.
+ // check if NTL has cast ZZp to gmp integers.
+ {
+ std::stringstream s;
+ s << Element::modulus();
+ s >> c;
+ return c;
+ //return c = static_cast<integer>(to_long(Element::modulus()));
+ }
+
+ size_t& characteristic(size_t & c) const
+ {
+ return c = (int64_t)to_long(Element::modulus());
+ }
+
+ integer characteristic() const
+ {
+ integer c;
+ return characteristic(c);
+ }
+
+ /** Multiplicative Inverse.
+ * x = 1 / y
+ * This function assumes both field elements have already been
+ * constructed and initialized.
+ * @return reference to x.
+ * @param x field element (reference returned).
+ * @param y field element.
+ */
+ Element&
+ inv(Element& x, const Element& y) const
+ {
+ return x = NTL::inv(y);
+ }
+
+ /** Zero equality.
+ * Test if field element is equal to zero.
+ * This function assumes the field element has already been
+ * constructed and initialized.
+ * In this specialization, NTL's IsZero function is called.
+ * @return boolean true if equals zero, false if not.
+ * @param x field element.
+ */
+ bool isZero(const Element& x) const
+ {
+ return static_cast<bool>(IsZero(x));
+ }
+
+ /** One equality.
+ * Test if field element is equal to one.
+ * This function assumes the field element has already been
+ * constructed and initialized.
+ * In this specialization, NTL's IsOne function is called.
+ * @return boolean true if equals one, false if not.
+ * @param x field element.
+ */
+ bool isOne(const Element& x) const
+ {
+ return static_cast<bool>(IsOne(x));
+ }
+
+ /** MOne equality.
+ * Test if field element is equal to one.
+ * This function assumes the field element has already been
+ * constructed and initialized.
+ * In this specialization, NTL's IsMOne function is called.
+ * @return boolean true if equals one, false if not.
+ * @param x field element.
+ */
+ bool isMOne(const Element& x) const
+ {
+ Element y ; neg(y,x);
+ return isOne(y);
+ }
+
+ /** Inplace Multiplicative Inverse.
+ * x = 1 / x
+ * This function assumes both field elements have already been
+ * constructed and initialized.
+ * @return reference to x.
+ * @param x field element (reference returned).
+ */
+ Element& invin(Element& x) const
+ {
+ return x = NTL::inv(x);
+ }
+
+ /** Print field.
+ * @return output stream to which field is written.
+ * @param os output stream to which field is written.
+ */
+ std::ostream& write(std::ostream& os) const
+ {
+ return os << "unparameterized field Element with p = "
+ << Element::modulus();
+ }
+
+ /** Print field.
+ * @return output stream to which field is written.
+ * @param os output stream to which field is written.
+ * @param x
+ */
+ std::ostream &write (std::ostream &os, const Element &x) const
+ {
+ return Givaro::UnparametricOperations<Element>::write(os,x);
+ }
+ };
+
+ template <class Ring>
+ struct ClassifyRing;
+
+ template <>
+ struct ClassifyRing<NTL_ZZ_p > {
+ typedef RingCategories::ModularTag categoryTag;
+ };
+
+ /// Constructor for random field element generator
+ template <>
+ class UnparametricRandIter<NTL::ZZ_p> {
+ protected:
+ integer _size,_seed;
+ const NTL_ZZ_p & _ring;
+ public:
+
+ UnparametricRandIter<NTL::ZZ_p> (const NTL_ZZ_p & F,
+ const integer& size = 0,
+ const integer& seed = 0) :
+ _size(size), _seed(seed), _ring(F)
+ {
+ if (_seed == integer(0)) _seed = int64_t(time(NULL));
+
+ integer cardinality;
+ F.cardinality(cardinality);
+ if (_size > cardinality)
+ _size = 0;
+
+#ifdef TRACE
+ std::cout << "created random generator with size " << _size
+ << " and seed " << _seed << std::endl;
+#endif // TRACE
+
+ // Seed random number generator
+ NTL::SetSeed(NTL::to_ZZ(static_cast<int32_t>(_seed)));
+ }
+
+ const NTL_ZZ_p& ring() const { return _ring; }
+
+
+ // UnparametricRandIter<NTL::ZZ_p>(const NTL_ZZ_p& R) :
+ // _size(R._size), _seed(R._seed)
+ // {
+ // if(_seed == 0)
+ // NTL::SetSeed(NTL::to_ZZ(time(0)));
+ // else
+ // NTL::SetSeed(NTL::to_ZZ( static_cast<long>(_seed)) );
+ // }
+
+
+ /// Random field element creator.
+ NTL::ZZ_p& random(NTL::ZZ_p& x) const
+ {
+ if (_size == 0) {
+ return x = NTL::random_ZZ_p();
+ }
+ else {
+ return x = NTL::to_ZZ_p(NTL::RandomBnd(static_cast<int32_t>(_size)));
+ }
+ }
+
+
+ };
+
+
+} // namespace LinBox
+
+#endif // __LINBOX_field_ntl_zz_p_H
+
+
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/ring/ntl/ntl-zz_pe.h b/linbox/ring/ntl/ntl-zz_pe.h
new file mode 100644
index 0000000..f61d9a7
--- /dev/null
+++ b/linbox/ring/ntl/ntl-zz_pe.h
@@ -0,0 +1,434 @@
+/* Copyright (C) LinBox
+ *
+ *
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ * ========LICENCE========
+ */
+
+/*! @file field/ntl/ntl-ZZ_pE.h
+ * @ingroup field
+ * @ingroup NTL
+ * @brief NO DOC
+ */
+
+#ifndef __LINBOX_field_ntl_zz_pe_H
+#define __LINBOX_field_ntl_zz_pe_H
+
+#ifndef __LINBOX_HAVE_NTL
+#error "you need NTL here"
+#endif
+
+#include <time.h>
+#include "linbox/linbox-config.h"
+#include "linbox/util/debug.h"
+#include <NTL/ZZ_pXFactoring.h>
+#include <NTL/ZZ_pE.h>
+#include <NTL/ZZ.h>
+
+#include <givaro/zring.h>
+#include "linbox/field/field-traits.h"
+
+
+#include "linbox/integer.h"
+
+namespace Givaro
+{
+
+ template<>
+ NTL::ZZ_pE& Caster(NTL::ZZ_pE &x, const Integer &y)
+ {
+ std::stringstream s;
+ s << y;
+ s >> x;
+ //x=NTL::to_ZZ_pE(static_cast<long>(y));
+ return x;
+ }
+ template<>
+ NTL::ZZ_pE& Caster(NTL::ZZ_pE &x, const double &y)
+ {
+ std::stringstream s;
+ s << y;
+ s >> x;
+ //x=NTL::to_ZZ_pE(static_cast<long>(y));
+ return x;
+ }
+
+ // Rich Seagraves, 7-15-03
+ // On the orders of Dr Saunders, I'm re-writing init & convert so that
+ // they convert a ZZpE into a padic number, ie a0 + a1x + a2x^2 +... ->
+ // a0 + a1*p + a2*p^2 + ...
+ //
+
+ Integer& Caster(Integer& c, const NTL::ZZ_pE& e)
+ {
+ NTL::ZZ_pX poly = rep(e);
+ Integer base, coef;
+ std::stringstream s;
+ s << NTL::ZZ_p::modulus();
+ s >> base;
+ //Integer base = static_cast<Integer>(to_long(NTL::ZZ_p::modulus()));
+ long i;
+
+ c = 0;
+ for(i = deg(poly); i >= 0; --i) {
+ c *= base;
+ s.clear();
+ s << rep(coeff(poly, i));
+ s >> coef;
+ c += coef; //NTL::to_long(rep(coeff(poly, i)));
+ }
+
+ return c;
+ }
+} // namespace Givaro
+
+// Namespace in which all LinBox library code resides
+namespace LinBox
+{
+
+ class NTL_ZZ_pE_Initialiser {
+ public :
+ NTL_ZZ_pE_Initialiser( const Integer & p, size_t k ) {
+ // linbox_check(e == 1);
+ // if ( q > 0 )
+ // NTL::ZZ_p::init(NTL::to_ZZ((std::string(q)).data())); // it's an error if q not prime, e not 1
+ NTL::ZZ_p::init(NTL::to_ZZ(std::string(p).data()));
+ NTL::ZZ_pX irredPoly = NTL::BuildIrred_ZZ_pX ((long) k);
+ NTL::ZZ_pE::init(irredPoly);
+
+ }
+
+ // template <class ElementInt>
+ // NTL_ZZ_pE_Initialiser(const ElementInt& d) {
+ // NTL::ZZ_p::init (NTL::to_ZZ(d));
+ // }
+
+ // NTL_ZZ_pE_Initialiser (const NTL::ZZ& d) {
+ // NTL::ZZ_p::init(d);
+ // }
+
+ };
+
+
+
+ /**
+ * @brief Wrapper of ZZ_pE from NTL
+ * Define a parameterized class to handle easily Givaro::ZRing<NTL::ZZ_pE> field
+ */
+ class NTL_ZZ_pE : public NTL_ZZ_pE_Initialiser, public Givaro::UnparametricOperations<NTL::ZZ_pE> {
+ public:
+ typedef NTL::ZZ_pE Element ;
+ typedef Givaro::UnparametricOperations<Element> Father_t ;
+
+ const Element zero,one,mOne ;
+
+
+ NTL_ZZ_pE (const integer &p, const integer &k) :
+ NTL_ZZ_pE_Initialiser(p,k),Father_t ()
+ ,zero( NTL::to_ZZ_pE(0)),one( NTL::to_ZZ_pE(1)),mOne(-one)
+
+
+ {
+
+ }
+
+
+ bool isZero (const Element& a) const
+ {
+ return NTL::IsZero(a);
+ }
+
+
+ bool isOne (const Element& a) const
+ {
+ return NTL::IsOne(a);
+ }
+
+ bool isMOne (const Element& x) const
+ {
+ Element y ; neg(y,x);
+ return isOne(y);
+ }
+
+
+ integer& characteristic (integer &c) const
+ {
+ std::stringstream s;
+ s << NTL::ZZ_p::modulus();
+ s >> c;
+ return c;
+ //return c=static_cast<integer>(to_long(NTL::ZZ_p::modulus()));
+ }
+
+
+ integer& cardinality(integer& c) const
+ {
+ std::stringstream s;
+ s << NTL::ZZ_p::modulus();
+ s >> c;
+ c=pow(c,int64_t(Element::degree()));
+ return c;
+ }
+
+ Element& inv(Element& x, const Element& y) const
+ {
+ x=NTL::to_ZZ_pE(1)/y;
+ return x;
+ }
+
+ Element& invin(Element& x) const
+ {
+ x=NTL::to_ZZ_pE(1)/x;
+ return x;
+ }
+
+
+ std::istream& read(std::istream& is, Element& x) const
+ {
+ long tmp = 0;
+ is>>tmp;
+ x=NTL::to_ZZ_pE(tmp);
+ return is;
+ }
+
+
+
+#ifdef __LINBOX_XMLENABLED
+
+
+ bool toTag(LinBox::Writer &W) const
+ {
+ std::string s;
+ NTL::ZZ_pX poly = Element::modulus();
+ long i;
+
+ W.setTagName("field");
+ W.setAttribute("implDetail", "ntl-ZZpE");
+ W.setAttribute("cardinality", LinBox::Writer::numToString(s, _card));
+
+ W.addTagChild();
+ W.setTagName("finite");
+
+ W.addTagChild();
+ W.setTagName("characteristic");
+ W.addNum(_p);
+ W.upToParent();
+
+ W.addTagChild();
+ W.setTagName("extension");
+ W.addNum(deg(poly) + 1);
+ W.upToParent();
+
+ W.addTagChild();
+ W.setTagName("polynomial");
+
+ for(i = 0; i <= deg(poly); ++i) {
+ W.addNum(coeff(poly, i));
+ }
+ W.upToParent();
+ W.upToParent();
+ W.upToParent();
+
+ return true;
+ }
+
+
+ std::ostream &write(std::ostream &os) const
+ {
+ LinBox::Writer W;
+ if( toTag(W) )
+ W.write(os);
+
+ return os;
+ }
+
+
+ // Elemnt Reading & writing functions
+ // BIG NOTE: It was decided that for extension fields, the elements
+ // would be represented using a single number that has the following
+ // property: for an element e in ZZp[x], with e = a0 + a1x + a2x^2 + ...,
+ // represent e as "<cn>n</cn>" where n = a0 + a1 * p + a2 * p^2 + ...
+ //
+
+
+ bool toTag(LinBox::Writer &W, const Element &e) const
+ {
+ NTL::ZZ_pX poly = rep(e);
+ NTL::ZZ accum, base = NTL::ZZ_p::modulus();
+ long i;
+ std::string s;
+
+ accum = 0;
+ for(i = deg(poly); i >= 0; --i) {
+ accum *= base;
+ accum += rep(coeff(poly, i));
+ }
+
+
+ W.setTagName("cn");
+ W.addDataChild(LinBox::Writer::numToString(s, accum));
+
+ return true;
+ }
+
+
+ std::ostream &write(std::ostream &os, const Element &e) const
+ {
+
+ LinBox::Writer W;
+ if( toTag(W, e))
+ W.write(os);
+
+ return os;
+ }
+
+
+
+
+ bool fromTag(LinBox::Reader &R, Element &e) const
+ {
+ NTL::ZZ total, base = NTL::ZZ_p::modulus(), rem;
+ std::stringstream ss;
+
+ if(!R.expectTagName("cn") || !R.expectChildTextNum(total))
+ return false;
+
+ ss << "[";
+ while(total > 0) {
+ rem = total % base;
+ total /= base;
+ ss << rem;
+ if(total > 0) ss << " ";
+ }
+
+ ss << "]";
+
+ ss >> e; // use the extraction stream operator
+
+ return true;
+ }
+
+
+ std::istream &read(std::istream &is, Element &e) const
+ {
+ LinBox::Reader R(is);
+ if( !fromTag(R, e)) {
+ is.setstate(std::istream::failbit);
+ if(!R.initalized()) {
+ is.setstate(std::istream::badbit);
+ }
+ }
+
+ return is;
+ }
+
+
+#endif
+
+
+ }; // end of class NTL_ZZ_pE
+
+
+
+
+
+
+ template <class Ring>
+ struct ClassifyRing;
+
+ template<>
+ struct ClassifyRing<UnparametricRandIter<NTL::ZZ_pE> > {
+ typedef RingCategories::ModularTag categoryTag;
+ };
+
+
+
+}
+
+namespace LinBox
+{
+
+
+ template<>
+ class UnparametricRandIter<NTL::ZZ_pE> {
+ public:
+ typedef NTL::ZZ_pE Element;
+ UnparametricRandIter<NTL::ZZ_pE>(const NTL_ZZ_pE & F ,
+ const integer& size =0,
+ const integer& seed =0
+ ) :
+ _size(size), _seed(seed), _ring(F)
+ {
+ if(_seed == 0)
+ NTL::SetSeed(NTL::to_ZZ(time(0)));
+ else {
+ NTL::ZZ x;
+ std::stringstream s;
+ s << seed;
+ s >> x;
+ NTL::SetSeed( x ); //NTL::to_ZZ(static_cast<long>(seed)) );
+ }
+ }
+
+ const NTL_ZZ_pE& ring() const { return _ring; }
+#ifdef __LINBOX_XMLENABLED
+ UnparametricRandIter<NTL::ZZ_pE>(LinBox::Reader &R)
+ {
+ if(!R.expectTagName("randiter")) return;
+ if(!R.expectAttributeNum("seed", _seed) || !R.expectAttributeNum("size", _size)) return;
+
+ if(_seed == 0) _seed = time(NULL);
+
+ NTL::SetSeed(NTL::to_ZZ(_seed));
+ }
+#endif
+
+
+ UnparametricRandIter<NTL::ZZ_pE>(const UnparametricRandIter<NTL::ZZ_pE>& R) :
+ _size(R._size), _seed(R._seed), _ring(R._ring)
+
+ {
+ if(_seed == 0)
+ NTL::SetSeed(NTL::to_ZZ(time(0)));
+ else
+ NTL::SetSeed(NTL::to_ZZ( static_cast<long>(_seed)) );
+ }
+
+ NTL::ZZ_pE& random (NTL::ZZ_pE& x) const
+ {
+ NTL::random(x);
+ return x;
+ }
+
+ protected:
+ size_t _size;
+ size_t _seed;
+ const NTL_ZZ_pE& _ring;
+ };
+}
+#endif //__LINBOX_field_ntl_zz_pe_H
+
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+
diff --git a/linbox/ring/ntl/ntl-zz_px.h b/linbox/ring/ntl/ntl-zz_px.h
new file mode 100644
index 0000000..58c7320
--- /dev/null
+++ b/linbox/ring/ntl/ntl-zz_px.h
@@ -0,0 +1,354 @@
+/* Copyright (C) 2005 LinBox
+ * written by Daniel Roche, August 2005
+ * Copyright (C) 2011 LinBox
+ *
+ *
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ * ========LICENCE========
+ */
+
+/*! @file ring/ntl/ntl-ZZ_p.h
+ * @ingroup ring
+ * @ingroup NTL
+ * @brief NO DOC
+ */
+
+#ifndef __LINBOX_field_ntl_zz_px_H
+#define __LINBOX_field_ntl_zz_px_H
+
+#ifndef __LINBOX_HAVE_NTL
+#error "you need NTL here"
+#endif
+
+#include <vector>
+#include <NTL/ZZ_pX.h>
+
+#include "linbox/linbox-config.h"
+#include "linbox/util/debug.h"
+
+#include <givaro/zring.h>
+#include "linbox/ring/ntl/ntl-zz_p.h"
+#include "linbox/integer.h"
+
+
+// namespace in which all LinBox code resides
+namespace LinBox
+{
+ class NTL_ZZ_pX_Initialiser {
+ public :
+ NTL_ZZ_pX_Initialiser( const Integer & q, size_t e = 1) {
+ // linbox_check(e == 1);
+ if ( q > 0 )
+ NTL::ZZ_p::init(NTL::to_ZZ((std::string(q)).data())); // it's an error if q not prime, e not 1
+ }
+
+ // template <class ElementInt>
+ // NTL_ZZ_p_Initialiser(const ElementInt& d) {
+ // NTL::ZZ_p::init (NTL::to_ZZ(d));
+ // }
+
+ // NTL_ZZ_p_Initialiser (const NTL::ZZ& d) {
+ // NTL::ZZ_p::init(d);
+ // }
+
+ };
+
+ /** Ring (in fact, a unique factorization domain) of polynomial with
+ * coefficients in class NTL_ZZ_p (integers mod a wordsize prime).
+ * All the same functions as any other ring, with the addition of:
+ * Coeff (type), CoeffField (type), getCoeffField, setCoeff, getCoeff,
+ * leadCoeff, deg
+ */
+ class NTL_ZZ_pX : public NTL_ZZ_pX_Initialiser, public Givaro::UnparametricOperations<NTL::ZZ_pX> {
+ public:
+ typedef NTL::ZZ_pX Element ;
+ typedef Givaro::UnparametricOperations<Element> Father_t ;
+ typedef UnparametricRandIter<Element> RandIter;
+
+ const Element zero,one,mOne ;
+
+
+ typedef NTL_ZZ_p CoeffField;
+ typedef NTL::ZZ_p Coeff;
+ // typedef NTL::ZZ_pX Element;
+
+ /** Standard LinBox field constructor. The paramters here
+ * (prime, exponent) are only used to initialize the coefficient field.
+ */
+ NTL_ZZ_pX( const integer& p, size_t e = 1 ) :
+ NTL_ZZ_pX_Initialiser(p,e),Father_t ()
+ , zero( NTL::to_ZZ_pX(0)),one( NTL::to_ZZ_pX(1)),mOne(-one)
+ , _CField(p,e)
+ {}
+
+ /** Constructor from a coefficient field */
+ NTL_ZZ_pX( CoeffField cf ) :
+ NTL_ZZ_pX_Initialiser(cf.cardinality()),Father_t ()
+ ,zero( NTL::to_ZZ_pX(0)),one( NTL::to_ZZ_pX(1)),mOne(-one)
+ ,_CField(cf)
+ {}
+
+ /** Initialize p to the constant y (p = y*x^0) */
+ template <class ANY>
+ Element& init( Element& p, const ANY& y ) const
+ {
+ Coeff temp;
+ _CField.init( temp, y );
+ return p = temp;
+ }
+
+ /** Initialize p to the constant y (p = y*x^0) */
+ Element& init( Element& p, const Coeff& y ) const
+ {
+ return p = y;
+ }
+
+ /** Initialize p from a vector of coefficients.
+ * The vector should be ordered the same way NTL does it: the front
+ * of the vector corresponds to the trailing coefficients, and the back
+ * of the vector corresponds to the leading coefficients. That is,
+ * v[i] = coefficient of x^i.
+ */
+ template <class ANY>
+ Element& init( Element& p, const std::vector<ANY>& v ) const
+ {
+ p = 0;
+ Coeff temp;
+ for( long i = 0; i < (long)v.size(); ++i ) {
+ _CField.init( temp, v[ (size_t) i ] );
+ if( !_CField.isZero(temp) )
+ NTL::SetCoeff( p, i, temp );
+ }
+ return p;
+ }
+
+ /** Initialize p from a vector of coefficients.
+ * The vector should be ordered the same way NTL does it: the front
+ * of the vector corresponds to the trailing coefficients, and the back
+ * of the vector corresponds to the leading coefficients. That is,
+ * v[i] = coefficient of x^i.
+ */
+ Element& init( Element& p, const std::vector<Coeff>& v ) const
+ {
+ p = 0;
+ for( long i = 0; i < (long)v.size(); ++i )
+ NTL::SetCoeff( p, i, v[ (size_t) i ] );
+ return p;
+ }
+
+ template<class T>
+ Element& init(Element& x, const BlasVector<T>& y) const
+ {
+ return init(x,y.getRep()) ;
+ }
+
+
+ /** Convert p to a vector of coefficients.
+ * The vector will be ordered the same way NTL does it: the front
+ * of the vector corresponds to the trailing coefficients, and the back
+ * of the vector corresponds to the leading coefficients. That is,
+ * v[i] = coefficient of x^i.
+ */
+ template< class ANY >
+ std::vector<ANY>& convert( std::vector<ANY>& v, const Element& p ) const
+ {
+ v.clear();
+ ANY temp;
+ for( long i = 0; i <= (long)this->deg(p); ++i ) {
+ _CField.convert( temp, NTL::coeff( p, i ) );
+ v.push_back( temp );
+ }
+ return v;
+ }
+
+ /** Convert p to a vector of coefficients.
+ * The vector will be ordered the same way NTL does it: the front
+ * of the vector corresponds to the trailing coefficients, and the back
+ * of the vector corresponds to the leading coefficients. That is,
+ * v[i] = coefficient of x^i.
+ */
+ std::vector<Coeff>& convert( std::vector<Coeff>& v, const Element& p ) const
+ {
+ v.clear();
+ for( long i = 0; i <= (long)this->deg(p); ++i )
+ v.push_back( NTL::coeff(p,i) );
+ return v;
+ }
+
+ /** Test if an element equals zero */
+ bool isZero( const Element& x ) const
+ {
+ return ( (this->deg(x) == 0) &&
+ ( _CField.isZero( NTL::ConstTerm(x) ) ) );
+ }
+
+ /** Test if an element equals one */
+ bool isOne( const Element& x ) const
+ {
+ return ( (this->deg(x) == 0) &&
+ ( _CField.isOne( NTL::ConstTerm(x) ) ) );
+ }
+
+ bool isMOne (const Element& x) const
+ {
+ return ( (this->deg(x) == 0) &&
+ ( _CField.isMOne( NTL::ConstTerm(x) ) ) );
+ }
+
+ /** The LinBox field for coefficients */
+ const CoeffField& getCoeffField() const
+ {
+ return _CField;
+ }
+
+ /** Get the degree of a polynomial
+ * Unlike NTL, deg(0)=0.
+ */
+ size_t deg( const Element& p ) const
+ {
+ long temp = NTL::deg(p);
+ if( temp == -1 ) return 0;
+ else return static_cast<size_t>(temp);
+ }
+
+ /** r will be set to the reverse of p. */
+ Element& rev( Element& r, const Element& p ) {
+ NTL::reverse(r,p);
+ return r;
+ }
+
+ /** r is itself reversed. */
+ Element& revin( Element& r ) {
+ return r = NTL::reverse(r);
+ }
+
+ /** Get the leading coefficient of this polynomial. */
+ Coeff& leadCoeff( Coeff& c, const Element& p ) const
+ {
+ c = NTL::LeadCoeff(p);
+ return c;
+ }
+
+ /** Get the coefficient of x^i in a given polynomial */
+ Coeff& getCoeff( Coeff& c, const Element& p, size_t i ) const
+ {
+ c = NTL::coeff( p, (long)i );
+ return c;
+ }
+
+ /** Set the coefficient of x^i in a given polynomial */
+ Element& setCoeff( Element& p, size_t i, const Coeff& c ) const
+ {
+ NTL::SetCoeff(p,(long)i,c);
+ return p;
+ }
+
+ /** Get the quotient of two polynomials */
+ Element& quo( Element& res, const Element& a, const Element& b ) const
+ {
+ NTL::div(res,a,b);
+ return res;
+ }
+
+ /** a = quotient of a, b */
+ Element& quoin( Element& a, const Element& b ) const
+ {
+ return a /= b;
+ }
+
+ /** Get the remainder under polynomial division */
+ Element& rem( Element& res, const Element& a, const Element& b ) const
+ {
+ NTL::rem(res,a,b);
+ return res;
+ }
+
+ /** a = remainder of a,b */
+ Element& remin( Element& a, const Element& b ) const
+ {
+ return a %= b;
+ }
+
+ /** Get the quotient and remainder under polynomial division */
+ void quorem( Element& q, Element& r,
+ const Element& a, const Element& b ) const
+ {
+ NTL::DivRem(q,r,a,b);
+ }
+
+ /** Get characteristic of the field - same as characteristic of
+ * coefficient field. */
+ integer& characteristic( integer& c ) const
+ {
+ return _CField.characteristic(c);
+ }
+
+ /** Get the cardinality of the field. Since the cardinality is
+ * infinite, by convention we return -1.
+ */
+ integer& cardinality( integer& c ) const
+ {
+ return c = static_cast<integer>(-1);
+ }
+
+ static inline integer maxCardinality()
+ {
+ return CoeffField::maxCardinality();
+ }
+
+ /** Write a description of the field */
+ // Oustide of class definition so write(ostream&,const Element&) from
+ // Givaro::ZRing still works.
+ std::ostream& write( std::ostream& os ) const
+ {
+ return os << "Polynomial ring using NTL::ZZ_pX";
+ }
+
+ std::ostream &write (std::ostream &os, const Element &x) const { return Givaro::UnparametricOperations<Element>::write(os,x); }
+
+
+ private:
+ /** Conversion to scalar types doesn't make sense and should not be
+ * used. Use getCoeff or leadCoeff to get the scalar values of
+ * specific coefficients, and then convert them using coeffField()
+ * if needed.
+ */
+ template< class ANY >
+ ANY& convert( ANY& x, const Element& y ) const
+ {
+ return x;
+ }
+
+ CoeffField _CField;
+ }; // end of class NTL_ZZ_pX
+
+
+} // end of namespace LinBox
+
+#endif // __LINBOX_field_ntl_zz_px_H
+
+
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+
diff --git a/linbox/ring/pid-ntl-zz_p.h b/linbox/ring/pid-ntl-zz_p.h
new file mode 100644
index 0000000..d6d571d
--- /dev/null
+++ b/linbox/ring/pid-ntl-zz_p.h
@@ -0,0 +1,92 @@
+/* Copyright (C) 2010 LinBox
+ * written by bds
+ *
+ *
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ * ========LICENCE========
+ */
+
+
+#ifndef __LINBOX_ntl_pid_zz_p_H
+#define __LINBOX_ntl_pid_zz_p_H
+
+#include "linbox/ring/ntl/ntl-lzz_p.h"
+#include "linbox/util/debug.h"
+#include "linbox/linbox-config.h"
+#include "linbox/field/field-traits.h"
+
+// Namespace in which all LinBox library code resides
+namespace LinBox
+{
+ template <class Ring>
+ struct ClassifyRing;
+
+ class NTL_PID_zz_p;
+
+ template<>
+ struct ClassifyRing<NTL_PID_zz_p> {
+ typedef RingCategories::ModularTag categoryTag;
+ };
+
+ /** \brief extend Wrapper of zz_p from NTL. Add PID functions
+ \ingroup ring
+ */
+ struct NTL_PID_zz_p: public NTL_zz_p
+ {
+ protected: long _modulus;
+ public:
+ NTL_PID_zz_p(long pp, int exp = 1) :
+ NTL_zz_p(pp), _modulus(pp)
+ {
+ if( exp != 1 ) throw PreconditionFailed(LB_FILE_LOC,"exponent must be 1");
+ }
+
+ Element& gcd(Element& g, const Element& a, const Element& b) const
+ { g = NTL::GCD(NTL::rep(a), NTL::rep(b));
+ g = NTL::GCD(NTL::rep(g), _modulus);
+ return g;
+ }
+
+ Element& gcdin(Element& a, const Element& b) const
+ { return gcd(a,a, b); }
+
+ bool isUnit(const Element& a) const
+ { return 1 == NTL::GCD(NTL::rep(a), _modulus); }
+
+ Element& div(Element& c, const Element& a, const Element& b) const
+ { return c = NTL::rep(a)/NTL::GCD(NTL::rep(a),NTL::rep(b)); }
+ Element& divin(Element& a, const Element& b) const
+ { return div(a, a, b); }
+
+ static inline double maxCardinality() { return (double)NTL_SP_BOUND; }
+ };
+
+} // namespace LinBox
+
+#endif // __LINBOX_ntl_pid_zz_p_H
+
+
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+
diff --git a/linbox/ring/pir-modular-int32.h b/linbox/ring/pir-modular-int32.h
new file mode 100644
index 0000000..4b7d4d3
--- /dev/null
+++ b/linbox/ring/pir-modular-int32.h
@@ -0,0 +1,713 @@
+/* Copyright (C) 2010 LinBox
+ *
+ *
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ * ========LICENCE========
+ */
+
+
+#ifndef __LINBOX_pir_modular_int32_H
+#define __LINBOX_pir_modular_int32_H
+
+#include <givaro/modular-int32.h>
+
+//#include "linbox/ring/modular.h"
+#ifndef LINBOX_MAX_INT
+#define LINBOX_MAX_INT 2147483647
+#endif
+
+#ifndef LINBOX_MAX_MODULUS
+#define LINBOX_MAX_MODULUS 1073741824
+#endif
+#include "linbox/field/field-traits.h"
+
+// Namespace in which all LinBox code resides
+namespace LinBox
+{
+
+ template< class PIR>
+ class PIRModular;
+
+ template< class Element >
+ class ModularRandIter;
+
+ template<class Field>
+ class DotProductDomain;
+
+ template<class Field>
+ class FieldAXPY;
+
+ template<class Field>
+ class MVProductDomain;
+
+ template <class Ring>
+ struct ClassifyRing;
+
+ template <class Element>
+ struct ClassifyRing<PIRModular<Element> >;
+
+ template <>
+ struct ClassifyRing<PIRModular<int32_t> > {
+ typedef RingCategories::ModularTag categoryTag;
+ };
+
+ /// \ingroup ring
+ template <>
+ class PIRModular<int32_t> : public Givaro::Modular<int32_t> {
+
+ public:
+
+ friend class FieldAXPY<PIRModular<int32_t> >;
+
+ friend class DotProductDomain<PIRModular<int32_t> >;
+
+ friend class MVProductDomain<PIRModular<int32_t> >;
+
+ typedef int32_t Element;
+
+ typedef Givaro::Modular<int32_t>::RandIter RandIter;
+
+ uint64_t _two_64;
+
+
+ //default modular field,taking 65521 as default modulus
+ PIRModular () :
+ Givaro::Modular<int32_t>(65521)
+ {
+ _two_64 = (uint64_t(1) << 32) % uint64_t(this->characteristic());
+ _two_64 = (_two_64 * _two_64) % uint64_t(this->characteristic());
+
+ }
+
+ PIRModular (int32_t value, int32_t exp = 1) :
+ Givaro::Modular<int32_t>(value)
+ {
+ _two_64 = (uint64_t(1) << 32) % uint64_t(this->characteristic());
+ _two_64 = (_two_64 * _two_64) % uint64_t(this->characteristic());
+
+ }
+
+
+ /** PIR functions, gcd, xgcd, dxgcd */
+
+ Element& gcd (Element& g, const Element& a, const Element& b) const
+ {
+
+ GCD (g, a, b);
+
+ return g;
+
+ }
+
+ Element& xgcd (Element& g, Element& s, Element& t, const Element& a, const Element& b) const
+ {
+
+ XGCD (g, s, t, a, b);
+
+ if (s < 0)
+ s += _p;
+
+ if (t < 0)
+ t += _p;
+
+
+ return g;
+ }
+
+ Element& dxgcd (Element& g, Element& s, Element& t, Element& a1, Element& b1,
+ const Element& a, const Element& b) const
+ {
+
+
+ xgcd (g, s, t, a, b);
+
+ if (g != 0) {
+
+ a1 = a / g;
+
+ b1 = b / g;
+ }
+
+ else {
+
+ a1 = s;
+
+ b1 = t;
+ }
+
+
+ return g;
+
+ }
+
+ bool isDivisor (const Element& a, const Element& b) const
+ {
+
+ Element g;
+
+ if (a == 0) return false;
+
+ else if (b == 0) return true;
+
+ else {
+
+ gcd (g, a, _p);
+
+ return (b % g) == 0;
+ }
+
+ }
+
+ Element& div (Element& d, const Element& a, const Element& b) const
+ {
+
+ Element g, s;
+
+ HXGCD (g, s, b, _p);
+
+ Element r;
+
+ r = a % g;
+
+ if (r != 0) throw PreconditionFailed(LB_FILE_LOC,"Div: not dividable");
+
+ else {
+
+ d = a / g;
+
+ mulin (d, s);
+ }
+
+ return d;
+
+ }
+
+ Element& normal (Element& a, const Element& b) const
+ {
+
+ if (b == 0) return a = 0;
+ else {
+ GCD (a, b, _p);
+
+ return a;
+ }
+ }
+
+
+ Element& gcdin (Element& a, const Element& b) const
+ {
+
+ GCD (a, a, b);
+
+
+ return normalIn(a); // is this efficient?
+ }
+
+ Element& normalIn (Element& a) const
+ {
+ if (a == 0) return a;
+ else {
+ GCD (a, a, _p);
+
+ return a;
+ }
+
+ }
+
+
+ Element& divin (Element& a, const Element& b) const
+ {
+
+ div (a, a, b);
+
+ return a;
+ }
+
+
+ bool isUnit(const Element& a) const
+ {
+
+ Element g;
+
+ GCD (g, a, _p);
+
+
+ // std::cout << a << " is a unit or not " << g;
+
+ // std::cout << "modulus = " << _p <<"\n";
+
+ return g == 1;
+
+ }
+
+ private:
+ static void GCD (int32_t& g, int32_t a, int32_t b) {
+
+ int32_t u, v, /* q,*/ r;
+
+ if (a < 0) {
+ if (a < -LINBOX_MAX_INT) throw PreconditionFailed(LB_FILE_LOC,"XGCD: integer overflow");
+ a = -a;
+
+ }
+
+ if (b < 0) {
+ if (b < -LINBOX_MAX_INT) throw PreconditionFailed(LB_FILE_LOC,"XGCD: integer overflow");
+ b = -b;
+ }
+
+ u = a; v = b;
+
+ while (v != 0) {
+ // q = u / v;
+ r = u % v;
+ u = v;
+ v = r;
+ }
+
+ g = u;
+
+ }
+
+ static void XGCD(int32_t& d, int32_t& s, int32_t& t, int32_t a, int32_t b) {
+ int32_t u, v, u0, v0, u1, v1, u2, v2, q, r;
+
+ int32_t aneg = 0, bneg = 0;
+
+ if (a < 0) {
+ if (a < -LINBOX_MAX_INT) throw PreconditionFailed(LB_FILE_LOC,"XGCD: integer overflow");
+ a = -a;
+ aneg = 1;
+ }
+
+ if (b < 0) {
+ if (b < -LINBOX_MAX_INT) throw PreconditionFailed(LB_FILE_LOC,"XGCD: integer overflow");
+ b = -b;
+ bneg = 1;
+ }
+
+ u1 = 1; v1 = 0;
+ u2 = 0; v2 = 1;
+ u = a; v = b;
+
+ while (v != 0) {
+ q = u / v;
+ r = u % v;
+ u = v;
+ v = r;
+ u0 = u2;
+ v0 = v2;
+ u2 = u1 - q*u2;
+ v2 = v1- q*v2;
+ u1 = u0;
+ v1 = v0;
+ }
+
+ if (aneg)
+ u1 = -u1;
+
+ if (bneg)
+ v1 = -v1;
+
+ d = u;
+ s = u1;
+ t = v1;
+ }
+
+
+ static void HXGCD (int32_t& d, int32_t& s, int32_t a, int32_t b) {
+
+ int32_t u, v, u0, u1, u2, q, r;
+
+ int32_t aneg = 0;
+
+ if (a < 0) {
+ if (a < -LINBOX_MAX_INT) throw PreconditionFailed(LB_FILE_LOC,"XGCD: integer overflow");
+ a = -a;
+ aneg = 1;
+ }
+
+ if (b < 0) {
+ if (b < -LINBOX_MAX_INT) throw PreconditionFailed(LB_FILE_LOC,"XGCD: integer overflow");
+ b = -b;
+ }
+
+ u1 = 1;
+ u2 = 0;
+ u = a; v = b;
+
+ while (v != 0) {
+ q = u / v;
+ r = u % v;
+ u = v;
+ v = r;
+ u0 = u2;
+
+ u2 = u1 - q*u2;
+
+ u1 = u0;
+
+ }
+
+ if (aneg)
+ u1 = -u1;
+
+
+ d = u;
+ s = u1;
+
+ }
+
+ };
+
+ template <>
+ class FieldAXPY<PIRModular<int32_t> > {
+ public:
+
+ typedef int32_t Element;
+ typedef int64_t Abnormal;
+ typedef PIRModular<int32_t> Field;
+
+ FieldAXPY (const Field &F) :
+ _field (F),_y(0)
+ {}
+
+
+ FieldAXPY (const FieldAXPY &faxpy) :
+ _field (faxpy._field), _y (0)
+ {}
+
+// FieldAXPY<PIRModular<int32_t> > &operator = (const FieldAXPY &faxpy) {
+// _field = faxpy._field;
+// _y = faxpy._y;
+// return *this;
+// }
+
+ inline uint64_t& mulacc (const Element &a, const Element &x) {
+ uint64_t t = (uint64_t) a * (uint64_t) x;
+ _y += t;
+ if (_y < t)
+ return _y += field()._two_64;
+ else
+ return _y;
+ }
+
+ inline uint64_t& accumulate (const Element &t) {
+ _y += (uint64_t)t;
+ if (_y < (uint64_t)t)
+ return _y += field()._two_64;
+ else
+ return _y;
+ }
+
+ inline Element& get (Element &y) {
+ y = Element(_y % (uint64_t) field().characteristic());
+ return y;
+ }
+
+ inline FieldAXPY &assign (const Element y) {
+ _y = (uint64_t)y;
+ return *this;
+ }
+
+ inline void reset() {
+ _y = 0;
+ }
+
+ inline const Field & field() const { return _field; }
+
+ protected:
+ const Field &_field;
+ uint64_t _y;
+ };
+
+
+ template <>
+ class DotProductDomain<PIRModular<int32_t> > : public VectorDomainBase<PIRModular<int32_t> > {
+
+ public:
+ typedef int32_t Element;
+ DotProductDomain (const PIRModular<int32_t> &F) :
+ VectorDomainBase<PIRModular<int32_t> > (F)
+ {}
+
+
+ protected:
+ template <class Vector1, class Vector2>
+ inline Element &dotSpecializedDD (Element &res, const Vector1 &v1, const Vector2 &v2) const
+ {
+
+ typename Vector1::const_iterator i;
+ typename Vector2::const_iterator j;
+
+ uint64_t y = 0;
+ uint64_t t;
+
+ for (i = v1.begin (), j = v2.begin (); i < v1.end (); ++i, ++j) {
+ t = ( (uint64_t) *i ) * ( (uint64_t) *j );
+ y += t;
+
+ if (y < t)
+ y += field()._two_64;
+ }
+
+ y %= (uint64_t) field().characteristic();
+ return res = Element(y);
+
+ }
+
+ template <class Vector1, class Vector2>
+ inline Element &dotSpecializedDSP (Element &res, const Vector1 &v1, const Vector2 &v2) const
+ {
+ typename Vector1::first_type::const_iterator i_idx;
+ typename Vector1::second_type::const_iterator i_elt;
+
+ uint64_t y = 0;
+ uint64_t t;
+
+ for (i_idx = v1.first.begin (), i_elt = v1.second.begin (); i_idx != v1.first.end (); ++i_idx, ++i_elt) {
+ t = ( (uint64_t) *i_elt ) * ( (uint64_t) v2[*i_idx] );
+ y += t;
+
+ if (y < t)
+ y += field()._two_64;
+ }
+
+
+ y %= (uint64_t) field().characteristic();
+
+ return res = (Element)y;
+ }
+ };
+
+
+ // Specialization of MVProductDomain for int32_t modular field
+ template <>
+ class MVProductDomain<PIRModular<int32_t> > {
+ public:
+
+ typedef int32_t Element;
+
+ protected:
+ template <class Vector1, class Matrix, class Vector2>
+ inline Vector1 &mulColDense
+ (const VectorDomain<PIRModular<int32_t> > &VD, Vector1 &w, const Matrix &A, const Vector2 &v) const
+ {
+ return mulColDenseSpecialized
+ (VD, w, A, v, typename VectorTraits<typename Matrix::Column>::VectorCategory ());
+ }
+
+ private:
+ template <class Vector1, class Matrix, class Vector2>
+ Vector1 &mulColDenseSpecialized
+ (const VectorDomain<PIRModular<int32_t> > &VD, Vector1 &w, const Matrix &A, const Vector2 &v,
+ VectorCategories::DenseVectorTag) const;
+ template <class Vector1, class Matrix, class Vector2>
+ Vector1 &mulColDenseSpecialized
+ (const VectorDomain<PIRModular<int32_t> > &VD, Vector1 &w, const Matrix &A, const Vector2 &v,
+ VectorCategories::SparseSequenceVectorTag) const;
+ template <class Vector1, class Matrix, class Vector2>
+ Vector1 &mulColDenseSpecialized
+ (const VectorDomain<PIRModular<int32_t> > &VD, Vector1 &w, const Matrix &A, const Vector2 &v,
+ VectorCategories::SparseAssociativeVectorTag) const;
+ template <class Vector1, class Matrix, class Vector2>
+ Vector1 &mulColDenseSpecialized
+ (const VectorDomain<PIRModular<int32_t> > &VD, Vector1 &w, const Matrix &A, const Vector2 &v,
+ VectorCategories::SparseParallelVectorTag) const;
+
+ mutable std::vector<uint64_t> _tmp;
+ };
+
+ template <class Vector1, class Matrix, class Vector2>
+ Vector1 &MVProductDomain<PIRModular<int32_t> >::mulColDenseSpecialized
+ (const VectorDomain<PIRModular<int32_t> > &VD, Vector1 &w, const Matrix &A, const Vector2 &v,
+ VectorCategories::DenseVectorTag) const
+ {
+
+ linbox_check (A.coldim () == v.size ());
+ linbox_check (A.rowdim () == w.size ());
+
+ typename Matrix::ConstColIterator i = A.colBegin ();
+ typename Vector2::const_iterator j;
+ typename Matrix::Column::const_iterator k;
+ std::vector<uint64_t>::iterator l;
+
+ uint64_t t;
+
+ if (_tmp.size () < w.size ())
+ _tmp.resize (w.size ());
+
+ std::fill (_tmp.begin (), _tmp.begin () + w.size (), 0);
+
+ for (j = v.begin (); j != v.end (); ++j, ++i) {
+ for (k = i->begin (), l = _tmp.begin (); k != i->end (); ++k, ++l) {
+ t = ((uint64_t) *k) * ((uint64_t) *j);
+
+ *l += t;
+
+ if (*l < t)
+ *l += VD.faxpy().field()._two_64;
+ }
+ }
+
+ typename Vector1::iterator w_j;
+
+ for (w_j = w.begin (), l = _tmp.begin (); w_j != w.end (); ++w_j, ++l)
+ *w_j = *l % VD.field().characteristic();
+
+ return w;
+ }
+
+ template <class Vector1, class Matrix, class Vector2>
+ Vector1 &MVProductDomain<PIRModular<int32_t> >::mulColDenseSpecialized
+ (const VectorDomain<PIRModular<int32_t> > &VD, Vector1 &w, const Matrix &A, const Vector2 &v,
+ VectorCategories::SparseSequenceVectorTag) const
+ {
+ linbox_check (A.coldim () == v.size ());
+ linbox_check (A.rowdim () == w.size ());
+
+ typename Matrix::ConstColIterator i = A.colBegin ();
+ typename Vector2::const_iterator j;
+ typename Matrix::Column::const_iterator k;
+ std::vector<uint64_t>::iterator l;
+
+ uint64_t t;
+
+ if (_tmp.size () < w.size ())
+ _tmp.resize (w.size ());
+
+ std::fill (_tmp.begin (), _tmp.begin () + w.size (), 0);
+
+ for (j = v.begin (); j != v.end (); ++j, ++i) {
+ for (k = i->begin (), l = _tmp.begin (); k != i->end (); ++k, ++l) {
+ t = ((uint64_t) k->second) * ((uint64_t) *j);
+
+ _tmp[k->first] += t;
+
+ if (_tmp[k->first] < t)
+ _tmp[k->first] += VD.faxpy().field()._two_64;
+ }
+ }
+
+ typename Vector1::iterator w_j;
+
+ for (w_j = w.begin (), l = _tmp.begin (); w_j != w.end (); ++w_j, ++l)
+ *w_j = *l % VD.field().characteristic();
+
+ return w;
+ }
+
+ template <class Vector1, class Matrix, class Vector2>
+ Vector1 &MVProductDomain<PIRModular<int32_t> >::mulColDenseSpecialized
+ (const VectorDomain<PIRModular<int32_t> > &VD, Vector1 &w, const Matrix &A, const Vector2 &v,
+ VectorCategories::SparseAssociativeVectorTag) const
+ {
+
+ linbox_check (A.coldim () == v.size ());
+ linbox_check (A.rowdim () == w.size ());
+
+ typename Matrix::ConstColIterator i = A.colBegin ();
+ typename Vector2::const_iterator j;
+ typename Matrix::Column::const_iterator k;
+ std::vector<uint64_t>::iterator l;
+
+ uint64_t t;
+
+ if (_tmp.size () < w.size ())
+ _tmp.resize (w.size ());
+
+ std::fill (_tmp.begin (), _tmp.begin () + w.size (), 0);
+
+ for (j = v.begin (); j != v.end (); ++j, ++i) {
+ for (k = i->begin (), l = _tmp.begin (); k != i->end (); ++k, ++l) {
+ t = ((uint64_t) k->second) * ((uint64_t) *j);
+
+ _tmp[k->first] += t;
+
+ if (_tmp[k->first] < t)
+ _tmp[k->first] += VD.faxpy().field()._two_64;
+ }
+ }
+
+ typename Vector1::iterator w_j;
+
+ for (w_j = w.begin (), l = _tmp.begin (); w_j != w.end (); ++w_j, ++l)
+ *w_j = *l % VD.field().characteristic();
+
+ return w;
+ }
+
+ template <class Vector1, class Matrix, class Vector2>
+ Vector1 &MVProductDomain<PIRModular<int32_t> >::mulColDenseSpecialized
+ (const VectorDomain<PIRModular<int32_t> > &VD, Vector1 &w, const Matrix &A, const Vector2 &v,
+ VectorCategories::SparseParallelVectorTag) const
+ {
+
+ linbox_check (A.coldim () == v.size ());
+ linbox_check (A.rowdim () == w.size ());
+
+ typename Matrix::ConstColIterator i = A.colBegin ();
+ typename Vector2::const_iterator j;
+ typename Matrix::Column::first_type::const_iterator k_idx;
+ typename Matrix::Column::second_type::const_iterator k_elt;
+ std::vector<uint64_t>::iterator l;
+
+ uint64_t t;
+
+ if (_tmp.size () < w.size ())
+ _tmp.resize (w.size ());
+
+ std::fill (_tmp.begin (), _tmp.begin () + w.size (), 0);
+
+ for (j = v.begin (); j != v.end (); ++j, ++i) {
+ for (k_idx = i->first.begin (), k_elt = i->second.begin (), l = _tmp.begin ();
+ k_idx != i->first.end ();
+ ++k_idx, ++k_elt, ++l)
+ {
+ t = ((uint64_t) *k_elt) * ((uint64_t) *j);
+
+ _tmp[*k_idx] += t;
+
+ if (_tmp[*k_idx] < t)
+ _tmp[*k_idx] += VD.faxpy().field()._two_64;
+ }
+ }
+
+ typename Vector1::iterator w_j;
+
+ for (w_j = w.begin (), l = _tmp.begin (); w_j != w.end (); ++w_j, ++l)
+ *w_j = *l % VD.field().characteristic();
+
+ return w;
+ }
+
+
+}
+
+
+#endif //__LINBOX_pir_modular_int32_H
+
+
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/ring/pir-ntl-zz_p.h b/linbox/ring/pir-ntl-zz_p.h
new file mode 100644
index 0000000..c4bca76
--- /dev/null
+++ b/linbox/ring/pir-ntl-zz_p.h
@@ -0,0 +1,913 @@
+/* Copyright (C) 2010 LinBox
+ * written by Zhendong Wan
+ *
+ *
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ * ========LICENCE========
+ */
+
+
+#ifndef __LINBOX_pir_ntl_zz_p_H
+#define __LINBOX_pir_ntl_zz_p_H
+
+#include <givaro/zring.h>
+#include "linbox/linbox-config.h"
+#include "linbox/util/debug.h"
+#include <NTL/ZZ.h>
+#include <NTL/ZZ_p.h>
+#include "linbox/ring/ntl/ntl-zz_p.h"
+#include "linbox/vector/vector-domain.h"
+#include <sstream>
+#include "linbox/integer.h"
+#include "linbox/field/field-traits.h"
+
+namespace LinBox
+{
+
+ template<class Field>
+ class FieldAXPY;
+
+ template <class Ring>
+ struct ClassifyRing;
+
+ class PIR_ntl_ZZ_p;
+
+ template <>
+ struct ClassifyRing<PIR_ntl_ZZ_p> {
+ typedef RingCategories::ModularTag categoryTag;
+ };
+
+ /** \brief extend Wrapper of ZZ_p from NTL. Add PIR functions
+ \ingroup field
+ */
+
+ class PIR_ntl_ZZ_p : public NTL_ZZ_p {
+ //public Givaro::ZRing<NTL::ZZ_p> {
+
+ // typedef Givaro::ZRing<NTL::ZZ_p> Father_t ;
+ typedef NTL_ZZ_p Father_t ;
+ public:
+ typedef Father_t::Element Element;
+
+ template <class Int_t>
+ PIR_ntl_ZZ_p(const Int_t& d) :
+ Father_t(d)
+ {
+ // NTL::ZZ_p::init (NTL::to_ZZ(d));
+ }
+
+ PIR_ntl_ZZ_p (const NTL::ZZ& d) :
+ Father_t(d)
+ {
+ // NTL::ZZ_p::init(d);
+ }
+
+ PIR_ntl_ZZ_p (const integer& d, int e = 1 ) :
+ Father_t(d,(size_t)e)
+ {
+
+ // if(e != 1) throw PreconditionFailed(LB_FILE_LOC,"exponent must be 1");
+ linbox_check(e == 1);
+
+ // NTL::ZZ_p::init (NTL::to_ZZ(((std::string)d). c_str()));
+
+ }
+
+ inline integer& cardinality (integer& c) const {
+
+ std::stringstream io;
+
+ io << NTL::ZZ_p::modulus();
+
+ io >> c;
+
+ return c;
+ }
+
+ inline NTL::ZZ& cardinality (NTL::ZZ& c) const {
+
+ return c = NTL::ZZ_p::modulus();
+ }
+
+ inline integer& characteristic (integer& c) const {
+
+ std::stringstream io;
+
+ io << NTL::ZZ_p::modulus();
+
+ io >> c;
+
+ return c;
+ }
+
+ std::ostream& write (std::ostream& out) const {
+ return out << "PIR_NTL_ZZ_p Ring";
+ }
+
+ std::istream& read (std::istream& in) {
+ return in;
+ }
+
+ /** @brief
+ * Init x from y.
+ */
+ template<class Element2>
+ inline Element& init (Element& x, const Element2& y) const {
+
+ NTL::conv (x, y);
+
+ return x;
+ }
+
+ /** @brief
+ * Init from a NTL::ZZ_p
+ */
+ inline Element& init (Element& x, const Element& y) const {
+
+ x = y;
+
+ return x;
+ }
+
+ /** @brief
+ * I don't know how to init from integer.
+ */
+ inline Element& init (Element& x, const integer& y) const {
+
+
+ NTL::conv(x, NTL::to_ZZ( (static_cast<const std::string>(y)).c_str() ) );
+ return x;
+ }
+
+ /** @brief
+ * Convert y to an Element.
+ */
+ integer& convert (integer& x, const Element& y) const {
+ bool neg=false;
+ if (NTL::sign(NTL::rep(y)) <0)
+ neg=true;
+ long b = NTL::NumBytes(NTL::rep(y));
+ unsigned char* byteArray; byteArray = new unsigned char[(size_t)b ];
+ NTL::BytesFromZZ(byteArray, NTL::rep(y), b);
+ integer base(256);
+ x= integer(0);
+ for(long i = b - 1; i >= 0; --i) {
+ x *= base;
+ x += integer(byteArray[i]);
+ }
+ delete [] byteArray;
+ if (neg)
+ x=-x;
+ return x;
+ }
+
+
+ /** @brief
+ * x = y.
+ */
+ inline Element& assign (Element& x, const Element& y) const {
+ return x = y;
+ }
+
+ /** @brief
+ * Test if x == y
+ */
+ inline bool areEqual (const Element& x ,const Element& y) const {
+ return x == y;
+ }
+
+ /** @brief
+ * Test if x == 0
+ */
+ inline bool isZero (const Element& x) const {
+
+ return NTL::IsZero (x);
+ }
+
+ /** @brief
+ * Test if x == 1
+ */
+ inline bool isOne (const Element& x) const {
+ return NTL::IsOne (x);
+ }
+
+ bool isMOne (const Element& x) const
+ {
+ Element y ; neg(y,x);
+ return isOne(y);
+ }
+
+
+ // arithmetic
+
+ /** @brief
+ * return x = y + z
+ */
+ inline Element& add (Element& x, const Element& y, const Element& z) const {
+
+ NTL::add (x, y, z);
+
+ return x;
+ }
+
+ /** @brief
+ * return x = y - z
+ */
+ inline Element& sub (Element& x, const Element& y, const Element& z) const {
+
+ NTL::sub (x, y, z);
+
+ return x;
+ }
+
+ /** @brief
+ * return x = y * z
+ */
+ template <class Int>
+ inline Element& mul (Element& x, const Element& y, const Int& z) const {
+
+ NTL::mul (x, y, z);
+
+ return x;
+ }
+
+ /** @brief
+ * If exists a, such that a * z =y,
+ * return x = one of them.
+ * Otherwise, throw an exception
+ */
+ inline Element& div (Element& x, const Element& y, const Element& z) const {
+
+ NTL::ZZ g, s, t;
+
+ NTL::XGCD (g, s, t, NTL::rep(z), NTL::ZZ_p::modulus());
+
+ NTL::ZZ q, r;
+
+ NTL::DivRem (q, r, NTL::rep(y), g);
+
+ if (NTL::IsZero (r)) {
+
+ Element tmp1, tmp2;
+
+ NTL::conv (tmp1, s);
+
+ NTL::conv (tmp2, q);
+
+ NTL::mul (x, tmp1, tmp2);
+
+ }
+
+ else
+ throw PreconditionFailed(LB_FILE_LOC,"Div: not dividable");
+
+
+ return x;
+
+ }
+
+ /** @brief
+ * If y is a unit, return x = 1 / y,
+ * otherwsie, throw an exception
+ */
+ inline Element& inv (Element& x, const Element& y) const {
+
+ NTL::inv (x, y);
+
+ return x;
+ }
+
+ /** @brief
+ * return x = -y;
+ */
+ inline Element& neg (Element& x, const Element& y) const {
+
+ NTL::negate (x, y);
+
+ return x;
+ }
+
+
+ /** @brief
+ * return r = a x + y
+ */
+
+ template <class Int>
+ inline const Element& axpy (Element& r, const Element& a, const Int& x, const Element& y) const {
+
+ NTL::mul (r, a, x);
+
+ return r += y;
+ }
+
+
+ // inplace operator
+
+ /** @brief
+ * return x += y;
+ */
+ inline Element& addin (Element& x, const Element& y) const {
+
+ return x += y;
+ }
+
+ /** @brief
+ * return x -= y;
+ */
+ inline Element& subin (Element& x, const Element& y) const {
+
+ return x -= y;
+ }
+
+ /** @brief
+ * return x *= y;
+ */
+ template<class Int>
+ inline Element& mulin (Element& x, const Int& y) const {
+
+ return x *= y;
+ }
+
+ /** @brief
+ * If y divides x, return x /= y,
+ * otherwise throw an exception
+ */
+ inline const Element& divin (Element& x, const Element& y) const {
+
+ div (x, x, y);
+
+ return x;
+ }
+
+ /** @brief
+ * If x is a unit, x = 1 / x,
+ * otherwise, throw an exception.
+ */
+ inline Element& invin (Element& x) const {
+
+ return x = NTL::inv(x);
+ }
+
+ /** @brief
+ * return x = -x;
+ */
+ inline Element& negin (Element& x) const {
+
+ NTL::negate (x, x);
+
+ return x;
+ }
+
+ /** @brief
+ * return r += a x
+ */
+ template <class Int>
+ inline Element& axpyin (Element& r, const Element& a, const Int& x) const {
+
+ return r += a * x;
+ }
+
+
+ // IO
+
+ /** @brief
+ * out << y;
+ */
+ static std::ostream& write(std::ostream& out,const Element& y) {
+
+ out << y;
+
+ return out;
+ }
+
+
+ /** @brief
+ * read x from istream in
+ static std::istream& read(std::istream& in, Element& x) {
+
+ return in >> x;
+ }
+ */
+ using Father_t::read;
+
+
+ /** some PIR function
+ */
+
+ /** @brief
+ * Test if x is a unit.
+ */
+ inline static bool isUnit (const Element& x) {
+
+ NTL::ZZ g;
+
+ NTL::GCD (g, NTL::rep(x), NTL::ZZ_p::modulus());
+
+ return NTL::IsOne (g);
+ }
+
+ /** @brief
+ * return g = gcd (a, b)
+ */
+ inline static Element& gcd (Element& g, const Element& a, const Element& b) {
+
+ NTL::ZZ d;
+
+ NTL::GCD (d, NTL::rep(a), NTL::rep(b));
+
+ NTL::conv (g, d);
+
+ return g;
+ }
+
+ /** @brief
+ * return g = gcd (g, b)
+ */
+ inline static Element& gcdin (Element& g, const Element& b) {
+
+ gcd (g, g, b);
+
+ return g;
+ }
+
+ /** @brief
+ * g = gcd(a, b) = a*s + b*t.
+ * and gcd (s, t) is a unit.
+ */
+ inline static Element& xgcd (Element& g, Element& s, Element& t, const Element& a, const Element& b){
+
+ NTL::ZZ g1, s1, t1;
+
+ NTL::XGCD (g1, s1, t1, NTL::rep(a), NTL::rep(b));
+
+ NTL::conv (g, g1);
+
+ NTL::conv (s, s1);
+
+ NTL::conv (t, t1);
+
+ return g;
+ }
+
+ /** @brief
+ * g = gcd(a, b) = a*s + b*t.
+ * and gcd (s, t) is a unit.
+ * s * a1 + t * b1 = a unit.
+ */
+ inline static Element& dxgcd (Element& g, Element& s, Element& t, Element& a1, Element& b1,
+ const Element& a, const Element& b){
+
+ NTL::ZZ g1, s1, t1, a2, b2;
+
+ NTL::XGCD (g1, s1, t1, NTL::rep(a), NTL::rep(b));
+
+ NTL::conv (g, g1);
+
+ NTL::conv (s, s1);
+
+ NTL::conv (t, t1);
+
+ if (NTL::IsZero (g1)) {
+
+ a1 = s;
+
+ b1 = t;
+ }
+
+ else {
+
+ NTL::div (a2, NTL::rep(a), g1);
+
+ NTL::div (b2, NTL::rep(b), g1);
+
+ NTL::conv (a1, a2);
+
+ NTL::conv (b1, b2);
+ }
+
+ return g;
+ }
+
+ /** @brief
+ * Test if a | b.
+ */
+ inline static bool isDivisor (const Element& a, const Element& b) {
+
+ if ( NTL::IsZero (a) ) return false;
+
+ else if (NTL::IsZero (b)) return true;
+
+ else {
+ NTL::ZZ g, r;
+
+ NTL::GCD (g, NTL::rep(a), NTL::ZZ_p::modulus());
+
+ NTL::rem (r, NTL::rep(b), g);
+
+ return NTL::IsZero (r);
+ }
+ }
+
+ /** @brief
+ * a = normalization of b.
+ */
+
+ inline static Element& normal (Element& a, const Element& b) {
+
+ NTL::ZZ a1;
+
+ NTL::GCD (a1, NTL::rep(b), NTL::ZZ_p::modulus());
+
+ NTL::conv (a, a1);
+
+ return a;
+ }
+
+ /** @brief
+ */
+
+ inline static Element& normalIn (Element& a) {
+
+
+ NTL::ZZ a1;
+
+ NTL::GCD (a1, NTL::rep(a), NTL::ZZ_p::modulus());
+
+ NTL::conv (a, a1);
+
+ return a;
+ }
+
+ inline static integer maxCardinality()
+ { return integer( "4294967295" ); } // 2^32 - 1
+
+ };
+
+
+
+ template <>
+ class FieldAXPY<PIR_ntl_ZZ_p> {
+ public:
+ typedef PIR_ntl_ZZ_p Field;
+ typedef Field::Element Element;
+ typedef NTL::ZZ Abnormal;
+
+ /** Constructor.
+ * A faxpy object if constructed from a Field.
+ * Copies of this objects are stored in the faxpy object.
+ * @param F field F in which arithmetic is done
+ */
+ FieldAXPY (const Field &F) :
+ _field (F)
+ { _y = NTL::ZZ::zero(); }
+
+ /** Copy constructor.
+ * @param faxpy
+ */
+ FieldAXPY (const FieldAXPY<Field> &faxpy) :
+ _field (faxpy._field), _y (faxpy._y)
+ {}
+
+ /** Assignment operator
+ * @param faxpy
+ */
+ FieldAXPY<Field> &operator = (const FieldAXPY &faxpy)
+ { _y = faxpy._y; return *this; }
+
+ /** Add a*x to y
+ * y += a*x.
+ * @param a constant reference to element a
+ * @param x constant reference to element x
+ */
+ inline NTL::ZZ& mulacc (const Element &a, const Element &x)
+ {
+ return _y += NTL::rep(a) * NTL::rep(x) ;
+ }
+
+ inline NTL::ZZ& accumulate (const Element &t)
+ {
+ return _y += NTL::rep(t);
+ }
+
+ /** Retrieve y
+ *
+ * Performs the delayed modding out if necessary
+ */
+ inline Element &get (Element &y) { NTL::conv (y, _y); return y; }
+
+ /** Assign method.
+ * Stores new field element for arithmetic.
+ * @return reference to self
+ * @param y constant reference to element a
+ */
+ inline FieldAXPY &assign (const Element& y)
+ {
+ _y = NTL::rep(y);
+
+ return *this;
+ }
+
+ inline void reset() {
+ _y = NTL::ZZ::zero();
+ }
+
+ inline const Field& field() const { return _field; }
+ private:
+
+ /// Field in which arithmetic is done
+ /// Not sure why it must be mutable, but the compiler complains otherwise
+ const Field &_field;
+
+ /// Field element for arithmetic
+ NTL::ZZ _y;
+
+ };
+
+ template<class Field>
+ class DotProductDomain;
+
+ template <>
+ class DotProductDomain<PIR_ntl_ZZ_p> : private VectorDomainBase<PIR_ntl_ZZ_p> {
+
+ public:
+ typedef PIR_ntl_ZZ_p::Element Element;
+ DotProductDomain (const PIR_ntl_ZZ_p& F) :
+ VectorDomainBase<PIR_ntl_ZZ_p> (F) {}
+
+
+ protected:
+ template <class Vector1, class Vector2>
+ inline Element &dotSpecializedDD (Element &res, const Vector1 &v1, const Vector2 &v2) const
+ {
+
+ typename Vector1::const_iterator i;
+ typename Vector2::const_iterator j;
+
+ NTL::ZZ y;
+ //NTL::ZZ t;
+
+ for (i = v1.begin (), j = v2.begin (); i < v1.end (); ++i, ++j) {
+
+ y += NTL::rep (*i) * NTL::rep(*j);
+
+ }
+
+ //NTL::rem (t, y, NTL::ZZ_p::modulus());
+
+ NTL::conv (res, y);
+
+ return res;
+
+ }
+
+ template <class Vector1, class Vector2>
+ inline Element &dotSpecializedDSP (Element &res, const Vector1 &v1, const Vector2 &v2) const
+ {
+ typename Vector1::first_type::const_iterator i_idx;
+ typename Vector1::second_type::const_iterator i_elt;
+
+ NTL::ZZ y;
+ y = (long)0;
+ //NTL::ZZ t;
+
+ for (i_idx = v1.first.begin (), i_elt = v1.second.begin (); i_idx != v1.first.end (); ++i_idx, ++i_elt) {
+
+ y += NTL::rep(*i_elt) * NTL::rep(v2[*i_idx]);
+
+ }
+
+
+ //NTL::rem (t, y, NTL::ZZ_p::modulus());
+
+ NTL::conv (res, y);
+
+ return res;
+ }
+ };
+
+ // Specialization of MVProductDomain for PIR_ntl_ZZ_p field
+
+ template <class Field>
+ class MVProductDomain;
+
+ template <>
+ class MVProductDomain<PIR_ntl_ZZ_p>
+ {
+ public:
+
+ typedef PIR_ntl_ZZ_p::Element Element;
+
+ protected:
+ template <class Vector1, class Matrix, class Vector2>
+ inline Vector1 &mulColDense
+ (const VectorDomain<PIR_ntl_ZZ_p> &VD, Vector1 &w, const Matrix &A, const Vector2 &v) const
+ {
+ return mulColDenseSpecialized
+ (VD, w, A, v, VectorTraits<typename Matrix::Column>::VectorCategory ());
+ }
+
+ private:
+
+ template <class Vector1, class Matrix, class Vector2>
+ Vector1 &mulColDenseSpecialized
+ (const VectorDomain<PIR_ntl_ZZ_p> &VD, Vector1 &w, const Matrix &A, const Vector2 &v,
+ VectorCategories::DenseVectorTag) const;
+
+ template <class Vector1, class Matrix, class Vector2>
+ Vector1 &mulColDenseSpecialized
+ (const VectorDomain<PIR_ntl_ZZ_p> &VD, Vector1 &w, const Matrix &A, const Vector2 &v,
+ VectorCategories::SparseSequenceVectorTag) const;
+
+ template <class Vector1, class Matrix, class Vector2>
+ Vector1 &mulColDenseSpecialized
+ (const VectorDomain<PIR_ntl_ZZ_p> &VD, Vector1 &w, const Matrix &A, const Vector2 &v,
+ VectorCategories::SparseAssociativeVectorTag) const;
+
+ template <class Vector1, class Matrix, class Vector2>
+ Vector1 &mulColDenseSpecialized
+ (const VectorDomain<PIR_ntl_ZZ_p> &VD, Vector1 &w, const Matrix &A, const Vector2 &v,
+ VectorCategories::SparseParallelVectorTag) const;
+
+ };
+
+ template <class Vector1, class Matrix, class Vector2>
+ Vector1 &MVProductDomain<PIR_ntl_ZZ_p>::mulColDenseSpecialized
+ (const VectorDomain<PIR_ntl_ZZ_p> &VD, Vector1 &w, const Matrix &A, const Vector2 &v,
+ VectorCategories::DenseVectorTag) const
+ {
+
+ linbox_check (A.coldim () == v.size ());
+ linbox_check (A.rowdim () == w.size ());
+
+ typename Matrix::ConstColIterator i = A.colBegin ();
+ typename Vector2::const_iterator j;
+ typename Matrix::Column::const_iterator k;
+ std::vector<NTL::ZZ>::iterator l;
+ std::vector<NTL::ZZ> _tmp(w.size());
+
+ //NTL::ZZ t;
+
+ for (j = v.begin (); j != v.end (); ++j, ++i) {
+ for (k = i->begin (), l = _tmp.begin (); k != i->end (); ++k, ++l)
+
+ *l += NTL::rep (*k) + NTL::rep (*j);
+
+ }
+
+ typename Vector1::iterator w_j;
+
+ for (w_j = w.begin (), l = _tmp.begin (); w_j != w.end (); ++w_j, ++l) {
+
+ //NTL::rem (t, *l, NTL::ZZ_p::modulus());
+
+ NTL::conv (*w_j, *l);
+ }
+
+
+ return w;
+ }
+
+ template <class Vector1, class Matrix, class Vector2>
+ Vector1 &MVProductDomain<PIR_ntl_ZZ_p>::mulColDenseSpecialized
+ (const VectorDomain<PIR_ntl_ZZ_p> &VD, Vector1 &w, const Matrix &A, const Vector2 &v,
+ VectorCategories::SparseSequenceVectorTag) const
+ {
+ linbox_check (A.coldim () == v.size ());
+ linbox_check (A.rowdim () == w.size ());
+
+ typename Matrix::ConstColIterator i = A.colBegin ();
+ typename Vector2::const_iterator j;
+ typename Matrix::Column::const_iterator k;
+ std::vector<NTL::ZZ>::iterator l;
+ std::vector<NTL::ZZ> _tmp(w.size());
+
+ //NTL::ZZ t;
+
+ for (j = v.begin (); j != v.end (); ++j, ++i) {
+ for (k = i->begin (), l = _tmp.begin (); k != i->end (); ++k, ++l) {
+
+ _tmp[k->first] += NTL::rep (k->second) * NTL::rep (*j);
+
+ }
+ }
+
+ typename Vector1::iterator w_j;
+
+ for (w_j = w.begin (), l = _tmp.begin (); w_j != w.end (); ++w_j, ++l) {
+
+ //NTL::rem (t, *l, NTL::ZZ_p::modulus());
+
+ NTL::conv (*w_j, *l);
+ }
+
+ return w;
+ }
+
+ template <class Vector1, class Matrix, class Vector2>
+ Vector1 &MVProductDomain<PIR_ntl_ZZ_p >::mulColDenseSpecialized
+ (const VectorDomain<PIR_ntl_ZZ_p > &VD, Vector1 &w, const Matrix &A, const Vector2 &v,
+ VectorCategories::SparseAssociativeVectorTag) const
+ {
+
+ linbox_check (A.coldim () == v.size ());
+ linbox_check (A.rowdim () == w.size ());
+
+ typename Matrix::ConstColIterator i = A.colBegin ();
+ typename Vector2::const_iterator j;
+ typename Matrix::Column::const_iterator k;
+ std::vector<NTL::ZZ>::iterator l;
+
+ std::vector<NTL::ZZ> _tmp(w.size());
+
+ //NTL::ZZ t;
+
+ for (j = v.begin (); j != v.end (); ++j, ++i) {
+ for (k = i->begin (), l = _tmp.begin (); k != i->end (); ++k, ++l) {
+
+ _tmp[k->first] += NTL::rep(k -> second) * NTL::rep(*j);
+
+ }
+ }
+
+ typename Vector1::iterator w_j;
+
+ for (w_j = w.begin (), l = _tmp.begin (); w_j != w.end (); ++w_j, ++l) {
+
+ //NTL::rem (t, *l, NTL::ZZ_p::modulus());
+
+ NTL::conv (*w_j, *l);
+ }
+
+
+ return w;
+ }
+
+ template <class Vector1, class Matrix, class Vector2>
+ Vector1 &MVProductDomain<PIR_ntl_ZZ_p>::mulColDenseSpecialized
+ (const VectorDomain<PIR_ntl_ZZ_p> &VD, Vector1 &w, const Matrix &A, const Vector2 &v,
+ VectorCategories::SparseParallelVectorTag) const
+ {
+
+ linbox_check (A.coldim () == v.size ());
+ linbox_check (A.rowdim () == w.size ());
+
+ typename Matrix::ConstColIterator i = A.colBegin ();
+ typename Vector2::const_iterator j;
+ typename Matrix::Column::first_type::const_iterator k_idx;
+ typename Matrix::Column::second_type::const_iterator k_elt;
+ std::vector<NTL::ZZ>::iterator l;
+
+ std::vector<NTL::ZZ> _tmp(w.size());
+ //NTL::ZZ t;
+
+ for (j = v.begin (); j != v.end (); ++j, ++i) {
+ for (k_idx = i->first.begin (), k_elt = i->second.begin (), l = _tmp.begin ();
+ k_idx != i->first.end ();
+ ++k_idx, ++k_elt, ++l)
+
+ _tmp[*k_idx] += NTL::rep(*k_elt) * NTL::rep(*j);
+
+ }
+
+ typename Vector1::iterator w_j;
+
+ for (w_j = w.begin (), l = _tmp.begin (); w_j != w.end (); ++w_j, ++l) {
+
+ //NTL::rem (t, *l, NTL::ZZ_p::modulus());
+
+ NTL::conv (*w_j, *l);
+ }
+
+ return w;
+ }
+
+
+
+}
+
+#endif //__LINBOX_pir_ntl_zz_p_H
+
+
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/ring/poweroftwomodular.h b/linbox/ring/poweroftwomodular.h
index 08e13a0..fff8828 100644
--- a/linbox/ring/poweroftwomodular.h
+++ b/linbox/ring/poweroftwomodular.h
@@ -34,7 +34,7 @@
#include "linbox/integer.h"
#include "linbox/ring/gcd32.h"
#include "linbox/ring/gcd64.h"
-#include "linbox/randiter/unparametric.h"
+#include "linbox/randiter/zring.h"
// Namespace in which all LinBox code resides
namespace LinBox
@@ -48,7 +48,7 @@ namespace LinBox
* should be a data type that can support integers
* twice the length of the maximal modulus used
*/
- template <class Ints> class PowerOfTwoModular
+ template <class Ints> class PowerOfTwoGivaro::Modular
{
public:
@@ -63,7 +63,7 @@ namespace LinBox
struct RandIter{
typedef Ints Element;
- RandIter ( const PowerOfTwoModular<Ints>& F,
+ RandIter ( const PowerOfTwoGivaro::Modular<Ints>& F,
const integer& size = 0, const integer& seed = 0){
if (_seed == integer(0)) _seed = integer(time(NULL));
srand(static_cast<long>(_seed));
@@ -92,7 +92,7 @@ namespace LinBox
/** Default constructor.
*/
- PowerOfTwoModular (void) {
+ PowerOfTwoGivaro::Modular (void) {
_poweroftwo=sizeof(Ints)<<3;
}
@@ -566,14 +566,14 @@ protected:
/// Private (non-static) element for modulus
Element _poweroftwo;
-}; // class PowerOfTwoModular
+}; // class PowerOfTwoGivaro::Modular
#if 0
/* Specialization of gcd_poweroftwo for Int64
*/
template<>
-PowerOfTwoModular<int64_t>::Element&
-PowerOfTwoModular<int64_t>::gcd_poweroftwo (Element &x,const Element &y) const
+PowerOfTwoGivaro::Modular<int64_t>::Element&
+PowerOfTwoGivaro::Modular<int64_t>::gcd_poweroftwo (Element &x,const Element &y) const
{
return x=GCD2E64(y);
}
@@ -582,7 +582,7 @@ PowerOfTwoModular<int64_t>::gcd_poweroftwo (Element &x,const Element &y) const
} // namespace LinBox
// #include "linbox/field/modular.inl"
-// #include "linbox/randiter/modular.h"
+//
#endif // __LINBOX_poweroftwomodular_H
diff --git a/linbox/ring/ring.doxy b/linbox/ring/ring.doxy
index c3469fd..1027021 100644
--- a/linbox/ring/ring.doxy
+++ b/linbox/ring/ring.doxy
@@ -25,9 +25,34 @@
\brief LinBox rings, ring wrappers, ring construction tools.
- LinBox rings implement the ring concept,
- inheriting from the field concept,
- as it is defined in the ring archetype.
+ LinBox ring classes implement the BasicRing concept,
+ which has the same members as the field concept.
+ The difference is that some functions have different semantics. Specifically,
+ inv and div are partial functions.
+
+ Some ring classes extend BasicRing:
+
+ The PIR concept (principal ideal ring) has, beyond BasicRing,
+ \c gcd(g, a, b), g = (a,b), greatest common divisor of a, b.
+ \c gcd(g, s, a, b), g = (a,b) = sa modulo b. s < b/g.
+ \c gcd(g, s, t, a, b), g = (a,b) = sa + tb, s < b/g, t < a/g.
+ \c gcd(g, s, t, u, v, a, b), (a,b) = g = sa + tb, u = a/g, v = b/g.
+ \c gcdin(g, a), g = (g,a)
+ \c lcm(), \c isUnit(), \c isZeroDivisor().
+
+ The PID concept (principal ideal domain) has the same members as the PIR concept,
+ but it is promised that there are no zero divisors.
+
+ The LocalPIR concept has the members of PIR, but
+ there is a unique prime ideal. Some algorithms exploit this.
+
+ Local2_32 exploits a few additional functions and the type \c Exponent.
+ This concept could be used for other small rings extending tiny fields as well.
+
+ Example of BasicRing: Givaro::Modular<int32_t> when the modulus may be non-prime.
+ Example of PIR: PIRModular
+ Example of PID: PIDInteger.
+ Example of LocalPIR: Local2_32.
*/
diff --git a/linbox/solutions/Makefile.am b/linbox/solutions/Makefile.am
index 5584836..c830f9a 100644
--- a/linbox/solutions/Makefile.am
+++ b/linbox/solutions/Makefile.am
@@ -23,26 +23,33 @@ AM_CXXFLAGS = @DEFAULT_CFLAGS@ -DLinBoxSrcOnly
pkgincludesubdir=$(pkgincludedir)/solutions
pkgincludesub_HEADERS= \
- methods.h \
- minpoly.h \
- rank.h \
- trace.h \
- getentry.h \
+ charpoly.h \
det.h \
- solve.h \
+ getentry.h \
+ getentry.inl \
is-positive-definite.h \
is-positive-semidefinite.h \
- charpoly.h \
- valence.h \
+ methods.h \
+ minpoly.h \
nullspace.h \
- smith-form.h
+ rank.h \
+ rank.inl \
+ smith-form.h \
+ solve.h \
+ trace.h \
+ trace.inl \
+ valence.h \
+ solution-tags.h
+
+# rankin.h
+# wiedemann-rank.h
EXTRA_DIST = \
- solutions.doxy \
- systemsolving.doxy \
- rank.doxy \
+ charpoly.doxy \
determinant.doxy \
minpoly.doxy \
- charpoly.doxy \
+ nullspace.doxy \
+ rank.doxy \
reducedforms.doxy \
- nullspace.doxy
+ solutions.doxy \
+ systemsolving.doxy
diff --git a/linbox/solutions/Makefile.in b/linbox/solutions/Makefile.in
deleted file mode 100644
index bf721e0..0000000
--- a/linbox/solutions/Makefile.in
+++ /dev/null
@@ -1,599 +0,0 @@
-# Makefile.in generated by automake 1.11.5 from Makefile.am.
-# @configure_input@
-
-# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software
-# Foundation, Inc.
-# This Makefile.in is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
-# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
-# PARTICULAR PURPOSE.
-
- at SET_MAKE@
-
-# Copyright (c) 2010 the LinBox group
-# This file is part of LinBox
-# ========LICENCE========
-# This file is part of the library LinBox.
-#
-# LinBox is free software: you can redistribute it and/or modify
-# it under the terms of the GNU Lesser General Public
-# License as published by the Free Software Foundation; either
-# version 2.1 of the License, or (at your option) any later version.
-#
-# This library 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
-# Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public
-# License along with this library; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
-# ========LICENCE========
-#/
-
-VPATH = @srcdir@
-am__make_dryrun = \
- { \
- am__dry=no; \
- case $$MAKEFLAGS in \
- *\\[\ \ ]*) \
- echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \
- | grep '^AM OK$$' >/dev/null || am__dry=yes;; \
- *) \
- for am__flg in $$MAKEFLAGS; do \
- case $$am__flg in \
- *=*|--*) ;; \
- *n*) am__dry=yes; break;; \
- esac; \
- done;; \
- esac; \
- test $$am__dry = yes; \
- }
-pkgdatadir = $(datadir)/@PACKAGE@
-pkgincludedir = $(includedir)/@PACKAGE@
-pkglibdir = $(libdir)/@PACKAGE@
-pkglibexecdir = $(libexecdir)/@PACKAGE@
-am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
-install_sh_DATA = $(install_sh) -c -m 644
-install_sh_PROGRAM = $(install_sh) -c
-install_sh_SCRIPT = $(install_sh) -c
-INSTALL_HEADER = $(INSTALL_DATA)
-transform = $(program_transform_name)
-NORMAL_INSTALL = :
-PRE_INSTALL = :
-POST_INSTALL = :
-NORMAL_UNINSTALL = :
-PRE_UNINSTALL = :
-POST_UNINSTALL = :
-build_triplet = @build@
-host_triplet = @host@
-subdir = linbox/solutions
-DIST_COMMON = $(pkgincludesub_HEADERS) $(srcdir)/Makefile.am \
- $(srcdir)/Makefile.in
-ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-am__aclocal_m4_deps = $(top_srcdir)/macros/aclocal-include.m4 \
- $(top_srcdir)/macros/config-header.m4 \
- $(top_srcdir)/macros/debug.m4 \
- $(top_srcdir)/macros/expat-check.m4 \
- $(top_srcdir)/macros/fflas-ffpack-check.m4 \
- $(top_srcdir)/macros/fplll-check.m4 \
- $(top_srcdir)/macros/givaro-check.m4 \
- $(top_srcdir)/macros/gmp-check.m4 \
- $(top_srcdir)/macros/iml-check.m4 \
- $(top_srcdir)/macros/lapack-check.m4 \
- $(top_srcdir)/macros/libtool.m4 \
- $(top_srcdir)/macros/lidia-check.m4 \
- $(top_srcdir)/macros/linbox-benchmark.m4 \
- $(top_srcdir)/macros/linbox-doc.m4 \
- $(top_srcdir)/macros/linbox-misc.m4 \
- $(top_srcdir)/macros/linbox-opt.m4 \
- $(top_srcdir)/macros/ltoptions.m4 \
- $(top_srcdir)/macros/ltsugar.m4 \
- $(top_srcdir)/macros/ltversion.m4 \
- $(top_srcdir)/macros/lt~obsolete.m4 \
- $(top_srcdir)/macros/m4ri-check.m4 \
- $(top_srcdir)/macros/m4rie-check.m4 \
- $(top_srcdir)/macros/maple-check.m4 \
- $(top_srcdir)/macros/mpfr-check.m4 \
- $(top_srcdir)/macros/ntl-check.m4 \
- $(top_srcdir)/macros/saclib-check.m4 \
- $(top_srcdir)/macros/sage-check.m4 $(top_srcdir)/configure.ac
-am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
- $(ACLOCAL_M4)
-mkinstalldirs = $(install_sh) -d
-CONFIG_HEADER = $(top_builddir)/config.h
-CONFIG_CLEAN_FILES =
-CONFIG_CLEAN_VPATH_FILES =
-depcomp =
-am__depfiles_maybe =
-SOURCES =
-DIST_SOURCES =
-am__can_run_installinfo = \
- case $$AM_UPDATE_INFO_DIR in \
- n|no|NO) false;; \
- *) (install-info --version) >/dev/null 2>&1;; \
- esac
-am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
-am__vpath_adj = case $$p in \
- $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
- *) f=$$p;; \
- esac;
-am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
-am__install_max = 40
-am__nobase_strip_setup = \
- srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
-am__nobase_strip = \
- for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
-am__nobase_list = $(am__nobase_strip_setup); \
- for p in $$list; do echo "$$p $$p"; done | \
- sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
- $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
- if (++n[$$2] == $(am__install_max)) \
- { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
- END { for (dir in files) print dir, files[dir] }'
-am__base_list = \
- sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
- sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
-am__uninstall_files_from_dir = { \
- test -z "$$files" \
- || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \
- || { echo " ( cd '$$dir' && rm -f" $$files ")"; \
- $(am__cd) "$$dir" && rm -f $$files; }; \
- }
-am__installdirs = "$(DESTDIR)$(pkgincludesubdir)"
-HEADERS = $(pkgincludesub_HEADERS)
-ETAGS = etags
-CTAGS = ctags
-DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
-ACLOCAL = @ACLOCAL@
-AMTAR = @AMTAR@
-AR = @AR@
-AUTOCONF = @AUTOCONF@
-AUTOHEADER = @AUTOHEADER@
-AUTOMAKE = @AUTOMAKE@
-AWK = @AWK@
-BLAS_CFLAGS = @BLAS_CFLAGS@
-BLAS_LIBS = @BLAS_LIBS@
-CC = @CC@
-CCNAM = @CCNAM@
-CFLAGS = @CFLAGS@
-CPPFLAGS = @CPPFLAGS@
-CXX = @CXX@
-CXXCPP = @CXXCPP@
-CXXFLAGS = @CXXFLAGS@
-CYGPATH_W = @CYGPATH_W@
-DBG = @DBG@
-DEBUG_CFLAGS = @DEBUG_CFLAGS@
-DEFAULT_CFLAGS = @DEFAULT_CFLAGS@
-DEFS = @DEFS@
-DLLTOOL = @DLLTOOL@
-DSYMUTIL = @DSYMUTIL@
-DUMPBIN = @DUMPBIN@
-ECHO_C = @ECHO_C@
-ECHO_N = @ECHO_N@
-ECHO_T = @ECHO_T@
-EGREP = @EGREP@
-EXEEXT = @EXEEXT@
-EXPAT_CFLAGS = @EXPAT_CFLAGS@
-EXPAT_LIBS = @EXPAT_LIBS@
-FFLAS_FFPACK_CFLAGS = @FFLAS_FFPACK_CFLAGS@
-FFLAS_FFPACK_LIBS = @FFLAS_FFPACK_LIBS@
-FFLAS_FFPACK_LOC = @FFLAS_FFPACK_LOC@
-FGREP = @FGREP@
-FPLLL_CFLAGS = @FPLLL_CFLAGS@
-FPLLL_LIBS = @FPLLL_LIBS@
-GIVARO_CFLAGS = @GIVARO_CFLAGS@
-GIVARO_LIBS = @GIVARO_LIBS@
-GMP_CFLAGS = @GMP_CFLAGS@
-GMP_LIBS = @GMP_LIBS@
-GMP_VERSION = @GMP_VERSION@
-GREP = @GREP@
-IML_CFLAGS = @IML_CFLAGS@
-IML_LIBS = @IML_LIBS@
-INSTALL = @INSTALL@
-INSTALL_DATA = @INSTALL_DATA@
-INSTALL_PROGRAM = @INSTALL_PROGRAM@
-INSTALL_SCRIPT = @INSTALL_SCRIPT@
-INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
-LD = @LD@
-LDFLAGS = @LDFLAGS@
-LIBOBJS = @LIBOBJS@
-LIBS = @LIBS@
-LIBTOOL = @LIBTOOL@
-LIDIA_CFLAGS = @LIDIA_CFLAGS@
-LIDIA_LIBS = @LIDIA_LIBS@
-LINBOX_BENCH_PATH = @LINBOX_BENCH_PATH@
-LINBOX_DOC_PATH = @LINBOX_DOC_PATH@
-LIPO = @LIPO@
-LN_S = @LN_S@
-LTLIBOBJS = @LTLIBOBJS@
-M4RIE_CFLAGS = @M4RIE_CFLAGS@
-M4RIE_LIBS = @M4RIE_LIBS@
-M4RI_CFLAGS = @M4RI_CFLAGS@
-M4RI_LIBS = @M4RI_LIBS@
-MAINT = @MAINT@
-MAKEINFO = @MAKEINFO@
-MANIFEST_TOOL = @MANIFEST_TOOL@
-MAPLE_CFLAGS = @MAPLE_CFLAGS@
-MAPLE_HOME = @MAPLE_HOME@
-MAPLE_LIBS = @MAPLE_LIBS@
-MAPLE_VERSION = @MAPLE_VERSION@
-MKDIR_P = @MKDIR_P@
-MPFR_CFLAGS = @MPFR_CFLAGS@
-MPFR_LIBS = @MPFR_LIBS@
-NM = @NM@
-NMEDIT = @NMEDIT@
-NTL_CFLAGS = @NTL_CFLAGS@
-NTL_LIBS = @NTL_LIBS@
-OBJDUMP = @OBJDUMP@
-OBJEXT = @OBJEXT@
-OTOOL = @OTOOL@
-OTOOL64 = @OTOOL64@
-PACKAGE = @PACKAGE@
-PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
-PACKAGE_NAME = @PACKAGE_NAME@
-PACKAGE_STRING = @PACKAGE_STRING@
-PACKAGE_TARNAME = @PACKAGE_TARNAME@
-PACKAGE_URL = @PACKAGE_URL@
-PACKAGE_VERSION = @PACKAGE_VERSION@
-PATH_SEPARATOR = @PATH_SEPARATOR@
-PROF = @PROF@
-RANLIB = @RANLIB@
-RM = @RM@
-SACLIB_CFLAGS = @SACLIB_CFLAGS@
-SACLIB_LIBS = @SACLIB_LIBS@
-SED = @SED@
-SET_MAKE = @SET_MAKE@
-SHELL = @SHELL@
-STRIP = @STRIP@
-TESTS_CFLAGS = @TESTS_CFLAGS@
-VERSION = @VERSION@
-WARN = @WARN@
-abs_builddir = @abs_builddir@
-abs_srcdir = @abs_srcdir@
-abs_top_builddir = @abs_top_builddir@
-abs_top_srcdir = @abs_top_srcdir@
-ac_ct_AR = @ac_ct_AR@
-ac_ct_CC = @ac_ct_CC@
-ac_ct_CXX = @ac_ct_CXX@
-ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
-am__leading_dot = @am__leading_dot@
-am__tar = @am__tar@
-am__untar = @am__untar@
-bindir = @bindir@
-build = @build@
-build_alias = @build_alias@
-build_cpu = @build_cpu@
-build_os = @build_os@
-build_vendor = @build_vendor@
-builddir = @builddir@
-datadir = @datadir@
-datarootdir = @datarootdir@
-docdir = @docdir@
-dvidir = @dvidir@
-exec_prefix = @exec_prefix@
-host = @host@
-host_alias = @host_alias@
-host_cpu = @host_cpu@
-host_os = @host_os@
-host_vendor = @host_vendor@
-htmldir = @htmldir@
-includedir = @includedir@
-infodir = @infodir@
-install_sh = @install_sh@
-libdir = @libdir@
-libexecdir = @libexecdir@
-localedir = @localedir@
-localstatedir = @localstatedir@
-mandir = @mandir@
-mkdir_p = @mkdir_p@
-oldincludedir = @oldincludedir@
-pdfdir = @pdfdir@
-prefix = @prefix@
-program_transform_name = @program_transform_name@
-psdir = @psdir@
-sbindir = @sbindir@
-sharedstatedir = @sharedstatedir@
-srcdir = @srcdir@
-sysconfdir = @sysconfdir@
-target_alias = @target_alias@
-top_build_prefix = @top_build_prefix@
-top_builddir = @top_builddir@
-top_srcdir = @top_srcdir@
-AM_CXXFLAGS = @DEFAULT_CFLAGS@ -DLinBoxSrcOnly
-pkgincludesubdir = $(pkgincludedir)/solutions
-pkgincludesub_HEADERS = \
- methods.h \
- minpoly.h \
- rank.h \
- trace.h \
- getentry.h \
- det.h \
- solve.h \
- is-positive-definite.h \
- is-positive-semidefinite.h \
- charpoly.h \
- valence.h \
- nullspace.h \
- smith-form.h
-
-EXTRA_DIST = \
- solutions.doxy \
- systemsolving.doxy \
- rank.doxy \
- determinant.doxy \
- minpoly.doxy \
- charpoly.doxy \
- reducedforms.doxy \
- nullspace.doxy
-
-all: all-am
-
-.SUFFIXES:
-$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps)
- @for dep in $?; do \
- case '$(am__configure_deps)' in \
- *$$dep*) \
- ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
- && { if test -f $@; then exit 0; else break; fi; }; \
- exit 1;; \
- esac; \
- done; \
- echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu --ignore-deps linbox/solutions/Makefile'; \
- $(am__cd) $(top_srcdir) && \
- $(AUTOMAKE) --gnu --ignore-deps linbox/solutions/Makefile
-.PRECIOUS: Makefile
-Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
- @case '$?' in \
- *config.status*) \
- cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
- *) \
- echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
- cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
- esac;
-
-$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
- cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-
-$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
- cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
- cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-$(am__aclocal_m4_deps):
-
-mostlyclean-libtool:
- -rm -f *.lo
-
-clean-libtool:
- -rm -rf .libs _libs
-install-pkgincludesubHEADERS: $(pkgincludesub_HEADERS)
- @$(NORMAL_INSTALL)
- @list='$(pkgincludesub_HEADERS)'; test -n "$(pkgincludesubdir)" || list=; \
- if test -n "$$list"; then \
- echo " $(MKDIR_P) '$(DESTDIR)$(pkgincludesubdir)'"; \
- $(MKDIR_P) "$(DESTDIR)$(pkgincludesubdir)" || exit 1; \
- fi; \
- for p in $$list; do \
- if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
- echo "$$d$$p"; \
- done | $(am__base_list) | \
- while read files; do \
- echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(pkgincludesubdir)'"; \
- $(INSTALL_HEADER) $$files "$(DESTDIR)$(pkgincludesubdir)" || exit $$?; \
- done
-
-uninstall-pkgincludesubHEADERS:
- @$(NORMAL_UNINSTALL)
- @list='$(pkgincludesub_HEADERS)'; test -n "$(pkgincludesubdir)" || list=; \
- files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
- dir='$(DESTDIR)$(pkgincludesubdir)'; $(am__uninstall_files_from_dir)
-
-ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
- list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
- unique=`for i in $$list; do \
- if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
- done | \
- $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
- END { if (nonempty) { for (i in files) print i; }; }'`; \
- mkid -fID $$unique
-tags: TAGS
-
-TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
- $(TAGS_FILES) $(LISP)
- set x; \
- here=`pwd`; \
- list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
- unique=`for i in $$list; do \
- if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
- done | \
- $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
- END { if (nonempty) { for (i in files) print i; }; }'`; \
- shift; \
- if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
- test -n "$$unique" || unique=$$empty_fix; \
- if test $$# -gt 0; then \
- $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
- "$$@" $$unique; \
- else \
- $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
- $$unique; \
- fi; \
- fi
-ctags: CTAGS
-CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
- $(TAGS_FILES) $(LISP)
- list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
- unique=`for i in $$list; do \
- if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
- done | \
- $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
- END { if (nonempty) { for (i in files) print i; }; }'`; \
- test -z "$(CTAGS_ARGS)$$unique" \
- || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
- $$unique
-
-GTAGS:
- here=`$(am__cd) $(top_builddir) && pwd` \
- && $(am__cd) $(top_srcdir) \
- && gtags -i $(GTAGS_ARGS) "$$here"
-
-distclean-tags:
- -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
-
-distdir: $(DISTFILES)
- @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
- topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
- list='$(DISTFILES)'; \
- dist_files=`for file in $$list; do echo $$file; done | \
- sed -e "s|^$$srcdirstrip/||;t" \
- -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
- case $$dist_files in \
- */*) $(MKDIR_P) `echo "$$dist_files" | \
- sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
- sort -u` ;; \
- esac; \
- for file in $$dist_files; do \
- if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
- if test -d $$d/$$file; then \
- dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
- if test -d "$(distdir)/$$file"; then \
- find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
- fi; \
- if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
- cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
- find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
- fi; \
- cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
- else \
- test -f "$(distdir)/$$file" \
- || cp -p $$d/$$file "$(distdir)/$$file" \
- || exit 1; \
- fi; \
- done
-check-am: all-am
-check: check-am
-all-am: Makefile $(HEADERS)
-installdirs:
- for dir in "$(DESTDIR)$(pkgincludesubdir)"; do \
- test -z "$$dir" || $(MKDIR_P) "$$dir"; \
- done
-install: install-am
-install-exec: install-exec-am
-install-data: install-data-am
-uninstall: uninstall-am
-
-install-am: all-am
- @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
-
-installcheck: installcheck-am
-install-strip:
- if test -z '$(STRIP)'; then \
- $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
- install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
- install; \
- else \
- $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
- install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
- "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
- fi
-mostlyclean-generic:
-
-clean-generic:
-
-distclean-generic:
- -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
- -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
-
-maintainer-clean-generic:
- @echo "This command is intended for maintainers to use"
- @echo "it deletes files that may require special tools to rebuild."
-clean: clean-am
-
-clean-am: clean-generic clean-libtool mostlyclean-am
-
-distclean: distclean-am
- -rm -f Makefile
-distclean-am: clean-am distclean-generic distclean-tags
-
-dvi: dvi-am
-
-dvi-am:
-
-html: html-am
-
-html-am:
-
-info: info-am
-
-info-am:
-
-install-data-am: install-pkgincludesubHEADERS
-
-install-dvi: install-dvi-am
-
-install-dvi-am:
-
-install-exec-am:
-
-install-html: install-html-am
-
-install-html-am:
-
-install-info: install-info-am
-
-install-info-am:
-
-install-man:
-
-install-pdf: install-pdf-am
-
-install-pdf-am:
-
-install-ps: install-ps-am
-
-install-ps-am:
-
-installcheck-am:
-
-maintainer-clean: maintainer-clean-am
- -rm -f Makefile
-maintainer-clean-am: distclean-am maintainer-clean-generic
-
-mostlyclean: mostlyclean-am
-
-mostlyclean-am: mostlyclean-generic mostlyclean-libtool
-
-pdf: pdf-am
-
-pdf-am:
-
-ps: ps-am
-
-ps-am:
-
-uninstall-am: uninstall-pkgincludesubHEADERS
-
-.MAKE: install-am install-strip
-
-.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \
- clean-libtool ctags distclean distclean-generic \
- distclean-libtool distclean-tags distdir dvi dvi-am html \
- html-am info info-am install install-am install-data \
- install-data-am install-dvi install-dvi-am install-exec \
- install-exec-am install-html install-html-am install-info \
- install-info-am install-man install-pdf install-pdf-am \
- install-pkgincludesubHEADERS install-ps install-ps-am \
- install-strip installcheck installcheck-am installdirs \
- maintainer-clean maintainer-clean-generic mostlyclean \
- mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
- tags uninstall uninstall-am uninstall-pkgincludesubHEADERS
-
-
-# Tell versions [3.59,3.63) of GNU make to not export all variables.
-# Otherwise a system limit (for SysV at least) may be exceeded.
-.NOEXPORT:
diff --git a/linbox/solutions/charpoly.h b/linbox/solutions/charpoly.h
index 104e191..38a4143 100644
--- a/linbox/solutions/charpoly.h
+++ b/linbox/solutions/charpoly.h
@@ -25,18 +25,13 @@
#ifndef __LINBOX_charpoly_H
#define __LINBOX_charpoly_H
-
-
#include "linbox/solutions/methods.h"
#include "linbox/util/debug.h"
#include "linbox/field/field-traits.h"
-#include "linbox/matrix/blas-matrix.h"
-#include "linbox/algorithms/blas-domain.h"
-
-#ifdef __LINBOX_HAVE_GIVARO
-// BBcharpoly without givaropolynomials is not yet implemented
+#include "linbox/matrix/dense-matrix.h"
+#include "linbox/matrix/matrix-domain.h"
+#include "linbox/randiter/random-prime.h"
#include "linbox/algorithms/bbcharpoly.h"
-#endif
// Namespace in which all LinBox library code resides
namespace LinBox
@@ -90,8 +85,9 @@ namespace LinBox
}
// The charpoly with Hybrid Method
+ //! @bug not Hybrid at all
template<class Polynomial, class Blackbox>
- Polynomial &charpoly (Polynomial &P,
+ Polynomial &charpoly (Polynomial &P,
const Blackbox & A,
const RingCategories::ModularTag & tag,
const Method::Hybrid & M)
@@ -102,19 +98,23 @@ namespace LinBox
}
// The charpoly with Hybrid Method
+ //! @bug not Hybrid at all
template<class Polynomial, class Domain>
- Polynomial &charpoly (Polynomial &P,
+ Polynomial &charpoly (Polynomial &P,
const SparseMatrix<Domain> & A,
const RingCategories::ModularTag & tag,
const Method::Hybrid & M)
{
// not yet a hybrid
- return charpoly(P, A, tag, Method::Blackbox(M));
+ // bb method broken, default to dense method
+ return charpoly(P, A, tag, Method::BlasElimination(M));
+// return charpoly(P, A, tag, Method::Blackbox(M));
}
// The charpoly with Hybrid Method
+ //! @bug not Hybrid at all
template<class Polynomial, class Domain>
- Polynomial &charpoly (Polynomial &P,
+ Polynomial &charpoly (Polynomial &P,
const BlasMatrix<Domain> & A,
const RingCategories::ModularTag & tag,
const Method::Hybrid & M)
@@ -145,19 +145,40 @@ namespace LinBox
* @param M
*/
template < class Polynomial, class Blackbox >
+ BlasVector<typename Blackbox::Field,Polynomial >&
+ charpoly (BlasVector<typename Blackbox::Field,Polynomial > & P,
+ const Blackbox & A,
+ const RingCategories::ModularTag & tag,
+ const Method::BlasElimination & M)
+ {
+ if (A.coldim() != A.rowdim())
+ throw LinboxError("LinBox ERROR: matrix must be square for characteristic polynomial computation\n");
+
+ BlasMatrix< typename Blackbox::Field > BBB (A);
+ BlasMatrixDomain< typename Blackbox::Field > BMD (BBB.field());
+ BMD.charpoly (P, static_cast<BlasMatrix<typename Blackbox::Field> >(BBB));
+ return P ;
+ }
+ template < class Polynomial, class Blackbox >
Polynomial& charpoly (Polynomial & P,
const Blackbox & A,
const RingCategories::ModularTag & tag,
const Method::BlasElimination & M)
{
+
if (A.coldim() != A.rowdim())
throw LinboxError("LinBox ERROR: matrix must be square for characteristic polynomial computation\n");
BlasMatrix< typename Blackbox::Field > BBB (A);
BlasMatrixDomain< typename Blackbox::Field > BMD (BBB.field());
- return BMD.charpoly (P, static_cast<BlasMatrix<typename Blackbox::Field> >(BBB));
+ BlasVector<typename Blackbox::Field,Polynomial> P2(A.field(),P);
+ BMD.charpoly (P2, static_cast<BlasMatrix<typename Blackbox::Field> >(BBB));
+ return P = P2.getRep() ;
+
+
}
+
}
#include "linbox/algorithms/matrix-hom.h"
@@ -182,7 +203,9 @@ namespace LinBox
{
typedef typename Blackbox::template rebind<Field>::other FBlackbox;
FBlackbox Ap(A, F);
- return charpoly( P, Ap, typename FieldTraits<Field>::categoryTag(), M);
+
+ return charpoly( P, Ap, typename FieldTraits<Field>::categoryTag(), M);
+ // std::cerr << "Charpoly(A) mod "<<F.characteristic()<<" = "<<P;
// integer p;
// F.characteristic(p);
// std::cerr<<"Charpoly(A) mod "<<p<<" = "<<P;
@@ -196,18 +219,20 @@ namespace LinBox
const Method::Hybrid & M)
{
commentator().start ("Integer Charpoly", "Icharpoly");
- if ( (A.rowdim() < 1000) && (A.coldim() <1000) )
+ // bb method broken, default to dense method
+ if (1/* (A.rowdim() < 1000) && (A.coldim() <1000) */)
charpoly(P, A, tag, Method::BlasElimination(M) );
- else
+ else
charpoly(P, A, tag, Method::Blackbox(M) );
commentator().stop ("done", NULL, "Icharpoly");
return P;
}
- //#if 0
-#if defined(__LINBOX_HAVE_NTL) && defined(__LINBOX_HAVE_GIVARO)
}
+#if 0 // CIA is buggy (try with matrix(ZZ,4,[1..16]) )
+//#if defined(__LINBOX_HAVE_NTL)
+
#include "linbox/algorithms/cia.h"
namespace LinBox
{
@@ -221,7 +246,9 @@ namespace LinBox
const Method::Hybrid &M)
{
// not yet a hybrid
- return charpoly(P, A, tag, Method::Blackbox(M));
+ // bb method broken, default to dense method
+ return charpoly(P, A, tag, Method::BlasElimination(M));
+// return charpoly(P, A, tag, Method::Blackbox(M));
}
#endif
@@ -270,7 +297,7 @@ namespace LinBox
{
if (A.coldim() != A.rowdim())
throw LinboxError("LinBox ERROR: matrix must be square for characteristic polynomial computation\n");
- typename GivPolynomialRing<typename Blackbox::Field>::Element Pg;
+ typename Givaro::Poly1Dom<typename Blackbox::Field, Givaro::Dense>::Element Pg;
return P = cia (Pg, A, M);
}
@@ -290,19 +317,21 @@ namespace LinBox
{
if (A.coldim() != A.rowdim())
throw LinboxError("LinBox ERROR: matrix must be square for characteristic polynomial computation\n");
- typename GivPolynomialRing<typename Blackbox::Field>::Element Pg;
- return P = BBcharpoly::blackboxcharpoly (Pg, A, tag, M);
+// typename Givaro::Poly1Dom<typename Blackbox::Field>::Element Pg;
+// return P = BBcharpoly::blackboxcharpoly (Pg, A, tag, M);
+ // BB method broken: default to dense method
+ return charpoly(P, A, tag, Method::BlasElimination(M) );
+ //return BBcharpoly::blackboxcharpoly (P, A, tag, M);
}
-
-#else // no NTL or no Givaro (??)
}
-#include "linbox/field/modular.h"
+#else // no NTL
+
+#include "linbox/ring/modular.h"
#include "linbox/algorithms/cra-domain.h"
#include "linbox/algorithms/cra-full-multip.h"
#include "linbox/algorithms/cra-early-multip.h"
-#include "linbox/randiter/random-prime.h"
#include "linbox/algorithms/matrix-hom.h"
namespace LinBox
@@ -369,9 +398,9 @@ namespace LinBox
size_t n=A.coldim();
double hadamarcp = n/2.0*(log(double(n))+2*log(double(max))+0.21163275)/log(2.0);
- ChineseRemainder< FullMultipCRA<Modular<double> > > cra(hadamarcp);
+ ChineseRemainder< FullMultipCRA<Givaro::Modular<double> > > cra(hadamarcp);
#endif
- ChineseRemainder< EarlyMultipCRA<Modular<double> > > cra(3UL);
+ ChineseRemainder< EarlyMultipCRA<Givaro::Modular<double> > > cra(3UL);
IntegerModularCharpoly<Blackbox,Method::Blackbox> iteration(A, M);
cra.operator() (P, iteration, genprime);
@@ -410,18 +439,21 @@ namespace LinBox
double hadamarcp = n/2.0*(log(double(n))+2*log(double(max))+0.21163275)/log(2.0);
- ChineseRemainder< FullMultipCRA<Modular<double> > > cra(hadamarcp);
+ ChineseRemainder< FullMultipCRA<Givaro::Modular<double> > > cra(hadamarcp);
#endif
- ChineseRemainder< EarlyMultipCRA<Modular<double> > > cra(3UL);
+ ChineseRemainder< EarlyMultipCRA<Givaro::Modular<double> > > cra(3UL);
IntegerModularCharpoly<Blackbox,Method::BlasElimination> iteration(A, M);
cra(P, iteration, genprime);
commentator().stop ("done", NULL, "IbbCharpoly");
return P;
}
+}
#endif
+namespace LinBox
+{
/** Compute the characteristic polynomial over \f$\mathbf{Z}_p\f$.
*
* Compute the characteristic polynomial of a matrix, represented via
@@ -441,12 +473,9 @@ namespace LinBox
if (A.coldim() != A.rowdim())
throw LinboxError("LinBox ERROR: matrix must be square for characteristic polynomial computation\n");
-#ifdef __LINBOX_HAVE_GIVARO
- typename GivPolynomialRing<typename Blackbox::Field>::Element Pg;
- return P = BBcharpoly::blackboxcharpoly (Pg, A, tag, M);
-#else
- return charpoly(P, A, tag, Method::BlasElimination());
-#endif
+// typename Givaro::Poly1Dom<typename Blackbox::Field>::Element Pg;
+// return P = BBcharpoly::blackboxcharpoly (Pg, A, tag, M);
+ return BBcharpoly::blackboxcharpoly (P, A, tag, M);
}
template < class Blackbox, class Polynomial, class MyMethod>
@@ -455,11 +484,12 @@ namespace LinBox
{
commentator().start ("Rational Charpoly", "Rcharpoly");
- RandomPrimeIterator genprime( 26-(int)ceil(log((double)A.rowdim())*0.7213475205));
- RationalRemainder2< VarPrecEarlyMultipCRA<Modular<double> > > rra(3UL);
+ RandomPrimeIterator genprime( 26-(unsigned int)ceil(log((double)A.rowdim())*0.7213475205));
+ RationalRemainder2< VarPrecEarlyMultipCRA<Givaro::Modular<double> > > rra(3UL);
IntegerModularCharpoly<Blackbox,MyMethod> iteration(A, M);
- std::vector<Integer> PP; // use of integer due to non genericity of cra. PG 2005-08-04
+ Givaro::ZRing<Integer> Z;
+ BlasVector<Givaro::ZRing<Integer> > PP(Z); // use of integer due to non genericity of cra. PG 2005-08-04
Integer den;
rra(PP,den, iteration, genprime);
size_t i =0;
@@ -476,11 +506,10 @@ namespace LinBox
#endif // __LINBOX_charpoly_H
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
// Local Variables:
// mode: C++
// tab-width: 8
// indent-tabs-mode: nil
// c-basic-offset: 8
// End:
-
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/solutions/det.h b/linbox/solutions/det.h
index 24bea55..1b19a39 100644
--- a/linbox/solutions/det.h
+++ b/linbox/solutions/det.h
@@ -34,12 +34,13 @@
#include "linbox/blackbox/compose.h"
#include "linbox/solutions/methods.h"
#include "linbox/solutions/getentry.h"
+#include "linbox/vector/blas-vector.h"
-#include "linbox/matrix/blas-matrix.h"
+#include "linbox/matrix/dense-matrix.h"
#include "linbox/algorithms/blackbox-container.h"
#include "linbox/algorithms/blackbox-container-symmetric.h"
#include "linbox/algorithms/massey-domain.h"
-#include "linbox/algorithms/blas-domain.h"
+#include "linbox/matrix/matrix-domain.h"
#include "linbox/algorithms/gauss.h"
#include "linbox/vector/vector-traits.h"
#include "linbox/util/prime-stream.h"
@@ -207,13 +208,13 @@ namespace LinBox
throw LinboxError("LinBox ERROR: matrix must be square for determinant computation\n");
typedef typename Blackbox::Field Field;
- typedef std::vector<typename Field::Element> Polynomial;
Field F = A.field();
+ typedef BlasVector<Field> Polynomial;
if(Meth.symmetric()) {
commentator().start ("Symmetric Wiedemann Determinant", "sdet");
linbox_check (A.coldim () == A.rowdim ());
- Polynomial phi;
+ Polynomial phi(F);
unsigned long deg;
typename Field::RandIter iter (F);
@@ -222,19 +223,19 @@ namespace LinBox
// Here there is an extra diagonal computation
// The probability of success is also divided by two, as
// diag^2 contains only squares and squares are half the total elements
- std::vector<typename Field::Element> diag (A.coldim ());
+ BlasVector<Field> diag (A.field(),A.coldim ());
typename Field::Element pi;
size_t i;
size_t iternum = 1;
do {
- F.init (pi, 1);
+ F.assign(pi, F.one);
for (i = 0; i < A.coldim (); i++) {
do iter.random (diag[i]); while (F.isZero (diag[i]));
F.mulin (pi, diag[i]);
}
- Diagonal<Field> D (F, diag);
+ Diagonal<Field> D (diag);
Compose<Blackbox,Diagonal<Field> > B0 (&A, &D);
typedef Compose<Diagonal<Field>,Compose<Blackbox,Diagonal<Field> > > Blackbox1;
Blackbox1 B(&D, &B0);
@@ -244,14 +245,16 @@ namespace LinBox
MasseyDomain<Field, BlackboxContainerSymmetric<Field, Blackbox1> > WD (&TF, Meth.earlyTermThreshold ());
WD.minpoly (phi, deg);
- // std::cout << "\tdet: iteration # " << iternum << "\tMinpoly deg= "
- // << phi.size() << "\n" ;
- // std::cout << "[" ;
- // for(typename Polynomial::const_iterator refs = phi.begin();
- // refs != phi.end() ;
- // ++refs )
- // std::cout << (*refs) << " " ;
- // std::cout << "]" << std::endl;
+#if 0
+ std::cout << "\tdet: iteration # " << iternum << "\tMinpoly deg= "
+ << phi.size() << "\n" ;
+ std::cout << "[" ;
+ for(typename Polynomial::const_iterator refs = phi.begin();
+ refs != phi.end() ;
+ ++refs )
+ std::cout << (*refs) << " " ;
+ std::cout << "]" << std::endl;
+#endif
++iternum;
} while ( (phi.size () < A.coldim () + 1) && ( !F.isZero (phi[0]) ) );
@@ -272,25 +275,25 @@ namespace LinBox
commentator().start ("Wiedemann Determinant", "wdet");
linbox_check (A.coldim () == A.rowdim ());
- Polynomial phi;
+ Polynomial phi(F);
unsigned long deg;
typename Field::RandIter iter (F);
// Precondition here to separate the eigenvalues, so that
// minpoly (B) = charpoly (B) with high probability
- std::vector<typename Field::Element> diag (A.coldim ());
+ BlasVector<Field> diag (F,A.coldim ());
typename Field::Element pi;
size_t i;
size_t iternum = 1;
do {
- F.init (pi, 1);
+ F.assign(pi, F.one);
for (i = 0; i < A.coldim (); i++) {
do iter.random (diag[i]); while (F.isZero (diag[i]));
F.mulin (pi, diag[i]);
}
- Diagonal<Field> D (F, diag);
+ Diagonal<Field> D (diag);
Compose<Blackbox,Diagonal<Field> > B (&A, &D);
@@ -356,7 +359,7 @@ namespace LinBox
typedef typename Blackbox::Field Field;
commentator().start ("Sparse Elimination Determinant", "SEDet");
// We make a copy as these data will be destroyed
- SparseMatrix<Field, typename LinBox::Vector<Field>::SparseSeq> A1 (A.field(), A.rowdim(), A.coldim());
+ SparseMatrix<Field, SparseMatrixFormat::SparseSeq> A1 (A.field(), A.rowdim(), A.coldim());
typename Blackbox::Field::Element tmp;
for(size_t i = 0; i < A.rowdim() ; ++i)
for(size_t j = 0; j < A.coldim(); ++j)
@@ -379,7 +382,7 @@ namespace LinBox
throw LinboxError("LinBox ERROR: matrix must be square for determinant computation\n");
commentator().start ("Sparse Elimination Determinant", "SEDet");
// We make a copy as these data will be destroyed
- SparseMatrix<Field, typename LinBox::Vector<Field>::SparseSeq> A1 (A);
+ SparseMatrix<Field, SparseMatrixFormat::SparseSeq> A1 (A);
GaussDomain<Field> GD ( A.field() );
GD.detin (d, A1, Meth.strategy ());
commentator().stop ("done", NULL, "SEdet");
@@ -388,7 +391,7 @@ namespace LinBox
template <class Field>
typename Field::Element &detin (typename Field::Element &d,
- SparseMatrix<Field, typename LinBox::Vector<Field>::SparseSeq> &A,
+ SparseMatrix<Field, SparseMatrixFormat::SparseSeq> &A,
const RingCategories::ModularTag &tag,
const Method::SparseElimination &Meth)
{
@@ -415,7 +418,7 @@ namespace LinBox
template <class Field>
typename Field::Element &detin (typename Field::Element &d,
- SparseMatrix<Field, typename LinBox::Vector<Field>::SparseSeq> &A,
+ SparseMatrix<Field, SparseMatrixFormat::SparseSeq> &A,
const RingCategories::ModularTag &tag,
const Method::Elimination &Meth)
{
@@ -512,7 +515,7 @@ namespace LinBox
}
} // end of LinBox namespace
-#include "linbox/field/modular.h"
+#include "linbox/ring/modular.h"
//#include "linbox/field/givaro-zpz.h"
#ifdef __LINBOX_HAVE_MPI
@@ -576,14 +579,14 @@ namespace LinBox
// will call regular cra if C=0
#ifdef __LINBOX_HAVE_MPI
- MPIChineseRemainder< EarlySingleCRA< Modular<double> > > cra(4UL, C);
+ MPIChineseRemainder< EarlySingleCRA< Givaro::Modular<double> > > cra(4UL, C);
cra(dd, iteration, genprime);
if(!C || C->rank() == 0){
A.field().init(d, dd); // convert the result from integer to original type
commentator().stop ("done", NULL, "det");
}
#else
- ChineseRemainder< EarlySingleCRA< Modular<double> > > cra(4UL);
+ ChineseRemainder< EarlySingleCRA< Givaro::Modular<double> > > cra(4UL);
cra(dd, iteration, genprime);
A.field().init(d, dd); // convert the result from integer to original type
commentator().stop ("done", NULL, "idet");
@@ -633,8 +636,8 @@ namespace LinBox
Integer num,den;
IntegerModularDet<Blackbox, MyMethod> iteration(A, Meth);
- RandomPrimeIterator genprime( 26-(int)ceil(log((double)A.rowdim())*0.7213475205));
- RationalRemainder2< VarPrecEarlySingleCRA< Modular<double> > > rra(4UL);
+ RandomPrimeIterator genprime( (unsigned int)( 26-(int)ceil(log((double)A.rowdim())*0.7213475205)));
+ RationalRemainder2< VarPrecEarlySingleCRA< Givaro::Modular<double> > > rra(4UL);
rra(num,den, iteration, genprime);
@@ -680,11 +683,10 @@ namespace LinBox
#endif // __LINBOX_det_H
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
// Local Variables:
// mode: C++
// tab-width: 8
// indent-tabs-mode: nil
// c-basic-offset: 8
// End:
-
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/solutions/getentry.h b/linbox/solutions/getentry.h
index e2fd4c2..27c3ac7 100644
--- a/linbox/solutions/getentry.h
+++ b/linbox/solutions/getentry.h
@@ -3,20 +3,20 @@
* Evolved from an earlier one by Bradford Hovinen <hovinen at cis.udel.edu>
* -bds
*
- *
+ *
* ========LICENCE========
* This file is part of the library LinBox.
- *
+ *
* LinBox is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
- *
+ *
* This library 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
* Lesser General Public License for more details.
- *
+ *
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
@@ -27,128 +27,65 @@
#ifndef __LINBOX_getentry_H
#define __LINBOX_getentry_H
-#include <vector>
-
-#include "linbox/util/debug.h"
-#include "linbox/vector/vector-domain.h"
-#include "linbox/matrix/blas-matrix.h"
-#include "linbox/blackbox/sparse.h"
-#include "linbox/blackbox/scalar-matrix.h"
+#include "linbox/matrix/sparse-matrix.h"
#include "linbox/blackbox/compose.h"
#include "linbox/blackbox/diagonal.h"
#include "linbox/solutions/methods.h"
+#include "linbox/solutions/solution-tags.h"
namespace LinBox
{
- /// limited doc so far.
- namespace GetEntryTags
- { struct GenericBB{};
- struct Local{};
- struct SpecialCDB{};
- struct SpecialCBD{};
- struct SpecialCDD{};
- } // namespace GetEntryTags
-
- template<class BB> struct GetEntryCategory { typedef GetEntryTags::GenericBB Tag; };
-
/** \brief
* Getting the i,j entry of the blackbox.
*/
template <class BB>
- typename BB::Field::Element& getEntry(typename BB::Field::Element& x, const BB& A, const size_t i, const size_t j)
- {
- typename GetEntryCategory<BB>::Tag t;
- return getEntry(x, A, i, j, t);
- }
+ typename BB::Field::Element& getEntry(typename BB::Field::Element& x, const BB& A, const size_t i, const size_t j);
- /// To ignore methods
- template <class BB, class Method>
- typename BB::Field::Element& getEntry(typename BB::Field::Element& x, const BB& A, const size_t i, const size_t j, Method & m)
- { return getEntry(x, A, i, j); }
-
- // Generic BBs require use of apply.
- template <class BB>
- typename BB::Field::Element& getEntry(typename BB::Field::Element& x, const BB& A, const size_t i, const size_t j, GetEntryTags::GenericBB t)
- {
- typedef typename BB::Field Field;
- typedef typename Field::Element Elt;
- typedef std::vector<Elt> Vector;
-
- const Field& F = A.field();
- Elt zero; F.init(zero, 0UL);
- Vector v(A.coldim(), zero), w(A.rowdim(), zero);
- for (typename Vector::iterator it = v.begin (); it != v.end (); ++it)
- F.assign (*it, zero);
- F.init(v[j],1UL);
- A.apply (w, v);
- F.assign (x, VectorWrapper::constRef<Field, Vector> (w, i));
- return x;
- }
-
- // BBs that offer a local getEntry.
- template<class A, class B> struct GetEntryCategory<SparseMatrix<A,B> > { typedef GetEntryTags::Local Tag; };
- template<class A, class B, class C> struct GetEntryCategory<SparseMatrixBase<A,B,C> > { typedef GetEntryTags::Local Tag; };
- template<class Field, class Trait> struct GetEntryCategory<Diagonal<Field, Trait> > { typedef GetEntryTags::Local Tag; };
- template<class Field> struct GetEntryCategory<ScalarMatrix<Field> > { typedef GetEntryTags::Local Tag; };
-
- template <class BB>
- typename BB::Field::Element& getEntry(typename BB::Field::Element& x, const BB& A, const size_t i, const size_t j, GetEntryTags::Local t )
- { return A.getEntry(x, i, j); }
+ // Some specializations
// Compose< Diagonal, BB > specialization
template <class Field, class Trait, class BB>
- struct GetEntryCategory<Compose<Diagonal<Field, Trait>,BB> > { typedef GetEntryTags::SpecialCDB Tag; };
-
- template <class Field, class Trait, class BB>
- typename Field::Element& getEntry(typename Field::Element& x, const Compose<Diagonal<Field, Trait>, BB>& A, const size_t i, const size_t j, GetEntryTags::SpecialCDB t)
- {
- typename Field::Element y;
- getEntry(y, *(A.getLeftPtr()), i, i);
- getEntry(x, *(A.getRightPtr()), i, j);
- return A.field().mulin(x, y);
- }
+ typename Field::Element& getEntry(typename Field::Element& x, const Compose<Diagonal<Field, Trait>, BB>& A, const size_t i, const size_t j);
// Compose< BB, Diagonal > specialization
template <class BB, class Field, class Trait>
- struct GetEntryCategory<Compose<BB, Diagonal<Field, Trait> > > { typedef GetEntryTags::SpecialCBD Tag; };
-
- template <class BB, class Field, class Trait>
- typename Field::Element& getEntry(typename Field::Element& x, const Compose<BB, Diagonal<Field, Trait> >& A, const size_t i, const size_t j, GetEntryTags::SpecialCBD t)
- {
- typename Field::Element y;
- getEntry(y, *(A.getLeftPtr()), i, j);
- getEntry(x, *(A.getRightPtr()), j, j);
- return A.field().mulin(x, y);
- }
+ typename Field::Element& getEntry(typename Field::Element& x, const Compose<BB, Diagonal<Field, Trait> >& A, const size_t i, const size_t j);
// Compose< Diagonal, Diagonal > specialization
template <class Field, class T1, class T2>
- struct GetEntryCategory<Compose<Diagonal<Field, T1>,Diagonal<Field, T2> > > { typedef GetEntryTags::SpecialCDD Tag; };
+ typename Field::Element& getEntry(typename Field::Element& x, const Compose<Diagonal<Field,T1>, Diagonal<Field, T2> >& A, const size_t i, const size_t j);
- template <class Field, class T1, class T2>
- typename Field::Element& getEntry(typename Field::Element& x, const Compose<Diagonal<Field,T1>, Diagonal<Field, T2> >& A, const size_t i, const size_t j, GetEntryTags::SpecialCDD t)
- {
- if (i != j)
- return A.field().init(x, 0UL);
- else {
- typename Field::Element y;
- getEntry(y, *(A.getLeftPtr()), i, i);
- getEntry(x, *(A.getRightPtr()), j, j);
- return A.field().mulin(x, y);
- }
- }
+ /// To ignore methods
+ template <class BB, class Method>
+ typename BB::Field::Element& getEntry(typename BB::Field::Element& x, const BB& A, const size_t i, const size_t j, Method & m);
+
+ /** GetEntryCategory is specialized for BB classes that offer a local getEntry
+ This includes SparseMatrix, SparseMatrixBase, Diagonal, ScalarMatrix.
+ It could and should include many more.
+ */
+ template<class BB> struct GetEntryCategory;
+
+/************************** internal forms **********************/
+ // For the general case apply() will be used.
+ template <class BB>
+ typename BB::Field::Element& getEntry(typename BB::Field::Element& x, const BB& A, const size_t i, const size_t j, SolutionTags::Generic t);
-}
+ // Some BBs have a local getEntry method
+ template <class BB>
+ typename BB::Field::Element& getEntry(typename BB::Field::Element& x, const BB& A, const size_t i, const size_t j, SolutionTags::Local t );
+
+} // LinBox
+
+#include "linbox/solutions/getentry.inl"
#endif // __LINBOX_getentry_H
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
// Local Variables:
// mode: C++
// tab-width: 8
// indent-tabs-mode: nil
// c-basic-offset: 8
// End:
-
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/solutions/getentry.inl b/linbox/solutions/getentry.inl
new file mode 100644
index 0000000..5ff5474
--- /dev/null
+++ b/linbox/solutions/getentry.inl
@@ -0,0 +1,127 @@
+/* linbox/solutions/getentry.inl
+ * Copyright(C) LinBox
+ * Evolved from an earlier one by Bradford Hovinen <hovinen at cis.udel.edu>
+ * -bds
+ *
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ * ========LICENCE========
+ *.
+ */
+
+#ifndef __LINBOX_getentry_INL
+#define __LINBOX_getentry_INL
+
+#include <vector>
+
+#include "linbox/util/debug.h"
+#include "linbox/vector/vector-domain.h"
+#include "linbox/matrix/dense-matrix.h"
+#include "linbox/matrix/sparse-matrix.h"
+#include "linbox/matrix/sparse-matrix.h"
+#include "linbox/blackbox/scalar-matrix.h"
+#include "linbox/blackbox/compose.h"
+#include "linbox/blackbox/diagonal.h"
+#include "linbox/solutions/methods.h"
+#include "linbox/solutions/solution-tags.h"
+#include "linbox/vector/blas-vector.h"
+
+namespace LinBox
+{
+
+ template <class BB>
+ typename BB::Field::Element& getEntry(typename BB::Field::Element& x, const BB& A, const size_t i, const size_t j)
+ {
+ typename GetEntryCategory<BB>::Tag t;
+ return getEntry(x, A, i, j, t);
+ }
+
+ // General case category of BBs requires use of apply.
+ template<class BB> struct GetEntryCategory{ typedef SolutionTags::Generic Tag; };
+ // Look for local specializations of this in blackbox/*
+
+ // To ignore methods
+ template <class BB, class Method>
+ typename BB::Field::Element& getEntry(typename BB::Field::Element& x, const BB& A, const size_t i, const size_t j, Method & m)
+ {
+ return getEntry(x, A, i, j);
+ }
+
+ // Generic BBs require use of apply.
+ template <class BB>
+ typename BB::Field::Element& getEntry(typename BB::Field::Element& x, const BB& A, const size_t i, const size_t j, SolutionTags::Generic t)
+ {
+ typedef typename BB::Field Field;
+ typedef BlasVector<Field> Vector ;
+
+ const Field& F = A.field();
+ Vector v(F,A.coldim(), F.zero), w(F,A.rowdim(), F.zero);
+ F.assign(v[j],F.one); // use standard basis ?
+ A.apply (w, v);
+ return F.assign(x, w[i]);
+ }
+
+ // some BBs have their own.
+ template <class BB>
+ typename BB::Field::Element& getEntry(typename BB::Field::Element& x, const BB& A, const size_t i, const size_t j, SolutionTags::Local t )
+ {
+ return A.getEntry(x, i, j);
+ }
+
+ // Compose< Diagonal, BB > specialization
+ template <class Field, class Trait, class BB>
+ typename Field::Element& getEntry(typename Field::Element& x, const Compose<Diagonal<Field, Trait>, BB>& A, const size_t i, const size_t j)
+ {
+ typename Field::Element y;
+ getEntry(y, *(A.getLeftPtr()), i, i);
+ getEntry(x, *(A.getRightPtr()), i, j);
+ return A.field().mulin(x, y);
+ }
+
+ // Compose< BB, Diagonal > specialization
+ template <class BB, class Field, class Trait>
+ typename Field::Element& getEntry(typename Field::Element& x, const Compose<BB, Diagonal<Field, Trait> >& A, const size_t i, const size_t j)
+ {
+ typename Field::Element y;
+ getEntry(y, *(A.getLeftPtr()), i, j);
+ getEntry(x, *(A.getRightPtr()), j, j);
+ return A.field().mulin(x, y);
+ }
+
+ // Compose< Diagonal, Diagonal > specialization
+ template <class Field, class T1, class T2>
+ typename Field::Element& getEntry(typename Field::Element& x, const Compose<Diagonal<Field,T1>, Diagonal<Field, T2> >& A, const size_t i, const size_t j)
+ {
+ if (i != j) return A.field().assign(x, A.field().zero);
+ typename Field::Element y;
+ getEntry(y, *(A.getLeftPtr()), i, i);
+ getEntry(x, *(A.getRightPtr()), j, j);
+ return A.field().mulin(x, y);
+ }
+
+}
+
+#endif // __LINBOX_getentry_INL
+
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/solutions/is-positive-definite.h b/linbox/solutions/is-positive-definite.h
index 85d4557..eb1e001 100644
--- a/linbox/solutions/is-positive-definite.h
+++ b/linbox/solutions/is-positive-definite.h
@@ -80,11 +80,14 @@ namespace LinBox
const RingCategories::IntegerTag &tag,
const Method::Hybrid& M)
{
- // should try a modular minpoly and decide on the degree of that...
- if (A.rowdim() != A.coldim()) return false;
- // this crude size check can be refined
- if (A.coldim() > 7000) return isPositiveDefinite(A, tag, Method::Blackbox(M));
- else return isPositiveDefinite(A, tag, Method::Elimination(M));
+ //! @bug should try a modular minpoly and decide on the degree of that...
+ if (A.rowdim() != A.coldim())
+ return false;
+ //! @bug this crude size check can be refined
+ if (A.coldim() > 7000)
+ return isPositiveDefinite(A, tag, Method::Blackbox(M));
+ else
+ return isPositiveDefinite(A, tag, Method::Elimination(M));
}
// The isPositiveDefinite with Elimination Method
@@ -132,7 +135,7 @@ namespace LinBox
{
// call BlasElimination code
BlasMatrix<typename Blackbox::Field> DA(A.field(), A.rowdim(), A.coldim());
- MatrixHom::map(DA, A, A. field());
+ MatrixHom::map(DA, A); //! @bug why map (same field)? This is a copy.
return Signature::isPosDef(DA, Signature::BLAS_LPM_Method() );
}
diff --git a/linbox/solutions/is-positive-semidefinite.h b/linbox/solutions/is-positive-semidefinite.h
index be0df0c..1ba35dd 100644
--- a/linbox/solutions/is-positive-semidefinite.h
+++ b/linbox/solutions/is-positive-semidefinite.h
@@ -37,10 +37,10 @@ namespace LinBox
const DomainCategory &tag,
const isPositiveSemiDefiniteMethod &M);
- /** Compute the isPositiveSemiDefinite of A.
+ /** Determine if A is positive semidefinite.
*
- * The isPositiveSemiDefinite of a linear operator A, represented as a
- * black box, is computed over the ring or field of A.
+ * The positive semidefiniteness of a linear operator A, represented as a
+ * black box, is computed over the ring or field (characteristic 0) of A.
*
* @param A Black box of which to compute the isPositiveSemiDefinite
* @param M may be a Method::Hybrid (SemiDefault), Method::Blackbox, Method::Elimination, or of other method type.
@@ -133,7 +133,7 @@ namespace LinBox
{
// call BlasElimination code
BlasMatrix<typename Blackbox::Field> DA(A.field(), A.rowdim(), A.coldim());
- MatrixHom::map(DA, A, A. field());
+ MatrixHom::map(DA, A); //! @warning this is a copy
return Signature::isPosSemiDef(DA, Signature::BLAS_LPM_Method() );
}
diff --git a/linbox/solutions/methods.h b/linbox/solutions/methods.h
index 8b4c0e1..e71aa31 100644
--- a/linbox/solutions/methods.h
+++ b/linbox/solutions/methods.h
@@ -59,6 +59,9 @@
#include "linbox/util/mpicpp.h"
#endif
+#ifndef LINBOX_USE_BLACKBOX_THRESHOLD
+#define LINBOX_USE_BLACKBOX_THRESHOLD 1000
+#endif
namespace LinBox
{
@@ -454,7 +457,7 @@ namespace LinBox
};
- ///
+ /// To select algorithms that use Giorgi' algorithms/block-massey-domain.h
struct BlockWiedemannTraits : public Specifier {
BlockWiedemannTraits ( Preconditioner Precond= NO_PRECONDITIONER,
size_t Rank = RANK_UNKNOWN)
@@ -467,32 +470,61 @@ namespace LinBox
{}
};
+ /// To select algorithms that use Yuhasz' algorithms/coppersmith.h
+ struct CoppersmithTraits : public Specifier {
+ CoppersmithTraits ( Preconditioner Precond= NO_PRECONDITIONER,
+ size_t Rank = RANK_UNKNOWN)
+ {
+ Specifier::_preconditioner = Precond;
+ Specifier::_rank = Rank;
+ }
+ CoppersmithTraits( const Specifier& S) :
+ Specifier(S)
+ {}
+ };
+
//Using Wan's numeric/symbolic method to solve linear systems.
//based on a preprinted article, submitted to JSC 2004
- struct WanTraits : public Specifier
+ struct NumSymNormTraits : public Specifier
{
- WanTraits ( Preconditioner Precond= NO_PRECONDITIONER,
+ NumSymNormTraits ( Preconditioner Precond= NO_PRECONDITIONER,
size_t Rank = RANK_UNKNOWN)
{
Specifier::_preconditioner = (Precond);
Specifier::_rank = (Rank) ;
}
- WanTraits( const Specifier& S) :
+ NumSymNormTraits( const Specifier& S) :
Specifier(S)
{}
};
- //Using numerical methods to symbolically solve linear systems.
- struct NumericalTraits : public Specifier
+ //Using Youse et al numerical/symbolic method to symbolically solve linear systems.
+ // This is like Wan's but replaces a norm condition with an overlap test
+ // to confirm valid numeric iteration steps.
+ struct NumSymOverlapTraits : public Specifier
{
- NumericalTraits ( Preconditioner Precond= NO_PRECONDITIONER,
+ NumSymOverlapTraits ( Preconditioner Precond= NO_PRECONDITIONER,
size_t Rank = RANK_UNKNOWN)
{
Specifier::_preconditioner = (Precond);
Specifier::_rank = (Rank) ;
}
- NumericalTraits( const Specifier& S) :
+ NumSymOverlapTraits( const Specifier& S) :
+ Specifier(S)
+ {}
+ };
+
+ //Use a numerical/symbolic method if it works. If it fails, go to a dixon style method.
+ struct AdaptiveSolverTraits : public Specifier
+ {
+ AdaptiveSolverTraits ( Preconditioner Precond= NO_PRECONDITIONER,
+ size_t Rank = RANK_UNKNOWN)
+ {
+ Specifier::_preconditioner = (Precond);
+ Specifier::_rank = (Rank) ;
+ }
+ AdaptiveSolverTraits ( const Specifier& S) :
Specifier(S)
{}
};
@@ -569,6 +601,7 @@ namespace LinBox
IMLTraits ( const IMLNonSing & imlroutine, // routine 1
bool withRNS = false) :
_computeRNS(withRNS),
+ _reduce(false),_nullcol(10),
_imlroutine(1)
{
singular(NONSINGULAR);
@@ -586,6 +619,7 @@ namespace LinBox
bool certify = DONT_CERTIFY,
bool reduce = false ,
unsigned int nullcolred = 10 /* IML default */) :
+ _computeRNS(false),
_reduce(reduce),
_nullcol(nullcolred),
_imlroutine(2)
@@ -615,11 +649,14 @@ namespace LinBox
typedef CRATraits CRA ; //!< Use CRA for solving Integer systems.
typedef WiedemannTraits Wiedemann; //!< Method::Wiedemann : no doc
typedef WiedemannExtensionTraits ExtensionWiedemann; //!< Method::ExtensionWiedemann : no doc
+ typedef BlockWiedemannTraits BlockWiedemann; //!< Method::BlockWiedemann : no doc
+ typedef CoppersmithTraits Coppersmith; //!< Method::Coppersmith : no doc
typedef LanczosTraits Lanczos; //!< Method::Lanczos : no doc.
typedef BlockLanczosTraits BlockLanczos; //!< Method::BlockLanczos : no doc.
typedef SparseEliminationTraits SparseElimination; //!< Method::SparseElimination : no doc
- typedef NumericalTraits Numerical; //!< Method::Numerical : no doc.
- typedef WanTraits NumericalWan; //!< Method::Numerical : no doc.
+ typedef NumSymOverlapTraits NumSymOverlap; //!< Method::NumSymOverlap : Use Youse's overlap-based numeric/symbolic iteration for Rational solving of dense integer systems
+ typedef NumSymNormTraits NumSymNorm; //!< Method::NumSymNorm : Use Wan's (older) norm-based numeric/symbolic iteration for Rational solving of dense integer systems
+ typedef AdaptiveSolverTraits Adaptive; //!< Method::Adaptive: Use NumSymOverlap if it works. If it fails, switch to IML probably.
typedef BlasEliminationTraits BlasElimination; //!< Method::BlasElimination : no doc
typedef BlasExtensionTraits ExtensionBlasElimination;//!< Method::ExtensionBlasElimination : no doc
typedef NonBlasEliminationTraits NonBlasElimination; //!< Method::NonBlasElimination : no doc.
@@ -646,15 +683,15 @@ namespace LinBox
template<class BB>
bool useBB(const BB& A)
{
- return (A.coldim() > 1000) && (A.rowdim() > 1000);
+ return (A.coldim() > LINBOX_USE_BLACKBOX_THRESHOLD) && (A.rowdim() > LINBOX_USE_BLACKBOX_THRESHOLD);
}
- template<class _Field>
+ template<class _Field, class _Rep>
class BlasMatrix ; // forward declaration...
- template<class Field>
- bool useBB(const BlasMatrix<Field>& A) { return false; }
+ template<class Field, class _Rep>
+ bool useBB(const BlasMatrix<Field,_Rep>& A) { return false; }
/** Solver traits.
@@ -709,11 +746,10 @@ namespace LinBox
#endif // __LINBOX_method_H
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
// Local Variables:
// mode: C++
// tab-width: 8
// indent-tabs-mode: nil
// c-basic-offset: 8
// End:
-
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/solutions/minpoly.h b/linbox/solutions/minpoly.h
index 0a0993a..37c1a68 100644
--- a/linbox/solutions/minpoly.h
+++ b/linbox/solutions/minpoly.h
@@ -32,7 +32,7 @@
#include "linbox/blackbox/squarize.h"
-#include "linbox/algorithms/blas-domain.h"
+#include "linbox/matrix/matrix-domain.h"
#include "linbox/algorithms/wiedemann.h"
#ifdef __LINBOX_HAVE_MPI
@@ -170,7 +170,9 @@ namespace LinBox
if (M.certificate()) {
// Will make a word size extension
// when field size is too small
- return minpoly(P, A, tag, Method::ExtensionWiedemann (M));
+ //return minpoly(P, A, tag, Method::ExtensionWiedemann (M));
+ minpoly(P, A, tag, Method::ExtensionWiedemann (M));
+ return P;
}
else
return minpoly(P, A, tag, Method::Wiedemann (M));
@@ -184,7 +186,7 @@ namespace LinBox
// Chinese Remaindering generic wrappers for integer minpoly
// ---------------------------------------------------------
-#include "linbox/field/modular.h"
+#include "linbox/ring/modular.h"
#include "linbox/algorithms/cra-domain.h"
#include "linbox/randiter/random-prime.h"
#include "linbox/algorithms/matrix-hom.h"
@@ -239,14 +241,14 @@ namespace LinBox
commentator().start ("Integer Minpoly", "Iminpoly");
#endif
// 0.7213475205 is an upper approximation of 1/(2log(2))
- RandomPrimeIterator genprime( 26-(int)ceil(log((double)A.rowdim())*0.7213475205));
+ RandomPrimeIterator genprime((uint32_t) (26-(int)ceil(log((double)A.rowdim())*0.7213475205)));
IntegerModularMinpoly<Blackbox,MyMethod> iteration(A, M);
std::vector<integer> PP; // use of integer due to non genericity of cra. PG 2005-08-04
#ifdef __LINBOX_HAVE_MPI
- MPIChineseRemainder< EarlyMultipCRA<Modular<double> > > cra(3UL, c);
+ MPIChineseRemainder< EarlyMultipCRA<Givaro::Modular<double> > > cra(3UL, c);
cra(PP, iteration, genprime);
#else
- ChineseRemainder< EarlyMultipCRA<Modular<double> > > cra(3UL);
+ ChineseRemainder< EarlyMultipCRA<Givaro::Modular<double> > > cra(3UL);
cra(PP, iteration, genprime);
#endif
size_t i =0;
@@ -269,8 +271,8 @@ namespace LinBox
{
commentator().start ("Rational Minpoly", "Rminpoly");
- RandomPrimeIterator genprime( 26-(int)ceil(log((double)A.rowdim())*0.7213475205));
- RationalRemainder2< VarPrecEarlyMultipCRA<Modular<double> > > rra(3UL);
+ RandomPrimeIterator genprime((uint32_t)( 26-(int)ceil(log((double)A.rowdim())*0.7213475205)));
+ RationalRemainder2< VarPrecEarlyMultipCRA<Givaro::Modular<double> > > rra(3UL);
IntegerModularMinpoly<Blackbox,MyMethod> iteration(A, M);
std::vector<Integer> PP; // use of integer due to non genericity of cra. PG 2005-08-04
@@ -302,11 +304,10 @@ namespace LinBox
#endif // __LINBOX_minpoly_H
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
// Local Variables:
// mode: C++
// tab-width: 8
// indent-tabs-mode: nil
// c-basic-offset: 8
// End:
-
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/solutions/nullspace.h b/linbox/solutions/nullspace.h
index 43df301..fc7ccbf 100644
--- a/linbox/solutions/nullspace.h
+++ b/linbox/solutions/nullspace.h
@@ -1,5 +1,5 @@
/* Copyright (C) 2009 LinBox
- * Written by <brice.boyer at imag.fr>
+ * Written by Brice Boyer (briceboyer) <boyer.brice at gmail.com>
*
*
*
diff --git a/linbox/solutions/rank.h b/linbox/solutions/rank.h
index c40addb..082a63f 100644
--- a/linbox/solutions/rank.h
+++ b/linbox/solutions/rank.h
@@ -1,20 +1,20 @@
/* linbox/solutions/rank.h
* Copyright(C) LinBox
* ------------------------------------
- *
+ *
* ========LICENCE========
* This file is part of the library LinBox.
- *
+ *
* LinBox is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
- *
+ *
* This library 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
* Lesser General Public License for more details.
- *
+ *
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
@@ -25,28 +25,26 @@
#ifndef __LINBOX_rank_H
#define __LINBOX_rank_H
-//#include "linbox-config.h"
-#include "linbox/field/modular.h"
+//#include "linbox/linbox-config.h"
+#include "linbox/ring/modular.h"
#include "linbox/randiter/random-prime.h"
#include "linbox/algorithms/matrix-hom.h"
-#include "linbox/blackbox/sparse.h"
+#include "linbox/matrix/sparse-matrix.h"
#include "linbox/blackbox/diagonal.h"
#include "linbox/blackbox/diagonal-gf2.h"
#include "linbox/blackbox/compose.h"
-#include "linbox/blackbox/permutation.h"
#include "linbox/blackbox/transpose.h"
+#include "linbox/blackbox/butterfly.h"
#include "linbox/algorithms/blackbox-container-symmetrize.h"
#include "linbox/algorithms/blackbox-container-symmetric.h"
#include "linbox/algorithms/blackbox-container.h"
#include "linbox/algorithms/massey-domain.h"
#include "linbox/algorithms/gauss.h"
#include "linbox/algorithms/gauss-gf2.h"
-#include "linbox/algorithms/blas-domain.h"
+#include "linbox/matrix/matrix-domain.h"
#include "linbox/algorithms/whisart_trace.h"
-#include "linbox/matrix/blas-matrix.h"
-#include "linbox/switch/cekstv.h"
-#include "linbox/blackbox/butterfly.h"
-
+#include "linbox/matrix/dense-matrix.h"
+#include "linbox/matrix/matrixdomain/blas-matrix-domain.h"
#include "linbox/vector/vector-traits.h"
#include "linbox/solutions/trace.h"
@@ -69,30 +67,17 @@ namespace LinBox
* For small or dense matrices BlasElimination will be faster.
* \param[out] r output rank of A.
* \param[in] A linear transform, member of any blackbox class.
- * \param[in] M may be a \p Method::Wiedemann (the default), a \p Method::BlasElimination, or a \p Method::SparseElimination..
+ * \param[in] M may be a \p Method::Hybrid (the default), a \p Method::Wiedemann, a \p Method::BlasElimination, or a \p Method::SparseElimination..
* \param tag UNDOC
* \return a reference to r.
*/
template <class Blackbox, class Method, class DomainCategory>
- inline unsigned long &rank (unsigned long &r,
- const Blackbox &A,
- const DomainCategory &tag,
- const Method &M);
-
- // error hanlder for rational domain
- template <class Blackbox, class Method>
- inline unsigned long &rank (unsigned long &r,
- const Blackbox &A,
- const RingCategories::RationalTag &tag,
- const Method &M)
- {
- commentator().start ("Rational Rank", "Rrank");
- // Same mapping as the integer one
- rank(r, A, RingCategories::IntegerTag(), M);
- commentator().stop ("done", NULL, "Rrank");
- return r;
- }
+ inline unsigned long &rank (unsigned long &r, const Blackbox &A,
+ const DomainCategory &tag, const Method &M);
+ template <class Blackbox, class Method, class DomainCategory>
+ inline unsigned long &rankin (unsigned long &r, const Blackbox &A,
+ const DomainCategory &tag, const Method &M);
/**
* Compute the rank of a linear transform A over a field.
@@ -104,78 +89,11 @@ namespace LinBox
* \return \p r rank of \p A.
*/
template <class Blackbox>
- inline unsigned long &rank (unsigned long &r,
- const Blackbox &A)
+ inline unsigned long &rank (unsigned long &r, const Blackbox &A)
{
return rank(r, A, typename FieldTraits<typename Blackbox::Field>::categoryTag(), Method::Hybrid());
}
- /** Rank of \p A.
- * \p A may be modified
- * @param A matrix
- * @param r rank
- */
- template <class Matrix>
- inline unsigned long &rankin (unsigned long &r,
- Matrix &A)
- {
- return rankin(r, A, typename FieldTraits<typename Matrix::Field>::categoryTag(), Method::Elimination());
- }
-
- template <class Blackbox>
- inline unsigned long &rank (unsigned long &r,
- const Blackbox &A,
- const RingCategories::ModularTag &tag,
- const Method::Hybrid &m)
- { // this should become a BB/Blas hybrid in the style of Duran/Saunders/Wan.
- if (useBB(A)) return rank(r, A, tag, Method::Blackbox(m ));
- else return rank(r, A, tag, Method::Elimination( m ));
- }
-
- template <class Blackbox>
- inline unsigned long &rank (unsigned long &r,
- const Blackbox &A,
- const RingCategories::ModularTag &tag,
- const Method::Elimination &m)
- {
- typedef typename Blackbox::Field Field;
- const Field& F = A.field();
- integer a, b; F.characteristic(a); F.cardinality(b);
- if (a == b && a < LinBox::BlasBound)
- return rank(r, A, tag, Method::BlasElimination(m));
- else
- return rank(r, A, tag, Method::NonBlasElimination( m ));
- }
-
-
- template <class Field, class Vector>
- inline unsigned long &rank (unsigned long &r,
- const SparseMatrix<Field, Vector> &A,
- const RingCategories::ModularTag &tag,
- const Method::Elimination &m)
- {
- return rank(r, A, tag, Method::SparseElimination(m));
- }
-
-
- // specialization of NonBlas for SparseMatrix
- template <class Blackbox>
- inline unsigned long &rank (unsigned long &r,
- const Blackbox &A,
- const RingCategories::ModularTag &tag,
- const Method::NonBlasElimination & m)
- {
- return rank(r, A, tag, Method::SparseElimination(m));
- }
-
-
- template <class Blackbox>
- inline unsigned long &rank (unsigned long &r,
- const Blackbox &A,
- const RingCategories::ModularTag &tag,
- const Method::Blackbox &m);
-
-
/**
* Compute the rank of a linear transform A over a field.
* \ingroup solutions
@@ -188,536 +106,37 @@ namespace LinBox
* @param M method (see ???)
*/
template <class Blackbox, class Method>
- inline unsigned long &rank (unsigned long &r,
- const Blackbox &A,
- const Method &M)
- { return rank(r, A, typename FieldTraits<typename Blackbox::Field>::categoryTag(), M);
- }
-
- /// M may be <code>Method::Wiedemann()</code>.
- template <class Blackbox>
- inline unsigned long &rank (unsigned long &res,
- const Blackbox &A,
- const RingCategories::ModularTag &tag,
- const Method::Wiedemann &M)
- // This is too much for solutions. It belongs in algorithms
+ inline unsigned long &rank (unsigned long &r, const Blackbox &A,
+ const Method &M)
{
-
- typedef typename Blackbox::Field Field;
- const Field F = A.field();
- typename Field::RandIter iter (F);
-
- if (M.symmetric()) {
- commentator().start ("Symmetric Rank", "srank");
-
-
- std::vector<typename Field::Element> d1;
- size_t i;
-
- VectorWrapper::ensureDim (d1, A.coldim ());
-
- for (i = 0; i < A.coldim (); i++)
- do iter.random (d1[i]); while (F.isZero (d1[i]));
-
-
- typedef Compose<Compose<Diagonal<Field>,Blackbox >, Diagonal<Field> > BlackBox1;
- Diagonal<Field> D0 (F, d1);
- Compose<Diagonal<Field>,Blackbox > B0 (&D0, &A);
- BlackBox1 B (&B0, &D0);
-
- BlackboxContainerSymmetric<Field, BlackBox1> TF (&B, F, iter);
- MasseyDomain<Field, BlackboxContainerSymmetric<Field, BlackBox1> > WD (&TF, M.earlyTermThreshold ());
- std::vector<typename Field::Element> phi;
- WD.pseudo_minpoly (phi, res);
- commentator().report(Commentator::LEVEL_ALWAYS,INTERNAL_DESCRIPTION) << "Pseudo Minpoly degree: " << res << std::endl;
-
- commentator().start ("Monte Carlo certification (1)", "trace");
- typename Field::Element t, p2; F.init(p2, 0UL);
- trace(t, B);
- if (phi.size() >= 2) F.neg(p2, phi[ phi.size()-2]);
-
- int nbperm = 0; unsigned long rk;
- int logn = (int)(2*(unsigned long)floor( log( (double)A.rowdim() ) ));
- bool tryagain = (! F.areEqual( t, p2 ));
- while( tryagain ) {
- commentator().stop ("fail", NULL, "trace");
-#if 0
-
- Permutation<Field> P(A.rowdim(), F);
- for (i = 0; i < A.rowdim (); ++i)
- P.permute( rand() % A.rowdim() , rand() % A.rowdim() );
- for (i = 0; i < A.rowdim (); ++i)
- P.permute( rand() % A.rowdim() , rand() % A.rowdim() );
-
- Transpose< Permutation<Field> > TP(&P);
- typedef Compose< Permutation<Field>, Blackbox > BlackboxP;
- typedef Compose< Compose< Permutation<Field>, Blackbox >, Transpose< Permutation<Field> > > BlackboxPAP;
- BlackboxP PA(&P, &A);
- BlackboxPAP BP( &PA , &TP );
-
- for (i = 0; i < A.coldim (); i++)
- do iter.random (d1[i]); while (F.isZero (d1[i]));
- Diagonal<Field> D1 (F, d1);
- Compose<Diagonal<Field>,BlackboxPAP > B1 (&D1, &BP);
- typedef Compose<Compose<Diagonal<Field>,BlackboxPAP >, Diagonal<Field> > BlackBox2;
- BlackBox2 B (&B1, &D1);
-#endif
-
- for (i = 0; i < A.coldim (); i++)
- do iter.random (d1[i]); while (F.isZero (d1[i]));
- Diagonal<Field> D1 (F, d1);
- Compose<Diagonal<Field>,Blackbox > B1 (&D1, &A);
- BlackBox1 B2 (&B1, &D1);
-
- BlackboxContainerSymmetric<Field, BlackBox1> TF1 (&B2, F, iter);
- MasseyDomain<Field, BlackboxContainerSymmetric<Field, BlackBox1> > WD1 (&TF1, M.earlyTermThreshold ());
-
- WD1.pseudo_minpoly (phi, rk);
- commentator().report(Commentator::LEVEL_ALWAYS,INTERNAL_DESCRIPTION) << "Permuted pseudo Minpoly degree: " << res << std::endl;
- commentator().start ("Monte Carlo certification (2)", "trace");
- if (phi.size() >= 2) F.neg(p2, phi[ phi.size()-2]);
-
- trace(t, B2);
-
- tryagain = (! F.areEqual( t, p2 ));
- if (res > rk)
- tryagain = true;
- else
- res = rk;
- if( ++nbperm > logn) break;
- }
- commentator().report(Commentator::LEVEL_ALWAYS,INTERNAL_DESCRIPTION) << "symm permutations : " << nbperm << std::endl;
- nbperm = 0;
- while(tryagain) {
- commentator().stop ("fail", NULL, "trace");
- // F.write( F.write( commentator().report(Commentator::LEVEL_ALWAYS,INTERNAL_DESCRIPTION)
- // << "end trace: ", t) << ", p2: ", p2) << std::endl;
- typename Field::RandIter r (F);
- typename CekstvSwitch<Field>::Factory factory (r);
- typedef Butterfly<Field, CekstvSwitch<Field> > ButterflyP;
- ButterflyP P (F, A.rowdim(), factory);
- for (i = 0; i < A.coldim (); i++)
- do iter.random (d1[i]); while (F.isZero (d1[i]));
- Diagonal<Field> D1 (F, d1);
- typedef Compose< ButterflyP, Diagonal<Field> > ButD;
- ButD PD(&P, &D1);
-
- Transpose< ButD > TP (&PD);
-
- Compose< ButD, Blackbox > B1( &PD, &A);
-
- typedef Compose< Compose< ButD, Blackbox > , Transpose< ButD > > BlackBoxBAB;
- BlackBoxBAB PAP(&B1, &TP);
-
- BlackboxContainerSymmetric<Field, BlackBoxBAB> TF1 (&PAP, F, iter);
- MasseyDomain<Field, BlackboxContainerSymmetric<Field, BlackBoxBAB> > WD1 (&TF1, M.earlyTermThreshold ());
-
- WD1.pseudo_minpoly (phi, rk);
- commentator().report(Commentator::LEVEL_ALWAYS,INTERNAL_DESCRIPTION) << "Butterfly pseudo Minpoly degree: " << res << std::endl;
- commentator().start ("Monte Carlo certification (3)", "trace");
- if (phi.size() >= 2) F.neg(p2, phi[ phi.size()-2]);
-
- trace(t, PAP);
-
- tryagain = (! F.areEqual( t, p2 ));
- if (res > rk)
- tryagain = true;
- else
- res = rk;
- ++nbperm;
- }
-
- // F.write( F.write( commentator().report(Commentator::LEVEL_ALWAYS,INTERNAL_DESCRIPTION)
- // << "end trace: ", t) << ", p2: ", p2) << std::endl;
-
- commentator().report(Commentator::LEVEL_ALWAYS,INTERNAL_DESCRIPTION) << "butterflies : " << nbperm << std::endl;
-
- commentator().stop ("success", NULL, "trace");
- commentator().stop ("done", NULL, "srank");
-
- return res;
- }
- else {
-
- commentator().start ("Rank", "wrank");
-
- std::vector<typename Field::Element> d1, d2;
- size_t i;
-
- VectorWrapper::ensureDim (d1, A.coldim ());
- VectorWrapper::ensureDim (d2, A.rowdim ());
-
- for (i = 0; i < A.coldim (); i++)
- do iter.random (d1[i]); while (F.isZero (d1[i]));
-
- for (i = 0; i < A.rowdim (); i++)
- do iter.random (d2[i]); while (F.isZero (d2[i]));
-
- Diagonal<Field> D1_i (F, d1), D2_i (F, d2);
- Transpose<Blackbox> AT_i (&A);
-
- Compose<Diagonal<Field>,Transpose<Blackbox> > B1_i (&D1_i, &AT_i);
- Compose<Compose<Diagonal<Field>,Transpose<Blackbox> >, Diagonal<Field> > B2_i (&B1_i, &D2_i);
- Compose<Compose<Compose<Diagonal<Field>,Transpose<Blackbox> >, Diagonal<Field> >, Blackbox> B3_i (&B2_i, &A);
- // Here there is an extra diagonal computation
- // The probability of success is also divided by two, as
- // D2_i^2 contains only squares and squares are half the total elements
- typedef Compose<Compose<Compose<Compose<Diagonal<Field>,Transpose<Blackbox> >, Diagonal<Field> >, Blackbox>, Diagonal<Field> > Blackbox0;
- Blackbox0 B_i (&B3_i, &D1_i);
-
- BlackboxContainerSymmetric<Field, Blackbox0> TF_i (&B_i, F, iter);
- MasseyDomain<Field, BlackboxContainerSymmetric<Field, Blackbox0> > WD (&TF_i, M.earlyTermThreshold ());
-
- std::vector<typename Field::Element> phi;
- WD.pseudo_minpoly (phi, res);
- commentator().report(Commentator::LEVEL_ALWAYS,INTERNAL_DESCRIPTION) << "Pseudo Minpoly degree: " << res << std::endl;
- commentator().start ("Monte Carlo certification (4)", "trace");
-
- typename Field::Element t, p2; F.init(p2, 0UL);
- // trace(t, B_i);
- WhisartTraceTranspose(t, F, D1_i, A, D2_i);
- if (phi.size() >= 2) F.neg(p2, phi[ phi.size()-2]);
-
- int nbperm = 0; unsigned long rk;
- int logn = (int)(2*(unsigned long)floor( log( (double)A.rowdim() ) ));
- bool tryagain = (! F.areEqual( t, p2 ));
- while( tryagain ) {
- commentator().stop ("fail", NULL, "trace");
- Permutation<Field> P((int)A.rowdim(), F);
- for (i = 0; i < A.rowdim (); ++i)
- P.permute( rand() % A.rowdim() , rand() % A.rowdim() );
- for (i = 0; i < A.rowdim (); ++i)
- P.permute( rand() % A.rowdim() , rand() % A.rowdim() );
-
- typedef Compose< Permutation<Field>, Blackbox > BlackboxP;
- BlackboxP BP(&P, &A);
-
- for (i = 0; i < A.coldim (); i++)
- do iter.random (d1[i]); while (F.isZero (d1[i]));
-
- for (i = 0; i < A.rowdim (); i++)
- do iter.random (d2[i]); while (F.isZero (d2[i]));
-
- Diagonal<Field> D1 (F, d1), D2 (F, d2);
- Transpose<BlackboxP> AT (&BP);
-
- Compose<Diagonal<Field>,Transpose<BlackboxP> > B1 (&D1, &AT);
- Compose<Compose<Diagonal<Field>,Transpose<BlackboxP> >, Diagonal<Field> > B2 (&B1, &D2);
- Compose<Compose<Compose<Diagonal<Field>,Transpose<BlackboxP> >, Diagonal<Field> >, BlackboxP> B3 (&B2, &BP);
- typedef Compose<Compose<Compose<Compose<Diagonal<Field>,Transpose<BlackboxP> >, Diagonal<Field> >, BlackboxP>, Diagonal<Field> > Blackbox1;
- Blackbox1 B (&B3, &D1);
-
- BlackboxContainerSymmetric<Field, Blackbox1> TF (&B, F, iter);
- MasseyDomain<Field, BlackboxContainerSymmetric<Field, Blackbox1> > MD (&TF, M.earlyTermThreshold ());
-
- MD.pseudo_minpoly (phi, rk);
- commentator().report(Commentator::LEVEL_ALWAYS,INTERNAL_DESCRIPTION) << "Permuted pseudo Minpoly degree: " << rk << std::endl;
- commentator().start ("Monte Carlo certification (5)", "trace");
- if (phi.size() >= 2) F.neg(p2, phi[ phi.size()-2]);
-
- // trace(t, B);
- WhisartTraceTranspose(t, F, D1, BP, D2);
- tryagain = (! F.areEqual( t, p2 ));
- if (res > rk)
- tryagain = true;
- else
- res = rk;
- if( ++nbperm > logn) break;
- }
- commentator().report(Commentator::LEVEL_ALWAYS,INTERNAL_DESCRIPTION) << "permutations : " << nbperm << std::endl;
- nbperm = 0;
- while(tryagain) {
- commentator().stop ("fail", NULL, "trace");
- typename Field::RandIter r (F);
- typename CekstvSwitch<Field>::Factory factory (r);
- typedef Butterfly<Field, CekstvSwitch<Field> > ButterflyP;
- ButterflyP P (F, A.rowdim(), factory);
-
- typedef Compose< ButterflyP, Blackbox > BlackboxP;
- BlackboxP BP(&P, &A);
-
- for (i = 0; i < A.coldim (); i++)
- do iter.random (d1[i]); while (F.isZero (d1[i]));
-
- for (i = 0; i < A.rowdim (); i++)
- do iter.random (d2[i]); while (F.isZero (d2[i]));
-
- Diagonal<Field> D1 (F, d1), D2 (F, d2);
- Transpose<BlackboxP> AT (&BP);
-
- Compose<Diagonal<Field>,Transpose<BlackboxP> > B1 (&D1, &AT);
- Compose<Compose<Diagonal<Field>,Transpose<BlackboxP> >, Diagonal<Field> > B2 (&B1, &D2);
- Compose<Compose<Compose<Diagonal<Field>,Transpose<BlackboxP> >, Diagonal<Field> >, BlackboxP> B3 (&B2, &BP);
- typedef Compose<Compose<Compose<Compose<Diagonal<Field>,Transpose<BlackboxP> >, Diagonal<Field> >, BlackboxP>, Diagonal<Field> > Blackbox1;
- Blackbox1 B (&B3, &D1);
-
- BlackboxContainerSymmetric<Field, Blackbox1> TF (&B, F, iter);
- MasseyDomain<Field, BlackboxContainerSymmetric<Field, Blackbox1> > MD (&TF, M.earlyTermThreshold ());
-
- MD.pseudo_minpoly (phi, rk);
- commentator().report(Commentator::LEVEL_ALWAYS,INTERNAL_DESCRIPTION) << "Butterfly pseudo Minpoly degree: " << rk << std::endl;
- commentator().start ("Monte Carlo certification (6)", "trace");
- if (phi.size() >= 2) F.neg(p2, phi[ phi.size()-2]);
-
- // trace(t, B);
- WhisartTraceTranspose(t, F, D1, BP, D2);
- tryagain = (! F.areEqual( t, p2 ));
- if (res > rk)
- tryagain = true;
- else
- res = rk;
- ++nbperm;
- }
- commentator().report(Commentator::LEVEL_ALWAYS,INTERNAL_DESCRIPTION) << "butterflies : " << nbperm << std::endl;
- commentator().stop ("success", NULL, "trace");
- commentator().stop ("done", NULL, "wrank");
-
- return res;
- }
-
- }
-
- /// M may be <code>Method::SparseElimination()</code>.
- template <class Field>
- inline unsigned long &rank (unsigned long &r,
- const SparseMatrix<Field, typename LinBox::Vector<Field>::SparseSeq> &A,
- const RingCategories::ModularTag &tag,
- const Method::SparseElimination &M)
- {
- // We make a copy as these data will be destroyed
- SparseMatrix<Field, typename LinBox::Vector<Field>::SparseSeq> A1 (A);
- return rankin(r, A1, tag, M);
- }
-
- template <class Field, class Method>
- inline unsigned long &rankin (unsigned long &r,
- SparseMatrix<Field, typename LinBox::Vector<Field>::SparseSeq> &A,
- const Method &M)
- {
- return rankin(r, A, typename FieldTraits<Field>::categoryTag(), M);
- }
-
-
- template <class Blackbox, class Ring>
- inline unsigned long &rankin (unsigned long &r,
- Blackbox &A,
- const RingCategories::IntegerTag &tag,
- const Method::SparseElimination &M)
- {
- commentator().start ("Integer Rank inplace", "irank");
- typedef Modular<double> Field;
- integer mmodulus;
- FieldTraits<Field>::maxModulus(mmodulus);
- RandomPrimeIterator genprime( (long) floor (log((double)mmodulus) ) );
- ++genprime;
- typedef typename Blackbox::template rebind< Field >::other FBlackbox;
- Field Fp(*genprime);
- FBlackbox Ap(A, Fp);
- commentator().report (Commentator::LEVEL_ALWAYS,INTERNAL_WARNING) << "Integer Rank is done modulo " << *genprime << std::endl;
- rankin(r, Ap, RingCategories::ModularTag(), M);
- commentator().stop ("done", NULL, "irank");
- return r;
- }
-
- template <class Field>
- inline unsigned long &rankin (unsigned long &r,
- SparseMatrix<Field, typename LinBox::Vector<Field>::SparseSeq> &A,
- const RingCategories::ModularTag &tag,
- const Method::SparseElimination &M)
- {
- commentator().start ("Sparse Elimination Rank", "serank");
- GaussDomain<Field> GD ( A.field() );
- GD.rankin (r, A, M.strategy ());
- commentator().stop ("done", NULL, "serank");
- return r;
- }
-
- /// specialization to \f$ \mathbf{F}_2 \f$
- inline unsigned long &rankin (unsigned long &r,
- GaussDomain<GF2>::Matrix &A,
- const Method::SparseElimination &)//M
- {
- commentator().start ("Sparse Elimination Rank over GF2", "serankmod2");
- GaussDomain<GF2> GD ( A.field() );
- GD.rankin (r, A, Specifier::PIVOT_LINEAR);
- commentator().stop ("done", NULL, "serankmod2");
- return r;
+ return rank(r, A, typename FieldTraits<typename Blackbox::Field>::categoryTag(), M);
}
- /// specialization to \f$ \mathbf{F}_2 \f$
- inline unsigned long &rankin (unsigned long &r,
- GaussDomain<GF2>::Matrix &A,
- const RingCategories::ModularTag &,//tag
- const Method::SparseElimination &M)
- {
- return rankin(r, A, M);
- }
-
- // Change of representation to be able to call the sparse elimination
- template <class Blackbox>
- inline unsigned long &rank (unsigned long &r,
- const Blackbox &A,
- const RingCategories::ModularTag &tag,
- const Method::SparseElimination &M)
- {
- typedef typename Blackbox::Field Field;
- typedef SparseMatrix<Field, typename LinBox::Vector<Field>::SparseSeq> SparseBB;
- SparseBB SpA(A.field(), A.rowdim(), A.coldim() );
- MatrixHom::map(SpA, A, A.field());
- return rankin(r, SpA, tag, M);
- }
-
- // M may be <code>Method::BlasElimination()</code>.
+ /** Rank of \p A.
+ * \p A may be modified
+ * @param A matrix
+ * @param r rank
+ */
template <class Blackbox>
- inline unsigned long &rank (unsigned long &r,
- const Blackbox &A,
- const RingCategories::ModularTag &tag,
- const Method::BlasElimination &M)
+ inline unsigned long &rankin (unsigned long &r, Blackbox &A)
{
-
- commentator().start ("Blas Rank", "blasrank");
- typedef typename Blackbox::Field Field;
- const Field F = A.field();
- integer a, b; F.characteristic(a); F.cardinality(b);
- linbox_check( a == b );
- linbox_check( a < LinBox::BlasBound);
- BlasMatrix<Field> B(A);
- BlasMatrixDomain<Field> D(F);
- r = D.rank(B);
- commentator().stop ("done", NULL, "blasrank");
- return r;
+ //! @bug there is no Elimination() method there.
+ return rankin(r, A, typename FieldTraits<typename Blackbox::Field>::categoryTag(), Method::SparseElimination());
}
- // is this used?
- // A is modified.
- template <class Matrix>
- inline unsigned long &rankin (unsigned long &r,
- Matrix &A,
- const RingCategories::ModularTag &tag,
- const Method::SparseElimination &M)
- {
- typedef typename Matrix::Field Field;
- const Field F = A.field();
- GaussDomain<Field> GD (F);
- GD.rankin( r, A, M.strategy ());
- return r;
- }
-
- /// A is modified.
- template <class Field>
- inline unsigned long &rankin (unsigned long &r,
- BlasMatrix<Field> &A,
- const RingCategories::ModularTag &tag,
- const Method::BlasElimination &M)
- {
-
- commentator().start ("BlasBB Rank", "blasbbrank");
- const Field F = A.field();
- BlasMatrixDomain<Field> D(F);
- r = D.rankin(static_cast< BlasMatrix<Field>& >(A));
- commentator().stop ("done", NULL, "blasbbrank");
- return r;
- }
- template <class Blackbox, class MyMethod>
- inline unsigned long &rank (unsigned long &r,
- const Blackbox &A,
- const RingCategories::IntegerTag &tag,
- const MyMethod &M)
- {
- commentator().start ("Integer Rank", "iirank");
- typedef Modular<double> Field;
- integer mmodulus;
- FieldTraits<Field>::maxModulus(mmodulus);
- RandomPrimeIterator genprime( (unsigned) floor (log((double)mmodulus) ) );
- ++genprime;
- typedef typename Blackbox::template rebind< Field >::other FBlackbox;
- Field Fp(*genprime);
- FBlackbox Ap(A, Fp );
- commentator().report (Commentator::LEVEL_ALWAYS,INTERNAL_DESCRIPTION) << "Integer Rank is done modulo " << *genprime << std::endl;
-
- rank(r, Ap, RingCategories::ModularTag(), M);
- commentator().stop ("done", NULL, "iirank");
- return r;
- }
} // LinBox
-
-#ifdef __LINBOX_HAVE_GIVARO
-#ifndef LINBOX_EXTENSION_DEGREE_MAX
-#define LINBOX_EXTENSION_DEGREE_MAX 19
-#endif
-
-#include "linbox/field/givaro.h"
-namespace LinBox
-{
- template <class Blackbox>
- inline unsigned long &rank (unsigned long &r,
- const Blackbox &A,
- const RingCategories::ModularTag &tag,
- const Method::Blackbox & m)
- {
- commentator().start ("BB Rank", "extend");
- if (m.certificate()) {
- typedef typename Blackbox::Field Field;
- const Field& F = A.field();
- integer a,c; F.cardinality(a); F.characteristic(c);
- if (a != c) {
- unsigned long extend = (unsigned long)Givaro::FF_EXPONENT_MAX(a,(integer)LINBOX_EXTENSION_DEGREE_MAX);
- if (extend > 1) {
- commentator().report (Commentator::LEVEL_ALWAYS,INTERNAL_WARNING) << "Extension of degree " << extend << std::endl;
- GivaroExtension<Field> EF( F, extend);
- typedef typename Blackbox::template rebind< GivaroExtension<Field> >::other FBlackbox;
- FBlackbox Ap(A, EF);
- rank(r, Ap, tag, Method::Wiedemann(m));
- }
- else
- rank(r, A, tag, Method::Wiedemann(m));
- }
- else {
- unsigned long extend = (unsigned long)Givaro::FF_EXPONENT_MAX(c,(integer)LINBOX_EXTENSION_DEGREE_MAX);
- if (extend > 1) {
- commentator().report (Commentator::LEVEL_ALWAYS,INTERNAL_WARNING) << "Word size extension : " << extend << std::endl;
- GivaroGfq EF( (unsigned long)c, extend);
- typedef typename Blackbox::template rebind< GivaroGfq >::other FBlackbox;
- FBlackbox Ap(A, EF);
- rank(r, Ap, tag, Method::Wiedemann(m));
- }
- else
- rank(r, A, tag, Method::Wiedemann(m));
- }
- }
- else
- rank(r, A, tag, Method::Wiedemann(m));
- commentator().stop ("done", NULL, "extend");
- return r;
- }
-}
-#else
-namespace LinBox
-{
- template <class Blackbox>
- inline unsigned long &rank (unsigned long &r,
- const Blackbox &A,
- const RingCategories::ModularTag &tag,
- const Method::Blackbox & m)
- {
- return rank(r, A, tag, Method::Wiedemann(m));
- }
-}
-#endif
-
-
+#include "linbox/solutions/rank.inl"
#endif // __LINBOX_rank_H
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
// Local Variables:
// mode: C++
// tab-width: 8
// indent-tabs-mode: nil
// c-basic-offset: 8
// End:
-
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/solutions/rank.inl b/linbox/solutions/rank.inl
new file mode 100755
index 0000000..fad66a8
--- /dev/null
+++ b/linbox/solutions/rank.inl
@@ -0,0 +1,652 @@
+/* linbox/solutions/rank.inl
+ * Copyright(C) LinBox
+ * ------------------------------------
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ * ========LICENCE========
+ *.
+ */
+
+#ifndef __LINBOX_rank_INL
+#define __LINBOX_rank_INL
+
+#define __LINBOX_rank_sparse_elimination_format SparseMatrixFormat::SparseSeq
+// #define __LINBOX_rank_sparse_elimination_format SparseMatrixFormat::SparseMar
+// #define __LINBOX_rank_sparse_elimination_format SparseMatrixFormat::SparsePar
+// #define __LINBOX_rank_sparse_elimination_format SparseMatrixFormat::COO
+// #define __LINBOX_rank_sparse_elimination_format SparseMatrixFormat::CSR
+
+#include "linbox/field/field-traits.h"
+
+#include <givaro/extension.h>
+
+// Namespace in which all LinBox library code resides
+namespace LinBox
+{
+ // error hanlder for rational domain
+ template <class Blackbox, class Method>
+ inline unsigned long &rank (unsigned long &r,
+ const Blackbox &A,
+ const RingCategories::RationalTag &tag,
+ const Method &M)
+ {
+ commentator().start ("Rational Rank", "Rrank");
+ // Same mapping as the integer one
+ rank(r, A, RingCategories::IntegerTag(), M);
+ commentator().stop ("done", NULL, "Rrank");
+ return r;
+ }
+
+
+
+
+ template <class Blackbox>
+ inline unsigned long &rank (unsigned long &r,
+ const Blackbox &A,
+ const RingCategories::ModularTag &tag,
+ const Method::Hybrid &m)
+ { // this should become a BB/Blas hybrid in the style of Duran/Saunders/Wan.
+ //! @bug choose (benchmark) better cuttoff (size, nbnz, sparse rep)
+ if (useBB(A)) {
+ return rank(r, A, tag, Method::Blackbox(m ));
+ }
+ else {
+ return rank(r, A, tag, Method::Elimination( m ));
+ }
+ }
+
+ template <class Blackbox>
+ inline unsigned long &rank (unsigned long &r,
+ const Blackbox &A,
+ const RingCategories::ModularTag &tag,
+ const Method::Elimination &m)
+ {
+ typedef typename Blackbox::Field Field;
+ const Field& F = A.field();
+ integer a, b; F.characteristic(a); F.cardinality(b);
+ if (a == b && a < LinBox::BlasBound)
+ return rank(r, A, tag, Method::BlasElimination(m));
+ else
+ return rank(r, A, tag, Method::NonBlasElimination( m ));
+ }
+
+
+ template <class Field, class Vector>
+ inline unsigned long &rank (unsigned long &r,
+ const SparseMatrix<Field, Vector> &A,
+ const RingCategories::ModularTag &tag,
+ const Method::Elimination &m)
+ {
+ return rank(r, A, tag, Method::SparseElimination(m));
+ }
+
+
+ // specialization of NonBlas for SparseMatrix
+ template <class Blackbox>
+ inline unsigned long &rank (unsigned long &r,
+ const Blackbox &A,
+ const RingCategories::ModularTag &tag,
+ const Method::NonBlasElimination & m)
+ {
+ return rank(r, A, tag, Method::SparseElimination(m));
+ }
+
+
+ template <class Blackbox>
+ inline unsigned long &rank (unsigned long &r,
+ const Blackbox &A,
+ const RingCategories::ModularTag &tag,
+ const Method::Blackbox &m);
+
+
+
+ /// M may be <code>Method::Wiedemann()</code>.
+ template <class Blackbox>
+ inline unsigned long &rank (unsigned long &res,
+ const Blackbox &A,
+ const RingCategories::ModularTag &tag,
+ const Method::Wiedemann &M)
+ //! @bug This is too much for solutions. It belongs in algorithms
+ {
+
+ typedef typename Blackbox::Field Field;
+ const Field F = A.field();
+ typename Field::RandIter iter (F);
+
+ if (M.symmetric()) {
+ commentator().start ("Symmetric Rank", "srank");
+
+
+ BlasVector<Field> d1(F);
+ size_t i;
+
+ VectorWrapper::ensureDim (d1, A.coldim ());
+
+ for (i = 0; i < A.coldim (); i++)
+ do iter.random (d1[i]); while (F.isZero (d1[i]));
+
+
+ typedef Compose<Compose<Diagonal<Field>,Blackbox >, Diagonal<Field> > BlackBox1;
+ Diagonal<Field> D0 (d1);
+ Compose<Diagonal<Field>,Blackbox > B0 (&D0, &A);
+ BlackBox1 B (&B0, &D0);
+
+ BlackboxContainerSymmetric<Field, BlackBox1> TF (&B, F, iter);
+ MasseyDomain<Field, BlackboxContainerSymmetric<Field, BlackBox1> > WD (&TF, M.earlyTermThreshold ());
+ BlasVector<Field> phi(F);
+ WD.pseudo_minpoly (phi, res);
+ commentator().report(Commentator::LEVEL_ALWAYS,INTERNAL_DESCRIPTION) << "Pseudo Minpoly degree: " << res << std::endl;
+
+ commentator().start ("Monte Carlo certification (1)", "trace");
+ typename Field::Element t, p2; F.assign(p2, F.zero);
+ trace(t, B);
+ if (phi.size() >= 2) F.neg(p2, phi[ phi.size()-2]);
+
+ int nbperm = 0; unsigned long rk;
+ int logn = (int)(2*(unsigned long)floor( log( (double)A.rowdim() ) ));
+ bool tryagain = (! F.areEqual( t, p2 ));
+ while( tryagain ) {
+ commentator().stop ("fail", NULL, "trace");
+#if 0
+
+ Permutation<Field> P(A.rowdim(), F);
+ for (i = 0; i < A.rowdim (); ++i)
+ P.permute( rand() % A.rowdim() , rand() % A.rowdim() );
+ for (i = 0; i < A.rowdim (); ++i)
+ P.permute( rand() % A.rowdim() , rand() % A.rowdim() );
+
+ Transpose< Permutation<Field> > TP(&P);
+ typedef Compose< Permutation<Field>, Blackbox > BlackboxP;
+ typedef Compose< Compose< Permutation<Field>, Blackbox >, Transpose< Permutation<Field> > > BlackboxPAP;
+ BlackboxP PA(&P, &A);
+ BlackboxPAP BP( &PA , &TP );
+
+ for (i = 0; i < A.coldim (); i++)
+ do iter.random (d1[i]); while (F.isZero (d1[i]));
+ Diagonal<Field> D1 (F, d1);
+ Compose<Diagonal<Field>,BlackboxPAP > B1 (&D1, &BP);
+ typedef Compose<Compose<Diagonal<Field>,BlackboxPAP >, Diagonal<Field> > BlackBox2;
+ BlackBox2 B (&B1, &D1);
+#endif
+
+ for (i = 0; i < A.coldim (); i++)
+ do iter.random (d1[i]); while (F.isZero (d1[i]));
+ Diagonal<Field> D1 (d1);
+ Compose<Diagonal<Field>,Blackbox > B1 (&D1, &A);
+ BlackBox1 B2 (&B1, &D1);
+
+ BlackboxContainerSymmetric<Field, BlackBox1> TF1 (&B2, F, iter);
+ MasseyDomain<Field, BlackboxContainerSymmetric<Field, BlackBox1> > WD1 (&TF1, M.earlyTermThreshold ());
+
+ WD1.pseudo_minpoly (phi, rk);
+ commentator().report(Commentator::LEVEL_ALWAYS,INTERNAL_DESCRIPTION) << "Permuted pseudo Minpoly degree: " << res << std::endl;
+ commentator().start ("Monte Carlo certification (2)", "trace");
+ if (phi.size() >= 2) F.neg(p2, phi[ phi.size()-2]);
+
+ trace(t, B2);
+
+ tryagain = (! F.areEqual( t, p2 ));
+ if (res > rk)
+ tryagain = true;
+ else
+ res = rk;
+ if( ++nbperm > logn) break;
+ }
+ commentator().report(Commentator::LEVEL_ALWAYS,INTERNAL_DESCRIPTION) << "symm permutations : " << nbperm << std::endl;
+ nbperm = 0;
+ while(tryagain) {
+ commentator().stop ("fail", NULL, "trace");
+ // F.write( F.write( commentator().report(Commentator::LEVEL_ALWAYS,INTERNAL_DESCRIPTION)
+ // << "end trace: ", t) << ", p2: ", p2) << std::endl;
+ typename Field::RandIter r (F);
+ typename CekstvSwitch<Field>::Factory factory (r);
+ typedef Butterfly<Field, CekstvSwitch<Field> > ButterflyP;
+ ButterflyP P (F, A.rowdim(), factory);
+ for (i = 0; i < A.coldim (); i++)
+ do iter.random (d1[i]); while (F.isZero (d1[i]));
+ Diagonal<Field> D1 (d1);
+ typedef Compose< ButterflyP, Diagonal<Field> > ButD;
+ ButD PD(&P, &D1);
+
+ Transpose< ButD > TP (&PD);
+
+ Compose< ButD, Blackbox > B1( &PD, &A);
+
+ typedef Compose< Compose< ButD, Blackbox > , Transpose< ButD > > BlackBoxBAB;
+ BlackBoxBAB PAP(&B1, &TP);
+
+ BlackboxContainerSymmetric<Field, BlackBoxBAB> TF1 (&PAP, F, iter);
+ MasseyDomain<Field, BlackboxContainerSymmetric<Field, BlackBoxBAB> > WD1 (&TF1, M.earlyTermThreshold ());
+
+ WD1.pseudo_minpoly (phi, rk);
+ commentator().report(Commentator::LEVEL_ALWAYS,INTERNAL_DESCRIPTION) << "Butterfly pseudo Minpoly degree: " << res << std::endl;
+ commentator().start ("Monte Carlo certification (3)", "trace");
+ if (phi.size() >= 2) F.neg(p2, phi[ phi.size()-2]);
+
+ trace(t, PAP);
+
+ tryagain = (! F.areEqual( t, p2 ));
+ if (res > rk)
+ tryagain = true;
+ else
+ res = rk;
+ ++nbperm;
+ }
+
+ // F.write( F.write( commentator().report(Commentator::LEVEL_ALWAYS,INTERNAL_DESCRIPTION)
+ // << "end trace: ", t) << ", p2: ", p2) << std::endl;
+
+ commentator().report(Commentator::LEVEL_ALWAYS,INTERNAL_DESCRIPTION) << "butterflies : " << nbperm << std::endl;
+
+ commentator().stop ("success", NULL, "trace");
+ commentator().stop ("done", NULL, "srank");
+
+ return res;
+ }
+ else {
+
+ commentator().start ("Rank", "wrank");
+
+ BlasVector<Field> d1(F), d2(F);
+ size_t i;
+
+ VectorWrapper::ensureDim (d1, A.coldim ());
+ VectorWrapper::ensureDim (d2, A.rowdim ());
+
+ for (i = 0; i < A.coldim (); i++)
+ do iter.random (d1[i]); while (F.isZero (d1[i]));
+
+ for (i = 0; i < A.rowdim (); i++)
+ do iter.random (d2[i]); while (F.isZero (d2[i]));
+
+ Diagonal<Field> D1_i (d1), D2_i (d2);
+ Transpose<Blackbox> AT_i (&A);
+
+ Compose<Diagonal<Field>,Transpose<Blackbox> > B1_i (&D1_i, &AT_i);
+ Compose<Compose<Diagonal<Field>,Transpose<Blackbox> >, Diagonal<Field> > B2_i (&B1_i, &D2_i);
+ Compose<Compose<Compose<Diagonal<Field>,Transpose<Blackbox> >, Diagonal<Field> >, Blackbox> B3_i (&B2_i, &A);
+ // Here there is an extra diagonal computation
+ // The probability of success is also divided by two, as
+ // D2_i^2 contains only squares and squares are half the total elements
+ typedef Compose<Compose<Compose<Compose<Diagonal<Field>,Transpose<Blackbox> >, Diagonal<Field> >, Blackbox>, Diagonal<Field> > Blackbox0;
+ Blackbox0 B_i (&B3_i, &D1_i);
+
+ BlackboxContainerSymmetric<Field, Blackbox0> TF_i (&B_i, F, iter);
+ MasseyDomain<Field, BlackboxContainerSymmetric<Field, Blackbox0> > WD (&TF_i, M.earlyTermThreshold ());
+
+ BlasVector<Field> phi(F);
+ WD.pseudo_minpoly (phi, res);
+ commentator().report(Commentator::LEVEL_ALWAYS,INTERNAL_DESCRIPTION) << "Pseudo Minpoly degree: " << res << std::endl;
+ commentator().start ("Monte Carlo certification (4)", "trace");
+
+ typename Field::Element t, p2; F.assign(p2, F.zero);
+ // trace(t, B_i);
+ WhisartTraceTranspose(t, F, D1_i, A, D2_i);
+ if (phi.size() >= 2) F.neg(p2, phi[ phi.size()-2]);
+
+ int nbperm = 0; unsigned long rk;
+ int logn = (int)(2*(unsigned long)floor( log( (double)A.rowdim() ) ));
+ bool tryagain = (! F.areEqual( t, p2 ));
+ while( tryagain ) {
+ commentator().stop ("fail", NULL, "trace");
+ Permutation<Field> P((int)A.rowdim(), F);
+ for (i = 0; i < A.rowdim (); ++i)
+ P.permute( (size_t)rand() % A.rowdim() , (size_t)rand() % A.rowdim() );
+ for (i = 0; i < A.rowdim (); ++i)
+ P.permute( (size_t)rand() % A.rowdim() , (size_t)rand() % A.rowdim() );
+
+ typedef Compose< Permutation<Field>, Blackbox > BlackboxP;
+ BlackboxP BP(&P, &A);
+
+ for (i = 0; i < A.coldim (); i++)
+ do iter.random (d1[i]); while (F.isZero (d1[i]));
+
+ for (i = 0; i < A.rowdim (); i++)
+ do iter.random (d2[i]); while (F.isZero (d2[i]));
+
+ Diagonal<Field> D1 (d1), D2 (d2);
+ Transpose<BlackboxP> AT (&BP);
+
+ Compose<Diagonal<Field>,Transpose<BlackboxP> > B1 (&D1, &AT);
+ Compose<Compose<Diagonal<Field>,Transpose<BlackboxP> >, Diagonal<Field> > B2 (&B1, &D2);
+ Compose<Compose<Compose<Diagonal<Field>,Transpose<BlackboxP> >, Diagonal<Field> >, BlackboxP> B3 (&B2, &BP);
+ typedef Compose<Compose<Compose<Compose<Diagonal<Field>,Transpose<BlackboxP> >, Diagonal<Field> >, BlackboxP>, Diagonal<Field> > Blackbox1;
+ Blackbox1 B (&B3, &D1);
+
+ BlackboxContainerSymmetric<Field, Blackbox1> TF (&B, F, iter);
+ MasseyDomain<Field, BlackboxContainerSymmetric<Field, Blackbox1> > MD (&TF, M.earlyTermThreshold ());
+
+ MD.pseudo_minpoly (phi, rk);
+ commentator().report(Commentator::LEVEL_ALWAYS,INTERNAL_DESCRIPTION) << "Permuted pseudo Minpoly degree: " << rk << std::endl;
+ commentator().start ("Monte Carlo certification (5)", "trace");
+ if (phi.size() >= 2) F.neg(p2, phi[ phi.size()-2]);
+
+ // trace(t, B);
+ WhisartTraceTranspose(t, F, D1, BP, D2);
+ tryagain = (! F.areEqual( t, p2 ));
+ if (res > rk)
+ tryagain = true;
+ else
+ res = rk;
+ if( ++nbperm > logn) break;
+ }
+ commentator().report(Commentator::LEVEL_ALWAYS,INTERNAL_DESCRIPTION) << "permutations : " << nbperm << std::endl;
+ nbperm = 0;
+ while(tryagain) {
+ commentator().stop ("fail", NULL, "trace");
+ typename Field::RandIter r (F);
+ typename CekstvSwitch<Field>::Factory factory (r);
+ typedef Butterfly<Field, CekstvSwitch<Field> > ButterflyP;
+ ButterflyP P (F, A.rowdim(), factory);
+
+ typedef Compose< ButterflyP, Blackbox > BlackboxP;
+ BlackboxP BP(&P, &A);
+
+ for (i = 0; i < A.coldim (); i++)
+ do iter.random (d1[i]); while (F.isZero (d1[i]));
+
+ for (i = 0; i < A.rowdim (); i++)
+ do iter.random (d2[i]); while (F.isZero (d2[i]));
+
+ Diagonal<Field> D1 (d1), D2 (d2);
+ Transpose<BlackboxP> AT (&BP);
+
+ Compose<Diagonal<Field>,Transpose<BlackboxP> > B1 (&D1, &AT);
+ Compose<Compose<Diagonal<Field>,Transpose<BlackboxP> >, Diagonal<Field> > B2 (&B1, &D2);
+ Compose<Compose<Compose<Diagonal<Field>,Transpose<BlackboxP> >, Diagonal<Field> >, BlackboxP> B3 (&B2, &BP);
+ typedef Compose<Compose<Compose<Compose<Diagonal<Field>,Transpose<BlackboxP> >, Diagonal<Field> >, BlackboxP>, Diagonal<Field> > Blackbox1;
+ Blackbox1 B (&B3, &D1);
+
+ BlackboxContainerSymmetric<Field, Blackbox1> TF (&B, F, iter);
+ MasseyDomain<Field, BlackboxContainerSymmetric<Field, Blackbox1> > MD (&TF, M.earlyTermThreshold ());
+
+ MD.pseudo_minpoly (phi, rk);
+ commentator().report(Commentator::LEVEL_ALWAYS,INTERNAL_DESCRIPTION) << "Butterfly pseudo Minpoly degree: " << rk << std::endl;
+ commentator().start ("Monte Carlo certification (6)", "trace");
+ if (phi.size() >= 2) F.neg(p2, phi[ phi.size()-2]);
+
+ // trace(t, B);
+ WhisartTraceTranspose(t, F, D1, BP, D2);
+ // std::cout << t << ',' << p2 << std::endl;
+ tryagain = (! F.areEqual( t, p2 ));
+ if (res > rk)
+ tryagain = true;
+ else
+ res = rk;
+ ++nbperm;
+ }
+ commentator().report(Commentator::LEVEL_ALWAYS,INTERNAL_DESCRIPTION) << "butterflies : " << nbperm << std::endl;
+ commentator().stop ("success", NULL, "trace");
+ commentator().stop ("done", NULL, "wrank");
+
+ return res;
+ }
+
+ }
+
+ /// M may be <code>Method::SparseElimination()</code>.
+ template <class Field>
+ inline unsigned long &rank (unsigned long &r,
+ const SparseMatrix<Field, SparseMatrixFormat::SparseSeq> &A,
+ const RingCategories::ModularTag &tag,
+ const Method::SparseElimination &M)
+ {
+ // We make a copy as these data will be destroyed
+ SparseMatrix<Field, SparseMatrixFormat::SparseSeq> A1 (A);
+ return rankin(r, A1, tag, M);
+ }
+
+ // Change of representation to be able to call the sparse elimination
+ template <class Blackbox>
+ inline unsigned long &rank (unsigned long &r,
+ const Blackbox &A,
+ const RingCategories::ModularTag &tag,
+ const Method::SparseElimination &M)
+ {
+ typedef typename Blackbox::Field Field;
+ //! @bug choose (benchmark) best representation for Sparse Elimination
+ typedef SparseMatrix<Field, __LINBOX_rank_sparse_elimination_format > SparseBB;
+ // typedef Blackbox SparseBB;
+ SparseBB SpA(A.field(), A.rowdim(), A.coldim() );
+ MatrixHom::map(SpA, A);
+ return rankin(r, SpA, tag, M);
+ }
+
+ // M may be <code>Method::BlasElimination()</code>.
+ template <class Blackbox>
+ inline unsigned long &rank (unsigned long &r,
+ const Blackbox &A,
+ const RingCategories::ModularTag &tag,
+ const Method::BlasElimination &M)
+ {
+
+ commentator().start ("Blas Rank", "blasrank");
+ typedef typename Blackbox::Field Field;
+ const Field F = A.field();
+ integer a, b; F.characteristic(a); F.cardinality(b);
+ linbox_check( a == b );
+ linbox_check( a < LinBox::BlasBound);
+ BlasMatrix<Field> B(A);
+ BlasMatrixDomain<Field> D(F);
+ r = D.rankin(B);
+ commentator().stop ("done", NULL, "blasrank");
+ return r;
+ }
+
+
+
+ template <class Blackbox, class MyMethod>
+ inline unsigned long &rank (unsigned long &r,
+ const Blackbox &A,
+ const RingCategories::IntegerTag &tag,
+ const MyMethod &M)
+ {
+ commentator().start ("Integer Rank", "iirank");
+ typedef Givaro::Modular<double> projField;
+ integer mmodulus;
+ FieldTraits<projField>::maxModulus(mmodulus);
+ RandomPrimeIterator genprime( (unsigned) floor (log((double)mmodulus) ) );
+ ++genprime;
+ typedef typename Blackbox::template rebind< projField >::other FBlackbox;
+ const projField Fp(*genprime);
+ FBlackbox Ap(A, Fp );
+
+// FBlackbox Ap(Fp, A.rowdim(), A.coldim() );
+// typename Blackbox::template rebind<projField>()(Ap,A);
+
+
+ commentator().report (Commentator::LEVEL_ALWAYS,INTERNAL_DESCRIPTION) << "Integer Rank is done modulo " << *genprime << std::endl;
+
+ rank(r, Ap, RingCategories::ModularTag(), M);
+ commentator().stop ("done", NULL, "iirank");
+ return r;
+ }
+} // LinBox
+
+
+#ifndef LINBOX_EXTENSION_DEGREE_MAX
+#define LINBOX_EXTENSION_DEGREE_MAX 19
+#endif
+
+namespace LinBox
+{
+ template <class Blackbox>
+ inline unsigned long &rank (unsigned long &r,
+ const Blackbox &A,
+ const RingCategories::ModularTag &tag,
+ const Method::Blackbox & m)
+ {
+ commentator().start ("BB Rank", "extend");
+ if (m.certificate()) {
+ typedef typename Blackbox::Field Field;
+ const Field& F = A.field();
+ integer a,c; F.cardinality(a); F.characteristic(c);
+ if (a != c) {
+ uint64_t extend = (uint64_t)Givaro::FF_EXPONENT_MAX(a,(integer)LINBOX_EXTENSION_DEGREE_MAX);
+ if (extend > 1) {
+ commentator().report (Commentator::LEVEL_ALWAYS,INTERNAL_WARNING) << "Extension of degree " << extend << std::endl;
+ Givaro::Extension<Field> EF( F, typename Givaro::Extension<Field>::Residu_t(extend));
+ typedef typename Blackbox::template rebind< Givaro::Extension<Field> >::other FBlackbox;
+ FBlackbox Ap(A, EF);
+ rank(r, Ap, tag, Method::Wiedemann(m));
+ }
+ else
+ rank(r, A, tag, Method::Wiedemann(m));
+ }
+ else {
+ uint64_t extend = (uint64_t)Givaro::FF_EXPONENT_MAX(c,(integer)LINBOX_EXTENSION_DEGREE_MAX);
+ if (extend > 1) {
+ commentator().report (Commentator::LEVEL_ALWAYS,INTERNAL_WARNING) << "Word size extension : " << extend << std::endl;
+ const Givaro::GFqDom<int64_t> EF( (uint64_t)c, extend);
+ typedef typename Blackbox::template rebind< Givaro::GFqDom<int64_t> >::other FBlackbox;
+ FBlackbox Ap(A, EF);
+ rank(r, Ap, tag, Method::Wiedemann(m));
+ }
+ else
+ rank(r, A, tag, Method::Wiedemann(m));
+ }
+ }
+ else
+ rank(r, A, tag, Method::Wiedemann(m));
+ commentator().stop ("done", NULL, "extend");
+ return r;
+ }
+}
+
+/*namespace LinBox
+{
+ template <class Blackbox>
+ inline unsigned long &rank (unsigned long &r,
+ const Blackbox &A,
+ const RingCategories::ModularTag &tag,
+ const Method::Blackbox & m)
+ {
+ return rank(r, A, tag, Method::Wiedemann(m));
+ }
+}*/
+
+namespace LinBox { /* rankin */
+
+ template <class Field, class Method>
+ inline unsigned long &rankin (unsigned long &r,
+ SparseMatrix<Field, SparseMatrixFormat::SparseSeq> &A,
+ const Method &M)
+ {
+ return rankin(r, A, typename FieldTraits<Field>::categoryTag(), M);
+ }
+
+
+ template <class Blackbox, class Ring>
+ inline unsigned long &rankin (unsigned long &r,
+ Blackbox &A,
+ const RingCategories::IntegerTag &tag,
+ const Method::SparseElimination &M)
+ {
+ commentator().start ("Integer Rank inplace", "irank");
+ typedef Givaro::Modular<double> Field;
+ integer mmodulus;
+ FieldTraits<Field>::maxModulus(mmodulus);
+ RandomPrimeIterator genprime( (unsigned int) floor (log((double)mmodulus) ) );
+ ++genprime;
+ typedef typename Blackbox::template rebind< Field >::other FBlackbox;
+ const Field Fp(*genprime);
+ FBlackbox Ap(A, Fp);
+ commentator().report (Commentator::LEVEL_ALWAYS,INTERNAL_WARNING) << "Integer Rank is done modulo " << *genprime << std::endl;
+ rankin(r, Ap, RingCategories::ModularTag(), M);
+ commentator().stop ("done", NULL, "irank");
+ return r;
+ }
+
+ template <class Field>
+ inline unsigned long &rankin (unsigned long &r,
+ SparseMatrix<Field, SparseMatrixFormat::SparseSeq > &A,
+ const RingCategories::ModularTag &tag,
+ const Method::SparseElimination &M)
+ {
+ commentator().start ("Sparse Elimination Rank", "serank");
+ GaussDomain<Field> GD ( A.field() );
+ GD.rankin (r, A, M.strategy ());
+ commentator().stop ("done", NULL, "serank");
+ return r;
+ }
+
+ /// specialization to \f$ \mathbf{F}_2 \f$
+ inline unsigned long &rankin (unsigned long &r,
+ GaussDomain<GF2>::Matrix &A,
+ const Method::SparseElimination &)//M
+ {
+ commentator().start ("Sparse Elimination Rank over GF2", "serankmod2");
+ GaussDomain<GF2> GD ( A.field() );
+ GD.rankin (r, A, Specifier::PIVOT_LINEAR);
+ commentator().stop ("done", NULL, "serankmod2");
+ return r;
+ }
+
+ /// specialization to \f$ \mathbf{F}_2 \f$
+ inline unsigned long &rankin (unsigned long &r,
+ GaussDomain<GF2>::Matrix &A,
+ const RingCategories::ModularTag &,//tag
+ const Method::SparseElimination &M)
+ {
+ return rankin(r, A, M);
+ }
+
+
+ // is this used?
+ // A is modified.
+ template <class Matrix>
+ inline unsigned long &rankin (unsigned long &r,
+ Matrix &A,
+ const RingCategories::ModularTag &tag,
+ const Method::SparseElimination &M)
+ {
+ typedef typename Matrix::Field Field;
+ const Field F = A.field();
+ GaussDomain<Field> GD (F);
+ GD.rankin( r, A, M.strategy ());
+ return r;
+ }
+
+ /// A is modified.
+ template <class Field>
+ inline unsigned long &rankin (unsigned long &r,
+ BlasMatrix<Field> &A,
+ const RingCategories::ModularTag &tag,
+ const Method::BlasElimination &M)
+ {
+
+ commentator().start ("BlasBB Rank", "blasbbrank");
+ const Field F = A.field();
+ BlasMatrixDomain<Field> D(F);
+ r = D.rankin(static_cast< BlasMatrix<Field>& >(A));
+ commentator().stop ("done", NULL, "blasbbrank");
+ return r;
+ }
+
+} // LinBox
+
+#endif // __LINBOX_rank_INL
+
+
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/solutions/smith-form.h b/linbox/solutions/smith-form.h
index e4d4b88..94d5a05 100644
--- a/linbox/solutions/smith-form.h
+++ b/linbox/solutions/smith-form.h
@@ -27,20 +27,23 @@
#include <list>
#include <vector>
+#include <iterator>
#include "linbox/util/error.h"
#include "linbox/algorithms/matrix-hom.h"
-#ifdef __LINBOX_HAVE_NTL
+//#ifdef __LINBOX_HAVE_NTL
#include "linbox/algorithms/smith-form-adaptive.h"
-#endif
-#include "linbox/field/PID-integer.h"
+//#endif
+#include "givaro/zring.h"
//#include "linbox/algorithms/smith-form.h"
//#include "linbox/algorithms/smith-form-local.h"
namespace LinBox
{
+ //! no doc.
template<class I1, class Lp>
void distinct (I1 a, I1 b, Lp& c)
- { typename I1::value_type e;
+ {
+ typename iterator_traits<I1>::value_type e;
size_t count = 0;
if (a != b) {e = *a; ++a; count = 1;}
else return;
@@ -81,6 +84,7 @@ namespace LinBox
return S;
}
+#if 0
// for specialization with respect to the DomainCategory
template< class Output, class Blackbox, class SmithMethod, class DomainCategory>
Output &smithForm(Output & S,
@@ -91,6 +95,7 @@ namespace LinBox
throw LinBoxError( "Smith form solution implemented only for NTL.\n Please reconfigure LinBox with NTL enabled.");
}
+#endif
// The smithForm with default Method
template<class Output, class Blackbox>
Output &smithForm(Output& S,
@@ -146,23 +151,27 @@ namespace LinBox
}
#endif
-#ifdef __LINBOX_HAVE_NTL
+//#ifdef __LINBOX_HAVE_NTL
- template<>
+ /*template<>
std::list<std::pair<integer, size_t> > &
smithForm(std::list<std::pair<integer, size_t> >& S,
- const BlasMatrix<PID_integer> &A,
+ */
+ template<class Output> Output&
+ smithForm(Output & S,
+ const BlasMatrix<Givaro::ZRing<Integer> > &A,
const RingCategories::IntegerTag &tag,
const Method::Hybrid & M)
{
- std::vector<integer> v (A.rowdim() < A.coldim() ? A.rowdim() : A.coldim());
+ Givaro::ZRing<Integer> Z;
+ BlasVector<Givaro::ZRing<Integer> > v (Z,A.rowdim() < A.coldim() ? A.rowdim() : A.coldim());
SmithFormAdaptive::smithForm(v, A);
distinct(v.begin(), v.end(), S);
return S;
}
-#endif
+//#endif
#if 0
// The smithForm with BlackBox Method
@@ -181,11 +190,11 @@ namespace LinBox
#endif // __LINBOX_smith_form_H
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
// Local Variables:
// mode: C++
// tab-width: 8
// indent-tabs-mode: nil
// c-basic-offset: 8
// End:
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/solutions/solution-tags.h b/linbox/solutions/solution-tags.h
new file mode 100644
index 0000000..2727413
--- /dev/null
+++ b/linbox/solutions/solution-tags.h
@@ -0,0 +1,56 @@
+/* linbox/solutions/methods.h
+ *
+ * Written by -bds
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ * ========LICENCE========
+ *.
+ */
+
+/*! @file solutions/solution-tags.h
+ * @ingroup solutions
+ * @brief This allows files defining objects that have traits concerning several solutions
+ to get the tags and traits with one inclusion.
+ */
+
+#ifndef __LINBOX_solution_tags_H
+#define __LINBOX_solution_tags_H
+
+namespace LinBox
+{
+ namespace SolutionTags {
+ struct Generic{}; // use for the general case
+ struct Local{}; // use if the object has a local function to perform the solution.
+ } // SolutionTags
+
+ template<class BB> struct GetEntryCategory;
+ template<class BB> struct TraceCategory;
+ template<class BB> struct DetCategory;
+ template<class BB> struct RankCategory;
+}
+#endif // __LINBOX_solution_tags_H
+
+
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+
diff --git a/linbox/solutions/solve.h b/linbox/solutions/solve.h
index a8df961..445bfef 100644
--- a/linbox/solutions/solve.h
+++ b/linbox/solutions/solve.h
@@ -32,7 +32,6 @@
* @details NO DOC
*/
-#include <vector>
#include <algorithm>
// must fix this list...
@@ -50,6 +49,8 @@
#include "linbox/algorithms/rational-cra2.h"
#include "linbox/algorithms/varprec-cra-early-multip.h"
+#include "linbox/algorithms/block-wiedemann.h"
+#include "linbox/algorithms/coppersmith.h"
#ifdef __LINBOX_HAVE_IML
#include "linbox/util/iml_wrapper.h"
@@ -149,7 +150,7 @@ namespace LinBox
//! @internal inplace Sparse Elimination.
template <class Vector, class Field>
- Vector& solvein(Vector& x, SparseMatrix<Field, typename LinBox::Vector<Field>::SparseSeq>& A, const Vector& b, const Method::SparseElimination& m)
+ Vector& solvein(Vector& x, SparseMatrix<Field, SparseMatrixFormat::SparseSeq>& A, const Vector& b, const Method::SparseElimination& m)
{
commentator().start ("Sparse Elimination Solve In Place", "sesolvein");
GaussDomain<Field> GD ( A.field() );
@@ -159,7 +160,7 @@ namespace LinBox
}
template <class Vector, class Field, class Random>
- Vector& solvein(Vector& x, SparseMatrix<Field, typename LinBox::Vector<Field>::SparseSeq>& A, const Vector& b, const Method::SparseElimination& m, Random& generator)
+ Vector& solvein(Vector& x, SparseMatrix<Field, SparseMatrixFormat::SparseSeq>& A, const Vector& b, const Method::SparseElimination& m, Random& generator)
{
commentator().start ("Sparse Elimination Solve In Place with random solution", "sesolvein");
GaussDomain<Field> GD ( A.field() );
@@ -175,9 +176,9 @@ namespace LinBox
const Method::SparseElimination& m)
{
typedef typename Blackbox::Field Field;
- typedef SparseMatrix<Field, typename LinBox::Vector<Field>::SparseSeq> SparseBB;
+ typedef SparseMatrix<Field,SparseMatrixFormat::SparseSeq> SparseBB;
SparseBB SpA(A.field(), A.rowdim(), A.coldim());
- MatrixHom::map(SpA, A, A.field());
+ MatrixHom::map(SpA, A);
return solvein(x, SpA, b, m);
}
@@ -186,9 +187,9 @@ namespace LinBox
const Method::SparseElimination& m, Random& generator)
{
typedef typename Blackbox::Field Field;
- typedef SparseMatrix<Field, typename LinBox::Vector<Field>::SparseSeq> SparseBB;
+ typedef SparseMatrix<Field,SparseMatrixFormat::SparseSeq> SparseBB;
SparseBB SpA(A.field(), A.rowdim(), A.coldim());
- MatrixHom::map(SpA, A, A.field());
+ MatrixHom::map(SpA, A);
return solvein(x, SpA, b, generator);
}
@@ -209,7 +210,7 @@ namespace LinBox
Vector& solvein(Vector& x,
GaussDomain<GF2>::Matrix &A,
const Vector& b,
- const Method::SparseElimination& m,
+ const Method::SparseElimination& m,
Random& generator)
{
commentator().start ("Sparse Elimination Solve In Place over GF2", "GF2sesolvein");
@@ -259,8 +260,7 @@ namespace LinBox
#if 0
if ( ! consistent ) { // we will return the zero vector
- typename Field::Element zero; A.field().init(zero, 0);
- for (typename Vector::iterator i = x.begin(); i != x.end(); ++i) *i = zero;
+ for (typename Vector::iterator i = x.begin(); i != x.end(); ++i) *i = A.field().zero;
}
return x;
#endif
@@ -296,10 +296,8 @@ namespace LinBox
#if 0
// this should be implemented directly in left_solve
if ( ! consistent ) { // we will return the zero vector
- typename Field::Element zero;
- A.field().init(zero, 0);
for (typename Vector::iterator i = x.begin(); i != x.end(); ++i)
- *i = zero;
+ *i = A.field().zero;
}
#endif
commentator().stop ("done", NULL, "LQUP::left_solve");
@@ -349,15 +347,15 @@ namespace LinBox
size_t bits = 26 -(int)ceil(log((double)A.rowdim())*0.7213475205);
RandomPrimeIterator genprime( bits);
- RationalRemainder2< VarPrecEarlyMultipCRA< Modular<double> > > rra(3UL);//using default RR method
+ RationalRemainder2< VarPrecEarlyMultipCRA< Givaro::Modular<double> > > rra(3UL);//using default RR method
IntegerModularSolve<BB,Vector,MethodTraits > iteration(A, b, m);
integer den;
- std::vector< integer > num(A.coldim());
+ BlasVector<Givaro::ZRing<Integer> > num(A.field(),A.coldim());
rra(num, den, iteration, genprime);
typename RatVector::iterator it_x= x.begin();
- typename std::vector<integer>::const_iterator it_num= num.begin();
+ typename BlasVector<Givaro::ZRing<Integer> >::const_iterator it_num= num.begin();
for (; it_x != x.end(); ++it_x, ++it_num){
integer g = gcd( *it_num, den);
@@ -448,11 +446,11 @@ namespace LinBox
Method::Dixon mDixon(m);
typename Ring::Element d;
- std::vector< typename Ring::Element> num(A.coldim());
+ BlasVector<Ring> num(A.field(),A.coldim());
solve (num, d, A, b, tag, mDixon);
typename RatVector::iterator it_x= x.begin();
- typename std::vector< typename Ring::Element>::const_iterator it_num= num.begin();
+ typename BlasVector<Ring>::const_iterator it_num= num.begin();
integer n,den;
A.field().convert(den,d);
for (; it_x != x.end(); ++it_x, ++it_num){
@@ -514,7 +512,7 @@ namespace LinBox
// input matrix is a SparseMatrix (no copy)
template <class Vect, class Ring>
Vect& solve(Vect& x, typename Ring::Element &d,
- const SparseMatrix<Ring, typename Vector<Ring>::SparseSeq>& A,
+ const SparseMatrix<Ring, SparseMatrixFormat::SparseSeq>& A,
const Vect& b,
const RingCategories::IntegerTag & tag,
const Method::SparseElimination& m)
@@ -536,14 +534,15 @@ namespace LinBox
if ((A.coldim() != x.size()) || (A.rowdim() != b.size()))
throw LinboxError("LinBox ERROR: dimension of data are not compatible in system solving (solving impossible)");
- commentator().start ("Padic Integer Blas-based Solving", "solving");
+ commentator().start ("Padic Integer Blas-based Solving ICI", "solving");
- typedef Modular<double> Field;
+ typedef Givaro::Modular<double> Field;
// 0.7213475205 is an upper approximation of 1/(2log(2))
- RandomPrimeIterator genprime( 26-(int)ceil(log((double)A.rowdim())*0.7213475205));
+ RandomPrimeIterator genprime((unsigned int)( 26-(int)ceil(log((double)A.rowdim())*0.7213475205)));
RationalSolver<Ring, Field, RandomPrimeIterator, DixonTraits> rsolve(A.field(), genprime);
SolverReturnStatus status = SS_OK;
+
// if singularity unknown and matrix is square, we try nonsingular solver
switch ( m.singular() ) {
case Specifier::SINGULARITY_UNKNOWN:
@@ -615,8 +614,7 @@ namespace LinBox
if ( status == SS_INCONSISTENT ) {
throw LinboxMathInconsistentSystem("Linear system is inconsistent");
- // typename Ring::Element zero; A.field().init(zero, 0);
- // for (typename Vector::iterator i = x.begin(); i != x.end(); ++i) *i = zero;
+ // for (typename Vector::iterator i = x.begin(); i != x.end(); ++i) *i = A.field().zero;
}
return x;
}
@@ -625,7 +623,7 @@ namespace LinBox
*/
template <class Vect, class Ring>
Vect& solve(Vect& x, typename Ring::Element &d,
- const SparseMatrix<Ring, typename Vector<Ring>::SparseSeq> & A,
+ const SparseMatrix<Ring, SparseMatrixFormat::SparseSeq> & A,
const Vect& b,
const RingCategories::IntegerTag tag,
Method::Dixon& m)
@@ -635,12 +633,11 @@ namespace LinBox
commentator().start ("Padic Integer Sparse Elimination Solving", "solving");
- typedef Modular<double> Field;
+ typedef Givaro::Modular<double> Field;
// 0.7213475205 is an upper approximation of 1/(2log(2))
- RandomPrimeIterator genprime( 26-(int)ceil(log((double)A.rowdim())*0.7213475205));
+ RandomPrimeIterator genprime((unsigned int) (26-(int)ceil(log((double)A.rowdim())*0.7213475205)));
RationalSolver<Ring, Field, RandomPrimeIterator, SparseEliminationTraits> rsolve(A.field(), genprime);
SolverReturnStatus status = SS_OK;
-
// if singularity unknown and matrix is square, we try nonsingular solver
switch ( m.singular() ) {
case Specifier::SINGULARITY_UNKNOWN:
@@ -716,8 +713,7 @@ namespace LinBox
if ( status == SS_INCONSISTENT ) {
throw LinboxMathInconsistentSystem("Linear system is inconsistent");
- // typename Ring::Element zero; A.field().init(zero, 0);
- // for (typename Vect::iterator i = x.begin(); i != x.end(); ++i) *i = zero;
+ // for (typename Vect::iterator i = x.begin(); i != x.end(); ++i) *i = A.field().zero;
}
return x;
}
@@ -756,6 +752,39 @@ namespace LinBox
return x;
}
+ // Only for nonsingular system for now.
+ // may throw SolverFailed or InconsistentSystem
+ template <class Vector, class BB>
+ Vector& solve(Vector& x, const BB& A, const Vector& b,
+ const RingCategories::ModularTag & tag,
+ const Method::BlockWiedemann& m)
+ {
+ if ((A.coldim() != x.size()) || (A.rowdim() != b.size()))
+ throw LinboxError("LinBox ERROR: dimension of data are not compatible in system solving (solving impossible)");
+
+ // adapt to earlier signature of wiedemann solver
+ typedef BlasMatrixDomain<typename BB::Field> Context;
+ Context BMD(A.field());
+ BlockWiedemannSolver<Context> BWS(BMD);
+ BWS.solveNonSingular(x, A, b);
+ return x;
+ }
+
+ // Only for nonsingular system for now.
+ // may throw SolverFailed or InconsistentSystem
+ template <class Vector, class BB>
+ Vector& solve(Vector& x, const BB& A, const Vector& b,
+ const RingCategories::ModularTag & tag,
+ const Method::Coppersmith& m)
+ {
+ if ((A.coldim() != x.size()) || (A.rowdim() != b.size()))
+ throw LinboxError("LinBox ERROR: dimension of data are not compatible in system solving (solving impossible)");
+
+ // adapt to earlier signature of wiedemann solver
+ CoppersmithSolver<typename BB::Field> cs(A.field());
+ cs.solveNonsingular(x, A, b);
+ return x;
+ }
/* remark 1. I used copy constructors when switching method types.
But if the method types are (empty) child classes of a common parent class containing
@@ -766,7 +795,7 @@ namespace LinBox
-#include "linbox/field/modular.h"
+#include "linbox/ring/modular.h"
#include "linbox/algorithms/rational-cra.h"
#include "linbox/algorithms/rational-cra-early-multip.h"
#include "linbox/randiter/random-prime.h"
@@ -793,11 +822,11 @@ namespace LinBox
{
typedef typename Blackbox::template rebind<Field>::other FBlackbox;
FBlackbox Ap(F, A.rowdim(), A.coldim());
- MatrixHom::map(Ap, A, F);
+ MatrixHom::map(Ap, A);
typedef typename Rebind<Vector, Field>::other FVector;
Hom<typename Blackbox::Field, Field> hom(A.field(), F);
- FVector Bp(B.size());
+ FVector Bp(F,B.size());
typename Vector::const_iterator Bit = B.begin();
typename FVector::iterator Bpit = Bp.begin();
for( ; Bit != B.end(); ++Bit, ++Bpit)
@@ -820,21 +849,21 @@ namespace LinBox
commentator().start ("Integer CRA Solve", "Isolve");
- RandomPrimeIterator genprime( 26 -(int)ceil(log((double)A.rowdim())*0.7213475205));
- // RationalRemainder< Modular<double> > rra((double)
+ RandomPrimeIterator genprime((unsigned int)( 26 -(int)ceil(log((double)A.rowdim())*0.7213475205)));
+ // RationalRemainder< Givaro::Modular<double> > rra((double)
// ( A.coldim()/2.0*log((double) A.coldim()) ) );
- RationalRemainder< EarlyMultipRatCRA< Modular<double> > > rra(3UL);
+ RationalRemainder< EarlyMultipRatCRA< Givaro::Modular<double> > > rra(3UL);
IntegerModularSolve<BB,Vector,MyMethod> iteration(A, b, M);
// use of integer due to non genericity of rra (PG 2005-09-01)
Integer den;
- std::vector< Integer > num(A.coldim());
+ BlasVector<Givaro::ZRing<Integer>> num(A.field(),A.coldim());
rra(num, den, iteration, genprime);
//rra(x, d, iteration, genprime);
typename Vector::iterator it_x= x.begin();
- typename std::vector<Integer>::const_iterator it_num= num.begin();
+ typename BlasVector<Givaro::ZRing<Integer>>::const_iterator it_num= num.begin();
// convert the result
for (; it_x != x.end(); ++it_x, ++it_num)
@@ -852,7 +881,9 @@ namespace LinBox
const RingCategories::IntegerTag & tag,
const MyMethod& M)
{
- return solveCRA(x,d,A,b,tag,M);
+ Method::Dixon mDixon(M);
+ return solve(x,d,A,b,tag,mDixon);
+ //return solveCRA(x,d,A,b,tag,M);
}
@@ -877,9 +908,9 @@ namespace LinBox
#ifdef __LINBOX_HAVE_IML
//! IML wrapper.
//! @bug not recognised as template spec...
- std::vector<PID_integer::Element>&
- solveIML(std::vector<PID_integer::Element>& x, PID_integer::Element & d,
- const BlasMatrix<PID_integer>& B, const std::vector<PID_integer::Element>& b,
+ BlasVector<Givaro::ZRing<Integer>>&
+ solveIML(BlasVector<Givaro::ZRing<Integer>>& x, Givaro::ZRing<Integer>::Element & d,
+ const BlasMatrix<Givaro::ZRing<Integer>>& B, const BlasVector<Givaro::ZRing<Integer>>& b,
const Method::IML& m)
{
THIS_CODE_COMPILES_BUT_IS_NOT_TESTED; // NOT MUCH
@@ -887,18 +918,18 @@ namespace LinBox
case(1) : { /* non singular */
linbox_check(B.rowdim()==B.coldim());
mpz_t * mp_A = REINTERP_IML_CONST(B.getPointer()) ;
- // reinterpret_cast<mpz_t*>(const_cast<PID_integer::Element*>((B.getPointer())));
+ // reinterpret_cast<mpz_t*>(const_cast<Givaro::ZRing<Integer>::Element*>((B.getPointer())));
//B.getConstPointer() ?
mpz_t * mp_B = REINTERP_IML_CONST(&b[0]);
mpz_t * mp_N = REINTERP_IML(&x[0]);
mpz_t mp_D ;
mpz_init(mp_D);
if (!m.computeRNS()) {
- IML::nonsingSolvLlhsMM(IML::RightSolu,B.rowdim(),1,
+ IML::nonsingSolvLlhsMM(IML::RightSolu,(long)B.rowdim(),1,
mp_A, mp_B, mp_N, mp_D);
}
else {
- long n = B.coldim();
+ long n = (long)B.coldim();
long basislen = 1;
mpz_t mp_alpha, mp_maxInter;
IML::FiniteField qh;
@@ -914,10 +945,10 @@ namespace LinBox
mpz_clear(mp_maxInter);
mpz_clear(mp_alpha);
/* CRNS[i] = [A_11, A_12] mod basis[i] */
- ARNS = IML_XMALLOC(IML::Double *, basislen);
+ ARNS = IML_XMALLOC(IML::Double *, (size_t)basislen);
for (long i = 0; i < basislen; ++i)
{
- ARNS[i] = IML_XMALLOC(IML::Double, n*n);
+ ARNS[i] = IML_XMALLOC(IML::Double,(size_t)(n*n));
for (long j = 0; j < n; ++j)
for (long l = 0; l < n; l++)
ARNS[i][j*n+l] = (IML::Double) mpz_fdiv_ui(mp_A[j * n + l], basis[i]);
@@ -934,7 +965,7 @@ namespace LinBox
break;
case (2) : { /* certified */
mpz_t * mp_A = REINTERP_IML_CONST(B.getPointer()) ;
- // reinterpret_cast<mpz_t*>(const_cast<PID_integer::Element*>((B.getPointer())));
+ // reinterpret_cast<mpz_t*>(const_cast<Givaro::ZRing<Integer>::Element*>((B.getPointer())));
//B.getConstPointer() ?
mpz_t * mp_b = REINTERP_IML_CONST(&b[0]);
mpz_t * mp_N = REINTERP_IML(&x[0]);
@@ -949,14 +980,14 @@ namespace LinBox
}
if ( !m.reduced() ) {
IML::certSolveMP(m.certificate(),
- B.rowdim(),B.coldim(),
+ (long) B.rowdim(),(long)B.coldim(),
mp_A, mp_b, mp_N, mp_D,
mp_NZ, mp_DZ);
}
else {
IML::certSolveRedMP(m.certificate(),
m.nullcol() //NULLSPACE_COLUMN
- ,B.rowdim(),B.coldim(),
+ ,(long)B.rowdim(),(long)B.coldim(),
mp_A, mp_b, mp_N, mp_D,
mp_NZ, mp_DZ);
@@ -982,10 +1013,10 @@ namespace LinBox
commentator().start ("Rational CRA Solve", "Rsolve");
typename BB::Field::Element den;
- std::vector<typename BB::Field::Element > num(A.coldim());
+ BlasVector<typename BB::Field> num(A.field(),A.coldim());
solve (num, den, A, b, tag, M);
typename RatVector::iterator it_x= x.begin();
- typename std::vector<typename BB::Field::Element>::const_iterator it_num= num.begin();
+ typename BlasVector<typename BB::Field>::const_iterator it_num= num.begin();
integer n,d;
A.field().convert(d,den);
for (; it_x != x.end(); ++it_x, ++it_num){
@@ -1004,15 +1035,16 @@ namespace LinBox
if ((A.coldim() != x.size()) || (A.rowdim() != b.size()))
throw LinboxError("LinBox ERROR: dimension of data are not compatible in system solving (solving impossible)");
commentator().start ("Rational CRA Solve", "Rsolve");
- size_t bits = 26 -(int)ceil(log((double)A.rowdim())*0.7213475205);
+ size_t bits = (size_t)(26 -(int)ceil(log((double)A.rowdim())*0.7213475205));
RandomPrimeIterator genprime( (unsigned) bits);
- RationalRemainder2< VarPrecEarlyMultipCRA< Modular<double> > > rra(3UL);//using default RR method
+ RationalRemainder2< VarPrecEarlyMultipCRA< Givaro::Modular<double> > > rra(3UL);//using default RR method
IntegerModularSolve<BB,Vector,MethodTraits > iteration(A, b, m);
integer den;
- std::vector< integer > num(A.coldim());
+ Givaro::ZRing<Integer> Z ;
+ BlasVector<Givaro::ZRing<Integer>> num(Z,A.coldim());
rra(num, den, iteration, genprime);
typename RatVector::iterator it_x= x.begin();
- typename std::vector<integer>::const_iterator it_num= num.begin();
+ typename BlasVector<Givaro::ZRing<Integer>>::const_iterator it_num= num.begin();
for (; it_x != x.end(); ++it_x, ++it_num){
integer g = gcd( *it_num, den);
*it_x = typename RatVector::value_type(*it_num/g, den/g);
@@ -1029,15 +1061,16 @@ namespace LinBox
if ((A.coldim() != x.size()) || (A.rowdim() != b.size()))
throw LinboxError("LinBox ERROR: dimension of data are not compatible in system solving (solving impossible)");
commentator().start ("Rational CRA Solve", "Rsolve");
- size_t bits = 26 -(int)ceil(log((double)A.rowdim())*0.7213475205);
+ size_t bits = (size_t)(26 -(int)ceil(log((double)A.rowdim())*0.7213475205));
RandomPrimeIterator genprime((unsigned) bits);
- RationalRemainder2< VarPrecEarlyMultipCRA< Modular<double> > > rra(3UL);//using default RR method
+ RationalRemainder2< VarPrecEarlyMultipCRA< Givaro::Modular<double> > > rra(3UL);//using default RR method
IntegerModularSolve<BB,RatVector,MethodTraits > iteration(A, b, m);
integer den;
- std::vector< integer > num(A.coldim());
+ Givaro::ZRing<Integer> Z;
+ BlasVector<Givaro::ZRing<Integer>> num(Z,A.coldim());
rra(num, den, iteration, genprime);
typename RatVector::iterator it_x= x.begin();
- typename std::vector<integer>::const_iterator it_num= num.begin();
+ typename BlasVector<Givaro::ZRing<Integer>>::const_iterator it_num= num.begin();
for (; it_x != x.end(); ++it_x, ++it_num){
integer g = gcd( *it_num, den);
*it_x = typename RatVector::value_type(*it_num/g, den/g);
@@ -1049,14 +1082,14 @@ namespace LinBox
} // LinBox
#include "linbox/config-blas.h"
-#ifdef __LINBOX_HAVE_LAPACK
+#ifdef __LINBOX_HAVE_CLAPACK
#include "linbox/algorithms/numeric-solver-lapack.h"
#include "linbox/algorithms/rational-solver-sn.h"
namespace LinBox {
- std::vector<PID_integer::Element>&
- solveNum(std::vector<PID_integer::Element>& x, PID_integer::Element & d,
- const BlasMatrix<PID_integer>& B, const std::vector<PID_integer::Element>& b,
- const Method::Numerical & m)
+ BlasVector<Givaro::ZRing<Integer>>&
+ solveNum(BlasVector<Givaro::ZRing<Integer>>& x, Givaro::ZRing<Integer>::Element & d,
+ const BlasMatrix<Givaro::ZRing<Integer>>& B, const BlasVector<Givaro::ZRing<Integer>>& b,
+ const Method::NumSymOverlap & m)
{
THIS_CODE_COMPILES_BUT_IS_NOT_TESTED; // NOT MUCH
@@ -1066,7 +1099,8 @@ namespace LinBox {
typedef LPS<FMatrix > NumSolver;
NumSolver numSolver;
bool e = false ;
- RationalSolverSN<PID_integer, NumSolver > rsolver(PID_integer(), numSolver, e);
+ Givaro::ZRing<Integer> Z;
+ RationalSolverSN<Givaro::ZRing<Integer>, NumSolver > rsolver(Z, numSolver, e);
int status = rsolver.solve(x, d, B, b);
if (status)
@@ -1077,21 +1111,22 @@ namespace LinBox {
#endif
namespace LinBox {
- std::vector<PID_integer::Element>&
- solveNum(std::vector<PID_integer::Element>& x, PID_integer::Element & d,
- const BlasMatrix<PID_integer>& B, const std::vector<PID_integer::Element>& b,
- const Method::NumericalWan & m)
+ BlasVector<Givaro::ZRing<Integer>>&
+ solveNum(BlasVector<Givaro::ZRing<Integer>>& x, Givaro::ZRing<Integer>::Element & d,
+ const BlasMatrix<Givaro::ZRing<Integer>>& B, const BlasVector<Givaro::ZRing<Integer>>& b,
+ const Method::NumSymNorm & m)
{
- THIS_CODE_COMPILES_BUT_IS_NOT_TESTED; // NOT MUCH
+ //THIS_CODE_COMPILES_BUT_IS_NOT_TESTED; // NOT MUCH
- typedef Modular<int32_t> ZField;
- // typedef Modular<double> ZField;
- PID_integer ZZ ;
- RationalSolver<PID_integer, ZField, RandomPrimeIterator, WanTraits> rsolver(ZZ);
+ typedef Givaro::Modular<int32_t> ZField;
+ // typedef Givaro::Modular<double> ZField;
+ Givaro::ZRing<Integer> ZZ ;
+ RationalSolver<Givaro::ZRing<Integer>, ZField, RandomPrimeIterator, NumSymNormTraits> rsolver(ZZ);
int status = rsolver.solve(x, d, B, b);
if (status)
- throw "fail" ;
+ // throw "fail" ;
+ std::cerr << "fail:" << status << std::endl;
return x;
}
}
@@ -1100,11 +1135,10 @@ namespace LinBox {
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
// Local Variables:
// mode: C++
// tab-width: 8
// indent-tabs-mode: nil
// c-basic-offset: 8
// End:
-
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/solutions/trace.h b/linbox/solutions/trace.h
index cdf5b04..386f6f5 100644
--- a/linbox/solutions/trace.h
+++ b/linbox/solutions/trace.h
@@ -26,35 +26,11 @@
#ifndef __LINBOX_trace_H
#define __LINBOX_trace_H
-
-#include <vector>
-
-#include "linbox/blackbox/scalar-matrix.h"
-//#include "linbox/blackbox/toeplitz.h"
-#include "linbox/solutions/getentry.h"
+#include "linbox/solutions/solution-tags.h"
namespace LinBox
{
- // Trait to show whether or not the BB class has a local trace function.
- template<class BB> struct TraceCategory;
-
- /// undocumented
- namespace TraceTags
- {
- struct Generic{};
- struct Local{};
- }
-
- template<class BB> struct TraceCategory { typedef TraceTags::Generic Tag; };
-
- template<class Field>
- struct TraceCategory<ScalarMatrix<Field> > { typedef TraceTags::Local Tag; };
-
- //template<class Field, class PD>
- //struct TraceCategory<Toeplitz<Field,PD> > { typedef typename TraceTags::Local Tag; };
-
- // trace
/** \brief Sum of the eigenvalues.
Also it is the sum of the diagonal entries.
@@ -62,42 +38,36 @@ namespace LinBox
Runtime on n by n matrix is n times the cost of getEntry().
This is linear in n for those classes where getEntry is constant time
(eg DenseMatrix and SparseMatrix).
- Trace is constant time when the diagonal is necessarily constant, eg. for ScalarMatrix and Toeplitz.
- Worst case time is cost of n blackbox applies (matrix vector products), and apply cost typically ranges between O(n) and O(n^2).
-
-*/
+ Trace is constant time when the diagonal is necessarily constant,
+ eg. for ScalarMatrix and Toeplitz.
+ Worst case time is cost of n blackbox applies (matrix vector products),
+ and apply cost typically ranges between O(n) and O(n^2).
+ */
template <class BB>
- typename BB::Field::Element& trace(typename BB::Field::Element& t, const BB& A)
- {
- typename TraceCategory<BB>::Tag tt;
- return trace(t, A, tt);
- }
+ typename BB::Field::Element & trace(typename BB::Field::Element & t, const BB& A);
- /* Generic approach. It will be efficient for BBs with efficient getEntry.
- If getEntry is constant time on n by n BB's, trace will be in O(n).
- */
- template <class BB>
- typename BB::Field::Element& trace(typename BB::Field::Element& t, const BB& A, TraceTags::Generic tt)
- {
- typename BB::Field::Element x;
- A.field().init(x, 0);
- A.field().init(t, 0);
- for (size_t i = 0; i < A.coldim(); ++i)
- A.field().addin(t, getEntry(x,A,i,i));
- return t;
- }
+/************* internal forms *******************/
+
+ template <class BB>
+ typename BB::Field::Element& trace(typename BB::Field::Element& t, const BB& A, SolutionTags::Generic tt);
/* Specialization for BB's with local trace function.
Allows constant time trace for, eg., ScalarMatrix, Toeplitz.
- */
+ */
template <class BB>
- typename BB::Field::Element & trace(typename BB::Field::Element & t, const BB& A, TraceTags::Local tt)
- { return A.trace(t); }
+ typename BB::Field::Element & trace(typename BB::Field::Element & t, const BB& A, SolutionTags::Local tt);
+
+ /** Trait to show whether or not the BB class has a local trace function.
+
+ ScalarMatrix<Field> and Toeplitz<Field,PD> have local trace.
+ */
+ template<class BB> struct TraceCategory;
} // namespace LinBox
-#endif // __LINBOX_trace_H
+#include "linbox/solutions/trace.inl"
+#endif // __LINBOX_trace_H
// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
// Local Variables:
diff --git a/linbox/solutions/trace.inl b/linbox/solutions/trace.inl
new file mode 100644
index 0000000..0f6a54b
--- /dev/null
+++ b/linbox/solutions/trace.inl
@@ -0,0 +1,83 @@
+/* linbox/solutions/trace.inl
+ * Copyright(C) LinBox
+ * Evolved from an earlier one by Bradford Hovinen <hovinen at cis.udel.edu>
+ * -bds
+ *
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ * ========LICENCE========
+ *.
+ */
+
+#ifndef __LINBOX_trace_INL
+#define __LINBOX_trace_INL
+
+#include <vector>
+
+#include "linbox/blackbox/scalar-matrix.h"
+#include "linbox/blackbox/toeplitz.h"
+#include "linbox/solutions/getentry.h"
+#include "linbox/solutions/solution-tags.h"
+
+namespace LinBox
+{
+
+ // the unspecialized trace category
+ template<class BB> struct TraceCategory { typedef SolutionTags::Generic Tag; };
+
+ template <class BB>
+ typename BB::Field::Element& trace(typename BB::Field::Element& t, const BB& A)
+ {
+ typename TraceCategory<BB>::Tag tt;
+ return trace(t, A, tt);
+ }
+
+ /* Generic approach. It will be efficient for BBs with efficient getEntry.
+ If getEntry is constant time on n by n BB's, trace will be in O(n).
+ */
+ template <class BB>
+ typename BB::Field::Element& trace(typename BB::Field::Element& t, const BB& A, SolutionTags::Generic tt)
+ {
+ typename BB::Field::Element x;
+ A.field().assign(x, A.field().zero);
+ A.field().assign(t, A.field().zero);
+ for (size_t i = 0; i < A.coldim(); ++i)
+ A.field().addin(t, getEntry(x,A,i,i));
+ return t;
+ }
+
+ /* Specialization for BB's with local trace function.
+ Allows constant time trace for, eg., ScalarMatrix, Toeplitz.
+ */
+ template <class BB>
+ typename BB::Field::Element & trace(typename BB::Field::Element & t, const BB& A, SolutionTags::Local tt)
+ { return A.trace(t); }
+
+} // namespace LinBox
+
+#endif // __LINBOX_trace_INL
+
+
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+
diff --git a/linbox/solutions/valence.h b/linbox/solutions/valence.h
index fa55a86..961a29a 100644
--- a/linbox/solutions/valence.h
+++ b/linbox/solutions/valence.h
@@ -29,7 +29,6 @@
#ifndef __LINBOX_valence_H
#define __LINBOX_valence_H
-#include <vector>
#include "linbox/blackbox/transpose.h"
#include "linbox/solutions/minpoly.h"
@@ -82,27 +81,28 @@ namespace LinBox
const RingCategories::ModularTag &tag,
const MyMethod& M)
{
- typedef typename Blackbox::Field::Element Elt_t;
- std::vector<Elt_t> minp;
+ typedef typename Blackbox::Field Field;
+ BlasVector<Field> minp(A.field());
minpoly(minp, A, tag, M);
- typename std::vector<Elt_t>::const_iterator it = minp.begin();
+ typename BlasVector<Field>::const_iterator it = minp.begin();
for( ; it != minp.end(); ++it)
if (! A.field().isZero(*it)) break;
if (it != minp.end())
return v=*it;
else
- return A.field().init(v,0UL);
+ return A.field().assign(v,A.field().zero);
}
}
-#include "linbox/field/modular.h"
-#include "linbox/field/givaro.h"
+#include <givaro/modular.h>
+#include <typeinfo>
+
+#include "linbox/ring/modular.h"
#include "linbox/algorithms/cra-domain.h"
#include "linbox/algorithms/cra-early-single.h"
#include "linbox/randiter/random-prime.h"
#include "linbox/algorithms/matrix-hom.h"
-#include <typeinfo>
namespace LinBox
{
@@ -120,7 +120,7 @@ namespace LinBox
template<typename Field>
typename Field::Element& operator()(typename Field::Element& v, const Field& F) const
{
- commentator().start ("Modular Valence", "Mvalence");
+ commentator().start ("Givaro::Modular Valence", "Mvalence");
std::ostream& report = commentator().report (Commentator::LEVEL_IMPORTANT, INTERNAL_DESCRIPTION);
F.write(report) << std::endl;
typedef typename Blackbox::template rebind<Field>::other FBlackbox;
@@ -146,10 +146,10 @@ namespace LinBox
commentator().start ("Integer Valence", "Ivalence");
#if __LINBOX_SIZEOF_LONG == 8
RandomPrimeIterator genprime( 31 );
- ChineseRemainder< EarlySingleCRA< GivaroZpz< Givaro::Std64> > > cra(3UL);
+ ChineseRemainder< EarlySingleCRA< Givaro::Modular< int64_t> > > cra(3UL);
#else
RandomPrimeIterator genprime( 26 );
- ChineseRemainder< EarlySingleCRA< Modular<double> > > cra(3UL);
+ ChineseRemainder< EarlySingleCRA< Givaro::Modular<double> > > cra(3UL);
#endif
IntegerModularValence<Blackbox,MyMethod> iteration(A, M);
cra(V, iteration, genprime);
@@ -178,8 +178,9 @@ namespace LinBox
typedef typename Blackbox::Field Ring;
_aat_diag = 0; _aat_radius = 0, _aat_radius1 = 0;
- std::vector< integer > d(A. rowdim()),w(A. coldim());
- std::vector<integer>::iterator di, wi;
+ Givaro::ZRing<Integer> ZZ;
+ BlasVector< Givaro::ZRing<Integer> > d(ZZ, A. rowdim()),w(ZZ, A. coldim());
+ BlasVector<Givaro::ZRing<Integer>>::iterator di, wi;
for(wi = w.begin();wi!= w.end();++wi)
*wi = 0;
for(di = d.begin();di!= d.end();++di)
@@ -196,7 +197,7 @@ namespace LinBox
R. convert (tmp, tmp_e);
if (tmp != 0) {
*di += tmp * tmp;
- w [(int) i] += abs (tmp);
+ w [(size_t) i] += abs (tmp);
}
_aat_diag = _aat_diag >= *di ? _aat_diag : *di;
@@ -209,7 +210,7 @@ namespace LinBox
R. assign (tmp_e, A. getEntry (j, i));
R. convert (tmp, tmp_e);
if (tmp != 0)
- local_radius += abs (tmp) * w[(int)i];
+ local_radius += abs (tmp) * w[(size_t)i];
}
local_radius -= *di;
if ( local_radius > _aat_radius1) {
@@ -231,17 +232,18 @@ namespace LinBox
// compute one valence of AAT over a field
template <class Blackbox>
- static void one_valence(typename Blackbox::Element& v, unsigned long& r, const Blackbox& A)
+ static void one_valence(typename Blackbox::Element& v, size_t& r, const Blackbox& A)
{
//commentator().start ("One valence", "one valence");
- typedef std::vector<typename Blackbox::Element> Poly; Poly poly;
+ typedef BlasVector<typename Blackbox::Field> Poly;
+ Poly poly(A.field());
typename Blackbox::Field F(A. field());
Transpose<Blackbox> AT (&A);
Compose<Blackbox, Transpose<Blackbox> > AAT(&A, &AT);
// compute the minpoly of AAT
minpoly(poly, AAT, Method::Wiedemann());
typename Poly::iterator p;
- F. init (v, 0);
+ F. assign(v, F.zero);
for (p = poly. begin(); p != poly. end(); ++ p)
if (! F. isZero (*p)) {
@@ -264,12 +266,11 @@ namespace LinBox
static void valence(Integer& val, const Blackbox& A)
{
commentator().start ("Valence (AAT)", "Valence");
- typedef Modular<int32_t> Field;
+ typedef Givaro::Modular<int32_t> Field;
typedef typename MatrixHomTrait<Blackbox, Field>::value_type FBlackbox;
- double log_max_mod = log((double)FieldTraits<Field>::maxModulus()) ;
- int n_bit = (int)(log_max_mod / M_LN2 - 2);
- unsigned long d;
- RandomPrimeIterator g(n_bit); Field::Element v;
+ size_t d;
+ RandomPrimeIterator g; g.template setBitsField<Field>();
+ Field::Element v;
++g;
Field F((int32_t)*g);
FBlackbox Ap(A, F);
@@ -286,25 +287,24 @@ namespace LinBox
// compute the valence of AAT over an integer ring
// d, the degree of min_poly of AAT
template <class Blackbox>
- static void valence(Integer& val, unsigned long d, const Blackbox& A)
+ static void valence(Integer& val, size_t d, const Blackbox& A)
{
- typedef Modular<int32_t> Field;
+ typedef Givaro::Modular<int32_t> Field;
typedef typename MatrixHomTrait<Blackbox, Field>::value_type FBlackbox;
- double log_max_mod = log((double)FieldTraits<Field>::maxModulus()) ;
- int n_bit = (int)(log_max_mod / M_LN2 - 2);
- RandomPrimeIterator rg(n_bit);
- std::vector<integer> Lv, Lm;
- unsigned long d1; Field::Element v; integer im = 1;
+ RandomPrimeIterator rg; rg.template setBitsField<Field>();
+ Givaro::ZRing<Integer> Z;
+ BlasVector<Givaro::ZRing<Integer> > Lv(Z), Lm(Z);
+ size_t d1; Field::Element v; integer im = 1;
//compute an upper bound for val.
- integer bound; cassini (bound, A); bound = pow (bound, d); bound *= 2;
+ integer bound; cassini (bound, A); bound = pow (bound, (uint64_t)d); bound *= 2;
commentator().report (Commentator::LEVEL_IMPORTANT, INTERNAL_DESCRIPTION)
<< "Bound for valence: " << bound << std::endl;
do {
++rg;
- Field F((unsigned long)*rg);
+ Field F((uint64_t)*rg);
FBlackbox Ap(A, F);
one_valence(v, d1, Ap);
if (d1 == d) {
@@ -314,7 +314,7 @@ namespace LinBox
} while (im < bound);
val = 0;
- std::vector<integer>::iterator Lv_p, Lm_p; integer tmp, a, b, g;
+ BlasVector<Givaro::ZRing<Integer> >::iterator Lv_p, Lm_p; integer tmp, a, b, g;
for (Lv_p = Lv. begin(), Lm_p = Lm. begin(); Lv_p != Lv. end(); ++ Lv_p, ++ Lm_p) {
tmp = im / *Lm_p;
gcd (g, *Lm_p, tmp, a, b);
@@ -335,11 +335,10 @@ namespace LinBox
#endif //__LINBOX_valence_H
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
// Local Variables:
// mode: C++
// tab-width: 8
// indent-tabs-mode: nil
// c-basic-offset: 8
// End:
-
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/switch/Makefile.am b/linbox/switch/Makefile.am
deleted file mode 100644
index b1e7f9c..0000000
--- a/linbox/switch/Makefile.am
+++ /dev/null
@@ -1,27 +0,0 @@
-# Copyright (c) 2010 the LinBox group
-# ========LICENCE========
-# This file is part of the library LinBox.
-#
-# LinBox is free software: you can redistribute it and/or modify
-# it under the terms of the GNU Lesser General Public
-# License as published by the Free Software Foundation; either
-# version 2.1 of the License, or (at your option) any later version.
-#
-# This library 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
-# Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public
-# License along with this library; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
-# ========LICENCE========
-
-
-
-pkgincludesubdir=$(pkgincludedir)/switch
-
-pkgincludesub_HEADERS= \
- boolean.h \
- cekstv.h \
- cekstv-gf2.h
diff --git a/linbox/switch/Makefile.in b/linbox/switch/Makefile.in
deleted file mode 100644
index 984cfde..0000000
--- a/linbox/switch/Makefile.in
+++ /dev/null
@@ -1,576 +0,0 @@
-# Makefile.in generated by automake 1.11.5 from Makefile.am.
-# @configure_input@
-
-# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software
-# Foundation, Inc.
-# This Makefile.in is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
-# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
-# PARTICULAR PURPOSE.
-
- at SET_MAKE@
-
-# Copyright (c) 2010 the LinBox group
-# ========LICENCE========
-# This file is part of the library LinBox.
-#
-# LinBox is free software: you can redistribute it and/or modify
-# it under the terms of the GNU Lesser General Public
-# License as published by the Free Software Foundation; either
-# version 2.1 of the License, or (at your option) any later version.
-#
-# This library 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
-# Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public
-# License along with this library; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
-# ========LICENCE========
-
-VPATH = @srcdir@
-am__make_dryrun = \
- { \
- am__dry=no; \
- case $$MAKEFLAGS in \
- *\\[\ \ ]*) \
- echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \
- | grep '^AM OK$$' >/dev/null || am__dry=yes;; \
- *) \
- for am__flg in $$MAKEFLAGS; do \
- case $$am__flg in \
- *=*|--*) ;; \
- *n*) am__dry=yes; break;; \
- esac; \
- done;; \
- esac; \
- test $$am__dry = yes; \
- }
-pkgdatadir = $(datadir)/@PACKAGE@
-pkgincludedir = $(includedir)/@PACKAGE@
-pkglibdir = $(libdir)/@PACKAGE@
-pkglibexecdir = $(libexecdir)/@PACKAGE@
-am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
-install_sh_DATA = $(install_sh) -c -m 644
-install_sh_PROGRAM = $(install_sh) -c
-install_sh_SCRIPT = $(install_sh) -c
-INSTALL_HEADER = $(INSTALL_DATA)
-transform = $(program_transform_name)
-NORMAL_INSTALL = :
-PRE_INSTALL = :
-POST_INSTALL = :
-NORMAL_UNINSTALL = :
-PRE_UNINSTALL = :
-POST_UNINSTALL = :
-build_triplet = @build@
-host_triplet = @host@
-subdir = linbox/switch
-DIST_COMMON = $(pkgincludesub_HEADERS) $(srcdir)/Makefile.am \
- $(srcdir)/Makefile.in
-ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-am__aclocal_m4_deps = $(top_srcdir)/macros/aclocal-include.m4 \
- $(top_srcdir)/macros/config-header.m4 \
- $(top_srcdir)/macros/debug.m4 \
- $(top_srcdir)/macros/expat-check.m4 \
- $(top_srcdir)/macros/fflas-ffpack-check.m4 \
- $(top_srcdir)/macros/fplll-check.m4 \
- $(top_srcdir)/macros/givaro-check.m4 \
- $(top_srcdir)/macros/gmp-check.m4 \
- $(top_srcdir)/macros/iml-check.m4 \
- $(top_srcdir)/macros/lapack-check.m4 \
- $(top_srcdir)/macros/libtool.m4 \
- $(top_srcdir)/macros/lidia-check.m4 \
- $(top_srcdir)/macros/linbox-benchmark.m4 \
- $(top_srcdir)/macros/linbox-doc.m4 \
- $(top_srcdir)/macros/linbox-misc.m4 \
- $(top_srcdir)/macros/linbox-opt.m4 \
- $(top_srcdir)/macros/ltoptions.m4 \
- $(top_srcdir)/macros/ltsugar.m4 \
- $(top_srcdir)/macros/ltversion.m4 \
- $(top_srcdir)/macros/lt~obsolete.m4 \
- $(top_srcdir)/macros/m4ri-check.m4 \
- $(top_srcdir)/macros/m4rie-check.m4 \
- $(top_srcdir)/macros/maple-check.m4 \
- $(top_srcdir)/macros/mpfr-check.m4 \
- $(top_srcdir)/macros/ntl-check.m4 \
- $(top_srcdir)/macros/saclib-check.m4 \
- $(top_srcdir)/macros/sage-check.m4 $(top_srcdir)/configure.ac
-am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
- $(ACLOCAL_M4)
-mkinstalldirs = $(install_sh) -d
-CONFIG_HEADER = $(top_builddir)/config.h
-CONFIG_CLEAN_FILES =
-CONFIG_CLEAN_VPATH_FILES =
-depcomp =
-am__depfiles_maybe =
-SOURCES =
-DIST_SOURCES =
-am__can_run_installinfo = \
- case $$AM_UPDATE_INFO_DIR in \
- n|no|NO) false;; \
- *) (install-info --version) >/dev/null 2>&1;; \
- esac
-am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
-am__vpath_adj = case $$p in \
- $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
- *) f=$$p;; \
- esac;
-am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
-am__install_max = 40
-am__nobase_strip_setup = \
- srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
-am__nobase_strip = \
- for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
-am__nobase_list = $(am__nobase_strip_setup); \
- for p in $$list; do echo "$$p $$p"; done | \
- sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
- $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
- if (++n[$$2] == $(am__install_max)) \
- { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
- END { for (dir in files) print dir, files[dir] }'
-am__base_list = \
- sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
- sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
-am__uninstall_files_from_dir = { \
- test -z "$$files" \
- || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \
- || { echo " ( cd '$$dir' && rm -f" $$files ")"; \
- $(am__cd) "$$dir" && rm -f $$files; }; \
- }
-am__installdirs = "$(DESTDIR)$(pkgincludesubdir)"
-HEADERS = $(pkgincludesub_HEADERS)
-ETAGS = etags
-CTAGS = ctags
-DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
-ACLOCAL = @ACLOCAL@
-AMTAR = @AMTAR@
-AR = @AR@
-AUTOCONF = @AUTOCONF@
-AUTOHEADER = @AUTOHEADER@
-AUTOMAKE = @AUTOMAKE@
-AWK = @AWK@
-BLAS_CFLAGS = @BLAS_CFLAGS@
-BLAS_LIBS = @BLAS_LIBS@
-CC = @CC@
-CCNAM = @CCNAM@
-CFLAGS = @CFLAGS@
-CPPFLAGS = @CPPFLAGS@
-CXX = @CXX@
-CXXCPP = @CXXCPP@
-CXXFLAGS = @CXXFLAGS@
-CYGPATH_W = @CYGPATH_W@
-DBG = @DBG@
-DEBUG_CFLAGS = @DEBUG_CFLAGS@
-DEFAULT_CFLAGS = @DEFAULT_CFLAGS@
-DEFS = @DEFS@
-DLLTOOL = @DLLTOOL@
-DSYMUTIL = @DSYMUTIL@
-DUMPBIN = @DUMPBIN@
-ECHO_C = @ECHO_C@
-ECHO_N = @ECHO_N@
-ECHO_T = @ECHO_T@
-EGREP = @EGREP@
-EXEEXT = @EXEEXT@
-EXPAT_CFLAGS = @EXPAT_CFLAGS@
-EXPAT_LIBS = @EXPAT_LIBS@
-FFLAS_FFPACK_CFLAGS = @FFLAS_FFPACK_CFLAGS@
-FFLAS_FFPACK_LIBS = @FFLAS_FFPACK_LIBS@
-FFLAS_FFPACK_LOC = @FFLAS_FFPACK_LOC@
-FGREP = @FGREP@
-FPLLL_CFLAGS = @FPLLL_CFLAGS@
-FPLLL_LIBS = @FPLLL_LIBS@
-GIVARO_CFLAGS = @GIVARO_CFLAGS@
-GIVARO_LIBS = @GIVARO_LIBS@
-GMP_CFLAGS = @GMP_CFLAGS@
-GMP_LIBS = @GMP_LIBS@
-GMP_VERSION = @GMP_VERSION@
-GREP = @GREP@
-IML_CFLAGS = @IML_CFLAGS@
-IML_LIBS = @IML_LIBS@
-INSTALL = @INSTALL@
-INSTALL_DATA = @INSTALL_DATA@
-INSTALL_PROGRAM = @INSTALL_PROGRAM@
-INSTALL_SCRIPT = @INSTALL_SCRIPT@
-INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
-LD = @LD@
-LDFLAGS = @LDFLAGS@
-LIBOBJS = @LIBOBJS@
-LIBS = @LIBS@
-LIBTOOL = @LIBTOOL@
-LIDIA_CFLAGS = @LIDIA_CFLAGS@
-LIDIA_LIBS = @LIDIA_LIBS@
-LINBOX_BENCH_PATH = @LINBOX_BENCH_PATH@
-LINBOX_DOC_PATH = @LINBOX_DOC_PATH@
-LIPO = @LIPO@
-LN_S = @LN_S@
-LTLIBOBJS = @LTLIBOBJS@
-M4RIE_CFLAGS = @M4RIE_CFLAGS@
-M4RIE_LIBS = @M4RIE_LIBS@
-M4RI_CFLAGS = @M4RI_CFLAGS@
-M4RI_LIBS = @M4RI_LIBS@
-MAINT = @MAINT@
-MAKEINFO = @MAKEINFO@
-MANIFEST_TOOL = @MANIFEST_TOOL@
-MAPLE_CFLAGS = @MAPLE_CFLAGS@
-MAPLE_HOME = @MAPLE_HOME@
-MAPLE_LIBS = @MAPLE_LIBS@
-MAPLE_VERSION = @MAPLE_VERSION@
-MKDIR_P = @MKDIR_P@
-MPFR_CFLAGS = @MPFR_CFLAGS@
-MPFR_LIBS = @MPFR_LIBS@
-NM = @NM@
-NMEDIT = @NMEDIT@
-NTL_CFLAGS = @NTL_CFLAGS@
-NTL_LIBS = @NTL_LIBS@
-OBJDUMP = @OBJDUMP@
-OBJEXT = @OBJEXT@
-OTOOL = @OTOOL@
-OTOOL64 = @OTOOL64@
-PACKAGE = @PACKAGE@
-PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
-PACKAGE_NAME = @PACKAGE_NAME@
-PACKAGE_STRING = @PACKAGE_STRING@
-PACKAGE_TARNAME = @PACKAGE_TARNAME@
-PACKAGE_URL = @PACKAGE_URL@
-PACKAGE_VERSION = @PACKAGE_VERSION@
-PATH_SEPARATOR = @PATH_SEPARATOR@
-PROF = @PROF@
-RANLIB = @RANLIB@
-RM = @RM@
-SACLIB_CFLAGS = @SACLIB_CFLAGS@
-SACLIB_LIBS = @SACLIB_LIBS@
-SED = @SED@
-SET_MAKE = @SET_MAKE@
-SHELL = @SHELL@
-STRIP = @STRIP@
-TESTS_CFLAGS = @TESTS_CFLAGS@
-VERSION = @VERSION@
-WARN = @WARN@
-abs_builddir = @abs_builddir@
-abs_srcdir = @abs_srcdir@
-abs_top_builddir = @abs_top_builddir@
-abs_top_srcdir = @abs_top_srcdir@
-ac_ct_AR = @ac_ct_AR@
-ac_ct_CC = @ac_ct_CC@
-ac_ct_CXX = @ac_ct_CXX@
-ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
-am__leading_dot = @am__leading_dot@
-am__tar = @am__tar@
-am__untar = @am__untar@
-bindir = @bindir@
-build = @build@
-build_alias = @build_alias@
-build_cpu = @build_cpu@
-build_os = @build_os@
-build_vendor = @build_vendor@
-builddir = @builddir@
-datadir = @datadir@
-datarootdir = @datarootdir@
-docdir = @docdir@
-dvidir = @dvidir@
-exec_prefix = @exec_prefix@
-host = @host@
-host_alias = @host_alias@
-host_cpu = @host_cpu@
-host_os = @host_os@
-host_vendor = @host_vendor@
-htmldir = @htmldir@
-includedir = @includedir@
-infodir = @infodir@
-install_sh = @install_sh@
-libdir = @libdir@
-libexecdir = @libexecdir@
-localedir = @localedir@
-localstatedir = @localstatedir@
-mandir = @mandir@
-mkdir_p = @mkdir_p@
-oldincludedir = @oldincludedir@
-pdfdir = @pdfdir@
-prefix = @prefix@
-program_transform_name = @program_transform_name@
-psdir = @psdir@
-sbindir = @sbindir@
-sharedstatedir = @sharedstatedir@
-srcdir = @srcdir@
-sysconfdir = @sysconfdir@
-target_alias = @target_alias@
-top_build_prefix = @top_build_prefix@
-top_builddir = @top_builddir@
-top_srcdir = @top_srcdir@
-pkgincludesubdir = $(pkgincludedir)/switch
-pkgincludesub_HEADERS = \
- boolean.h \
- cekstv.h \
- cekstv-gf2.h
-
-all: all-am
-
-.SUFFIXES:
-$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps)
- @for dep in $?; do \
- case '$(am__configure_deps)' in \
- *$$dep*) \
- ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
- && { if test -f $@; then exit 0; else break; fi; }; \
- exit 1;; \
- esac; \
- done; \
- echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu --ignore-deps linbox/switch/Makefile'; \
- $(am__cd) $(top_srcdir) && \
- $(AUTOMAKE) --gnu --ignore-deps linbox/switch/Makefile
-.PRECIOUS: Makefile
-Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
- @case '$?' in \
- *config.status*) \
- cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
- *) \
- echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
- cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
- esac;
-
-$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
- cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-
-$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
- cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
- cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-$(am__aclocal_m4_deps):
-
-mostlyclean-libtool:
- -rm -f *.lo
-
-clean-libtool:
- -rm -rf .libs _libs
-install-pkgincludesubHEADERS: $(pkgincludesub_HEADERS)
- @$(NORMAL_INSTALL)
- @list='$(pkgincludesub_HEADERS)'; test -n "$(pkgincludesubdir)" || list=; \
- if test -n "$$list"; then \
- echo " $(MKDIR_P) '$(DESTDIR)$(pkgincludesubdir)'"; \
- $(MKDIR_P) "$(DESTDIR)$(pkgincludesubdir)" || exit 1; \
- fi; \
- for p in $$list; do \
- if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
- echo "$$d$$p"; \
- done | $(am__base_list) | \
- while read files; do \
- echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(pkgincludesubdir)'"; \
- $(INSTALL_HEADER) $$files "$(DESTDIR)$(pkgincludesubdir)" || exit $$?; \
- done
-
-uninstall-pkgincludesubHEADERS:
- @$(NORMAL_UNINSTALL)
- @list='$(pkgincludesub_HEADERS)'; test -n "$(pkgincludesubdir)" || list=; \
- files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
- dir='$(DESTDIR)$(pkgincludesubdir)'; $(am__uninstall_files_from_dir)
-
-ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
- list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
- unique=`for i in $$list; do \
- if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
- done | \
- $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
- END { if (nonempty) { for (i in files) print i; }; }'`; \
- mkid -fID $$unique
-tags: TAGS
-
-TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
- $(TAGS_FILES) $(LISP)
- set x; \
- here=`pwd`; \
- list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
- unique=`for i in $$list; do \
- if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
- done | \
- $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
- END { if (nonempty) { for (i in files) print i; }; }'`; \
- shift; \
- if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
- test -n "$$unique" || unique=$$empty_fix; \
- if test $$# -gt 0; then \
- $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
- "$$@" $$unique; \
- else \
- $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
- $$unique; \
- fi; \
- fi
-ctags: CTAGS
-CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
- $(TAGS_FILES) $(LISP)
- list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
- unique=`for i in $$list; do \
- if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
- done | \
- $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
- END { if (nonempty) { for (i in files) print i; }; }'`; \
- test -z "$(CTAGS_ARGS)$$unique" \
- || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
- $$unique
-
-GTAGS:
- here=`$(am__cd) $(top_builddir) && pwd` \
- && $(am__cd) $(top_srcdir) \
- && gtags -i $(GTAGS_ARGS) "$$here"
-
-distclean-tags:
- -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
-
-distdir: $(DISTFILES)
- @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
- topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
- list='$(DISTFILES)'; \
- dist_files=`for file in $$list; do echo $$file; done | \
- sed -e "s|^$$srcdirstrip/||;t" \
- -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
- case $$dist_files in \
- */*) $(MKDIR_P) `echo "$$dist_files" | \
- sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
- sort -u` ;; \
- esac; \
- for file in $$dist_files; do \
- if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
- if test -d $$d/$$file; then \
- dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
- if test -d "$(distdir)/$$file"; then \
- find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
- fi; \
- if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
- cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
- find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
- fi; \
- cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
- else \
- test -f "$(distdir)/$$file" \
- || cp -p $$d/$$file "$(distdir)/$$file" \
- || exit 1; \
- fi; \
- done
-check-am: all-am
-check: check-am
-all-am: Makefile $(HEADERS)
-installdirs:
- for dir in "$(DESTDIR)$(pkgincludesubdir)"; do \
- test -z "$$dir" || $(MKDIR_P) "$$dir"; \
- done
-install: install-am
-install-exec: install-exec-am
-install-data: install-data-am
-uninstall: uninstall-am
-
-install-am: all-am
- @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
-
-installcheck: installcheck-am
-install-strip:
- if test -z '$(STRIP)'; then \
- $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
- install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
- install; \
- else \
- $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
- install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
- "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
- fi
-mostlyclean-generic:
-
-clean-generic:
-
-distclean-generic:
- -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
- -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
-
-maintainer-clean-generic:
- @echo "This command is intended for maintainers to use"
- @echo "it deletes files that may require special tools to rebuild."
-clean: clean-am
-
-clean-am: clean-generic clean-libtool mostlyclean-am
-
-distclean: distclean-am
- -rm -f Makefile
-distclean-am: clean-am distclean-generic distclean-tags
-
-dvi: dvi-am
-
-dvi-am:
-
-html: html-am
-
-html-am:
-
-info: info-am
-
-info-am:
-
-install-data-am: install-pkgincludesubHEADERS
-
-install-dvi: install-dvi-am
-
-install-dvi-am:
-
-install-exec-am:
-
-install-html: install-html-am
-
-install-html-am:
-
-install-info: install-info-am
-
-install-info-am:
-
-install-man:
-
-install-pdf: install-pdf-am
-
-install-pdf-am:
-
-install-ps: install-ps-am
-
-install-ps-am:
-
-installcheck-am:
-
-maintainer-clean: maintainer-clean-am
- -rm -f Makefile
-maintainer-clean-am: distclean-am maintainer-clean-generic
-
-mostlyclean: mostlyclean-am
-
-mostlyclean-am: mostlyclean-generic mostlyclean-libtool
-
-pdf: pdf-am
-
-pdf-am:
-
-ps: ps-am
-
-ps-am:
-
-uninstall-am: uninstall-pkgincludesubHEADERS
-
-.MAKE: install-am install-strip
-
-.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \
- clean-libtool ctags distclean distclean-generic \
- distclean-libtool distclean-tags distdir dvi dvi-am html \
- html-am info info-am install install-am install-data \
- install-data-am install-dvi install-dvi-am install-exec \
- install-exec-am install-html install-html-am install-info \
- install-info-am install-man install-pdf install-pdf-am \
- install-pkgincludesubHEADERS install-ps install-ps-am \
- install-strip installcheck installcheck-am installdirs \
- maintainer-clean maintainer-clean-generic mostlyclean \
- mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
- tags uninstall uninstall-am uninstall-pkgincludesubHEADERS
-
-
-# Tell versions [3.59,3.63) of GNU make to not export all variables.
-# Otherwise a system limit (for SysV at least) may be exceeded.
-.NOEXPORT:
diff --git a/linbox/switch/boolean.h b/linbox/switch/boolean.h
deleted file mode 100644
index a780b49..0000000
--- a/linbox/switch/boolean.h
+++ /dev/null
@@ -1,195 +0,0 @@
-/* linbox/switch/boolean.h
- * Copyright (C) 1999-2001 William J Turner
- *
- * Written by William J Turner <wjturner at math.ncsu.edu>,
- *
- * -----------------------------------------------------------
- * 2002-09-26 Bradford Hovinen <bghovinen at math.uwaterloo.ca>
- *
- * Refactoring: The switch object now contains only the information for one 2x2
- * block. A vector of switches is maintained by the butterfly preconditioner
- * instead of the switch object. Since there will be many switch objects, they
- * should be kept very lightweight, so the field is not maintained in the object
- * itself, but instead passed to apply and applyTranspose. Since those methods
- * are inline, this does not create overhead. apply and applyTranspose now take
- * four field elements: the source elements and destination elements. This
- * eliminates the need to keep an additional temporary in the class, and
- * eliminates the need for copying in the butterfly.
- *
- * -----------------------------------------------------------
- * 2002-08-20 Bradford Hovinen <hovinen at cis.udel.edu>
- *
- * Brought this file into the current Linbox framework:
- * - Renamed file as boolean.h
- * - Renamed class boolean_switch as BooleanSwitch
- * - Reindent
- * -----------------------------------------------------------
- *
- *
- * ========LICENCE========
- * This file is part of the library LinBox.
- *
- * LinBox is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- * ========LICENCE========
- *.
- */
-
-#ifndef __LINBOX_boolean_H
-#define __LINBOX_boolean_H
-
-#include <vector>
-
-namespace LinBox
-{
-
- class BooleanSwitchFactory;
-
- /** Boolean switch object.
- * This is a switch predicate object that is applied
- * to two references to elements to switch them as needed
- * by the \ref Butterfly\ Switching\ Network\ BlackBox\ Matrix\ Object.
- */
- class BooleanSwitch {
- public:
-
- typedef BooleanSwitch Self_t;
- typedef BooleanSwitchFactory Factory;
-
- /** Constructor from an STL vector of booleans.
- * The switch is applied using the vector of booleans.
- * A true value means to swap the two elements, and a false
- * value means not to.
- * The apply function starts at the beginning of the vector moving
- * forward through it, and applyTranspose function starts at the end
- * moving backwards. Both repeat the vector after they pass through it.
- * @param s vector of switches
- */
- BooleanSwitch (const bool s) :
- _s (s)
- {}
-
- /** Destructor.
- */
- ~BooleanSwitch () {}
-
- /** Apply switch function.
- * Switches the elements in references according to current boolean
- * value. Swaps the elements if boolean is true, otherwise does nothing.
- * It is templatized by the element type to be swapped.
- * @return bool \c true if swapped, \c false otherwise
- * @param F
- * @param x reference to first element to be switched
- * @param y reference to second element to be switched
- */
- template <class Field>
- bool apply (const Field &F,
- typename Field::Element &x,
- typename Field::Element &y) const;
-
- /** Apply switch transpose function.
- * Switches the elements in references according to current boolean
- * value. Swaps the elements if boolean is true, otherwise does nothing.
- * It is templatized by the element type to be swapped.
- * @return bool \c true if swapped, \c false otherwise
- * @param F
- * @param x reference to first element to be switched
- * @param y reference to second element to be switched
- */
- template <class Field>
- bool applyTranspose (const Field &F,
- typename Field::Element &x,
- typename Field::Element &y) const;
-
- template<typename _Tp1>
- struct rebind {
- typedef BooleanSwitch other;
-
- };
-
- protected:
-
- bool _s;
-
- }; // class boolean_switch
-
- /** Boolean switch factory
- *
- * This class facilitates construction of boolean switch objects by the
- * butterfly matrix.
- */
-
- class BooleanSwitchFactory {
- public:
- /** Constructor from an STL vector of bools
- */
- BooleanSwitchFactory (const std::vector<bool> &switches) :
- _switches (switches), _iter (switches.begin ())
- {}
-
- /** Construct and return a boolean switch object
- *
- * This function walks through the switches object given in the
- * constructor, advancing on each invocation. It wraps around to the
- * beginning of the vector when it reaches the end.
- */
- BooleanSwitch makeSwitch ()
- {
- if (_iter == _switches.end ())
- _iter = _switches.begin ();
-
- return BooleanSwitch (*_iter++);
- }
-
- private:
-
- const std::vector<bool> &_switches;
- std::vector<bool>::const_iterator _iter;
- };
-
- template <class Field>
- inline bool BooleanSwitch::apply (const Field &F,
- typename Field::Element &x,
- typename Field::Element &y) const
- {
- if (_s)
- std::swap (x, y);
-
- return _s;
- }
-
- template <class Field>
- inline bool BooleanSwitch::applyTranspose (const Field &F,
- typename Field::Element &x,
- typename Field::Element &y) const
- {
- if (_s)
- std::swap (x, y);
-
- return _s;
- }
-
-}
-
-#endif // __LINBOX_boolean_H
-
-
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
-// Local Variables:
-// mode: C++
-// tab-width: 8
-// indent-tabs-mode: nil
-// c-basic-offset: 8
-// End:
-
diff --git a/linbox/switch/cekstv-gf2.h b/linbox/switch/cekstv-gf2.h
deleted file mode 100644
index 6d35027..0000000
--- a/linbox/switch/cekstv-gf2.h
+++ /dev/null
@@ -1,142 +0,0 @@
-/* linbox/switch/cekstv.h
- * Copyright (C) 1999-2001 William J Turner
- *
- * Written by William J Turner <wjturner at math.ncsu.edu>
- *
- * -----------------------------------------------------------
- * 2002-09-26 Bradford Hovinen <bghovinen at math.uwaterloo.ca>
- *
- * Refactoring: The switch object now contains only the information for one 2x2
- * block. A vector of switches is maintained by the butterfly preconditioner
- * instead of the switch object. Since there will be many switch objects, they
- * should be kept very lightweight, so the field is not maintained in the object
- * itself, but instead passed to apply and applyTranspose. Since those methods
- * are inline, this does not create overhead. apply and applyTranspose now take
- * four field elements: the source elements and destination elements. This
- * eliminates the need to keep an additional temporary in the class, and
- * eliminates the need for copying in the butterfly.
- *
- * -----------------------------------------------------------
- * 2002-08-20 Bradford Hovinen <hovinen at cis.udel.edu>
- *
- * Brought this file into the current Linbox framework:
- * - Renamed file as cekstv.h
- * - Renamed class cekstv_switch as CekstvSwitch
- * - Reindent
- * -----------------------------------------------------------
- *
- *
- * ========LICENCE========
- * This file is part of the library LinBox.
- *
- * LinBox is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- * ========LICENCE========
- *.
- */
-
-#ifndef __LINBOX_cekstv_gf2_H
-#define __LINBOX_cekstv_gf2_H
-
-#include <vector>
-
-#include "linbox/field/gf2.h"
-#include "linbox/switch/cekstv.h"
-
-
-namespace LinBox
-{
- // Specialization of Butterfly switch object
- template <>
- class CekstvSwitch<GF2>
- {
- public:
- typedef GF2 Field;
- /// Typedef
- typedef Field::Element Element;
- typedef CekstvSwitch<Field> Self_t;
- typedef CekstvSwitchFactory<Field> Factory;
-
- /** Constructor from a field and a field element.
- * @param F field in which arithmetic is done
- * @param switches vector of switches
- */
- CekstvSwitch (const Field::Element &a) :
- _a (a)
- {}
-
- ~CekstvSwitch () {}
-
- bool apply (const Field &F, Element &x, Element &y) const
- {
- F.axpyin (x, _a, y);
- F.addin (y, x);
- return true;
- }
-
- bool applyTranspose (const Field &F, Element &x, Element &y) const
- {
- F.addin (x, y);
- F.axpyin (y, _a, x);
- return true;
- }
-
- bool apply (const Field &F, stdBitReference x, stdBitReference y) const
- {
- F.axpyin (x, _a, y);
- F.addin (y, x);
- return true;
- }
-
- bool applyTranspose (const Field &F, stdBitReference x, stdBitReference y) const
- {
- F.addin (x, y);
- F.axpyin (y, _a, x);
- return true;
- }
-
- template<typename _Tp1>
- struct rebind
- {
- typedef CekstvSwitch<_Tp1> other;
-
- // special rebind operator() with two fields,
- // indeed local field is not stored in the switch
- void operator() (other *& Ap, const Self_t& A, const _Tp1& T, const Field& F) {
- typename _Tp1::Element u;
- Hom<Field, _Tp1>(F,T).image(u, A._a);
- Ap = new other(u);
- }
- };
-
-
- private:
-
- // Parameter of this 2x2 block
- Field::Element _a;
- };
-
-
-} // namespace LinBox
-
-#endif // __LINBOX_cekstv_H
-
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
-// Local Variables:
-// mode: C++
-// tab-width: 8
-// indent-tabs-mode: nil
-// c-basic-offset: 8
-// End:
-
diff --git a/linbox/switch/cekstv.h b/linbox/switch/cekstv.h
deleted file mode 100644
index aa154f8..0000000
--- a/linbox/switch/cekstv.h
+++ /dev/null
@@ -1,200 +0,0 @@
-/* linbox/switch/cekstv.h
- * Copyright (C) 1999-2001 William J Turner
- *
- * Written by William J Turner <wjturner at math.ncsu.edu>
- *
- * -----------------------------------------------------------
- * 2002-09-26 Bradford Hovinen <bghovinen at math.uwaterloo.ca>
- *
- * Refactoring: The switch object now contains only the information for one 2x2
- * block. A vector of switches is maintained by the butterfly preconditioner
- * instead of the switch object. Since there will be many switch objects, they
- * should be kept very lightweight, so the field is not maintained in the object
- * itself, but instead passed to apply and applyTranspose. Since those methods
- * are inline, this does not create overhead. apply and applyTranspose now take
- * four field elements: the source elements and destination elements. This
- * eliminates the need to keep an additional temporary in the class, and
- * eliminates the need for copying in the butterfly.
- *
- * -----------------------------------------------------------
- * 2002-08-20 Bradford Hovinen <hovinen at cis.udel.edu>
- *
- * Brought this file into the current Linbox framework:
- * - Renamed file as cekstv.h
- * - Renamed class cekstv_switch as CekstvSwitch
- * - Reindent
- * -----------------------------------------------------------
- *
- *
- * ========LICENCE========
- * This file is part of the library LinBox.
- *
- * LinBox is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- * ========LICENCE========
- *.
- */
-
-#ifndef __LINBOX_cekstv_H
-#define __LINBOX_cekstv_H
-
-#include <vector>
-
-namespace LinBox
-{
-
- template <class Field>
- class CekstvSwitchFactory;
-
- /** Butterfly switch object from preconditioner paper.
- * This is a switch predicate object that is applied
- * to two references to elements to switch them as needed
- * by the \ref Butterfly\ Switching\ Network\ BlackBox\ Matrix\ Object
- * following the exchange matrix introduced in "Efficient Matrix
- * Preconditioners for Black Box Linear Algebra" by Chen, Eberly,
- * Kaltofen, Saunders, Turner, and Villard.
- * This class is templatized by the field in which the arithmetic
- * is done.
- */
- template <class Field>
- class CekstvSwitch {
- public:
-
- /// Typedef
- typedef typename Field::Element Element;
- typedef CekstvSwitch<Field> Self_t;
- typedef CekstvSwitchFactory<Field> Factory;
-
- CekstvSwitch () {}
-
- /** Constructor from a field and a field element.
- * @param a vector of switches
- */
- CekstvSwitch (const typename Field::Element &a) :
- _a (a)
- {}
-
- /** Destructor.
- */
- ~CekstvSwitch () {}
-
- /** Apply switch function.
- * Switches the elements in references according to the
- * exchange matrix introduced in "Efficient Matrix
- * Preconditioners for Black Box Linear Algebra" by Chen, Eberly,
- * Kaltofen, Saunders, Turner, and Villard and the current field element
- * specified in the switch object.
- * @return bool true if swapped, false otherwise
- * @param F
- * @param x reference to first element to be switched
- * @param y reference to second element to be switched
- */
- bool apply (const Field &F, Element &x, Element &y) const;
-
- /** Apply switch transpose function.
- * Switches the elements in references according to the
- * transpose of the exchange matrix introduced in "Efficient Matrix
- * Preconditioners for Black Box Linear Algebra" by Chen, Eberly,
- * Kaltofen, Saunders, Turner, and Villard and the current field element
- * specified in the switch object.
- * @return bool true if swapped, false otherwise
- * @param F
- * @param x reference to first element to be switched
- * @param y reference to second element to be switched
- */
- bool applyTranspose (const Field &F, Element &x, Element &y) const;
-
-
- template<typename _Tp1>
- struct rebind
- {
- typedef CekstvSwitch<_Tp1> other;
-
- // special rebind operator() with two fields,
- // indeed local field is not stored in the switch
- void operator() (other & Ap, const Self_t& A, const _Tp1& T, const Field& F) {
- Hom<Field, _Tp1>(F,T).image(Ap.getData(), A.getData());
- }
- };
-
- typename Field::Element& getData() { return _a; }
- const typename Field::Element& getData() const { return _a; }
-
-
- private:
-
- // Parameter of this 2x2 block
- typename Field::Element _a;
- };
-
- /** Cekstv switch factory
- *
- * This class facilitates construction of cekstv switch objects by the
- * butterfly matrix.
- */
-
- template <class Field>
- class CekstvSwitchFactory {
- public:
- /** Constructor from an STL vector of bools
- */
- CekstvSwitchFactory (typename Field::RandIter r) :
- _r (r)
- {}
-
- /** Construct and return a boolean switch object
- */
- CekstvSwitch<Field> makeSwitch ()
- { typename Field::Element a; return CekstvSwitch<Field> (_r.random (a)); }
-
- private:
-
- typename Field::RandIter _r;
- };
-
- template <class Field>
- inline bool CekstvSwitch<Field>::apply (const Field &F,
- typename Field::Element &x,
- typename Field::Element &y) const
- {
- F.axpyin (x, _a, y);
- F.addin (y, x);
-
- return true;
- }
-
- template <class Field>
- inline bool CekstvSwitch<Field>::applyTranspose (const Field &F,
- typename Field::Element &x,
- typename Field::Element &y) const
- {
- F.addin (x, y);
- F.axpyin (y, _a, x);
-
- return true;
- }
-
-}
-
-#include "linbox/switch/cekstv-gf2.h"
-#endif // __LINBOX_cekstv_H
-
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
-// Local Variables:
-// mode: C++
-// tab-width: 8
-// indent-tabs-mode: nil
-// c-basic-offset: 8
-// End:
-
diff --git a/linbox/util/Makefile.am b/linbox/util/Makefile.am
index 682a7ef..7feebe7 100644
--- a/linbox/util/Makefile.am
+++ b/linbox/util/Makefile.am
@@ -19,12 +19,10 @@
-#we now need to include givaro headers for timer ? (oupa ? plus moche que ça tu meurs)
-AM_CPPFLAGS=-I$(top_srcdir) -I$(top_srcdir)/linbox $(FFLAS_FFPACK_CFLAGS) $(GIVARO_CFLAGS)
+#we now need to include givaro headers for timer ?
-LIBS=$(GIVARO_LIBS)
-
-AM_CXXFLAGS=@DEFAULT_CFLAGS@
+AM_CPPFLAGS= -I$(top_srcdir)/linbox $(DEPS_CFLAGS)
+LDADD = $(DEPS_LIBS) $(LDFLAGS)
SUBDIRS=formats
@@ -34,27 +32,29 @@ noinst_LTLIBRARIES=libutil.la
libutil_la_SOURCES= \
- error.C \
+ error.C \
debug.C
-libutil_la_LDFLAGS=$(GIVARO_LIBS) $(LDFLAGS)
+libutil_la_LDFLAGS= $(LDFLAGS)
#libutil_la_LIBADD= \
# gmp++/libgmpxx.la
-pkgincludesub_HEADERS= \
- debug.h \
- timer.h \
- error.h \
- commentator.h \
- commentator.inl \
- contracts.h \
- prime-stream.h \
- iml_wrapper.h \
- field-axpy.h \
- matrix-stream.h \
- matrix-stream.inl \
- mpicpp.h \
- mpicpp.inl
+pkgincludesub_HEADERS= \
+ args-parser.h \
+ commentator.h \
+ commentator.inl \
+ contracts.h \
+ debug.h \
+ error.h \
+ field-axpy.h \
+ iml_wrapper.h \
+ matrix-stream.h \
+ matrix-stream.inl \
+ mpicpp.h \
+ mpicpp.inl \
+ prime-stream.h \
+ timer.h \
+ write-mm.h
EXTRA_DIST = util.doxy
diff --git a/linbox/util/Makefile.in b/linbox/util/Makefile.in
deleted file mode 100644
index 91d5364..0000000
--- a/linbox/util/Makefile.in
+++ /dev/null
@@ -1,800 +0,0 @@
-# Makefile.in generated by automake 1.11.5 from Makefile.am.
-# @configure_input@
-
-# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software
-# Foundation, Inc.
-# This Makefile.in is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
-# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
-# PARTICULAR PURPOSE.
-
- at SET_MAKE@
-
-# Copyright (c) 2010 the LinBox group
-# ========LICENCE========
-# This file is part of the library LinBox.
-#
-# LinBox is free software: you can redistribute it and/or modify
-# it under the terms of the GNU Lesser General Public
-# License as published by the Free Software Foundation; either
-# version 2.1 of the License, or (at your option) any later version.
-#
-# This library 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
-# Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public
-# License along with this library; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
-# ========LICENCE========
-
-
-VPATH = @srcdir@
-am__make_dryrun = \
- { \
- am__dry=no; \
- case $$MAKEFLAGS in \
- *\\[\ \ ]*) \
- echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \
- | grep '^AM OK$$' >/dev/null || am__dry=yes;; \
- *) \
- for am__flg in $$MAKEFLAGS; do \
- case $$am__flg in \
- *=*|--*) ;; \
- *n*) am__dry=yes; break;; \
- esac; \
- done;; \
- esac; \
- test $$am__dry = yes; \
- }
-pkgdatadir = $(datadir)/@PACKAGE@
-pkgincludedir = $(includedir)/@PACKAGE@
-pkglibdir = $(libdir)/@PACKAGE@
-pkglibexecdir = $(libexecdir)/@PACKAGE@
-am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
-install_sh_DATA = $(install_sh) -c -m 644
-install_sh_PROGRAM = $(install_sh) -c
-install_sh_SCRIPT = $(install_sh) -c
-INSTALL_HEADER = $(INSTALL_DATA)
-transform = $(program_transform_name)
-NORMAL_INSTALL = :
-PRE_INSTALL = :
-POST_INSTALL = :
-NORMAL_UNINSTALL = :
-PRE_UNINSTALL = :
-POST_UNINSTALL = :
-build_triplet = @build@
-host_triplet = @host@
-subdir = linbox/util
-DIST_COMMON = $(pkgincludesub_HEADERS) $(srcdir)/Makefile.am \
- $(srcdir)/Makefile.in
-ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-am__aclocal_m4_deps = $(top_srcdir)/macros/aclocal-include.m4 \
- $(top_srcdir)/macros/config-header.m4 \
- $(top_srcdir)/macros/debug.m4 \
- $(top_srcdir)/macros/expat-check.m4 \
- $(top_srcdir)/macros/fflas-ffpack-check.m4 \
- $(top_srcdir)/macros/fplll-check.m4 \
- $(top_srcdir)/macros/givaro-check.m4 \
- $(top_srcdir)/macros/gmp-check.m4 \
- $(top_srcdir)/macros/iml-check.m4 \
- $(top_srcdir)/macros/lapack-check.m4 \
- $(top_srcdir)/macros/libtool.m4 \
- $(top_srcdir)/macros/lidia-check.m4 \
- $(top_srcdir)/macros/linbox-benchmark.m4 \
- $(top_srcdir)/macros/linbox-doc.m4 \
- $(top_srcdir)/macros/linbox-misc.m4 \
- $(top_srcdir)/macros/linbox-opt.m4 \
- $(top_srcdir)/macros/ltoptions.m4 \
- $(top_srcdir)/macros/ltsugar.m4 \
- $(top_srcdir)/macros/ltversion.m4 \
- $(top_srcdir)/macros/lt~obsolete.m4 \
- $(top_srcdir)/macros/m4ri-check.m4 \
- $(top_srcdir)/macros/m4rie-check.m4 \
- $(top_srcdir)/macros/maple-check.m4 \
- $(top_srcdir)/macros/mpfr-check.m4 \
- $(top_srcdir)/macros/ntl-check.m4 \
- $(top_srcdir)/macros/saclib-check.m4 \
- $(top_srcdir)/macros/sage-check.m4 $(top_srcdir)/configure.ac
-am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
- $(ACLOCAL_M4)
-mkinstalldirs = $(install_sh) -d
-CONFIG_HEADER = $(top_builddir)/config.h
-CONFIG_CLEAN_FILES =
-CONFIG_CLEAN_VPATH_FILES =
-LTLIBRARIES = $(noinst_LTLIBRARIES)
-libutil_la_LIBADD =
-am_libutil_la_OBJECTS = error.lo debug.lo
-libutil_la_OBJECTS = $(am_libutil_la_OBJECTS)
-libutil_la_LINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) \
- $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \
- $(CXXFLAGS) $(libutil_la_LDFLAGS) $(LDFLAGS) -o $@
-DEFAULT_INCLUDES = -I. at am__isrc@ -I$(top_builddir)
-depcomp =
-am__depfiles_maybe =
-CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
- $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
-LTCXXCOMPILE = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
- --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
- $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
-CXXLD = $(CXX)
-CXXLINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
- --mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \
- $(LDFLAGS) -o $@
-SOURCES = $(libutil_la_SOURCES)
-DIST_SOURCES = $(libutil_la_SOURCES)
-RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \
- html-recursive info-recursive install-data-recursive \
- install-dvi-recursive install-exec-recursive \
- install-html-recursive install-info-recursive \
- install-pdf-recursive install-ps-recursive install-recursive \
- installcheck-recursive installdirs-recursive pdf-recursive \
- ps-recursive uninstall-recursive
-am__can_run_installinfo = \
- case $$AM_UPDATE_INFO_DIR in \
- n|no|NO) false;; \
- *) (install-info --version) >/dev/null 2>&1;; \
- esac
-am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
-am__vpath_adj = case $$p in \
- $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
- *) f=$$p;; \
- esac;
-am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
-am__install_max = 40
-am__nobase_strip_setup = \
- srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
-am__nobase_strip = \
- for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
-am__nobase_list = $(am__nobase_strip_setup); \
- for p in $$list; do echo "$$p $$p"; done | \
- sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
- $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
- if (++n[$$2] == $(am__install_max)) \
- { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
- END { for (dir in files) print dir, files[dir] }'
-am__base_list = \
- sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
- sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
-am__uninstall_files_from_dir = { \
- test -z "$$files" \
- || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \
- || { echo " ( cd '$$dir' && rm -f" $$files ")"; \
- $(am__cd) "$$dir" && rm -f $$files; }; \
- }
-am__installdirs = "$(DESTDIR)$(pkgincludesubdir)"
-HEADERS = $(pkgincludesub_HEADERS)
-RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \
- distclean-recursive maintainer-clean-recursive
-AM_RECURSIVE_TARGETS = $(RECURSIVE_TARGETS:-recursive=) \
- $(RECURSIVE_CLEAN_TARGETS:-recursive=) tags TAGS ctags CTAGS \
- distdir
-ETAGS = etags
-CTAGS = ctags
-DIST_SUBDIRS = $(SUBDIRS)
-DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
-am__relativize = \
- dir0=`pwd`; \
- sed_first='s,^\([^/]*\)/.*$$,\1,'; \
- sed_rest='s,^[^/]*/*,,'; \
- sed_last='s,^.*/\([^/]*\)$$,\1,'; \
- sed_butlast='s,/*[^/]*$$,,'; \
- while test -n "$$dir1"; do \
- first=`echo "$$dir1" | sed -e "$$sed_first"`; \
- if test "$$first" != "."; then \
- if test "$$first" = ".."; then \
- dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \
- dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \
- else \
- first2=`echo "$$dir2" | sed -e "$$sed_first"`; \
- if test "$$first2" = "$$first"; then \
- dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \
- else \
- dir2="../$$dir2"; \
- fi; \
- dir0="$$dir0"/"$$first"; \
- fi; \
- fi; \
- dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \
- done; \
- reldir="$$dir2"
-ACLOCAL = @ACLOCAL@
-AMTAR = @AMTAR@
-AR = @AR@
-AUTOCONF = @AUTOCONF@
-AUTOHEADER = @AUTOHEADER@
-AUTOMAKE = @AUTOMAKE@
-AWK = @AWK@
-BLAS_CFLAGS = @BLAS_CFLAGS@
-BLAS_LIBS = @BLAS_LIBS@
-CC = @CC@
-CCNAM = @CCNAM@
-CFLAGS = @CFLAGS@
-CPPFLAGS = @CPPFLAGS@
-CXX = @CXX@
-CXXCPP = @CXXCPP@
-CXXFLAGS = @CXXFLAGS@
-CYGPATH_W = @CYGPATH_W@
-DBG = @DBG@
-DEBUG_CFLAGS = @DEBUG_CFLAGS@
-DEFAULT_CFLAGS = @DEFAULT_CFLAGS@
-DEFS = @DEFS@
-DLLTOOL = @DLLTOOL@
-DSYMUTIL = @DSYMUTIL@
-DUMPBIN = @DUMPBIN@
-ECHO_C = @ECHO_C@
-ECHO_N = @ECHO_N@
-ECHO_T = @ECHO_T@
-EGREP = @EGREP@
-EXEEXT = @EXEEXT@
-EXPAT_CFLAGS = @EXPAT_CFLAGS@
-EXPAT_LIBS = @EXPAT_LIBS@
-FFLAS_FFPACK_CFLAGS = @FFLAS_FFPACK_CFLAGS@
-FFLAS_FFPACK_LIBS = @FFLAS_FFPACK_LIBS@
-FFLAS_FFPACK_LOC = @FFLAS_FFPACK_LOC@
-FGREP = @FGREP@
-FPLLL_CFLAGS = @FPLLL_CFLAGS@
-FPLLL_LIBS = @FPLLL_LIBS@
-GIVARO_CFLAGS = @GIVARO_CFLAGS@
-GIVARO_LIBS = @GIVARO_LIBS@
-GMP_CFLAGS = @GMP_CFLAGS@
-GMP_LIBS = @GMP_LIBS@
-GMP_VERSION = @GMP_VERSION@
-GREP = @GREP@
-IML_CFLAGS = @IML_CFLAGS@
-IML_LIBS = @IML_LIBS@
-INSTALL = @INSTALL@
-INSTALL_DATA = @INSTALL_DATA@
-INSTALL_PROGRAM = @INSTALL_PROGRAM@
-INSTALL_SCRIPT = @INSTALL_SCRIPT@
-INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
-LD = @LD@
-LDFLAGS = @LDFLAGS@
-LIBOBJS = @LIBOBJS@
-LIBS = $(GIVARO_LIBS)
-LIBTOOL = @LIBTOOL@
-LIDIA_CFLAGS = @LIDIA_CFLAGS@
-LIDIA_LIBS = @LIDIA_LIBS@
-LINBOX_BENCH_PATH = @LINBOX_BENCH_PATH@
-LINBOX_DOC_PATH = @LINBOX_DOC_PATH@
-LIPO = @LIPO@
-LN_S = @LN_S@
-LTLIBOBJS = @LTLIBOBJS@
-M4RIE_CFLAGS = @M4RIE_CFLAGS@
-M4RIE_LIBS = @M4RIE_LIBS@
-M4RI_CFLAGS = @M4RI_CFLAGS@
-M4RI_LIBS = @M4RI_LIBS@
-MAINT = @MAINT@
-MAKEINFO = @MAKEINFO@
-MANIFEST_TOOL = @MANIFEST_TOOL@
-MAPLE_CFLAGS = @MAPLE_CFLAGS@
-MAPLE_HOME = @MAPLE_HOME@
-MAPLE_LIBS = @MAPLE_LIBS@
-MAPLE_VERSION = @MAPLE_VERSION@
-MKDIR_P = @MKDIR_P@
-MPFR_CFLAGS = @MPFR_CFLAGS@
-MPFR_LIBS = @MPFR_LIBS@
-NM = @NM@
-NMEDIT = @NMEDIT@
-NTL_CFLAGS = @NTL_CFLAGS@
-NTL_LIBS = @NTL_LIBS@
-OBJDUMP = @OBJDUMP@
-OBJEXT = @OBJEXT@
-OTOOL = @OTOOL@
-OTOOL64 = @OTOOL64@
-PACKAGE = @PACKAGE@
-PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
-PACKAGE_NAME = @PACKAGE_NAME@
-PACKAGE_STRING = @PACKAGE_STRING@
-PACKAGE_TARNAME = @PACKAGE_TARNAME@
-PACKAGE_URL = @PACKAGE_URL@
-PACKAGE_VERSION = @PACKAGE_VERSION@
-PATH_SEPARATOR = @PATH_SEPARATOR@
-PROF = @PROF@
-RANLIB = @RANLIB@
-RM = @RM@
-SACLIB_CFLAGS = @SACLIB_CFLAGS@
-SACLIB_LIBS = @SACLIB_LIBS@
-SED = @SED@
-SET_MAKE = @SET_MAKE@
-SHELL = @SHELL@
-STRIP = @STRIP@
-TESTS_CFLAGS = @TESTS_CFLAGS@
-VERSION = @VERSION@
-WARN = @WARN@
-abs_builddir = @abs_builddir@
-abs_srcdir = @abs_srcdir@
-abs_top_builddir = @abs_top_builddir@
-abs_top_srcdir = @abs_top_srcdir@
-ac_ct_AR = @ac_ct_AR@
-ac_ct_CC = @ac_ct_CC@
-ac_ct_CXX = @ac_ct_CXX@
-ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
-am__leading_dot = @am__leading_dot@
-am__tar = @am__tar@
-am__untar = @am__untar@
-bindir = @bindir@
-build = @build@
-build_alias = @build_alias@
-build_cpu = @build_cpu@
-build_os = @build_os@
-build_vendor = @build_vendor@
-builddir = @builddir@
-datadir = @datadir@
-datarootdir = @datarootdir@
-docdir = @docdir@
-dvidir = @dvidir@
-exec_prefix = @exec_prefix@
-host = @host@
-host_alias = @host_alias@
-host_cpu = @host_cpu@
-host_os = @host_os@
-host_vendor = @host_vendor@
-htmldir = @htmldir@
-includedir = @includedir@
-infodir = @infodir@
-install_sh = @install_sh@
-libdir = @libdir@
-libexecdir = @libexecdir@
-localedir = @localedir@
-localstatedir = @localstatedir@
-mandir = @mandir@
-mkdir_p = @mkdir_p@
-oldincludedir = @oldincludedir@
-pdfdir = @pdfdir@
-prefix = @prefix@
-program_transform_name = @program_transform_name@
-psdir = @psdir@
-sbindir = @sbindir@
-sharedstatedir = @sharedstatedir@
-srcdir = @srcdir@
-sysconfdir = @sysconfdir@
-target_alias = @target_alias@
-top_build_prefix = @top_build_prefix@
-top_builddir = @top_builddir@
-top_srcdir = @top_srcdir@
-
-#we now need to include givaro headers for timer ? (oupa ? plus moche que ça tu meurs)
-AM_CPPFLAGS = -I$(top_srcdir) -I$(top_srcdir)/linbox $(FFLAS_FFPACK_CFLAGS) $(GIVARO_CFLAGS)
-AM_CXXFLAGS = @DEFAULT_CFLAGS@
-SUBDIRS = formats
-pkgincludesubdir = $(pkgincludedir)/util
-noinst_LTLIBRARIES = libutil.la
-libutil_la_SOURCES = \
- error.C \
- debug.C
-
-libutil_la_LDFLAGS = $(GIVARO_LIBS) $(LDFLAGS)
-
-#libutil_la_LIBADD= \
-# gmp++/libgmpxx.la
-pkgincludesub_HEADERS = \
- debug.h \
- timer.h \
- error.h \
- commentator.h \
- commentator.inl \
- contracts.h \
- prime-stream.h \
- iml_wrapper.h \
- field-axpy.h \
- matrix-stream.h \
- matrix-stream.inl \
- mpicpp.h \
- mpicpp.inl
-
-EXTRA_DIST = util.doxy
-all: all-recursive
-
-.SUFFIXES:
-.SUFFIXES: .C .lo .o .obj
-$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps)
- @for dep in $?; do \
- case '$(am__configure_deps)' in \
- *$$dep*) \
- ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
- && { if test -f $@; then exit 0; else break; fi; }; \
- exit 1;; \
- esac; \
- done; \
- echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu --ignore-deps linbox/util/Makefile'; \
- $(am__cd) $(top_srcdir) && \
- $(AUTOMAKE) --gnu --ignore-deps linbox/util/Makefile
-.PRECIOUS: Makefile
-Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
- @case '$?' in \
- *config.status*) \
- cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
- *) \
- echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
- cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
- esac;
-
-$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
- cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-
-$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
- cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
- cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-$(am__aclocal_m4_deps):
-
-clean-noinstLTLIBRARIES:
- -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES)
- @list='$(noinst_LTLIBRARIES)'; for p in $$list; do \
- dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \
- test "$$dir" != "$$p" || dir=.; \
- echo "rm -f \"$${dir}/so_locations\""; \
- rm -f "$${dir}/so_locations"; \
- done
-libutil.la: $(libutil_la_OBJECTS) $(libutil_la_DEPENDENCIES) $(EXTRA_libutil_la_DEPENDENCIES)
- $(libutil_la_LINK) $(libutil_la_OBJECTS) $(libutil_la_LIBADD) $(LIBS)
-
-mostlyclean-compile:
- -rm -f *.$(OBJEXT)
-
-distclean-compile:
- -rm -f *.tab.c
-
-.C.o:
- $(CXXCOMPILE) -c -o $@ $<
-
-.C.obj:
- $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
-
-.C.lo:
- $(LTCXXCOMPILE) -c -o $@ $<
-
-mostlyclean-libtool:
- -rm -f *.lo
-
-clean-libtool:
- -rm -rf .libs _libs
-install-pkgincludesubHEADERS: $(pkgincludesub_HEADERS)
- @$(NORMAL_INSTALL)
- @list='$(pkgincludesub_HEADERS)'; test -n "$(pkgincludesubdir)" || list=; \
- if test -n "$$list"; then \
- echo " $(MKDIR_P) '$(DESTDIR)$(pkgincludesubdir)'"; \
- $(MKDIR_P) "$(DESTDIR)$(pkgincludesubdir)" || exit 1; \
- fi; \
- for p in $$list; do \
- if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
- echo "$$d$$p"; \
- done | $(am__base_list) | \
- while read files; do \
- echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(pkgincludesubdir)'"; \
- $(INSTALL_HEADER) $$files "$(DESTDIR)$(pkgincludesubdir)" || exit $$?; \
- done
-
-uninstall-pkgincludesubHEADERS:
- @$(NORMAL_UNINSTALL)
- @list='$(pkgincludesub_HEADERS)'; test -n "$(pkgincludesubdir)" || list=; \
- files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
- dir='$(DESTDIR)$(pkgincludesubdir)'; $(am__uninstall_files_from_dir)
-
-# This directory's subdirectories are mostly independent; you can cd
-# into them and run `make' without going through this Makefile.
-# To change the values of `make' variables: instead of editing Makefiles,
-# (1) if the variable is set in `config.status', edit `config.status'
-# (which will cause the Makefiles to be regenerated when you run `make');
-# (2) otherwise, pass the desired values on the `make' command line.
-$(RECURSIVE_TARGETS):
- @fail= failcom='exit 1'; \
- for f in x $$MAKEFLAGS; do \
- case $$f in \
- *=* | --[!k]*);; \
- *k*) failcom='fail=yes';; \
- esac; \
- done; \
- dot_seen=no; \
- target=`echo $@ | sed s/-recursive//`; \
- list='$(SUBDIRS)'; for subdir in $$list; do \
- echo "Making $$target in $$subdir"; \
- if test "$$subdir" = "."; then \
- dot_seen=yes; \
- local_target="$$target-am"; \
- else \
- local_target="$$target"; \
- fi; \
- ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
- || eval $$failcom; \
- done; \
- if test "$$dot_seen" = "no"; then \
- $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \
- fi; test -z "$$fail"
-
-$(RECURSIVE_CLEAN_TARGETS):
- @fail= failcom='exit 1'; \
- for f in x $$MAKEFLAGS; do \
- case $$f in \
- *=* | --[!k]*);; \
- *k*) failcom='fail=yes';; \
- esac; \
- done; \
- dot_seen=no; \
- case "$@" in \
- distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \
- *) list='$(SUBDIRS)' ;; \
- esac; \
- rev=''; for subdir in $$list; do \
- if test "$$subdir" = "."; then :; else \
- rev="$$subdir $$rev"; \
- fi; \
- done; \
- rev="$$rev ."; \
- target=`echo $@ | sed s/-recursive//`; \
- for subdir in $$rev; do \
- echo "Making $$target in $$subdir"; \
- if test "$$subdir" = "."; then \
- local_target="$$target-am"; \
- else \
- local_target="$$target"; \
- fi; \
- ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
- || eval $$failcom; \
- done && test -z "$$fail"
-tags-recursive:
- list='$(SUBDIRS)'; for subdir in $$list; do \
- test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \
- done
-ctags-recursive:
- list='$(SUBDIRS)'; for subdir in $$list; do \
- test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \
- done
-
-ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
- list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
- unique=`for i in $$list; do \
- if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
- done | \
- $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
- END { if (nonempty) { for (i in files) print i; }; }'`; \
- mkid -fID $$unique
-tags: TAGS
-
-TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
- $(TAGS_FILES) $(LISP)
- set x; \
- here=`pwd`; \
- if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \
- include_option=--etags-include; \
- empty_fix=.; \
- else \
- include_option=--include; \
- empty_fix=; \
- fi; \
- list='$(SUBDIRS)'; for subdir in $$list; do \
- if test "$$subdir" = .; then :; else \
- test ! -f $$subdir/TAGS || \
- set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \
- fi; \
- done; \
- list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
- unique=`for i in $$list; do \
- if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
- done | \
- $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
- END { if (nonempty) { for (i in files) print i; }; }'`; \
- shift; \
- if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
- test -n "$$unique" || unique=$$empty_fix; \
- if test $$# -gt 0; then \
- $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
- "$$@" $$unique; \
- else \
- $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
- $$unique; \
- fi; \
- fi
-ctags: CTAGS
-CTAGS: ctags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
- $(TAGS_FILES) $(LISP)
- list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
- unique=`for i in $$list; do \
- if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
- done | \
- $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
- END { if (nonempty) { for (i in files) print i; }; }'`; \
- test -z "$(CTAGS_ARGS)$$unique" \
- || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
- $$unique
-
-GTAGS:
- here=`$(am__cd) $(top_builddir) && pwd` \
- && $(am__cd) $(top_srcdir) \
- && gtags -i $(GTAGS_ARGS) "$$here"
-
-distclean-tags:
- -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
-
-distdir: $(DISTFILES)
- @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
- topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
- list='$(DISTFILES)'; \
- dist_files=`for file in $$list; do echo $$file; done | \
- sed -e "s|^$$srcdirstrip/||;t" \
- -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
- case $$dist_files in \
- */*) $(MKDIR_P) `echo "$$dist_files" | \
- sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
- sort -u` ;; \
- esac; \
- for file in $$dist_files; do \
- if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
- if test -d $$d/$$file; then \
- dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
- if test -d "$(distdir)/$$file"; then \
- find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
- fi; \
- if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
- cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
- find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
- fi; \
- cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
- else \
- test -f "$(distdir)/$$file" \
- || cp -p $$d/$$file "$(distdir)/$$file" \
- || exit 1; \
- fi; \
- done
- @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \
- if test "$$subdir" = .; then :; else \
- $(am__make_dryrun) \
- || test -d "$(distdir)/$$subdir" \
- || $(MKDIR_P) "$(distdir)/$$subdir" \
- || exit 1; \
- dir1=$$subdir; dir2="$(distdir)/$$subdir"; \
- $(am__relativize); \
- new_distdir=$$reldir; \
- dir1=$$subdir; dir2="$(top_distdir)"; \
- $(am__relativize); \
- new_top_distdir=$$reldir; \
- echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \
- echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \
- ($(am__cd) $$subdir && \
- $(MAKE) $(AM_MAKEFLAGS) \
- top_distdir="$$new_top_distdir" \
- distdir="$$new_distdir" \
- am__remove_distdir=: \
- am__skip_length_check=: \
- am__skip_mode_fix=: \
- distdir) \
- || exit 1; \
- fi; \
- done
-check-am: all-am
-check: check-recursive
-all-am: Makefile $(LTLIBRARIES) $(HEADERS)
-installdirs: installdirs-recursive
-installdirs-am:
- for dir in "$(DESTDIR)$(pkgincludesubdir)"; do \
- test -z "$$dir" || $(MKDIR_P) "$$dir"; \
- done
-install: install-recursive
-install-exec: install-exec-recursive
-install-data: install-data-recursive
-uninstall: uninstall-recursive
-
-install-am: all-am
- @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
-
-installcheck: installcheck-recursive
-install-strip:
- if test -z '$(STRIP)'; then \
- $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
- install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
- install; \
- else \
- $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
- install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
- "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
- fi
-mostlyclean-generic:
-
-clean-generic:
-
-distclean-generic:
- -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
- -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
-
-maintainer-clean-generic:
- @echo "This command is intended for maintainers to use"
- @echo "it deletes files that may require special tools to rebuild."
-clean: clean-recursive
-
-clean-am: clean-generic clean-libtool clean-noinstLTLIBRARIES \
- mostlyclean-am
-
-distclean: distclean-recursive
- -rm -f Makefile
-distclean-am: clean-am distclean-compile distclean-generic \
- distclean-tags
-
-dvi: dvi-recursive
-
-dvi-am:
-
-html: html-recursive
-
-html-am:
-
-info: info-recursive
-
-info-am:
-
-install-data-am: install-pkgincludesubHEADERS
-
-install-dvi: install-dvi-recursive
-
-install-dvi-am:
-
-install-exec-am:
-
-install-html: install-html-recursive
-
-install-html-am:
-
-install-info: install-info-recursive
-
-install-info-am:
-
-install-man:
-
-install-pdf: install-pdf-recursive
-
-install-pdf-am:
-
-install-ps: install-ps-recursive
-
-install-ps-am:
-
-installcheck-am:
-
-maintainer-clean: maintainer-clean-recursive
- -rm -f Makefile
-maintainer-clean-am: distclean-am maintainer-clean-generic
-
-mostlyclean: mostlyclean-recursive
-
-mostlyclean-am: mostlyclean-compile mostlyclean-generic \
- mostlyclean-libtool
-
-pdf: pdf-recursive
-
-pdf-am:
-
-ps: ps-recursive
-
-ps-am:
-
-uninstall-am: uninstall-pkgincludesubHEADERS
-
-.MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) ctags-recursive \
- install-am install-strip tags-recursive
-
-.PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \
- all all-am check check-am clean clean-generic clean-libtool \
- clean-noinstLTLIBRARIES ctags ctags-recursive distclean \
- distclean-compile distclean-generic distclean-libtool \
- distclean-tags distdir dvi dvi-am html html-am info info-am \
- install install-am install-data install-data-am install-dvi \
- install-dvi-am install-exec install-exec-am install-html \
- install-html-am install-info install-info-am install-man \
- install-pdf install-pdf-am install-pkgincludesubHEADERS \
- install-ps install-ps-am install-strip installcheck \
- installcheck-am installdirs installdirs-am maintainer-clean \
- maintainer-clean-generic mostlyclean mostlyclean-compile \
- mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
- tags tags-recursive uninstall uninstall-am \
- uninstall-pkgincludesubHEADERS
-
-
-# Tell versions [3.59,3.63) of GNU make to not export all variables.
-# Otherwise a system limit (for SysV at least) may be exceeded.
-.NOEXPORT:
diff --git a/linbox/util/args-parser.h b/linbox/util/args-parser.h
new file mode 100644
index 0000000..44fbf94
--- /dev/null
+++ b/linbox/util/args-parser.h
@@ -0,0 +1,41 @@
+/*
+ * Copyright (C) 2014 the LinBox group
+ *
+ * Written by Brice Boyer (briceboyer) <boyer.brice at gmail.com>
+ *
+ *
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ * ========LICENCE========
+ *
+ */
+
+#ifndef __LINBOX_util_args_parser_H
+#define __LINBOX_util_args_parser_H
+
+#include <gmp++/gmp++.h>
+#include <fflas-ffpack/utils/args-parser.h>
+
+#endif // __LINBOX_util_args_parser_H
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/util/commentator.h b/linbox/util/commentator.h
index 2f6c941..f618e12 100644
--- a/linbox/util/commentator.h
+++ b/linbox/util/commentator.h
@@ -47,7 +47,8 @@
#include <fstream>
#include <cstring>
-#include "linbox/util/timer.h"
+//#include "linbox/util/timer.h"
+#include "givaro/givtimer.h"
#ifndef MAX
# define MAX(a,b) (((a) > (b)) ? (a) : (b))
@@ -186,6 +187,10 @@ namespace LinBox
void start (const char *description,
const char *fn = (const char *) 0,
unsigned long len = 0);
+ void start (std::string description,
+ const char *fn = (const char *) 0,
+ unsigned long len = 0);
+
/** @internal
* Start a new iteration.
@@ -518,6 +523,11 @@ namespace LinBox
report ((MessageLevel) msglevel, msgclass) << msg << std::endl;
}
+ void start (std::string id, const char *msg, long msglevel, const char *msgclass)
+ {
+ start(id.c_str(),msg,msglevel,msgclass);
+ }
+
/** @internal
* Stop an activity.
* @param msg Message to print
@@ -624,7 +634,7 @@ namespace LinBox
const char *_fn;
unsigned long _len;
unsigned long _progress;
- Givaro::Timer _timer;
+ Givaro::RealTimer _timer;
Estimator _estimate;
};
@@ -838,11 +848,11 @@ namespace LinBox
inline void setPrintParameters (unsigned long, unsigned long , const char *)
{}
inline bool isPrinted (unsigned long , unsigned long , const char * = (const char *) 0)
- {
- return false;
- }
+ { return false; }
};
+ class ActivityState {};
+
class Commentator {
public:
#if 0
@@ -874,7 +884,7 @@ namespace LinBox
LEVEL_UNIMPORTANT = 3
};
- inline std::ostream &report (long , const char *)
+ inline std::ostream &report (long level = LEVEL_IMPORTANT, const char *msg_class = INTERNAL_DESCRIPTION)
{
return cnull;
}
@@ -903,37 +913,23 @@ namespace LinBox
inline void setMaxDetailLevel (long )
{}
inline MessageClass ®isterMessageClass (const char *, std::ostream &, unsigned long = 1, unsigned long = 2)
- {
- return _msgcls;
- }
+ { return _msgcls; }
inline MessageClass &cloneMessageClass (const char *, const char *)
- {
- return _msgcls;
- }
+ { return _msgcls; }
inline MessageClass &cloneMessageClass (const char *, const char *, std::ostream &)
- {
- return _msgcls;
- }
+ { return _msgcls; }
inline MessageClass &getMessageClass (const char *)
- {
- return _msgcls;
- }
+ { return _msgcls; }
inline void setPrintParameters (unsigned long , unsigned long , const char * = (const char *) 0)
{}
inline void setBriefReportParameters (OutputFormat , bool , bool , bool )
{}
inline bool isPrinted (unsigned long , unsigned long , const char *, const char * = (const char *) 0)
- {
- return false;
- }
+ { return false; }
inline bool isPrinted (unsigned long , const char *, const char * = (const char *) 0)
- {
- return false;
- }
+ { return false; }
inline bool isNullStream (const std::ostream &)
- {
- return true;
- }
+ { return true; }
inline void setBriefReportStream (std::ostream &)
{}
inline void setReportStream (std::ostream &)
@@ -951,9 +947,12 @@ namespace LinBox
inline void report (const char *, long , const char *)
{}
inline bool printed (long , const char *)
- {
- return false;
- }
+ { return false; }
+
+ ActivityState saveActivityState () const
+ { return ActivityState(); }
+ void restoreActivityState (ActivityState state)
+ {}
std::ofstream cnull;
@@ -984,7 +983,7 @@ namespace LinBox
#endif
MessageClass _msgcls;
- };
+ }; // class (disabled) Commentator
// // Default global commentator
// extern Commentator commentator;
@@ -993,24 +992,24 @@ namespace LinBox
#endif // DISABLE_COMMENTATOR
-namespace LinBox
+namespace LinBox
{
// Default static commentator
Commentator& commentator() {
static Commentator internal_static_commentator;
return internal_static_commentator;
- }
+ }
Commentator& commentator(std::ostream& stream) {
static Commentator internal_static_commentator(stream);
return internal_static_commentator;
- }
+ }
}
-#include "fflas-ffpack/utils/args-parser.h"
-namespace LinBox
+#include "linbox/util/args-parser.h"
+namespace LinBox
{
void parseArguments (int argc, char **argv, Argument *args, bool printDefaults = true) {
for (int i = 1; i < argc; ++i) {
@@ -1021,8 +1020,8 @@ namespace LinBox
} else {
// Skip the argument next to "-xxx"
// except if next argument is a switch
- if ( ((i+1) < argc) &&
- (argv[i+1][0] != '-') ) {
+ if ( ((i+1) < argc) &&
+ (argv[i+1][0] != '-') ) {
++i;
}
}
@@ -1037,11 +1036,10 @@ namespace LinBox
#endif // __LINBOX_commentator_H
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
// Local Variables:
// mode: C++
// tab-width: 8
// indent-tabs-mode: nil
// c-basic-offset: 8
// End:
-
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/util/commentator.inl b/linbox/util/commentator.inl
index fe300f8..19230bd 100644
--- a/linbox/util/commentator.inl
+++ b/linbox/util/commentator.inl
@@ -25,7 +25,7 @@
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
* ========LICENCE========
*
- * This file implements the C++ interface to commentators (for
+ * This file implements the ++C interface to commentators (for
* providing runtime commentary to the user)
*/
@@ -88,10 +88,11 @@ namespace LinBox
Commentator::Commentator () :
// cnull (new nullstreambuf)
-// cnull ("/dev/null")
- cnull (0)
+ cnull ("/dev/null")
+ // cnull (0) // this is not right (clang/valgrind complain)
, _estimationMethod (BEST_ESTIMATE), _format (OUTPUT_CONSOLE),
_show_timing (true), _show_progress (true), _show_est_time (true)
+ ,_last_line_len(0)
{
//registerMessageClass (BRIEF_REPORT, std::clog, 1, LEVEL_IMPORTANT);
registerMessageClass (BRIEF_REPORT, _report, 1, LEVEL_IMPORTANT);
@@ -109,20 +110,22 @@ namespace LinBox
cnull (0)
, _estimationMethod (BEST_ESTIMATE), _format (OUTPUT_CONSOLE),
_show_timing (true), _show_progress (true), _show_est_time (true)
+ ,_last_line_len(0)
{
//registerMessageClass (BRIEF_REPORT, out, 1, LEVEL_IMPORTANT);
registerMessageClass (BRIEF_REPORT, out, 1, LEVEL_IMPORTANT);
- registerMessageClass (PROGRESS_REPORT, _report);
- registerMessageClass (TIMING_MEASURE, _report);
- registerMessageClass (TIMING_ESTIMATE, _report);
- registerMessageClass (PARTIAL_RESULT, _report);
- registerMessageClass (INTERNAL_WARNING, _report, 10, LEVEL_NORMAL);
- registerMessageClass (INTERNAL_ERROR, _report, 10, LEVEL_NORMAL);
- registerMessageClass (INTERNAL_DESCRIPTION, _report);
+ registerMessageClass (PROGRESS_REPORT, out);
+ registerMessageClass (TIMING_MEASURE, out);
+ registerMessageClass (TIMING_ESTIMATE, out);
+ registerMessageClass (PARTIAL_RESULT, out);
+ registerMessageClass (INTERNAL_WARNING, out, 10, LEVEL_NORMAL);
+ registerMessageClass (INTERNAL_ERROR, out, 10, LEVEL_NORMAL);
+ registerMessageClass (INTERNAL_DESCRIPTION, out);
}
Commentator::~Commentator()
{
+ _report << "That's all, Folks!" << std::endl;
std::map <const char *, MessageClass *, C_str_Less >::iterator i;
for (i = _messageClasses.begin (); i != _messageClasses.end (); ++i)
delete i->second;
@@ -151,6 +154,11 @@ namespace LinBox
new_act->_timer.start ();
}
+ void Commentator::start (std::string description, const char *fn, unsigned long len)
+ {
+ start(description.c_str(),fn,len);
+ }
+
void Commentator::startIteration (unsigned int iter, unsigned long len)
{
std::ostringstream str;
@@ -163,7 +171,7 @@ namespace LinBox
void Commentator::stop (const char *msg, const char *long_msg, const char *fn)
{
- double realtime, usertime, systime;
+ double realtime; //, usertime, systime;
Activity *top_act;
linbox_check (_activities.top () != (Activity *) 0);
@@ -176,13 +184,13 @@ namespace LinBox
top_act->_timer.stop ();
- realtime = top_act->_timer.realtime ();
- usertime = top_act->_timer.usertime ();
- systime = top_act->_timer.systime ();
+ realtime = top_act->_timer.time ();
+ //usertime = top_act->_timer.usertime ();
+ //systime = top_act->_timer.systime ();
if (realtime < 0) realtime = 0;
- if (usertime < 0) usertime = 0;
- if (systime < 0) systime = 0;
+ //if (usertime < 0) usertime = 0;
+ //if (systime < 0) systime = 0;
if (fn != (const char *) 0 &&
_activities.size () > 0 &&
@@ -206,19 +214,19 @@ namespace LinBox
std::ostream &output = report (LEVEL_IMPORTANT, INTERNAL_DESCRIPTION);
output.precision (4);
output << "Finished activity (rea: " << realtime << "s, cpu: ";
- output.precision (4);
- output << usertime << "s, sys: ";
- output.precision (4);
- output << systime << "s): " << long_msg << std::endl;
+ //output.precision (4);
+ //output << usertime << "s, sys: ";
+ //output.precision (4);
+ //output << systime << "s): " << long_msg << std::endl;
}
else if (isPrinted (_activities.size (), LEVEL_IMPORTANT, INTERNAL_DESCRIPTION, fn)) {
std::ostream &output = report (LEVEL_IMPORTANT, INTERNAL_DESCRIPTION);
output.precision (4);
output << "Completed activity: " << top_act->_desc << " (r: " << realtime << "s, u: ";
- output.precision (4);
- output << usertime << "s, s: ";
- output.precision (4);
- output << systime << "s) " << long_msg << std::endl;
+ //output.precision (4);
+ //output << usertime << "s, s: ";
+ //output.precision (4);
+ //output << systime << "s) " << long_msg << std::endl;
}
delete top_act;
@@ -229,16 +237,16 @@ namespace LinBox
linbox_check (_activities.top () != (Activity *) 0);
Activity *act = _activities.top ();
- Givaro::Timer tmp = act->_timer;
+ Givaro::RealTimer tmp = act->_timer;
act->_timer.stop ();
if (k == -1)
- act->_progress++;
+ ++(act->_progress);
else
- act->_progress = k;
+ act->_progress = (unsigned long)k;
if (len != -1)
- act->_len = len;
+ act->_len = (unsigned long) len;
if (act->_progress > act->_len)
act->_len = act->_progress;
@@ -247,7 +255,7 @@ namespace LinBox
rep.precision (3);
rep.setf (std::ios::fixed);
rep << "Progress: " << act->_progress << " out of " << act->_len
- << " (" << act->_timer.realtime () << "s elapsed)" << std::endl;
+ << " (" << act->_timer.time () << "s elapsed)" << std::endl;
if (_show_progress && isPrinted (_activities.size () - 1, LEVEL_IMPORTANT, BRIEF_REPORT, act->_fn))
updateActivityReport (*act);
@@ -258,20 +266,24 @@ namespace LinBox
{
linbox_check (msg_class != (const char *) 0);
- if (!isPrinted (_activities.size (), level, msg_class,
- (_activities.size () > 0) ? _activities.top ()->_fn : (const char *) 0))
- return cnull;
+ _report << "$$(" << _activities.size () << ", " << level << ", " << msg_class << ")";
+#if 0
+ if (!isPrinted (_activities.size (), level, msg_class,
+ (_activities.size () > 0) ? _activities.top ()->_fn : (const char *) 0))
+ return cnull;
- MessageClass &messageClass = getMessageClass (msg_class);
+ MessageClass &messageClass = getMessageClass (msg_class);
- return messageClass._stream;
+ return messageClass._stream;
+#endif
+ return _report;
}
void Commentator::indent (std::ostream &stream) const
{
unsigned int i;
- for (i = 0; i < _activities.size (); i++)
+ for (i = 0; i < _activities.size (); ++i)
stream << " ";
}
@@ -390,7 +402,7 @@ namespace LinBox
setMessageClassStream (INTERNAL_WARNING, stream);
setMessageClassStream (INTERNAL_DESCRIPTION, stream);
- if (stream == getMessageClass (BRIEF_REPORT)._stream)
+ if (&stream == &(getMessageClass (BRIEF_REPORT)._stream))
getMessageClass (BRIEF_REPORT).setMaxDepth (0);
}
@@ -440,21 +452,21 @@ namespace LinBox
void Commentator::updateActivityReport (Activity &activity)
{
MessageClass &messageClass = getMessageClass (BRIEF_REPORT);
- unsigned int i, old_len;
std::ostringstream str;
double percent = (double) activity._progress / (double) activity._len * 100.0;
if (_format == OUTPUT_CONSOLE) {
if (!messageClass.isPrinted (_activities.size (), LEVEL_IMPORTANT, activity._fn)) {
if (_show_progress) {
- for (i = 0; i < _last_line_len; i++)
+ unsigned int i, old_len;
+ for (i = 0; i < _last_line_len; ++i)
messageClass._stream << '\b';
str.width (3);
- str << floor (percent + 0.5) << '%' << std::ends;
+ str << floor (percent + 0.5) << "%" << std::ends;
old_len = _last_line_len;
- _last_line_len = (int)strlen (str.str ().c_str ());
+ _last_line_len = (unsigned int)strlen (str.str ().c_str ());
messageClass._stream << str.str ();
- for (int ii = 0; ii < (int) (old_len - _last_line_len); ii++)
+ for (int ii = 0; ii < (int) (old_len - _last_line_len); ++ii)
messageClass._stream << ' ';
}
}
@@ -494,25 +506,25 @@ namespace LinBox
if (_format == OUTPUT_CONSOLE) {
if (!messageClass.isPrinted (_activities.size () + 1, LEVEL_UNIMPORTANT, activity._fn)) {
if (_show_progress)
- for (i = 0; i < _last_line_len; i++)
+ for (i = 0; i < _last_line_len; ++i)
messageClass._stream << '\b';
messageClass._stream << msg;
if (_show_timing)
- messageClass._stream << " (" << activity._timer.usertime () << " s)" << std::endl;
+ messageClass._stream << " (" << activity._timer.time () << " s)" << std::endl;
else
messageClass._stream << std::endl;
}
else if (messageClass.isPrinted (_activities.size (), LEVEL_UNIMPORTANT, activity._fn)) {
- for (i = 0; i < _activities.size (); i++)
+ for (i = 0; i < _activities.size (); ++i)
messageClass._stream << " ";
messageClass._stream << msg;
//messageClass._stream << "Done: " << msg;
if (_show_timing)
- messageClass._stream << " (" << activity._timer.usertime () << " s)" << std::endl;
+ messageClass._stream << " (" << activity._timer.time () << " s)" << std::endl;
else
messageClass._stream << std::endl;
}
@@ -520,7 +532,7 @@ namespace LinBox
messageClass._smart_streambuf.stream ().flush ();
}
else if (_format == OUTPUT_PIPE) {
- for (i = 0; i < _activities.size (); i++)
+ for (i = 0; i < _activities.size (); ++i)
messageClass._stream << " ";
if (((_show_progress || _show_est_time) && activity._len > 0) ||
@@ -679,10 +691,10 @@ namespace LinBox
Configuration::const_iterator i;
std::list <std::pair <unsigned long, unsigned long> >::const_iterator j;
- for (i = _configuration.begin (); i != _configuration.end (); i++) {
+ for (i = _configuration.begin (); i != _configuration.end (); ++i) {
std::cerr << "Configuration (" << (*i).first << "):" << std::endl;
- for (j = (*i).second.begin (); j != (*i).second.end (); j++)
+ for (j = (*i).second.begin (); j != (*i).second.end (); ++j)
std::cerr << " Depth: " << (*j).first << ", Level: " << (*j).second << std::endl;
std::cerr << std::endl;
@@ -755,11 +767,10 @@ namespace LinBox
}
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
// Local Variables:
// mode: C++
// tab-width: 8
// indent-tabs-mode: nil
// c-basic-offset: 8
// End:
-
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/util/debug.C b/linbox/util/debug.C
index f7a272b..a8b44da 100644
--- a/linbox/util/debug.C
+++ b/linbox/util/debug.C
@@ -1,4 +1,3 @@
-
/* linbox/util/debug.C
* Copyright (C) 2001 Bradford Hovinen
*
@@ -41,11 +40,10 @@ namespace LinBox
std::ostream *NotImplementedYet::_errorStream ;
}
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
// Local Variables:
// mode: C++
// tab-width: 8
// indent-tabs-mode: nil
// c-basic-offset: 8
// End:
-
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/util/debug.h b/linbox/util/debug.h
index c671abb..291d803 100644
--- a/linbox/util/debug.h
+++ b/linbox/util/debug.h
@@ -53,11 +53,11 @@
# ifdef __GNUC__
# define linbox_check(check) \
if (!(check)) \
- throw LinBox::PreconditionFailed (__func__, __FILE__, __LINE__, #check); //BB : should work on non gnu compilers too
+ throw ::LinBox::PreconditionFailed (__func__, __FILE__, __LINE__, #check); //BB : should work on non gnu compilers too
# else
# define linbox_check(check) \
if (!(check)) \
- throw LinBox::PreconditionFailed (__FILE__, __LINE__, #check);
+ throw ::LinBox::PreconditionFailed (__FILE__, __LINE__, #check);
# endif
#endif
@@ -65,7 +65,10 @@
std::cout << "*** Warning *** " << std::endl << __func__ << " in " << __FILE__ << ':' << __LINE__ << " is not tested" << std::endl;
#define THIS_CODE_MAY_NOT_COMPILE_AND_IS_NOT_TESTED \
-" *** Warning *** this piece of code is not compiled by default and may not work"
+throw(" *** Warning *** this piece of code is not compiled by default and may not work")
+
+#define LB_FILE_LOC \
+ __func__,__FILE__,__LINE__
namespace LinBox
{ /* Preconditions,Error,Failure,NotImplementedYet */
@@ -164,7 +167,7 @@ namespace LinBox
NotImplementedYet(const char * function,
const char* file,
int line,
- const char * why='\0')
+ const char * why="\0")
{
if (_errorStream == (std::ostream *) 0)
_errorStream = &std::cerr;
@@ -194,9 +197,9 @@ namespace LinBox
* @param what what happened ? should not be NULL...
*/
LinBoxFailure(const char * function,
- const char* file,
- int line,
- const char * what='\0')
+ const char* file="\0",
+ int line=-1,
+ const char * what="\0")
{
if (_errorStream == (std::ostream *) 0)
_errorStream = &std::cerr;
@@ -226,8 +229,8 @@ namespace LinBox
* @param what what happened ? should not be NULL...
*/
LinBoxError(const char * what,
- const char * function='\0',
- const char* file='\0',
+ const char * function="\0",
+ const char* file="\0",
int line=-1)
{
if (_errorStream == (std::ostream *) 0)
@@ -321,7 +324,7 @@ namespace LinBox
-#ifdef LinBoxSrcOnly
+#if defined(LinBoxSrcOnly) or defined(LinBoxTestOnly)
// for all-source compilation
#include "linbox/util/debug.C"
#endif
@@ -331,11 +334,10 @@ namespace LinBox
#endif // __LINBOX_util_debug_H
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
// Local Variables:
// mode: C++
// tab-width: 8
// indent-tabs-mode: nil
// c-basic-offset: 8
// End:
-
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/util/error.C b/linbox/util/error.C
index f0c588e..ce674d3 100644
--- a/linbox/util/error.C
+++ b/linbox/util/error.C
@@ -37,11 +37,10 @@ namespace LinBox
}
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
// Local Variables:
// mode: C++
// tab-width: 8
// indent-tabs-mode: nil
// c-basic-offset: 8
// End:
-
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/util/error.h b/linbox/util/error.h
index 54f2492..6a8d9ae 100644
--- a/linbox/util/error.h
+++ b/linbox/util/error.h
@@ -38,7 +38,7 @@ namespace LinBox
class LinboxError {
static const size_t max_error_string = 256;
public:
- LinboxError (const char* msg = '\0') {
+ LinboxError (const char* msg = "\0") {
std::strncpy(strg, msg, max_error_string);
strg[max_error_string-1] = 0;
};
@@ -99,11 +99,10 @@ namespace LinBox
#endif // __LINBOX_util_error_H
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
// Local Variables:
// mode: C++
// tab-width: 8
// indent-tabs-mode: nil
// c-basic-offset: 8
// End:
-
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/util/field-axpy.h b/linbox/util/field-axpy.h
index 5dc9719..f2ccf1c 100644
--- a/linbox/util/field-axpy.h
+++ b/linbox/util/field-axpy.h
@@ -32,19 +32,22 @@ namespace LinBox
{
/** FieldAXPY object.
*
- * This class is used to wrap the operation <code>y = y + a * x</code>. It acts as an
- * accumulator for \c y.
+ * A fieldAXPY is an accumulator, allowing to add a number of field elements or products
+ * in an unnormalized state, delaying modular reduction as long as possible.
+ * This class containse a value y and wraps the operations <code>y = y + a * x</code> and
+ * <code>y = y + a</code>.
*
+ * This default instance does no optimization, no delayed modular reduction.
* Through the use of template specialization, objects of this type can
- * be used to speed up vector dot product operations. In particular, for
- * finite fields, dividing by the modulus and taking the remainder is
- * expensive. In many cases, this can be postponed until the end of the
+ * be used to speed up operations such as vector dot product operations.
+ * In particular, for finite fields, dividing by the modulus and taking the remainder
+ * is expensive. In many cases, this can be postponed until the end of the
* dot product operation, thus vastly improving performance.
*
- * This object is constructed from the field object \c F and a field
- * element a which it stores and thus can use several times. The use of
- * an object instead of a static variable to store the element a makes
- * this method thread-safe.
+ * FieldAXPY<Fld> is an assignable type. It is constructed from a field instance.
+ * The methods are mulacc(), accumulate(), operator=(), reset(), get(), and field().
+ * Of a const instance you can access get() and field().
+ * [Note: get() may renormalize the value, but it remains constant as a field element.]
*
* @param Field \ref LinBox @link Fields field at endlink
*/
@@ -54,15 +57,14 @@ namespace LinBox
/// Definition of element type
typedef typename Field::Element Element;
+ typedef Element Abnormal; // the type of the unnormalized values
/** Constructor.
- * A faxpy object if constructed from a Field and a field element.
- * Copies of this objects are stored in the faxpy object.
* @param F field F in which arithmetic is done
*/
FieldAXPY (const Field &F) :
- _field (F)
- { _field.init (_y, 0); }
+ _field (&F)
+ { field().assign(_y, field().zero); }
/** Copy constructor.
* @param faxpy
@@ -74,8 +76,12 @@ namespace LinBox
/** Assignment operator
* @param faxpy
*/
- FieldAXPY<Field> &operator = (const FieldAXPY &faxpy)
- { _y = faxpy._y; return *this; }
+ FieldAXPY<Field> &operator = (const FieldAXPY<Field> &faxpy)
+ {
+ _field = faxpy.field();
+ _y = faxpy._y;
+ return *this;
+ }
/** Add a*x to y
* y += a*x.
@@ -83,40 +89,30 @@ namespace LinBox
* @param x constant reference to element x
*/
inline Element& mulacc (const Element &a, const Element &x)
- { return _field.axpyin (_y, a, x); }
+ { return field().axpyin (_y, a, x); }
inline Element& accumulate (const Element &t)
- { return _field.addin (_y, t); }
+ { return field().addin (_y, t); }
/** Retrieve y
*
* Performs the delayed modding out if necessary
*/
- inline Element &get (Element &y) { y = _y; return y; }
-
- /** Assign method.
- * Stores new field element for arithmetic.
- * @return reference to self
- * @param y constant reference to element a
- */
- inline FieldAXPY &assign (const Element y)
- {
- _y = y;
- return *this;
- }
+ inline Element &get (Element &y) const { return y = _y; }
+ /// reset value to zero.
inline void reset() {
- _field.init(_y,0);
+ field().assign(_y,field().zero);
}
+ inline const Field& field() const { return *_field; }
protected:
/// Field in which arithmetic is done
- /// Not sure why it must be mutable, but the compiler complains otherwise
- Field _field;
+ const Field *_field;
- /// Field element for arithmetic
- Element _y;
+ /// Accumulator, unnormalized field element.
+ Abnormal _y;
}; // class FieldAXPY
diff --git a/linbox/util/formats/Makefile.in b/linbox/util/formats/Makefile.in
deleted file mode 100644
index c71e2aa..0000000
--- a/linbox/util/formats/Makefile.in
+++ /dev/null
@@ -1,579 +0,0 @@
-# Makefile.in generated by automake 1.11.5 from Makefile.am.
-# @configure_input@
-
-# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software
-# Foundation, Inc.
-# This Makefile.in is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
-# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
-# PARTICULAR PURPOSE.
-
- at SET_MAKE@
-
-# Copyright (c) 2010 the LinBox group
-# ========LICENCE========
-# This file is part of the library LinBox.
-#
-# LinBox is free software: you can redistribute it and/or modify
-# it under the terms of the GNU Lesser General Public
-# License as published by the Free Software Foundation; either
-# version 2.1 of the License, or (at your option) any later version.
-#
-# This library 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
-# Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public
-# License along with this library; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
-# ========LICENCE========
-
-VPATH = @srcdir@
-am__make_dryrun = \
- { \
- am__dry=no; \
- case $$MAKEFLAGS in \
- *\\[\ \ ]*) \
- echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \
- | grep '^AM OK$$' >/dev/null || am__dry=yes;; \
- *) \
- for am__flg in $$MAKEFLAGS; do \
- case $$am__flg in \
- *=*|--*) ;; \
- *n*) am__dry=yes; break;; \
- esac; \
- done;; \
- esac; \
- test $$am__dry = yes; \
- }
-pkgdatadir = $(datadir)/@PACKAGE@
-pkgincludedir = $(includedir)/@PACKAGE@
-pkglibdir = $(libdir)/@PACKAGE@
-pkglibexecdir = $(libexecdir)/@PACKAGE@
-am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
-install_sh_DATA = $(install_sh) -c -m 644
-install_sh_PROGRAM = $(install_sh) -c
-install_sh_SCRIPT = $(install_sh) -c
-INSTALL_HEADER = $(INSTALL_DATA)
-transform = $(program_transform_name)
-NORMAL_INSTALL = :
-PRE_INSTALL = :
-POST_INSTALL = :
-NORMAL_UNINSTALL = :
-PRE_UNINSTALL = :
-POST_UNINSTALL = :
-build_triplet = @build@
-host_triplet = @host@
-subdir = linbox/util/formats
-DIST_COMMON = $(pkgincludesub_HEADERS) $(srcdir)/Makefile.am \
- $(srcdir)/Makefile.in
-ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-am__aclocal_m4_deps = $(top_srcdir)/macros/aclocal-include.m4 \
- $(top_srcdir)/macros/config-header.m4 \
- $(top_srcdir)/macros/debug.m4 \
- $(top_srcdir)/macros/expat-check.m4 \
- $(top_srcdir)/macros/fflas-ffpack-check.m4 \
- $(top_srcdir)/macros/fplll-check.m4 \
- $(top_srcdir)/macros/givaro-check.m4 \
- $(top_srcdir)/macros/gmp-check.m4 \
- $(top_srcdir)/macros/iml-check.m4 \
- $(top_srcdir)/macros/lapack-check.m4 \
- $(top_srcdir)/macros/libtool.m4 \
- $(top_srcdir)/macros/lidia-check.m4 \
- $(top_srcdir)/macros/linbox-benchmark.m4 \
- $(top_srcdir)/macros/linbox-doc.m4 \
- $(top_srcdir)/macros/linbox-misc.m4 \
- $(top_srcdir)/macros/linbox-opt.m4 \
- $(top_srcdir)/macros/ltoptions.m4 \
- $(top_srcdir)/macros/ltsugar.m4 \
- $(top_srcdir)/macros/ltversion.m4 \
- $(top_srcdir)/macros/lt~obsolete.m4 \
- $(top_srcdir)/macros/m4ri-check.m4 \
- $(top_srcdir)/macros/m4rie-check.m4 \
- $(top_srcdir)/macros/maple-check.m4 \
- $(top_srcdir)/macros/mpfr-check.m4 \
- $(top_srcdir)/macros/ntl-check.m4 \
- $(top_srcdir)/macros/saclib-check.m4 \
- $(top_srcdir)/macros/sage-check.m4 $(top_srcdir)/configure.ac
-am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
- $(ACLOCAL_M4)
-mkinstalldirs = $(install_sh) -d
-CONFIG_HEADER = $(top_builddir)/config.h
-CONFIG_CLEAN_FILES =
-CONFIG_CLEAN_VPATH_FILES =
-depcomp =
-am__depfiles_maybe =
-SOURCES =
-DIST_SOURCES =
-am__can_run_installinfo = \
- case $$AM_UPDATE_INFO_DIR in \
- n|no|NO) false;; \
- *) (install-info --version) >/dev/null 2>&1;; \
- esac
-am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
-am__vpath_adj = case $$p in \
- $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
- *) f=$$p;; \
- esac;
-am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
-am__install_max = 40
-am__nobase_strip_setup = \
- srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
-am__nobase_strip = \
- for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
-am__nobase_list = $(am__nobase_strip_setup); \
- for p in $$list; do echo "$$p $$p"; done | \
- sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
- $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
- if (++n[$$2] == $(am__install_max)) \
- { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
- END { for (dir in files) print dir, files[dir] }'
-am__base_list = \
- sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
- sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
-am__uninstall_files_from_dir = { \
- test -z "$$files" \
- || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \
- || { echo " ( cd '$$dir' && rm -f" $$files ")"; \
- $(am__cd) "$$dir" && rm -f $$files; }; \
- }
-am__installdirs = "$(DESTDIR)$(pkgincludesubdir)"
-HEADERS = $(pkgincludesub_HEADERS)
-ETAGS = etags
-CTAGS = ctags
-DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
-ACLOCAL = @ACLOCAL@
-AMTAR = @AMTAR@
-AR = @AR@
-AUTOCONF = @AUTOCONF@
-AUTOHEADER = @AUTOHEADER@
-AUTOMAKE = @AUTOMAKE@
-AWK = @AWK@
-BLAS_CFLAGS = @BLAS_CFLAGS@
-BLAS_LIBS = @BLAS_LIBS@
-CC = @CC@
-CCNAM = @CCNAM@
-CFLAGS = @CFLAGS@
-CPPFLAGS = @CPPFLAGS@
-CXX = @CXX@
-CXXCPP = @CXXCPP@
-CXXFLAGS = @CXXFLAGS@
-CYGPATH_W = @CYGPATH_W@
-DBG = @DBG@
-DEBUG_CFLAGS = @DEBUG_CFLAGS@
-DEFAULT_CFLAGS = @DEFAULT_CFLAGS@
-DEFS = @DEFS@
-DLLTOOL = @DLLTOOL@
-DSYMUTIL = @DSYMUTIL@
-DUMPBIN = @DUMPBIN@
-ECHO_C = @ECHO_C@
-ECHO_N = @ECHO_N@
-ECHO_T = @ECHO_T@
-EGREP = @EGREP@
-EXEEXT = @EXEEXT@
-EXPAT_CFLAGS = @EXPAT_CFLAGS@
-EXPAT_LIBS = @EXPAT_LIBS@
-FFLAS_FFPACK_CFLAGS = @FFLAS_FFPACK_CFLAGS@
-FFLAS_FFPACK_LIBS = @FFLAS_FFPACK_LIBS@
-FFLAS_FFPACK_LOC = @FFLAS_FFPACK_LOC@
-FGREP = @FGREP@
-FPLLL_CFLAGS = @FPLLL_CFLAGS@
-FPLLL_LIBS = @FPLLL_LIBS@
-GIVARO_CFLAGS = @GIVARO_CFLAGS@
-GIVARO_LIBS = @GIVARO_LIBS@
-GMP_CFLAGS = @GMP_CFLAGS@
-GMP_LIBS = @GMP_LIBS@
-GMP_VERSION = @GMP_VERSION@
-GREP = @GREP@
-IML_CFLAGS = @IML_CFLAGS@
-IML_LIBS = @IML_LIBS@
-INSTALL = @INSTALL@
-INSTALL_DATA = @INSTALL_DATA@
-INSTALL_PROGRAM = @INSTALL_PROGRAM@
-INSTALL_SCRIPT = @INSTALL_SCRIPT@
-INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
-LD = @LD@
-LDFLAGS = @LDFLAGS@
-LIBOBJS = @LIBOBJS@
-LIBS = @LIBS@
-LIBTOOL = @LIBTOOL@
-LIDIA_CFLAGS = @LIDIA_CFLAGS@
-LIDIA_LIBS = @LIDIA_LIBS@
-LINBOX_BENCH_PATH = @LINBOX_BENCH_PATH@
-LINBOX_DOC_PATH = @LINBOX_DOC_PATH@
-LIPO = @LIPO@
-LN_S = @LN_S@
-LTLIBOBJS = @LTLIBOBJS@
-M4RIE_CFLAGS = @M4RIE_CFLAGS@
-M4RIE_LIBS = @M4RIE_LIBS@
-M4RI_CFLAGS = @M4RI_CFLAGS@
-M4RI_LIBS = @M4RI_LIBS@
-MAINT = @MAINT@
-MAKEINFO = @MAKEINFO@
-MANIFEST_TOOL = @MANIFEST_TOOL@
-MAPLE_CFLAGS = @MAPLE_CFLAGS@
-MAPLE_HOME = @MAPLE_HOME@
-MAPLE_LIBS = @MAPLE_LIBS@
-MAPLE_VERSION = @MAPLE_VERSION@
-MKDIR_P = @MKDIR_P@
-MPFR_CFLAGS = @MPFR_CFLAGS@
-MPFR_LIBS = @MPFR_LIBS@
-NM = @NM@
-NMEDIT = @NMEDIT@
-NTL_CFLAGS = @NTL_CFLAGS@
-NTL_LIBS = @NTL_LIBS@
-OBJDUMP = @OBJDUMP@
-OBJEXT = @OBJEXT@
-OTOOL = @OTOOL@
-OTOOL64 = @OTOOL64@
-PACKAGE = @PACKAGE@
-PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
-PACKAGE_NAME = @PACKAGE_NAME@
-PACKAGE_STRING = @PACKAGE_STRING@
-PACKAGE_TARNAME = @PACKAGE_TARNAME@
-PACKAGE_URL = @PACKAGE_URL@
-PACKAGE_VERSION = @PACKAGE_VERSION@
-PATH_SEPARATOR = @PATH_SEPARATOR@
-PROF = @PROF@
-RANLIB = @RANLIB@
-RM = @RM@
-SACLIB_CFLAGS = @SACLIB_CFLAGS@
-SACLIB_LIBS = @SACLIB_LIBS@
-SED = @SED@
-SET_MAKE = @SET_MAKE@
-SHELL = @SHELL@
-STRIP = @STRIP@
-TESTS_CFLAGS = @TESTS_CFLAGS@
-VERSION = @VERSION@
-WARN = @WARN@
-abs_builddir = @abs_builddir@
-abs_srcdir = @abs_srcdir@
-abs_top_builddir = @abs_top_builddir@
-abs_top_srcdir = @abs_top_srcdir@
-ac_ct_AR = @ac_ct_AR@
-ac_ct_CC = @ac_ct_CC@
-ac_ct_CXX = @ac_ct_CXX@
-ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
-am__leading_dot = @am__leading_dot@
-am__tar = @am__tar@
-am__untar = @am__untar@
-bindir = @bindir@
-build = @build@
-build_alias = @build_alias@
-build_cpu = @build_cpu@
-build_os = @build_os@
-build_vendor = @build_vendor@
-builddir = @builddir@
-datadir = @datadir@
-datarootdir = @datarootdir@
-docdir = @docdir@
-dvidir = @dvidir@
-exec_prefix = @exec_prefix@
-host = @host@
-host_alias = @host_alias@
-host_cpu = @host_cpu@
-host_os = @host_os@
-host_vendor = @host_vendor@
-htmldir = @htmldir@
-includedir = @includedir@
-infodir = @infodir@
-install_sh = @install_sh@
-libdir = @libdir@
-libexecdir = @libexecdir@
-localedir = @localedir@
-localstatedir = @localstatedir@
-mandir = @mandir@
-mkdir_p = @mkdir_p@
-oldincludedir = @oldincludedir@
-pdfdir = @pdfdir@
-prefix = @prefix@
-program_transform_name = @program_transform_name@
-psdir = @psdir@
-sbindir = @sbindir@
-sharedstatedir = @sharedstatedir@
-srcdir = @srcdir@
-sysconfdir = @sysconfdir@
-target_alias = @target_alias@
-top_build_prefix = @top_build_prefix@
-top_builddir = @top_builddir@
-top_srcdir = @top_srcdir@
-pkgincludesubdir = $(pkgincludedir)/util/formats
-pkgincludesub_HEADERS = \
- generic-dense.h \
- maple.h \
- matrix-market.h \
- sms.h \
- matrix-stream-readers.h \
- sparse-row.h
-
-all: all-am
-
-.SUFFIXES:
-$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps)
- @for dep in $?; do \
- case '$(am__configure_deps)' in \
- *$$dep*) \
- ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
- && { if test -f $@; then exit 0; else break; fi; }; \
- exit 1;; \
- esac; \
- done; \
- echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu --ignore-deps linbox/util/formats/Makefile'; \
- $(am__cd) $(top_srcdir) && \
- $(AUTOMAKE) --gnu --ignore-deps linbox/util/formats/Makefile
-.PRECIOUS: Makefile
-Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
- @case '$?' in \
- *config.status*) \
- cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
- *) \
- echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
- cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
- esac;
-
-$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
- cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-
-$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
- cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
- cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-$(am__aclocal_m4_deps):
-
-mostlyclean-libtool:
- -rm -f *.lo
-
-clean-libtool:
- -rm -rf .libs _libs
-install-pkgincludesubHEADERS: $(pkgincludesub_HEADERS)
- @$(NORMAL_INSTALL)
- @list='$(pkgincludesub_HEADERS)'; test -n "$(pkgincludesubdir)" || list=; \
- if test -n "$$list"; then \
- echo " $(MKDIR_P) '$(DESTDIR)$(pkgincludesubdir)'"; \
- $(MKDIR_P) "$(DESTDIR)$(pkgincludesubdir)" || exit 1; \
- fi; \
- for p in $$list; do \
- if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
- echo "$$d$$p"; \
- done | $(am__base_list) | \
- while read files; do \
- echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(pkgincludesubdir)'"; \
- $(INSTALL_HEADER) $$files "$(DESTDIR)$(pkgincludesubdir)" || exit $$?; \
- done
-
-uninstall-pkgincludesubHEADERS:
- @$(NORMAL_UNINSTALL)
- @list='$(pkgincludesub_HEADERS)'; test -n "$(pkgincludesubdir)" || list=; \
- files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
- dir='$(DESTDIR)$(pkgincludesubdir)'; $(am__uninstall_files_from_dir)
-
-ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
- list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
- unique=`for i in $$list; do \
- if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
- done | \
- $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
- END { if (nonempty) { for (i in files) print i; }; }'`; \
- mkid -fID $$unique
-tags: TAGS
-
-TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
- $(TAGS_FILES) $(LISP)
- set x; \
- here=`pwd`; \
- list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
- unique=`for i in $$list; do \
- if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
- done | \
- $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
- END { if (nonempty) { for (i in files) print i; }; }'`; \
- shift; \
- if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
- test -n "$$unique" || unique=$$empty_fix; \
- if test $$# -gt 0; then \
- $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
- "$$@" $$unique; \
- else \
- $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
- $$unique; \
- fi; \
- fi
-ctags: CTAGS
-CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
- $(TAGS_FILES) $(LISP)
- list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
- unique=`for i in $$list; do \
- if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
- done | \
- $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
- END { if (nonempty) { for (i in files) print i; }; }'`; \
- test -z "$(CTAGS_ARGS)$$unique" \
- || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
- $$unique
-
-GTAGS:
- here=`$(am__cd) $(top_builddir) && pwd` \
- && $(am__cd) $(top_srcdir) \
- && gtags -i $(GTAGS_ARGS) "$$here"
-
-distclean-tags:
- -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
-
-distdir: $(DISTFILES)
- @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
- topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
- list='$(DISTFILES)'; \
- dist_files=`for file in $$list; do echo $$file; done | \
- sed -e "s|^$$srcdirstrip/||;t" \
- -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
- case $$dist_files in \
- */*) $(MKDIR_P) `echo "$$dist_files" | \
- sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
- sort -u` ;; \
- esac; \
- for file in $$dist_files; do \
- if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
- if test -d $$d/$$file; then \
- dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
- if test -d "$(distdir)/$$file"; then \
- find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
- fi; \
- if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
- cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
- find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
- fi; \
- cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
- else \
- test -f "$(distdir)/$$file" \
- || cp -p $$d/$$file "$(distdir)/$$file" \
- || exit 1; \
- fi; \
- done
-check-am: all-am
-check: check-am
-all-am: Makefile $(HEADERS)
-installdirs:
- for dir in "$(DESTDIR)$(pkgincludesubdir)"; do \
- test -z "$$dir" || $(MKDIR_P) "$$dir"; \
- done
-install: install-am
-install-exec: install-exec-am
-install-data: install-data-am
-uninstall: uninstall-am
-
-install-am: all-am
- @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
-
-installcheck: installcheck-am
-install-strip:
- if test -z '$(STRIP)'; then \
- $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
- install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
- install; \
- else \
- $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
- install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
- "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
- fi
-mostlyclean-generic:
-
-clean-generic:
-
-distclean-generic:
- -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
- -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
-
-maintainer-clean-generic:
- @echo "This command is intended for maintainers to use"
- @echo "it deletes files that may require special tools to rebuild."
-clean: clean-am
-
-clean-am: clean-generic clean-libtool mostlyclean-am
-
-distclean: distclean-am
- -rm -f Makefile
-distclean-am: clean-am distclean-generic distclean-tags
-
-dvi: dvi-am
-
-dvi-am:
-
-html: html-am
-
-html-am:
-
-info: info-am
-
-info-am:
-
-install-data-am: install-pkgincludesubHEADERS
-
-install-dvi: install-dvi-am
-
-install-dvi-am:
-
-install-exec-am:
-
-install-html: install-html-am
-
-install-html-am:
-
-install-info: install-info-am
-
-install-info-am:
-
-install-man:
-
-install-pdf: install-pdf-am
-
-install-pdf-am:
-
-install-ps: install-ps-am
-
-install-ps-am:
-
-installcheck-am:
-
-maintainer-clean: maintainer-clean-am
- -rm -f Makefile
-maintainer-clean-am: distclean-am maintainer-clean-generic
-
-mostlyclean: mostlyclean-am
-
-mostlyclean-am: mostlyclean-generic mostlyclean-libtool
-
-pdf: pdf-am
-
-pdf-am:
-
-ps: ps-am
-
-ps-am:
-
-uninstall-am: uninstall-pkgincludesubHEADERS
-
-.MAKE: install-am install-strip
-
-.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \
- clean-libtool ctags distclean distclean-generic \
- distclean-libtool distclean-tags distdir dvi dvi-am html \
- html-am info info-am install install-am install-data \
- install-data-am install-dvi install-dvi-am install-exec \
- install-exec-am install-html install-html-am install-info \
- install-info-am install-man install-pdf install-pdf-am \
- install-pkgincludesubHEADERS install-ps install-ps-am \
- install-strip installcheck installcheck-am installdirs \
- maintainer-clean maintainer-clean-generic mostlyclean \
- mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
- tags uninstall uninstall-am uninstall-pkgincludesubHEADERS
-
-
-# Tell versions [3.59,3.63) of GNU make to not export all variables.
-# Otherwise a system limit (for SysV at least) may be exceeded.
-.NOEXPORT:
diff --git a/linbox/util/formats/maple.h b/linbox/util/formats/maple.h
index 80b3eff..e4a333b 100644
--- a/linbox/util/formats/maple.h
+++ b/linbox/util/formats/maple.h
@@ -39,10 +39,11 @@
#include <string>
#include <sstream>
+#include <cstring>
#include "linbox/util/matrix-stream.h"
#if 0
-namespace LinBox__FORMAT_MAPLE_H
+namespace LinBox__Tag::FileFormat::Maple_H
{
static const char* name = "Maple Text Format";
static const char* shortname = "maple";
@@ -105,7 +106,7 @@ namespace LinBox
i = int(pastNum - cand);
}
else {
- currentCol = i;
+ currentCol = (size_t)i;
return GOOD;
}
@@ -127,14 +128,14 @@ namespace LinBox
i = int(pastNum - cand);
}
else {
- currentCol = i;
+ currentCol = (size_t)i;
return GOOD;
}
while( cand[i] && isspace(cand[i]) ) ++i;
if( !cand[i] ) return GOOD;
if( cand[i] != ',' ) return BAD_FORMAT;
- currentCol = i;
+ currentCol = (size_t)i;
return GOOD;
}
@@ -377,11 +378,11 @@ namespace LinBox
candidate = strpbrk(candidate+1,"mM");
}
- bool lineend = false;
+ // bool lineend = false;
int i = 0;
if( candidate ) {
- lineend = currentCol <= 5;
+ bool lineend = (currentCol <= 5);
i = int(currentCol);
if( !lineend ) currentCol = 5;
while( !lineend && currentCol < 7 ) {
@@ -444,7 +445,9 @@ namespace LinBox
}
public:
- MapleReader() {
+ MapleReader() :
+ openParen(false),array(false)
+ {
currentCol = currentRow = 0;
stin = NULL;
}
@@ -456,10 +459,10 @@ namespace LinBox
bool isSparse() const { return !array; }
const char* getName() const
- { return "Maple Text Format"; }// LinBox__FORMAT_MAPLE_H::name; }
+ { return "Maple Text Format"; }// LinBox__Tag::FileFormat::Maple_H::name; }
const char* shortName() const
- { return "maple"; }// LinBox__FORMAT_MAPLE_H::shortname;
+ { return "maple"; }// LinBox__Tag::FileFormat::Maple_H::shortname;
};
@@ -468,11 +471,10 @@ namespace LinBox
#endif // __LINBOX_format_maple_H
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
// Local Variables:
// mode: C++
// tab-width: 8
// indent-tabs-mode: nil
// c-basic-offset: 8
// End:
-
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/util/formats/matrix-market.h b/linbox/util/formats/matrix-market.h
index 125ee81..b312b02 100644
--- a/linbox/util/formats/matrix-market.h
+++ b/linbox/util/formats/matrix-market.h
@@ -33,6 +33,7 @@
#include <string>
#include <sstream>
#include "linbox/util/matrix-stream.h"
+#include "linbox/integer.h"
#if 0
namespace LinBox__FORMAT_MATRIX_MARKET_H
@@ -45,12 +46,14 @@ namespace LinBox__FORMAT_MATRIX_MARKET_H
namespace LinBox
{
+#if 0
#ifndef __LINBOX_integer_H
class integer;
#endif
+#endif
#if 1 /* Unused */
- bool equalCaseInsensitive(const std::string s1, const char* s2)
+ bool equalCaseInsensitive(const std::string &s1, const char* s2)
{
int len = int(s1.size());
int counter = 0;
@@ -97,8 +100,10 @@ namespace LinBox
this->ms->readWhiteSpace();
}
- if( this->sin->eof() ) return END_OF_FILE;
- if( !this->sin->good() ) return BAD_FORMAT;
+ if (entriesLeft != 0) {
+ if( this->sin->eof()) return END_OF_FILE;
+ if( !this->sin->good()) return BAD_FORMAT;
+ }
this->knowM = this->knowN = true;
currentCol = currentRow = 1;
@@ -143,7 +148,7 @@ namespace LinBox
if( !this->sin->good() ) return BAD_FORMAT;
}
- if( pattern ) this->ms->getField().init(v,(integer)1);
+ if( pattern ) this->ms->getField().assign(v,this->ms->getField().one);
else {
this->ms->readWhiteSpace();
this->ms->getField().read(*(this->sin),v);
@@ -166,8 +171,13 @@ namespace LinBox
std::string st(firstLine);
std::stringstream stin(st);
- if( stin.get() != '%' || stin.get() != '%' )
+ //bb: cppcheck complained.
+ // if( stin.get() != '%' || stin.get() != '%' ) return NO_FORMAT;
+ if( stin.get() != '%')
+ return NO_FORMAT;
+ else if (stin.get() != '%' )
return NO_FORMAT;
+
if( !stin.good() ) return NO_FORMAT;
std::string s;
@@ -211,6 +221,10 @@ namespace LinBox
{
entriesLeft = -1;
currentCol = currentRow = 0;
+ //bb : why not intialised ?
+ array = false ;
+ pattern = false ;
+ symmetric = false ;
}
bool isSparse() const
@@ -234,11 +248,10 @@ namespace LinBox
#endif //__LINBOX_format_matrix_market_H
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
// Local Variables:
// mode: C++
// tab-width: 8
// indent-tabs-mode: nil
// c-basic-offset: 8
// End:
-
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/util/formats/matrix-stream-readers.h b/linbox/util/formats/matrix-stream-readers.h
index bc4381d..cfbfc4f 100644
--- a/linbox/util/formats/matrix-stream-readers.h
+++ b/linbox/util/formats/matrix-stream-readers.h
@@ -43,20 +43,21 @@
#include "matrix-market.h"
#include "maple.h"
-#define __MATRIX_STREAM_READERDEFS \
- addReader( new SMSReader<Field>() ); \
- addReader( new SparseRowReader<Field>() ); \
+#define __MATRIX_STREAM_READERDEFS \
+do { \
+ addReader( new SMSReader<Field>() ); \
+ addReader( new SparseRowReader<Field>() ); \
addReader( new MatrixMarketReader<Field>() ); \
- addReader( new MapleReader<Field>() ); \
- addReader( new DenseReader<Field>() );
+ addReader( new MapleReader<Field>() ); \
+ addReader( new DenseReader<Field>() ); \
+} while (false)
#endif //__LINBOX_matrix_stream_readers_H
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
// Local Variables:
// mode: C++
// tab-width: 8
// indent-tabs-mode: nil
// c-basic-offset: 8
// End:
-
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/util/formats/sms.h b/linbox/util/formats/sms.h
index bc91af7..56af418 100644
--- a/linbox/util/formats/sms.h
+++ b/linbox/util/formats/sms.h
@@ -30,8 +30,8 @@
* last line: 0 0 0
*/
-#ifndef __LINBOX_sms_H
-#define __LINBOX_sms_H
+#ifndef __LINBOX_util_formats_sms_H
+#define __LINBOX_util_formats_sms_H
#include <cstdlib>
@@ -112,8 +112,8 @@ namespace LinBox
if( m == 0 && n == 0 ) return END_OF_MATRIX;
- m -= _base;
- n -= _base;
+ m -= (size_t)_base;
+ n -= (size_t) _base;
if( m >= this->_m ||
n >= this->_n ) return BAD_FORMAT;
@@ -135,14 +135,13 @@ namespace LinBox
}
-#endif // __LINBOX_sms_H
+#endif // __LINBOX_util_formats_sms_H
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
// Local Variables:
// mode: C++
// tab-width: 8
// indent-tabs-mode: nil
// c-basic-offset: 8
// End:
-
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/util/formats/sparse-row.h b/linbox/util/formats/sparse-row.h
index a545e1b..7c7e8ec 100644
--- a/linbox/util/formats/sparse-row.h
+++ b/linbox/util/formats/sparse-row.h
@@ -109,7 +109,7 @@ namespace LinBox
if( this->sin->eof() ) return END_OF_FILE;
if( !this->sin->good() ) return BAD_FORMAT;
- n -= _base;
+ n -= (size_t)_base;
m = currentRow;
--colsLeft;
diff --git a/linbox/util/iml_wrapper.h b/linbox/util/iml_wrapper.h
index ac1cd48..743750f 100644
--- a/linbox/util/iml_wrapper.h
+++ b/linbox/util/iml_wrapper.h
@@ -1,6 +1,6 @@
/* Copyright (C) 2011 LinBox
- * Written by BB <brice.boyer at imag.fr>
+ * Written by Brice Boyer (briceboyer) <boyer.brice at gmail.com>
*
*
*
@@ -95,7 +95,7 @@ namespace IML {
}
#define REINTERP_IML_CONST(GivMat) \
- reinterpret_cast<mpz_t*>(const_cast<PID_integer::Element*>((GivMat)))
+ reinterpret_cast<mpz_t*>(const_cast<Givaro::ZRing<Integer>::Element*>((GivMat)))
#define REINTERP_IML(GivMat) \
reinterpret_cast<mpz_t*>((GivMat))
diff --git a/linbox/util/matrix-stream.h b/linbox/util/matrix-stream.h
index e1d16a2..83ee927 100644
--- a/linbox/util/matrix-stream.h
+++ b/linbox/util/matrix-stream.h
@@ -22,8 +22,8 @@
* ========LICENCE========
*/
-#ifndef __LINBOX_matrix_stream_H
-#define __LINBOX_matrix_stream_H
+#ifndef __LINBOX_util_matrix_stream_H
+#define __LINBOX_util_matrix_stream_H
/* matrix-stream.h
* Take a file or stream of a matrix, return (row, column, value) triples from
@@ -42,6 +42,8 @@
#include <iostream>
#include <queue>
#include <vector>
+#include "linbox/linbox-config.h"
+#include "linbox/integer.h"
namespace LinBox
{
@@ -231,7 +233,7 @@ class MatrixStream {
const Field& f;
/** To ensure no one makes a copy of an instance of this class */
- MatrixStream( const MatrixStream<Field>& ) ;// BB si {} pbm d'initialisation
+ MatrixStream( const MatrixStream<Field>& ) ;
/** Called by the constructors to get things going. */
void init();
@@ -239,6 +241,7 @@ class MatrixStream {
/** Adds the given MatrixStreamReader to the readers std::vector. */
void addReader( MatrixStreamReader<Field>* );
+
public:
/** Constructor from an input stream.
@@ -250,7 +253,11 @@ class MatrixStream {
MatrixStream( const Field& fld, std::istream& in );
/** Destructor */
- ~MatrixStream() { delete reader; }
+ ~MatrixStream()
+ {
+ if (reader != NULL)
+ delete reader;
+ }
/** Re initiliaze after one matrix has been read. */
void newmatrix();
@@ -307,6 +314,7 @@ class MatrixStream {
/** Get the Field that was passed to the constructor. */
const Field& getField() const { return f; }
+ const Field& field() const { return f; }
/** Get a brief description of the format of the matrix being read. */
const char* getFormat() const { return reader->getName(); }
@@ -324,14 +332,13 @@ class MatrixStream {
#include "matrix-stream.inl"
-#endif // __LINBOX_matrix_stream_H
+#endif // __LINBOX_util_matrix_stream_H
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
// Local Variables:
// mode: C++
// tab-width: 8
// indent-tabs-mode: nil
// c-basic-offset: 8
// End:
-
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/util/matrix-stream.inl b/linbox/util/matrix-stream.inl
index 96759e0..bd5beec 100644
--- a/linbox/util/matrix-stream.inl
+++ b/linbox/util/matrix-stream.inl
@@ -21,8 +21,8 @@
* ========LICENCE========
*/
-#ifndef __LINBOX_matrix_stream_INL
-#define __LINBOX_matrix_stream_INL
+#ifndef __LINBOX_util_matrix_stream_INL
+#define __LINBOX_util_matrix_stream_INL
#include "linbox/util/formats/matrix-stream-readers.h"
@@ -93,7 +93,7 @@ namespace LinBox
(std::vector<Element> &array)
{
MatrixStreamError mse = GOOD;
- size_t c = 0,loc,i,j;
+ size_t c = 0,i,j;
Element v;
while( true ) {
@@ -103,7 +103,7 @@ namespace LinBox
mse = getColumns(c);
if( mse > GOOD ) break;
}
- loc = i*c+j;
+ size_t loc = i*c+j;
if( loc >= array.size() )
array.resize(c ? (i+1)*c : loc+1);
array[loc] = v;
@@ -137,6 +137,7 @@ namespace LinBox
while( !knowM ) {
if( atEnd ) return END_OF_MATRIX;
toRet = saveNext();
+ m = _m; // when no entries, it is good
if( toRet > GOOD ) return toRet;
}
m = _m;
@@ -150,6 +151,7 @@ namespace LinBox
while( !knowN ) {
if( atEnd ) return END_OF_MATRIX;
toRet = saveNext();
+ n = _n; // when no entries, it is good
if( toRet > GOOD ) return toRet;
}
n = _n;
@@ -184,7 +186,7 @@ namespace LinBox
//Initialize readers
currentError = NO_FORMAT;
- __MATRIX_STREAM_READERDEFS
+ __MATRIX_STREAM_READERDEFS;
delete[] firstLine;
if( !reader ) return;
@@ -206,6 +208,8 @@ namespace LinBox
reader = r;
currentError = mse;
}
+ else delete r ;
+ return ;
}
template<class Field>
@@ -213,7 +217,12 @@ namespace LinBox
reader(NULL),in(i),readAnythingYet(false),f(fld)
{
init();
- if( currentError > GOOD ) throw currentError;
+ if( currentError > GOOD ){
+#ifndef NDEBUG
+ reportError(__func__,__LINE__);
+#endif
+ throw currentError;
+ }
}
template<class Field>
@@ -290,7 +299,11 @@ namespace LinBox
template<class Field>
bool MatrixStream<Field>::getDimensions( size_t& m, size_t& n )
{
- return( getRows(m) && getColumns(n) );
+ bool r = getRows(m);
+
+ bool c = getColumns(n); // need getColumns to be called
+
+ return( r && c );
}
template<class Field>
@@ -329,13 +342,12 @@ namespace LinBox
} // end of namespace LinBox
-#endif // __LINBOX_matrix_stream_INL
+#endif // __LINBOX_util_matrix_stream_INL
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
// Local Variables:
// mode: C++
// tab-width: 8
// indent-tabs-mode: nil
// c-basic-offset: 8
// End:
-
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/util/prime-stream.h b/linbox/util/prime-stream.h
index 8a46af7..77ddd83 100644
--- a/linbox/util/prime-stream.h
+++ b/linbox/util/prime-stream.h
@@ -69,23 +69,16 @@ namespace LinBox
Element &next (Element &a)
{
- /** @warning LinBox::Integer does not support prevprime */
-#if 0
if (_move_up == true) {
- nextprime (_curr, _curr);
+ _IPD.nextprimein(_curr);
a = _curr;
_curr += 2L;
}
else {
- prevprime (_curr, _curr);
+ _IPD.prevprimein(_curr);
a = _curr;
_curr -= 2L;
}
-#endif
-
- nextprime (_curr, _curr);
- a = _curr;
- _curr += 2L;
return a;
}
@@ -99,6 +92,7 @@ namespace LinBox
Integer _curr;
bool _move_up;
+ Givaro::IntPrimeDom _IPD; //!< empty struct dealing with primality
}; // class PrimeStream
diff --git a/linbox/util/timer.h b/linbox/util/timer.h
index ab71498..4532d14 100644
--- a/linbox/util/timer.h
+++ b/linbox/util/timer.h
@@ -11,20 +11,20 @@
* get elapsed times.
* ------------------------------------
*
- *
+ *
* ========LICENCE========
* This file is part of the library LinBox.
- *
+ *
* LinBox is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
- *
+ *
* This library 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
* Lesser General Public License for more details.
- *
+ *
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
@@ -42,6 +42,13 @@
#define __LINBOX_timer_H
#include <time.h>
+
+#ifdef __LINBOX_USE_OPENMP
+# ifndef __GIVARO_USE_OPENMP
+# define __GIVARO_USE_OPENMP 1
+# endif
+#endif
+
#include <givaro/givtimer.h>
namespace LinBox {
@@ -53,11 +60,10 @@ typedef Givaro::SysTimer SysTimer ;
#endif //__LINBOX_timer_H
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
// Local Variables:
// mode: C++
// tab-width: 8
// indent-tabs-mode: nil
// c-basic-offset: 8
// End:
-
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/util/write-mm.h b/linbox/util/write-mm.h
new file mode 100644
index 0000000..2529987
--- /dev/null
+++ b/linbox/util/write-mm.h
@@ -0,0 +1,111 @@
+
+/* Copyright (C) 2012 LinBox
+ * Written by bds
+ *
+ *
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ * ========LICENCE========
+ */
+
+#ifndef __LINBOX_write_mm_h
+#define __LINBOX_write_mm_h
+
+/* write-mm.h
+ * Tools to help write fields and matrices in matrix market formats.
+ *
+ */
+
+#include <iostream>
+#include <string>
+#include "linbox/integer.h"
+
+namespace LinBox
+{
+
+/// Write second line and comment part of matrix market header
+template <class Field>
+std::ostream& writeMMComment(std::ostream& os, Field& F, std::string name, std::string comment) {
+ F.write(os << "% written by LinBox::" << name << "<field>, field = ") << std::endl;
+ //F.write(os << name << "<"/*, std::string("")*/) << " >(F)" << std::endl;
+ if (comment.size() > 0)
+ os << "%" << std::endl << "% " << comment << std::endl << "%" << std::endl;
+ return os;
+}
+
+/// Write matrix market header (up to the i,j,val lines) for a sparse or structured matrix.
+template <class BB>
+std::ostream& writeMMCoordHeader(std::ostream& os, BB& A, size_t nnz, std::string name, std::string comment = "") {
+ os << "%%MatrixMarket matrix coordinate integer general" << std::endl;
+ writeMMComment(os, A.field(), name, comment);
+ os << A.rowdim() << " " << A.coldim() << " " << nnz << std::endl;
+ return os;
+}
+
+/// Write matrix market header (up to the i,j lines) for a {0,1} sparse or structured matrix.
+template <class BB>
+std::ostream& writeMMPatternHeader(std::ostream& os, BB& A, size_t nnz, std::string name, std::string comment = "") {
+ os << "%%MatrixMarket matrix coordinate pattern general" << std::endl;
+ writeMMComment(os, A.field(), name, comment);
+ os << A.rowdim() << " " << A.coldim() << " " << nnz << std::endl;
+ return os;
+}
+
+/// Write matrix market header (up to the entry lines) for a dense matrix.
+template <class BB>
+std::ostream& writeMMArrayHeader(std::ostream& os, BB& A, std::string name, std::string comment = "") {
+ os << "%%MatrixMarket matrix array integer general" << std::endl;
+ writeMMComment(os, A.field(), name, comment);
+ os << A.rowdim() << " " << A.coldim() << std::endl;
+ return os;
+}
+
+/// Generic dense matrix writer to matrix market array format (col major).
+template <class Mat>
+std::ostream& writeMMArray(std::ostream& os, Mat& A, std::string name, std::string comment = "") {
+ writeMMArrayHeader(os, A, name, comment);
+ typename Mat::Field::Element x; A.field().assign(x, A.field().zero);
+ for (size_t j = 0; j < A.coldim(); ++j)
+ for (size_t i = 0; i < A.rowdim(); ++i)
+ os << A.getEntry(x, i, j) << std::endl;
+ return os;
+}
+
+/// eltype(x) returns a string containing the name of the type of field or ring element x.
+inline std::string eltype(float x) { return "float"; }
+inline std::string eltype(double x) { return "double"; }
+inline std::string eltype(int8_t x) { return "int8_t"; }
+inline std::string eltype(int16_t x) { return "int16_t"; }
+inline std::string eltype(int32_t x) { return "int32_t"; }
+inline std::string eltype(int64_t x) { return "int64_t"; }
+inline std::string eltype(integer x) { return "integer"; }
+inline std::string eltype(uint8_t x) { return "uint8_t"; }
+inline std::string eltype(uint16_t x) { return "uint16_t"; }
+inline std::string eltype(uint32_t x) { return "uint32_t"; }
+inline std::string eltype(uint64_t x) { return "uint64_t"; }
+
+} // end of namespace LinBox
+#endif // __write_mm_h
+
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/vector/Makefile.am b/linbox/vector/Makefile.am
index afaef51..b440012 100644
--- a/linbox/vector/Makefile.am
+++ b/linbox/vector/Makefile.am
@@ -29,6 +29,7 @@ pkgincludesub_HEADERS= \
light_container.h \
sparse.h \
vector-traits.h \
+ vector.h \
subvector.h \
subiterator.h \
reverse.h \
@@ -37,6 +38,8 @@ pkgincludesub_HEADERS= \
stream-gf2.h \
bit-vector.h \
bit-vector.inl \
+ blas-vector.h \
+ blas-vector.inl \
vector-domain.h \
vector-domain-gf2.h \
vector-domain.inl \
diff --git a/linbox/vector/Makefile.in b/linbox/vector/Makefile.in
deleted file mode 100644
index e02a917..0000000
--- a/linbox/vector/Makefile.in
+++ /dev/null
@@ -1,592 +0,0 @@
-# Makefile.in generated by automake 1.11.5 from Makefile.am.
-# @configure_input@
-
-# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software
-# Foundation, Inc.
-# This Makefile.in is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
-# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
-# PARTICULAR PURPOSE.
-
- at SET_MAKE@
-
-# Copyright (c) 2010 the LinBox group
-# ========LICENCE========
-# This file is part of the library LinBox.
-#
-# LinBox is free software: you can redistribute it and/or modify
-# it under the terms of the GNU Lesser General Public
-# License as published by the Free Software Foundation; either
-# version 2.1 of the License, or (at your option) any later version.
-#
-# This library 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
-# Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public
-# License along with this library; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
-# ========LICENCE========
-
-VPATH = @srcdir@
-am__make_dryrun = \
- { \
- am__dry=no; \
- case $$MAKEFLAGS in \
- *\\[\ \ ]*) \
- echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \
- | grep '^AM OK$$' >/dev/null || am__dry=yes;; \
- *) \
- for am__flg in $$MAKEFLAGS; do \
- case $$am__flg in \
- *=*|--*) ;; \
- *n*) am__dry=yes; break;; \
- esac; \
- done;; \
- esac; \
- test $$am__dry = yes; \
- }
-pkgdatadir = $(datadir)/@PACKAGE@
-pkgincludedir = $(includedir)/@PACKAGE@
-pkglibdir = $(libdir)/@PACKAGE@
-pkglibexecdir = $(libexecdir)/@PACKAGE@
-am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
-install_sh_DATA = $(install_sh) -c -m 644
-install_sh_PROGRAM = $(install_sh) -c
-install_sh_SCRIPT = $(install_sh) -c
-INSTALL_HEADER = $(INSTALL_DATA)
-transform = $(program_transform_name)
-NORMAL_INSTALL = :
-PRE_INSTALL = :
-POST_INSTALL = :
-NORMAL_UNINSTALL = :
-PRE_UNINSTALL = :
-POST_UNINSTALL = :
-build_triplet = @build@
-host_triplet = @host@
-subdir = linbox/vector
-DIST_COMMON = $(pkgincludesub_HEADERS) $(srcdir)/Makefile.am \
- $(srcdir)/Makefile.in
-ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-am__aclocal_m4_deps = $(top_srcdir)/macros/aclocal-include.m4 \
- $(top_srcdir)/macros/config-header.m4 \
- $(top_srcdir)/macros/debug.m4 \
- $(top_srcdir)/macros/expat-check.m4 \
- $(top_srcdir)/macros/fflas-ffpack-check.m4 \
- $(top_srcdir)/macros/fplll-check.m4 \
- $(top_srcdir)/macros/givaro-check.m4 \
- $(top_srcdir)/macros/gmp-check.m4 \
- $(top_srcdir)/macros/iml-check.m4 \
- $(top_srcdir)/macros/lapack-check.m4 \
- $(top_srcdir)/macros/libtool.m4 \
- $(top_srcdir)/macros/lidia-check.m4 \
- $(top_srcdir)/macros/linbox-benchmark.m4 \
- $(top_srcdir)/macros/linbox-doc.m4 \
- $(top_srcdir)/macros/linbox-misc.m4 \
- $(top_srcdir)/macros/linbox-opt.m4 \
- $(top_srcdir)/macros/ltoptions.m4 \
- $(top_srcdir)/macros/ltsugar.m4 \
- $(top_srcdir)/macros/ltversion.m4 \
- $(top_srcdir)/macros/lt~obsolete.m4 \
- $(top_srcdir)/macros/m4ri-check.m4 \
- $(top_srcdir)/macros/m4rie-check.m4 \
- $(top_srcdir)/macros/maple-check.m4 \
- $(top_srcdir)/macros/mpfr-check.m4 \
- $(top_srcdir)/macros/ntl-check.m4 \
- $(top_srcdir)/macros/saclib-check.m4 \
- $(top_srcdir)/macros/sage-check.m4 $(top_srcdir)/configure.ac
-am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
- $(ACLOCAL_M4)
-mkinstalldirs = $(install_sh) -d
-CONFIG_HEADER = $(top_builddir)/config.h
-CONFIG_CLEAN_FILES =
-CONFIG_CLEAN_VPATH_FILES =
-depcomp =
-am__depfiles_maybe =
-SOURCES =
-DIST_SOURCES =
-am__can_run_installinfo = \
- case $$AM_UPDATE_INFO_DIR in \
- n|no|NO) false;; \
- *) (install-info --version) >/dev/null 2>&1;; \
- esac
-am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
-am__vpath_adj = case $$p in \
- $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
- *) f=$$p;; \
- esac;
-am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
-am__install_max = 40
-am__nobase_strip_setup = \
- srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
-am__nobase_strip = \
- for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
-am__nobase_list = $(am__nobase_strip_setup); \
- for p in $$list; do echo "$$p $$p"; done | \
- sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
- $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
- if (++n[$$2] == $(am__install_max)) \
- { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
- END { for (dir in files) print dir, files[dir] }'
-am__base_list = \
- sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
- sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
-am__uninstall_files_from_dir = { \
- test -z "$$files" \
- || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \
- || { echo " ( cd '$$dir' && rm -f" $$files ")"; \
- $(am__cd) "$$dir" && rm -f $$files; }; \
- }
-am__installdirs = "$(DESTDIR)$(pkgincludesubdir)"
-HEADERS = $(pkgincludesub_HEADERS)
-ETAGS = etags
-CTAGS = ctags
-DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
-ACLOCAL = @ACLOCAL@
-AMTAR = @AMTAR@
-AR = @AR@
-AUTOCONF = @AUTOCONF@
-AUTOHEADER = @AUTOHEADER@
-AUTOMAKE = @AUTOMAKE@
-AWK = @AWK@
-BLAS_CFLAGS = @BLAS_CFLAGS@
-BLAS_LIBS = @BLAS_LIBS@
-CC = @CC@
-CCNAM = @CCNAM@
-CFLAGS = @CFLAGS@
-CPPFLAGS = @CPPFLAGS@
-CXX = @CXX@
-CXXCPP = @CXXCPP@
-CXXFLAGS = @CXXFLAGS@
-CYGPATH_W = @CYGPATH_W@
-DBG = @DBG@
-DEBUG_CFLAGS = @DEBUG_CFLAGS@
-DEFAULT_CFLAGS = @DEFAULT_CFLAGS@
-DEFS = @DEFS@
-DLLTOOL = @DLLTOOL@
-DSYMUTIL = @DSYMUTIL@
-DUMPBIN = @DUMPBIN@
-ECHO_C = @ECHO_C@
-ECHO_N = @ECHO_N@
-ECHO_T = @ECHO_T@
-EGREP = @EGREP@
-EXEEXT = @EXEEXT@
-EXPAT_CFLAGS = @EXPAT_CFLAGS@
-EXPAT_LIBS = @EXPAT_LIBS@
-FFLAS_FFPACK_CFLAGS = @FFLAS_FFPACK_CFLAGS@
-FFLAS_FFPACK_LIBS = @FFLAS_FFPACK_LIBS@
-FFLAS_FFPACK_LOC = @FFLAS_FFPACK_LOC@
-FGREP = @FGREP@
-FPLLL_CFLAGS = @FPLLL_CFLAGS@
-FPLLL_LIBS = @FPLLL_LIBS@
-GIVARO_CFLAGS = @GIVARO_CFLAGS@
-GIVARO_LIBS = @GIVARO_LIBS@
-GMP_CFLAGS = @GMP_CFLAGS@
-GMP_LIBS = @GMP_LIBS@
-GMP_VERSION = @GMP_VERSION@
-GREP = @GREP@
-IML_CFLAGS = @IML_CFLAGS@
-IML_LIBS = @IML_LIBS@
-INSTALL = @INSTALL@
-INSTALL_DATA = @INSTALL_DATA@
-INSTALL_PROGRAM = @INSTALL_PROGRAM@
-INSTALL_SCRIPT = @INSTALL_SCRIPT@
-INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
-LD = @LD@
-LDFLAGS = @LDFLAGS@
-LIBOBJS = @LIBOBJS@
-LIBS = @LIBS@
-LIBTOOL = @LIBTOOL@
-LIDIA_CFLAGS = @LIDIA_CFLAGS@
-LIDIA_LIBS = @LIDIA_LIBS@
-LINBOX_BENCH_PATH = @LINBOX_BENCH_PATH@
-LINBOX_DOC_PATH = @LINBOX_DOC_PATH@
-LIPO = @LIPO@
-LN_S = @LN_S@
-LTLIBOBJS = @LTLIBOBJS@
-M4RIE_CFLAGS = @M4RIE_CFLAGS@
-M4RIE_LIBS = @M4RIE_LIBS@
-M4RI_CFLAGS = @M4RI_CFLAGS@
-M4RI_LIBS = @M4RI_LIBS@
-MAINT = @MAINT@
-MAKEINFO = @MAKEINFO@
-MANIFEST_TOOL = @MANIFEST_TOOL@
-MAPLE_CFLAGS = @MAPLE_CFLAGS@
-MAPLE_HOME = @MAPLE_HOME@
-MAPLE_LIBS = @MAPLE_LIBS@
-MAPLE_VERSION = @MAPLE_VERSION@
-MKDIR_P = @MKDIR_P@
-MPFR_CFLAGS = @MPFR_CFLAGS@
-MPFR_LIBS = @MPFR_LIBS@
-NM = @NM@
-NMEDIT = @NMEDIT@
-NTL_CFLAGS = @NTL_CFLAGS@
-NTL_LIBS = @NTL_LIBS@
-OBJDUMP = @OBJDUMP@
-OBJEXT = @OBJEXT@
-OTOOL = @OTOOL@
-OTOOL64 = @OTOOL64@
-PACKAGE = @PACKAGE@
-PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
-PACKAGE_NAME = @PACKAGE_NAME@
-PACKAGE_STRING = @PACKAGE_STRING@
-PACKAGE_TARNAME = @PACKAGE_TARNAME@
-PACKAGE_URL = @PACKAGE_URL@
-PACKAGE_VERSION = @PACKAGE_VERSION@
-PATH_SEPARATOR = @PATH_SEPARATOR@
-PROF = @PROF@
-RANLIB = @RANLIB@
-RM = @RM@
-SACLIB_CFLAGS = @SACLIB_CFLAGS@
-SACLIB_LIBS = @SACLIB_LIBS@
-SED = @SED@
-SET_MAKE = @SET_MAKE@
-SHELL = @SHELL@
-STRIP = @STRIP@
-TESTS_CFLAGS = @TESTS_CFLAGS@
-VERSION = @VERSION@
-WARN = @WARN@
-abs_builddir = @abs_builddir@
-abs_srcdir = @abs_srcdir@
-abs_top_builddir = @abs_top_builddir@
-abs_top_srcdir = @abs_top_srcdir@
-ac_ct_AR = @ac_ct_AR@
-ac_ct_CC = @ac_ct_CC@
-ac_ct_CXX = @ac_ct_CXX@
-ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
-am__leading_dot = @am__leading_dot@
-am__tar = @am__tar@
-am__untar = @am__untar@
-bindir = @bindir@
-build = @build@
-build_alias = @build_alias@
-build_cpu = @build_cpu@
-build_os = @build_os@
-build_vendor = @build_vendor@
-builddir = @builddir@
-datadir = @datadir@
-datarootdir = @datarootdir@
-docdir = @docdir@
-dvidir = @dvidir@
-exec_prefix = @exec_prefix@
-host = @host@
-host_alias = @host_alias@
-host_cpu = @host_cpu@
-host_os = @host_os@
-host_vendor = @host_vendor@
-htmldir = @htmldir@
-includedir = @includedir@
-infodir = @infodir@
-install_sh = @install_sh@
-libdir = @libdir@
-libexecdir = @libexecdir@
-localedir = @localedir@
-localstatedir = @localstatedir@
-mandir = @mandir@
-mkdir_p = @mkdir_p@
-oldincludedir = @oldincludedir@
-pdfdir = @pdfdir@
-prefix = @prefix@
-program_transform_name = @program_transform_name@
-psdir = @psdir@
-sbindir = @sbindir@
-sharedstatedir = @sharedstatedir@
-srcdir = @srcdir@
-sysconfdir = @sysconfdir@
-target_alias = @target_alias@
-top_build_prefix = @top_build_prefix@
-top_builddir = @top_builddir@
-top_srcdir = @top_srcdir@
-pkgincludesubdir = $(pkgincludedir)/vector
-EXTRA_DIST = \
- vector.doxy
-
-pkgincludesub_HEADERS = \
- pair.h \
- light_container.h \
- sparse.h \
- vector-traits.h \
- subvector.h \
- subiterator.h \
- reverse.h \
- random.h \
- stream.h \
- stream-gf2.h \
- bit-vector.h \
- bit-vector.inl \
- vector-domain.h \
- vector-domain-gf2.h \
- vector-domain.inl \
- vector-domain-gf2.inl
-
-all: all-am
-
-.SUFFIXES:
-$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps)
- @for dep in $?; do \
- case '$(am__configure_deps)' in \
- *$$dep*) \
- ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
- && { if test -f $@; then exit 0; else break; fi; }; \
- exit 1;; \
- esac; \
- done; \
- echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu --ignore-deps linbox/vector/Makefile'; \
- $(am__cd) $(top_srcdir) && \
- $(AUTOMAKE) --gnu --ignore-deps linbox/vector/Makefile
-.PRECIOUS: Makefile
-Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
- @case '$?' in \
- *config.status*) \
- cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
- *) \
- echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
- cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
- esac;
-
-$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
- cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-
-$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
- cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
- cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-$(am__aclocal_m4_deps):
-
-mostlyclean-libtool:
- -rm -f *.lo
-
-clean-libtool:
- -rm -rf .libs _libs
-install-pkgincludesubHEADERS: $(pkgincludesub_HEADERS)
- @$(NORMAL_INSTALL)
- @list='$(pkgincludesub_HEADERS)'; test -n "$(pkgincludesubdir)" || list=; \
- if test -n "$$list"; then \
- echo " $(MKDIR_P) '$(DESTDIR)$(pkgincludesubdir)'"; \
- $(MKDIR_P) "$(DESTDIR)$(pkgincludesubdir)" || exit 1; \
- fi; \
- for p in $$list; do \
- if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
- echo "$$d$$p"; \
- done | $(am__base_list) | \
- while read files; do \
- echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(pkgincludesubdir)'"; \
- $(INSTALL_HEADER) $$files "$(DESTDIR)$(pkgincludesubdir)" || exit $$?; \
- done
-
-uninstall-pkgincludesubHEADERS:
- @$(NORMAL_UNINSTALL)
- @list='$(pkgincludesub_HEADERS)'; test -n "$(pkgincludesubdir)" || list=; \
- files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
- dir='$(DESTDIR)$(pkgincludesubdir)'; $(am__uninstall_files_from_dir)
-
-ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
- list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
- unique=`for i in $$list; do \
- if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
- done | \
- $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
- END { if (nonempty) { for (i in files) print i; }; }'`; \
- mkid -fID $$unique
-tags: TAGS
-
-TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
- $(TAGS_FILES) $(LISP)
- set x; \
- here=`pwd`; \
- list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
- unique=`for i in $$list; do \
- if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
- done | \
- $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
- END { if (nonempty) { for (i in files) print i; }; }'`; \
- shift; \
- if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
- test -n "$$unique" || unique=$$empty_fix; \
- if test $$# -gt 0; then \
- $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
- "$$@" $$unique; \
- else \
- $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
- $$unique; \
- fi; \
- fi
-ctags: CTAGS
-CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
- $(TAGS_FILES) $(LISP)
- list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
- unique=`for i in $$list; do \
- if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
- done | \
- $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
- END { if (nonempty) { for (i in files) print i; }; }'`; \
- test -z "$(CTAGS_ARGS)$$unique" \
- || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
- $$unique
-
-GTAGS:
- here=`$(am__cd) $(top_builddir) && pwd` \
- && $(am__cd) $(top_srcdir) \
- && gtags -i $(GTAGS_ARGS) "$$here"
-
-distclean-tags:
- -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
-
-distdir: $(DISTFILES)
- @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
- topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
- list='$(DISTFILES)'; \
- dist_files=`for file in $$list; do echo $$file; done | \
- sed -e "s|^$$srcdirstrip/||;t" \
- -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
- case $$dist_files in \
- */*) $(MKDIR_P) `echo "$$dist_files" | \
- sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
- sort -u` ;; \
- esac; \
- for file in $$dist_files; do \
- if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
- if test -d $$d/$$file; then \
- dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
- if test -d "$(distdir)/$$file"; then \
- find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
- fi; \
- if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
- cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
- find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
- fi; \
- cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
- else \
- test -f "$(distdir)/$$file" \
- || cp -p $$d/$$file "$(distdir)/$$file" \
- || exit 1; \
- fi; \
- done
-check-am: all-am
-check: check-am
-all-am: Makefile $(HEADERS)
-installdirs:
- for dir in "$(DESTDIR)$(pkgincludesubdir)"; do \
- test -z "$$dir" || $(MKDIR_P) "$$dir"; \
- done
-install: install-am
-install-exec: install-exec-am
-install-data: install-data-am
-uninstall: uninstall-am
-
-install-am: all-am
- @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
-
-installcheck: installcheck-am
-install-strip:
- if test -z '$(STRIP)'; then \
- $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
- install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
- install; \
- else \
- $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
- install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
- "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
- fi
-mostlyclean-generic:
-
-clean-generic:
-
-distclean-generic:
- -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
- -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
-
-maintainer-clean-generic:
- @echo "This command is intended for maintainers to use"
- @echo "it deletes files that may require special tools to rebuild."
-clean: clean-am
-
-clean-am: clean-generic clean-libtool mostlyclean-am
-
-distclean: distclean-am
- -rm -f Makefile
-distclean-am: clean-am distclean-generic distclean-tags
-
-dvi: dvi-am
-
-dvi-am:
-
-html: html-am
-
-html-am:
-
-info: info-am
-
-info-am:
-
-install-data-am: install-pkgincludesubHEADERS
-
-install-dvi: install-dvi-am
-
-install-dvi-am:
-
-install-exec-am:
-
-install-html: install-html-am
-
-install-html-am:
-
-install-info: install-info-am
-
-install-info-am:
-
-install-man:
-
-install-pdf: install-pdf-am
-
-install-pdf-am:
-
-install-ps: install-ps-am
-
-install-ps-am:
-
-installcheck-am:
-
-maintainer-clean: maintainer-clean-am
- -rm -f Makefile
-maintainer-clean-am: distclean-am maintainer-clean-generic
-
-mostlyclean: mostlyclean-am
-
-mostlyclean-am: mostlyclean-generic mostlyclean-libtool
-
-pdf: pdf-am
-
-pdf-am:
-
-ps: ps-am
-
-ps-am:
-
-uninstall-am: uninstall-pkgincludesubHEADERS
-
-.MAKE: install-am install-strip
-
-.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \
- clean-libtool ctags distclean distclean-generic \
- distclean-libtool distclean-tags distdir dvi dvi-am html \
- html-am info info-am install install-am install-data \
- install-data-am install-dvi install-dvi-am install-exec \
- install-exec-am install-html install-html-am install-info \
- install-info-am install-man install-pdf install-pdf-am \
- install-pkgincludesubHEADERS install-ps install-ps-am \
- install-strip installcheck installcheck-am installdirs \
- maintainer-clean maintainer-clean-generic mostlyclean \
- mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
- tags uninstall uninstall-am uninstall-pkgincludesubHEADERS
-
-
-# Tell versions [3.59,3.63) of GNU make to not export all variables.
-# Otherwise a system limit (for SysV at least) may be exceeded.
-.NOEXPORT:
diff --git a/linbox/vector/bit-vector.h b/linbox/vector/bit-vector.h
old mode 100644
new mode 100755
index 38a8464..1e8b831
--- a/linbox/vector/bit-vector.h
+++ b/linbox/vector/bit-vector.h
@@ -1,22 +1,22 @@
/* linbox/vector/bit-vector.h
- * Copyright (C) 2003 Bradford Hovinen
+ * Copyright (C) 2003 LinBox
*
* -------------------------------------------------
*
- *
+ *
* ========LICENCE========
* This file is part of the library LinBox.
- *
+ *
* LinBox is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
- *
+ *
* This library 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
* Lesser General Public License for more details.
- *
+ *
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
@@ -27,12 +27,12 @@
#ifndef __LINBOX_bit_vector_H
#define __LINBOX_bit_vector_H
+#include <linbox/linbox-config.h>
+#include "linbox/vector/vector.h"
#include <iterator>
#include <vector>
#include <stdexcept>
-#include "linbox/vector/vector-traits.h"
-
namespace LinBox
{
@@ -72,7 +72,7 @@ namespace LinBox
#else
#pragma message "error SIZEOF_LONG not defined !"
#endif
-
+
/** A vector of boolean 0-1 values, stored compactly to save space.
*
* BitVector provides an additional iterator, word_iterator, that gives
@@ -98,6 +98,16 @@ namespace LinBox
BitVector (std::vector<unsigned long> &v) :
_v (v), _size (_v.size () * __LINBOX_BITSOF_LONG) {}
BitVector (size_t n, bool val = false)
+ { resize (n, val);
+ std::cerr << "bV: " << _size << ", _v: " << _v.size() << std::endl;
+ }
+
+
+ template <class F2Field> BitVector (const F2Field&, std::vector<bool> &v)
+ { *this = v; }
+ template <class F2Field> BitVector (const F2Field&, std::vector<unsigned long> &v) :
+ _v (v), _size (_v.size () * __LINBOX_BITSOF_LONG) {}
+ template <class F2Field> BitVector (const F2Field&, size_t n, bool val = false)
{ resize (n, val); }
// Copy constructor
@@ -173,6 +183,15 @@ namespace LinBox
}; // template <class Vector> class ReverseVector
+
+} // namespace LinBox
+
+#include "linbox/vector/bit-vector.inl"
+#include "linbox/vector/vector-traits.h"
+
+// RawVector for GF2
+namespace LinBox
+{
// Vector traits for BitVector wrapper
template <>
struct VectorTraits<BitVector>
@@ -181,11 +200,6 @@ namespace LinBox
typedef VectorCategories::DenseZeroOneVectorTag VectorCategory;
};
-} // namespace LinBox
-
-// RawVector for GF2
-namespace LinBox
-{
template <>
struct RawVector<bool> {
public:
@@ -197,16 +211,14 @@ namespace LinBox
};
}
-#include "linbox/vector/bit-vector.inl"
#endif // __LINBOX_bit_vector_H
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
// Local Variables:
// mode: C++
// tab-width: 8
// indent-tabs-mode: nil
// c-basic-offset: 8
// End:
-
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/vector/bit-vector.inl b/linbox/vector/bit-vector.inl
old mode 100644
new mode 100755
index 8100ba8..3d7761e
--- a/linbox/vector/bit-vector.inl
+++ b/linbox/vector/bit-vector.inl
@@ -3,20 +3,20 @@
*
* -------------------------------------------------
*
- *
+ *
* ========LICENCE========
* This file is part of the library LinBox.
- *
+ *
* LinBox is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
- *
+ *
* This library 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
* Lesser General Public License for more details.
- *
+ *
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
@@ -83,6 +83,9 @@ namespace LinBox
return *this;
}
+ // fake, to satisfy compiler, can't be used.
+ std::iterator_traits<BitVector::iterator>::pointer operator & () const { return 0; }
+
reference &operator &= (reference &a)
{
*_word &= ~(1UL << _pos) | (a.get_bit () << (_pos - a._pos));
@@ -129,10 +132,13 @@ namespace LinBox
friend class const_iterator;
friend class const_reference;
+#if 0 /* unused */
unsigned long neg_mask_word (void)
{
return *_word & ~(1UL << _pos);
}
+#endif
+
unsigned long get_bit ()
{
return *_word & (1UL << _pos);
@@ -144,7 +150,7 @@ namespace LinBox
inline std::istream &operator >> (std::istream &is, BitVector::reference &a)
{
- bool v;
+ bool v = true;
is >> v;
a = v;
return is;
@@ -173,6 +179,9 @@ namespace LinBox
~const_reference () {}
+ // fake, to satisfy compiler, can't be used.
+ std::iterator_traits<BitVector::iterator>::pointer operator & () const { return 0; }
+
operator bool (void) const
{
return (*_word >> _pos) & 1UL;
@@ -207,10 +216,13 @@ namespace LinBox
{}
iterator (std::vector<unsigned long>::iterator word, uint8_t position) :
_ref (word, position)
- {}
+ {}
iterator (const iterator &i) :
std::vector<bool>::iterator(),_ref (i._ref._word, i._ref._pos)
{}
+ iterator (const pointer i) :
+ _ref (std::vector<unsigned long>::iterator (), 0UL)
+ {}
iterator &operator = (const iterator &i)
{
@@ -218,6 +230,9 @@ namespace LinBox
_ref._pos = i._ref._pos;
return *this;
}
+ // fakes to please compiler. Not to be used.
+ iterator &operator = (const reference* i) { return *this; }
+ iterator &operator = (const bool* i) { return *this; }
iterator &operator ++ ()
{
@@ -239,13 +254,7 @@ namespace LinBox
iterator operator + (difference_type i) const
{
std::vector<unsigned long>::iterator new_word = _ref._word + (i >> __LINBOX_LOGOF_SIZE);
-// #ifdef __INTEL_COMPILER
-// #pragma warning(disable:2259)
-// #endif
uint8_t new_pos = (uint8_t) ((int)_ref._pos + (i & __LINBOX_POS_ALL_ONES));
-// #ifdef __INTEL_COMPILER
-// #pragma warning(enable:2259)
-// #endif
new_word += new_pos >> __LINBOX_LOGOF_SIZE;
new_pos &= __LINBOX_POS_ALL_ONES;
@@ -384,13 +393,7 @@ namespace LinBox
const_iterator operator + (long i) const
{
std::vector<unsigned long>::const_iterator new_word = _ref._word + (i >> __LINBOX_LOGOF_SIZE);
-// #ifdef __INTEL_COMPILER
-// #pragma warning(disable:2259)
-// #endif
uint8_t new_pos = (uint8_t) ((int)_ref._pos + (i & __LINBOX_POS_ALL_ONES));
-// #ifdef __INTEL_COMPILER
-// #pragma warning(enable:2259)
-// #endif
new_word += new_pos >> __LINBOX_LOGOF_SIZE;
new_pos &= __LINBOX_POS_ALL_ONES;
@@ -400,13 +403,7 @@ namespace LinBox
const_iterator &operator += (long i)
{
_ref._word += i >> __LINBOX_LOGOF_SIZE;
-// #ifdef __INTEL_COMPILER
-// #pragma warning(disable:2259)
-// #endif
_ref._pos = (uint8_t) ((int) _ref._pos + (i & __LINBOX_POS_ALL_ONES));
-// #ifdef __INTEL_COMPILER
-// #pragma warning(enable:2259)
-// #endif
_ref._word += _ref._pos >> __LINBOX_LOGOF_SIZE;
_ref._pos &= __LINBOX_POS_ALL_ONES;
return *this;
@@ -494,7 +491,7 @@ namespace LinBox
if ((_size & __LINBOX_POS_ALL_ONES) == 0UL)
return iterator (_v.end (), 0UL);
else
- return iterator (_v.end () - 1UL, _size & __LINBOX_POS_ALL_ONES);
+ return iterator (_v.end () - 1UL, (uint8_t)(_size & __LINBOX_POS_ALL_ONES));
}
inline BitVector::const_iterator BitVector::end (void) const
@@ -502,7 +499,7 @@ namespace LinBox
if ((_size & __LINBOX_POS_ALL_ONES) == 0UL)
return const_iterator (_v.end (), 0UL);
else
- return const_iterator (_v.end () - 1UL, _size & __LINBOX_POS_ALL_ONES);
+ return const_iterator (_v.end () - 1UL, (uint8_t)(_size & __LINBOX_POS_ALL_ONES));
}
inline BitVector::reverse_iterator BitVector::rbegin (void)
@@ -566,7 +563,7 @@ namespace LinBox
if ( (_size & __LINBOX_POS_ALL_ONES) == 0UL)
return reference (_v.end (), 0UL);
else
- return reference (_v.end () - 1UL, _size & __LINBOX_POS_ALL_ONES);
+ return reference (_v.end () - 1UL, (uint8_t)(_size & __LINBOX_POS_ALL_ONES));
}
inline BitVector::const_reference BitVector::back (void) const
@@ -574,7 +571,7 @@ namespace LinBox
if ( (_size & __LINBOX_POS_ALL_ONES) == 0UL)
return const_reference (_v.end (), 0UL);
else
- return const_reference (_v.end () - 1UL, _size & __LINBOX_POS_ALL_ONES);
+ return const_reference (_v.end () - 1UL, (uint8_t)(_size & __LINBOX_POS_ALL_ONES));
}
template<class Container>
@@ -659,11 +656,10 @@ namespace LinBox
#endif // __LINBOX_bit_vector_INL
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
// Local Variables:
// mode: C++
// tab-width: 8
// indent-tabs-mode: nil
// c-basic-offset: 8
// End:
-
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/vector/blas-vector.h b/linbox/vector/blas-vector.h
new file mode 100644
index 0000000..8dcdef5
--- /dev/null
+++ b/linbox/vector/blas-vector.h
@@ -0,0 +1,992 @@
+/* linbox/matrix/blas-vector.h
+ * Copyright (C) 2013 the LinBox group
+ *
+ * Written by :
+ * Brice Boyer (briceboyer) <boyer.brice at gmail.com>
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ * ========LICENCE========
+ */
+
+
+/*! @file vector/blas-vector.h
+ * @ingroup vector
+ * A \c BlasVector<\c _Field > represents a vector as an array of
+ * <code>_Field::Element</code>s.
+ *
+ */
+
+#ifndef __LINBOX_vector_blas_vector_H
+#define __LINBOX_vector_blas_vector_H
+
+#include "linbox/linbox-config.h"
+#include "linbox/util/debug.h"
+#include "linbox/linbox-tags.h"
+#include "linbox/field/hom.h"
+#include "linbox/vector/vector.h"
+#include "linbox/vector/subvector.h"
+#include "linbox/vector/subiterator.h"
+
+namespace LinBox { /* BlasVector */
+
+ template<class _Field, class _Rep>
+ class BlasMatrix ;
+
+ template<class _Matrix>
+ class BlasSubmatrix ;
+
+
+ template<class _Field, class _blasRep>
+ class BlasVector : public Subvector<Subiterator<typename _blasRep::iterator > > {
+
+ public:
+ typedef _Field Field;
+ typedef typename Field::Element Element; //!< Element type
+ typedef _blasRep Rep; //!< Actually a <code>std::vector<Element></code> (or alike.)
+ typedef typename Rep::pointer pointer; //!< pointer type to elements
+ typedef const pointer const_pointer; //!< const pointer type
+ typedef BlasVector<_Field,_blasRep> Self_t; //!< Self type
+ typedef BlasSubvector<Self_t> subVectorType; //!< Submatrix type
+ typedef BlasVector<_Field,_blasRep> vectorType; //!< matrix type
+ typedef BlasVector<_Field,_blasRep> blasType; //!< blas type
+
+ public: /* iterators */
+ typedef Subvector<Subiterator<typename _blasRep::iterator > > Father_t;
+ typedef typename Father_t::iterator iterator;
+ typedef iterator Iterator ;
+ typedef typename Father_t::const_iterator const_iterator;
+ // typedef typename Father_t::size_type size_type;
+
+
+
+ protected:
+ size_t _size;
+ size_t _1stride;
+ Rep _rep;
+ pointer _ptr;
+ const Field * _field;
+ private:
+ void createBlasVector(const BlasVector<_Field,_blasRep> & V)
+ {
+ //! use std::copy somehow ?
+ for (size_t i = 0 ; i < _size ; ++i)
+ setEntry(i,V.getEntry(i));
+ }
+
+ void createBlasVector(const BlasVector<_Field,_blasRep> & V
+ , const size_t i0, const size_t str)
+ {
+ for (size_t i = 0 ; i < _size ; ++i)
+ setEntry(i,V.getEntry(i0+i*str));
+ }
+
+ template<class _Vector>
+ void createBlasVector(const BlasSubvector<_Vector> & V)
+ {
+ //! use std::copy somehow ?
+ for (size_t i = 0 ; i < _size ; ++i)
+ setEntry(i,V.getEntry(i));
+ }
+
+ void createBlasVector ( const Element * V)
+ {
+ //! use std::copy somehow ?
+ for (size_t i = 0 ; i < _size ; ++i)
+ setEntry(i,V[i]);
+ }
+
+ void createBlasVector ( const Element * V
+ , const size_t i0, const size_t str)
+ {
+ for (size_t i = 0 ; i < _size ; ++i)
+ setEntry(i,V[i0+i*str]);
+ }
+
+ void createBlasVector ( const std::vector<Element> & V)
+ {
+ createBlasVector(&V[0]);
+ }
+
+ template<class OtherVector>
+ void createBlasVector( const OtherVector &V)
+ {
+ iterator it = _rep.begin();
+ typename OtherVector::const_iterator jt = V.begin();
+ for ( ; it != _rep.end(); ++it, ++jt)
+ _field->init(*it, *jt) ;
+
+ }
+
+ void createBlasVector ( const std::vector<Element> & V
+ , const size_t i0, const size_t str)
+ {
+ createBlasVector(&V[0],i0,str);
+ }
+
+ /** Gets a vector from data in a BlasMatrix.
+ * Vector starts at \c (i0,j0) and next element is \p stride away.
+ * For instance, row \c i correpsonds to args \c (i,0,1) and col \c j is \c (0,j,lda)
+ * It is possible to get vectors that extend over multiple rows/columns
+ * and \p stride need not be equal to \c 1 or \c lda.
+ */
+ void createBlasVector ( const BlasMatrix<Field,Rep> & A, size_t i0, size_t j0, size_t str)
+ {
+ if ((str == 1) && (i0+_size*str<A.coldim())){
+ for (size_t i = 0 ; i < _size ; ++i)
+ setEntry(i,A.getEntry(i0+i,j0));
+ }
+ else if ((str == A.coldim()) && j0+_size*str<A.rowdim()) {
+ for (size_t i = 0 ; i < _size ; ++i)
+ setEntry(i,A.getEntry(i0,j0+i));
+ }
+ else{ /* is this always faster ? */
+ Element * Aptr = A.getPointer(i0,j0);
+ for (size_t i = 0 ; i < _size ; ++i)
+ setEntry(i,Aptr[i*str]);
+ }
+ }
+
+ template<class _Matrix>
+ void createBlasVector ( const BlasSubmatrix<_Matrix> & A, size_t i0, size_t j0, size_t str)
+ {
+ Element * Aptr = A.getPointer(i0,j0);
+ for (size_t i = 0 ; i < _size ; ++i)
+ setEntry(i,Aptr[i*str]);
+ }
+
+
+ public:
+ BlasVector () {} ;
+
+ BlasVector (const _Field &F) :
+ Father_t(),
+ _size(0),_1stride(1),_rep(0),_ptr(&_rep[0]), _field(&F)
+ {
+ // Father_t is garbage until then:
+ setIterators();
+ // linbox_check(_ptr != NULL);
+ }
+
+#if 0
+ void init(const _Field & F, size_t n = 0)
+ {
+ _field = &F;
+ _size = n;
+ _1stride=1 ;
+ _rep.resize(n, F.zero);
+ _ptr = &_rep[0];
+ }
+#endif
+
+#ifdef __GNUC__
+#ifndef __x86_64__
+#if (__GNUC__ == 4 && __GNUC_MINOR__ ==4 && __GNUC_PATCHLEVEL__==5)
+ BlasVector (const _Field &F, const long &m, const Element e=Element()) :
+ Father_t(),
+ _size((size_t)m),_1stride(1),_rep((size_t)_size, e),_ptr(&_rep[0]),_field(&F)
+ {
+ // Father_t is garbage until then:
+ setIterators();
+
+ linbox_check(_size==0 || _ptr != NULL);
+ }
+#endif
+#endif
+#endif
+
+#if defined(__APPLE__) || (defined(__s390__) && !defined(__s390x__))
+ BlasVector (const _Field &F, const unsigned long &m, const Element e=Element()) :
+ Father_t(),
+ _size((size_t)m),_1stride(1),_rep((size_t)_size, e),_ptr(&_rep[0]),_field(&F)
+ {
+ // Father_t is garbage until then:
+ setIterators();
+
+ linbox_check(_size==0 || _ptr != NULL);
+ linbox_check(_size >= this->begin()->_stride);
+ }
+
+#endif
+
+ BlasVector (const _Field &F, const uint64_t &m, const Element e=Element()) :
+ Father_t(),
+ _size((size_t)m),_1stride(1),_rep((size_t)_size, e),_ptr(&_rep[0]),_field(&F)
+ {
+ // Father_t is garbage until then:
+ setIterators();
+ // linbox_check(_ptr != NULL);
+ }
+
+
+ BlasVector (const _Field &F, const int64_t &m, const Element e=Element()) :
+ Father_t(),
+ _size((size_t)m),_1stride(1),_rep((size_t)_size, e),_ptr(&_rep[0]),_field(&F)
+ {
+ // Father_t is garbage until then:
+ setIterators();
+
+
+ linbox_check(_size==0 || _ptr != NULL);
+ }
+
+
+ BlasVector (const _Field &F, const uint32_t &m, const Element e=Element()) :
+ Father_t(),
+ _size((size_t)m),
+ _1stride(1),
+ _rep((size_t)_size, e),
+ _ptr(&_rep[0]),
+ _field(&F)
+ {
+ // Father_t is garbage until then:
+ setIterators();
+
+
+ linbox_check(_size==0 || _ptr != NULL);
+ }
+
+ BlasVector (const _Field &F, const int32_t &m, const Element e=Element()) :
+ Father_t(),
+ _size((size_t)m),_1stride(1),_rep((size_t)_size, e),_ptr(&_rep[0]),_field(&F)
+ {
+ // Father_t is garbage until then:
+ setIterators();
+
+
+ linbox_check(_size==0 || _ptr != NULL);
+ }
+
+ BlasVector (const _Field &F, const Integer & m, const Element e=Element()) :
+ Father_t(),
+ _size((size_t)m),_1stride(1),_rep((size_t)_size, e),_ptr(&_rep[0]),_field(&F)
+ {
+ // Father_t is garbage until then:
+ setIterators();
+
+
+ linbox_check(_size==0 || _ptr != NULL);
+ }
+
+ //! @bug be careful with copy constructor. We should ban them and provide copy.
+ BlasVector (const BlasVector<_Field,_blasRep> &V) :
+ Father_t(), // will be created afterwards...
+ _size(V.size())
+ ,_1stride(1)
+ ,_rep(V.size()/*, V.field().zero*/) //!@bug segfault in cra otherwise (test-rat-solve eg)
+ ,_ptr(&_rep[0])
+ ,_field(&(V.field()))
+ {
+ // Father_t is garbage until then:
+ setIterators();
+
+ createBlasVector(V);
+
+ linbox_check(_size==0 || _ptr != NULL);
+ }
+
+ //! @bug F is last for matrix
+ template<class VectorBase>
+ BlasVector (const _Field & F, const VectorBase & V) :
+ Father_t(), // will be created afterwards...
+ _size(V.size()),_1stride(1),_rep(V.size(), F.zero),_ptr(&_rep[0]),_field(&F)
+ {
+ // Father_t is garbage until then:
+ setIterators();
+
+ createBlasVector(V);
+
+ linbox_check(_size==0 || _ptr != NULL);
+ }
+
+
+ template<class _Vector>
+ BlasVector (const BlasSubvector<_Vector> &V) :
+ Father_t(),
+ _size(V.size()),_1stride(1),_rep(V.size(), V.field().zero),_ptr(&_rep[0]),_field(&(V.field()))
+ {
+ // Father_t is garbage until then:
+ setIterators();
+
+
+ createBlasVector(V);
+ linbox_check(_size==0 || _ptr != NULL);
+ }
+
+ BlasVector (const BlasMatrix<Field,Rep> &A, size_t k, LINBOX_enum (Tag::Direction) f ) :
+ Father_t(),
+ _size((f == Tag::Direction::Row)?(A.rowdim()):(A.coldim())),_1stride(1),_rep(_size, A.field().zero),_ptr(&_rep[0]),_field(&(A.field()))
+ {
+ // Father_t is garbage until then:
+ setIterators();
+
+
+ if (f==Tag::Direction::Row)
+ createBlasVector(A,k,0,1);
+ else // Tag::Col
+ createBlasVector(A,0,k,A.coldim());
+ linbox_check(_size==0 || _ptr != NULL);
+
+ }
+
+ template<class _Matrix>
+ BlasVector (const BlasSubmatrix<_Matrix> &A, size_t k, LINBOX_enum (Tag::Direction) f ) :
+ Father_t(),
+ _size((f==Tag::Direction::Row)?(A.rowdim()):(A.coldim())),_1stride(1),_rep(_size, A.field().zero),_ptr(&_rep[0]),_field(&(A.field()))
+ {
+ // Father_t is garbage until then:
+ setIterators();
+
+
+ if (f==Tag::Direction::Row)
+ createBlasVector(A,k,0,1);
+ else // Tag::Col
+ createBlasVector(A,0,k,A.stride());
+ linbox_check(_size==0 || _ptr != NULL);
+ }
+
+ BlasVector (const BlasMatrix<Field,Rep> &A, size_t n, size_t i0, size_t j0, size_t str ) :
+ Father_t(),
+ _size(n),_1stride(1),_rep(_size, A.field().zero),_ptr(&_rep[0]),_field(&(A.field()))
+ {
+ // Father_t is garbage until then:
+ setIterators();
+
+
+ createBlasVector(A,i0,j0,str);
+ linbox_check(_size==0 || _ptr != NULL);
+ }
+
+ BlasVector(const _Field & F, const typename _Field::Element * v, const size_t l) :
+ Father_t(),
+ _size(l),_1stride(1),_rep(l, F.zero),_ptr(&_rep[0]),_field(&F)
+ {
+ setIterators();
+ createBlasVector(v);
+ linbox_check(_size==0 || _ptr != NULL);
+ }
+
+ // ~BlasVector () ;
+
+ BlasVector<_Field,_blasRep>& operator= (const BlasVector<_Field,_blasRep>& V)
+ {
+ if ( &V == this)
+ return *this;
+
+ _size = V.size();
+ _1stride = 1;
+ _rep = Rep(_size);
+ _ptr = &_rep[0] ;
+
+ // linbox_check(field().characteristic() == V.field().characteristic());
+ _field = &V.field();
+
+ createBlasVector(V);
+ linbox_check(_size==0 || _ptr != NULL);
+
+ // Father_t is garbage until then:
+ setIterators();
+
+
+
+ return *this;
+ }
+
+ //! this should not exist.
+ BlasVector<_Field,_blasRep>& operator= (const std::vector<Element>& V)
+ {
+ _size = V.size();
+ _1stride = 1;
+ _rep = Rep(_size);
+ _ptr = &_rep[0] ;
+ createBlasVector(V);
+ linbox_check(_size==0 || _ptr != NULL);
+
+ // Father_t is garbage until then:
+ setIterators();
+
+
+
+ return *this;
+ }
+
+ template<class OtherBase>
+ BlasVector<_Field,_blasRep>& operator= (const OtherBase & V)
+ {
+ _size = V.size();
+ _1stride = 1;
+ _rep = Rep(_size);
+ _ptr = &_rep[0] ;
+ createBlasVector(V);
+ linbox_check(_size==0 || _ptr != NULL);
+
+ // Father_t is garbage until then:
+ setIterators();
+
+ return *this;
+ }
+
+ template<typename _Tp1>
+ struct rebind {
+ typedef BlasVector<_Tp1> other;
+
+ void operator() (other & Ap, const Self_t& A) {
+ typedef typename Self_t::ConstIterator ConstSelfIterator ;
+ typedef typename other::Iterator OtherIterator ;
+ OtherIterator Ap_i = Ap.Begin();
+ ConstSelfIterator A_i = A.Begin();
+ Hom<Field, _Tp1> hom(A. field(), Ap. field()) ;
+ for ( ; A_i != A. End(); ++ A_i, ++ Ap_i)
+ hom.image (*Ap_i, *A_i);
+ }
+ };
+
+
+ // write
+ std::ostream &write ( std::ostream &os, LINBOX_enum(Tag::FileFormat) fmt = Tag::FileFormat::Pretty ) const
+ {
+ switch(fmt) {
+ case (Tag::FileFormat::Pretty) :
+ {
+ os << '[' ;
+ for(const_iterator it= this->begin();it != this->end(); ++it)
+ field().write(os, *it) << " ";
+ return os << ']' ;
+ }
+ case (Tag::FileFormat::Maple) :
+ {
+ os << '<' ;
+ for(const_iterator it=this->begin();it != this->end(); ) {
+ field().write(os, *it);
+ ++it ;
+ if (it != this->end())
+ os << ',' ;
+ }
+ return os << '>' ;
+ }
+
+ default :
+ return os << "not implemented" ;
+ }
+ }
+
+
+
+ // read
+
+ size_t size() const
+ {
+ return _size;
+ }
+
+ //!should never ever be used
+ size_t getStride() const
+ {
+ return _1stride;
+ }
+
+ size_t stride() const { return getStride() ;}
+
+ //!should never ever be used
+ size_t& getWriteStride()
+ {
+ return _1stride;
+ }
+
+ void resize (size_t n, const Element& val = Element())
+ {
+ _size = n;
+ _rep.resize (n, val);
+ _ptr=&_rep[0];
+
+ // iterators are changed
+ setIterators();
+
+ }
+ // should use this->insert(this->end(),e)
+ void push_back(const Element & e) {
+ _rep.push_back(e);
+
+ _size = _rep.size() ; // back to normal :-)
+ _ptr=&_rep[0];
+ setIterators();
+
+ }
+
+ void clear(void) {
+ _rep.clear();
+ _size = 0 ;
+ _ptr=&_rep[0]; // probably NULL
+ setIterators();
+
+ }
+
+ void reserve(const size_t &m) {
+ _rep.reserve(m);
+ // _size = _rep.size() ;
+ _ptr=&_rep[0]; // do we need those ?
+ setIterators();
+
+ }
+
+
+
+ Rep & refRep() { return _rep ; }
+
+ const Rep &getRep() const { return _rep ; }
+
+ pointer getPointer() const
+ {
+ return _ptr;
+ }
+
+ const_pointer &getConstPointer() const
+ {
+ return (const_pointer)_ptr;
+ }
+
+ pointer& getWritePointer() //! @bug should be called refPointer()
+ {
+ return _ptr;
+ }
+
+ void setEntry (size_t i, const Element &a_i)
+ {
+ _ptr[i] = a_i;
+ }
+
+ Element &refEntry (size_t i)
+ {
+ return _ptr[i];
+ }
+
+ const Element &getEntry (size_t i) const
+ {
+ return _ptr[i];
+ }
+
+ Element &getEntry (Element &x, size_t i) const
+ {
+ x = _ptr[i];
+ return x;
+ }
+
+ void random()
+ {
+ typename _Field::Element x; field().init(x);
+ typename _Field::RandIter r(field());
+ for (size_t i = 0; i < size(); ++i)
+ setEntry(i, r.random(x));
+ }
+
+ template<class RandIter>
+ void random( RandIter r)
+ {
+ typename _Field::Element x; field().init(x);
+ for (size_t i = 0; i < size(); ++i)
+ setEntry(i, r.random(x));
+ }
+
+ const _Field& field() const { return const_cast<Field&>( *_field );}
+
+ void changeField(const Field & G)
+ {
+ _field = const_cast<Field*>(&G) ;
+ }
+
+ Element magnitude() const ;
+
+ iterator Begin() { return _rep.begin() ; }
+ private:
+ void setIterators()
+ {
+ Father_t::_begin = iterator (_rep.begin() , 1);
+ Father_t::_end = iterator (_rep.begin()+(ptrdiff_t)_size , 1);
+ }
+
+
+ };// BlasVector
+
+ template <class Field, class _Rep>
+ struct VectorTraits< BlasVector<Field,_Rep> > {
+ typedef typename VectorCategories::DenseVectorTag VectorCategory;
+ typedef BlasVector<Field,_Rep> VectorType;
+ };
+
+
+ template <typename Field, typename Rep>
+ bool operator==(const BlasVector<Field,Rep>& v1, const BlasVector<Field,Rep>& v2)
+ {
+ if (v1.size() != v2.size()) return false;
+ auto i1=v1.begin();
+ auto i2=v2.begin();
+ for( ; i1 != v1.end(); ++i1, ++i2)
+ if (*i1 != *i2) return false;
+ return true;
+ }
+
+
+ template<>
+ Integer BlasVector<Givaro::ZRing<Integer> >::magnitude() const
+ {
+ Integer max_elt(0);
+ for (size_t i = 0 ; i < size() ; ++i)
+ if (max_elt < Givaro::abs(_ptr[i]))
+ max_elt = Givaro::abs(_ptr[i]) ;
+ return max_elt ;
+ }
+
+
+ template<class T>
+ std::ostream& operator<< (std::ostream & o, const BlasVector<T> & Mat)
+ {
+ return Mat.write(o);
+ }
+
+} // LinBox
+
+namespace LinBox { /* BlasSubvector */
+
+
+
+
+ template <class _Vector > // inherit that from owner ?
+ class BlasSubvector :
+ public Subvector<Subiterator<typename _Vector::Rep::iterator > >
+ /* public BlasVector<typename _Vector::Field, typename _Vector::Rep> */ {
+ public :
+ typedef typename _Vector::Field Field;
+ typedef typename Field::Element Element; //!< Element type
+ typedef typename _Vector::Rep Rep; //!< Actually a <code>std::vector<Element></code> (or alike.)
+ typedef BlasSubvector<_Vector> Self_t; //!< Self type
+ typedef typename Rep::pointer pointer; //!< pointer type to elements
+ typedef const pointer const_pointer; //!< const pointer type
+ typedef Self_t subVectorType; //!< Subvector type
+ typedef BlasVector<Field,Rep> vectorType; //!< vector type
+ typedef BlasVector<Field,Rep> blasType; //!< blas type
+
+
+ protected:
+ Rep &_Vec; //!< Parent raw vector
+ size_t _size; //!< size of Subvector
+ size_t _i0; //!< beginning of Subvector in \p _Vec
+ size_t _1stride ; //!< number of columns in \p _Vec (or stride of \p _Vec)
+ const Field & _field;
+
+ public:
+ typedef Subvector<Subiterator<typename Rep::iterator > > Father_t;
+ typedef typename Father_t::iterator iterator;
+ typedef typename Father_t::const_iterator const_iterator;
+
+
+ //////////////////
+ // CONSTRUCTORS //
+ //////////////////
+
+
+ /* constructors */
+
+ /** NULL constructor. */
+ // BlasSubvector () ;
+
+ BlasSubvector (BlasVector<Field,Rep> &V,
+ size_t ibeg,
+ size_t Stride,
+ size_t Size
+ ) :
+ Father_t(),
+ _Vec ((V.refRep())),
+ _size(Size),_i0 (ibeg),_1stride(Stride)
+ ,_field(V.field())
+ {
+ setIterators();
+ }
+
+
+ BlasSubvector (const Field & F, std::vector<Element> &V) :
+ Father_t(),
+ _Vec (V),
+ _size(V.size()),_i0 (0),_1stride(1)
+ ,_field(F)
+ {
+ // not tested
+ setIterators();
+ }
+
+#if 0 /* impossible */
+ BlasSubvector (const Field & F, Subvector<typename Rep::iterator, typename Rep::const_iterator> &V) :
+ Father_t(),
+ _Vec (V),
+ _size(V.size()),_i0 (0),_1stride(1)
+ ,_field(F)
+ {
+ // not tested
+ setIterators();
+ }
+#endif
+
+ BlasSubvector (const Field & F, const std::vector<Element> &V) :
+ Father_t(),
+ _Vec (V),
+ _size(V.size()),_i0 (0),_1stride(1)
+ ,_field(F)
+ {
+ std::cout << "oops, copy (?)" << std::endl;
+ // not tested
+ setIterators();
+ }
+
+
+ BlasSubvector (const Field & F, const std::vector<Element> &V
+ , const size_t ibeg, const size_t Stride, const size_t Size) :
+ Father_t(),
+ _Vec (V),
+ _size(Size),_i0 (ibeg),_1stride(Stride)
+ // could have _i0 = 0 and start at V+ibeg
+ ,_field(F)
+ {
+ // not tested
+ setIterators();
+ }
+
+ //! @todo subvector of ptr
+
+
+ BlasSubvector (const BlasSubvector<_Vector> &SV,
+ size_t ibeg,
+ size_t Stride,
+ size_t Size
+ ) :
+ Father_t(),
+ _Vec (SV._Vec),
+ _size(Size),_i0 (SV._i0+SV._1stride*ibeg)
+ ,_1stride(SV._1stride*Stride)
+ ,_field(SV.field())
+ {
+ // not tested
+ setIterators();
+ }
+
+ /** Copy constructor.
+ * @param SM Subvector to copy
+ */
+ BlasSubvector (const BlasSubvector<_Vector> &SV) :
+ Father_t(),
+ _Vec (SV._Vec),
+ _size(SV._size),_i0 (SV._i0)
+ ,_1stride(SV._1stride)
+ ,_field(SV.field())
+ {
+ // not tested
+ setIterators();
+ }
+
+#if 0 /* from BlasMatrix (should be a Row/Col in BlasMatrix, not here... */
+ BlasSubvector (const BlasMatrix<Field,Rep> &M
+ , size_t ibeg
+ , LINBOX_enum (Tag::Direction) f ) :
+ Father_t(),
+ _Vec (const_cast<Rep&>(M.refRep()))
+ ,_size((f==Tag::Direction::Row)?(M.coldim()):(M.rowdim()))
+ ,_i0 ((f==Tag::Direction::Row)?(ibeg*M.coldim()):(ibeg))
+ ,_1stride((f==Tag::Direction::Row)?(1):(M.coldim()))
+ ,_field(M.field())
+ {
+ setIterators();
+ }
+
+ template<class _Matrix>
+ BlasSubvector (const BlasSubmatrix<_Matrix> &M
+ , size_t ibeg
+ , LINBOX_enum (Tag::Direction) f ) :
+ Father_t(),
+ _Vec (const_cast<Rep&>(M.refRep()))
+ ,_size((f==Tag::Direction::Row)?(M.coldim()):(M.rowdim()))
+ ,_i0 ((f==Tag::Direction::Row)?(M.offset()+ibeg*M.stride()):(M.offset()+ibeg))
+ ,_1stride((f==Tag::Direction::Row)?(1):(M.stride()))
+ ,_field(M.field())
+ {
+ setIterators();
+ }
+#endif
+
+
+ //! @todo more general subvectors
+
+ /* Members */
+
+ BlasSubvector &operator = (const BlasSubvector<_Vector> &SV)
+ {
+ if ( &SV == this)
+ return *this ;
+ _Vec=SV._Vec ; //!@todo use functions, not =
+ _size = SV.size();
+ _i0=SV._i0;
+ _1stride = SV.stride();
+ // _field = SV.field();
+ linbox_check(field().characteristic() == SV.field().characteristic());
+ setIterators();
+ return *this ;
+
+ }
+
+ // template<typename _Tp1>
+ // struct rebind ;
+
+ //////////////////
+ // DIMENSIONS //
+ //////////////////
+
+ size_t size() const {return _size;}
+
+ size_t getStride() const {return _1stride ; }
+ size_t stride() const { return getStride() ;}
+
+
+ ///////////////////
+ // I/O //
+ ///////////////////
+
+ // std::ostream &write (std::ostream &os) const;
+
+ //////////////////
+ // ELEMENTS //
+ //////////////////
+
+ pointer getPointer() const { return &(_Vec[_i0]); }
+
+ const_pointer &getConstPointer() const { return &(_Vec[_i0]); }
+
+
+ pointer& getWritePointer() { return &(_Vec[_i0]); }
+
+
+ void setEntry (size_t i, const Element &a_i)
+ {
+ _Vec[_i0+i*_1stride] = a_i;
+ }
+
+ Element &refEntry (size_t i)
+ {
+ return _Vec[_i0+i*_1stride] ;
+ }
+
+ const Element &getEntry (size_t i) const
+ {
+ return _Vec[_i0+i*_1stride] ;
+ }
+
+ Element &getEntry (Element &x, size_t i)
+ {
+ x = _Vec[_i0+i*_1stride] ;
+ return x;
+ }
+
+
+#if 0 /* using Father_t */
+ ///////////////////
+ // ITERATORS //
+ ///////////////////
+
+ class Iterator ;
+ class ConstIterator ;
+
+ class IndexedIterator ;
+ class ConstIndexedIterator ;
+#endif
+
+
+ const Field& field() const { return _field ;}
+ // Field & field() { return _field; }
+
+ // write (same as BlasVector)
+ std::ostream &write ( std::ostream &os, LINBOX_enum(Tag::FileFormat) fmt = Tag::FileFormat::Pretty ) const
+ {
+ switch(fmt) {
+ case (Tag::FileFormat::Pretty) :
+ {
+ os << '[' ;
+ for(const_iterator it= this->begin();it != this->end(); ++it)
+ field().write(os, *it) << " ";
+ return os << ']' ;
+ }
+ case (Tag::FileFormat::Maple) :
+ {
+ os << '<' ;
+ for(const_iterator it=this->begin();it != this->end(); ) {
+ field().write(os, *it);
+ ++it ;
+ if (it != this->end())
+ os << ',' ;
+ }
+ return os << '>' ;
+ }
+
+ default :
+ return os << "not implemented" ;
+ }
+ }
+
+ private:
+ void setIterators()
+ {
+ Father_t::_begin = iterator (_Vec.begin()+(ptrdiff_t)_i0 , (ptrdiff_t)_1stride);
+ Father_t::_end = iterator (_Vec.begin()+(ptrdiff_t)(_i0 + _size*_1stride) , (ptrdiff_t)_1stride);
+ }
+
+ };
+
+ template<class T>
+ std::ostream& operator<< (std::ostream & o, const BlasSubvector<T> & Mat)
+ {
+ return Mat.write(o);
+ }
+
+} // LinBox
+
+namespace LinBox { /* traits */
+
+ // this could also be a member of BlasVector
+ template<class _Field, class _Rep>
+ struct ContainerTraits<BlasVector<_Field,_Rep> > {
+ typedef ContainerCategories::Vector ContainerCategory ;
+ };
+
+ //! @todo remove vectors
+ template<class _Rep>
+ struct ContainerTraits<std::vector<_Rep> > {
+ typedef ContainerCategories::Vector ContainerCategory ;
+ };
+
+ template<class _Vector>
+ struct ContainerTraits<BlasSubvector<_Vector> > {
+ typedef ContainerCategories::Vector ContainerCategory ;
+ };
+
+}
+
+#include "blas-vector.inl"
+
+#endif // __LINBOX_vector_blas_vector_H
+
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/vector/blas-vector.inl b/linbox/vector/blas-vector.inl
new file mode 100644
index 0000000..037e72d
--- /dev/null
+++ b/linbox/vector/blas-vector.inl
@@ -0,0 +1,47 @@
+/* linbox/matrix/blas-vector.inl
+ * Copyright (C) 2013 the LinBox group
+ *
+ * Written by :
+ * Brice Boyer (briceboyer) <boyer.brice at gmail.com>
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ * ========LICENCE========
+ */
+
+/*! @internal
+ * @file vector/blas-vector.inl
+ * @ingroup vector
+ *
+ */
+
+#ifndef __LINBOX_vector_blas_vector_INL
+#define __LINBOX_vector_blas_vector_INL
+
+// TODO from vector.h
+
+#endif // __LINBOX_vector_blas_vector_INL
+
+
+
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/vector/reverse.h b/linbox/vector/reverse.h
index 94394f8..33df390 100644
--- a/linbox/vector/reverse.h
+++ b/linbox/vector/reverse.h
@@ -3,20 +3,20 @@
*
* ------------------------------------
*
- *
+ *
* ========LICENCE========
* This file is part of the library LinBox.
- *
+ *
* LinBox is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
- *
+ *
* This library 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
* Lesser General Public License for more details.
- *
+ *
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
@@ -80,8 +80,8 @@ namespace LinBox
// Element access
- inline reference operator[] (size_type n) { return (begin ())[n]; }
- inline const_reference operator[] (size_type n) const { return (begin ())[n]; }
+ inline reference operator[] (size_type n) { return ((begin ())[(ptrdiff_t)n]); }
+ inline const_reference operator[] (size_type n) const { return ((begin ())[(ptrdiff_t)n]); }
// the method "at" does appear to be implemented
// in the gnu implementation of the STL
diff --git a/linbox/vector/slicedpolynomialvector/SlicedPolynomialMatrixVectorMulKaratsuba.h b/linbox/vector/slicedpolynomialvector/SlicedPolynomialMatrixVectorMulKaratsuba.h
new file mode 100644
index 0000000..56bacc2
--- /dev/null
+++ b/linbox/vector/slicedpolynomialvector/SlicedPolynomialMatrixVectorMulKaratsuba.h
@@ -0,0 +1,27 @@
+#ifndef __LINBOX_matrix_SlicedPolynomialMatrix_SlicedPolynomialMatrixVectorMulKaratsuba_H
+#define __LINBOX_matrix_SlicedPolynomialMatrix_SlicedPolynomialMatrixVectorMulKaratsuba_H
+
+#include "linbox/matrix/slicedpolynomialmatrix/SlicedPolynomialMatrix.h"
+#include "linbox/vector/slicedpolynomialvector/SlicedPolynomialVector.h"
+
+namespace LinBox
+{
+ template< class Field, class Operand1, class Operand2, class Operand3>
+ class SlicedPolynomialMatrixVectorMulKaratsuba
+ {
+ private:
+ typedef Operand1::IntField IntField;
+ typedef BlasMatrix<IntField> Matrix;
+ typedef BlasVector<IntField> Vector;
+ typedef std::vector<Matrix> vecM;
+ typedef std::vector<Vector> vecV;
+ typedef Operand1::polynomial polynomial;
+ vec& karatsuba(IntField& F, vecV& C, vecM& A, vecV& B);
+ public:
+ Operand1 &operator() (const Field &GF, Operand1 &C, const Operand2 &A, const Operand3 &B) const;
+ };
+} /* end of namespace LinBox */
+
+#include "SlicedPolynomialMatrixVectorMulKaratsuba.inl"
+
+#endif
diff --git a/linbox/vector/slicedpolynomialvector/SlicedPolynomialMatrixVectorMulKaratsuba.inl b/linbox/vector/slicedpolynomialvector/SlicedPolynomialMatrixVectorMulKaratsuba.inl
new file mode 100644
index 0000000..72b25cb
--- /dev/null
+++ b/linbox/vector/slicedpolynomialvector/SlicedPolynomialMatrixVectorMulKaratsuba.inl
@@ -0,0 +1,245 @@
+#ifndef __LINBOX_matrix_SlicedPolynomialMatrix_SlicedPolynomialMatrixMulKaratsuba_INL
+#define __LINBOX_matrix_SlicedPolynomialMatrix_SlicedPolynomialMatrixMulKaratsuba_INL
+
+#include <givaro/givpoly1dense.h>
+#include <givaro/givpoly1denseops.inl>
+#include "linbox/matrix/matrixdomain/blas-matrix-domain.h"
+#include "linbox/vector/vector-domain.h"
+#include "fflas-ffpack/fflas/fflas.h"
+
+namespace LinBox
+{
+ template<class Field, class Vector3, class Vector1, class Vector2>
+ SlicedPolynomialMatrixMulKaratsuba<Field, Vector3, Vector1, Vector2 >::vec&
+ SlicedPolynomialMatrixMulKaratsuba<Field, Vector3, Vector1, Vector2 >::karatsuba(IntField& F, VectorDomain<Vector3::IntField>& VD,
+ vecV& C, vecM& A, vecV& B, size_t rd, size_t cd)
+ {
+ if (A.size() == 1)
+ {
+ for (int i = 0; i <B.size(); i++)
+ {
+ FFLAS::fgemv(F, FflasNoTrans, rd, cd, F.one, A[0].getPointer(), cd, B[i].getPointer(), 1, F.zero, C[i].getWritePointer(), 1);
+ }
+ return C;
+ }
+ if (B.size() == 1)
+ {
+ for (int i = 0; i < A.size(); i++)
+ {
+ FFLAS::fgemv(F, FflasNoTrans, rd, cd, F.one, A[i].getPointer(), cd, B[0].getPointer(), 1, F.zero, C[i].getWritePointer(), 1);
+ }
+ return C;
+ }
+ int m = (A.size() < B.size()) ? (B.size() / 2) : (A.size() / 2);
+ if ((m < A.size()) && (m < B.size()))
+ {
+ vecM A1(A.begin(), A.begin() + m);
+ vecM A2(A.begin() + m, A.end());
+ vecV B1(B.begin(), B.begin() + m);
+ vecV B2(B.begin() + m, B.end());
+ vecM A3;
+ int minlength_a = (A1.size() < A2.size()) ? A1.size() : A2.size();
+ int minlength_a = (A1.size() < A2.size()) ? A2.size() : A1.size();
+ for (int i = 0; i < minlength_a; i++)
+ {
+ Matrix AA(F, rd, cd);
+ A3.push_back(BlasMatrixDomainAdd<IntField, Matrix, Matrix, Matrix>()(F, AA, A1[i], A2[i]));
+ }
+ if (maxlength_a == A1.size())
+ {
+ for (int i = minlength_a; i < maxlength_a; i++)
+ {
+ A3.push_back(A1[i]);
+ }
+ }
+ else
+ {
+ for (int i = minlength_a; i < maxlength_a; i++)
+ {
+ A3.push_back(A2[i]);
+ }
+ }
+ vecV B3;
+ int minlength_b = (B1.size() < B2.size()) ? B1.size() : B2.size();
+ int maxlength_b = (B1.size() < B2.size()) ? B2.size() : B1.size();
+ for (int i = 0; i < minlength_b; i++)
+ {
+ Vector BB(F, cd);
+ B3.push_back(VD.add<Vector, Vector, Vector>(BB, B1[i], B2[i]));
+ }
+ if (maxlength_b == B1.size())
+ {
+ for (int i = minlength_b; i < maxlength_b; i++)
+ {
+ B3.push_back(B1[i]);
+ }
+ }
+ else
+ {
+ for (int i = minlength_b; i < maxlength_b; i++)
+ {
+ B3.push_back(B1[i]);
+ }
+ }
+ vecV C1;
+ vecV C2;
+ vecV C3;
+ Matrix CC(F, rd);
+ int xx;
+ xx = A1.size() + B1.size() - 1;
+ for (int i = 0; i < xx; i++)
+ {
+ C1.push_back(CC);
+ }
+ xx = A2.size() + B2.size() - 1;
+ for (int i = 0; i < xx; i++)
+ {
+ C2.push_back(CC);
+ }
+ xx = A3.size() + B3.size() - 1;
+ for (int i = 0; i < xx; i++)
+ {
+ C3.push_back(CC);
+ }
+ karatsuba(F, VD, C1, A1, B1);
+ karatsuba(F, VD, C2, A2, B2);
+ karatsuba(F, VD, C3, A3, B3);
+ for (int i = 0; i < C1.size(); i++)
+ {
+ VD.addin<Vector, Vector>(C[i], C1[i]);
+ }
+ int mm = 2 * m;
+ for (int i = 0; i < C2.size(); i++)
+ {
+ VD.addin<Vector, Vector>(C[mm + i], C2[i]);
+ }
+ for (int i = 0; i < C3.size(); i++)
+ {
+ VD.addin<Vector, Vector>(C[m + i], C3[i]);
+ }
+ for (int i = 0; i < C1.size(); i++)
+ {
+ VD.subin<Vector, Vector>(C[m + i], C1[i]);
+ }
+ for (int i = 0; i < C2.size(); i++)
+ {
+ VD.subin<Vector, Vector>(C[m + i], C2[i]);
+ }
+ return C;
+ }
+ if (A.size() <= m)
+ {
+ vecV B1(B.begin(), B.begin() + m);
+ vecV B2(B.begin() + m, B.end());
+ vecV C1;
+ vecV C2;
+ Vector CC(F, rd);
+ int xx;
+ xx = A.size() + B1.size() - 1;
+ for (int i = 0; i < xx; i++)
+ {
+ C1.push_back(CC);
+ }
+ xx = A.size() + B2.size() - 1;
+ for (int i = 0; i < xx; i++)
+ {
+ C2.push_back(CC);
+ }
+ karatsuba(F, VD, C1, A, B1);
+ karatsuba(F, VD, C2, A, B2);
+ for (int i = 0; i < C1.size(); i++)
+ {
+ VD.addin<Vector, Vector>(C[i], C1[i]);
+ }
+ for (int i = 0; i < C2.size(); i++)
+ {
+ VD.addin<Vector, Vector>(C[m + i], C2[i]);
+ }
+ return C;
+ }
+ if (B.size() <= m)
+ {
+ vecM A1(A.begin(), A.begin() + m);
+ vecM A2(A.begin() + m, A.end());
+ vecV C1;
+ vecV C2;
+ Matrix CC(F, rd);
+ int xx;
+ xx = A1.size() + B.size() - 1;
+ for (int i = 0; i < xx; i++)
+ {
+ C1.push_back(CC);
+ }
+ xx = A2.size() + B.size() - 1;
+ for (int i = 0; i < xx; i++)
+ {
+ C2.push_back(CC);
+ }
+ karatsuba(F, VD, C1, A1, B);
+ karatsuba(F, VD, C2, A2, B);
+ for (int i = 0; i < C1.size(); i++)
+ {
+ VD.addin<Vector, Vector>(C[i], C1[i]);
+ }
+ for (int i = 0; i < C2.size(); i++)
+ {
+ VD.addin<Vector, Vector>(C[m + i], C2[i]);
+ }
+ return C;
+ }
+ return C;
+ }
+
+ template<class Field, class Vector3, class Vector1, class Vector2>
+ Vector1& SlicedPolynomialMatrixMulKaratsuba<Field, Vector3, Vector1, Vector2 >::operator()(const Field& GF,
+ Vector3& C,
+ const Vector1& A,
+ const Vector2& B) const
+ {
+ //check dimensions
+ int xx;
+ vecV A1;
+ vecM B1;
+ xx = A.length();
+ for (int m = 0; m < xx; m++)
+ {
+ A1.push_back(A.getMatrixCoefficient(m));
+ }
+ xx = B.length();
+ for (int m = 0; m < xx; m++)
+ {
+ B1.push_back(B.getVectorCoefficient(m));
+ }
+ vecV C1;
+ xx = A1.size() + B1.size() - 1;
+ Vector CC(C.fieldF(), A.rowdim());
+ for (int i = 0; i < xx; i++)
+ {
+ C1.push_back(CC);
+ }
+ VectorDomain<IntField> VD(F);
+ karatsuba(C.fieldF(), VD, C1, A1, B1);
+ int mk = C1.size();
+ int mi = C1[0].rowdim();
+ int n = C.size();
+ Poly1Dom<IntField, Dense> PD(F);
+ for (int i = 0; i < mi; i++)
+ {
+
+ polynomial entry;
+ for (int k = 0; k < mk; k++)
+ {
+ entry.push_back(C1[k].getEntry(i));
+ }
+ PD.modin(entry, C.irreducible);
+ for (int k = 0; k < n; k++)
+ {
+ C[k].setEntry(i, w1[k]);
+ }
+
+ }
+ return C;
+ }
+} // LinBox
+
+#endif
diff --git a/linbox/vector/slicedpolynomialvector/SlicedPolynomialVector.h b/linbox/vector/slicedpolynomialvector/SlicedPolynomialVector.h
new file mode 100644
index 0000000..21f1613
--- /dev/null
+++ b/linbox/vector/slicedpolynomialvector/SlicedPolynomialVector.h
@@ -0,0 +1,173 @@
+#ifndef __LINBOX_matrix_SlicedPolynomialVector_SlicedPolynomialVector_H
+#define __LINBOX_matrix_SlicedPolynomialVector_SlicedPolynomialVector_H
+
+#include <vector>
+#include "linbox/vector/blas-vector.h"
+#include <givaro/modular.h>
+#include <givaro/givpoly1dense.h>
+#include <givaro/givpoly1denseops.inl>
+
+namespace Linbox
+{
+ template <class _Field, class _Storage, class _VectorElement = double>
+ class SlicedPolynomialVector
+ /*Requirement: variable class _Field must be a representation of a field of order p^n
+ *and have functions that return p (characteristic()) and p^n(cardinality()).
+ *For example, GivaroGfq or LidiaGfq can be used.
+ */
+
+ /*Description: this class implements representation of a vector over GF
+ *as a vector of length n of vectors over F (BlasVectors),
+ *which corresponds to representation of this vector as a polynomial of degree n-1 with vector-coefficients.
+ */
+ {
+ public:
+ typedef _Field Field;
+ typedef typename Field::Element Element;
+ typedef _Storage Rep;
+ typedef _VectorElement VectorElement;
+ typedef Givaro::Modular<VectorElement, VectorElement> IntField;
+ typedef SlicedPolynomialVector<Field, Rep, VectorElement> Self_t;
+ typedef Givaro::Poly1Dom<IntField, Dense>::Rep polynomial;
+ private:
+ Field GF;
+ IntField F;
+ private:
+ int n; //GF.cardinality() == p^n
+ std::vector<BlasVector<IntField>> V;
+ public:
+ polynomial irreducible;
+ private:
+ polynomial& modulo(polynomial& g, polynomial&h, polynomial& f);
+ bool rabin(int n, int q, int a, int b);
+ void setIrreduciblePlynomial(int max_steps = 1000000);
+
+ ////////////////
+ //Constructors//
+ ////////////////
+
+ public:
+ /*! Allocates a vector of new zero vectors of size 0 (shaped and ready). Irreducible polynomial is chosen randomly.
+ */
+ SlicedPolynomialVector (const Field &BF);
+
+ /*Allocates a vector of new vectors of size m (shaped and ready). Irreducible polynomial is chosen randomly.
+ */
+ SlicedPolynomialVector (const Field &BF, const size_t &m);
+
+ /*! Allocates a vector of new zero vectors of size 0 (shaped and ready).
+ */
+ SlicedPolynomialVector (const Field &BF, polynomial& pp);
+
+ /*Allocates a vector of new vectors of size m (shaped and ready).
+ */
+ SlicedPolynomialVector (const Field &BF, const size_t &m, polynomial& pp);
+
+ ///////////////
+ // Destructor//
+ ///////////////
+
+ public:
+ ~SlicedPolynomialVector();
+
+ ////////////////////////
+ //dimensions of vector//
+ ////////////////////////
+
+ public:
+ /*Get length of V.
+ * @returns length of V
+ */
+ size_t length() const;
+
+ /*Get the number of rows in a vector.
+ * @returns Number of rows in a vector
+ */
+ size_t rowdim() const;
+
+ /////////////////
+ //return fields//
+ /////////////////
+
+ public:
+ const Field& fieldGF() const;
+
+ const IntField& fieldF() const;
+
+ /////////////////////////
+ //functions for entries//
+ /////////////////////////
+
+ public:
+ /* Set the entry of the m-th matrix-coefficient at the (k) position to a_mk.
+ * @param m matrix-coefficient number, 0...length() - 1
+ * @param k Row number 0...rowdim () - 1
+ * @param a_mk Element to set
+ */
+ void setEntry (size_t m, size_t k, const MatrixElement &a_mk);
+
+ private:
+ /* Get a writeable reference to the m-th matrix-coefficient at the (k) position.
+ * @param m matrix-coefficient number, 0...length() - 1
+ * @param k Row number 0...rowdim () - 1
+ * @returns Reference to matrix entry
+ */
+ MatrixElement &refEntry (size_t m, size_t k);
+
+ public:
+ /* Get a read-only reference to the m-th matrix-coefficient at the (k) position.
+ * @param m matrix-coefficient number, 0...length() - 1
+ * @param k Row number 0...rowdim () - 1
+ * @returns Const reference to matrix entry
+ */
+ MatrixElement &getEntry (size_t m, size_t k);
+
+ /////////////////////////////////////
+ //functions for matrix-coefficients//
+ /////////////////////////////////////
+
+ public:
+ /* Set the m-th vector-coefficient to V_m.
+ * @param m vector-coefficient number, 0...length() - 1
+ * @param V_m matrix to set
+ */
+ void setVectorCoefficient (size_t m, const BlasVector<IntField> &V_m) ;
+
+ private:
+ /* Get a writeable reference to the m-th matrix-coefficient.
+ * @param m matrix-coefficient number, 0...length() - 1
+ * @returns Reference to matrix-coefficent
+ */
+ BlasVector<IntField> &refVectorCoefficient (size_t m) ;
+
+ public:
+ /** Get a read-only reference to the m-th matrix-coefficient
+ * @param m matrix-coefficient number, 0...length() - 1
+ * @returns Const reference to matrix-coefficent
+ */
+ const BlasVector<IntField> &getVectorCoefficient (size_t m) const ;
+
+ /////////
+ //swaps//
+ /////////
+
+ public:
+ /* Swap i1-th and i2-th rows of matrices.
+ * This is done inplace.
+ */
+ void swapRows(size_t k1, size_t k2);
+
+ //////////////////
+ //input / output//
+ //////////////////
+
+ public:
+ std::istream &read (std::istream &file);
+
+ std::ostream &write (std::ostream &os) const;
+ };
+}
+
+#include "SlicedPolynomialVector.inl"
+
+#endif
\ No newline at end of file
diff --git a/linbox/vector/slicedpolynomialvector/SlicedPolynomialVector.inl b/linbox/vector/slicedpolynomialvector/SlicedPolynomialVector.inl
new file mode 100644
index 0000000..cda9456
--- /dev/null
+++ b/linbox/vector/slicedpolynomialvector/SlicedPolynomialVector.inl
@@ -0,0 +1,329 @@
+#ifndef __LINBOX_matrix_SlicedPolynomialVector_SlicedPolynomialVector_INL
+#define __LINBOX_matrix_SlicedPolynomialVector_SlicedPolynomialVector_INL
+
+namespace Linbox
+{
+ //////////////////////////
+ //irreducible polynomial//
+ //////////////////////////
+
+ template < class _Field, class _Rep, class _VectorElement >
+ polynomial& SlicedPolynomialVector< _Field, _Rep, _VectorElement >::modulo(polynomial& g, polynomial&h, polynomial& f)
+ {
+ polynomial w1;
+ Poly1Dom<Domain,Dense>::div(w1, h, f);
+ polynomial w2;
+ Poly1Dom<Domain,Dense>::mul(w2, w1, f);
+ Poly1Dom<Domain,Dense>::sub(g, h, w2);
+ return g;
+ }
+
+ /*
+ algorithm description
+ http://en.wikipedia.org/wiki/Factorization_of_polynomials_over_finite_fields#Rabin.27s_test_of_irreducibility
+ Algorithm Rabin Irreducibility Test
+ Input: A monic polynomial f in Fq[x] of degree n,
+ p1, ..., pk all distinct prime divisors of n.
+ Output: Either "f is irreducible" or "f is reducible".
+ Begin
+ for j = 1 to k do
+ n_j=n/p_j;
+ for i = 1 to k do
+ h:=x^{q^{n_i}}-x \bmod f;
+ g := gcd(f, h);
+ if g ? 1, then return 'f is reducible' and STOP;
+ end for;
+ h:= x^{q^{n}}-x \bmod f;
+ if h = 0, then return "f is irreducible",
+ else return "f is reducible"
+ end.
+ */
+ /*
+ function description
+ Fq[x], f = x^n + bx + a
+ returns true if f is irreducible and false if f is reducible
+ */
+ template < class _Field, class _Rep, class _VectorElement >
+ bool SlicedPolynomialVector< _Field, _Rep, _VectorElement >::rabin(int n, int q, int a, int b)
+ {
+ polynomial f(n + 1);
+ f[0] = a;
+ f[1] = b;
+ for (int i = 2; i < n; i++)
+ {
+ f[i] = 0;
+ }
+ f[n] = 1;
+ std::vector<int> pd;
+ factorize(n, pd); //factorizes n into primes
+ //n = pd[0]^alpha[0] * ... * pd[k - 1]^alpha[k - 1]
+ int k = pd.size();
+ std::vector<int> nd(k);
+ for (int j = 0; j < k; j++)
+ {
+ nd[j] = n / pd[j];
+ }
+ polynomial vector_zero();
+ assign(vector_zero, 0);
+ polynomial vector_one();
+ assign(vector_one, 1);
+ for (int j = 0; j < k; j++)
+ {
+ int h_size = pow(q, nd[j]) + 1;
+ polynomial h(h_size);
+ h[0] = 0;
+ h[1] = -1;
+ for (int i = 2; i < h_size - 1; i++)
+ {
+ h[i] = 0;
+ }
+ h[h_size - 1] = 1;
+ polynomial g;
+ Poly1Dom<IntField, Dense>::gcd (g, f, h);
+ bool g_equals_1 = g.areEqual(vector_one);
+ if (! g_equals_1)
+ {
+ return true; //f is irreducible
+ }
+ }
+ int h_size = pow(q, n) + 1;
+ polynomial h(h_size);
+ h[0] = 0;
+ h[1] = -1;
+ for (int i = 2; i < h_size - 1; i++)
+ {
+ h[i] = 0;
+ }
+ h[h_size - 1] = 1;
+ polynomial g;
+ modulo(g, h, f);//!!!
+ bool g_equals_0 = g.areEqual(vector_zero);
+ return g_equals_0; //if g = 0, then return "f is irreducible", else return "f is reducible"
+ }
+
+ template < class _Field, class _Rep, class _VectorElement >
+ void SlicedPolynomialVector< _Field, _Rep, _VectorElement >::setIrreduciblePlynomial(int max_steps)
+ {
+ bool found = false;
+ int w = F.characteristic();
+ for (int step = 0; (step < max_steps) && (!found); step++)
+ {
+ int a = rand() % w;
+ int b = rand() % w;
+ if (a + b > 0)
+ {
+ found = rabin(n, w, a, b);
+ }
+ }
+ irreducible.push_back(a);
+ irreducible.push_back(b);
+ for (int i = 1; i < n; i++)
+ {
+ irreducible.push_back(0);
+ }
+ irreducible.push_back(1);
+ return;
+ }
+
+ ////////////////
+ //Constructors//
+ ////////////////
+
+ template < class _Field, class _Rep, class _VectorElement >
+ SlicedPolynomialVector< _Field, _Rep, _VectorElement >::SlicedPolynomialVector (const _Field &BF)
+ {
+ GF = BF;
+ F_temp = IntField(GF.characteristic());
+ F = F_temp;
+ n = GF.exponent(); //GF = GF(p^n)
+ for (size_t r = 0; r < n; r++)
+ {
+ V.emplace_back(BlasVector<IntField>(F));
+ }
+ setIrreduciblePolynomial();
+ }
+
+ template < class _Field, class _Rep, class _VectorElement >
+ SlicedPolynomialVector< _Field, _Rep, _VectorElement >::SlicedPolynomialVector (const _Field &BF, const size_t &m)
+ {
+ GF = BF;
+ F_temp = IntField(GF.characteristic()); //public function to set characteristic?
+ F = F_temp;
+ n = GF.exponent(); //GF = GF(p^n)
+ for (size_t r = 0; r < n; r++)
+ {
+ V.emplace_back(BlasVector<IntField>(F, m));
+ }
+ setIrreduciblePolynomial();
+ }
+
+ template < class _Field, class _Rep, class _VectorElement >
+ SlicedPolynomialVector< _Field, _Rep, _VectorElement >::SlicedPolynomialVector (const _Field &BF, polynomial& pp)
+ {
+ GF = BF;
+ F_temp = IntField(GF.characteristic()); //public function to set characteristic?
+ F = F_temp;
+ n = GF.exponent(); //GF = GF(p^n)
+ for (size_t r = 0; r < n; r++)
+ {
+ V.emplace_back(BlasVector<IntField>(F));
+ }
+ irreducible = pp;
+ }
+
+ template < class _Field, class _Rep, class _VectorElement >
+ SlicedPolynomialVector< _Field, _Rep, _VectorElement >::SlicedPolynomialVector (const _Field &BF, const size_t &m, polynomial& pp)
+ {
+ GF = BF;
+ F_temp = IntField(GF.characteristic()); //public function to set characteristic?
+ F = F_temp;
+ n = GF.exponent(); //GF = GF(p^n)
+ for (size_t r = 0; r < n; r++)
+ {
+ V.emplace_back(BlasVector<IntField>(F, m));
+ }
+ irreducible = pp;
+ }
+
+ ///////////////
+ // Destructor//
+ ///////////////
+
+ template < class _Field, class _Rep, class _VectorElement >
+ SlicedPolynomialVector< _Field, _Rep, _VectorElement >::~SlicedPolynomialVector()
+ {
+ //LidiaGfq has a destructor, GivaroGfq doesn't, so currently field type members GF and F are not destroyed
+ V.~vector();
+ //if some members are added, delete them
+ }
+ ////////////////////////
+ //dimensions of vector//
+ ////////////////////////
+
+ template < class _Field, class _Rep, class _VectorElement >
+ size_t SlicedPolynomialVector< _Field, _Rep, _VectorElement >::length() const
+ {
+ return V.size();
+ }
+
+ template < class _Field, class _Rep, class _VectorElement >
+ size_t SlicedPolynomialVector< _Field, _Rep, _VectorElement >::rowdim() const
+ {
+ return V[0].size();
+ }
+
+ /////////////////
+ //return fields//
+ /////////////////
+
+ template < class _Field, class _Rep, class _VectorElement >
+ const Field& SlicedPolynomialVector< _Field, _Rep, _VectorElement >::fieldGF() const
+ {
+ return GF;
+ }
+
+ template < class _Field, class _Rep, class _VectorElement >
+ const IntField& SlicedPolynomialVector< _Field, _Rep, _VectorElement >::fieldF() const
+ {
+ return F;
+ }
+
+ /////////////////////////
+ //functions for entries//
+ /////////////////////////
+
+ template < class _Field, class _Rep, class _VectorElement >
+ void SlicedPolynomialVector< _Field, _Rep, _VectorElement >::setEntry (size_t m, size_t k, const VectorElement &a_mk)
+ {
+ V[m].setEntry(k, a_mk);
+ }
+
+ template < class _Field, class _Rep, class _VectorElement >
+ _VectorElement & SlicedPolynomialVector< _Field, _Rep, _VectorElement >::refEntry (size_t m, size_t k)
+ {
+ return V[m].refEntry(k);
+
+ }
+
+ template < class _Field, class _Rep, class _VectorElement >
+ _VectorElement & SlicedPolynomialVector< _Field, _Rep, _VectorElement >::getEntry (size_t m, size_t k)
+ {
+ return V[m].getEntry(k);
+
+ }
+
+ /////////////////////////////////////
+ //functions for matrix-coefficients//
+ /////////////////////////////////////
+
+ template < class _Field, class _Rep, class _VectorElement >
+ void SlicedPolynomialVector< _Field, _Rep, _VectorElement >::setMatrixCoefficient (size_t m, const BlasVector<IntField> &V_m)
+ {
+ V[m] = V_m;
+ }
+
+ template < class _Field, class _Rep, class _VectorElement >
+ BlasVector<IntField> &SlicedPolynomialVector< _Field, _Rep, _VectorElement >::refMatrixCoefficient (size_t m)
+ {
+ return V[m];
+ }
+
+ template < class _Field, class _Rep, class _VectorElement >
+ const BlasVector<IntField> &SlicedPolynomialVector< _Field, _Rep, _VectorElement >::getMatrixCoefficient (size_t m) const
+ {
+ return V[m];
+ }
+
+ /////////
+ //swaps//
+ /////////
+
+ template < class _Field, class _Rep, class _VectorElement >
+ void SlicedPolynomialVector< _Field, _Rep, _VectorElement >::swapRows(size_t k1, size_t k2)
+ {
+ for (size_t m = 0; m < this->length(); m++)
+ {
+ VectorElement c = this->getEntry(m, k1);
+ this->setEntry(m, k1, this->getEntry(m, k2));
+ this->setEntry(m, k2, c);
+ }
+ }
+
+ //////////////////
+ //input / output//
+ //////////////////
+ template < class _Field, class _Rep, class _VectorElement >
+ std::istream& SlicedPolynomialVector< _Field, _Rep, _VectorElement >::read (std::istream &file)
+ {
+ int M = this->length();
+ int K = this->rowdim();
+ VectorElement c;
+ for (int m = 0; m < M; m++)
+ {
+ for (int k = 0; k < K; k++)
+ {
+ file >> c;
+ this->setEntry(m, k, c);
+ }
+ }
+ return file;
+ }
+
+ template < class _Field, class _Rep, class _VectorElement >
+ std::ostream& SlicedPolynomialVector< _Field, _Rep, _VectorElement >::write (std::ostream &file)
+ {
+ int M = this->length();
+ int K = this->rowdim();
+ for (int m = 0; m < M; m++)
+ {
+ for (int k = 0; k < K; k++)
+ {
+ file << this->getEntry(m, k) << std::endl;
+ }
+ file << std::endl;
+ }
+ return file;
+ }
+}
+
+#endif
\ No newline at end of file
diff --git a/linbox/vector/slicedpolynomialvector/SlicedPolynomialVectorAddSub.h b/linbox/vector/slicedpolynomialvector/SlicedPolynomialVectorAddSub.h
new file mode 100644
index 0000000..69d5479
--- /dev/null
+++ b/linbox/vector/slicedpolynomialvector/SlicedPolynomialVectorAddSub.h
@@ -0,0 +1,53 @@
+#ifndef __LINBOX_matrix_SlicedPolynomialVector_SlicedPolynomialVectorAddSub_H
+#define __LINBOX_matrix_SlicedPolynomialVector_SlicedPolynomialVectorAddSub_H
+
+#include <vector>
+#include "linbox/matrix/matrixdomain/vector-domain.h"
+#include "linbox/matrix/slicedpolynomialvector/SlicedPolynomialVector.h"
+
+namespace LinBox
+{
+ /* internal
+ * Adding two vectors
+ */
+ template< class Field, class Operand1, class Operand2, class Operand3>
+ class SlicedPolynomialVectorAdd
+ {
+ public:
+ Operand1 &operator() (const Field &F, Operand1 &C, const Operand2 &A, const Operand3 &B) const;
+
+ };
+
+ /* internal
+ * Substracting two vectors
+ */
+ template< class Field, class Operand1, class Operand2, class Operand3>
+ class SlicedPolynomialVectorSub
+ {
+ public:
+ Operand1 &operator() (const Field &F, Operand1 &C, const Operand2 &A, const Operand3 &B) const;
+
+ };
+
+ //! C += A
+ template< class Field, class Operand1, class Operand2>
+ class SlicedPolynomialVectorAddin
+ {
+ public:
+ Operand1 &operator() (const Field &F, Operand1 &C, const Operand2 &A) const;
+
+ };
+
+ //! C -= A
+ template< class Field, class Operand1, class Operand2>
+ class SlicedPolynomialVectorSubin
+ {
+ public:
+ Operand1 &operator() (const Field &F, Operand1 &C, const Operand2 &A) const;
+
+ };
+} /* end of namespace LinBox */
+
+#include "SlicedPolynomialVectorAddSub.inl"
+
+#endif
diff --git a/linbox/vector/slicedpolynomialvector/SlicedPolynomialVectorAddSub.inl b/linbox/vector/slicedpolynomialvector/SlicedPolynomialVectorAddSub.inl
new file mode 100644
index 0000000..2dadae8
--- /dev/null
+++ b/linbox/vector/slicedpolynomialvector/SlicedPolynomialVectorAddSub.inl
@@ -0,0 +1,75 @@
+#ifndef __LINBOX_matrix_SlicedPolynomialVector_SlicedPolynomialVectorAddSub_INL
+#define __LINBOX_matrix_SlicedPolynomialVector_SlicedPolynomialVectorAddSub_INL
+
+namespace LinBox
+{
+ template<class Field, class Vector1, class Vector2, class Vector3>
+ Vector1& SlicedPolynomialVectorAdd<Field, Vector1, Vector2, Vector3 >::operator()(const Field& F,
+ Vector1& C,
+ const Vector2& A,
+ const Vector3& B) const
+ {
+ //check dimensions
+ BlasVector<Vector1::IntField> M(C.fieldF(), C.rowdim());
+ for (int m = 0; m < C.length(); m++)
+ {
+ VectorDomain<Vector1::IntField>.add(C.fieldF(),
+ M, A.getVectorCoefficient(m), B.getVectorCoefficient(m));
+ C.setVectorCoefficient(m, M);
+ }
+ return C;
+ }
+
+ template<class Field, class Vector1, class Vector2, class Vector3>
+ Vecto1r& SlicedPolynomialVectorSub<Field, Vector1, Vector2, Vector3 >::operator()(const Field& F,
+ Vector1& C,
+ const Vector2& A,
+ const Vector3& B) const
+ {
+ //check dimensions
+ BlasVector<Vector1::IntField> M(C.fieldF(), C.rowdim());
+ for (int m = 0; m < C.length(); m++)
+ {
+ VectorDomain<Vector1::IntField>.sub(C.fieldF(),
+ M, A.getVectorCoefficient(m), B.getVectorCoefficient(m));
+ C.setVectorCoefficient(m, M);
+ }
+ return C;
+ }
+
+ template<class Field, class Vector1, class Vector3>
+ Vector1& SlicedPolynomialVectorAddin<Field, Vector1, Vector3 >::operator()(const Field& F,
+ Vector1& C,
+ const Vector3& B) const
+ {
+ //check dimensions
+ BlasVector<Vector1::IntField> M(C.fieldF(), C.rowdim());
+ for (int m = 0; m < C.length(); m++)
+ {
+ M = C.getVectorCoefficient(m);
+ VectorDomain<Vector1::IntField>.addin(C.fieldF(),
+ M, A.getVectorCoefficient(m), B.getVectorCoefficient(m));
+ C.setVectorCoefficient(m, M);
+ }
+ return C;
+ }
+
+ template<class Field, class Vector1, class Vector3>
+ Vector1& SlicedPolynomialVectorSubin<Field, Vector1, Vector3 >::operator()(const Field& F,
+ Vector1& C,
+ const Vector3& B) const
+ {
+ //check dimensions
+ BlasVector<Vector1::IntField> M(C.fieldF(), C.rowdim());
+ for (int m = 0; m < C.length(); m++)
+ {
+ M = C.getVectorCoefficient(m);
+ VectorDomain<Vector1::IntField>.add(C.fieldF(),
+ M, A.getVectorCoefficient(m), B.getVectorCoefficient(m));
+ C.setVectorCoefficient(m, M);
+ }
+ return C;
+ }
+} // LinBox
+
+#endif
\ No newline at end of file
diff --git a/linbox/vector/stream-gf2.h b/linbox/vector/stream-gf2.h
index 9d16a01..3e4141c 100644
--- a/linbox/vector/stream-gf2.h
+++ b/linbox/vector/stream-gf2.h
@@ -39,20 +39,20 @@
*
* ------------------------------------
*
- *
+ *
* ========LICENCE========
* This file is part of the library LinBox.
- *
+ *
* LinBox is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
- *
+ *
* This library 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
* Lesser General Public License for more details.
- *
+ *
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
@@ -171,15 +171,16 @@ namespace LinBox
_Vector &RandomSparseStreamGF2<_Vector>::get (_Vector &v)
{
size_t i = (size_t) -1;
- double val;
- int skip;
-
- if (_m > 0 && _j++ >= _m)
+ if (_m > 0 && _j++ >= _m)
return v;
v.clear ();
while (1) {
+ double val;
+ int skip;
+
+
val = (double) MT.randomDouble ();
skip = (int) (ceil (log (val) * _1_log_1mp));
diff --git a/linbox/vector/stream.h b/linbox/vector/stream.h
index 76d1fa7..579dc5c 100644
--- a/linbox/vector/stream.h
+++ b/linbox/vector/stream.h
@@ -39,20 +39,20 @@
*
* ------------------------------------
*
- *
+ *
* ========LICENCE========
* This file is part of the library LinBox.
- *
+ *
* LinBox is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
- *
+ *
* This library 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
* Lesser General Public License for more details.
- *
+ *
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
@@ -71,13 +71,13 @@
#ifndef __LINBOX_vector_stream_H
#define __LINBOX_vector_stream_H
-#include <vector>
-#include <cmath>
+#include <givaro/givranditer.h>
#include "linbox/util/debug.h"
-#include "linbox/vector/vector-traits.h"
-#include "linbox/randiter/nonzero.h"
#include "linbox/randiter/mersenne-twister.h"
+#include "linbox/vector/vector-traits.h"
+#include <vector>
+#include <cmath>
// stream
@@ -172,7 +172,15 @@ namespace LinBox
* @param v Vector to use
*/
Vector &get (Vector &v)
- { if (_m == 0 || _j < _m) copy (_v.begin (), _v.end (), v.begin ()); return v; }
+ {
+ if (_m == 0 || _j < _m)
+ std::copy (_v.begin (), _v.end (), v.begin ());
+#ifdef _LB_DEBUG
+ else {
+ std::cerr << "Vector stream: nothing to get" << std::endl;
+ }
+#endif
+ return v; }
/** Extraction operator form
*/
@@ -205,26 +213,24 @@ namespace LinBox
};
}
+
+// #include "linbox/vector/blas-vector.h"
// Dense
namespace LinBox
{
+ template<class _Field, class _Rep> class BlasVector ;
+
/** @brief Random dense vector stream.
* Generates a sequence of random dense vectors over a given field
*/
- template <class Field, class _Vector = typename LinBox::Vector<Field>::Dense, class RandIter = typename Field::RandIter, class Trait = typename VectorTraits<_Vector>::VectorCategory>
+ template <typename Field, typename _Vector = BlasVector<Field, typename Vector<Field>::Dense>,
+ class RandIter = typename Field::RandIter,
+ class Trait = typename VectorTraits<_Vector>::VectorCategory>
class RandomDenseStream : public VectorStream<_Vector> {
public:
typedef _Vector Vector;
typedef RandomDenseStream<Field, Vector, RandIter, Trait> Self_t;
- /** Constructor
- * Construct a new stream with the given field and vector size.
- * @param F Field over which to create random vectors
- * @param n Size of vectors
- * @param m Number of vectors to return (0 for unlimited)
- */
- RandomDenseStream (const Field &F, size_t n, size_t m = 0);
-
/** Constructor.
* Construct a new stream with the given field and vector size.
* @param F Field over which to create random vectors
@@ -232,7 +238,7 @@ namespace LinBox
* @param n Size of vectors
* @param m Number of vectors to return (0 for unlimited)
*/
- RandomDenseStream (const Field &F, const RandIter &r, size_t n, size_t m = 0);
+ RandomDenseStream (const Field &F, RandIter &r, size_t n, size_t m = 0);
/** Get next element
* @param v Vector into which to generate random vector
@@ -272,11 +278,7 @@ namespace LinBox
typedef _Vector Vector;
typedef RandomDenseStream<Field, Vector, RandIter, VectorCategories::DenseVectorTag > Self_t;
- RandomDenseStream (const Field &F, size_t nn, size_t mm = 0) :
- _field (F), _r (F), _n (nn), _m (mm), _j (0)
- {}
-
- RandomDenseStream (const Field &F, const RandIter &r, size_t nn, size_t mm = 0) :
+ RandomDenseStream (const Field &F, RandIter &r, size_t nn, size_t mm = 0) :
_field (F), _r (r), _n (nn), _m (mm), _j (0)
{}
@@ -287,7 +289,7 @@ namespace LinBox
if ( (_m > 0) && (_j++ >= _m) )
return v;
- for (i = v.begin (); i != v.end (); i++)
+ for (i = v.begin (); i != v.end (); ++i)
_r.random (*i);
return v;
@@ -305,7 +307,7 @@ namespace LinBox
private:
const Field &_field;
- RandIter _r;
+ RandIter & _r;
size_t _n;
size_t _m;
size_t _j;
@@ -313,27 +315,19 @@ namespace LinBox
}
+#include "linbox/vector/sparse.h"
//Sparse
namespace LinBox
{
/** @brief Random sparse vector stream.
* Generates a sequence of random sparse vectors over a given field
*/
- template <class Field, class _Vector = typename LinBox::Vector<Field>::Sparse, class RandIter = typename Field::RandIter, class Trait = typename VectorTraits<_Vector>::VectorCategory>
+ template <class Field, class _Vector = Sparse_Vector<typename Field::Element>, class RandIter = typename Field::RandIter, class Trait = typename VectorTraits<_Vector>::VectorCategory>
class RandomSparseStream : public VectorStream<_Vector> {
public:
typedef _Vector Vector;
typedef RandomSparseStream<Field, Vector, RandIter, Trait > Self_t;
- /** Constructor
- * Construct a new stream with the given field and vector size.
- * @param F Field over which to create random vectors
- * @param p Proportion of nonzero entries
- * @param n Size of vectors
- * @param m Number of vectors to return (0 for unlimited)
- */
- RandomSparseStream (const Field &F, double p, size_t n, size_t m = 0);
-
/** Constructor.
* Construct a new stream with the given field and vector size.
* @param F Field over which to create random vectors
@@ -343,7 +337,7 @@ namespace LinBox
* @param m Number of vectors to return (0 for unlimited)
* @param seed
*/
- RandomSparseStream (const Field &F, const RandIter &r, double p, size_t n, size_t m = 0, int seed=(int)time (NULL));
+ RandomSparseStream (const Field &F, RandIter &r, double p, size_t n, size_t m = 0, int seed=(int)time (NULL));
/** Get next element
* @param v Vector into which to generate random vector
@@ -387,37 +381,27 @@ namespace LinBox
typedef _Vector Vector;
typedef RandomSparseStream<Field, Vector, RandIter, VectorCategories::DenseVectorTag > Self_t;
- RandomSparseStream (const Field &F, double p, size_t N, size_t M = 0) :
- _field (F), _r1 (F), _r (F, _r1),
- _n (N), _p (p), _m (M), _j (0),
- MT ((uint32_t)time (NULL))
- {
- linbox_check ((p >= 0.0) && (p <= 1.0));
- _field.init (_zero, 0);
- }
-
- RandomSparseStream (const Field &F, const RandIter &r, double p, size_t n, size_t m = 0, int seed=(int)time (NULL)) :
- _field (F), _r1 (r), _r (F, _r1), _n (n), _p (p), _m (m), _j (0),
+ RandomSparseStream (const Field &F, RandIter &r, double p, size_t n, size_t m = 0, int seed=(int)time (NULL)) :
+ _field (F), _r1 (r), _r (_r1), _n (n), _p (p), _m (m), _j (0),
MT ((uint32_t)seed)
{
linbox_check ((p >= 0.0) && (p <= 1.0));
- _field.init (_zero, 0);
}
Vector &get (Vector &v)
{
- double val;
if (_m > 0 && _j++ >= _m)
return v;
for (typename Vector::iterator i = v.begin (); i != v.end (); ++i) {
+ double val;
val = MT.randomDouble ();
if (val < _p)
_r.random (*i);
else
- _field.assign (*i, _zero);
+ _field.assign (*i, _field.zero);
}
return v;
@@ -436,9 +420,8 @@ namespace LinBox
private:
const Field &_field;
- typename Field::Element _zero;
- RandIter _r1;
- NonzeroRandIter<Field, RandIter> _r;
+ RandIter & _r1;
+ Givaro::GeneralRingNonZeroRandIter<Field, RandIter> _r;
size_t _n;
double _p;
size_t _m;
@@ -450,26 +433,25 @@ namespace LinBox
template <class Field, class _Vector, class RandIter>
class RandomSparseStream<Field, _Vector, RandIter, VectorCategories::SparseSequenceVectorTag > : public VectorStream<_Vector> {
public:
+ typedef RandomSparseStream<Field, _Vector, RandIter, VectorCategories::SparseSequenceVectorTag > Self_t;
typedef _Vector Vector;
- typedef RandomSparseStream<Field, Vector, RandIter, VectorCategories::SparseSequenceVectorTag > Self_t;
-
- RandomSparseStream (const Field &F, double p, size_t N, size_t M = 0) :
- _field (F), _r1 (F), _r (F, _r1), _n (N), _m (M), _j (0),
- MT ((uint32_t)time (NULL))
- { setP (p); }
- RandomSparseStream (const Field &F, const RandIter &r, double p,
+ RandomSparseStream (const Field &F, RandIter &r, double p,
size_t N, size_t M = 0, int seed=(int)time (NULL)) :
- _field (F), _r1 (r), _r (F, _r1), _n (N), _p (p), _m (M), _j (0),
- MT ((uint32_t)seed)
+ _field (F),
+ _r1 (r),
+ _r (r),
+ _n (N),
+ _p (p),
+ _m (M),
+ _j (0),
+ MT ((uint32_t)seed)
{ setP (p); }
Vector &get (Vector &v)
{
typename Field::Element x;
size_t i = (size_t) -1;
- double val;
- int skip;
if (_m > 0 && _j++ >= _m)
return v;
@@ -477,6 +459,10 @@ namespace LinBox
v.clear ();
while (1) {
+
+ double val;
+ int skip;
+
val = MT.randomDouble ();
skip = (int) (ceil (log (val) * _1_log_1mp));
@@ -513,8 +499,8 @@ namespace LinBox
private:
const Field &_field;
- RandIter _r1;
- NonzeroRandIter<Field, RandIter> _r;
+ RandIter & _r1;
+ Givaro::GeneralRingNonZeroRandIter<Field, RandIter> _r;
size_t _n;
double _p;
double _1_log_1mp;
@@ -530,29 +516,24 @@ namespace LinBox
typedef _Vector Vector;
typedef RandomSparseStream<Field, Vector, RandIter, VectorCategories::SparseAssociativeVectorTag > Self_t;
- RandomSparseStream (const Field &F, double p, size_t N, size_t M = 0) :
- _field (F), _r1 (F), _r (F, _r1),
- _n (N), _k ((long) (p * (double)N)), _j (0), _m (M),
- MT ((uint32_t)time (NULL))
- {}
-
- RandomSparseStream (const Field &F, const RandIter &r, double p, size_t N,
+ RandomSparseStream (const Field &F, RandIter &r, double p, size_t N,
size_t M = 0, int seed=(int)time (NULL)) :
- _field (F), _r1 (F), _r (F, _r1), _n (N), _k ((long) (p * N)), _j (0), _m (M),
+ _field (F), _r1 (r), _r (_r1), _n (N), _k ((long) (p * N)), _j (0), _m (M),
MT ((uint32_t) seed)
{}
Vector &get (Vector &v)
{
typename Field::Element x;
- int i, idx;
+ int i;
if (_m > 0 && _j++ >= _m)
return v;
v.clear ();
- for (i = 0; i < _k; i++) {
+ for (i = 0; i < _k; ++i) {
+ size_t idx;
_r.random (x);
while (!_field.isZero (v[idx = MT.randomIntRange (0, (uint32_t)_n)])) ;
v[idx] = x;
@@ -574,8 +555,8 @@ namespace LinBox
private:
const Field &_field;
- RandIter _r1;
- NonzeroRandIter<Field, RandIter> _r;
+ RandIter & _r1;
+ Givaro::GeneralRingNonZeroRandIter<Field, RandIter> _r;
size_t _n;
long _k;
size_t _j;
@@ -590,13 +571,8 @@ namespace LinBox
typedef _Vector Vector;
typedef RandomSparseStream<Field, Vector, RandIter, VectorCategories::SparseParallelVectorTag > Self_t;
- RandomSparseStream (const Field &F, double p, size_t nn, size_t mm = 0) :
- _field (F), _r1 (F), _r (F, _r1), _n (nn), _m (mm), _j (0),
- MT ((uint32_t)time (NULL))
- { setP (p); }
-
- RandomSparseStream (const Field &F, const RandIter &r, double p, size_t nn, size_t mm = 0, int seed=(int)time (NULL)) :
- _field (F), _r1 (r), _r (F, _r1), _n (nn), _m (mm), _j (0),
+ RandomSparseStream (const Field &F, RandIter &r, double p, size_t nn, size_t mm = 0, int seed=(int)time (NULL)) :
+ _field (F), _r1 (r), _r (_r1), _n (nn), _m (mm), _j (0),
MT ((uint32_t)seed)
{ setP (p); }
@@ -604,8 +580,6 @@ namespace LinBox
{
typename Field::Element x;
size_t i = (size_t) -1;
- double val;
- int skip;
if (_m > 0 && _j++ >= _m)
return v;
@@ -614,11 +588,15 @@ namespace LinBox
v.second.clear ();
while (1) {
+
+ double val;
+ int skip;
+
val = MT.randomDouble ();
skip = (int) (ceil (log (val) * _1_log_1mp));
if (skip <= 0)
- i++;
+ ++i;
else
i += (size_t) skip;
@@ -652,8 +630,8 @@ namespace LinBox
private:
const Field &_field;
- RandIter _r1;
- NonzeroRandIter<Field, RandIter> _r;
+ RandIter & _r1;
+ Givaro::GeneralRingNonZeroRandIter<Field, RandIter> _r;
size_t _n;
double _p;
double _1_log_1mp;
@@ -734,18 +712,17 @@ namespace LinBox
Vector &get (Vector &v)
{
- static typename Field::Element zero;
typename Vector::iterator i;
- size_t idx;
- for (i = v.begin (), idx = 0; i != v.end (); i++, idx++) {
+ size_t idx;
+ for (i = v.begin (), idx = 0; i != v.end (); ++i, ++idx) {
if (idx == _j)
- _field.init (*i, 1);
+ _field.assign(*i, _field.one);
else
- _field.assign (*i, zero);
+ _field.assign (*i, _field.zero);
}
- _j++;
+ ++_j;
return v;
}
@@ -753,11 +730,19 @@ namespace LinBox
/** Extraction operator form
*/
Self_t &operator >> (Vector &v)
- { get (v); return *this; }
+ {
+ get (v);
+ return *this;
+ }
+
size_t size () const { return _n; }
+
size_t pos () const { return _j; }
+
size_t dim () const { return _n; }
+
operator bool () const { return _j < _n; }
+
void reset () { _j = 0; }
private:
@@ -775,14 +760,15 @@ namespace LinBox
StandardBasisStream (Field &F, size_t N) :
_field (F), _n (N), _j (0)
- { _field.init (_one, 1); }
+ {
+ }
Vector &get (Vector &v)
{
v.clear ();
if (_j < _n)
- v.push_back (std::pair <size_t, typename Field::Element> (_j++, _one));
+ v.push_back (std::pair <size_t, typename Field::Element> (_j++, _field.one));
return v;
}
@@ -801,7 +787,6 @@ namespace LinBox
const Field &_field;
size_t _n;
size_t _j;
- typename Field::Element _one;
};
//! Specialization of standard basis stream for sparse associative vectors
@@ -813,14 +798,15 @@ namespace LinBox
StandardBasisStream (Field &F, size_t N) :
_field (F), _n (N), _j (0)
- { _field.init (_one, 1); }
+ {
+ }
Vector &get (Vector &v)
{
v.clear ();
if (_j < _n)
- v.insert (std::pair <size_t, typename Field::Element> (_j++, _one));
+ v.insert (std::pair <size_t, typename Field::Element> (_j++, _field.one));
return v;
}
@@ -839,7 +825,6 @@ namespace LinBox
const Field &_field;
size_t _n;
size_t _j;
- typename Field::Element _one;
};
//! Specialization of standard basis stream for sparse parallel vectors
@@ -851,7 +836,7 @@ namespace LinBox
StandardBasisStream (Field &F, size_t N) :
_field (F), _n (N), _j (0)
- { _field.init (_one, 1); }
+ { }
Vector &get (Vector &v)
{
@@ -860,7 +845,7 @@ namespace LinBox
if (_j < _n) {
v.first.push_back (_j++);
- v.second.push_back (_one);
+ v.second.push_back (_field.one);
}
return v;
@@ -880,7 +865,6 @@ namespace LinBox
const Field &_field;
size_t _n;
size_t _j;
- typename Field::Element _one;
};
} // namespace LinBox
@@ -891,11 +875,10 @@ namespace LinBox
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
// Local Variables:
// mode: C++
// tab-width: 8
// indent-tabs-mode: nil
// c-basic-offset: 8
// End:
-
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/vector/subiterator.h b/linbox/vector/subiterator.h
old mode 100644
new mode 100755
index 483544b..1362925
--- a/linbox/vector/subiterator.h
+++ b/linbox/vector/subiterator.h
@@ -5,20 +5,20 @@
* Mods by -bds
* ------------------------------------
*
- *
+ *
* ========LICENCE========
* This file is part of the library LinBox.
- *
+ *
* LinBox is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
- *
+ *
* This library 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
* Lesser General Public License for more details.
- *
+ *
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
@@ -57,11 +57,16 @@ namespace LinBox
typedef typename std::iterator_traits<Iterator>::pointer pointer;
typedef typename std::iterator_traits<Iterator>::reference reference;
- // Constructors
- Subiterator () {}
+ // Basic constructors
- /** Subiterator p (pp, 3) provides an iterator which initially has
+ Subiterator ()
+ {
+ }
+
+ /** Constructors.
+ *
+ * Subiterator p (pp, 3) provides an iterator which initially has
* the same reference, but for which increments and offsets step by
* the amount stride rather than 1.
* Thus p+k is equivalent to pp+(stride*k).
@@ -71,87 +76,189 @@ namespace LinBox
* iterator only when it has a valid reference.
*/
Subiterator (const Iterator &iter, const difference_type& stride = 1) :
- _iter (iter), _stride (stride) {}
+ _iter (iter), _stride (stride)
+ {
+ }
+ // copy-constructor
+ Subiterator (const Subiterator & iter) :
+ _iter (iter._iter), _stride (iter._stride)
+ {
+ }
+
+ Subiterator (Iterator & iter) :
+ _iter (iter._iter), _stride (iter._stride)
+ {
+ }
+
+ // constructor
template<class Iterator2>
Subiterator (const Subiterator<Iterator2>& iter) :
- _iter (iter._iter), _stride (iter._stride) {}
+ _iter (iter._iter), _stride (iter._stride)
+ {
+ }
+
+ template<class Iterator2>
+ Subiterator (Subiterator<Iterator2>& iter) :
+ _iter (iter._iter), _stride (iter._stride)
+ {
+ }
+ // copy-assign
template<class Iterator2>
Subiterator& operator = (const Subiterator<Iterator2>& sub)
{
- _iter=sub._iter;
- _stride=sub._stride;
+ _iter =sub.showIterator();
+ _stride=sub.showStride();
+ return *this;
+ }
+
+ Subiterator& operator = (const Subiterator& sub)
+ {
+ _iter =sub.showIterator();
+ _stride=sub.showStride();
return *this;
}
// Access operations
- reference operator * () const
- { return *_iter; }
+ const reference operator * () const
+ {
+ return *_iter;
+ }
+
+ reference operator * ()
+ {
+ return *_iter;
+ }
Iterator operator -> () const
- { return _iter; }
+ {
+ return _iter;
+ }
- reference operator [] (difference_type n) const
- { return _iter[n * _stride]; }
+ reference operator [] (difference_type n)
+ {
+ return _iter[n * _stride];
+ }
+
+ const reference operator [] (difference_type n) const
+ {
+ return _iter[n * _stride];
+ }
// Iteration operations
Subiterator& operator ++ ()
- { _iter += _stride; return *this; }
+ {
+ _iter += _stride;
+ return *this;
+ }
Subiterator operator ++ (int)
- { Subiterator tmp = *this; _iter += _stride; return tmp; }
+ {
+ Subiterator tmp = *this;
+ _iter += _stride;
+ return tmp;
+ }
Subiterator& operator -- ()
- { _iter -= _stride; return *this; }
+ {
+ _iter -= _stride;
+ return *this;
+ }
Subiterator operator -- (int)
- { Subiterator tmp = *this; _iter -= _stride; return tmp; }
+ {
+ Subiterator tmp = *this;
+ _iter -= _stride;
+ return tmp;
+ }
Subiterator operator + (difference_type n) const
- { return Subiterator (_iter + (n * _stride), _stride); }
+ {
+ return Subiterator (_iter + (n * _stride), _stride);
+ }
Subiterator& operator += (difference_type n)
- { _iter += (n * _stride); return *this; }
+ {
+ _iter += (n * _stride);
+ return *this;
+ }
Subiterator operator - (difference_type n) const
- { return Subiterator (_iter - (n * _stride), _stride); }
+ {
+ return Subiterator (_iter - (n * _stride), _stride);
+ }
difference_type operator - (const Subiterator& x) const
- { return (_iter - x._iter)/_stride; }
+ {
+ return (_iter - x._iter)/_stride;
+ }
Subiterator& operator -= (difference_type n)
- { _iter -= (n * _stride); return *this; }
+ {
+ _iter -= (n * _stride);
+ return *this;
+ }
// Comparison operations
bool operator == (const Subiterator& i) const
- { return ( (this->_stride == i._stride) && (this->_iter == i._iter) ); }
+ {
+ return ( (this->_stride == i._stride) && (this->_iter == i._iter) );
+ }
bool operator != (const Subiterator& i) const
- { return !(*this == i); }
+ {
+ return !(*this == i);
+ }
bool operator < (const Subiterator& i) const
- { return (this->_iter < i._iter); }
+ {
+ return (this->_iter < i._iter);
+ }
bool operator > (const Subiterator& i) const
- { return (this->_iter > i._iter); }
+ {
+ return (this->_iter > i._iter);
+ }
bool operator <= (const Subiterator& i) const
- { return (this->_iter <= i._iter); }
+ {
+ return (this->_iter <= i._iter);
+ }
bool operator >= (const Subiterator& i) const
- { return (this->_iter >= i._iter); }
+ {
+ return (this->_iter >= i._iter);
+ }
+
+ // swap
void swap (Subiterator& x)
- { std::swap (_iter, x._iter); std::swap (_stride, x._stride); }
+ {
+ std::swap (_iter, x._iter); std::swap (_stride, x._stride);
+ }
+
+ // view protected members
+
+ difference_type showStride() const
+ {
+ return this->_stride ;
+ }
+
+ const Iterator & showIterator() const
+ {
+ return this->_iter ;
+ }
+
protected:
- Iterator _iter; // wrapped iterator
- difference_type _stride; // length between iterations
+ Iterator _iter; //!< @internal wrapped iterator
+
+ difference_type _stride; //!< @internal length between iterations
}; // template <class Iterator> class Subiterator
@@ -160,11 +267,10 @@ namespace LinBox
#endif // __LINBOX_subiterator_H
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
// Local Variables:
// mode: C++
// tab-width: 8
// indent-tabs-mode: nil
// c-basic-offset: 8
// End:
-
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/vector/subvector.h b/linbox/vector/subvector.h
old mode 100644
new mode 100755
index 141d131..0d0d9c9
--- a/linbox/vector/subvector.h
+++ b/linbox/vector/subvector.h
@@ -32,10 +32,10 @@
#ifndef __LINBOX_subvector_H
#define __LINBOX_subvector_H
-#include "linbox/vector/subiterator.h"
+//#include "linbox/vector/subiterator.h" BB:not used here
#include <iterator>
-#include "linbox/vector/vector-traits.h"
#include <stdexcept>
+#include "linbox/vector/vector-traits.h"
namespace LinBox
{
@@ -82,9 +82,18 @@ namespace LinBox
template<class Vector>
Subvector (Vector& v, size_type start, size_type stride, size_type length) :
- _begin (iterator (v.begin() + start, stride)),
- _end (iterator (v.begin() + start + (stride * length), stride))
+ _begin (iterator (v.begin() + (ptrdiff_t)start, (ptrdiff_t)stride)),
+ _end (iterator (v.begin() + (ptrdiff_t)start + (ptrdiff_t)(stride * length), (ptrdiff_t)stride))
+ {
+ }
+
+#if 0
+ template<lass otherIterator>
+ Subvector (otheriterator Begin, size_type start, size_type stride, size_type length) :
+ _begin (iterator (Begin + (ptrdiff_t)start, (ptrdiff_t)stride)),
+ _end (iterator (Begin + (ptrdiff_t)start + (ptrdiff_t)(stride * length), (ptrdiff_t)stride))
{}
+#endif
Subvector(iterator Begin, iterator End) :
_begin(Begin), _end(End)
@@ -115,8 +124,8 @@ namespace LinBox
// Element access
- reference operator[] (size_type n) { return _begin[n]; }
- const_reference operator[] (size_type n) const { return _begin[n]; }
+ reference operator[] (size_type n) { return _begin[(ptrdiff_t)n]; }
+ const_reference operator[] (size_type n) const { return const_cast<iterator*>(&_begin)->operator[]((ptrdiff_t)n); }
// the method "at" does appear to be implemented
// in the gnu implementation of the STL
@@ -131,6 +140,8 @@ namespace LinBox
const_reference at(size_type n) const
{
+std::cerr << "n: " << n << std::endl;
+std::cerr << "_end-_begin: " << (int)(_end-_begin) << std::endl;
const_iterator p = _begin + n;
if ( _begin <= p && p < _end)
return *p;
@@ -184,10 +195,10 @@ namespace LinBox
Subvector& operator=(const Subvector& sub)
{ _begin = sub._begin; _end = sub._end; return *this; }
- size_type size (void) const { return _end - _begin; }
- bool empty (void) const { return _end == _begin; }
- size_type max_size (void) const { return _end - _begin; }
- //size_type capacity(void) const { return _end - _begin; }
+ size_type size (void) const { return (size_t)(_end - _begin); }
+ bool empty (void) const { return (size_t)(_end == _begin); }
+ size_type max_size (void) const { return (size_t)(_end - _begin); }
+ //size_type capacity(void) const { return (size_t)(_end - _begin); }
// Swap
void swap (Subvector& x)
@@ -231,9 +242,11 @@ namespace LinBox
} // namespace LinBox
+//! @warning why do we need this ?
namespace std
{
+#if 0
template<class _Tp>
void swap (_Tp&, _Tp&)
#ifdef __GNUC__
@@ -245,6 +258,7 @@ namespace std
#endif
#endif
;
+#endif
@@ -263,11 +277,10 @@ namespace std
#endif //__LINBOX_subvector_H
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
// Local Variables:
// mode: C++
// tab-width: 8
// indent-tabs-mode: nil
// c-basic-offset: 8
// End:
-
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/vector/vector-domain-gf2.h b/linbox/vector/vector-domain-gf2.h
index 0743951..01ad2b5 100644
--- a/linbox/vector/vector-domain-gf2.h
+++ b/linbox/vector/vector-domain-gf2.h
@@ -32,20 +32,20 @@
*
* ------------------------------------
*
- *
+ *
* ========LICENCE========
* This file is part of the library LinBox.
- *
+ *
* LinBox is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
- *
+ *
* This library 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
* Lesser General Public License for more details.
- *
+ *
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
@@ -66,7 +66,7 @@ namespace LinBox
template<>
- class DotProductDomain<GF2> : private virtual VectorDomainBase<GF2> {
+ class DotProductDomain<GF2> : public VectorDomainBase<GF2> {
public:
typedef bool Element;
@@ -98,19 +98,21 @@ namespace LinBox
{
template <>
- class VectorDomain<GF2> : private virtual VectorDomainBase<GF2>, private virtual DotProductDomain<GF2> {
+ //class VectorDomain<GF2> : private virtual VectorDomainBase<GF2> , private virtual DotProductDomain<GF2> {
+ class VectorDomain<GF2> : public DotProductDomain<GF2> {
public:
typedef bool Element;
VectorDomain (const VectorDomain &VD) :
- VectorDomainBase<GF2> (VD._field), DotProductDomain<GF2> (VD._field)
+ //VectorDomainBase<GF2> (VD.field()), DotProductDomain<GF2> (VD.field())
+ DotProductDomain<GF2> (VD.field())
{}
VectorDomain &operator = (const VectorDomain &) { return *this; }
const GF2 &field () const
{
- return _field;
+ return DotProductDomain<GF2>::field();
}
template <class Vector>
@@ -254,7 +256,8 @@ namespace LinBox
}
VectorDomain (const GF2 &F) :
- VectorDomainBase<GF2> (F), DotProductDomain<GF2> (F)
+ //VectorDomainBase<GF2> (F), DotProductDomain<GF2> (F)
+ DotProductDomain<GF2> (F)
{}
@@ -508,7 +511,7 @@ namespace LinBox
add (u, w, v);
copy (res, u);
- return u;
+ return res;
}
template <class Vector1, class Vector2, class Vector3>
@@ -526,7 +529,7 @@ namespace LinBox
sub (u, w, v);
copy (res, u);
- return u;
+ return res;
}
};
@@ -538,11 +541,11 @@ namespace LinBox
#endif // __LINBOX_field_vector_domain_H
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
// Local Variables:
// mode: C++
// tab-width: 8
// indent-tabs-mode: nil
// c-basic-offset: 8
// End:
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/vector/vector-domain.h b/linbox/vector/vector-domain.h
index 06767dc..a39943f 100644
--- a/linbox/vector/vector-domain.h
+++ b/linbox/vector/vector-domain.h
@@ -31,21 +31,25 @@
* Added methods add, addin, sub, subin, areEqual, isZero, and copy.
*
* ------------------------------------
+ * 2012Aug -bds
+ * VectorDomain<F> inherits from DotProductDomain<F>, which inherits from VectorDomainBase<F>.
+ * DotProductDomain<> has a generic definition here and
+ * has specializations in field/Modular/ and field/Givaro/.
+ * ------------------------------------
*
- *
* ========LICENCE========
* This file is part of the library LinBox.
- *
+ *
* LinBox is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
- *
+ *
* This library 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
* Lesser General Public License for more details.
- *
+ *
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
@@ -75,19 +79,17 @@ namespace LinBox
template <class Field>
class VectorDomainBase {
public:
- VectorDomainBase (const Field &F) :
- _field (F), accu(F)
- {}
-
- VectorDomainBase& operator= (const VectorDomainBase& VD)
- { _field = VD._field;
- accu = VD.accu;
- return *this;
- }
-
+ VectorDomainBase () : _faxpy(nullptr) {std::cout<<"CST DEFAULT VDB"<<std::endl;}
+ VectorDomainBase (const Field &F) : _faxpy(new FieldAXPY<Field>(F))
+ { /*std::cerr << "VDD cstor " << this << std::endl;*/}
+ ~VectorDomainBase() { if (_faxpy != nullptr) delete _faxpy; }
+
+ void init(const Field &F) { if (_faxpy != nullptr) delete _faxpy; _faxpy = new FieldAXPY<Field>(F); }
+ inline const Field & field() const { return _faxpy->field(); }
+ inline const FieldAXPY<Field>& faxpy() const { return *_faxpy; }
+
protected:
- Field _field;
- mutable FieldAXPY<Field> accu;
+ const FieldAXPY<Field> * _faxpy;
};
}
@@ -104,15 +106,22 @@ namespace LinBox
* critical for performance, so their implementations are in the derived
* class VectorDomain.
*/
- template <class Field>
- class DotProductDomain : public virtual VectorDomainBase<Field> {
+ template <class Field_>
+ // class DotProductDomain : public virtual VectorDomainBase<Field_> {
+ class DotProductDomain : public VectorDomainBase<Field_> {
public:
+ //DotProductDomain () { /*std::cerr << "DPD def cstor" << std::endl;*/ }// no def cstor allowed
+ typedef Field_ Field;
typedef typename Field::Element Element;
DotProductDomain (const Field &F) :
VectorDomainBase<Field> (F)
- {}
+ { /*std::cerr << "DPD cstor " << this << std::endl; */}
+
+ using VectorDomainBase<Field>::field;
+ using VectorDomainBase<Field>::init;
+
protected:
template <class Vector1, class Vector2>
@@ -127,6 +136,35 @@ namespace LinBox
namespace LinBox
{ /* Vector Domain */
+/* public members
+VectorDomain<F>()
+VectorDomain<F>(VD)
+VectorDomain (F)
+VD1 = VD2
+VD.field()
+VD.write<V>(os, v)
+VD.read<V>(os, v)
+VD.copy<V1,V2>(v1,v2)
+VD.copy<V1,V2>(v1,v2,i,n)
+VD.areEqual<V1,V2>(v1,v2)
+VD.isZero<V>(v)
+VD.dot<V1,V2>(e,v1,v2) aka dotprod
+VD.add<V1,V2,V3>(v1,v2,v3)
+VD.addin<V1,V2>(v1,v2)
+VD.sub<V1,V2,V3>(v1,v2,v3)
+VD.subin<V1,V2>(v1,v2)
+VD.neg<V1,V2>(v1,v2)
+VD.negin<V>(v)
+VD.mul<V1,V2>(v1,v2,e)
+VD.mulin<V>(v,e)
+VD.axpy<V1,V2,V3>(v1,e,v2,v3)
+VD.axpyin<V1,V2>(v1,e,v2)
+VD.swap<V1,V2>(v1,v2)
+VD.random<V>(v)
+class Transposition;
+class Permutation;
+VD.permute<V,PI>(v1,pb,pe)
+*/
/** @name Vector Domain
* @brief Vector arithmetic
@@ -144,12 +182,21 @@ namespace LinBox
*/
// JGD 01.10.2003 : Why inherit twice from VectorDomainBase<Field> ???
// bds 2004Apr25 : well, g++ 3.4.3 wants explicit base domains on everything - eases that.
- template <class Field>
- class VectorDomain : public virtual DotProductDomain<Field>, public virtual VectorDomainBase<Field> {
+ template <class Field_>
+ // class VectorDomain : public virtual DotProductDomain<Field_> , public virtual VectorDomainBase<Field_> {
+ class VectorDomain : public DotProductDomain<Field_> {
public:
+ typedef Field_ Field;
+
typedef typename Field::Element Element;
+ // VectorDomain(): DotProductDomain<Field>() { /*std::cerr << "VD def cstor" << std::endl;*/ }
+ //VectorDomain():DotProductDomain<Field>() {}
+
+ //using VectorDomainBase<Field>::init;
+ using DotProductDomain<Field>::init;
+
/** Copy constructor.
* Constructs VectorDomain object by copying the domain.
* This is required to allow vector domain objects to be passed
@@ -157,17 +204,29 @@ namespace LinBox
* @param VD VectorDomain object.
*/
VectorDomain (const VectorDomain &VD) :
- VectorDomainBase<Field> (VD._field), DotProductDomain<Field> (VD._field)
+ //VectorDomainBase<Field> (VD.field()),
+ DotProductDomain<Field> (VD.field())
{}
+ /** Construct from a field.
+ * @param F Field or ring
+ */
+ VectorDomain (const Field &F) :
+ //VectorDomainBase<Field> (F), DotProductDomain<Field> (F)
+ DotProductDomain<Field> (F)
+ {/* std::cerr << "VD cstor " << this << std::endl;*/}
+
+
+
/** Assignment operator.
* Assigns VectorDomain object MD to field.
* @param VD VectorDomain object.
*/
VectorDomain &operator = (const VectorDomain &VD)
{
- VectorDomainBase<Field>:: _field = VD._field;
- VectorDomainBase<Field>:: accu = VD.accu;
+ this->init(VD.field());
+ //this->_field = VD._field;
+ //VectorDomainBase<Field>:: accu = VD.accu;
return *this;
}
@@ -177,10 +236,8 @@ namespace LinBox
* @return reference to field
*/
- const Field &field () const
- {
- return VectorDomainBase<Field>:: _field;
- }
+ //using VectorDomainBase<Field>::field;
+ using DotProductDomain<Field>::field;
/** Vector input/output operations
* These routines are useful for reading and writing vectors to
@@ -482,21 +539,7 @@ namespace LinBox
//@}
- /** @name Implementation-Specific Methods.
- * These methods are not required of all \ref LinBox\ Fields
- * and are included only for this implementation of the archetype.
- */
- //@{
-
- /** Construct from a field.
- * @param F Field from which to construct
- */
- VectorDomain (const Field &F) :
- VectorDomainBase<Field> (F),DotProductDomain<Field> (F)
- {}
-
- //@} Implementation-Specific Methods
-
+
/*! Random vector.
* @param v vector to be randomized.
*/
@@ -741,7 +784,7 @@ namespace LinBox
VectorCategories::DenseVectorTag,
VectorCategories::DenseVectorTag) const
{
- return DotProductDomain<Field>::dotSpecializedDD (res, v1, v2);
+ return DotProductDomain<Field>:: dotSpecializedDD (res, v1, v2);
}
template <class Vector1, class Vector2>
@@ -1070,7 +1113,7 @@ namespace LinBox
add (u, w, v);
copy (res, u);
- return u;
+ return res;
}
template <class Vector1, class Vector2>
@@ -1160,7 +1203,7 @@ namespace LinBox
sub (u, w, v);
copy (res, u);
- return u;
+ return res;
}
template <class Vector1, class Vector2>
@@ -1293,11 +1336,10 @@ namespace LinBox
#include "linbox/vector/vector-domain-gf2.h"
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
// Local Variables:
// mode: C++
// tab-width: 8
// indent-tabs-mode: nil
// c-basic-offset: 8
// End:
-
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/vector/vector-domain.inl b/linbox/vector/vector-domain.inl
index b1fad43..1c93dea 100644
--- a/linbox/vector/vector-domain.inl
+++ b/linbox/vector/vector-domain.inl
@@ -23,20 +23,20 @@
* dot product, tag1 and tag2) that allows specialization by vector type.
* ------------------------------------
*
- *
+ *
* ========LICENCE========
* This file is part of the library LinBox.
- *
+ *
* LinBox is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
- *
+ *
* This library 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
* Lesser General Public License for more details.
- *
+ *
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
@@ -48,11 +48,10 @@
#define __LINBOX_field_vector_domain_INL
-#include <iostream>
-#include <cctype>
namespace LinBox
{ /* VectorDomain */
+
template <class Field>
template <class Vector>
std::ostream &VectorDomain<Field>::writeSpecialized (std::ostream &os, const Vector &x,
@@ -63,7 +62,7 @@ namespace LinBox
os << '[';
for (i = x.begin (); i != x.end ();) {
- VectorDomainBase<Field>::_field.write (os, *i);
+ this->field().write (os, *i);
if (++i != x.end ())
os << ", ";
@@ -85,10 +84,10 @@ namespace LinBox
os << '[';
for (i = x.begin (), idx = 0; i != x.end ();) {
- while (idx++ < i->first)
+ while (++idx < i->first)
os << "0, ";
- VectorDomainBase<Field>::_field.write (os, i->second);
+ field().write (os, i->second);
if (++i != x.end ())
os << ", ";
@@ -110,10 +109,10 @@ namespace LinBox
os << '[';
for (i = x.begin (), idx = 0; i != x.end ();) {
- while (idx++ < i->first)
+ while (++idx < i->first)
os << "0, ";
- VectorDomainBase<Field>::_field.write (os, i->second);
+ field().write (os, i->second);
if (++i != x.end ())
os << ", ";
@@ -136,10 +135,10 @@ namespace LinBox
os << '[';
for (i = x.first.begin (), j = x.second.begin (), idx = 0; i != x.first.end ();) {
- while (idx++ < *i)
+ while (++idx < *i)
os << "0, ";
- VectorDomainBase<Field>::_field.write (os, *j);
+ field().write (os, *j);
if (++i != x.first.end ())
os << ", ";
@@ -169,9 +168,7 @@ namespace LinBox
while (i != x.end() && is) {
do is >> c; while (!isdigit(c) && c != '-');
is.unget ();
- VectorDomainBase<Field>::_field.read (is, *i++);
- //std::cerr << std::endl << "just read this: ";
- //VectorDomainBase<Field>::_field.write(cerr, *(i-1)) << " at index " << (i-x.begin());
+ field().read (is, *++i);
}
if (seekrightbracket) do is >> c; while (is && c != ']');
@@ -197,11 +194,11 @@ namespace LinBox
while (is && c == ',') {
do is >> c; while (is && isspace (c));
is.unget ();
- VectorDomainBase<Field>::_field.read (is, tmp);
- if (!VectorDomainBase<Field>::_field.isZero (tmp))
+ field().read (is, tmp);
+ if (!field().isZero (tmp))
x.push_back (std::pair <size_t, typename Field::Element> (idx, tmp));
is >> c;
- idx++;
+ ++idx;
}
return is;
@@ -226,11 +223,11 @@ namespace LinBox
while (is && c == ',') {
do is >> c; while (is && isspace (c));
is.unget ();
- VectorDomainBase<Field>::_field.read (is, tmp);
- if (!VectorDomainBase<Field>::_field.isZero (tmp))
+ field().read (is, tmp);
+ if (!field().isZero (tmp))
x[idx] = tmp;
is >> c;
- idx++;
+ ++idx;
}
return is;
@@ -255,15 +252,15 @@ namespace LinBox
while (is && c == ',') {
do is >> c; while (is && isspace (c));
is.unget ();
- VectorDomainBase<Field>::_field.read (is, tmp);
+ field().read (is, tmp);
- if (!VectorDomainBase<Field>::_field.isZero (tmp)) {
+ if (!field().isZero (tmp)) {
x.first.push_back (idx);
x.second.push_back (tmp);
}
is >> c;
- idx++;
+ ++idx;
}
return is;
@@ -280,8 +277,8 @@ namespace LinBox
if (v1.size () != v2.size ()) return false;
- for (i = v1.begin (), j = v2.begin (); i != v1.end (); i++, j++)
- if (!VectorDomainBase<Field>::_field.areEqual (*i, *j))
+ for (i = v1.begin (), j = v2.begin (); i != v1.end (); ++i, ++j)
+ if (!field().areEqual (*i, *j))
return false;
return true;
@@ -297,13 +294,13 @@ namespace LinBox
typename Vector2::const_iterator j;
size_t idx;
- for (i = v1.begin (), j = v2.begin (), idx = 0; i != v1.end () && j != v2.end (); j++, idx++) {
+ for (i = v1.begin (), j = v2.begin (), idx = 0; i != v1.end () && j != v2.end (); ++j, ++idx) {
if (i->first == idx) {
- if (!VectorDomainBase<Field>::_field.areEqual (i->second, *j))
+ if (!field().areEqual (i->second, *j))
return false;
- i++;
+ ++i;
}
- else if (!VectorDomainBase<Field>::_field.isZero (*j))
+ else if (!field().isZero (*j))
return false;
}
@@ -320,13 +317,13 @@ namespace LinBox
typename Vector2::const_iterator j;
size_t idx;
- for (i = v1.begin (), j = v2.begin (), idx = 0; i != v1.end () && j != v2.end (); j++, idx++) {
+ for (i = v1.begin (), j = v2.begin (), idx = 0; i != v1.end () && j != v2.end (); ++j, ++idx) {
if (i->first == idx) {
- if (!VectorDomainBase<Field>::_field.areEqual (i->second, *j))
+ if (!field().areEqual (i->second, *j))
return false;
- i++;
+ ++i;
}
- else if (!VectorDomainBase<Field>::_field.isZero (*j))
+ else if (!field().isZero (*j))
return false;
}
@@ -346,16 +343,16 @@ namespace LinBox
for (i_idx = v1.first.begin (), i_elt = v1.second.begin (), j = v2.begin (), idx = 0;
i_idx != v1.first.end () && j != v2.end ();
- j++, idx++)
+ ++j, ++idx)
{
if (*i_idx == idx) {
- if (!VectorDomainBase<Field>::_field.areEqual (*i_elt, *j))
+ if (!field().areEqual (*i_elt, *j))
return false;
++i_idx;
++i_elt;
}
- else if (!VectorDomainBase<Field>::_field.isZero (*j))
+ else if (!field().isZero (*j))
return false;
}
@@ -373,22 +370,22 @@ namespace LinBox
for (i = v1.begin (), j = v2.begin (); i != v1.end () || j != v2.end ();) {
while (i != v1.end () && (j == v2.end () || i->first < j->first)) {
- if (!VectorDomainBase<Field>::_field.isZero (i->second))
+ if (!field().isZero (i->second))
return false;
- i++;
+ ++i;
}
while (j != v2.end () && (i == v1.end () || j->first < i->first)) {
- if (!VectorDomainBase<Field>::_field.isZero (j->second))
+ if (!field().isZero (j->second))
return false;
- j++;
+ ++j;
}
if (i != v1.end () && j != v2.end () && i->first == j->first) {
- if (!VectorDomainBase<Field>::_field.areEqual (i->second, j->second))
+ if (!field().areEqual (i->second, j->second))
return false;
- i++; j++;
+ ++i; ++j;
}
}
@@ -406,22 +403,22 @@ namespace LinBox
for (i = v1.begin (), j = v2.begin (); i != v1.end () || j != v2.end ();) {
while (i != v1.end () && (j == v2.end () || i->first < j->first)) {
- if (!VectorDomainBase<Field>::_field.isZero (i->second))
+ if (!field().isZero (i->second))
return false;
- i++;
+ ++i;
}
while (j != v2.end () && (i == v1.end () || j->first < i->first)) {
- if (!VectorDomainBase<Field>::_field.isZero (j->second))
+ if (!field().isZero (j->second))
return false;
- j++;
+ ++j;
}
if (i != v1.end () && j != v2.end () && i->first == j->first) {
- if (!VectorDomainBase<Field>::_field.areEqual (i->second, j->second))
+ if (!field().areEqual (i->second, j->second))
return false;
- i++; j++;
+ ++i; ++j;
}
}
@@ -442,23 +439,23 @@ namespace LinBox
i_idx != v1.first.end () || j != v2.end ();)
{
while (i_idx != v1.first.end () && (j == v2.end () || *i_idx < j->first)) {
- if (!VectorDomainBase<Field>::_field.isZero (*i_elt))
+ if (!field().isZero (*i_elt))
return false;
- i_idx++;
- i_elt++;
+ ++i_idx;
+ ++i_elt;
}
while (j != v2.end () && (i_idx == v1.first.end () || j->first < *i_idx)) {
- if (!VectorDomainBase<Field>::_field.isZero (j->second))
+ if (!field().isZero (j->second))
return false;
- j++;
+ ++j;
}
if (i_idx != v1.first.end () && j != v2.end () && *i_idx == j->first) {
- if (!VectorDomainBase<Field>::_field.areEqual (*i_elt, j->second))
+ if (!field().areEqual (*i_elt, j->second))
return false;
- i_idx++; i_elt++; j++;
+ ++i_idx; ++i_elt; ++j;
}
}
@@ -476,22 +473,22 @@ namespace LinBox
for (i = v1.begin (), j = v2.begin (); i != v1.end () || j != v2.end ();) {
while (i != v1.end () && (j == v2.end () || i->first < j->first)) {
- if (!VectorDomainBase<Field>::_field.isZero (i->second))
+ if (!field().isZero (i->second))
return false;
- i++;
+ ++i;
}
while (j != v2.end () && (i == v1.end () || j->first < i->first)) {
- if (!VectorDomainBase<Field>::_field.isZero (j->second))
+ if (!field().isZero (j->second))
return false;
- j++;
+ ++j;
}
if (i != v1.end () && j != v2.end () && i->first == j->first) {
- if (!VectorDomainBase<Field>::_field.areEqual (i->second, j->second))
+ if (!field().areEqual (i->second, j->second))
return false;
- i++; j++;
+ ++i; ++j;
}
}
@@ -510,23 +507,23 @@ namespace LinBox
while (i_idx != v1.first.end () || j != v2.end ()) {
while (i_idx != v1.first.end () && (j == v2.end () || *i_idx < j->first)) {
- if (!VectorDomainBase<Field>::_field.isZero (*i_elt))
+ if (!field().isZero (*i_elt))
return false;
- i_idx++;
- i_elt++;
+ ++i_idx;
+ ++i_elt;
}
while (j != v2.end () && (i_idx == v1.first.end () || j->first < *i_idx)) {
- if (!VectorDomainBase<Field>::_field.isZero (j->second))
+ if (!field().isZero (j->second))
return false;
- j++;
+ ++j;
}
if (i_idx != v1.first.end () && j != v2.end () && *i_idx == j->first) {
- if (!VectorDomainBase<Field>::_field.areEqual (*i_elt, j->second))
+ if (!field().areEqual (*i_elt, j->second))
return false;
- i_idx++; i_elt++; j++;
+ ++i_idx; ++i_elt; ++j;
}
}
@@ -546,24 +543,24 @@ namespace LinBox
while (i_idx != v1.first.end () || j_idx != v2.first.end ()) {
while (i_idx != v1.first.end () && (j_idx == v2.first.end () || *i_idx < *j_idx)) {
- if (!VectorDomainBase<Field>::_field.isZero (*i_elt))
+ if (!field().isZero (*i_elt))
return false;
- i_idx++;
- i_elt++;
+ ++i_idx;
+ ++i_elt;
}
while (j_idx != v2.first.end () && (i_idx == v1.first.end () || *j_idx < *i_idx)) {
- if (!VectorDomainBase<Field>::_field.isZero (*j_elt))
+ if (!field().isZero (*j_elt))
return false;
- j_idx++;
- j_elt++;
+ ++j_idx;
+ ++j_elt;
}
if (i_idx != v1.first.end () && j_idx != v2.first.end () && *i_idx == *j_idx) {
- if (!VectorDomainBase<Field>::_field.areEqual (*i_elt, *j_elt))
+ if (!field().areEqual (*i_elt, *j_elt))
return false;
- i_idx++; i_elt++; j_idx++; j_elt++;
+ ++i_idx; ++i_elt; ++j_idx; ++j_elt;
}
}
@@ -576,8 +573,8 @@ namespace LinBox
{
typename Vector::const_iterator i;
- for (i = v.begin (); i != v.end (); i++)
- if (!VectorDomainBase<Field>::_field.isZero (*i))
+ for (i = v.begin (); i != v.end (); ++i)
+ if (!field().isZero (*i))
return false;
return true;
@@ -589,8 +586,8 @@ namespace LinBox
{
typename Vector::const_iterator i;
- for (i = v.begin (); i != v.end (); i++)
- if (!VectorDomainBase<Field>::_field.isZero (i->second))
+ for (i = v.begin (); i != v.end (); ++i)
+ if (!field().isZero (i->second))
return false;
return true;
@@ -602,8 +599,8 @@ namespace LinBox
{
typename Vector::const_iterator i;
- for (i = v.begin (); i != v.end (); i++)
- if (!VectorDomainBase<Field>::_field.isZero (i->second))
+ for (i = v.begin (); i != v.end (); ++i)
+ if (!field().isZero (i->second))
return false;
return true;
@@ -615,8 +612,8 @@ namespace LinBox
{
typename Vector::second_type::const_iterator i;
- for (i = v.second.begin (); i != v.second.end (); i++)
- if (!VectorDomainBase<Field>::_field.isZero (*i))
+ for (i = v.second.begin (); i != v.second.end (); ++i)
+ if (!field().isZero (*i))
return false;
return true;
@@ -633,8 +630,8 @@ namespace LinBox
res.clear ();
- for (i = v.begin (), idx = 0; i != v.end (); i++, idx++)
- if (!VectorDomainBase<Field>::_field.isZero (*i))
+ for (i = v.begin (), idx = 0; i != v.end (); ++i, ++idx)
+ if (!field().isZero (*i))
res.push_back (std::pair <size_t, typename Field::Element> (idx, *i));
return res;
@@ -651,8 +648,8 @@ namespace LinBox
res.clear ();
- for (i = v.begin (), idx = 0; i != v.end (); i++, idx++)
- if (!VectorDomainBase<Field>::_field.isZero (*i))
+ for (i = v.begin (), idx = 0; i != v.end (); ++i, ++idx)
+ if (!field().isZero (*i))
res[idx] = *i;
return res;
@@ -670,9 +667,9 @@ namespace LinBox
res.first.clear ();
res.second.clear ();
- for (i = v.begin (), idx = 0; i != v.end (); i++, idx++) {
- if (!VectorDomainBase<Field>::_field.isZero (*i)) {
- res.first.push_back (idx);
+ for (i = v.begin (), idx = 0; i != v.end (); ++i, ++idx) {
+ if (!field().isZero (*i)) {
+ res.first.push_back ((size_t)idx);
res.second.push_back (*i);
}
}
@@ -690,10 +687,10 @@ namespace LinBox
typename Vector2::const_iterator j;
size_t idx;
- for (i = res.begin (), j = v.begin (), idx = 0; j != v.end (); i++, j++, idx++) {
+ for (i = res.begin (), j = v.begin (), idx = 0; j != v.end (); ++i, ++j, ++idx) {
while (idx < j->first) {
- VectorDomainBase<Field>::_field.init (*i, 0);
- i++; idx++;
+ field().assign(*i, field().zero);
+ ++i; ++idx;
}
*i = j->second;
@@ -712,7 +709,7 @@ namespace LinBox
res.clear ();
- for (i = v.begin (); i != v.end (); i++)
+ for (i = v.begin (); i != v.end (); ++i)
res[i->first] = i->second;
return res;
@@ -729,7 +726,7 @@ namespace LinBox
res.first.clear ();
res.second.clear ();
- for (i = v.begin (); i != v.end (); i++) {
+ for (i = v.begin (); i != v.end (); ++i) {
res.first.push_back (i->first);
res.second.push_back (i->second);
}
@@ -747,10 +744,10 @@ namespace LinBox
typename Vector2::const_iterator j;
size_t idx;
- for (i = res.begin (), j = v.begin (), idx = 0; j != v.end (); i++, j++, idx++) {
+ for (i = res.begin (), j = v.begin (), idx = 0; j != v.end (); ++i, ++j, ++idx) {
while (idx < j->first) {
- VectorDomainBase<Field>::_field.init (*i, 0);
- i++; idx++;
+ field().assign(*i, field.zero);
+ ++i; ++idx;
}
*i = j->second;
@@ -769,7 +766,7 @@ namespace LinBox
res.clear ();
- for (i = v.begin (); i != v.end (); i++)
+ for (i = v.begin (); i != v.end (); ++i)
res.push_back (*i);
return res;
@@ -785,7 +782,7 @@ namespace LinBox
res.clear ();
- for (i = v.begin (); i != v.end (); i++)
+ for (i = v.begin (); i != v.end (); ++i)
res[i->first] = i->second;
return res;
@@ -802,7 +799,7 @@ namespace LinBox
res.first.clear ();
res.second.clear ();
- for (i = v.begin (); i != v.end (); i++) {
+ for (i = v.begin (); i != v.end (); ++i) {
res.first.push_back (i->first);
res.second.push_back (i->second);
}
@@ -816,6 +813,7 @@ namespace LinBox
VectorCategories::DenseVectorTag,
VectorCategories::SparseParallelVectorTag) const
{
+ //! @bug check sizes ??
typename Vector1::iterator i = res.begin ();
typename Vector2::first_type::const_iterator j_idx = v.first.begin ();
typename Vector2::second_type::const_iterator j_elt = v.second.begin ();
@@ -823,7 +821,7 @@ namespace LinBox
while (j_idx != v.first.end ()) {
while (idx < *j_idx) {
- VectorDomainBase<Field>::_field.init (*i, 0);
+ field().assign(*i, field().zero);
++i; ++idx;
}
@@ -863,7 +861,7 @@ namespace LinBox
res.clear ();
- for (; i_idx != v.first.end (); i_idx++, i_elt++)
+ for (; i_idx != v.first.end (); ++i_idx, ++i_elt)
res[*i_idx] = *i_elt;
return res;
@@ -895,7 +893,7 @@ namespace LinBox
copy (res_part, v);
- std::copy (res_part.begin (), (len == 0) ? res_part.end () : res_part.begin () + len, res.begin () + i);
+ std::copy (res_part.begin (), (len == 0) ? res_part.end () : res_part.begin () + (ptrdiff_t)len, res.begin () + (ptrdiff_t)i);
}
return res;
@@ -920,7 +918,7 @@ namespace LinBox
part_end = std::lower_bound (res_part.begin (), res_part.end (), len,
VectorWrapper::CompareSparseEntries<Element> ());
- for (iter = res_part.begin (); iter != part_end; iter++)
+ for (iter = res_part.begin (); iter != part_end; ++iter)
iter->first += i;
r_begin = std::lower_bound (res.begin (), res.end (), i, VectorWrapper::CompareSparseEntries<Element> ());
@@ -951,7 +949,7 @@ namespace LinBox
r_end = (len == 0) ? res.end () : res.find (i + len);
res.erase (r_begin, r_end);
- for (iter = res_part.begin (); iter != part_end; iter++)
+ for (iter = res_part.begin (); iter != part_end; ++iter)
res[iter->first + i] = iter->second;
return res;
@@ -977,16 +975,16 @@ namespace LinBox
}
else {
part_idx_end = std::lower_bound (res_part.first.begin (), res_part.first.end (), len);
- part_elt_end = res_part.second.begin () + (part_idx_end - res_part.first.begin ());
+ part_elt_end = res_part.second.begin () +(ptrdiff_t) (part_idx_end - res_part.first.begin ());
}
- for (iter = res_part.first.begin (); iter != part_idx_end; iter++)
+ for (iter = res_part.first.begin (); iter != part_idx_end; ++iter)
*iter += i;
r_idx_begin = std::lower_bound (res.first.begin (), res.first.end (), i);
- r_elt_begin = res.second.begin () + (r_idx_begin - res.first.begin ());
+ r_elt_begin = res.second.begin () +(ptrdiff_t) (r_idx_begin - res.first.begin ());
r_idx_end = (len == 0) ? res.first.end () : std::lower_bound (r_idx_begin, res.first.end (), i + len);
- r_idx_end = res.second.begin () + (r_idx_end - res.first.begin ());
+ r_idx_end = res.second.begin () +(ptrdiff_t) (r_idx_end - res.first.begin ());
r_idx_begin = res.first.erase (r_idx_begin, r_idx_end);
r_elt_begin = res.second.erase (r_elt_begin, r_elt_end);
@@ -1001,7 +999,7 @@ namespace LinBox
Vector &VectorDomain<Field>::copySpecialized (Vector &res, const Vector &v, size_t i, size_t len,
VectorCategories::DenseVectorTag) const
{
- std::copy (v.begin (), (len == 0) ? v.end () : v.begin () + len, res.begin () + i);
+ std::copy (v.begin (), (len == 0) ? v.end () : v.begin () + (ptrdiff_t)len, res.begin () +(ptrdiff_t) i);
return res;
}
@@ -1026,10 +1024,10 @@ namespace LinBox
r_begin = res.erase (r_begin, r_end);
offset = r_begin - res.begin ();
res.insert (r_begin, v.begin (), v_end);
- r_begin = res.begin () + offset;
- r_end = r_begin + (v_end - v.begin ());
+ r_begin = res.begin () +(ptrdiff_t) offset;
+ r_end = r_begin +(ptrdiff_t) (v_end - v.begin ());
- for (iter = r_begin; iter != r_end; iter++)
+ for (iter = r_begin; iter != r_end; ++iter)
iter->first += i;
return res;
@@ -1049,7 +1047,7 @@ namespace LinBox
r_end = (len == 0) ? res.end () : res.find (i + len);
res.erase (r_begin, r_end);
- for (iter = v.begin (); iter != v_end; iter++)
+ for (iter = v.begin (); iter != v_end; ++iter)
res[iter->first + i] = iter->second;
return res;
@@ -1072,13 +1070,13 @@ namespace LinBox
}
else {
v_idx_end = std::lower_bound (v.first.begin (), v.first.end (), len);
- v_elt_end = v.second.begin () + (v_idx_end - v.first.begin ());
+ v_elt_end = v.second.begin () +(ptrdiff_t) (v_idx_end - v.first.begin ());
}
r_idx_begin = std::lower_bound (res.first.begin (), res.first.end (), i);
- r_elt_begin = res.second.begin () + (r_idx_begin - res.first.begin ());
+ r_elt_begin = res.second.begin () +(ptrdiff_t) (r_idx_begin - res.first.begin ());
r_idx_end = (len == 0) ? res.first.end () : std::lower_bound (r_idx_begin, res.first.end (), i + len);
- r_elt_end = res.second.begin () + (r_idx_end - res.first.begin ());
+ r_elt_end = res.second.begin () +(ptrdiff_t) (r_idx_end - res.first.begin ());
r_idx_begin = res.first.erase (r_idx_begin, r_idx_end);
r_elt_begin = res.second.erase (r_elt_begin, r_elt_end);
@@ -1087,10 +1085,10 @@ namespace LinBox
res.first.insert (r_idx_begin, v.first.begin (), v_idx_end);
res.second.insert (r_elt_begin, v.second.begin (), v_elt_end);
- r_idx_begin = res.first.begin () + offset;
- r_idx_end = r_idx_begin + (v_idx_end - v.first.begin ());
+ r_idx_begin = res.first.begin () +(ptrdiff_t) offset;
+ r_idx_end = r_idx_begin +(ptrdiff_t) (v_idx_end - v.first.begin ());
- for (iter = r_idx_begin; iter != r_idx_end; iter++)
+ for (iter = r_idx_begin; iter != r_idx_end; ++iter)
*iter += i;
return res;
@@ -1110,8 +1108,8 @@ namespace LinBox
linbox_check (y.size () == x.size ());
linbox_check (res.size () == x.size ());
- for (i = y.begin (), j = x.begin (), k = res.begin (); i != y.end (); i++, j++, k++)
- VectorDomainBase<Field>::_field.add (*k, *i, *j);
+ for (i = y.begin (), j = x.begin (), k = res.begin (); i != y.end (); ++i, ++j, ++k)
+ field().add (*k, *i, *j);
return res;
}
@@ -1129,17 +1127,17 @@ namespace LinBox
res.clear ();
- for (j = x.begin (), i = y.begin (); j != x.end (); j++) {
+ for (j = x.begin (), i = y.begin (); j != x.end (); ++j) {
while (i != y.end () && i->first < j->first) {
res.push_back (*i);
- i++;
+ ++i;
}
if (i != y.end () && i->first == j->first) {
- VectorDomainBase<Field>::_field.add (tmp, i->second, j->second);
- if (!VectorDomainBase<Field>::_field.isZero (tmp))
+ field().add (tmp, i->second, j->second);
+ if (!field().isZero (tmp))
res.push_back (std::pair <size_t, Element> (j->first, tmp));
- i++;
+ ++i;
}
else {
res.push_back (*j);
@@ -1148,7 +1146,7 @@ namespace LinBox
while (i != y.end ()) {
res.push_back (*i);
- i++;
+ ++i;
}
return res;
@@ -1167,15 +1165,15 @@ namespace LinBox
res.clear ();
- for (j = x.begin (), i = y.begin (); j != x.end (); j++) {
+ for (j = x.begin (), i = y.begin (); j != x.end (); ++j) {
while (i != y.end () && i->first < j->first) {
res[i->first] = i->second;
- i++;
+ ++i;
}
if (i != y.end () && i->first == j->first) {
- res[j->first] = VectorDomainBase<Field>::_field.add (tmp, i->second, j->second);
- i++;
+ res[j->first] = field().add (tmp, i->second, j->second);
+ ++i;
}
else {
res[j->first] = j->second;
@@ -1184,7 +1182,7 @@ namespace LinBox
while (i != y.end ()) {
res[i->first] = i->second;
- i++;
+ ++i;
}
return res;
@@ -1214,8 +1212,8 @@ namespace LinBox
}
if (i_idx != y.first.end () && *i_idx == *j_idx) {
- VectorDomainBase<Field>::_field.add (tmp, *i_elt, *j_elt);
- if (!VectorDomainBase<Field>::_field.isZero (tmp)) {
+ field().add (tmp, *i_elt, *j_elt);
+ if (!field().isZero (tmp)) {
res.first.push_back (*j_idx);
res.second.push_back (tmp);
}
@@ -1247,8 +1245,8 @@ namespace LinBox
linbox_check (y.size () == x.size ());
- for (i = y.begin (), j = x.begin (); i != y.end (); i++, j++)
- VectorDomainBase<Field>::_field.addin (*i, *j);
+ for (i = y.begin (), j = x.begin (); i != y.end (); ++i, ++j)
+ field().addin (*i, *j);
return y;
}
@@ -1275,11 +1273,11 @@ namespace LinBox
typename Vector1::iterator i;
typename Vector2::const_iterator j;
- for (i = y.begin (), j = x.begin (); j != x.end (); j++) {
- while (i != y.end () && i->first < j->first) i++;
+ for (i = y.begin (), j = x.begin (); j != x.end (); ++j) {
+ while (i != y.end () && i->first < j->first) ++i;
if (i != y.end () && i->first == j->first)
- VectorDomainBase<Field>::_field.addin (i->second, j->second);
+ field().addin (i->second, j->second);
else
y[j->first] = j->second;
}
@@ -1314,8 +1312,8 @@ namespace LinBox
linbox_check (y.size () == x.size ());
linbox_check (res.size () == x.size ());
- for (i = y.begin (), j = x.begin (), k = res.begin (); i != y.end (); i++, j++, k++)
- VectorDomainBase<Field>::_field.sub (*k, *i, *j);
+ for (i = y.begin (), j = x.begin (), k = res.begin (); i != y.end (); ++i, ++j, ++k)
+ field().sub (*k, *i, *j);
return res;
}
@@ -1333,26 +1331,26 @@ namespace LinBox
res.clear ();
- for (j = x.begin (), i = y.begin (); j != x.end (); j++) {
+ for (j = x.begin (), i = y.begin (); j != x.end (); ++j) {
while (i != y.end () && i->first < j->first) {
res.push_back (*i);
- i++;
+ ++i;
}
if (i != y.end () && i->first == j->first) {
- VectorDomainBase<Field>::_field.sub (tmp, i->second, j->second);
- if (!VectorDomainBase<Field>::_field.isZero (tmp))
+ field().sub (tmp, i->second, j->second);
+ if (!field().isZero (tmp))
res.push_back (std::pair <size_t, Element> (j->first, tmp));
- i++;
+ ++i;
}
else {
- res.push_back (std::pair <size_t, Element> (j->first, VectorDomainBase<Field>::_field.neg (tmp, j->second)));
+ res.push_back (std::pair <size_t, Element> (j->first, field().neg (tmp, j->second)));
}
}
while (i != y.end ()) {
res.push_back (*i);
- i++;
+ ++i;
}
return res;
@@ -1371,24 +1369,24 @@ namespace LinBox
res.clear ();
- for (j = x.begin (), i = y.begin (); j != x.end (); j++) {
+ for (j = x.begin (), i = y.begin (); j != x.end (); ++j) {
while (i != y.end () && i->first < j->first) {
res[i->first] = i->second;
- i++;
+ ++i;
}
if (i != y.end () && i->first == j->first) {
- res[j->first] = VectorDomainBase<Field>::_field.sub (tmp, i->second, j->second);
- i++;
+ res[j->first] = field().sub (tmp, i->second, j->second);
+ ++i;
}
else {
- res[j->first] = VectorDomainBase<Field>::_field.neg (tmp, j->second);
+ res[j->first] = field().neg (tmp, j->second);
}
}
while (i != y.end ()) {
res[i->first] = i->second;
- i++;
+ ++i;
}
return res;
@@ -1418,8 +1416,8 @@ namespace LinBox
}
if (i_idx != y.first.end () && *i_idx == *j_idx) {
- VectorDomainBase<Field>::_field.sub (tmp, *i_elt, *j_elt);
- if (!VectorDomainBase<Field>::_field.isZero (tmp)) {
+ field().sub (tmp, *i_elt, *j_elt);
+ if (!field().isZero (tmp)) {
res.first.push_back (*j_idx);
res.second.push_back (tmp);
}
@@ -1427,7 +1425,7 @@ namespace LinBox
}
else {
res.first.push_back (*j_idx);
- res.second.push_back (VectorDomainBase<Field>::_field.neg (tmp, *j_elt));
+ res.second.push_back (field().neg (tmp, *j_elt));
}
}
@@ -1451,8 +1449,8 @@ namespace LinBox
linbox_check (y.size () == x.size ());
- for (i = y.begin (), j = x.begin (); i != y.end (); i++, j++)
- VectorDomainBase<Field>::_field.subin (*i, *j);
+ for (i = y.begin (), j = x.begin (); i != y.end (); ++i, ++j)
+ field().subin (*i, *j);
return y;
}
@@ -1480,13 +1478,13 @@ namespace LinBox
typename Vector2::const_iterator j;
Element tmp;
- for (i = y.begin (), j = x.begin (); j != x.end (); j++) {
- while (i != y.end () && i->first < j->first) i++;
+ for (i = y.begin (), j = x.begin (); j != x.end (); ++j) {
+ while (i != y.end () && i->first < j->first) ++i;
if (i != y.end () && i->first == j->first)
- VectorDomainBase<Field>::_field.subin (i->second, j->second);
+ field().subin (i->second, j->second);
else
- y[j->first] = VectorDomainBase<Field>::_field.neg (tmp, j->second);
+ y[j->first] = field().neg (tmp, j->second);
}
return y;
@@ -1517,7 +1515,7 @@ namespace LinBox
linbox_check (res.size () == x.size ());
for (j = x.begin (), k = res.begin (); j != x.end (); ++j, ++k)
- VectorDomainBase<Field>::_field.neg (*k, *j);
+ field().neg (*k, *j);
return res;
}
@@ -1534,7 +1532,7 @@ namespace LinBox
res.clear ();
for (j = x.begin (); j != x.end (); ++j)
- res.push_back (std::pair <size_t, Element> (j->first, VectorDomainBase<Field>::_field.neg (tmp, j->second)));
+ res.push_back (std::pair <size_t, Element> (j->first, field().neg (tmp, j->second)));
return res;
}
@@ -1551,7 +1549,7 @@ namespace LinBox
res.clear ();
for (j = x.begin (); j != x.end (); ++j)
- res[j->first] = VectorDomainBase<Field>::_field.neg (tmp, j->second);
+ res[j->first] = field().neg (tmp, j->second);
return res;
}
@@ -1571,7 +1569,7 @@ namespace LinBox
std::copy (x.first.begin (), x.first.end (), res.first.begin ());
for (j = x.second.begin (); j != x.second.end (); ++j)
- res.second.push_back (VectorDomainBase<Field>::_field.neg (tmp, *j));
+ res.second.push_back (field().neg (tmp, *j));
return res;
}
@@ -1584,7 +1582,7 @@ namespace LinBox
typename Vector::iterator i;
for (i = y.begin (); i != y.end (); ++i)
- VectorDomainBase<Field>::_field.negin (*i);
+ field().negin (*i);
return y;
}
@@ -1597,7 +1595,7 @@ namespace LinBox
typename Vector::iterator i;
for (i = y.begin (); i != y.end (); ++i)
- VectorDomainBase<Field>::_field.negin (i->second);
+ field().negin (i->second);
return y;
}
@@ -1610,7 +1608,7 @@ namespace LinBox
typename Vector::iterator i;
for (i = y.begin (); i != y.end (); ++i)
- VectorDomainBase<Field>::_field.negin (i->second);
+ field().negin (i->second);
return y;
}
@@ -1623,7 +1621,7 @@ namespace LinBox
typename Vector::second_type::iterator i;
for (i = y.second.begin (); i != y.second.end (); ++i)
- VectorDomainBase<Field>::_field.negin (*i);
+ field().negin (*i);
return y;
}
@@ -1642,7 +1640,7 @@ namespace LinBox
linbox_check (res.size () == x.size ());
for (i = x.begin (), j = res.begin (); i != x.end (); ++i, ++j)
- VectorDomainBase<Field>::_field.mul (*j, *i, a);
+ field().mul (*j, *i, a);
return res;
}
@@ -1660,11 +1658,11 @@ namespace LinBox
res.clear ();
- if (VectorDomainBase<Field>::_field.isZero (a))
+ if (field().isZero (a))
return res;
- for (i = x.begin (); i != x.end (); i++)
- res.push_back (std::pair <size_t, Element> (i->first, VectorDomainBase<Field>::_field.mul (tmp, i->second, a)));
+ for (i = x.begin (); i != x.end (); ++i)
+ res.push_back (std::pair <size_t, Element> (i->first, field().mul (tmp, i->second, a)));
return res;
}
@@ -1682,11 +1680,11 @@ namespace LinBox
res.clear ();
- if (VectorDomainBase<Field>::_field.isZero (a))
+ if (field().isZero (a))
return res;
- for (i = x.begin (); i != x.end (); i++)
- res[i->first] = VectorDomainBase<Field>::_field.mul (tmp, i->second, a);
+ for (i = x.begin (); i != x.end (); ++i)
+ res[i->first] = field().mul (tmp, i->second, a);
return res;
}
@@ -1706,14 +1704,14 @@ namespace LinBox
res.first.clear ();
res.second.clear ();
- if (VectorDomainBase<Field>::_field.isZero (a))
+ if (field().isZero (a))
return res;
for (i_idx = x.first.begin (); i_idx != x.first.end (); ++i_idx)
res.first.push_back (*i_idx);
for (i_elt = x.second.begin (); i_elt != x.second.end (); ++i_elt)
- res.second.push_back (VectorDomainBase<Field>::_field.mul (tmp, *i_elt, a));
+ res.second.push_back (field().mul (tmp, *i_elt, a));
return res;
}
@@ -1727,8 +1725,8 @@ namespace LinBox
{
typename Vector::iterator i;
- for (i = x.begin (); i != x.end (); i++)
- VectorDomainBase<Field>::_field.mulin (*i, a);
+ for (i = x.begin (); i != x.end (); ++i)
+ field().mulin (*i, a);
return x;
}
@@ -1742,13 +1740,13 @@ namespace LinBox
{
typename Vector::iterator i;
- if (VectorDomainBase<Field>::_field.isZero (a)) {
+ if (field().isZero (a)) {
x.clear ();
return x;
}
- for (i = x.begin (); i != x.end (); i++)
- VectorDomainBase<Field>::_field.mulin (i->second, a);
+ for (i = x.begin (); i != x.end (); ++i)
+ field().mulin (i->second, a);
return x;
}
@@ -1762,13 +1760,13 @@ namespace LinBox
{
typename Vector::iterator i;
- if (VectorDomainBase<Field>::_field.isZero (a)) {
+ if (field().isZero (a)) {
x.clear ();
return x;
}
- for (i = x.begin (); i != x.end (); i++)
- VectorDomainBase<Field>::_field.mulin (i->second, a);
+ for (i = x.begin (); i != x.end (); ++i)
+ field().mulin (i->second, a);
return x;
}
@@ -1782,14 +1780,14 @@ namespace LinBox
{
typename Vector::second_type::iterator i;
- if (VectorDomainBase<Field>::_field.isZero (a)) {
+ if (field().isZero (a)) {
x.first.clear ();
x.second.clear ();
return x;
}
- for (i = x.second.begin (); i != x.second.end (); i++)
- VectorDomainBase<Field>::_field.mulin (*i, a);
+ for (i = x.second.begin (); i != x.second.end (); ++i)
+ field().mulin (*i, a);
return x;
}
@@ -1810,8 +1808,8 @@ namespace LinBox
linbox_check (y.size () == x.size ());
linbox_check (res.size () == x.size ());
- for (i = y.begin (), j = x.begin (), k = res.begin (); i != y.end (); i++, j++, k++)
- VectorDomainBase<Field>::_field.axpy (*k, a, *j, *i);
+ for (i = y.begin (), j = x.begin (), k = res.begin (); i != y.end (); ++i, ++j, ++k)
+ field().axpy (*k, a, *j, *i);
return res;
}
@@ -1831,26 +1829,26 @@ namespace LinBox
res.clear ();
- for (j = x.begin (), i = y.begin (); j != x.end (); j++) {
+ for (j = x.begin (), i = y.begin (); j != x.end (); ++j) {
while (i != y.end () && i->first < j->first) {
res.push_back (*i);
- i++;
+ ++i;
}
if (i != y.end () && i->first == j->first) {
- VectorDomainBase<Field>::_field.axpy (tmp, a, j->second, i->second);
- i++;
+ field().axpy (tmp, a, j->second, i->second);
+ ++i;
}
else
- VectorDomainBase<Field>::_field.mul (tmp, a, j->second);
+ field().mul (tmp, a, j->second);
- if (!VectorDomainBase<Field>::_field.isZero (tmp))
+ if (!field().isZero (tmp))
res.push_back (std::pair <size_t, Element> (j->first, tmp));
}
while (i != y.end ()) {
res.push_back (*i);
- i++;
+ ++i;
}
return res;
@@ -1870,23 +1868,23 @@ namespace LinBox
res.clear ();
- for (j = x.begin (), i = y.begin (); j != x.end (); j++) {
+ for (j = x.begin (), i = y.begin (); j != x.end (); ++j) {
while (i != y.end () && i->first < j->first) {
res[i->first] = i->second;
- i++;
+ ++i;
}
if (i != y.end () && i->first == j->first) {
- VectorDomainBase<Field>::_field.axpy (res[j->first], a, j->second, i->second);
- i++;
+ field().axpy (res[j->first], a, j->second, i->second);
+ ++i;
}
else
- VectorDomainBase<Field>::_field.mul (res[j->first], a, j->second);
+ field().mul (res[j->first], a, j->second);
}
while (i != y.end ()) {
res[i->first] = i->second;
- i++;
+ ++i;
}
return res;
@@ -1918,8 +1916,8 @@ namespace LinBox
}
if (i_idx != y.first.end () && *i_idx == *j_idx) {
- VectorDomainBase<Field>::_field.axpy (tmp, a, *j_elt, *i_elt);
- if (!VectorDomainBase<Field>::_field.isZero (tmp)) {
+ field().axpy (tmp, a, *j_elt, *i_elt);
+ if (!field().isZero (tmp)) {
res.first.push_back (*j_idx);
res.second.push_back (tmp);
}
@@ -1927,7 +1925,7 @@ namespace LinBox
}
else {
res.first.push_back (*j_idx);
- res.second.push_back (VectorDomainBase<Field>::_field.mul (tmp, *j_elt, a));
+ res.second.push_back (field().mul (tmp, *j_elt, a));
}
}
@@ -1955,7 +1953,7 @@ namespace LinBox
linbox_check (y.size () == x.size ());
for (i = y.begin (), j = x.begin (); i != y.end (); ++i, ++j)
- VectorDomainBase<Field>::_field.axpyin (*i, a, *j);
+ field().axpyin (*i, a, *j);
return y;
}
@@ -1972,7 +1970,7 @@ namespace LinBox
typename Vector2::const_iterator j;
for (j = x.begin (); j != x.end (); ++j)
- VectorDomainBase<Field>::_field.axpyin (y[j->first], a, j->second);
+ field().axpyin (y[j->first], a, j->second);
return y;
}
@@ -1989,7 +1987,7 @@ namespace LinBox
typename Vector2::const_iterator j;
for (j = x.begin (); j != x.end (); ++j)
- VectorDomainBase<Field>::_field.axpyin (y[j->first], a, j->second);
+ field().axpyin (y[j->first], a, j->second);
return y;
}
@@ -2007,7 +2005,7 @@ namespace LinBox
typename Vector2::second_type::const_iterator j_elt = x.second.begin ();
for (; j_idx != x.first.end (); ++j_idx, ++j_elt)
- VectorDomainBase<Field>::_field.axpyin (y[*j_idx], a, *j_elt);
+ field().axpyin (y[*j_idx], a, *j_elt);
return y;
}
@@ -2041,18 +2039,18 @@ namespace LinBox
typename Vector2::const_iterator j;
Element tmp;
- if (VectorDomainBase<Field>::_field.isZero (a)) {
+ if (field().isZero (a)) {
y.clear ();
return y;
}
- for (i = y.begin (), j = x.begin (); j != x.end (); j++) {
- while (i != y.end () && i->first != j->first) i++;
+ for (i = y.begin (), j = x.begin (); j != x.end (); ++j) {
+ while (i != y.end () && i->first != j->first) ++i;
if (i != y.end () && i->first == j->first)
- VectorDomainBase<Field>::_field.axpyin (i->second, a, j->second);
- else if (!VectorDomainBase<Field>::_field.isZero (j->second))
- y[j->first] = VectorDomainBase<Field>::_field.mul (tmp, a, j->second);
+ field().axpyin (i->second, a, j->second);
+ else if (!field().isZero (j->second))
+ y[j->first] = field().mul (tmp, a, j->second);
}
return y;
@@ -2076,21 +2074,22 @@ namespace LinBox
template <class Field>
template <class Vector1, class Vector2>
- inline typename Field::Element &DotProductDomain<Field>::dotSpecializedDD
- (Element &res,
+ inline typename Field::Element &DotProductDomain<Field>:: dotSpecializedDD
+ (typename Field::Element &res,
const Vector1 &v1,
const Vector2 &v2) const
{
typename Vector1::const_iterator i;
typename Vector2::const_iterator j;
- VectorDomainBase<Field>::accu.reset();
+ FieldAXPY<Field> accu(this->field());
+ //VectorDomainBase<Field>::accu.reset();
linbox_check (v1.size () == v2.size ());
- for (i = v1.begin (), j = v2.begin (); i != v1.end (); i++, j++)
- VectorDomainBase<Field>::accu.mulacc (*i, *j);
+ for (i = v1.begin (), j = v2.begin (); i != v1.end (); ++i, ++j)
+ /*VectorDomainBase<Field>::*/accu.mulacc (*i, *j);
- return VectorDomainBase<Field>::accu.get (res);
+ return /*VectorDomainBase<Field>::*/accu.get (res);
}
template <class Field>
@@ -2104,12 +2103,13 @@ namespace LinBox
{
typename Vector1::const_iterator i;
- VectorDomainBase<Field>::accu.reset();
+ FieldAXPY<Field> accu(field());
+ //VectorDomainBase<Field>::accu.reset();
- for (i = v1.begin (); i != v1.end (); i++)
- VectorDomainBase<Field>::accu.mulacc (i->second, v2[i->first]);
+ for (i = v1.begin (); i != v1.end (); ++i)
+ /*VectorDomainBase<Field>::*/accu.mulacc (i->second, v2[i->first]);
- return VectorDomainBase<Field>::accu.get (res);
+ return /*VectorDomainBase<Field>::*/accu.get (res);
}
template <class Field>
@@ -2122,12 +2122,13 @@ namespace LinBox
VectorCategories::DenseVectorTag ) const
{
typename Vector1::const_iterator i;
- VectorDomainBase<Field>::accu.reset();
+ FieldAXPY<Field> accu(field());
+ //VectorDomainBase<Field>::accu.reset();
- for (i = v1.begin (); i != v1.end (); i++)
- VectorDomainBase<Field>::accu.mulacc (i->second, v2[i->first]);
+ for (i = v1.begin (); i != v1.end (); ++i)
+ /*VectorDomainBase<Field>::*/accu.mulacc (i->second, v2[i->first]);
- return VectorDomainBase<Field>::accu.get (res);
+ return /*VectorDomainBase<Field>::*/accu.get (res);
}
template <class Field>
@@ -2139,12 +2140,13 @@ namespace LinBox
{
typename Vector1::first_type::const_iterator i_idx;
typename Vector1::second_type::const_iterator i_elt;
- VectorDomainBase<Field>::accu.reset();
+ FieldAXPY<Field> accu(this->field());
+ //VectorDomainBase<Field>::accu.reset();
for (i_idx = v1.first.begin (), i_elt = v1.second.begin (); i_idx != v1.first.end (); ++i_idx, ++i_elt)
- VectorDomainBase<Field>::accu.mulacc (*i_elt, v2[*i_idx]);
+ /*VectorDomainBase<Field>::*/accu.mulacc (*i_elt, v2[*i_idx]);
- return VectorDomainBase<Field>::accu.get (res);
+ return /*VectorDomainBase<Field>::*/accu.get (res);
}
template <class Field>
@@ -2158,16 +2160,17 @@ namespace LinBox
{
typename Vector1::const_iterator i;
typename Vector2::const_iterator j;
- VectorDomainBase<Field>::accu.reset();
+ FieldAXPY<Field> accu(field());
+ //VectorDomainBase<Field>::accu.reset();
- for (i = v1.begin (), j = v2.begin (); i != v1.end () && j != v2.end (); i++) {
- while (j != v2.end () && j->first < i->first) j++;
+ for (i = v1.begin (), j = v2.begin (); i != v1.end () && j != v2.end (); ++i) {
+ while (j != v2.end () && j->first < i->first) ++j;
if (j != v2.end () && j->first == i->first)
- VectorDomainBase<Field>::accu.mulacc (i->second, j->second);
+ /*VectorDomainBase<Field>::*/accu.mulacc (i->second, j->second);
}
- return VectorDomainBase<Field>::accu.get (res);
+ return /*VectorDomainBase<Field>::*/accu.get (res);
}
template <class Field>
@@ -2181,16 +2184,17 @@ namespace LinBox
{
typename Vector1::const_iterator i;
typename Vector2::const_iterator j;
- VectorDomainBase<Field>::accu.reset();
+ FieldAXPY<Field> accu(field());
+ //VectorDomainBase<Field>::accu.reset();
- for (i = v1.begin (), j = v2.begin (); i != v1.end () && j != v2.end (); i++) {
- while (j != v2.end () && j->first < i->first) j++;
+ for (i = v1.begin (), j = v2.begin (); i != v1.end () && j != v2.end (); ++i) {
+ while (j != v2.end () && j->first < i->first) ++j;
if (j != v2.end () && j->first == i->first)
- VectorDomainBase<Field>::accu.mulacc (i->second, j->second);
+ /*VectorDomainBase<Field>::*/accu.mulacc (i->second, j->second);
}
- return VectorDomainBase<Field>::accu.get (res);
+ return /*VectorDomainBase<Field>::*/accu.get (res);
}
template <class Field>
@@ -2205,16 +2209,17 @@ namespace LinBox
typename Vector1::first_type::const_iterator i_idx = v1.first.begin ();
typename Vector1::second_type::const_iterator i_elt = v1.second.begin ();
typename Vector2::const_iterator j = v2.begin ();
- VectorDomainBase<Field>::accu.reset();
+ FieldAXPY<Field> accu(field());
+ //VectorDomainBase<Field>::accu.reset();
for (; i_idx != v1.first.end () && j != v2.end (); ++i_idx, ++i_elt) {
- while (j != v2.end () && j->first < *i_idx) j++;
+ while (j != v2.end () && j->first < *i_idx) ++j;
if (j != v2.end () && j->first == *i_idx)
- VectorDomainBase<Field>::accu.mulacc (*i_elt, j->second);
+ /*VectorDomainBase<Field>::*/accu.mulacc (*i_elt, j->second);
}
- return VectorDomainBase<Field>::accu.get (res);
+ return /*VectorDomainBase<Field>::*/accu.get (res);
}
template <class Field>
@@ -2228,16 +2233,17 @@ namespace LinBox
{
typename Vector1::const_iterator i;
typename Vector2::const_iterator j;
- VectorDomainBase<Field>::accu.reset();
+ FieldAXPY<Field> accu(field());
+ //VectorDomainBase<Field>::accu.reset();
- for (i = v1.begin (), j = v2.begin (); i != v1.end () && j != v2.end (); i++) {
- while (j != v2.end () && j->first < i->first) j++;
+ for (i = v1.begin (), j = v2.begin (); i != v1.end () && j != v2.end (); ++i) {
+ while (j != v2.end () && j->first < i->first) ++j;
if (j != v2.end () && j->first == i->first)
- VectorDomainBase<Field>::accu.mulacc (i->second, j->second);
+ /*VectorDomainBase<Field>::*/accu.mulacc (i->second, j->second);
}
- return VectorDomainBase<Field>::accu.get (res);
+ return /*VectorDomainBase<Field>::*/accu.get (res);
}
template <class Field>
@@ -2252,16 +2258,17 @@ namespace LinBox
typename Vector1::first_type::const_iterator i_idx = v1.first.begin ();
typename Vector1::second_type::const_iterator i_elt = v1.second.begin ();
typename Vector2::const_iterator j = v2.begin ();
- VectorDomainBase<Field>::accu.reset();
+ FieldAXPY<Field> accu(field());
+ //VectorDomainBase<Field>::accu.reset();
for (; i_idx != v1.first.end () && j != v2.end (); ++i_idx, ++i_elt) {
- while (j != v2.end () && j->first < *i_idx) j++;
+ while (j != v2.end () && j->first < *i_idx) ++j;
if (j != v2.end () && j->first == *i_idx)
- VectorDomainBase<Field>::accu.mulacc (*i_elt, j->second);
+ /*VectorDomainBase<Field>::*/accu.mulacc (*i_elt, j->second);
}
- return VectorDomainBase<Field>::accu.get (res);
+ return /*VectorDomainBase<Field>::*/accu.get (res);
}
template <class Field>
@@ -2277,18 +2284,20 @@ namespace LinBox
typename Vector1::second_type::const_iterator i_elt = v1.second.begin ();
typename Vector2::first_type::const_iterator j_idx = v2.first.begin ();
typename Vector2::second_type::const_iterator j_elt = v2.second.begin ();
- VectorDomainBase<Field>::accu.reset();
+ FieldAXPY<Field> accu(field());
+ //VectorDomainBase<Field>::accu.reset();
+
for (; i_idx != v1.first.end () && j_idx != v2.first.end (); ++i_idx, ++i_elt) {
while (j_idx != v2.first.end () && *j_idx < *i_idx) {
- j_idx++; j_elt++;
+ ++j_idx; ++j_elt;
}
if (j_idx != v2.first.end () && *j_idx == *i_idx)
- VectorDomainBase<Field>::accu.mulacc (*i_elt, *j_elt);
+ /*VectorDomainBase<Field>::*/accu.mulacc (*i_elt, *j_elt);
}
- return VectorDomainBase<Field>::accu.get (res);
+ return /*VectorDomainBase<Field>::*/accu.get (res);
}
template <class Field>
@@ -2385,11 +2394,10 @@ namespace LinBox
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
// Local Variables:
// mode: C++
// tab-width: 8
// indent-tabs-mode: nil
// c-basic-offset: 8
// End:
-
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/vector/vector-traits.h b/linbox/vector/vector-traits.h
old mode 100644
new mode 100755
index d21d974..b7bb3da
--- a/linbox/vector/vector-traits.h
+++ b/linbox/vector/vector-traits.h
@@ -56,6 +56,7 @@
#include "linbox/field/archetype.h"
#include "linbox/field/rebind.h"
+#include "linbox/matrix/sparse-formats.h"
namespace LinBox
{
@@ -151,7 +152,7 @@ namespace LinBox
struct SparseSequenceVectorPairLessThan :
public std::binary_function<const std::pair<size_t, Element>&, const std::pair<size_t, Element>&, bool > {
bool operator() (const std::pair<size_t, Element>& p1, const std::pair<size_t, Element>& p2)
- {
+ {
return p1.first < p2.first;
}
};
@@ -180,11 +181,14 @@ namespace LinBox
typedef std::vector<Element> VectorType;
};
+
+
// Specialization for STL vectors of pairs of size_t and elements
template <class Element>
struct VectorTraits< std::vector< std::pair<size_t, Element> > > {
typedef typename VectorCategories::SparseSequenceVectorTag VectorCategory;
typedef std::vector< std::pair<size_t, Element> > VectorType;
+ typedef SparseMatrixFormat::SparseSeq SparseFormat;
static void sort (VectorType& v) { std::stable_sort(v.begin(), v.end(), SparseSequenceVectorPairLessThan<Element>()); }
};
@@ -214,6 +218,7 @@ namespace LinBox
{
typedef typename VectorCategories::SparseAssociativeVectorTag VectorCategory;
typedef std::map<size_t, Element> VectorType;
+ typedef SparseMatrixFormat::SparseMap SparseFormat;
};
// Specialization for an STL pair of an STL vector of size_t's and an STL vector of elements
@@ -222,6 +227,7 @@ namespace LinBox
{
typedef typename VectorCategories::SparseParallelVectorTag VectorCategory;
typedef std::pair<std::vector<size_t>, std::vector<Element> > VectorType;
+ typedef SparseMatrixFormat::SparsePar SparseFormat;
};
// Namespace containing some useful generic functions
@@ -247,6 +253,7 @@ namespace LinBox
return v[i];
}
+ //! @bug who is zero ?
template <class Field, class Vector>
inline typename Field::Element &
refSpecialized (Vector &v, size_t i,
@@ -276,6 +283,7 @@ namespace LinBox
return v[i];
}
+ //! @bug who is zero ?
template <class Field, class Vector>
inline typename Field::Element &
refSpecialized (Vector &v, size_t i,
@@ -316,6 +324,7 @@ namespace LinBox
return v[i];
}
+ //! @bug who is zero ?
template <class Field, class Vector>
inline const typename Field::Element &
constRefSpecialized (Vector &v, size_t i,
@@ -343,6 +352,7 @@ namespace LinBox
return v[i];
}
+ //! @bug who is zero ?
template <class Field, class Vector>
inline typename Field::Element &
constRefSpecialized (Vector &v, size_t i,
@@ -424,13 +434,15 @@ namespace LinBox
* a sparse vector.
*/
+ //! @todo template by Field
template <class Element>
struct RawVector {
- typedef std::vector<Element> Dense;
- typedef std::pair<std::vector<size_t>, std::vector<Element> > Sparse;
- typedef std::vector<std::pair<size_t, Element> > SparseSeq;
- typedef std::map<size_t, Element> SparseMap;
- typedef std::pair<std::vector<size_t>, std::vector<Element> > SparsePar;
+ typedef std::vector<Element> Dense;
+ typedef std::vector<std::pair<size_t, Element> > SparseSeq;
+ typedef std::list<std::pair<size_t, Element> > SparseSeq2;
+ typedef std::map<size_t, Element> SparseMap;
+ typedef std::pair<std::vector<size_t>, Dense > SparsePar;
+ typedef SparsePar Sparse;
template<class VType> static size_t size(const VType& d)
{
@@ -534,11 +546,10 @@ namespace LinBox
#endif // __LINBOX_vector_traits_H
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
// Local Variables:
// mode: C++
// tab-width: 8
// indent-tabs-mode: nil
// c-basic-offset: 8
// End:
-
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/vector/vector.h b/linbox/vector/vector.h
new file mode 100644
index 0000000..16d8e67
--- /dev/null
+++ b/linbox/vector/vector.h
@@ -0,0 +1,58 @@
+/* linbox/vector/vector.h
+ * Copyright (C) 2015 the LinBox group
+ *
+ * Written by :
+ * Jean-Guillaume Dumas
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ * ========LICENCE========
+ */
+
+
+/*! @file vector/vector.h
+ * @ingroup vector
+ * A \c DenseVector<\c _Field > is default dense vector of
+ * <code>_Field::Element</code>s.
+ *
+ */
+
+#ifndef __LINBOX_vector_dense_vector_H
+#define __LINBOX_vector_dense_vector_H
+
+#include "linbox/linbox-config.h"
+#include "linbox/vector/vector-traits.h"
+
+namespace LinBox { /* BlasVector */
+
+ template<class _Vector>
+ class BlasSubvector ;
+
+ template<class _Field, class _Rep=typename RawVector<typename _Field::Element>::Dense>
+ class BlasVector ;
+
+ template <typename _Field> struct DenseVectorChooser { typedef BlasVector<_Field> type; }; // to allow specialization of using DenseVector
+ template <typename _Field> using DenseVector = typename DenseVectorChooser<_Field>::type;
+
+ template <typename _Field> struct DenseSubVectorChooser { typedef BlasSubvector<DenseVector<_Field>> type; }; // to allow specialization of using DenseVector
+ template <class _Field> using DenseSubvector = typename DenseSubVectorChooser<_Field>::type;
+
+}
+
+#endif // __LINBOX_vector_dense_vector_H
+
+
diff --git a/macros/Makefile.am b/macros/Makefile.am
index 4ac6d1e..f4dbd16 100644
--- a/macros/Makefile.am
+++ b/macros/Makefile.am
@@ -21,12 +21,11 @@
EXTRA_DIST=\
aclocal-include.m4 \
+ ax_cxx_compile_stdcxx_11.m4 \
config-header.m4 \
debug.m4 \
expat-check.m4 \
fflas-ffpack-check.m4 \
- givaro-check.m4 \
- gmp-check.m4 \
iml-check.m4 \
lidia-check.m4 \
linbox-benchmark.m4 \
@@ -41,4 +40,5 @@ EXTRA_DIST=\
fplll-check.m4 \
m4rie-check.m4 \
m4ri-check.m4 \
+ tinyxml2-check.m4 \
sage-check.m4
diff --git a/macros/Makefile.in b/macros/Makefile.in
deleted file mode 100644
index 9e64738..0000000
--- a/macros/Makefile.in
+++ /dev/null
@@ -1,490 +0,0 @@
-# Makefile.in generated by automake 1.11.5 from Makefile.am.
-# @configure_input@
-
-# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software
-# Foundation, Inc.
-# This Makefile.in is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
-# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
-# PARTICULAR PURPOSE.
-
- at SET_MAKE@
-
-# Copyright (c) 2010 the LinBox group
-# ========LICENCE========
-# This file is part of the library LinBox.
-#
-# LinBox is free software: you can redistribute it and/or modify
-# it under the terms of the GNU Lesser General Public
-# License as published by the Free Software Foundation; either
-# version 2.1 of the License, or (at your option) any later version.
-#
-# This library 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
-# Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public
-# License along with this library; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
-# ========LICENCE========
-#
-VPATH = @srcdir@
-am__make_dryrun = \
- { \
- am__dry=no; \
- case $$MAKEFLAGS in \
- *\\[\ \ ]*) \
- echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \
- | grep '^AM OK$$' >/dev/null || am__dry=yes;; \
- *) \
- for am__flg in $$MAKEFLAGS; do \
- case $$am__flg in \
- *=*|--*) ;; \
- *n*) am__dry=yes; break;; \
- esac; \
- done;; \
- esac; \
- test $$am__dry = yes; \
- }
-pkgdatadir = $(datadir)/@PACKAGE@
-pkgincludedir = $(includedir)/@PACKAGE@
-pkglibdir = $(libdir)/@PACKAGE@
-pkglibexecdir = $(libexecdir)/@PACKAGE@
-am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
-install_sh_DATA = $(install_sh) -c -m 644
-install_sh_PROGRAM = $(install_sh) -c
-install_sh_SCRIPT = $(install_sh) -c
-INSTALL_HEADER = $(INSTALL_DATA)
-transform = $(program_transform_name)
-NORMAL_INSTALL = :
-PRE_INSTALL = :
-POST_INSTALL = :
-NORMAL_UNINSTALL = :
-PRE_UNINSTALL = :
-POST_UNINSTALL = :
-build_triplet = @build@
-host_triplet = @host@
-subdir = macros
-DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in
-ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-am__aclocal_m4_deps = $(top_srcdir)/macros/aclocal-include.m4 \
- $(top_srcdir)/macros/config-header.m4 \
- $(top_srcdir)/macros/debug.m4 \
- $(top_srcdir)/macros/expat-check.m4 \
- $(top_srcdir)/macros/fflas-ffpack-check.m4 \
- $(top_srcdir)/macros/fplll-check.m4 \
- $(top_srcdir)/macros/givaro-check.m4 \
- $(top_srcdir)/macros/gmp-check.m4 \
- $(top_srcdir)/macros/iml-check.m4 \
- $(top_srcdir)/macros/lapack-check.m4 \
- $(top_srcdir)/macros/libtool.m4 \
- $(top_srcdir)/macros/lidia-check.m4 \
- $(top_srcdir)/macros/linbox-benchmark.m4 \
- $(top_srcdir)/macros/linbox-doc.m4 \
- $(top_srcdir)/macros/linbox-misc.m4 \
- $(top_srcdir)/macros/linbox-opt.m4 \
- $(top_srcdir)/macros/ltoptions.m4 \
- $(top_srcdir)/macros/ltsugar.m4 \
- $(top_srcdir)/macros/ltversion.m4 \
- $(top_srcdir)/macros/lt~obsolete.m4 \
- $(top_srcdir)/macros/m4ri-check.m4 \
- $(top_srcdir)/macros/m4rie-check.m4 \
- $(top_srcdir)/macros/maple-check.m4 \
- $(top_srcdir)/macros/mpfr-check.m4 \
- $(top_srcdir)/macros/ntl-check.m4 \
- $(top_srcdir)/macros/saclib-check.m4 \
- $(top_srcdir)/macros/sage-check.m4 $(top_srcdir)/configure.ac
-am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
- $(ACLOCAL_M4)
-mkinstalldirs = $(install_sh) -d
-CONFIG_HEADER = $(top_builddir)/config.h
-CONFIG_CLEAN_FILES =
-CONFIG_CLEAN_VPATH_FILES =
-depcomp =
-am__depfiles_maybe =
-SOURCES =
-DIST_SOURCES =
-am__can_run_installinfo = \
- case $$AM_UPDATE_INFO_DIR in \
- n|no|NO) false;; \
- *) (install-info --version) >/dev/null 2>&1;; \
- esac
-DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
-ACLOCAL = @ACLOCAL@
-AMTAR = @AMTAR@
-AR = @AR@
-AUTOCONF = @AUTOCONF@
-AUTOHEADER = @AUTOHEADER@
-AUTOMAKE = @AUTOMAKE@
-AWK = @AWK@
-BLAS_CFLAGS = @BLAS_CFLAGS@
-BLAS_LIBS = @BLAS_LIBS@
-CC = @CC@
-CCNAM = @CCNAM@
-CFLAGS = @CFLAGS@
-CPPFLAGS = @CPPFLAGS@
-CXX = @CXX@
-CXXCPP = @CXXCPP@
-CXXFLAGS = @CXXFLAGS@
-CYGPATH_W = @CYGPATH_W@
-DBG = @DBG@
-DEBUG_CFLAGS = @DEBUG_CFLAGS@
-DEFAULT_CFLAGS = @DEFAULT_CFLAGS@
-DEFS = @DEFS@
-DLLTOOL = @DLLTOOL@
-DSYMUTIL = @DSYMUTIL@
-DUMPBIN = @DUMPBIN@
-ECHO_C = @ECHO_C@
-ECHO_N = @ECHO_N@
-ECHO_T = @ECHO_T@
-EGREP = @EGREP@
-EXEEXT = @EXEEXT@
-EXPAT_CFLAGS = @EXPAT_CFLAGS@
-EXPAT_LIBS = @EXPAT_LIBS@
-FFLAS_FFPACK_CFLAGS = @FFLAS_FFPACK_CFLAGS@
-FFLAS_FFPACK_LIBS = @FFLAS_FFPACK_LIBS@
-FFLAS_FFPACK_LOC = @FFLAS_FFPACK_LOC@
-FGREP = @FGREP@
-FPLLL_CFLAGS = @FPLLL_CFLAGS@
-FPLLL_LIBS = @FPLLL_LIBS@
-GIVARO_CFLAGS = @GIVARO_CFLAGS@
-GIVARO_LIBS = @GIVARO_LIBS@
-GMP_CFLAGS = @GMP_CFLAGS@
-GMP_LIBS = @GMP_LIBS@
-GMP_VERSION = @GMP_VERSION@
-GREP = @GREP@
-IML_CFLAGS = @IML_CFLAGS@
-IML_LIBS = @IML_LIBS@
-INSTALL = @INSTALL@
-INSTALL_DATA = @INSTALL_DATA@
-INSTALL_PROGRAM = @INSTALL_PROGRAM@
-INSTALL_SCRIPT = @INSTALL_SCRIPT@
-INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
-LD = @LD@
-LDFLAGS = @LDFLAGS@
-LIBOBJS = @LIBOBJS@
-LIBS = @LIBS@
-LIBTOOL = @LIBTOOL@
-LIDIA_CFLAGS = @LIDIA_CFLAGS@
-LIDIA_LIBS = @LIDIA_LIBS@
-LINBOX_BENCH_PATH = @LINBOX_BENCH_PATH@
-LINBOX_DOC_PATH = @LINBOX_DOC_PATH@
-LIPO = @LIPO@
-LN_S = @LN_S@
-LTLIBOBJS = @LTLIBOBJS@
-M4RIE_CFLAGS = @M4RIE_CFLAGS@
-M4RIE_LIBS = @M4RIE_LIBS@
-M4RI_CFLAGS = @M4RI_CFLAGS@
-M4RI_LIBS = @M4RI_LIBS@
-MAINT = @MAINT@
-MAKEINFO = @MAKEINFO@
-MANIFEST_TOOL = @MANIFEST_TOOL@
-MAPLE_CFLAGS = @MAPLE_CFLAGS@
-MAPLE_HOME = @MAPLE_HOME@
-MAPLE_LIBS = @MAPLE_LIBS@
-MAPLE_VERSION = @MAPLE_VERSION@
-MKDIR_P = @MKDIR_P@
-MPFR_CFLAGS = @MPFR_CFLAGS@
-MPFR_LIBS = @MPFR_LIBS@
-NM = @NM@
-NMEDIT = @NMEDIT@
-NTL_CFLAGS = @NTL_CFLAGS@
-NTL_LIBS = @NTL_LIBS@
-OBJDUMP = @OBJDUMP@
-OBJEXT = @OBJEXT@
-OTOOL = @OTOOL@
-OTOOL64 = @OTOOL64@
-PACKAGE = @PACKAGE@
-PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
-PACKAGE_NAME = @PACKAGE_NAME@
-PACKAGE_STRING = @PACKAGE_STRING@
-PACKAGE_TARNAME = @PACKAGE_TARNAME@
-PACKAGE_URL = @PACKAGE_URL@
-PACKAGE_VERSION = @PACKAGE_VERSION@
-PATH_SEPARATOR = @PATH_SEPARATOR@
-PROF = @PROF@
-RANLIB = @RANLIB@
-RM = @RM@
-SACLIB_CFLAGS = @SACLIB_CFLAGS@
-SACLIB_LIBS = @SACLIB_LIBS@
-SED = @SED@
-SET_MAKE = @SET_MAKE@
-SHELL = @SHELL@
-STRIP = @STRIP@
-TESTS_CFLAGS = @TESTS_CFLAGS@
-VERSION = @VERSION@
-WARN = @WARN@
-abs_builddir = @abs_builddir@
-abs_srcdir = @abs_srcdir@
-abs_top_builddir = @abs_top_builddir@
-abs_top_srcdir = @abs_top_srcdir@
-ac_ct_AR = @ac_ct_AR@
-ac_ct_CC = @ac_ct_CC@
-ac_ct_CXX = @ac_ct_CXX@
-ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
-am__leading_dot = @am__leading_dot@
-am__tar = @am__tar@
-am__untar = @am__untar@
-bindir = @bindir@
-build = @build@
-build_alias = @build_alias@
-build_cpu = @build_cpu@
-build_os = @build_os@
-build_vendor = @build_vendor@
-builddir = @builddir@
-datadir = @datadir@
-datarootdir = @datarootdir@
-docdir = @docdir@
-dvidir = @dvidir@
-exec_prefix = @exec_prefix@
-host = @host@
-host_alias = @host_alias@
-host_cpu = @host_cpu@
-host_os = @host_os@
-host_vendor = @host_vendor@
-htmldir = @htmldir@
-includedir = @includedir@
-infodir = @infodir@
-install_sh = @install_sh@
-libdir = @libdir@
-libexecdir = @libexecdir@
-localedir = @localedir@
-localstatedir = @localstatedir@
-mandir = @mandir@
-mkdir_p = @mkdir_p@
-oldincludedir = @oldincludedir@
-pdfdir = @pdfdir@
-prefix = @prefix@
-program_transform_name = @program_transform_name@
-psdir = @psdir@
-sbindir = @sbindir@
-sharedstatedir = @sharedstatedir@
-srcdir = @srcdir@
-sysconfdir = @sysconfdir@
-target_alias = @target_alias@
-top_build_prefix = @top_build_prefix@
-top_builddir = @top_builddir@
-top_srcdir = @top_srcdir@
-EXTRA_DIST = \
- aclocal-include.m4 \
- config-header.m4 \
- debug.m4 \
- expat-check.m4 \
- fflas-ffpack-check.m4 \
- givaro-check.m4 \
- gmp-check.m4 \
- iml-check.m4 \
- lidia-check.m4 \
- linbox-benchmark.m4 \
- linbox-doc.m4 \
- linbox-misc.m4 \
- linbox-opt.m4 \
- maple-check-version.mpl \
- maple-check.m4 \
- ntl-check.m4 \
- saclib-check.m4 \
- mpfr-check.m4 \
- fplll-check.m4 \
- m4rie-check.m4 \
- m4ri-check.m4 \
- sage-check.m4
-
-all: all-am
-
-.SUFFIXES:
-$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps)
- @for dep in $?; do \
- case '$(am__configure_deps)' in \
- *$$dep*) \
- ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
- && { if test -f $@; then exit 0; else break; fi; }; \
- exit 1;; \
- esac; \
- done; \
- echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu --ignore-deps macros/Makefile'; \
- $(am__cd) $(top_srcdir) && \
- $(AUTOMAKE) --gnu --ignore-deps macros/Makefile
-.PRECIOUS: Makefile
-Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
- @case '$?' in \
- *config.status*) \
- cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
- *) \
- echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
- cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
- esac;
-
-$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
- cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-
-$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
- cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
- cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-$(am__aclocal_m4_deps):
-
-mostlyclean-libtool:
- -rm -f *.lo
-
-clean-libtool:
- -rm -rf .libs _libs
-tags: TAGS
-TAGS:
-
-ctags: CTAGS
-CTAGS:
-
-
-distdir: $(DISTFILES)
- @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
- topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
- list='$(DISTFILES)'; \
- dist_files=`for file in $$list; do echo $$file; done | \
- sed -e "s|^$$srcdirstrip/||;t" \
- -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
- case $$dist_files in \
- */*) $(MKDIR_P) `echo "$$dist_files" | \
- sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
- sort -u` ;; \
- esac; \
- for file in $$dist_files; do \
- if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
- if test -d $$d/$$file; then \
- dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
- if test -d "$(distdir)/$$file"; then \
- find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
- fi; \
- if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
- cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
- find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
- fi; \
- cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
- else \
- test -f "$(distdir)/$$file" \
- || cp -p $$d/$$file "$(distdir)/$$file" \
- || exit 1; \
- fi; \
- done
-check-am: all-am
-check: check-am
-all-am: Makefile
-installdirs:
-install: install-am
-install-exec: install-exec-am
-install-data: install-data-am
-uninstall: uninstall-am
-
-install-am: all-am
- @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
-
-installcheck: installcheck-am
-install-strip:
- if test -z '$(STRIP)'; then \
- $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
- install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
- install; \
- else \
- $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
- install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
- "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
- fi
-mostlyclean-generic:
-
-clean-generic:
-
-distclean-generic:
- -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
- -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
-
-maintainer-clean-generic:
- @echo "This command is intended for maintainers to use"
- @echo "it deletes files that may require special tools to rebuild."
-clean: clean-am
-
-clean-am: clean-generic clean-libtool mostlyclean-am
-
-distclean: distclean-am
- -rm -f Makefile
-distclean-am: clean-am distclean-generic
-
-dvi: dvi-am
-
-dvi-am:
-
-html: html-am
-
-html-am:
-
-info: info-am
-
-info-am:
-
-install-data-am:
-
-install-dvi: install-dvi-am
-
-install-dvi-am:
-
-install-exec-am:
-
-install-html: install-html-am
-
-install-html-am:
-
-install-info: install-info-am
-
-install-info-am:
-
-install-man:
-
-install-pdf: install-pdf-am
-
-install-pdf-am:
-
-install-ps: install-ps-am
-
-install-ps-am:
-
-installcheck-am:
-
-maintainer-clean: maintainer-clean-am
- -rm -f Makefile
-maintainer-clean-am: distclean-am maintainer-clean-generic
-
-mostlyclean: mostlyclean-am
-
-mostlyclean-am: mostlyclean-generic mostlyclean-libtool
-
-pdf: pdf-am
-
-pdf-am:
-
-ps: ps-am
-
-ps-am:
-
-uninstall-am:
-
-.MAKE: install-am install-strip
-
-.PHONY: all all-am check check-am clean clean-generic clean-libtool \
- distclean distclean-generic distclean-libtool distdir dvi \
- dvi-am html html-am info info-am install install-am \
- install-data install-data-am install-dvi install-dvi-am \
- install-exec install-exec-am install-html install-html-am \
- install-info install-info-am install-man install-pdf \
- install-pdf-am install-ps install-ps-am install-strip \
- installcheck installcheck-am installdirs maintainer-clean \
- maintainer-clean-generic mostlyclean mostlyclean-generic \
- mostlyclean-libtool pdf pdf-am ps ps-am uninstall uninstall-am
-
-
-# Tell versions [3.59,3.63) of GNU make to not export all variables.
-# Otherwise a system limit (for SysV at least) may be exceeded.
-.NOEXPORT:
diff --git a/macros/ax_cxx_compile_stdcxx_11.m4 b/macros/ax_cxx_compile_stdcxx_11.m4
new file mode 100644
index 0000000..af37acd
--- /dev/null
+++ b/macros/ax_cxx_compile_stdcxx_11.m4
@@ -0,0 +1,133 @@
+# ============================================================================
+# http://www.gnu.org/software/autoconf-archive/ax_cxx_compile_stdcxx_11.html
+# ============================================================================
+#
+# SYNOPSIS
+#
+# AX_CXX_COMPILE_STDCXX_11([ext|noext],[mandatory|optional])
+#
+# DESCRIPTION
+#
+# Check for baseline language coverage in the compiler for the C++11
+# standard; if necessary, add switches to CXXFLAGS to enable support.
+#
+# The first argument, if specified, indicates whether you insist on an
+# extended mode (e.g. -std=gnu++11) or a strict conformance mode (e.g.
+# -std=c++11). If neither is specified, you get whatever works, with
+# preference for an extended mode.
+#
+# The second argument, if specified 'mandatory' or if left unspecified,
+# indicates that baseline C++11 support is required and that the macro
+# should error out if no mode with that support is found. If specified
+# 'optional', then configuration proceeds regardless, after defining
+# HAVE_CXX11 if and only if a supporting mode is found.
+#
+# LICENSE
+#
+# Copyright (c) 2008 Benjamin Kosnik <bkoz at redhat.com>
+# Copyright (c) 2012 Zack Weinberg <zackw at panix.com>
+# Copyright (c) 2013 Roy Stogner <roystgnr at ices.utexas.edu>
+#
+# Copying and distribution of this file, with or without modification, are
+# permitted in any medium without royalty provided the copyright notice
+# and this notice are preserved. This file is offered as-is, without any
+# warranty.
+
+#serial 3
+
+m4_define([_AX_CXX_COMPILE_STDCXX_11_testbody], [
+ template <typename T>
+ struct check
+ {
+ static_assert(sizeof(int) <= sizeof(T), "not big enough");
+ };
+
+ typedef check<check<bool>> right_angle_brackets;
+
+ int a;
+ decltype(a) b;
+
+ typedef check<int> check_type;
+ check_type c;
+ check_type&& cr = static_cast<check_type&&>(c);
+
+ auto d = a;
+])
+
+AC_DEFUN([AX_CXX_COMPILE_STDCXX_11], [dnl
+ m4_if([$1], [], [],
+ [$1], [ext], [],
+ [$1], [noext], [],
+ [m4_fatal([invalid argument `$1' to AX_CXX_COMPILE_STDCXX_11])])dnl
+ m4_if([$2], [], [ax_cxx_compile_cxx11_required=true],
+ [$2], [mandatory], [ax_cxx_compile_cxx11_required=true],
+ [$2], [optional], [ax_cxx_compile_cxx11_required=false],
+ [m4_fatal([invalid second argument `$2' to AX_CXX_COMPILE_STDCXX_11])])dnl
+ AC_LANG_PUSH([C++])dnl
+ ac_success=no
+ AC_CACHE_CHECK(whether $CXX supports C++11 features by default,
+ ax_cv_cxx_compile_cxx11,
+ [AC_COMPILE_IFELSE([AC_LANG_SOURCE([_AX_CXX_COMPILE_STDCXX_11_testbody])],
+ [ax_cv_cxx_compile_cxx11=yes],
+ [ax_cv_cxx_compile_cxx11=no])])
+ if test x$ax_cv_cxx_compile_cxx11 = xyes; then
+ ac_success=yes
+ fi
+
+ m4_if([$1], [noext], [], [dnl
+ if test x$ac_success = xno; then
+ for switch in -std=gnu++11 -std=gnu++0x; do
+ cachevar=AS_TR_SH([ax_cv_cxx_compile_cxx11_$switch])
+ AC_CACHE_CHECK(whether $CXX supports C++11 features with $switch,
+ $cachevar,
+ [ac_save_CXXFLAGS="$CXXFLAGS"
+ CXXFLAGS="$CXXFLAGS $switch"
+ AC_COMPILE_IFELSE([AC_LANG_SOURCE([_AX_CXX_COMPILE_STDCXX_11_testbody])],
+ [eval $cachevar=yes],
+ [eval $cachevar=no])
+ CXXFLAGS="$ac_save_CXXFLAGS"])
+ if eval test x\$$cachevar = xyes; then
+ CXXFLAGS="$CXXFLAGS $switch"
+ ac_success=yes
+ break
+ fi
+ done
+ fi])
+
+ m4_if([$1], [ext], [], [dnl
+ if test x$ac_success = xno; then
+ for switch in -std=c++11 -std=c++0x; do
+ cachevar=AS_TR_SH([ax_cv_cxx_compile_cxx11_$switch])
+ AC_CACHE_CHECK(whether $CXX supports C++11 features with $switch,
+ $cachevar,
+ [ac_save_CXXFLAGS="$CXXFLAGS"
+ CXXFLAGS="$CXXFLAGS $switch"
+ AC_COMPILE_IFELSE([AC_LANG_SOURCE([_AX_CXX_COMPILE_STDCXX_11_testbody])],
+ [eval $cachevar=yes],
+ [eval $cachevar=no])
+ CXXFLAGS="$ac_save_CXXFLAGS"])
+ if eval test x\$$cachevar = xyes; then
+ CXXFLAGS="$CXXFLAGS $switch"
+ ac_success=yes
+ break
+ fi
+ done
+ fi])
+ AC_LANG_POP([C++])
+ if test x$ax_cxx_compile_cxx11_required = xtrue; then
+ if test x$ac_success = xno; then
+ AC_MSG_ERROR([*** A compiler with support for C++11 language features is required.])
+ fi
+ else
+ if test x$ac_success = xno; then
+ HAVE_CXX11=0
+ AC_MSG_NOTICE([No compiler with C++11 support was found])
+ else
+ HAVE_CXX11=1
+ AC_DEFINE(HAVE_CXX11,1,
+ [define if the compiler supports basic C++11 syntax])
+ fi
+
+ AC_SUBST(HAVE_CXX11)
+ fi
+])
diff --git a/macros/debug.m4 b/macros/debug.m4
index 9eaea20..44a0da8 100644
--- a/macros/debug.m4
+++ b/macros/debug.m4
@@ -1,20 +1,20 @@
dnl Copyright(c)'2011 LinBox
-dnl Written by BB <bboyer at imag.fr>
+dnl Written by Brice Boyer (briceboyer) <boyer.brice at gmail.com>
dnl This file is part of LinBox.
dnl ========LICENCE========
dnl This file is part of the library LinBox.
- dnl
+ dnl
dnl LinBox is free software: you can redistribute it and/or modify
dnl it under the terms of the GNU Lesser General Public
dnl License as published by the Free Software Foundation; either
dnl version 2.1 of the License, or (at your option) any later version.
- dnl
+ dnl
dnl This library is distributed in the hope that it will be useful,
dnl but WITHOUT ANY WARRANTY; without even the implied warranty of
dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
dnl Lesser General Public License for more details.
- dnl
+ dnl
dnl You should have received a copy of the GNU Lesser General Public
dnl License along with this library; if not, write to the Free Software
dnl Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
@@ -25,11 +25,11 @@ dnl enable basic debug mode.
AC_DEFUN([AC_DEBUG],
[AC_MSG_CHECKING([whether to enable debugging options in the library])
AC_ARG_ENABLE(debug,
-[AC_HELP_STRING([--enable-debug], [enable debugging options in library])],
+[AC_HELP_STRING([--enable-debug=yes|no], [enable debugging options in library])],
USE_DEBUG=$enableval,
USE_DEBUG=no)
AC_MSG_RESULT([$USE_DEBUG])
- AM_CONDITIONAL(DEBUG, [test $USE_DEBUG = yes])
+ AM_CONDITIONAL(DEBUG, [test x$USE_DEBUG = xyes])
DBG=$USE_DEBUG
AC_SUBST(DBG)dnl
]
@@ -38,7 +38,7 @@ AC_DEFUN([AC_DEBUG],
AC_DEFUN([AC_PROFILE],
[AC_MSG_CHECKING([whether to enable profiling everything in the library])
AC_ARG_ENABLE(profile,
-[AC_HELP_STRING([--enable-profile], [enable profiling options in library])],
+[AC_HELP_STRING([--enable-profile=yes|no], [enable profiling options in library])],
USE_PROFILE=$enableval,
USE_PROFILE=no)
AC_MSG_RESULT([$USE_PROFILE])
@@ -82,7 +82,7 @@ AC_DEFUN([AC_COMPILER_NAME], [
AC_SUBST(CCNAM)
])
-dnl PATHSCALE ?
+dnl PATHSCALE > 4 ?
AS_IF([ test -z "${CCNAM}"], [
AC_TRY_RUN( [
#ifdef __PATHSCALE__
@@ -95,24 +95,68 @@ dnl PATHSCALE ?
AC_SUBST(CCNAM) ])
])
-dnl CLANG ?
+dnl CLANG > 3.1 ?
AS_IF([ test -z "${CCNAM}"], [
AC_TRY_RUN( [
#ifdef __clang__
- int main() { return !(__clang_major >=3) ; }
+ int main() { return !(__clang_major__ >=3 && __clang_minor__ >=1) ; }
#else
pas clang non plus.
#endif], [
- AC_MSG_RESULT(clang)
+ AC_MSG_RESULT(clang31)
+ CCNAM=clang31
+ AC_SUBST(CCNAM) ])
+ ])
+
+dnl CLANG > 3 ?
+ AS_IF([ test -z "${CCNAM}"], [
+ AC_TRY_RUN( [
+ #ifdef __clang__
+ int main() { return !(__clang_major__ >=3) ; }
+ #else
+ pas clang non plus.
+ #endif], [
+ AC_MSG_RESULT(clang31)
CCNAM=clang
AC_SUBST(CCNAM) ])
])
-dnl GCC ?
+
+dnl GCC >= 4.8 ?
+ AS_IF([ test -z "${CCNAM}"], [
+ AC_TRY_RUN( [
+ #ifdef __GNUC__
+ int main() { return !(__GNUC__ >= 5 || (__GNUC__ == 4 && __GNUC_MINOR__ > 7 )) ; }
+ #else
+ pas gcc non plus ???
+ #endif], [
+ CCNOM=gcc
+ AS_IF([ test -n "${CC}" ], [CCNOM="`$CC --version 2>&1| awk 'NR<2{print $1}'`"])
+ CCNAM=gcc48
+ AC_SUBST(CCNAM)
+ AC_MSG_RESULT($CCNOM)
+ ])
+ ])
+dnl GCC > 4.4 ?
+ AS_IF([ test -z "${CCNAM}"], [
+ AC_TRY_RUN( [
+ #ifdef __GNUC__
+ int main() { return !( __GNUC__ == 4 && __GNUC_MINOR__ == 4 ) ; }
+ #else
+ pas gcc non plus ???
+ #endif], [
+ CCNOM=gcc
+ AS_IF([ test -n "${CC}" ], [CCNOM="`$CC --version 2>&1| awk 'NR<2{print $1}'`"])
+ CCNAM=gcc44
+ AC_SUBST(CCNAM)
+ AC_MSG_RESULT($CCNOM)
+ ])
+ ])
+dnl GCC > 4.2 ?
AS_IF([ test -z "${CCNAM}"], [
AC_TRY_RUN( [
#ifdef __GNUC__
- int main() { return !(__GNUC__ >= 4 || (__GNUC__ == 4 && __GNUC_MINOR__ > 2)) ; }
+ int main() { return !(__GNUC__ == 4 && __GNUC_MINOR__ > 2) ; }
#else
pas gcc non plus ???
#endif], [
diff --git a/macros/expat-check.m4 b/macros/expat-check.m4
index 18741a6..24140d3 100644
--- a/macros/expat-check.m4
+++ b/macros/expat-check.m4
@@ -75,8 +75,8 @@ if test -r "$EXPAT_HOME/include/expat.h"; then
EXPAT_LIBS="-lexpat"
fi
- CXXFLAGS="${BACKUP_CXXFLAGS} ${EXPAT_CFLAGS} ${GMP_CFLAGS}"
- LIBS="${BACKUP_LIBS} ${EXPAT_LIBS} ${GMP_LIBS}"
+ CXXFLAGS="${BACKUP_CXXFLAGS} ${EXPAT_CFLAGS} ${FFLAS_FFPACK_CFLAGS}"
+ LIBS="${BACKUP_LIBS} ${EXPAT_LIBS} ${FFLAS_FFPACK_LIBS}"
AC_TRY_LINK(
[#include <expat.h>],
[XML_Content_Type a;],
diff --git a/macros/fflas-ffpack-check.m4 b/macros/fflas-ffpack-check.m4
index 99411d4..ec18e85 100644
--- a/macros/fflas-ffpack-check.m4
+++ b/macros/fflas-ffpack-check.m4
@@ -53,14 +53,12 @@ AC_ARG_WITH(fflas-ffpack,
fi],
[FFLAS_FFPACK_HOME_PATH="${DEFAULT_CHECKING_PATH}"])
-dnl min_iml_version=ifelse([$1], ,1.0.3,$1)
-
dnl -------------------- dnl
dnl FFLAS-FFPACK VERSION dnl
dnl -------------------- dnl
-version_min=10600
-version_max=10700
+version_min=20200
+version_max=20202
dnl Check for existence
@@ -73,18 +71,12 @@ for FFLAS_FFPACK_HOME in ${FFLAS_FFPACK_HOME_PATH}
do
if test -r "$FFLAS_FFPACK_HOME/include/fflas-ffpack/fflas-ffpack.h" -a -x "$FFLAS_FFPACK_HOME/bin/fflas-ffpack-config"; then
- BLAS_LIBS=`$FFLAS_FFPACK_HOME/bin/fflas-ffpack-config --blas-libs`
- BLAS_CFLAGS=`$FFLAS_FFPACK_HOME/bin/fflas-ffpack-config --cflags`
-
-
- if test "x$FFLAS_FFPACK_HOME" != "x/usr" -a "x$FFLAS_FFPACK_HOME" != "x/usr/local"; then
- FFLAS_FFPACK_CFLAGS="-I${FFLAS_FFPACK_HOME}/include"
- else
- FFLAS_FFPACK_CFLAGS=
- fi
+ # FFLAS-FFPACK Libs + CFlags contains GMP/Givaro/BLAS infos - AB 2014-12-12
+ FFLAS_FFPACK_LIBS=`$FFLAS_FFPACK_HOME/bin/fflas-ffpack-config --libs`
+ FFLAS_FFPACK_CFLAGS=`$FFLAS_FFPACK_HOME/bin/fflas-ffpack-config --cflags`
- CXXFLAGS="${BACKUP_CXXFLAGS} ${FFLAS_FFPACK_CFLAGS} ${BLAS_CFLAGS}"
- LIBS="${BACKUP_LIBS} ${BLAS_LIBS}"
+ CXXFLAGS="${BACKUP_CXXFLAGS} ${FFLAS_FFPACK_CFLAGS}"
+ LIBS="${BACKUP_LIBS} ${FFLAS_FFPACK_LIBS}"
AC_TRY_LINK(
[#include "fflas-ffpack/fflas-ffpack.h"],
@@ -105,11 +97,10 @@ for FFLAS_FFPACK_HOME in ${FFLAS_FFPACK_HOME_PATH}
],
[
ffflasffpack_found="no"
- ffflasffpack_checked="$checked $FFLAS_FFPACK_HOME"
+ dnl ffflasffpack_checked="$checked $FFLAS_FFPACK_HOME"
unset FFLAS_FFPACK_CFLAGS
+ unset FFLAS_FFPACK_LIBS
unset FFLAS_FFPACK_LOC
- unset BLAS_LIBS
- unset BLAS_CFLAGS
])
dnl AC_MSG_RESULT(found in $ffflasffpack_checked ? $ffflasffpack_found)
else
@@ -121,13 +112,12 @@ done
if test "x$ffflasffpack_found" = "xyes" ; then
AC_SUBST(FFLAS_FFPACK_CFLAGS)
AC_SUBST(FFLAS_FFPACK_LIBS)
- AC_SUBST(FFLAS_FFPACK_LOC)
- AC_SUBST(BLAS_LIBS)
- AC_SUBST(BLAS_CFLAGS)
+
+ HAVE_FFLAS_FFPACK=yes
AC_DEFINE(HAVE_FFLAS_FFPACK,1,[Define if FFLAS-FFPACK is installed])
FF_VER=`$FFLAS_FFPACK_LOC/bin/fflas-ffpack-config --decimal-version`
AC_DEFINE_UNQUOTED(FFLAS_FFPACK_VERSION, $FF_VER ,[what version of FFLAS-FFPACK is installed])
- HAVE_FFLAS_FFPACK=yes
+
if test "x$fflasflas_cross" != "xyes"; then
AC_MSG_RESULT(found)
else
@@ -135,13 +125,16 @@ if test "x$ffflasffpack_found" = "xyes" ; then
echo "WARNING: You appear to be cross compiling, so there is no way to determine"
echo "whether your FFLAS-FFPACK version is new enough. I am assuming it is."
fi
+
ifelse([$2], , :, [$2])
+
elif test -n "$fflasflas_problem"; then
AC_MSG_RESULT(problem)
echo "Sorry, your FFLAS-FFPACK version is too old. Disabling."
ifelse([$3], , :, [$3])
+
elif test "x$fflasflas_found" = "xno" ; then
- AC_MSG_RESULT(not found)
+ AC_MSG_RESULT(not found: bad version $FF_VER)
ifelse([$3], , :, [$3])
fi
@@ -149,6 +142,5 @@ AM_CONDITIONAL(LINBOX_HAVE_FFLAS_FFPACK, test "x$HAVE_FFLAS_FFPACK" = "xyes")
CXXFLAGS=${BACKUP_CXXFLAGS}
LIBS=${BACKUP_LIBS}
-#unset LD_LIBRARY_PATH
])
diff --git a/macros/flint-check.m4 b/macros/flint-check.m4
new file mode 100644
index 0000000..e5198d9
--- /dev/null
+++ b/macros/flint-check.m4
@@ -0,0 +1,147 @@
+dnl Check for FLINT
+dnl Copyright (c) the LinBox group
+dnl This file is part of LinBox
+
+ dnl ========LICENCE========
+ dnl This file is part of the library LinBox.
+ dnl
+ dnl LinBox is free software: you can redistribute it and/or modify
+ dnl it under the terms of the GNU Lesser General Public
+ dnl License as published by the Free Software Foundation; either
+ dnl version 2.1 of the License, or (at your option) any later version.
+ dnl
+ dnl This library is distributed in the hope that it will be useful,
+ dnl but WITHOUT ANY WARRANTY; without even the implied warranty of
+ dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ dnl Lesser General Public License for more details.
+ dnl
+ dnl You should have received a copy of the GNU Lesser General Public
+ dnl License along with this library; if not, write to the Free Software
+ dnl Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ dnl ========LICENCE========
+ dnl
+dnl Boyer Brice 8/6/12
+dnl Bradford Hovinen, 2001-06-13
+dnl Modified by Pascal Giorgi, 2003-12-03
+dnl Inspired by gnome-bonobo-check.m4 by Miguel de Icaza, 99-04-12
+dnl Stolen from Chris Lahey 99-2-5
+dnl stolen from Manish Singh again
+dnl stolen back from Frank Belew
+dnl stolen from Manish Singh
+dnl Shamelessly stolen from Owen Taylor
+
+dnl LB_CHECK_FLINT ([MINIMUM-VERSION [, ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND]]])
+dnl
+dnl Test for FLINT and define FLINT_CFLAGS and FLINT_LIBS
+
+AC_DEFUN([LB_CHECK_FLINT],
+[
+
+AC_ARG_WITH(flint,
+[AC_HELP_STRING([--with-flint=<path>|yes], [Use FLINT library. This library is (not yet) mandatory for
+ LinBox compilation. If argument is yes or <empty> or <bad>
+ that means the library is reachable with the standard
+ search path (/usr or /usr/local). Otherwise you give
+ the <path> to the directory which contains the
+ library. ])
+])
+
+AS_IF([test "$withval" = yes ],
+ [ FLINT_HOME_PATH="${DEFAULT_CHECKING_PATH}" ],
+ [ test "$withval" != no ],
+ [ FLINT_HOME_PATH="$withval ${DEFAULT_CHECKING_PATH}" ],
+ [ FLINT_HOME_PATH="${DEFAULT_CHECKING_PATH}"])
+
+dnl min_flint_version=ifelse([$1], ,1.0.3,$1)
+
+
+dnl Check for existence
+BACKUP_CXXFLAGS=${CXXFLAGS}
+BACKUP_LIBS=${LIBS}
+
+AC_MSG_CHECKING(for FLINT)
+
+for FLINT_HOME in ${FLINT_HOME_PATH}
+ do
+ AS_IF([test -r "$FLINT_HOME/include/flint/flint.h"],[
+
+ AS_IF([ test "x$FLINT_HOME" != "x/usr" -a "x$FLINT_HOME" != "x/usr/local"],[
+ FLINT_CFLAGS="-I${FLINT_HOME}/include"
+ FLINT_LIBS="-L${FLINT_HOME}/lib -lflint"], [
+ FLINT_CFLAGS=
+ FLINT_LIBS="-lflint" ])
+
+ CXXFLAGS="${BACKUP_CXXFLAGS} ${FFLAS_FFPACK_CFLAGS} ${MPFR_CFLAGS} ${FLINT_CFLAGS}"
+ LIBS="${BACKUP_LIBS} ${FFLAS_FFPACK_LIBS} ${MPFR_LIBS} ${FLINT_LIBS}"
+
+ AC_TRY_LINK(
+ [ //extern "C" {
+ #define __GMP_BITS_PER_MP_LIMB GMP_LIMB_BITS
+ #include <flint/flint.h>
+ #include <flint/fmpz_mat.h>
+ //}
+ ],
+ [fmpz_mat_t a;],
+ [
+ AC_TRY_RUN(
+ [
+ #include "flint/flint.h"
+ int main () {
+ if ( (__FLINT_VERSION < 2) || ( (__FLINT_VERSION ==2) && (__FLINT_VERSION_MINOR < 4) ) )
+ return 1 ;
+ else
+ return 0;
+ }
+ ],[
+ flint_found="yes"
+ break
+ ],[
+ flint_problem="$problem $FLINT_HOME"
+ unset FLINT_CFLAGS
+ unset FLINT_LIBS
+ ],[
+ flint_found="yes"
+ flint_cross="yes"
+ break
+ ])
+ ],
+ [
+ flint_found="no"
+ flint_checked="$checked $FLINT_HOME"
+ unset FLINT_CFLAGS
+ unset FLINT_LIBS
+ ])
+ dnl AC_MSG_RESULT(found in $flint_checked ? $flint_found)
+ ],[
+ flint_found="no"
+ dnl AC_MSG_RESULT(not found at all $FLINT_HOME : $flint_found)
+ ])
+done
+
+AS_IF([test "x$flint_found" = "xyes"],[
+ AC_SUBST(FLINT_CFLAGS)
+ AC_SUBST(FLINT_LIBS)
+ AC_DEFINE(HAVE_FLINT,1,[Define if FLINT is installed])
+ HAVE_FLINT=yes
+ AS_IF([test "x$flint_cross" != "xyes"],
+ [AC_MSG_RESULT(found)],
+ [AC_MSG_RESULT(unknown)
+ echo "WARNING: You appear to be cross compiling, so there is no way to determine"
+ echo "whether your FLINT version is new enough. I am assuming it is."
+ ])
+ ifelse([$2], , :, [$2])],
+ [ test -n "$flint_problem" ],
+ [ AC_MSG_RESULT(problem)
+ echo "Sorry, your FLINT version is too old. Disabling."
+ ifelse([$3], , :, [$3]) ],
+ [ test "x$flint_found" = "xno" ],
+ [ AC_MSG_RESULT(>=2.4 not found )
+ ifelse([$3], , :, [$3])])
+
+AM_CONDITIONAL(LINBOX_HAVE_FLINT, test "x$HAVE_FLINT" = "xyes")
+
+CXXFLAGS=${BACKUP_CXXFLAGS}
+LIBS=${BACKUP_LIBS}
+#unset LD_LIBRARY_PATH
+
+])
diff --git a/macros/fplll-check.m4 b/macros/fplll-check.m4
index ccdb17a..16facba 100644
--- a/macros/fplll-check.m4
+++ b/macros/fplll-check.m4
@@ -39,7 +39,7 @@ AC_DEFUN([LB_CHECK_FPLLL],
AC_ARG_WITH(fplll,
[AC_HELP_STRING([--with-fplll=<path>|yes], [Use FPLLL library. This library is (not yet) mandatory for
- LinBox compilation. If argument is yes or <empty> or <bad> :)
+ LinBox compilation. If argument is yes or <empty>
that means the library is reachable with the standard
search path (/usr or /usr/local). Otherwise you give
the <path> to the directory which contains the
@@ -59,7 +59,9 @@ dnl Check for existence
BACKUP_CXXFLAGS=${CXXFLAGS}
BACKUP_LIBS=${LIBS}
-AC_MSG_CHECKING(for FPLLL)
+version_min=4.0.1
+AC_MSG_CHECKING(for FPLLL >= $version_min)
+
for FPLLL_HOME in ${FPLLL_HOME_PATH}
do
@@ -73,15 +75,14 @@ for FPLLL_HOME in ${FPLLL_HOME_PATH}
FPLLL_LIBS="-lfplll"
])
- CXXFLAGS="${BACKUP_CXXFLAGS} ${MPFR_CFLAGS} ${FPLLL_CFLAGS} ${GMP_CFLAGS}"
- LIBS="${BACKUP_LIBS} ${GMP_LIBS} ${MPFR_LIBS} ${FPLLL_LIBS} "
+ CXXFLAGS="${BACKUP_CXXFLAGS} ${MPFR_CFLAGS} ${FPLLL_CFLAGS} ${FFLAS_FFPACK_CFLAGS}"
+ LIBS="${BACKUP_LIBS} ${FFLAS_FFPACK_LIBS} ${MPFR_LIBS} ${FPLLL_LIBS} "
AC_TRY_LINK(
[
#include <fplll/fplll.h>
- #include <fplll/solver.h>
],
- [enum EvaluatorType a ;],
+ [enum fplll::MatPrintMode a ;],
[
AC_TRY_RUN(
[
diff --git a/macros/givaro-check.m4 b/macros/givaro-check.m4
deleted file mode 100644
index f4f2901..0000000
--- a/macros/givaro-check.m4
+++ /dev/null
@@ -1,144 +0,0 @@
-dnl Check for GIVARO
-dnl Copyright (c) the LinBox group
-dnl This file is part of LinBox
-
- dnl ========LICENCE========
- dnl This file is part of the library LinBox.
- dnl
- dnl LinBox is free software: you can redistribute it and/or modify
- dnl it under the terms of the GNU Lesser General Public
- dnl License as published by the Free Software Foundation; either
- dnl version 2.1 of the License, or (at your option) any later version.
- dnl
- dnl This library is distributed in the hope that it will be useful,
- dnl but WITHOUT ANY WARRANTY; without even the implied warranty of
- dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- dnl Lesser General Public License for more details.
- dnl
- dnl You should have received a copy of the GNU Lesser General Public
- dnl License along with this library; if not, write to the Free Software
- dnl Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- dnl ========LICENCE========
- dnl
-dnl Bradford Hovinen, 2001-06-13
-dnl Modified by Pascal Giorgi, 2003-12-03
-dnl Inspired by gnome-bonobo-check.m4 by Miguel de Icaza, 99-04-12
-dnl Stolen from Chris Lahey 99-2-5
-dnl stolen from Manish Singh again
-dnl stolen back from Frank Belew
-dnl stolen from Manish Singh
-dnl Shamelessly stolen from Owen Taylor
-
-dnl LB_CHECK_GIVARO ([MINIMUM-VERSION [, ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND]]])
-dnl
-dnl Test for Givaro and define GIVARO_CFLAGS and GIVARO_LIBS
-
-AC_DEFUN([LB_CHECK_GIVARO],
-[
-
-AC_ARG_WITH(givaro,
-[AC_HELP_STRING([--with-givaro=<path>|yes], [Use Givaro library. This library is mandatory for
- LinBox compilation. If argument is yes or <empty>
- that means the library is reachable with the standard
- search path (/usr or /usr/local). Otherwise you give
- the <path> to the directory which contains the
- library.
-])],
- [if test "$withval" = yes ; then
- GIVARO_HOME_PATH="${DEFAULT_CHECKING_PATH}"
- elif test "$withval" != no ; then
- GIVARO_HOME_PATH="$withval ${DEFAULT_CHECKING_PATH}"
- fi],
- [GIVARO_HOME_PATH="${DEFAULT_CHECKING_PATH}"])
-
-dnl -------------- dnl
-dnl GIVARO VERSION dnl
-dnl -------------- dnl
-
-version_min=30700
-version_max=30800
-
-dnl Check for existence
-
-BACKUP_CXXFLAGS=${CXXFLAGS}
-BACKUP_LIBS=${LIBS}
-
-AC_MSG_CHECKING(for GIVARO >= $version_min and < $version_max)
-
-for GIVARO_HOME in ${GIVARO_HOME_PATH}
- do
-if test -r "$GIVARO_HOME/include/givaro/givconfig.h"; then
-
- if test "x$GIVARO_HOME" != "x/usr" -a "x$GIVARO_HOME" != "x/usr/local"; then
- GIVARO_CFLAGS="-I${GIVARO_HOME}/include"
- GIVARO_LIBS="-L${GIVARO_HOME}/lib -lgivaro"
- else
- GIVARO_CFLAGS=
- GIVARO_LIBS="-lgivaro"
- fi
- CXXFLAGS="${BACKUP_CXXFLAGS} ${GIVARO_CFLAGS} ${GMP_CFLAGS}"
- LIBS="${BACKUP_LIBS} ${GIVARO_LIBS} ${GMP_LIBS}"
-
- AC_TRY_LINK(
- [#include <givaro/givinteger.h>],
- [Givaro::Integer a;],
- [
- AC_TRY_RUN(
- [#include <givaro/givconfig.h>
- int main () { if (GIVARO_VERSION < $version_min || GIVARO_VERSION >= $version_max || GIVARO_VERSION>0x030000) return -1; else return 0; /* old version of Givaro are defined as hexa 0x03yyzz*/ }
- ],[
- givaro_found="yes"
- break
- ],[
- givaro_problem="$problem $GIVARO_HOME"
- unset GIVARO_CFLAGS
- unset GIVARO_LIBS
- ],[
- givaro_found="yes"
- givaro_cross="yes"
-
- break
- ])
- ],
- [
- givaro_found="no"
- givaro_checked="$checked $GIVARO_HOME"
- unset GIVARO_CFLAGS
- unset GIVARO_LIBS
-
- ])
-else
- givaro_found="no"
-fi
-done
-
-if test "x$givaro_found" = "xyes" ; then
- AC_SUBST(GIVARO_CFLAGS)
- AC_SUBST(GIVARO_LIBS)
- dnl echo $GIVARO_CFLAGS $GIVARO_LIBS
- AC_DEFINE(HAVE_GIVARO,1,[Define if GIVARO is installed])
- HAVE_GIVARO=yes
- if test "x$givaro_cross" != "xyes"; then
- AC_MSG_RESULT(found)
- else
- AC_MSG_RESULT(unknown)
- echo "WARNING: You appear to be cross compiling, so there is no way to determine"
- echo "whether your GIVARO version is new enough. I am assuming it is."
- fi
- ifelse([$2], , :, [$2])
-elif test -n "$givaro_problem"; then
- AC_MSG_RESULT(problem)
- echo "Sorry, your GIVARO version is too old. Disabling."
- ifelse([$3], , :, [$3])
-elif test "x$givaro_found" = "xno" ; then
- AC_MSG_RESULT(not found)
- ifelse([$3], , :, [$3])
-fi
-
-AM_CONDITIONAL(LINBOX_HAVE_GIVARO, test "x$HAVE_GIVARO" = "xyes")
-
-CXXFLAGS=${BACKUP_CXXFLAGS}
-LIBS=${BACKUP_LIBS}
-#unset LD_LIBRARY_PATH
-
-])
diff --git a/macros/gmp-check.m4 b/macros/gmp-check.m4
deleted file mode 100644
index ce9b2b6..0000000
--- a/macros/gmp-check.m4
+++ /dev/null
@@ -1,175 +0,0 @@
-dnl Check for GMP
-dnl Copyright (c) the LinBox group
-dnl This file is part of LinBox
-
- dnl ========LICENCE========
- dnl This file is part of the library LinBox.
- dnl
- dnl LinBox is free software: you can redistribute it and/or modify
- dnl it under the terms of the GNU Lesser General Public
- dnl License as published by the Free Software Foundation; either
- dnl version 2.1 of the License, or (at your option) any later version.
- dnl
- dnl This library is distributed in the hope that it will be useful,
- dnl but WITHOUT ANY WARRANTY; without even the implied warranty of
- dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- dnl Lesser General Public License for more details.
- dnl
- dnl You should have received a copy of the GNU Lesser General Public
- dnl License along with this library; if not, write to the Free Software
- dnl Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- dnl ========LICENCE========
- dnl
-dnl Modified by Pascal Giorgi, 2003-12-03
-
-dnl LB_CHECK_GMP ([MINIMUM-VERSION [, ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND]]])
-dnl
-dnl Test for the GNU Multiprecision library and define GMP_CFLAGS and GMP_LIBS
-
-AC_DEFUN([LB_CHECK_GMP],
-[
-AC_ARG_WITH(gmp,
-[AC_HELP_STRING([--with-gmp= <path>|yes], [Use GMP library. This library is mandatory for LinBox
- compilation. If argument is yes or <empty> that means
- the library is reachable with the standard search path
- "/usr" or "/usr/local" (set as default). Otherwise you
- give the <path> to the directory which contain the
- library.
-])],
- [if test "$withval" = yes ; then
- GMP_HOME_PATH="${DEFAULT_CHECKING_PATH}"
- elif test "$withval" != no ; then
- GMP_HOME_PATH="$withval ${DEFAULT_CHECKING_PATH}"
- fi],
- [GMP_HOME_PATH="${DEFAULT_CHECKING_PATH}"])
-
-min_gmp_version=ifelse([$1], ,3.1.1,$1)
-
-dnl Check for existence
-BACKUP_CXXFLAGS=${CXXFLAGS}
-BACKUP_LIBS=${LIBS}
-
-AC_MSG_CHECKING(for GMP >= $min_gmp_version)
-
-for GMP_HOME in ${GMP_HOME_PATH}
- do
- if test -r "$GMP_HOME/include/gmp.h"; then
-
- if test "x$GMP_HOME" != "x/usr" -a "x$GMP_HOME" != "x/usr/local"; then
- GMP_CFLAGS="-I${GMP_HOME}/include"
- GMP_LIBS="-L${GMP_HOME}/lib -lgmpxx -lgmp"
- else
- GMP_CFLAGS=
- GMP_LIBS="-lgmpxx -lgmp"
- fi
-
- CXXFLAGS="${CXXFLAGS} ${GMP_CFLAGS}"
- LIBS="${LIBS} ${GMP_LIBS}"
-
- AC_TRY_LINK(
- [
-#ifdef __PATHCC__
-#include <rw/_defs.h>
-#include <ansi/_cstddef.h>
-#endif
-#include "stddef.h"
- #include <gmp.h>
- ],
- [mpz_t a; mpz_init (a);],
- [
- AC_TRY_RUN(
- [
-#ifdef __PATHCC__
-#include <rw/_defs.h>
- #include <ansi/_cstddef.h>
- #include "stddef.h"
-#endif
- #include <gmp.h>
- int main () { if (__GNU_MP_VERSION < 3) return -1; else return 0; }
- ],[
- AC_MSG_RESULT(found)
- AC_SUBST(GMP_CFLAGS)
- AC_SUBST(GMP_LIBS)
- AC_DEFINE(HAVE_GMP,1,[Define if GMP is installed])
- # See if we are running GMP 4.0
- AC_MSG_CHECKING(whether GMP is 4.0 or greater)
- AC_TRY_RUN(
- [
-#ifdef __PATHCC__
-#include <rw/_defs.h>
- #include <ansi/_cstddef.h>
- #include "stddef.h"
-#endif
-#include <gmp.h>
- int main () { if (__GNU_MP_VERSION < 4) return -1; else return 0; }
- ],[
- gmp_found="yes"
- AC_MSG_RESULT(yes)
- # See if GMP was compiled with --enable-cxx
- AC_MSG_CHECKING(whether GMP was compiled with --enable-cxx)
- AC_TRY_RUN(
- [#include <gmpxx.h>
- int main () { mpz_class a(2),b(3),c(5); if ( a+b == c ) return 0; else return -1; }
- ],[
- AC_MSG_RESULT(yes)
- GMP_VERSION=""
- AC_SUBST(GMP_VERSION)
- ],[
- gmp_found="no"
- AC_MSG_RESULT(no)
- ],[
- dnl This should never happen
- AC_MSG_RESULT(no)
- ])
- ],[
- AC_MSG_RESULT(no)
- AC_DEFINE(GMP_VERSION_3,1,[Define if GMP is version 3.xxx])
- GMP_VERSION="-DGMP_VERSION_3"
- AC_SUBST(GMP_VERSION)
- ],[
- dnl This should never happen
- AC_MSG_RESULT(no)
- ])
- ifelse([$2], , :, [$2])
- break
- ],[
- gmp_problem="$gmp_problem $GMP_HOME"
- unset GMP_CFLAGS
- unset GMP_LIBS
- ],[
- AC_MSG_RESULT(unknown)
- echo "WARNING: You appear to be cross compiling, so there is no way to determine"
- echo "whether your GMP version is new enough. I am assuming it is."
- AC_SUBST(GMP_CFLAGS)
- AC_SUBST(GMP_LIBS)
- AC_DEFINE(HAVE_GMP,1,[Define if GMP is installed])
- ifelse([$2], , :, [$2])
- break
- ])
- ],[
- gmp_found="no"
- unset GMP_CFLAGS
- unset GMP_LIBS
- ])
-
- else
- gmp_found="no"
- fi
-done
-
-if test "x$gmp_found" != "xyes"; then
- if test -n "$gmp_problem"; then
- AC_MSG_RESULT(problem)
- echo "Sorry, your GMP version is too old. Disabling."
- elif test "x$gmp_found" != "xno"; then
- AC_MSG_RESULT(not found)
- fi
- ifelse($3, , :, $3)
-fi
-
-
-CXXFLAGS=${BACKUP_CXXFLAGS}
-LIBS=${BACKUP_LIBS}
-#unset LD_LIBRARY_PATH
-
-])
diff --git a/macros/iml-check.m4 b/macros/iml-check.m4
index 14c4dc4..da4e6bc 100644
--- a/macros/iml-check.m4
+++ b/macros/iml-check.m4
@@ -73,8 +73,8 @@ for IML_HOME in ${IML_HOME_PATH}
IML_LIBS="-liml"
fi
- CXXFLAGS="${BACKUP_CXXFLAGS} ${IML_CFLAGS} ${GMP_CFLAGS}"
- LIBS="${BACKUP_LIBS} ${IML_LIBS} ${GMP_LIBS}"
+ CXXFLAGS="${BACKUP_CXXFLAGS} ${IML_CFLAGS} ${FFLAS_FFPACK_CFLAGS}"
+ LIBS="${BACKUP_LIBS} ${IML_LIBS} ${FFLAS_FFPACK_LIBS}"
AC_TRY_LINK(
[#include <gmp.h>
diff --git a/macros/lapack-check.m4 b/macros/lapack-check.m4
index 9d28a73..8b17078 100644
--- a/macros/lapack-check.m4
+++ b/macros/lapack-check.m4
@@ -1,7 +1,7 @@
dnl Check for LAPACK in fflas-ffpack
dnl
dnl Copyright (c) 2011 the LinBox group
-dnl Written by BB <bboyer at imag.fr>
+dnl Written by Brice Boyer (briceboyer) <boyer.brice at gmail.com>
dnl This file is part of LinBox
dnl ========LICENCE========
@@ -33,12 +33,12 @@ AC_MSG_CHECKING(for LAPACK in fflas-ffpack)
BACKUP_CXXFLAGS=${CXXFLAGS}
BACKUP_LIBS=${LIBS}
-CXXFLAGS="${BACKUP_CXXFLAGS} ${FFLAS_FFPACK_CFLAGS} ${BLAS_CFLAGS}"
-LIBS="${BACKUP_LIBS} ${BLAS_LIBS}"
+CXXFLAGS="${BACKUP_CXXFLAGS} ${FFLAS_FFPACK_CFLAGS}"
+LIBS="${BACKUP_LIBS} ${FFLAS_FFPACK_LIBS}"
AC_TRY_RUN(dnl ICC ?
[ #include "fflas-ffpack/fflas-ffpack-config.h"
- #ifdef __FFLAS_FFPACK_HAVE_LAPACK
+ #ifdef __FFLASFFPACK_HAVE_LAPACK
int main() { return 0 ; }
#else
a pas lapack
diff --git a/macros/libtool.m4 b/macros/libtool.m4
deleted file mode 100644
index bc28ccc..0000000
--- a/macros/libtool.m4
+++ /dev/null
@@ -1,7995 +0,0 @@
-# libtool.m4 - Configure libtool for the host system. -*-Autoconf-*-
-#
-# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005,
-# 2006, 2007, 2008, 2009, 2010, 2011 Free Software
-# Foundation, Inc.
-# Written by Gordon Matzigkeit, 1996
-#
-# This file is free software; the Free Software Foundation gives
-# unlimited permission to copy and/or distribute it, with or without
-# modifications, as long as this notice is preserved.
-
-m4_define([_LT_COPYING], [dnl
-# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005,
-# 2006, 2007, 2008, 2009, 2010, 2011 Free Software
-# Foundation, Inc.
-# Written by Gordon Matzigkeit, 1996
-#
-# This file is part of GNU Libtool.
-#
-# GNU Libtool 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.
-#
-# As a special exception to the GNU General Public License,
-# if you distribute this file as part of a program or library that
-# is built using GNU Libtool, you may include this file under the
-# same distribution terms that you use for the rest of that program.
-#
-# GNU Libtool 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 GNU Libtool; see the file COPYING. If not, a copy
-# can be downloaded from http://www.gnu.org/licenses/gpl.html, or
-# obtained by writing to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-])
-
-# serial 57 LT_INIT
-
-
-# LT_PREREQ(VERSION)
-# ------------------
-# Complain and exit if this libtool version is less that VERSION.
-m4_defun([LT_PREREQ],
-[m4_if(m4_version_compare(m4_defn([LT_PACKAGE_VERSION]), [$1]), -1,
- [m4_default([$3],
- [m4_fatal([Libtool version $1 or higher is required],
- 63)])],
- [$2])])
-
-
-# _LT_CHECK_BUILDDIR
-# ------------------
-# Complain if the absolute build directory name contains unusual characters
-m4_defun([_LT_CHECK_BUILDDIR],
-[case `pwd` in
- *\ * | *\ *)
- AC_MSG_WARN([Libtool does not cope well with whitespace in `pwd`]) ;;
-esac
-])
-
-
-# LT_INIT([OPTIONS])
-# ------------------
-AC_DEFUN([LT_INIT],
-[AC_PREREQ([2.58])dnl We use AC_INCLUDES_DEFAULT
-AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT])dnl
-AC_BEFORE([$0], [LT_LANG])dnl
-AC_BEFORE([$0], [LT_OUTPUT])dnl
-AC_BEFORE([$0], [LTDL_INIT])dnl
-m4_require([_LT_CHECK_BUILDDIR])dnl
-
-dnl Autoconf doesn't catch unexpanded LT_ macros by default:
-m4_pattern_forbid([^_?LT_[A-Z_]+$])dnl
-m4_pattern_allow([^(_LT_EOF|LT_DLGLOBAL|LT_DLLAZY_OR_NOW|LT_MULTI_MODULE)$])dnl
-dnl aclocal doesn't pull ltoptions.m4, ltsugar.m4, or ltversion.m4
-dnl unless we require an AC_DEFUNed macro:
-AC_REQUIRE([LTOPTIONS_VERSION])dnl
-AC_REQUIRE([LTSUGAR_VERSION])dnl
-AC_REQUIRE([LTVERSION_VERSION])dnl
-AC_REQUIRE([LTOBSOLETE_VERSION])dnl
-m4_require([_LT_PROG_LTMAIN])dnl
-
-_LT_SHELL_INIT([SHELL=${CONFIG_SHELL-/bin/sh}])
-
-dnl Parse OPTIONS
-_LT_SET_OPTIONS([$0], [$1])
-
-# This can be used to rebuild libtool when needed
-LIBTOOL_DEPS="$ltmain"
-
-# Always use our own libtool.
-LIBTOOL='$(SHELL) $(top_builddir)/libtool'
-AC_SUBST(LIBTOOL)dnl
-
-_LT_SETUP
-
-# Only expand once:
-m4_define([LT_INIT])
-])# LT_INIT
-
-# Old names:
-AU_ALIAS([AC_PROG_LIBTOOL], [LT_INIT])
-AU_ALIAS([AM_PROG_LIBTOOL], [LT_INIT])
-dnl aclocal-1.4 backwards compatibility:
-dnl AC_DEFUN([AC_PROG_LIBTOOL], [])
-dnl AC_DEFUN([AM_PROG_LIBTOOL], [])
-
-
-# _LT_CC_BASENAME(CC)
-# -------------------
-# Calculate cc_basename. Skip known compiler wrappers and cross-prefix.
-m4_defun([_LT_CC_BASENAME],
-[for cc_temp in $1""; do
- case $cc_temp in
- compile | *[[\\/]]compile | ccache | *[[\\/]]ccache ) ;;
- distcc | *[[\\/]]distcc | purify | *[[\\/]]purify ) ;;
- \-*) ;;
- *) break;;
- esac
-done
-cc_basename=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"`
-])
-
-
-# _LT_FILEUTILS_DEFAULTS
-# ----------------------
-# It is okay to use these file commands and assume they have been set
-# sensibly after `m4_require([_LT_FILEUTILS_DEFAULTS])'.
-m4_defun([_LT_FILEUTILS_DEFAULTS],
-[: ${CP="cp -f"}
-: ${MV="mv -f"}
-: ${RM="rm -f"}
-])# _LT_FILEUTILS_DEFAULTS
-
-
-# _LT_SETUP
-# ---------
-m4_defun([_LT_SETUP],
-[AC_REQUIRE([AC_CANONICAL_HOST])dnl
-AC_REQUIRE([AC_CANONICAL_BUILD])dnl
-AC_REQUIRE([_LT_PREPARE_SED_QUOTE_VARS])dnl
-AC_REQUIRE([_LT_PROG_ECHO_BACKSLASH])dnl
-
-_LT_DECL([], [PATH_SEPARATOR], [1], [The PATH separator for the build system])dnl
-dnl
-_LT_DECL([], [host_alias], [0], [The host system])dnl
-_LT_DECL([], [host], [0])dnl
-_LT_DECL([], [host_os], [0])dnl
-dnl
-_LT_DECL([], [build_alias], [0], [The build system])dnl
-_LT_DECL([], [build], [0])dnl
-_LT_DECL([], [build_os], [0])dnl
-dnl
-AC_REQUIRE([AC_PROG_CC])dnl
-AC_REQUIRE([LT_PATH_LD])dnl
-AC_REQUIRE([LT_PATH_NM])dnl
-dnl
-AC_REQUIRE([AC_PROG_LN_S])dnl
-test -z "$LN_S" && LN_S="ln -s"
-_LT_DECL([], [LN_S], [1], [Whether we need soft or hard links])dnl
-dnl
-AC_REQUIRE([LT_CMD_MAX_LEN])dnl
-_LT_DECL([objext], [ac_objext], [0], [Object file suffix (normally "o")])dnl
-_LT_DECL([], [exeext], [0], [Executable file suffix (normally "")])dnl
-dnl
-m4_require([_LT_FILEUTILS_DEFAULTS])dnl
-m4_require([_LT_CHECK_SHELL_FEATURES])dnl
-m4_require([_LT_PATH_CONVERSION_FUNCTIONS])dnl
-m4_require([_LT_CMD_RELOAD])dnl
-m4_require([_LT_CHECK_MAGIC_METHOD])dnl
-m4_require([_LT_CHECK_SHAREDLIB_FROM_LINKLIB])dnl
-m4_require([_LT_CMD_OLD_ARCHIVE])dnl
-m4_require([_LT_CMD_GLOBAL_SYMBOLS])dnl
-m4_require([_LT_WITH_SYSROOT])dnl
-
-_LT_CONFIG_LIBTOOL_INIT([
-# See if we are running on zsh, and set the options which allow our
-# commands through without removal of \ escapes INIT.
-if test -n "\${ZSH_VERSION+set}" ; then
- setopt NO_GLOB_SUBST
-fi
-])
-if test -n "${ZSH_VERSION+set}" ; then
- setopt NO_GLOB_SUBST
-fi
-
-_LT_CHECK_OBJDIR
-
-m4_require([_LT_TAG_COMPILER])dnl
-
-case $host_os in
-aix3*)
- # AIX sometimes has problems with the GCC collect2 program. For some
- # reason, if we set the COLLECT_NAMES environment variable, the problems
- # vanish in a puff of smoke.
- if test "X${COLLECT_NAMES+set}" != Xset; then
- COLLECT_NAMES=
- export COLLECT_NAMES
- fi
- ;;
-esac
-
-# Global variables:
-ofile=libtool
-can_build_shared=yes
-
-# All known linkers require a `.a' archive for static linking (except MSVC,
-# which needs '.lib').
-libext=a
-
-with_gnu_ld="$lt_cv_prog_gnu_ld"
-
-old_CC="$CC"
-old_CFLAGS="$CFLAGS"
-
-# Set sane defaults for various variables
-test -z "$CC" && CC=cc
-test -z "$LTCC" && LTCC=$CC
-test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS
-test -z "$LD" && LD=ld
-test -z "$ac_objext" && ac_objext=o
-
-_LT_CC_BASENAME([$compiler])
-
-# Only perform the check for file, if the check method requires it
-test -z "$MAGIC_CMD" && MAGIC_CMD=file
-case $deplibs_check_method in
-file_magic*)
- if test "$file_magic_cmd" = '$MAGIC_CMD'; then
- _LT_PATH_MAGIC
- fi
- ;;
-esac
-
-# Use C for the default configuration in the libtool script
-LT_SUPPORTED_TAG([CC])
-_LT_LANG_C_CONFIG
-_LT_LANG_DEFAULT_CONFIG
-_LT_CONFIG_COMMANDS
-])# _LT_SETUP
-
-
-# _LT_PREPARE_SED_QUOTE_VARS
-# --------------------------
-# Define a few sed substitution that help us do robust quoting.
-m4_defun([_LT_PREPARE_SED_QUOTE_VARS],
-[# Backslashify metacharacters that are still active within
-# double-quoted strings.
-sed_quote_subst='s/\([["`$\\]]\)/\\\1/g'
-
-# Same as above, but do not quote variable references.
-double_quote_subst='s/\([["`\\]]\)/\\\1/g'
-
-# Sed substitution to delay expansion of an escaped shell variable in a
-# double_quote_subst'ed string.
-delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g'
-
-# Sed substitution to delay expansion of an escaped single quote.
-delay_single_quote_subst='s/'\''/'\'\\\\\\\'\''/g'
-
-# Sed substitution to avoid accidental globbing in evaled expressions
-no_glob_subst='s/\*/\\\*/g'
-])
-
-# _LT_PROG_LTMAIN
-# ---------------
-# Note that this code is called both from `configure', and `config.status'
-# now that we use AC_CONFIG_COMMANDS to generate libtool. Notably,
-# `config.status' has no value for ac_aux_dir unless we are using Automake,
-# so we pass a copy along to make sure it has a sensible value anyway.
-m4_defun([_LT_PROG_LTMAIN],
-[m4_ifdef([AC_REQUIRE_AUX_FILE], [AC_REQUIRE_AUX_FILE([ltmain.sh])])dnl
-_LT_CONFIG_LIBTOOL_INIT([ac_aux_dir='$ac_aux_dir'])
-ltmain="$ac_aux_dir/ltmain.sh"
-])# _LT_PROG_LTMAIN
-
-
-## ------------------------------------- ##
-## Accumulate code for creating libtool. ##
-## ------------------------------------- ##
-
-# So that we can recreate a full libtool script including additional
-# tags, we accumulate the chunks of code to send to AC_CONFIG_COMMANDS
-# in macros and then make a single call at the end using the `libtool'
-# label.
-
-
-# _LT_CONFIG_LIBTOOL_INIT([INIT-COMMANDS])
-# ----------------------------------------
-# Register INIT-COMMANDS to be passed to AC_CONFIG_COMMANDS later.
-m4_define([_LT_CONFIG_LIBTOOL_INIT],
-[m4_ifval([$1],
- [m4_append([_LT_OUTPUT_LIBTOOL_INIT],
- [$1
-])])])
-
-# Initialize.
-m4_define([_LT_OUTPUT_LIBTOOL_INIT])
-
-
-# _LT_CONFIG_LIBTOOL([COMMANDS])
-# ------------------------------
-# Register COMMANDS to be passed to AC_CONFIG_COMMANDS later.
-m4_define([_LT_CONFIG_LIBTOOL],
-[m4_ifval([$1],
- [m4_append([_LT_OUTPUT_LIBTOOL_COMMANDS],
- [$1
-])])])
-
-# Initialize.
-m4_define([_LT_OUTPUT_LIBTOOL_COMMANDS])
-
-
-# _LT_CONFIG_SAVE_COMMANDS([COMMANDS], [INIT_COMMANDS])
-# -----------------------------------------------------
-m4_defun([_LT_CONFIG_SAVE_COMMANDS],
-[_LT_CONFIG_LIBTOOL([$1])
-_LT_CONFIG_LIBTOOL_INIT([$2])
-])
-
-
-# _LT_FORMAT_COMMENT([COMMENT])
-# -----------------------------
-# Add leading comment marks to the start of each line, and a trailing
-# full-stop to the whole comment if one is not present already.
-m4_define([_LT_FORMAT_COMMENT],
-[m4_ifval([$1], [
-m4_bpatsubst([m4_bpatsubst([$1], [^ *], [# ])],
- [['`$\]], [\\\&])]m4_bmatch([$1], [[!?.]$], [], [.])
-)])
-
-
-
-## ------------------------ ##
-## FIXME: Eliminate VARNAME ##
-## ------------------------ ##
-
-
-# _LT_DECL([CONFIGNAME], VARNAME, VALUE, [DESCRIPTION], [IS-TAGGED?])
-# -------------------------------------------------------------------
-# CONFIGNAME is the name given to the value in the libtool script.
-# VARNAME is the (base) name used in the configure script.
-# VALUE may be 0, 1 or 2 for a computed quote escaped value based on
-# VARNAME. Any other value will be used directly.
-m4_define([_LT_DECL],
-[lt_if_append_uniq([lt_decl_varnames], [$2], [, ],
- [lt_dict_add_subkey([lt_decl_dict], [$2], [libtool_name],
- [m4_ifval([$1], [$1], [$2])])
- lt_dict_add_subkey([lt_decl_dict], [$2], [value], [$3])
- m4_ifval([$4],
- [lt_dict_add_subkey([lt_decl_dict], [$2], [description], [$4])])
- lt_dict_add_subkey([lt_decl_dict], [$2],
- [tagged?], [m4_ifval([$5], [yes], [no])])])
-])
-
-
-# _LT_TAGDECL([CONFIGNAME], VARNAME, VALUE, [DESCRIPTION])
-# --------------------------------------------------------
-m4_define([_LT_TAGDECL], [_LT_DECL([$1], [$2], [$3], [$4], [yes])])
-
-
-# lt_decl_tag_varnames([SEPARATOR], [VARNAME1...])
-# ------------------------------------------------
-m4_define([lt_decl_tag_varnames],
-[_lt_decl_filter([tagged?], [yes], $@)])
-
-
-# _lt_decl_filter(SUBKEY, VALUE, [SEPARATOR], [VARNAME1..])
-# ---------------------------------------------------------
-m4_define([_lt_decl_filter],
-[m4_case([$#],
- [0], [m4_fatal([$0: too few arguments: $#])],
- [1], [m4_fatal([$0: too few arguments: $#: $1])],
- [2], [lt_dict_filter([lt_decl_dict], [$1], [$2], [], lt_decl_varnames)],
- [3], [lt_dict_filter([lt_decl_dict], [$1], [$2], [$3], lt_decl_varnames)],
- [lt_dict_filter([lt_decl_dict], $@)])[]dnl
-])
-
-
-# lt_decl_quote_varnames([SEPARATOR], [VARNAME1...])
-# --------------------------------------------------
-m4_define([lt_decl_quote_varnames],
-[_lt_decl_filter([value], [1], $@)])
-
-
-# lt_decl_dquote_varnames([SEPARATOR], [VARNAME1...])
-# ---------------------------------------------------
-m4_define([lt_decl_dquote_varnames],
-[_lt_decl_filter([value], [2], $@)])
-
-
-# lt_decl_varnames_tagged([SEPARATOR], [VARNAME1...])
-# ---------------------------------------------------
-m4_define([lt_decl_varnames_tagged],
-[m4_assert([$# <= 2])dnl
-_$0(m4_quote(m4_default([$1], [[, ]])),
- m4_ifval([$2], [[$2]], [m4_dquote(lt_decl_tag_varnames)]),
- m4_split(m4_normalize(m4_quote(_LT_TAGS)), [ ]))])
-m4_define([_lt_decl_varnames_tagged],
-[m4_ifval([$3], [lt_combine([$1], [$2], [_], $3)])])
-
-
-# lt_decl_all_varnames([SEPARATOR], [VARNAME1...])
-# ------------------------------------------------
-m4_define([lt_decl_all_varnames],
-[_$0(m4_quote(m4_default([$1], [[, ]])),
- m4_if([$2], [],
- m4_quote(lt_decl_varnames),
- m4_quote(m4_shift($@))))[]dnl
-])
-m4_define([_lt_decl_all_varnames],
-[lt_join($@, lt_decl_varnames_tagged([$1],
- lt_decl_tag_varnames([[, ]], m4_shift($@))))dnl
-])
-
-
-# _LT_CONFIG_STATUS_DECLARE([VARNAME])
-# ------------------------------------
-# Quote a variable value, and forward it to `config.status' so that its
-# declaration there will have the same value as in `configure'. VARNAME
-# must have a single quote delimited value for this to work.
-m4_define([_LT_CONFIG_STATUS_DECLARE],
-[$1='`$ECHO "$][$1" | $SED "$delay_single_quote_subst"`'])
-
-
-# _LT_CONFIG_STATUS_DECLARATIONS
-# ------------------------------
-# We delimit libtool config variables with single quotes, so when
-# we write them to config.status, we have to be sure to quote all
-# embedded single quotes properly. In configure, this macro expands
-# each variable declared with _LT_DECL (and _LT_TAGDECL) into:
-#
-# <var>='`$ECHO "$<var>" | $SED "$delay_single_quote_subst"`'
-m4_defun([_LT_CONFIG_STATUS_DECLARATIONS],
-[m4_foreach([_lt_var], m4_quote(lt_decl_all_varnames),
- [m4_n([_LT_CONFIG_STATUS_DECLARE(_lt_var)])])])
-
-
-# _LT_LIBTOOL_TAGS
-# ----------------
-# Output comment and list of tags supported by the script
-m4_defun([_LT_LIBTOOL_TAGS],
-[_LT_FORMAT_COMMENT([The names of the tagged configurations supported by this script])dnl
-available_tags="_LT_TAGS"dnl
-])
-
-
-# _LT_LIBTOOL_DECLARE(VARNAME, [TAG])
-# -----------------------------------
-# Extract the dictionary values for VARNAME (optionally with TAG) and
-# expand to a commented shell variable setting:
-#
-# # Some comment about what VAR is for.
-# visible_name=$lt_internal_name
-m4_define([_LT_LIBTOOL_DECLARE],
-[_LT_FORMAT_COMMENT(m4_quote(lt_dict_fetch([lt_decl_dict], [$1],
- [description])))[]dnl
-m4_pushdef([_libtool_name],
- m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [libtool_name])))[]dnl
-m4_case(m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [value])),
- [0], [_libtool_name=[$]$1],
- [1], [_libtool_name=$lt_[]$1],
- [2], [_libtool_name=$lt_[]$1],
- [_libtool_name=lt_dict_fetch([lt_decl_dict], [$1], [value])])[]dnl
-m4_ifval([$2], [_$2])[]m4_popdef([_libtool_name])[]dnl
-])
-
-
-# _LT_LIBTOOL_CONFIG_VARS
-# -----------------------
-# Produce commented declarations of non-tagged libtool config variables
-# suitable for insertion in the LIBTOOL CONFIG section of the `libtool'
-# script. Tagged libtool config variables (even for the LIBTOOL CONFIG
-# section) are produced by _LT_LIBTOOL_TAG_VARS.
-m4_defun([_LT_LIBTOOL_CONFIG_VARS],
-[m4_foreach([_lt_var],
- m4_quote(_lt_decl_filter([tagged?], [no], [], lt_decl_varnames)),
- [m4_n([_LT_LIBTOOL_DECLARE(_lt_var)])])])
-
-
-# _LT_LIBTOOL_TAG_VARS(TAG)
-# -------------------------
-m4_define([_LT_LIBTOOL_TAG_VARS],
-[m4_foreach([_lt_var], m4_quote(lt_decl_tag_varnames),
- [m4_n([_LT_LIBTOOL_DECLARE(_lt_var, [$1])])])])
-
-
-# _LT_TAGVAR(VARNAME, [TAGNAME])
-# ------------------------------
-m4_define([_LT_TAGVAR], [m4_ifval([$2], [$1_$2], [$1])])
-
-
-# _LT_CONFIG_COMMANDS
-# -------------------
-# Send accumulated output to $CONFIG_STATUS. Thanks to the lists of
-# variables for single and double quote escaping we saved from calls
-# to _LT_DECL, we can put quote escaped variables declarations
-# into `config.status', and then the shell code to quote escape them in
-# for loops in `config.status'. Finally, any additional code accumulated
-# from calls to _LT_CONFIG_LIBTOOL_INIT is expanded.
-m4_defun([_LT_CONFIG_COMMANDS],
-[AC_PROVIDE_IFELSE([LT_OUTPUT],
- dnl If the libtool generation code has been placed in $CONFIG_LT,
- dnl instead of duplicating it all over again into config.status,
- dnl then we will have config.status run $CONFIG_LT later, so it
- dnl needs to know what name is stored there:
- [AC_CONFIG_COMMANDS([libtool],
- [$SHELL $CONFIG_LT || AS_EXIT(1)], [CONFIG_LT='$CONFIG_LT'])],
- dnl If the libtool generation code is destined for config.status,
- dnl expand the accumulated commands and init code now:
- [AC_CONFIG_COMMANDS([libtool],
- [_LT_OUTPUT_LIBTOOL_COMMANDS], [_LT_OUTPUT_LIBTOOL_COMMANDS_INIT])])
-])#_LT_CONFIG_COMMANDS
-
-
-# Initialize.
-m4_define([_LT_OUTPUT_LIBTOOL_COMMANDS_INIT],
-[
-
-# The HP-UX ksh and POSIX shell print the target directory to stdout
-# if CDPATH is set.
-(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
-
-sed_quote_subst='$sed_quote_subst'
-double_quote_subst='$double_quote_subst'
-delay_variable_subst='$delay_variable_subst'
-_LT_CONFIG_STATUS_DECLARATIONS
-LTCC='$LTCC'
-LTCFLAGS='$LTCFLAGS'
-compiler='$compiler_DEFAULT'
-
-# A function that is used when there is no print builtin or printf.
-func_fallback_echo ()
-{
- eval 'cat <<_LTECHO_EOF
-\$[]1
-_LTECHO_EOF'
-}
-
-# Quote evaled strings.
-for var in lt_decl_all_varnames([[ \
-]], lt_decl_quote_varnames); do
- case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in
- *[[\\\\\\\`\\"\\\$]]*)
- eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED \\"\\\$sed_quote_subst\\"\\\`\\\\\\""
- ;;
- *)
- eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\""
- ;;
- esac
-done
-
-# Double-quote double-evaled strings.
-for var in lt_decl_all_varnames([[ \
-]], lt_decl_dquote_varnames); do
- case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in
- *[[\\\\\\\`\\"\\\$]]*)
- eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\""
- ;;
- *)
- eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\""
- ;;
- esac
-done
-
-_LT_OUTPUT_LIBTOOL_INIT
-])
-
-# _LT_GENERATED_FILE_INIT(FILE, [COMMENT])
-# ------------------------------------
-# Generate a child script FILE with all initialization necessary to
-# reuse the environment learned by the parent script, and make the
-# file executable. If COMMENT is supplied, it is inserted after the
-# `#!' sequence but before initialization text begins. After this
-# macro, additional text can be appended to FILE to form the body of
-# the child script. The macro ends with non-zero status if the
-# file could not be fully written (such as if the disk is full).
-m4_ifdef([AS_INIT_GENERATED],
-[m4_defun([_LT_GENERATED_FILE_INIT],[AS_INIT_GENERATED($@)])],
-[m4_defun([_LT_GENERATED_FILE_INIT],
-[m4_require([AS_PREPARE])]dnl
-[m4_pushdef([AS_MESSAGE_LOG_FD])]dnl
-[lt_write_fail=0
-cat >$1 <<_ASEOF || lt_write_fail=1
-#! $SHELL
-# Generated by $as_me.
-$2
-SHELL=\${CONFIG_SHELL-$SHELL}
-export SHELL
-_ASEOF
-cat >>$1 <<\_ASEOF || lt_write_fail=1
-AS_SHELL_SANITIZE
-_AS_PREPARE
-exec AS_MESSAGE_FD>&1
-_ASEOF
-test $lt_write_fail = 0 && chmod +x $1[]dnl
-m4_popdef([AS_MESSAGE_LOG_FD])])])# _LT_GENERATED_FILE_INIT
-
-# LT_OUTPUT
-# ---------
-# This macro allows early generation of the libtool script (before
-# AC_OUTPUT is called), incase it is used in configure for compilation
-# tests.
-AC_DEFUN([LT_OUTPUT],
-[: ${CONFIG_LT=./config.lt}
-AC_MSG_NOTICE([creating $CONFIG_LT])
-_LT_GENERATED_FILE_INIT(["$CONFIG_LT"],
-[# Run this file to recreate a libtool stub with the current configuration.])
-
-cat >>"$CONFIG_LT" <<\_LTEOF
-lt_cl_silent=false
-exec AS_MESSAGE_LOG_FD>>config.log
-{
- echo
- AS_BOX([Running $as_me.])
-} >&AS_MESSAGE_LOG_FD
-
-lt_cl_help="\
-\`$as_me' creates a local libtool stub from the current configuration,
-for use in further configure time tests before the real libtool is
-generated.
-
-Usage: $[0] [[OPTIONS]]
-
- -h, --help print this help, then exit
- -V, --version print version number, then exit
- -q, --quiet do not print progress messages
- -d, --debug don't remove temporary files
-
-Report bugs to <bug-libtool at gnu.org>."
-
-lt_cl_version="\
-m4_ifset([AC_PACKAGE_NAME], [AC_PACKAGE_NAME ])config.lt[]dnl
-m4_ifset([AC_PACKAGE_VERSION], [ AC_PACKAGE_VERSION])
-configured by $[0], generated by m4_PACKAGE_STRING.
-
-Copyright (C) 2011 Free Software Foundation, Inc.
-This config.lt script is free software; the Free Software Foundation
-gives unlimited permision to copy, distribute and modify it."
-
-while test $[#] != 0
-do
- case $[1] in
- --version | --v* | -V )
- echo "$lt_cl_version"; exit 0 ;;
- --help | --h* | -h )
- echo "$lt_cl_help"; exit 0 ;;
- --debug | --d* | -d )
- debug=: ;;
- --quiet | --q* | --silent | --s* | -q )
- lt_cl_silent=: ;;
-
- -*) AC_MSG_ERROR([unrecognized option: $[1]
-Try \`$[0] --help' for more information.]) ;;
-
- *) AC_MSG_ERROR([unrecognized argument: $[1]
-Try \`$[0] --help' for more information.]) ;;
- esac
- shift
-done
-
-if $lt_cl_silent; then
- exec AS_MESSAGE_FD>/dev/null
-fi
-_LTEOF
-
-cat >>"$CONFIG_LT" <<_LTEOF
-_LT_OUTPUT_LIBTOOL_COMMANDS_INIT
-_LTEOF
-
-cat >>"$CONFIG_LT" <<\_LTEOF
-AC_MSG_NOTICE([creating $ofile])
-_LT_OUTPUT_LIBTOOL_COMMANDS
-AS_EXIT(0)
-_LTEOF
-chmod +x "$CONFIG_LT"
-
-# configure is writing to config.log, but config.lt does its own redirection,
-# appending to config.log, which fails on DOS, as config.log is still kept
-# open by configure. Here we exec the FD to /dev/null, effectively closing
-# config.log, so it can be properly (re)opened and appended to by config.lt.
-lt_cl_success=:
-test "$silent" = yes &&
- lt_config_lt_args="$lt_config_lt_args --quiet"
-exec AS_MESSAGE_LOG_FD>/dev/null
-$SHELL "$CONFIG_LT" $lt_config_lt_args || lt_cl_success=false
-exec AS_MESSAGE_LOG_FD>>config.log
-$lt_cl_success || AS_EXIT(1)
-])# LT_OUTPUT
-
-
-# _LT_CONFIG(TAG)
-# ---------------
-# If TAG is the built-in tag, create an initial libtool script with a
-# default configuration from the untagged config vars. Otherwise add code
-# to config.status for appending the configuration named by TAG from the
-# matching tagged config vars.
-m4_defun([_LT_CONFIG],
-[m4_require([_LT_FILEUTILS_DEFAULTS])dnl
-_LT_CONFIG_SAVE_COMMANDS([
- m4_define([_LT_TAG], m4_if([$1], [], [C], [$1]))dnl
- m4_if(_LT_TAG, [C], [
- # See if we are running on zsh, and set the options which allow our
- # commands through without removal of \ escapes.
- if test -n "${ZSH_VERSION+set}" ; then
- setopt NO_GLOB_SUBST
- fi
-
- cfgfile="${ofile}T"
- trap "$RM \"$cfgfile\"; exit 1" 1 2 15
- $RM "$cfgfile"
-
- cat <<_LT_EOF >> "$cfgfile"
-#! $SHELL
-
-# `$ECHO "$ofile" | sed 's%^.*/%%'` - Provide generalized library-building support services.
-# Generated automatically by $as_me ($PACKAGE$TIMESTAMP) $VERSION
-# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`:
-# NOTE: Changes made to this file will be lost: look at ltmain.sh.
-#
-_LT_COPYING
-_LT_LIBTOOL_TAGS
-
-# ### BEGIN LIBTOOL CONFIG
-_LT_LIBTOOL_CONFIG_VARS
-_LT_LIBTOOL_TAG_VARS
-# ### END LIBTOOL CONFIG
-
-_LT_EOF
-
- case $host_os in
- aix3*)
- cat <<\_LT_EOF >> "$cfgfile"
-# AIX sometimes has problems with the GCC collect2 program. For some
-# reason, if we set the COLLECT_NAMES environment variable, the problems
-# vanish in a puff of smoke.
-if test "X${COLLECT_NAMES+set}" != Xset; then
- COLLECT_NAMES=
- export COLLECT_NAMES
-fi
-_LT_EOF
- ;;
- esac
-
- _LT_PROG_LTMAIN
-
- # We use sed instead of cat because bash on DJGPP gets confused if
- # if finds mixed CR/LF and LF-only lines. Since sed operates in
- # text mode, it properly converts lines to CR/LF. This bash problem
- # is reportedly fixed, but why not run on old versions too?
- sed '$q' "$ltmain" >> "$cfgfile" \
- || (rm -f "$cfgfile"; exit 1)
-
- _LT_PROG_REPLACE_SHELLFNS
-
- mv -f "$cfgfile" "$ofile" ||
- (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile")
- chmod +x "$ofile"
-],
-[cat <<_LT_EOF >> "$ofile"
-
-dnl Unfortunately we have to use $1 here, since _LT_TAG is not expanded
-dnl in a comment (ie after a #).
-# ### BEGIN LIBTOOL TAG CONFIG: $1
-_LT_LIBTOOL_TAG_VARS(_LT_TAG)
-# ### END LIBTOOL TAG CONFIG: $1
-_LT_EOF
-])dnl /m4_if
-],
-[m4_if([$1], [], [
- PACKAGE='$PACKAGE'
- VERSION='$VERSION'
- TIMESTAMP='$TIMESTAMP'
- RM='$RM'
- ofile='$ofile'], [])
-])dnl /_LT_CONFIG_SAVE_COMMANDS
-])# _LT_CONFIG
-
-
-# LT_SUPPORTED_TAG(TAG)
-# ---------------------
-# Trace this macro to discover what tags are supported by the libtool
-# --tag option, using:
-# autoconf --trace 'LT_SUPPORTED_TAG:$1'
-AC_DEFUN([LT_SUPPORTED_TAG], [])
-
-
-# C support is built-in for now
-m4_define([_LT_LANG_C_enabled], [])
-m4_define([_LT_TAGS], [])
-
-
-# LT_LANG(LANG)
-# -------------
-# Enable libtool support for the given language if not already enabled.
-AC_DEFUN([LT_LANG],
-[AC_BEFORE([$0], [LT_OUTPUT])dnl
-m4_case([$1],
- [C], [_LT_LANG(C)],
- [C++], [_LT_LANG(CXX)],
- [Go], [_LT_LANG(GO)],
- [Java], [_LT_LANG(GCJ)],
- [Fortran 77], [_LT_LANG(F77)],
- [Fortran], [_LT_LANG(FC)],
- [Windows Resource], [_LT_LANG(RC)],
- [m4_ifdef([_LT_LANG_]$1[_CONFIG],
- [_LT_LANG($1)],
- [m4_fatal([$0: unsupported language: "$1"])])])dnl
-])# LT_LANG
-
-
-# _LT_LANG(LANGNAME)
-# ------------------
-m4_defun([_LT_LANG],
-[m4_ifdef([_LT_LANG_]$1[_enabled], [],
- [LT_SUPPORTED_TAG([$1])dnl
- m4_append([_LT_TAGS], [$1 ])dnl
- m4_define([_LT_LANG_]$1[_enabled], [])dnl
- _LT_LANG_$1_CONFIG($1)])dnl
-])# _LT_LANG
-
-
-m4_ifndef([AC_PROG_GO], [
-############################################################
-# NOTE: This macro has been submitted for inclusion into #
-# GNU Autoconf as AC_PROG_GO. When it is available in #
-# a released version of Autoconf we should remove this #
-# macro and use it instead. #
-############################################################
-m4_defun([AC_PROG_GO],
-[AC_LANG_PUSH(Go)dnl
-AC_ARG_VAR([GOC], [Go compiler command])dnl
-AC_ARG_VAR([GOFLAGS], [Go compiler flags])dnl
-_AC_ARG_VAR_LDFLAGS()dnl
-AC_CHECK_TOOL(GOC, gccgo)
-if test -z "$GOC"; then
- if test -n "$ac_tool_prefix"; then
- AC_CHECK_PROG(GOC, [${ac_tool_prefix}gccgo], [${ac_tool_prefix}gccgo])
- fi
-fi
-if test -z "$GOC"; then
- AC_CHECK_PROG(GOC, gccgo, gccgo, false)
-fi
-])#m4_defun
-])#m4_ifndef
-
-
-# _LT_LANG_DEFAULT_CONFIG
-# -----------------------
-m4_defun([_LT_LANG_DEFAULT_CONFIG],
-[AC_PROVIDE_IFELSE([AC_PROG_CXX],
- [LT_LANG(CXX)],
- [m4_define([AC_PROG_CXX], defn([AC_PROG_CXX])[LT_LANG(CXX)])])
-
-AC_PROVIDE_IFELSE([AC_PROG_F77],
- [LT_LANG(F77)],
- [m4_define([AC_PROG_F77], defn([AC_PROG_F77])[LT_LANG(F77)])])
-
-AC_PROVIDE_IFELSE([AC_PROG_FC],
- [LT_LANG(FC)],
- [m4_define([AC_PROG_FC], defn([AC_PROG_FC])[LT_LANG(FC)])])
-
-dnl The call to [A][M_PROG_GCJ] is quoted like that to stop aclocal
-dnl pulling things in needlessly.
-AC_PROVIDE_IFELSE([AC_PROG_GCJ],
- [LT_LANG(GCJ)],
- [AC_PROVIDE_IFELSE([A][M_PROG_GCJ],
- [LT_LANG(GCJ)],
- [AC_PROVIDE_IFELSE([LT_PROG_GCJ],
- [LT_LANG(GCJ)],
- [m4_ifdef([AC_PROG_GCJ],
- [m4_define([AC_PROG_GCJ], defn([AC_PROG_GCJ])[LT_LANG(GCJ)])])
- m4_ifdef([A][M_PROG_GCJ],
- [m4_define([A][M_PROG_GCJ], defn([A][M_PROG_GCJ])[LT_LANG(GCJ)])])
- m4_ifdef([LT_PROG_GCJ],
- [m4_define([LT_PROG_GCJ], defn([LT_PROG_GCJ])[LT_LANG(GCJ)])])])])])
-
-AC_PROVIDE_IFELSE([AC_PROG_GO],
- [LT_LANG(GO)],
- [m4_define([AC_PROG_GO], defn([AC_PROG_GO])[LT_LANG(GO)])])
-
-AC_PROVIDE_IFELSE([LT_PROG_RC],
- [LT_LANG(RC)],
- [m4_define([LT_PROG_RC], defn([LT_PROG_RC])[LT_LANG(RC)])])
-])# _LT_LANG_DEFAULT_CONFIG
-
-# Obsolete macros:
-AU_DEFUN([AC_LIBTOOL_CXX], [LT_LANG(C++)])
-AU_DEFUN([AC_LIBTOOL_F77], [LT_LANG(Fortran 77)])
-AU_DEFUN([AC_LIBTOOL_FC], [LT_LANG(Fortran)])
-AU_DEFUN([AC_LIBTOOL_GCJ], [LT_LANG(Java)])
-AU_DEFUN([AC_LIBTOOL_RC], [LT_LANG(Windows Resource)])
-dnl aclocal-1.4 backwards compatibility:
-dnl AC_DEFUN([AC_LIBTOOL_CXX], [])
-dnl AC_DEFUN([AC_LIBTOOL_F77], [])
-dnl AC_DEFUN([AC_LIBTOOL_FC], [])
-dnl AC_DEFUN([AC_LIBTOOL_GCJ], [])
-dnl AC_DEFUN([AC_LIBTOOL_RC], [])
-
-
-# _LT_TAG_COMPILER
-# ----------------
-m4_defun([_LT_TAG_COMPILER],
-[AC_REQUIRE([AC_PROG_CC])dnl
-
-_LT_DECL([LTCC], [CC], [1], [A C compiler])dnl
-_LT_DECL([LTCFLAGS], [CFLAGS], [1], [LTCC compiler flags])dnl
-_LT_TAGDECL([CC], [compiler], [1], [A language specific compiler])dnl
-_LT_TAGDECL([with_gcc], [GCC], [0], [Is the compiler the GNU compiler?])dnl
-
-# If no C compiler was specified, use CC.
-LTCC=${LTCC-"$CC"}
-
-# If no C compiler flags were specified, use CFLAGS.
-LTCFLAGS=${LTCFLAGS-"$CFLAGS"}
-
-# Allow CC to be a program name with arguments.
-compiler=$CC
-])# _LT_TAG_COMPILER
-
-
-# _LT_COMPILER_BOILERPLATE
-# ------------------------
-# Check for compiler boilerplate output or warnings with
-# the simple compiler test code.
-m4_defun([_LT_COMPILER_BOILERPLATE],
-[m4_require([_LT_DECL_SED])dnl
-ac_outfile=conftest.$ac_objext
-echo "$lt_simple_compile_test_code" >conftest.$ac_ext
-eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
-_lt_compiler_boilerplate=`cat conftest.err`
-$RM conftest*
-])# _LT_COMPILER_BOILERPLATE
-
-
-# _LT_LINKER_BOILERPLATE
-# ----------------------
-# Check for linker boilerplate output or warnings with
-# the simple link test code.
-m4_defun([_LT_LINKER_BOILERPLATE],
-[m4_require([_LT_DECL_SED])dnl
-ac_outfile=conftest.$ac_objext
-echo "$lt_simple_link_test_code" >conftest.$ac_ext
-eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
-_lt_linker_boilerplate=`cat conftest.err`
-$RM -r conftest*
-])# _LT_LINKER_BOILERPLATE
-
-# _LT_REQUIRED_DARWIN_CHECKS
-# -------------------------
-m4_defun_once([_LT_REQUIRED_DARWIN_CHECKS],[
- case $host_os in
- rhapsody* | darwin*)
- AC_CHECK_TOOL([DSYMUTIL], [dsymutil], [:])
- AC_CHECK_TOOL([NMEDIT], [nmedit], [:])
- AC_CHECK_TOOL([LIPO], [lipo], [:])
- AC_CHECK_TOOL([OTOOL], [otool], [:])
- AC_CHECK_TOOL([OTOOL64], [otool64], [:])
- _LT_DECL([], [DSYMUTIL], [1],
- [Tool to manipulate archived DWARF debug symbol files on Mac OS X])
- _LT_DECL([], [NMEDIT], [1],
- [Tool to change global to local symbols on Mac OS X])
- _LT_DECL([], [LIPO], [1],
- [Tool to manipulate fat objects and archives on Mac OS X])
- _LT_DECL([], [OTOOL], [1],
- [ldd/readelf like tool for Mach-O binaries on Mac OS X])
- _LT_DECL([], [OTOOL64], [1],
- [ldd/readelf like tool for 64 bit Mach-O binaries on Mac OS X 10.4])
-
- AC_CACHE_CHECK([for -single_module linker flag],[lt_cv_apple_cc_single_mod],
- [lt_cv_apple_cc_single_mod=no
- if test -z "${LT_MULTI_MODULE}"; then
- # By default we will add the -single_module flag. You can override
- # by either setting the environment variable LT_MULTI_MODULE
- # non-empty at configure time, or by adding -multi_module to the
- # link flags.
- rm -rf libconftest.dylib*
- echo "int foo(void){return 1;}" > conftest.c
- echo "$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \
--dynamiclib -Wl,-single_module conftest.c" >&AS_MESSAGE_LOG_FD
- $LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \
- -dynamiclib -Wl,-single_module conftest.c 2>conftest.err
- _lt_result=$?
- # If there is a non-empty error log, and "single_module"
- # appears in it, assume the flag caused a linker warning
- if test -s conftest.err && $GREP single_module conftest.err; then
- cat conftest.err >&AS_MESSAGE_LOG_FD
- # Otherwise, if the output was created with a 0 exit code from
- # the compiler, it worked.
- elif test -f libconftest.dylib && test $_lt_result -eq 0; then
- lt_cv_apple_cc_single_mod=yes
- else
- cat conftest.err >&AS_MESSAGE_LOG_FD
- fi
- rm -rf libconftest.dylib*
- rm -f conftest.*
- fi])
-
- AC_CACHE_CHECK([for -exported_symbols_list linker flag],
- [lt_cv_ld_exported_symbols_list],
- [lt_cv_ld_exported_symbols_list=no
- save_LDFLAGS=$LDFLAGS
- echo "_main" > conftest.sym
- LDFLAGS="$LDFLAGS -Wl,-exported_symbols_list,conftest.sym"
- AC_LINK_IFELSE([AC_LANG_PROGRAM([],[])],
- [lt_cv_ld_exported_symbols_list=yes],
- [lt_cv_ld_exported_symbols_list=no])
- LDFLAGS="$save_LDFLAGS"
- ])
-
- AC_CACHE_CHECK([for -force_load linker flag],[lt_cv_ld_force_load],
- [lt_cv_ld_force_load=no
- cat > conftest.c << _LT_EOF
-int forced_loaded() { return 2;}
-_LT_EOF
- echo "$LTCC $LTCFLAGS -c -o conftest.o conftest.c" >&AS_MESSAGE_LOG_FD
- $LTCC $LTCFLAGS -c -o conftest.o conftest.c 2>&AS_MESSAGE_LOG_FD
- echo "$AR cru libconftest.a conftest.o" >&AS_MESSAGE_LOG_FD
- $AR cru libconftest.a conftest.o 2>&AS_MESSAGE_LOG_FD
- echo "$RANLIB libconftest.a" >&AS_MESSAGE_LOG_FD
- $RANLIB libconftest.a 2>&AS_MESSAGE_LOG_FD
- cat > conftest.c << _LT_EOF
-int main() { return 0;}
-_LT_EOF
- echo "$LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a" >&AS_MESSAGE_LOG_FD
- $LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a 2>conftest.err
- _lt_result=$?
- if test -s conftest.err && $GREP force_load conftest.err; then
- cat conftest.err >&AS_MESSAGE_LOG_FD
- elif test -f conftest && test $_lt_result -eq 0 && $GREP forced_load conftest >/dev/null 2>&1 ; then
- lt_cv_ld_force_load=yes
- else
- cat conftest.err >&AS_MESSAGE_LOG_FD
- fi
- rm -f conftest.err libconftest.a conftest conftest.c
- rm -rf conftest.dSYM
- ])
- case $host_os in
- rhapsody* | darwin1.[[012]])
- _lt_dar_allow_undefined='${wl}-undefined ${wl}suppress' ;;
- darwin1.*)
- _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;;
- darwin*) # darwin 5.x on
- # if running on 10.5 or later, the deployment target defaults
- # to the OS version, if on x86, and 10.4, the deployment
- # target defaults to 10.4. Don't you love it?
- case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in
- 10.0,*86*-darwin8*|10.0,*-darwin[[91]]*)
- _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;;
- 10.[[012]]*)
- _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;;
- 10.*)
- _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;;
- esac
- ;;
- esac
- if test "$lt_cv_apple_cc_single_mod" = "yes"; then
- _lt_dar_single_mod='$single_module'
- fi
- if test "$lt_cv_ld_exported_symbols_list" = "yes"; then
- _lt_dar_export_syms=' ${wl}-exported_symbols_list,$output_objdir/${libname}-symbols.expsym'
- else
- _lt_dar_export_syms='~$NMEDIT -s $output_objdir/${libname}-symbols.expsym ${lib}'
- fi
- if test "$DSYMUTIL" != ":" && test "$lt_cv_ld_force_load" = "no"; then
- _lt_dsymutil='~$DSYMUTIL $lib || :'
- else
- _lt_dsymutil=
- fi
- ;;
- esac
-])
-
-
-# _LT_DARWIN_LINKER_FEATURES([TAG])
-# ---------------------------------
-# Checks for linker and compiler features on darwin
-m4_defun([_LT_DARWIN_LINKER_FEATURES],
-[
- m4_require([_LT_REQUIRED_DARWIN_CHECKS])
- _LT_TAGVAR(archive_cmds_need_lc, $1)=no
- _LT_TAGVAR(hardcode_direct, $1)=no
- _LT_TAGVAR(hardcode_automatic, $1)=yes
- _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported
- if test "$lt_cv_ld_force_load" = "yes"; then
- _LT_TAGVAR(whole_archive_flag_spec, $1)='`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience ${wl}-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`'
- m4_case([$1], [F77], [_LT_TAGVAR(compiler_needs_object, $1)=yes],
- [FC], [_LT_TAGVAR(compiler_needs_object, $1)=yes])
- else
- _LT_TAGVAR(whole_archive_flag_spec, $1)=''
- fi
- _LT_TAGVAR(link_all_deplibs, $1)=yes
- _LT_TAGVAR(allow_undefined_flag, $1)="$_lt_dar_allow_undefined"
- case $cc_basename in
- ifort*) _lt_dar_can_shared=yes ;;
- *) _lt_dar_can_shared=$GCC ;;
- esac
- if test "$_lt_dar_can_shared" = "yes"; then
- output_verbose_link_cmd=func_echo_all
- _LT_TAGVAR(archive_cmds, $1)="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}"
- _LT_TAGVAR(module_cmds, $1)="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}"
- _LT_TAGVAR(archive_expsym_cmds, $1)="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}"
- _LT_TAGVAR(module_expsym_cmds, $1)="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}"
- m4_if([$1], [CXX],
-[ if test "$lt_cv_apple_cc_single_mod" != "yes"; then
- _LT_TAGVAR(archive_cmds, $1)="\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dsymutil}"
- _LT_TAGVAR(archive_expsym_cmds, $1)="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dar_export_syms}${_lt_dsymutil}"
- fi
-],[])
- else
- _LT_TAGVAR(ld_shlibs, $1)=no
- fi
-])
-
-# _LT_SYS_MODULE_PATH_AIX([TAGNAME])
-# ----------------------------------
-# Links a minimal program and checks the executable
-# for the system default hardcoded library path. In most cases,
-# this is /usr/lib:/lib, but when the MPI compilers are used
-# the location of the communication and MPI libs are included too.
-# If we don't find anything, use the default library path according
-# to the aix ld manual.
-# Store the results from the different compilers for each TAGNAME.
-# Allow to override them for all tags through lt_cv_aix_libpath.
-m4_defun([_LT_SYS_MODULE_PATH_AIX],
-[m4_require([_LT_DECL_SED])dnl
-if test "${lt_cv_aix_libpath+set}" = set; then
- aix_libpath=$lt_cv_aix_libpath
-else
- AC_CACHE_VAL([_LT_TAGVAR([lt_cv_aix_libpath_], [$1])],
- [AC_LINK_IFELSE([AC_LANG_PROGRAM],[
- lt_aix_libpath_sed='[
- /Import File Strings/,/^$/ {
- /^0/ {
- s/^0 *\([^ ]*\) *$/\1/
- p
- }
- }]'
- _LT_TAGVAR([lt_cv_aix_libpath_], [$1])=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
- # Check for a 64-bit object if we didn't find anything.
- if test -z "$_LT_TAGVAR([lt_cv_aix_libpath_], [$1])"; then
- _LT_TAGVAR([lt_cv_aix_libpath_], [$1])=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
- fi],[])
- if test -z "$_LT_TAGVAR([lt_cv_aix_libpath_], [$1])"; then
- _LT_TAGVAR([lt_cv_aix_libpath_], [$1])="/usr/lib:/lib"
- fi
- ])
- aix_libpath=$_LT_TAGVAR([lt_cv_aix_libpath_], [$1])
-fi
-])# _LT_SYS_MODULE_PATH_AIX
-
-
-# _LT_SHELL_INIT(ARG)
-# -------------------
-m4_define([_LT_SHELL_INIT],
-[m4_divert_text([M4SH-INIT], [$1
-])])# _LT_SHELL_INIT
-
-
-
-# _LT_PROG_ECHO_BACKSLASH
-# -----------------------
-# Find how we can fake an echo command that does not interpret backslash.
-# In particular, with Autoconf 2.60 or later we add some code to the start
-# of the generated configure script which will find a shell with a builtin
-# printf (which we can use as an echo command).
-m4_defun([_LT_PROG_ECHO_BACKSLASH],
-[ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
-ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO
-ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO
-
-AC_MSG_CHECKING([how to print strings])
-# Test print first, because it will be a builtin if present.
-if test "X`( print -r -- -n ) 2>/dev/null`" = X-n && \
- test "X`print -r -- $ECHO 2>/dev/null`" = "X$ECHO"; then
- ECHO='print -r --'
-elif test "X`printf %s $ECHO 2>/dev/null`" = "X$ECHO"; then
- ECHO='printf %s\n'
-else
- # Use this function as a fallback that always works.
- func_fallback_echo ()
- {
- eval 'cat <<_LTECHO_EOF
-$[]1
-_LTECHO_EOF'
- }
- ECHO='func_fallback_echo'
-fi
-
-# func_echo_all arg...
-# Invoke $ECHO with all args, space-separated.
-func_echo_all ()
-{
- $ECHO "$*"
-}
-
-case "$ECHO" in
- printf*) AC_MSG_RESULT([printf]) ;;
- print*) AC_MSG_RESULT([print -r]) ;;
- *) AC_MSG_RESULT([cat]) ;;
-esac
-
-m4_ifdef([_AS_DETECT_SUGGESTED],
-[_AS_DETECT_SUGGESTED([
- test -n "${ZSH_VERSION+set}${BASH_VERSION+set}" || (
- ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
- ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO
- ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO
- PATH=/empty FPATH=/empty; export PATH FPATH
- test "X`printf %s $ECHO`" = "X$ECHO" \
- || test "X`print -r -- $ECHO`" = "X$ECHO" )])])
-
-_LT_DECL([], [SHELL], [1], [Shell to use when invoking shell scripts])
-_LT_DECL([], [ECHO], [1], [An echo program that protects backslashes])
-])# _LT_PROG_ECHO_BACKSLASH
-
-
-# _LT_WITH_SYSROOT
-# ----------------
-AC_DEFUN([_LT_WITH_SYSROOT],
-[AC_MSG_CHECKING([for sysroot])
-AC_ARG_WITH([sysroot],
-[ --with-sysroot[=DIR] Search for dependent libraries within DIR
- (or the compiler's sysroot if not specified).],
-[], [with_sysroot=no])
-
-dnl lt_sysroot will always be passed unquoted. We quote it here
-dnl in case the user passed a directory name.
-lt_sysroot=
-case ${with_sysroot} in #(
- yes)
- if test "$GCC" = yes; then
- lt_sysroot=`$CC --print-sysroot 2>/dev/null`
- fi
- ;; #(
- /*)
- lt_sysroot=`echo "$with_sysroot" | sed -e "$sed_quote_subst"`
- ;; #(
- no|'')
- ;; #(
- *)
- AC_MSG_RESULT([${with_sysroot}])
- AC_MSG_ERROR([The sysroot must be an absolute path.])
- ;;
-esac
-
- AC_MSG_RESULT([${lt_sysroot:-no}])
-_LT_DECL([], [lt_sysroot], [0], [The root where to search for ]dnl
-[dependent libraries, and in which our libraries should be installed.])])
-
-# _LT_ENABLE_LOCK
-# ---------------
-m4_defun([_LT_ENABLE_LOCK],
-[AC_ARG_ENABLE([libtool-lock],
- [AS_HELP_STRING([--disable-libtool-lock],
- [avoid locking (might break parallel builds)])])
-test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes
-
-# Some flags need to be propagated to the compiler or linker for good
-# libtool support.
-case $host in
-ia64-*-hpux*)
- # Find out which ABI we are using.
- echo 'int i;' > conftest.$ac_ext
- if AC_TRY_EVAL(ac_compile); then
- case `/usr/bin/file conftest.$ac_objext` in
- *ELF-32*)
- HPUX_IA64_MODE="32"
- ;;
- *ELF-64*)
- HPUX_IA64_MODE="64"
- ;;
- esac
- fi
- rm -rf conftest*
- ;;
-*-*-irix6*)
- # Find out which ABI we are using.
- echo '[#]line '$LINENO' "configure"' > conftest.$ac_ext
- if AC_TRY_EVAL(ac_compile); then
- if test "$lt_cv_prog_gnu_ld" = yes; then
- case `/usr/bin/file conftest.$ac_objext` in
- *32-bit*)
- LD="${LD-ld} -melf32bsmip"
- ;;
- *N32*)
- LD="${LD-ld} -melf32bmipn32"
- ;;
- *64-bit*)
- LD="${LD-ld} -melf64bmip"
- ;;
- esac
- else
- case `/usr/bin/file conftest.$ac_objext` in
- *32-bit*)
- LD="${LD-ld} -32"
- ;;
- *N32*)
- LD="${LD-ld} -n32"
- ;;
- *64-bit*)
- LD="${LD-ld} -64"
- ;;
- esac
- fi
- fi
- rm -rf conftest*
- ;;
-
-x86_64-*kfreebsd*-gnu|x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*| \
-s390*-*linux*|s390*-*tpf*|sparc*-*linux*)
- # Find out which ABI we are using.
- echo 'int i;' > conftest.$ac_ext
- if AC_TRY_EVAL(ac_compile); then
- case `/usr/bin/file conftest.o` in
- *32-bit*)
- case $host in
- x86_64-*kfreebsd*-gnu)
- LD="${LD-ld} -m elf_i386_fbsd"
- ;;
- x86_64-*linux*)
- LD="${LD-ld} -m elf_i386"
- ;;
- ppc64-*linux*|powerpc64-*linux*)
- LD="${LD-ld} -m elf32ppclinux"
- ;;
- s390x-*linux*)
- LD="${LD-ld} -m elf_s390"
- ;;
- sparc64-*linux*)
- LD="${LD-ld} -m elf32_sparc"
- ;;
- esac
- ;;
- *64-bit*)
- case $host in
- x86_64-*kfreebsd*-gnu)
- LD="${LD-ld} -m elf_x86_64_fbsd"
- ;;
- x86_64-*linux*)
- LD="${LD-ld} -m elf_x86_64"
- ;;
- ppc*-*linux*|powerpc*-*linux*)
- LD="${LD-ld} -m elf64ppc"
- ;;
- s390*-*linux*|s390*-*tpf*)
- LD="${LD-ld} -m elf64_s390"
- ;;
- sparc*-*linux*)
- LD="${LD-ld} -m elf64_sparc"
- ;;
- esac
- ;;
- esac
- fi
- rm -rf conftest*
- ;;
-
-*-*-sco3.2v5*)
- # On SCO OpenServer 5, we need -belf to get full-featured binaries.
- SAVE_CFLAGS="$CFLAGS"
- CFLAGS="$CFLAGS -belf"
- AC_CACHE_CHECK([whether the C compiler needs -belf], lt_cv_cc_needs_belf,
- [AC_LANG_PUSH(C)
- AC_LINK_IFELSE([AC_LANG_PROGRAM([[]],[[]])],[lt_cv_cc_needs_belf=yes],[lt_cv_cc_needs_belf=no])
- AC_LANG_POP])
- if test x"$lt_cv_cc_needs_belf" != x"yes"; then
- # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf
- CFLAGS="$SAVE_CFLAGS"
- fi
- ;;
-*-*solaris*)
- # Find out which ABI we are using.
- echo 'int i;' > conftest.$ac_ext
- if AC_TRY_EVAL(ac_compile); then
- case `/usr/bin/file conftest.o` in
- *64-bit*)
- case $lt_cv_prog_gnu_ld in
- yes*)
- case $host in
- i?86-*-solaris*)
- LD="${LD-ld} -m elf_x86_64"
- ;;
- sparc*-*-solaris*)
- LD="${LD-ld} -m elf64_sparc"
- ;;
- esac
- # GNU ld 2.21 introduced _sol2 emulations. Use them if available.
- if ${LD-ld} -V | grep _sol2 >/dev/null 2>&1; then
- LD="${LD-ld}_sol2"
- fi
- ;;
- *)
- if ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then
- LD="${LD-ld} -64"
- fi
- ;;
- esac
- ;;
- esac
- fi
- rm -rf conftest*
- ;;
-esac
-
-need_locks="$enable_libtool_lock"
-])# _LT_ENABLE_LOCK
-
-
-# _LT_PROG_AR
-# -----------
-m4_defun([_LT_PROG_AR],
-[AC_CHECK_TOOLS(AR, [ar], false)
-: ${AR=ar}
-: ${AR_FLAGS=cru}
-_LT_DECL([], [AR], [1], [The archiver])
-_LT_DECL([], [AR_FLAGS], [1], [Flags to create an archive])
-
-AC_CACHE_CHECK([for archiver @FILE support], [lt_cv_ar_at_file],
- [lt_cv_ar_at_file=no
- AC_COMPILE_IFELSE([AC_LANG_PROGRAM],
- [echo conftest.$ac_objext > conftest.lst
- lt_ar_try='$AR $AR_FLAGS libconftest.a @conftest.lst >&AS_MESSAGE_LOG_FD'
- AC_TRY_EVAL([lt_ar_try])
- if test "$ac_status" -eq 0; then
- # Ensure the archiver fails upon bogus file names.
- rm -f conftest.$ac_objext libconftest.a
- AC_TRY_EVAL([lt_ar_try])
- if test "$ac_status" -ne 0; then
- lt_cv_ar_at_file=@
- fi
- fi
- rm -f conftest.* libconftest.a
- ])
- ])
-
-if test "x$lt_cv_ar_at_file" = xno; then
- archiver_list_spec=
-else
- archiver_list_spec=$lt_cv_ar_at_file
-fi
-_LT_DECL([], [archiver_list_spec], [1],
- [How to feed a file listing to the archiver])
-])# _LT_PROG_AR
-
-
-# _LT_CMD_OLD_ARCHIVE
-# -------------------
-m4_defun([_LT_CMD_OLD_ARCHIVE],
-[_LT_PROG_AR
-
-AC_CHECK_TOOL(STRIP, strip, :)
-test -z "$STRIP" && STRIP=:
-_LT_DECL([], [STRIP], [1], [A symbol stripping program])
-
-AC_CHECK_TOOL(RANLIB, ranlib, :)
-test -z "$RANLIB" && RANLIB=:
-_LT_DECL([], [RANLIB], [1],
- [Commands used to install an old-style archive])
-
-# Determine commands to create old-style static archives.
-old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs'
-old_postinstall_cmds='chmod 644 $oldlib'
-old_postuninstall_cmds=
-
-if test -n "$RANLIB"; then
- case $host_os in
- openbsd*)
- old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$tool_oldlib"
- ;;
- *)
- old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$tool_oldlib"
- ;;
- esac
- old_archive_cmds="$old_archive_cmds~\$RANLIB \$tool_oldlib"
-fi
-
-case $host_os in
- darwin*)
- lock_old_archive_extraction=yes ;;
- *)
- lock_old_archive_extraction=no ;;
-esac
-_LT_DECL([], [old_postinstall_cmds], [2])
-_LT_DECL([], [old_postuninstall_cmds], [2])
-_LT_TAGDECL([], [old_archive_cmds], [2],
- [Commands used to build an old-style archive])
-_LT_DECL([], [lock_old_archive_extraction], [0],
- [Whether to use a lock for old archive extraction])
-])# _LT_CMD_OLD_ARCHIVE
-
-
-# _LT_COMPILER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS,
-# [OUTPUT-FILE], [ACTION-SUCCESS], [ACTION-FAILURE])
-# ----------------------------------------------------------------
-# Check whether the given compiler option works
-AC_DEFUN([_LT_COMPILER_OPTION],
-[m4_require([_LT_FILEUTILS_DEFAULTS])dnl
-m4_require([_LT_DECL_SED])dnl
-AC_CACHE_CHECK([$1], [$2],
- [$2=no
- m4_if([$4], , [ac_outfile=conftest.$ac_objext], [ac_outfile=$4])
- echo "$lt_simple_compile_test_code" > conftest.$ac_ext
- lt_compiler_flag="$3"
- # Insert the option either (1) after the last *FLAGS variable, or
- # (2) before a word containing "conftest.", or (3) at the end.
- # Note that $ac_compile itself does not contain backslashes and begins
- # with a dollar sign (not a hyphen), so the echo should work correctly.
- # The option is referenced via a variable to avoid confusing sed.
- lt_compile=`echo "$ac_compile" | $SED \
- -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
- -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \
- -e 's:$: $lt_compiler_flag:'`
- (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&AS_MESSAGE_LOG_FD)
- (eval "$lt_compile" 2>conftest.err)
- ac_status=$?
- cat conftest.err >&AS_MESSAGE_LOG_FD
- echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD
- if (exit $ac_status) && test -s "$ac_outfile"; then
- # The compiler can only warn and ignore the option if not recognized
- # So say no if there are warnings other than the usual output.
- $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp
- $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
- if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then
- $2=yes
- fi
- fi
- $RM conftest*
-])
-
-if test x"[$]$2" = xyes; then
- m4_if([$5], , :, [$5])
-else
- m4_if([$6], , :, [$6])
-fi
-])# _LT_COMPILER_OPTION
-
-# Old name:
-AU_ALIAS([AC_LIBTOOL_COMPILER_OPTION], [_LT_COMPILER_OPTION])
-dnl aclocal-1.4 backwards compatibility:
-dnl AC_DEFUN([AC_LIBTOOL_COMPILER_OPTION], [])
-
-
-# _LT_LINKER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS,
-# [ACTION-SUCCESS], [ACTION-FAILURE])
-# ----------------------------------------------------
-# Check whether the given linker option works
-AC_DEFUN([_LT_LINKER_OPTION],
-[m4_require([_LT_FILEUTILS_DEFAULTS])dnl
-m4_require([_LT_DECL_SED])dnl
-AC_CACHE_CHECK([$1], [$2],
- [$2=no
- save_LDFLAGS="$LDFLAGS"
- LDFLAGS="$LDFLAGS $3"
- echo "$lt_simple_link_test_code" > conftest.$ac_ext
- if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then
- # The linker can only warn and ignore the option if not recognized
- # So say no if there are warnings
- if test -s conftest.err; then
- # Append any errors to the config.log.
- cat conftest.err 1>&AS_MESSAGE_LOG_FD
- $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp
- $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
- if diff conftest.exp conftest.er2 >/dev/null; then
- $2=yes
- fi
- else
- $2=yes
- fi
- fi
- $RM -r conftest*
- LDFLAGS="$save_LDFLAGS"
-])
-
-if test x"[$]$2" = xyes; then
- m4_if([$4], , :, [$4])
-else
- m4_if([$5], , :, [$5])
-fi
-])# _LT_LINKER_OPTION
-
-# Old name:
-AU_ALIAS([AC_LIBTOOL_LINKER_OPTION], [_LT_LINKER_OPTION])
-dnl aclocal-1.4 backwards compatibility:
-dnl AC_DEFUN([AC_LIBTOOL_LINKER_OPTION], [])
-
-
-# LT_CMD_MAX_LEN
-#---------------
-AC_DEFUN([LT_CMD_MAX_LEN],
-[AC_REQUIRE([AC_CANONICAL_HOST])dnl
-# find the maximum length of command line arguments
-AC_MSG_CHECKING([the maximum length of command line arguments])
-AC_CACHE_VAL([lt_cv_sys_max_cmd_len], [dnl
- i=0
- teststring="ABCD"
-
- case $build_os in
- msdosdjgpp*)
- # On DJGPP, this test can blow up pretty badly due to problems in libc
- # (any single argument exceeding 2000 bytes causes a buffer overrun
- # during glob expansion). Even if it were fixed, the result of this
- # check would be larger than it should be.
- lt_cv_sys_max_cmd_len=12288; # 12K is about right
- ;;
-
- gnu*)
- # Under GNU Hurd, this test is not required because there is
- # no limit to the length of command line arguments.
- # Libtool will interpret -1 as no limit whatsoever
- lt_cv_sys_max_cmd_len=-1;
- ;;
-
- cygwin* | mingw* | cegcc*)
- # On Win9x/ME, this test blows up -- it succeeds, but takes
- # about 5 minutes as the teststring grows exponentially.
- # Worse, since 9x/ME are not pre-emptively multitasking,
- # you end up with a "frozen" computer, even though with patience
- # the test eventually succeeds (with a max line length of 256k).
- # Instead, let's just punt: use the minimum linelength reported by
- # all of the supported platforms: 8192 (on NT/2K/XP).
- lt_cv_sys_max_cmd_len=8192;
- ;;
-
- mint*)
- # On MiNT this can take a long time and run out of memory.
- lt_cv_sys_max_cmd_len=8192;
- ;;
-
- amigaos*)
- # On AmigaOS with pdksh, this test takes hours, literally.
- # So we just punt and use a minimum line length of 8192.
- lt_cv_sys_max_cmd_len=8192;
- ;;
-
- netbsd* | freebsd* | openbsd* | darwin* | dragonfly*)
- # This has been around since 386BSD, at least. Likely further.
- if test -x /sbin/sysctl; then
- lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax`
- elif test -x /usr/sbin/sysctl; then
- lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax`
- else
- lt_cv_sys_max_cmd_len=65536 # usable default for all BSDs
- fi
- # And add a safety zone
- lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4`
- lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3`
- ;;
-
- interix*)
- # We know the value 262144 and hardcode it with a safety zone (like BSD)
- lt_cv_sys_max_cmd_len=196608
- ;;
-
- os2*)
- # The test takes a long time on OS/2.
- lt_cv_sys_max_cmd_len=8192
- ;;
-
- osf*)
- # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure
- # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not
- # nice to cause kernel panics so lets avoid the loop below.
- # First set a reasonable default.
- lt_cv_sys_max_cmd_len=16384
- #
- if test -x /sbin/sysconfig; then
- case `/sbin/sysconfig -q proc exec_disable_arg_limit` in
- *1*) lt_cv_sys_max_cmd_len=-1 ;;
- esac
- fi
- ;;
- sco3.2v5*)
- lt_cv_sys_max_cmd_len=102400
- ;;
- sysv5* | sco5v6* | sysv4.2uw2*)
- kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null`
- if test -n "$kargmax"; then
- lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[[ ]]//'`
- else
- lt_cv_sys_max_cmd_len=32768
- fi
- ;;
- *)
- lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null`
- if test -n "$lt_cv_sys_max_cmd_len"; then
- lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4`
- lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3`
- else
- # Make teststring a little bigger before we do anything with it.
- # a 1K string should be a reasonable start.
- for i in 1 2 3 4 5 6 7 8 ; do
- teststring=$teststring$teststring
- done
- SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}}
- # If test is not a shell built-in, we'll probably end up computing a
- # maximum length that is only half of the actual maximum length, but
- # we can't tell.
- while { test "X"`env echo "$teststring$teststring" 2>/dev/null` \
- = "X$teststring$teststring"; } >/dev/null 2>&1 &&
- test $i != 17 # 1/2 MB should be enough
- do
- i=`expr $i + 1`
- teststring=$teststring$teststring
- done
- # Only check the string length outside the loop.
- lt_cv_sys_max_cmd_len=`expr "X$teststring" : ".*" 2>&1`
- teststring=
- # Add a significant safety factor because C++ compilers can tack on
- # massive amounts of additional arguments before passing them to the
- # linker. It appears as though 1/2 is a usable value.
- lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2`
- fi
- ;;
- esac
-])
-if test -n $lt_cv_sys_max_cmd_len ; then
- AC_MSG_RESULT($lt_cv_sys_max_cmd_len)
-else
- AC_MSG_RESULT(none)
-fi
-max_cmd_len=$lt_cv_sys_max_cmd_len
-_LT_DECL([], [max_cmd_len], [0],
- [What is the maximum length of a command?])
-])# LT_CMD_MAX_LEN
-
-# Old name:
-AU_ALIAS([AC_LIBTOOL_SYS_MAX_CMD_LEN], [LT_CMD_MAX_LEN])
-dnl aclocal-1.4 backwards compatibility:
-dnl AC_DEFUN([AC_LIBTOOL_SYS_MAX_CMD_LEN], [])
-
-
-# _LT_HEADER_DLFCN
-# ----------------
-m4_defun([_LT_HEADER_DLFCN],
-[AC_CHECK_HEADERS([dlfcn.h], [], [], [AC_INCLUDES_DEFAULT])dnl
-])# _LT_HEADER_DLFCN
-
-
-# _LT_TRY_DLOPEN_SELF (ACTION-IF-TRUE, ACTION-IF-TRUE-W-USCORE,
-# ACTION-IF-FALSE, ACTION-IF-CROSS-COMPILING)
-# ----------------------------------------------------------------
-m4_defun([_LT_TRY_DLOPEN_SELF],
-[m4_require([_LT_HEADER_DLFCN])dnl
-if test "$cross_compiling" = yes; then :
- [$4]
-else
- lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
- lt_status=$lt_dlunknown
- cat > conftest.$ac_ext <<_LT_EOF
-[#line $LINENO "configure"
-#include "confdefs.h"
-
-#if HAVE_DLFCN_H
-#include <dlfcn.h>
-#endif
-
-#include <stdio.h>
-
-#ifdef RTLD_GLOBAL
-# define LT_DLGLOBAL RTLD_GLOBAL
-#else
-# ifdef DL_GLOBAL
-# define LT_DLGLOBAL DL_GLOBAL
-# else
-# define LT_DLGLOBAL 0
-# endif
-#endif
-
-/* We may have to define LT_DLLAZY_OR_NOW in the command line if we
- find out it does not work in some platform. */
-#ifndef LT_DLLAZY_OR_NOW
-# ifdef RTLD_LAZY
-# define LT_DLLAZY_OR_NOW RTLD_LAZY
-# else
-# ifdef DL_LAZY
-# define LT_DLLAZY_OR_NOW DL_LAZY
-# else
-# ifdef RTLD_NOW
-# define LT_DLLAZY_OR_NOW RTLD_NOW
-# else
-# ifdef DL_NOW
-# define LT_DLLAZY_OR_NOW DL_NOW
-# else
-# define LT_DLLAZY_OR_NOW 0
-# endif
-# endif
-# endif
-# endif
-#endif
-
-/* When -fvisbility=hidden is used, assume the code has been annotated
- correspondingly for the symbols needed. */
-#if defined(__GNUC__) && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3))
-int fnord () __attribute__((visibility("default")));
-#endif
-
-int fnord () { return 42; }
-int main ()
-{
- void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW);
- int status = $lt_dlunknown;
-
- if (self)
- {
- if (dlsym (self,"fnord")) status = $lt_dlno_uscore;
- else
- {
- if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore;
- else puts (dlerror ());
- }
- /* dlclose (self); */
- }
- else
- puts (dlerror ());
-
- return status;
-}]
-_LT_EOF
- if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext} 2>/dev/null; then
- (./conftest; exit; ) >&AS_MESSAGE_LOG_FD 2>/dev/null
- lt_status=$?
- case x$lt_status in
- x$lt_dlno_uscore) $1 ;;
- x$lt_dlneed_uscore) $2 ;;
- x$lt_dlunknown|x*) $3 ;;
- esac
- else :
- # compilation failed
- $3
- fi
-fi
-rm -fr conftest*
-])# _LT_TRY_DLOPEN_SELF
-
-
-# LT_SYS_DLOPEN_SELF
-# ------------------
-AC_DEFUN([LT_SYS_DLOPEN_SELF],
-[m4_require([_LT_HEADER_DLFCN])dnl
-if test "x$enable_dlopen" != xyes; then
- enable_dlopen=unknown
- enable_dlopen_self=unknown
- enable_dlopen_self_static=unknown
-else
- lt_cv_dlopen=no
- lt_cv_dlopen_libs=
-
- case $host_os in
- beos*)
- lt_cv_dlopen="load_add_on"
- lt_cv_dlopen_libs=
- lt_cv_dlopen_self=yes
- ;;
-
- mingw* | pw32* | cegcc*)
- lt_cv_dlopen="LoadLibrary"
- lt_cv_dlopen_libs=
- ;;
-
- cygwin*)
- lt_cv_dlopen="dlopen"
- lt_cv_dlopen_libs=
- ;;
-
- darwin*)
- # if libdl is installed we need to link against it
- AC_CHECK_LIB([dl], [dlopen],
- [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"],[
- lt_cv_dlopen="dyld"
- lt_cv_dlopen_libs=
- lt_cv_dlopen_self=yes
- ])
- ;;
-
- *)
- AC_CHECK_FUNC([shl_load],
- [lt_cv_dlopen="shl_load"],
- [AC_CHECK_LIB([dld], [shl_load],
- [lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-ldld"],
- [AC_CHECK_FUNC([dlopen],
- [lt_cv_dlopen="dlopen"],
- [AC_CHECK_LIB([dl], [dlopen],
- [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"],
- [AC_CHECK_LIB([svld], [dlopen],
- [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld"],
- [AC_CHECK_LIB([dld], [dld_link],
- [lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-ldld"])
- ])
- ])
- ])
- ])
- ])
- ;;
- esac
-
- if test "x$lt_cv_dlopen" != xno; then
- enable_dlopen=yes
- else
- enable_dlopen=no
- fi
-
- case $lt_cv_dlopen in
- dlopen)
- save_CPPFLAGS="$CPPFLAGS"
- test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H"
-
- save_LDFLAGS="$LDFLAGS"
- wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\"
-
- save_LIBS="$LIBS"
- LIBS="$lt_cv_dlopen_libs $LIBS"
-
- AC_CACHE_CHECK([whether a program can dlopen itself],
- lt_cv_dlopen_self, [dnl
- _LT_TRY_DLOPEN_SELF(
- lt_cv_dlopen_self=yes, lt_cv_dlopen_self=yes,
- lt_cv_dlopen_self=no, lt_cv_dlopen_self=cross)
- ])
-
- if test "x$lt_cv_dlopen_self" = xyes; then
- wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\"
- AC_CACHE_CHECK([whether a statically linked program can dlopen itself],
- lt_cv_dlopen_self_static, [dnl
- _LT_TRY_DLOPEN_SELF(
- lt_cv_dlopen_self_static=yes, lt_cv_dlopen_self_static=yes,
- lt_cv_dlopen_self_static=no, lt_cv_dlopen_self_static=cross)
- ])
- fi
-
- CPPFLAGS="$save_CPPFLAGS"
- LDFLAGS="$save_LDFLAGS"
- LIBS="$save_LIBS"
- ;;
- esac
-
- case $lt_cv_dlopen_self in
- yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;;
- *) enable_dlopen_self=unknown ;;
- esac
-
- case $lt_cv_dlopen_self_static in
- yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;;
- *) enable_dlopen_self_static=unknown ;;
- esac
-fi
-_LT_DECL([dlopen_support], [enable_dlopen], [0],
- [Whether dlopen is supported])
-_LT_DECL([dlopen_self], [enable_dlopen_self], [0],
- [Whether dlopen of programs is supported])
-_LT_DECL([dlopen_self_static], [enable_dlopen_self_static], [0],
- [Whether dlopen of statically linked programs is supported])
-])# LT_SYS_DLOPEN_SELF
-
-# Old name:
-AU_ALIAS([AC_LIBTOOL_DLOPEN_SELF], [LT_SYS_DLOPEN_SELF])
-dnl aclocal-1.4 backwards compatibility:
-dnl AC_DEFUN([AC_LIBTOOL_DLOPEN_SELF], [])
-
-
-# _LT_COMPILER_C_O([TAGNAME])
-# ---------------------------
-# Check to see if options -c and -o are simultaneously supported by compiler.
-# This macro does not hard code the compiler like AC_PROG_CC_C_O.
-m4_defun([_LT_COMPILER_C_O],
-[m4_require([_LT_DECL_SED])dnl
-m4_require([_LT_FILEUTILS_DEFAULTS])dnl
-m4_require([_LT_TAG_COMPILER])dnl
-AC_CACHE_CHECK([if $compiler supports -c -o file.$ac_objext],
- [_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)],
- [_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=no
- $RM -r conftest 2>/dev/null
- mkdir conftest
- cd conftest
- mkdir out
- echo "$lt_simple_compile_test_code" > conftest.$ac_ext
-
- lt_compiler_flag="-o out/conftest2.$ac_objext"
- # Insert the option either (1) after the last *FLAGS variable, or
- # (2) before a word containing "conftest.", or (3) at the end.
- # Note that $ac_compile itself does not contain backslashes and begins
- # with a dollar sign (not a hyphen), so the echo should work correctly.
- lt_compile=`echo "$ac_compile" | $SED \
- -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
- -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \
- -e 's:$: $lt_compiler_flag:'`
- (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&AS_MESSAGE_LOG_FD)
- (eval "$lt_compile" 2>out/conftest.err)
- ac_status=$?
- cat out/conftest.err >&AS_MESSAGE_LOG_FD
- echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD
- if (exit $ac_status) && test -s out/conftest2.$ac_objext
- then
- # The compiler can only warn and ignore the option if not recognized
- # So say no if there are warnings
- $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp
- $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2
- if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then
- _LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes
- fi
- fi
- chmod u+w . 2>&AS_MESSAGE_LOG_FD
- $RM conftest*
- # SGI C++ compiler will create directory out/ii_files/ for
- # template instantiation
- test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files
- $RM out/* && rmdir out
- cd ..
- $RM -r conftest
- $RM conftest*
-])
-_LT_TAGDECL([compiler_c_o], [lt_cv_prog_compiler_c_o], [1],
- [Does compiler simultaneously support -c and -o options?])
-])# _LT_COMPILER_C_O
-
-
-# _LT_COMPILER_FILE_LOCKS([TAGNAME])
-# ----------------------------------
-# Check to see if we can do hard links to lock some files if needed
-m4_defun([_LT_COMPILER_FILE_LOCKS],
-[m4_require([_LT_ENABLE_LOCK])dnl
-m4_require([_LT_FILEUTILS_DEFAULTS])dnl
-_LT_COMPILER_C_O([$1])
-
-hard_links="nottested"
-if test "$_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)" = no && test "$need_locks" != no; then
- # do not overwrite the value of need_locks provided by the user
- AC_MSG_CHECKING([if we can lock with hard links])
- hard_links=yes
- $RM conftest*
- ln conftest.a conftest.b 2>/dev/null && hard_links=no
- touch conftest.a
- ln conftest.a conftest.b 2>&5 || hard_links=no
- ln conftest.a conftest.b 2>/dev/null && hard_links=no
- AC_MSG_RESULT([$hard_links])
- if test "$hard_links" = no; then
- AC_MSG_WARN([`$CC' does not support `-c -o', so `make -j' may be unsafe])
- need_locks=warn
- fi
-else
- need_locks=no
-fi
-_LT_DECL([], [need_locks], [1], [Must we lock files when doing compilation?])
-])# _LT_COMPILER_FILE_LOCKS
-
-
-# _LT_CHECK_OBJDIR
-# ----------------
-m4_defun([_LT_CHECK_OBJDIR],
-[AC_CACHE_CHECK([for objdir], [lt_cv_objdir],
-[rm -f .libs 2>/dev/null
-mkdir .libs 2>/dev/null
-if test -d .libs; then
- lt_cv_objdir=.libs
-else
- # MS-DOS does not allow filenames that begin with a dot.
- lt_cv_objdir=_libs
-fi
-rmdir .libs 2>/dev/null])
-objdir=$lt_cv_objdir
-_LT_DECL([], [objdir], [0],
- [The name of the directory that contains temporary libtool files])dnl
-m4_pattern_allow([LT_OBJDIR])dnl
-AC_DEFINE_UNQUOTED(LT_OBJDIR, "$lt_cv_objdir/",
- [Define to the sub-directory in which libtool stores uninstalled libraries.])
-])# _LT_CHECK_OBJDIR
-
-
-# _LT_LINKER_HARDCODE_LIBPATH([TAGNAME])
-# --------------------------------------
-# Check hardcoding attributes.
-m4_defun([_LT_LINKER_HARDCODE_LIBPATH],
-[AC_MSG_CHECKING([how to hardcode library paths into programs])
-_LT_TAGVAR(hardcode_action, $1)=
-if test -n "$_LT_TAGVAR(hardcode_libdir_flag_spec, $1)" ||
- test -n "$_LT_TAGVAR(runpath_var, $1)" ||
- test "X$_LT_TAGVAR(hardcode_automatic, $1)" = "Xyes" ; then
-
- # We can hardcode non-existent directories.
- if test "$_LT_TAGVAR(hardcode_direct, $1)" != no &&
- # If the only mechanism to avoid hardcoding is shlibpath_var, we
- # have to relink, otherwise we might link with an installed library
- # when we should be linking with a yet-to-be-installed one
- ## test "$_LT_TAGVAR(hardcode_shlibpath_var, $1)" != no &&
- test "$_LT_TAGVAR(hardcode_minus_L, $1)" != no; then
- # Linking always hardcodes the temporary library directory.
- _LT_TAGVAR(hardcode_action, $1)=relink
- else
- # We can link without hardcoding, and we can hardcode nonexisting dirs.
- _LT_TAGVAR(hardcode_action, $1)=immediate
- fi
-else
- # We cannot hardcode anything, or else we can only hardcode existing
- # directories.
- _LT_TAGVAR(hardcode_action, $1)=unsupported
-fi
-AC_MSG_RESULT([$_LT_TAGVAR(hardcode_action, $1)])
-
-if test "$_LT_TAGVAR(hardcode_action, $1)" = relink ||
- test "$_LT_TAGVAR(inherit_rpath, $1)" = yes; then
- # Fast installation is not supported
- enable_fast_install=no
-elif test "$shlibpath_overrides_runpath" = yes ||
- test "$enable_shared" = no; then
- # Fast installation is not necessary
- enable_fast_install=needless
-fi
-_LT_TAGDECL([], [hardcode_action], [0],
- [How to hardcode a shared library path into an executable])
-])# _LT_LINKER_HARDCODE_LIBPATH
-
-
-# _LT_CMD_STRIPLIB
-# ----------------
-m4_defun([_LT_CMD_STRIPLIB],
-[m4_require([_LT_DECL_EGREP])
-striplib=
-old_striplib=
-AC_MSG_CHECKING([whether stripping libraries is possible])
-if test -n "$STRIP" && $STRIP -V 2>&1 | $GREP "GNU strip" >/dev/null; then
- test -z "$old_striplib" && old_striplib="$STRIP --strip-debug"
- test -z "$striplib" && striplib="$STRIP --strip-unneeded"
- AC_MSG_RESULT([yes])
-else
-# FIXME - insert some real tests, host_os isn't really good enough
- case $host_os in
- darwin*)
- if test -n "$STRIP" ; then
- striplib="$STRIP -x"
- old_striplib="$STRIP -S"
- AC_MSG_RESULT([yes])
- else
- AC_MSG_RESULT([no])
- fi
- ;;
- *)
- AC_MSG_RESULT([no])
- ;;
- esac
-fi
-_LT_DECL([], [old_striplib], [1], [Commands to strip libraries])
-_LT_DECL([], [striplib], [1])
-])# _LT_CMD_STRIPLIB
-
-
-# _LT_SYS_DYNAMIC_LINKER([TAG])
-# -----------------------------
-# PORTME Fill in your ld.so characteristics
-m4_defun([_LT_SYS_DYNAMIC_LINKER],
-[AC_REQUIRE([AC_CANONICAL_HOST])dnl
-m4_require([_LT_DECL_EGREP])dnl
-m4_require([_LT_FILEUTILS_DEFAULTS])dnl
-m4_require([_LT_DECL_OBJDUMP])dnl
-m4_require([_LT_DECL_SED])dnl
-m4_require([_LT_CHECK_SHELL_FEATURES])dnl
-AC_MSG_CHECKING([dynamic linker characteristics])
-m4_if([$1],
- [], [
-if test "$GCC" = yes; then
- case $host_os in
- darwin*) lt_awk_arg="/^libraries:/,/LR/" ;;
- *) lt_awk_arg="/^libraries:/" ;;
- esac
- case $host_os in
- mingw* | cegcc*) lt_sed_strip_eq="s,=\([[A-Za-z]]:\),\1,g" ;;
- *) lt_sed_strip_eq="s,=/,/,g" ;;
- esac
- lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e $lt_sed_strip_eq`
- case $lt_search_path_spec in
- *\;*)
- # if the path contains ";" then we assume it to be the separator
- # otherwise default to the standard path separator (i.e. ":") - it is
- # assumed that no part of a normal pathname contains ";" but that should
- # okay in the real world where ";" in dirpaths is itself problematic.
- lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED 's/;/ /g'`
- ;;
- *)
- lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED "s/$PATH_SEPARATOR/ /g"`
- ;;
- esac
- # Ok, now we have the path, separated by spaces, we can step through it
- # and add multilib dir if necessary.
- lt_tmp_lt_search_path_spec=
- lt_multi_os_dir=`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null`
- for lt_sys_path in $lt_search_path_spec; do
- if test -d "$lt_sys_path/$lt_multi_os_dir"; then
- lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path/$lt_multi_os_dir"
- else
- test -d "$lt_sys_path" && \
- lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path"
- fi
- done
- lt_search_path_spec=`$ECHO "$lt_tmp_lt_search_path_spec" | awk '
-BEGIN {RS=" "; FS="/|\n";} {
- lt_foo="";
- lt_count=0;
- for (lt_i = NF; lt_i > 0; lt_i--) {
- if ($lt_i != "" && $lt_i != ".") {
- if ($lt_i == "..") {
- lt_count++;
- } else {
- if (lt_count == 0) {
- lt_foo="/" $lt_i lt_foo;
- } else {
- lt_count--;
- }
- }
- }
- }
- if (lt_foo != "") { lt_freq[[lt_foo]]++; }
- if (lt_freq[[lt_foo]] == 1) { print lt_foo; }
-}'`
- # AWK program above erroneously prepends '/' to C:/dos/paths
- # for these hosts.
- case $host_os in
- mingw* | cegcc*) lt_search_path_spec=`$ECHO "$lt_search_path_spec" |\
- $SED 's,/\([[A-Za-z]]:\),\1,g'` ;;
- esac
- sys_lib_search_path_spec=`$ECHO "$lt_search_path_spec" | $lt_NL2SP`
-else
- sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib"
-fi])
-library_names_spec=
-libname_spec='lib$name'
-soname_spec=
-shrext_cmds=".so"
-postinstall_cmds=
-postuninstall_cmds=
-finish_cmds=
-finish_eval=
-shlibpath_var=
-shlibpath_overrides_runpath=unknown
-version_type=none
-dynamic_linker="$host_os ld.so"
-sys_lib_dlsearch_path_spec="/lib /usr/lib"
-need_lib_prefix=unknown
-hardcode_into_libs=no
-
-# when you set need_version to no, make sure it does not cause -set_version
-# flags to be left without arguments
-need_version=unknown
-
-case $host_os in
-aix3*)
- version_type=linux # correct to gnu/linux during the next big refactor
- library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a'
- shlibpath_var=LIBPATH
-
- # AIX 3 has no versioning support, so we append a major version to the name.
- soname_spec='${libname}${release}${shared_ext}$major'
- ;;
-
-aix[[4-9]]*)
- version_type=linux # correct to gnu/linux during the next big refactor
- need_lib_prefix=no
- need_version=no
- hardcode_into_libs=yes
- if test "$host_cpu" = ia64; then
- # AIX 5 supports IA64
- library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}'
- shlibpath_var=LD_LIBRARY_PATH
- else
- # With GCC up to 2.95.x, collect2 would create an import file
- # for dependence libraries. The import file would start with
- # the line `#! .'. This would cause the generated library to
- # depend on `.', always an invalid library. This was fixed in
- # development snapshots of GCC prior to 3.0.
- case $host_os in
- aix4 | aix4.[[01]] | aix4.[[01]].*)
- if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)'
- echo ' yes '
- echo '#endif'; } | ${CC} -E - | $GREP yes > /dev/null; then
- :
- else
- can_build_shared=no
- fi
- ;;
- esac
- # AIX (on Power*) has no versioning support, so currently we can not hardcode correct
- # soname into executable. Probably we can add versioning support to
- # collect2, so additional links can be useful in future.
- if test "$aix_use_runtimelinking" = yes; then
- # If using run time linking (on AIX 4.2 or later) use lib<name>.so
- # instead of lib<name>.a to let people know that these are not
- # typical AIX shared libraries.
- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
- else
- # We preserve .a as extension for shared libraries through AIX4.2
- # and later when we are not doing run time linking.
- library_names_spec='${libname}${release}.a $libname.a'
- soname_spec='${libname}${release}${shared_ext}$major'
- fi
- shlibpath_var=LIBPATH
- fi
- ;;
-
-amigaos*)
- case $host_cpu in
- powerpc)
- # Since July 2007 AmigaOS4 officially supports .so libraries.
- # When compiling the executable, add -use-dynld -Lsobjs: to the compileline.
- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
- ;;
- m68k)
- library_names_spec='$libname.ixlibrary $libname.a'
- # Create ${libname}_ixlibrary.a entries in /sys/libs.
- finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([[^/]]*\)\.ixlibrary$%\1%'\''`; test $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done'
- ;;
- esac
- ;;
-
-beos*)
- library_names_spec='${libname}${shared_ext}'
- dynamic_linker="$host_os ld.so"
- shlibpath_var=LIBRARY_PATH
- ;;
-
-bsdi[[45]]*)
- version_type=linux # correct to gnu/linux during the next big refactor
- need_version=no
- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
- soname_spec='${libname}${release}${shared_ext}$major'
- finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir'
- shlibpath_var=LD_LIBRARY_PATH
- sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib"
- sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib"
- # the default ld.so.conf also contains /usr/contrib/lib and
- # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow
- # libtool to hard-code these into programs
- ;;
-
-cygwin* | mingw* | pw32* | cegcc*)
- version_type=windows
- shrext_cmds=".dll"
- need_version=no
- need_lib_prefix=no
-
- case $GCC,$cc_basename in
- yes,*)
- # gcc
- library_names_spec='$libname.dll.a'
- # DLL is installed to $(libdir)/../bin by postinstall_cmds
- postinstall_cmds='base_file=`basename \${file}`~
- dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~
- dldir=$destdir/`dirname \$dlpath`~
- test -d \$dldir || mkdir -p \$dldir~
- $install_prog $dir/$dlname \$dldir/$dlname~
- chmod a+x \$dldir/$dlname~
- if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then
- eval '\''$striplib \$dldir/$dlname'\'' || exit \$?;
- fi'
- postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~
- dlpath=$dir/\$dldll~
- $RM \$dlpath'
- shlibpath_overrides_runpath=yes
-
- case $host_os in
- cygwin*)
- # Cygwin DLLs use 'cyg' prefix rather than 'lib'
- soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}'
-m4_if([$1], [],[
- sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/lib/w32api"])
- ;;
- mingw* | cegcc*)
- # MinGW DLLs use traditional 'lib' prefix
- soname_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}'
- ;;
- pw32*)
- # pw32 DLLs use 'pw' prefix rather than 'lib'
- library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}'
- ;;
- esac
- dynamic_linker='Win32 ld.exe'
- ;;
-
- *,cl*)
- # Native MSVC
- libname_spec='$name'
- soname_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}'
- library_names_spec='${libname}.dll.lib'
-
- case $build_os in
- mingw*)
- sys_lib_search_path_spec=
- lt_save_ifs=$IFS
- IFS=';'
- for lt_path in $LIB
- do
- IFS=$lt_save_ifs
- # Let DOS variable expansion print the short 8.3 style file name.
- lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"`
- sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path"
- done
- IFS=$lt_save_ifs
- # Convert to MSYS style.
- sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([[a-zA-Z]]\\):| /\\1|g' -e 's|^ ||'`
- ;;
- cygwin*)
- # Convert to unix form, then to dos form, then back to unix form
- # but this time dos style (no spaces!) so that the unix form looks
- # like /cygdrive/c/PROGRA~1:/cygdr...
- sys_lib_search_path_spec=`cygpath --path --unix "$LIB"`
- sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null`
- sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"`
- ;;
- *)
- sys_lib_search_path_spec="$LIB"
- if $ECHO "$sys_lib_search_path_spec" | [$GREP ';[c-zC-Z]:/' >/dev/null]; then
- # It is most probably a Windows format PATH.
- sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'`
- else
- sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"`
- fi
- # FIXME: find the short name or the path components, as spaces are
- # common. (e.g. "Program Files" -> "PROGRA~1")
- ;;
- esac
-
- # DLL is installed to $(libdir)/../bin by postinstall_cmds
- postinstall_cmds='base_file=`basename \${file}`~
- dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~
- dldir=$destdir/`dirname \$dlpath`~
- test -d \$dldir || mkdir -p \$dldir~
- $install_prog $dir/$dlname \$dldir/$dlname'
- postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~
- dlpath=$dir/\$dldll~
- $RM \$dlpath'
- shlibpath_overrides_runpath=yes
- dynamic_linker='Win32 link.exe'
- ;;
-
- *)
- # Assume MSVC wrapper
- library_names_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext} $libname.lib'
- dynamic_linker='Win32 ld.exe'
- ;;
- esac
- # FIXME: first we should search . and the directory the executable is in
- shlibpath_var=PATH
- ;;
-
-darwin* | rhapsody*)
- dynamic_linker="$host_os dyld"
- version_type=darwin
- need_lib_prefix=no
- need_version=no
- library_names_spec='${libname}${release}${major}$shared_ext ${libname}$shared_ext'
- soname_spec='${libname}${release}${major}$shared_ext'
- shlibpath_overrides_runpath=yes
- shlibpath_var=DYLD_LIBRARY_PATH
- shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`'
-m4_if([$1], [],[
- sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/local/lib"])
- sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib'
- ;;
-
-dgux*)
- version_type=linux # correct to gnu/linux during the next big refactor
- need_lib_prefix=no
- need_version=no
- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext'
- soname_spec='${libname}${release}${shared_ext}$major'
- shlibpath_var=LD_LIBRARY_PATH
- ;;
-
-freebsd* | dragonfly*)
- # DragonFly does not have aout. When/if they implement a new
- # versioning mechanism, adjust this.
- if test -x /usr/bin/objformat; then
- objformat=`/usr/bin/objformat`
- else
- case $host_os in
- freebsd[[23]].*) objformat=aout ;;
- *) objformat=elf ;;
- esac
- fi
- # Handle Gentoo/FreeBSD as it was Linux
- case $host_vendor in
- gentoo)
- version_type=linux ;;
- *)
- version_type=freebsd-$objformat ;;
- esac
-
- case $version_type in
- freebsd-elf*)
- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}'
- need_version=no
- need_lib_prefix=no
- ;;
- freebsd-*)
- library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix'
- need_version=yes
- ;;
- linux)
- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
- soname_spec='${libname}${release}${shared_ext}$major'
- need_lib_prefix=no
- need_version=no
- ;;
- esac
- shlibpath_var=LD_LIBRARY_PATH
- case $host_os in
- freebsd2.*)
- shlibpath_overrides_runpath=yes
- ;;
- freebsd3.[[01]]* | freebsdelf3.[[01]]*)
- shlibpath_overrides_runpath=yes
- hardcode_into_libs=yes
- ;;
- freebsd3.[[2-9]]* | freebsdelf3.[[2-9]]* | \
- freebsd4.[[0-5]] | freebsdelf4.[[0-5]] | freebsd4.1.1 | freebsdelf4.1.1)
- shlibpath_overrides_runpath=no
- hardcode_into_libs=yes
- ;;
- *) # from 4.6 on, and DragonFly
- shlibpath_overrides_runpath=yes
- hardcode_into_libs=yes
- ;;
- esac
- ;;
-
-gnu*)
- version_type=linux # correct to gnu/linux during the next big refactor
- need_lib_prefix=no
- need_version=no
- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}'
- soname_spec='${libname}${release}${shared_ext}$major'
- shlibpath_var=LD_LIBRARY_PATH
- shlibpath_overrides_runpath=no
- hardcode_into_libs=yes
- ;;
-
-haiku*)
- version_type=linux # correct to gnu/linux during the next big refactor
- need_lib_prefix=no
- need_version=no
- dynamic_linker="$host_os runtime_loader"
- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}'
- soname_spec='${libname}${release}${shared_ext}$major'
- shlibpath_var=LIBRARY_PATH
- shlibpath_overrides_runpath=yes
- sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib'
- hardcode_into_libs=yes
- ;;
-
-hpux9* | hpux10* | hpux11*)
- # Give a soname corresponding to the major version so that dld.sl refuses to
- # link against other versions.
- version_type=sunos
- need_lib_prefix=no
- need_version=no
- case $host_cpu in
- ia64*)
- shrext_cmds='.so'
- hardcode_into_libs=yes
- dynamic_linker="$host_os dld.so"
- shlibpath_var=LD_LIBRARY_PATH
- shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
- soname_spec='${libname}${release}${shared_ext}$major'
- if test "X$HPUX_IA64_MODE" = X32; then
- sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib"
- else
- sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64"
- fi
- sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
- ;;
- hppa*64*)
- shrext_cmds='.sl'
- hardcode_into_libs=yes
- dynamic_linker="$host_os dld.sl"
- shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH
- shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
- soname_spec='${libname}${release}${shared_ext}$major'
- sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64"
- sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
- ;;
- *)
- shrext_cmds='.sl'
- dynamic_linker="$host_os dld.sl"
- shlibpath_var=SHLIB_PATH
- shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH
- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
- soname_spec='${libname}${release}${shared_ext}$major'
- ;;
- esac
- # HP-UX runs *really* slowly unless shared libraries are mode 555, ...
- postinstall_cmds='chmod 555 $lib'
- # or fails outright, so override atomically:
- install_override_mode=555
- ;;
-
-interix[[3-9]]*)
- version_type=linux # correct to gnu/linux during the next big refactor
- need_lib_prefix=no
- need_version=no
- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
- soname_spec='${libname}${release}${shared_ext}$major'
- dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)'
- shlibpath_var=LD_LIBRARY_PATH
- shlibpath_overrides_runpath=no
- hardcode_into_libs=yes
- ;;
-
-irix5* | irix6* | nonstopux*)
- case $host_os in
- nonstopux*) version_type=nonstopux ;;
- *)
- if test "$lt_cv_prog_gnu_ld" = yes; then
- version_type=linux # correct to gnu/linux during the next big refactor
- else
- version_type=irix
- fi ;;
- esac
- need_lib_prefix=no
- need_version=no
- soname_spec='${libname}${release}${shared_ext}$major'
- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}'
- case $host_os in
- irix5* | nonstopux*)
- libsuff= shlibsuff=
- ;;
- *)
- case $LD in # libtool.m4 will add one of these switches to LD
- *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ")
- libsuff= shlibsuff= libmagic=32-bit;;
- *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ")
- libsuff=32 shlibsuff=N32 libmagic=N32;;
- *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ")
- libsuff=64 shlibsuff=64 libmagic=64-bit;;
- *) libsuff= shlibsuff= libmagic=never-match;;
- esac
- ;;
- esac
- shlibpath_var=LD_LIBRARY${shlibsuff}_PATH
- shlibpath_overrides_runpath=no
- sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}"
- sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}"
- hardcode_into_libs=yes
- ;;
-
-# No shared lib support for Linux oldld, aout, or coff.
-linux*oldld* | linux*aout* | linux*coff*)
- dynamic_linker=no
- ;;
-
-# This must be glibc/ELF.
-linux* | k*bsd*-gnu | kopensolaris*-gnu)
- version_type=linux # correct to gnu/linux during the next big refactor
- need_lib_prefix=no
- need_version=no
- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
- soname_spec='${libname}${release}${shared_ext}$major'
- finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir'
- shlibpath_var=LD_LIBRARY_PATH
- shlibpath_overrides_runpath=no
-
- # Some binutils ld are patched to set DT_RUNPATH
- AC_CACHE_VAL([lt_cv_shlibpath_overrides_runpath],
- [lt_cv_shlibpath_overrides_runpath=no
- save_LDFLAGS=$LDFLAGS
- save_libdir=$libdir
- eval "libdir=/foo; wl=\"$_LT_TAGVAR(lt_prog_compiler_wl, $1)\"; \
- LDFLAGS=\"\$LDFLAGS $_LT_TAGVAR(hardcode_libdir_flag_spec, $1)\""
- AC_LINK_IFELSE([AC_LANG_PROGRAM([],[])],
- [AS_IF([ ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null],
- [lt_cv_shlibpath_overrides_runpath=yes])])
- LDFLAGS=$save_LDFLAGS
- libdir=$save_libdir
- ])
- shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath
-
- # This implies no fast_install, which is unacceptable.
- # Some rework will be needed to allow for fast_install
- # before this can be enabled.
- hardcode_into_libs=yes
-
- # Append ld.so.conf contents to the search path
- if test -f /etc/ld.so.conf; then
- lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \[$]2)); skip = 1; } { if (!skip) print \[$]0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '`
- sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra"
- fi
-
- # We used to test for /lib/ld.so.1 and disable shared libraries on
- # powerpc, because MkLinux only supported shared libraries with the
- # GNU dynamic linker. Since this was broken with cross compilers,
- # most powerpc-linux boxes support dynamic linking these days and
- # people can always --disable-shared, the test was removed, and we
- # assume the GNU/Linux dynamic linker is in use.
- dynamic_linker='GNU/Linux ld.so'
- ;;
-
-netbsd*)
- version_type=sunos
- need_lib_prefix=no
- need_version=no
- if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
- finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
- dynamic_linker='NetBSD (a.out) ld.so'
- else
- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
- soname_spec='${libname}${release}${shared_ext}$major'
- dynamic_linker='NetBSD ld.elf_so'
- fi
- shlibpath_var=LD_LIBRARY_PATH
- shlibpath_overrides_runpath=yes
- hardcode_into_libs=yes
- ;;
-
-newsos6)
- version_type=linux # correct to gnu/linux during the next big refactor
- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
- shlibpath_var=LD_LIBRARY_PATH
- shlibpath_overrides_runpath=yes
- ;;
-
-*nto* | *qnx*)
- version_type=qnx
- need_lib_prefix=no
- need_version=no
- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
- soname_spec='${libname}${release}${shared_ext}$major'
- shlibpath_var=LD_LIBRARY_PATH
- shlibpath_overrides_runpath=no
- hardcode_into_libs=yes
- dynamic_linker='ldqnx.so'
- ;;
-
-openbsd*)
- version_type=sunos
- sys_lib_dlsearch_path_spec="/usr/lib"
- need_lib_prefix=no
- # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs.
- case $host_os in
- openbsd3.3 | openbsd3.3.*) need_version=yes ;;
- *) need_version=no ;;
- esac
- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
- finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
- shlibpath_var=LD_LIBRARY_PATH
- if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
- case $host_os in
- openbsd2.[[89]] | openbsd2.[[89]].*)
- shlibpath_overrides_runpath=no
- ;;
- *)
- shlibpath_overrides_runpath=yes
- ;;
- esac
- else
- shlibpath_overrides_runpath=yes
- fi
- ;;
-
-os2*)
- libname_spec='$name'
- shrext_cmds=".dll"
- need_lib_prefix=no
- library_names_spec='$libname${shared_ext} $libname.a'
- dynamic_linker='OS/2 ld.exe'
- shlibpath_var=LIBPATH
- ;;
-
-osf3* | osf4* | osf5*)
- version_type=osf
- need_lib_prefix=no
- need_version=no
- soname_spec='${libname}${release}${shared_ext}$major'
- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
- shlibpath_var=LD_LIBRARY_PATH
- sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib"
- sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec"
- ;;
-
-rdos*)
- dynamic_linker=no
- ;;
-
-solaris*)
- version_type=linux # correct to gnu/linux during the next big refactor
- need_lib_prefix=no
- need_version=no
- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
- soname_spec='${libname}${release}${shared_ext}$major'
- shlibpath_var=LD_LIBRARY_PATH
- shlibpath_overrides_runpath=yes
- hardcode_into_libs=yes
- # ldd complains unless libraries are executable
- postinstall_cmds='chmod +x $lib'
- ;;
-
-sunos4*)
- version_type=sunos
- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
- finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir'
- shlibpath_var=LD_LIBRARY_PATH
- shlibpath_overrides_runpath=yes
- if test "$with_gnu_ld" = yes; then
- need_lib_prefix=no
- fi
- need_version=yes
- ;;
-
-sysv4 | sysv4.3*)
- version_type=linux # correct to gnu/linux during the next big refactor
- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
- soname_spec='${libname}${release}${shared_ext}$major'
- shlibpath_var=LD_LIBRARY_PATH
- case $host_vendor in
- sni)
- shlibpath_overrides_runpath=no
- need_lib_prefix=no
- runpath_var=LD_RUN_PATH
- ;;
- siemens)
- need_lib_prefix=no
- ;;
- motorola)
- need_lib_prefix=no
- need_version=no
- shlibpath_overrides_runpath=no
- sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib'
- ;;
- esac
- ;;
-
-sysv4*MP*)
- if test -d /usr/nec ;then
- version_type=linux # correct to gnu/linux during the next big refactor
- library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}'
- soname_spec='$libname${shared_ext}.$major'
- shlibpath_var=LD_LIBRARY_PATH
- fi
- ;;
-
-sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
- version_type=freebsd-elf
- need_lib_prefix=no
- need_version=no
- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}'
- soname_spec='${libname}${release}${shared_ext}$major'
- shlibpath_var=LD_LIBRARY_PATH
- shlibpath_overrides_runpath=yes
- hardcode_into_libs=yes
- if test "$with_gnu_ld" = yes; then
- sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib'
- else
- sys_lib_search_path_spec='/usr/ccs/lib /usr/lib'
- case $host_os in
- sco3.2v5*)
- sys_lib_search_path_spec="$sys_lib_search_path_spec /lib"
- ;;
- esac
- fi
- sys_lib_dlsearch_path_spec='/usr/lib'
- ;;
-
-tpf*)
- # TPF is a cross-target only. Preferred cross-host = GNU/Linux.
- version_type=linux # correct to gnu/linux during the next big refactor
- need_lib_prefix=no
- need_version=no
- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
- shlibpath_var=LD_LIBRARY_PATH
- shlibpath_overrides_runpath=no
- hardcode_into_libs=yes
- ;;
-
-uts4*)
- version_type=linux # correct to gnu/linux during the next big refactor
- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
- soname_spec='${libname}${release}${shared_ext}$major'
- shlibpath_var=LD_LIBRARY_PATH
- ;;
-
-*)
- dynamic_linker=no
- ;;
-esac
-AC_MSG_RESULT([$dynamic_linker])
-test "$dynamic_linker" = no && can_build_shared=no
-
-variables_saved_for_relink="PATH $shlibpath_var $runpath_var"
-if test "$GCC" = yes; then
- variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH"
-fi
-
-if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then
- sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec"
-fi
-if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then
- sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec"
-fi
-
-_LT_DECL([], [variables_saved_for_relink], [1],
- [Variables whose values should be saved in libtool wrapper scripts and
- restored at link time])
-_LT_DECL([], [need_lib_prefix], [0],
- [Do we need the "lib" prefix for modules?])
-_LT_DECL([], [need_version], [0], [Do we need a version for libraries?])
-_LT_DECL([], [version_type], [0], [Library versioning type])
-_LT_DECL([], [runpath_var], [0], [Shared library runtime path variable])
-_LT_DECL([], [shlibpath_var], [0],[Shared library path variable])
-_LT_DECL([], [shlibpath_overrides_runpath], [0],
- [Is shlibpath searched before the hard-coded library search path?])
-_LT_DECL([], [libname_spec], [1], [Format of library name prefix])
-_LT_DECL([], [library_names_spec], [1],
- [[List of archive names. First name is the real one, the rest are links.
- The last name is the one that the linker finds with -lNAME]])
-_LT_DECL([], [soname_spec], [1],
- [[The coded name of the library, if different from the real name]])
-_LT_DECL([], [install_override_mode], [1],
- [Permission mode override for installation of shared libraries])
-_LT_DECL([], [postinstall_cmds], [2],
- [Command to use after installation of a shared archive])
-_LT_DECL([], [postuninstall_cmds], [2],
- [Command to use after uninstallation of a shared archive])
-_LT_DECL([], [finish_cmds], [2],
- [Commands used to finish a libtool library installation in a directory])
-_LT_DECL([], [finish_eval], [1],
- [[As "finish_cmds", except a single script fragment to be evaled but
- not shown]])
-_LT_DECL([], [hardcode_into_libs], [0],
- [Whether we should hardcode library paths into libraries])
-_LT_DECL([], [sys_lib_search_path_spec], [2],
- [Compile-time system search path for libraries])
-_LT_DECL([], [sys_lib_dlsearch_path_spec], [2],
- [Run-time system search path for libraries])
-])# _LT_SYS_DYNAMIC_LINKER
-
-
-# _LT_PATH_TOOL_PREFIX(TOOL)
-# --------------------------
-# find a file program which can recognize shared library
-AC_DEFUN([_LT_PATH_TOOL_PREFIX],
-[m4_require([_LT_DECL_EGREP])dnl
-AC_MSG_CHECKING([for $1])
-AC_CACHE_VAL(lt_cv_path_MAGIC_CMD,
-[case $MAGIC_CMD in
-[[\\/*] | ?:[\\/]*])
- lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path.
- ;;
-*)
- lt_save_MAGIC_CMD="$MAGIC_CMD"
- lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
-dnl $ac_dummy forces splitting on constant user-supplied paths.
-dnl POSIX.2 word splitting is done only on the output of word expansions,
-dnl not every word. This closes a longstanding sh security hole.
- ac_dummy="m4_if([$2], , $PATH, [$2])"
- for ac_dir in $ac_dummy; do
- IFS="$lt_save_ifs"
- test -z "$ac_dir" && ac_dir=.
- if test -f $ac_dir/$1; then
- lt_cv_path_MAGIC_CMD="$ac_dir/$1"
- if test -n "$file_magic_test_file"; then
- case $deplibs_check_method in
- "file_magic "*)
- file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"`
- MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
- if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null |
- $EGREP "$file_magic_regex" > /dev/null; then
- :
- else
- cat <<_LT_EOF 1>&2
-
-*** Warning: the command libtool uses to detect shared libraries,
-*** $file_magic_cmd, produces output that libtool cannot recognize.
-*** The result is that libtool may fail to recognize shared libraries
-*** as such. This will affect the creation of libtool libraries that
-*** depend on shared libraries, but programs linked with such libtool
-*** libraries will work regardless of this problem. Nevertheless, you
-*** may want to report the problem to your system manager and/or to
-*** bug-libtool at gnu.org
-
-_LT_EOF
- fi ;;
- esac
- fi
- break
- fi
- done
- IFS="$lt_save_ifs"
- MAGIC_CMD="$lt_save_MAGIC_CMD"
- ;;
-esac])
-MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
-if test -n "$MAGIC_CMD"; then
- AC_MSG_RESULT($MAGIC_CMD)
-else
- AC_MSG_RESULT(no)
-fi
-_LT_DECL([], [MAGIC_CMD], [0],
- [Used to examine libraries when file_magic_cmd begins with "file"])dnl
-])# _LT_PATH_TOOL_PREFIX
-
-# Old name:
-AU_ALIAS([AC_PATH_TOOL_PREFIX], [_LT_PATH_TOOL_PREFIX])
-dnl aclocal-1.4 backwards compatibility:
-dnl AC_DEFUN([AC_PATH_TOOL_PREFIX], [])
-
-
-# _LT_PATH_MAGIC
-# --------------
-# find a file program which can recognize a shared library
-m4_defun([_LT_PATH_MAGIC],
-[_LT_PATH_TOOL_PREFIX(${ac_tool_prefix}file, /usr/bin$PATH_SEPARATOR$PATH)
-if test -z "$lt_cv_path_MAGIC_CMD"; then
- if test -n "$ac_tool_prefix"; then
- _LT_PATH_TOOL_PREFIX(file, /usr/bin$PATH_SEPARATOR$PATH)
- else
- MAGIC_CMD=:
- fi
-fi
-])# _LT_PATH_MAGIC
-
-
-# LT_PATH_LD
-# ----------
-# find the pathname to the GNU or non-GNU linker
-AC_DEFUN([LT_PATH_LD],
-[AC_REQUIRE([AC_PROG_CC])dnl
-AC_REQUIRE([AC_CANONICAL_HOST])dnl
-AC_REQUIRE([AC_CANONICAL_BUILD])dnl
-m4_require([_LT_DECL_SED])dnl
-m4_require([_LT_DECL_EGREP])dnl
-m4_require([_LT_PROG_ECHO_BACKSLASH])dnl
-
-AC_ARG_WITH([gnu-ld],
- [AS_HELP_STRING([--with-gnu-ld],
- [assume the C compiler uses GNU ld @<:@default=no@:>@])],
- [test "$withval" = no || with_gnu_ld=yes],
- [with_gnu_ld=no])dnl
-
-ac_prog=ld
-if test "$GCC" = yes; then
- # Check if gcc -print-prog-name=ld gives a path.
- AC_MSG_CHECKING([for ld used by $CC])
- case $host in
- *-*-mingw*)
- # gcc leaves a trailing carriage return which upsets mingw
- ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;;
- *)
- ac_prog=`($CC -print-prog-name=ld) 2>&5` ;;
- esac
- case $ac_prog in
- # Accept absolute paths.
- [[\\/]]* | ?:[[\\/]]*)
- re_direlt='/[[^/]][[^/]]*/\.\./'
- # Canonicalize the pathname of ld
- ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'`
- while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do
- ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"`
- done
- test -z "$LD" && LD="$ac_prog"
- ;;
- "")
- # If it fails, then pretend we aren't using GCC.
- ac_prog=ld
- ;;
- *)
- # If it is relative, then search for the first ld in PATH.
- with_gnu_ld=unknown
- ;;
- esac
-elif test "$with_gnu_ld" = yes; then
- AC_MSG_CHECKING([for GNU ld])
-else
- AC_MSG_CHECKING([for non-GNU ld])
-fi
-AC_CACHE_VAL(lt_cv_path_LD,
-[if test -z "$LD"; then
- lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
- for ac_dir in $PATH; do
- IFS="$lt_save_ifs"
- test -z "$ac_dir" && ac_dir=.
- if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then
- lt_cv_path_LD="$ac_dir/$ac_prog"
- # Check to see if the program is GNU ld. I'd rather use --version,
- # but apparently some variants of GNU ld only accept -v.
- # Break only if it was the GNU/non-GNU ld that we prefer.
- case `"$lt_cv_path_LD" -v 2>&1 </dev/null` in
- *GNU* | *'with BFD'*)
- test "$with_gnu_ld" != no && break
- ;;
- *)
- test "$with_gnu_ld" != yes && break
- ;;
- esac
- fi
- done
- IFS="$lt_save_ifs"
-else
- lt_cv_path_LD="$LD" # Let the user override the test with a path.
-fi])
-LD="$lt_cv_path_LD"
-if test -n "$LD"; then
- AC_MSG_RESULT($LD)
-else
- AC_MSG_RESULT(no)
-fi
-test -z "$LD" && AC_MSG_ERROR([no acceptable ld found in \$PATH])
-_LT_PATH_LD_GNU
-AC_SUBST([LD])
-
-_LT_TAGDECL([], [LD], [1], [The linker used to build libraries])
-])# LT_PATH_LD
-
-# Old names:
-AU_ALIAS([AM_PROG_LD], [LT_PATH_LD])
-AU_ALIAS([AC_PROG_LD], [LT_PATH_LD])
-dnl aclocal-1.4 backwards compatibility:
-dnl AC_DEFUN([AM_PROG_LD], [])
-dnl AC_DEFUN([AC_PROG_LD], [])
-
-
-# _LT_PATH_LD_GNU
-#- --------------
-m4_defun([_LT_PATH_LD_GNU],
-[AC_CACHE_CHECK([if the linker ($LD) is GNU ld], lt_cv_prog_gnu_ld,
-[# I'd rather use --version here, but apparently some GNU lds only accept -v.
-case `$LD -v 2>&1 </dev/null` in
-*GNU* | *'with BFD'*)
- lt_cv_prog_gnu_ld=yes
- ;;
-*)
- lt_cv_prog_gnu_ld=no
- ;;
-esac])
-with_gnu_ld=$lt_cv_prog_gnu_ld
-])# _LT_PATH_LD_GNU
-
-
-# _LT_CMD_RELOAD
-# --------------
-# find reload flag for linker
-# -- PORTME Some linkers may need a different reload flag.
-m4_defun([_LT_CMD_RELOAD],
-[AC_CACHE_CHECK([for $LD option to reload object files],
- lt_cv_ld_reload_flag,
- [lt_cv_ld_reload_flag='-r'])
-reload_flag=$lt_cv_ld_reload_flag
-case $reload_flag in
-"" | " "*) ;;
-*) reload_flag=" $reload_flag" ;;
-esac
-reload_cmds='$LD$reload_flag -o $output$reload_objs'
-case $host_os in
- cygwin* | mingw* | pw32* | cegcc*)
- if test "$GCC" != yes; then
- reload_cmds=false
- fi
- ;;
- darwin*)
- if test "$GCC" = yes; then
- reload_cmds='$LTCC $LTCFLAGS -nostdlib ${wl}-r -o $output$reload_objs'
- else
- reload_cmds='$LD$reload_flag -o $output$reload_objs'
- fi
- ;;
-esac
-_LT_TAGDECL([], [reload_flag], [1], [How to create reloadable object files])dnl
-_LT_TAGDECL([], [reload_cmds], [2])dnl
-])# _LT_CMD_RELOAD
-
-
-# _LT_CHECK_MAGIC_METHOD
-# ----------------------
-# how to check for library dependencies
-# -- PORTME fill in with the dynamic library characteristics
-m4_defun([_LT_CHECK_MAGIC_METHOD],
-[m4_require([_LT_DECL_EGREP])
-m4_require([_LT_DECL_OBJDUMP])
-AC_CACHE_CHECK([how to recognize dependent libraries],
-lt_cv_deplibs_check_method,
-[lt_cv_file_magic_cmd='$MAGIC_CMD'
-lt_cv_file_magic_test_file=
-lt_cv_deplibs_check_method='unknown'
-# Need to set the preceding variable on all platforms that support
-# interlibrary dependencies.
-# 'none' -- dependencies not supported.
-# `unknown' -- same as none, but documents that we really don't know.
-# 'pass_all' -- all dependencies passed with no checks.
-# 'test_compile' -- check by making test program.
-# 'file_magic [[regex]]' -- check by looking for files in library path
-# which responds to the $file_magic_cmd with a given extended regex.
-# If you have `file' or equivalent on your system and you're not sure
-# whether `pass_all' will *always* work, you probably want this one.
-
-case $host_os in
-aix[[4-9]]*)
- lt_cv_deplibs_check_method=pass_all
- ;;
-
-beos*)
- lt_cv_deplibs_check_method=pass_all
- ;;
-
-bsdi[[45]]*)
- lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (shared object|dynamic lib)'
- lt_cv_file_magic_cmd='/usr/bin/file -L'
- lt_cv_file_magic_test_file=/shlib/libc.so
- ;;
-
-cygwin*)
- # func_win32_libid is a shell function defined in ltmain.sh
- lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL'
- lt_cv_file_magic_cmd='func_win32_libid'
- ;;
-
-mingw* | pw32*)
- # Base MSYS/MinGW do not provide the 'file' command needed by
- # func_win32_libid shell function, so use a weaker test based on 'objdump',
- # unless we find 'file', for example because we are cross-compiling.
- # func_win32_libid assumes BSD nm, so disallow it if using MS dumpbin.
- if ( test "$lt_cv_nm_interface" = "BSD nm" && file / ) >/dev/null 2>&1; then
- lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL'
- lt_cv_file_magic_cmd='func_win32_libid'
- else
- # Keep this pattern in sync with the one in func_win32_libid.
- lt_cv_deplibs_check_method='file_magic file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)'
- lt_cv_file_magic_cmd='$OBJDUMP -f'
- fi
- ;;
-
-cegcc*)
- # use the weaker test based on 'objdump'. See mingw*.
- lt_cv_deplibs_check_method='file_magic file format pe-arm-.*little(.*architecture: arm)?'
- lt_cv_file_magic_cmd='$OBJDUMP -f'
- ;;
-
-darwin* | rhapsody*)
- lt_cv_deplibs_check_method=pass_all
- ;;
-
-freebsd* | dragonfly*)
- if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then
- case $host_cpu in
- i*86 )
- # Not sure whether the presence of OpenBSD here was a mistake.
- # Let's accept both of them until this is cleared up.
- lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[[3-9]]86 (compact )?demand paged shared library'
- lt_cv_file_magic_cmd=/usr/bin/file
- lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*`
- ;;
- esac
- else
- lt_cv_deplibs_check_method=pass_all
- fi
- ;;
-
-gnu*)
- lt_cv_deplibs_check_method=pass_all
- ;;
-
-haiku*)
- lt_cv_deplibs_check_method=pass_all
- ;;
-
-hpux10.20* | hpux11*)
- lt_cv_file_magic_cmd=/usr/bin/file
- case $host_cpu in
- ia64*)
- lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|ELF-[[0-9]][[0-9]]) shared object file - IA64'
- lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so
- ;;
- hppa*64*)
- [lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF[ -][0-9][0-9])(-bit)?( [LM]SB)? shared object( file)?[, -]* PA-RISC [0-9]\.[0-9]']
- lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl
- ;;
- *)
- lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|PA-RISC[[0-9]]\.[[0-9]]) shared library'
- lt_cv_file_magic_test_file=/usr/lib/libc.sl
- ;;
- esac
- ;;
-
-interix[[3-9]]*)
- # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here
- lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so|\.a)$'
- ;;
-
-irix5* | irix6* | nonstopux*)
- case $LD in
- *-32|*"-32 ") libmagic=32-bit;;
- *-n32|*"-n32 ") libmagic=N32;;
- *-64|*"-64 ") libmagic=64-bit;;
- *) libmagic=never-match;;
- esac
- lt_cv_deplibs_check_method=pass_all
- ;;
-
-# This must be glibc/ELF.
-linux* | k*bsd*-gnu | kopensolaris*-gnu)
- lt_cv_deplibs_check_method=pass_all
- ;;
-
-netbsd*)
- if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then
- lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$'
- else
- lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so|_pic\.a)$'
- fi
- ;;
-
-newos6*)
- lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (executable|dynamic lib)'
- lt_cv_file_magic_cmd=/usr/bin/file
- lt_cv_file_magic_test_file=/usr/lib/libnls.so
- ;;
-
-*nto* | *qnx*)
- lt_cv_deplibs_check_method=pass_all
- ;;
-
-openbsd*)
- if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
- lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|\.so|_pic\.a)$'
- else
- lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$'
- fi
- ;;
-
-osf3* | osf4* | osf5*)
- lt_cv_deplibs_check_method=pass_all
- ;;
-
-rdos*)
- lt_cv_deplibs_check_method=pass_all
- ;;
-
-solaris*)
- lt_cv_deplibs_check_method=pass_all
- ;;
-
-sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
- lt_cv_deplibs_check_method=pass_all
- ;;
-
-sysv4 | sysv4.3*)
- case $host_vendor in
- motorola)
- lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (shared object|dynamic lib) M[[0-9]][[0-9]]* Version [[0-9]]'
- lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*`
- ;;
- ncr)
- lt_cv_deplibs_check_method=pass_all
- ;;
- sequent)
- lt_cv_file_magic_cmd='/bin/file'
- lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB (shared object|dynamic lib )'
- ;;
- sni)
- lt_cv_file_magic_cmd='/bin/file'
- lt_cv_deplibs_check_method="file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB dynamic lib"
- lt_cv_file_magic_test_file=/lib/libc.so
- ;;
- siemens)
- lt_cv_deplibs_check_method=pass_all
- ;;
- pc)
- lt_cv_deplibs_check_method=pass_all
- ;;
- esac
- ;;
-
-tpf*)
- lt_cv_deplibs_check_method=pass_all
- ;;
-esac
-])
-
-file_magic_glob=
-want_nocaseglob=no
-if test "$build" = "$host"; then
- case $host_os in
- mingw* | pw32*)
- if ( shopt | grep nocaseglob ) >/dev/null 2>&1; then
- want_nocaseglob=yes
- else
- file_magic_glob=`echo aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ | $SED -e "s/\(..\)/s\/[[\1]]\/[[\1]]\/g;/g"`
- fi
- ;;
- esac
-fi
-
-file_magic_cmd=$lt_cv_file_magic_cmd
-deplibs_check_method=$lt_cv_deplibs_check_method
-test -z "$deplibs_check_method" && deplibs_check_method=unknown
-
-_LT_DECL([], [deplibs_check_method], [1],
- [Method to check whether dependent libraries are shared objects])
-_LT_DECL([], [file_magic_cmd], [1],
- [Command to use when deplibs_check_method = "file_magic"])
-_LT_DECL([], [file_magic_glob], [1],
- [How to find potential files when deplibs_check_method = "file_magic"])
-_LT_DECL([], [want_nocaseglob], [1],
- [Find potential files using nocaseglob when deplibs_check_method = "file_magic"])
-])# _LT_CHECK_MAGIC_METHOD
-
-
-# LT_PATH_NM
-# ----------
-# find the pathname to a BSD- or MS-compatible name lister
-AC_DEFUN([LT_PATH_NM],
-[AC_REQUIRE([AC_PROG_CC])dnl
-AC_CACHE_CHECK([for BSD- or MS-compatible name lister (nm)], lt_cv_path_NM,
-[if test -n "$NM"; then
- # Let the user override the test.
- lt_cv_path_NM="$NM"
-else
- lt_nm_to_check="${ac_tool_prefix}nm"
- if test -n "$ac_tool_prefix" && test "$build" = "$host"; then
- lt_nm_to_check="$lt_nm_to_check nm"
- fi
- for lt_tmp_nm in $lt_nm_to_check; do
- lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
- for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do
- IFS="$lt_save_ifs"
- test -z "$ac_dir" && ac_dir=.
- tmp_nm="$ac_dir/$lt_tmp_nm"
- if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext" ; then
- # Check to see if the nm accepts a BSD-compat flag.
- # Adding the `sed 1q' prevents false positives on HP-UX, which says:
- # nm: unknown option "B" ignored
- # Tru64's nm complains that /dev/null is an invalid object file
- case `"$tmp_nm" -B /dev/null 2>&1 | sed '1q'` in
- */dev/null* | *'Invalid file or object type'*)
- lt_cv_path_NM="$tmp_nm -B"
- break
- ;;
- *)
- case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in
- */dev/null*)
- lt_cv_path_NM="$tmp_nm -p"
- break
- ;;
- *)
- lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but
- continue # so that we can try to find one that supports BSD flags
- ;;
- esac
- ;;
- esac
- fi
- done
- IFS="$lt_save_ifs"
- done
- : ${lt_cv_path_NM=no}
-fi])
-if test "$lt_cv_path_NM" != "no"; then
- NM="$lt_cv_path_NM"
-else
- # Didn't find any BSD compatible name lister, look for dumpbin.
- if test -n "$DUMPBIN"; then :
- # Let the user override the test.
- else
- AC_CHECK_TOOLS(DUMPBIN, [dumpbin "link -dump"], :)
- case `$DUMPBIN -symbols /dev/null 2>&1 | sed '1q'` in
- *COFF*)
- DUMPBIN="$DUMPBIN -symbols"
- ;;
- *)
- DUMPBIN=:
- ;;
- esac
- fi
- AC_SUBST([DUMPBIN])
- if test "$DUMPBIN" != ":"; then
- NM="$DUMPBIN"
- fi
-fi
-test -z "$NM" && NM=nm
-AC_SUBST([NM])
-_LT_DECL([], [NM], [1], [A BSD- or MS-compatible name lister])dnl
-
-AC_CACHE_CHECK([the name lister ($NM) interface], [lt_cv_nm_interface],
- [lt_cv_nm_interface="BSD nm"
- echo "int some_variable = 0;" > conftest.$ac_ext
- (eval echo "\"\$as_me:$LINENO: $ac_compile\"" >&AS_MESSAGE_LOG_FD)
- (eval "$ac_compile" 2>conftest.err)
- cat conftest.err >&AS_MESSAGE_LOG_FD
- (eval echo "\"\$as_me:$LINENO: $NM \\\"conftest.$ac_objext\\\"\"" >&AS_MESSAGE_LOG_FD)
- (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out)
- cat conftest.err >&AS_MESSAGE_LOG_FD
- (eval echo "\"\$as_me:$LINENO: output\"" >&AS_MESSAGE_LOG_FD)
- cat conftest.out >&AS_MESSAGE_LOG_FD
- if $GREP 'External.*some_variable' conftest.out > /dev/null; then
- lt_cv_nm_interface="MS dumpbin"
- fi
- rm -f conftest*])
-])# LT_PATH_NM
-
-# Old names:
-AU_ALIAS([AM_PROG_NM], [LT_PATH_NM])
-AU_ALIAS([AC_PROG_NM], [LT_PATH_NM])
-dnl aclocal-1.4 backwards compatibility:
-dnl AC_DEFUN([AM_PROG_NM], [])
-dnl AC_DEFUN([AC_PROG_NM], [])
-
-# _LT_CHECK_SHAREDLIB_FROM_LINKLIB
-# --------------------------------
-# how to determine the name of the shared library
-# associated with a specific link library.
-# -- PORTME fill in with the dynamic library characteristics
-m4_defun([_LT_CHECK_SHAREDLIB_FROM_LINKLIB],
-[m4_require([_LT_DECL_EGREP])
-m4_require([_LT_DECL_OBJDUMP])
-m4_require([_LT_DECL_DLLTOOL])
-AC_CACHE_CHECK([how to associate runtime and link libraries],
-lt_cv_sharedlib_from_linklib_cmd,
-[lt_cv_sharedlib_from_linklib_cmd='unknown'
-
-case $host_os in
-cygwin* | mingw* | pw32* | cegcc*)
- # two different shell functions defined in ltmain.sh
- # decide which to use based on capabilities of $DLLTOOL
- case `$DLLTOOL --help 2>&1` in
- *--identify-strict*)
- lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib
- ;;
- *)
- lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib_fallback
- ;;
- esac
- ;;
-*)
- # fallback: assume linklib IS sharedlib
- lt_cv_sharedlib_from_linklib_cmd="$ECHO"
- ;;
-esac
-])
-sharedlib_from_linklib_cmd=$lt_cv_sharedlib_from_linklib_cmd
-test -z "$sharedlib_from_linklib_cmd" && sharedlib_from_linklib_cmd=$ECHO
-
-_LT_DECL([], [sharedlib_from_linklib_cmd], [1],
- [Command to associate shared and link libraries])
-])# _LT_CHECK_SHAREDLIB_FROM_LINKLIB
-
-
-# _LT_PATH_MANIFEST_TOOL
-# ----------------------
-# locate the manifest tool
-m4_defun([_LT_PATH_MANIFEST_TOOL],
-[AC_CHECK_TOOL(MANIFEST_TOOL, mt, :)
-test -z "$MANIFEST_TOOL" && MANIFEST_TOOL=mt
-AC_CACHE_CHECK([if $MANIFEST_TOOL is a manifest tool], [lt_cv_path_mainfest_tool],
- [lt_cv_path_mainfest_tool=no
- echo "$as_me:$LINENO: $MANIFEST_TOOL '-?'" >&AS_MESSAGE_LOG_FD
- $MANIFEST_TOOL '-?' 2>conftest.err > conftest.out
- cat conftest.err >&AS_MESSAGE_LOG_FD
- if $GREP 'Manifest Tool' conftest.out > /dev/null; then
- lt_cv_path_mainfest_tool=yes
- fi
- rm -f conftest*])
-if test "x$lt_cv_path_mainfest_tool" != xyes; then
- MANIFEST_TOOL=:
-fi
-_LT_DECL([], [MANIFEST_TOOL], [1], [Manifest tool])dnl
-])# _LT_PATH_MANIFEST_TOOL
-
-
-# LT_LIB_M
-# --------
-# check for math library
-AC_DEFUN([LT_LIB_M],
-[AC_REQUIRE([AC_CANONICAL_HOST])dnl
-LIBM=
-case $host in
-*-*-beos* | *-*-cegcc* | *-*-cygwin* | *-*-haiku* | *-*-pw32* | *-*-darwin*)
- # These system don't have libm, or don't need it
- ;;
-*-ncr-sysv4.3*)
- AC_CHECK_LIB(mw, _mwvalidcheckl, LIBM="-lmw")
- AC_CHECK_LIB(m, cos, LIBM="$LIBM -lm")
- ;;
-*)
- AC_CHECK_LIB(m, cos, LIBM="-lm")
- ;;
-esac
-AC_SUBST([LIBM])
-])# LT_LIB_M
-
-# Old name:
-AU_ALIAS([AC_CHECK_LIBM], [LT_LIB_M])
-dnl aclocal-1.4 backwards compatibility:
-dnl AC_DEFUN([AC_CHECK_LIBM], [])
-
-
-# _LT_COMPILER_NO_RTTI([TAGNAME])
-# -------------------------------
-m4_defun([_LT_COMPILER_NO_RTTI],
-[m4_require([_LT_TAG_COMPILER])dnl
-
-_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=
-
-if test "$GCC" = yes; then
- case $cc_basename in
- nvcc*)
- _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -Xcompiler -fno-builtin' ;;
- *)
- _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin' ;;
- esac
-
- _LT_COMPILER_OPTION([if $compiler supports -fno-rtti -fno-exceptions],
- lt_cv_prog_compiler_rtti_exceptions,
- [-fno-rtti -fno-exceptions], [],
- [_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)="$_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1) -fno-rtti -fno-exceptions"])
-fi
-_LT_TAGDECL([no_builtin_flag], [lt_prog_compiler_no_builtin_flag], [1],
- [Compiler flag to turn off builtin functions])
-])# _LT_COMPILER_NO_RTTI
-
-
-# _LT_CMD_GLOBAL_SYMBOLS
-# ----------------------
-m4_defun([_LT_CMD_GLOBAL_SYMBOLS],
-[AC_REQUIRE([AC_CANONICAL_HOST])dnl
-AC_REQUIRE([AC_PROG_CC])dnl
-AC_REQUIRE([AC_PROG_AWK])dnl
-AC_REQUIRE([LT_PATH_NM])dnl
-AC_REQUIRE([LT_PATH_LD])dnl
-m4_require([_LT_DECL_SED])dnl
-m4_require([_LT_DECL_EGREP])dnl
-m4_require([_LT_TAG_COMPILER])dnl
-
-# Check for command to grab the raw symbol name followed by C symbol from nm.
-AC_MSG_CHECKING([command to parse $NM output from $compiler object])
-AC_CACHE_VAL([lt_cv_sys_global_symbol_pipe],
-[
-# These are sane defaults that work on at least a few old systems.
-# [They come from Ultrix. What could be older than Ultrix?!! ;)]
-
-# Character class describing NM global symbol codes.
-symcode='[[BCDEGRST]]'
-
-# Regexp to match symbols that can be accessed directly from C.
-sympat='\([[_A-Za-z]][[_A-Za-z0-9]]*\)'
-
-# Define system-specific variables.
-case $host_os in
-aix*)
- symcode='[[BCDT]]'
- ;;
-cygwin* | mingw* | pw32* | cegcc*)
- symcode='[[ABCDGISTW]]'
- ;;
-hpux*)
- if test "$host_cpu" = ia64; then
- symcode='[[ABCDEGRST]]'
- fi
- ;;
-irix* | nonstopux*)
- symcode='[[BCDEGRST]]'
- ;;
-osf*)
- symcode='[[BCDEGQRST]]'
- ;;
-solaris*)
- symcode='[[BDRT]]'
- ;;
-sco3.2v5*)
- symcode='[[DT]]'
- ;;
-sysv4.2uw2*)
- symcode='[[DT]]'
- ;;
-sysv5* | sco5v6* | unixware* | OpenUNIX*)
- symcode='[[ABDT]]'
- ;;
-sysv4)
- symcode='[[DFNSTU]]'
- ;;
-esac
-
-# If we're using GNU nm, then use its standard symbol codes.
-case `$NM -V 2>&1` in
-*GNU* | *'with BFD'*)
- symcode='[[ABCDGIRSTW]]' ;;
-esac
-
-# Transform an extracted symbol line into a proper C declaration.
-# Some systems (esp. on ia64) link data and code symbols differently,
-# so use this general approach.
-lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'"
-
-# Transform an extracted symbol line into symbol name and symbol address
-lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([[^ ]]*\)[[ ]]*$/ {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/ {\"\2\", (void *) \&\2},/p'"
-lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="sed -n -e 's/^: \([[^ ]]*\)[[ ]]*$/ {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \(lib[[^ ]]*\)$/ {\"\2\", (void *) \&\2},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/ {\"lib\2\", (void *) \&\2},/p'"
-
-# Handle CRLF in mingw tool chain
-opt_cr=
-case $build_os in
-mingw*)
- opt_cr=`$ECHO 'x\{0,1\}' | tr x '\015'` # option cr in regexp
- ;;
-esac
-
-# Try without a prefix underscore, then with it.
-for ac_symprfx in "" "_"; do
-
- # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol.
- symxfrm="\\1 $ac_symprfx\\2 \\2"
-
- # Write the raw and C identifiers.
- if test "$lt_cv_nm_interface" = "MS dumpbin"; then
- # Fake it for dumpbin and say T for any non-static function
- # and D for any global variable.
- # Also find C++ and __fastcall symbols from MSVC++,
- # which start with @ or ?.
- lt_cv_sys_global_symbol_pipe="$AWK ['"\
-" {last_section=section; section=\$ 3};"\
-" /^COFF SYMBOL TABLE/{for(i in hide) delete hide[i]};"\
-" /Section length .*#relocs.*(pick any)/{hide[last_section]=1};"\
-" \$ 0!~/External *\|/{next};"\
-" / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\
-" {if(hide[section]) next};"\
-" {f=0}; \$ 0~/\(\).*\|/{f=1}; {printf f ? \"T \" : \"D \"};"\
-" {split(\$ 0, a, /\||\r/); split(a[2], s)};"\
-" s[1]~/^[@?]/{print s[1], s[1]; next};"\
-" s[1]~prfx {split(s[1],t,\"@\"); print t[1], substr(t[1],length(prfx))}"\
-" ' prfx=^$ac_symprfx]"
- else
- lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[[ ]]\($symcode$symcode*\)[[ ]][[ ]]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'"
- fi
- lt_cv_sys_global_symbol_pipe="$lt_cv_sys_global_symbol_pipe | sed '/ __gnu_lto/d'"
-
- # Check to see that the pipe works correctly.
- pipe_works=no
-
- rm -f conftest*
- cat > conftest.$ac_ext <<_LT_EOF
-#ifdef __cplusplus
-extern "C" {
-#endif
-char nm_test_var;
-void nm_test_func(void);
-void nm_test_func(void){}
-#ifdef __cplusplus
-}
-#endif
-int main(){nm_test_var='a';nm_test_func();return(0);}
-_LT_EOF
-
- if AC_TRY_EVAL(ac_compile); then
- # Now try to grab the symbols.
- nlist=conftest.nm
- if AC_TRY_EVAL(NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist) && test -s "$nlist"; then
- # Try sorting and uniquifying the output.
- if sort "$nlist" | uniq > "$nlist"T; then
- mv -f "$nlist"T "$nlist"
- else
- rm -f "$nlist"T
- fi
-
- # Make sure that we snagged all the symbols we need.
- if $GREP ' nm_test_var$' "$nlist" >/dev/null; then
- if $GREP ' nm_test_func$' "$nlist" >/dev/null; then
- cat <<_LT_EOF > conftest.$ac_ext
-/* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests. */
-#if defined(_WIN32) || defined(__CYGWIN__) || defined(_WIN32_WCE)
-/* DATA imports from DLLs on WIN32 con't be const, because runtime
- relocations are performed -- see ld's documentation on pseudo-relocs. */
-# define LT@&t at _DLSYM_CONST
-#elif defined(__osf__)
-/* This system does not cope well with relocations in const data. */
-# define LT@&t at _DLSYM_CONST
-#else
-# define LT@&t at _DLSYM_CONST const
-#endif
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-_LT_EOF
- # Now generate the symbol file.
- eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | $GREP -v main >> conftest.$ac_ext'
-
- cat <<_LT_EOF >> conftest.$ac_ext
-
-/* The mapping between symbol names and symbols. */
-LT@&t at _DLSYM_CONST struct {
- const char *name;
- void *address;
-}
-lt__PROGRAM__LTX_preloaded_symbols[[]] =
-{
- { "@PROGRAM@", (void *) 0 },
-_LT_EOF
- $SED "s/^$symcode$symcode* \(.*\) \(.*\)$/ {\"\2\", (void *) \&\2},/" < "$nlist" | $GREP -v main >> conftest.$ac_ext
- cat <<\_LT_EOF >> conftest.$ac_ext
- {0, (void *) 0}
-};
-
-/* This works around a problem in FreeBSD linker */
-#ifdef FREEBSD_WORKAROUND
-static const void *lt_preloaded_setup() {
- return lt__PROGRAM__LTX_preloaded_symbols;
-}
-#endif
-
-#ifdef __cplusplus
-}
-#endif
-_LT_EOF
- # Now try linking the two files.
- mv conftest.$ac_objext conftstm.$ac_objext
- lt_globsym_save_LIBS=$LIBS
- lt_globsym_save_CFLAGS=$CFLAGS
- LIBS="conftstm.$ac_objext"
- CFLAGS="$CFLAGS$_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)"
- if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext}; then
- pipe_works=yes
- fi
- LIBS=$lt_globsym_save_LIBS
- CFLAGS=$lt_globsym_save_CFLAGS
- else
- echo "cannot find nm_test_func in $nlist" >&AS_MESSAGE_LOG_FD
- fi
- else
- echo "cannot find nm_test_var in $nlist" >&AS_MESSAGE_LOG_FD
- fi
- else
- echo "cannot run $lt_cv_sys_global_symbol_pipe" >&AS_MESSAGE_LOG_FD
- fi
- else
- echo "$progname: failed program was:" >&AS_MESSAGE_LOG_FD
- cat conftest.$ac_ext >&5
- fi
- rm -rf conftest* conftst*
-
- # Do not use the global_symbol_pipe unless it works.
- if test "$pipe_works" = yes; then
- break
- else
- lt_cv_sys_global_symbol_pipe=
- fi
-done
-])
-if test -z "$lt_cv_sys_global_symbol_pipe"; then
- lt_cv_sys_global_symbol_to_cdecl=
-fi
-if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then
- AC_MSG_RESULT(failed)
-else
- AC_MSG_RESULT(ok)
-fi
-
-# Response file support.
-if test "$lt_cv_nm_interface" = "MS dumpbin"; then
- nm_file_list_spec='@'
-elif $NM --help 2>/dev/null | grep '[[@]]FILE' >/dev/null; then
- nm_file_list_spec='@'
-fi
-
-_LT_DECL([global_symbol_pipe], [lt_cv_sys_global_symbol_pipe], [1],
- [Take the output of nm and produce a listing of raw symbols and C names])
-_LT_DECL([global_symbol_to_cdecl], [lt_cv_sys_global_symbol_to_cdecl], [1],
- [Transform the output of nm in a proper C declaration])
-_LT_DECL([global_symbol_to_c_name_address],
- [lt_cv_sys_global_symbol_to_c_name_address], [1],
- [Transform the output of nm in a C name address pair])
-_LT_DECL([global_symbol_to_c_name_address_lib_prefix],
- [lt_cv_sys_global_symbol_to_c_name_address_lib_prefix], [1],
- [Transform the output of nm in a C name address pair when lib prefix is needed])
-_LT_DECL([], [nm_file_list_spec], [1],
- [Specify filename containing input files for $NM])
-]) # _LT_CMD_GLOBAL_SYMBOLS
-
-
-# _LT_COMPILER_PIC([TAGNAME])
-# ---------------------------
-m4_defun([_LT_COMPILER_PIC],
-[m4_require([_LT_TAG_COMPILER])dnl
-_LT_TAGVAR(lt_prog_compiler_wl, $1)=
-_LT_TAGVAR(lt_prog_compiler_pic, $1)=
-_LT_TAGVAR(lt_prog_compiler_static, $1)=
-
-m4_if([$1], [CXX], [
- # C++ specific cases for pic, static, wl, etc.
- if test "$GXX" = yes; then
- _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
- _LT_TAGVAR(lt_prog_compiler_static, $1)='-static'
-
- case $host_os in
- aix*)
- # All AIX code is PIC.
- if test "$host_cpu" = ia64; then
- # AIX 5 now supports IA64 processor
- _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
- fi
- ;;
-
- amigaos*)
- case $host_cpu in
- powerpc)
- # see comment about AmigaOS4 .so support
- _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
- ;;
- m68k)
- # FIXME: we need at least 68020 code to build shared libraries, but
- # adding the `-m68020' flag to GCC prevents building anything better,
- # like `-m68040'.
- _LT_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4'
- ;;
- esac
- ;;
-
- beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*)
- # PIC is the default for these OSes.
- ;;
- mingw* | cygwin* | os2* | pw32* | cegcc*)
- # This hack is so that the source file can tell whether it is being
- # built for inclusion in a dll (and should export symbols for example).
- # Although the cygwin gcc ignores -fPIC, still need this for old-style
- # (--disable-auto-import) libraries
- m4_if([$1], [GCJ], [],
- [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT'])
- ;;
- darwin* | rhapsody*)
- # PIC is the default on this platform
- # Common symbols not allowed in MH_DYLIB files
- _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common'
- ;;
- *djgpp*)
- # DJGPP does not support shared libraries at all
- _LT_TAGVAR(lt_prog_compiler_pic, $1)=
- ;;
- haiku*)
- # PIC is the default for Haiku.
- # The "-static" flag exists, but is broken.
- _LT_TAGVAR(lt_prog_compiler_static, $1)=
- ;;
- interix[[3-9]]*)
- # Interix 3.x gcc -fpic/-fPIC options generate broken code.
- # Instead, we relocate shared libraries at runtime.
- ;;
- sysv4*MP*)
- if test -d /usr/nec; then
- _LT_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic
- fi
- ;;
- hpux*)
- # PIC is the default for 64-bit PA HP-UX, but not for 32-bit
- # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag
- # sets the default TLS model and affects inlining.
- case $host_cpu in
- hppa*64*)
- ;;
- *)
- _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
- ;;
- esac
- ;;
- *qnx* | *nto*)
- # QNX uses GNU C++, but need to define -shared option too, otherwise
- # it will coredump.
- _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared'
- ;;
- *)
- _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
- ;;
- esac
- else
- case $host_os in
- aix[[4-9]]*)
- # All AIX code is PIC.
- if test "$host_cpu" = ia64; then
- # AIX 5 now supports IA64 processor
- _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
- else
- _LT_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp'
- fi
- ;;
- chorus*)
- case $cc_basename in
- cxch68*)
- # Green Hills C++ Compiler
- # _LT_TAGVAR(lt_prog_compiler_static, $1)="--no_auto_instantiation -u __main -u __premain -u _abort -r $COOL_DIR/lib/libOrb.a $MVME_DIR/lib/CC/libC.a $MVME_DIR/lib/classix/libcx.s.a"
- ;;
- esac
- ;;
- mingw* | cygwin* | os2* | pw32* | cegcc*)
- # This hack is so that the source file can tell whether it is being
- # built for inclusion in a dll (and should export symbols for example).
- m4_if([$1], [GCJ], [],
- [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT'])
- ;;
- dgux*)
- case $cc_basename in
- ec++*)
- _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
- ;;
- ghcx*)
- # Green Hills C++ Compiler
- _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic'
- ;;
- *)
- ;;
- esac
- ;;
- freebsd* | dragonfly*)
- # FreeBSD uses GNU C++
- ;;
- hpux9* | hpux10* | hpux11*)
- case $cc_basename in
- CC*)
- _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
- _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive'
- if test "$host_cpu" != ia64; then
- _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z'
- fi
- ;;
- aCC*)
- _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
- _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive'
- case $host_cpu in
- hppa*64*|ia64*)
- # +Z the default
- ;;
- *)
- _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z'
- ;;
- esac
- ;;
- *)
- ;;
- esac
- ;;
- interix*)
- # This is c89, which is MS Visual C++ (no shared libs)
- # Anyone wants to do a port?
- ;;
- irix5* | irix6* | nonstopux*)
- case $cc_basename in
- CC*)
- _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
- _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
- # CC pic flag -KPIC is the default.
- ;;
- *)
- ;;
- esac
- ;;
- linux* | k*bsd*-gnu | kopensolaris*-gnu)
- case $cc_basename in
- KCC*)
- # KAI C++ Compiler
- _LT_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,'
- _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
- ;;
- ecpc* )
- # old Intel C++ for x86_64 which still supported -KPIC.
- _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
- _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
- _LT_TAGVAR(lt_prog_compiler_static, $1)='-static'
- ;;
- icpc* )
- # Intel C++, used to be incompatible with GCC.
- # ICC 10 doesn't accept -KPIC any more.
- _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
- _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
- _LT_TAGVAR(lt_prog_compiler_static, $1)='-static'
- ;;
- pgCC* | pgcpp*)
- # Portland Group C++ compiler
- _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
- _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic'
- _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
- ;;
- cxx*)
- # Compaq C++
- # Make sure the PIC flag is empty. It appears that all Alpha
- # Linux and Compaq Tru64 Unix objects are PIC.
- _LT_TAGVAR(lt_prog_compiler_pic, $1)=
- _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
- ;;
- xlc* | xlC* | bgxl[[cC]]* | mpixl[[cC]]*)
- # IBM XL 8.0, 9.0 on PPC and BlueGene
- _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
- _LT_TAGVAR(lt_prog_compiler_pic, $1)='-qpic'
- _LT_TAGVAR(lt_prog_compiler_static, $1)='-qstaticlink'
- ;;
- *)
- case `$CC -V 2>&1 | sed 5q` in
- *Sun\ C*)
- # Sun C++ 5.9
- _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
- _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
- _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld '
- ;;
- esac
- ;;
- esac
- ;;
- lynxos*)
- ;;
- m88k*)
- ;;
- mvs*)
- case $cc_basename in
- cxx*)
- _LT_TAGVAR(lt_prog_compiler_pic, $1)='-W c,exportall'
- ;;
- *)
- ;;
- esac
- ;;
- netbsd*)
- ;;
- *qnx* | *nto*)
- # QNX uses GNU C++, but need to define -shared option too, otherwise
- # it will coredump.
- _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared'
- ;;
- osf3* | osf4* | osf5*)
- case $cc_basename in
- KCC*)
- _LT_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,'
- ;;
- RCC*)
- # Rational C++ 2.4.1
- _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic'
- ;;
- cxx*)
- # Digital/Compaq C++
- _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
- # Make sure the PIC flag is empty. It appears that all Alpha
- # Linux and Compaq Tru64 Unix objects are PIC.
- _LT_TAGVAR(lt_prog_compiler_pic, $1)=
- _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
- ;;
- *)
- ;;
- esac
- ;;
- psos*)
- ;;
- solaris*)
- case $cc_basename in
- CC* | sunCC*)
- # Sun C++ 4.2, 5.x and Centerline C++
- _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
- _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
- _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld '
- ;;
- gcx*)
- # Green Hills C++ Compiler
- _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC'
- ;;
- *)
- ;;
- esac
- ;;
- sunos4*)
- case $cc_basename in
- CC*)
- # Sun C++ 4.x
- _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic'
- _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
- ;;
- lcc*)
- # Lucid
- _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic'
- ;;
- *)
- ;;
- esac
- ;;
- sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*)
- case $cc_basename in
- CC*)
- _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
- _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
- _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
- ;;
- esac
- ;;
- tandem*)
- case $cc_basename in
- NCC*)
- # NonStop-UX NCC 3.20
- _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
- ;;
- *)
- ;;
- esac
- ;;
- vxworks*)
- ;;
- *)
- _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no
- ;;
- esac
- fi
-],
-[
- if test "$GCC" = yes; then
- _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
- _LT_TAGVAR(lt_prog_compiler_static, $1)='-static'
-
- case $host_os in
- aix*)
- # All AIX code is PIC.
- if test "$host_cpu" = ia64; then
- # AIX 5 now supports IA64 processor
- _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
- fi
- ;;
-
- amigaos*)
- case $host_cpu in
- powerpc)
- # see comment about AmigaOS4 .so support
- _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
- ;;
- m68k)
- # FIXME: we need at least 68020 code to build shared libraries, but
- # adding the `-m68020' flag to GCC prevents building anything better,
- # like `-m68040'.
- _LT_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4'
- ;;
- esac
- ;;
-
- beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*)
- # PIC is the default for these OSes.
- ;;
-
- mingw* | cygwin* | pw32* | os2* | cegcc*)
- # This hack is so that the source file can tell whether it is being
- # built for inclusion in a dll (and should export symbols for example).
- # Although the cygwin gcc ignores -fPIC, still need this for old-style
- # (--disable-auto-import) libraries
- m4_if([$1], [GCJ], [],
- [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT'])
- ;;
-
- darwin* | rhapsody*)
- # PIC is the default on this platform
- # Common symbols not allowed in MH_DYLIB files
- _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common'
- ;;
-
- haiku*)
- # PIC is the default for Haiku.
- # The "-static" flag exists, but is broken.
- _LT_TAGVAR(lt_prog_compiler_static, $1)=
- ;;
-
- hpux*)
- # PIC is the default for 64-bit PA HP-UX, but not for 32-bit
- # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag
- # sets the default TLS model and affects inlining.
- case $host_cpu in
- hppa*64*)
- # +Z the default
- ;;
- *)
- _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
- ;;
- esac
- ;;
-
- interix[[3-9]]*)
- # Interix 3.x gcc -fpic/-fPIC options generate broken code.
- # Instead, we relocate shared libraries at runtime.
- ;;
-
- msdosdjgpp*)
- # Just because we use GCC doesn't mean we suddenly get shared libraries
- # on systems that don't support them.
- _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no
- enable_shared=no
- ;;
-
- *nto* | *qnx*)
- # QNX uses GNU C++, but need to define -shared option too, otherwise
- # it will coredump.
- _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared'
- ;;
-
- sysv4*MP*)
- if test -d /usr/nec; then
- _LT_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic
- fi
- ;;
-
- *)
- _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
- ;;
- esac
-
- case $cc_basename in
- nvcc*) # Cuda Compiler Driver 2.2
- _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Xlinker '
- if test -n "$_LT_TAGVAR(lt_prog_compiler_pic, $1)"; then
- _LT_TAGVAR(lt_prog_compiler_pic, $1)="-Xcompiler $_LT_TAGVAR(lt_prog_compiler_pic, $1)"
- fi
- ;;
- esac
- else
- # PORTME Check for flag to pass linker flags through the system compiler.
- case $host_os in
- aix*)
- _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
- if test "$host_cpu" = ia64; then
- # AIX 5 now supports IA64 processor
- _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
- else
- _LT_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp'
- fi
- ;;
-
- mingw* | cygwin* | pw32* | os2* | cegcc*)
- # This hack is so that the source file can tell whether it is being
- # built for inclusion in a dll (and should export symbols for example).
- m4_if([$1], [GCJ], [],
- [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT'])
- ;;
-
- hpux9* | hpux10* | hpux11*)
- _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
- # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but
- # not for PA HP-UX.
- case $host_cpu in
- hppa*64*|ia64*)
- # +Z the default
- ;;
- *)
- _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z'
- ;;
- esac
- # Is there a better lt_prog_compiler_static that works with the bundled CC?
- _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive'
- ;;
-
- irix5* | irix6* | nonstopux*)
- _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
- # PIC (with -KPIC) is the default.
- _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
- ;;
-
- linux* | k*bsd*-gnu | kopensolaris*-gnu)
- case $cc_basename in
- # old Intel for x86_64 which still supported -KPIC.
- ecc*)
- _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
- _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
- _LT_TAGVAR(lt_prog_compiler_static, $1)='-static'
- ;;
- # icc used to be incompatible with GCC.
- # ICC 10 doesn't accept -KPIC any more.
- icc* | ifort*)
- _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
- _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
- _LT_TAGVAR(lt_prog_compiler_static, $1)='-static'
- ;;
- # Lahey Fortran 8.1.
- lf95*)
- _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
- _LT_TAGVAR(lt_prog_compiler_pic, $1)='--shared'
- _LT_TAGVAR(lt_prog_compiler_static, $1)='--static'
- ;;
- nagfor*)
- # NAG Fortran compiler
- _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,-Wl,,'
- _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC'
- _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
- ;;
- pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*)
- # Portland Group compilers (*not* the Pentium gcc compiler,
- # which looks to be a dead project)
- _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
- _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic'
- _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
- ;;
- ccc*)
- _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
- # All Alpha code is PIC.
- _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
- ;;
- xl* | bgxl* | bgf* | mpixl*)
- # IBM XL C 8.0/Fortran 10.1, 11.1 on PPC and BlueGene
- _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
- _LT_TAGVAR(lt_prog_compiler_pic, $1)='-qpic'
- _LT_TAGVAR(lt_prog_compiler_static, $1)='-qstaticlink'
- ;;
- *)
- case `$CC -V 2>&1 | sed 5q` in
- *Sun\ Ceres\ Fortran* | *Sun*Fortran*\ [[1-7]].* | *Sun*Fortran*\ 8.[[0-3]]*)
- # Sun Fortran 8.3 passes all unrecognized flags to the linker
- _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
- _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
- _LT_TAGVAR(lt_prog_compiler_wl, $1)=''
- ;;
- *Sun\ F* | *Sun*Fortran*)
- _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
- _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
- _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld '
- ;;
- *Sun\ C*)
- # Sun C 5.9
- _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
- _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
- _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
- ;;
- *Intel*\ [[CF]]*Compiler*)
- _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
- _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
- _LT_TAGVAR(lt_prog_compiler_static, $1)='-static'
- ;;
- *Portland\ Group*)
- _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
- _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic'
- _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
- ;;
- esac
- ;;
- esac
- ;;
-
- newsos6)
- _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
- _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
- ;;
-
- *nto* | *qnx*)
- # QNX uses GNU C++, but need to define -shared option too, otherwise
- # it will coredump.
- _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared'
- ;;
-
- osf3* | osf4* | osf5*)
- _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
- # All OSF/1 code is PIC.
- _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
- ;;
-
- rdos*)
- _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
- ;;
-
- solaris*)
- _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
- _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
- case $cc_basename in
- f77* | f90* | f95* | sunf77* | sunf90* | sunf95*)
- _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ';;
- *)
- _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,';;
- esac
- ;;
-
- sunos4*)
- _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld '
- _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC'
- _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
- ;;
-
- sysv4 | sysv4.2uw2* | sysv4.3*)
- _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
- _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
- _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
- ;;
-
- sysv4*MP*)
- if test -d /usr/nec ;then
- _LT_TAGVAR(lt_prog_compiler_pic, $1)='-Kconform_pic'
- _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
- fi
- ;;
-
- sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*)
- _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
- _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
- _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
- ;;
-
- unicos*)
- _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
- _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no
- ;;
-
- uts4*)
- _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic'
- _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
- ;;
-
- *)
- _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no
- ;;
- esac
- fi
-])
-case $host_os in
- # For platforms which do not support PIC, -DPIC is meaningless:
- *djgpp*)
- _LT_TAGVAR(lt_prog_compiler_pic, $1)=
- ;;
- *)
- _LT_TAGVAR(lt_prog_compiler_pic, $1)="$_LT_TAGVAR(lt_prog_compiler_pic, $1)@&t at m4_if([$1],[],[ -DPIC],[m4_if([$1],[CXX],[ -DPIC],[])])"
- ;;
-esac
-
-AC_CACHE_CHECK([for $compiler option to produce PIC],
- [_LT_TAGVAR(lt_cv_prog_compiler_pic, $1)],
- [_LT_TAGVAR(lt_cv_prog_compiler_pic, $1)=$_LT_TAGVAR(lt_prog_compiler_pic, $1)])
-_LT_TAGVAR(lt_prog_compiler_pic, $1)=$_LT_TAGVAR(lt_cv_prog_compiler_pic, $1)
-
-#
-# Check to make sure the PIC flag actually works.
-#
-if test -n "$_LT_TAGVAR(lt_prog_compiler_pic, $1)"; then
- _LT_COMPILER_OPTION([if $compiler PIC flag $_LT_TAGVAR(lt_prog_compiler_pic, $1) works],
- [_LT_TAGVAR(lt_cv_prog_compiler_pic_works, $1)],
- [$_LT_TAGVAR(lt_prog_compiler_pic, $1)@&t at m4_if([$1],[],[ -DPIC],[m4_if([$1],[CXX],[ -DPIC],[])])], [],
- [case $_LT_TAGVAR(lt_prog_compiler_pic, $1) in
- "" | " "*) ;;
- *) _LT_TAGVAR(lt_prog_compiler_pic, $1)=" $_LT_TAGVAR(lt_prog_compiler_pic, $1)" ;;
- esac],
- [_LT_TAGVAR(lt_prog_compiler_pic, $1)=
- _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no])
-fi
-_LT_TAGDECL([pic_flag], [lt_prog_compiler_pic], [1],
- [Additional compiler flags for building library objects])
-
-_LT_TAGDECL([wl], [lt_prog_compiler_wl], [1],
- [How to pass a linker flag through the compiler])
-#
-# Check to make sure the static flag actually works.
-#
-wl=$_LT_TAGVAR(lt_prog_compiler_wl, $1) eval lt_tmp_static_flag=\"$_LT_TAGVAR(lt_prog_compiler_static, $1)\"
-_LT_LINKER_OPTION([if $compiler static flag $lt_tmp_static_flag works],
- _LT_TAGVAR(lt_cv_prog_compiler_static_works, $1),
- $lt_tmp_static_flag,
- [],
- [_LT_TAGVAR(lt_prog_compiler_static, $1)=])
-_LT_TAGDECL([link_static_flag], [lt_prog_compiler_static], [1],
- [Compiler flag to prevent dynamic linking])
-])# _LT_COMPILER_PIC
-
-
-# _LT_LINKER_SHLIBS([TAGNAME])
-# ----------------------------
-# See if the linker supports building shared libraries.
-m4_defun([_LT_LINKER_SHLIBS],
-[AC_REQUIRE([LT_PATH_LD])dnl
-AC_REQUIRE([LT_PATH_NM])dnl
-m4_require([_LT_PATH_MANIFEST_TOOL])dnl
-m4_require([_LT_FILEUTILS_DEFAULTS])dnl
-m4_require([_LT_DECL_EGREP])dnl
-m4_require([_LT_DECL_SED])dnl
-m4_require([_LT_CMD_GLOBAL_SYMBOLS])dnl
-m4_require([_LT_TAG_COMPILER])dnl
-AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries])
-m4_if([$1], [CXX], [
- _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
- _LT_TAGVAR(exclude_expsyms, $1)=['_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*']
- case $host_os in
- aix[[4-9]]*)
- # If we're using GNU nm, then we don't want the "-C" option.
- # -C means demangle to AIX nm, but means don't demangle with GNU nm
- # Also, AIX nm treats weak defined symbols like other global defined
- # symbols, whereas GNU nm marks them as "W".
- if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then
- _LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols'
- else
- _LT_TAGVAR(export_symbols_cmds, $1)='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols'
- fi
- ;;
- pw32*)
- _LT_TAGVAR(export_symbols_cmds, $1)="$ltdll_cmds"
- ;;
- cygwin* | mingw* | cegcc*)
- case $cc_basename in
- cl*)
- _LT_TAGVAR(exclude_expsyms, $1)='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*'
- ;;
- *)
- _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1 DATA/;s/^.*[[ ]]__nm__\([[^ ]]*\)[[ ]][[^ ]]*/\1 DATA/;/^I[[ ]]/d;/^[[AITW]][[ ]]/s/.* //'\'' | sort | uniq > $export_symbols'
- _LT_TAGVAR(exclude_expsyms, $1)=['[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname']
- ;;
- esac
- ;;
- *)
- _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
- ;;
- esac
-], [
- runpath_var=
- _LT_TAGVAR(allow_undefined_flag, $1)=
- _LT_TAGVAR(always_export_symbols, $1)=no
- _LT_TAGVAR(archive_cmds, $1)=
- _LT_TAGVAR(archive_expsym_cmds, $1)=
- _LT_TAGVAR(compiler_needs_object, $1)=no
- _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no
- _LT_TAGVAR(export_dynamic_flag_spec, $1)=
- _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
- _LT_TAGVAR(hardcode_automatic, $1)=no
- _LT_TAGVAR(hardcode_direct, $1)=no
- _LT_TAGVAR(hardcode_direct_absolute, $1)=no
- _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=
- _LT_TAGVAR(hardcode_libdir_separator, $1)=
- _LT_TAGVAR(hardcode_minus_L, $1)=no
- _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported
- _LT_TAGVAR(inherit_rpath, $1)=no
- _LT_TAGVAR(link_all_deplibs, $1)=unknown
- _LT_TAGVAR(module_cmds, $1)=
- _LT_TAGVAR(module_expsym_cmds, $1)=
- _LT_TAGVAR(old_archive_from_new_cmds, $1)=
- _LT_TAGVAR(old_archive_from_expsyms_cmds, $1)=
- _LT_TAGVAR(thread_safe_flag_spec, $1)=
- _LT_TAGVAR(whole_archive_flag_spec, $1)=
- # include_expsyms should be a list of space-separated symbols to be *always*
- # included in the symbol list
- _LT_TAGVAR(include_expsyms, $1)=
- # exclude_expsyms can be an extended regexp of symbols to exclude
- # it will be wrapped by ` (' and `)$', so one must not match beginning or
- # end of line. Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc',
- # as well as any symbol that contains `d'.
- _LT_TAGVAR(exclude_expsyms, $1)=['_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*']
- # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out
- # platforms (ab)use it in PIC code, but their linkers get confused if
- # the symbol is explicitly referenced. Since portable code cannot
- # rely on this symbol name, it's probably fine to never include it in
- # preloaded symbol tables.
- # Exclude shared library initialization/finalization symbols.
-dnl Note also adjust exclude_expsyms for C++ above.
- extract_expsyms_cmds=
-
- case $host_os in
- cygwin* | mingw* | pw32* | cegcc*)
- # FIXME: the MSVC++ port hasn't been tested in a loooong time
- # When not using gcc, we currently assume that we are using
- # Microsoft Visual C++.
- if test "$GCC" != yes; then
- with_gnu_ld=no
- fi
- ;;
- interix*)
- # we just hope/assume this is gcc and not c89 (= MSVC++)
- with_gnu_ld=yes
- ;;
- openbsd*)
- with_gnu_ld=no
- ;;
- esac
-
- _LT_TAGVAR(ld_shlibs, $1)=yes
-
- # On some targets, GNU ld is compatible enough with the native linker
- # that we're better off using the native interface for both.
- lt_use_gnu_ld_interface=no
- if test "$with_gnu_ld" = yes; then
- case $host_os in
- aix*)
- # The AIX port of GNU ld has always aspired to compatibility
- # with the native linker. However, as the warning in the GNU ld
- # block says, versions before 2.19.5* couldn't really create working
- # shared libraries, regardless of the interface used.
- case `$LD -v 2>&1` in
- *\ \(GNU\ Binutils\)\ 2.19.5*) ;;
- *\ \(GNU\ Binutils\)\ 2.[[2-9]]*) ;;
- *\ \(GNU\ Binutils\)\ [[3-9]]*) ;;
- *)
- lt_use_gnu_ld_interface=yes
- ;;
- esac
- ;;
- *)
- lt_use_gnu_ld_interface=yes
- ;;
- esac
- fi
-
- if test "$lt_use_gnu_ld_interface" = yes; then
- # If archive_cmds runs LD, not CC, wlarc should be empty
- wlarc='${wl}'
-
- # Set some defaults for GNU ld with shared library support. These
- # are reset later if shared libraries are not supported. Putting them
- # here allows them to be overridden if necessary.
- runpath_var=LD_RUN_PATH
- _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
- _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic'
- # ancient GNU ld didn't support --whole-archive et. al.
- if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then
- _LT_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive'
- else
- _LT_TAGVAR(whole_archive_flag_spec, $1)=
- fi
- supports_anon_versioning=no
- case `$LD -v 2>&1` in
- *GNU\ gold*) supports_anon_versioning=yes ;;
- *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.10.*) ;; # catch versions < 2.11
- *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ...
- *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ...
- *\ 2.11.*) ;; # other 2.11 versions
- *) supports_anon_versioning=yes ;;
- esac
-
- # See if GNU ld supports shared libraries.
- case $host_os in
- aix[[3-9]]*)
- # On AIX/PPC, the GNU linker is very broken
- if test "$host_cpu" != ia64; then
- _LT_TAGVAR(ld_shlibs, $1)=no
- cat <<_LT_EOF 1>&2
-
-*** Warning: the GNU linker, at least up to release 2.19, is reported
-*** to be unable to reliably create shared libraries on AIX.
-*** Therefore, libtool is disabling shared libraries support. If you
-*** really care for shared libraries, you may want to install binutils
-*** 2.20 or above, or modify your PATH so that a non-GNU linker is found.
-*** You will then need to restart the configuration process.
-
-_LT_EOF
- fi
- ;;
-
- amigaos*)
- case $host_cpu in
- powerpc)
- # see comment about AmigaOS4 .so support
- _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
- _LT_TAGVAR(archive_expsym_cmds, $1)=''
- ;;
- m68k)
- _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)'
- _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
- _LT_TAGVAR(hardcode_minus_L, $1)=yes
- ;;
- esac
- ;;
-
- beos*)
- if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
- _LT_TAGVAR(allow_undefined_flag, $1)=unsupported
- # Joseph Beckenbach <jrb3 at best.com> says some releases of gcc
- # support --undefined. This deserves some investigation. FIXME
- _LT_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
- else
- _LT_TAGVAR(ld_shlibs, $1)=no
- fi
- ;;
-
- cygwin* | mingw* | pw32* | cegcc*)
- # _LT_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless,
- # as there is no search path for DLLs.
- _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
- _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-all-symbols'
- _LT_TAGVAR(allow_undefined_flag, $1)=unsupported
- _LT_TAGVAR(always_export_symbols, $1)=no
- _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes
- _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1 DATA/;s/^.*[[ ]]__nm__\([[^ ]]*\)[[ ]][[^ ]]*/\1 DATA/;/^I[[ ]]/d;/^[[AITW]][[ ]]/s/.* //'\'' | sort | uniq > $export_symbols'
- _LT_TAGVAR(exclude_expsyms, $1)=['[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname']
-
- if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then
- _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
- # If the export-symbols file already is a .def file (1st line
- # is EXPORTS), use it as is; otherwise, prepend...
- _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then
- cp $export_symbols $output_objdir/$soname.def;
- else
- echo EXPORTS > $output_objdir/$soname.def;
- cat $export_symbols >> $output_objdir/$soname.def;
- fi~
- $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
- else
- _LT_TAGVAR(ld_shlibs, $1)=no
- fi
- ;;
-
- haiku*)
- _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
- _LT_TAGVAR(link_all_deplibs, $1)=yes
- ;;
-
- interix[[3-9]]*)
- _LT_TAGVAR(hardcode_direct, $1)=no
- _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
- _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
- _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
- # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc.
- # Instead, shared libraries are loaded at an image base (0x10000000 by
- # default) and relocated if they conflict, which is a slow very memory
- # consuming and fragmenting process. To avoid this, we pick a random,
- # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link
- # time. Moving up from 0x10000000 also allows more sbrk(2) space.
- _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
- _LT_TAGVAR(archive_expsym_cmds, $1)='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
- ;;
-
- gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu)
- tmp_diet=no
- if test "$host_os" = linux-dietlibc; then
- case $cc_basename in
- diet\ *) tmp_diet=yes;; # linux-dietlibc with static linking (!diet-dyn)
- esac
- fi
- if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \
- && test "$tmp_diet" = no
- then
- tmp_addflag=' $pic_flag'
- tmp_sharedflag='-shared'
- case $cc_basename,$host_cpu in
- pgcc*) # Portland Group C compiler
- _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
- tmp_addflag=' $pic_flag'
- ;;
- pgf77* | pgf90* | pgf95* | pgfortran*)
- # Portland Group f77 and f90 compilers
- _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
- tmp_addflag=' $pic_flag -Mnomain' ;;
- ecc*,ia64* | icc*,ia64*) # Intel C compiler on ia64
- tmp_addflag=' -i_dynamic' ;;
- efc*,ia64* | ifort*,ia64*) # Intel Fortran compiler on ia64
- tmp_addflag=' -i_dynamic -nofor_main' ;;
- ifc* | ifort*) # Intel Fortran compiler
- tmp_addflag=' -nofor_main' ;;
- lf95*) # Lahey Fortran 8.1
- _LT_TAGVAR(whole_archive_flag_spec, $1)=
- tmp_sharedflag='--shared' ;;
- xl[[cC]]* | bgxl[[cC]]* | mpixl[[cC]]*) # IBM XL C 8.0 on PPC (deal with xlf below)
- tmp_sharedflag='-qmkshrobj'
- tmp_addflag= ;;
- nvcc*) # Cuda Compiler Driver 2.2
- _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
- _LT_TAGVAR(compiler_needs_object, $1)=yes
- ;;
- esac
- case `$CC -V 2>&1 | sed 5q` in
- *Sun\ C*) # Sun C 5.9
- _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
- _LT_TAGVAR(compiler_needs_object, $1)=yes
- tmp_sharedflag='-G' ;;
- *Sun\ F*) # Sun Fortran 8.3
- tmp_sharedflag='-G' ;;
- esac
- _LT_TAGVAR(archive_cmds, $1)='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-
- if test "x$supports_anon_versioning" = xyes; then
- _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~
- cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
- echo "local: *; };" >> $output_objdir/$libname.ver~
- $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib'
- fi
-
- case $cc_basename in
- xlf* | bgf* | bgxlf* | mpixlf*)
- # IBM XL Fortran 10.1 on PPC cannot create shared libs itself
- _LT_TAGVAR(whole_archive_flag_spec, $1)='--whole-archive$convenience --no-whole-archive'
- _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
- _LT_TAGVAR(archive_cmds, $1)='$LD -shared $libobjs $deplibs $linker_flags -soname $soname -o $lib'
- if test "x$supports_anon_versioning" = xyes; then
- _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~
- cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
- echo "local: *; };" >> $output_objdir/$libname.ver~
- $LD -shared $libobjs $deplibs $linker_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib'
- fi
- ;;
- esac
- else
- _LT_TAGVAR(ld_shlibs, $1)=no
- fi
- ;;
-
- netbsd*)
- if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
- _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib'
- wlarc=
- else
- _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
- _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
- fi
- ;;
-
- solaris*)
- if $LD -v 2>&1 | $GREP 'BFD 2\.8' > /dev/null; then
- _LT_TAGVAR(ld_shlibs, $1)=no
- cat <<_LT_EOF 1>&2
-
-*** Warning: The releases 2.8.* of the GNU linker cannot reliably
-*** create shared libraries on Solaris systems. Therefore, libtool
-*** is disabling shared libraries support. We urge you to upgrade GNU
-*** binutils to release 2.9.1 or newer. Another option is to modify
-*** your PATH or compiler configuration so that the native linker is
-*** used, and then restart.
-
-_LT_EOF
- elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
- _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
- _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
- else
- _LT_TAGVAR(ld_shlibs, $1)=no
- fi
- ;;
-
- sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*)
- case `$LD -v 2>&1` in
- *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.1[[0-5]].*)
- _LT_TAGVAR(ld_shlibs, $1)=no
- cat <<_LT_EOF 1>&2
-
-*** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not
-*** reliably create shared libraries on SCO systems. Therefore, libtool
-*** is disabling shared libraries support. We urge you to upgrade GNU
-*** binutils to release 2.16.91.0.3 or newer. Another option is to modify
-*** your PATH or compiler configuration so that the native linker is
-*** used, and then restart.
-
-_LT_EOF
- ;;
- *)
- # For security reasons, it is highly recommended that you always
- # use absolute paths for naming shared libraries, and exclude the
- # DT_RUNPATH tag from executables and libraries. But doing so
- # requires that you compile everything twice, which is a pain.
- if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
- _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
- _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
- _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
- else
- _LT_TAGVAR(ld_shlibs, $1)=no
- fi
- ;;
- esac
- ;;
-
- sunos4*)
- _LT_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags'
- wlarc=
- _LT_TAGVAR(hardcode_direct, $1)=yes
- _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
- ;;
-
- *)
- if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
- _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
- _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
- else
- _LT_TAGVAR(ld_shlibs, $1)=no
- fi
- ;;
- esac
-
- if test "$_LT_TAGVAR(ld_shlibs, $1)" = no; then
- runpath_var=
- _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=
- _LT_TAGVAR(export_dynamic_flag_spec, $1)=
- _LT_TAGVAR(whole_archive_flag_spec, $1)=
- fi
- else
- # PORTME fill in a description of your system's linker (not GNU ld)
- case $host_os in
- aix3*)
- _LT_TAGVAR(allow_undefined_flag, $1)=unsupported
- _LT_TAGVAR(always_export_symbols, $1)=yes
- _LT_TAGVAR(archive_expsym_cmds, $1)='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname'
- # Note: this linker hardcodes the directories in LIBPATH if there
- # are no directories specified by -L.
- _LT_TAGVAR(hardcode_minus_L, $1)=yes
- if test "$GCC" = yes && test -z "$lt_prog_compiler_static"; then
- # Neither direct hardcoding nor static linking is supported with a
- # broken collect2.
- _LT_TAGVAR(hardcode_direct, $1)=unsupported
- fi
- ;;
-
- aix[[4-9]]*)
- if test "$host_cpu" = ia64; then
- # On IA64, the linker does run time linking by default, so we don't
- # have to do anything special.
- aix_use_runtimelinking=no
- exp_sym_flag='-Bexport'
- no_entry_flag=""
- else
- # If we're using GNU nm, then we don't want the "-C" option.
- # -C means demangle to AIX nm, but means don't demangle with GNU nm
- # Also, AIX nm treats weak defined symbols like other global
- # defined symbols, whereas GNU nm marks them as "W".
- if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then
- _LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols'
- else
- _LT_TAGVAR(export_symbols_cmds, $1)='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols'
- fi
- aix_use_runtimelinking=no
-
- # Test if we are trying to use run time linking or normal
- # AIX style linking. If -brtl is somewhere in LDFLAGS, we
- # need to do runtime linking.
- case $host_os in aix4.[[23]]|aix4.[[23]].*|aix[[5-9]]*)
- for ld_flag in $LDFLAGS; do
- if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then
- aix_use_runtimelinking=yes
- break
- fi
- done
- ;;
- esac
-
- exp_sym_flag='-bexport'
- no_entry_flag='-bnoentry'
- fi
-
- # When large executables or shared objects are built, AIX ld can
- # have problems creating the table of contents. If linking a library
- # or program results in "error TOC overflow" add -mminimal-toc to
- # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not
- # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS.
-
- _LT_TAGVAR(archive_cmds, $1)=''
- _LT_TAGVAR(hardcode_direct, $1)=yes
- _LT_TAGVAR(hardcode_direct_absolute, $1)=yes
- _LT_TAGVAR(hardcode_libdir_separator, $1)=':'
- _LT_TAGVAR(link_all_deplibs, $1)=yes
- _LT_TAGVAR(file_list_spec, $1)='${wl}-f,'
-
- if test "$GCC" = yes; then
- case $host_os in aix4.[[012]]|aix4.[[012]].*)
- # We only want to do this on AIX 4.2 and lower, the check
- # below for broken collect2 doesn't work under 4.3+
- collect2name=`${CC} -print-prog-name=collect2`
- if test -f "$collect2name" &&
- strings "$collect2name" | $GREP resolve_lib_name >/dev/null
- then
- # We have reworked collect2
- :
- else
- # We have old collect2
- _LT_TAGVAR(hardcode_direct, $1)=unsupported
- # It fails to find uninstalled libraries when the uninstalled
- # path is not listed in the libpath. Setting hardcode_minus_L
- # to unsupported forces relinking
- _LT_TAGVAR(hardcode_minus_L, $1)=yes
- _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
- _LT_TAGVAR(hardcode_libdir_separator, $1)=
- fi
- ;;
- esac
- shared_flag='-shared'
- if test "$aix_use_runtimelinking" = yes; then
- shared_flag="$shared_flag "'${wl}-G'
- fi
- else
- # not using gcc
- if test "$host_cpu" = ia64; then
- # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release
- # chokes on -Wl,-G. The following line is correct:
- shared_flag='-G'
- else
- if test "$aix_use_runtimelinking" = yes; then
- shared_flag='${wl}-G'
- else
- shared_flag='${wl}-bM:SRE'
- fi
- fi
- fi
-
- _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-bexpall'
- # It seems that -bexpall does not export symbols beginning with
- # underscore (_), so it is better to generate a list of symbols to export.
- _LT_TAGVAR(always_export_symbols, $1)=yes
- if test "$aix_use_runtimelinking" = yes; then
- # Warning - without using the other runtime loading flags (-brtl),
- # -berok will link without error, but may produce a broken library.
- _LT_TAGVAR(allow_undefined_flag, $1)='-berok'
- # Determine the default libpath from the value encoded in an
- # empty executable.
- _LT_SYS_MODULE_PATH_AIX([$1])
- _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath"
- _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag"
- else
- if test "$host_cpu" = ia64; then
- _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib'
- _LT_TAGVAR(allow_undefined_flag, $1)="-z nodefs"
- _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols"
- else
- # Determine the default libpath from the value encoded in an
- # empty executable.
- _LT_SYS_MODULE_PATH_AIX([$1])
- _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath"
- # Warning - without using the other run time loading flags,
- # -berok will link without error, but may produce a broken library.
- _LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok'
- _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok'
- if test "$with_gnu_ld" = yes; then
- # We only use this code for GNU lds that support --whole-archive.
- _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive'
- else
- # Exported symbols can be pulled into shared objects from archives
- _LT_TAGVAR(whole_archive_flag_spec, $1)='$convenience'
- fi
- _LT_TAGVAR(archive_cmds_need_lc, $1)=yes
- # This is similar to how AIX traditionally builds its shared libraries.
- _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname'
- fi
- fi
- ;;
-
- amigaos*)
- case $host_cpu in
- powerpc)
- # see comment about AmigaOS4 .so support
- _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
- _LT_TAGVAR(archive_expsym_cmds, $1)=''
- ;;
- m68k)
- _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)'
- _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
- _LT_TAGVAR(hardcode_minus_L, $1)=yes
- ;;
- esac
- ;;
-
- bsdi[[45]]*)
- _LT_TAGVAR(export_dynamic_flag_spec, $1)=-rdynamic
- ;;
-
- cygwin* | mingw* | pw32* | cegcc*)
- # When not using gcc, we currently assume that we are using
- # Microsoft Visual C++.
- # hardcode_libdir_flag_spec is actually meaningless, as there is
- # no search path for DLLs.
- case $cc_basename in
- cl*)
- # Native MSVC
- _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' '
- _LT_TAGVAR(allow_undefined_flag, $1)=unsupported
- _LT_TAGVAR(always_export_symbols, $1)=yes
- _LT_TAGVAR(file_list_spec, $1)='@'
- # Tell ltmain to make .lib files, not .a files.
- libext=lib
- # Tell ltmain to make .dll files, not .so files.
- shrext_cmds=".dll"
- # FIXME: Setting linknames here is a bad hack.
- _LT_TAGVAR(archive_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames='
- _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then
- sed -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp;
- else
- sed -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp;
- fi~
- $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~
- linknames='
- # The linker will not automatically build a static lib if we build a DLL.
- # _LT_TAGVAR(old_archive_from_new_cmds, $1)='true'
- _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes
- _LT_TAGVAR(exclude_expsyms, $1)='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*'
- _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1,DATA/'\'' | $SED -e '\''/^[[AITW]][[ ]]/s/.*[[ ]]//'\'' | sort | uniq > $export_symbols'
- # Don't use ranlib
- _LT_TAGVAR(old_postinstall_cmds, $1)='chmod 644 $oldlib'
- _LT_TAGVAR(postlink_cmds, $1)='lt_outputfile="@OUTPUT@"~
- lt_tool_outputfile="@TOOL_OUTPUT@"~
- case $lt_outputfile in
- *.exe|*.EXE) ;;
- *)
- lt_outputfile="$lt_outputfile.exe"
- lt_tool_outputfile="$lt_tool_outputfile.exe"
- ;;
- esac~
- if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then
- $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1;
- $RM "$lt_outputfile.manifest";
- fi'
- ;;
- *)
- # Assume MSVC wrapper
- _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' '
- _LT_TAGVAR(allow_undefined_flag, $1)=unsupported
- # Tell ltmain to make .lib files, not .a files.
- libext=lib
- # Tell ltmain to make .dll files, not .so files.
- shrext_cmds=".dll"
- # FIXME: Setting linknames here is a bad hack.
- _LT_TAGVAR(archive_cmds, $1)='$CC -o $lib $libobjs $compiler_flags `func_echo_all "$deplibs" | $SED '\''s/ -lc$//'\''` -link -dll~linknames='
- # The linker will automatically build a .lib file if we build a DLL.
- _LT_TAGVAR(old_archive_from_new_cmds, $1)='true'
- # FIXME: Should let the user specify the lib program.
- _LT_TAGVAR(old_archive_cmds, $1)='lib -OUT:$oldlib$oldobjs$old_deplibs'
- _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes
- ;;
- esac
- ;;
-
- darwin* | rhapsody*)
- _LT_DARWIN_LINKER_FEATURES($1)
- ;;
-
- dgux*)
- _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
- _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
- _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
- ;;
-
- # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor
- # support. Future versions do this automatically, but an explicit c++rt0.o
- # does not break anything, and helps significantly (at the cost of a little
- # extra space).
- freebsd2.2*)
- _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o'
- _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
- _LT_TAGVAR(hardcode_direct, $1)=yes
- _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
- ;;
-
- # Unfortunately, older versions of FreeBSD 2 do not have this feature.
- freebsd2.*)
- _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'
- _LT_TAGVAR(hardcode_direct, $1)=yes
- _LT_TAGVAR(hardcode_minus_L, $1)=yes
- _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
- ;;
-
- # FreeBSD 3 and greater uses gcc -shared to do shared libraries.
- freebsd* | dragonfly*)
- _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
- _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
- _LT_TAGVAR(hardcode_direct, $1)=yes
- _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
- ;;
-
- hpux9*)
- if test "$GCC" = yes; then
- _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared $pic_flag ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
- else
- _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
- fi
- _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir'
- _LT_TAGVAR(hardcode_libdir_separator, $1)=:
- _LT_TAGVAR(hardcode_direct, $1)=yes
-
- # hardcode_minus_L: Not really in the search PATH,
- # but as the default location of the library.
- _LT_TAGVAR(hardcode_minus_L, $1)=yes
- _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
- ;;
-
- hpux10*)
- if test "$GCC" = yes && test "$with_gnu_ld" = no; then
- _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
- else
- _LT_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'
- fi
- if test "$with_gnu_ld" = no; then
- _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir'
- _LT_TAGVAR(hardcode_libdir_separator, $1)=:
- _LT_TAGVAR(hardcode_direct, $1)=yes
- _LT_TAGVAR(hardcode_direct_absolute, $1)=yes
- _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
- # hardcode_minus_L: Not really in the search PATH,
- # but as the default location of the library.
- _LT_TAGVAR(hardcode_minus_L, $1)=yes
- fi
- ;;
-
- hpux11*)
- if test "$GCC" = yes && test "$with_gnu_ld" = no; then
- case $host_cpu in
- hppa*64*)
- _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
- ;;
- ia64*)
- _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
- ;;
- *)
- _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
- ;;
- esac
- else
- case $host_cpu in
- hppa*64*)
- _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
- ;;
- ia64*)
- _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
- ;;
- *)
- m4_if($1, [], [
- # Older versions of the 11.00 compiler do not understand -b yet
- # (HP92453-01 A.11.01.20 doesn't, HP92453-01 B.11.X.35175-35176.GP does)
- _LT_LINKER_OPTION([if $CC understands -b],
- _LT_TAGVAR(lt_cv_prog_compiler__b, $1), [-b],
- [_LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'],
- [_LT_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'])],
- [_LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'])
- ;;
- esac
- fi
- if test "$with_gnu_ld" = no; then
- _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir'
- _LT_TAGVAR(hardcode_libdir_separator, $1)=:
-
- case $host_cpu in
- hppa*64*|ia64*)
- _LT_TAGVAR(hardcode_direct, $1)=no
- _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
- ;;
- *)
- _LT_TAGVAR(hardcode_direct, $1)=yes
- _LT_TAGVAR(hardcode_direct_absolute, $1)=yes
- _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
-
- # hardcode_minus_L: Not really in the search PATH,
- # but as the default location of the library.
- _LT_TAGVAR(hardcode_minus_L, $1)=yes
- ;;
- esac
- fi
- ;;
-
- irix5* | irix6* | nonstopux*)
- if test "$GCC" = yes; then
- _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
- # Try to use the -exported_symbol ld option, if it does not
- # work, assume that -exports_file does not work either and
- # implicitly export all symbols.
- # This should be the same for all languages, so no per-tag cache variable.
- AC_CACHE_CHECK([whether the $host_os linker accepts -exported_symbol],
- [lt_cv_irix_exported_symbol],
- [save_LDFLAGS="$LDFLAGS"
- LDFLAGS="$LDFLAGS -shared ${wl}-exported_symbol ${wl}foo ${wl}-update_registry ${wl}/dev/null"
- AC_LINK_IFELSE(
- [AC_LANG_SOURCE(
- [AC_LANG_CASE([C], [[int foo (void) { return 0; }]],
- [C++], [[int foo (void) { return 0; }]],
- [Fortran 77], [[
- subroutine foo
- end]],
- [Fortran], [[
- subroutine foo
- end]])])],
- [lt_cv_irix_exported_symbol=yes],
- [lt_cv_irix_exported_symbol=no])
- LDFLAGS="$save_LDFLAGS"])
- if test "$lt_cv_irix_exported_symbol" = yes; then
- _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations ${wl}-exports_file ${wl}$export_symbols -o $lib'
- fi
- else
- _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
- _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -exports_file $export_symbols -o $lib'
- fi
- _LT_TAGVAR(archive_cmds_need_lc, $1)='no'
- _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
- _LT_TAGVAR(hardcode_libdir_separator, $1)=:
- _LT_TAGVAR(inherit_rpath, $1)=yes
- _LT_TAGVAR(link_all_deplibs, $1)=yes
- ;;
-
- netbsd*)
- if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
- _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out
- else
- _LT_TAGVAR(archive_cmds, $1)='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF
- fi
- _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
- _LT_TAGVAR(hardcode_direct, $1)=yes
- _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
- ;;
-
- newsos6)
- _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
- _LT_TAGVAR(hardcode_direct, $1)=yes
- _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
- _LT_TAGVAR(hardcode_libdir_separator, $1)=:
- _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
- ;;
-
- *nto* | *qnx*)
- ;;
-
- openbsd*)
- if test -f /usr/libexec/ld.so; then
- _LT_TAGVAR(hardcode_direct, $1)=yes
- _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
- _LT_TAGVAR(hardcode_direct_absolute, $1)=yes
- if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
- _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
- _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols'
- _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
- _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
- else
- case $host_os in
- openbsd[[01]].* | openbsd2.[[0-7]] | openbsd2.[[0-7]].*)
- _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'
- _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
- ;;
- *)
- _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
- _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
- ;;
- esac
- fi
- else
- _LT_TAGVAR(ld_shlibs, $1)=no
- fi
- ;;
-
- os2*)
- _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
- _LT_TAGVAR(hardcode_minus_L, $1)=yes
- _LT_TAGVAR(allow_undefined_flag, $1)=unsupported
- _LT_TAGVAR(archive_cmds, $1)='$ECHO "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~echo DATA >> $output_objdir/$libname.def~echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def'
- _LT_TAGVAR(old_archive_from_new_cmds, $1)='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def'
- ;;
-
- osf3*)
- if test "$GCC" = yes; then
- _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*'
- _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
- else
- _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*'
- _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
- fi
- _LT_TAGVAR(archive_cmds_need_lc, $1)='no'
- _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
- _LT_TAGVAR(hardcode_libdir_separator, $1)=:
- ;;
-
- osf4* | osf5*) # as osf3* with the addition of -msym flag
- if test "$GCC" = yes; then
- _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*'
- _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $pic_flag $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
- _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
- else
- _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*'
- _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
- _LT_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; printf "%s\\n" "-hidden">> $lib.exp~
- $CC -shared${allow_undefined_flag} ${wl}-input ${wl}$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~$RM $lib.exp'
-
- # Both c and cxx compiler support -rpath directly
- _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir'
- fi
- _LT_TAGVAR(archive_cmds_need_lc, $1)='no'
- _LT_TAGVAR(hardcode_libdir_separator, $1)=:
- ;;
-
- solaris*)
- _LT_TAGVAR(no_undefined_flag, $1)=' -z defs'
- if test "$GCC" = yes; then
- wlarc='${wl}'
- _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
- _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
- $CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp'
- else
- case `$CC -V 2>&1` in
- *"Compilers 5.0"*)
- wlarc=''
- _LT_TAGVAR(archive_cmds, $1)='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags'
- _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
- $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp'
- ;;
- *)
- wlarc='${wl}'
- _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $compiler_flags'
- _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
- $CC -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp'
- ;;
- esac
- fi
- _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
- _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
- case $host_os in
- solaris2.[[0-5]] | solaris2.[[0-5]].*) ;;
- *)
- # The compiler driver will combine and reorder linker options,
- # but understands `-z linker_flag'. GCC discards it without `$wl',
- # but is careful enough not to reorder.
- # Supported since Solaris 2.6 (maybe 2.5.1?)
- if test "$GCC" = yes; then
- _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract'
- else
- _LT_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract'
- fi
- ;;
- esac
- _LT_TAGVAR(link_all_deplibs, $1)=yes
- ;;
-
- sunos4*)
- if test "x$host_vendor" = xsequent; then
- # Use $CC to link under sequent, because it throws in some extra .o
- # files that make .init and .fini sections work.
- _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags'
- else
- _LT_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags'
- fi
- _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
- _LT_TAGVAR(hardcode_direct, $1)=yes
- _LT_TAGVAR(hardcode_minus_L, $1)=yes
- _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
- ;;
-
- sysv4)
- case $host_vendor in
- sni)
- _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
- _LT_TAGVAR(hardcode_direct, $1)=yes # is this really true???
- ;;
- siemens)
- ## LD is ld it makes a PLAMLIB
- ## CC just makes a GrossModule.
- _LT_TAGVAR(archive_cmds, $1)='$LD -G -o $lib $libobjs $deplibs $linker_flags'
- _LT_TAGVAR(reload_cmds, $1)='$CC -r -o $output$reload_objs'
- _LT_TAGVAR(hardcode_direct, $1)=no
- ;;
- motorola)
- _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
- _LT_TAGVAR(hardcode_direct, $1)=no #Motorola manual says yes, but my tests say they lie
- ;;
- esac
- runpath_var='LD_RUN_PATH'
- _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
- ;;
-
- sysv4.3*)
- _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
- _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
- _LT_TAGVAR(export_dynamic_flag_spec, $1)='-Bexport'
- ;;
-
- sysv4*MP*)
- if test -d /usr/nec; then
- _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
- _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
- runpath_var=LD_RUN_PATH
- hardcode_runpath_var=yes
- _LT_TAGVAR(ld_shlibs, $1)=yes
- fi
- ;;
-
- sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*)
- _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text'
- _LT_TAGVAR(archive_cmds_need_lc, $1)=no
- _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
- runpath_var='LD_RUN_PATH'
-
- if test "$GCC" = yes; then
- _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
- _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
- else
- _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
- _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
- fi
- ;;
-
- sysv5* | sco3.2v5* | sco5v6*)
- # Note: We can NOT use -z defs as we might desire, because we do not
- # link with -lc, and that would cause any symbols used from libc to
- # always be unresolved, which means just about no library would
- # ever link correctly. If we're not using GNU ld we use -z text
- # though, which does catch some bad symbols but isn't as heavy-handed
- # as -z defs.
- _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text'
- _LT_TAGVAR(allow_undefined_flag, $1)='${wl}-z,nodefs'
- _LT_TAGVAR(archive_cmds_need_lc, $1)=no
- _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
- _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R,$libdir'
- _LT_TAGVAR(hardcode_libdir_separator, $1)=':'
- _LT_TAGVAR(link_all_deplibs, $1)=yes
- _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Bexport'
- runpath_var='LD_RUN_PATH'
-
- if test "$GCC" = yes; then
- _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
- _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
- else
- _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
- _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
- fi
- ;;
-
- uts4*)
- _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
- _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
- _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
- ;;
-
- *)
- _LT_TAGVAR(ld_shlibs, $1)=no
- ;;
- esac
-
- if test x$host_vendor = xsni; then
- case $host in
- sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*)
- _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Blargedynsym'
- ;;
- esac
- fi
- fi
-])
-AC_MSG_RESULT([$_LT_TAGVAR(ld_shlibs, $1)])
-test "$_LT_TAGVAR(ld_shlibs, $1)" = no && can_build_shared=no
-
-_LT_TAGVAR(with_gnu_ld, $1)=$with_gnu_ld
-
-_LT_DECL([], [libext], [0], [Old archive suffix (normally "a")])dnl
-_LT_DECL([], [shrext_cmds], [1], [Shared library suffix (normally ".so")])dnl
-_LT_DECL([], [extract_expsyms_cmds], [2],
- [The commands to extract the exported symbol list from a shared archive])
-
-#
-# Do we need to explicitly link libc?
-#
-case "x$_LT_TAGVAR(archive_cmds_need_lc, $1)" in
-x|xyes)
- # Assume -lc should be added
- _LT_TAGVAR(archive_cmds_need_lc, $1)=yes
-
- if test "$enable_shared" = yes && test "$GCC" = yes; then
- case $_LT_TAGVAR(archive_cmds, $1) in
- *'~'*)
- # FIXME: we may have to deal with multi-command sequences.
- ;;
- '$CC '*)
- # Test whether the compiler implicitly links with -lc since on some
- # systems, -lgcc has to come before -lc. If gcc already passes -lc
- # to ld, don't add -lc before -lgcc.
- AC_CACHE_CHECK([whether -lc should be explicitly linked in],
- [lt_cv_]_LT_TAGVAR(archive_cmds_need_lc, $1),
- [$RM conftest*
- echo "$lt_simple_compile_test_code" > conftest.$ac_ext
-
- if AC_TRY_EVAL(ac_compile) 2>conftest.err; then
- soname=conftest
- lib=conftest
- libobjs=conftest.$ac_objext
- deplibs=
- wl=$_LT_TAGVAR(lt_prog_compiler_wl, $1)
- pic_flag=$_LT_TAGVAR(lt_prog_compiler_pic, $1)
- compiler_flags=-v
- linker_flags=-v
- verstring=
- output_objdir=.
- libname=conftest
- lt_save_allow_undefined_flag=$_LT_TAGVAR(allow_undefined_flag, $1)
- _LT_TAGVAR(allow_undefined_flag, $1)=
- if AC_TRY_EVAL(_LT_TAGVAR(archive_cmds, $1) 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1)
- then
- lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1)=no
- else
- lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1)=yes
- fi
- _LT_TAGVAR(allow_undefined_flag, $1)=$lt_save_allow_undefined_flag
- else
- cat conftest.err 1>&5
- fi
- $RM conftest*
- ])
- _LT_TAGVAR(archive_cmds_need_lc, $1)=$lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1)
- ;;
- esac
- fi
- ;;
-esac
-
-_LT_TAGDECL([build_libtool_need_lc], [archive_cmds_need_lc], [0],
- [Whether or not to add -lc for building shared libraries])
-_LT_TAGDECL([allow_libtool_libs_with_static_runtimes],
- [enable_shared_with_static_runtimes], [0],
- [Whether or not to disallow shared libs when runtime libs are static])
-_LT_TAGDECL([], [export_dynamic_flag_spec], [1],
- [Compiler flag to allow reflexive dlopens])
-_LT_TAGDECL([], [whole_archive_flag_spec], [1],
- [Compiler flag to generate shared objects directly from archives])
-_LT_TAGDECL([], [compiler_needs_object], [1],
- [Whether the compiler copes with passing no objects directly])
-_LT_TAGDECL([], [old_archive_from_new_cmds], [2],
- [Create an old-style archive from a shared archive])
-_LT_TAGDECL([], [old_archive_from_expsyms_cmds], [2],
- [Create a temporary old-style archive to link instead of a shared archive])
-_LT_TAGDECL([], [archive_cmds], [2], [Commands used to build a shared archive])
-_LT_TAGDECL([], [archive_expsym_cmds], [2])
-_LT_TAGDECL([], [module_cmds], [2],
- [Commands used to build a loadable module if different from building
- a shared archive.])
-_LT_TAGDECL([], [module_expsym_cmds], [2])
-_LT_TAGDECL([], [with_gnu_ld], [1],
- [Whether we are building with GNU ld or not])
-_LT_TAGDECL([], [allow_undefined_flag], [1],
- [Flag that allows shared libraries with undefined symbols to be built])
-_LT_TAGDECL([], [no_undefined_flag], [1],
- [Flag that enforces no undefined symbols])
-_LT_TAGDECL([], [hardcode_libdir_flag_spec], [1],
- [Flag to hardcode $libdir into a binary during linking.
- This must work even if $libdir does not exist])
-_LT_TAGDECL([], [hardcode_libdir_separator], [1],
- [Whether we need a single "-rpath" flag with a separated argument])
-_LT_TAGDECL([], [hardcode_direct], [0],
- [Set to "yes" if using DIR/libNAME${shared_ext} during linking hardcodes
- DIR into the resulting binary])
-_LT_TAGDECL([], [hardcode_direct_absolute], [0],
- [Set to "yes" if using DIR/libNAME${shared_ext} during linking hardcodes
- DIR into the resulting binary and the resulting library dependency is
- "absolute", i.e impossible to change by setting ${shlibpath_var} if the
- library is relocated])
-_LT_TAGDECL([], [hardcode_minus_L], [0],
- [Set to "yes" if using the -LDIR flag during linking hardcodes DIR
- into the resulting binary])
-_LT_TAGDECL([], [hardcode_shlibpath_var], [0],
- [Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR
- into the resulting binary])
-_LT_TAGDECL([], [hardcode_automatic], [0],
- [Set to "yes" if building a shared library automatically hardcodes DIR
- into the library and all subsequent libraries and executables linked
- against it])
-_LT_TAGDECL([], [inherit_rpath], [0],
- [Set to yes if linker adds runtime paths of dependent libraries
- to runtime path list])
-_LT_TAGDECL([], [link_all_deplibs], [0],
- [Whether libtool must link a program against all its dependency libraries])
-_LT_TAGDECL([], [always_export_symbols], [0],
- [Set to "yes" if exported symbols are required])
-_LT_TAGDECL([], [export_symbols_cmds], [2],
- [The commands to list exported symbols])
-_LT_TAGDECL([], [exclude_expsyms], [1],
- [Symbols that should not be listed in the preloaded symbols])
-_LT_TAGDECL([], [include_expsyms], [1],
- [Symbols that must always be exported])
-_LT_TAGDECL([], [prelink_cmds], [2],
- [Commands necessary for linking programs (against libraries) with templates])
-_LT_TAGDECL([], [postlink_cmds], [2],
- [Commands necessary for finishing linking programs])
-_LT_TAGDECL([], [file_list_spec], [1],
- [Specify filename containing input files])
-dnl FIXME: Not yet implemented
-dnl _LT_TAGDECL([], [thread_safe_flag_spec], [1],
-dnl [Compiler flag to generate thread safe objects])
-])# _LT_LINKER_SHLIBS
-
-
-# _LT_LANG_C_CONFIG([TAG])
-# ------------------------
-# Ensure that the configuration variables for a C compiler are suitably
-# defined. These variables are subsequently used by _LT_CONFIG to write
-# the compiler configuration to `libtool'.
-m4_defun([_LT_LANG_C_CONFIG],
-[m4_require([_LT_DECL_EGREP])dnl
-lt_save_CC="$CC"
-AC_LANG_PUSH(C)
-
-# Source file extension for C test sources.
-ac_ext=c
-
-# Object file extension for compiled C test sources.
-objext=o
-_LT_TAGVAR(objext, $1)=$objext
-
-# Code to be used in simple compile tests
-lt_simple_compile_test_code="int some_variable = 0;"
-
-# Code to be used in simple link tests
-lt_simple_link_test_code='int main(){return(0);}'
-
-_LT_TAG_COMPILER
-# Save the default compiler, since it gets overwritten when the other
-# tags are being tested, and _LT_TAGVAR(compiler, []) is a NOP.
-compiler_DEFAULT=$CC
-
-# save warnings/boilerplate of simple test code
-_LT_COMPILER_BOILERPLATE
-_LT_LINKER_BOILERPLATE
-
-## CAVEAT EMPTOR:
-## There is no encapsulation within the following macros, do not change
-## the running order or otherwise move them around unless you know exactly
-## what you are doing...
-if test -n "$compiler"; then
- _LT_COMPILER_NO_RTTI($1)
- _LT_COMPILER_PIC($1)
- _LT_COMPILER_C_O($1)
- _LT_COMPILER_FILE_LOCKS($1)
- _LT_LINKER_SHLIBS($1)
- _LT_SYS_DYNAMIC_LINKER($1)
- _LT_LINKER_HARDCODE_LIBPATH($1)
- LT_SYS_DLOPEN_SELF
- _LT_CMD_STRIPLIB
-
- # Report which library types will actually be built
- AC_MSG_CHECKING([if libtool supports shared libraries])
- AC_MSG_RESULT([$can_build_shared])
-
- AC_MSG_CHECKING([whether to build shared libraries])
- test "$can_build_shared" = "no" && enable_shared=no
-
- # On AIX, shared libraries and static libraries use the same namespace, and
- # are all built from PIC.
- case $host_os in
- aix3*)
- test "$enable_shared" = yes && enable_static=no
- if test -n "$RANLIB"; then
- archive_cmds="$archive_cmds~\$RANLIB \$lib"
- postinstall_cmds='$RANLIB $lib'
- fi
- ;;
-
- aix[[4-9]]*)
- if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then
- test "$enable_shared" = yes && enable_static=no
- fi
- ;;
- esac
- AC_MSG_RESULT([$enable_shared])
-
- AC_MSG_CHECKING([whether to build static libraries])
- # Make sure either enable_shared or enable_static is yes.
- test "$enable_shared" = yes || enable_static=yes
- AC_MSG_RESULT([$enable_static])
-
- _LT_CONFIG($1)
-fi
-AC_LANG_POP
-CC="$lt_save_CC"
-])# _LT_LANG_C_CONFIG
-
-
-# _LT_LANG_CXX_CONFIG([TAG])
-# --------------------------
-# Ensure that the configuration variables for a C++ compiler are suitably
-# defined. These variables are subsequently used by _LT_CONFIG to write
-# the compiler configuration to `libtool'.
-m4_defun([_LT_LANG_CXX_CONFIG],
-[m4_require([_LT_FILEUTILS_DEFAULTS])dnl
-m4_require([_LT_DECL_EGREP])dnl
-m4_require([_LT_PATH_MANIFEST_TOOL])dnl
-if test -n "$CXX" && ( test "X$CXX" != "Xno" &&
- ( (test "X$CXX" = "Xg++" && `g++ -v >/dev/null 2>&1` ) ||
- (test "X$CXX" != "Xg++"))) ; then
- AC_PROG_CXXCPP
-else
- _lt_caught_CXX_error=yes
-fi
-
-AC_LANG_PUSH(C++)
-_LT_TAGVAR(archive_cmds_need_lc, $1)=no
-_LT_TAGVAR(allow_undefined_flag, $1)=
-_LT_TAGVAR(always_export_symbols, $1)=no
-_LT_TAGVAR(archive_expsym_cmds, $1)=
-_LT_TAGVAR(compiler_needs_object, $1)=no
-_LT_TAGVAR(export_dynamic_flag_spec, $1)=
-_LT_TAGVAR(hardcode_direct, $1)=no
-_LT_TAGVAR(hardcode_direct_absolute, $1)=no
-_LT_TAGVAR(hardcode_libdir_flag_spec, $1)=
-_LT_TAGVAR(hardcode_libdir_separator, $1)=
-_LT_TAGVAR(hardcode_minus_L, $1)=no
-_LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported
-_LT_TAGVAR(hardcode_automatic, $1)=no
-_LT_TAGVAR(inherit_rpath, $1)=no
-_LT_TAGVAR(module_cmds, $1)=
-_LT_TAGVAR(module_expsym_cmds, $1)=
-_LT_TAGVAR(link_all_deplibs, $1)=unknown
-_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds
-_LT_TAGVAR(reload_flag, $1)=$reload_flag
-_LT_TAGVAR(reload_cmds, $1)=$reload_cmds
-_LT_TAGVAR(no_undefined_flag, $1)=
-_LT_TAGVAR(whole_archive_flag_spec, $1)=
-_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no
-
-# Source file extension for C++ test sources.
-ac_ext=cpp
-
-# Object file extension for compiled C++ test sources.
-objext=o
-_LT_TAGVAR(objext, $1)=$objext
-
-# No sense in running all these tests if we already determined that
-# the CXX compiler isn't working. Some variables (like enable_shared)
-# are currently assumed to apply to all compilers on this platform,
-# and will be corrupted by setting them based on a non-working compiler.
-if test "$_lt_caught_CXX_error" != yes; then
- # Code to be used in simple compile tests
- lt_simple_compile_test_code="int some_variable = 0;"
-
- # Code to be used in simple link tests
- lt_simple_link_test_code='int main(int, char *[[]]) { return(0); }'
-
- # ltmain only uses $CC for tagged configurations so make sure $CC is set.
- _LT_TAG_COMPILER
-
- # save warnings/boilerplate of simple test code
- _LT_COMPILER_BOILERPLATE
- _LT_LINKER_BOILERPLATE
-
- # Allow CC to be a program name with arguments.
- lt_save_CC=$CC
- lt_save_CFLAGS=$CFLAGS
- lt_save_LD=$LD
- lt_save_GCC=$GCC
- GCC=$GXX
- lt_save_with_gnu_ld=$with_gnu_ld
- lt_save_path_LD=$lt_cv_path_LD
- if test -n "${lt_cv_prog_gnu_ldcxx+set}"; then
- lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx
- else
- $as_unset lt_cv_prog_gnu_ld
- fi
- if test -n "${lt_cv_path_LDCXX+set}"; then
- lt_cv_path_LD=$lt_cv_path_LDCXX
- else
- $as_unset lt_cv_path_LD
- fi
- test -z "${LDCXX+set}" || LD=$LDCXX
- CC=${CXX-"c++"}
- CFLAGS=$CXXFLAGS
- compiler=$CC
- _LT_TAGVAR(compiler, $1)=$CC
- _LT_CC_BASENAME([$compiler])
-
- if test -n "$compiler"; then
- # We don't want -fno-exception when compiling C++ code, so set the
- # no_builtin_flag separately
- if test "$GXX" = yes; then
- _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin'
- else
- _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=
- fi
-
- if test "$GXX" = yes; then
- # Set up default GNU C++ configuration
-
- LT_PATH_LD
-
- # Check if GNU C++ uses GNU ld as the underlying linker, since the
- # archiving commands below assume that GNU ld is being used.
- if test "$with_gnu_ld" = yes; then
- _LT_TAGVAR(archive_cmds, $1)='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib'
- _LT_TAGVAR(archive_expsym_cmds, $1)='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
-
- _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
- _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic'
-
- # If archive_cmds runs LD, not CC, wlarc should be empty
- # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to
- # investigate it a little bit more. (MM)
- wlarc='${wl}'
-
- # ancient GNU ld didn't support --whole-archive et. al.
- if eval "`$CC -print-prog-name=ld` --help 2>&1" |
- $GREP 'no-whole-archive' > /dev/null; then
- _LT_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive'
- else
- _LT_TAGVAR(whole_archive_flag_spec, $1)=
- fi
- else
- with_gnu_ld=no
- wlarc=
-
- # A generic and very simple default shared library creation
- # command for GNU C++ for the case where it uses the native
- # linker, instead of GNU ld. If possible, this setting should
- # overridden to take advantage of the native linker features on
- # the platform it is being used on.
- _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib'
- fi
-
- # Commands to make compiler produce verbose output that lists
- # what "hidden" libraries, object files and flags are used when
- # linking a shared library.
- output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"'
-
- else
- GXX=no
- with_gnu_ld=no
- wlarc=
- fi
-
- # PORTME: fill in a description of your system's C++ link characteristics
- AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries])
- _LT_TAGVAR(ld_shlibs, $1)=yes
- case $host_os in
- aix3*)
- # FIXME: insert proper C++ library support
- _LT_TAGVAR(ld_shlibs, $1)=no
- ;;
- aix[[4-9]]*)
- if test "$host_cpu" = ia64; then
- # On IA64, the linker does run time linking by default, so we don't
- # have to do anything special.
- aix_use_runtimelinking=no
- exp_sym_flag='-Bexport'
- no_entry_flag=""
- else
- aix_use_runtimelinking=no
-
- # Test if we are trying to use run time linking or normal
- # AIX style linking. If -brtl is somewhere in LDFLAGS, we
- # need to do runtime linking.
- case $host_os in aix4.[[23]]|aix4.[[23]].*|aix[[5-9]]*)
- for ld_flag in $LDFLAGS; do
- case $ld_flag in
- *-brtl*)
- aix_use_runtimelinking=yes
- break
- ;;
- esac
- done
- ;;
- esac
-
- exp_sym_flag='-bexport'
- no_entry_flag='-bnoentry'
- fi
-
- # When large executables or shared objects are built, AIX ld can
- # have problems creating the table of contents. If linking a library
- # or program results in "error TOC overflow" add -mminimal-toc to
- # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not
- # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS.
-
- _LT_TAGVAR(archive_cmds, $1)=''
- _LT_TAGVAR(hardcode_direct, $1)=yes
- _LT_TAGVAR(hardcode_direct_absolute, $1)=yes
- _LT_TAGVAR(hardcode_libdir_separator, $1)=':'
- _LT_TAGVAR(link_all_deplibs, $1)=yes
- _LT_TAGVAR(file_list_spec, $1)='${wl}-f,'
-
- if test "$GXX" = yes; then
- case $host_os in aix4.[[012]]|aix4.[[012]].*)
- # We only want to do this on AIX 4.2 and lower, the check
- # below for broken collect2 doesn't work under 4.3+
- collect2name=`${CC} -print-prog-name=collect2`
- if test -f "$collect2name" &&
- strings "$collect2name" | $GREP resolve_lib_name >/dev/null
- then
- # We have reworked collect2
- :
- else
- # We have old collect2
- _LT_TAGVAR(hardcode_direct, $1)=unsupported
- # It fails to find uninstalled libraries when the uninstalled
- # path is not listed in the libpath. Setting hardcode_minus_L
- # to unsupported forces relinking
- _LT_TAGVAR(hardcode_minus_L, $1)=yes
- _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
- _LT_TAGVAR(hardcode_libdir_separator, $1)=
- fi
- esac
- shared_flag='-shared'
- if test "$aix_use_runtimelinking" = yes; then
- shared_flag="$shared_flag "'${wl}-G'
- fi
- else
- # not using gcc
- if test "$host_cpu" = ia64; then
- # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release
- # chokes on -Wl,-G. The following line is correct:
- shared_flag='-G'
- else
- if test "$aix_use_runtimelinking" = yes; then
- shared_flag='${wl}-G'
- else
- shared_flag='${wl}-bM:SRE'
- fi
- fi
- fi
-
- _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-bexpall'
- # It seems that -bexpall does not export symbols beginning with
- # underscore (_), so it is better to generate a list of symbols to
- # export.
- _LT_TAGVAR(always_export_symbols, $1)=yes
- if test "$aix_use_runtimelinking" = yes; then
- # Warning - without using the other runtime loading flags (-brtl),
- # -berok will link without error, but may produce a broken library.
- _LT_TAGVAR(allow_undefined_flag, $1)='-berok'
- # Determine the default libpath from the value encoded in an empty
- # executable.
- _LT_SYS_MODULE_PATH_AIX([$1])
- _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath"
-
- _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag"
- else
- if test "$host_cpu" = ia64; then
- _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib'
- _LT_TAGVAR(allow_undefined_flag, $1)="-z nodefs"
- _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols"
- else
- # Determine the default libpath from the value encoded in an
- # empty executable.
- _LT_SYS_MODULE_PATH_AIX([$1])
- _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath"
- # Warning - without using the other run time loading flags,
- # -berok will link without error, but may produce a broken library.
- _LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok'
- _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok'
- if test "$with_gnu_ld" = yes; then
- # We only use this code for GNU lds that support --whole-archive.
- _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive'
- else
- # Exported symbols can be pulled into shared objects from archives
- _LT_TAGVAR(whole_archive_flag_spec, $1)='$convenience'
- fi
- _LT_TAGVAR(archive_cmds_need_lc, $1)=yes
- # This is similar to how AIX traditionally builds its shared
- # libraries.
- _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname'
- fi
- fi
- ;;
-
- beos*)
- if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
- _LT_TAGVAR(allow_undefined_flag, $1)=unsupported
- # Joseph Beckenbach <jrb3 at best.com> says some releases of gcc
- # support --undefined. This deserves some investigation. FIXME
- _LT_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
- else
- _LT_TAGVAR(ld_shlibs, $1)=no
- fi
- ;;
-
- chorus*)
- case $cc_basename in
- *)
- # FIXME: insert proper C++ library support
- _LT_TAGVAR(ld_shlibs, $1)=no
- ;;
- esac
- ;;
-
- cygwin* | mingw* | pw32* | cegcc*)
- case $GXX,$cc_basename in
- ,cl* | no,cl*)
- # Native MSVC
- # hardcode_libdir_flag_spec is actually meaningless, as there is
- # no search path for DLLs.
- _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' '
- _LT_TAGVAR(allow_undefined_flag, $1)=unsupported
- _LT_TAGVAR(always_export_symbols, $1)=yes
- _LT_TAGVAR(file_list_spec, $1)='@'
- # Tell ltmain to make .lib files, not .a files.
- libext=lib
- # Tell ltmain to make .dll files, not .so files.
- shrext_cmds=".dll"
- # FIXME: Setting linknames here is a bad hack.
- _LT_TAGVAR(archive_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames='
- _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then
- $SED -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp;
- else
- $SED -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp;
- fi~
- $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~
- linknames='
- # The linker will not automatically build a static lib if we build a DLL.
- # _LT_TAGVAR(old_archive_from_new_cmds, $1)='true'
- _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes
- # Don't use ranlib
- _LT_TAGVAR(old_postinstall_cmds, $1)='chmod 644 $oldlib'
- _LT_TAGVAR(postlink_cmds, $1)='lt_outputfile="@OUTPUT@"~
- lt_tool_outputfile="@TOOL_OUTPUT@"~
- case $lt_outputfile in
- *.exe|*.EXE) ;;
- *)
- lt_outputfile="$lt_outputfile.exe"
- lt_tool_outputfile="$lt_tool_outputfile.exe"
- ;;
- esac~
- func_to_tool_file "$lt_outputfile"~
- if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then
- $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1;
- $RM "$lt_outputfile.manifest";
- fi'
- ;;
- *)
- # g++
- # _LT_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless,
- # as there is no search path for DLLs.
- _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
- _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-all-symbols'
- _LT_TAGVAR(allow_undefined_flag, $1)=unsupported
- _LT_TAGVAR(always_export_symbols, $1)=no
- _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes
-
- if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then
- _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
- # If the export-symbols file already is a .def file (1st line
- # is EXPORTS), use it as is; otherwise, prepend...
- _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then
- cp $export_symbols $output_objdir/$soname.def;
- else
- echo EXPORTS > $output_objdir/$soname.def;
- cat $export_symbols >> $output_objdir/$soname.def;
- fi~
- $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
- else
- _LT_TAGVAR(ld_shlibs, $1)=no
- fi
- ;;
- esac
- ;;
- darwin* | rhapsody*)
- _LT_DARWIN_LINKER_FEATURES($1)
- ;;
-
- dgux*)
- case $cc_basename in
- ec++*)
- # FIXME: insert proper C++ library support
- _LT_TAGVAR(ld_shlibs, $1)=no
- ;;
- ghcx*)
- # Green Hills C++ Compiler
- # FIXME: insert proper C++ library support
- _LT_TAGVAR(ld_shlibs, $1)=no
- ;;
- *)
- # FIXME: insert proper C++ library support
- _LT_TAGVAR(ld_shlibs, $1)=no
- ;;
- esac
- ;;
-
- freebsd2.*)
- # C++ shared libraries reported to be fairly broken before
- # switch to ELF
- _LT_TAGVAR(ld_shlibs, $1)=no
- ;;
-
- freebsd-elf*)
- _LT_TAGVAR(archive_cmds_need_lc, $1)=no
- ;;
-
- freebsd* | dragonfly*)
- # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF
- # conventions
- _LT_TAGVAR(ld_shlibs, $1)=yes
- ;;
-
- gnu*)
- ;;
-
- haiku*)
- _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
- _LT_TAGVAR(link_all_deplibs, $1)=yes
- ;;
-
- hpux9*)
- _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir'
- _LT_TAGVAR(hardcode_libdir_separator, $1)=:
- _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
- _LT_TAGVAR(hardcode_direct, $1)=yes
- _LT_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH,
- # but as the default
- # location of the library.
-
- case $cc_basename in
- CC*)
- # FIXME: insert proper C++ library support
- _LT_TAGVAR(ld_shlibs, $1)=no
- ;;
- aCC*)
- _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -b ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
- # Commands to make compiler produce verbose output that lists
- # what "hidden" libraries, object files and flags are used when
- # linking a shared library.
- #
- # There doesn't appear to be a way to prevent this compiler from
- # explicitly linking system object files so we need to strip them
- # from the output so that they don't get included in the library
- # dependencies.
- output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $EGREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"'
- ;;
- *)
- if test "$GXX" = yes; then
- _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared -nostdlib $pic_flag ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
- else
- # FIXME: insert proper C++ library support
- _LT_TAGVAR(ld_shlibs, $1)=no
- fi
- ;;
- esac
- ;;
-
- hpux10*|hpux11*)
- if test $with_gnu_ld = no; then
- _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir'
- _LT_TAGVAR(hardcode_libdir_separator, $1)=:
-
- case $host_cpu in
- hppa*64*|ia64*)
- ;;
- *)
- _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
- ;;
- esac
- fi
- case $host_cpu in
- hppa*64*|ia64*)
- _LT_TAGVAR(hardcode_direct, $1)=no
- _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
- ;;
- *)
- _LT_TAGVAR(hardcode_direct, $1)=yes
- _LT_TAGVAR(hardcode_direct_absolute, $1)=yes
- _LT_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH,
- # but as the default
- # location of the library.
- ;;
- esac
-
- case $cc_basename in
- CC*)
- # FIXME: insert proper C++ library support
- _LT_TAGVAR(ld_shlibs, $1)=no
- ;;
- aCC*)
- case $host_cpu in
- hppa*64*)
- _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
- ;;
- ia64*)
- _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
- ;;
- *)
- _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
- ;;
- esac
- # Commands to make compiler produce verbose output that lists
- # what "hidden" libraries, object files and flags are used when
- # linking a shared library.
- #
- # There doesn't appear to be a way to prevent this compiler from
- # explicitly linking system object files so we need to strip them
- # from the output so that they don't get included in the library
- # dependencies.
- output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $GREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"'
- ;;
- *)
- if test "$GXX" = yes; then
- if test $with_gnu_ld = no; then
- case $host_cpu in
- hppa*64*)
- _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
- ;;
- ia64*)
- _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
- ;;
- *)
- _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
- ;;
- esac
- fi
- else
- # FIXME: insert proper C++ library support
- _LT_TAGVAR(ld_shlibs, $1)=no
- fi
- ;;
- esac
- ;;
-
- interix[[3-9]]*)
- _LT_TAGVAR(hardcode_direct, $1)=no
- _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
- _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
- _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
- # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc.
- # Instead, shared libraries are loaded at an image base (0x10000000 by
- # default) and relocated if they conflict, which is a slow very memory
- # consuming and fragmenting process. To avoid this, we pick a random,
- # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link
- # time. Moving up from 0x10000000 also allows more sbrk(2) space.
- _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
- _LT_TAGVAR(archive_expsym_cmds, $1)='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
- ;;
- irix5* | irix6*)
- case $cc_basename in
- CC*)
- # SGI C++
- _LT_TAGVAR(archive_cmds, $1)='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
-
- # Archives containing C++ object files must be created using
- # "CC -ar", where "CC" is the IRIX C++ compiler. This is
- # necessary to make sure instantiated templates are included
- # in the archive.
- _LT_TAGVAR(old_archive_cmds, $1)='$CC -ar -WR,-u -o $oldlib $oldobjs'
- ;;
- *)
- if test "$GXX" = yes; then
- if test "$with_gnu_ld" = no; then
- _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
- else
- _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` -o $lib'
- fi
- fi
- _LT_TAGVAR(link_all_deplibs, $1)=yes
- ;;
- esac
- _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
- _LT_TAGVAR(hardcode_libdir_separator, $1)=:
- _LT_TAGVAR(inherit_rpath, $1)=yes
- ;;
-
- linux* | k*bsd*-gnu | kopensolaris*-gnu)
- case $cc_basename in
- KCC*)
- # Kuck and Associates, Inc. (KAI) C++ Compiler
-
- # KCC will only create a shared library if the output file
- # ends with ".so" (or ".sl" for HP-UX), so rename the library
- # to its proper name (with version) after linking.
- _LT_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib'
- _LT_TAGVAR(archive_expsym_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib ${wl}-retain-symbols-file,$export_symbols; mv \$templib $lib'
- # Commands to make compiler produce verbose output that lists
- # what "hidden" libraries, object files and flags are used when
- # linking a shared library.
- #
- # There doesn't appear to be a way to prevent this compiler from
- # explicitly linking system object files so we need to strip them
- # from the output so that they don't get included in the library
- # dependencies.
- output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | $GREP "ld"`; rm -f libconftest$shared_ext; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"'
-
- _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
- _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic'
-
- # Archives containing C++ object files must be created using
- # "CC -Bstatic", where "CC" is the KAI C++ compiler.
- _LT_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs'
- ;;
- icpc* | ecpc* )
- # Intel C++
- with_gnu_ld=yes
- # version 8.0 and above of icpc choke on multiply defined symbols
- # if we add $predep_objects and $postdep_objects, however 7.1 and
- # earlier do not add the objects themselves.
- case `$CC -V 2>&1` in
- *"Version 7."*)
- _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib'
- _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
- ;;
- *) # Version 8.0 or newer
- tmp_idyn=
- case $host_cpu in
- ia64*) tmp_idyn=' -i_dynamic';;
- esac
- _LT_TAGVAR(archive_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
- _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
- ;;
- esac
- _LT_TAGVAR(archive_cmds_need_lc, $1)=no
- _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
- _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic'
- _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive'
- ;;
- pgCC* | pgcpp*)
- # Portland Group C++ compiler
- case `$CC -V` in
- *pgCC\ [[1-5]].* | *pgcpp\ [[1-5]].*)
- _LT_TAGVAR(prelink_cmds, $1)='tpldir=Template.dir~
- rm -rf $tpldir~
- $CC --prelink_objects --instantiation_dir $tpldir $objs $libobjs $compile_deplibs~
- compile_command="$compile_command `find $tpldir -name \*.o | sort | $NL2SP`"'
- _LT_TAGVAR(old_archive_cmds, $1)='tpldir=Template.dir~
- rm -rf $tpldir~
- $CC --prelink_objects --instantiation_dir $tpldir $oldobjs$old_deplibs~
- $AR $AR_FLAGS $oldlib$oldobjs$old_deplibs `find $tpldir -name \*.o | sort | $NL2SP`~
- $RANLIB $oldlib'
- _LT_TAGVAR(archive_cmds, $1)='tpldir=Template.dir~
- rm -rf $tpldir~
- $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~
- $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib'
- _LT_TAGVAR(archive_expsym_cmds, $1)='tpldir=Template.dir~
- rm -rf $tpldir~
- $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~
- $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib'
- ;;
- *) # Version 6 and above use weak symbols
- _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib'
- _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib'
- ;;
- esac
-
- _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}--rpath ${wl}$libdir'
- _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic'
- _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
- ;;
- cxx*)
- # Compaq C++
- _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib'
- _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib ${wl}-retain-symbols-file $wl$export_symbols'
-
- runpath_var=LD_RUN_PATH
- _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir'
- _LT_TAGVAR(hardcode_libdir_separator, $1)=:
-
- # Commands to make compiler produce verbose output that lists
- # what "hidden" libraries, object files and flags are used when
- # linking a shared library.
- #
- # There doesn't appear to be a way to prevent this compiler from
- # explicitly linking system object files so we need to strip them
- # from the output so that they don't get included in the library
- # dependencies.
- output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "X$list" | $Xsed'
- ;;
- xl* | mpixl* | bgxl*)
- # IBM XL 8.0 on PPC, with GNU ld
- _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
- _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic'
- _LT_TAGVAR(archive_cmds, $1)='$CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
- if test "x$supports_anon_versioning" = xyes; then
- _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~
- cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
- echo "local: *; };" >> $output_objdir/$libname.ver~
- $CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib'
- fi
- ;;
- *)
- case `$CC -V 2>&1 | sed 5q` in
- *Sun\ C*)
- # Sun C++ 5.9
- _LT_TAGVAR(no_undefined_flag, $1)=' -zdefs'
- _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
- _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file ${wl}$export_symbols'
- _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
- _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
- _LT_TAGVAR(compiler_needs_object, $1)=yes
-
- # Not sure whether something based on
- # $CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1
- # would be better.
- output_verbose_link_cmd='func_echo_all'
-
- # Archives containing C++ object files must be created using
- # "CC -xar", where "CC" is the Sun C++ compiler. This is
- # necessary to make sure instantiated templates are included
- # in the archive.
- _LT_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs'
- ;;
- esac
- ;;
- esac
- ;;
-
- lynxos*)
- # FIXME: insert proper C++ library support
- _LT_TAGVAR(ld_shlibs, $1)=no
- ;;
-
- m88k*)
- # FIXME: insert proper C++ library support
- _LT_TAGVAR(ld_shlibs, $1)=no
- ;;
-
- mvs*)
- case $cc_basename in
- cxx*)
- # FIXME: insert proper C++ library support
- _LT_TAGVAR(ld_shlibs, $1)=no
- ;;
- *)
- # FIXME: insert proper C++ library support
- _LT_TAGVAR(ld_shlibs, $1)=no
- ;;
- esac
- ;;
-
- netbsd*)
- if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
- _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags'
- wlarc=
- _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
- _LT_TAGVAR(hardcode_direct, $1)=yes
- _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
- fi
- # Workaround some broken pre-1.5 toolchains
- output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP conftest.$objext | $SED -e "s:-lgcc -lc -lgcc::"'
- ;;
-
- *nto* | *qnx*)
- _LT_TAGVAR(ld_shlibs, $1)=yes
- ;;
-
- openbsd2*)
- # C++ shared libraries are fairly broken
- _LT_TAGVAR(ld_shlibs, $1)=no
- ;;
-
- openbsd*)
- if test -f /usr/libexec/ld.so; then
- _LT_TAGVAR(hardcode_direct, $1)=yes
- _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
- _LT_TAGVAR(hardcode_direct_absolute, $1)=yes
- _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib'
- _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
- if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
- _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file,$export_symbols -o $lib'
- _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
- _LT_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive'
- fi
- output_verbose_link_cmd=func_echo_all
- else
- _LT_TAGVAR(ld_shlibs, $1)=no
- fi
- ;;
-
- osf3* | osf4* | osf5*)
- case $cc_basename in
- KCC*)
- # Kuck and Associates, Inc. (KAI) C++ Compiler
-
- # KCC will only create a shared library if the output file
- # ends with ".so" (or ".sl" for HP-UX), so rename the library
- # to its proper name (with version) after linking.
- _LT_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo "$lib" | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib'
-
- _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
- _LT_TAGVAR(hardcode_libdir_separator, $1)=:
-
- # Archives containing C++ object files must be created using
- # the KAI C++ compiler.
- case $host in
- osf3*) _LT_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs' ;;
- *) _LT_TAGVAR(old_archive_cmds, $1)='$CC -o $oldlib $oldobjs' ;;
- esac
- ;;
- RCC*)
- # Rational C++ 2.4.1
- # FIXME: insert proper C++ library support
- _LT_TAGVAR(ld_shlibs, $1)=no
- ;;
- cxx*)
- case $host in
- osf3*)
- _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*'
- _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $soname `test -n "$verstring" && func_echo_all "${wl}-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
- _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
- ;;
- *)
- _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*'
- _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
- _LT_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~
- echo "-hidden">> $lib.exp~
- $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname ${wl}-input ${wl}$lib.exp `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~
- $RM $lib.exp'
- _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir'
- ;;
- esac
-
- _LT_TAGVAR(hardcode_libdir_separator, $1)=:
-
- # Commands to make compiler produce verbose output that lists
- # what "hidden" libraries, object files and flags are used when
- # linking a shared library.
- #
- # There doesn't appear to be a way to prevent this compiler from
- # explicitly linking system object files so we need to strip them
- # from the output so that they don't get included in the library
- # dependencies.
- output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld" | $GREP -v "ld:"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"'
- ;;
- *)
- if test "$GXX" = yes && test "$with_gnu_ld" = no; then
- _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*'
- case $host in
- osf3*)
- _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
- ;;
- *)
- _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
- ;;
- esac
-
- _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
- _LT_TAGVAR(hardcode_libdir_separator, $1)=:
-
- # Commands to make compiler produce verbose output that lists
- # what "hidden" libraries, object files and flags are used when
- # linking a shared library.
- output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"'
-
- else
- # FIXME: insert proper C++ library support
- _LT_TAGVAR(ld_shlibs, $1)=no
- fi
- ;;
- esac
- ;;
-
- psos*)
- # FIXME: insert proper C++ library support
- _LT_TAGVAR(ld_shlibs, $1)=no
- ;;
-
- sunos4*)
- case $cc_basename in
- CC*)
- # Sun C++ 4.x
- # FIXME: insert proper C++ library support
- _LT_TAGVAR(ld_shlibs, $1)=no
- ;;
- lcc*)
- # Lucid
- # FIXME: insert proper C++ library support
- _LT_TAGVAR(ld_shlibs, $1)=no
- ;;
- *)
- # FIXME: insert proper C++ library support
- _LT_TAGVAR(ld_shlibs, $1)=no
- ;;
- esac
- ;;
-
- solaris*)
- case $cc_basename in
- CC* | sunCC*)
- # Sun C++ 4.2, 5.x and Centerline C++
- _LT_TAGVAR(archive_cmds_need_lc,$1)=yes
- _LT_TAGVAR(no_undefined_flag, $1)=' -zdefs'
- _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
- _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
- $CC -G${allow_undefined_flag} ${wl}-M ${wl}$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp'
-
- _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
- _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
- case $host_os in
- solaris2.[[0-5]] | solaris2.[[0-5]].*) ;;
- *)
- # The compiler driver will combine and reorder linker options,
- # but understands `-z linker_flag'.
- # Supported since Solaris 2.6 (maybe 2.5.1?)
- _LT_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract'
- ;;
- esac
- _LT_TAGVAR(link_all_deplibs, $1)=yes
-
- output_verbose_link_cmd='func_echo_all'
-
- # Archives containing C++ object files must be created using
- # "CC -xar", where "CC" is the Sun C++ compiler. This is
- # necessary to make sure instantiated templates are included
- # in the archive.
- _LT_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs'
- ;;
- gcx*)
- # Green Hills C++ Compiler
- _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib'
-
- # The C++ compiler must be used to create the archive.
- _LT_TAGVAR(old_archive_cmds, $1)='$CC $LDFLAGS -archive -o $oldlib $oldobjs'
- ;;
- *)
- # GNU C++ compiler with Solaris linker
- if test "$GXX" = yes && test "$with_gnu_ld" = no; then
- _LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-z ${wl}defs'
- if $CC --version | $GREP -v '^2\.7' > /dev/null; then
- _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib'
- _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
- $CC -shared $pic_flag -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp'
-
- # Commands to make compiler produce verbose output that lists
- # what "hidden" libraries, object files and flags are used when
- # linking a shared library.
- output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"'
- else
- # g++ 2.7 appears to require `-G' NOT `-shared' on this
- # platform.
- _LT_TAGVAR(archive_cmds, $1)='$CC -G -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib'
- _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
- $CC -G -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp'
-
- # Commands to make compiler produce verbose output that lists
- # what "hidden" libraries, object files and flags are used when
- # linking a shared library.
- output_verbose_link_cmd='$CC -G $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"'
- fi
-
- _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $wl$libdir'
- case $host_os in
- solaris2.[[0-5]] | solaris2.[[0-5]].*) ;;
- *)
- _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract'
- ;;
- esac
- fi
- ;;
- esac
- ;;
-
- sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*)
- _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text'
- _LT_TAGVAR(archive_cmds_need_lc, $1)=no
- _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
- runpath_var='LD_RUN_PATH'
-
- case $cc_basename in
- CC*)
- _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
- _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
- ;;
- *)
- _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
- _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
- ;;
- esac
- ;;
-
- sysv5* | sco3.2v5* | sco5v6*)
- # Note: We can NOT use -z defs as we might desire, because we do not
- # link with -lc, and that would cause any symbols used from libc to
- # always be unresolved, which means just about no library would
- # ever link correctly. If we're not using GNU ld we use -z text
- # though, which does catch some bad symbols but isn't as heavy-handed
- # as -z defs.
- _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text'
- _LT_TAGVAR(allow_undefined_flag, $1)='${wl}-z,nodefs'
- _LT_TAGVAR(archive_cmds_need_lc, $1)=no
- _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
- _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R,$libdir'
- _LT_TAGVAR(hardcode_libdir_separator, $1)=':'
- _LT_TAGVAR(link_all_deplibs, $1)=yes
- _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Bexport'
- runpath_var='LD_RUN_PATH'
-
- case $cc_basename in
- CC*)
- _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
- _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
- _LT_TAGVAR(old_archive_cmds, $1)='$CC -Tprelink_objects $oldobjs~
- '"$_LT_TAGVAR(old_archive_cmds, $1)"
- _LT_TAGVAR(reload_cmds, $1)='$CC -Tprelink_objects $reload_objs~
- '"$_LT_TAGVAR(reload_cmds, $1)"
- ;;
- *)
- _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
- _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
- ;;
- esac
- ;;
-
- tandem*)
- case $cc_basename in
- NCC*)
- # NonStop-UX NCC 3.20
- # FIXME: insert proper C++ library support
- _LT_TAGVAR(ld_shlibs, $1)=no
- ;;
- *)
- # FIXME: insert proper C++ library support
- _LT_TAGVAR(ld_shlibs, $1)=no
- ;;
- esac
- ;;
-
- vxworks*)
- # FIXME: insert proper C++ library support
- _LT_TAGVAR(ld_shlibs, $1)=no
- ;;
-
- *)
- # FIXME: insert proper C++ library support
- _LT_TAGVAR(ld_shlibs, $1)=no
- ;;
- esac
-
- AC_MSG_RESULT([$_LT_TAGVAR(ld_shlibs, $1)])
- test "$_LT_TAGVAR(ld_shlibs, $1)" = no && can_build_shared=no
-
- _LT_TAGVAR(GCC, $1)="$GXX"
- _LT_TAGVAR(LD, $1)="$LD"
-
- ## CAVEAT EMPTOR:
- ## There is no encapsulation within the following macros, do not change
- ## the running order or otherwise move them around unless you know exactly
- ## what you are doing...
- _LT_SYS_HIDDEN_LIBDEPS($1)
- _LT_COMPILER_PIC($1)
- _LT_COMPILER_C_O($1)
- _LT_COMPILER_FILE_LOCKS($1)
- _LT_LINKER_SHLIBS($1)
- _LT_SYS_DYNAMIC_LINKER($1)
- _LT_LINKER_HARDCODE_LIBPATH($1)
-
- _LT_CONFIG($1)
- fi # test -n "$compiler"
-
- CC=$lt_save_CC
- CFLAGS=$lt_save_CFLAGS
- LDCXX=$LD
- LD=$lt_save_LD
- GCC=$lt_save_GCC
- with_gnu_ld=$lt_save_with_gnu_ld
- lt_cv_path_LDCXX=$lt_cv_path_LD
- lt_cv_path_LD=$lt_save_path_LD
- lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld
- lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld
-fi # test "$_lt_caught_CXX_error" != yes
-
-AC_LANG_POP
-])# _LT_LANG_CXX_CONFIG
-
-
-# _LT_FUNC_STRIPNAME_CNF
-# ----------------------
-# func_stripname_cnf prefix suffix name
-# strip PREFIX and SUFFIX off of NAME.
-# PREFIX and SUFFIX must not contain globbing or regex special
-# characters, hashes, percent signs, but SUFFIX may contain a leading
-# dot (in which case that matches only a dot).
-#
-# This function is identical to the (non-XSI) version of func_stripname,
-# except this one can be used by m4 code that may be executed by configure,
-# rather than the libtool script.
-m4_defun([_LT_FUNC_STRIPNAME_CNF],[dnl
-AC_REQUIRE([_LT_DECL_SED])
-AC_REQUIRE([_LT_PROG_ECHO_BACKSLASH])
-func_stripname_cnf ()
-{
- case ${2} in
- .*) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%\\\\${2}\$%%"`;;
- *) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%${2}\$%%"`;;
- esac
-} # func_stripname_cnf
-])# _LT_FUNC_STRIPNAME_CNF
-
-# _LT_SYS_HIDDEN_LIBDEPS([TAGNAME])
-# ---------------------------------
-# Figure out "hidden" library dependencies from verbose
-# compiler output when linking a shared library.
-# Parse the compiler output and extract the necessary
-# objects, libraries and library flags.
-m4_defun([_LT_SYS_HIDDEN_LIBDEPS],
-[m4_require([_LT_FILEUTILS_DEFAULTS])dnl
-AC_REQUIRE([_LT_FUNC_STRIPNAME_CNF])dnl
-# Dependencies to place before and after the object being linked:
-_LT_TAGVAR(predep_objects, $1)=
-_LT_TAGVAR(postdep_objects, $1)=
-_LT_TAGVAR(predeps, $1)=
-_LT_TAGVAR(postdeps, $1)=
-_LT_TAGVAR(compiler_lib_search_path, $1)=
-
-dnl we can't use the lt_simple_compile_test_code here,
-dnl because it contains code intended for an executable,
-dnl not a library. It's possible we should let each
-dnl tag define a new lt_????_link_test_code variable,
-dnl but it's only used here...
-m4_if([$1], [], [cat > conftest.$ac_ext <<_LT_EOF
-int a;
-void foo (void) { a = 0; }
-_LT_EOF
-], [$1], [CXX], [cat > conftest.$ac_ext <<_LT_EOF
-class Foo
-{
-public:
- Foo (void) { a = 0; }
-private:
- int a;
-};
-_LT_EOF
-], [$1], [F77], [cat > conftest.$ac_ext <<_LT_EOF
- subroutine foo
- implicit none
- integer*4 a
- a=0
- return
- end
-_LT_EOF
-], [$1], [FC], [cat > conftest.$ac_ext <<_LT_EOF
- subroutine foo
- implicit none
- integer a
- a=0
- return
- end
-_LT_EOF
-], [$1], [GCJ], [cat > conftest.$ac_ext <<_LT_EOF
-public class foo {
- private int a;
- public void bar (void) {
- a = 0;
- }
-};
-_LT_EOF
-], [$1], [GO], [cat > conftest.$ac_ext <<_LT_EOF
-package foo
-func foo() {
-}
-_LT_EOF
-])
-
-_lt_libdeps_save_CFLAGS=$CFLAGS
-case "$CC $CFLAGS " in #(
-*\ -flto*\ *) CFLAGS="$CFLAGS -fno-lto" ;;
-*\ -fwhopr*\ *) CFLAGS="$CFLAGS -fno-whopr" ;;
-*\ -fuse-linker-plugin*\ *) CFLAGS="$CFLAGS -fno-use-linker-plugin" ;;
-esac
-
-dnl Parse the compiler output and extract the necessary
-dnl objects, libraries and library flags.
-if AC_TRY_EVAL(ac_compile); then
- # Parse the compiler output and extract the necessary
- # objects, libraries and library flags.
-
- # Sentinel used to keep track of whether or not we are before
- # the conftest object file.
- pre_test_object_deps_done=no
-
- for p in `eval "$output_verbose_link_cmd"`; do
- case ${prev}${p} in
-
- -L* | -R* | -l*)
- # Some compilers place space between "-{L,R}" and the path.
- # Remove the space.
- if test $p = "-L" ||
- test $p = "-R"; then
- prev=$p
- continue
- fi
-
- # Expand the sysroot to ease extracting the directories later.
- if test -z "$prev"; then
- case $p in
- -L*) func_stripname_cnf '-L' '' "$p"; prev=-L; p=$func_stripname_result ;;
- -R*) func_stripname_cnf '-R' '' "$p"; prev=-R; p=$func_stripname_result ;;
- -l*) func_stripname_cnf '-l' '' "$p"; prev=-l; p=$func_stripname_result ;;
- esac
- fi
- case $p in
- =*) func_stripname_cnf '=' '' "$p"; p=$lt_sysroot$func_stripname_result ;;
- esac
- if test "$pre_test_object_deps_done" = no; then
- case ${prev} in
- -L | -R)
- # Internal compiler library paths should come after those
- # provided the user. The postdeps already come after the
- # user supplied libs so there is no need to process them.
- if test -z "$_LT_TAGVAR(compiler_lib_search_path, $1)"; then
- _LT_TAGVAR(compiler_lib_search_path, $1)="${prev}${p}"
- else
- _LT_TAGVAR(compiler_lib_search_path, $1)="${_LT_TAGVAR(compiler_lib_search_path, $1)} ${prev}${p}"
- fi
- ;;
- # The "-l" case would never come before the object being
- # linked, so don't bother handling this case.
- esac
- else
- if test -z "$_LT_TAGVAR(postdeps, $1)"; then
- _LT_TAGVAR(postdeps, $1)="${prev}${p}"
- else
- _LT_TAGVAR(postdeps, $1)="${_LT_TAGVAR(postdeps, $1)} ${prev}${p}"
- fi
- fi
- prev=
- ;;
-
- *.lto.$objext) ;; # Ignore GCC LTO objects
- *.$objext)
- # This assumes that the test object file only shows up
- # once in the compiler output.
- if test "$p" = "conftest.$objext"; then
- pre_test_object_deps_done=yes
- continue
- fi
-
- if test "$pre_test_object_deps_done" = no; then
- if test -z "$_LT_TAGVAR(predep_objects, $1)"; then
- _LT_TAGVAR(predep_objects, $1)="$p"
- else
- _LT_TAGVAR(predep_objects, $1)="$_LT_TAGVAR(predep_objects, $1) $p"
- fi
- else
- if test -z "$_LT_TAGVAR(postdep_objects, $1)"; then
- _LT_TAGVAR(postdep_objects, $1)="$p"
- else
- _LT_TAGVAR(postdep_objects, $1)="$_LT_TAGVAR(postdep_objects, $1) $p"
- fi
- fi
- ;;
-
- *) ;; # Ignore the rest.
-
- esac
- done
-
- # Clean up.
- rm -f a.out a.exe
-else
- echo "libtool.m4: error: problem compiling $1 test program"
-fi
-
-$RM -f confest.$objext
-CFLAGS=$_lt_libdeps_save_CFLAGS
-
-# PORTME: override above test on systems where it is broken
-m4_if([$1], [CXX],
-[case $host_os in
-interix[[3-9]]*)
- # Interix 3.5 installs completely hosed .la files for C++, so rather than
- # hack all around it, let's just trust "g++" to DTRT.
- _LT_TAGVAR(predep_objects,$1)=
- _LT_TAGVAR(postdep_objects,$1)=
- _LT_TAGVAR(postdeps,$1)=
- ;;
-
-linux*)
- case `$CC -V 2>&1 | sed 5q` in
- *Sun\ C*)
- # Sun C++ 5.9
-
- # The more standards-conforming stlport4 library is
- # incompatible with the Cstd library. Avoid specifying
- # it if it's in CXXFLAGS. Ignore libCrun as
- # -library=stlport4 depends on it.
- case " $CXX $CXXFLAGS " in
- *" -library=stlport4 "*)
- solaris_use_stlport4=yes
- ;;
- esac
-
- if test "$solaris_use_stlport4" != yes; then
- _LT_TAGVAR(postdeps,$1)='-library=Cstd -library=Crun'
- fi
- ;;
- esac
- ;;
-
-solaris*)
- case $cc_basename in
- CC* | sunCC*)
- # The more standards-conforming stlport4 library is
- # incompatible with the Cstd library. Avoid specifying
- # it if it's in CXXFLAGS. Ignore libCrun as
- # -library=stlport4 depends on it.
- case " $CXX $CXXFLAGS " in
- *" -library=stlport4 "*)
- solaris_use_stlport4=yes
- ;;
- esac
-
- # Adding this requires a known-good setup of shared libraries for
- # Sun compiler versions before 5.6, else PIC objects from an old
- # archive will be linked into the output, leading to subtle bugs.
- if test "$solaris_use_stlport4" != yes; then
- _LT_TAGVAR(postdeps,$1)='-library=Cstd -library=Crun'
- fi
- ;;
- esac
- ;;
-esac
-])
-
-case " $_LT_TAGVAR(postdeps, $1) " in
-*" -lc "*) _LT_TAGVAR(archive_cmds_need_lc, $1)=no ;;
-esac
- _LT_TAGVAR(compiler_lib_search_dirs, $1)=
-if test -n "${_LT_TAGVAR(compiler_lib_search_path, $1)}"; then
- _LT_TAGVAR(compiler_lib_search_dirs, $1)=`echo " ${_LT_TAGVAR(compiler_lib_search_path, $1)}" | ${SED} -e 's! -L! !g' -e 's!^ !!'`
-fi
-_LT_TAGDECL([], [compiler_lib_search_dirs], [1],
- [The directories searched by this compiler when creating a shared library])
-_LT_TAGDECL([], [predep_objects], [1],
- [Dependencies to place before and after the objects being linked to
- create a shared library])
-_LT_TAGDECL([], [postdep_objects], [1])
-_LT_TAGDECL([], [predeps], [1])
-_LT_TAGDECL([], [postdeps], [1])
-_LT_TAGDECL([], [compiler_lib_search_path], [1],
- [The library search path used internally by the compiler when linking
- a shared library])
-])# _LT_SYS_HIDDEN_LIBDEPS
-
-
-# _LT_LANG_F77_CONFIG([TAG])
-# --------------------------
-# Ensure that the configuration variables for a Fortran 77 compiler are
-# suitably defined. These variables are subsequently used by _LT_CONFIG
-# to write the compiler configuration to `libtool'.
-m4_defun([_LT_LANG_F77_CONFIG],
-[AC_LANG_PUSH(Fortran 77)
-if test -z "$F77" || test "X$F77" = "Xno"; then
- _lt_disable_F77=yes
-fi
-
-_LT_TAGVAR(archive_cmds_need_lc, $1)=no
-_LT_TAGVAR(allow_undefined_flag, $1)=
-_LT_TAGVAR(always_export_symbols, $1)=no
-_LT_TAGVAR(archive_expsym_cmds, $1)=
-_LT_TAGVAR(export_dynamic_flag_spec, $1)=
-_LT_TAGVAR(hardcode_direct, $1)=no
-_LT_TAGVAR(hardcode_direct_absolute, $1)=no
-_LT_TAGVAR(hardcode_libdir_flag_spec, $1)=
-_LT_TAGVAR(hardcode_libdir_separator, $1)=
-_LT_TAGVAR(hardcode_minus_L, $1)=no
-_LT_TAGVAR(hardcode_automatic, $1)=no
-_LT_TAGVAR(inherit_rpath, $1)=no
-_LT_TAGVAR(module_cmds, $1)=
-_LT_TAGVAR(module_expsym_cmds, $1)=
-_LT_TAGVAR(link_all_deplibs, $1)=unknown
-_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds
-_LT_TAGVAR(reload_flag, $1)=$reload_flag
-_LT_TAGVAR(reload_cmds, $1)=$reload_cmds
-_LT_TAGVAR(no_undefined_flag, $1)=
-_LT_TAGVAR(whole_archive_flag_spec, $1)=
-_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no
-
-# Source file extension for f77 test sources.
-ac_ext=f
-
-# Object file extension for compiled f77 test sources.
-objext=o
-_LT_TAGVAR(objext, $1)=$objext
-
-# No sense in running all these tests if we already determined that
-# the F77 compiler isn't working. Some variables (like enable_shared)
-# are currently assumed to apply to all compilers on this platform,
-# and will be corrupted by setting them based on a non-working compiler.
-if test "$_lt_disable_F77" != yes; then
- # Code to be used in simple compile tests
- lt_simple_compile_test_code="\
- subroutine t
- return
- end
-"
-
- # Code to be used in simple link tests
- lt_simple_link_test_code="\
- program t
- end
-"
-
- # ltmain only uses $CC for tagged configurations so make sure $CC is set.
- _LT_TAG_COMPILER
-
- # save warnings/boilerplate of simple test code
- _LT_COMPILER_BOILERPLATE
- _LT_LINKER_BOILERPLATE
-
- # Allow CC to be a program name with arguments.
- lt_save_CC="$CC"
- lt_save_GCC=$GCC
- lt_save_CFLAGS=$CFLAGS
- CC=${F77-"f77"}
- CFLAGS=$FFLAGS
- compiler=$CC
- _LT_TAGVAR(compiler, $1)=$CC
- _LT_CC_BASENAME([$compiler])
- GCC=$G77
- if test -n "$compiler"; then
- AC_MSG_CHECKING([if libtool supports shared libraries])
- AC_MSG_RESULT([$can_build_shared])
-
- AC_MSG_CHECKING([whether to build shared libraries])
- test "$can_build_shared" = "no" && enable_shared=no
-
- # On AIX, shared libraries and static libraries use the same namespace, and
- # are all built from PIC.
- case $host_os in
- aix3*)
- test "$enable_shared" = yes && enable_static=no
- if test -n "$RANLIB"; then
- archive_cmds="$archive_cmds~\$RANLIB \$lib"
- postinstall_cmds='$RANLIB $lib'
- fi
- ;;
- aix[[4-9]]*)
- if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then
- test "$enable_shared" = yes && enable_static=no
- fi
- ;;
- esac
- AC_MSG_RESULT([$enable_shared])
-
- AC_MSG_CHECKING([whether to build static libraries])
- # Make sure either enable_shared or enable_static is yes.
- test "$enable_shared" = yes || enable_static=yes
- AC_MSG_RESULT([$enable_static])
-
- _LT_TAGVAR(GCC, $1)="$G77"
- _LT_TAGVAR(LD, $1)="$LD"
-
- ## CAVEAT EMPTOR:
- ## There is no encapsulation within the following macros, do not change
- ## the running order or otherwise move them around unless you know exactly
- ## what you are doing...
- _LT_COMPILER_PIC($1)
- _LT_COMPILER_C_O($1)
- _LT_COMPILER_FILE_LOCKS($1)
- _LT_LINKER_SHLIBS($1)
- _LT_SYS_DYNAMIC_LINKER($1)
- _LT_LINKER_HARDCODE_LIBPATH($1)
-
- _LT_CONFIG($1)
- fi # test -n "$compiler"
-
- GCC=$lt_save_GCC
- CC="$lt_save_CC"
- CFLAGS="$lt_save_CFLAGS"
-fi # test "$_lt_disable_F77" != yes
-
-AC_LANG_POP
-])# _LT_LANG_F77_CONFIG
-
-
-# _LT_LANG_FC_CONFIG([TAG])
-# -------------------------
-# Ensure that the configuration variables for a Fortran compiler are
-# suitably defined. These variables are subsequently used by _LT_CONFIG
-# to write the compiler configuration to `libtool'.
-m4_defun([_LT_LANG_FC_CONFIG],
-[AC_LANG_PUSH(Fortran)
-
-if test -z "$FC" || test "X$FC" = "Xno"; then
- _lt_disable_FC=yes
-fi
-
-_LT_TAGVAR(archive_cmds_need_lc, $1)=no
-_LT_TAGVAR(allow_undefined_flag, $1)=
-_LT_TAGVAR(always_export_symbols, $1)=no
-_LT_TAGVAR(archive_expsym_cmds, $1)=
-_LT_TAGVAR(export_dynamic_flag_spec, $1)=
-_LT_TAGVAR(hardcode_direct, $1)=no
-_LT_TAGVAR(hardcode_direct_absolute, $1)=no
-_LT_TAGVAR(hardcode_libdir_flag_spec, $1)=
-_LT_TAGVAR(hardcode_libdir_separator, $1)=
-_LT_TAGVAR(hardcode_minus_L, $1)=no
-_LT_TAGVAR(hardcode_automatic, $1)=no
-_LT_TAGVAR(inherit_rpath, $1)=no
-_LT_TAGVAR(module_cmds, $1)=
-_LT_TAGVAR(module_expsym_cmds, $1)=
-_LT_TAGVAR(link_all_deplibs, $1)=unknown
-_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds
-_LT_TAGVAR(reload_flag, $1)=$reload_flag
-_LT_TAGVAR(reload_cmds, $1)=$reload_cmds
-_LT_TAGVAR(no_undefined_flag, $1)=
-_LT_TAGVAR(whole_archive_flag_spec, $1)=
-_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no
-
-# Source file extension for fc test sources.
-ac_ext=${ac_fc_srcext-f}
-
-# Object file extension for compiled fc test sources.
-objext=o
-_LT_TAGVAR(objext, $1)=$objext
-
-# No sense in running all these tests if we already determined that
-# the FC compiler isn't working. Some variables (like enable_shared)
-# are currently assumed to apply to all compilers on this platform,
-# and will be corrupted by setting them based on a non-working compiler.
-if test "$_lt_disable_FC" != yes; then
- # Code to be used in simple compile tests
- lt_simple_compile_test_code="\
- subroutine t
- return
- end
-"
-
- # Code to be used in simple link tests
- lt_simple_link_test_code="\
- program t
- end
-"
-
- # ltmain only uses $CC for tagged configurations so make sure $CC is set.
- _LT_TAG_COMPILER
-
- # save warnings/boilerplate of simple test code
- _LT_COMPILER_BOILERPLATE
- _LT_LINKER_BOILERPLATE
-
- # Allow CC to be a program name with arguments.
- lt_save_CC="$CC"
- lt_save_GCC=$GCC
- lt_save_CFLAGS=$CFLAGS
- CC=${FC-"f95"}
- CFLAGS=$FCFLAGS
- compiler=$CC
- GCC=$ac_cv_fc_compiler_gnu
-
- _LT_TAGVAR(compiler, $1)=$CC
- _LT_CC_BASENAME([$compiler])
-
- if test -n "$compiler"; then
- AC_MSG_CHECKING([if libtool supports shared libraries])
- AC_MSG_RESULT([$can_build_shared])
-
- AC_MSG_CHECKING([whether to build shared libraries])
- test "$can_build_shared" = "no" && enable_shared=no
-
- # On AIX, shared libraries and static libraries use the same namespace, and
- # are all built from PIC.
- case $host_os in
- aix3*)
- test "$enable_shared" = yes && enable_static=no
- if test -n "$RANLIB"; then
- archive_cmds="$archive_cmds~\$RANLIB \$lib"
- postinstall_cmds='$RANLIB $lib'
- fi
- ;;
- aix[[4-9]]*)
- if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then
- test "$enable_shared" = yes && enable_static=no
- fi
- ;;
- esac
- AC_MSG_RESULT([$enable_shared])
-
- AC_MSG_CHECKING([whether to build static libraries])
- # Make sure either enable_shared or enable_static is yes.
- test "$enable_shared" = yes || enable_static=yes
- AC_MSG_RESULT([$enable_static])
-
- _LT_TAGVAR(GCC, $1)="$ac_cv_fc_compiler_gnu"
- _LT_TAGVAR(LD, $1)="$LD"
-
- ## CAVEAT EMPTOR:
- ## There is no encapsulation within the following macros, do not change
- ## the running order or otherwise move them around unless you know exactly
- ## what you are doing...
- _LT_SYS_HIDDEN_LIBDEPS($1)
- _LT_COMPILER_PIC($1)
- _LT_COMPILER_C_O($1)
- _LT_COMPILER_FILE_LOCKS($1)
- _LT_LINKER_SHLIBS($1)
- _LT_SYS_DYNAMIC_LINKER($1)
- _LT_LINKER_HARDCODE_LIBPATH($1)
-
- _LT_CONFIG($1)
- fi # test -n "$compiler"
-
- GCC=$lt_save_GCC
- CC=$lt_save_CC
- CFLAGS=$lt_save_CFLAGS
-fi # test "$_lt_disable_FC" != yes
-
-AC_LANG_POP
-])# _LT_LANG_FC_CONFIG
-
-
-# _LT_LANG_GCJ_CONFIG([TAG])
-# --------------------------
-# Ensure that the configuration variables for the GNU Java Compiler compiler
-# are suitably defined. These variables are subsequently used by _LT_CONFIG
-# to write the compiler configuration to `libtool'.
-m4_defun([_LT_LANG_GCJ_CONFIG],
-[AC_REQUIRE([LT_PROG_GCJ])dnl
-AC_LANG_SAVE
-
-# Source file extension for Java test sources.
-ac_ext=java
-
-# Object file extension for compiled Java test sources.
-objext=o
-_LT_TAGVAR(objext, $1)=$objext
-
-# Code to be used in simple compile tests
-lt_simple_compile_test_code="class foo {}"
-
-# Code to be used in simple link tests
-lt_simple_link_test_code='public class conftest { public static void main(String[[]] argv) {}; }'
-
-# ltmain only uses $CC for tagged configurations so make sure $CC is set.
-_LT_TAG_COMPILER
-
-# save warnings/boilerplate of simple test code
-_LT_COMPILER_BOILERPLATE
-_LT_LINKER_BOILERPLATE
-
-# Allow CC to be a program name with arguments.
-lt_save_CC=$CC
-lt_save_CFLAGS=$CFLAGS
-lt_save_GCC=$GCC
-GCC=yes
-CC=${GCJ-"gcj"}
-CFLAGS=$GCJFLAGS
-compiler=$CC
-_LT_TAGVAR(compiler, $1)=$CC
-_LT_TAGVAR(LD, $1)="$LD"
-_LT_CC_BASENAME([$compiler])
-
-# GCJ did not exist at the time GCC didn't implicitly link libc in.
-_LT_TAGVAR(archive_cmds_need_lc, $1)=no
-
-_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds
-_LT_TAGVAR(reload_flag, $1)=$reload_flag
-_LT_TAGVAR(reload_cmds, $1)=$reload_cmds
-
-## CAVEAT EMPTOR:
-## There is no encapsulation within the following macros, do not change
-## the running order or otherwise move them around unless you know exactly
-## what you are doing...
-if test -n "$compiler"; then
- _LT_COMPILER_NO_RTTI($1)
- _LT_COMPILER_PIC($1)
- _LT_COMPILER_C_O($1)
- _LT_COMPILER_FILE_LOCKS($1)
- _LT_LINKER_SHLIBS($1)
- _LT_LINKER_HARDCODE_LIBPATH($1)
-
- _LT_CONFIG($1)
-fi
-
-AC_LANG_RESTORE
-
-GCC=$lt_save_GCC
-CC=$lt_save_CC
-CFLAGS=$lt_save_CFLAGS
-])# _LT_LANG_GCJ_CONFIG
-
-
-# _LT_LANG_GO_CONFIG([TAG])
-# --------------------------
-# Ensure that the configuration variables for the GNU Go compiler
-# are suitably defined. These variables are subsequently used by _LT_CONFIG
-# to write the compiler configuration to `libtool'.
-m4_defun([_LT_LANG_GO_CONFIG],
-[AC_REQUIRE([LT_PROG_GO])dnl
-AC_LANG_SAVE
-
-# Source file extension for Go test sources.
-ac_ext=go
-
-# Object file extension for compiled Go test sources.
-objext=o
-_LT_TAGVAR(objext, $1)=$objext
-
-# Code to be used in simple compile tests
-lt_simple_compile_test_code="package main; func main() { }"
-
-# Code to be used in simple link tests
-lt_simple_link_test_code='package main; func main() { }'
-
-# ltmain only uses $CC for tagged configurations so make sure $CC is set.
-_LT_TAG_COMPILER
-
-# save warnings/boilerplate of simple test code
-_LT_COMPILER_BOILERPLATE
-_LT_LINKER_BOILERPLATE
-
-# Allow CC to be a program name with arguments.
-lt_save_CC=$CC
-lt_save_CFLAGS=$CFLAGS
-lt_save_GCC=$GCC
-GCC=yes
-CC=${GOC-"gccgo"}
-CFLAGS=$GOFLAGS
-compiler=$CC
-_LT_TAGVAR(compiler, $1)=$CC
-_LT_TAGVAR(LD, $1)="$LD"
-_LT_CC_BASENAME([$compiler])
-
-# Go did not exist at the time GCC didn't implicitly link libc in.
-_LT_TAGVAR(archive_cmds_need_lc, $1)=no
-
-_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds
-_LT_TAGVAR(reload_flag, $1)=$reload_flag
-_LT_TAGVAR(reload_cmds, $1)=$reload_cmds
-
-## CAVEAT EMPTOR:
-## There is no encapsulation within the following macros, do not change
-## the running order or otherwise move them around unless you know exactly
-## what you are doing...
-if test -n "$compiler"; then
- _LT_COMPILER_NO_RTTI($1)
- _LT_COMPILER_PIC($1)
- _LT_COMPILER_C_O($1)
- _LT_COMPILER_FILE_LOCKS($1)
- _LT_LINKER_SHLIBS($1)
- _LT_LINKER_HARDCODE_LIBPATH($1)
-
- _LT_CONFIG($1)
-fi
-
-AC_LANG_RESTORE
-
-GCC=$lt_save_GCC
-CC=$lt_save_CC
-CFLAGS=$lt_save_CFLAGS
-])# _LT_LANG_GO_CONFIG
-
-
-# _LT_LANG_RC_CONFIG([TAG])
-# -------------------------
-# Ensure that the configuration variables for the Windows resource compiler
-# are suitably defined. These variables are subsequently used by _LT_CONFIG
-# to write the compiler configuration to `libtool'.
-m4_defun([_LT_LANG_RC_CONFIG],
-[AC_REQUIRE([LT_PROG_RC])dnl
-AC_LANG_SAVE
-
-# Source file extension for RC test sources.
-ac_ext=rc
-
-# Object file extension for compiled RC test sources.
-objext=o
-_LT_TAGVAR(objext, $1)=$objext
-
-# Code to be used in simple compile tests
-lt_simple_compile_test_code='sample MENU { MENUITEM "&Soup", 100, CHECKED }'
-
-# Code to be used in simple link tests
-lt_simple_link_test_code="$lt_simple_compile_test_code"
-
-# ltmain only uses $CC for tagged configurations so make sure $CC is set.
-_LT_TAG_COMPILER
-
-# save warnings/boilerplate of simple test code
-_LT_COMPILER_BOILERPLATE
-_LT_LINKER_BOILERPLATE
-
-# Allow CC to be a program name with arguments.
-lt_save_CC="$CC"
-lt_save_CFLAGS=$CFLAGS
-lt_save_GCC=$GCC
-GCC=
-CC=${RC-"windres"}
-CFLAGS=
-compiler=$CC
-_LT_TAGVAR(compiler, $1)=$CC
-_LT_CC_BASENAME([$compiler])
-_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes
-
-if test -n "$compiler"; then
- :
- _LT_CONFIG($1)
-fi
-
-GCC=$lt_save_GCC
-AC_LANG_RESTORE
-CC=$lt_save_CC
-CFLAGS=$lt_save_CFLAGS
-])# _LT_LANG_RC_CONFIG
-
-
-# LT_PROG_GCJ
-# -----------
-AC_DEFUN([LT_PROG_GCJ],
-[m4_ifdef([AC_PROG_GCJ], [AC_PROG_GCJ],
- [m4_ifdef([A][M_PROG_GCJ], [A][M_PROG_GCJ],
- [AC_CHECK_TOOL(GCJ, gcj,)
- test "x${GCJFLAGS+set}" = xset || GCJFLAGS="-g -O2"
- AC_SUBST(GCJFLAGS)])])[]dnl
-])
-
-# Old name:
-AU_ALIAS([LT_AC_PROG_GCJ], [LT_PROG_GCJ])
-dnl aclocal-1.4 backwards compatibility:
-dnl AC_DEFUN([LT_AC_PROG_GCJ], [])
-
-
-# LT_PROG_GO
-# ----------
-AC_DEFUN([LT_PROG_GO],
-[AC_CHECK_TOOL(GOC, gccgo,)
-])
-
-
-# LT_PROG_RC
-# ----------
-AC_DEFUN([LT_PROG_RC],
-[AC_CHECK_TOOL(RC, windres,)
-])
-
-# Old name:
-AU_ALIAS([LT_AC_PROG_RC], [LT_PROG_RC])
-dnl aclocal-1.4 backwards compatibility:
-dnl AC_DEFUN([LT_AC_PROG_RC], [])
-
-
-# _LT_DECL_EGREP
-# --------------
-# If we don't have a new enough Autoconf to choose the best grep
-# available, choose the one first in the user's PATH.
-m4_defun([_LT_DECL_EGREP],
-[AC_REQUIRE([AC_PROG_EGREP])dnl
-AC_REQUIRE([AC_PROG_FGREP])dnl
-test -z "$GREP" && GREP=grep
-_LT_DECL([], [GREP], [1], [A grep program that handles long lines])
-_LT_DECL([], [EGREP], [1], [An ERE matcher])
-_LT_DECL([], [FGREP], [1], [A literal string matcher])
-dnl Non-bleeding-edge autoconf doesn't subst GREP, so do it here too
-AC_SUBST([GREP])
-])
-
-
-# _LT_DECL_OBJDUMP
-# --------------
-# If we don't have a new enough Autoconf to choose the best objdump
-# available, choose the one first in the user's PATH.
-m4_defun([_LT_DECL_OBJDUMP],
-[AC_CHECK_TOOL(OBJDUMP, objdump, false)
-test -z "$OBJDUMP" && OBJDUMP=objdump
-_LT_DECL([], [OBJDUMP], [1], [An object symbol dumper])
-AC_SUBST([OBJDUMP])
-])
-
-# _LT_DECL_DLLTOOL
-# ----------------
-# Ensure DLLTOOL variable is set.
-m4_defun([_LT_DECL_DLLTOOL],
-[AC_CHECK_TOOL(DLLTOOL, dlltool, false)
-test -z "$DLLTOOL" && DLLTOOL=dlltool
-_LT_DECL([], [DLLTOOL], [1], [DLL creation program])
-AC_SUBST([DLLTOOL])
-])
-
-# _LT_DECL_SED
-# ------------
-# Check for a fully-functional sed program, that truncates
-# as few characters as possible. Prefer GNU sed if found.
-m4_defun([_LT_DECL_SED],
-[AC_PROG_SED
-test -z "$SED" && SED=sed
-Xsed="$SED -e 1s/^X//"
-_LT_DECL([], [SED], [1], [A sed program that does not truncate output])
-_LT_DECL([], [Xsed], ["\$SED -e 1s/^X//"],
- [Sed that helps us avoid accidentally triggering echo(1) options like -n])
-])# _LT_DECL_SED
-
-m4_ifndef([AC_PROG_SED], [
-############################################################
-# NOTE: This macro has been submitted for inclusion into #
-# GNU Autoconf as AC_PROG_SED. When it is available in #
-# a released version of Autoconf we should remove this #
-# macro and use it instead. #
-############################################################
-
-m4_defun([AC_PROG_SED],
-[AC_MSG_CHECKING([for a sed that does not truncate output])
-AC_CACHE_VAL(lt_cv_path_SED,
-[# Loop through the user's path and test for sed and gsed.
-# Then use that list of sed's as ones to test for truncation.
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
- IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
- for lt_ac_prog in sed gsed; do
- for ac_exec_ext in '' $ac_executable_extensions; do
- if $as_executable_p "$as_dir/$lt_ac_prog$ac_exec_ext"; then
- lt_ac_sed_list="$lt_ac_sed_list $as_dir/$lt_ac_prog$ac_exec_ext"
- fi
- done
- done
-done
-IFS=$as_save_IFS
-lt_ac_max=0
-lt_ac_count=0
-# Add /usr/xpg4/bin/sed as it is typically found on Solaris
-# along with /bin/sed that truncates output.
-for lt_ac_sed in $lt_ac_sed_list /usr/xpg4/bin/sed; do
- test ! -f $lt_ac_sed && continue
- cat /dev/null > conftest.in
- lt_ac_count=0
- echo $ECHO_N "0123456789$ECHO_C" >conftest.in
- # Check for GNU sed and select it if it is found.
- if "$lt_ac_sed" --version 2>&1 < /dev/null | grep 'GNU' > /dev/null; then
- lt_cv_path_SED=$lt_ac_sed
- break
- fi
- while true; do
- cat conftest.in conftest.in >conftest.tmp
- mv conftest.tmp conftest.in
- cp conftest.in conftest.nl
- echo >>conftest.nl
- $lt_ac_sed -e 's/a$//' < conftest.nl >conftest.out || break
- cmp -s conftest.out conftest.nl || break
- # 10000 chars as input seems more than enough
- test $lt_ac_count -gt 10 && break
- lt_ac_count=`expr $lt_ac_count + 1`
- if test $lt_ac_count -gt $lt_ac_max; then
- lt_ac_max=$lt_ac_count
- lt_cv_path_SED=$lt_ac_sed
- fi
- done
-done
-])
-SED=$lt_cv_path_SED
-AC_SUBST([SED])
-AC_MSG_RESULT([$SED])
-])#AC_PROG_SED
-])#m4_ifndef
-
-# Old name:
-AU_ALIAS([LT_AC_PROG_SED], [AC_PROG_SED])
-dnl aclocal-1.4 backwards compatibility:
-dnl AC_DEFUN([LT_AC_PROG_SED], [])
-
-
-# _LT_CHECK_SHELL_FEATURES
-# ------------------------
-# Find out whether the shell is Bourne or XSI compatible,
-# or has some other useful features.
-m4_defun([_LT_CHECK_SHELL_FEATURES],
-[AC_MSG_CHECKING([whether the shell understands some XSI constructs])
-# Try some XSI features
-xsi_shell=no
-( _lt_dummy="a/b/c"
- test "${_lt_dummy##*/},${_lt_dummy%/*},${_lt_dummy#??}"${_lt_dummy%"$_lt_dummy"}, \
- = c,a/b,b/c, \
- && eval 'test $(( 1 + 1 )) -eq 2 \
- && test "${#_lt_dummy}" -eq 5' ) >/dev/null 2>&1 \
- && xsi_shell=yes
-AC_MSG_RESULT([$xsi_shell])
-_LT_CONFIG_LIBTOOL_INIT([xsi_shell='$xsi_shell'])
-
-AC_MSG_CHECKING([whether the shell understands "+="])
-lt_shell_append=no
-( foo=bar; set foo baz; eval "$[1]+=\$[2]" && test "$foo" = barbaz ) \
- >/dev/null 2>&1 \
- && lt_shell_append=yes
-AC_MSG_RESULT([$lt_shell_append])
-_LT_CONFIG_LIBTOOL_INIT([lt_shell_append='$lt_shell_append'])
-
-if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then
- lt_unset=unset
-else
- lt_unset=false
-fi
-_LT_DECL([], [lt_unset], [0], [whether the shell understands "unset"])dnl
-
-# test EBCDIC or ASCII
-case `echo X|tr X '\101'` in
- A) # ASCII based system
- # \n is not interpreted correctly by Solaris 8 /usr/ucb/tr
- lt_SP2NL='tr \040 \012'
- lt_NL2SP='tr \015\012 \040\040'
- ;;
- *) # EBCDIC based system
- lt_SP2NL='tr \100 \n'
- lt_NL2SP='tr \r\n \100\100'
- ;;
-esac
-_LT_DECL([SP2NL], [lt_SP2NL], [1], [turn spaces into newlines])dnl
-_LT_DECL([NL2SP], [lt_NL2SP], [1], [turn newlines into spaces])dnl
-])# _LT_CHECK_SHELL_FEATURES
-
-
-# _LT_PROG_FUNCTION_REPLACE (FUNCNAME, REPLACEMENT-BODY)
-# ------------------------------------------------------
-# In `$cfgfile', look for function FUNCNAME delimited by `^FUNCNAME ()$' and
-# '^} FUNCNAME ', and replace its body with REPLACEMENT-BODY.
-m4_defun([_LT_PROG_FUNCTION_REPLACE],
-[dnl {
-sed -e '/^$1 ()$/,/^} # $1 /c\
-$1 ()\
-{\
-m4_bpatsubsts([$2], [$], [\\], [^\([ ]\)], [\\\1])
-} # Extended-shell $1 implementation' "$cfgfile" > $cfgfile.tmp \
- && mv -f "$cfgfile.tmp" "$cfgfile" \
- || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
-test 0 -eq $? || _lt_function_replace_fail=:
-])
-
-
-# _LT_PROG_REPLACE_SHELLFNS
-# -------------------------
-# Replace existing portable implementations of several shell functions with
-# equivalent extended shell implementations where those features are available..
-m4_defun([_LT_PROG_REPLACE_SHELLFNS],
-[if test x"$xsi_shell" = xyes; then
- _LT_PROG_FUNCTION_REPLACE([func_dirname], [dnl
- case ${1} in
- */*) func_dirname_result="${1%/*}${2}" ;;
- * ) func_dirname_result="${3}" ;;
- esac])
-
- _LT_PROG_FUNCTION_REPLACE([func_basename], [dnl
- func_basename_result="${1##*/}"])
-
- _LT_PROG_FUNCTION_REPLACE([func_dirname_and_basename], [dnl
- case ${1} in
- */*) func_dirname_result="${1%/*}${2}" ;;
- * ) func_dirname_result="${3}" ;;
- esac
- func_basename_result="${1##*/}"])
-
- _LT_PROG_FUNCTION_REPLACE([func_stripname], [dnl
- # pdksh 5.2.14 does not do ${X%$Y} correctly if both X and Y are
- # positional parameters, so assign one to ordinary parameter first.
- func_stripname_result=${3}
- func_stripname_result=${func_stripname_result#"${1}"}
- func_stripname_result=${func_stripname_result%"${2}"}])
-
- _LT_PROG_FUNCTION_REPLACE([func_split_long_opt], [dnl
- func_split_long_opt_name=${1%%=*}
- func_split_long_opt_arg=${1#*=}])
-
- _LT_PROG_FUNCTION_REPLACE([func_split_short_opt], [dnl
- func_split_short_opt_arg=${1#??}
- func_split_short_opt_name=${1%"$func_split_short_opt_arg"}])
-
- _LT_PROG_FUNCTION_REPLACE([func_lo2o], [dnl
- case ${1} in
- *.lo) func_lo2o_result=${1%.lo}.${objext} ;;
- *) func_lo2o_result=${1} ;;
- esac])
-
- _LT_PROG_FUNCTION_REPLACE([func_xform], [ func_xform_result=${1%.*}.lo])
-
- _LT_PROG_FUNCTION_REPLACE([func_arith], [ func_arith_result=$(( $[*] ))])
-
- _LT_PROG_FUNCTION_REPLACE([func_len], [ func_len_result=${#1}])
-fi
-
-if test x"$lt_shell_append" = xyes; then
- _LT_PROG_FUNCTION_REPLACE([func_append], [ eval "${1}+=\\${2}"])
-
- _LT_PROG_FUNCTION_REPLACE([func_append_quoted], [dnl
- func_quote_for_eval "${2}"
-dnl m4 expansion turns \\\\ into \\, and then the shell eval turns that into \
- eval "${1}+=\\\\ \\$func_quote_for_eval_result"])
-
- # Save a `func_append' function call where possible by direct use of '+='
- sed -e 's%func_append \([[a-zA-Z_]]\{1,\}\) "%\1+="%g' $cfgfile > $cfgfile.tmp \
- && mv -f "$cfgfile.tmp" "$cfgfile" \
- || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
- test 0 -eq $? || _lt_function_replace_fail=:
-else
- # Save a `func_append' function call even when '+=' is not available
- sed -e 's%func_append \([[a-zA-Z_]]\{1,\}\) "%\1="$\1%g' $cfgfile > $cfgfile.tmp \
- && mv -f "$cfgfile.tmp" "$cfgfile" \
- || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
- test 0 -eq $? || _lt_function_replace_fail=:
-fi
-
-if test x"$_lt_function_replace_fail" = x":"; then
- AC_MSG_WARN([Unable to substitute extended shell functions in $ofile])
-fi
-])
-
-# _LT_PATH_CONVERSION_FUNCTIONS
-# -----------------------------
-# Determine which file name conversion functions should be used by
-# func_to_host_file (and, implicitly, by func_to_host_path). These are needed
-# for certain cross-compile configurations and native mingw.
-m4_defun([_LT_PATH_CONVERSION_FUNCTIONS],
-[AC_REQUIRE([AC_CANONICAL_HOST])dnl
-AC_REQUIRE([AC_CANONICAL_BUILD])dnl
-AC_MSG_CHECKING([how to convert $build file names to $host format])
-AC_CACHE_VAL(lt_cv_to_host_file_cmd,
-[case $host in
- *-*-mingw* )
- case $build in
- *-*-mingw* ) # actually msys
- lt_cv_to_host_file_cmd=func_convert_file_msys_to_w32
- ;;
- *-*-cygwin* )
- lt_cv_to_host_file_cmd=func_convert_file_cygwin_to_w32
- ;;
- * ) # otherwise, assume *nix
- lt_cv_to_host_file_cmd=func_convert_file_nix_to_w32
- ;;
- esac
- ;;
- *-*-cygwin* )
- case $build in
- *-*-mingw* ) # actually msys
- lt_cv_to_host_file_cmd=func_convert_file_msys_to_cygwin
- ;;
- *-*-cygwin* )
- lt_cv_to_host_file_cmd=func_convert_file_noop
- ;;
- * ) # otherwise, assume *nix
- lt_cv_to_host_file_cmd=func_convert_file_nix_to_cygwin
- ;;
- esac
- ;;
- * ) # unhandled hosts (and "normal" native builds)
- lt_cv_to_host_file_cmd=func_convert_file_noop
- ;;
-esac
-])
-to_host_file_cmd=$lt_cv_to_host_file_cmd
-AC_MSG_RESULT([$lt_cv_to_host_file_cmd])
-_LT_DECL([to_host_file_cmd], [lt_cv_to_host_file_cmd],
- [0], [convert $build file names to $host format])dnl
-
-AC_MSG_CHECKING([how to convert $build file names to toolchain format])
-AC_CACHE_VAL(lt_cv_to_tool_file_cmd,
-[#assume ordinary cross tools, or native build.
-lt_cv_to_tool_file_cmd=func_convert_file_noop
-case $host in
- *-*-mingw* )
- case $build in
- *-*-mingw* ) # actually msys
- lt_cv_to_tool_file_cmd=func_convert_file_msys_to_w32
- ;;
- esac
- ;;
-esac
-])
-to_tool_file_cmd=$lt_cv_to_tool_file_cmd
-AC_MSG_RESULT([$lt_cv_to_tool_file_cmd])
-_LT_DECL([to_tool_file_cmd], [lt_cv_to_tool_file_cmd],
- [0], [convert $build files to toolchain format])dnl
-])# _LT_PATH_CONVERSION_FUNCTIONS
diff --git a/macros/lidia-check.m4 b/macros/lidia-check.m4
index 4e46435..f14700e 100644
--- a/macros/lidia-check.m4
+++ b/macros/lidia-check.m4
@@ -74,8 +74,8 @@ if test -r "$LIDIA_HOME/include/LiDIA/LiDIA.h"; then
LIDIA_CFLAGS=
LIDIA_LIBS="-lLiDIA"
fi
- CXXFLAGS="${BACKUP_CXXFLAGS} ${LIDIA_CFLAGS} ${GMP_CFLAGS}"
- LIBS="${BACKUP_LIBS} ${LIDIA_LIBS} ${GMP_LIBS}"
+ CXXFLAGS="${BACKUP_CXXFLAGS} ${LIDIA_CFLAGS} ${FFLAS_FFPACK_CFLAGS}"
+ LIBS="${BACKUP_LIBS} ${LIDIA_LIBS} ${FFLAS_FFPACK_LIBS}"
AC_TRY_LINK(
[#include <LiDIA/bigint.h>],
diff --git a/macros/linbox-benchmark.m4 b/macros/linbox-benchmark.m4
index a5eff42..5100bf6 100644
--- a/macros/linbox-benchmark.m4
+++ b/macros/linbox-benchmark.m4
@@ -1,21 +1,21 @@
dnl Copyright (c) 2011 the LinBox group
-dnl Brice Boyer <bboyer at imag.fr>
+dnl Brice Boyer (briceboyer) <boyer.brice at gmail.com>
dnl Adapted from linbox-doc.m4
dnl This file is part of LinBox
dnl ========LICENCE========
dnl This file is part of the library LinBox.
- dnl
+ dnl
dnl LinBox is free software: you can redistribute it and/or modify
dnl it under the terms of the GNU Lesser General Public
dnl License as published by the Free Software Foundation; either
dnl version 2.1 of the License, or (at your option) any later version.
- dnl
+ dnl
dnl This library is distributed in the hope that it will be useful,
dnl but WITHOUT ANY WARRANTY; without even the implied warranty of
dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
dnl Lesser General Public License for more details.
- dnl
+ dnl
dnl You should have received a copy of the GNU Lesser General Public
dnl License along with this library; if not, write to the Free Software
dnl Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
diff --git a/macros/ltoptions.m4 b/macros/ltoptions.m4
deleted file mode 100644
index 5d9acd8..0000000
--- a/macros/ltoptions.m4
+++ /dev/null
@@ -1,384 +0,0 @@
-# Helper functions for option handling. -*- Autoconf -*-
-#
-# Copyright (C) 2004, 2005, 2007, 2008, 2009 Free Software Foundation,
-# Inc.
-# Written by Gary V. Vaughan, 2004
-#
-# This file is free software; the Free Software Foundation gives
-# unlimited permission to copy and/or distribute it, with or without
-# modifications, as long as this notice is preserved.
-
-# serial 7 ltoptions.m4
-
-# This is to help aclocal find these macros, as it can't see m4_define.
-AC_DEFUN([LTOPTIONS_VERSION], [m4_if([1])])
-
-
-# _LT_MANGLE_OPTION(MACRO-NAME, OPTION-NAME)
-# ------------------------------------------
-m4_define([_LT_MANGLE_OPTION],
-[[_LT_OPTION_]m4_bpatsubst($1__$2, [[^a-zA-Z0-9_]], [_])])
-
-
-# _LT_SET_OPTION(MACRO-NAME, OPTION-NAME)
-# ---------------------------------------
-# Set option OPTION-NAME for macro MACRO-NAME, and if there is a
-# matching handler defined, dispatch to it. Other OPTION-NAMEs are
-# saved as a flag.
-m4_define([_LT_SET_OPTION],
-[m4_define(_LT_MANGLE_OPTION([$1], [$2]))dnl
-m4_ifdef(_LT_MANGLE_DEFUN([$1], [$2]),
- _LT_MANGLE_DEFUN([$1], [$2]),
- [m4_warning([Unknown $1 option `$2'])])[]dnl
-])
-
-
-# _LT_IF_OPTION(MACRO-NAME, OPTION-NAME, IF-SET, [IF-NOT-SET])
-# ------------------------------------------------------------
-# Execute IF-SET if OPTION is set, IF-NOT-SET otherwise.
-m4_define([_LT_IF_OPTION],
-[m4_ifdef(_LT_MANGLE_OPTION([$1], [$2]), [$3], [$4])])
-
-
-# _LT_UNLESS_OPTIONS(MACRO-NAME, OPTION-LIST, IF-NOT-SET)
-# -------------------------------------------------------
-# Execute IF-NOT-SET unless all options in OPTION-LIST for MACRO-NAME
-# are set.
-m4_define([_LT_UNLESS_OPTIONS],
-[m4_foreach([_LT_Option], m4_split(m4_normalize([$2])),
- [m4_ifdef(_LT_MANGLE_OPTION([$1], _LT_Option),
- [m4_define([$0_found])])])[]dnl
-m4_ifdef([$0_found], [m4_undefine([$0_found])], [$3
-])[]dnl
-])
-
-
-# _LT_SET_OPTIONS(MACRO-NAME, OPTION-LIST)
-# ----------------------------------------
-# OPTION-LIST is a space-separated list of Libtool options associated
-# with MACRO-NAME. If any OPTION has a matching handler declared with
-# LT_OPTION_DEFINE, dispatch to that macro; otherwise complain about
-# the unknown option and exit.
-m4_defun([_LT_SET_OPTIONS],
-[# Set options
-m4_foreach([_LT_Option], m4_split(m4_normalize([$2])),
- [_LT_SET_OPTION([$1], _LT_Option)])
-
-m4_if([$1],[LT_INIT],[
- dnl
- dnl Simply set some default values (i.e off) if boolean options were not
- dnl specified:
- _LT_UNLESS_OPTIONS([LT_INIT], [dlopen], [enable_dlopen=no
- ])
- _LT_UNLESS_OPTIONS([LT_INIT], [win32-dll], [enable_win32_dll=no
- ])
- dnl
- dnl If no reference was made to various pairs of opposing options, then
- dnl we run the default mode handler for the pair. For example, if neither
- dnl `shared' nor `disable-shared' was passed, we enable building of shared
- dnl archives by default:
- _LT_UNLESS_OPTIONS([LT_INIT], [shared disable-shared], [_LT_ENABLE_SHARED])
- _LT_UNLESS_OPTIONS([LT_INIT], [static disable-static], [_LT_ENABLE_STATIC])
- _LT_UNLESS_OPTIONS([LT_INIT], [pic-only no-pic], [_LT_WITH_PIC])
- _LT_UNLESS_OPTIONS([LT_INIT], [fast-install disable-fast-install],
- [_LT_ENABLE_FAST_INSTALL])
- ])
-])# _LT_SET_OPTIONS
-
-
-## --------------------------------- ##
-## Macros to handle LT_INIT options. ##
-## --------------------------------- ##
-
-# _LT_MANGLE_DEFUN(MACRO-NAME, OPTION-NAME)
-# -----------------------------------------
-m4_define([_LT_MANGLE_DEFUN],
-[[_LT_OPTION_DEFUN_]m4_bpatsubst(m4_toupper([$1__$2]), [[^A-Z0-9_]], [_])])
-
-
-# LT_OPTION_DEFINE(MACRO-NAME, OPTION-NAME, CODE)
-# -----------------------------------------------
-m4_define([LT_OPTION_DEFINE],
-[m4_define(_LT_MANGLE_DEFUN([$1], [$2]), [$3])[]dnl
-])# LT_OPTION_DEFINE
-
-
-# dlopen
-# ------
-LT_OPTION_DEFINE([LT_INIT], [dlopen], [enable_dlopen=yes
-])
-
-AU_DEFUN([AC_LIBTOOL_DLOPEN],
-[_LT_SET_OPTION([LT_INIT], [dlopen])
-AC_DIAGNOSE([obsolete],
-[$0: Remove this warning and the call to _LT_SET_OPTION when you
-put the `dlopen' option into LT_INIT's first parameter.])
-])
-
-dnl aclocal-1.4 backwards compatibility:
-dnl AC_DEFUN([AC_LIBTOOL_DLOPEN], [])
-
-
-# win32-dll
-# ---------
-# Declare package support for building win32 dll's.
-LT_OPTION_DEFINE([LT_INIT], [win32-dll],
-[enable_win32_dll=yes
-
-case $host in
-*-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-cegcc*)
- AC_CHECK_TOOL(AS, as, false)
- AC_CHECK_TOOL(DLLTOOL, dlltool, false)
- AC_CHECK_TOOL(OBJDUMP, objdump, false)
- ;;
-esac
-
-test -z "$AS" && AS=as
-_LT_DECL([], [AS], [1], [Assembler program])dnl
-
-test -z "$DLLTOOL" && DLLTOOL=dlltool
-_LT_DECL([], [DLLTOOL], [1], [DLL creation program])dnl
-
-test -z "$OBJDUMP" && OBJDUMP=objdump
-_LT_DECL([], [OBJDUMP], [1], [Object dumper program])dnl
-])# win32-dll
-
-AU_DEFUN([AC_LIBTOOL_WIN32_DLL],
-[AC_REQUIRE([AC_CANONICAL_HOST])dnl
-_LT_SET_OPTION([LT_INIT], [win32-dll])
-AC_DIAGNOSE([obsolete],
-[$0: Remove this warning and the call to _LT_SET_OPTION when you
-put the `win32-dll' option into LT_INIT's first parameter.])
-])
-
-dnl aclocal-1.4 backwards compatibility:
-dnl AC_DEFUN([AC_LIBTOOL_WIN32_DLL], [])
-
-
-# _LT_ENABLE_SHARED([DEFAULT])
-# ----------------------------
-# implement the --enable-shared flag, and supports the `shared' and
-# `disable-shared' LT_INIT options.
-# DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'.
-m4_define([_LT_ENABLE_SHARED],
-[m4_define([_LT_ENABLE_SHARED_DEFAULT], [m4_if($1, no, no, yes)])dnl
-AC_ARG_ENABLE([shared],
- [AS_HELP_STRING([--enable-shared@<:@=PKGS@:>@],
- [build shared libraries @<:@default=]_LT_ENABLE_SHARED_DEFAULT[@:>@])],
- [p=${PACKAGE-default}
- case $enableval in
- yes) enable_shared=yes ;;
- no) enable_shared=no ;;
- *)
- enable_shared=no
- # Look at the argument we got. We use all the common list separators.
- lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
- for pkg in $enableval; do
- IFS="$lt_save_ifs"
- if test "X$pkg" = "X$p"; then
- enable_shared=yes
- fi
- done
- IFS="$lt_save_ifs"
- ;;
- esac],
- [enable_shared=]_LT_ENABLE_SHARED_DEFAULT)
-
- _LT_DECL([build_libtool_libs], [enable_shared], [0],
- [Whether or not to build shared libraries])
-])# _LT_ENABLE_SHARED
-
-LT_OPTION_DEFINE([LT_INIT], [shared], [_LT_ENABLE_SHARED([yes])])
-LT_OPTION_DEFINE([LT_INIT], [disable-shared], [_LT_ENABLE_SHARED([no])])
-
-# Old names:
-AC_DEFUN([AC_ENABLE_SHARED],
-[_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[shared])
-])
-
-AC_DEFUN([AC_DISABLE_SHARED],
-[_LT_SET_OPTION([LT_INIT], [disable-shared])
-])
-
-AU_DEFUN([AM_ENABLE_SHARED], [AC_ENABLE_SHARED($@)])
-AU_DEFUN([AM_DISABLE_SHARED], [AC_DISABLE_SHARED($@)])
-
-dnl aclocal-1.4 backwards compatibility:
-dnl AC_DEFUN([AM_ENABLE_SHARED], [])
-dnl AC_DEFUN([AM_DISABLE_SHARED], [])
-
-
-
-# _LT_ENABLE_STATIC([DEFAULT])
-# ----------------------------
-# implement the --enable-static flag, and support the `static' and
-# `disable-static' LT_INIT options.
-# DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'.
-m4_define([_LT_ENABLE_STATIC],
-[m4_define([_LT_ENABLE_STATIC_DEFAULT], [m4_if($1, no, no, yes)])dnl
-AC_ARG_ENABLE([static],
- [AS_HELP_STRING([--enable-static@<:@=PKGS@:>@],
- [build static libraries @<:@default=]_LT_ENABLE_STATIC_DEFAULT[@:>@])],
- [p=${PACKAGE-default}
- case $enableval in
- yes) enable_static=yes ;;
- no) enable_static=no ;;
- *)
- enable_static=no
- # Look at the argument we got. We use all the common list separators.
- lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
- for pkg in $enableval; do
- IFS="$lt_save_ifs"
- if test "X$pkg" = "X$p"; then
- enable_static=yes
- fi
- done
- IFS="$lt_save_ifs"
- ;;
- esac],
- [enable_static=]_LT_ENABLE_STATIC_DEFAULT)
-
- _LT_DECL([build_old_libs], [enable_static], [0],
- [Whether or not to build static libraries])
-])# _LT_ENABLE_STATIC
-
-LT_OPTION_DEFINE([LT_INIT], [static], [_LT_ENABLE_STATIC([yes])])
-LT_OPTION_DEFINE([LT_INIT], [disable-static], [_LT_ENABLE_STATIC([no])])
-
-# Old names:
-AC_DEFUN([AC_ENABLE_STATIC],
-[_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[static])
-])
-
-AC_DEFUN([AC_DISABLE_STATIC],
-[_LT_SET_OPTION([LT_INIT], [disable-static])
-])
-
-AU_DEFUN([AM_ENABLE_STATIC], [AC_ENABLE_STATIC($@)])
-AU_DEFUN([AM_DISABLE_STATIC], [AC_DISABLE_STATIC($@)])
-
-dnl aclocal-1.4 backwards compatibility:
-dnl AC_DEFUN([AM_ENABLE_STATIC], [])
-dnl AC_DEFUN([AM_DISABLE_STATIC], [])
-
-
-
-# _LT_ENABLE_FAST_INSTALL([DEFAULT])
-# ----------------------------------
-# implement the --enable-fast-install flag, and support the `fast-install'
-# and `disable-fast-install' LT_INIT options.
-# DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'.
-m4_define([_LT_ENABLE_FAST_INSTALL],
-[m4_define([_LT_ENABLE_FAST_INSTALL_DEFAULT], [m4_if($1, no, no, yes)])dnl
-AC_ARG_ENABLE([fast-install],
- [AS_HELP_STRING([--enable-fast-install@<:@=PKGS@:>@],
- [optimize for fast installation @<:@default=]_LT_ENABLE_FAST_INSTALL_DEFAULT[@:>@])],
- [p=${PACKAGE-default}
- case $enableval in
- yes) enable_fast_install=yes ;;
- no) enable_fast_install=no ;;
- *)
- enable_fast_install=no
- # Look at the argument we got. We use all the common list separators.
- lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
- for pkg in $enableval; do
- IFS="$lt_save_ifs"
- if test "X$pkg" = "X$p"; then
- enable_fast_install=yes
- fi
- done
- IFS="$lt_save_ifs"
- ;;
- esac],
- [enable_fast_install=]_LT_ENABLE_FAST_INSTALL_DEFAULT)
-
-_LT_DECL([fast_install], [enable_fast_install], [0],
- [Whether or not to optimize for fast installation])dnl
-])# _LT_ENABLE_FAST_INSTALL
-
-LT_OPTION_DEFINE([LT_INIT], [fast-install], [_LT_ENABLE_FAST_INSTALL([yes])])
-LT_OPTION_DEFINE([LT_INIT], [disable-fast-install], [_LT_ENABLE_FAST_INSTALL([no])])
-
-# Old names:
-AU_DEFUN([AC_ENABLE_FAST_INSTALL],
-[_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[fast-install])
-AC_DIAGNOSE([obsolete],
-[$0: Remove this warning and the call to _LT_SET_OPTION when you put
-the `fast-install' option into LT_INIT's first parameter.])
-])
-
-AU_DEFUN([AC_DISABLE_FAST_INSTALL],
-[_LT_SET_OPTION([LT_INIT], [disable-fast-install])
-AC_DIAGNOSE([obsolete],
-[$0: Remove this warning and the call to _LT_SET_OPTION when you put
-the `disable-fast-install' option into LT_INIT's first parameter.])
-])
-
-dnl aclocal-1.4 backwards compatibility:
-dnl AC_DEFUN([AC_ENABLE_FAST_INSTALL], [])
-dnl AC_DEFUN([AM_DISABLE_FAST_INSTALL], [])
-
-
-# _LT_WITH_PIC([MODE])
-# --------------------
-# implement the --with-pic flag, and support the `pic-only' and `no-pic'
-# LT_INIT options.
-# MODE is either `yes' or `no'. If omitted, it defaults to `both'.
-m4_define([_LT_WITH_PIC],
-[AC_ARG_WITH([pic],
- [AS_HELP_STRING([--with-pic@<:@=PKGS@:>@],
- [try to use only PIC/non-PIC objects @<:@default=use both@:>@])],
- [lt_p=${PACKAGE-default}
- case $withval in
- yes|no) pic_mode=$withval ;;
- *)
- pic_mode=default
- # Look at the argument we got. We use all the common list separators.
- lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
- for lt_pkg in $withval; do
- IFS="$lt_save_ifs"
- if test "X$lt_pkg" = "X$lt_p"; then
- pic_mode=yes
- fi
- done
- IFS="$lt_save_ifs"
- ;;
- esac],
- [pic_mode=default])
-
-test -z "$pic_mode" && pic_mode=m4_default([$1], [default])
-
-_LT_DECL([], [pic_mode], [0], [What type of objects to build])dnl
-])# _LT_WITH_PIC
-
-LT_OPTION_DEFINE([LT_INIT], [pic-only], [_LT_WITH_PIC([yes])])
-LT_OPTION_DEFINE([LT_INIT], [no-pic], [_LT_WITH_PIC([no])])
-
-# Old name:
-AU_DEFUN([AC_LIBTOOL_PICMODE],
-[_LT_SET_OPTION([LT_INIT], [pic-only])
-AC_DIAGNOSE([obsolete],
-[$0: Remove this warning and the call to _LT_SET_OPTION when you
-put the `pic-only' option into LT_INIT's first parameter.])
-])
-
-dnl aclocal-1.4 backwards compatibility:
-dnl AC_DEFUN([AC_LIBTOOL_PICMODE], [])
-
-## ----------------- ##
-## LTDL_INIT Options ##
-## ----------------- ##
-
-m4_define([_LTDL_MODE], [])
-LT_OPTION_DEFINE([LTDL_INIT], [nonrecursive],
- [m4_define([_LTDL_MODE], [nonrecursive])])
-LT_OPTION_DEFINE([LTDL_INIT], [recursive],
- [m4_define([_LTDL_MODE], [recursive])])
-LT_OPTION_DEFINE([LTDL_INIT], [subproject],
- [m4_define([_LTDL_MODE], [subproject])])
-
-m4_define([_LTDL_TYPE], [])
-LT_OPTION_DEFINE([LTDL_INIT], [installable],
- [m4_define([_LTDL_TYPE], [installable])])
-LT_OPTION_DEFINE([LTDL_INIT], [convenience],
- [m4_define([_LTDL_TYPE], [convenience])])
diff --git a/macros/ltsugar.m4 b/macros/ltsugar.m4
deleted file mode 100644
index 9000a05..0000000
--- a/macros/ltsugar.m4
+++ /dev/null
@@ -1,123 +0,0 @@
-# ltsugar.m4 -- libtool m4 base layer. -*-Autoconf-*-
-#
-# Copyright (C) 2004, 2005, 2007, 2008 Free Software Foundation, Inc.
-# Written by Gary V. Vaughan, 2004
-#
-# This file is free software; the Free Software Foundation gives
-# unlimited permission to copy and/or distribute it, with or without
-# modifications, as long as this notice is preserved.
-
-# serial 6 ltsugar.m4
-
-# This is to help aclocal find these macros, as it can't see m4_define.
-AC_DEFUN([LTSUGAR_VERSION], [m4_if([0.1])])
-
-
-# lt_join(SEP, ARG1, [ARG2...])
-# -----------------------------
-# Produce ARG1SEPARG2...SEPARGn, omitting [] arguments and their
-# associated separator.
-# Needed until we can rely on m4_join from Autoconf 2.62, since all earlier
-# versions in m4sugar had bugs.
-m4_define([lt_join],
-[m4_if([$#], [1], [],
- [$#], [2], [[$2]],
- [m4_if([$2], [], [], [[$2]_])$0([$1], m4_shift(m4_shift($@)))])])
-m4_define([_lt_join],
-[m4_if([$#$2], [2], [],
- [m4_if([$2], [], [], [[$1$2]])$0([$1], m4_shift(m4_shift($@)))])])
-
-
-# lt_car(LIST)
-# lt_cdr(LIST)
-# ------------
-# Manipulate m4 lists.
-# These macros are necessary as long as will still need to support
-# Autoconf-2.59 which quotes differently.
-m4_define([lt_car], [[$1]])
-m4_define([lt_cdr],
-[m4_if([$#], 0, [m4_fatal([$0: cannot be called without arguments])],
- [$#], 1, [],
- [m4_dquote(m4_shift($@))])])
-m4_define([lt_unquote], $1)
-
-
-# lt_append(MACRO-NAME, STRING, [SEPARATOR])
-# ------------------------------------------
-# Redefine MACRO-NAME to hold its former content plus `SEPARATOR'`STRING'.
-# Note that neither SEPARATOR nor STRING are expanded; they are appended
-# to MACRO-NAME as is (leaving the expansion for when MACRO-NAME is invoked).
-# No SEPARATOR is output if MACRO-NAME was previously undefined (different
-# than defined and empty).
-#
-# This macro is needed until we can rely on Autoconf 2.62, since earlier
-# versions of m4sugar mistakenly expanded SEPARATOR but not STRING.
-m4_define([lt_append],
-[m4_define([$1],
- m4_ifdef([$1], [m4_defn([$1])[$3]])[$2])])
-
-
-
-# lt_combine(SEP, PREFIX-LIST, INFIX, SUFFIX1, [SUFFIX2...])
-# ----------------------------------------------------------
-# Produce a SEP delimited list of all paired combinations of elements of
-# PREFIX-LIST with SUFFIX1 through SUFFIXn. Each element of the list
-# has the form PREFIXmINFIXSUFFIXn.
-# Needed until we can rely on m4_combine added in Autoconf 2.62.
-m4_define([lt_combine],
-[m4_if(m4_eval([$# > 3]), [1],
- [m4_pushdef([_Lt_sep], [m4_define([_Lt_sep], m4_defn([lt_car]))])]]dnl
-[[m4_foreach([_Lt_prefix], [$2],
- [m4_foreach([_Lt_suffix],
- ]m4_dquote(m4_dquote(m4_shift(m4_shift(m4_shift($@)))))[,
- [_Lt_sep([$1])[]m4_defn([_Lt_prefix])[$3]m4_defn([_Lt_suffix])])])])])
-
-
-# lt_if_append_uniq(MACRO-NAME, VARNAME, [SEPARATOR], [UNIQ], [NOT-UNIQ])
-# -----------------------------------------------------------------------
-# Iff MACRO-NAME does not yet contain VARNAME, then append it (delimited
-# by SEPARATOR if supplied) and expand UNIQ, else NOT-UNIQ.
-m4_define([lt_if_append_uniq],
-[m4_ifdef([$1],
- [m4_if(m4_index([$3]m4_defn([$1])[$3], [$3$2$3]), [-1],
- [lt_append([$1], [$2], [$3])$4],
- [$5])],
- [lt_append([$1], [$2], [$3])$4])])
-
-
-# lt_dict_add(DICT, KEY, VALUE)
-# -----------------------------
-m4_define([lt_dict_add],
-[m4_define([$1($2)], [$3])])
-
-
-# lt_dict_add_subkey(DICT, KEY, SUBKEY, VALUE)
-# --------------------------------------------
-m4_define([lt_dict_add_subkey],
-[m4_define([$1($2:$3)], [$4])])
-
-
-# lt_dict_fetch(DICT, KEY, [SUBKEY])
-# ----------------------------------
-m4_define([lt_dict_fetch],
-[m4_ifval([$3],
- m4_ifdef([$1($2:$3)], [m4_defn([$1($2:$3)])]),
- m4_ifdef([$1($2)], [m4_defn([$1($2)])]))])
-
-
-# lt_if_dict_fetch(DICT, KEY, [SUBKEY], VALUE, IF-TRUE, [IF-FALSE])
-# -----------------------------------------------------------------
-m4_define([lt_if_dict_fetch],
-[m4_if(lt_dict_fetch([$1], [$2], [$3]), [$4],
- [$5],
- [$6])])
-
-
-# lt_dict_filter(DICT, [SUBKEY], VALUE, [SEPARATOR], KEY, [...])
-# --------------------------------------------------------------
-m4_define([lt_dict_filter],
-[m4_if([$5], [], [],
- [lt_join(m4_quote(m4_default([$4], [[, ]])),
- lt_unquote(m4_split(m4_normalize(m4_foreach(_Lt_key, lt_car([m4_shiftn(4, $@)]),
- [lt_if_dict_fetch([$1], _Lt_key, [$2], [$3], [_Lt_key ])])))))])[]dnl
-])
diff --git a/macros/ltversion.m4 b/macros/ltversion.m4
deleted file mode 100644
index 07a8602..0000000
--- a/macros/ltversion.m4
+++ /dev/null
@@ -1,23 +0,0 @@
-# ltversion.m4 -- version numbers -*- Autoconf -*-
-#
-# Copyright (C) 2004 Free Software Foundation, Inc.
-# Written by Scott James Remnant, 2004
-#
-# This file is free software; the Free Software Foundation gives
-# unlimited permission to copy and/or distribute it, with or without
-# modifications, as long as this notice is preserved.
-
-# @configure_input@
-
-# serial 3337 ltversion.m4
-# This file is part of GNU Libtool
-
-m4_define([LT_PACKAGE_VERSION], [2.4.2])
-m4_define([LT_PACKAGE_REVISION], [1.3337])
-
-AC_DEFUN([LTVERSION_VERSION],
-[macro_version='2.4.2'
-macro_revision='1.3337'
-_LT_DECL(, macro_version, 0, [Which release of libtool.m4 was used?])
-_LT_DECL(, macro_revision, 0)
-])
diff --git a/macros/lt~obsolete.m4 b/macros/lt~obsolete.m4
deleted file mode 100644
index c573da9..0000000
--- a/macros/lt~obsolete.m4
+++ /dev/null
@@ -1,98 +0,0 @@
-# lt~obsolete.m4 -- aclocal satisfying obsolete definitions. -*-Autoconf-*-
-#
-# Copyright (C) 2004, 2005, 2007, 2009 Free Software Foundation, Inc.
-# Written by Scott James Remnant, 2004.
-#
-# This file is free software; the Free Software Foundation gives
-# unlimited permission to copy and/or distribute it, with or without
-# modifications, as long as this notice is preserved.
-
-# serial 5 lt~obsolete.m4
-
-# These exist entirely to fool aclocal when bootstrapping libtool.
-#
-# In the past libtool.m4 has provided macros via AC_DEFUN (or AU_DEFUN)
-# which have later been changed to m4_define as they aren't part of the
-# exported API, or moved to Autoconf or Automake where they belong.
-#
-# The trouble is, aclocal is a bit thick. It'll see the old AC_DEFUN
-# in /usr/share/aclocal/libtool.m4 and remember it, then when it sees us
-# using a macro with the same name in our local m4/libtool.m4 it'll
-# pull the old libtool.m4 in (it doesn't see our shiny new m4_define
-# and doesn't know about Autoconf macros at all.)
-#
-# So we provide this file, which has a silly filename so it's always
-# included after everything else. This provides aclocal with the
-# AC_DEFUNs it wants, but when m4 processes it, it doesn't do anything
-# because those macros already exist, or will be overwritten later.
-# We use AC_DEFUN over AU_DEFUN for compatibility with aclocal-1.6.
-#
-# Anytime we withdraw an AC_DEFUN or AU_DEFUN, remember to add it here.
-# Yes, that means every name once taken will need to remain here until
-# we give up compatibility with versions before 1.7, at which point
-# we need to keep only those names which we still refer to.
-
-# This is to help aclocal find these macros, as it can't see m4_define.
-AC_DEFUN([LTOBSOLETE_VERSION], [m4_if([1])])
-
-m4_ifndef([AC_LIBTOOL_LINKER_OPTION], [AC_DEFUN([AC_LIBTOOL_LINKER_OPTION])])
-m4_ifndef([AC_PROG_EGREP], [AC_DEFUN([AC_PROG_EGREP])])
-m4_ifndef([_LT_AC_PROG_ECHO_BACKSLASH], [AC_DEFUN([_LT_AC_PROG_ECHO_BACKSLASH])])
-m4_ifndef([_LT_AC_SHELL_INIT], [AC_DEFUN([_LT_AC_SHELL_INIT])])
-m4_ifndef([_LT_AC_SYS_LIBPATH_AIX], [AC_DEFUN([_LT_AC_SYS_LIBPATH_AIX])])
-m4_ifndef([_LT_PROG_LTMAIN], [AC_DEFUN([_LT_PROG_LTMAIN])])
-m4_ifndef([_LT_AC_TAGVAR], [AC_DEFUN([_LT_AC_TAGVAR])])
-m4_ifndef([AC_LTDL_ENABLE_INSTALL], [AC_DEFUN([AC_LTDL_ENABLE_INSTALL])])
-m4_ifndef([AC_LTDL_PREOPEN], [AC_DEFUN([AC_LTDL_PREOPEN])])
-m4_ifndef([_LT_AC_SYS_COMPILER], [AC_DEFUN([_LT_AC_SYS_COMPILER])])
-m4_ifndef([_LT_AC_LOCK], [AC_DEFUN([_LT_AC_LOCK])])
-m4_ifndef([AC_LIBTOOL_SYS_OLD_ARCHIVE], [AC_DEFUN([AC_LIBTOOL_SYS_OLD_ARCHIVE])])
-m4_ifndef([_LT_AC_TRY_DLOPEN_SELF], [AC_DEFUN([_LT_AC_TRY_DLOPEN_SELF])])
-m4_ifndef([AC_LIBTOOL_PROG_CC_C_O], [AC_DEFUN([AC_LIBTOOL_PROG_CC_C_O])])
-m4_ifndef([AC_LIBTOOL_SYS_HARD_LINK_LOCKS], [AC_DEFUN([AC_LIBTOOL_SYS_HARD_LINK_LOCKS])])
-m4_ifndef([AC_LIBTOOL_OBJDIR], [AC_DEFUN([AC_LIBTOOL_OBJDIR])])
-m4_ifndef([AC_LTDL_OBJDIR], [AC_DEFUN([AC_LTDL_OBJDIR])])
-m4_ifndef([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH], [AC_DEFUN([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH])])
-m4_ifndef([AC_LIBTOOL_SYS_LIB_STRIP], [AC_DEFUN([AC_LIBTOOL_SYS_LIB_STRIP])])
-m4_ifndef([AC_PATH_MAGIC], [AC_DEFUN([AC_PATH_MAGIC])])
-m4_ifndef([AC_PROG_LD_GNU], [AC_DEFUN([AC_PROG_LD_GNU])])
-m4_ifndef([AC_PROG_LD_RELOAD_FLAG], [AC_DEFUN([AC_PROG_LD_RELOAD_FLAG])])
-m4_ifndef([AC_DEPLIBS_CHECK_METHOD], [AC_DEFUN([AC_DEPLIBS_CHECK_METHOD])])
-m4_ifndef([AC_LIBTOOL_PROG_COMPILER_NO_RTTI], [AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_NO_RTTI])])
-m4_ifndef([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE], [AC_DEFUN([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE])])
-m4_ifndef([AC_LIBTOOL_PROG_COMPILER_PIC], [AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_PIC])])
-m4_ifndef([AC_LIBTOOL_PROG_LD_SHLIBS], [AC_DEFUN([AC_LIBTOOL_PROG_LD_SHLIBS])])
-m4_ifndef([AC_LIBTOOL_POSTDEP_PREDEP], [AC_DEFUN([AC_LIBTOOL_POSTDEP_PREDEP])])
-m4_ifndef([LT_AC_PROG_EGREP], [AC_DEFUN([LT_AC_PROG_EGREP])])
-m4_ifndef([LT_AC_PROG_SED], [AC_DEFUN([LT_AC_PROG_SED])])
-m4_ifndef([_LT_CC_BASENAME], [AC_DEFUN([_LT_CC_BASENAME])])
-m4_ifndef([_LT_COMPILER_BOILERPLATE], [AC_DEFUN([_LT_COMPILER_BOILERPLATE])])
-m4_ifndef([_LT_LINKER_BOILERPLATE], [AC_DEFUN([_LT_LINKER_BOILERPLATE])])
-m4_ifndef([_AC_PROG_LIBTOOL], [AC_DEFUN([_AC_PROG_LIBTOOL])])
-m4_ifndef([AC_LIBTOOL_SETUP], [AC_DEFUN([AC_LIBTOOL_SETUP])])
-m4_ifndef([_LT_AC_CHECK_DLFCN], [AC_DEFUN([_LT_AC_CHECK_DLFCN])])
-m4_ifndef([AC_LIBTOOL_SYS_DYNAMIC_LINKER], [AC_DEFUN([AC_LIBTOOL_SYS_DYNAMIC_LINKER])])
-m4_ifndef([_LT_AC_TAGCONFIG], [AC_DEFUN([_LT_AC_TAGCONFIG])])
-m4_ifndef([AC_DISABLE_FAST_INSTALL], [AC_DEFUN([AC_DISABLE_FAST_INSTALL])])
-m4_ifndef([_LT_AC_LANG_CXX], [AC_DEFUN([_LT_AC_LANG_CXX])])
-m4_ifndef([_LT_AC_LANG_F77], [AC_DEFUN([_LT_AC_LANG_F77])])
-m4_ifndef([_LT_AC_LANG_GCJ], [AC_DEFUN([_LT_AC_LANG_GCJ])])
-m4_ifndef([AC_LIBTOOL_LANG_C_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_C_CONFIG])])
-m4_ifndef([_LT_AC_LANG_C_CONFIG], [AC_DEFUN([_LT_AC_LANG_C_CONFIG])])
-m4_ifndef([AC_LIBTOOL_LANG_CXX_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_CXX_CONFIG])])
-m4_ifndef([_LT_AC_LANG_CXX_CONFIG], [AC_DEFUN([_LT_AC_LANG_CXX_CONFIG])])
-m4_ifndef([AC_LIBTOOL_LANG_F77_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_F77_CONFIG])])
-m4_ifndef([_LT_AC_LANG_F77_CONFIG], [AC_DEFUN([_LT_AC_LANG_F77_CONFIG])])
-m4_ifndef([AC_LIBTOOL_LANG_GCJ_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_GCJ_CONFIG])])
-m4_ifndef([_LT_AC_LANG_GCJ_CONFIG], [AC_DEFUN([_LT_AC_LANG_GCJ_CONFIG])])
-m4_ifndef([AC_LIBTOOL_LANG_RC_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_RC_CONFIG])])
-m4_ifndef([_LT_AC_LANG_RC_CONFIG], [AC_DEFUN([_LT_AC_LANG_RC_CONFIG])])
-m4_ifndef([AC_LIBTOOL_CONFIG], [AC_DEFUN([AC_LIBTOOL_CONFIG])])
-m4_ifndef([_LT_AC_FILE_LTDLL_C], [AC_DEFUN([_LT_AC_FILE_LTDLL_C])])
-m4_ifndef([_LT_REQUIRED_DARWIN_CHECKS], [AC_DEFUN([_LT_REQUIRED_DARWIN_CHECKS])])
-m4_ifndef([_LT_AC_PROG_CXXCPP], [AC_DEFUN([_LT_AC_PROG_CXXCPP])])
-m4_ifndef([_LT_PREPARE_SED_QUOTE_VARS], [AC_DEFUN([_LT_PREPARE_SED_QUOTE_VARS])])
-m4_ifndef([_LT_PROG_ECHO_BACKSLASH], [AC_DEFUN([_LT_PROG_ECHO_BACKSLASH])])
-m4_ifndef([_LT_PROG_F77], [AC_DEFUN([_LT_PROG_F77])])
-m4_ifndef([_LT_PROG_FC], [AC_DEFUN([_LT_PROG_FC])])
-m4_ifndef([_LT_PROG_CXX], [AC_DEFUN([_LT_PROG_CXX])])
diff --git a/macros/m4ri-check.m4 b/macros/m4ri-check.m4
index d1827a4..21cff0b 100644
--- a/macros/m4ri-check.m4
+++ b/macros/m4ri-check.m4
@@ -71,8 +71,8 @@ for M4RI_HOME in ${M4RI_HOME_PATH}
M4RI_CFLAGS=
M4RI_LIBS="-lm4ri" ])
- CXXFLAGS="${BACKUP_CXXFLAGS} ${M4RI_CFLAGS} ${GMP_CFLAGS}"
- LIBS="${BACKUP_LIBS} ${M4RI_LIBS} ${GMP_LIBS}"
+ CXXFLAGS="${BACKUP_CXXFLAGS} ${M4RI_CFLAGS} ${FFLAS_FFPACK_CFLAGS}"
+ LIBS="${BACKUP_LIBS} ${M4RI_LIBS} ${FFLAS_FFPACK_LIBS}"
AC_TRY_LINK(
[#include <m4ri/m4ri.h> ],
diff --git a/macros/m4rie-check.m4 b/macros/m4rie-check.m4
index c11c747..5cc1505 100644
--- a/macros/m4rie-check.m4
+++ b/macros/m4rie-check.m4
@@ -71,8 +71,8 @@ for M4RIE_HOME in ${M4RIE_HOME_PATH}
M4RIE_CFLAGS=
M4RIE_LIBS="-lm4rie" ])
- CXXFLAGS="${BACKUP_CXXFLAGS} ${M4RIE_CFLAGS} ${GMP_CFLAGS}"
- LIBS="${BACKUP_LIBS} ${M4RIE_LIBS} ${GMP_LIBS}"
+ CXXFLAGS="${BACKUP_CXXFLAGS} ${M4RIE_CFLAGS} ${FFLAS_FFPACK_CFLAGS}"
+ LIBS="${BACKUP_LIBS} ${M4RIE_LIBS} ${FFLAS_FFPACK_LIBS}"
AC_TRY_LINK(
[#include <m4rie/m4rie.h> ],
diff --git a/macros/mpfr-check.m4 b/macros/mpfr-check.m4
index 748e7ec..3857a05 100644
--- a/macros/mpfr-check.m4
+++ b/macros/mpfr-check.m4
@@ -73,8 +73,8 @@ for MPFR_HOME in ${MPFR_HOME_PATH}
MPFR_LIBS="-lmpfr"
])
- CXXFLAGS="${BACKUP_CXXFLAGS} ${MPFR_CFLAGS} ${GMP_CFLAGS}"
- LIBS="${BACKUP_LIBS} ${GMP_LIBS} ${MPFR_LIBS} "
+ CXXFLAGS="${BACKUP_CXXFLAGS} ${MPFR_CFLAGS} ${FFLAS_FFPACK_CFLAGS}"
+ LIBS="${BACKUP_LIBS} ${FFLAS_FFPACK_LIBS} ${MPFR_LIBS} "
AC_TRY_LINK(
[
diff --git a/macros/ntl-check.m4 b/macros/ntl-check.m4
index 35981c2..c549ab9 100644
--- a/macros/ntl-check.m4
+++ b/macros/ntl-check.m4
@@ -75,8 +75,8 @@ if test -r "$NTL_HOME/include/NTL/ZZ.h"; then
NTL_CFLAGS=
NTL_LIBS="-lntl"
fi
- CXXFLAGS="${BACKUP_CXXFLAGS} ${NTL_CFLAGS} ${GMP_CFLAGS}"
- LIBS="${BACKUP_LIBS} ${NTL_LIBS} ${GMP_LIBS}"
+ CXXFLAGS="${BACKUP_CXXFLAGS} ${NTL_CFLAGS} ${FFLAS_FFPACK_CFLAGS}"
+ LIBS="${BACKUP_LIBS} ${NTL_LIBS} ${FFLAS_FFPACK_LIBS}"
AC_TRY_LINK(
[#include <NTL/ZZ.h>],
diff --git a/macros/ocl-check.m4 b/macros/ocl-check.m4
new file mode 100644
index 0000000..f8fae6c
--- /dev/null
+++ b/macros/ocl-check.m4
@@ -0,0 +1,95 @@
+dnl Check for OpenCL
+dnl Copyright (c) the LinBox group
+dnl This file is part of LinBox
+
+ dnl ========LICENCE========
+ dnl This file is part of the library LinBox.
+ dnl
+ dnl LinBox is free software: you can redistribute it and/or modify
+ dnl it under the terms of the GNU Lesser General Public
+ dnl License as published by the Free Software Foundation; either
+ dnl version 2.1 of the License, or (at your option) any later version.
+ dnl
+ dnl This library is distributed in the hope that it will be useful,
+ dnl but WITHOUT ANY WARRANTY; without even the implied warranty of
+ dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ dnl Lesser General Public License for more details.
+ dnl
+ dnl You should have received a copy of the GNU Lesser General Public
+ dnl License along with this library; if not, write to the Free Software
+ dnl Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ dnl ========LICENCE========
+ dnl
+
+dnl LB_CHECK_OCL([MINIMUM-VERSION [, ACTION_IF_FOUND [, ACTION-IF-NOT-FOUND]]])
+dnl
+dnl Test for an OpenCL
+
+AC_DEFUN([LB_CHECK_OCL],[
+ AC_ARG_WITH(ocl,
+ [AC_HELP_STRING([--with-ocl=<path>|yes|no],
+ [Use OpenCL. This library is optional for LinBox compilation.
+ If argument is yes or <empty> that means the library is reachable
+ with the standard search path "/usr" or "/usr/local" (set as default).
+ Otherwise you give the <path> to the directory which contains the library.])],
+
+ [if test "$withval" = yes; then
+ OCL_HOME_PATH="/opt/AMDAPP ${DEFAULT_CHECKING_PATH}"
+ elif test "$withval" != no; then
+ OCL_HOME_PATH="$withval /opt/AMDAPP ${DEFAULT_CHECKING_PATH}"
+ fi],
+
+ [OCL_HOME_PATH="/opt/AMDAPP $DEFAULT_CHECKING_PATH}"])
+
+ BACKUP_CXXFLAGS=${CXXFLAGS}
+ BACKUP_LIBS=${LIBS}
+
+ if test -n "$OCL_HOME_PATH"; then
+ AC_MSG_CHECKING(for OpenCL >= 1.0)
+ fi
+
+ for OCL_HOME in ${OCL_HOME_PATH}
+ do
+ if test -r "$OCL_HOME/include/CL/cl.h"; then
+ if test "x$OCL_HOME" != "x/usr" -a "x$OCL_HOME" != "x/usr/local"; then
+ OCL_CFLAGS="-I${OCL_HOME}/include"
+ if test "x$OCL_HOME" != "x/opt/AMDAPP"; then
+ OCL_LIBS="-L${OCL_HOME}/lib64 -L${OCL_HOME}/lib -lOpenCL -lpthread"
+ else
+ OCL_LIBS="-L${OCL_HOME}/lib/x86_64 -L${OCL_HOME}/lib/x86 -lOpenCL -lpthread"
+ fi
+ else
+ OCL_CFLAGS=
+ OCL_LIBS="-lOpenCL -lpthread"
+ fi
+
+ CXXFLAGS="${CXXFLAGS} ${OCL_CFLAGS}"
+ LIBS="${LIBS} ${OCL_LIBS}"
+
+ ocl_found="yes"
+ break
+
+ else
+ ocl_found="no"
+ fi
+ done
+
+ AS_IF([ test "x$ocl_found" = "xyes" ],
+ [
+ AC_SUBST(OCL_CFLAGS)
+ AC_SUBST(OCL_LIBS)
+ AC_DEFINE(HAVE_OCL,1,[Define if OpenCL is installed])
+ HAVE_OCL=yes
+
+ AC_MSG_RESULT(found)
+ ],[
+ unset OCL_CFLAGS
+ unset OCL_LIBS
+ AC_MSG_RESULT(not found)
+ ])
+
+ AM_CONDITIONAL(LINBOX_HAVE_OCL, test "x$HAVE_OCL" = "xyes")
+
+ CXXFLAGS=${BACKUP_CXXFLAGS}
+ LIBS=${BACKUP_LIBS}
+])
diff --git a/macros/omp-check.m4 b/macros/omp-check.m4
new file mode 100644
index 0000000..1589c3b
--- /dev/null
+++ b/macros/omp-check.m4
@@ -0,0 +1,77 @@
+dnl turn on OPENMP
+dnl Copyright (c) the LinBox group
+dnl This file is part of LinBox
+
+ dnl ========LICENCE========
+ dnl This file is part of the library LinBox.
+ dnl
+ dnl LinBox is free software: you can redistribute it and/or modify
+ dnl it under the terms of the GNU Lesser General Public
+ dnl License as published by the Free Software Foundation; either
+ dnl version 2.1 of the License, or (at your option) any later version.
+ dnl
+ dnl This library is distributed in the hope that it will be useful,
+ dnl but WITHOUT ANY WARRANTY; without even the implied warranty of
+ dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ dnl Lesser General Public License for more details.
+ dnl
+ dnl You should have received a copy of the GNU Lesser General Public
+ dnl License along with this library; if not, write to the Free Software
+ dnl Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ dnl ========LICENCE========
+ dnl
+
+dnl LB_CHECK_OMP()
+dnl
+dnl turn on OpenMP
+
+AC_DEFUN([LB_OMP],[
+ AC_MSG_CHECKING(enabling OpenMP)
+
+ AC_ARG_ENABLE(openmp,
+ [AC_HELP_STRING([--enable-openmp],
+ [ Use OpenMP ])
+ ],
+ [ with_omp=$enable_openmp],
+ [ with_omp=yes ]
+ )
+
+ AS_IF([ test "x$with_omp" != "xno" ],
+ [
+ BACKUP_CXXFLAGS=${CXXFLAGS}
+ OMPFLAGS="-fopenmp"
+ CXXFLAGS="${BACKUP_CXXFLAGS} ${OMPFLAGS}"
+ AC_TRY_RUN([
+#include <omp.h>
+ int main() {
+ int p = omp_get_num_threads();
+ return 0;
+ }
+ ],
+ [ omp_found="yes" ],
+ [ omp_found="no" ],
+ [
+ echo "cross compiling...disabling"
+ omp_found="no"
+ ])
+ AS_IF( [ test "x$omp_found" = "xyes" ],
+ [
+ AC_DEFINE(USE_OPENMP,1,[Define if OMP is available])
+ AC_SUBST(OMPFLAGS)
+ AC_MSG_RESULT(yes)
+ HAVE_OMP=yes
+ ],
+ [
+ OMPFLAGS=
+ AC_SUBST(OMPFLAGS)
+ AC_MSG_RESULT(no)
+ ]
+ )
+ CXXFLAGS=${BACKUP_CXXFLAGS}
+ ],[
+ AC_MSG_RESULT(no)
+ ])
+AM_CONDITIONAL(LINBOX_HAVE_OMP, test "x$HAVE_OMP" = "xyes")
+]
+)
+
diff --git a/macros/saclib-check.m4 b/macros/saclib-check.m4
index 36b17f3..8e8269c 100644
--- a/macros/saclib-check.m4
+++ b/macros/saclib-check.m4
@@ -77,7 +77,8 @@ if test -r "$SACLIB_HOME/include/saclib.h"; then
SACLIB_LIBS="-lsaclib"
fi
- CXXFLAGS="${BACKUP_CXXFLAGS} ${SACLIB_CFLAGS} ${GMP_CFLAGS}" LIBS="${BACKUP_LIBS} ${SACLIB_LIBS} ${GMP_LIBS}"
+ CXXFLAGS="${BACKUP_CXXFLAGS} ${SACLIB_CFLAGS} ${FFLAS_FFPACK_CFLAGS}"
+ LIBS="${BACKUP_LIBS} ${SACLIB_LIBS} ${FFLAS_FFPACK_LIBS}"
AC_TRY_LINK(
[#include <saclib.h>],
diff --git a/macros/sage-check.m4 b/macros/sage-check.m4
index 5e2a2ae..1652f6d 100644
--- a/macros/sage-check.m4
+++ b/macros/sage-check.m4
@@ -28,10 +28,12 @@ AC_MSG_CHECKING([whether to compile the SAGE interface])
AC_ARG_ENABLE(sage,
[AC_HELP_STRING([--enable-sage], [Enable the compilation of the SAGE interface])])
AM_CONDITIONAL(LINBOX_HAVE_SAGE, test "x$enable_sage" = "xyes")
+
AS_IF([test "x$enable_sage" = "xyes"],
[
AC_MSG_RESULT(yes)
-
+AC_DEFINE(HAVE_SAGE,1,[Define if SageMath interface is built])
+LINBOXSAGE_LIBS="-llinboxsage"
dnl if test "x$HAVE_NTL" = "xyes" ; then
dnl AC_CHECK_TOOL(OBJDUMP, objdump, false)
dnl AC_MSG_CHECKING([whether NTL was built with -fPIC])
@@ -57,5 +59,7 @@ dnl fi
],[
AC_MSG_RESULT(no)
+LINBOXSAGE_LIBS=""
])
])
+AC_SUBST(LINBOXSAGE_LIBS)
diff --git a/macros/tinyxml2-check.m4 b/macros/tinyxml2-check.m4
new file mode 100644
index 0000000..f549d04
--- /dev/null
+++ b/macros/tinyxml2-check.m4
@@ -0,0 +1,46 @@
+dnl Check for FPLLL
+dnl Copyright (c) the LinBox group
+dnl Brice Boyer (briceboyer) <boyer.brice at gmail.com> 10/09/13
+dnl This file is part of LinBox
+
+ dnl ========LICENCE========
+ dnl This file is part of the library LinBox.
+ dnl
+ dnl LinBox is free software: you can redistribute it and/or modify
+ dnl it under the terms of the GNU Lesser General Public
+ dnl License as published by the Free Software Foundation; either
+ dnl version 2.1 of the License, or (at your option) any later version.
+ dnl
+ dnl This library is distributed in the hope that it will be useful,
+ dnl but WITHOUT ANY WARRANTY; without even the implied warranty of
+ dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ dnl Lesser General Public License for more details.
+ dnl
+ dnl You should have received a copy of the GNU Lesser General Public
+ dnl License along with this library; if not, write to the Free Software
+ dnl Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ dnl ========LICENCE========
+ dnl
+
+AC_DEFUN([LB_CHECK_XML],
+[
+AC_MSG_CHECKING(if tinyxml2 is available)
+SAVED_LIBS=$LIBS
+ LIBS="$LIBS -ltinyxml2"
+ AC_TRY_LINK(
+ [#include <tinyxml2.h>],
+ [
+ using namespace tinyxml2 ;
+ XMLDocument doc;
+ ],
+ [
+AC_MSG_RESULT(yes)
+AC_DEFINE(HAVE_TINYXML2,1,[Define if tinyxml2 is installed])
+XML_LIBS="-ltinyxml2"
+AC_SUBST(XML_LIBS)
+],
+ [AC_MSG_RESULT(no)
+ AC_MSG_WARN([tinyxml2 is not installed (no import/export of benchmarks).])]
+ )
+ LIBS=$SAVED_LIBS
+])
diff --git a/template.h b/template.h
new file mode 100644
index 0000000..9c3ab98
--- /dev/null
+++ b/template.h
@@ -0,0 +1,131 @@
+/* Copyright (C) <+years+> the members of the LinBox group
+ * Written by <+someone+> < <+her mail+> >
+ *
+ * This file is part of the LinBox library.
+ *
+ * ========LICENCE========
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * LinBox 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ * ========LICENCE========
+ *
+ * other mentions
+ */
+
+#ifndef __LINBOX_<+directory_file_name+>_H
+#define __LINBOX_<+directory_file_name+>_H
+
+/** @file <+directory/file-name.h+>
+ * @brief desc
+ * long doxy desc
+ * @bib bibliography
+ */
+
+#include "<++>"
+
+#if 0 // better than commenting out code with big /* */
+// (it shows this code is not really mature yet...)
+
+#define LB_VAR 10 /* local var */
+#define LB_DEF /* local define */
+#define LB_MACRO () /* local macro */
+
+#ifdef _LINBOX_DEF // linbox global define
+#ifdef _LINBOX_MACRO // linbox global macro
+#if _LINBOX_VAR // linbox global variable
+#endif
+#endif
+#endif
+
+#endif
+
+namespace LinBox
+{
+ /** @brief this function is about...
+ * this important function has comments !!!
+ */
+ template<++>
+ void my_func(T & toto)
+ {
+ toto() ;
+ if (a) {
+ b();
+ }
+ else {
+ c() ;
+ }
+ }
+
+ template<class A,
+ class B>
+ void foo() ;
+
+ switch(a) {
+ case toto:
+ a() ;
+ break;
+ case titi:
+ {
+ b() ;
+ break;
+ }
+ default :
+ {
+ b() ;
+ }
+ }
+
+ class A {
+ private :
+ int _p ;
+ int _q ;
+ public :
+ A() :
+ _p(0), _q(0)
+ {} ;
+
+ A(int q) : _p(1), _q(q)
+ {} ;
+
+ A(int p, int q)
+ : _p(p), _q(q)
+ {} ;
+
+
+ ~A() {} ;
+ };
+#if 0
+ int old_code() // but maybe usefull later
+ {
+ prinf("comment out code !");
+ }
+#endif
+
+} //LinBox
+
+#include "<+file-name.inl+>" // implementation here
+
+#undef LB_VAR // environmentalists love us
+#undef LB_DEF // really !
+#undef LB_MACRO
+
+#endif //__LINBOX_<+directory_file_name+>_H
+
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
+
diff --git a/tests/.gitignore b/tests/.gitignore
new file mode 100644
index 0000000..8158140
--- /dev/null
+++ b/tests/.gitignore
@@ -0,0 +1,64 @@
+checker
+test-bitonic-sort
+test-blackbox-block-container
+test-blas-domain
+test-butterfly
+test-companion
+test-dense
+test-diagonal
+test-dif
+test-direct-sum
+test-echelon-form
+test-ffpack
+test-fibb
+test-getentry
+test-gf2
+test-givaropoly
+test-gmp-rational
+test-hilbert
+test-hom
+test-inverse
+test-last-invariant-factor
+test-matrix-domain
+test-matrix-stream
+test-minpoly
+test-modular-balanced-float
+test-modular-double
+test-modular-float
+test-modular-int
+test-ntl-hankel
+test-ntl-lzz_p
+test-ntl-lzz_pe
+test-ntl-lzz_pex
+test-ntl-lzz_px
+test-ntl-rr
+test-ntl-sylvester
+test-ntl-toeplitz
+test-ntl-zz_p
+test-nullspace
+test-order-basis
+test-param-fuzzy
+test-permutation
+test-plain-domain
+test-qlup
+test-randiter-nonzero
+test-random-matrix
+test-rational-matrix-factory
+test-scalar-matrix
+test-smith-form
+test-smith-form-adaptive
+test-smith-form-iliopoulos
+test-smith-form-local
+test-sparse2
+test-subiterator
+test-submatrix
+test-subvector
+test-sum
+test-toeplitz-det
+test-toom-cook
+test-trace
+test-transpose
+test-triplesbb
+test-triplesbb-omp
+test-vector-domain
+test-zero-one
diff --git a/tests/Makefile.am b/tests/Makefile.am
index cd4aafe..dc14423 100644
--- a/tests/Makefile.am
+++ b/tests/Makefile.am
@@ -17,652 +17,341 @@
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
# ========LICENCE========
+# All tests should appear in one of the lists of this makefile (and sources given).
+# Tests not used for target "check" can be in the FULLCHECK_TESTS list.
+# All tests will be processed by checker.C (target fullcheck),
+# where skips can be specified, warnings issued, package dependency handled.
-
-
-AM_CPPFLAGS=-I$(top_srcdir) -I$(top_srcdir)/linbox
+#AM_CPPFLAGS=-I$(top_srcdir) -I$(top_srcdir)/linbox -I${PREFIX}/include
# AM_LDFLAGS = -llapack -lcblas -latlas
-AM_LDFLAGS = $(top_srcdir)/linbox/.libs/liblinbox.a
+# AM_LDFLAGS = $(top_srcdir)/linbox/.libs/liblinbox.a
+#AM_LDFLAGS = $(top_srcdir)/linbox/liblinbox.la
# SAFER_FLAGS = -g -Wall -Wextra -Wno-unused-parameter
# bds: no need to optimize for unit/regression tests, and opt adds a lot to compilation time
-#AM_CXXFLAGS = @TESTS_CFLAGS@ -DLinBoxSrcOnly
-# AM_CXXFLAGS = $(SAFER_FLAGS) -DLinBoxSrcOnly
-#AM_CXXFLAGS = $(SAFER_FLAGS) -DLinBoxSrcOnly -O2
-# AM_CXXFLAGS = -g -DLinBoxSrcOnly -Wall -DDEBUG -O0
-AM_CXXFLAGS = -DLinBoxSrcOnly @TESTS_CFLAGS@ @DEBUG_CFLAGS@
-# AM_CXXFLAGS = -g -DLinBoxSrcOnly -Wall -D__LINBOX_HAVE_DGETRF -D__LINBOX_HAVE_DGETRI
+#AM_CXXFLAGS = @TESTS_CFLAGS@ -DLinBoxTestOnly
+# AM_CXXFLAGS = $(SAFER_FLAGS) -DLinBoxTestOnly
+#AM_CXXFLAGS = $(SAFER_FLAGS) -DLinBoxTestOnly -O2
+# AM_CXXFLAGS = -g -DLinBoxTestOnly -Wall -DDEBUG -O0
+
+AM_CPPFLAGS = -DLinBoxTestOnly @TESTS_CFLAGS@ @DEBUG_CFLAGS@
+
+# AM_CXXFLAGS = -g -DLinBoxTestOnly -Wall -D__LINBOX_HAVE_DGETRF -D__LINBOX_HAVE_DGETRI
# AM_CFLAGS = -g -Wall
SUBDIRS = data matrix
-AM_CPPFLAGS+= $(CBLAS_FLAG) $(FFLAS_FFPACK_CFLAGS) $(GMP_CFLAGS) $(NTL_CFLAGS) $(GIVARO_CFLAGS) $(LIDIA_CFLAGS) $(IML_CFLAGS)
-LDADD = $(GIVARO_LIBS) $(BLAS_LIBS) $(NTL_LIBS) $(GMP_LIBS) $(LIDIA_LIBS) $(MPFR_LIBS) $(FPLLL_LIBS) $(IML_LIBS) $(LDFLAGS)
-# AM_LDFLAGS+=-static -Wl,-rpath -Wl,$(GIVARO_LIBS)
+AM_CPPFLAGS+= -I$(top_srcdir)/linbox $(DEPS_CFLAGS)
+LDADD = $(DEPS_LIBS) $(LDFLAGS)
+AM_LDFLAGS = $(top_builddir)/linbox/liblinbox.la
+# AM_LDFLAGS+=-static -Wl,-rpath -Wl,
+
+EXTRA_DIST = \
+ test-blackbox.h \
+ test-common.h \
+ test-common.inl \
+ test-field.h \
+ test-generic.h \
+ test-matrix-utils.h \
+ test-matrix-domain.h \
+ test-rank.h \
+ test-vector-domain.h \
+ tests.doxy \
+ checker.C
-EXTRA_DIST= \
- test-common.C \
- tests.doxy \
- checker.C
+PERFPUBLISHERFILE = tests-report.xml
-# test-generic-for-quad.h
+# tutorial-1: tutorial-1.C
-# Put an entry for your test-mycomponent.C here (or in one of the other test groups).
+# test-tutorial$(EXEEXT): test-tutorial.C tutorial-1
+
+# Put an entry for your test-mycomponent.C in one of the test groups.
# Don't forget to add a test_mycomponent_SOURCES entry below.
#
# Once present, tests should remain present, being moved from one group to another.
-# Note that among the available groups are NONCOMPILING_TESTS and FAILING_TESTS, which
-# will be ignored by "make check" and can be temporary storage for problematic tests.
-BASIC_TESTS = \
- test-commentator \
- test-det \
- test-frobenius \
- test-rank \
- test-solve \
- test-nullspace \
- test-smith-form-binary \
- test-rational-solver \
- test-rational-solver-adaptive \
- test-charpoly \
- test-cra
-
-FULLCHECK_TESTS = \
- test-bitonic-sort \
+BASIC_TESTS = \
+ test-commentator \
+ test-det \
+ test-frobenius \
+ test-solve \
+ test-rational-solver \
+ test-rational-solver-adaptive \
+ test-rank-u32 \
+ test-rank-md \
+ test-rank-Int \
+ test-cra \
+ test-blas-matrix \
+ test-charpoly \
+ test-regression
+
+# All other tests.
+# The checker.C determines which of these are built and run in "make fullcheck".
+FULLCHECK_TESTS = \
+ test-bitonic-sort \
test-blackbox-block-container \
- test-blas-domain \
- test-butterfly \
- test-companion \
- test-dense \
- test-diagonal \
- test-dif \
- test-direct-sum \
- test-echelon-form \
- test-ffpack \
- test-getentry \
- test-gf2 \
- test-gmp-rational \
- test-hilbert \
- test-hom \
- test-inverse \
- test-isposdef \
- test-ispossemidef \
- test-matrix-domain \
- test-matrix-stream \
- test-minpoly \
- test-modular \
- test-modular-balanced-int \
- test-modular-balanced-float \
- test-modular-balanced-double \
- test-modular-byte \
- test-modular-double \
- test-modular-float \
- test-modular-int \
- test-modular-short \
- test-block-ring \
- test-PID-integer \
- test-moore-penrose \
- test-randiter-nonzero \
- test-rational-matrix-factory \
- test-scalar-matrix \
- test-solve-nonsingular \
- test-sparse \
- test-subiterator \
- test-submatrix \
- test-subvector \
- test-sum \
- test-trace \
- test-triplesbb \
- test-vector-domain \
- test-qlup \
- test-zero-one \
- test-last-invariant-factor \
- test-cradomain \
- test-rational-reconstruction-base
-
-# test-integer-tools
-
-# tests of components not adhering to LinBox requirements.
-NONCOMPLIANT_TESTS = \
- test-ntl-RR \
- test-param-fuzzy
-
-#These need clapack
-#test-rational-solver-adaptive
-
-DUBIOUS_TESTS = \
- test-unparametric-field \
- test-bmseq \
- test-zo
-# test-quad-matrix
-
-NONCOMPILING_TESTS = \
- test-dense-zero-one
-
-FAILING_TESTS = \
- test-rat-charpoly \
- test-rat-solve \
- test-rat-minpoly \
- test-smith-form-local \
- test-smith-form-adaptive \
- test-dyadic-to-rational \
- test-mg-block-lanczos \
- test-ftrmm \
- test-la-block-lanczos
-
-USE_NONCOMPILING_TESTS =
-USE_FAILING_TESTS =
-# comment out these two lines to avoid facing reality
-#USE_NONCOMPILING_TESTS += $(NONCOMPILING_TESTS)
-#USE_FAILING_TESTS += $(FAILING_TESTS)
-
-# a benchmarker, not to be included in check.
-BENCHMARKS = \
- benchmark-fields \
- benchmark-blas-domain
-
-# historical tests, no longer in use
-# test-nag-sparse replaced by tripplesbb
-# test-lsp lsp.h superceded by factorized-matrix.h
-# removed test
-# test-nag-sparse
-# test-image-field replaced by hom
-# test-lsp
-# I put test-gssv_rank in hmrg:~saunders/gen_superlu. It is not linbox until and unless it is made to work
-# test-gssv is an ntl test
-
-
-# no explicit test needed, I guess...
-# Transpose is tested in test-triplesbb
-# Compose is tested in test-butterfly
-
-GIVARO_TESTS = \
- test-givaro-fields
-
-NTL_TESTS = \
- test-smith-form \
- test-ntl-lzz_p \
- test-ntl-ZZ_p \
- test-ntl-toeplitz \
- test-ntl-hankel \
- test-ntl-sylvester \
- test-smith-form-iliopoulos \
- test-toeplitz-det
-
-LIDIA_TESTS = \
- test-lidia-gfq
-
-ATLAS_TESTS = \
- test-optimization
-
-BLAS3_UNIT_TESTS = \
- test-toom-cook
+ test-blas-domain \
+ test-block-ring \
+ test-block-wiedemann \
+ test-butterfly \
+ test-companion \
+ test-cradomain \
+ test-dense \
+ test-dense-zero-one \
+ test-diagonal \
+ test-dif \
+ test-direct-sum \
+ test-dyadic-to-rational \
+ test-echelon-form \
+ test-ffpack \
+ test-fibb \
+ test-ftrmm \
+ test-getentry \
+ test-gf2 \
+ test-givaropoly \
+ test-givaro-zpz \
+ test-givaro-zpzuns \
+ test-gmp-rational \
+ test-hilbert \
+ test-hom \
+ test-image-field \
+ test-inverse \
+ test-isposdef \
+ test-ispossemidef \
+ test-la-block-lanczos \
+ test-last-invariant-factor \
+ test-matrix-domain \
+ test-matrix-stream \
+ test-mg-block-lanczos \
+ test-minpoly \
+ test-modular \
+ test-modular-balanced-double \
+ test-modular-balanced-float \
+ test-modular-balanced-int \
+ test-modular-byte \
+ test-modular-double \
+ test-modular-float \
+ test-modular-int \
+ test-modular-short \
+ test-moore-penrose \
+ test-ntl-hankel \
+ test-ntl-lzz_p \
+ test-ntl-lzz_pe \
+ test-ntl-lzz_pex \
+ test-ntl-lzz_px \
+ test-ntl-rr \
+ test-ntl-sylvester \
+ test-ntl-toeplitz \
+ test-ntl-zz_p \
+ test-nullspace \
+ test-optimization \
+ test-order-basis \
+ test-param-fuzzy \
+ test-permutation \
+ test-plain-domain \
+ test-poly-det \
+ test-qlup \
+ test-quad-matrix \
+ test-randiter-nonzero \
+ test-random-matrix \
+ test-rat-charpoly \
+ test-rational-matrix-factory \
+ test-rational-reconstruction-base \
+ test-rat-minpoly \
+ test-rat-solve \
+ test-scalar-matrix \
+ test-smith-form \
+ test-smith-form-adaptive \
+ test-smith-form-binary \
+ test-smith-form-iliopoulos \
+ test-smith-form-local \
+ test-solve-nonsingular \
+ test-sparse \
+ test-subiterator \
+ test-submatrix \
+ test-subvector \
+ test-sum \
+ test-toom-cook \
+ test-trace \
+ test-transpose \
+ test-triplesbb \
+ test-triplesbb-omp \
+ test-tutorial \
+ test-vector-domain \
+ test-zero-one
+
+# Really just one or two of these would be enough for target check.
+# The rest can be in target fullcheck.
+NTL_TESTS = \
+ test-smith-form \
+ test-ntl-lzz_p \
+ test-ntl-lzz_pe \
+ test-ntl-lzz_px \
+ test-ntl-lzz_pex \
+ test-ntl-zz_p \
+ test-ntl-toeplitz \
+ test-ntl-hankel \
+ test-ntl-sylvester \
+ test-smith-form-iliopoulos \
+ test-toeplitz-det
if LINBOX_HAVE_NTL
-USE_NTL_TESTS = $(NTL_TESTS)
-endif
-
-if LINBOX_HAVE_GIVARO
-USE_GIVARO_TESTS = $(GIVARO_TESTS)
-endif
-
-if LINBOX_HAVE_LIDIA
-USE_LIDIA_TESTS = $(LIDIA_TESTS)
+#USE_NTL_TESTS = $(NTL_TESTS)
+USE_NTL_TESTS = \
+ test-ntl-lzz_pex \
+ test-toeplitz-det
endif
+# if LINBOX_HAVE_SAGE
+# SAGE_LIBS = -L at libdir@ -llinboxsage
+# test_regression_LDFLAGS = $(SAGE_LIBS)
+# endif
-USE_ATLAS_TESTS = $(ATLAS_TESTS)
-
-
-TESTS = \
- $(BASIC_TESTS) \
- $(USE_GIVARO_TESTS) \
- $(USE_NTL_TESTS) \
- $(USE_LIDIA_TESTS) \
- $(USE_NONCOMPILING_TESTS) \
- $(USE_FAILING_TESTS) \
- $(USE_ATLAS_TESTS)
-
-
-
-EXTRA_PROGRAMS = \
- $(BASIC_TESTS) \
- $(GIVARO_TESTS) \
- $(NTL_TESTS) \
- $(ATLAS_TESTS) \
- $(LIDIA_TESTS) \
- $(BENCHMARKS) \
- $(NONEXISTING_TESTS) \
- $(NONCOMPILING_TESTS) \
- $(NONCOMPLIANT_TESTS) \
- $(DUBIOUS_TESTS) \
- $(FULLCHECK_TESTS) \
- $(FAILING_TESTS) \
- $(BLAS3_UNIT_TESTS)
-
-
-test_commentator_SOURCES = \
- test-commentator.C \
- test-common.h
-
-test_modular_SOURCES = \
- test-modular.C \
- test-generic.h \
- test-common.h
-
-test_blackbox_block_container_SOURCES = \
- test-blackbox-block-container.C \
- test-common.h
-
-test_solve_nonsingular_SOURCES = \
- test-solve-nonsingular.C \
- test-common.h
-
-test_block_ring_SOURCES = \
- test-block-ring.C \
- test-field.h \
- test-common.h
-
-test_PID_integer_SOURCES = \
- test-PID-integer.C \
- test-field.h \
- test-common.h
-
-test_hom_SOURCES = \
- test-hom.C \
- test-generic.h \
- test-common.h
-
-test_gf2_SOURCES = \
- test-gf2.C \
- test-generic.h \
- test-common.h
-
-test_gmp_rational_SOURCES = \
- test-gmp-rational.C \
- test-generic.h \
- test-common.h
-
-test_unparametric_field_SOURCES = \
- test-unparametric-field.C \
- test-generic.h \
- test-common.h
-
-test_randiter_nonzero_SOURCES = \
- test-randiter-nonzero.C \
- test-common.h
-
-test_rational_matrix_factory_SOURCES = \
- test-rational-matrix-factory.C \
- test-common.h
-
-test_rational_reconstruction_base_SOURCES = \
- test-rational-reconstruction-base.C \
- test-common.h
-
-test_rat_solve_SOURCES = \
- test-rat-solve.C \
- test-common.h
-
-test_rat_charpoly_SOURCES = \
- test-rat-charpoly.C \
- test-common.h
-
-test_rat_minpoly_SOURCES = \
- test-rat-minpoly.C \
- test-common.h
-
-test_subiterator_SOURCES = \
- test-subiterator.C \
- test-common.h
-
-test_subvector_SOURCES = \
- test-subvector.C \
- test-common.h
-
-test_vector_domain_SOURCES = \
- test-vector-domain.C \
- test-vector-domain.h
-
-test_matrix_domain_SOURCES = \
- test-matrix-domain.C \
- test-common.h
-
-test_dense_SOURCES = \
- test-dense.C \
- test-common.h
-
-test_sparse_SOURCES = \
- test-sparse.C \
- test-common.h
-
-test_submatrix_SOURCES = \
- test-submatrix.C \
- test-common.h
-
-test_scalar_matrix_SOURCES = \
- test-scalar-matrix.C \
- test-generic.h \
- test-common.h
-
-test_bmseq_SOURCES = \
- test-bmseq.C \
- test-common.h
-
-test_butterfly_SOURCES = \
- test-vector-domain.h \
- test-blackbox.h \
- test-butterfly.C \
- test-generic.h \
- test-common.h
-
-test_charpoly_SOURCES = \
- test-charpoly.C \
- test-common.h
-
-test_diagonal_SOURCES = \
- test-diagonal.C \
- test-generic.h \
- test-common.h
-
-test_sum_SOURCES = \
- test-sum.C \
- test-generic.h \
- test-common.h
-
-test_dif_SOURCES = \
- test-dif.C test-generic.h \
- test-common.h
-
-test_triplesbb_SOURCES = \
- test-triplesbb.C \
- test-generic.h \
- test-common.h
-
-test_hilbert_SOURCES = \
- test-hilbert.C test-generic.h \
- test-common.h
-
-test_ntl_toeplitz_SOURCES = \
- test-ntl-toeplitz.C \
- test-common.h
-
-test_ntl_hankel_SOURCES = \
- test-ntl-hankel.C \
- test-common.h
-
-
-test_ntl_sylvester_SOURCES = \
- test-ntl-sylvester.C \
- test-common.h
+OCL_TESTS = test-opencl-domain
-test_toeplitz_det_SOURCES = \
- test-toeplitz-det.C
-
-test_trace_SOURCES = \
- test-trace.C \
- test-common.h
-
-test_getentry_SOURCES = \
- test-getentry.C \
- test-common.h
-
-test_minpoly_SOURCES = \
- test-minpoly.C \
- test-common.h
-
-test_det_SOURCES = \
- test-det.C \
- test-common.h
-
-test_rank_SOURCES = \
- test-rank.C \
- test-common.h
-
-test_qlup_SOURCES = \
- test-qlup.C \
- test-common.h
-
-test_solve_SOURCES = \
- test-solve.C \
- test-common.h
-
-test_direct_sum_SOURCES = \
- test-direct-sum.C \
- test-generic.h \
- test-common.h
-
-test_echelon_form_SOURCES = \
- test-echelon-form.C \
- test-common.h
-
-test_frobenius_SOURCES = \
- test-frobenius.C \
- test-generic.h \
- test-common.h
-
-test_companion_SOURCES = \
- test-companion.C \
- test-generic.h \
- test-common.h
-
-test_inverse_SOURCES = \
- test-inverse.C \
- test-common.h
-
-test_moore_penrose_SOURCES = \
- test-moore-penrose.C \
- test-common.h
-
-test_ntl_RR_SOURCES = \
- test-ntl-RR.C \
- test-generic.h \
- test-common.h
-
-test_ntl_ZZ_p_SOURCES = \
- test-ntl-ZZ_p.C \
- test-generic.h \
- test-common.h
-
-test_ntl_lzz_p_SOURCES = \
- test-ntl-lzz_p.C \
- test-generic.h \
- test-common.h
-
-test_givaro_fields_SOURCES = \
- test-givaro-fields.C \
- test-generic.h \
- test-common.h
-
-test_lidia_gfq_SOURCES = \
- test-lidia-gfq.C \
- test-generic.h \
- test-common.h
-
-test_param_fuzzy_SOURCES = \
- test-param-fuzzy.C \
- test-generic.h \
- test-common.h
-
-# test_quad_matrix_SOURCES = \
-# test-quad-matrix.C \
-# test-generic-for-quad.h \
-# test-generic.h \
-# test-common.h
-
-test_zo_SOURCES = \
- test-zo.C \
- test-generic.h \
- test-common.h
-
-test_zero_one_SOURCES = \
- test-zero-one.C \
- test-generic.h \
- test-common.h
-
-test_modular_int_SOURCES = \
- test-modular-int.C \
- test-common.h
-
-test_modular_short_SOURCES = \
- test-modular-short.C \
- test-generic.h \
- test-common.h
-
-test_modular_double_SOURCES = \
- test-modular-double.C \
- test-generic.h \
- test-common.h
-
-test_modular_float_SOURCES = \
- test-modular-float.C \
- test-generic.h \
- test-common.h
-
-
-test_modular_byte_SOURCES = \
- test-modular-byte.C \
- test-generic.h \
- test-common.h
-
-test_modular_balanced_int_SOURCES = \
- test-modular-balanced-int.C \
- test-generic.h \
- test-common.h
-
-test_modular_balanced_double_SOURCES = \
- test-modular-balanced-double.C \
- test-generic.h \
- test-common.h
-
-test_modular_balanced_float_SOURCES = \
- test-modular-balanced-float.C \
- test-generic.h \
- test-common.h
-
-test_smith_form_iliopoulos_SOURCES= \
- test-common.h \
- test-smith-form-iliopoulos.C
-
-test_smith_form_binary_SOURCES= \
- test-common.h \
- test-smith-form-binary.C
-
-test_smith_form_SOURCES= \
- test-common.h \
- test-smith-form.C
-
-test_last_invariant_factor_SOURCES= \
- test-common.h \
- test-last-invariant-factor.C
-
-test_smith_form_local_SOURCES= \
- test-common.h \
- test-smith-form-local.C
-
-test_optimization_SOURCES= \
- test-common.h \
- test-optimization.C
-
-test_nullspace_SOURCES= \
- test-common.h \
- test-nullspace.C
-
-test_bitonic_sort_SOURCES= \
- test-common.h \
- test-bitonic-sort.C
-
-test_rational_solver_SOURCES = \
- test-common.h \
- test-rational-solver.C
-
-test_blas_domain_SOURCES= \
- test-common.h \
- test-blas-domain.C
-
-test_ffpack_SOURCES= \
- test-common.h \
- test-ffpack.C
-
-test_matrix_stream_SOURCES = \
- test-matrix-stream.C
-
-test_la_block_lanczos_SOURCES = \
- test-la-block-lanczos.C
-
-test_mg_block_lanczos_SOURCES = \
- test-mg-block-lanczos.C
-
-test_rational_solver_adaptive_SOURCES = \
- test-rational-solver-adaptive.C \
- test-common.h
-
-test_dyadic_to_rational_SOURCES = \
- test-dyadic-to-rational.C \
- test-common.h
-
-test_cra_SOURCES = \
- test-cra.C \
- test-common.h
-
-test_cradomain_SOURCES = \
- test-cradomain.C \
- test-common.h
-
-
-# NTL test
-
-test_smith_form_adaptive_SOURCES= \
- test-common.h \
- test-smith-form-adaptive.C
-
-benchmark_fields_SOURCES= \
- test-common.h \
- benchmark-fields.C
-
-benchmark_blas_domain_SOURCES= \
- test-common.h \
- benchmark-blas-domain.C
-
-test_isposdef_SOURCES= \
- test-common.h \
- test-isposdef.C
-
-test_dense_zero_one_SOURCES= \
- test-blackbox.h \
- test-dense-zero-one.C
-
-test_ispossemidef_SOURCES= \
- test-common.h \
- test-ispossemidef.C
-
-test_ftrmm_SOURCES = \
- test-ftrmm.C
-
-test_toom_cook_SOURCES = test-toom-cook.C
+if LINBOX_HAVE_OCL
+USE_OCL_TESTS = $(OCL_TESTS)
+#AM_CPPFLAGS += $(OCL_CFLAGS)
+#LDADD += $(OCL_LIBS)
+endif
-# test_integer_tools_SOURCES = \
-# test-integer-tools.C
+# check builds and runs these
+TESTS = \
+ $(BASIC_TESTS) \
+ $(USE_NTL_TESTS) \
+ $(USE_OCL_TESTS)
+# alternate definition of check target
#check: checker
# checker -c
-# for compilation of new non-enumerated tests
-%:%.C
- $(CXX) $(CXXFLAGS) $(AM_CXXFLAGS) $(OPTFLAGS) ${INCLUDES} $(AM_CPPFLAGS) $*.C -o $@ $(LDADD)
-
-fullcheck: checker
- ./checker
-
-checker: checker.C
+EXTRA_PROGRAMS = \
+ $(BASIC_TESTS) \
+ $(NTL_TESTS) \
+ $(FULLCHECK_TESTS) \
+ $(OCL_TESTS)
CLEANFILES= checker \
$(TESTS) \
$(BASIC_TESTS) \
- $(FAILING_TESTS) \
- $(NONCOMPLIANT_TESTS) \
- $(BENCHMARKS) \
- $(DUBIOUS_TESTS) \
$(FULLCHECK_TESTS) \
$(NTL_TESTS) \
- $(GIVARO_TESTS) \
- $(ATLAS_TESTS)
+ $(OCL_TESTS) \
+ $(PERFPUBLISHERFILE)
+
+test_bitonic_sort_SOURCES = test-bitonic-sort.C
+test_blackbox_block_container_SOURCES = test-blackbox-block-container.C
+test_blas_domain_SOURCES = test-blas-domain.C
+test_blas_matrix_SOURCES = test-blas-matrix.C
+test_block_ring_SOURCES = test-block-ring.C
+test_block_wiedemann_SOURCES = test-block-wiedemann.C
+test_butterfly_SOURCES = test-butterfly.C test-vector-domain.h test-blackbox.h
+test_charpoly_SOURCES = test-charpoly.C
+test_commentator_SOURCES = test-commentator.C
+test_companion_SOURCES = test-companion.C
+test_cradomain_SOURCES = test-cradomain.C test-common.h
+test_cra_SOURCES = test-cra.C test-common.h
+test_dense_SOURCES = test-dense.C test-common.h
+test_dense_zero_one_SOURCES = test-dense-zero-one.C
+test_det_SOURCES = test-det.C
+test_diagonal_SOURCES = test-diagonal.C
+test_dif_SOURCES = test-dif.C
+test_direct_sum_SOURCES = test-direct-sum.C
+test_dyadic_to_rational_SOURCES = test-dyadic-to-rational.C
+test_echelon_form_SOURCES = test-echelon-form.C
+test_ffpack_SOURCES = test-ffpack.C
+test_fibb_SOURCES = test-fibb.C
+test_frobenius_SOURCES = test-frobenius.C
+test_ftrmm_SOURCES = test-ftrmm.C
+test_getentry_SOURCES = test-getentry.C
+test_gf2_SOURCES = test-gf2.C
+test_givaropoly_SOURCES = test-givaropoly.C
+test_givaro_zpz_SOURCES = test-givaro-zpz.C
+test_givaro_zpzuns_SOURCES = test-givaro-zpzuns.C
+test_gmp_rational_SOURCES = test-gmp-rational.C
+test_hilbert_SOURCES = test-hilbert.C
+test_hom_SOURCES = test-hom.C
+test_image_field_SOURCES = test-image-field.C
+test_inverse_SOURCES = test-inverse.C
+test_isposdef_SOURCES = test-isposdef.C
+test_ispossemidef_SOURCES = test-ispossemidef.C
+test_la_block_lanczos_SOURCES = test-la-block-lanczos.C
+test_last_invariant_factor_SOURCES = test-last-invariant-factor.C
+test_matrix_domain_SOURCES = test-matrix-domain.C test-common.h
+test_matrix_stream_SOURCES = test-matrix-stream.C
+test_mg_block_lanczos_SOURCES = test-mg-block-lanczos.C
+test_minpoly_SOURCES = test-minpoly.C
+test_modular_balanced_double_SOURCES = test-modular-balanced-double.C
+test_modular_balanced_float_SOURCES = test-modular-balanced-float.C
+test_modular_balanced_int_SOURCES = test-modular-balanced-int.C
+test_modular_byte_SOURCES = test-modular-byte.C
+test_modular_double_SOURCES = test-modular-double.C
+test_modular_float_SOURCES = test-modular-float.C
+test_modular_int_SOURCES = test-modular-int.C
+test_modular_short_SOURCES = test-modular-short.C
+test_modular_SOURCES = test-modular.C
+test_moore_penrose_SOURCES = test-moore-penrose.C
+test_ntl_hankel_SOURCES = test-ntl-hankel.C
+test_ntl_lzz_pe_SOURCES = test-ntl-lzz_pe.C test-field.h
+test_ntl_lzz_pex_SOURCES = test-ntl-lzz_pex.C test-field.h
+test_ntl_lzz_p_SOURCES = test-ntl-lzz_p.C test-field.h
+test_ntl_lzz_px_SOURCES = test-ntl-lzz_px.C test-field.h
+test_ntl_rr_SOURCES = test-ntl-rr.C
+test_ntl_sylvester_SOURCES = test-ntl-sylvester.C
+test_ntl_toeplitz_SOURCES = test-ntl-toeplitz.C
+test_ntl_zz_p_SOURCES = test-ntl-zz_p.C
+test_nullspace_SOURCES = test-nullspace.C
+test_opencl_domain_SOURCES = test-opencl-domain.C
+test_optimization_SOURCES = test-optimization.C
+test_order_basis_SOURCES = test-order-basis.C
+test_param_fuzzy_SOURCES = test-param-fuzzy.C
+test_permutation_SOURCES = test-permutation.C
+test_plain_domain_SOURCES = test-plain-domain.C
+test_poly_det_SOURCES = test-poly-det.C
+test_qlup_SOURCES = test-qlup.C
+test_quad_matrix_SOURCES = test-quad-matrix.C
+test_randiter_nonzero_SOURCES = test-randiter-nonzero.C
+test_random_matrix_SOURCES = test-random-matrix.C
+test_rank_Int_SOURCES = test-rank-Int.C test-rank.h
+test_rank_md_SOURCES = test-rank-md.C test-rank.h
+test_rank_u32_SOURCES = test-rank-u32.C test-rank.h
+test_rat_charpoly_SOURCES = test-rat-charpoly.C test-common.h
+test_rational_matrix_factory_SOURCES = test-rational-matrix-factory.C
+test_rational_reconstruction_base_SOURCES = test-rational-reconstruction-base.C
+test_rational_solver_adaptive_SOURCES = test-rational-solver-adaptive.C test-common.h
+test_rational_solver_SOURCES = test-rational-solver.C
+test_rat_minpoly_SOURCES = test-rat-minpoly.C test-common.h
+test_rat_solve_SOURCES = test-rat-solve.C test-common.h
+test_regression_SOURCES = test-regression.C
+test_scalar_matrix_SOURCES = test-scalar-matrix.C
+test_smith_form_adaptive_SOURCES = test-smith-form-adaptive.C test-common.h
+test_smith_form_binary_SOURCES = test-smith-form-binary.C
+test_smith_form_iliopoulos_SOURCES = test-smith-form-iliopoulos.C
+test_smith_form_local_SOURCES = test-smith-form-local.C
+test_smith_form_SOURCES = test-smith-form.C
+test_solve_nonsingular_SOURCES = test-solve-nonsingular.C
+test_solve_SOURCES = test-solve.C
+test_sparse_SOURCES = test-sparse.C test-common.h
+test_subiterator_SOURCES = test-subiterator.C test-common.h
+test_submatrix_SOURCES = test-submatrix.C test-common.h
+test_subvector_SOURCES = test-subvector.C test-common.h
+test_sum_SOURCES = test-sum.C
+test_toeplitz_det_SOURCES = test-toeplitz-det.C
+test_toom_cook_SOURCES = test-toom-cook.C
+test_trace_SOURCES = test-trace.C
+test_transpose_SOURCES = test-transpose.C
+test_triplesbb_omp_SOURCES = test-triplesbb-omp.C
+test_triplesbb_SOURCES = test-triplesbb.C
+test_tutorial_SOURCES = test-tutorial.C
+test_vector_domain_SOURCES = test-vector-domain.C test-vector-domain.h
+test_zero_one_SOURCES = test-zero-one.C
+
+# Perfpublisher script interaction - AB 2014/12/11
+perfpublisher:
+ +./perfpublisher.sh "$(PERFPUBLISHERFILE)" "$(TESTS)" "$(CXX)"
+
+# for compilation of non-enumerated programs
+%:%.C
+ $(CXX) $(CXXFLAGS) $(AM_CPPFLAGS) ${INCLUDES} $(AM_CPPFLAGS) $*.C -o $@ $(LDADD)
+
+fullcheck: checker
+ ./checker
diff --git a/tests/Makefile.in b/tests/Makefile.in
deleted file mode 100644
index bd15b96..0000000
--- a/tests/Makefile.in
+++ /dev/null
@@ -1,2599 +0,0 @@
-# Makefile.in generated by automake 1.11.5 from Makefile.am.
-# @configure_input@
-
-# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software
-# Foundation, Inc.
-# This Makefile.in is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
-# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
-# PARTICULAR PURPOSE.
-
- at SET_MAKE@
-
-# Copyright (c) 2010-2011 the LinBox group
-# ========LICENCE========
-# This file is part of the library LinBox.
-#
-# LinBox is free software: you can redistribute it and/or modify
-# it under the terms of the GNU Lesser General Public
-# License as published by the Free Software Foundation; either
-# version 2.1 of the License, or (at your option) any later version.
-#
-# This library 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
-# Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public
-# License along with this library; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
-# ========LICENCE========
-VPATH = @srcdir@
-am__make_dryrun = \
- { \
- am__dry=no; \
- case $$MAKEFLAGS in \
- *\\[\ \ ]*) \
- echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \
- | grep '^AM OK$$' >/dev/null || am__dry=yes;; \
- *) \
- for am__flg in $$MAKEFLAGS; do \
- case $$am__flg in \
- *=*|--*) ;; \
- *n*) am__dry=yes; break;; \
- esac; \
- done;; \
- esac; \
- test $$am__dry = yes; \
- }
-pkgdatadir = $(datadir)/@PACKAGE@
-pkgincludedir = $(includedir)/@PACKAGE@
-pkglibdir = $(libdir)/@PACKAGE@
-pkglibexecdir = $(libexecdir)/@PACKAGE@
-am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
-install_sh_DATA = $(install_sh) -c -m 644
-install_sh_PROGRAM = $(install_sh) -c
-install_sh_SCRIPT = $(install_sh) -c
-INSTALL_HEADER = $(INSTALL_DATA)
-transform = $(program_transform_name)
-NORMAL_INSTALL = :
-PRE_INSTALL = :
-POST_INSTALL = :
-NORMAL_UNINSTALL = :
-PRE_UNINSTALL = :
-POST_UNINSTALL = :
-build_triplet = @build@
-host_triplet = @host@
-TESTS = $(am__EXEEXT_1) $(am__EXEEXT_13) $(am__EXEEXT_14) \
- $(am__EXEEXT_15) $(am__EXEEXT_16) $(am__EXEEXT_16) \
- $(am__EXEEXT_17)
-EXTRA_PROGRAMS = $(am__EXEEXT_1) $(am__EXEEXT_2) $(am__EXEEXT_3) \
- $(am__EXEEXT_4) $(am__EXEEXT_5) $(am__EXEEXT_6) \
- $(am__EXEEXT_7) $(am__EXEEXT_8) $(am__EXEEXT_9) \
- $(am__EXEEXT_10) $(am__EXEEXT_11) $(am__EXEEXT_12)
-subdir = tests
-DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in TODO
-ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-am__aclocal_m4_deps = $(top_srcdir)/macros/aclocal-include.m4 \
- $(top_srcdir)/macros/config-header.m4 \
- $(top_srcdir)/macros/debug.m4 \
- $(top_srcdir)/macros/expat-check.m4 \
- $(top_srcdir)/macros/fflas-ffpack-check.m4 \
- $(top_srcdir)/macros/fplll-check.m4 \
- $(top_srcdir)/macros/givaro-check.m4 \
- $(top_srcdir)/macros/gmp-check.m4 \
- $(top_srcdir)/macros/iml-check.m4 \
- $(top_srcdir)/macros/lapack-check.m4 \
- $(top_srcdir)/macros/libtool.m4 \
- $(top_srcdir)/macros/lidia-check.m4 \
- $(top_srcdir)/macros/linbox-benchmark.m4 \
- $(top_srcdir)/macros/linbox-doc.m4 \
- $(top_srcdir)/macros/linbox-misc.m4 \
- $(top_srcdir)/macros/linbox-opt.m4 \
- $(top_srcdir)/macros/ltoptions.m4 \
- $(top_srcdir)/macros/ltsugar.m4 \
- $(top_srcdir)/macros/ltversion.m4 \
- $(top_srcdir)/macros/lt~obsolete.m4 \
- $(top_srcdir)/macros/m4ri-check.m4 \
- $(top_srcdir)/macros/m4rie-check.m4 \
- $(top_srcdir)/macros/maple-check.m4 \
- $(top_srcdir)/macros/mpfr-check.m4 \
- $(top_srcdir)/macros/ntl-check.m4 \
- $(top_srcdir)/macros/saclib-check.m4 \
- $(top_srcdir)/macros/sage-check.m4 $(top_srcdir)/configure.ac
-am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
- $(ACLOCAL_M4)
-mkinstalldirs = $(install_sh) -d
-CONFIG_HEADER = $(top_builddir)/config.h
-CONFIG_CLEAN_FILES =
-CONFIG_CLEAN_VPATH_FILES =
-am__EXEEXT_1 = test-commentator$(EXEEXT) test-det$(EXEEXT) \
- test-frobenius$(EXEEXT) test-rank$(EXEEXT) test-solve$(EXEEXT) \
- test-nullspace$(EXEEXT) test-smith-form-binary$(EXEEXT) \
- test-rational-solver$(EXEEXT) \
- test-rational-solver-adaptive$(EXEEXT) test-charpoly$(EXEEXT) \
- test-cra$(EXEEXT)
-am__EXEEXT_2 = test-givaro-fields$(EXEEXT)
-am__EXEEXT_3 = test-smith-form$(EXEEXT) test-ntl-lzz_p$(EXEEXT) \
- test-ntl-ZZ_p$(EXEEXT) test-ntl-toeplitz$(EXEEXT) \
- test-ntl-hankel$(EXEEXT) test-ntl-sylvester$(EXEEXT) \
- test-smith-form-iliopoulos$(EXEEXT) test-toeplitz-det$(EXEEXT)
-am__EXEEXT_4 = test-optimization$(EXEEXT)
-am__EXEEXT_5 = test-lidia-gfq$(EXEEXT)
-am__EXEEXT_6 = benchmark-fields$(EXEEXT) \
- benchmark-blas-domain$(EXEEXT)
-am__EXEEXT_7 = test-dense-zero-one$(EXEEXT)
-am__EXEEXT_8 = test-ntl-RR$(EXEEXT) test-param-fuzzy$(EXEEXT)
-am__EXEEXT_9 = test-unparametric-field$(EXEEXT) test-bmseq$(EXEEXT) \
- test-zo$(EXEEXT)
-am__EXEEXT_10 = test-bitonic-sort$(EXEEXT) \
- test-blackbox-block-container$(EXEEXT) \
- test-blas-domain$(EXEEXT) test-butterfly$(EXEEXT) \
- test-companion$(EXEEXT) test-dense$(EXEEXT) \
- test-diagonal$(EXEEXT) test-dif$(EXEEXT) \
- test-direct-sum$(EXEEXT) test-echelon-form$(EXEEXT) \
- test-ffpack$(EXEEXT) test-getentry$(EXEEXT) test-gf2$(EXEEXT) \
- test-gmp-rational$(EXEEXT) test-hilbert$(EXEEXT) \
- test-hom$(EXEEXT) test-inverse$(EXEEXT) test-isposdef$(EXEEXT) \
- test-ispossemidef$(EXEEXT) test-matrix-domain$(EXEEXT) \
- test-matrix-stream$(EXEEXT) test-minpoly$(EXEEXT) \
- test-modular$(EXEEXT) test-modular-balanced-int$(EXEEXT) \
- test-modular-balanced-float$(EXEEXT) \
- test-modular-balanced-double$(EXEEXT) \
- test-modular-byte$(EXEEXT) test-modular-double$(EXEEXT) \
- test-modular-float$(EXEEXT) test-modular-int$(EXEEXT) \
- test-modular-short$(EXEEXT) test-block-ring$(EXEEXT) \
- test-PID-integer$(EXEEXT) test-moore-penrose$(EXEEXT) \
- test-randiter-nonzero$(EXEEXT) \
- test-rational-matrix-factory$(EXEEXT) \
- test-scalar-matrix$(EXEEXT) test-solve-nonsingular$(EXEEXT) \
- test-sparse$(EXEEXT) test-subiterator$(EXEEXT) \
- test-submatrix$(EXEEXT) test-subvector$(EXEEXT) \
- test-sum$(EXEEXT) test-trace$(EXEEXT) test-triplesbb$(EXEEXT) \
- test-vector-domain$(EXEEXT) test-qlup$(EXEEXT) \
- test-zero-one$(EXEEXT) test-last-invariant-factor$(EXEEXT) \
- test-cradomain$(EXEEXT) \
- test-rational-reconstruction-base$(EXEEXT)
-am__EXEEXT_11 = test-rat-charpoly$(EXEEXT) test-rat-solve$(EXEEXT) \
- test-rat-minpoly$(EXEEXT) test-smith-form-local$(EXEEXT) \
- test-smith-form-adaptive$(EXEEXT) \
- test-dyadic-to-rational$(EXEEXT) \
- test-mg-block-lanczos$(EXEEXT) test-ftrmm$(EXEEXT) \
- test-la-block-lanczos$(EXEEXT)
-am__EXEEXT_12 = test-toom-cook$(EXEEXT)
-am_benchmark_blas_domain_OBJECTS = benchmark-blas-domain.$(OBJEXT)
-benchmark_blas_domain_OBJECTS = $(am_benchmark_blas_domain_OBJECTS)
-benchmark_blas_domain_LDADD = $(LDADD)
-am__DEPENDENCIES_1 =
-benchmark_blas_domain_DEPENDENCIES = $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1)
-am_benchmark_fields_OBJECTS = benchmark-fields.$(OBJEXT)
-benchmark_fields_OBJECTS = $(am_benchmark_fields_OBJECTS)
-benchmark_fields_LDADD = $(LDADD)
-benchmark_fields_DEPENDENCIES = $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1)
-am_test_PID_integer_OBJECTS = test-PID-integer.$(OBJEXT)
-test_PID_integer_OBJECTS = $(am_test_PID_integer_OBJECTS)
-test_PID_integer_LDADD = $(LDADD)
-test_PID_integer_DEPENDENCIES = $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1)
-am_test_bitonic_sort_OBJECTS = test-bitonic-sort.$(OBJEXT)
-test_bitonic_sort_OBJECTS = $(am_test_bitonic_sort_OBJECTS)
-test_bitonic_sort_LDADD = $(LDADD)
-test_bitonic_sort_DEPENDENCIES = $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1)
-am_test_blackbox_block_container_OBJECTS = \
- test-blackbox-block-container.$(OBJEXT)
-test_blackbox_block_container_OBJECTS = \
- $(am_test_blackbox_block_container_OBJECTS)
-test_blackbox_block_container_LDADD = $(LDADD)
-test_blackbox_block_container_DEPENDENCIES = $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1)
-am_test_blas_domain_OBJECTS = test-blas-domain.$(OBJEXT)
-test_blas_domain_OBJECTS = $(am_test_blas_domain_OBJECTS)
-test_blas_domain_LDADD = $(LDADD)
-test_blas_domain_DEPENDENCIES = $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1)
-am_test_block_ring_OBJECTS = test-block-ring.$(OBJEXT)
-test_block_ring_OBJECTS = $(am_test_block_ring_OBJECTS)
-test_block_ring_LDADD = $(LDADD)
-test_block_ring_DEPENDENCIES = $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1)
-am_test_bmseq_OBJECTS = test-bmseq.$(OBJEXT)
-test_bmseq_OBJECTS = $(am_test_bmseq_OBJECTS)
-test_bmseq_LDADD = $(LDADD)
-test_bmseq_DEPENDENCIES = $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1)
-am_test_butterfly_OBJECTS = test-butterfly.$(OBJEXT)
-test_butterfly_OBJECTS = $(am_test_butterfly_OBJECTS)
-test_butterfly_LDADD = $(LDADD)
-test_butterfly_DEPENDENCIES = $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1)
-am_test_charpoly_OBJECTS = test-charpoly.$(OBJEXT)
-test_charpoly_OBJECTS = $(am_test_charpoly_OBJECTS)
-test_charpoly_LDADD = $(LDADD)
-test_charpoly_DEPENDENCIES = $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1)
-am_test_commentator_OBJECTS = test-commentator.$(OBJEXT)
-test_commentator_OBJECTS = $(am_test_commentator_OBJECTS)
-test_commentator_LDADD = $(LDADD)
-test_commentator_DEPENDENCIES = $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1)
-am_test_companion_OBJECTS = test-companion.$(OBJEXT)
-test_companion_OBJECTS = $(am_test_companion_OBJECTS)
-test_companion_LDADD = $(LDADD)
-test_companion_DEPENDENCIES = $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1)
-am_test_cra_OBJECTS = test-cra.$(OBJEXT)
-test_cra_OBJECTS = $(am_test_cra_OBJECTS)
-test_cra_LDADD = $(LDADD)
-test_cra_DEPENDENCIES = $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1)
-am_test_cradomain_OBJECTS = test-cradomain.$(OBJEXT)
-test_cradomain_OBJECTS = $(am_test_cradomain_OBJECTS)
-test_cradomain_LDADD = $(LDADD)
-test_cradomain_DEPENDENCIES = $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1)
-am_test_dense_OBJECTS = test-dense.$(OBJEXT)
-test_dense_OBJECTS = $(am_test_dense_OBJECTS)
-test_dense_LDADD = $(LDADD)
-test_dense_DEPENDENCIES = $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1)
-am_test_dense_zero_one_OBJECTS = test-dense-zero-one.$(OBJEXT)
-test_dense_zero_one_OBJECTS = $(am_test_dense_zero_one_OBJECTS)
-test_dense_zero_one_LDADD = $(LDADD)
-test_dense_zero_one_DEPENDENCIES = $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1)
-am_test_det_OBJECTS = test-det.$(OBJEXT)
-test_det_OBJECTS = $(am_test_det_OBJECTS)
-test_det_LDADD = $(LDADD)
-test_det_DEPENDENCIES = $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1)
-am_test_diagonal_OBJECTS = test-diagonal.$(OBJEXT)
-test_diagonal_OBJECTS = $(am_test_diagonal_OBJECTS)
-test_diagonal_LDADD = $(LDADD)
-test_diagonal_DEPENDENCIES = $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1)
-am_test_dif_OBJECTS = test-dif.$(OBJEXT)
-test_dif_OBJECTS = $(am_test_dif_OBJECTS)
-test_dif_LDADD = $(LDADD)
-test_dif_DEPENDENCIES = $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1)
-am_test_direct_sum_OBJECTS = test-direct-sum.$(OBJEXT)
-test_direct_sum_OBJECTS = $(am_test_direct_sum_OBJECTS)
-test_direct_sum_LDADD = $(LDADD)
-test_direct_sum_DEPENDENCIES = $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1)
-am_test_dyadic_to_rational_OBJECTS = \
- test-dyadic-to-rational.$(OBJEXT)
-test_dyadic_to_rational_OBJECTS = \
- $(am_test_dyadic_to_rational_OBJECTS)
-test_dyadic_to_rational_LDADD = $(LDADD)
-test_dyadic_to_rational_DEPENDENCIES = $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1)
-am_test_echelon_form_OBJECTS = test-echelon-form.$(OBJEXT)
-test_echelon_form_OBJECTS = $(am_test_echelon_form_OBJECTS)
-test_echelon_form_LDADD = $(LDADD)
-test_echelon_form_DEPENDENCIES = $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1)
-am_test_ffpack_OBJECTS = test-ffpack.$(OBJEXT)
-test_ffpack_OBJECTS = $(am_test_ffpack_OBJECTS)
-test_ffpack_LDADD = $(LDADD)
-test_ffpack_DEPENDENCIES = $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1)
-am_test_frobenius_OBJECTS = test-frobenius.$(OBJEXT)
-test_frobenius_OBJECTS = $(am_test_frobenius_OBJECTS)
-test_frobenius_LDADD = $(LDADD)
-test_frobenius_DEPENDENCIES = $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1)
-am_test_ftrmm_OBJECTS = test-ftrmm.$(OBJEXT)
-test_ftrmm_OBJECTS = $(am_test_ftrmm_OBJECTS)
-test_ftrmm_LDADD = $(LDADD)
-test_ftrmm_DEPENDENCIES = $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1)
-am_test_getentry_OBJECTS = test-getentry.$(OBJEXT)
-test_getentry_OBJECTS = $(am_test_getentry_OBJECTS)
-test_getentry_LDADD = $(LDADD)
-test_getentry_DEPENDENCIES = $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1)
-am_test_gf2_OBJECTS = test-gf2.$(OBJEXT)
-test_gf2_OBJECTS = $(am_test_gf2_OBJECTS)
-test_gf2_LDADD = $(LDADD)
-test_gf2_DEPENDENCIES = $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1)
-am_test_givaro_fields_OBJECTS = test-givaro-fields.$(OBJEXT)
-test_givaro_fields_OBJECTS = $(am_test_givaro_fields_OBJECTS)
-test_givaro_fields_LDADD = $(LDADD)
-test_givaro_fields_DEPENDENCIES = $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1)
-am_test_gmp_rational_OBJECTS = test-gmp-rational.$(OBJEXT)
-test_gmp_rational_OBJECTS = $(am_test_gmp_rational_OBJECTS)
-test_gmp_rational_LDADD = $(LDADD)
-test_gmp_rational_DEPENDENCIES = $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1)
-am_test_hilbert_OBJECTS = test-hilbert.$(OBJEXT)
-test_hilbert_OBJECTS = $(am_test_hilbert_OBJECTS)
-test_hilbert_LDADD = $(LDADD)
-test_hilbert_DEPENDENCIES = $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1)
-am_test_hom_OBJECTS = test-hom.$(OBJEXT)
-test_hom_OBJECTS = $(am_test_hom_OBJECTS)
-test_hom_LDADD = $(LDADD)
-test_hom_DEPENDENCIES = $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1)
-am_test_inverse_OBJECTS = test-inverse.$(OBJEXT)
-test_inverse_OBJECTS = $(am_test_inverse_OBJECTS)
-test_inverse_LDADD = $(LDADD)
-test_inverse_DEPENDENCIES = $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1)
-am_test_isposdef_OBJECTS = test-isposdef.$(OBJEXT)
-test_isposdef_OBJECTS = $(am_test_isposdef_OBJECTS)
-test_isposdef_LDADD = $(LDADD)
-test_isposdef_DEPENDENCIES = $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1)
-am_test_ispossemidef_OBJECTS = test-ispossemidef.$(OBJEXT)
-test_ispossemidef_OBJECTS = $(am_test_ispossemidef_OBJECTS)
-test_ispossemidef_LDADD = $(LDADD)
-test_ispossemidef_DEPENDENCIES = $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1)
-am_test_la_block_lanczos_OBJECTS = test-la-block-lanczos.$(OBJEXT)
-test_la_block_lanczos_OBJECTS = $(am_test_la_block_lanczos_OBJECTS)
-test_la_block_lanczos_LDADD = $(LDADD)
-test_la_block_lanczos_DEPENDENCIES = $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1)
-am_test_last_invariant_factor_OBJECTS = \
- test-last-invariant-factor.$(OBJEXT)
-test_last_invariant_factor_OBJECTS = \
- $(am_test_last_invariant_factor_OBJECTS)
-test_last_invariant_factor_LDADD = $(LDADD)
-test_last_invariant_factor_DEPENDENCIES = $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1)
-am_test_lidia_gfq_OBJECTS = test-lidia-gfq.$(OBJEXT)
-test_lidia_gfq_OBJECTS = $(am_test_lidia_gfq_OBJECTS)
-test_lidia_gfq_LDADD = $(LDADD)
-test_lidia_gfq_DEPENDENCIES = $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1)
-am_test_matrix_domain_OBJECTS = test-matrix-domain.$(OBJEXT)
-test_matrix_domain_OBJECTS = $(am_test_matrix_domain_OBJECTS)
-test_matrix_domain_LDADD = $(LDADD)
-test_matrix_domain_DEPENDENCIES = $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1)
-am_test_matrix_stream_OBJECTS = test-matrix-stream.$(OBJEXT)
-test_matrix_stream_OBJECTS = $(am_test_matrix_stream_OBJECTS)
-test_matrix_stream_LDADD = $(LDADD)
-test_matrix_stream_DEPENDENCIES = $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1)
-am_test_mg_block_lanczos_OBJECTS = test-mg-block-lanczos.$(OBJEXT)
-test_mg_block_lanczos_OBJECTS = $(am_test_mg_block_lanczos_OBJECTS)
-test_mg_block_lanczos_LDADD = $(LDADD)
-test_mg_block_lanczos_DEPENDENCIES = $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1)
-am_test_minpoly_OBJECTS = test-minpoly.$(OBJEXT)
-test_minpoly_OBJECTS = $(am_test_minpoly_OBJECTS)
-test_minpoly_LDADD = $(LDADD)
-test_minpoly_DEPENDENCIES = $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1)
-am_test_modular_OBJECTS = test-modular.$(OBJEXT)
-test_modular_OBJECTS = $(am_test_modular_OBJECTS)
-test_modular_LDADD = $(LDADD)
-test_modular_DEPENDENCIES = $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1)
-am_test_modular_balanced_double_OBJECTS = \
- test-modular-balanced-double.$(OBJEXT)
-test_modular_balanced_double_OBJECTS = \
- $(am_test_modular_balanced_double_OBJECTS)
-test_modular_balanced_double_LDADD = $(LDADD)
-test_modular_balanced_double_DEPENDENCIES = $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1)
-am_test_modular_balanced_float_OBJECTS = \
- test-modular-balanced-float.$(OBJEXT)
-test_modular_balanced_float_OBJECTS = \
- $(am_test_modular_balanced_float_OBJECTS)
-test_modular_balanced_float_LDADD = $(LDADD)
-test_modular_balanced_float_DEPENDENCIES = $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1)
-am_test_modular_balanced_int_OBJECTS = \
- test-modular-balanced-int.$(OBJEXT)
-test_modular_balanced_int_OBJECTS = \
- $(am_test_modular_balanced_int_OBJECTS)
-test_modular_balanced_int_LDADD = $(LDADD)
-test_modular_balanced_int_DEPENDENCIES = $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1)
-am_test_modular_byte_OBJECTS = test-modular-byte.$(OBJEXT)
-test_modular_byte_OBJECTS = $(am_test_modular_byte_OBJECTS)
-test_modular_byte_LDADD = $(LDADD)
-test_modular_byte_DEPENDENCIES = $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1)
-am_test_modular_double_OBJECTS = test-modular-double.$(OBJEXT)
-test_modular_double_OBJECTS = $(am_test_modular_double_OBJECTS)
-test_modular_double_LDADD = $(LDADD)
-test_modular_double_DEPENDENCIES = $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1)
-am_test_modular_float_OBJECTS = test-modular-float.$(OBJEXT)
-test_modular_float_OBJECTS = $(am_test_modular_float_OBJECTS)
-test_modular_float_LDADD = $(LDADD)
-test_modular_float_DEPENDENCIES = $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1)
-am_test_modular_int_OBJECTS = test-modular-int.$(OBJEXT)
-test_modular_int_OBJECTS = $(am_test_modular_int_OBJECTS)
-test_modular_int_LDADD = $(LDADD)
-test_modular_int_DEPENDENCIES = $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1)
-am_test_modular_short_OBJECTS = test-modular-short.$(OBJEXT)
-test_modular_short_OBJECTS = $(am_test_modular_short_OBJECTS)
-test_modular_short_LDADD = $(LDADD)
-test_modular_short_DEPENDENCIES = $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1)
-am_test_moore_penrose_OBJECTS = test-moore-penrose.$(OBJEXT)
-test_moore_penrose_OBJECTS = $(am_test_moore_penrose_OBJECTS)
-test_moore_penrose_LDADD = $(LDADD)
-test_moore_penrose_DEPENDENCIES = $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1)
-am_test_ntl_RR_OBJECTS = test-ntl-RR.$(OBJEXT)
-test_ntl_RR_OBJECTS = $(am_test_ntl_RR_OBJECTS)
-test_ntl_RR_LDADD = $(LDADD)
-test_ntl_RR_DEPENDENCIES = $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1)
-am_test_ntl_ZZ_p_OBJECTS = test-ntl-ZZ_p.$(OBJEXT)
-test_ntl_ZZ_p_OBJECTS = $(am_test_ntl_ZZ_p_OBJECTS)
-test_ntl_ZZ_p_LDADD = $(LDADD)
-test_ntl_ZZ_p_DEPENDENCIES = $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1)
-am_test_ntl_hankel_OBJECTS = test-ntl-hankel.$(OBJEXT)
-test_ntl_hankel_OBJECTS = $(am_test_ntl_hankel_OBJECTS)
-test_ntl_hankel_LDADD = $(LDADD)
-test_ntl_hankel_DEPENDENCIES = $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1)
-am_test_ntl_lzz_p_OBJECTS = test-ntl-lzz_p.$(OBJEXT)
-test_ntl_lzz_p_OBJECTS = $(am_test_ntl_lzz_p_OBJECTS)
-test_ntl_lzz_p_LDADD = $(LDADD)
-test_ntl_lzz_p_DEPENDENCIES = $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1)
-am_test_ntl_sylvester_OBJECTS = test-ntl-sylvester.$(OBJEXT)
-test_ntl_sylvester_OBJECTS = $(am_test_ntl_sylvester_OBJECTS)
-test_ntl_sylvester_LDADD = $(LDADD)
-test_ntl_sylvester_DEPENDENCIES = $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1)
-am_test_ntl_toeplitz_OBJECTS = test-ntl-toeplitz.$(OBJEXT)
-test_ntl_toeplitz_OBJECTS = $(am_test_ntl_toeplitz_OBJECTS)
-test_ntl_toeplitz_LDADD = $(LDADD)
-test_ntl_toeplitz_DEPENDENCIES = $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1)
-am_test_nullspace_OBJECTS = test-nullspace.$(OBJEXT)
-test_nullspace_OBJECTS = $(am_test_nullspace_OBJECTS)
-test_nullspace_LDADD = $(LDADD)
-test_nullspace_DEPENDENCIES = $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1)
-am_test_optimization_OBJECTS = test-optimization.$(OBJEXT)
-test_optimization_OBJECTS = $(am_test_optimization_OBJECTS)
-test_optimization_LDADD = $(LDADD)
-test_optimization_DEPENDENCIES = $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1)
-am_test_param_fuzzy_OBJECTS = test-param-fuzzy.$(OBJEXT)
-test_param_fuzzy_OBJECTS = $(am_test_param_fuzzy_OBJECTS)
-test_param_fuzzy_LDADD = $(LDADD)
-test_param_fuzzy_DEPENDENCIES = $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1)
-am_test_qlup_OBJECTS = test-qlup.$(OBJEXT)
-test_qlup_OBJECTS = $(am_test_qlup_OBJECTS)
-test_qlup_LDADD = $(LDADD)
-test_qlup_DEPENDENCIES = $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1)
-am_test_randiter_nonzero_OBJECTS = test-randiter-nonzero.$(OBJEXT)
-test_randiter_nonzero_OBJECTS = $(am_test_randiter_nonzero_OBJECTS)
-test_randiter_nonzero_LDADD = $(LDADD)
-test_randiter_nonzero_DEPENDENCIES = $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1)
-am_test_rank_OBJECTS = test-rank.$(OBJEXT)
-test_rank_OBJECTS = $(am_test_rank_OBJECTS)
-test_rank_LDADD = $(LDADD)
-test_rank_DEPENDENCIES = $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1)
-am_test_rat_charpoly_OBJECTS = test-rat-charpoly.$(OBJEXT)
-test_rat_charpoly_OBJECTS = $(am_test_rat_charpoly_OBJECTS)
-test_rat_charpoly_LDADD = $(LDADD)
-test_rat_charpoly_DEPENDENCIES = $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1)
-am_test_rat_minpoly_OBJECTS = test-rat-minpoly.$(OBJEXT)
-test_rat_minpoly_OBJECTS = $(am_test_rat_minpoly_OBJECTS)
-test_rat_minpoly_LDADD = $(LDADD)
-test_rat_minpoly_DEPENDENCIES = $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1)
-am_test_rat_solve_OBJECTS = test-rat-solve.$(OBJEXT)
-test_rat_solve_OBJECTS = $(am_test_rat_solve_OBJECTS)
-test_rat_solve_LDADD = $(LDADD)
-test_rat_solve_DEPENDENCIES = $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1)
-am_test_rational_matrix_factory_OBJECTS = \
- test-rational-matrix-factory.$(OBJEXT)
-test_rational_matrix_factory_OBJECTS = \
- $(am_test_rational_matrix_factory_OBJECTS)
-test_rational_matrix_factory_LDADD = $(LDADD)
-test_rational_matrix_factory_DEPENDENCIES = $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1)
-am_test_rational_reconstruction_base_OBJECTS = \
- test-rational-reconstruction-base.$(OBJEXT)
-test_rational_reconstruction_base_OBJECTS = \
- $(am_test_rational_reconstruction_base_OBJECTS)
-test_rational_reconstruction_base_LDADD = $(LDADD)
-test_rational_reconstruction_base_DEPENDENCIES = \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1)
-am_test_rational_solver_OBJECTS = test-rational-solver.$(OBJEXT)
-test_rational_solver_OBJECTS = $(am_test_rational_solver_OBJECTS)
-test_rational_solver_LDADD = $(LDADD)
-test_rational_solver_DEPENDENCIES = $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1)
-am_test_rational_solver_adaptive_OBJECTS = \
- test-rational-solver-adaptive.$(OBJEXT)
-test_rational_solver_adaptive_OBJECTS = \
- $(am_test_rational_solver_adaptive_OBJECTS)
-test_rational_solver_adaptive_LDADD = $(LDADD)
-test_rational_solver_adaptive_DEPENDENCIES = $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1)
-am_test_scalar_matrix_OBJECTS = test-scalar-matrix.$(OBJEXT)
-test_scalar_matrix_OBJECTS = $(am_test_scalar_matrix_OBJECTS)
-test_scalar_matrix_LDADD = $(LDADD)
-test_scalar_matrix_DEPENDENCIES = $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1)
-am_test_smith_form_OBJECTS = test-smith-form.$(OBJEXT)
-test_smith_form_OBJECTS = $(am_test_smith_form_OBJECTS)
-test_smith_form_LDADD = $(LDADD)
-test_smith_form_DEPENDENCIES = $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1)
-am_test_smith_form_adaptive_OBJECTS = \
- test-smith-form-adaptive.$(OBJEXT)
-test_smith_form_adaptive_OBJECTS = \
- $(am_test_smith_form_adaptive_OBJECTS)
-test_smith_form_adaptive_LDADD = $(LDADD)
-test_smith_form_adaptive_DEPENDENCIES = $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1)
-am_test_smith_form_binary_OBJECTS = test-smith-form-binary.$(OBJEXT)
-test_smith_form_binary_OBJECTS = $(am_test_smith_form_binary_OBJECTS)
-test_smith_form_binary_LDADD = $(LDADD)
-test_smith_form_binary_DEPENDENCIES = $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1)
-am_test_smith_form_iliopoulos_OBJECTS = \
- test-smith-form-iliopoulos.$(OBJEXT)
-test_smith_form_iliopoulos_OBJECTS = \
- $(am_test_smith_form_iliopoulos_OBJECTS)
-test_smith_form_iliopoulos_LDADD = $(LDADD)
-test_smith_form_iliopoulos_DEPENDENCIES = $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1)
-am_test_smith_form_local_OBJECTS = test-smith-form-local.$(OBJEXT)
-test_smith_form_local_OBJECTS = $(am_test_smith_form_local_OBJECTS)
-test_smith_form_local_LDADD = $(LDADD)
-test_smith_form_local_DEPENDENCIES = $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1)
-am_test_solve_OBJECTS = test-solve.$(OBJEXT)
-test_solve_OBJECTS = $(am_test_solve_OBJECTS)
-test_solve_LDADD = $(LDADD)
-test_solve_DEPENDENCIES = $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1)
-am_test_solve_nonsingular_OBJECTS = test-solve-nonsingular.$(OBJEXT)
-test_solve_nonsingular_OBJECTS = $(am_test_solve_nonsingular_OBJECTS)
-test_solve_nonsingular_LDADD = $(LDADD)
-test_solve_nonsingular_DEPENDENCIES = $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1)
-am_test_sparse_OBJECTS = test-sparse.$(OBJEXT)
-test_sparse_OBJECTS = $(am_test_sparse_OBJECTS)
-test_sparse_LDADD = $(LDADD)
-test_sparse_DEPENDENCIES = $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1)
-am_test_subiterator_OBJECTS = test-subiterator.$(OBJEXT)
-test_subiterator_OBJECTS = $(am_test_subiterator_OBJECTS)
-test_subiterator_LDADD = $(LDADD)
-test_subiterator_DEPENDENCIES = $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1)
-am_test_submatrix_OBJECTS = test-submatrix.$(OBJEXT)
-test_submatrix_OBJECTS = $(am_test_submatrix_OBJECTS)
-test_submatrix_LDADD = $(LDADD)
-test_submatrix_DEPENDENCIES = $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1)
-am_test_subvector_OBJECTS = test-subvector.$(OBJEXT)
-test_subvector_OBJECTS = $(am_test_subvector_OBJECTS)
-test_subvector_LDADD = $(LDADD)
-test_subvector_DEPENDENCIES = $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1)
-am_test_sum_OBJECTS = test-sum.$(OBJEXT)
-test_sum_OBJECTS = $(am_test_sum_OBJECTS)
-test_sum_LDADD = $(LDADD)
-test_sum_DEPENDENCIES = $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1)
-am_test_toeplitz_det_OBJECTS = test-toeplitz-det.$(OBJEXT)
-test_toeplitz_det_OBJECTS = $(am_test_toeplitz_det_OBJECTS)
-test_toeplitz_det_LDADD = $(LDADD)
-test_toeplitz_det_DEPENDENCIES = $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1)
-am_test_toom_cook_OBJECTS = test-toom-cook.$(OBJEXT)
-test_toom_cook_OBJECTS = $(am_test_toom_cook_OBJECTS)
-test_toom_cook_LDADD = $(LDADD)
-test_toom_cook_DEPENDENCIES = $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1)
-am_test_trace_OBJECTS = test-trace.$(OBJEXT)
-test_trace_OBJECTS = $(am_test_trace_OBJECTS)
-test_trace_LDADD = $(LDADD)
-test_trace_DEPENDENCIES = $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1)
-am_test_triplesbb_OBJECTS = test-triplesbb.$(OBJEXT)
-test_triplesbb_OBJECTS = $(am_test_triplesbb_OBJECTS)
-test_triplesbb_LDADD = $(LDADD)
-test_triplesbb_DEPENDENCIES = $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1)
-am_test_unparametric_field_OBJECTS = \
- test-unparametric-field.$(OBJEXT)
-test_unparametric_field_OBJECTS = \
- $(am_test_unparametric_field_OBJECTS)
-test_unparametric_field_LDADD = $(LDADD)
-test_unparametric_field_DEPENDENCIES = $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1)
-am_test_vector_domain_OBJECTS = test-vector-domain.$(OBJEXT)
-test_vector_domain_OBJECTS = $(am_test_vector_domain_OBJECTS)
-test_vector_domain_LDADD = $(LDADD)
-test_vector_domain_DEPENDENCIES = $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1)
-am_test_zero_one_OBJECTS = test-zero-one.$(OBJEXT)
-test_zero_one_OBJECTS = $(am_test_zero_one_OBJECTS)
-test_zero_one_LDADD = $(LDADD)
-test_zero_one_DEPENDENCIES = $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1)
-am_test_zo_OBJECTS = test-zo.$(OBJEXT)
-test_zo_OBJECTS = $(am_test_zo_OBJECTS)
-test_zo_LDADD = $(LDADD)
-test_zo_DEPENDENCIES = $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1)
-DEFAULT_INCLUDES = -I. at am__isrc@ -I$(top_builddir)
-depcomp =
-am__depfiles_maybe =
-CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
- $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
-LTCXXCOMPILE = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
- --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
- $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
-CXXLD = $(CXX)
-CXXLINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
- --mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \
- $(LDFLAGS) -o $@
-COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
- $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
-LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
- --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
- $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
-CCLD = $(CC)
-LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
- --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \
- $(LDFLAGS) -o $@
-SOURCES = $(benchmark_blas_domain_SOURCES) $(benchmark_fields_SOURCES) \
- $(test_PID_integer_SOURCES) $(test_bitonic_sort_SOURCES) \
- $(test_blackbox_block_container_SOURCES) \
- $(test_blas_domain_SOURCES) $(test_block_ring_SOURCES) \
- $(test_bmseq_SOURCES) $(test_butterfly_SOURCES) \
- $(test_charpoly_SOURCES) $(test_commentator_SOURCES) \
- $(test_companion_SOURCES) $(test_cra_SOURCES) \
- $(test_cradomain_SOURCES) $(test_dense_SOURCES) \
- $(test_dense_zero_one_SOURCES) $(test_det_SOURCES) \
- $(test_diagonal_SOURCES) $(test_dif_SOURCES) \
- $(test_direct_sum_SOURCES) $(test_dyadic_to_rational_SOURCES) \
- $(test_echelon_form_SOURCES) $(test_ffpack_SOURCES) \
- $(test_frobenius_SOURCES) $(test_ftrmm_SOURCES) \
- $(test_getentry_SOURCES) $(test_gf2_SOURCES) \
- $(test_givaro_fields_SOURCES) $(test_gmp_rational_SOURCES) \
- $(test_hilbert_SOURCES) $(test_hom_SOURCES) \
- $(test_inverse_SOURCES) $(test_isposdef_SOURCES) \
- $(test_ispossemidef_SOURCES) $(test_la_block_lanczos_SOURCES) \
- $(test_last_invariant_factor_SOURCES) \
- $(test_lidia_gfq_SOURCES) $(test_matrix_domain_SOURCES) \
- $(test_matrix_stream_SOURCES) $(test_mg_block_lanczos_SOURCES) \
- $(test_minpoly_SOURCES) $(test_modular_SOURCES) \
- $(test_modular_balanced_double_SOURCES) \
- $(test_modular_balanced_float_SOURCES) \
- $(test_modular_balanced_int_SOURCES) \
- $(test_modular_byte_SOURCES) $(test_modular_double_SOURCES) \
- $(test_modular_float_SOURCES) $(test_modular_int_SOURCES) \
- $(test_modular_short_SOURCES) $(test_moore_penrose_SOURCES) \
- $(test_ntl_RR_SOURCES) $(test_ntl_ZZ_p_SOURCES) \
- $(test_ntl_hankel_SOURCES) $(test_ntl_lzz_p_SOURCES) \
- $(test_ntl_sylvester_SOURCES) $(test_ntl_toeplitz_SOURCES) \
- $(test_nullspace_SOURCES) $(test_optimization_SOURCES) \
- $(test_param_fuzzy_SOURCES) $(test_qlup_SOURCES) \
- $(test_randiter_nonzero_SOURCES) $(test_rank_SOURCES) \
- $(test_rat_charpoly_SOURCES) $(test_rat_minpoly_SOURCES) \
- $(test_rat_solve_SOURCES) \
- $(test_rational_matrix_factory_SOURCES) \
- $(test_rational_reconstruction_base_SOURCES) \
- $(test_rational_solver_SOURCES) \
- $(test_rational_solver_adaptive_SOURCES) \
- $(test_scalar_matrix_SOURCES) $(test_smith_form_SOURCES) \
- $(test_smith_form_adaptive_SOURCES) \
- $(test_smith_form_binary_SOURCES) \
- $(test_smith_form_iliopoulos_SOURCES) \
- $(test_smith_form_local_SOURCES) $(test_solve_SOURCES) \
- $(test_solve_nonsingular_SOURCES) $(test_sparse_SOURCES) \
- $(test_subiterator_SOURCES) $(test_submatrix_SOURCES) \
- $(test_subvector_SOURCES) $(test_sum_SOURCES) \
- $(test_toeplitz_det_SOURCES) $(test_toom_cook_SOURCES) \
- $(test_trace_SOURCES) $(test_triplesbb_SOURCES) \
- $(test_unparametric_field_SOURCES) \
- $(test_vector_domain_SOURCES) $(test_zero_one_SOURCES) \
- $(test_zo_SOURCES)
-DIST_SOURCES = $(benchmark_blas_domain_SOURCES) \
- $(benchmark_fields_SOURCES) $(test_PID_integer_SOURCES) \
- $(test_bitonic_sort_SOURCES) \
- $(test_blackbox_block_container_SOURCES) \
- $(test_blas_domain_SOURCES) $(test_block_ring_SOURCES) \
- $(test_bmseq_SOURCES) $(test_butterfly_SOURCES) \
- $(test_charpoly_SOURCES) $(test_commentator_SOURCES) \
- $(test_companion_SOURCES) $(test_cra_SOURCES) \
- $(test_cradomain_SOURCES) $(test_dense_SOURCES) \
- $(test_dense_zero_one_SOURCES) $(test_det_SOURCES) \
- $(test_diagonal_SOURCES) $(test_dif_SOURCES) \
- $(test_direct_sum_SOURCES) $(test_dyadic_to_rational_SOURCES) \
- $(test_echelon_form_SOURCES) $(test_ffpack_SOURCES) \
- $(test_frobenius_SOURCES) $(test_ftrmm_SOURCES) \
- $(test_getentry_SOURCES) $(test_gf2_SOURCES) \
- $(test_givaro_fields_SOURCES) $(test_gmp_rational_SOURCES) \
- $(test_hilbert_SOURCES) $(test_hom_SOURCES) \
- $(test_inverse_SOURCES) $(test_isposdef_SOURCES) \
- $(test_ispossemidef_SOURCES) $(test_la_block_lanczos_SOURCES) \
- $(test_last_invariant_factor_SOURCES) \
- $(test_lidia_gfq_SOURCES) $(test_matrix_domain_SOURCES) \
- $(test_matrix_stream_SOURCES) $(test_mg_block_lanczos_SOURCES) \
- $(test_minpoly_SOURCES) $(test_modular_SOURCES) \
- $(test_modular_balanced_double_SOURCES) \
- $(test_modular_balanced_float_SOURCES) \
- $(test_modular_balanced_int_SOURCES) \
- $(test_modular_byte_SOURCES) $(test_modular_double_SOURCES) \
- $(test_modular_float_SOURCES) $(test_modular_int_SOURCES) \
- $(test_modular_short_SOURCES) $(test_moore_penrose_SOURCES) \
- $(test_ntl_RR_SOURCES) $(test_ntl_ZZ_p_SOURCES) \
- $(test_ntl_hankel_SOURCES) $(test_ntl_lzz_p_SOURCES) \
- $(test_ntl_sylvester_SOURCES) $(test_ntl_toeplitz_SOURCES) \
- $(test_nullspace_SOURCES) $(test_optimization_SOURCES) \
- $(test_param_fuzzy_SOURCES) $(test_qlup_SOURCES) \
- $(test_randiter_nonzero_SOURCES) $(test_rank_SOURCES) \
- $(test_rat_charpoly_SOURCES) $(test_rat_minpoly_SOURCES) \
- $(test_rat_solve_SOURCES) \
- $(test_rational_matrix_factory_SOURCES) \
- $(test_rational_reconstruction_base_SOURCES) \
- $(test_rational_solver_SOURCES) \
- $(test_rational_solver_adaptive_SOURCES) \
- $(test_scalar_matrix_SOURCES) $(test_smith_form_SOURCES) \
- $(test_smith_form_adaptive_SOURCES) \
- $(test_smith_form_binary_SOURCES) \
- $(test_smith_form_iliopoulos_SOURCES) \
- $(test_smith_form_local_SOURCES) $(test_solve_SOURCES) \
- $(test_solve_nonsingular_SOURCES) $(test_sparse_SOURCES) \
- $(test_subiterator_SOURCES) $(test_submatrix_SOURCES) \
- $(test_subvector_SOURCES) $(test_sum_SOURCES) \
- $(test_toeplitz_det_SOURCES) $(test_toom_cook_SOURCES) \
- $(test_trace_SOURCES) $(test_triplesbb_SOURCES) \
- $(test_unparametric_field_SOURCES) \
- $(test_vector_domain_SOURCES) $(test_zero_one_SOURCES) \
- $(test_zo_SOURCES)
-RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \
- html-recursive info-recursive install-data-recursive \
- install-dvi-recursive install-exec-recursive \
- install-html-recursive install-info-recursive \
- install-pdf-recursive install-ps-recursive install-recursive \
- installcheck-recursive installdirs-recursive pdf-recursive \
- ps-recursive uninstall-recursive
-am__can_run_installinfo = \
- case $$AM_UPDATE_INFO_DIR in \
- n|no|NO) false;; \
- *) (install-info --version) >/dev/null 2>&1;; \
- esac
-RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \
- distclean-recursive maintainer-clean-recursive
-AM_RECURSIVE_TARGETS = $(RECURSIVE_TARGETS:-recursive=) \
- $(RECURSIVE_CLEAN_TARGETS:-recursive=) tags TAGS ctags CTAGS \
- distdir
-ETAGS = etags
-CTAGS = ctags
-am__tty_colors = \
-red=; grn=; lgn=; blu=; std=
- at LINBOX_HAVE_GIVARO_TRUE@am__EXEEXT_13 = $(am__EXEEXT_2)
- at LINBOX_HAVE_NTL_TRUE@am__EXEEXT_14 = $(am__EXEEXT_3)
- at LINBOX_HAVE_LIDIA_TRUE@am__EXEEXT_15 = $(am__EXEEXT_5)
-am__EXEEXT_16 =
-am__EXEEXT_17 = $(am__EXEEXT_4)
-DIST_SUBDIRS = $(SUBDIRS)
-DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
-am__relativize = \
- dir0=`pwd`; \
- sed_first='s,^\([^/]*\)/.*$$,\1,'; \
- sed_rest='s,^[^/]*/*,,'; \
- sed_last='s,^.*/\([^/]*\)$$,\1,'; \
- sed_butlast='s,/*[^/]*$$,,'; \
- while test -n "$$dir1"; do \
- first=`echo "$$dir1" | sed -e "$$sed_first"`; \
- if test "$$first" != "."; then \
- if test "$$first" = ".."; then \
- dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \
- dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \
- else \
- first2=`echo "$$dir2" | sed -e "$$sed_first"`; \
- if test "$$first2" = "$$first"; then \
- dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \
- else \
- dir2="../$$dir2"; \
- fi; \
- dir0="$$dir0"/"$$first"; \
- fi; \
- fi; \
- dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \
- done; \
- reldir="$$dir2"
-ACLOCAL = @ACLOCAL@
-AMTAR = @AMTAR@
-AR = @AR@
-AUTOCONF = @AUTOCONF@
-AUTOHEADER = @AUTOHEADER@
-AUTOMAKE = @AUTOMAKE@
-AWK = @AWK@
-BLAS_CFLAGS = @BLAS_CFLAGS@
-BLAS_LIBS = @BLAS_LIBS@
-CC = @CC@
-CCNAM = @CCNAM@
-CFLAGS = @CFLAGS@
-CPPFLAGS = @CPPFLAGS@
-CXX = @CXX@
-CXXCPP = @CXXCPP@
-CXXFLAGS = @CXXFLAGS@
-CYGPATH_W = @CYGPATH_W@
-DBG = @DBG@
-DEBUG_CFLAGS = @DEBUG_CFLAGS@
-DEFAULT_CFLAGS = @DEFAULT_CFLAGS@
-DEFS = @DEFS@
-DLLTOOL = @DLLTOOL@
-DSYMUTIL = @DSYMUTIL@
-DUMPBIN = @DUMPBIN@
-ECHO_C = @ECHO_C@
-ECHO_N = @ECHO_N@
-ECHO_T = @ECHO_T@
-EGREP = @EGREP@
-EXEEXT = @EXEEXT@
-EXPAT_CFLAGS = @EXPAT_CFLAGS@
-EXPAT_LIBS = @EXPAT_LIBS@
-FFLAS_FFPACK_CFLAGS = @FFLAS_FFPACK_CFLAGS@
-FFLAS_FFPACK_LIBS = @FFLAS_FFPACK_LIBS@
-FFLAS_FFPACK_LOC = @FFLAS_FFPACK_LOC@
-FGREP = @FGREP@
-FPLLL_CFLAGS = @FPLLL_CFLAGS@
-FPLLL_LIBS = @FPLLL_LIBS@
-GIVARO_CFLAGS = @GIVARO_CFLAGS@
-GIVARO_LIBS = @GIVARO_LIBS@
-GMP_CFLAGS = @GMP_CFLAGS@
-GMP_LIBS = @GMP_LIBS@
-GMP_VERSION = @GMP_VERSION@
-GREP = @GREP@
-IML_CFLAGS = @IML_CFLAGS@
-IML_LIBS = @IML_LIBS@
-INSTALL = @INSTALL@
-INSTALL_DATA = @INSTALL_DATA@
-INSTALL_PROGRAM = @INSTALL_PROGRAM@
-INSTALL_SCRIPT = @INSTALL_SCRIPT@
-INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
-LD = @LD@
-LDFLAGS = @LDFLAGS@
-LIBOBJS = @LIBOBJS@
-LIBS = @LIBS@
-LIBTOOL = @LIBTOOL@
-LIDIA_CFLAGS = @LIDIA_CFLAGS@
-LIDIA_LIBS = @LIDIA_LIBS@
-LINBOX_BENCH_PATH = @LINBOX_BENCH_PATH@
-LINBOX_DOC_PATH = @LINBOX_DOC_PATH@
-LIPO = @LIPO@
-LN_S = @LN_S@
-LTLIBOBJS = @LTLIBOBJS@
-M4RIE_CFLAGS = @M4RIE_CFLAGS@
-M4RIE_LIBS = @M4RIE_LIBS@
-M4RI_CFLAGS = @M4RI_CFLAGS@
-M4RI_LIBS = @M4RI_LIBS@
-MAINT = @MAINT@
-MAKEINFO = @MAKEINFO@
-MANIFEST_TOOL = @MANIFEST_TOOL@
-MAPLE_CFLAGS = @MAPLE_CFLAGS@
-MAPLE_HOME = @MAPLE_HOME@
-MAPLE_LIBS = @MAPLE_LIBS@
-MAPLE_VERSION = @MAPLE_VERSION@
-MKDIR_P = @MKDIR_P@
-MPFR_CFLAGS = @MPFR_CFLAGS@
-MPFR_LIBS = @MPFR_LIBS@
-NM = @NM@
-NMEDIT = @NMEDIT@
-NTL_CFLAGS = @NTL_CFLAGS@
-NTL_LIBS = @NTL_LIBS@
-OBJDUMP = @OBJDUMP@
-OBJEXT = @OBJEXT@
-OTOOL = @OTOOL@
-OTOOL64 = @OTOOL64@
-PACKAGE = @PACKAGE@
-PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
-PACKAGE_NAME = @PACKAGE_NAME@
-PACKAGE_STRING = @PACKAGE_STRING@
-PACKAGE_TARNAME = @PACKAGE_TARNAME@
-PACKAGE_URL = @PACKAGE_URL@
-PACKAGE_VERSION = @PACKAGE_VERSION@
-PATH_SEPARATOR = @PATH_SEPARATOR@
-PROF = @PROF@
-RANLIB = @RANLIB@
-RM = @RM@
-SACLIB_CFLAGS = @SACLIB_CFLAGS@
-SACLIB_LIBS = @SACLIB_LIBS@
-SED = @SED@
-SET_MAKE = @SET_MAKE@
-SHELL = @SHELL@
-STRIP = @STRIP@
-TESTS_CFLAGS = @TESTS_CFLAGS@
-VERSION = @VERSION@
-WARN = @WARN@
-abs_builddir = @abs_builddir@
-abs_srcdir = @abs_srcdir@
-abs_top_builddir = @abs_top_builddir@
-abs_top_srcdir = @abs_top_srcdir@
-ac_ct_AR = @ac_ct_AR@
-ac_ct_CC = @ac_ct_CC@
-ac_ct_CXX = @ac_ct_CXX@
-ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
-am__leading_dot = @am__leading_dot@
-am__tar = @am__tar@
-am__untar = @am__untar@
-bindir = @bindir@
-build = @build@
-build_alias = @build_alias@
-build_cpu = @build_cpu@
-build_os = @build_os@
-build_vendor = @build_vendor@
-builddir = @builddir@
-datadir = @datadir@
-datarootdir = @datarootdir@
-docdir = @docdir@
-dvidir = @dvidir@
-exec_prefix = @exec_prefix@
-host = @host@
-host_alias = @host_alias@
-host_cpu = @host_cpu@
-host_os = @host_os@
-host_vendor = @host_vendor@
-htmldir = @htmldir@
-includedir = @includedir@
-infodir = @infodir@
-install_sh = @install_sh@
-libdir = @libdir@
-libexecdir = @libexecdir@
-localedir = @localedir@
-localstatedir = @localstatedir@
-mandir = @mandir@
-mkdir_p = @mkdir_p@
-oldincludedir = @oldincludedir@
-pdfdir = @pdfdir@
-prefix = @prefix@
-program_transform_name = @program_transform_name@
-psdir = @psdir@
-sbindir = @sbindir@
-sharedstatedir = @sharedstatedir@
-srcdir = @srcdir@
-sysconfdir = @sysconfdir@
-target_alias = @target_alias@
-top_build_prefix = @top_build_prefix@
-top_builddir = @top_builddir@
-top_srcdir = @top_srcdir@
-AM_CPPFLAGS = -I$(top_srcdir) -I$(top_srcdir)/linbox $(CBLAS_FLAG) \
- $(FFLAS_FFPACK_CFLAGS) $(GMP_CFLAGS) $(NTL_CFLAGS) \
- $(GIVARO_CFLAGS) $(LIDIA_CFLAGS) $(IML_CFLAGS)
-# AM_LDFLAGS = -llapack -lcblas -latlas
-AM_LDFLAGS = $(top_srcdir)/linbox/.libs/liblinbox.a
-# SAFER_FLAGS = -g -Wall -Wextra -Wno-unused-parameter
-# bds: no need to optimize for unit/regression tests, and opt adds a lot to compilation time
-#AM_CXXFLAGS = @TESTS_CFLAGS@ -DLinBoxSrcOnly
-# AM_CXXFLAGS = $(SAFER_FLAGS) -DLinBoxSrcOnly
-#AM_CXXFLAGS = $(SAFER_FLAGS) -DLinBoxSrcOnly -O2
-# AM_CXXFLAGS = -g -DLinBoxSrcOnly -Wall -DDEBUG -O0
-AM_CXXFLAGS = -DLinBoxSrcOnly @TESTS_CFLAGS@ @DEBUG_CFLAGS@
-# AM_CXXFLAGS = -g -DLinBoxSrcOnly -Wall -D__LINBOX_HAVE_DGETRF -D__LINBOX_HAVE_DGETRI
-# AM_CFLAGS = -g -Wall
-SUBDIRS = data matrix
-LDADD = $(GIVARO_LIBS) $(BLAS_LIBS) $(NTL_LIBS) $(GMP_LIBS) $(LIDIA_LIBS) $(MPFR_LIBS) $(FPLLL_LIBS) $(IML_LIBS) $(LDFLAGS)
-# AM_LDFLAGS+=-static -Wl,-rpath -Wl,$(GIVARO_LIBS)
-EXTRA_DIST = \
- test-common.C \
- tests.doxy \
- checker.C
-
-
-# test-generic-for-quad.h
-
-# Put an entry for your test-mycomponent.C here (or in one of the other test groups).
-# Don't forget to add a test_mycomponent_SOURCES entry below.
-#
-# Once present, tests should remain present, being moved from one group to another.
-# Note that among the available groups are NONCOMPILING_TESTS and FAILING_TESTS, which
-# will be ignored by "make check" and can be temporary storage for problematic tests.
-BASIC_TESTS = \
- test-commentator \
- test-det \
- test-frobenius \
- test-rank \
- test-solve \
- test-nullspace \
- test-smith-form-binary \
- test-rational-solver \
- test-rational-solver-adaptive \
- test-charpoly \
- test-cra
-
-FULLCHECK_TESTS = \
- test-bitonic-sort \
- test-blackbox-block-container \
- test-blas-domain \
- test-butterfly \
- test-companion \
- test-dense \
- test-diagonal \
- test-dif \
- test-direct-sum \
- test-echelon-form \
- test-ffpack \
- test-getentry \
- test-gf2 \
- test-gmp-rational \
- test-hilbert \
- test-hom \
- test-inverse \
- test-isposdef \
- test-ispossemidef \
- test-matrix-domain \
- test-matrix-stream \
- test-minpoly \
- test-modular \
- test-modular-balanced-int \
- test-modular-balanced-float \
- test-modular-balanced-double \
- test-modular-byte \
- test-modular-double \
- test-modular-float \
- test-modular-int \
- test-modular-short \
- test-block-ring \
- test-PID-integer \
- test-moore-penrose \
- test-randiter-nonzero \
- test-rational-matrix-factory \
- test-scalar-matrix \
- test-solve-nonsingular \
- test-sparse \
- test-subiterator \
- test-submatrix \
- test-subvector \
- test-sum \
- test-trace \
- test-triplesbb \
- test-vector-domain \
- test-qlup \
- test-zero-one \
- test-last-invariant-factor \
- test-cradomain \
- test-rational-reconstruction-base
-
-
-# test-integer-tools
-
-# tests of components not adhering to LinBox requirements.
-NONCOMPLIANT_TESTS = \
- test-ntl-RR \
- test-param-fuzzy
-
-
-#These need clapack
-#test-rational-solver-adaptive
-DUBIOUS_TESTS = \
- test-unparametric-field \
- test-bmseq \
- test-zo
-
-# test-quad-matrix
-NONCOMPILING_TESTS = \
- test-dense-zero-one
-
-FAILING_TESTS = \
- test-rat-charpoly \
- test-rat-solve \
- test-rat-minpoly \
- test-smith-form-local \
- test-smith-form-adaptive \
- test-dyadic-to-rational \
- test-mg-block-lanczos \
- test-ftrmm \
- test-la-block-lanczos
-
-USE_NONCOMPILING_TESTS =
-USE_FAILING_TESTS =
-# comment out these two lines to avoid facing reality
-#USE_NONCOMPILING_TESTS += $(NONCOMPILING_TESTS)
-#USE_FAILING_TESTS += $(FAILING_TESTS)
-
-# a benchmarker, not to be included in check.
-BENCHMARKS = \
- benchmark-fields \
- benchmark-blas-domain
-
-
-# historical tests, no longer in use
-# test-nag-sparse replaced by tripplesbb
-# test-lsp lsp.h superceded by factorized-matrix.h
-# removed test
-# test-nag-sparse
-# test-image-field replaced by hom
-# test-lsp
-# I put test-gssv_rank in hmrg:~saunders/gen_superlu. It is not linbox until and unless it is made to work
-# test-gssv is an ntl test
-
-# no explicit test needed, I guess...
-# Transpose is tested in test-triplesbb
-# Compose is tested in test-butterfly
-GIVARO_TESTS = \
- test-givaro-fields
-
-NTL_TESTS = \
- test-smith-form \
- test-ntl-lzz_p \
- test-ntl-ZZ_p \
- test-ntl-toeplitz \
- test-ntl-hankel \
- test-ntl-sylvester \
- test-smith-form-iliopoulos \
- test-toeplitz-det
-
-LIDIA_TESTS = \
- test-lidia-gfq
-
-ATLAS_TESTS = \
- test-optimization
-
-BLAS3_UNIT_TESTS = \
- test-toom-cook
-
- at LINBOX_HAVE_NTL_TRUE@USE_NTL_TESTS = $(NTL_TESTS)
- at LINBOX_HAVE_GIVARO_TRUE@USE_GIVARO_TESTS = $(GIVARO_TESTS)
- at LINBOX_HAVE_LIDIA_TRUE@USE_LIDIA_TESTS = $(LIDIA_TESTS)
-USE_ATLAS_TESTS = $(ATLAS_TESTS)
-test_commentator_SOURCES = \
- test-commentator.C \
- test-common.h
-
-test_modular_SOURCES = \
- test-modular.C \
- test-generic.h \
- test-common.h
-
-test_blackbox_block_container_SOURCES = \
- test-blackbox-block-container.C \
- test-common.h
-
-test_solve_nonsingular_SOURCES = \
- test-solve-nonsingular.C \
- test-common.h
-
-test_block_ring_SOURCES = \
- test-block-ring.C \
- test-field.h \
- test-common.h
-
-test_PID_integer_SOURCES = \
- test-PID-integer.C \
- test-field.h \
- test-common.h
-
-test_hom_SOURCES = \
- test-hom.C \
- test-generic.h \
- test-common.h
-
-test_gf2_SOURCES = \
- test-gf2.C \
- test-generic.h \
- test-common.h
-
-test_gmp_rational_SOURCES = \
- test-gmp-rational.C \
- test-generic.h \
- test-common.h
-
-test_unparametric_field_SOURCES = \
- test-unparametric-field.C \
- test-generic.h \
- test-common.h
-
-test_randiter_nonzero_SOURCES = \
- test-randiter-nonzero.C \
- test-common.h
-
-test_rational_matrix_factory_SOURCES = \
- test-rational-matrix-factory.C \
- test-common.h
-
-test_rational_reconstruction_base_SOURCES = \
- test-rational-reconstruction-base.C \
- test-common.h
-
-test_rat_solve_SOURCES = \
- test-rat-solve.C \
- test-common.h
-
-test_rat_charpoly_SOURCES = \
- test-rat-charpoly.C \
- test-common.h
-
-test_rat_minpoly_SOURCES = \
- test-rat-minpoly.C \
- test-common.h
-
-test_subiterator_SOURCES = \
- test-subiterator.C \
- test-common.h
-
-test_subvector_SOURCES = \
- test-subvector.C \
- test-common.h
-
-test_vector_domain_SOURCES = \
- test-vector-domain.C \
- test-vector-domain.h
-
-test_matrix_domain_SOURCES = \
- test-matrix-domain.C \
- test-common.h
-
-test_dense_SOURCES = \
- test-dense.C \
- test-common.h
-
-test_sparse_SOURCES = \
- test-sparse.C \
- test-common.h
-
-test_submatrix_SOURCES = \
- test-submatrix.C \
- test-common.h
-
-test_scalar_matrix_SOURCES = \
- test-scalar-matrix.C \
- test-generic.h \
- test-common.h
-
-test_bmseq_SOURCES = \
- test-bmseq.C \
- test-common.h
-
-test_butterfly_SOURCES = \
- test-vector-domain.h \
- test-blackbox.h \
- test-butterfly.C \
- test-generic.h \
- test-common.h
-
-test_charpoly_SOURCES = \
- test-charpoly.C \
- test-common.h
-
-test_diagonal_SOURCES = \
- test-diagonal.C \
- test-generic.h \
- test-common.h
-
-test_sum_SOURCES = \
- test-sum.C \
- test-generic.h \
- test-common.h
-
-test_dif_SOURCES = \
- test-dif.C test-generic.h \
- test-common.h
-
-test_triplesbb_SOURCES = \
- test-triplesbb.C \
- test-generic.h \
- test-common.h
-
-test_hilbert_SOURCES = \
- test-hilbert.C test-generic.h \
- test-common.h
-
-test_ntl_toeplitz_SOURCES = \
- test-ntl-toeplitz.C \
- test-common.h
-
-test_ntl_hankel_SOURCES = \
- test-ntl-hankel.C \
- test-common.h
-
-test_ntl_sylvester_SOURCES = \
- test-ntl-sylvester.C \
- test-common.h
-
-test_toeplitz_det_SOURCES = \
- test-toeplitz-det.C
-
-test_trace_SOURCES = \
- test-trace.C \
- test-common.h
-
-test_getentry_SOURCES = \
- test-getentry.C \
- test-common.h
-
-test_minpoly_SOURCES = \
- test-minpoly.C \
- test-common.h
-
-test_det_SOURCES = \
- test-det.C \
- test-common.h
-
-test_rank_SOURCES = \
- test-rank.C \
- test-common.h
-
-test_qlup_SOURCES = \
- test-qlup.C \
- test-common.h
-
-test_solve_SOURCES = \
- test-solve.C \
- test-common.h
-
-test_direct_sum_SOURCES = \
- test-direct-sum.C \
- test-generic.h \
- test-common.h
-
-test_echelon_form_SOURCES = \
- test-echelon-form.C \
- test-common.h
-
-test_frobenius_SOURCES = \
- test-frobenius.C \
- test-generic.h \
- test-common.h
-
-test_companion_SOURCES = \
- test-companion.C \
- test-generic.h \
- test-common.h
-
-test_inverse_SOURCES = \
- test-inverse.C \
- test-common.h
-
-test_moore_penrose_SOURCES = \
- test-moore-penrose.C \
- test-common.h
-
-test_ntl_RR_SOURCES = \
- test-ntl-RR.C \
- test-generic.h \
- test-common.h
-
-test_ntl_ZZ_p_SOURCES = \
- test-ntl-ZZ_p.C \
- test-generic.h \
- test-common.h
-
-test_ntl_lzz_p_SOURCES = \
- test-ntl-lzz_p.C \
- test-generic.h \
- test-common.h
-
-test_givaro_fields_SOURCES = \
- test-givaro-fields.C \
- test-generic.h \
- test-common.h
-
-test_lidia_gfq_SOURCES = \
- test-lidia-gfq.C \
- test-generic.h \
- test-common.h
-
-test_param_fuzzy_SOURCES = \
- test-param-fuzzy.C \
- test-generic.h \
- test-common.h
-
-
-# test_quad_matrix_SOURCES = \
-# test-quad-matrix.C \
-# test-generic-for-quad.h \
-# test-generic.h \
-# test-common.h
-test_zo_SOURCES = \
- test-zo.C \
- test-generic.h \
- test-common.h
-
-test_zero_one_SOURCES = \
- test-zero-one.C \
- test-generic.h \
- test-common.h
-
-test_modular_int_SOURCES = \
- test-modular-int.C \
- test-common.h
-
-test_modular_short_SOURCES = \
- test-modular-short.C \
- test-generic.h \
- test-common.h
-
-test_modular_double_SOURCES = \
- test-modular-double.C \
- test-generic.h \
- test-common.h
-
-test_modular_float_SOURCES = \
- test-modular-float.C \
- test-generic.h \
- test-common.h
-
-test_modular_byte_SOURCES = \
- test-modular-byte.C \
- test-generic.h \
- test-common.h
-
-test_modular_balanced_int_SOURCES = \
- test-modular-balanced-int.C \
- test-generic.h \
- test-common.h
-
-test_modular_balanced_double_SOURCES = \
- test-modular-balanced-double.C \
- test-generic.h \
- test-common.h
-
-test_modular_balanced_float_SOURCES = \
- test-modular-balanced-float.C \
- test-generic.h \
- test-common.h
-
-test_smith_form_iliopoulos_SOURCES = \
- test-common.h \
- test-smith-form-iliopoulos.C
-
-test_smith_form_binary_SOURCES = \
- test-common.h \
- test-smith-form-binary.C
-
-test_smith_form_SOURCES = \
- test-common.h \
- test-smith-form.C
-
-test_last_invariant_factor_SOURCES = \
- test-common.h \
- test-last-invariant-factor.C
-
-test_smith_form_local_SOURCES = \
- test-common.h \
- test-smith-form-local.C
-
-test_optimization_SOURCES = \
- test-common.h \
- test-optimization.C
-
-test_nullspace_SOURCES = \
- test-common.h \
- test-nullspace.C
-
-test_bitonic_sort_SOURCES = \
- test-common.h \
- test-bitonic-sort.C
-
-test_rational_solver_SOURCES = \
- test-common.h \
- test-rational-solver.C
-
-test_blas_domain_SOURCES = \
- test-common.h \
- test-blas-domain.C
-
-test_ffpack_SOURCES = \
- test-common.h \
- test-ffpack.C
-
-test_matrix_stream_SOURCES = \
- test-matrix-stream.C
-
-test_la_block_lanczos_SOURCES = \
- test-la-block-lanczos.C
-
-test_mg_block_lanczos_SOURCES = \
- test-mg-block-lanczos.C
-
-test_rational_solver_adaptive_SOURCES = \
- test-rational-solver-adaptive.C \
- test-common.h
-
-test_dyadic_to_rational_SOURCES = \
- test-dyadic-to-rational.C \
- test-common.h
-
-test_cra_SOURCES = \
- test-cra.C \
- test-common.h
-
-test_cradomain_SOURCES = \
- test-cradomain.C \
- test-common.h
-
-
-# NTL test
-test_smith_form_adaptive_SOURCES = \
- test-common.h \
- test-smith-form-adaptive.C
-
-benchmark_fields_SOURCES = \
- test-common.h \
- benchmark-fields.C
-
-benchmark_blas_domain_SOURCES = \
- test-common.h \
- benchmark-blas-domain.C
-
-test_isposdef_SOURCES = \
- test-common.h \
- test-isposdef.C
-
-test_dense_zero_one_SOURCES = \
- test-blackbox.h \
- test-dense-zero-one.C
-
-test_ispossemidef_SOURCES = \
- test-common.h \
- test-ispossemidef.C
-
-test_ftrmm_SOURCES = \
- test-ftrmm.C
-
-test_toom_cook_SOURCES = test-toom-cook.C
-CLEANFILES = checker \
- $(TESTS) \
- $(BASIC_TESTS) \
- $(FAILING_TESTS) \
- $(NONCOMPLIANT_TESTS) \
- $(BENCHMARKS) \
- $(DUBIOUS_TESTS) \
- $(FULLCHECK_TESTS) \
- $(NTL_TESTS) \
- $(GIVARO_TESTS) \
- $(ATLAS_TESTS)
-
-all: all-recursive
-
-.SUFFIXES:
-.SUFFIXES: .C .lo .o .obj
-$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps)
- @for dep in $?; do \
- case '$(am__configure_deps)' in \
- *$$dep*) \
- ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
- && { if test -f $@; then exit 0; else break; fi; }; \
- exit 1;; \
- esac; \
- done; \
- echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu --ignore-deps tests/Makefile'; \
- $(am__cd) $(top_srcdir) && \
- $(AUTOMAKE) --gnu --ignore-deps tests/Makefile
-.PRECIOUS: Makefile
-Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
- @case '$?' in \
- *config.status*) \
- cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
- *) \
- echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
- cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
- esac;
-
-$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
- cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-
-$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
- cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
- cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-$(am__aclocal_m4_deps):
-benchmark-blas-domain$(EXEEXT): $(benchmark_blas_domain_OBJECTS) $(benchmark_blas_domain_DEPENDENCIES) $(EXTRA_benchmark_blas_domain_DEPENDENCIES)
- @rm -f benchmark-blas-domain$(EXEEXT)
- $(CXXLINK) $(benchmark_blas_domain_OBJECTS) $(benchmark_blas_domain_LDADD) $(LIBS)
-benchmark-fields$(EXEEXT): $(benchmark_fields_OBJECTS) $(benchmark_fields_DEPENDENCIES) $(EXTRA_benchmark_fields_DEPENDENCIES)
- @rm -f benchmark-fields$(EXEEXT)
- $(CXXLINK) $(benchmark_fields_OBJECTS) $(benchmark_fields_LDADD) $(LIBS)
-test-PID-integer$(EXEEXT): $(test_PID_integer_OBJECTS) $(test_PID_integer_DEPENDENCIES) $(EXTRA_test_PID_integer_DEPENDENCIES)
- @rm -f test-PID-integer$(EXEEXT)
- $(CXXLINK) $(test_PID_integer_OBJECTS) $(test_PID_integer_LDADD) $(LIBS)
-test-bitonic-sort$(EXEEXT): $(test_bitonic_sort_OBJECTS) $(test_bitonic_sort_DEPENDENCIES) $(EXTRA_test_bitonic_sort_DEPENDENCIES)
- @rm -f test-bitonic-sort$(EXEEXT)
- $(CXXLINK) $(test_bitonic_sort_OBJECTS) $(test_bitonic_sort_LDADD) $(LIBS)
-test-blackbox-block-container$(EXEEXT): $(test_blackbox_block_container_OBJECTS) $(test_blackbox_block_container_DEPENDENCIES) $(EXTRA_test_blackbox_block_container_DEPENDENCIES)
- @rm -f test-blackbox-block-container$(EXEEXT)
- $(CXXLINK) $(test_blackbox_block_container_OBJECTS) $(test_blackbox_block_container_LDADD) $(LIBS)
-test-blas-domain$(EXEEXT): $(test_blas_domain_OBJECTS) $(test_blas_domain_DEPENDENCIES) $(EXTRA_test_blas_domain_DEPENDENCIES)
- @rm -f test-blas-domain$(EXEEXT)
- $(CXXLINK) $(test_blas_domain_OBJECTS) $(test_blas_domain_LDADD) $(LIBS)
-test-block-ring$(EXEEXT): $(test_block_ring_OBJECTS) $(test_block_ring_DEPENDENCIES) $(EXTRA_test_block_ring_DEPENDENCIES)
- @rm -f test-block-ring$(EXEEXT)
- $(CXXLINK) $(test_block_ring_OBJECTS) $(test_block_ring_LDADD) $(LIBS)
-test-bmseq$(EXEEXT): $(test_bmseq_OBJECTS) $(test_bmseq_DEPENDENCIES) $(EXTRA_test_bmseq_DEPENDENCIES)
- @rm -f test-bmseq$(EXEEXT)
- $(CXXLINK) $(test_bmseq_OBJECTS) $(test_bmseq_LDADD) $(LIBS)
-test-butterfly$(EXEEXT): $(test_butterfly_OBJECTS) $(test_butterfly_DEPENDENCIES) $(EXTRA_test_butterfly_DEPENDENCIES)
- @rm -f test-butterfly$(EXEEXT)
- $(CXXLINK) $(test_butterfly_OBJECTS) $(test_butterfly_LDADD) $(LIBS)
-test-charpoly$(EXEEXT): $(test_charpoly_OBJECTS) $(test_charpoly_DEPENDENCIES) $(EXTRA_test_charpoly_DEPENDENCIES)
- @rm -f test-charpoly$(EXEEXT)
- $(CXXLINK) $(test_charpoly_OBJECTS) $(test_charpoly_LDADD) $(LIBS)
-test-commentator$(EXEEXT): $(test_commentator_OBJECTS) $(test_commentator_DEPENDENCIES) $(EXTRA_test_commentator_DEPENDENCIES)
- @rm -f test-commentator$(EXEEXT)
- $(CXXLINK) $(test_commentator_OBJECTS) $(test_commentator_LDADD) $(LIBS)
-test-companion$(EXEEXT): $(test_companion_OBJECTS) $(test_companion_DEPENDENCIES) $(EXTRA_test_companion_DEPENDENCIES)
- @rm -f test-companion$(EXEEXT)
- $(CXXLINK) $(test_companion_OBJECTS) $(test_companion_LDADD) $(LIBS)
-test-cra$(EXEEXT): $(test_cra_OBJECTS) $(test_cra_DEPENDENCIES) $(EXTRA_test_cra_DEPENDENCIES)
- @rm -f test-cra$(EXEEXT)
- $(CXXLINK) $(test_cra_OBJECTS) $(test_cra_LDADD) $(LIBS)
-test-cradomain$(EXEEXT): $(test_cradomain_OBJECTS) $(test_cradomain_DEPENDENCIES) $(EXTRA_test_cradomain_DEPENDENCIES)
- @rm -f test-cradomain$(EXEEXT)
- $(CXXLINK) $(test_cradomain_OBJECTS) $(test_cradomain_LDADD) $(LIBS)
-test-dense$(EXEEXT): $(test_dense_OBJECTS) $(test_dense_DEPENDENCIES) $(EXTRA_test_dense_DEPENDENCIES)
- @rm -f test-dense$(EXEEXT)
- $(CXXLINK) $(test_dense_OBJECTS) $(test_dense_LDADD) $(LIBS)
-test-dense-zero-one$(EXEEXT): $(test_dense_zero_one_OBJECTS) $(test_dense_zero_one_DEPENDENCIES) $(EXTRA_test_dense_zero_one_DEPENDENCIES)
- @rm -f test-dense-zero-one$(EXEEXT)
- $(CXXLINK) $(test_dense_zero_one_OBJECTS) $(test_dense_zero_one_LDADD) $(LIBS)
-test-det$(EXEEXT): $(test_det_OBJECTS) $(test_det_DEPENDENCIES) $(EXTRA_test_det_DEPENDENCIES)
- @rm -f test-det$(EXEEXT)
- $(CXXLINK) $(test_det_OBJECTS) $(test_det_LDADD) $(LIBS)
-test-diagonal$(EXEEXT): $(test_diagonal_OBJECTS) $(test_diagonal_DEPENDENCIES) $(EXTRA_test_diagonal_DEPENDENCIES)
- @rm -f test-diagonal$(EXEEXT)
- $(CXXLINK) $(test_diagonal_OBJECTS) $(test_diagonal_LDADD) $(LIBS)
-test-dif$(EXEEXT): $(test_dif_OBJECTS) $(test_dif_DEPENDENCIES) $(EXTRA_test_dif_DEPENDENCIES)
- @rm -f test-dif$(EXEEXT)
- $(CXXLINK) $(test_dif_OBJECTS) $(test_dif_LDADD) $(LIBS)
-test-direct-sum$(EXEEXT): $(test_direct_sum_OBJECTS) $(test_direct_sum_DEPENDENCIES) $(EXTRA_test_direct_sum_DEPENDENCIES)
- @rm -f test-direct-sum$(EXEEXT)
- $(CXXLINK) $(test_direct_sum_OBJECTS) $(test_direct_sum_LDADD) $(LIBS)
-test-dyadic-to-rational$(EXEEXT): $(test_dyadic_to_rational_OBJECTS) $(test_dyadic_to_rational_DEPENDENCIES) $(EXTRA_test_dyadic_to_rational_DEPENDENCIES)
- @rm -f test-dyadic-to-rational$(EXEEXT)
- $(CXXLINK) $(test_dyadic_to_rational_OBJECTS) $(test_dyadic_to_rational_LDADD) $(LIBS)
-test-echelon-form$(EXEEXT): $(test_echelon_form_OBJECTS) $(test_echelon_form_DEPENDENCIES) $(EXTRA_test_echelon_form_DEPENDENCIES)
- @rm -f test-echelon-form$(EXEEXT)
- $(CXXLINK) $(test_echelon_form_OBJECTS) $(test_echelon_form_LDADD) $(LIBS)
-test-ffpack$(EXEEXT): $(test_ffpack_OBJECTS) $(test_ffpack_DEPENDENCIES) $(EXTRA_test_ffpack_DEPENDENCIES)
- @rm -f test-ffpack$(EXEEXT)
- $(CXXLINK) $(test_ffpack_OBJECTS) $(test_ffpack_LDADD) $(LIBS)
-test-frobenius$(EXEEXT): $(test_frobenius_OBJECTS) $(test_frobenius_DEPENDENCIES) $(EXTRA_test_frobenius_DEPENDENCIES)
- @rm -f test-frobenius$(EXEEXT)
- $(CXXLINK) $(test_frobenius_OBJECTS) $(test_frobenius_LDADD) $(LIBS)
-test-ftrmm$(EXEEXT): $(test_ftrmm_OBJECTS) $(test_ftrmm_DEPENDENCIES) $(EXTRA_test_ftrmm_DEPENDENCIES)
- @rm -f test-ftrmm$(EXEEXT)
- $(CXXLINK) $(test_ftrmm_OBJECTS) $(test_ftrmm_LDADD) $(LIBS)
-test-getentry$(EXEEXT): $(test_getentry_OBJECTS) $(test_getentry_DEPENDENCIES) $(EXTRA_test_getentry_DEPENDENCIES)
- @rm -f test-getentry$(EXEEXT)
- $(CXXLINK) $(test_getentry_OBJECTS) $(test_getentry_LDADD) $(LIBS)
-test-gf2$(EXEEXT): $(test_gf2_OBJECTS) $(test_gf2_DEPENDENCIES) $(EXTRA_test_gf2_DEPENDENCIES)
- @rm -f test-gf2$(EXEEXT)
- $(CXXLINK) $(test_gf2_OBJECTS) $(test_gf2_LDADD) $(LIBS)
-test-givaro-fields$(EXEEXT): $(test_givaro_fields_OBJECTS) $(test_givaro_fields_DEPENDENCIES) $(EXTRA_test_givaro_fields_DEPENDENCIES)
- @rm -f test-givaro-fields$(EXEEXT)
- $(CXXLINK) $(test_givaro_fields_OBJECTS) $(test_givaro_fields_LDADD) $(LIBS)
-test-gmp-rational$(EXEEXT): $(test_gmp_rational_OBJECTS) $(test_gmp_rational_DEPENDENCIES) $(EXTRA_test_gmp_rational_DEPENDENCIES)
- @rm -f test-gmp-rational$(EXEEXT)
- $(CXXLINK) $(test_gmp_rational_OBJECTS) $(test_gmp_rational_LDADD) $(LIBS)
-test-hilbert$(EXEEXT): $(test_hilbert_OBJECTS) $(test_hilbert_DEPENDENCIES) $(EXTRA_test_hilbert_DEPENDENCIES)
- @rm -f test-hilbert$(EXEEXT)
- $(CXXLINK) $(test_hilbert_OBJECTS) $(test_hilbert_LDADD) $(LIBS)
-test-hom$(EXEEXT): $(test_hom_OBJECTS) $(test_hom_DEPENDENCIES) $(EXTRA_test_hom_DEPENDENCIES)
- @rm -f test-hom$(EXEEXT)
- $(CXXLINK) $(test_hom_OBJECTS) $(test_hom_LDADD) $(LIBS)
-test-inverse$(EXEEXT): $(test_inverse_OBJECTS) $(test_inverse_DEPENDENCIES) $(EXTRA_test_inverse_DEPENDENCIES)
- @rm -f test-inverse$(EXEEXT)
- $(CXXLINK) $(test_inverse_OBJECTS) $(test_inverse_LDADD) $(LIBS)
-test-isposdef$(EXEEXT): $(test_isposdef_OBJECTS) $(test_isposdef_DEPENDENCIES) $(EXTRA_test_isposdef_DEPENDENCIES)
- @rm -f test-isposdef$(EXEEXT)
- $(CXXLINK) $(test_isposdef_OBJECTS) $(test_isposdef_LDADD) $(LIBS)
-test-ispossemidef$(EXEEXT): $(test_ispossemidef_OBJECTS) $(test_ispossemidef_DEPENDENCIES) $(EXTRA_test_ispossemidef_DEPENDENCIES)
- @rm -f test-ispossemidef$(EXEEXT)
- $(CXXLINK) $(test_ispossemidef_OBJECTS) $(test_ispossemidef_LDADD) $(LIBS)
-test-la-block-lanczos$(EXEEXT): $(test_la_block_lanczos_OBJECTS) $(test_la_block_lanczos_DEPENDENCIES) $(EXTRA_test_la_block_lanczos_DEPENDENCIES)
- @rm -f test-la-block-lanczos$(EXEEXT)
- $(CXXLINK) $(test_la_block_lanczos_OBJECTS) $(test_la_block_lanczos_LDADD) $(LIBS)
-test-last-invariant-factor$(EXEEXT): $(test_last_invariant_factor_OBJECTS) $(test_last_invariant_factor_DEPENDENCIES) $(EXTRA_test_last_invariant_factor_DEPENDENCIES)
- @rm -f test-last-invariant-factor$(EXEEXT)
- $(CXXLINK) $(test_last_invariant_factor_OBJECTS) $(test_last_invariant_factor_LDADD) $(LIBS)
-test-lidia-gfq$(EXEEXT): $(test_lidia_gfq_OBJECTS) $(test_lidia_gfq_DEPENDENCIES) $(EXTRA_test_lidia_gfq_DEPENDENCIES)
- @rm -f test-lidia-gfq$(EXEEXT)
- $(CXXLINK) $(test_lidia_gfq_OBJECTS) $(test_lidia_gfq_LDADD) $(LIBS)
-test-matrix-domain$(EXEEXT): $(test_matrix_domain_OBJECTS) $(test_matrix_domain_DEPENDENCIES) $(EXTRA_test_matrix_domain_DEPENDENCIES)
- @rm -f test-matrix-domain$(EXEEXT)
- $(CXXLINK) $(test_matrix_domain_OBJECTS) $(test_matrix_domain_LDADD) $(LIBS)
-test-matrix-stream$(EXEEXT): $(test_matrix_stream_OBJECTS) $(test_matrix_stream_DEPENDENCIES) $(EXTRA_test_matrix_stream_DEPENDENCIES)
- @rm -f test-matrix-stream$(EXEEXT)
- $(CXXLINK) $(test_matrix_stream_OBJECTS) $(test_matrix_stream_LDADD) $(LIBS)
-test-mg-block-lanczos$(EXEEXT): $(test_mg_block_lanczos_OBJECTS) $(test_mg_block_lanczos_DEPENDENCIES) $(EXTRA_test_mg_block_lanczos_DEPENDENCIES)
- @rm -f test-mg-block-lanczos$(EXEEXT)
- $(CXXLINK) $(test_mg_block_lanczos_OBJECTS) $(test_mg_block_lanczos_LDADD) $(LIBS)
-test-minpoly$(EXEEXT): $(test_minpoly_OBJECTS) $(test_minpoly_DEPENDENCIES) $(EXTRA_test_minpoly_DEPENDENCIES)
- @rm -f test-minpoly$(EXEEXT)
- $(CXXLINK) $(test_minpoly_OBJECTS) $(test_minpoly_LDADD) $(LIBS)
-test-modular$(EXEEXT): $(test_modular_OBJECTS) $(test_modular_DEPENDENCIES) $(EXTRA_test_modular_DEPENDENCIES)
- @rm -f test-modular$(EXEEXT)
- $(CXXLINK) $(test_modular_OBJECTS) $(test_modular_LDADD) $(LIBS)
-test-modular-balanced-double$(EXEEXT): $(test_modular_balanced_double_OBJECTS) $(test_modular_balanced_double_DEPENDENCIES) $(EXTRA_test_modular_balanced_double_DEPENDENCIES)
- @rm -f test-modular-balanced-double$(EXEEXT)
- $(CXXLINK) $(test_modular_balanced_double_OBJECTS) $(test_modular_balanced_double_LDADD) $(LIBS)
-test-modular-balanced-float$(EXEEXT): $(test_modular_balanced_float_OBJECTS) $(test_modular_balanced_float_DEPENDENCIES) $(EXTRA_test_modular_balanced_float_DEPENDENCIES)
- @rm -f test-modular-balanced-float$(EXEEXT)
- $(CXXLINK) $(test_modular_balanced_float_OBJECTS) $(test_modular_balanced_float_LDADD) $(LIBS)
-test-modular-balanced-int$(EXEEXT): $(test_modular_balanced_int_OBJECTS) $(test_modular_balanced_int_DEPENDENCIES) $(EXTRA_test_modular_balanced_int_DEPENDENCIES)
- @rm -f test-modular-balanced-int$(EXEEXT)
- $(CXXLINK) $(test_modular_balanced_int_OBJECTS) $(test_modular_balanced_int_LDADD) $(LIBS)
-test-modular-byte$(EXEEXT): $(test_modular_byte_OBJECTS) $(test_modular_byte_DEPENDENCIES) $(EXTRA_test_modular_byte_DEPENDENCIES)
- @rm -f test-modular-byte$(EXEEXT)
- $(CXXLINK) $(test_modular_byte_OBJECTS) $(test_modular_byte_LDADD) $(LIBS)
-test-modular-double$(EXEEXT): $(test_modular_double_OBJECTS) $(test_modular_double_DEPENDENCIES) $(EXTRA_test_modular_double_DEPENDENCIES)
- @rm -f test-modular-double$(EXEEXT)
- $(CXXLINK) $(test_modular_double_OBJECTS) $(test_modular_double_LDADD) $(LIBS)
-test-modular-float$(EXEEXT): $(test_modular_float_OBJECTS) $(test_modular_float_DEPENDENCIES) $(EXTRA_test_modular_float_DEPENDENCIES)
- @rm -f test-modular-float$(EXEEXT)
- $(CXXLINK) $(test_modular_float_OBJECTS) $(test_modular_float_LDADD) $(LIBS)
-test-modular-int$(EXEEXT): $(test_modular_int_OBJECTS) $(test_modular_int_DEPENDENCIES) $(EXTRA_test_modular_int_DEPENDENCIES)
- @rm -f test-modular-int$(EXEEXT)
- $(CXXLINK) $(test_modular_int_OBJECTS) $(test_modular_int_LDADD) $(LIBS)
-test-modular-short$(EXEEXT): $(test_modular_short_OBJECTS) $(test_modular_short_DEPENDENCIES) $(EXTRA_test_modular_short_DEPENDENCIES)
- @rm -f test-modular-short$(EXEEXT)
- $(CXXLINK) $(test_modular_short_OBJECTS) $(test_modular_short_LDADD) $(LIBS)
-test-moore-penrose$(EXEEXT): $(test_moore_penrose_OBJECTS) $(test_moore_penrose_DEPENDENCIES) $(EXTRA_test_moore_penrose_DEPENDENCIES)
- @rm -f test-moore-penrose$(EXEEXT)
- $(CXXLINK) $(test_moore_penrose_OBJECTS) $(test_moore_penrose_LDADD) $(LIBS)
-test-ntl-RR$(EXEEXT): $(test_ntl_RR_OBJECTS) $(test_ntl_RR_DEPENDENCIES) $(EXTRA_test_ntl_RR_DEPENDENCIES)
- @rm -f test-ntl-RR$(EXEEXT)
- $(CXXLINK) $(test_ntl_RR_OBJECTS) $(test_ntl_RR_LDADD) $(LIBS)
-test-ntl-ZZ_p$(EXEEXT): $(test_ntl_ZZ_p_OBJECTS) $(test_ntl_ZZ_p_DEPENDENCIES) $(EXTRA_test_ntl_ZZ_p_DEPENDENCIES)
- @rm -f test-ntl-ZZ_p$(EXEEXT)
- $(CXXLINK) $(test_ntl_ZZ_p_OBJECTS) $(test_ntl_ZZ_p_LDADD) $(LIBS)
-test-ntl-hankel$(EXEEXT): $(test_ntl_hankel_OBJECTS) $(test_ntl_hankel_DEPENDENCIES) $(EXTRA_test_ntl_hankel_DEPENDENCIES)
- @rm -f test-ntl-hankel$(EXEEXT)
- $(CXXLINK) $(test_ntl_hankel_OBJECTS) $(test_ntl_hankel_LDADD) $(LIBS)
-test-ntl-lzz_p$(EXEEXT): $(test_ntl_lzz_p_OBJECTS) $(test_ntl_lzz_p_DEPENDENCIES) $(EXTRA_test_ntl_lzz_p_DEPENDENCIES)
- @rm -f test-ntl-lzz_p$(EXEEXT)
- $(CXXLINK) $(test_ntl_lzz_p_OBJECTS) $(test_ntl_lzz_p_LDADD) $(LIBS)
-test-ntl-sylvester$(EXEEXT): $(test_ntl_sylvester_OBJECTS) $(test_ntl_sylvester_DEPENDENCIES) $(EXTRA_test_ntl_sylvester_DEPENDENCIES)
- @rm -f test-ntl-sylvester$(EXEEXT)
- $(CXXLINK) $(test_ntl_sylvester_OBJECTS) $(test_ntl_sylvester_LDADD) $(LIBS)
-test-ntl-toeplitz$(EXEEXT): $(test_ntl_toeplitz_OBJECTS) $(test_ntl_toeplitz_DEPENDENCIES) $(EXTRA_test_ntl_toeplitz_DEPENDENCIES)
- @rm -f test-ntl-toeplitz$(EXEEXT)
- $(CXXLINK) $(test_ntl_toeplitz_OBJECTS) $(test_ntl_toeplitz_LDADD) $(LIBS)
-test-nullspace$(EXEEXT): $(test_nullspace_OBJECTS) $(test_nullspace_DEPENDENCIES) $(EXTRA_test_nullspace_DEPENDENCIES)
- @rm -f test-nullspace$(EXEEXT)
- $(CXXLINK) $(test_nullspace_OBJECTS) $(test_nullspace_LDADD) $(LIBS)
-test-optimization$(EXEEXT): $(test_optimization_OBJECTS) $(test_optimization_DEPENDENCIES) $(EXTRA_test_optimization_DEPENDENCIES)
- @rm -f test-optimization$(EXEEXT)
- $(CXXLINK) $(test_optimization_OBJECTS) $(test_optimization_LDADD) $(LIBS)
-test-param-fuzzy$(EXEEXT): $(test_param_fuzzy_OBJECTS) $(test_param_fuzzy_DEPENDENCIES) $(EXTRA_test_param_fuzzy_DEPENDENCIES)
- @rm -f test-param-fuzzy$(EXEEXT)
- $(CXXLINK) $(test_param_fuzzy_OBJECTS) $(test_param_fuzzy_LDADD) $(LIBS)
-test-qlup$(EXEEXT): $(test_qlup_OBJECTS) $(test_qlup_DEPENDENCIES) $(EXTRA_test_qlup_DEPENDENCIES)
- @rm -f test-qlup$(EXEEXT)
- $(CXXLINK) $(test_qlup_OBJECTS) $(test_qlup_LDADD) $(LIBS)
-test-randiter-nonzero$(EXEEXT): $(test_randiter_nonzero_OBJECTS) $(test_randiter_nonzero_DEPENDENCIES) $(EXTRA_test_randiter_nonzero_DEPENDENCIES)
- @rm -f test-randiter-nonzero$(EXEEXT)
- $(CXXLINK) $(test_randiter_nonzero_OBJECTS) $(test_randiter_nonzero_LDADD) $(LIBS)
-test-rank$(EXEEXT): $(test_rank_OBJECTS) $(test_rank_DEPENDENCIES) $(EXTRA_test_rank_DEPENDENCIES)
- @rm -f test-rank$(EXEEXT)
- $(CXXLINK) $(test_rank_OBJECTS) $(test_rank_LDADD) $(LIBS)
-test-rat-charpoly$(EXEEXT): $(test_rat_charpoly_OBJECTS) $(test_rat_charpoly_DEPENDENCIES) $(EXTRA_test_rat_charpoly_DEPENDENCIES)
- @rm -f test-rat-charpoly$(EXEEXT)
- $(CXXLINK) $(test_rat_charpoly_OBJECTS) $(test_rat_charpoly_LDADD) $(LIBS)
-test-rat-minpoly$(EXEEXT): $(test_rat_minpoly_OBJECTS) $(test_rat_minpoly_DEPENDENCIES) $(EXTRA_test_rat_minpoly_DEPENDENCIES)
- @rm -f test-rat-minpoly$(EXEEXT)
- $(CXXLINK) $(test_rat_minpoly_OBJECTS) $(test_rat_minpoly_LDADD) $(LIBS)
-test-rat-solve$(EXEEXT): $(test_rat_solve_OBJECTS) $(test_rat_solve_DEPENDENCIES) $(EXTRA_test_rat_solve_DEPENDENCIES)
- @rm -f test-rat-solve$(EXEEXT)
- $(CXXLINK) $(test_rat_solve_OBJECTS) $(test_rat_solve_LDADD) $(LIBS)
-test-rational-matrix-factory$(EXEEXT): $(test_rational_matrix_factory_OBJECTS) $(test_rational_matrix_factory_DEPENDENCIES) $(EXTRA_test_rational_matrix_factory_DEPENDENCIES)
- @rm -f test-rational-matrix-factory$(EXEEXT)
- $(CXXLINK) $(test_rational_matrix_factory_OBJECTS) $(test_rational_matrix_factory_LDADD) $(LIBS)
-test-rational-reconstruction-base$(EXEEXT): $(test_rational_reconstruction_base_OBJECTS) $(test_rational_reconstruction_base_DEPENDENCIES) $(EXTRA_test_rational_reconstruction_base_DEPENDENCIES)
- @rm -f test-rational-reconstruction-base$(EXEEXT)
- $(CXXLINK) $(test_rational_reconstruction_base_OBJECTS) $(test_rational_reconstruction_base_LDADD) $(LIBS)
-test-rational-solver$(EXEEXT): $(test_rational_solver_OBJECTS) $(test_rational_solver_DEPENDENCIES) $(EXTRA_test_rational_solver_DEPENDENCIES)
- @rm -f test-rational-solver$(EXEEXT)
- $(CXXLINK) $(test_rational_solver_OBJECTS) $(test_rational_solver_LDADD) $(LIBS)
-test-rational-solver-adaptive$(EXEEXT): $(test_rational_solver_adaptive_OBJECTS) $(test_rational_solver_adaptive_DEPENDENCIES) $(EXTRA_test_rational_solver_adaptive_DEPENDENCIES)
- @rm -f test-rational-solver-adaptive$(EXEEXT)
- $(CXXLINK) $(test_rational_solver_adaptive_OBJECTS) $(test_rational_solver_adaptive_LDADD) $(LIBS)
-test-scalar-matrix$(EXEEXT): $(test_scalar_matrix_OBJECTS) $(test_scalar_matrix_DEPENDENCIES) $(EXTRA_test_scalar_matrix_DEPENDENCIES)
- @rm -f test-scalar-matrix$(EXEEXT)
- $(CXXLINK) $(test_scalar_matrix_OBJECTS) $(test_scalar_matrix_LDADD) $(LIBS)
-test-smith-form$(EXEEXT): $(test_smith_form_OBJECTS) $(test_smith_form_DEPENDENCIES) $(EXTRA_test_smith_form_DEPENDENCIES)
- @rm -f test-smith-form$(EXEEXT)
- $(CXXLINK) $(test_smith_form_OBJECTS) $(test_smith_form_LDADD) $(LIBS)
-test-smith-form-adaptive$(EXEEXT): $(test_smith_form_adaptive_OBJECTS) $(test_smith_form_adaptive_DEPENDENCIES) $(EXTRA_test_smith_form_adaptive_DEPENDENCIES)
- @rm -f test-smith-form-adaptive$(EXEEXT)
- $(CXXLINK) $(test_smith_form_adaptive_OBJECTS) $(test_smith_form_adaptive_LDADD) $(LIBS)
-test-smith-form-binary$(EXEEXT): $(test_smith_form_binary_OBJECTS) $(test_smith_form_binary_DEPENDENCIES) $(EXTRA_test_smith_form_binary_DEPENDENCIES)
- @rm -f test-smith-form-binary$(EXEEXT)
- $(CXXLINK) $(test_smith_form_binary_OBJECTS) $(test_smith_form_binary_LDADD) $(LIBS)
-test-smith-form-iliopoulos$(EXEEXT): $(test_smith_form_iliopoulos_OBJECTS) $(test_smith_form_iliopoulos_DEPENDENCIES) $(EXTRA_test_smith_form_iliopoulos_DEPENDENCIES)
- @rm -f test-smith-form-iliopoulos$(EXEEXT)
- $(CXXLINK) $(test_smith_form_iliopoulos_OBJECTS) $(test_smith_form_iliopoulos_LDADD) $(LIBS)
-test-smith-form-local$(EXEEXT): $(test_smith_form_local_OBJECTS) $(test_smith_form_local_DEPENDENCIES) $(EXTRA_test_smith_form_local_DEPENDENCIES)
- @rm -f test-smith-form-local$(EXEEXT)
- $(CXXLINK) $(test_smith_form_local_OBJECTS) $(test_smith_form_local_LDADD) $(LIBS)
-test-solve$(EXEEXT): $(test_solve_OBJECTS) $(test_solve_DEPENDENCIES) $(EXTRA_test_solve_DEPENDENCIES)
- @rm -f test-solve$(EXEEXT)
- $(CXXLINK) $(test_solve_OBJECTS) $(test_solve_LDADD) $(LIBS)
-test-solve-nonsingular$(EXEEXT): $(test_solve_nonsingular_OBJECTS) $(test_solve_nonsingular_DEPENDENCIES) $(EXTRA_test_solve_nonsingular_DEPENDENCIES)
- @rm -f test-solve-nonsingular$(EXEEXT)
- $(CXXLINK) $(test_solve_nonsingular_OBJECTS) $(test_solve_nonsingular_LDADD) $(LIBS)
-test-sparse$(EXEEXT): $(test_sparse_OBJECTS) $(test_sparse_DEPENDENCIES) $(EXTRA_test_sparse_DEPENDENCIES)
- @rm -f test-sparse$(EXEEXT)
- $(CXXLINK) $(test_sparse_OBJECTS) $(test_sparse_LDADD) $(LIBS)
-test-subiterator$(EXEEXT): $(test_subiterator_OBJECTS) $(test_subiterator_DEPENDENCIES) $(EXTRA_test_subiterator_DEPENDENCIES)
- @rm -f test-subiterator$(EXEEXT)
- $(CXXLINK) $(test_subiterator_OBJECTS) $(test_subiterator_LDADD) $(LIBS)
-test-submatrix$(EXEEXT): $(test_submatrix_OBJECTS) $(test_submatrix_DEPENDENCIES) $(EXTRA_test_submatrix_DEPENDENCIES)
- @rm -f test-submatrix$(EXEEXT)
- $(CXXLINK) $(test_submatrix_OBJECTS) $(test_submatrix_LDADD) $(LIBS)
-test-subvector$(EXEEXT): $(test_subvector_OBJECTS) $(test_subvector_DEPENDENCIES) $(EXTRA_test_subvector_DEPENDENCIES)
- @rm -f test-subvector$(EXEEXT)
- $(CXXLINK) $(test_subvector_OBJECTS) $(test_subvector_LDADD) $(LIBS)
-test-sum$(EXEEXT): $(test_sum_OBJECTS) $(test_sum_DEPENDENCIES) $(EXTRA_test_sum_DEPENDENCIES)
- @rm -f test-sum$(EXEEXT)
- $(CXXLINK) $(test_sum_OBJECTS) $(test_sum_LDADD) $(LIBS)
-test-toeplitz-det$(EXEEXT): $(test_toeplitz_det_OBJECTS) $(test_toeplitz_det_DEPENDENCIES) $(EXTRA_test_toeplitz_det_DEPENDENCIES)
- @rm -f test-toeplitz-det$(EXEEXT)
- $(CXXLINK) $(test_toeplitz_det_OBJECTS) $(test_toeplitz_det_LDADD) $(LIBS)
-test-toom-cook$(EXEEXT): $(test_toom_cook_OBJECTS) $(test_toom_cook_DEPENDENCIES) $(EXTRA_test_toom_cook_DEPENDENCIES)
- @rm -f test-toom-cook$(EXEEXT)
- $(CXXLINK) $(test_toom_cook_OBJECTS) $(test_toom_cook_LDADD) $(LIBS)
-test-trace$(EXEEXT): $(test_trace_OBJECTS) $(test_trace_DEPENDENCIES) $(EXTRA_test_trace_DEPENDENCIES)
- @rm -f test-trace$(EXEEXT)
- $(CXXLINK) $(test_trace_OBJECTS) $(test_trace_LDADD) $(LIBS)
-test-triplesbb$(EXEEXT): $(test_triplesbb_OBJECTS) $(test_triplesbb_DEPENDENCIES) $(EXTRA_test_triplesbb_DEPENDENCIES)
- @rm -f test-triplesbb$(EXEEXT)
- $(CXXLINK) $(test_triplesbb_OBJECTS) $(test_triplesbb_LDADD) $(LIBS)
-test-unparametric-field$(EXEEXT): $(test_unparametric_field_OBJECTS) $(test_unparametric_field_DEPENDENCIES) $(EXTRA_test_unparametric_field_DEPENDENCIES)
- @rm -f test-unparametric-field$(EXEEXT)
- $(CXXLINK) $(test_unparametric_field_OBJECTS) $(test_unparametric_field_LDADD) $(LIBS)
-test-vector-domain$(EXEEXT): $(test_vector_domain_OBJECTS) $(test_vector_domain_DEPENDENCIES) $(EXTRA_test_vector_domain_DEPENDENCIES)
- @rm -f test-vector-domain$(EXEEXT)
- $(CXXLINK) $(test_vector_domain_OBJECTS) $(test_vector_domain_LDADD) $(LIBS)
-test-zero-one$(EXEEXT): $(test_zero_one_OBJECTS) $(test_zero_one_DEPENDENCIES) $(EXTRA_test_zero_one_DEPENDENCIES)
- @rm -f test-zero-one$(EXEEXT)
- $(CXXLINK) $(test_zero_one_OBJECTS) $(test_zero_one_LDADD) $(LIBS)
-test-zo$(EXEEXT): $(test_zo_OBJECTS) $(test_zo_DEPENDENCIES) $(EXTRA_test_zo_DEPENDENCIES)
- @rm -f test-zo$(EXEEXT)
- $(CXXLINK) $(test_zo_OBJECTS) $(test_zo_LDADD) $(LIBS)
-
-mostlyclean-compile:
- -rm -f *.$(OBJEXT)
-
-distclean-compile:
- -rm -f *.tab.c
-
-.C.o:
- $(CXXCOMPILE) -c -o $@ $<
-
-.C.obj:
- $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
-
-.C.lo:
- $(LTCXXCOMPILE) -c -o $@ $<
-
-mostlyclean-libtool:
- -rm -f *.lo
-
-clean-libtool:
- -rm -rf .libs _libs
-
-# This directory's subdirectories are mostly independent; you can cd
-# into them and run `make' without going through this Makefile.
-# To change the values of `make' variables: instead of editing Makefiles,
-# (1) if the variable is set in `config.status', edit `config.status'
-# (which will cause the Makefiles to be regenerated when you run `make');
-# (2) otherwise, pass the desired values on the `make' command line.
-$(RECURSIVE_TARGETS):
- @fail= failcom='exit 1'; \
- for f in x $$MAKEFLAGS; do \
- case $$f in \
- *=* | --[!k]*);; \
- *k*) failcom='fail=yes';; \
- esac; \
- done; \
- dot_seen=no; \
- target=`echo $@ | sed s/-recursive//`; \
- list='$(SUBDIRS)'; for subdir in $$list; do \
- echo "Making $$target in $$subdir"; \
- if test "$$subdir" = "."; then \
- dot_seen=yes; \
- local_target="$$target-am"; \
- else \
- local_target="$$target"; \
- fi; \
- ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
- || eval $$failcom; \
- done; \
- if test "$$dot_seen" = "no"; then \
- $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \
- fi; test -z "$$fail"
-
-$(RECURSIVE_CLEAN_TARGETS):
- @fail= failcom='exit 1'; \
- for f in x $$MAKEFLAGS; do \
- case $$f in \
- *=* | --[!k]*);; \
- *k*) failcom='fail=yes';; \
- esac; \
- done; \
- dot_seen=no; \
- case "$@" in \
- distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \
- *) list='$(SUBDIRS)' ;; \
- esac; \
- rev=''; for subdir in $$list; do \
- if test "$$subdir" = "."; then :; else \
- rev="$$subdir $$rev"; \
- fi; \
- done; \
- rev="$$rev ."; \
- target=`echo $@ | sed s/-recursive//`; \
- for subdir in $$rev; do \
- echo "Making $$target in $$subdir"; \
- if test "$$subdir" = "."; then \
- local_target="$$target-am"; \
- else \
- local_target="$$target"; \
- fi; \
- ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
- || eval $$failcom; \
- done && test -z "$$fail"
-tags-recursive:
- list='$(SUBDIRS)'; for subdir in $$list; do \
- test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \
- done
-ctags-recursive:
- list='$(SUBDIRS)'; for subdir in $$list; do \
- test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \
- done
-
-ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
- list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
- unique=`for i in $$list; do \
- if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
- done | \
- $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
- END { if (nonempty) { for (i in files) print i; }; }'`; \
- mkid -fID $$unique
-tags: TAGS
-
-TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
- $(TAGS_FILES) $(LISP)
- set x; \
- here=`pwd`; \
- if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \
- include_option=--etags-include; \
- empty_fix=.; \
- else \
- include_option=--include; \
- empty_fix=; \
- fi; \
- list='$(SUBDIRS)'; for subdir in $$list; do \
- if test "$$subdir" = .; then :; else \
- test ! -f $$subdir/TAGS || \
- set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \
- fi; \
- done; \
- list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
- unique=`for i in $$list; do \
- if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
- done | \
- $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
- END { if (nonempty) { for (i in files) print i; }; }'`; \
- shift; \
- if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
- test -n "$$unique" || unique=$$empty_fix; \
- if test $$# -gt 0; then \
- $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
- "$$@" $$unique; \
- else \
- $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
- $$unique; \
- fi; \
- fi
-ctags: CTAGS
-CTAGS: ctags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
- $(TAGS_FILES) $(LISP)
- list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
- unique=`for i in $$list; do \
- if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
- done | \
- $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
- END { if (nonempty) { for (i in files) print i; }; }'`; \
- test -z "$(CTAGS_ARGS)$$unique" \
- || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
- $$unique
-
-GTAGS:
- here=`$(am__cd) $(top_builddir) && pwd` \
- && $(am__cd) $(top_srcdir) \
- && gtags -i $(GTAGS_ARGS) "$$here"
-
-distclean-tags:
- -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
-
-check-TESTS: $(TESTS)
- @failed=0; all=0; xfail=0; xpass=0; skip=0; \
- srcdir=$(srcdir); export srcdir; \
- list=' $(TESTS) '; \
- $(am__tty_colors); \
- if test -n "$$list"; then \
- for tst in $$list; do \
- if test -f ./$$tst; then dir=./; \
- elif test -f $$tst; then dir=; \
- else dir="$(srcdir)/"; fi; \
- if $(TESTS_ENVIRONMENT) $${dir}$$tst; then \
- all=`expr $$all + 1`; \
- case " $(XFAIL_TESTS) " in \
- *[\ \ ]$$tst[\ \ ]*) \
- xpass=`expr $$xpass + 1`; \
- failed=`expr $$failed + 1`; \
- col=$$red; res=XPASS; \
- ;; \
- *) \
- col=$$grn; res=PASS; \
- ;; \
- esac; \
- elif test $$? -ne 77; then \
- all=`expr $$all + 1`; \
- case " $(XFAIL_TESTS) " in \
- *[\ \ ]$$tst[\ \ ]*) \
- xfail=`expr $$xfail + 1`; \
- col=$$lgn; res=XFAIL; \
- ;; \
- *) \
- failed=`expr $$failed + 1`; \
- col=$$red; res=FAIL; \
- ;; \
- esac; \
- else \
- skip=`expr $$skip + 1`; \
- col=$$blu; res=SKIP; \
- fi; \
- echo "$${col}$$res$${std}: $$tst"; \
- done; \
- if test "$$all" -eq 1; then \
- tests="test"; \
- All=""; \
- else \
- tests="tests"; \
- All="All "; \
- fi; \
- if test "$$failed" -eq 0; then \
- if test "$$xfail" -eq 0; then \
- banner="$$All$$all $$tests passed"; \
- else \
- if test "$$xfail" -eq 1; then failures=failure; else failures=failures; fi; \
- banner="$$All$$all $$tests behaved as expected ($$xfail expected $$failures)"; \
- fi; \
- else \
- if test "$$xpass" -eq 0; then \
- banner="$$failed of $$all $$tests failed"; \
- else \
- if test "$$xpass" -eq 1; then passes=pass; else passes=passes; fi; \
- banner="$$failed of $$all $$tests did not behave as expected ($$xpass unexpected $$passes)"; \
- fi; \
- fi; \
- dashes="$$banner"; \
- skipped=""; \
- if test "$$skip" -ne 0; then \
- if test "$$skip" -eq 1; then \
- skipped="($$skip test was not run)"; \
- else \
- skipped="($$skip tests were not run)"; \
- fi; \
- test `echo "$$skipped" | wc -c` -le `echo "$$banner" | wc -c` || \
- dashes="$$skipped"; \
- fi; \
- report=""; \
- if test "$$failed" -ne 0 && test -n "$(PACKAGE_BUGREPORT)"; then \
- report="Please report to $(PACKAGE_BUGREPORT)"; \
- test `echo "$$report" | wc -c` -le `echo "$$banner" | wc -c` || \
- dashes="$$report"; \
- fi; \
- dashes=`echo "$$dashes" | sed s/./=/g`; \
- if test "$$failed" -eq 0; then \
- col="$$grn"; \
- else \
- col="$$red"; \
- fi; \
- echo "$${col}$$dashes$${std}"; \
- echo "$${col}$$banner$${std}"; \
- test -z "$$skipped" || echo "$${col}$$skipped$${std}"; \
- test -z "$$report" || echo "$${col}$$report$${std}"; \
- echo "$${col}$$dashes$${std}"; \
- test "$$failed" -eq 0; \
- else :; fi
-
-distdir: $(DISTFILES)
- @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
- topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
- list='$(DISTFILES)'; \
- dist_files=`for file in $$list; do echo $$file; done | \
- sed -e "s|^$$srcdirstrip/||;t" \
- -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
- case $$dist_files in \
- */*) $(MKDIR_P) `echo "$$dist_files" | \
- sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
- sort -u` ;; \
- esac; \
- for file in $$dist_files; do \
- if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
- if test -d $$d/$$file; then \
- dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
- if test -d "$(distdir)/$$file"; then \
- find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
- fi; \
- if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
- cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
- find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
- fi; \
- cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
- else \
- test -f "$(distdir)/$$file" \
- || cp -p $$d/$$file "$(distdir)/$$file" \
- || exit 1; \
- fi; \
- done
- @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \
- if test "$$subdir" = .; then :; else \
- $(am__make_dryrun) \
- || test -d "$(distdir)/$$subdir" \
- || $(MKDIR_P) "$(distdir)/$$subdir" \
- || exit 1; \
- dir1=$$subdir; dir2="$(distdir)/$$subdir"; \
- $(am__relativize); \
- new_distdir=$$reldir; \
- dir1=$$subdir; dir2="$(top_distdir)"; \
- $(am__relativize); \
- new_top_distdir=$$reldir; \
- echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \
- echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \
- ($(am__cd) $$subdir && \
- $(MAKE) $(AM_MAKEFLAGS) \
- top_distdir="$$new_top_distdir" \
- distdir="$$new_distdir" \
- am__remove_distdir=: \
- am__skip_length_check=: \
- am__skip_mode_fix=: \
- distdir) \
- || exit 1; \
- fi; \
- done
-check-am: all-am
- $(MAKE) $(AM_MAKEFLAGS) check-TESTS
-check: check-recursive
-all-am: Makefile
-installdirs: installdirs-recursive
-installdirs-am:
-install: install-recursive
-install-exec: install-exec-recursive
-install-data: install-data-recursive
-uninstall: uninstall-recursive
-
-install-am: all-am
- @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
-
-installcheck: installcheck-recursive
-install-strip:
- if test -z '$(STRIP)'; then \
- $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
- install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
- install; \
- else \
- $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
- install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
- "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
- fi
-mostlyclean-generic:
-
-clean-generic:
- -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
-
-distclean-generic:
- -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
- -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
-
-maintainer-clean-generic:
- @echo "This command is intended for maintainers to use"
- @echo "it deletes files that may require special tools to rebuild."
-clean: clean-recursive
-
-clean-am: clean-generic clean-libtool mostlyclean-am
-
-distclean: distclean-recursive
- -rm -f Makefile
-distclean-am: clean-am distclean-compile distclean-generic \
- distclean-tags
-
-dvi: dvi-recursive
-
-dvi-am:
-
-html: html-recursive
-
-html-am:
-
-info: info-recursive
-
-info-am:
-
-install-data-am:
-
-install-dvi: install-dvi-recursive
-
-install-dvi-am:
-
-install-exec-am:
-
-install-html: install-html-recursive
-
-install-html-am:
-
-install-info: install-info-recursive
-
-install-info-am:
-
-install-man:
-
-install-pdf: install-pdf-recursive
-
-install-pdf-am:
-
-install-ps: install-ps-recursive
-
-install-ps-am:
-
-installcheck-am:
-
-maintainer-clean: maintainer-clean-recursive
- -rm -f Makefile
-maintainer-clean-am: distclean-am maintainer-clean-generic
-
-mostlyclean: mostlyclean-recursive
-
-mostlyclean-am: mostlyclean-compile mostlyclean-generic \
- mostlyclean-libtool
-
-pdf: pdf-recursive
-
-pdf-am:
-
-ps: ps-recursive
-
-ps-am:
-
-uninstall-am:
-
-.MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) check-am \
- ctags-recursive install-am install-strip tags-recursive
-
-.PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \
- all all-am check check-TESTS check-am clean clean-generic \
- clean-libtool ctags ctags-recursive distclean \
- distclean-compile distclean-generic distclean-libtool \
- distclean-tags distdir dvi dvi-am html html-am info info-am \
- install install-am install-data install-data-am install-dvi \
- install-dvi-am install-exec install-exec-am install-html \
- install-html-am install-info install-info-am install-man \
- install-pdf install-pdf-am install-ps install-ps-am \
- install-strip installcheck installcheck-am installdirs \
- installdirs-am maintainer-clean maintainer-clean-generic \
- mostlyclean mostlyclean-compile mostlyclean-generic \
- mostlyclean-libtool pdf pdf-am ps ps-am tags tags-recursive \
- uninstall uninstall-am
-
-
-# test_integer_tools_SOURCES = \
-# test-integer-tools.C
-
-#check: checker
-# checker -c
-
-# for compilation of new non-enumerated tests
-%:%.C
- $(CXX) $(CXXFLAGS) $(AM_CXXFLAGS) $(OPTFLAGS) ${INCLUDES} $(AM_CPPFLAGS) $*.C -o $@ $(LDADD)
-
-fullcheck: checker
- ./checker
-
-checker: checker.C
-
-# Tell versions [3.59,3.63) of GNU make to not export all variables.
-# Otherwise a system limit (for SysV at least) may be exceeded.
-.NOEXPORT:
diff --git a/tests/benchmark-fields.C b/tests/benchmark-fields.C
index b364144..b1fdee3 100644
--- a/tests/benchmark-fields.C
+++ b/tests/benchmark-fields.C
@@ -33,21 +33,21 @@
// #include "linbox/field/givaro-gfq.h"
#ifdef __LINBOX_HAVE_NTL
-#include "linbox/field/ntl.h"
-#include "linbox/field/PID-ntl-zz_p.h"
-#include "linbox/field/PIR-ntl-ZZ_p.h"
+#include "linbox/ring/ntl.h"
+#include "linbox/ring/pid-ntl-lzz_p.h"
+#include "linbox/ring/pir-ntl-zz_p.h"
#endif
#include "linbox/field/modular.h"
-#include "linbox/field/modular-balanced.h"
+#include <givaro/modular-balanced.h>
#include "linbox/field/Modular/modular-crooked-double.h"
#include "linbox/field/field-traits.h"
#include "linbox/vector/stream.h"
#include "linbox/integer.h"
-#include "linbox/field/PIR-modular-int32.h"
+#include "linbox/ring/pir-modular-int32.h"
// #include "linbox/field/gf2.h"
#include "linbox/field/gmp-rational.h"
-#include "linbox/field/local2_32.h"
+#include "linbox/ring/local2_32.h"
#ifdef __LINBOX_HAVE_LIDIA
#include "linbox/field/lidia.h"
@@ -55,7 +55,7 @@
#include <iostream>
#include <iomanip>
-#include <vector>
+
using namespace LinBox;
@@ -72,46 +72,45 @@ template< class Field >
void fieldTest( const Field& f, double* array, long iter = 1000000, bool fulltest = false )
{
- long vectorSize = 10000;
+ size_t vectorSize = 10000;
float sparsity = .01f;
- long sparsity_inv = 100;
int i;
// initialize a few field elements,
typedef typename Field::Element Element;
- Element returnValue; f.init(returnValue, 1);
- Element s; f.init(s, 0);
+ Element returnValue; f.assign(returnValue, f.one);
+ Element s; f.assign(s, f.zero);
Element a, b, c;
typename Field::RandIter r(f);
r.random( a ); r.random( b ); r.random( c );
- std::vector<Element> dv1( vectorSize ), dv2( vectorSize );
- for (i = 0; i < vectorSize; ++i ) {
- r.random( dv1[i] );
- r.random( dv2[i] );
+ BlasVector<Field> dv1( f, vectorSize ), dv2( f, vectorSize );
+ for (i = 0; i <(int) vectorSize; ++i ) {
+ r.random( dv1[(size_t)i] );
+ r.random( dv2[(size_t)i] );
}
RandomSparseStream<Field> sparse( f, sparsity, vectorSize );
typename RandomSparseStream<Field>::Vector sv; sparse.get( sv );
#if 0
// initialize and fill array of random elements.
- typename Field::RandIter r(f);
+ typename Field::RandIter gen(f);
typename Field::Element *elements;
elements = new typename Field::Element[ iter * 3 ];
for( int i = 0; i < iter*3; i++ ) {
- do { r.random( elements[i] ); }
- while( f.isZero( elements[i] ) );
+ do { r.random( elements[(size_t)i] ); }
+ while( f.isZero( elements[(size_t)i] ) );
}
// initialize random vector streams
- RandomDenseStream<Field> dense( f, vectorSize, 2);
+ RandomDenseStream<Field> dense( f, gen, vectorSize, 2);
typename RandomDenseStream<Field>::Vector dv1; dense.get( dv1 );
typename RandomDenseStream<Field>::Vector dv2; dense.get( dv2 );
- RandomSparseStream<Field> sparse( f, sparsity, vectorSize );
+ RandomSparseStream<Field> sparse( f, gen, sparsity, vectorSize );
typename RandomSparseStream<Field>::Vector sv; sparse.get( sv );
- RandomDenseStream<Field> dense1( f, vectorSize, iter/vectorSize );
- RandomDenseStream<Field> dense2( f, vectorSize, iter/vectorSize );
+ RandomDenseStream<Field> dense1( f, gen, vectorSize, iter/vectorSize );
+ RandomDenseStream<Field> dense2( f, gen, vectorSize, iter/vectorSize );
RandomSparseStream<Field> sparse( f, sparsity, vectorSize );
// initialize individual vectors to hold results
@@ -130,7 +129,7 @@ void fieldTest( const Field& f, double* array, long iter = 1000000, bool fulltes
double overHeadTime;
timer.clear(); timer.start();
- f.init(s, 0);
+ f.assign(s, f.zero);
for( i = 0; i < iter; i++ ) { f.init(returnValue, i); f.addin(s, returnValue); }
timer.stop(); overHeadTime = timer.time();
@@ -178,7 +177,7 @@ void fieldTest( const Field& f, double* array, long iter = 1000000, bool fulltes
// inv
timer.clear(); timer.start();
for( i = 0; i < iter; i++ ) {
- f.init(a, i); if (f.isZero(a)) f.init(a, 1);
+ f.init(a, i); if (f.isZero(a)) f.assign(a, f.one);
f.inv( returnValue, a);
f.addin(s, returnValue);
}
@@ -206,7 +205,7 @@ void fieldTest( const Field& f, double* array, long iter = 1000000, bool fulltes
// DotProduct1 ( dense * dense )
timer.clear(); timer.start();
- for( i = 0; i < iter/vectorSize; i++ ) {
+ for( i = 0; i < iter/(int)vectorSize; i++ ) {
f.init(dv1.back(), i);
VD.dot( returnValue, dv1, dv2 );
f.addin(s, returnValue);
@@ -217,9 +216,10 @@ void fieldTest( const Field& f, double* array, long iter = 1000000, bool fulltes
if (fulltest) {
// DotProduct2 ( dense * sparse )
timer.clear(); timer.start();
- for( i = 0; i < iter/vectorSize; i++ ) {
+ for( i = 0; i < iter/(int)vectorSize; i++ ) {
f.init(dv1.back(), i);
- for ( int j = 0; j < sparsity_inv; ++ j ) {
+ long sparsity_inv = 100;
+ for ( int j = 0; j < (int)sparsity_inv; ++ j ) {
f.init(dv1.front(), j);
VD.dot( returnValue, dv1, sv );
f.addin(s, returnValue);
@@ -231,8 +231,8 @@ void fieldTest( const Field& f, double* array, long iter = 1000000, bool fulltes
// Convert timings to mops (million operations per second)
for( i = 0; i < 9; i++ ) {
- double t = array[i];
- array[i] = (double)iter / (t > 0 ? (t * 1000000) : 0) ;
+ double t = array[(size_t)i];
+ array[(size_t)i] = (double)iter / (t > 0 ? (t * 1000000) : 0) ;
}
// use s (just in case compiler cares)
if (f.isZero(s)) std::cout << "zero sum" << std::endl;
@@ -252,8 +252,8 @@ int64_t getOps(int unit)
double b = 1.3;
UserTimer opsClock;
opsClock.clear();
- long double c;
while( opsClock.time() < unit ) {
+ // long double c;
ops *= 2;
i = 0;
opsClock.start();
@@ -267,7 +267,7 @@ int64_t getOps(int unit)
b=a;
else
b = 2*a;
- c = a+b;
+ // c = a+b;
}
return ops;
@@ -294,9 +294,9 @@ void printTimings( double* timings, bool fulltest = false )
template <class Field>
void doTest(const char* name, integer& p, integer& exp, int64_t& iter, bool fulltest = false)
{
- static double mops[11];
if( FieldTraits<Field>::goodModulus( p ) &&
FieldTraits<Field>::goodExponent( exp ) ) {
+ static double mops[11];
Field fld( p, exp );
fieldTest( fld, mops, iter, fulltest);
// print name
@@ -348,18 +348,18 @@ int main(int argc, char** argv)
<< std::setw(12) << "axpy/(mul+add)"
<< std::endl;
- doTest< Modular<int8_t> >( "Modular<int8_t>", prime, exp, iterations, fulltest );
- doTest< Modular<int16_t> >( "Modular<int16_t>", prime, exp, iterations, fulltest );
- doTest< Modular<int32_t> >( "Modular<int32_t>", prime, exp, iterations, fulltest );
- //doTest< Modular<int> >( "Modular<int>", prime, exp, iterations, fulltest );
- doTest< Modular<double> >( "Modular<double>", prime, exp, iterations, fulltest );
- doTest< Modular<float> >( "Modular<float>", prime, exp, iterations, fulltest );
-
- //doTest< ModularBalanced<int8_t> >( "ModularBalanced<int8_t>", prime, exp, iterations, fulltest );
- //doTest< ModularBalanced<int16_t> >( "ModularBalanced<int16_t>", prime, exp, iterations, fulltest );
- doTest< ModularBalanced<int32_t> >( "ModularBalanced<int32_t>", prime, exp, iterations, fulltest );
- doTest< ModularBalanced<double> >( "ModularBalanced<double>", prime, exp, iterations, fulltest );
- doTest< ModularBalanced<float> >( "ModularBalanced<float>", prime, exp, iterations, fulltest );
+ doTest< Givaro::Modular<int8_t> >( "Givaro::Modular<int8_t>", prime, exp, iterations, fulltest );
+ doTest< Givaro::Modular<int16_t> >( "Givaro::Modular<int16_t>", prime, exp, iterations, fulltest );
+ doTest< Givaro::Modular<int32_t> >( "Givaro::Modular<int32_t>", prime, exp, iterations, fulltest );
+ //doTest< Givaro::Modular<int> >( "Givaro::Modular<int>", prime, exp, iterations, fulltest );
+ doTest< Givaro::Modular<double> >( "Givaro::Modular<double>", prime, exp, iterations, fulltest );
+ doTest< Givaro::Modular<float> >( "Givaro::Modular<float>", prime, exp, iterations, fulltest );
+
+ //doTest< Givaro::ModularBalanced<int8_t> >( "Givaro::ModularBalanced<int8_t>", prime, exp, iterations, fulltest );
+ //doTest< Givaro::ModularBalanced<int16_t> >( "Givaro::ModularBalanced<int16_t>", prime, exp, iterations, fulltest );
+ doTest< Givaro::ModularBalanced<int32_t> >( "Givaro::ModularBalanced<int32_t>", prime, exp, iterations, fulltest );
+ doTest< Givaro::ModularBalanced<double> >( "Givaro::ModularBalanced<double>", prime, exp, iterations, fulltest );
+ doTest< Givaro::ModularBalanced<float> >( "Givaro::ModularBalanced<float>", prime, exp, iterations, fulltest );
doTest< ModularCrooked<double> >( "ModularCrooked<double>", prime, exp, iterations, fulltest );
diff --git a/tests/checker.C b/tests/checker.C
index 36a5f32..04d5124 100644
--- a/tests/checker.C
+++ b/tests/checker.C
@@ -1,414 +1,215 @@
/*
- * Copyright (c) 2011 LinBox
+ * Copyright (c) 2015 LinBox
+ * This file is part of the library LinBox. See COPYING for license info.
* Written by bds.
- *
- * ========LICENCE========
- * This file is part of the library LinBox.
- *
- * LinBox is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- * ========LICENCE========
-
*/
/** @file tests/checker.C
@brief script to run LinBox tests
Checker is compiled and run by the check macro invoked by "make fullcheck" in the top source dir or in tests/.
-Run without args, checker prints an explanation of command line options, then proceeds with default test behaviour. "checker -h" just prints the options.
-
-Each LinBox test gets a line below. A LinBox unit/regresssion test has a default behaviour -- when there are no command line file names -- in which nothing is written to any output stream and the return value is 0 for a passing test, nonzero for any failure.
+Run without args,
+each test is build and run, with a one line report of success or failure.
+A summary at the end reports number of test failing to compile, failing at runtime, and skipped.
+There should be a 1-1 correspondence between files tests/test-*.C and report lines
-The current convention is that (1) linbox' check macro, checker.C, runs the tests with no command line parameters at all, and (2) if there is a command line file name, verbose diagnostic output is written to that file and more terse output may be written to standard output streams. The second feature is intended to assist debugging with individual tests.
+A LinBox unit/regresssion test has a default behaviour -- when there are no command line file names -- in which nothing is written to any output stream and the return value is 0 for a passing test, nonzero for any failure.
-In future, command line arguments could be used in checking to vary matrix sizes and other parameters in check runs.
+The current convention is that (1) linbox' checker.C, runs the tests with no command line parameters at all, and (2) if there is a command line file name, verbose diagnostic output is written to that file and more terse output may be written to standard output streams. The second feature is intended to assist debugging with individual tests.
-There should be a 1-1 correspondence between files tests/test-*.C and calls
-here to build_n_run() or no_build_n_run() (possibly commented out).
*/
#include <cstdlib>
#include <iostream>
#include <fstream>
#include <sstream>
+#include <map>
+#include <set>
+#include <vector>
//#include <iomanip>
using namespace std;
-
-#include "fflas-ffpack/fflas-ffpack-config.h"
-#include "../linbox/linbox-config.h"
-
-struct counts {
- int pass;
- int buildfail;
- int runfail;
- int skipped;
- counts() :
- pass(0), buildfail(0), runfail(0), skipped(0)
- {}
- int total()
- {
- return pass + buildfail + runfail;
- }
-};
-
-void build_n_run(string s, counts& cnt, int flag = 2, string r = "") ;
-void no_build_n_run(string s, counts& cnt, int flag = 2, string r = "") ;
-
-int main(int argc, char* argv[])
-{
- int f = 0; // f = 1 ==> force recompile all tests.
- int flag = 1; // verbosity flag.
-
- bool check = false;// true for install time check
+#include "linbox/linbox-config.h"
+//#include "fflas-ffpack/fflas-ffpack.h"
+
+// globals
+//map< string, string> skip_note;
+map< string, string> warn_note;
+set< string> skips;
+set< string> hides;
+void warn(const string& t, const string& w) { warn_note[t] = w; }
+void skip(const string& t, const string& w) { warn_note[t] = w; skips.insert(t); }
+void hide(const string& t, const string& w) { warn_note[t] = w; hides.insert(t); }
+
+int main(int argc, char* argv[]) {
int arg;
- for (arg = 1; arg < argc && argv[arg][0] == '-'; ++ arg)
- switch (argv[arg][1]) {
- case 'r': f = 1; break;
- case 'f': flag = atoi(argv[++arg]); break;
- case 'c': check = true; break;
- default:
- cout << "usage: " << argv[0] << " [-r] [-f n] [-c] [test]*" << endl;
- cout << " -f 0 for a summary: only 4 lines printed." << endl;
- cout << " -f 1 for default: also one line per test." << endl;
- cout << " -f 2 for warnings: shows subtest failures." << endl;
- cout << " -f 3 for errors: also any build and run output for error cases." << endl;
- cout << " -f 4 for verbose: also any build and run output for each test." << endl;
- cout << " -r forces rebuild of all tests." << endl;
- cout << " -c conducts an install time check (a few selected tests only)." << endl;
- cout << " if any [test] is present, it is built and run, otherwise all tests are processed." << endl;
+ bool force_build = false, reporting = true, honor_skips = true;
+ for (arg = 1; arg < argc; ++arg)
+ for (char * i = argv[arg]; *i != 0; ++i){
+ if (*i == 'r') force_build = true;
+ if (*i == 's') reporting = false;
+ if (*i == 'a') honor_skips = false;
+ }
+ if (argc > 1 and not force_build and reporting and honor_skips){ // bogus arg
+ cout << "usage: " << argv[0] << " [-][r][s][a]" << endl;
+ cout << " -r Force recompilation of each test."<< endl;
+ cout << " -s Summary only: 3 lines printed. (Default is one line per test.)" << endl;
+ cout << " -a Build and run all. (Ignore skip and hide commands.)" << endl;
return 0;
}
- flag = flag+5*f; // clean up later
-#if 0
- else {
- if (argv[1][0] == 's') flag = 0; // summary
- if (argv[1][0] == 'd') flag = 1; // default
- if (argv[1][0] == 'w') flag = 2; // warnings
- if (argv[1][0] == 'e') flag = 3; // errors
- if (argv[1][0] == 'v') flag = 3; // verbose
- if (argc > 2 && argv[2] == "rebuild") flag += 5; // force rebuilds
- }
-#endif
- // the setup
- system("rm -f checkdata");
-#if 0
- string compiler;
- //system("make -n ");
- system("make -n checkerdata > checkdata");
- ifstream fin("checkdata", ifstream::in);
- do {getline(fin, compiler);}
- while (fin && compiler.find("something") == compiler.npos);
- cout << compiler << endl << endl;
- system("rm -f checkdata");
-#endif
-
- // the tests
- counts counter;
-
- // if only specific test(s) specified
- if (arg < argc) {
- for (; arg < argc; ++arg)
- build_n_run(argv[arg], counter , flag);
- return counter.buildfail || counter.runfail ? -1 : 0;
- }
-
-/*
-Each test gets a line below. A LinBox unit/regresssion test has a default behaviour -- when there are no command line file names -- in which nothing is written to any output stream and the return value is 0 for a passing test, nonzero for any failure.
-
-The current convention is that (1) linbox' check macro, checker.C, runs the tests with no command line parameters at all, and (2) if there is a command line file name, verbose diagnostic output is written to that file and more terse output may be written to standard output streams. The second feature is intended to assist debugging with individual tests.
-
-In future, command line arguments could be used in checking to vary matrix sizes and other parameters in check runs.
-
-There should be a 1-1 correspondence between files tests/test-*.C and calls
-here to build_n_run or no_build_n_run (possibly commented out).
-Thus "ls test-*.C |wc" and "grep test- checker.C |grep \
-build |wc" should yield the same number of lines.
-*/
-
- if (check) {
- build_n_run("test-charpoly", counter , flag);//, "intermittent inf loop, bb or cp responsible?");
- build_n_run("test-cra", counter , flag);
- build_n_run("test-det", counter , flag);
- build_n_run("test-frobenius", counter , flag);
- build_n_run("test-rank", counter , flag);
- build_n_run("test-qlup", counter , flag);
- build_n_run("test-solve", counter , flag);
- build_n_run("test-nullspace", counter , flag);
- build_n_run("test-rat-solve", counter , flag); // "infinite loop");
- build_n_run("test-rat-minpoly", counter , flag); // "intermittent failures");
- build_n_run("test-rational-solver", counter , flag);
- build_n_run("test-smith-form", counter , flag);
- build_n_run("test-smith-form-adaptive", counter , flag);
- build_n_run("test-smith-form-iliopoulos", counter , flag);
- build_n_run("test-smith-form-binary", counter , flag);
- return counter.buildfail || counter.runfail ? -1 : 0;
- } else {
-//BASIC_TESTS
- build_n_run("test-bitonic-sort", counter , flag);
- build_n_run("test-blackbox-block-container", counter , flag);
- build_n_run("test-blas-domain", counter , flag);
- build_n_run("test-block-ring", counter , flag);
- no_build_n_run("test-block-wiedemann", counter , flag, "bds tracking down BlasMatrix bug");
- no_build_n_run("test-bmseq", counter , flag, "under development by George Yuhasz");
- build_n_run("test-butterfly", counter , flag);
- build_n_run("test-charpoly", counter , flag);//, "intermittent inf loop, bb or cp responsible?");
- build_n_run("test-commentator", counter , flag);
- build_n_run("test-companion", counter , flag);
- build_n_run("test-cra", counter , flag);
- build_n_run("test-cradomain", counter , flag,"intermittent failure, as in 1 every 10-20");
- build_n_run("test-dense", counter , flag);
- build_n_run("test-det", counter , flag);
- build_n_run("test-diagonal", counter , flag);
- build_n_run("test-dif", counter , flag);
- build_n_run("test-direct-sum", counter , flag);
- build_n_run("test-dyadic-to-rational", counter , flag, "bds responsible");
- build_n_run("test-ffpack", counter , flag);
- build_n_run("test-frobenius", counter , flag);
- build_n_run("test-getentry", counter , flag);
- build_n_run("test-gf2", counter , flag);
- build_n_run("test-gmp-rational", counter , flag);
- build_n_run("test-hilbert", counter , flag);
- build_n_run("test-hom", counter , flag);
- build_n_run("test-inverse", counter , flag);
- build_n_run("test-isposdef", counter , flag);
- build_n_run("test-ispossemidef", counter , flag);
- build_n_run("test-last-invariant-factor", counter , flag);
- build_n_run("test-matrix-domain", counter , flag);
- build_n_run("test-matrix-stream", counter , flag);
- no_build_n_run("test-mg-block-lanczos", counter , flag, "fails");
- build_n_run("test-minpoly", counter , flag);
- build_n_run("test-modular", counter , flag);
- build_n_run("test-modular-balanced-int", counter , flag);
- build_n_run("test-modular-balanced-float", counter , flag);
- build_n_run("test-modular-balanced-double", counter , flag);
- build_n_run("test-modular-byte", counter , flag);
- build_n_run("test-modular-double", counter , flag);
- build_n_run("test-modular-float", counter , flag);
- build_n_run("test-modular-int", counter , flag);
- build_n_run("test-modular-short", counter , flag);
- build_n_run("test-moore-penrose", counter , flag);
- build_n_run("test-nullspace", counter , flag);
- build_n_run("test-PID-integer", counter , flag);
- build_n_run("test-qlup", counter , flag);
- build_n_run("test-randiter-nonzero", counter , flag);
- build_n_run("test-rank", counter , flag);
- build_n_run("test-rational-matrix-factory ", counter , flag);
- build_n_run("test-rational-reconstruction-base", counter , flag);
- build_n_run("test-rat-charpoly", counter , flag);//, "infinite loop, cp responsible?");
- build_n_run("test-scalar-matrix", counter , flag);
- build_n_run("test-smith-form-binary", counter , flag);
- build_n_run("test-solve", counter , flag);
- build_n_run("test-sparse", counter , flag);
- build_n_run("test-subiterator", counter , flag);
- build_n_run("test-submatrix", counter , flag);
- build_n_run("test-subvector", counter , flag);
- build_n_run("test-sum", counter , flag);
- build_n_run("test-rational-solver", counter , flag);
- build_n_run("test-trace", counter , flag);
- build_n_run("test-triplesbb", counter , flag);
- build_n_run("test-unparametric-field", counter , flag); //has been useful in num/sym.
- build_n_run("test-vector-domain", counter , flag);
- build_n_run("test-zero-one", counter , flag);
-
-#if __LINBOX_HAVE_GIVARO
-// if (flag > 0) cout << " Givaro tests" << endl;
- build_n_run("test-givaro-fields", counter , flag, "may fail on small fields because of supposed non-randomness or failure to find a non trivial element");
- //build_n_run("test-givaro-zpz", counter , flag, "superceded by test-givaro-fields");
- //build_n_run("test-givaro-zpzuns", counter , flag, "superceded by test-givaro-fields");
- build_n_run("test-rat-solve", counter , flag); // "infinite loop");
- build_n_run("test-rat-minpoly", counter , flag); // "intermittent failures");
-#else
- if (flag > 0) cout << " not doing Givaro dependent tests" << endl;
- cout << "Configuration problem? __LINBOX_HAVE_GIVARO is not set, but LinBox requires Givaro" << endl;
- counter.skipped += 4;
-#endif
-
-#if __FFLASFFPACK_HAVE_LAPACK
- if (flag > 0) cout << " Lapack dependent tests" << endl;
- build_n_run("test-rational-solver-adaptive", counter, flag);
- // needs output cleanup. Resolve whether a benchmark or a test.
- build_n_run("test-solve-nonsingular", counter, flag, "BY responsible");
-#else
- if (flag > 0) cout << " not doing Lapack dependent tests" << endl;
- no_build_n_run("test-rational-solver-adaptive", counter, flag);
- // needs output cleanup. Resolve whether a benchmark or a test.
- no_build_n_run("test-solve-nonsingular", counter, flag, "BY responsible");
-#endif
-
-#if __LINBOX_HAVE_NTL
- if (flag > 0) cout << " NTL dependent tests" << endl;
- build_n_run("test-ntl-hankel", counter , flag);
- build_n_run("test-ntl-lzz_p", counter , flag);
- build_n_run("test-ntl-toeplitz", counter , flag);
- build_n_run("test-ntl-sylvester", counter , flag);
- no_build_n_run("test-ntl-RR", counter , flag, "floating point equality");
- build_n_run("test-ntl-ZZ_p", counter , flag);
- build_n_run("test-toeplitz-det", counter , flag);
- build_n_run("test-smith-form", counter , flag);
- build_n_run("test-smith-form-adaptive", counter , flag);
- build_n_run("test-smith-form-iliopoulos", counter , flag);
-#else
- if (flag > 0) cout << " not doing NTL dependent tests" << endl;
- no_build_n_run("test-ntl-hankel", counter , flag);
- no_build_n_run("test-ntl-lzz_p", counter , flag);
- no_build_n_run("test-ntl-toeplitz", counter , flag);
- no_build_n_run("test-ntl-RR", counter , flag, "floating point equality");
- no_build_n_run("test-ntl-sylvester", counter , flag);
- no_build_n_run("test-ntl-ZZ_p", counter , flag);
- no_build_n_run("test-toeplitz-det", counter , flag, "can we have non NTL version?");
- no_build_n_run("test-smith-form", counter , flag);
- no_build_n_run("test-smith-form-adaptive", counter , flag);
- no_build_n_run("test-smith-form-iliopoulos", counter , flag);
-#endif
-
-#if __LINBOX_HAVE_LIDIA
- if (flag > 0) cout << " Lidia dependent tests" << endl;
- build_n_run("./test-lidia-gfq", counter, flag);
-#else
- if (flag > 0) cout << " not doing Lidia dependent test" << endl;
- no_build_n_run("test-lidia-gfq", counter, flag);
-#endif
-
-#if __LINBOX_HAVE_ATLAS
- if (flag > 0) cout << " Atlas dependent tests" << endl;
- no_build_n_run("./test-optimization", counter, flag, "not a test");
-#else
- if (flag > 0) cout << " not doing Atlas dependent test" << endl;
- no_build_n_run("test-optimization", counter, flag, "not a test");
-#endif
- // tests of "doubles as a field" which doesn't adhere to LinBox field or ring specs.
- if (flag > 0) cout << " Noncompliant tests" << endl;
- build_n_run("test-param-fuzzy", counter, flag);
-
-#if 1
- if (flag > 0) cout << " Tests requiring further development" << endl;
- build_n_run("test-smith-form-local", counter, flag, "bds"); //"intermittent failures");
- no_build_n_run("test-ftrmm", counter, flag, "bb/cp");
-
- if (flag > 0) cout << " Immature tests" << endl;
- no_build_n_run("test-quad-matrix", counter, flag, "half baked, bds responsible"); no_build_n_run("test-dense-zero-one", counter, flag, "half baked, bds responsible"); build_n_run("test-zo", counter, flag, "half baked, BY responsible");
- // test-integer-tools -- there is no test-integer-tools.C file
- // no one has taken these on.
- no_build_n_run("test-la-block-lanczos",counter,flag,"segfaults");
-#endif
-
-#if 0
- if (flag > 0) cout << " Non tests" << endl;
- no_build_n_run("test-template", counter, flag, "yup, model for tests, not an actual test");
- // test-common.C is included in test-common.h,
- // but could be separately compiled (no templates).
- no_build_n_run("test-common", counter, flag, "not a test");
- no_build_n_run("test-fields", counter, flag, "deprecated");
- no_build_n_run("test-matrix", counter, flag, "deprecated?");
- no_build_n_run("test-image-field", counter, flag, "deprecated");
-
-//BENCHMARKS =
- build_n_run("benchmark-fields", counter, flag, "not a test");
- build_n_run("benchmark-blas-domain", counter, flag, "not a test");
-
-# I put test-gssv_rank in hmrg:~saunders/gen_superlu. It is not linbox until and unless it is made to work
-# test-gssv is an ntl test
+// fullcheck customization: warnings, skips, hides, optional package dependencies
+
+//// notes section (customize fullcheck here) ////
+
+if (honor_skips) {
+hide("test-block-ring", "non commutative rings not supported");
+//hide("test-ffpack", "testTURBO fails, move to ffpack tests?");
+hide("test-ftrmm", "should move to attic");
+skip("test-givaro-fields", "may fail on small fields because of supposed non-randomness or failure to find a non trivial element");
+hide("test-image-field", "deprecated");
+//skip("test-isposdef", "intermittent inf loop");
+//skip("test-ispossemidef", "intermittent inf loop");
+hide("test-la-block-lanczos", "not maintained. operator >> missing");
+hide("test-mg-block-lanczos", "not maintained");
+hide("test-modular", "deprecated");
+hide("test-modular-byte", "deprecated");
+hide("test-modular-short", "deprecated");
+//skip("test-modular-balanced-int", "test and modular-balanced disagree on init/convert");
+//skip("test-modular-balanced-double", "test and modular-balanced disagree on init/convert");
+//skip("test-moore-penrose", "inf loop");
+skip("test-optimization", "not in test form");
+skip("test-quad-matrix", "depends on out-of-date blackbox/zo.h");
+//skip("test-rational-reconstruction-base", "inf loop");
+skip("test-rat-charpoly", "inf loop");
+skip("test-rat-minpoly", "stale test. solns over QQ need fresh tests"); // "intermittent failures")
+skip("test-rat-solve", "stale test. solns over QQ need fresh tests"); // "infinite loop")
+skip("test-poly-det", "incomplete test (if still relevant)");
+skip("test-sparse-map-map", "const issue in givranditer, curious use of nonexistant next() in Extension");
+//Tests requiring further development
+skip("test-tutorial", "incomplete test");
+skip("test-dense-zero-one", "half baked, bds responsible");
+}
-# no explicit test needed, I guess...
-# Transpose is tested in test-triplesbb
-# Compose is tested in test-butterfly
+//warn("test-echelon-form", "new");
+warn("test-fibb", "incomplete");
+//warn("test-matrix-domain", "intermittent row permutation failure");
+warn("test-param-fuzzy", "Noncompliant field");
+// template <class F2Field> BitVector (const F2Field&) {}
+//warn("test-qlup", "GF2 fails to compile");
+//warn("test-rank-u32", "intermittent failure"/*, "vector (bb) responsible"*/);
+warn("test-rat-charpoly", "stale test. solns over QQ need fresh tests");//, "infinite loop, cp responsible?")
+warn("test-rat-solve", "infinite loop");
+//warn("test-smith-form-local", "bds, intermittent failures");
+warn("test-solve", "most of the tests are commented out");
+warn("test-toom-cook", "one method does not work");
+//warn("test-transpose", "sometimes fails on Sparsematrix/getEntry");
+warn("test-quad-matrix", "half baked, bds responsible");
+
+
+//// optional package dependency section ////
+ set< string> ntl_tests;
+ ntl_tests.insert("test-ntl-hankel");
+ ntl_tests.insert("test-ntl-lzz_p");
+ ntl_tests.insert("test-ntl-lzz_pe");
+ ntl_tests.insert("test-ntl-lzz_px");
+ ntl_tests.insert("test-ntl-lzz_pex");
+ warn("test-toeplitz-det", "we should have a non NTL version.");
+ ntl_tests.insert("test-toeplitz-det");
+ warn("test-ntl-rr", "floating point equality");
+ ntl_tests.insert("test-ntl-rr");
+ ntl_tests.insert("test-ntl-sylvester");
+ ntl_tests.insert("test-ntl-toeplitz");
+ ntl_tests.insert("test-ntl-zz_p");
+
+ // are these really ntl dependent?
+ ntl_tests.insert("test-smith-form");
+ ntl_tests.insert("test-smith-form-adaptive");
+ ntl_tests.insert("test-smith-form-iliopoulos");
+ set< string> ocl_tests;
+ ocl_tests.insert("test-opencl-domain");
+
+//// Things are automatic from here onward. ////
+
+ // process optional dependencies
+ #ifndef LINBOX_HAVE_OCL
+ for (set< string>::iterator i = ocl_tests.begin(); i != ocl_tests.end(); ++i)
+ skip(*i, "OpenCL not present");
+ #endif
+ #ifndef __LINBOX_HAVE_NTL
+ for (set< string>::iterator i = ntl_tests.begin(); i != ntl_tests.end(); ++i)
+ skip(*i, "NTL not present");
+ #endif
+// build and run the tests section
+ string t, cmd;
+ system("ls test-*C >.tmp-tests");
+ ifstream tests(".tmp-tests");
+ int buildfail = 0, runfail = 0, skipped = 0, pass = 0; // counts
+ vector<string> all_tests;
+ while (tests >> t) {t.resize(t.size()-2); all_tests.push_back(t);}
+//#ifdef LINBOX_HAVE_OPENMP
+//#pragma omp parallel for
+//PARFOR1D(i, 0, all_tests.size(), SPLITTER(),
+//#endif
+ for (size_t i = 0; i < all_tests.size(); ++i)
+ {
+ t = all_tests[i];
+ if (hides.count(t) > 0) continue; // ignore entirely
+ stringstream report;
+ report.width(35);
+ report << left << t;
+ if (skips.count(t) > 0) { // print skip message
+ report << "skipped, " + warn_note[t];
+ skipped++;
+ } else { // do build
+ if (force_build) {
+ cmd = "touch " + t + ".C";
+ system(cmd.c_str());
+ }
+ // build
+ cmd = "make " + t + " 2> /dev/null > /dev/null";
+ report << "build ";
+ int status = system(cmd.c_str());
+// #ifndef LINBOX_HAVE_OPENMP
+// if (status == 2) break;
+// #endif
+ if (status != 0) { // build failure
+ buildfail++;
+ report << "FAIL ";
+ } else {// do run
+ report << "OK, run ";
+ std::ostringstream prog ;
+ prog << "./" << t ;
+ status = system(prog.str().c_str());
+// #ifndef LINBOX_HAVE_OPENMP
+// if (status == 2) break;
+// #endif
+ if (status == 0) {
+ report << "OK. " + warn_note[t];
+ pass++;
+ } else {
+ runfail++;
+ report << "FAIL" + warn_note[t];
+ }
+ }
+ }
+ if (reporting) cout << report.str() << endl;
+ } // for i
+ //); // parfor
-#endif
- }
- // the summary
+ //// summary ////
cout << "--------------------------------------------------------------------" << endl;
- if (counter.buildfail || counter.runfail)
- cout << "Of " << counter.total() << " tests, "
- << counter.buildfail << " failed to compile and "
- << counter.runfail << " failed at runtime."
- << " (" << counter.skipped << " skipped tests.)" << endl;
+ int total = pass + buildfail + runfail + skipped;
+ if (buildfail || runfail)
+ cout << "Of " << total << " tests, "
+ << pass << " passed, "
+ << buildfail << " failed to compile, "
+ << runfail << " failed at runtime, "
+ << " and " << skipped << " were skipped." << endl;
else
- cout << endl << "All " << counter.total() << " tests pass."
- << " (" << counter.skipped << " skipped tests.)" << endl;
- cout << " File tests/checkdata contains any output from the builds and runs." << endl;
+ cout << endl << "All " << total - skipped << " tests pass."
+ << " (There were " << skipped << " skipped tests.)" << endl;
cout << "--------------------------------------------------------------------" << endl;
- return counter.buildfail || counter.runfail ? -1 : 0;
-}
-
-void no_build_n_run(string s, counts& cnt, int flag, string r)
-{
- if (flag >= 5) flag -= 5;
- if (flag > 0) {
- cout.width(35); cout << left << s;
- if (r.length() > 0) cout << "skipped, " << r << "." << endl;
- else cout << "skipped." << endl;
- }
- cnt.skipped++;
-}
-
-void build_n_run(string s, counts& cnt, int flag, string r)
-{
-// ignore r.
- string cmd;
- if (flag >= 5) { // force build
- flag -= 5;
- cmd = "touch " + s + ".C";
- system(cmd.c_str());
- }
- if (flag >= 1) {
- cout.width(35); cout << left << s;
- cout << "build"; cout.flush();
- }
- cmd = "make " + s + " 2>> checkdata >> checkdata";
- int status = system(cmd.c_str());
- if (status == 2) goto abort; // valid on at least one platform.
- if (status != 0) { // build failure
- if (flag >= 1) cout << " FAILS" << endl;
- if (flag >= 3) system ("cat checkdata; rm checkdata");
- cnt.buildfail++;
- // if (flag == 2) could grep for first "error" in compiler output
-
- }
- else { // build success
- if (flag >= 1) { cout << "\b\b\b\b\b run"; cout.flush(); }
- std::ostringstream prog ;
- prog << "./" << s ;
- status = system(prog.str().c_str());
- if (status == 2) goto abort; // valid on at least one platform.
- if (status != 0) {
- if (flag >= 1) cout << " FAILS" << endl;
- if (flag >= 3) system ("cat checkdata; rm checkdata");
- cnt.runfail++;
- }
- else {
- if (flag >= 1) cout << "\b\b\b\bOK " << endl;
- if (flag >= 2) system ("grep \"warn\" checkdata; rm checkdata");
- cnt.pass++;
- //cerr << "ok" << endl;
- }
- }
- if (flag >= 3) system("rm -f checkdata");
- return;
-abort:
- cout << endl << "Interrupted, aborting." << endl;
- exit(-1);
-}
-
-
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
-// Local Variables:
-// mode: C++
-// tab-width: 8
-// indent-tabs-mode: nil
-// c-basic-offset: 8
-// End:
-
+ return buildfail || runfail ? -1 : 0;
+} // main
diff --git a/tests/data/Makefile.am b/tests/data/Makefile.am
index a0fd89f..de774b0 100644
--- a/tests/data/Makefile.am
+++ b/tests/data/Makefile.am
@@ -20,7 +20,6 @@
EXTRA_DIST = \
- test.matrix \
sms.matrix \
matrix-market-array.matrix \
maple-sparse1.matrix \
@@ -28,3 +27,6 @@ EXTRA_DIST = \
generic-dense.matrix \
sparse-row.matrix \
matrix-market-coordinate.matrix
+
+# test.matrix \
+ #
diff --git a/tests/data/Makefile.in b/tests/data/Makefile.in
deleted file mode 100644
index 0cbfb2d..0000000
--- a/tests/data/Makefile.in
+++ /dev/null
@@ -1,475 +0,0 @@
-# Makefile.in generated by automake 1.11.5 from Makefile.am.
-# @configure_input@
-
-# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software
-# Foundation, Inc.
-# This Makefile.in is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
-# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
-# PARTICULAR PURPOSE.
-
- at SET_MAKE@
-
-# Copyright (c) 2010 the LinBox group
-# ========LICENCE========
-# This file is part of the library LinBox.
-#
-# LinBox is free software: you can redistribute it and/or modify
-# it under the terms of the GNU Lesser General Public
-# License as published by the Free Software Foundation; either
-# version 2.1 of the License, or (at your option) any later version.
-#
-# This library 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
-# Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public
-# License along with this library; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
-# ========LICENCE========
-VPATH = @srcdir@
-am__make_dryrun = \
- { \
- am__dry=no; \
- case $$MAKEFLAGS in \
- *\\[\ \ ]*) \
- echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \
- | grep '^AM OK$$' >/dev/null || am__dry=yes;; \
- *) \
- for am__flg in $$MAKEFLAGS; do \
- case $$am__flg in \
- *=*|--*) ;; \
- *n*) am__dry=yes; break;; \
- esac; \
- done;; \
- esac; \
- test $$am__dry = yes; \
- }
-pkgdatadir = $(datadir)/@PACKAGE@
-pkgincludedir = $(includedir)/@PACKAGE@
-pkglibdir = $(libdir)/@PACKAGE@
-pkglibexecdir = $(libexecdir)/@PACKAGE@
-am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
-install_sh_DATA = $(install_sh) -c -m 644
-install_sh_PROGRAM = $(install_sh) -c
-install_sh_SCRIPT = $(install_sh) -c
-INSTALL_HEADER = $(INSTALL_DATA)
-transform = $(program_transform_name)
-NORMAL_INSTALL = :
-PRE_INSTALL = :
-POST_INSTALL = :
-NORMAL_UNINSTALL = :
-PRE_UNINSTALL = :
-POST_UNINSTALL = :
-build_triplet = @build@
-host_triplet = @host@
-subdir = tests/data
-DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in
-ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-am__aclocal_m4_deps = $(top_srcdir)/macros/aclocal-include.m4 \
- $(top_srcdir)/macros/config-header.m4 \
- $(top_srcdir)/macros/debug.m4 \
- $(top_srcdir)/macros/expat-check.m4 \
- $(top_srcdir)/macros/fflas-ffpack-check.m4 \
- $(top_srcdir)/macros/fplll-check.m4 \
- $(top_srcdir)/macros/givaro-check.m4 \
- $(top_srcdir)/macros/gmp-check.m4 \
- $(top_srcdir)/macros/iml-check.m4 \
- $(top_srcdir)/macros/lapack-check.m4 \
- $(top_srcdir)/macros/libtool.m4 \
- $(top_srcdir)/macros/lidia-check.m4 \
- $(top_srcdir)/macros/linbox-benchmark.m4 \
- $(top_srcdir)/macros/linbox-doc.m4 \
- $(top_srcdir)/macros/linbox-misc.m4 \
- $(top_srcdir)/macros/linbox-opt.m4 \
- $(top_srcdir)/macros/ltoptions.m4 \
- $(top_srcdir)/macros/ltsugar.m4 \
- $(top_srcdir)/macros/ltversion.m4 \
- $(top_srcdir)/macros/lt~obsolete.m4 \
- $(top_srcdir)/macros/m4ri-check.m4 \
- $(top_srcdir)/macros/m4rie-check.m4 \
- $(top_srcdir)/macros/maple-check.m4 \
- $(top_srcdir)/macros/mpfr-check.m4 \
- $(top_srcdir)/macros/ntl-check.m4 \
- $(top_srcdir)/macros/saclib-check.m4 \
- $(top_srcdir)/macros/sage-check.m4 $(top_srcdir)/configure.ac
-am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
- $(ACLOCAL_M4)
-mkinstalldirs = $(install_sh) -d
-CONFIG_HEADER = $(top_builddir)/config.h
-CONFIG_CLEAN_FILES =
-CONFIG_CLEAN_VPATH_FILES =
-depcomp =
-am__depfiles_maybe =
-SOURCES =
-DIST_SOURCES =
-am__can_run_installinfo = \
- case $$AM_UPDATE_INFO_DIR in \
- n|no|NO) false;; \
- *) (install-info --version) >/dev/null 2>&1;; \
- esac
-DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
-ACLOCAL = @ACLOCAL@
-AMTAR = @AMTAR@
-AR = @AR@
-AUTOCONF = @AUTOCONF@
-AUTOHEADER = @AUTOHEADER@
-AUTOMAKE = @AUTOMAKE@
-AWK = @AWK@
-BLAS_CFLAGS = @BLAS_CFLAGS@
-BLAS_LIBS = @BLAS_LIBS@
-CC = @CC@
-CCNAM = @CCNAM@
-CFLAGS = @CFLAGS@
-CPPFLAGS = @CPPFLAGS@
-CXX = @CXX@
-CXXCPP = @CXXCPP@
-CXXFLAGS = @CXXFLAGS@
-CYGPATH_W = @CYGPATH_W@
-DBG = @DBG@
-DEBUG_CFLAGS = @DEBUG_CFLAGS@
-DEFAULT_CFLAGS = @DEFAULT_CFLAGS@
-DEFS = @DEFS@
-DLLTOOL = @DLLTOOL@
-DSYMUTIL = @DSYMUTIL@
-DUMPBIN = @DUMPBIN@
-ECHO_C = @ECHO_C@
-ECHO_N = @ECHO_N@
-ECHO_T = @ECHO_T@
-EGREP = @EGREP@
-EXEEXT = @EXEEXT@
-EXPAT_CFLAGS = @EXPAT_CFLAGS@
-EXPAT_LIBS = @EXPAT_LIBS@
-FFLAS_FFPACK_CFLAGS = @FFLAS_FFPACK_CFLAGS@
-FFLAS_FFPACK_LIBS = @FFLAS_FFPACK_LIBS@
-FFLAS_FFPACK_LOC = @FFLAS_FFPACK_LOC@
-FGREP = @FGREP@
-FPLLL_CFLAGS = @FPLLL_CFLAGS@
-FPLLL_LIBS = @FPLLL_LIBS@
-GIVARO_CFLAGS = @GIVARO_CFLAGS@
-GIVARO_LIBS = @GIVARO_LIBS@
-GMP_CFLAGS = @GMP_CFLAGS@
-GMP_LIBS = @GMP_LIBS@
-GMP_VERSION = @GMP_VERSION@
-GREP = @GREP@
-IML_CFLAGS = @IML_CFLAGS@
-IML_LIBS = @IML_LIBS@
-INSTALL = @INSTALL@
-INSTALL_DATA = @INSTALL_DATA@
-INSTALL_PROGRAM = @INSTALL_PROGRAM@
-INSTALL_SCRIPT = @INSTALL_SCRIPT@
-INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
-LD = @LD@
-LDFLAGS = @LDFLAGS@
-LIBOBJS = @LIBOBJS@
-LIBS = @LIBS@
-LIBTOOL = @LIBTOOL@
-LIDIA_CFLAGS = @LIDIA_CFLAGS@
-LIDIA_LIBS = @LIDIA_LIBS@
-LINBOX_BENCH_PATH = @LINBOX_BENCH_PATH@
-LINBOX_DOC_PATH = @LINBOX_DOC_PATH@
-LIPO = @LIPO@
-LN_S = @LN_S@
-LTLIBOBJS = @LTLIBOBJS@
-M4RIE_CFLAGS = @M4RIE_CFLAGS@
-M4RIE_LIBS = @M4RIE_LIBS@
-M4RI_CFLAGS = @M4RI_CFLAGS@
-M4RI_LIBS = @M4RI_LIBS@
-MAINT = @MAINT@
-MAKEINFO = @MAKEINFO@
-MANIFEST_TOOL = @MANIFEST_TOOL@
-MAPLE_CFLAGS = @MAPLE_CFLAGS@
-MAPLE_HOME = @MAPLE_HOME@
-MAPLE_LIBS = @MAPLE_LIBS@
-MAPLE_VERSION = @MAPLE_VERSION@
-MKDIR_P = @MKDIR_P@
-MPFR_CFLAGS = @MPFR_CFLAGS@
-MPFR_LIBS = @MPFR_LIBS@
-NM = @NM@
-NMEDIT = @NMEDIT@
-NTL_CFLAGS = @NTL_CFLAGS@
-NTL_LIBS = @NTL_LIBS@
-OBJDUMP = @OBJDUMP@
-OBJEXT = @OBJEXT@
-OTOOL = @OTOOL@
-OTOOL64 = @OTOOL64@
-PACKAGE = @PACKAGE@
-PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
-PACKAGE_NAME = @PACKAGE_NAME@
-PACKAGE_STRING = @PACKAGE_STRING@
-PACKAGE_TARNAME = @PACKAGE_TARNAME@
-PACKAGE_URL = @PACKAGE_URL@
-PACKAGE_VERSION = @PACKAGE_VERSION@
-PATH_SEPARATOR = @PATH_SEPARATOR@
-PROF = @PROF@
-RANLIB = @RANLIB@
-RM = @RM@
-SACLIB_CFLAGS = @SACLIB_CFLAGS@
-SACLIB_LIBS = @SACLIB_LIBS@
-SED = @SED@
-SET_MAKE = @SET_MAKE@
-SHELL = @SHELL@
-STRIP = @STRIP@
-TESTS_CFLAGS = @TESTS_CFLAGS@
-VERSION = @VERSION@
-WARN = @WARN@
-abs_builddir = @abs_builddir@
-abs_srcdir = @abs_srcdir@
-abs_top_builddir = @abs_top_builddir@
-abs_top_srcdir = @abs_top_srcdir@
-ac_ct_AR = @ac_ct_AR@
-ac_ct_CC = @ac_ct_CC@
-ac_ct_CXX = @ac_ct_CXX@
-ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
-am__leading_dot = @am__leading_dot@
-am__tar = @am__tar@
-am__untar = @am__untar@
-bindir = @bindir@
-build = @build@
-build_alias = @build_alias@
-build_cpu = @build_cpu@
-build_os = @build_os@
-build_vendor = @build_vendor@
-builddir = @builddir@
-datadir = @datadir@
-datarootdir = @datarootdir@
-docdir = @docdir@
-dvidir = @dvidir@
-exec_prefix = @exec_prefix@
-host = @host@
-host_alias = @host_alias@
-host_cpu = @host_cpu@
-host_os = @host_os@
-host_vendor = @host_vendor@
-htmldir = @htmldir@
-includedir = @includedir@
-infodir = @infodir@
-install_sh = @install_sh@
-libdir = @libdir@
-libexecdir = @libexecdir@
-localedir = @localedir@
-localstatedir = @localstatedir@
-mandir = @mandir@
-mkdir_p = @mkdir_p@
-oldincludedir = @oldincludedir@
-pdfdir = @pdfdir@
-prefix = @prefix@
-program_transform_name = @program_transform_name@
-psdir = @psdir@
-sbindir = @sbindir@
-sharedstatedir = @sharedstatedir@
-srcdir = @srcdir@
-sysconfdir = @sysconfdir@
-target_alias = @target_alias@
-top_build_prefix = @top_build_prefix@
-top_builddir = @top_builddir@
-top_srcdir = @top_srcdir@
-EXTRA_DIST = \
- test.matrix \
- sms.matrix \
- matrix-market-array.matrix \
- maple-sparse1.matrix \
- maple-dense1.matrix \
- generic-dense.matrix \
- sparse-row.matrix \
- matrix-market-coordinate.matrix
-
-all: all-am
-
-.SUFFIXES:
-$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps)
- @for dep in $?; do \
- case '$(am__configure_deps)' in \
- *$$dep*) \
- ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
- && { if test -f $@; then exit 0; else break; fi; }; \
- exit 1;; \
- esac; \
- done; \
- echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu --ignore-deps tests/data/Makefile'; \
- $(am__cd) $(top_srcdir) && \
- $(AUTOMAKE) --gnu --ignore-deps tests/data/Makefile
-.PRECIOUS: Makefile
-Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
- @case '$?' in \
- *config.status*) \
- cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
- *) \
- echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
- cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
- esac;
-
-$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
- cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-
-$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
- cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
- cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-$(am__aclocal_m4_deps):
-
-mostlyclean-libtool:
- -rm -f *.lo
-
-clean-libtool:
- -rm -rf .libs _libs
-tags: TAGS
-TAGS:
-
-ctags: CTAGS
-CTAGS:
-
-
-distdir: $(DISTFILES)
- @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
- topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
- list='$(DISTFILES)'; \
- dist_files=`for file in $$list; do echo $$file; done | \
- sed -e "s|^$$srcdirstrip/||;t" \
- -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
- case $$dist_files in \
- */*) $(MKDIR_P) `echo "$$dist_files" | \
- sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
- sort -u` ;; \
- esac; \
- for file in $$dist_files; do \
- if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
- if test -d $$d/$$file; then \
- dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
- if test -d "$(distdir)/$$file"; then \
- find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
- fi; \
- if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
- cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
- find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
- fi; \
- cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
- else \
- test -f "$(distdir)/$$file" \
- || cp -p $$d/$$file "$(distdir)/$$file" \
- || exit 1; \
- fi; \
- done
-check-am: all-am
-check: check-am
-all-am: Makefile
-installdirs:
-install: install-am
-install-exec: install-exec-am
-install-data: install-data-am
-uninstall: uninstall-am
-
-install-am: all-am
- @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
-
-installcheck: installcheck-am
-install-strip:
- if test -z '$(STRIP)'; then \
- $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
- install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
- install; \
- else \
- $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
- install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
- "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
- fi
-mostlyclean-generic:
-
-clean-generic:
-
-distclean-generic:
- -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
- -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
-
-maintainer-clean-generic:
- @echo "This command is intended for maintainers to use"
- @echo "it deletes files that may require special tools to rebuild."
-clean: clean-am
-
-clean-am: clean-generic clean-libtool mostlyclean-am
-
-distclean: distclean-am
- -rm -f Makefile
-distclean-am: clean-am distclean-generic
-
-dvi: dvi-am
-
-dvi-am:
-
-html: html-am
-
-html-am:
-
-info: info-am
-
-info-am:
-
-install-data-am:
-
-install-dvi: install-dvi-am
-
-install-dvi-am:
-
-install-exec-am:
-
-install-html: install-html-am
-
-install-html-am:
-
-install-info: install-info-am
-
-install-info-am:
-
-install-man:
-
-install-pdf: install-pdf-am
-
-install-pdf-am:
-
-install-ps: install-ps-am
-
-install-ps-am:
-
-installcheck-am:
-
-maintainer-clean: maintainer-clean-am
- -rm -f Makefile
-maintainer-clean-am: distclean-am maintainer-clean-generic
-
-mostlyclean: mostlyclean-am
-
-mostlyclean-am: mostlyclean-generic mostlyclean-libtool
-
-pdf: pdf-am
-
-pdf-am:
-
-ps: ps-am
-
-ps-am:
-
-uninstall-am:
-
-.MAKE: install-am install-strip
-
-.PHONY: all all-am check check-am clean clean-generic clean-libtool \
- distclean distclean-generic distclean-libtool distdir dvi \
- dvi-am html html-am info info-am install install-am \
- install-data install-data-am install-dvi install-dvi-am \
- install-exec install-exec-am install-html install-html-am \
- install-info install-info-am install-man install-pdf \
- install-pdf-am install-ps install-ps-am install-strip \
- installcheck installcheck-am installdirs maintainer-clean \
- maintainer-clean-generic mostlyclean mostlyclean-generic \
- mostlyclean-libtool pdf pdf-am ps ps-am uninstall uninstall-am
-
-
-# Tell versions [3.59,3.63) of GNU make to not export all variables.
-# Otherwise a system limit (for SysV at least) may be exceeded.
-.NOEXPORT:
diff --git a/tests/data/matrix-market-coordinate.matrix b/tests/data/matrix-market-coordinate.matrix
index d7902d0..738c6bd 100644
--- a/tests/data/matrix-market-coordinate.matrix
+++ b/tests/data/matrix-market-coordinate.matrix
@@ -1,4 +1,5 @@
%%MatrixMarket maTRIX COORDINATE inteGER gENERal
+%
11 11 33
1 3 2
1 4 3
diff --git a/tests/data/test.matrix b/tests/data/test.matrix
deleted file mode 100644
index 6455a6e..0000000
--- a/tests/data/test.matrix
+++ /dev/null
@@ -1,10 +0,0 @@
-0 0 2
-1 1 2
-2 2 2
-3 3 2
-4 4 2
-5 5 2
-6 6 2
-7 7 2
-8 8 2
-9 9 2
\ No newline at end of file
diff --git a/tests/matrix/Makefile.in b/tests/matrix/Makefile.in
deleted file mode 100644
index 262b374..0000000
--- a/tests/matrix/Makefile.in
+++ /dev/null
@@ -1,474 +0,0 @@
-# Makefile.in generated by automake 1.11.5 from Makefile.am.
-# @configure_input@
-
-# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software
-# Foundation, Inc.
-# This Makefile.in is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
-# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
-# PARTICULAR PURPOSE.
-
- at SET_MAKE@
-
-# Copyright (c) 2011 the LinBox group
-# ========LICENCE========
-# This file is part of the library LinBox.
-#
-# LinBox is free software: you can redistribute it and/or modify
-# it under the terms of the GNU Lesser General Public
-# License as published by the Free Software Foundation; either
-# version 2.1 of the License, or (at your option) any later version.
-#
-# This library 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
-# Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public
-# License along with this library; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
-# ========LICENCE========
-VPATH = @srcdir@
-am__make_dryrun = \
- { \
- am__dry=no; \
- case $$MAKEFLAGS in \
- *\\[\ \ ]*) \
- echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \
- | grep '^AM OK$$' >/dev/null || am__dry=yes;; \
- *) \
- for am__flg in $$MAKEFLAGS; do \
- case $$am__flg in \
- *=*|--*) ;; \
- *n*) am__dry=yes; break;; \
- esac; \
- done;; \
- esac; \
- test $$am__dry = yes; \
- }
-pkgdatadir = $(datadir)/@PACKAGE@
-pkgincludedir = $(includedir)/@PACKAGE@
-pkglibdir = $(libdir)/@PACKAGE@
-pkglibexecdir = $(libexecdir)/@PACKAGE@
-am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
-install_sh_DATA = $(install_sh) -c -m 644
-install_sh_PROGRAM = $(install_sh) -c
-install_sh_SCRIPT = $(install_sh) -c
-INSTALL_HEADER = $(INSTALL_DATA)
-transform = $(program_transform_name)
-NORMAL_INSTALL = :
-PRE_INSTALL = :
-POST_INSTALL = :
-NORMAL_UNINSTALL = :
-PRE_UNINSTALL = :
-POST_UNINSTALL = :
-build_triplet = @build@
-host_triplet = @host@
-subdir = tests/matrix
-DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in
-ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-am__aclocal_m4_deps = $(top_srcdir)/macros/aclocal-include.m4 \
- $(top_srcdir)/macros/config-header.m4 \
- $(top_srcdir)/macros/debug.m4 \
- $(top_srcdir)/macros/expat-check.m4 \
- $(top_srcdir)/macros/fflas-ffpack-check.m4 \
- $(top_srcdir)/macros/fplll-check.m4 \
- $(top_srcdir)/macros/givaro-check.m4 \
- $(top_srcdir)/macros/gmp-check.m4 \
- $(top_srcdir)/macros/iml-check.m4 \
- $(top_srcdir)/macros/lapack-check.m4 \
- $(top_srcdir)/macros/libtool.m4 \
- $(top_srcdir)/macros/lidia-check.m4 \
- $(top_srcdir)/macros/linbox-benchmark.m4 \
- $(top_srcdir)/macros/linbox-doc.m4 \
- $(top_srcdir)/macros/linbox-misc.m4 \
- $(top_srcdir)/macros/linbox-opt.m4 \
- $(top_srcdir)/macros/ltoptions.m4 \
- $(top_srcdir)/macros/ltsugar.m4 \
- $(top_srcdir)/macros/ltversion.m4 \
- $(top_srcdir)/macros/lt~obsolete.m4 \
- $(top_srcdir)/macros/m4ri-check.m4 \
- $(top_srcdir)/macros/m4rie-check.m4 \
- $(top_srcdir)/macros/maple-check.m4 \
- $(top_srcdir)/macros/mpfr-check.m4 \
- $(top_srcdir)/macros/ntl-check.m4 \
- $(top_srcdir)/macros/saclib-check.m4 \
- $(top_srcdir)/macros/sage-check.m4 $(top_srcdir)/configure.ac
-am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
- $(ACLOCAL_M4)
-mkinstalldirs = $(install_sh) -d
-CONFIG_HEADER = $(top_builddir)/config.h
-CONFIG_CLEAN_FILES =
-CONFIG_CLEAN_VPATH_FILES =
-depcomp =
-am__depfiles_maybe =
-SOURCES =
-DIST_SOURCES =
-am__can_run_installinfo = \
- case $$AM_UPDATE_INFO_DIR in \
- n|no|NO) false;; \
- *) (install-info --version) >/dev/null 2>&1;; \
- esac
-DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
-ACLOCAL = @ACLOCAL@
-AMTAR = @AMTAR@
-AR = @AR@
-AUTOCONF = @AUTOCONF@
-AUTOHEADER = @AUTOHEADER@
-AUTOMAKE = @AUTOMAKE@
-AWK = @AWK@
-BLAS_CFLAGS = @BLAS_CFLAGS@
-BLAS_LIBS = @BLAS_LIBS@
-CC = @CC@
-CCNAM = @CCNAM@
-CFLAGS = @CFLAGS@
-CPPFLAGS = @CPPFLAGS@
-CXX = @CXX@
-CXXCPP = @CXXCPP@
-CXXFLAGS = @CXXFLAGS@
-CYGPATH_W = @CYGPATH_W@
-DBG = @DBG@
-DEBUG_CFLAGS = @DEBUG_CFLAGS@
-DEFAULT_CFLAGS = @DEFAULT_CFLAGS@
-DEFS = @DEFS@
-DLLTOOL = @DLLTOOL@
-DSYMUTIL = @DSYMUTIL@
-DUMPBIN = @DUMPBIN@
-ECHO_C = @ECHO_C@
-ECHO_N = @ECHO_N@
-ECHO_T = @ECHO_T@
-EGREP = @EGREP@
-EXEEXT = @EXEEXT@
-EXPAT_CFLAGS = @EXPAT_CFLAGS@
-EXPAT_LIBS = @EXPAT_LIBS@
-FFLAS_FFPACK_CFLAGS = @FFLAS_FFPACK_CFLAGS@
-FFLAS_FFPACK_LIBS = @FFLAS_FFPACK_LIBS@
-FFLAS_FFPACK_LOC = @FFLAS_FFPACK_LOC@
-FGREP = @FGREP@
-FPLLL_CFLAGS = @FPLLL_CFLAGS@
-FPLLL_LIBS = @FPLLL_LIBS@
-GIVARO_CFLAGS = @GIVARO_CFLAGS@
-GIVARO_LIBS = @GIVARO_LIBS@
-GMP_CFLAGS = @GMP_CFLAGS@
-GMP_LIBS = @GMP_LIBS@
-GMP_VERSION = @GMP_VERSION@
-GREP = @GREP@
-IML_CFLAGS = @IML_CFLAGS@
-IML_LIBS = @IML_LIBS@
-INSTALL = @INSTALL@
-INSTALL_DATA = @INSTALL_DATA@
-INSTALL_PROGRAM = @INSTALL_PROGRAM@
-INSTALL_SCRIPT = @INSTALL_SCRIPT@
-INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
-LD = @LD@
-LDFLAGS = @LDFLAGS@
-LIBOBJS = @LIBOBJS@
-LIBS = @LIBS@
-LIBTOOL = @LIBTOOL@
-LIDIA_CFLAGS = @LIDIA_CFLAGS@
-LIDIA_LIBS = @LIDIA_LIBS@
-LINBOX_BENCH_PATH = @LINBOX_BENCH_PATH@
-LINBOX_DOC_PATH = @LINBOX_DOC_PATH@
-LIPO = @LIPO@
-LN_S = @LN_S@
-LTLIBOBJS = @LTLIBOBJS@
-M4RIE_CFLAGS = @M4RIE_CFLAGS@
-M4RIE_LIBS = @M4RIE_LIBS@
-M4RI_CFLAGS = @M4RI_CFLAGS@
-M4RI_LIBS = @M4RI_LIBS@
-MAINT = @MAINT@
-MAKEINFO = @MAKEINFO@
-MANIFEST_TOOL = @MANIFEST_TOOL@
-MAPLE_CFLAGS = @MAPLE_CFLAGS@
-MAPLE_HOME = @MAPLE_HOME@
-MAPLE_LIBS = @MAPLE_LIBS@
-MAPLE_VERSION = @MAPLE_VERSION@
-MKDIR_P = @MKDIR_P@
-MPFR_CFLAGS = @MPFR_CFLAGS@
-MPFR_LIBS = @MPFR_LIBS@
-NM = @NM@
-NMEDIT = @NMEDIT@
-NTL_CFLAGS = @NTL_CFLAGS@
-NTL_LIBS = @NTL_LIBS@
-OBJDUMP = @OBJDUMP@
-OBJEXT = @OBJEXT@
-OTOOL = @OTOOL@
-OTOOL64 = @OTOOL64@
-PACKAGE = @PACKAGE@
-PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
-PACKAGE_NAME = @PACKAGE_NAME@
-PACKAGE_STRING = @PACKAGE_STRING@
-PACKAGE_TARNAME = @PACKAGE_TARNAME@
-PACKAGE_URL = @PACKAGE_URL@
-PACKAGE_VERSION = @PACKAGE_VERSION@
-PATH_SEPARATOR = @PATH_SEPARATOR@
-PROF = @PROF@
-RANLIB = @RANLIB@
-RM = @RM@
-SACLIB_CFLAGS = @SACLIB_CFLAGS@
-SACLIB_LIBS = @SACLIB_LIBS@
-SED = @SED@
-SET_MAKE = @SET_MAKE@
-SHELL = @SHELL@
-STRIP = @STRIP@
-TESTS_CFLAGS = @TESTS_CFLAGS@
-VERSION = @VERSION@
-WARN = @WARN@
-abs_builddir = @abs_builddir@
-abs_srcdir = @abs_srcdir@
-abs_top_builddir = @abs_top_builddir@
-abs_top_srcdir = @abs_top_srcdir@
-ac_ct_AR = @ac_ct_AR@
-ac_ct_CC = @ac_ct_CC@
-ac_ct_CXX = @ac_ct_CXX@
-ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
-am__leading_dot = @am__leading_dot@
-am__tar = @am__tar@
-am__untar = @am__untar@
-bindir = @bindir@
-build = @build@
-build_alias = @build_alias@
-build_cpu = @build_cpu@
-build_os = @build_os@
-build_vendor = @build_vendor@
-builddir = @builddir@
-datadir = @datadir@
-datarootdir = @datarootdir@
-docdir = @docdir@
-dvidir = @dvidir@
-exec_prefix = @exec_prefix@
-host = @host@
-host_alias = @host_alias@
-host_cpu = @host_cpu@
-host_os = @host_os@
-host_vendor = @host_vendor@
-htmldir = @htmldir@
-includedir = @includedir@
-infodir = @infodir@
-install_sh = @install_sh@
-libdir = @libdir@
-libexecdir = @libexecdir@
-localedir = @localedir@
-localstatedir = @localstatedir@
-mandir = @mandir@
-mkdir_p = @mkdir_p@
-oldincludedir = @oldincludedir@
-pdfdir = @pdfdir@
-prefix = @prefix@
-program_transform_name = @program_transform_name@
-psdir = @psdir@
-sbindir = @sbindir@
-sharedstatedir = @sharedstatedir@
-srcdir = @srcdir@
-sysconfdir = @sysconfdir@
-target_alias = @target_alias@
-top_build_prefix = @top_build_prefix@
-top_builddir = @top_builddir@
-top_srcdir = @top_srcdir@
-EXTRA_DIST = \
- coin.h \
- hadamard.h \
- invhilb.h \
- jmat.h \
- minmax.h \
- randomans.h\
- randommat.h
-
-all: all-am
-
-.SUFFIXES:
-$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps)
- @for dep in $?; do \
- case '$(am__configure_deps)' in \
- *$$dep*) \
- ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
- && { if test -f $@; then exit 0; else break; fi; }; \
- exit 1;; \
- esac; \
- done; \
- echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu --ignore-deps tests/matrix/Makefile'; \
- $(am__cd) $(top_srcdir) && \
- $(AUTOMAKE) --gnu --ignore-deps tests/matrix/Makefile
-.PRECIOUS: Makefile
-Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
- @case '$?' in \
- *config.status*) \
- cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
- *) \
- echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
- cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
- esac;
-
-$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
- cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-
-$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
- cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
- cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-$(am__aclocal_m4_deps):
-
-mostlyclean-libtool:
- -rm -f *.lo
-
-clean-libtool:
- -rm -rf .libs _libs
-tags: TAGS
-TAGS:
-
-ctags: CTAGS
-CTAGS:
-
-
-distdir: $(DISTFILES)
- @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
- topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
- list='$(DISTFILES)'; \
- dist_files=`for file in $$list; do echo $$file; done | \
- sed -e "s|^$$srcdirstrip/||;t" \
- -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
- case $$dist_files in \
- */*) $(MKDIR_P) `echo "$$dist_files" | \
- sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
- sort -u` ;; \
- esac; \
- for file in $$dist_files; do \
- if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
- if test -d $$d/$$file; then \
- dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
- if test -d "$(distdir)/$$file"; then \
- find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
- fi; \
- if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
- cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
- find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
- fi; \
- cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
- else \
- test -f "$(distdir)/$$file" \
- || cp -p $$d/$$file "$(distdir)/$$file" \
- || exit 1; \
- fi; \
- done
-check-am: all-am
-check: check-am
-all-am: Makefile
-installdirs:
-install: install-am
-install-exec: install-exec-am
-install-data: install-data-am
-uninstall: uninstall-am
-
-install-am: all-am
- @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
-
-installcheck: installcheck-am
-install-strip:
- if test -z '$(STRIP)'; then \
- $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
- install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
- install; \
- else \
- $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
- install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
- "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
- fi
-mostlyclean-generic:
-
-clean-generic:
-
-distclean-generic:
- -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
- -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
-
-maintainer-clean-generic:
- @echo "This command is intended for maintainers to use"
- @echo "it deletes files that may require special tools to rebuild."
-clean: clean-am
-
-clean-am: clean-generic clean-libtool mostlyclean-am
-
-distclean: distclean-am
- -rm -f Makefile
-distclean-am: clean-am distclean-generic
-
-dvi: dvi-am
-
-dvi-am:
-
-html: html-am
-
-html-am:
-
-info: info-am
-
-info-am:
-
-install-data-am:
-
-install-dvi: install-dvi-am
-
-install-dvi-am:
-
-install-exec-am:
-
-install-html: install-html-am
-
-install-html-am:
-
-install-info: install-info-am
-
-install-info-am:
-
-install-man:
-
-install-pdf: install-pdf-am
-
-install-pdf-am:
-
-install-ps: install-ps-am
-
-install-ps-am:
-
-installcheck-am:
-
-maintainer-clean: maintainer-clean-am
- -rm -f Makefile
-maintainer-clean-am: distclean-am maintainer-clean-generic
-
-mostlyclean: mostlyclean-am
-
-mostlyclean-am: mostlyclean-generic mostlyclean-libtool
-
-pdf: pdf-am
-
-pdf-am:
-
-ps: ps-am
-
-ps-am:
-
-uninstall-am:
-
-.MAKE: install-am install-strip
-
-.PHONY: all all-am check check-am clean clean-generic clean-libtool \
- distclean distclean-generic distclean-libtool distdir dvi \
- dvi-am html html-am info info-am install install-am \
- install-data install-data-am install-dvi install-dvi-am \
- install-exec install-exec-am install-html install-html-am \
- install-info install-info-am install-man install-pdf \
- install-pdf-am install-ps install-ps-am install-strip \
- installcheck installcheck-am installdirs maintainer-clean \
- maintainer-clean-generic mostlyclean mostlyclean-generic \
- mostlyclean-libtool pdf pdf-am ps ps-am uninstall uninstall-am
-
-
-# Tell versions [3.59,3.63) of GNU make to not export all variables.
-# Otherwise a system limit (for SysV at least) may be exceeded.
-.NOEXPORT:
diff --git a/tests/matrix/invhilb.h b/tests/matrix/invhilb.h
index 1d7eccb..78e45c5 100644
--- a/tests/matrix/invhilb.h
+++ b/tests/matrix/invhilb.h
@@ -41,12 +41,12 @@ Matrix& invhilb(const Ring& R, Matrix& Mat, int n){
if(i>1) p = ((n-i+1)*p*(n+i-1))/((i-1)*(i-1));
r = p*p;
R.init(val, (r/(2*i-1)));
- Mat.setEntry(i_ind, i_ind, val);
+ Mat.setEntry((size_t)i_ind,(size_t) i_ind, val);
for(j_ind=i, j = i+1; j <= n; j++, j_ind++){
r = -1*((n-j+1)*r*(n+j-1))/((j-1)*(j-1));
R.init(val, (r/(i+j-1)));
- Mat.setEntry(i_ind, j_ind, val);
- Mat.setEntry(j_ind, i_ind, val);
+ Mat.setEntry((size_t)i_ind, (size_t)j_ind, val);
+ Mat.setEntry((size_t)j_ind, (size_t)i_ind, val);
}
}
diff --git a/tests/matrix/minmax.h b/tests/matrix/minmax.h
index 4502f2e..8c15dc7 100644
--- a/tests/matrix/minmax.h
+++ b/tests/matrix/minmax.h
@@ -58,13 +58,15 @@ Matrix& maxmat(const Ring& R, Matrix& Mat, size_t n){
template<class Ring, class Matrix>
Matrix& qlehmer(const Ring& R, Matrix& Mat, size_t n){
size_t val;
- typename Ring::Element tmp;
+ typename Ring::Element tmp, tmp2;
for(size_t i = 0; i < n; ++i){
for(size_t j = 0; j < n; ++j){
val = i > j ? i : j;
val++;
- R.init(tmp, val*val);
+ R.init(tmp, val);
+ R.init(tmp2, val);
+ R.mulin(tmp, tmp2);
Mat.setEntry(i, j, tmp);
}
}
diff --git a/tests/matrix/randomans.h b/tests/matrix/randomans.h
index fcf0d58..cb7bf3e 100644
--- a/tests/matrix/randomans.h
+++ b/tests/matrix/randomans.h
@@ -57,21 +57,22 @@ Matrix& randomAns(const Ring& R, Matrix& Mat, size_t n, size_t epr){
val = neg*(rand()%CEILING);
// choose random location for value
do{
- pos = int(rand()%n); // pos in [0, n)
+ pos = int((size_t)rand()%n); // pos in [0, n)
}
while(used(usedV, pos));
usedV[k] = pos; // record location
//std::cerr << "\t set value " << val << " in pos " << pos << std::endl;
// finally, set entry
- Mat.setEntry(i, pos, R.init(tmp, val));
+ Mat.setEntry((size_t)i, (size_t)pos, R.init(tmp, val));
}
}
+ //! @bug use BlasVector.
// to store each element in our final row
vector<typename Ring::Element> tmps(n);
for(size_t i=0; i<n; ++i)
- R.init(tmps[i], 0);
+ R.assign(tmps[i], R.zero);
// build last row incorporate every row
for(size_t i = 0; i < n-1; ++i){
@@ -80,17 +81,17 @@ Matrix& randomAns(const Ring& R, Matrix& Mat, size_t n, size_t epr){
val = neg*(rand()%COMB_CEILING);
// val is the multiplier for this row
for(size_t j = 0; j < n; ++j){
- R.axpyin(tmps[j], val, Mat.getEntry(i, j));
+ R.axpyin(tmps[j], val, Mat.getEntry((size_t)i, (size_t)j));
}
}
for(size_t i=0; i<n; ++i)
- Mat.setEntry(n-1, i, tmps[i]);
+ Mat.setEntry((size_t)n-1, (size_t)i, tmps[i]);
// add one to random value
- size_t wildcard = rand()%n;
- R.init(tmp, Mat.getEntry(n-1, wildcard));
+ size_t wildcard = (size_t)rand()%n;
+ R.init(tmp, Mat.getEntry((size_t)n-1, (size_t)wildcard));
R.addin(tmp, 1);
- Mat.setEntry(n-1, wildcard, tmp);
+ Mat.setEntry((size_t)n-1, (size_t)wildcard, tmp);
return Mat;
}
diff --git a/tests/matrix/randommat.h b/tests/matrix/randommat.h
index e0ac291..ff22052 100644
--- a/tests/matrix/randommat.h
+++ b/tests/matrix/randommat.h
@@ -62,15 +62,15 @@ Matrix& randomMat(const Ring& R, Matrix& Mat, size_t n, size_t epr){
val = neg*(rand()%CEILING);
// choose random location for value
do{
- pos = int(rand()%n); // pos in [0, n)
+ pos = int((size_t)rand()%n); // pos in [0, n)
}
while(used(usedV, pos));
usedV[k] = pos; // record location
//std::cerr << "\t set value " << val << " in pos " << pos << std::endl;
// finally, set entry
- //Mat.setEntry(i, pos, R.init(tmp, 1));
- Mat.setEntry(i, pos, R.init(tmp, val));
+ //Mat.setEntry(i, pos, R.assign(tmp, R.one));
+ Mat.setEntry((size_t)i, (size_t)pos, R.init(tmp, val));
}
}
diff --git a/tests/perfpublisher.sh b/tests/perfpublisher.sh
new file mode 100755
index 0000000..2c3c452
--- /dev/null
+++ b/tests/perfpublisher.sh
@@ -0,0 +1,158 @@
+#!/bin/bash
+# Script to format tests results into a single xml file.
+# See https://wiki.jenkins-ci.org/display/JENKINS/PerfPublisher+Plugin
+# -----
+# 2014/11/17 - Written by AB <Alexis.Breust at imag.fr>
+
+XMLFILE=$1
+tests=$2
+COMPILER=$3
+
+#=================#
+# Plateform infos #
+#=================#
+
+COMPILERVERSION=$($COMPILER --version 2>&1 | head -1)
+CPUFREQ=$(lscpu | grep "MHz" | rev | cut -f1 -d' ' | rev)
+ARCH=$(uname -m)
+OSNAME=$(uname -s)
+OSVERSION=$(uname -r)
+
+if hash lsb_release 2>/dev/null
+ then DISTRIB=$(lsb_release -ds)
+ else DISTRIB='Unknown distribution'
+fi
+
+#==========#
+# Prologue #
+#==========#
+
+if [[ -f $XMLFILE ]]
+then
+ echo '----> WARNING: File '$XMLFILE' is not empty.'
+ echo '----> Results will be added to its end.'
+fi
+
+#========#
+# Header #
+#========#
+
+echo '<?xml version="1.0" encoding="UTF-8"?>' >> $XMLFILE
+echo '<report name="tests-report" categ="tests">' >> $XMLFILE
+
+#=======#
+# Start #
+#=======#
+
+echo '<start>' >> $XMLFILE
+echo '<date format="YYYYMMDD" val="'$(date +%Y%m%d)'" />' >> $XMLFILE
+echo '<time format="HHMMSS" val="'$(date +%H%M%S)'" />' >> $XMLFILE
+echo '</start>' >> $XMLFILE
+
+#=======#
+# Tests #
+#=======#
+
+for test in $tests
+do
+ if [[ ! -f $test ]]
+ then
+ #File does not exist: compile it
+ echo '[Compiling]' $test
+ COMPILESTART=$(date +%s%3N)
+ COMPILELOG=$(make $test 2>&1; echo 'Returned state: '$?)
+ COMPILEEND=$(date +%s%3N)
+ COMPILETIME=$(($COMPILEEND - $COMPILESTART))
+ COMPILECHECK=$(echo $COMPILELOG | grep -o '[^ ]*$')
+ COMPILETIMERELEVANT='true'
+ else
+ #File does exist
+ echo '[Already compiled]' $benchmark
+ COMPILELOG='(Previously compiled)'
+ COMPILETIME='0.0'
+ COMPILECHECK='0'
+ COMPILETIMERELEVANT='false'
+ fi
+
+ if [[ $COMPILECHECK -ne 0 ]]
+ then
+ #Compilation failure
+ # EXECUTED='no' - keep it to yes so that Jenkins
+ # uses it within its results
+ EXECUTED='yes'
+ PASSED='no'
+ STATE='0'
+ EXECUTIONLOG='(Not executed)'
+ EXECUTIONTIME='0.0'
+ COMPILETIMERELEVANT='false'
+ EXECUTIONTIMERELEVANT='false'
+ ERRORLOG='Does not compile.'
+ echo '-> Does not compile.'
+ else
+ #Compilation success
+ echo '[Executing]' $test
+ EXECUTED='yes'
+ EXECUTIONSTART=$(date +%s%3N)
+ EXECUTIONLOG=$(./$test 2>&1; echo 'Returned state: '$?)
+ EXECUTIONEND=$(date +%s%3N)
+ EXECUTIONTIME=$(($EXECUTIONEND - $EXECUTIONSTART))
+ EXECUTIONCHECK=$(echo $EXECUTIONLOG | grep -o '[^ ]*$')
+
+ if [[ $EXECUTIONCHECK -ne 0 ]]
+ then
+ #Execution failure
+ PASSED='no'
+ STATE='0'
+ EXECUTIONTIMERELEVANT='false'
+ ERRORLOG='Execution failure.'
+ echo '-> Execution failure.'
+ else
+ #Execution success
+ PASSED='yes'
+ STATE='100'
+ EXECUTIONTIMERELEVANT='true'
+ ERRORLOG=''
+ fi
+ fi
+
+ echo '<test name="'$test'" executed="'$EXECUTED'">' >> $XMLFILE
+ echo '<targets><target>TEST</target></targets>' >> $XMLFILE
+ echo '<platform>' >> $XMLFILE
+ echo '<os>' >> $XMLFILE
+ echo '<name><![CDATA['$OSNAME']]></name>' >> $XMLFILE
+ echo '<version><![CDATA['$OSVERSION']]></version>' >> $XMLFILE
+ echo '<distribution><![CDATA['$DISTRIB']]></distribution>' >> $XMLFILE
+ echo '</os>' >> $XMLFILE
+ echo '<processor arch="'$ARCH'">' >> $XMLFILE
+ echo '<frequency unit="MHz" cpufreq="'$CPUFREQ'" />' >> $XMLFILE
+ echo '</processor>' >> $XMLFILE
+ echo '<compiler name="'$COMPILER'" version="'$COMPILERVERSION'" />' >> $XMLFILE
+ echo '</platform>' >> $XMLFILE
+ echo '<result>' >> $XMLFILE
+
+ # Logs
+ echo '<success passed="'$PASSED'" state="'$STATE'" />' >> $XMLFILE
+ echo '<errorlog><![CDATA['$ERRORLOG']]></errorlog>' >> $XMLFILE
+ echo '<log name="Compile output"><![CDATA['"$COMPILELOG"']]></log>' >> $XMLFILE
+ echo '<log name="Execution output"><![CDATA['"$test $EXECUTIONLOG"']]></log>' >> $XMLFILE
+
+ # Times
+ echo '<compiletime unit="ms" mesure="'$COMPILETIME'" isRelevant="'$COMPILETIMERELEVANT'" />' >> $XMLFILE
+ echo '<executiontime unit="ms" mesure="'$EXECUTIONTIME'" isRelevant="'$EXECUTIONTIMERELEVANT'" />' >> $XMLFILE
+
+ echo '</result>' >> $XMLFILE
+ echo '</test>' >> $XMLFILE
+done
+
+#========#
+# Footer #
+#========#
+
+echo '</report>' >> $XMLFILE
+
+#==========#
+# Epilogue #
+#==========#
+
+echo 'Results correctly exported to' $XMLFILE
+
diff --git a/tests/test-PID-integer.C b/tests/test-PID-integer.C
deleted file mode 100644
index d765b95..0000000
--- a/tests/test-PID-integer.C
+++ /dev/null
@@ -1,91 +0,0 @@
-
-/* tests/test-PID-integer.C
- * Copyright (C) 2011 Dave Saunders
- *
- * morphed from another test by Dave Saunders <saunders at cis.udel.edu>
- *
- *
- * ========LICENCE========
- * This file is part of the library LinBox.
- *
- * LinBox is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- * ========LICENCE========
- *.
- */
-
-/*! @file tests/test-PID-integer.C
- * @ingroup tests
- * @brief run runFieldTests testRandomIterator tests on PID_integer
- * @test run runFieldTests testRandomIterator tests on PID_integer
- */
-
-
-#include "linbox/linbox-config.h"
-
-#include <iostream>
-#include <fstream>
-#include <sstream>
-#include <vector>
-#include <queue>
-
-#include "test-common.h"
-#include "test-field.h"
-
-#include "linbox/field/PID-integer.h"
-
-using namespace LinBox;
-
-int main (int argc, char **argv)
-{
- static size_t n = 10000;
- static int iterations = 1;
- static int trials = 100000;
- static int categories = 100;
- static int hist_level = 1;
-
- static Argument args[] = {
- { 'n', "-n N", "Set dimension of test vectors to NxN.", TYPE_INT, &n },
- { 't', "-t T", "Number of trials for the random iterator test.", TYPE_INT, &trials },
- { 'c', "-c C", "Number of categories for the random iterator test.", TYPE_INT, &categories },
- { 'H', "-H H", "History level for random iterator test.", TYPE_INT, &hist_level },
- END_OF_ARGUMENTS
- };
-
- parseArguments (argc, argv, args);
-
- commentator().start("PID-integer ring test suite", "PID-integer");
- bool pass = true;
-
- PID_integer ZZ;
-
- // Make sure some more detailed messages get printed
- commentator().getMessageClass (INTERNAL_DESCRIPTION).setMaxDepth (4);
- commentator().getMessageClass (INTERNAL_DESCRIPTION).setMaxDetailLevel (Commentator::LEVEL_UNIMPORTANT);
-
- if (!runBasicRingTests (ZZ, "PID-integer", iterations, false)) pass = false;
-// if (!testRandomIterator (ZZ, "PID-integer", trials, categories, hist_level)) pass = false;
-
- commentator().stop("PID-integer, field test suite");
- return pass ? 0 : -1;
-}
-
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
-// Local Variables:
-// mode: C++
-// tab-width: 8
-// indent-tabs-mode: nil
-// c-basic-offset: 8
-// End:
-
diff --git a/tests/test-bitonic-sort.C b/tests/test-bitonic-sort.C
index 3563e9f..1f24904 100644
--- a/tests/test-bitonic-sort.C
+++ b/tests/test-bitonic-sort.C
@@ -36,6 +36,8 @@
#include "linbox/util/commentator.h"
#include "linbox/vector/stream.h"
#include "test-common.h"
+#include "linbox/vector/blas-vector.h"
+//#include "linbox/field/unparametric.h"
using namespace LinBox;
@@ -62,8 +64,11 @@ bool testRandom (std::ostream& report, size_t s)
Comparator comp;
- std::vector<int> v(s), d(s);
- std::vector<int>::iterator p1, p2;
+ typedef Givaro::ZRing<int> Ints ;
+ Ints I ;
+
+ BlasVector<Ints> v(I,s), d(I,s);
+ BlasVector<Ints>::iterator p1, p2;
for (p1 = v. begin(), p2 = d.begin(); p1 != v.end(); ++ p1, ++p2)
*p1 = *p2 = rand();
diff --git a/tests/test-blackbox-block-container.C b/tests/test-blackbox-block-container.C
index 1e925f7..e92c688 100644
--- a/tests/test-blackbox-block-container.C
+++ b/tests/test-blackbox-block-container.C
@@ -1,5 +1,4 @@
-
/* tests/test-blackbox-block-container.C
*
* Written by bds
@@ -35,20 +34,20 @@
* @brief no doc
* @test no doc.
*/
-
+#if 0
#include "linbox/linbox-config.h"
#include <iostream>
#include <fstream>
-#include <vector>
+
#include <cstdio>
#include "linbox/algorithms/blackbox-block-container.h"
#include "linbox/util/commentator.h"
-#include "linbox/field/modular.h"
+#include "linbox/ring/modular.h"
#include "test-common.h"
@@ -75,11 +74,11 @@ int main (int argc, char **argv)
commentator().start("block container test", "bbbc");
ostream& report = commentator().report (Commentator::LEVEL_NORMAL, INTERNAL_DESCRIPTION);
- report << "over Modular<double>" << endl;
- typedef Modular<double> Field;
+ report << "over Givaro::Modular<double>" << std::endl;
+ typedef Givaro::Modular<double> Field;
typedef BlasMatrix<Field> Block;
typedef BlasMatrix<Field> Blackbox;
- Modular<double> F (q);
+ Givaro::Modular<double> F (q);
Blackbox A(F, n, n);
Block U(F, k, n);
@@ -90,12 +89,171 @@ int main (int argc, char **argv)
BlackboxBlockContainer<Field, Blackbox> B(&A, F, U, V);
// A more thorough test should be constructed.
+#endif
+ /*
+ * Written by George Yuhasz <yuhasz at gmail.com>
+ *
+ * --------------------------------------------------------
+ *
+ */
+#include "linbox/linbox-config.h"
+
+#include <iostream>
+#include <givaro/modular.h>
+
+#include "linbox/util/commentator.h"
+#include "linbox/matrix/matrix-domain.h"
+#include "linbox/matrix/sparse-matrix.h"
+#include "linbox/matrix/dense-matrix.h"
+#include "linbox/algorithms/blackbox-block-container.h"
+
+#include "test-common.h"
+#include "test-generic.h"
+
+using namespace LinBox;
+// using namespace std;
+
+template<class Blackbox>
+bool testContainer (const Blackbox& A, size_t r, size_t c);
+
+int main (int argc, char **argv)
+{
+ bool pass = true;
+
+ static size_t n = 4;
+ static size_t r = 2;
+ static size_t c = 2;
+ static size_t q = 5;
+
+ static Argument args[] = {
+ { 'n', "-n N", "Set dimension of test matrices to NxN.", TYPE_INT, &n },
+ { 'r', "-r R", "Set rowdim of blocks R.", TYPE_INT, &r },
+ { 'c', "-c C", "Set coldim of blocks to C.", TYPE_INT, &c },
+ { 'q', "-q Q", "Operate over the \"field\" GF(Q) [1].", TYPE_INT, &q },
+ END_OF_ARGUMENTS
+ };
+
+ typedef Givaro::Modular<uint64_t> Field;
+
+ parseArguments (argc, argv, args);
+ Field F ((uint32_t)q);
+
+ commentator().start("bmseq test suite", "BlasMatrix");
+
+ commentator().getMessageClass (INTERNAL_DESCRIPTION).setMaxDepth (5);
+ commentator().getMessageClass (INTERNAL_DESCRIPTION).setMaxDetailLevel (Commentator::LEVEL_UNIMPORTANT);
+ // ostream &report = commentator().report (Commentator::LEVEL_IMPORTANT, INTERNAL_DESCRIPTION);
+
+ commentator().start("SparseMatrix test");
+ SparseMatrix<Field> A(F, n, n);
+ /*
+ if (n > 2) {
+ A.setEntry(0,1,F.one);
+ A.setEntry(1,2,F.one);
+ A.setEntry(2,0,F.one);
+ }
+ for(size_t i=(n > 2 ? 3 : 0); i<n;i++)
+ */
+ for(size_t i=0; i<n;i++)
+ A.setEntry(i,n-1-i,F.one);
+ pass = pass and testContainer(A, r, c);
+ commentator().stop("SparseMatrix test");
+
+#if 0 // BlackboxBlockContainer<BlasMatrix<..> > is not working.
+ commentator().start("BlasMatrix<Givaro::Modular<int> > test");
+ BlasMatrix<Field> B(F, n, n);
+ for(size_t i=0; i<n;i++)
+ B.setEntry(i,i,F.one);
+ pass = pass and testContainer(B, r, c);
+ commentator().stop("BlasMatrix<Givaro::Modular<int> > test");
+
+ commentator().start("BlasMatrix<Givaro::Modular<double> > test");
+ Givaro::Modular<double> G(q);
+ BlasMatrix<Givaro::Modular<double> > C(G, n, n);
+ for(size_t i=0; i<n;i++)
+ C.setEntry(i,i,G.one);
+ pass = pass and testContainer(C, r, c);
+ commentator().stop("BlasMatrix<Givaro::Modular<double> > test");
+#endif
+
+ // A more thorough test should be constructed.
if (pass) commentator().stop("block container test pass");
else commentator().stop("block container test FAIL");
return pass ? 0 : -1;
}
+template<class Blackbox>
+bool testContainer (const Blackbox& A, size_t r, size_t c) {
+ ostream &report = commentator().report (Commentator::LEVEL_IMPORTANT, INTERNAL_DESCRIPTION);
+ bool pass = true;
+ typedef typename Blackbox::Field Field;
+ MatrixDomain<Field> MD(A.field());
+ size_t n = A.rowdim(); // = A.coldim()
+ BlasMatrix<Field> U(A.field(),r,n);
+ BlasMatrix<Field> V(A.field(),n,c);
+ BlasMatrix<Field> AV(A.field(),n,c);
+ BlasMatrix<Field> UAV(A.field(),r,c);
+ typename Field::RandIter rand(A.field());
+ /*
+ for(size_t i=0; i<r;i++)
+ for(size_t j=0; j<n; j++)
+ U.setEntry(i,j, A.field().zero);
+ for(size_t i=0; i<r;i++)
+ U.setEntry(i,i, A.field().one);
+ */
+ for(size_t i=0; i<r;i++)
+ for(size_t j=0; j<n; j++)
+ rand.random(U.refEntry(i,j));
+
+ /*
+ for(size_t i=0; i<n;i++)
+ for(size_t j=0; j<c; j++)
+ V.setEntry(i,j, A.field().zero);
+ for(size_t i=0; i<c;i++)
+ V.setEntry(i,i, A.field().one);
+ */
+ for(size_t i=0; i<n;i++)
+ for(size_t j=0; j<c; j++){
+ rand.random(V.refEntry(i,j));
+ }
+ MD.copy(AV, V);
+ report << std::endl << "A" << std::endl;
+ A.write(report);
+ report << std::endl << "U" << std::endl;
+ U.write(report);
+ report << std::endl << "V" << std::endl;
+ V.write(report);
+ report << std::endl << "AV" << std::endl;
+ AV.write(report);
+ BlackboxBlockContainer<Field, Blackbox > blockseq(&A,A.field(),U,V);
+ MD.mul(UAV,U,AV);
+ typename BlackboxBlockContainer<Field, Blackbox >::const_iterator contiter(blockseq.begin());
+ report << std::endl << "container size is " << blockseq.size() << std::endl;
+ report << std::endl;
+ bool pass1 = MD.areEqual(UAV, *contiter);
+ if (not pass1) report << "sequences differ at index 0" << std::endl;
+ else report << "sequences agree at index 0" << std::endl;
+ report << "My UA^0V";
+ UAV.write(report) << std::endl;
+ report << "Container UA^0V";
+ (*contiter).write(report ) << std::endl << std::endl;
+ for (size_t i=1; i<10; i++){
+ MD.leftMulin(A,AV);
+ MD.mul(UAV,U,AV);
+ ++contiter;
+ pass1 = MD.areEqual(UAV, *contiter);
+ if (not pass1) report << "sequences differ at index " << i << std::endl;
+ else report << "sequences agree at index " << i << std::endl;
+ report << "My UA^" << i << "V ";
+ UAV.write(report) << std::endl;
+ report << "Container UA^" << i << "V ";
+ (*contiter).write(report) << std::endl << std::endl;
+ pass = pass and pass1;
+ }
+ return pass;
+}
+
// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
// Local Variables:
// mode: C++
diff --git a/tests/test-blackbox.h b/tests/test-blackbox.h
index 5ca3e7d..e40c593 100644
--- a/tests/test-blackbox.h
+++ b/tests/test-blackbox.h
@@ -11,20 +11,20 @@
* ------------------------------------
* fix testLinearity for rectangular matrices. 2006-02-17 Hui Wang
*
- *
+ *
* ========LICENCE========
* This file is part of the library LinBox.
- *
+ *
* LinBox is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
- *
+ *
* This library 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
* Lesser General Public License for more details.
- *
+ *
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
@@ -42,18 +42,29 @@
#include "linbox/util/commentator.h"
#include "linbox/util/field-axpy.h"
#include "linbox/vector/stream.h"
-#include "linbox/vector/vector-domain.h"
+#include "linbox/matrix/matrix-domain.h"
+#include "linbox/util/matrix-stream.h"
#include "test-common.h"
using namespace std;
+/*
+Generic tests for black boxes
+
+For field F, BB A, vector streams s, t:
+testTranspose (F, A, s, t)
+testLinearity (A, s, t)
+testReadWrite(A)
-// Generic tests for black boxes
-/// testBlackbox combines testTranspose and testLinearity
+testBlackboxNoRW(A) // calls testTranspose and testLinearity.
+testBlackbox(A) // calls all three generic tests.
-/** Random check that (u^T A) v = u^T (A v).
+testBB(F) has been deleted. It assumed a BB could be built from a single size param (this is never true?!).
+*/
+
+/** Generic Blackbox test 1: Random check that (u^T A) v = u^T (A v).
*
- * Take the given black box and compute u^T A v via <A^T u, v> and <u, Av> for
+ * Take the given black box and compute u^T A v via <code><A^T u, v></code> and <code><u, Av></code> for
* randomly chosen u and v. Check whether the results are equal. In theory, this
* should guarantee that tranpose is working correctly if apply and dot product
* are also working correctly. Apply and dot product should, of course, be
@@ -68,14 +79,14 @@ using namespace std;
template <class Field, class Blackbox, class Vector>
static bool
-testTranspose (Field &F,
- Blackbox &A,
- LinBox::VectorStream<Vector> &stream1,
- LinBox::VectorStream<Vector> &stream2)
+testTranspose (const Field &F,
+ Blackbox &A,
+ LinBox::VectorStream<Vector> &stream1,
+ LinBox::VectorStream<Vector> &stream2)
{
bool ret = true;
- Vector u, v, uA, Av;
+ Vector u(F), v(F), uA(F), Av(F);
LinBox::VectorWrapper::ensureDim (u, A.rowdim ());
LinBox::VectorWrapper::ensureDim (uA, A.coldim ());
@@ -94,8 +105,9 @@ testTranspose (Field &F,
stream1.next (u);
stream2.next (v);
- //ostream &report = LinBox::commentator().report (LinBox::Commentator::LEVEL_UNIMPORTANT, INTERNAL_DESCRIPTION);
+ //ostream &report = LinBox::commentator().report (LinBox::Commentator::LEVEL_UNIMPORTANT, INTERNAL_DESCRIPTION);
+ //A.write( report << "A is ");
VD.write( report << "Input vector u: ", u) << endl;
VD.write( report << "Input vector v: ", v) << endl;
@@ -104,6 +116,7 @@ testTranspose (Field &F,
VD.write( report << "Result of apply: ", Av) << endl;
VD.dot (r1, u, Av);
+
A.applyTranspose (uA, u);
VD.write( report << "Result of transpose apply: ", uA) << endl;
@@ -120,8 +133,11 @@ testTranspose (Field &F,
<< "ERROR: Values are not equal" << endl;
}
- LinBox::commentator().stop ("done");
- LinBox::commentator().progress ();
+ if (ret)
+ LinBox::commentator().stop ("testTranspose pass");
+ else
+ LinBox::commentator().stop ("testTranspose FAIL");
+ //LinBox::commentator().progress ();
}
return ret;
@@ -139,21 +155,23 @@ testTranspose (Field &F,
* Return true on success and false on failure
*/
-template <class Field, class BB, class Vector>
+template <class BB, class Vector>
static bool
-testLinearity (Field &F,
+testLinearity (//const Field &F,
BB &A,
LinBox::VectorStream<Vector> &stream1,
LinBox::VectorStream<Vector> &stream2)
{
- bool ret = true, iter_passed;
+ bool ret = true;
size_t n = A.rowdim ();
size_t m = A.coldim ();
- Vector x, y, xpay, Axpay, Ax, Ay, AxpaAy;
- LinBox::VectorDomain <Field> VD (F);
- typename Field::RandIter r (F);
+ typedef typename BB::Field Field;
+ Field F( A.field() );
+ Vector x(F), y(F), xpay(F), Axpay(F), Ax(F), Ay(F), AxpaAy(F);
+ LinBox::VectorDomain <Field> VD (A.field());
+ typename Field::RandIter r (A.field());
typename Field::Element alpha;
LinBox::VectorWrapper::ensureDim (x, m);
@@ -170,19 +188,18 @@ testLinearity (Field &F,
while (stream1 && stream2) {
LinBox::commentator().startIteration ((unsigned int) stream1.j ());
- iter_passed = true;
+ bool iter_passed = true;
stream1.next (x);
stream2.next (y);
r.random (alpha);
- //ostream &report = LinBox::commentator().report (LinBox::Commentator::LEVEL_UNIMPORTANT, INTERNAL_DESCRIPTION);
VD.write( report << "Input vector x: ", x) << endl;
VD.write( report << "Input vector y: ", y) << endl;
- F.write( report << "Input alpha: ", alpha) << endl;
+ A.field().write( report << "Input alpha: ", alpha) << endl;
VD.axpy ( xpay, alpha, y, x);
A.apply ( Axpay, xpay);
@@ -207,39 +224,126 @@ testLinearity (Field &F,
if (!iter_passed)
LinBox::commentator().report (LinBox::Commentator::LEVEL_IMPORTANT, INTERNAL_ERROR)
<< "ERROR: Vectors are not equal" << endl;
-
- LinBox::commentator().stop ("done");
- LinBox::commentator().progress ();
+ if (iter_passed)
+ LinBox::commentator().stop ("testLinearity pass");
+ else
+ LinBox::commentator().stop ("testLinearity FAIL");
+ //LinBox::commentator().progress ();
}
return ret;
}
-/** Generic blackbox test 4: combination of tests
+/** Generic Blackbox test 3: black box read/write.
+ *
+ * write the black box A, read it back and check equality.
+ *
+ * F - Field over which to perform computations
+ * A - Black box
+ *
+ * Return true on success and false on failure
+ */
+
+template <class BB>
+static bool
+testReadWrite(BB &A)
+{
+ typedef typename BB::Field Field;
+ bool pass = true;
+ ostream &report = LinBox::commentator().report (LinBox::Commentator::LEVEL_IMPORTANT, INTERNAL_DESCRIPTION);
+ report << "Blackbox Read/Write test: write then read back" << std::endl;
+
+ ofstream out("temp2");
+ if (not out) {
+ pass = false;
+ report << "failure to open file for writing" << std::endl;
+ }
+ A.write(out) << std::endl;
+ {
+ BB B(A.field());
+ ifstream in("temp2");
+ if (not in) {
+ pass = false;
+ report << "failure to open file for reading" << std::endl;
+ }
+ B.read(in);
+ LinBox::MatrixDomain<Field> MD(A.field());
+ if (not MD.areEqual(A, B)) {
+ pass = false;
+ report << "failure to get same matrix back from write/read" << std::endl;
+ B.write(report << "B is ") << std::endl;
+ }
+ }
+
+/* A constructor from a matrix stream is not a required member of a blackbox. -bds
+ {
+ ifstream in("temp2");
+ if (not in) {
+ pass = false;
+ report << "failure to open file for reading" << std::endl;
+ }
+
+
+ LinBox::MatrixStream<Field> ms (A.field(), in);
+ BB B( ms );
+ LinBox::MatrixDomain<Field> MD(A.field());
+ if (not MD.areEqual(A, B)) {
+ pass = false;
+ report << "failure to get same matrix back from write/read" << std::endl;
+ B.write(report << "B is ") << std::endl;
+ }
+ }
+*/
+ if (pass) report << "PASS: successful write/read" << std::endl;
+ return pass;
+}
+
+
+template <class BB, class Vector>
+static bool
+LooksLikeZero(BB &A, LinBox::VectorStream<Vector> &stream)
+{ typedef typename BB::Field Field;
+ LinBox::VectorDomain<Field> VD(A.field());
+ LinBox::BlasVector<Field> x(A.field(), A.coldim()),
+ y(A.field(), A.rowdim());
+ while (stream)
+ { stream.next(x);
+ A.apply(y, x);
+ if (not VD.isZero(y)) return false;
+ }
+ ostream &report = LinBox::commentator().report (LinBox::Commentator::LEVEL_IMPORTANT, INTERNAL_DESCRIPTION);
+ report << "BB looks like zero:" << std::endl;
+ VD.write(report << "x: ", x) << std::endl;
+ VD.write(report << "Ax: ", y) << std::endl;
+ return true;
+}
+/** Generic blackbox test 3: combination of tests
*
- * Call testTranspose and testLinearity.
* If large, time apply and applyTranspose.
- * if small, call testSmallBlackbox.
+ * Call testTranspose and testLinearity.
*/
+
template <class BB>
static bool
-testBlackbox(BB &A)
+testBlackboxNoRW(BB &A, bool zeroCheck=true)
{
- size_t largeThresh = 2000; // Above it do timing of apply and applyTr.
typedef typename BB::Field Field;
- typedef std::vector<typename Field::Element> DenseVector;
+ typedef LinBox::BlasVector<Field> DenseVector;
std::ostream &report = LinBox::commentator().report (LinBox::Commentator::LEVEL_IMPORTANT, INTERNAL_DESCRIPTION);
report << "testBlackbox on " << A.rowdim() << " by " << A.coldim() << " matrix." << endl;
+ //if (std::max(A.rowdim(),A.coldim())<15)
+ // A.write(report << "Blackbox = ");
LinBox::commentator().setMaxDepth(-1);
bool ret = true;
- Field F = A.field();
+ const Field& F = A.field();
- /* timing tests */ // I changed the order of all tests. Timing now is the first set of tests and then linearity and transpose
+ /* timing tests */
{
- DenseVector x(A.coldim()), y(A.rowdim());
- for(size_t i = 0; i < A.coldim(); ++i) F.init(x[i], i);
- for(size_t i = 0; i < A.rowdim(); ++i) F.init(y[i], i);
+ size_t largeThresh = 2000; // Above it do timing of apply and applyTr.
+ DenseVector x(F,A.coldim()), y(F,A.rowdim());
+ for(size_t i = 0; i < A.coldim(); ++i) F.init(x[i], (double)i);
+ for(size_t i = 0; i < A.rowdim(); ++i) F.init(y[i], (double)i);
//A.apply(y, x);
if (A.coldim() >= largeThresh)
@@ -259,65 +363,44 @@ testBlackbox(BB &A)
} // timing test block
-#if 1
size_t iterations = 1;
typename Field::RandIter r(F);
- LinBox::RandomDenseStream<Field, DenseVector> stream1 (F, r, A.rowdim(), iterations);
- typename Field::Element x;
- r.random(x);
- LinBox::RandomDenseStream<Field, DenseVector> stream2 (F, r, A.coldim(), iterations);
-
- LinBox::commentator().start ("\t--Testing A(ax+y) = a(Ax) + (Ay)", "testLinearity", 1);
- ret = ret && testLinearity (F, A, stream1, stream2);
-
- LinBox::commentator().stop (MSG_STATUS (ret),
- (const char *) 0, "testLinearity");
-
- LinBox::commentator().start ("\t--Testing u^T(Av) = (u^T A)v",
- "testTranspose", 1);
-
- LinBox::RandomDenseStream<Field, DenseVector> stream3 (F, r, A.rowdim(), iterations);
- LinBox::RandomDenseStream<Field, DenseVector> stream4 (F, r, A.coldim(), iterations);
-
+ LinBox::RandomSparseStream<Field, DenseVector> stream1 (F, r, 1.0, A.rowdim(), iterations, 11);
+ //typename Field::Element x;
+ //r.random(x);
+ LinBox::RandomSparseStream<Field, DenseVector> stream2 (F, r, 1.0, A.coldim(), iterations);
+ ret = ret && testLinearity (A, stream1, stream2);
+
+ LinBox::RandomSparseStream<Field, DenseVector> stream3 (F, r, 1.0, A.rowdim(), iterations);
+ LinBox::RandomSparseStream<Field, DenseVector> stream4 (F, r, 1.0, A.coldim(), iterations);
ret = ret && testTranspose (F, A, stream3, stream4);
- LinBox::commentator().stop (MSG_STATUS (ret),
- (const char *) 0, "testTranspose");
-#endif
+ DenseVector x(F,A.coldim()), y(F,A.rowdim());
+ if (zeroCheck) {
+ LinBox::RandomSparseStream<Field, DenseVector> stream5 (F, r, 1.0, A.coldim(), 10);
+ ret = ret & not LooksLikeZero(A, stream5);
+ }
return ret;
}
-/** Generic blackbox test 5: test several sizes
- *
- * Call testTranspose and testLinearity.
- * If large, time apply and applyTranspose.
- * if small, call test
- SmallBlackbox.
- */
-template <class Field, class Blackbox>
+template <class BB>
static bool
-testBB(Field& F)
+testBlackbox(BB &A, bool read_write=true, bool zero_check = true)
{
- bool pass = true;
-
- Blackbox A(10);
- if (!testBlackbox<Field, vector<typename Field::Element> >(F, A, 1))
- pass = false;
- Blackbox B(10000);
- if (!testBlackbox<Field, vector<typename Field::Element> >(F, B, 1))
- pass = false;
+ bool ok = testBlackboxNoRW(A,zero_check);
+ if (ok && read_write)
+ return testReadWrite(A);
+ return ok ;
- return pass;
+ // return testBlackboxNoRW(A) and testReadWrite(A);
}
-
#endif // __LINBOX_test_blackbox_H
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
// Local Variables:
// mode: C++
// tab-width: 8
// indent-tabs-mode: nil
// c-basic-offset: 8
// End:
-
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/tests/test-blas-domain.C b/tests/test-blas-domain.C
index 2653a48..192ff70 100644
--- a/tests/test-blas-domain.C
+++ b/tests/test-blas-domain.C
@@ -6,20 +6,20 @@
*
* ---------------------------------------------------------
*
- *
+ *
* ========LICENCE========
* This file is part of the library LinBox.
- *
+ *
* LinBox is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
- *
+ *
* This library 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
* Lesser General Public License for more details.
- *
+ *
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
@@ -37,31 +37,38 @@
*/
- // where is this used?
-#define __MINP_CONSTRUCT
-#include "linbox/linbox-config.h"
+#include <linbox/linbox-config.h>
#include <iostream>
#include <string>
+
#include "linbox/integer.h"
-#include "linbox/field/gf2.h"
-#include "linbox/field/modular.h"
-#include "linbox/field/modular-balanced.h"
-#include "linbox/field/givaro.h"
+//#include "linbox/field/gf2.h"
+//#include "linbox/domain/blas_matrix_domain_gf2.h"
+// defines template<> class BlasMatrixDomain<GF2> { ... };
+// ... and template<> BlasMatrix<GF2> {}
+#if 0
+#include "linbox/field/gf3.h"
+//#include "linbox/domain/blas_matrix_domain_gf3.h"
+// defines template<> class BlasMatrixDomain<GF3> { ... };
+// ... and template<> BlasMatrix<GF3> {}
+#endif
+#include "linbox/ring/modular.h"
+#include <givaro/modular-balanced.h>
+
#ifdef __LINBOX_HAVE_NTL
-#include "linbox/field/ntl.h"
+#include "linbox/ring/ntl.h"
#endif
-#include "linbox/matrix/blas-matrix.h"
+#include "linbox/matrix/dense-matrix.h"
#include "linbox/matrix/matrix-domain.h"
-#include "linbox/vector/vector-domain.h"
-#include "linbox/randiter/nonzero.h"
+#include <givaro/givranditer.h>
#include "linbox/util/commentator.h"
-#include "linbox/algorithms/blas-domain.h"
-#include "linbox/field/PID-integer.h"
+#include "givaro/zring.h"
// #include "linbox/algorithms/matrix-hom.h"
#include "linbox/matrix/random-matrix.h"
+#include "linbox/blackbox/scalar-matrix.h"
+
-#include <vector>
#include "test-common.h"
@@ -72,6 +79,128 @@ const int maxpretty = 35;
string blank;
const char* pretty(string a)
+;
+
+template <class Vector>
+bool localAreEqual(
+ const Vector& a,
+ const Vector& b)
+;
+
+template <class Field>
+static bool testMulAdd (const Field& F, size_t n, int iterations)
+;
+template <class Field>
+static bool testMulAddAgain (const Field& Zp, size_t n, int iterations)
+;
+template <class Field>
+static bool testMulAddShapeTrans (const Field &F, size_t m, size_t n, size_t k, int iterations)
+;
+template<class Field, bool LeftSide, bool UnitDiag>
+static bool testTriangMulShapeTrans (const Field &F, size_t m, size_t n, int iterations)
+;
+template <class Field>
+static bool testRank (const Field& F,size_t n, int iterations)
+;
+template <class Field>
+static bool testDet (const Field& F,size_t n, int iterations)
+;
+template <class Field>
+static bool testInv (const Field& F,size_t n, int iterations)
+;
+template <class Field>
+static bool testTriangularSolve (const Field& F, size_t m, size_t n, int iterations)
+;
+template <class Field>
+static bool testSolve (const Field& F, size_t m, size_t n, int iterations)
+;
+template <class Field>
+static bool testPermutation (const Field& F, size_t m, int iterations)
+;
+template <class Field>
+static bool testLQUP (const Field& F, size_t m, size_t n, int iterations)
+;
+template <class Field>
+static bool testMinPoly (const Field& F, size_t n, int iterations)
+;
+template <class Field>
+static bool testCharPoly (const Field& F, size_t n, int iterations)
+;
+template<class Field>
+static bool testBlasMatrixConstructors(const Field& Fld, size_t m, size_t n)
+;
+template<class Field>
+int launch_tests(Field & F, size_t n, int iterations)
+;
+bool launch_gf2_tests(GF2 & F, size_t n)
+;
+#if 0
+bool launch_gf3_tests(GF3 & F, size_t n)
+;
+#endif
+
+// test BlasMatrixDomain<Field> for various fields
+int main(int argc, char **argv)
+{
+
+ static size_t n = 3;
+ //static integer q = 1000003U;
+ static integer q = 65521;
+ static int iterations = 1;
+
+ static Argument args[] = {
+ { 'n', "-n N", "Set dimension of test matrices to NxN", TYPE_INT, &n },
+ { 'q', "-q Q", "Operate over the \"field\" GF(Q) [1]", TYPE_INTEGER, &q },
+ { 'i', "-i I", "Perform each test for I iterations", TYPE_INT, &iterations },
+ END_OF_ARGUMENTS
+ };
+
+ parseArguments (argc, argv, args);
+
+ // BB. (Blas)MatrixDomain are not very generic...
+
+ bool pass = true;
+ srand ((unsigned)time (NULL));
+
+ commentator().getMessageClass (INTERNAL_DESCRIPTION).setMaxDepth (3);
+ commentator().getMessageClass (INTERNAL_DESCRIPTION).setMaxDetailLevel (Commentator::LEVEL_NORMAL);
+ commentator().start("BlasMatrixDomain test suite", "BlasMatrixDomain");
+
+ Givaro::Modular<double> F1 (q);
+ GF2 F2 ;
+ //GF3 F3 ;
+ Givaro::ModularBalanced<double> F4(q);
+ Givaro::Modular<float> F5(2011);
+ Givaro::Modular<uint32_t> F6(1009); // (2011);
+
+ pass &= launch_tests(F1,n,iterations);
+
+ pass &= launch_gf2_tests(F2,n);
+
+#pragma message "#warning GF3 -> working on sliced wrapper"
+ //pass &= launch_gf3_tests(F3,n);
+
+ pass &= launch_tests(F4,n,iterations);
+
+ pass &= launch_tests(F5,n,iterations);
+
+ pass &= launch_tests(F6,n,iterations);
+
+//#pragma message "#warning Givaro::Modular<bool> is not working"
+ //pass &= launch_tests(F7,n,iterations);
+
+#ifdef __LINBOX_HAVE_NTL
+#pragma message "#warning NTL_ZZp is not working at all"
+ NTL::ZZ_p::init(NTL::to_ZZ((size_t)q));
+ NTL_ZZ_p F8;
+ // pass &= launch_tests(F8,n,iterations);
+#endif
+
+ commentator().stop(MSG_STATUS (pass), (const char *) 0,"BlasMatrixDomain test suite");
+ return pass ? 0 : -1;
+}
+
+const char* pretty(string a)
{
blank = " " + a;
@@ -82,7 +211,25 @@ const char* pretty(string a)
return blank.c_str();
}
#define mycommentator commentator
+ostream & report = mycommentator().report();
+template<class Vector>
+ bool localAreEqual(
+ const Vector& a,
+ const Vector& b)
+{
+ if ( a.size() != b.size() )
+ return false;
+
+ const typename Vector::Field & F = a.field();
+
+ typename Vector::const_iterator it = a.begin();
+ typename Vector::const_iterator jt = b.begin();
+ for ( ; it != a.end(); ++it, ++jt)
+ if (! F.areEqual(*it,*jt))
+ return false;
+ return true;
+}
template <class Field>
static bool testMulAdd (const Field& F, size_t n, int iterations)
@@ -93,32 +240,29 @@ static bool testMulAdd (const Field& F, size_t n, int iterations)
typedef BlasMatrix<Field> Matrix;
//Commentator mycommentator;
- mycommentator().getMessageClass (INTERNAL_DESCRIPTION).setMaxDepth (3);
- mycommentator().getMessageClass (INTERNAL_DESCRIPTION).setMaxDetailLevel (Commentator::LEVEL_NORMAL);
- mycommentator().start (pretty("Testing muladd"),"testMulAdd",iterations);
+ //mycommentator().getMessageClass (INTERNAL_DESCRIPTION).setMaxDepth (3);
+ //mycommentator().getMessageClass (INTERNAL_DESCRIPTION).setMaxDetailLevel (Commentator::LEVEL_NORMAL);
+ mycommentator().start (pretty("Testing muladd"),"testMulAdd",(unsigned int)iterations);
RandIter G(F);
bool ret = true;
BlasMatrixDomain<Field> BMD(F);
- MatrixDomain<Field> MD(F);
- VectorDomain<Field> VD(F);
+ Matrix A(F,n,n);
for (int k=0;k<iterations; ++k) {
mycommentator().progress(k);
- Matrix A(F, n,n),B(F, n,n),C(F, n,n),D(F, n,n),T(F, n,n),R(F, n,n);
- std::vector<Element> x(n),y(n),z(n),t(n);
+ // A.init(F, n, n);
+ Matrix /*A(F, n,n),*/B(F, n,n),C(F, n,n),D(F, n,n),T(F, n,n),R(F, n,n);
+ BlasVector<Field> x(F,n),y(F,n),z(F,n),t(F,n);
- Element alpha, beta,malpha,tmp;
+ Element alpha, beta,malpha;
// Create 3 random n*n matrices
- for (size_t i=0;i<n;++i)
- for (size_t j=0;j<n;++j){
- A.setEntry(i,j,G.random(tmp));
- B.setEntry(i,j,G.random(tmp));
- C.setEntry(i,j,G.random(tmp));
- }
+ A.random();
+ B.random();
+ C.random();
// Create 2 random vectors
for (size_t i=0;i<n;++i) {
@@ -136,26 +280,40 @@ static bool testMulAdd (const Field& F, size_t n, int iterations)
BMD.mul(D,A,C);
BMD.mul(T,B,C);
- MD.addin(D,T);
+ BMD.addin(D,T);
- MD.add(T,A,B);
+ BMD.add(T,A,B);
BMD.muladd(R,malpha,D,alpha,T,C);
- if (!MD.isZero(R))
+ if (!BMD.isZero(R)) {
ret=false;
+ }
// compute z = beta.y + alpha.A*x
+ // report << "beta := " << beta << ";" << std::endl;
+ // report << "y := " <<y << ";" << std::endl;
+ // report << "alpha := " << alpha << ";" << std::endl;
+ // A.write(report << "A :=",Tag::FileFormat::Maple) << ";" << std::endl;
+ // report << "x := " << x << std::endl;
BMD.muladd(z,beta,y,alpha,A,x);
+ // report << "z := "<< z << std::endl;
- MD.vectorMul(t,A,x);
+ // report << "#apply" <<std::endl;
+ A.apply(t, x);
+ //MD.vectorMul(t,A,x);
for (size_t i=0;i<n;++i){
- F.mulin(t[i],alpha);
- F.axpyin(t[i],beta,y[i]);
+ F.mulin(t[i],alpha);
+ F.axpyin(t[i],beta,y[i]);
}
+ // report << "t := "<< t << std::endl;
- if (!VD.areEqual(t,z))
+ if (!localAreEqual(t,z)){
+ exit(-1);
+ report << "2 alpha = " << alpha << "mod " << F.characteristic() << std::endl;
+ //report << "2 alpha = " << alpha << "mod " << F.characteristic() << std::endl;
ret=false;
+ }
}
mycommentator().stop(MSG_STATUS (ret), (const char *) 0, "testMulAdd");
@@ -165,30 +323,33 @@ static bool testMulAdd (const Field& F, size_t n, int iterations)
// computes D = alpha A B + beta C on integers and check the result is ok mod p.
// actually we check the mod p muladd here...
-bool CheckMulAdd( const Integer & alpha ,
- const BlasMatrix<PID_integer> & A ,
- const BlasMatrix<PID_integer> & B ,
+template <class Field>
+bool CheckMulAdd(const Field& Zp, const Integer & alpha ,
+ const BlasMatrix<Givaro::ZRing<Integer> > & A ,
+ const BlasMatrix<Givaro::ZRing<Integer> > & B ,
const Integer & beta ,
- const BlasMatrix<PID_integer> & C)
+ const BlasMatrix<Givaro::ZRing<Integer> > & C)
{
size_t M = C.rowdim();
size_t N = C.coldim();
- typedef Modular<double> Field ;
- typedef Field::Element Element ;
+ //typedef Givaro::Modular<double> Field ;
+ typedef typename Field::Element Element ;
- PID_integer ZZ ;
- MatrixDomain<PID_integer> ZMD(ZZ);
+ Givaro::ZRing<Integer> ZZ ;
+ // compiles, but wrong if BlasMatrixDomain is used
+ MatrixDomain<Givaro::ZRing<Integer> > ZMD(ZZ);
- BlasMatrix<PID_integer> D(ZZ,M,N);
+ BlasMatrix<Givaro::ZRing<Integer> > D(ZZ,M,N);
+/*
Integer p = Integer::random_between(10,12) ;
nextprime(p,p); //!@bug si p n'est pas premier, fgemm fait n'importe quoi (division par alpha)
Field Zp (p);
+*/
BlasMatrixDomain<Field> BMD (Zp);
- MatrixDomain<Field> MD (Zp);
// Ep = b C + a A B
ZMD.muladd(D,beta,C,alpha,A,B);
@@ -212,31 +373,31 @@ bool CheckMulAdd( const Integer & alpha ,
// Ep = bp Cp + ap Ap Bp mod p
BMD.muladd(Ep,bp,Cp,ap,Ap,Bp);
- bool pass = MD.areEqual(Ep,Dp);
+ bool pass = BMD.areEqual(Ep,Dp);
if (!pass) {
#if 0 /* maple check on stdout */
- std::cout << "#########################################" << std::endl;
- std::cout << "p := " << p << ';' << std::endl;
- std::cout << "ap,bp := " << ap << ',' << bp << ';' << std::endl;
- Ap.write(std::cout << "Ap :=", LinBoxTag::FormatMaple) << ";" << std::endl;
- Bp.write(std::cout << "Bp :=", LinBoxTag::FormatMaple) << ";" << std::endl;
- Cp.write(std::cout << "Cp :=", LinBoxTag::FormatMaple) << ";" << std::endl;
- Dp.write(std::cout << "Dp :=", LinBoxTag::FormatMaple) << ";" << std::endl;
- Ep.write(std::cout << "Ep :=", LinBoxTag::FormatMaple) << ";" << std::endl;
- std::cout << "alpha,beta := " << alpha << ',' << beta << ';' << std::endl;
- A.write(std::cout << "A :=",LinBoxTag::FormatMaple) << ';' << std::endl;
- B.write(std::cout << "B :=",LinBoxTag::FormatMaple) << ';' << std::endl;
- C.write(std::cout << "C :=",LinBoxTag::FormatMaple) << ';' << std::endl;
- D.write(std::cout << "E :=",LinBoxTag::FormatMaple) << ';' << std::endl;
- std::cout << "evalm(E-alpha*A.B-beta*C);" << std::endl;
- std::cout << "#########################################" << std::endl;
+ report << "#########################################" << std::endl;
+ report << "p := " << p << ';' << std::endl;
+ report << "ap,bp := " << ap << ',' << bp << ';' << std::endl;
+ Ap.write(report << "Ap :=", Tag::FileFormat::Maple) << ";" << std::endl;
+ Bp.write(report << "Bp :=", Tag::FileFormat::Maple) << ";" << std::endl;
+ Cp.write(report << "Cp :=", Tag::FileFormat::Maple) << ";" << std::endl;
+ Dp.write(report << "Dp :=", Tag::FileFormat::Maple) << ";" << std::endl;
+ Ep.write(report << "Ep :=", Tag::FileFormat::Maple) << ";" << std::endl;
+ report << "alpha,beta := " << alpha << ',' << beta << ';' << std::endl;
+ A.write(report << "A :=",Tag::FileFormat::Maple) << ';' << std::endl;
+ B.write(report << "B :=",Tag::FileFormat::Maple) << ';' << std::endl;
+ C.write(report << "C :=",Tag::FileFormat::Maple) << ';' << std::endl;
+ D.write(report << "E :=",Tag::FileFormat::Maple) << ';' << std::endl;
+ report << "evalm(E-alpha*A.B-beta*C);" << std::endl;
+ report << "#########################################" << std::endl;
#endif
mycommentator().report() << " *** BMD ERROR (" << alpha << ',' << beta << ") *** " << std::endl;
}
// Ep = bp Cp + ap Ap Bp mod p
- MD.muladd(Ep,bp,Cp,ap,Ap,Bp);
- bool all = MD.areEqual(Ep,Dp);
+ BMD.muladd(Ep,bp,Cp,ap,Ap,Bp);
+ bool all = BMD.areEqual(Ep,Dp);
if (!all) {
mycommentator().report() << " *** MD ERROR *** " << std::endl;
}
@@ -246,17 +407,20 @@ bool CheckMulAdd( const Integer & alpha ,
}
// tests MulAdd for various parameters alpha and beta.
+// This test ignores Field F. It tests only integer matrices.
+// It should not really be included in launch_tests<Field>.
+// For now we'll call it when characteristic is zero.
template <class Field>
-static bool testMulAddAgain (const Field& , size_t n, int iterations)
+static bool testMulAddAgain (const Field& F, size_t n, int iterations)
{
- PID_integer ZZ ;
- typedef BlasMatrix<PID_integer> IMatrix;
+ Givaro::ZRing<Integer> ZZ ;
+ typedef BlasMatrix<Givaro::ZRing<Integer> > IMatrix;
//Commentator mycommentator;
mycommentator().getMessageClass (INTERNAL_DESCRIPTION).setMaxDepth (3);
mycommentator().getMessageClass (INTERNAL_DESCRIPTION).setMaxDetailLevel (Commentator::LEVEL_NORMAL);
- mycommentator().start (pretty("Testing muladd again"),"testMulAddAgain",iterations);
+ mycommentator().start (pretty("Testing muladd again"),"testMulAddAgain",(unsigned int)iterations);
bool ret = true;
@@ -267,14 +431,14 @@ static bool testMulAddAgain (const Field& , size_t n, int iterations)
size_t lB = 18 ;
size_t lC = 19 ;
- PID_integer ZZ ;
+ Givaro::ZRing<Integer> ZZ ;
- typedef RandomIntegerIter<> IntRandIter ;
- typedef RandomDenseMatrix<IntRandIter, PID_integer > IntRand_t;
+ typedef RandomIntegerIterator<> IntRandIter ;
+ typedef RandomDenseMatrix<IntRandIter, Givaro::ZRing<Integer> > IntRand_t;
- IntRandIter RA(lA);
- IntRandIter RB(lB);
- IntRandIter RC(lC);
+ IntRandIter RA(ZZ,lA);
+ IntRandIter RB(ZZ,lB);
+ IntRandIter RC(ZZ,lC);
IntRand_t Arand (ZZ,RA);
IntRand_t Brand (ZZ,RB);
@@ -300,35 +464,35 @@ static bool testMulAddAgain (const Field& , size_t n, int iterations)
}
a = 1 ; b = 1 ;
- if (!CheckMulAdd(a,A,B,b,C)) ret = false ;
+ if (!CheckMulAdd(F,a,A,B,b,C)) ret = false ;
a = 1 ; b = -1 ;
- if (!CheckMulAdd(a,A,B,b,C)) ret = false ;
+ if (!CheckMulAdd(F,a,A,B,b,C)) ret = false ;
a = -1 ; b = 1 ;
- if (!CheckMulAdd(a,A,B,b,C)) ret = false ;
+ if (!CheckMulAdd(F,a,A,B,b,C)) ret = false ;
a = -1 ; b = -1 ;
- if (!CheckMulAdd(a,A,B,b,C)) ret = false ;
+ if (!CheckMulAdd(F,a,A,B,b,C)) ret = false ;
a = 0 ; b = 1 ;
- if (!CheckMulAdd(a,A,B,b,C)) ret = false ;
+ if (!CheckMulAdd(F,a,A,B,b,C)) ret = false ;
a = 1 ; b = 0 ;
- if (!CheckMulAdd(a,A,B,b,C)) ret = false ;
+ if (!CheckMulAdd(F,a,A,B,b,C)) ret = false ;
a = 0 ; b = -1 ;
- if (!CheckMulAdd(a,A,B,b,C)) ret = false ;
+ if (!CheckMulAdd(F,a,A,B,b,C)) ret = false ;
a = -1 ; b = 0 ;
- if (!CheckMulAdd(a,A,B,b,C)) ret = false ;
+ if (!CheckMulAdd(F,a,A,B,b,C)) ret = false ;
a = Integer::random<false>(ll) ; b = 1 ;
- if (!CheckMulAdd(a,A,B,b,C)) ret = false ;
+ if (!CheckMulAdd(F,a,A,B,b,C)) ret = false ;
a =Integer::random<false>(ll) ; b = -1 ;
- if (!CheckMulAdd(a,A,B,b,C)) ret = false ;
+ if (!CheckMulAdd(F,a,A,B,b,C)) ret = false ;
a = 1 ; b = Integer::random<false>(ll) ;
- if (!CheckMulAdd(a,A,B,b,C)) ret = false ;
+ if (!CheckMulAdd(F,a,A,B,b,C)) ret = false ;
a = -1 ; b = Integer::random<false>(ll) ;
- if (!CheckMulAdd(a,A,B,b,C)) ret = false ;
+ if (!CheckMulAdd(F,a,A,B,b,C)) ret = false ;
a = 0 ; b = Integer::random<false>(ll) ;
- if (!CheckMulAdd(a,A,B,b,C)) ret = false ;
+ if (!CheckMulAdd(F,a,A,B,b,C)) ret = false ;
a = Integer::random<false>(ll) ; b = 0 ;
- if (!CheckMulAdd(a,A,B,b,C)) ret = false ;
+ if (!CheckMulAdd(F,a,A,B,b,C)) ret = false ;
a = Integer::random<false>(ll) ; b = Integer::random<false>(ll) ;
- if (!CheckMulAdd(a,A,B,b,C)) ret = false ;
+ if (!CheckMulAdd(F,a,A,B,b,C)) ret = false ;
}
@@ -345,7 +509,7 @@ static bool testMulAddShapeTrans (const Field &F, size_t m, size_t n, size_t k,
bool ret = true ;
mycommentator().getMessageClass (INTERNAL_DESCRIPTION).setMaxDepth (3);
mycommentator().getMessageClass (INTERNAL_DESCRIPTION).setMaxDetailLevel (Commentator::LEVEL_NORMAL);
- mycommentator().start (pretty("Testing muladd for shapes and transposition"),"testMulAddShapeTrans",iterations);
+ mycommentator().start (pretty("Testing muladd for shapes and transposition"),"testMulAddShapeTrans",(unsigned long)iterations);
typedef typename Field::Element Element;
@@ -356,7 +520,6 @@ static bool testMulAddShapeTrans (const Field &F, size_t m, size_t n, size_t k,
RandomDenseMatrix<Randiter,Field> RandMat(F,R);
BlasMatrixDomain<Field> BMD (F);
- MatrixDomain<Field> MD (F);
// input matrix
Matrix A(F, m,k);
@@ -387,29 +550,29 @@ static bool testMulAddShapeTrans (const Field &F, size_t m, size_t n, size_t k,
R.random(beta);
// témoin.
- MD.muladd(D,beta,C,alpha,A,B);
+ BMD.muladd(D,beta,C,alpha,A,B);
// A,B
BMD.muladd(E,beta,C,alpha,A,B);
- if (!MD.areEqual(E,D)) {
+ if (!BMD.areEqual(E,D)) {
ret = false ;
mycommentator().report() << " *** BMD ERROR (" << alpha << ',' << beta << ") (noTrans, noTrans) *** " << std::endl;
}
BMD.muladd(E,beta,C,alpha,A,tB);
- if (!MD.areEqual(E,D)) {
+ if (!BMD.areEqual(E,D)) {
ret = false ;
mycommentator().report() << " *** BMD ERROR (" << alpha << ',' << beta << ") (noTrans, Trans) *** " << std::endl;
}
BMD.muladd(E,beta,C,alpha,tA,B);
- if (!MD.areEqual(E,D)) {
+ if (!BMD.areEqual(E,D)) {
ret = false ;
mycommentator().report() << " *** BMD ERROR (" << alpha << ',' << beta << ") (Trans, noTrans) *** " << std::endl;
}
BMD.muladd(E,beta,C,alpha,tA,tB);
- if (!MD.areEqual(E,D)) {
+ if (!BMD.areEqual(E,D)) {
ret = false ;
mycommentator().report() << " *** BMD ERROR (" << alpha << ',' << beta << ") (Trans, Trans) *** " << std::endl;
}
@@ -426,23 +589,20 @@ static bool testTriangMulShapeTrans (const Field &F, size_t m, size_t n, int ite
bool ret = true ;
mycommentator().getMessageClass (INTERNAL_DESCRIPTION).setMaxDepth (3);
mycommentator().getMessageClass (INTERNAL_DESCRIPTION).setMaxDetailLevel (Commentator::LEVEL_NORMAL);
- mycommentator().start (pretty("Testing triangular matmul for shapes and transposition"),"testTriangMulShapeTrans",iterations);
+ mycommentator().start (pretty("Testing triangular matmul for shapes and transposition"),"testTriangMulShapeTrans",(unsigned int)iterations);
- typedef typename Field::Element Element;
+ // typedef typename Field::Element Element;
typedef BlasMatrix<Field> Matrix ;
typedef TriangularBlasMatrix<Field> TriangularMatrix ;
- typedef TransposedBlasMatrix<Matrix> TransposedMatrix ;
+ // typedef TransposedBlasMatrix<Matrix> TransposedMatrix ;
typedef TransposedBlasMatrix<TriangularMatrix > TransposedTriangular ;
typedef typename Field::RandIter Randiter ;
Randiter R(F) ;
RandomDenseMatrix<Randiter,Field> RandMat(F,R);
- Element one ;
- F.init(one,1);
BlasMatrixDomain<Field> BMD (F);
- MatrixDomain<Field> MD (F);
int k =(int) (LeftSide?m:n) ;
// input matrix
@@ -464,19 +624,19 @@ static bool testTriangMulShapeTrans (const Field &F, size_t m, size_t n, int ite
/* test (L+U-I) B+B = LB+UB */
if (LeftSide)
- BMD.muladd(D,one,B,one,A,B);
+ BMD.muladd(D,F.one,B,F.one,A,B);
else
- BMD.muladd(D,one,B,one,B,A);
+ BMD.muladd(D,F.one,B,F.one,B,A);
/**** DIRECT ****/
{
/* L */
- TriangularMatrix L (A, LinBoxTag::Lower,
- (UnitDiag?LinBoxTag::Unit:LinBoxTag::NonUnit));
+ TriangularMatrix L (A, Tag::Shape::Lower,
+ (UnitDiag?Tag::Diag::Unit:Tag::Diag::NonUnit));
/* U */
- TriangularMatrix U (A, LinBoxTag::Upper,
- (!UnitDiag?LinBoxTag::Unit:LinBoxTag::NonUnit));
+ TriangularMatrix U (A, Tag::Shape::Upper,
+ (!UnitDiag?Tag::Diag::Unit:Tag::Diag::NonUnit));
/* make product */
E = B ;
@@ -494,7 +654,7 @@ static bool testTriangMulShapeTrans (const Field &F, size_t m, size_t n, int ite
BMD.addin(E,G);
/* check equality */
- if (!MD.areEqual(E,D)) {
+ if (!BMD.areEqual(E,D)) {
ret = false ;
mycommentator().report() << " *** BMD ERROR (" << (LeftSide?"left":"right") << ',' << (UnitDiag?" L":" U") << " is unit) *** " << std::endl;
}
@@ -505,12 +665,12 @@ static bool testTriangMulShapeTrans (const Field &F, size_t m, size_t n, int ite
/**** Transpose ****/
{
/* L */
- TriangularMatrix L1 (A1, LinBoxTag::Lower,
- (UnitDiag?LinBoxTag::Unit:LinBoxTag::NonUnit));
+ TriangularMatrix L1 (A1, Tag::Shape::Lower,
+ (UnitDiag?Tag::Diag::Unit:Tag::Diag::NonUnit));
/* U */
- TriangularMatrix U1 (A1, LinBoxTag::Upper,
- (!UnitDiag?LinBoxTag::Unit:LinBoxTag::NonUnit));
+ TriangularMatrix U1 (A1, Tag::Shape::Upper,
+ (!UnitDiag?Tag::Diag::Unit:Tag::Diag::NonUnit));
TransposedTriangular L(L1);
TransposedTriangular U(U1);
@@ -530,7 +690,7 @@ static bool testTriangMulShapeTrans (const Field &F, size_t m, size_t n, int ite
BMD.addin(E,G);
/* check equality */
- if (!MD.areEqual(E,D)) {
+ if (!BMD.areEqual(E,D)) {
ret = false ;
mycommentator().report() << " *** BMD ERROR Transpose (" << (LeftSide?"left":"right") << ',' << (UnitDiag?" L":" U") << " is unit) *** " << std::endl;
}
@@ -558,21 +718,21 @@ static bool testRank (const Field& F,size_t n, int iterations)
//Commentator mycommentator;
mycommentator().getMessageClass (INTERNAL_DESCRIPTION).setMaxDepth (3);
mycommentator().getMessageClass (INTERNAL_DESCRIPTION).setMaxDetailLevel (Commentator::LEVEL_NORMAL);
- mycommentator().start (pretty("Testing rank"),"testRank",iterations);
+ mycommentator().start (pretty("Testing rank"),"testRank",(unsigned int)iterations);
RandIter G(F);
- NonzeroRandIter<Field> Gn(F,G);
+ Givaro::GeneralRingNonZeroRandIter<Field> Gn(G);
Element tmp;
- unsigned int r;
bool ret = true;
BlasMatrixDomain<Field> BMD(F);
for (int k=0;k<iterations; ++k) {
+ unsigned int r;
mycommentator().progress(k);
BlasMatrix<Field> A(F,n,n),S(F,n,n), L(F,n,n);
- r = (unsigned int)(random() % n);
+ r = (unsigned int)((size_t)random() % n);
// create S as an upper triangular matrix with r nonzero rows
for (size_t i=0;i<r;++i){
S.setEntry(i,i,Gn.random(tmp));
@@ -622,12 +782,11 @@ static bool testDet (const Field& F,size_t n, int iterations)
//Commentator mycommentator;
mycommentator().getMessageClass (INTERNAL_DESCRIPTION).setMaxDepth (3);
mycommentator().getMessageClass (INTERNAL_DESCRIPTION).setMaxDetailLevel (Commentator::LEVEL_NORMAL);
- mycommentator().start (pretty("Testing determinant"),"testDet",iterations);
+ mycommentator().start (pretty("Testing determinant"),"testDet",(unsigned int)iterations);
RandIter G(F);
- NonzeroRandIter<Field> Gn(F,G);
- Element tmp,One,d;
- F.init(One,1UL);
+ Givaro::GeneralRingNonZeroRandIter<Field> Gn(G);
+ Element tmp,d;
bool ret = true;
BlasMatrixDomain<Field> BMD(F);
@@ -643,7 +802,7 @@ static bool testDet (const Field& F,size_t n, int iterations)
// create S as an upper triangular matrix of full rank
// with diagonal's element equal to 1 except the first entry wich equals to d
for (size_t i=0;i<n;++i){
- S.setEntry(i,i,One);
+ S.setEntry(i,i,F.one);
for (size_t j=i+1;j<n;++j)
S.setEntry(i,j,G.random(tmp));
}
@@ -653,7 +812,7 @@ static bool testDet (const Field& F,size_t n, int iterations)
for (size_t i=0;i<n;++i){
for (size_t j=0;j<i;++j)
L.setEntry(i,j,G.random(tmp));
- L.setEntry(i,i,One);
+ L.setEntry(i,i,F.one);
}
@@ -687,27 +846,27 @@ static bool testInv (const Field& F,size_t n, int iterations)
//Commentator mycommentator;
mycommentator().getMessageClass (INTERNAL_DESCRIPTION).setMaxDepth (3);
mycommentator().getMessageClass (INTERNAL_DESCRIPTION).setMaxDetailLevel (Commentator::LEVEL_NORMAL);
- mycommentator().start (pretty("Testing inverse"),"testInv",iterations);
+ mycommentator().start (pretty("Testing inverse"),"testInv",(unsigned int)iterations);
RandIter G(F);
- NonzeroRandIter<Field> Gn(F,G);
- Element One,tmp;
- F.init(One,1UL);
+ Givaro::GeneralRingNonZeroRandIter<Field> Gn(G);
+ Element tmp;
bool ret = true;
- MatrixDomain<Field> MD(F);
BlasMatrixDomain<Field> BMD(F);
Matrix Id(F, n,n);
for (size_t i=0;i<n;++i)
- Id.setEntry(i,i,One);
+ Id.setEntry(i,i,F.one);
+ if (n < 10)
+ Id.write(mycommentator().report() << "Id" << std::endl) << std::endl;
for (int k=0;k<iterations;++k) {
mycommentator().progress(k);
- Matrix A(F, n,n),S(F, n,n), L(F, n,n), invA(F, n,n);
+ Matrix A(F, n,n),S(F, n,n), L(F, n,n); // , invA(F, n,n);
// create S as an upper triangular matrix of full rank
// with nonzero random diagonal's element
@@ -722,20 +881,36 @@ static bool testInv (const Field& F,size_t n, int iterations)
for (size_t i=0;i<n;++i){
for (size_t j=0;j<i;++j)
L.setEntry(i,j,G.random(tmp));
- L.setEntry(i,i,One);
+ L.setEntry(i,i,F.one);
}
// compute A=LS
BMD.mul(A,L,S);
+ //for (size_t i=0;i<n;++i){A.setEntry(i,i,F.one); }
+ //A.setEntry(0, n-1, F.mOne);
+
+ if (n < 10)
+ A.write(mycommentator().report() << "A") << std::endl;
// compute the inverse of A
- BMD.inv(invA,A);
+ Matrix invA(A);
+ if (n < 10)
+ invA.write(mycommentator().report() << "before inversion, invA") << std::endl;
+ //int nullity;
+ //FFPACK::Invert2 (F, invA.rowdim(), A.getPointer(), A.getStride(), invA.getPointer(), invA.getStride(), nullity);
+ BMD.invin(invA);
+ if (n < 10)
+ invA.write(mycommentator().report() << "invA") << std::endl;
// compute Ainv*A and A*Ainv
BMD.mul(L,invA,A);
+ if (n < 10)
+ L.write(mycommentator().report() << "invA*A") << std::endl;
BMD.mul(S,A,invA);
+ if (n < 10)
+ S.write(mycommentator().report() << "A*invA") << std::endl;
- if (!MD.areEqual(L,Id) || !MD.areEqual(S,Id))
+ if (!BMD.areEqual(L,Id) || !BMD.areEqual(S,Id))
ret=false;
}
@@ -760,16 +935,13 @@ static bool testTriangularSolve (const Field& F, size_t m, size_t n, int iterati
//Commentator mycommentator;
mycommentator().getMessageClass (INTERNAL_DESCRIPTION).setMaxDepth (3);
mycommentator().getMessageClass (INTERNAL_DESCRIPTION).setMaxDetailLevel (Commentator::LEVEL_NORMAL);
- mycommentator().start (pretty("Testing triangular solver"),"testTriangularSolve",iterations);
+ mycommentator().start (pretty("Testing triangular solver"),"testTriangularSolve",(unsigned int)iterations);
RandIter G(F);
- NonzeroRandIter<Field> Gn(F,G);
- Element One,tmp;
- F.init(One,1UL);
+ Givaro::GeneralRingNonZeroRandIter<Field> Gn(G);
+ Element tmp;
bool ret = true;
- MatrixDomain<Field> MD(F);
- VectorDomain<Field> VD(F);
BlasMatrixDomain<Field> BMD(F);
for (int k=0;k<iterations;++k) {
@@ -779,7 +951,7 @@ static bool testTriangularSolve (const Field& F, size_t m, size_t n, int iterati
Matrix Al(F, m,m),Au(F, m,m);
Matrix X(F, m,n), B(F, m,n), C(F, m,n);
- std::vector<Element> b(m),x(m),c(m);
+ BlasVector<Field> b(F,m),x(F,m),c(F,m);
// Create B a random matrix
for (size_t i=0;i<m;++i)
@@ -805,53 +977,52 @@ static bool testTriangularSolve (const Field& F, size_t m, size_t n, int iterati
}
// Create 2 trinagular matrix as view of matrix
- TriangularMatrix TAl(Al,LinBoxTag::Lower,LinBoxTag::NonUnit), TAu(Au,LinBoxTag::Upper,LinBoxTag::NonUnit);
+ TriangularMatrix TAl(Al,Tag::Shape::Lower,Tag::Diag::NonUnit), TAu(Au,Tag::Shape::Upper,Tag::Diag::NonUnit);
// testing solver with matrix right hand side
BMD.left_solve(X,TAl,B);
BMD.mul(C,Al,X);
- if (!MD.areEqual(C,B))
+ if (!BMD.areEqual(C,B))
ret=false;
BMD.left_solve(X,TAu,B);
BMD.mul(C,Au,X);
- if (!MD.areEqual(C,B))
+ if (!BMD.areEqual(C,B))
ret=false;
// testing solver with matrix left hand side
BMD.right_solve(X,TAl,B);
BMD.mul(C,X,Al);
- if (!MD.areEqual(C,B))
+ if (!BMD.areEqual(C,B))
ret=false;
BMD.right_solve(X,TAu,B);
BMD.mul(C,X,Au);
- if (!MD.areEqual(C,B))
+ if (!BMD.areEqual(C,B))
ret=false;
// testing solver with vector right hand side
BMD.left_solve(x,TAl,b);
BMD.mul(c,Al,x);
- if (!VD.areEqual(c,b))
+ if (!localAreEqual(c,b))
ret=false;
BMD.left_solve(x,TAu,b);
BMD.mul(c,Au,x);
- if (!VD.areEqual(c,b))
+ if (!localAreEqual(c,b))
ret=false;
// testing solver with vector left hand side
BMD.right_solve(x,TAl,b);
BMD.mul(c,x,Al);
- if (!VD.areEqual(c,b))
+ if (!localAreEqual(c,b))
ret=false;
BMD.right_solve(x,TAu,b);
BMD.mul(c,x,Au);
- if (!VD.areEqual(c,b))
+ if (!localAreEqual(c,b))
ret=false;
-
}
mycommentator().stop(MSG_STATUS (ret), (const char *) 0, "testTriangularSolve");
@@ -873,16 +1044,13 @@ static bool testSolve (const Field& F, size_t m, size_t n, int iterations)
//Commentator mycommentator;
mycommentator().getMessageClass (INTERNAL_DESCRIPTION).setMaxDepth (3);
mycommentator().getMessageClass (INTERNAL_DESCRIPTION).setMaxDetailLevel (Commentator::LEVEL_NORMAL);
- mycommentator().start (pretty("Testing solver"),"testTriangularSolve",iterations);
+ mycommentator().start (pretty("Testing solver"),"testTriangularSolve",(unsigned int)iterations);
RandIter G(F);
- NonzeroRandIter<Field> Gn(F,G);
- Element One,tmp;
- F.init(One,1UL);
+ Givaro::GeneralRingNonZeroRandIter<Field> Gn(G);
+ Element tmp;
bool ret = true;
- MatrixDomain<Field> MD(F);
- VectorDomain<Field> VD(F);
BlasMatrixDomain<Field> BMD(F);
for (int k=0;k<iterations;++k) {
@@ -892,7 +1060,7 @@ static bool testSolve (const Field& F, size_t m, size_t n, int iterations)
Matrix A(F, m,m),L(F, m,m),S(F, m,m);
Matrix X(F, m,n), B(F, m,n), C(F, m,n);
- std::vector<Element> b(m),x(m),c(m);
+ BlasVector<Field> b(F,m),x(F,m),c(F,m);
// Create B a random matrix
for (size_t i=0;i<m;++i)
@@ -917,7 +1085,7 @@ static bool testSolve (const Field& F, size_t m, size_t n, int iterations)
for (size_t i=0;i<m;++i){
for (size_t j=0;j<i;++j)
L.setEntry(i,j,G.random(tmp));
- L.setEntry(i,i,One);
+ L.setEntry(i,i,F.one);
}
// compute A=LS
@@ -927,46 +1095,46 @@ static bool testSolve (const Field& F, size_t m, size_t n, int iterations)
// testing solver with matrix right hand side
BMD.left_solve(X,A,B);
BMD.mul(C,A,X);
- if (!MD.areEqual(C,B))
+ if (!BMD.areEqual(C,B))
ret=false;
BMD.left_solve(X,A,B);
BMD.mul(C,A,X);
- if (!MD.areEqual(C,B))
+ if (!BMD.areEqual(C,B))
ret=false;
// testing solver with matrix left hand side
BMD.right_solve(X,A,B);
BMD.mul(C,X,A);
- if (!MD.areEqual(C,B))
+ if (!BMD.areEqual(C,B))
ret=false;
BMD.right_solve(X,A,B);
BMD.mul(C,X,A);
- if (!MD.areEqual(C,B))
+ if (!BMD.areEqual(C,B))
ret=false;
// testing solver with vector right hand side
BMD.left_solve(x,A,b);
BMD.mul(c,A,x);
- if (!VD.areEqual(c,b))
+ if (!localAreEqual(c,b))
ret=false;
BMD.left_solve(x,A,b);
BMD.mul(c,A,x);
- if (!VD.areEqual(c,b))
+ if (!localAreEqual(c,b))
ret=false;
// testing solver with vector left hand side
BMD.right_solve(x,A,b);
BMD.mul(c,x,A);
- if (!VD.areEqual(c,b))
+ if (!localAreEqual(c,b))
ret=false;
BMD.right_solve(x,A,b);
BMD.mul(c,x,A);
- if (!VD.areEqual(c,b))
+ if (!localAreEqual(c,b))
ret=false;
}
@@ -990,27 +1158,23 @@ static bool testPermutation (const Field& F, size_t m, int iterations)
//Commentator mycommentator;
mycommentator().getMessageClass (INTERNAL_DESCRIPTION).setMaxDepth (3);
mycommentator().getMessageClass (INTERNAL_DESCRIPTION).setMaxDetailLevel (Commentator::LEVEL_NORMAL);
- mycommentator().start (pretty("Testing permutations"),"testPermutation",iterations);
+ mycommentator().start (pretty("Testing permutations"),"testPermutation",(unsigned int)iterations);
RandIter G(F);
- NonzeroRandIter<Field> Gn(F,G);
- Element One,zero,tmp;
- F.init(One,1UL);
- F.init(zero,0UL);
+ Givaro::GeneralRingNonZeroRandIter<Field> Gn(G);
+ Element tmp;
bool ret = true;
- MatrixDomain<Field> MD(F);
- VectorDomain<Field> VD(F);
BlasMatrixDomain<Field> BMD(F);
for (int k=0;k<iterations;++k) {
mycommentator().progress(k);
- std::vector<size_t> P(m);
+ // std::vector<size_t> P(m);
- Field Z2(2);
- RandIter G2(Z2);
+ // Field Z2(2);
+ // RandIter G2(Z2);
// for (size_t i=0; i<m; ++i){
// G.random(tmp);
@@ -1020,9 +1184,9 @@ static bool testPermutation (const Field& F, size_t m, int iterations)
// P[i] = i;
// }
- //std::cerr<<P<<std::endl;
+ //report<<P<<std::endl;
Matrix A(F, m,m), Abis(F, m,m), B(F, m,m), C(F, m,m), D(F, m,m);
- std::vector<Element> a(m),abis(m),b(m),c(m), d(m);
+ BlasVector<Field> a(F,m),abis(F,m),b(F,m),c(F,m), d(F,m);
BlasPermutation<size_t> Perm(m);
RandomBlasPermutation(Perm);
@@ -1043,7 +1207,7 @@ static bool testPermutation (const Field& F, size_t m, int iterations)
// C = B.P^t
BMD.mul( C, B, TransposedBlasMatrix<BlasPermutation<size_t> >(Perm) );
// Test C==A
- if (!MD.areEqual(A,C))
+ if (!BMD.areEqual(A,C))
ret=false;
/*
* Test A.P^t.P == A
@@ -1054,7 +1218,7 @@ static bool testPermutation (const Field& F, size_t m, int iterations)
// C = B.P
BMD.mul( C, B, Perm );
// Test C==A
- if (!MD.areEqual(A,C))
+ if (!BMD.areEqual(A,C))
ret=false;
/*
* Test P.P^t.A == A
@@ -1065,7 +1229,7 @@ static bool testPermutation (const Field& F, size_t m, int iterations)
// C = P^t.B
BMD.mul( C, TransposedBlasMatrix<BlasPermutation<size_t> >(Perm) , B);
// Test C==A
- if (!MD.areEqual(A,C))
+ if (!BMD.areEqual(A,C))
ret=false;
/*
* Test P^t.P.A == A
@@ -1076,7 +1240,7 @@ static bool testPermutation (const Field& F, size_t m, int iterations)
// C = P.B
BMD.mul( C, Perm, B);
// Test C==A
- if (!MD.areEqual(A,C))
+ if (!BMD.areEqual(A,C))
ret=false;
/*
@@ -1088,7 +1252,7 @@ static bool testPermutation (const Field& F, size_t m, int iterations)
// c = b.P^t
BMD.mul( c, b, TransposedBlasMatrix<BlasPermutation<size_t> >(Perm) );
// Test c==a
- if (!VD.areEqual(a,c))
+ if (!localAreEqual(a,c))
ret=false;
/*
@@ -1100,7 +1264,7 @@ static bool testPermutation (const Field& F, size_t m, int iterations)
// c = B.P
BMD.mul( c, b, Perm );
// Test c==a
- if (!VD.areEqual(a,c))
+ if (!localAreEqual(a,c))
ret=false;
/*
* Test P.P^t.a == a
@@ -1111,7 +1275,7 @@ static bool testPermutation (const Field& F, size_t m, int iterations)
// c = P^t.b
BMD.mul( c, TransposedBlasMatrix<BlasPermutation<size_t> >(Perm) , b);
// Test c==a
- if (!VD.areEqual(a,c))
+ if (!localAreEqual(a,c))
ret=false;
/*
@@ -1123,7 +1287,7 @@ static bool testPermutation (const Field& F, size_t m, int iterations)
// c = P.b
BMD.mul( c, Perm, b);
// Test c==a
- if (!VD.areEqual(a,c))
+ if (!localAreEqual(a,c))
ret=false;
@@ -1143,7 +1307,7 @@ static bool testPermutation (const Field& F, size_t m, int iterations)
BMD.mul(D, A, C);
// D = P.D
BMD.mulin_right( Perm,D);
- if (!MD.areEqual(D,B))
+ if (!BMD.areEqual(D,B))
ret=false;
/*
* Test A.P^t.(A.P)^-1.B == B
@@ -1162,7 +1326,7 @@ static bool testPermutation (const Field& F, size_t m, int iterations)
// D = A.C (= P^-1.B)
BMD.mul(D, A, C);
- if (!MD.areEqual(D,B))
+ if (!BMD.areEqual(D,B))
ret=false;
/*
* Test B.P^t.A.(P.A)^-1 == B
@@ -1180,7 +1344,7 @@ static bool testPermutation (const Field& F, size_t m, int iterations)
BMD.mulin_left( C,Perm);
// D = C.A (=B)
BMD.mul(D, C, A);
- if (!MD.areEqual(D,B))
+ if (!BMD.areEqual(D,B))
ret=false;
/*
@@ -1200,7 +1364,7 @@ static bool testPermutation (const Field& F, size_t m, int iterations)
// C = C.P
BMD.mulin_left( D, Perm);
- if (!MD.areEqual(D,B))
+ if (!BMD.areEqual(D,B))
ret=false;
/*
* Test P.A.(P^t.A)^-1.B == B
@@ -1218,7 +1382,7 @@ static bool testPermutation (const Field& F, size_t m, int iterations)
BMD.mul(D, A, C);
// D = P^t.D
BMD.mulin_right( TransposedBlasMatrix<BlasPermutation<size_t> >(Perm),D);
- if (!MD.areEqual(D,B))
+ if (!BMD.areEqual(D,B))
ret=false;
/*
* Test A.P.(A.P^t)^-1.B == B
@@ -1237,7 +1401,7 @@ static bool testPermutation (const Field& F, size_t m, int iterations)
// D = A.C (= P.B)
BMD.mul(D, A, C);
- if (!MD.areEqual(D,B))
+ if (!BMD.areEqual(D,B))
ret=false;
/*
* Test B.P.A.(P^t.A)^-1 == B
@@ -1255,7 +1419,7 @@ static bool testPermutation (const Field& F, size_t m, int iterations)
BMD.mulin_left( C,TransposedBlasMatrix<BlasPermutation<size_t> >(Perm));
// D = C.A (=B)
BMD.mul(D, C, A);
- if (!MD.areEqual(D,B))
+ if (!BMD.areEqual(D,B))
ret=false;
/*
@@ -1275,7 +1439,7 @@ static bool testPermutation (const Field& F, size_t m, int iterations)
// C = C.P^t
BMD.mulin_left( D, TransposedBlasMatrix<BlasPermutation<size_t> >(Perm));
- if (!MD.areEqual(D,B))
+ if (!BMD.areEqual(D,B))
ret=false;
}
mycommentator().stop(MSG_STATUS (ret), (const char *) 0, "testLQUP");
@@ -1297,16 +1461,13 @@ static bool testLQUP (const Field& F, size_t m, size_t n, int iterations)
//Commentator mycommentator;
mycommentator().getMessageClass (INTERNAL_DESCRIPTION).setMaxDepth (3);
mycommentator().getMessageClass (INTERNAL_DESCRIPTION).setMaxDetailLevel (Commentator::LEVEL_NORMAL);
- mycommentator().start (pretty("Testing LQUP factorization"),"testLQUP",iterations);
+ mycommentator().start (pretty("Testing LQUP factorization"),"testLQUP",(unsigned int)iterations);
RandIter G(F);
- NonzeroRandIter<Field> Gn(F,G);
- Element One,zero,tmp;
- F.init(One,1UL);
- F.init(zero,0UL);
+ Givaro::GeneralRingNonZeroRandIter<Field> Gn(G);
+ Element tmp;
bool ret = true;
- MatrixDomain<Field> MD(F);
BlasMatrixDomain<Field> BMD(F);
for (int k=0;k<iterations;++k) {
@@ -1323,7 +1484,7 @@ static bool testLQUP (const Field& F, size_t m, size_t n, int iterations)
B.setEntry(i,j,G.random(tmp));
else
for (size_t i=0;i<m;++i)
- B.setEntry(i,j,zero);
+ B.setEntry(i,j,F.zero);
// Create C a random matrix of rank n/2
for (size_t i=0;i<m;++i)
if ( i % 2 )
@@ -1331,7 +1492,7 @@ static bool testLQUP (const Field& F, size_t m, size_t n, int iterations)
C.setEntry(i,j,G.random(tmp));
else
for (size_t j=0;j<n;++j)
- C.setEntry(i,j,zero);
+ C.setEntry(i,j,F.zero);
// A = B*C
BMD.mul(A, B, C);
@@ -1341,8 +1502,8 @@ static bool testLQUP (const Field& F, size_t m, size_t n, int iterations)
BlasPermutation<size_t> P(A.coldim()),Q(A.rowdim());
LQUPMatrix<Field> X(A,P,Q);
- TriangularBlasMatrix<Field> L(F,m,m,LinBoxTag::Lower,LinBoxTag::Unit);
- TriangularBlasMatrix<Field> U(F,m,n,LinBoxTag::Upper,LinBoxTag::NonUnit);
+ TriangularBlasMatrix<Field> L(F,m,m,Tag::Shape::Lower,Tag::Diag::Unit);
+ TriangularBlasMatrix<Field> U(F,m,n,Tag::Shape::Upper,Tag::Diag::NonUnit);
X.getL(L);
X.getU(U);
P=X.getP();
@@ -1356,7 +1517,7 @@ static bool testLQUP (const Field& F, size_t m, size_t n, int iterations)
// A = L*C
BMD.mul( A, L, C);
- if (!MD.areEqual(A,Abis))
+ if (!BMD.areEqual(A,Abis))
ret=false;
// Second pass
@@ -1367,8 +1528,8 @@ static bool testLQUP (const Field& F, size_t m, size_t n, int iterations)
LQUPMatrix<Field> Y(A,P,Q);
- TriangularBlasMatrix<Field> L2(F,m,m,LinBoxTag::Lower,LinBoxTag::Unit);
- TriangularBlasMatrix<Field> U2(F,m,n,LinBoxTag::Upper,LinBoxTag::NonUnit);
+ TriangularBlasMatrix<Field> L2(F,m,m,Tag::Shape::Lower,Tag::Diag::Unit);
+ TriangularBlasMatrix<Field> U2(F,m,n,Tag::Shape::Upper,Tag::Diag::NonUnit);
Y.getL(L2);
Y.getU(U2);
P=Y.getP();
@@ -1382,7 +1543,7 @@ static bool testLQUP (const Field& F, size_t m, size_t n, int iterations)
// A = L*C
BMD.mul( A, L2, C);
- if (!MD.areEqual(A,Abis))
+ if (!BMD.areEqual(A,Abis))
ret=false;
}
@@ -1397,18 +1558,14 @@ static bool testMinPoly (const Field& F, size_t n, int iterations)
typedef typename Field::Element Element;
typedef BlasMatrix<Field> Matrix;
typedef typename Field::RandIter RandIter;
- typedef vector<Element> Polynomial;
+ typedef BlasVector<Field> Polynomial;
//Commentator mycommentator;
mycommentator().getMessageClass (INTERNAL_DESCRIPTION).setMaxDepth (3);
mycommentator().getMessageClass (INTERNAL_DESCRIPTION).setMaxDetailLevel (Commentator::LEVEL_NORMAL);
- mycommentator().start (pretty("Testing minpoly"),"testMinPoly",iterations);
- Element tmp, one, zero,mOne;
+ mycommentator().start (pretty("Testing minpoly"),"testMinPoly",(unsigned int)iterations);
+ Element tmp ;
RandIter G(F);
- NonzeroRandIter<Field> Gn(F,G);
- F.init(one, 1UL);
- F.init(zero, 0UL);
- F.neg(mOne, one);
- //F.neg( mOne, one);
+ Givaro::GeneralRingNonZeroRandIter<Field> Gn(G);
bool ret = true;
BlasMatrixDomain<Field> BMD(F);
@@ -1417,18 +1574,18 @@ static bool testMinPoly (const Field& F, size_t n, int iterations)
mycommentator().progress(k);
Matrix A(F,n,n);
- Polynomial P;
+ Polynomial P(F);
// Test MinPoly(In) = X-1
for (size_t i=0;i<n;++i)
- A.setEntry(i,i,one);
+ A.setEntry(i,i,F.one);
BMD.minpoly( P, A );
if ( P.size() !=2 )
ret = false;
- if ( !F.areEqual(P[0], mOne) )
+ if ( !F.areEqual(P[0], F.mOne) )
ret = false;
- if ( !F.areEqual(P[1], one) )
+ if ( !F.areEqual(P[1], F.one) )
ret = false;
// Test MinPoly(a*In) = X-a
@@ -1442,27 +1599,27 @@ static bool testMinPoly (const Field& F, size_t n, int iterations)
ret = false;
if ( !F.areEqual(P[0], tmp) )
ret = false;
- if ( !F.areEqual(P[1], one) )
+ if ( !F.areEqual(P[1], F.one) )
ret = false;
for (size_t i=0;i<n-1;++i){
for (size_t j=0; j<i+1; ++j)
- A.setEntry(i,j,zero);
- A.setEntry(i,i+1,one);
+ A.setEntry(i,j,F.zero);
+ A.setEntry(i,i+1,F.one);
if (i<n-2)
for (size_t j=i+2; j<n; ++j)
- A.setEntry(i,j,zero);
+ A.setEntry(i,j,F.zero);
}
for (size_t j=0;j<n;++j)
- A.setEntry(n-1,j,zero);
+ A.setEntry(n-1,j,F.zero);
BMD.minpoly( P, A );
if ( P.size() !=n+1 )
ret = false;
for (size_t i=0; i<n;++i)
- if ( !F.areEqual(P[i], zero) )
+ if ( !F.areEqual(P[i], F.zero) )
ret = false;
- if ( !F.areEqual(P[n], one) )
+ if ( !F.areEqual(P[n], F.one) )
ret = false;
}
@@ -1478,18 +1635,15 @@ static bool testCharPoly (const Field& F, size_t n, int iterations)
typedef typename Field::Element Element;
typedef BlasMatrix<Field> Matrix;
typedef typename Field::RandIter RandIter;
+ // typedef BlasVector<Field> Polynomial;
typedef vector<Element> Polynomial;
//Commentator mycommentator;
mycommentator().getMessageClass (INTERNAL_DESCRIPTION).setMaxDepth (3);
mycommentator().getMessageClass (INTERNAL_DESCRIPTION).setMaxDetailLevel (Commentator::LEVEL_NORMAL);
- mycommentator().start (pretty("Testing charpoly"),"testCharPoly",iterations);
- Element tmp, one, zero,mOne;
+ mycommentator().start (pretty("Testing charpoly"),"testCharPoly",(unsigned int)iterations);
+ Element tmp ;
RandIter G(F);
- NonzeroRandIter<Field> Gn(F,G);
- F.init(one, 1UL);
- F.init(zero, 0UL);
- F.neg(mOne, one);
- //F.neg( mOne, one);
+ Givaro::GeneralRingNonZeroRandIter<Field> Gn(G);
bool ret = true;
BlasMatrixDomain<Field> BMD(F);
@@ -1502,10 +1656,10 @@ static bool testCharPoly (const Field& F, size_t n, int iterations)
// Test CharPoly(In) = (X-1)^n
for (size_t i=0;i<n;++i){
for (size_t j=0;j<i;++j)
- A.setEntry(i,j,zero);
- A.setEntry(i,i,one);
+ A.setEntry(i,j,F.zero);
+ A.setEntry(i,i,F.one);
for (size_t j=i+1;j<n;++j)
- A.setEntry(i,j,zero);
+ A.setEntry(i,j,F.zero);
}
P.clear();
BMD.charpoly( P, A );
@@ -1514,12 +1668,12 @@ static bool testCharPoly (const Field& F, size_t n, int iterations)
while (P_it != P.end()){
if ( P_it->size() !=2 )
ret = false;
- if ( !F.areEqual(P_it->operator[](0), mOne) )
+ if ( !F.areEqual(P_it->operator[](0), F.mOne) )
ret = false;
- if ( !F.areEqual(P_it->operator[](1), one) )
+ if ( !F.areEqual(P_it->operator[](1), F.one) )
ret = false;
- P_it++;
+ ++P_it;
}
// Test CharPoly(a*In) = X-a
@@ -1536,9 +1690,9 @@ static bool testCharPoly (const Field& F, size_t n, int iterations)
ret = false;
if ( !F.areEqual(P_it->operator[](0), tmp) )
ret = false;
- if ( !F.areEqual(P_it->operator[](1), one) )
+ if ( !F.areEqual(P_it->operator[](1), F.one) )
ret = false;
- P_it++;
+ ++P_it;
}
}
@@ -1547,18 +1701,64 @@ static bool testCharPoly (const Field& F, size_t n, int iterations)
return ret;
}
+template<class Field>
+static bool testBlasMatrixConstructors(const Field& Fld, size_t m, size_t n)
+{
+ bool pass = true;
+ // typedef typename Field::Element Element;
+ BlasMatrixDomain<Field> BMD(Fld);
+ //BlasMatrix<Field> A; // nowhere to go
+
+ BlasMatrix<Field> B(Fld);
+ B.resize(m, n, Fld.zero);
+ // don't understand the variations on integer types for the indices...
+
+ BlasMatrix<Field> C(Fld,m,n);
+ pass = pass and BMD.areEqual(B, C);
+
+// MatrixStream<Field> ms; ...
+// BlasMatrix<Field> D(ms);
+// pass = pass and BMD.areEqual(B, D);
+ ScalarMatrix<Field> Eo(Fld, n, n, Fld.zero);
+ BlasMatrix<Field> E(Eo); // copy a bb
+ pass = pass and BMD.areEqual(B, E);
+
+#if 0
+ ScalarMatrix<Field> Fo(Fld, 2*m, 2*m, Fld.zero);
+ BlasMatrix F(Fo, m, 0, m, n) ; // copy subm of a bb
+ pass = pass and BMD.areEqual(B, F);
+
+ BlasMatrix<Field> G(Eo, Fld); // other field?
+ pass = pass and BMD.areEqual(B, G);
+
+ BlasMatrix<Field> H(B); // copy cstor
+ pass = pass and BMD.areEqual(B, H);
+
+ BlasVector<Field> v(Fld,m*n, Fld.zero);
+ BlasMatrix<Field> I(Fld,v,m,n);
+ pass = pass and BMD.areEqual(B, I);
+
+ Element *p = &v[0];
+ BlasMatrix<Field> J(Fld,p,m,n);
+ pass = pass and BMD.areEqual(B, J);
+#endif
+
+ return pass;
+}
// returns true if ok, false if not.
template<class Field>
-int launch_tests(Field & F, int n, int iterations)
+int launch_tests(Field & F, size_t n, int iterations)
{
bool pass = true ;
- //std::cout << "no blas tests for now" << std::endl;
+ //report << "no blas tests for now" << std::endl;
// no slow test while I work on io
+ if (!testBlasMatrixConstructors(F, n, n)) pass=false;
if (!testMulAdd (F,n,iterations)) pass=false;
- if (!testMulAddAgain (F,n,iterations)) pass=false;
- int m = n+n/2 ; int k = 2*n+1 ;
+ if (0==F.characteristic()) if
+ (!testMulAddAgain (F,n,iterations)) pass=false;
+ size_t m = n+n/2 ; size_t k = 2*n+1 ;
if (!testMulAddShapeTrans (F,n,m,k,iterations)) pass=false;
if (!testMulAddShapeTrans (F,n,k,m,iterations)) pass=false;
if (!testMulAddShapeTrans (F,m,n,k,iterations)) pass=false;
@@ -1584,70 +1784,29 @@ int launch_tests(Field & F, int n, int iterations)
if (!testCharPoly (F,n,iterations)) pass=false;
//
//
+ if (not pass) F.write(report) << endl;
return pass ;
}
-int main(int argc, char **argv)
+bool launch_gf2_tests(GF2 & F, size_t n)
{
-
- static size_t n = 40;
- static integer q = 1000003U;
- static int iterations = 2;
-
- static Argument args[] = {
- { 'n', "-n N", "Set dimension of test matrices to NxN", TYPE_INT, &n },
- { 'q', "-q Q", "Operate over the \"field\" GF(Q) [1]", TYPE_INTEGER, &q },
- { 'i', "-i I", "Perform each test for I iterations", TYPE_INT, &iterations },
- END_OF_ARGUMENTS
- };
-
- parseArguments (argc, argv, args);
-
- typedef Modular<double> Field;
- //typedef Modular<int> Field;
- //typedef Modular<float> Field;
-
- Field F1 (q);
- ModularBalanced<double> F2(q);
- Modular<float> F3(2011);
- GF2 F4 ;
- GivaroZpz<Givaro::Unsigned32> F5(2001);
- Modular<bool> F6 ;
- // BB. (Blas)MatrixDomain are not very generic...
-#ifdef __LINBOX_HAVE_NTL
- NTL::ZZ_p::init(NTL::to_ZZ((size_t)q));
- NTL_ZZ_p F7;
-#endif
-
-
bool pass = true;
-
- srand ((unsigned)time (NULL));
-
-
- commentator().getMessageClass (INTERNAL_DESCRIPTION).setMaxDepth (3);
- commentator().getMessageClass (INTERNAL_DESCRIPTION).setMaxDetailLevel (Commentator::LEVEL_NORMAL);
-
- commentator().start("BlasMatrixDomain test suite", "BlasMatrixDomain");
-
- pass &= launch_tests(F1,(int)n,iterations);
- pass &= launch_tests(F2,(int)n,iterations);
- pass &= launch_tests(F3,(int)n,iterations);
-#pragma message "#warning GF2 is not working at all -> working on m4ri"
- // pass &= launch_tests(F4,(int)n,iterations);
- // pass &= launch_tests(F6,(int)n,iterations);
-#pragma message "#warning GivaroZpz is not working at all"
- // pass &= launch_tests(F5,(int)n,iterations);
-#ifdef __LINBOX_HAVE_NTL
-#pragma message "#warning NTL_ZZp is not working at all"
- // pass &= launch_tests(F7,(int)n,iterations);
-#endif
-
- commentator().stop(MSG_STATUS (pass), (const char *) 0,"BlasMatrixDomain test suite");
- return pass ? 0 : -1;
+ //pass = pass and testRank(F, n, 1);
+ //pass = pass and testDet(F, n, 1);
+ //pass = pass and testMulAdd(F, n, 1);
+ return pass ;
}
+#if 0
+bool launch_gf3_tests(GF3 & F, size_t n)
+{
+ bool pass = true;
+ //pass = pass and testRank(F, n, 1);
+ //pass = pass and launch_tests(F, n, 1); // fails with std BlasMatrixDomain
+ return pass ;
+}
+#endif
// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
diff --git a/tests/test-blas-matrix.C b/tests/test-blas-matrix.C
new file mode 100644
index 0000000..232c8f4
--- /dev/null
+++ b/tests/test-blas-matrix.C
@@ -0,0 +1,356 @@
+/*
+ * Copyright (C) 2014 the LinBox group
+ *
+ * Written by :
+ * Brice Boyer (briceboyer) <boyer.brice at gmail.com>
+ *
+ * --------------------------------------------------------
+ *
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ * ========LICENCE========
+ *.
+ */
+
+#include "linbox/linbox-config.h"
+#include <givaro/modular.h>
+#include <givaro/modular-balanced.h>
+
+#include "linbox/integer.h"
+#include "givaro/zring.h"
+#include "linbox/ring/modular.h"
+#include "linbox/matrix/dense-matrix.h"
+
+#include "test-common.h"
+#include "test-blackbox.h"
+
+using namespace LinBox ;
+
+//! @bug remove NoRW
+template<class Matrix>
+bool testMatrix(const typename Matrix::Field & F, size_t m, size_t n, bool rw = true) {
+ bool pass = true;
+ Matrix A(F, m, n);
+ A.random();
+ pass = pass && testBlackbox(A,rw);
+
+ if (std::min(m,n)>1) {
+ BlasSubmatrix<Matrix> B(A,1,1,m/2,n/2);
+ pass = pass && testBlackboxNoRW(B);
+ }
+
+ return pass ;
+}
+
+int main (int argc, char **argv)
+{
+ // ofstream report;
+
+ bool pass = true;
+
+ static size_t m = 4;
+ static size_t n = 10;
+ // static size_t nnz = 0;
+ static integer q = 101 ;
+
+ static Argument args[] = {
+ { 'm', "-m M", "Set row dimension of test matrix to M.", TYPE_INT, &m },
+ { 'n', "-n N", "Set col dimension of test matrix to N.", TYPE_INT, &n },
+ { 'q', "-q Q", "Operate over the \"field\" GF(Q) [1].", TYPE_INTEGER, &q },
+ END_OF_ARGUMENTS
+ };
+
+ parseArguments (argc, argv, args);
+
+ srand ((unsigned)time (NULL));
+
+ commentator().start("BlasMatrix black box test suite", "triplesbb");
+
+ { /* Givaro::Modular<float> */
+ //Field
+ typedef Givaro::Modular<float> Field;
+
+ Field F (q);
+ commentator().start("Givaro::Modular<float>");
+
+ typedef BlasMatrix<Field,Vector<Field>::Dense> Matrix ;
+
+ pass = pass && testMatrix<Matrix>(F,m,n);
+
+ commentator().stop(MSG_STATUS (pass), (const char *) 0,"Givaro::Modular<float>");
+ }
+
+ { /* Givaro::ModularBalanced<float> */
+ //Field
+ typedef Givaro::ModularBalanced<float> Field;
+
+ Field F (q);
+ commentator().start("Givaro::ModularBalanced<float>");
+
+ typedef BlasMatrix<Field,Vector<Field>::Dense> Matrix ;
+
+ pass = pass && testMatrix<Matrix>(F,m,n);
+ commentator().stop(MSG_STATUS (pass), (const char *) 0,"Givaro::ModularBalanced<float>");
+ }
+
+ { /* Givaro::Modular<double> */
+ //Field
+ typedef Givaro::Modular<double> Field;
+
+ Field F (q);
+ commentator().start("Givaro::Modular<double>");
+
+ typedef BlasMatrix<Field,Vector<Field>::Dense> Matrix ;
+
+ pass = pass && testMatrix<Matrix>(F,m,n);
+
+ commentator().stop(MSG_STATUS (pass), (const char *) 0,"Givaro::Modular<double>");
+ }
+
+ { /* Givaro::ModularBalanced<double> */
+ //Field
+ typedef Givaro::ModularBalanced<double> Field;
+
+ Field F (q);
+ commentator().start("Givaro::ModularBalanced<double>");
+
+ typedef BlasMatrix<Field,Vector<Field>::Dense> Matrix ;
+
+ pass = pass && testMatrix<Matrix>(F,m,n);
+ commentator().stop(MSG_STATUS (pass), (const char *) 0,"Givaro::ModularBalanced<double>");
+ }
+
+ { /* Givaro::Modular<int64_t> */
+ //Field
+ typedef Givaro::Modular<int64_t> Field;
+
+ Field F (q);
+ commentator().start("Givaro::Modular<int64_t>");
+
+ typedef BlasMatrix<Field,Vector<Field>::Dense> Matrix ;
+
+ pass = pass && testMatrix<Matrix>(F,m,n);
+ commentator().stop(MSG_STATUS (pass), (const char *) 0,"Givaro::Modular<int64_t>");
+ }
+
+ { /* Givaro::ModularBalanced<int64_t> */
+ //Field
+ typedef Givaro::ModularBalanced<int64_t> Field;
+
+ Field F (q);
+ commentator().start("Givaro::ModularBalanced<int64_t>");
+
+ typedef BlasMatrix<Field,Vector<Field>::Dense> Matrix ;
+
+ pass = pass && testMatrix<Matrix>(F,m,n);
+ commentator().stop(MSG_STATUS (pass), (const char *) 0,"Givaro::ModularBalanced<int64_t>");
+ }
+ { /* Givaro::Modular<uint64_t> */
+#if 0
+ //Field
+ typedef Givaro::Modular<uint64_t> Field;
+
+ Field F (q);
+ commentator().start("Givaro::Modular<uint64_t>");
+
+ typedef BlasMatrix<Field,Vector<Field>::Dense> Matrix ;
+
+ pass = pass && testMatrix<Matrix>(F,m,n);
+ commentator().stop(MSG_STATUS (pass), (const char *) 0,"Givaro::Modular<uint64_t>");
+#endif
+ }
+ { /* Givaro::Modular<int32_t> */
+ //Field
+ typedef Givaro::Modular<int32_t> Field;
+
+ Field F (q);
+ commentator().start("Givaro::Modular<int32_t>");
+
+ typedef BlasMatrix<Field,Vector<Field>::Dense> Matrix ;
+
+ pass = pass && testMatrix<Matrix>(F,m,n);
+ commentator().stop(MSG_STATUS (pass), (const char *) 0,"Givaro::Modular<int32_t>");
+ }
+
+ { /* Givaro::ModularBalanced<int32_t> */
+ //Field
+ typedef Givaro::ModularBalanced<int32_t> Field;
+
+ Field F (q);
+ commentator().start("Givaro::ModularBalanced<int32_t>");
+
+ typedef BlasMatrix<Field,Vector<Field>::Dense> Matrix ;
+
+ pass = pass && testMatrix<Matrix>(F,m,n);
+ commentator().stop(MSG_STATUS (pass), (const char *) 0,"Givaro::ModularBalanced<int32_t>");
+ }
+
+ { /* Givaro::Modular<uint32_t> */
+ //Field
+ typedef Givaro::Modular<uint32_t> Field;
+
+ Field F (q);
+ commentator().start("Givaro::Modular<uint32_t>");
+
+ typedef BlasMatrix<Field,Vector<Field>::Dense> Matrix ;
+
+ pass = pass && testMatrix<Matrix>(F,m,n);
+ commentator().stop(MSG_STATUS (pass), (const char *) 0,"Givaro::Modular<uint32_t>");
+ }
+
+ { /* Givaro::Modular<int16_t> */
+#if 0 /* not working */
+ //Field
+ typedef Givaro::Modular<int16_t> Field;
+
+ Field F (q);
+ commentator().start("Givaro::Modular<int16_t>");
+
+ typedef BlasMatrix<Field,Vector<Field>::Dense> Matrix ;
+
+ pass = pass && testMatrix<Matrix>(F,m,n);
+ commentator().stop(MSG_STATUS (pass), (const char *) 0,"Givaro::Modular<int16_t>");
+#endif
+ }
+
+ { /* Givaro::ModularBalanced<int16_t> */
+#if 0 /* not working */
+ //Field
+ typedef Givaro::ModularBalanced<int16_t> Field;
+
+ Field F (q);
+ commentator().start("Givaro::ModularBalanced<int16_t>");
+
+ typedef BlasMatrix<Field,Vector<Field>::Dense> Matrix ;
+
+ pass = pass && testMatrix<Matrix>(F,m,n);
+ commentator().stop(MSG_STATUS (pass), (const char *) 0,"Givaro::ModularBalanced<int16_t>");
+#endif
+ }
+
+ { /* Givaro::Modular<uint16_t> */
+#if 0 /* not working */
+ //Field
+ typedef Givaro::Modular<uint16_t> Field;
+
+ Field F (q);
+ commentator().start("Givaro::Modular<uint16_t>");
+
+ typedef BlasMatrix<Field,Vector<Field>::Dense> Matrix ;
+
+ pass = pass && testMatrix<Matrix>(F,m,n);
+ commentator().stop(MSG_STATUS (pass), (const char *) 0,"Givaro::Modular<uint16_t>");
+#endif
+ }
+
+ { /* Givaro::Modular<char> */
+#if 0 /* not working */
+ //Field
+ typedef Givaro::Modular<char> Field;
+
+ Field F (q);
+
+ typedef BlasMatrix<Field,Vector<Field>::Dense> Matrix ;
+
+ pass = pass && testMatrix<Matrix>(F,m,n);
+#endif
+ }
+
+ { /* Givaro::ModularBalanced<char> */
+#if 0 /* not working */
+ //Field
+ typedef Givaro::ModularBalanced<char> Field;
+
+ Field F (q);
+
+ typedef BlasMatrix<Field,Vector<Field>::Dense> Matrix ;
+
+ pass = pass && testMatrix<Matrix>(F,m,n);
+#endif
+ }
+
+ { /* Givaro::Modular<uint32_t> */
+#if 0 /* bug somewhere */
+ //Field
+ typedef Givaro::Modular<uint32_t> Field;
+
+ Field F (q);
+
+ typedef BlasMatrix<Field,Vector<Field>::Dense> Matrix ;
+
+ pass = pass && testMatrix<Matrix>(F,m,n);
+#endif
+ }
+
+ { /* Givaro::Modular<integer> */
+#if 0 /* bug somewhere */
+ //Field
+ typedef Givaro::Modular<integer> Field;
+
+ Field F (123456789124);
+ commentator().start("Givaro::Modular<integer>");
+
+ typedef BlasMatrix<Field,Vector<Field>::Dense> Matrix ;
+
+ pass = pass && testMatrix<Matrix>(F,m,n);
+ commentator().stop(MSG_STATUS (pass), (const char *) 0,"Givaro::Modular<integer>");
+#endif
+ }
+
+ { /* Givaro::ZRing<Integer> */
+#if 0 /* bug somewhere */
+ //Field
+ typedef Givaro::ZRing<Integer> Field;
+
+ Field F ;
+ commentator().start("Givaro::ZRing<Integer>");
+
+ typedef BlasMatrix<Field,Vector<Field>::Dense> Matrix ;
+
+ pass = pass && testMatrix<Matrix>(F,m,n);
+ commentator().stop(MSG_STATUS (pass), (const char *) 0,"Givaro::ZRing<Integer>");
+#endif
+ }
+
+ { /* Givaro::Extension<> */
+#if 0 /* bug somewhere */
+ //Field
+ typedef Givaro::Extension<> Field;
+
+ Field F(103,4) ;
+ commentator().start("Givaro::Extension<>");
+
+ typedef BlasMatrix<Field,Vector<Field>::Dense> Matrix ;
+
+ pass = pass && testMatrix<Matrix>(F,m,n, false);
+ commentator().stop(MSG_STATUS (pass), (const char *) 0,"Givaro::Extension<>");
+#endif
+ }
+
+ commentator().stop(MSG_STATUS(pass),(const char *) 0,"BlasMatrix BB test suite");
+ return pass ? 0 : -1;
+}
+
+
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/tests/test-block-ring.C b/tests/test-block-ring.C
index 0f11d18..a04b38a 100644
--- a/tests/test-block-ring.C
+++ b/tests/test-block-ring.C
@@ -35,10 +35,10 @@
#include <iostream>
#include <fstream>
-#include <vector>
-#include "linbox/field/modular.h"
+
+#include "linbox/ring/modular.h"
#include "linbox/field/block-ring.h"
#include "test-common.h"
@@ -64,8 +64,8 @@ int main (int argc, char **argv)
commentator().start("block-ring test suite", "block-ring");
bool pass = true;
- typedef Modular<int> Field1;
- typedef Modular<double> Field2;
+ typedef Givaro::Modular<int> Field1;
+ typedef Givaro::Modular<double> Field2;
Field1 F1(q, 1);
BlockRing<Field1> R1(F1, n);
@@ -79,8 +79,8 @@ int main (int argc, char **argv)
commentator().getMessageClass (INTERNAL_DESCRIPTION).setMaxDetailLevel (Commentator::LEVEL_UNIMPORTANT);
- if (!runBasicRingTests(R1, "BlockRing of Modular<int>", iterations)) pass = false;
- if (!runBasicRingTests(R2, "BlockRing of Modular<double>", iterations)) pass = false;
+ if (!runBasicRingTests(R1, "BlockRing of Givaro::Modular<int>", (unsigned int)iterations)) pass = false;
+ if (!runBasicRingTests(R2, "BlockRing of Givaro::Modular<double>", (unsigned int)iterations)) pass = false;
commentator().stop("block-ring test suite");
return pass ? 0 : -1;
diff --git a/tests/test-block-wiedemann.C b/tests/test-block-wiedemann.C
new file mode 100644
index 0000000..e5d173e
--- /dev/null
+++ b/tests/test-block-wiedemann.C
@@ -0,0 +1,190 @@
+/* tests/test-block-wiedemann.C
+ * evolved by -bds from test-solve.C
+ *
+ * --------------------------------------------------------
+ *
+ * Copyright (c) LinBox
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ * ========LICENCE========
+ *
+ */
+
+/*! @file tests/test-block-wiedemann.C
+ * @ingroup tests
+ * @brief no doc.
+ * @test no doc.
+ */
+
+
+#include "linbox/linbox-config.h"
+#include <iostream>
+
+#include "linbox/util/commentator.h"
+#include "linbox/ring/modular.h"
+#include "linbox/vector/stream.h"
+#include "linbox/matrix/matrix-domain.h"
+
+#include "linbox/algorithms/block-wiedemann.h"
+#include "linbox/algorithms/coppersmith.h"
+#include "linbox/matrix/sparse-matrix.h"
+#include "linbox/blackbox/diagonal.h"
+#include "linbox/blackbox/scalar-matrix.h"
+
+#include "test-common.h"
+
+using namespace LinBox;
+
+/* Tests nonsingular solving for a random right-hand side.
+ *
+ * Solver - a block Wiedemann solver (see coppersmith.h or block-wiedemann.h).
+ * Blackbox - nonsingular matrix (rhs will be a random vector).
+ *
+ * Checks the result, returning true on success and false on failure
+ */
+template <class Solver, class Blackbox>
+bool testBlockSolver(Solver & S, Blackbox & M, string desc){
+ ostream &report = commentator().report (Commentator::LEVEL_IMPORTANT, INTERNAL_DESCRIPTION);
+
+ typedef typename Blackbox::Field Field;
+ typedef BlasVector<Field> Vector;
+ bool pass = true;
+ size_t n = M.coldim();
+ Vector b(M.field(),n), x(M.field(),n), y(M.field(),n);
+ typename Field::RandIter gen(M.field());
+ RandomDenseStream<Field> s (M.field(), gen, n, 1);
+ s.next (b);
+ VectorDomain<Field> VD (M.field());
+ VD.write (report << "Right-hand side: b = ", b) << endl;
+
+ S.solveNonSingular(x, M, b);
+
+ VD.write (report << desc << " solution: ", x) << endl;
+ M.apply (y, x);
+ VD.write ( report << "Output: ", y) << endl;
+
+ if (!VD.areEqual (y, b)) {
+ pass = false;
+ report << "ERROR: " << desc << " solution is incorrect" << endl;
+ }
+ return pass;
+}
+
+int main (int argc, char **argv)
+{
+ bool pass = true;
+
+ static size_t n = 9;
+// static size_t N = 16;
+ static size_t q = 65521U;
+ static size_t blocking = 0;
+
+ static Argument args[] = {
+ { 'n', "-n N", "Set dimension of test matrices to n.", TYPE_INT, &n },
+// { 'N', "-N N", "Set blocking factor to N.", TYPE_INT, &N },
+ { 'q', "-q Q", "Operate over the \"field\" GF(Q) [1].", TYPE_INT, &q },
+ { 'b', "-b N", "Set the blocking size", TYPE_INT, &blocking },
+ END_OF_ARGUMENTS
+ };
+
+ parseArguments (argc, argv, args);
+
+ typedef Givaro::Modular<double> Field;
+ //typedef Givaro::Modular<uint32_t> Field;
+ typedef BlasVector<Field> Vector;
+
+ Field F ( (uint32_t) q); Field::RandIter gen(F);
+ MatrixDomain<Field> MD(F);
+
+ commentator().start("block wiedemann test suite", "block-wiedemann");
+ ostream &report = commentator().report (Commentator::LEVEL_IMPORTANT, INTERNAL_DESCRIPTION);
+
+ RandomDenseStream<Field> s(F, gen, n, 2);
+ Vector d(F,n);
+ s.next (d);
+ for (size_t i = 0; i < d.size(); ++i)
+ if (F.isZero(d[i])) report << "Warning: zero in vector" << endl;
+
+ // some matrices
+ ScalarMatrix<Field> SC (F, n, n, F.one); // identity
+
+ Diagonal <Field> D (d); // random nonsingular diagonal
+
+ SparseMatrix<Field, SparseMatrixFormat::TPL> S (F, n, n);
+ for (size_t i = 1; i < n; ++i) S.setEntry(i, i-1, F.one); // subdiag
+ for (size_t i = 0; i < n; ++i) S.setEntry(i, n-1, d[i]); // last col
+ S.finalize(); // companion matrix of d
+
+// RCS is Yuhasz' Matrix Berlekamp Massey method.
+ CoppersmithSolver< MatrixDomain<Field> > RCS(MD,blocking);
+
+/*
+ commentator().start("Ident, CoppersmithSolver", "I-Coppersmith");
+ pass = pass and testBlockSolver(RCS, SC, "ScalarMatrix(I), Matrix Berlekamp Massey");
+ commentator().stop("Ident, CoppersmithSolver");
+*/
+
+ commentator().start("Diag, CoppersmithSolver", "D-Coppersmith");
+ pass = pass and testBlockSolver(RCS, D, "Diagonal, Matrix Berlekamp Massey");
+ commentator().stop("Diag, CoppersmithSolver");
+
+ commentator().start("Companion, CoppersmithSolver", "C-Coppersmith");
+ pass = pass and testBlockSolver(RCS, S, "Companion, Matrix Berlekamp Massey");
+ commentator().stop("Companion, CoppersmithSolver");
+
+#if 1
+// LBWS is Giorgi's block method, SigmaBasis based.
+
+#ifdef __LINBOX_HAVE_OCL
+// using this as a test of the opencl matrix domain
+ typedef OpenCLMatrixDomain<Field> Context;
+// but note, shouldn't need the ifdef. OpenCLMatrixDomain defaults to BlasMatrixDomain calls.
+#else
+ typedef BlasMatrixDomain<Field> Context;
+#endif
+ Context BMD(F);
+ BlockWiedemannSolver<Context> LBWS(BMD);
+
+/*
+ commentator().start("Ident, BlockWiedemannSolver", "I-Sigma Basis");
+ pass = pass and testBlockSolver(LBWS, SC, "ScalarMatrix(I), Sigma Basis");
+ commentator().stop("Ident, BlockWiedemannSolver");
+*/
+
+ commentator().start("Diag, BlockWiedemannSolver", "D-Sigma Basis");
+ pass = pass and testBlockSolver(LBWS, D, "Diagonal, Sigma Basis");
+ commentator().stop("Diag, BlockWiedemannSolver");
+
+ commentator().start("Companion, BlockWiedemannSolver", "C-Sigma Basis");
+ pass = pass and testBlockSolver(LBWS, S, "Companion, Sigma Basis");
+ commentator().stop("Companion, BlockWiedemannSolver");
+#endif
+
+ commentator().stop("block wiedemann test suite");
+ //std::cout << (pass ? "passed" : "FAILED" ) << std::endl;
+
+ return pass ? 0 : -1;
+}
+
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/tests/test-bmseq.C b/tests/test-bmseq.C
deleted file mode 100644
index dbcc75a..0000000
--- a/tests/test-bmseq.C
+++ /dev/null
@@ -1,233 +0,0 @@
-
-/* tests/test-dense.C
- * Copyright (C) 2001, 2002 Bradford Hovinen
- *
- * Written by George Yuhasz <yuhasz at gmail.com>
- *
- * --------------------------------------------------------
- *
- *
- * ========LICENCE========
- * This file is part of the library LinBox.
- *
- * LinBox is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- * ========LICENCE========
- *
- */
-
-#include "linbox/linbox-config.h"
-
-#include <iostream>
-#include <fstream>
-#include <vector>
-#include <cstdio>
-#include <algorithm>
-#include <set>
-#include <list>
-
-#include "linbox/util/commentator.h"
-#include "linbox/field/modular.h"
-#include "linbox/algorithms/bm-seq.h"
-
-#include "test-common.h"
-#include "test-generic.h"
-
-using namespace LinBox;
-using namespace std;
-
-/* Test 1: Identity matrix in dense representation
- *
- * Construct a dense representation of an n x n identity matrix and check
- * whether the output of its application to a series of random vectors is equal
- * to the input.
- *
- * F - Field over which to perform computations
- * n - Dimension to which to make matrix
- * iterations - Number of random vectors to which to apply identity inverse
- *
- * Return true on success and false on failure
- */
-
-template <class Field>
-static bool testIdentity (Field &F, long n, int iterations)
-{
- typedef typename Vector<Field>::Dense Vector;
- typedef BlasMatrix <Field> Blackbox;
-
- commentator().start ("Testing identity apply", "testIdentity", iterations);
- ostream &report = commentator().report (Commentator::LEVEL_IMPORTANT, INTERNAL_DESCRIPTION);
-
- bool ret = true;
- bool iter_passed = true;
-
- int i, j;
-
- Blackbox I (F, n, n);
- typename Field::Element one;
-
- F.init (one, 1);
-
- for (i = 0; i < n; i++)
- I.setEntry (i, i, one);
-
- Vector v(n), w(n);
- typename Field::RandIter r (F);
-
- for (i = 0; i < iterations; i++) {
- char buf[80];
- snprintf (buf, 80, "Iteration %d", i);
- commentator().start (buf);
-
- iter_passed = true;
-
- for (j = 0; j < n; j++)
- r.random (v[j]);
-
- report << "Input vector: ";
- printVector<Field> (F, report, v);
-
- I.apply (w, v);
-
- report << "Output vector: ";
- printVector<Field> (F, report, w);
-
- for (j = 0; j < n; j++)
- if (!F.areEqual (w[j], v[j]))
- ret = iter_passed = false;
-
- if (!iter_passed)
- commentator().report (Commentator::LEVEL_IMPORTANT, INTERNAL_ERROR)
- << "ERROR: Vectors are not equal" << endl;
-
- commentator().stop ("done");
- commentator().progress ();
- }
-
- commentator().stop (MSG_STATUS (ret), (const char *) 0, "testIdentity");
-
- return ret;
-}
-
-
-int main (int argc, char **argv)
-{
- bool pass = true;
-
- static size_t n = 10;
- static integer q = 101;
- static int iterations = 2; // was 100
- //static int N = 1;
-
- static Argument args[] = {
- { 'n', "-n N", "Set dimension of test matrices to NxN.", TYPE_INT, &n },
- { 'q', "-q Q", "Operate over the \"field\" GF(Q) [1].", TYPE_INTEGER, &q },
- { 'i', "-i I", "Perform each test for I iterations.", TYPE_INT, &iterations },
- END_OF_ARGUMENTS
- };
-
- typedef Modular<uint32_t> Field;
-
- parseArguments (argc, argv, args);
- Field F (q);
-
- commentator().start("Dense matrix black box test suite", "BlasMatrix");
-
- commentator().getMessageClass (INTERNAL_DESCRIPTION).setMaxDepth (5);
- commentator().getMessageClass (INTERNAL_DESCRIPTION).setMaxDetailLevel (Commentator::LEVEL_UNIMPORTANT);
- ostream &report = commentator().report (Commentator::LEVEL_IMPORTANT, INTERNAL_DESCRIPTION);
-
-
-
- Field::Element one, zero;
- F.init(one,1);
- F.init(zero,0);
- BlasMatrix<Field> D(F,2,2);
- BlasMatrix<Field> zero24(F,2,4);
- for(size_t i=0; i<2; i++)
- D.setEntry(i,i,one);
- D.setEntry(1,0,one);
- BM_Seq<Field> seq(2,D);
- BlasMatrix<Field> S2(F,2,2);
- MatrixDomain<Field> MD(F);
- BM_Seq<Field>::BM_iterator bmit(seq, 0), bmit2(seq.BM_begin());
- bmit.setDelta(4);
- BM_Seq<Field>::BM_iterator::TerminationState check = bmit.state();
- while(!check.IsGeneratorFound() && !check.IsSequenceExceeded()){
- bmit++;
- check = bmit.state();
- }
- for(list<BlasMatrix<Field> >::iterator it = bmit->begin(); it != bmit->end(); it++)
- (*it).write(report);
- if(check.IsSequenceExceeded())
- report << "Sequence Exceeded" << endl;
- bmit++;
- check = bmit.state();
- if(check.IsSequenceExceeded())
- report << "Sequence Exceeded" << endl;
- for(list<BlasMatrix<Field> >::iterator it = bmit->begin(); it != bmit->end(); it++)
- (*it).write(report);
- MD.add(S2,D,D);
- seq.push_back(S2);
- bmit++;
- check = bmit.state();
- if(check.IsSequenceExceeded())
- report << "Sequence Exceeded" << endl;
- for(list<BlasMatrix<Field> >::iterator it = bmit->begin(); it != bmit->end(); it++)
- (*it).write(report);
- MD.addin(S2,D);
- seq.push_back(S2);
- bmit++;
- check = bmit.state();
- if(check.IsSequenceExceeded())
- report << "Sequence Exceeded" << endl;
- for(list<BlasMatrix<Field> >::iterator it = bmit->begin(); it != bmit->end(); it++)
- (*it).write(report);
- if(check.IsGeneratorFound())
- report << "Generator Found" << endl;
- report << "mu = " << bmit.get_mu() << endl;
- report << "sigma = " << bmit.get_sigma() << endl;
- report << "beta = " << bmit.get_beta() << endl;
- BM_Seq<Field>::BM_iterator::TerminationState check2 = bmit2.state();
- while(!check2.IsGeneratorFound() && !check2.IsSequenceExceeded()){
- ++bmit2;
- check2 = bmit2.state();
- }
- if(bmit==bmit2)
- report << "Iterators are equal" << endl;
- if(bmit2==seq.BM_end())
- report << "bmit2 is equal to end" << endl;
- for(list<BlasMatrix<Field> >::iterator it = bmit2->begin(); it != bmit2->end(); it++)
- (*it).write(report);
- BM_Seq<Field>::BM_iterator bmit3 = seq.BM_begin();
- bmit3 = bmit;
- if(bmit==bmit3)
- report << "Iterators are equal" << endl;
- vector<BlasMatrix<Field> >gen(bmit.GetGenerator());
- int d = bmit.get_mu();
- for(int j = 0; j <= d; j++)
- gen[j].write(report);
-
- commentator().stop("dense matrix black box test suite");
- return pass ? 0 : -1;
-}
-
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
-// Local Variables:
-// mode: C++
-// tab-width: 8
-// indent-tabs-mode: nil
-// c-basic-offset: 8
-// End:
-
diff --git a/tests/test-butterfly.C b/tests/test-butterfly.C
index 0e99744..2b27828 100644
--- a/tests/test-butterfly.C
+++ b/tests/test-butterfly.C
@@ -6,20 +6,20 @@
*
* --------------------------------------------------------
*
- *
+ *
* ========LICENCE========
* This file is part of the library LinBox.
- *
+ *
* LinBox is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
- *
+ *
* This library 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
* Lesser General Public License for more details.
- *
+ *
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
@@ -40,24 +40,21 @@
#include <iostream>
#include <fstream>
-#include <vector>
-#include "linbox/field/modular.h"
+
+#include "linbox/ring/modular.h"
#include "linbox/vector/vector-domain.h"
-#include "linbox/randiter/nonzero.h"
+#include <givaro/givranditer.h>
#include "linbox/util/commentator.h"
#include "linbox/vector/stream.h"
-#include "linbox/blackbox/butterfly.h"
#include "linbox/blackbox/compose.h"
#include "linbox/blackbox/diagonal.h"
-#include "linbox/blackbox/sparse.h"
+//#include "linbox/matrix/sparse-matrix.h"
#include "linbox/blackbox/submatrix.h"
#include "linbox/solutions/det.h"
-#include "linbox/switch/boolean.h"
-#include "linbox/switch/cekstv.h"
+#include "linbox/blackbox/butterfly.h"
-#include "test-common.h"
-#include "test-generic.h"
+#include "test-blackbox.h"
using namespace LinBox;
using namespace std;
@@ -72,22 +69,22 @@ static bool testSetButterfly (const Field &F, VectorStream<Vector> &stream, size
{
commentator().start ("Testing setButterfly", "testSetButterfly", stream.size ());
- bool ret = true, iter_passed;
+ bool ret = true;
- unsigned long real_k;
+ // unsigned long real_k;
Vector v_p;
- typename LinBox::Vector<Field>::Dense w (stream.dim ()), v1 (stream.dim ());
+ BlasVector<Field> w (F,stream.dim ()), v1 (F,stream.dim ());
VectorDomain<Field> VD (F);
while (stream) {
commentator().startIteration ((unsigned int)stream.j ());
stream >> v_p;
- typename LinBox::Vector<Field>::Dense v (stream.n ());
+ BlasVector<Field> v (F,stream.n ());
VD.copy (v, v_p);
- real_k = v_p.first.size ();
+ unsigned long real_k = v_p.first.size ();
ostream &report = commentator().report (Commentator::LEVEL_UNIMPORTANT, INTERNAL_DESCRIPTION);
report << "Input vector: ";
@@ -100,7 +97,7 @@ static bool testSetButterfly (const Field &F, VectorStream<Vector> &stream, size
vector<bool> z_vec = setButterfly (z);
- BooleanSwitchFactory factory (z_vec);
+ LinBox::BooleanSwitchFactory factory (z_vec);
Butterfly<Field, BooleanSwitch> P (F, stream.dim (), factory);
P.apply (w, v);
@@ -113,7 +110,7 @@ static bool testSetButterfly (const Field &F, VectorStream<Vector> &stream, size
report << "Result of applyTranspose: ";
VD.write (report, v1) << endl;
- iter_passed = true;
+ bool iter_passed = true;
for (size_t i = 0; i < real_k; ++i)
if (F.isZero (w[i]))
@@ -165,30 +162,27 @@ static bool testCekstvSwitch (const Field &F, unsigned int iterations, size_t n,
unsigned int failures = 0;
typename Vector<Field>::SparsePar d1;
-
- RandomSparseStream<Field, typename Vector<Field>::SparsePar> stream (F, (double) r / (double) n, n, iterations);
+ typename Field::RandIter gen(F);
+ RandomSparseStream<Field, typename Vector<Field>::SparsePar> stream (F, gen, (double) r / (double) n, n, iterations);
VectorDomain<Field> VD (F);
- unsigned long real_r;
+ // unsigned long real_r;
typename Field::Element det_Ap;
- typename Field::Element one;
-
- F.init (one, 1);
while (stream) {
commentator().startIteration ((unsigned int)stream.pos ());
stream >> d1;
- typename Vector<Field>::Dense d (n);
+ BlasVector<Field> d (F,n);
VD.copy (d, d1);
ostream &report = commentator().report (Commentator::LEVEL_UNIMPORTANT, INTERNAL_DESCRIPTION);
report << "Input vector: ";
VD.write (report, d) << endl;
- real_r = d1.first.size ();
+ unsigned long real_r = d1.first.size ();
report << "Real rank: " << real_r << endl;
@@ -198,14 +192,14 @@ static bool testCekstvSwitch (const Field &F, unsigned int iterations, size_t n,
Butterfly<Field, CekstvSwitch<Field> > Q (F, n, factory);
typedef Butterfly<Field, CekstvSwitch<Field> > Blackbox1;
- Diagonal<Field> D (F, d);
- typedef Diagonal<Field> Blackbox2;
+ Diagonal<Field> D (d);
+ // typedef Diagonal<Field> Blackbox2;
Compose<Blackbox1> DQ (&P, &Q);
typedef Compose<Blackbox1, Blackbox1> Blackbox3;
Compose<Blackbox1, Blackbox3> A (P, DQ);
typedef Compose<Blackbox1, Blackbox3> Blackbox4;
- //Compose<typename Vector<Field>::Dense> A (&P, &DQ);
+ //Compose<BlasVector<Field> > A (&P, &DQ);
Submatrix<Blackbox4> Ap (&A, 0, 0, real_r, real_r);
@@ -254,8 +248,8 @@ static bool testCekstvSwitch (const Field &F, unsigned int iterations, size_t n,
template <class Field>
static bool testRandomLinearity (const Field &F,
- VectorStream<typename Vector<Field>::Dense> &v1_stream,
- VectorStream<typename Vector<Field>::Dense> &v2_stream)
+ VectorStream<BlasVector<Field> > &v1_stream,
+ VectorStream<BlasVector<Field> > &v2_stream)
{
commentator().start ("Testing random linearity", "testRandomLinearity", v1_stream.size ());
@@ -263,7 +257,7 @@ static bool testRandomLinearity (const Field &F,
typename CekstvSwitch<Field>::Factory factory (r);
Butterfly<Field, CekstvSwitch<Field> > A (F, v1_stream.dim (), factory);
- bool ret = testLinearity (F, A, v1_stream, v2_stream);
+ bool ret = testLinearity (A, v1_stream, v2_stream);
v1_stream.reset ();
v2_stream.reset ();
@@ -288,8 +282,8 @@ static bool testRandomLinearity (const Field &F,
template <class Field>
static bool testRandomTranspose (const Field &F,
- VectorStream<typename Vector<Field>::Dense> &v1_stream,
- VectorStream<typename Vector<Field>::Dense> &v2_stream)
+ VectorStream<BlasVector<Field> > &v1_stream,
+ VectorStream<BlasVector<Field> > &v2_stream)
{
commentator().start ("Testing random transpose", "testRandomTranspose", v1_stream.size ());
@@ -311,10 +305,10 @@ int main (int argc, char **argv)
{
bool pass = true;
- static size_t n = 100;
- static integer q = 2147483647U;
- static int iterations = 1; // was 10
- static int k = 10;
+ static int32_t n = 100;
+ static integer q = 65521U;
+ static unsigned int iterations = 1; // was 10
+ static unsigned int k = 10;
static Argument args[] = {
{ 'n', "-n N", "Set dimension of test matrices to NxN.", TYPE_INT, &n },
@@ -324,37 +318,41 @@ int main (int argc, char **argv)
END_OF_ARGUMENTS
};
- typedef Modular<uint32_t> Field;
+ typedef Givaro::Modular<uint32_t, uint64_t> Field;
parseArguments (argc, argv, args);
- Field F (q);
+ srand ((unsigned int) time (NULL));
- commentator().getMessageClass (TIMING_MEASURE).setMaxDepth (3);
- commentator().getMessageClass (INTERNAL_DESCRIPTION).setMaxDepth (3);
- commentator().getMessageClass (INTERNAL_DESCRIPTION).setMaxDetailLevel (Commentator::LEVEL_UNIMPORTANT);
+ commentator().setMaxDepth (-1);
+ commentator().setMaxDetailLevel (-1);
commentator().start("Butterfly preconditioner test suite", "butterfly preconditioner");
- RandomSparseStream<Field, Vector<Field>::Sparse, NonzeroRandIter<Field> >
- stream (F, NonzeroRandIter<Field> (F, Field::RandIter (F)),
- (double) k / (double) n, n, iterations);
- RandomDenseStream<Field> v1_stream (F, n, iterations);
- RandomDenseStream<Field> v2_stream (F, n, iterations);
+ Field F (q);
+ // SetButterfly
+ Field::RandIter Gen(F);
+ typedef Givaro::GeneralRingNonZeroRandIter<Field> NZRand;
+ NZRand NZGen(Gen);
+ RandomSparseStream<Field, Vector<Field>::Sparse, NZRand>
+ stream (F, NZGen, (double) k / (double) n, n, iterations);
if (!testSetButterfly (F, stream, k)) pass = false;
+
+ // Cekstv
if (!testCekstvSwitch (F, iterations, n, k)) pass = false;
- if (!testRandomLinearity (F, v1_stream, v2_stream)) pass = false;
- if (!testRandomTranspose (F, v1_stream, v2_stream)) pass = false;
+
+ // Blackbox
+ Butterfly<Field> P(F, n);
+ if (!testBlackboxNoRW(P)) pass = false;
commentator().stop("butterfly preconditioner test suite");
return pass ? 0 : -1;
}
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
// Local Variables:
// mode: C++
// tab-width: 8
// indent-tabs-mode: nil
// c-basic-offset: 8
// End:
-
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/tests/test-charpoly.C b/tests/test-charpoly.C
index b8f8856..348b470 100644
--- a/tests/test-charpoly.C
+++ b/tests/test-charpoly.C
@@ -1,21 +1,21 @@
/* tests/test-charpoly.C
* Copyright (C) LinBox
- * Written by bds (starting from test-charpoly.C)
+ * Written by bds ++
+ *
*
- *
* ========LICENCE========
* This file is part of the library LinBox.
- *
+ *
* LinBox is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
- *
+ *
* This library 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
* Lesser General Public License for more details.
- *
+ *
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
@@ -38,14 +38,14 @@
#include <iostream>
#include <iomanip>
#include <fstream>
-#include <vector>
+
#include <cstdio>
-#include "linbox/blackbox/sparse.h"
+#include "linbox/matrix/sparse-matrix.h"
#include "linbox/blackbox/scalar-matrix.h"
#include "linbox/solutions/charpoly.h"
#include "linbox/util/commentator.h"
-//#include "linbox/ring/givaro-polynomial.h"
+#include "linbox/ring/givaro-polynomial.h"
#include "linbox/vector/stream.h"
#include "test-common.h"
@@ -72,7 +72,7 @@ typename Dom::Element eval (const Dom& D,
typename Dom::Element tmp = P[P.size()-1];
for (int i = (int)P.size()-2; i >= 0; --i){
D.mulin (tmp, x);
- D.addin (tmp, P[i]);
+ D.addin (tmp, P[(size_t)i]);
}
return value = tmp;
}
@@ -80,24 +80,23 @@ typename Dom::Element eval (const Dom& D,
template <class Dom>
static bool testIdentityCharpoly (Dom &Z, size_t n, bool symmetrizing=false)
{
- typedef typename Dom::Element Element;
- typedef vector<Element> Vector;
- typedef ScalarMatrix<Dom> Blackbox;
- typedef GivPolynomialRing<Dom, Givaro::Dense> PolDom;
- typedef typename PolDom::Element Polynomial;
- //typedef Vector Polynomial;
+ typedef typename Dom::Element Element;
+ typedef ScalarMatrix<Dom> Blackbox;
+// typedef GivPolynomialRing<Dom, Givaro::Dense> PolDom;
+// typedef BlasVector<Dom,GivPolynomialRing<Dom, Givaro::Dense> > PolDom;
+// typedef typename PolDom::Element Polynomial;
+ typedef BlasVector <Dom> Vector;
+ typedef Vector Polynomial;
LinBox::commentator().start ("Testing identity Charpoly", "testIdentityCharpoly");
bool ret = true;
- Element one; Z.init(one, 1);
- Element negone; Z.init(negone, -1);
//PolDom IPD(Z);
- Blackbox A (Z, n, one);
+ Blackbox A (Z, n, n, Z.one);
- Polynomial phi;
+ Polynomial phi(Z);
charpoly (phi, A);
@@ -108,14 +107,14 @@ static bool testIdentityCharpoly (Dom &Z, size_t n, bool symmetrizing=false)
// partial check - just that charpoly has right values at 0, 1, -1.
Element val, val2, neg2, pow2;
// value at 1 should be zero
- eval(Z, val, phi, one);
+ eval(Z, val, phi, Z.one);
if (! Z.isZero(val) ) ret = false;
// value at zero should be (-1)^n
- val = (n % 2 == 0) ? one : negone;
+ val = (n % 2 == 0) ? Z.one : Z.mOne;
if (! Z.areEqual(val, phi[0])) ret = false;
// value at -1 should be (-2)^n
- eval(Z, val2, phi, negone);
- Z.init(neg2, -2); Z.init(pow2, 1);
+ eval(Z, val2, phi, Z.mOne);
+ Z.init(neg2, -2_i64); Z.assign(pow2, Z.one);
for (size_t i = 0; i < n; ++i) Z.mulin(pow2, neg2);
if (! Z.areEqual(val2, pow2)) ret = false;
@@ -142,12 +141,12 @@ static bool testIdentityCharpoly (Dom &Z, size_t n, bool symmetrizing=false)
template <class Field>
static bool testNilpotentCharpoly (Field &F, size_t n)
{
- typedef vector <typename Field::Element> Vector;
+ typedef BlasVector <Field> Vector;
// typedef GivPolynomialRing<Field, Givaro::Dense> PolDom;
// typedef typename PolDom::Element Polynomial;
typedef Vector Polynomial;
- typedef pair <vector <size_t>, vector <typename Field::Element> > Row;
- typedef SparseMatrix <Field> Blackbox;
+ typedef std::pair <std::vector <size_t>, std::vector <typename Field::Element> > Row;
+ typedef SparseMatrix<Field, typename VectorTraits<Row>::SparseFormat> Blackbox;
LinBox::commentator().start ("Testing nilpotent charpoly", "testNilpotentCharpoly");
@@ -163,11 +162,11 @@ static bool testNilpotentCharpoly (Field &F, size_t n)
ostream &who = LinBox::commentator().report (Commentator::LEVEL_UNIMPORTANT, INTERNAL_DESCRIPTION);
who << "Matrix:" << endl;
- A.write (who, FORMAT_PRETTY);
+ A.write (who, Tag::FileFormat::Pretty);
- Polynomial phi;
+ Polynomial phi(A.field());
charpoly (phi, A);
@@ -177,7 +176,7 @@ static bool testNilpotentCharpoly (Field &F, size_t n)
linbox_check(n);
for (i = 0; i < n - 1; i++)
- if (!F.isZero (phi[i]))
+ if (!F.isZero (phi[(size_t)i]))
lowerTermsCorrect = false;
if (phi.size () != n + 1 || !F.isOne (phi[n]) || !lowerTermsCorrect) {
@@ -191,6 +190,25 @@ static bool testNilpotentCharpoly (Field &F, size_t n)
return ret;
}
+static bool testSageBug(){
+
+ Givaro::ZRing<Givaro::Integer> Z;
+ DenseMatrix<Givaro::ZRing<Givaro::Integer> > A(Z,4,4);
+ for (size_t i=0; i<4; ++i)
+ for (size_t j=0; j<4; ++j)
+ A.setEntry(i,j, i*4+j+1);
+ typedef BlasVector <Givaro::ZRing<Givaro::Integer> > Polynomial;
+ Polynomial phi(Z);
+ charpoly(phi,A);
+ if (Z.areEqual(phi[0],0) &&
+ Z.areEqual(phi[1],0) &&
+ Z.areEqual(phi[2],-80) &&
+ Z.areEqual(phi[3],-34) &&
+ Z.areEqual(phi[4],1) )
+ return true;
+ else return false;
+}
+
#if 1
/* Test 3: Random charpoly of sparse matrix
*
@@ -211,17 +229,17 @@ bool testRandomCharpoly (Field &F,
VectorStream<Row> &A_stream,
VectorStream<Vector> &v_stream)
{
- //typedef GivPolynomialRing<Field, Givaro::Dense> PolDom;
- //typedef typename PolDom::Element Polynomial;
- typedef std::vector<typename Field::Element> Polynomial;
- typedef SparseMatrix <Field> Blackbox;
+// typedef GivPolynomialRing<Field, Givaro::Dense> PolDom;
+// typedef typename PolDom::Element Polynomial;
+ typedef BlasVector<Field> Polynomial;
+ typedef SparseMatrix<Field> Blackbox;
LinBox::commentator().start ("Testing sparse random charpoly", "testRandomCharpoly", 1);
bool ret = true;
VectorDomain<Field> VD (F);
- Vector w, v;
+ Vector w(F), v(F);
VectorWrapper::ensureDim (v, v_stream.n ());
VectorWrapper::ensureDim (w, v_stream.n ());
@@ -230,9 +248,9 @@ bool testRandomCharpoly (Field &F,
ostream &report = LinBox::commentator().report (Commentator::LEVEL_UNIMPORTANT, INTERNAL_DESCRIPTION);
report << "Matrix:" << endl;
- A.write (report, FORMAT_PRETTY);
+ A.write (report, Tag::FileFormat::Pretty);
- Polynomial phi;
+ Polynomial phi(F);
charpoly (phi, A);
@@ -251,7 +269,6 @@ bool testRandomCharpoly (Field &F,
applyPoly (F, w, A, phi, v);
VD.write (report << "Output vector " << v_stream.j () << ": ", w) << endl;
- //bds: VD.isZero fails to work right when -O2 using gcc 4.2
if (!VD.isZero (w)) { ret = false; break; }
}
@@ -287,25 +304,27 @@ int main (int argc, char **argv)
parseArguments (argc, argv, args);
- // Temporarily, only Modular<double> is enabled for the givaro/ntl factorization based charpoly
- typedef Modular<double> Field;
- typedef vector<Field::Element> DenseVector;
- typedef SparseMatrix<Field>::Row SparseVector;
- //typedef pair<vector<size_t>, vector<Field::Element> > SparseVector;
- Field F (q);
- srand ((unsigned)time (NULL));
-
LinBox::commentator().getMessageClass (TIMING_MEASURE).setMaxDepth (10);
LinBox::commentator().getMessageClass (INTERNAL_DESCRIPTION).setMaxDepth (10);
LinBox::commentator().getMessageClass (INTERNAL_DESCRIPTION).setMaxDetailLevel (Commentator::LEVEL_UNIMPORTANT);
-
ostream &report = LinBox::commentator().report (Commentator::LEVEL_IMPORTANT, INTERNAL_DESCRIPTION);
- report << endl << "Black box characteristic polynomial of a matrix over a prime field test suite" << endl;
+ srand ((unsigned)time (NULL));
- RandomDenseStream<Field, DenseVector, NonzeroRandIter<Field> >
- v_stream (F, NonzeroRandIter<Field> (F, Field::RandIter (F)), n, numVectors);
- RandomSparseStream<Field, SparseVector, NonzeroRandIter<Field> >
- A_stream (F, NonzeroRandIter<Field> (F, Field::RandIter (F)), (double) k / (double) n, n, n);
+/**************/
+ report << endl << "Black box characteristic polynomial over a prime field test suite" << endl;
+
+ // Temporarily, only Givaro::Modular<double> is enabled for the givaro/ntl factorization based charpoly
+ typedef Givaro::Modular<double> Field;
+ typedef BlasVector<Field> DenseVector;
+ typedef SparseMatrix<Field>::Row SparseVector;
+ Field F (q);
+ Field::RandIter mygen(F);
+ Givaro::GeneralRingNonZeroRandIter<Field> myNZgen(mygen);
+
+ RandomDenseStream<Field, DenseVector, Givaro::GeneralRingNonZeroRandIter<Field> >
+ v_stream (F, myNZgen, n, (size_t)numVectors);
+ RandomSparseStream<Field, SparseVector, Givaro::GeneralRingNonZeroRandIter<Field> >
+ A_stream (F, myNZgen, (double) k / (double) n, n, n);
if (!testNilpotentCharpoly (F, n)) pass = false;
if (!testRandomCharpoly (F, A_stream, v_stream)) pass = false;
@@ -314,42 +333,41 @@ int main (int argc, char **argv)
if (!testIdentityCharpoly (F, n, true)) pass = false;
//need other tests...
- typedef vector<PID_integer::Element> ZDenseVector;
- typedef SparseMatrix<PID_integer>::Row ZSparseVector;
- typedef pair<vector<size_t>, vector<Field::Element> > SparseVector;
- PID_integer Z;
- srand ((unsigned)time (NULL));
+/**************/
+ report << endl << "Black box characteristic polynomial over Z test suite" << endl;
- LinBox::commentator().getMessageClass (TIMING_MEASURE).setMaxDepth (10);
- LinBox::commentator().getMessageClass (INTERNAL_DESCRIPTION).setMaxDepth (10);
- LinBox::commentator().getMessageClass (INTERNAL_DESCRIPTION).setMaxDetailLevel (Commentator::LEVEL_UNIMPORTANT);
+ Givaro::ZRing<integer> Z ;
+ typedef BlasVector<Givaro::ZRing<integer>> ZDenseVector;
- report << endl << "Black box characteristic polynomial of an integer matrix test suite" << endl;
-
- RandomDenseStream<PID_integer, ZDenseVector, NonzeroRandIter<PID_integer> >
- zv_stream (Z, NonzeroRandIter<PID_integer> (Z, PID_integer::RandIter (Z)), n, numVectors);
- RandomSparseStream<PID_integer, SparseVector, NonzeroRandIter<PID_integer> >
- zA_stream (Z, NonzeroRandIter<PID_integer> (Z, PID_integer::RandIter (Z)), (double) k / (double) n, n, n);
+ Givaro::ZRing<integer>::RandIter myZgen(Z);
+ Givaro::GeneralRingNonZeroRandIter<Givaro::ZRing<integer>> myNzZgen(myZgen);
+
+ RandomDenseStream<Givaro::ZRing<integer>, ZDenseVector, Givaro::GeneralRingNonZeroRandIter<Givaro::ZRing<integer>> >
+ zv_stream (Z, myNzZgen, n, (size_t)numVectors);
+ RandomSparseStream<Givaro::ZRing<integer>, SparseVector, Givaro::GeneralRingNonZeroRandIter<Givaro::ZRing<integer>> >
+ zA_stream (Z, myNzZgen, (double) k / (double) n, n, n);
//no symmetrizing
if (!testIdentityCharpoly (Z, n)) pass = false;
if (!testNilpotentCharpoly (Z, n)) pass = false;
-
+
//Comment by Z. Wan. Stream doesn't work here
- //if (!testRandomCharpoly (Z, zA_stream, zv_stream)) pass = false;
+// if (!testRandomCharpoly (Z, zA_stream, zv_stream)) pass = false;
// symmetrizing
if (!testIdentityCharpoly (Z, n, true)) pass = false;
//need other tests...
+ if (not testSageBug()) pass = false;
+
return pass ? 0 : -1;
}
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
// Local Variables:
// mode: C++
// tab-width: 8
// indent-tabs-mode: nil
// c-basic-offset: 8
// End:
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/tests/test-commentator.C b/tests/test-commentator.C
index c5878a5..95f1233 100644
--- a/tests/test-commentator.C
+++ b/tests/test-commentator.C
@@ -6,20 +6,20 @@
*
* --------------------------------------------------------
*
- *
+ *
* ========LICENCE========
* This file is part of the library LinBox.
- *
+ *
* LinBox is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
- *
+ *
* This library 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
* Lesser General Public License for more details.
- *
+ *
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
@@ -78,7 +78,7 @@ void runTestActivity (bool reportStrings)
if (reportStrings) outputReportStrings ();
for (int i = 0; i < 2; ++i) {
- commentator().startIteration (i);
+ commentator().startIteration ((unsigned int)i);
if (reportStrings) outputReportStrings ();
commentator().start ("Special function 1", "function1");
diff --git a/tests/test-common.C b/tests/test-common.C
deleted file mode 100644
index bbb3f45..0000000
--- a/tests/test-common.C
+++ /dev/null
@@ -1,93 +0,0 @@
-/* linbox/tests/test-common.C
- * Copyright (C) 2001, 2002 Bradford Hovinen
- *
- * Written by Bradford Hovinen <hovinen at cis.udel.edu>
- *
- * ========LICENCE========
- * This file is part of the library LinBox.
- *
- * LinBox is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- * ========LICENCE========
- */
-
-
-/*! @file tests/test-common.C
- * @ingroup tests
- * @brief no doc
- */
-
-
-
-#ifndef __LINBOX_test_common_C
-#define __LINBOX_test_common_C
-
-
-#include "linbox/linbox-config.h"
-
-#include <iostream>
-#include <fstream>
-#include <vector>
-#include <cmath>
-#include <cstdlib>
-#include <cstring>
-#include <cmath>
-#include <list>
-
-#include "linbox/util/commentator.h"
-#include "linbox/field/archetype.h"
-
-#include "test-common.h"
-
-bool isPower (LinBox::integer n, LinBox::integer m)
-{
- return (n == 1) || (((n % m) == 0) && isPower (n/m, m));
-}
-
-inline double incompleteGamma (double a, double x, double tol)
-{
- double xa_ex = pow (x, a) * exp (-x);
- double pi = 1.0;
- double xn = 1.0;
- double sigma = 0.0;
- double last_sigma;
-
- int n = 0;
-
- do {
- pi *= a + n;
- last_sigma = sigma;
- sigma += xn / pi;
- xn *= x;
- ++n;
- } while (abs (sigma - last_sigma) >= tol) ;
-
- return sigma * xa_ex;
-}
-
-double chiSquaredCDF (double chi_sqr, double df)
-{
- return incompleteGamma (df / 2.0, chi_sqr / 2.0, 1e-10) / exp (gamma (df / 2.0));
-}
-#endif // __LINBOX_test_common_C
-
-
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
-// Local Variables:
-// mode: C++
-// tab-width: 8
-// indent-tabs-mode: nil
-// c-basic-offset: 8
-// End:
-
diff --git a/tests/test-common.h b/tests/test-common.h
index ff9eff1..31752a5 100644
--- a/tests/test-common.h
+++ b/tests/test-common.h
@@ -12,20 +12,20 @@
*
* ------------------------------------
*
- *
+ *
* ========LICENCE========
* This file is part of the library LinBox.
- *
+ *
* LinBox is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
- *
+ *
* This library 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
* Lesser General Public License for more details.
- *
+ *
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
@@ -38,16 +38,17 @@
#include <iostream>
#include <fstream>
-#include <vector>
+// #include <vector>
#include "linbox/linbox-config.h"
#include "linbox/field/archetype.h"
-#include "linbox/vector/vector-domain.h"
#include "linbox/integer.h"
+#include "linbox/vector/vector-domain.h"
+#include "linbox/vector/blas-vector.h"
using namespace std;
#include "linbox/util/commentator.h"
-#include "fflas-ffpack/utils/args-parser.h"
+#include "linbox/util/args-parser.h"
template <class Field, class Vector>
@@ -62,7 +63,7 @@ void printVectorSpecialized(
output << '(';
for (i = 0; i < v.size (); i++) {
- F.write (output, v[i]);
+ F.write (output, v[(size_t)i]);
if (i < v.size () - 1)
output << ", ";
}
@@ -144,7 +145,7 @@ bool areVectorsEqualSpecialized(
if (v.size() != w.size()) return false;
for (size_t i = 0; i < v.size(); i++)
- if (!F.areEqual (w[i], v[i]))
+ if (!F.areEqual (w[(size_t)i], v[(size_t)i]))
return false;
return true;
@@ -163,7 +164,7 @@ bool areVectorsEqualSpecialized(
typename Vector::const_iterator v_iter, w_iter;
w_iter = w.begin();
- for ( v_iter = v.begin(); v_iter != v.end(); v_iter++, w_iter++)
+ for ( v_iter = v.begin(); v_iter != v.end(); ++v_iter, ++w_iter)
if ( (w_iter->first != v_iter->first)
|| (!F.areEqual (w_iter->second, v_iter->second)) )
return false;
@@ -184,7 +185,7 @@ bool areVectorsEqualSpecialized(
typename Vector::const_iterator v_iter, w_iter;
w_iter = w.begin();
- for ( v_iter = v.begin(); v_iter != v.end(); v_iter++, w_iter++)
+ for ( v_iter = v.begin(); v_iter != v.end(); ++v_iter, ++w_iter)
if ( (w_iter->first != v_iter->first)
|| (!F.areEqual (w_iter->second, v_iter->second)) )
return false;
@@ -206,7 +207,7 @@ bool allZeroSpecialized(
)
{
for (size_t i = 0; i < v.size(); i++)
- if (!F.isZero (v[i]))
+ if (!F.isZero (v[(size_t)i]))
return false;
return true;
@@ -237,11 +238,11 @@ void printPolynomial (Field &F, ostream &output, const Polynomial &v)
output << "0";
for (i = (int)v.size () - 1; i >= 0; i--) {
- if (F.isZero (v[i]))
+ if (F.isZero (v[(size_t)i]))
continue;
- if (!F.isOne (v[i]) || i == 0)
- F.write (output, v[i]);
+ if (!F.isOne (v[(size_t)i]) || i == 0)
+ F.write (output, v[(size_t)i]);
if (i > 0)
output << " x^" << i;
@@ -254,7 +255,7 @@ void printPolynomial (Field &F, ostream &output, const Polynomial &v)
}
template <class Field, class Blackbox, class Polynomial, class Vector>
-vector <typename Field::Element> &
+LinBox::BlasVector <Field> &
applyPoly (const Field &F,
Vector &w,
const Blackbox &A,
@@ -262,7 +263,7 @@ applyPoly (const Field &F,
const Vector &v)
{
LinBox::VectorDomain <Field> VD (F);
- Vector z;
+ Vector z(F);
int i;
LinBox::VectorWrapper::ensureDim (z, A.rowdim ());
@@ -271,7 +272,7 @@ applyPoly (const Field &F,
for (i = (int)phi.size () - 2; i >= 0; i--) {
A.apply (z, w);
- VD.axpy (w, phi[i], v, z);
+ VD.axpy (w, phi[(size_t)i], v, z);
}
return w;
@@ -279,14 +280,13 @@ applyPoly (const Field &F,
/* Evaluate polynomial at a whole vector of points */
-template <class Field, class Polynomial>
-vector <typename Field::Element> &
-multiEvalPoly (const Field &F,
- vector <typename Field::Element> &w,
- const Polynomial &phi,
- const vector <typename Field::Element> &v)
+template <class Field, class Polynomial, class Vector>
+Vector &
+multiEvalPoly (const Field &F,
+ Vector &w,
+ const Polynomial &phi,
+ const Vector &v)
{
- typedef vector <typename Field::Element> Vector;
typename Field::Element tmp;
int i;
@@ -295,12 +295,12 @@ multiEvalPoly (const Field &F,
w.resize (v.size ());
for (j = 0; j < v.size (); j++)
- w[j] = phi[phi.size () - 1];
+ w[(size_t)j] = phi[phi.size () - 1];
for (i = (int)phi.size () - 2; i >= 0; i--) {
for (j = 0; j < v.size (); j++) {
- F.axpy (tmp, w[j], v[j], phi[i]);
- w[j] = tmp;
+ F.axpy (tmp, w[(size_t)j], v[(size_t)j], phi[(size_t)i]);
+ w[(size_t)j] = tmp;
}
}
@@ -312,32 +312,32 @@ multiEvalPoly (const Field &F,
template <class Field, class Polynomial>
Polynomial &
-interpolatePoly (const Field &F,
- Polynomial &f,
- const vector <typename Field::Element> &x,
- const vector <typename Field::Element> &y)
+interpolatePoly (const Field &F,
+ Polynomial &f,
+ const LinBox::BlasVector<Field> &x,
+ const LinBox::BlasVector<Field> &y)
{
- typedef vector <typename Field::Element> Vector;
+ typedef LinBox::BlasVector<Field> Vector;
- int n = x.size ();
+ int n = (int)x.size ();
// NB I leave one element in g always initialized to 0 as the ficticious
// negative-first coefficient. This streamlines some of the code.
static const int g_FUDGE = 1;
- Vector g(n + g_FUDGE);
- F.init (g[0], 0);
+ Vector g(F,(size_t)(n + g_FUDGE));
+ F.assign (g[0], F.zero);
typename Field::Element gk, c1, c2;
int i, j, k, d;
- f.resize (n);
+ f.resize ((size_t)n);
for (i = 0; i < n; i++)
- F.init (f[i], 0);
+ F.assign(f[(size_t)i], F.zero);
for (j = 0; j < n; j++) {
- F.init (g[0 + g_FUDGE], 1);
+ F.assign (g[0 + g_FUDGE], F.one);
// d is the current degree of the Lagrange interpolant. i is the
// current index in the array of x-coordonites
@@ -345,24 +345,24 @@ interpolatePoly (const Field &F,
if (i == j) i++;
// Compute coefficients of this factor.
- F.sub (c1, x[j], x[i]);
+ F.sub (c1, x[(size_t)j], x[(size_t)i]);
F.invin (c1);
- F.mul (c2, c1, x[i]);
+ F.mul (c2, c1, x[(size_t)i]);
F.negin (c2);
// Initialize the next element of the Lagrange interpolant
- F.init (g[d + 1 + g_FUDGE], 0);
+ F.assign (g[(size_t)(d + 1 + g_FUDGE)], F.zero);
// Multiply this factor by the existing partial product
for (k = d + 1 + g_FUDGE; k >= g_FUDGE; k--) {
- F.mul (gk, g[k - 1], c1);
- F.axpyin (gk, g[k], c2);
- g[k] = gk;
+ F.mul (gk, g[(size_t)k - 1], c1);
+ F.axpyin (gk, g[(size_t)k], c2);
+ g[(size_t)k] = gk;
}
}
for (i = 0; i < n; i++)
- F.axpyin (f[i], y[j], g[i + g_FUDGE]);
+ F.axpyin (f[(size_t)i], y[(size_t)j], g[(size_t)i + g_FUDGE]);
}
return f;
@@ -381,16 +381,15 @@ extern inline double incompleteGamma (double a, double x, double tol);
double chiSquaredCDF (double chi_sqr, double df);
-#ifdef LinBoxSrcOnly
-#include "test-common.C"
+#ifdef LinBoxTestOnly
+#include "test-common.inl"
#endif
#endif // __LINBOX_test_common_H
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
// Local Variables:
// mode: C++
// tab-width: 8
// indent-tabs-mode: nil
// c-basic-offset: 8
// End:
-
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/tests/test-common.inl b/tests/test-common.inl
new file mode 100644
index 0000000..8da49dd
--- /dev/null
+++ b/tests/test-common.inl
@@ -0,0 +1,93 @@
+/* linbox/tests/test-common.inl
+ * Copyright (C) 2001, 2002 Bradford Hovinen
+ *
+ * Written by Bradford Hovinen <hovinen at cis.udel.edu>
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ * ========LICENCE========
+ */
+
+
+/*! @file tests/test-common.inl
+ * @ingroup tests
+ * @brief no doc
+ */
+
+
+
+#ifndef __LINBOX_test_common_inl
+#define __LINBOX_test_common_inl
+
+
+#include "linbox/linbox-config.h"
+
+#include <iostream>
+#include <fstream>
+
+#include <cmath>
+#include <cstdlib>
+#include <cstring>
+#include <cmath>
+#include <list>
+
+#include "linbox/util/commentator.h"
+#include "linbox/field/archetype.h"
+
+#include "test-common.h"
+
+bool isPower (LinBox::integer n, LinBox::integer m)
+{
+ return (n == 1) || (((n % m) == 0) && isPower (n/m, m));
+}
+
+inline double incompleteGamma (double a, double x, double tol)
+{
+ double xa_ex = pow (x, a) * exp (-x);
+ double pi = 1.0;
+ double xn = 1.0;
+ double sigma = 0.0;
+ double last_sigma;
+
+ int n = 0;
+
+ do {
+ pi *= a + n;
+ last_sigma = sigma;
+ sigma += xn / pi;
+ xn *= x;
+ ++n;
+ } while (abs (sigma - last_sigma) >= tol) ;
+
+ return sigma * xa_ex;
+}
+
+double chiSquaredCDF (double chi_sqr, double df)
+{
+ return incompleteGamma (df / 2.0, chi_sqr / 2.0, 1e-10) / exp (lgamma (df / 2.0));
+}
+#endif // __LINBOX_test_common_inl
+
+
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+
diff --git a/tests/test-companion.C b/tests/test-companion.C
index 625d36f..286c862 100644
--- a/tests/test-companion.C
+++ b/tests/test-companion.C
@@ -36,13 +36,13 @@
#include <iostream>
#include <fstream>
-#include <vector>
-#include "linbox/field/modular.h"
+
+#include "linbox/ring/modular.h"
#include "linbox/blackbox/companion.h"
+#include "linbox/matrix/matrix-domain.h"
-#include "test-common.h"
-#include "test-generic.h"
+#include "test-blackbox.h"
using namespace LinBox;
@@ -51,12 +51,12 @@ int main (int argc, char **argv)
bool pass = true;
static size_t n = 10;
- static integer q = 2147483647U;
+ static size_t q = 101;
static int iterations = 1; // was 10
static Argument args[] = {
{ 'n', "-n N", "Set dimension of test matrices to NxN.", TYPE_INT, &n },
- { 'q', "-q Q", "Operate over the \"field\" GF(Q) [1].", TYPE_INTEGER, &q },
+ { 'q', "-q Q", "Operate over the \"field\" GF(Q) [1].", TYPE_INT, &q },
{ 'i', "-i I", "Perform each test for I iterations.", TYPE_INT, &iterations },
END_OF_ARGUMENTS
};
@@ -67,24 +67,33 @@ int main (int argc, char **argv)
commentator().start("Companion matrix black box test suite", "companion");
- typedef Modular<uint32_t> Field;
- typedef vector <Field::Element> Vector;
+ typedef Givaro::Modular<int32_t> Field;
+ // typedef vector <Field::Element> Vector;
typedef vector <Field::Element> Polynomial;
typedef Companion<Field> Blackbox;
Field F (q);
+ //Field F ((int32_t)q);
+ // no fail at q = 50000, intermitent at q = 55000
+ if (q > Field::maxCardinality()) {std::cout<<"NO NO"<<std::endl; exit(-1);}
Field::Element d;
- F.init (d, -1);
+ F.assign(d, F.mOne);
Polynomial p(n+1, d);
- F.init (d, 1); F.assign(p[n], d);
+ F.assign (d, F.one); F.assign(p[n], d);
+ // cstor from poly
Blackbox A (F, p);
+ pass = pass && testBlackboxNoRW(A); // no RW yet
- pass = pass && testBlackbox(A);
-
+ // cstor using own randiter
Blackbox B (F, n);
+ pass = pass && testBlackboxNoRW(B); // no RW yet
+
+ Field::RandIter r(F);
- pass = pass && testBlackbox(B);
+ // cstor from randiter
+ Blackbox C (F, n, r);
+ pass = pass && testBlackboxNoRW(C); // no RW yet
commentator().stop("companion matrix black box test suite");
diff --git a/tests/test-cra.C b/tests/test-cra.C
index d3210c7..192fc16 100644
--- a/tests/test-cra.C
+++ b/tests/test-cra.C
@@ -1,6 +1,6 @@
/* Copyright (C) LinBox
*
- * Written by Brice Boyer <brice.boyer at imag.fr>
+ * Written by Brice Boyer (briceboyer) <boyer.brice at gmail.com>
*
*
* ========LICENCE========
@@ -29,17 +29,18 @@
* @test cra algorithms
*/
+#include "linbox/linbox-config.h"
+#include <givaro/zring.h>
#include "linbox/integer.h"
#include "linbox/randiter/random-prime.h"
#include "linbox/algorithms/cra-domain.h"
#include "linbox/algorithms/cra-early-single.h"
#include "linbox/algorithms/cra-early-multip.h"
-#include "linbox/matrix/blas-matrix.h"
+#include "linbox/matrix/dense-matrix.h"
#include "linbox/algorithms/cra-full-multip.h"
#include "linbox/algorithms/cra-full-multip-fixed.h"
-#include "linbox/field/unparametric.h"
#define _LB_REPEAT(command) \
do { for (size_t i = 0 ; pass && i < iters ; ++i) { command } } while(0)
@@ -67,7 +68,7 @@ int test_early_single(std::ostream & report, size_t PrimeSize, size_t Size)
for (size_t i = 0 ; i < Size ; ++i)
residues[i] = Integer::random(PrimeSize-1);
- typedef LinBox::Modular<double> ModularField ;
+ typedef Givaro::Modular<double> ModularField ;
Iterator genprime = primes.begin() ; // prime iterator
Iterator residu = residues.begin() ; // residu iterator
@@ -125,7 +126,7 @@ int test_early_multip(std::ostream & report, size_t PrimeSize, size_t Taille, si
typedef typename std::vector<T> Vect ;
typedef typename Vect::iterator Iterator;
typedef typename std::vector<Vect>::iterator VectIterator;
- typedef LinBox::Modular<double> ModularField ;
+ typedef Givaro::Modular<double> ModularField ;
typedef ModularField::Element Element;
typedef std::vector<Integer> IntVect;
typedef std::vector<Element> pVect;
@@ -204,19 +205,19 @@ int test_full_multip_matrix(std::ostream & report, size_t PrimeSize,
size_t Size, std::pair<size_t, size_t> dims)
{
- typedef typename LinBox::UnparametricField<T> Unparam ;
+ typedef typename Givaro::ZRing<T> Unparam ;
typedef typename std::vector<T> Vect ;
typedef typename LinBox::BlasMatrix<Unparam> Matrix ;
typedef typename std::vector<Matrix> MatVect ;
typedef typename Vect::iterator Iterator;
typedef typename MatVect::iterator MatIterator;
- typedef typename LinBox::BlasMatrix<PID_integer> IntMatrix ;
+ typedef typename LinBox::BlasMatrix<Givaro::ZRing<Integer> > IntMatrix ;
- typedef LinBox::Modular<double> Field ;
+ typedef Givaro::Modular<double> Field ;
typedef Field::Element Element;
typedef typename LinBox::BlasMatrix<Field> pMatrix ;
- PID_integer Z ;
+ Givaro::ZRing<Integer> Z ;
Vect primes(Size) ;
/* probably not all coprime... */
@@ -240,7 +241,7 @@ int test_full_multip_matrix(std::ostream & report, size_t PrimeSize,
Iterator genprime = primes.begin() ; // prime iterator
MatIterator residu = residues.begin() ; // residu iterator
- double LogIntSize = (double)(PrimeSize+1)*std::log(2)+std::log((double)Size)+1 ;
+ double LogIntSize = (double)(PrimeSize+1)*std::log(2.)+std::log((double)Size)+1 ;
std::pair<size_t,double> my_pair(dims.first*dims.second,LogIntSize) ;
@@ -311,7 +312,7 @@ int test_full_multip(std::ostream & report, size_t PrimeSize, size_t Size, size_
typedef typename Vect::iterator Iterator;
typedef typename VectVect::iterator VectIterator;
- typedef LinBox::Modular<double > ModularField ;
+ typedef Givaro::Modular<double > ModularField ;
typedef ModularField::Element Element;
typedef typename std::vector<Element> pVect ;
@@ -335,7 +336,7 @@ int test_full_multip(std::ostream & report, size_t PrimeSize, size_t Size, size_
Iterator genprime = primes.begin() ; // prime iterator
VectIterator residu = residues.begin() ; // residu iterator
- double LogIntSize = (double)PrimeSize*std::log(2)+std::log((double)Size)+1 ;
+ double LogIntSize = (double)PrimeSize*std::log(2.)+std::log((double)Size)+1 ;
report << "FullMultipCRA (" << LogIntSize << ')' << std::endl;
FullMultipCRA<ModularField> cra( LogIntSize ) ;
@@ -400,7 +401,7 @@ int test_full_multip_fixed(std::ostream & report, size_t PrimeSize, size_t Size,
typedef typename Vect::iterator Iterator;
typedef typename VectVect::iterator VectIterator;
- typedef LinBox::Modular<double > ModularField ;
+ typedef Givaro::Modular<double > ModularField ;
typedef ModularField::Element Element;
typedef typename std::vector<Element> pVect ;
typedef typename pVect::iterator pVectIterator ;
@@ -424,7 +425,7 @@ int test_full_multip_fixed(std::ostream & report, size_t PrimeSize, size_t Size,
Iterator genprime = primes.begin() ; // prime iterator
VectIterator residu = residues.begin() ; // residu iterator
- double LogIntSize = (double)PrimeSize*std::log(2)+std::log((double)Size) ;
+ double LogIntSize = (double)PrimeSize*std::log(2.)+std::log((double)Size) ;
std::pair<size_t,double> my_pair(Taille,LogIntSize) ;
@@ -544,10 +545,10 @@ int main(int ac, char ** av)
/* Argument parsing/setting */
- static size_t n = 50; /* Taille */
+ static size_t n = 30; /* Taille */
static size_t p = 22; /* PrimeSize */
// static size_t seed = 0; /* ! unused */
- static size_t iters = 20; /* _LB_REPEAT */
+ static size_t iters = 2; /* _LB_REPEAT */
static Argument as[] = {
{ 'n', "-n N", "Set number of primes.", TYPE_INT , &n },
@@ -558,7 +559,7 @@ int main(int ac, char ** av)
parseArguments (ac, av, as);
- bool pass = true ;
+ bool pass ;
srand((unsigned)time(NULL)); // seeding
size_t PrimeSize = p; // size of the residues/primes
diff --git a/tests/test-cradomain.C b/tests/test-cradomain.C
index d181635..586123d 100644
--- a/tests/test-cradomain.C
+++ b/tests/test-cradomain.C
@@ -29,9 +29,10 @@
*/
+#include "linbox/ring/modular.h"
+#include "linbox/matrix/dense-matrix.h"
+#include "linbox/matrix/matrix-domain.h"
#include "linbox/algorithms/cra-domain.h"
-#include "linbox/field/modular.h"
-#include "linbox/algorithms/blas-domain.h"
#include "linbox/algorithms/cra-early-multip.h"
#include "linbox/algorithms/cra-full-multip.h"
#include "linbox/algorithms/cra-full-multip-fixed.h"
@@ -42,23 +43,24 @@
using namespace LinBox;
struct Interator {
- std::vector<integer> _v;
+ BlasVector<Givaro::ZRing<Integer> > _v;
double maxsize;
- Interator(const std::vector<integer>& v) :
+ Interator(const BlasVector<Givaro::ZRing<Integer> >& v) :
_v(v), maxsize(0.0)
{
- for(std::vector<integer>::const_iterator it=_v.begin();
+ for(BlasVector<Givaro::ZRing<Integer> > ::const_iterator it=_v.begin();
it != _v.end(); ++it) {
+ //!@bug bb: *it < 0 ?
double ds = Givaro::naturallog(*it);
maxsize = (maxsize<ds?ds:maxsize);
}
}
Interator(int n, int s) :
- _v(n), maxsize(0.0)
+ _v(Givaro::ZRing<Integer>(),(size_t)n), maxsize(0.0)
{
- for(std::vector<integer>::iterator it=_v.begin();
+ for(BlasVector<Givaro::ZRing<Integer> >::iterator it=_v.begin();
it != _v.end(); ++it) {
Integer::random<false>(*it, s);
double ds = Givaro::naturallog(*it);
@@ -66,7 +68,7 @@ struct Interator {
}
}
- const std::vector<integer>& getVector()
+ const BlasVector<Givaro::ZRing<Integer> >& getVector()
{
return _v;
}
@@ -76,12 +78,12 @@ struct Interator {
}
template<typename Field>
- std::vector<typename Field::Element>& operator()(std::vector<typename Field::Element>& v,
- const Field& F) const
+ BlasVector<Field>& operator()(BlasVector<Field>& v,
+ const Field& F) const
{
v.resize(_v.size());
- std::vector<integer>::const_iterator vit=_v.begin();
- typename std::vector<typename Field::Element>::iterator eit=v.begin();
+ BlasVector<Givaro::ZRing<Integer> >::const_iterator vit=_v.begin();
+ typename BlasVector<Field>::iterator eit=v.begin();
for( ; vit != _v.end(); ++vit, ++eit){
F.init(*eit, *vit);
}
@@ -93,26 +95,28 @@ struct Interator {
struct InteratorIt;
namespace LinBox
{
- template<class Element> struct CRATemporaryVectorTrait<InteratorIt , Element> {
- typedef typename std::vector<double>::iterator Type_t;
+ template<class Field>
+ struct CRATemporaryVectorTrait<InteratorIt , Field> {
+ typedef typename BlasVector<Field>::iterator Type_t;
};
}
struct InteratorIt : public Interator {
+ // could use BlasVector and changeField
mutable std::vector<double> _vectC;
- InteratorIt(const std::vector<integer>& v) :
+ InteratorIt(const BlasVector<Givaro::ZRing<Integer> >& v) :
Interator(v), _vectC(v.size())
{}
InteratorIt(int n, int s) :
- Interator(n,s), _vectC(n)
+ Interator(n,s), _vectC((size_t)n)
{}
template<typename Iterator, typename Field>
Iterator& operator()(Iterator& res, const Field& F) const
{
- std::vector<integer>::const_iterator vit=this->_v.begin();
+ BlasVector<Givaro::ZRing<Integer> >::const_iterator vit=this->_v.begin();
std::vector<double>::iterator eit=_vectC.begin();
for( ; vit != _v.end(); ++vit, ++eit) {
F.init(*eit, *vit);
@@ -124,9 +128,11 @@ struct InteratorIt : public Interator {
};
template<typename Field> struct InteratorBlas;
+
namespace LinBox
{
- template<class Element,class Field> struct CRATemporaryVectorTrait<InteratorBlas<Field> , Element> {
+ template<class Field>
+ struct CRATemporaryVectorTrait<InteratorBlas<Field>, Field > {
typedef typename LinBox::BlasMatrix<Field>::pointer Type_t;
};
}
@@ -134,17 +140,25 @@ namespace LinBox
template<typename Field>
struct InteratorBlas : public Interator {
typedef typename Field::Element Element;
- typedef LinBox::BlasMatrix<LinBox::UnparametricField<Element> > Matrix;
+ typedef LinBox::BlasMatrix<Givaro::ZRing<Element> > Matrix;
typedef typename Matrix::pointer Pointer;
- typename LinBox::UnparametricField<Element> _field;
+ typename Givaro::ZRing<Element> _field;
mutable Matrix _vectC;
- InteratorBlas(const std::vector<integer>& v) : Interator(v),_field(), _vectC(_field,(int)v.size(), (int)1) {}
- InteratorBlas(int n, int s) : Interator(n,s), _field(),_vectC(_field,n,1) {}
+ InteratorBlas(const BlasVector<Givaro::ZRing<Integer> >& v) :
+ Interator(v),
+ _field(),
+ _vectC(_field,(int)v.size(), (int)1)
+ {}
+
+ InteratorBlas(int n, int s) :
+ Interator(n,s),
+ _field(),
+ _vectC(_field,n,1) {}
Pointer& operator()(Pointer& res, const Field& F) const
{
- std::vector<integer>::const_iterator vit=this->_v.begin();
+ BlasVector<Givaro::ZRing<Integer> >::const_iterator vit=this->_v.begin();
res = _vectC.getWritePointer();
for( ; vit != _v.end(); ++vit, ++res)
F.init(*res, *vit);
@@ -162,14 +176,15 @@ bool TestOneCRA(std::ostream& report, Iter& iteration, RandGen& genprime, size_t
{
report << "ChineseRemainder<" << typeid(Builder).name() << ">(" << bound << ')' << std::endl;
LinBox::ChineseRemainder< Builder > cra( bound );
- std::vector<integer> Res(N);
+ Givaro::ZRing<Integer> Z;
+ BlasVector<Givaro::ZRing<Integer> > Res(Z,N);
cra( Res, iteration, genprime);
bool locpass = std::equal( Res.begin(), Res.end(), iteration.getVector().begin() );
if (locpass) report << "ChineseRemainder<" << typeid(Builder).name() << ">(" << iteration.getLogSize() << ')' << ", passed." << std::endl;
else {
report << "***ERROR***: ChineseRemainder<" << typeid(Builder).name() << ">(" << iteration.getLogSize() << ')' << "***ERROR***" << std::endl;
- std::vector<integer>::const_iterator Rit=Res.begin();
- std::vector<integer>::const_iterator Oit=iteration.getVector().begin();
+ BlasVector<Givaro::ZRing<Integer> >::const_iterator Rit=Res.begin();
+ BlasVector<Givaro::ZRing<Integer> >::const_iterator Oit=iteration.getVector().begin();
for( ; Rit!=Res.end(); ++Rit, ++Oit)
if (*Rit != *Oit)
report << *Rit << " != " << * Oit << std::endl;
@@ -181,17 +196,18 @@ bool TestOneCRA(std::ostream& report, Iter& iteration, RandGen& genprime, size_t
template<typename Builder, typename Iter, typename RandGen, typename BoundType>
bool TestOneCRAbegin(std::ostream& report, Iter& iteration, RandGen& genprime, size_t N, const BoundType& bound)
{
+ Givaro::ZRing<Integer> Z;
report << "ChineseRemainder<" << typeid(Builder).name() << ">(" << bound << ')' << std::endl;
LinBox::ChineseRemainder< Builder > cra( bound );
- std::vector<integer> Res(N);
- std::vector<integer>::iterator ResIT= Res.begin();
+ BlasVector<Givaro::ZRing<Integer> > Res(Z,N);
+ BlasVector<Givaro::ZRing<Integer> >::iterator ResIT= Res.begin();
cra( ResIT, iteration, genprime);
bool locpass = std::equal( Res.begin(), Res.end(), iteration.getVector().begin() );
if (locpass) report << "ChineseRemainder<" << typeid(Builder).name() << ">(" << iteration.getLogSize() << ')' << ", passed." << std::endl;
else {
report << "***ERROR***: ChineseRemainder<" << typeid(Builder).name() << ">(" << iteration.getLogSize() << ')' << "***ERROR***" << std::endl;
- std::vector<integer>::const_iterator Rit=Res.begin();
- std::vector<integer>::const_iterator Oit=iteration.getVector().begin();
+ BlasVector<Givaro::ZRing<Integer> >::const_iterator Rit=Res.begin();
+ BlasVector<Givaro::ZRing<Integer> >::const_iterator Oit=iteration.getVector().begin();
for( ; Rit!=Res.end(); ++Rit, ++Oit)
if (*Rit != *Oit)
report << *Rit << " != " << * Oit << std::endl;
@@ -205,8 +221,8 @@ bool TestOneCRAWritePointer(std::ostream& report, Iter& iteration, RandGen& genp
{
report << "ChineseRemainder<" << typeid(Builder).name() << ">(" << bound << ')' << std::endl;
LinBox::ChineseRemainder< Builder > cra( bound );
- PID_integer Z ;
- LinBox::BlasMatrix<PID_integer> Res(Z, (int)N, (int)N);
+ Givaro::ZRing<Integer> Z ;
+ LinBox::BlasMatrix<Givaro::ZRing<Integer> > Res(Z, (int)N, (int)N);
cra( Res.getWritePointer(), iteration, genprime);
bool locpass = std::equal( iteration.getVector().begin(), iteration.getVector().end(), Res.getWritePointer() );
@@ -220,84 +236,87 @@ bool TestOneCRAWritePointer(std::ostream& report, Iter& iteration, RandGen& genp
}
-bool TestCra(int N, int S, size_t seed)
+bool TestCra(size_t N, int S, size_t seed)
{
std::ostream &report = LinBox::commentator().report (LinBox::Commentator::LEVEL_IMPORTANT,
INTERNAL_DESCRIPTION);
// std::ostream &report = std::cout;
+ Givaro::ZRing<Integer> Z;
- size_t new_seed = (seed?(seed):(BaseTimer::seed())) ;
+ size_t new_seed = (seed?(seed):((size_t)BaseTimer::seed())) ;
report << "TestCra(" << N << ',' << S << ',' << new_seed << ')' << std::endl;
Integer::seeding(new_seed);
- Interator iteration(N, S);
+ Interator iteration((int)N, S);
InteratorIt iterationIt(iteration.getVector());
- InteratorBlas<LinBox::Modular<double> > iterationBlas(iteration.getVector());
+ InteratorBlas<Givaro::Modular<double> > iterationBlas(iteration.getVector());
LinBox::RandomPrimeIterator genprime( 24, new_seed );
bool pass = true;
- pass &= TestOneCRA< LinBox::EarlyMultipCRA< LinBox::Modular<double> >,
+ pass &= TestOneCRA< LinBox::EarlyMultipCRA< Givaro::Modular<double> >,
Interator, LinBox::RandomPrimeIterator>(
report, iteration, genprime, N, 5);
- pass &= TestOneCRA< LinBox::EarlyMultipCRA< LinBox::Modular<double> >,
+ pass &= TestOneCRA< LinBox::EarlyMultipCRA< Givaro::Modular<double> >,
Interator, LinBox::RandomPrimeIterator>(
report, iteration, genprime, N, 15);
- pass &= TestOneCRA< LinBox::FullMultipCRA< LinBox::Modular<double> >,
+ pass &= TestOneCRA< LinBox::FullMultipCRA< Givaro::Modular<double> >,
Interator, LinBox::RandomPrimeIterator>(
report, iteration, genprime, N, iteration.getLogSize()+1);
- pass &= TestOneCRA< LinBox::FullMultipCRA< LinBox::Modular<double> >,
+ pass &= TestOneCRA< LinBox::FullMultipCRA< Givaro::Modular<double> >,
Interator, LinBox::RandomPrimeIterator>(
report, iteration, genprime, N, 3*iteration.getLogSize()+15);
- pass &= TestOneCRAbegin<LinBox::FullMultipFixedCRA< LinBox::Modular<double> >,
+#if 0
+ pass &= TestOneCRAbegin<LinBox::FullMultipFixedCRA< Givaro::Modular<double> >,
InteratorIt, LinBox::RandomPrimeIterator>(
report, iterationIt, genprime, N, std::pair<size_t,double>(N,iteration.getLogSize()+1));
- pass &= TestOneCRAbegin<LinBox::FullMultipFixedCRA< LinBox::Modular<double> >,
+ pass &= TestOneCRAbegin<LinBox::FullMultipFixedCRA< Givaro::Modular<double> >,
InteratorIt, LinBox::RandomPrimeIterator>(
report, iterationIt, genprime, N, std::pair<size_t,double>(N,3*iteration.getLogSize()+15));
- pass &= TestOneCRAWritePointer<LinBox::FullMultipFixedCRA< LinBox::Modular<double> >,
+ pass &= TestOneCRAWritePointer<LinBox::FullMultipFixedCRA< Givaro::Modular<double> >,
InteratorIt, LinBox::RandomPrimeIterator>(
report, iterationIt, genprime, N, std::pair<size_t,double>(N,iterationIt.getLogSize()+1) );
- pass &= TestOneCRAWritePointer<LinBox::FullMultipFixedCRA< LinBox::Modular<double> >,
+ pass &= TestOneCRAWritePointer<LinBox::FullMultipFixedCRA< Givaro::Modular<double> >,
InteratorIt, LinBox::RandomPrimeIterator>(
report, iterationIt, genprime, N, std::pair<size_t,double>(N,3*iterationIt.getLogSize()+15) );
- pass &= TestOneCRAWritePointer<LinBox::FullMultipFixedCRA< LinBox::Modular<double> >,
- InteratorBlas< LinBox::Modular<double> >,
+ pass &= TestOneCRAWritePointer<LinBox::FullMultipFixedCRA< Givaro::Modular<double> >,
+ InteratorBlas< Givaro::Modular<double> >,
LinBox::RandomPrimeIterator>(
report, iterationBlas, genprime, N, std::pair<size_t,double>(N,iterationIt.getLogSize()+1) );
- pass &= TestOneCRAWritePointer<LinBox::FullMultipFixedCRA< LinBox::Modular<double> >,
- InteratorBlas< LinBox::Modular<double> >,
+ pass &= TestOneCRAWritePointer<LinBox::FullMultipFixedCRA< Givaro::Modular<double> >,
+ InteratorBlas< Givaro::Modular<double> >,
LinBox::RandomPrimeIterator>(
report, iterationBlas, genprime, N, std::pair<size_t,double>(N,3*iterationIt.getLogSize()+15) );
+#endif
- std::vector<integer> PrimeSet;
+ BlasVector<Givaro::ZRing<Integer> > PrimeSet(Z);
double PrimeSize = 0.0;
for( ; PrimeSize < (iterationIt.getLogSize()+1); ++genprime ) {
- if (find(PrimeSet.begin(), PrimeSet.end(), *genprime) == PrimeSet.end()) {
+ if (std::find(PrimeSet.begin(), PrimeSet.end(), *genprime) == PrimeSet.end()) {
PrimeSet.push_back( *genprime );
PrimeSize += Givaro::naturallog(*genprime);
}
}
- std::vector<integer>::iterator psit = PrimeSet.begin();
+ BlasVector<Givaro::ZRing<Integer> > ::iterator psit = PrimeSet.begin();
pass &= TestOneCRA<
- LinBox::GivaroRnsFixedCRA< LinBox::Modular<double> >,
+ LinBox::GivaroRnsFixedCRA< Givaro::Modular<double> >,
Interator,
- std::vector<integer>::iterator,
- std::vector<integer> >(
+ BlasVector<Givaro::ZRing<Integer> > ::iterator,
+ BlasVector<Givaro::ZRing<Integer> > >(
report, iteration, psit, N, PrimeSet);
@@ -332,17 +351,16 @@ int main (int argc, char **argv)
bool pass = true;
for(int i=0; pass && i<iterations; ++i)
- pass &= TestCra((int)n,(int)s,seed);
+ pass &= TestCra((size_t)n,(int)s,seed);
LinBox::commentator().stop(MSG_STATUS (pass), "CRA-Domain test suite");
return pass ? 0 : -1;
}
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
// Local Variables:
// mode: C++
// tab-width: 8
// indent-tabs-mode: nil
// c-basic-offset: 8
// End:
-
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/tests/test-dense-zero-one.C b/tests/test-dense-zero-one.C
index d56c0b0..ed8ce42 100644
--- a/tests/test-dense-zero-one.C
+++ b/tests/test-dense-zero-one.C
@@ -32,14 +32,14 @@
-#include "linbox/matrix/blas-matrix.h"
-#include "linbox/algorithms/blas-domain.h"
+#include "linbox/matrix/dense-matrix.h"
#include "linbox/matrix/matrix-domain.h"
-#include "linbox/field/modular.h"
+#include "linbox/matrix/matrix-domain.h"
+#include "linbox/ring/modular.h"
#include "linbox/blackbox/dense-zero-one.h"
-#include <vector>
+
#include "linbox/util/timer.h"
#include "test-common.h"
@@ -126,15 +126,15 @@ bool testAssociativity(Blackbox& A)
Dom MD = A.domain();
size_t m = A.rowdim(), n = A.coldim() - 100;
size_t k = (m + n)/2;
- typename Dom::Block B(k,m), C(m,n);
+ typename Dom::Block B(A.field(),k,m), C(A.field(),m,n);
MD.random(B); MD.random(C);
- typename Dom::Block D(m,n), E(k,n);
+ typename Dom::Block D(A.field(),m,n), E(A.field(),k,n);
A.apply(D, C); // D = AC
MD.mul(E,B,D); // E = B(AC)
- typename Dom::Block F(k,m), G(k,n);
+ typename Dom::Block F(A.field(),k,m), G(A.field(),k,n);
A.unpackingApplyTranspose(F,B); // F = BA
MD.mul(G,F,C); // G = (BA)C
@@ -308,8 +308,8 @@ int main (int argc, char* argv[])
parseArguments (argc, argv, args);
// create a dense-zero-one
- typedef Modular<float> FieldF;
- typedef Modular<double> FieldD;
+ typedef Givaro::Modular<float> FieldF;
+ typedef Givaro::Modular<double> FieldD;
BlackboxDomain<FieldF> F(f);
FieldF::RandIter r1(F);
@@ -319,39 +319,35 @@ int main (int argc, char* argv[])
DenseZeroOne<BlackboxDomain<FieldF> > A(F, n, n);
DenseZeroOne<BlackboxDomain<FieldD> > B(D, n, n);
- FieldF::Element zeroF, oneF;
- FieldD::Element zeroD, oneD;
- F.init(oneF, 1); F.init(zeroF, 0);
- D.init(oneD, 1); D.init(zeroD, 0);
for (size_t i = 0; i < n; ++i)
for (size_t j = 0; j < n; ++j) {
if (rand()%2){
- A.setEntry(i, j, oneF);
- B.setEntry(i, j, oneD);
+ A.setEntry(i, j, F.one);
+ B.setEntry(i, j, D.one);
}
else {
- A.setEntry(i, j, zeroF);
- B.setEntry(i, j, zeroD);
+ A.setEntry(i, j, F.zero);
+ B.setEntry(i, j, D.zero);
}
}
//A.write(cout) << endl << endl;
//B.write(cout) << endl << endl;
- /* basic everyday test
+#if 0
+ /* basic everyday test */
cout << endl;
- cout << "Domain: Modular<float>, GF(" << f << ")" << endl;
+ cout << "Domain: Givaro::Modular<float>, GF(" << f << ")" << endl;
testTiming(A);
- cout << "Domain: Modular<double>, GF(" << d << ")" << endl;
+ cout << "Domain: Givaro::Modular<double>, GF(" << d << ")" << endl;
testTiming(B);
- */
- /* block size tests
+ /* block size tests */
cout << endl;
- cout << "Domain: Modular<double>, GF(" << d << ")" << endl << endl;
+ cout << "Domain: Givaro::Modular<double>, GF(" << d << ")" << endl << endl;
cout << "block Size n unpackingApply unpackingApplyTranspose Domain mul" << endl << endl;
for (size_t sizeU = 256; sizeU != 4096; sizeU *= 2)
for (int count = 500; count != 4500; count += 500){
@@ -360,53 +356,48 @@ int main (int argc, char* argv[])
for (size_t i = 0; i < count; ++i)
for (size_t j = 0; j < count; ++j) {
if (rand()%2)
- C.setEntry(i, j, oneD);
+ C.setEntry(i, j, D.one);
else
- C.setEntry(i, j, zeroD);
+ C.setEntry(i, j, D.zero);
}
blockSizeTimingTest(C, sizeU);
}
- */
+#endif
- /* stress test
- cout << "Domain: Modular<double>, GF(" << d << ")" << endl;
+#if 0
+ /* stress test */
+ cout << "Domain: Givaro::Modular<double>, GF(" << d << ")" << endl;
DenseZeroOne<BlackboxDomain<FieldD> > C(D, 30000, 30000);
for (size_t i = 0; i != 30000; ++i)
for (size_t j = 0; j != 30000; ++j) {
if (rand()%2)
- C.setEntry(i, j, oneD);
+ C.setEntry(i, j, D.one);
else
- C.setEntry(i, j, zeroD);
+ C.setEntry(i, j, D.zero);
}
stressTest(C);
- */
- /* large tests
- cout << "Domain: Modular<double>, GF(" << d << ")" << endl;
+ /* large tests */
+ cout << "Domain: Givaro::Modular<double>, GF(" << d << ")" << endl;
for (size_t dim = 120000; dim < 150000; dim *= 2){
DenseZeroOne<BlackboxDomain<FieldD> > C(D, dim, dim);
for (size_t i = 0; i != dim; ++i)
for (size_t j = 0; j != dim; ++j) {
if (rand()%2)
- C.setEntry(i, j, oneD);
+ C.setEntry(i, j, D.one);
else
- C.setEntry(i, j, zeroD);
+ C.setEntry(i, j, D.zero);
}
cout << "blackbox created\n";
largeTest(C);
}
- */
+#endif
+ std::cout << "most test is commented out" << std::endl;
if (!t){
bool pass = testAssociativity(B);
- /*
- if (pass)
- cout << "passes" << endl;
- else
- cout << "fails" << endl;
- */
return pass ? 0 : -1;
}
diff --git a/tests/test-dense.C b/tests/test-dense.C
index 1a781b5..7ac5244 100644
--- a/tests/test-dense.C
+++ b/tests/test-dense.C
@@ -7,20 +7,20 @@
*
* --------------------------------------------------------
*
- *
+ *
* ========LICENCE========
* This file is part of the library LinBox.
- *
+ *
* LinBox is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
- *
+ *
* This library 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
* Lesser General Public License for more details.
- *
+ *
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
@@ -42,12 +42,12 @@
#include <iostream>
#include <fstream>
-#include <vector>
+
#include <cstdio>
#include "linbox/util/commentator.h"
-#include "linbox/field/modular.h"
-#include "linbox/matrix/blas-matrix.h"
+#include "linbox/ring/modular.h"
+#include "linbox/matrix/dense-matrix.h"
#include "test-common.h"
#include "test-generic.h"
@@ -67,32 +67,29 @@ using namespace LinBox;
* Return true on success and false on failure
*/
-// using long on purpose
template <class Field>
-static bool testIdentity (Field &F, size_t n, int iterations)
+static bool testIdentity (Field &F, size_t n, int iterations = 1)
{
- typedef typename Vector<Field>::Dense Vector;
- typedef BlasMatrix<Field> Base;
- typedef BlasMatrix<Field> Blackbox;
+ typedef DenseVector<Field> Vector;
+ typedef DenseMatrix<Field> Base;
+ typedef DenseMatrix<Field> Blackbox;
- commentator().start ("Testing identity apply", "testIdentity", iterations);
+ commentator().start ("Testing identity apply", "testIdentity", (unsigned int)iterations);
bool ret = true;
- bool iter_passed = true;
+ // bool iter_passed = true;
Blackbox I(F, n, n);
// Matrix K(I);
//typename Field::Element x; F.init(x);
//F.write(std::cout, K.getEntry(x, i, j)) << std::endl;
//Matrix L(K);
- typename Field::Element one;
- F.init (one, 1);
for (size_t i = 0; i < n; i++)
- I.setEntry (i, i, one);
+ I.setEntry (i, i, F.one);
- Vector v(n), w(n);
+ Vector v(F,n), w(F,n);
typename Field::RandIter r (F);
for (int i = 0; i < iterations; i++) {
@@ -100,10 +97,10 @@ static bool testIdentity (Field &F, size_t n, int iterations)
snprintf (buf, 80, "Iteration %d", i);
commentator().start (buf);
- iter_passed = true;
+ bool iter_passed = true;
for (size_t j = 0; j < n; j++)
- r.random (v[j]);
+ r.random (v[(size_t)j]);
ostream &report = commentator().report (Commentator::LEVEL_IMPORTANT, INTERNAL_DESCRIPTION);
report << "Input vector: ";
@@ -119,7 +116,7 @@ static bool testIdentity (Field &F, size_t n, int iterations)
printVector<Field> (F, report, w);
for (size_t j = 0; j < (size_t)n; j++)
- if (!F.areEqual (w[j], v[j]))
+ if (!F.areEqual (w[(size_t)j], v[(size_t)j]))
ret = iter_passed = false;
if (!iter_passed)
@@ -154,22 +151,22 @@ static bool testIdentity (Field &F, size_t n, int iterations)
*/
template <class Field>
-static bool testVandermonde (Field &F, size_t n, int iterations, int N)
+static bool testVandermonde (Field &F, size_t n, int iterations = 1, int N = 1)
{
- typedef typename Vector<Field>::Dense Vector;
- typedef vector <typename Field::Element> Polynomial;
- typedef BlasMatrix <Field> Blackbox;
+ typedef DenseVector<Field> Vector;
+ typedef DenseVector <Field> Polynomial;
+ typedef DenseMatrix <Field> Blackbox;
- commentator().start ("Testing Vandermonde apply", "testVandermonde", iterations);
+ commentator().start ("Testing Vandermonde apply", "testVandermonde", (unsigned int)iterations);
bool ret = true;
bool inner_iter_passed;
int i, j, k;
- Blackbox V (F, n, n);
+ Blackbox V(F, n, n);
- Vector x(n), v(n), y(n), f(n);
+ Vector x(F,n), v(F,n), y(F,n), f(F,n);
typename Field::RandIter r (F);
typename Field::Element t;
@@ -179,15 +176,15 @@ static bool testVandermonde (Field &F, size_t n, int iterations, int N)
commentator().start (buf);
/* Evaluation points */
- for (j = 0; j < n; j++) {
+ for (j = 0; j < (int) n; j++) {
bool flag = true;
// Make sure points are all distinct
while (flag) {
- r.random (x[j]);
+ r.random (x[(size_t)j]);
flag = false;
for (k = 0; k < j; k++)
- if (F.areEqual (x[j], x[k]))
+ if (F.areEqual (x[(size_t)j], x[(size_t)k]))
flag = true;
}
}
@@ -197,21 +194,21 @@ static bool testVandermonde (Field &F, size_t n, int iterations, int N)
printVector<Field> (F, report, x);
/* Build the Vandermonde matrix */
- for (j = 0; j < n; j++) {
- F.init (t, 1);
+ for (j = 0; j < (int) n; j++) {
+ F.assign(t, F.one);
- for (k = 0; k < n; k++) {
- V.setEntry (j, k, t);
- F.mulin (t, x[j]);
+ for (k = 0; k < (int) n; k++) {
+ V.setEntry ((size_t)j,(size_t) k, t);
+ F.mulin (t, x[(size_t)j]);
}
}
- for (j = 0; j < N; j++) {
+ for (j = 0; j < (int) N; j++) {
inner_iter_passed = true;
/* Random vector of evaluation results */
- for (k = 0; k < n; k++)
- r.random (v[k]);
+ for (k = 0; k < (int)n; k++)
+ r.random (v[(size_t)k]);
report << "Input vector: ";
printVector<Field> (F, report, v);
@@ -228,8 +225,8 @@ static bool testVandermonde (Field &F, size_t n, int iterations, int N)
report << "Interpolation results: ";
printVector<Field> (F, report, f);
- for (k = 0; k < n; k++)
- if (!F.areEqual (f[k], v[k]))
+ for (k = 0; k < (int) n; k++)
+ if (!F.areEqual (f[(size_t)k], v[(size_t)k]))
ret = inner_iter_passed = false;
if (!inner_iter_passed)
@@ -260,16 +257,16 @@ static bool testVandermonde (Field &F, size_t n, int iterations, int N)
*/
template <class Field>
-static bool testRandomLinearity (const Field &F,
- VectorStream<typename Vector<Field>::Dense> &A_stream,
- VectorStream<typename Vector<Field>::Dense> &v1_stream,
- VectorStream<typename Vector<Field>::Dense> &v2_stream)
+static bool testRandomLinearity ( const Field & F,
+ VectorStream<DenseVector<Field> > &A_stream,
+ VectorStream<DenseVector<Field> > &v1_stream,
+ VectorStream<DenseVector<Field> > &v2_stream)
{
commentator().start ("Testing random linearity", "testRandomLinearity", v1_stream.size ());
- BlasMatrix<Field> A (F, A_stream);
+ DenseMatrix<Field> A (F, A_stream);
- bool ret = testLinearity (F, A, v1_stream, v2_stream);
+ bool ret = testLinearity (A, v1_stream, v2_stream);
A_stream.reset ();
v1_stream.reset ();
@@ -295,13 +292,13 @@ static bool testRandomLinearity (const Field &F,
template <class Field>
static bool testRandomTranspose (const Field &F,
- VectorStream<typename Vector<Field>::Dense> &A_stream,
- VectorStream<typename Vector<Field>::Dense> &v1_stream,
- VectorStream<typename Vector<Field>::Dense> &v2_stream)
+ VectorStream<DenseVector<Field> > &A_stream,
+ VectorStream<DenseVector<Field> > &v1_stream,
+ VectorStream<DenseVector<Field> > &v2_stream)
{
commentator().start ("Testing random transpose", "testRandomTranspose", v1_stream.size ());
- BlasMatrix<Field> A (F, A_stream);
+ DenseMatrix<Field> A (F, A_stream);
bool ret = testTranspose (F, A, v1_stream, v2_stream);
@@ -331,22 +328,24 @@ int main (int argc, char **argv)
END_OF_ARGUMENTS
};
- typedef Modular<uint32_t> Field;
+ typedef Givaro::Modular<uint32_t> Field;
parseArguments (argc, argv, args);
- Field F (q);
+ Field F (q); Field::RandIter gen(F);
- commentator().start("Dense matrix black box test suite", "BlasMatrix");
+ commentator().start("Dense matrix black box test suite", "DenseMatrix");
commentator().getMessageClass (INTERNAL_DESCRIPTION).setMaxDepth (5);
commentator().getMessageClass (INTERNAL_DESCRIPTION).setMaxDetailLevel (Commentator::LEVEL_UNIMPORTANT);
- RandomDenseStream<Field> A_stream (F, n, n);
- RandomDenseStream<Field> v1_stream (F, n, iterations);
- RandomDenseStream<Field> v2_stream (F, n, iterations);
+ RandomDenseStream<Field> A_stream (F, gen, n, n);
+ RandomDenseStream<Field> v1_stream (F, gen, n, (unsigned int)iterations);
+ RandomDenseStream<Field> v2_stream (F, gen, n, (unsigned int)iterations);
- if (!testIdentity (F, n, iterations)) pass = false;
- //if (!testVandermonde (F, n, iterations, N)) pass = false;
+ if (!testIdentity (F, n)) pass = false;
+ if (!testVandermonde (F, n)) pass = false;
+ DenseMatrix<Field> A(F, A_stream);
+ if (!testBlackbox(A)) pass = false;
//if (!testRandomLinearity (F, A_stream, v1_stream, v2_stream)) pass = false;
//if (!testRandomTranspose (F, A_stream, v1_stream, v2_stream)) pass = false;
@@ -354,11 +353,10 @@ int main (int argc, char **argv)
return pass ? 0 : -1;
}
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
// Local Variables:
// mode: C++
// tab-width: 8
// indent-tabs-mode: nil
// c-basic-offset: 8
// End:
-
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/tests/test-det.C b/tests/test-det.C
index b652324..e445cdf 100644
--- a/tests/test-det.C
+++ b/tests/test-det.C
@@ -6,20 +6,20 @@
*
* --------------------------------------------------------
*
- *
+ *
* ========LICENCE========
* This file is part of the library LinBox.
- *
+ *
* LinBox is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
- *
+ *
* This library 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
* Lesser General Public License for more details.
- *
+ *
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
@@ -36,19 +36,16 @@
+#include "linbox/linbox-config.h"
#include <iostream>
#include <fstream>
-#include <vector>
#include <cstdio>
-
-#include "linbox/linbox-config.h"
-
+#include <givaro/givrational.h>
#include "linbox/util/commentator.h"
-#include "linbox/field/modular.h"
-#include "linbox/field/PID-integer.h"
-#include "linbox/field/gmp-rational.h"
+#include "givaro/modular.h"
+#include "linbox/vector/blas-vector.h"
#include "linbox/blackbox/diagonal.h"
-#include "linbox/blackbox/sparse.h"
+#include "linbox/matrix/sparse-matrix.h"
#include "linbox/solutions/det.h"
#include "linbox/solutions/methods.h"
@@ -71,12 +68,10 @@ using namespace LinBox;
template <class Field>
static bool testDiagonalDet1 (Field &F, size_t n, int iterations)
{
- typedef vector <typename Field::Element> Vector;
- typedef vector <typename Field::Element> Polynomial;
- typedef vector <pair <size_t, typename Field::Element> > Row;
+ typedef BlasVector<Field> Vector;
typedef Diagonal <Field> Blackbox;
- commentator().start ("Testing nonsingular diagonal determinant (1)", "testDiagonalDet1", iterations);
+ commentator().start ("Testing nonsingular diagonal determinant (1)", "testDiagonalDet1", (unsigned int) iterations);
bool ret = true;
bool done;
@@ -85,14 +80,14 @@ static bool testDiagonalDet1 (Field &F, size_t n, int iterations)
VectorDomain<Field> VD (F);
- Vector d(n);
+ Vector d(F,n);
typename Field::Element pi, phi_wiedemann, phi_symm_wied, phi_blas_elimination, phi_sparseelim;
typename Field::RandIter r (F);
for (i = 0; i < iterations; i++) {
- commentator().startIteration (i);
+ commentator().startIteration ((unsigned int) i);
- F.init (pi, 1);
+ F.assign(pi, F.one);
for (j = 0; j < n; j++) {
do {
@@ -119,7 +114,7 @@ static bool testDiagonalDet1 (Field &F, size_t n, int iterations)
F.write (report, pi);
report << endl;
- Blackbox D (F, d);
+ Blackbox D (d);
Method::Wiedemann WiedemannChoice;
det (phi_wiedemann, D, WiedemannChoice);
@@ -165,25 +160,23 @@ static bool testDiagonalDet1 (Field &F, size_t n, int iterations)
template <class Field>
static bool testDiagonalDet2 (Field &F, size_t n, int iterations)
{
- typedef vector <typename Field::Element> Vector;
- typedef vector <typename Field::Element> Polynomial;
- typedef vector <pair <size_t, typename Field::Element> > Row;
+ typedef BlasVector<Field> Vector;
typedef Diagonal <Field> Blackbox;
- commentator().start ("Testing nonsingular diagonal determinant (2)", "testDiagonalDet2", iterations);
+ commentator().start ("Testing nonsingular diagonal determinant (2)", "testDiagonalDet2", (unsigned int) iterations);
bool ret = true;
int i, k;
size_t j;
- Vector d(n);
+ Vector d(F,n);
typename Field::Element pi, phi_wiedemann, phi_symm_wied, phi_blas_elimination, phi_sparseelim;
typename Field::RandIter r (F);
for (i = 0; i < iterations; i++) {
- commentator().startIteration (i);
+ commentator().startIteration ((unsigned int)i);
- F.init (pi, 1);
+ F.assign(pi, F.one);
for (j = 0; j < n / 2; j++) {
do r.random (d[j]); while (F.isZero (d[j]));
@@ -191,9 +184,9 @@ static bool testDiagonalDet2 (Field &F, size_t n, int iterations)
}
for (j = n / 2; j < n; j++) {
- k =int( rand () % (n / 2) );
- d[j] = d[k];
- F.mulin (pi, d[j]);
+ k =int( (size_t)rand () % (n / 2) );
+ d[j] = d[(size_t)k];
+ F.mulin (pi, d[(size_t)j]);
}
//ostream &report = commentator().report (Commentator::LEVEL_IMPORTANT, INTERNAL_DESCRIPTION);
@@ -205,7 +198,7 @@ static bool testDiagonalDet2 (Field &F, size_t n, int iterations)
F.write (report, pi);
report << endl;
- Blackbox D (F, d);
+ Blackbox D (d);
Method::Wiedemann WiedemannChoice;
det (phi_wiedemann, D, WiedemannChoice);
WiedemannChoice.symmetric(Specifier::SYMMETRIC);
@@ -257,36 +250,34 @@ static bool testDiagonalDet2 (Field &F, size_t n, int iterations)
template <class Field>
static bool testSingularDiagonalDet (Field &F, size_t n, int iterations)
{
- typedef vector <typename Field::Element> Vector;
- typedef vector <typename Field::Element> Polynomial;
- typedef vector <pair <size_t, typename Field::Element> > Row;
+ typedef BlasVector <Field> Vector;
typedef Diagonal <Field> Blackbox;
- commentator().start ("Testing singular diagonal determinant", "testSingularDiagonalDet", iterations);
+ commentator().start ("Testing singular diagonal determinant", "testSingularDiagonalDet",(size_t) iterations);
bool ret = true;
int i;
size_t j;
- Vector d(n);
+ Vector d(F,n);
typename Field::Element phi_wiedemann, phi_symm_wied, phi_blas_elimination, phi_sparseelim;
typename Field::RandIter r (F);
for (i = 0; i < iterations; i++) {
- commentator().startIteration (i);
+ commentator().startIteration ((unsigned int)i);
for (j = 0; j < n; j++)
r.random (d[j]);
// until bug about the upper left entry being zero is fixed:
- F.init (d[1+ rand () % (n-1)], 0);
- //F.init (d[rand () % n], 0);
+ F.assign(d[1+ (size_t)rand () % (n-1)], F.zero);
+ //F.assign(d[rand () % n], zero);
ostream &report = commentator().report (Commentator::LEVEL_IMPORTANT, INTERNAL_DESCRIPTION);
report << "Diagonal entries: ";
printVector<Field> (F, report, d);
- Blackbox D (F, d);
+ Blackbox D (d);
Method::Wiedemann WiedemannChoice;
det (phi_wiedemann, D, WiedemannChoice);
@@ -338,16 +329,16 @@ static bool testSingularDiagonalDet (Field &F, size_t n, int iterations)
bool testIntegerDet (size_t n, int iterations)
{
- commentator().start ("Testing integer determinant", "testIntegerDet", iterations);
+ commentator().start ("Testing integer determinant", "testIntegerDet", (unsigned int)iterations);
bool ret = true;
for (int i = 0; i < iterations; ++i) {
- commentator().startIteration (i);
- PID_integer R;
- SparseMatrix<PID_integer> A (R, n, n);
+ commentator().startIteration ((unsigned int)i);
+ Givaro::IntegerDom R;
+ SparseMatrix<Givaro::IntegerDom> A (R, n, n);
- integer pi = 1L;
+ integer pi = 1;
integer det_A_wiedemann, det_A_symm_wied, det_A_blas_elimination;
for (unsigned int j = 0; j < n; ++j) {
@@ -416,16 +407,16 @@ bool testIntegerDet (size_t n, int iterations)
bool testIntegerDetGen (size_t n, int iterations)
{
- commentator().start ("Testing integer determinant, generic methods", "testIntegerDeterminantGeneric", iterations);
+ commentator().start ("Testing integer determinant, generic methods", "testIntegerDeterminantGeneric", (unsigned int) iterations);
bool ret = true;
for (int i = 0; i < iterations; ++i) {
- commentator().startIteration (i);
- PID_integer R;
- SparseMatrix<PID_integer> A (R, n, n);
+ commentator().startIteration ((unsigned int)i);
+ Givaro::IntegerDom R;
+ SparseMatrix<Givaro::IntegerDom> A (R, n, n);
- integer pi = 1L;
+ integer pi = 1;
integer det_A, det_A_H, det_A_B, det_A_E;
for (unsigned int j = 0; j < n; ++j) {
@@ -499,25 +490,25 @@ bool testIntegerDetGen (size_t n, int iterations)
bool testRationalDetGen (size_t n, int iterations)
{
- commentator().start ("Testing rational determinant, generic methods", "testRationalDeterminantGeneric", iterations);
+ commentator().start ("Testing rational determinant, generic methods", "testRationalDeterminantGeneric", (unsigned int) iterations);
bool ret = true;
for (int i = 0; i < iterations; ++i) {
- commentator().startIteration (i);
- GMPRationalField Q;
- SparseMatrix<GMPRationalField > A (Q, n, n);
- BlasMatrix <GMPRationalField > BB(Q, n, n);
+ commentator().startIteration ((unsigned int)i);
+ Givaro::QField<Givaro::Rational> Q;
+ SparseMatrix<Givaro::QField<Givaro::Rational> > A (Q, n, n);
+ BlasMatrix <Givaro::QField<Givaro::Rational> > BB(Q, n, n);
- GMPRationalField::Element pi(1,1);
- GMPRationalField::Element det_A, det_B,det_A_H, det_B_H, det_A_B, det_B_B, det_A_E, det_B_E;
+ Givaro::QField<Givaro::Rational>::Element pi(1,1);
+ Givaro::QField<Givaro::Rational>::Element det_A, det_B,det_A_H, det_B_H, det_A_B, det_B_B, det_A_E, det_B_E;
for (unsigned int j = 0; j < n; ++j) {
integer tmp_n;
integer tmp_d;
integer::nonzerorandom (tmp_n, 20*i + 1);
integer::nonzerorandom (tmp_d, 20*i + 1);
- GMPRationalField::Element tmp;
+ Givaro::QField<Givaro::Rational>::Element tmp;
Q.init(tmp,tmp_n,tmp_d);
A.setEntry(j,j,tmp);
BB.setEntry(j,j,tmp);
@@ -613,9 +604,9 @@ int main (int argc, char **argv)
{
bool pass = true;
- static size_t n = 10;
+ static size_t n = 4;
static integer q = 4093U;
- static int iterations = 2;
+ static int iterations = 1;
static Argument args[] = {
{ 'n', "-n N", "Set dimension of test matrices to NxN", TYPE_INT, &n },
@@ -625,7 +616,7 @@ int main (int argc, char **argv)
};
parseArguments (argc, argv, args);
- Modular<int> F (q);
+ Givaro::Modular<int32_t> F (q);
commentator().start("Determinant test suite", "det");
@@ -637,18 +628,19 @@ int main (int argc, char **argv)
if (!testDiagonalDet2 (F, n, iterations)) pass = false;
if (!testSingularDiagonalDet (F, n, iterations)) pass = false;
if (!testIntegerDet (n, iterations)) pass = false;
+/*
if (!testIntegerDetGen (n, iterations)) pass = false;
if (!testRationalDetGen (n, iterations)) pass = false;
+*/
commentator().stop("determinant test suite");
return pass ? 0 : -1;
}
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
// Local Variables:
// mode: C++
// tab-width: 8
// indent-tabs-mode: nil
// c-basic-offset: 8
// End:
-
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/tests/test-diagonal.C b/tests/test-diagonal.C
index e3c7931..94dad14 100644
--- a/tests/test-diagonal.C
+++ b/tests/test-diagonal.C
@@ -4,23 +4,23 @@
*
* Written by Bradford Hovinen <hovinen at cis.udel.edu>
*
- * Time-stamp: <22 Jun 10 15:59:39 Jean-Guillaume.Dumas at imag.fr>
+ * Time-stamp: <02 Dec 15 11:45:00 Jean-Guillaume.Dumas at imag.fr>
* --------------------------------------------------------
*
- *
+ *
* ========LICENCE========
* This file is part of the library LinBox.
- *
+ *
* LinBox is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
- *
+ *
* This library 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
* Lesser General Public License for more details.
- *
+ *
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
@@ -41,23 +41,24 @@
#include <iostream>
#include <fstream>
-#include <vector>
+
#include <cstdio>
#include "linbox/blackbox/diagonal.h"
#include "linbox/util/commentator.h"
-#include "linbox/field/archetype.h"
-#include "linbox/field/modular.h"
-#include "linbox/randiter/nonzero.h"
-#include "linbox/solutions/minpoly.h"
-#include "linbox/solutions/rank.h"
-#include "linbox/vector/stream.h"
+//#include "linbox/field/archetype.h"
+#include "linbox/ring/modular.h"
+#include <givaro/givranditer.h>
+//#include "linbox/solutions/minpoly.h"
+//#include "linbox/solutions/rank.h"
+//#include "linbox/vector/stream.h"
-#include "test-common.h"
-#include "test-generic.h"
+#include "test-blackbox.h"
+//#include "test-generic.h"
using namespace LinBox;
+#if 0
/* Test 1: Application of identity matrix onto random vectors
*
* Construct the identity matrix and a series of randomly-generated
@@ -78,21 +79,21 @@ static bool testIdentityApply (Field &F, VectorStream<Vector> &stream)
commentator().start ("Testing identity apply", "testIdentityApply", stream.m ());
bool ret = true;
- bool iter_passed = true;
+ // bool iter_passed = true;
VectorDomain<Field> VD (F);
- Vector d;
+ Vector d(F);
size_t i;
VectorWrapper::ensureDim (d, stream.n ());
for (i = 0; i < stream.n (); i++)
- F.init (VectorWrapper::ref<Field> (d, i), 1);
+ F.assign(VectorWrapper::ref<Field> (d, i), F.one);
- Blackbox D (F, d);
+ Blackbox D (d);
- Vector v, w;
+ Vector v(F), w(F);
VectorWrapper::ensureDim (v, stream.n ());
VectorWrapper::ensureDim (w, stream.n ());
@@ -100,7 +101,7 @@ static bool testIdentityApply (Field &F, VectorStream<Vector> &stream)
while (stream) {
commentator().startIteration ((unsigned)i);
- iter_passed = true;
+ bool iter_passed = true;
stream.next (v);
@@ -149,7 +150,7 @@ static bool testIdentityApply (Field &F, VectorStream<Vector> &stream)
template <class Field, class Vector>
static bool testRandomMinpoly (Field &F, VectorStream<Vector> &stream)
{
- typedef vector <typename Field::Element> Polynomial;
+ typedef BlasVector<Field> Polynomial;
typedef LinBox::Diagonal <Field> Blackbox;
commentator().start ("Testing random minpoly", "testRandomMinpoly", stream.m ());
@@ -158,17 +159,17 @@ static bool testRandomMinpoly (Field &F, VectorStream<Vector> &stream)
size_t j;
typename Field::Element pi;
- Polynomial m_D;
+ Polynomial m_D(F);
VectorDomain<Field> VD (F);
- Vector d;
+ Vector d(F);
VectorWrapper::ensureDim (d, stream.n ());
while (stream) {
commentator().startIteration ((unsigned)stream.j ());
- F.init (pi, 1);
+ F.assign(pi, F.one);
stream.next (d);
@@ -184,7 +185,7 @@ static bool testRandomMinpoly (Field &F, VectorStream<Vector> &stream)
F.write (report, pi);
report << endl;
- Blackbox D (F, d);
+ Blackbox D (d);
minpoly (m_D, D);
report << "Minimal polynomial: ";
@@ -231,7 +232,7 @@ static bool testRandomMinpoly (Field &F, VectorStream<Vector> &stream)
template <class Field, class Vector>
static bool testRandomLinearity (Field &F,
- VectorStream<std::vector<typename Field::Element> > &d_stream,
+ VectorStream<BlasVector<Field> > &d_stream,
VectorStream<Vector> &stream1,
VectorStream<Vector> &stream2)
{
@@ -241,18 +242,18 @@ static bool testRandomLinearity (Field &F,
VectorDomain<Field> VD (F);
- std::vector<typename Field::Element> d;
+ BlasVector<Field> d(F);
VectorWrapper::ensureDim (d, stream1.n ());
d_stream.next (d);
- Blackbox D (F, d);
+ Blackbox D (d);
ostream &report = commentator().report (Commentator::LEVEL_IMPORTANT, INTERNAL_DESCRIPTION);
report << "Diagonal vector: ";
VD.write (report, d) << endl;
- bool ret = testLinearity (F, D, stream1, stream2);
+ bool ret = testLinearity (D, stream1, stream2);
commentator().stop (MSG_STATUS (ret), (const char *) 0, "testRandomLinearity");
@@ -273,7 +274,7 @@ static bool testRandomLinearity (Field &F,
template <class Field, class Vector>
static bool testRandomTranspose (Field &F,
- VectorStream<std::vector<typename Field::Element> > &d_stream,
+ VectorStream<BlasVector<Field> > &d_stream,
VectorStream<Vector> &stream1,
VectorStream<Vector> &stream2)
{
@@ -283,11 +284,11 @@ static bool testRandomTranspose (Field &F,
VectorDomain<Field> VD (F);
- std::vector<typename Field::Element> d;
+ BlasVector<Field> d(F);
VectorWrapper::ensureDim (d, stream1.n ());
d_stream.next (d);
- Blackbox D (F, d);
+ Blackbox D (d);
ostream &report = commentator().report (Commentator::LEVEL_IMPORTANT, INTERNAL_DESCRIPTION);
@@ -300,13 +301,14 @@ static bool testRandomTranspose (Field &F,
return ret;
}
+#endif
int main (int argc, char **argv)
{
bool pass = true;
static size_t n = 10;
- static integer q = 2147483647U;
+ static integer q = 65521U;
static int iterations = 2; // was 100
static Argument args[] = {
@@ -316,8 +318,8 @@ int main (int argc, char **argv)
END_OF_ARGUMENTS
};
- typedef Modular<uint32_t> Field; //C.Pernet: avoids confusion with givaro::uint32_t
- typedef vector<Field::Element> Vector;
+ typedef Givaro::Modular<uint32_t> Field; //C.Pernet: avoids confusion with givaro::uint32_t
+// typedef BlasVector<Field> Vector;
parseArguments (argc, argv, args);
Field F (q);
@@ -330,17 +332,20 @@ int main (int argc, char **argv)
commentator().getMessageClass (INTERNAL_DESCRIPTION).setMaxDepth (3);
commentator().getMessageClass (INTERNAL_DESCRIPTION).setMaxDetailLevel (Commentator::LEVEL_UNIMPORTANT);
- RandomDenseStream<Field, Vector> stream1 (F, n, iterations), stream2 (F, n, iterations), d_stream (F, n, 1);
- RandomDenseStream<Field, Vector, NonzeroRandIter<Field> >
- stream3 (F, NonzeroRandIter<Field> (F, Field::RandIter (F)), n, iterations);
+#if 0
+ Field::RandIter gen(F);
+ RandomDenseStream<Field, Vector> stream1 (F, gen, n, (unsigned int)iterations), stream2 (F, gen, n, (unsigned int)iterations), d_stream (F, gen, n, 1);
+ RandomDenseStream<Field, Vector, Givaro::GeneralRingNonZeroRandIter<Field> >
+ stream3 (F, Givaro::GeneralRingNonZeroRandIter<Field> (Field::RandIter (F)), n, (unsigned int)iterations);
if (!testIdentityApply (F, stream1)) pass = false;
if (!testRandomMinpoly (F, stream3)) pass = false;
if (!testRandomLinearity (F, d_stream, stream1, stream2)) pass = false;
if (!testRandomTranspose (F, d_stream, stream1, stream2)) pass = false;
+#endif
Field::RandIter iter(F);
- LinBox::Diagonal<Field> D(F, 10, iter);
+ LinBox::Diagonal<Field> D(F, n, iter);
pass = pass && testBlackbox(D);
commentator().stop (MSG_STATUS (pass));
@@ -348,11 +353,10 @@ int main (int argc, char **argv)
return pass ? 0 : -1;
}
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
// Local Variables:
// mode: C++
// tab-width: 8
// indent-tabs-mode: nil
// c-basic-offset: 8
// End:
-
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/tests/test-dif.C b/tests/test-dif.C
index 7768f4c..c8d2fdc 100644
--- a/tests/test-dif.C
+++ b/tests/test-dif.C
@@ -6,20 +6,20 @@
* It will be desirable to keep test-sum and test-dif in sync.
* ------------------------------------
*
- *
+ *
* ========LICENCE========
* This file is part of the library LinBox.
- *
+ *
* LinBox is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
- *
+ *
* This library 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
* Lesser General Public License for more details.
- *
+ *
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
@@ -40,12 +40,12 @@
#include <iostream>
#include <fstream>
-#include <vector>
+
#include "linbox/util/commentator.h"
#include "linbox/vector/stream.h"
#include "linbox/field/archetype.h"
-#include "linbox/field/modular.h"
+#include "linbox/ring/modular.h"
#include "linbox/vector/vector-domain.h"
#include "linbox/blackbox/diagonal.h"
#include "linbox/blackbox/dif.h"
@@ -75,9 +75,9 @@ static bool testZeroApply (Field &F, VectorStream<Vector> &stream1, VectorStream
commentator().start ("Testing zero apply", "testZeroApply", stream1.m ());
bool ret = true;
- bool iter_passed = true;
+ // bool iter_passed = true;
- Vector d1, d2, v, w, zero;
+ Vector d1(F), d2(F), v(F), w(F), zero(F);
VectorDomain<Field> VD (F);
VectorWrapper::ensureDim (zero, stream1.dim ());
@@ -85,16 +85,15 @@ static bool testZeroApply (Field &F, VectorStream<Vector> &stream1, VectorStream
VectorWrapper::ensureDim (d2, stream1.dim ());
VectorWrapper::ensureDim (v, stream1.dim ());
VectorWrapper::ensureDim (w, stream2.dim ());
- //F.init (neg_one, -1);
while (stream1) {
commentator().startIteration ((unsigned)stream1.j ());
- iter_passed = true;
+ bool iter_passed = true;
stream1.next (d1);
//VD.mul (d2, d1, neg_one);
- Blackbox D1 (F, d1); // , D2 (F, d2);
+ Blackbox D1 (d1); // , D2 (d2);
Dif <Blackbox, Blackbox> A (D1, D1);
ostream &report = commentator().report (Commentator::LEVEL_IMPORTANT, INTERNAL_DESCRIPTION);
@@ -199,7 +198,7 @@ int main (int argc, char **argv)
END_OF_ARGUMENTS
};
- typedef Modular<int32_t> Field;
+ typedef Givaro::Modular<int32_t> Field;
parseArguments (argc, argv, args);
Field F (101);
@@ -209,7 +208,9 @@ int main (int argc, char **argv)
// Make sure some more detailed messages get printed
commentator().getMessageClass (INTERNAL_DESCRIPTION).setMaxDepth (2);
- RandomDenseStream<Field> stream1 (F, n, iterations1), stream2 (F, n, iterations2);
+ Field::RandIter gen(F);
+
+ RandomDenseStream<Field> stream1 (F, gen, n, (unsigned int)iterations1), stream2 (F, gen, n, (unsigned int)iterations2);
if (!testZeroApply (F, stream1, stream2)) pass = false;
@@ -217,11 +218,10 @@ int main (int argc, char **argv)
return pass ? 0 : -1;
}
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
// Local Variables:
// mode: C++
// tab-width: 8
// indent-tabs-mode: nil
// c-basic-offset: 8
// End:
-
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/tests/test-direct-sum.C b/tests/test-direct-sum.C
index 0eb4dfc..11bcc91 100644
--- a/tests/test-direct-sum.C
+++ b/tests/test-direct-sum.C
@@ -2,20 +2,20 @@
* Copyright (C) LinBox
* Written by David Saunders
*
- *
+ *
* ========LICENCE========
* This file is part of the library LinBox.
- *
+ *
* LinBox is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
- *
+ *
* This library 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
* Lesser General Public License for more details.
- *
+ *
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
@@ -34,10 +34,10 @@
#include <iostream>
#include <fstream>
-#include <vector>
+
#include "linbox/util/commentator.h"
-#include "linbox/field/modular.h"
+#include "linbox/ring/modular.h"
#include "linbox/blackbox/scalar-matrix.h"
#include "linbox/blackbox/direct-sum.h"
@@ -62,8 +62,8 @@ int main (int argc, char **argv)
END_OF_ARGUMENTS
};
- typedef Modular<uint32_t> Field;
- typedef vector<Field::Element> Vector;
+ typedef Givaro::Modular<uint32_t> Field;
+ // typedef vector<Field::Element> Vector;
parseArguments (argc, argv, args);
Field F (q);
@@ -74,14 +74,14 @@ int main (int argc, char **argv)
commentator().getMessageClass (INTERNAL_DESCRIPTION).setMaxDetailLevel (Commentator::LEVEL_UNIMPORTANT);
F.init(k, 5);
- ScalarMatrix<Field> B(F, 10, k);
+ ScalarMatrix<Field> B(F, 10, 10, k);
F.init(k, 2);
- ScalarMatrix<Field> C(F, 5, k);
+ ScalarMatrix<Field> C(F, 5, 5, k);
DirectSum<ScalarMatrix<Field>, ScalarMatrix<Field> > A(&B, &C);
- pass = pass && testBlackbox(A);
+ pass = pass && testBlackboxNoRW(A);
DirectSum<ScalarMatrix<Field>, ScalarMatrix<Field> > D(B, C);
- pass = pass && testBlackbox(D);
+ pass = pass && testBlackboxNoRW(D);
commentator().stop("DirectSum black box test suite");
return pass ? 0 : -1;
diff --git a/tests/test-dyadic-to-rational.C b/tests/test-dyadic-to-rational.C
index 873573e..525977c 100644
--- a/tests/test-dyadic-to-rational.C
+++ b/tests/test-dyadic-to-rational.C
@@ -31,9 +31,9 @@
using namespace LinBox;
-#include <vector>
+
#include <cmath>
-#include "linbox/field/PID-integer.h"
+#include "givaro/zring.h"
#include "linbox/util/timer.h"
#include "linbox/util/commentator.h"
@@ -45,7 +45,8 @@ by something over dxa and when the denominator bound (for k) is denBs.
Values of numerator i from -k-2 to k+2 are checked.
When dxa^2 <= denBs, 2 should be returned.
*/
- typedef PID_integer Ring; Ring Z;
+ typedef Givaro::ZRing<Integer> Ring;
+ Ring Z;
typedef Ring::Element Int;
//std::cout << "test1(k " << k << ", dxa " << dxa << ", denBs " << denBs << ")" << std::endl;
@@ -54,33 +55,33 @@ When dxa^2 <= denBs, 2 should be returned.
// approximate(i*k^2)/k for i = 0..k-1
size_t kp = k+2;
size_t kp2 = 2*kp;
- std::vector<Int> nx(kp2);
+ BlasVector<Ring> nx(Z,kp2);
for (size_t i = 0; i < kp2 ; ++i)
Z.init(nx[i],floor(((double(i)-double(kp))*(double)dxa)/(double)k + 0.5));
// |nx[i]/dxa - (i-kp)/k| <= 1/2dxa
- std::vector<Int> n(kp2);
+ BlasVector<Ring> n(Z,kp2);
Int d;
- bool pass = true;
+ // bool pass = true;
bool claim;
int ret = 2;
// check of individual reconstructions
- Int dx; Z.init(dx, dxa);
+ Int dx; Z.init(dx, uint64_t(dxa));
int c;
// individual reconstructions
for (size_t i = 0; i < kp2 ; ++i) {
- bool loopclaim = true;
+ // bool loopclaim = true;
//std::cout << nx[i] << " " << dx << " " << denB << std::endl;
c = dyadicToRational(Z, n[i], d, nx[i], dx, denB);
//std::cout << " c " << c << " n " << n[i] << " d " << d << " nx " << nx[i] << " dx " << dx << " denB " << denB << std::endl;
- loopclaim = ((c > 0) && (n[i]*k == ((int(i)-int(kp))*d)));
+ bool loopclaim = ((c > 0) && (n[i]*k == ((int(i)-int(kp))*d)));
if ( c == 2 ) loopclaim = loopclaim && d*denB < dx;
if (c < ret) ret = c;
if (! loopclaim) ret = 0;
//if (! claim) std::cout << "F " << pass << claim << ret << std::endl;
//if (! loopclaim)
//std::cout << "F2 " << loopclaim << " i " << i << " nx/dx " << nx[i] << "/" << dx << ", n/d " << n[i] << "/" << d << std::endl;
- pass = pass && loopclaim;
+ // pass = pass && loopclaim;
}
//std::cout << "result, pass " << pass << " ret " << ret << std::endl;
@@ -92,7 +93,7 @@ When dxa^2 <= denBs, 2 should be returned.
if (claim) {
for (size_t i = 0; i < k ; ++i) claim = claim && (n[i] == (int(i)-int(kp)));
}
- pass = pass && claim;
+ // pass = pass && claim;
if (!claim) {
commentator().report() << "first example fails" << std::endl;
commentator().report() << "data for first example" << std::endl;
@@ -107,7 +108,7 @@ When dxa^2 <= denBs, 2 should be returned.
if (c < ret) ret = c;
if (! claim) ret = 0;
- pass = pass && claim;
+ // pass = pass && claim;
//std::cout << "v " << pass << claim << ret << std::endl;
#endif
@@ -117,10 +118,11 @@ When dxa^2 <= denBs, 2 should be returned.
bool testDyadicToRational(size_t k = 10, bool benchmarking = false)
{
- typedef PID_integer Ring; Ring Z;
+ typedef Givaro::ZRing<Integer> Ring;
+ Ring Z;
typedef Ring::Element Int;
bool pass = true;
- bool claim = false;
+ int claim = 1 ; /* a bool produces warnings and looks weird when compared to 2 */
size_t pow2 = 1; // upperbound for k.
for (size_t i = k; i > 0; i >>= 1) pow2 *= 2;
@@ -141,15 +143,15 @@ bool testDyadicToRational(size_t k = 10, bool benchmarking = false)
#if 1
// special case 1
- Int B; Z.init(B, 1000000000);
+ Int B; Z.init(B, int64_t(1000000000));
Int B2; Z.init(B2); B2 = B*B;
Int denB = 4*B+294967296; // 2^32
Int d;
Int dxs = denB*denB; // 2^64
size_t k2 = 10;
- std::vector<Int> nx;
- std::vector<Int> n;
+ BlasVector<Ring> nx(Z);
+ BlasVector<Ring> n(Z);
nx.resize(k2);
n.resize(k2);
@@ -170,7 +172,7 @@ bool testDyadicToRational(size_t k = 10, bool benchmarking = false)
pass = pass && claim;
- std::vector<Int> ntrue(k2);
+ BlasVector<Ring> ntrue(Z,k2);
Int dentrue = 691617936;
ntrue[0] = -5*B-372642434;
ntrue[1] = 8*B+965263534;
@@ -224,7 +226,7 @@ bool testDyadicToRational(size_t k = 10, bool benchmarking = false)
claim = dyadicToRational(Z, n, d, nx, dxs, denB);
//std::cout << "d " << d << " dxs " << dxs << " denB " << denB << std::endl;
- pass = pass && (claim < 2);
+ pass = pass && (claim < 2) ;
if (claim == 2) commentator().report() << "third ratrecon in test falsely claims success" << std::endl;
if (claim == 1) commentator().report() << "third ratrecon in test (designed to fail) claims speculative success" << std::endl;
#endif
@@ -281,11 +283,10 @@ int main (int argc, char **argv)
}
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
// Local Variables:
// mode: C++
// tab-width: 8
// indent-tabs-mode: nil
// c-basic-offset: 8
// End:
-
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/tests/test-echelon-form.C b/tests/test-echelon-form.C
index e43c3b6..14c42df 100644
--- a/tests/test-echelon-form.C
+++ b/tests/test-echelon-form.C
@@ -1,7 +1,7 @@
/* Copyright (C) 2012 bds
* tests/test-echelon-form.C
*
- * adapted by bds from test-blas-domain Written by Pascal Giorgi <pascal.giorgi at ens-lyon.fr>
+ * Adapted by bds from test-blas-domain written by Pascal Giorgi
*
* ---------------------------------------------------------
*
@@ -36,21 +36,19 @@
*/
- // where is this used?
-//#define __MINP_CONSTRUCT
+#include "linbox/linbox-config.h"
+#include "test-common.h"
#include <iostream>
#include <string>
-#include <vector>
-//#include "linbox/linbox-config.h"
-#include "test-common.h"
-#include "linbox/field/modular.h"
+#include "linbox/ring/modular.h"
//#include "linbox/field/givaro.h"
-#include "linbox/matrix/blas-matrix.h"
+#include "linbox/matrix/dense-matrix.h"
#include "linbox/util/commentator.h"
-#include "linbox/algorithms/blas-domain.h"
+#include "linbox/matrix/matrix-domain.h"
#include "linbox/algorithms/echelon-form.h"
+#include "givaro/givranditer.h"
using namespace LinBox;
@@ -79,23 +77,22 @@ static bool testRank (const Field& F, size_t m, size_t n, int iterations = 1)
{
typedef typename Field::Element Element;
- typedef typename Field::RandIter RandIter;
//Commentator mycommentator;
mycommentator().getMessageClass (INTERNAL_DESCRIPTION).setMaxDepth (3);
mycommentator().getMessageClass (INTERNAL_DESCRIPTION).setMaxDetailLevel (Commentator::LEVEL_NORMAL);
- mycommentator().start (pretty("Testing rank"),"testRank",iterations);
+ mycommentator().start (pretty("Testing rank"),"testRank",(unsigned int)iterations);
- RandIter G(F);
- NonzeroRandIter<Field> Gn(F,G);
+ typename Field::RandIter G(F);
+ typename Field::NonZeroRandIter Gn(G);
Element tmp;
- unsigned int r;
bool ret = true;
BlasMatrixDomain<Field> BMD(F);
EchelonFormDomain<Field> EFD(F);
for (int k=0;k<iterations; ++k) {
+ unsigned int r;
mycommentator().progress(k);
BlasMatrix<Field> A(F,m,n),S(F,m,n), L(F,m,m);
@@ -124,22 +121,22 @@ static bool testRank (const Field& F, size_t m, size_t n, int iterations = 1)
// compute the rank of A
BlasMatrix<Field> E1(F,m,n), E2(F,m,n), E3(F,m,n), E4(F,m,n);
- unsigned int rank1= EFD.rowEchelon(E1, A);
+ unsigned int rank1= (unsigned int)EFD.rowEchelon(E1, A);
BMD.write(commentator().report(), E1) << " = rowEchelon(E1, A)" << std::endl;
- unsigned int rank2= EFD.rowReducedEchelon(E2, A);
+ unsigned int rank2=(unsigned int) EFD.rowReducedEchelon(E2, A);
BMD.write(commentator().report(), E2) << " = rowReducedEchelon(E2, A)" << std::endl;
- unsigned int rank3= EFD.columnEchelon(E3, A);
+ unsigned int rank3=(unsigned int) EFD.columnEchelon(E3, A);
BMD.write(commentator().report(), E3) << " = columnEchelon(E3, A)" << std::endl;
- unsigned int rank4= EFD.columnReducedEchelon(E4, A);
+ unsigned int rank4=(unsigned int) EFD.columnReducedEchelon(E4, A);
BMD.write(commentator().report(), E4) << " = columnReducedEchelon(E4, A)" << std::endl;
- unsigned int rank5= EFD.columnEchelon(A);
+ unsigned int rank5=(unsigned int) EFD.columnEchelon(A);
BMD.write(commentator().report(), A) << " = columnEchelon(A)" << std::endl;
- unsigned int rank6= EFD.columnReducedEchelon(E1);
+ unsigned int rank6=(unsigned int) EFD.columnReducedEchelon(E1);
BMD.write(commentator().report(), E1) << " = columnReducedEchelon(E1)" << std::endl;
commentator().report() << "Ranks " << rank1 << " " << rank2 << " " << rank3 << " " << rank4 << " " << rank5 << " " << rank6 << " should be " << r << std::endl;
@@ -163,21 +160,20 @@ static bool testLQUP (const Field& F, size_t m, size_t n, int iterations = 1)
typedef typename Field::Element Element;
typedef BlasMatrix<Field> Matrix;
typedef typename Field::RandIter RandIter;
+ typedef typename Field::NonZeroRandIter NonZeroRandIter;
//Commentator mycommentator;
mycommentator().getMessageClass (INTERNAL_DESCRIPTION).setMaxDepth (3);
mycommentator().getMessageClass (INTERNAL_DESCRIPTION).setMaxDetailLevel (Commentator::LEVEL_NORMAL);
- mycommentator().start (pretty("Testing LQUP factorization"),"testLQUP",iterations);
+ mycommentator().start (pretty("Testing LQUP factorization"),"testLQUP",(unsigned int)iterations);
RandIter G(F);
- NonzeroRandIter<Field> Gn(F,G);
- Element One,zero,tmp;
- F.init(One,1UL);
- F.init(zero,0UL);
+ NonZeroRandIter Gn(G);
bool ret = true;
MatrixDomain<Field> MD(F);
BlasMatrixDomain<Field> BMD(F);
+ Element tmp; F.init(tmp);
for (int k=0;k<iterations;++k) {
@@ -193,7 +189,7 @@ static bool testLQUP (const Field& F, size_t m, size_t n, int iterations = 1)
B.setEntry(i,j,G.random(tmp));
else
for (size_t i=0;i<m;++i)
- B.setEntry(i,j,zero);
+ B.setEntry(i,j,F.zero);
// Create C a random matrix of rank n/2
for (size_t i=0;i<m;++i)
if ( i % 2 )
@@ -201,7 +197,7 @@ static bool testLQUP (const Field& F, size_t m, size_t n, int iterations = 1)
C.setEntry(i,j,G.random(tmp));
else
for (size_t j=0;j<n;++j)
- C.setEntry(i,j,zero);
+ C.setEntry(i,j,F.zero);
// A = B*C
BMD.mul(A, B, C);
@@ -211,8 +207,8 @@ static bool testLQUP (const Field& F, size_t m, size_t n, int iterations = 1)
BlasPermutation<size_t> P(A.coldim()),Q(A.rowdim());
LQUPMatrix<Field> X(A,P,Q);
- TriangularBlasMatrix<Field> L(F,m,m,LinBoxTag::Lower,LinBoxTag::Unit);
- TriangularBlasMatrix<Field> U(F,m,n,LinBoxTag::Upper,LinBoxTag::NonUnit);
+ TriangularBlasMatrix<Field> L(F,m,m,Tag::Shape::Lower,Tag::Diag::Unit);
+ TriangularBlasMatrix<Field> U(F,m,n,Tag::Shape::Upper,Tag::Diag::NonUnit);
X.getL(L);
X.getU(U);
P=X.getP();
@@ -237,8 +233,8 @@ static bool testLQUP (const Field& F, size_t m, size_t n, int iterations = 1)
LQUPMatrix<Field> Y(A,P,Q);
- TriangularBlasMatrix<Field> L2(F,m,m,LinBoxTag::Lower,LinBoxTag::Unit);
- TriangularBlasMatrix<Field> U2(F,m,n,LinBoxTag::Upper,LinBoxTag::NonUnit);
+ TriangularBlasMatrix<Field> L2(F,m,m,Tag::Shape::Lower,Tag::Diag::Unit);
+ TriangularBlasMatrix<Field> U2(F,m,n,Tag::Shape::Upper,Tag::Diag::NonUnit);
Y.getL(L2);
Y.getU(U2);
P=Y.getP();
@@ -263,10 +259,10 @@ static bool testLQUP (const Field& F, size_t m, size_t n, int iterations = 1)
// returns true if ok, false if not.
template<class Field>
-int launch_tests(Field & F, int m, int n, int iterations = 1)
+int launch_tests(Field & F, size_t m, size_t n, int iterations = 1)
{
bool pass = true ;
- int mn = (m < n) ? n : m;
+ size_t mn = (m < n) ? n : m;
if (!testRank (F, mn, mn, iterations)) pass=false;
if (m != n) {
if (!testRank (F, n, m, iterations)) pass=false;
@@ -295,9 +291,9 @@ int main(int argc, char **argv)
parseArguments (argc, argv, args);
- typedef Modular<double> Field;
- //typedef Modular<int> Field;
- //typedef Modular<float> Field;
+ typedef Givaro::Modular<double> Field;
+ //typedef Givaro::Modular<int> Field;
+ //typedef Givaro::Modular<float> Field;
Field F1 (q);
bool pass = true;
@@ -310,7 +306,7 @@ int main(int argc, char **argv)
commentator().start("BlasMatrixDomain test suite", "BlasMatrixDomain");
- pass &= launch_tests(F1,(int)m, (int)n,iterations);
+ pass &= launch_tests(F1,m, n, iterations);
commentator().stop(MSG_STATUS (pass), (const char *) 0,"BlasMatrixDomain test suite");
return pass ? 0 : -1;
}
diff --git a/tests/test-ffpack.C b/tests/test-ffpack.C
index b04e46d..2f60a5e 100644
--- a/tests/test-ffpack.C
+++ b/tests/test-ffpack.C
@@ -34,13 +34,13 @@
#include "linbox/linbox-config.h"
#include <iostream>
-#include <vector>
+
#include "linbox/integer.h"
#include "linbox/matrix/matrix-domain.h"
-#include "linbox/field/givaro.h"
-#include "linbox/field/modular.h"
-#include "linbox/field/modular-balanced.h"
+//#include "linbox/field/givaro.h"
+#include "linbox/ring/modular.h"
+#include <givaro/modular-balanced.h>
#include "fflas-ffpack/ffpack/ffpack.h"
#include "linbox/util/commentator.h"
@@ -74,40 +74,38 @@ static bool testRank (const Field& F,size_t n, int iterations)
typedef typename Field::Element Element;
typedef typename Field::RandIter RandIter;
+ typedef typename Field::NonZeroRandIter NonZeroRandIter;
//Commentator commentator;
commentator().getMessageClass (INTERNAL_DESCRIPTION).setMaxDepth (3);
commentator().getMessageClass (INTERNAL_DESCRIPTION).setMaxDetailLevel (Commentator::LEVEL_NORMAL);
- commentator().start (pretty("Testing rank"),"testRank",iterations);
+ commentator().start (pretty("Testing rank"),"testRank",(unsigned int)iterations);
- Element one, zero;
- F.init( one, 1UL);
- F.init( zero, 0UL);
RandIter G(F);
- NonzeroRandIter<Field> Gn(F,G);
+ NonZeroRandIter Gn(G);
- unsigned int r;
bool ret = true;
for (int k=0;k<iterations; ++k) {
+ unsigned int r;
commentator().progress(k);
Element * A = new Element[n*n];
Element * S = new Element[n*n];
Element * L = new Element[n*n];
- r = (unsigned)( rand() % n );
+ r = (unsigned)( (size_t)rand() % n );
// create S as an upper triangular matrix with r nonzero rows
for (size_t i=0;i<r;++i){
for (size_t j=0;j<i;++j)
- F.assign(*(S+j+i*n),zero);
+ F.assign(*(S+j+i*n),F.zero);
Gn.random(*(S+i*n+i));
for (size_t j=i+1;j<n;++j)
G.random(*(S+i*n+j));
}
for (size_t i=r;i<n;++i){
for (size_t j=0;j<n;++j)
- F.assign(*(S+j+i*n),zero);
+ F.assign(*(S+j+i*n),F.zero);
}
// create L as a lower triangular matrix with nonzero elements on the diagonal
for (size_t i=0;i<n;++i){
@@ -115,13 +113,13 @@ static bool testRank (const Field& F,size_t n, int iterations)
G.random(*(L+i*n+j));
Gn.random(*(L+i*n+i));
for (size_t j=i+1;j<n;++j)
- F.assign(*(L+j+i*n),zero);
+ F.assign(*(L+j+i*n),F.zero);
}
// compute A=LS
FFLAS::fgemm( F, FFLAS::FflasNoTrans, FFLAS::FflasNoTrans, n, n, n,
- one, L, n, S, n, zero, A, n );
+ F.one, L, n, S, n, F.zero, A, n );
delete[] L;
delete[] S;
@@ -137,87 +135,6 @@ static bool testRank (const Field& F,size_t n, int iterations)
return ret;
}
-/*
- * Testing the rank of dense matrices using TURBO algorithm
- * construct a n*n matrices of rank r and compute the rank
- */
-template <class Field>
-static bool testTURBO (const Field& F,size_t n, int iterations)
-{
-
- typedef typename Field::Element Element;
- typedef typename Field::RandIter RandIter;
-
- //Commentator commentator;
- commentator().getMessageClass (INTERNAL_DESCRIPTION).setMaxDepth (3);
- commentator().getMessageClass (INTERNAL_DESCRIPTION).setMaxDetailLevel (Commentator::LEVEL_NORMAL);
- commentator().start (pretty("Testing TURBO"),"testTURBO",iterations);
-
- Element one, zero;
- F.init( one, 1UL);
- F.init( zero, 0UL);
- RandIter G(F);
- NonzeroRandIter<Field> Gn(F,G);
-
- unsigned int r;
- bool ret = true;
-
- for (int k=0;k<iterations; ++k) {
-
- commentator().progress(k);
- Element * A = new Element[n*n];
- Element * S = new Element[n*n];
- Element * L = new Element[n*n];
-
- r = (unsigned)(rand() % n);
- // create S as an upper triangular matrix with r nonzero rows
- for (size_t i=0;i<r;++i){
- for (size_t j=0;j<i;++j)
- F.assign(*(S+j+i*n),zero);
- Gn.random(*(S+i*n+i));
- for (size_t j=i+1;j<n;++j)
- G.random(*(S+i*n+j));
- }
- for (size_t i=r; i<n; ++i)
- for (size_t j=0;j<n;++j)
- F.assign( *(S+i*n+j),zero);
- // create L as a lower triangular matrix with nonzero elements on the diagonal
- for (size_t i=0;i<n;++i){
- for (size_t j=0;j<i;++j)
- G.random(*(L+i*n+j));
- Gn.random(*(L+i*n+i));
- for (size_t j=i+1;j<n;++j)
- F.assign(*(L+j+i*n),zero);
- }
-
-
- // compute A=LS
- FFLAS::fgemm( F, FFLAS::FflasNoTrans, FFLAS::FflasNoTrans, n, n, n,
- one, L, n, S, n, zero, A, n );
-
- delete[] L;
- delete[] S;
- // compute the rank of A
- size_t * P = new size_t[n];
- size_t * Q = new size_t[n];
- unsigned int rank= (unsigned)FFPACK::TURBO( F, n, n,
- A,n, P, Q, 100);
-// A, n, A+no2,n,
-// A+no2*n, n, A+no2*(n+1), n );
-
- delete[] P;
- delete[] Q;
- delete[] A;
-
- if (rank!=r)
- ret=false;
- }
-
- commentator().stop(MSG_STATUS (ret), (const char *) 0, "testTURBO");
-
- return ret;
-}
-
/*
* Testing the determinant of dense matrices using BlasDomain
@@ -229,17 +146,16 @@ static bool testDet (const Field& F,size_t n, int iterations)
typedef typename Field::Element Element;
typedef typename Field::RandIter RandIter;
+ typedef typename Field::NonZeroRandIter NonZeroRandIter;
//Commentator commentator;
commentator().getMessageClass (INTERNAL_DESCRIPTION).setMaxDepth (3);
commentator().getMessageClass (INTERNAL_DESCRIPTION).setMaxDetailLevel (Commentator::LEVEL_NORMAL);
- commentator().start (pretty("Testing determinant"),"testDet",iterations);
+ commentator().start (pretty("Testing determinant"),"testDet",(unsigned int)iterations);
+ Element d;
RandIter G(F);
- NonzeroRandIter<Field> Gn(F,G);
- Element one,zero,d;
- F.init(one,1UL);
- F.init(zero,0UL);
+ NonZeroRandIter Gn(G);
bool ret = true;
@@ -259,8 +175,8 @@ static bool testDet (const Field& F,size_t n, int iterations)
// with diagonal's element equal to 1 except the first entry wich equals to d
for (size_t i=0;i<n;++i){
for (size_t j=0;j<i;++j)
- F.assign(*(S+j+i*n),zero);
- F.assign(*(S+i*n+i), one);
+ F.assign(*(S+j+i*n),F.zero);
+ F.assign(*(S+i*n+i), F.one);
for (size_t j=i+1;j<n;++j)
G.random(*(S+i*n+j));
}
@@ -270,15 +186,15 @@ static bool testDet (const Field& F,size_t n, int iterations)
for (size_t i=0;i<n;++i){
for (size_t j=0;j<i;++j)
G.random(*(L+i*n+j));
- F.assign(*(L+i*n+i),one);
+ F.assign(*(L+i*n+i),F.one);
for (size_t j=i+1;j<n;++j)
- F.assign(*(L+j+i*n),zero);
+ F.assign(*(L+j+i*n),F.zero);
}
// compute A=LS
FFLAS::fgemm( F, FFLAS::FflasNoTrans, FFLAS::FflasNoTrans, n, n, n,
- one, L, n, S, n, zero, A, n );
+ F.one, L, n, S, n, F.zero, A, n );
delete[] L;
delete[] S;
@@ -306,17 +222,15 @@ static bool testLUdivine (const Field& F, size_t m, size_t n, int iterations)
typedef typename Field::Element Element;
typedef typename Field::RandIter RandIter;
+ typedef typename Field::NonZeroRandIter NonZeroRandIter;
//Commentator commentator;
commentator().getMessageClass (INTERNAL_DESCRIPTION).setMaxDepth (3);
commentator().getMessageClass (INTERNAL_DESCRIPTION).setMaxDetailLevel (Commentator::LEVEL_NORMAL);
- commentator().start (pretty("Testing LQUP factorization"),"testLQUP",iterations);
+ commentator().start (pretty("Testing LQUP factorization"),"testLQUP",(unsigned int)iterations);
RandIter G(F);
- NonzeroRandIter<Field> Gn(F,G);
- Element one,zero;
- F.init(one,1UL);
- F.init(zero,0UL);
+ NonZeroRandIter Gn(G);
bool ret = true;
@@ -334,28 +248,28 @@ static bool testLUdivine (const Field& F, size_t m, size_t n, int iterations)
for (size_t j=0;j<m;++j)
if ( j % 2 ){
for (size_t i=0;i<j;++i)
- F.assign (*(B+i*m+j),zero);
+ F.assign (*(B+i*m+j),F.zero);
for (size_t i=j;i<m;++i)
Gn.random (*(B+i*m+j));
}
else
for (size_t i=0;i<m;++i)
- F.assign (*(B+i*m+j), zero);
+ F.assign (*(B+i*m+j), F.zero);
// Create C a random matrix of rank n/2
for (size_t i = 0; i < m; ++i)
if ( i % 2 ){
for (size_t j = 0; j < i; ++j)
- F.assign (*(C+i*n+j),zero);
+ F.assign (*(C+i*n+j),F.zero);
for (size_t j = i; j < n; ++j)
Gn.random (*(C+i*n+j));
}
else
for (size_t j = 0; j < n; ++j)
- F.assign (*(C+i*n+j),zero);
+ F.assign (*(C+i*n+j),F.zero);
// A = B*C
FFLAS::fgemm( F, FFLAS::FflasNoTrans, FFLAS::FflasNoTrans, m, n, m,
- one, B, m, C, n, zero, A, n );
+ F.one, B, m, C, n, F.zero, A, n );
delete[] B;
delete[] C;
@@ -368,7 +282,8 @@ static bool testLUdivine (const Field& F, size_t m, size_t n, int iterations)
// write_field (F, cerr<<"A="<<endl, A, m, n, n);
size_t r = FFPACK::LUdivine( F, FFLAS::FflasNonUnit, FFLAS::FflasNoTrans,
- m, n, A, n, P, Q, FFPACK::FfpackLQUP);
+ m, n, A, n, P, Q);
+ //m, n, A, n, P, Q, FFPACK::FfpackLQUP);
// write_field (F, cerr<<"LQUP(A)="<<endl, A, m, n, n);
Element * L = new Element[m*m];
@@ -379,19 +294,19 @@ static bool testLUdivine (const Field& F, size_t m, size_t n, int iterations)
if (j<n)
F.assign (*(L+i*m+j), *(A+i*n+j) );
else
- F.assign (*(L+i*m+j), zero );
+ F.assign (*(L+i*m+j), F.zero );
for (size_t j = i; j < m; ++j)
- F.assign (*(L+i*m+j), zero );
+ F.assign (*(L+i*m+j), F.zero );
}
FFPACK::applyP( F, FFLAS::FflasRight, FFLAS::FflasNoTrans,
m, 0,(int) r, L, m, Q);
for (size_t i=0; i<m; ++i)
- F.assign( *(L+i*m+i), one);
+ F.assign( *(L+i*m+i), F.one);
for (size_t i=0; i<m; ++i){
for (size_t j=0; j<i; ++j)
if (j<n)
- F.assign( *(U+i*n+j), zero );
+ F.assign( *(U+i*n+j), F.zero );
for (size_t j=i; j<n; ++j)
F.assign( *(U+i*n+j), *(A+i*n+j) );
}
@@ -410,7 +325,7 @@ static bool testLUdivine (const Field& F, size_t m, size_t n, int iterations)
delete[] Q;
// A = L*C
FFLAS::fgemm( F, FFLAS::FflasNoTrans, FFLAS::FflasNoTrans, m, n, m,
- one, L, m, U, n, zero, A, n );
+ F.one, L, m, U, n, F.zero, A, n );
delete[] L;
delete[] U;
@@ -441,18 +356,15 @@ static bool testMinPoly (const Field& F, size_t n, int iterations)
{
typedef typename Field::Element Element;
typedef typename Field::RandIter RandIter;
+ typedef typename Field::NonZeroRandIter NonZeroRandIter;
typedef vector<Element> Polynomial;
//Commentator commentator;
commentator().getMessageClass (INTERNAL_DESCRIPTION).setMaxDepth (3);
commentator().getMessageClass (INTERNAL_DESCRIPTION).setMaxDetailLevel (Commentator::LEVEL_NORMAL);
- commentator().start (pretty("Testing minpoly"),"testMinPoly",iterations);
- Element tmp, one, zero,mOne;
+ commentator().start (pretty("Testing minpoly"),"testMinPoly",(unsigned int)iterations);
+ Element tmp ;
RandIter G(F);
- NonzeroRandIter<Field> Gn(F,G);
- F.init(one, 1UL);
- F.init(zero, 0UL);
- F.neg(mOne, one);
- //F.neg( mOne, one);
+ NonZeroRandIter Gn(G);
bool ret = true;
for (int k=0;k<iterations;++k) {
@@ -467,17 +379,17 @@ static bool testMinPoly (const Field& F, size_t n, int iterations)
// Test MinPoly(In) = X-1
for (size_t i=0;i<n;++i){
for (size_t j=0;j<n;++j)
- F.assign(*(A+j+i*n),zero);
- F.assign(*(A+i*(n+1)),one);
+ F.assign(*(A+j+i*n),F.zero);
+ F.assign(*(A+i*(n+1)),F.one);
}
- FFPACK::MinPoly( F, P, n, A, n, X, n, Perm );
+ FFPACK::MinPoly( F, P, n, A, n, X, n, Perm );
if ( P.size() !=2 )
ret = false;
- if ( !F.areEqual(P[0], mOne) )
+ if ( !F.areEqual(P[0], F.mOne) )
ret = false;
- if ( !F.areEqual(P[1], one) )
+ if ( !F.areEqual(P[1], F.one) )
ret = false;
if(!ret) cerr<<"MinP(In)!=X-1"<<endl;
// Test MinPoly(a*In) = X-a
@@ -485,7 +397,7 @@ static bool testMinPoly (const Field& F, size_t n, int iterations)
for (size_t i=0;i<n;++i){
for (size_t j=0;j<n;++j)
- F.assign(*(A+j+i*n),zero);
+ F.assign(*(A+j+i*n),F.zero);
F.assign(*(A+i*(n+1)),tmp);
}
@@ -502,7 +414,7 @@ static bool testMinPoly (const Field& F, size_t n, int iterations)
cerr<<"P[0]="<<P[0]<<"tmp="<<tmp<<endl;
ret = false;
}
- if ( !F.areEqual(P[1], one) ){
+ if ( !F.areEqual(P[1], F.one) ){
cerr<<"P[1]="<<P[1]<<endl;
ret = false;
@@ -512,11 +424,11 @@ static bool testMinPoly (const Field& F, size_t n, int iterations)
#if 1 /* ??? */
for (size_t i=0;i<n-1;++i){
for (size_t j=0; j<n; ++j)
- F.assign(*(A+i*n+j),zero);
- F.assign(*(A+i*n+i+1),one);
+ F.assign(*(A+i*n+j),F.zero);
+ F.assign(*(A+i*n+i+1),F.one);
}
for (size_t j=0;j<n;++j)
- F.assign(*(A+(n-1)*n+j),zero);
+ F.assign(*(A+(n-1)*n+j),F.zero);
for (size_t i=0; i<n ;++i)
Perm[i]=0;
@@ -525,9 +437,9 @@ static bool testMinPoly (const Field& F, size_t n, int iterations)
if ( P.size() !=n+1 )
ret = false;
for (size_t i=0; i<n;++i)
- if ( !F.areEqual(P[i], zero) )
+ if ( !F.areEqual(P[i], F.zero) )
ret = false;
- if ( !F.areEqual(P[n], one) )
+ if ( !F.areEqual(P[n], F.one) )
ret = false;
if(!ret) cerr<<"MinP(J)!=X^n"<<endl;
#endif
@@ -547,17 +459,15 @@ static bool testCharPoly (const Field& F, size_t n, int iterations)
{
typedef typename Field::Element Element;
typedef typename Field::RandIter RandIter;
+ typedef typename Field::NonZeroRandIter NonZeroRandIter;
typedef vector<Element> Polynomial;
//Commentator commentator;
commentator().getMessageClass (INTERNAL_DESCRIPTION).setMaxDepth (3);
commentator().getMessageClass (INTERNAL_DESCRIPTION).setMaxDetailLevel (Commentator::LEVEL_NORMAL);
- commentator().start (pretty("Testing charpoly"),"testCharPoly",iterations);
- Element tmp, one, zero,mOne;
+ commentator().start (pretty("Testing charpoly"),"testCharPoly",(unsigned int)iterations);
+ Element tmp;
RandIter G(F);
- NonzeroRandIter<Field> Gn(F,G);
- F.init(one, 1UL);
- F.init(zero, 0UL);
- F.neg(mOne, one);
+ NonZeroRandIter Gn(G);
bool ret = true;
for (int k=0;k<iterations;++k) {
@@ -570,10 +480,10 @@ static bool testCharPoly (const Field& F, size_t n, int iterations)
// Test CharPoly(In) = (X-1)^n
for (size_t i=0;i<n;++i){
for (size_t j=0;j<i;++j)
- F.assign(*(A+i*n+j),zero);
- F.assign(*(A+i*(n+1)),one);
+ F.assign(*(A+i*n+j),F.zero);
+ F.assign(*(A+i*(n+1)),F.one);
for (size_t j=i+1;j<n;++j)
- F.assign(*(A+i*n+j),zero);
+ F.assign(*(A+i*n+j),F.zero);
}
P.clear();
@@ -585,14 +495,14 @@ static bool testCharPoly (const Field& F, size_t n, int iterations)
if ( P_it->size() !=2 ){
ret = false;
}
- if ( !F.areEqual(P_it->operator[](0), mOne) ){
+ if ( !F.areEqual(P_it->operator[](0), F.mOne) ){
ret = false;
}
- if ( !F.areEqual(P_it->operator[](1), one) ){
+ if ( !F.areEqual(P_it->operator[](1), F.one) ){
ret = false;
}
- P_it++;
+ ++P_it;
}
// Test CharPoly(a*In) = X-a
@@ -612,9 +522,9 @@ static bool testCharPoly (const Field& F, size_t n, int iterations)
ret = false;
if ( !F.areEqual(P_it->operator[](0), tmp) )
ret = false;
- if ( !F.areEqual(P_it->operator[](1), one) )
+ if ( !F.areEqual(P_it->operator[](1), F.one) )
ret = false;
- P_it++;
+ ++P_it;
}
delete[] A;
}
@@ -630,25 +540,23 @@ static bool testInv (const Field& F,size_t n, int iterations)
typedef typename Field::Element Element;
typedef typename Field::RandIter RandIter;
+ typedef typename Field::NonZeroRandIter NonZeroRandIter;
//Commentator commentator;
commentator().getMessageClass (INTERNAL_DESCRIPTION).setMaxDepth (3);
commentator().getMessageClass (INTERNAL_DESCRIPTION).setMaxDetailLevel (Commentator::LEVEL_NORMAL);
- commentator().start (pretty("Testing inverse"),"testInv",iterations);
+ commentator().start (pretty("Testing inverse"),"testInv",(unsigned int)iterations);
RandIter G(F);
- NonzeroRandIter<Field> Gn(F,G);
- Element zero,one;
- F.init(one,1UL);
- F.init(zero,0UL);
+ NonZeroRandIter Gn(G);
bool ret = true;
Element * Id = new Element[n*n];
for (size_t i=0;i<n;++i){
for (size_t j=0;j<n;++j)
- F.assign(*(Id+j+i*n),zero);
- F.assign( *(Id+i*(n+1)),one);
+ F.assign(*(Id+j+i*n),F.zero);
+ F.assign( *(Id+i*(n+1)),F.one);
}
for (int k=0;k<iterations;++k) {
@@ -665,7 +573,7 @@ static bool testInv (const Field& F,size_t n, int iterations)
// with nonzero random diagonal's element
for (size_t i=0;i<n;++i){
for (size_t j=0;j<i;++j)
- F.assign(*(S+i*n+j),zero);
+ F.assign(*(S+i*n+j),F.zero);
Gn.random(*(S+i*(n+1)));
for (size_t j=i+1;j<n;++j)
G.random(*(S+i*n+j));
@@ -676,16 +584,16 @@ static bool testInv (const Field& F,size_t n, int iterations)
for (size_t i=0;i<n;++i){
for (size_t j=0;j<i;++j)
G.random(*(L+i*n+j));
- F.assign(*(L+i*(n+1)),one);
+ F.assign(*(L+i*(n+1)),F.one);
for (size_t j=i+1;j<n;++j)
- F.assign(*(L+i*n+j),zero);
+ F.assign(*(L+i*n+j),F.zero);
}
// compute A=LS
FFLAS::fgemm( F, FFLAS::FflasNoTrans, FFLAS::FflasNoTrans, n, n, n,
- one, L, n, S, n, zero, A, n );
+ F.one, L, n, S, n, F.zero, A, n );
Element * Ab = new Element[n*n];
Element * invA = new Element[n*n];
@@ -698,10 +606,10 @@ static bool testInv (const Field& F,size_t n, int iterations)
// compute Ainv*A and A*Ainv
FFLAS::fgemm( F, FFLAS::FflasNoTrans, FFLAS::FflasNoTrans, n, n, n,
- one, Ab, n, invA, n, zero, L, n );
+ F.one, Ab, n, invA, n, F.zero, L, n );
FFLAS::fgemm( F, FFLAS::FflasNoTrans, FFLAS::FflasNoTrans, n, n, n,
- one, invA, n, Ab, n, zero, S, n );
+ F.one, invA, n, Ab, n, F.zero, S, n );
for (size_t i=0;i<n*n;++i)
if ( !F.areEqual(*(L+i),*(Id+i)) || !F.areEqual(*(S+i),*(Id+i)) )
@@ -734,16 +642,15 @@ static bool testapplyP (const Field& F,size_t n, int iterations)
//Commentator commentator;
commentator().getMessageClass (INTERNAL_DESCRIPTION).setMaxDepth (3);
commentator().getMessageClass (INTERNAL_DESCRIPTION).setMaxDetailLevel (Commentator::LEVEL_NORMAL);
- commentator().start (pretty("Testing applyP"),"testapplyP",iterations);
+ commentator().start (pretty("Testing applyP"),"testapplyP",(unsigned int)iterations);
RandIter G(F);
- Element zero,one,tmp,tmp2;
- F.init(one,1UL);
- F.init(zero,0UL);
+ Element tmp;
bool ret = true;
- Field Z2(2);
- RandIter G2(Z2);
+ Givaro::Modular<double> Z2(2);
+ typename Givaro::Modular<double>::RandIter G2(Z2);
+ Givaro::Modular<double>::Element tmp2;
for (int k=0;k<iterations;++k) {
@@ -823,9 +730,9 @@ int main(int argc, char** argv)
commentator().start("ffpack test suite", "ffpack");
- /* Modular Double */
+ /* Givaro::Modular Double */
{
- typedef Modular<double> Field;
+ typedef Givaro::Modular<double> Field;
Field F (q);
F.write(report << "Field : " ) << std::endl;
@@ -837,11 +744,10 @@ int main(int argc, char** argv)
if (!testLUdivine (F, m,n, iterations)) locpass = false;
if (!testRank (F, n, iterations)) locpass = false;
if (!testDet (F, n, iterations)) locpass = false;
- if (!testTURBO (F, n, iterations)) locpass = false;
if (!testapplyP (F, n, iterations)) locpass = false;
if (!testInv (F, n, iterations)) locpass = false;
- if (!testMinPoly (F,n,iterations)) locpass = false;
- if (!testCharPoly (F,n,iterations)) locpass = false;
+ if (!testMinPoly (F,n, iterations)) locpass = false;
+ if (!testCharPoly (F,n, iterations)) locpass = false;
(!locpass)?(report << "FAIL" << std::endl):(report << "OK"<<std::endl);
@@ -849,9 +755,9 @@ int main(int argc, char** argv)
}
#ifdef _LB_FULL_TEST
- /* Modular Float */
+ /* Givaro::Modular Float */
{
- typedef Modular<float> Field;
+ typedef Givaro::Modular<float> Field;
Field F (q);
F.write(report << "Field : " ) << std::endl;
@@ -863,19 +769,18 @@ int main(int argc, char** argv)
if (!testLUdivine (F, m,n, iterations)) locpass = false;
if (!testRank (F, n, iterations)) locpass = false;
if (!testDet (F, n, iterations)) locpass = false;
- if (!testTURBO (F, n, iterations)) locpass = false;
if (!testapplyP (F, n, iterations)) locpass = false;
if (!testInv (F, n, iterations)) locpass = false;
- if (!testMinPoly (F,n,iterations)) locpass = false;
- if (!testCharPoly (F,n,iterations)) locpass = false;
+ if (!testMinPoly (F,n, iterations)) locpass = false;
+ if (!testCharPoly (F,n, iterations)) locpass = false;
(!locpass)?(report << "FAIL" << std::endl):(report << "OK"<<std::endl);
pass &= locpass ;
}
- /* Modular Balanced Double */
+ /* Givaro::Modular Balanced Double */
{
- typedef LinBox::ModularBalanced<double> Field;
+ typedef Givaro::ModularBalanced<double> Field;
Field F (q);
F.write(report << "Field : " ) << std::endl;
@@ -887,19 +792,18 @@ int main(int argc, char** argv)
if (!testLUdivine (F, m,n, iterations)) locpass = false;
if (!testRank (F, n, iterations)) locpass = false;
if (!testDet (F, n, iterations)) locpass = false;
- if (!testTURBO (F, n, iterations)) locpass = false;
if (!testapplyP (F, n, iterations)) locpass = false;
if (!testInv (F, n, iterations)) locpass = false;
- if (!testMinPoly (F,n,iterations)) locpass = false;
- if (!testCharPoly (F,n,iterations)) locpass = false;
+ if (!testMinPoly (F,n, iterations)) locpass = false;
+ if (!testCharPoly (F,n, iterations)) locpass = false;
(!locpass)?(report << "FAIL" << std::endl):(report << "OK"<<std::endl);
pass &= locpass ;
}
- /* Modular Balanced Float */
+ /* Givaro::Modular Balanced Float */
{
- typedef ModularBalanced<float> Field;
+ typedef Givaro::ModularBalanced<float> Field;
Field F (q);
F.write(report << "Field : " ) << std::endl;
@@ -911,19 +815,17 @@ int main(int argc, char** argv)
if (!testLUdivine (F, m,n, iterations)) locpass = false;
if (!testRank (F, n, iterations)) locpass = false;
if (!testDet (F, n, iterations)) locpass = false;
- if (!testTURBO (F, n, iterations)) locpass = false;
if (!testapplyP (F, n, iterations)) locpass = false;
if (!testInv (F, n, iterations)) locpass = false;
- if (!testMinPoly (F,n,iterations)) locpass = false;
- if (!testCharPoly (F,n,iterations)) locpass = false;
+ if (!testMinPoly (F,n, iterations)) locpass = false;
+ if (!testCharPoly (F,n, iterations)) locpass = false;
(!locpass)?(report << "FAIL" << std::endl):(report << "OK"<<std::endl);
pass &= locpass ;
}
-#pragma message "#warning some tests don't compile or fail"
- /* Modular int32_t */
+ /* Givaro::Modular int32_t */
{
- typedef Modular<int32_t> Field;
+ typedef Givaro::Modular<int32_t> Field;
Field F (q);
F.write(report << "Field : " ) << std::endl;
@@ -935,21 +837,19 @@ int main(int argc, char** argv)
if (!testLUdivine (F, m,n, iterations)) locpass = false;
if (!testRank (F, n, iterations)) locpass = false;
if (!testDet (F, n, iterations)) locpass = false;
- if (!testTURBO (F, n, iterations)) locpass = false;
if (!testapplyP (F, n, iterations)) locpass = false;
if (!testInv (F, n, iterations)) locpass = false;
- if (!testMinPoly (F,n,iterations)) locpass = false;
- if (!testCharPoly (F,n,iterations)) locpass = false;
+ if (!testMinPoly (F,n, iterations)) locpass = false;
+ if (!testCharPoly (F,n, iterations)) locpass = false;
(!locpass)?(report << "FAIL" << std::endl):(report << "OK"<<std::endl);
pass &= locpass ;
}
-#if 0 // fails
- /* Modular Balanced int32_t */
+ /* Givaro::Modular Balanced int32_t */
{
- typedef ModularBalanced<int32_t > Field ;
+ typedef Givaro::ModularBalanced<int32_t > Field ;
Field F (q);
F.write(report << "Field : " ) << std::endl;
@@ -961,19 +861,17 @@ int main(int argc, char** argv)
if (!testLUdivine (F, m,n, iterations)) locpass = false;
if (!testRank (F, n, iterations)) locpass = false;
if (!testDet (F, n, iterations)) locpass = false;
- if (!testTURBO (F, n, iterations)) locpass = false;
if (!testapplyP (F, n, iterations)) locpass = false;
if (!testInv (F, n, iterations)) locpass = false;
- if (!testMinPoly (F,n,iterations)) locpass = false;
- if (!testCharPoly (F,n,iterations)) locpass = false;
+ if (!testMinPoly (F,n, iterations)) locpass = false;
+ if (!testCharPoly (F,n, iterations)) locpass = false;
(!locpass)?(report << "FAIL" << std::endl):(report << "OK"<<std::endl);
pass &= locpass ;
}
-#endif
- /* Modular uint32_t */
+ /* Givaro::Modular uint32_t */
{
- typedef Modular<uint32_t> Field;
+ typedef Givaro::Modular<uint32_t> Field;
Field F (q);
F.write(report << "Field : " ) << std::endl;
@@ -985,18 +883,18 @@ int main(int argc, char** argv)
if (!testLUdivine (F, m,n, iterations)) locpass = false;
if (!testRank (F, n, iterations)) locpass = false;
if (!testDet (F, n, iterations)) locpass = false;
- if (!testTURBO (F, n, iterations)) locpass = false;
if (!testapplyP (F, n, iterations)) locpass = false;
if (!testInv (F, n, iterations)) locpass = false;
- if (!testMinPoly (F,n,iterations)) locpass = false;
- if (!testCharPoly (F,n,iterations)) locpass = false;
+ if (!testMinPoly (F,n, iterations)) locpass = false;
+ if (!testCharPoly (F,n, iterations)) locpass = false;
(!locpass)?(report << "FAIL" << std::endl):(report << "OK"<<std::endl);
pass &= locpass ;
}
- /* GivaroZpz int32_t */
+ /* Givaro::Modular int32_t */
+#if 0
{
- typedef GivaroZpz<Givaro::Std32> Field;
+ typedef Givaro::Modular<int32_t> Field;
Field F (q);
F.write(report << "Field : " ) << std::endl;
@@ -1008,15 +906,15 @@ int main(int argc, char** argv)
if (!testLUdivine (F, m,n, iterations)) locpass = false;
if (!testRank (F, n, iterations)) locpass = false;
if (!testDet (F, n, iterations)) locpass = false;
- if (!testTURBO (F, n, iterations)) locpass = false;
if (!testapplyP (F, n, iterations)) locpass = false;
if (!testInv (F, n, iterations)) locpass = false;
- if (!testMinPoly (F,n,iterations)) locpass = false;
- if (!testCharPoly (F,n,iterations)) locpass = false;
+ if (!testMinPoly (F,n, iterations)) locpass = false;
+ if (!testCharPoly (F,n, iterations)) locpass = false;
(!locpass)?(report << "FAIL" << std::endl):(report << "OK"<<std::endl);
pass &= locpass ;
}
#endif
+#endif
commentator().stop(MSG_STATUS(pass),"ffpack test suite");
return pass ? 0 : -1;
diff --git a/tests/test-fibb.C b/tests/test-fibb.C
new file mode 100644
index 0000000..5cb5fde
--- /dev/null
+++ b/tests/test-fibb.C
@@ -0,0 +1,313 @@
+
+/* tests/test-fibb.C
+ * -bds
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ * ========LICENCE========
+ *
+ */
+
+
+/*! @file tests/test-fibb.C
+ * @ingroup tests
+ * @brief no doc
+ * @test NO DOC
+ */
+
+#include "linbox/linbox-config.h"
+#include <iostream>
+#include "linbox/util/commentator.h"
+#include "givaro/modular-double.h"
+#include "test-blackbox.h"
+#include "linbox/matrix/matrix-domain.h"
+#include "linbox/blackbox/fibb.h"
+#include "linbox/blackbox/fibb-product.h"
+#include "linbox/blackbox/diagonal.h"
+//#include "linbox/matrix/permutation-matrix.h"
+#include "linbox/blackbox/permutation.h"
+#include "linbox/blackbox/triangular-fibb.h"
+
+using namespace LinBox;
+
+/*
+check rk = rank(A), dt = det(A)
+Neg rk argument means we don't know rank,
+Zero dt with full rank means we don't know det.
+In these cases the test passes without checking rank,det.
+
+Verify solve with apply (first provide consistent RHS).
+check NSR in NS (no check of randomness) and NSB
+*/
+template<class Field>
+bool testFibb(FIBB<Field>& A, string title, const typename Field::Element& dt, int64_t rk = -1)
+{
+ typedef typename Field::Element Element;
+ commentator().start(title.c_str(), "fibb");
+ ostream &report = commentator().report (Commentator::LEVEL_UNIMPORTANT, INTERNAL_DESCRIPTION);
+ bool pass = true, trial;
+ typedef DenseMatrix<Field> Matrix;
+ const Field& F(A.field());
+ BlasMatrixDomain<Field> MD(F);
+ size_t m = A.rowdim();
+ report << "rowdim " << m << std::endl;
+ size_t n = A.coldim();
+ report << "coldim " << n << std::endl;
+ size_t r = A.rank(r);
+ if (rk >= 0) pass = pass and r == rk;
+ if (m < 8 and n < 8) A.write(report << "A: " << std::endl) << std::endl;
+ report << "rank " << r << ", expected " << rk << std::endl;
+
+ Element d; F.init(d);
+ A.det(d);
+ if (rk == n and rk == m and F.isZero(dt))
+ F.write(report << "det ", d) << ", unchecked" << std::endl;
+ else
+ F.write(F.write(report << "det ", d) << ", expected ", dt) << std::endl;
+ if (rk == n and not F.isZero(dt)) pass = pass and F.areEqual(d, dt);
+ if (m == n)
+ { typename Field::Element d; F.init(d);
+ if (r < m and not F.isZero(A.det(d)))
+ { report << "problem in rank or det" << std::endl;
+ pass = false;
+ }
+ }
+ if (pass) report << "dims, rank, and det run fine (values partially checked)" << std::endl;
+
+/* right side stuff */
+{
+#if 1
+ // Solve consistent
+ size_t b = (n/2 > 5) ? 5 : n/2;
+ Matrix B(F,m,b), X(F, n, b), Y(F, m, b), Z(F, n, b);
+ X.random();
+ A.applyRight(B, X); // B: B = AX
+ if (not F.isZero(dt)) { // check for zero apply
+ if (MD.isZero(X)) {
+ X.write(report << "unlucky X" << std::endl, Tag::FileFormat::Plain) << std::endl;
+ pass = false;
+ }
+ if (MD.isZero(B)) {
+ B.write(report << "bad apply, B" << std::endl, Tag::FileFormat::Plain) << std::endl;
+ pass = false;
+ }
+ }
+ A.solveRight(Z, B); // Z: AZ = B = AX
+ A.applyRight(Y, Z); // Y: Y = AZ = B
+ trial = MD.areEqual(Y, B);
+ if (m == n and m == r) trial = trial and MD.areEqual(Z,X); // nonsing case
+ pass = pass and trial;
+ if (not trial) report << "problem in solve Right" << std::endl;
+ if (trial) report << " no problem in solve Right" << std::endl;
+ // NSR
+ A.nullspaceRandomRight(Y);
+ A.applyRight(Z, Y);
+ trial = MD.isZero(Z);
+ // no check of randomness of cols of Y
+ pass = pass and trial;
+ if (not trial) report << "problem in NSR Right" << std::endl;
+ if (trial) report << " no problem in NSR Right" << std::endl;
+ // NSB
+ Matrix N(F);
+ A.nullspaceBasisRight(N);
+ trial = N.rowdim() == n and N.coldim() == n-r; // proper num of cols.
+ if (n != r)
+ { trial = trial and n-r == MD.rank(N); // indep cols.
+ Matrix Nim(F, N.rowdim(), N.coldim());
+ A.applyRight(Nim, N);
+ trial = trial and MD.isZero(Nim); // in nullsp.
+ if (n < 8) Nim.write(report << "Nim " << std::endl, Tag::FileFormat::Plain) << std::endl;
+ }
+ if (n < 8) N.write(report << "N " << std::endl, Tag::FileFormat::Plain) << std::endl;
+ pass = pass and trial;
+ if (not trial) report << "problem in NSB Right " << m << " " << n << " " << r << " " << N.rowdim() << " " << N.coldim() << std::endl;
+ if (trial) report << " no problem in NSB Right" << std::endl;
+#endif
+} // right side
+ report << " done with right side" << std::endl;
+
+/* left side stuff */
+{
+ // Solve consistent
+ size_t b = (n/2 > 6) ? 6 : n/2;
+ Matrix B(F,b,n), X(F, b, m), Y(F, b, n), Z(F, b, m);
+ X.random();
+ A.applyLeft(B, X); // B: B = XA
+#if 1
+ if (not F.isZero(dt)) { // check for zero apply
+ if (MD.isZero(X)) {
+ X.write(report << "unlucky X" << std::endl, Tag::FileFormat::Plain) << std::endl;
+ pass = false;
+ }
+ if (MD.isZero(B)) {
+ B.write(report << "bad apply, B" << std::endl, Tag::FileFormat::Plain) << std::endl;
+ pass = false;
+ }
+ }
+ A.solveLeft(Z, B); // Z: ZA = B = XA
+ A.applyLeft(Y, Z); // Y: Y = ZA
+ trial = MD.areEqual(Y, B);
+ if (m == n and m == r) trial = trial and MD.areEqual(Z,X); // nonsing case
+ pass = pass and trial;
+ if (not trial)
+ { report << "problem in solve Left" << std::endl;
+ A.write(report << "FIBB A: " << std::endl) << std::endl;
+ X.write(report << "X: random " << std::endl, Tag::FileFormat::Plain) << std::endl;
+ B.write(report << "B: XA" << std::endl, Tag::FileFormat::Plain) << std::endl;
+ Z.write(report << "Z: solve ZA = B " << std::endl, Tag::FileFormat::Plain) << std::endl;
+ Y.write(report << "Y: ZA " << std::endl, Tag::FileFormat::Plain) << std::endl;
+ }
+ if (trial) report << " no problem in solve Left" << std::endl;
+ // NSR
+ A.nullspaceRandomLeft(X); // X: XA = 0
+ A.applyLeft(Y, X); // Y: Y = XA
+ trial = MD.isZero(Y);
+ pass = pass and trial;
+ if (not trial) report << "problem in NSR Left" << std::endl;
+ if (trial) report << " no problem in NSR Left" << std::endl;
+ // NSB
+ Matrix N(F);
+ A.nullspaceBasisLeft(N);
+ trial = (N.rowdim() == m-r and N.coldim() == m); // proper num of rows.
+ // todo: this rank should work on empty matrix, but doesn't
+ if (m != r)
+ { trial = (trial and m-r == MD.rank(N)); // indep cols.
+ Matrix Nim(F, N.rowdim(), N.coldim());
+ A.applyLeft(Nim, N);
+ trial = trial and MD.isZero(Nim); // in nullsp.
+ if (n < 8) Nim.write(report<< "Nim " << std::endl, Tag::FileFormat::Plain);
+ }
+ if (n < 8) N.write(report << "N " << std::endl, Tag::FileFormat::Plain) << std::endl;
+ pass = pass and trial;
+ if (not trial) report << "problem in NSB Left" << std::endl;
+ if (trial) report << " no problem in NSB Left" << std::endl;
+#endif
+} // left side
+ report << " done with left side" << std::endl;
+
+ commentator().stop (MSG_STATUS (pass));
+ return pass;
+}
+
+int main (int argc, char **argv)
+{
+ bool pass = true;
+ //srand(time(NULL));
+
+ static size_t n = 10;
+ static int32_t q = 101;
+ //static uint32_t q = 2147483647U;
+
+ static Argument args[] = {
+ { 'n', "-n N", "Set dimension of test matrices to NxN.", TYPE_INT, &n },
+ { 'q', "-q Q", "Operate over the \"field\" GF(Q) [1].", TYPE_INT, &q },
+ END_OF_ARGUMENTS
+ };
+ parseArguments (argc, argv, args);
+
+ commentator().start("FIBB test suite", "fibb");
+ ostream &report = commentator().report (Commentator::LEVEL_UNIMPORTANT, INTERNAL_DESCRIPTION);
+
+ typedef Givaro::Modular<double> Field;
+ Field F (q);
+ //MatrixDomain<Field> MD(F);
+
+ Diagonal<Field> D1(F, n); // random nonsing
+ Diagonal<Field> D2(F, n);
+ for (size_t i = 0; i < n/2; ++i) D2.setEntry(i,i,F.zero); // rank half
+ Diagonal<Field> D3(F, n);
+ for (size_t i = 0; i < n; ++i) D3.setEntry(i,i,F.zero); // zero matrix
+
+ pass = pass and testFibb(D1, "D1 nonsing", F.zero, n); // nonsing
+ pass = pass and testFibb(D2, "D2 sing", F.zero, n-n/2); // sing
+ pass = pass and testFibb(D3, "D3 zero", F.zero, 0); // zero
+
+ FIBBProduct<Field> Pr1(D1, D1); // nonsing product
+ FIBBProduct<Field> Pr2(D1, D2); // sing product
+ FIBBProduct<Field> Pr3(D3, D1); // zero product
+
+ pass = pass and testFibb(Pr1, "Pr1 nonsing product", F.zero, n); // nonsing product
+ pass = pass and testFibb(Pr2, "Pr2 sing product", F.zero, n-n/2); // sing product
+ pass = pass and testFibb(Pr3, "Pr3 zero product", F.zero, 0); // zero product
+
+ Permutation<Field> P1(F, n, n); // ident
+ Permutation<Field> P2(F, n, n); P2.random();
+
+ pass = pass and testFibb(P1, "P1 ident", F.one, n); // ident
+ pass = pass and testFibb(P2, "P2 random perm", F.zero, n); // random perm
+
+ FIBBProduct<Field> Pr4(P1, D1, P2); // nonsing product
+ FIBBProduct<Field> Pr5(P1, D2, P2); // sing product
+ FIBBProduct<Field> Pr6(P1, D3, P2); // zero product
+
+ pass = pass and testFibb(Pr4, "Pr4 nonsing product", F.zero, n); // nonsing product
+ pass = pass and testFibb(Pr5, "Pr5 sing product", F.zero, n-n/2); // sing product
+ pass = pass and testFibb(Pr6, "Pr6 zero product", F.zero, 0); // zero product
+
+ report << "Done with diag and permutation products" << std::endl;
+#if 1
+ typedef DenseMatrix<Field> Matrix;
+ typedef TriangularBlasMatrix<Field> TriangularMatrix;
+ Matrix M(F, n, n);
+ //M.random();
+ for (size_t i = 0; i < n; ++i)
+ for (size_t j = 0; j < n; ++j)
+ if ( i == 0 or i == j) M.setEntry(i, j, F.one);
+ M.write(report << "base matrix " << std::endl) << std::endl;
+ BlasMatrixDomain<Field> BMD(F);
+ /*
+ size_t r;
+ Matrix SM(M);
+ r = BMD.rank(SM);
+ report << "underlying rank " << r << std::endl;
+ */
+ TriangularMatrix U(M, Tag::Shape::Upper, Tag::Diag::NonUnit);
+ TriangularMatrix L(M, Tag::Shape::Lower, Tag::Diag::Unit);
+ report << "Upper " << (int)Tag::Shape::Upper << ", Lower " << (int)Tag::Shape::Lower << std::endl;
+ report << "Unit " << (int)Tag::Diag::Unit << ", NonUnit " << (int)Tag::Diag::NonUnit << std::endl;
+ TriangularFIBB<Field> UU(U);
+ TriangularFIBB<Field> LL(L);
+ FIBBProduct<Field> Pr7(LL, UU); // nonsing product
+ FIBBProduct<Field> Pr8(P1, LL, UU, P2); // nonsing product
+ FIBBProduct<Field> Pr9(LL, P1, UU, P2); // nonsing product
+
+ report << "Triangular, " << (int)U.getDiag() << " " << (int)U.getUpLo() << std::endl;
+ pass = pass and testFibb(UU, "UU nonU", F.one, n); // Upper NonUnit
+ report << "Triangular, " << (int)L.getDiag() << " " << (int)L.getUpLo() << std::endl;
+ pass = pass and testFibb(LL, "LL unit", F.one, n); // Lower Unit
+ report << "LU pattern nonsing" << std::endl;
+ pass = pass and testFibb(Pr7, "Pr7 LU", F.one, n); // LU pattern nonsing
+ report << "PLUQ pattern nonsing" << std::endl;
+ pass = pass and testFibb(Pr8, "Pr8 PLUQ", F.one, n); // PLUQ pattern nonsing
+ report << "LQUP pattern nonsing" << std::endl;
+ pass = pass and testFibb(Pr9, "Pr9 LQUP", F.one, n); // LQUP pattern nonsing
+#endif
+ report << "Done with triangular and permutation products" << std::endl;
+ //FactorizedMatrix<Field> F(...);
+
+ commentator().stop (MSG_STATUS (pass));
+
+ return pass ? 0 : -1;
+}
+
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/tests/test-field.h b/tests/test-field.h
old mode 100644
new mode 100755
index fa19e6a..b5189b7
--- a/tests/test-field.h
+++ b/tests/test-field.h
@@ -1,5 +1,5 @@
/* linbox/tests/test-field.h
- * Copyright (C) 2001, 2002 Bradford Hovinen
+ * Extracted and evolved by bds from test-generic.h, written by Bradford Hovinen <hovinen at cis.udel.edu>
*
* ========LICENCE========
* This file is part of the library LinBox.
@@ -15,46 +15,46 @@
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
+ * License along with this library; if not, write to tthe Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
* ========LICENCE========
- *.
- *
- * Extracted by bds from test-generic.h, written by Bradford Hovinen <hovinen at cis.udel.edu>
*/
/*! @file tests/test-field.h
* @ingroup tests
- * @brief tests field operations
- * @test tests field operations
+ * @brief tests ring and field operations
+ * @test tests ring and field operations
*/
/*
-// top level test that doesn't use subtests.
+// top level test that doesn't use field_subtests.
+bool testRing
bool testField
// top level test that uses subtest testRandomIteratorStep.
bool testRandomIterator
-// top level runBasicRingTests calls these subtests.
+// top level runBasicRingTests calls these field_subtests.
bool testFieldNegation
bool testFieldDistributivity
bool testFieldAssociativity
bool testFieldCharacteristic
bool testGeometricSummation
-bool testArithmeticConsistency
+bool testRingArithmeticConsistency
bool testAxpyConsistency
bool testRanditerBasic
-// top level runFieldTests calls these subtests after runBasicRingTests.
+// top level runPIRTests calls these field_subtests after runBasicRingTests.
+bool testFieldCommutativity
+...
+
+// top level runFieldTests calls these field_subtests after runBasicRingTests.
bool testFieldInversion
bool testFieldCommutativity
+bool testInvDivConsistency
bool testFreshmansDream
bool testRingTrivia
-//called in subtest testArithmeticConsistency
-bool testRingArithmeticConsistency
-bool testInvDivConsistency
*/
#ifndef __LINBOX_test_field_H
@@ -68,30 +68,28 @@ bool testInvDivConsistency
#include "linbox/util/commentator.h"
#include "linbox/util/field-axpy.h"
-#include "linbox/randiter/nonzero.h"
+#include <givaro/givranditer.h>
//#include "linbox/vector/stream.h"
#include "linbox/integer.h"
+// #include "linbox/field/givaro.h"
#include "test-common.h"
-/* Modular exponentiation */
+/* Givaro::Modular exponentiation */
using namespace std;
-// LinBox::Commentator commentator(std::cout);
-
using LinBox::commentator ;
-
template <class Field>
typename Field::Element& expt (const Field &F, typename Field::Element &res, const typename Field::Element &a, LinBox::integer &n)
{
if (n == 0) {
- F.init (res, 1);
+ F.init (res);
}
else if (n == 1) {
F.assign (res, a);
}
- else if (n[0] & 1) {
+ else if (Givaro::isOdd(n)) {
n -= 1;
expt (F, res, a, n);
F.mulin (res, a);
@@ -100,7 +98,7 @@ typename Field::Element& expt (const Field &F, typename Field::Element &res, con
n /= 2;
expt (F, res, a, n);
typename Field::Element tmp;
- F.init(tmp,0);
+ F.init(tmp);
res = F.mul (tmp, res, res);
}
@@ -126,34 +124,41 @@ bool reportError(string rep, bool& flag)
* Return true on success and false on failure
*/
-template<class Field>
-bool testField (Field &F, const char *title, bool fieldp = true)
+template<class Ring>
+bool testRing (Ring &F, const char *title, bool fieldp = true, bool runInitConvertIdentity=true)
{
- commentator().start (title, "testField", 5);
- // ostream &report = std::cout ;
+ commentator().start (title, "testRing", 5);
ostream &report = commentator().report (LinBox::Commentator::LEVEL_UNIMPORTANT, INTERNAL_DESCRIPTION);
- typename Field::Element zero, one, mOne, two, three;
- F.init(zero, 0); F.init(one, 1); F.init(two, 2); F.init(three, 3);
- F.init(mOne);
- F.neg(mOne,one);
-
- typename Field::Element a, b, c, d, e, f;
- F.init(a,0); F.init(b,0); F.init(c,0); F.init(d,0); F.init(e,0); F.init(f,0);
-
-
- report << "Field self description: " << F.write (report) << endl;
- // report << "field Element 2: " << F.write (report, two) << endl;
+ typedef typename Ring::Element Element;
+ LinBox::integer p, q;
+ F.characteristic(p);
+
+ Element zero, one, mOne, two, mTwo, three, five, six, eight;
+ F.init(zero); F.assign(zero, F.zero);
+ F.init(one); F.assign(one, F.one);
+ F.init(mOne); F.assign(mOne, F.mOne);
+
+ F.init(two); F.add(two, one, one);
+ F.init(mTwo); F.add(mTwo, mOne, F.mOne);
+ F.init(three); F.add(three, two, one);
+ F.init(five); F.add(five, three, one); F.addin(five, one);
+ F.init(six); F.add(six, five, one);
+ F.init(eight); F.add(eight, six, one); F.addin(eight, one);
+
+ Element a, b, c, d, e, f;
+ int64_t z = 0;
+ F.init(a,z); F.init(b,z); F.init(c,z); F.init(d,z); F.init(e,z); F.init(f,z);
+
+ F.write(report << " (Ring self description: ") << ')' << endl;
+ report << "Ring characteristic: " << p << endl;
LinBox::integer n, m;
bool pass = true, part_pass = true;
commentator().start ("\t--Testing characteristic/cardinality match");
- F.characteristic (n);
- F.cardinality (m);
-
- if (n > 0 && !isPower (m, n)) part_pass = reportError("Characteristic, cardinality mismatch", pass);
+ if (p > 0 && q > 0 && !isPower (q, p)) part_pass = reportError("Characteristic, cardinality mismatch", pass);
commentator().stop (MSG_STATUS (part_pass));
commentator().progress ();
@@ -164,82 +169,87 @@ bool testField (Field &F, const char *title, bool fieldp = true)
commentator().start ("\t--Testing correctness of 0 and 1");
part_pass = true;
- if (!F.isZero (zero)) {
+ if ( not F.isZero (zero) or not F.isZero(F.zero) )
part_pass = reportError( "isZero (0) is false", pass);
- }
- if (F.isZero (one)) part_pass = reportError( "isZero (1) is true", pass);
- if (F.isOne (zero)) part_pass = reportError( "isOne (0) is true", pass);
- if (!F.isOne (one)) {
+
+ if ( F.isZero (one) or F.isZero(F.one) )
+ part_pass = reportError( "isZero (1) is true", pass);
+ if ( F.isOne (zero) or F.isOne(F.zero) )
+ part_pass = reportError( "isOne (0) is true", pass);
+ if ( not F.isOne (one) or not F.isOne(F.one) )
part_pass = reportError( "isOne (1) is false", pass);
- }
-
- if (!F.isZero (F.zero)) {
- part_pass = reportError( "isZero (0) is false", pass);
- }
- if (F.isZero (F.one)) part_pass = reportError( "isZero (1) is true", pass);
- if (F.isOne (F.zero)) part_pass = reportError( "isOne (0) is true", pass);
- if (!F.isOne (F.one)) {
- part_pass = reportError( "isOne (1) is false", pass);
- }
-
- if ( !F.areEqual(F.mOne,mOne))
+ if ( !F.areEqual(F.mOne,mOne)) {
part_pass = reportError( "isMOne (-One) is false", pass);
+ }
- typename Field::Element mOneFromCst;
- F.init(mOneFromCst, -1);
+/* this is not required of init
+ if (p > 0) {
+ Element mOneFromCst;
+ F.init(mOneFromCst, (LinBox::integer)(p-1));
- if ( !F.areEqual(F.mOne,mOneFromCst))
- part_pass = reportError( "isMOne (-1) is false", pass);
+ if ( !F.areEqual(F.mOne,mOneFromCst)) {
+ part_pass = reportError( "isMOne (p-1) is false", pass);
+ }
+ }
+*/
commentator().stop (MSG_STATUS (part_pass));
commentator().progress ();
+ if (runInitConvertIdentity) {
+
commentator().start ("\t--Testing init/convert");
part_pass = true;
- if (F.cardinality (m) <= 0)
- n = 49193295; // Just using some odd value
+ // test of 0..card-1 bijection
+ typename Ring::RandIter r (F);
+ r.random(a);
+ F.convert(n, a);
+ F.write(report, a) << " --(convert)--> " << n << endl;
+ F.init(b, n);
+ F.write(report << n << " --(init)--> ", b) << endl;
+ if (not F.areEqual(a, b)) part_pass = reportError( "F.init (b, F.convert(n, a)) != a", pass);
+
+#if 0
+ // test of prime subring bijection
+ if (p <= 0)
+ n = 0;
else
- n = n/2-1;
- if (!n) ++n;
-
-
+ n = rand()%p;
report << "Initial integer: " << n << endl;
- F.init (a, n); F.write ( report << "Result of init: ", a) << endl;
- F.convert (m, a);
- report << "Result of convert: " << m << endl;
+ F.init (a, (int64_t)n); F.write ( report << "Result of init: ", a) << endl;
+ F.convert (m, a); report << "Result of convert: " << m << endl;
if (m != n) part_pass = reportError( "F.convert (m, F.init (a, n)) != n", pass);
+#endif
commentator().stop (MSG_STATUS (part_pass));
commentator().progress ();
-
- commentator().start ("\t--Testing field arithmetic");
+ }
+
+ commentator().start ("\t--Testing ring arithmetic");
part_pass = true;
- F.init (b, n-2);
- F.init (d, n-2);
- F.init (e, 3);
-
F.add (a, three, two); F.write (report << "Result of 2 + 3: ", a) << endl;
F.assign (d, three);
F.addin (d, two); F.write (report << "Result of 2 + 3 (inplace): ", d) << endl;
- if (!F.areEqual (a, F.init (f, 5)) || !F.areEqual (d, a))
+ if (!F.areEqual (a, F.assign (f, five)) || !F.areEqual (d, a))
part_pass = reportError( "Results of add are incorrect", pass);
F.neg (a, two); F.write (report << "Result of -2: ", a) << endl;
F.assign (d, two);
F.negin (d); F.write (report << "Result of -2 (inplace): ", d) << endl;
- F.init (f, -2); F.write( report << "-2 via init: ", f) << endl;
+//F.write( report << "-2 mTwo: ", mTwo) << endl;
+ F.assign (f, mTwo); F.write( report << "-2 via init: ", f) << endl;
if (!F.areEqual (a, f) || !F.areEqual (d, a))
part_pass = reportError( "Results of neg are incorrect", pass);
F.sub (a, three, two); F.write (report << "Result of 3 - 2: ", a) << endl;
- F.init (d, 3);
+ F.assign (d, three);
F.subin (d, two); F.write (report << "Result of 3 - 2 (inplace): ", d) << endl;
if (!F.areEqual (a, one) || !F.areEqual (d, a))
@@ -248,30 +258,15 @@ bool testField (Field &F, const char *title, bool fieldp = true)
F.mul (a, two, three); F.write (report << "Result of 2 * 3: ", a) << endl;
F.assign (d, two);
F.mulin (d, three); F.write (report << "Result of 2 * 3 (inplace): ", d) << endl;
- F.init (f, 6);
+ F.assign (f, six);
if (!F.areEqual (a, f) || !F.areEqual (d, a))
part_pass = reportError( "Results of mul incorrect", pass);
- F.inv (a, one); F.write (report << "Result of inverting 1: ", a) << endl;
- F.assign (d, one);
- F.invin (d); F.write (report << "Result of inverting 1 (inplace): ", d) << endl;
-
- if (!F.areEqual (a, one) || !F.areEqual (d, a))
- part_pass = reportError( "Results of inv incorrect", pass);
-
- if ( F.isZero(two) ) F.assign(f, three); else F.assign(f, two);
- F.div (a, f, f); F.write ( report << "Result of f/f: ", a) << endl;
- F.assign(d, f);
- F.divin (d, f); F.write ( report << "Result of f/f (inplace): ", d) << endl;
-
- if (!F.areEqual (a, one) || !F.areEqual (d, a))
- part_pass = reportError( "Results of div incorrect", pass);
-
F.axpy (a, two, three, two); F.write ( report << "Result of axpy 2*3 + 2: ", a) << endl;
F.assign (d, two);
F.axpyin (d, two, three); F.write ( report << "Result of axpy 2*3 + 2 (inplace): ", d) << endl;
- F.init (f, 8);
+ F.assign (f, eight);
if ( !F.areEqual (a, f) || !F.areEqual (d, a) )
part_pass = reportError( "Results of axpy incorrect", pass);
@@ -284,26 +279,27 @@ bool testField (Field &F, const char *title, bool fieldp = true)
//,..
// 2^101 - 1 vs 1 + 2 + 4 + ... + 2^100
- F.init (a, 1);
- F.init (b, 1);
- F.init (c, 0);
-
n = 101;
expt(F, a, two, n);
- F.subin (a, one); F.write( report << "using expt, 2^101 - 1: ", a) << endl;
+ F.subin (a, one);
+ F.write( report << "using expt, 2^101 - 1: ", a) << endl;
- for (int i = 1; i <= 101; ++i) {
- F.addin (c, b);
- F.mulin (b, two);
+ for (int i = 0; i < 101; ++i) {
+ F.mulin(c, two);
+ F.addin (c, one);
}
+ F.write( report << "using sum, 1 + 2 + .. + 2^100: ", c) << endl;
+
if (!F.areEqual (a, c))
part_pass = reportError( "2^101 - 1 != 1 + 2 + .. + 2^100", pass);
// 1 + 2*(1 + 2*( ... (1) ... )), 100 times.
F.assign (d, one);
- for (int i = 1; i < 101; ++i)
- { F.axpy (b, two, d, one); F.assign(d, b); }
+ for (int i = 1; i < 101; ++i) {
+ F.axpy (b, two, d, one);
+ F.assign(d, b);
+ }
F.write( report << "using axpy, 1 + 2(1 + ... + 2(1)...), with 100 '+'s: ", d) << endl;
if (!F.areEqual (a, d))
@@ -321,15 +317,59 @@ bool testField (Field &F, const char *title, bool fieldp = true)
* .
*/
- commentator().stop (MSG_STATUS (pass), (const char *) 0, "testField");
+ commentator().stop (MSG_STATUS (pass), (const char *) 0, "testRing");
return pass;
}
+template<class Field>
+bool testField (Field &F, const char *title, bool fieldp = true, bool runInitConvertIdentity=true)
+{
+ commentator().start (title, "testField", 5);
+ ostream &report = commentator().report (LinBox::Commentator::LEVEL_UNIMPORTANT, INTERNAL_DESCRIPTION);
+
+ LinBox::integer p, q;
+ F.characteristic(p);
+ F.cardinality (q);
+
+ typename Field::Element two, three;
+ F.init(two); F.add(two, F.one, F.one);
+ F.init(three); F.add(three, two, F.one);
+
+ typename Field::Element a, b, c, d, e, f;
+ F.init(a);F.init(b);F.init(c);F.init(d);F.init(e);F.init(f);
+
+ commentator().start ("\t--Testing field arithmetic");
+ bool part_pass = true;
+
+ F.inv (a, F.one); F.write (report << "Result of inverting 1: ", a) << endl;
+ F.assign (d, F.one);
+ F.invin (d); F.write (report << "Result of inverting 1 (inplace): ", d) << endl;
-/** Tests of algebraic properties of fields */
+ if (!F.areEqual (a, F.one) || !F.areEqual (d, a))
+ part_pass = reportError( "Results of inv incorrect", part_pass);
-namespace subtests {
+ if ( F.isZero(two) ) F.assign(f, three); else F.assign(f, two);
+ F.div (a, f, f); F.write ( report << "Result of f/f: ", a) << endl;
+ F.assign(d, f);
+ F.divin (d, f); F.write ( report << "Result of f/f (inplace): ", d) << endl;
+
+ if (!F.areEqual (a, F.one) || !F.areEqual (d, a))
+ part_pass = reportError( "Results of div incorrect", part_pass);
+
+ commentator().stop (MSG_STATUS (part_pass));
+ commentator().progress ();
+
+
+ commentator().stop (MSG_STATUS (part_pass), (const char *) 0, "testField");
+
+ return part_pass & testRing(F,title,fieldp,runInitConvertIdentity);
+
+}
+
+/** Tests of algebraic properties of rings and fields */
+
+namespace field_subtests {
/* Generic test 6: Negation of elements
*
* Negates random elements and checks that they are true negatives
@@ -345,7 +385,8 @@ namespace subtests {
commentator().start (st, "testFieldNegation", iterations);
typename Field::Element a, neg_a, neg_a_a, zero;
- F.init(a,0); F.init(neg_a,0); F.init(neg_a_a,0); F.init (zero, 0);
+ int64_t z = 0;
+ F.init(a,z); F.init(neg_a,z); F.init(neg_a_a,z); F.init (zero, z);
typename Field::RandIter r (F);
bool ret = true;
@@ -394,11 +435,10 @@ namespace subtests {
strcpy (st, str.str().c_str());
commentator().start (st, "testFieldInversion", iterations);
- typename Field::Element a, ainv, aainv, one;
- F.init (a,0);
- F.init (ainv,0);
- F.init (aainv,0);
- F.init (one, 1);
+ typename Field::Element a, ainv, aainv;
+ F.init (a,(int64_t)0);
+ F.init (ainv,(int64_t)0);
+ F.init (aainv,(int64_t)0);
typename Field::RandIter r (F);
bool ret = true;
@@ -421,7 +461,7 @@ namespace subtests {
report << "a a^{-1} = "; F.write (report, aainv) << endl;
- if (!F.areEqual (aainv, one)) reportError("a a^-1 != 1", ret);
+ if (!F.areEqual (aainv, F.one)) reportError("a a^-1 != 1", ret);
commentator().stop ("done");
commentator().progress ();
@@ -449,10 +489,11 @@ namespace subtests {
commentator().start (st, "testFieldDistributivity", iterations);
typename Field::Element a, b, c, a_b, a_bc, ac, bc, ac_bc, ca_b, ca, cb, ca_cb;
- F.init (a,0); F.init (b,0); F.init (c,0);
- F.init (a_b,0); F.init (a_bc,0); F.init (ac,0); F.init (bc,0);
- F.init (ac_bc,0);
- F.init (ca_b,0); F.init (ca,0); F.init (cb,0); F.init (ca_cb,0);
+ int64_t z = 0;
+ F.init (a,z); F.init (b,z); F.init (c,z);
+ F.init (a_b,z); F.init (a_bc,z); F.init (ac,z); F.init (bc,z);
+ F.init (ac_bc,z);
+ F.init (ca_b,z); F.init (ca,z); F.init (cb,z); F.init (ca_cb,z);
typename Field::RandIter r (F);
@@ -523,9 +564,9 @@ namespace subtests {
commentator().start (st, "testFieldCommutativity", iterations);
typename Field::Element a, b, ab, ba, a_b, b_a;
- F.init (a,0); F.init (b,0);
- F.init (ab,0); F.init (ba,0);
- F.init (a_b,0); F.init (b_a,0);
+ F.init (a,(int64_t)0); F.init (b,(int64_t)0);
+ F.init (ab,(int64_t)0); F.init (ba,(int64_t)0);
+ F.init (a_b,(int64_t)0); F.init (b_a,(int64_t)0);
typename Field::RandIter r (F);
@@ -596,8 +637,8 @@ namespace subtests {
commentator().start (st, "testFieldAssociativity", iterations);
typename Field::Element a, b, c, a_b, b_c, a_bc, ab_c;
- F.init (a,0); F.init (b,0); F.init (c,0);
- F.init (a_b,0); F.init (b_c,0); F.init (a_bc,0); F.init (ab_c,0);
+ F.init (a,(int64_t)0); F.init (b,(int64_t)0); F.init (c,(int64_t)0);
+ F.init (a_b,(int64_t)0); F.init (b_c,(int64_t)0); F.init (a_bc,(int64_t)0); F.init (ab_c,(int64_t)0);
typename Field::RandIter r (F);
bool ret = true;
@@ -666,33 +707,29 @@ namespace subtests {
strcpy (st, str.str().c_str());
commentator().start (st, "testGeometricSummation", iterations);
- typename Field::Element a, a_n, k, zero, one;
+ typename Field::Element a, a_n, k;
typename Field::RandIter r (F);
- typename LinBox::NonzeroRandIter<Field> z(F,r);
+// typename Givaro::GeneralRingNonZeroRandIter<Field> z(r);
- F.init (zero, 0);
- F.init (one, 1);
- F.init (a,0); F.init (a_n,0); F.init (k,0);
+ F.init (a,(int64_t)0); F.init (a_n,(int64_t)0); F.init (k,(int64_t)0);
bool ret = true;
LinBox::Integer card; F.cardinality(card);
-
for (unsigned int i = 0; i < iterations; i++) {
commentator().startIteration (i);
- size_t no_bad_loop = card+10 ;
- do z.random (a); while (F.areEqual (a, one) && --no_bad_loop);
- if (!no_bad_loop) {
- reportError(" *** ERROR *** could not find an element different form 1...",ret);
- break;
- }
+// size_t no_bad_loop = card+10 ;
+// do z.random (a); while (F.areEqual (a, F.one) && --no_bad_loop);
+// if (!no_bad_loop) {
+// reportError(" *** ERROR *** could not find an element different from 1...",ret);
+// break;
ostream &report = commentator().report (LinBox::Commentator::LEVEL_UNIMPORTANT, INTERNAL_DESCRIPTION);
report << "Random element a: ";
F.write (report, a) << endl;
- F.assign (k, one);
- F.assign (a_n, a);
+ F.assign (k, F.zero);
+ F.assign (a_n, F.one);
for (unsigned int j = 0; j < n; ++j) {
F.addin (k, a_n);
@@ -707,15 +744,18 @@ namespace subtests {
report << "sum(a^i, i = 0..n-1) = ";
F.write (report, k) << endl;
- F.subin (a_n, one);
+ F.subin (a_n, F.one);
report << "(a^n - 1) = ";
F.write (report, a_n) << endl;
- F.subin (a, one);
+ F.subin (a, F.one);
report << "(a - 1) = ";
F.write (report, a) << endl;
- F.divin (a_n, a);
+ if (not F.isZero(a))
+ F.divin (a_n, a);
+ else
+ F.mulin(k, a);
report << "(a^n - 1) / (a - 1) = ";
F.write (report, a_n) << endl;
@@ -749,12 +789,11 @@ namespace subtests {
commentator().start (string(str.str()).c_str(), "testFieldCharacteristic", iterations);
LinBox::integer p, j;
- typename Field::Element a, sigma, zero;
+ typename Field::Element a, sigma;
typename Field::RandIter r (F);
F.characteristic (p);
- F.init (zero, 0);
- F.init (a,0); F.init (sigma,0);
+ F.init (a,(int64_t)0); F.init (sigma,(int64_t)0);
bool ret = true;
@@ -770,7 +809,7 @@ namespace subtests {
Report << "Random element a: ";
F.write (Report, a) << endl;
- F.assign (sigma, zero);
+ F.assign (sigma, F.zero);
// suggestion: make this run in time O(lg(p)), then take the conditional out of the run...Tests
for (j = 0; j < p; j += 1)
@@ -821,8 +860,8 @@ namespace subtests {
typename Field::RandIter r (F);
typename Field::Element a, b, a_b, a_b_p, a_p, b_p, a_p_b_p;
- F.init (a,0); F.init (b,0); F.init (a_b,0);
- F.init (a_b_p,0); F.init (a_p,0); F.init (b_p,0); F.init (a_p_b_p,0);
+ F.init (a,(int64_t)0); F.init (b,(int64_t)0); F.init (a_b,(int64_t)0);
+ F.init (a_b_p,(int64_t)0); F.init (a_p,(int64_t)0); F.init (b_p,(int64_t)0); F.init (a_p_b_p,(int64_t)0);
for (unsigned int i = 0; i < iterations; i++) {
commentator().startIteration (i);
@@ -896,7 +935,7 @@ namespace subtests {
typename Field::RandIter r (F);
typename Field::Element a, b, c1, c2;
- F.init (a,0); F.init (b,0); F.init (c1,0); F.init (c2,0);
+ F.init (a,(int64_t)0); F.init (b,(int64_t)0); F.init (c1,(int64_t)0); F.init (c2,(int64_t)0);
for (unsigned int i = 0; i < iterations; i++) {
commentator().startIteration (i);
@@ -975,7 +1014,8 @@ namespace subtests {
typename Field::RandIter r (F);
typename Field::Element a, b, c1, c2;
- F.init (a,0); F.init (b,0); F.init (c1,0); F.init (c2,0);
+ uint64_t zero = 0;
+ F.init (a,zero); F.init (b,zero); F.init (c1,zero); F.init (c2,zero);
for (unsigned int i = 0; i < iterations; i++) {
commentator().startIteration (i);
@@ -1023,17 +1063,18 @@ namespace subtests {
return ret;
}
-
+/*
template <class Field>
bool testArithmeticConsistency (const Field &F, const char *name, unsigned int iterations)
{
bool ret = true ;
- ret &= subtests::testRingArithmeticConsistency(F, name, iterations) ;
- ret &= subtests::testInvDivConsistency(F, name, iterations);
+ ret &= field_subtests::testRingArithmeticConsistency(F, name, iterations) ;
+ ret &= field_subtests::testInvDivConsistency(F, name, iterations);
return ret;
}
+ */
template <class Field>
@@ -1054,42 +1095,41 @@ namespace subtests {
ostream &rapport = commentator().report (LinBox::Commentator::LEVEL_UNIMPORTANT, INTERNAL_DESCRIPTION);
//!@todo enable init with 1UL et -1L pour GMPRationalElement
- typename Field::Element one, mOne, zero ;
- LinBox::integer pun = 1 ;
- LinBox::integer mun = -1 ;
- LinBox::integer zer = 0 ;
- F.init(one,pun);
- F.init(mOne,mun);
- F.neg(mOne,one);
- // F.init(mOne,-1L);
- F.init(zero,zer);
+ //typename Field::Element one, mOne, zero ;
+ //LinBox::integer pun = 1 ;
+ //LinBox::integer zer = 0 ;
+ //F.init(one,pun);
+ //F.neg(mOne,one);
+ //F.init(zero,zer);
rapport << "1 - 1 = " ;
typename Field::Element nil ;
+ F.init(nil);
- F.add(nil,one,mOne);
+ F.add(nil,F.one,F.mOne);
F.write(rapport,nil) << std::endl ;
- if ( !F.areEqual(nil,zero) ) {
- reportError("1+1!=0", ret);
+ if ( !F.areEqual(nil,F.zero) ) {
+ reportError("1+-1!=0", ret);
}
typename Field::Element un ;
+ F.init(un);
rapport << "-1 * -1 = " ;
- F.mul(un,mOne,mOne);
+ F.mul(un,F.mOne,F.mOne);
F.write(rapport,un) << std::endl ;
- if ( !F.areEqual(un,one) ) {
+ if ( !F.areEqual(un,F.one) ) {
reportError("-1 * -1 != 1", ret);
}
- F.init(nil,pun);
+ //F.init(nil,pun);
rapport << "-1 + -1 * -1 = " ;
- F.axpy(nil,mOne,mOne,mOne) ;
+ F.axpy(nil,F.mOne,F.mOne,F.mOne) ;
F.write(rapport,nil) << std::endl ;
- if ( !F.areEqual(nil,zero) ) {
+ if ( !F.areEqual(nil,F.zero) ) {
reportError("-1+(-1*-1)!=0", ret);
}
@@ -1120,8 +1160,8 @@ namespace subtests {
typename Field::RandIter r (F);
typename Field::Element a, x, y, c1, c2, c3;
- F.init (a,0); F.init (x,0); F.init (y,0);
- F.init (c1,0); F.init (c2,0); F.init (c3,0);
+ F.init (a,(int64_t)0); F.init (x,(int64_t)0); F.init (y,(int64_t)0);
+ F.init (c1,(int64_t)0); F.init (c2,(int64_t)0); F.init (c3,(int64_t)0);
for (unsigned int i = 0; i < iterations; i++) {
commentator().startIteration (i);
@@ -1175,7 +1215,7 @@ namespace subtests {
typename Field::RandIter r (F);
typename Field::Element a;
- F.init (a,0);
+ F.init (a,(int64_t)0);
if (iterations < 20) iterations = 20;
for (unsigned int i = 0; i < iterations; i++) {
@@ -1188,54 +1228,54 @@ namespace subtests {
delete[] st;
return ret;
}
-} // namespace subtests
-
- /* Convenience function to run all of the field tests on a given field */
- template <class Field>
- bool runBasicRingTests (const Field &F, const char *desc, unsigned int iterations, bool runCharacteristicTest = true)
- {
- bool pass = true;
- ostringstream str;
-
- str << "\t--Testing " << desc << " ring" << ends;
- char * st = new char[str.str().size()];
- strcpy (st, str.str().c_str());
+} // namespace field_subtests
- commentator().start (st, "runBasicRingTests", runCharacteristicTest ? 11 : 10);
+/* Convenience function to run all of the basic ring tests */
+template <class Ring>
+bool runBasicRingTests (const Ring &F, const char *desc, unsigned int iterations, bool runCharacteristicTest = true, bool runInitConvertIdentity=true)
+{
+ bool pass = true;
+ ostringstream str;
- if (!testField (F, string(str.str()).c_str())) pass = false;
- commentator().progress ();
- if (!subtests::testFieldNegation (F, desc, iterations)) pass = false;
- commentator().progress ();
- if (!subtests::testFieldDistributivity (F, desc, iterations)) pass = false;
- commentator().progress ();
- if (!subtests::testFieldAssociativity (F, desc, iterations)) pass = false;
- commentator().progress ();
+ str << "\t--Testing " << desc << " ring" << ends;
+ char * st = new char[str.str().size()];
+ strcpy (st, str.str().c_str());
- if (runCharacteristicTest) {
- if (!subtests::testFieldCharacteristic (F, desc, iterations)) pass = false;
- commentator().progress ();
- }
- LinBox::integer card;
+ commentator().start (st, "runBasicRingTests", runCharacteristicTest ? 11 : 10);
- if (F.cardinality(card) != 2) { // otherwise it is not very interesting to find a element not zero and not one !
- if (!subtests::testGeometricSummation (F, desc, iterations, 100)) pass = false;
- commentator().progress ();
- }
+ if (!testField (F, string(str.str()).c_str(),true,runInitConvertIdentity)) pass = false;
+ commentator().progress ();
+ if (!field_subtests::testFieldNegation (F, desc, iterations)) pass = false;
+ commentator().progress ();
+ if (!field_subtests::testFieldDistributivity (F, desc, iterations)) pass = false;
+ commentator().progress ();
+ if (!field_subtests::testFieldAssociativity (F, desc, iterations)) pass = false;
+ commentator().progress ();
- if (!subtests::testArithmeticConsistency (F, desc, iterations)) pass = false;
- commentator().progress ();
- if (!subtests::testAxpyConsistency (F, desc, iterations)) pass = false;
- commentator().progress ();
- if (!subtests::testRanditerBasic (F, desc, iterations)) pass = false;
+ if (runCharacteristicTest) {
+ if (!field_subtests::testFieldCharacteristic (F, desc, iterations)) pass = false;
commentator().progress ();
+ }
+ LinBox::integer card;
- commentator().stop (MSG_STATUS (pass), (const char *) 0, "runBasicRingTests");
- delete[] st;
- return pass;
+ if (F.cardinality(card) != 2) { // otherwise it is not very interesting to find a element not zero and not one !
+ if (!field_subtests::testGeometricSummation (F, desc, iterations, 100)) pass = false;
+ commentator().progress ();
}
-namespace subtests {
+ if (!field_subtests::testRingArithmeticConsistency (F, desc, iterations)) pass = false;
+ commentator().progress ();
+ if (!field_subtests::testAxpyConsistency (F, desc, iterations)) pass = false;
+ commentator().progress ();
+ if (!field_subtests::testRanditerBasic (F, desc, iterations)) pass = false;
+ commentator().progress ();
+
+ commentator().stop (MSG_STATUS (pass), (const char *) 0, "runBasicRingTests");
+ delete[] st;
+ return pass;
+}
+
+namespace field_subtests {
/* Random number test
*
* Test that the random iterator over the given field works
@@ -1261,6 +1301,7 @@ namespace subtests {
LinBox::integer card;
unsigned int i;
+// std::cerr<<"num_categories = "<<num_categories<<std::endl;
std::vector<int> categories1 (num_categories, 0);
std::vector<int> categories2 (num_categories, 0);
std::list<std::vector<int> > diff_categories;
@@ -1282,17 +1323,21 @@ namespace subtests {
for (i = 0; i < num_trials; ++i) {
LinBox::integer ix, id;
F.convert(ix, iter.random (x));
-
-
- categories1[ix % num_categories]++;
- categories2[(unsigned int) (double (ix) / double (card) * num_categories)]++;
+
+ LinBox::Integer ix2 = ix % num_categories;
+ if (ix2<0) ix2+=num_categories;
+ categories1[ix2]++;
+ categories2[(unsigned int) (double (ix2) / double (card) * num_categories) %num_categories]++;
typename std::list<typename Field::Element>::iterator x_queue_iter = x_queue.begin ();
diff_cat_iter = diff_categories.begin ();
+// std::cerr<<x_queue.size()<<" "<<diff_categories.size()<<std::endl;
for (; x_queue_iter != x_queue.end (); ++x_queue_iter, ++diff_cat_iter) {
F.convert(id, F.sub (d, *x_queue_iter, x));
- (*diff_cat_iter)[id % num_categories]++;
+ id %= num_categories;
+ if (id<0) id += num_categories;
+ (*diff_cat_iter)[(size_t) id]++;
}
x_queue.push_front (x);
@@ -1356,10 +1401,10 @@ namespace subtests {
//commentator().stop (MSG_STATUS (ret), (const char *) 0, "testRandomIteratorStep");
return ret;
}
-}
+}// namespace field_subtests
template <class Field>
-bool runFieldTests (const Field &F, const char *desc, unsigned int iterations, size_t n, bool runCharacteristicTest = true)
+bool runFieldTests (const Field &F, const char *desc, unsigned int iterations, size_t n, bool runCharacteristicTest = true, bool runInitConvertIdentity=true)
// n is not used.
{
ostringstream str;
@@ -1368,12 +1413,12 @@ bool runFieldTests (const Field &F, const char *desc, unsigned int iterations, s
char * st = new char[str.str().size()];
strcpy (st, str.str().c_str());
commentator().start (st, "runFieldTests");
- bool ret = runBasicRingTests(F, desc, iterations, runCharacteristicTest) ;
- //ret &= subtests::testInvDivConsistency(F, desc, iterations) ; // it's called in runBasicRingTests
- ret &= subtests::testFieldInversion (F, desc, iterations) ;
- ret &= subtests::testFieldCommutativity (F, desc, iterations) ;
- ret &= subtests::testFreshmansDream(F, desc, iterations);
- ret &= subtests::testRingTrivia(F,desc);
+ bool ret = runBasicRingTests(F, desc, iterations, runCharacteristicTest, runInitConvertIdentity) ;
+ ret &= field_subtests::testInvDivConsistency(F, desc, iterations) ;
+ ret &= field_subtests::testFieldInversion (F, desc, iterations) ;
+ ret &= field_subtests::testFieldCommutativity (F, desc, iterations) ;
+ ret &= field_subtests::testFreshmansDream(F, desc, iterations);
+ ret &= field_subtests::testRingTrivia(F,desc);
commentator().stop (MSG_STATUS (ret));
delete[] st;
@@ -1408,7 +1453,7 @@ bool testRandomIterator (const Field &F, const char *text,
/* This test either passes or runs a lot of times */
for (int i = 1;
- (! subtests::testRandomIteratorStep (F, text, num_trials, num_categories, hist_len)) && (i <= 2) ;
+ (! field_subtests::testRandomIteratorStep (F, text, num_trials, num_categories, hist_len)) && (i <= 2) ;
++i ){
//if (0 == i % 5)
//std::ostream &report = commentator().report (LinBox::Commentator::LEVEL_NORMAL, INTERNAL_DESCRIPTION) << "Warning! Probable failure of uniformity" << std::endl;
@@ -1425,11 +1470,11 @@ bool testRandomIterator (const Field &F, const char *text,
//@}
#endif // __LINBOX_test_field_H
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
// Local Variables:
// mode: C++
// tab-width: 8
// indent-tabs-mode: nil
// c-basic-offset: 8
// End:
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/tests/test-frobenius.C b/tests/test-frobenius.C
index 67a7b8e..eb11b27 100644
--- a/tests/test-frobenius.C
+++ b/tests/test-frobenius.C
@@ -2,20 +2,20 @@
* Copyright (C) LinBox
* Written by Austin Lobo, David Saunders
*
- *
+ *
* ========LICENCE========
* This file is part of the library LinBox.
- *
+ *
* LinBox is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
- *
+ *
* This library 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
* Lesser General Public License for more details.
- *
+ *
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
@@ -34,10 +34,10 @@
#include <iostream>
#include <fstream>
-#include <vector>
+
#include "linbox/util/commentator.h"
-#include "linbox/field/modular.h"
+#include "linbox/ring/modular.h"
#include "linbox/blackbox/scalar-matrix.h"
#include "linbox/blackbox/frobenius.h"
@@ -58,7 +58,7 @@ int main (int argc, char **argv)
END_OF_ARGUMENTS
};
- typedef Modular<uint32_t> Field;
+ typedef Givaro::Modular<uint32_t> Field;
typedef vector<Field::Element> Vector;
typedef Vector Polynomial;
typedef vector<Polynomial> Plist;
@@ -72,22 +72,22 @@ int main (int argc, char **argv)
size_t pdeg = 10;
plist[0].resize(pdeg+1);
for ( size_t i=0; i < pdeg; ++i) r.random(plist[0][i]);
- F.init(plist[0][pdeg],1);
+ F.assign(plist[0][pdeg],F.one);
pdeg = 6;
plist[1].resize(pdeg+1);
for ( size_t i=0; i < pdeg; ++i) r.random(plist[1][i]);
- F.init(plist[1][pdeg],1);
+ F.assign(plist[1][pdeg],F.one);
pdeg = 4;
plist[2].resize(pdeg+1);
for ( size_t i=0; i < pdeg; ++i) r.random(plist[2][i]);
- F.init(plist[2][pdeg],1);
+ F.assign(plist[2][pdeg],F.one);
commentator().start("Frobenius form black box test suite", "frobenius");
Frobenius<Field> A(F, plist.begin(), plist.end());
- pass = pass && testBlackbox(A);
+ pass = pass && testBlackboxNoRW(A);
commentator().stop("Frobenius form black box test suite");
return pass ? 0 : -1;
diff --git a/tests/test-ftrmm.C b/tests/test-ftrmm.C
index 8389228..b9964cc 100644
--- a/tests/test-ftrmm.C
+++ b/tests/test-ftrmm.C
@@ -1,22 +1,22 @@
/* fflas/test-ftrmm.inl
* Copyright (C) 2010 LinBox
*
- * Written by Brice Boyer <Brice.Boyer at imag.fr>
+ * Written by Brice Boyer (briceboyer) <boyer.brice at gmail.com>
+ *
*
- *
* ========LICENCE========
* This file is part of the library LinBox.
- *
+ *
* LinBox is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
- *
+ *
* This library 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
* Lesser General Public License for more details.
- *
+ *
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
@@ -38,7 +38,7 @@
//#define DEBUG
#include <cassert>
-#include "linbox/field/modular.h"
+#include "linbox/ring/modular.h"
#include "linbox/linbox-config.h"
#include "fflas-ffpack/fflas/fflas.h"
#include "fflas-ffpack/ffpack/ffpack.h"
@@ -48,14 +48,13 @@
//#define __LINBOX_HAVE_INT64
-#include "linbox/field/modular-balanced.h"
-#include "linbox/field/modular.h"
+#include <givaro/modular-balanced.h>
#include "fflas-ffpack/utils/Matio.h"
#include "test-common.h"
//#define _LB_TIME
#define _LB_MAX_SZ 50
-#define _LB_ITERS 3
+#define _LB_ITERS 1
//#define _LB_DEBUG
@@ -102,30 +101,30 @@ int test_ftrmm(std::ostream & report, const Field & F)
assert(D);
typedef typename Field::RandIter RandIter;
+ typedef typename Field::NonZeroRandIter NonZeroRandIter;
report << '#' ;
RandIter G(F);
- NonzeroRandIter<Field> Gn(F,G);
+ NonZeroRandIter Gn(F,G);
/* init A,B,C and more...*/
for (size_t i = 0 ; i < rows*lda ; ++i) G.random( *(A+i) ) ;
#ifdef _LB_DEBUG
Element * E = new Element[rows*lda]; // copy of A
assert(E);
- FFLAS::fcopy(F,rows*lda,E,1,A,1);
+ FFLAS::fassign(F,rows*lda,A,1,E,1);
// for (size_t i = 0 ; i < rows*lda ; ++i) *(E+i) = *(A+i);
#endif
for (size_t i = 0 ; i < rows*ldb ; ++i) G.random( *(B+i) ) ;
- Element zero ; F.init(zero,0UL);
- for (size_t i = 0 ; i < M*N ; ++i) *(C+i) = zero;
+ for (size_t i = 0 ; i < M*N ; ++i) *(C+i) = F.zero;
// for (size_t i = 0 ; i < rows*ldb ; ++i) *(D+i) = *(B+i);
- FFLAS::fcopy(F,rows*ldb,D,1,B,1);
+ FFLAS::fassign(F,rows*ldb,B,1,D,1);
Element alpha ;
//! @todo F.isInvertible()
//! @todo InvertibleRandomIter
Element invalpha ;
- F.init(invalpha,0UL);
+ F.assign(invalpha,F.zero);
Gn.random(alpha);
// F.init(alpha,1UL);
F.inv(invalpha,alpha);
@@ -205,6 +204,7 @@ int test_ftrmm(std::ostream & report, const Field & F)
else // C = M * L^t
for (size_t i = 0 ; i < M ; ++i)
for (size_t j = 0 ; j < N ; ++j)
+ //! @bug same code as above ?
F.addin(*(C+i*N+j),*(B+i*ldb+j));
else
if (Trans == FFLAS::FflasNoTrans) // C = M * U
@@ -214,6 +214,7 @@ int test_ftrmm(std::ostream & report, const Field & F)
else // C = M * U^t
for (size_t i = 0 ; i < M ; ++i)
for (size_t j = 0 ; j < N ; ++j)
+ //! @bug same code as above ?
F.addin(*(C+i*N+j),*(B+i*ldb+j));
}
else // left
@@ -248,6 +249,7 @@ int test_ftrmm(std::ostream & report, const Field & F)
else // C = M * L^t
for (size_t i = 0 ; i < M ; ++i)
for (size_t j = 0 ; j < N ; ++j)
+ //! @bug same code as above ?
F.axpyin(*(C+i*N+j),*(B+i*ldb+j),*(A+j*lda+j));
else
if (Trans == FFLAS::FflasNoTrans) // C = M * U
@@ -257,6 +259,7 @@ int test_ftrmm(std::ostream & report, const Field & F)
else // C = M * U^t
for (size_t i = 0 ; i < M ; ++i)
for (size_t j = 0 ; j < N ; ++j)
+ //! @bug same code as above ?
F.axpyin(*(C+i*N+j),*(B+i*ldb+j),*(A+j*lda+j));
}
else // left
@@ -269,6 +272,7 @@ int test_ftrmm(std::ostream & report, const Field & F)
else // C = L^t * M
for (size_t i = 0 ; i < M ; ++i)
for (size_t j = 0 ; j < N ; ++j)
+ //! @bug same code as above ?
F.axpyin(*(C+i*N+j),*(A+i*lda+i),*(B+i*ldb+j));
else
if (Trans == FFLAS::FflasNoTrans) // C = U * M
@@ -278,6 +282,7 @@ int test_ftrmm(std::ostream & report, const Field & F)
else // C = M * U^t
for (size_t i = 0 ; i < M ; ++i)
for (size_t j = 0 ; j < N ; ++j)
+ //! @bug same code as above ?
F.axpyin(*(C+i*N+j),*(A+i*lda+i),*(B+i*ldb+j));
}
@@ -311,7 +316,7 @@ int test_ftrmm(std::ostream & report, const Field & F)
{
report<<"#-------------T-------------" <<std::endl;
report << "T :=" ;
- write_field(F,report,UpLo,Diag,E,rows,lda,lda,true);
+ // write_field(F,report,UpLo,Diag,E,rows,lda,lda,true);
report << ':' << std::endl;
report<<"#------------TT--------------" <<std::endl;
report << "TT := " ; write_field(F,report,E,rows,lda,lda,true);
@@ -319,15 +324,15 @@ int test_ftrmm(std::ostream & report, const Field & F)
report<<"#-------------M-------------" <<std::endl;
report << "M :=" ;
- write_field(F,report,D,M,N,ldb,true);
+ // write_field(F,report,D,M,N,ldb,true);
report << ':' << std::endl;
report<<"#------------a--------------" <<std::endl;
report << "alpha := " << alpha << ':' << std::endl;
report<<"#------------C--------------" <<std::endl;
- report << "C := " ; write_field(F,report,C,M,N,N,true);
+ // report << "C := " ; write_field(F,report,C,M,N,N,true);
report << ':' << std::endl;
report << "#------------B--------------" << std::endl;
- report << "B := " ; write_field(F,report,B,M,N,ldb,true);
+ // report << "B := " ; write_field(F,report,B,M,N,ldb,true);
report << ':' << std::endl;
report << "N := alpha * " ;
if (Side == FFLAS::FflasRight)
@@ -373,7 +378,7 @@ int test_ftrmm(std::ostream & report, const Field & F)
int eur = 0 ;
// for (size_t i = 0 ; i < rows*ldb ; ++i) *(B+i) = *(D+i);
- FFLAS::fcopy(F,rows*ldb,B,1,D,1);
+ FFLAS::fassign(F,rows*ldb,D,1,B,1);
if (Diag == FFLAS::FflasNonUnit)
for (size_t i = 0 ; i < K ; ++i) Gn.random(*(A+i*(lda+1))) ; // invertible diag !
FFLAS::ftrmm(F, Side, UpLo, Trans, Diag, M, N, alpha, A, lda, B, ldb);
@@ -427,9 +432,10 @@ int test_applyP(std::ostream & report, const Field & F)
assert(B);
typedef typename Field::RandIter RandIter;
+ typedef typename Field::NonZeroRandIter NonZeroRandIter;
report << '#' ;
RandIter G(F);
- NonzeroRandIter<Field> Gn(F,G);
+ NonZeroRandIter Gn(F,G);
/* init A,B,C and more...*/
for (size_t i = 0 ; i < M*lda ; ++i) G.random( *(A+i) ) ;
@@ -438,19 +444,19 @@ int test_applyP(std::ostream & report, const Field & F)
report << "# testing row applyP" << std::endl;
size_t * P = new size_t[M] ;
- size_t r = random()%M ;
+ size_t r = (size_t)random()%M ;
for (size_t i = 0 ; i < r ; ++i){
- P[i] = i + (size_t)(M-i)*( (std::max(0.,drand48()-1e-6)) ); // histoire de pas tomber sur 1...
+ P[i] = i + (size_t)((double)(M-i)*( (std::max(0.,drand48()-1e-6)))); // histoire de pas tomber sur 1...
// if (P[i] == M) P[i]-- ;
assert(P[i] < M);
}
FFPACK::applyP(F,FFLAS::FflasLeft,FFLAS::FflasNoTrans,
- N, 0,r,
+ N, 0,(int)r,
A,lda,P);
FFPACK::applyP(F,FFLAS::FflasLeft,FFLAS::FflasTrans,
- N, 0,r,
+ N, 0,(int)r,
A,lda,P);
delete[] P ;
int err = 0 ;
@@ -466,19 +472,19 @@ int test_applyP(std::ostream & report, const Field & F)
report << "# testing col applyP" << std::endl;
size_t * Q = new size_t[N] ;
- r = random()%N ;
+ r = (size_t)random()%N ;
for (size_t i = 0 ; i < r ; ++i){
- Q[i] = i + (size_t)(N-i)*( std::max(0.,drand48()-1e-6)) ;
+ Q[i] = i + (size_t)((double)(N-i)*( std::max(0.,drand48()-1e-6)) );
// if (Q[i] == N) P[i]-- ;
assert(Q[i] < N);
}
FFPACK::applyP(F,FFLAS::FflasRight,FFLAS::FflasNoTrans,
- M, 0,r,
+ M, 0,(int)r,
A,lda,Q);
FFPACK::applyP(F,FFLAS::FflasRight,FFLAS::FflasTrans,
- M, 0,r,
+ M, 0,(int)r,
A,lda,Q);
delete[] Q ;
@@ -528,15 +534,16 @@ int test_fgemm(std::ostream & report, const Field & F)
#endif
typedef typename Field::RandIter RandIter;
+ typedef typename Field::NonZeroRandIter NonZeroRandIter;
report << "#" ;
RandIter G(F);
- NonzeroRandIter<Field> Gn(F,G);
+ NonZeroRandIter Gn(F,G);
typedef typename Field::Element Element;
Element alpha, beta ;
// G.random(alpha);
// G.random(beta);
- alpha = Integer::random<false>(2);
+ alpha = (Element)Integer::random<false>(2);
if (abs(alpha) > 1.5 ) G.random(alpha);
//!@bug needs p prime.
beta = Integer::random<false>(2);
@@ -566,7 +573,7 @@ int test_fgemm(std::ostream & report, const Field & F)
for (size_t i = 0 ; i < M ; ++i)
for (size_t j = 0 ; j < N ; ++j) {
Element temp;
- F.init(temp,0UL);
+ F.assign(temp,F.zero);
for (size_t k = 0 ; k < K ; ++k)
F.axpyin(temp,A[i*lda+k],B[k*ldb+j]);
F.mulin(C[i*ldc+j],beta);
@@ -576,7 +583,7 @@ int test_fgemm(std::ostream & report, const Field & F)
for (size_t i = 0 ; i < M ; ++i)
for (size_t j = 0 ; j < N ; ++j) {
Element temp;
- F.init(temp,0UL);
+ F.assign(temp,F.zero);
for (size_t k = 0 ; k < K ; ++k)
F.axpyin(temp,A[i*lda+k],B[j*ldb+k]);
F.mulin(C[i*ldc+j],beta);
@@ -587,7 +594,7 @@ int test_fgemm(std::ostream & report, const Field & F)
for (size_t i = 0 ; i < M ; ++i)
for (size_t j = 0 ; j < N ; ++j) {
Element temp;
- F.init(temp,0UL);
+ F.assign(temp,F.zero);
for (size_t k = 0 ; k < K ; ++k)
F.axpyin(temp,A[k*lda+i],B[k*ldb+j]);
F.mulin(C[i*ldc+j],beta);
@@ -597,7 +604,7 @@ int test_fgemm(std::ostream & report, const Field & F)
for (size_t i = 0 ; i < M ; ++i)
for (size_t j = 0 ; j < N ; ++j) {
Element temp;
- F.init(temp,0UL);
+ F.assign(temp,F.zero);
for (size_t k = 0 ; k < K ; ++k)
F.axpyin(temp,A[k*lda+i],B[j*ldb+k]);
F.mulin(C[i*ldc+j],beta);
@@ -629,14 +636,14 @@ int test_fgemm(std::ostream & report, const Field & F)
int main(int ac, char ** av)
{
- //typedef ModularBalanced<float> FieldF;
- typedef Modular<float> FieldF;
- //typedef ModularBalanced<double> FieldD;
- typedef Modular<double> FieldD;
- //typedef ModularBalanced<int32_t> FieldI;
- typedef Modular<int32_t> FieldI;
+ //typedef Givaro::ModularBalanced<float> FieldF;
+ typedef Givaro::Modular<float> FieldF;
+ //typedef Givaro::ModularBalanced<double> FieldD;
+ typedef Givaro::Modular<double> FieldD;
+ //typedef Givaro::ModularBalanced<int32_t> FieldI;
+ typedef Givaro::Modular<int32_t> FieldI;
//!@bug : this one completely fails :
- //typedef Modular<Integer> FieldI;
+ //typedef Givaro::Modular<Integer> FieldI;
static Argument as[] = {
END_OF_ARGUMENTS
@@ -644,7 +651,7 @@ int main(int ac, char ** av)
parseArguments (ac, av, as);
- srand(time(NULL));
+ srand((unsigned int)time(NULL));
bool fail = false ;
LinBox::commentator().start("ftrmm and consorts full test suite", "ftrmm et al");
@@ -658,11 +665,11 @@ int main(int ac, char ** av)
FieldF FF(13);
FieldF FF2(1069);
FieldI FI(13);
- FieldI FI2(106739);
+ FieldI FI2(10687);
int tot = 6;
#ifdef __LINBOX_HAVE_INT64
- // typedef ModularBalanced<int64_t> FieldU;
- typedef Modular<int64_t> FieldU;
+ // typedef Givaro::ModularBalanced<int64_t> FieldU;
+ typedef Givaro::Modular<int64_t> FieldU;
FieldU FU(13);
FieldU FU2(13132153);
tot += 2 ;
@@ -847,9 +854,11 @@ int main(int ac, char ** av)
if (fail)
report << "# \033[1;31m>\033[0m ftr(s/m)m failed" << std::endl;
#endif
- int our = tot = 6*_LB_ITERS*2 ;
+
#ifdef __LINBOX_HAVE_INT64
- our = tot = tot+2*_LB_ITERS*2 ;
+ int our = tot = tot+2*_LB_ITERS*2 ;
+#else
+ int our = tot = 6*_LB_ITERS*2 ;
#endif
//-------//
@@ -872,16 +881,18 @@ int main(int ac, char ** av)
#ifdef DEBUG
report << "# \033[1;33m>\033[0m applyP passed " << our << "/" << tot << "tests" <<std::endl;
#endif
- if (our != tot) fail = true;
+ if (our != tot) {
+ fail = true;
#ifdef DEBUG
- if (our != tot)
report << "# \033[1;31m>\033[0m applyP failed" << std::endl;
#endif
+ }
- our = tot = 4*_LB_ITERS*6 ;
#ifdef __LINBOX_HAVE_INT64
our = tot = tot+4*_LB_ITERS*2 ;
+#else
+ our = tot = 4*_LB_ITERS*6 ;
#endif
//-------//
diff --git a/tests/test-generic.h b/tests/test-generic.h
index 6a49bb6..c4611cf 100644
--- a/tests/test-generic.h
+++ b/tests/test-generic.h
@@ -1,19 +1,19 @@
/* linbox/tests/test-generic.h
* Copyright (C) 2001, 2002 Bradford Hovinen
- *
+ *
* ========LICENCE========
* This file is part of the library LinBox.
- *
+ *
* LinBox is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
- *
+ *
* This library 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
* Lesser General Public License for more details.
- *
+ *
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
@@ -45,11 +45,10 @@
#endif // __LINBOX_test_generic_H
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
// Local Variables:
// mode: C++
// tab-width: 8
// indent-tabs-mode: nil
// c-basic-offset: 8
// End:
-
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/tests/test-getentry.C b/tests/test-getentry.C
index f03d9b1..7a7446e 100644
--- a/tests/test-getentry.C
+++ b/tests/test-getentry.C
@@ -6,20 +6,20 @@
*
* --------------------------------------------------------
*
- *
+ *
* ========LICENCE========
* This file is part of the library LinBox.
- *
+ *
* LinBox is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
- *
+ *
* This library 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
* Lesser General Public License for more details.
- *
+ *
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
@@ -40,18 +40,18 @@
#include <iostream>
#include <fstream>
-#include <vector>
+
#include <cstdio>
#include "test-common.h"
#include "linbox/util/commentator.h"
-#include "linbox/field/modular.h"
+#include "linbox/ring/modular.h"
#include "linbox/solutions/getentry.h"
#include "linbox/blackbox/compose.h"
#include "linbox/blackbox/diagonal.h"
#include "linbox/blackbox/scalar-matrix.h"
-#include "linbox/blackbox/sparse.h"
+#include "linbox/matrix/sparse-matrix.h"
#include "linbox/vector/stream.h"
using namespace LinBox;
@@ -63,11 +63,11 @@ bool testGenericBBgetEntry (const Field &F, size_t n)
bool ret = true;
typename Field::Element s, x, z;
ostream &report = commentator().report (Commentator::LEVEL_IMPORTANT, INTERNAL_DESCRIPTION);
- F.init(x, 0);
+ F.assign(x, F.zero);
F.init(s, 2);
- F.init(z, 0);
- ScalarMatrix<Field> B(F, n, s);
- typename GetEntryTags::GenericBB t;
+ F.assign(z, F.zero);
+ ScalarMatrix<Field> B(F, n, n, s);
+ SolutionTags::Generic t;
//getEntry(x, B, 0, n-1, t);
if (n > 1 && !F.isZero(x)) ret = false;
getEntry(x, B, 0, 0, t);
@@ -84,10 +84,10 @@ bool testScalarMatrixgetEntry (const Field &F, size_t n)
ostream &report = commentator().report (Commentator::LEVEL_IMPORTANT, INTERNAL_DESCRIPTION);
report << "scalarmatrix getEntry test (using specialization)" << endl;
typename Field::Element s, t, r, th;
- F.init(r, 0);
+ F.assign(r, F.zero);
F.init(s, 2);
F.init(th, 2);
- ScalarMatrix<Field> B(F, n, s);
+ ScalarMatrix<Field> B(F, n, n, s);
getEntry(t, B, 0, n-1); F.assign(r,t);
report << "0xn-1" << t << endl;
getEntry(t, B, n-1, 0); F.addin(r,t);
@@ -198,10 +198,9 @@ static bool testDenseMatrixgetEntry (const Field &F, size_t n)
}
/* getEntry of diagonal matrix */
-template <class Field>
-static bool testDiagonalgetEntry (const Field &F, VectorStream<vector<typename Field::Element> > &stream)
+template <class Field,class Vector>
+static bool testDiagonalgetEntry (const Field &F, VectorStream<Vector > &stream)
{
- typedef vector <typename Field::Element> Vector;
typedef Diagonal <Field> Blackbox;
commentator().start ("Testing diagonal getEntry", "testDiagonalgetEntry", stream.m ());
@@ -212,7 +211,7 @@ static bool testDiagonalgetEntry (const Field &F, VectorStream<vector<typename F
bool ret = true;
size_t i;
- Vector d;
+ Vector d(F);
typename Field::Element sigma, res, ge;
VectorWrapper::ensureDim (d, stream.dim ());
@@ -226,7 +225,7 @@ static bool testDiagonalgetEntry (const Field &F, VectorStream<vector<typename F
VD.write (report, d);
report << endl;
- F.init (sigma, 0);
+ F.assign(sigma, F.zero);
for (i = 0; i < stream.n (); i++)
F.addin (sigma, VectorWrapper::constRef<Field, Vector> (d, i));
@@ -234,10 +233,10 @@ static bool testDiagonalgetEntry (const Field &F, VectorStream<vector<typename F
F.write (report, sigma);
report << endl;
- Blackbox D (F, d);
+ Blackbox D (d);
- F.init (res, 0);
+ F.assign(res, F.zero);
for (i = 0; i < stream.n (); i++)
F.addin (res, getEntry (ge, D, i, i));
F.addin(res, getEntry (ge, D, 0,stream.n ()-1));
@@ -270,16 +269,16 @@ bool testSpecialCDgetEntry (const Field &F, size_t n)
typedef typename Field::Element Elt;
typedef ScalarMatrix<Field> BB;
typedef Diagonal<Field> DD;
- Elt s, x, t, u;
+ Elt s, x, t, u;
ostream &report = commentator().report (Commentator::LEVEL_IMPORTANT, INTERNAL_DESCRIPTION);
- F.init(x, 0);
+ F.assign(x, F.zero);
F.init(s, 2);
- F.init(t, 0);
- F.init(u, 0);
+ F.assign(t, F.zero);
+ F.assign(u, F.zero);
F.mul(u, s, t);
- BB B(F, n, s);
- vector<Elt> d(n, t);
- DD D(F, d);
+ BB B(F, n, n, s);
+ BlasVector<Field> d(F,n, t);
+ DD D(d);
Compose<DD, BB> CDB (D, B);
Compose<BB, DD> CBD (B, D);
Compose<DD, DD> CDD (D, D);
@@ -314,16 +313,16 @@ int main (int argc, char **argv)
END_OF_ARGUMENTS
};
- typedef Modular<int32_t> Field;
- typedef vector<Field::Element> Vector;
+ typedef Givaro::Modular<int32_t> Field;
+ typedef BlasVector<Field> Vector;
parseArguments (argc, argv, args);
- Field F (q);
+ Field F (q); Field::RandIter gen(F);
commentator().getMessageClass (INTERNAL_DESCRIPTION).setMaxDepth (3);
commentator().start("getEntry solution test suite", "getEntry");
- RandomDenseStream<Field, Vector> stream (F, n, iterations);
+ RandomDenseStream<Field, Vector> stream (F, gen, n, (unsigned int)iterations);
if (!testGenericBBgetEntry (F, n)) pass = false;
if (!testScalarMatrixgetEntry (F, n)) pass = false;
@@ -336,11 +335,10 @@ int main (int argc, char **argv)
return pass ? 0 : -1;
}
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
// Local Variables:
// mode: C++
// tab-width: 8
// indent-tabs-mode: nil
// c-basic-offset: 8
// End:
-
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/tests/test-gf2.C b/tests/test-gf2.C
index 4ac790d..9dfd747 100644
--- a/tests/test-gf2.C
+++ b/tests/test-gf2.C
@@ -3,28 +3,28 @@
* Copyright (C) 2003 Bradford Hovinen,
*
* Written by Bradford Hovinen <hovinen at cis.udel.edu>,
- *
+ * Updated Mar2016 -bds
* ------------------------------------
* 2002-04-10 Bradford Hovinen <hovinen at cis.udel.edu>
*
* Rename from test-large-modular.C to test-modular.C; made other updates in
- * accordance with changes to Modular interace.
+ * accordance with changes to Givaro::Modular interace.
* ------------------------------------
*
- *
+ *
* ========LICENCE========
* This file is part of the library LinBox.
- *
+ *
* LinBox is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
- *
+ *
* This library 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
* Lesser General Public License for more details.
- *
+ *
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
@@ -32,275 +32,34 @@
*.
*/
-
/*! @file tests/test-gf2.C
* @ingroup tests
- * @brief no doc
- * @test NO DOC
+ * @brief basic field functionality check
*/
-
-
#include "linbox/linbox-config.h"
-
-#include <iostream>
-#include <fstream>
-#include <sstream>
-#include <vector>
-#include <queue>
-
#include "linbox/field/gf2.h"
-#include "linbox/field/modular.h"
-
#include "test-field.h"
-// #include "test-generic.h"
-// #include "test-vector-domain.h"
using namespace LinBox;
-//using uint16_t;
-//using uint32_t;
-
-#pragma message "#warning much of the code is dead here"
-
-#if 0 /* dead code */
-static bool testDotProductGF2 (const GF2 &F, const char *, //desc,
- VectorStream<Vector<GF2>::Dense> &stream1,
- VectorStream<Vector<GF2>::Dense> &stream2)
-{
- LinBox::commentator().start ("Testing GF2 dot product (dense/dense)", "testDotProduct", stream1.size ());
-
- bool ret = true;
-
- Vector<GF2>::Dense v1, v2;
-
- Modular<uint16_t> MF (2);
- VectorDomain<Modular<uint16_t> > MF_VD (MF);
-
- LinBox::Vector<Modular<uint16_t> >::Dense w1 (stream1.dim ()), w2 (stream1.dim ());
-
- uint16_t sigma;
- bool rho;
-
- LinBox::VectorDomain<GF2> VD (F);
-
- v1.resize (stream1.dim ());
- v2.resize (stream2.dim ());
-
- Vector<GF2>::Dense::const_iterator i1;
- Vector<GF2>::Dense::const_iterator i2;
- Vector<Modular<uint16_t> >::Dense::iterator j1, j2;
-
- Timer timer;
- double totaltime = 0.0;
-
- while (stream1 && stream2) {
- LinBox::commentator().startIteration ((unsigned int)stream1.j ());
-
- stream1.next (v1);
- stream2.next (v2);
-
- // Copy v1 and v2 into w1 and w2
- for (i1 = v1.begin (), j1 = w1.begin (); i1 != v1.end (); ++i1, ++j1) {
- if (*i1)
- *j1 = 1;
- else
- *j1 = 0;
- }
-
- for (i2 = v2.begin (), j2 = w2.begin (); i2 != v2.end (); ++i2, ++j2) {
- if (*i2)
- *j2 = 1;
- else
- *j2 = 0;
- }
-
- std::ostream &report = LinBox::commentator().report (LinBox::Commentator::LEVEL_UNIMPORTANT, INTERNAL_DESCRIPTION);
- report << "Input vector 1: ";
- VD.write (report, v1) << std::endl;
-
- report << "Input vector 2: ";
- VD.write (report, v2) << std::endl;
-
- timer.start ();
- VD.dot (rho, v1, v2);
- timer.stop ();
- totaltime += timer.realtime ();
-
- MF_VD.dot (sigma, w1, w2);
- sigma &= 1;
-
- report << "True dot product: ";
- F.write (report, sigma) << std::endl;
-
- report << "Dot product from vector domain: ";
- F.write (report, rho) << std::endl;
-
- if ((sigma && !rho) || (rho && !sigma)) {
- ret = false;
- LinBox::commentator().report (LinBox::Commentator::LEVEL_IMPORTANT, INTERNAL_ERROR)
- << "ERROR: Dot products are not equal" << std::endl;
- }
-
- LinBox::commentator().stop ("done");
- LinBox::commentator().progress ();
- }
-
- LinBox::commentator().report (LinBox::Commentator::LEVEL_IMPORTANT, TIMING_MEASURE)
- << "Average time for dot product: " << totaltime / (double)stream1.m () << std::endl;
-
- LinBox::commentator().stop (MSG_STATUS (ret), (const char *) 0, "testDotProduct");
-
- stream1.reset ();
- stream2.reset ();
-
- return ret;
-}
-
-static bool testDotProductGF2 (const GF2 &F, const char *, //desc,
- VectorStream<Vector<GF2>::Dense> &stream1,
- VectorStream<Vector<GF2>::Sparse> &stream2)
-{
- LinBox::commentator().start ("Testing GF2 dot product (dense/sparse)", "testDotProduct", stream1.size ());
-
- bool ret = true;
-
- Vector<GF2>::Dense v1;
- Vector<GF2>::Sparse v2;
-
- Modular<uint16_t> MF (2);
- VectorDomain<Modular<uint16_t> > MF_VD (MF);
-
- LinBox::Vector<Modular<uint16_t> >::Dense w1 (stream1.dim ());
- LinBox::Vector<Modular<uint16_t> >::SparseSeq w2;
-
- uint16_t sigma;
- bool rho;
-
- LinBox::VectorDomain<GF2> VD (F);
-
- v1.resize (stream1.dim ());
-
- Vector<GF2>::Dense::const_iterator i1;
- Vector<GF2>::Sparse::const_iterator i2;
- Vector<Modular<uint16_t> >::Dense::iterator j1;
-
- Timer timer;
- double totaltime = 0.0;
-
- while (stream1 && stream2) {
- LinBox::commentator().startIteration ((unsigned int)stream1.j ());
-
- stream1.next (v1);
- stream2.next (v2);
-
- // Copy v1 and v2 into w1 and w2
- for (i1 = v1.begin (), j1 = w1.begin (); i1 != v1.end (); ++i1, ++j1) {
- if (*i1)
- *j1 = 1;
- else
- *j1 = 0;
- }
-
- w2.clear ();
-
- for (i2 = v2.begin (); i2 != v2.end (); ++i2)
- w2.push_back (std::pair<size_t, uint16_t> (*i2, 1));
-
- std::ostream &report = LinBox::commentator().report (LinBox::Commentator::LEVEL_UNIMPORTANT, INTERNAL_DESCRIPTION);
- report << "Input vector 1: ";
- VD.write (report, v1) << std::endl;
-
- report << "Input vector 2: ";
- VD.write (report, v2) << std::endl;
-
- timer.start ();
- VD.dot (rho, v1, v2);
- timer.stop ();
- totaltime += timer.realtime ();
-
- MF_VD.dot (sigma, w1, w2);
- sigma &= 1;
-
- report << "True dot product: ";
- F.write (report, sigma) << std::endl;
-
- report << "Dot product from vector domain: ";
- F.write (report, rho) << std::endl;
-
- if ((sigma && !rho) || (rho && !sigma)) {
- ret = false;
- LinBox::commentator().report (LinBox::Commentator::LEVEL_IMPORTANT, INTERNAL_ERROR)
- << "ERROR: Dot products are not equal" << std::endl;
- }
-
- LinBox::commentator().stop ("done");
- LinBox::commentator().progress ();
- }
-
- LinBox::commentator().report (LinBox::Commentator::LEVEL_IMPORTANT, TIMING_MEASURE)
- << "Average time for dot product: " << totaltime / (double)stream1.m () << std::endl;
-
- LinBox::commentator().stop (MSG_STATUS (ret), (const char *) 0, "testDotProduct");
-
- stream1.reset ();
- stream2.reset ();
-
- return ret;
-}
-#endif
int main (int argc, char **argv)
{
- static unsigned int n = 1000;
- static int iterations = 2;
- static int trials = 100000;
- static int categories = 100;
- static int hist_level = 1;
+ static unsigned int n = 100;
static Argument args[] = {
{ 'n', "-n N", "Set dimension of test vectors to NxN.", TYPE_INT, &n },
- { 'i', "-i I", "Perform each test for I iterations.", TYPE_INT, &iterations },
- { 't', "-t T", "Number of trials for the random iterator test.", TYPE_INT, &trials },
- { 'c', "-c C", "Number of categories for the random iterator test.", TYPE_INT, &categories },
- { 'H', "-H H", "History level for random iterator test.", TYPE_INT, &hist_level },
END_OF_ARGUMENTS
};
-
parseArguments (argc, argv, args);
- commentator().start("GF2 field test suite", "GF2");
bool pass = true;
+ commentator().start("GF2 field test suite", "GF2");
GF2 F;
- uint32_t seed = (unsigned)time (NULL);
-
- RandomDenseStreamGF2 stream1 (F, seed, n, iterations), stream2 (F, seed ^ 0xdeadbeef, n, iterations);
- RandomSparseStreamGF2<Vector<GF2>::Sparse>
- stream3 (F, seed + 2, 0.1, n, iterations),
- stream4 (F, seed + 3, 0.1, n, iterations);
-
- // Make sure some more detailed messages get printed
- commentator().getMessageClass (INTERNAL_DESCRIPTION).setMaxDepth (4);
- commentator().getMessageClass (INTERNAL_DESCRIPTION).setMaxDetailLevel (Commentator::LEVEL_UNIMPORTANT);
-
- commentator().start ("Testing GF2", "main", 10);
-
-
- if ( not testField (F, "GF2"))
- pass = false;
- commentator().progress ();
-
-/*
- if ( not testDotProductGF2 (F, "Testing dot prod", stream1, stream3))
- pass = false;
- commentator().progress ();
-*/
-#if 0
- FieldArchetype K(new LargeModular(101));
- if (!testField<FieldArchetype> (K, "Testing archetype with envelope of Modular field"))
- pass = false;
-#endif
+ pass = pass and testField (F, "GF2");
+ pass = pass and runFieldTests (F, "GF2", 1, n, false);
commentator().stop("GF2 field test suite");
return pass ? 0 : -1;
diff --git a/tests/test-givaro-fields.C b/tests/test-givaro-fields.C
deleted file mode 100644
index f0c5be4..0000000
--- a/tests/test-givaro-fields.C
+++ /dev/null
@@ -1,180 +0,0 @@
-/* -*- mode: C++; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
-
-/* tests/test-givaro-fields.C
- * -bds 2012.
- * Merger of test-givaro-zpz.C and test-givaro-zpzuns.C
- * written by Pascal Giorgi <pascal.giorgi at ens-lyon.fr>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2 of the License, or (at your option) any later version.
- *
- * This library 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the
- * Free Software Foundation, Inc., 51 Franklin Street - Fifth Floor,
- * Boston, MA 02110-1301, USA.
- */
-
-
-/*! @file tests/test-givaro-fields.C
- * @ingroup tests
- * @brief test fields build on Givaro
- * @test NO DOC
- */
-
-
-
-#include "linbox/linbox-config.h"
-
-#include <iostream>
-#include <fstream>
-#include <vector>
-
-#include "linbox/field/givaro.h"
-
-#include "test-common.h"
-#include "test-field.h"
-
-#ifndef TEST_ARCHETYPES
-#define TEST_ARCHETYPES 1
-#endif
-
-using namespace LinBox;
-
-int main (int argc, char **argv)
-{
- static integer q = 10733;
- static size_t n = 10000;
- static int iterations = 10;
- static int e = 3;
- static int trials = 10000;
- static int categories = 1000;
- static int hist_level = 10;
-
-
- static Argument args[] = {
- { 'q', "-q Q", "Operate over the \"field\" GF(Q) [1].", TYPE_INTEGER, &q },
- { 'e', "-e E", "Use GF(q^e) for the extension field [1].", TYPE_INT, &e },
- { 'n', "-n N", "Set dimension of test vectors to NxN.", TYPE_INT, &n },
- { 'i', "-i I", "Perform each test for I iterations.", TYPE_INT, &iterations },
- { 't', "-t T", "Number of trials for the random iterator test.", TYPE_INT, &trials },
- { 'c', "-c C", "Number of categories for the random iterator test.", TYPE_INT, &categories },
- { 'H', "-H H", "History level for random iterator test.", TYPE_INT, &hist_level },
- END_OF_ARGUMENTS
- };
-
- parseArguments (argc, argv, args);
-
- //cout << endl << "GivaroZpz< Givaro::Std16> field test suite" << endl;
- //cout.flush ();
- bool pass = true;
-
- GivaroZpz< Givaro::Std16> F1 ( (q<256?q:integer(101)) ); // Does not work with q > 256
- GivaroZpz< Givaro::Std32> F2 (q);
- GivaroMontg F3 (39989);
- GivaroGfq F4 (q, 1);
- GivaroGfq F5 (11, e);
- GivaroExtension<GivaroGfq> F6 (F5, e );
- GivaroExtension<> F7 (103, 4 );
- GivaroZpz< Givaro::Log16> F8 ( (q<256?q:integer(101)) ); // Does not work with q > 256
-
- GivaroZpz< Givaro::Unsigned32> F1u (2);
- GivaroZpz< Givaro::Unsigned32> F2u (q);
- GivaroZpz< Givaro::Unsigned32> F3u (3);
- GivaroZpz< Givaro::Unsigned32> F4u (32749);
- GivaroZpz< Givaro::Unsigned32> F5u (65521);
-
-
- LinBox::commentator().start("Givaro-zpz test suite", "GivZpz");
- // Make sure some more detailed messages get printed
- commentator().getMessageClass (INTERNAL_DESCRIPTION).setMaxDepth (4);
- commentator().getMessageClass (INTERNAL_DESCRIPTION).setMaxDetailLevel (Commentator::LEVEL_UNIMPORTANT);
-
- if (!runFieldTests (F1, "GivaroZpz< Givaro::Std16>", iterations, n, false)) pass = false;
- if (!runFieldTests (F2, "GivaroZpz< Givaro::Std32>", iterations, n, false)) pass = false;
- if (!runFieldTests (F3, "GivaroMontg", iterations, n, false)) pass = false;
- if (!runFieldTests (F4, "GivaroGfq (prime)", iterations, n, false)) pass = false;
- if (!runFieldTests (F5, "GivaroGfq (simple extension)", iterations, n, false)) pass = false;
- if (!runFieldTests (F6, "GivaroExtension (small polynomial extension)", iterations, n, false)) pass = false;
- if (!runFieldTests (F7, "GivaroExtension (large polynomial extension)", iterations, n, false)) pass = false;
- if (!runFieldTests (F8, "GivaroLog13", iterations, n, false)) pass = false;
- if (!runFieldTests (F1u, "Unsigned32-2", iterations, n, false)) pass = false;
- if (!runFieldTests (F2u, "Unsigned32-q", iterations, n, false)) pass = false;
- if (!runFieldTests (F3u, "Unsigned32-3", iterations, n, false)) pass = false;
- if (!runFieldTests (F4u, "Unsigned32-32749", iterations, n, false)) pass = false;
- if (!runFieldTests (F5u, "Unsigned32-65521", iterations, n, false)) pass = false;
-
-
- if (!testRandomIterator (F1, "GivaroZpz< Givaro::Std16>", trials, categories, hist_level)) pass = false;
- if (!testRandomIterator (F2, "GivaroZpz< Givaro::Std32>", trials, categories, hist_level)) pass = false;
- if (!testRandomIterator (F3, "GivaroMontgomery", trials, categories, hist_level)) pass = false;
- if (!testRandomIterator (F4, "GivaroGfq (prime)", trials, categories, hist_level)) pass = false;
- if (!testRandomIterator (F5, "GivaroGfq (simple extension)", trials, categories, hist_level)) pass = false;
- if (!testRandomIterator (F6, "GivaroExtension (small polynomial extension)", trials, categories, hist_level)) pass = false;
- if (!testRandomIterator (F7, "GivaroExtension (large polynomial extension)", trials, categories, hist_level)) pass = false;
- if (!testRandomIterator (F1u, "GivaroZpz< Givaro::Unsigned32>(2)", trials, categories, hist_level)) pass = false;
- if (!testRandomIterator (F2u, "GivaroZpz< Givaro::Unsigned32>(q)", trials, categories, hist_level)) pass = false;
- if (!testRandomIterator (F3u, "GivaroZpz< Givaro::Unsigned32>(3)", trials, categories, hist_level)) pass = false;
- if (!testRandomIterator (F4u, "GivaroZpz< Givaro::Unsigned32>(32749)", trials, categories, hist_level)) pass = false;
- if (!testRandomIterator (F5u, "GivaroZpz< Givaro::Unsigned32>(65521)", trials, categories, hist_level)) pass = false;
-
-
-
-
-#if TEST_ARCHETYPES
-
- GivaroZpz< Givaro::Std16> * K1g = new GivaroZpz< Givaro::Std16> (101);
- FieldArchetype K1(K1g);
- if (!testField<FieldArchetype> (K1, "Testing archetype with envelope of GivaroZpz< Givaro::Std16> field"))
- pass = false;
- delete K1g;
-#endif
-
-#if TEST_ARCHETYPES
- GivaroZpz< Givaro::Std32> * K2g = new GivaroZpz< Givaro::Std32>(101);
- FieldArchetype K2(K2g);
-
- if (!testField<FieldArchetype> (K2, "Testing archetype with envelope of GivaroZpz< Givaro::Std32> field"))
- pass = false;
- delete K2g;
-#endif
-
-#if TEST_ARCHETYPES
- GivaroZpz< Givaro::Log16> * K3g = new GivaroZpz< Givaro::Log16>(101);
- FieldArchetype K3(K3g);
-
- if (!testField<FieldArchetype> (K3, "Testing archetype with envelope of GivaroZpz< Givaro::Log16> field"))
- pass = false;
- delete K3g;
-#endif
-
-#if TEST_ARCHETYPES
- GivaroZpz< Givaro::Unsigned32> * K2gu = new GivaroZpz< Givaro::Unsigned32> (101);
- FieldArchetype K2u(K2gu);
- if (!testField<FieldArchetype> (K2u, "Testing archetype with envelope of GivaroZpz< Givaro::Unsigned32> field"))
- pass = false;
- delete K2gu;
-#endif
-
-#if TEST_ARCHETYPES
- GivaroGfq * K4g = new GivaroGfq (101,1);
- FieldArchetype K4(K4g);
-
- if (!testField<FieldArchetype> (K4, "Testing archetype with envelope of GivaroGfq prime field"))
- pass = false;
- delete K4g;
-#endif
-
-
- LinBox::commentator().stop(MSG_STATUS (pass), "GivaroZpz test suite");
- return pass ? 0 : -1;
-}
-
-
diff --git a/tests/test-givaro-zpz.C b/tests/test-givaro-zpz.C
new file mode 100644
index 0000000..f6d1801
--- /dev/null
+++ b/tests/test-givaro-zpz.C
@@ -0,0 +1,190 @@
+
+/* tests/test-givaro-zpz.C
+ * Copyright (C) 2002 Pascal Giorgi
+ *
+ * Written by Pascal Giorgi <pascal.giorgi at ens-lyon.fr>
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ * ========LICENCE========
+ */
+
+
+/*! @file tests/test-givaro-zpz.C
+ * @ingroup tests
+ * @brief no doc
+ * @test NO DOC
+ */
+
+
+
+#include "linbox/linbox-config.h"
+
+#include <iostream>
+#include <fstream>
+
+
+#include "givaro/modular.h"
+#include "givaro/montgomery.h"
+#include "givaro/gfq.h"
+
+#include "test-common.h"
+#include "test-field.h"
+
+#ifndef TEST_ARCHETYPES
+#define TEST_ARCHETYPES 1
+#endif
+
+using namespace LinBox;
+
+int main (int argc, char **argv)
+{
+ static integer q = 10733;
+ static size_t n = 10000;
+ static int iterations = 10;
+ static int e = 3;
+ static int trials = 10000;
+ static int categories = 1000;
+ static int hist_level = 10;
+
+
+ static Argument args[] = {
+ { 'q', "-q Q", "Operate over the \"field\" GF(Q) [1].", TYPE_INTEGER, &q },
+ { 'e', "-e E", "Use GF(q^e) for the extension field [1].", TYPE_INT, &e },
+ { 'n', "-n N", "Set dimension of test vectors to NxN.", TYPE_INT, &n },
+ { 'i', "-i I", "Perform each test for I iterations.", TYPE_INT, &iterations },
+ { 't', "-t T", "Number of trials for the random iterator test.", TYPE_INT, &trials },
+ { 'c', "-c C", "Number of categories for the random iterator test.", TYPE_INT, &categories },
+ { 'H', "-H H", "History level for random iterator test.", TYPE_INT, &hist_level },
+ END_OF_ARGUMENTS
+ };
+
+ parseArguments (argc, argv, args);
+
+ //cout << endl << "Givaro::Modular< int16_t> field test suite" << endl;
+ //cout.flush ();
+ bool pass = true;
+
+ Givaro::Modular< int16_t> F1 ( (q<256?q:integer(101)) ); // Does not work with q > 256
+ Givaro::Modular< int32_t> F2 (q);
+ Givaro::Montgomery< int32_t > F3 (39989);
+ Givaro::GFqDom<int64_t> F4 (q, 1);
+ Givaro::GFqDom<int64_t> F5 (11, e);
+ Givaro::Extension<Givaro::GFqDom<int64_t>> F6 (F5, e );
+ Givaro::Extension<> F7 (103, 4 );
+ Givaro::Modular< Givaro::Log16> F8 ( (q<256?q:integer(101)) ); // Does not work with q > 256
+
+ Givaro::Modular< uint32_t> F1u (2);
+ Givaro::Modular< uint32_t> F2u (q);
+ Givaro::Modular< uint32_t> F3u (3);
+ Givaro::Modular< uint32_t> F4u (32749);
+ Givaro::Modular< uint32_t> F5u (65521);
+
+
+ LinBox::commentator().start("Givaro-zpz test suite", "GivZpz");
+ // Make sure some more detailed messages get printed
+ commentator().getMessageClass (INTERNAL_DESCRIPTION).setMaxDepth (4);
+ commentator().getMessageClass (INTERNAL_DESCRIPTION).setMaxDetailLevel (Commentator::LEVEL_UNIMPORTANT);
+
+ if (!runFieldTests (F1, "Givaro::Modular< int16_t>", (unsigned int)iterations, n, false)) pass = false;
+ if (!runFieldTests (F2, "Givaro::Modular< int32_t>", (unsigned int)iterations, n, false)) pass = false;
+ if (!runFieldTests (F3, "Givaro::Montgomery< int32_t >", (unsigned int)iterations, n, false)) pass = false;
+ if (!runFieldTests (F4, "Givaro::GFqDom<int64_t> (prime)", (unsigned int)iterations, n, false)) pass = false;
+ if (!runFieldTests (F5, "Givaro::GFqDom<int64_t> (simple extension)", (unsigned int)iterations, n, false)) pass = false;
+ if (!runFieldTests (F6, "Givaro::Extension (small polynomial extension)", (unsigned int)iterations, n, false)) pass = false;
+ if (!runFieldTests (F7, "Givaro::Extension (large polynomial extension)", (unsigned int)iterations, n, false)) pass = false;
+ if (!runFieldTests (F8, "GivaroLog13", (unsigned int)iterations, n, false)) pass = false;
+ if (!runFieldTests (F1u, "Unsigned32-2", (unsigned int)iterations, n, false)) pass = false;
+ if (!runFieldTests (F2u, "Unsigned32-q", (unsigned int)iterations, n, false)) pass = false;
+ if (!runFieldTests (F3u, "Unsigned32-3", (unsigned int)iterations, n, false)) pass = false;
+ if (!runFieldTests (F4u, "Unsigned32-32749", (unsigned int)iterations, n, false)) pass = false;
+ if (!runFieldTests (F5u, "Unsigned32-65521", (unsigned int)iterations, n, false)) pass = false;
+
+
+ if (!testRandomIterator (F1, "Givaro::Modular< int16_t>", (unsigned int)trials, (unsigned int)categories, (unsigned int)hist_level)) pass = false;
+ if (!testRandomIterator (F2, "Givaro::Modular< int32_t>", (unsigned int)trials, (unsigned int)categories, (unsigned int)hist_level)) pass = false;
+ if (!testRandomIterator (F3, "Givaro::Montgomery< int32_t >", (unsigned int)trials, (unsigned int)categories, (unsigned int)hist_level)) pass = false;
+ if (!testRandomIterator (F4, "Givaro::GFqDom<int64_t> (prime)", (unsigned int)trials, (unsigned int)categories, (unsigned int)hist_level)) pass = false;
+ if (!testRandomIterator (F5, "Givaro::GFqDom<int64_t> (simple extension)", (unsigned int)trials, (unsigned int)categories, (unsigned int)hist_level)) pass = false;
+ if (!testRandomIterator (F6, "Givaro::Extension (small polynomial extension)", (unsigned int)trials, (unsigned int)categories, (unsigned int)hist_level)) pass = false;
+ if (!testRandomIterator (F7, "Givaro::Extension (large polynomial extension)", (unsigned int)trials, (unsigned int)categories, (unsigned int)hist_level)) pass = false;
+ if (!testRandomIterator (F1u, "Givaro::Modular< uint32_t>(2)", (unsigned int)trials, (unsigned int)categories, (unsigned int)hist_level)) pass = false;
+ if (!testRandomIterator (F2u, "Givaro::Modular< uint32_t>(q)", (unsigned int)trials, (unsigned int)categories, (unsigned int)hist_level)) pass = false;
+ if (!testRandomIterator (F3u, "Givaro::Modular< uint32_t>(3)", (unsigned int)trials, (unsigned int)categories, (unsigned int)hist_level)) pass = false;
+ if (!testRandomIterator (F4u, "Givaro::Modular< uint32_t>(32749)", (unsigned int)trials, (unsigned int)categories, (unsigned int)hist_level)) pass = false;
+ if (!testRandomIterator (F5u, "Givaro::Modular< uint32_t>(65521)", (unsigned int)trials, (unsigned int)categories, (unsigned int)hist_level)) pass = false;
+
+
+
+
+#if TEST_ARCHETYPES
+
+ Givaro::Modular< int16_t> * K1g = new Givaro::Modular< int16_t> (101);
+ FieldArchetype K1(K1g);
+ if (!testField<FieldArchetype> (K1, "Testing archetype with envelope of Givaro::Modular< int16_t> field"))
+ pass = false;
+ delete K1g;
+#endif
+
+#if TEST_ARCHETYPES
+ Givaro::Modular< int32_t> * K2g = new Givaro::Modular< int32_t>(101);
+ FieldArchetype K2(K2g);
+
+ if (!testField<FieldArchetype> (K2, "Testing archetype with envelope of Givaro::Modular< int32_t> field"))
+ pass = false;
+ delete K2g;
+#endif
+
+#if TEST_ARCHETYPES
+ Givaro::Modular< Givaro::Log16> * K3g = new Givaro::Modular< Givaro::Log16>(101);
+ FieldArchetype K3(K3g);
+
+ if (!testField<FieldArchetype> (K3, "Testing archetype with envelope of Givaro::Modular< Givaro::Log16> field"))
+ pass = false;
+ delete K3g;
+#endif
+
+#if TEST_ARCHETYPES
+ Givaro::Modular< uint32_t> * K2gu = new Givaro::Modular< uint32_t> (101);
+ FieldArchetype K2u(K2gu);
+ if (!testField<FieldArchetype> (K2u, "Testing archetype with envelope of Givaro::Modular< uint32_t> field"))
+ pass = false;
+ delete K2gu;
+#endif
+
+#if TEST_ARCHETYPES
+ Givaro::GFqDom<int64_t> * K4g = new Givaro::GFqDom<int64_t> (101,1);
+ FieldArchetype K4(K4g);
+
+ if (!testField<FieldArchetype> (K4, "Testing archetype with envelope of Givaro::GFqDom<int64_t> prime field"))
+ pass = false;
+ delete K4g;
+#endif
+
+
+ LinBox::commentator().stop(MSG_STATUS (pass), "Givaro::Modular test suite");
+ return pass ? 0 : -1;
+}
+
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+
diff --git a/tests/test-givaro-zpzuns.C b/tests/test-givaro-zpzuns.C
new file mode 100644
index 0000000..bb501f7
--- /dev/null
+++ b/tests/test-givaro-zpzuns.C
@@ -0,0 +1,150 @@
+
+/* tests/test-givaro-zpz.C
+ * Copyright (C) 2002 Pascal Giorgi
+ *
+ * Written by Pascal Giorgi <pascal.giorgi at ens-lyon.fr>
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ * ========LICENCE========
+ */
+
+
+/*! @file tests/test-givaro-zpzuns.C
+ * @ingroup tests
+ * @brief no doc
+ * @test NO DOC
+ */
+
+
+
+#include "linbox/linbox-config.h"
+
+#include <iostream>
+#include <fstream>
+
+
+#include "givaro/modular.h"
+
+#include "test-common.h"
+#include "test-field.h"
+
+#ifndef TEST_ARCHETYPES
+#define TEST_ARCHETYPES 1
+#endif
+
+using namespace LinBox;
+
+int main (int argc, char **argv)
+{
+ static integer q = 10733;
+ static size_t n = 10000;
+ static unsigned int iterations = 10;
+ static int e;
+ static unsigned int trials = 10000;
+ static unsigned int categories = 1000;
+ static unsigned int hist_level = 10;
+
+
+ static Argument args[] = {
+ { 'q', "-q Q", "Operate over the \"field\" GF(Q) [1].", TYPE_INTEGER, &q },
+ { 'e', "-e E", "Use GF(q^e) for the extension field [1].", TYPE_INT, &e },
+ { 'n', "-n N", "Set dimension of test vectors to NxN.", TYPE_INT, &n },
+ { 'i', "-i I", "Perform each test for I iterations.", TYPE_INT, &iterations },
+ { 't', "-t T", "Number of trials for the random iterator test.", TYPE_INT, &trials },
+ { 'c', "-c C", "Number of categories for the random iterator test.", TYPE_INT, &categories },
+ { 'H', "-H H", "History level for random iterator test.", TYPE_INT, &hist_level },
+ END_OF_ARGUMENTS
+ };
+
+ parseArguments (argc, argv, args);
+
+ //cout << endl << "Givaro::Modular< uint32_t> field test suite" << endl;
+ //cout.flush ();
+ bool pass = true;
+
+ Givaro::Modular< uint32_t> F1 (2);
+ Givaro::Modular< uint32_t> F2 (q);
+ Givaro::Modular< uint32_t> F3 (3);
+ Givaro::Modular< uint32_t> F4 (32749);
+ Givaro::Modular< uint32_t> F5 (65521);
+
+ LinBox::commentator().start("Givaro-zpzuns test suite", "GivZpzu");
+ // Make sure some more detailed messages get printed
+ commentator().getMessageClass (INTERNAL_DESCRIPTION).setMaxDepth (4);
+ commentator().getMessageClass (INTERNAL_DESCRIPTION).setMaxDetailLevel (Commentator::LEVEL_UNIMPORTANT);
+
+ if (!runFieldTests (F1, "2", iterations, n, false)) pass = false;
+ if (!runFieldTests (F2, "10733", iterations, n, false)) pass = false;
+ if (!runFieldTests (F3, "3", iterations, n, false)) pass = false;
+ if (!runFieldTests (F4, "32749", iterations, n, false)) pass = false;
+ if (!runFieldTests (F5, "65521", iterations, n, false)) pass = false;
+
+ if (!testRandomIterator (F1, "Givaro::Modular< uint32_t>(2)", trials, categories, hist_level)) pass = false;
+ if (!testRandomIterator (F2, "Givaro::Modular< uint32_t>(10733)", trials, categories, hist_level)) pass = false;
+ if (!testRandomIterator (F3, "Givaro::Modular< uint32_t>(3)", trials, categories, hist_level)) pass = false;
+ if (!testRandomIterator (F4, "Givaro::Modular< uint32_t>(32749)", trials, categories, hist_level)) pass = false;
+ if (!testRandomIterator (F5, "Givaro::Modular< uint32_t>(65521)", trials, categories, hist_level)) pass = false;
+
+#if TEST_ARCHETYPES
+
+ Givaro::Modular< int16_t> * K1g = new Givaro::Modular< int16_t> (101);
+ FieldArchetype K1(K1g);
+ if (!testField<FieldArchetype> (K1, "Testing archetype with envelope of Givaro::Modular< int16_t> field"))
+ pass = false;
+ delete K1g;
+#endif
+
+#if TEST_ARCHETYPES
+ Givaro::Modular< uint32_t> * K2g = new Givaro::Modular< uint32_t> (101);
+ FieldArchetype K2(K2g);
+ if (!testField<FieldArchetype> (K2, "Testing archetype with envelope of Givaro::Modular< uint32_t> field"))
+ pass = false;
+ delete K2g;
+#endif
+
+#if TEST_ARCHETYPES
+ Givaro::Modular< Givaro::Log16> * K3g = new Givaro::Modular< Givaro::Log16>(101);
+ FieldArchetype K3(K3g);
+
+ if (!testField<FieldArchetype> (K3, "Testing archetype with envelope of Givaro::Modular< Givaro::Log16> field"))
+ pass = false;
+ delete K3g;
+#endif
+
+#if TEST_ARCHETYPES
+ Givaro::GFqDom<int64_t> * K4g = new Givaro::GFqDom<int64_t>(101,1);
+ FieldArchetype K4(K4g);
+
+ if (!testField<FieldArchetype> (K4, "Testing archetype with envelope of Givaro::GFqDom<int64_t> prime field"))
+ pass = false;
+ delete K4g;
+#endif
+
+
+ LinBox::commentator().stop(MSG_STATUS (pass), "Givaro::Modularuns test suite");
+ return pass ? 0 : -1;
+}
+
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+
diff --git a/tests/test-givaropoly.C b/tests/test-givaropoly.C
new file mode 100644
index 0000000..79c2479
--- /dev/null
+++ b/tests/test-givaropoly.C
@@ -0,0 +1,96 @@
+
+/* tests/test-givaropoly.C
+ * Copyright (C) 2014 Gavin Harrison,
+ *
+ * Written by Gavin Harrison <gmh33 at drexel.edu>,
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ * ========LICENCE========
+ *.
+ */
+
+
+/*! @file tests/test-gf2.C
+ * @ingroup tests
+ * @brief no doc
+ * @test NO DOC
+ */
+
+
+
+#include "linbox/linbox-config.h"
+
+#include <iostream>
+#include <fstream>
+#include <sstream>
+
+#include <queue>
+
+#include "givaro/givpoly1.h"
+#include "givaro/gfq.h"
+
+#include "test-field.h"
+
+using namespace LinBox;
+
+int main (int argc, char **argv)
+{
+ static int p = 13;
+ static int e = 1;
+
+ static Argument args[] = {
+ { 'p', "-p P", "Set the base field prime.", TYPE_INT, &p },
+ { 'e', "-e E", "Set the base field exponent.", TYPE_INT, &e },
+ END_OF_ARGUMENTS
+ };
+
+ parseArguments (argc, argv, args);
+
+ commentator().start("GivaroPoly field test suite", "GivaroPoly");
+ bool pass = true;
+
+ typedef Givaro::GFqDom<int64_t> BaseDom;
+ typedef typename Givaro::Poly1Dom<BaseDom, Givaro::Dense> PolyDom;
+ typedef typename Givaro::Poly1Dom<PolyDom, Givaro::Dense> Bivariate;
+
+ BaseDom GFq(p, e);
+ PolyDom Poly(GFq);
+ Bivariate F(Poly);
+
+ // Make sure some more detailed messages get printed
+ commentator().getMessageClass (INTERNAL_DESCRIPTION).setMaxDepth (4);
+ commentator().getMessageClass (INTERNAL_DESCRIPTION).setMaxDetailLevel (Commentator::LEVEL_UNIMPORTANT);
+
+ commentator().start ("Testing GivaroPoly", "main", 10);
+
+ if ( not testRing (F, "GivaroPoly"))
+ pass = false;
+ commentator().progress ();
+
+ commentator().stop("GivaroPoly field test suite");
+ return pass ? 0 : -1;
+}
+
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+
diff --git a/tests/test-gmp-rational.C b/tests/test-gmp-rational.C
old mode 100644
new mode 100755
index f02bb6f..5c7e96a
--- a/tests/test-gmp-rational.C
+++ b/tests/test-gmp-rational.C
@@ -8,20 +8,20 @@
*
* ------------------------------------
*
- *
+ *
* ========LICENCE========
* This file is part of the library LinBox.
- *
+ *
* LinBox is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
- *
+ *
* This library 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
* Lesser General Public License for more details.
- *
+ *
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
@@ -40,12 +40,13 @@
#include <iostream>
#include <fstream>
-#include <vector>
+
#include "linbox/field/gmp-rational.h"
#include "test-common.h"
-#include "test-generic.h"
+//#include "test-generic.h"
+#include "test-field.h"
using namespace LinBox;
@@ -71,17 +72,16 @@ int main (int argc, char **argv)
commentator().getMessageClass (INTERNAL_DESCRIPTION).setMaxDepth (4);
commentator().getMessageClass (INTERNAL_DESCRIPTION).setMaxDetailLevel (Commentator::LEVEL_UNIMPORTANT);
- if (!runFieldTests (F, "GMP Rational", iterations, n, false)) pass = false;
+ if (!runFieldTests (F, "GMP Rational", (unsigned int)iterations, n, false,false)) pass = false;
commentator().stop("GMP rational field test suite");
return pass ? 0 : -1;
}
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
// Local Variables:
// mode: C++
// tab-width: 8
// indent-tabs-mode: nil
// c-basic-offset: 8
// End:
-
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/tests/test-hilbert.C b/tests/test-hilbert.C
index 2cba3dd..ae2d4e5 100644
--- a/tests/test-hilbert.C
+++ b/tests/test-hilbert.C
@@ -35,9 +35,9 @@
#include <iostream>
#include <fstream>
-#include <vector>
-#include "linbox/field/modular.h"
+
+#include "linbox/ring/modular.h"
#include "linbox/blackbox/hilbert.h"
#include "test-common.h"
@@ -51,7 +51,7 @@ int main (int argc, char **argv)
bool pass = true;
static size_t n = 10;
- static integer q = 2147483647U;
+ static integer q = 65521U;
static int iterations = 10;
static Argument args[] = {
@@ -62,18 +62,17 @@ int main (int argc, char **argv)
};
parseArguments (argc, argv, args);
- typedef Modular<uint32_t> Field;
+ typedef Givaro::Modular<uint32_t> Field;
Field F (q);
srand ((unsigned)time (NULL));
commentator().start("Hilbert matrix blackbox test suite", "Hilbert");
- typedef vector<Field::Element> Vector;
typedef Hilbert<Field> BB;
BB A (F, n);
- pass = pass && testBlackbox (A);
+ pass = pass && testBlackboxNoRW (A);
commentator().stop("Hilbert matrix blackbox test suite");
return pass ? 0 : -1;
diff --git a/tests/test-hom.C b/tests/test-hom.C
index 2dd48c6..85719be 100644
--- a/tests/test-hom.C
+++ b/tests/test-hom.C
@@ -39,7 +39,7 @@
#include <fstream>
#include <sstream>
-#include "linbox/field/modular.h"
+#include "linbox/ring/modular.h"
#include "linbox/field/hom.h"
#include "test-common.h"
@@ -71,9 +71,9 @@ int main (int argc, char **argv)
commentator().start("Hom test suite", "Hom");
bool pass = true;
- Modular<uint32_t> F_uint32_t ((uint32_t) q);
- Modular<uint16_t> F_uint16_t ((uint16_t) q);
- Hom<Modular<uint16_t>, Modular<uint32_t> > iso(F_uint16_t, F_uint32_t);
+ Givaro::Modular<uint32_t> F_uint32_t ((uint32_t) q);
+ Givaro::Modular<uint16_t> F_uint16_t ((uint16_t) q);
+ Hom<Givaro::Modular<uint16_t>, Givaro::Modular<uint32_t> > iso(F_uint16_t, F_uint32_t);
uint16_t x=2, y;
uint32_t z=2, w;
diff --git a/tests/test-image-field.C b/tests/test-image-field.C
new file mode 100644
index 0000000..276e2a7
--- /dev/null
+++ b/tests/test-image-field.C
@@ -0,0 +1,117 @@
+/* tests/test-hom.C
+ * Copyright (C) LinBox
+ *
+ * Written by Dave Saunders <saunders at cis.udel.edu>
+ *
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ * ========LICENCE========
+ *.
+ */
+
+
+/*! @file tests/test-image-field.C
+ * @ingroup tests
+ * @brief no doc
+ * @test NO DOC
+ */
+
+
+
+#include "linbox/linbox-config.h"
+
+#include <iostream>
+#include <fstream>
+#include <sstream>
+
+#include "linbox/ring/modular.h"
+#include "linbox/field/image-field.h"
+
+#include "test-common.h"
+#include "test-generic.h"
+
+using namespace LinBox;
+
+int main (int argc, char **argv)
+{
+ static integer q = 65521U;
+ static size_t n = 10000;
+ static int iterations = 10;
+ static int trials = 100000;
+ static int categories = 100;
+ static int hist_level = 1;
+
+ static Argument args[] = {
+ { 'q', "-q Q", "Operate over the \"field\" GF(Q) [1] for uint16_t modulus.", TYPE_INTEGER, &q },
+ { 'n', "-n N", "Set dimension of test vectors to NxN.", TYPE_INT, &n },
+ { 'i', "-i I", "Perform each test for I iterations.", TYPE_INT, &iterations },
+ { 't', "-t T", "Number of trials for the random iterator test.", TYPE_INT, &trials },
+ { 'c', "-c C", "Number of categories for the random iterator test.", TYPE_INT, &categories },
+ { 'H', "-H H", "History level for random iterator test.", TYPE_INT, &hist_level },
+ END_OF_ARGUMENTS
+ };
+
+ parseArguments (argc, argv, args);
+
+ cout << endl << "ImageField test suite" << endl;
+ cout.flush ();
+ bool pass = true;
+
+ // need to test generic def, test nonsense attempts, etc.
+
+ Givaro::Modular<uint32_t> F_uint32_t ((uint32_t) q);
+ Givaro::Modular<uint16_t> F_uint16_t ((uint16_t) q);
+ ImageField<Givaro::Modular<uint16_t>, Givaro::Modular<uint32_t> > IF32(F_uint16_t, F_uint32_t);
+
+ uint16_t a=2, b;
+ uint32_t z=2, w;
+ IF32.image(w, a);
+ pass = pass && IF32.areEqual(z, w);
+ IF32.preimage(b, z);
+ pass = pass && F_uint16_t.areEqual(a, b);
+
+ uint32_t x, y;
+ IF32.smul(x, 2, 3);
+ IF32.mul(y, 2, 3);
+ pass = pass && IF32.areEqual(x, y);
+ IF32.smulin(x, 5);
+ IF32.mulin(y, 5);
+ pass = pass && IF32.areEqual(x, y);
+
+ IF32.saxpy(z, 7, x, 11);
+ IF32.axpy(w, 7, x, 11);
+ pass = pass && IF32.areEqual(z, w);
+ IF32.saxpyin(z, 7, x);
+ IF32.axpyin(w, 7, x);
+ pass = pass && IF32.areEqual(z, w);
+ /*
+ */
+
+ cout << endl << "ImageField " << (pass ? "pass" : "FAIL") << endl;
+ cout.flush ();
+ return pass ? 0 : -1;
+}
+
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+
diff --git a/tests/test-inverse.C b/tests/test-inverse.C
index ba153b3..14116c4 100644
--- a/tests/test-inverse.C
+++ b/tests/test-inverse.C
@@ -6,20 +6,20 @@
*
* --------------------------------------------------------
*
- *
+ *
* ========LICENCE========
* This file is part of the library LinBox.
- *
+ *
* LinBox is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
- *
+ *
* This library 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
* Lesser General Public License for more details.
- *
+ *
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
@@ -38,11 +38,11 @@
#include <iostream>
#include <fstream>
-#include <vector>
+
#include <cstdio>
#include "linbox/util/commentator.h"
-#include "linbox/field/modular.h"
+#include "linbox/ring/modular.h"
#include "linbox/blackbox/diagonal.h"
#include "linbox/blackbox/hilbert.h"
#include "linbox/blackbox/inverse.h"
@@ -75,9 +75,8 @@ static bool testIdentityInverse (const Field &F, VectorStream<Vector> &stream)
commentator().start ("Testing identity inverse", "testIdentityInverse", stream.m ());
bool ret = true;
- bool iter_passed = true;
- Vector d;
+ Vector d(F);
VectorDomain<Field> VD (F);
size_t i;
@@ -85,12 +84,12 @@ static bool testIdentityInverse (const Field &F, VectorStream<Vector> &stream)
VectorWrapper::ensureDim (d, stream.n ());
for (i = 0; i < stream.n (); i++)
- F.init (VectorWrapper::ref<Field> (d, i), 1);
+ F.assign(VectorWrapper::ref<Field> (d, i), F.one);
- Blackbox D (F, d);
+ Blackbox D (d);
Inverse<Blackbox> DT (&D);
- Vector v, w;
+ Vector v(F), w(F);
VectorWrapper::ensureDim (v, stream.n ());
VectorWrapper::ensureDim (w, stream.n ());
@@ -98,7 +97,7 @@ static bool testIdentityInverse (const Field &F, VectorStream<Vector> &stream)
while (stream) {
commentator().startIteration ((unsigned)stream.j ());
- iter_passed = true;
+ bool iter_passed = true;
stream.next (v);
@@ -151,14 +150,13 @@ static bool testHilbertInverse (const Field &F, VectorStream<Vector> &stream)
commentator().start ("Testing Hilbert inverse", "testHilbertInverse", stream.m ());
bool ret = true;
- bool iter_passed;
VectorDomain<Field> VD (F);
Blackbox H (F, stream.n ());
Inverse<Blackbox> HT (&H);
- Vector v, w, z;
+ Vector v(F), w(F), z(F);
VectorWrapper::ensureDim (v, stream.n ());
VectorWrapper::ensureDim (w, stream.n ());
@@ -167,7 +165,7 @@ static bool testHilbertInverse (const Field &F, VectorStream<Vector> &stream)
while (stream) {
commentator().startIteration (stream.j ());
- iter_passed = true;
+ bool iter_passed = true;
stream.next (v);
@@ -228,14 +226,13 @@ static bool testVandermondeInverse (const Field &F,
commentator().start ("Testing Vandermonde inverse", "testVandermondeInverse", x_stream.m ());
bool ret = true;
- bool inner_iter_passed;
VectorDomain<Field> VD (F);
size_t j, k;
Blackbox V (F, x_stream.n (), x_stream.n ());
- Vector x, v, w, z;
+ Vector x(F), v(F), w(F), z(F);
typename Field::Element t;
VectorWrapper::ensureDim (x, x_stream.n ());
@@ -257,7 +254,7 @@ static bool testVandermondeInverse (const Field &F,
/* Build the Vandermonde matrix */
for (j = 0; j < x_stream.n (); j++) {
- F.init (t, 1);
+ F.assign(t, F.one);
for (k = 0; k < x_stream.n (); k++) {
V.setEntry (j, k, t);
@@ -269,7 +266,9 @@ static bool testVandermondeInverse (const Field &F,
v_stream.reset ();
+
while (v_stream) {
+ bool inner_iter_passed;
inner_iter_passed = true;
/* Random vector of evaluation results */
@@ -335,11 +334,10 @@ static bool testDiagonalInverse (const Field &F, VectorStream<Vector> &stream)
VectorDomain<Field> VD (F);
bool ret = true;
- bool iter_passed;
size_t j;
- Vector d, di, dt, e, DTe;
+ Vector d(F), di(F), dt(F), e(F), DTe(F);
VectorWrapper::ensureDim (d, stream.n ());
VectorWrapper::ensureDim (di, stream.n ());
@@ -350,7 +348,7 @@ static bool testDiagonalInverse (const Field &F, VectorStream<Vector> &stream)
while (stream) {
commentator().startIteration ((unsigned)stream.j ());
- iter_passed = true;
+ bool iter_passed = true;
stream.next (d);
@@ -366,11 +364,11 @@ static bool testDiagonalInverse (const Field &F, VectorStream<Vector> &stream)
VD.write (report, di);
report << endl;
- Blackbox D (F, d);
+ Blackbox D (d);
Inverse <Blackbox> DT (&D);
for (j = 0; j < stream.n (); j++) {
- F.init (VectorWrapper::ref<Field> (e, j), 1);
+ F.assign(VectorWrapper::ref<Field> (e, j), F.one);
DT.apply (DTe, e);
}
@@ -446,8 +444,8 @@ int main (int argc, char **argv)
bool pass = true;
static size_t n = 10;
- static integer q = 2147483647U;
- static int iterations = 100;
+ static integer q = 65521U;
+ static unsigned int iterations = 2; // 100;
static int N = 1;
static Argument args[] = {
@@ -458,11 +456,12 @@ int main (int argc, char **argv)
END_OF_ARGUMENTS
};
- typedef Modular<uint32_t> Field; //C.Pernet: avoids confusion with givaro::uint32_t
- typedef vector<Field::Element> Vector;
+ //typedef Givaro::Modular<uint32_t> Field; //C.Pernet: avoids confusion with givaro::uint32_t
+ typedef Givaro::Modular<double> Field;
+ typedef BlasVector<Field> Vector;
parseArguments (argc, argv, args);
- Field F (q);
+ Field F (q); Field::RandIter gen(F);
srand ((unsigned)time (NULL));
@@ -470,8 +469,9 @@ int main (int argc, char **argv)
commentator().getMessageClass (INTERNAL_DESCRIPTION).setMaxDepth (3);
- RandomDenseStream<Field, Vector> stream1 (F, n, iterations), stream2 (F, n, iterations);
- RandomDenseStream<Field, Vector> stream3 (F, n, N);
+ RandomDenseStream<Field, Vector> stream1 (F, gen, n, iterations),
+ stream2 (F, gen, n, iterations);
+ RandomDenseStream<Field, Vector> stream3 (F, gen, n, (size_t)N);
if (!testIdentityInverse (F, stream1)) pass = false;
if (!testVandermondeInverse (F, stream1, stream3)) pass = false;
@@ -482,11 +482,10 @@ int main (int argc, char **argv)
return pass ? 0 : -1;
}
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
// Local Variables:
// mode: C++
// tab-width: 8
// indent-tabs-mode: nil
// c-basic-offset: 8
// End:
-
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/tests/test-isposdef.C b/tests/test-isposdef.C
index 8d1c6de..9d40de8 100644
--- a/tests/test-isposdef.C
+++ b/tests/test-isposdef.C
@@ -29,31 +29,25 @@
* @test NO DOC
*/
-
-
#include "linbox/linbox-config.h"
#include <iostream>
-#include <fstream>
-#include <vector>
-#include <cstdio>
#include "linbox/util/commentator.h"
-#include "linbox/blackbox/sparse.h"
+#include "linbox/matrix/sparse-matrix.h"
#include "linbox/solutions/is-positive-definite.h"
-#include "test-common.h"
-
using namespace LinBox;
-/* Test 1: positive definiteness of a random sparse matrix
+/* Positive definiteness check on two specific matrices
*
- * Constructs a random sparse matrix and computes its rank using Gaussian
- * elimination (direct and blas) and Wiedemann's algorithm. Checks that the results match.
+ * Checks that I is found to be pos def and that a slight modification of I (to be singular and have a negative eigenvallue) is found to be not pos def.
+ *
+ * Sparsity is not (yet) used.
*/
-template <class Ring>
-bool testIsPosDef(const Ring &Z, size_t n, unsigned int iterations, double sparsity = 0.05)
+template <class Ring, class Method>
+bool testIsPosDef(const Ring &Z, size_t n, unsigned int iterations, Method &M, std::string methodName, double sparsity = 0.05)
{
typedef SparseMatrix<Ring> Blackbox;
@@ -62,35 +56,34 @@ bool testIsPosDef(const Ring &Z, size_t n, unsigned int iterations, double spars
bool ret = true;
unsigned int i;
- typename Ring::RandIter ri (Z);
-
+ // iterations since there is randomness in the alg (though none in this test).
for (i = 0; i < iterations; ++i) {
commentator().startIteration (i);
Blackbox A (Z, n, n);
- typename Ring::Element e; Z.init(e, 1);
+ typename Ring::Element e; Z.assign(e, Z.one);
for (size_t j = 0; j < n; ++j)
A.setEntry(j, j, e);
std::ostream & report =
commentator().report (Commentator::LEVEL_NORMAL, INTERNAL_DESCRIPTION);
- Z.write( report ) << endl;
- A.write( report ) << endl;
+ Z.write( report ) << std::endl;
+ A.write( report ) << std::endl;
bool p;
- p = isPositiveDefinite(A);
- report << "Positivedefiniteness on I computed by default (Hybrid) method: " << p << endl;
- if (!p) {report << "ERROR: should be pos def" << endl; ret = false;}
+ p = isPositiveDefinite(A,M);
+ report << "Positivedefiniteness on I computed by " << methodName << ", " << p << std::endl;
+ if (!p) {report << "ERROR: should be pos def" << std::endl; ret = false;}
Z.negin(e);
Z. assign(A. refEntry(n/2, n/2), e);
A.setEntry(1, 2, e);
A.setEntry(2, 1, e);
- p = isPositiveDefinite(A);
+ p = isPositiveDefinite(A,M);
report << "Matrix:\n";
- A.write( report ) << endl;
- report << "Positivedefiniteness on indefinite example computed by default (Hybrid) method: " << p << endl;
- if (p) {report << "ERROR: should not be pos def" << endl; ret = false;}
+ A.write( report ) << std::endl;
+ report << "Positivedefiniteness on indefinite example computed by " << methodName << ", " << p << std::endl;
+ if (p) {report << "ERROR: should not be pos def" << std::endl; ret = false;}
commentator().stop ("done");
commentator().progress ();
@@ -112,14 +105,11 @@ int main (int argc, char **argv)
bool pass = true;
static size_t n = 80;
- static integer q = 65519U;
- //static integer q = 1000003U;
- static int iterations = 2;
+ static unsigned int iterations = 2;
static double sparsity = 0.05;
static Argument args[] = {
{ 'n', "-n N", "Set dimension of test matrices to NxN.", TYPE_INT, &n },
- { 'q', "-q Q", "Operate over the \"field\" GF(Q) [1].", TYPE_INTEGER, &q },
{ 'i', "-i I", "Perform each test for I iterations.", TYPE_INT, &iterations },
{ 's', "-s S", "Sparse matrices with density S.", TYPE_DOUBLE, &sparsity },
END_OF_ARGUMENTS
@@ -133,9 +123,14 @@ int main (int argc, char **argv)
commentator().getMessageClass (INTERNAL_DESCRIPTION).setMaxDepth (3);
commentator().getMessageClass (INTERNAL_DESCRIPTION).setMaxDetailLevel (Commentator::LEVEL_NORMAL);
- PID_integer R;
+ Givaro::ZRing<Integer> R;
- if (!testIsPosDef(R, n, iterations, sparsity)) pass = false;
+ Method::Hybrid MH;
+ pass = pass and testIsPosDef(R, n, iterations, MH, "Method::Hybrid", sparsity);
+ Method::Elimination ME;
+ pass = pass and testIsPosDef(R, n, iterations, MH, "Method::Elimination", sparsity);
+ Method::Blackbox MB;
+ pass = pass and testIsPosDef(R, n, iterations, MB, "Method::Blackbox", sparsity);
commentator().stop("IsPositiveDefinite solution test suite");
return pass ? 0 : -1;
diff --git a/tests/test-ispossemidef.C b/tests/test-ispossemidef.C
index 5ac6ee8..a3e90b1 100644
--- a/tests/test-ispossemidef.C
+++ b/tests/test-ispossemidef.C
@@ -1,4 +1,4 @@
-/* tests/test-isposdef.C
+/* tests/test-ispossemidef.C
* Copyright (C) LinBox
*
* -----------------------------------------------------
@@ -36,40 +36,42 @@
#include <iostream>
#include <fstream>
-#include <vector>
+
#include <cstdio>
#include "linbox/util/commentator.h"
-#include "linbox/blackbox/sparse.h"
+#include "linbox/matrix/sparse-matrix.h"
#include "linbox/solutions/is-positive-semidefinite.h"
#include "test-common.h"
using namespace LinBox;
-/* Test 1: positive definiteness of a random sparse matrix
+/* Positive semidefiniteness check on two specific matrices
+ *
+ * Checks that a slight mod of I (to make it singular) is found to be pos semidef and that a slight modification (to have a negative eigenvalue) is found to be not pos semidef.
*
- * Constructs a random sparse matrix and computes its rank using Gaussian
- * elimination (direct and blas) and Wiedemann's algorithm. Checks that the results match.
+ * Sparsity is not (yet) used.
*/
-template <class Ring>
-bool testIsPosDef(const Ring &Z, size_t n, unsigned int iterations, double sparsity = 0.05)
+template <class Ring, class Method>
+bool testIsPosSemidef(const Ring &Z, size_t n, unsigned int iterations, Method &M, double sparsity = 0.05)
{
typedef SparseMatrix<Ring> Blackbox;
- commentator().start ("Testing isPositiveDefinite", "testIsPosDef", iterations);
+ commentator().start ("Testing isPositiveDefinite", "testIsPosSemidef", iterations);
bool ret = true;
unsigned int i;
- typename Ring::RandIter ri (Z);
+// typename Ring::RandIter ri (Z);
+ // several iterations since there is randomness in the alg (though none in this test)
for (i = 0; i < iterations; ++i) {
commentator().startIteration (i);
Blackbox A (Z, n, n);
- typename Ring::Element e; Z.init(e, 1);
+ typename Ring::Element e; Z.assign(e, Z.one);
for (size_t j = 0; j < n; ++j)
A.setEntry(j, j, e);
@@ -81,15 +83,15 @@ bool testIsPosDef(const Ring &Z, size_t n, unsigned int iterations, double spars
Z.write( report ) << endl;
A.write( report ) << endl;
bool p;
- p = isPositiveSemiDefinite(A);
- report << "PositiveSemidefiniteness on I computed by default (Hybrid) method: " << p << endl;
+ p = isPositiveSemiDefinite(A, M);
+ report << "PositiveSemidefiniteness on I+(1,2) computed by default (Hybrid) method: " << p << endl;
if (!p) {report << "ERROR: should be pos semidef" << endl; ret = false;}
Z.negin(e);
Z. assign(A. refEntry(n/2, n/2), e);
//A.setEntry(1, 2, e);
//A.setEntry(2, 1, e);
- p = isPositiveSemiDefinite(A);
+ p = isPositiveSemiDefinite(A, M);
report << "Matrix:\n";
A.write( report ) << endl;
report << "PositiveSemidefiniteness on indefinite example computed by default (Hybrid) method: " << p << endl;
@@ -109,20 +111,14 @@ bool testIsPosDef(const Ring &Z, size_t n, unsigned int iterations, double spars
int main (int argc, char **argv)
{
-// commentator().setMaxDetailLevel( 100000 );
-// commentator().setMaxDepth( 100000 );
-
bool pass = true;
- static size_t n = 80;
- static integer q = 65519U;
- //static integer q = 1000003U;
- static int iterations = 2;
+ static size_t n = 20;
+ static unsigned int iterations = 2;
static double sparsity = 0.05;
static Argument args[] = {
{ 'n', "-n N", "Set dimension of test matrices to NxN.", TYPE_INT, &n },
- { 'q', "-q Q", "Operate over the \"field\" GF(Q) [1].", TYPE_INTEGER, &q },
{ 'i', "-i I", "Perform each test for I iterations.", TYPE_INT, &iterations },
{ 's', "-s S", "Sparse matrices with density S.", TYPE_DOUBLE, &sparsity },
END_OF_ARGUMENTS
@@ -136,11 +132,12 @@ int main (int argc, char **argv)
commentator().getMessageClass (INTERNAL_DESCRIPTION).setMaxDepth (3);
commentator().getMessageClass (INTERNAL_DESCRIPTION).setMaxDetailLevel (Commentator::LEVEL_NORMAL);
-// commentator().report (Commentator::LEVEL_NORMAL, INTERNAL_DESCRIPTION)
-
- PID_integer R;
+ Givaro::ZRing<Integer> R;
- if (!testIsPosDef(R, n, iterations, sparsity)) pass = false;
+ Method::Blackbox MB;
+ Method::Elimination ME;
+// pass = pass and testIsPosSemidef(R, n, iterations, MB, sparsity);
+ pass = pass and testIsPosSemidef(R, n, iterations, ME, sparsity);
commentator().stop("isPositiveSemiDefinite solution test suite");
return pass ? 0 : -1;
diff --git a/tests/test-la-block-lanczos.C b/tests/test-la-block-lanczos.C
index 67e7da5..a70b8ab 100644
--- a/tests/test-la-block-lanczos.C
+++ b/tests/test-la-block-lanczos.C
@@ -6,20 +6,20 @@
*
* --------------------------------------------------------
*
- *
+ *
* ========LICENCE========
* This file is part of the library LinBox.
- *
+ *
* LinBox is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
- *
+ *
* This library 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
* Lesser General Public License for more details.
- *
+ *
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
@@ -40,11 +40,11 @@
#include <iostream>
#include <fstream>
-#include <vector>
+
#include "linbox/util/commentator.h"
-#include "linbox/field/modular.h"
-#include "linbox/blackbox/sparse.h"
+#include "linbox/ring/modular.h"
+#include "linbox/matrix/sparse-matrix.h"
#include "linbox/vector/stream.h"
#include "linbox/algorithms/la-block-lanczos.h"
@@ -144,11 +144,10 @@ static bool testSampleNullspace (const Field &F,
std::ostream &report = commentator().report (Commentator::LEVEL_UNIMPORTANT, INTERNAL_DESCRIPTION);
bool ret = true;
- unsigned int number;
MatrixDomain<Field> MD (F);
- Matrix x (A_stream.dim (), N);
+ Matrix x (F,A_stream.dim (), N);
SparseMatrix<Field> A (F, A_stream);
@@ -170,6 +169,7 @@ static bool testSampleNullspace (const Field &F,
for (unsigned int i = 0; i < num_iter; ++i) {
commentator().startIteration (i);
+ unsigned int number;
number = lablsolver.sampleNullspace (A, x);
commentator().report (Commentator::LEVEL_IMPORTANT, INTERNAL_DESCRIPTION)
@@ -204,7 +204,6 @@ static bool testRank (const Field &F,
std::ostream &report = commentator().report (Commentator::LEVEL_UNIMPORTANT, INTERNAL_DESCRIPTION);
bool ret = true;
- unsigned int rank;
MatrixDomain<Field> MD (F);
@@ -228,6 +227,7 @@ static bool testRank (const Field &F,
for (unsigned int i = 0; i < num_iter; ++i) {
commentator().startIteration (i);
+ unsigned int rank;
rank = lablsolver.rank (A);
commentator().report (Commentator::LEVEL_IMPORTANT, INTERNAL_DESCRIPTION)
@@ -246,11 +246,11 @@ static bool testRank (const Field &F,
int main (int argc, char **argv)
{
- static int i = 5;
- static int n = 10; // because it shows the problem
+ static unsigned int i = 5;
+ static unsigned int n = 10; // because it shows the problem
static int k = 5;
- static int q = 2;
- static int N = 16;
+ static unsigned int q = 2;
+ static unsigned int N = 16;
static Argument args[] = {
{ 'i', "-i I", "Number of iterations.", TYPE_INT, &i },
@@ -263,10 +263,10 @@ int main (int argc, char **argv)
bool fail = false ;
- typedef Modular<uint8_t> Field;
+ typedef Givaro::Modular<uint8_t> Field;
parseArguments (argc, argv, args);
- Field F (q);
+ Field F (q); Field::RandIter gen(F);
std::cout << "Lookahead-based block Lanczos test suite" << std::endl << std::endl;
@@ -276,8 +276,8 @@ int main (int argc, char **argv)
commentator().getMessageClass (TIMING_MEASURE).setMaxDetailLevel (Commentator::LEVEL_NORMAL);
commentator().getMessageClass (PROGRESS_REPORT).setMaxDepth (0);
- RandomSparseStream<Field> A_stream (F, (double) k / (double) n, n, n);
- RandomDenseStream<Field> y_stream (F, n, i);
+ RandomSparseStream<Field> A_stream (F, gen, (double) k / (double) n, n, n);
+ RandomDenseStream<Field> y_stream (F, gen, n, i);
fail |= testRandomSolve (F, A_stream, y_stream, N);
fail |= testSampleNullspace (F, A_stream, N, i);
diff --git a/tests/test-last-invariant-factor.C b/tests/test-last-invariant-factor.C
index e14856b..dc52dd5 100644
--- a/tests/test-last-invariant-factor.C
+++ b/tests/test-last-invariant-factor.C
@@ -32,9 +32,10 @@
-#include "linbox/field/PID-integer.h"
+#include <linbox/linbox-config.h>
+#include "givaro/zring.h"
#include "linbox/randiter/random-prime.h"
-#include "linbox/field/modular.h"
+#include "linbox/ring/modular.h"
#include "linbox/algorithms/matrix-rank.h"
#include "linbox/algorithms/last-invariant-factor.h"
#include "linbox/blackbox/scompose.h"
@@ -42,10 +43,10 @@
#include "linbox/algorithms/rational-solver.h"
#include <time.h>
-
#include "linbox/util/commentator.h"
#include "linbox/vector/stream.h"
#include "test-common.h"
+
using namespace LinBox;
template <class Ring, class LIF, class Vector>
@@ -61,11 +62,10 @@ bool testRandom(const Ring& R,
commentator().start (str.str ().c_str (), "testRandom", stream1.m ());
bool ret = true;
- bool iter_passed = true;
VectorDomain<Ring> VD (R);
- Vector d;
+ Vector d(R);
typename Ring::Element x;
@@ -79,7 +79,7 @@ bool testRandom(const Ring& R,
std::ostream &report = commentator().report (Commentator::LEVEL_IMPORTANT, INTERNAL_DESCRIPTION);
- iter_passed = true;
+ bool iter_passed = true;
stream1.next (d);
@@ -92,21 +92,21 @@ bool testRandom(const Ring& R,
int i, j;
for(i = 0; i < n; ++i) {
- R. assign (D[i][i], d[i]);
- R. init (L[i][i], 1);
- R. init (U[i][i], 1);}
+ R. assign (D[(size_t)i][(size_t)i], d[(size_t)i]);
+ R. assign (L[(size_t)i][(size_t)i], R.one);
+ R. assign (U[(size_t)i][(size_t)i], R.one);}
for (i = 0; i < n; ++ i)
for (j = 0; j < i; ++ j) {
- R.init(L[i][j], rand() % 10);
+ R.init(L[(size_t)i][(size_t)j], int64_t(rand() % 10));
- R.init(U[j][i], rand() % 10);
+ R.init(U[(size_t)j][(size_t)i], int64_t(rand() % 10));
}
- std::vector<typename Ring::Element> tmp1(n), tmp2(n), e(n);
+ BlasVector<Ring> tmp1(R,(size_t)n), tmp2(R,(size_t)n), e(R,(size_t)n);
typename BlasMatrix<Ring>::ColIterator col_p;
@@ -114,11 +114,13 @@ bool testRandom(const Ring& R,
for (col_p = A.colBegin();
col_p != A.colEnd(); ++ col_p, ++ i) {
- R.init(e[i],1);
+ R.assign(e[(size_t)i],R.one);
U.apply(tmp1, e);
D.apply(tmp2, tmp1);
+ // LinBox::BlasSubvector<BlasVector<Ring> > col_p_v(R,*col_p);
+ // L.apply(col_p_v, tmp2);
L.apply(*col_p, tmp2);
- R.init(e[i],0);
+ R.assign(e[(size_t)i],R.zero);
}
@@ -133,11 +135,11 @@ bool testRandom(const Ring& R,
report << '\n';
- typename std::vector<typename Ring::Element>::iterator p1;
+ typename BlasVector<Ring>::iterator p1;
typename Ring::Element l;
- R. init (l , 1);
+ R. assign(l , R.one);
for (p1 = d.begin(); p1 != d.end(); ++ p1)
@@ -184,7 +186,7 @@ int main(int argc, char** argv)
static size_t n = 10;
- static int iterations = 1;
+ static unsigned int iterations = 1;
static Argument args[] = {
{ 'n', "-n N", "Set order of test matrices to N.", TYPE_INT, &n },
@@ -195,18 +197,18 @@ int main(int argc, char** argv)
parseArguments (argc, argv, args);
- typedef PID_integer Ring;
+ typedef Givaro::ZRing<Integer> Ring;
- Ring R;
+ Ring R; Ring::RandIter gen(R);
commentator().start("Last invariant factor test suite", "LIF");
commentator().getMessageClass (INTERNAL_DESCRIPTION).setMaxDepth (5);
- RandomDenseStream<Ring> s1 (R, n, iterations);
+ RandomDenseStream<Ring> s1 (R, gen, n, iterations);
- typedef RationalSolver<Ring, Modular<int32_t>, LinBox::RandomPrimeIterator> Solver;
- // typedef RationalSolver<Ring, Modular<double>, LinBox::RandomPrimeIterator> Solver;
+ typedef RationalSolver<Ring, Givaro::Modular<int32_t>, LinBox::RandomPrimeIterator> Solver;
+ // typedef RationalSolver<Ring, Givaro::Modular<double>, LinBox::RandomPrimeIterator> Solver;
typedef LastInvariantFactor<Ring, Solver> LIF;
@@ -220,11 +222,10 @@ int main(int argc, char** argv)
return pass ? 0 : -1;
}
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
// Local Variables:
// mode: C++
// tab-width: 8
// indent-tabs-mode: nil
// c-basic-offset: 8
// End:
-
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/tests/test-lidia-gfq.C b/tests/test-lidia-gfq.C
deleted file mode 100644
index ad5f5b2..0000000
--- a/tests/test-lidia-gfq.C
+++ /dev/null
@@ -1,93 +0,0 @@
-
-/* tests/test-lidia-gfq.C
- * Copyright (C) 2002 Pascal Giorgi
- *
- * Written by Pascal Giorgi <pascal.giorgi at ens-lyon.fr>
- *
- * ========LICENCE========
- * This file is part of the library LinBox.
- *
- * LinBox is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- * ========LICENCE========
- */
-
-
-/*! @file tests/test-lidia-gfq.C
- * @ingroup tests
- * @brief no doc
- * @test NO DOC
- */
-
-
-
-#include "linbox/linbox-config.h"
-
-#include <iostream>
-#include <fstream>
-#include <vector>
-
-
-#include "linbox/field/lidia-gfq.h"
-
-#include "test-common.h"
-#include "test-generic.h"
-
-using namespace LinBox;
-
-int main (int argc, char **argv)
-{
- static integer q = 10733;
- static size_t n = 10000;
- static int iterations = 10;
-
- static Argument args[] = {
- { 'q', "-q Q", "Operate over the \"field\" GF(Q) [1].", TYPE_INTEGER, &q },
- { 'n', "-n N", "Set dimension of test vectors to NxN.", TYPE_INT, &n },
- { 'i', "-i I", "Perform each test for I iterations.", TYPE_INT, &iterations },
- END_OF_ARGUMENTS
- };
-
- parseArguments (argc, argv, args);
-
- cout << endl << "LiDIAGfq field test suite" << endl;
- cout.flush ();
- bool pass = true;
-
- LidiaGfq F (q, 1);
-
- // Make sure some more detailed messages get printed
- commentator().getMessageClass (INTERNAL_DESCRIPTION).setMaxDepth (3);
-
- if (!runFieldTests (F, "LidiaGfq (prime)", iterations, n, false)) pass = false;
-
-#if 0
- FieldArchetype K(new LidiaGfq(101,1));
-
- if (!testField<FieldArchetype> (K, "Testing archetype with envelope of LidiaGfq prime field"))
- pass = false;
-#endif
-
-
- return pass ? 0 : -1;
-}
-
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
-// Local Variables:
-// mode: C++
-// tab-width: 8
-// indent-tabs-mode: nil
-// c-basic-offset: 8
-// End:
-
diff --git a/tests/test-matrix-domain.C b/tests/test-matrix-domain.C
index 085089d..4ca6053 100644
--- a/tests/test-matrix-domain.C
+++ b/tests/test-matrix-domain.C
@@ -6,20 +6,20 @@
*
* ---------------------------------------------------------
*
- *
+ *
* ========LICENCE========
* This file is part of the library LinBox.
- *
+ *
* LinBox is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
- *
+ *
* This library 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
* Lesser General Public License for more details.
- *
+ *
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
@@ -51,17 +51,17 @@
#include <iostream>
#include <fstream>
#include <sstream>
-#include <vector>
+
#include "linbox/util/commentator.h"
-#include "linbox/field/modular.h"
-#include "linbox/field/modular-balanced.h"
-#include "linbox/field/givaro.h"
+#include "linbox/ring/modular.h"
+//#include "givaro/modular-balanced.h"
+//#include "linbox/field/givaro.h"
#include "linbox/vector/vector-domain.h"
#include "linbox/matrix/matrix-domain.h"
#include "linbox/vector/stream.h"
-#include "linbox/matrix/blas-matrix.h"
-#include "linbox/matrix/sparse.h"
+#include "linbox/matrix/dense-matrix.h"
+#include "linbox/matrix/sparse-matrix.h"
#include "linbox/blackbox/matrix-blackbox.h"
#include "linbox/solutions/det.h"
@@ -124,18 +124,18 @@ Matrix1 &inv (MatrixDomain<Field> &MD, Matrix1 &res, const Matrix2 &A)
typename BlasMatrix<typename Matrix1::Field>::Col::iterator i;
unsigned int c_idx = idx + 1;
- col = M.colBegin () + idx;
- i = col->begin () + idx + 1;
+ col = M.colBegin () + (int)idx;
+ i = col->begin () + (int)(idx + 1);
- while (MD.field ().isZero (*i) && i != col->end ()) ++i, ++c_idx;
+ while ( i != col->end () && MD.field ().isZero (*i)) ++i, ++c_idx;
if (i == col->end ())
throw SingularMatrix ();
else {
typename BlasMatrix<typename Matrix1::Field>::RowIterator row1, row2;
- row1 = M.rowBegin () + idx;
- row2 = M.rowBegin () + c_idx;
+ row1 = M.rowBegin () + (int)idx;
+ row2 = M.rowBegin () + (int)c_idx;
std::swap_ranges (row1->begin () + idx, row1->end (), row2->begin () + idx);
}
@@ -1102,9 +1102,7 @@ static bool testMVAxpy (Field &F, const char *text, const Matrix &M)
report << "Output vector w:" << endl;
VD.write (report, w);
- typename Field::Element one;
- F.init (one, 1);
- typename LinBox::Vector<Field>::Dense z (M.coldim (), one), w1 (M.rowdim ());
+ typename LinBox::Vector<Field>::Dense z (M.coldim (), F.one), w1 (M.rowdim ());
MD.vectorMul (w1, M, z);
@@ -1189,6 +1187,7 @@ static bool testRightBlackboxMul (Field &F, const char *text, const Blackbox &A,
str << "Testing " << text << " matrix-black box right mul" << ends;
commentator().start (str.str ().c_str (), "testRightBlackboxMul");
+ ostream &report = commentator().report (Commentator::LEVEL_IMPORTANT, INTERNAL_DESCRIPTION);
bool ret = true;
@@ -1205,9 +1204,15 @@ static bool testRightBlackboxMul (Field &F, const char *text, const Blackbox &A,
Istream >> *i;
MD.blackboxMulRight (IA, I, A);
+ report << "blackboxMulRight Output matrix IA:" << endl;
+ MD.write (report, IA);
- ostream &report = commentator().report (Commentator::LEVEL_IMPORTANT, INTERNAL_DESCRIPTION);
- report << "Output matrix IA:" << endl;
+ MD.mul (IA, I, A);
+ report << "mul Output matrix IA:" << endl;
+ MD.write (report, IA);
+
+ MD.mul (IA, A, I);
+ report << "mul Output matrix AI:" << endl;
MD.write (report, IA);
typename LinBox::Vector<Field>::Dense v (A.coldim ()), w1 (A.rowdim ()), w2 (A.rowdim ());
@@ -1342,7 +1347,7 @@ bool testPermutation (const Field &F, const char *text, const Matrix &M)
}
template <class Field, class Blackbox, class Matrix>
-bool testMatrixDomain (const Field &F, const char *text,
+bool testMatrixDomain (const Field &F, typename Field::RandIter& gen, const char *text,
Matrix &M1, Matrix &M2, Matrix &M3,
const Blackbox &A,
unsigned int iterations,
@@ -1354,7 +1359,7 @@ bool testMatrixDomain (const Field &F, const char *text,
bool pass = true;
- RandomDenseStream<Field, typename LinBox::Vector<Field>::Dense> stream (F, A.coldim (), iterations);
+ RandomDenseStream<Field, typename LinBox::Vector<Field>::Dense> stream (F, gen, A.coldim (), iterations);
if (!testCopyEqual (F, text, M1)) pass = false;
if (!testSubinIsZero (F, text, M1)) pass = false;
@@ -1390,7 +1395,7 @@ bool testMatrixDomain (const Field &F, const char *text,
}
template <class Field, class Blackbox, class Matrix>
-bool testMatrixDomain (const Field &F, const char *text,
+bool testMatrixDomain (const Field &F, typename Field::RandIter& gen, const char *text,
Matrix &M1, Matrix &M2, Matrix &M3,
const Blackbox &A,
unsigned int iterations,
@@ -1402,7 +1407,7 @@ bool testMatrixDomain (const Field &F, const char *text,
bool pass = true;
- RandomDenseStream<Field, typename LinBox::Vector<Field>::Dense> stream (F, A.coldim (), iterations);
+ RandomDenseStream<Field, typename LinBox::Vector<Field>::Dense> stream (F, gen, A.coldim (), iterations);
if (!testCopyEqual (F, text, M1)) pass = false;
if (!testSubinIsZero (F, text, M1)) pass = false;
@@ -1430,7 +1435,7 @@ bool testMatrixDomain (const Field &F, const char *text,
}
template <class Field, class Blackbox, class Matrix>
-bool testMatrixDomain (const Field &F, const char *text,
+bool testMatrixDomain (const Field &F, typename Field::RandIter& gen, const char *text,
Matrix &M1, Matrix &M2, Matrix &M3,
const Blackbox &A,
unsigned int iterations,
@@ -1442,7 +1447,7 @@ bool testMatrixDomain (const Field &F, const char *text,
bool pass = true;
- RandomDenseStream<Field, typename LinBox::Vector<Field>::Dense> stream (F, A.coldim (), iterations);
+ RandomDenseStream<Field, typename LinBox::Vector<Field>::Dense> stream (F, gen, A.coldim (), iterations);
if (!testCopyEqual (F, text, M1)) pass = false;
if (!testSubinIsZero (F, text, M1)) pass = false;
@@ -1468,18 +1473,42 @@ bool testMatrixDomain (const Field &F, const char *text,
return pass;
}
+template <class Field, class Blackbox, class Matrix>
+bool testMatrixDomain (const Field &F, typename Field::RandIter& gen, const char *text,
+ Matrix &M1, Matrix &M2, Matrix &M3,
+ const Blackbox &A,
+ unsigned int iterations,
+ MatrixCategories::BlackboxTag)
+{
+ ostringstream str;
+ str << "Testing MatrixDomain with " << text << " matrices" << ends;
+ commentator().start (str.str ().c_str ());
+
+ bool pass = true;
+
+ RandomDenseStream<Field, typename LinBox::Vector<Field>::Dense> stream (F, gen, A.coldim (), iterations);
+
+ if (!testRightBlackboxMul (F, text, A, stream)) pass = false;
+
+ commentator().stop (MSG_STATUS (pass));
+
+ return pass;
+}
+
template <class Field>
-bool launchTestMatrixDomain(const Field &F, size_t m, size_t n, size_t k, int iterations)
+bool launchTestMatrixDomain(const Field &F, size_t m, size_t n, size_t k, unsigned int iterations)
{
bool pass = true ;
- typedef typename Field::Element Element ;
+ // typedef typename Field::Element Element ;
BlasMatrix<Field> M1 (F, n, m);
BlasMatrix<Field> M2 (F, n, m);
BlasMatrix<Field> M3 (F, m, m);
MatrixBlackbox<Field, BlasMatrix<Field> > A1 (F, n, m);
- RandomDenseStream<Field, typename BlasMatrix<Field>::Row> stream1 (F, m);
+ typename Field::RandIter gen(F);
+
+ RandomDenseStream<Field, typename BlasMatrix<Field>::Row> stream1 (F, gen, m);
typename BlasMatrix<Field>::RowIterator i;
@@ -1495,18 +1524,22 @@ bool launchTestMatrixDomain(const Field &F, size_t m, size_t n, size_t k, int it
for (i = A1.rep ().rowBegin (); i != A1.rep ().rowEnd (); ++i)
stream1 >> *i;
- if (!testMatrixDomain (F, "dense", M1, M2, M3, A1, iterations,
+ if (!testMatrixDomain (F, gen, "dense", M1, M2, M3, A1, iterations,
typename MatrixTraits<BlasMatrix<Field> >::MatrixCategory ()))
pass = false;
+ Diagonal<Field> A1b (F, n, true); // random, nonsingular
+ if (!testMatrixDomain (F, gen, "blackbox", M1, M2, M3, A1b, iterations,
+ typename MatrixTraits<Diagonal<Field> >::MatrixCategory ()))
+ pass = false;
- SparseMatrixBase<Element> M4 (n, m);
- SparseMatrixBase<Element> M5 (n, m);
- SparseMatrixBase<Element> M6 (m, m);
- MatrixBlackbox<Field, SparseMatrixBase<Element> > A2 (F, n, m);
+ SparseMatrix<Field> M4 (F,n, m);
+ SparseMatrix<Field> M5 (F,n, m);
+ SparseMatrix<Field> M6 (F,m, m);
+ MatrixBlackbox<Field, SparseMatrix<Field> > A2 (F, n, m);
- RandomSparseStream<Field, typename SparseMatrixBase<Element>::Row> stream2 (F, (double) k / (double) n, m);
+ RandomSparseStream<Field, typename SparseMatrix<Field>::Row> stream2 (F, gen, (double) k / (double) n, m);
- typename SparseMatrixBase<Element>::RowIterator i2;
+ typename SparseMatrix<Field>::RowIterator i2;
for (i2 = M4.rowBegin (); i2 != M4.rowEnd (); ++i2)
stream2 >> *i2;
@@ -1520,16 +1553,16 @@ bool launchTestMatrixDomain(const Field &F, size_t m, size_t n, size_t k, int it
for (i2 = A2.rep ().rowBegin (); i2 != A2.rep ().rowEnd (); ++i2)
stream2 >> *i2;
- if (!testMatrixDomain (F, "sparse row-wise", M4, M5, M6, A2, iterations,
- typename MatrixTraits<SparseMatrixBase<Element> >::MatrixCategory ()))
+ if (!testMatrixDomain (F, gen, "sparse row-wise", M4, M5, M6, A2, iterations,
+ typename MatrixTraits<SparseMatrix<Field> >::MatrixCategory ()))
pass = false;
- TransposeMatrix<SparseMatrixBase<Element> > M7 (M4);
- TransposeMatrix<SparseMatrixBase<Element> > M8 (M5);
- TransposeMatrix<SparseMatrixBase<Element> > M9 (M6);
+ TransposeMatrix<SparseMatrix<Field> > M7 (M4);
+ TransposeMatrix<SparseMatrix<Field> > M8 (M5);
+ TransposeMatrix<SparseMatrix<Field> > M9 (M6);
- if (!testMatrixDomain (F, "sparse column-wise", M7, M8, M9, A2, iterations,
- typename MatrixTraits<TransposeMatrix<SparseMatrixBase<Element> > >::MatrixCategory ()))
+ if (!testMatrixDomain (F, gen, "sparse column-wise", M7, M8, M9, A2, iterations,
+ typename MatrixTraits<TransposeMatrix<SparseMatrix<Field> > >::MatrixCategory ()))
pass = false;
return pass ;
@@ -1539,11 +1572,14 @@ int main (int argc, char **argv)
{
bool pass = true;
- static size_t n = 50;
- static size_t m = 50;
- static size_t k = 10;
- static integer q = 2147483647U;
- static int iterations = 1;
+ static size_t n = 5;
+ static size_t m = n;
+ static size_t k = 2;
+ static integer q = 65521U;
+ static integer q2 = FieldTraits<Givaro::ModularBalanced<int32_t> >::maxModulus() ;
+ Givaro::IntPrimeDom IPD;
+ IPD.prevprime(q2,q2);
+ static unsigned int iterations = 1;
static Argument args[] = {
{ 'n', "-n N", "Set row of test matrices to N.", TYPE_INT, &n },
@@ -1557,10 +1593,16 @@ int main (int argc, char **argv)
parseArguments (argc, argv, args);
if (k >= m) k = m/2+1 ;
-
- Modular<uint32_t> F1 (q);
- ModularBalanced<int32_t> F2 (q);
- GivaroZpz<Givaro::Unsigned32> F3(q);
+ Givaro::Modular<uint32_t> F1 (101);
+ Givaro::ModularBalanced<int32_t> F2 (q2);
+ Givaro::Modular<double> F3(q);
+ /*
+ if (q2 < q/2)
+ std::cerr <<"...étrange..." << std::endl;
+ This is in the modular-balanced maxModulus
+ // (p-1)(p+1)/4 < 2^{31}
+ 92681;
+ */
commentator().start("Matrix domain test suite", "MatrixDomain");
@@ -1570,19 +1612,18 @@ int main (int argc, char **argv)
commentator().getMessageClass (INTERNAL_DESCRIPTION).setMaxDetailLevel (Commentator::LEVEL_UNIMPORTANT);
commentator().getMessageClass (TIMING_MEASURE).setMaxDepth (3);
- pass &= launchTestMatrixDomain(F1,m,n,k,iterations);
- pass &= launchTestMatrixDomain(F2,m,n,k,iterations);
- pass &= launchTestMatrixDomain(F3,m,n,k,iterations);
+ pass = pass and launchTestMatrixDomain(F1,m,n,k,iterations);
+ pass = pass and launchTestMatrixDomain(F2,m,n,k,iterations);
+ pass = pass and launchTestMatrixDomain(F3,m,n,k,iterations);
commentator().stop (MSG_STATUS (pass), "Matrix domain test suite");
return pass ? 0 : -1;
}
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
// Local Variables:
// mode: C++
// tab-width: 8
// indent-tabs-mode: nil
// c-basic-offset: 8
// End:
-
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/tests/test-matrix-domain.h b/tests/test-matrix-domain.h
new file mode 100644
index 0000000..7b7dbb8
--- /dev/null
+++ b/tests/test-matrix-domain.h
@@ -0,0 +1,191 @@
+/*
+ Examples of domains
+BlasMatrixDomain<Field>
+PlainDomain<Field>
+Sliced3Domain<F3_rep>
+M4riDomain
+...
+
+ classes: Index Scalar Vector Matrix Fibb Field Polynomial
+Index i,j,k
+Scalar a,b,c
+Vector u,v,w // Subvector
+Matrix A,B,C // Submatrix
+Fibb F,G
+Field K
+MatrixDomain MD
+Polynomial P
+
+ Functions to test:
+MatrixDomain()
+MatrixDomain(K)
+MatrixDomain(MD)
+MatrixDomain(p,e) // future
+field()
+ vector arith:
+add(z,x,y) z = x + y
+addin(x,y) x += y
+sub(z,x,y) z = x - y
+subin(x,y) x -= y
+neg(z,x) z = -x
+negin(x) x = -x
+axpy(z,a,x,y) z = a*x + y
+axpyin(a,x,y) y += a*x
+mulladd(z,a,x,b,y) z = ax + by
+mulladdin(a,x,b,y) x = ax + by
+copy(x,y) x <-- y
+swap(x,y) x <--> y
+ matrix arith
+add(C,A,B) C = A + B
+addin(A,B) A += B
+sub(C,A,B) C = A - B
+subin(A,B) A -= B
+neg(C,A) C = -A
+negin(A) A = -A
+mul(C,A,B) C = A*B
+mulin_left(A,B) A = A*B (square)
+mulin_right(A,B) B = A*B (square)
+axpy(D,A,B,C) D = A*B + C
+axpyin(C,A,B) C += A*B
+axpy(D,a,B,C) D = a*B + C
+axpyin(a,B,C) C += a*B
+mulladd(D,b,C,a,A,B) D = bC + aAB
+mulladdin(b,C,a,A,B) C = bC + aAB
+inv(F,A) F = A^{dagger}
+invin(F,A) F = A^{dagger}, A modified
+inv(B,A) B = A^{dagger}
+invin(B,A) B = A^{dagger}, A modified
+ nullity?
+div_left(C,A,B) C = A^{dagger}*B (if consistent, AC = B)
+divin_left(A,B) B = A^{dagger}*B, and A modified
+div_right(C,A,B) C = A*B^{dagger} (if consistent, CB = A)
+divin_right(A,B) A = A*B^{dagger}, and B modified
+
+areEqual(A, B)
+copy(B,A) B <-- A
+swap(B,A) B <--> A
+
+left_solve(X,A,B) = div_left(X,A,B) X = A^{dagger}*B
+right_solve(X,A,B) = div_right(X,A,B) = X = A*B^{dagger}
+ Operand& left_solve (const Matrix& A, Operand& B) const
+ Operand& right_solve (const Matrix& A, Operand& B) const
+
+Matrix<MatrixDomain> could do the rest
+rank(i,A)
+rankin(i,A)
+
+det(d,A)
+detin(d,A)
+
+minpoly(P,A)
+charpoly(P,A)
+charpoly(Plist,A) // factored form(?)
+
+isZero(A)
+ (? isIdentity, isUnit, isZeroDivisor)
+
+
+ matrices set themselves, read and write themselves
+ void setIdentity(Matrix & I)
+ random: void setRandom(Matrix & I, opt args)
+ void setZero(Matrix & I)
+ inline std::ostream &write (std::ostream &os, const Matrix &A) const
+ inline std::istream &read (std::istream &is, Matrix &A) const
+
+
+*/
+/*
+
+ class VectorDomain : public virtual DotProductDomain<Field> {//, public virtual VectorDomainBase<Field> {
+ propose types
+ VectorDomain()
+ void init(const Field& F) { this->_field = &F; }
+ VectorDomain (const VectorDomain &VD) :
+ VectorDomain &operator = (const VectorDomain &VD)
+ using VectorDomainBase<Field>::field;
+ inline std::ostream &write (std::ostream &os, const Vector &x) const
+ inline std::istream &read (std::istream &is, Vector &x) const
+ inline Vector1 © (Vector1 &res, const Vector2 &v) const
+ x inline Vector1 © (Vector1 &res, const Vector2 &v, size_t i, size_t len = 0) const
+ propose subvector()
+
+ inline bool areEqual (const Vector1 &v1, const Vector2 &v2) const
+ inline bool isZero (const Vector &v) const
+ inline Element &dot (Element &res, const Vector1 &v1, const Vector2 &v2) const
+ inline Vector1 &add (Vector1 &res, const Vector2 &y, const Vector3 &x) const
+ inline Vector1 &addin (Vector1 &y, const Vector2 &x) const
+ inline Vector1 &sub (Vector1 &res, const Vector2 &y, const Vector3 &x) const
+ inline Vector1 &subin (Vector1 &y, const Vector2 &x) const
+ inline Vector1 &neg (Vector1 &res, const Vector2 &x) const
+ inline Vector &negin (Vector &y) const
+ ? inline Vector1 &mul (Vector1 &res, const Vector2 &x, const Element &a) const
+ ? inline Vector &mulin (Vector &x, const Element &a) const
+ propose smul, smulin
+ inline Vector1 &axpy (Vector1 &res, const Element &a, const Vector2 &x, const Vector3 &y) const
+ inline Vector1 &axpyin (Vector1 &y, const Element &a, const Vector2 &x) const
+ propose muladd, muladdin
+
+ inline void swap (Vector &v1, Vector &v2) const
+ ? inline Vector &permute (Vector &v, Iterator P_start, Iterator P_end) const
+ VectorDomain (const Field &F) :
+ Vector& random(Vector& v)
+*/
+/*
+proposed categories
+Field/Ring
+VectorDomain
+ class Vector
+ class NewVector
+MatrixDomain inherits from VectorDomain, thus contains vector functions
+ class Matrix
+ class NewMatrix
+BlackBox<MatrixDomain>
+ uses MatrixDomain::Matrix and MatrixDomain::Vector
+Matrix<MatrixDomain>
+ domain() returns the MatrixDomain
+ domain().mul
+ field() returns MD().field()
+SparseMatrix<MatrixDomain>
+
+ Those matrix classes know basic matrix functions rank, det, minpoly, etc
+ as well as
+*/
+
+#ifndef LinBox_test_matrix_domain_h
+#define LinBox_test_matrix_domain_h
+#include "test-field.h"
+
+template <class MDom>
+bool testMatrixDomain(const MDom& MD, int n) {
+ bool pass = true;
+
+ typename MDom::Matrix A(MD,n,n), B(MD,n,n), C(MD,n,n), D(MD, n, n);
+ A.random(); B.random();
+ C.zero();
+ typename MDom::Scalar a,b,c,d;
+ MD.init(a); MD.init(b); MD.init(c); MD.init(d);
+
+ MD.add(C, A, B);
+ MD.sub(C, A, B);
+ MD.neg(C, A);
+ MD.smul(C, a, B);
+ MD.saxpy(C, a, A, B);
+ MD.mul(C, A, B);
+ MD.axpy(D, A, B, C);
+
+ MD.addin(A, B);
+ MD.subin(A, B);
+ MD.negin(A);
+ MD.smulin(B, a);
+ MD.saxpyin(B, a, A);
+ MD.mulin_left(A, B);
+ MD.mulin_right(A, B);
+ MD.axpyin(C, A, B);
+ MD.cardinality();
+ MD.characteristic();
+
+ pass = pass and runBasicRingTests(MD, "matrix domain", 1, false);
+ pass = pass and runFieldTests<MDom>(MD, "matrix domain", 1,0, false);
+ return pass;
+}
+#endif //LinBox_test_matrix_domain_h
diff --git a/tests/test-matrix-stream.C b/tests/test-matrix-stream.C
index 8451a3b..3222fb1 100644
--- a/tests/test-matrix-stream.C
+++ b/tests/test-matrix-stream.C
@@ -32,15 +32,15 @@
+#include <linbox/linbox-config.h>
#include <iostream>
#include <fstream>
#include <string>
-#include <vector>
+
#include "test-common.h"
-#include "linbox/field/unparametric.h"
#include "linbox/util/matrix-stream.h"
#include "linbox/integer.h"
-#include "linbox/blackbox/sparse.h"
+#include "linbox/matrix/sparse-matrix.h"
using namespace LinBox;
@@ -72,11 +72,12 @@ integer matrix[rowDim][colDim] = {
{1, 0, 0, -13, 0, 1, 0, 300, 0, 10, 1},
{0, 0, 6, 0, 0, 0, 0, 200, 0, 1, 0} };
-typedef UnparametricField<integer> TestField;
+typedef Givaro::ZRing<integer> TestField;
TestField ff;
template <class BB>
bool testMatrix( std::ostream& out, const char* filename, const char* BBName ) ;
+
bool testMatrixStream(const string& matfile)
{
diff --git a/tests/test-matrix-utils.h b/tests/test-matrix-utils.h
new file mode 100644
index 0000000..fc4ec96
--- /dev/null
+++ b/tests/test-matrix-utils.h
@@ -0,0 +1,322 @@
+/* Copyright (C) 2013 LinBox
+ * Written by Brice Boyer (briceboyer) <boyer.brice at gmail.com>
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ * ========LICENCE========
+ *
+ * Function definitions for block Lanczos iteration
+ */
+
+/** \file tests/test-matrix-utils.h
+ * \brief Utilities for tests on matrices
+ * @ingroup tests
+ * @warning this should better written and shared among the tests
+ * @bug put in \c matrix/random-matrix.h
+ */
+
+
+#ifndef __LINBOX_tests_test_matrix_utils_H
+#define __LINBOX_tests_test_matrix_utils_H
+
+
+#include "fflas-ffpack/utils/Matio.h"
+
+#define RAPPORT(a) \
+ if (pass) { \
+ commentator().report() << "\t \033[1;36m<<<\033[0;m \t" << (a) << " passed :)" << std::endl; \
+ } \
+ else { \
+ commentator().report() << "\t \033[1; 31m!!!\033[0;m \t " << (a) << " failed :(" << std::endl ; \
+ exit(-1); \
+ }
+
+#define TESTE(a) \
+ commentator().report() << "\t \033[1;35m>>>\033[0;m \t testing " << (a) << " :" << std::endl ;
+
+
+#define element_t(Field) \
+typename Field ::Element
+
+
+namespace LinBox { // namespace tests
+/** @brief gives a random number such that \f$0 \leq RIII < s\f$.
+ * @details basic..
+ * @param [in] s sup
+ * \param [in] seed seed. If \p 0 (default) we create a new one.
+ * @param [out] RIII random integer in the interval \f$[[0, s-1]]\f$.
+ * @return a reference to \p RIII
+ */
+size_t & RandIntInInt ( const size_t & s, size_t & RIII, const int & seed = 0 )
+{
+ /*
+ * if (seed == 0)
+ * srandom( (unsigned) time(NULL) );
+ *else
+ * srandom ( seed );
+ */
+ double alea = rand();
+ RIII = (size_t) ((double)s * (alea/(RAND_MAX+1.0)));
+ assert(RIII<s);
+ return RIII ;
+}
+
+/*!
+ * Creates a random Lapack style Permutation \p P of size \p len.
+ */
+void RandomPermutation ( size_t * P, const size_t & len)
+{
+ size_t alea = 0 ;
+ for (size_t i = 0 ; i < len ; ++i) {
+ RandIntInInt(len-i, alea);
+ *(P+i) = i + alea ;
+ }
+ return;
+}
+
+int permutationDet(size_t *P, const size_t len) {
+ int d = 1 ;
+ for(size_t i = 0 ; i < len ; ++i)
+ if (P[i] != i) d = -d;
+ return d;
+}
+
+/**
+ * @brief Checks we got the right rank.
+ *
+ * @param F field
+ * @param A matrix
+ * @param m rows
+ * @param n cols
+ * @param lda leadin dimmension
+ * @param alledged_rank supposedly correct rank.
+ *
+ * @return \c alledged_rank==rank(A)
+ */
+template <class Field>
+bool CheckRank( const Field & F,
+ const element_t(Field) * A,
+ const size_t & m,
+ const size_t & n,
+ const size_t & lda, //!@bug not used
+ const size_t & alledged_rank)
+{
+ // std::cout << " is rank truely " << alledged_rank << " ?" << std::endl;
+ element_t(Field) * Acopy = new element_t(Field)[m*lda] ;
+ FFLAS::fassign(F,m*lda,A,1,Acopy,1);
+ size_t true_rank = FFPACK::Rank(F,m,n,Acopy,lda);
+ delete[] Acopy ;
+ // std::cout << "It is " << true_rank << "." << std::endl;
+ return (alledged_rank == true_rank);
+}
+
+template <class Field>
+bool CheckRank( const Field & F,
+ const BlasMatrix<Field> & A,
+ const size_t & alledged_rank)
+{
+ return CheckRank(F,A.getPointer(),A.rowdim(),A.coldim(),A.stride(),alledged_rank);
+}
+template <class Field>
+bool CheckRank( const Field & F,
+ const BlasSubmatrix<Field> & A,
+ const size_t & alledged_rank)
+{
+ return CheckRank(F,A.getPointer(),A.rowdim(),A.coldim(),A.stride(),alledged_rank);
+}
+
+
+template <class Field>
+bool CheckDet( const Field & F,
+ const element_t(Field) * A,
+ const size_t & m,
+ const size_t & lda,
+ const element_t(Field) & alledged_det)
+{
+ // std::cout << " is det truely " << alledged_det << " ?" << std::endl;
+ element_t(Field) * Acopy = new element_t(Field)[m*m] ;
+ FFLAS::fassign(F,m*m,A,1,Acopy,1);
+ element_t(Field) true_det = FFPACK::Det(F,m,m,Acopy,lda);
+ delete[] Acopy ;
+ // std::cout << "It is " << true_det << "." << std::endl;
+ return (alledged_det == true_det);
+}
+
+/*!
+ * Builds a \p m x \p n random matrix of rank \p rank over field \p F.
+ */
+template <class Field >
+void RandomMatrixWithRank(const Field & F,
+ element_t(Field) * A,
+ const size_t & m,
+ const size_t & n,
+ const size_t & lda,
+ const size_t & rank)
+{
+ assert(rank <= m);
+ assert(rank <= n);
+
+ // srandom( (unsigned) time(NULL) ) ; // on met une nouvelle graine.
+ typename Field::RandIter G(F);
+ typename Field::NonZeroRandIter Gn(G);
+ typedef element_t(Field) Element;
+
+ Element * B = new Element[m*m];
+ Element * C = new Element[m*n];
+ // Create B a random invertible matrix (m x m format)
+ for (size_t j=0 ; j<m ; ++j){
+ size_t i= 0;
+ for ( ; i<j ; ++i)
+ F.assign (*(B+i*m+j),F.zero); // triangulaire
+ assert(i==j);
+ Gn.random(*(B+j*m+j));
+ for (++i; i<m;++i)
+ G.random (*(B+i*m+j));
+ }
+ // Create C a random matrix of rank \p ( m x n format)
+ for (size_t i = 0; i < rank; ++i){
+ size_t j = 0;
+ for ( ; j < std::min(i,n) ; ++j)
+ F.assign (*(C+i*n+j),F.zero);
+ for ( ; j < n ; ++j)
+ Gn.random (*(C+i*n+j));
+ }
+ for (size_t i = n*rank; i < n*m; ++i){
+ F.assign (*(C+i),F.zero);
+ }
+ linbox_check(CheckRank(F,C,m,n,n,rank));
+ // create P a random permutation of size \p n
+ size_t *P = new size_t[n];
+ RandomPermutation(P,n);
+ // create Q a random permutation of size \p m
+ size_t *Q = new size_t[m];
+ RandomPermutation(Q,m);
+ FFPACK::applyP(F, FFLAS::FflasLeft, FFLAS::FflasNoTrans,
+ n, 0, (int)m, C, n, Q );
+ FFPACK::applyP(F, FFLAS::FflasRight, FFLAS::FflasNoTrans,
+ m, 0, (int)n, C, n, P );
+ FFLAS::fgemm( F, FFLAS::FflasNoTrans, FFLAS::FflasNoTrans, m, n, m,
+ F.one, B, m, C, n, F.zero, A, lda );
+ delete[] B;
+ delete[] C;
+ delete[] P;
+ delete[] Q;
+ linbox_check(CheckRank(F,A,m,n,lda,rank));
+ return;
+
+}
+
+/*!
+ * Builds a \p m x \p m random matrix of determinant \p det over field \p F.
+ */
+template <class Field >
+void RandomMatrixWithDet(const Field & F,
+ element_t(Field) * A,
+ const size_t & m,
+ const size_t & lda, //!@bug not used
+ const element_t(Field) & det)
+{
+ typename Field::RandIter G(F);
+ typename Field::NonZeroRandIter Gn(G);
+ typedef element_t(Field) Element;
+
+ Element * B = new Element[m*m];
+ Element * C = new Element[m*m];
+
+ size_t *P = new size_t[m];
+ //srandom( (unsigned) time(NULL) ) ; // on met une nouvelle graine.
+ RandomPermutation(P,m);
+ // create Q a random permutation of size \p m
+ size_t *Q = new size_t[m];
+ RandomPermutation(Q,m);
+
+ int sgn = permutationDet(P,m);
+ sgn *= permutationDet(Q,m);
+
+
+ // Create B a random invertible matrix (m x m format) of determinant \p det
+ for (size_t j=0 ; j<m ; ++j){
+ for (size_t i = 0 ; i<j ; ++i)
+ F.assign (*(B+i*m+j),F.zero); // triangulaire
+ Gn.random(*(B+j*m+j) );
+ for (size_t i=j+1; i<m;++i)
+ G.random (*(B+i*m+j));
+ }
+ {
+ Element dx = F.one;
+ size_t j=0;
+ for ( ; j<m-1 ; ++j){
+ F.mulin(dx,B[j*m+j]);
+ }
+ F.invin(dx);
+ F.mulin(dx,det);
+ if (sgn < 0)
+ F.negin(dx);
+ B[j*m+j]=dx;
+ }
+ // write_field(F,std::cout << "L:=",B,m,m,m,true) << ';'<<std::endl;
+ Element mdet ; F.neg(mdet,det);
+ assert(CheckDet(F,B,m,m,(sgn<0)?mdet:det));
+
+ // Create C a random matrix of rank \p ( m x m format)
+ // for (size_t i = 0; i < std::min(rank,m); ++i)
+ for (size_t i = 0; i < m; ++i){
+ size_t j = 0;
+ for ( ; j < i ; ++j)
+ F.assign (*(C+i*m+j),F.zero);
+ assert(i==j);
+ F.assign (*(C+i*m+j),F.one);
+ for ( ++j ; j < m ; ++j)
+ G.random (*(C+i*m+j));
+ }
+ assert(CheckDet(F,C,m,m,F.one));
+ // write_field(F,std::cout << "U:=",C,m,m,m,true) << ';'<<std::endl;
+ // create P a random permutation of size \p m
+ FFPACK::applyP(F, FFLAS::FflasLeft, FFLAS::FflasNoTrans,
+ m, 0, (int)m, C, m, Q );
+ //PrintLapackPermutation(P,m,std::cout << "P == ");
+ // write_field (F, std::cout<<"C_perm1="<<std::endl, C, m, m, m);
+ FFPACK::applyP(F, FFLAS::FflasRight, FFLAS::FflasNoTrans,
+ m, 0, (int)m, C, m, P );
+ //PrintLapackPermutation(Q,m,std::cout << "Q == ");
+ //write_field (F, std::cout<<"C_perm2="<<std::endl, C, m, m, m);
+ // A = B*C (m x m format), of rank \p rank
+ FFLAS::fgemm( F, FFLAS::FflasNoTrans, FFLAS::FflasNoTrans, m, m, m,
+ F.one, B, m, C, m, F.zero, A, m );
+ delete[] B;
+ delete[] C;
+ delete[] Q;
+ delete[] P;
+
+ // write_field(F,std::cout << "A:=",A,m,m,m,true) << ';'<<std::endl;
+ assert(CheckDet(F,A,m,m,det));
+ return;
+
+}
+
+} // LinBox
+
+
+#endif // __LINBOX_tests_test_matrix_utils_H
+
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/tests/test-mg-block-lanczos.C b/tests/test-mg-block-lanczos.C
index baf0d46..14579fd 100644
--- a/tests/test-mg-block-lanczos.C
+++ b/tests/test-mg-block-lanczos.C
@@ -6,20 +6,20 @@
*
* --------------------------------------------------------
*
- *
+ *
* ========LICENCE========
* This file is part of the library LinBox.
- *
+ *
* LinBox is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
- *
+ *
* This library 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
* Lesser General Public License for more details.
- *
+ *
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
@@ -40,11 +40,11 @@
#include <iostream>
#include <fstream>
-#include <vector>
+
#include "linbox/util/commentator.h"
#include "linbox/field/modular.h"
-#include "linbox/blackbox/sparse.h"
+#include "linbox/matrix/sparse-matrix.h"
#include "linbox/vector/stream.h"
#include "linbox/algorithms/mg-block-lanczos.h"
@@ -62,7 +62,7 @@ static bool testRandomSolve (const Field &F,
VectorStream<Vector2> &y_stream,
size_t N)
{
- typedef MGBlockLanczosSolver<Field, BlasMatrix<Field> > MGBLSolver;
+ typedef MGBlockLanczosSolver<Field, BlasMatrix<Field,typename RawVector<typename Field::Element >::Dense> > MGBLSolver;
commentator().start ("Testing random solve (Block Lanczos)", "testRandomSolve", y_stream.size ());
@@ -74,7 +74,7 @@ static bool testRandomSolve (const Field &F,
VectorDomain<Field> VD (F);
MatrixDomain<Field> MD (F);
- Vector2 y, b, x1, x2;
+ Vector2 y(F), b(F), x1(F), x2(F);
VectorWrapper::ensureDim (b, y_stream.dim ());
VectorWrapper::ensureDim (y, y_stream.dim ());
@@ -135,7 +135,7 @@ static bool testSampleNullspace (const Field &F,
size_t N,
unsigned int num_iter)
{
- typedef BlasMatrix<Field> Matrix;
+ typedef BlasMatrix<Field,typename RawVector<typename Field::Element >::Dense> Matrix;
typedef MGBlockLanczosSolver<Field, Matrix> MGBLSolver;
commentator().start ("Testing sampling from nullspace (Block Lanczos)", "testSampleNullspace", num_iter);
@@ -144,7 +144,6 @@ static bool testSampleNullspace (const Field &F,
std::ostream &report = commentator().report (Commentator::LEVEL_UNIMPORTANT, INTERNAL_DESCRIPTION);
bool ret = true;
- unsigned int number;
MatrixDomain<Field> MD (F);
@@ -170,6 +169,7 @@ static bool testSampleNullspace (const Field &F,
for (unsigned int i = 0; i < num_iter; ++i) {
commentator().startIteration (i);
+ unsigned int number;
number = mgblsolver.sampleNullspace (A, x);
commentator().report (Commentator::LEVEL_IMPORTANT, INTERNAL_DESCRIPTION)
@@ -205,10 +205,10 @@ int main (int argc, char **argv)
END_OF_ARGUMENTS
};
- typedef Modular<uint8_t> Field;
+ typedef Givaro::Modular<uint8_t> Field;
parseArguments (argc, argv, args);
- Field F (q);
+ Field F ((uint32_t)q); Field::RandIter gen(F);
commentator().start("Montgomery block Lanczos test suite");
@@ -218,10 +218,10 @@ int main (int argc, char **argv)
commentator().getMessageClass (TIMING_MEASURE).setMaxDetailLevel (Commentator::LEVEL_NORMAL);
commentator().getMessageClass (PROGRESS_REPORT).setMaxDepth (0);
- RandomSparseStream<Field> A_stream (F, (double) k / (double) n, n, n);
- RandomDenseStream<Field> y_stream (F, n, i);
+ RandomSparseStream<Field> A_stream (F, gen, (double) k / (double) n, (size_t)n, (size_t)n);
+ RandomDenseStream<Field> y_stream (F, gen, (size_t)n, (size_t)i);
- if (!testRandomSolve (F, A_stream, y_stream, N)) pass=false;;
+ if (!testRandomSolve (F, A_stream, y_stream, (size_t)N)) pass=false;;
commentator().report (Commentator::LEVEL_IMPORTANT, INTERNAL_DESCRIPTION)
<< " Skipping Sample Nullspace test (which has mem problems)" << std::endl;
//if (!testSampleNullspace (F, A_stream, N, i)) pass=false;;
@@ -230,11 +230,10 @@ int main (int argc, char **argv)
return pass ? 0 : -1;
}
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
// Local Variables:
// mode: C++
// tab-width: 8
// indent-tabs-mode: nil
// c-basic-offset: 8
// End:
-
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/tests/test-minpoly.C b/tests/test-minpoly.C
index 4752ed8..30a202a 100644
--- a/tests/test-minpoly.C
+++ b/tests/test-minpoly.C
@@ -11,20 +11,20 @@
*
* --------------------------------------------------------
*
- *
+ *
* ========LICENCE========
* This file is part of the library LinBox.
- *
+ *
* LinBox is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
- *
+ *
* This library 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
* Lesser General Public License for more details.
- *
+ *
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
@@ -45,16 +45,19 @@
#include <iostream>
#include <fstream>
-#include <vector>
+
#include <cstdio>
-#include "linbox/field/modular.h"
-#include "linbox/field/givaro.h"
-#include "linbox/blackbox/sparse.h"
+#include "givaro/modular.h"
+#include "givaro/gfq.h"
+#include "linbox/matrix/sparse-matrix.h"
+#include "linbox/blackbox/scalar-matrix.h"
#include "linbox/util/commentator.h"
#include "linbox/solutions/minpoly.h"
#include "linbox/vector/stream.h"
+#include "linbox/vector/blas-vector.h"
+
#include "test-common.h"
using namespace LinBox;
@@ -62,16 +65,16 @@ using namespace LinBox;
/* Test 0: Minimal polynomial of the zero matrix
*/
template <class Field, class Meth>
-static bool testZeroMinpoly (Field &F, size_t n, bool symmetrizing, const Meth& M)
+static bool testZeroMinpoly (Field &F, size_t n, const Meth& M)
{
+ ostream &report = commentator().report (Commentator::LEVEL_IMPORTANT, INTERNAL_DESCRIPTION);
commentator().start ("Testing zero minpoly", "testZeroMinpoly");
- typedef vector <typename Field::Element> Polynomial;
- Polynomial phi;
+ typedef BlasVector<Field> Polynomial;
+ Polynomial phi(F);
SparseMatrix<Field> A(F, n, n);
minpoly(phi, A, M);
- ostream &report = commentator().report (Commentator::LEVEL_IMPORTANT, INTERNAL_DESCRIPTION);
- A.write(report, FORMAT_MAPLE);
+ A.write(report, Tag::FileFormat::Maple);
report << "Minimal polynomial is: ";
printPolynomial<Field, Polynomial> (F, report, phi);
@@ -81,8 +84,7 @@ static bool testZeroMinpoly (Field &F, size_t n, bool symmetrizing, const Meth&
ret = true;
else
{
- commentator().report (Commentator::LEVEL_IMPORTANT, INTERNAL_ERROR)
- << "ERROR: A = 0, should get x, got ";
+ report << "ERROR: A = 0, should get x, got ";
printPolynomial<Field, Polynomial> (F, report, phi);
report << endl;
ret = false;
@@ -90,11 +92,6 @@ static bool testZeroMinpoly (Field &F, size_t n, bool symmetrizing, const Meth&
commentator().stop (MSG_STATUS (ret), (const char *) 0, "testZeroMinpoly");
return ret;
}
-template <class Field>
-static bool testZeroMinpoly (Field &F, size_t n)
-{
- return testZeroMinpoly(F, n, false, Method::Blackbox());
-}
/* Test 1: Minimal polynomial of the identity matrix
*
@@ -108,24 +105,20 @@ static bool testZeroMinpoly (Field &F, size_t n)
*/
template <class Field, class Meth>
-static bool testIdentityMinpoly (Field &F, size_t n, bool symmetrizing, const Meth& M)
+static bool testIdentityMinpoly (Field &F, size_t n, const Meth& M)
{
- typedef vector <typename Field::Element> Vector;
- typedef vector <typename Field::Element> Polynomial;
- typedef SparseMatrix<Field> Blackbox;
- typedef typename Blackbox::Row Row;
+ typedef BlasVector<Field> Polynomial;
+ typedef ScalarMatrix<Field> Blackbox;
commentator().start ("Testing identity minpoly", "testIdentityMinpoly");
typename Field::Element c0, c1;
- StandardBasisStream<Field, Row> stream (F, n);
- Blackbox A (F, stream);
+ //StandardBasisStream<Field, Row> stream (F, n);
+ Blackbox A (F, n, n, F.one);
- Polynomial phi;
+ Polynomial phi(F);
- //if (symmetrizing) minpolySymmetric (phi, A);
- //else minpoly (phi, A);
minpoly (phi, A, M );
ostream &report = commentator().report (Commentator::LEVEL_IMPORTANT, INTERNAL_DESCRIPTION);
@@ -134,8 +127,8 @@ static bool testIdentityMinpoly (Field &F, size_t n, bool symmetrizing, const Me
bool ret;
- F.init (c0, -1);
- F.init (c1, 1);
+ F.assign(c0, F.mOne);
+ F.assign(c1, F.one);
if (phi.size () == 2 && F.areEqual (phi[0], c0) && F.areEqual (phi[1], c1))
ret = true;
@@ -151,12 +144,6 @@ static bool testIdentityMinpoly (Field &F, size_t n, bool symmetrizing, const Me
return ret;
}
-template <class Field>
-static bool testIdentityMinpoly (Field &F, size_t n, bool symmetrizing=false)
-{
- return testIdentityMinpoly(F, n, symmetrizing, Method::Blackbox());
-}
-
/* Test 2: Minimal polynomial of a nilpotent matrix
*
* Construct an index-n nilpotent matrix and compute its minimal
@@ -171,9 +158,8 @@ static bool testIdentityMinpoly (Field &F, size_t n, bool symmetrizing=false)
template <class Field, class Meth>
static bool testNilpotentMinpoly (Field &F, size_t n, const Meth& M)
{
- typedef vector <typename Field::Element> Vector;
- typedef vector <typename Field::Element> Polynomial;
- typedef SparseMatrix <Field> Blackbox;
+ typedef BlasVector<Field> Polynomial;
+ typedef SparseMatrix<Field> Blackbox;
typedef typename Blackbox::Row Row;
commentator().start ("Testing nilpotent minpoly", "testNilpotentMinpoly");
@@ -188,12 +174,12 @@ static bool testNilpotentMinpoly (Field &F, size_t n, const Meth& M)
stream.next (v);
Blackbox A (F, stream); // first subdiagonal is 1's.
- Polynomial phi(n+1);
+ Polynomial phi(F,n+1);
minpoly (phi, A, M);
ostream &report = commentator().report (Commentator::LEVEL_IMPORTANT, INTERNAL_DESCRIPTION);
- A.write (report, FORMAT_MAPLE);
+ A.write (report, Tag::FileFormat::Maple);
report << "Minimal polynomial is: ";
printPolynomial (F, report, phi);
@@ -214,11 +200,6 @@ static bool testNilpotentMinpoly (Field &F, size_t n, const Meth& M)
return ret;
}
-template <class Field>
-static bool testNilpotentMinpoly (Field &F, size_t n)
-{
- return testNilpotentMinpoly(F, n, Method::Blackbox());
-}
/* Test 3: Random minpoly of sparse matrix
*
@@ -241,14 +222,13 @@ bool testRandomMinpoly (Field &F,
VectStream &v_stream,
const Meth& M)
{
- typedef std::vector <typename Field::Element> Polynomial;
- typedef SparseMatrix <Field> Blackbox;
+ typedef BlasVector<Field> Polynomial;
+ typedef SparseMatrix<Field> Blackbox;
typedef typename VectStream::Vector Vector;
- commentator().start ("Testing sparse random minpoly", "testRandomMinpoly", iterations);
+ commentator().start ("Testing sparse random minpoly", "testRandomMinpoly", (unsigned int)iterations);
bool ret = true;
- bool iter_passed;
VectorDomain<Field> VD (F);
@@ -258,18 +238,18 @@ bool testRandomMinpoly (Field &F,
VectorWrapper::ensureDim (w, v_stream.n ());
for (int i = 0; i < iterations; i++) {
- commentator().startIteration (i);
+ commentator().startIteration ((unsigned int)i);
- iter_passed = true;
+ bool iter_passed = true;
A_stream.reset ();
Blackbox A (F, A_stream);
ostream &report = commentator().report (Commentator::LEVEL_UNIMPORTANT, INTERNAL_DESCRIPTION);
report << "Matrix:" << endl;
- A.write (report, FORMAT_MAPLE);
+ A.write (report, Tag::FileFormat::Maple);
- Polynomial phi;
+ Polynomial phi(F);
minpoly (phi, A, M );
@@ -309,14 +289,6 @@ bool testRandomMinpoly (Field &F,
return ret;
}
-template <class Field, class BBStream, class VectStream>
-bool testRandomMinpoly (Field &F,
- int iterations,
- BBStream &A_stream,
- VectStream &v_stream)
-{
- return testRandomMinpoly(F, iterations, A_stream, v_stream, Method::Blackbox());
-}
/* Test 4: test gram matrix.
A test of behaviour with self-orthogonal rows and cols.
@@ -329,18 +301,17 @@ bool testRandomMinpoly (Field &F,
if p is large, size is 2 and minpoly is x^2 -1.
*/
template <class Field, class Meth>
-static bool testGramMinpoly (Field &F, size_t m, bool symmetrizing, const Meth& M)
+static bool testGramMinpoly (Field &F, size_t m, const Meth& M)
{
commentator().start ("Testing gram minpoly", "testGramMinpoly");
- typedef vector <typename Field::Element> Polynomial;
+ typedef BlasVector<Field> Polynomial;
integer n;
F.characteristic(n); n += 1;
if (n > 30) n = 2;
- Polynomial phi;
- typename Field::Element one, zero, neg1; F.init(one, 1); F.init(zero, 0); F.init(neg1); F.neg(neg1, one);
+ Polynomial phi(F);
BlasMatrix<Field> A(F, n, n);
- for (int i = 0; i < n; ++i) for (int j = 0; j < n; ++j) A.setEntry(i, j, one);
- for (int i = 0; i < n; ++i) A.setEntry(i, i, zero);
+ for (size_t i = 0; i < n; ++i) for (size_t j = 0; j < n; ++j) A.setEntry(i, j, F.one);
+ for (size_t i = 0; i < n; ++i) A.setEntry(i, i, F.zero);
minpoly(phi, A, M);
ostream &report = commentator().report (Commentator::LEVEL_IMPORTANT, INTERNAL_DESCRIPTION);
@@ -350,7 +321,7 @@ static bool testGramMinpoly (Field &F, size_t m, bool symmetrizing, const Meth&
bool ret;
if (n == 2)
- if ( phi.size() == 3 && F.areEqual(phi[0], neg1) && F.isZero(phi[1]) && F.isOne(phi[2]))
+ if ( phi.size() == 3 && F.areEqual(phi[0], F.mOne) && F.isZero(phi[1]) && F.isOne(phi[2]))
ret = true;
else
{
@@ -373,13 +344,6 @@ static bool testGramMinpoly (Field &F, size_t m, bool symmetrizing, const Meth&
return ret;
}
-template <class Field>
-static bool testGramMinpoly (Field &F, size_t n)
-{
- return testGramMinpoly(F, n, false, Method::Blackbox());
-}
-
-
int main (int argc, char **argv)
{
commentator().setMaxDetailLevel (-1);
@@ -388,15 +352,17 @@ int main (int argc, char **argv)
bool pass = true;
static size_t n = 10;
- //static integer q = 2147483647U;
- static integer q = 1000003; // ok for both Modular<int> and Modular<double>
+ //static integer q = 65521U;
+ static integer q = 1000003; // ok for both Givaro::Modular<int> and Givaro::Modular<double>
+ static int e = 1; // exponent for field characteristic
static int iterations = 1;
static int numVectors = 1;
static int k = 3;
static Argument args[] = {
{ 'n', "-n N", "Set dimension of test matrices to NxN.", TYPE_INT, &n },
- { 'q', "-q Q", "Operate over the \"field\" GF(Q) [1].", TYPE_INTEGER, &q },
+ { 'q', "-q Q", "Operate over the \"field\" GF(Q^E) [1].", TYPE_INTEGER, &q },
+ { 'e', "-e E", "Operate over the \"field\" GF(Q^E) [1].", TYPE_INT, &e },
{ 'i', "-i I", "Perform each test for I iterations.", TYPE_INT, &iterations },
{ 'v', "-v V", "Use V test vectors for the random minpoly tests.", TYPE_INT, &numVectors },
{ 'k', "-k K", "K nonzero Elements per row in sparse random apply test.", TYPE_INT, &k },
@@ -409,77 +375,83 @@ int main (int argc, char **argv)
commentator().getMessageClass (INTERNAL_DESCRIPTION).setMaxDepth (10);
commentator().getMessageClass (INTERNAL_DESCRIPTION).setMaxDetailLevel (Commentator::LEVEL_UNIMPORTANT);
+ ostream &report = commentator().report (Commentator::LEVEL_IMPORTANT, INTERNAL_DESCRIPTION);
// /////////////// finite field part //////////////////
- if (q > 5 && q % 2 != 0 && q % 3 != 0 && q % 5 != 0 )
+ Method::Blackbox MB;
+ //if (e == 1)
{
- //typedef Modular<uint32_t> Field;
- //typedef Modular<int> Field;
- typedef Modular<double> Field;
+ //typedef Givaro::Modular<uint32_t> Field;
+ //typedef Givaro::Modular<int> Field;
+ typedef Givaro::Modular<double> Field;
Field F (q);
srand ((unsigned)time (NULL));
commentator().start("Blackbox prime field minpoly test suite", "Wminpoly");
- //no symmetrizing
- if (!testZeroMinpoly (F, n)) pass = false;
- if (!testIdentityMinpoly (F, n)) pass = false;
- if (!testNilpotentMinpoly (F, n)) pass = false;
+ if (!testZeroMinpoly (F, n, MB)) pass = false;
+ if (!testIdentityMinpoly (F, n, MB)) pass = false;
+ if (!testNilpotentMinpoly (F, n, MB)) pass = false;
//if (!testRandomMinpoly (F, n)) pass = false;
- if (!testGramMinpoly (F, n)) pass = false;
-
- // symmetrizing
- //if (!testZeroMinpoly (F, n, true)) pass = false;
- if (!testIdentityMinpoly (F, n, true)) pass = false;
- //if (!testNilpotentMinpoly (F, n, true)) pass = false;
- //if (!testRandomMinpoly (F, n, true)) pass = false;
- //if (!testGramMinpoly (F, n, true)) pass = false;
+ if (!testGramMinpoly (F, n, MB)) pass = false;
//need other tests...
commentator().stop("Blackbox prime field minpoly test suite");
}
- else{
-
- int p;
- if (q % 2 == 0) p = 2;
- if (q % 3 == 0) p = 3;
- if (q % 5 == 0) p = 5;
- int e = 0; do {++e; q = q/p; } while (q > 1);
- typedef GivaroGfq Field;
- Field F (p, e);
+ //else
+ { q = 3; e = 10;
+
+ typedef Givaro::GFqDom<int64_t> Field;
+ Field F (q, e);
srand ((unsigned)time (NULL));
- commentator().start("Blackbox non-prime field minpoly test suite", "Wminpoly");
- ostream &report = commentator().report (Commentator::LEVEL_IMPORTANT, INTERNAL_DESCRIPTION);
+ commentator().start("Blackbox gfq field minpoly test suite", "Wminpoly");
F.write(report);
- //no symmetrizing
- if (!testZeroMinpoly (F, n)) pass = false;
- if (!testIdentityMinpoly (F, n)) pass = false;
- if (!testNilpotentMinpoly (F, n)) pass = false;
+ if (!testZeroMinpoly (F, n, MB)) pass = false;
+ if (!testIdentityMinpoly (F, n, MB)) pass = false;
+ if (!testNilpotentMinpoly (F, n, MB)) pass = false;
//if (!testRandomMinpoly (F, n)) pass = false;
- if (!testGramMinpoly (F, n)) pass = false;
-
- // symmetrizing
- //if (!testZeroMinpoly (F, n, true)) pass = false;
- if (!testIdentityMinpoly (F, n, true)) pass = false;
- //if (!testNilpotentMinpoly (F, n, true)) pass = false;
- //if (!testRandomMinpoly (F, n, true)) pass = false;
- //if (!testGramMinpoly (F, n, true)) pass = false;
+ if (!testGramMinpoly (F, n, MB)) pass = false;
//need other tests...
- commentator().stop("Blackbox non-prime field minpoly test suite");
+ commentator().stop("Blackbox gfq minpoly test suite");
}
#if 0
+// this test can only work if Extension of Extension is compiling. -bds
- Modular<uint32_t> F (q);
+ { q = 3; e = 2;
+ typedef Givaro::Modular<int32_t> GroundField;
+ typedef Givaro::Extension<GroundField> Field;
+ GroundField K(q);
+ Field F (K, e);
+ srand ((unsigned)time (NULL));
+ MB.certificate(false);
+
+ commentator().start("Blackbox givaro extension field minpoly test suite", "Wminpoly");
+ F.write(report);
+
+ if (!testZeroMinpoly (F, n, MB)) pass = false;
+ if (!testIdentityMinpoly (F, n, MB)) pass = false;
+ if (!testNilpotentMinpoly (F, n, MB)) pass = false;
+ //if (!testRandomMinpoly (F, n)) pass = false;
+ if (!testGramMinpoly (F, n, MB)) pass = false;
+ //need other tests...
+
+ commentator().stop("Blackbox givaro extension field minpoly test suite");
+ }
+#endif
+
+#if 1
+
+ Givaro::Modular<uint32_t> F (q);
commentator().start("Hybrid prime field minpoly test suite", "Hminpoly");
- if (!testIdentityMinpoly (F, n, false, Method::Hybrid())) pass = false;
+ if (!testIdentityMinpoly (F, n, Method::Hybrid())) pass = false;
if (!testNilpotentMinpoly (F, n, Method::Hybrid())) pass = false;
commentator().stop("Hybrid prime field minpoly test suite");
-
+#elif 0
commentator().start("Blackbox prime field minpoly test suite", "Bminpoly");
if (!testIdentityMinpoly (F, n, false, Method::Blackbox())) pass = false;
if (!testNilpotentMinpoly (F, n, Method::Blackbox())) pass = false;
@@ -491,10 +463,10 @@ int main (int argc, char **argv)
commentator().stop("Elimination prime field minpoly test suite");
// /////////////// integer part //////////////////
- typedef vector<PID_integer::Element> ZDenseVector;
- typedef SparseMatrix<PID_integer>::Row ZSparseVector;
+ typedef vector<Givaro::ZRing<Integer>::Element> ZDenseVector;
+ typedef SparseMatrix<Givaro::ZRing<Integer> >::Row ZSparseVector;
//typedef pair<vector<size_t>, vector<Field::Element> > SparseVector;
- PID_integer Z;
+ Givaro::ZRing<Integer> Z;
srand ((unsigned)time (NULL));
commentator().getMessageClass (TIMING_MEASURE).setMaxDepth (10);
@@ -503,35 +475,30 @@ int main (int argc, char **argv)
commentator().start("Blackbox integer minpoly test suite", "WIminpoly");
- RandomDenseStream<PID_integer, ZDenseVector, NonzeroRandIter<PID_integer> >
- zv_stream (Z, NonzeroRandIter<PID_integer> (Z, PID_integer::RandIter (Z)), n, numVectors);
- RandomSparseStream<PID_integer, ZSparseVector, NonzeroRandIter<PID_integer> >
- zA_stream (Z, NonzeroRandIter<PID_integer> (Z, PID_integer::RandIter (Z)), (double) k / (double) n, n, n);
+ RandomDenseStream<Givaro::ZRing<Integer>, ZDenseVector, NonzeroRandIter<Givaro::ZRing<Integer> > >
+ zv_stream (Z, NonzeroRandIter<Givaro::ZRing<Integer> > (Z, Givaro::ZRing<Integer>::RandIter (Z)), n, numVectors);
+ RandomSparseStream<Givaro::ZRing<Integer>, ZSparseVector, NonzeroRandIter<Givaro::ZRing<Integer> > >
+ zA_stream (Z, NonzeroRandIter<Givaro::ZRing<Integer> > (Z, Givaro::ZRing<Integer>::RandIter (Z)), (double) k / (double) n, n, n);
- // Hybrid
- //no symmetrizing
- if (!testIdentityMinpoly (Z, n)) pass = false;
- if (!testNilpotentMinpoly (Z, n)) pass = false;
+ if (!testIdentityMinpoly (Z, n, MB)) pass = false;
+ if (!testNilpotentMinpoly (Z, n, MB)) pass = false;
if (!testRandomMinpoly (Z, iterations, zA_stream, zv_stream)) pass = false;
- // symmetrizing
- if (!testIdentityMinpoly (Z, n, true)) pass = false;
-
commentator().stop("Blackbox integer minpoly test suite");
commentator().start("Hybrid integer minpoly test suite", "HIminpoly");
- if (!testIdentityMinpoly (Z, n, false, Method::Hybrid())) pass = false;
+ if (!testIdentityMinpoly (Z, n, Method::Hybrid())) pass = false;
if (!testNilpotentMinpoly (Z, n, Method::Hybrid())) pass = false;
commentator().stop("Hybrid integer minpoly test suite");
commentator().start("Blackbox integer minpoly test suite", "BIminpoly");
- if (!testIdentityMinpoly (Z, n, false, Method::Blackbox())) pass = false;
+ if (!testIdentityMinpoly (Z, n, Method::Blackbox())) pass = false;
if (!testNilpotentMinpoly (Z, n, Method::Blackbox())) pass = false;
commentator().stop("Blackbox integer minpoly test suite");
commentator().start("Elimination integer minpoly test suite", "EIminpoly");
- if (!testIdentityMinpoly (Z, n, false, Method::Elimination())) pass = false;
+ if (!testIdentityMinpoly (Z, n, Method::Elimination())) pass = false;
if (!testNilpotentMinpoly (Z, n, Method::Elimination())) pass = false;
commentator().stop("Elimination integer minpoly test suite");
@@ -539,11 +506,10 @@ int main (int argc, char **argv)
return pass ? 0 : -1;
}
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
// Local Variables:
// mode: C++
// tab-width: 8
// indent-tabs-mode: nil
// c-basic-offset: 8
// End:
-
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/tests/test-modular-balanced-double.C b/tests/test-modular-balanced-double.C
index 7bda7fe..bb9ac02 100644
--- a/tests/test-modular-balanced-double.C
+++ b/tests/test-modular-balanced-double.C
@@ -28,24 +28,16 @@
* @test tests only runFieldTests on modular-balanced-double
*/
-
+#include <linbox/linbox-config.h>
+#include <givaro/modular-balanced.h>
+#include <givaro/givintprime.h>
#include "linbox/linbox-config.h"
-
-#include <iostream>
-#include <fstream>
-#include <sstream>
-#include <vector>
-#include <queue>
-
-#include "linbox/field/modular-balanced.h"
-
#include "linbox/util/commentator.h"
#include "linbox/util/debug.h"
-#include "test-common.h"
-#include "test-generic.h"
+#include "test-field.h"
using namespace LinBox;
@@ -54,7 +46,7 @@ using namespace LinBox;
int main (int argc, char **argv)
{
static size_t n = 1000;
- static int iterations = 1;
+ static unsigned int iterations = 1;
static int trials = 10000;
static int categories = 1000;
static int hist_level = 10;
@@ -70,35 +62,48 @@ int main (int argc, char **argv)
parseArguments (argc, argv, args);
- commentator().start("ModularBalanced<double> field test suite", "ModularBalanced<double>");
+ commentator().start("Givaro::ModularBalanced<double> field test suite", "Givaro::ModularBalanced<double>");
bool pass = true;
- ModularBalanced<double> F_int (67108859);
- ModularBalanced<double> G_int (2011);
- ModularBalanced<double> H_int (3);
+ Givaro::IntPrimeDom IPD;
+ integer k;
+ IPD.nextprime(k,Givaro::ModularBalanced<double>::minCardinality()-1);
+ Givaro::ModularBalanced<double> Fmin (k);
+ Givaro::ModularBalanced<double> F5 (5);
+ Givaro::ModularBalanced<double> F7 (7);
- integer k = FieldTraits<ModularBalanced<double> >::maxModulus() ;
- prevprime(k,k);
- ModularBalanced<double> I_int(k);
+ IPD.prevprime(k,Givaro::ModularBalanced<double>::maxCardinality()+1);
+ Givaro::ModularBalanced<double> Fmax(k);
+ IPD.prevprime(k,k/2);
+ Givaro::ModularBalanced<double> Fmid(k);
// Make sure some more detailed messages get printed
commentator().getMessageClass (INTERNAL_DESCRIPTION).setMaxDepth (4);
commentator().getMessageClass (INTERNAL_DESCRIPTION).setMaxDetailLevel (Commentator::LEVEL_UNIMPORTANT);
- if (!runFieldTests (F_int, "ModularBalanced<double>", iterations, n, false)) pass = false;
- // if (!testRandomIterator (F_int, "ModularBalanced<double>", trials, categories, hist_level)) pass = false;
+ commentator().report() << "Fmin modulus is " << Fmin.cardinality() << std::endl;
+ if (!runFieldTests (Fmin, "Givaro::ModularBalanced<double> Fmin", iterations, n, false)) pass = false;
+ // if (!testRandomIterator (Fmin, "Givaro::ModularBalanced<double>", trials, categories, hist_level)) pass = false;
+
+ commentator().report() << "F5 modulus is " << F5.cardinality() << std::endl;
+ if (!runFieldTests (F5, "Givaro::ModularBalanced<double> F5", iterations, n, false)) pass = false;
+ // if (!testRandomIterator (F5, "Givaro::ModularBalanced<double>", trials, categories, hist_level)) pass = false;
- if (!runFieldTests (G_int, "ModularBalanced<double>", iterations, n, false)) pass = false;
- // if (!testRandomIterator (G_int, "ModularBalanced<double>", trials, categories, hist_level)) pass = false;
+ commentator().report() << "F7 modulus is " << F7.cardinality() << std::endl;
+ if (!runFieldTests (F7, "Givaro::ModularBalanced<double> F7", iterations, n, false)) pass = false;
+ // if (!testRandomIterator (F7, "Givaro::ModularBalanced<double>", trials, categories, hist_level)) pass = false;
- if (!runFieldTests (H_int, "ModularBalanced<double>", iterations, n, false)) pass = false;
- // if (!testRandomIterator (H_int, "ModularBalanced<double>", trials, categories, hist_level)) pass = false;
+ commentator().report() << "Fmax modulus is " << Fmax.cardinality() << std::endl;
+ commentator().report() << "maxCardinality is " << Givaro::ModularBalanced<double>::maxCardinality() << std::endl;
+ if (!runFieldTests (Fmax, "Givaro::ModularBalanced<double> Fmax", iterations, n, false)) pass = false;
+ // if (!testRandomIterator (Fmax, "Givaro::ModularBalanced<double>", trials, categories, hist_level)) pass = false;
- if (!runFieldTests (I_int, "ModularBalanced<double>", iterations, n, false)) pass = false;
- // if (!testRandomIterator (I_int, "ModularBalanced<double>", trials, categories, hist_level)) pass = false;
+ commentator().report() << "Fmid modulus is " << Fmid.cardinality() << std::endl;
+ if (!runFieldTests (Fmid, "Givaro::ModularBalanced<double> Fmid", iterations, n, false)) pass = false;
+ // if (!testRandomIterator (Fmid, "Givaro::ModularBalanced<double>", trials, categories, hist_level)) pass = false;
- commentator().stop("ModularBalanced<double> field test suite");
+ commentator().stop("Givaro::ModularBalanced<double> field test suite");
return pass ? 0 : -1;
}
diff --git a/tests/test-modular-balanced-float.C b/tests/test-modular-balanced-float.C
index 2c426dd..0b5af84 100644
--- a/tests/test-modular-balanced-float.C
+++ b/tests/test-modular-balanced-float.C
@@ -28,17 +28,14 @@
* @test tests only runFieldTests on modular-balanced-float
*/
-
+#include <linbox/linbox-config.h>
+#include <givaro/modular-balanced.h>
+#include <givaro/givintprime.h>
#include "linbox/linbox-config.h"
+#include "linbox/util/commentator.h"
+#include "linbox/util/debug.h"
-#include <iostream>
-#include <fstream>
-#include <sstream>
-#include <vector>
-#include <queue>
-
-#include "linbox/field/modular-balanced.h"
#include "test-common.h"
#include "test-generic.h"
@@ -50,7 +47,7 @@ using namespace LinBox;
int main (int argc, char **argv)
{
static size_t n = 1000;
- static int iterations = 1;
+ static unsigned int iterations = 1;
static int trials = 10000;
static int categories = 1000;
static int hist_level = 10;
@@ -66,36 +63,48 @@ int main (int argc, char **argv)
parseArguments (argc, argv, args);
- commentator().start("ModularBalanced<float> field test suite", "ModularBalanced<float>");
+ commentator().start("Givaro::ModularBalanced<float> field test suite", "Givaro::ModularBalanced<float>");
bool pass = true;
- ModularBalanced<float> F_int (4093);//(2147483629);//(2147483647);
- ModularBalanced<float> G_int (2011);
- ModularBalanced<float> H_int (3);
- integer k = FieldTraits<ModularBalanced<float> >::maxModulus() ;
- prevprime(k,k);
- ModularBalanced<float> I_int(k);
+ Givaro::IntPrimeDom IPD;
+ integer k;
+ IPD.nextprime(k,Givaro::ModularBalanced<float>::minCardinality()-1);
+ Givaro::ModularBalanced<float> Fmin (k);
+ Givaro::ModularBalanced<float> F5 (5);
+ Givaro::ModularBalanced<float> F7 (7);
+
+ IPD.prevprime(k,Givaro::ModularBalanced<float>::maxCardinality()+1);
+ Givaro::ModularBalanced<float> Fmax(k);
+ IPD.prevprime(k,k/2);
+ Givaro::ModularBalanced<float> Fmid(k);
// Make sure some more detailed messages get printed
commentator().getMessageClass (INTERNAL_DESCRIPTION).setMaxDepth (4);
commentator().getMessageClass (INTERNAL_DESCRIPTION).setMaxDetailLevel (Commentator::LEVEL_UNIMPORTANT);
- if (!runFieldTests (F_int, "ModularBalanced<float>", iterations, n, false)) pass = false;
- // if (!testRandomIterator (F_int, "ModularBalanced<float>", trials, categories, hist_level)) pass = false;
-
- if (!runFieldTests (G_int, "ModularBalanced<float>", iterations, n, false)) pass = false;
- // if (!testRandomIterator (G_int, "ModularBalanced<float>", trials, categories, hist_level)) pass = false;
+ commentator().report() << "Fmin modulus is " << Fmin.cardinality() << std::endl;
+ if (!runFieldTests (Fmin, "Givaro::ModularBalanced<float> Fmin", iterations, n, false)) pass = false;
+ // if (!testRandomIterator (Fmin, "Givaro::ModularBalanced<float>", trials, categories, hist_level)) pass = false;
- if (!runFieldTests (H_int, "ModularBalanced<float>", iterations, n, false)) pass = false;
- // if (!testRandomIterator (H_int, "ModularBalanced<float>", trials, categories, hist_level)) pass = false;
+ commentator().report() << "F5 modulus is " << F5.cardinality() << std::endl;
+ if (!runFieldTests (F5, "Givaro::ModularBalanced<float> F5", iterations, n, false)) pass = false;
+ // if (!testRandomIterator (F5, "Givaro::ModularBalanced<float>", trials, categories, hist_level)) pass = false;
- if (!runFieldTests (I_int, "ModularBalanced<float>", iterations, n, false)) pass = false;
- // if (!testRandomIterator (I_int, "ModularBalanced<float>", trials, categories, hist_level)) pass = false;
+ commentator().report() << "F7 modulus is " << F7.cardinality() << std::endl;
+ if (!runFieldTests (F7, "Givaro::ModularBalanced<float> F7", iterations, n, false)) pass = false;
+ // if (!testRandomIterator (F7, "Givaro::ModularBalanced<float>", trials, categories, hist_level)) pass = false;
+ commentator().report() << "Fmax modulus is " << Fmax.cardinality() << std::endl;
+ commentator().report() << "maxCardinality is " << Givaro::ModularBalanced<float>::maxCardinality() << std::endl;
+ if (!runFieldTests (Fmax, "Givaro::ModularBalanced<float> Fmax", iterations, n, false)) pass = false;
+ // if (!testRandomIterator (Fmax, "Givaro::ModularBalanced<float>", trials, categories, hist_level)) pass = false;
+ commentator().report() << "Fmid modulus is " << Fmid.cardinality() << std::endl;
+ if (!runFieldTests (Fmid, "Givaro::ModularBalanced<float> Fmid", iterations, n, false)) pass = false;
+ // if (!testRandomIterator (Fmid, "Givaro::ModularBalanced<float>", trials, categories, hist_level)) pass = false;
- commentator().stop("ModularBalanced<float> field test suite");
+ commentator().stop("Givaro::ModularBalanced<float> field test suite");
return pass ? 0 : -1;
}
diff --git a/tests/test-modular-balanced-int.C b/tests/test-modular-balanced-int.C
index 968e88a..9f65339 100644
--- a/tests/test-modular-balanced-int.C
+++ b/tests/test-modular-balanced-int.C
@@ -1,71 +1,101 @@
-/* Copyright (C) LinBox
+/* tests/test-modular-balanced-int.C
+ * Copyright (C) 2001, 2002 Bradford Hovinen,
+ * Copyright (C) 2002, 2015 Dave Saunders
*
+ * Written by Bradford Hovinen <hovinen at cis.udel.edu>,
+ * Dave Saunders <saunders at cis.udel.edu>
+ *
+ * ------------------------------------
+ * 2002-04-10 Bradford Hovinen <hovinen at cis.udel.edu>
+ *
+ * Rename from test-large-modular.C to test-modular.C; made other updates in
+ * accordance with changes to Givaro::ModularBalanced interace.
+ * ------------------------------------
*
*
* ========LICENCE========
* This file is part of the library LinBox.
*
- * LinBox is free software: you can redistribute it and/or modify
+ * LinBox is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library 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
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
* ========LICENCE========
+ *.
*/
-
-/*! @file tests/test-modular-balanced-int.C
+/*! @file tests/test-modular-balanced-int.C
* @ingroup tests
- * @brief tests only runFieldTests on modular-balanced-int32_t
- * @test tests only runFieldTests on modular-balanced-int32_t
+ * @brief For each integer type T, Givaro::ModularBalanced<T> is tested with a small primm and with a large prime using runFieldTests and testRandomIterator.
*/
+#include <linbox/linbox-config.h>
+#include "givaro/modular-balanced.h"
+#include "givaro/givintprime.h"
-#include "linbox/linbox-config.h"
-
-#include <iostream>
-#include <fstream>
-#include <sstream>
-#include <vector>
-#include <queue>
-
-#include "linbox/field/modular-balanced.h"
-
-#include "test-common.h"
-#include "test-generic.h"
-
+#include "test-field.h"
using namespace LinBox;
-/*! @bug the arguments are meaningless
- */
+template<class int_type>
+bool launchTests(string int_type_name, integer q, size_t n, uint32_t trials, uint32_t categories, uint32_t hist_level)
+ {
+ using Field = Givaro::ModularBalanced<int_type>;
+ bool pass = true ;
+
+ string field_name = "Givaro::ModularBalanced<" + int_type_name + ">";
+ string title = field_name + " field test suite";
+
+ commentator().start(title.c_str(), field_name.c_str());
+ // Make sure some more detailed messages get printed
+ commentator().getMessageClass (INTERNAL_DESCRIPTION).setMaxDepth (4);
+ commentator().getMessageClass (INTERNAL_DESCRIPTION).setMaxDetailLevel (Commentator::LEVEL_UNIMPORTANT);
+
+ commentator().report() << field_name << " range: [" << Field::minCardinality() << "," << Field::maxCardinality() << "]" << std::endl;
+
+ Field FS(q);
+ pass &= runFieldTests (FS, field_name.c_str(), 1, n, false);
+ pass &= testRandomIterator (FS, field_name.c_str(), trials, categories, hist_level);
+
+ Givaro::IntPrimeDom IPD;
+ integer k = Field::maxCardinality();
+ if (k > 0) {
+ IPD.prevprime(k,k + 1);
+ } else {
+ static integer qi("18446744073709551557");
+ k = qi;
+ }
+ Field FL(k);
+ pass &= runFieldTests (FL, field_name.c_str(), 1, n, false);
+ pass &= testRandomIterator (FL, field_name.c_str(), trials, categories, hist_level);
+
+ commentator().stop(MSG_STATUS(pass), "field test-suite");
+ return pass;
+ }
+
int main (int argc, char **argv)
{
- static integer q1("18446744073709551557");
- static integer q2 = 2147483647;
- static integer q3 = 65521U;
- static int q4 = 101;
- static size_t n = 1000;
- static int iterations = 1;
- static int trials = 10000;
- static int categories = 1000;
- static int hist_level = 10;
+ // for field testing
+ static integer q = 5; // small prime valid for all int types.
+
+ // for randiter testing
+ static size_t n = 10000;
+ static unsigned int trials = 10000;
+ static unsigned int categories = 1000;
+ static unsigned int hist_level = 10;
static Argument args[] = {
- { 'K', "-K Q", "Operate over the \"field\" GF(Q) [1] for integer modulus.", TYPE_INTEGER, &q1 },
- { 'Q', "-Q Q", "Operate over the \"field\" GF(Q) [1] for uint32_t modulus.", TYPE_INTEGER, &q2 },
- { 'q', "-q Q", "Operate over the \"field\" GF(Q) [1] for uint16_t modulus.", TYPE_INTEGER, &q3 },
- { 'p', "-p P", "Operate over the \"field\" GF(Q) [1] for uint8_t modulus.", TYPE_INT, &q4 },
+ { 'K', "-K Q", "to use ModularBalanced<T> F(q). Must be valid for all int types T. (A large prime is also used.)", TYPE_INTEGER, &q },
{ 'n', "-n N", "Set dimension of test vectors to NxN.", TYPE_INT, &n },
- { 'i', "-i I", "Perform each test for I iterations.", TYPE_INT, &iterations },
{ 't', "-t T", "Number of trials for the random iterator test.", TYPE_INT, &trials },
{ 'c', "-c C", "Number of categories for the random iterator test.", TYPE_INT, &categories },
{ 'H', "-H H", "History level for random iterator test.", TYPE_INT, &hist_level },
@@ -74,43 +104,30 @@ int main (int argc, char **argv)
parseArguments (argc, argv, args);
- commentator().start("ModularBalanced<int32_t> field test suite", "ModularBalanced<int32_t>");
bool pass = true;
- ModularBalanced<int32_t> F_int (1073741789);//(2147483629);//(2147483647);
- ModularBalanced<int32_t> G_int (2147483647);
- ModularBalanced<int32_t> H_int (3);
- integer k = FieldTraits<ModularBalanced<int32_t> >::maxModulus() ;
- prevprime(k,k);
- ModularBalanced<int32_t> I_int(k);
-
- // Make sure some more detailed messages get printed
- commentator().getMessageClass (INTERNAL_DESCRIPTION).setMaxDepth (4);
- commentator().getMessageClass (INTERNAL_DESCRIPTION).setMaxDetailLevel (Commentator::LEVEL_UNIMPORTANT);
-
- if (!runFieldTests (F_int, "ModularBalanced<int32_t>", iterations, n, false)) pass = false;
- if (!testRandomIterator (F_int, "ModularBalanced<int32_t>", trials, categories, hist_level)) pass = false;
-
- if (!runFieldTests (G_int, "ModularBalanced<int32_t>", iterations, n, false)) pass = false;
- if (!testRandomIterator (G_int, "ModularBalanced<int32_t>", trials, categories, hist_level)) pass = false;
-
- if (!runFieldTests (H_int, "ModularBalanced<int32_t>", iterations, n, false)) pass = false;
- if (!testRandomIterator (H_int, "ModularBalanced<int32_t>", trials, categories, hist_level)) pass = false;
-
- if (!runFieldTests (I_int, "ModularBalanced<int32_t>", iterations, n, false)) pass = false;
- // if (!testRandomIterator (I_int, "ModularBalanced<int32_t>", trials, categories, hist_level)) pass = false;
+ pass &= launchTests<int64_t>("int64_t",q,n,trials,categories,hist_level);
+ pass &= launchTests<int32_t>("int32_t",q,n,trials,categories,hist_level);
+/* these are not in givaro/modular-balanced.h
+ pass &= launchTests<integer>("integer",q,n,trials,categories,hist_level);
+ pass &= launchTests<uint64_t>("uint64_t",q,n,trials,categories,hist_level);
+ pass &= launchTests<uint32_t>("uint32_t",q,n,trials,categories,hist_level);
+ pass &= launchTests<int16_t>("int16_t",q,n,trials,categories,hist_level);
+ pass &= launchTests<int8_t>("int8_t",q,n,trials,categories,hist_level);
+ pass &= launchTests<uint16_t>("uint16_t",q,n,trials,categories,hist_level);
+ pass &= launchTests<uint8_t>("uint8_t",q,n,trials,categories,hist_level);
+*/
- commentator().stop("ModularBalanced<int32_t> field test suite");
return pass ? 0 : -1;
}
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
// Local Variables:
// mode: C++
// tab-width: 8
// indent-tabs-mode: nil
// c-basic-offset: 8
// End:
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/tests/test-modular-byte.C b/tests/test-modular-byte.C
index 61ef15f..5497959 100644
--- a/tests/test-modular-byte.C
+++ b/tests/test-modular-byte.C
@@ -10,23 +10,23 @@
* 2002-04-10 Bradford Hovinen <hovinen at cis.udel.edu>
*
* Rename from test-large-modular.C to test-modular.C; made other updates in
- * accordance with changes to Modular interace.
+ * accordance with changes to Givaro::Modular interace.
* ------------------------------------
*
- *
+ *
* ========LICENCE========
* This file is part of the library LinBox.
- *
+ *
* LinBox is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
- *
+ *
* This library 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
* Lesser General Public License for more details.
- *
+ *
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
@@ -48,10 +48,10 @@
#include <iostream>
#include <fstream>
#include <sstream>
-#include <vector>
+
#include <queue>
-#include "linbox/field/modular.h"
+#include "linbox/ring/modular.h"
#include "test-common.h"
#include "test-generic.h"
@@ -62,10 +62,10 @@ int main (int argc, char **argv)
{
static integer q = 127;
static size_t n = 300;
- static int iterations = 1;
- static int trials = 10000;
- static int categories = 1000;
- static int hist_level = 10;
+ static unsigned int iterations = 1;
+ static unsigned int trials = 10000;
+ static unsigned int categories = 1000;
+ static unsigned int hist_level = 10;
static Argument args[] = {
{ 'p', "-p Q", "Operate over the \"field\" GF(Q) [1] for integer modulus.", TYPE_INTEGER, &q },
@@ -79,13 +79,13 @@ int main (int argc, char **argv)
parseArguments (argc, argv, args);
- commentator().start("Modular<int8_t> field test suite", "Modular<int8_t>");
+ commentator().start("Givaro::Modular<int8_t> field test suite", "Givaro::Modular<int8_t>");
bool pass = true;
- Modular<int8_t> F(q);
+ Givaro::Modular<int8_t> F(q);
- integer k = FieldTraits<Modular<int8_t> >::maxModulus() ;
+ integer k = FieldTraits<Givaro::Modular<int8_t> >::maxModulus() ;
prevprime(k,k);
- Modular<int8_t> I_int(k);
+ Givaro::Modular<int8_t> I_int(k);
@@ -93,14 +93,14 @@ int main (int argc, char **argv)
commentator().getMessageClass (INTERNAL_DESCRIPTION).setMaxDepth (4);
commentator().getMessageClass (INTERNAL_DESCRIPTION).setMaxDetailLevel (Commentator::LEVEL_UNIMPORTANT);
- if (!runFieldTests (F, "Modular<byte>", iterations, n, false)) pass = false;
- if (!testRandomIterator (F, "Modular<byte>", trials, categories, hist_level)) pass = false;
+ if (!runFieldTests (F, "Givaro::Modular<byte>", iterations, n, false)) pass = false;
+ if (!testRandomIterator (F, "Givaro::Modular<byte>", trials, categories, hist_level)) pass = false;
- if (!runFieldTests (I_int, "Modular<int8_t>", iterations, n, false)) pass = false;
- if (!testRandomIterator (I_int, "Modular<int8_t>", trials, categories, hist_level)) pass = false;
+ if (!runFieldTests (I_int, "Givaro::Modular<int8_t>", iterations, n, false)) pass = false;
+ if (!testRandomIterator (I_int, "Givaro::Modular<int8_t>", trials, categories, hist_level)) pass = false;
- commentator().stop("Modular<int8_t> field test suite");
+ commentator().stop("Givaro::Modular<int8_t> field test suite");
return pass ? 0 : -1;
}
diff --git a/tests/test-modular-double.C b/tests/test-modular-double.C
index 1a501b6..3caf888 100644
--- a/tests/test-modular-double.C
+++ b/tests/test-modular-double.C
@@ -14,23 +14,23 @@
* 2002-04-10 Bradford Hovinen <hovinen at cis.udel.edu>
*
* Rename from test-large-modular.C to test-modular.C; made other updates in
- * accordance with changes to Modular interace.
+ * accordance with changes to Givaro::Modular interace.
* ------------------------------------
*
- *
+ *
* ========LICENCE========
* This file is part of the library LinBox.
- *
+ *
* LinBox is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
- *
+ *
* This library 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
* Lesser General Public License for more details.
- *
+ *
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
@@ -44,26 +44,16 @@
* @test tests only runFieldTests for modular-double.
*/
-
+#include "givaro/givintprime.h"
#include "linbox/linbox-config.h"
-
-#include <iostream>
-#include <fstream>
-#include <sstream>
-#include <vector>
-#include <queue>
-
-#include "linbox/field/modular.h"
-
-#include "test-common.h"
-#include "test-generic.h"
-
+#include "linbox/ring/modular.h"
+#include "test-field.h"
using namespace LinBox;
int main (int argc, char **argv)
{
static size_t n = 10000;
- static int iterations = 1;
+ static unsigned int iterations = 1;
static Argument args[] = {
{ 'n', "-n N", "Set dimension of test vectors to NxN.", TYPE_INT, &n },
@@ -73,20 +63,18 @@ int main (int argc, char **argv)
parseArguments (argc, argv, args);
- commentator().start("Modular<double> field test suite", "Modular<double>");
+ commentator().start("Givaro::Modular<double> field test suite", "Givaro::Modular<double>");
bool pass = true;
- //Modular<double> F2 (2);
- Modular<double> F3 (3);
- Modular<double> F5 (5);
- Modular<double> F7 (7);
- Modular<double> F11 (11);
- Modular<double> F (32749);
- Modular<double> G (65521);
- //Modular<double> H (1099511627689);
- integer k = FieldTraits<Modular<double> >::maxModulus() ;
- prevprime(k,k);
- Modular<double> I_int(k);
+ Givaro::Modular<double> F2 (2);
+ Givaro::Modular<double> F5 (5);
+ Givaro::Modular<double> F7 (7);
+ Givaro::IntPrimeDom IPD;
+ integer k = Givaro::Modular<double>::maxCardinality()+1;
+ IPD.prevprime(k, k);
+ Givaro::Modular<double> Fmax(k);
+ IPD.prevprime(k, k/2);
+ Givaro::Modular<double> Fmid(k);
// Make sure some more detailed messages get printed
@@ -94,23 +82,17 @@ int main (int argc, char **argv)
commentator().getMessageClass (INTERNAL_DESCRIPTION).setMaxDetailLevel (Commentator::LEVEL_UNIMPORTANT);
std::ostream& report = commentator().report();
report << "Field F2" << std::endl;
- //if (!runFieldTests (F2, "Modular<double>", iterations, n, false)) pass = false;
- report << "Field F3" << std::endl;
- if (!runFieldTests (F3, "Modular<double>", iterations, n, false)) pass = false;
+ if (!runFieldTests (F2, "Givaro::Modular<double>", iterations, n, false)) pass = false;
report << "Field F5" << std::endl;
- if (!runFieldTests (F5, "Modular<double>", iterations, n, false)) pass = false;
+ if (!runFieldTests (F5, "Givaro::Modular<double>", iterations, n, false)) pass = false;
report << "Field F7" << std::endl;
- if (!runFieldTests (F7, "Modular<double>", iterations, n, false)) pass = false;
- report << "Field F11" << std::endl;
- if (!runFieldTests (F11, "Modular<double>", iterations, n, false)) pass = false;
- report << "Field F" << std::endl;
- if (!runFieldTests (F, "Modular<double>", iterations, n, false)) pass = false;
- report << "Field G" << std::endl;
- if (!runFieldTests (G, "Modular<double>", iterations, n, false)) pass = false;
-
- if (!runFieldTests (I_int, "Modular<double>", iterations, n, false)) pass = false;
+ if (!runFieldTests (F7, "Givaro::Modular<double>", iterations, n, false)) pass = false;
+ report << "Field Fmax" << std::endl;
+ if (!runFieldTests (Fmax, "Givaro::Modular<double>", iterations, n, false)) pass = false;
+ report << "Field Fmid" << std::endl;
+ if (!runFieldTests (Fmid, "Givaro::Modular<double>", iterations, n, false)) pass = false;
- commentator().stop("Modular<double> field test suite");
+ commentator().stop("Givaro::Modular<double> field test suite");
return pass ? 0 : -1;
}
diff --git a/tests/test-modular-float.C b/tests/test-modular-float.C
index aa4a79f..ed28496 100644
--- a/tests/test-modular-float.C
+++ b/tests/test-modular-float.C
@@ -14,23 +14,23 @@
* 2002-04-10 Bradford Hovinen <hovinen at cis.udel.edu>
*
* Rename from test-large-modular.C to test-modular.C; made other updates in
- * accordance with changes to Modular interace.
+ * accordance with changes to Givaro::Modular interace.
* ------------------------------------
*
- *
+ *
* ========LICENCE========
* This file is part of the library LinBox.
- *
+ *
* LinBox is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
- *
+ *
* This library 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
* Lesser General Public License for more details.
- *
+ *
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
@@ -40,29 +40,20 @@
/*! @file tests/test-modular-float.C
* @ingroup tests
- * @warning F2 not tested
+ * @brief tests only runFieldTests for modular-float.
+ * @test tests only runFieldTests for modular-float.
*/
-
+#include "givaro/givintprime.h"
#include "linbox/linbox-config.h"
-
-#include <iostream>
-#include <fstream>
-#include <sstream>
-#include <vector>
-#include <queue>
-
-#include "linbox/field/modular.h"
-
-#include "test-generic.h"
-#include "test-common.h"
-
+#include "linbox/ring/modular.h"
+#include "test-field.h"
using namespace LinBox;
int main (int argc, char **argv)
{
static size_t n = 10000;
- static int iterations = 1;
+ static unsigned int iterations = 1;
static Argument args[] = {
{ 'n', "-n N", "Set dimension of test vectors to NxN.", TYPE_INT, &n },
@@ -72,44 +63,36 @@ int main (int argc, char **argv)
parseArguments (argc, argv, args);
- commentator().start("Modular<float> field test suite", "Modular<float>");
+ commentator().start("Givaro::Modular<float> field test suite", "Givaro::Modular<float>");
bool pass = true;
- //Modular<float> F2 (2);
- Modular<float> F3 (3);
- Modular<float> F5 (5);
- Modular<float> F7 (7);
- Modular<float> F11 (11);
- // Modular<float> F (2011);
- // Modular<float> G (4093);
- //Modular<float> H (1099511627689);
- integer k = FieldTraits<Modular<float> >::maxModulus() ;
- prevprime(k,k);
- Modular<float> I_int(k);
+ Givaro::Modular<float> F2 (2);
+ Givaro::Modular<float> F5 (5);
+ Givaro::Modular<float> F7 (7);
+ Givaro::IntPrimeDom IPD;
+ integer k = Givaro::Modular<float>::maxCardinality()+1;
+ IPD.prevprime(k, k);
+ Givaro::Modular<float> Fmax(k);
+ IPD.prevprime(k, k/2);
+ Givaro::Modular<float> Fmid(k);
// Make sure some more detailed messages get printed
commentator().getMessageClass (INTERNAL_DESCRIPTION).setMaxDepth (4);
commentator().getMessageClass (INTERNAL_DESCRIPTION).setMaxDetailLevel (Commentator::LEVEL_UNIMPORTANT);
std::ostream& report = commentator().report();
- // report << "Field F2" << std::endl;
- //if (!runFieldTests (F2, "Modular<float>", iterations, n, false)) pass = false;
- report << "Field F3" << std::endl;
- if (!runFieldTests (F3, "Modular<float>", iterations, n, false)) pass = false;
+ report << "Field F2" << std::endl;
+ if (!runFieldTests (F2, "Givaro::Modular<float>", iterations, n, false)) pass = false;
report << "Field F5" << std::endl;
- if (!runFieldTests (F5, "Modular<float>", iterations, n, false)) pass = false;
+ if (!runFieldTests (F5, "Givaro::Modular<float>", iterations, n, false)) pass = false;
report << "Field F7" << std::endl;
- if (!runFieldTests (F7, "Modular<float>", iterations, n, false)) pass = false;
- report << "Field F11" << std::endl;
- if (!runFieldTests (F11, "Modular<float>", iterations, n, false)) pass = false;
- // report << "Field F" << std::endl;
- // if (!runFieldTests (F, "Modular<float>", iterations, n, false)) pass = false;
- // report << "Field G" << std::endl;
- // if (!runFieldTests (G, "Modular<float>", iterations, n, false)) pass = false;
-
- if (!runFieldTests (I_int, "Modular<float>", iterations, n, false)) pass = false;
+ if (!runFieldTests (F7, "Givaro::Modular<float>", iterations, n, false)) pass = false;
+ report << "Field Fmax" << std::endl;
+ if (!runFieldTests (Fmax, "Givaro::Modular<float>", iterations, n, false)) pass = false;
+ report << "Field Fmid" << std::endl;
+ if (!runFieldTests (Fmid, "Givaro::Modular<float>", iterations, n, false)) pass = false;
- commentator().stop("Modular<float> field test suite");
+ commentator().stop("Givaro::Modular<float> field test suite");
return pass ? 0 : -1;
}
diff --git a/tests/test-modular-int.C b/tests/test-modular-int.C
index 0224a98..cc0b8af 100644
--- a/tests/test-modular-int.C
+++ b/tests/test-modular-int.C
@@ -1,7 +1,6 @@
-
/* tests/test-modular.C
* Copyright (C) 2001, 2002 Bradford Hovinen,
- * Copyright (C) 2002 Dave Saunders
+ * Copyright (C) 2002, 2015 Dave Saunders
*
* Written by Bradford Hovinen <hovinen at cis.udel.edu>,
* Dave Saunders <saunders at cis.udel.edu>
@@ -10,23 +9,23 @@
* 2002-04-10 Bradford Hovinen <hovinen at cis.udel.edu>
*
* Rename from test-large-modular.C to test-modular.C; made other updates in
- * accordance with changes to Modular interace.
+ * accordance with changes to Givaro::Modular interace.
* ------------------------------------
*
- *
+ *
* ========LICENCE========
* This file is part of the library LinBox.
- *
+ *
* LinBox is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
- *
+ *
* This library 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
* Lesser General Public License for more details.
- *
+ *
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
@@ -36,45 +35,65 @@
/*! @file tests/test-modular-int.C
* @ingroup tests
- * @brief run runFieldTests testRandomIterator tests on modular-int32_t
- * @test run runFieldTests testRandomIterator tests on modular-int32_t
+ * @brief For each integer type T, Givaro::Modular<T> is tested with a small primm and with a large prime using runFieldTests and testRandomIterator.
*/
-
+#include "givaro/givintprime.h"
#include "linbox/linbox-config.h"
-
-#include <iostream>
-#include <fstream>
-#include <sstream>
-#include <vector>
-#include <queue>
-
-#include "linbox/field/modular.h"
-
-#include "test-common.h"
-#include "test-generic.h"
-
+#include "linbox/ring/modular.h"
+#include "test-field.h"
using namespace LinBox;
+template<class int_type>
+bool launchTests(string int_type_name, integer q, size_t n, uint32_t trials, uint32_t categories, uint32_t hist_level)
+ {
+ using Field = Givaro::Modular<int_type>;
+ bool pass = true ;
+
+ string field_name = "Givaro::Modular<" + int_type_name + ">";
+ string title = field_name + " field test suite";
+
+ commentator().start(title.c_str(), field_name.c_str());
+ // Make sure some more detailed messages get printed
+ commentator().getMessageClass (INTERNAL_DESCRIPTION).setMaxDepth (4);
+ commentator().getMessageClass (INTERNAL_DESCRIPTION).setMaxDetailLevel (Commentator::LEVEL_UNIMPORTANT);
+
+ commentator().report() << field_name << " range: [" << Field::minCardinality() << "," << Field::maxCardinality() << "]" << std::endl;
+
+ Field FS(q);
+ pass &= runFieldTests (FS, field_name.c_str(), 1, n, false);
+ pass &= testRandomIterator (FS, field_name.c_str(), trials, categories, hist_level);
+
+ Givaro::IntPrimeDom IPD;
+ integer k = Field::maxCardinality();
+ if (k > 0) {
+ IPD.prevprime(k,k);
+ } else {
+ static integer qi("18446744073709551557");
+ k = qi;
+ }
+ Field FL(k);
+ pass &= runFieldTests (FL, field_name.c_str(), 1, n, false);
+ pass &= testRandomIterator (FL, field_name.c_str(), trials, categories, hist_level);
+
+ commentator().stop(MSG_STATUS(pass), "field test-suite");
+ return pass;
+ }
+
int main (int argc, char **argv)
{
- static integer q1("18446744073709551557");
- static integer q2 = 2147483647;
- static integer q3 = 65521U;
- static int q4 = 101;
+ // for field testing
+ static integer q = 5; // small prime valid for for all int types.
+
+ // for randiter testing
static size_t n = 10000;
- static int iterations = 1;
- static int trials = 10000;
- static int categories = 1000;
- static int hist_level = 10;
+ static unsigned int trials = 10000;
+ static unsigned int categories = 1000;
+ static unsigned int hist_level = 10;
static Argument args[] = {
- { 'K', "-K Q", "Operate over the \"field\" GF(Q) [1] for integer modulus.", TYPE_INTEGER, &q1 },
- { 'Q', "-Q Q", "Operate over the \"field\" GF(Q) [1] for uint32_t modulus.", TYPE_INTEGER, &q2 },
- { 'q', "-q Q", "Operate over the \"field\" GF(Q) [1] for uint16_t modulus.", TYPE_INTEGER, &q3 },
- { 'p', "-p P", "Operate over the \"field\" GF(Q) [1] for uint8_t modulus.", TYPE_INT, &q4 },
+ { 'K', "-K Q", "to use Modular<T> F(q). Must be valid for all int types T. (A large prime is also used.)", TYPE_INTEGER, &q },
{ 'n', "-n N", "Set dimension of test vectors to NxN.", TYPE_INT, &n },
- { 'i', "-i I", "Perform each test for I iterations.", TYPE_INT, &iterations },
{ 't', "-t T", "Number of trials for the random iterator test.", TYPE_INT, &trials },
{ 'c', "-c C", "Number of categories for the random iterator test.", TYPE_INT, &categories },
{ 'H', "-H H", "History level for random iterator test.", TYPE_INT, &hist_level },
@@ -83,35 +102,28 @@ int main (int argc, char **argv)
parseArguments (argc, argv, args);
- commentator().start("Modular<int32_t> field test suite", "Modular<int32_t>");
bool pass = true;
- Modular<int32_t> F_int (1073741789);//(2147483629);//(2147483647);
- integer k = FieldTraits<Modular<int32_t> >::maxModulus() ;
- prevprime(k,k);
- Modular<int32_t> I_int(k);
-
-
- // Make sure some more detailed messages get printed
- commentator().getMessageClass (INTERNAL_DESCRIPTION).setMaxDepth (4);
- commentator().getMessageClass (INTERNAL_DESCRIPTION).setMaxDetailLevel (Commentator::LEVEL_UNIMPORTANT);
-
- if (!runFieldTests (F_int, "Modular<int32_t>", iterations, n, false)) pass = false;
- if (!testRandomIterator (F_int, "Modular<int32_t>", trials, categories, hist_level)) pass = false;
+ pass &= launchTests<integer>("integer",q,n,trials,categories,hist_level);
- if (!runFieldTests (I_int, "Modular<int32_t>", iterations, n, false)) pass = false;
- if (!testRandomIterator (I_int, "Modular<int32_t>", trials, categories, hist_level)) pass = false;
+ pass &= launchTests<int64_t>("int64_t",q,n,trials,categories,hist_level);
+ pass &= launchTests<int32_t>("int32_t",q,n,trials,categories,hist_level);
+ pass &= launchTests<uint64_t>("uint64_t",q,n,trials,categories,hist_level);
+ pass &= launchTests<uint32_t>("uint32_t",q,n,trials,categories,hist_level);
+ pass &= launchTests<int16_t>("int16_t",q,n,trials,categories,hist_level);
+ pass &= launchTests<int8_t>("int8_t",q,n,trials,categories,hist_level);
+ pass &= launchTests<uint16_t>("uint16_t",q,n,trials,categories,hist_level);
+ pass &= launchTests<uint8_t>("uint8_t",q,n,trials,categories,hist_level);
- commentator().stop("Modular<int32_t> field test suite");
return pass ? 0 : -1;
}
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
// Local Variables:
// mode: C++
// tab-width: 8
// indent-tabs-mode: nil
// c-basic-offset: 8
// End:
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/tests/test-modular-short.C b/tests/test-modular-short.C
index ef36030..41141ee 100644
--- a/tests/test-modular-short.C
+++ b/tests/test-modular-short.C
@@ -10,23 +10,23 @@
* 2002-04-10 Bradford Hovinen <hovinen at cis.udel.edu>
*
* Rename from test-large-modular.C to test-modular.C; made other updates in
- * accordance with changes to Modular interace.
+ * accordance with changes to Givaro::Modular interace.
* ------------------------------------
*
- *
+ *
* ========LICENCE========
* This file is part of the library LinBox.
- *
+ *
* LinBox is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
- *
+ *
* This library 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
* Lesser General Public License for more details.
- *
+ *
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
@@ -47,10 +47,10 @@
#include <iostream>
#include <fstream>
#include <sstream>
-#include <vector>
+
#include <queue>
-#include "linbox/field/modular.h"
+#include "linbox/ring/modular.h"
#include "test-common.h"
#include "test-field.h"
@@ -60,14 +60,14 @@ using namespace LinBox;
int main (int argc, char **argv)
{
static integer q1("18446744073709551557");
- static integer q2 = 2147483647;
+ static integer q2 = 65521;
static integer q3 = 65521U;
static int q4 = 101;
static size_t n = 10000;
- static int iterations = 1;
- static int trials = 10000;
- static int categories = 1000;
- static int hist_level = 10;
+ static unsigned int iterations = 1;
+ static unsigned int trials = 10000;
+ static unsigned int categories = 1000;
+ static unsigned int hist_level = 10;
static Argument args[] = {
{ 'K', "-K Q", "Operate over the \"field\" GF(Q) [1] for integer modulus.", TYPE_INTEGER, &q1 },
@@ -84,28 +84,28 @@ int main (int argc, char **argv)
parseArguments (argc, argv, args);
- commentator().start("Modular<short> field test suite", "Modular<short>");
+ commentator().start("Givaro::Modular<short> field test suite", "Givaro::Modular<short>");
bool pass = true;
- Modular<short> F_int (32749);
- // Modular<short> F_int (101);
- integer k = FieldTraits<Modular<short> >::maxModulus() ;
+ Givaro::Modular<short> F_int (32749);
+ // Givaro::Modular<short> F_int (101);
+ integer k = FieldTraits<Givaro::Modular<short> >::maxModulus() ;
prevprime(k,k);
- Modular<short> G_int(k);
+ Givaro::Modular<short> G_int(k);
// Make sure some more detailed messages get printed
commentator().getMessageClass (INTERNAL_DESCRIPTION).setMaxDepth (4);
commentator().getMessageClass (INTERNAL_DESCRIPTION).setMaxDetailLevel (Commentator::LEVEL_UNIMPORTANT);
- if (!runFieldTests (F_int, "Modular<short>", iterations, n, false)) pass = false;
- if (!testRandomIterator (F_int, "Modular<short>", trials, categories, hist_level)) pass = false;
+ if (!runFieldTests (F_int, "Givaro::Modular<short>", iterations, n, false)) pass = false;
+ if (!testRandomIterator (F_int, "Givaro::Modular<short>", trials, categories, hist_level)) pass = false;
- if (!runFieldTests (G_int, "Modular<short>", iterations, n, false)) pass = false;
- if (!testRandomIterator (G_int, "Modular<short>", trials, categories, hist_level)) pass = false;
+ if (!runFieldTests (G_int, "Givaro::Modular<short>", iterations, n, false)) pass = false;
+ if (!testRandomIterator (G_int, "Givaro::Modular<short>", trials, categories, hist_level)) pass = false;
- commentator().stop("Modular<short> field test suite");
+ commentator().stop("Givaro::Modular<short> field test suite");
return pass ? 0 : -1;
}
diff --git a/tests/test-modular.C b/tests/test-modular.C
index 9b5240c..efc5fcf 100644
--- a/tests/test-modular.C
+++ b/tests/test-modular.C
@@ -9,23 +9,23 @@
* 2002-04-10 Bradford Hovinen <hovinen at cis.udel.edu>
*
* Rename from test-large-modular.C to test-modular.C; made other updates in
- * accordance with changes to Modular interace.
+ * accordance with changes to Givaro::Modular interace.
* ------------------------------------
*
- *
+ *
* ========LICENCE========
* This file is part of the library LinBox.
- *
+ *
* LinBox is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
- *
+ *
* This library 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
* Lesser General Public License for more details.
- *
+ *
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
@@ -37,8 +37,8 @@
/*! @file tests/test-modular.C
* @ingroup tests
*
- * @brief runFieldTests on various <code>Modular<XXX></code> fields.
- * @test runFieldTests on various <code>Modular<XXX></code> fields.
+ * @brief runFieldTests on various <code>Givaro::Modular<XXX></code> fields.
+ * @test runFieldTests on various <code>Givaro::Modular<XXX></code> fields.
*/
@@ -48,13 +48,13 @@
#include <iostream>
#include <fstream>
#include <sstream>
-#include <vector>
+
#include <queue>
-#include "linbox/field/modular.h"
+#include "linbox/ring/modular.h"
#include "test-common.h"
-#include "test-generic.h"
+#include "test-field.h"
using namespace LinBox;
using namespace std;
@@ -62,14 +62,14 @@ using namespace std;
int main (int argc, char **argv)
{
static integer q1("18446744073709551557");
- static integer q2 = 2147483647U;
+ static integer q2 = 65521U;
static integer q3 = 65521U;
static int q4 = 101;
static size_t n = 500;
- static int iterations = 1;
- static int trials = 10000;
- static int categories = 1000;
- static int hist_level = 10;
+ static unsigned int iterations = 1;
+ static unsigned int trials = 10000;
+ static unsigned int categories = 1000;
+ static unsigned int hist_level = 10;
static Argument args[] = {
{ 'K', "-K Q", "Operate over the \"field\" GF(Q) [1] for integer modulus.", TYPE_INTEGER, &q1 },
@@ -86,40 +86,39 @@ int main (int argc, char **argv)
parseArguments (argc, argv, args);
- commentator().start("Modular test suite", "Modular ");
+ commentator().start("Givaro::Modular test suite", "Givaro::Modular ");
bool pass = true;
- Modular<integer> F_integer (q1);
- Modular<uint32_t> F_uint32_t ((uint32_t) q2);
- Modular<uint16_t> F_uint16_t ((uint16_t) q3);
- Modular<uint8_t> F_uint8_t ((uint8_t) q4);
- Modular<float> F_float ((float) q4);
+ Givaro::Modular<integer> F_integer (q1);
+ Givaro::Modular<uint32_t> F_uint32_t ((uint32_t) q2);
+ Givaro::Modular<uint16_t> F_uint16_t ((uint16_t) q3);
+ Givaro::Modular<uint8_t> F_uint8_t ((uint8_t) q4);
+ Givaro::Modular<float> F_float ((float) q4);
// Make sure some more detailed messages get printed
commentator().getMessageClass (INTERNAL_DESCRIPTION).setMaxDepth (4);
commentator().getMessageClass (INTERNAL_DESCRIPTION).setMaxDetailLevel (Commentator::LEVEL_UNIMPORTANT);
- if (!runFieldTests (F_integer,"Modular<integer>", iterations, n, false)) pass = false;
- if (!runFieldTests (F_uint32_t, "Modular<uint32_t>", iterations, n, false)) pass = false;
- if (!runFieldTests (F_uint16_t, "Modular<uint16_t>", iterations, n, false)) pass = false;
- if (!runFieldTests (F_uint8_t, "Modular<uint8_t>", iterations, n, false)) pass = false;
- if (!runFieldTests (F_float, "Modular<float>", iterations, n, false)) pass = false;
+ if (!runFieldTests (F_integer,"Givaro::Modular<integer>", iterations, n, false)) pass = false;
+ if (!runFieldTests (F_uint32_t, "Givaro::Modular<uint32_t>", iterations, n, false)) pass = false;
+ if (!runFieldTests (F_uint16_t, "Givaro::Modular<uint16_t>", iterations, n, false)) pass = false;
+ if (!runFieldTests (F_uint8_t, "Givaro::Modular<uint8_t>", iterations, n, false)) pass = false;
+ if (!runFieldTests (F_float, "Givaro::Modular<float>", iterations, n, false)) pass = false;
- if (!testRandomIterator (F_integer, "Modular<integer>", trials, categories, hist_level)) pass = false;
- if (!testRandomIterator (F_uint32_t, "Modular<uint32_t>", trials, categories, hist_level)) pass = false;
- if (!testRandomIterator (F_uint16_t, "Modular<uint16_t>", trials, categories, hist_level)) pass = false;
- if (!testRandomIterator (F_uint8_t, "Modular<uint8_t>", trials, categories, hist_level)) pass = false;
+ if (!testRandomIterator (F_integer, "Givaro::Modular<integer>", trials, categories, hist_level)) pass = false;
+ if (!testRandomIterator (F_uint32_t, "Givaro::Modular<uint32_t>", trials, categories, hist_level)) pass = false;
+ if (!testRandomIterator (F_uint16_t, "Givaro::Modular<uint16_t>", trials, categories, hist_level)) pass = false;
+ if (!testRandomIterator (F_uint8_t, "Givaro::Modular<uint8_t>", trials, categories, hist_level)) pass = false;
- commentator().stop(MSG_STATUS (pass), "Modular test suite");
+ commentator().stop(MSG_STATUS (pass), "Givaro::Modular test suite");
return pass ? 0 : -1;
}
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
// Local Variables:
// mode: C++
// tab-width: 8
// indent-tabs-mode: nil
// c-basic-offset: 8
// End:
-
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/tests/test-moore-penrose.C b/tests/test-moore-penrose.C
index 794ee80..222e405 100644
--- a/tests/test-moore-penrose.C
+++ b/tests/test-moore-penrose.C
@@ -33,14 +33,14 @@
#include "linbox/linbox-config.h"
#include <iostream>
-#include <vector>
+
#include "linbox/util/commentator.h"
#include "linbox/field/archetype.h"
-#include "linbox/field/modular.h"
-#include "linbox/randiter/nonzero.h"
+#include "linbox/ring/modular.h"
+#include <givaro/givranditer.h>
#include "linbox/blackbox/submatrix.h"
-#include "linbox/blackbox/sparse.h"
+#include "linbox/matrix/sparse-matrix.h"
#include "linbox/blackbox/moore-penrose.h"
#include "linbox/solutions/rank.h"
#include "linbox/vector/stream.h"
@@ -52,8 +52,10 @@ using namespace LinBox;
/* Build a random sparse n x m matrix of rank r with a nonsingular leading principal minor */
+#define STOR_T typename VectorTraits<Row>::SparseFormat
+
template <class Vector, class Field, class Row>
-static SparseMatrix<Field, Row>
+static SparseMatrix<Field, STOR_T>
*buildRandomSparseMatrix (Field &F,
size_t n,
size_t m,
@@ -63,11 +65,11 @@ static SparseMatrix<Field, Row>
VectorStream<Row> &top_right_stream,
VectorStream<Row> &bottom_left_stream)
{
- typedef SparseMatrix<Field, Row> Blackbox;
+ typedef SparseMatrix<Field, STOR_T> Blackbox;
Blackbox *A = new Blackbox (F, n, m);
typename Field::RandIter rnd_p (F);
- NonzeroRandIter<Field> rnd (F, rnd_p);
+ Givaro::GeneralRingNonZeroRandIter<Field> rnd (rnd_p);
typename Field::Element factor;
vector<Row> bottom_left_data (n - r);
vector<Row> top_right_data (r);
@@ -81,13 +83,13 @@ static SparseMatrix<Field, Row>
}
// Build top right part
- for (typename vector<Row>::iterator i = top_right_data.begin (); i != top_right_data.end (); i++) {
+ for (typename vector<Row>::iterator i = top_right_data.begin (); i != top_right_data.end (); ++i) {
top_right_stream.next (*i);
VD.copy (A->getRow (top_right_stream.j () - 1), *i, r);
}
// Build bottom left part
- for (typename vector<Row>::iterator i = bottom_left_data.begin (); i != bottom_left_data.end (); i++) {
+ for (typename vector<Row>::iterator i = bottom_left_data.begin (); i != bottom_left_data.end (); ++i) {
bottom_left_stream.next (*i);
VD.copy (A->getRow (r + bottom_left_stream.j () - 1), *i);
}
@@ -135,12 +137,11 @@ static bool testIdentityApply (Field &
{
typedef vector <typename Field::Element> Vector;
typedef vector <pair <size_t, typename Field::Element> > Row;
- typedef SparseMatrix <Field, Row> Blackbox;
+ typedef SparseMatrix<Field, STOR_T> Blackbox;
commentator().start ("Testing identity apply", "testIdentityApply", stream.m ());
bool ret = true;
- bool iter_passed;
Vector v, w;
@@ -153,7 +154,7 @@ static bool testIdentityApply (Field &
typename Field::Element x;
- F.init (x, 1);
+ F.assign (x, F.one);
for (i = 0; i < r; i++)
A.setEntry (i, i, x);
@@ -163,7 +164,7 @@ static bool testIdentityApply (Field &
while (stream) {
commentator().startIteration ((unsigned)i);
- iter_passed = true;
+ bool iter_passed = true;
stream.next (v);
@@ -226,12 +227,11 @@ static bool testRandomApply1 (Field &F,
VectorStream<Row> &M_stream2,
VectorStream<Vector> &stream)
{
- typedef SparseMatrix <Field, Row> Blackbox;
+ typedef SparseMatrix<Field, STOR_T> Blackbox;
commentator().start ("Testing random apply", "testRandomApply1", iterations);
bool ret = true;
- bool iter_passed;
unsigned long rank_A;
@@ -251,7 +251,7 @@ static bool testRandomApply1 (Field &F,
for (i = 0; i < iterations; i++) {
commentator().startIteration ((unsigned)i);
- iter_passed = true;
+ bool iter_passed = true;
commentator().start ("Building requisite random sparse matrix");
Blackbox *A = buildRandomSparseMatrix<Vector> (F, n, m, r, K, dinv, M_stream1, M_stream2);
@@ -264,7 +264,7 @@ static bool testRandomApply1 (Field &F,
{
ostream &report = commentator().report (Commentator::LEVEL_UNIMPORTANT, INTERNAL_DESCRIPTION);
report << "Input matrix" << endl;
- A->write (report, FORMAT_PRETTY);
+ A->write (report, Tag::FileFormat::Pretty);
}
Submatrix<Blackbox> Aprime (A, 0, 0, MIN (n, m), MIN (n, m));
@@ -336,9 +336,9 @@ int main (int argc, char **argv)
static size_t n = 100;
static size_t m = 100;
static size_t r = 10;
- static integer q = 2147483647U;
- static int iterations = 100;
- static int k = 1;
+ static integer q = 65521U;
+ static unsigned int iterations = 100;
+ static unsigned int k = 1;
static Argument args[] = {
{ 'n', "-n N", "Set row dimension of test matrices to N.", TYPE_INT, &n },
@@ -350,12 +350,12 @@ int main (int argc, char **argv)
END_OF_ARGUMENTS
};
- typedef Modular<uint32_t> Field; //C.Pernet: avoids confusion with givaro::uint32_t
+ typedef Givaro::Modular<uint32_t> Field; //C.Pernet: avoids confusion with givaro::uint32_t
typedef vector<Field::Element> DenseVector;
typedef pair<vector<size_t>, vector<Field::Element> > SparseVector;
parseArguments (argc, argv, args);
- Field F (q);
+ Field F (q); Field::RandIter gen(F);
srand ((unsigned)time (NULL));
@@ -364,11 +364,11 @@ int main (int argc, char **argv)
commentator().getMessageClass (INTERNAL_DESCRIPTION).setMaxDepth (3);
commentator().getMessageClass (INTERNAL_DESCRIPTION).setMaxDetailLevel (Commentator::LEVEL_IMPORTANT);
- RandomDenseStream<Field, DenseVector> stream1 (F, n, iterations);
- RandomDenseStream<Field, DenseVector> stream2 (F, n, k);
+ RandomDenseStream<Field, DenseVector> stream1 (F, gen, n, iterations);
+ RandomDenseStream<Field, DenseVector> stream2 (F, gen, n, k);
- RandomSparseStream<Field, SparseVector> M_stream1 (F, 0.1, n - r, r);
- RandomSparseStream<Field, SparseVector> M_stream2 (F, 0.1, r, m - r);
+ RandomSparseStream<Field, SparseVector> M_stream1 (F, gen, 0.1, n - r, r);
+ RandomSparseStream<Field, SparseVector> M_stream2 (F, gen, 0.1, r, m - r);
if (!testIdentityApply (F, n, m, r, stream1)) pass = false;
if (!testRandomApply1 (F, n, m, r, iterations, 1.0 / (double) r, M_stream1, M_stream2, stream2)) pass = false;
diff --git a/tests/test-ntl-RR.C b/tests/test-ntl-RR.C
deleted file mode 100644
index d18e455..0000000
--- a/tests/test-ntl-RR.C
+++ /dev/null
@@ -1,98 +0,0 @@
-/* tests/test-ntl-zz_p.cpp
- * Copyright (C) 2002 William J. Turner
- * Copyright (C) LinBox
- *
- * Written by William J. Turner <wjturner at math.ncsu.edu>
- *
- * ========LICENCE========
- * This file is part of the library LinBox.
- *
- * LinBox is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- * ========LICENCE========
- *
- * Function definitions for block Lanczos iteration
- *
- */
-
-
-/*! @file tests/test-ntl-RR.C
- * @ingroup tests
- * @brief no doc
- * @test no doc
- */
-
-
-
-#include "linbox/linbox-config.h"
-
-#include <iostream>
-#include <fstream>
-#include <vector>
-
-#include "linbox/field/ntl.h"
-
-#include "test-common.h"
-#include "test-generic.h"
-
-using namespace LinBox;
-
-int main (int argc, char **argv)
-{
-
- static size_t n = 10000;
- static int iterations = 1;
-
- static Argument args[] = {
- { 'n', "-n N", "Set dimension of test vectors to NxN.", TYPE_INT, &n },
- { 'i', "-i I", "Perform each test for I iterations.", TYPE_INT, &iterations },
- END_OF_ARGUMENTS
- };
-
- parseArguments (argc, argv, args);
-
- commentator().start("NTL_RR field test suite", "NTL_RR");
- bool pass = true;
-
- NTL_RR F;
-
- // Make sure some more detailed messages get printed
- commentator().getMessageClass (INTERNAL_DESCRIPTION).setMaxDepth (2);
-
- if (!runFieldTests (F, "NTL_RR", iterations, n, false)) pass = false;
-
-#if 0
- FieldArchetype K(new NTL_RR);
-
- if (!testField<FieldArchetype> (K, "Testing archetype with envelope of UnField<NTL::RR> field"))
- pass = false;
-#endif
-
- commentator().stop("NTL_RR field test suite");
- // We're going to allow failed tests here because the floating-point
- // approximation tends to screw things up anyway.
-
- // -bds: Well, compilation is checked at least. Work needed: A meaningful test is falsifyable.
-
- return !pass;
-}
-
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
-// Local Variables:
-// mode: C++
-// tab-width: 8
-// indent-tabs-mode: nil
-// c-basic-offset: 8
-// End:
-
diff --git a/tests/test-ntl-ZZ_p.C b/tests/test-ntl-ZZ_p.C
deleted file mode 100644
index 4b64ef0..0000000
--- a/tests/test-ntl-ZZ_p.C
+++ /dev/null
@@ -1,118 +0,0 @@
-
-/* tests/test-ntl-ZZ_p.C
- * Copyright (C) 2002 William J. Turner
- *
- * Written by William J. Turner <wjturner at math.ncsu.edu>
- *
- * ========LICENCE========
- * This file is part of the library LinBox.
- *
- * LinBox is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- * ========LICENCE========
- */
-
-
-/*! @file tests/test-ntl-ZZ_p.C
- * @ingroup tests
- * @brief no doc
- * @test no doc
- */
-
-
-
-#include "linbox/linbox-config.h"
-
-#include <iostream>
-#include <fstream>
-#include <vector>
-
-#include "linbox/field/ntl.h"
-
-#include "test-common.h"
-#include "test-generic.h"
-
-using namespace LinBox;
-
-int main (int argc, char **argv)
-{
- static long q = 1073741789;
- static size_t n = 10000;
- static int iterations = 1;
-
- static Argument args[] = {
- { 'q', "-q Q", "Operate over the \"field\" GF(Q) [1].", TYPE_INTEGER, &q },
- { 'n', "-n N", "Set dimension of test vectors to NxN.", TYPE_INT, &n },
- { 'i', "-i I", "Perform each test for I iterations.", TYPE_INT, &iterations },
- END_OF_ARGUMENTS
- };
-
- parseArguments (argc, argv, args);
-
- commentator().start("NTL_ZZ_p field test suite", "NTL_ZZ_p");
- bool pass = true;
-
- NTL::ZZ_p::init(NTL::to_ZZ(q));
- // UnparametricField<NTL::ZZ_p> F;
- // NTL_ZZ_p F(q); // XXX is there a q ?
- NTL_ZZ_p F;
-
- if (F.characteristic() != q)
- return false ;
-
-
- // Make sure some more detailed messages get printed
- commentator().getMessageClass (INTERNAL_DESCRIPTION).setMaxDepth (2);
-
- if (!runFieldTests (F, "NTL_ZZ_p", iterations, n, false)) pass = false;
-
-#if 0
- FieldArchetype K(new NTL_ZZ_p(101));
-
- if (!testField<FieldArchetype> (K, "Testing archetype with envelope of UnField<NTL::ZZ_p> field"))
- pass = false;
-#endif
-
- // Testing big ints
- //
- commentator().start ("\t--Testing init/convert match");
- bool part_pass = true;
- // UnparametricField<NTL::ZZ_p> G;
- // NTL_ZZ_p G(q);
- NTL_ZZ_p G;
- NTL::ZZ_p::init(NTL::to_ZZ("1234567890123456789012345678901234568123"));
- NTL_ZZ_p::Element a;
- LinBox::integer b, c("123456789012345678901234567890");
- // LinBox::integer b, c("34");
- G.init(a, c );
- G.convert(b, a);
- if ( c != b ) {
- part_pass = false;
- commentator().report (LinBox::Commentator::LEVEL_NORMAL, INTERNAL_DESCRIPTION) << "Error : " << b << " != " << c << std::endl;
- }
- commentator().stop(MSG_STATUS (part_pass));
- pass &= part_pass;
-
- commentator().stop("NTL_ZZ_p field test suite");
- return pass ? 0 : -1;
-}
-
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
-// Local Variables:
-// mode: C++
-// tab-width: 8
-// indent-tabs-mode: nil
-// c-basic-offset: 8
-// End:
-
diff --git a/tests/test-ntl-hankel.C b/tests/test-ntl-hankel.C
index 035e8b0..da46e78 100644
--- a/tests/test-ntl-hankel.C
+++ b/tests/test-ntl-hankel.C
@@ -34,10 +34,9 @@
#include <iostream>
#include <fstream>
-#include <vector>
-#include "linbox/field/ntl.h"
-#include "linbox/field/ntl.h"
+#include "linbox/ring/ntl.h"
+
#include "linbox/integer.h"
#include "linbox/blackbox/ntl-hankel.h"
@@ -56,8 +55,7 @@ int main(int argc, char* argv[])
bool pass = true;
static size_t n = 1000;
- static long q = 2147483647;
-
+ static int64_t q = 65521;
static int iterations = 1;
@@ -84,22 +82,20 @@ int main(int argc, char* argv[])
LinBox::commentator().start("Hankel black box test test suite", "Hankel");
report << "\tn= " << n << " \tq= " << q << endl ;
- // typedef LinBox::UnparametricField<NTL::ZZ_p> Field;
+ // typedef Givaro::ZRing<NTL::ZZ_p> Field;
typedef LinBox::NTL_ZZ_p Field;
- typedef Field::Element element;
- typedef std::vector<element> Vector;
+ // typedef Field::Element element;
+ typedef LinBox::BlasVector<Field> Vector;
// Now we are using the NTL wrapper as the field, call the instance F
Field F(q); //!@bug q or not q ?
- element zero;
- F.init(zero, 0);
// Use the default constructor to create a matrix
- LinBox::Hankel<Field> T;
+ // LinBox::Hankel<Field> T(F);
// Use a special constructor to construct a matrix of dim TSIZE
- int TSIZE = 2*int(n)-1;
- Vector tdata(TSIZE);
+ size_t TSIZE = 2*(n)-1;
+ Vector tdata(F, TSIZE);
report << "The random vector is:" << std::endl;
for (unsigned int i=0; i < tdata.size(); i++) {
tdata[i] = NTL::random_ZZ_p() ;
@@ -107,10 +103,12 @@ int main(int argc, char* argv[])
}
report << std::endl;
- LinBox::Hankel<Field> TT(F,tdata);
+ LinBox::Hankel<Field> TT(tdata);
+ // LinBox::Hankel<Field> TT(F,tdata);
report << "The matrix is: " << std::endl;
TT.print(report);
+#if 0
// Create an interesting input vector called idata
Vector idata((TSIZE+2)/2), odata((TSIZE+2)/2);
report << "A random col vector:\t" << std::endl;
@@ -131,31 +129,34 @@ int main(int argc, char* argv[])
TT.apply(odata, idata);
- report << "\n\nTesting apply :--------------------- \nResult is[";
+ report << "\n\nTesting apply :--------------------- \nResult is[";
for (unsigned int i = 0; i < odata.size(); i++)
report << odata[i] << " ";
report << "]\n";
- report << "Setting the matrix to UniModular Lower Triangular";
+/*
+ report << "Setting the matrix to UniGivaro::Modular Lower Triangular";
TT.setToUniModLT();
TT.print(report);
- report << "\nSetting the matrix to UniModular Upper Triangular";
+ report << "\nSetting the matrix to UniGivaro::Modular Upper Triangular";
TT.setToUniModUT();
TT.print(report);
+*/
- pass = testBlackbox(TT);
+ report << "\n\nCalling testBlackbox:--------------------- \n";
+#endif
+ pass = testBlackboxNoRW(TT);
- LinBox::commentator().stop("Hankel black box test test suite");
+ LinBox::commentator().stop(MSG_STATUS (pass),"Hankel black box test test suite");
return pass ? 0 : -1;
}
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
// Local Variables:
// mode: C++
// tab-width: 8
// indent-tabs-mode: nil
// c-basic-offset: 8
// End:
-
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/tests/test-ntl-lzz_p.C b/tests/test-ntl-lzz_p.C
index b1a6c2d..75475cd 100644
--- a/tests/test-ntl-lzz_p.C
+++ b/tests/test-ntl-lzz_p.C
@@ -34,12 +34,10 @@
#include <iostream>
#include <fstream>
-#include <vector>
-#include "linbox/field/ntl.h"
+#include "linbox/ring/ntl.h"
-#include "test-common.h"
-#include "test-generic.h"
+#include "test-field.h"
using namespace LinBox;
@@ -62,17 +60,17 @@ int main (int argc, char **argv)
bool pass = true;
//NTL::zz_p::init(q);
- //UnparametricField<NTL::zz_p> F(q);
+ //Givaro::ZRing<NTL::zz_p> F(q);
// NTL_zz_p F(q);
- NTL_zz_p F;
+ NTL_zz_p F(q);
if (F.characteristic() != q)
- return false ;
+ exit(-1);
// Make sure some more detailed messages get printed
commentator().getMessageClass (INTERNAL_DESCRIPTION).setMaxDepth (2);
- if (!runFieldTests (F, "NTL_zz_p", iterations, n, false)) pass = false;
+ if (!runFieldTests (F, "NTL_zz_p", (unsigned int)iterations, n, false)) pass = false;
#if 0
FieldArchetype K(new NTL_zz_p(101));
diff --git a/tests/test-ntl-lzz_pe.C b/tests/test-ntl-lzz_pe.C
new file mode 100644
index 0000000..b0b007b
--- /dev/null
+++ b/tests/test-ntl-lzz_pe.C
@@ -0,0 +1,94 @@
+/* tests/test-ntl-lzz_pE.C
+ * evolved by bds from tests/test-ntl-lzz_p.C
+ * Copyright (C) 2002 William J. Turner
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ * ========LICENCE========
+ */
+
+/*! @file tests/test-ntl-lzz_pE.C
+ * @ingroup tests
+ * @brief no doc.
+ * @test no doc.
+ */
+
+
+#include "linbox/linbox-config.h"
+
+#include <iostream>
+#include <fstream>
+
+
+#include "linbox/ring/ntl.h"
+
+#include "test-field.h"
+
+using namespace LinBox;
+
+int main (int argc, char **argv)
+{
+ static integer q = 3;
+ int exponent = 3;
+ static size_t n = 10000;
+ static int iterations = 1;
+
+ static Argument args[] = {
+ { 'q', "-q Q", "Operate over the \"field\" GF(Q) [1].", TYPE_INTEGER, &q },
+ { 'n', "-n N", "Set dimension of test vectors to NxN.", TYPE_INT, &n },
+ { 'i', "-i I", "Perform each test for I iterations.", TYPE_INT, &iterations },
+ END_OF_ARGUMENTS
+ };
+
+ parseArguments (argc, argv, args);
+
+ commentator().start("NTL_zz_pE field test suite", "NTL_zz_p");
+ bool pass = true;
+
+ //NTL::zz_p::init(q);
+ //Givaro::ZRing<NTL::zz_pE> F(q);
+ // NTL_zz_p F(q);
+ NTL_zz_pE F(q, exponent);
+
+ integer ch;
+ if (F.characteristic(ch) != q)
+ exit(-1);
+
+ // Make sure some more detailed messages get printed
+ commentator().getMessageClass (INTERNAL_DESCRIPTION).setMaxDepth (2);
+
+ if (!runFieldTests (F, "NTL_zz_pE", (unsigned int)iterations, n, false)) pass = false;
+
+#if 0
+ FieldArchetype K(new NTL_zz_pE(101));
+
+ if (!testField<FieldArchetype> (K, "Testing archetype with envelope of UnField<NTL::zz_pE> field"))
+ pass = false;
+#endif
+
+ commentator().stop("NTL_zz_pE field test suite");
+ return pass ? 0 : -1;
+}
+
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+
diff --git a/tests/test-ntl-lzz_pex.C b/tests/test-ntl-lzz_pex.C
new file mode 100644
index 0000000..12b190c
--- /dev/null
+++ b/tests/test-ntl-lzz_pex.C
@@ -0,0 +1,90 @@
+/* tests/test-ntl-lzz_pEX.C
+ * evolved by bds from tests/test-ntl-lzz_pX.C
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ * ========LICENCE========
+ */
+
+/*! @file tests/test-ntl-lzz_pEX.C
+ * @ingroup tests
+ * @brief no doc.
+ * @test no doc.
+ */
+
+
+#include "linbox/linbox-config.h"
+
+#include <iostream>
+#include <fstream>
+
+
+#include "linbox/ring/ntl.h"
+
+#include "test-field.h"
+
+using namespace LinBox;
+
+int main (int argc, char **argv)
+{
+ static integer q = 3;
+ static size_t n = 10000;
+ static int iterations = 1;
+
+ static Argument args[] = {
+ { 'q', "-q Q", "Operate over the \"field\" GF(Q) [1].", TYPE_INTEGER, &q },
+ { 'n', "-n N", "Set dimension of test vectors to NxN.", TYPE_INT, &n },
+ { 'i', "-i I", "Perform each test for I iterations.", TYPE_INT, &iterations },
+ END_OF_ARGUMENTS
+ };
+
+ parseArguments (argc, argv, args);
+
+ commentator().start("NTL_zz_pEX field test suite", "NTL_zz_pEX");
+ bool pass = true;
+
+ NTL_zz_pEX R(q,3);
+
+ integer ch;
+ if (R.characteristic(ch) != q)
+ exit(-1);
+
+ // Make sure some more detailed messages get printed
+ commentator().getMessageClass (INTERNAL_DESCRIPTION).setMaxDepth (2);
+
+ if (!runBasicRingTests (R, "NTL_zz_pEX", (unsigned int)iterations, false)) pass = false;
+ // needs PID tests as well...
+
+#if 0
+ FieldArchetype K(new NTL_zz_pEX(101));
+
+ if (!testField<FieldArchetype> (K, "Testing archetype with envelope of UnField<NTL::zz_pEX> field"))
+ pass = false;
+#endif
+
+ commentator().stop("NTL_zz_pEX field test suite");
+ return pass ? 0 : -1;
+}
+
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+
diff --git a/tests/test-ntl-lzz_px.C b/tests/test-ntl-lzz_px.C
new file mode 100644
index 0000000..f02cb3f
--- /dev/null
+++ b/tests/test-ntl-lzz_px.C
@@ -0,0 +1,90 @@
+/* tests/test-ntl-lzz_pX.C
+ * evolved by bds from tests/test-ntl-lzz_pE.C
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ * ========LICENCE========
+ */
+
+/*! @file tests/test-ntl-lzz_pX.C
+ * @ingroup tests
+ * @brief no doc.
+ * @test no doc.
+ */
+
+
+#include "linbox/linbox-config.h"
+
+#include <iostream>
+#include <fstream>
+
+
+#include "linbox/ring/ntl.h"
+
+#include "test-field.h"
+
+using namespace LinBox;
+
+int main (int argc, char **argv)
+{
+ static integer q = 3;
+ static size_t n = 10000;
+ static int iterations = 1;
+
+ static Argument args[] = {
+ { 'q', "-q Q", "Operate over the \"field\" GF(Q) [1].", TYPE_INTEGER, &q },
+ { 'n', "-n N", "Set dimension of test vectors to NxN.", TYPE_INT, &n },
+ { 'i', "-i I", "Perform each test for I iterations.", TYPE_INT, &iterations },
+ END_OF_ARGUMENTS
+ };
+
+ parseArguments (argc, argv, args);
+
+ commentator().start("NTL_zz_pX field test suite", "NTL_zz_p");
+ bool pass = true;
+
+ NTL_zz_pX R(q);
+
+ integer ch;
+ if (R.characteristic(ch) != q)
+ exit(-1);
+
+ // Make sure some more detailed messages get printed
+ commentator().getMessageClass (INTERNAL_DESCRIPTION).setMaxDepth (2);
+
+ if (!runBasicRingTests (R, "NTL_zz_pX", (unsigned int)iterations, false)) pass = false;
+ // needs PID tests as well...
+
+#if 0
+ FieldArchetype K(new NTL_zz_pX(101));
+
+ if (!testField<FieldArchetype> (K, "Testing archetype with envelope of UnField<NTL::zz_pX> field"))
+ pass = false;
+#endif
+
+ commentator().stop("NTL_zz_pX field test suite");
+ return pass ? 0 : -1;
+}
+
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+
diff --git a/tests/test-ntl-rr.C b/tests/test-ntl-rr.C
new file mode 100644
index 0000000..6d4ab52
--- /dev/null
+++ b/tests/test-ntl-rr.C
@@ -0,0 +1,96 @@
+/* tests/test-ntl-zz_p.cpp
+ * Copyright (C) 2002 William J. Turner
+ * Copyright (C) LinBox
+ *
+ * Written by William J. Turner <wjturner at math.ncsu.edu>
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ * ========LICENCE========
+ *
+ * Function definitions for block Lanczos iteration
+ *
+ */
+
+
+/*! @file tests/test-ntl-RR.C
+ * @ingroup tests
+ * @brief no doc
+ * @test no doc
+ */
+
+
+
+#include "linbox/linbox-config.h"
+
+#include <iostream>
+#include <fstream>
+
+
+#include "linbox/ring/ntl.h"
+
+#include "test-common.h"
+#include "test-generic.h"
+
+using namespace LinBox;
+
+int main (int argc, char **argv)
+{
+
+ static size_t n = 10000;
+ static unsigned int iterations = 1;
+
+ static Argument args[] = {
+ { 'n', "-n N", "Set dimension of test vectors to NxN.", TYPE_INT, &n },
+ { 'i', "-i I", "Perform each test for I iterations.", TYPE_INT, &iterations },
+ END_OF_ARGUMENTS
+ };
+
+ parseArguments (argc, argv, args);
+
+ commentator().start("NTL_RR field test suite", "NTL_RR");
+ bool pass = true;
+
+ NTL_RR F;
+
+ // Make sure some more detailed messages get printed
+ commentator().getMessageClass (INTERNAL_DESCRIPTION).setMaxDepth (2);
+
+ if (!runFieldTests (F, "NTL_RR", iterations, n, false)) pass = false;
+
+ if (pass)
+ commentator().report() << "Compilation of interface pass, lucky exactness pass" << std::endl;
+ else
+ commentator().report() << "Compilation of interface pass, exactness failure" << std::endl;
+
+ commentator().stop("NTL_RR field test suite");
+ // We're going to allow failed tests here because the floating-point
+ // approximation tends to screw things up anyway.
+
+ // -bds: Well, compilation is checked at least. Work needed: A meaningful test is falsifyable.
+
+ return 0;
+}
+
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+
diff --git a/tests/test-ntl-sylvester.C b/tests/test-ntl-sylvester.C
index 06b7594..868ef63 100644
--- a/tests/test-ntl-sylvester.C
+++ b/tests/test-ntl-sylvester.C
@@ -35,12 +35,12 @@
*/
+#include <linbox/linbox-config.h>
#include <iostream>
#include <fstream>
-#include <vector>
-#include "linbox/field/ntl.h"
-#include "linbox/field/ntl.h"
+#include "linbox/ring/ntl.h"
+
#include "linbox/integer.h"
#include "linbox/blackbox/ntl-sylvester.h"
#include "test-generic.h"
@@ -48,6 +48,7 @@
using namespace std;
+using namespace LinBox;
int main(int argc, char* argv[])
{
@@ -58,14 +59,14 @@ int main(int argc, char* argv[])
bool pass = true;
static size_t n = 1000;
- static long q = 134217689;
+ static int64_t q = 134217689;
// q = 101;
static int iterations = 1;
static Argument args[] = {
{ 'n', "-n N", "Set dimension of test matrices to NxN.", TYPE_INT, &n },
- { 'q', "-q Q", "Operate over the \"field\" GF(Q) [1].",
- TYPE_INT, &q },
+// { 'q', "-q Q", "Operate over the \"field\" GF(Q) [1].",
+// TYPE_INT, &q },
{ 'i', "-i I", "Perform each test for I iterations.",
TYPE_INT, &iterations },
END_OF_ARGUMENTS
@@ -89,22 +90,20 @@ int main(int argc, char* argv[])
LinBox::commentator().start("Sylvester black box test suite", "Sylvester");
report <<"Dimension(m+n)= " << m+n << "\t modulus= " << q << endl;
- // typedef LinBox::UnparametricField<NTL::ZZ_p> Field;
+ // typedef Givaro::ZRing<NTL::ZZ_p> Field;
typedef LinBox::NTL_ZZ_p Field;
- typedef Field::Element element;
- typedef std::vector<element> Vector;
+ // typedef Field::Element element;
+ typedef LinBox::BlasVector<Field> Vector;
// Now we are using the NTL wrapper as the field, call the instance F
Field F(q); // XXX same bug ?
- element zero;
- F.init(zero, 0);
// Use the default constructor to create a matrix
- LinBox::Sylvester<Field> T;
+ // LinBox::Sylvester<Field> T(F);
// Use a special constructor to construct a matrix of dim TSIZE
- Vector pdata(n), qdata(m);
+ Vector pdata(F,n), qdata(F,m);
report << "\n\tpx:=";
@@ -128,8 +127,12 @@ int main(int argc, char* argv[])
report << std::endl;
- LinBox::Sylvester<Field> TT(F,pdata,qdata);
+ // LinBox::Sylvester<Field> TT(F,pdata,qdata);
+ LinBox::Sylvester<Field> TT(pdata,qdata);
report << "The matrix is: " << std::endl;
+ TT.print(report);
+
+#if 0 /* this is not a test */
// TT.printcp( "cpout.txt");
// TT.print(report);
@@ -137,7 +140,7 @@ int main(int argc, char* argv[])
// Create an interesting input vector called idata
- Vector idata( TT.sysdim() ), odata( TT.sysdim() );
+ Vector idata(F, TT.sysdim() ), odata( F, TT.sysdim() );
report << "A random col vector:\npx:=[" << std::endl;
for (unsigned int i=0; i < idata.size(); i++) {
@@ -164,12 +167,13 @@ int main(int argc, char* argv[])
for (unsigned int i = 0; i < odata.size(); i++)
report << odata[i] << " ";
+#endif
- pass = testBlackbox(TT);
+ pass = testBlackboxNoRW(TT);
report <<"<====\tDone Sylvester matrix black box test suite" << endl;
- LinBox::commentator().stop("Sylvester black box test suite");
+ LinBox::commentator().stop(MSG_STATUS (pass),"Sylvester black box test suite");
return pass ? 0 : -1;
}
diff --git a/tests/test-ntl-toeplitz.C b/tests/test-ntl-toeplitz.C
index b4ba98c..94aea69 100644
--- a/tests/test-ntl-toeplitz.C
+++ b/tests/test-ntl-toeplitz.C
@@ -31,13 +31,14 @@
+#include <linbox/linbox-config.h>
#include <iostream>
#include <fstream>
-#include <vector>
-#include "linbox/field/ntl.h"
-#include "linbox/field/ntl.h"
+#include "linbox/ring/ntl.h"
+
#include "linbox/integer.h"
+#include "linbox/vector/blas-vector.h"
//#include "linbox/blackbox/ntl-toeplitz.h"
#include "linbox/blackbox/toeplitz.h"
@@ -56,7 +57,7 @@ int main(int argc, char* argv[])
bool pass = true;
static size_t n = 1000;
- static long q = 2147483647;
+ static int64_t q = 65521;
static int iterations = 1;
static Argument args[] = {
@@ -84,20 +85,18 @@ int main(int argc, char* argv[])
report <<" \tDimension= " << n << "\t modulus= " << q << endl;
typedef LinBox::NTL_ZZ_p Field;
- typedef Field::Element element;
- typedef std::vector<element> Vector;
+ // typedef Field::Element element;
+ typedef LinBox::BlasVector<Field> Vector;
// Now we are using the NTL wrapper as the field, call the instance F
Field F(q);
- element zero;
- F.init(zero, 0);
// Use the default constructor to create a matrix
LinBox::Toeplitz<Field> T(F);
// Use a special constructor to construct a matrix of dim TSIZE
- int TSIZE = 2*int(n)-1;
- Vector tdata(TSIZE);
+ size_t TSIZE = 2*(n)-1;
+ Vector tdata(F,TSIZE);
report << "The random vector is:" << std::endl;
for (unsigned int i=0; i < tdata.size(); i++) {
tdata[i] = NTL::random_ZZ_p() ;
@@ -107,10 +106,10 @@ int main(int argc, char* argv[])
LinBox::Toeplitz<Field> TT(F,tdata);
report << "The matrix is: " << std::endl;
- TT.print(report);
+ TT.write(report);
// Create an interesting input vector called idata
- Vector idata((TSIZE+2)/2), odata((TSIZE+2)/2);
+ Vector idata(F,(TSIZE+2)/2), odata(F,(TSIZE+2)/2);
report << "A random col vector:\t" << std::endl;
for (unsigned int i=0; i < idata.size(); i++) {
idata[i] = NTL::random_ZZ_p() ;
@@ -135,22 +134,21 @@ int main(int argc, char* argv[])
report << "]\n";
// TT.setToUniModLT();
- // report << "Setting the matrix to UniModular Upper Triangular";
+ // report << "Setting the matrix to UniGivaro::Modular Upper Triangular";
// TT.setToUniModUT();
// report << "The Upper Triangular matrix is: " << std::endl;
- //TT.print();
+ //TT.write();
- pass = testBlackbox(TT);
+ pass = testBlackboxNoRW(TT);
LinBox::commentator().stop("Toeplitz black box test suite");
return pass ? 0 : -1;
}
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
// Local Variables:
// mode: C++
// tab-width: 8
// indent-tabs-mode: nil
// c-basic-offset: 8
// End:
-
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/tests/test-ntl-zz_p.C b/tests/test-ntl-zz_p.C
new file mode 100644
index 0000000..de4f1a1
--- /dev/null
+++ b/tests/test-ntl-zz_p.C
@@ -0,0 +1,118 @@
+
+/* tests/test-ntl-ZZ_p.C
+ * Copyright (C) 2002 William J. Turner
+ *
+ * Written by William J. Turner <wjturner at math.ncsu.edu>
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ * ========LICENCE========
+ */
+
+
+/*! @file tests/test-ntl-ZZ_p.C
+ * @ingroup tests
+ * @brief no doc
+ * @test no doc
+ */
+
+
+
+#include "linbox/linbox-config.h"
+
+#include <iostream>
+#include <fstream>
+
+
+#include "linbox/ring/ntl.h"
+
+#include "test-common.h"
+#include "test-generic.h"
+
+using namespace LinBox;
+
+int main (int argc, char **argv)
+{
+ static integer q = 1073741789;
+ static size_t n = 10000;
+ static int iterations = 1;
+
+ static Argument args[] = {
+ { 'q', "-q Q", "Operate over the \"field\" GF(Q) [1].", TYPE_INTEGER, &q },
+ { 'n', "-n N", "Set dimension of test vectors to NxN.", TYPE_INT, &n },
+ { 'i', "-i I", "Perform each test for I iterations.", TYPE_INT, &iterations },
+ END_OF_ARGUMENTS
+ };
+
+ parseArguments (argc, argv, args);
+
+ commentator().start("NTL_ZZ_p field test suite", "NTL_ZZ_p");
+ bool pass = true;
+
+ NTL::ZZ_p::init(NTL::to_ZZ(long(int64_t(q))));
+ // Givaro::ZRing<NTL::ZZ_p> F;
+ // NTL_ZZ_p F(q); // XXX is there a q ?
+ NTL_ZZ_p F;
+
+ if (F.characteristic() != q)
+ return false ;
+
+
+ // Make sure some more detailed messages get printed
+ commentator().getMessageClass (INTERNAL_DESCRIPTION).setMaxDepth (2);
+
+ if (!runFieldTests (F, "NTL_ZZ_p", (unsigned int)iterations, n, false)) pass = false;
+
+#if 0
+ FieldArchetype K(new NTL_ZZ_p(101));
+
+ if (!testField<FieldArchetype> (K, "Testing archetype with envelope of UnField<NTL::ZZ_p> field"))
+ pass = false;
+#endif
+
+ // Testing big ints
+ //
+ commentator().start ("\t--Testing init/convert match");
+ bool part_pass = true;
+ // Givaro::ZRing<NTL::ZZ_p> G;
+ // NTL_ZZ_p G(q);
+ NTL_ZZ_p G;
+ NTL::ZZ_p::init(NTL::to_ZZ("1234567890123456789012345678901234568123"));
+ NTL_ZZ_p::Element a;
+ LinBox::integer b, c("123456789012345678901234567890");
+ // LinBox::integer b, c("34");
+ G.init(a, c );
+ G.convert(b, a);
+ if ( c != b ) {
+ part_pass = false;
+ commentator().report (LinBox::Commentator::LEVEL_NORMAL, INTERNAL_DESCRIPTION) << "Error : " << b << " != " << c << std::endl;
+ }
+ commentator().stop(MSG_STATUS (part_pass));
+ pass &= part_pass;
+
+ commentator().stop("NTL_ZZ_p field test suite");
+ return pass ? 0 : -1;
+}
+
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+
diff --git a/tests/test-nullspace.C b/tests/test-nullspace.C
index 6e1f445..eaeea11 100644
--- a/tests/test-nullspace.C
+++ b/tests/test-nullspace.C
@@ -1,5 +1,5 @@
/* Copyright (C) 2009 LinBox
- * Written by <boyer.brice at gmail.com>
+ * Written by Brice Boyer (briceboyer) <boyer.brice at gmail.com>
* Inspired and adapted from test-ffpack.C
*
* ========LICENCE========
@@ -27,6 +27,9 @@
* \brief Tests the dense nullspace functions for Zp
* @ingroup tests
* @test dense nullspace
+ * @todo test non dense nullspace
+ * @todo test for submatrices
+ * @todo make sure this is faster than FFPACK ?
*/
#include "linbox/linbox-config.h"
@@ -34,150 +37,18 @@
#include "linbox/integer.h"
#include "linbox/matrix/matrix-domain.h"
//#include "linbox/field/givaro-zpz.h"
-#include "linbox/field/modular.h"
+#include "linbox/ring/modular.h"
//#include "fflas-ffpack/ffpack/ffpack.h"
#include "linbox/algorithms/dense-nullspace.h"
-#include <vector>
-#include "./test-common.h"
-// #include "fflas-ffpack/utils/Matio.h"
-#include "linbox/algorithms/linbox-tags.h"
-
-using namespace LinBox;
+#include "./test-common.h"
+#include "fflas-ffpack/utils/Matio.h"
+#include "linbox/linbox-tags.h"
-/** @brief gives a random number such that \f$0 \leq RIII < s\f$.
- * @details basic..
- * @param [in] s sup
- * \param [in] seed seed. If \p 0 (default) we create a new one.
- * @param [out] RIII random integer in the interval \f$[[0, s-1]]\f$.
- * @return a reference to \p RIII
- */
-size_t & RandIntInInt ( const size_t & s, size_t & RIII, const int & seed = 0 )
-{
- /*
- * if (seed == 0)
- * srandom( (unsigned) time(NULL) );
- *else
- * srandom ( seed );
- */
- double alea = rand();
- RIII = (size_t) ((double)s * (alea/(RAND_MAX+1.0)));
- assert(RIII<s);
- return RIII ;
-}
-
-/*!
- * Creates a random Lapack style Permutation \p P of size \p len.
- */
-void RandomPermutation ( size_t * P, const size_t & len)
-{
- size_t alea = 0 ;
- for (size_t i = 0 ; i < len ; ++i) {
- RandIntInInt(len-i, alea);
- *(P+i) = i + alea ;
- }
- return;
-}
-
-/**
- * @brief Checks we got the right rank.
- *
- * @param F field
- * @param A matrix
- * @param m rows
- * @param n cols
- * @param lda leadin dimmension
- * @param alledged_rank supposedly correct rank.
- *
- * @return \c alledged_rank==rank(A)
- */
-template <class Field>
-bool CheckRank( const Field & F,
- const typename Field::Element * A,
- const size_t & m,
- const size_t & n,
- const size_t & lda,
- const size_t & alledged_rank)
-{
- // std::cout << " is rank truely " << alledged_rank << " ?" << std::endl;
- typename Field::Element * Acopy = new typename Field::Element[m*n] ;
- FFLAS::fcopy(F,m*n,Acopy,1,A,1);
- size_t true_rank = FFPACK::Rank(F,m,n,Acopy,lda);
- delete[] Acopy ;
- // std::cout << "It is " << true_rank << "." << std::endl;
- return (alledged_rank == true_rank);
-}
-
+#include "test-matrix-utils.h"
-/*!
- * Builds a \p m x \p n random matrix of rank \p rank over field \p F.
- */
-template <class Field >
-void RandomMatrixWithRank(const Field & F,
- typename Field::Element * A,
- const size_t & m,
- const size_t & n,
- const size_t & rank)
-{
- assert(rank <= m);
- assert(rank <= n);
-
- // srandom( (unsigned) time(NULL) ) ; // on met une nouvelle graine.
- typename Field::RandIter G(F);
- NonzeroRandIter<Field> Gn(F,G);
- typename Field::Element one,zero;
- F.init(one,1UL);
- F.init(zero,0UL);
-
- typename Field::Element * B = new typename Field::Element[m*m];
- typename Field::Element * C = new typename Field::Element[m*n];
- // Create B a random invertible matrix (m x m format)
- for (size_t j=0 ; j<m ; ++j){
- for (size_t i = 0 ; i<j ; ++i)
- F.assign (*(B+i*m+j),zero); // triangulaire
- F.assign(*(B+j*m+j),one );
- for (size_t i=j+1; i<m;++i)
- Gn.random (*(B+i*m+j)); // random mais pas nul.. euh... et sur Z/2 ?? :/
- }
- // Create C a random matrix of rank \p ( m x n format)
- // for (size_t i = 0; i < std::min(rank,m); ++i)
- for (size_t i = 0; i < rank; ++i){
- size_t j = 0;
- for ( ; j < std::min(i,n) ; ++j)
- F.assign (*(C+i*n+j),zero);
- for ( ; j < n ; ++j)
- Gn.random (*(C+i*n+j));
- }
- for (size_t i = n*rank; i < n*m; ++i){
- F.assign (*(C+i),zero);
- }
- assert(CheckRank(F,C,m,n,n,rank));
- // create P a random permutation of size \p n
- size_t *P = new size_t[n];
- //srandom( (unsigned) time(NULL) ) ; // on met une nouvelle graine.
- RandomPermutation(P,n);
- // create Q a random permutation of size \p m
- size_t *Q = new size_t[m];
- RandomPermutation(Q,m);
- FFPACK::applyP(F, FFLAS::FflasLeft, FFLAS::FflasNoTrans,
- n, 0, (int)m, C, n, Q );
- //PrintLapackPermutation(P,n,std::cout << "P == ");
- //write_field (F, std::cout<<"C_perm1="<<std::endl, C, m, n, n);
- FFPACK::applyP(F, FFLAS::FflasRight, FFLAS::FflasNoTrans,
- m, 0, (int)n, C, n, P );
- //PrintLapackPermutation(Q,m,std::cout << "Q == ");
- //write_field (F, std::cout<<"C_perm2="<<std::endl, C, m, n, n);
- // A = B*C (m x n format), of rank \p rank
- FFLAS::fgemm( F, FFLAS::FflasNoTrans, FFLAS::FflasNoTrans, m, n, m,
- one, B, m, C, n, zero, A, n );
- delete[] B;
- delete[] C;
- delete[] P;
- delete[] Q;
- assert(CheckRank(F,A,m,n,n,rank));
- return;
+using namespace LinBox;
-}
@@ -194,15 +65,11 @@ void RandomMatrixWithRank(const Field & F,
template <class Field >
static bool testNullSpaceBasis (const Field& F, size_t m, size_t n, size_t rank, int iterations, bool a_droite)
{
- typedef typename Field::Element Element;
//Commentator commentator;
//commentator().getMessageClass (INTERNAL_DESCRIPTION).setMaxDepth (3);
//commentator().getMessageClass (INTERNAL_DESCRIPTION).setMaxDetailLevel (Commentator::LEVEL_NORMAL);
- //commentator().start (pretty("Testing NullSpace Decomposition"),"testNullSpace",iterations);
- typename Field::Element one,zero;
- F.init(one,1UL);
- F.init(zero,0UL);
+ commentator().start ("Testing NullSpace Decomposition","testNullSpace",(unsigned int)iterations);
bool ret = true;
{
@@ -213,102 +80,72 @@ static bool testNullSpaceBasis (const Field& F, size_t m, size_t n, size_t rank,
}
for (int k=0; k<iterations; ++k) {
- //commentator().progress(k);
- Element * A = new Element[m*n];
- size_t ld_a = n ;
- size_t wd_a = m ;
- RandomMatrixWithRank(F,A,m,n,rank);
-
- Element * Abis = new Element[m*n]; // copie de A
- for (size_t i=0; i<m*n; ++i)
- *(Abis+i) = *(A+i);
- size_t ker_dim = 0 ; // or coker_dim
- Element * Kern = NULL;
- size_t ld_k = 0 ;
+ commentator().progress(k);
+ BlasMatrix<Field> A(F,m,n+5);
+ BlasMatrix<Field> Aref(A,0,0,m,n);
+ RandomMatrixWithRank(F,A.getWritePointer(),m,n,n+5,rank);
+
+ //tests on a submatrix (more general/prone to errors)
+ BlasSubmatrix<BlasMatrix<Field> > Abis(A,0,0,m,n);
+ BlasMatrix<Field> Kern(F);
+ size_t ker_dim;
if (a_droite) {
- NullSpaceBasis (F, LinBoxTag::Right,m,n,A,ld_a,Kern,ld_k,ker_dim);
- if (ker_dim != (ld_a - rank)) {
+ NullSpaceBasis (Tag::Side::Right,Abis,Kern,ker_dim);
+ if (ker_dim != (Abis.coldim() - rank)) {
ret = false;
- cout << "faux : (1) mauvaises dim : " << ker_dim << " != " << (ld_a - rank) << endl;
- delete[] Kern;
- delete[] A;
- delete[] Abis;
+ cout << "wrong: (1) bad dim : " << ker_dim << " != " << (Abis.coldim() - rank) << endl;
break ;
}
}
else {
- NullSpaceBasis (F, LinBoxTag::Left,m,n,A,ld_a,Kern,ld_k,ker_dim);
- if (ker_dim != (wd_a - rank) ) {
+ NullSpaceBasis ( Tag::Side::Left,Abis,Kern,ker_dim);
+ if (ker_dim != (Abis.rowdim() - rank) ) {
ret = false;
- cout << "faux : (1) mauvaises dim " << ker_dim << " != " << (wd_a - rank) << endl;
- delete[] Kern;
- delete[] A;
- delete[] Abis;
+ cout << "wrong : (1) bad dim " << ker_dim << " != " << (Abis.rowdim() - rank) << endl;
break ;
}
}
- size_t ld_ker = (a_droite)?ker_dim:m ;
- size_t wd_ker = (a_droite)?n:ker_dim ;
- assert(ld_ker == ld_k) ;
- size_t ld_n = (a_droite)?ker_dim:ld_a;
- size_t wd_n = (a_droite)?wd_a:ker_dim;
- assert(CheckRank(F,Kern,wd_ker,ld_ker,ld_ker,ker_dim)); // ...il est bien de rang plein...
- Element * NullMat = new Element[ld_n*wd_n] ;// ...et on s'attend à ce que ça soit nul !
+
+ assert(CheckRank(F,Kern,ker_dim));
+ BlasMatrix<Field> NullMat(F,(a_droite)?m:ker_dim,(a_droite)?ker_dim:n);
+ BlasMatrixDomain<Field> BMD(F);
+
if ( a_droite){
- FFLAS::fgemm(F, FFLAS::FflasNoTrans, FFLAS::FflasNoTrans, wd_a, ld_ker, ld_a,
- one, Abis, ld_a, Kern, ld_ker , zero, NullMat, ld_n);
+ BMD.mul(NullMat,Aref,Kern);
}
else{
- FFLAS::fgemm(F, FFLAS::FflasNoTrans, FFLAS::FflasNoTrans, wd_ker,ld_a, ld_ker,
- one, Kern, ld_ker , Abis, ld_a, zero, NullMat, ld_n);
+ BMD.mul(NullMat,Kern,Aref);
}
- //write_field (F, std::cout<<"A="<<endl, A, m, n, n,true);
- //write_field (F, std::cout<<"Abis="<<endl, Abis, m, n, n, true);
- delete[] Abis ;
- delete[] A ;
- delete[] Kern ;
- for (size_t i = 0 ; i < wd_n ; ++i ){
- for (size_t j = 0 ; j < ld_n ; ++j ) {
- if (!F.isZero(*(NullMat + j+i*ld_n)) ){
- // write_field (F, std::cout<<"faux : (3) NullMat pas nulle. "<<std::endl, NullMat, wd_n, ld_n, ld_n, true);
- delete[] NullMat ;
- ret = false;
- break;
- }
- }
- if (!ret)
- break;
+ if (!BMD.isZero(NullMat)) {
+ std::cout << "wrong (3) NullMat non zero :" << NullMat << std::endl;
+ ret = false;
+ break;
}
- if (ret) delete[] NullMat ;
- else break;
- //delete[] Kern ;
}
- //commentator().stop(MSG_STATUS (ret), (const char *) 0, "testNullSpace");
-
+ commentator().stop(MSG_STATUS (ret), (const char *) 0, "testNullSpace");
return ret;
}
-
int main(int argc, char** argv)
{
//-----------------------------------------------------------------------
// Choice of the finite field representation
- //typedef GivaroZpz<Std32> Field;
- typedef Modular<double> Field;
- //typedef Modular<float> Field;
- //typedef Modular<uint32_t> Field;
+ //typedef Givaro::Modular<int32_t> Field;
+ typedef Givaro::Modular<double> Field;
+ //typedef Givaro::Modular<float> Field;
+ //typedef Givaro::Modular<uint32_t> Field;
//------------------------------------------------------------------------
bool pass = true;
- static size_t n = 5;
- static size_t m = 4;
- static size_t r = 2;
- static integer q = 11;
- static int iterations =2;
+ static size_t n = 15;
+ static size_t m = 8;
+ static size_t r = 3;
+ static integer q = 101;
+ static int iterations =4;
static Argument args[] = {
{ 'n', "-n N", "Set width of test matrices.", TYPE_INT, &n },
@@ -331,30 +168,76 @@ int main(int argc, char** argv)
std::ostream& report = commentator().report();
- report << "\t \033[1;35m>>>\033[0;m \t testing left kernel" << endl ;
+
+ TESTE("left kernel");
if (!testNullSpaceBasis (F, m,n,r, iterations, false))
pass=false;
- if (pass) report << "\t \033[1;36m<<<\033[0;m \t left kernel passed :)" << endl; else {report << "\t \033[1;31m!!!\033[0;m \t left kernel failed :(" << endl ; exit(-1);}
- report << "\t \033[1;35m>>>\033[0;m \t testing right kernel" << endl ;
+ RAPPORT("left kernel");
+
+ TESTE("left kernel");
+ if (!testNullSpaceBasis (F, n,m,r, iterations, false))
+ pass=false;
+ RAPPORT("left kernel");
+
+ TESTE("left kernel");
+ if (!testNullSpaceBasis (F, m,n,0, iterations, false))
+ pass=false;
+ RAPPORT("left kernel");
+
+
+ TESTE("left kernel");
+ if (!testNullSpaceBasis (F, n,m,0, iterations, false))
+ pass=false;
+ RAPPORT("left kernel");
+
+ TESTE("left kernel");
+ if (!testNullSpaceBasis (F, m,n,std::min(m,n), iterations, false))
+ pass=false;
+ RAPPORT("left kernel");
+
+
+
+
+
+ TESTE("right kernel");
if (!testNullSpaceBasis (F, m,n,r, iterations, true))
pass=false;
- if (pass) report << "\t \033[1;36m<<<\033[0;m \t right kernel passed :)" << endl; else {report << "\t \033[1;31m!!!\033[0;m \t right kernel failed :(" << endl ; exit(-1);}
+ RAPPORT("right kernel");
- report << "\033[1;32m +++ ALL MY TESTS PASSED +++\033[0;m" << endl;
+ TESTE("right kernel");
+ if (!testNullSpaceBasis (F, n,m,r, iterations, true))
+ pass=false;
+ RAPPORT("right kernel");
+ TESTE("right kernel");
+ if (!testNullSpaceBasis (F, m,n,0, iterations, true))
+ pass=false;
+ RAPPORT("right kernel");
- commentator().stop("NullSpace test suite");
- return (pass ? 0 : -1);
-}
+ TESTE("right kernel");
+ if (!testNullSpaceBasis (F, n,m,0, iterations, true))
+ pass=false;
+ RAPPORT("right kernel");
+ TESTE("right kernel");
+ if (!testNullSpaceBasis (F, n,m,std::min(m,n), iterations, true))
+ pass=false;
+ RAPPORT("right kernel");
+
+
+
+ // if we are here, no RAPPORT exited
+ report << "\033[1;32m +++ ALL MY TESTS PASSED +++\033[0;m" << endl;
+ commentator().stop(MSG_STATUS (pass),"NullSpace test suite");
+ return (pass ? 0 : -1);
+}
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
// Local Variables:
// mode: C++
// tab-width: 8
// indent-tabs-mode: nil
// c-basic-offset: 8
// End:
-
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/tests/test-opencl-domain.C b/tests/test-opencl-domain.C
new file mode 100644
index 0000000..73e9c9e
--- /dev/null
+++ b/tests/test-opencl-domain.C
@@ -0,0 +1,891 @@
+/* tests/test-blas-domain.C
+ * Copyright (C) 2011 Matthew Wezowicz
+ *
+ * Written by Matthew Wezowicz <mwezz at udel.edu>
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ * ========LICENCE========
+ *.
+ */
+
+/*! @file tests/test-blas-domain.C
+ * @ingroup tests
+ * @brief no doc
+ * @test NO DOC
+ */
+
+#include <string>
+#include <iostream>
+
+#include "linbox/ring/modular.h"
+#include "linbox/matrix/dense-matrix.h"
+#include "linbox/matrix/matrix-domain.h"
+#include "linbox/util/commentator.h"
+
+#include "test-common.h"
+
+#ifndef _OPENCL_TIMER_
+#define _OPENCL_TIMER_
+
+#include <stack>
+
+#include <sys/time.h>
+
+class OpenCLTimer{
+
+private:
+ std::stack<struct timeval, std::vector<struct timeval> > timerStack;
+
+public:
+ OpenCLTimer(){}
+
+ ~OpenCLTimer(){}
+
+ void tic(){
+ struct timeval tempTimeVal;
+ gettimeofday(&tempTimeVal, NULL);
+
+ timerStack.push(tempTimeVal);
+ }
+
+ double toc(){
+ double returnValue;
+ struct timeval now;
+ struct timeval then;
+
+ gettimeofday(&now, NULL);
+
+ then = timerStack.top();
+ timerStack.pop();
+
+ returnValue = ((double)(now.tv_sec - then.tv_sec) +
+ ((double)(now.tv_usec - then.tv_usec) * 1e-6));
+
+ return returnValue;
+ }
+
+};
+
+#endif
+
+using namespace LinBox;
+
+const int maxpretty = 35;
+
+std::string pretty(std::string a) {
+ std::string blank;
+ blank = a;
+ int msgsize= maxpretty - (int)blank.size();
+ std::string dot(".");
+ for(int i=0;i<msgsize ;++i){
+ blank += dot;
+ }
+ return blank;
+}
+
+template <class Field>
+static bool testMul(const Field& F, size_t n, int iterations){
+ typedef typename Field::Element Element;
+ typedef typename Field::RandIter RandIter;
+ typedef BlasMatrix<Field> Matrix;
+
+ commentator().getMessageClass(INTERNAL_DESCRIPTION).setMaxDepth(3);
+ commentator().getMessageClass(INTERNAL_DESCRIPTION).setMaxDetailLevel(Commentator::LEVEL_NORMAL);
+ commentator().start(pretty("Testing mul"),"testMul",(size_t)iterations);
+
+ RandIter G(F);
+ bool ret = true;
+ BlasMatrixDomain<Field> BMD(F);
+ OpenCLMatrixDomain<Field> OMD(F);
+
+ for(int i = 0; i < iterations; i++){
+ commentator().progress(i);
+ Matrix A(F,n,n);
+ Matrix B(F,n,n);
+ Matrix C_b(F,n,n);
+ Matrix C_o(F,n,n);
+
+ Element tmp;
+
+ for(size_t k = 0; k < n; k++){
+ for(size_t j = 0; j < n; j++){
+ A.setEntry(k,j,G.random(tmp));
+ B.setEntry(k,j,G.random(tmp));
+ }
+ }
+
+ OpenCLTimer timer;
+ timer.tic();
+ BMD.mul(C_b,A,B);
+ commentator().report() << "Blas mul() execution time: "
+ << timer.toc() << std::endl;
+ timer.tic();
+ OMD.mul(C_o,A,B);
+ commentator().report() << "OpenCL mul() execution time: "
+ << timer.toc() << std::endl;
+
+ if(!OMD.areEqual(C_b,C_o)){
+ ret = false;
+ }
+ }
+
+ commentator().stop(MSG_STATUS(ret), (const char*)0, "testMul");
+
+ return ret;
+}
+
+template <class Field>
+static bool testMulinLeft(const Field& F, size_t n, int iterations){
+ typedef typename Field::Element Element;
+ typedef typename Field::RandIter RandIter;
+ typedef BlasMatrix<Field> Matrix;
+
+ commentator().getMessageClass(INTERNAL_DESCRIPTION).setMaxDepth(3);
+ commentator().getMessageClass(INTERNAL_DESCRIPTION).setMaxDetailLevel(Commentator::LEVEL_NORMAL);
+ commentator().start(pretty("Testing mulin_left"),"testMulinLeft",(size_t)iterations);
+
+ RandIter G(F);
+ bool ret = true;
+ BlasMatrixDomain<Field> BMD(F);
+ OpenCLMatrixDomain<Field> OMD(F);
+
+ for(int i = 0; i < iterations; i++){
+ commentator().progress(i);
+ Matrix A_b(F,n,n);
+ Matrix A_o(F,n,n);
+ Matrix B(F,n,n);
+
+ Element tmp;
+
+ for(size_t k = 0; k < n; k++){
+ for(size_t j = 0; j < n; j++){
+ A_b.setEntry(k,j,G.random(tmp));
+ B.setEntry(k,j,G.random(tmp));
+ }
+ }
+
+ A_o = A_b;
+
+ OpenCLTimer timer;
+ timer.tic();
+ BMD.mulin_left(A_b,B);
+ commentator().report() << "Blas mulin_left() execution time: "
+ << timer.toc() << std::endl;
+ timer.tic();
+ OMD.mulin_left(A_o,B);
+ commentator().report() << "OpenCL mulin_left() execution time: "
+ << timer.toc() << std::endl;
+
+ if(!OMD.areEqual(A_b,A_o)){
+ ret = false;
+ }
+ }
+
+ commentator().stop(MSG_STATUS(ret), (const char*)0, "testMulinLeft");
+
+ return ret;
+}
+
+template <class Field>
+static bool testMulinRight(const Field& F, size_t n, int iterations){
+ typedef typename Field::Element Element;
+ typedef typename Field::RandIter RandIter;
+ typedef BlasMatrix<Field> Matrix;
+
+ commentator().getMessageClass(INTERNAL_DESCRIPTION).setMaxDepth(3);
+ commentator().getMessageClass(INTERNAL_DESCRIPTION).setMaxDetailLevel(Commentator::LEVEL_NORMAL);
+ commentator().start(pretty("Testing mulin_right"),"testMulinRight",(size_t)iterations);
+
+ RandIter G(F);
+ bool ret = true;
+ BlasMatrixDomain<Field> BMD(F);
+ OpenCLMatrixDomain<Field> OMD(F);
+
+ for(int i = 0; i < iterations; i++){
+ commentator().progress(i);
+ Matrix A(F,n,n);
+ Matrix B_b(F,n,n);
+ Matrix B_o(F,n,n);
+
+ Element tmp;
+
+ for(size_t k = 0; k < n; k++){
+ for(size_t j = 0; j < n; j++){
+ A.setEntry(k,j,G.random(tmp));
+ B_b.setEntry(k,j,G.random(tmp));
+ }
+ }
+
+ B_o = B_b;
+
+ OpenCLTimer timer;
+ timer.tic();
+ BMD.mulin_right(A,B_b);
+ commentator().report() << "Blas mulin_right() execution time: "
+ << timer.toc() << std::endl;
+ timer.tic();
+ OMD.mulin_right(A,B_o);
+ commentator().report() << "OpenCL mulin_right() execution time: "
+ << timer.toc() << std::endl;
+
+ if(!OMD.areEqual(B_b,B_o)){
+ ret = false;
+ }
+ }
+
+ commentator().stop(MSG_STATUS(ret), (const char*)0, "testMulinRight");
+
+ return ret;
+}
+
+template <class Field>
+static bool testAxpy(const Field& F, size_t n, int iterations){
+ typedef typename Field::Element Element;
+ typedef typename Field::RandIter RandIter;
+ typedef BlasMatrix<Field> Matrix;
+
+ commentator().getMessageClass(INTERNAL_DESCRIPTION).setMaxDepth(3);
+ commentator().getMessageClass(INTERNAL_DESCRIPTION).setMaxDetailLevel(Commentator::LEVEL_NORMAL);
+ commentator().start(pretty("Testing axpy"),"testAxpy",(size_t)iterations);
+
+ RandIter G(F);
+ bool ret = true;
+ BlasMatrixDomain<Field> BMD(F);
+ OpenCLMatrixDomain<Field> OMD(F);
+
+ for(int i = 0; i < iterations; i++){
+ commentator().progress(i);
+ Matrix A(F,n,n);
+ Matrix B(F,n,n);
+ Matrix C(F,n,n);
+ Matrix D_b(F,n,n);
+ Matrix D_o(F,n,n);
+
+ Element tmp;
+
+ for(size_t k = 0; k < n; k++){
+ for(size_t j = 0; j < n; j++){
+ A.setEntry(k,j,G.random(tmp));
+ B.setEntry(k,j,G.random(tmp));
+ C.setEntry(k,j,G.random(tmp));
+ }
+ }
+
+ OpenCLTimer timer;
+ timer.tic();
+ BMD.axpy(D_b,A,B,C);
+ commentator().report() << "Blas axpy() execution time: "
+ << timer.toc() << std::endl;
+ timer.tic();
+ OMD.axpy(D_o,A,B,C);
+ commentator().report() << "OpenCL axpy() execution time: "
+ << timer.toc() << std::endl;
+
+ if(!OMD.areEqual(D_b,D_o)){
+ ret = false;
+ }
+ }
+
+ commentator().stop(MSG_STATUS(ret), (const char*)0, "testAxpy");
+
+ return ret;
+}
+
+template <class Field>
+static bool testAxpyin(const Field& F, size_t n, int iterations){
+ typedef typename Field::Element Element;
+ typedef typename Field::RandIter RandIter;
+ typedef BlasMatrix<Field> Matrix;
+
+ commentator().getMessageClass(INTERNAL_DESCRIPTION).setMaxDepth(3);
+ commentator().getMessageClass(INTERNAL_DESCRIPTION).setMaxDetailLevel(Commentator::LEVEL_NORMAL);
+ commentator().start(pretty("Testing axpyin"),"testAxpyin",(size_t)iterations);
+
+ RandIter G(F);
+ bool ret = true;
+ BlasMatrixDomain<Field> BMD(F);
+ OpenCLMatrixDomain<Field> OMD(F);
+
+ for(int i = 0; i < iterations; i++){
+ commentator().progress(i);
+ Matrix A(F,n,n);
+ Matrix B(F,n,n);
+ Matrix C_b(F,n,n);
+ Matrix C_o(F,n,n);
+
+ Element tmp;
+
+ for(size_t k = 0; k < n; k++){
+ for(size_t j = 0; j < n; j++){
+ A.setEntry(k,j,G.random(tmp));
+ B.setEntry(k,j,G.random(tmp));
+ C_b.setEntry(k,j,G.random(tmp));
+ }
+ }
+
+ C_o = C_b;
+
+ OpenCLTimer timer;
+ timer.tic();
+ BMD.axpyin(C_b,A,B);
+ commentator().report() << "Blas axpyin() execution time: "
+ << timer.toc() << std::endl;
+ timer.tic();
+ OMD.axpyin(C_o,A,B);
+ commentator().report() << "OpenCL axpyin() execution time: "
+ << timer.toc() << std::endl;
+
+ if(!OMD.areEqual(C_b,C_o)){
+ ret = false;
+ }
+ }
+
+ commentator().stop(MSG_STATUS(ret), (const char*)0, "testAxpyin");
+
+ return ret;
+}
+
+template <class Field>
+static bool testMaxpy(const Field& F, size_t n, int iterations){
+ typedef typename Field::Element Element;
+ typedef typename Field::RandIter RandIter;
+ typedef BlasMatrix<Field> Matrix;
+
+ commentator().getMessageClass(INTERNAL_DESCRIPTION).setMaxDepth(3);
+ commentator().getMessageClass(INTERNAL_DESCRIPTION).setMaxDetailLevel(Commentator::LEVEL_NORMAL);
+ commentator().start(pretty("Testing maxpy"),"testMaxpy",(size_t)iterations);
+
+ RandIter G(F);
+ bool ret = true;
+ BlasMatrixDomain<Field> BMD(F);
+ OpenCLMatrixDomain<Field> OMD(F);
+
+ for(int i = 0; i < iterations; i++){
+ commentator().progress(i);
+ Matrix A(F,n,n);
+ Matrix B(F,n,n);
+ Matrix C(F,n,n);
+ Matrix D_b(F,n,n);
+ Matrix D_o(F,n,n);
+
+ Element tmp;
+
+ for(size_t k = 0; k < n; k++){
+ for(size_t j = 0; j < n; j++){
+ A.setEntry(k,j,G.random(tmp));
+ B.setEntry(k,j,G.random(tmp));
+ C.setEntry(k,j,G.random(tmp));
+ }
+ }
+
+ OpenCLTimer timer;
+ timer.tic();
+ BMD.maxpy(D_b,A,B,C);
+ commentator().report() << "Blas maxpy() execution time: "
+ << timer.toc() << std::endl;
+ timer.tic();
+ OMD.maxpy(D_o,A,B,C);
+ commentator().report() << "OpenCL maxpy() execution time: "
+ << timer.toc() << std::endl;
+
+ if(!OMD.areEqual(D_b,D_o)){
+ ret = false;
+ }
+ }
+
+ commentator().stop(MSG_STATUS(ret), (const char*)0, "testMaxpy");
+
+ return ret;
+}
+
+template <class Field>
+static bool testMaxpyin(const Field& F, size_t n, int iterations){
+ typedef typename Field::Element Element;
+ typedef typename Field::RandIter RandIter;
+ typedef BlasMatrix<Field> Matrix;
+
+ commentator().getMessageClass(INTERNAL_DESCRIPTION).setMaxDepth(3);
+ commentator().getMessageClass(INTERNAL_DESCRIPTION).setMaxDetailLevel(Commentator::LEVEL_NORMAL);
+ commentator().start(pretty("Testing maxpyin"),"testMaxpyin",(size_t)iterations);
+
+ RandIter G(F);
+ bool ret = true;
+ BlasMatrixDomain<Field> BMD(F);
+ OpenCLMatrixDomain<Field> OMD(F);
+
+ for(int i = 0; i < iterations; i++){
+ commentator().progress(i);
+ Matrix A(F,n,n);
+ Matrix B(F,n,n);
+ Matrix C_b(F,n,n);
+ Matrix C_o(F,n,n);
+
+ Element tmp;
+
+ for(size_t k = 0; k < n; k++){
+ for(size_t j = 0; j < n; j++){
+ A.setEntry(k,j,G.random(tmp));
+ B.setEntry(k,j,G.random(tmp));
+ C_b.setEntry(k,j,G.random(tmp));
+ }
+ }
+
+ C_o = C_b;
+
+ OpenCLTimer timer;
+ timer.tic();
+ BMD.maxpyin(C_b,A,B);
+ commentator().report() << "Blas maxpyin() execution time: "
+ << timer.toc() << std::endl;
+ timer.tic();
+ OMD.maxpyin(C_o,A,B);
+ commentator().report() << "OpenCL maxpyin() execution time: "
+ << timer.toc() << std::endl;
+
+ if(!OMD.areEqual(C_b,C_o)){
+ ret = false;
+ }
+ }
+
+ commentator().stop(MSG_STATUS(ret), (const char*)0, "testMaxpyin");
+
+ return ret;
+}
+
+template <class Field>
+static bool testAxmy(const Field& F, size_t n, int iterations){
+ typedef typename Field::Element Element;
+ typedef typename Field::RandIter RandIter;
+ typedef BlasMatrix<Field> Matrix;
+
+ commentator().getMessageClass(INTERNAL_DESCRIPTION).setMaxDepth(3);
+ commentator().getMessageClass(INTERNAL_DESCRIPTION).setMaxDetailLevel(Commentator::LEVEL_NORMAL);
+ commentator().start(pretty("Testing axmy"),"testAxmy",(size_t)iterations);
+
+ RandIter G(F);
+ bool ret = true;
+ BlasMatrixDomain<Field> BMD(F);
+ OpenCLMatrixDomain<Field> OMD(F);
+
+ for(int i = 0; i < iterations; i++){
+ commentator().progress(i);
+ Matrix A(F,n,n);
+ Matrix B(F,n,n);
+ Matrix C(F,n,n);
+ Matrix D_b(F,n,n);
+ Matrix D_o(F,n,n);
+
+ Element tmp;
+
+ for(size_t k = 0; k < n; k++){
+ for(size_t j = 0; j < n; j++){
+ A.setEntry(k,j,G.random(tmp));
+ B.setEntry(k,j,G.random(tmp));
+ C.setEntry(k,j,G.random(tmp));
+ }
+ }
+
+ OpenCLTimer timer;
+ timer.tic();
+ BMD.axmy(D_b,A,B,C);
+ commentator().report() << "Blas axmy() execution time: "
+ << timer.toc() << std::endl;
+ timer.tic();
+ OMD.axmy(D_o,A,B,C);
+ commentator().report() << "OpenCL axmy() execution time: "
+ << timer.toc() << std::endl;
+
+ if(!OMD.areEqual(D_b,D_o)){
+ ret = false;
+ }
+ }
+
+ commentator().stop(MSG_STATUS(ret), (const char*)0, "testAxmy");
+
+ return ret;
+}
+
+template <class Field>
+static bool testAxmyin(const Field& F, size_t n, int iterations){
+ typedef typename Field::Element Element;
+ typedef typename Field::RandIter RandIter;
+ typedef BlasMatrix<Field> Matrix;
+
+ commentator().getMessageClass(INTERNAL_DESCRIPTION).setMaxDepth(3);
+ commentator().getMessageClass(INTERNAL_DESCRIPTION).setMaxDetailLevel(Commentator::LEVEL_NORMAL);
+ commentator().start(pretty("Testing axmyin"),"testAxmyin",(size_t)iterations);
+
+ RandIter G(F);
+ bool ret = true;
+ BlasMatrixDomain<Field> BMD(F);
+ OpenCLMatrixDomain<Field> OMD(F);
+
+ for(int i = 0; i < iterations; i++){
+ commentator().progress(i);
+ Matrix A(F,n,n);
+ Matrix B(F,n,n);
+ Matrix C_b(F,n,n);
+ Matrix C_o(F,n,n);
+
+ Element tmp;
+
+ for(size_t k = 0; k < n; k++){
+ for(size_t j = 0; j < n; j++){
+ A.setEntry(k,j,G.random(tmp));
+ B.setEntry(k,j,G.random(tmp));
+ C_b.setEntry(k,j,G.random(tmp));
+ }
+ }
+
+ C_o = C_b;
+
+ OpenCLTimer timer;
+ timer.tic();
+ BMD.axmyin(C_b,A,B);
+ commentator().report() << "Blas axmyin() execution time: "
+ << timer.toc() << std::endl;
+ timer.tic();
+ OMD.axmyin(C_o,A,B);
+ commentator().report() << "OpenCL axmyin() execution time: "
+ << timer.toc() << std::endl;
+
+ if(!OMD.areEqual(C_b,C_o)){
+ ret = false;
+ }
+ }
+
+ commentator().stop(MSG_STATUS(ret), (const char*)0, "testAxmyin");
+
+ return ret;
+}
+
+template <class Field>
+static bool testMuladd(const Field& F, size_t n, int iterations){
+ typedef typename Field::Element Element;
+ typedef typename Field::RandIter RandIter;
+ typedef BlasMatrix<Field> Matrix;
+
+ commentator().getMessageClass(INTERNAL_DESCRIPTION).setMaxDepth(3);
+ commentator().getMessageClass(INTERNAL_DESCRIPTION).setMaxDetailLevel(Commentator::LEVEL_NORMAL);
+ commentator().start(pretty("Testing muladd"),"testMuladd",(size_t)iterations);
+
+ RandIter G(F);
+ bool ret = true;
+ BlasMatrixDomain<Field> BMD(F);
+ OpenCLMatrixDomain<Field> OMD(F);
+
+ for(int i = 0; i < iterations; i++){
+ commentator().progress(i);
+ Matrix A(F,n,n);
+ Matrix B(F,n,n);
+ Matrix C(F,n,n);
+ Matrix D_b(F,n,n);
+ Matrix D_o(F,n,n);
+
+ Element tmp;
+
+ for(size_t k = 0; k < n; k++){
+ for(size_t j = 0; j < n; j++){
+ A.setEntry(k,j,G.random(tmp));
+ B.setEntry(k,j,G.random(tmp));
+ C.setEntry(k,j,G.random(tmp));
+ }
+ }
+
+ OpenCLTimer timer;
+ timer.tic();
+ BMD.muladd(D_b,1.0,C,2.0,A,B);
+ commentator().report() << "Blas muladd() execution time: "
+ << timer.toc() << std::endl;
+ timer.tic();
+ OMD.muladd(D_o,1.0,C,2.0,A,B);
+ commentator().report() << "OpenCL muladd() execution time: "
+ << timer.toc() << std::endl;
+
+ if(!OMD.areEqual(D_b,D_o)){
+ ret = false;
+ }
+
+ /*
+ BMD.muladd(D_b,-1.0,C,2.0,A,B);
+ OMD.muladd(D_o,-1.0,C,2.0,A,B);
+
+ if(!OMD.areEqual(D_b,D_o)){
+ ret = false;
+ }
+
+ BMD.muladd(D_b,1.0,C,-2.0,A,B);
+ OMD.muladd(D_o,1.0,C,-2.0,A,B);
+
+ if(!OMD.areEqual(D_b,D_o)){
+ ret = false;
+ }
+
+ BMD.muladd(D_b,-1.0,C,-2.0,A,B);
+ OMD.muladd(D_o,-1.0,C,-2.0,A,B);
+
+ if(!OMD.areEqual(D_b,D_o)){
+ ret = false;
+ }
+ */
+ }
+
+ commentator().stop(MSG_STATUS(ret), (const char*)0, "testMuladd");
+
+ return ret;
+}
+
+template <class Field>
+static bool testMuladdin(const Field& F, size_t n, int iterations){
+ typedef typename Field::Element Element;
+ typedef typename Field::RandIter RandIter;
+ typedef BlasMatrix<Field> Matrix;
+
+ commentator().getMessageClass(INTERNAL_DESCRIPTION).setMaxDepth(3);
+ commentator().getMessageClass(INTERNAL_DESCRIPTION).setMaxDetailLevel(Commentator::LEVEL_NORMAL);
+ commentator().start(pretty("Testing muladdin"),"testMuladdin",(size_t)iterations);
+
+ RandIter G(F);
+ bool ret = true;
+ BlasMatrixDomain<Field> BMD(F);
+ OpenCLMatrixDomain<Field> OMD(F);
+
+ for(int i = 0; i < iterations; i++){
+ commentator().progress(i);
+ Matrix A(F,n,n);
+ Matrix B(F,n,n);
+ Matrix C_b(F,n,n);
+ Matrix C_o(F,n,n);
+
+ Element tmp;
+
+ for(size_t k = 0; k < n; k++){
+ for(size_t j = 0; j < n; j++){
+ A.setEntry(k,j,G.random(tmp));
+ B.setEntry(k,j,G.random(tmp));
+ C_b.setEntry(k,j,G.random(tmp));
+ }
+ }
+
+ C_o = C_b;
+
+ OpenCLTimer timer;
+ timer.tic();
+ BMD.muladdin(1.0,C_b,2.0,A,B);
+ commentator().report() << "Blas muladdin() execution time: "
+ << timer.toc() << std::endl;
+ timer.tic();
+ OMD.muladdin(1.0,C_o,2.0,A,B);
+ commentator().report() << "OpenCL muladdin() execution time: "
+ << timer.toc() << std::endl;
+
+ if(!OMD.areEqual(C_b,C_o)){
+ ret = false;
+ }
+ }
+
+ commentator().stop(MSG_STATUS(ret), (const char*)0, "testMuladdin");
+
+ return ret;
+}
+
+template <class Field>
+static bool testMulscale(const Field& F, size_t n, int iterations){
+ typedef typename Field::Element Element;
+ typedef typename Field::RandIter RandIter;
+ typedef BlasMatrix<Field> Matrix;
+
+ commentator().getMessageClass(INTERNAL_DESCRIPTION).setMaxDepth(3);
+ commentator().getMessageClass(INTERNAL_DESCRIPTION).setMaxDetailLevel(Commentator::LEVEL_NORMAL);
+ commentator().start(pretty("Testing mulscale"),"testMulscale",(size_t)iterations);
+
+ RandIter G(F);
+ bool ret = true;
+ BlasMatrixDomain<Field> BMD(F);
+ OpenCLMatrixDomain<Field> OMD(F);
+
+ for(int i = 0; i < iterations; i++){
+ commentator().progress(i);
+ Matrix A(F,n,n);
+ Matrix B(F,n,n);
+ Matrix C_b(F,n,n);
+ Matrix C_o(F,n,n);
+
+ Element tmp;
+
+ for(size_t k = 0; k < n; k++){
+ for(size_t j = 0; j < n; j++){
+ A.setEntry(k,j,G.random(tmp));
+ B.setEntry(k,j,G.random(tmp));
+ }
+ }
+
+ OpenCLTimer timer;
+ timer.tic();
+ BMD.mul(C_b,2.0,A,B);
+ commentator().report() << "Blas mulscale() execution time: "
+ << timer.toc() << std::endl;
+ timer.tic();
+ OMD.mul(C_o,2.0,A,B);
+ commentator().report() << "OpenCL mulscale() execution time: "
+ << timer.toc() << std::endl;
+
+ if(!OMD.areEqual(C_b,C_o)){
+ ret = false;
+ }
+ }
+
+ commentator().stop(MSG_STATUS(ret), (const char*)0, "testMulscale");
+
+ return ret;
+}
+
+template <class Field>
+int launch_tests(Field& F, int n, int iterations){
+ bool pass = true;
+
+ if(!testMul(F, (size_t)n, iterations)){
+ pass = false;
+ }
+ // if(!testMulinLeft(F, n, iterations)){
+ // pass = false;
+ // }
+ // if(!testMulinRight(F, n, iterations)){
+ // pass = false;
+ // }
+ if(!testAxpy(F, (size_t)n, iterations)){
+ pass = false;
+ }
+ // if(!testAxpyin(F, n, iterations)){
+ // pass = false;
+ // }
+ if(!testMaxpy(F, (size_t)n, iterations)){
+ pass = false;
+ }
+ // if(!testMaxpyin(F, n, iterations)){
+ // pass = false;
+ // }
+ if(!testAxmy(F, (size_t)n, iterations)){
+ pass = false;
+ }
+ // if(!testAxmyin(F, n, iterations)){
+ // pass = false;
+ // }
+ if(!testMuladd(F, (size_t)n, iterations)){
+ pass = false;
+ }
+ // if(!testMuladdin(F, n, iterations)){
+ // pass = false;
+ // }
+ // if(!testMulscale(F, n, iterations)){
+ // pass = false;
+ // }
+
+ return pass;
+}
+
+/*
+void* performOpenCL_mul(void* t){
+ Givaro::Modular<double> F(1000003U);
+
+ OpenCLMatrixDomain<Givaro::Modular<double> > OMD(F);
+
+ Givaro::Modular<double>::RandIter G(F);
+
+ BlasMatrix<Givaro::Modular<double> > A(F,500,500);
+ BlasMatrix<Givaro::Modular<double> > B(F,500,500);
+ BlasMatrix<Givaro::Modular<double> > C(F,500,500);
+
+ double temp;
+
+ for(size_t k = 0; k < 500; k++){
+ for(size_t j = 0; j < 500; j++){
+ A.setEntry(k,j,G.random(temp));
+ B.setEntry(k,j,G.random(temp));
+ }
+ }
+
+ OMD.mul(C,A,B);
+
+ pthread_exit(NULL);
+}
+
+void testThreadSafe(int iterations){
+ pthread_t* pthreads = (pthread_t*)operator new(iterations * sizeof(pthread_t));
+
+ for(int i = 0; i < iterations; i++){
+ pthread_create(&pthreads[i], NULL, performOpenCL_mul, NULL);
+ }
+
+ for(int i = 0; i < iterations; i++){
+ pthread_join(pthreads[i], NULL);
+ }
+}
+*/
+
+int main(int argc, char** argv){
+ static size_t n = 500;
+ static int q = 1000003U;
+ static int iterations = 3;
+
+ static Argument args[] = {
+ {'n', "-n N", "Set dimension of test matrices to NxN", TYPE_INT, &n},
+ {'q', "-q Q", "Operate over the \"field\" GF(Q) [1]", TYPE_INT, &q},
+ { 'i', "-i I", "Perform each test for I iterations", TYPE_INT, &iterations},
+ END_OF_ARGUMENTS};
+
+ parseArguments (argc, argv, args);
+
+ Givaro::Modular<double> F(1000003U);
+ Givaro::Modular<float> H(3);
+
+ bool pass = true;
+
+ srand((unsigned)time(NULL));
+
+ commentator().getMessageClass(INTERNAL_DESCRIPTION).setMaxDepth(3);
+ commentator().getMessageClass(INTERNAL_DESCRIPTION).setMaxDetailLevel(Commentator::LEVEL_NORMAL);
+
+ commentator().start("OpenCLMatrixDomain test suite", "OpenCLMatrixDomain");
+
+ //For warmup of OpenCLMatrixDomainFactory
+ OpenCLMatrixDomain<Givaro::Modular<double> > OMD(F);
+ commentator().report() << "Number of OpenCL Devices: "
+#ifdef __LINBOX_HAVE_OCL
+ << OpenCLMatrixDomainFactory::oclGetNumberOfDevices()
+#else
+ << 0
+#endif
+ << std::endl;
+
+ //testThreadSafe(iterations * 5);
+
+ pass &= launch_tests(F, (int)n, iterations);
+ pass &= launch_tests(H, (int)n, iterations);
+
+ commentator().stop(MSG_STATUS(pass), (const char*)0, "OpenCLMatrixDomain test suite");
+ return (pass ? 0 : -1);
+}
+
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
diff --git a/tests/test-optimization.C b/tests/test-optimization.C
index 1c8fdb2..6943d0f 100644
--- a/tests/test-optimization.C
+++ b/tests/test-optimization.C
@@ -33,7 +33,7 @@
#include <iostream>
#include <fstream>
-#include "linbox/field/modular.h" /* WHY ?? */
+#include "linbox/ring/modular.h" /* WHY ?? */
/* otherwise the compiler says :
* /usr/bin/ld: test-optimization.o: undefined reference to symbol 'dtrmm_'
* /usr/bin/ld: note: 'dtrmm_' is defined in DSO /usr/lib64/libblas.so.3gf so try adding it to the linker command line
@@ -63,7 +63,8 @@ int main (int argc, char ** argv)
commentator().start("Optimization suite", "Optim");
std::ostream& report = commentator().report();
- Modular<double> F(17);
+ typedef Givaro::Modular<double> Field;
+ Field F(17);
Timer chrono;
double *A, *C;
@@ -79,7 +80,7 @@ int main (int argc, char ** argv)
n, n, n, 1., A, n, A, n, 0., C, n);
chrono.stop();
report << std::endl
- << "fgemm " << FFLAS::WinoSteps(n) << "Wino: " << n << "x" << n << ": "
+ << "fgemm " << FFLAS::Protected::WinogradSteps(F,n) << "Wino: " << n << "x" << n << ": "
<< chrono.usertime() << " s, "
<< (2.0/chrono.usertime()*(double)n/100.0*(double)n/100.0*(double)n/100.0) << " Mffops"
<< std::endl;
diff --git a/tests/test-order-basis.C b/tests/test-order-basis.C
new file mode 100644
index 0000000..18e0d0a
--- /dev/null
+++ b/tests/test-order-basis.C
@@ -0,0 +1,157 @@
+/* -*- mode: C++; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
+
+#include <iostream>
+#include "linbox/matrix/polynomial-matrix.h"
+#include "linbox/randiter/random-fftprime.h"
+#include "linbox/randiter/random-prime.h"
+#include "linbox/ring/modular.h"
+
+#include "linbox/algorithms/polynomial-matrix/polynomial-matrix-domain.h"
+#include "linbox/algorithms/polynomial-matrix/order-basis.h"
+#include "linbox/algorithms/block-coppersmith-domain.h"
+
+using namespace LinBox;
+using namespace std;
+
+ostream& report = commentator().report();
+//ostream& report = std::cout;
+
+template<typename Field, typename Mat>
+string check_sigma(const Field& F, const Mat& sigma, Mat& serie, size_t ord){
+ Mat T(F,sigma.rowdim(),serie.coldim(),sigma.size()+serie.size()-1);
+ PolynomialMatrixMulDomain<Field> PMD(F);
+ PMD.mul(T,sigma,serie);
+ MatrixDomain<Field> MD(F);
+ size_t i=0;
+ string msg(".....");
+ bool nul_sigma=true;
+ while(i<ord && MD.isZero(T[i])){
+ if (!MD.isZero(sigma[i])) nul_sigma=false;
+ i++;
+ }
+ if (i<ord){
+ cout<<"error at degree="<<i<<endl;
+ T[i].write(report, Tag::FileFormat::Plain);
+ cout<<"***"<<endl;
+ cout<<serie<<endl;
+ cout<<sigma<<endl;
+ }
+
+
+ if (i==ord && !nul_sigma)
+ msg+="done";
+ else
+ msg+="error";
+ return msg;
+}
+
+template<typename MatPol>
+bool operator==(const MatPol& A, const MatPol& B){
+ MatrixDomain<typename MatPol::Field> MD(A.field());
+ if (A.real_degree()!=B.real_degree()|| A.rowdim()!= B.rowdim() || A.coldim()!=B.coldim()){
+ cout<<A.size()<<"("<<A.rowdim()<<"x"<<A.coldim()<<") <> "
+ <<B.size()<<"("<<B.rowdim()<<"x"<<B.coldim()<<") <> "<<endl;
+ return false;
+ }
+ size_t i=0;
+ while (i<=A.real_degree() && MD.areEqual(A[i],B[i]))
+ i++;
+
+ if (i<=A.real_degree() && A.rowdim()<10 && A.coldim()<10){
+ cout<<"first:"<<endl<<A<<endl;
+ cout<<"second:"<<endl<<B<<endl;
+ }
+
+ return i>A.real_degree();
+}
+
+
+template<typename Field, typename RandIter>
+void check_sigma(const Field& F, RandIter& Gen, size_t m, size_t n, size_t d) {
+ //typedef typename Field::Element Element;
+ typedef PolynomialMatrix<PMType::matfirst,PMStorage::plain,Field> MatrixP;
+ //typedef PolynomialMatrix<PMType::polfirst,PMStorage::plain,Field> MatrixP;
+ MatrixP Serie(F, m, n, d);
+ MatrixP Sigma1(F, m, m, d+1),Sigma2(F, m, m, d+1),Sigma3(F, m, m, d+1);
+
+ // set the Serie at random
+ for (size_t k=0;k<d;++k)
+ for (size_t i=0;i<m;++i)
+ for (size_t j=0;j<n;++j)
+ Gen.random(Serie.ref(i,j,k));
+
+ //report<<"Serie:="<<Serie<<std::endl;
+
+ // define the shift
+ vector<size_t> shift(m,0);
+ vector<size_t> shift2(shift),shift3(shift);
+
+ OrderBasis<Field> SB(F);
+
+ SB.M_Basis(Sigma3, Serie, d, shift3);
+ report << "M-Basis : " <<check_sigma(F,Sigma3,Serie,d)<<endl;
+ SB.PM_Basis2(Sigma1,Serie, d, shift);
+ report << "PM-Basis : " <<check_sigma(F,Sigma1,Serie,d)<<endl;
+ //SB.oPM_Basis(Sigma2, Serie, d, shift2);
+ //report << "PM-Basis iter : " <<check_sigma(F,Sigma2,Serie,d)<<endl;
+
+ // if (!(Sigma1==Sigma2)){
+ // cout<<"---> different basis for PM-Basis and PM-Basis iter"<<endl;
+ // cout<<Sigma1<<endl;
+ // cout<<Sigma2<<endl;
+ // }
+ cout<<endl;
+}
+
+int main(int argc, char** argv){
+ static size_t m = 64; // matrix dimension
+ static size_t n = 32; // matrix dimension
+ static size_t b = 20; // entries bitsize
+ static size_t d = 32; // matrix degree
+ static long seed = time(NULL);
+
+ static Argument args[] = {
+ { 'm', "-m M", "Set row dimension of matrix series to M.", TYPE_INT, &m },
+ { 'n', "-n N", "Set column dimension of matrix series to N.", TYPE_INT, &n },
+ { 'd', "-d D", "Set degree of matrix series to D.", TYPE_INT, &d },
+ { 'b', "-b B", "Set bitsize of the matrix entries", TYPE_INT, &b },
+ { 's', "-s s", "Set the random seed to a specific value", TYPE_INT, &seed},
+ END_OF_ARGUMENTS
+ };
+
+ parseArguments (argc, argv, args);
+
+ typedef Givaro::Modular<double> SmallField;
+ typedef Givaro::Modular<Givaro::Integer> LargeField;
+
+ size_t logd=integer((uint64_t)d).bitsize();
+
+ report<<"### matrix series is of size "<<m<<" x "<<n<<" of degree "<<d<<std::endl;
+ if (b < 26){
+ if (logd>b-2){
+ report<<"degree is to large for field bitsize: "<<b<<std::endl;
+ exit(0);
+ }
+ RandomFFTPrime Rd(1<<b,seed);
+ integer p = Rd.randomPrime(logd+1);
+ report<<"# starting sigma basis computation over SmallField [x] with p="<<p<<endl;;
+ SmallField F(p);
+ typename SmallField::RandIter G(F,0,seed);
+ check_sigma(F,G,m,n,d);
+ }
+ else {
+ RandomPrimeIterator Rd(b,seed);
+ integer p = Rd.randomPrime();
+ report<<"# starting sigma basis computation over LargeField Fp[x] with p="<<p<<endl;;
+
+ LargeField F(p);
+ typename LargeField::RandIter G(F,0,seed);
+ check_sigma(F,G,m,n,d);
+ }
+
+
+
+ return 0;
+}
+
+
diff --git a/tests/test-param-fuzzy.C b/tests/test-param-fuzzy.C
index 732a274..bd87708 100644
--- a/tests/test-param-fuzzy.C
+++ b/tests/test-param-fuzzy.C
@@ -3,20 +3,20 @@
* Copyright (C) 2002 David Saunders
* shamelessly mutated from one of the other field tests.
*
- *
+ *
* ========LICENCE========
* This file is part of the library LinBox.
- *
+ *
* LinBox is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
- *
+ *
* This library 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
* Lesser General Public License for more details.
- *
+ *
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
@@ -37,7 +37,7 @@
#include <iostream>
#include <fstream>
-#include <vector>
+
#include "linbox/field/param-fuzzy.h"
@@ -48,9 +48,9 @@ using namespace LinBox;
int main (int argc, char **argv)
{
- //static integer q = 2147483647U;
+ //static integer q = 65521U;
static size_t n = 10000;
- static int iterations = 10;
+ static unsigned int iterations = 10;
static Argument args[] = {
{ 'n', "-n N", "Set dimension of test vectors to NxN.", TYPE_INT, &n },
@@ -87,7 +87,9 @@ int main (int argc, char **argv)
if (!testField<DoubleRealApproximation > (F, "Testing DoubleRealApproximation field"))
pass = false;
- return pass ? 0 : -1;
+ // Can't meet field spec (e.g. init/convert from/to integer),
+ // so we accept if field test compiles.
+ return pass ? 0 : 0; //-1;
}
diff --git a/tests/test-permutation.C b/tests/test-permutation.C
new file mode 100644
index 0000000..2535c3a
--- /dev/null
+++ b/tests/test-permutation.C
@@ -0,0 +1,137 @@
+
+/* tests/test-permutation.C
+ * bds
+ * adapted from test-diagonal by Bradford Hovinen <hovinen at cis.udel.edu>
+ *
+ * Time-stamp: <01 Dec 15 18:50:35 Jean-Guillaume.Dumas at imag.fr>
+ * --------------------------------------------------------
+ *
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ * ========LICENCE========
+ *
+ */
+
+
+/*! @file tests/test-diagonal.C
+ * @ingroup tests
+ * @brief no doc
+ * @test NO DOC
+ */
+
+
+
+#include "linbox/linbox-config.h"
+
+
+#include <cstdio>
+
+#include "linbox/blackbox/permutation.h"
+#include "linbox/blackbox/transpose.h"
+#include "linbox/util/commentator.h"
+#include "linbox/ring/modular.h"
+#include "linbox/vector/stream.h"
+
+#include "test-common.h"
+#include "test-generic.h"
+
+using namespace LinBox;
+
+// Test 1: PP^T should = I.
+template <class Blackbox>
+static bool testInvEqTrans (Blackbox & P)
+{
+ typedef typename Blackbox::Field Field;
+ const Field & F = P.field();
+ typedef BlasVector<Field> Vector;
+
+ Transpose<Blackbox> PT(P);
+
+ typename Field::RandIter gen(F);
+
+ RandomDenseStream<Field, Vector> stream1 (F, gen, P.rowdim(), 3);
+ commentator().start ("Testing PP^T = I", "testInvEqTrans", stream1.m ());
+
+ Vector u(F), v(F), w(F);
+ VectorWrapper::ensureDim (u, stream1.n ());
+ VectorWrapper::ensureDim (v, stream1.n ());
+ VectorWrapper::ensureDim (w, stream1.n ());
+ stream1.next (u);
+
+ PT.apply(v, u);
+ P.apply(w, v);
+
+ VectorDomain<Field> VD (F);
+ bool pass = VD.areEqual(w, u);
+ if (! pass || (pass && P.rowdim() <= 20)) {
+ ostream &report = commentator().report (Commentator::LEVEL_IMPORTANT, INTERNAL_DESCRIPTION);
+ VD.write (report << "u = ", u) << endl;
+ //PT.write(report << "PT = ") << endl; //transpose has no write!
+ VD.write (report << "v = P^Tu = ", v) << endl;
+ P.write(report << "P = ") << endl;
+ VD.write (report << "w = Pv = ", w) << endl;
+ }
+
+ commentator().stop (MSG_STATUS (pass), (const char *) 0, "testInvEqTrans");
+
+ return pass;
+}
+
+int main (int argc, char **argv)
+{
+ bool pass = true;
+
+ static size_t n = 10;
+ static integer q = 65521U;
+
+ static Argument args[] = {
+ { 'n', "-n N", "Set dimension of test matrices to NxN.", TYPE_INT, &n },
+ { 'q', "-q Q", "Operate over the \"field\" GF(Q) [1].", TYPE_INTEGER, &q },
+ END_OF_ARGUMENTS
+ };
+
+ typedef Givaro::Modular<uint32_t> Field;
+
+ parseArguments (argc, argv, args);
+ Field F (q);
+
+ srand ((unsigned)time (NULL));
+
+ commentator().start("Permutation matrix black box test suite", "permutation");
+
+ // Make sure some more detailed messages get printed
+ commentator().getMessageClass (INTERNAL_DESCRIPTION).setMaxDepth (3);
+ commentator().getMessageClass (INTERNAL_DESCRIPTION).setMaxDetailLevel (Commentator::LEVEL_UNIMPORTANT);
+
+ LinBox::Permutation<Field> P(F,n);
+ P.random();
+ pass = pass && testBlackboxNoRW(P);
+ pass = pass && testInvEqTrans(P);
+
+ commentator().stop (MSG_STATUS (pass));
+
+ return pass ? 0 : -1;
+}
+
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/tests/test-plain-domain.C b/tests/test-plain-domain.C
new file mode 100644
index 0000000..2147953
--- /dev/null
+++ b/tests/test-plain-domain.C
@@ -0,0 +1,1632 @@
+
+/* tests/test-plain-domain.C
+ * -bds
+ *
+ * ---------------------------------------------------------
+ *
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ * ========LICENCE========
+ *.
+ *
+ * Test suite for PlainDomain. This also tests PlainMatrix,
+ * ...SparseMatrixBase, and TransposeMatrix
+ */
+
+
+
+/*! @file tests/test-plain-domain.C
+ * @ingroup tests
+ * @brief no real doc.
+ *
+ * \par ERRORS:
+ *
+ * X- Ambiguous specializations with RolColMatrixTag
+ * - Can't use leftMulin or rightMulin on some tests
+ * - VectorDomain needs subin, addin, etc. with multiple vector representations
+ * @test NO DOC
+ */
+
+
+
+#include "linbox/linbox-config.h"
+
+#include <iostream>
+#include <fstream>
+#include <sstream>
+
+
+#include "linbox/util/commentator.h"
+#include "linbox/ring/modular.h"
+#include "linbox/matrix/matrix-domain.h"
+
+#include "test-matrix-domain.h"
+
+
+
+using namespace std;
+using namespace LinBox;
+
+#if 0
+class SingularMatrix {};
+
+template <class Matrix>
+TransposeMatrix<Matrix> transpose (Matrix &M)
+{
+ return TransposeMatrix<Matrix> (M);
+}
+
+template <class Field, class Matrix1, class Matrix2>
+void eliminate (MatrixDomain<Field> &MD, Matrix1 &M, Matrix2 &pivotRow,
+ size_t row, size_t col, size_t rowdim, size_t coldim)
+{
+ BlasMatrix<typename Matrix1::Field> pivotCol (M.field(),rowdim, 1);
+ BlasMatrix<typename Matrix1::Field> realPivotCol (M, row, col, rowdim, 1);
+ BlasMatrix<typename Matrix1::Field> block (M, row, col, rowdim, coldim);
+
+ MD.neg (pivotCol, realPivotCol);
+ MD.axpyin (block, pivotCol, pivotRow);
+}
+
+/* Dumb elimination code
+ *
+ * This computes the inverse of a nonsingular matrix. It throws SingularMatrix
+ * in the case that no inverse exists
+ */
+
+template <class Field, class Matrix1, class Matrix2>
+Matrix1 &inv (MatrixDomain<Field> &MD, Matrix1 &res, const Matrix2 &A)
+{
+ linbox_check (res.coldim () == A.coldim ());
+ linbox_check (res.rowdim () == A.rowdim ());
+
+ BlasMatrix<typename Matrix1::Field> M (MD.field(), res.rowdim (), res.coldim () * 2);
+ BlasMatrix<typename Matrix1::Field> M1 (M, 0, 0, res.rowdim (), res.coldim ());
+ BlasMatrix<typename Matrix1::Field> M2 (M, 0, res.coldim (), res.rowdim (), res.coldim ());
+
+ StandardBasisStream<Field, typename BlasMatrix<typename Matrix1::Field>::Row> stream (MD.field (), res.coldim ());
+ typename BlasMatrix<typename Matrix1::Field>::RowIterator ip = M2.rowBegin ();
+
+ for (; ip != M2.rowEnd (); ++ip)
+ stream >> *ip;
+
+ MD.copy (M1, A);
+
+ unsigned int idx;
+ typename Field::Element Mjj_inv;
+
+ for (idx = 0; idx < M.rowdim (); ++idx) {
+ if (MD.field ().isZero (M.getEntry (idx, idx))) {
+ typename BlasMatrix<typename Matrix1::Field>::ColIterator col;
+ typename BlasMatrix<typename Matrix1::Field>::Col::iterator i;
+ unsigned int c_idx = idx + 1;
+
+ col = M.colBegin () + (int)idx;
+ i = col->begin () + (int)(idx + 1);
+
+ while ( i != col->end () && MD.field ().isZero (*i)) ++i, ++c_idx;
+
+ if (i == col->end ())
+ throw SingularMatrix ();
+ else {
+ typename BlasMatrix<typename Matrix1::Field>::RowIterator row1, row2;
+
+ row1 = M.rowBegin () + (int)idx;
+ row2 = M.rowBegin () + (int)c_idx;
+
+ std::swap_ranges (row1->begin () + idx, row1->end (), row2->begin () + idx);
+ }
+ }
+
+ MD.field ().inv (Mjj_inv, M.getEntry (idx, idx));
+ BlasMatrix<typename Matrix1::Field> realPivotRow (M, idx, idx, 1, M.coldim () - idx);
+ MD.mulin (realPivotRow, Mjj_inv);
+
+ if (idx > 0)
+ eliminate (MD, M, realPivotRow, 0, idx, idx, M.coldim () - idx);
+
+ if (idx < M.rowdim () - 1)
+ eliminate (MD, M, realPivotRow, idx + 1, idx,
+ M.rowdim () - idx - 1, M.coldim () - idx);
+ }
+
+ MD.copy (res, M2);
+ return res;
+}
+
+/* Test 1: Copy and areEqual
+ *
+ * Return true on success and false on failure
+ */
+
+template <class Field, class Matrix>
+static bool testCopyEqual (Field &F, const char *text, const Matrix &M)
+{
+ ostringstream str;
+
+ str << "Testing " << text << " matrix copy, areEqual" << ends;
+ commentator().start (str.str ().c_str (), "testCopyEqual");
+
+ bool ret = true;
+
+ MatrixDomain<Field> MD (F);
+
+ BlasMatrix<Field> M1 (F,M.rowdim (), M.coldim ());
+
+ ostream &report = commentator().report (Commentator::LEVEL_IMPORTANT, INTERNAL_DESCRIPTION);
+ report << "Input matrix M:" << endl;
+ MD.write (report, M);
+
+ MD.copy (M1, M);
+
+ report << "Output matrix M1:" << endl;
+ MD.write (report, M1);
+
+ if (!MD.areEqual (M1, M)) {
+ commentator().report (Commentator::LEVEL_IMPORTANT, INTERNAL_ERROR)
+ << "ERROR: MatrixDomain reported matrices M and M1 are not equal" << endl;
+ ret = false;
+ }
+
+ commentator().stop (MSG_STATUS (ret), (const char *) 0, "testCopyEqual");
+
+ return ret;
+}
+
+/* Test 2: subin and isZero
+ *
+ * Return true on success and false on failure
+ */
+
+template <class Field, class Matrix>
+static bool testSubinIsZero (Field &F, const char *text, const Matrix &M)
+{
+ ostringstream str;
+
+ str << "Testing " << text << " matrix subin, isZero" << ends;
+ commentator().start (str.str ().c_str (), "testSubinIsZero");
+
+ bool ret = true;
+
+ MatrixDomain<Field> MD (F);
+
+ BlasMatrix<Field> M1 (F,M.rowdim (), M.coldim ());
+
+ ostream &report = commentator().report (Commentator::LEVEL_IMPORTANT, INTERNAL_DESCRIPTION);
+ report << "Input matrix M:" << endl;
+ MD.write (report, M);
+
+ MD.copy (M1, M);
+ MD.subin (M1, M);
+
+ report << "Output matrix M1:" << endl;
+ MD.write (report, M1);
+
+ if (!MD.isZero (M1)) {
+ commentator().report (Commentator::LEVEL_IMPORTANT, INTERNAL_ERROR)
+ << "ERROR: MatrixDomain reported matrix M1 is not zero" << endl;
+ ret = false;
+ }
+
+ commentator().stop (MSG_STATUS (ret), (const char *) 0, "testSubinIsZero");
+
+ return ret;
+}
+
+/* Test 3: add-neg and sub
+ *
+ * Return true on success and false on failure
+ */
+
+template <class Field, class Matrix>
+static bool testAddNegSub (Field &F, const char *text, const Matrix &M1, const Matrix &M2)
+{
+ ostringstream str;
+
+ str << "Testing " << text << " matrix add-neg, sub" << ends;
+ commentator().start (str.str ().c_str (), "testAddNegSub");
+
+ bool ret = true;
+
+ MatrixDomain<Field> MD (F);
+
+ BlasMatrix<Field> M3 (F,M1.rowdim (), M1.coldim ());
+ BlasMatrix<Field> M4 (F,M1.rowdim (), M1.coldim ());
+ BlasMatrix<Field> M5 (F,M1.rowdim (), M1.coldim ());
+
+ ostream &report = commentator().report (Commentator::LEVEL_IMPORTANT, INTERNAL_DESCRIPTION);
+ report << "Input matrix M1:" << endl;
+ MD.write (report, M1);
+
+ report << "Input matrix M2:" << endl;
+ MD.write (report, M2);
+
+ MD.neg (M3, M2);
+ MD.add (M4, M1, M3);
+ MD.sub (M5, M1, M2);
+
+ report << "Output matrix M3 = -M2:" << endl;
+ MD.write (report, M3);
+
+ report << "Output matrix M4 = M1 + -M2:" << endl;
+ MD.write (report, M4);
+
+ report << "Output matrix M5 = M1 - M2:" << endl;
+ MD.write (report, M5);
+
+ if (!MD.areEqual (M4, M5)) {
+ commentator().report (Commentator::LEVEL_IMPORTANT, INTERNAL_ERROR)
+ << "ERROR: MatrixDomain reported matrices M4 and M5 are not equal" << endl;
+ ret = false;
+ }
+
+ commentator().stop (MSG_STATUS (ret), (const char *) 0, "testAddNegSub");
+
+ return ret;
+}
+
+/* Test 4: addin-negin and sub
+ *
+ * Return true on success and false on failure
+ */
+
+template <class Field, class Matrix>
+static bool testAddinNeginSub (Field &F, const char *text, const Matrix &M1, const Matrix &M2)
+{
+ ostringstream str;
+
+ str << "Testing " << text << " matrix addin-negin, sub" << ends;
+ commentator().start (str.str ().c_str (), "testAddinNeginSub");
+
+ bool ret = true;
+
+ MatrixDomain<Field> MD (F);
+
+ BlasMatrix<Field> M3 (F,M1.rowdim (), M1.coldim ());
+ BlasMatrix<Field> M4 (F,M1.rowdim (), M1.coldim ());
+
+ ostream &report = commentator().report (Commentator::LEVEL_IMPORTANT, INTERNAL_DESCRIPTION);
+ report << "Input matrix M1:" << endl;
+ MD.write (report, M1);
+
+ report << "Input matrix M2:" << endl;
+ MD.write (report, M2);
+
+ MD.copy (M3, M2);
+ MD.negin (M3);
+
+ report << "Output matrix M3 = -M2:" << endl;
+ MD.write (report, M3);
+
+ MD.addin (M3, M1);
+
+ report << "Output matrix M3 = M1 + -M2:" << endl;
+ MD.write (report, M3);
+
+ MD.sub (M4, M1, M2);
+
+ report << "Output matrix M4 = M1 - M2:" << endl;
+ MD.write (report, M4);
+
+ if (!MD.areEqual (M3, M4)) {
+ commentator().report (Commentator::LEVEL_IMPORTANT, INTERNAL_ERROR)
+ << "ERROR: MatrixDomain reported matrices M3 and M4 are not equal" << endl;
+ ret = false;
+ }
+
+ commentator().stop (MSG_STATUS (ret), (const char *) 0, "testAddinNeginSub");
+
+ return ret;
+}
+
+/* Test 5: inv and mul
+ *
+ * Return true on success and false on failure
+ */
+
+// Version for square matrices
+
+template <class Field, class Matrix>
+static bool testInvMulSquare (Field &F, const char *text, const Matrix &M)
+{
+ linbox_check (M.rowdim () == M.coldim ());
+
+ ostringstream str;
+
+ str << "Testing " << text << " matrix multiplication (square)" << ends;
+ commentator().start (str.str ().c_str (), "testInvMulSquare");
+
+ bool ret = true;
+
+ MatrixDomain<Field> MD (F);
+
+ BlasMatrix<Field> Minv (F, M.rowdim (), M.rowdim ());
+ BlasMatrix<Field> M2 (F, M.rowdim (), M.rowdim ());
+
+ StandardBasisStream<Field, typename BlasMatrix<Field>::Row> stream (F, M.rowdim ());
+
+ BlasMatrix<Field> I (F, M.rowdim (), M.rowdim ());
+ typename BlasMatrix<Field>::RowIterator i = I.rowBegin ();
+
+ while (i != I.rowEnd ())
+ stream >> *i++;
+
+ ostream &report = commentator().report (Commentator::LEVEL_IMPORTANT, INTERNAL_DESCRIPTION);
+ report << "Input matrix M:" << endl;
+ MD.write (report, M);
+
+ try {
+ inv (MD, Minv, M);
+ }
+ catch (SingularMatrix) {
+ commentator().stop ("ok", (const char *) 0, "testInvMul");
+ commentator().report (Commentator::LEVEL_IMPORTANT, INTERNAL_WARNING)
+ << "WARNING: Matrix was found singular" << endl;
+ return true;
+ }
+
+ report << "Computed inverse Minv:" << endl;
+ MD.write (report, Minv);
+
+ MD.mul (M2, M, Minv);
+
+ report << "Computed product M Minv:" << endl;
+ MD.write (report, M2);
+
+ if (!MD.areEqual (M2, I)) {
+ commentator().report (Commentator::LEVEL_IMPORTANT, INTERNAL_ERROR)
+ << "ERROR: MatrixDomain reported matrix M Minv is not the identity" << endl;
+ ret = false;
+ }
+
+ MD.mul (M2, Minv, M);
+
+ report << "Computed product Minv M:" << endl;
+ MD.write (report, M2);
+
+ if (!MD.areEqual (M2, I)) {
+ commentator().report (Commentator::LEVEL_IMPORTANT, INTERNAL_ERROR)
+ << "ERROR: MatrixDomain reported matrix Minv M is not the identity" << endl;
+ ret = false;
+ }
+
+ commentator().stop (MSG_STATUS (ret), (const char *) 0, "testInvMulSquare");
+
+ return ret;
+}
+
+// Version for over-determined matrices
+
+template <class Field, class Matrix>
+static bool testInvMulOver (Field &F, const char *text, Matrix &M)
+{
+ linbox_check (M.coldim () <= M.rowdim ());
+
+ ostringstream str;
+
+ str << "Testing " << text << " matrix multiplication (over-determined)" << ends;
+ commentator().start (str.str ().c_str (), "testInvMulOver");
+
+ bool ret = true;
+
+ MatrixDomain<Field> MD (F);
+
+ BlasMatrix<Field> Minv (F, M.coldim (), M.coldim ());
+ BlasMatrix<Field> M2 (F, M.coldim (), M.coldim ());
+ BlasMatrix<Field> M3 (F, M.coldim (), M.coldim ());
+
+ BlasMatrix<Field> MTM (F, M.coldim (), M.coldim ());
+
+ StandardBasisStream<Field, typename BlasMatrix<Field>::Row>
+ stream (F, M.coldim ());
+
+ BlasMatrix<Field> I (F, M.coldim (), M.coldim ());
+ typename BlasMatrix<Field>::RowIterator i = I.rowBegin ();
+
+ while (i != I.rowEnd ())
+ stream >> *i++;
+
+ ostream &report = commentator().report (Commentator::LEVEL_IMPORTANT, INTERNAL_DESCRIPTION);
+ report << "Input matrix M:" << endl;
+ MD.write (report, M);
+
+ MD.mul (MTM, transpose (M), M);
+
+ try {
+ inv (MD, Minv, MTM);
+ }
+ catch (SingularMatrix) {
+ commentator().stop ("ok", (const char *) 0, "testInvMul");
+ commentator().report (Commentator::LEVEL_IMPORTANT, INTERNAL_WARNING)
+ << "WARNING: Matrix was found singular" << endl;
+ return true;
+ }
+
+ report << "Computed inverse Minv:" << endl;
+ MD.write (report, Minv);
+
+ MD.mul (M2, transpose(M), M);
+ MD.mul (M3, M2, Minv);
+
+ report << "Computed product M^T M Minv:" << endl;
+ MD.write (report, M3);
+
+ if (!MD.areEqual (M3, I)) {
+ commentator().report (Commentator::LEVEL_IMPORTANT, INTERNAL_ERROR)
+ << "ERROR: MatrixDomain reported matrix M^T M Minv is not the identity" << endl;
+ ret = false;
+ }
+
+ M2.resize (M.coldim (), M.rowdim ());
+
+ MD.mul (M2, Minv, transpose (M));
+ MD.mul (M3, M2, M);
+
+ report << "Computed product Minv M^T M:" << endl;
+ MD.write (report, M3);
+
+ if (!MD.areEqual (M3, I)) {
+ commentator().report (Commentator::LEVEL_IMPORTANT, INTERNAL_ERROR)
+ << "ERROR: MatrixDomain reported matrix Minv M^T M is not the identity" << endl;
+ ret = false;
+ }
+
+ commentator().stop (MSG_STATUS (ret), (const char *) 0, "testInvMulOver");
+
+ return ret;
+}
+
+// Version for under-determined matrices
+
+template <class Field, class Matrix>
+static bool testInvMulUnder (Field &F, const char *text, Matrix &M)
+{
+ linbox_check (M.rowdim () <= M.coldim ());
+
+ ostringstream str;
+
+ str << "Testing " << text << " matrix multiplication (under-determined)" << ends;
+ commentator().start (str.str ().c_str (), "testInvMulUnder");
+
+ bool ret = true;
+
+ MatrixDomain<Field> MD (F);
+
+ BlasMatrix<Field> Minv (F, M.rowdim (), M.rowdim ());
+ BlasMatrix<Field> M2 (F, M.rowdim (), M.rowdim ());
+ BlasMatrix<Field> M3 (F, M.rowdim (), M.rowdim ());
+
+ BlasMatrix<Field> MMT (F, M.rowdim (), M.rowdim ());
+
+ StandardBasisStream<Field, typename BlasMatrix<Field>::Row> stream (F, M.rowdim ());
+
+ BlasMatrix<Field> I (F, M.rowdim (), M.rowdim ());
+ typename BlasMatrix<Field>::RowIterator i = I.rowBegin ();
+
+ while (i != I.rowEnd ())
+ stream >> *i++;
+
+ ostream &report = commentator().report (Commentator::LEVEL_IMPORTANT, INTERNAL_DESCRIPTION);
+ report << "Input matrix M:" << endl;
+ MD.write (report, M);
+
+ MD.mul (MMT, M, transpose (M));
+
+ try {
+ inv (MD, Minv, MMT);
+ }
+ catch (SingularMatrix) {
+ commentator().stop ("ok", (const char *) 0, "testInvMul");
+ commentator().report (Commentator::LEVEL_IMPORTANT, INTERNAL_WARNING)
+ << "WARNING: Matrix was found singular" << endl;
+ return true;
+ }
+
+ report << "Computed inverse Minv:" << endl;
+ MD.write (report, Minv);
+
+ MD.mul (M2, M, transpose (M));
+ MD.mul (M3, M2, Minv);
+
+ report << "Computed product M M^T Minv:" << endl;
+ MD.write (report, M3);
+
+ if (!MD.areEqual (M3, I)) {
+ commentator().report (Commentator::LEVEL_IMPORTANT, INTERNAL_ERROR)
+ << "ERROR: MatrixDomain reported matrix M M^T Minv is not the identity" << endl;
+ ret = false;
+ }
+
+ M2.resize (M.rowdim (), M.coldim ());
+
+ MD.mul (M2, Minv, M);
+ MD.mul (M3, M2, transpose (M));
+
+ report << "Computed product Minv M M^T:" << endl;
+ MD.write (report, M3);
+
+ if (!MD.areEqual (M3, I)) {
+ commentator().report (Commentator::LEVEL_IMPORTANT, INTERNAL_ERROR)
+ << "ERROR: MatrixDomain reported matrix Minv M M^T is not the identity" << endl;
+ ret = false;
+ }
+
+ commentator().stop (MSG_STATUS (ret), (const char *) 0, "testInvMulUnder");
+
+ return ret;
+}
+
+/* Test 6: inv and leftMulin
+ *
+ * Return true on success and false on failure
+ */
+
+// Version for square matrices
+
+template <class Field, class Matrix>
+static bool testInvLeftMulinSquare (Field &F, const char *text, const Matrix &M)
+{
+ linbox_check (M.rowdim () == M.coldim ());
+
+ ostringstream str;
+
+ str << "Testing " << text << " left in-place matrix multiplication (square)" << ends;
+ commentator().start (str.str ().c_str (), "testInvLeftMulinSquare");
+
+ bool ret = true;
+
+ MatrixDomain<Field> MD (F);
+
+ BlasMatrix<Field> Minv (F, M.rowdim (), M.rowdim ());
+
+ ostream &report = commentator().report (Commentator::LEVEL_IMPORTANT, INTERNAL_DESCRIPTION);
+ report << "Input matrix M:" << endl;
+ MD.write (report, M);
+
+ StandardBasisStream<Field, typename BlasMatrix<Field>::Row> stream (F, M.rowdim ());
+
+ BlasMatrix<Field> I (F, M.rowdim (), M.rowdim ());
+ typename BlasMatrix<Field>::RowIterator i = I.rowBegin ();
+
+ while (i != I.rowEnd ())
+ stream >> *i++;
+
+ try {
+ inv (MD, Minv, M);
+ }
+ catch (SingularMatrix) {
+ commentator().stop ("ok", (const char *) 0, "testInvLeftMulin");
+ commentator().report (Commentator::LEVEL_IMPORTANT, INTERNAL_WARNING)
+ << "WARNING: Matrix was found singular" << endl;
+ //! @bug we should check it is singular indeed
+ return true;
+ }
+
+ report << "Computed inverse Minv:" << endl;
+ MD.write (report, Minv);
+
+ MD.leftMulin (M, Minv);
+
+ report << "Computed product M Minv:" << endl;
+ MD.write (report, Minv);
+
+ if (!MD.areEqual (Minv, I)) {
+ commentator().report (Commentator::LEVEL_IMPORTANT, INTERNAL_ERROR)
+ << "ERROR: MatrixDomain reported matrix Minv M is not the identity" << endl;
+ ret = false;
+ }
+
+ commentator().stop (MSG_STATUS (ret), (const char *) 0, "testInvLeftMulinSquare");
+
+ return ret;
+}
+
+// Version for over-determined matrices
+
+template <class Field, class Matrix>
+static bool testInvLeftMulinOver (Field &F, const char *text, Matrix &M)
+{
+ linbox_check (M.coldim () <= M.rowdim ());
+
+ ostringstream str;
+
+ str << "Testing " << text << " left in-place matrix multiplication (over-determined)" << ends;
+ commentator().start (str.str ().c_str (), "testInvLeftMulinOver");
+
+ bool ret = true;
+
+ MatrixDomain<Field> MD (F);
+
+ BlasMatrix<Field> Minv (F, M.coldim (), M.coldim ());
+ BlasMatrix<Field> MTM (F, M.coldim (), M.coldim ());
+
+ ostream &report = commentator().report (Commentator::LEVEL_IMPORTANT, INTERNAL_DESCRIPTION);
+ report << "Input matrix M:" << endl;
+ MD.write (report, M);
+
+ StandardBasisStream<Field, typename BlasMatrix<Field>::Row> stream (F, M.coldim ());
+
+ BlasMatrix<Field> I (F, M.coldim (), M.coldim ());
+ typename BlasMatrix<Field>::RowIterator i = I.rowBegin ();
+
+ while (i != I.rowEnd ())
+ stream >> *i++;
+
+ MD.mul (MTM, transpose (M), M);
+
+ try {
+ inv (MD, Minv, MTM);
+ }
+ catch (SingularMatrix) {
+ commentator().stop ("ok", (const char *) 0, "testInvLeftMulin");
+ commentator().report (Commentator::LEVEL_IMPORTANT, INTERNAL_WARNING)
+ << "WARNING: Matrix was found singular" << endl;
+ //! @bug we should check it is singular indeed
+ return true;
+ }
+
+ report << "Computed inverse Minv:" << endl;
+ MD.write (report, Minv);
+
+ MD.leftMulin (Minv, MTM);
+
+ report << "Computed product Minv M^T M:" << endl;
+ MD.write (report, MTM);
+
+ if (!MD.areEqual (MTM, I)) {
+ commentator().report (Commentator::LEVEL_IMPORTANT, INTERNAL_ERROR)
+ << "ERROR: MatrixDomain reported matrix Minv M^T M is not the identity" << endl;
+ ret = false;
+ }
+
+ commentator().stop (MSG_STATUS (ret), (const char *) 0, "testInvLeftMulinOver");
+
+ return ret;
+}
+
+// Version for under-determined matrices
+
+template <class Field, class Matrix>
+static bool testInvLeftMulinUnder (Field &F, const char *text, Matrix &M)
+{
+ linbox_check (M.rowdim () <= M.coldim ());
+
+ ostringstream str;
+
+ str << "Testing " << text << " left in-place matrix multiplication (under-determined)" << ends;
+ commentator().start (str.str ().c_str (), "testInvLeftMulinUnder");
+
+ bool ret = true;
+
+ MatrixDomain<Field> MD (F);
+
+ BlasMatrix<Field> Minv (F, M.rowdim (), M.rowdim ());
+ BlasMatrix<Field> MMT (F, M.rowdim (), M.rowdim ());
+
+ ostream &report = commentator().report (Commentator::LEVEL_IMPORTANT, INTERNAL_DESCRIPTION);
+ report << "Input matrix M:" << endl;
+ MD.write (report, M);
+
+ StandardBasisStream<Field, typename BlasMatrix<Field>::Row> stream (F, M.rowdim ());
+
+ BlasMatrix<Field> I (F, M.rowdim (), M.rowdim ());
+ typename BlasMatrix<Field>::RowIterator i = I.rowBegin ();
+
+ while (i != I.rowEnd ())
+ stream >> *i++;
+
+ MD.mul (MMT, M, transpose (M));
+
+ try {
+ inv (MD, Minv, MMT);
+ }
+ catch (SingularMatrix) {
+ commentator().stop ("ok", (const char *) 0, "testInvLeftMulin");
+ commentator().report (Commentator::LEVEL_IMPORTANT, INTERNAL_WARNING)
+ << "WARNING: Matrix was found singular" << endl;
+ // BlasMatrix<Field> N(F,MMT) ;
+ // typename Field::Element d;
+ // det(d,N);
+ // if (d != 0) {
+ //! @bug we should check it is singular indeed
+ return true ;
+ // }
+ }
+
+ report << "Computed inverse Minv:" << endl;
+ MD.write (report, Minv);
+
+ MD.leftMulin (Minv, MMT);
+
+ report << "Computed product Minv M M^T:" << endl;
+ MD.write (report, MMT);
+
+ if (!MD.areEqual (MMT, I)) {
+ commentator().report (Commentator::LEVEL_IMPORTANT, INTERNAL_ERROR)
+ << "ERROR: MatrixDomain reported matrix Minv M M^T is not the identity" << endl;
+ }
+
+ commentator().stop (MSG_STATUS (ret), (const char *) 0, "testInvLeftMulinUnder");
+
+ return ret;
+}
+
+/* Test 7: inv and rightMulin
+ *
+ * Return true on success and false on failure
+ */
+
+// Version for square matrices
+
+template <class Field, class Matrix>
+static bool testInvRightMulinSquare (Field &F, const char *text, const Matrix &M)
+{
+ linbox_check (M.rowdim () == M.coldim ());
+
+ ostringstream str;
+
+ str << "Testing " << text << " right in-place matrix multiplication (square)" << ends;
+ commentator().start (str.str ().c_str (), "testInvRightMulinSquare");
+
+ bool ret = true;
+
+ MatrixDomain<Field> MD (F);
+
+ BlasMatrix<Field> Minv (F, M.rowdim (), M.rowdim ());
+
+ ostream &report = commentator().report (Commentator::LEVEL_IMPORTANT, INTERNAL_DESCRIPTION);
+ report << "Input matrix M:" << endl;
+ MD.write (report, M);
+
+ StandardBasisStream<Field, typename BlasMatrix<Field>::Row> stream (F, M.rowdim ());
+
+ BlasMatrix<Field> I (F, M.rowdim (), M.rowdim ());
+ typename BlasMatrix<Field>::RowIterator i = I.rowBegin ();
+
+ while (i != I.rowEnd ())
+ stream >> *i++;
+
+ try {
+ inv (MD, Minv, M);
+ }
+ catch (SingularMatrix) {
+ commentator().stop ("ok", (const char *) 0, "testInvRightMulin");
+ commentator().report (Commentator::LEVEL_IMPORTANT, INTERNAL_WARNING)
+ << "WARNING: Matrix was found singular" << endl;
+ return true;
+ }
+
+ report << "Computed inverse Minv:" << endl;
+ MD.write (report, Minv);
+
+ MD.rightMulin (Minv, M);
+
+ report << "Computed product Minv M:" << endl;
+ MD.write (report, Minv);
+
+ if (!MD.areEqual (Minv, I)) {
+ commentator().report (Commentator::LEVEL_IMPORTANT, INTERNAL_ERROR)
+ << "ERROR: MatrixDomain reported matrix Minv M is not the identity" << endl;
+ ret = false;
+ }
+
+ commentator().stop (MSG_STATUS (ret), (const char *) 0, "testInvRightMulinSquare");
+
+ return ret;
+}
+
+// Version for over-determined matrices
+
+template <class Field, class Matrix>
+static bool testInvRightMulinOver (Field &F, const char *text, Matrix &M)
+{
+ linbox_check (M.coldim () <= M.rowdim ());
+
+ ostringstream str;
+
+ str << "Testing " << text << " right in-place matrix multiplication (over-determined)" << ends;
+ commentator().start (str.str ().c_str (), "testInvRightMulinOver");
+
+ bool ret = true;
+
+ MatrixDomain<Field> MD (F);
+
+ BlasMatrix<Field> Minv (F, M.coldim (), M.coldim ());
+ BlasMatrix<Field> MTM (F, M.coldim (), M.coldim ());
+
+ ostream &report = commentator().report (Commentator::LEVEL_IMPORTANT, INTERNAL_DESCRIPTION);
+ report << "Input matrix M:" << endl;
+ MD.write (report, M);
+
+ StandardBasisStream<Field, typename BlasMatrix<Field>::Row> stream (F, M.coldim ());
+
+ BlasMatrix<Field> I (F, M.coldim (), M.coldim ());
+ typename BlasMatrix<Field>::RowIterator i = I.rowBegin ();
+
+ while (i != I.rowEnd ())
+ stream >> *i++;
+
+ MD.mul (MTM, transpose (M), M);
+
+ try {
+ inv (MD, Minv, MTM);
+ }
+ catch (SingularMatrix) {
+ commentator().stop ("ok", (const char *) 0, "testInvRightMulin");
+ commentator().report (Commentator::LEVEL_IMPORTANT, INTERNAL_WARNING)
+ << "WARNING: Matrix was found singular" << endl;
+ return true;
+ }
+
+ report << "Computed inverse Minv:" << endl;
+ MD.write (report, Minv);
+
+ MD.rightMulin (MTM, Minv);
+
+ report << "Computed product M^T M Minv:" << endl;
+ MD.write (report, MTM);
+
+ if (!MD.areEqual (MTM, I)) {
+ commentator().report (Commentator::LEVEL_IMPORTANT, INTERNAL_ERROR)
+ << "ERROR: MatrixDomain reported matrix M^T M Minv is not the identity" << endl;
+ ret = false;
+ }
+
+ commentator().stop (MSG_STATUS (ret), (const char *) 0, "testInvRightMulinOver");
+
+ return ret;
+}
+
+// Version for under-determined matrices
+
+template <class Field, class Matrix>
+static bool testInvRightMulinUnder (Field &F, const char *text, Matrix &M)
+{
+ linbox_check (M.rowdim () <= M.coldim ());
+
+ ostringstream str;
+
+ str << "Testing " << text << " right in-place matrix multiplication (under-determined)" << ends;
+ commentator().start (str.str ().c_str (), "testInvRightMulinUnder");
+
+ bool ret = true;
+
+ MatrixDomain<Field> MD (F);
+
+ BlasMatrix<Field> Minv (F, M.rowdim (), M.rowdim ());
+ BlasMatrix<Field> MMT (F, M.rowdim (), M.rowdim ());
+
+ ostream &report = commentator().report (Commentator::LEVEL_IMPORTANT, INTERNAL_DESCRIPTION);
+ report << "Input matrix M:" << endl;
+ MD.write (report, M);
+
+ StandardBasisStream<Field, typename BlasMatrix<Field>::Row> stream (F, M.rowdim ());
+
+ BlasMatrix<Field> I (F, M.rowdim (), M.rowdim ());
+ typename BlasMatrix<Field>::RowIterator i = I.rowBegin ();
+
+ while (i != I.rowEnd ())
+ stream >> *i++;
+
+ MD.mul (MMT, M, transpose (M));
+
+ try {
+ inv (MD, Minv, MMT);
+ }
+ catch (SingularMatrix) {
+ commentator().stop ("ok", (const char *) 0, "testInvRightMulin");
+ commentator().report (Commentator::LEVEL_IMPORTANT, INTERNAL_WARNING)
+ << "WARNING: Matrix was found singular" << endl;
+ return true;
+ }
+
+ report << "Computed inverse Minv:" << endl;
+ MD.write (report, Minv);
+
+ MD.rightMulin (MMT, Minv);
+
+ report << "Computed product M M^T Minv:" << endl;
+ MD.write (report, MMT);
+
+ if (!MD.areEqual (MMT, I)) {
+ commentator().report (Commentator::LEVEL_IMPORTANT, INTERNAL_ERROR)
+ << "ERROR: MatrixDomain reported matrix M M^T Minv is not the identity" << endl;
+ ret = false;
+ }
+
+ commentator().stop (MSG_STATUS (ret), (const char *) 0, "testInvRightMulinUnder");
+
+ return ret;
+}
+
+/* Test 8: add-mul and axpyin
+ *
+ * Return true on success and false on failure
+ */
+
+template <class Field, class Matrix>
+static bool testAddMulAxpyin (Field &F, const char *text, Matrix &M1, Matrix &M2, Matrix &M3)
+{
+ ostringstream str;
+
+ str << "Testing " << text << " matrix add-mul, axpyin" << ends;
+ commentator().start (str.str ().c_str (), "testAddMulAxpyin");
+
+ bool ret = true;
+
+ MatrixDomain<Field> MD (F);
+
+ BlasMatrix<Field> M4 (F, M2.rowdim (), M3.coldim ());
+ BlasMatrix<Field> M5 (F, M1.rowdim (), M1.coldim ());
+ BlasMatrix<Field> M6 (F, M1.rowdim (), M1.coldim ());
+
+ ostream &report = commentator().report (Commentator::LEVEL_IMPORTANT, INTERNAL_DESCRIPTION);
+ report << "Input matrix M1:" << endl;
+ MD.write (report, M1);
+
+ report << "Input matrix M2:" << endl;
+ MD.write (report, M2);
+
+ report << "Input matrix M3:" << endl;
+ MD.write (report, M3);
+
+ MD.mul (M4, M2, M3);
+ MD.add (M5, M1, M4);
+
+ report << "Computed matrix M5 = M1 + M2 * M3 (add-mul):" << endl;
+ MD.write (report, M5);
+
+ MD.copy (M6, M1);
+ MD.axpyin (M6, M2, M3);
+
+ report << "Computed matrix M6 = M1 + M2 * M3 (axpyin):" << endl;
+ MD.write (report, M6);
+
+ if (!MD.areEqual (M5, M6)) {
+ commentator().report (Commentator::LEVEL_IMPORTANT, INTERNAL_ERROR)
+ << "ERROR: MatrixDomain reported matrices M5 and M6 are not equal" << endl;
+ ret = false;
+ }
+
+ commentator().stop (MSG_STATUS (ret), (const char *) 0, "testAddMulAxpyin");
+
+ return ret;
+}
+
+/* Test 9: m-v mul by e_i and sub
+ *
+ * Return true on success and false on failure
+ */
+
+template <class Field, class Matrix>
+static bool testMVMulSub (Field &F, const char *text, const Matrix &M)
+{
+ ostringstream str;
+
+ str << "Testing " << text << " matrix-vector mul" << ends;
+ commentator().start (str.str ().c_str (), "testMVMulSub");
+
+ bool ret = true;
+
+ MatrixDomain<Field> MD (F);
+
+ BlasMatrix<Field> M1 (F, M.rowdim (), M.coldim ());
+
+ ostream &report = commentator().report (Commentator::LEVEL_IMPORTANT, INTERNAL_DESCRIPTION);
+ report << "Input matrix M:" << endl;
+ MD.write (report, M);
+
+ StandardBasisStream<Field, typename LinBox::Vector<Field>::Dense> stream (F, M.rowdim ());
+ typename LinBox::Vector<Field>::Dense v (M.coldim ());
+ typename BlasMatrix<Field>::ColIterator i = M1.colBegin ();
+
+ for (; i != M1.colEnd (); ++i) {
+ stream >> v;
+ MD.vectorMul (*i, M, v);
+ }
+
+ report << "Output matrix M1:" << endl;
+ MD.write (report, M1);
+
+ MD.subin (M1, M);
+
+ if (!MD.isZero (M1)) {
+ commentator().report (Commentator::LEVEL_IMPORTANT, INTERNAL_ERROR)
+ << "ERROR: MatrixDomain reported matrices M and M1 are not equal" << endl;
+ ret = false;
+ }
+
+ commentator().stop (MSG_STATUS (ret), (const char *) 0, "testMVMulSub");
+
+ return ret;
+}
+
+/* Test 10: m-v axpy by e_i
+ *
+ * Return true on success and false on failure
+ */
+
+template <class Field, class Matrix>
+static bool testMVAxpy (Field &F, const char *text, const Matrix &M)
+{
+ ostringstream str;
+
+ str << "Testing " << text << " matrix-vector axpy" << ends;
+ commentator().start (str.str ().c_str (), "testMVAxpy");
+
+ bool ret = true;
+
+ VectorDomain<Field> VD (F);
+ MatrixDomain<Field> MD (F);
+
+ BlasMatrix<Field> M1 (F, M.rowdim (), M.coldim ());
+
+ ostream &report = commentator().report (Commentator::LEVEL_IMPORTANT, INTERNAL_DESCRIPTION);
+ report << "Input matrix M1:" << endl;
+ MD.write (report, M1);
+
+ StandardBasisStream<Field, typename LinBox::Vector<Field>::Dense> stream (F, M.rowdim ());
+ typename LinBox::Vector<Field>::Dense v (M.coldim ()), w (M.rowdim ());
+ typename BlasMatrix<Field>::RowIterator i = M1.rowBegin ();
+
+ VD.subin (w, w);
+
+ for (; i != M1.rowEnd (); ++i) {
+ stream >> v;
+ MD.vectorAxpyin (w, M, v);
+ }
+
+ report << "Output vector w:" << endl;
+ VD.write (report, w);
+
+ typename LinBox::Vector<Field>::Dense z (M.coldim (), F.one), w1 (M.rowdim ());
+
+ MD.vectorMul (w1, M, z);
+
+ report << "Output vector w1:" << endl;
+ VD.write (report, w1);
+
+ if (!VD.areEqual (w, w1)) {
+ commentator().report (Commentator::LEVEL_IMPORTANT, INTERNAL_ERROR)
+ << "ERROR: VectorDomain reported vectors w and w1 are not equal" << endl;
+ ret = false;
+ }
+
+ commentator().stop (MSG_STATUS (ret), (const char *) 0, "testMVAxpy");
+
+ return ret;
+}
+
+/* Test 11: black box multiply by I on the left, test on random vectors
+ *
+ * Return true on success and false on failure
+ */
+
+template <class Field, class Vector, class Blackbox>
+static bool testLeftBlackboxMul (Field &F, const char *text, const Blackbox &A,
+ VectorStream<Vector> &stream)
+{
+ ostringstream str;
+
+ str << "Testing " << text << " matrix-black box left mul" << ends;
+ commentator().start (str.str ().c_str (), "testLeftBlackboxMul");
+
+ bool ret = true;
+
+ VectorDomain<Field> VD (F);
+ MatrixDomain<Field> MD (F);
+
+ BlasMatrix<Field> I (F, A.coldim (), A.coldim ());
+ BlasMatrix<Field> AI (F, A.rowdim (), A.coldim ());
+
+ StandardBasisStream<Field, typename BlasMatrix<Field>::Row> Istream (F, A.coldim ());
+ typename BlasMatrix<Field>::RowIterator i;
+
+ for (i = I.rowBegin (); i != I.rowEnd (); ++i)
+ Istream >> *i;
+
+ MD.blackboxMulLeft (AI, A, I);
+
+ ostream &report = commentator().report (Commentator::LEVEL_IMPORTANT, INTERNAL_DESCRIPTION);
+ report << "Output matrix AI:" << endl;
+ MD.write (report, AI);
+
+ typename LinBox::Vector<Field>::Dense v (A.coldim ()), w1 (A.rowdim ()), w2 (A.rowdim ());
+
+ while (stream) {
+ stream >> v;
+
+ A.apply (w1, v);
+ MD.vectorMul (w2, AI, v);
+
+ if (!VD.areEqual (w1, w2)) {
+ commentator().report (Commentator::LEVEL_IMPORTANT, INTERNAL_ERROR)
+ << "ERROR: Av != AIv" << endl;
+ ret = false;
+ }
+ }
+
+ commentator().stop (MSG_STATUS (ret), (const char *) 0, "testLeftBlackboxMul");
+
+ return ret;
+}
+
+/* Test 12: black box multiply by I on the right, test on random vectors
+ *
+ * Return true on success and false on failure
+ */
+
+template <class Field, class Vector, class Blackbox>
+static bool testRightBlackboxMul (Field &F, const char *text, const Blackbox &A,
+ VectorStream<Vector> &stream)
+{
+ ostringstream str;
+
+ str << "Testing " << text << " matrix-black box right mul" << ends;
+ commentator().start (str.str ().c_str (), "testRightBlackboxMul");
+ ostream &report = commentator().report (Commentator::LEVEL_IMPORTANT, INTERNAL_DESCRIPTION);
+
+ bool ret = true;
+
+ VectorDomain<Field> VD (F);
+ MatrixDomain<Field> MD (F);
+
+ BlasMatrix<Field> I (F, A.rowdim (), A.rowdim ());
+ BlasMatrix<Field> IA (F, A.rowdim (), A.coldim ());
+
+ StandardBasisStream<Field, typename BlasMatrix<Field>::Row> Istream (F, A.rowdim ());
+ typename BlasMatrix<Field>::RowIterator i;
+
+ for (i = I.rowBegin (); i != I.rowEnd (); ++i)
+ Istream >> *i;
+
+ MD.blackboxMulRight (IA, I, A);
+ report << "blackboxMulRight Output matrix IA:" << endl;
+ MD.write (report, IA);
+
+ MD.mul (IA, I, A);
+ report << "mul Output matrix IA:" << endl;
+ MD.write (report, IA);
+
+ MD.mul (IA, A, I);
+ report << "mul Output matrix AI:" << endl;
+ MD.write (report, IA);
+
+ typename LinBox::Vector<Field>::Dense v (A.coldim ()), w1 (A.rowdim ()), w2 (A.rowdim ());
+
+ while (stream) {
+ stream >> v;
+
+ A.apply (w1, v);
+ MD.vectorMul (w2, IA, v);
+
+ if (!VD.areEqual (w1, w2)) {
+ commentator().report (Commentator::LEVEL_IMPORTANT, INTERNAL_ERROR)
+ << "ERROR: Av != IAv" << endl;
+ ret = false;
+ }
+ }
+
+ commentator().stop (MSG_STATUS (ret), (const char *) 0, "testRightBlackboxMul");
+
+ return ret;
+}
+
+std::ostream &reportPermutation
+ (std::ostream &out,
+ const std::vector<std::pair<unsigned int, unsigned int> > &P)
+{
+ std::vector<std::pair<unsigned int, unsigned int> >::const_iterator i;
+
+ for (i = P.begin (); i != P.end (); ++i)
+ out << "(" << i->first << " " << i->second << ")";
+
+ return out;
+}
+
+template <class Field, class Matrix>
+bool testPermutation (const Field &F, const char *text, const Matrix &M)
+{
+ ostringstream str;
+
+ str << "Testing " << text << " permutations" << ends;
+ commentator().start (str.str ().c_str (), "testPermutation");
+
+ bool ret = true;
+
+ MatrixDomain<Field> MD (F);
+ MersenneTwister MT ((unsigned)time (NULL));
+
+ typename MatrixDomain<Field>::Permutation P, Pinv;
+
+ // Create a random row permutation
+ for (unsigned int i = 0; i < M.rowdim (); ++i) {
+ unsigned int row1, row2;
+
+ do {
+ row1 = (unsigned)(MT.randomInt () % M.rowdim ());
+ row2 = (unsigned)(MT.randomInt () % M.rowdim ());
+ } while (row1 == row2);
+
+ P.push_back (typename MatrixDomain<Field>::Transposition (row1, row2));
+ }
+
+ // Construct the inverse of this transposition
+ Pinv.resize (P.size ());
+ std::copy (P.begin (), P.end (), Pinv.begin ());
+ std::reverse (Pinv.begin (), Pinv.end ());
+
+ ostream &report = commentator().report (Commentator::LEVEL_UNIMPORTANT, INTERNAL_DESCRIPTION);
+ report << "Permutation P: ";
+ reportPermutation (report, P) << endl;
+ report << "Permutation P^-1: ";
+ reportPermutation (report, Pinv) << endl;
+
+ // Apply the permutation and then its inverse to a copy of M
+ Matrix M1 (M);
+
+ MD.permuteRows (M1, P.begin (), P.end ());
+ MD.permuteRows (M1, Pinv.begin (), Pinv.end ());
+
+ report << "Output matrix P^-1 PM:" << endl;
+ MD.write (report, M1);
+
+ // Compare M and M1
+ if (!MD.areEqual (M, M1)) {
+ commentator().report (Commentator::LEVEL_IMPORTANT, INTERNAL_ERROR)
+ << "ERROR: M != P^-1 PM" << endl;
+ ret = false;
+ }
+
+ // Now we do exactly the same thing with columns
+ P.clear ();
+ Pinv.clear ();
+
+ // Create a random column permutation
+ for (unsigned int i = 0; i < M.coldim (); ++i) {
+ unsigned int col1, col2;
+
+ do {
+ col1 = (unsigned)(MT.randomInt () % M.coldim ());
+ col2 = (unsigned)(MT.randomInt () % M.coldim ());
+ } while (col1 == col2);
+
+ P.push_back (typename MatrixDomain<Field>::Transposition (col1, col2));
+ }
+
+ // Construct the inverse of this transposition
+ Pinv.resize (P.size ());
+ std::copy (P.begin (), P.end (), Pinv.begin ());
+ std::reverse (Pinv.begin (), Pinv.end ());
+
+ report << "Permutation P: ";
+ reportPermutation (report, P) << endl;
+ report << "Permutation P^-1: ";
+ reportPermutation (report, Pinv) << endl;
+
+ // Apply the permutation and then its inverse to a copy of M
+ MD.permuteColumns (M1, P.begin (), P.end ());
+ MD.permuteColumns (M1, Pinv.begin (), Pinv.end ());
+
+ report << "Output matrix MPP^-1:" << endl;
+ MD.write (report, M1);
+
+ // Compare M and M1
+ if (!MD.areEqual (M, M1)) {
+ commentator().report (Commentator::LEVEL_IMPORTANT, INTERNAL_ERROR)
+ << "ERROR: M != MPP^-1" << endl;
+ ret = false;
+ }
+
+ commentator().stop (MSG_STATUS (ret), (const char *) 0, "testPermutation");
+
+ return ret;
+}
+
+template <class Field, class Blackbox, class Matrix>
+bool testMatrixDomain (const Field &F, typename Field::RandIter& gen, const char *text,
+ Matrix &M1, Matrix &M2, Matrix &M3,
+ const Blackbox &A,
+ unsigned int iterations,
+ MatrixCategories::RowColMatrixTag)
+{
+ ostringstream str;
+ str << "Testing MatrixDomain with " << text << " matrices" << ends;
+ commentator().start (str.str ().c_str ());
+
+ bool pass = true;
+
+ RandomDenseStream<Field, typename LinBox::Vector<Field>::Dense> stream (F, gen, A.coldim (), iterations);
+
+ if (!testCopyEqual (F, text, M1)) pass = false;
+ if (!testSubinIsZero (F, text, M1)) pass = false;
+ if (!testAddNegSub (F, text, M1, M2)) pass = false;
+ if (!testAddinNeginSub (F, text, M1, M2)) pass = false;
+
+ if (M1.rowdim () == M1.coldim ()) {
+ if (!testInvMulSquare (F, text, M1)) pass = false;
+ if (!testInvLeftMulinSquare (F, text, M1)) pass = false;
+ if (!testInvRightMulinSquare (F, text, M1)) pass = false;
+ }
+ else if (M1.coldim () < M1.rowdim ()) {
+ if (!testInvMulOver (F, text, M1)) pass = false;
+ if (!testInvLeftMulinOver (F, text, M1)) pass = false;
+ if (!testInvRightMulinOver (F, text, M1)) pass = false;
+ }
+ else if (M1.rowdim () < M1.coldim ()) {
+ if (!testInvMulUnder (F, text, M1)) pass = false;
+ if (!testInvLeftMulinUnder (F, text, M1)) pass = false;
+ if (!testInvRightMulinUnder (F, text, M1)) pass = false;
+ }
+
+ if (!testAddMulAxpyin (F, text, M1, M2, M3)) pass = false;
+ if (!testMVMulSub (F, text, M1)) pass = false;
+ if (!testMVAxpy (F, text, M1)) pass = false;
+ if (!testLeftBlackboxMul (F, text, A, stream)) pass = false;
+ if (!testRightBlackboxMul (F, text, A, stream)) pass = false;
+ if (!testPermutation (F, text, M1)) pass = false;
+
+ commentator().stop (MSG_STATUS (pass));
+
+ return pass;
+}
+
+template <class Field, class Blackbox, class Matrix>
+bool testMatrixDomain (const Field &F, ctypename Field::RandIter& gen, onst char *text,
+ Matrix &M1, Matrix &M2, Matrix &M3,
+ const Blackbox &A,
+ unsigned int iterations,
+ MatrixCategories::RowMatrixTag)
+{
+ ostringstream str;
+ str << "Testing MatrixDomain with " << text << " matrices" << ends;
+ commentator().start (str.str ().c_str ());
+
+ bool pass = true;
+
+ RandomDenseStream<Field, typename LinBox::Vector<Field>::Dense> stream (F, gen, A.coldim (), iterations);
+
+ if (!testCopyEqual (F, text, M1)) pass = false;
+ if (!testSubinIsZero (F, text, M1)) pass = false;
+ if (!testAddNegSub (F, text, M1, M2)) pass = false;
+ if (!testAddinNeginSub (F, text, M1, M2)) pass = false;
+
+ if (M1.rowdim () == M1.coldim ()) {
+ if (!testInvMulSquare (F, text, M1)) pass = false;
+ if (!testInvLeftMulinSquare (F, text, M1)) pass = false;
+ }
+ else if (M1.rowdim () < M1.coldim ()) {
+ if (!testInvMulUnder (F, text, M1)) pass = false;
+ if (!testInvLeftMulinUnder (F, text, M1)) pass = false;
+ }
+
+ if (!testAddMulAxpyin (F, text, M1, M2, M3)) pass = false;
+ if (!testMVMulSub (F, text, M1)) pass = false;
+ if (!testMVAxpy (F, text, M1)) pass = false;
+ if (!testLeftBlackboxMul (F, text, A, stream)) pass = false;
+ if (!testPermutation (F, text, M1)) pass = false;
+
+ commentator().stop (MSG_STATUS (pass));
+
+ return pass;
+}
+
+template <class Field, class Blackbox, class Matrix>
+bool testMatrixDomain (const Field &F, typename Field::RandIter& gen, const char *text,
+ Matrix &M1, Matrix &M2, Matrix &M3,
+ const Blackbox &A,
+ unsigned int iterations,
+ MatrixCategories::ColMatrixTag)
+{
+ ostringstream str;
+ str << "Testing MatrixDomain with " << text << " matrices" << ends;
+ commentator().start (str.str ().c_str ());
+
+ bool pass = true;
+
+ RandomDenseStream<Field, typename LinBox::Vector<Field>::Dense> stream (F, gen, A.coldim (), iterations);
+
+ if (!testCopyEqual (F, text, M1)) pass = false;
+ if (!testSubinIsZero (F, text, M1)) pass = false;
+ if (!testAddNegSub (F, text, M1, M2)) pass = false;
+ if (!testAddinNeginSub (F, text, M1, M2)) pass = false;
+
+ if (M1.rowdim () == M1.coldim ()) {
+ if (!testInvMulSquare (F, text, M1)) pass = false;
+ if (!testInvRightMulinSquare (F, text, M1)) pass = false;
+ }
+ else if (M1.coldim () < M1.rowdim ()) {
+ if (!testInvMulOver (F, text, M1)) pass = false;
+ if (!testInvRightMulinOver (F, text, M1)) pass = false;
+ }
+
+ if (!testAddMulAxpyin (F, text, M1, M2, M3)) pass = false;
+ if (!testMVMulSub (F, text, M1)) pass = false;
+ if (!testMVAxpy (F, text, M1)) pass = false;
+ if (!testRightBlackboxMul (F, text, A, stream)) pass = false;
+
+ commentator().stop (MSG_STATUS (pass));
+
+ return pass;
+}
+
+template <class Field, class Blackbox, class Matrix>
+bool testMatrixDomain (const Field &F, typename Field::RandIter& gen, const char *text,
+ Matrix &M1, Matrix &M2, Matrix &M3,
+ const Blackbox &A,
+ unsigned int iterations,
+ MatrixCategories::BlackboxTag)
+{
+ ostringstream str;
+ str << "Testing MatrixDomain with " << text << " matrices" << ends;
+ commentator().start (str.str ().c_str ());
+
+ bool pass = true;
+
+ RandomDenseStream<Field, typename LinBox::Vector<Field>::Dense> stream (F, gen, A.coldim (), iterations);
+
+ if (!testRightBlackboxMul (F, text, A, stream)) pass = false;
+
+ commentator().stop (MSG_STATUS (pass));
+
+ return pass;
+}
+
+template <class MatDomain>
+bool launchTestMatrixDomain(const MatDomain& MD, size_t m, size_t n, size_t k)
+{
+
+ bool pass = true ;
+ typename MatDomain::NewMatrix A(MD, m, m);
+ typename MatDomain::NewMatrix B(MD, m, m);
+ typename MatDomain::NewMatrix C(MD, m, m);
+ MD.add(C, A, B);
+ MD.inv(C,A);
+ MD.sub(C, A, B);
+ MD.mul(C, A, B);
+ MD.axpyin(C, A, B);
+ typename MatDomain::Matrix S;
+ S.submatrix(A, 0, 0, m, n);
+ MD.areEqual(A,S);
+#if 0
+ typedef typename Field::Element Element ;
+ BlasMatrix<Field> M1 (F, n, m);
+ BlasMatrix<Field> M2 (F, n, m);
+ BlasMatrix<Field> M3 (F, m, m);
+ MatrixBlackbox<Field, BlasMatrix<Field> > A1 (F, n, m);
+ typename Field::RandIter gen(F);
+
+ RandomDenseStream<Field, typename BlasMatrix<Field>::Row> stream1 (F, gen, m);
+
+ typename BlasMatrix<Field>::RowIterator i;
+
+ for (i = M1.rowBegin (); i != M1.rowEnd (); ++i)
+ stream1 >> *i;
+
+ for (i = M2.rowBegin (); i != M2.rowEnd (); ++i)
+ stream1 >> *i;
+
+ for (i = M3.rowBegin (); i != M3.rowEnd (); ++i)
+ stream1 >> *i;
+
+ for (i = A1.rep ().rowBegin (); i != A1.rep ().rowEnd (); ++i)
+ stream1 >> *i;
+
+ if (!testMatrixDomain (F, gen, "dense", M1, M2, M3, A1, iterations,
+ typename MatrixTraits<BlasMatrix<Field> >::MatrixCategory ()))
+ pass = false;
+ Diagonal<Field> A1b (F, n, true); // random, nonsingular
+ if (!testMatrixDomain (F, gen, "blackbox", M1, M2, M3, A1b, iterations,
+ typename MatrixTraits<Diagonal<Field> >::MatrixCategory ()))
+ pass = false;
+
+ SparseMatrix<Field> M4 (F,n, m);
+ SparseMatrix<Field> M5 (F,n, m);
+ SparseMatrix<Field> M6 (F,m, m);
+ MatrixBlackbox<Field, SparseMatrix<Field> > A2 (F, n, m);
+
+ RandomSparseStream<Field, typename SparseMatrix<Field>::Row> stream2 (F, gen, (double) k / (double) n, m);
+
+ typename SparseMatrix<Field>::RowIterator i2;
+
+ for (i2 = M4.rowBegin (); i2 != M4.rowEnd (); ++i2)
+ stream2 >> *i2;
+
+ for (i2 = M5.rowBegin (); i2 != M5.rowEnd (); ++i2)
+ stream2 >> *i2;
+
+ for (i2 = M6.rowBegin (); i2 != M6.rowEnd (); ++i2)
+ stream2 >> *i2;
+
+ for (i2 = A2.rep ().rowBegin (); i2 != A2.rep ().rowEnd (); ++i2)
+ stream2 >> *i2;
+
+ if (!testMatrixDomain (F, gen, "sparse row-wise", M4, M5, M6, A2, iterations,
+ typename MatrixTraits<SparseMatrix<Field> >::MatrixCategory ()))
+ pass = false;
+
+ TransposeMatrix<SparseMatrix<Field> > M7 (M4);
+ TransposeMatrix<SparseMatrix<Field> > M8 (M5);
+ TransposeMatrix<SparseMatrix<Field> > M9 (M6);
+
+ if (!testMatrixDomain (F, gen, "sparse column-wise", M7, M8, M9, A2, iterations,
+ typename MatrixTraits<TransposeMatrix<SparseMatrix<Field> > >::MatrixCategory ()))
+ pass = false;
+
+#endif
+
+ return pass ;
+}
+#endif
+
+int main (int argc, char **argv)
+{
+ bool pass = true;
+
+ static size_t n = 6;
+ static size_t m = n;
+ static size_t k = 2;
+ static integer q = 65521U;
+ //static integer q2 = FieldTraits<Givaro::ModularBalanced<int32_t> >::maxModulus() ;
+ //Givaro::prevprime(q2,q2);
+ static unsigned int iterations = 1;
+
+ static Argument args[] = {
+ { 'n', "-n N", "Set row of test matrices to N.", TYPE_INT, &n },
+ { 'm', "-m M", "Set column of test vectors to M.", TYPE_INT, &m },
+ { 'k', "-k K", "K nonzero elements per row/column in sparse matrices.", TYPE_INT, &k },
+ { 'q', "-q Q", "Operate over the \"field\" GF(Q) [1] for uint32_t modulus.", TYPE_INTEGER, &q },
+ { 'i', "-i I", "Perform each test for I iterations.", TYPE_INT, &iterations },
+ END_OF_ARGUMENTS
+ };
+
+ parseArguments (argc, argv, args);
+ if (k >= m) k = m/2+1 ;
+
+
+ typedef Givaro::Modular<uint32_t> Field;
+ Field F1 (q); Field::RandIter gen(F1);
+
+ //Givaro::ModularBalanced<int32_t> F2 (q2);
+ //Givaro::Modular<uint32_t> F3(q);
+ //if (q2 < q/2)
+ // std::cerr <<"...étrange..." << std::endl;
+
+ commentator().start("Plain matrix domain test suite", "PlainDomain");
+
+ commentator().setBriefReportParameters (Commentator::OUTPUT_CONSOLE, false, false, false);
+
+ LinBox::PlainDomain<Field> PD(F1);
+ LinBox::PlainDomain<Field>::RandIter Pgen(PD);
+ pass &= testMatrixDomain(PD, n);
+// pass &= launchTestMatrixDomain(F1, gen,m,n,k);
+// pass &= launchTestMatrixDomain(PD, Pgen,m,n,k);
+ //pass &= launchTestMatrixDomain(PD, gen,m,n,k);
+ //pass &= launchTestMatrixDomain(F2,m,n,k,iterations);
+ //pass &= launchTestMatrixDomain(F3,m,n,k,iterations);
+
+ commentator().stop (MSG_STATUS (pass), "Plain matrix domain test suite");
+ return pass ? 0 : -1;
+}
+
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/tests/test-poly-det.C b/tests/test-poly-det.C
new file mode 100644
index 0000000..52c15a9
--- /dev/null
+++ b/tests/test-poly-det.C
@@ -0,0 +1,117 @@
+
+#include "linbox/linbox-config.h"
+
+#include <omp.h>
+
+#define __LINBOX_USE_OPENMP 1
+#include "linbox/ring/modular.h"
+#include "linbox/matrix/sparse-matrix.h"
+#include "linbox/matrix/dense-matrix.h"
+#include "linbox/matrix/matrix-domain.h"
+
+#include "linbox/algorithms/poly-interpolation.h"
+#include "linbox/algorithms/poly-det.h"
+
+#include <givaro/givpoly1.h>
+#include <givaro/modular.h>
+
+using namespace LinBox;
+
+typedef Givaro::Modular<double> Field;
+typedef typename Field::Element FieldElt;
+typedef Givaro::Poly1Dom<Field,Givaro::Dense> PolyDom;
+typedef GivaroPoly<PolyDom> Ring;
+typedef typename Ring::Element RingElt;
+typedef MatrixDomain<PolyDom> PolyMatDom;
+typedef PolyMatDom::OwnMatrix PolyMat;
+
+
+
+int main(int argc, char** argv)
+{
+ static Argument args[] = {
+ END_OF_ARGUMENTS
+ };
+ parseArguments (argc, argv, args);
+
+
+ bool pass=true;
+
+ std::vector<integer> x,y;
+ x.push_back(1);
+ x.push_back(2);
+ x.push_back(3);
+ x.push_back(4);
+ x.push_back(5);
+ y.push_back(0);
+ y.push_back(2);
+
+ int q=101;
+ RingElt P1,P2,P4;
+ Field F(q);
+ PolyDom PD(F,"x");
+ Ring R(PD);
+ R.init(P1,x);
+ R.init(P4,y);
+
+
+ std::vector<FieldElt> vals,pts;
+ pts.push_back(1);
+ pts.push_back(2);
+ pts.push_back(3);
+ pts.push_back(4);
+ pts.push_back(5);
+ pts.push_back(6);
+ pts.push_back(7);
+ pts.push_back(8);
+
+
+ FieldElt d;
+ PolyInterpolation<Field,PolyDom> PO(pts,F,PD);
+ PO.evaluate(vals,P1,PD,F);
+ for (size_t i=0;i<vals.size();++i) {
+ PD.eval(d,P1,pts[i]);
+ pass=pass&&F.areEqual(d,vals[i]);
+ }
+ PO.interpolate(P2,pts,vals,PD,F);
+
+ int n=3,m=3;
+ typename MatrixDomain<PolyDom>::OwnMatrix A(PD,m,n);
+ for (int i=0;i<m;++i) {
+ for (int j=0;j<n;++j) {
+ if (i==j) {
+ A.setEntry(i,j,P4);
+ } else {
+ A.setEntry(i,j,R.zero);
+ }
+ }
+ }
+ A.setEntry(0,1,P4);
+
+
+ //A.setEntry(0,0,P1);
+ for (int i=0;i<m;++i) {
+ for (int j=0;j<n;++j) {
+ PolyDom::Element tempP;
+ A.getEntry(tempP,i,j);
+ PD.write(std::cout,tempP);
+ std::cout << " ";
+ }
+ std::cout << std::endl;
+ }
+ PolyDom::Element P3;
+ computePolyDetExtension(P3,F,A);
+ R.write(std::cout,P3);
+ std::cout << std::endl;
+
+
+
+
+ R.write(std::cout,P1);
+ std::cout << std::endl;
+ R.write(std::cout,P2);
+ std::cout << std::endl;
+
+ return pass?0:-1;
+}
+
diff --git a/tests/test-qlup.C b/tests/test-qlup.C
old mode 100644
new mode 100755
index 35b16c2..42e9ac8
--- a/tests/test-qlup.C
+++ b/tests/test-qlup.C
@@ -1,9 +1,9 @@
/* tests/test-qlup.C
* Copyright (C) The LinBox group
*
- * Time-stamp: <22 Jun 10 15:59:56 Jean-Guillaume.Dumas at imag.fr>
+ * Time-stamp: <29 Oct 15 19:13:28 Jean-Guillaume.Dumas at imag.fr>
* -----------------------------------------------------
- *
+ *
* ========LICENCE========
* This file is part of the library LinBox.
*
@@ -36,19 +36,16 @@
#include <iostream>
#include <fstream>
-#include <vector>
+
#include <cstdio>
-#include "linbox/vector/sparse.h"
+#include <linbox/matrix/sparse-matrix.h>
#include "linbox/algorithms/gauss.h"
#include "linbox/algorithms/gauss-gf2.h"
#include "linbox/blackbox/permutation.h"
#include "linbox/util/commentator.h"
-#include "linbox/field/modular.h"
-#include "linbox/field/PID-integer.h"
-#include "linbox/field/givaro.h"
+#include <givaro/modular.h>
#include "linbox/blackbox/diagonal.h"
-#include "linbox/blackbox/sparse.h"
#include "linbox/blackbox/scalar-matrix.h"
#include "linbox/blackbox/direct-sum.h"
#include "linbox/solutions/rank.h"
@@ -69,9 +66,9 @@ bool testQLUP(const Field &F, size_t n, unsigned int iterations, int rseed, doub
commentator().start ("Testing Sparse elimination qlup", "testQLUP", iterations);
- unsigned long Ni = n;
- unsigned long Nj = n;
- integer card; F.cardinality(card);
+ size_t Ni = n;
+ size_t Nj = n;
+ integer card; F.cardinality(card);
typename Field::RandIter generator (F,card,rseed);
RandStream stream (F, generator, sparsity, n, n);
@@ -86,12 +83,13 @@ bool testQLUP(const Field &F, size_t n, unsigned int iterations, int rseed, doub
std::ostream & report = commentator().report (Commentator::LEVEL_UNIMPORTANT, INTERNAL_DESCRIPTION);
F.write( report ) << endl;
- A.write( report,FORMAT_MAPLE ) << endl;
+ A.write( report,Tag::FileFormat::Maple ) << endl;
- std::vector<typename Field::Element> u(Nj), v(Ni), w1(Nj), w2(Ni), w3(Ni), w(Ni);
- for(typename std::vector<typename Field::Element>::iterator it=u.begin();it!=u.end();++it)
+ DenseVector<Field> u(F,Nj), v(F,Ni), w1(F,Nj), w2(F,Ni), w3(F,Ni), w(F,Ni);
+ for(auto it=u.begin();it!=u.end();++it)
generator.random (*it);
+
A.apply(v,u);
@@ -112,8 +110,8 @@ bool testQLUP(const Field &F, size_t n, unsigned int iterations, int rseed, doub
Q.apply(w, L.apply(w3, A.apply(w2, P.apply(w1,u) ) ) );
bool error = false;
- typename std::vector<typename Field::Element>::const_iterator itv=v.begin();
- typename std::vector<typename Field::Element>::const_iterator itw=w.begin();
+ auto itv=v.begin();
+ auto itw=w.begin();
for( ; itw!=w.end();++itw,++itv) {
if (! F.areEqual(*itw,*itv) ) {
error = true;
@@ -124,27 +122,27 @@ bool testQLUP(const Field &F, size_t n, unsigned int iterations, int rseed, doub
res = false;
report << "ERROR : matrix(" << u.size() << ",1,[";
- for(typename std::vector<typename Field::Element>::const_iterator itu=u.begin(); itu!=u.end();++itu)
+ for(auto itu=u.begin(); itu!=u.end();++itu)
report << *itu << ',';
report << "]);\n[";
- for(typename std::vector<typename Field::Element>::const_iterator itv2=v.begin(); itv2!=v.end();++itv2)
+ for(auto itv2=v.begin(); itv2!=v.end();++itv2)
report << *itv2 << ' ';
report << "] != [";
- for(typename std::vector<typename Field::Element>::const_iterator itw2=w.begin(); itw2!=w.end();++itw2)
+ for(auto itw2=w.begin(); itw2!=w.end();++itw2)
report << *itw2 << ' ';
report << "]" << std::endl;
report << "w1: [";
- for(typename std::vector<typename Field::Element>::const_iterator itw2=w1.begin(); itw2!=w1.end();++itw2)
+ for(auto itw2=w1.begin(); itw2!=w1.end();++itw2)
report << *itw2 << ' ';
report << "]" << std::endl;
report << "w2: [";
- for(typename std::vector<typename Field::Element>::const_iterator itw2=w2.begin(); itw2!=w2.end();++itw2)
+ for(auto itw2=w2.begin(); itw2!=w2.end();++itw2)
report << *itw2 << ' ';
report << "]" << std::endl;
report << "w3: [";
- for(typename std::vector<typename Field::Element>::const_iterator itw2=w3.begin(); itw2!=w3.end();++itw2)
+ for(auto itw2=w3.begin(); itw2!=w3.end();++itw2)
report << *itw2 << ' ';
report << "]" << std::endl;
}
@@ -171,13 +169,13 @@ bool testQLUPsolve(const Field &F, size_t n, unsigned int iterations, int rseed,
commentator().start ("Testing Sparse elimination qlup solve", "testQLUPsolve", iterations);
- unsigned long Ni = n;
- unsigned long Nj = n;
- integer card; F.cardinality(card);
+ size_t Ni = n;
+ size_t Nj = n;
+ integer card; F.cardinality(card);
typename Field::RandIter generator (F,card,rseed);
RandStream stream (F, generator, sparsity, n, n);
- GF2 F2;
+ GF2 F2;
GF2::RandIter bitgenerator(F2,2,rseed);
// GF2::Element randomsolve;
@@ -190,10 +188,10 @@ bool testQLUPsolve(const Field &F, size_t n, unsigned int iterations, int rseed,
std::ostream & report = commentator().report (Commentator::LEVEL_UNIMPORTANT, INTERNAL_DESCRIPTION);
F.write( report ) << endl;
- A.write( report, FORMAT_MAPLE ) << endl;
+ A.write( report, Tag::FileFormat::Maple ) << endl;
- std::vector<typename Field::Element> u(Nj), v(Ni), x(Nj), y(Ni);
- for(typename std::vector<typename Field::Element>::iterator it=u.begin();it!=u.end();++it)
+ DenseVector<Field> u(F,Nj), v(F,Ni), x(F,Nj), y(F,Ni);
+ for(auto it=u.begin();it!=u.end();++it)
generator.random (*it);
A.apply(v,u);
@@ -215,20 +213,20 @@ bool testQLUPsolve(const Field &F, size_t n, unsigned int iterations, int rseed,
if (! VD.areEqual(v,y)) {
res=false;
- A.write( report, FORMAT_MAPLE ) << endl;
+ A.write( report, Tag::FileFormat::Maple ) << endl;
report << "ERROR v: matrix(" << v.size() << ",1,[";
- for(typename std::vector<typename Field::Element>::const_iterator itu=v.begin(); itu!=v.end();++itu)
+ for(auto itu=v.begin(); itu!=v.end();++itu)
report << *itu << ',';
report << "]);\n[";
report << "ERROR y: matrix(" << y.size() << ",1,[";
- for(typename std::vector<typename Field::Element>::const_iterator itu=y.begin(); itu!=y.end();++itu)
+ for(auto itu=y.begin(); itu!=y.end();++itu)
report << *itu << ',';
report << "]);\n[";
- for(typename std::vector<typename Field::Element>::const_iterator itv=x.begin(); itv!=x.end();++itv)
+ for(auto itv=x.begin(); itv!=x.end();++itv)
report << *itv << ' ';
report << "] != [";
- for(typename std::vector<typename Field::Element>::const_iterator itw=y.begin(); itw!=y.end();++itw)
+ for(auto itw=y.begin(); itw!=y.end();++itw)
report << *itw << ' ';
report << "]" << std::endl;
@@ -256,9 +254,9 @@ bool testQLUPnullspace(const Field &F, size_t n, unsigned int iterations, int rs
commentator().start ("Testing Sparse elimination qlup nullspacebasis", "testQLUPnullspace", iterations);
- unsigned long Ni = n;
- unsigned long Nj = n;
- integer card; F.cardinality(card);
+ size_t Ni = n;
+ size_t Nj = n;
+ integer card; F.cardinality(card);
typename Field::RandIter generator (F,card,rseed);
RandStream stream (F, generator, sparsity, n, n, rseed);
@@ -271,7 +269,7 @@ bool testQLUPnullspace(const Field &F, size_t n, unsigned int iterations, int rs
std::ostream & report = commentator().report (Commentator::LEVEL_UNIMPORTANT, INTERNAL_DESCRIPTION);
F.write( report ) << endl;
- A.write( report, FORMAT_MAPLE ) << endl;
+ A.write( report, Tag::FileFormat::Maple ) << endl;
Method::SparseElimination SE;
@@ -279,37 +277,37 @@ bool testQLUPnullspace(const Field &F, size_t n, unsigned int iterations, int rs
GaussDomain<Field> GD ( F );
Blackbox CopyA ( A );
- Blackbox X(F, A.coldim(), A.coldim() );
+ Blackbox X(F, A.coldim(), A.coldim() );
GD.nullspacebasisin(X, CopyA );
- unsigned long nullity = X.coldim();
+ size_t nullity = X.coldim();
- std::vector<typename Field::Element> u(nullity);
- for(typename std::vector<typename Field::Element>::iterator it=u.begin();it!=u.end();++it)
+ DenseVector<Field> u(F,nullity);
+ for(auto it=u.begin();it!=u.end();++it)
generator.random (*it);
- std::vector<typename Field::Element> v(Nj);
- X.apply(v,u);
- report << "Random combination of the rows of the NullSpace basis" << std::endl;
+ DenseVector<Field> v(F,Nj);
+ X.apply(v,u);
+ report << "Random combination of the rows of the NullSpace basis" << std::endl;
- std::vector<typename Field::Element> w(Ni);
- A.apply(w, v);
+ DenseVector<Field> w(F,Ni);
+ A.apply(w, v);
VectorDomain<Field> VD(F);
if (! VD.isZero(w)) {
res=false;
- A.write( report, FORMAT_MAPLE ) << endl;
+ A.write( report, Tag::FileFormat::Maple ) << endl;
report << "ERROR u: matrix(" << u.size() << ",1,[";
- for(typename std::vector<typename Field::Element>::const_iterator itu=u.begin(); itu!=u.end();++itu)
+ for(auto itu=u.begin(); itu!=u.end();++itu)
report << *itu << ',';
report << "]);\n[";
report << "ERROR v: matrix(" << v.size() << ",1,[";
- for(typename std::vector<typename Field::Element>::const_iterator itu=v.begin(); itu!=v.end();++itu)
+ for(auto itu=v.begin(); itu!=v.end();++itu)
report << *itu << ',';
report << "]);\n[";
- for(typename std::vector<typename Field::Element>::const_iterator itv=w.begin(); itv!=w.end();++itv)
+ for(auto itv=w.begin(); itv!=w.end();++itv)
report << *itv << ' ';
report << "] != 0" << std::endl;
@@ -324,108 +322,114 @@ bool testQLUPnullspace(const Field &F, size_t n, unsigned int iterations, int rs
return res;
}
+#define STOR_T SparseMatrixFormat::SparseSeq
+// #define STOR_T Vector<Field>::SparseSeq
+// #define STOR_T Sparse_Vector<Field::Element>
int main (int argc, char **argv)
{
commentator().setMaxDepth (-1);
commentator().getMessageClass (INTERNAL_DESCRIPTION).setMaxDetailLevel (Commentator::LEVEL_NORMAL);
-// commentator().setMaxDetailLevel( 100000 );
-// commentator().setMaxDepth( 100000 );
+ // commentator().setMaxDetailLevel( 100000 );
+ // commentator().setMaxDepth( 100000 );
bool pass = true;
static size_t n = 80;
static integer q = 65519U;
- static integer bigQ("1234567890123456789012345678901234568123");
+ static integer bigQ("1234567890123456789012345678901234568123");
//static integer q = 1000003U;
- static int iterations = 2;
- static double sparsity = 0.05;
- static int rseed = (unsigned)time(NULL);
+ static unsigned int iterations = 2;
+ static double sparsity = 0.05;
+ static int rseed = (int)time(NULL);
static Argument args[] = {
{ 'n', "-n N", "Set dimension of test matrices to NxN.", TYPE_INT, &n },
{ 'q', "-q Q", "Operate over the \"field\" GF(Q) [1].", TYPE_INTEGER, &q },
{ 'i', "-i I", "Perform each test for I iterations.", TYPE_INT, &iterations },
- { 's', "-s S", "Sparse matrices with density S.", TYPE_DOUBLE, &sparsity },
- { 'r', "-r R", "Random generator seed.", TYPE_INT, &rseed },
+ { 's', "-s S", "Sparse matrices with density S.", TYPE_DOUBLE, &sparsity },
+ { 'r', "-r R", "Random generator seed.", TYPE_INT, &rseed },
END_OF_ARGUMENTS
};
parseArguments (argc, argv, args);
- srand (rseed);
+ srand ((unsigned int)rseed);
commentator().start("QLUP test suite", "qlup");
- commentator().report (Commentator::LEVEL_NORMAL, INTERNAL_DESCRIPTION)
- << "Seed: " << rseed << endl;
-
- {
- commentator().report (Commentator::LEVEL_NORMAL, INTERNAL_DESCRIPTION)
- << "over Modular<uint32_t>" << endl;
- typedef Modular<uint32_t> Field;
- Field F (q);
- typedef SparseMatrix<Field, Sparse_Vector<Field::Element> > Blackbox;
- typedef RandomSparseStream<Field, Sparse_Vector<Field::Element> > RandStream;
- if (!testQLUP<Field, Blackbox, RandStream> (F, n, iterations, rseed, sparsity))
- pass = false;
- if (!testQLUPsolve<Field, Blackbox, RandStream> (F, n, iterations, rseed, sparsity))
- pass = false;
- if (!testQLUPnullspace<Field, Blackbox, RandStream> (F, n, iterations, rseed, sparsity))
- pass = false;
- }
-
- {
- commentator().report (Commentator::LEVEL_NORMAL, INTERNAL_DESCRIPTION)
- << "over Modular<double>" << endl;
- typedef Modular<double> Field;
- Field F (q);
- typedef SparseMatrix<Field, Sparse_Vector<Field::Element> > Blackbox;
- typedef RandomSparseStream<Field, Sparse_Vector<Field::Element> > RandStream;
- if (!testQLUP<Field, Blackbox, RandStream> (F, n, iterations, rseed, sparsity))
- pass = false;
- if (!testQLUPsolve<Field, Blackbox, RandStream> (F, n, iterations, rseed, sparsity))
- pass = false;
- if (!testQLUPnullspace<Field, Blackbox, RandStream> (F, n, iterations, rseed, sparsity))
- pass = false;
- }
-
- {
-
- commentator().report (Commentator::LEVEL_NORMAL, INTERNAL_DESCRIPTION)
- << "over GivaroZpz<Integer>" << endl;
- typedef GivaroZpz<Integer> Field;
- Field F (bigQ);
- typedef SparseMatrix<Field, Sparse_Vector<Field::Element> > Blackbox;
- typedef RandomSparseStream<Field, Sparse_Vector<Field::Element> > RandStream;
- if (!testQLUP<Field, Blackbox, RandStream> (F, n, iterations, rseed, sparsity))
- pass = false;
- if (!testQLUPsolve<Field, Blackbox, RandStream> (F, n, iterations, rseed, sparsity))
- pass = false;
- if (!testQLUPnullspace<Field, Blackbox, RandStream> (F, n, iterations, rseed, sparsity))
- pass = false;
- }
-
- {
- commentator().report (Commentator::LEVEL_NORMAL, INTERNAL_DESCRIPTION)
- << "specialized over GF2>" << endl;
- typedef GF2 Field;
- Field F2;
- typedef LinBox::GaussDomain<LinBox::GF2>::Matrix Blackbox;
- typedef RandomSparseStreamGF2<Blackbox::Row_t> RandStream;
- if (!testQLUP<Field, Blackbox, RandStream> (F2, n, iterations, rseed, sparsity))
- pass = false;
- if (!testQLUPsolve<Field, Blackbox, RandStream> (F2, n, iterations, rseed, sparsity))
- pass = false;
- }
+ commentator().report (Commentator::LEVEL_NORMAL, INTERNAL_DESCRIPTION)
+ << "Seed: " << rseed << endl;
+
+ {
+ commentator().report (Commentator::LEVEL_NORMAL, INTERNAL_DESCRIPTION)
+ << "over Givaro::Modular<uint32_t,uint64_t>" << endl;
+ typedef Givaro::Modular<uint32_t,uint64_t> Field;
+ Field F (q);
+ typedef SparseMatrix<Field, STOR_T > Blackbox;
+ typedef RandomSparseStream<Field, Blackbox::Row > RandStream;
+ if (!testQLUP<Field, Blackbox, RandStream> (F, n, iterations, rseed, sparsity))
+ pass = false;
+ if (!testQLUPsolve<Field, Blackbox, RandStream> (F, n, iterations, rseed, sparsity))
+ pass = false;
+ if (!testQLUPnullspace<Field, Blackbox, RandStream> (F, n, iterations, rseed, sparsity))
+ pass = false;
+ }
+
+ {
+ commentator().report (Commentator::LEVEL_NORMAL, INTERNAL_DESCRIPTION)
+ << "over Givaro::Modular<double>" << endl;
+ typedef Givaro::Modular<double> Field;
+ Field F (q);
+ typedef SparseMatrix<Field, STOR_T > Blackbox;
+ typedef RandomSparseStream<Field, Blackbox::Row > RandStream;
+
+ if (!testQLUP<Field, Blackbox, RandStream> (F, n, iterations, rseed, sparsity))
+ pass = false;
+ if (!testQLUPsolve<Field, Blackbox, RandStream> (F, n, iterations, rseed, sparsity))
+ pass = false;
+ if (!testQLUPnullspace<Field, Blackbox, RandStream> (F, n, iterations, rseed, sparsity))
+ pass = false;
+ }
+
+// {
+
+// commentator().report (Commentator::LEVEL_NORMAL, INTERNAL_DESCRIPTION)
+// << "over Givaro::Modular<Integer>" << endl;
+// typedef Givaro::Modular<Integer> Field;
+// Field F (bigQ);
+// typedef SparseMatrix<Field, STOR_T > Blackbox;
+// typedef RandomSparseStream<Field, Blackbox::Row > RandStream;
+
+// if (!testQLUP<Field, Blackbox, RandStream> (F, n, iterations, rseed, sparsity))
+// pass = false;
+// if (!testQLUPsolve<Field, Blackbox, RandStream> (F, n, iterations, rseed, sparsity))
+// pass = false;
+// if (!testQLUPnullspace<Field, Blackbox, RandStream> (F, n, iterations, rseed, sparsity))
+// pass = false;
+// }
+
+#if 1
+ {
+ commentator().report (Commentator::LEVEL_NORMAL, INTERNAL_DESCRIPTION)
+ << "specialized over GF2>" << endl;
+ typedef GF2 Field;
+ Field F2;
+ typedef LinBox::GaussDomain<LinBox::GF2>::Matrix Blackbox;
+ typedef RandomSparseStreamGF2<Blackbox::Row_t> RandStream;
+ if (!testQLUP<Field, Blackbox, RandStream> (F2, n, iterations, rseed, sparsity))
+ pass = false;
+ if (!testQLUPsolve<Field, Blackbox, RandStream> (F2, n, iterations, rseed, sparsity))
+ pass = false;
+ }
+#endif
commentator().stop(MSG_STATUS (pass),"QLUP test suite");
return pass ? 0 : -1;
}
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
// Local Variables:
// mode: C++
// tab-width: 8
// indent-tabs-mode: nil
// c-basic-offset: 8
// End:
-
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/tests/test-quad-matrix.C b/tests/test-quad-matrix.C
new file mode 100644
index 0000000..4028306
--- /dev/null
+++ b/tests/test-quad-matrix.C
@@ -0,0 +1,139 @@
+/* Copyright (C) LinBox
+ *
+ * using generic testBlackbox -bds
+ *
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ * ========LICENCE========
+ */
+
+/*! @file tests/test-quad-matrix.C
+ * @ingroup tests
+ * @brief no doc.
+ * @test no doc.
+ */
+
+
+
+
+#include "linbox/linbox-config.h"
+
+#include <iostream>
+#include <fstream>
+
+#include <set>
+
+#include "linbox/ring/modular.h"
+#include "linbox/blackbox/quad-matrix.h"
+
+#include "test-blackbox.h"
+
+using namespace LinBox;
+
+int main (int argc, char **argv)
+{
+ // ofstream report;
+
+ bool pass = true;
+
+ static size_t n = 100000;
+ static integer q = 101;
+ static int iterations = 1;
+
+ static Argument args[] = {
+ { 'n', "-n N", "Set dimension of test matrices to NxN.", TYPE_INT, &n },
+ { 'q', "-q Q", "Operate over the \"field\" GF(Q) [1].", TYPE_INTEGER, &q },
+ { 'i', "-i I", "Perform each test for I iterations.", TYPE_INT, &iterations },
+ END_OF_ARGUMENTS
+ };
+
+ parseArguments (argc, argv, args);
+
+ srand ((unsigned int)time (NULL));
+
+ typedef Givaro::Modular<uint32_t> Field;
+ typedef ZOQuad <Field> BlackBox;
+
+ Field F (q);
+ Field::Element d;
+ F.assign(d, F.one);
+
+ //ScalarMatrix<Field> A (F, n, d); // a small identity.
+ //BlackBox AA(A);
+ //pass = pass && testBlackbox(AA);
+
+ size_t *rows, *cols, i;
+ const size_t npr = n / 10000;
+ rows = new size_t[npr * n];
+ cols = new size_t[npr * n];
+
+ /*
+ // "arrow" matrix
+ for(i = 0; i < n; i++) { rows[i] = 0; cols[i] = i; }
+ for(i = 0; i < n - 1; i++) { rows[n+2*i] = i + 1; cols[n+2*i] = 0; rows[n+2*i+1] = i + 1; cols[n+2*i+1] = i + 1; }
+ ZeroOne<Field> B(F, rows, cols, n, n, 3 * n - 2);
+ */
+
+ // random 3 per row matrix
+ for(i = 0; i < n; i++)
+ {
+ set<size_t> a;
+ while( a.size() < npr )
+ a.insert((size_t)rand()%n);
+ size_t j = 0;
+ for(set<size_t>::iterator iter = a.begin(); j < npr; ++j, ++iter)
+ {
+ rows[npr*i+j] = i;
+ cols[npr*i+j] = *iter;
+ //std::cout << rows[npr*i+j] << ", ";
+ }
+ //std::cout << std::endl;
+ }
+ ZeroOne<Field> B(F, rows, cols, n, n, npr * n );
+
+ /*
+ ZeroOne<Field> B(F);
+ //ifstream mat_in("data/m133.b3.200200x200200.sms");
+ //ifstream mat_in("data/n4c6.b9.186558x198895.sms");
+ //ifstream mat_in("data/small21x21.sms");
+ //ifstream mat_in("data/iso333");
+ ifstream mat_in("../examples/iso334");
+ B.read(mat_in);
+ */
+
+ //std::cout << " -- main: " << B.rowdim() << " " << B.coldim() << " " << B.nnz() << std::endl;
+ //std::cout << " -- main: ZOQuad matrix blackbox test suite" << std::endl;
+
+ BlackBox BB(B);
+
+ //BB.write(cout) << endl; //just writes the sizes of the strips.
+
+ std::cout << " *** Warning ***, no read-write test" << std::endl;
+ pass = pass && testBlackbox(BB, false);
+
+ return pass ? 0 : -1;
+}
+
+
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/tests/test-randiter-nonzero.C b/tests/test-randiter-nonzero.C
index dab05f7..7c09b19 100644
--- a/tests/test-randiter-nonzero.C
+++ b/tests/test-randiter-nonzero.C
@@ -6,20 +6,20 @@
*
* ------------------------------------
*
- *
+ *
* ========LICENCE========
* This file is part of the library LinBox.
- *
+ *
* LinBox is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
- *
+ *
* This library 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
* Lesser General Public License for more details.
- *
+ *
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
@@ -37,15 +37,14 @@
#include "linbox/linbox-config.h"
+#include <givaro/givranditer.h>
#include <iostream>
#include <fstream>
-#include <vector>
+
#include "linbox/util/commentator.h"
-#include "linbox/field/modular.h"
-#include "linbox/randiter/modular.h"
-#include "linbox/randiter/nonzero.h"
+#include "linbox/ring/modular.h"
#include "test-common.h"
@@ -64,7 +63,7 @@ using namespace LinBox;
*/
template <class Field>
-static bool testNonzeroRandom (Field &F, int iterations)
+static bool testNonzeroRandom (Field &F, unsigned int iterations)
{
int i;
@@ -76,10 +75,10 @@ static bool testNonzeroRandom (Field &F, int iterations)
typename Field::RandIter r (F);
//NonzeroRandIter <Field, typename Field::RandIter> rp (F, r);
- NonzeroRandIter <Field> rp (F, r);
+ Givaro::GeneralRingNonZeroRandIter <Field> rp (r);
- for (i = 0; i < iterations; i++) {
- commentator().startIteration (i);
+ for (i = 0; i <(int) iterations; i++) {
+ commentator().startIteration ((unsigned int)i);
rp.random (x);
@@ -108,7 +107,7 @@ int main (int argc, char **argv)
bool pass = true;
static integer q = 101;
- static int iterations = 1000;
+ static unsigned int iterations = 1000;
static Argument args[] = {
{ 'q', "-q Q", "Operate over the \"field\" GF(Q) [1].", TYPE_INTEGER, &q },
@@ -117,11 +116,11 @@ int main (int argc, char **argv)
};
parseArguments (argc, argv, args);
- Modular<uint32_t> F (q);
+ Givaro::Modular<uint32_t> F (q);
srand ((unsigned)time (NULL));
- commentator().start("Nonzero random iterator test suite", "NonzeroRandIter");
+ commentator().start("Nonzero random iterator test suite", "Givaro::GeneralRingNonZeroRandIter");
commentator().setBriefReportParameters (Commentator::OUTPUT_CONSOLE, false, false, false);
commentator().getMessageClass (INTERNAL_DESCRIPTION).setMaxDepth (2);
diff --git a/tests/test-random-matrix.C b/tests/test-random-matrix.C
new file mode 100644
index 0000000..40c3eb8
--- /dev/null
+++ b/tests/test-random-matrix.C
@@ -0,0 +1,44 @@
+
+#include "linbox/linbox-config.h"
+#include "linbox/matrix/matrix-domain.h"
+#include "linbox/solutions/rank.h"
+#include "linbox/matrix/random-matrix.h"
+
+using namespace LinBox;
+
+
+bool testPrimeField(int p, int n, int m)
+{
+ typedef Givaro::Modular<double> Field;
+ typedef MatrixDomain<Field> Domain;
+ typedef typename Domain::OwnMatrix Matrix;
+ typedef typename Field::RandIter RandIter;
+
+ Field F(p);
+ Matrix M(F,n,m);
+ RandIter RI(F);
+ RandomDenseMatrix<RandIter,Field> RDM(F,RI);
+ long unsigned r;
+
+ RDM.randomFullRank(M);
+ rank(r,M,Method::BlasElimination());
+
+ return r==(long unsigned)(n<m?n:m);
+}
+
+int main(int argc, char** argv)
+{
+ bool pass=true;
+
+ static Argument args[] = {
+ END_OF_ARGUMENTS
+ };
+ parseArguments (argc, argv, args);
+
+ pass=pass&& testPrimeField(101,10,10);
+ pass=pass&& testPrimeField(101,2,10);
+ pass=pass&& testPrimeField(101,10,2);
+ pass=pass&& testPrimeField(101,1,10);
+
+ return pass?0:-1;
+}
diff --git a/tests/test-rank-Int.C b/tests/test-rank-Int.C
new file mode 100644
index 0000000..510fe5e
--- /dev/null
+++ b/tests/test-rank-Int.C
@@ -0,0 +1,76 @@
+/* tests/test-rank-Int.c
+ * Time-stamp: <08 Aug 14 07:51:49 Jean-Guillaume.Dumas at imag.fr>
+ * -----------------------------------------------------
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ * ========LICENCE========
+ */
+
+
+/*! @file tests/test-rank.C
+ * @ingroup tests
+ * @brief no doc
+ * @test no doc.
+ */
+
+#include "linbox/linbox-config.h"
+#include <givaro/modular-integer.h>
+#include "test-rank.h"
+
+int main (int argc, char **argv)
+{
+
+ bool pass = true;
+
+ static size_t n = 40;
+ static integer bigQ("12345678901234567890123456789012345678901234568119");
+ static int iterations = 1;
+ static double sparsity = 0.05;
+
+ static Argument args[] = {
+ { 'n', "-n N", "Set dimension of test matrices to NxN.", TYPE_INT, &n },
+ { 'i', "-i I", "Perform each test for I iterations.", TYPE_INT, &iterations },
+ { 's', "-s S", "Sparse matrices with density S.", TYPE_DOUBLE, &sparsity },
+ END_OF_ARGUMENTS
+ };
+
+ parseArguments (argc, argv, args);
+
+ srand ((unsigned)time (NULL));
+ // srand48 ((unsigned)time (NULL));
+
+ commentator().start("Integer sparse matrix rank test suite", "rank");
+ commentator().getMessageClass (INTERNAL_DESCRIPTION).setMaxDepth (3);
+ commentator().getMessageClass (INTERNAL_DESCRIPTION).setMaxDetailLevel (Commentator::LEVEL_NORMAL);
+
+ // Givaro::Modular<Integer> Gq(bigQ);
+ Givaro::Modular<integer> Gq(bigQ);
+ pass = pass && testSparseRank(Gq,n,n+1,(size_t)iterations,sparsity);
+ pass = pass && testSparseRank(Gq,LINBOX_USE_BLACKBOX_THRESHOLD+n,LINBOX_USE_BLACKBOX_THRESHOLD+n-1,(size_t)iterations,sparsity);
+
+ commentator().stop("Integer sparse matrix rank TEST suite");
+ return pass ? 0 : -1;
+}
+
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/tests/test-rank-md.C b/tests/test-rank-md.C
new file mode 100644
index 0000000..3d0f8eb
--- /dev/null
+++ b/tests/test-rank-md.C
@@ -0,0 +1,83 @@
+/* tests/test-rank-md.C
+ * Time-stamp: <08 Aug 14 07:40:04 Jean-Guillaume.Dumas at imag.fr>
+ * -----------------------------------------------------
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ * ========LICENCE========
+ */
+
+
+/*! @file tests/test-rank-md.C
+ * @ingroup tests
+ * @brief no doc
+ * @test no doc.
+ */
+
+#include "linbox/linbox-config.h"
+//#include <givaro/modular.h>
+#include "linbox/ring/modular/modular-double.h"
+#include "test-rank.h"
+
+int main (int argc, char **argv)
+{
+
+// commentator().setMaxDetailLevel( 100000 );
+// commentator().setMaxDepth( 100000 );
+
+ bool pass = true;
+
+ static size_t n = 20;
+ //static integer q = 65519U;
+ //static integer q = 1000003U;
+ static integer q = 67108859; // = prevprime(maxCardinality())
+ static int iterations = 1;
+ static double sparsity = 0.05;
+
+ static Argument args[] = {
+ { 'n', "-n N", "Set dimension of test matrices to NxN.", TYPE_INT, &n },
+ { 'q', "-q Q", "Operate over the \"field\" GF(Q) [1].", TYPE_INTEGER, &q },
+ { 'i', "-i I", "Perform each test for I iterations.", TYPE_INT, &iterations },
+ { 's', "-s S", "Sparse matrices with density S.", TYPE_DOUBLE, &sparsity },
+ END_OF_ARGUMENTS
+ };
+
+ parseArguments (argc, argv, args);
+
+ srand ((unsigned)time (NULL));
+ // srand48 ((unsigned)time (NULL));
+
+ commentator().start("Givaro::Modular<double> sparse rank test suite", "rank");
+ commentator().getMessageClass (INTERNAL_DESCRIPTION).setMaxDepth (3);
+ commentator().getMessageClass (INTERNAL_DESCRIPTION).setMaxDetailLevel (Commentator::LEVEL_NORMAL);
+
+ Givaro::Modular<double> G (q);
+ pass = pass && testSparseRank(G,n,n+1,(size_t)iterations,sparsity);
+ // the 2nd and 3rd args are matrix size, so this parameter usage seems very odd. ? -bds
+ // pass = pass && testSparseRank(G,LINBOX_USE_BLACKBOX_THRESHOLD+n,LINBOX_USE_BLACKBOX_THRESHOLD+n-1,(size_t)iterations,sparsity);
+
+ commentator().stop("Givaro::Modular<double> sparse rank test suite");
+ return pass ? 0 : -1;
+}
+
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/tests/test-rank-u32.C b/tests/test-rank-u32.C
new file mode 100644
index 0000000..60124b0
--- /dev/null
+++ b/tests/test-rank-u32.C
@@ -0,0 +1,80 @@
+/* tests/test-rank-u32.C
+ * Time-stamp: <08 Aug 14 07:40:22 Jean-Guillaume.Dumas at imag.fr>
+ * -----------------------------------------------------
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ * ========LICENCE========
+ */
+
+
+/*! @file tests/test-rank-u32.C
+ * @ingroup tests
+ * @brief no doc
+ * @test no doc.
+ */
+
+#include "linbox/linbox-config.h"
+#include "test-rank.h"
+#include "linbox/ring/modular/modular-unsigned.h"
+
+int main (int argc, char **argv)
+{
+
+ bool pass = true;
+
+ static size_t n = 20;
+ //static integer q = 65519; problem
+ //static integer q = 1009;
+ //static integer q = 1000003;
+ static integer q = 46337;
+ static int iterations = 1;
+ static double sparsity = 0.05;
+
+ static Argument args[] = {
+ { 'n', "-n N", "Set dimension of test matrices to NxN.", TYPE_INT, &n },
+ { 'q', "-q Q", "Operate over the \"field\" GF(Q) [1].", TYPE_INTEGER, &q },
+ { 'i', "-i I", "Perform each test for I iterations.", TYPE_INT, &iterations },
+ { 's', "-s S", "Sparse matrices with density S.", TYPE_DOUBLE, &sparsity },
+ END_OF_ARGUMENTS
+ };
+
+ parseArguments (argc, argv, args);
+
+ srand ((unsigned)time (NULL));
+ // srand48 ((unsigned)time (NULL));
+
+ commentator().start("Givaro::Modular<uint32_t,uint64_t> sparse rank test suite", "rank");
+ commentator().getMessageClass (INTERNAL_DESCRIPTION).setMaxDepth (3);
+ commentator().getMessageClass (INTERNAL_DESCRIPTION).setMaxDetailLevel (Commentator::LEVEL_NORMAL);
+
+ Givaro::Modular<uint32_t,uint64_t> F (q);
+ pass = pass && testSparseRank(F,n,n+1,(size_t)iterations,sparsity);
+ pass = pass && testSparseRank(F,LINBOX_USE_BLACKBOX_THRESHOLD+n,LINBOX_USE_BLACKBOX_THRESHOLD+n-1,(size_t)iterations,sparsity);
+
+
+ commentator().stop("Givaro::Modular<uint32_t,uint64_t> sparse rank test suite");
+ return pass ? 0 : -1;
+}
+
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/tests/test-rank.C b/tests/test-rank.C
deleted file mode 100644
index aa24470..0000000
--- a/tests/test-rank.C
+++ /dev/null
@@ -1,345 +0,0 @@
-
-
-/* tests/test-rank.C
- * Copyright (C) 2002 Bradford Hovinen
- *
- * Written by Bradford Hovinen <hovinen at cis.udel.edu>
- *
- * -----------------------------------------------------
- *
- * ========LICENCE========
- * This file is part of the library LinBox.
- *
- * LinBox is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- * ========LICENCE========
- */
-
-
-/*! @file tests/test-rank.C
- * @ingroup tests
- * @brief no doc
- * @test no doc.
- */
-
-
-
-#include "linbox/linbox-config.h"
-
-#include <iostream>
-#include <fstream>
-#include <vector>
-#include <cstdio>
-
-#include "linbox/util/commentator.h"
-#include "linbox/field/modular.h"
-#include "linbox/field/PID-integer.h"
-#include "linbox/field/gf2.h"
-#include "linbox/field/givaro.h"
-#include "linbox/blackbox/diagonal.h"
-#include "linbox/blackbox/sparse.h"
-#include "linbox/blackbox/scalar-matrix.h"
-#include "linbox/blackbox/direct-sum.h"
-#include "linbox/algorithms/gauss.h"
-#include "linbox/algorithms/gauss-gf2.h"
-#include "linbox/solutions/rank.h"
-
-#include "test-common.h"
-
-using namespace LinBox;
-
-// tests 1 and 2 were certain diagonals - now deemed unnecessary. -bds 2005Mar15
-/* Test 3: Rank of a random sparse matrix
- *
- * Constructs a random sparse matrix and computes its rank using Gaussian
- * elimination (direct and blas) and Wiedemann's algorithm. Checks that the results match.
- */
-
-
-template <class Field>
-bool testRankMethods(const Field &F, size_t n, unsigned int iterations, double sparsity = 0.05)
-{
- typedef SparseMatrix<Field,typename Vector<Field>::SparseSeq> Blackbox;
-
- commentator().start ("Testing elimination-based and blackbox rank", "testRankMethods", iterations);
-
- bool ret = true;
- unsigned int i;
-
- unsigned long rank_blackbox, rank_elimination, rank_hybrid;
- //unsigned long rank_Wiedemann, rank_elimination, rank_blas_elimination;
-
- typename Field::RandIter ri (F);
-
- for (i = 0; i < iterations; ++i) {
- commentator().startIteration (i);
-
- RandomSparseStream<Field, typename Vector<Field>::SparseSeq> stream (F, ri, sparsity, n, n);
- Blackbox A (F, stream);
-
- F.write( commentator().report (Commentator::LEVEL_NORMAL, INTERNAL_DESCRIPTION)) << endl;
- A.write( commentator().report (Commentator::LEVEL_NORMAL, INTERNAL_DESCRIPTION),FORMAT_MAPLE ) << endl;
-
- LinBox::rank (rank_blackbox, A, Method::Blackbox ());
- commentator().report (Commentator::LEVEL_IMPORTANT, INTERNAL_ERROR)
- << "blackbox rank " << rank_blackbox << endl;
- LinBox::rank (rank_elimination, A, Method::Elimination());
- if (rank_blackbox != rank_elimination) {
- commentator().report (Commentator::LEVEL_IMPORTANT, INTERNAL_ERROR)
- << "ERROR: blackbox rank != elimination rank " << rank_elimination << endl;
- ret = false;
- }
- LinBox::rank (rank_hybrid, A, Method::Hybrid());
- if (rank_blackbox != rank_hybrid) {
- commentator().report (Commentator::LEVEL_IMPORTANT, INTERNAL_ERROR)
- << "ERROR: blackbox rank != hybrid rank " << rank_hybrid << endl;
- ret = false;
- }
-
-#if 0 /* not working */
- rank (rank_Wiedemann, A, Method::Wiedemann ());
- //rank (rank_elimination, B, Method::SparseElimination());
- rank_elimination = rank_Wiedemann;
- rank (rank_blas_elimination, A, Method::BlasElimination ());
-
- commentator().report (Commentator::LEVEL_NORMAL, INTERNAL_DESCRIPTION)
- << "Rank computed by Wiedemann: " << rank_Wiedemann << endl
- << "Rank computed by sparse elimination: " << rank_elimination << endl
- << "Rank computed by blas_elimination: " << rank_blas_elimination << endl;
-
- if (rank_Wiedemann != rank_elimination || rank_elimination != rank_blas_elimination) {
- commentator().report (Commentator::LEVEL_IMPORTANT, INTERNAL_ERROR)
- << "ERROR: Ranks are not equal" << endl;
- ret = false;
- }
-#endif
-
- commentator().stop ("done");
- commentator().progress ();
- }
-
- commentator().stop (MSG_STATUS (ret), (const char *) 0, "testEliminationRank");
-
- return ret;
-}
-
-bool testRankMethodsGF2(const GF2& F2, size_t n, unsigned int iterations, double sparsity = 0.05)
-{
- typedef ZeroOne<GF2> Blackbox;
- typedef SparseMatrix<Modular<double>,Vector<Modular<double> >::SparseSeq> MdBlackbox;
- Modular<double> MdF2(2);
- GF2::Element one; Modular<double>::Element mdone;
- F2.init(one,true);
- MdF2.init(mdone,1UL);
-
-
- commentator().start ("Testing elimination-based and blackbox rank over GF2", "testRankMethodsGF2", iterations);
-
- bool ret = true;
- unsigned int i;
-
- unsigned long rank_blackbox, rank_elimination, rank_sparselimination, rank_sparse;
- //unsigned long rank_Wiedemann, rank_elimination, rank_blas_elimination;
-
- GF2::RandIter ri (F2);
-
- for (i = 0; i < iterations; ++i) {
- commentator().startIteration (i);
-
- Blackbox A(F2,n,n);
- MdBlackbox B(MdF2,n,n);
- for(size_t ii=0; ii<n;++ii) {
- for(size_t jj=0; jj<n; ++jj) {
- if (drand48()<sparsity) {
- A.setEntry(ii,jj,one);
- B.setEntry(ii,jj,mdone);
- }
- }
- }
-
- F2.write( commentator().report (Commentator::LEVEL_NORMAL, INTERNAL_DESCRIPTION)) << endl;
- B.write( commentator().report (Commentator::LEVEL_NORMAL, INTERNAL_DESCRIPTION),FORMAT_GUILLAUME ) << endl;
- A.write( commentator().report (Commentator::LEVEL_NORMAL, INTERNAL_DESCRIPTION),FORMAT_GUILLAUME ) << endl;
-
-
- LinBox::rank (rank_blackbox, A, Method::Blackbox ());
- commentator().report (Commentator::LEVEL_IMPORTANT, INTERNAL_ERROR)
- << "blackbox rank " << rank_blackbox << endl;
-
- LinBox::rank (rank_elimination, B, Method::BlasElimination());
- if (rank_blackbox != rank_elimination) {
- commentator().report (Commentator::LEVEL_IMPORTANT, INTERNAL_ERROR)
- << "ERROR: blackbox rank != BLAS elimination rank " << rank_elimination << endl;
- ret = false;
- }
-
- rankin (rank_sparselimination, A, Method::SparseElimination());
- if (rank_blackbox != rank_sparselimination) {
- commentator().report (Commentator::LEVEL_IMPORTANT, INTERNAL_ERROR)
- << "ERROR: blackbox rank != sparse elimination GF2 rank " << rank_elimination << endl;
- ret = false;
- }
-
-
- rankin (rank_sparse, B, Method::SparseElimination());
-
- if (rank_sparselimination != rank_sparse) {
- commentator().report (Commentator::LEVEL_IMPORTANT, INTERNAL_ERROR)
- << "ERROR: rank sparse elimination GF2 != sparse rank " << rank_sparse << endl;
- ret = false;
- }
-
- commentator().stop ("done");
- commentator().progress ();
- }
-
- commentator().stop (MSG_STATUS (ret), (const char *) 0, "testEliminationRank");
-
- return ret;
-}
-/* Test 4: Rank of zero and identity matrices by Wiedemann variants
- *
- */
-
-template <class Field>
-bool testZeroAndIdentRank (const Field &F, size_t n, unsigned int iterations)
-{
- typedef ScalarMatrix<Field> Blackbox;
-
- commentator().start ("Testing rank of zero and Identity and half/half matrices", "testZeroAndIdentRank", iterations);
-
- bool ret = true;
- unsigned int i;
-
- unsigned long r; // rank
-
- for (i = 0; i < iterations; ++i) {
- commentator().startIteration (i);
-
- typename Field::Element zero, one;
-
- F.init(zero, 0);
- Blackbox A (F, n, zero);
- LinBox::rank (r, A, Method::Wiedemann ());
- if (r != 0) {
- commentator().report (Commentator::LEVEL_IMPORTANT, INTERNAL_ERROR)
- << "ERROR: Wiedemann Rank of 0 is not 0, but is " << r << endl;
- ret = false;
- }
-
- F.init(one, 1);
- Blackbox I (F, n, one);
- LinBox::rank (r, I, Method::Wiedemann ());
- if (r != n) {
- commentator().report (Commentator::LEVEL_IMPORTANT, INTERNAL_ERROR)
- << "ERROR: Wiedemann Rank of I is " << r << ", should be " << n << endl;
- ret = false;
- }
-
- DirectSum<Blackbox> B(A, I);
- LinBox::rank (r, B, Method::Wiedemann ());
- if (r != n) {
- commentator().report (Commentator::LEVEL_IMPORTANT, INTERNAL_ERROR)
- << "ERROR: Wiedemann Rank of I+0 is " << r << ", should be " << n << endl;
- ret = false;
- }
-
- LinBox::rank (r, B, Method::Wiedemann(Method::Wiedemann::SYMMETRIC));
- if (r != n) {
- commentator().report (Commentator::LEVEL_IMPORTANT, INTERNAL_ERROR)
- << "ERROR: Symmetric Wiedemann Rank of I+0 is " << r << ", should be " << n << endl;
- ret = false;
- }
- commentator().stop ("done");
- commentator().progress ();
- }
-
- commentator().stop (MSG_STATUS (ret), (const char *) 0, "testZeroAndIdentRank");
-
- return ret;
-}
-
-int main (int argc, char **argv)
-{
-
-// commentator().setMaxDetailLevel( 100000 );
-// commentator().setMaxDepth( 100000 );
-
- bool pass = true;
-
- static size_t n = 40;
- static integer q = 65519U;
- //static integer q = 1000003U;
- static integer bigQ("12345678901234567890123456789012345678901234568119");
- static int iterations = 1;
- static double sparsity = 0.05;
-
- static Argument args[] = {
- { 'n', "-n N", "Set dimension of test matrices to NxN.", TYPE_INT, &n },
- { 'q', "-q Q", "Operate over the \"field\" GF(Q) [1].", TYPE_INTEGER, &q },
- { 'i', "-i I", "Perform each test for I iterations.", TYPE_INT, &iterations },
- { 's', "-s S", "Sparse matrices with density S.", TYPE_DOUBLE, &sparsity },
- END_OF_ARGUMENTS
- };
-
- parseArguments (argc, argv, args);
-
- srand ((unsigned)time (NULL));
- // srand48 ((unsigned)time (NULL));
-
- commentator().start("rank solution test suite", "rank");
- commentator().getMessageClass (INTERNAL_DESCRIPTION).setMaxDepth (3);
- commentator().getMessageClass (INTERNAL_DESCRIPTION).setMaxDetailLevel (Commentator::LEVEL_NORMAL);
-
- commentator().report (Commentator::LEVEL_NORMAL, INTERNAL_DESCRIPTION)
- << "over Modular<uint32_t>" << endl;
- Modular<uint32_t> F (q);
- if (!testRankMethods (F, n, iterations, sparsity)) pass = false;
- if (!testZeroAndIdentRank (F, n, 1)) pass = false;
-
- commentator().report (Commentator::LEVEL_NORMAL, INTERNAL_DESCRIPTION)
- << "over Modular<int>" << endl;
- Modular<double> G (q);
- if (!testRankMethods (G, n, iterations, sparsity)) pass = false;
- if (!testZeroAndIdentRank (G, n, 1)) pass = false;
-
- commentator().report (Commentator::LEVEL_NORMAL, INTERNAL_DESCRIPTION)
- << "over PID_integer" << endl;
- PID_integer R;
- if (!testRankMethods (R, n, iterations, sparsity)) pass = false;
-
- commentator().report (Commentator::LEVEL_NORMAL, INTERNAL_DESCRIPTION)
- << "over GivaroZpz<Integer>" << endl;
- GivaroZpz<Integer> Gq(bigQ);
- if (!testRankMethods (Gq, n, iterations, sparsity)) pass = false;
- if (!testZeroAndIdentRank (Gq, n, 1)) pass = false;
-
- commentator().report (Commentator::LEVEL_NORMAL, INTERNAL_DESCRIPTION)
- << "over GF2" << endl;
- GF2 F2;
- if (!testRankMethodsGF2 (F2, n, iterations, sparsity)) pass = false;
-
-
- commentator().stop("rank solution test suite");
- return pass ? 0 : -1;
-}
-
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
-// Local Variables:
-// mode: C++
-// tab-width: 8
-// indent-tabs-mode: nil
-// c-basic-offset: 8
-// End:
-
diff --git a/tests/test-rank.h b/tests/test-rank.h
new file mode 100644
index 0000000..74def8c
--- /dev/null
+++ b/tests/test-rank.h
@@ -0,0 +1,384 @@
+/* tests/test-rank.h
+ * Time-stamp: <08 Aug 14 07:36:49 Jean-Guillaume.Dumas at imag.fr>
+ * -----------------------------------------------------
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ * ========LICENCE========
+ */
+
+
+/*! @file tests/test-rank.h
+ * @ingroup tests
+ * @brief no doc
+ * @test
+bool testSparseRank(const Field &F, const size_t & n, size_t m, const size_t & iterations, const double & sparsity)
+ * @test
+bool testRankMethods(const typename BlackBox::Field & F, size_t n, size_t m, unsigned int iterations, double sparsity = 0.05)
+ * @test
+//bool testRankMethodsGF2(const GF2& F2, size_t n, unsigned int iterations, double sparsity = 0.05)
+ * @test
+bool testZeroAndIdentRank (const Field &F, size_t n, unsigned int iterations = 1)
+ */
+
+
+
+#include "linbox/linbox-config.h"
+
+#define LINBOX_USE_BLACKBOX_THRESHOLD 100
+#define LINBOX_COO_TRANSPOSE 100 /* this is supposed to be triggerd half the time */
+#define LINBOX_CSR_TRANSPOSE 100 /* this is supposed to be triggerd half the time */
+#define LINBOX_ELL_TRANSPOSE 100 /* this is supposed to be triggerd half the time */
+#define LINBOX_ELLR_TRANSPOSE 100 /* this is supposed to be triggerd half the time */
+
+#include <iostream>
+#include <fstream>
+#include <cstdio>
+#include <givaro/modular.h>
+
+#include "linbox/util/commentator.h"
+#include "linbox/ring/modular.h"
+#include "linbox/field/gf2.h"
+#include "linbox/blackbox/diagonal.h"
+#include "linbox/matrix/sparse-matrix.h"
+#include "linbox/blackbox/scalar-matrix.h"
+#include "linbox/blackbox/direct-sum.h"
+#include "linbox/algorithms/gauss.h"
+#include "linbox/algorithms/gauss-gf2.h"
+#include "linbox/solutions/rank.h"
+
+#include "test-common.h"
+
+using namespace LinBox;
+
+
+// tests 1 and 2 were certain diagonals - now deemed unnecessary. -bds 2005Mar15
+
+/* Test 3: Rank of a random sparse matrix
+ *
+ * Constructs a random sparse matrix and computes its rank using Gaussian
+ * elimination (direct and blas) and Wiedemann's algorithm. Checks that the results match.
+ */
+template <class BlackBox>
+bool testRankMethods(const typename BlackBox::Field & F, size_t n, size_t m, unsigned int iterations, double sparsity = 0.05)
+{
+ typedef typename BlackBox::Field Field ;
+ commentator().start ("Testing elimination-based and blackbox rank", "testRankMethods", (unsigned int)iterations);
+
+ bool ret = true, equalRank = true;
+ unsigned int i;
+
+ unsigned long rank_blackbox, rank_elimination;
+
+ typename Field::RandIter ri (F);
+
+ for (i = 0; i < iterations; ++i) {
+ commentator().startIteration (i);
+
+ RandomSparseStream<Field, typename BlackBox::Row> stream (F, ri, sparsity, n, m);
+ BlackBox A (F, stream);
+ // std::cout << A.rowdim() << ',' << A.coldim() << std::endl;
+
+ A.write( commentator().report (Commentator::LEVEL_NORMAL, INTERNAL_DESCRIPTION) << endl, Tag::FileFormat::Maple ) << endl;
+
+
+ Method::Elimination ME; // will this be sparse elim?
+ LinBox::rank (rank_elimination, A, ME);
+ commentator().report ()
+ << endl << "elimination rank " << rank_elimination << endl;
+
+#if 1
+ Method::Blackbox MB;
+ LinBox::rank (rank_blackbox, A, MB);
+ commentator().report ()//Commentator::LEVEL_IMPORTANT, INTERNAL_ERROR)
+ << endl << "blackbox rank " << rank_blackbox << endl;
+ equalRank = equalRank and rank_blackbox == rank_elimination;
+#endif
+
+#if 0
+ Method::Hybrid MH;
+ LinBox::rank (rank_hybrid, A, MH);
+ commentator().report (Commentator::LEVEL_IMPORTANT, INTERNAL_ERROR)
+ << "hybrid rank " << rank_hybrid << endl;
+ equalRank = equalRank and rank_hybrid == rank_elimination;
+#endif
+#if 0
+ unsigned long rank_Wiedemann;
+ Method::Wiedemann MW; // rank soln needs fixing for this.
+ LinBox::rank (rank_Wiedemann, A, MW);
+ commentator().report (Commentator::LEVEL_IMPORTANT, INTERNAL_ERROR)
+ << "Wiedemann rank " << rank_Wiedemann << endl;
+ equalRank = equalRank and rank_Wiedemann == rank_elimination;
+#endif
+
+ unsigned long rank_blas_elimination ;
+ if (F.characteristic() < LinBox::BlasBound
+ and
+ F.characteristic() == F.cardinality()
+ and
+ numeric_limits<typename Field::Element>::is_signed
+ )
+ {
+ Method::BlasElimination MBE;
+ LinBox::rank (rank_blas_elimination, A, MBE);
+ commentator().report ()//Commentator::LEVEL_NORMAL, INTERNAL_DESCRIPTION)
+ << endl << "Blas elimination rank " << rank_blas_elimination << endl;
+ equalRank = equalRank and rank_blas_elimination == rank_elimination;
+ }
+
+
+ if ( not equalRank )
+ {
+ commentator().report ()//Commentator::LEVEL_IMPORTANT, INTERNAL_ERROR)
+ << "ERROR: Ranks are not equal" << endl;
+ ret = false;
+ }
+
+ commentator().stop ("done");
+ commentator().progress ();
+ }
+
+ commentator().stop (MSG_STATUS (ret), (const char *) 0, "testEliminationRank");
+
+ return ret;
+}
+
+// this test just doesn't work/compile
+#if 0
+bool testRankMethodsGF2(const GF2& F2, size_t n, unsigned int iterations, double sparsity = 0.05)
+{
+ typedef ZeroOne<GF2> Blackbox;
+ typedef SparseMatrix<Givaro::Modular<double>,Vector<Givaro::Modular<double> >::SparseSeq> MdBlackbox;
+ Givaro::Modular<double> MdF2(2);
+ GF2::Element one; Givaro::Modular<double>::Element mdone;
+ MdF2.assign(mdone,MdF2.one);
+
+
+ commentator().start ("Testing elimination-based and blackbox rank over GF2", "testRankMethodsGF2", (unsigned int)iterations);
+
+ bool ret = true;
+ unsigned int i;
+
+ unsigned long rank_blackbox, rank_elimination, rank_sparselimination, rank_sparse;
+
+ GF2::RandIter ri (F2);
+
+ for (i = 0; i < iterations; ++i) {
+ commentator().startIteration (i);
+
+ Blackbox A(F2,n,n);
+ MdBlackbox B(MdF2,n,n);
+ for(size_t ii=0; ii<n;++ii) {
+ for(size_t jj=0; jj<n; ++jj) {
+ if (drand48()<sparsity) {
+ A.setEntry(ii,jj,F2.one);
+ B.setEntry(ii,jj,mdone);
+ }
+ }
+ }
+
+ F2.write( commentator().report (Commentator::LEVEL_NORMAL, INTERNAL_DESCRIPTION)) << endl;
+ B.write( commentator().report (Commentator::LEVEL_NORMAL, INTERNAL_DESCRIPTION),Tag::FileFormat::Guillaume ) << endl;
+ A.write( commentator().report (Commentator::LEVEL_NORMAL, INTERNAL_DESCRIPTION),Tag::FileFormat::Guillaume ) << endl;
+
+
+ LinBox::rank (rank_blackbox, A, Method::Blackbox ());
+ commentator().report (Commentator::LEVEL_IMPORTANT, INTERNAL_ERROR)
+ << "blackbox rank " << rank_blackbox << endl;
+
+ LinBox::rank (rank_elimination, B, Method::BlasElimination());
+ if (rank_blackbox != rank_elimination) {
+ commentator().report (Commentator::LEVEL_IMPORTANT, INTERNAL_ERROR)
+ << "ERROR: blackbox rank != BLAS elimination rank " << rank_elimination << endl;
+ ret = false;
+ }
+
+ rankin (rank_sparselimination, A, Method::SparseElimination());
+ if (rank_blackbox != rank_sparselimination) {
+ commentator().report (Commentator::LEVEL_IMPORTANT, INTERNAL_ERROR)
+ << "ERROR: blackbox rank != sparse elimination GF2 rank " << rank_elimination << endl;
+ ret = false;
+ }
+
+
+ rankin (rank_sparse, B, Method::SparseElimination());
+
+ if (rank_sparselimination != rank_sparse) {
+ commentator().report (Commentator::LEVEL_IMPORTANT, INTERNAL_ERROR)
+ << "ERROR: rank sparse elimination GF2 != sparse rank " << rank_sparse << endl;
+ ret = false;
+ }
+
+ commentator().stop ("done");
+ commentator().progress ();
+ }
+
+ commentator().stop (MSG_STATUS (ret), (const char *) 0, "testEliminationRank");
+
+ return ret;
+}
+#endif
+
+/* Test 4: Rank of zero and identity matrices by Wiedemann variants
+ *
+ */
+template <class Field>
+bool testZeroAndIdentRank (const Field &F, size_t n, unsigned int iterations = 1)
+{
+ typedef ScalarMatrix<Field> Blackbox;
+
+ commentator().start ("Testing rank of zero and Identity and half/half matrices", "testZeroAndIdentRank", (unsigned int)iterations);
+
+ bool ret = true;
+ unsigned int i;
+
+ unsigned long r; // rank
+
+ for (i = 0; i < iterations; ++i) {
+ commentator().startIteration (i);
+
+
+ Blackbox A (F, n, n, F.zero);
+ Method::Wiedemann MW;
+ LinBox::rank (r, A, MW);
+ if (r != 0) {
+ commentator().report (Commentator::LEVEL_IMPORTANT, INTERNAL_ERROR)
+ << "ERROR: Wiedemann Rank of 0 is not 0, but is " << r << endl;
+ ret = false;
+ }
+
+ Blackbox I (F, n, n, F.one);
+// LinBox::rank (r, I, MW);
+r = n;
+ if (r != n) {
+ commentator().report (Commentator::LEVEL_IMPORTANT, INTERNAL_ERROR)
+ << "ERROR: Wiedemann Rank of I is " << r << ", should be " << n << endl;
+ ret = false;
+ }
+
+ DirectSum<Blackbox> B(A, I);
+// LinBox::rank (r, B, MW);
+r = n;
+ if (r != n) {
+ commentator().report (Commentator::LEVEL_IMPORTANT, INTERNAL_ERROR)
+ << "ERROR: Wiedemann Rank of I+0 is " << r << ", should be " << n << endl;
+ ret = false;
+ }
+
+ Method::Wiedemann MWS(Method::Wiedemann::SYMMETRIC);
+// LinBox::rank (r, B, MWS);
+r = n;
+ if (r != n) {
+ commentator().report (Commentator::LEVEL_IMPORTANT, INTERNAL_ERROR)
+ << "ERROR: Symmetric Wiedemann Rank of I+0 is " << r << ", should be " << n << endl;
+ ret = false;
+ }
+ commentator().stop ("done");
+ commentator().progress ();
+ }
+
+ commentator().stop (MSG_STATUS (ret), (const char *) 0, "testZeroAndIdentRank");
+
+ return ret;
+}
+
+// Test the rank methods on each of several storage schemes for sparse matrices.
+template <class Field>
+bool testSparseRank(const Field &F, const size_t & n, size_t m, const size_t & iterations, const double & sparsity)
+{
+ bool pass = true ;
+#if 0 //
+ {
+ commentator().report() << "SparseSeq " << endl;
+ typedef SparseMatrix<Field,SparseMatrixFormat::SparseSeq > Blackbox;
+ if (!testRankMethods<Blackbox> (F, n, m, (unsigned int)iterations, sparsity)) pass = false;
+ }
+ {
+ commentator().report() << "SparsePar " << endl;
+ typedef SparseMatrix<Field,SparseMatrixFormat::SparsePar > Blackbox;
+ if (!testRankMethods<Blackbox> (F, n, m, (unsigned int)iterations, sparsity)) pass = false;
+ }
+#endif //
+#if 0
+ {
+ commentator().report() << "SparseMap " << endl;
+ typedef SparseMatrix<Field,SparseMatrixFormat::SparseMap > Blackbox;
+ typedef Protected::SparseMatrixGeneric<Field,typename Vector<Field>::SparseMap > Blackbox;
+ if (!testRankMethods<Blackbox> (F, n, m, (unsigned int)iterations, sparsity)) pass = false;
+ }
+#endif
+#if 0 //
+ {
+ commentator().report() << "COO " << endl;
+ typedef SparseMatrix<Field,SparseMatrixFormat::COO> Blackbox;
+ if (!testRankMethods<Blackbox> (F, n, m, (unsigned int)iterations, sparsity)) pass = false;
+ }
+#endif //
+#if 1 //
+ {
+ commentator().report() << "CSR " << endl;
+ typedef SparseMatrix<Field,SparseMatrixFormat::CSR> Blackbox; // inf loop
+ if (!testRankMethods<Blackbox> (F, n, m, (unsigned int)iterations, sparsity)) pass = false;
+ }
+#endif //
+#if 0 //
+ {
+ commentator().report() << "ELL " << endl;
+ typedef SparseMatrix<Field,SparseMatrixFormat::ELL> Blackbox;
+ if (!testRankMethods<Blackbox> (F, n, m, (unsigned int)iterations, sparsity)) pass = false;
+ }
+#endif //
+#if 0
+ {
+ commentator().report() << "ELL_R " << endl;
+ typedef SparseMatrix<Field,SparseMatrixFormat::ELL_R> Blackbox;
+ if (!testRankMethods<Blackbox> (F, n, m, (unsigned int)iterations, sparsity)) pass = false;
+ }
+#endif
+#if 0
+ {
+ commentator().report() << "HYB " << endl;
+ typedef SparseMatrix<Field,SparseMatrixFormat::HYB> Blackbox;
+ if (!testRankMethods<Blackbox> (F, n, m, (unsigned int)iterations, sparsity)) pass = false;
+ }
+#endif
+#if 0
+ {
+ commentator().report() << "TPL " << endl;
+ typedef SparseMatrix<Field,SparseMatrixFormat::TPL> Blackbox;
+ if (!testRankMethods<Blackbox> (F, n, m, (unsigned int)iterations, sparsity)) pass = false;
+ }
+#endif
+
+
+#if 0 //
+ commentator().report() << "Scalar mats " << endl;
+ if (!testZeroAndIdentRank (F, n, 1)) pass = false;
+#endif //
+
+ return pass ;
+
+
+}
+
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/tests/test-rat-charpoly.C b/tests/test-rat-charpoly.C
index d4ce026..06c3b91 100644
--- a/tests/test-rat-charpoly.C
+++ b/tests/test-rat-charpoly.C
@@ -6,20 +6,20 @@
*
* --------------------------------------------------------
*
- *
+ *
* ========LICENCE========
* This file is part of the library LinBox.
- *
+ *
* LinBox is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
- *
+ *
* This library 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
* Lesser General Public License for more details.
- *
+ *
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
@@ -40,11 +40,11 @@
#include <iostream>
#include <fstream>
-#include <vector>
+
#include <cstdio>
#include "linbox/util/commentator.h"
-#include "linbox/blackbox/sparse.h"
+#include "linbox/matrix/sparse-matrix.h"
#include "linbox/solutions/charpoly.h"
#include "test-common.h"
@@ -62,7 +62,7 @@ using namespace LinBox;
static bool testDiagRatCharpoly (size_t n, int iterations)
{
- commentator().start ("Testing rational charpoly of diagonal matrix ", "testNonsingularRatIntSolve", iterations);
+ commentator().start ("Testing rational charpoly of diagonal matrix ", "testNonsingularRatIntSolve", (unsigned int)iterations);
bool ret = true;
int i;
@@ -71,7 +71,7 @@ static bool testDiagRatCharpoly (size_t n, int iterations)
GMPRationalField Q;
SparseMatrix<GMPRationalField > A(Q,n,n);
BlasMatrix <GMPRationalField > B(Q,n,n);
- std::vector<GMPRationalField::Element> c;
+ BlasVector<GMPRationalField> c(Q);
for (i=0; i < iterations; i++) {
GMPRationalField::Element c0,cn;
@@ -79,7 +79,7 @@ static bool testDiagRatCharpoly (size_t n, int iterations)
Q.init(cn,0,1);
- commentator().startIteration (i);
+ commentator().startIteration ((unsigned int)i);
for (j=0; j < n; ++j) {
integer tmp_n, tmp_d;
@@ -153,11 +153,10 @@ int main (int argc, char **argv)
return pass ? 0 : -1;
}
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
// Local Variables:
// mode: C++
// tab-width: 8
// indent-tabs-mode: nil
// c-basic-offset: 8
// End:
-
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/tests/test-rat-minpoly.C b/tests/test-rat-minpoly.C
index e014fc9..155699d 100644
--- a/tests/test-rat-minpoly.C
+++ b/tests/test-rat-minpoly.C
@@ -6,20 +6,20 @@
*
* --------------------------------------------------------
*
- *
+ *
* ========LICENCE========
* This file is part of the library LinBox.
- *
+ *
* LinBox is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
- *
+ *
* This library 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
* Lesser General Public License for more details.
- *
+ *
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
@@ -35,16 +35,21 @@
*/
+#ifdef HAVE_CXX11
+#include <stdexcept>
+#include <type_traits>
+#endif
+
#include "linbox/linbox-config.h"
#include <iostream>
#include <fstream>
-#include <vector>
+
#include <cstdio>
#include "linbox/util/commentator.h"
-#include "linbox/blackbox/sparse.h"
+#include "linbox/matrix/sparse-matrix.h"
#include "linbox/solutions/charpoly.h"
#include "test-common.h"
@@ -60,7 +65,7 @@ using namespace LinBox;
* Return true on success and false on failure
*/
-static bool testDiagRatCharpoly (size_t n, int iterations)
+static bool testDiagRatCharpoly (size_t n, unsigned int iterations)
{
commentator().start ("Testing rational charpoly of diagonal matrix ", "testNonsingularRatIntSolve", iterations);
@@ -71,14 +76,14 @@ static bool testDiagRatCharpoly (size_t n, int iterations)
GMPRationalField Q;
SparseMatrix<GMPRationalField > A(Q,n,n);
BlasMatrix <GMPRationalField > B(Q,n,n);
- std::vector<GMPRationalField::Element> c;
+ BlasVector<GMPRationalField> c(Q);
- for (i=0; i < iterations; i++) {
+ for (i=0; i < (int)iterations; i++) {
GMPRationalField::Element c0,cn;
Q.init(c0,1,1);
Q.init(cn,0,1);
- commentator().startIteration (i);
+ commentator().startIteration ((unsigned int)i);
size_t k = (size_t)ceil((double)n/2);
for (j=0; j < k; ++j) {
@@ -135,7 +140,7 @@ int main (int argc, char **argv)
bool pass = true;
static size_t n = 10;
- static int iterations = 2;
+ static unsigned int iterations = 2;
static Argument args[] = {
{ 'n', "-n N", "Set column dimension of test matrices to N.", TYPE_INT, &n },
diff --git a/tests/test-rat-solve.C b/tests/test-rat-solve.C
index 1d607c1..a825dcf 100644
--- a/tests/test-rat-solve.C
+++ b/tests/test-rat-solve.C
@@ -6,20 +6,20 @@
*
* --------------------------------------------------------
*
- *
+ *
* ========LICENCE========
* This file is part of the library LinBox.
- *
+ *
* LinBox is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
- *
+ *
* This library 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
* Lesser General Public License for more details.
- *
+ *
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
@@ -40,11 +40,11 @@
#include <iostream>
#include <fstream>
-#include <vector>
+
#include <cstdio>
#include "linbox/util/commentator.h"
-#include "linbox/blackbox/sparse.h"
+#include "linbox/matrix/sparse-matrix.h"
#include "linbox/solutions/solve.h"
#include "test-common.h"
@@ -59,7 +59,7 @@ using namespace LinBox;
* Return true on success and false on failure
*/
-static bool testNonsingularRatIntSolve (size_t n, int iterations)
+static bool testNonsingularRatIntSolve (size_t n, unsigned int iterations)
{
commentator().start ("Testing nonsingular solve with integer vector", "testNonsingularRatIntSolve", iterations);
@@ -70,12 +70,12 @@ static bool testNonsingularRatIntSolve (size_t n, int iterations)
GMPRationalField Q;
SparseMatrix<GMPRationalField > A(Q,n,n);
- PID_integer Z;
- std::vector<PID_integer::Element> b(n);
- std::vector<GMPRationalField::Element> true_x(n),x(n);
+ Givaro::ZRing<Integer> Z;
+ BlasVector<Givaro::ZRing<Integer> > b(Z,n);
+ BlasVector<GMPRationalField> true_x(Q,n),x(Q,n);
- for (i=0; i < iterations; i++) {
- commentator().startIteration (i);
+ for (i=0; i < (int)iterations; i++) {
+ commentator().startIteration ((unsigned int)i);
for (j=0; j < n; ++j) {
integer tmp_n, tmp_d, tmp_b;
@@ -116,7 +116,7 @@ static bool testNonsingularRatIntSolve (size_t n, int iterations)
* Return true on success and false on failure
*/
-static bool testNonsingularRatRatSolve (size_t n, int iterations)
+static bool testNonsingularRatRatSolve (size_t n, unsigned int iterations)
{
commentator().start ("Testing nonsingular solve with rational vector", "testNonsingularRatRatSolve", iterations);
@@ -127,12 +127,12 @@ static bool testNonsingularRatRatSolve (size_t n, int iterations)
GMPRationalField Q;
SparseMatrix<GMPRationalField > A(Q,n,n);
- PID_integer Z;
- std::vector<GMPRationalField::Element> b(n);
- std::vector<GMPRationalField::Element> true_x(n),x(n);
+ Givaro::ZRing<Integer> Z;
+ BlasVector<GMPRationalField> b(Q,n);
+ BlasVector<GMPRationalField> true_x(Q,n),x(Q,n);
- for (i=0; i < iterations; i++) {
- commentator().startIteration (i);
+ for (i=0; i < (int)iterations; i++) {
+ commentator().startIteration ((unsigned int)i);
for (j=0; j < n; ++j) {
integer tmp_n, tmp_d, tmp_bn, tmp_bd;
@@ -179,7 +179,7 @@ int main (int argc, char **argv)
bool pass = true;
static size_t n = 10;
- static int iterations = 1;
+ static unsigned int iterations = 1;
static Argument args[] = {
{ 'n', "-n N", "Set column dimension of test matrices to N.", TYPE_INT, &n },
@@ -206,11 +206,10 @@ int main (int argc, char **argv)
return pass ? 0 : -1;
}
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
// Local Variables:
// mode: C++
// tab-width: 8
// indent-tabs-mode: nil
// c-basic-offset: 8
// End:
-
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/tests/test-rational-matrix-factory.C b/tests/test-rational-matrix-factory.C
index 8c59a64..6e1b327 100644
--- a/tests/test-rational-matrix-factory.C
+++ b/tests/test-rational-matrix-factory.C
@@ -34,17 +34,19 @@
*/
+#include <linbox/linbox-config.h>
+
#include <iostream>
#include <fstream>
-#include <vector>
+
#include <cstdio>
#include "linbox/linbox-config.h"
#include "linbox/util/commentator.h"
-#include "linbox/field/PID-integer.h"
+#include "givaro/zring.h"
#include "linbox/field/gmp-rational.h"
-#include "linbox/matrix/blas-matrix.h"
+#include "linbox/matrix/dense-matrix.h"
#include "linbox/blackbox/rational-matrix-factory.h"
#include "test-common.h"
@@ -84,7 +86,7 @@ static bool testDiagonalMatrix (size_t n)
lcm(lcm_n,lcm_n,j+1);
}
- RationalMatrixFactory<PID_integer, GMPRationalField, BlasMatrix<GMPRationalField > > FA(&A);
+ RationalMatrixFactory<Givaro::ZRing<Integer>, GMPRationalField, BlasMatrix<GMPRationalField > > FA(&A);
integer ratnorm,aprimnorm,atildenorm;
FA.getNorms(ratnorm,aprimnorm,atildenorm);
@@ -144,9 +146,9 @@ static bool testDiagonalMatrix (size_t n)
}
}
- PID_integer Z;
- BlasMatrix<PID_integer> Aprim(Z,n,n);
- BlasMatrix<PID_integer> Atilde(Z,n,n);
+ Givaro::ZRing<Integer> Z;
+ BlasMatrix<Givaro::ZRing<Integer> > Aprim(Z,n,n);
+ BlasMatrix<Givaro::ZRing<Integer> > Atilde(Z,n,n);
FA.makeAprim(Aprim);
FA.makeAtilde(Atilde);
diff --git a/tests/test-rational-reconstruction-base.C b/tests/test-rational-reconstruction-base.C
index eab7772..ba946c3 100644
--- a/tests/test-rational-reconstruction-base.C
+++ b/tests/test-rational-reconstruction-base.C
@@ -6,20 +6,20 @@
*
* --------------------------------------------------------
*
- *
+ *
* ========LICENCE========
* This file is part of the library LinBox.
- *
+ *
* LinBox is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
- *
+ *
* This library 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
* Lesser General Public License for more details.
- *
+ *
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
@@ -39,15 +39,14 @@
#include <iostream>
#include <fstream>
-#include <vector>
+
#include <cstdio>
#include "linbox/linbox-config.h"
#include "linbox/util/commentator.h"
-#include "linbox/field/modular.h"
-#include "linbox/field/PID-integer.h"
-#include "linbox/field/gmp-rational.h"
+#include "linbox/ring/modular.h"
+//#include "linbox/field/gmp-rational.h"
#include "linbox/algorithms/rational-cra2.h"
#include "linbox/algorithms/varprec-cra-early-single.h"
@@ -88,7 +87,7 @@ struct ModularFraction {
static bool testRandomFraction (size_t n, size_t d, int iterations)
{
- commentator().start ("Testing rational reconstruction on random fractions", "testRandFrac", iterations);
+ commentator().start ("Testing rational reconstruction on random fractions", "testRandFrac", (unsigned int)iterations);
bool ret = true;
// bool done;
@@ -98,7 +97,7 @@ static bool testRandomFraction (size_t n, size_t d, int iterations)
integer num,den;
for (i = 0; i < iterations; i++) {
- commentator().startIteration (i);
+ commentator().startIteration ((unsigned int)i);
integer::nonzerorandom(num, n);
integer::nonzerorandom(den, d);
@@ -112,20 +111,20 @@ static bool testRandomFraction (size_t n, size_t d, int iterations)
ModularFraction iteration(num,den);
int bits = 26;
- RandomPrimeIterator genprime( bits);
+ RandomPrimeIterator genprime((unsigned int) bits);
- PID_integer Z;
- ClassicRationalReconstruction<PID_integer> RRB1(Z,false,false);
- ClassicMaxQRationalReconstruction<PID_integer> RRB2(Z,false,false);
+ Givaro::ZRing<Integer> Z;
+ ClassicRationalReconstruction<Givaro::ZRing<Integer> > RRB1(Z,false,false);
+ ClassicMaxQRationalReconstruction<Givaro::ZRing<Integer> > RRB2(Z,false,false);
integer a1_1, b1_1, a2_1, b2_1, a3_1, b3_1, a4_1, b4_1;
integer a1_2, b1_2, a2_2, b2_2, a3_2, b3_2, a4_2, b4_2;
integer a1_3, b1_3, a2_3, b2_3, a3_3, b3_3, a4_3, b4_3;
integer a1_4, b1_4, a2_4, b2_4, a3_4, b3_4, a4_4, b4_4;
- RReconstruction<PID_integer, FastRationalReconstruction<PID_integer> > RR1_1(Z,INCREMENTAL,5);
- RationalRemainder2< VarPrecEarlySingleCRA< Modular<double> >,
- RReconstruction<PID_integer, FastRationalReconstruction<PID_integer> > > cra1_1(4UL, RR1_1);
+ RReconstruction<Givaro::ZRing<Integer>, FastRationalReconstruction<Givaro::ZRing<Integer> > > RR1_1(Z,INCREMENTAL,5);
+ RationalRemainder2< VarPrecEarlySingleCRA< Givaro::Modular<double> >,
+ RReconstruction<Givaro::ZRing<Integer>, FastRationalReconstruction<Givaro::ZRing<Integer> > > > cra1_1(4UL, RR1_1);
cra1_1(a1_1,b1_1,iteration,genprime);
if ((a1_1 != num) || (b1_1 != den) ) {
ret = false;
@@ -133,9 +132,9 @@ static bool testRandomFraction (size_t n, size_t d, int iterations)
<< "ERROR: rational reconstruction (Wang, incremental, fast) failed" << endl;
}
- RReconstruction<PID_integer, FastMaxQRationalReconstruction<PID_integer> > RR2_1(Z,INCREMENTAL,5);
- RationalRemainder2< VarPrecEarlySingleCRA< Modular<double> >,
- RReconstruction<PID_integer, FastMaxQRationalReconstruction<PID_integer> > > cra2_1(4UL, RR2_1);
+ RReconstruction<Givaro::ZRing<Integer>, FastMaxQRationalReconstruction<Givaro::ZRing<Integer> > > RR2_1(Z,INCREMENTAL,5);
+ RationalRemainder2< VarPrecEarlySingleCRA< Givaro::Modular<double> >,
+ RReconstruction<Givaro::ZRing<Integer>, FastMaxQRationalReconstruction<Givaro::ZRing<Integer> > > > cra2_1(4UL, RR2_1);
cra2_1(a2_1,b2_1,iteration,genprime);
if ((a2_1 != num) || (b2_1 != den) ) {
ret = false;
@@ -143,9 +142,9 @@ static bool testRandomFraction (size_t n, size_t d, int iterations)
<< "ERROR: rational reconstruction (MaxQ, incremental, fast) failed" << endl;
}
- RReconstruction<PID_integer, ClassicRationalReconstruction<PID_integer> > RR3_1(RRB1,INCREMENTAL,5);
- RationalRemainder2< VarPrecEarlySingleCRA< Modular<double> >,
- RReconstruction<PID_integer, ClassicRationalReconstruction<PID_integer> > > cra3_1(4UL, RR3_1);
+ RReconstruction<Givaro::ZRing<Integer>, ClassicRationalReconstruction<Givaro::ZRing<Integer> > > RR3_1(RRB1,INCREMENTAL,5);
+ RationalRemainder2< VarPrecEarlySingleCRA< Givaro::Modular<double> >,
+ RReconstruction<Givaro::ZRing<Integer>, ClassicRationalReconstruction<Givaro::ZRing<Integer> > > > cra3_1(4UL, RR3_1);
cra3_1(a3_1,b3_1,iteration,genprime);
if ((a3_1 != num) || (b3_1 != den) ) {
ret = false;
@@ -153,9 +152,9 @@ static bool testRandomFraction (size_t n, size_t d, int iterations)
<< "ERROR: rational reconstruction (Wang, incremental, classic) failed" << endl;
}
- RReconstruction<PID_integer, ClassicMaxQRationalReconstruction<PID_integer> > RR4_1(RRB2,INCREMENTAL,5);
- RationalRemainder2< VarPrecEarlySingleCRA< Modular<double> >,
- RReconstruction<PID_integer, ClassicMaxQRationalReconstruction<PID_integer> > > cra4_1(4UL, RR4_1);
+ RReconstruction<Givaro::ZRing<Integer>, ClassicMaxQRationalReconstruction<Givaro::ZRing<Integer> > > RR4_1(RRB2,INCREMENTAL,5);
+ RationalRemainder2< VarPrecEarlySingleCRA< Givaro::Modular<double> >,
+ RReconstruction<Givaro::ZRing<Integer>, ClassicMaxQRationalReconstruction<Givaro::ZRing<Integer> > > > cra4_1(4UL, RR4_1);
cra4_1(a4_1,b4_1,iteration,genprime);
if ((a4_1 != num) || (b4_1 != den) ) {
ret = false;
@@ -163,9 +162,9 @@ static bool testRandomFraction (size_t n, size_t d, int iterations)
<< "ERROR: rational reconstruction (MaxQ, incremental, classic) failed" << endl;
}
- RReconstruction<PID_integer, FastRationalReconstruction<PID_integer> > RR1_2(Z,QUADRATIC,0,10);
- RationalRemainder2< VarPrecEarlySingleCRA< Modular<double> >,
- RReconstruction<PID_integer, FastRationalReconstruction<PID_integer> > > cra1_2(4UL, RR1_2);
+ RReconstruction<Givaro::ZRing<Integer>, FastRationalReconstruction<Givaro::ZRing<Integer> > > RR1_2(Z,QUADRATIC,0,10);
+ RationalRemainder2< VarPrecEarlySingleCRA< Givaro::Modular<double> >,
+ RReconstruction<Givaro::ZRing<Integer>, FastRationalReconstruction<Givaro::ZRing<Integer> > > > cra1_2(4UL, RR1_2);
cra1_2(a1_2,b1_2,iteration,genprime);
if ((a1_2 != num) || (b1_2 != den) ) {
ret = false;
@@ -173,9 +172,9 @@ static bool testRandomFraction (size_t n, size_t d, int iterations)
<< "ERROR: rational reconstruction (Wang, quadratic, fast) failed" << endl;
}
- RReconstruction<PID_integer, FastMaxQRationalReconstruction<PID_integer> > RR2_2(Z,QUADRATIC,0,10);
- RationalRemainder2< VarPrecEarlySingleCRA< Modular<double> >,
- RReconstruction<PID_integer, FastMaxQRationalReconstruction<PID_integer> > > cra2_2(4UL, RR2_2);
+ RReconstruction<Givaro::ZRing<Integer>, FastMaxQRationalReconstruction<Givaro::ZRing<Integer> > > RR2_2(Z,QUADRATIC,0,10);
+ RationalRemainder2< VarPrecEarlySingleCRA< Givaro::Modular<double> >,
+ RReconstruction<Givaro::ZRing<Integer>, FastMaxQRationalReconstruction<Givaro::ZRing<Integer> > > > cra2_2(4UL, RR2_2);
cra2_2(a2_2,b2_2,iteration,genprime);
if ((a2_2 != num) || (b2_2 != den) ) {
ret = false;
@@ -183,9 +182,9 @@ static bool testRandomFraction (size_t n, size_t d, int iterations)
<< "ERROR: rational reconstruction (MaxQ, quadratic, fast) failed" << endl;
}
- RReconstruction<PID_integer, ClassicRationalReconstruction<PID_integer> > RR3_2(RRB1,QUADRATIC,0,10);
- RationalRemainder2< VarPrecEarlySingleCRA< Modular<double> >,
- RReconstruction<PID_integer, ClassicRationalReconstruction<PID_integer> > > cra3_2(4UL, RR3_2);
+ RReconstruction<Givaro::ZRing<Integer>, ClassicRationalReconstruction<Givaro::ZRing<Integer> > > RR3_2(RRB1,QUADRATIC,0,10);
+ RationalRemainder2< VarPrecEarlySingleCRA< Givaro::Modular<double> >,
+ RReconstruction<Givaro::ZRing<Integer>, ClassicRationalReconstruction<Givaro::ZRing<Integer> > > > cra3_2(4UL, RR3_2);
cra3_2(a3_2,b3_2,iteration,genprime);
if ((a3_2 != num) || (b3_2 != den) ) {
ret = false;
@@ -193,9 +192,9 @@ static bool testRandomFraction (size_t n, size_t d, int iterations)
<< "ERROR: rational reconstruction (Wang, quadratic, classic) failed" << endl;
}
- RReconstruction<PID_integer, ClassicMaxQRationalReconstruction<PID_integer> > RR4_2(RRB2,QUADRATIC,0,10);
- RationalRemainder2< VarPrecEarlySingleCRA< Modular<double> >,
- RReconstruction<PID_integer, ClassicMaxQRationalReconstruction<PID_integer> > > cra4_2(4UL, RR4_2);
+ RReconstruction<Givaro::ZRing<Integer>, ClassicMaxQRationalReconstruction<Givaro::ZRing<Integer> > > RR4_2(RRB2,QUADRATIC,0,10);
+ RationalRemainder2< VarPrecEarlySingleCRA< Givaro::Modular<double> >,
+ RReconstruction<Givaro::ZRing<Integer>, ClassicMaxQRationalReconstruction<Givaro::ZRing<Integer> > > > cra4_2(4UL, RR4_2);
cra4_2(a4_2,b4_2,iteration,genprime);
if ((a4_2 != num) || (b4_2 != den) ) {
ret = false;
@@ -204,9 +203,9 @@ static bool testRandomFraction (size_t n, size_t d, int iterations)
}
- RReconstruction<PID_integer, FastRationalReconstruction<PID_integer> > RR1_3(Z,GEOMETRIC,0,5);
- RationalRemainder2< VarPrecEarlySingleCRA< Modular<double> >,
- RReconstruction<PID_integer, FastRationalReconstruction<PID_integer> > > cra1_3(4UL, RR1_3);
+ RReconstruction<Givaro::ZRing<Integer>, FastRationalReconstruction<Givaro::ZRing<Integer> > > RR1_3(Z,GEOMETRIC,0,5);
+ RationalRemainder2< VarPrecEarlySingleCRA< Givaro::Modular<double> >,
+ RReconstruction<Givaro::ZRing<Integer>, FastRationalReconstruction<Givaro::ZRing<Integer> > > > cra1_3(4UL, RR1_3);
cra1_3(a1_3,b1_3,iteration,genprime);
if ((a1_3 != num) || (b1_3 != den) ) {
ret = false;
@@ -214,9 +213,9 @@ static bool testRandomFraction (size_t n, size_t d, int iterations)
<< "ERROR: rational reconstruction (Wang, geometric, fast) failed" << endl;
}
- RReconstruction<PID_integer, FastMaxQRationalReconstruction<PID_integer> > RR2_3(Z,GEOMETRIC,0,5);
- RationalRemainder2< VarPrecEarlySingleCRA< Modular<double> >,
- RReconstruction<PID_integer, FastMaxQRationalReconstruction<PID_integer> > > cra2_3(4UL, RR2_3);
+ RReconstruction<Givaro::ZRing<Integer>, FastMaxQRationalReconstruction<Givaro::ZRing<Integer> > > RR2_3(Z,GEOMETRIC,0,5);
+ RationalRemainder2< VarPrecEarlySingleCRA< Givaro::Modular<double> >,
+ RReconstruction<Givaro::ZRing<Integer>, FastMaxQRationalReconstruction<Givaro::ZRing<Integer> > > > cra2_3(4UL, RR2_3);
cra2_3(a2_3,b2_3,iteration,genprime);
if ((a2_3 != num) || (b2_3 != den) ) {
ret = false;
@@ -224,9 +223,9 @@ static bool testRandomFraction (size_t n, size_t d, int iterations)
<< "ERROR: rational reconstruction (MaxQ, geometric, fast) failed" << endl;
}
- RReconstruction<PID_integer, ClassicRationalReconstruction<PID_integer> > RR3_3(RRB1,GEOMETRIC,0,5);
- RationalRemainder2< VarPrecEarlySingleCRA< Modular<double> >,
- RReconstruction<PID_integer, ClassicRationalReconstruction<PID_integer> > > cra3_3(4UL, RR3_3);
+ RReconstruction<Givaro::ZRing<Integer>, ClassicRationalReconstruction<Givaro::ZRing<Integer> > > RR3_3(RRB1,GEOMETRIC,0,5);
+ RationalRemainder2< VarPrecEarlySingleCRA< Givaro::Modular<double> >,
+ RReconstruction<Givaro::ZRing<Integer>, ClassicRationalReconstruction<Givaro::ZRing<Integer> > > > cra3_3(4UL, RR3_3);
cra3_3(a3_3,b3_3,iteration,genprime);
if ((a3_3 != num) || (b3_3 != den) ) {
ret = false;
@@ -234,9 +233,9 @@ static bool testRandomFraction (size_t n, size_t d, int iterations)
<< "ERROR: rational reconstruction (Wang, geometric, classic) failed" << endl;
}
- RReconstruction<PID_integer, ClassicMaxQRationalReconstruction<PID_integer> > RR4_3(RRB2,GEOMETRIC,0,5);
- RationalRemainder2< VarPrecEarlySingleCRA< Modular<double> >,
- RReconstruction<PID_integer, ClassicMaxQRationalReconstruction<PID_integer> > > cra4_3(4UL, RR4_3);
+ RReconstruction<Givaro::ZRing<Integer>, ClassicMaxQRationalReconstruction<Givaro::ZRing<Integer> > > RR4_3(RRB2,GEOMETRIC,0,5);
+ RationalRemainder2< VarPrecEarlySingleCRA< Givaro::Modular<double> >,
+ RReconstruction<Givaro::ZRing<Integer>, ClassicMaxQRationalReconstruction<Givaro::ZRing<Integer> > > > cra4_3(4UL, RR4_3);
cra4_3(a4_3,b4_3,iteration,genprime);
if ((a4_3 != num) || (b4_3 != den) ) {
ret = false;
@@ -245,13 +244,13 @@ static bool testRandomFraction (size_t n, size_t d, int iterations)
}
size_t H = (n > d) ? n : d;
- H /= bits;
+ H /= (size_t)bits;
++H;
H *=2;
++H;
- RReconstruction<PID_integer, FastRationalReconstruction<PID_integer> > RR1_4(Z,CERTIFIED,0,H);
- RationalRemainder2< VarPrecEarlySingleCRA< Modular<double> >,
- RReconstruction<PID_integer, FastRationalReconstruction<PID_integer> > > cra1_4(4UL, RR1_4);
+ RReconstruction<Givaro::ZRing<Integer>, FastRationalReconstruction<Givaro::ZRing<Integer> > > RR1_4(Z,CERTIFIED,0,H);
+ RationalRemainder2< VarPrecEarlySingleCRA< Givaro::Modular<double> >,
+ RReconstruction<Givaro::ZRing<Integer>, FastRationalReconstruction<Givaro::ZRing<Integer> > > > cra1_4(4UL, RR1_4);
cra1_4(a1_4,b1_4,iteration,genprime);
if ((a1_4 != num) || (b1_4 != den) ) {
ret = false;
@@ -259,10 +258,10 @@ static bool testRandomFraction (size_t n, size_t d, int iterations)
<< "ERROR: rational reconstruction (Wang, certified, fast) failed" << endl;
}
- //RReconstruction<PID_integer, FastMaxQRationalReconstruction<PID_integer> > RR2_4(Z,CERTIFIED);
- RReconstruction<PID_integer, ClassicRationalReconstruction<PID_integer> > RR3_4(RRB1,CERTIFIED,0,H);
- RationalRemainder2< VarPrecEarlySingleCRA< Modular<double> >,
- RReconstruction<PID_integer, ClassicRationalReconstruction<PID_integer> > > cra3_4(4UL, RR3_4);
+ //RReconstruction<Givaro::ZRing<Integer>, FastMaxQRationalReconstruction<Givaro::ZRing<Integer> > > RR2_4(Z,CERTIFIED);
+ RReconstruction<Givaro::ZRing<Integer>, ClassicRationalReconstruction<Givaro::ZRing<Integer> > > RR3_4(RRB1,CERTIFIED,0,H);
+ RationalRemainder2< VarPrecEarlySingleCRA< Givaro::Modular<double> >,
+ RReconstruction<Givaro::ZRing<Integer>, ClassicRationalReconstruction<Givaro::ZRing<Integer> > > > cra3_4(4UL, RR3_4);
cra3_4(a3_4,b3_4,iteration,genprime);
if ((a3_4 != num) || (b3_4 != den) ) {
ret = false;
@@ -270,7 +269,7 @@ static bool testRandomFraction (size_t n, size_t d, int iterations)
<< "ERROR: rational reconstruction (Wang, certified, classic) failed" << endl;
}
- //RReconstruction<PID_integer, ClassicMaxQRationalReconstruction<PID_integer> > RR4_4(RRB2,CERTIFIED);
+ //RReconstruction<Givaro::ZRing<Integer>, ClassicMaxQRationalReconstruction<Givaro::ZRing<Integer> > > RR4_4(RRB2,CERTIFIED);
commentator().stop ("done");
commentator().progress ();
@@ -298,7 +297,7 @@ int main (int argc, char **argv)
};
parseArguments (argc, argv, args);
- //Modular<int> F (q);
+ //Givaro::Modular<int> F (q);
commentator().start("Rational reconstruction test suite", "rr");
diff --git a/tests/test-rational-solver-adaptive.C b/tests/test-rational-solver-adaptive.C
index 106e41b..e6f9f28 100644
--- a/tests/test-rational-solver-adaptive.C
+++ b/tests/test-rational-solver-adaptive.C
@@ -32,8 +32,10 @@
-#include "linbox/field/PID-integer.h"
+#include "linbox/linbox-config.h"
+#include "givaro/zring.h"
#include "linbox/blackbox/diagonal.h"
+#include "linbox/vector/blas-vector.h"
#include "linbox/algorithms/rational-solver-adaptive.h"
#include <iostream>
#include "test-common.h"
@@ -50,7 +52,7 @@ bool testRandomSolve (const Ring& R,
{
- std::ostringstream str;
+ // std::ostringstream str;
@@ -58,18 +60,17 @@ bool testRandomSolve (const Ring& R,
bool ret = true;
- bool iter_passed = true;
VectorDomain<Ring> VD (R);
- Vector d, b, x, y;
+ int n = (int)stream1.n();
+ Vector d(R,n), b(R,n), X(R,n), y(R,n);
- VectorWrapper::ensureDim (d, stream1.n ());
- VectorWrapper::ensureDim (b, stream1.n ());
- VectorWrapper::ensureDim (x, stream1.n ());
- VectorWrapper::ensureDim (y, stream1.n ());
+ // VectorWrapper::ensureDim (d, stream1.n ());
+ // VectorWrapper::ensureDim (b, stream1.n ());
+ // VectorWrapper::ensureDim (X, stream1.n ());
+ // VectorWrapper::ensureDim (y, stream1.n ());
- int n = (int)d. size();
while (stream1 && stream2) {
@@ -77,46 +78,55 @@ bool testRandomSolve (const Ring& R,
//ActivityState state = commentator().saveActivityState ();
- iter_passed = true;
+ bool iter_passed = true;
bool zeroEntry;
do {
stream1.next (d);
zeroEntry = false;
for (size_t i=0; i<stream1.n(); i++)
- zeroEntry |= R.isZero(d[i]);
+ zeroEntry |= R.isZero(d[(size_t)i]);
} while (zeroEntry);
- stream2.next (b);
+ stream2.next (b);
- std::ostream &report = commentator().report (Commentator::LEVEL_IMPORTANT, INTERNAL_DESCRIPTION);
- report << "Diagonal entries: ";
- VD.write (report, d);
- report << endl;
+ std::ostream &report = commentator().report (Commentator::LEVEL_IMPORTANT, INTERNAL_DESCRIPTION);
+ report << "Diagonal entries: ";
+ VD.write (report, d);
+ report << endl;
- report << "Right-hand side: ";
- VD.write (report, b);
- report << endl;
+ report << "Right-hand side: ";
+ VD.write (report, b);
+ report << endl;
- //Diagonal<Ring> D(R, d);
+ //Diagonal<Ring> D(R, d);
- BlasMatrix<Ring> D(R, n, n);
+ BlasMatrix<Ring> D(R, (size_t) n, (size_t) n);
- for(int i = 0; i < n; ++i) R.init (D[i][i], d[i]);
+ for(size_t i = 0; i < (size_t)n; ++i) {
+ typename Ring::Element x; R.init(x, d[i]);
+ D.setEntry(i, i, x);
+ //for(size_t j = 0; j < n; ++j)
+ // if (j != i) D.setEntry(i,j,R.zero);
+ }
+
+ D.write(report<<"Matrix: \n");
typedef RationalSolverAdaptive RSolver;
RSolver rsolver;
- //std::vector<std::pair<typename Ring::Element, typename Ring::Element> > answer(n);
- std::vector<typename Ring::Element> num(n);
+ BlasVector<Ring> num(R,(size_t)n);
typename Ring::Element den;
SolverReturnStatus solveResult = rsolver.solveNonsingular(num, den, D, b); //often 5 primes are not enough
+ report << "Solution numerator: ";
+ VD.write (report, num);
+ report << ", denominator: " << den << endl;
#if 0
typename Ring::Element lden;
- R. init (lden, 1);
+ R. assign (lden, R.one);
typename std::vector<std::pair<typename Ring::Element, typename Ring::Element> >::iterator p;
@@ -128,7 +138,7 @@ bool testRandomSolve (const Ring& R,
if (solveResult == SS_OK) {
#if 0
- for (p = answer.begin(), p_x = x. begin();
+ for (p = answer.begin(), p_x = X. begin();
p != answer.end();
++ p, ++ p_x) {
@@ -138,7 +148,7 @@ bool testRandomSolve (const Ring& R,
}
- D. apply (y, x);
+ D. apply (y, X);
#endif
D. apply (y, num);
@@ -188,16 +198,16 @@ int main(int argc, char** argv)
parseArguments (argc, argv, args);
- typedef Modular<int32_t> Field;
- // typedef Modular<double> Field;
+ typedef Givaro::Modular<int32_t> Field;
+ // typedef Givaro::Modular<double> Field;
- typedef PID_integer Ring;
+ typedef Givaro::ZRing<Integer> Ring;
- Ring R;
+ Ring R; Ring::RandIter gen(R);
Field F(101);
- RandomDenseStream<Ring> s1 (R, n, iterations), s2 (R, n, iterations);
+ RandomDenseStream<Ring,BlasVector<Ring> > s1 (R, gen, n, (unsigned int)iterations), s2 (R, gen, n, (unsigned int)iterations);
diff --git a/tests/test-rational-solver.C b/tests/test-rational-solver.C
index b166bb5..7a90c73 100644
--- a/tests/test-rational-solver.C
+++ b/tests/test-rational-solver.C
@@ -13,7 +13,7 @@
*
* This library 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
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
@@ -22,186 +22,134 @@
* ========LICENCE========
*/
-
/*! @file tests/test-rational-solver.C
* @ingroup tests
* @brief no doc.
* @test no doc.
*/
-
-
-#include "linbox/field/PID-integer.h"
-#include "linbox/field/modular.h"
+#include "linbox/linbox-config.h"
+#include "linbox/ring/modular.h"
#include "linbox/blackbox/diagonal.h"
#include "linbox/algorithms/rational-solver.h"
#include "linbox/randiter/random-prime.h"
-#include <iostream>
-#include "test-common.h"
#include "linbox/vector/stream.h"
#include "linbox/util/commentator.h"
+
+#include "test-common.h"
+
+#include <iostream>
+
using namespace LinBox;
/// Testing Nonsingular Random Diagonal solve.
template <class Ring, class Field, class Vector>
bool testRandomSolve (const Ring& R,
- const Field& f,
- LinBox::VectorStream<Vector>& stream1,
- LinBox::VectorStream<Vector>& stream2)
+ const Field& f,
+ LinBox::VectorStream<Vector>& stream1,
+ LinBox::VectorStream<Vector>& stream2)
{
+ commentator().start("Testing Nonsingular Random Diagonal solve ",
+ "testNonsingularRandomDiagonalSolve",
+ stream1.size());
- std::ostringstream str;
-
- commentator().start ("Testing Nonsingular Random Diagonal solve ","testNonsingularRandomDiagonalSolve", stream1.size());// "testNonsingularRandomMatrixSolve", stream1.m ());
-
- bool ret = true;
-
- bool iter_passed = true;
-
- VectorDomain<Ring> VD (R);
-
- Vector d, b, x, y;
-
- VectorWrapper::ensureDim (d, stream1.n ());
- VectorWrapper::ensureDim (b, stream1.n ());
- VectorWrapper::ensureDim (x, stream1.n ());
- VectorWrapper::ensureDim (y, stream1.n ());
-
- int n = (int)d. size();
-
- while (stream1 && stream2) {
-
- commentator().startIteration ((unsigned)stream1.j ());
-
- //ActivityState state = commentator().saveActivityState ();
+ bool ret = true;
- iter_passed = true;
+ VectorDomain<Ring> VD(R);
+ Vector d(R), b(R), x(R), y(R);
- bool zeroEntry;
- do {
- stream1.next (d);
- zeroEntry = false;
- for (size_t i=0; i<stream1.n(); i++)
- zeroEntry |= R.isZero(d[i]);
- } while (zeroEntry);
+ VectorWrapper::ensureDim (d, stream1.n ());
+ VectorWrapper::ensureDim (b, stream1.n ());
+ VectorWrapper::ensureDim (x, stream1.n ());
+ VectorWrapper::ensureDim (y, stream1.n ());
- stream2.next (b);
+ int n = (int)d.size();
- std::ostream &report = commentator().report (Commentator::LEVEL_IMPORTANT, INTERNAL_DESCRIPTION);
- report << "Diagonal entries: ";
- VD.write (report, d);
- report << endl;
-
- report << "Right-hand side: ";
- VD.write (report, b);
- report << endl;
-
- //Diagonal<Ring> D(R, d);
-
- BlasMatrix<Ring> D(R, n, n);
-
- for(int i = 0; i < n; ++i) R.init (D[i][i], d[i]);
-
- typedef RationalSolver<Ring, Field, LinBox::RandomPrimeIterator> RSolver;
- RSolver rsolver;
-
- //std::vector<std::pair<typename Ring::Element, typename Ring::Element> > answer(n);
- std::vector<typename Ring::Element> num(n);
- typename Ring::Element den;
-
- SolverReturnStatus solveResult = rsolver.solve(num, den, D, b, 30); //often 5 primes are not enough
+ while (stream1 && stream2) {
+ commentator().startIteration ((unsigned)stream1.j ());
+ bool iter_passed = true;
-#if 0
- typename Ring::Element lden;
+ bool zeroEntry;
+ do {
+ stream1.next (d);
+ zeroEntry = false;
+ for (size_t i=0; i<stream1.n(); i++)
+ zeroEntry |= R.isZero(d[(size_t)i]);
+ } while (zeroEntry);
- R. init (lden, 1);
+ stream2.next (b);
- typename std::vector<std::pair<typename Ring::Element, typename Ring::Element> >::iterator p;
+ std::ostream &report = commentator().report (Commentator::LEVEL_IMPORTANT, INTERNAL_DESCRIPTION);
+ report << "Diagonal entries: ";
+ VD.write (report, d);
+ report << endl;
- for (p = answer.begin(); p != answer.end(); ++ p)
- R. lcm (lden, lden, p->second);
- typename Vector::iterator p_x;
- //typename Vector::iterator p_y;
-#endif
+ report << "Right-hand side: ";
+ VD.write (report, b);
+ report << endl;
- if (solveResult == SS_OK) {
-#if 0
- for (p = answer.begin(), p_x = x. begin();
- p != answer.end();
- ++ p, ++ p_x) {
+ //Diagonal<Ring> D(R, d);
+ BlasMatrix<Ring> D(R, n, n);
- R. mul (*p_x, p->first, lden);
+ for(int i = 0; i < n; ++i) R.init (D[(size_t)i][(size_t)i], d[(size_t)i]);
- R. divin (*p_x, p->second);
+ typedef RationalSolver<Ring, Field, LinBox::RandomPrimeIterator> RSolver;
+ RSolver rsolver;
- }
+ BlasVector<Ring> num(R,(size_t)n);
+ typename Ring::Element den;
- D. apply (y, x);
-#endif
- D. apply (y, num);
+ auto solveResult = rsolver.solve(num, den, D, b, 30); // often 5 primes are not enough
- VD. mulin(b, den);
+ if (solveResult == SS_OK) {
+ D. apply (y, num);
+ VD. mulin(b, den);
- if (!VD.areEqual (y, b)) {
- ret = iter_passed = false;
- commentator().report (Commentator::LEVEL_IMPORTANT, INTERNAL_ERROR)
- << "ERROR: Computed solution is incorrect" << endl;
- }
- }
- else {
- ret = iter_passed = false;
- commentator().report (Commentator::LEVEL_IMPORTANT, INTERNAL_ERROR)
- << "ERROR: Did not return OK solving status" << endl;
- }
+ if (!VD.areEqual (y, b)) {
+ ret = iter_passed = false;
+ commentator().report (Commentator::LEVEL_IMPORTANT, INTERNAL_ERROR)
+ << "ERROR: Computed solution is incorrect" << endl;
+ }
+ }
+ else {
+ ret = iter_passed = false;
+ commentator().report (Commentator::LEVEL_IMPORTANT, INTERNAL_ERROR)
+ << "ERROR: Did not return OK solving status" << endl;
+ }
- commentator().stop ("done");
+ commentator().stop ("done");
commentator().progress ();
+ }
- }
-
-
- stream1.reset ();
- stream2.reset ();
-
- commentator().stop (MSG_STATUS (ret), (const char *) 0, "testNonsingularRandomDiagonalSolve");
+ stream1.reset ();
+ stream2.reset ();
+ commentator().stop (MSG_STATUS (ret), (const char *) 0, "testNonsingularRandomDiagonalSolve");
- return ret;
+ return ret;
}
int main(int argc, char** argv)
{
+ bool pass = true;
+ static size_t n = 10;
+ static int iterations = 1;
+ static Argument args[] = {
+ { 'n', "-n N", "Set order of test matrices to N.", TYPE_INT, &n},
+ { 'i', "-i I", "Perform each test for I iterations.", TYPE_INT, &iterations },
+ END_OF_ARGUMENTS };
+ parseArguments (argc, argv, args);
- bool pass = true;
-
- static size_t n = 10;
-
- static int iterations = 1;
-
- static Argument args[] = {
- { 'n', "-n N", "Set order of test matrices to N.", TYPE_INT, &n},
- { 'i', "-i I", "Perform each test for I iterations.", TYPE_INT, &iterations },
- END_OF_ARGUMENTS
- };
-
-
- parseArguments (argc, argv, args);
-
- typedef Modular<int32_t> Field;
- // typedef Modular<double> Field;
-
- typedef PID_integer Ring;
-
- Ring R;
-
- Field F(101);
-
- RandomDenseStream<Ring> s1 (R, n, iterations), s2 (R, n, iterations);
+ using Field = Givaro::Modular<int32_t>;
+ using Ring = Givaro::IntegerDom;
- if (!testRandomSolve(R, F, s1, s2)) pass = false;
+ Ring R; Ring::RandIter gen(R);
+ Field F(101);
- return pass ? 0 : -1;
+ RandomDenseStream<Ring> s1 (R, gen, n, (unsigned int)iterations), s2 (R, gen, n, (unsigned int)iterations);
+ if (!testRandomSolve(R, F, s1, s2)) pass = false;
+ return pass ? 0 : -1;
}
diff --git a/tests/test-regression.C b/tests/test-regression.C
new file mode 100644
index 0000000..3ff9f6a
--- /dev/null
+++ b/tests/test-regression.C
@@ -0,0 +1,125 @@
+/* tests/test-regression.C
+ * Copyright (C) LinBox
+ * Written by Clement Pernet
+ *
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ * ========LICENCE========
+ *.
+ */
+
+/*! @file tests/test-regression.C
+ * @ingroup tests
+ * @brief tests former bugs to check that no regression made them show up again.
+ */
+#include "linbox-config.h"
+#include "givaro/modular.h"
+#include "linbox/matrix/sparse-matrix.h"
+#include "linbox/vector/blas-vector.h"
+#include "solutions/solve.h"
+using namespace LinBox;
+
+bool testSolveSparse(){
+
+ typedef Givaro::Modular<unsigned int> Field;
+ typedef std::vector <std::pair <size_t, Field::Element> > SparseSeqVectorGFp;
+ typedef SparseMatrix<Field, VectorTraits<SparseSeqVectorGFp>::SparseFormat> Matrix;
+ Field F(127);
+ Matrix A(F, 3, 3);
+ DenseVector<Field> x(F, 3);
+ DenseVector<Field> b(F, 3);
+ A.setEntry(0,0, 1);
+ A.setEntry(0,1, 2);
+ A.setEntry(0,2, 3);
+ A.setEntry(1,0, 126);
+ A.setEntry(1,1, 2);
+ A.setEntry(1,2, 5);
+ A.setEntry(2,0, 2);
+ A.setEntry(2,1, 3);
+ A.setEntry(2,2, 1);
+ for (int i=0;i<3;i++)
+ F.assign(b[i],i+1);
+
+ Matrix B(A);
+
+ solve(x,B,b, Method::BlasElimination());
+
+ if (!F.areEqual (x[0],73)) return false;
+ if (!F.areEqual (x[1],76)) return false;
+ if (!F.areEqual (x[2],10)) return false;
+ return true;
+}
+
+#if __LINBOX_HAVE_SAGE
+// CP: Include the .C file instead of linking to the linboxsage lib:
+// avoid requiring to make install before make check.
+#include "interfaces/sage/linbox-sage.C"
+bool testSolveSparseSage(){
+ size_t p = 127;
+ c_vector_modint_linbox * A = new c_vector_modint_linbox[3];
+ c_vector_modint_linbox b;
+ for (int i=0;i<3;++i){
+ A[i].entries = new int[3];
+ A[i].positions = new size_t[3];
+ A[i].num_nonzero=3;
+ for (int j=0;j<3;j++)
+ A[i].positions[j]=j;
+ A[i].p = p;
+ }
+ b.entries = new int[3];
+ b.positions = new size_t[3];
+ for (int j=0;j<3;j++)
+ b.positions[j]=j;
+ b.num_nonzero=3;
+ b.p = p;
+ for (int i=0;i<3;i++)
+ b.entries[i]=i+1;
+
+ std::vector<unsigned int> x;
+
+ A[0].entries[0]=1;
+ A[0].entries[1]=2;
+ A[0].entries[2]=3;
+ A[1].entries[0]=126;
+ A[1].entries[1]=2;
+ A[1].entries[2]=5;
+ A[2].entries[0]=2;
+ A[2].entries[1]=3;
+ A[2].entries[2]=1;
+
+ x = linbox_modn_sparse_matrix_solve(p,3,3,A,&b,1);
+
+ if (x[0] != 73) return false;
+ if (x[1] != 76) return false;
+ if (x[2] != 10) return false;
+
+ return true;
+}
+#else
+bool testSolveSparseSage(){return true;}
+#endif
+
+int main (int argc, char **argv)
+{
+ bool pass = true;
+
+ if (!testSolveSparse ()) pass = false;
+ if (!testSolveSparseSage ()) pass = false;
+
+ return pass ? 0 : -1;
+}
diff --git a/tests/test-scalar-matrix.C b/tests/test-scalar-matrix.C
index 10c2cab..7ca4b87 100644
--- a/tests/test-scalar-matrix.C
+++ b/tests/test-scalar-matrix.C
@@ -36,9 +36,9 @@
#include <iostream>
#include <fstream>
-#include <vector>
-#include "linbox/field/modular.h"
+
+#include "linbox/ring/modular.h"
#include "linbox/blackbox/scalar-matrix.h"
#include "test-blackbox.h"
@@ -50,7 +50,7 @@ int main (int argc, char **argv)
bool pass = true;
static size_t n = 20;
- static integer q = 2147483647U;
+ static integer q = 65521U;
static int iterations = 1;
static Argument args[] = {
@@ -66,18 +66,18 @@ int main (int argc, char **argv)
commentator().start("Scalar black box test suite", "Scalar");
- typedef Modular<uint32_t> Field;
+ typedef Givaro::Modular<uint32_t> Field;
Field F (q);
Field::Element d;
- F.init (d, -1);
+ F.assign(d, F.mOne);
typedef ScalarMatrix <Field> Blackbox;
// C Pernet: why is the default constructor even public?
// Blackbox A; // Test the default constructor
//pass = pass && testBlackbox(A);
- Blackbox B (F, n, d); // Test a small one.
+ Blackbox B (F, n, n, d); // Test a small one.
pass = pass && testBlackbox(B);
//Blackbox C (F, 100000, d); // Test a large one.
diff --git a/tests/test-smith-form-adaptive.C b/tests/test-smith-form-adaptive.C
index fc7d23f..f7f1aee 100644
--- a/tests/test-smith-form-adaptive.C
+++ b/tests/test-smith-form-adaptive.C
@@ -32,8 +32,9 @@
-//#include "linbox/field/ntl-ZZ.h"
-#include "linbox/field/PID-integer.h"
+#include <linbox/linbox-config.h>
+
+#include "givaro/zring.h"
#include <time.h>
#include "linbox/randiter/random-prime.h"
#include "linbox/util/commentator.h"
@@ -57,11 +58,10 @@ bool testRandom(const Ring& R,
commentator().start (str.str ().c_str (), "testRandom");//, stream1.m ());
bool ret = true;
- bool iter_passed = true;
VectorDomain<Ring> VD (R);
- Vector d, x;
+ Vector d(R), x(R);
VectorWrapper::ensureDim (d, stream1.n ());
@@ -76,7 +76,7 @@ bool testRandom(const Ring& R,
std::ostream &report = commentator().report (Commentator::LEVEL_IMPORTANT, INTERNAL_DESCRIPTION);
- iter_passed = true;
+ bool iter_passed = true;
stream1.next (d);
@@ -89,21 +89,21 @@ bool testRandom(const Ring& R,
int i, j;
for(i = 0; i < n; ++i) {
- R. assign (D[i][i], d[i]);
- R. init (L[i][i], 1);
- R. init (U[i][i], 1);}
+ R. assign (D[(size_t)i][(size_t)i], d[(size_t)i]);
+ R. assign(L[(size_t)i][(size_t)i], R.one);
+ R. assign (U[(size_t)i][(size_t)i], R.one);}
for (i = 0; i < n; ++ i)
for (j = 0; j < i; ++ j) {
- R.init(L[i][j], rand() % 10);
+ R.init(L[(size_t)i][(size_t)j], rand() % 10);
- R.init(U[j][i], rand() % 10);
+ R.init(U[(size_t)j][(size_t)i], rand() % 10);
}
- std::vector<typename Ring::Element> tmp1(n), tmp2(n), e(n);
+ BlasVector<Ring> tmp1(R,(size_t)n), tmp2(R,(size_t)n), e(R,(size_t)n);
typename BlasMatrix<Ring>::ColIterator col_p;
@@ -111,19 +111,23 @@ bool testRandom(const Ring& R,
for (col_p = A.colBegin();
col_p != A.colEnd(); ++ col_p, ++ i) {
- R.init(e[i],1);
+ R.assign(e[(size_t)i],R.one);
U.apply(tmp1, e);
D.apply(tmp2, tmp1);
+ // LinBox::BlasSubvector<BlasVector<Ring> > col_p_v (R, *col_p);
+ // L.apply(col_p_v, tmp2);
L.apply(*col_p, tmp2);
- R.init(e[i],0);
+ R.assign(e[(size_t)i],R.zero);
}
- std::vector<integer> xi(A. rowdim());
+ Givaro::ZRing<Integer> Z; //! why switch from Ring ????
+ BlasVector<Givaro::ZRing<Integer> > xi(Z,A. rowdim());
SF.smithForm (xi, A);
- typename Vector::iterator x_p; std::vector<integer>::iterator xi_p;
+ typename Vector::iterator x_p;
+ BlasVector<Givaro::ZRing<Integer> >::iterator xi_p;
for (x_p = x. begin(), xi_p = xi. begin(); x_p != x. end(); ++ x_p, ++ xi_p)
A. field (). init (*x_p, *xi_p);
@@ -135,7 +139,7 @@ bool testRandom(const Ring& R,
report << '\n';
- typename std::vector<typename Ring::Element>::iterator p1, p2;
+ typename BlasVector<Ring>::iterator p1, p2;
typename Ring::Element g;
@@ -200,7 +204,7 @@ int main(int argc, char** argv)
bool pass = true;
static size_t n = 35;
- static int iterations = 1;
+ static unsigned int iterations = 1;
static Argument args[] = {
{ 'n', "-n N", "Set order of test matrices to N.", TYPE_INT, &n },
{ 'i', "-i I", "Perform each test for I iterations.", TYPE_INT, &iterations },
@@ -214,12 +218,12 @@ int main(int argc, char** argv)
commentator().getMessageClass (INTERNAL_DESCRIPTION).setMaxDepth (5);
//typedef NTL_ZZ Ring; Ring R;
- typedef PID_integer Ring; Ring R;
- RandomDenseStream<Ring> s1 (R, n, iterations);
+ typedef Givaro::ZRing<Integer> Ring; Ring R; Ring::RandIter gen(R);
+ RandomDenseStream<Ring> s1 (R, gen, n, iterations);
pass = testRandom(R, sf, s1);
- typedef PID_integer Ring2; Ring2 S;
- RandomDenseStream<Ring2> s2 (S, n, iterations);
+ typedef Givaro::ZRing<Integer> Ring2; Ring2 S;Ring2::RandIter gen2(S);
+ RandomDenseStream<Ring2> s2 (S, gen2, n, iterations);
pass = pass && testRandom(S, sf, s2);
commentator().stop(MSG_STATUS(pass));
@@ -227,11 +231,10 @@ int main(int argc, char** argv)
}
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
// Local Variables:
// mode: C++
// tab-width: 8
// indent-tabs-mode: nil
// c-basic-offset: 8
// End:
-
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/tests/test-smith-form-binary.C b/tests/test-smith-form-binary.C
index 505b3f9..b2f75d9 100644
--- a/tests/test-smith-form-binary.C
+++ b/tests/test-smith-form-binary.C
@@ -31,12 +31,12 @@
+#include "linbox/linbox-config.h"
-#include "linbox/field/PID-integer.h"
#ifdef __LINBOX_HAVE_NTL
-#include "linbox/field/ntl.h"
+#include "linbox/ring/ntl.h"
#endif
-#include "linbox/field/modular.h"
+//#include "linbox/ring/modular.h"
#include "linbox/randiter/random-prime.h"
#include "linbox/algorithms/matrix-rank.h"
#include "linbox/algorithms/last-invariant-factor.h"
@@ -46,6 +46,7 @@
#include "linbox/blackbox/random-matrix.h"
#include "linbox/algorithms/rational-solver.h"
#include <time.h>
+#include <givaro/modular.h>
#include "linbox/util/commentator.h"
#include "linbox/vector/stream.h"
@@ -65,26 +66,24 @@ bool testRandom(const Ring& R,
commentator().start (str.str ().c_str (), "testSmithform");//, stream1.m ());
bool ret = true;
- bool iter_passed = true;
LinBox::VectorDomain<Ring> VD (R);
- Vector d, x;
+ int n = (int) stream1.n();
+ Vector d(R,n), x(R,n);
- VectorWrapper::ensureDim (d, stream1.n ());
+ // VectorWrapper::ensureDim (d, stream1.n ());
+ // VectorWrapper::ensureDim (x, stream1.n ());
- VectorWrapper::ensureDim (x, stream1.n ());
- int n = (int)d. size();
-
while (stream1) {
commentator().startIteration ((unsigned)stream1.j ());
std::ostream &report = commentator().report (Commentator::LEVEL_IMPORTANT, INTERNAL_DESCRIPTION);
- iter_passed = true;
+ bool iter_passed = true;
stream1.next (d);
@@ -92,38 +91,40 @@ bool testRandom(const Ring& R,
VD.write (report, d);
report << endl;
- BlasMatrix<Ring> D(R, n, n), L(R, n, n), U(R, n, n), A(R,n,n);
+ DenseMatrix<Ring> D(R, n, n), L(R, n, n), U(R, n, n), A(R,n,n);
int i, j;
for(i = 0; i < n; ++i) {
- R. assign (D[i][i], d[i]);
- R. init (L[i][i], 1);
- R. init (U[i][i], 1);}
+ R. assign (D[(size_t)i][(size_t)i], d[(size_t)i]);
+ R. assign (L[(size_t)i][(size_t)i], R.one);
+ R. assign (U[(size_t)i][(size_t)i], R.one);}
for (i = 0; i < n; ++ i)
for (j = 0; j < i; ++ j) {
- R.init(L[i][j], rand() % 10);
+ R.init(L[(size_t)i][(size_t)j], (uint64_t)(rand() % 10));
- R.init(U[j][i], rand() % 10);
+ R.init(U[(size_t)j][(size_t)i], (uint64_t)(rand() % 10));
}
- std::vector<typename Ring::Element> tmp1(n), tmp2(n), e(n);
+ BlasVector<Ring> tmp1(R,(size_t)n), tmp2(R,(size_t)n), e(R,(size_t)n);
- typename BlasMatrix<Ring>::ColIterator col_p;
+ typename DenseMatrix<Ring>::ColIterator col_p;
i = 0;
for (col_p = A.colBegin();
col_p != A.colEnd(); ++ col_p, ++ i) {
- R.init(e[i],1);
+ R.assign (e[(size_t)i],R.one);
U.apply(tmp1, e);
D.apply(tmp2, tmp1);
+ // LinBox::BlasSubvector<BlasVector<Ring> > col_p_v (R, *col_p);
+ // L.apply(col_p_v, tmp2);
L.apply(*col_p, tmp2);
- R.init(e[i],0);
+ R.assign(e[(size_t)i],R.zero);
}
@@ -138,7 +139,7 @@ bool testRandom(const Ring& R,
report << '\n';
- typename std::vector<typename Ring::Element>::iterator p1, p2;
+ typename BlasVector<Ring>::iterator p1, p2;
typename Ring::Element g;
@@ -146,7 +147,8 @@ bool testRandom(const Ring& R,
for ( p2 = p1 + 1; p2 != d.end(); ++ p2) {
- if (R. isUnit(*p1)) break;
+ // CP: changed isUnit to isOne || isMOne as it is only called with ZRing<Integer>.
+ if (R. isOne (*p1) || R. isMOne(*p1)) break;
else if (R. isZero (*p2)) continue;
@@ -165,28 +167,21 @@ bool testRandom(const Ring& R,
}
}
}
+ // normalize to positive
+ for (p1 = d.begin(); p1 != d.end(); ++ p1) if (*p1 < 0) R.negin(*p1);
-
- report << "Expected smith form:\n";
-
- VD.write (report, d);
-
- report << '\n';
+ VD.write (report << "Expected smith form:\n", d) << '\n';
if (!VD.areEqual (d, x))
-
ret = iter_passed = false;
- if (!iter_passed)
-
- commentator().report (Commentator::LEVEL_IMPORTANT, INTERNAL_ERROR)
+ if (!iter_passed)
+ commentator().report (Commentator::LEVEL_IMPORTANT, INTERNAL_ERROR)
<< "ERROR: Computed Smith form is incorrect" << endl;
+ commentator().stop ("done");
-
- commentator().stop ("done");
-
- commentator().progress ();
+ commentator().progress ();
}
@@ -219,17 +214,18 @@ int main(int argc, char** argv)
std::ostream &report = commentator().report (Commentator::LEVEL_IMPORTANT, INTERNAL_DESCRIPTION);
{
- typedef PID_integer Ring;
+// typedef Givaro::IntegerDom Ring;
+ typedef Givaro::ZRing<Integer> Ring;
- Ring R;
+ Ring R; Ring::RandIter gen(R);
report << std::endl << "EGV++ algorithm test suite with LinBox/Givaro PID:\n";
commentator().getMessageClass (INTERNAL_DESCRIPTION).setMaxDepth (5);
- RandomDenseStream<Ring> s1 (R, n, iterations);
+ RandomDenseStream<Ring> s1 (R, gen, n, (unsigned int) iterations);
- typedef Modular<int32_t> Field;
+ typedef Givaro::Modular<int32_t> Field;
typedef RationalSolver<Ring, Field, LinBox::RandomPrimeIterator> Solver;
typedef LastInvariantFactor<Ring, Solver> LIF;
typedef OneInvariantFactor<Ring, LIF, SCompose, RandomMatrix> OIF;
@@ -248,14 +244,14 @@ int main(int argc, char** argv)
{
typedef NTL_ZZ Ring;
- Ring R;
+ Ring R; Ring::RandIter gen(R);
report << std::endl << "EGV++ algorithm test suite with NTL_ZZ :\n";
commentator().getMessageClass (INTERNAL_DESCRIPTION).setMaxDepth (5);
- RandomDenseStream<Ring> s1 (R, n, iterations);
+ RandomDenseStream<Ring> s1 (R, gen, n, (unsigned int)iterations);
- typedef Modular<int32_t> Field;
+ typedef Givaro::Modular<int32_t> Field;
typedef RationalSolver<Ring, Field, LinBox::RandomPrimeIterator> Solver;
typedef LastInvariantFactor<Ring, Solver> LIF;
typedef OneInvariantFactor<Ring, LIF, SCompose, RandomMatrix> OIF;
@@ -273,11 +269,10 @@ int main(int argc, char** argv)
return pass ? 0 : -1;
}
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
// Local Variables:
// mode: C++
// tab-width: 8
// indent-tabs-mode: nil
// c-basic-offset: 8
// End:
-
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/tests/test-smith-form-iliopoulos.C b/tests/test-smith-form-iliopoulos.C
index 079a3cb..50314a8 100644
--- a/tests/test-smith-form-iliopoulos.C
+++ b/tests/test-smith-form-iliopoulos.C
@@ -31,20 +31,19 @@
-#include "linbox/field/ntl.h"
-#include "linbox/field/modular.h"
-#include "linbox/field/PIR-ntl-ZZ_p.h"
-#include "linbox/field/PIR-modular-int32.h"
-#include "linbox/integer.h"
+#include <linbox/linbox-config.h>
+
+#include "givaro/zring.h"
+//#include "linbox/ring/pir-ntl-zz_p.h"
+#include "linbox/ring/pir-modular-int32.h"
#include "linbox/randiter/random-prime.h"
-#include "linbox/algorithms/last-invariant-factor.h"
#include "linbox/algorithms/smith-form-iliopoulos.h"
-#include "linbox/algorithms/rational-solver.h"
-#include <time.h>
+#include "linbox/matrix/matrix-domain.h"
#include "linbox/util/commentator.h"
-#include "linbox/vector/stream.h"
#include "test-common.h"
#include "linbox/algorithms/matrix-hom.h"
+#include "linbox/solutions/det.h"
+#include <iostream>
#ifndef __LINBOX_HAVE_NTL
#error "you can't compile this test without NTL enabled. Please make sure you configured Linbox with --with-ntl=path/to/ntl"
@@ -54,222 +53,99 @@
using namespace LinBox;
-template <class Ring, class Vector>
-bool testRandom(const Ring& R,
- LinBox::VectorStream<Vector>& stream1)
+template <class Ring>
+bool testRead(const Ring& R, string file) {
+ BlasMatrix<Ring> A(R);
+ BlasMatrixDomain<Ring> BMD(R);
+ std::ifstream data(file);
+ A.read(data);
+ size_t m = A.rowdim();
+ size_t n = A.coldim();
+ BlasMatrix<Ring> U(R, m, m), V(R, n, n), B(R, m, n);
+ /* random unimodular
+ BMD.randomNonsingular(U);
+ BMD.randomNonsingular(V);
+ */
+ for (size_t i = 0; i < m; ++i)
+ { for (size_t j = 0; j < m; ++j)
+ U.setEntry(i, j, R.zero);
+ U.setEntry(i, i, R.one);
+ }
+ for (size_t i = 0; i < n; ++i)
+ { for (size_t j = 0; j < n; ++j)
+ V.setEntry(i, j, R.zero);
+ V.setEntry(i, i, R.one);
+ }
+ BMD.copy(B, A);
+ BMD.mulin_left(B,V);
+ BMD.mulin_right(U,B);
+ SmithFormIliopoulos::smithFormIn (B);
+ return BMD.areEqual(A, B);
+}
+
+template <class Ring>
+bool testRandom(const Ring& R, size_t n)
{
+ bool pass = true;
+ commentator().start ("Testing Iloipoulos elimination:", "testRandom");
using namespace std;
-
- ostringstream str;
-
- str << "Testing Iloipoulos elimination:";
-
- commentator().start (str.str ().c_str (), "testRandom", stream1.m ());
-
- bool ret = true;
-
- bool iter_passed = true;
-
- VectorDomain<Ring> VD (R);
-
- Vector d, x;
-
- VectorWrapper::ensureDim (d, stream1.n ());
-
- VectorWrapper::ensureDim (x, stream1.n ());
-
- int n = (int)d. size();
-
- while (stream1) {
-
- commentator().startIteration ((unsigned)stream1.j ());
-
- ostream &report = commentator().report (Commentator::LEVEL_IMPORTANT, INTERNAL_DESCRIPTION);
-
- iter_passed = true;
-
- stream1.next (d);
-
- report << "Input vector: ";
- VD.write (report, d);
- report << endl;
-
- BlasMatrix<Ring> D(R, n, n), L(R, n, n), U(R, n, n), A(R,n,n);
-
- int i, j;
-
- for(i = 0; i < n; ++i) { R. assign (D[i][i], d[i]); R. init (L[i][i], 1); R. init (U[i][i], 1);}
-
- for (i = 0; i < n; ++ i)
-
- for (j = 0; j < i; ++ j) {
-
- R.init(L[i][j], rand() % 10);
-
- R.init(U[j][i], rand() % 10);
- }
-
-
- std::vector<typename Ring::Element> tmp1(n), tmp2(n), e(n);
-
- typename BlasMatrix<Ring>::ColIterator col_p;
-
- i = 0;
- for (col_p = A.colBegin(); col_p != A.colEnd(); ++ col_p, ++ i) {
-
- R.init(e[i],1);
- U.apply(tmp1, e);
- D.apply(tmp2, tmp1);
- L.apply(*col_p, tmp2);
- R.init(e[i],0);
- }
-
-
-
- typename Ring::Element s;
-
- R. init (s, 1);
-
- typename Vector::iterator d_p;
-
- for(d_p = d.begin(); d_p!= d.end(); ++ d_p)
-
- R. lcm (s, s, *d_p);
-
- report << "Last Invariant factor: " ;
-
- R. write (report, s);
-
- report << '\n';
-
-
- if (s >= LINBOX_MAX_MODULUS) {
-
- report << "Using PIR_ntl_ZZ_p\n";
-
- PIR_ntl_ZZ_p PIR(s);
-
- BlasMatrix<PIR_ntl_ZZ_p> Ap(PIR, A.rowdim(), A.coldim());
-
- MatrixHom::map (Ap, A, PIR);
-
- SmithFormIliopoulos::smithFormIn (Ap);
-
- report << "Computed Smith form: \n";
-
- for ( unsigned int ii = 0; ii < A. rowdim(); ++ ii)
- report << Ap[ii][ii] << " ";
-
- report << '\n';
-
- int ii = 0;
-
- typename std::vector<typename Ring::Element>::iterator p1;
-
-
- for (p1 = x. begin(); p1 != x. end(); ++ p1, ++ ii) {
-
- if (PIR.isZero(Ap[ii][ii]))
-
- R.assign (*p1, s);
-
- else
-
- R.assign (*p1, NTL::rep(Ap[ii][ii]));
- }
- }
-
- else {
-
- report << "Using PIRModular<int32_t>\n";
-
- PIRModular<int32_t> PIR( (int32_t)(s % LINBOX_MAX_MODULUS));
-
- BlasMatrix<PIRModular<int32_t> > Ap(PIR, A.rowdim(), A.coldim());
-
- MatrixHom::map (Ap, A, PIR);
-
- SmithFormIliopoulos::smithFormIn (Ap);
-
-
- report << "Computed Smith form: \n";
-
- for ( unsigned int ii = 0; ii < A. rowdim(); ++ ii)
- report << Ap[ii][ii] << " ";
-
- report << '\n';
-
-
- typename std::vector<typename Ring::Element>::iterator p1;
- int ii = 0;
-
- for (p1 = x. begin(); p1 != x. end(); ++ p1, ++ ii) {
- if (PIR.isZero(Ap[ii][ii]))
- R.assign (*p1, s);
- else
- R.init (*p1, Ap[ii][ii]);
- }
- }
-
- typename std::vector<typename Ring::Element>::iterator p1, p2;
-
- typename Ring::Element g;
-
- for (p1 = d.begin(); p1 != d.end(); ++ p1) {
-
- for ( p2 = p1 + 1; p2 != d.end(); ++ p2) {
-
- if (R. isUnit(*p1)) break;
-
- else if (R. isZero (*p2)) continue;
-
- else if (R. isZero (*p1)) {
- std::swap (*p1, *p2);
- }
-
- else {
- R. gcd (g, *p1, *p2);
-
- R. divin (*p2, g);
-
- R. mulin (*p2, *p1);
-
- R. assign (*p1, g);
- }
- }
+ ostream &report = commentator().report (Commentator::LEVEL_IMPORTANT, INTERNAL_DESCRIPTION);
+
+ BlasMatrixDomain<Ring> BMD(R);
+ BlasMatrix<Ring> D(R, n, n), L(R, n, n), U(R, n, n), A(R,n,n);
+
+ // D is Smith Form
+ const int m = 16;
+ int p[m] = {1,1,1,1,1,1,2, 2, 2, 4, 3, 3, 3, 5, 7, 101};
+ typename Ring::Element x, y;
+ R.assign(x, R.one);
+ if (n > 0) D.setEntry(0,0,x);
+ for(size_t i = 1; i < n; ++i){
+ R.init(y, p[rand()%m]);
+ D.setEntry(i,i, R.mulin(x, y));
+ }
+ if (n > 0) D.setEntry(n-1,n-1, R.zero);
+
+ // L and U are random unit triangular.
+ for (size_t i = 0; i < n; ++ i) {
+ for (size_t j = 0; j < i; ++ j) {
+ L.setEntry(i,j, R.init(x, rand() % 10));
+ U.setEntry(j,i, R.init(x, rand() % 10));
}
-
-
- report << "Expected smith form:\n";
-
- for (p1 = d.begin(); p1 != d.end(); ++ p1)
- report << * p1 << " ";
-
- report << '\n';
-
- if (!VD.areEqual (d, x))
-
- ret = iter_passed = false;
-
- if (!iter_passed)
-
- commentator().report (Commentator::LEVEL_IMPORTANT, INTERNAL_ERROR)
- << "ERROR: Computed Smith form is incorrect" << endl;
-
-
-
- commentator().stop ("done");
-
- commentator().progress ();
-
- }
-
- //stream1.reset ();
-
- commentator().stop (MSG_STATUS (ret), (const char *) 0, "testRandom");
-
- return ret;
+ L.setEntry(i,i, R.one);
+ U.setEntry(i,i, R.one);
+ }
+
+ // A is ULDU
+ BMD.mul(A, U, L);
+ BMD.mulin_left(A, D);
+ BMD.mulin_left(A, U);
+
+ D.write( report << "Smith form matrix:\n " ) << endl;
+ A.write( report << "input matrix:\n " ) << endl;
+// SmithFormIliopoulos::smithFormIn (A);
+// A.write( report << "smith of input matrix direct:\n " ) << endl;
+
+ report << "Using PIRModular<int32_t>\n";
+ typename Ring::Element d; R.init(d,16*101);//16*101*5*7*9);
+ for (size_t i = 0; i < n-1; ++i) R.mulin(d, D.getEntry(x, i, i));
+ R.write(report << "modulus: ", d) << endl;
+ //det(d, D);
+ //PIRModular<int32_t> Rd( (int32_t)(s % LINBOX_MAX_MODULUS));
+ PIRModular<int32_t> Rp( (int32_t)d);
+ BlasMatrix<PIRModular<int32_t> > Ap(Rp, n, n), Dp(Rp, n, n);
+ MatrixHom::map (Ap, A);
+
+ SmithFormIliopoulos::smithFormIn (Ap);
+
+ Ap.write( report << "Computed Smith form: \n") << endl;
+ MatrixHom::map (Dp, D);
+ BlasMatrixDomain<PIRModular<int32_t> > BMDp(Rp);
+ pass = pass and BMDp.areEqual(Dp, Ap);
+
+ commentator().stop (MSG_STATUS (pass), (const char *) 0, "testRandom");
+ return pass;
}
@@ -279,31 +155,21 @@ int main(int argc, char** argv)
using namespace LinBox;
bool pass = true;
-
- static size_t n = 20;
-
- static int iterations = 1;
-
+ static size_t n = 2;
static Argument args[] = {
{ 'n', "-n N", "Set order of test matrices to N.", TYPE_INT, &n },
- { 'i', "-i I", "Perform each test for I iterations.", TYPE_INT, &iterations },
END_OF_ARGUMENTS
};
-
-
parseArguments (argc, argv, args);
- typedef NTL_ZZ Ring;
-
- Ring R;
-
commentator().start("Ilioloulos Smith Form test suite", "Ilioloulos");
-
commentator().getMessageClass (INTERNAL_DESCRIPTION).setMaxDepth (5);
- RandomDenseStream<Ring> s1 (R, n, iterations);
+ Givaro::ZRing<Integer> R; // Ring of integers
+ //NTL_ZZ R;
- if (!testRandom(R, s1)) pass = false;
+ if (!testRandom(R, n)) pass = false;
+// if (!testRead(R, "data/Ismith.mat")) pass = false;
commentator().stop("Ilioloulos Smith Form test suite");
return pass ? 0 : -1;
@@ -311,11 +177,10 @@ int main(int argc, char** argv)
}
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
// Local Variables:
// mode: C++
// tab-width: 8
// indent-tabs-mode: nil
// c-basic-offset: 8
// End:
-
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/tests/test-smith-form-kannan-bachem.C b/tests/test-smith-form-kannan-bachem.C
new file mode 100644
index 0000000..48461a4
--- /dev/null
+++ b/tests/test-smith-form-kannan-bachem.C
@@ -0,0 +1,74 @@
+#include "linbox/linbox-config.h"
+
+#include <iostream>
+#include <vector>
+//#include <omp.h>
+
+//#define LINBOX_USES_OMP 1
+#include "linbox/ring/modular.h"
+#include "linbox/matrix/sparse-matrix.h"
+#include "linbox/matrix/dense-matrix.h"
+#include "linbox/matrix/matrix-domain.h"
+
+#include "givaro/givpoly1.h"
+#include "linbox/ring/givaro-poly.h"
+#include "linbox/algorithms/smith-form-kannan-bachem.h"
+
+using namespace std;
+using namespace LinBox;
+
+int main(int argc, char **argv) {
+ typedef Givaro::Modular<double> Field;
+ typedef Givaro::Poly1Dom<Field,Givaro::Dense> PolyDom;
+ typedef GivaroPoly<PolyDom> PolyRing;
+ typedef PolyRing::Element Element;
+ typedef DenseVector<PolyRing> PolyVector;
+ typedef MatrixDomain<PolyRing> PolyMatDom;
+ typedef typename PolyMatDom::OwnMatrix Matrix;
+
+ int p = 3;
+ int n = 3;
+
+ Field F(p);
+ PolyDom PD(F,"x");
+ PolyRing R(PD);
+ PolyMatDom PMD(R);
+
+ Matrix M(R, n, n);
+
+ Element a; // x + 2
+ R.init(a, 5);
+
+ Element b; // 2
+ R.init(b, 2);
+
+ Element c; // x
+ R.init(c, 3);
+
+ M.setEntry(0,0,a);
+ M.setEntry(0,1,b);
+ M.setEntry(0,2,b);
+
+ M.setEntry(1,1,c);
+
+ M.setEntry(2,2,c);
+
+ SmithFormKannanBachemDomain<PolyMatDom> SFKB(PMD);
+
+ PolyVector factors(R);
+ factors.resize(n);
+
+ SFKB.solve(factors, M);
+
+ R.init(a, 1);
+ R.init(b, 3);
+ R.init(c, 15);
+
+ bool pass = true;
+
+ pass = pass && R.areEqual(a, factors[0]);
+ pass = pass && R.areEqual(b, factors[1]);
+ pass = pass && R.areEqual(c, factors[2]);
+
+ return pass ? 0 : -1;
+}
\ No newline at end of file
diff --git a/tests/test-smith-form-local.C b/tests/test-smith-form-local.C
index a9fd850..c582ee1 100644
--- a/tests/test-smith-form-local.C
+++ b/tests/test-smith-form-local.C
@@ -4,20 +4,20 @@
* Written by David Saunders
*
* --------------------------------------------------------
- *
+ *
* ========LICENCE========
* This file is part of the library LinBox.
- *
+ *
* LinBox is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
- *
+ *
* This library 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
* Lesser General Public License for more details.
- *
+ *
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
@@ -36,15 +36,16 @@
#include "linbox/linbox-config.h"
-#include <vector>
+
#include <functional>
#include "test-common.h"
+#include "test-field.h"
#include "linbox/util/commentator.h"
-#include "linbox/field/PIR-modular-int32.h"
-//#include "linbox/field/PIR-modular-double.h"
-#include "linbox/field/local2_32.h"
+#include "linbox/ring/local-pir-modular.h"
+#include "linbox/ring/pir-modular-int32.h"
+#include "linbox/ring/local2_32.h"
#include "linbox/algorithms/smith-form-local.h"
#include "linbox/matrix/matrix-domain.h"
#include "linbox/util/timer.h"
@@ -63,39 +64,11 @@ using namespace LinBox;
*/
template <class LocalPIR>
-class foobar {
-public:
- typedef typename LocalPIR::Element first_argument_type;
- typedef LocalPIR second_argument_type;
- typedef void result_type;
- void operator()(typename LocalPIR::Element& d, const LocalPIR& R) const
- {
- typename LocalPIR::Element x; R.init(x, 2); R.mulin(x, d);
- if (R.isUnit(d)) R.divin(d, d);
- else R.gcd(d, d, x);
- }
-};
-
-template<>
-class foobar<LinBox::Local2_32> {
-public:
- typedef LinBox::Local2_32 LocalPIR;
-
- typedef LocalPIR::Element first_argument_type;
- typedef LocalPIR second_argument_type;
- typedef void result_type;
- void operator()(LocalPIR::Element& d, const LocalPIR& R) const
- {
- if(d != 0) {
- int r = 1;
- while ( !(d & 1) ) {
- d >>= 1;
- r <<= 1;
- }
- d = r;
- }
- }
-};
+typename LocalPIR::Element &
+normal(typename LocalPIR::Element &d, LocalPIR & R)
+{ typename LocalPIR::Element x; R.init(x, 2); R.mulin(x, d);
+ return R.gcdin(d, x);
+}
template <class LocalPIR>
class pplt { // prime power less than
@@ -111,24 +84,6 @@ public:
LocalPIR _R_;
};
-#if 0
-template<>
-class pplt<LinBox::NTL_PID_zz_p> {
-public:
- typedef LinBox::NTL_PID_zz_p LocalPIR;
-
- pplt(LocalPIR R) : _R_(R){}
- bool operator() (LocalPIR::Element a, LocalPIR::Element b)
- {
- if ( b == 0 ) return true;
- else if ( a == 0 ) return false;
- else return NTL::rep(a) <= NTL::rep(b);
- }
- //protected:
- LocalPIR _R_;
-};
-#endif
-
template <class LocalPIR>
static bool testLocalSmith (const LocalPIR &R, vector<typename LocalPIR::Element>& d, string s)
{
@@ -152,15 +107,16 @@ static bool testLocalSmith (const LocalPIR &R, vector<typename LocalPIR::Element
// set up A equiv diag d.
Blackbox L (R, n, n), D (R, n, n), U (R, n, n), A (R, n, n);
for( i = 0; i < n; ++i )
- { D[i][i] = d[i]; L[i][i]=U[i][i]=1; }
+ { R.assign(D[i][i], d[i]); L[i][i]=U[i][i]=R.one; }
for (i = 0; i < n; ++ i)
for ( j = 0; j < i; ++ j) {
- D[i][j] = D[j][i] = 0;
- L[i][j] = rand() % 10;
- L[j][i] = 0;
- U[j][i] = rand() % 10;
- U[i][j] = 0;
+ R.assign(D[i][j], R.assign(D[j][i], 0));
+ R.assign(L[i][j], rand() % 10);
+ R.assign(L[j][i], 0);
+ R.assign(U[j][i], rand() % 10);
+ R.assign(U[i][j], 0);
}
+
MR.mul(A,L,D);
MR.mulin(A,U);
@@ -181,7 +137,7 @@ static bool testLocalSmith (const LocalPIR &R, vector<typename LocalPIR::Element
// figure true invariants
pplt<LocalPIR> lt(R);
- for_each(d.begin(), d.end(), bind2nd(foobar<LocalPIR>(), R));
+ for (size_t i = 0; i < d.size(); ++i) normal(d[i], R);
stable_sort(d.begin(), d.end(), lt);
report << "True invariants: ";
VD.write (report, d) << endl; report.flush();
@@ -194,23 +150,24 @@ static bool testLocalSmith (const LocalPIR &R, vector<typename LocalPIR::Element
report << "ERROR: Computed invariants incorrect" << endl;
ret = false;
}
- commentator().progress();
+ //commentator().progress();
}
return ret;
}
int main (int argc, char **argv)
{
- bool pass = true, pass1 = true;
+ bool pass1 = true, pass2 = true;
- static size_t n = 6;
- static integer q = 101;
- static int iterations = 1;
+ static int64_t n = 6;
+ static size_t q = 3;
+ static int32_t e = 4;
+ //static integer q = 10201; // 101^2
static Argument args[] = {
{ 'n', "-n N", "Set dimension of test matrices to NxN.", TYPE_INT, &n },
- { 'q', "-q Q", "Operate over the \"field\" GF(Q) [1].", TYPE_INTEGER, &q },
- { 'i', "-i I", "Perform each test for I iterations.", TYPE_INT, &iterations },
+ { 'q', "-q Q", "Operate over the ring Z/q^eZ.", TYPE_INT, &q },
+ //{ 'q', "-q Q", "Operate over the ring Z/qZ.", TYPE_INTEGER, &q },
END_OF_ARGUMENTS
};
@@ -219,58 +176,78 @@ int main (int argc, char **argv)
commentator().start("Local Smith Form test suite", "LocalSmith");
commentator().getMessageClass (INTERNAL_DESCRIPTION).setMaxDepth (5);
ostream &report = commentator().report (Commentator::LEVEL_IMPORTANT, INTERNAL_DESCRIPTION);
+ report << "q = " << q << std::endl;
+#if 1
+ { // zero-th local ring type: modulus p^e as integer.
+ typedef LocalPIRModular<integer> Ring;
+ Ring R (q, e);
+ vector<Ring::Element> d(n);
+
+ commentator().start ("Testing local smith over LocalPIRModular<integer>", "local smith");
+ for( int32_t i = 0; i < n; ++i ) R.init(d[i],i);
+ pass1 = testLocalSmith<Ring> (R, d, "LocalPIRModular<integer>");
+ commentator().stop ("local smith");
+ if (not pass1) report << "LocalPIRModular smith FAIL" << std::endl;
-#if 0
-//PIRModular does not currently support the local ring interface -bds Mar2011
- { // first local ring type
- typedef PIRModular<int32_t> LocalPID;
- LocalPID R (536870912); // 2^32
- //typedef PIRModular<dense> LocalPID;
- //LocalPID R (32768);
- vector<LocalPID::Element> d(n);
+ }
+#endif
+ { // first local ring type: modulus p^e as int32_t.
+ typedef PIRModular<int32_t> LocalPIR;
+ //typedef PIRModular<dense> LocalPIR;
+ //LocalPIR R (81);
+ LocalPIR R (q, e);
+ vector<LocalPIR::Element> d(n);
commentator().start ("Testing local smith on singular dense mat over PIRModular", "testSingular");
- for( size_t i = 0; i < n; ++i ) d[i] = i;
- if (!testLocalSmith<LocalPID> (R, d, "PIRModular<int32_t>")) pass1 = false;
+ for( int32_t i = 0; i < n; ++i ) R.init(d[i],i);
+ pass1 = testLocalSmith<LocalPIR> (R, d, "PIRModular<int32_t>");
commentator().stop ("testSingular");
+ if (not pass1) report << "PIRModular sing FAIL" << std::endl;
commentator().start ("Testing local smith on nonsingular dense mat over PIRModular", "testNonsingular");
- for( size_t i = 0; i < n; ++i ) d[i] = i+1;
- if (!testLocalSmith<LocalPID> (R, d, "PIRModular<int32_t>")) pass1 = false;
+ LocalPIR::RandIter r(R);
+ LocalPIR::Element e; R.init(e);
+ for( int32_t i = 0; i < n; ++i ) {
+ r.random(e);
+ do { r.random(e); } while (R.isZero(e));
+ R.assign(d[i], e);
+ }
+ bool p = testLocalSmith<LocalPIR> (R, d, "PIRModular<int32_t>");
+ if (not p) report << "PIRModular nonsing FAIL" << std::endl;
commentator().stop ("testNonsingular");
+ pass1 = pass1 and p;
+ if (not pass1) report << "PIRModular FAIL" << std::endl;
}
- if (not pass1) report << "PIRModular FAIL" << std::endl;
-#endif
- { // second local ring type
- typedef Local2_32 LocalPID;
- LocalPID R;
- vector<LocalPID::Element> d(n);
+ { // second local ring type: m = 2^32
+ typedef Local2_32 LocalPIR;
+ LocalPIR R;
+ vector<LocalPIR::Element> d(n);
commentator().start ("Testing local smith on singular dense mat over Local2_32", "testSingular");
- for( size_t i = 0; i < n; ++i )
- d[i] = (LocalPID::Element) i;
- if (!testLocalSmith<LocalPID> (R, d, "Local2_32")) pass = false;
+ for( int64_t i = 0; i < n; ++i )
+ d[i] = (LocalPIR::Element) i;
+ if (!testLocalSmith<LocalPIR> (R, d, "Local2_32")) pass2 = false;
commentator().stop ("testSingular");
commentator().start ("Testing local smith on nonsingular dense mat over Local2_32", "testNonsingular");
- for( size_t i = 0; i < n; ++i )
- d[i] = (LocalPID::Element) i+1;
- if (!testLocalSmith<LocalPID> (R, d, "Local2_32")) pass = false;
+ for( int64_t i = 0; i < n; ++i )
+ d[i] = (LocalPIR::Element) i+1;
+ if (!testLocalSmith<LocalPIR> (R, d, "Local2_32")) pass2 = false;
commentator().stop ("testNonsingular");
+ if (not pass2) report << "Local2_32 FAIL" << std::endl;
}
- if (not pass) report << "PIRModular FAIL" << std::endl;
commentator().stop("Local Smith Form test suite");
- return pass and pass1 ? 0 : -1;
+ return pass1 and pass2 ? 0 : -1;
}
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
// Local Variables:
// mode: C++
// tab-width: 8
// indent-tabs-mode: nil
// c-basic-offset: 8
// End:
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/tests/test-smith-form.C b/tests/test-smith-form.C
index 6fcfa96..a986fe2 100644
--- a/tests/test-smith-form.C
+++ b/tests/test-smith-form.C
@@ -26,23 +26,27 @@
* @ingroup tests
* @brief no doc.
* @test no doc.
+ //!@bug should work for NTL Integers too
*/
+#include <linbox/linbox-config.h>
+
#include <time.h>
-//#ifdef __LINBOX_HAVE_NTL
-//#include "linbox/field/ntl-ZZ.h"
-//#endif
-#include "linbox/field/PID-integer.h"
+#include "givaro/zring.h"
+#include "givaro/givinteger.h"
#include "linbox/util/commentator.h"
#include "linbox/vector/stream.h"
#include "test-common.h"
+#include "linbox/vector/blas-vector.h"
#include "linbox/solutions/smith-form.h"
using LinBox::parseArguments;
using LinBox::commentator;
using LinBox::Commentator;
-using LinBox::integer;
+using Givaro::Integer;
+using Givaro::ZRing;
using LinBox::BlasMatrix;
+using LinBox::BlasVector;
template <class Ring, class Vector>
bool testRandom(const Ring& R,
@@ -56,11 +60,10 @@ bool testRandom(const Ring& R,
commentator().start (str.str ().c_str (), "testRandom");//, stream1.m ());
bool ret = true;
- bool iter_passed = true;
LinBox::VectorDomain<Ring> VD (R);
- Vector d, x;
+ Vector d(R), x(R);
LinBox::VectorWrapper::ensureDim (d, stream1.n ());
@@ -75,7 +78,7 @@ bool testRandom(const Ring& R,
std::ostream &report = commentator().report (Commentator::LEVEL_IMPORTANT, INTERNAL_DESCRIPTION);
- iter_passed = true;
+ bool iter_passed = true;
stream1.next (d);
@@ -83,26 +86,26 @@ bool testRandom(const Ring& R,
VD.write (report, d);
report << endl;
- BlasMatrix<Ring> D(R, n, n), L(R, n, n), U(R, n, n), A(R,n,n);
+ BlasMatrix<Ring> D(R, (size_t)n, (size_t)n), L(R, (size_t)n, (size_t)n), U(R, (size_t)n, (size_t)n), A(R,(size_t)n,(size_t)n);
int i, j;
for(i = 0; i < n; ++i) {
- R. assign (D[i][i], d[i]);
- R. init (L[i][i], 1);
- R. init (U[i][i], 1);}
+ R. assign (D[(size_t)i][(size_t)i], d[(size_t)i]);
+ R. assign(L[(size_t)i][(size_t)i], R.one);
+ R. assign(U[(size_t)i][(size_t)i], R.one);}
for (i = 0; i < n; ++ i)
for (j = 0; j < i; ++ j) {
- R.init(L[i][j], rand() % 10);
+ R.init(L[(size_t)i][(size_t)j], rand() % 10);
- R.init(U[j][i], rand() % 10);
+ R.init(U[(size_t)j][(size_t)i], rand() % 10);
}
- std::vector<typename Ring::Element> tmp1(n), tmp2(n), e(n);
+ BlasVector<Ring> tmp1(R,(size_t)n), tmp2(R,(size_t)n), e(R,(size_t)n);
typename BlasMatrix<Ring>::ColIterator col_p;
@@ -110,19 +113,22 @@ bool testRandom(const Ring& R,
for (col_p = A.colBegin();
col_p != A.colEnd(); ++ col_p, ++ i) {
- R.init(e[i],1);
+ R.assign(e[(size_t)i],R.one);
U.apply(tmp1, e);
D.apply(tmp2, tmp1);
- L.apply(*col_p, tmp2);
- R.init(e[i],0);
+ // LinBox::BlasSubvector<BlasVector<Ring> > col_p_v (R, *col_p);
+ // L.apply(col_p_v, tmp2);
+ L.apply(*col_p, tmp2); //! @internal @bug should use Triangular apply ? We are doing this many times, factor somewhere in test-utils.h ? why not some ftrtr routine for that ?
+ R.assign(e[(size_t)i],R.zero);
}
typename Vector::iterator x_p;
- std::vector<integer> xi(A. rowdim());
- std::vector<integer>::iterator xi_p;
- std::list<std::pair<integer, size_t> > cpt;
+ Givaro::ZRing<Integer> Z;
+ BlasVector<Givaro::ZRing<Integer> > xi(Z,A. rowdim());
+ BlasVector<Givaro::ZRing<Integer> >::iterator xi_p;
+ std::list<std::pair<Integer, size_t> > cpt;
smithForm (cpt, A);
- std::list<std::pair<integer, size_t> >::iterator cpt_p;
+ std::list<std::pair<Integer, size_t> >::iterator cpt_p;
xi_p = xi. begin();
for (cpt_p = cpt.begin(); cpt_p != cpt.end(); ++ cpt_p) {
@@ -138,7 +144,7 @@ bool testRandom(const Ring& R,
report << '\n';
- typename std::vector<typename Ring::Element>::iterator p1, p2;
+ typename BlasVector<Ring>::iterator p1, p2;
typename Ring::Element g;
for (p1 = d.begin(); p1 != d.end(); ++ p1) {
@@ -189,29 +195,39 @@ int main(int argc, char** argv)
};
parseArguments (argc, argv, args);
-//#ifdef __LINBOX_HAVE_NTL
-// typedef LinBox::NTL_ZZ Ring;
-//#else
- typedef LinBox::PID_integer Ring;
-//#endif
- Ring R;
+ //!@bug should be tried on NTZ_LL too
+ typedef Givaro::ZRing<Integer> Ring;
+
+ Ring R; Ring::RandIter gen(R);
+
commentator().start("Smith form test suite", "Smith");
commentator().getMessageClass (INTERNAL_DESCRIPTION).setMaxDepth (5);
- LinBox::RandomDenseStream<Ring> s1 (R, n, iterations);
+ LinBox::RandomDenseStream<Ring> s1 (R, gen, n, (unsigned int)iterations);
if (!testRandom(R, s1)) pass = false;
+#if 0
+#ifdef __LINBOX_HAVE_NTL
+ typedef LinBox::NTL_ZZ Ring2;
+ Ring2 R2;Ring2::RandIter gen2(R2);
+
+ LinBox::RandomDenseStream<Ring2> s2 (R2, gen2, n, (unsigned int)iterations);
+ if (!testRandom(R2, s2)) pass = false;
+
+#endif
+#endif
+
commentator().stop("Smith form test suite");
return pass ? 0 : -1;
}
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
// Local Variables:
// mode: C++
// tab-width: 8
// indent-tabs-mode: nil
// c-basic-offset: 8
// End:
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/tests/test-solve-nonsingular.C b/tests/test-solve-nonsingular.C
index 59d7a93..53ed65c 100644
--- a/tests/test-solve-nonsingular.C
+++ b/tests/test-solve-nonsingular.C
@@ -24,6 +24,8 @@
/* File: solve-nonsigular.C
This file was used to generate solver comparison data for the paper "Symbolic-Numeric Exact Rational Linear System Solver" submitted to ISSAC'11
*/
+#include <linbox/linbox-config.h>
+
#include <iostream>
#include <fstream>
@@ -34,7 +36,7 @@
#include "linbox/algorithms/rational-solver.h"
#include "linbox/randiter/random-prime.h"
-#include "linbox/field/PID-integer.h"
+#include "givaro/zring.h"
#include "linbox/field/param-fuzzy.h"
#include "tests/test-common.h"
#include "linbox/vector/stream.h"
@@ -96,7 +98,7 @@ void generateProblem(const Ring& R, Matrix &D, Vector &b,
int k = 10)
{
- Vector d, x, y;
+ Vector d(R), x(R), y(R);
VectorWrapper::ensureDim (d, stream1.n ());
VectorWrapper::ensureDim (b, stream1.n ());
VectorWrapper::ensureDim (x, stream1.n ());
@@ -104,14 +106,14 @@ void generateProblem(const Ring& R, Matrix &D, Vector &b,
std::ostream &report = commentator().report (Commentator::LEVEL_IMPORTANT, INTERNAL_DESCRIPTION);
- int n =(int) d.size();
+ size_t n = d.size();
bool zeroEntry;
do {
stream1.next (d);
zeroEntry = false;
for (size_t i=0; i<stream1.n(); i++)
- zeroEntry |= R.isZero(d[i]);
+ zeroEntry |= R.isZero(d[(size_t)i]);
} while (zeroEntry);
// set up RHS
@@ -124,8 +126,8 @@ void generateProblem(const Ring& R, Matrix &D, Vector &b,
case I:
case diag: stream2.next (b);
// special case?
- if (n == 4) for (size_t i = 0; i < b.size(); ++i) b[i] = 2*(i+1);
- for (size_t i = 0; i < b.size(); ++i) b[i] %= randLim;
+ if (n == 4) for (size_t i = 0; i < b.size(); ++i) b[(size_t)i] = 2*(i+1);
+ for (size_t i = 0; i < b.size(); ++i) b[(size_t)i] %= randLim;
break;
// RHS with just first element 1
//case zo:
@@ -148,7 +150,7 @@ void generateProblem(const Ring& R, Matrix &D, Vector &b,
typename Ring::Element tmp;
switch (mt) {
case rand_near_sing: randomAns(R, D, n, n); break;
- case hilb: invhilb(R, D, n); break;
+ case hilb: invhilb(R, D, (int)n); break;
case Hadamard: hadamard(R, D, n); break;
case minIJ: minmat(R, D, n); break;
case maxIJ: maxmat(R, D, n); break;
@@ -156,7 +158,7 @@ void generateProblem(const Ring& R, Matrix &D, Vector &b,
case je1:
case je2: jordanform(R, D, n); break;
case rand_sp:
- randomMat(R, D, n, k); break;
+ randomMat(R, D, n, (size_t)k); break;
// modified for steffy's random model
/*
randomMat(R, D, n, n);
@@ -168,42 +170,42 @@ void generateProblem(const Ring& R, Matrix &D, Vector &b,
case diag:
{
//typename Ring::Element product;
- //R.init(product, 1);
+ //R.assign(product, R.one);
randLim = 100000;
- for(int i = 0; i < n; ++i) {
- int xx = d[i]%randLim;
+ for(int i = 0; i < (int)n; ++i) {
+ int xx = d[(size_t)i]%randLim;
if (xx == 0) xx = 1;
R.init (tmp, xx);
//R.mulin(product, tmp);
//if (n == 4) tmp = i+1;
//if (tmp == 4) tmp = -4;
- D.setEntry(i, i, tmp);
+ D.setEntry((size_t)i, (size_t)i, tmp);
}
}
break;
case tref: //trefethen(R, D, n); break;
case I:
- R.init(tmp, 1);
- for(int i = 0; i < n; ++i)
- D.setEntry(i, i, tmp);
+ R.assign(tmp, R.one);
+ for(int i = 0; i < (int)n; ++i)
+ D.setEntry((size_t)i, (size_t)i, tmp);
break;
case jordan2:
//randomMat(R, D, n, n);
- for(int i = 0; i < n; ++i){
- R.init(tmp, 1);
- D.setEntry(i, i, tmp);
- R.init(tmp, 0);
- for(int j = i+1; j < n; ++j)
- D.setEntry(i, j, tmp);
+ for(int i = 0; i < (int)n; ++i){
+ R.assign(tmp, R.one);
+ D.setEntry((size_t)i, (size_t)i, tmp);
+ R.assign(tmp, R.zero);
+ for(int j = i+1; j < (int)n; ++j)
+ D.setEntry((size_t)i,(size_t) j, tmp);
R.init(tmp, 2);
- if (i > 0) D.setEntry(i, i-1, tmp);
+ if (i > 0) D.setEntry((size_t)i, (size_t)i-1, tmp);
}
break;
case zo:
- for(int i = 0; i < n; ++i)
- for(int j = 0; j < n; ++j){
+ for(int i = 0; i < (int)n; ++i)
+ for(int j = 0; j < (int)n; ++j){
R.init(tmp, rand()%2);
- D.setEntry(i, j, tmp);
+ D.setEntry((size_t)i, (size_t)j, tmp);
}
break;
}
@@ -217,15 +219,15 @@ void generateProblem(const Ring& R, Matrix &D, Vector &b,
template <class Ring, class RSolver, class Matrix, class Vector>
bool testRandomSolve (const Ring& R, RSolver& rsolver, Matrix& D, Vector &b) {
- int n = (int) b.size();
- Vector d, tmpb, x, y;
+ size_t n = (size_t) b.size();
+ Vector d(R), tmpb(R), x(R), y(R);
VectorWrapper::ensureDim (d, n);
VectorWrapper::ensureDim (x, n);
VectorWrapper::ensureDim (y, n);
VectorWrapper::ensureDim (tmpb, n);
VectorDomain<Ring> VD (R);
- for(int i=0; i<n; ++i) tmpb[i] = b[i];
+ for(int i=0; i<(int)n; ++i) tmpb[(size_t)i] = b[(size_t)i];
//std::ostringstream str;
//std::ostream &report = cerr;
@@ -237,7 +239,7 @@ bool testRandomSolve (const Ring& R, RSolver& rsolver, Matrix& D, Vector &b) {
VD.write (report << "Right-hand side: ", b) << endl;
}
- std::vector<typename Ring::Element> num(n);
+ BlasVector<Ring> num(R,n);
typename Ring::Element den;
Timer timer;
@@ -318,28 +320,29 @@ int main(int argc, char** argv) {
std::ostream &report = commentator().report (Commentator::LEVEL_IMPORTANT, INTERNAL_DESCRIPTION);
- typedef PID_integer Ring; Ring R;
+ typedef Givaro::ZRing<Integer> Ring;
+ Ring R; Ring::RandIter gen(R);
typedef ParamFuzzy Field;
- typedef Modular<int32_t> ZField;
- typedef Modular<double> DField;
+ typedef Givaro::Modular<int64_t> ZField;
+ typedef Givaro::Modular<double> DField;
typedef BlasMatrix<Field> Matrix;
typedef BlasMatrix<Ring> CommonMatrix;
- typedef vector<Ring::Element> Vector;
+ typedef BlasVector<Ring> Vector;
if(mt == Hadamard)
n = nextPower2(n);
- RandomDenseStream<Ring> s1 (R, n, 1), s2 (R, n, 1);
+ RandomDenseStream<Ring> s1 (R, gen, n, 1), s2 (R, gen, n, 1);
CommonMatrix A(R, n, n);
- Vector b(n);
+ Vector b(R,n);
generateProblem(R, A, b, s1, s2, mt, (int) k);
if(run & 1){
if (sizeof(int) < 8) {
-
+
report << "numsym: not done. Requires 64 bit architecture." << std::endl << std::endl;
} else {
/* choose your numerical solver */
@@ -381,13 +384,18 @@ int main(int argc, char** argv) {
}
pass = pass && part_pass;
if(run & 2){
- RationalSolver<Ring, ZField, RandomPrimeIterator, WanTraits> rsolver(R);
+ if (sizeof(int) < 8) {
+
+ report << "zw: not done. Requires 64 bit architecture (maybe, needs checking -bds)." << std::endl << std::endl;
+ } else {
+ RationalSolver<Ring, ZField, RandomPrimeIterator, NumSymNormTraits> rsolver(R);
part_pass = testRandomSolve(R, rsolver, A, b);
report << "zw: " << (part_pass ? "pass" : "fail") << std::endl << std::endl;
+ }
}
pass = pass && part_pass;
if(run & 4){
- RandomPrimeIterator genprime( 26-(int)ceil(log((double)n)*0.7213475205) );
+ RandomPrimeIterator genprime((unsigned int)( 26-(int)ceil(log((double)n)*0.7213475205) ));
RationalSolver<Ring, DField, RandomPrimeIterator, DixonTraits> rsolver(R, genprime);
part_pass = testRandomSolve(R, rsolver, A, b);
report << "dixon: " << (part_pass ? "pass" : "fail") << std::endl << std::endl;
diff --git a/tests/test-solve.C b/tests/test-solve.C
index d09d143..da555d2 100644
--- a/tests/test-solve.C
+++ b/tests/test-solve.C
@@ -6,20 +6,20 @@
*
* --------------------------------------------------------
*
- *
+ *
* ========LICENCE========
* This file is part of the library LinBox.
- *
+ *
* LinBox is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
- *
+ *
* This library 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
* Lesser General Public License for more details.
- *
+ *
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
@@ -38,12 +38,11 @@
#include <iostream>
#include <fstream>
-#include <vector>
#include <cstdio>
#include "linbox/util/commentator.h"
-#include "linbox/field/modular.h"
-#include "linbox/blackbox/sparse.h"
+#include "linbox/ring/modular.h"
+#include "linbox/matrix/sparse-matrix.h"
#include "linbox/blackbox/scalar-matrix.h"
#include "linbox/blackbox/direct-sum.h"
//#include "linbox/blackbox/diagonal.h"
@@ -85,25 +84,25 @@ static bool testIdentitySolve (const Field &F,
commentator().start (str.str ().c_str (), "testIdentitySolve", stream.m ());
bool ret = true;
- bool iter_passed = true;
VectorDomain<Field> VD (F);
typename Field::Element s;
- F.init (s, 1);
- Blackbox I (F, stream.n (), s);
+ F.assign (s, F.one);
+ Blackbox I (F, stream.n (), stream.n(), s);
- Vector v, w;
+ size_t n = stream.n();
+ Vector v(F,n), w(F,n);
- VectorWrapper::ensureDim (v, stream.n ());
- VectorWrapper::ensureDim (w, stream.n ());
+ // VectorWrapper::ensureDim (v, stream.n ());
+ // VectorWrapper::ensureDim (w, stream.n ());
MethodTraits traits (method);
while (stream) {
commentator().startIteration ((unsigned)stream.j ());
- iter_passed = true;
+ bool iter_passed = true;
stream.next (v);
@@ -113,7 +112,8 @@ static bool testIdentitySolve (const Field &F,
report << endl;
try {
- solve (I, w, v, F, traits);
+ solve (w, I, v, method);
+ //solve (I, w, v, F, traits);
}
catch (SolveFailed) {
commentator().report (Commentator::LEVEL_IMPORTANT, INTERNAL_ERROR)
@@ -181,14 +181,14 @@ static bool testNonsingularSolve (const Field &F,
VectorDomain<Field> VD (F);
bool ret = true;
- bool iter_passed;
- Vector d, b, x, y;
+ size_t n= stream1.n ();
+ Vector d(F,n), b(F,n), x(F,n), y(F,n);
- VectorWrapper::ensureDim (d, stream1.n ());
- VectorWrapper::ensureDim (b, stream1.n ());
- VectorWrapper::ensureDim (x, stream1.n ());
- VectorWrapper::ensureDim (y, stream1.n ());
+ // VectorWrapper::ensureDim (d, stream1.n ());
+ // VectorWrapper::ensureDim (b, stream1.n ());
+ // VectorWrapper::ensureDim (x, stream1.n ());
+ // VectorWrapper::ensureDim (y, stream1.n ());
MethodTraits traits (method);
@@ -197,7 +197,7 @@ static bool testNonsingularSolve (const Field &F,
ActivityState state = commentator().saveActivityState ();
- iter_passed = true;
+ bool iter_passed = true;
stream1.next (d);
stream2.next (b);
@@ -211,10 +211,11 @@ static bool testNonsingularSolve (const Field &F,
VD.write (report, b);
report << endl;
- Blackbox D (F, d);
+ BlasVector<Field> dd(F,d);
+ Blackbox D (dd);
try {
- solve (D, x, b, F, traits);
+ solve (x, D, b, method);
}
catch (SolveFailed) {
commentator().restoreActivityState (state);
@@ -294,7 +295,6 @@ static bool testSingularConsistentSolve (const Field &F,
VectorDomain<Field> VD (F);
bool ret = true;
- bool iter_passed;
Vector d1, b1, d, b, x, y;
@@ -313,7 +313,6 @@ static bool testSingularConsistentSolve (const Field &F,
ActivityState state = commentator().saveActivityState ();
- iter_passed = true;
stream1.next (d1);
stream2.next (b1);
@@ -330,9 +329,12 @@ static bool testSingularConsistentSolve (const Field &F,
VD.write (report, b);
report << endl;
- Blackbox D (F, d);
+ BlasVector<Field> dd(F,d);
+ Blackbox D (dd);
+ //Blackbox D (d);
try {
+ bool iter_passed = true;
solve (D, x, b, F, traits);
report << "System solution: ";
@@ -446,7 +448,9 @@ static bool testSingularInconsistentSolve (const Field &F,
VD.write (report, b);
report << endl;
- Blackbox D (F, d);
+ BlasVector<Field> dd(F,d);
+ Blackbox D (dd);
+ //Blackbox D (d);
status = solve (D, x, b, u, F, traits);
@@ -523,8 +527,6 @@ static bool testSingularPreconditionedSolve (const Field &F,
const char *text,
Method::Wiedemann::Preconditioner preconditioner)
{
- typedef SparseMatrix <Field> Blackbox;
-
ostringstream str;
str << "Testing singular preconditioned solve (" << text << ")";
@@ -545,9 +547,7 @@ static bool testSingularPreconditionedSolve (const Field &F,
VectorWrapper::ensureDim (x, stream2.dim ());
VectorWrapper::ensureDim (y, stream2.dim ());
- typename Field::Element one;
- F.init (one, 1);
Method::Wiedemann traits;
traits.preconditioner (preconditioner);
@@ -569,7 +569,9 @@ static bool testSingularPreconditionedSolve (const Field &F,
VD.write (report, b);
report << endl;
- Diagonal<Field> A (F, d);
+ BlasVector<Field> dd(F,d);
+ Diagonal<Field> A (dd);
+ //Diagonal<Field> A (F, d);
status = solve (A, x, b, u, F, traits);
@@ -640,7 +642,6 @@ static bool testRandomSolve (const Field &F,
commentator().start (str.str ().c_str (), "testRandomSolve", b_stream.size ());
bool ret = true;
- bool iter_passed = true;
VectorDomain<Field> VD (F);
MatrixDomain<Field> MD (F);
@@ -653,7 +654,7 @@ static bool testRandomSolve (const Field &F,
VectorWrapper::ensureDim (ATb, A_stream.dim ());
SparseMatrix<Field> A (F, A_stream);
- SparseMatrixBase<typename Field::Element> AT (A.coldim (), A.rowdim ());
+ SparseMatrix<Field> AT (F,A.coldim (), A.rowdim ());
BlasMatrix<Field> ATA (A.coldim (), A.coldim ());
A.transpose (AT);
@@ -672,7 +673,7 @@ static bool testRandomSolve (const Field &F,
while (b_stream) {
commentator().startIteration ((unsigned)b_stream.pos ());
- iter_passed = true;
+ bool iter_passed = true;
b_stream >> b;
@@ -729,12 +730,10 @@ static bool testBasicMethodsSolve (const Field &F, size_t n)
commentator().start ("Testing Basic Methods Solve");
ostream &report = commentator().report (Commentator::LEVEL_UNIMPORTANT, INTERNAL_DESCRIPTION);
- typedef typename Field::Element Elt;
- Elt one, zero; F.init(one, 1); F.init(zero, 0);
- vector<Elt> xd(n), xh(n), xb(n), xe(n), b(n, zero);
- for(size_t i = 0; i < n/2; ++i) b[i] = one;
- //ScalarMatrix<Field> I(F, n/2, one), Z(F, n/2, zero);
- ScalarMatrix<Field> I(F, n, one), Z(F, 0, zero);
+ BlasVector<Field> xd(F,n), xh(F,n), xb(F,n), xe(F,n), b(F,n, F.zero);
+ for(size_t i = 0; i < n/2; ++i) b[i] = F.one;
+ //ScalarMatrix<Field> I(F, n/2, F.one), Z(F, n/2, F.zero);
+ ScalarMatrix<Field> I(F, n, n, F.one), Z(F, 0, 0, F.zero);
DirectSum<ScalarMatrix<Field>, ScalarMatrix<Field> > A(I, Z);
VectorDomain<Field> VD(F);
@@ -765,7 +764,7 @@ int main (int argc, char **argv)
static size_t m = 100;
static size_t r = 20;
static size_t N = 16;
- static integer q = 2147483647U;
+ static integer q = 65521U;
static int iterations = 1;
static Argument args[] = {
@@ -778,10 +777,10 @@ int main (int argc, char **argv)
END_OF_ARGUMENTS
};
- typedef Modular<uint32_t> Field;
+ typedef Givaro::Modular<int64_t> Field;
parseArguments (argc, argv, args);
- Field F (q);
+ Field F (q); Field::RandIter gen(F);
commentator().start("Solve test suite", "solve");
@@ -792,18 +791,24 @@ int main (int argc, char **argv)
commentator().getMessageClass (PROGRESS_REPORT).setMaxDepth (5);
//commentator().getMessageClass (BRIEF_REPORT).setMaxDepth (4);
- RandomDenseStream<Field> stream1 (F, n, iterations), stream2 (F, n, iterations);
- RandomDenseStream<Field> stream3 (F, r, iterations), stream4 (F, r, iterations);
- RandomSparseStream<Field> stream6 (F, (double) r / (double) n, n, iterations);
- RandomSparseStream<Field> A_stream (F, (double) r / (double) n, n, m);
+ RandomDenseStream<Field> stream1 (F, gen, n, (unsigned int)iterations), stream2 (F, gen, n, (unsigned int)iterations);
+ RandomDenseStream<Field> stream3 (F, gen, r, (unsigned int)iterations), stream4 (F, gen, r, (unsigned int)iterations);
+ RandomSparseStream<Field> stream6 (F, gen, (double) r / (double) n, n, (unsigned int)iterations);
+ RandomSparseStream<Field> A_stream (F, gen, (double) r / (double) n, n, m);
- if (!testIdentitySolve (F, stream1,
-// "BlockLanczos", Method::BlockLanczos()))
- "Wiedemann", Method::Wiedemann ()))
+ Method::Wiedemann WM;
+ if (!testIdentitySolve (F, stream1, "Wiedemann", WM))
pass = false;
- if (!testNonsingularSolve (F, stream1, stream2,
- "Wiedemann", Method::Wiedemann ()))
+ if (!testNonsingularSolve (F, stream1, stream2, "Wiedemann", WM))
+ pass = false;
+#if 1
+ Method::BlockWiedemann BWM;
+ if (!testIdentitySolve (F, stream1, "BlockWiedemann", BWM))
+ pass = false;
+ if (!testNonsingularSolve (F, stream1, stream2, "BlockWiedemann", BWM))
pass = false;
+#endif
+
#if 0
if (!testSingularConsistentSolve (F, n, stream3, stream4,
"Wiedemann", Method::Wiedemann ()))
@@ -811,9 +816,15 @@ int main (int argc, char **argv)
if (!testSingularInconsistentSolve (F, stream3, stream2,
"Wiedemann", Method::Wiedemann ()))
pass = false;
+#endif
+
+#if 0
if (!testSingularPreconditionedSolve (F, stream6, stream2,
"Sparse preconditioner", Method::Wiedemann::SPARSE))
pass = false;
+#endif
+
+#if 0
if (!testIdentitySolve (F, stream1,
"Lanczos", Method::Lanczos ()))
pass = false;
@@ -829,8 +840,9 @@ int main (int argc, char **argv)
if (!testRandomSolve (F, A_stream, stream1, "Lanczos", traits1))
pass = false;
+#endif
-
+#if 0
Method::BlockLanczos traits2;
traits2.preconditioner (Method::BlockLanczos::FULL_DIAGONAL);
traits2.blockingFactor (N);
@@ -847,11 +859,10 @@ int main (int argc, char **argv)
return pass ? 0 : -1;
}
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
// Local Variables:
// mode: C++
// tab-width: 8
// indent-tabs-mode: nil
// c-basic-offset: 8
// End:
-
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/tests/test-sparse-map-map.C b/tests/test-sparse-map-map.C
new file mode 100644
index 0000000..c10d92d
--- /dev/null
+++ b/tests/test-sparse-map-map.C
@@ -0,0 +1,261 @@
+
+#include "linbox/linbox-config.h"
+#include "linbox/util/commentator.h"
+
+#include "linbox/ring/modular.h"
+#include "linbox/matrix/sparse-matrix.h"
+#include "linbox/matrix/matrix-domain.h"
+#include "linbox/matrix/sparsematrix/sparse-map-map-matrix.h"
+#include "linbox/solutions/charpoly.h"
+#include "linbox/algorithms/coppersmith-invariant-factors.h"
+#include "linbox/vector/blas-vector.h"
+
+#include "tests/test-blackbox.h"
+
+#include <fflas-ffpack/ffpack/ffpack.h>
+
+using namespace LinBox;
+
+template <class Field>
+class SMMTests {
+public:
+ typedef typename Field::Element Element;
+ typedef SparseMatrix<Field,SparseMatrixFormat::SMM> SparseMat;
+
+ static bool runBasicTests(Field& F, int n, int m)
+ {
+ bool pass=true;
+ stringstream ss;
+ ss << "Running basic tests with n=" << n << " m=" << m;
+ commentator().start(ss.str().c_str(),0,3);
+ pass=pass&&testNNZ(F,n,m);
+ pass=pass&&testPattern(F,n,m);
+ pass=pass&&testSMMBlackbox(F,n,m);
+ commentator().stop(MSG_STATUS(pass));
+ return pass;
+ }
+
+ static void setMatPattern(SparseMat& M, const Element& startVal)
+ {
+ Field F=M.field();
+ int m=M.rowdim(),n=M.coldim();
+ Element d;
+ F.assign(d,startVal);
+ for (int i=0;i<m;++i) {
+ for (int j=0;j<n;++j) {
+ F.addin(d,F.one);
+ M.setEntry(i,j,d);
+ if (j==i-1) {
+ // test overwriting
+ M.setEntry(i,j,F.zero);
+ }
+ }
+ }
+ }
+
+ static bool testMatPattern(SparseMat& M, const Element& startVal)
+ {
+ Field F=M.field();
+ int m=M.rowdim(),n=M.coldim();
+ Element d,e;
+ F.assign(d,startVal);
+ for (int i=0;i<m;++i) {
+ for (int j=0;j<n;++j) {
+ F.addin(d,F.one);
+ M.getEntry(e,i,j);
+ if (j==i-1) {
+ if (!F.isZero(e)) {
+ return false;
+ }
+ } else {
+ if (!F.areEqual(d,e)) {
+ return false;
+ }
+ }
+ }
+ }
+ return true;
+ }
+
+ static bool testNNZ(Field& F,int n, int m)
+ {
+ commentator().start("Testing nnz()");
+ SparseMat M(F,n,m);
+ size_t nnz=0;
+ if (M.nnz() != 0) {
+ commentator().stop(MSG_FAILED);
+ return false;
+ }
+ for (int i=0;i<m;++i) {
+ for (int j=0;j<n;++j) {
+ M.setEntry(i,j,F.one);
+ ++nnz;
+ if (M.nnz() != nnz) {
+ commentator().stop(MSG_FAILED);
+ return false;
+ }
+ }
+ }
+ for (int i=0;i<m;++i) {
+ for (int j=0;j<n;++j) {
+ M.setEntry(i,j,F.zero);
+ --nnz;
+ if (M.nnz() != nnz) {
+ commentator().stop(MSG_FAILED);
+ return false;
+ }
+ }
+ }
+ if (!M.verify()) {
+ commentator().stop(MSG_FAILED);
+ return false;
+ }
+ commentator().stop(MSG_PASSED);
+ return true;
+ }
+
+ static bool testPattern(Field& F, int n, int m)
+ {
+ commentator().start("Testing matrix overwrites");
+ SparseMat M(F,n,m);
+ bool pass=true;
+
+ setMatPattern(M,F.zero);
+ pass=pass&&testMatPattern(M,F.zero);
+ pass=pass&&M.verify();
+
+ //Write over old matrix with values offset by 1
+ setMatPattern(M,F.one);
+ pass=pass&&testMatPattern(M,F.one);
+ pass=pass&&M.verify();
+
+ commentator().stop(MSG_STATUS(pass));
+ return pass;
+ }
+
+ static bool testSMMBlackbox(Field& F, int n, int m)
+ {
+ commentator().start("Running testBlackbox()");
+ SparseMat M(F,m,n);
+ setMatPattern(M,F.zero);
+ bool pass=testBlackbox(M,true);
+ commentator().stop(MSG_STATUS(pass));
+ return pass;
+ }
+
+ static bool testSim(Field& F, int n, int b)
+ {
+ stringstream ss;
+ ss << "Testing randomSim() with n=" << n << " b=" << b;
+ commentator().start(ss.str().c_str());
+
+ SparseMat M(F,n,n);
+ Element d;
+ F.init(d,0);
+ for (int i=0;i<n;++i) {
+ F.addin(d,F.one);
+ M.setEntry(i,i,d);
+ }
+
+ typedef CoppersmithInvariantFactors<Field,SparseMat> FactorDomain;
+ typedef typename FactorDomain::PolyDom PolyDom;
+ typedef typename FactorDomain::PolyRing PolyRing;
+ typedef BlasVector<PolyRing> FactorVector;
+ PolyDom PD(F,"x");
+ PolyRing R(PD);
+
+ FactorVector MFactors(R);
+ FactorDomain MCFD(F,M,b);
+ int numMFactors=MCFD.computeFactors(MFactors);
+
+ linbox_check(n>=2);
+ M.randomSim(2*n);
+
+ FactorVector QFactors(R);
+ FactorDomain QCFD(F,M,b);
+ int numQFactors=QCFD.computeFactors(QFactors);
+
+ if (numMFactors != numQFactors) {
+ commentator().stop(MSG_FAILED);
+ return false;
+ }
+
+ for (int i=0;i<numQFactors;++i) {
+ if (!R.areEqual(QFactors[i],MFactors[i])) {
+ commentator().stop(MSG_FAILED);
+ return false;
+ }
+ }
+ commentator().stop(MSG_PASSED);
+ return true;
+ }
+};
+
+template <class Field>
+bool basicTestSuite(Field& F)
+{
+ bool pass=true;
+ commentator().start("Basic tests",0,5);
+ pass=pass&&SMMTests<Field>::runBasicTests(F,10,10);
+ pass=pass&&SMMTests<Field>::runBasicTests(F,1,10);
+ pass=pass&&SMMTests<Field>::runBasicTests(F,2,10);
+ pass=pass&&SMMTests<Field>::runBasicTests(F,10,2);
+ pass=pass&&SMMTests<Field>::runBasicTests(F,10,1);
+ commentator().stop(MSG_STATUS(pass));
+ return pass;
+}
+
+template <class Field>
+bool matGenTestSuite(Field& F)
+{
+ bool pass=true;
+ commentator().start("Testing randomSim()");
+ pass=pass&&SMMTests<Field>::testSim(F,10,10);
+ commentator().stop(MSG_STATUS(pass));
+ return pass;
+}
+
+template <class Field>
+bool fieldTestSuite(Field& F)
+{
+ bool pass=true;
+ stringstream ss;
+ ss << "Testing SMM with Field ";
+ F.write(ss);
+ commentator().start(ss.str().c_str());
+ pass=pass&&basicTestSuite(F);
+ pass=pass&&matGenTestSuite(F);
+ commentator().stop(MSG_STATUS(pass));
+ return pass;
+}
+
+bool testSuite()
+{
+ bool pass=true;
+ Givaro::Modular<double> DoubleSmallField(3),DoubleLargeField(67108859);
+ pass=pass&&fieldTestSuite(DoubleSmallField);
+ pass=pass&&fieldTestSuite(DoubleLargeField);
+
+ Givaro::Extension<Givaro::Modular<double> > ExtField(DoubleSmallField,3);
+ pass=pass&&fieldTestSuite(ExtField);
+ return pass;
+}
+
+int main(int argc, char** argv)
+{
+ static Argument args[] = {
+ END_OF_ARGUMENTS
+ };
+ parseArguments (argc, argv, args);
+
+ commentator().start("Testing sparse-map-map-matrix");
+
+ bool pass=testSuite();
+
+ commentator().stop(MSG_STATUS(pass));
+
+ return pass?0:-1;
+}
+
+
+
diff --git a/tests/test-sparse.C b/tests/test-sparse.C
index eab10e3..9595387 100644
--- a/tests/test-sparse.C
+++ b/tests/test-sparse.C
@@ -1,25 +1,25 @@
-
/* tests/test-sparse.C
- * Copyright (C) 2001, 2002 Bradford Hovinen
+ * Copyright (C) 2014 the LinBox group
*
- * Written by Bradford Hovinen <hovinen at cis.udel.edu>
+ * Written by bds <saunders at udel.edu>
+ * Brice Boyer (briceboyer) <boyer.brice at gmail.com>
*
* --------------------------------------------------------
*
- *
+ *
* ========LICENCE========
* This file is part of the library LinBox.
- *
+ *
* LinBox is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
- *
+ *
* This library 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
* Lesser General Public License for more details.
- *
+ *
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
@@ -40,526 +40,76 @@
#include <iostream>
#include <fstream>
#include <sstream>
-#include <vector>
+
#include "linbox/util/commentator.h"
-#include "linbox/field/modular.h"
-#include "linbox/blackbox/sparse.h"
-#include "linbox/vector/vector-traits.h"
-#include "linbox/vector/stream.h"
-#include "linbox/vector/vector-domain.h"
-#include "linbox/randiter/nonzero.h"
+#include "linbox/ring/modular.h"
+#include "linbox/matrix/sparse-matrix.h"
-#include "test-common.h"
-#include "test-generic.h"
+
+#include "test-blackbox.h"
using namespace LinBox;
-/* Test 1: Application of identity matrix onto random vectors
- *
- * Construct the identity matrix and a series of randomly-generated
- * vectors. Apply the identity to each vector and test whether the input and
- * output are equal.
- *
- * F - Field over which to perform computations
- * n - Dimension to which to make matrix
- *
- * Return true on success and false on failure
- */
+template <class SM, class SM2>
+bool buildBySetGetEntry(SM & A, const SM2 &B);
-template <class Row, class Field, class Vector>
-static bool testIdentityApply (Field &F, const char *text, VectorStream<Vector> &stream)
+template <class Field, class SMF>
+bool testSparseFormat(string format, const SparseMatrix<Field> & S1)
{
- typedef SparseMatrix <Field, Row> Blackbox;
-
- ostringstream str;
- str << "Testing identity apply (" << text << ")" << ends;
- commentator().start (str.str ().c_str (), "testIdentityApply", stream.m ());
-
- bool ret = true;
- bool iter_passed = true;
-
- VectorDomain<Field> VD (F);
- StandardBasisStream<Field, Row> f1 (F, stream.n ());
- Blackbox A (F, f1);
-
- ostream &report = commentator().report (Commentator::LEVEL_UNIMPORTANT, INTERNAL_DESCRIPTION);
- report << "Matrix:" << endl;
- A.write (report, FORMAT_PRETTY);
-
- Vector v, w;
-
- VectorWrapper::ensureDim (v, stream.n ());
- VectorWrapper::ensureDim (w, stream.n ());
-
- while (stream) {
- commentator().startIteration ((unsigned)stream.j ());
-
- iter_passed = true;
-
- stream.next (v);
-
- ostream &Report = commentator().report (Commentator::LEVEL_UNIMPORTANT, INTERNAL_DESCRIPTION);
- Report << "Input vector: ";
- VD.write (Report, v);
- Report << endl;
-
- A.apply (w, v);
-
- Report << "Output vector: ";
- VD.write (Report, w);
- Report << endl;
-
- if (!VD.areEqual (v, w))
- ret = iter_passed = false;
-
- if (!iter_passed)
- commentator().report (Commentator::LEVEL_IMPORTANT, INTERNAL_ERROR)
- << "ERROR: Vectors are not equal" << endl;
-
- commentator().stop ("done");
- commentator().progress ();
+ typedef SparseMatrix<Field, SMF> SM;
+ bool pass=true;
+ string msg = "SparseMatrix<Field, SparseMatrixFormat::" + format + ">";
+ commentator().start(msg.c_str(), format.c_str());
+ const typename SM::Field& F = S1.field();
+ MatrixDomain<typename SM::Field> MD(F);
+ SM S2(F,S1.rowdim(),S1.coldim());
+ SM S3(F,S1.rowdim(),S1.coldim());
+ buildBySetGetEntry(S2, S1);
+ buildBySetGetEntry(S3, S2);
+ // behaves as a blackbox should
+ if ( ! testBlackbox(S2,true) ) {
+ msg = format + " FAIL(testBlackbox)";
+ commentator().stop(msg.c_str());
+ pass = false;
}
-
- stream.reset ();
-
- commentator().stop (MSG_STATUS (ret), (const char *) 0, "testIdentityApply");
-
- return ret;
-}
-
-/* Test 2: Application of nilpotent linear map to random vectors
- *
- * Generates an index-n nilpotent linear map and applies it to randomly
- * generated vectors n times. Generates the vectors so that they are guaranteed
- * to be outside the matrix's index- n-1 subspace; tests to make sure the
- * vectors do not prematurely reach zero.
- *
- * F - Field over which to perform computations
- * n - Dimension to which to make matrix
- *
- * Return true on success and false on failure
- */
-
-template <class Row, class Field, class Vector>
-static bool testNilpotentApply (Field &F, const char *text, VectorStream<Vector> &stream)
-{
- typedef SparseMatrix <Field, Row> Blackbox;
-
- ostringstream str;
- str << "Testing nilpotent apply (" << text << ")" << ends;
- commentator().start (str.str ().c_str (), "testNilpotentApply", stream.m ());
-
- bool ret = true;
- bool even, iter_passed;
-
- StandardBasisStream<Field, Row> f1 (F, stream.n ());
- Row tmp;
- f1.next (tmp); // Small trick: pull the first vector out to shift elements up one row
- Blackbox A (F, f1);
-
- ostream &report = commentator().report (Commentator::LEVEL_UNIMPORTANT, INTERNAL_DESCRIPTION);
- report << "Matrix:" << endl;
- A.write (report, FORMAT_PRETTY);
-
- size_t j;
- NonzeroRandIter<Field> r (F, typename Field::RandIter (F));
-
- VectorDomain<Field> VD (F);
- Vector v, w;
-
- VectorWrapper::ensureDim (v, stream.n ());
- VectorWrapper::ensureDim (w, stream.n ());
-
- while (stream) {
- commentator().startIteration ((unsigned)stream.j ());
-
- iter_passed = true;
- even = false;
-
- stream.next (v);
-
- // Make sure last element is nonzero
- r.random (VectorWrapper::ref<Field> (v, stream.n () - 1));
-
- ostream &Report = commentator().report (Commentator::LEVEL_UNIMPORTANT, INTERNAL_DESCRIPTION);
- Report << "Input vector: ";
- VD.write (Report, v);
- Report << endl;
-
- commentator().start ("Applying vectors");
-
- for (j = 0; j < stream.n () - 1; j++, even = !even)
- if (even)
- A.apply (v, w);
- else
- A.apply (w, v);
-
- commentator().stop ("Done");
-
- Report << "A^(n-1) v: ";
- VD.write (Report, even ? w : v);
- Report << endl;
-
- if (VD.isZero (even ? w : v)) {
- ret = false;
- commentator().report (Commentator::LEVEL_IMPORTANT, INTERNAL_ERROR)
- << "ERROR: A^(n-1) v is prematurely zero" << endl;
- }
-
- if (even)
- A.apply (v, w);
- else
- A.apply (w, v);
-
- Report << "A^n v: ";
- VD.write (Report, even ? v : w);
- Report << endl;
-
- if (!VD.isZero (even ? v : w))
- ret = iter_passed = false;
-
- if (!iter_passed)
- commentator().report (Commentator::LEVEL_IMPORTANT, INTERNAL_ERROR)
- << "ERROR: A^n v is non-zero" << endl;
-
- commentator().stop ("done");
- commentator().progress ();
+ // equal behaviour when representing same mat
+ else if ( ! MD.areEqual(S1,S2) ) {
+ msg = format + " FAIL(areEqual)";
+ commentator().stop(msg.c_str());
+ pass = false;
}
-
- stream.reset ();
-
- commentator().stop (MSG_STATUS (ret), (const char *) 0, "testNilpotentApply");
-
- return ret;
-}
-
-/* Test 3: Random apply to sparse matrix of K nonzero elements per row
- *
- * Generates a random sparse matrix with K nonzero elements per row and applies
- * it to the vectors {e_i | i=1..n} to test whether the output matches the ith
- * column of the matrix.
- *
- * F - Field over which to perform computations
- * n - Dimension to which to make matrix
- * K - Number of nonzero elements per row
- *
- * Return true on success and false on failure
- */
-
-template <class Vector, class Row, class Field>
-bool testRandomApply1 (Field &F, const char *text, unsigned int iterations, VectorStream<Row> &A_stream)
-{
- typedef SparseMatrix <Field, Row> Blackbox;
-
- ostringstream str;
- str << "Testing sparse random apply (1, " << text << ")" << ends;
- commentator().start (str.str ().c_str (), "testRandomApply1", iterations);
-
- bool ret = true;
- bool iter_passed;
-
- size_t i, k;
-
- VectorDomain<Field> VD (F);
-
- StandardBasisStream<Field, Vector> stream (F, A_stream.n ());
- Vector e_j, w;
-
- VectorWrapper::ensureDim (e_j, A_stream.n ());
- VectorWrapper::ensureDim (w, A_stream.m ());
-
- for (i = 0; i < iterations; i++) {
- commentator().startIteration ((unsigned)i);
-
- iter_passed = true;
-
- Blackbox A (F, A_stream);
- A_stream.reset ();
-
- ostream &report = commentator().report (Commentator::LEVEL_UNIMPORTANT, INTERNAL_DESCRIPTION);
- report << "Matrix:" << endl;
- A.write (report, FORMAT_PRETTY);
-
- stream.reset ();
-
- while (stream) {
- stream.next (e_j);
-
- A.apply (w, e_j);
-
- for (k = 0; k < A_stream.m (); k++)
- if (!F.areEqual (A.getEntry (k, stream.j () - 1), VectorWrapper::constRef<Field> (w, k)))
- ret = iter_passed = false;
-
- report << "Output vector " << stream.j () << ": ";
- VD.write (report, w) << endl;
- }
-
- if (!iter_passed)
- commentator().report (Commentator::LEVEL_IMPORTANT, INTERNAL_ERROR)
- << "ERROR: Output vectors were incorrect" << endl;
-
- commentator().stop ("done");
- commentator().progress ();
+ // just a check of S2 getEntry
+ else if ( ! MD.areEqual(S3,S2) ) {
+ msg = format + " FAIL(getEntry)";
+ commentator().stop(msg.c_str());
+ pass = false;
}
-
- commentator().stop (MSG_STATUS (ret), (const char *) 0, "testRandomApply1");
-
- return ret;
-}
-
-/* Test 5: Random apply to sparse matrix of K nonzero elements per row
- *
- * Generates a random sparse matrix with K nonzero elements per row and applies
- * it to the vectors (1,1,...,1) to test whether the output matches the sum of
- * the input's columns
- *
- * F - Field over which to perform computations
- * n - Dimension to which to make matrix
- * K - Number of nonzero elements per row
- *
- * Return true on success and false on failure
- */
-
-template <class Vector, class Row, class Field>
-bool testRandomApply2 (Field &F, const char *text, unsigned int iterations, VectorStream<Row> &A_stream)
-{
- typedef SparseMatrix <Field, Row> Blackbox;
-
- ostringstream str;
- str << "Testing sparse random apply (2, " << text << ")" << ends;
- commentator().start (str.str ().c_str (), "testRandomApply2", iterations);
-
- bool ret = true;
- bool iter_passed;
-
- size_t i, j, k;
-
- VectorDomain<Field> VD (F);
- typename Field::RandIter r (F);
- typename Field::Element sum;
-
- integer c;
- // long width;
-
- F.characteristic (c);
- // width = logp (c, 10) + 1;
-
- Vector v, w;
-
- VectorWrapper::ensureDim (v, A_stream.n ());
- VectorWrapper::ensureDim (w, A_stream.m ());
-
- for (k = 0; k < A_stream.n (); k++)
- F.init (VectorWrapper::ref<Field> (v, k), 1);
-
- for (i = 0; i < iterations; i++) {
- commentator().startIteration ((unsigned)i);
-
- iter_passed = true;
-
- Blackbox A (F, A_stream);
- A_stream.reset ();
-
- ostream &report = commentator().report (Commentator::LEVEL_UNIMPORTANT, INTERNAL_DESCRIPTION);
- report << "Matrix:" << endl;
- A.write (report, FORMAT_PRETTY);
-
- A.apply (w, v);
-
- for (j = 0; j < A_stream.m (); j++) {
- F.init (sum, 0);
-
- for (k = 0; k < A_stream.n (); k++)
- F.addin (sum, A.getEntry (j, k));
-
- if (!F.areEqual (sum, VectorWrapper::constRef<Field> (w, j)))
- ret = iter_passed = false;
- }
-
- report << "Output vector: ";
- VD.write (report, w) << endl;
-
- if (!iter_passed)
- commentator().report (Commentator::LEVEL_IMPORTANT, INTERNAL_ERROR)
- << "ERROR: Output vector was incorrect" << endl;
-
- commentator().stop ("done");
- commentator().progress ();
+ else {
+ msg = format + " pass";
+ commentator().stop(msg.c_str());
}
-
- commentator().stop (MSG_STATUS (ret), (const char *) 0, "testRandomApply2");
-
- return ret;
-}
-
-/* Test 6: Random transpose
- *
- * Construct a random sparse matrix and check that the output of applyTranspose
- * is consistent with the output of apply
- *
- * F - Field over which to perform computations
- * n - Dimension to which to make matrix
- * iterations - Number of random vectors to which to apply matrix
- *
- * Return true on success and false on failure
- */
-
-template <class Row, class Field, class Vector>
-static bool testRandomTranspose (Field &F,
- const char *text,
- VectorStream<Row> &A_stream,
- VectorStream<Vector> &stream1,
- VectorStream<Vector> &stream2)
-{
- typedef SparseMatrix <Field, Row> Blackbox;
-
- ostringstream str;
- str << "Testing random transpose (" << text << ")" << ends;
- commentator().start (str.str ().c_str (), "testRandomTranspose", stream1.m ());
-
- Blackbox A (F, A_stream);
- A_stream.reset ();
-
- ostream &report = commentator().report (Commentator::LEVEL_UNIMPORTANT, INTERNAL_DESCRIPTION);
- report << "Input matrix:" << endl;
- A.write (report, FORMAT_PRETTY);
-
- bool ret = testTranspose (F, A, stream1, stream2);
-
- stream1.reset ();
- stream2.reset ();
-
- commentator().stop (MSG_STATUS (ret), (const char *) 0, "testRandomTranspose");
-
- return ret;
-}
-
-/* Test 7: Linearity
- *
- * Compute a random sparse matrix and check its linearity
- *
- * F - Field over which to perform computations
- * n - Dimension to which to make matrix
- * iterations - Number of random vectors to which to apply matrix
- *
- * Return true on success and false on failure
- */
-
-template <class Row, class Field, class Vector>
-static bool testRandomLinearity (Field &F,
- const char *text,
- VectorStream<Row> &A_stream,
- VectorStream<Vector> &stream1,
- VectorStream<Vector> &stream2)
-{
- typedef SparseMatrix <Field, Row> Blackbox;
-
- ostringstream str;
- str << "Testing linearity (" << text << ")" << ends;
- commentator().start (str.str ().c_str (), "testRandomLinearity", stream1.m ());
-
- Blackbox A (F, A_stream);
- A_stream.reset ();
-
- ostream &report = commentator().report (Commentator::LEVEL_UNIMPORTANT, INTERNAL_DESCRIPTION);
- report << "Input matrix:" << endl;
- A.write (report, FORMAT_PRETTY);
-
- bool ret = testLinearity (F, A, stream1, stream2);
-
- stream1.reset ();
- stream2.reset ();
-
- commentator().stop (MSG_STATUS (ret), (const char *) 0, "testRandomLinearity");
-
- return ret;
-}
-
-template <class Field, class Vector, class Row>
-bool runSparseMatrixTestsByVector (const Field &F,
- const char *desc,
- unsigned int iterations,
- VectorStream<Vector> &v_stream1,
- VectorStream<Vector> &v_stream2,
- VectorStream<Row> &A_stream)
-{
- bool pass = true;
-
- ostringstream str;
-
- str << "Testing " << desc << " sparse matrix" << ends;
- commentator().start (str.str ().c_str (), "runSparseMatrixTestsByVector", 6);
-
- if (!testIdentityApply<Row> (F, desc, v_stream1)) pass = false; commentator().progress ();
- if (!testNilpotentApply<Row> (F, desc, v_stream1)) pass = false; commentator().progress ();
- if (!testRandomApply1<Vector> (F, desc, iterations, A_stream)) pass = false; commentator().progress ();
- if (!testRandomApply2<Vector> (F, desc, iterations, A_stream)) pass = false; commentator().progress ();
- if (!testRandomTranspose (F, desc, A_stream, v_stream1, v_stream2)) pass = false; commentator().progress ();
- if (!testRandomLinearity (F, desc, A_stream, v_stream1, v_stream2)) pass = false; commentator().progress ();
-
- commentator().stop (MSG_STATUS (pass), (const char *) 0, "runSparseMatrixTests");
-
return pass;
}
-template <class Field, class Row>
-bool runSparseMatrixTests (const Field &F,
- const char *desc,
- int iterations,
- VectorStream<Row> &A_stream)
+template <class SM, class SM2>
+bool buildBySetGetEntry(SM & A, const SM2 &B)
{
- typedef std::vector <typename Field::Element> DenseVector;
- typedef std::vector <pair <size_t, typename Field::Element> > SparseSeqVector;
- typedef std::map <size_t, typename Field::Element> SparseMapVector;
- typedef std::pair <std::vector<size_t>, std::vector<typename Field::Element> > SparseParVector;
-
- bool pass = true;
- ostringstream str1, str2, str3, str4, str5;
-
- str1 << "Testing sparse matrix with " << desc << " row type" << ends;
- commentator().start (str1.str ().c_str (), "runSparseMatrixTests", 4);
-
- str2 << desc << "/dense" << ends;
- str3 << desc << "/sparse sequence" << ends;
- str4 << desc << "/sparse associative" << ends;
- str5 << desc << "/sparse parallel" << ends;
-
- RandomDenseStream<Field, DenseVector> dense_stream1 (F, A_stream.n (), iterations);
- RandomDenseStream<Field, DenseVector> dense_stream2 (F, A_stream.m (), iterations);
-#if 0
- RandomSparseStream<Field, SparseSeqVector> sparse_seq_stream1 (F, 0.1, A_stream.n (), iterations);
- RandomSparseStream<Field, SparseSeqVector> sparse_seq_stream2 (F, 0.1, A_stream.m (), iterations);
- RandomSparseStream<Field, SparseMapVector> sparse_map_stream1 (F, 0.1, A_stream.n (), iterations);
- RandomSparseStream<Field, SparseMapVector> sparse_map_stream2 (F, 0.1, A_stream.m (), iterations);
- RandomSparseStream<Field, SparseParVector> sparse_par_stream1 (F, 0.1, A_stream.n (), iterations);
- RandomSparseStream<Field, SparseParVector> sparse_par_stream2 (F, 0.1, A_stream.m (), iterations);
-#endif
+ A.resize(B.rowdim(),B.coldim());
- if (!runSparseMatrixTestsByVector (F, str2.str ().c_str (), iterations,
- dense_stream1, dense_stream2, A_stream))
- pass = false;
-#if 0
- commentator().progress ();
- if (!runSparseMatrixTestsByVector (F, str2.str ().c_str (), iterations,
- sparse_seq_stream1, sparse_seq_stream2, A_stream))
- pass = false;
- commentator().progress ();
- if (!runSparseMatrixTestsByVector (F, str2.str ().c_str (), iterations,
- sparse_map_stream1, sparse_map_stream2, A_stream))
- pass = false;
- commentator().progress ();
- if (!runSparseMatrixTestsByVector (F, str2.str ().c_str (), iterations,
- sparse_par_stream1, sparse_par_stream2, A_stream))
- pass = false;
- commentator().progress ();
-#endif
+ for (size_t i = 0; i < B.rowdim(); ++i)
+ for (size_t j = 0; j < B.coldim(); ++j)
+ {
+ typename SM::Field::Element x = B.getEntry(i,j);
+ if (not A.field().isZero(x))
+ A.setEntry(i,j,x);
+ }
+ A.finalize();
- commentator().stop (MSG_STATUS (pass), (const char *) 0, "runSparseMatrixTests");
+ MatrixDomain<typename SM::Field> MD(B.field()) ;
- return pass;
+ return MD.areEqual(A,B);
}
int main (int argc, char **argv)
@@ -568,29 +118,20 @@ int main (int argc, char **argv)
static size_t n = 10;
static size_t m = 10;
- static integer q = 101;
- static int iterations = 1;
- static int k = 3;
- static int N = 20;
+ static integer q = 11;
+ static size_t N = m+n;
static Argument args[] = {
- { 'n', "-n N", "Set column dimension of test matrices to N.", TYPE_INT, &n },
- { 'm', "-m M", "Set row dimension of test matrices to M.", TYPE_INT, &m },
+ { 'm', "-m m", "Set row dimension of test matrices to m.", TYPE_INT, &m },
+ { 'n', "-n n", "Set column dimension of test matrices to n.", TYPE_INT, &n },
+ { 'N', "-N N", "Set number of nonzeros in test matrices.", TYPE_INT, &N },
{ 'q', "-q Q", "Operate over the \"field\" GF(Q) [1].", TYPE_INTEGER, &q },
- { 'i', "-i I", "Perform each test for I iterations.", TYPE_INT, &iterations },
- { 'k', "-k K", "K nonzero Elements per row in sparse random apply test.", TYPE_INT, &k },
- { 'N', "-N N", "N nonzero Elements in sparse random apply test.", TYPE_INT, &N },
END_OF_ARGUMENTS
};
parseArguments (argc, argv, args);
- typedef Modular<uint32_t> Field;
- typedef Field::Element Element;
-
- typedef std::vector <Element> DenseVector;
- typedef std::vector <pair <size_t, Element> > SparseSeqVector;
- typedef std::map <size_t, Element> SparseMapVector;
- typedef std::pair <std::vector<size_t>, std::vector<Element> > SparseParVector;
+ //typedef Givaro::Modular<uint32_t> Field;
+ typedef Givaro::Modular<double> Field;
Field F (q);
@@ -598,19 +139,77 @@ int main (int argc, char **argv)
commentator().getMessageClass (INTERNAL_DESCRIPTION).setMaxDetailLevel (Commentator::LEVEL_UNIMPORTANT);
commentator().start("Sparse matrix black box test suite", "Sparse");
+ MatrixDomain<Field> MD(F) ;
+ typename Field::RandIter r(F,0,1);
+ srand(0);
+
+ /* default case */
+ commentator().start("SparseMatrix<Field>", "Field");
+
+ SparseMatrix<Field> S1(F, m, n);
+ typename Field::Element x;
+ for (size_t k = 0; k < N; ++k)
+ {
+ size_t i = rand() % m;
+ size_t j = rand() % n;
+ while (S1.field().isZero(r.random(x)));
+ S1.setEntry(i,j,x);
+ }
+ S1.finalize();
+
+ //if ( testBlackbox(S1, true, N != 0))
+ if ( testBlackbox(S1, false, N != 0))
+ commentator().stop("SparseMatrix<Field> pass");
+ else {
+ commentator().stop("SparseMatrix<Field> FAIL");
+ pass = false;
+ }
+
+ /* other formats */
+ pass = pass and
+ testSparseFormat<Field, SparseMatrixFormat::COO>("COO",S1);
+ pass = pass and
+ testSparseFormat<Field, SparseMatrixFormat::CSR>("CSR",S1);
+ pass = pass and
+ testSparseFormat<Field, SparseMatrixFormat::ELL>("ELL",S1);
+ pass = pass and
+ testSparseFormat<Field, SparseMatrixFormat::ELL_R>("ELL_R",S1);
+ pass = pass and
+ testSparseFormat<Field, SparseMatrixFormat::TPL>("TPL",S1);
+ pass = pass and
+ testSparseFormat<Field, SparseMatrixFormat::SparseSeq>("SparseSeq",S1);
+ pass = pass and
+ testSparseFormat<Field, SparseMatrixFormat::SparsePar>("SparsePar",S1);
+ pass = pass and
+ testSparseFormat<Field, SparseMatrixFormat::SparseMap>("SparseMap",S1);
+#if 0 // doesn't compile
+ commentator().start("SparseMatrix<Field, SparseMatrixFormat::HYB>", "HYB");
+ SparseMatrix<Field, SparseMatrixFormat::HYB> S6(F, m, n);
+ buildBySetGetEntry(S6, S1);
+ S6.optimise();
+ if ( testBlackbox(S6,false) && MD.areEqual(S1,S6))
+ commentator().stop("Format HYB pass");
+ else {
+ commentator().stop("Format HYB FAIL");
+ pass = false;
+ }
+#endif
+
+ { /* Default OLD */
+ commentator().start("SparseMatrix<Field>", "Field");
+ Protected::SparseMatrixGeneric<Field> S11(F, m, n);
+ buildBySetGetEntry(S11, S1);
+ if ( testBlackbox(S11,true) && MD.areEqual(S1,S11))
+ commentator().stop("SparseMatrix<Field> pass");
+ else {
+ commentator().stop("SparseMatrix<Field> FAIL");
+ pass = false;
+ }
+ }
- RandomSparseStream<Field, SparseSeqVector>
- stream1 (F, (double) k / (double) n, n, m);
- RandomSparseStream<Field, SparseMapVector>
- stream2 (F, (double) k / (double) n, n, m);
- RandomSparseStream<Field, SparseParVector>
- stream3 (F, (double) k / (double) n, n, m);
+ commentator().stop( MSG_STATUS(pass), "Sparse matrix black box test suite pass");
- if (!runSparseMatrixTests (F, "sparse sequence", iterations, stream1)) pass = false;
- if (!runSparseMatrixTests (F, "sparse associative", iterations, stream2)) pass = false;
- if (!runSparseMatrixTests (F, "sparse parallel", iterations, stream3)) pass = false;
- commentator().stop("Sparse matrix black box test suite");
return pass ? 0 : -1;
}
diff --git a/tests/test-subiterator.C b/tests/test-subiterator.C
index b368371..6d24fd4 100644
--- a/tests/test-subiterator.C
+++ b/tests/test-subiterator.C
@@ -35,8 +35,12 @@
#include "linbox/util/commentator.h"
#include "test-common.h"
#include "linbox/vector/subiterator.h"
+
+#include "linbox/vector/blas-vector.h"
+
using namespace LinBox;
-bool test() ;
+bool test1() ;
+bool test2() ;
int main(int argc, char** argv)
{
static Argument args[] = {
@@ -45,12 +49,13 @@ int main(int argc, char** argv)
parseArguments (argc, argv, args);
commentator().start("Subiterator test suite", "Subiterator");
- bool pass = test();
- commentator().stop("Subiterator test suite");
+ bool pass = test1();
+ pass &= test2();
+ commentator().stop("Subiterator test suite");
return pass? 0 : -1;
}
-bool test()
+bool test1()
{
const char* title = "Subiterator test";
commentator().start(title, title, 1);
@@ -96,6 +101,54 @@ bool test()
return res;
}
+bool test2()
+{
+ const char* title = "Subiterator test";
+ commentator().start(title, title, 1);
+ ostream &report = commentator().report
+ (Commentator::LEVEL_IMPORTANT, INTERNAL_DESCRIPTION);
+
+ typedef Givaro::ZRing<int> Ints ;
+ Ints I ;
+ BlasVector<Ints> v(I);
+ for (int i = 1; i <= 10; ++i) v.push_back(i);
+
+ Subiterator<BlasVector<Ints>::iterator> s(v.begin()+2, 2);
+ Subiterator<BlasVector<Ints>::iterator> t(v.end()+2, 2);
+ bool res = true;
+ if (*s != 3) {report << 1 << endl; res=false;}
+ if (*(++s) != 5) {report << 2 << endl; res=false;}
+ if (*(s++) != 5) {report << 3 << endl; res=false;}
+ if (*(s) != 7) {report << 4 << endl; res=false;}
+ if (*(--s) != 5) {report << 5 << endl; res=false;}
+ if (*(s--) != 5) {report << 6 << endl; res=false;}
+ if (*(s) != 3) {report << 7 << endl; res=false;}
+ if (*(s+1) != 5) {report << 8 << endl; res=false;}
+ if (*(s-1) != 1) {report << 9 << endl; res=false;}
+ if ((t-s) != 5) {report << 10 << endl; res=false;}
+ // report << "10 " << t-s << endl;
+ if ((s[1]) != 5) {report << 11 << endl; res=false;}
+
+ if (s == t) {report << 12 << endl; res=false;}
+ if (!(s != t)) {report << 13 << endl; res=false;}
+ if (!(s <= t)) {report << 14 << endl; res=false;}
+ if (s >= t) {report << 15 << endl; res=false;}
+ if (!(s < t)) {report << 16 << endl; res=false;}
+ if (s > t) {report << 17 << endl; res=false;}
+
+ *s = 0;
+ if (v[2] != 0) {report << 18 << endl; res=false;}
+ s[3]=0;
+ if (v[8] != 0) {report << 19 << endl; res=false;}
+ std::swap(s, t);
+ if (s < t) {report << 20 << endl; res=false;}
+ s.swap(t);
+ if (s > t) {report << 21 << endl; res=false;}
+
+
+ commentator().stop (MSG_STATUS (res), (const char *) 0, title);
+ return res;
+}
// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
// Local Variables:
diff --git a/tests/test-submatrix.C b/tests/test-submatrix.C
index 74b3d9f..29bcc93 100644
--- a/tests/test-submatrix.C
+++ b/tests/test-submatrix.C
@@ -33,11 +33,11 @@
#include "linbox/linbox-config.h"
#include <iostream>
-#include <vector>
+
#include "linbox/util/commentator.h"
#include "linbox/field/archetype.h"
-#include "linbox/field/modular.h"
+#include "linbox/ring/modular.h"
#include "linbox/blackbox/submatrix.h"
#include "linbox/vector/stream.h"
@@ -64,16 +64,15 @@ template <class Field>
static bool testRandomApply (Field &F,
unsigned int iterations,
size_t n,
- VectorStream<typename Vector<Field>::Dense> &stream)
+ VectorStream<BlasVector<Field> > &stream)
{
typedef BlasMatrix <Field> Blackbox;
commentator().start ("Testing random apply", "testRandomApply", iterations);
bool ret = true;
- bool iter_passed;
- typename Vector<Field>::Dense v, w1(n), w2(n);
+ BlasVector<Field> v, w1(n), w2(n);
size_t i, j, k, l;
@@ -89,7 +88,7 @@ static bool testRandomApply (Field &F,
for (i = 0; i < iterations; i++) {
commentator().startIteration (i);
- iter_passed = true;
+ bool iter_passed = true;
for (j = 0; j < 9; j++) {
for (k = 0; k < n; k++) {
@@ -161,16 +160,16 @@ static bool testRandomApply (Field &F,
template <class Field>
static bool testRandomLinearity (const Field &F,
- VectorStream<typename Vector<Field>::Dense> &A_stream,
- VectorStream<typename Vector<Field>::Dense> &v1_stream,
- VectorStream<typename Vector<Field>::Dense> &v2_stream)
+ VectorStream<BlasVector<Field> > &A_stream,
+ VectorStream<BlasVector<Field> > &v1_stream,
+ VectorStream<BlasVector<Field> > &v2_stream)
{
commentator().start ("Testing random linearity", "testRandomLinearity", v1_stream.size ());
BlasMatrix<Field> A (F, A_stream);
Submatrix<BlasMatrix<Field> > Ap (&A, 0, 0, v1_stream.dim (), v2_stream.dim ());
- bool ret = testLinearity (F, Ap, v1_stream, v2_stream);
+ bool ret = testLinearity (Ap, v1_stream, v2_stream);
A_stream.reset ();
v1_stream.reset ();
@@ -196,9 +195,9 @@ static bool testRandomLinearity (const Field &F,
template <class Field>
static bool testRandomTranspose (const Field &F,
- VectorStream<typename Vector<Field>::Dense> &A_stream,
- VectorStream<typename Vector<Field>::Dense> &v1_stream,
- VectorStream<typename Vector<Field>::Dense> &v2_stream)
+ VectorStream<BlasVector<Field> > &A_stream,
+ VectorStream<BlasVector<Field> > &v1_stream,
+ VectorStream<BlasVector<Field> > &v2_stream)
{
commentator().start ("Testing random transpose", "testRandomTranspose", v1_stream.size ());
@@ -216,6 +215,29 @@ static bool testRandomTranspose (const Field &F,
return ret;
}
+template<class Field>
+bool testBasics(const Field & F)
+{
+ {
+ BlasMatrix<Field> Container(F,2,2);
+ BlasSubmatrix<BlasMatrix<Field> > subContainer(Container,0,0,1,1);
+ if (Container.getPointer() != subContainer.getPointer()) {
+ return false ;
+ }
+ }
+
+ {
+ const BlasMatrix<Field> Container(F,2,2);
+ BlasSubmatrix<const BlasMatrix<Field> > subContainer(Container,0,0,1,1);
+ if (Container.getPointer() != subContainer.getPointer()) {
+ return false ;
+ }
+ }
+
+ return true ;
+
+}
+
int main (int argc, char **argv)
{
bool pass = true;
@@ -233,26 +255,28 @@ int main (int argc, char **argv)
END_OF_ARGUMENTS
};
- typedef Modular<uint32_t> Field;
+ typedef Givaro::Modular<uint32_t> Field;
parseArguments (argc, argv, args);
- Field F (q);
+ Field F (q); Field::RandIter gen(F);
+
commentator().start("Submatrix black box test suite", "Submatrix");
commentator().getMessageClass (INTERNAL_DESCRIPTION).setMaxDepth (5);
commentator().getMessageClass (INTERNAL_DESCRIPTION).setMaxDetailLevel (Commentator::LEVEL_UNIMPORTANT);
- RandomDenseStream<Field> stream (F, n, N);
- RandomDenseStream<Field> A_stream (F, n, n);
- RandomDenseStream<Field> v1_stream (F, n / 2, iterations);
- RandomDenseStream<Field> v2_stream (F, n / 2, iterations);
+ RandomDenseStream<Field> stream (F, gen, n, N);
+ RandomDenseStream<Field> A_stream (F, gen, n, n);
+ RandomDenseStream<Field> v1_stream (F, gen, n / 2, iterations);
+ RandomDenseStream<Field> v2_stream (F, gen, n / 2, iterations);
#if 0
if (!testRandomApply (F, iterations, n, stream)) pass = false;
#endif
if (!testRandomLinearity (F, A_stream, v1_stream, v2_stream)) pass = false;
if (!testRandomTranspose (F, A_stream, v1_stream, v2_stream)) pass = false;
+ if (!testBasics(F) ) pass = false;
commentator().stop("Submatrix black box test suite");
return pass ? 0 : -1;
diff --git a/tests/test-subvector.C b/tests/test-subvector.C
index 23ac578..1a608b3 100644
--- a/tests/test-subvector.C
+++ b/tests/test-subvector.C
@@ -34,16 +34,29 @@
#include "linbox/linbox-config.h"
#include "linbox/util/commentator.h"
-#include "linbox/field/unparametric.h"
#include "linbox/vector/subvector.h"
+#include "linbox/vector/blas-vector.h"
+
#include "test-common.h"
using namespace LinBox;
+//! test with Vector=std::vector<Element>
template <class Field>
static bool testSubvector(Field &F, size_t n);
+//! test with Vector=BlasVector<Field>
+template <class Field>
+static bool testSubvector2(Field &F, size_t n);
+
+//! test with Vector=BlasVector<Field>
+//! test with subVector=BlasSubvector<Field>
+template <class Field>
+static bool testSubvector3(Field &F, size_t n);
+
+
+
int main(int argc, char** argv)
{
// set up command line options
@@ -57,13 +70,17 @@ int main(int argc, char** argv)
// start testing
commentator().start("Subvector test suite", "Subvector");
- bool pass = true;
+ bool pass ;
// call tests
- typedef LinBox::UnparametricField<int> Field;
+ typedef Givaro::ZRing<int> Field;
Field F;
pass = testSubvector<Field> (F, n);
+ pass &= testSubvector2<Field> (F, n);
+
+ pass &= testSubvector3<Field> (F, n);
+
// finish
commentator().stop("Subvector test suite");
return pass? 0 : -1;
@@ -76,6 +93,7 @@ int main(int argc, char** argv)
using namespace LinBox;
+
template <class Field>
static bool testSubvector(Field &F, size_t n)
{
@@ -90,13 +108,13 @@ static bool testSubvector(Field &F, size_t n)
typedef typename Field::Element Element;
typedef std::vector<Element> Vector;
- typedef typename Vector::iterator Iter;
+ // typedef typename Vector::iterator Iter;
typedef Subiterator<typename Vector::iterator> Subiter;
typedef typename LinBox::Subvector<Subiter> Subvect;
//typedef typename LinBox::Subvector<Vector, Subiter> Subvect;
- typedef typename Subvect::const_iterator ConstSubiterator;
+ // typedef typename Subvect::const_iterator ConstSubiterator;
- typedef typename Subvect::reverse_iterator ReverseIterator;
+ // typedef typename Subvect::reverse_iterator ReverseIterator;
typedef typename Subvect::reverse_iterator ReverseSubiterator;
Vector v(n);
@@ -107,12 +125,233 @@ static bool testSubvector(Field &F, size_t n)
int start = 1;
int stride = 2;
- int length = 3;
+ int Length = 3;
+
Subiter sb(v.begin()+start, stride);
- Subiter se(sb+length);
+ Subiter se(sb+Length);
+ Subvect w(sb, se);
+
+ // implicit (not stored) stride of 1
+ Subvector<typename Vector::iterator>
+ z(v.begin(), v.end());
+ // fixme: at least constructor compiles.
+
+ // explicit (stored) stride of 1
+ Subvect zz(v.begin(), v.end());
+ // fixme: at least constructor compiles.
+
+ report << endl << "*** Testing forward iterator" << endl << endl;
+
+ Subiter j = w.begin();
+
+
+ report << "*j = 1 = " << *j << endl;
+ ret = ret && 1 == *j;
+
+ report << "*j++ = 1 = " << *j++ << endl;
+ j--;
+ ret = ret && 1 == *j++;
+
+ report << "*j = 3 = " << *j << endl;
+ ret = ret && 3 == *j;
+
+ report << "*++j = 5 = " << *++j << endl;
+ --j;
+ ret = ret && 5 == *++j;
+
+ report << "*j = 5 = " << *j << endl;
+ ret = ret && 5 == *j;
+
+ report << "*j-- = 5 = " << *j-- << endl;
+ ++j;
+ ret = ret && 5 == *j--;
+
+ report << "*j = 3 = " << *j << endl;
+ ret = ret && 3 == *j;
+
+ report << "*--j = 1 = " << *--j << endl;
+ ++j;
+ ret = ret && 1 == *--j;
+
+ report << "*j = 1 = " << *j << endl;
+ ret = ret && 1 == *j;
+
+ ret = ret && (j == w.begin());
+ if (j != w.begin())
+ report << "not at beginning" << endl;
+ //j = j + 3;
+ j += 3;
+ if (j != w.end())
+ report << "not at end" << endl;
+
+ report << "Iterating through vector: (";
+ for (j = w.begin(); j != w.end(); j++)
+ {
+ report << *j;
+ if ( j < (w.end() - 1) ) report << ", ";
+ }
+ report << ')' << endl;
+
+ j = w.begin();
+ report << "Random access through vector: (";
+ for (unsigned long i = 0; i < w.size(); i++)
+ {
+ report << j[(int)i];
+ if ( i < (w.size() - 1) ) report << ", ";
+ }
+ report << ')' << endl;
+
+#if 1
+ report << endl << "*** Testing reverse iterator" << endl << endl;
+
+ ReverseSubiterator jr(w.rbegin());
+
+ report << "*jr = 5 = " << *jr << endl;
+ ret = ret && 5 == *jr;
+
+ report << "*jr++ = 5 = " << *jr++ << endl;
+ --jr;
+ ret = ret && 5 == *jr++;
+
+ report << "*jr = 3 = " << *jr << endl;
+ ret = ret && 3 == *jr;
+
+ report << "*++jr = 1 = " << *++jr << endl;
+ --jr;
+ ret = ret && 1 == *++jr;
+
+ report << "*jr = 1 = " << *jr << endl;
+ ret = ret && 1 == *jr;
+
+ report << "*jr-- = 1 = " << *jr-- << endl;
+ ++jr;
+ ret = ret && 1 == *jr--;
+
+ report << "*jr = 3 = " << *jr << endl;
+ ret = ret && 3 == *jr;
+
+ report << "*--jr 5 = = " << *--jr << endl;
+ ++jr;
+ ret = ret && 5 == *--jr;
+
+ report << "*jr = 5 = " << *jr << endl;
+ ret = ret && 5 == *jr;
+
+ if (jr != w.rbegin())
+ report << "not at beginning" << endl;
+ ret = ret && 5 == *jr;
+
+ report << "Iterating through vector: (";
+ for (jr = w.rbegin(); jr != w.rend(); jr++)
+ {
+ report << *jr;
+ if ( jr < (w.rend() - 1) ) report << ", ";
+ }
+ report << ')' << endl;
+ ret = ret && jr == w.rend();
+
+ jr = w.rbegin();
+ report << "Random access through vector: (";
+ for (unsigned long i = 0; i < w.size(); i++)
+ {
+ report << jr[(int)i];
+ if ( i < (w.size() - 1) ) report << ", ";
+ }
+ report << ')' << endl;
+
+#endif
+
+ report << endl << "*** Testing vector" << endl << endl;
+
+ // Need to check on const_iterator variants of functions.
+
+ report << "w.size() = 3 = " << w.size() << endl;
+ ret = ret && w.size() == 3;
+ report << "w.max_size() = 3 = " << w.max_size() << endl;
+ ret = ret && w.max_size() == 3;
+
+ report << "w.front() = 1 = " << w.front() << endl;
+ ret = ret && w.front() == 1;
+ report << "w.back() = 5 = " << w.back() << endl;
+ ret = ret && w.back() == 5;
+
+ report << "w.empty() = false = " << w.empty() << endl;
+ ret = ret && !w.empty();
+
+ printVector(F, report, w);
+
+ report << "Printing using operator[]: (";
+ for (unsigned long i = 0; i < w.size(); i++)
+ {
+ report << w[(size_t)i];
+ if ( i < (w.size() - 1) ) report << ", ";
+ }
+ report << ')' << endl;
+
+#if 0
+ report << "Printing using at(): (";
+ for (unsigned long i = 0; i < w.size(); i++)
+ {
+ report << w.at(i);
+ if ( i < (w.size() - 1) ) report << ", ";
+ }
+ report << ')' << endl;
+#endif
+
+ report << "Assigning subvector: ";
+ Vector vv(n);
+ Subvect ww(vv, 0, 1, 3);
+ //vector<int> ww(3, 77);
+ w = ww;
+ printVector(F, report, ww);
+#if 0
+ report << "Constructing subvector from iterators: ";
+ Subvect www(w.begin(), w.end());
+ printVector(F, report, www);
+#endif
+
+ // finish
+ commentator().stop (MSG_STATUS (ret), (const char *) 0, title);
+ return ret;
+}
+
+
+
+template <class Field>
+static bool testSubvector2(Field &F, size_t n)
+{
+ // commentator setup
+ const char * title = "Subvector test";
+ commentator().start(title, title, 1);
+ ostream &report = commentator().report
+ (Commentator::LEVEL_IMPORTANT, INTERNAL_DESCRIPTION);
+
+ report << "This test currently neglects several members including constructors." << endl;
+ bool ret = true;
+
+ typedef typename Field::Element Element;
+ typedef BlasVector<Field> Vector;
+ // typedef typename Vector::iterator Iter;
+ typedef Subiterator<typename Vector::iterator> Subiter;
+ typedef typename LinBox::Subvector<Subiter> Subvect;
+ //typedef typename LinBox::Subvector<Vector, Subiter> Subvect;
+ // typedef typename Subvect::const_iterator ConstSubiterator;
+
+ // typedef typename Subvect::reverse_iterator ReverseIterator;
+ typedef typename Subvect::reverse_iterator ReverseSubiterator;
+
+ Vector v(F,n);
+ for (size_t z = 0; z < n; z++)
+ v[z] = (Element)z;
+
+ printVector(F, report, v);
+
+ int start = 1;
+ int stride = 2;
+ int Length = 3;
+ Subiter sb(v.begin()+start, stride);
+ Subiter se(sb+Length);
-// Subvect w(v, start, stride, length);
-// Subvect w(sb, length);
Subvect w(sb, se);
// implicit (not stored) stride of 1
@@ -124,15 +363,11 @@ static bool testSubvector(Field &F, size_t n)
Subvect zz(v.begin(), v.end());
// fixme: at least constructor compiles.
- //report << "start = " << w._start << endl;
- //report << "stride = " << w._stride << endl;
- //report << "length = " << w._length << endl;
report << endl << "*** Testing forward iterator" << endl << endl;
Subiter j = w.begin();
-// report << "stride = " << j._stride << endl;
report << "*j = 1 = " << *j << endl;
ret = ret && 1 == *j;
@@ -185,7 +420,7 @@ static bool testSubvector(Field &F, size_t n)
report << "Random access through vector: (";
for (unsigned long i = 0; i < w.size(); i++)
{
- report << j[i];
+ report << j[(int)i];
if ( i < (w.size() - 1) ) report << ", ";
}
report << ')' << endl;
@@ -243,7 +478,7 @@ static bool testSubvector(Field &F, size_t n)
report << "Random access through vector: (";
for (unsigned long i = 0; i < w.size(); i++)
{
- report << jr[i];
+ report << jr[(int)i];
if ( i < (w.size() - 1) ) report << ", ";
}
report << ')' << endl;
@@ -272,7 +507,7 @@ static bool testSubvector(Field &F, size_t n)
report << "Printing using operator[]: (";
for (unsigned long i = 0; i < w.size(); i++)
{
- report << w[i];
+ report << w[(size_t)i];
if ( i < (w.size() - 1) ) report << ", ";
}
report << ')' << endl;
@@ -288,7 +523,7 @@ static bool testSubvector(Field &F, size_t n)
#endif
report << "Assigning subvector: ";
- Vector vv(n);
+ Vector vv(F,n);
Subvect ww(vv, 0, 1, 3);
//vector<int> ww(3, 77);
w = ww;
@@ -304,6 +539,229 @@ static bool testSubvector(Field &F, size_t n)
return ret;
}
+template <class Field>
+static bool testSubvector3(Field &F, size_t n)
+{
+ // commentator setup
+ const char * title = "Subvector test";
+ commentator().start(title, title, 1);
+ ostream &report = commentator().report
+ (Commentator::LEVEL_IMPORTANT, INTERNAL_DESCRIPTION);
+
+ report << "This test currently neglects several members including constructors." << endl;
+ bool ret = true;
+
+ typedef typename Field::Element Element;
+ typedef BlasVector<Field> Vector;
+ typedef BlasSubvector<Vector> subVector;
+ // typedef typename Vector::iterator Iter;
+ typedef typename subVector::iterator Subiter;
+ typedef typename LinBox::Subvector<Subiter> Subvect;
+ //typedef typename LinBox::Subvector<Vector, Subiter> Subvect;
+ // typedef typename Subvect::const_iterator ConstSubiterator;
+
+ // typedef typename Subvect::reverse_iterator ReverseIterator;
+ typedef typename Subvect::reverse_iterator ReverseSubiterator;
+
+ Vector v(F,n);
+ for (size_t z = 0; z < n; z++)
+ v[z] = (Element)z;
+
+ report << v << std::endl;
+
+ size_t start = 1;
+ size_t stride = 2;
+ size_t Length = 3;
+ // Subiter sb(v.begin()+start, stride);
+ // Subiter se(sb+Length);
+
+ subVector w(v, start, stride, Length);
+
+ // implicit (not stored) stride of 1
+ Subvector<typename Vector::iterator>
+ z(v.begin(), v.end());
+ // fixme: at least constructor compiles.
+
+ // explicit (stored) stride of 1
+ Subvect zz(v.begin(), v.end());
+ // fixme: at least constructor compiles.
+
+
+ report << endl << "*** Testing forward iterator" << endl << endl;
+
+ Subiter j = w.begin();
+
+
+ report << "*j = 1 = " << *j << endl;
+ ret = ret && 1 == *j;
+
+ report << "*j++ = 1 = " << *j++ << endl;
+ j--;
+ ret = ret && 1 == *j++;
+
+ report << "*j = 3 = " << *j << endl;
+ ret = ret && 3 == *j;
+
+ report << "*++j = 5 = " << *++j << endl;
+ --j;
+ ret = ret && 5 == *++j;
+
+ report << "*j = 5 = " << *j << endl;
+ ret = ret && 5 == *j;
+
+ report << "*j-- = 5 = " << *j-- << endl;
+ ++j;
+ ret = ret && 5 == *j--;
+
+ report << "*j = 3 = " << *j << endl;
+ ret = ret && 3 == *j;
+
+ report << "*--j = 1 = " << *--j << endl;
+ ++j;
+ ret = ret && 1 == *--j;
+
+ report << "*j = 1 = " << *j << endl;
+ ret = ret && 1 == *j;
+
+ ret = ret && (j == w.begin());
+ if (j != w.begin())
+ report << "not at beginning" << endl;
+ //j = j + 3;
+ j += 3;
+ if (j != w.end())
+ report << "not at end" << endl;
+
+ report << "Iterating through vector: (";
+ for (j = w.begin(); j != w.end(); j++)
+ {
+ report << *j;
+ if ( j < (w.end() - 1) ) report << ", ";
+ }
+ report << ')' << endl;
+
+ j = w.begin();
+ report << "Random access through vector: (";
+ for (unsigned long i = 0; i < w.size(); i++)
+ {
+ report << j[(int)i];
+ if ( i < (w.size() - 1) ) report << ", ";
+ }
+ report << ')' << endl;
+
+#if 1
+ report << endl << "*** Testing reverse iterator" << endl << endl;
+
+ ReverseSubiterator jr(w.rbegin());
+
+ report << "*jr = 5 = " << *jr << endl;
+ ret = ret && 5 == *jr;
+
+ report << "*jr++ = 5 = " << *jr++ << endl;
+ --jr;
+ ret = ret && 5 == *jr++;
+
+ report << "*jr = 3 = " << *jr << endl;
+ ret = ret && 3 == *jr;
+
+ report << "*++jr = 1 = " << *++jr << endl;
+ --jr;
+ ret = ret && 1 == *++jr;
+
+ report << "*jr = 1 = " << *jr << endl;
+ ret = ret && 1 == *jr;
+
+ report << "*jr-- = 1 = " << *jr-- << endl;
+ ++jr;
+ ret = ret && 1 == *jr--;
+
+ report << "*jr = 3 = " << *jr << endl;
+ ret = ret && 3 == *jr;
+
+ report << "*--jr 5 = = " << *--jr << endl;
+ ++jr;
+ ret = ret && 5 == *--jr;
+
+ report << "*jr = 5 = " << *jr << endl;
+ ret = ret && 5 == *jr;
+
+ if (jr != w.rbegin())
+ report << "not at beginning" << endl;
+ ret = ret && 5 == *jr;
+
+ report << "Iterating through vector: (";
+ for (jr = w.rbegin(); jr != w.rend(); jr++)
+ {
+ report << *jr;
+ if ( jr < (w.rend() - 1) ) report << ", ";
+ }
+ report << ')' << endl;
+ ret = ret && jr == w.rend();
+
+ jr = w.rbegin();
+ report << "Random access through vector: (";
+ for (unsigned long i = 0; i < w.size(); i++)
+ {
+ report << jr[(int)i];
+ if ( i < (w.size() - 1) ) report << ", ";
+ }
+ report << ')' << endl;
+
+#endif
+
+ report << endl << "*** Testing vector" << endl << endl;
+
+ // Need to check on const_iterator variants of functions.
+
+ report << "w.size() = 3 = " << w.size() << endl;
+ ret = ret && w.size() == 3;
+ report << "w.max_size() = 3 = " << w.max_size() << endl;
+ ret = ret && w.max_size() == 3;
+
+ report << "w.front() = 1 = " << w.front() << endl;
+ ret = ret && w.front() == 1;
+ report << "w.back() = 5 = " << w.back() << endl;
+ ret = ret && w.back() == 5;
+
+ report << "w.empty() = false = " << w.empty() << endl;
+ ret = ret && !w.empty();
+
+ report << w << std::endl;
+
+ report << "Printing using operator[]: (";
+ for (unsigned long i = 0; i < w.size(); i++)
+ {
+ report << w[(size_t)i];
+ if ( i < (w.size() - 1) ) report << ", ";
+ }
+ report << ')' << endl;
+
+#if 0
+ report << "Printing using at(): (";
+ for (unsigned long i = 0; i < w.size(); i++)
+ {
+ report << w.at(i);
+ if ( i < (w.size() - 1) ) report << ", ";
+ }
+ report << ')' << endl;
+#endif
+
+ report << "Assigning subvector: ";
+ Vector vv(F,n);
+ subVector ww(vv, 0, 1, 3);
+ //vector<int> ww(3, 77);
+ w = ww;
+ report << ww << std::endl;
+#if 0
+ report << "Constructing subvector from iterators: ";
+ Subvect www(w.begin(), w.end());
+ report << www << std::endl;
+#endif
+
+ // finish
+ commentator().stop (MSG_STATUS (ret), (const char *) 0, title);
+ return ret;
+}
+
// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
// Local Variables:
// mode: C++
diff --git a/tests/test-sum.C b/tests/test-sum.C
index cba563f..8bea9e2 100644
--- a/tests/test-sum.C
+++ b/tests/test-sum.C
@@ -6,20 +6,20 @@
*
* ------------------------------------
*
- *
+ *
* ========LICENCE========
* This file is part of the library LinBox.
- *
+ *
* LinBox is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
- *
+ *
* This library 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
* Lesser General Public License for more details.
- *
+ *
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
@@ -40,15 +40,15 @@
#include <iostream>
#include <fstream>
-#include <vector>
+
#include "linbox/util/commentator.h"
#include "linbox/vector/stream.h"
#include "linbox/field/archetype.h"
-#include "linbox/field/modular.h"
-#include "linbox/field/givaro.h"
+#include "linbox/ring/modular.h"
+//#include "linbox/field/givaro.h"
#ifdef __LINBOX_HAVE_NTL
-#include "linbox/field/ntl.h"
+#include "linbox/ring/ntl.h"
#endif
#include "linbox/vector/vector-domain.h"
#include "linbox/blackbox/diagonal.h"
@@ -69,7 +69,7 @@ static bool testBBrebind (const Field2 &F2, const Blackbox& B)
FBlackbox A(B, F2);
- return testBlackbox(A);
+ return testBlackboxNoRW(A);
}
@@ -91,29 +91,27 @@ static bool testZeroApply (Field1 &F1, Field2 &F2, VectorStream<Vector> &stream1
commentator().start ("Testing zero apply", "testZeroApply", stream1.m ());
bool ret = true;
- bool iter_passed = true;
- Vector d1, d2, v, w, zero;
+ Vector d1(F1), d2(F1), v(F1), w(F1)
+ // , zero
+ ;
VectorDomain<Field1> VD (F1);
- typename Field1::Element neg_one;
- VectorWrapper::ensureDim (zero, stream1.dim ());
+ // VectorWrapper::ensureDim (zero, stream1.dim ());
VectorWrapper::ensureDim (d1, stream1.dim ());
VectorWrapper::ensureDim (d2, stream1.dim ());
VectorWrapper::ensureDim (v, stream1.dim ());
VectorWrapper::ensureDim (w, stream2.dim ());
-// F.init (neg_one, 1);
-// F.negin (neg_one);
- F1.init (neg_one, -1);
+
while (stream1) {
commentator().startIteration ((unsigned)stream1.j ());
- iter_passed = true;
+ bool iter_passed = true;
stream1.next (d1);
- VD.mul (d2, d1, neg_one);
+ VD.mul (d2, d1, F1.mOne);
- Diagonal <Field1> D1 (F1, d1), D2 (F1, d2);
+ Diagonal <Field1> D1 (d1), D2 (d2);
Sum <Diagonal<Field1>,Diagonal <Field1> > A (&D1, &D2);
@@ -224,17 +222,20 @@ int main (int argc, char **argv)
};
#ifdef __LINBOX_HAVE_NTL
-// typedef UnparametricField<NTL::zz_p> Field;
+// typedef Givaro::ZRing<NTL::zz_p> Field;
typedef NTL_zz_p Field;
// NTL::zz_p::init(q1); // Done in the constructor
#else
- typedef Modular<int32_t> Field ;
+ typedef Givaro::Modular<double> Field ;
+ //typedef Givaro::Modular<int32_t> Field ;
#endif
- Field F1(q1);
+ Field F1(q1); Field::RandIter gen(F1);
+
- GivaroZpz< Givaro::Std32> F2(q2);
+ Givaro::Modular<double> F2(q2);
+ //Givaro::Modular<int32_t> F2(q2);
- typedef vector<Field::Element> Vector;
+ // typedef BlasVector<Field> Vector;
parseArguments (argc, argv, args);
@@ -243,39 +244,38 @@ int main (int argc, char **argv)
// Make sure some more detailed messages get printed
commentator().getMessageClass (INTERNAL_DESCRIPTION).setMaxDepth (2);
- RandomDenseStream<Field> stream1 (F1, n, iterations1), stream2 (F1, n, iterations2);
+ RandomDenseStream<Field> stream1 (F1, gen, n, iterations1), stream2 (F1, gen, n, iterations2);
if (!testZeroApply (F1, F2, stream1, stream2)) pass = false;
n = 10;
- RandomDenseStream<Field> stream3 (F1, n, iterations1), stream4 (F1, n, iterations2);
+ RandomDenseStream<Field> stream3 (F1, gen, n, iterations1), stream4 (F1, gen, n, iterations2);
- Vector d1(n), d2(n);
- stream3.next (d1);
- stream4.next (d2);
+ // Vector d1(n), d2(n);
+ // stream3.next (d1);
+ // stream4.next (d2);
// Diagonal <Field, Vector> D1 (F, d1), D2 (F, d2);
Field::Element d; F1.init(d, 5);
- ScalarMatrix<Field> D1(F1, 10, d), D2(F1, 10, d);
+ ScalarMatrix<Field> D1(F1, 10, 10, d), D2(F1, 10, 10, d);
typedef ScalarMatrix<Field> Blackbox;
Sum <Blackbox, Blackbox> A (D1, D2);
- pass = pass && testBlackbox(A) && testBBrebind(F2, A);
+ pass = pass && testBlackboxNoRW(A) && testBBrebind(F2, A);
Sum <Blackbox, Blackbox> Aref (&D1, &D2);
- pass = pass && testBlackbox(Aref) && testBBrebind(F2, A);
+ pass = pass && testBlackboxNoRW(Aref) && testBBrebind(F2, A);
commentator().stop("Sum black box test suite");
return pass ? 0 : -1;
}
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
// Local Variables:
// mode: C++
// tab-width: 8
// indent-tabs-mode: nil
// c-basic-offset: 8
// End:
-
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/tests/test-toeplitz-det.C b/tests/test-toeplitz-det.C
index 4f42cc4..c3a7ec9 100644
--- a/tests/test-toeplitz-det.C
+++ b/tests/test-toeplitz-det.C
@@ -31,11 +31,13 @@
+#include <linbox/linbox-config.h>
+
#include <iostream>
-#include <vector>
+
#include "linbox/blackbox/toeplitz.h"
#ifdef __LINBOX_HAVE_NTL
-#include "linbox/field/ntl.h"
+#include "linbox/ring/ntl.h"
#endif
#include "linbox/solutions/det.h"
#include "linbox/randiter/random-prime.h"
@@ -67,25 +69,25 @@ int main(int argc, char* argv[])
#ifdef __LINBOX_HAVE_NTL
srand((unsigned)time(0));
RandomPrimeIterator rp;
- NTL_zz_p::RandIter randit;
+ NTL_zz_p CF( *rp ); NTL_zz_p::RandIter randit(CF);
+ NTL_zz_pX PF(CF);
+
report << "\tUsing random primes and square matrices of size 2 to " << N_BOUND << endl;
//for( int i = 0; pass && i < 2; ++i ) {
size_t n;
- do { n = rand() % N_BOUND; } while( n < 2 );
-
- NTL_zz_p CF( *rp );
- NTL_zz_pX PF(CF);
+ do { n = (size_t)rand() % N_BOUND; } while( n < 2 );
BlasMatrix<NTL_zz_p> A(CF,n,n);
NTL_zz_p::Element temp;
NTL_zz_pX::Element poly;
- PF.init(poly,0);
- size_t r,c;
+ PF.assign(poly,PF.zero);
for( int diff = 1 - ((int)n); diff <= ((int)n) - 1; ++diff ) {
+ size_t c;
+ size_t r ;
randit.random(temp);
- PF.setCoeff(poly,(size_t)(diff + n - 1), temp );
+ PF.setCoeff(poly,(size_t)(diff + (int)n - 1), temp );
r = c = 0;
if( diff < 0 ) c = (size_t)(diff*-1);
else r = (size_t)diff;
@@ -114,7 +116,7 @@ int main(int argc, char* argv[])
#if 0
NTL_ZZ_pX F( 65521 );
NTL_ZZ_pX::Element a,b;
- F.init(a,1);
+ F.assign(a,F.one);
F.init(b,4);
F.mulin(a,b);
F.write(cout,a) << endl;
diff --git a/tests/test-toom-cook.C b/tests/test-toom-cook.C
index 7ef0a31..c3415bd 100644
--- a/tests/test-toom-cook.C
+++ b/tests/test-toom-cook.C
@@ -1,7 +1,7 @@
/*
* Copyright (C) 2012 the LinBox group
*
- * written by BB <bboyer at imag.fr>
+ * written by Brice Boyer (briceboyer) <boyer.brice at gmail.com>
*
*
* ========LICENCE========
@@ -30,23 +30,177 @@
* @test toom-cook multiplication routine
*/
+#include <linbox/linbox-config.h>
+
+#include "linbox-config.h"
#include <iostream>
-#include <linbox/linbox-config.h>
-#include <linbox/field/modular.h>
-#include <linbox/matrix/blas-matrix.h>
-#include <linbox/matrix/random-matrix.h>
+#include "linbox/integer.h"
+#include "linbox/ring/modular.h"
+#include "linbox/matrix/dense-matrix.h"
+#include "linbox/matrix/random-matrix.h"
// #include <fflas-ffpack/fflas/fflas.h>
-#include <linbox/field/givaro.h>
-#include <linbox/util/timer.h>
+#include "givaro/modular.h"
+#include "linbox/util/timer.h"
#include "linbox/algorithms/matrix-blas3/mul.h"
#include "test-common.h"
+
+
+
+namespace LinBox { namespace Protected {
+ struct IntegerSparseCraMatMul {
+
+
+ typedef SparseMatrixFormat::CSR spfmt ;
+ typedef Givaro::Modular<double> Field;
+ typedef Field::Element Element;
+ typedef SparseMatrix<Field,spfmt> ModularMatrix ;
+ typedef BlasVector<Field> ModularVector;
+ typedef BlasVector<Givaro::ZRing<Integer> > IntegerVector;
+ typedef SparseMatrix<Givaro::ZRing<Integer>,spfmt> IntegerMatrix ;
+
+#ifdef _LB_MM_TIMING
+#ifdef _OPENMP
+ typedef LinBox::OMPTimer Mytime;
+#else
+ typedef LinBox::Timer Mytime;
+#endif
+#endif
+
+ const IntegerMatrix &_A_ ;
+ const IntegerVector &_B_ ;
+
+#ifdef _LB_MM_TIMING
+ mutable Mytime chrono;
+#endif
+
+ IntegerSparseCraMatMul(const IntegerMatrix& A, const IntegerVector& B) :
+ _A_(A), _B_(B)
+ {
+#ifdef _LB_MM_TIMING
+ chrono.clear();
+#endif
+ // linbox_check(A.getPointer() == _A_.getPointer());
+ }
+
+ IntegerSparseCraMatMul(IntegerMatrix& A, IntegerVector& B) :
+ _A_(A), _B_(B)
+ {
+#ifdef _LB_MM_TIMING
+ chrono.clear();
+#endif
+ // linbox_check(A.getPointer() == _A_.getPointer());
+ }
+
+ ModularVector& operator()(ModularVector& Cp, const Field& F) const
+ {
+ // BlasMatrixDomain<Field> BMD(F);
+
+ /* intialisation */
+ // ModularMatrix Cpp(_A_.rowdim(),_B_.coldim());
+ // Cp = Cpp ;
+ ModularMatrix Ap(_A_, F);
+ ModularVector Bp(F, _B_);
+ Cp.resize(Ap.rowdim());
+
+ /* multiplication mod p */
+
+#ifdef _LB_MM_TIMING
+ Mytime matmul; matmul.clear(); matmul.start();
+#endif
+ // BMD.mul(Cp,Ap,Bp);
+ Ap.apply(Cp,Bp);
+ // BMD.axpyin(Cp,Ap,Bp);
+#if 0
+ // BMD.mul( static_cast<BlasMatrix<double>&>(Cp),Ap,Bp);
+ if (FAM_TYPE == _axpy)
+ BMD.axpyin(Cp,Ap,Bp);
+ else if (FAM_TYPE == _axmy)
+ BMD.axmyin(Cp,Ap,Bp);
+ else if (FAM_TYPE == _maxpy)
+ BMD.maxpyin(Cp,Ap,Bp);
+#endif
+#ifdef _LB_MM_TIMING
+ matmul.stop();
+ this->chrono+=matmul;
+#endif
+#if 0
+ if (Ap.rowdim() <= 20 && Ap.coldim() <= 20) {
+ Integer chara;
+ F.characteristic(chara);
+ F.write(cout) << endl;
+ cout << "p:=" << chara << ';' << std::endl;
+ A.write(cout<< "A:=",true) << ';' << std::endl;
+ Ap.write(cout << "Ap:=", F, true) << ';' << endl;
+ Bp.write(cout << "Bp:=", F, true) << ';' << endl;
+ Cp.write(cout<< "Cp:=", F, true) << ';' << endl;
+ }
+#endif
+ return Cp;
+ }
+
+
+
+ };
+} // Protected
+} // LinBox
+
+namespace LinBox { namespace BLAS2 {
+
+ template<class _anyVector>
+ _anyVector & mul (_anyVector& C,
+ const SparseMatrix<typename _anyVector::Field, SparseMatrixFormat::CSR> & A,
+ const _anyVector& B,
+ const BLAS3::mulMethod::CRA &)
+ {
+
+ size_t PrimeSize = 22; //! @todo pourqoi ?
+
+ integer mA, mB ;
+ mA = A.magnitude();
+ mB = B.magnitude();
+ integer cA = (integer) A.maxrow();
+ double logC = Givaro::naturallog(mA*mB*cA);
+
+ typedef Givaro::Modular<double> ModularField ;
+ ostream &report = commentator().report (Commentator::LEVEL_IMPORTANT, INTERNAL_DESCRIPTION);
+
+
+ {
+
+ RandomPrimeIterator genprime( (unsigned int)PrimeSize );
+ ChineseRemainder< FullMultipBlasMatCRA< ModularField > > cra( std::pair<size_t,double>(C.size(), logC) );
+ Protected::IntegerSparseCraMatMul iteration(A,B);
+
+ cra(C, iteration, genprime);
+
+#ifdef _LB_DEBUG
+#ifdef _LB_MM_TIMING
+#endif
+
+ Integer mC;
+ mC = C.magnitude();
+ report << "C max: " << logtwo(mC) << " (" << LinBox::naturallog(mC) << ')' << std::endl;
+#endif
+
+ }
+
+ report << mA << ',' << mB << ',' << C.magnitude() << std::endl;
+
+ return C;
+
+ }
+} // BLAS2
+} // LinBox
+
+using namespace LinBox;
int main(int ac, char ** av) {
static int p = 1009;
static int e = 3 ;
static size_t m = 10, n = 10 , k = 10;
+ static size_t b = 10 ;
static Argument as[] = {
{ 'n', "-n N", "Set cols of C .", TYPE_INT, &n },
@@ -54,99 +208,204 @@ int main(int ac, char ** av) {
{ 'k', "-k N", "Set rows of B .", TYPE_INT, &k },
{ 'p', "-p N", "Set characteristic.", TYPE_INT, &p },
{ 'e', "-e N", "Set degree.", TYPE_INT, &e },
+ { 'b', "-b N", "Set length of integers.", TYPE_INT, &b },
END_OF_ARGUMENTS
};
- LinBox::parseArguments (ac, av, as);
+ parseArguments (ac, av, as);
+ commentator().start("toom-cook suite", "toom");
+ ostream &report = commentator().report (Commentator::LEVEL_IMPORTANT, INTERNAL_DESCRIPTION);
- if (e < 2) {
- std::cout << " e > 1 please ! " << std::endl;
- return 0 ;
- }
+ Timer Tim ;
+ { /* Toom Cook over GivarorExtension */
+ //typedef Givaro::Modular<int64_t> Zpz;
+ typedef Givaro::Modular<double> Zpz;
+ typedef Givaro::Extension< Zpz > GFpe ;
- typedef LinBox::Modular<double> Zpz;
- typedef LinBox::GivaroExtension< Zpz > GFpe ;
+ // Z/pZ
+ Zpz F(p);
+ // GF(p^e) ;
+ GFpe GF (F, 2);
+ MatrixDomain<GFpe> MD(GF);
- // Z/pZ
- Zpz F(p);
- // GF(p^e) ;
- GFpe GF (F, 2);
+ GF.write(report << "This is the field with " << (Integer)pow((Integer)p,e) << " elements: ") << ", using: " << GF.irreducible() << " as irreducible polynomial" << std::endl;
+ report << "matrices are " << m << 'x' << k << " and " << k << 'x' << n << std::endl;
- GF.write(std::cout << "This is the field with " << (LinBox::Integer)pow((LinBox::Integer)p,e) << " elements: ") << ", using: " << GF.irreducible() << " as irreducible polynomial" << std::endl;
+ BlasMatrix<GFpe> A(GF,m,k);
+ BlasMatrix<GFpe> B(GF,k,n);
+ BlasMatrix<GFpe> C(GF,m,n);
- LinBox::BlasMatrix<GFpe> A(GF,m,k);
- LinBox::BlasMatrix<GFpe> B(GF,k,n);
- LinBox::BlasMatrix<GFpe> C(GF,m,n);
+ typedef GFpe::RandIter Randiter;
+ Randiter R(GF);
+ RandomDenseMatrix<Randiter,GFpe> randomizer(GF,R) ;
+ randomizer.random(A);
+ // report << "A[0,0] = " << A.getEntry(0,0) << std::endl;
+ randomizer.random(B);
- typedef typename GFpe::RandIter Randiter;
- Randiter R(GF);
- LinBox::RandomDenseMatrix<Randiter,GFpe> randomizer(GF,R) ;
- randomizer.random(A);
- // std::cout << "A[0,0] = " << A.getEntry(0,0) << std::endl;
- randomizer.random(B);
+ report << "naive over GFq" << std::endl;
+ Tim.clear(); Tim.start();
+ BLAS3::mul(C,A,B,BLAS3::mulMethod::naive());
+ Tim.stop();
+ report << Tim << '(' << C.getEntry(0,0) << ')' << std::endl;
- LinBox::Timer Tim ;
- std::cout << "naive over GFq" << std::endl;
- Tim.clear(); Tim.start();
- LinBox::BLAS3::mul(C,A,B,LinBox::BLAS3::mulMethod::naive());
- Tim.stop();
- std::cout << Tim << '(' << C.getEntry(0,0) << ')' << std::endl;
+ {
+ report << "ToomCook low mem" << std::endl;
+ BlasMatrix<GFpe> D(GF,m,n);
+ Tim.clear(); Tim.start();
+ BLAS3::mul(D,A,B,BLAS3::mulMethod::ToomCook<GFpe>(GF,false));
+ Tim.stop();
+ report << Tim << '(' << D.getEntry(0,0) << ')' << std::endl;
- // for (size_t i = 0 ; i< m ; ++i)
- // for (size_t j = 0 ; j< n ; ++j)
- // C.setEntry(i,j,GF.zero);
+ if (!MD.areEqual(D,C)) {
+ report << "low mem error" << std::endl;
+// return 1;
+ }
+ }
- // std::cout << "A[0,0] = " << A.getEntry(0,0) << std::endl;
- {
- std::cout << "ToomCook low mem" << std::endl;
- LinBox::BlasMatrix<GFpe> D(GF,m,n);
- Tim.clear(); Tim.start();
- LinBox::BLAS3::mul(D,A,B,LinBox::BLAS3::mulMethod::ToomCook<GFpe>(GF,false));
- Tim.stop();
- std::cout << Tim << '(' << D.getEntry(0,0) << ')' << std::endl;
- if (m*n < 100) {
- for (size_t i = 0 ; i < m ; ++i)
- for (size_t j = 0 ; j < n ; ++j)
- if (!(GF.areEqual(D.getEntry(0,0),C.getEntry(0,0))))
- return 1;
+ {
+ report << "ToomCook high mem" << std::endl;
+ BlasMatrix<GFpe> D(GF,m,n);
+ Tim.clear(); Tim.start();
+ BLAS3::mul(D,A,B,BLAS3::mulMethod::ToomCook<GFpe>(GF,true));
+ Tim.stop();
+ report << Tim << '(' << D.getEntry(0,0) << ')' << std::endl;
+
+ if (!MD.areEqual(D,C)) {
+ report << "high mem error" << std::endl;
+// return 1;
+ }
}
- else {
- int r =100 ;
- while (--r) {
- size_t i = rand()%m;
- size_t j = rand()%n;
- if (!(GF.areEqual(D.getEntry(i,j),C.getEntry(i,j))))
- return 1;
+
+ {
+ report << "Matrix Domain" << std::endl;
+ BlasMatrix<GFpe> D(GF,m,n);
+ Tim.clear(); Tim.start();
+ MD.mul(D,A,B);
+ Tim.stop();
+ report << Tim << '(' << D.getEntry(0,0) << ')' << std::endl;
+
+ if (!MD.areEqual(D,C)) {
+ report << "Matrix Domain error" << std::endl;
+// return 1;
}
- // TODO check with apply !
}
}
- {
- std::cout << "ToomCook high mem" << std::endl;
- LinBox::BlasMatrix<GFpe> D(GF,m,n);
- Tim.clear(); Tim.start();
- LinBox::BLAS3::mul(D,A,B,LinBox::BLAS3::mulMethod::ToomCook<GFpe>(GF,true));
+ { /* ZZ mat mul */
+
+ Givaro::ZRing<Integer> ZZ ;
+ MatrixDomain<Givaro::ZRing<Integer> > MD(ZZ);
+ BlasMatrix<Givaro::ZRing<Integer> > A(ZZ,m,k) ;
+ BlasMatrix<Givaro::ZRing<Integer> > B(ZZ,k,n) ;
+ BlasMatrix<Givaro::ZRing<Integer> > C(ZZ,m,n) ;
+
+ A.random((unsigned)b);
+ B.random((unsigned)b);
+
+ report << "Naïve " << std::endl ;
+ Tim.clear() ; Tim.start() ;
+ BLAS3::mul(C,A,B,BLAS3::mulMethod::naive());
Tim.stop();
- std::cout << Tim << '(' << D.getEntry(0,0) << ')' << std::endl;
- if (m*n < 100) {
- for (size_t i = 0 ; i < m ; ++i)
- for (size_t j = 0 ; j < n ; ++j)
- if (!(GF.areEqual(D.getEntry(0,0),C.getEntry(0,0))))
- return 1;
+ report << Tim << '(' << C.getEntry(0,0) << ')' << std::endl;
+
+#ifdef __LINBOX_HAVE_FLINT
+ {
+ report << "FLINT " << std::endl;
+ BlasMatrix<Givaro::ZRing<Integer> > D(ZZ,m,n);
+ Tim.clear(); Tim.start();
+ BLAS3::mul(D,A,B,BLAS3::mulMethod::FLINT());
+ Tim.stop();
+ report << Tim << '(' << D.getEntry(0,0) << ')' << std::endl;
+
+ if (!MD.areEqual(D,C)) {
+ report << "FLINT error" << std::endl;
+ return 1;
+ }
+ }
+#endif // __LINBOX_HAVE_FLINT
+
+ {
+ report << "Matrix Domain" << std::endl;
+ BlasMatrix<Givaro::ZRing<Integer> > D(ZZ,m,n);
+ Tim.clear(); Tim.start();
+ MD.mul(D,A,B);
+ Tim.stop();
+ report << Tim << '(' << D.getEntry(0,0) << ')' << std::endl;
+
+ if (!MD.areEqual(D,C)) {
+ report << "Matrix Domain error" << std::endl;
+// return 1;
+ }
+ }
+
+ {
+ report << "CRA " << std::endl;
+ BlasMatrix<Givaro::ZRing<Integer> > D(ZZ,m,n);
+ Tim.clear(); Tim.start();
+ BLAS3::mul(D,A,B,BLAS3::mulMethod::CRA());
+ Tim.stop();
+ report << Tim << '(' << D.getEntry(0,0) << ')' << std::endl;
+
+ if (!MD.areEqual(D,C)) {
+ // report << D << std::endl;
+ // report << C << std::endl;
+ report << "CRA error" << std::endl;
+// return 1;
+ }
}
- else {
- int r =100 ;
- while (--r) {
- size_t i = rand()%m;
- size_t j = rand()%n;
- if (!(GF.areEqual(D.getEntry(i,j),C.getEntry(i,j))))
- return 1;
+ }
+
+ { /* ZZ spmat mul */
+
+ typedef Givaro::ZRing<Integer> Field;
+ typedef SparseMatrix<Field,SparseMatrixFormat::CSR> BlackBox;
+ Field ZZ ;
+
+ VectorDomain<Givaro::ZRing<Integer> > MD(ZZ);
+
+ // typename Field::RandIter ri (ZZ,b);
+ Givaro::RandomIntegerIterator<false> ri(ZZ,(size_t)b);
+ double sparsity = 0.05;
+ RandomSparseStream<Field, typename BlackBox::Row, Givaro::RandomIntegerIterator<false> > stream (ZZ, ri, sparsity, k, m);
+
+ BlackBox A (ZZ, stream);
+
+ typedef BlasVector<Field> Vector ;
+ Vector x(ZZ,k);
+ Vector y(ZZ,m);
+
+ // size_t iter = 1 ;
+ // RandomDenseStream<Field, Vector> vs (ZZ, ri, k, iter);
+ x.random(ri);
+
+ report << "Naïve " << std::endl ;
+ Tim.clear() ; Tim.start() ;
+ A.apply(y,x);
+ Tim.stop();
+ report << Tim << '(' << y[0] << ')' << std::endl;
+
+
+ report << "CRA " << std::endl;
+ {
+
+
+ BlasVector<Givaro::ZRing<Integer> > z(ZZ,m);
+ Tim.clear(); Tim.start();
+ BLAS2::mul(z,A,x,BLAS3::mulMethod::CRA());
+ Tim.stop();
+ report << Tim << '(' << z[0] << ')' << std::endl;
+
+ if (!MD.areEqual(y,z)) {
+ // report << D << std::endl;
+ // report << C << std::endl;
+ report << "CRA error" << std::endl;
+// return 1;
}
- // TODO check with apply !
}
}
+ commentator().stop("toom-cook suite");
+
return 0;
}
diff --git a/tests/test-trace.C b/tests/test-trace.C
index 7595f9b..80c60ed 100644
--- a/tests/test-trace.C
+++ b/tests/test-trace.C
@@ -6,20 +6,20 @@
*
* --------------------------------------------------------
*
- *
+ *
* ========LICENCE========
* This file is part of the library LinBox.
- *
+ *
* LinBox is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
- *
+ *
* This library 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
* Lesser General Public License for more details.
- *
+ *
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
@@ -39,11 +39,11 @@
#include "linbox/linbox-config.h"
#include <iostream>
-#include <vector>
+
#include "test-common.h"
-#include "linbox/field/modular.h"
+#include "linbox/ring/modular.h"
#include "linbox/solutions/trace.h"
using namespace LinBox;
@@ -65,35 +65,70 @@ int main (int argc, char **argv)
commentator().start("Trace test suite", "Trace");
commentator().getMessageClass (INTERNAL_DESCRIPTION).setMaxDepth (3);
+#ifdef __LINBOX_HAVE_NTL
+ ostream& report = commentator().report();
+#endif
- typedef Modular<int> Field;
+ typedef Givaro::Modular<int> Field;
typedef Field::Element Element;
- typedef vector<Element> Vector;
+ // typedef vector<Element> Vector;
Field F (q);
Element t, t1, t2, t3;
- F.init(t, 0); F.init(t1, 0); F.init(t2, 0); F.init(t3, 0);
+ F.assign(t, F.zero); F.assign(t1, F.zero); F.assign(t2, F.zero); F.assign(t3, F.zero);
+// scalar matrix
Element s; F.init(s, 3);
- ScalarMatrix<Field> A(F, n, s);
+ ScalarMatrix<Field> A(F, n, n, s);
F.init(t, n*3);
+
trace(t1, A);
if (! F.areEqual(t1, t) ) pass = false;
- trace(t2, A, TraceTags::Local() );
- if (! F.areEqual(t1, t) ) pass = false;
- trace(t3, A, TraceTags::Generic() );
- if (! F.areEqual(t1, t) ) pass = false;
-/*
- Vector v(2*n-1, s);
- for (int i = 0; i < 2*n-1; ++i) if (i != n-1) F.init(v[i], i);
- Toeplitz<Field> B(F, n, v);
- trace(t1, B);
- if (! F.areEqual(t1, t) pass = false;
- trace(t2, B, TraceTags::Local() );
- if (! F.areEqual(t1, t) pass = false;
- trace(t3, B, TraceTags::Generic() );
- if (! F.areEqual(t1, t) pass = false;
-*/
+ SolutionTags::Local L;
+ trace(t2, A, L );
+ if (! F.areEqual(t2, t) ) pass = false;
+
+ SolutionTags::Generic G;
+ trace(t3, A, G );
+ if (! F.areEqual(t3, t) ) pass = false;
+
+#ifdef __LINBOX_HAVE_NTL
+// Toeplitz matrix
+
+ NTL_zz_p CF( q );
+ NTL_zz_p::Element u, u1, u2, u3;
+ CF.assign(u, CF.zero); CF.assign(u1, CF.zero); CF.assign(u2, CF.zero); CF.assign(u3, CF.zero);
+ NTL_zz_pX PF(CF);
+
+ NTL_zz_p::Element temp;
+ NTL_zz_pX::Element poly;
+ PF.assign(poly,PF.zero);
+
+ for( int diff = 1 - ((int)n); diff <= ((int)n) - 1; ++diff ) {
+ PF.setCoeff(poly,(size_t)((size_t)diff + n - 1), CF.init(temp,diff) );
+ }
+
+ Toeplitz<NTL_zz_p,NTL_zz_pX> B( PF, poly, n );
+
+ CF.assign(u, CF.zero);
+ trace(u1, B);
+ if (! CF.areEqual(u1, u)) {
+ pass = false;
+ report << "u and u1: " << u << " " << u1 << endl;
+ }
+
+ trace(u2, B, SolutionTags::Local() );
+ if (! CF.areEqual(u2, u)) {
+ pass = false;
+ report << "u and u2: " << u << " " << u2 << endl;
+ }
+
+ trace(u3, B, SolutionTags::Generic() );
+ if (! CF.areEqual(u3, u)) {
+ pass = false;
+ report << "u and u3: " << u << " " << u3 << endl;
+ }
+#endif // __LINBOX_HAVE_NTL
commentator().stop("Trace solution test suite");
return pass ? 0 : -1;
diff --git a/tests/test-transpose.C b/tests/test-transpose.C
new file mode 100644
index 0000000..7600a82
--- /dev/null
+++ b/tests/test-transpose.C
@@ -0,0 +1,224 @@
+
+/* tests/test-transpose.C
+ *
+ * ------------------------------------
+ *
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ * ========LICENCE========
+ *.
+ */
+
+/*! @file tests/test-transpose.C
+ * @ingroup tests
+ *
+ * @brief no doc
+ *
+ * @test no doc.
+ */
+
+
+#include "linbox/linbox-config.h"
+
+#include <iostream>
+#include <fstream>
+
+
+#include "linbox/util/commentator.h"
+#include "linbox/ring/modular.h"
+#include "linbox/vector/vector-domain.h"
+#include "linbox/blackbox/scalar-matrix.h"
+#include "linbox/blackbox/transpose.h"
+#include "linbox/matrix/dense-matrix.h"
+#include "linbox/matrix/sparse-matrix.h"
+
+#include "test-common.h"
+#include "test-blackbox.h"
+
+using namespace LinBox;
+
+
+
+#if 0
+template <class Field2, class Blackbox>
+static bool testBBrebind (const Field2 &F2, const Blackbox& B)
+{
+ typedef typename Blackbox::template rebind<Field2>::other FBlackbox;
+
+ FBlackbox A(B, F2);
+
+ return testBlackbox(A);
+}
+#endif
+
+/* Test Transpose:
+ * Check that Transpose<Blackbox> meets blackbox interface and behaves
+ * as transpose.
+ *
+ * Return true on success and false on failure
+ */
+template <class Blackbox>
+static bool testTransposeBlackbox(Blackbox & A)
+{
+ typedef typename Blackbox::Field Field;
+ commentator().start ("Testing Transpose", "testTranspose", 1);
+
+ Transpose<Blackbox> B(A);
+
+ bool ret = true, ret1;
+
+ size_t m = A.rowdim(), n = A.coldim();
+ const Field & F = A.field();
+ VectorDomain<Field> VD (F);
+ BlasVector<Field> x(F,n), y(F,m), z(F,n), w(F,m);
+
+ VD.random(x);
+ A.apply(y, x);
+ B.applyTranspose(w, x);
+ ret1 = VD.areEqual(y, w);
+ if (not ret1) commentator().report() << "A and B^T disagree, FAIL" << std::endl;
+ ret = ret and ret1;
+
+ VD.random(y);
+ A.applyTranspose(x, y);
+ B.apply(z, y);
+ ret1 = VD.areEqual(x, z);
+ if (not ret1) commentator().report() << "A^T and B disagree, FAIL" << std::endl;
+ ret = ret and ret1;
+
+ ret1 = testBlackboxNoRW(B);
+ if (not ret1) commentator().report() << "testBlackbox A^T FAIL" << std::endl;
+ ret = ret and ret1;
+
+ commentator().stop (MSG_STATUS (ret), (const char *) 0, "testTranspose");
+
+ return ret;
+}
+
+
+/* Test getEntry and setEntry of a Transpose<BB>.
+ *
+ * this test template can be instantiated only if the underlying class BB
+ * has getEntry and setEntry (as dense and sparse matrix types should).
+ *
+ * For such matrices, A and A^T should share memory, so that results of
+ * setEntry on one are reflected by getEntry on the other.
+ */
+template <class Matrix>
+bool testTransposeMatrix(Matrix& A) {
+ commentator().start ("Testing Transpose", "testTranspose", 1);
+ bool ret = true, ret1;
+ typedef typename Matrix::Field Field;
+ typename Field::Element x, y;
+ const Field & F = A.field();
+ F.init(x);
+ F.init(y);
+ Transpose<Matrix> B(A);
+ size_t m = A.rowdim(), n = A.coldim();
+
+ size_t i = (size_t)rand()%m, j = (size_t)rand()%n;
+ A.getEntry(x, i, j);
+ B.getEntry(y, j, i);
+ ret = ret and (ret1 = F.areEqual(x, y));
+ if (not ret1) commentator().report() << "A, A^T same getentry FAIL" << std::endl;
+
+ i = (size_t)rand()%m, j = (size_t)rand()%n;
+ A.setEntry(i, j, x);
+ B.getEntry(y, j, i);
+ ret = ret and (ret1 = F.areEqual(x, y));
+ if (not ret1) commentator().report() << "A set, A^T getEntry FAIL" << std::endl;
+
+ i = (size_t)rand()%m, j = (size_t)rand()%n;
+ B.setEntry(j, i, x);
+ A.getEntry(y, i, j);
+ ret = ret and (ret1 = F.areEqual(x, y));
+ if (not ret1) commentator().report() << "A^T set, A getEntry FAIL" << std::endl;
+
+ commentator().stop (MSG_STATUS (ret), (const char *) 0, "testTranspose");
+ return ret;
+}
+
+int main (int argc, char **argv)
+{
+ bool pass = true;
+
+ static size_t m = 8;
+ static size_t n = 10;
+ static integer q = 101;
+
+ static Argument args[] = {
+ { 'm', "-m M", "Set dimension of test matrices to NxN.", TYPE_INT, &m },
+ { 'n', "-n N", "Set dimension of test matrices to NxN.", TYPE_INT, &n },
+ { 'q', "-q Q", "Operate over the \"field\" GF(Q) [1].", TYPE_INTEGER, &q },
+ END_OF_ARGUMENTS
+ };
+
+ typedef Givaro::Modular<int32_t> Field ;
+ Field F(q);
+
+ // typedef vector<Field::Element> Vector;
+
+ parseArguments (argc, argv, args);
+
+ commentator().start("transpose black box test suite", "transpose");
+
+ // Make sure some more detailed messages get printed
+ commentator().getMessageClass (INTERNAL_DESCRIPTION).setMaxDepth (2);
+
+ commentator().start("test on ScalarMatrix");
+ Field::Element s; F.init(s, 5);
+ ScalarMatrix<Field> A(F, n, n, s);
+ pass = pass and testTransposeBlackbox(A);
+ commentator().stop(MSG_STATUS (pass), (const char *) 0, "test on ScalarMatrix");
+
+ commentator().start("test on BlasMatrix");
+ BlasMatrix<Field> B(F, m, n);
+ for (size_t i = 0; i < m; ++i)
+ for (size_t j = 0; j < n; ++j)
+ B.setEntry(i, j, F.init(s, i*j));
+ pass = pass and testTransposeBlackbox(B);
+ pass = pass and testTransposeMatrix(B);
+ commentator().stop(MSG_STATUS (pass), (const char *) 0, "test on BlasMatrix");
+
+ commentator().start("test on TriplesBB");
+#if 0 /* fails because setEntry(?,?,0) fails. */
+ SparseMatrix<Field,SparseMatrixFormat::TPL> C(F, m, n);
+ for (size_t i = 0; i < min(m, n); ++i) C.setEntry(i, i, F.init(s, i+1));
+ pass = pass and testTransposeBlackbox(C);
+ pass = pass and testTransposeMatrix(C);
+#endif
+ commentator().stop(MSG_STATUS (pass), (const char *) 0, "test on TriplesBB");
+
+ commentator().start("test on COO");
+ SparseMatrix<Field,SparseMatrixFormat::COO> C(F, m, n);
+ for (size_t i = 0; i < min(m, n); ++i) C.setEntry(i, i, F.init(s, i+1));
+ pass = pass and testTransposeBlackbox(C);
+ pass = pass and testTransposeMatrix(C);
+ commentator().stop(MSG_STATUS (pass), (const char *) 0, "test on TriplesBB");
+
+ commentator().stop(MSG_STATUS (pass), (const char *) 0, "transpose black box test suite");
+ return pass ? 0 : -1;
+}
+
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/tests/test-triplesbb-omp.C b/tests/test-triplesbb-omp.C
new file mode 100644
index 0000000..7cdfa00
--- /dev/null
+++ b/tests/test-triplesbb-omp.C
@@ -0,0 +1,414 @@
+/* Copyright (C) LinBox
+ *
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ * ========LICENCE========
+ */
+
+/*! @file tests/test-triplesbb-omp.C
+ * @ingroup tests
+ *
+ * @brief no doc
+ *
+ * @test no doc.
+ */
+
+
+#include "linbox/linbox-config.h"
+
+#include <iostream>
+#include <fstream>
+
+#include <omp.h>
+#include <set>
+#include <utility>
+#include <sstream>
+
+#include "linbox/ring/modular.h"
+#include "linbox/matrix/sparse-matrix.h"
+// #include "linbox/blackbox/triplesbb-omp.h"
+// #include "linbox/blackbox/triplesbb.h"
+#include "linbox/blackbox/transpose.h"
+#include "linbox/vector/vector-domain.h"
+#include "linbox/matrix/dense-matrix.h"
+
+#include "examples/map-sparse.h"
+
+#include "test-common.h"
+#include "test-generic.h"
+
+using namespace LinBox;
+
+int randRange(int start, int end)
+{
+ double rval = rand();
+ static const double NORMALIZING_CONSTANT = 1.0/(1.0+RAND_MAX);
+ double normedRVal = rval*NORMALIZING_CONSTANT;
+ double rangeSize = end-start;
+ int offset = (int)(rangeSize*normedRVal);
+ return start+offset;
+}
+
+template<class Field>
+void varyMatMatPair(MapSparse<Field>& leftMat, MapSparse<Field>& rightMat, int q)
+{
+ typedef typename Field::Element Element;
+
+ Field F(q);
+ Element d;
+
+ int m=(int)leftMat.rowdim();
+ int n=(int)leftMat.coldim();
+ int p=(int)rightMat.coldim();
+
+ int leftRow=randRange(0,m);
+ int leftCol=randRange(0,n);
+ int rightCol=randRange(0,p);
+
+ if (F.isZero(rightMat.getEntry(leftCol,rightCol))) {
+ F.init(d,randRange(1,q));
+ rightMat.setEntry(leftCol,rightCol,d);
+ F.init(d,randRange(1,q));
+ leftMat.setEntry(leftRow,leftCol,d);
+ } else {
+ do {
+ F.init(d,randRange(0,q));
+ } while (F.areEqual(d,leftMat.getEntry(leftRow,leftCol)));
+ leftMat.setEntry(leftRow,leftCol,d);
+ }
+}
+
+template<class Field,class Blackbox>
+void computeAnswer(const MapSparse<Field>& A,
+ const MapSparse<Field>& X,
+ MapSparse<Field>& Y,
+ const Field& F,
+ bool isRight,
+ bool useVector)
+{
+ typedef BlasVector<Field> Vector ;
+ typedef typename MatrixDomain<Field>::OwnMatrix OwnMatrix;
+
+ LinBox::MatrixDomain<Field> MD(F);
+
+ if (useVector) {
+ if (isRight) {
+ Vector vecX(F,X.coldim()),vecY(F,A.coldim());
+ X.toVector(vecX);
+ Blackbox matA(F);
+ A.copy(matA);
+ matA.applyTranspose(vecY,vecX);
+ Y.fromVector(vecY,1,A.coldim());
+ } else {
+ Vector vecX(F,X.rowdim()),vecY(F,A.rowdim());
+ X.toVector(vecX);
+ Blackbox matA(F);
+ A.copy(matA);
+ matA.apply(vecY,vecX);
+ Y.fromVector(vecY,A.rowdim(),1);
+ }
+ } else {
+ OwnMatrix matX(F,X.rowdim(),X.coldim());
+ if (isRight) {
+ OwnMatrix matY(F,X.rowdim(),A.coldim());
+ X.copy(matX);
+ Blackbox matA(F);
+ A.copy(matA);
+ matA.applyRight(matY,matX);
+ Y.copyFrom(matY);
+ } else {
+ OwnMatrix matY(F,A.rowdim(),X.coldim());
+ X.copy(matX);
+ Blackbox matA(F);
+ A.copy(matA);
+ matA.applyLeft(matY,matX);
+ Y.copyFrom(matY);
+ }
+ }
+}
+
+bool outputResult(std::string testName,
+ bool expected,
+ bool actual,
+ int m, int n, int p, int nnz, int numThreads, int q,
+ ostream& report)
+{
+ report << "Testing " << testName << " using: " <<
+ "m=" << m << " n=" << n << " p=" << p << " nnz=" << nnz << " numthreads=" << numThreads << " q=" << q << std::endl;
+
+ if (expected==actual) {
+ report << "PASS: ";
+ } else {
+ report << "FAILURE: ";
+ }
+ report << testName << " expected " << expected << " got " << actual << std::endl;
+
+ return expected==actual;
+}
+
+template<class Field>
+void reshapeAndScale(MapSparse<Field>& matOut,
+ MapSparse<Field>& matIn,
+ int m, int n, int alpha)
+{
+ typedef typename Field::Element Element;
+
+ matOut.shape(m,n);
+ m=(m<(int)matIn.rowdim())?m:(int)matIn.rowdim();
+ n=(n<(int)matIn.coldim())?n:(int)matIn.coldim();
+ Element d,a,t;
+ matIn.field().init(a,alpha);
+ for (int i=0;i<m;++i) {
+ for (int j=0;j<n;++j) {
+ d=matIn.getEntry(i,j);
+ matIn.field().mul(t,d,a);
+ matOut.setEntry(i,j,t);
+ }
+ }
+}
+
+template <class Field>
+bool runIdentTest(int n,
+ int m,
+ int p,
+ int q,
+ int numThreads,
+ bool shouldFail,
+ bool isRight,
+ bool useVector,
+ ostream& report)
+{
+ typedef SparseMatrix<Field,SparseMatrixFormat::TPL_omp> OMPBlackbox;
+
+ omp_set_num_threads(numThreads);
+
+ Field F(q);
+ MapSparse<Field> A(F,n,m),X,YTest,YRef;
+ if (isRight) {
+ X.init(F,p,n);
+ YTest.init(F,p,m);
+ YRef.init(F,p,m);
+ } else {
+ X.init(F,m,p);
+ YTest.init(F,n,p);
+ YRef.init(F,n,p);
+ }
+ int alpha=randRange(1,q);
+ MapSparse<Field>::generateScaledIdent(A,alpha);
+ MapSparse<Field>::generateDenseRandMat(X,q);
+ if (isRight) {
+ reshapeAndScale<Field>(YRef,X,p,m,alpha);
+ } else {
+ reshapeAndScale<Field>(YRef,X,n,p,alpha);
+ }
+
+ if (isRight && shouldFail) {
+ varyMatMatPair<Field>(X,A,q);
+ } else if ((!isRight) && shouldFail) {
+ varyMatMatPair<Field>(A,X,q);
+ }
+
+ computeAnswer<Field,OMPBlackbox>(A,X,YTest,F,isRight,useVector);
+ std::string testName;
+ if ((!isRight) && useVector) {
+ testName="ident apply()";
+ } else if (isRight && (!useVector)) {
+ testName="ident applyRight()";
+ } else if (isRight && useVector) {
+ testName="ident applyTranspose()";
+ } else {
+ testName="ident applyLeft()";
+ }
+ int nnz=(n<m)?n:m;
+ return outputResult(testName,!shouldFail,YRef.areEqual(YTest),m,n,p,nnz,numThreads,q,report);
+}
+
+template <class Field>
+bool runRandTest(int n,
+ int m,
+ int p,
+ double density,
+ int q,
+ int numThreads,
+ bool shouldFail,
+ bool isRight,
+ bool useVector,
+ ostream& report)
+{
+ typedef SparseMatrix<Field,SparseMatrixFormat::TPL_omp> OMPBlackbox;
+ typedef SparseMatrix<Field,SparseMatrixFormat::TPL> SeqBlackbox;
+
+ omp_set_num_threads(numThreads);
+
+ double matSize=n*m;
+ int nnz=(int) (density*matSize);
+
+ Field F(q);
+ MapSparse<Field> A(F,n,m),X,YTest,YRef;
+ if (isRight) {
+ X.init(F,p,n);
+ YTest.init(F,p,m);
+ YRef.init(F,p,m);
+ } else {
+ X.init(F,m,p);
+ YTest.init(F,n,p);
+ YRef.init(F,n,p);
+ }
+ MapSparse<Field>::generateRandMat(A,nnz,q);
+ MapSparse<Field>::generateDenseRandMat(X,q);
+
+ computeAnswer<Field,SeqBlackbox>(A,X,YRef,F,isRight,useVector);
+
+ if (isRight && shouldFail) {
+ varyMatMatPair<Field>(X,A,q);
+ } else if ((!isRight) && shouldFail) {
+ varyMatMatPair<Field>(A,X,q);
+ }
+
+ computeAnswer<Field,OMPBlackbox>(A,X,YTest,F,isRight,useVector);
+
+ std::string testName;
+ if ((!isRight) && useVector) {
+ testName="rand apply()";
+ } else if (isRight && (!useVector)) {
+ testName="rand applyRight()";
+ } else if (isRight && useVector) {
+ testName="rand applyTranspose()";
+ } else {
+ testName="rand applyLeft()";
+ }
+ return outputResult(testName,!shouldFail,YRef.areEqual(YTest),m,n,p,nnz,numThreads,q,report);
+}
+
+
+template<class Field>
+bool runSizeSuite(int n, int m, int p,
+ double density,
+ std::vector<int>& qs,
+ std::vector<int>& numThreads,
+ bool shouldFail, bool isRight,
+ ostream& report)
+{
+ bool pass=true;
+ for (size_t i=0;i<qs.size();++i) {
+ for (size_t j=0;j<numThreads.size();++j) {
+ if (p==1) {
+ bool useVector=true;
+ pass = pass && runRandTest<Field>
+ (n,m,p,density,qs[i],numThreads[j],
+ shouldFail,isRight,useVector,report);
+ pass = pass && runIdentTest<Field>
+ (n,m,p,qs[i],numThreads[j],
+ shouldFail,isRight,useVector,report);
+ }
+ pass = pass && runRandTest<Field>
+ (n,m,p,density,qs[i],numThreads[j],
+ shouldFail,isRight,false,report);
+ pass = pass && runIdentTest<Field>
+ (n,m,p,qs[i],numThreads[j],
+ shouldFail,isRight,false,report);
+ }
+ }
+ return pass;
+}
+
+template<class Field>
+bool testSuite(std::vector<int>& qs, ostream &report, bool extensive)
+{
+ bool pass=true;
+
+ std::vector<int> numThreads;
+ numThreads.push_back(1);
+ numThreads.push_back(2);
+ numThreads.push_back(3);
+ numThreads.push_back(4);
+ bool shouldFail=false,isRight=false;
+ do {
+ if (extensive){
+ pass=pass&&runSizeSuite<Field>(10000,10,1,0.01,qs,numThreads,shouldFail,isRight,report);
+ pass=pass&&runSizeSuite<Field>(10000,10,10,0.01,qs,numThreads,shouldFail,isRight,report);
+ pass=pass&&runSizeSuite<Field>(10,10000,1,0.01,qs,numThreads,shouldFail,isRight,report);
+ pass=pass&&runSizeSuite<Field>(10,10000,10,0.01,qs,numThreads,shouldFail,isRight,report);
+ pass=pass&&runSizeSuite<Field>(1,10000,1,0.1,qs,numThreads,shouldFail,isRight,report);
+
+ pass=pass&&runSizeSuite<Field>(10000,10000,1,0.0,qs,numThreads,shouldFail,isRight,report);
+ }
+
+ pass=pass&&runSizeSuite<Field>(2,2,1,1.0,qs,numThreads,shouldFail,isRight,report);
+ pass=pass&&runSizeSuite<Field>(2,2,10000,1.0,qs,numThreads,shouldFail,isRight,report);
+
+ if (extensive) {
+ pass=pass&&runSizeSuite<Field>(10000,10000,1,0.0001,qs,numThreads,shouldFail,isRight,report);
+ pass=pass&&runSizeSuite<Field>(10000,10000,10,0.0001,qs,numThreads,shouldFail,isRight,report);
+ }
+
+ shouldFail^=isRight;
+ isRight=!isRight;
+ } while (shouldFail || isRight);
+
+ return pass;
+}
+
+int main (int argc, char **argv)
+{
+ bool pass = true;
+
+ static size_t m = 400;
+ static size_t n = 200;
+ static size_t nnz = m*(n/100);
+ static integer q = 101;
+
+ // TODO: Remove this, it's no longer used
+ static Argument args[] = {
+ { 'm', "-m M", "Temporary: set m > 999 for fuller test. was: Set row dimension of test matrix to M.", TYPE_INT, &m },
+ { 'n', "-n N", "Set col dimension of test matrix to N.", TYPE_INT, &n },
+ { 'z', "-z NNZ", "Set number of nonzero entries in test matrix.", TYPE_INT, &nnz },
+ { 'q', "-q Q", "Operate over the \"field\" GF(Q) [1].", TYPE_INTEGER, &q },
+ END_OF_ARGUMENTS
+ };
+
+ parseArguments (argc, argv, args);
+
+ if (nnz > m*n) {
+ nnz=m*(n/100);
+ }
+
+ srand ((unsigned)time (NULL));
+
+ commentator().start("TriplesBBOMP black box test suite", "triplesbbomp");
+
+ ostream &report = LinBox::commentator().report (LinBox::Commentator::LEVEL_IMPORTANT, INTERNAL_DESCRIPTION);
+
+ std::vector<int> qs;
+ qs.push_back(2);
+ qs.push_back(65537);
+
+ pass = testSuite<Givaro::Modular<double> >(qs,report, m > 999);
+
+ commentator().stop("TriplesBBOMP black box test suite");
+ return pass ? 0 : -1;
+}
+
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
+
diff --git a/tests/test-triplesbb.C b/tests/test-triplesbb.C
index 9ce8d93..32c0fdb 100644
--- a/tests/test-triplesbb.C
+++ b/tests/test-triplesbb.C
@@ -34,110 +34,138 @@
#include <iostream>
#include <fstream>
-#include <vector>
-#include "linbox/field/modular.h"
-#include "linbox/blackbox/triplesbb.h"
-#include "linbox/blackbox/transpose.h"
+#include "linbox/ring/modular.h"
+#include "linbox/matrix/sparse-matrix.h"
+#include "linbox/matrix/matrix-domain.h"
+#include "test-blackbox.h"
#include "test-common.h"
-#include "test-generic.h"
+using namespace LinBox;
-/*! Check vector equality.
- *
- * @param a a vector
- * @param b another one
- * @todo factorize somewhere!
- *
- */
-template<class Vec>
-bool eqVec(const Vec& a, const Vec& b)
-{
- bool good = true;
- if (a.size() != b.size())
- return !good;
- for (typename Vec::size_type i = 0; i < a.size(); ++i) good = good && (a[i] == b[i]);
- return good;
+template<class BB>
+void randBuild(BB & A, size_t nnz){
+ for(size_t i = 0; i < nnz; ++i)
+ { typename BB::Field::Element d; A.field().init(d, rand());
+ size_t ii = rand()%A.rowdim();
+ size_t jj = rand()%A.coldim();
+ A.setEntry(ii,jj, d);
+ }
}
-using namespace LinBox;
+template<class BB>
+void bidiag(BB & A){
+ typename BB::Field::Element d; A.field().assign(d, A.field().one);
+ A.setEntry(0,0, d);
+ size_t n = A.coldim() > A.rowdim() ? A.rowdim() : A.coldim();
+ for(size_t i = 1; i < n; ++i)
+ { A.setEntry(i,i, d);
+ A.setEntry(i,i-1, d);
+ }
+}
int main (int argc, char **argv)
{
- ofstream report;
+ // ofstream report;
bool pass = true;
- static size_t n = 200;
- static integer q = 2147483647U;
- static int iterations = 10;
+ static size_t m = 4;
+ static size_t n = 20;
+ static size_t nnz = 0;
+ static integer q = 65521U;
+ q = 101;
static Argument args[] = {
- { 'n', "-n N", "Set dimension of test matrices to NxN.", TYPE_INT, &n },
+ { 'm', "-m M", "Set row dimension of test matrix to M.", TYPE_INT, &m },
+ { 'n', "-n N", "Set col dimension of test matrix to N.", TYPE_INT, &n },
+ { 'z', "-n NNZ", "Set number of nonzero entries in test matrix.", TYPE_INT, &nnz },
{ 'q', "-q Q", "Operate over the \"field\" GF(Q) [1].", TYPE_INTEGER, &q },
- { 'i', "-i I", "Perform each test for I iterations.", TYPE_INT, &iterations },
END_OF_ARGUMENTS
};
parseArguments (argc, argv, args);
+ if (nnz == 0) nnz = m*n/10;
+
srand ((unsigned)time (NULL));
- commentator().start("triplesbb black box test suite", "triplesbb");
+ commentator().start("TriplesBB black box test suite", "triplesbb");
- typedef Modular<uint32_t> Field;
+ //Field
+ typedef Givaro::Modular<double> Field;
typedef Field::Element Element;
- typedef vector <Element> Vector;
- typedef TriplesBB<Field> Blackbox;
-
Field F (q);
- Element d;
- F.init (d, -1);
-
- // set up the matrix
- std::vector<Element> values;
- std::vector<size_t> rowP;
- std::vector<size_t> colP;
- for(int i = 1; i < 12; ++i)
- {
- values.push_back(i);
- rowP.push_back(i%n + 1);
- colP.push_back(i/n + 1);
- }
-
- Blackbox A(F, values, rowP, colP, n, n);
-
+ MatrixDomain<Field> MD(F);
+ typedef MatrixDomain<Field>::OwnMatrix OwnMatrix;
+ //Vectors
+ VectorDomain<Field> VD(F);
+ BlasVector<Field> x(F,n), y(F,m), z(F,m);
+ for (size_t i = 0; i < n; ++i) F.init(x[i], i+1);
+
+ // TriplesBB<Field> A(F, m, n);
+ SparseMatrix<Field,SparseMatrixFormat::TPL> A(F, m, n);
+ randBuild(A, nnz);
pass = pass && testBlackbox(A);
-
- Transpose<Blackbox> B(&A);
-
+ // just see if it compiles
+ size_t b = 10;
+ OwnMatrix X(F,n,b), Y(F,m,b), Z(F,b,m), W(F,b,n);
+ X.random(); Z.random();
+ A.applyLeft(Y, X);
+ A.applyRight(W, Z);
+
+ // standard constructor
+ // TriplesBB<Field> B(F, m, n);
+ SparseMatrix<Field,SparseMatrixFormat::TPL> B(F, m, n);
+ bidiag(B);
pass = pass && testBlackbox(B);
-
- Vector x(n), y(n), z(n);
- for(int i = 0; i < 5; ++i) x[i] = i;
-
- A.apply(y, x);
- B.applyTranspose(z, x);
- pass = pass && eqVec(y, z);
-
B.apply(y, x);
- A.applyTranspose(z, x);
- pass = pass && eqVec(y, z);
-
- Blackbox C(F, n, n);
- for(size_t i = 0; i < rowP.size(); ++i) C.addEntry(values[i], rowP[i], colP[i]);
+ // default cstor plus init
+ // TriplesBB<Field> C(F);
+ SparseMatrix<Field,SparseMatrixFormat::TPL> C(F);
+ C.init(F, m, n);
+ bidiag(C);
pass = pass && testBlackbox(C);
+ // check B == C
+ C.apply(z, x);
+ if (not VD.areEqual(y, z)) {
+ pass = false;
+ LinBox::commentator().report() << "fail: cstor and init disagree" << std::endl;
+ }
+ // copy construction
+ // TriplesBB<Field> D(B);
+ SparseMatrix<Field,SparseMatrixFormat::TPL> D(B);
+ pass = pass && testBlackbox(D);
+ // check B == D
+ D.apply(z, x);
+ if (not VD.areEqual(y, z)) {
+ pass = false;
+ LinBox::commentator().report() << "copy cstor failure" << std::endl;
+ }
+
+ // check that it's deep copy
+ Element a;
+ B.getEntry(a,0,0);
+ F.addin(a, F.one);
+ D.setEntry(0,0,a);
+ D.apply(z, x);
+ if (VD.areEqual(y, z)) {
+ pass = false;
+ LinBox::commentator().report() << "fail changed copy cstor and original agree" << std::endl;
+ VD.write(commentator().report() << "y ", y) << std::endl;
+ VD.write(commentator().report() << "z ", z) << std::endl;
+ }
- commentator().stop("triplesbb black box test suite");
+ commentator().stop("TriplesBB black box test suite");
return pass ? 0 : -1;
}
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
// Local Variables:
// mode: C++
// tab-width: 8
// indent-tabs-mode: nil
// c-basic-offset: 8
// End:
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/tests/test-tutorial.C b/tests/test-tutorial.C
new file mode 100644
index 0000000..c9c2442
--- /dev/null
+++ b/tests/test-tutorial.C
@@ -0,0 +1,64 @@
+/* Copyright 2013 (C) the LinBox group
+ *
+ * Written by :
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ * ========LICENCE========
+ */
+
+/*! @file tests/test-tutorial.C
+ * @ingroup tests
+ *
+ * @brief no doc
+ *
+ * @test no doc.
+ */
+
+
+#include <cstdlib>
+#include <stdio.h>
+
+int main(){
+ bool pass = true;
+ int d;
+ FILE * infile = fopen("tutorial-1.in", "w");
+ fprintf(infile, "2 2\n");
+ fprintf(infile, "3 1\n");
+ fprintf(infile, "1 2\n");
+ fclose(infile);
+
+ system("./tutorial-1 <tutorial-1.in >tutorial-1.out");
+
+ FILE * outfile = fopen("tutorial-1.out", "r");
+ fscanf(outfile, "the determinant is %d", &d);
+ fclose(outfile);
+
+ system("rm tutorial-1.in tutorial-1.out");
+
+ pass = pass and d == 5;
+ return pass? 0 : -1;
+}
+
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
+
diff --git a/tests/test-unparametric-field.C b/tests/test-unparametric-field.C
deleted file mode 100644
index d72244d..0000000
--- a/tests/test-unparametric-field.C
+++ /dev/null
@@ -1,98 +0,0 @@
-
-/* tests/test-unparametric-field.C
- * Copyright (C) 2002 William J. Turner
- *
- * Written by William J. Turner <wjturner at math.ncsu.edu>
- *
- * ------------------------------------
- * 2002-04-10 Bradford Hovinen <hovinen at cis.udel.edu>
- *
- * Renamed from test-unparametric-field.cpp to test-unparametric-field.C, so
- * that we are using the same file naming conventions thoughout the library.
- * ------------------------------------
- *
- *
- * ========LICENCE========
- * This file is part of the library LinBox.
- *
- * LinBox is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- * ========LICENCE========
- *.
- */
-
-/*! @file tests/test-unparametric-field.C
- * @ingroup tests
- * @brief no doc.
- * @test no doc.
- */
-
-
-#include "linbox/linbox-config.h"
-
-#include <iostream>
-#include <fstream>
-#include <vector>
-
-#include "linbox/field/unparametric.h"
-
-#include "test-common.h"
-#include "test-generic.h"
-
-using namespace LinBox;
-
-int main (int argc, char **argv)
-{
- static size_t n = 10000;
-
- static Argument args[] = {
- { 'n', "-n N", "Set dimension of test vectors to NxN.", TYPE_INT, &n },
- END_OF_ARGUMENTS
- };
-
- parseArguments (argc, argv, args);
-
- cout.flush ();
- bool pass = true;
-
- UnparametricField<double> F;
-
- // Make sure some more detailed messages get printed
- commentator().getMessageClass (INTERNAL_DESCRIPTION).setMaxDepth (4);
- commentator().getMessageClass (INTERNAL_DESCRIPTION).setMaxDetailLevel (Commentator::LEVEL_UNIMPORTANT);
-
-ostream &report = commentator().report (Commentator::LEVEL_IMPORTANT, INTERNAL_DESCRIPTION);
- report << endl << "Unparametrix<double> field test suite" << endl;
-
- if (!runFieldTests (F, "UnparametricField<double>", 1, n, false)) pass = false;
-
- FieldArchetype K(new UnparametricField<double>(F));
-
- if (!testField<FieldArchetype> (K, "Testing archetype with envelope of UnField field"))
- pass = false;
- // We're going to allow failed tests here.
- // UnparametricField is a tool for building fields and does not of itself produce a LinBox conforming field.
- // However compilation serves some limited testing value and data is gleaned when the test is run with a report file argument.
- //return pass ? 0 : -1;
- return 0;
-}
-
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
-// Local Variables:
-// mode: C++
-// tab-width: 8
-// indent-tabs-mode: nil
-// c-basic-offset: 8
-// End:
-
diff --git a/tests/test-vector-domain.C b/tests/test-vector-domain.C
index 6bfb90a..9a05e14 100644
--- a/tests/test-vector-domain.C
+++ b/tests/test-vector-domain.C
@@ -33,12 +33,14 @@
#include "linbox/linbox-config.h"
#include <iostream>
-#include <vector>
+
#include "linbox/util/commentator.h"
-#include "linbox/field/modular.h"
-#include "linbox/field/PID-integer.h"
+#include "linbox/ring/modular.h"
+#include "linbox/field/gf2.h"
+#include "linbox/vector/blas-vector.h"
#include "linbox/vector/vector-domain.h"
+#include "linbox/vector/vector-domain-gf2.h"
#include "linbox/vector/stream.h"
#include "test-vector-domain.h"
@@ -49,21 +51,22 @@ using namespace LinBox;
template <class Field>
bool testVectorDomain (const Field &F, const char *text, size_t n, unsigned int iterations)
{
- typedef std::vector<typename Field::Element> DenseVector;
- typedef std::vector<typename Field::Element> SparseSeqVector;
- typedef std::vector<typename Field::Element> SparseMapVector;
- typedef std::vector<typename Field::Element> SparseParVector;
-
+ typedef BlasVector<Field> DenseVector;
+ typedef BlasVector<Field> SparseSeqVector;
+ typedef BlasVector<Field> SparseMapVector;
+ typedef BlasVector<Field> SparseParVector;
+
ostringstream str;
str << "Testing VectorDomain <" << text << ">" << ends;
commentator().start (str.str ().c_str ());
bool pass = true;
+ typename Field::RandIter gen(F);
- RandomDenseStream<Field, DenseVector> stream1 (F, n, iterations), stream2 (F, n, iterations);
- RandomSparseStream<Field, SparseSeqVector> stream3 (F, 0.1, n, iterations), stream4 (F, 0.1, n, iterations);
- RandomSparseStream<Field, SparseMapVector> stream5 (F, 0.1, n, iterations), stream6 (F, 0.1, n, iterations);
- RandomSparseStream<Field, SparseParVector> stream7 (F, 0.1, n, iterations), stream8 (F, 0.1, n, iterations);
+ RandomDenseStream<Field, DenseVector> stream1 (F, gen, n, iterations), stream2 (F, gen, n, iterations);
+ RandomSparseStream<Field, SparseSeqVector> stream3 (F, gen, 0.1, n, iterations), stream4 (F, gen, 0.1, n, iterations);
+ RandomSparseStream<Field, SparseMapVector> stream5 (F, gen, 0.1, n, iterations), stream6 (F, gen, 0.1, n, iterations);
+ RandomSparseStream<Field, SparseParVector> stream7 (F, gen, 0.1, n, iterations), stream8 (F, gen, 0.1, n, iterations);
if (!testDotProduct (F, "dense/dense", stream1, stream2)) pass = false;
if (!testDotProduct (F, "sparse sequence/dense", stream3, stream1)) pass = false;
@@ -117,12 +120,12 @@ int main (int argc, char **argv)
{
bool pass = true;
- static long n = 100;
+ static unsigned int n = 100;
static integer q1("18446744073709551557");
- static integer q2 = 2147483647U;
- static integer q3 = 65521U;
+ static integer q2 = 65521;
+ static integer q3 = 1009;
static int q4 = 101;
- static int iterations = 2;
+ static unsigned int iterations = 2;
static Argument args[] = {
{ 'n', "-n N", "Set dimension of test vectors to N.", TYPE_INT, &n },
@@ -136,10 +139,11 @@ int main (int argc, char **argv)
parseArguments (argc, argv, args);
- Modular<integer> F_integer (q1);
- Modular<uint32_t> F_uint32_t ((uint32_t) q2);
- Modular<uint16_t> F_uint16_t ((uint16_t) q3);
- Modular<uint8_t> F_uint8_t ((uint8_t) q4);
+ Givaro::Modular<integer> F_integer (q1);
+ Givaro::Modular<uint32_t> F_uint32_t ((uint32_t) q2);
+ Givaro::Modular<uint16_t> F_uint16_t ((uint16_t) q3);
+ Givaro::Modular<uint8_t> F_uint8_t ((uint8_t) q4);
+ GF2 gf2(2);
commentator().start("Vector domain test suite", "VectorDomain");
@@ -148,20 +152,20 @@ int main (int argc, char **argv)
commentator().getMessageClass (INTERNAL_DESCRIPTION).setMaxDetailLevel (Commentator::LEVEL_UNIMPORTANT);
commentator().getMessageClass (TIMING_MEASURE).setMaxDepth (3);
- if (!testVectorDomain (F_integer, "Modular <integer>", n, iterations)) pass = false;
- if (!testVectorDomain (F_uint32_t, "Modular <uint32_t>", n, iterations)) pass = false;
- if (!testVectorDomain (F_uint16_t, "Modular <uint16_t>", n, iterations)) pass = false;
- if (!testVectorDomain (F_uint8_t, "Modular <uint8_t>", n, iterations)) pass = false;
+ if (!testVectorDomain (F_integer, "Givaro::Modular <integer>", n, iterations)) pass = false;
+ if (!testVectorDomain (F_uint32_t, "Givaro::Modular <uint32_t>", n, iterations)) pass = false;
+ if (!testVectorDomain (F_uint16_t, "Givaro::Modular <uint16_t>", n, iterations)) pass = false;
+ if (!testVectorDomain (F_uint8_t, "Givaro::Modular <uint8_t>", n, iterations)) pass = false;
+// if (!testVectorDomain (gf2, "GF2", n, iterations)) pass = false;
commentator().stop("Vector domain test suite");
return pass ? 0 : -1;
}
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
// Local Variables:
// mode: C++
// tab-width: 8
// indent-tabs-mode: nil
// c-basic-offset: 8
// End:
-
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/tests/test-vector-domain.h b/tests/test-vector-domain.h
index d4f7e3a..62795ff 100644
--- a/tests/test-vector-domain.h
+++ b/tests/test-vector-domain.h
@@ -1,19 +1,19 @@
/* linbox/tests/test-vector-domain.h
* Copyright (C) 2001, 2002 Bradford Hovinen
- *
+ *
* ========LICENCE========
* This file is part of the library LinBox.
- *
+ *
* LinBox is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
- *
+ *
* This library 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
* Lesser General Public License for more details.
- *
+ *
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
@@ -64,24 +64,24 @@ static bool testDotProduct (Field &F, const char *text, LinBox::VectorStream<Vec
bool ret = true;
- Vector1 v1;
- Vector2 v2;
+ Vector1 v1(F,stream1.n());
+ Vector2 v2(F,stream2.n());
typename Field::Element sigma, rho;
LinBox::VectorDomain<Field> VD (F);
size_t j;
- LinBox::VectorWrapper::ensureDim (v1, stream1.n ());
- LinBox::VectorWrapper::ensureDim (v2, stream2.n ());
+ // LinBox::VectorWrapper::ensureDim (v1, stream1.n ());
+ // LinBox::VectorWrapper::ensureDim (v2, stream2.n ());
- Givaro::Timer timer;
+ Givaro::Timer timer;
double totaltime = 0.0;
while (stream1 && stream2) {
LinBox::commentator().startIteration ((unsigned)stream1.j ());
- F.init (sigma, 0);
+ F.assign (sigma, F.zero);
stream1.next (v1);
stream2.next (v2);
@@ -152,25 +152,24 @@ static bool testAddMul (Field &F, const char *text, LinBox::VectorStream<Vector>
LinBox::commentator().start (str.str ().c_str (), "testAddMul", stream1.m ());
bool ret = true;
- bool iter_passed;
- Vector v1, v2, v3, v4;
+ Vector v1(F,stream1.n()), v2(F,stream2.n()), v3(F,stream1.n()), v4(F,stream1.n());
typename Field::Element a;
typename Field::Element ainv;
typename Field::Element aneg;
typename Field::RandIter r (F);
- LinBox::VectorWrapper::ensureDim (v1, stream1.n ());
- LinBox::VectorWrapper::ensureDim (v2, stream2.n ());
- LinBox::VectorWrapper::ensureDim (v3, stream1.n ());
- LinBox::VectorWrapper::ensureDim (v4, stream1.n ());
+ // LinBox::VectorWrapper::ensureDim (v1, stream1.n ());
+ // LinBox::VectorWrapper::ensureDim (v2, stream2.n ());
+ // LinBox::VectorWrapper::ensureDim (v3, stream1.n ());
+ // LinBox::VectorWrapper::ensureDim (v4, stream1.n ());
LinBox::VectorDomain<Field> VD (F);
while (stream1 && stream2) {
LinBox::commentator().startIteration ((unsigned)stream1.j ());
- iter_passed = true;
+ bool iter_passed = true;
stream1.next (v1);
stream2.next (v2);
@@ -255,25 +254,24 @@ static bool testSubMul (Field &F, const char *text, LinBox::VectorStream<Vector>
LinBox::commentator().start (str.str ().c_str (), "testSubMul", stream1.m ());
bool ret = true;
- bool iter_passed;
- Vector v1, v2, v3, v4;
+ Vector v1(F,stream1.n()), v2(F,stream2.n()), v3(F,stream1.n()), v4(F,stream1.n());
typename Field::Element a;
typename Field::Element ainv;
typename Field::Element aneg;
typename Field::RandIter r (F);
- LinBox::VectorWrapper::ensureDim (v1, stream1.n ());
- LinBox::VectorWrapper::ensureDim (v2, stream2.n ());
- LinBox::VectorWrapper::ensureDim (v3, stream1.n ());
- LinBox::VectorWrapper::ensureDim (v4, stream1.n ());
+ // LinBox::VectorWrapper::ensureDim (v1, stream1.n ());
+ // LinBox::VectorWrapper::ensureDim (v2, stream2.n ());
+ // LinBox::VectorWrapper::ensureDim (v3, stream1.n ());
+ // LinBox::VectorWrapper::ensureDim (v4, stream1.n ());
LinBox::VectorDomain<Field> VD (F);
while (stream1 && stream2) {
LinBox::commentator().startIteration ((unsigned)stream1.j ());
- iter_passed = true;
+ bool iter_passed = true;
stream1.next (v1);
stream2.next (v2);
@@ -356,25 +354,24 @@ static bool testAXPY (Field &F, const char *text, LinBox::VectorStream<Vector> &
LinBox::commentator().start (str.str ().c_str (), "testAXPY", stream1.m ());
bool ret = true;
- bool iter_passed;
- Vector v1, v2, v3, v4;
+ Vector v1(F,stream1.n()), v2(F,stream2.n()), v3(F,stream1.n()), v4(F,stream1.n());
typename Field::Element a;
typename Field::Element ainv;
typename Field::Element aneg;
typename Field::RandIter r (F);
- LinBox::VectorWrapper::ensureDim (v1, stream1.n ());
- LinBox::VectorWrapper::ensureDim (v2, stream2.n ());
- LinBox::VectorWrapper::ensureDim (v3, stream1.n ());
- LinBox::VectorWrapper::ensureDim (v4, stream1.n ());
+ // LinBox::VectorWrapper::ensureDim (v1, stream1.n ());
+ // LinBox::VectorWrapper::ensureDim (v2, stream2.n ());
+ // LinBox::VectorWrapper::ensureDim (v3, stream1.n ());
+ // LinBox::VectorWrapper::ensureDim (v4, stream1.n ());
LinBox::VectorDomain<Field> VD (F);
while (stream1 && stream2) {
LinBox::commentator().startIteration ((unsigned)stream1.j ());
- iter_passed = true;
+ bool iter_passed = true;
stream1.next (v1);
stream2.next (v2);
@@ -439,20 +436,19 @@ static bool testCopyEqual (Field &F, const char *text, LinBox::VectorStream<Vect
LinBox::commentator().start (str.str ().c_str (), "testCopyEqual", stream.m ());
bool ret = true;
- bool iter_passed;
- Vector1 v;
- Vector2 w;
+ Vector1 v(F,stream.n());
+ Vector2 w(F,stream.n());
- LinBox::VectorWrapper::ensureDim (v, stream.n ());
- LinBox::VectorWrapper::ensureDim (w, stream.n ());
+ // LinBox::VectorWrapper::ensureDim (v, stream.n ());
+ // LinBox::VectorWrapper::ensureDim (w, stream.n ());
LinBox::VectorDomain<Field> VD (F);
while (stream) {
LinBox::commentator().startIteration ((unsigned)stream.j ());
- iter_passed = true;
+ bool iter_passed = true;
stream.next (v);
VD.copy (w, v);
@@ -485,11 +481,10 @@ static bool testCopyEqual (Field &F, const char *text, LinBox::VectorStream<Vect
#endif // __LINBOX_test_vector_domain_H
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
// Local Variables:
// mode: C++
// tab-width: 8
// indent-tabs-mode: nil
// c-basic-offset: 8
// End:
-
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/tests/test-zero-one.C b/tests/test-zero-one.C
index 77d6f9f..bc1e51c 100644
--- a/tests/test-zero-one.C
+++ b/tests/test-zero-one.C
@@ -28,13 +28,13 @@
*/
+#include <linbox/linbox-config.h>
#include <iostream>
-#include <vector>
#include <utility>
#include "linbox/blackbox/zero-one.h"
-#include "linbox/field/modular.h"
+#include "linbox/ring/modular.h"
#include "test-common.h"
#include "test-generic.h"
@@ -57,9 +57,9 @@ int main(int argc, char **argv)
parseArguments(argc, argv, args);
- typedef LinBox::ZeroOne<LinBox::Modular<uint32_t> > Matrix;
+ typedef LinBox::ZeroOne<Givaro::Modular<uint32_t> > Matrix;
- LinBox::Modular<uint32_t> afield(prime);
+ Givaro::Modular<uint32_t> afield(prime);
rows = new size_t[3 * n];
cols = new size_t[3 * n];
@@ -70,21 +70,22 @@ int main(int argc, char **argv)
for(i = 0; i < n; i++) { rows[2*n+i] = i; cols[2*n+i] = i; } // diag
Matrix testMatrix(afield, rows, cols, n, n, 3*n - 2);
- /*
+#if 0
for(i = 0; i < n; i++) { rows[i] = i; cols[i] = i; } // diag
Matrix testMatrix(afield, rows, cols, n, n, n);
- */
- /*
+#endif
+
+#if 0
Matrix testMatrix(afield);
ifstream mat_in("data/n4c6.b9.186558x198895.sms");
testMatrix.read(mat_in);
std::cout << testMatrix.rowdim() << " " << testMatrix.coldim() << " " << testMatrix.nnz() << std::endl;
- */
+#endif
commentator().start("ZeroOne matrix blackbox test suite", "ZeroOne");
- pass = pass && testBlackbox(testMatrix);
+ pass = pass && testBlackboxNoRW(testMatrix);
delete [] rows;
delete [] cols;
@@ -93,11 +94,10 @@ int main(int argc, char **argv)
return pass ? 0 : -1;
}
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
// Local Variables:
// mode: C++
// tab-width: 8
// indent-tabs-mode: nil
// c-basic-offset: 8
// End:
-
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/tests/test-zo.C b/tests/test-zo.C
deleted file mode 100644
index 858e93a..0000000
--- a/tests/test-zo.C
+++ /dev/null
@@ -1,137 +0,0 @@
-/* Copyright (C) LinBox
- *
- *
- *
- * ========LICENCE========
- * This file is part of the library LinBox.
- *
- * LinBox is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- * ========LICENCE========
- */
-
-/*! @file tests/test-zo.C
- * @ingroup tests
- *
- * @brief no doc
- *
- * @test no doc.
- */
-
-
-
-#include <fstream>
-#include <iostream>
-#include <vector>
-#include <set>
-#include <utility>
-
-#include "linbox/blackbox/zo.h"
-#include "linbox/blackbox/transpose.h"
-#include "linbox/field/modular.h"
-#include "linbox/util/commentator.h"
-
-
-#include "test-common.h"
-#include "test-blackbox.h"
-
-int main(int argc, char **argv)
-{
- bool pass = true;
- uint32_t prime = 31337;
- static size_t n = 100000;
-
- static Argument args[] =
- {
- { 'n', "-n N", "Set dimension of test matrix to NxN.", TYPE_INT, &n },
- { 'q', "-q Q", "Operate over the \"field\" GF(Q) [1].", TYPE_INT, &prime },
- END_OF_ARGUMENTS
- };
-
- LinBox::parseArguments(argc, argv, args);
-
- typedef LinBox::Modular<uint32_t> Field;
- //typedef LinBox::Modular<uint32_t> Field;
- typedef LinBox::ZeroOne<Field> Matrix;
-
- Field afield(prime);
-
- /*
- // "arrow" matrix
- size_t *rows, *cols, i;
- rows = new size_t[3 * n + 1 - 2];
- cols = new size_t[3 * n + 1 - 2];
-
- for(i = 0; i < n; i++) { rows[i] = 0; cols[i] = i; } // first row
- for(i = 0; i < n - 1; i++)
- { rows[n+2*i] = i + 1; cols[n+2*i] = 0; rows[n+2*i+1] = i + 1; cols[n+2*i+1] = i + 1; } // first col and the diag
- Matrix testMatrix(afield, rows, cols, n, n, 3 * n - 2);
- */
-
-// random 3 per row matrix
- size_t *rows, *cols, i;
- const size_t npr = n / 10000;
- rows = new size_t[npr * n];
- cols = new size_t[npr * n];
-
- for(i = 0; i < n; i++)
- {
- set<size_t> a;
- while( a.size() < npr )
- a.insert(rand()%n);
- size_t j = 0;
- for(set<size_t>::iterator iter = a.begin(); j < npr; ++j, ++iter)
- {
- rows[npr*i+j] = i;
- cols[npr*i+j] = *iter;
- //std::cout << rows[npr*i+j] << ", ";
- }
- //std::cout << std::endl;
- }
- Matrix testMatrix(afield, rows, cols, n, n, npr * n );
-
- /*
- Matrix testMatrix(afield);
- //ifstream mat_in("data/m133.b3.200200x200200.sms");
- ifstream mat_in("data/n4c6.b9.186558x198895.sms");
- //ifstream mat_in("data/small21x21.sms");
- //testMatrix.read(mat_in);
- testMatrix.read(cin);
- //LinBox::Transpose<Matrix> testMat(testMatrix);
- */
-
- //print out the dimensions and the number of non-zero entries of the matrix
- //std::cout << testMatrix.rowdim() << " " << testMatrix.coldim() << " " << testMatrix.nnz() << std::endl;
-
-
- //std::cout << std::endl << "ZeroOne matrix blackbox test suite" << std::endl;
-
- pass = pass && testBlackbox(testMatrix);
- //bool pass2 = testBlackbox(testMat);
-
- //delete [] rows;
- //delete [] cols;
-
- //return pass&&pass2 ? 0 : -1;
- return pass ? 0 : -1;
-}
-
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
-// Local Variables:
-// mode: C++
-// tab-width: 8
-// indent-tabs-mode: nil
-// c-basic-offset: 8
-// End:
-
diff --git a/tests/test_leak.sh b/tests/test_leak.sh
new file mode 100644
index 0000000..89782a4
--- /dev/null
+++ b/tests/test_leak.sh
@@ -0,0 +1,61 @@
+#!/bin/bash -
+
+# Copyright (c) 2010 the LinBox group
+# written by Brice Boyer (briceboyer) <boyer.brice at gmail.com>
+# This file is part of LinBox
+# ========LICENCE========
+# This file is part of the library LinBox.
+#
+# LinBox is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+#
+# This library 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
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+# ========LICENCE========
+#/
+
+
+
+
+# fast check (pwd = linbox/tests ; make check )
+# for i in `find ./ -executable -type f | grep -v benchmark` ; do valgrind $i ; done 2>&1 | less
+
+# doc :
+# recompiles a test-* and valgrinds it.
+
+if [ $# -ne 1 ]
+then
+ echo "Usage: `basename $0` prog"
+ exit -1
+fi
+
+if [ ! -f "${1}.C" ]
+then
+ echo "not a test"
+ exit -2
+fi
+
+if [ -f "${1}.o" ]
+then
+ /bin/rm $1.o
+else
+ echo "pas de $1.o"
+fi
+
+make $1 CXXFLAGS+="-O0 -g -DDEBUG"
+
+valgrind --leak-check=full --show-reachable=yes ./$1
+
+exit 0
+
+set -o nounset # Treat unset variables as an error
+
+
diff --git a/tests/tests.doxy b/tests/tests.doxy
index 1198179..7de3324 100644
--- a/tests/tests.doxy
+++ b/tests/tests.doxy
@@ -27,9 +27,9 @@
* \brief Correctness tests for LinBox components.
*
* These tests are to aid development and serve for unit and regression testing.
- * Some contain useful timing measurements.
+ * Some contain useful timing measurements.
*
- * Do <code>make tests</code> to try the lot.
+ * Do <code>make fullcheck</code> to try the lot.
* See checker.C for more information on LinBox tests.
*
* There are some benchmarks. For instance benchmark-fields is intended to help
--
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/debian-science/packages/linbox.git
More information about the debian-science-commits
mailing list